ZGlmZiAtLWdpdCBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5U2Vzc2lvbkxpYnJhcnkuY3BwIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlTZXNzaW9uTGlicmFyeS5jcHAKaW5kZXggZmFlYTAwOC4uNGI0MDUxZCAxMDA2NDQKLS0tIGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlTZXNzaW9uTGlicmFyeS5jcHAKKysrIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlTZXNzaW9uTGlicmFyeS5jcHAKQEAgLTk1LDcgKzk1LDcgQEAKIHZvaWQgQ2xlYXJLZXlTZXNzaW9uTGlicmFyeTo6ZGVzdHJveVBsdWdpbihDYXNQbHVnaW4gKnBsdWdpbikgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TZXNzaW9uc0xvY2spOwogCi0gICAgZm9yIChzc2l6ZV90IGluZGV4ID0gbUlEVG9TZXNzaW9uTWFwLnNpemUoKSAtIDE7IGluZGV4ID49IDA7IGluZGV4LS0pIHsKKyAgICBmb3IgKHNzaXplX3QgaW5kZXggPSAoc3NpemVfdCltSURUb1Nlc3Npb25NYXAuc2l6ZSgpIC0gMTsgaW5kZXggPj0gMDsgaW5kZXgtLSkgewogICAgICAgICBzcDxDbGVhcktleUNhc1Nlc3Npb24+IHNlc3Npb24gPSBtSURUb1Nlc3Npb25NYXAudmFsdWVBdChpbmRleCk7CiAgICAgICAgIGlmIChzZXNzaW9uLT5nZXRQbHVnaW4oKSA9PSBwbHVnaW4pIHsKICAgICAgICAgICAgIG1JRFRvU2Vzc2lvbk1hcC5yZW1vdmVJdGVtc0F0KGluZGV4KTsKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0pzb25Bc3NldExvYWRlci5jcHAgYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9Kc29uQXNzZXRMb2FkZXIuY3BwCmluZGV4IDZlMTAwNGMuLmVlOGRiYTMgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0pzb25Bc3NldExvYWRlci5jcHAKKysrIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvSnNvbkFzc2V0TG9hZGVyLmNwcApAQCAtMzYsOCArMzYsNiBAQAogY29uc3QgU3RyaW5nOCBrQ2FzVHlwZVRhZygiY2FzX3R5cGUiKTsKIGNvbnN0IFN0cmluZzgga0Jhc2U2NFBhZGRpbmcoIj0iKTsKIAotY29uc3QgdWludDMyX3Qga0tleUxlbmd0aCA9IDE2OwotCiBKc29uQXNzZXRMb2FkZXI6Okpzb25Bc3NldExvYWRlcigpIHsKIH0KIApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvZWNtX2dlbmVyYXRvci5jcHAgYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9lY21fZ2VuZXJhdG9yLmNwcAppbmRleCA3ZDI5NjU5Li4yMThjZTM1IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9lY21fZ2VuZXJhdG9yLmNwcAorKysgYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9lY21fZ2VuZXJhdG9yLmNwcApAQCAtMzgsOCArMzgsNiBAQAogY29uc3QgdWludDE2X3Qga1RvdGFsRWNtU2l6ZSA9CiAgICAgICAgIGtFY21DbGVhckZpZWxkc1NpemUgKyBrQ29udGVudEtleUJ5dGVTaXplOyAvLyBjbGVhciBmaWVsZHMgKyBjbGVhciBrZXkKIAotY29uc3QgdWludDMyX3Qga0tleUxlbmd0aCA9IDE2OwotCiAjZGVmaW5lIFVOQUxJR05FRF9MT0FEMzIoX3ApICgqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MzJfdCAqPihfcCkpCiAKIHN0YXRpYyB1aW50MzJfdCBMb2FkMzIoY29uc3Qgdm9pZCAqcCkgewpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvQ2xlYXJLZXlGZXRjaGVyVGVzdC5jcHAgYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9DbGVhcktleUZldGNoZXJUZXN0LmNwcAppbmRleCBhY2UwODZhLi5kMTJjZmViIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9DbGVhcktleUZldGNoZXJUZXN0LmNwcAorKysgYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9DbGVhcktleUZldGNoZXJUZXN0LmNwcApAQCAtOTMsNyArOTMsNyBAQAogICAgIHVpbnQ2NF90IGFzc2V0X2lkOwogICAgIHN0ZDo6dmVjdG9yPEtleUZldGNoZXI6OktleUluZm8+IGtleXM7CiAgICAgRVhQRUNUX0VRKE9LLCBmZXRjaGVyLk9idGFpbktleShlY21fLCAmYXNzZXRfaWQsICZrZXlzKSk7Ci0gICAgRVhQRUNUX0VRKDIsIGtleXMuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRVEoMlUsIGtleXMuc2l6ZSgpKTsKICAgICBFWFBFQ1RfRVEoMCwga2V5c1swXS5rZXlfaWQpOwogICAgIEVYUEVDVF9FUShjb250ZW50X2tleV9bMF0tPnNpemUoKSwga2V5c1swXS5rZXlfYnl0ZXMtPnNpemUoKSk7CiAgICAgRVhQRUNUX0VRKDAsIG1lbWNtcChjb250ZW50X2tleV9bMF0tPmRhdGEoKSwKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL21vY2svTW9ja0Nhc1BsdWdpbi5jcHAgYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9tb2NrL01vY2tDYXNQbHVnaW4uY3BwCmluZGV4IDUwMDIwOGIuLjA2NTE2YjUgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL21vY2svTW9ja0Nhc1BsdWdpbi5jcHAKKysrIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvbW9jay9Nb2NrQ2FzUGx1Z2luLmNwcApAQCAtNDksOCArNDksOCBAQAogCiBzdGF0dXNfdCBNb2NrQ2FzRmFjdG9yeTo6Y3JlYXRlUGx1Z2luKAogICAgICAgICBpbnQzMl90IENBX3N5c3RlbV9pZCwKLSAgICAgICAgdWludDY0X3QgYXBwRGF0YSwKLSAgICAgICAgQ2FzUGx1Z2luQ2FsbGJhY2sgY2FsbGJhY2ssCisgICAgICAgIHVpbnQ2NF90IC8qYXBwRGF0YSovLAorICAgICAgICBDYXNQbHVnaW5DYWxsYmFjayAvKmNhbGxiYWNrKi8sCiAgICAgICAgIENhc1BsdWdpbiAqKnBsdWdpbikgewogICAgIGlmICghaXNTeXN0ZW1JZFN1cHBvcnRlZChDQV9zeXN0ZW1faWQpKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CkBAIC05OCw3ICs5OCw3IEBACiAgICAgTW9ja1Nlc3Npb25MaWJyYXJ5OjpnZXQoKS0+ZGVzdHJveVBsdWdpbih0aGlzKTsKIH0KIAotc3RhdHVzX3QgTW9ja0Nhc1BsdWdpbjo6c2V0UHJpdmF0ZURhdGEoY29uc3QgQ2FzRGF0YSAmZGF0YSkgeworc3RhdHVzX3QgTW9ja0Nhc1BsdWdpbjo6c2V0UHJpdmF0ZURhdGEoY29uc3QgQ2FzRGF0YSYgLypkYXRhKi8pIHsKICAgICBBTE9HVigic2V0UHJpdmF0ZURhdGEiKTsKICAgICByZXR1cm4gT0s7CiB9CkBAIC0xMjMsNyArMTIzLDcgQEAKIH0KIAogc3RhdHVzX3QgTW9ja0Nhc1BsdWdpbjo6c2V0U2Vzc2lvblByaXZhdGVEYXRhKAotICAgICAgICBjb25zdCBDYXNTZXNzaW9uSWQgJnNlc3Npb25JZCwgY29uc3QgQ2FzRGF0YSAmZGF0YSkgeworICAgICAgICBjb25zdCBDYXNTZXNzaW9uSWQgJnNlc3Npb25JZCwgY29uc3QgQ2FzRGF0YSYgLypkYXRhKi8pIHsKICAgICBBTE9HVigic2V0U2Vzc2lvblByaXZhdGVEYXRhOiBzZXNzaW9uSWQ9JXMiLAogICAgICAgICAgICAgYXJyYXlUb1N0cmluZyhzZXNzaW9uSWQpLnN0cmluZygpKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CkBAIC0xNjMsNyArMTYzLDcgQEAKIH0KIAogc3RhdHVzX3QgTW9ja0Nhc1BsdWdpbjo6c2VuZEV2ZW50KAotICAgICAgICBpbnQzMl90IGV2ZW50LCBpbnQgYXJnLCBjb25zdCBDYXNEYXRhICZldmVudERhdGEpIHsKKyAgICAgICAgaW50MzJfdCBldmVudCwgaW50IC8qYXJnKi8sIGNvbnN0IENhc0RhdGEmIC8qZXZlbnREYXRhKi8pIHsKICAgICBBTE9HVigic2VuZEV2ZW50OiBldmVudD0lZCIsIGV2ZW50KTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAKQEAgLTE3OCw3ICsxNzgsNyBAQAogfQogCiBzdGF0dXNfdCBNb2NrQ2FzUGx1Z2luOjpyZWZyZXNoRW50aXRsZW1lbnRzKAotICAgICAgICBpbnQzMl90IHJlZnJlc2hUeXBlLCBjb25zdCBDYXNEYXRhICZyZWZyZXNoRGF0YSkgeworICAgICAgICBpbnQzMl90IC8qcmVmcmVzaFR5cGUqLywgY29uc3QgQ2FzRGF0YSAmcmVmcmVzaERhdGEpIHsKICAgICBBTE9HVigicmVmcmVzaEVudGl0bGVtZW50czogcmVmcmVzaERhdGE9JXMiLCBhcnJheVRvU3RyaW5nKHJlZnJlc2hEYXRhKS5zdHJpbmcoKSk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogCkBAIC0yMTYsNyArMjE2LDcgQEAKICAgICAgICAgaW50MzJfdCBzcmNPZmZzZXQsCiAgICAgICAgIHZvaWQgKmRzdFB0ciwKICAgICAgICAgaW50MzJfdCBkc3RPZmZzZXQsCi0gICAgICAgIEFTdHJpbmcgKmVycm9yRGV0YWlsTXNnKSB7CisgICAgICAgIEFTdHJpbmcqIC8qZXJyb3JEZXRhaWxNc2cqLykgewogICAgIEFMT0dWKCJNb2NrRGVzY3JhbWJsZXJQbHVnaW46OmRlc2NyYW1ibGUoc2VjdXJlPSVkLCBzY3RybD0lZCwiCiAgICAgICAgICAgInN1YlNhbXBsZXM9JXMsIHNyY1B0cj0lcCwgZHN0UHRyPSVwLCBzcmNPZmZzZXQ9JWQsIGRzdE9mZnNldD0lZCkiLAogICAgICAgICAgIChpbnQpc2VjdXJlLCAoaW50KXNjcmFtYmxpbmdDb250cm9sLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb0NsaWVudC5oIGIvaW5jbHVkZS9tZWRpYS9BdWRpb0NsaWVudC5oCmluZGV4IGZlYWM5YjkuLmEwNTMwZTQgMTIwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvQXVkaW9DbGllbnQuaAorKysgYi9pbmNsdWRlL21lZGlhL0F1ZGlvQ2xpZW50LmgKQEAgLTEgKzEgQEAKLW1lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9DbGllbnQuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKy4uLy4uL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9DbGllbnQuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2F1ZGlvc2VydmVyL0FuZHJvaWQubWsgYi9tZWRpYS9hdWRpb3NlcnZlci9BbmRyb2lkLm1rCmluZGV4IGVlODc3NTEuLjcwYzI4MWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2F1ZGlvc2VydmVyL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvYXVkaW9zZXJ2ZXIvQW5kcm9pZC5tawpAQCAtMTUsNiArMTUsNyBAQAogCWxpYmxvZyBcCiAJbGliaGlkbHRyYW5zcG9ydCBcCiAJbGliaHdiaW5kZXIgXAorCWxpYm1lZGlhIFwKIAlsaWJtZWRpYWxvZ3NlcnZpY2UgXAogCWxpYm5iYWlvIFwKIAlsaWJzb3VuZHRyaWdnZXJzZXJ2aWNlIFwKQEAgLTM1LDYgKzM2LDcgQEAKIAlmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9pbmNsdWRlIFwKIAlmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9zcmMgXAogCWZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nIFwKKwlmcmFtZXdvcmtzL2F2L21lZGlhL2xpYm1lZGlhIFwKIAkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKIAlleHRlcm5hbC9zb25pYyBcCiAKZGlmZiAtLWdpdCBhL21lZGlhL2F1ZGlvc2VydmVyL21haW5fYXVkaW9zZXJ2ZXIuY3BwIGIvbWVkaWEvYXVkaW9zZXJ2ZXIvbWFpbl9hdWRpb3NlcnZlci5jcHAKaW5kZXggNWE5ZDFiYi4uZGI1NzI0OCAxMDA2NDQKLS0tIGEvbWVkaWEvYXVkaW9zZXJ2ZXIvbWFpbl9hdWRpb3NlcnZlci5jcHAKKysrIGIvbWVkaWEvYXVkaW9zZXJ2ZXIvbWFpbl9hdWRpb3NlcnZlci5jcHAKQEAgLTM1LDEyICszNSwxOSBAQAogI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2UuaCIKICNpbmNsdWRlICJ1dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5oIgogI2luY2x1ZGUgIk1lZGlhTG9nU2VydmljZS5oIgorI2luY2x1ZGUgIk1lZGlhVXRpbHMuaCIKICNpbmNsdWRlICJTb3VuZFRyaWdnZXJId1NlcnZpY2UuaCIKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKIGludCBtYWluKGludCBhcmdjIF9fdW51c2VkLCBjaGFyICoqYXJndikKIHsKKyAgICAvLyBUT0RPOiB1cGRhdGUgd2l0aCByZWZpbmVkIHBhcmFtZXRlcnMKKyAgICBsaW1pdFByb2Nlc3NNZW1vcnkoCisgICAgICAgICJhdWRpby5tYXhtZW0iLCAvKiAicm8uYXVkaW8ubWF4bWVtIiwgcHJvcGVydHkgdGhhdCBkZWZpbmVzIGxpbWl0ICovCisgICAgICAgIChzaXplX3QpNTEyICogKDEgPDwgMjApLCAvKiBTSVpFX01BWCwgdXBwZXIgbGltaXQgaW4gYnl0ZXMgKi8KKyAgICAgICAgMjAgLyogdXBwZXIgbGltaXQgYXMgcGVyY2VudGFnZSBvZiBwaHlzaWNhbCBSQU0gKi8pOworCiAgICAgc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOwogCiAgICAgYm9vbCBkb0xvZyA9IChib29sKSBwcm9wZXJ0eV9nZXRfYm9vbCgicm8udGVzdF9oYXJuZXNzIiwgMCk7CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2FhYy9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy9hYWMvQW5kcm9pZC5icAppbmRleCA2NWY5Yjk2Li43OTM3YTI5IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL2FhYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvYWFjL0FuZHJvaWQuYnAKQEAgLTIzLDYgKzIzLDcgQEAKICAgICAgICAgIi1XYWxsIiwKICAgICAgICAgIi1mdmlzaWJpbGl0eT1oaWRkZW4iLAogICAgIF0sCisgICAgdmVyc2lvbl9zY3JpcHQ6ICJleHBvcnRzLmxkcyIsCiAKICAgICBzYW5pdGl6ZTogewogICAgICAgICBjZmk6IHRydWUsCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2FhYy9leHBvcnRzLmxkcyBiL21lZGlhL2V4dHJhY3RvcnMvYWFjL2V4cG9ydHMubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMzA5ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2FhYy9leHBvcnRzLmxkcwpAQCAtMCwwICsxIEBACit7IGdsb2JhbDogR0VURVhUUkFDVE9SREVGOyBsb2NhbDogKjsgfTsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvYW1yL0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL2Ftci9BbmRyb2lkLmJwCmluZGV4IDAxYmJmYTIuLmU1YmJlMzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvYW1yL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9hbXIvQW5kcm9pZC5icApAQCAtMjMsNiArMjMsNyBAQAogICAgICAgICAiLVdhbGwiLAogICAgICAgICAiLWZ2aXNpYmlsaXR5PWhpZGRlbiIsCiAgICAgXSwKKyAgICB2ZXJzaW9uX3NjcmlwdDogImV4cG9ydHMubGRzIiwKIAogICAgIHNhbml0aXplOiB7CiAgICAgICAgIGNmaTogdHJ1ZSwKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvYW1yL2V4cG9ydHMubGRzIGIvbWVkaWEvZXh0cmFjdG9ycy9hbXIvZXhwb3J0cy5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjEzMDllZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvYW1yL2V4cG9ydHMubGRzCkBAIC0wLDAgKzEgQEAKK3sgZ2xvYmFsOiBHRVRFWFRSQUNUT1JERUY7IGxvY2FsOiAqOyB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9mbGFjL0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvQW5kcm9pZC5icAppbmRleCA4MGE0MTI1Li44NGJhNmQzIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvQW5kcm9pZC5icApAQCAtMjgsNiArMjgsNyBAQAogICAgICAgICAiLVdhbGwiLAogICAgICAgICAiLWZ2aXNpYmlsaXR5PWhpZGRlbiIsCiAgICAgXSwKKyAgICB2ZXJzaW9uX3NjcmlwdDogImV4cG9ydHMubGRzIiwKIAogICAgIHNhbml0aXplOiB7CiAgICAgICAgIGNmaTogdHJ1ZSwKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvZmxhYy9leHBvcnRzLmxkcyBiL21lZGlhL2V4dHJhY3RvcnMvZmxhYy9leHBvcnRzLmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTMwOWVlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9mbGFjL2V4cG9ydHMubGRzCkBAIC0wLDAgKzEgQEAKK3sgZ2xvYmFsOiBHRVRFWFRSQUNUT1JERUY7IGxvY2FsOiAqOyB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9taWRpL0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL21pZGkvQW5kcm9pZC5icAppbmRleCA2OGY4NzY2Li45YWYxMjhlIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21pZGkvQW5kcm9pZC5icAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21pZGkvQW5kcm9pZC5icApAQCAtMjcsNiArMjcsNyBAQAogICAgICAgICAiLVdhbGwiLAogICAgICAgICAiLWZ2aXNpYmlsaXR5PWhpZGRlbiIsCiAgICAgXSwKKyAgICB2ZXJzaW9uX3NjcmlwdDogImV4cG9ydHMubGRzIiwKIAogICAgIHNhbml0aXplOiB7CiAgICAgICAgIGNmaTogdHJ1ZSwKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbWlkaS9leHBvcnRzLmxkcyBiL21lZGlhL2V4dHJhY3RvcnMvbWlkaS9leHBvcnRzLmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTMwOWVlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9taWRpL2V4cG9ydHMubGRzCkBAIC0wLDAgKzEgQEAKK3sgZ2xvYmFsOiBHRVRFWFRSQUNUT1JERUY7IGxvY2FsOiAqOyB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9ta3YvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvbWt2L0FuZHJvaWQuYnAKaW5kZXggMzUwYzZmZS4uMDMwMWZmYSAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9ta3YvQW5kcm9pZC5icAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21rdi9BbmRyb2lkLmJwCkBAIC0zMSw2ICszMSw3IEBACiAgICAgICAgICItV2FsbCIsCiAgICAgICAgICItZnZpc2liaWxpdHk9aGlkZGVuIiwKICAgICBdLAorICAgIHZlcnNpb25fc2NyaXB0OiAiZXhwb3J0cy5sZHMiLAogCiAgICAgc2FuaXRpemU6IHsKICAgICAgICAgY2ZpOiB0cnVlLApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9ta3YvZXhwb3J0cy5sZHMgYi9tZWRpYS9leHRyYWN0b3JzL21rdi9leHBvcnRzLmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTMwOWVlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9ta3YvZXhwb3J0cy5sZHMKQEAgLTAsMCArMSBAQAoreyBnbG9iYWw6IEdFVEVYVFJBQ1RPUkRFRjsgbG9jYWw6ICo7IH07CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wMy9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDMvQW5kcm9pZC5icAppbmRleCA2OTEyZWYxLi5kOTM1NjJjIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wMy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXAzL0FuZHJvaWQuYnAKQEAgLTMxLDYgKzMxLDcgQEAKICAgICAgICAgIi1XYWxsIiwKICAgICAgICAgIi1mdmlzaWJpbGl0eT1oaWRkZW4iLAogICAgIF0sCisgICAgdmVyc2lvbl9zY3JpcHQ6ICJleHBvcnRzLmxkcyIsCiAKICAgICBzYW5pdGl6ZTogewogICAgICAgICBjZmk6IHRydWUsCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wMy9leHBvcnRzLmxkcyBiL21lZGlhL2V4dHJhY3RvcnMvbXAzL2V4cG9ydHMubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMzA5ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9leHBvcnRzLmxkcwpAQCAtMCwwICsxIEBACit7IGdsb2JhbDogR0VURVhUUkFDVE9SREVGOyBsb2NhbDogKjsgfTsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9BbmRyb2lkLmJwCmluZGV4IDQ5YTM3MTQuLmZjZThkZDYgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvQW5kcm9pZC5icApAQCAtMzMsNiArMzMsNyBAQAogICAgICAgICAiLVdhbGwiLAogICAgICAgICAiLWZ2aXNpYmlsaXR5PWhpZGRlbiIsCiAgICAgXSwKKyAgICB2ZXJzaW9uX3NjcmlwdDogImV4cG9ydHMubGRzIiwKIAogICAgIHNhbml0aXplOiB7CiAgICAgICAgIGNmaTogdHJ1ZSwKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L01QRUc0RXh0cmFjdG9yLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L01QRUc0RXh0cmFjdG9yLmNwcAppbmRleCBiNDExMTI1Li44ODIzYzc5IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wNC9NUEVHNEV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvTVBFRzRFeHRyYWN0b3IuY3BwCkBAIC00NDUsNjUgKzQ0NSw4MSBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICBpbnQ2NF90IGR1cmF0aW9uOwotICAgIGludDMyX3Qgc2FtcGxlcmF0ZTsKLSAgICBpZiAodHJhY2stPmhhc19lbHN0ICYmIG1IZWFkZXJUaW1lc2NhbGUgIT0gMCAmJgotICAgICAgICAgICAgdHJhY2stPm1ldGEtPmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZkdXJhdGlvbikgJiYKLSAgICAgICAgICAgIHRyYWNrLT5tZXRhLT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZzYW1wbGVyYXRlKSkgeworICAgIFs9XSB7CisgICAgICAgIGludDY0X3QgZHVyYXRpb247CisgICAgICAgIGludDMyX3Qgc2FtcGxlcmF0ZTsKKyAgICAgICAgaWYgKHRyYWNrLT5oYXNfZWxzdCAmJiBtSGVhZGVyVGltZXNjYWxlICE9IDAgJiYKKyAgICAgICAgICAgICAgICB0cmFjay0+bWV0YS0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uKSAmJgorICAgICAgICAgICAgICAgIHRyYWNrLT5tZXRhLT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZzYW1wbGVyYXRlKSkgewogCi0gICAgICAgIHRyYWNrLT5oYXNfZWxzdCA9IGZhbHNlOworICAgICAgICAgICAgdHJhY2stPmhhc19lbHN0ID0gZmFsc2U7CiAKLSAgICAgICAgaWYgKHRyYWNrLT5lbHN0X3NlZ21lbnRfZHVyYXRpb24gPiBJTlQ2NF9NQVgpIHsKLSAgICAgICAgICAgIGdvdG8gZWRpdGxpc3RvdmVyZmxvdzsKKyAgICAgICAgICAgIGlmICh0cmFjay0+ZWxzdF9zZWdtZW50X2R1cmF0aW9uID4gSU5UNjRfTUFYKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50NjRfdCBzZWdtZW50X2R1cmF0aW9uID0gdHJhY2stPmVsc3Rfc2VnbWVudF9kdXJhdGlvbjsKKyAgICAgICAgICAgIGludDY0X3QgbWVkaWFfdGltZSA9IHRyYWNrLT5lbHN0X21lZGlhX3RpbWU7CisgICAgICAgICAgICBpbnQ2NF90IGhhbGZzY2FsZSA9IG1IZWFkZXJUaW1lc2NhbGUgLyAyOworICAgICAgICAgICAgQUxPR1YoInNlZ21lbnRfZHVyYXRpb24gPSAlIiBQUklkNjQgIiwgbWVkaWFfdGltZSA9ICUiIFBSSWQ2NAorICAgICAgICAgICAgICAgICAgIiwgaGFsZnNjYWxlID0gJSIgUFJJZDY0ICIsIHRpbWVzY2FsZSA9ICVkIiwKKyAgICAgICAgICAgICAgICAgIHNlZ21lbnRfZHVyYXRpb24sCisgICAgICAgICAgICAgICAgICBtZWRpYV90aW1lLAorICAgICAgICAgICAgICAgICAgaGFsZnNjYWxlLAorICAgICAgICAgICAgICAgICAgbUhlYWRlclRpbWVzY2FsZSk7CisKKyAgICAgICAgICAgIGludDY0X3QgZGVsYXk7CisgICAgICAgICAgICAvLyBkZWxheSA9ICgobWVkaWFfdGltZSAqIHNhbXBsZXJhdGUpICsgaGFsZnNjYWxlKSAvIG1IZWFkZXJUaW1lc2NhbGU7CisgICAgICAgICAgICBpZiAoX19idWlsdGluX211bF9vdmVyZmxvdyhtZWRpYV90aW1lLCBzYW1wbGVyYXRlLCAmZGVsYXkpIHx8CisgICAgICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9hZGRfb3ZlcmZsb3coZGVsYXksIGhhbGZzY2FsZSwgJmRlbGF5KSB8fAorICAgICAgICAgICAgICAgICAgICAoZGVsYXkgLz0gbUhlYWRlclRpbWVzY2FsZSwgZmFsc2UpIHx8CisgICAgICAgICAgICAgICAgICAgIGRlbGF5ID4gSU5UMzJfTUFYIHx8CisgICAgICAgICAgICAgICAgICAgIGRlbGF5IDwgSU5UMzJfTUlOKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoImRlbGF5ID0gJSIgUFJJZDY0LCBkZWxheSk7CisgICAgICAgICAgICB0cmFjay0+bWV0YS0+c2V0SW50MzIoa0tleUVuY29kZXJEZWxheSwgZGVsYXkpOworCisgICAgICAgICAgICBpbnQ2NF90IHNjYWxlZF9kdXJhdGlvbjsKKyAgICAgICAgICAgIC8vIHNjYWxlZF9kdXJhdGlvbiA9IGR1cmF0aW9uICogbUhlYWRlclRpbWVzY2FsZTsKKyAgICAgICAgICAgIGlmIChfX2J1aWx0aW5fbXVsX292ZXJmbG93KGR1cmF0aW9uLCBtSGVhZGVyVGltZXNjYWxlLCAmc2NhbGVkX2R1cmF0aW9uKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJzY2FsZWRfZHVyYXRpb24gPSAlIiBQUklkNjQsIHNjYWxlZF9kdXJhdGlvbik7CisKKyAgICAgICAgICAgIGludDY0X3Qgc2VnbWVudF9lbmQ7CisgICAgICAgICAgICBpbnQ2NF90IHBhZGRpbmc7CisgICAgICAgICAgICAvLyBwYWRkaW5nID0gc2NhbGVkX2R1cmF0aW9uIC0gKChzZWdtZW50X2R1cmF0aW9uICsgbWVkaWFfdGltZSkgKiAxMDAwMDAwKTsKKyAgICAgICAgICAgIGlmIChfX2J1aWx0aW5fYWRkX292ZXJmbG93KHNlZ21lbnRfZHVyYXRpb24sIG1lZGlhX3RpbWUsICZzZWdtZW50X2VuZCkgfHwKKyAgICAgICAgICAgICAgICAgICAgX19idWlsdGluX211bF9vdmVyZmxvdyhzZWdtZW50X2VuZCwgMTAwMDAwMCwgJnNlZ21lbnRfZW5kKSB8fAorICAgICAgICAgICAgICAgICAgICBfX2J1aWx0aW5fc3ViX292ZXJmbG93KHNjYWxlZF9kdXJhdGlvbiwgc2VnbWVudF9lbmQsICZwYWRkaW5nKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJzZWdtZW50X2VuZCA9ICUiIFBSSWQ2NCAiLCBwYWRkaW5nID0gJSIgUFJJZDY0LCBzZWdtZW50X2VuZCwgcGFkZGluZyk7CisKKyAgICAgICAgICAgIGlmIChwYWRkaW5nIDwgMCkgeworICAgICAgICAgICAgICAgIC8vIHRyYWNrIGR1cmF0aW9uIGZyb20gbWVkaWEgaGVhZGVyICh3aGljaCBpcyB3aGF0IGtLZXlEdXJhdGlvbiBpcykgbWlnaHQKKyAgICAgICAgICAgICAgICAvLyBiZSBzbGlnaHRseSBzaG9ydGVyIHRoYW4gdGhlIHNlZ21lbnQgZHVyYXRpb24sIHdoaWNoIHdvdWxkIG1ha2UgdGhlCisgICAgICAgICAgICAgICAgLy8gcGFkZGluZyBuZWdhdGl2ZS4gQ2xhbXAgdG8gemVyby4KKyAgICAgICAgICAgICAgICBwYWRkaW5nID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50NjRfdCBwYWRkaW5nc2FtcGxlczsKKyAgICAgICAgICAgIGludDY0X3QgaGFsZnNjYWxlX2U2OworICAgICAgICAgICAgaW50NjRfdCB0aW1lc2NhbGVfZTY7CisgICAgICAgICAgICAvLyBwYWRkaW5nc2FtcGxlcyA9ICgocGFkZGluZyAqIHNhbXBsZXJhdGUpICsgKGhhbGZzY2FsZSAqIDEwMDAwMDApKQorICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgLyAobUhlYWRlclRpbWVzY2FsZSAqIDEwMDAwMDApOworICAgICAgICAgICAgaWYgKF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3cocGFkZGluZywgc2FtcGxlcmF0ZSwgJnBhZGRpbmdzYW1wbGVzKSB8fAorICAgICAgICAgICAgICAgICAgICBfX2J1aWx0aW5fbXVsX292ZXJmbG93KGhhbGZzY2FsZSwgMTAwMDAwMCwgJmhhbGZzY2FsZV9lNikgfHwKKyAgICAgICAgICAgICAgICAgICAgX19idWlsdGluX211bF9vdmVyZmxvdyhtSGVhZGVyVGltZXNjYWxlLCAxMDAwMDAwLCAmdGltZXNjYWxlX2U2KSB8fAorICAgICAgICAgICAgICAgICAgICBfX2J1aWx0aW5fYWRkX292ZXJmbG93KHBhZGRpbmdzYW1wbGVzLCBoYWxmc2NhbGVfZTYsICZwYWRkaW5nc2FtcGxlcykgfHwKKyAgICAgICAgICAgICAgICAgICAgKHBhZGRpbmdzYW1wbGVzIC89IHRpbWVzY2FsZV9lNiwgZmFsc2UpIHx8CisgICAgICAgICAgICAgICAgICAgIHBhZGRpbmdzYW1wbGVzID4gSU5UMzJfTUFYKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoInBhZGRpbmdzYW1wbGVzID0gJSIgUFJJZDY0LCBwYWRkaW5nc2FtcGxlcyk7CisgICAgICAgICAgICB0cmFjay0+bWV0YS0+c2V0SW50MzIoa0tleUVuY29kZXJQYWRkaW5nLCBwYWRkaW5nc2FtcGxlcyk7CiAgICAgICAgIH0KLSAgICAgICAgaW50NjRfdCBzZWdtZW50X2R1cmF0aW9uID0gdHJhY2stPmVsc3Rfc2VnbWVudF9kdXJhdGlvbjsKLSAgICAgICAgaW50NjRfdCBtZWRpYV90aW1lID0gdHJhY2stPmVsc3RfbWVkaWFfdGltZTsKLSAgICAgICAgaW50NjRfdCBoYWxmc2NhbGUgPSBtSGVhZGVyVGltZXNjYWxlIC8gMjsKLQotICAgICAgICBpbnQ2NF90IGRlbGF5OwotICAgICAgICAvLyBkZWxheSA9ICgobWVkaWFfdGltZSAqIHNhbXBsZXJhdGUpICsgaGFsZnNjYWxlKSAvIG1IZWFkZXJUaW1lc2NhbGU7Ci0gICAgICAgIGlmIChfX2J1aWx0aW5fbXVsX292ZXJmbG93KG1lZGlhX3RpbWUsIHNhbXBsZXJhdGUsICZkZWxheSkgfHwKLSAgICAgICAgICAgICAgICBfX2J1aWx0aW5fYWRkX292ZXJmbG93KGRlbGF5LCBoYWxmc2NhbGUsICZkZWxheSkgfHwKLSAgICAgICAgICAgICAgICAoZGVsYXkgLz0gbUhlYWRlclRpbWVzY2FsZSwgZmFsc2UpIHx8Ci0gICAgICAgICAgICAgICAgZGVsYXkgPiBJTlQzMl9NQVggfHwKLSAgICAgICAgICAgICAgICBkZWxheSA8IElOVDMyX01JTikgewotICAgICAgICAgICAgZ290byBlZGl0bGlzdG92ZXJmbG93OwotICAgICAgICB9Ci0gICAgICAgIHRyYWNrLT5tZXRhLT5zZXRJbnQzMihrS2V5RW5jb2RlckRlbGF5LCBkZWxheSk7Ci0KLSAgICAgICAgaW50NjRfdCBzY2FsZWRfZHVyYXRpb247Ci0gICAgICAgIC8vIHNjYWxlZF9kdXJhdGlvbiA9ICgoZHVyYXRpb24gKiBtSGVhZGVyVGltZXNjYWxlKSArIDUwMDAwMCkgLyAxMDAwMDAwOwotICAgICAgICBpZiAoX19idWlsdGluX211bF9vdmVyZmxvdyhkdXJhdGlvbiwgbUhlYWRlclRpbWVzY2FsZSwgJnNjYWxlZF9kdXJhdGlvbikgfHwKLSAgICAgICAgICAgICAgICBfX2J1aWx0aW5fYWRkX292ZXJmbG93KHNjYWxlZF9kdXJhdGlvbiwgNTAwMDAwLCAmc2NhbGVkX2R1cmF0aW9uKSkgewotICAgICAgICAgICAgZ290byBlZGl0bGlzdG92ZXJmbG93OwotICAgICAgICB9Ci0gICAgICAgIHNjYWxlZF9kdXJhdGlvbiAvPSAxMDAwMDAwOwotCi0gICAgICAgIGludDY0X3Qgc2VnbWVudF9lbmQ7Ci0gICAgICAgIGludDY0X3QgcGFkZGluZzsKLSAgICAgICAgaWYgKF9fYnVpbHRpbl9hZGRfb3ZlcmZsb3coc2VnbWVudF9kdXJhdGlvbiwgbWVkaWFfdGltZSwgJnNlZ21lbnRfZW5kKSB8fAotICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9zdWJfb3ZlcmZsb3coc2NhbGVkX2R1cmF0aW9uLCBzZWdtZW50X2VuZCwgJnBhZGRpbmcpKSB7Ci0gICAgICAgICAgICBnb3RvIGVkaXRsaXN0b3ZlcmZsb3c7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocGFkZGluZyA8IDApIHsKLSAgICAgICAgICAgIC8vIHRyYWNrIGR1cmF0aW9uIGZyb20gbWVkaWEgaGVhZGVyICh3aGljaCBpcyB3aGF0IGtLZXlEdXJhdGlvbiBpcykgbWlnaHQKLSAgICAgICAgICAgIC8vIGJlIHNsaWdodGx5IHNob3J0ZXIgdGhhbiB0aGUgc2VnbWVudCBkdXJhdGlvbiwgd2hpY2ggd291bGQgbWFrZSB0aGUKLSAgICAgICAgICAgIC8vIHBhZGRpbmcgbmVnYXRpdmUuIENsYW1wIHRvIHplcm8uCi0gICAgICAgICAgICBwYWRkaW5nID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGludDY0X3QgcGFkZGluZ3NhbXBsZXM7Ci0gICAgICAgIC8vIHBhZGRpbmdzYW1wbGVzID0gKChwYWRkaW5nICogc2FtcGxlcmF0ZSkgKyBoYWxmc2NhbGUpIC8gbUhlYWRlclRpbWVzY2FsZTsKLSAgICAgICAgaWYgKF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3cocGFkZGluZywgc2FtcGxlcmF0ZSwgJnBhZGRpbmdzYW1wbGVzKSB8fAotICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9hZGRfb3ZlcmZsb3cocGFkZGluZ3NhbXBsZXMsIGhhbGZzY2FsZSwgJnBhZGRpbmdzYW1wbGVzKSB8fAotICAgICAgICAgICAgICAgIChwYWRkaW5nc2FtcGxlcyAvPSBtSGVhZGVyVGltZXNjYWxlLCBmYWxzZSkgfHwKLSAgICAgICAgICAgICAgICBwYWRkaW5nc2FtcGxlcyA+IElOVDMyX01BWCkgewotICAgICAgICAgICAgZ290byBlZGl0bGlzdG92ZXJmbG93OwotICAgICAgICB9Ci0gICAgICAgIHRyYWNrLT5tZXRhLT5zZXRJbnQzMihrS2V5RW5jb2RlclBhZGRpbmcsIHBhZGRpbmdzYW1wbGVzKTsKLSAgICB9Ci0gICAgZWRpdGxpc3RvdmVyZmxvdzoKKyAgICB9KCk7CiAKICAgICBpZiAoKGZsYWdzICYga0luY2x1ZGVFeHRlbnNpdmVNZXRhRGF0YSkKICAgICAgICAgICAgICYmICF0cmFjay0+aW5jbHVkZXNfZXhwZW5zaXZlX21ldGFkYXRhKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wNC9leHBvcnRzLmxkcyBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L2V4cG9ydHMubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMzA5ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9leHBvcnRzLmxkcwpAQCAtMCwwICsxIEBACit7IGdsb2JhbDogR0VURVhUUkFDVE9SREVGOyBsb2NhbDogKjsgfTsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvQW5kcm9pZC5icAppbmRleCA1MGY3NDBiLi44MThmOWIwIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wZWcyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9BbmRyb2lkLmJwCkBAIC0yMCw5ICsyMCw3IEBACiAgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGliaGlkbGJhc2UiLAogICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYm1lZGlhIiwgIC8vIE5lZWRlZCBmb3IgSVN0cmVhbUxpc3RlbmVyCiAgICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodCIsICAvLyBOZWVkZWQgZm9yIEFub3RoZXJQYWNrZXRTb3VyY2UgYW5kIG1vcmUKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlidXRpbHMiLAogICAgIF0sCkBAIC00MSw2ICszOSw3IEBACiAgICAgICAgICItV2FsbCIsCiAgICAgICAgICItZnZpc2liaWxpdHk9aGlkZGVuIiwKICAgICBdLAorICAgIHZlcnNpb25fc2NyaXB0OiAiZXhwb3J0cy5sZHMiLAogCiAgICAgc2FuaXRpemU6IHsKICAgICAgICAgY2ZpOiB0cnVlLApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlRTRXh0cmFjdG9yLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJUU0V4dHJhY3Rvci5jcHAKaW5kZXggNGY2MWUxNi4uZmVmNGQzMCAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlRTRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyVFNFeHRyYWN0b3IuY3BwCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFLZXlzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgpAQCAtNTYwLDcgKzU2MSw3IEBACiBzdGF0dXNfdCBNUEVHMlRTRXh0cmFjdG9yOjpxdWV1ZURpc2NvbnRpbnVpdHlGb3JTZWVrKGludDY0X3QgYWN0dWFsU2Vla1RpbWVVcykgewogICAgIC8vIFNpZ25hbCBkaXNjb250aW51aXR5CiAgICAgc3A8QU1lc3NhZ2U+IGV4dHJhKG5ldyBBTWVzc2FnZSk7Ci0gICAgZXh0cmEtPnNldEludDY0KElTdHJlYW1MaXN0ZW5lcjo6a0tleU1lZGlhVGltZVVzLCBhY3R1YWxTZWVrVGltZVVzKTsKKyAgICBleHRyYS0+c2V0SW50NjQoa0FUU1BhcnNlcktleU1lZGlhVGltZVVzLCBhY3R1YWxTZWVrVGltZVVzKTsKICAgICBtUGFyc2VyLT5zaWduYWxEaXNjb250aW51aXR5KEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9USU1FLCBleHRyYSk7CiAKICAgICAvLyBBZnRlciBkaXNjb250aW51aXR5LCBpbXBsIHNob3VsZCBvbmx5IGhhdmUgZGlzY29udGludWl0aWVzCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wZWcyL2V4cG9ydHMubGRzIGIvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9leHBvcnRzLmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTMwOWVlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9leHBvcnRzLmxkcwpAQCAtMCwwICsxIEBACit7IGdsb2JhbDogR0VURVhUUkFDVE9SREVGOyBsb2NhbDogKjsgfTsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvb2dnL0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL29nZy9BbmRyb2lkLmJwCmluZGV4IDZiZDgwMjUuLjJjMDlhNWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvb2dnL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvQW5kcm9pZC5icApAQCAtMjgsNiArMjgsNyBAQAogICAgICAgICAiLVdhbGwiLAogICAgICAgICAiLWZ2aXNpYmlsaXR5PWhpZGRlbiIsCiAgICAgXSwKKyAgICB2ZXJzaW9uX3NjcmlwdDogImV4cG9ydHMubGRzIiwKIAogICAgIHNhbml0aXplOiB7CiAgICAgICAgIGNmaTogdHJ1ZSwKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvb2dnL2V4cG9ydHMubGRzIGIvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvZXhwb3J0cy5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjEzMDllZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvb2dnL2V4cG9ydHMubGRzCkBAIC0wLDAgKzEgQEAKK3sgZ2xvYmFsOiBHRVRFWFRSQUNUT1JERUY7IGxvY2FsOiAqOyB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy93YXYvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvd2F2L0FuZHJvaWQuYnAKaW5kZXggZjMxMDg5Mi4uNjVjNzFlZiAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy93YXYvQW5kcm9pZC5icAorKysgYi9tZWRpYS9leHRyYWN0b3JzL3dhdi9BbmRyb2lkLmJwCkBAIC0yNyw2ICsyNyw3IEBACiAgICAgICAgICItV2FsbCIsCiAgICAgICAgICItZnZpc2liaWxpdHk9aGlkZGVuIiwKICAgICBdLAorICAgIHZlcnNpb25fc2NyaXB0OiAiZXhwb3J0cy5sZHMiLAogCiAgICAgc2FuaXRpemU6IHsKICAgICAgICAgY2ZpOiB0cnVlLApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy93YXYvZXhwb3J0cy5sZHMgYi9tZWRpYS9leHRyYWN0b3JzL3dhdi9leHBvcnRzLmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTMwOWVlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy93YXYvZXhwb3J0cy5sZHMKQEAgLTAsMCArMSBAQAoreyBnbG9iYWw6IEdFVEVYVFJBQ1RPUkRFRjsgbG9jYWw6ICo7IH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuY3BwCmluZGV4IGI3YjRiNWMuLjZkNWE2NGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuY3BwCkBAIC0xNzEsNyArMTcxLDcgQEAKICAgICBtQ2xvY2tNb2RlbC5zZXRTYW1wbGVSYXRlKGdldFNhbXBsZVJhdGUoKSk7CiAgICAgbUNsb2NrTW9kZWwuc2V0RnJhbWVzUGVyQnVyc3QobUZyYW1lc1BlckJ1cnN0KTsKIAotICAgIGlmIChnZXREYXRhQ2FsbGJhY2tQcm9jKCkpIHsKKyAgICBpZiAoaXNEYXRhQ2FsbGJhY2tTZXQoKSkgewogICAgICAgICBtQ2FsbGJhY2tGcmFtZXMgPSBidWlsZGVyLmdldEZyYW1lc1BlckRhdGFDYWxsYmFjaygpOwogICAgICAgICBpZiAobUNhbGxiYWNrRnJhbWVzID4gZ2V0QnVmZmVyQ2FwYWNpdHkoKSAvIDIpIHsKICAgICAgICAgICAgIEFMT0dFKCIlcyAtIGZyYW1lc1BlckNhbGxiYWNrIHRvbyBiaWcgPSAlZCwgY2FwYWNpdHkgPSAlZCIsCkBAIC0yOTAsNyArMjkwLDcgQEAKICAgICBtTmVlZENhdGNoVXAucmVxdWVzdCgpOyAgLy8gQXNrIGRhdGEgcHJvY2Vzc2luZyBjb2RlIHRvIGNhdGNoIHVwIHdoZW4gZmlyc3QgdGltZXN0YW1wIHJlY2VpdmVkLgogCiAgICAgLy8gU3RhcnQgZGF0YSBjYWxsYmFjayB0aHJlYWQuCi0gICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0sgJiYgZ2V0RGF0YUNhbGxiYWNrUHJvYygpICE9IG51bGxwdHIpIHsKKyAgICBpZiAocmVzdWx0ID09IEFBVURJT19PSyAmJiBpc0RhdGFDYWxsYmFja1NldCgpKSB7CiAgICAgICAgIC8vIExhdW5jaCB0aGUgY2FsbGJhY2sgbG9vcCB0aHJlYWQuCiAgICAgICAgIGludDY0X3QgcGVyaW9kTmFub3MgPSBtQ2FsbGJhY2tGcmFtZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQUFVRElPX05BTk9TX1BFUl9TRUNPTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlLmNwcAppbmRleCAzZTgyYTg4Li42MmYwZmM4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmUuY3BwCkBAIC0yMzIsOCArMjMyLDcgQEAKIHZvaWQgKkF1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlOjpjYWxsYmFja0xvb3AoKSB7CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKICAgICBhYXVkaW9fZGF0YV9jYWxsYmFja19yZXN1bHRfdCBjYWxsYmFja1Jlc3VsdCA9IEFBVURJT19DQUxMQkFDS19SRVNVTFRfQ09OVElOVUU7Ci0gICAgQUF1ZGlvU3RyZWFtX2RhdGFDYWxsYmFjayBhcHBDYWxsYmFjayA9IGdldERhdGFDYWxsYmFja1Byb2MoKTsKLSAgICBpZiAoYXBwQ2FsbGJhY2sgPT0gbnVsbHB0cikgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFpc0RhdGFDYWxsYmFja1NldCgpKSByZXR1cm4gTlVMTDsKIAogICAgIC8vIHJlc3VsdCBtaWdodCBiZSBhIGZyYW1lIGNvdW50CiAgICAgd2hpbGUgKG1DYWxsYmFja0VuYWJsZWQubG9hZCgpICYmIGlzQWN0aXZlKCkgJiYgKHJlc3VsdCA+PSAwKSkgewpAQCAtMjQ5LDIyICsyNDgsMTIgQEAKICAgICAgICAgICAgICAgICAvLyBPbmx5IHJlYWQgc29tZSBvZiB0aGUgZnJhbWVzIHJlcXVlc3RlZC4gTXVzdCBoYXZlIHRpbWVkIG91dC4KICAgICAgICAgICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfVElNRU9VVDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFBdWRpb1N0cmVhbV9lcnJvckNhbGxiYWNrIGVycm9yQ2FsbGJhY2sgPSBnZXRFcnJvckNhbGxiYWNrUHJvYygpOwotICAgICAgICAgICAgaWYgKGVycm9yQ2FsbGJhY2sgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgICgqZXJyb3JDYWxsYmFjaykoCi0gICAgICAgICAgICAgICAgICAgICAgICAoQUF1ZGlvU3RyZWFtICopIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRFcnJvckNhbGxiYWNrVXNlckRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBtYXliZUNhbGxFcnJvckNhbGxiYWNrKHJlc3VsdCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIC8vIENhbGwgYXBwbGljYXRpb24gdXNpbmcgdGhlIEFBdWRpbyBjYWxsYmFjayBpbnRlcmZhY2UuCi0gICAgICAgIGNhbGxiYWNrUmVzdWx0ID0gKCphcHBDYWxsYmFjaykoCi0gICAgICAgICAgICAgICAgKEFBdWRpb1N0cmVhbSAqKSB0aGlzLAotICAgICAgICAgICAgICAgIGdldERhdGFDYWxsYmFja1VzZXJEYXRhKCksCi0gICAgICAgICAgICAgICAgbUNhbGxiYWNrQnVmZmVyLAotICAgICAgICAgICAgICAgIG1DYWxsYmFja0ZyYW1lcyk7CisgICAgICAgIGNhbGxiYWNrUmVzdWx0ID0gbWF5YmVDYWxsRGF0YUNhbGxiYWNrKG1DYWxsYmFja0J1ZmZlciwgbUNhbGxiYWNrRnJhbWVzKTsKIAogICAgICAgICBpZiAoY2FsbGJhY2tSZXN1bHQgPT0gQUFVRElPX0NBTExCQUNLX1JFU1VMVF9TVE9QKSB7CiAgICAgICAgICAgICBBTE9HRCgiY2FsbGJhY2sgcmV0dXJuZWQgQUFVRElPX0NBTExCQUNLX1JFU1VMVF9TVE9QIik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5jcHAKaW5kZXggYjQ5ZTA4Yy4uNWRlNmExMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmNwcApAQCAtMzIzLDE4ICszMjMsMTMgQEAKIHZvaWQgKkF1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5OjpjYWxsYmFja0xvb3AoKSB7CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKICAgICBhYXVkaW9fZGF0YV9jYWxsYmFja19yZXN1bHRfdCBjYWxsYmFja1Jlc3VsdCA9IEFBVURJT19DQUxMQkFDS19SRVNVTFRfQ09OVElOVUU7Ci0gICAgQUF1ZGlvU3RyZWFtX2RhdGFDYWxsYmFjayBhcHBDYWxsYmFjayA9IGdldERhdGFDYWxsYmFja1Byb2MoKTsKLSAgICBpZiAoYXBwQ2FsbGJhY2sgPT0gbnVsbHB0cikgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFpc0RhdGFDYWxsYmFja1NldCgpKSByZXR1cm4gTlVMTDsKICAgICBpbnQ2NF90IHRpbWVvdXROYW5vcyA9IGNhbGN1bGF0ZVJlYXNvbmFibGVUaW1lb3V0KG1DYWxsYmFja0ZyYW1lcyk7CiAKICAgICAvLyByZXN1bHQgbWlnaHQgYmUgYSBmcmFtZSBjb3VudAogICAgIHdoaWxlIChtQ2FsbGJhY2tFbmFibGVkLmxvYWQoKSAmJiBpc0FjdGl2ZSgpICYmIChyZXN1bHQgPj0gMCkpIHsKICAgICAgICAgLy8gQ2FsbCBhcHBsaWNhdGlvbiB1c2luZyB0aGUgQUF1ZGlvIGNhbGxiYWNrIGludGVyZmFjZS4KLSAgICAgICAgY2FsbGJhY2tSZXN1bHQgPSAoKmFwcENhbGxiYWNrKSgKLSAgICAgICAgICAgICAgICAoQUF1ZGlvU3RyZWFtICopIHRoaXMsCi0gICAgICAgICAgICAgICAgZ2V0RGF0YUNhbGxiYWNrVXNlckRhdGEoKSwKLSAgICAgICAgICAgICAgICBtQ2FsbGJhY2tCdWZmZXIsCi0gICAgICAgICAgICAgICAgbUNhbGxiYWNrRnJhbWVzKTsKKyAgICAgICAgY2FsbGJhY2tSZXN1bHQgPSBtYXliZUNhbGxEYXRhQ2FsbGJhY2sobUNhbGxiYWNrQnVmZmVyLCBtQ2FsbGJhY2tGcmFtZXMpOwogCiAgICAgICAgIGlmIChjYWxsYmFja1Jlc3VsdCA9PSBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX0NPTlRJTlVFKSB7CiAgICAgICAgICAgICAvLyBXcml0ZSBhdWRpbyBkYXRhIHRvIHN0cmVhbS4gVGhpcyBpcyBhIEJMT0NLSU5HIFdSSVRFIQpAQCAtMzQ1LDEzICszNDAsNyBAQAogICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IHdyb3RlIHNvbWUgb2YgdGhlIGZyYW1lcyByZXF1ZXN0ZWQuIE11c3QgaGF2ZSB0aW1lZCBvdXQuCiAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9USU1FT1VUOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBBQXVkaW9TdHJlYW1fZXJyb3JDYWxsYmFjayBlcnJvckNhbGxiYWNrID0gZ2V0RXJyb3JDYWxsYmFja1Byb2MoKTsKLSAgICAgICAgICAgICAgICBpZiAoZXJyb3JDYWxsYmFjayAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgICAgICgqZXJyb3JDYWxsYmFjaykoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFBdWRpb1N0cmVhbSAqKSB0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEVycm9yQ2FsbGJhY2tVc2VyRGF0YSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1heWJlQ2FsbEVycm9yQ2FsbGJhY2socmVzdWx0KTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChjYWxsYmFja1Jlc3VsdCA9PSBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1ApIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9BdWRpby5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvQXVkaW8uY3BwCmluZGV4IDFlYWVlODEuLmJiMDA3YWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9BdWRpby5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb0F1ZGlvLmNwcApAQCAtMTgsNiArMTgsOCBAQAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxtdXRleD4KICNpbmNsdWRlIDx0aW1lLmg+CiAjaW5jbHVkZSA8cHRocmVhZC5oPgogCkBAIC0yMzgsMTUgKzI0MCwyNiBAQAogCiBBQVVESU9fQVBJIGFhdWRpb19yZXN1bHRfdCAgQUF1ZGlvU3RyZWFtX2Nsb3NlKEFBdWRpb1N0cmVhbSogc3RyZWFtKQogeworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fRVJST1JfTlVMTDsKICAgICBBdWRpb1N0cmVhbSAqYXVkaW9TdHJlYW0gPSBjb252ZXJ0QUF1ZGlvU3RyZWFtVG9BdWRpb1N0cmVhbShzdHJlYW0pOwotICAgIEFMT0dEKCJBQXVkaW9TdHJlYW1fY2xvc2UoJXApIiwgc3RyZWFtKTsKKyAgICBBTE9HRCgiQUF1ZGlvU3RyZWFtX2Nsb3NlKCVwKSBjYWxsZWQgLS0tLS0tLS0tLS0tLS0tIiwgc3RyZWFtKTsKICAgICBpZiAoYXVkaW9TdHJlYW0gIT0gbnVsbHB0cikgewotICAgICAgICBhdWRpb1N0cmVhbS0+Y2xvc2UoKTsKLSAgICAgICAgYXVkaW9TdHJlYW0tPnVucmVnaXN0ZXJQbGF5ZXJCYXNlKCk7Ci0gICAgICAgIGRlbGV0ZSBhdWRpb1N0cmVhbTsKLSAgICAgICAgcmV0dXJuIEFBVURJT19PSzsKKyAgICAgICAgcmVzdWx0ID0gYXVkaW9TdHJlYW0tPnNhZmVDbG9zZSgpOworICAgICAgICAvLyBDbG9zZSB3aWxsIG9ubHkgZmFpbCBpZiBjYWxsZWQgaWxsZWdhbGx5LCBmb3IgZXhhbXBsZSwgZnJvbSBhIGNhbGxiYWNrLgorICAgICAgICAvLyBUaGF0IHdvdWxkIHJlc3VsdCBpbiBkZWxldGluZyBhbiBhY3RpdmUgc3RyZWFtLCB3aGljaCB3b3VsZCBjYXVzZSBhIGNyYXNoLgorICAgICAgICBpZiAocmVzdWx0ID09IEFBVURJT19PSykgeworICAgICAgICAgICAgYXVkaW9TdHJlYW0tPnVucmVnaXN0ZXJQbGF5ZXJCYXNlKCk7CisgICAgICAgICAgICBkZWxldGUgYXVkaW9TdHJlYW07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVygiJXMgYXR0ZW1wdCB0byBjbG9zZSBmYWlsZWQuIENsb3NlIGl0IGZyb20gYW5vdGhlciB0aHJlYWQuIiwgX19mdW5jX18pOworICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBBQVVESU9fRVJST1JfTlVMTDsKKyAgICAvLyBXZSdyZSBwb3RlbnRpYWxseSBmcmVlaW5nIGBzdHJlYW1gIGFib3ZlLCBzbyBpdHMgdXNlIGhlcmUgbWFrZXMgc29tZQorICAgIC8vIHN0YXRpYyBhbmFseXNpcyB0b29scyB1bmhhcHB5LiBDYXN0aW5nIHRvIHVpbnRwdHJfdCBoZWxwcyBhc3N1cmUKKyAgICAvLyBzYWlkIHRvb2xzIHRoYXQgd2UncmUgbm90IGRvaW5nIGFueXRoaW5nIGJhZCBoZXJlLgorICAgIEFMT0dEKCJBQXVkaW9TdHJlYW1fY2xvc2UoJSMiIFBSSXhQVFIgIikgcmV0dXJuZWQgJWQgLS0tLS0tLS0tIiwKKyAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oc3RyZWFtKSwgcmVzdWx0KTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBBQVVESU9fQVBJIGFhdWRpb19yZXN1bHRfdCAgQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdGFydChBQXVkaW9TdHJlYW0qIHN0cmVhbSkKQEAgLTI2OSw3ICsyODIsNyBAQAogewogICAgIEF1ZGlvU3RyZWFtICphdWRpb1N0cmVhbSA9IGNvbnZlcnRBQXVkaW9TdHJlYW1Ub0F1ZGlvU3RyZWFtKHN0cmVhbSk7CiAgICAgQUxPR0QoIkFBdWRpb1N0cmVhbV9yZXF1ZXN0Rmx1c2goJXApIiwgc3RyZWFtKTsKLSAgICByZXR1cm4gYXVkaW9TdHJlYW0tPnJlcXVlc3RGbHVzaCgpOworICAgIHJldHVybiBhdWRpb1N0cmVhbS0+c2FmZUZsdXNoKCk7CiB9CiAKIEFBVURJT19BUEkgYWF1ZGlvX3Jlc3VsdF90ICBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0b3AoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pCkBAIC0zMjQsNyArMzM3LDcgQEAKICAgICB9CiAKICAgICAvLyBEb24ndCBhbGxvdyB3cml0ZXMgd2hlbiBwbGF5aW5nIHdpdGggYSBjYWxsYmFjay4KLSAgICBpZiAoYXVkaW9TdHJlYW0tPmdldERhdGFDYWxsYmFja1Byb2MoKSAhPSBudWxscHRyICYmIGF1ZGlvU3RyZWFtLT5pc0FjdGl2ZSgpKSB7CisgICAgaWYgKGF1ZGlvU3RyZWFtLT5pc0RhdGFDYWxsYmFja0FjdGl2ZSgpKSB7CiAgICAgICAgIEFMT0dFKCJDYW5ub3Qgd3JpdGUgdG8gYSBjYWxsYmFjayBzdHJlYW0gd2hlbiBydW5uaW5nLiIpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5jcHAKaW5kZXggMjdjMzZlMS4uOGY1ZjVkMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW0uY3BwCkBAIC00Myw3ICs0Myw3IEBACiAgICAgTE9HX0FMV0FZU19GQVRBTF9JRighKGdldFN0YXRlKCkgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TRUQKICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgZ2V0U3RhdGUoKSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX1VOSU5JVElBTElaRUQKICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgZ2V0U3RhdGUoKSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX0RJU0NPTk5FQ1RFRCksCi0gICAgICAgICAgICAgICAgICAgICAgICAiYWF1ZGlvIHN0cmVhbSBzdGlsbCBpbiB1c2UsIHN0YXRlID0gJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIn5BdWRpb1N0cmVhbSgpIC0gc3RpbGwgaW4gdXNlLCBzdGF0ZSA9ICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgIEFBdWRpb19jb252ZXJ0U3RyZWFtU3RhdGVUb1RleHQoZ2V0U3RhdGUoKSkpOwogCiAgICAgbVBsYXllckJhc2UtPmNsZWFyUGFyZW50UmVmZXJlbmNlKCk7IC8vIHJlbW92ZSByZWZlcmVuY2UgdG8gdGhpcyBBdWRpb1N0cmVhbQpAQCAtOTcsMTIgKzk3LDU2IEBACiAgICAgICAgICAgKGdldERpcmVjdGlvbigpID09IEFBVURJT19ESVJFQ1RJT05fT1VUUFVUKSA/ICJPVVRQVVQiIDogIklOUFVUIik7CiAgICAgQUxPR0koIm9wZW4oKSBkZXZpY2UgPSAlZCwgcGVyZk1vZGUgPSAlZCwgY2FsbGJhY2s6ICVzIHdpdGggZnJhbWVzID0gJWQiLAogICAgICAgICAgIG1EZXZpY2VJZCwgbVBlcmZvcm1hbmNlTW9kZSwKLSAgICAgICAgICAobURhdGFDYWxsYmFja1Byb2MgPT0gbnVsbHB0ciA/ICJPRkYiIDogIk9OIiksCisgICAgICAgICAgKGlzRGF0YUNhbGxiYWNrU2V0KCkgPyAiT04iIDogIk9GRiIpLAogICAgICAgICAgIG1GcmFtZXNQZXJEYXRhQ2FsbGJhY2spOwogCiAgICAgcmV0dXJuIEFBVURJT19PSzsKIH0KIAorYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtOjpzYWZlU3RhcnQoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVN0cmVhbUxvY2spOworICAgIGlmIChjb2xsaWRlc1dpdGhDYWxsYmFjaygpKSB7CisgICAgICAgIEFMT0dFKCIlcyBjYW5ub3QgYmUgY2FsbGVkIGZyb20gYSBjYWxsYmFjayEiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKKyAgICB9CisgICAgcmV0dXJuIHJlcXVlc3RTdGFydCgpOworfQorCithYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW06OnNhZmVQYXVzZSgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtU3RyZWFtTG9jayk7CisgICAgaWYgKGNvbGxpZGVzV2l0aENhbGxiYWNrKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzIGNhbm5vdCBiZSBjYWxsZWQgZnJvbSBhIGNhbGxiYWNrISIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOworICAgIH0KKyAgICByZXR1cm4gcmVxdWVzdFBhdXNlKCk7Cit9CisKK2FhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbTo6c2FmZUZsdXNoKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1TdHJlYW1Mb2NrKTsKKyAgICBpZiAoY29sbGlkZXNXaXRoQ2FsbGJhY2soKSkgeworICAgICAgICBBTE9HRSgiJXMgY2Fubm90IGJlIGNhbGxlZCBmcm9tIGEgY2FsbGJhY2shIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CisgICAgfQorICAgIHJldHVybiByZXF1ZXN0Rmx1c2goKTsKK30KKworYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtOjpzYWZlU3RvcCgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtU3RyZWFtTG9jayk7CisgICAgaWYgKGNvbGxpZGVzV2l0aENhbGxiYWNrKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzIGNhbm5vdCBiZSBjYWxsZWQgZnJvbSBhIGNhbGxiYWNrISIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOworICAgIH0KKyAgICByZXR1cm4gcmVxdWVzdFN0b3AoKTsKK30KKworYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtOjpzYWZlQ2xvc2UoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVN0cmVhbUxvY2spOworICAgIGlmIChjb2xsaWRlc1dpdGhDYWxsYmFjaygpKSB7CisgICAgICAgIEFMT0dFKCIlcyBjYW5ub3QgYmUgY2FsbGVkIGZyb20gYSBjYWxsYmFjayEiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKKyAgICB9CisgICAgcmV0dXJuIGNsb3NlKCk7Cit9CiAKIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbTo6d2FpdEZvclN0YXRlQ2hhbmdlKGFhdWRpb19zdHJlYW1fc3RhdGVfdCBjdXJyZW50U3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fc3RyZWFtX3N0YXRlX3QgKm5leHRTdGF0ZSwKQEAgLTIwMCw2ICsyNDQsNTggQEAKIH0KIAogCithYXVkaW9fZGF0YV9jYWxsYmFja19yZXN1bHRfdCBBdWRpb1N0cmVhbTo6bWF5YmVDYWxsRGF0YUNhbGxiYWNrKHZvaWQgKmF1ZGlvRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICBhYXVkaW9fZGF0YV9jYWxsYmFja19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1A7CisgICAgQUF1ZGlvU3RyZWFtX2RhdGFDYWxsYmFjayBkYXRhQ2FsbGJhY2sgPSBnZXREYXRhQ2FsbGJhY2tQcm9jKCk7CisgICAgaWYgKGRhdGFDYWxsYmFjayAhPSBudWxscHRyKSB7CisgICAgICAgIC8vIFN0b3JlIHRocmVhZCBJRCBvZiBjYWxsZXIgdG8gZGV0ZWN0IHN0b3AoKSBhbmQgY2xvc2UoKSBjYWxscyBmcm9tIGNhbGxiYWNrLgorICAgICAgICBwaWRfdCBleHBlY3RlZCA9IENBTExCQUNLX1RIUkVBRF9OT05FOworICAgICAgICBpZiAobURhdGFDYWxsYmFja1RocmVhZC5jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhleHBlY3RlZCwgZ2V0dGlkKCkpKSB7CisgICAgICAgICAgICByZXN1bHQgPSAoKmRhdGFDYWxsYmFjaykoCisgICAgICAgICAgICAgICAgICAgIChBQXVkaW9TdHJlYW0gKikgdGhpcywKKyAgICAgICAgICAgICAgICAgICAgZ2V0RGF0YUNhbGxiYWNrVXNlckRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9EYXRhLAorICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMpOworICAgICAgICAgICAgbURhdGFDYWxsYmFja1RocmVhZC5zdG9yZShDQUxMQkFDS19USFJFQURfTk9ORSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVygiJXMoKSBkYXRhIGNhbGxiYWNrIGFscmVhZHkgcnVubmluZyEiLCBfX2Z1bmNfXyk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBBdWRpb1N0cmVhbTo6bWF5YmVDYWxsRXJyb3JDYWxsYmFjayhhYXVkaW9fcmVzdWx0X3QgcmVzdWx0KSB7CisgICAgQUF1ZGlvU3RyZWFtX2Vycm9yQ2FsbGJhY2sgZXJyb3JDYWxsYmFjayA9IGdldEVycm9yQ2FsbGJhY2tQcm9jKCk7CisgICAgaWYgKGVycm9yQ2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICAvLyBTdG9yZSB0aHJlYWQgSUQgb2YgY2FsbGVyIHRvIGRldGVjdCBzdG9wKCkgYW5kIGNsb3NlKCkgY2FsbHMgZnJvbSBjYWxsYmFjay4KKyAgICAgICAgcGlkX3QgZXhwZWN0ZWQgPSBDQUxMQkFDS19USFJFQURfTk9ORTsKKyAgICAgICAgaWYgKG1FcnJvckNhbGxiYWNrVGhyZWFkLmNvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKGV4cGVjdGVkLCBnZXR0aWQoKSkpIHsKKyAgICAgICAgICAgICgqZXJyb3JDYWxsYmFjaykoCisgICAgICAgICAgICAgICAgICAgIChBQXVkaW9TdHJlYW0gKikgdGhpcywKKyAgICAgICAgICAgICAgICAgICAgZ2V0RXJyb3JDYWxsYmFja1VzZXJEYXRhKCksCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisgICAgICAgICAgICBtRXJyb3JDYWxsYmFja1RocmVhZC5zdG9yZShDQUxMQkFDS19USFJFQURfTk9ORSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVygiJXMoKSBlcnJvciBjYWxsYmFjayBhbHJlYWR5IHJ1bm5pbmchIiwgX19mdW5jX18pOworICAgICAgICB9CisgICAgfQorfQorCisvLyBJcyB0aGlzIHJ1bm5pbmcgb24gdGhlIHNhbWUgdGhyZWFkIGFzIGEgY2FsbGJhY2s/CisvLyBOb3RlOiBUaGlzIGNhbm5vdCBiZSBpbXBsZW1lbnRlZCB1c2luZyBhIHRocmVhZF9sb2NhbCBiZWNhdXNlIHRoYXQgd291bGQKKy8vIHJlcXVpcmUgdXNpbmcgYSB0aHJlYWRfbG9jYWwgdmFyaWFibGUgdGhhdCBpcyBzaGFyZWQgYmV0d2VlbiBzdHJlYW1zLgorLy8gU28gYSB0aHJlYWRfbG9jYWwgdmFyaWFibGUgd291bGQgcHJldmVudCBzdG9wcGluZyBvciBjbG9zaW5nIHN0cmVhbSBBIGZyb20KKy8vIGEgY2FsbGJhY2sgb24gc3RyZWFtIEIsIHdoaWNoIGlzIGN1cnJlbnRseSBsZWdhbCBhbmQgbm90IHNvIHRlcnJpYmxlLgorYm9vbCBBdWRpb1N0cmVhbTo6Y29sbGlkZXNXaXRoQ2FsbGJhY2soKSBjb25zdCB7CisgICAgcGlkX3QgdGhpc1RocmVhZCA9IGdldHRpZCgpOworICAgIC8vIENvbXBhcmUgdGhlIGN1cnJlbnQgdGhyZWFkIElEIHdpdGggdGhlIHRocmVhZCBJRCBvZiB0aGUgY2FsbGJhY2sKKyAgICAvLyB0aHJlYWRzIHRvIHNlZSBpdCB0aGV5IG1hdGNoLiBJZiBzbyB0aGVuIHRoaXMgY29kZSBpcyBiZWluZworICAgIC8vIGNhbGxlZCBmcm9tIG9uZSBvZiB0aGUgc3RyZWFtIGNhbGxiYWNrIGZ1bmN0aW9ucy4KKyAgICByZXR1cm4gKChtRXJyb3JDYWxsYmFja1RocmVhZC5sb2FkKCkgPT0gdGhpc1RocmVhZCkKKyAgICAgICAgICAgIHx8IChtRGF0YUNhbGxiYWNrVGhyZWFkLmxvYWQoKSA9PSB0aGlzVGhyZWFkKSk7Cit9CisKICNpZiBBQVVESU9fVVNFX1ZPTFVNRV9TSEFQRVIKIGFuZHJvaWQ6Om1lZGlhOjpWb2x1bWVTaGFwZXI6OlN0YXR1cyBBdWRpb1N0cmVhbTo6YXBwbHlWb2x1bWVTaGFwZXIoCiAgICAgICAgIGNvbnN0IGFuZHJvaWQ6Om1lZGlhOjpWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24mIGNvbmZpZ3VyYXRpb24gX191bnVzZWQsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW0uaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5oCmluZGV4IDM0MjAyZDIuLmI1ZDdmZDUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5oCkBAIC0zOSw2ICszOSw4IEBACiAKIGNsYXNzIEF1ZGlvU3RyZWFtQnVpbGRlcjsKIAorY29uc3RleHByIHBpZF90ICAgICAgICBDQUxMQkFDS19USFJFQURfTk9ORSA9IDA7CisKIC8qKgogICogQUF1ZGlvIGF1ZGlvIHN0cmVhbS4KICAqLwpAQCAtNDksOCArNTEsMjIgQEAKIAogICAgIHZpcnR1YWwgfkF1ZGlvU3RyZWFtKCk7CiAKKyAgICAvKioKKyAgICAgKiBMb2NrIGEgbXV0ZXggYW5kIG1ha2Ugc3VyZSB3ZSBhcmUgbm90IGNhbGxpbmcgZnJvbSBhIGNhbGxiYWNrIGZ1bmN0aW9uLgorICAgICAqIEByZXR1cm4gcmVzdWx0IG9mIHJlcXVlc3RTdGFydCgpOworICAgICAqLworICAgIGFhdWRpb19yZXN1bHRfdCBzYWZlU3RhcnQoKTsKKworICAgIGFhdWRpb19yZXN1bHRfdCBzYWZlUGF1c2UoKTsKKworICAgIGFhdWRpb19yZXN1bHRfdCBzYWZlRmx1c2goKTsKKworICAgIGFhdWRpb19yZXN1bHRfdCBzYWZlU3RvcCgpOworCisgICAgYWF1ZGlvX3Jlc3VsdF90IHNhZmVDbG9zZSgpOwogCiAgICAgLy8gPT09PT09PT09PT0gQmVnaW4gQUJTVFJBQ1QgbWV0aG9kcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3Byb3RlY3RlZDoKIAogICAgIC8qIEFzeW5jaHJvbm91cyByZXF1ZXN0cy4KICAgICAgKiBVc2Ugd2FpdEZvclN0YXRlQ2hhbmdlKCkgdG8gd2FpdCBmb3IgY29tcGxldGlvbi4KQEAgLTcwLDYgKzg2LDcgQEAKIAogICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHJlcXVlc3RTdG9wKCkgPSAwOwogCitwdWJsaWM6CiAgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgZ2V0VGltZXN0YW1wKGNsb2NraWRfdCBjbG9ja0lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqZnJhbWVQb3NpdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVOYW5vc2Vjb25kcykgPSAwOwpAQCAtODEsNyArOTgsNiBAQAogICAgICAqLwogICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHVwZGF0ZVN0YXRlTWFjaGluZSgpID0gMDsKIAotCiAgICAgLy8gPT09PT09PT09PT0gRW5kIEFCU1RSQUNUIG1ldGhvZHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKICAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCB3YWl0Rm9yU3RhdGVDaGFuZ2UoYWF1ZGlvX3N0cmVhbV9zdGF0ZV90IGN1cnJlbnRTdGF0ZSwKQEAgLTIwOSwxMyArMjI1LDE5IEBACiAgICAgQUF1ZGlvU3RyZWFtX2RhdGFDYWxsYmFjayBnZXREYXRhQ2FsbGJhY2tQcm9jKCkgY29uc3QgewogICAgICAgICByZXR1cm4gbURhdGFDYWxsYmFja1Byb2M7CiAgICAgfQorCiAgICAgQUF1ZGlvU3RyZWFtX2Vycm9yQ2FsbGJhY2sgZ2V0RXJyb3JDYWxsYmFja1Byb2MoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtRXJyb3JDYWxsYmFja1Byb2M7CiAgICAgfQogCisgICAgYWF1ZGlvX2RhdGFfY2FsbGJhY2tfcmVzdWx0X3QgbWF5YmVDYWxsRGF0YUNhbGxiYWNrKHZvaWQgKmF1ZGlvRGF0YSwgaW50MzJfdCBudW1GcmFtZXMpOworCisgICAgdm9pZCBtYXliZUNhbGxFcnJvckNhbGxiYWNrKGFhdWRpb19yZXN1bHRfdCByZXN1bHQpOworCiAgICAgdm9pZCAqZ2V0RGF0YUNhbGxiYWNrVXNlckRhdGEoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtRGF0YUNhbGxiYWNrVXNlckRhdGE7CiAgICAgfQorCiAgICAgdm9pZCAqZ2V0RXJyb3JDYWxsYmFja1VzZXJEYXRhKCkgY29uc3QgewogICAgICAgICByZXR1cm4gbUVycm9yQ2FsbGJhY2tVc2VyRGF0YTsKICAgICB9CkBAIC0yMjQsMTAgKzI0NiwyNSBAQAogICAgICAgICByZXR1cm4gbUZyYW1lc1BlckRhdGFDYWxsYmFjazsKICAgICB9CiAKLSAgICBib29sIGlzRGF0YUNhbGxiYWNrQWN0aXZlKCkgewotICAgICAgICByZXR1cm4gKG1EYXRhQ2FsbGJhY2tQcm9jICE9IG51bGxwdHIpICYmIGlzQWN0aXZlKCk7CisgICAgLyoqCisgICAgICogQHJldHVybiB0cnVlIGlmIGRhdGEgY2FsbGJhY2sgaGFzIGJlZW4gc3BlY2lmaWVkCisgICAgICovCisgICAgYm9vbCBpc0RhdGFDYWxsYmFja1NldCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1EYXRhQ2FsbGJhY2tQcm9jICE9IG51bGxwdHI7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQHJldHVybiB0cnVlIGlmIGRhdGEgY2FsbGJhY2sgaGFzIGJlZW4gc3BlY2lmaWVkIGFuZCBzdHJlYW0gaXMgcnVubmluZworICAgICAqLworICAgIGJvb2wgaXNEYXRhQ2FsbGJhY2tBY3RpdmUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBpc0RhdGFDYWxsYmFja1NldCgpICYmIGlzQWN0aXZlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0cnVlIGlmIGNhbGxlZCBmcm9tIHRoZSBzYW1lIHRocmVhZCBhcyB0aGUgY2FsbGJhY2sKKyAgICAgKi8KKyAgICBib29sIGNvbGxpZGVzV2l0aENhbGxiYWNrKCkgY29uc3Q7CisKICAgICAvLyA9PT09PT09PT09PT09PSBJL08gPT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgLy8gQSBTdHJlYW0gd2lsbCBvbmx5IGltcGxlbWVudCByZWFkKCkgb3Igd3JpdGUoKSBkZXBlbmRpbmcgb24gaXRzIGRpcmVjdGlvbi4KICAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCB3cml0ZShjb25zdCB2b2lkICpidWZmZXIgX191bnVzZWQsCkBAIC0yNDgsNyArMjg1LDcgQEAKICAgICAgICAgZG9TZXRWb2x1bWUoKTsgLy8gYXBwbHkgdGhpcyBjaGFuZ2UKICAgICB9CiAKLSAgICBmbG9hdCBnZXREdWNrQW5kTXV0ZVZvbHVtZSgpIHsKKyAgICBmbG9hdCBnZXREdWNrQW5kTXV0ZVZvbHVtZSgpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1EdWNrQW5kTXV0ZVZvbHVtZTsKICAgICB9CiAKQEAgLTMzMSwxNyArMzY4LDE3IEBACiAKICAgICAgICAgYW5kcm9pZDo6c3RhdHVzX3QgcGxheWVyU3RhcnQoKSBvdmVycmlkZSB7CiAgICAgICAgICAgICAvLyBtUGFyZW50IHNob3VsZCBOT1QgYmUgbnVsbC4gU28gZ28gYWhlYWQgYW5kIGNyYXNoIGlmIGl0IGlzLgotICAgICAgICAgICAgbVJlc3VsdCA9IG1QYXJlbnQtPnJlcXVlc3RTdGFydCgpOworICAgICAgICAgICAgbVJlc3VsdCA9IG1QYXJlbnQtPnNhZmVTdGFydCgpOwogICAgICAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkU3RhdHVzKG1SZXN1bHQpOwogICAgICAgICB9CiAKICAgICAgICAgYW5kcm9pZDo6c3RhdHVzX3QgcGxheWVyUGF1c2UoKSBvdmVycmlkZSB7Ci0gICAgICAgICAgICBtUmVzdWx0ID0gbVBhcmVudC0+cmVxdWVzdFBhdXNlKCk7CisgICAgICAgICAgICBtUmVzdWx0ID0gbVBhcmVudC0+c2FmZVBhdXNlKCk7CiAgICAgICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWRTdGF0dXMobVJlc3VsdCk7CiAgICAgICAgIH0KIAogICAgICAgICBhbmRyb2lkOjpzdGF0dXNfdCBwbGF5ZXJTdG9wKCkgb3ZlcnJpZGUgewotICAgICAgICAgICAgbVJlc3VsdCA9IG1QYXJlbnQtPnJlcXVlc3RTdG9wKCk7CisgICAgICAgICAgICBtUmVzdWx0ID0gbVBhcmVudC0+c2FmZVN0b3AoKTsKICAgICAgICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZFN0YXR1cyhtUmVzdWx0KTsKICAgICAgICAgfQogCkBAIC00MDUsOCArNDQyLDYgQEAKICAgICAgICAgbURldmljZUlkID0gZGV2aWNlSWQ7CiAgICAgfQogCi0gICAgc3RkOjptdXRleCAgICAgICAgICAgbVN0cmVhbU11dGV4OwotCiAgICAgc3RkOjphdG9taWM8Ym9vbD4gICAgbUNhbGxiYWNrRW5hYmxlZHtmYWxzZX07CiAKICAgICBmbG9hdCAgICAgICAgICAgICAgICBtRHVja0FuZE11dGVWb2x1bWUgPSAxLjBmOwpAQCAtNDIyLDM5ICs0NTcsNDIgQEAKICAgICB9CiAKIHByaXZhdGU6CisKKyAgICBzdGQ6Om11dGV4ICAgICAgICAgICAgICAgICBtU3RyZWFtTG9jazsKKwogICAgIGNvbnN0IGFuZHJvaWQ6OnNwPE15UGxheWVyQmFzZT4gICBtUGxheWVyQmFzZTsKIAogICAgIC8vIFRoZXNlIGRvIG5vdCBjaGFuZ2UgYWZ0ZXIgb3BlbigpLgotICAgIGludDMyX3QgICAgICAgICAgICAgICAgbVNhbXBsZXNQZXJGcmFtZSA9IEFBVURJT19VTlNQRUNJRklFRDsKLSAgICBpbnQzMl90ICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlID0gQUFVRElPX1VOU1BFQ0lGSUVEOwotICAgIGludDMyX3QgICAgICAgICAgICAgICAgbURldmljZUlkID0gQUFVRElPX1VOU1BFQ0lGSUVEOwotICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCAgbVNoYXJpbmdNb2RlID0gQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQ7Ci0gICAgYm9vbCAgICAgICAgICAgICAgICAgICBtU2hhcmluZ01vZGVNYXRjaFJlcXVpcmVkID0gZmFsc2U7IC8vIG11c3QgbWF0Y2ggc2hhcmluZyBtb2RlIHJlcXVlc3RlZAotICAgIGFhdWRpb19mb3JtYXRfdCAgICAgICAgbUZvcm1hdCA9IEFBVURJT19GT1JNQVRfVU5TUEVDSUZJRUQ7Ci0gICAgYWF1ZGlvX3N0cmVhbV9zdGF0ZV90ICBtU3RhdGUgPSBBQVVESU9fU1RSRUFNX1NUQVRFX1VOSU5JVElBTElaRUQ7Ci0KLSAgICBhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90IG1QZXJmb3JtYW5jZU1vZGUgPSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FOworICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICBtU2FtcGxlc1BlckZyYW1lID0gQUFVRElPX1VOU1BFQ0lGSUVEOworICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSA9IEFBVURJT19VTlNQRUNJRklFRDsKKyAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgbURldmljZUlkID0gQUFVRElPX1VOU1BFQ0lGSUVEOworICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCAgICAgICBtU2hhcmluZ01vZGUgPSBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRDsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbVNoYXJpbmdNb2RlTWF0Y2hSZXF1aXJlZCA9IGZhbHNlOyAvLyBtdXN0IG1hdGNoIHNoYXJpbmcgbW9kZSByZXF1ZXN0ZWQKKyAgICBhYXVkaW9fZm9ybWF0X3QgICAgICAgICAgICAgbUZvcm1hdCA9IEFBVURJT19GT1JNQVRfVU5TUEVDSUZJRUQ7CisgICAgYWF1ZGlvX3N0cmVhbV9zdGF0ZV90ICAgICAgIG1TdGF0ZSA9IEFBVURJT19TVFJFQU1fU1RBVEVfVU5JTklUSUFMSVpFRDsKKyAgICBhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90ICAgbVBlcmZvcm1hbmNlTW9kZSA9IEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkU7CiAKICAgICAvLyBjYWxsYmFjayAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKICAgICBBQXVkaW9TdHJlYW1fZGF0YUNhbGxiYWNrICAgbURhdGFDYWxsYmFja1Byb2MgPSBudWxscHRyOyAgLy8gZXh0ZXJuYWwgY2FsbGJhY2sgZnVuY3Rpb25zCiAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgKm1EYXRhQ2FsbGJhY2tVc2VyRGF0YSA9IG51bGxwdHI7CiAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgIG1GcmFtZXNQZXJEYXRhQ2FsbGJhY2sgPSBBQVVESU9fVU5TUEVDSUZJRUQ7IC8vIGZyYW1lcworICAgIHN0ZDo6YXRvbWljPHBpZF90PiAgICAgICAgICBtRGF0YUNhbGxiYWNrVGhyZWFke0NBTExCQUNLX1RIUkVBRF9OT05FfTsKIAogICAgIEFBdWRpb1N0cmVhbV9lcnJvckNhbGxiYWNrICBtRXJyb3JDYWxsYmFja1Byb2MgPSBudWxscHRyOwogICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICptRXJyb3JDYWxsYmFja1VzZXJEYXRhID0gbnVsbHB0cjsKKyAgICBzdGQ6OmF0b21pYzxwaWRfdD4gICAgICAgICAgbUVycm9yQ2FsbGJhY2tUaHJlYWR7Q0FMTEJBQ0tfVEhSRUFEX05PTkV9OwogCiAgICAgLy8gYmFja2dyb3VuZCB0aHJlYWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgbUhhc1RocmVhZCA9IGZhbHNlOwotICAgIHB0aHJlYWRfdCAgICAgICAgICAgICAgbVRocmVhZDsgLy8gaW5pdGlhbGl6ZWQgaW4gY29uc3RydWN0b3IKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbUhhc1RocmVhZCA9IGZhbHNlOworICAgIHB0aHJlYWRfdCAgICAgICAgICAgICAgICAgICBtVGhyZWFkOyAvLyBpbml0aWFsaXplZCBpbiBjb25zdHJ1Y3RvcgogCiAgICAgLy8gVGhlc2UgYXJlIHNldCBieSB0aGUgYXBwbGljYXRpb24gdGhyZWFkIGFuZCB0aGVuIHJlYWQgYnkgdGhlIGF1ZGlvIHB0aHJlYWQuCi0gICAgc3RkOjphdG9taWM8aW50NjRfdD4gICBtUGVyaW9kTmFub3NlY29uZHM7IC8vIGZvciB0dW5pbmcgU0NIRURfRklGTyB0aHJlYWRzCisgICAgc3RkOjphdG9taWM8aW50NjRfdD4gICAgICAgIG1QZXJpb2ROYW5vc2Vjb25kczsgLy8gZm9yIHR1bmluZyBTQ0hFRF9GSUZPIHRocmVhZHMKICAgICAvLyBUT0RPIG1ha2UgYXRvbWljPwotICAgIGFhdWRpb19hdWRpb190aHJlYWRfcHJvY190IG1UaHJlYWRQcm9jID0gbnVsbHB0cjsKLSAgICB2b2lkKiAgICAgICAgICAgICAgICAgIG1UaHJlYWRBcmcgPSBudWxscHRyOwotICAgIGFhdWRpb19yZXN1bHRfdCAgICAgICAgbVRocmVhZFJlZ2lzdHJhdGlvblJlc3VsdCA9IEFBVURJT19PSzsKLQorICAgIGFhdWRpb19hdWRpb190aHJlYWRfcHJvY190ICBtVGhyZWFkUHJvYyA9IG51bGxwdHI7CisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgKm1UaHJlYWRBcmcgPSBudWxscHRyOworICAgIGFhdWRpb19yZXN1bHRfdCAgICAgICAgICAgICBtVGhyZWFkUmVnaXN0cmF0aW9uUmVzdWx0ID0gQUFVRElPX09LOwogCiB9OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5jcHAKaW5kZXggZWUyNTA0ZC4uYzVkZmI3YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1MZWdhY3kuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtTGVnYWN5LmNwcApAQCAtNDgsMTkgKzQ4LDE0IEBACiAgICAgcmV0dXJuIEF1ZGlvU3RyZWFtTGVnYWN5X2NhbGxiYWNrOwogfQogCi1pbnQzMl90IEF1ZGlvU3RyZWFtTGVnYWN5OjpjYWxsRGF0YUNhbGxiYWNrRnJhbWVzKHVpbnQ4X3QgKmJ1ZmZlciwgaW50MzJfdCBudW1GcmFtZXMpIHsKK2FhdWRpb19kYXRhX2NhbGxiYWNrX3Jlc3VsdF90IEF1ZGlvU3RyZWFtTGVnYWN5OjpjYWxsRGF0YUNhbGxiYWNrRnJhbWVzKHVpbnQ4X3QgKmJ1ZmZlciwgaW50MzJfdCBudW1GcmFtZXMpIHsKICAgICBpZiAoZ2V0RGlyZWN0aW9uKCkgPT0gQUFVRElPX0RJUkVDVElPTl9JTlBVVCkgewogICAgICAgICAvLyBJbmNyZW1lbnQgYmVmb3JlIGJlY2F1c2Ugd2UgYWxyZWFkeSBnb3QgdGhlIGRhdGEgZnJvbSB0aGUgZGV2aWNlLgogICAgICAgICBpbmNyZW1lbnRGcmFtZXNSZWFkKG51bUZyYW1lcyk7CiAgICAgfQogCiAgICAgLy8gQ2FsbCB1c2luZyB0aGUgQUF1ZGlvIGNhbGxiYWNrIGludGVyZmFjZS4KLSAgICBBQXVkaW9TdHJlYW1fZGF0YUNhbGxiYWNrIGFwcENhbGxiYWNrID0gZ2V0RGF0YUNhbGxiYWNrUHJvYygpOwotICAgIGFhdWRpb19kYXRhX2NhbGxiYWNrX3Jlc3VsdF90IGNhbGxiYWNrUmVzdWx0ID0gKCphcHBDYWxsYmFjaykoCi0gICAgICAgICAgICAoQUF1ZGlvU3RyZWFtICopIHRoaXMsCi0gICAgICAgICAgICBnZXREYXRhQ2FsbGJhY2tVc2VyRGF0YSgpLAotICAgICAgICAgICAgYnVmZmVyLAotICAgICAgICAgICAgbnVtRnJhbWVzKTsKKyAgICBhYXVkaW9fZGF0YV9jYWxsYmFja19yZXN1bHRfdCBjYWxsYmFja1Jlc3VsdCA9IG1heWJlQ2FsbERhdGFDYWxsYmFjayhidWZmZXIsIG51bUZyYW1lcyk7CiAKICAgICBpZiAoY2FsbGJhY2tSZXN1bHQgPT0gQUFVRElPX0NBTExCQUNLX1JFU1VMVF9DT05USU5VRQogICAgICAgICAgICAgJiYgZ2V0RGlyZWN0aW9uKCkgPT0gQUFVRElPX0RJUkVDVElPTl9PVVRQVVQpIHsKQEAgLTczLDIyICs2OCwyNiBAQAogLy8gSW1wbGVtZW50IEZpeGVkQmxvY2tQcm9jZXNzb3IKIGludDMyX3QgQXVkaW9TdHJlYW1MZWdhY3k6Om9uUHJvY2Vzc0ZpeGVkQmxvY2sodWludDhfdCAqYnVmZmVyLCBpbnQzMl90IG51bUJ5dGVzKSB7CiAgICAgaW50MzJfdCBudW1GcmFtZXMgPSBudW1CeXRlcyAvIGdldEJ5dGVzUGVyRnJhbWUoKTsKLSAgICByZXR1cm4gY2FsbERhdGFDYWxsYmFja0ZyYW1lcyhidWZmZXIsIG51bUZyYW1lcyk7CisgICAgcmV0dXJuIChpbnQzMl90KSBjYWxsRGF0YUNhbGxiYWNrRnJhbWVzKGJ1ZmZlciwgbnVtRnJhbWVzKTsKIH0KIAogdm9pZCBBdWRpb1N0cmVhbUxlZ2FjeTo6cHJvY2Vzc0NhbGxiYWNrQ29tbW9uKGFhdWRpb19jYWxsYmFja19vcGVyYXRpb25fdCBvcGNvZGUsIHZvaWQgKmluZm8pIHsKICAgICBhYXVkaW9fZGF0YV9jYWxsYmFja19yZXN1bHRfdCBjYWxsYmFja1Jlc3VsdDsKKyAgICAvLyBUaGlzIGlsbGVnYWwgc2l6ZSBjYW4gYmUgdXNlZCB0byBBdWRpb0ZsaW5nZXIgdG8gc3RvcCBjYWxsaW5nIHVzLgorICAgIC8vIFRoaXMgdGFrZXMgYWR2YW50YWdlIG9mIEF1ZGlvRmxpbmdlciBraWxsaW5nIHRoZSBzdHJlYW0uCisgICAgLy8gVE9ETyBuZWVkIEFQSSBjaGFuZ2UgaW4gQXVkaW9SZWNvcmQgYW5kIEF1ZGlvVHJhY2sKKyAgICBjb25zdCBzaXplX3QgU0laRV9TVE9QX0NBTExCQUNLUyA9IFNJWkVfTUFYOwogCiAgICAgc3dpdGNoIChvcGNvZGUpIHsKICAgICAgICAgY2FzZSBBQVVESU9fQ0FMTEJBQ0tfT1BFUkFUSU9OX1BST0NFU1NfREFUQTogewotICAgICAgICAgICAgY2hlY2tGb3JEaXNjb25uZWN0UmVxdWVzdCgpOworICAgICAgICAgICAgKHZvaWQpIGNoZWNrRm9yRGlzY29ubmVjdFJlcXVlc3QodHJ1ZSk7CiAKICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIGNvZGUgYXNzdW1lcyBhbiBBdWRpb1RyYWNrOjpCdWZmZXIgaXMgdGhlIHNhbWUgYXMKICAgICAgICAgICAgIC8vIEF1ZGlvUmVjb3JkOjpCdWZmZXIKICAgICAgICAgICAgIC8vIFRPRE8gZGVmaW5lIG91ciBvd24gQXVkaW9CdWZmZXIgYW5kIHBhc3MgaXQgZnJvbSB0aGUgc3ViY2xhc3Nlcy4KICAgICAgICAgICAgIEF1ZGlvVHJhY2s6OkJ1ZmZlciAqYXVkaW9CdWZmZXIgPSBzdGF0aWNfY2FzdDxBdWRpb1RyYWNrOjpCdWZmZXIgKj4oaW5mbyk7CiAgICAgICAgICAgICBpZiAoZ2V0U3RhdGUoKSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX0RJU0NPTk5FQ1RFRCB8fCAhbUNhbGxiYWNrRW5hYmxlZC5sb2FkKCkpIHsKLSAgICAgICAgICAgICAgICBhdWRpb0J1ZmZlci0+c2l6ZSA9IDA7IC8vIHNpbGVuY2UgdGhlIGJ1ZmZlcgorICAgICAgICAgICAgICAgIGF1ZGlvQnVmZmVyLT5zaXplID0gU0laRV9TVE9QX0NBTExCQUNLUzsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKGF1ZGlvQnVmZmVyLT5mcmFtZUNvdW50ID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwpAQCAtMTA2LDggKzEwNSwxMSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2tSZXN1bHQgPT0gQUFVRElPX0NBTExCQUNLX1JFU1VMVF9DT05USU5VRSkgewogICAgICAgICAgICAgICAgICAgICBhdWRpb0J1ZmZlci0+c2l6ZSA9IGF1ZGlvQnVmZmVyLT5mcmFtZUNvdW50ICogZ2V0Qnl0ZXNQZXJGcmFtZSgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF1ZGlvQnVmZmVyLT5zaXplID0gMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyBTVE9QIG9yIGludmFsaWQgcmVzdWx0CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcygpIHN0b3Agc3RyZWFtIGJ5IGZha2luZyBhbiBlcnJvciIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9CdWZmZXItPnNpemUgPSBTSVpFX1NUT1BfQ0FMTEJBQ0tTOworICAgICAgICAgICAgICAgICAgICAvLyBEaXNhYmxlIHRoZSBjYWxsYmFjayBqdXN0IGluIGNhc2UgQXVkaW9GbGluZ2VyIGtlZXBzIHRyeWluZyB0byBjYWxsIHVzLgorICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tFbmFibGVkLnN0b3JlKGZhbHNlKTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpZiAodXBkYXRlU3RhdGVNYWNoaW5lKCkgIT0gQUFVRElPX09LKSB7CkBAIC0xMzAsMjYgKzEzMiwyMyBAQAogICAgIH0KIH0KIAotCi0KLXZvaWQgQXVkaW9TdHJlYW1MZWdhY3k6OmNoZWNrRm9yRGlzY29ubmVjdFJlcXVlc3QoKSB7CithYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1MZWdhY3k6OmNoZWNrRm9yRGlzY29ubmVjdFJlcXVlc3QoYm9vbCBlcnJvckNhbGxiYWNrRW5hYmxlZCkgewogICAgIGlmIChtUmVxdWVzdERpc2Nvbm5lY3QuaXNSZXF1ZXN0ZWQoKSkgewogICAgICAgICBBTE9HRCgiY2hlY2tGb3JEaXNjb25uZWN0UmVxdWVzdCgpIG1SZXF1ZXN0RGlzY29ubmVjdCBhY2tub3dsZWRnZWQiKTsKLSAgICAgICAgZm9yY2VEaXNjb25uZWN0KCk7CisgICAgICAgIGZvcmNlRGlzY29ubmVjdChlcnJvckNhbGxiYWNrRW5hYmxlZCk7CiAgICAgICAgIG1SZXF1ZXN0RGlzY29ubmVjdC5hY2tub3dsZWRnZSgpOwogICAgICAgICBtQ2FsbGJhY2tFbmFibGVkLnN0b3JlKGZhbHNlKTsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9ESVNDT05ORUNURUQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEFBVURJT19PSzsKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9TdHJlYW1MZWdhY3k6OmZvcmNlRGlzY29ubmVjdCgpIHsKK3ZvaWQgQXVkaW9TdHJlYW1MZWdhY3k6OmZvcmNlRGlzY29ubmVjdChib29sIGVycm9yQ2FsbGJhY2tFbmFibGVkKSB7CiAgICAgaWYgKGdldFN0YXRlKCkgIT0gQUFVRElPX1NUUkVBTV9TVEFURV9ESVNDT05ORUNURUQpIHsKICAgICAgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9ESVNDT05ORUNURUQpOwotICAgICAgICBpZiAoZ2V0RXJyb3JDYWxsYmFja1Byb2MoKSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAoKmdldEVycm9yQ2FsbGJhY2tQcm9jKCkpKAotICAgICAgICAgICAgICAgICAgICAoQUF1ZGlvU3RyZWFtICopIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgIGdldEVycm9yQ2FsbGJhY2tVc2VyRGF0YSgpLAotICAgICAgICAgICAgICAgICAgICBBQVVESU9fRVJST1JfRElTQ09OTkVDVEVECi0gICAgICAgICAgICApOworICAgICAgICBpZiAoZXJyb3JDYWxsYmFja0VuYWJsZWQpIHsKKyAgICAgICAgICAgIG1heWJlQ2FsbEVycm9yQ2FsbGJhY2soQUFVRElPX0VSUk9SX0RJU0NPTk5FQ1RFRCk7CiAgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1MZWdhY3kuaAppbmRleCA3ZTI4NTc5Li42YTUwNmIzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtTGVnYWN5LmgKQEAgLTExMiw5ICsxMTIsMTQgQEAKIAogICAgIHZvaWQgb25BdWRpb0RldmljZVVwZGF0ZShhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKTsKIAotICAgIHZvaWQgY2hlY2tGb3JEaXNjb25uZWN0UmVxdWVzdCgpOworICAgIC8qCisgICAgICogQ2hlY2sgdG8gc2VlIHdoZXRoZXIgYSBjYWxsYmFjayB0aHJlYWQgaGFzIHJlcXVlc3RlZCBhIGRpc2Nvbm5lY3RlZC4KKyAgICAgKiBAcGFyYW0gZXJyb3JDYWxsYmFja0VuYWJsZWQgc2V0IHRydWUgdG8gY2FsbCBlcnJvckNhbGxiYWNrIG9uIGRpc2Nvbm5lY3QKKyAgICAgKiBAcmV0dXJuIEFBVURJT19PSyBvciBBQVVESU9fRVJST1JfRElTQ09OTkVDVEVECisgICAgICovCisgICAgYWF1ZGlvX3Jlc3VsdF90IGNoZWNrRm9yRGlzY29ubmVjdFJlcXVlc3QoYm9vbCBlcnJvckNhbGxiYWNrRW5hYmxlZCk7CiAKLSAgICB2b2lkIGZvcmNlRGlzY29ubmVjdCgpOworICAgIHZvaWQgZm9yY2VEaXNjb25uZWN0KGJvb2wgZXJyb3JDYWxsYmFja0VuYWJsZWQgPSB0cnVlKTsKIAogICAgIHZvaWQgb25TdGFydCgpIHsgbUNhbGxiYWNrRW5hYmxlZC5zdG9yZSh0cnVlKTsgfQogICAgIHZvaWQgb25TdG9wKCkgeyBtQ2FsbGJhY2tFbmFibGVkLnN0b3JlKGZhbHNlKTsgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1SZWNvcmQuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1SZWNvcmQuY3BwCmluZGV4IDZkOThlZDMuLjU1ZWVkOTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtUmVjb3JkLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVJlY29yZC5jcHAKQEAgLTk4LDEyICs5OCwxNSBAQAogCiAgICAgQUxPR0QoIm9wZW4oKSwgcmVxdWVzdCBub3RpZmljYXRpb25GcmFtZXMgPSAldSwgZnJhbWVDb3VudCA9ICV1IiwKICAgICAgICAgICBub3RpZmljYXRpb25GcmFtZXMsICh1aW50KWZyYW1lQ291bnQpOworCisgICAgLy8gRG9uJ3QgY2FsbCBtQXVkaW9SZWNvcmQtPnNldElucHV0RGV2aWNlKCkgYmVjYXVzZSBpdCB3aWxsIGJlIG92ZXJ3cml0dGVuIGJ5IHNldCgpIQorICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCA9IChnZXREZXZpY2VJZCgpID09IEFBVURJT19VTlNQRUNJRklFRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEFVRElPX1BPUlRfSEFORExFX05PTkUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGdldERldmljZUlkKCk7CisKICAgICBtQXVkaW9SZWNvcmQgPSBuZXcgQXVkaW9SZWNvcmQoCiAgICAgICAgICAgICBtT3BQYWNrYWdlTmFtZSAvLyBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSBUT0RPIGRvZXMgbm90IGNvbXBpbGUKICAgICAgICAgICAgICk7Ci0gICAgaWYgKGdldERldmljZUlkKCkgIT0gQUFVRElPX1VOU1BFQ0lGSUVEKSB7Ci0gICAgICAgIG1BdWRpb1JlY29yZC0+c2V0SW5wdXREZXZpY2UoZ2V0RGV2aWNlSWQoKSk7Ci0gICAgfQogICAgIG1BdWRpb1JlY29yZC0+c2V0KAogICAgICAgICAgICAgQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OLAogICAgICAgICAgICAgZ2V0U2FtcGxlUmF0ZSgpLApAQCAtMTE2LDEwICsxMTksMTEgQEAKICAgICAgICAgICAgIGZhbHNlIC8qdGhyZWFkQ2FuQ2FsbEphdmEqLywKICAgICAgICAgICAgIEFVRElPX1NFU1NJT05fQUxMT0NBVEUsCiAgICAgICAgICAgICBzdHJlYW1UcmFuc2ZlclR5cGUsCi0gICAgICAgICAgICBmbGFncwotICAgICAgICAgICAgLy8gICBpbnQgdWlkID0gLTEsCi0gICAgICAgICAgICAvLyAgIHBpZF90IHBpZCA9IC0xLAotICAgICAgICAgICAgLy8gICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzID0gbnVsbHB0cgorICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICBBVURJT19VSURfSU5WQUxJRCwgLy8gREVGQVVMVCB1aWQKKyAgICAgICAgICAgIC0xLCAgICAgICAgICAgICAgICAvLyBERUZBVUxUIHBpZAorICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgIC8vIERFRkFVTFQgYXVkaW9fYXR0cmlidXRlc190CisgICAgICAgICAgICBzZWxlY3RlZERldmljZUlkCiAgICAgICAgICAgICApOwogCiAgICAgLy8gRGlkIHdlIGdldCBhIHZhbGlkIHRyYWNrPwpAQCAtMjM4LDggKzI0Miw5IEBACiAgICAgbUF1ZGlvUmVjb3JkLT5zdG9wKCk7CiAgICAgbUZyYW1lc1JlYWQucmVzZXQzMigpOwogICAgIG1UaW1lc3RhbXBQb3NpdGlvbi5yZXNldDMyKCk7Ci0gICAgY2hlY2tGb3JEaXNjb25uZWN0UmVxdWVzdCgpOwotICAgIHJldHVybiBBQVVESU9fT0s7CisgICAgLy8gUGFzcyBmYWxzZSB0byBwcmV2ZW50IGVycm9yQ2FsbGJhY2sgZnJvbSBiZWluZyBjYWxsZWQgYWZ0ZXIgZGlzY29ubmVjdAorICAgIC8vIHdoZW4gYXBwIGhhcyBhbHJlYWR5IHJlcXVlc3RlZCBhIHN0b3AoKS4KKyAgICByZXR1cm4gY2hlY2tGb3JEaXNjb25uZWN0UmVxdWVzdChmYWxzZSk7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbVJlY29yZDo6dXBkYXRlU3RhdGVNYWNoaW5lKCkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtVHJhY2suY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1UcmFjay5jcHAKaW5kZXggYzJjZTlhMi4uNTExMzI3OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1UcmFjay5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1UcmFjay5jcHAKQEAgLTExNSwxMCArMTE1LDEzIEBACiAKICAgICBBTE9HRCgib3BlbigpLCByZXF1ZXN0IG5vdGlmaWNhdGlvbkZyYW1lcyA9ICVkLCBmcmFtZUNvdW50ID0gJXUiLAogICAgICAgICAgIG5vdGlmaWNhdGlvbkZyYW1lcywgKHVpbnQpZnJhbWVDb3VudCk7Ci0gICAgbUF1ZGlvVHJhY2sgPSBuZXcgQXVkaW9UcmFjaygpOyAvLyBUT0RPIHJldmlldwotICAgIGlmIChnZXREZXZpY2VJZCgpICE9IEFBVURJT19VTlNQRUNJRklFRCkgewotICAgICAgICBtQXVkaW9UcmFjay0+c2V0T3V0cHV0RGV2aWNlKGdldERldmljZUlkKCkpOwotICAgIH0KKworICAgIC8vIERvbid0IGNhbGwgbUF1ZGlvVHJhY2stPnNldERldmljZUlkKCkgYmVjYXVzZSBpdCB3aWxsIGJlIG92ZXJ3cml0dGVuIGJ5IHNldCgpIQorICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCA9IChnZXREZXZpY2VJZCgpID09IEFBVURJT19VTlNQRUNJRklFRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEFVRElPX1BPUlRfSEFORExFX05PTkUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGdldERldmljZUlkKCk7CisKKyAgICBtQXVkaW9UcmFjayA9IG5ldyBBdWRpb1RyYWNrKCk7CiAgICAgbUF1ZGlvVHJhY2stPnNldCgKICAgICAgICAgICAgIChhdWRpb19zdHJlYW1fdHlwZV90KSBBVURJT19TVFJFQU1fTVVTSUMsCiAgICAgICAgICAgICBnZXRTYW1wbGVSYXRlKCksCkBAIC0xMjksMTEgKzEzMiwyMCBAQAogICAgICAgICAgICAgY2FsbGJhY2ssCiAgICAgICAgICAgICBjYWxsYmFja0RhdGEsCiAgICAgICAgICAgICBub3RpZmljYXRpb25GcmFtZXMsCi0gICAgICAgICAgICAwIC8qc2hhcmVkQnVmZmVyKi8sCi0gICAgICAgICAgICBmYWxzZSAvKnRocmVhZENhbkNhbGxKYXZhKi8sCisgICAgICAgICAgICAwLCAgICAgICAvLyBERUZBVUxUIHNoYXJlZEJ1ZmZlciovLAorICAgICAgICAgICAgZmFsc2UsICAgLy8gREVGQVVMVCB0aHJlYWRDYW5DYWxsSmF2YQogICAgICAgICAgICAgQVVESU9fU0VTU0lPTl9BTExPQ0FURSwKLSAgICAgICAgICAgIHN0cmVhbVRyYW5zZmVyVHlwZQotICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIHN0cmVhbVRyYW5zZmVyVHlwZSwKKyAgICAgICAgICAgIE5VTEwsICAgIC8vIERFRkFVTFQgYXVkaW9fb2ZmbG9hZF9pbmZvX3QKKyAgICAgICAgICAgIEFVRElPX1VJRF9JTlZBTElELCAvLyBERUZBVUxUIHVpZAorICAgICAgICAgICAgLTEsICAgICAgLy8gREVGQVVMVCBwaWQKKyAgICAgICAgICAgIE5VTEwsICAgIC8vIERFRkFVTFQgYXVkaW9fYXR0cmlidXRlc190CisgICAgICAgICAgICAvLyBXQVJOSU5HIC0gSWYgZG9Ob3RSZWNvbm5lY3Qgc2V0IHRydWUgdGhlbiBhdWRpbyBzdG9wcyBhZnRlciBwbHVnZ2luZyBhbmQgdW5wbHVnZ2luZworICAgICAgICAgICAgLy8gaGVhZHBob25lcyBhIGZldyB0aW1lcy4KKyAgICAgICAgICAgIGZhbHNlLCAgIC8vIERFRkFVTFQgZG9Ob3RSZWNvbm5lY3QsCisgICAgICAgICAgICAxLjBmLCAgICAvLyBERUZBVUxUIG1heFJlcXVpcmVkU3BlZWQKKyAgICAgICAgICAgIHNlbGVjdGVkRGV2aWNlSWQKKyAgICApOwogCiAgICAgLy8gRGlkIHdlIGdldCBhIHZhbGlkIHRyYWNrPwogICAgIHN0YXR1c190IHN0YXR1cyA9IG1BdWRpb1RyYWNrLT5pbml0Q2hlY2soKTsKQEAgLTIyNCw4ICsyMzYsNiBAQAogfQogCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1UcmFjazo6cmVxdWVzdFN0YXJ0KCkgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1TdHJlYW1NdXRleCk7Ci0KICAgICBpZiAobUF1ZGlvVHJhY2suZ2V0KCkgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgicmVxdWVzdFN0YXJ0KCkgbm8gQXVkaW9UcmFjayIpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CkBAIC0yNDcsMTMgKzI1NywxMiBAQAogfQogCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1UcmFjazo6cmVxdWVzdFBhdXNlKCkgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1TdHJlYW1NdXRleCk7Ci0KICAgICBpZiAobUF1ZGlvVHJhY2suZ2V0KCkgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgicmVxdWVzdFBhdXNlKCkgbm8gQXVkaW9UcmFjayIpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfSBlbHNlIGlmIChnZXRTdGF0ZSgpICE9IEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRJTkcKICAgICAgICAgICAgICYmIGdldFN0YXRlKCkgIT0gQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVEVEKSB7CisgICAgICAgICAgICAvLyBUT0RPIFdoYXQgYWJvdXQgRElTQ09OTkVDVEVEPwogICAgICAgICBBTE9HRSgicmVxdWVzdFBhdXNlKCksIGNhbGxlZCB3aGVuIHN0YXRlIGlzICVzIiwKICAgICAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRTdHJlYW1TdGF0ZVRvVGV4dChnZXRTdGF0ZSgpKSk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKQEAgLTI2MSwxNyArMjcwLDE0IEBACiAgICAgb25TdG9wKCk7CiAgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9QQVVTSU5HKTsKICAgICBtQXVkaW9UcmFjay0+cGF1c2UoKTsKLSAgICBjaGVja0ZvckRpc2Nvbm5lY3RSZXF1ZXN0KCk7CiAgICAgc3RhdHVzX3QgZXJyID0gbUF1ZGlvVHJhY2stPmdldFBvc2l0aW9uKCZtUG9zaXRpb25XaGVuUGF1c2luZyk7CiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoZXJyKTsKICAgICB9Ci0gICAgcmV0dXJuIEFBVURJT19PSzsKKyAgICByZXR1cm4gY2hlY2tGb3JEaXNjb25uZWN0UmVxdWVzdChmYWxzZSk7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbVRyYWNrOjpyZXF1ZXN0Rmx1c2goKSB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVN0cmVhbU11dGV4KTsKLQogICAgIGlmIChtQXVkaW9UcmFjay5nZXQoKSA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJyZXF1ZXN0Rmx1c2goKSBubyBBdWRpb1RyYWNrIik7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKQEAgLTI4OCw4ICsyOTQsNiBAQAogfQogCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1UcmFjazo6cmVxdWVzdFN0b3AoKSB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVN0cmVhbU11dGV4KTsKLQogICAgIGlmIChtQXVkaW9UcmFjay5nZXQoKSA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJyZXF1ZXN0U3RvcCgpIG5vIEF1ZGlvVHJhY2siKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwpAQCAtMzAxLDggKzMwNSw3IEBACiAgICAgbUZyYW1lc1dyaXR0ZW4ucmVzZXQzMigpOwogICAgIG1UaW1lc3RhbXBQb3NpdGlvbi5yZXNldDMyKCk7CiAgICAgbUF1ZGlvVHJhY2stPnN0b3AoKTsKLSAgICBjaGVja0ZvckRpc2Nvbm5lY3RSZXF1ZXN0KCk7Ci0gICAgcmV0dXJuIEFBVURJT19PSzsKKyAgICByZXR1cm4gY2hlY2tGb3JEaXNjb25uZWN0UmVxdWVzdChmYWxzZSk7OwogfQogCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1UcmFjazo6dXBkYXRlU3RhdGVNYWNoaW5lKCkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5jcHAKaW5kZXggZmM1ODMwYS4uZjcwOWY0MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5jcHAKQEAgLTI5MSw3ICsyOTEsNyBAQAogICAgIGNvbnN0IGludDMyX3QgbWF4Qnl0ZXNQZXJGcmFtZSA9IG1heENoYW5uZWxzICogc2l6ZW9mKGZsb2F0KTsKICAgICAvLyBQcmV2ZW50IG92ZXJmbG93IGJ5IGxpbWl0aW5nIG11bHRpcGxpY2FuZHMuCiAgICAgaWYgKGJ5dGVzUGVyRnJhbWUgPiBtYXhCeXRlc1BlckZyYW1lIHx8IG51bUZyYW1lcyA+ICgweDNGRkZGRkZGIC8gbWF4Qnl0ZXNQZXJGcmFtZSkpIHsKLSAgICAgICAgQUxPR0UoInNpemUgb3ZlcmZsb3csIG51bUZyYW1lcyA9ICVkLCBmcmFtZVNpemUgPSAlemQiLCBudW1GcmFtZXMsIGJ5dGVzUGVyRnJhbWUpOworICAgICAgICBBTE9HRSgic2l6ZSBvdmVyZmxvdywgbnVtRnJhbWVzID0gJWQsIGZyYW1lU2l6ZSA9ICVkIiwgbnVtRnJhbWVzLCBieXRlc1BlckZyYW1lKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9PVVRfT0ZfUkFOR0U7CiAgICAgfQogICAgICpzaXplSW5CeXRlcyA9IG51bUZyYW1lcyAqIGJ5dGVzUGVyRnJhbWU7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF92YXJpb3VzLmNwcCBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X3ZhcmlvdXMuY3BwCmluZGV4IGRlMzg2ZGEuLmRjMTk5ODUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X3ZhcmlvdXMuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X3ZhcmlvdXMuY3BwCkBAIC0xNiwxNyArMTYsMTkgQEAKIAogLy8gVGVzdCB2YXJpb3VzIEFBdWRpbyBmZWF0dXJlcyBpbmNsdWRpbmcgQUF1ZGlvU3RyZWFtX3NldEJ1ZmZlclNpemVJbkZyYW1lcygpLgogCisjaW5jbHVkZSA8Y29uZGl0aW9uX3ZhcmlhYmxlPgorI2luY2x1ZGUgPG11dGV4PgogI2luY2x1ZGUgPHN0ZGlvLmg+Ci0vLyNpbmNsdWRlIDxzdGRsaWIuaD4KLS8vI2luY2x1ZGUgPG1hdGguaD4KIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9tYWNyb3MuaD4KICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CiAKICNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCiAKIC8vIENhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgZG9lcyBub3RoaW5nLgotYWF1ZGlvX2RhdGFfY2FsbGJhY2tfcmVzdWx0X3QgTXlEYXRhQ2FsbGJhY2tQcm9jKAorYWF1ZGlvX2RhdGFfY2FsbGJhY2tfcmVzdWx0X3QgTm9vcERhdGFDYWxsYmFja1Byb2MoCiAgICAgICAgIEFBdWRpb1N0cmVhbSAqc3RyZWFtLAogICAgICAgICB2b2lkICp1c2VyRGF0YSwKICAgICAgICAgdm9pZCAqYXVkaW9EYXRhLApAQCAtNTIsNyArNTQsNyBAQAogICAgIEFTU0VSVF9FUShBQVVESU9fT0ssIEFBdWRpb19jcmVhdGVTdHJlYW1CdWlsZGVyKCZhYXVkaW9CdWlsZGVyKSk7CiAKIC8vIFJlcXVlc3Qgc3RyZWFtIHByb3BlcnRpZXMuCi0gICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXREYXRhQ2FsbGJhY2soYWF1ZGlvQnVpbGRlciwgTXlEYXRhQ2FsbGJhY2tQcm9jLCBudWxscHRyKTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldERhdGFDYWxsYmFjayhhYXVkaW9CdWlsZGVyLCBOb29wRGF0YUNhbGxiYWNrUHJvYywgbnVsbHB0cik7CiAgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRQZXJmb3JtYW5jZU1vZGUoYWF1ZGlvQnVpbGRlciwgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1kpOwogCiAvLyBDcmVhdGUgYW4gQUF1ZGlvU3RyZWFtIHVzaW5nIHRoZSBCdWlsZGVyLgpAQCAtODUsNyArODcsNyBAQAogICAgIEFTU0VSVF9FUShBQVVESU9fT0ssIEFBdWRpb19jcmVhdGVTdHJlYW1CdWlsZGVyKCZhYXVkaW9CdWlsZGVyKSk7CiAKIC8vIFJlcXVlc3Qgc3RyZWFtIHByb3BlcnRpZXMuCi0gICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXREYXRhQ2FsbGJhY2soYWF1ZGlvQnVpbGRlciwgTXlEYXRhQ2FsbGJhY2tQcm9jLCBudWxscHRyKTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldERhdGFDYWxsYmFjayhhYXVkaW9CdWlsZGVyLCBOb29wRGF0YUNhbGxiYWNrUHJvYywgbnVsbHB0cik7CiAgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRQZXJmb3JtYW5jZU1vZGUoYWF1ZGlvQnVpbGRlciwgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1kpOwogCiAvLyBDcmVhdGUgYW4gQUF1ZGlvU3RyZWFtIHVzaW5nIHRoZSBCdWlsZGVyLgpAQCAtMTExLDYgKzExMyw3IEBACiAKIC8vaW50IG1haW4oKSB7IC8vIFRvIGZpeCBBbmRyb2lkIFN0dWRpbyBmb3JtYXR0aW5nIHdoZW4gZWRpdGluZy4KIFRFU1QodGVzdF92YXJpb3VzLCBhYXVkaW9fc2V0X2J1ZmZlcl9zaXplKSB7CisKICAgICBpbnQzMl90IGJ1ZmZlckNhcGFjaXR5OwogICAgIGludDMyX3QgZnJhbWVzUGVyQnVyc3QgPSAwOwogICAgIGludDMyX3QgYWN0dWFsU2l6ZSA9IDA7CkBAIC0xMjIsNyArMTI1LDcgQEAKICAgICBBU1NFUlRfRVEoQUFVRElPX09LLCBBQXVkaW9fY3JlYXRlU3RyZWFtQnVpbGRlcigmYWF1ZGlvQnVpbGRlcikpOwogCiAgICAgLy8gUmVxdWVzdCBzdHJlYW0gcHJvcGVydGllcy4KLSAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldERhdGFDYWxsYmFjayhhYXVkaW9CdWlsZGVyLCBNeURhdGFDYWxsYmFja1Byb2MsIG51bGxwdHIpOworICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RGF0YUNhbGxiYWNrKGFhdWRpb0J1aWxkZXIsIE5vb3BEYXRhQ2FsbGJhY2tQcm9jLCBudWxscHRyKTsKICAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFBlcmZvcm1hbmNlTW9kZShhYXVkaW9CdWlsZGVyLCBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWSk7CiAKICAgICAvLyBDcmVhdGUgYW4gQUF1ZGlvU3RyZWFtIHVzaW5nIHRoZSBCdWlsZGVyLgpAQCAtMTcwLDMgKzE3MywxNTUgQEAKICAgICBBQXVkaW9TdHJlYW1fY2xvc2UoYWF1ZGlvU3RyZWFtKTsKICAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX2RlbGV0ZShhYXVkaW9CdWlsZGVyKTsKIH0KKworCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIFRlc3QgdG8gbWFrZSBzdXJlIHRoYXQgQUFVRElPX0NBTExCQUNLX1JFU1VMVF9TVE9QIHdvcmtzLgorCisvLyBDYWxsYmFjayBmdW5jdGlvbiB0aGF0IGNvdW50cyBjYWxscy4KK2FhdWRpb19kYXRhX2NhbGxiYWNrX3Jlc3VsdF90IENhbGxiYWNrT25jZVByb2MoCisgICAgICAgIEFBdWRpb1N0cmVhbSAqc3RyZWFtLAorICAgICAgICB2b2lkICp1c2VyRGF0YSwKKyAgICAgICAgdm9pZCAqYXVkaW9EYXRhLAorICAgICAgICBpbnQzMl90IG51bUZyYW1lcworKSB7CisgICAgKHZvaWQpIHN0cmVhbTsKKyAgICAodm9pZCkgYXVkaW9EYXRhOworICAgICh2b2lkKSBudW1GcmFtZXM7CisKKyAgICBzdGQ6OmF0b21pYzxpbnQzMl90PiAqY2FsbGJhY2tDb3VudFB0ciA9IChzdGQ6OmF0b21pYzxpbnQzMl90PiAqKXVzZXJEYXRhOworICAgICgqY2FsbGJhY2tDb3VudFB0cikrKzsKKworICAgIHJldHVybiBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1A7Cit9CisKK3ZvaWQgY2hlY2tDYWxsYmFja09uY2UoYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBwZXJmTW9kZSkgeworCisgICAgc3RkOjphdG9taWM8aW50MzJfdD4gICBjYWxsYmFja0NvdW50ezB9OworCisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlciAqYWF1ZGlvQnVpbGRlciA9IG51bGxwdHI7CisgICAgQUF1ZGlvU3RyZWFtICphYXVkaW9TdHJlYW0gPSBudWxscHRyOworCisgICAgLy8gVXNlIGFuIEFBdWRpb1N0cmVhbUJ1aWxkZXIgdG8gY29udGFpbiByZXF1ZXN0ZWQgcGFyYW1ldGVycy4KKyAgICBBU1NFUlRfRVEoQUFVRElPX09LLCBBQXVkaW9fY3JlYXRlU3RyZWFtQnVpbGRlcigmYWF1ZGlvQnVpbGRlcikpOworCisgICAgLy8gUmVxdWVzdCBzdHJlYW0gcHJvcGVydGllcy4KKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldERhdGFDYWxsYmFjayhhYXVkaW9CdWlsZGVyLCBDYWxsYmFja09uY2VQcm9jLCAmY2FsbGJhY2tDb3VudCk7CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRQZXJmb3JtYW5jZU1vZGUoYWF1ZGlvQnVpbGRlciwgcGVyZk1vZGUpOworCisgICAgLy8gQ3JlYXRlIGFuIEFBdWRpb1N0cmVhbSB1c2luZyB0aGUgQnVpbGRlci4KKyAgICBBU1NFUlRfRVEoQUFVRElPX09LLCBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oYWF1ZGlvQnVpbGRlciwgJmFhdWRpb1N0cmVhbSkpOworICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfZGVsZXRlKGFhdWRpb0J1aWxkZXIpOworCisgICAgQVNTRVJUX0VRKEFBVURJT19PSywgQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdGFydChhYXVkaW9TdHJlYW0pKTsKKworICAgIHNsZWVwKDEpOyAvLyBHaXZlIGNhbGxiYWNrIGEgY2hhbmNlIHRvIHJ1biBtYW55IHRpbWVzLgorCisgICAgRVhQRUNUX0VRKEFBVURJT19PSywgQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdG9wKGFhdWRpb1N0cmVhbSkpOworCisgICAgRVhQRUNUX0VRKDEsIGNhbGxiYWNrQ291bnQubG9hZCgpKTsgLy8gc2hvdWxkIHN0b3AgYWZ0ZXIgZmlyc3QgY2FsbAorCisgICAgRVhQRUNUX0VRKEFBVURJT19PSywgQUF1ZGlvU3RyZWFtX2Nsb3NlKGFhdWRpb1N0cmVhbSkpOworfQorCitURVNUKHRlc3RfdmFyaW91cywgYWF1ZGlvX2NhbGxiYWNrX29uY2Vfbm9uZSkgeworICAgIGNoZWNrQ2FsbGJhY2tPbmNlKEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkUpOworfQorCitURVNUKHRlc3RfdmFyaW91cywgYWF1ZGlvX2NhbGxiYWNrX29uY2VfbG93bGF0KSB7CisgICAgY2hlY2tDYWxsYmFja09uY2UoQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1kpOworfQorCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3N0cnVjdCBXYWtlVXBDYWxsYmFja0RhdGEgeworICAgIHZvaWQgd2FrZU90aGVyKCkgeworICAgICAgICAvLyBzaWduYWwgd2FpdGluZyB0ZXN0IHRvIHdha2UgdXAKKyAgICAgICAgeworICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkIDxzdGQ6Om11dGV4PiBsb2NrKG11dGV4KTsKKyAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBjb25kaXRpb25WYXJpYWJsZS5ub3RpZnlfb25lKCk7CisgICAgfQorCisgICAgdm9pZCB3YWl0Rm9yRmluaXNoZWQoKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2sgPHN0ZDo6bXV0ZXg+IGFMb2NrKG11dGV4KTsKKyAgICAgICAgY29uZGl0aW9uVmFyaWFibGUud2FpdChhTG9jaywgWz1dIHsgcmV0dXJuIGZpbmlzaGVkOyB9KTsKKyAgICB9CisKKyAgICAvLyBGb3Igc2lnbmFsbGluZyBmb3JlZ3JvdW5kIHRlc3Qgd2hlbiBjYWxsYmFjayBmaW5pc2hlZAorICAgIHN0ZDo6bXV0ZXggICAgICAgICAgICAgIG11dGV4OworICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIGNvbmRpdGlvblZhcmlhYmxlOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkID0gZmFsc2U7Cit9OworCisvLyBUZXN0IHRvIG1ha2Ugc3VyZSB3ZSBjYW5ub3QgY2FsbCByZWN1cnNpdmVseSBpbnRvIHRoZSBzeXN0ZW0gZnJvbSBhIGNhbGxiYWNrLgorc3RydWN0IERhbmdlcm91c0RhdGEgOiBwdWJsaWMgV2FrZVVwQ2FsbGJhY2tEYXRhIHsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0U3RhcnQgPSBBQVVESU9fT0s7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdFN0b3AgPSBBQVVESU9fT0s7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdFBhdXNlID0gQUFVRElPX09LOworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHRGbHVzaCA9IEFBVURJT19PSzsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0Q2xvc2UgPSBBQVVESU9fT0s7Cit9OworCisvLyBDYWxsYmFjayBmdW5jdGlvbiB0aGF0IHRyaWVzIHRvIGNhbGwgYmFjayBpbnRvIHRoZSBzdHJlYW0uCithYXVkaW9fZGF0YV9jYWxsYmFja19yZXN1bHRfdCBEYW5nZXJvdXNEYXRhQ2FsbGJhY2tQcm9jKAorICAgICAgICBBQXVkaW9TdHJlYW0gKnN0cmVhbSwKKyAgICAgICAgdm9pZCAqdXNlckRhdGEsCisgICAgICAgIHZvaWQgKmF1ZGlvRGF0YSwKKyAgICAgICAgaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICAodm9pZCkgYXVkaW9EYXRhOworICAgICh2b2lkKSBudW1GcmFtZXM7CisKKyAgICBEYW5nZXJvdXNEYXRhICpkYXRhID0gKERhbmdlcm91c0RhdGEgKil1c2VyRGF0YTsKKyAgICBkYXRhLT5yZXN1bHRTdGFydCA9IEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RhcnQoc3RyZWFtKTsKKyAgICBkYXRhLT5yZXN1bHRTdG9wID0gQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdG9wKHN0cmVhbSk7CisgICAgZGF0YS0+cmVzdWx0UGF1c2UgPSBBQXVkaW9TdHJlYW1fcmVxdWVzdFBhdXNlKHN0cmVhbSk7CisgICAgZGF0YS0+cmVzdWx0Rmx1c2ggPSBBQXVkaW9TdHJlYW1fcmVxdWVzdEZsdXNoKHN0cmVhbSk7CisgICAgZGF0YS0+cmVzdWx0Q2xvc2UgPSBBQXVkaW9TdHJlYW1fY2xvc2Uoc3RyZWFtKTsKKworICAgIGRhdGEtPndha2VPdGhlcigpOworCisgICAgcmV0dXJuIEFBVURJT19DQUxMQkFDS19SRVNVTFRfU1RPUDsKK30KKworLy9pbnQgbWFpbigpIHsgLy8gVG8gZml4IEFuZHJvaWQgU3R1ZGlvIGZvcm1hdHRpbmcgd2hlbiBlZGl0aW5nLgordm9pZCBjaGVja0Rhbmdlcm91c0NhbGxiYWNrKGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgcGVyZk1vZGUpIHsKKyAgICBEYW5nZXJvdXNEYXRhICAgICAgICBkYW5nZXJvdXNEYXRhOworICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXIgKmFhdWRpb0J1aWxkZXIgPSBudWxscHRyOworICAgIEFBdWRpb1N0cmVhbSAgICAgICAgKmFhdWRpb1N0cmVhbSA9IG51bGxwdHI7CisKKyAgICAvLyBVc2UgYW4gQUF1ZGlvU3RyZWFtQnVpbGRlciB0byBjb250YWluIHJlcXVlc3RlZCBwYXJhbWV0ZXJzLgorICAgIEFTU0VSVF9FUShBQVVESU9fT0ssIEFBdWRpb19jcmVhdGVTdHJlYW1CdWlsZGVyKCZhYXVkaW9CdWlsZGVyKSk7CisKKyAgICAvLyBSZXF1ZXN0IHN0cmVhbSBwcm9wZXJ0aWVzLgorICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RGF0YUNhbGxiYWNrKGFhdWRpb0J1aWxkZXIsIERhbmdlcm91c0RhdGFDYWxsYmFja1Byb2MsICZkYW5nZXJvdXNEYXRhKTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFBlcmZvcm1hbmNlTW9kZShhYXVkaW9CdWlsZGVyLCBwZXJmTW9kZSk7CisKKyAgICAvLyBDcmVhdGUgYW4gQUF1ZGlvU3RyZWFtIHVzaW5nIHRoZSBCdWlsZGVyLgorICAgIEFTU0VSVF9FUShBQVVESU9fT0ssIEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbShhYXVkaW9CdWlsZGVyLCAmYWF1ZGlvU3RyZWFtKSk7CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9kZWxldGUoYWF1ZGlvQnVpbGRlcik7CisKKyAgICBBU1NFUlRfRVEoQUFVRElPX09LLCBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0KGFhdWRpb1N0cmVhbSkpOworCisgICAgZGFuZ2Vyb3VzRGF0YS53YWl0Rm9yRmluaXNoZWQoKTsKKworICAgIEVYUEVDVF9FUShBQVVESU9fT0ssIEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RvcChhYXVkaW9TdHJlYW0pKTsKKworICAgIEVYUEVDVF9FUShBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURSwgZGFuZ2Vyb3VzRGF0YS5yZXN1bHRTdGFydCk7CisgICAgRVhQRUNUX0VRKEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFLCBkYW5nZXJvdXNEYXRhLnJlc3VsdFN0b3ApOworICAgIEVYUEVDVF9FUShBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURSwgZGFuZ2Vyb3VzRGF0YS5yZXN1bHRQYXVzZSk7CisgICAgRVhQRUNUX0VRKEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFLCBkYW5nZXJvdXNEYXRhLnJlc3VsdEZsdXNoKTsKKyAgICBFWFBFQ1RfRVEoQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEUsIGRhbmdlcm91c0RhdGEucmVzdWx0Q2xvc2UpOworCisgICAgRVhQRUNUX0VRKEFBVURJT19PSywgQUF1ZGlvU3RyZWFtX2Nsb3NlKGFhdWRpb1N0cmVhbSkpOworfQorCisvL2ludCBtYWluKCkgeyAvLyBUbyBmaXggQW5kcm9pZCBTdHVkaW8gZm9ybWF0dGluZyB3aGVuIGVkaXRpbmcuCisKK1RFU1QodGVzdF92YXJpb3VzLCBhYXVkaW9fY2FsbGJhY2tfYmxvY2tlcnNfbm9uZSkgeworICAgIGNoZWNrRGFuZ2Vyb3VzQ2FsbGJhY2soQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORSk7Cit9CisKK1RFU1QodGVzdF92YXJpb3VzLCBhYXVkaW9fY2FsbGJhY2tfYmxvY2tlcnNfbG93bGF0KSB7CisgICAgY2hlY2tEYW5nZXJvdXNDYWxsYmFjayhBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWSk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1JlY29yZC5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1JlY29yZC5jcHAKaW5kZXggNzQxZDA4NC4uMGQ0YjQ2MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9SZWNvcmQuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvUmVjb3JkLmNwcApAQCAtNTMwLDYgKzUzMCwyNyBAQAogICAgIHJldHVybiBtUm91dGVkRGV2aWNlSWQ7CiB9CiAKK3N0YXR1c190IEF1ZGlvUmVjb3JkOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkgY29uc3QKK3sKKyAgICBTdHJpbmc4IHJlc3VsdDsKKworICAgIHJlc3VsdC5hcHBlbmQoIiBBdWRpb1JlY29yZDo6ZHVtcFxuIik7CisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBzdGF0dXMoJWQpLCBhY3RpdmUoJWQpLCBzZXNzaW9uIElkKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0dXMsIG1BY3RpdmUsIG1TZXNzaW9uSWQpOworICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgZmxhZ3MoJSN4KSwgcmVxLiBmbGFncyglI3gpLCBhdWRpbyBzb3VyY2UoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgbUZsYWdzLCBtT3JpZ0ZsYWdzLCBtQXR0cmlidXRlcy5zb3VyY2UpOworICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgZm9ybWF0KCUjeCksIGNoYW5uZWwgbWFzayglI3gpLCBjaGFubmVsIGNvdW50KCV1KSwgc2FtcGxlIHJhdGUoJXUpXG4iLAorICAgICAgICAgICAgICAgICAgbUZvcm1hdCwgbUNoYW5uZWxNYXNrLCBtQ2hhbm5lbENvdW50LCBtU2FtcGxlUmF0ZSk7CisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBmcmFtZSBjb3VudCglenUpLCByZXEuIGZyYW1lIGNvdW50KCV6dSlcbiIsCisgICAgICAgICAgICAgICAgICBtRnJhbWVDb3VudCwgbVJlcUZyYW1lQ291bnQpOworICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgbm90aWYuIGZyYW1lIGNvdW50KCV1KSwgcmVxLiBub3RpZi4gZnJhbWUgY291bnQoJXUpXG4iLAorICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25GcmFtZXNBY3QsIG1Ob3RpZmljYXRpb25GcmFtZXNSZXEpOworICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgaW5wdXQoJWQpLCBsYXRlbmN5KCV1KSwgc2VsZWN0ZWQgZGV2aWNlIElkKCVkKSwgcm91dGVkIGRldmljZSBJZCglZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXQsIG1MYXRlbmN5LCBtU2VsZWN0ZWREZXZpY2VJZCwgbVJvdXRlZERldmljZUlkKTsKKyAgICA6OndyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gVE9ETyBNb3ZlIHRoaXMgbWFjcm8gdG8gYSBjb21tb24gaGVhZGVyIGZpbGUgZm9yIGVudW0gdG8gc3RyaW5nIGNvbnZlcnNpb24gaW4gYXVkaW8gZnJhbWV3b3JrLgogI2RlZmluZSBNRURJQV9DQVNFX0VOVU0obmFtZSkgY2FzZSBuYW1lOiByZXR1cm4gI25hbWUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L1RvbmVHZW5lcmF0b3IuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvVG9uZUdlbmVyYXRvci5jcHAKaW5kZXggY2ZiNWJlNi4uNWEzMzk3NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvVG9uZUdlbmVyYXRvci5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvVG9uZUdlbmVyYXRvci5jcHAKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxtYXRoLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeUhlbHBlci5oPgogI2luY2x1ZGUgIm1lZGlhL1RvbmVHZW5lcmF0b3IuaCIKIAogCkBAIC0xMDQ0LDcgKzEwNDUsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgQUxPR1YoInN0YXJ0VG9uZSIpOworICAgIEFMT0dWKCJzdGFydFRvbmUgdG9uZVR5cGUgJWQiLCB0b25lVHlwZSk7CiAKICAgICBtTG9jay5sb2NrKCk7CiAKQEAgLTExOTYsOSArMTE5NywxNiBAQAogICAgIG1wQXVkaW9UcmFjayA9IG5ldyBBdWRpb1RyYWNrKCk7CiAgICAgQUxPR1YoIkF1ZGlvVHJhY2soJXApIGNyZWF0ZWQiLCBtcEF1ZGlvVHJhY2suZ2V0KCkpOwogCisgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHI7CisgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlID0gbVN0cmVhbVR5cGU7CisgICAgaWYgKG1TdHJlYW1UeXBlID09IEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKSB7CisgICAgICAgIHN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fRFRNRjsKKyAgICB9CisgICAgc3RyZWFtX3R5cGVfdG9fYXVkaW9fYXR0cmlidXRlcyhzdHJlYW1UeXBlLCAmYXR0cik7CisKICAgICBjb25zdCBzaXplX3QgZnJhbWVDb3VudCA9IG1Qcm9jZXNzU2l6ZTsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcEF1ZGlvVHJhY2stPnNldCgKLSAgICAgICAgICAgIG1TdHJlYW1UeXBlLAorICAgICAgICAgICAgQVVESU9fU1RSRUFNX0RFRkFVTFQsCiAgICAgICAgICAgICAwLCAgICAvLyBzYW1wbGVSYXRlCiAgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwKICAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX01PTk8sCkBAIC0xMjEwLDcgKzEyMTgsMTEgQEAKICAgICAgICAgICAgIDAsICAgIC8vIHNoYXJlZEJ1ZmZlcgogICAgICAgICAgICAgbVRocmVhZENhbkNhbGxKYXZhLAogICAgICAgICAgICAgQVVESU9fU0VTU0lPTl9BTExPQ0FURSwKLSAgICAgICAgICAgIEF1ZGlvVHJhY2s6OlRSQU5TRkVSX0NBTExCQUNLKTsKKyAgICAgICAgICAgIEF1ZGlvVHJhY2s6OlRSQU5TRkVSX0NBTExCQUNLLAorICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgIEFVRElPX1VJRF9JTlZBTElELAorICAgICAgICAgICAgLTEsCisgICAgICAgICAgICAmYXR0cik7CiAKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIEFMT0dFKCJBdWRpb1RyYWNrKCVwKSBzZXQgZmFpbGVkIHdpdGggZXJyb3IgJWQiLCBtcEF1ZGlvVHJhY2suZ2V0KCksIHN0YXR1cyk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUmVjb3JkLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUmVjb3JkLmgKaW5kZXggMDBjMmE4OC4uMDc0ZTU0NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1JlY29yZC5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9SZWNvcmQuaApAQCAtNTIxLDYgKzUyMSwxMSBAQAogICAgIC8qIEdldCB0aGUgZmxhZ3MgKi8KICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZ2V0RmxhZ3MoKSBjb25zdCB7IEF1dG9NdXRleCBfbChtTG9jayk7IHJldHVybiBtRmxhZ3M7IH0KIAorICAgIC8qCisgICAgICogRHVtcHMgdGhlIHN0YXRlIG9mIGFuIGF1ZGlvIHJlY29yZC4KKyAgICAgKi8KKyAgICAgICAgICAgIHN0YXR1c190ICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBjb25zdDsKKwogcHJpdmF0ZToKICAgICAvKiBjb3B5aW5nIGF1ZGlvIHJlY29yZCBvYmplY3RzIGlzIG5vdCBhbGxvd2VkICovCiAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1JlY29yZChjb25zdCBBdWRpb1JlY29yZCYgb3RoZXIpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggZTljMTYwNi4uNTJiYjJmYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvdGVzdHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC90ZXN0cy9BbmRyb2lkLmJwCkBAIC05LDEyICs5LDI3IEBACiBjY190ZXN0IHsKICAgICBuYW1lOiAidGVzdF9jcmVhdGVfYXVkaW90cmFjayIsCiAgICAgZGVmYXVsdHM6IFsibGliYXVkaW9jbGllbnRfdGVzdHNfZGVmYXVsdHMiXSwKLSAgICBzcmNzOiBbInRlc3RfY3JlYXRlX2F1ZGlvdHJhY2suY3BwIl0sCisgICAgc3JjczogWyJ0ZXN0X2NyZWF0ZV9hdWRpb3RyYWNrLmNwcCIsCisgICAgICAgICAgICJ0ZXN0X2NyZWF0ZV91dGlscy5jcHAiXSwKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliYXVkaW9jbGllbnQiLAorICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJ1dGlscyIsCi0gICAgICAgICJsaWJiaW5kZXIiLAogICAgIF0sCiAgICAgZGF0YTogWyJ0cmFja190ZXN0X2lucHV0XyoudHh0Il0sCiB9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJ0ZXN0X2NyZWF0ZV9hdWRpb3JlY29yZCIsCisgICAgZGVmYXVsdHM6IFsibGliYXVkaW9jbGllbnRfdGVzdHNfZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbInRlc3RfY3JlYXRlX2F1ZGlvcmVjb3JkLmNwcCIsCisgICAgICAgICAgICJ0ZXN0X2NyZWF0ZV91dGlscy5jcHAiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYXVkaW9jbGllbnQiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKyAgICBkYXRhOiBbInJlY29yZF90ZXN0X2lucHV0XyoudHh0Il0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC90ZXN0cy9yZWNvcmRfdGVzdF9pbnB1dF92MS4wX3JlZi50eHQgYi9tZWRpYS9saWJhdWRpb2NsaWVudC90ZXN0cy9yZWNvcmRfdGVzdF9pbnB1dF92MS4wX3JlZi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAxNTk4ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L3Rlc3RzL3JlY29yZF90ZXN0X2lucHV0X3YxLjBfcmVmLnR4dApAQCAtMCwwICsxLDMzIEBACit2ZXJzaW9uIDEuMAorIyBJbnB1dCBmaWxlIGZvciB0ZXN0X2NyZWF0ZV9hdWRpb3JlY29yZAorIyBBZGQgb25lIGxpbmUgZm9yIGVhY2ggdGVzdGVkIEF1ZGlvUmVjb3JkIGNvbnN0cnVjdG9yIHdpdGggdGhlIGZvbGxvd2luZyBhcmd1bWVudHM6CisjIHNhbXBsZVJhdGUgZm9ybWF0ICAgY2hhbm5lbE1hc2sgZnJhbWVDb3VudCBub3RpZmljYXRpb25GcmFtZXMgZmxhZ3Mgc2Vzc2lvbklkIGlucHV0U291cmNlCisjIHNhbXBsZSByYXRlIHRlc3RzCisgIDQ4MDAwICAgICAgMHgxICAgICAgMHgxMCAgICAgICAgNDgwMCAgICAgICAyNDAwICAgICAgICAgICAgICAgMHgwICAgMCAgICAgICAgIDAKKyAgMjQwMDAgICAgICAweDEgICAgICAweDEwICAgICAgICA0ODAwICAgICAgIDI0MDAgICAgICAgICAgICAgICAweDAgICAwICAgICAgICAgMAorICAxNjAwMCAgICAgIDB4MSAgICAgIDB4MTAgICAgICAgIDQ4MDAgICAgICAgMjQwMCAgICAgICAgICAgICAgIDB4MCAgIDAgICAgICAgICAwCisgICA4MDAwICAgICAgMHgxICAgICAgMHgxMCAgICAgICAgNDgwMCAgICAgICAyNDAwICAgICAgICAgICAgICAgMHgwICAgMCAgICAgICAgIDAKKyAgNDQxMDAgICAgICAweDEgICAgICAweDEwICAgICAgICA0NDEwICAgICAgIDIyMDUgICAgICAgICAgICAgICAweDAgICAwICAgICAgICAgMAorICAyMjA1MCAgICAgIDB4MSAgICAgIDB4MTAgICAgICAgIDQ0MTAgICAgICAgMjIwNSAgICAgICAgICAgICAgIDB4MCAgIDAgICAgICAgICAwCisgIDExMDI1ICAgICAgMHgxICAgICAgMHgxMCAgICAgICAgNDQxMCAgICAgICAyMjA1ICAgICAgICAgICAgICAgMHgwICAgMCAgICAgICAgIDAKKyMgZm9ybWF0IHRlc3RzCisgIDQ4MDAwICAgICAgMHgyICAgICAgMHgxMCAgICAgICAgNDgwMCAgICAgICAyNDAwICAgICAgICAgICAgICAgMHgwICAgMCAgICAgICAgIDAKKyAgNDgwMDAgICAgICAweDMgICAgICAweDEwICAgICAgICA0ODAwICAgICAgIDI0MDAgICAgICAgICAgICAgICAweDAgICAwICAgICAgICAgMAorICA0ODAwMCAgICAgIDB4NSAgICAgIDB4MTAgICAgICAgIDQ4MDAgICAgICAgMjQwMCAgICAgICAgICAgICAgIDB4MCAgIDAgICAgICAgICAwCisjIGNoYW5uZWwgbWFzayB0ZXN0cworICA0ODAwMCAgICAgIDB4MSAgICAgIDB4MEMgICAgICAgIDQ4MDAgICAgICAgMjQwMCAgICAgICAgICAgICAgIDB4MCAgIDAgICAgICAgICAwCisjIGZyYW1lIGNvdW50IHRlc3RzCisgIDQ4MDAwICAgICAgMHgxICAgICAgMHgxMCAgICAgICAgMCAgICAgICAgICAwICAgICAgICAgICAgICAgICAgMHgwICAgMCAgICAgICAgIDAKKyAgNDgwMDAgICAgICAweDEgICAgICAweDEwICAgICAgICA0ODAwMCAgICAgIDAgICAgICAgICAgICAgICAgICAweDAgICAwICAgICAgICAgMAorICA0ODAwMCAgICAgIDB4MSAgICAgIDB4MTAgICAgICAgIDEyMDAwICAgICAgNjAwMCAgICAgICAgICAgICAgIDB4MCAgIDAgICAgICAgICAwCisjIGZsYWdzIHRlc3QKKyAgNDgwMDAgICAgICAweDEgICAgICAweDBDICAgICAgICAwICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAweDEgICAwICAgICAgICAgMAorICA0NDEwMCAgICAgIDB4MSAgICAgIDB4MEMgICAgICAgIDAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgIDB4NSAgIDAgICAgICAgICAwCisjIHNlc3Npb24gdGVzdHMKKyAgNDgwMDAgICAgICAweDEgICAgICAweDEwICAgICAgICAwICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAwICAgICAxMDAxICAgICAgMAorIyBpbnB1dCBzb3VyY2UgdGVzdHMKKyAgNDgwMDAgICAgICAweDEgICAgICAweDEwICAgICAgICAwICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAwICAgICAwICAgICAgICAgMQorICA0ODAwMCAgICAgIDB4MSAgICAgIDB4MTAgICAgICAgIDAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgIDAgICAgIDAgICAgICAgICA1CisgIDQ4MDAwICAgICAgMHgxICAgICAgMHgxMCAgICAgICAgMCAgICAgICAgICAwICAgICAgICAgICAgICAgICAgMCAgICAgMCAgICAgICAgIDYKKyAgNDgwMDAgICAgICAweDEgICAgICAweDEwICAgICAgICAwICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAwICAgICAwICAgICAgICAgNworICA0ODAwMCAgICAgIDB4MSAgICAgIDB4MTAgICAgICAgIDAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgIDAgICAgIDAgICAgICAgICA5CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC90ZXN0cy9yZWNvcmRfdGVzdF9vdXRwdXRfdjEuMF9yZWZfd2FsbGV5ZS50eHQgYi9tZWRpYS9saWJhdWRpb2NsaWVudC90ZXN0cy9yZWNvcmRfdGVzdF9vdXRwdXRfdjEuMF9yZWZfd2FsbGV5ZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY2MDhlYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L3Rlc3RzL3JlY29yZF90ZXN0X291dHB1dF92MS4wX3JlZl93YWxsZXllLnR4dApAQCAtMCwwICsxLDE5OCBAQAorCisjIyMjIFRlc3QgMSBzdGF0dXMgMAorIEF1ZGlvUmVjb3JkOjpkdW1wCisgIHN0YXR1cygwKSwgYWN0aXZlKDApLCBzZXNzaW9uIElkKDY1KQorICBmbGFncygwKSwgcmVxLiBmbGFncygwKSwgYXVkaW8gc291cmNlKDApCisgIGZvcm1hdCgweDEpLCBjaGFubmVsIG1hc2soMHgxMCksIGNoYW5uZWwgY291bnQoMSksIHNhbXBsZSByYXRlKDQ4MDAwKQorICBmcmFtZSBjb3VudCg0ODAwKSwgcmVxLiBmcmFtZSBjb3VudCg0ODAwKQorICBub3RpZi4gZnJhbWUgY291bnQoOTYwKSwgcmVxLiBub3RpZi4gZnJhbWUgY291bnQoMjQwMCkKKyAgaW5wdXQoMTUwKSwgbGF0ZW5jeSgxMDApLCBzZWxlY3RlZCBkZXZpY2UgSWQoMCksIHJvdXRlZCBkZXZpY2UgSWQoMTEpCisKKyMjIyMgVGVzdCAyIHN0YXR1cyAwCisgQXVkaW9SZWNvcmQ6OmR1bXAKKyAgc3RhdHVzKDApLCBhY3RpdmUoMCksIHNlc3Npb24gSWQoNzMpCisgIGZsYWdzKDApLCByZXEuIGZsYWdzKDApLCBhdWRpbyBzb3VyY2UoMCkKKyAgZm9ybWF0KDB4MSksIGNoYW5uZWwgbWFzaygweDEwKSwgY2hhbm5lbCBjb3VudCgxKSwgc2FtcGxlIHJhdGUoMjQwMDApCisgIGZyYW1lIGNvdW50KDQ4MDApLCByZXEuIGZyYW1lIGNvdW50KDQ4MDApCisgIG5vdGlmLiBmcmFtZSBjb3VudCg0ODApLCByZXEuIG5vdGlmLiBmcmFtZSBjb3VudCgyNDAwKQorICBpbnB1dCgxNTgpLCBsYXRlbmN5KDIwMCksIHNlbGVjdGVkIGRldmljZSBJZCgwKSwgcm91dGVkIGRldmljZSBJZCgxMSkKKworIyMjIyBUZXN0IDMgc3RhdHVzIDAKKyBBdWRpb1JlY29yZDo6ZHVtcAorICBzdGF0dXMoMCksIGFjdGl2ZSgwKSwgc2Vzc2lvbiBJZCg4MSkKKyAgZmxhZ3MoMCksIHJlcS4gZmxhZ3MoMCksIGF1ZGlvIHNvdXJjZSgwKQorICBmb3JtYXQoMHgxKSwgY2hhbm5lbCBtYXNrKDB4MTApLCBjaGFubmVsIGNvdW50KDEpLCBzYW1wbGUgcmF0ZSgxNjAwMCkKKyAgZnJhbWUgY291bnQoNDgwMCksIHJlcS4gZnJhbWUgY291bnQoNDgwMCkKKyAgbm90aWYuIGZyYW1lIGNvdW50KDMyMCksIHJlcS4gbm90aWYuIGZyYW1lIGNvdW50KDI0MDApCisgIGlucHV0KDE2NiksIGxhdGVuY3koMzAwKSwgc2VsZWN0ZWQgZGV2aWNlIElkKDApLCByb3V0ZWQgZGV2aWNlIElkKDExKQorCisjIyMjIFRlc3QgNCBzdGF0dXMgMAorIEF1ZGlvUmVjb3JkOjpkdW1wCisgIHN0YXR1cygwKSwgYWN0aXZlKDApLCBzZXNzaW9uIElkKDg5KQorICBmbGFncygwKSwgcmVxLiBmbGFncygwKSwgYXVkaW8gc291cmNlKDApCisgIGZvcm1hdCgweDEpLCBjaGFubmVsIG1hc2soMHgxMCksIGNoYW5uZWwgY291bnQoMSksIHNhbXBsZSByYXRlKDgwMDApCisgIGZyYW1lIGNvdW50KDQ4MDApLCByZXEuIGZyYW1lIGNvdW50KDQ4MDApCisgIG5vdGlmLiBmcmFtZSBjb3VudCgxNjApLCByZXEuIG5vdGlmLiBmcmFtZSBjb3VudCgyNDAwKQorICBpbnB1dCgxNzQpLCBsYXRlbmN5KDYwMCksIHNlbGVjdGVkIGRldmljZSBJZCgwKSwgcm91dGVkIGRldmljZSBJZCgxMSkKKworIyMjIyBUZXN0IDUgc3RhdHVzIDAKKyBBdWRpb1JlY29yZDo6ZHVtcAorICBzdGF0dXMoMCksIGFjdGl2ZSgwKSwgc2Vzc2lvbiBJZCg5NykKKyAgZmxhZ3MoMCksIHJlcS4gZmxhZ3MoMCksIGF1ZGlvIHNvdXJjZSgwKQorICBmb3JtYXQoMHgxKSwgY2hhbm5lbCBtYXNrKDB4MTApLCBjaGFubmVsIGNvdW50KDEpLCBzYW1wbGUgcmF0ZSg0NDEwMCkKKyAgZnJhbWUgY291bnQoNDQxMCksIHJlcS4gZnJhbWUgY291bnQoNDQxMCkKKyAgbm90aWYuIGZyYW1lIGNvdW50KDg5NiksIHJlcS4gbm90aWYuIGZyYW1lIGNvdW50KDIyMDUpCisgIGlucHV0KDE4MiksIGxhdGVuY3koMTAwKSwgc2VsZWN0ZWQgZGV2aWNlIElkKDApLCByb3V0ZWQgZGV2aWNlIElkKDExKQorCisjIyMjIFRlc3QgNiBzdGF0dXMgMAorIEF1ZGlvUmVjb3JkOjpkdW1wCisgIHN0YXR1cygwKSwgYWN0aXZlKDApLCBzZXNzaW9uIElkKDEwNSkKKyAgZmxhZ3MoMCksIHJlcS4gZmxhZ3MoMCksIGF1ZGlvIHNvdXJjZSgwKQorICBmb3JtYXQoMHgxKSwgY2hhbm5lbCBtYXNrKDB4MTApLCBjaGFubmVsIGNvdW50KDEpLCBzYW1wbGUgcmF0ZSgyMjA1MCkKKyAgZnJhbWUgY291bnQoNDQxMCksIHJlcS4gZnJhbWUgY291bnQoNDQxMCkKKyAgbm90aWYuIGZyYW1lIGNvdW50KDQ0OCksIHJlcS4gbm90aWYuIGZyYW1lIGNvdW50KDIyMDUpCisgIGlucHV0KDE5MCksIGxhdGVuY3koMjAwKSwgc2VsZWN0ZWQgZGV2aWNlIElkKDApLCByb3V0ZWQgZGV2aWNlIElkKDExKQorCisjIyMjIFRlc3QgNyBzdGF0dXMgMAorIEF1ZGlvUmVjb3JkOjpkdW1wCisgIHN0YXR1cygwKSwgYWN0aXZlKDApLCBzZXNzaW9uIElkKDExMykKKyAgZmxhZ3MoMCksIHJlcS4gZmxhZ3MoMCksIGF1ZGlvIHNvdXJjZSgwKQorICBmb3JtYXQoMHgxKSwgY2hhbm5lbCBtYXNrKDB4MTApLCBjaGFubmVsIGNvdW50KDEpLCBzYW1wbGUgcmF0ZSgxMTAyNSkKKyAgZnJhbWUgY291bnQoNDQxMCksIHJlcS4gZnJhbWUgY291bnQoNDQxMCkKKyAgbm90aWYuIGZyYW1lIGNvdW50KDIyNCksIHJlcS4gbm90aWYuIGZyYW1lIGNvdW50KDIyMDUpCisgIGlucHV0KDE5OCksIGxhdGVuY3koNDAwKSwgc2VsZWN0ZWQgZGV2aWNlIElkKDApLCByb3V0ZWQgZGV2aWNlIElkKDExKQorCisjIyMjIFRlc3QgOCBzdGF0dXMgMAorIEF1ZGlvUmVjb3JkOjpkdW1wCisgIHN0YXR1cygwKSwgYWN0aXZlKDApLCBzZXNzaW9uIElkKDEyMSkKKyAgZmxhZ3MoMCksIHJlcS4gZmxhZ3MoMCksIGF1ZGlvIHNvdXJjZSgwKQorICBmb3JtYXQoMHgyKSwgY2hhbm5lbCBtYXNrKDB4MTApLCBjaGFubmVsIGNvdW50KDEpLCBzYW1wbGUgcmF0ZSg0ODAwMCkKKyAgZnJhbWUgY291bnQoNDgwMCksIHJlcS4gZnJhbWUgY291bnQoNDgwMCkKKyAgbm90aWYuIGZyYW1lIGNvdW50KDk2MCksIHJlcS4gbm90aWYuIGZyYW1lIGNvdW50KDI0MDApCisgIGlucHV0KDIwNiksIGxhdGVuY3koMTAwKSwgc2VsZWN0ZWQgZGV2aWNlIElkKDApLCByb3V0ZWQgZGV2aWNlIElkKDExKQorCisjIyMjIFRlc3QgOSBzdGF0dXMgMAorIEF1ZGlvUmVjb3JkOjpkdW1wCisgIHN0YXR1cygwKSwgYWN0aXZlKDApLCBzZXNzaW9uIElkKDEyOSkKKyAgZmxhZ3MoMCksIHJlcS4gZmxhZ3MoMCksIGF1ZGlvIHNvdXJjZSgwKQorICBmb3JtYXQoMHgzKSwgY2hhbm5lbCBtYXNrKDB4MTApLCBjaGFubmVsIGNvdW50KDEpLCBzYW1wbGUgcmF0ZSg0ODAwMCkKKyAgZnJhbWUgY291bnQoNDgwMCksIHJlcS4gZnJhbWUgY291bnQoNDgwMCkKKyAgbm90aWYuIGZyYW1lIGNvdW50KDk2MCksIHJlcS4gbm90aWYuIGZyYW1lIGNvdW50KDI0MDApCisgIGlucHV0KDIxNCksIGxhdGVuY3koMTAwKSwgc2VsZWN0ZWQgZGV2aWNlIElkKDApLCByb3V0ZWQgZGV2aWNlIElkKDExKQorCisjIyMjIFRlc3QgMTAgc3RhdHVzIDAKKyBBdWRpb1JlY29yZDo6ZHVtcAorICBzdGF0dXMoMCksIGFjdGl2ZSgwKSwgc2Vzc2lvbiBJZCgxMzcpCisgIGZsYWdzKDApLCByZXEuIGZsYWdzKDApLCBhdWRpbyBzb3VyY2UoMCkKKyAgZm9ybWF0KDB4NSksIGNoYW5uZWwgbWFzaygweDEwKSwgY2hhbm5lbCBjb3VudCgxKSwgc2FtcGxlIHJhdGUoNDgwMDApCisgIGZyYW1lIGNvdW50KDQ4MDApLCByZXEuIGZyYW1lIGNvdW50KDQ4MDApCisgIG5vdGlmLiBmcmFtZSBjb3VudCg5NjApLCByZXEuIG5vdGlmLiBmcmFtZSBjb3VudCgyNDAwKQorICBpbnB1dCgyMjIpLCBsYXRlbmN5KDEwMCksIHNlbGVjdGVkIGRldmljZSBJZCgwKSwgcm91dGVkIGRldmljZSBJZCgxMSkKKworIyMjIyBUZXN0IDExIHN0YXR1cyAwCisgQXVkaW9SZWNvcmQ6OmR1bXAKKyAgc3RhdHVzKDApLCBhY3RpdmUoMCksIHNlc3Npb24gSWQoMTQ1KQorICBmbGFncygwKSwgcmVxLiBmbGFncygwKSwgYXVkaW8gc291cmNlKDApCisgIGZvcm1hdCgweDEpLCBjaGFubmVsIG1hc2soMHhjKSwgY2hhbm5lbCBjb3VudCgyKSwgc2FtcGxlIHJhdGUoNDgwMDApCisgIGZyYW1lIGNvdW50KDQ4MDApLCByZXEuIGZyYW1lIGNvdW50KDQ4MDApCisgIG5vdGlmLiBmcmFtZSBjb3VudCg5NjApLCByZXEuIG5vdGlmLiBmcmFtZSBjb3VudCgyNDAwKQorICBpbnB1dCgyMzApLCBsYXRlbmN5KDEwMCksIHNlbGVjdGVkIGRldmljZSBJZCgwKSwgcm91dGVkIGRldmljZSBJZCgxMSkKKworIyMjIyBUZXN0IDEyIHN0YXR1cyAwCisgQXVkaW9SZWNvcmQ6OmR1bXAKKyAgc3RhdHVzKDApLCBhY3RpdmUoMCksIHNlc3Npb24gSWQoMTUzKQorICBmbGFncygwKSwgcmVxLiBmbGFncygwKSwgYXVkaW8gc291cmNlKDApCisgIGZvcm1hdCgweDEpLCBjaGFubmVsIG1hc2soMHgxMCksIGNoYW5uZWwgY291bnQoMSksIHNhbXBsZSByYXRlKDQ4MDAwKQorICBmcmFtZSBjb3VudCgyODgwKSwgcmVxLiBmcmFtZSBjb3VudCgyODgwKQorICBub3RpZi4gZnJhbWUgY291bnQoOTYwKSwgcmVxLiBub3RpZi4gZnJhbWUgY291bnQoMCkKKyAgaW5wdXQoMjM4KSwgbGF0ZW5jeSg2MCksIHNlbGVjdGVkIGRldmljZSBJZCgwKSwgcm91dGVkIGRldmljZSBJZCgxMSkKKworIyMjIyBUZXN0IDEzIHN0YXR1cyAwCisgQXVkaW9SZWNvcmQ6OmR1bXAKKyAgc3RhdHVzKDApLCBhY3RpdmUoMCksIHNlc3Npb24gSWQoMTYxKQorICBmbGFncygwKSwgcmVxLiBmbGFncygwKSwgYXVkaW8gc291cmNlKDApCisgIGZvcm1hdCgweDEpLCBjaGFubmVsIG1hc2soMHgxMCksIGNoYW5uZWwgY291bnQoMSksIHNhbXBsZSByYXRlKDQ4MDAwKQorICBmcmFtZSBjb3VudCg0ODAwMCksIHJlcS4gZnJhbWUgY291bnQoNDgwMDApCisgIG5vdGlmLiBmcmFtZSBjb3VudCg5NjApLCByZXEuIG5vdGlmLiBmcmFtZSBjb3VudCgwKQorICBpbnB1dCgyNDYpLCBsYXRlbmN5KDEwMDApLCBzZWxlY3RlZCBkZXZpY2UgSWQoMCksIHJvdXRlZCBkZXZpY2UgSWQoMTEpCisKKyMjIyMgVGVzdCAxNCBzdGF0dXMgMAorIEF1ZGlvUmVjb3JkOjpkdW1wCisgIHN0YXR1cygwKSwgYWN0aXZlKDApLCBzZXNzaW9uIElkKDE2OSkKKyAgZmxhZ3MoMCksIHJlcS4gZmxhZ3MoMCksIGF1ZGlvIHNvdXJjZSgwKQorICBmb3JtYXQoMHgxKSwgY2hhbm5lbCBtYXNrKDB4MTApLCBjaGFubmVsIGNvdW50KDEpLCBzYW1wbGUgcmF0ZSg0ODAwMCkKKyAgZnJhbWUgY291bnQoMTIwMDApLCByZXEuIGZyYW1lIGNvdW50KDEyMDAwKQorICBub3RpZi4gZnJhbWUgY291bnQoOTYwKSwgcmVxLiBub3RpZi4gZnJhbWUgY291bnQoNjAwMCkKKyAgaW5wdXQoMjU0KSwgbGF0ZW5jeSgyNTApLCBzZWxlY3RlZCBkZXZpY2UgSWQoMCksIHJvdXRlZCBkZXZpY2UgSWQoMTEpCisKKyMjIyMgVGVzdCAxNSBzdGF0dXMgMAorIEF1ZGlvUmVjb3JkOjpkdW1wCisgIHN0YXR1cygwKSwgYWN0aXZlKDApLCBzZXNzaW9uIElkKDE3NykKKyAgZmxhZ3MoMHgxKSwgcmVxLiBmbGFncygweDEpLCBhdWRpbyBzb3VyY2UoMCkKKyAgZm9ybWF0KDB4MSksIGNoYW5uZWwgbWFzaygweGMpLCBjaGFubmVsIGNvdW50KDIpLCBzYW1wbGUgcmF0ZSg0ODAwMCkKKyAgZnJhbWUgY291bnQoNDA5NiksIHJlcS4gZnJhbWUgY291bnQoNDA5NikKKyAgbm90aWYuIGZyYW1lIGNvdW50KDk2KSwgcmVxLiBub3RpZi4gZnJhbWUgY291bnQoMCkKKyAgaW5wdXQoMjYyKSwgbGF0ZW5jeSg4NSksIHNlbGVjdGVkIGRldmljZSBJZCgwKSwgcm91dGVkIGRldmljZSBJZCgxMSkKKworIyMjIyBUZXN0IDE2IHN0YXR1cyAwCisgQXVkaW9SZWNvcmQ6OmR1bXAKKyAgc3RhdHVzKDApLCBhY3RpdmUoMCksIHNlc3Npb24gSWQoMTg1KQorICBmbGFncygwKSwgcmVxLiBmbGFncygweDUpLCBhdWRpbyBzb3VyY2UoMCkKKyAgZm9ybWF0KDB4MSksIGNoYW5uZWwgbWFzaygweGMpLCBjaGFubmVsIGNvdW50KDIpLCBzYW1wbGUgcmF0ZSg0NDEwMCkKKyAgZnJhbWUgY291bnQoMjY2NCksIHJlcS4gZnJhbWUgY291bnQoMjY2NCkKKyAgbm90aWYuIGZyYW1lIGNvdW50KDg4OCksIHJlcS4gbm90aWYuIGZyYW1lIGNvdW50KDApCisgIGlucHV0KDI3OCksIGxhdGVuY3koNjApLCBzZWxlY3RlZCBkZXZpY2UgSWQoMCksIHJvdXRlZCBkZXZpY2UgSWQoMTEpCisKKyMjIyMgVGVzdCAxNyBzdGF0dXMgMAorIEF1ZGlvUmVjb3JkOjpkdW1wCisgIHN0YXR1cygwKSwgYWN0aXZlKDApLCBzZXNzaW9uIElkKDEwMDEpCisgIGZsYWdzKDApLCByZXEuIGZsYWdzKDApLCBhdWRpbyBzb3VyY2UoMCkKKyAgZm9ybWF0KDB4MSksIGNoYW5uZWwgbWFzaygweDEwKSwgY2hhbm5lbCBjb3VudCgxKSwgc2FtcGxlIHJhdGUoNDgwMDApCisgIGZyYW1lIGNvdW50KDI4ODApLCByZXEuIGZyYW1lIGNvdW50KDI4ODApCisgIG5vdGlmLiBmcmFtZSBjb3VudCg5NjApLCByZXEuIG5vdGlmLiBmcmFtZSBjb3VudCgwKQorICBpbnB1dCgyODYpLCBsYXRlbmN5KDYwKSwgc2VsZWN0ZWQgZGV2aWNlIElkKDApLCByb3V0ZWQgZGV2aWNlIElkKDExKQorCisjIyMjIFRlc3QgMTggc3RhdHVzIDAKKyBBdWRpb1JlY29yZDo6ZHVtcAorICBzdGF0dXMoMCksIGFjdGl2ZSgwKSwgc2Vzc2lvbiBJZCgxOTMpCisgIGZsYWdzKDApLCByZXEuIGZsYWdzKDApLCBhdWRpbyBzb3VyY2UoMSkKKyAgZm9ybWF0KDB4MSksIGNoYW5uZWwgbWFzaygweDEwKSwgY2hhbm5lbCBjb3VudCgxKSwgc2FtcGxlIHJhdGUoNDgwMDApCisgIGZyYW1lIGNvdW50KDI4ODApLCByZXEuIGZyYW1lIGNvdW50KDI4ODApCisgIG5vdGlmLiBmcmFtZSBjb3VudCg5NjApLCByZXEuIG5vdGlmLiBmcmFtZSBjb3VudCgwKQorICBpbnB1dCgyOTQpLCBsYXRlbmN5KDYwKSwgc2VsZWN0ZWQgZGV2aWNlIElkKDApLCByb3V0ZWQgZGV2aWNlIElkKDExKQorCisjIyMjIFRlc3QgMTkgc3RhdHVzIDAKKyBBdWRpb1JlY29yZDo6ZHVtcAorICBzdGF0dXMoMCksIGFjdGl2ZSgwKSwgc2Vzc2lvbiBJZCgyMDEpCisgIGZsYWdzKDApLCByZXEuIGZsYWdzKDApLCBhdWRpbyBzb3VyY2UoNSkKKyAgZm9ybWF0KDB4MSksIGNoYW5uZWwgbWFzaygweDEwKSwgY2hhbm5lbCBjb3VudCgxKSwgc2FtcGxlIHJhdGUoNDgwMDApCisgIGZyYW1lIGNvdW50KDI4ODApLCByZXEuIGZyYW1lIGNvdW50KDI4ODApCisgIG5vdGlmLiBmcmFtZSBjb3VudCg5NjApLCByZXEuIG5vdGlmLiBmcmFtZSBjb3VudCgwKQorICBpbnB1dCgzMDIpLCBsYXRlbmN5KDYwKSwgc2VsZWN0ZWQgZGV2aWNlIElkKDApLCByb3V0ZWQgZGV2aWNlIElkKDEyKQorCisjIyMjIFRlc3QgMjAgc3RhdHVzIDAKKyBBdWRpb1JlY29yZDo6ZHVtcAorICBzdGF0dXMoMCksIGFjdGl2ZSgwKSwgc2Vzc2lvbiBJZCgyMDkpCisgIGZsYWdzKDApLCByZXEuIGZsYWdzKDApLCBhdWRpbyBzb3VyY2UoNikKKyAgZm9ybWF0KDB4MSksIGNoYW5uZWwgbWFzaygweDEwKSwgY2hhbm5lbCBjb3VudCgxKSwgc2FtcGxlIHJhdGUoNDgwMDApCisgIGZyYW1lIGNvdW50KDI4ODApLCByZXEuIGZyYW1lIGNvdW50KDI4ODApCisgIG5vdGlmLiBmcmFtZSBjb3VudCg5NjApLCByZXEuIG5vdGlmLiBmcmFtZSBjb3VudCgwKQorICBpbnB1dCgzMTApLCBsYXRlbmN5KDYwKSwgc2VsZWN0ZWQgZGV2aWNlIElkKDApLCByb3V0ZWQgZGV2aWNlIElkKDExKQorCisjIyMjIFRlc3QgMjEgc3RhdHVzIDAKKyBBdWRpb1JlY29yZDo6ZHVtcAorICBzdGF0dXMoMCksIGFjdGl2ZSgwKSwgc2Vzc2lvbiBJZCgyMTcpCisgIGZsYWdzKDApLCByZXEuIGZsYWdzKDApLCBhdWRpbyBzb3VyY2UoNykKKyAgZm9ybWF0KDB4MSksIGNoYW5uZWwgbWFzaygweDEwKSwgY2hhbm5lbCBjb3VudCgxKSwgc2FtcGxlIHJhdGUoNDgwMDApCisgIGZyYW1lIGNvdW50KDI4ODApLCByZXEuIGZyYW1lIGNvdW50KDI4ODApCisgIG5vdGlmLiBmcmFtZSBjb3VudCg5NjApLCByZXEuIG5vdGlmLiBmcmFtZSBjb3VudCgwKQorICBpbnB1dCgzMTgpLCBsYXRlbmN5KDYwKSwgc2VsZWN0ZWQgZGV2aWNlIElkKDApLCByb3V0ZWQgZGV2aWNlIElkKDExKQorCisjIyMjIFRlc3QgMjIgc3RhdHVzIDAKKyBBdWRpb1JlY29yZDo6ZHVtcAorICBzdGF0dXMoMCksIGFjdGl2ZSgwKSwgc2Vzc2lvbiBJZCgyMjUpCisgIGZsYWdzKDApLCByZXEuIGZsYWdzKDApLCBhdWRpbyBzb3VyY2UoOSkKKyAgZm9ybWF0KDB4MSksIGNoYW5uZWwgbWFzaygweDEwKSwgY2hhbm5lbCBjb3VudCgxKSwgc2FtcGxlIHJhdGUoNDgwMDApCisgIGZyYW1lIGNvdW50KDI4ODApLCByZXEuIGZyYW1lIGNvdW50KDI4ODApCisgIG5vdGlmLiBmcmFtZSBjb3VudCg5NjApLCByZXEuIG5vdGlmLiBmcmFtZSBjb3VudCgwKQorICBpbnB1dCgzMjYpLCBsYXRlbmN5KDYwKSwgc2VsZWN0ZWQgZGV2aWNlIElkKDApLCByb3V0ZWQgZGV2aWNlIElkKDExKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvdGVzdHMvdGVzdF9jcmVhdGVfYXVkaW9yZWNvcmQuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvdGVzdHMvdGVzdF9jcmVhdGVfYXVkaW9yZWNvcmQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNmE3MzQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC90ZXN0cy90ZXN0X2NyZWF0ZV9hdWRpb3JlY29yZC5jcHAKQEAgLTAsMCArMSwxMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8YmluZGVyL01lbW9yeUJhc2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5RGVhbGVyLmg+CisjaW5jbHVkZSA8YmluZGVyL01lbW9yeUhlYXBCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZWNvcmQuaD4KKworI2luY2x1ZGUgInRlc3RfY3JlYXRlX3V0aWxzLmgiCisKKyNkZWZpbmUgTlVNX0FSR1VNRU5UUyA4CisjZGVmaW5lIFZFUlNJT05fVkFMVUUgIjEuMCIKKyNkZWZpbmUgUEFDS0FHRV9OQU1FICAiQXVkaW9SZWNvcmQgdGVzdCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitpbnQgdGVzdFJlY29yZChGSUxFICppbnB1dEZpbGUsIGludCBvdXRwdXRGaWxlRmQpCit7CisgICAgY2hhciBsaW5lW01BWF9JTlBVVF9GSUxFX0xJTkVfTEVOR1RIXTsKKyAgICB1aW50MzJfdCB0ZXN0Q291bnQgPSAwOworICAgIFZlY3RvcjxTdHJpbmcxNj4gYXJnczsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIGlmIChpbnB1dEZpbGUgPT0gbnVsbHB0cikgeworICAgICAgICBzcDxBdWRpb1JlY29yZD4gcmVjb3JkID0gbmV3IEF1ZGlvUmVjb3JkKEFVRElPX1NPVVJDRV9ERUZBVUxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLyogc2FtcGxlUmF0ZSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19DSEFOTkVMX0lOX01PTk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nMTYoUEFDS0FHRV9OQU1FKSk7CisgICAgICAgIGlmIChyZWNvcmQgPT0gMCB8fCByZWNvcmQtPmluaXRDaGVjaygpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICB3cml0ZShvdXRwdXRGaWxlRmQsICJFcnJvciBjcmVhdGluZyBBdWRpb1JlY29yZFxuIiwKKyAgICAgICAgICAgICAgICAgIHNpemVvZigiRXJyb3IgY3JlYXRpbmcgQXVkaW9SZWNvcmRcbiIpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlY29yZC0+ZHVtcChvdXRwdXRGaWxlRmQsIGFyZ3MpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vIGNoZWNrIHZlcnNpb24KKyAgICBpZiAoIWNoZWNrVmVyc2lvbihpbnB1dEZpbGUsIFZFUlNJT05fVkFMVUUpKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHdoaWxlIChyZWFkTGluZShpbnB1dEZpbGUsIGxpbmUsIE1BWF9JTlBVVF9GSUxFX0xJTkVfTEVOR1RIKSA9PSAwKSB7CisgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGU7CisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdDsKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2s7CisgICAgICAgIHNpemVfdCBmcmFtZUNvdW50OworICAgICAgICBpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lczsKKyAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFnczsKKyAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZDsKKyAgICAgICAgYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2U7CisgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzOworICAgICAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgICAgIGNoYXIgc3RhdHVzU3RyW01BWF9PVVRQVVRfRklMRV9MSU5FX0xFTkdUSF07CisgICAgICAgIGJvb2wgZmFzdCA9IGZhbHNlOworCisgICAgICAgIGlmIChzc2NhbmYobGluZSwgIiAldSAleCAleCAlenUgJWQgJXggJXUgJXUiLAorICAgICAgICAgICAgICAgICAgICZzYW1wbGVSYXRlLCAmZm9ybWF0LCAmY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgJmZyYW1lQ291bnQsICZub3RpZmljYXRpb25GcmFtZXMsCisgICAgICAgICAgICAgICAgICAgJmZsYWdzLCAmc2Vzc2lvbklkLCAmaW5wdXRTb3VyY2UpICE9IE5VTV9BUkdVTUVOVFMpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTWFsZm9ybWVkIGxpbmUgZm9yIHRlc3QgIyV1IGluIGlucHV0IGZpbGVcbiIsIHRlc3RDb3VudCsxKTsKKyAgICAgICAgICAgIHJldCA9IDE7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICB0ZXN0Q291bnQrKzsKKworICAgICAgICBpZiAoKGZsYWdzICYgQVVESU9fSU5QVVRfRkxBR19GQVNUKSAhPSAwKSB7CisgICAgICAgICAgICBmYXN0ID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIG1lbXNldCgmYXR0cmlidXRlcywgMCwgc2l6ZW9mKGF0dHJpYnV0ZXMpKTsKKyAgICAgICAgYXR0cmlidXRlcy5zb3VyY2UgPSBpbnB1dFNvdXJjZTsKKworICAgICAgICBzcDxBdWRpb1JlY29yZD4gcmVjb3JkID0gbmV3IEF1ZGlvUmVjb3JkKFN0cmluZzE2KFBBQ0tBR0VfTkFNRSkpOworCisgICAgICAgIHJlY29yZC0+c2V0KEFVRElPX1NPVVJDRV9ERUZBVUxULAorICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgZmFzdCA/IGNhbGxiYWNrIDogbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkZyYW1lcywKKyAgICAgICAgICAgICAgICAgICBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgZmFzdCA/IEF1ZGlvUmVjb3JkOjpUUkFOU0ZFUl9DQUxMQkFDSyA6IEF1ZGlvUmVjb3JkOjpUUkFOU0ZFUl9ERUZBVUxULAorICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgIGdldHVpZCgpLAorICAgICAgICAgICAgICAgICAgIGdldHBpZCgpLAorICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgIEFVRElPX1BPUlRfSEFORExFX05PTkUpOworICAgICAgICBzdGF0dXMgPSByZWNvcmQtPmluaXRDaGVjaygpOworICAgICAgICBzcHJpbnRmKHN0YXR1c1N0ciwgIlxuIyMjIyBUZXN0ICV1IHN0YXR1cyAlZFxuIiwgdGVzdENvdW50LCBzdGF0dXMpOworICAgICAgICB3cml0ZShvdXRwdXRGaWxlRmQsIHN0YXR1c1N0ciwgc3RybGVuKHN0YXR1c1N0cikpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICByZWNvcmQtPmR1bXAob3V0cHV0RmlsZUZkLCBhcmdzKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgICAgcmV0dXJuIGFuZHJvaWQ6Om1haW4oYXJnYywgYXJndiwgYW5kcm9pZDo6dGVzdFJlY29yZCk7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L3Rlc3RzL3Rlc3RfY3JlYXRlX2F1ZGlvdHJhY2suY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvdGVzdHMvdGVzdF9jcmVhdGVfYXVkaW90cmFjay5jcHAKaW5kZXggYjAzNTFiMi4uY2Y5YjkyNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvdGVzdHMvdGVzdF9jcmVhdGVfYXVkaW90cmFjay5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvdGVzdHMvdGVzdF9jcmVhdGVfYXVkaW90cmFjay5jcHAKQEAgLTE0LDEyICsxNCw2IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vKioKLSAqIEhhbmRsZSBhIERJU0NPTk5FQ1QgYnkgb25seSBvcGVuaW5nIGFuZCBzdGFydGluZyBhIG5ldyBzdHJlYW0KLSAqIHdpdGhvdXQgc3RvcHBpbmcgYW5kIGNsb3NpbmcgdGhlIG9sZCBvbmUuCi0gKiBUaGlzIGNhdXNlZCB0aGUgbmV3IHN0cmVhbSB0byB1c2UgdGhlIG9sZCBkaXNjb25uZWN0ZWQgZGV2aWNlLgotICovCi0KICNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CkBAIC0zMCw2OSArMjQsMTkgQEAKICNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5SGVhcEJhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1RyYWNrLmg+CiAKLSNkZWZpbmUgTUFYX0lOUFVUX0ZJTEVfTElORV9MRU5HVEggNTEyCi0jZGVmaW5lIE1BWF9PVVRQVVRfRklMRV9MSU5FX0xFTkdUSCA1MTIKKyNpbmNsdWRlICJ0ZXN0X2NyZWF0ZV91dGlscy5oIgogCiAjZGVmaW5lIE5VTV9BUkdVTUVOVFMgMTAKLSNkZWZpbmUgVkVSU0lPTl9LRVkgInZlcnNpb24iCiAjZGVmaW5lIFZFUlNJT05fVkFMVUUgIjEuMCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1pbnQgcmVhZExpbmUoRklMRSAqaW5wdXRGaWxlLCBjaGFyICpsaW5lLCBpbnQgc2l6ZSkgewotICAgIGludCByZXQgPSAwOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIGNoYXIgKnN0ciA9IGZnZXRzKGxpbmUsIHNpemUsIGlucHV0RmlsZSk7Ci0gICAgICAgIGlmIChzdHIgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgcmV0ID0gLTE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAoZmVvZihpbnB1dEZpbGUpICE9IDAgfHwgZmVycm9yKGlucHV0RmlsZSkgIT0gMCkgewotICAgICAgICAgICAgcmV0ID0gLTE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3RybGVuKHN0cikgIT0gMCAmJiBzdHJbMF0gIT0gJyMnKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQotCi1ib29sIGNoZWNrVmVyc2lvbihGSUxFICppbnB1dEZpbGUpCi17Ci0gICAgY2hhciBsaW5lW01BWF9JTlBVVF9GSUxFX0xJTkVfTEVOR1RIXTsKLSAgICBjaGFyIHZlcnNpb25LZXlbTUFYX0lOUFVUX0ZJTEVfTElORV9MRU5HVEhdOwotICAgIGNoYXIgdmVyc2lvblZhbHVlW01BWF9JTlBVVF9GSUxFX0xJTkVfTEVOR1RIXTsKLQotICAgIGlmIChyZWFkTGluZShpbnB1dEZpbGUsIGxpbmUsIE1BWF9JTlBVVF9GSUxFX0xJTkVfTEVOR1RIKSAhPSAwKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiTWlzc2luZyB2ZXJzaW9uIGluIGlucHV0IGZpbGVcbiIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKHNzY2FuZihsaW5lLCAiICVzICVzIiwgdmVyc2lvbktleSwgdmVyc2lvblZhbHVlKSAhPSAyKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiTWFsZm9ybWVkIHZlcnNpb24gaW4gaW5wdXQgZmlsZVxuIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKHN0cmNtcCh2ZXJzaW9uS2V5LCBWRVJTSU9OX0tFWSkgIT0gMCkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk1hbGZvcm1lZCB2ZXJzaW9uIGluIGlucHV0IGZpbGVcbiIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmIChzdHJjbXAodmVyc2lvblZhbHVlLCBWRVJTSU9OX1ZBTFVFKSAhPSAwKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiV3JvbmcgaW5wdXQgZmlsZSB2ZXJzaW9uICVzIGV4cGVjdGluZyAlc1xuIiwgdmVyc2lvblZhbHVlLCBWRVJTSU9OX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBjYWxsYmFjayhpbnQgZXZlbnQgX191bnVzZWQsIHZvaWQqIHVzZXIgX191bnVzZWQsIHZvaWQgKmluZm8gX191bnVzZWQpCi17Ci19Ci0KLXZvaWQgdGVzdFRyYWNrKEZJTEUgKmlucHV0RmlsZSwgaW50IG91dHB1dEZpbGVGZCkKK2ludCB0ZXN0VHJhY2soRklMRSAqaW5wdXRGaWxlLCBpbnQgb3V0cHV0RmlsZUZkKQogewogICAgIGNoYXIgbGluZVtNQVhfSU5QVVRfRklMRV9MSU5FX0xFTkdUSF07CiAgICAgdWludDMyX3QgdGVzdENvdW50ID0gMDsKICAgICBWZWN0b3I8U3RyaW5nMTY+IGFyZ3M7CisgICAgaW50IHJldCA9IDA7CiAKICAgICBpZiAoaW5wdXRGaWxlID09IG51bGxwdHIpIHsKICAgICAgICAgc3A8QXVkaW9UcmFjaz4gdHJhY2sgPSBuZXcgQXVkaW9UcmFjayhBVURJT19TVFJFQU1fREVGQVVMVCwKQEAgLTEwNSwxMiArNDksMTIgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHRyYWNrLT5kdW1wKG91dHB1dEZpbGVGZCwgYXJncyk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuOworICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKICAgICAvLyBjaGVjayB2ZXJzaW9uCi0gICAgaWYgKCFjaGVja1ZlcnNpb24oaW5wdXRGaWxlKSkgewotICAgICAgICByZXR1cm47CisgICAgaWYgKCFjaGVja1ZlcnNpb24oaW5wdXRGaWxlLCBWRVJTSU9OX1ZBTFVFKSkgeworICAgICAgICByZXR1cm4gMTsKICAgICB9CiAKICAgICB3aGlsZSAocmVhZExpbmUoaW5wdXRGaWxlLCBsaW5lLCBNQVhfSU5QVVRfRklMRV9MSU5FX0xFTkdUSCkgPT0gMCkgewpAQCAtMTM4LDYgKzgyLDcgQEAKICAgICAgICAgICAgICAgICAgICAmZnJhbWVDb3VudCwgJm5vdGlmaWNhdGlvbkZyYW1lcywgJnVzZVNoYXJlZEJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsICZzZXNzaW9uSWQsICZ1c2FnZSwgJmNvbnRlbnRUeXBlKSAhPSBOVU1fQVJHVU1FTlRTKSB7CiAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk1hbGZvcm1lZCBsaW5lIGZvciB0ZXN0ICMldSBpbiBpbnB1dCBmaWxlXG4iLCB0ZXN0Q291bnQrMSk7CisgICAgICAgICAgICByZXQgPSAxOwogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KICAgICAgICAgdGVzdENvdW50Kys7CkBAIC0xOTUsNiArMTQwLDcgQEAKICAgICAgICAgfQogICAgICAgICB0cmFjay0+ZHVtcChvdXRwdXRGaWxlRmQsIGFyZ3MpOwogICAgIH0KKyAgICByZXR1cm4gcmV0OwogfQogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApAQCAtMjAyLDU5ICsxNDgsNiBAQAogCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiB7Ci0gICAgRklMRSAqaW5wdXRGaWxlID0gbnVsbHB0cjsKLSAgICBpbnQgb3V0cHV0RmlsZUZkID0gU1RET1VUX0ZJTEVOTzsKLSAgICBtb2RlX3QgbW9kZSA9IFNfSVJVU1IgfCBTX0lXVVNSIHwgU19JUkdSUCB8IFNfSVJPVEg7Ci0gICAgaW50IHJldCA9IDA7Ci0KLSAgICBpZiAoYXJnYyA+IDUpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgWy1pIGlucHV0X3BhcmFtcy50eHRdIFstbyBvdXRwdXRfcGFyYW1zLnR4dF1cbiIsIGFyZ3ZbMF0pOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgICBhcmd2Kys7Ci0gICAgd2hpbGUgKCphcmd2KSB7Ci0gICAgICAgIGlmIChzdHJjbXAoKmFyZ3YsICItaSIpID09IDApIHsKLSAgICAgICAgICAgIGFyZ3YrKzsKLSAgICAgICAgICAgIGlmICgqYXJndikgewotICAgICAgICAgICAgICAgIGlucHV0RmlsZSA9IGZvcGVuKCphcmd2LCAiciIpOwotICAgICAgICAgICAgICAgIGlmIChpbnB1dEZpbGUgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgICAgICByZXQgPSAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0ID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoc3RyY21wKCphcmd2LCAiLW8iKSA9PSAwKSB7Ci0gICAgICAgICAgICBhcmd2Kys7Ci0gICAgICAgICAgICBpZiAoKmFyZ3YpIHsKLSAgICAgICAgICAgICAgICBvdXRwdXRGaWxlRmQgPSBvcGVuKCphcmd2LCBPX1dST05MWXxPX0NSRUFULCBtb2RlKTsKLSAgICAgICAgICAgICAgICBpZiAob3V0cHV0RmlsZUZkIDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXQgPSAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0ID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFyZ3YrKzsKLSAgICAgICAgfQotICAgICAgICBpZiAoKmFyZ3YpIHsKLSAgICAgICAgICAgIGFyZ3YrKzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChyZXQgIT0gMCkgewotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIGFuZHJvaWQ6OnRlc3RUcmFjayhpbnB1dEZpbGUsIG91dHB1dEZpbGVGZCk7Ci0KLSAgICBpZiAoaW5wdXRGaWxlKSB7Ci0gICAgICAgIGZjbG9zZShpbnB1dEZpbGUpOwotICAgIH0KLSAgICBpZiAob3V0cHV0RmlsZUZkID49IDAgJiYgb3V0cHV0RmlsZUZkICE9IFNURE9VVF9GSUxFTk8pIHsKLSAgICAgICAgY2xvc2Uob3V0cHV0RmlsZUZkKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmV0OworICAgIHJldHVybiBhbmRyb2lkOjptYWluKGFyZ2MsIGFyZ3YsIGFuZHJvaWQ6OnRlc3RUcmFjayk7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L3Rlc3RzL3Rlc3RfY3JlYXRlX3V0aWxzLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L3Rlc3RzL3Rlc3RfY3JlYXRlX3V0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWExZjEzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvdGVzdHMvdGVzdF9jcmVhdGVfdXRpbHMuY3BwCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgInRlc3RfY3JlYXRlX3V0aWxzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworaW50IHJlYWRMaW5lKEZJTEUgKmlucHV0RmlsZSwgY2hhciAqbGluZSwgaW50IHNpemUpIHsKKyAgICBpbnQgcmV0ID0gMDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBjaGFyICpzdHIgPSBmZ2V0cyhsaW5lLCBzaXplLCBpbnB1dEZpbGUpOworICAgICAgICBpZiAoc3RyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldCA9IC0xOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZlb2YoaW5wdXRGaWxlKSAhPSAwIHx8IGZlcnJvcihpbnB1dEZpbGUpICE9IDApIHsKKyAgICAgICAgICAgIHJldCA9IC0xOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cmxlbihzdHIpICE9IDAgJiYgc3RyWzBdICE9IENPTU1FTlRfQ0hBUikgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworYm9vbCBjaGVja1ZlcnNpb24oRklMRSAqaW5wdXRGaWxlLCBjb25zdCBjaGFyICp2ZXJzaW9uKQoreworICAgIGNoYXIgbGluZVtNQVhfSU5QVVRfRklMRV9MSU5FX0xFTkdUSF07CisgICAgY2hhciB2ZXJzaW9uS2V5W01BWF9JTlBVVF9GSUxFX0xJTkVfTEVOR1RIXTsKKyAgICBjaGFyIHZlcnNpb25WYWx1ZVtNQVhfSU5QVVRfRklMRV9MSU5FX0xFTkdUSF07CisKKyAgICBpZiAocmVhZExpbmUoaW5wdXRGaWxlLCBsaW5lLCBNQVhfSU5QVVRfRklMRV9MSU5FX0xFTkdUSCkgIT0gMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk1pc3NpbmcgdmVyc2lvbiBpbiBpbnB1dCBmaWxlXG4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChzc2NhbmYobGluZSwgIiAlcyAlcyIsIHZlcnNpb25LZXksIHZlcnNpb25WYWx1ZSkgIT0gMikgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk1hbGZvcm1lZCB2ZXJzaW9uIGluIGlucHV0IGZpbGVcbiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChzdHJjbXAodmVyc2lvbktleSwgVkVSU0lPTl9LRVkpICE9IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJNYWxmb3JtZWQgdmVyc2lvbiBpbiBpbnB1dCBmaWxlXG4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoc3RyY21wKHZlcnNpb25WYWx1ZSwgdmVyc2lvbikgIT0gMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIldyb25nIGlucHV0IGZpbGUgdmVyc2lvbiAlcyBleHBlY3RpbmcgJXNcbiIsIHZlcnNpb25WYWx1ZSwgdmVyc2lvbik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgY2FsbGJhY2soaW50IGV2ZW50IF9fdW51c2VkLCB2b2lkKiB1c2VyIF9fdW51c2VkLCB2b2lkICppbmZvIF9fdW51c2VkKQoreworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YsIHRlc3RfZnVuY190IHRlc3RGdW5jKQoreworICAgIEZJTEUgKmlucHV0RmlsZSA9IG51bGxwdHI7CisgICAgaW50IG91dHB1dEZpbGVGZCA9IFNURE9VVF9GSUxFTk87CisgICAgbW9kZV90IG1vZGUgPSBTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVJHUlAgfCBTX0lST1RIOworICAgIGludCByZXQgPSAwOworCisgICAgaWYgKGFyZ2MgPiA1KSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIFstaSBpbnB1dF9wYXJhbXMudHh0XSBbLW8gb3V0cHV0X3BhcmFtcy50eHRdXG4iLCBhcmd2WzBdKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgYXJndisrOworICAgIHdoaWxlICgqYXJndikgeworICAgICAgICBpZiAoc3RyY21wKCphcmd2LCAiLWkiKSA9PSAwKSB7CisgICAgICAgICAgICBhcmd2Kys7CisgICAgICAgICAgICBpZiAoKmFyZ3YpIHsKKyAgICAgICAgICAgICAgICBpbnB1dEZpbGUgPSBmb3BlbigqYXJndiwgInIiKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5wdXRGaWxlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cmNtcCgqYXJndiwgIi1vIikgPT0gMCkgeworICAgICAgICAgICAgYXJndisrOworICAgICAgICAgICAgaWYgKCphcmd2KSB7CisgICAgICAgICAgICAgICAgb3V0cHV0RmlsZUZkID0gb3BlbigqYXJndiwgT19XUk9OTFl8T19DUkVBVCwgbW9kZSk7CisgICAgICAgICAgICAgICAgaWYgKG91dHB1dEZpbGVGZCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhcmd2Kys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCphcmd2KSB7CisgICAgICAgICAgICBhcmd2Kys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXQgPSB0ZXN0RnVuYyhpbnB1dEZpbGUsIG91dHB1dEZpbGVGZCk7CisKKyAgICBpZiAoaW5wdXRGaWxlKSB7CisgICAgICAgIGZjbG9zZShpbnB1dEZpbGUpOworICAgIH0KKyAgICBpZiAob3V0cHV0RmlsZUZkID49IDAgJiYgb3V0cHV0RmlsZUZkICE9IFNURE9VVF9GSUxFTk8pIHsKKyAgICAgICAgY2xvc2Uob3V0cHV0RmlsZUZkKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC90ZXN0cy90ZXN0X2NyZWF0ZV91dGlscy5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvdGVzdHMvdGVzdF9jcmVhdGVfdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWQ2NDZlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvdGVzdHMvdGVzdF9jcmVhdGVfdXRpbHMuaApAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2RlZmluZSBNQVhfSU5QVVRfRklMRV9MSU5FX0xFTkdUSCA1MTIKKyNkZWZpbmUgTUFYX09VVFBVVF9GSUxFX0xJTkVfTEVOR1RIIDUxMgorCisjZGVmaW5lIENPTU1FTlRfQ0hBUiAnIycKKyNkZWZpbmUgVkVSU0lPTl9LRVkgInZlcnNpb24iCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworaW50IHJlYWRMaW5lKEZJTEUgKmlucHV0RmlsZSwgY2hhciAqbGluZSwgaW50IHNpemUpOworCitib29sIGNoZWNrVmVyc2lvbihGSUxFICppbnB1dEZpbGUsIGNvbnN0IGNoYXIgKnZlcnNpb24pOworCit2b2lkIGNhbGxiYWNrKGludCBldmVudCwgdm9pZCogdXNlciwgdm9pZCAqaW5mbyk7CisKK3R5cGVkZWYgaW50ICgqdGVzdF9mdW5jX3QpKEZJTEUgKmlucHV0RmlsZSwgaW50IG91dHB1dEZpbGVGZCk7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndiwgdGVzdF9mdW5jX3QgdGVzdEZ1bmMpOworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5LmMgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnkuYwppbmRleCBjZDBlNzY1Li5jMWNlNTEzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnkuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnkuYwpAQCAtMjYxLDcgKzI2MSw2IEBACiAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZCA9IE5VTEw7CiAgICAgZWZmZWN0X2hhbmRsZV90IGl0ZmU7CiAgICAgZWZmZWN0X2VudHJ5X3QgKmZ4OwotICAgIGludCBmb3VuZCA9IDA7CiAgICAgaW50IHJldDsKIAogICAgIGlmICh1dWlkID09IE5VTEwgfHwgcEhhbmRsZSA9PSBOVUxMKSB7CkBAIC00MjgsOCArNDI3LDYgQEAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogaW50IGluaXQoKSB7Ci0gICAgaW50IGhkbDsKLQogICAgIGlmIChnSW5pdERvbmUpIHsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQpAQCAtNTUyLDcgKzU0OSw2IEBACiAgICAgbGlzdF9lbGVtX3QgKmUgPSBnTGlicmFyeUxpc3Q7CiAgICAgbGliX2VudHJ5X3QgKmwgPSBOVUxMOwogICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmQgPSBOVUxMOwotICAgIGludCBmb3VuZCA9IDA7CiAgICAgaW50IHJldCA9IDA7CiAKICAgICBkcHJpbnRmKGZkLCAiTGlicmFyaWVzIGxvYWRlZDpcbiIpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5jcHAKaW5kZXggOGViYWUxMS4uMDRjMjY5MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuY3BwCkBAIC0xODksNyArMTg5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgIGlvSWQgX191bnVzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2hhbmRsZV90ICAqcEhhbmRsZSl7CiAgICAgaW50IHJldCA9IDA7Ci0gICAgaW50IHNlc3Npb25ObzsKKyAgICBpbnQgc2Vzc2lvbk5vID0gLTE7CiAgICAgaW50IGk7CiAgICAgRWZmZWN0Q29udGV4dCAqcENvbnRleHQgPSBOVUxMOwogICAgIGJvb2wgbmV3QnVuZGxlID0gZmFsc2U7CkBAIC0yMDksMjIgKzIwOSwyNyBAQAogICAgICAgICBMdm1HbG9iYWxCdW5kbGVfaW5pdCgpOwogICAgIH0KIAotICAgIC8vIEZpbmQgbmV4dCBhdmFpbGFibGUgc2Vzc2lvbk5vCisgICAgLy8gRmluZCBzZXNzaW9uTm86IGlmIG9uZSBhbHJlYWR5IGV4aXN0cyBmb3IgdGhlIHNlc3Npb25JZCB1c2UgaXQsCisgICAgLy8gb3RoZXJ3aXNlIGNob29zZSB0aGUgZmlyc3QgYXZhaWxhYmxlIGVtcHR5IHNsb3QuCiAgICAgZm9yKGk9MDsgaTxMVk1fTUFYX1NFU1NJT05TOyBpKyspewotICAgICAgICBpZigoU2Vzc2lvbkluZGV4W2ldID09IExWTV9VTlVTRURfU0VTU0lPTil8fChTZXNzaW9uSW5kZXhbaV0gPT0gc2Vzc2lvbklkKSl7Ci0gICAgICAgICAgICBzZXNzaW9uTm8gICAgICAgPSBpOwotICAgICAgICAgICAgU2Vzc2lvbkluZGV4W2ldID0gc2Vzc2lvbklkOwotICAgICAgICAgICAgQUxPR1YoIlx0RWZmZWN0Q3JlYXRlOiBBbGxvY2F0aW5nIFNlc3Npb25ObyAlZCBmb3IgU2Vzc2lvbklkICVkXG4iLCBzZXNzaW9uTm8sc2Vzc2lvbklkKTsKKyAgICAgICAgaWYgKFNlc3Npb25JbmRleFtpXSA9PSBzZXNzaW9uSWQpIHsKKyAgICAgICAgICAgIHNlc3Npb25ObyA9IGk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQorICAgICAgICBpZiAoc2Vzc2lvbk5vIDwgMCAmJiBTZXNzaW9uSW5kZXhbaV0gPT0gTFZNX1VOVVNFRF9TRVNTSU9OKSB7CisgICAgICAgICAgICBzZXNzaW9uTm8gPSBpOworICAgICAgICAgICAgLy8gZG8gbm90IGJyZWFrOyBhbGxvdyBsb29wIHRvIGNvbnRpbnVlIHRvIHNlYXJjaCBmb3IgYSBzZXNzaW9uSWQgbWF0Y2guCisgICAgICAgIH0KICAgICB9Ci0KLSAgICBpZihpPT1MVk1fTUFYX1NFU1NJT05TKXsKKyAgICBpZiAoc2Vzc2lvbk5vIDwgMCkgewogICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBDYW5ub3QgZmluZCBtZW1vcnkgdG8gYWxsb2NhdGUgZm9yIGN1cnJlbnQgc2Vzc2lvbiIpOwogICAgICAgICByZXQgPSAtRUlOVkFMOwogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQogCisgICAgU2Vzc2lvbkluZGV4W3Nlc3Npb25Ob10gPSBzZXNzaW9uSWQ7CisgICAgQUxPR1YoIlx0RWZmZWN0Q3JlYXRlOiBBbGxvY2F0aW5nIHNlc3Npb25ObyAlZCBmb3Igc2Vzc2lvbklkICVkXG4iLCBzZXNzaW9uTm8sIHNlc3Npb25JZCk7CisKICAgICBwQ29udGV4dCA9IG5ldyBFZmZlY3RDb250ZXh0OwogCiAgICAgLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3QgY3JlYXRlIGluIHRoaXMgc2Vzc2lvbgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0VmZmVjdFZpc3VhbGl6ZXIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0VmZmVjdFZpc3VhbGl6ZXIuY3BwCmluZGV4IDBlODIzMzkuLmMzM2Y5ZjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9FZmZlY3RWaXN1YWxpemVyLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvRWZmZWN0VmlzdWFsaXplci5jcHAKQEAgLTU5NCw3ICs1OTQsNyBAQAogICAgICAgICAgICAgICAgICAgICBkZWx0YVNtcGwgPSBDQVBUVVJFX0JVRl9TSVpFOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGludDMyX3QgY2FwdHVyZVBvaW50ID0gcENvbnRleHQtPm1DYXB0dXJlSWR4IC0gZGVsdGFTbXBsOworICAgICAgICAgICAgICAgIGludDMyX3QgY2FwdHVyZVBvaW50ID0gKGludDMyX3QpcENvbnRleHQtPm1DYXB0dXJlSWR4IC0gZGVsdGFTbXBsOwogICAgICAgICAgICAgICAgIC8vIGEgbmVnYXRpdmUgY2FwdHVyZVBvaW50IG1lYW5zIHdlIHdyYXAgdGhlIGJ1ZmZlci4KICAgICAgICAgICAgICAgICBpZiAoY2FwdHVyZVBvaW50IDwgMCkgewogICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzaXplID0gLWNhcHR1cmVQb2ludDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYS9BbmRyb2lkLmJwCmluZGV4IDFmNGJkMGEuLjBiNGZkMjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5icApAQCAtMTgwLDcgKzE4MCw2IEBACiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJ1aSIsCiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGliY3V0aWxzIiwKICAgICAgICAgImxpYnV0aWxzIiwKQEAgLTE5Niw4ICsxOTUsNiBAQAogICAgICAgICAibGliZGwiLAogICAgICAgICAibGliYXVkaW91dGlscyIsCiAgICAgICAgICJsaWJhdWRpb2NsaWVudCIsCi0gICAgICAgICJsaWJoaWRsYmFzZSIsCi0gICAgICAgICJsaWJoaWRsdHJhbnNwb3J0IiwKICAgICAgICAgImxpYm1lZGlhX29teCIsCiAgICAgXSwKIApAQCAtMjM2LDMgKzIzMywxNDcgQEAKICAgICAgICAgfSwKICAgICB9LAogfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYm1lZGlhX3BsYXllcjJfdXRpbCIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJCdWZmZXJpbmdTZXR0aW5ncy5jcHAiLAorICAgICAgICAiSURhdGFTb3VyY2UuY3BwIiwKKyAgICAgICAgIklNZWRpYUV4dHJhY3Rvci5jcHAiLAorICAgICAgICAiSU1lZGlhRXh0cmFjdG9yU2VydmljZS5jcHAiLAorICAgICAgICAiSU1lZGlhU291cmNlLmNwcCIsCisgICAgICAgICJJU3RyZWFtU291cmNlLmNwcCIsCisgICAgICAgICJNZWRpYVV0aWxzLmNwcCIsCisgICAgICAgICJNZXRhZGF0YS5jcHAiLAorICAgICAgICAiTmRrV3JhcHBlci5jcHAiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJndWkiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKKyAgICAgICAgImxpYm1lZGlhbmRrIiwKKyAgICAgICAgImxpYm5hdGl2ZXdpbmRvdyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnVpIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYm1lZGlhbmRrIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmNfbWFsbG9jX2RlYnVnX2JhY2t0cmFjZSIsICAvLyBmb3IgbWVtb3J5IGhlYXAgYW5hbHlzaXMKKworICAgICAgICAibGlic3RhZ2VmcmlnaHRfbnVwbGF5ZXIyIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3J0c3AiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfdGltZWR0ZXh0IiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV25vLWVycm9yPWRlcHJlY2F0ZWQtZGVjbGFyYXRpb25zIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgZGlhZzogeworICAgICAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICB9LAorICAgIH0sCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGlibWVkaWFfcGxheWVyMiIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJBdWRpb1BhcmFtZXRlci5jcHAiLAorICAgICAgICAiTWVkaWFQbGF5ZXIyRmFjdG9yeS5jcHAiLAorICAgICAgICAiTWVkaWFQbGF5ZXIyTWFuYWdlci5jcHAiLAorICAgICAgICAiVGVzdFBsYXllclN0dWIuY3BwIiwKKyAgICAgICAgIlR5cGVDb252ZXJ0ZXIuY3BwIiwKKyAgICAgICAgIm1lZGlhcGxheWVyMi5jcHAiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYXVkaW9jbGllbnQiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJndWkiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhX29teCIsCisgICAgICAgICJsaWJtZWRpYV9wbGF5ZXIyX3V0aWwiLAorICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJ1aSIsCisgICAgICAgICJsaWJ1dGlscyIsCisKKyAgICAgICAgImxpYmNyeXB0byIsCisgICAgICAgICJsaWJtZWRpYWRybSIsCisgICAgICAgICJsaWJtZWRpYW1ldHJpY3MiLAorICAgICAgICAibGlibWVkaWFuZGsiLAorICAgICAgICAibGlibWVkaWF1dGlscyIsCisgICAgICAgICJsaWJtZW11bnJlYWNoYWJsZSIsCisgICAgICAgICJsaWJuYXRpdmV3aW5kb3ciLAorICAgICAgICAibGlicG93ZXJtYW5hZ2VyIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2h0dHBsaXZlIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3BsYXllcjIiLAorICAgIF0sCisKKyAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJhdWRpb2NsaWVudCIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGlibWVkaWFfb214IiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmNfbWFsbG9jX2RlYnVnX2JhY2t0cmFjZSIsICAvLyBmb3IgbWVtb3J5IGhlYXAgYW5hbHlzaXMKKworICAgICAgICAibGlic3RhZ2VmcmlnaHRfbnVwbGF5ZXIyIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3J0c3AiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfdGltZWR0ZXh0IiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV25vLWVycm9yPWRlcHJlY2F0ZWQtZGVjbGFyYXRpb25zIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgZGlhZzogeworICAgICAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICB9LAorICAgIH0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5jcHAKaW5kZXggMDYyYTA3YS4uNzRkOGVlOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmNwcApAQCAtMzQsNyArMzQsNyBAQAogICAgICAgICA6IEJwSW50ZXJmYWNlPElNZWRpYUhUVFBTZXJ2aWNlPihpbXBsKSB7CiAgICAgfQogCi0gICAgdmlydHVhbCBzcDxJTWVkaWFIVFRQQ29ubmVjdGlvbj4gbWFrZUhUVFBDb25uZWN0aW9uKCkgeworICAgIHZpcnR1YWwgc3A8TWVkaWFIVFRQQ29ubmVjdGlvbj4gbWFrZUhUVFBDb25uZWN0aW9uKCkgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbigKICAgICAgICAgICAgICAgICBJTWVkaWFIVFRQU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVNvdXJjZS5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFTb3VyY2UuY3BwCmluZGV4IGJjNzg4OTIuLjBkNTEyN2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhU291cmNlLmNwcApAQCAtMjEyLDExICsyMTIsNiBAQAogICAgICAgICByZXR1cm4gcmVtb3RlKCktPnRyYW5zYWN0KFBBVVNFLCBkYXRhLCAmcmVwbHkpOwogICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QnVmZmVycyhjb25zdCBWZWN0b3I8TWVkaWFCdWZmZXIgKj4gJiBidWZmZXJzIF9fdW51c2VkKSB7Ci0gICAgICAgIEFMT0dWKCJzZXRCdWZmZXJzIE5PVCBJTVBMRU1FTlRFRCIpOwotICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7IC8vIGRlZmF1bHQKLSAgICB9Ci0KIHByaXZhdGU6CiAKICAgICB1aW50MzJfdCBtQnVmZmVyc1NpbmNlU3RvcDsgLy8gQnVmZmVyIHRyYWNraW5nIHZhcmlhYmxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JU3RyZWFtU291cmNlLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lTdHJlYW1Tb3VyY2UuY3BwCmluZGV4IGJhMGEyNzIuLmUxMWJjNzQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lTdHJlYW1Tb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lTdHJlYW1Tb3VyY2UuY3BwCkBAIC0yMCwyNCArMjAsMTMgQEAKIAogI2luY2x1ZGUgPG1lZGlhL0lTdHJlYW1Tb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYUtleXMuaD4KIAogI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLS8vIHN0YXRpYwotY29uc3QgY2hhciAqY29uc3QgSVN0cmVhbUxpc3RlbmVyOjprS2V5UmVzdW1lQXRQVFMgPSAicmVzdW1lLWF0LVBUUyI7Ci0KLS8vIHN0YXRpYwotY29uc3QgY2hhciAqY29uc3QgSVN0cmVhbUxpc3RlbmVyOjprS2V5RGlzY29udGludWl0eU1hc2sgPSAiZGlzY29udGludWl0eS1tYXNrIjsKLQotLy8gc3RhdGljCi1jb25zdCBjaGFyICpjb25zdCBJU3RyZWFtTGlzdGVuZXI6OmtLZXlNZWRpYVRpbWVVcyA9ICJtZWRpYS10aW1lLXVzIjsKLQotLy8gc3RhdGljCi1jb25zdCBjaGFyICpjb25zdCBJU3RyZWFtTGlzdGVuZXI6OmtLZXlSZWNlbnRNZWRpYVRpbWVVcyA9ICJyZWNlbnQtbWVkaWEtdGltZS11cyI7Ci0KIGVudW0gewogICAgIC8vIElTdHJlYW1Tb3VyY2UKICAgICBTRVRfTElTVEVORVIgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTWVkaWFQbGF5ZXIyRmFjdG9yeS5jcHAgYi9tZWRpYS9saWJtZWRpYS9NZWRpYVBsYXllcjJGYWN0b3J5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmFhYjcwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFQbGF5ZXIyRmFjdG9yeS5jcHAKQEAgLTAsMCArMSwyNjIgQEAKKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMTcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTWVkaWFQbGF5ZXIyRmFjdG9yeSIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhUGxheWVyMkVuZ2luZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KKworI2luY2x1ZGUgIk1lZGlhUGxheWVyMkZhY3RvcnkuaCIKKworI2luY2x1ZGUgIlRlc3RQbGF5ZXJTdHViLmgiCisjaW5jbHVkZSAibnVwbGF5ZXIyL051UGxheWVyMkRyaXZlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK011dGV4IE1lZGlhUGxheWVyMkZhY3Rvcnk6OnNMb2NrOworTWVkaWFQbGF5ZXIyRmFjdG9yeTo6dEZhY3RvcnlNYXAgTWVkaWFQbGF5ZXIyRmFjdG9yeTo6c0ZhY3RvcnlNYXA7Citib29sIE1lZGlhUGxheWVyMkZhY3Rvcnk6OnNJbml0Q29tcGxldGUgPSBmYWxzZTsKKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyRmFjdG9yeTo6cmVnaXN0ZXJGYWN0b3J5X2woSUZhY3RvcnkqIGZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXIyX3R5cGUgdHlwZSkgeworICAgIGlmIChOVUxMID09IGZhY3RvcnkpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZWdpc3RlciBNZWRpYVBsYXllcjJGYWN0b3J5IG9mIHR5cGUgJWQsIGZhY3RvcnkgaXMiCisgICAgICAgICAgICAgICIgTlVMTC4iLCB0eXBlKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAoc0ZhY3RvcnlNYXAuaW5kZXhPZktleSh0eXBlKSA+PSAwKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmVnaXN0ZXIgTWVkaWFQbGF5ZXIyRmFjdG9yeSBvZiB0eXBlICVkLCB0eXBlIGlzIgorICAgICAgICAgICAgICAiIGFscmVhZHkgcmVnaXN0ZXJlZC4iLCB0eXBlKTsKKyAgICAgICAgcmV0dXJuIEFMUkVBRFlfRVhJU1RTOworICAgIH0KKworICAgIGlmIChzRmFjdG9yeU1hcC5hZGQodHlwZSwgZmFjdG9yeSkgPCAwKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmVnaXN0ZXIgTWVkaWFQbGF5ZXIyRmFjdG9yeSBvZiB0eXBlICVkLCBmYWlsZWQgdG8gYWRkIgorICAgICAgICAgICAgICAiIHRvIG1hcC4iLCB0eXBlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0aWMgcGxheWVyMl90eXBlIGdldERlZmF1bHRQbGF5ZXJUeXBlKCkgeworICAgIHJldHVybiBQTEFZRVIyX05VX1BMQVlFUjI7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMkZhY3Rvcnk6OnJlZ2lzdGVyRmFjdG9yeShJRmFjdG9yeSogZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXIyX3R5cGUgdHlwZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrXygmc0xvY2spOworICAgIHJldHVybiByZWdpc3RlckZhY3RvcnlfbChmYWN0b3J5LCB0eXBlKTsKK30KKwordm9pZCBNZWRpYVBsYXllcjJGYWN0b3J5Ojp1bnJlZ2lzdGVyRmFjdG9yeShwbGF5ZXIyX3R5cGUgdHlwZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrXygmc0xvY2spOworICAgIHNGYWN0b3J5TWFwLnJlbW92ZUl0ZW0odHlwZSk7Cit9CisKKyNkZWZpbmUgR0VUX1BMQVlFUl9UWVBFX0lNUEwoYS4uLikgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE11dGV4OjpBdXRvbG9jayBsb2NrXygmc0xvY2spOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBwbGF5ZXIyX3R5cGUgcmV0ID0gUExBWUVSMl9TVEFHRUZSSUdIVF9QTEFZRVI7ICAgICAgXAorICAgIGZsb2F0IGJlc3RTY29yZSA9IDAuMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNGYWN0b3J5TWFwLnNpemUoKTsgKytpKSB7ICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIElGYWN0b3J5KiB2ID0gc0ZhY3RvcnlNYXAudmFsdWVBdChpKTsgICAgICAgICAgIFwKKyAgICAgICAgZmxvYXQgdGhpc1Njb3JlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBDSEVDSyh2ICE9IE5VTEwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRoaXNTY29yZSA9IHYtPnNjb3JlRmFjdG9yeShhLCBiZXN0U2NvcmUpOyAgICAgIFwKKyAgICAgICAgaWYgKHRoaXNTY29yZSA+IGJlc3RTY29yZSkgeyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmV0ID0gc0ZhY3RvcnlNYXAua2V5QXQoaSk7ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBiZXN0U2NvcmUgPSB0aGlzU2NvcmU7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoMC4wID09IGJlc3RTY29yZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXQgPSBnZXREZWZhdWx0UGxheWVyVHlwZSgpOyAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiByZXQ7CisKK3BsYXllcjJfdHlwZSBNZWRpYVBsYXllcjJGYWN0b3J5OjpnZXRQbGF5ZXJUeXBlKGNvbnN0IHNwPE1lZGlhUGxheWVyMkVuZ2luZT4mIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdXJsKSB7CisgICAgR0VUX1BMQVlFUl9UWVBFX0lNUEwoY2xpZW50LCB1cmwpOworfQorCitwbGF5ZXIyX3R5cGUgTWVkaWFQbGF5ZXIyRmFjdG9yeTo6Z2V0UGxheWVyVHlwZShjb25zdCBzcDxNZWRpYVBsYXllcjJFbmdpbmU+JiBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgbGVuZ3RoKSB7CisgICAgR0VUX1BMQVlFUl9UWVBFX0lNUEwoY2xpZW50LCBmZCwgb2Zmc2V0LCBsZW5ndGgpOworfQorCitwbGF5ZXIyX3R5cGUgTWVkaWFQbGF5ZXIyRmFjdG9yeTo6Z2V0UGxheWVyVHlwZShjb25zdCBzcDxNZWRpYVBsYXllcjJFbmdpbmU+JiBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJU3RyZWFtU291cmNlPiAmc291cmNlKSB7CisgICAgR0VUX1BMQVlFUl9UWVBFX0lNUEwoY2xpZW50LCBzb3VyY2UpOworfQorCitwbGF5ZXIyX3R5cGUgTWVkaWFQbGF5ZXIyRmFjdG9yeTo6Z2V0UGxheWVyVHlwZShjb25zdCBzcDxNZWRpYVBsYXllcjJFbmdpbmU+JiBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKSB7CisgICAgR0VUX1BMQVlFUl9UWVBFX0lNUEwoY2xpZW50LCBzb3VyY2UpOworfQorCisjdW5kZWYgR0VUX1BMQVlFUl9UWVBFX0lNUEwKKworc3A8TWVkaWFQbGF5ZXIyQmFzZT4gTWVkaWFQbGF5ZXIyRmFjdG9yeTo6Y3JlYXRlUGxheWVyKAorICAgICAgICBwbGF5ZXIyX3R5cGUgcGxheWVyVHlwZSwKKyAgICAgICAgY29uc3Qgd3A8TWVkaWFQbGF5ZXIyRW5naW5lPiAmY2xpZW50LAorICAgICAgICBNZWRpYVBsYXllcjJCYXNlOjpOb3RpZnlDYWxsYmFjayBub3RpZnlGdW5jLAorICAgICAgICBwaWRfdCBwaWQpIHsKKyAgICBzcDxNZWRpYVBsYXllcjJCYXNlPiBwOworICAgIElGYWN0b3J5KiBmYWN0b3J5OworICAgIHN0YXR1c190IGluaXRfcmVzdWx0OworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrXygmc0xvY2spOworCisgICAgaWYgKHNGYWN0b3J5TWFwLmluZGV4T2ZLZXkocGxheWVyVHlwZSkgPCAwKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY3JlYXRlIHBsYXllciBvYmplY3Qgb2YgdHlwZSAlZCwgbm8gcmVnaXN0ZXJlZCIKKyAgICAgICAgICAgICAgIiBmYWN0b3J5IiwgcGxheWVyVHlwZSk7CisgICAgICAgIHJldHVybiBwOworICAgIH0KKworICAgIGZhY3RvcnkgPSBzRmFjdG9yeU1hcC52YWx1ZUZvcihwbGF5ZXJUeXBlKTsKKyAgICBDSEVDSyhOVUxMICE9IGZhY3RvcnkpOworICAgIHAgPSBmYWN0b3J5LT5jcmVhdGVQbGF5ZXIocGlkKTsKKworICAgIGlmIChwID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjcmVhdGUgcGxheWVyIG9iamVjdCBvZiB0eXBlICVkLCBjcmVhdGUgZmFpbGVkIiwKKyAgICAgICAgICAgICAgcGxheWVyVHlwZSk7CisgICAgICAgIHJldHVybiBwOworICAgIH0KKworICAgIGluaXRfcmVzdWx0ID0gcC0+aW5pdENoZWNrKCk7CisgICAgaWYgKGluaXRfcmVzdWx0ID09IE5PX0VSUk9SKSB7CisgICAgICAgIHAtPnNldE5vdGlmeUNhbGxiYWNrKGNsaWVudCwgbm90aWZ5RnVuYyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjcmVhdGUgcGxheWVyIG9iamVjdCBvZiB0eXBlICVkLCBpbml0Q2hlY2sgZmFpbGVkIgorICAgICAgICAgICAgICAiIChyZXMgPSAlZCkiLCBwbGF5ZXJUeXBlLCBpbml0X3Jlc3VsdCk7CisgICAgICAgIHAuY2xlYXIoKTsKKyAgICB9CisKKyAgICByZXR1cm4gcDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgQnVpbHQtSW4gRmFjdG9yeSBJbXBsZW1lbnRhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2NsYXNzIE51UGxheWVyMkZhY3RvcnkgOiBwdWJsaWMgTWVkaWFQbGF5ZXIyRmFjdG9yeTo6SUZhY3RvcnkgeworICBwdWJsaWM6CisgICAgdmlydHVhbCBmbG9hdCBzY29yZUZhY3RvcnkoY29uc3Qgc3A8TWVkaWFQbGF5ZXIyRW5naW5lPiYgLypjbGllbnQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB1cmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgY3VyU2NvcmUpIHsKKyAgICAgICAgc3RhdGljIGNvbnN0IGZsb2F0IGtPdXJTY29yZSA9IDAuODsKKworICAgICAgICBpZiAoa091clNjb3JlIDw9IGN1clNjb3JlKSB7CisgICAgICAgICAgICByZXR1cm4gMC4wOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFzdHJuY2FzZWNtcCgiaHR0cDovLyIsIHVybCwgNykKKyAgICAgICAgICAgICAgICB8fCAhc3RybmNhc2VjbXAoImh0dHBzOi8vIiwgdXJsLCA4KQorICAgICAgICAgICAgICAgIHx8ICFzdHJuY2FzZWNtcCgiZmlsZTovLyIsIHVybCwgNykpIHsKKyAgICAgICAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4odXJsKTsKKyAgICAgICAgICAgIGlmIChsZW4gPj0gNSAmJiAhc3RyY2FzZWNtcCgiLm0zdTgiLCAmdXJsW2xlbiAtIDVdKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBrT3VyU2NvcmU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzdHJzdHIodXJsLCJtM3U4IikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4ga091clNjb3JlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKGxlbiA+PSA0ICYmICFzdHJjYXNlY21wKCIuc2RwIiwgJnVybFtsZW4gLSA0XSkpIHx8IHN0cnN0cih1cmwsICIuc2RwPyIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGtPdXJTY29yZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghc3RybmNhc2VjbXAoInJ0c3A6Ly8iLCB1cmwsIDcpKSB7CisgICAgICAgICAgICByZXR1cm4ga091clNjb3JlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIDAuMDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGZsb2F0IHNjb3JlRmFjdG9yeShjb25zdCBzcDxNZWRpYVBsYXllcjJFbmdpbmU+JiAvKmNsaWVudCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElTdHJlYW1Tb3VyY2U+JiAvKnNvdXJjZSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IC8qY3VyU2NvcmUqLykgeworICAgICAgICByZXR1cm4gMS4wOworICAgIH0KKworICAgIHZpcnR1YWwgZmxvYXQgc2NvcmVGYWN0b3J5KGNvbnN0IHNwPE1lZGlhUGxheWVyMkVuZ2luZT4mIC8qY2xpZW50Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4mIC8qc291cmNlKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgLypjdXJTY29yZSovKSB7CisgICAgICAgIC8vIE9ubHkgTnVQbGF5ZXIyIHN1cHBvcnRzIHNldHRpbmcgYSBEYXRhU291cmNlIHNvdXJjZSBkaXJlY3RseS4KKyAgICAgICAgcmV0dXJuIDEuMDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHNwPE1lZGlhUGxheWVyMkJhc2U+IGNyZWF0ZVBsYXllcihwaWRfdCBwaWQpIHsKKyAgICAgICAgQUxPR1YoIiBjcmVhdGUgTnVQbGF5ZXIyIik7CisgICAgICAgIHJldHVybiBuZXcgTnVQbGF5ZXIyRHJpdmVyKHBpZCk7CisgICAgfQorfTsKKworY2xhc3MgVGVzdFBsYXllckZhY3RvcnkgOiBwdWJsaWMgTWVkaWFQbGF5ZXIyRmFjdG9yeTo6SUZhY3RvcnkgeworICBwdWJsaWM6CisgICAgdmlydHVhbCBmbG9hdCBzY29yZUZhY3RvcnkoY29uc3Qgc3A8TWVkaWFQbGF5ZXIyRW5naW5lPiYgLypjbGllbnQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB1cmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgLypjdXJTY29yZSovKSB7CisgICAgICAgIGlmIChUZXN0UGxheWVyU3R1Yjo6Y2FuQmVVc2VkKHVybCkpIHsKKyAgICAgICAgICAgIHJldHVybiAxLjA7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gMC4wOworICAgIH0KKworICAgIHZpcnR1YWwgc3A8TWVkaWFQbGF5ZXIyQmFzZT4gY3JlYXRlUGxheWVyKHBpZF90IC8qIHBpZCAqLykgeworICAgICAgICBBTE9HVigiQ3JlYXRlIFRlc3QgUGxheWVyIHN0dWIiKTsKKyAgICAgICAgcmV0dXJuIG5ldyBUZXN0UGxheWVyU3R1YigpOworICAgIH0KK307CisKK3ZvaWQgTWVkaWFQbGF5ZXIyRmFjdG9yeTo6cmVnaXN0ZXJCdWlsdGluRmFjdG9yaWVzKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrXygmc0xvY2spOworCisgICAgaWYgKHNJbml0Q29tcGxldGUpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIElGYWN0b3J5KiBmYWN0b3J5ID0gbmV3IE51UGxheWVyMkZhY3RvcnkoKTsKKyAgICBpZiAocmVnaXN0ZXJGYWN0b3J5X2woZmFjdG9yeSwgUExBWUVSMl9OVV9QTEFZRVIyKSAhPSBPSykgeworICAgICAgICBkZWxldGUgZmFjdG9yeTsKKyAgICB9CisgICAgZmFjdG9yeSA9IG5ldyBUZXN0UGxheWVyRmFjdG9yeSgpOworICAgIGlmIChyZWdpc3RlckZhY3RvcnlfbChmYWN0b3J5LCBQTEFZRVIyX1RFU1RfUExBWUVSKSAhPSBPSykgeworICAgICAgICBkZWxldGUgZmFjdG9yeTsKKyAgICB9CisKKyAgICBzSW5pdENvbXBsZXRlID0gdHJ1ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL01lZGlhUGxheWVyMkZhY3RvcnkuaCBiL21lZGlhL2xpYm1lZGlhL01lZGlhUGxheWVyMkZhY3RvcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTliNWYzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFQbGF5ZXIyRmFjdG9yeS5oCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMTcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQVBMQVlFUjJGQUNUT1JZX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQVBMQVlFUjJGQUNUT1JZX0gKKworI2luY2x1ZGUgPG1lZGlhL01lZGlhUGxheWVyMkludGVyZmFjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNZWRpYVBsYXllcjJGYWN0b3J5IHsKKyAgcHVibGljOgorICAgIGNsYXNzIElGYWN0b3J5IHsKKyAgICAgIHB1YmxpYzoKKyAgICAgICAgdmlydHVhbCB+SUZhY3RvcnkoKSB7IH0KKworICAgICAgICB2aXJ0dWFsIGZsb2F0IHNjb3JlRmFjdG9yeShjb25zdCBzcDxNZWRpYVBsYXllcjJFbmdpbmU+JiAvKmNsaWVudCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAvKnVybCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAvKmN1clNjb3JlKi8pIHsgcmV0dXJuIDAuMDsgfQorCisgICAgICAgIHZpcnR1YWwgZmxvYXQgc2NvcmVGYWN0b3J5KGNvbnN0IHNwPE1lZGlhUGxheWVyMkVuZ2luZT4mIC8qY2xpZW50Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKmZkKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgLypvZmZzZXQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAvKmxlbmd0aCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAvKmN1clNjb3JlKi8pIHsgcmV0dXJuIDAuMDsgfQorCisgICAgICAgIHZpcnR1YWwgZmxvYXQgc2NvcmVGYWN0b3J5KGNvbnN0IHNwPE1lZGlhUGxheWVyMkVuZ2luZT4mIC8qY2xpZW50Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElTdHJlYW1Tb3VyY2U+ICYvKnNvdXJjZSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAvKmN1clNjb3JlKi8pIHsgcmV0dXJuIDAuMDsgfQorCisgICAgICAgIHZpcnR1YWwgZmxvYXQgc2NvcmVGYWN0b3J5KGNvbnN0IHNwPE1lZGlhUGxheWVyMkVuZ2luZT4mIC8qY2xpZW50Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICYvKnNvdXJjZSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAvKmN1clNjb3JlKi8pIHsgcmV0dXJuIDAuMDsgfQorCisgICAgICAgIHZpcnR1YWwgc3A8TWVkaWFQbGF5ZXIyQmFzZT4gY3JlYXRlUGxheWVyKHBpZF90IHBpZCkgPSAwOworICAgIH07CisKKyAgICBzdGF0aWMgc3RhdHVzX3QgcmVnaXN0ZXJGYWN0b3J5KElGYWN0b3J5KiBmYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyMl90eXBlIHR5cGUpOworICAgIHN0YXRpYyB2b2lkIHVucmVnaXN0ZXJGYWN0b3J5KHBsYXllcjJfdHlwZSB0eXBlKTsKKyAgICBzdGF0aWMgcGxheWVyMl90eXBlIGdldFBsYXllclR5cGUoY29uc3Qgc3A8TWVkaWFQbGF5ZXIyRW5naW5lPiYgY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB1cmwpOworICAgIHN0YXRpYyBwbGF5ZXIyX3R5cGUgZ2V0UGxheWVyVHlwZShjb25zdCBzcDxNZWRpYVBsYXllcjJFbmdpbmU+JiBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgbGVuZ3RoKTsKKyAgICBzdGF0aWMgcGxheWVyMl90eXBlIGdldFBsYXllclR5cGUoY29uc3Qgc3A8TWVkaWFQbGF5ZXIyRW5naW5lPiYgY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJU3RyZWFtU291cmNlPiAmc291cmNlKTsKKyAgICBzdGF0aWMgcGxheWVyMl90eXBlIGdldFBsYXllclR5cGUoY29uc3Qgc3A8TWVkaWFQbGF5ZXIyRW5naW5lPiYgY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKTsKKworICAgIHN0YXRpYyBzcDxNZWRpYVBsYXllcjJCYXNlPiBjcmVhdGVQbGF5ZXIocGxheWVyMl90eXBlIHBsYXllclR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3cDxNZWRpYVBsYXllcjJFbmdpbmU+ICZjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVBsYXllcjJCYXNlOjpOb3RpZnlDYWxsYmFjayBub3RpZnlGdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkKTsKKworICAgIHN0YXRpYyB2b2lkIHJlZ2lzdGVyQnVpbHRpbkZhY3RvcmllcygpOworCisgIHByaXZhdGU6CisgICAgdHlwZWRlZiBLZXllZFZlY3RvcjxwbGF5ZXIyX3R5cGUsIElGYWN0b3J5Kj4gdEZhY3RvcnlNYXA7CisKKyAgICBNZWRpYVBsYXllcjJGYWN0b3J5KCkgeyB9CisKKyAgICBzdGF0aWMgc3RhdHVzX3QgcmVnaXN0ZXJGYWN0b3J5X2woSUZhY3RvcnkqIGZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllcjJfdHlwZSB0eXBlKTsKKworICAgIHN0YXRpYyBNdXRleCAgICAgICBzTG9jazsKKyAgICBzdGF0aWMgdEZhY3RvcnlNYXAgc0ZhY3RvcnlNYXA7CisgICAgc3RhdGljIGJvb2wgICAgICAgIHNJbml0Q29tcGxldGU7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNZWRpYVBsYXllcjJGYWN0b3J5KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisjZW5kaWYgIC8vIEFORFJPSURfTUVESUFQTEFZRVIyRkFDVE9SWV9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9NZWRpYVBsYXllcjJNYW5hZ2VyLmNwcCBiL21lZGlhL2xpYm1lZGlhL01lZGlhUGxheWVyMk1hbmFnZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2YWQ5OWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9NZWRpYVBsYXllcjJNYW5hZ2VyLmNwcApAQCAtMCwwICsxLDIzOTMgQEAKKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMTcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKy8vIFByb3h5IGZvciBtZWRpYSBwbGF5ZXIgaW1wbGVtZW50YXRpb25zCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTWVkaWFQbGF5ZXIyTWFuYWdlciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Y3V0aWxzL2F0b21pYy5oPgorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+IC8vIGZvciBwcm9wZXJ0eV9nZXQKKworI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KKworI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5SGVhcEJhc2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5QmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPiAgLy8gZm9yIHN0YXR1c190CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL1N5c3RlbUNsb2NrLmg+CisjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeUhlbHBlci5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhSFRUUFNlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVBsYXllcjJFbmdpbmVDbGllbnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVBsYXllcjJJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZXRhZGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVHJhY2suaD4KKyNpbmNsdWRlIDxtZWRpYS9NZW1vcnlMZWFrVHJhY2tVdGlsLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrV3JhcHBlci5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvSW50ZXJmYWNlVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3BlclJvc3Rlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1N1cmZhY2VVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvQmF0dGVyeU5vdGlmaWVyLmg+CisKKyNpbmNsdWRlIDxtZW11bnJlYWNoYWJsZS9tZW11bnJlYWNoYWJsZS5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorCisjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CisKKyNpbmNsdWRlICJNZWRpYVBsYXllcjJNYW5hZ2VyLmgiCisjaW5jbHVkZSAiTWVkaWFQbGF5ZXIyRmFjdG9yeS5oIgorCitzdGF0aWMgY29uc3QgaW50IGtEdW1wTG9ja1JldHJpZXMgPSA1MDsKK3N0YXRpYyBjb25zdCBpbnQga0R1bXBMb2NrU2xlZXBVcyA9IDIwMDAwOworCituYW1lc3BhY2UgewordXNpbmcgYW5kcm9pZDo6bWVkaWE6Ok1ldGFkYXRhOwordXNpbmcgYW5kcm9pZDo6c3RhdHVzX3Q7Cit1c2luZyBhbmRyb2lkOjpPSzsKK3VzaW5nIGFuZHJvaWQ6OkJBRF9WQUxVRTsKK3VzaW5nIGFuZHJvaWQ6Ok5PVF9FTk9VR0hfREFUQTsKK3VzaW5nIGFuZHJvaWQ6OlBhcmNlbDsKK3VzaW5nIGFuZHJvaWQ6Om1lZGlhOjpWb2x1bWVTaGFwZXI7CisKKy8vIE1heCBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgZmlsdGVyLgorY29uc3QgaW50IGtNYXhGaWx0ZXJTaXplID0gNjQ7ICAvLyBJIHB1bGxlZCB0aGF0IG91dCBvZiB0aGluIGFpci4KKworY29uc3QgZmxvYXQga01heFJlcXVpcmVkU3BlZWQgPSA4LjBmOyAvLyBmb3IgUENNIHRyYWNrcyBhbGxvdyB1cCB0byA4eCBzcGVlZHVwLgorCisvLyBGSVhNRTogTW92ZSBhbGwgdGhlIG1ldGFkYXRhIHJlbGF0ZWQgZnVuY3Rpb24gaW4gdGhlIE1ldGFkYXRhLmNwcAorCisKKy8vIFVubWFyc2hhbGwgYSBmaWx0ZXIgZnJvbSBhIFBhcmNlbC4KKy8vIEZpbHRlciBmb3JtYXQgaW4gYSBwYXJjZWw6CisvLworLy8gIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKy8vIHwgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciBvZiBlbnRyaWVzIChuKSAgICAgICAgICAgICAgICAgICB8CisvLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworLy8gfCAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEgdHlwZSAxICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisvLyB8ICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSB0eXBlIDIgICAgICAgICAgICAgICAgICAgICAgICAgfAorLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKy8vICAuLi4uCisvLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworLy8gfCAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEgdHlwZSBuICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisvLworLy8gQHBhcmFtIHAgUGFyY2VsIHRoYXQgc2hvdWxkIHN0YXJ0IHdpdGggYSBmaWx0ZXIuCisvLyBAcGFyYW1bb3V0XSBmaWx0ZXIgT24gZXhpdCBjb250YWlucyB0aGUgbGlzdCBvZiBtZXRhZGF0YSB0eXBlIHRvIGJlCisvLyAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWQuCisvLyBAcGFyYW1bb3V0XSBzdGF0dXMgT24gZXhpdCBjb250YWlucyB0aGUgc3RhdHVzIGNvZGUgdG8gYmUgcmV0dXJuZWQuCisvLyBAcmV0dXJuIHRydWUgaWYgdGhlIHBhcmNlbCBzdGFydHMgd2l0aCBhIHZhbGlkIGZpbHRlci4KK2Jvb2wgdW5tYXJzaGFsbEZpbHRlcihjb25zdCBQYXJjZWwmIHAsCisgICAgICAgICAgICAgICAgICAgICAgTWV0YWRhdGE6OkZpbHRlciAqZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMpCit7CisgICAgaW50MzJfdCB2YWw7CisgICAgaWYgKHAucmVhZEludDMyKCZ2YWwpICE9IE9LKQorICAgIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZWFkIGZpbHRlcidzIGxlbmd0aCIpOworICAgICAgICAqc3RhdHVzID0gTk9UX0VOT1VHSF9EQVRBOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYoIHZhbCA+IGtNYXhGaWx0ZXJTaXplIHx8IHZhbCA8IDApCisgICAgeworICAgICAgICBBTE9HRSgiSW52YWxpZCBmaWx0ZXIgbGVuICVkIiwgdmFsKTsKKyAgICAgICAgKnN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGNvbnN0IHNpemVfdCBudW0gPSB2YWw7CisKKyAgICBmaWx0ZXItPmNsZWFyKCk7CisgICAgZmlsdGVyLT5zZXRDYXBhY2l0eShudW0pOworCisgICAgc2l6ZV90IHNpemUgPSBudW0gKiBzaXplb2YoTWV0YWRhdGE6OlR5cGUpOworCisKKyAgICBpZiAocC5kYXRhQXZhaWwoKSA8IHNpemUpCisgICAgeworICAgICAgICBBTE9HRSgiRmlsdGVyIHRvbyBzaG9ydCBleHBlY3RlZCAlenUgYnV0IGdvdCAlenUiLCBzaXplLCBwLmRhdGFBdmFpbCgpKTsKKyAgICAgICAgKnN0YXR1cyA9IE5PVF9FTk9VR0hfREFUQTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGNvbnN0IE1ldGFkYXRhOjpUeXBlICpkYXRhID0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IE1ldGFkYXRhOjpUeXBlKj4ocC5yZWFkSW5wbGFjZShzaXplKSk7CisKKyAgICBpZiAoTlVMTCA9PSBkYXRhKQorICAgIHsKKyAgICAgICAgQUxPR0UoIkZpbHRlciBoYWQgbm8gZGF0YSIpOworICAgICAgICAqc3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gVE9ETzogVGhlIHN0bCBpbXBsIG9mIHZlY3RvciB3b3VsZCBiZSBtb3JlIGVmZmljaWVudCBoZXJlCisgICAgLy8gYmVjYXVzZSBpdCBkZWdlbmVyYXRlcyBpbnRvIGEgbWVtY3B5IG9uIHBvZCB0eXBlcy4gVHJ5IHRvCisgICAgLy8gcmVwbGFjZSBsYXRlciBvciB1c2Ugc3RsOjpzZXQuCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW07ICsraSkKKyAgICB7CisgICAgICAgIGZpbHRlci0+YWRkKCpkYXRhKTsKKyAgICAgICAgKytkYXRhOworICAgIH0KKyAgICAqc3RhdHVzID0gT0s7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEBwYXJhbSBmaWx0ZXIgT2YgbWV0YWRhdGEgdHlwZS4KKy8vIEBwYXJhbSB2YWwgVG8gYmUgc2VhcmNoZWQuCisvLyBAcmV0dXJuIHRydWUgaWYgYSBtYXRjaCB3YXMgZm91bmQuCitib29sIGZpbmRNZXRhZGF0YShjb25zdCBNZXRhZGF0YTo6RmlsdGVyJiBmaWx0ZXIsIGNvbnN0IGludDMyX3QgdmFsKQoreworICAgIC8vIERlYWwgd2l0aCBlbXB0eSBhbmQgQU5ZIHJpZ2h0IGF3YXkKKyAgICBpZiAoZmlsdGVyLmlzRW1wdHkoKSkgcmV0dXJuIGZhbHNlOworICAgIGlmIChmaWx0ZXJbMF0gPT0gTWV0YWRhdGE6OmtBbnkpIHJldHVybiB0cnVlOworCisgICAgcmV0dXJuIGZpbHRlci5pbmRleE9mKHZhbCkgPj0gMDsKK30KKworfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCisKK25hbWVzcGFjZSB7Cit1c2luZyBhbmRyb2lkOjpQYXJjZWw7Cit1c2luZyBhbmRyb2lkOjpTdHJpbmcxNjsKKworLy8gbWFyc2hhbGxpbmcgdGFnIGluZGljYXRpbmcgZmxhdHRlbmVkIHV0ZjE2IHRhZ3MKKy8vIGtlZXAgaW4gc3luYyB3aXRoIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9BdHRyaWJ1dGVzLmphdmEKK2NvbnN0IGludDMyX3Qga0F1ZGlvQXR0cmlidXRlc01hcnNoYWxsVGFnRmxhdHRlblRhZ3MgPSAxOworCisvLyBBdWRpbyBhdHRyaWJ1dGVzIGZvcm1hdCBpbiBhIHBhcmNlbDoKKy8vCisvLyAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisvLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworLy8gfCAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisvLyB8ICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50X3R5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKy8vIHwgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisvLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworLy8gfCAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisvLyB8ICAgICAgICAgICAgICAgICAgICAgICBrQXVkaW9BdHRyaWJ1dGVzTWFyc2hhbGxUYWdGbGF0dGVuVGFncyAgfCAvLyBpZ25vcmUgdGFncyBpZiBub3QgZm91bmQKKy8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisvLyB8ICAgICAgICAgICAgICAgICAgICAgICBmbGF0dGVuZWQgdGFncyBpbiBVVEYxNiAgICAgICAgICAgICAgICAgfAorLy8gfCAgICAgICAgICAgICAgICAgICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisvLworLy8gQHBhcmFtIHAgUGFyY2VsIHRoYXQgY29udGFpbnMgYXVkaW8gYXR0cmlidXRlcy4KKy8vIEBwYXJhbVtvdXRdIGF0dHJpYnV0ZXMgT24gZXhpdCBwb2ludHMgdG8gYW4gaW5pdGlhbGl6ZWQgYXVkaW9fYXR0cmlidXRlc190IHN0cnVjdHVyZQorLy8gQHBhcmFtW291dF0gc3RhdHVzIE9uIGV4aXQgY29udGFpbnMgdGhlIHN0YXR1cyBjb2RlIHRvIGJlIHJldHVybmVkLgordm9pZCB1bm1hcnNoYWxsQXVkaW9BdHRyaWJ1dGVzKGNvbnN0IFBhcmNlbCYgcGFyY2VsLCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMpCit7CisgICAgYXR0cmlidXRlcy0+dXNhZ2UgPSAoYXVkaW9fdXNhZ2VfdCkgcGFyY2VsLnJlYWRJbnQzMigpOworICAgIGF0dHJpYnV0ZXMtPmNvbnRlbnRfdHlwZSA9IChhdWRpb19jb250ZW50X3R5cGVfdCkgcGFyY2VsLnJlYWRJbnQzMigpOworICAgIGF0dHJpYnV0ZXMtPnNvdXJjZSA9IChhdWRpb19zb3VyY2VfdCkgcGFyY2VsLnJlYWRJbnQzMigpOworICAgIGF0dHJpYnV0ZXMtPmZsYWdzID0gKGF1ZGlvX2ZsYWdzX21hc2tfdCkgcGFyY2VsLnJlYWRJbnQzMigpOworICAgIGNvbnN0IGJvb2wgaGFzRmxhdHRlbmVkVGFnID0gKHBhcmNlbC5yZWFkSW50MzIoKSA9PSBrQXVkaW9BdHRyaWJ1dGVzTWFyc2hhbGxUYWdGbGF0dGVuVGFncyk7CisgICAgaWYgKGhhc0ZsYXR0ZW5lZFRhZykgeworICAgICAgICAvLyB0aGUgdGFncyBhcmUgVVRGMTYsIGNvbnZlcnQgdG8gVVRGOAorICAgICAgICBTdHJpbmcxNiB0YWdzID0gcGFyY2VsLnJlYWRTdHJpbmcxNigpOworICAgICAgICBzc2l6ZV90IHJlYWxUYWdTaXplID0gdXRmMTZfdG9fdXRmOF9sZW5ndGgodGFncy5zdHJpbmcoKSwgdGFncy5zaXplKCkpOworICAgICAgICBpZiAocmVhbFRhZ1NpemUgPD0gMCkgeworICAgICAgICAgICAgc3RyY3B5KGF0dHJpYnV0ZXMtPnRhZ3MsICIiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGNvcHkgdGhlIGZsYXR0ZW5lZCBzdHJpbmcgaW50byB0aGUgYXR0cmlidXRlcyBhcyB0aGUgZGVzdGluYXRpb24gZm9yIHRoZSBjb252ZXJzaW9uOgorICAgICAgICAgICAgLy8gY29weWluZyBhcnJheSBzaXplIC0xLCBhcnJheSBmb3IgdGFncyB3YXMgY2FsbG9jJ2QsIG5vIG5lZWQgdG8gTlVMTC10ZXJtaW5hdGUgaXQKKyAgICAgICAgICAgIHNpemVfdCB0YWdTaXplID0gcmVhbFRhZ1NpemUgPiBBVURJT19BVFRSSUJVVEVTX1RBR1NfTUFYX1NJWkUgLSAxID8KKyAgICAgICAgICAgICAgICAgICAgQVVESU9fQVRUUklCVVRFU19UQUdTX01BWF9TSVpFIC0gMSA6IHJlYWxUYWdTaXplOworICAgICAgICAgICAgdXRmMTZfdG9fdXRmOCh0YWdzLnN0cmluZygpLCB0YWdTaXplLCBhdHRyaWJ1dGVzLT50YWdzLAorICAgICAgICAgICAgICAgICAgICBzaXplb2YoYXR0cmlidXRlcy0+dGFncykgLyBzaXplb2YoYXR0cmlidXRlcy0+dGFnc1swXSkpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoInVubWFyc2hhbGxBdWRpb0F0dHJpYnV0ZXMoKSByZWNlaXZlZCB1bmZsYXR0ZW5lZCB0YWdzLCBpZ25vcmluZyB0YWcgdmFsdWVzIik7CisgICAgICAgIHN0cmNweShhdHRyaWJ1dGVzLT50YWdzLCAiIik7CisgICAgfQorfQorfSAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitleHRlcm4gQUxvb3BlclJvc3RlciBnTG9vcGVyUm9zdGVyOworCitNZWRpYVBsYXllcjJNYW5hZ2VyIGdNZWRpYVBsYXllcjJNYW5hZ2VyOworCitzdGF0aWMgYm9vbCBjaGVja1Blcm1pc3Npb24oY29uc3QgY2hhciogcGVybWlzc2lvblN0cmluZykgeworICAgIGlmIChnZXRwaWQoKSA9PSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCkpIHJldHVybiB0cnVlOworICAgIGJvb2wgb2sgPSBjaGVja0NhbGxpbmdQZXJtaXNzaW9uKFN0cmluZzE2KHBlcm1pc3Npb25TdHJpbmcpKTsKKyAgICBpZiAoIW9rKSBBTE9HRSgiUmVxdWVzdCByZXF1aXJlcyAlcyIsIHBlcm1pc3Npb25TdHJpbmcpOworICAgIHJldHVybiBvazsKK30KKworLy8gVE9ETzogRmluZCByZWFsIGNhdXNlIG9mIEF1ZGlvL1ZpZGVvIGRlbGF5IGluIFBWIGZyYW1ld29yayBhbmQgcmVtb3ZlIHRoaXMgd29ya2Fyb3VuZAorLyogc3RhdGljICovIGludCBNZWRpYVBsYXllcjJNYW5hZ2VyOjpBdWRpb091dHB1dDo6bU1pbkJ1ZmZlckNvdW50ID0gNDsKKy8qIHN0YXRpYyAqLyBib29sIE1lZGlhUGxheWVyMk1hbmFnZXI6OkF1ZGlvT3V0cHV0OjptSXNPbkVtdWxhdG9yID0gZmFsc2U7CisKKy8vIHN0YXRpYworTWVkaWFQbGF5ZXIyTWFuYWdlciYgTWVkaWFQbGF5ZXIyTWFuYWdlcjo6Z2V0KCkgeworICAgIHJldHVybiBnTWVkaWFQbGF5ZXIyTWFuYWdlcjsKK30KKworTWVkaWFQbGF5ZXIyTWFuYWdlcjo6TWVkaWFQbGF5ZXIyTWFuYWdlcigpIHsKKyAgICBBTE9HVigiTWVkaWFQbGF5ZXIyTWFuYWdlciBjcmVhdGVkIik7CisgICAgLy8gVE9ETzogcmVtb3ZlIGFsbCB1bm5lY2Vzc2FyeSBwaWQvdWlkIGhhbmRsaW5nLgorICAgIG1QaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CisgICAgbVVpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKKyAgICBtTmV4dENvbm5JZCA9IDE7CisKKyAgICBNZWRpYVBsYXllcjJGYWN0b3J5OjpyZWdpc3RlckJ1aWx0aW5GYWN0b3JpZXMoKTsKK30KKworTWVkaWFQbGF5ZXIyTWFuYWdlcjo6fk1lZGlhUGxheWVyMk1hbmFnZXIoKSB7CisgICAgQUxPR1YoIk1lZGlhUGxheWVyMk1hbmFnZXIgZGVzdHJveWVkIik7Cit9CisKK3NwPE1lZGlhUGxheWVyMkVuZ2luZT4gTWVkaWFQbGF5ZXIyTWFuYWdlcjo6Y3JlYXRlKAorICAgICAgICBjb25zdCBzcDxNZWRpYVBsYXllcjJFbmdpbmVDbGllbnQ+JiBjbGllbnQsCisgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBhdWRpb1Nlc3Npb25JZCkKK3sKKyAgICBpbnQzMl90IGNvbm5JZCA9IGFuZHJvaWRfYXRvbWljX2luYygmbU5leHRDb25uSWQpOworCisgICAgc3A8Q2xpZW50PiBjID0gbmV3IENsaWVudCgKKyAgICAgICAgICAgIG1QaWQsIGNvbm5JZCwgY2xpZW50LCBhdWRpb1Nlc3Npb25JZCwgbVVpZCk7CisKKyAgICBBTE9HVigiQ3JlYXRlIG5ldyBjbGllbnQoJWQpIGZyb20gcGlkICVkLCB1aWQgJWQsICIsIGNvbm5JZCwgbVBpZCwgbVVpZCk7CisKKyAgICB3cDxDbGllbnQ+IHcgPSBjOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgICAgICBtQ2xpZW50cy5hZGQodyk7CisgICAgfQorICAgIHJldHVybiBjOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjJNYW5hZ2VyOjpBdWRpb091dHB1dDo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIGNvbnN0Cit7CisgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgY2hhciBidWZmZXJbU0laRV07CisgICAgU3RyaW5nOCByZXN1bHQ7CisKKyAgICByZXN1bHQuYXBwZW5kKCIgQXVkaW9PdXRwdXRcbiIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgMjU1LCAiICBzdHJlYW0gdHlwZSglZCksIGxlZnQgLSByaWdodCB2b2x1bWUoJWYsICVmKVxuIiwKKyAgICAgICAgICAgIG1TdHJlYW1UeXBlLCBtTGVmdFZvbHVtZSwgbVJpZ2h0Vm9sdW1lKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCAyNTUsICIgIG1zZWMgcGVyIGZyYW1lKCVmKSwgbGF0ZW5jeSAoJWQpXG4iLAorICAgICAgICAgICAgbU1zZWNzUGVyRnJhbWUsIChtVHJhY2sgIT0gMCkgPyBtVHJhY2stPmxhdGVuY3koKSA6IC0xKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCAyNTUsICIgIGF1eCBlZmZlY3QgaWQoJWQpLCBzZW5kIGxldmVsICglZilcbiIsCisgICAgICAgICAgICBtQXV4RWZmZWN0SWQsIG1TZW5kTGV2ZWwpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKworICAgIDo6d3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgaWYgKG1UcmFjayAhPSAwKSB7CisgICAgICAgIG1UcmFjay0+ZHVtcChmZCwgYXJncyk7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyTWFuYWdlcjo6Q2xpZW50OjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKK3sKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKyAgICByZXN1bHQuYXBwZW5kKCIgQ2xpZW50XG4iKTsKKyAgICBzbnByaW50ZihidWZmZXIsIDI1NSwgIiAgcGlkKCVkKSwgY29ubklkKCVkKSwgc3RhdHVzKCVkKSwgbG9vcGluZyglcylcbiIsCisgICAgICAgICAgICBtUGlkLCBtQ29ubklkLCBtU3RhdHVzLCBtTG9vcD8idHJ1ZSI6ICJmYWxzZSIpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKworICAgIHNwPE1lZGlhUGxheWVyMkJhc2U+IHA7CisgICAgc3A8QXVkaW9PdXRwdXQ+IGF1ZGlvT3V0cHV0OworICAgIGJvb2wgbG9ja2VkID0gZmFsc2U7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrRHVtcExvY2tSZXRyaWVzOyArK2kpIHsKKyAgICAgICAgaWYgKG1Mb2NrLnRyeUxvY2soKSA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgbG9ja2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHVzbGVlcChrRHVtcExvY2tTbGVlcFVzKTsKKyAgICB9CisKKyAgICBpZiAobG9ja2VkKSB7CisgICAgICAgIHAgPSBtUGxheWVyOworICAgICAgICBhdWRpb091dHB1dCA9IG1BdWRpb091dHB1dDsKKyAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiICBsb2NrIGlzIHRha2VuLCBubyBkdW1wIGZyb20gcGxheWVyIGFuZCBhdWRpbyBvdXRwdXRcbiIpOworICAgIH0KKyAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKworICAgIGlmIChwICE9IE5VTEwpIHsKKyAgICAgICAgcC0+ZHVtcChmZCwgYXJncyk7CisgICAgfQorICAgIGlmIChhdWRpb091dHB1dCAhPSAwKSB7CisgICAgICAgIGF1ZGlvT3V0cHV0LT5kdW1wKGZkLCBhcmdzKTsKKyAgICB9CisgICAgd3JpdGUoZmQsICJcbiIsIDEpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyoqCisgKiBUaGUgb25seSBhcmd1bWVudHMgdGhpcyB1bmRlcnN0YW5kcyByaWdodCBub3cgYXJlIC1jLCAtdm9uIGFuZCAtdm9mZiwKKyAqIHdoaWNoIGFyZSBwYXJzZWQgYnkgQUxvb3BlclJvc3Rlcjo6ZHVtcCgpCisgKi8KK3N0YXR1c190IE1lZGlhUGxheWVyMk1hbmFnZXI6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQoreworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgIFN0cmluZzggcmVzdWx0OworICAgIFNvcnRlZFZlY3Rvcjwgc3A8Q2xpZW50PiA+IGNsaWVudHM7IC8vdG8gc2VyaWFsaXNlIHRoZSBtdXRleCB1bmxvY2sgJiBjbGllbnQgZGVzdHJ1Y3Rpb24uCisKKyAgICBpZiAoY2hlY2tDYWxsaW5nUGVybWlzc2lvbihTdHJpbmcxNigiYW5kcm9pZC5wZXJtaXNzaW9uLkRVTVAiKSkgPT0gZmFsc2UpIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiUGVybWlzc2lvbiBEZW5pYWw6ICIKKyAgICAgICAgICAgICAgICAiY2FuJ3QgZHVtcCBNZWRpYVBsYXllcjJNYW5hZ2VyIGZyb20gcGlkPSVkLCB1aWQ9JWRcbiIsCisgICAgICAgICAgICAgICAgbVBpZCwgbVVpZCk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgICAgIGZvciAoaW50IGkgPSAwLCBuID0gbUNsaWVudHMuc2l6ZSgpOyBpIDwgbjsgKytpKSB7CisgICAgICAgICAgICBzcDxDbGllbnQ+IGMgPSBtQ2xpZW50c1tpXS5wcm9tb3RlKCk7CisgICAgICAgICAgICBpZiAoYyAhPSAwKSBjLT5kdW1wKGZkLCBhcmdzKTsKKyAgICAgICAgICAgIGNsaWVudHMuYWRkKGMpOworICAgICAgICB9CisKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiIEZpbGVzIG9wZW5lZCBhbmQvb3IgbWFwcGVkOlxuIik7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi9wcm9jLyVkL21hcHMiLCBnZXRwaWQoKSk7CisgICAgICAgIEZJTEUgKmYgPSBmb3BlbihidWZmZXIsICJyIik7CisgICAgICAgIGlmIChmKSB7CisgICAgICAgICAgICB3aGlsZSAoIWZlb2YoZikpIHsKKyAgICAgICAgICAgICAgICBmZ2V0cyhidWZmZXIsIFNJWkUsIGYpOworICAgICAgICAgICAgICAgIGlmIChzdHJzdHIoYnVmZmVyLCAiIC9zdG9yYWdlLyIpIHx8CisgICAgICAgICAgICAgICAgICAgIHN0cnN0cihidWZmZXIsICIgL3N5c3RlbS9zb3VuZHMvIikgfHwKKyAgICAgICAgICAgICAgICAgICAgc3Ryc3RyKGJ1ZmZlciwgIiAvZGF0YS8iKSB8fAorICAgICAgICAgICAgICAgICAgICBzdHJzdHIoYnVmZmVyLCAiIC9zeXN0ZW0vbWVkaWEvIikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiICAiKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZjbG9zZShmKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoImNvdWxkbid0IG9wZW4gIik7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpOworICAgICAgICB9CisKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiL3Byb2MvJWQvZmQiLCBnZXRwaWQoKSk7CisgICAgICAgIERJUiAqZCA9IG9wZW5kaXIoYnVmZmVyKTsKKyAgICAgICAgaWYgKGQpIHsKKyAgICAgICAgICAgIHN0cnVjdCBkaXJlbnQgKmVudDsKKyAgICAgICAgICAgIHdoaWxlKChlbnQgPSByZWFkZGlyKGQpKSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0cmNtcChlbnQtPmRfbmFtZSwiLiIpICYmIHN0cmNtcChlbnQtPmRfbmFtZSwiLi4iKSkgeworICAgICAgICAgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIvcHJvYy8lZC9mZC8lcyIsIGdldHBpZCgpLCBlbnQtPmRfbmFtZSk7CisgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzdGF0IHM7CisgICAgICAgICAgICAgICAgICAgIGlmIChsc3RhdChidWZmZXIsICZzKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHMuc3RfbW9kZSAmIFNfSUZNVCkgPT0gU19JRkxOSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgbGlua3RvWzI1Nl07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiA9IHJlYWRsaW5rKGJ1ZmZlciwgbGlua3RvLCBzaXplb2YobGlua3RvKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobGVuID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihsZW4gPiAyNTUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmt0b1syNTJdID0gJy4nOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua3RvWzI1M10gPSAnLic7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rdG9bMjU0XSA9ICcuJzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmt0b1syNTVdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmt0b1tsZW5dID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3Ryc3RyKGxpbmt0bywgIi9zdG9yYWdlLyIpID09IGxpbmt0byB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryc3RyKGxpbmt0bywgIi9zeXN0ZW0vc291bmRzLyIpID09IGxpbmt0byB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryc3RyKGxpbmt0bywgIi9kYXRhLyIpID09IGxpbmt0byB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryc3RyKGxpbmt0bywgIi9zeXN0ZW0vbWVkaWEvIikgPT0gbGlua3RvKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIgICIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiIC0+ICIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChsaW5rdG8pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiICB1bmV4cGVjdGVkIHR5cGUgZm9yICIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2xvc2VkaXIoZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJjb3VsZG4ndCBvcGVuICIpOworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGdMb29wZXJSb3N0ZXIuZHVtcChmZCwgYXJncyk7CisKKyAgICAgICAgYm9vbCBkdW1wTWVtID0gZmFsc2U7CisgICAgICAgIGJvb2wgdW5yZWFjaGFibGVNZW1vcnkgPSBmYWxzZTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhcmdzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoYXJnc1tpXSA9PSBTdHJpbmcxNigiLW0iKSkgeworICAgICAgICAgICAgICAgIGR1bXBNZW0gPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldID09IFN0cmluZzE2KCItLXVucmVhY2hhYmxlIikpIHsKKyAgICAgICAgICAgICAgICB1bnJlYWNoYWJsZU1lbW9yeSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGR1bXBNZW0pIHsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuRHVtcGluZyBtZW1vcnk6XG4iKTsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHMgPSBkdW1wTWVtb3J5QWRkcmVzc2VzKDEwMCAvKiBsaW1pdCAqLyk7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHMuY19zdHIoKSwgcy5zaXplKCkpOworICAgICAgICB9CisgICAgICAgIGlmICh1bnJlYWNoYWJsZU1lbW9yeSkgeworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG5EdW1waW5nIHVucmVhY2hhYmxlIG1lbW9yeTpcbiIpOworICAgICAgICAgICAgLy8gVE9ETyAtIHNob3VsZCBsaW1pdCBiZSBhbiBhcmd1bWVudCBwYXJhbWV0ZXI/CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBzID0gR2V0VW5yZWFjaGFibGVNZW1vcnlTdHJpbmcodHJ1ZSAvKiBjb250ZW50cyAqLywgMTAwMDAgLyogbGltaXQgKi8pOworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChzLmNfc3RyKCksIHMuc2l6ZSgpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3ZvaWQgTWVkaWFQbGF5ZXIyTWFuYWdlcjo6cmVtb3ZlQ2xpZW50KGNvbnN0IHdwPENsaWVudD4mIGNsaWVudCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgbUNsaWVudHMucmVtb3ZlKGNsaWVudCk7Cit9CisKK2Jvb2wgTWVkaWFQbGF5ZXIyTWFuYWdlcjo6aGFzQ2xpZW50KHdwPENsaWVudD4gY2xpZW50KQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gbUNsaWVudHMuaW5kZXhPZihjbGllbnQpICE9IE5BTUVfTk9UX0ZPVU5EOworfQorCitNZWRpYVBsYXllcjJNYW5hZ2VyOjpDbGllbnQ6OkNsaWVudCgKKyAgICAgICAgcGlkX3QgcGlkLAorICAgICAgICBpbnQzMl90IGNvbm5JZCwKKyAgICAgICAgY29uc3Qgc3A8TWVkaWFQbGF5ZXIyRW5naW5lQ2xpZW50PiYgY2xpZW50LAorICAgICAgICBhdWRpb19zZXNzaW9uX3QgYXVkaW9TZXNzaW9uSWQsCisgICAgICAgIHVpZF90IHVpZCkKK3sKKyAgICBBTE9HVigiQ2xpZW50KCVkKSBjb25zdHJ1Y3RvciIsIGNvbm5JZCk7CisgICAgbVBpZCA9IHBpZDsKKyAgICBtQ29ubklkID0gY29ubklkOworICAgIG1DbGllbnQgPSBjbGllbnQ7CisgICAgbUxvb3AgPSBmYWxzZTsKKyAgICBtU3RhdHVzID0gTk9fSU5JVDsKKyAgICBtQXVkaW9TZXNzaW9uSWQgPSBhdWRpb1Nlc3Npb25JZDsKKyAgICBtVWlkID0gdWlkOworICAgIG1SZXRyYW5zbWl0RW5kcG9pbnRWYWxpZCA9IGZhbHNlOworICAgIG1BdWRpb0F0dHJpYnV0ZXMgPSBOVUxMOworCisjaWYgQ0FMTEJBQ0tfQU5UQUdPTklaRVIKKyAgICBBTE9HRCgiY3JlYXRlIEFudGFnb25pemVyIik7CisgICAgbUFudGFnb25pemVyID0gbmV3IEFudGFnb25pemVyKG5vdGlmeSwgdGhpcyk7CisjZW5kaWYKK30KKworTWVkaWFQbGF5ZXIyTWFuYWdlcjo6Q2xpZW50Ojp+Q2xpZW50KCkKK3sKKyAgICBBTE9HVigiQ2xpZW50KCVkKSBkZXN0cnVjdG9yIHBpZCA9ICVkIiwgbUNvbm5JZCwgbVBpZCk7CisgICAgbUF1ZGlvT3V0cHV0LmNsZWFyKCk7CisgICAgd3A8Q2xpZW50PiBjbGllbnQodGhpcyk7CisgICAgZGlzY29ubmVjdCgpOworICAgIGdNZWRpYVBsYXllcjJNYW5hZ2VyLnJlbW92ZUNsaWVudChjbGllbnQpOworICAgIGlmIChtQXVkaW9BdHRyaWJ1dGVzICE9IE5VTEwpIHsKKyAgICAgICAgZnJlZShtQXVkaW9BdHRyaWJ1dGVzKTsKKyAgICB9CisgICAgbUF1ZGlvRGV2aWNlVXBkYXRlZExpc3RlbmVyLmNsZWFyKCk7Cit9CisKK3ZvaWQgTWVkaWFQbGF5ZXIyTWFuYWdlcjo6Q2xpZW50OjpkaXNjb25uZWN0KCkKK3sKKyAgICBBTE9HVigiZGlzY29ubmVjdCglZCkgZnJvbSBwaWQgJWQiLCBtQ29ubklkLCBtUGlkKTsKKyAgICAvLyBncmFiIGxvY2FsIHJlZmVyZW5jZSBhbmQgY2xlYXIgbWFpbiByZWZlcmVuY2UgdG8gcHJldmVudCBmdXR1cmUKKyAgICAvLyBhY2Nlc3MgdG8gb2JqZWN0CisgICAgc3A8TWVkaWFQbGF5ZXIyQmFzZT4gcDsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICAgICAgcCA9IG1QbGF5ZXI7CisgICAgICAgIG1DbGllbnQuY2xlYXIoKTsKKyAgICAgICAgbVBsYXllci5jbGVhcigpOworICAgIH0KKworICAgIC8vIGNsZWFyIHRoZSBub3RpZmljYXRpb24gdG8gcHJldmVudCBjYWxsYmFja3MgdG8gZGVhZCBjbGllbnQKKyAgICAvLyBhbmQgcmVzZXQgdGhlIHBsYXllci4gV2UgYXNzdW1lIHRoZSBwbGF5ZXIgd2lsbCBzZXJpYWxpemUKKyAgICAvLyBhY2Nlc3MgdG8gaXRzZWxmIGlmIG5lY2Vzc2FyeS4KKyAgICBpZiAocCAhPSAwKSB7CisgICAgICAgIHAtPnNldE5vdGlmeUNhbGxiYWNrKDAsIDApOworI2lmIENBTExCQUNLX0FOVEFHT05JWkVSCisgICAgICAgIEFMT0dEKCJraWxsIEFudGFnb25pemVyIik7CisgICAgICAgIG1BbnRhZ29uaXplci0+a2lsbCgpOworI2VuZGlmCisgICAgICAgIHAtPnJlc2V0KCk7CisgICAgfQorCisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgICAgIGRpc2Nvbm5lY3ROYXRpdmVXaW5kb3dfbCgpOworICAgIH0KKworICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKK30KKworc3A8TWVkaWFQbGF5ZXIyQmFzZT4gTWVkaWFQbGF5ZXIyTWFuYWdlcjo6Q2xpZW50OjpjcmVhdGVQbGF5ZXIocGxheWVyMl90eXBlIHBsYXllclR5cGUpCit7CisgICAgLy8gZGV0ZXJtaW5lIGlmIHdlIGhhdmUgdGhlIHJpZ2h0IHBsYXllciB0eXBlCisgICAgc3A8TWVkaWFQbGF5ZXIyQmFzZT4gcCA9IGdldFBsYXllcigpOworICAgIGlmICgocCAhPSBOVUxMKSAmJiAocC0+cGxheWVyVHlwZSgpICE9IHBsYXllclR5cGUpKSB7CisgICAgICAgIEFMT0dWKCJkZWxldGUgcGxheWVyIik7CisgICAgICAgIHAuY2xlYXIoKTsKKyAgICB9CisgICAgaWYgKHAgPT0gTlVMTCkgeworICAgICAgICBwID0gTWVkaWFQbGF5ZXIyRmFjdG9yeTo6Y3JlYXRlUGxheWVyKHBsYXllclR5cGUsIHRoaXMsIG5vdGlmeSwgbVBpZCk7CisgICAgfQorCisgICAgaWYgKHAgIT0gTlVMTCkgeworICAgICAgICBwLT5zZXRVSUQobVVpZCk7CisgICAgfQorCisgICAgcmV0dXJuIHA7Cit9CisKK3ZvaWQgTWVkaWFQbGF5ZXIyTWFuYWdlcjo6Q2xpZW50OjpBdWRpb0RldmljZVVwZGF0ZWROb3RpZmllcjo6b25BdWRpb0RldmljZVVwZGF0ZSgKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgYXVkaW9JbywKKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCkgeworICAgIHNwPE1lZGlhUGxheWVyMkJhc2U+IGxpc3RlbmVyID0gbUxpc3RlbmVyLnByb21vdGUoKTsKKyAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkgeworICAgICAgICBsaXN0ZW5lci0+c2VuZEV2ZW50KE1FRElBMl9BVURJT19ST1VUSU5HX0NIQU5HRUQsIGF1ZGlvSW8sIGRldmljZUlkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVygibGlzdGVuZXIgZm9yIHByb2Nlc3MgJWQgZGVhdGggaXMgZ29uZSIsIE1FRElBMl9BVURJT19ST1VUSU5HX0NIQU5HRUQpOworICAgIH0KK30KKworc3A8TWVkaWFQbGF5ZXIyQmFzZT4gTWVkaWFQbGF5ZXIyTWFuYWdlcjo6Q2xpZW50OjpzZXREYXRhU291cmNlX3ByZSgKKyAgICAgICAgcGxheWVyMl90eXBlIHBsYXllclR5cGUpCit7CisgICAgQUxPR1YoInBsYXllciB0eXBlID0gJWQiLCBwbGF5ZXJUeXBlKTsKKworICAgIC8vIGNyZWF0ZSB0aGUgcmlnaHQgdHlwZSBvZiBwbGF5ZXIKKyAgICBzcDxNZWRpYVBsYXllcjJCYXNlPiBwID0gY3JlYXRlUGxheWVyKHBsYXllclR5cGUpOworICAgIGlmIChwID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIHA7CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworCisgICAgbUF1ZGlvRGV2aWNlVXBkYXRlZExpc3RlbmVyID0gbmV3IEF1ZGlvRGV2aWNlVXBkYXRlZE5vdGlmaWVyKHApOworCisgICAgaWYgKCFwLT5oYXJkd2FyZU91dHB1dCgpKSB7CisgICAgICAgIG1BdWRpb091dHB1dCA9IG5ldyBBdWRpb091dHB1dChtQXVkaW9TZXNzaW9uSWQsIG1VaWQsCisgICAgICAgICAgICAgICAgbVBpZCwgbUF1ZGlvQXR0cmlidXRlcywgbUF1ZGlvRGV2aWNlVXBkYXRlZExpc3RlbmVyKTsKKyAgICAgICAgc3RhdGljX2Nhc3Q8TWVkaWFQbGF5ZXIySW50ZXJmYWNlKj4ocC5nZXQoKSktPnNldEF1ZGlvU2luayhtQXVkaW9PdXRwdXQpOworICAgIH0KKworICAgIHJldHVybiBwOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjJNYW5hZ2VyOjpDbGllbnQ6OnNldERhdGFTb3VyY2VfcG9zdCgKKyAgICAgICAgY29uc3Qgc3A8TWVkaWFQbGF5ZXIyQmFzZT4mIHAsCisgICAgICAgIHN0YXR1c190IHN0YXR1cykKK3sKKyAgICBBTE9HVigiIHNldERhdGFTb3VyY2UiKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIgIGVycm9yOiAlZCIsIHN0YXR1cyk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgLy8gU2V0IHRoZSByZS10cmFuc21pc3Npb24gZW5kcG9pbnQgaWYgb25lIHdhcyBjaG9zZW4uCisgICAgaWYgKG1SZXRyYW5zbWl0RW5kcG9pbnRWYWxpZCkgeworICAgICAgICBzdGF0dXMgPSBwLT5zZXRSZXRyYW5zbWl0RW5kcG9pbnQoJm1SZXRyYW5zbWl0RW5kcG9pbnQpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBBTE9HRSgic2V0UmV0cmFuc21pdEVuZHBvaW50IGVycm9yOiAlZCIsIHN0YXR1cyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc3RhdHVzID09IE9LKSB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICAgICAgbVBsYXllciA9IHA7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMk1hbmFnZXI6OkNsaWVudDo6c2V0RGF0YVNvdXJjZSgKKyAgICAgICAgY29uc3Qgc3A8TWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICBjb25zdCBjaGFyICp1cmwsCisgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKQoreworICAgIEFMT0dWKCJzZXREYXRhU291cmNlKCVzKSIsIHVybCk7CisgICAgaWYgKHVybCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKworICAgIGlmICgoc3RybmNtcCh1cmwsICJodHRwOi8vIiwgNykgPT0gMCkgfHwKKyAgICAgICAgKHN0cm5jbXAodXJsLCAiaHR0cHM6Ly8iLCA4KSA9PSAwKSB8fAorICAgICAgICAoc3RybmNtcCh1cmwsICJydHNwOi8vIiwgNykgPT0gMCkpIHsKKyAgICAgICAgaWYgKCFjaGVja1Blcm1pc3Npb24oImFuZHJvaWQucGVybWlzc2lvbi5JTlRFUk5FVCIpKSB7CisgICAgICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc3RybmNtcCh1cmwsICJjb250ZW50Oi8vIiwgMTApID09IDApIHsKKyAgICAgICAgQUxPR0UoInNldERhdGFTb3VyY2U6IGNvbnRlbnQgc2NoZW1lIGlzIG5vdCBzdXBwb3J0ZWQgaGVyZSIpOworICAgICAgICBtU3RhdHVzID0gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgcmV0dXJuIG1TdGF0dXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcGxheWVyMl90eXBlIHBsYXllclR5cGUgPSBNZWRpYVBsYXllcjJGYWN0b3J5OjpnZXRQbGF5ZXJUeXBlKHRoaXMsIHVybCk7CisgICAgICAgIHNwPE1lZGlhUGxheWVyMkJhc2U+IHAgPSBzZXREYXRhU291cmNlX3ByZShwbGF5ZXJUeXBlKTsKKyAgICAgICAgaWYgKHAgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbVN0YXR1cyA9CisgICAgICAgICAgICAgICAgc2V0RGF0YVNvdXJjZV9wb3N0KAorICAgICAgICAgICAgICAgIHAsIHAtPnNldERhdGFTb3VyY2UoaHR0cFNlcnZpY2UsIHVybCwgaGVhZGVycykpOworICAgIH0KK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyTWFuYWdlcjo6Q2xpZW50OjpzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKQoreworICAgIEFMT0dWKCJzZXREYXRhU291cmNlIGZkPSVkICglcyksIG9mZnNldD0lbGxkLCBsZW5ndGg9JWxsZCIsCisgICAgICAgICAgICBmZCwgbmFtZUZvckZkKGZkKS5jX3N0cigpLCAobG9uZyBsb25nKSBvZmZzZXQsIChsb25nIGxvbmcpIGxlbmd0aCk7CisgICAgc3RydWN0IHN0YXQgc2I7CisgICAgaW50IHJldCA9IGZzdGF0KGZkLCAmc2IpOworICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICBBTE9HRSgiZnN0YXQoJWQpIGZhaWxlZDogJWQsICVzIiwgZmQsIHJldCwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgQUxPR1YoInN0X2RldiAgPSAlbGx1Iiwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBsb25nPihzYi5zdF9kZXYpKTsKKyAgICBBTE9HVigic3RfbW9kZSA9ICV1Iiwgc2Iuc3RfbW9kZSk7CisgICAgQUxPR1YoInN0X3VpZCAgPSAlbHUiLCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihzYi5zdF91aWQpKTsKKyAgICBBTE9HVigic3RfZ2lkICA9ICVsdSIsIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KHNiLnN0X2dpZCkpOworICAgIEFMT0dWKCJzdF9zaXplID0gJWxsdSIsIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgbG9uZz4oc2Iuc3Rfc2l6ZSkpOworCisgICAgaWYgKG9mZnNldCA+PSBzYi5zdF9zaXplKSB7CisgICAgICAgIEFMT0dFKCJvZmZzZXQgZXJyb3IiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIGlmIChvZmZzZXQgKyBsZW5ndGggPiBzYi5zdF9zaXplKSB7CisgICAgICAgIGxlbmd0aCA9IHNiLnN0X3NpemUgLSBvZmZzZXQ7CisgICAgICAgIEFMT0dWKCJjYWxjdWxhdGVkIGxlbmd0aCA9ICVsbGQiLCAobG9uZyBsb25nKWxlbmd0aCk7CisgICAgfQorCisgICAgcGxheWVyMl90eXBlIHBsYXllclR5cGUgPSBNZWRpYVBsYXllcjJGYWN0b3J5OjpnZXRQbGF5ZXJUeXBlKHRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCk7CisgICAgc3A8TWVkaWFQbGF5ZXIyQmFzZT4gcCA9IHNldERhdGFTb3VyY2VfcHJlKHBsYXllclR5cGUpOworICAgIGlmIChwID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgLy8gbm93IHNldCBkYXRhIHNvdXJjZQorICAgIHJldHVybiBtU3RhdHVzID0gc2V0RGF0YVNvdXJjZV9wb3N0KHAsIHAtPnNldERhdGFTb3VyY2UoZmQsIG9mZnNldCwgbGVuZ3RoKSk7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMk1hbmFnZXI6OkNsaWVudDo6c2V0RGF0YVNvdXJjZSgKKyAgICAgICAgY29uc3Qgc3A8SVN0cmVhbVNvdXJjZT4gJnNvdXJjZSkgeworICAgIC8vIGNyZWF0ZSB0aGUgcmlnaHQgdHlwZSBvZiBwbGF5ZXIKKyAgICBwbGF5ZXIyX3R5cGUgcGxheWVyVHlwZSA9IE1lZGlhUGxheWVyMkZhY3Rvcnk6OmdldFBsYXllclR5cGUodGhpcywgc291cmNlKTsKKyAgICBzcDxNZWRpYVBsYXllcjJCYXNlPiBwID0gc2V0RGF0YVNvdXJjZV9wcmUocGxheWVyVHlwZSk7CisgICAgaWYgKHAgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICAvLyBub3cgc2V0IGRhdGEgc291cmNlCisgICAgcmV0dXJuIG1TdGF0dXMgPSBzZXREYXRhU291cmNlX3Bvc3QocCwgcC0+c2V0RGF0YVNvdXJjZShzb3VyY2UpKTsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyTWFuYWdlcjo6Q2xpZW50OjpzZXREYXRhU291cmNlKAorICAgICAgICBjb25zdCBzcDxJRGF0YVNvdXJjZT4gJnNvdXJjZSkgeworICAgIHNwPERhdGFTb3VyY2U+IGRhdGFTb3VyY2UgPSBDcmVhdGVEYXRhU291cmNlRnJvbUlEYXRhU291cmNlKHNvdXJjZSk7CisgICAgcGxheWVyMl90eXBlIHBsYXllclR5cGUgPSBNZWRpYVBsYXllcjJGYWN0b3J5OjpnZXRQbGF5ZXJUeXBlKHRoaXMsIGRhdGFTb3VyY2UpOworICAgIHNwPE1lZGlhUGxheWVyMkJhc2U+IHAgPSBzZXREYXRhU291cmNlX3ByZShwbGF5ZXJUeXBlKTsKKyAgICBpZiAocCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICAvLyBub3cgc2V0IGRhdGEgc291cmNlCisgICAgcmV0dXJuIG1TdGF0dXMgPSBzZXREYXRhU291cmNlX3Bvc3QocCwgcC0+c2V0RGF0YVNvdXJjZShkYXRhU291cmNlKSk7Cit9CisKK3ZvaWQgTWVkaWFQbGF5ZXIyTWFuYWdlcjo6Q2xpZW50OjpkaXNjb25uZWN0TmF0aXZlV2luZG93X2woKSB7CisgICAgaWYgKG1Db25uZWN0ZWRXaW5kb3cgIT0gTlVMTCAmJiBtQ29ubmVjdGVkV2luZG93LT5nZXRBTmF0aXZlV2luZG93KCkgIT0gTlVMTCkgeworICAgICAgICBzdGF0dXNfdCBlcnIgPSBuYXRpdmVXaW5kb3dEaXNjb25uZWN0KAorICAgICAgICAgICAgICAgIG1Db25uZWN0ZWRXaW5kb3ctPmdldEFOYXRpdmVXaW5kb3coKSwgImRpc2Nvbm5lY3ROYXRpdmVXaW5kb3ciKTsKKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HVygibmF0aXZlV2luZG93RGlzY29ubmVjdCByZXR1cm5lZCBhbiBlcnJvcjogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1lcnIpLCBlcnIpOworICAgICAgICB9CisgICAgfQorICAgIG1Db25uZWN0ZWRXaW5kb3cuY2xlYXIoKTsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyTWFuYWdlcjo6Q2xpZW50OjpzZXRWaWRlb1N1cmZhY2VUZXh0dXJlKAorICAgICAgICBjb25zdCBzcDxBTmF0aXZlV2luZG93V3JhcHBlcj4mIG53dykKK3sKKyAgICBBTE9HVigiWyVkXSBzZXRWaWRlb1N1cmZhY2VUZXh0dXJlKCVwKSIsCisgICAgICAgICAgbUNvbm5JZCwKKyAgICAgICAgICAobnd3ID09IE5VTEwgPyBOVUxMIDogbnd3LT5nZXRBTmF0aXZlV2luZG93KCkpKTsKKyAgICBzcDxNZWRpYVBsYXllcjJCYXNlPiBwID0gZ2V0UGxheWVyKCk7CisgICAgaWYgKHAgPT0gMCkgcmV0dXJuIFVOS05PV05fRVJST1I7CisKKyAgICBpZiAobnd3ICE9IE5VTEwgJiYgbnd3LT5nZXRBTmF0aXZlV2luZG93KCkgIT0gTlVMTCkgeworICAgICAgICBpZiAobUNvbm5lY3RlZFdpbmRvdyAhPSBOVUxMCisgICAgICAgICAgICAmJiBtQ29ubmVjdGVkV2luZG93LT5nZXRBTmF0aXZlV2luZG93KCkgPT0gbnd3LT5nZXRBTmF0aXZlV2luZG93KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXNfdCBlcnIgPSBuYXRpdmVXaW5kb3dDb25uZWN0KG53dy0+Z2V0QU5hdGl2ZVdpbmRvdygpLCAic2V0VmlkZW9TdXJmYWNlVGV4dHVyZSIpOworCisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJzZXRWaWRlb1N1cmZhY2VUZXh0dXJlIGZhaWxlZDogJWQiLCBlcnIpOworICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHdlIG11c3QgZG8gdGhlIHJlc2V0IGJlZm9yZSBkaXNjb25uZWN0aW5nIGZyb20gdGhlIEFOVy4KKyAgICAgICAgICAgIC8vIE90aGVyd2lzZSBxdWV1ZS9kZXF1ZXVlIGNhbGxzIGNvdWxkIGJlIG1hZGUgb24gdGhlIGRpc2Nvbm5lY3RlZAorICAgICAgICAgICAgLy8gQU5XLCB3aGljaCBtYXkgcmVzdWx0IGluIGVycm9ycy4KKyAgICAgICAgICAgIHJlc2V0KCk7CisKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICAgICAgICAgIGRpc2Nvbm5lY3ROYXRpdmVXaW5kb3dfbCgpOworCisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gTm90ZSB0aGF0IHdlIG11c3Qgc2V0IHRoZSBwbGF5ZXIncyBuZXcgR3JhcGhpY0J1ZmZlclByb2R1Y2VyIGJlZm9yZQorICAgIC8vIGRpc2Nvbm5lY3RpbmcgdGhlIG9sZCBvbmUuICBPdGhlcndpc2UgcXVldWUvZGVxdWV1ZSBjYWxscyBjb3VsZCBiZSBtYWRlCisgICAgLy8gb24gdGhlIGRpc2Nvbm5lY3RlZCBBTlcsIHdoaWNoIG1heSByZXN1bHQgaW4gZXJyb3JzLgorICAgIHN0YXR1c190IGVyciA9IHAtPnNldFZpZGVvU3VyZmFjZVRleHR1cmUobnd3KTsKKworICAgIG1Mb2NrLmxvY2soKTsKKyAgICBkaXNjb25uZWN0TmF0aXZlV2luZG93X2woKTsKKworICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgbUNvbm5lY3RlZFdpbmRvdyA9IG53dzsKKyAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgfSBlbHNlIGlmIChud3cgIT0gTlVMTCkgeworICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbmF0aXZlV2luZG93RGlzY29ubmVjdCgKKyAgICAgICAgICAgICAgICBud3ctPmdldEFOYXRpdmVXaW5kb3coKSwgImRpc2Nvbm5lY3ROYXRpdmVXaW5kb3ciKTsKKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HVygibmF0aXZlV2luZG93RGlzY29ubmVjdCByZXR1cm5lZCBhbiBlcnJvcjogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1lcnIpLCBlcnIpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyTWFuYWdlcjo6Q2xpZW50OjppbnZva2UoY29uc3QgUGFyY2VsJiByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwgKnJlcGx5KQoreworICAgIHNwPE1lZGlhUGxheWVyMkJhc2U+IHAgPSBnZXRQbGF5ZXIoKTsKKyAgICBpZiAocCA9PSBOVUxMKSByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICByZXR1cm4gcC0+aW52b2tlKHJlcXVlc3QsIHJlcGx5KTsKK30KKworLy8gVGhpcyBjYWxsIGRvZXNuJ3QgbmVlZCB0byBhY2Nlc3MgdGhlIG5hdGl2ZSBwbGF5ZXIuCitzdGF0dXNfdCBNZWRpYVBsYXllcjJNYW5hZ2VyOjpDbGllbnQ6OnNldE1ldGFkYXRhRmlsdGVyKGNvbnN0IFBhcmNlbCYgZmlsdGVyKQoreworICAgIHN0YXR1c190IHN0YXR1czsKKyAgICBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciBhbGxvdywgZHJvcDsKKworICAgIGlmICh1bm1hcnNoYWxsRmlsdGVyKGZpbHRlciwgJmFsbG93LCAmc3RhdHVzKSAmJgorICAgICAgICB1bm1hcnNoYWxsRmlsdGVyKGZpbHRlciwgJmRyb3AsICZzdGF0dXMpKSB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKworICAgICAgICBtTWV0YWRhdGFBbGxvdyA9IGFsbG93OworICAgICAgICBtTWV0YWRhdGFEcm9wID0gZHJvcDsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyTWFuYWdlcjo6Q2xpZW50OjpnZXRNZXRhZGF0YSgKKyAgICAgICAgYm9vbCB1cGRhdGVfb25seSwgYm9vbCAvKmFwcGx5X2ZpbHRlciovLCBQYXJjZWwgKnJlcGx5KQoreworICAgIHNwPE1lZGlhUGxheWVyMkJhc2U+IHBsYXllciA9IGdldFBsYXllcigpOworICAgIGlmIChwbGF5ZXIgPT0gMCkgcmV0dXJuIFVOS05PV05fRVJST1I7CisKKyAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgLy8gUGxhY2Vob2xkZXIgZm9yIHRoZSByZXR1cm4gY29kZSwgdXBkYXRlZCBieSB0aGUgY2FsbGVyLgorICAgIHJlcGx5LT53cml0ZUludDMyKC0xKTsKKworICAgIG1lZGlhOjpNZXRhZGF0YTo6RmlsdGVyIGlkczsKKworICAgIC8vIFdlIGRvbid0IGJsb2NrIG5vdGlmaWNhdGlvbnMgd2hpbGUgd2UgZmV0Y2ggdGhlIGRhdGEuIFdlIGNsZWFyCisgICAgLy8gbU1ldGFkYXRhVXBkYXRlZCBmaXJzdCBzbyB3ZSBkb24ndCBsb3NlIG5vdGlmaWNhdGlvbnMgaGFwcGVuaW5nCisgICAgLy8gZHVyaW5nIHRoZSByZXN0IG9mIHRoaXMgY2FsbC4KKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICAgICAgaWYgKHVwZGF0ZV9vbmx5KSB7CisgICAgICAgICAgICBpZHMgPSBtTWV0YWRhdGFVcGRhdGVkOworICAgICAgICB9CisgICAgICAgIG1NZXRhZGF0YVVwZGF0ZWQuY2xlYXIoKTsKKyAgICB9CisKKyAgICBtZWRpYTo6TWV0YWRhdGEgbWV0YWRhdGEocmVwbHkpOworCisgICAgbWV0YWRhdGEuYXBwZW5kSGVhZGVyKCk7CisgICAgc3RhdHVzID0gcGxheWVyLT5nZXRNZXRhZGF0YShpZHMsIHJlcGx5KTsKKworICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgbWV0YWRhdGEucmVzZXRQYXJjZWwoKTsKKyAgICAgICAgQUxPR0UoImdldE1ldGFkYXRhIGZhaWxlZCAlZCIsIHN0YXR1cyk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgLy8gRklYTUU6IGVtZW50IGZpbHRlcmluZyBvbiB0aGUgcmVzdWx0LiBOb3QgY3JpdGljYWwgc2luY2UKKyAgICAvLyBmaWx0ZXJpbmcgdGFrZXMgcGxhY2Ugb24gdGhlIHVwZGF0ZSBub3RpZmljYXRpb25zIGFscmVhZHkuIFRoaXMKKyAgICAvLyB3b3VsZCBiZSB3aGVuIGFsbCB0aGUgbWV0YWRhdGEgYXJlIGZldGNoIGFuZCBhIGZpbHRlciBpcyBzZXQuCisKKyAgICAvLyBFdmVyeXRoaW5nIGlzIGZpbmUsIHVwZGF0ZSB0aGUgbWV0YWRhdGEgbGVuZ3RoLgorICAgIG1ldGFkYXRhLnVwZGF0ZUxlbmd0aCgpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyTWFuYWdlcjo6Q2xpZW50OjpzZXRCdWZmZXJpbmdTZXR0aW5ncygKKyAgICAgICAgY29uc3QgQnVmZmVyaW5nU2V0dGluZ3MmIGJ1ZmZlcmluZykKK3sKKyAgICBBTE9HVigiWyVkXSBzZXRCdWZmZXJpbmdTZXR0aW5nc3slc30iLAorICAgICAgICAgICAgbUNvbm5JZCwgYnVmZmVyaW5nLnRvU3RyaW5nKCkuc3RyaW5nKCkpOworICAgIHNwPE1lZGlhUGxheWVyMkJhc2U+IHAgPSBnZXRQbGF5ZXIoKTsKKyAgICBpZiAocCA9PSAwKSByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICByZXR1cm4gcC0+c2V0QnVmZmVyaW5nU2V0dGluZ3MoYnVmZmVyaW5nKTsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyTWFuYWdlcjo6Q2xpZW50OjpnZXRCdWZmZXJpbmdTZXR0aW5ncygKKyAgICAgICAgQnVmZmVyaW5nU2V0dGluZ3MqIGJ1ZmZlcmluZyAvKiBub25udWxsICovKQoreworICAgIHNwPE1lZGlhUGxheWVyMkJhc2U+IHAgPSBnZXRQbGF5ZXIoKTsKKyAgICAvLyBUT0RPOiBjcmVhdGUgbVBsYXllciBvbiBkZW1hbmQuCisgICAgaWYgKHAgPT0gMCkgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgc3RhdHVzX3QgcmV0ID0gcC0+Z2V0QnVmZmVyaW5nU2V0dGluZ3MoYnVmZmVyaW5nKTsKKyAgICBpZiAocmV0ID09IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dWKCJbJWRdIGdldEJ1ZmZlcmluZ1NldHRpbmdzeyVzfSIsCisgICAgICAgICAgICAgICAgbUNvbm5JZCwgYnVmZmVyaW5nLT50b1N0cmluZygpLnN0cmluZygpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiWyVkXSBnZXRCdWZmZXJpbmdTZXR0aW5ncyByZXR1cm5lZCAlZCIsIG1Db25uSWQsIHJldCk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMk1hbmFnZXI6OkNsaWVudDo6cHJlcGFyZUFzeW5jKCkKK3sKKyAgICBBTE9HVigiWyVkXSBwcmVwYXJlQXN5bmMiLCBtQ29ubklkKTsKKyAgICBzcDxNZWRpYVBsYXllcjJCYXNlPiBwID0gZ2V0UGxheWVyKCk7CisgICAgaWYgKHAgPT0gMCkgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgc3RhdHVzX3QgcmV0ID0gcC0+cHJlcGFyZUFzeW5jKCk7CisjaWYgQ0FMTEJBQ0tfQU5UQUdPTklaRVIKKyAgICBBTE9HRCgic3RhcnQgQW50YWdvbml6ZXIiKTsKKyAgICBpZiAocmV0ID09IE5PX0VSUk9SKSBtQW50YWdvbml6ZXItPnN0YXJ0KCk7CisjZW5kaWYKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjJNYW5hZ2VyOjpDbGllbnQ6OnN0YXJ0KCkKK3sKKyAgICBBTE9HVigiWyVkXSBzdGFydCIsIG1Db25uSWQpOworICAgIHNwPE1lZGlhUGxheWVyMkJhc2U+IHAgPSBnZXRQbGF5ZXIoKTsKKyAgICBpZiAocCA9PSAwKSByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICBwLT5zZXRMb29waW5nKG1Mb29wKTsKKyAgICByZXR1cm4gcC0+c3RhcnQoKTsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyTWFuYWdlcjo6Q2xpZW50OjpzdG9wKCkKK3sKKyAgICBBTE9HVigiWyVkXSBzdG9wIiwgbUNvbm5JZCk7CisgICAgc3A8TWVkaWFQbGF5ZXIyQmFzZT4gcCA9IGdldFBsYXllcigpOworICAgIGlmIChwID09IDApIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIHJldHVybiBwLT5zdG9wKCk7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMk1hbmFnZXI6OkNsaWVudDo6cGF1c2UoKQoreworICAgIEFMT0dWKCJbJWRdIHBhdXNlIiwgbUNvbm5JZCk7CisgICAgc3A8TWVkaWFQbGF5ZXIyQmFzZT4gcCA9IGdldFBsYXllcigpOworICAgIGlmIChwID09IDApIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIHJldHVybiBwLT5wYXVzZSgpOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjJNYW5hZ2VyOjpDbGllbnQ6OmlzUGxheWluZyhib29sKiBzdGF0ZSkKK3sKKyAgICAqc3RhdGUgPSBmYWxzZTsKKyAgICBzcDxNZWRpYVBsYXllcjJCYXNlPiBwID0gZ2V0UGxheWVyKCk7CisgICAgaWYgKHAgPT0gMCkgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgKnN0YXRlID0gcC0+aXNQbGF5aW5nKCk7CisgICAgQUxPR1YoIlslZF0gaXNQbGF5aW5nOiAlZCIsIG1Db25uSWQsICpzdGF0ZSk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjJNYW5hZ2VyOjpDbGllbnQ6OnNldFBsYXliYWNrU2V0dGluZ3MoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUmIHJhdGUpCit7CisgICAgQUxPR1YoIlslZF0gc2V0UGxheWJhY2tTZXR0aW5ncyglZiwgJWYsICVkLCAlZCkiLAorICAgICAgICAgICAgbUNvbm5JZCwgcmF0ZS5tU3BlZWQsIHJhdGUubVBpdGNoLCByYXRlLm1GYWxsYmFja01vZGUsIHJhdGUubVN0cmV0Y2hNb2RlKTsKKyAgICBzcDxNZWRpYVBsYXllcjJCYXNlPiBwID0gZ2V0UGxheWVyKCk7CisgICAgaWYgKHAgPT0gMCkgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgcmV0dXJuIHAtPnNldFBsYXliYWNrU2V0dGluZ3MocmF0ZSk7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMk1hbmFnZXI6OkNsaWVudDo6Z2V0UGxheWJhY2tTZXR0aW5ncyhBdWRpb1BsYXliYWNrUmF0ZSogcmF0ZSAvKiBub25udWxsICovKQoreworICAgIHNwPE1lZGlhUGxheWVyMkJhc2U+IHAgPSBnZXRQbGF5ZXIoKTsKKyAgICBpZiAocCA9PSAwKSByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICBzdGF0dXNfdCByZXQgPSBwLT5nZXRQbGF5YmFja1NldHRpbmdzKHJhdGUpOworICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR1YoIlslZF0gZ2V0UGxheWJhY2tTZXR0aW5ncyglZiwgJWYsICVkLCAlZCkiLAorICAgICAgICAgICAgICAgIG1Db25uSWQsIHJhdGUtPm1TcGVlZCwgcmF0ZS0+bVBpdGNoLCByYXRlLT5tRmFsbGJhY2tNb2RlLCByYXRlLT5tU3RyZXRjaE1vZGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJbJWRdIGdldFBsYXliYWNrU2V0dGluZ3MgcmV0dXJuZWQgJWQiLCBtQ29ubklkLCByZXQpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjJNYW5hZ2VyOjpDbGllbnQ6OnNldFN5bmNTZXR0aW5ncygKKyAgICAgICAgY29uc3QgQVZTeW5jU2V0dGluZ3MmIHN5bmMsIGZsb2F0IHZpZGVvRnBzSGludCkKK3sKKyAgICBBTE9HVigiWyVkXSBzZXRTeW5jU2V0dGluZ3MoJXUsICV1LCAlZiwgJWYpIiwKKyAgICAgICAgICAgIG1Db25uSWQsIHN5bmMubVNvdXJjZSwgc3luYy5tQXVkaW9BZGp1c3RNb2RlLCBzeW5jLm1Ub2xlcmFuY2UsIHZpZGVvRnBzSGludCk7CisgICAgc3A8TWVkaWFQbGF5ZXIyQmFzZT4gcCA9IGdldFBsYXllcigpOworICAgIGlmIChwID09IDApIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIHJldHVybiBwLT5zZXRTeW5jU2V0dGluZ3Moc3luYywgdmlkZW9GcHNIaW50KTsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyTWFuYWdlcjo6Q2xpZW50OjpnZXRTeW5jU2V0dGluZ3MoCisgICAgICAgIEFWU3luY1NldHRpbmdzKiBzeW5jIC8qIG5vbm51bGwgKi8sIGZsb2F0KiB2aWRlb0ZwcyAvKiBub25udWxsICovKQoreworICAgIHNwPE1lZGlhUGxheWVyMkJhc2U+IHAgPSBnZXRQbGF5ZXIoKTsKKyAgICBpZiAocCA9PSAwKSByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICBzdGF0dXNfdCByZXQgPSBwLT5nZXRTeW5jU2V0dGluZ3Moc3luYywgdmlkZW9GcHMpOworICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR1YoIlslZF0gZ2V0U3luY1NldHRpbmdzKCV1LCAldSwgJWYsICVmKSIsCisgICAgICAgICAgICAgICAgbUNvbm5JZCwgc3luYy0+bVNvdXJjZSwgc3luYy0+bUF1ZGlvQWRqdXN0TW9kZSwgc3luYy0+bVRvbGVyYW5jZSwgKnZpZGVvRnBzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiWyVkXSBnZXRTeW5jU2V0dGluZ3MgcmV0dXJuZWQgJWQiLCBtQ29ubklkLCByZXQpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjJNYW5hZ2VyOjpDbGllbnQ6OmdldEN1cnJlbnRQb3NpdGlvbihpbnQgKm1zZWMpCit7CisgICAgQUxPR1YoImdldEN1cnJlbnRQb3NpdGlvbiIpOworICAgIHNwPE1lZGlhUGxheWVyMkJhc2U+IHAgPSBnZXRQbGF5ZXIoKTsKKyAgICBpZiAocCA9PSAwKSByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICBzdGF0dXNfdCByZXQgPSBwLT5nZXRDdXJyZW50UG9zaXRpb24obXNlYyk7CisgICAgaWYgKHJldCA9PSBOT19FUlJPUikgeworICAgICAgICBBTE9HVigiWyVkXSBnZXRDdXJyZW50UG9zaXRpb24gPSAlZCIsIG1Db25uSWQsICptc2VjKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiZ2V0Q3VycmVudFBvc2l0aW9uIHJldHVybmVkICVkIiwgcmV0KTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyTWFuYWdlcjo6Q2xpZW50OjpnZXREdXJhdGlvbihpbnQgKm1zZWMpCit7CisgICAgQUxPR1YoImdldER1cmF0aW9uIik7CisgICAgc3A8TWVkaWFQbGF5ZXIyQmFzZT4gcCA9IGdldFBsYXllcigpOworICAgIGlmIChwID09IDApIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIHN0YXR1c190IHJldCA9IHAtPmdldER1cmF0aW9uKG1zZWMpOworICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR1YoIlslZF0gZ2V0RHVyYXRpb24gPSAlZCIsIG1Db25uSWQsICptc2VjKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiZ2V0RHVyYXRpb24gcmV0dXJuZWQgJWQiLCByZXQpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjJNYW5hZ2VyOjpDbGllbnQ6OnNldE5leHRQbGF5ZXIoY29uc3Qgc3A8TWVkaWFQbGF5ZXIyRW5naW5lPiYgcGxheWVyKSB7CisgICAgQUxPR1YoInNldE5leHRQbGF5ZXIiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgc3A8Q2xpZW50PiBjID0gc3RhdGljX2Nhc3Q8Q2xpZW50Kj4ocGxheWVyLmdldCgpKTsKKyAgICBpZiAoYyAhPSBOVUxMICYmICFnTWVkaWFQbGF5ZXIyTWFuYWdlci5oYXNDbGllbnQoYykpIHsKKyAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgbU5leHRDbGllbnQgPSBjOworCisgICAgaWYgKGMgIT0gTlVMTCkgeworICAgICAgICBpZiAobUF1ZGlvT3V0cHV0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1BdWRpb091dHB1dC0+c2V0TmV4dE91dHB1dChjLT5tQXVkaW9PdXRwdXQpOworICAgICAgICB9IGVsc2UgaWYgKChtUGxheWVyICE9IE5VTEwpICYmICFtUGxheWVyLT5oYXJkd2FyZU91dHB1dCgpKSB7CisgICAgICAgICAgICBBTE9HRSgibm8gY3VycmVudCBhdWRpbyBvdXRwdXQiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgobVBsYXllciAhPSBOVUxMKSAmJiAobU5leHRDbGllbnQtPmdldFBsYXllcigpICE9IE5VTEwpKSB7CisgICAgICAgICAgICBtUGxheWVyLT5zZXROZXh0UGxheWVyKG1OZXh0Q2xpZW50LT5nZXRQbGF5ZXIoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK1ZvbHVtZVNoYXBlcjo6U3RhdHVzIE1lZGlhUGxheWVyMk1hbmFnZXI6OkNsaWVudDo6YXBwbHlWb2x1bWVTaGFwZXIoCisgICAgICAgIGNvbnN0IHNwPFZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbj4mIGNvbmZpZ3VyYXRpb24sCisgICAgICAgIGNvbnN0IHNwPFZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uPiYgb3BlcmF0aW9uKSB7CisgICAgLy8gZm9yIGhhcmR3YXJlIG91dHB1dCwgY2FsbCBwbGF5ZXIgaW5zdGVhZAorICAgIEFMT0dWKCJDbGllbnQ6OmFwcGx5Vm9sdW1lU2hhcGVyKCVwKSIsIHRoaXMpOworICAgIHNwPE1lZGlhUGxheWVyMkJhc2U+IHAgPSBnZXRQbGF5ZXIoKTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICAgICAgaWYgKHAgIT0gMCAmJiBwLT5oYXJkd2FyZU91dHB1dCgpKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBpbnZlc3RpZ2F0ZSBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbgorICAgICAgICAgICAgcmV0dXJuIFZvbHVtZVNoYXBlcjo6U3RhdHVzKElOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUF1ZGlvT3V0cHV0LmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBtQXVkaW9PdXRwdXQtPmFwcGx5Vm9sdW1lU2hhcGVyKGNvbmZpZ3VyYXRpb24sIG9wZXJhdGlvbik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFZvbHVtZVNoYXBlcjo6U3RhdHVzKElOVkFMSURfT1BFUkFUSU9OKTsKK30KKworc3A8Vm9sdW1lU2hhcGVyOjpTdGF0ZT4gTWVkaWFQbGF5ZXIyTWFuYWdlcjo6Q2xpZW50OjpnZXRWb2x1bWVTaGFwZXJTdGF0ZShpbnQgaWQpIHsKKyAgICAvLyBmb3IgaGFyZHdhcmUgb3V0cHV0LCBjYWxsIHBsYXllciBpbnN0ZWFkCisgICAgQUxPR1YoIkNsaWVudDo6Z2V0Vm9sdW1lU2hhcGVyU3RhdGUoJXApIiwgdGhpcyk7CisgICAgc3A8TWVkaWFQbGF5ZXIyQmFzZT4gcCA9IGdldFBsYXllcigpOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgICAgICBpZiAocCAhPSAwICYmIHAtPmhhcmR3YXJlT3V0cHV0KCkpIHsKKyAgICAgICAgICAgIC8vIFRPRE86IGludmVzdGlnYXRlIGludGVybmFsIGltcGxlbWVudGF0aW9uLgorICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1BdWRpb091dHB1dC5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gbUF1ZGlvT3V0cHV0LT5nZXRWb2x1bWVTaGFwZXJTdGF0ZShpZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMk1hbmFnZXI6OkNsaWVudDo6c2Vla1RvKGludCBtc2VjLCBNZWRpYVBsYXllcjJTZWVrTW9kZSBtb2RlKQoreworICAgIEFMT0dWKCJbJWRdIHNlZWtUbyglZCwgJWQpIiwgbUNvbm5JZCwgbXNlYywgbW9kZSk7CisgICAgc3A8TWVkaWFQbGF5ZXIyQmFzZT4gcCA9IGdldFBsYXllcigpOworICAgIGlmIChwID09IDApIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIHJldHVybiBwLT5zZWVrVG8obXNlYywgbW9kZSk7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMk1hbmFnZXI6OkNsaWVudDo6cmVzZXQoKQoreworICAgIEFMT0dWKCJbJWRdIHJlc2V0IiwgbUNvbm5JZCk7CisgICAgbVJldHJhbnNtaXRFbmRwb2ludFZhbGlkID0gZmFsc2U7CisgICAgc3A8TWVkaWFQbGF5ZXIyQmFzZT4gcCA9IGdldFBsYXllcigpOworICAgIGlmIChwID09IDApIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIHJldHVybiBwLT5yZXNldCgpOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjJNYW5hZ2VyOjpDbGllbnQ6Om5vdGlmeUF0KGludDY0X3QgbWVkaWFUaW1lVXMpCit7CisgICAgQUxPR1YoIlslZF0gbm90aWZ5QXQoJWxsZCkiLCBtQ29ubklkLCAobG9uZyBsb25nKW1lZGlhVGltZVVzKTsKKyAgICBzcDxNZWRpYVBsYXllcjJCYXNlPiBwID0gZ2V0UGxheWVyKCk7CisgICAgaWYgKHAgPT0gMCkgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgcmV0dXJuIHAtPm5vdGlmeUF0KG1lZGlhVGltZVVzKTsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyTWFuYWdlcjo6Q2xpZW50OjpzZXRBdWRpb1N0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCB0eXBlKQoreworICAgIEFMT0dWKCJbJWRdIHNldEF1ZGlvU3RyZWFtVHlwZSglZCkiLCBtQ29ubklkLCB0eXBlKTsKKyAgICAvLyBUT0RPOiBmb3IgaGFyZHdhcmUgb3V0cHV0LCBjYWxsIHBsYXllciBpbnN0ZWFkCisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgIGlmIChtQXVkaW9PdXRwdXQgIT0gMCkgbUF1ZGlvT3V0cHV0LT5zZXRBdWRpb1N0cmVhbVR5cGUodHlwZSk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjJNYW5hZ2VyOjpDbGllbnQ6OnNldEF1ZGlvQXR0cmlidXRlc19sKGNvbnN0IFBhcmNlbCAmcGFyY2VsKQoreworICAgIGlmIChtQXVkaW9BdHRyaWJ1dGVzICE9IE5VTEwpIHsgZnJlZShtQXVkaW9BdHRyaWJ1dGVzKTsgfQorICAgIG1BdWRpb0F0dHJpYnV0ZXMgPSAoYXVkaW9fYXR0cmlidXRlc190ICopIGNhbGxvYygxLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7CisgICAgaWYgKG1BdWRpb0F0dHJpYnV0ZXMgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKyAgICB1bm1hcnNoYWxsQXVkaW9BdHRyaWJ1dGVzKHBhcmNlbCwgbUF1ZGlvQXR0cmlidXRlcyk7CisKKyAgICBBTE9HVigic2V0QXVkaW9BdHRyaWJ1dGVzX2woKSB1c2FnZT0lZCBjb250ZW50PSVkIGZsYWdzPTB4JXggdGFncz0lcyIsCisgICAgICAgICAgICBtQXVkaW9BdHRyaWJ1dGVzLT51c2FnZSwgbUF1ZGlvQXR0cmlidXRlcy0+Y29udGVudF90eXBlLCBtQXVkaW9BdHRyaWJ1dGVzLT5mbGFncywKKyAgICAgICAgICAgIG1BdWRpb0F0dHJpYnV0ZXMtPnRhZ3MpOworCisgICAgaWYgKG1BdWRpb091dHB1dCAhPSAwKSB7CisgICAgICAgIG1BdWRpb091dHB1dC0+c2V0QXVkaW9BdHRyaWJ1dGVzKG1BdWRpb0F0dHJpYnV0ZXMpOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMk1hbmFnZXI6OkNsaWVudDo6c2V0TG9vcGluZyhpbnQgbG9vcCkKK3sKKyAgICBBTE9HVigiWyVkXSBzZXRMb29waW5nKCVkKSIsIG1Db25uSWQsIGxvb3ApOworICAgIG1Mb29wID0gbG9vcDsKKyAgICBzcDxNZWRpYVBsYXllcjJCYXNlPiBwID0gZ2V0UGxheWVyKCk7CisgICAgaWYgKHAgIT0gMCkgcmV0dXJuIHAtPnNldExvb3BpbmcobG9vcCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjJNYW5hZ2VyOjpDbGllbnQ6OnNldFZvbHVtZShmbG9hdCBsZWZ0Vm9sdW1lLCBmbG9hdCByaWdodFZvbHVtZSkKK3sKKyAgICBBTE9HVigiWyVkXSBzZXRWb2x1bWUoJWYsICVmKSIsIG1Db25uSWQsIGxlZnRWb2x1bWUsIHJpZ2h0Vm9sdW1lKTsKKworICAgIC8vIGZvciBoYXJkd2FyZSBvdXRwdXQsIGNhbGwgcGxheWVyIGluc3RlYWQKKyAgICBzcDxNZWRpYVBsYXllcjJCYXNlPiBwID0gZ2V0UGxheWVyKCk7CisgICAgeworICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgICAgaWYgKHAgIT0gMCAmJiBwLT5oYXJkd2FyZU91dHB1dCgpKSB7CisgICAgICAgICAgTWVkaWFQbGF5ZXJIV0ludGVyZmFjZSogaHdwID0KKyAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8TWVkaWFQbGF5ZXJIV0ludGVyZmFjZSo+KHAuZ2V0KCkpOworICAgICAgICAgIHJldHVybiBod3AtPnNldFZvbHVtZShsZWZ0Vm9sdW1lLCByaWdodFZvbHVtZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmIChtQXVkaW9PdXRwdXQgIT0gMCkgbUF1ZGlvT3V0cHV0LT5zZXRWb2x1bWUobGVmdFZvbHVtZSwgcmlnaHRWb2x1bWUpOworICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMk1hbmFnZXI6OkNsaWVudDo6c2V0QXV4RWZmZWN0U2VuZExldmVsKGZsb2F0IGxldmVsKQoreworICAgIEFMT0dWKCJbJWRdIHNldEF1eEVmZmVjdFNlbmRMZXZlbCglZikiLCBtQ29ubklkLCBsZXZlbCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgIGlmIChtQXVkaW9PdXRwdXQgIT0gMCkgcmV0dXJuIG1BdWRpb091dHB1dC0+c2V0QXV4RWZmZWN0U2VuZExldmVsKGxldmVsKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMk1hbmFnZXI6OkNsaWVudDo6YXR0YWNoQXV4RWZmZWN0KGludCBlZmZlY3RJZCkKK3sKKyAgICBBTE9HVigiWyVkXSBhdHRhY2hBdXhFZmZlY3QoJWQpIiwgbUNvbm5JZCwgZWZmZWN0SWQpOworICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICBpZiAobUF1ZGlvT3V0cHV0ICE9IDApIHJldHVybiBtQXVkaW9PdXRwdXQtPmF0dGFjaEF1eEVmZmVjdChlZmZlY3RJZCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjJNYW5hZ2VyOjpDbGllbnQ6OnNldFBhcmFtZXRlcihpbnQga2V5LCBjb25zdCBQYXJjZWwgJnJlcXVlc3QpIHsKKyAgICBBTE9HVigiWyVkXSBzZXRQYXJhbWV0ZXIoJWQpIiwgbUNvbm5JZCwga2V5KTsKKyAgICBzd2l0Y2ggKGtleSkgeworICAgIGNhc2UgTUVESUEyX0tFWV9QQVJBTUVURVJfQVVESU9fQVRUUklCVVRFUzoKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICAgICAgcmV0dXJuIHNldEF1ZGlvQXR0cmlidXRlc19sKHJlcXVlc3QpOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgICBzcDxNZWRpYVBsYXllcjJCYXNlPiBwID0gZ2V0UGxheWVyKCk7CisgICAgICAgIGlmIChwID09IDApIHsgcmV0dXJuIFVOS05PV05fRVJST1I7IH0KKyAgICAgICAgcmV0dXJuIHAtPnNldFBhcmFtZXRlcihrZXksIHJlcXVlc3QpOworICAgIH0KK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyTWFuYWdlcjo6Q2xpZW50OjpnZXRQYXJhbWV0ZXIoaW50IGtleSwgUGFyY2VsICpyZXBseSkgeworICAgIEFMT0dWKCJbJWRdIGdldFBhcmFtZXRlciglZCkiLCBtQ29ubklkLCBrZXkpOworICAgIHNwPE1lZGlhUGxheWVyMkJhc2U+IHAgPSBnZXRQbGF5ZXIoKTsKKyAgICBpZiAocCA9PSAwKSByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICByZXR1cm4gcC0+Z2V0UGFyYW1ldGVyKGtleSwgcmVwbHkpOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjJNYW5hZ2VyOjpDbGllbnQ6OnNldFJldHJhbnNtaXRFbmRwb2ludCgKKyAgICAgICAgY29uc3Qgc3RydWN0IHNvY2thZGRyX2luKiBlbmRwb2ludCkgeworCisgICAgaWYgKE5VTEwgIT0gZW5kcG9pbnQpIHsKKyAgICAgICAgdWludDMyX3QgYSA9IG50b2hsKGVuZHBvaW50LT5zaW5fYWRkci5zX2FkZHIpOworICAgICAgICB1aW50MTZfdCBwID0gbnRvaHMoZW5kcG9pbnQtPnNpbl9wb3J0KTsKKyAgICAgICAgQUxPR1YoIlslZF0gc2V0UmV0cmFuc21pdEVuZHBvaW50KCV1LiV1LiV1LiV1OiVodSkiLCBtQ29ubklkLAorICAgICAgICAgICAgICAgIChhID4+IDI0KSwgKGEgPj4gMTYpICYgMHhGRiwgKGEgPj4gOCkgJiAweEZGLCAoYSAmIDB4RkYpLCBwKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiWyVkXSBzZXRSZXRyYW5zbWl0RW5kcG9pbnQgPSA8bm9uZT4iLCBtQ29ubklkKTsKKyAgICB9CisKKyAgICBzcDxNZWRpYVBsYXllcjJCYXNlPiBwID0gZ2V0UGxheWVyKCk7CisKKyAgICAvLyBSaWdodCBub3csIHRoZSBvbmx5IHZhbGlkIHRpbWUgdG8gc2V0IGEgcmV0cmFuc21pdCBlbmRwb2ludCBpcyBiZWZvcmUKKyAgICAvLyBwbGF5ZXIgc2VsZWN0aW9uIGhhcyBiZWVuIG1hZGUgKHNpbmNlIHRoZSBwcmVzZW5jZSBvciBhYnNlbmNlIG9mIGEKKyAgICAvLyByZXRyYW5zbWl0IGVuZHBvaW50IGlzIGdvaW5nIHRvIGRldGVybWluZSB3aGljaCBwbGF5ZXIgaXMgc2VsZWN0ZWQgZHVyaW5nCisgICAgLy8gc2V0RGF0YVNvdXJjZSkuCisgICAgaWYgKHAgIT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworCisgICAgaWYgKE5VTEwgIT0gZW5kcG9pbnQpIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgICAgICBtUmV0cmFuc21pdEVuZHBvaW50ID0gKmVuZHBvaW50OworICAgICAgICBtUmV0cmFuc21pdEVuZHBvaW50VmFsaWQgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICAgICAgbVJldHJhbnNtaXRFbmRwb2ludFZhbGlkID0gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjJNYW5hZ2VyOjpDbGllbnQ6OmdldFJldHJhbnNtaXRFbmRwb2ludCgKKyAgICAgICAgc3RydWN0IHNvY2thZGRyX2luKiBlbmRwb2ludCkKK3sKKyAgICBpZiAoTlVMTCA9PSBlbmRwb2ludCkKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKworICAgIHNwPE1lZGlhUGxheWVyMkJhc2U+IHAgPSBnZXRQbGF5ZXIoKTsKKworICAgIGlmIChwICE9IE5VTEwpCisgICAgICAgIHJldHVybiBwLT5nZXRSZXRyYW5zbWl0RW5kcG9pbnQoZW5kcG9pbnQpOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIGlmICghbVJldHJhbnNtaXRFbmRwb2ludFZhbGlkKQorICAgICAgICByZXR1cm4gTk9fSU5JVDsKKworICAgICplbmRwb2ludCA9IG1SZXRyYW5zbWl0RW5kcG9pbnQ7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3ZvaWQgTWVkaWFQbGF5ZXIyTWFuYWdlcjo6Q2xpZW50Ojpub3RpZnkoCisgICAgICAgIGNvbnN0IHdwPE1lZGlhUGxheWVyMkVuZ2luZT4gJmxpc3RlbmVyLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqb2JqKQoreworICAgIHNwPE1lZGlhUGxheWVyMkVuZ2luZT4gc3BMaXN0ZW5lciA9IGxpc3RlbmVyLnByb21vdGUoKTsKKyAgICBpZiAoc3BMaXN0ZW5lciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQ2xpZW50KiBjbGllbnQgPSBzdGF0aWNfY2FzdDxDbGllbnQqPihzcExpc3RlbmVyLmdldCgpKTsKKworICAgIHNwPE1lZGlhUGxheWVyMkVuZ2luZUNsaWVudD4gYzsKKyAgICBzcDxDbGllbnQ+IG5leHRDbGllbnQ7CisgICAgc3RhdHVzX3QgZXJyU3RhcnROZXh0ID0gTk9fRVJST1I7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChjbGllbnQtPm1Mb2NrKTsKKyAgICAgICAgYyA9IGNsaWVudC0+bUNsaWVudDsKKyAgICAgICAgaWYgKG1zZyA9PSBNRURJQTJfUExBWUJBQ0tfQ09NUExFVEUgJiYgY2xpZW50LT5tTmV4dENsaWVudCAhPSBOVUxMKSB7CisgICAgICAgICAgICBuZXh0Q2xpZW50ID0gY2xpZW50LT5tTmV4dENsaWVudDsKKworICAgICAgICAgICAgaWYgKGNsaWVudC0+bUF1ZGlvT3V0cHV0ICE9IE5VTEwpCisgICAgICAgICAgICAgICAgY2xpZW50LT5tQXVkaW9PdXRwdXQtPnN3aXRjaFRvTmV4dE91dHB1dCgpOworCisgICAgICAgICAgICBlcnJTdGFydE5leHQgPSBuZXh0Q2xpZW50LT5zdGFydCgpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG5leHRDbGllbnQgIT0gTlVMTCkgeworICAgICAgICBzcDxNZWRpYVBsYXllcjJFbmdpbmVDbGllbnQ+IG5jOworICAgICAgICB7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChuZXh0Q2xpZW50LT5tTG9jayk7CisgICAgICAgICAgICBuYyA9IG5leHRDbGllbnQtPm1DbGllbnQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5jICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChlcnJTdGFydE5leHQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBuYy0+bm90aWZ5KE1FRElBMl9JTkZPLCBNRURJQTJfSU5GT19TVEFSVEVEX0FTX05FWFQsIDAsIG9iaik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG5jLT5ub3RpZnkoTUVESUEyX0VSUk9SLCBNRURJQTJfRVJST1JfVU5LTk9XTiAsIDAsIG9iaik7CisgICAgICAgICAgICAgICAgQUxPR0UoImdhcGxlc3M6c3RhcnQgcGxheWJhY2sgZm9yIG5leHQgdHJhY2sgZmFpbGVkLCBlcnIoJWQpIiwgZXJyU3RhcnROZXh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChNRURJQTJfSU5GTyA9PSBtc2cgJiYKKyAgICAgICAgTUVESUEyX0lORk9fTUVUQURBVEFfVVBEQVRFID09IGV4dDEpIHsKKyAgICAgICAgY29uc3QgbWVkaWE6Ok1ldGFkYXRhOjpUeXBlIG1ldGFkYXRhX3R5cGUgPSBleHQyOworCisgICAgICAgIGlmKGNsaWVudC0+c2hvdWxkRHJvcE1ldGFkYXRhKG1ldGFkYXRhX3R5cGUpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBVcGRhdGUgdGhlIGxpc3Qgb2YgbWV0YWRhdGEgdGhhdCBoYXZlIGNoYW5nZWQuIGdldE1ldGFkYXRhCisgICAgICAgIC8vIGFsc28gYWNjZXNzIG1NZXRhZGF0YVVwZGF0ZWQgYW5kIGNsZWFycyBpdC4KKyAgICAgICAgY2xpZW50LT5hZGROZXdNZXRhZGF0YVVwZGF0ZShtZXRhZGF0YV90eXBlKTsKKyAgICB9CisKKyAgICBpZiAoYyAhPSBOVUxMKSB7CisgICAgICAgIEFMT0dWKCJbJWRdIG5vdGlmeSAoJXAsICVkLCAlZCwgJWQpIiwgY2xpZW50LT5tQ29ubklkLCBzcExpc3RlbmVyLmdldCgpLCBtc2csIGV4dDEsIGV4dDIpOworICAgICAgICBjLT5ub3RpZnkobXNnLCBleHQxLCBleHQyLCBvYmopOworICAgIH0KK30KKworCitib29sIE1lZGlhUGxheWVyMk1hbmFnZXI6OkNsaWVudDo6c2hvdWxkRHJvcE1ldGFkYXRhKG1lZGlhOjpNZXRhZGF0YTo6VHlwZSBjb2RlKSBjb25zdAoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKworICAgIGlmIChmaW5kTWV0YWRhdGEobU1ldGFkYXRhRHJvcCwgY29kZSkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaWYgKG1NZXRhZGF0YUFsbG93LmlzRW1wdHkoKSB8fCBmaW5kTWV0YWRhdGEobU1ldGFkYXRhQWxsb3csIGNvZGUpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9CisKKwordm9pZCBNZWRpYVBsYXllcjJNYW5hZ2VyOjpDbGllbnQ6OmFkZE5ld01ldGFkYXRhVXBkYXRlKG1lZGlhOjpNZXRhZGF0YTo6VHlwZSBtZXRhZGF0YV90eXBlKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIGlmIChtTWV0YWRhdGFVcGRhdGVkLmluZGV4T2YobWV0YWRhdGFfdHlwZSkgPCAwKSB7CisgICAgICAgIG1NZXRhZGF0YVVwZGF0ZWQuYWRkKG1ldGFkYXRhX3R5cGUpOworICAgIH0KK30KKworLy8gTW9kdWxhciBEUk0KK3N0YXR1c190IE1lZGlhUGxheWVyMk1hbmFnZXI6OkNsaWVudDo6cHJlcGFyZURybShjb25zdCB1aW50OF90IHV1aWRbMTZdLAorICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIGRybVNlc3Npb25JZCkKK3sKKyAgICBBTE9HVigiWyVkXSBwcmVwYXJlRHJtIiwgbUNvbm5JZCk7CisgICAgc3A8TWVkaWFQbGF5ZXIyQmFzZT4gcCA9IGdldFBsYXllcigpOworICAgIGlmIChwID09IDApIHJldHVybiBVTktOT1dOX0VSUk9SOworCisgICAgc3RhdHVzX3QgcmV0ID0gcC0+cHJlcGFyZURybSh1dWlkLCBkcm1TZXNzaW9uSWQpOworICAgIEFMT0dWKCJwcmVwYXJlRHJtIHJldDogJWQiLCByZXQpOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyTWFuYWdlcjo6Q2xpZW50OjpyZWxlYXNlRHJtKCkKK3sKKyAgICBBTE9HVigiWyVkXSByZWxlYXNlRHJtIiwgbUNvbm5JZCk7CisgICAgc3A8TWVkaWFQbGF5ZXIyQmFzZT4gcCA9IGdldFBsYXllcigpOworICAgIGlmIChwID09IDApIHJldHVybiBVTktOT1dOX0VSUk9SOworCisgICAgc3RhdHVzX3QgcmV0ID0gcC0+cmVsZWFzZURybSgpOworICAgIEFMT0dWKCJyZWxlYXNlRHJtIHJldDogJWQiLCByZXQpOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyTWFuYWdlcjo6Q2xpZW50OjpzZXRPdXRwdXREZXZpY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCkKK3sKKyAgICBBTE9HVigiWyVkXSBzZXRPdXRwdXREZXZpY2UiLCBtQ29ubklkKTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICAgICAgaWYgKG1BdWRpb091dHB1dC5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gbUF1ZGlvT3V0cHV0LT5zZXRPdXRwdXREZXZpY2UoZGV2aWNlSWQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOT19JTklUOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjJNYW5hZ2VyOjpDbGllbnQ6OmdldFJvdXRlZERldmljZUlkKGF1ZGlvX3BvcnRfaGFuZGxlX3QqIGRldmljZUlkKQoreworICAgIEFMT0dWKCJbJWRdIGdldFJvdXRlZERldmljZUlkIiwgbUNvbm5JZCk7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgICAgIGlmIChtQXVkaW9PdXRwdXQuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIG1BdWRpb091dHB1dC0+Z2V0Um91dGVkRGV2aWNlSWQoZGV2aWNlSWQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOT19JTklUOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjJNYW5hZ2VyOjpDbGllbnQ6OmVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soYm9vbCBlbmFibGVkKQoreworICAgIEFMT0dWKCJbJWRdIGVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2ssICVkIiwgbUNvbm5JZCwgZW5hYmxlZCk7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgICAgIGlmIChtQXVkaW9PdXRwdXQuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIG1BdWRpb091dHB1dC0+ZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayhlbmFibGVkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTk9fSU5JVDsKK30KKworI2lmIENBTExCQUNLX0FOVEFHT05JWkVSCitjb25zdCBpbnQgQW50YWdvbml6ZXI6OmludGVydmFsID0gMTAwMDA7IC8vIDEwIG1zZWNzCisKK0FudGFnb25pemVyOjpBbnRhZ29uaXplcigKKyAgICAgICAgTWVkaWFQbGF5ZXIyTWFuYWdlcjo6Tm90aWZ5Q2FsbGJhY2sgY2IsCisgICAgICAgIGNvbnN0IHdwPE1lZGlhUGxheWVyMkVuZ2luZT4gJmNsaWVudCkgOgorICAgIG1FeGl0KGZhbHNlKSwgbUFjdGl2ZShmYWxzZSksIG1DbGllbnQoY2xpZW50KSwgbUNiKGNiKQoreworICAgIGNyZWF0ZVRocmVhZChjYWxsYmFja1RocmVhZCwgdGhpcyk7Cit9CisKK3ZvaWQgQW50YWdvbml6ZXI6OmtpbGwoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbUFjdGl2ZSA9IGZhbHNlOworICAgIG1FeGl0ID0gdHJ1ZTsKKyAgICBtQ29uZGl0aW9uLndhaXQobUxvY2spOworfQorCitpbnQgQW50YWdvbml6ZXI6OmNhbGxiYWNrVGhyZWFkKHZvaWQqIHVzZXIpCit7CisgICAgQUxPR0QoIkFudGFnb25pemVyIHN0YXJ0ZWQiKTsKKyAgICBBbnRhZ29uaXplciogcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8QW50YWdvbml6ZXIqPih1c2VyKTsKKyAgICB3aGlsZSAoIXAtPm1FeGl0KSB7CisgICAgICAgIGlmIChwLT5tQWN0aXZlKSB7CisgICAgICAgICAgICBBTE9HVigic2VuZCBldmVudCIpOworICAgICAgICAgICAgcC0+bUNiKHAtPm1DbGllbnQsIDAsIDAsIDApOworICAgICAgICB9CisgICAgICAgIHVzbGVlcChpbnRlcnZhbCk7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChwLT5tTG9jayk7CisgICAgcC0+bUNvbmRpdGlvbi5zaWduYWwoKTsKKyAgICBBTE9HRCgiQW50YWdvbml6ZXIgc3RvcHBlZCIpOworICAgIHJldHVybiAwOworfQorI2VuZGlmCisKKyN1bmRlZiBMT0dfVEFHCisjZGVmaW5lIExPR19UQUcgIkF1ZGlvU2luayIKK01lZGlhUGxheWVyMk1hbmFnZXI6OkF1ZGlvT3V0cHV0OjpBdWRpb091dHB1dChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLCB1aWRfdCB1aWQsIGludCBwaWQsCisgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogYXR0ciwgY29uc3Qgc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBkZXZpY2VDYWxsYmFjaykKKyAgICA6IG1DYWxsYmFjayhOVUxMKSwKKyAgICAgIG1DYWxsYmFja0Nvb2tpZShOVUxMKSwKKyAgICAgIG1DYWxsYmFja0RhdGEoTlVMTCksCisgICAgICBtU3RyZWFtVHlwZShBVURJT19TVFJFQU1fTVVTSUMpLAorICAgICAgbUxlZnRWb2x1bWUoMS4wKSwKKyAgICAgIG1SaWdodFZvbHVtZSgxLjApLAorICAgICAgbVBsYXliYWNrUmF0ZShBVURJT19QTEFZQkFDS19SQVRFX0RFRkFVTFQpLAorICAgICAgbVNhbXBsZVJhdGVIeigwKSwKKyAgICAgIG1Nc2Vjc1BlckZyYW1lKDApLAorICAgICAgbUZyYW1lU2l6ZSgwKSwKKyAgICAgIG1TZXNzaW9uSWQoc2Vzc2lvbklkKSwKKyAgICAgIG1VaWQodWlkKSwKKyAgICAgIG1QaWQocGlkKSwKKyAgICAgIG1TZW5kTGV2ZWwoMC4wKSwKKyAgICAgIG1BdXhFZmZlY3RJZCgwKSwKKyAgICAgIG1GbGFncyhBVURJT19PVVRQVVRfRkxBR19OT05FKSwKKyAgICAgIG1Wb2x1bWVIYW5kbGVyKG5ldyBtZWRpYTo6Vm9sdW1lSGFuZGxlcigpKSwKKyAgICAgIG1TZWxlY3RlZERldmljZUlkKEFVRElPX1BPUlRfSEFORExFX05PTkUpLAorICAgICAgbVJvdXRlZERldmljZUlkKEFVRElPX1BPUlRfSEFORExFX05PTkUpLAorICAgICAgbURldmljZUNhbGxiYWNrRW5hYmxlZChmYWxzZSksCisgICAgICBtRGV2aWNlQ2FsbGJhY2soZGV2aWNlQ2FsbGJhY2spCit7CisgICAgQUxPR1YoIkF1ZGlvT3V0cHV0KCVkKSIsIHNlc3Npb25JZCk7CisgICAgaWYgKGF0dHIgIT0gTlVMTCkgeworICAgICAgICBtQXR0cmlidXRlcyA9IChhdWRpb19hdHRyaWJ1dGVzX3QgKikgY2FsbG9jKDEsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKKyAgICAgICAgaWYgKG1BdHRyaWJ1dGVzICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1lbWNweShtQXR0cmlidXRlcywgYXR0ciwgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOworICAgICAgICAgICAgbVN0cmVhbVR5cGUgPSBhdWRpb19hdHRyaWJ1dGVzX3RvX3N0cmVhbV90eXBlKGF0dHIpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUF0dHJpYnV0ZXMgPSBOVUxMOworICAgIH0KKworICAgIHNldE1pbkJ1ZmZlckNvdW50KCk7Cit9CisKK01lZGlhUGxheWVyMk1hbmFnZXI6OkF1ZGlvT3V0cHV0Ojp+QXVkaW9PdXRwdXQoKQoreworICAgIGNsb3NlKCk7CisgICAgZnJlZShtQXR0cmlidXRlcyk7CisgICAgZGVsZXRlIG1DYWxsYmFja0RhdGE7Cit9CisKKy8vc3RhdGljCit2b2lkIE1lZGlhUGxheWVyMk1hbmFnZXI6OkF1ZGlvT3V0cHV0OjpzZXRNaW5CdWZmZXJDb3VudCgpCit7CisgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIGlmIChwcm9wZXJ0eV9nZXQoInJvLmtlcm5lbC5xZW11IiwgdmFsdWUsIDApKSB7CisgICAgICAgIG1Jc09uRW11bGF0b3IgPSB0cnVlOworICAgICAgICBtTWluQnVmZmVyQ291bnQgPSAxMjsgIC8vIHRvIHByZXZlbnQgc3lzdGVtYXRpYyBidWZmZXIgdW5kZXJydW4gZm9yIGVtdWxhdG9yCisgICAgfQorfQorCisvLyBzdGF0aWMKK2Jvb2wgTWVkaWFQbGF5ZXIyTWFuYWdlcjo6QXVkaW9PdXRwdXQ6OmlzT25FbXVsYXRvcigpCit7CisgICAgc2V0TWluQnVmZmVyQ291bnQoKTsgLy8gYmVuaWduIHJhY2Ugd3J0IG90aGVyIHRocmVhZHMKKyAgICByZXR1cm4gbUlzT25FbXVsYXRvcjsKK30KKworLy8gc3RhdGljCitpbnQgTWVkaWFQbGF5ZXIyTWFuYWdlcjo6QXVkaW9PdXRwdXQ6OmdldE1pbkJ1ZmZlckNvdW50KCkKK3sKKyAgICBzZXRNaW5CdWZmZXJDb3VudCgpOyAvLyBiZW5pZ24gcmFjZSB3cnQgb3RoZXIgdGhyZWFkcworICAgIHJldHVybiBtTWluQnVmZmVyQ291bnQ7Cit9CisKK3NzaXplX3QgTWVkaWFQbGF5ZXIyTWFuYWdlcjo6QXVkaW9PdXRwdXQ6OmJ1ZmZlclNpemUoKSBjb25zdAoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobVRyYWNrID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBtVHJhY2stPmZyYW1lQ291bnQoKSAqIG1GcmFtZVNpemU7Cit9CisKK3NzaXplX3QgTWVkaWFQbGF5ZXIyTWFuYWdlcjo6QXVkaW9PdXRwdXQ6OmZyYW1lQ291bnQoKSBjb25zdAoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobVRyYWNrID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBtVHJhY2stPmZyYW1lQ291bnQoKTsKK30KKworc3NpemVfdCBNZWRpYVBsYXllcjJNYW5hZ2VyOjpBdWRpb091dHB1dDo6Y2hhbm5lbENvdW50KCkgY29uc3QKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgaWYgKG1UcmFjayA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gbVRyYWNrLT5jaGFubmVsQ291bnQoKTsKK30KKworc3NpemVfdCBNZWRpYVBsYXllcjJNYW5hZ2VyOjpBdWRpb091dHB1dDo6ZnJhbWVTaXplKCkgY29uc3QKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgaWYgKG1UcmFjayA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gbUZyYW1lU2l6ZTsKK30KKwordWludDMyX3QgTWVkaWFQbGF5ZXIyTWFuYWdlcjo6QXVkaW9PdXRwdXQ6OmxhdGVuY3kgKCkgY29uc3QKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgaWYgKG1UcmFjayA9PSAwKSByZXR1cm4gMDsKKyAgICByZXR1cm4gbVRyYWNrLT5sYXRlbmN5KCk7Cit9CisKK2Zsb2F0IE1lZGlhUGxheWVyMk1hbmFnZXI6OkF1ZGlvT3V0cHV0Ojptc2Vjc1BlckZyYW1lKCkgY29uc3QKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgcmV0dXJuIG1Nc2Vjc1BlckZyYW1lOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjJNYW5hZ2VyOjpBdWRpb091dHB1dDo6Z2V0UG9zaXRpb24odWludDMyX3QgKnBvc2l0aW9uKSBjb25zdAoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobVRyYWNrID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBtVHJhY2stPmdldFBvc2l0aW9uKHBvc2l0aW9uKTsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyTWFuYWdlcjo6QXVkaW9PdXRwdXQ6OmdldFRpbWVzdGFtcChBdWRpb1RpbWVzdGFtcCAmdHMpIGNvbnN0Cit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIGlmIChtVHJhY2sgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIG1UcmFjay0+Z2V0VGltZXN0YW1wKHRzKTsKK30KKworLy8gVE9ETzogUmVtb3ZlIHVubmVjZXNzYXJ5IGNhbGxzIHRvIGdldFBsYXllZE91dER1cmF0aW9uVXMoKQorLy8gYXMgaXQgYWNxdWlyZXMgbG9ja3MgYW5kIG1heSBxdWVyeSB0aGUgYXVkaW8gZHJpdmVyLgorLy8KKy8vIFNvbWUgY2FsbHMgY291bGQgY29uY2VpdmFibHkgcmV0cmlldmUgZXh0cmFwb2xhdGVkIGRhdGEgaW5zdGVhZCBvZgorLy8gYWNjZXNzaW5nIGdldFRpbWVzdGFtcCgpIG9yIGdldFBvc2l0aW9uKCkgZXZlcnkgdGltZSBhIGRhdGEgYnVmZmVyIHdpdGgKKy8vIGEgbWVkaWEgdGltZSBpcyByZWNlaXZlZC4KKy8vCisvLyBDYWxjdWxhdGUgZHVyYXRpb24gb2YgcGxheWVkIHNhbXBsZXMgaWYgcGxheWVkIGF0IG5vcm1hbCByYXRlIChpLmUuLCAxLjApLgoraW50NjRfdCBNZWRpYVBsYXllcjJNYW5hZ2VyOjpBdWRpb091dHB1dDo6Z2V0UGxheWVkT3V0RHVyYXRpb25VcyhpbnQ2NF90IG5vd1VzKSBjb25zdAoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobVRyYWNrID09IDAgfHwgbVNhbXBsZVJhdGVIeiA9PSAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHVpbnQzMl90IG51bUZyYW1lc1BsYXllZDsKKyAgICBpbnQ2NF90IG51bUZyYW1lc1BsYXllZEF0VXM7CisgICAgQXVkaW9UaW1lc3RhbXAgdHM7CisKKyAgICBzdGF0dXNfdCByZXMgPSBtVHJhY2stPmdldFRpbWVzdGFtcCh0cyk7CisgICAgaWYgKHJlcyA9PSBPSykgeyAgICAgICAgICAgICAgICAgLy8gY2FzZSAxOiBtaXhpbmcgYXVkaW8gdHJhY2tzIGFuZCBvZmZsb2FkZWQgdHJhY2tzLgorICAgICAgICBudW1GcmFtZXNQbGF5ZWQgPSB0cy5tUG9zaXRpb247CisgICAgICAgIG51bUZyYW1lc1BsYXllZEF0VXMgPSB0cy5tVGltZS50dl9zZWMgKiAxMDAwMDAwTEwgKyB0cy5tVGltZS50dl9uc2VjIC8gMTAwMDsKKyAgICAgICAgLy9BTE9HRCgiZ2V0VGltZXN0YW1wOiBPSyAlZCAlbGxkIiwgbnVtRnJhbWVzUGxheWVkLCAobG9uZyBsb25nKW51bUZyYW1lc1BsYXllZEF0VXMpOworICAgIH0gZWxzZSBpZiAocmVzID09IFdPVUxEX0JMT0NLKSB7IC8vIGNhc2UgMjogdHJhbnNpdG9yeSBzdGF0ZSBvbiBzdGFydCBvZiBhIG5ldyB0cmFjaworICAgICAgICBudW1GcmFtZXNQbGF5ZWQgPSAwOworICAgICAgICBudW1GcmFtZXNQbGF5ZWRBdFVzID0gbm93VXM7CisgICAgICAgIC8vQUxPR0QoImdldFRpbWVzdGFtcDogV09VTERfQkxPQ0sgJWQgJWxsZCIsCisgICAgICAgIC8vICAgICAgICBudW1GcmFtZXNQbGF5ZWQsIChsb25nIGxvbmcpbnVtRnJhbWVzUGxheWVkQXRVcyk7CisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FzZSAzOiB0cmFuc2l0b3J5IGF0IG5ldyB0cmFjayBvciBhdWRpbyBmYXN0IHRyYWNrcy4KKyAgICAgICAgcmVzID0gbVRyYWNrLT5nZXRQb3NpdGlvbigmbnVtRnJhbWVzUGxheWVkKTsKKyAgICAgICAgQ0hFQ0tfRVEocmVzLCAoc3RhdHVzX3QpT0spOworICAgICAgICBudW1GcmFtZXNQbGF5ZWRBdFVzID0gbm93VXM7CisgICAgICAgIG51bUZyYW1lc1BsYXllZEF0VXMgKz0gMTAwMExMICogbVRyYWNrLT5sYXRlbmN5KCkgLyAyOyAvKiBYWFggKi8KKyAgICAgICAgLy9BTE9HRCgiZ2V0UG9zaXRpb246ICV1ICVsbGQiLCBudW1GcmFtZXNQbGF5ZWQsIChsb25nIGxvbmcpbnVtRnJhbWVzUGxheWVkQXRVcyk7CisgICAgfQorCisgICAgLy8gQ0hFQ0tfRVEobnVtRnJhbWVzUGxheWVkICYgKDEgPDwgMzEpLCAwKTsgIC8vIGNhbid0IGJlIG5lZ2F0aXZlIHVudGlsIDEyLjQgaHJzLCB0ZXN0CisgICAgLy8gVE9ETzogcmVtb3ZlIHRoZSAoaW50MzJfdCkgY2FzdGluZyBiZWxvdyBhcyBpdCBtYXkgb3ZlcmZsb3cgYXQgMTIuNCBob3Vycy4KKyAgICBpbnQ2NF90IGR1cmF0aW9uVXMgPSAoaW50NjRfdCkoKGludDMyX3QpbnVtRnJhbWVzUGxheWVkICogMTAwMDAwMExMIC8gbVNhbXBsZVJhdGVIeikKKyAgICAgICAgICAgICsgbm93VXMgLSBudW1GcmFtZXNQbGF5ZWRBdFVzOworICAgIGlmIChkdXJhdGlvblVzIDwgMCkgeworICAgICAgICAvLyBPY2N1cnMgd2hlbiBudW1GcmFtZXNQbGF5ZWQgcG9zaXRpb24gaXMgdmVyeSBzbWFsbCBhbmQgdGhlIGZvbGxvd2luZzoKKyAgICAgICAgLy8gKDEpIEluIGNhc2UgMSwgdGhlIHRpbWUgbm93VXMgaXMgY29tcHV0ZWQgYmVmb3JlIGdldFRpbWVzdGFtcCgpIGlzIGNhbGxlZCBhbmQKKyAgICAgICAgLy8gICAgIG51bUZyYW1lc1BsYXllZEF0VXMgaXMgZ3JlYXRlciB0aGFuIG5vd1VzIGJ5IHRpbWUgbW9yZSB0aGFuIG51bUZyYW1lc1BsYXllZC4KKyAgICAgICAgLy8gKDIpIEluIGNhc2UgMywgdXNpbmcgZ2V0UG9zaXRpb24gYW5kIGFkZGluZyBtQXVkaW9TaW5rLT5sYXRlbmN5KCkgdG8KKyAgICAgICAgLy8gICAgIG51bUZyYW1lc1BsYXllZEF0VXMsIGJ5IGEgdGltZSBhbW91bnQgZ3JlYXRlciB0aGFuIG51bUZyYW1lc1BsYXllZC4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gQm90aCBvZiB0aGVzZSBhcmUgdHJhbnNpdG9yeSBjb25kaXRpb25zLgorICAgICAgICBBTE9HVigiZ2V0UGxheWVkT3V0RHVyYXRpb25VczogbmVnYXRpdmUgZHVyYXRpb24gJWxsZCBzZXQgdG8gemVybyIsIChsb25nIGxvbmcpZHVyYXRpb25Vcyk7CisgICAgICAgIGR1cmF0aW9uVXMgPSAwOworICAgIH0KKyAgICBBTE9HVigiZ2V0UGxheWVkT3V0RHVyYXRpb25VcyglbGxkKSBub3dVcyglbGxkKSBmcmFtZXMoJXUpIGZyYW1lc0F0KCVsbGQpIiwKKyAgICAgICAgICAgIChsb25nIGxvbmcpZHVyYXRpb25VcywgKGxvbmcgbG9uZylub3dVcywKKyAgICAgICAgICAgIG51bUZyYW1lc1BsYXllZCwgKGxvbmcgbG9uZyludW1GcmFtZXNQbGF5ZWRBdFVzKTsKKyAgICByZXR1cm4gZHVyYXRpb25VczsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyTWFuYWdlcjo6QXVkaW9PdXRwdXQ6OmdldEZyYW1lc1dyaXR0ZW4odWludDMyX3QgKmZyYW1lc3dyaXR0ZW4pIGNvbnN0Cit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIGlmIChtVHJhY2sgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgRXh0ZW5kZWRUaW1lc3RhbXAgZXRzOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1UcmFjay0+Z2V0VGltZXN0YW1wKCZldHMpOworICAgIGlmIChzdGF0dXMgPT0gT0sgfHwgc3RhdHVzID09IFdPVUxEX0JMT0NLKSB7CisgICAgICAgICpmcmFtZXN3cml0dGVuID0gKHVpbnQzMl90KWV0cy5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0NMSUVOVF07CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMk1hbmFnZXI6OkF1ZGlvT3V0cHV0OjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIGlmIChtVHJhY2sgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIG1UcmFjay0+c2V0UGFyYW1ldGVycyhrZXlWYWx1ZVBhaXJzKTsKK30KKworU3RyaW5nOCAgTWVkaWFQbGF5ZXIyTWFuYWdlcjo6QXVkaW9PdXRwdXQ6OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cykKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgaWYgKG1UcmFjayA9PSAwKSByZXR1cm4gU3RyaW5nODo6ZW1wdHkoKTsKKyAgICByZXR1cm4gbVRyYWNrLT5nZXRQYXJhbWV0ZXJzKGtleXMpOworfQorCit2b2lkIE1lZGlhUGxheWVyMk1hbmFnZXI6OkF1ZGlvT3V0cHV0OjpzZXRBdWRpb0F0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICogYXR0cmlidXRlcykgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBpZiAoYXR0cmlidXRlcyA9PSBOVUxMKSB7CisgICAgICAgIGZyZWUobUF0dHJpYnV0ZXMpOworICAgICAgICBtQXR0cmlidXRlcyA9IE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG1BdHRyaWJ1dGVzID09IE5VTEwpIHsKKyAgICAgICAgICAgIG1BdHRyaWJ1dGVzID0gKGF1ZGlvX2F0dHJpYnV0ZXNfdCAqKSBjYWxsb2MoMSwgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOworICAgICAgICB9CisgICAgICAgIG1lbWNweShtQXR0cmlidXRlcywgYXR0cmlidXRlcywgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOworICAgICAgICBtU3RyZWFtVHlwZSA9IGF1ZGlvX2F0dHJpYnV0ZXNfdG9fc3RyZWFtX3R5cGUoYXR0cmlidXRlcyk7CisgICAgfQorfQorCit2b2lkIE1lZGlhUGxheWVyMk1hbmFnZXI6OkF1ZGlvT3V0cHV0OjpzZXRBdWRpb1N0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICAvLyBkbyBub3QgYWxsb3cgZGlyZWN0IHN0cmVhbSB0eXBlIG1vZGlmaWNhdGlvbiBpZiBhdHRyaWJ1dGVzIGhhdmUgYmVlbiBzZXQKKyAgICBpZiAobUF0dHJpYnV0ZXMgPT0gTlVMTCkgeworICAgICAgICBtU3RyZWFtVHlwZSA9IHN0cmVhbVR5cGU7CisgICAgfQorfQorCit2b2lkIE1lZGlhUGxheWVyMk1hbmFnZXI6OkF1ZGlvT3V0cHV0OjpkZWxldGVSZWN5Y2xlZFRyYWNrX2woKQoreworICAgIEFMT0dWKCJkZWxldGVSZWN5Y2xlZFRyYWNrX2wiKTsKKyAgICBpZiAobVJlY3ljbGVkVHJhY2sgIT0gMCkgeworCisgICAgICAgIGlmIChtQ2FsbGJhY2tEYXRhICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1DYWxsYmFja0RhdGEtPnNldE91dHB1dChOVUxMKTsKKyAgICAgICAgICAgIG1DYWxsYmFja0RhdGEtPmVuZFRyYWNrU3dpdGNoKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKG1SZWN5Y2xlZFRyYWNrLT5nZXRGbGFncygpICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgPT0gMCkgeworICAgICAgICAgICAgaW50MzJfdCBtc2VjID0gMDsKKyAgICAgICAgICAgIGlmICghbVJlY3ljbGVkVHJhY2stPnN0b3BwZWQoKSkgeyAvLyBjaGVjayBpZiBhY3RpdmUKKyAgICAgICAgICAgICAgICAgKHZvaWQpbVJlY3ljbGVkVHJhY2stPnBlbmRpbmdEdXJhdGlvbigmbXNlYyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUmVjeWNsZWRUcmFjay0+c3RvcCgpOyAvLyBlbnN1cmUgZnVsbCBkYXRhIGRyYWluCisgICAgICAgICAgICBBTE9HRCgiZGVsZXRpbmcgcmVjeWNsZWQgdHJhY2ssIHdhaXRpbmcgZm9yIGRhdGEgZHJhaW4gKCVkIG1zZWMpIiwgbXNlYyk7CisgICAgICAgICAgICBpZiAobXNlYyA+IDApIHsKKyAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBXQUlUX0xJTUlUX01TID0gMzAwMDsKKyAgICAgICAgICAgICAgICBpZiAobXNlYyA+IFdBSVRfTElNSVRfTVMpIHsKKyAgICAgICAgICAgICAgICAgICAgbXNlYyA9IFdBSVRfTElNSVRfTVM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHVzbGVlcChtc2VjICogMTAwMExMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBBbiBvZmZsb2FkZWQgdHJhY2sgaXNuJ3QgZmx1c2hlZCBiZWNhdXNlIHRoZSBTVFJFQU1fRU5EIGlzIHJlcG9ydGVkCisgICAgICAgIC8vIHNsaWdodGx5IHByZW1hdHVyZWx5IHRvIGFsbG93IHRpbWUgZm9yIHRoZSBnYXBsZXNzIHRyYWNrIHN3aXRjaAorICAgICAgICAvLyBidXQgdGhpcyBtZWFucyB0aGF0IGlmIHdlIGRlY2lkZSBub3QgdG8gcmVjeWNsZSB0aGUgdHJhY2sgdGhlcmUKKyAgICAgICAgLy8gY291bGQgYmUgYSBzbWFsbCBhbW91bnQgb2YgcmVzaWR1YWwgZGF0YSBzdGlsbCBwbGF5aW5nLiBXZSBsZWF2ZQorICAgICAgICAvLyBBdWRpb0ZsaW5nZXIgdG8gZHJhaW4gdGhlIHRyYWNrLgorCisgICAgICAgIG1SZWN5Y2xlZFRyYWNrLmNsZWFyKCk7CisgICAgICAgIGNsb3NlX2woKTsKKyAgICAgICAgZGVsZXRlIG1DYWxsYmFja0RhdGE7CisgICAgICAgIG1DYWxsYmFja0RhdGEgPSBOVUxMOworICAgIH0KK30KKwordm9pZCBNZWRpYVBsYXllcjJNYW5hZ2VyOjpBdWRpb091dHB1dDo6Y2xvc2VfbCgpCit7CisgICAgbVRyYWNrLmNsZWFyKCk7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMk1hbmFnZXI6OkF1ZGlvT3V0cHV0OjpvcGVuKAorICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLCBpbnQgY2hhbm5lbENvdW50LCBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBpbnQgYnVmZmVyQ291bnQsCisgICAgICAgIEF1ZGlvQ2FsbGJhY2sgY2IsIHZvaWQgKmNvb2tpZSwKKyAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbywKKyAgICAgICAgYm9vbCBkb05vdFJlY29ubmVjdCwKKyAgICAgICAgdWludDMyX3Qgc3VnZ2VzdGVkRnJhbWVDb3VudCkKK3sKKyAgICBBTE9HVigib3BlbigldSwgJWQsIDB4JXgsIDB4JXgsICVkLCAlZCAweCV4KSIsIHNhbXBsZVJhdGUsIGNoYW5uZWxDb3VudCwgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgZm9ybWF0LCBidWZmZXJDb3VudCwgbVNlc3Npb25JZCwgZmxhZ3MpOworCisgICAgLy8gb2ZmbG9hZGluZyBpcyBvbmx5IHN1cHBvcnRlZCBpbiBjYWxsYmFjayBtb2RlIGZvciBub3cuCisgICAgLy8gb2ZmbG9hZEluZm8gbXVzdCBiZSBwcmVzZW50IGlmIG9mZmxvYWQgZmxhZyBpcyBzZXQKKyAgICBpZiAoKChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpICE9IDApICYmCisgICAgICAgICAgICAoKGNiID09IE5VTEwpIHx8IChvZmZsb2FkSW5mbyA9PSBOVUxMKSkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBjb21wdXRlIGZyYW1lIGNvdW50IGZvciB0aGUgQXVkaW9UcmFjayBpbnRlcm5hbCBidWZmZXIKKyAgICBzaXplX3QgZnJhbWVDb3VudDsKKyAgICBpZiAoKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgIT0gMCkgeworICAgICAgICBmcmFtZUNvdW50ID0gMDsgLy8gQXVkaW9UcmFjayB3aWxsIGdldCBmcmFtZSBjb3VudCBmcm9tIEF1ZGlvRmxpbmdlcgorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIHRyeSB0byBlc3RpbWF0ZSB0aGUgYnVmZmVyIHByb2Nlc3NpbmcgZmV0Y2ggc2l6ZSBmcm9tIEF1ZGlvRmxpbmdlci4KKyAgICAgICAgLy8gZnJhbWVzUGVyQnVmZmVyIGlzIGFwcHJveGltYXRlIGFuZCBnZW5lcmFsbHkgY29ycmVjdCwgZXhjZXB0IHdoZW4gaXQncyBub3QgOi0pLgorICAgICAgICB1aW50MzJfdCBhZlNhbXBsZVJhdGU7CisgICAgICAgIHNpemVfdCBhZkZyYW1lQ291bnQ7CisgICAgICAgIGlmIChBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0RnJhbWVDb3VudCgmYWZGcmFtZUNvdW50LCBtU3RyZWFtVHlwZSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICB9CisgICAgICAgIGlmIChBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0U2FtcGxpbmdSYXRlKCZhZlNhbXBsZVJhdGUsIG1TdHJlYW1UeXBlKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIH0KKyAgICAgICAgY29uc3Qgc2l6ZV90IGZyYW1lc1BlckJ1ZmZlciA9CisgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzYW1wbGVSYXRlICogYWZGcmFtZUNvdW50IC8gYWZTYW1wbGVSYXRlOworCisgICAgICAgIGlmIChidWZmZXJDb3VudCA9PSAwKSB7CisgICAgICAgICAgICAvLyB1c2Ugc3VnZ2VzdGVkRnJhbWVDb3VudAorICAgICAgICAgICAgYnVmZmVyQ291bnQgPSAoc3VnZ2VzdGVkRnJhbWVDb3VudCArIGZyYW1lc1BlckJ1ZmZlciAtIDEpIC8gZnJhbWVzUGVyQnVmZmVyOworICAgICAgICB9CisgICAgICAgIC8vIENoZWNrIGFyZ3VtZW50IGJ1ZmZlckNvdW50IGFnYWluc3QgdGhlIG1pbmludW0gYnVmZmVyIGNvdW50CisgICAgICAgIGlmIChidWZmZXJDb3VudCAhPSAwICYmIGJ1ZmZlckNvdW50IDwgbU1pbkJ1ZmZlckNvdW50KSB7CisgICAgICAgICAgICBBTE9HVigiYnVmZmVyQ291bnQgKCVkKSBpbmNyZWFzZWQgdG8gJWQiLCBidWZmZXJDb3VudCwgbU1pbkJ1ZmZlckNvdW50KTsKKyAgICAgICAgICAgIGJ1ZmZlckNvdW50ID0gbU1pbkJ1ZmZlckNvdW50OworICAgICAgICB9CisgICAgICAgIC8vIGlmIGZyYW1lQ291bnQgaXMgMCwgdGhlbiBBdWRpb1RyYWNrIHdpbGwgZ2V0IGZyYW1lIGNvdW50IGZyb20gQXVkaW9GbGluZ2VyCisgICAgICAgIC8vIHdoaWNoIHdpbGwgYmUgdGhlIG1pbmltdW0gc2l6ZSBwZXJtaXR0ZWQuCisgICAgICAgIGZyYW1lQ291bnQgPSBidWZmZXJDb3VudCAqIGZyYW1lc1BlckJ1ZmZlcjsKKyAgICB9CisKKyAgICBpZiAoY2hhbm5lbE1hc2sgPT0gQ0hBTk5FTF9NQVNLX1VTRV9DSEFOTkVMX09SREVSKSB7CisgICAgICAgIGNoYW5uZWxNYXNrID0gYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KGNoYW5uZWxDb3VudCk7CisgICAgICAgIGlmICgwID09IGNoYW5uZWxNYXNrKSB7CisgICAgICAgICAgICBBTE9HRSgib3BlbigpIGVycm9yLCBjYW5cJ3QgZGVyaXZlIG1hc2sgZm9yICVkIGF1ZGlvIGNoYW5uZWxzIiwgY2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICB9CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIG1DYWxsYmFjayA9IGNiOworICAgIG1DYWxsYmFja0Nvb2tpZSA9IGNvb2tpZTsKKworICAgIC8vIENoZWNrIHdoZXRoZXIgd2UgY2FuIHJlY3ljbGUgdGhlIHRyYWNrCisgICAgYm9vbCByZXVzZSA9IGZhbHNlOworICAgIGJvb2wgYm90aE9mZmxvYWRlZCA9IGZhbHNlOworCisgICAgaWYgKG1SZWN5Y2xlZFRyYWNrICE9IDApIHsKKyAgICAgICAgLy8gY2hlY2sgd2hldGhlciB3ZSBhcmUgc3dpdGNoaW5nIGJldHdlZW4gdHdvIG9mZmxvYWRlZCB0cmFja3MKKyAgICAgICAgYm90aE9mZmxvYWRlZCA9IChmbGFncyAmIG1SZWN5Y2xlZFRyYWNrLT5nZXRGbGFncygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgIT0gMDsKKworICAgICAgICAvLyBjaGVjayBpZiB0aGUgZXhpc3RpbmcgdHJhY2sgY2FuIGJlIHJldXNlZCBhcy1pcywgb3IgaWYgYSBuZXcgdHJhY2sgbmVlZHMgdG8gYmUgY3JlYXRlZC4KKyAgICAgICAgcmV1c2UgPSB0cnVlOworCisgICAgICAgIGlmICgobUNhbGxiYWNrRGF0YSA9PSBOVUxMICYmIG1DYWxsYmFjayAhPSBOVUxMKSB8fAorICAgICAgICAgICAgICAgIChtQ2FsbGJhY2tEYXRhICE9IE5VTEwgJiYgbUNhbGxiYWNrID09IE5VTEwpKSB7CisgICAgICAgICAgICAvLyByZWN5Y2xlZCB0cmFjayB1c2VzIGNhbGxiYWNrcyBidXQgdGhlIGNhbGxlciB3YW50cyB0byB1c2Ugd3JpdGVzLCBvciB2aWNlIHZlcnNhCisgICAgICAgICAgICBBTE9HVigiY2FuJ3QgY2hhaW4gY2FsbGJhY2sgYW5kIHdyaXRlIik7CisgICAgICAgICAgICByZXVzZSA9IGZhbHNlOworICAgICAgICB9IGVsc2UgaWYgKChtUmVjeWNsZWRUcmFjay0+Z2V0U2FtcGxlUmF0ZSgpICE9IHNhbXBsZVJhdGUpIHx8CisgICAgICAgICAgICAgICAgKG1SZWN5Y2xlZFRyYWNrLT5jaGFubmVsQ291bnQoKSAhPSAodWludDMyX3QpY2hhbm5lbENvdW50KSApIHsKKyAgICAgICAgICAgIEFMT0dWKCJzYW1wbGVyYXRlLCBjaGFubmVsY291bnQgZGlmZmVyOiAldS8ldSBIeiwgJXUvJWQgY2giLAorICAgICAgICAgICAgICAgICAgbVJlY3ljbGVkVHJhY2stPmdldFNhbXBsZVJhdGUoKSwgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgIG1SZWN5Y2xlZFRyYWNrLT5jaGFubmVsQ291bnQoKSwgY2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgIHJldXNlID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSBpZiAoZmxhZ3MgIT0gbUZsYWdzKSB7CisgICAgICAgICAgICBBTE9HVigib3V0cHV0IGZsYWdzIGRpZmZlciAlMDh4LyUwOHgiLCBmbGFncywgbUZsYWdzKTsKKyAgICAgICAgICAgIHJldXNlID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSBpZiAobVJlY3ljbGVkVHJhY2stPmZvcm1hdCgpICE9IGZvcm1hdCkgeworICAgICAgICAgICAgcmV1c2UgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJubyB0cmFjayBhdmFpbGFibGUgdG8gcmVjeWNsZSIpOworICAgIH0KKworICAgIEFMT0dWX0lGKGJvdGhPZmZsb2FkZWQsICJib3RoIHRyYWNrcyBvZmZsb2FkZWQiKTsKKworICAgIC8vIElmIHdlIGNhbid0IHJlY3ljbGUgYW5kIGJvdGggdHJhY2tzIGFyZSBvZmZsb2FkZWQKKyAgICAvLyB3ZSBtdXN0IGNsb3NlIHRoZSBwcmV2aW91cyBvdXRwdXQgYmVmb3JlIG9wZW5pbmcgYSBuZXcgb25lCisgICAgaWYgKGJvdGhPZmZsb2FkZWQgJiYgIXJldXNlKSB7CisgICAgICAgIEFMT0dWKCJib3RoIG9mZmxvYWRlZCBhbmQgbm90IHJlY3ljbGluZyIpOworICAgICAgICBkZWxldGVSZWN5Y2xlZFRyYWNrX2woKTsKKyAgICB9CisKKyAgICBzcDxBdWRpb1RyYWNrPiB0OworICAgIENhbGxiYWNrRGF0YSAqbmV3Y2JkID0gTlVMTDsKKworICAgIC8vIFdlIGRvbid0IGF0dGVtcHQgdG8gY3JlYXRlIGEgbmV3IHRyYWNrIGlmIHdlIGFyZSByZWN5Y2xpbmcgYW4KKyAgICAvLyBvZmZsb2FkZWQgdHJhY2suIEJ1dCwgaWYgd2UgYXJlIHJlY3ljbGluZyBhIG5vbi1vZmZsb2FkZWQgb3Igd2UKKyAgICAvLyBhcmUgc3dpdGNoaW5nIHdoZXJlIG9uZSBpcyBvZmZsb2FkZWQgYW5kIG9uZSBpc24ndCB0aGVuIHdlIGNyZWF0ZQorICAgIC8vIHRoZSBuZXcgdHJhY2sgaW4gYWR2YW5jZSBzbyB0aGF0IHdlIGNhbiByZWFkIGFkZGl0aW9uYWwgc3RyZWFtIGluZm8KKworICAgIGlmICghKHJldXNlICYmIGJvdGhPZmZsb2FkZWQpKSB7CisgICAgICAgIEFMT0dWKCJjcmVhdGluZyBuZXcgQXVkaW9UcmFjayIpOworCisgICAgICAgIGlmIChtQ2FsbGJhY2sgIT0gTlVMTCkgeworICAgICAgICAgICAgbmV3Y2JkID0gbmV3IENhbGxiYWNrRGF0YSh0aGlzKTsKKyAgICAgICAgICAgIHQgPSBuZXcgQXVkaW9UcmFjaygKKyAgICAgICAgICAgICAgICAgICAgbVN0cmVhbVR5cGUsCisgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICBDYWxsYmFja1dyYXBwZXIsCisgICAgICAgICAgICAgICAgICAgIG5ld2NiZCwKKyAgICAgICAgICAgICAgICAgICAgMCwgIC8vIG5vdGlmaWNhdGlvbiBmcmFtZXMKKyAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgQXVkaW9UcmFjazo6VFJBTlNGRVJfQ0FMTEJBQ0ssCisgICAgICAgICAgICAgICAgICAgIG9mZmxvYWRJbmZvLAorICAgICAgICAgICAgICAgICAgICBtVWlkLAorICAgICAgICAgICAgICAgICAgICBtUGlkLAorICAgICAgICAgICAgICAgICAgICBtQXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgZG9Ob3RSZWNvbm5lY3QsCisgICAgICAgICAgICAgICAgICAgIDEuMGYsICAvLyBkZWZhdWx0IHZhbHVlIGZvciBtYXhSZXF1aXJlZFNwZWVkCisgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZERldmljZUlkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFRPRE86IER1ZSB0byBidWZmZXIgbWVtb3J5IGNvbmNlcm5zLCB3ZSB1c2UgYSBtYXggdGFyZ2V0IHBsYXliYWNrIHNwZWVkCisgICAgICAgICAgICAvLyBiYXNlZCBvbiBtUGxheWJhY2tSYXRlIGF0IHRoZSB0aW1lIG9mIG9wZW4gKGluc3RlYWQgb2Yga01heFJlcXVpcmVkU3BlZWQpLAorICAgICAgICAgICAgLy8gYWxzbyBjbGFtcGluZyB0aGUgdGFyZ2V0IHNwZWVkIHRvIDEuMCA8PSB0YXJnZXRTcGVlZCA8PSBrTWF4UmVxdWlyZWRTcGVlZC4KKyAgICAgICAgICAgIGNvbnN0IGZsb2F0IHRhcmdldFNwZWVkID0KKyAgICAgICAgICAgICAgICAgICAgc3RkOjptaW4oc3RkOjptYXgobVBsYXliYWNrUmF0ZS5tU3BlZWQsIDEuMGYpLCBrTWF4UmVxdWlyZWRTcGVlZCk7CisgICAgICAgICAgICBBTE9HV19JRih0YXJnZXRTcGVlZCAhPSBtUGxheWJhY2tSYXRlLm1TcGVlZCwKKyAgICAgICAgICAgICAgICAgICAgInRyYWNrIHRhcmdldCBzcGVlZDolZiBjbGFtcGVkIGZyb20gcGxheWJhY2sgc3BlZWQ6JWYiLAorICAgICAgICAgICAgICAgICAgICB0YXJnZXRTcGVlZCwgbVBsYXliYWNrUmF0ZS5tU3BlZWQpOworICAgICAgICAgICAgdCA9IG5ldyBBdWRpb1RyYWNrKAorICAgICAgICAgICAgICAgICAgICBtU3RyZWFtVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgIE5VTEwsIC8vIGNhbGxiYWNrCisgICAgICAgICAgICAgICAgICAgIE5VTEwsIC8vIHVzZXIgZGF0YQorICAgICAgICAgICAgICAgICAgICAwLCAvLyBub3RpZmljYXRpb24gZnJhbWVzCisgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgIEF1ZGlvVHJhY2s6OlRSQU5TRkVSX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgICAgIE5VTEwsIC8vIG9mZmxvYWQgaW5mbworICAgICAgICAgICAgICAgICAgICBtVWlkLAorICAgICAgICAgICAgICAgICAgICBtUGlkLAorICAgICAgICAgICAgICAgICAgICBtQXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgZG9Ob3RSZWNvbm5lY3QsCisgICAgICAgICAgICAgICAgICAgIHRhcmdldFNwZWVkLAorICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWREZXZpY2VJZCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHQgPT0gMCkgfHwgKHQtPmluaXRDaGVjaygpICE9IE5PX0VSUk9SKSkgeworICAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBjcmVhdGUgYXVkaW8gdHJhY2siKTsKKyAgICAgICAgICAgIGRlbGV0ZSBuZXdjYmQ7CisgICAgICAgICAgICAvLyB0IGdvZXMgb3V0IG9mIHNjb3BlLCBzbyByZWZlcmVuY2UgY291bnQgZHJvcHMgdG8gemVybworICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBzdWNjZXNzZnVsIEF1ZGlvVHJhY2sgaW5pdGlhbGl6YXRpb24gaW1wbGllcyBhIGxlZ2FjeSBzdHJlYW0gdHlwZSB3YXMgZ2VuZXJhdGVkCisgICAgICAgICAgICAvLyBmcm9tIHRoZSBhdWRpbyBhdHRyaWJ1dGVzCisgICAgICAgICAgICBtU3RyZWFtVHlwZSA9IHQtPnN0cmVhbVR5cGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChyZXVzZSkgeworICAgICAgICBDSEVDSyhtUmVjeWNsZWRUcmFjayAhPSBOVUxMKTsKKworICAgICAgICBpZiAoIWJvdGhPZmZsb2FkZWQpIHsKKyAgICAgICAgICAgIGlmIChtUmVjeWNsZWRUcmFjay0+ZnJhbWVDb3VudCgpICE9IHQtPmZyYW1lQ291bnQoKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJmcmFtZWNvdW50IGRpZmZlcnM6ICV6dS8lenUgZnJhbWVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBtUmVjeWNsZWRUcmFjay0+ZnJhbWVDb3VudCgpLCB0LT5mcmFtZUNvdW50KCkpOworICAgICAgICAgICAgICAgIHJldXNlID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocmV1c2UpIHsKKyAgICAgICAgICAgIEFMT0dWKCJjaGFpbmluZyB0byBuZXh0IG91dHB1dCBhbmQgcmVjeWNsaW5nIHRyYWNrIik7CisgICAgICAgICAgICBjbG9zZV9sKCk7CisgICAgICAgICAgICBtVHJhY2sgPSBtUmVjeWNsZWRUcmFjazsKKyAgICAgICAgICAgIG1SZWN5Y2xlZFRyYWNrLmNsZWFyKCk7CisgICAgICAgICAgICBpZiAobUNhbGxiYWNrRGF0YSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbUNhbGxiYWNrRGF0YS0+c2V0T3V0cHV0KHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVsZXRlIG5ld2NiZDsKKyAgICAgICAgICAgIHJldHVybiB1cGRhdGVUcmFjaygpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gd2UncmUgbm90IGdvaW5nIHRvIHJldXNlIHRoZSB0cmFjaywgdW5ibG9jayBhbmQgZmx1c2ggaXQKKyAgICAvLyB0aGlzIHdhcyBkb25lIGVhcmxpZXIgaWYgYm90aCB0cmFja3MgYXJlIG9mZmxvYWRlZAorICAgIGlmICghYm90aE9mZmxvYWRlZCkgeworICAgICAgICBkZWxldGVSZWN5Y2xlZFRyYWNrX2woKTsKKyAgICB9CisKKyAgICBDSEVDSygodCAhPSBOVUxMKSAmJiAoKG1DYWxsYmFjayA9PSBOVUxMKSB8fCAobmV3Y2JkICE9IE5VTEwpKSk7CisKKyAgICBtQ2FsbGJhY2tEYXRhID0gbmV3Y2JkOworICAgIEFMT0dWKCJzZXRWb2x1bWUiKTsKKyAgICB0LT5zZXRWb2x1bWUobUxlZnRWb2x1bWUsIG1SaWdodFZvbHVtZSk7CisKKyAgICAvLyBSZXN0b3JlIFZvbHVtZVNoYXBlcnMgZm9yIHRoZSBNZWRpYVBsYXllcjIgaW4gY2FzZSB0aGUgdHJhY2sgd2FzIHJlY3JlYXRlZAorICAgIC8vIGR1ZSB0byBhbiBvdXRwdXQgc2luayBlcnJvciAoZS5nLiBvZmZsb2FkIHRvIG5vbi1vZmZsb2FkIHN3aXRjaCkuCisgICAgbVZvbHVtZUhhbmRsZXItPmZvcmFsbChbJnRdKGNvbnN0IFZvbHVtZVNoYXBlciAmc2hhcGVyKSAtPiBWb2x1bWVTaGFwZXI6OlN0YXR1cyB7CisgICAgICAgIHNwPFZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uPiBvcGVyYXRpb25Ub0VuZCA9CisgICAgICAgICAgICAgICAgbmV3IFZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uKHNoYXBlci5tT3BlcmF0aW9uKTsKKyAgICAgICAgLy8gVE9ETzogSWRlYWxseSB3ZSB3b3VsZCByZXN0b3JlIHRvIHRoZSBleGFjdCB4T2Zmc2V0IHBvc2l0aW9uCisgICAgICAgIC8vIGFzIHJldHVybmVkIGJ5IGdldFZvbHVtZVNoYXBlclN0YXRlKCksIGJ1dCB3ZSBkb24ndCBoYXZlIHRoYXQKKyAgICAgICAgLy8gaW5mb3JtYXRpb24gd2hlbiByZXN0b3JpbmcgYXQgdGhlIGNsaWVudCB1bmxlc3Mgd2UgcGVyaW9kaWNhbGx5IHBvbGwKKyAgICAgICAgLy8gdGhlIHNlcnZlciBvciBjcmVhdGUgc2hhcmVkIG1lbW9yeSBzdGF0ZS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gRm9yIG5vdywgd2Ugc2ltcGx5IGFkdmFuY2UgdG8gdGhlIGVuZCBvZiB0aGUgVm9sdW1lU2hhcGVyIGVmZmVjdAorICAgICAgICAvLyBpZiBpdCBoYXMgYmVlbiBzdGFydGVkLgorICAgICAgICBpZiAoc2hhcGVyLmlzU3RhcnRlZCgpKSB7CisgICAgICAgICAgICBvcGVyYXRpb25Ub0VuZC0+c2V0Tm9ybWFsaXplZFRpbWUoMS5mKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdC0+YXBwbHlWb2x1bWVTaGFwZXIoc2hhcGVyLm1Db25maWd1cmF0aW9uLCBvcGVyYXRpb25Ub0VuZCk7CisgICAgfSk7CisKKyAgICBtU2FtcGxlUmF0ZUh6ID0gc2FtcGxlUmF0ZTsKKyAgICBtRmxhZ3MgPSBmbGFnczsKKyAgICBtTXNlY3NQZXJGcmFtZSA9IDFFM2YgLyAobVBsYXliYWNrUmF0ZS5tU3BlZWQgKiBzYW1wbGVSYXRlKTsKKyAgICBtRnJhbWVTaXplID0gdC0+ZnJhbWVTaXplKCk7CisgICAgbVRyYWNrID0gdDsKKworICAgIHJldHVybiB1cGRhdGVUcmFjaygpOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjJNYW5hZ2VyOjpBdWRpb091dHB1dDo6dXBkYXRlVHJhY2soKSB7CisgICAgaWYgKG1UcmFjayA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICBzdGF0dXNfdCByZXMgPSBOT19FUlJPUjsKKyAgICAvLyBOb3RlIHNvbWUgb3V0cHV0IGRldmljZXMgbWF5IGdpdmUgdXMgYSBkaXJlY3QgdHJhY2sgZXZlbiB0aG91Z2ggd2UgZG9uJ3Qgc3BlY2lmeSBpdC4KKyAgICAvLyBFeGFtcGxlOiBMaW5lIGFwcGxpY2F0aW9uIGIvMTc0NTk5ODIuCisgICAgaWYgKChtVHJhY2stPmdldEZsYWdzKCkKKyAgICAgICAgICAgICYgKEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQgfCBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpKSA9PSAwKSB7CisgICAgICAgIHJlcyA9IG1UcmFjay0+c2V0UGxheWJhY2tSYXRlKG1QbGF5YmFja1JhdGUpOworICAgICAgICBpZiAocmVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBtVHJhY2stPnNldEF1eEVmZmVjdFNlbmRMZXZlbChtU2VuZExldmVsKTsKKyAgICAgICAgICAgIHJlcyA9IG1UcmFjay0+YXR0YWNoQXV4RWZmZWN0KG1BdXhFZmZlY3RJZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgbVRyYWNrLT5zZXRPdXRwdXREZXZpY2UobVNlbGVjdGVkRGV2aWNlSWQpOworICAgIGlmIChtRGV2aWNlQ2FsbGJhY2tFbmFibGVkKSB7CisgICAgICAgIG1UcmFjay0+YWRkQXVkaW9EZXZpY2VDYWxsYmFjayhtRGV2aWNlQ2FsbGJhY2sucHJvbW90ZSgpKTsKKyAgICB9CisgICAgQUxPR1YoInVwZGF0ZVRyYWNrKCkgRE9ORSBzdGF0dXMgJWQiLCByZXMpOworICAgIHJldHVybiByZXM7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMk1hbmFnZXI6OkF1ZGlvT3V0cHV0OjpzdGFydCgpCit7CisgICAgQUxPR1YoInN0YXJ0Iik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIGlmIChtQ2FsbGJhY2tEYXRhICE9IE5VTEwpIHsKKyAgICAgICAgbUNhbGxiYWNrRGF0YS0+ZW5kVHJhY2tTd2l0Y2goKTsKKyAgICB9CisgICAgaWYgKG1UcmFjayAhPSAwKSB7CisgICAgICAgIG1UcmFjay0+c2V0Vm9sdW1lKG1MZWZ0Vm9sdW1lLCBtUmlnaHRWb2x1bWUpOworICAgICAgICBtVHJhY2stPnNldEF1eEVmZmVjdFNlbmRMZXZlbChtU2VuZExldmVsKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVRyYWNrLT5zdGFydCgpOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBtVm9sdW1lSGFuZGxlci0+c2V0U3RhcnRlZCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHJldHVybiBOT19JTklUOworfQorCit2b2lkIE1lZGlhUGxheWVyMk1hbmFnZXI6OkF1ZGlvT3V0cHV0OjpzZXROZXh0T3V0cHV0KGNvbnN0IHNwPEF1ZGlvT3V0cHV0PiYgbmV4dE91dHB1dCkgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBtTmV4dE91dHB1dCA9IG5leHRPdXRwdXQ7Cit9CisKK3ZvaWQgTWVkaWFQbGF5ZXIyTWFuYWdlcjo6QXVkaW9PdXRwdXQ6OnN3aXRjaFRvTmV4dE91dHB1dCgpIHsKKyAgICBBTE9HVigic3dpdGNoVG9OZXh0T3V0cHV0Iik7CisKKyAgICAvLyBUcnkgdG8gYWNxdWlyZSB0aGUgY2FsbGJhY2sgbG9jayBiZWZvcmUgbW92aW5nIHRyYWNrICh3aXRob3V0IGluY3VycmluZyBkZWFkbG9jaykuCisgICAgY29uc3QgdW5zaWduZWQga01heFN3aXRjaFRyaWVzID0gMTAwOworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBmb3IgKHVuc2lnbmVkIHRyaWVzID0gMDs7KSB7CisgICAgICAgIGlmIChtVHJhY2sgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChtTmV4dE91dHB1dCAhPSBOVUxMICYmIG1OZXh0T3V0cHV0ICE9IHRoaXMpIHsKKyAgICAgICAgICAgIGlmIChtQ2FsbGJhY2tEYXRhICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAvLyB0d28gYWx0ZXJuYXRpdmUgYXBwcm9hY2hlcworI2lmIDEKKyAgICAgICAgICAgICAgICBDYWxsYmFja0RhdGEgKmNhbGxiYWNrRGF0YSA9IG1DYWxsYmFja0RhdGE7CisgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgLy8gcHJvcGVyIGFjcXVpc2l0aW9uIHNlcXVlbmNlCisgICAgICAgICAgICAgICAgY2FsbGJhY2tEYXRhLT5sb2NrKCk7CisgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOworICAgICAgICAgICAgICAgIC8vIENhdXRpb246IGl0IGlzIHVubGlrZWx5IHRoYXQgc29tZW9uZSBkZWxldGVkIG91ciBjYWxsYmFjayBvciBjaGFuZ2VkIG91ciB0YXJnZXQKKyAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2tEYXRhICE9IG1DYWxsYmFja0RhdGEgfHwgbU5leHRPdXRwdXQgPT0gTlVMTCB8fCBtTmV4dE91dHB1dCA9PSB0aGlzKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGZhdGFsIGlmIHdlIGFyZSBzdGFydmVkIG91dC4KKyAgICAgICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRigrK3RyaWVzID4ga01heFN3aXRjaFRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzd2l0Y2hUb05leHRPdXRwdXQoKSBjYW5ub3Qgb2J0YWluIGNvcnJlY3QgbG9jayBzZXF1ZW5jZSIpOworICAgICAgICAgICAgICAgICAgICBjYWxsYmFja0RhdGEtPnVubG9jaygpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FsbGJhY2tEYXRhLT5tU3dpdGNoaW5nID0gdHJ1ZTsgLy8gYmVnaW4gdHJhY2sgc3dpdGNoCisgICAgICAgICAgICAgICAgY2FsbGJhY2tEYXRhLT5zZXRPdXRwdXQoTlVMTCk7CisjZWxzZQorICAgICAgICAgICAgICAgIC8vIHRyeUJlZ2luVHJhY2tTd2l0Y2goKSByZXR1cm5zIGZhbHNlIGlmIHRoZSBjYWxsYmFjayBoYXMgdGhlIGxvY2suCisgICAgICAgICAgICAgICAgaWYgKCFtQ2FsbGJhY2tEYXRhLT50cnlCZWdpblRyYWNrU3dpdGNoKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZmF0YWwgaWYgd2UgYXJlIHN0YXJ2ZWQgb3V0LgorICAgICAgICAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCsrdHJpZXMgPiBrTWF4U3dpdGNoVHJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN3aXRjaFRvTmV4dE91dHB1dCgpIGNhbm5vdCBvYnRhaW4gY2FsbGJhY2sgbG9jayIpOworICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgdXNsZWVwKDUgKiAxMDAwIC8qIHVzZWMgKi8pOyAvLyBhbGxvdyBjYWxsYmFjayB0byB1c2UgQXVkaW9PdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIG5leHRMb2NrKG1OZXh0T3V0cHV0LT5tTG9jayk7CisKKyAgICAgICAgICAgIC8vIElmIHRoZSBuZXh0IG91dHB1dCB0cmFjayBpcyBub3QgTlVMTCwgdGhlbiBpdCBoYXMgYmVlbgorICAgICAgICAgICAgLy8gb3BlbmVkIGFscmVhZHkgZm9yIHBsYXliYWNrLgorICAgICAgICAgICAgLy8gVGhpcyBpcyBwb3NzaWJsZSBldmVuIHdpdGhvdXQgdGhlIG5leHQgcGxheWVyIGJlaW5nIHN0YXJ0ZWQsCisgICAgICAgICAgICAvLyBmb3IgZXhhbXBsZSwgdGhlIG5leHQgcGxheWVyIGNvdWxkIGJlIHByZXBhcmVkIGFuZCBzZWVrZWQuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gUHJlc3VtaW5nIGl0IGlzbid0IGFkdmlzYWJsZSB0byBmb3JjZSB0aGUgdHJhY2sgb3Zlci4KKyAgICAgICAgICAgICBpZiAobU5leHRPdXRwdXQtPm1UcmFjayA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoIlJlY3ljbGluZyB0cmFjayBmb3IgZ2FwbGVzcyBwbGF5YmFjayIpOworICAgICAgICAgICAgICAgIGRlbGV0ZSBtTmV4dE91dHB1dC0+bUNhbGxiYWNrRGF0YTsKKyAgICAgICAgICAgICAgICBtTmV4dE91dHB1dC0+bUNhbGxiYWNrRGF0YSA9IG1DYWxsYmFja0RhdGE7CisgICAgICAgICAgICAgICAgbU5leHRPdXRwdXQtPm1SZWN5Y2xlZFRyYWNrID0gbVRyYWNrOworICAgICAgICAgICAgICAgIG1OZXh0T3V0cHV0LT5tU2FtcGxlUmF0ZUh6ID0gbVNhbXBsZVJhdGVIejsKKyAgICAgICAgICAgICAgICBtTmV4dE91dHB1dC0+bU1zZWNzUGVyRnJhbWUgPSBtTXNlY3NQZXJGcmFtZTsKKyAgICAgICAgICAgICAgICBtTmV4dE91dHB1dC0+bUZsYWdzID0gbUZsYWdzOworICAgICAgICAgICAgICAgIG1OZXh0T3V0cHV0LT5tRnJhbWVTaXplID0gbUZyYW1lU2l6ZTsKKyAgICAgICAgICAgICAgICBjbG9zZV9sKCk7CisgICAgICAgICAgICAgICAgbUNhbGxiYWNrRGF0YSA9IE5VTEw7ICAvLyBkZXN0cnVjdGlvbiBoYW5kbGVkIGJ5IG1OZXh0T3V0cHV0CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dXKCJJZ25vcmluZyBnYXBsZXNzIHBsYXliYWNrIGJlY2F1c2UgbmV4dCBwbGF5ZXIgaGFzIGFscmVhZHkgc3RhcnRlZCIpOworICAgICAgICAgICAgICAgIC8vIHJlbW92ZSB0cmFjayBpbiBjYXNlIHJlc291cmNlIG5lZWRlZCBmb3IgZnV0dXJlIHBsYXllcnMuCisgICAgICAgICAgICAgICAgaWYgKG1DYWxsYmFja0RhdGEgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tEYXRhLT5lbmRUcmFja1N3aXRjaCgpOyAgLy8gcmVsZWFzZSBsb2NrIGZvciBjYWxsYmFja3MgYmVmb3JlIGNsb3NlLgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjbG9zZV9sKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitzc2l6ZV90IE1lZGlhUGxheWVyMk1hbmFnZXI6OkF1ZGlvT3V0cHV0Ojp3cml0ZShjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplLCBib29sIGJsb2NraW5nKQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1DYWxsYmFjayAhPSBOVUxMLCAiRG9uJ3QgY2FsbCB3cml0ZSBpZiBzdXBwbHlpbmcgYSBjYWxsYmFjay4iKTsKKworICAgIC8vQUxPR1YoIndyaXRlKCVwLCAldSkiLCBidWZmZXIsIHNpemUpOworICAgIGlmIChtVHJhY2sgIT0gMCkgeworICAgICAgICByZXR1cm4gbVRyYWNrLT53cml0ZShidWZmZXIsIHNpemUsIGJsb2NraW5nKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0lOSVQ7Cit9CisKK3ZvaWQgTWVkaWFQbGF5ZXIyTWFuYWdlcjo6QXVkaW9PdXRwdXQ6OnN0b3AoKQoreworICAgIEFMT0dWKCJzdG9wIik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIGlmIChtVHJhY2sgIT0gMCkgbVRyYWNrLT5zdG9wKCk7Cit9CisKK3ZvaWQgTWVkaWFQbGF5ZXIyTWFuYWdlcjo6QXVkaW9PdXRwdXQ6OmZsdXNoKCkKK3sKKyAgICBBTE9HVigiZmx1c2giKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgaWYgKG1UcmFjayAhPSAwKSBtVHJhY2stPmZsdXNoKCk7Cit9CisKK3ZvaWQgTWVkaWFQbGF5ZXIyTWFuYWdlcjo6QXVkaW9PdXRwdXQ6OnBhdXNlKCkKK3sKKyAgICBBTE9HVigicGF1c2UiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgaWYgKG1UcmFjayAhPSAwKSBtVHJhY2stPnBhdXNlKCk7Cit9CisKK3ZvaWQgTWVkaWFQbGF5ZXIyTWFuYWdlcjo6QXVkaW9PdXRwdXQ6OmNsb3NlKCkKK3sKKyAgICBBTE9HVigiY2xvc2UiKTsKKyAgICBzcDxBdWRpb1RyYWNrPiB0cmFjazsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICAgICAgdHJhY2sgPSBtVHJhY2s7CisgICAgICAgIGNsb3NlX2woKTsgLy8gY2xlYXJzIG1UcmFjaworICAgIH0KKyAgICAvLyBkZXN0cnVjdGlvbiBvZiB0aGUgdHJhY2sgb2NjdXJzIG91dHNpZGUgb2YgbXV0ZXguCit9CisKK3ZvaWQgTWVkaWFQbGF5ZXIyTWFuYWdlcjo6QXVkaW9PdXRwdXQ6OnNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCkKK3sKKyAgICBBTE9HVigic2V0Vm9sdW1lKCVmLCAlZikiLCBsZWZ0LCByaWdodCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIG1MZWZ0Vm9sdW1lID0gbGVmdDsKKyAgICBtUmlnaHRWb2x1bWUgPSByaWdodDsKKyAgICBpZiAobVRyYWNrICE9IDApIHsKKyAgICAgICAgbVRyYWNrLT5zZXRWb2x1bWUobGVmdCwgcmlnaHQpOworICAgIH0KK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyTWFuYWdlcjo6QXVkaW9PdXRwdXQ6OnNldFBsYXliYWNrUmF0ZShjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcmF0ZSkKK3sKKyAgICBBTE9HVigic2V0UGxheWJhY2tSYXRlKCVmICVmICVkICVkKSIsCisgICAgICAgICAgICAgICAgcmF0ZS5tU3BlZWQsIHJhdGUubVBpdGNoLCByYXRlLm1GYWxsYmFja01vZGUsIHJhdGUubVN0cmV0Y2hNb2RlKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgaWYgKG1UcmFjayA9PSAwKSB7CisgICAgICAgIC8vIHJlbWVtYmVyIHJhdGUgc28gdGhhdCB3ZSBjYW4gc2V0IGl0IHdoZW4gdGhlIHRyYWNrIGlzIG9wZW5lZAorICAgICAgICBtUGxheWJhY2tSYXRlID0gcmF0ZTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICBzdGF0dXNfdCByZXMgPSBtVHJhY2stPnNldFBsYXliYWNrUmF0ZShyYXRlKTsKKyAgICBpZiAocmVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIC8vIHJhdGUubVNwZWVkIGlzIGFsd2F5cyBncmVhdGVyIHRoYW4gMCBpZiBzZXRQbGF5YmFja1JhdGUgc3VjY2VlZGVkCisgICAgQ0hFQ0tfR1QocmF0ZS5tU3BlZWQsIDAuZik7CisgICAgbVBsYXliYWNrUmF0ZSA9IHJhdGU7CisgICAgaWYgKG1TYW1wbGVSYXRlSHogIT0gMCkgeworICAgICAgICBtTXNlY3NQZXJGcmFtZSA9IDFFM2YgLyAocmF0ZS5tU3BlZWQgKiBtU2FtcGxlUmF0ZUh6KTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyTWFuYWdlcjo6QXVkaW9PdXRwdXQ6OmdldFBsYXliYWNrUmF0ZShBdWRpb1BsYXliYWNrUmF0ZSAqcmF0ZSkKK3sKKyAgICBBTE9HVigic2V0UGxheWJhY2tSYXRlIik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIGlmIChtVHJhY2sgPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgKnJhdGUgPSBtVHJhY2stPmdldFBsYXliYWNrUmF0ZSgpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyTWFuYWdlcjo6QXVkaW9PdXRwdXQ6OnNldEF1eEVmZmVjdFNlbmRMZXZlbChmbG9hdCBsZXZlbCkKK3sKKyAgICBBTE9HVigic2V0QXV4RWZmZWN0U2VuZExldmVsKCVmKSIsIGxldmVsKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgbVNlbmRMZXZlbCA9IGxldmVsOworICAgIGlmIChtVHJhY2sgIT0gMCkgeworICAgICAgICByZXR1cm4gbVRyYWNrLT5zZXRBdXhFZmZlY3RTZW5kTGV2ZWwobGV2ZWwpOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMk1hbmFnZXI6OkF1ZGlvT3V0cHV0OjphdHRhY2hBdXhFZmZlY3QoaW50IGVmZmVjdElkKQoreworICAgIEFMT0dWKCJhdHRhY2hBdXhFZmZlY3QoJWQpIiwgZWZmZWN0SWQpOworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBtQXV4RWZmZWN0SWQgPSBlZmZlY3RJZDsKKyAgICBpZiAobVRyYWNrICE9IDApIHsKKyAgICAgICAgcmV0dXJuIG1UcmFjay0+YXR0YWNoQXV4RWZmZWN0KGVmZmVjdElkKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjJNYW5hZ2VyOjpBdWRpb091dHB1dDo6c2V0T3V0cHV0RGV2aWNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpCit7CisgICAgQUxPR1YoInNldE91dHB1dERldmljZSglZCkiLCBkZXZpY2VJZCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIG1TZWxlY3RlZERldmljZUlkID0gZGV2aWNlSWQ7CisgICAgaWYgKG1UcmFjayAhPSAwKSB7CisgICAgICAgIHJldHVybiBtVHJhY2stPnNldE91dHB1dERldmljZShkZXZpY2VJZCk7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyTWFuYWdlcjo6QXVkaW9PdXRwdXQ6OmdldFJvdXRlZERldmljZUlkKGF1ZGlvX3BvcnRfaGFuZGxlX3QqIGRldmljZUlkKQoreworICAgIEFMT0dWKCJnZXRSb3V0ZWREZXZpY2VJZCIpOworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobVRyYWNrICE9IDApIHsKKyAgICAgICAgbVJvdXRlZERldmljZUlkID0gbVRyYWNrLT5nZXRSb3V0ZWREZXZpY2VJZCgpOworICAgIH0KKyAgICAqZGV2aWNlSWQgPSBtUm91dGVkRGV2aWNlSWQ7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjJNYW5hZ2VyOjpBdWRpb091dHB1dDo6ZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayhib29sIGVuYWJsZWQpCit7CisgICAgQUxPR1YoImVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2ssICVkIiwgZW5hYmxlZCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIG1EZXZpY2VDYWxsYmFja0VuYWJsZWQgPSBlbmFibGVkOworICAgIGlmIChtVHJhY2sgIT0gMCkgeworICAgICAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgICAgIGlmIChlbmFibGVkKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBtVHJhY2stPmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2sobURldmljZUNhbGxiYWNrLnByb21vdGUoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXMgPSBtVHJhY2stPnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2sobURldmljZUNhbGxiYWNrLnByb21vdGUoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitWb2x1bWVTaGFwZXI6OlN0YXR1cyBNZWRpYVBsYXllcjJNYW5hZ2VyOjpBdWRpb091dHB1dDo6YXBwbHlWb2x1bWVTaGFwZXIoCisgICAgICAgICAgICAgICAgY29uc3Qgc3A8Vm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uPiYgY29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgICAgICBjb25zdCBzcDxWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbj4mIG9wZXJhdGlvbikKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQUxPR1YoIkF1ZGlvT3V0cHV0OjphcHBseVZvbHVtZVNoYXBlciIpOworCisgICAgbVZvbHVtZUhhbmRsZXItPnNldElkSWZOZWNlc3NhcnkoY29uZmlndXJhdGlvbik7CisKKyAgICBWb2x1bWVTaGFwZXI6OlN0YXR1cyBzdGF0dXM7CisgICAgaWYgKG1UcmFjayAhPSAwKSB7CisgICAgICAgIHN0YXR1cyA9IG1UcmFjay0+YXBwbHlWb2x1bWVTaGFwZXIoY29uZmlndXJhdGlvbiwgb3BlcmF0aW9uKTsKKyAgICAgICAgaWYgKHN0YXR1cyA+PSAwKSB7CisgICAgICAgICAgICAodm9pZCltVm9sdW1lSGFuZGxlci0+YXBwbHlWb2x1bWVTaGFwZXIoY29uZmlndXJhdGlvbiwgb3BlcmF0aW9uKTsKKyAgICAgICAgICAgIGlmIChtVHJhY2stPmlzUGxheWluZygpKSB7IC8vIG1hdGNoIGxvY2FsIEF1ZGlvVHJhY2sgdG8gcHJvcGVybHkgcmVzdG9yZS4KKyAgICAgICAgICAgICAgICBtVm9sdW1lSGFuZGxlci0+c2V0U3RhcnRlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVm9sdW1lU2hhcGVycyBhcmUgbm90IGFmZmVjdGVkIHdoZW4gYSB0cmFjayBtb3ZlcyBiZXR3ZWVuIHBsYXllcnMgZm9yCisgICAgICAgIC8vIGdhcGxlc3MgcGxheWJhY2sgKHNldE5leHRNZWRpYVBsYXllcikuCisgICAgICAgIC8vIFdlIGZvcndhcmQgVm9sdW1lU2hhcGVyIG9wZXJhdGlvbnMgdGhhdCBkbyBub3QgY2hhbmdlIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgLy8gdG8gdGhlIG5ldyBwbGF5ZXIgc28gdGhhdCB1bmR1Y2tpbmcgbWF5IG9jY3VyIGFzIGV4cGVjdGVkLgorICAgICAgICAvLyBVbmR1Y2tpbmcgaXMgYW4gaWRlbXBvdGVudCBvcGVyYXRpb24sIHNhbWUgaWYgYXBwbGllZCBiYWNrLXRvLWJhY2suCisgICAgICAgIGlmIChjb25maWd1cmF0aW9uLT5nZXRUeXBlKCkgPT0gVm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uOjpUWVBFX0lECisgICAgICAgICAgICAgICAgJiYgbU5leHRPdXRwdXQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR1YoImFwcGx5Vm9sdW1lU2hhcGVyOiBBdHRlbXB0aW5nIHRvIGZvcndhcmQgbWlzc2VkIG9wZXJhdGlvbjogJXMgJXMiLAorICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uLT50b1N0cmluZygpLmNfc3RyKCksIG9wZXJhdGlvbi0+dG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBuZXh0TG9jayhtTmV4dE91dHB1dC0+bUxvY2spOworCisgICAgICAgICAgICAvLyByZWN5Y2xlZCB0cmFjayBzaG91bGQgYmUgZm9yd2FyZGVkIGZyb20gdGhpcyBBdWRpb1NpbmsgYnkgc3dpdGNoVG9OZXh0T3V0cHV0CisgICAgICAgICAgICBzcDxBdWRpb1RyYWNrPiB0cmFjayA9IG1OZXh0T3V0cHV0LT5tUmVjeWNsZWRUcmFjazsKKyAgICAgICAgICAgIGlmICh0cmFjayAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoIkZvcndhcmQgVm9sdW1lU2hhcGVyIG9wZXJhdGlvbiB0byByZWN5Y2xlZCB0cmFjayAlcCIsIHRyYWNrLmdldCgpKTsKKyAgICAgICAgICAgICAgICAodm9pZCl0cmFjay0+YXBwbHlWb2x1bWVTaGFwZXIoY29uZmlndXJhdGlvbiwgb3BlcmF0aW9uKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gVGhlcmUgaXMgYSBzbWFsbCBjaGFuY2UgdGhhdCB0aGUgdW5kdWNrIG9jY3VycyBhZnRlciB0aGUgbmV4dAorICAgICAgICAgICAgICAgIC8vIHBsYXllciBoYXMgYWxyZWFkeSBzdGFydGVkLCBidXQgYmVmb3JlIGl0IGlzIHJlZ2lzdGVyZWQgdG8gcmVjZWl2ZQorICAgICAgICAgICAgICAgIC8vIHRoZSB1bmR1Y2sgY29tbWFuZC4KKyAgICAgICAgICAgICAgICB0cmFjayA9IG1OZXh0T3V0cHV0LT5tVHJhY2s7CisgICAgICAgICAgICAgICAgaWYgKHRyYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIkZvcndhcmQgVm9sdW1lU2hhcGVyIG9wZXJhdGlvbiB0byB0cmFjayAlcCIsIHRyYWNrLmdldCgpKTsKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpdHJhY2stPmFwcGx5Vm9sdW1lU2hhcGVyKGNvbmZpZ3VyYXRpb24sIG9wZXJhdGlvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IG1Wb2x1bWVIYW5kbGVyLT5hcHBseVZvbHVtZVNoYXBlcihjb25maWd1cmF0aW9uLCBvcGVyYXRpb24pOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzcDxWb2x1bWVTaGFwZXI6OlN0YXRlPiBNZWRpYVBsYXllcjJNYW5hZ2VyOjpBdWRpb091dHB1dDo6Z2V0Vm9sdW1lU2hhcGVyU3RhdGUoaW50IGlkKQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobVRyYWNrICE9IDApIHsKKyAgICAgICAgcmV0dXJuIG1UcmFjay0+Z2V0Vm9sdW1lU2hhcGVyU3RhdGUoaWQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBtVm9sdW1lSGFuZGxlci0+Z2V0Vm9sdW1lU2hhcGVyU3RhdGUoaWQpOworICAgIH0KK30KKworLy8gc3RhdGljCit2b2lkIE1lZGlhUGxheWVyMk1hbmFnZXI6OkF1ZGlvT3V0cHV0OjpDYWxsYmFja1dyYXBwZXIoCisgICAgICAgIGludCBldmVudCwgdm9pZCAqY29va2llLCB2b2lkICppbmZvKSB7CisgICAgLy9BTE9HVigiY2FsbGJhY2t3cmFwcGVyIik7CisgICAgQ2FsbGJhY2tEYXRhICpkYXRhID0gKENhbGxiYWNrRGF0YSopY29va2llOworICAgIC8vIGxvY2sgdG8gZW5zdXJlIHdlIGFyZW4ndCBjYXVnaHQgaW4gdGhlIG1pZGRsZSBvZiBhIHRyYWNrIHN3aXRjaC4KKyAgICBkYXRhLT5sb2NrKCk7CisgICAgQXVkaW9PdXRwdXQgKm1lID0gZGF0YS0+Z2V0T3V0cHV0KCk7CisgICAgQXVkaW9UcmFjazo6QnVmZmVyICpidWZmZXIgPSAoQXVkaW9UcmFjazo6QnVmZmVyICopaW5mbzsKKyAgICBpZiAobWUgPT0gTlVMTCkgeworICAgICAgICAvLyBubyBvdXRwdXQgc2V0LCBsaWtlbHkgYmVjYXVzZSB0aGUgdHJhY2sgd2FzIHNjaGVkdWxlZCB0byBiZSByZXVzZWQKKyAgICAgICAgLy8gYnkgYW5vdGhlciBwbGF5ZXIsIGJ1dCB0aGUgZm9ybWF0IHR1cm5lZCBvdXQgdG8gYmUgaW5jb21wYXRpYmxlLgorICAgICAgICBkYXRhLT51bmxvY2soKTsKKyAgICAgICAgaWYgKGJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBidWZmZXItPnNpemUgPSAwOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzd2l0Y2goZXZlbnQpIHsKKyAgICBjYXNlIEF1ZGlvVHJhY2s6OkVWRU5UX01PUkVfREFUQTogeworICAgICAgICBzaXplX3QgYWN0dWFsU2l6ZSA9ICgqbWUtPm1DYWxsYmFjaykoCisgICAgICAgICAgICAgICAgbWUsIGJ1ZmZlci0+cmF3LCBidWZmZXItPnNpemUsIG1lLT5tQ2FsbGJhY2tDb29raWUsCisgICAgICAgICAgICAgICAgQ0JfRVZFTlRfRklMTF9CVUZGRVIpOworCisgICAgICAgIC8vIExvZyB3aGVuIG5vIGRhdGEgaXMgcmV0dXJuZWQgZnJvbSB0aGUgY2FsbGJhY2suCisgICAgICAgIC8vICgxKSBXZSBtYXkgaGF2ZSBubyBkYXRhIChlc3BlY2lhbGx5IHdpdGggbmV0d29yayBzdHJlYW1pbmcgc291cmNlcykuCisgICAgICAgIC8vICgyKSBXZSBtYXkgaGF2ZSByZWFjaGVkIHRoZSBFT1MgYW5kIHRoZSBhdWRpbyB0cmFjayBpcyBub3Qgc3RvcHBlZCB5ZXQuCisgICAgICAgIC8vIE5vdGUgdGhhdCBBd2Vzb21lUGxheWVyL0F1ZGlvUGxheWVyIHdpbGwgb25seSByZXR1cm4gemVybyBzaXplIHdoZW4gaXQgcmVhY2hlcyB0aGUgRU9TLgorICAgICAgICAvLyBOdVBsYXllcjJSZW5kZXJlciB3aWxsIHJldHVybiB6ZXJvIHdoZW4gaXQgZG9lc24ndCBoYXZlIGRhdGEgKGl0IGRvZXNuJ3QgYmxvY2sgdG8gZmlsbCkuCisgICAgICAgIC8vCisgICAgICAgIC8vIFRoaXMgaXMgYSBiZW5pZ24gYnVzeS13YWl0LCB3aXRoIHRoZSBuZXh0IGRhdGEgcmVxdWVzdCBnZW5lcmF0ZWQgMTAgbXMgb3IgbW9yZSBsYXRlcjsKKyAgICAgICAgLy8gbmV2ZXJ0aGVsZXNzIGZvciBwb3dlciByZWFzb25zLCB3ZSBkb24ndCB3YW50IHRvIHNlZSB0b28gbWFueSBvZiB0aGVzZS4KKworICAgICAgICBBTE9HVl9JRihhY3R1YWxTaXplID09IDAgJiYgYnVmZmVyLT5zaXplID4gMCwgImNhbGxiYWNrd3JhcHBlcjogZW1wdHkgYnVmZmVyIHJldHVybmVkIik7CisKKyAgICAgICAgYnVmZmVyLT5zaXplID0gYWN0dWFsU2l6ZTsKKyAgICAgICAgfSBicmVhazsKKworICAgIGNhc2UgQXVkaW9UcmFjazo6RVZFTlRfU1RSRUFNX0VORDoKKyAgICAgICAgLy8gY3VycmVudGx5IG9ubHkgb2NjdXJzIGZvciBvZmZsb2FkZWQgY2FsbGJhY2tzCisgICAgICAgIEFMT0dWKCJjYWxsYmFja3dyYXBwZXI6IGRlbGl2ZXIgRVZFTlRfU1RSRUFNX0VORCIpOworICAgICAgICAoKm1lLT5tQ2FsbGJhY2spKG1lLCBOVUxMIC8qIGJ1ZmZlciAqLywgMCAvKiBzaXplICovLAorICAgICAgICAgICAgICAgIG1lLT5tQ2FsbGJhY2tDb29raWUsIENCX0VWRU5UX1NUUkVBTV9FTkQpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgQXVkaW9UcmFjazo6RVZFTlRfTkVXX0lBVURJT1RSQUNLIDoKKyAgICAgICAgQUxPR1YoImNhbGxiYWNrd3JhcHBlcjogZGVsaXZlciBFVkVOVF9URUFSX0RPV04iKTsKKyAgICAgICAgKCptZS0+bUNhbGxiYWNrKShtZSwgIE5VTEwgLyogYnVmZmVyICovLCAwIC8qIHNpemUgKi8sCisgICAgICAgICAgICAgICAgbWUtPm1DYWxsYmFja0Nvb2tpZSwgQ0JfRVZFTlRfVEVBUl9ET1dOKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEF1ZGlvVHJhY2s6OkVWRU5UX1VOREVSUlVOOgorICAgICAgICAvLyBUaGlzIG9jY3VycyB3aGVuIHRoZXJlIGlzIG5vIGRhdGEgYXZhaWxhYmxlLCB0eXBpY2FsbHkKKyAgICAgICAgLy8gd2hlbiB0aGVyZSBpcyBhIGZhaWx1cmUgdG8gc3VwcGx5IGRhdGEgdG8gdGhlIEF1ZGlvVHJhY2suICBJdCBjYW4gYWxzbworICAgICAgICAvLyBvY2N1ciBpbiBub24tb2ZmbG9hZGVkIG1vZGUgd2hlbiB0aGUgYXVkaW8gZGV2aWNlIGNvbWVzIG91dCBvZiBzdGFuZGJ5LgorICAgICAgICAvLworICAgICAgICAvLyBJZiBhbiBBdWRpb1RyYWNrIHVuZGVycnVucyBpdCBvdXRwdXRzIHNpbGVuY2UuIFNpbmNlIHRoaXMgaGFwcGVucyBzdWRkZW5seQorICAgICAgICAvLyBpdCBtYXkgc291bmQgbGlrZSBhbiBhdWRpYmxlIHBvcCBvciBnbGl0Y2guCisgICAgICAgIC8vCisgICAgICAgIC8vIFRoZSB1bmRlcnJ1biBldmVudCBpcyBzZW50IG9uY2UgcGVyIHRyYWNrIHVuZGVycnVuOyB0aGUgY29uZGl0aW9uIGlzIHJlc2V0CisgICAgICAgIC8vIHdoZW4gbW9yZSBkYXRhIGlzIHNlbnQgdG8gdGhlIEF1ZGlvVHJhY2suCisgICAgICAgIEFMT0dEKCJjYWxsYmFja3dyYXBwZXI6IEVWRU5UX1VOREVSUlVOIChkaXNjYXJkZWQpIik7CisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgQUxPR0UoInJlY2VpdmVkIHVua25vd24gZXZlbnQgdHlwZTogJWQgaW5zaWRlIENhbGxiYWNrV3JhcHBlciAhIiwgZXZlbnQpOworICAgIH0KKworICAgIGRhdGEtPnVubG9jaygpOworfQorCithdWRpb19zZXNzaW9uX3QgTWVkaWFQbGF5ZXIyTWFuYWdlcjo6QXVkaW9PdXRwdXQ6OmdldFNlc3Npb25JZCgpIGNvbnN0Cit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIHJldHVybiBtU2Vzc2lvbklkOworfQorCit1aW50MzJfdCBNZWRpYVBsYXllcjJNYW5hZ2VyOjpBdWRpb091dHB1dDo6Z2V0U2FtcGxlUmF0ZSgpIGNvbnN0Cit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIGlmIChtVHJhY2sgPT0gMCkgcmV0dXJuIDA7CisgICAgcmV0dXJuIG1UcmFjay0+Z2V0U2FtcGxlUmF0ZSgpOworfQorCitpbnQ2NF90IE1lZGlhUGxheWVyMk1hbmFnZXI6OkF1ZGlvT3V0cHV0OjpnZXRCdWZmZXJEdXJhdGlvbkluVXMoKSBjb25zdAoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobVRyYWNrID09IDApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGludDY0X3QgZHVyYXRpb247CisgICAgaWYgKG1UcmFjay0+Z2V0QnVmZmVyRHVyYXRpb25JblVzKCZkdXJhdGlvbikgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBkdXJhdGlvbjsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTWVkaWFQbGF5ZXIyTWFuYWdlci5oIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFQbGF5ZXIyTWFuYWdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzZWUwNDQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9NZWRpYVBsYXllcjJNYW5hZ2VyLmgKQEAgLTAsMCArMSw0MTQgQEAKKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMTcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQVBMQVlFUjJNQU5BR0VSX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQVBMQVlFUjJNQU5BR0VSX0gKKworI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCisjaW5jbHVkZSA8bWVkaWEvTWVkaWFQbGF5ZXIyRW5naW5lLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFQbGF5ZXIySW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWV0YWRhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQU5hdGl2ZVdpbmRvd1dyYXBwZXI7CitzdHJ1Y3QgQXVkaW9QbGF5YmFja1JhdGU7CitjbGFzcyBBdWRpb1RyYWNrOworc3RydWN0IEFWU3luY1NldHRpbmdzOworY2xhc3MgSURhdGFTb3VyY2U7CitzdHJ1Y3QgTWVkaWFIVFRQU2VydmljZTsKK2NsYXNzIE1lZGlhUGxheWVyMkVuZ2luZUNsaWVudDsKKworI2RlZmluZSBDQUxMQkFDS19BTlRBR09OSVpFUiAwCisjaWYgQ0FMTEJBQ0tfQU5UQUdPTklaRVIKK2NsYXNzIEFudGFnb25pemVyIHsKK3B1YmxpYzoKKyAgICBBbnRhZ29uaXplcigKKyAgICAgICAgICAgIE1lZGlhUGxheWVyMkJhc2U6Ok5vdGlmeUNhbGxiYWNrIGNiLAorICAgICAgICAgICAgY29uc3Qgd3A8TWVkaWFQbGF5ZXIyRW5naW5lPiAmY2xpZW50KTsKKyAgICB2b2lkIHN0YXJ0KCkgeyBtQWN0aXZlID0gdHJ1ZTsgfQorICAgIHZvaWQgc3RvcCgpIHsgbUFjdGl2ZSA9IGZhbHNlOyB9CisgICAgdm9pZCBraWxsKCk7Citwcml2YXRlOgorICAgIHN0YXRpYyBjb25zdCBpbnQgaW50ZXJ2YWw7CisgICAgQW50YWdvbml6ZXIoKTsKKyAgICBzdGF0aWMgaW50IGNhbGxiYWNrVGhyZWFkKHZvaWQgKmNvb2tpZSk7CisgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2s7CisgICAgQ29uZGl0aW9uICAgICAgICAgICAgICAgICAgICAgICAgbUNvbmRpdGlvbjsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRXhpdDsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aXZlOworICAgIHdwPE1lZGlhUGxheWVyMkVuZ2luZT4gICAgICAgICAgIG1DbGllbnQ7CisgICAgTWVkaWFQbGF5ZXIyQmFzZTo6Tm90aWZ5Q2FsbGJhY2sgbUNiOworfTsKKyNlbmRpZgorCitjbGFzcyBNZWRpYVBsYXllcjJNYW5hZ2VyIHsKKyAgICBjbGFzcyBDbGllbnQ7CisKKyAgICBjbGFzcyBBdWRpb091dHB1dCA6IHB1YmxpYyBNZWRpYVBsYXllcjJCYXNlOjpBdWRpb1NpbmsKKyAgICB7CisgICAgICAgIGNsYXNzIENhbGxiYWNrRGF0YTsKKworICAgICBwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvT3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICogYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGRldmljZUNhbGxiYWNrKTsKKyAgICAgICAgdmlydHVhbCAgICAgICAgICAgICAgICAgfkF1ZGlvT3V0cHV0KCk7CisKKyAgICAgICAgdmlydHVhbCBib29sICAgICAgICAgICAgcmVhZHkoKSBjb25zdCB7IHJldHVybiBtVHJhY2sgIT0gMDsgfQorICAgICAgICB2aXJ0dWFsIHNzaXplX3QgICAgICAgICBidWZmZXJTaXplKCkgY29uc3Q7CisgICAgICAgIHZpcnR1YWwgc3NpemVfdCAgICAgICAgIGZyYW1lQ291bnQoKSBjb25zdDsKKyAgICAgICAgdmlydHVhbCBzc2l6ZV90ICAgICAgICAgY2hhbm5lbENvdW50KCkgY29uc3Q7CisgICAgICAgIHZpcnR1YWwgc3NpemVfdCAgICAgICAgIGZyYW1lU2l6ZSgpIGNvbnN0OworICAgICAgICB2aXJ0dWFsIHVpbnQzMl90ICAgICAgICBsYXRlbmN5KCkgY29uc3Q7CisgICAgICAgIHZpcnR1YWwgZmxvYXQgICAgICAgICAgIG1zZWNzUGVyRnJhbWUoKSBjb25zdDsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZ2V0UG9zaXRpb24odWludDMyX3QgKnBvc2l0aW9uKSBjb25zdDsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZ2V0VGltZXN0YW1wKEF1ZGlvVGltZXN0YW1wICZ0cykgY29uc3Q7CisgICAgICAgIHZpcnR1YWwgaW50NjRfdCAgICAgICAgIGdldFBsYXllZE91dER1cmF0aW9uVXMoaW50NjRfdCBub3dVcykgY29uc3Q7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGdldEZyYW1lc1dyaXR0ZW4odWludDMyX3QgKmZyYW1lc3dyaXR0ZW4pIGNvbnN0OworICAgICAgICB2aXJ0dWFsIGF1ZGlvX3Nlc3Npb25fdCBnZXRTZXNzaW9uSWQoKSBjb25zdDsKKyAgICAgICAgdmlydHVhbCB1aW50MzJfdCAgICAgICAgZ2V0U2FtcGxlUmF0ZSgpIGNvbnN0OworICAgICAgICB2aXJ0dWFsIGludDY0X3QgICAgICAgICBnZXRCdWZmZXJEdXJhdGlvbkluVXMoKSBjb25zdDsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBvcGVuKAorICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsIGludCBjaGFubmVsQ291bnQsIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgaW50IGJ1ZmZlckNvdW50LAorICAgICAgICAgICAgICAgIEF1ZGlvQ2FsbGJhY2sgY2IsIHZvaWQgKmNvb2tpZSwKKyAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkUsCisgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvID0gTlVMTCwKKyAgICAgICAgICAgICAgICBib29sIGRvTm90UmVjb25uZWN0ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgdWludDMyX3Qgc3VnZ2VzdGVkRnJhbWVDb3VudCA9IDApOworCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHN0YXJ0KCk7CisgICAgICAgIHZpcnR1YWwgc3NpemVfdCAgICAgICAgIHdyaXRlKGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUsIGJvb2wgYmxvY2tpbmcgPSB0cnVlKTsKKyAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgc3RvcCgpOworICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBmbHVzaCgpOworICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBwYXVzZSgpOworICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBjbG9zZSgpOworICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBzZXRBdWRpb1N0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKTsKKyAgICAgICAgdmlydHVhbCBhdWRpb19zdHJlYW1fdHlwZV90IGdldEF1ZGlvU3RyZWFtVHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1TdHJlYW1UeXBlOyB9CisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIHNldEF1ZGlvQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKiBhdHRyaWJ1dGVzKTsKKworICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRQbGF5YmFja1JhdGUoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUmIHJhdGUpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBnZXRQbGF5YmFja1JhdGUoQXVkaW9QbGF5YmFja1JhdGUqIHJhdGUgLyogbm9ubnVsbCAqLyk7CisKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0QXV4RWZmZWN0U2VuZExldmVsKGZsb2F0IGxldmVsKTsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgYXR0YWNoQXV4RWZmZWN0KGludCBlZmZlY3RJZCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBjb25zdDsKKworICAgICAgICBzdGF0aWMgYm9vbCAgICAgICAgICAgICBpc09uRW11bGF0b3IoKTsKKyAgICAgICAgc3RhdGljIGludCAgICAgICAgICAgICAgZ2V0TWluQnVmZmVyQ291bnQoKTsKKyAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgc2V0TmV4dE91dHB1dChjb25zdCBzcDxBdWRpb091dHB1dD4mIG5leHRPdXRwdXQpOworICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBzd2l0Y2hUb05leHRPdXRwdXQoKTsKKyAgICAgICAgdmlydHVhbCBib29sICAgICAgICAgICAgbmVlZHNUcmFpbGluZ1BhZGRpbmcoKSB7IHJldHVybiBtTmV4dE91dHB1dCA9PSBOVUxMOyB9CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycyk7CisgICAgICAgIHZpcnR1YWwgU3RyaW5nOCAgICAgICAgIGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cyk7CisKKyAgICAgICAgdmlydHVhbCBtZWRpYTo6Vm9sdW1lU2hhcGVyOjpTdGF0dXMgYXBwbHlWb2x1bWVTaGFwZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8bWVkaWE6OlZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbj4mIGNvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8bWVkaWE6OlZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uPiYgb3BlcmF0aW9uKSBvdmVycmlkZTsKKyAgICAgICAgdmlydHVhbCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpTdGF0ZT4gZ2V0Vm9sdW1lU2hhcGVyU3RhdGUoaW50IGlkKSBvdmVycmlkZTsKKworICAgICAgICAvLyBBdWRpb1JvdXRpbmcKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0T3V0cHV0RGV2aWNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBnZXRSb3V0ZWREZXZpY2VJZChhdWRpb19wb3J0X2hhbmRsZV90KiBkZXZpY2VJZCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soYm9vbCBlbmFibGVkKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIHN0YXRpYyB2b2lkICAgICAgICAgICAgIHNldE1pbkJ1ZmZlckNvdW50KCk7CisgICAgICAgIHN0YXRpYyB2b2lkICAgICAgICAgICAgIENhbGxiYWNrV3JhcHBlcigKKyAgICAgICAgICAgICAgICBpbnQgZXZlbnQsIHZvaWQgKm1lLCB2b2lkICppbmZvKTsKKyAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgZGVsZXRlUmVjeWNsZWRUcmFja19sKCk7CisgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgIGNsb3NlX2woKTsKKyAgICAgICAgICAgc3RhdHVzX3QgICAgICAgICAgICAgdXBkYXRlVHJhY2soKTsKKworICAgICAgICBzcDxBdWRpb1RyYWNrPiAgICAgICAgICBtVHJhY2s7CisgICAgICAgIHNwPEF1ZGlvVHJhY2s+ICAgICAgICAgIG1SZWN5Y2xlZFRyYWNrOworICAgICAgICBzcDxBdWRpb091dHB1dD4gICAgICAgICBtTmV4dE91dHB1dDsKKyAgICAgICAgQXVkaW9DYWxsYmFjayAgICAgICAgICAgbUNhbGxiYWNrOworICAgICAgICB2b2lkICogICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tDb29raWU7CisgICAgICAgIENhbGxiYWNrRGF0YSAqICAgICAgICAgIG1DYWxsYmFja0RhdGE7CisgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgICAgIG1TdHJlYW1UeXBlOworICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgKiAgICBtQXR0cmlidXRlczsKKyAgICAgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgbUxlZnRWb2x1bWU7CisgICAgICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgIG1SaWdodFZvbHVtZTsKKyAgICAgICAgQXVkaW9QbGF5YmFja1JhdGUgICAgICAgbVBsYXliYWNrUmF0ZTsKKyAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGVIejsgLy8gc2FtcGxlIHJhdGUgb2YgdGhlIGNvbnRlbnQsIGFzIHNldCBpbiBvcGVuKCkKKyAgICAgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgbU1zZWNzUGVyRnJhbWU7CisgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1GcmFtZVNpemU7CisgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCAgICAgICAgIG1TZXNzaW9uSWQ7CisgICAgICAgIHVpZF90ICAgICAgICAgICAgICAgICAgIG1VaWQ7CisgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1QaWQ7CisgICAgICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgIG1TZW5kTGV2ZWw7CisgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1BdXhFZmZlY3RJZDsKKyAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgICAgbUZsYWdzOworICAgICAgICBzcDxtZWRpYTo6Vm9sdW1lSGFuZGxlcj4gICAgICAgbVZvbHVtZUhhbmRsZXI7CisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgICAgIG1TZWxlY3RlZERldmljZUlkOworICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICAgICBtUm91dGVkRGV2aWNlSWQ7CisgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1EZXZpY2VDYWxsYmFja0VuYWJsZWQ7CisgICAgICAgIHdwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiAgICAgICAgbURldmljZUNhbGxiYWNrOworICAgICAgICBtdXRhYmxlIE11dGV4ICAgICAgICAgICBtTG9jazsKKworICAgICAgICAvLyBzdGF0aWMgdmFyaWFibGVzIGJlbG93IG5vdCBwcm90ZWN0ZWQgYnkgbXV0ZXgKKyAgICAgICAgc3RhdGljIGJvb2wgICAgICAgICAgICAgbUlzT25FbXVsYXRvcjsKKyAgICAgICAgc3RhdGljIGludCAgICAgICAgICAgICAgbU1pbkJ1ZmZlckNvdW50OyAgLy8gMTIgZm9yIGVtdWxhdG9yOyBvdGhlcndpc2UgNAorCisgICAgICAgIC8vIENhbGxiYWNrRGF0YSBpcyB3aGF0IGlzIHBhc3NlZCB0byB0aGUgQXVkaW9UcmFjayBhcyB0aGUgInVzZXIiIGRhdGEuCisgICAgICAgIC8vIFdlIG5lZWQgdG8gYmUgYWJsZSB0byB0YXJnZXQgdGhpcyB0byBhIGRpZmZlcmVudCBPdXRwdXQgb24gdGhlIGZseSwKKyAgICAgICAgLy8gc28gd2UgY2FuJ3QgdXNlIHRoZSBPdXRwdXQgaXRzZWxmIGZvciB0aGlzLgorICAgICAgICBjbGFzcyBDYWxsYmFja0RhdGEgeworICAgICAgICAgICAgZnJpZW5kIEF1ZGlvT3V0cHV0OworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBleHBsaWNpdCBDYWxsYmFja0RhdGEoQXVkaW9PdXRwdXQgKmNvb2tpZSkgeworICAgICAgICAgICAgICAgIG1EYXRhID0gY29va2llOworICAgICAgICAgICAgICAgIG1Td2l0Y2hpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEF1ZGlvT3V0cHV0ICogICBnZXRPdXRwdXQoKSBjb25zdCB7IHJldHVybiBtRGF0YTsgfQorICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIHNldE91dHB1dChBdWRpb091dHB1dCogbmV3Y29va2llKSB7IG1EYXRhID0gbmV3Y29va2llOyB9CisgICAgICAgICAgICAvLyBsb2NrL3VubG9jayBhcmUgdXNlZCBieSB0aGUgY2FsbGJhY2sgYmVmb3JlIGFjY2Vzc2luZyB0aGUgcGF5bG9hZCBvZiB0aGlzIG9iamVjdAorICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIGxvY2soKSBjb25zdCB7IG1Mb2NrLmxvY2soKTsgfQorICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIHVubG9jaygpIGNvbnN0IHsgbUxvY2sudW5sb2NrKCk7IH0KKworICAgICAgICAgICAgLy8gdHJ5QmVnaW5UcmFja1N3aXRjaC9lbmRUcmFja1N3aXRjaCBhcmUgdXNlZCB3aGVuIHRoZSBDYWxsYmFja0RhdGEgaXMgaGFuZGVkIG92ZXIKKyAgICAgICAgICAgIC8vIHRvIHRoZSBuZXh0IHNpbmsuCisKKyAgICAgICAgICAgIC8vIHRyeUJlZ2luVHJhY2tTd2l0Y2goKSByZXR1cm5zIHRydWUgb25seSBpZiBpdCBvYnRhaW5zIHRoZSBsb2NrLgorICAgICAgICAgICAgYm9vbCAgICAgICAgICAgIHRyeUJlZ2luVHJhY2tTd2l0Y2goKSB7CisgICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtU3dpdGNoaW5nLCAidHJ5QmVnaW5UcmFja1N3aXRjaCgpIGFscmVhZHkgY2FsbGVkIik7CisgICAgICAgICAgICAgICAgaWYgKG1Mb2NrLnRyeUxvY2soKSAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1Td2l0Y2hpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIGVuZFRyYWNrU3dpdGNoKCkgeworICAgICAgICAgICAgICAgIGlmIChtU3dpdGNoaW5nKSB7CisgICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtU3dpdGNoaW5nID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICBBdWRpb091dHB1dCAqICAgbURhdGE7CisgICAgICAgICAgICBtdXRhYmxlIE11dGV4ICAgbUxvY2s7IC8vIGEgcmVjdXJzaXZlIG11dGV4IG1pZ2h0IG1ha2UgdGhpcyB1bm5lY2Vzc2FyeS4KKyAgICAgICAgICAgIGJvb2wgICAgICAgICAgICBtU3dpdGNoaW5nOworICAgICAgICAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ2FsbGJhY2tEYXRhKTsKKyAgICAgICAgfTsKKworICAgIH07IC8vIEF1ZGlvT3V0cHV0CisKKworcHVibGljOgorICAgIE1lZGlhUGxheWVyMk1hbmFnZXIoKTsKKyAgICB2aXJ0dWFsIH5NZWRpYVBsYXllcjJNYW5hZ2VyKCk7CisKKyAgICBzdGF0aWMgTWVkaWFQbGF5ZXIyTWFuYWdlciYgZ2V0KCk7CisKKyAgICAvLyBNZWRpYVBsYXllcjJNYW5hZ2VyIGludGVyZmFjZQorICAgIHZpcnR1YWwgc3A8TWVkaWFQbGF5ZXIyRW5naW5lPiBjcmVhdGUoY29uc3Qgc3A8TWVkaWFQbGF5ZXIyRW5naW5lQ2xpZW50PiYgY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IGF1ZGlvU2Vzc2lvbklkKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgICAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CisKKyAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgcmVtb3ZlQ2xpZW50KGNvbnN0IHdwPENsaWVudD4mIGNsaWVudCk7CisgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgIGhhc0NsaWVudCh3cDxDbGllbnQ+IGNsaWVudCk7CisKK3ByaXZhdGU6CisgICAgY2xhc3MgQ2xpZW50IDogcHVibGljIE1lZGlhUGxheWVyMkVuZ2luZSB7CisgICAgICAgIC8vIE1lZGlhUGxheWVyMkVuZ2luZSBpbnRlcmZhY2UKKyAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgZGlzY29ubmVjdCgpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRWaWRlb1N1cmZhY2VUZXh0dXJlKAorICAgICAgICAgICAgICAgIGNvbnN0IHNwPEFOYXRpdmVXaW5kb3dXcmFwcGVyPiYgbnd3KSBvdmVycmlkZTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0QnVmZmVyaW5nU2V0dGluZ3MoY29uc3QgQnVmZmVyaW5nU2V0dGluZ3MmIGJ1ZmZlcmluZykgb3ZlcnJpZGU7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGdldEJ1ZmZlcmluZ1NldHRpbmdzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcmluZ1NldHRpbmdzKiBidWZmZXJpbmcgLyogbm9ubnVsbCAqLykgb3ZlcnJpZGU7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHByZXBhcmVBc3luYygpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzdGFydCgpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzdG9wKCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHBhdXNlKCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGlzUGxheWluZyhib29sKiBzdGF0ZSk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldFBsYXliYWNrU2V0dGluZ3MoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUmIHJhdGUpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBnZXRQbGF5YmFja1NldHRpbmdzKEF1ZGlvUGxheWJhY2tSYXRlKiByYXRlIC8qIG5vbm51bGwgKi8pOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRTeW5jU2V0dGluZ3MoY29uc3QgQVZTeW5jU2V0dGluZ3MmIHJhdGUsIGZsb2F0IHZpZGVvRnBzSGludCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGdldFN5bmNTZXR0aW5ncyhBVlN5bmNTZXR0aW5ncyogcmF0ZSAvKiBub25udWxsICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHZpZGVvRnBzIC8qIG5vbm51bGwgKi8pOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZWVrVG8oCisgICAgICAgICAgICAgICAgaW50IG1zZWMsCisgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXIyU2Vla01vZGUgbW9kZSA9IE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkMpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBnZXRDdXJyZW50UG9zaXRpb24oaW50KiBtc2VjKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZ2V0RHVyYXRpb24oaW50KiBtc2VjKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgcmVzZXQoKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgbm90aWZ5QXQoaW50NjRfdCBtZWRpYVRpbWVVcyk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldEF1ZGlvU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHR5cGUpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRMb29waW5nKGludCBsb29wKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0Vm9sdW1lKGZsb2F0IGxlZnRWb2x1bWUsIGZsb2F0IHJpZ2h0Vm9sdW1lKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgaW52b2tlKGNvbnN0IFBhcmNlbCYgcmVxdWVzdCwgUGFyY2VsICpyZXBseSk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldE1ldGFkYXRhRmlsdGVyKGNvbnN0IFBhcmNlbCYgZmlsdGVyKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZ2V0TWV0YWRhdGEoYm9vbCB1cGRhdGVfb25seSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhcHBseV9maWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCAqcmVwbHkpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRBdXhFZmZlY3RTZW5kTGV2ZWwoZmxvYXQgbGV2ZWwpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBhdHRhY2hBdXhFZmZlY3QoaW50IGVmZmVjdElkKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0UGFyYW1ldGVyKGludCBrZXksIGNvbnN0IFBhcmNlbCAmcmVxdWVzdCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGdldFBhcmFtZXRlcihpbnQga2V5LCBQYXJjZWwgKnJlcGx5KTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0UmV0cmFuc21pdEVuZHBvaW50KGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiogZW5kcG9pbnQpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBnZXRSZXRyYW5zbWl0RW5kcG9pbnQoc3RydWN0IHNvY2thZGRyX2luKiBlbmRwb2ludCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldE5leHRQbGF5ZXIoY29uc3Qgc3A8TWVkaWFQbGF5ZXIyRW5naW5lPiYgcGxheWVyKTsKKworICAgICAgICB2aXJ0dWFsIG1lZGlhOjpWb2x1bWVTaGFwZXI6OlN0YXR1cyBhcHBseVZvbHVtZVNoYXBlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uPiYgY29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb24+JiBvcGVyYXRpb24pIG92ZXJyaWRlOworICAgICAgICB2aXJ0dWFsIHNwPG1lZGlhOjpWb2x1bWVTaGFwZXI6OlN0YXRlPiBnZXRWb2x1bWVTaGFwZXJTdGF0ZShpbnQgaWQpIG92ZXJyaWRlOworCisgICAgICAgIHNwPE1lZGlhUGxheWVyMkJhc2U+ICAgIGNyZWF0ZVBsYXllcihwbGF5ZXIyX3R5cGUgcGxheWVyVHlwZSk7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0RGF0YVNvdXJjZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXREYXRhU291cmNlKGNvbnN0IHNwPElTdHJlYW1Tb3VyY2U+ICZzb3VyY2UpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXREYXRhU291cmNlKGNvbnN0IHNwPElEYXRhU291cmNlPiAmc291cmNlKTsKKworCisgICAgICAgIHNwPE1lZGlhUGxheWVyMkJhc2U+ICAgIHNldERhdGFTb3VyY2VfcHJlKHBsYXllcjJfdHlwZSBwbGF5ZXJUeXBlKTsKKyAgICAgICAgc3RhdHVzX3QgICAgICAgICAgICAgICAgc2V0RGF0YVNvdXJjZV9wb3N0KGNvbnN0IHNwPE1lZGlhUGxheWVyMkJhc2U+JiBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzKTsKKworICAgICAgICBzdGF0aWMgIHZvaWQgICAgICAgICAgICBub3RpZnkoY29uc3Qgd3A8TWVkaWFQbGF5ZXIyRW5naW5lPiAmbGlzdGVuZXIsIGludCBtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqb2JqKTsKKworICAgICAgICAgICAgICAgIHBpZF90ICAgICAgICAgICBwaWQoKSBjb25zdCB7IHJldHVybiBtUGlkOyB9CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKKworICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBnZXRBdWRpb1Nlc3Npb25JZCgpIHsgcmV0dXJuIG1BdWRpb1Nlc3Npb25JZDsgfQorICAgICAgICAvLyBNb2R1bGFyIERSTQorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHByZXBhcmVEcm0oY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBkcm1TZXNzaW9uSWQpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VEcm0oKTsKKyAgICAgICAgLy8gQXVkaW9Sb3V0aW5nCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0T3V0cHV0RGV2aWNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFJvdXRlZERldmljZUlkKGF1ZGlvX3BvcnRfaGFuZGxlX3QqIGRldmljZUlkKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBlbmFibGVBdWRpb0RldmljZUNhbGxiYWNrKGJvb2wgZW5hYmxlZCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBjbGFzcyBBdWRpb0RldmljZVVwZGF0ZWROb3RpZmllcjogcHVibGljIEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrCisgICAgICAgIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgQXVkaW9EZXZpY2VVcGRhdGVkTm90aWZpZXIoY29uc3Qgc3A8TWVkaWFQbGF5ZXIyQmFzZT4mIGxpc3RlbmVyKSB7CisgICAgICAgICAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB+QXVkaW9EZXZpY2VVcGRhdGVkTm90aWZpZXIoKSB7fQorCisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb0RldmljZVVwZGF0ZShhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCk7CisKKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIHdwPE1lZGlhUGxheWVyMkJhc2U+IG1MaXN0ZW5lcjsKKyAgICAgICAgfTsKKworICAgICAgICBmcmllbmQgY2xhc3MgTWVkaWFQbGF5ZXIyTWFuYWdlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xpZW50KHBpZF90IHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29ubklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFQbGF5ZXIyRW5naW5lQ2xpZW50PiYgY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IGF1ZGlvU2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xpZW50KCk7CisgICAgICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgIH5DbGllbnQoKTsKKworICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBkZWxldGVQbGF5ZXIoKTsKKworICAgICAgICBzcDxNZWRpYVBsYXllcjJCYXNlPiAgICAgZ2V0UGxheWVyKCkgY29uc3QgeyBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7IHJldHVybiBtUGxheWVyOyB9CisKKworCisgICAgICAgIC8vIEBwYXJhbSB0eXBlIE9mIHRoZSBtZXRhZGF0YSB0byBiZSB0ZXN0ZWQuCisgICAgICAgIC8vIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbWV0YWRhdGEgc2hvdWxkIGJlIGRyb3BwZWQgYWNjb3JkaW5nIHRvCisgICAgICAgIC8vICAgICAgICAgICAgICB0aGUgZmlsdGVycy4KKyAgICAgICAgYm9vbCBzaG91bGREcm9wTWV0YWRhdGEobWVkaWE6Ok1ldGFkYXRhOjpUeXBlIHR5cGUpIGNvbnN0OworCisgICAgICAgIC8vIEFkZCBhIG5ldyBlbGVtZW50IHRvIHRoZSBzZXQgb2YgbWV0YWRhdGEgdXBkYXRlZC4gTm9vcCBpZgorICAgICAgICAvLyB0aGUgZWxlbWVudCBleGlzdHMgYWxyZWFkeS4KKyAgICAgICAgLy8gQHBhcmFtIHR5cGUgT2YgdGhlIG1ldGFkYXRhIHRvIGJlIHJlY29yZGVkLgorICAgICAgICB2b2lkIGFkZE5ld01ldGFkYXRhVXBkYXRlKG1lZGlhOjpNZXRhZGF0YTo6VHlwZSB0eXBlKTsKKworICAgICAgICAvLyBEaXNjb25uZWN0IGZyb20gdGhlIGN1cnJlbnRseSBjb25uZWN0ZWQgQU5hdGl2ZVdpbmRvdy4KKyAgICAgICAgdm9pZCBkaXNjb25uZWN0TmF0aXZlV2luZG93X2woKTsKKworICAgICAgICBzdGF0dXNfdCBzZXRBdWRpb0F0dHJpYnV0ZXNfbChjb25zdCBQYXJjZWwgJnJlcXVlc3QpOworCisgICAgICAgIG11dGFibGUgICAgIE11dGV4ICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2s7CisgICAgICAgICAgICAgICAgICAgIHNwPE1lZGlhUGxheWVyMkJhc2U+ICAgICAgICAgbVBsYXllcjsKKyAgICAgICAgICAgICAgICAgICAgc3A8TWVkaWFQbGF5ZXIyRW5naW5lQ2xpZW50PiBtQ2xpZW50OworICAgICAgICAgICAgICAgICAgICBzcDxBdWRpb091dHB1dD4gICAgICAgICAgICAgIG1BdWRpb091dHB1dDsKKyAgICAgICAgICAgICAgICAgICAgcGlkX3QgICAgICAgICAgICAgICAgICAgICAgICBtUGlkOworICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgICAgICAgICAgICAgIG1TdGF0dXM7CisgICAgICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgbUxvb3A7CisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICAgbUNvbm5JZDsKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90ICAgICAgICAgICAgICBtQXVkaW9TZXNzaW9uSWQ7CisgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCAqICAgICAgICAgbUF1ZGlvQXR0cmlidXRlczsKKyAgICAgICAgICAgICAgICAgICAgdWlkX3QgICAgICAgICAgICAgICAgICAgICAgICBtVWlkOworICAgICAgICAgICAgICAgICAgICBzcDxBTmF0aXZlV2luZG93V3JhcHBlcj4gICAgIG1Db25uZWN0ZWRXaW5kb3c7CisgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiAgICAgICAgICAgbVJldHJhbnNtaXRFbmRwb2ludDsKKyAgICAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICBtUmV0cmFuc21pdEVuZHBvaW50VmFsaWQ7CisgICAgICAgICAgICAgICAgICAgIHNwPENsaWVudD4gICAgICAgICAgICAgICAgICAgbU5leHRDbGllbnQ7CisKKyAgICAgICAgLy8gTWV0YWRhdGEgZmlsdGVycy4KKyAgICAgICAgbWVkaWE6Ok1ldGFkYXRhOjpGaWx0ZXIgbU1ldGFkYXRhQWxsb3c7ICAvLyBwcm90ZWN0ZWQgYnkgbUxvY2sKKyAgICAgICAgbWVkaWE6Ok1ldGFkYXRhOjpGaWx0ZXIgbU1ldGFkYXRhRHJvcDsgIC8vIHByb3RlY3RlZCBieSBtTG9jaworCisgICAgICAgIC8vIE1ldGFkYXRhIHVwZGF0ZWQuIEZvciBlYWNoIE1FRElBX0lORk9fTUVUQURBVEFfVVBEQVRFCisgICAgICAgIC8vIG5vdGlmaWNhdGlvbiB3ZSB0cnkgdG8gdXBkYXRlIG1NZXRhZGF0YVVwZGF0ZWQgd2hpY2ggaXMgYQorICAgICAgICAvLyBzZXQ6IG5vIGR1cGxpY2F0ZS4KKyAgICAgICAgLy8gZ2V0TWV0YWRhdGEgY2xlYXJzIHRoaXMgc2V0LgorICAgICAgICBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciBtTWV0YWRhdGFVcGRhdGVkOyAgLy8gcHJvdGVjdGVkIGJ5IG1Mb2NrCisKKyAgICAgICAgc3A8QXVkaW9EZXZpY2VVcGRhdGVkTm90aWZpZXI+IG1BdWRpb0RldmljZVVwZGF0ZWRMaXN0ZW5lcjsKKyNpZiBDQUxMQkFDS19BTlRBR09OSVpFUgorICAgICAgICAgICAgICAgICAgICBBbnRhZ29uaXplciogICAgICAgICAgICAgICAgbUFudGFnb25pemVyOworI2VuZGlmCisgICAgfTsgLy8gQ2xpZW50CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIHBpZF90IG1QaWQ7CisgICAgdWlkX3QgbVVpZDsKKworICAgIG11dGFibGUgTXV0ZXggbUxvY2s7CisgICAgU29ydGVkVmVjdG9yPCB3cDxDbGllbnQ+ID4gbUNsaWVudHM7CisgICAgaW50MzJfdCBtTmV4dENvbm5JZDsKK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfTUVESUFQTEFZRVIyTUFOQUdFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9OZGtXcmFwcGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL05ka1dyYXBwZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MjM5M2QKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9OZGtXcmFwcGVyLmNwcApAQCAtMCwwICsxLDExNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTmRrV3JhcHBlciIKKworI2luY2x1ZGUgPG1lZGlhL05ka1dyYXBwZXIuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvbmF0aXZlX3dpbmRvdy5oPgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUNvZGVjLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFDcnlwdG8uaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYURybS5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0aWMgY29uc3Qgc2l6ZV90IGtBRVNCbG9ja1NpemUgPSAxNjsgIC8vIEFFU19CTE9DS19TSVpFCisKK3N0YXRpYyBjb25zdCBjaGFyICpBTWVkaWFGb3JtYXRLZXlHcm91cEludDMyW10gPSB7CisgICAgQU1FRElBRk9STUFUX0tFWV9BQUNfRFJDX0FUVEVOVUFUSU9OX0ZBQ1RPUiwKKyAgICBBTUVESUFGT1JNQVRfS0VZX0FBQ19EUkNfQk9PU1RfRkFDVE9SLAorICAgIEFNRURJQUZPUk1BVF9LRVlfQUFDX0RSQ19IRUFWWV9DT01QUkVTU0lPTiwKKyAgICBBTUVESUFGT1JNQVRfS0VZX0FBQ19EUkNfVEFSR0VUX1JFRkVSRU5DRV9MRVZFTCwKKyAgICBBTUVESUFGT1JNQVRfS0VZX0FBQ19FTkNPREVEX1RBUkdFVF9MRVZFTCwKKyAgICBBTUVESUFGT1JNQVRfS0VZX0FBQ19NQVhfT1VUUFVUX0NIQU5ORUxfQ09VTlQsCisgICAgQU1FRElBRk9STUFUX0tFWV9BQUNfUFJPRklMRSwKKyAgICBBTUVESUFGT1JNQVRfS0VZX0FBQ19TQlJfTU9ERSwKKyAgICBBTUVESUFGT1JNQVRfS0VZX0FVRElPX1NFU1NJT05fSUQsCisgICAgQU1FRElBRk9STUFUX0tFWV9CSVRSQVRFX01PREUsCisgICAgQU1FRElBRk9STUFUX0tFWV9CSVRfUkFURSwKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NBUFRVUkVfUkFURSwKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsCisgICAgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX01BU0ssCisgICAgQU1FRElBRk9STUFUX0tFWV9DT0xPUl9GT1JNQVQsCisgICAgQU1FRElBRk9STUFUX0tFWV9DT0xPUl9SQU5HRSwKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1NUQU5EQVJELAorICAgIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfVFJBTlNGRVIsCisgICAgQU1FRElBRk9STUFUX0tFWV9DT01QTEVYSVRZLAorICAgIEFNRURJQUZPUk1BVF9LRVlfRkxBQ19DT01QUkVTU0lPTl9MRVZFTCwKKyAgICBBTUVESUFGT1JNQVRfS0VZX0dSSURfQ09MUywKKyAgICBBTUVESUFGT1JNQVRfS0VZX0dSSURfSEVJR0hULAorICAgIEFNRURJQUZPUk1BVF9LRVlfR1JJRF9ST1dTLAorICAgIEFNRURJQUZPUk1BVF9LRVlfR1JJRF9XSURUSCwKKyAgICBBTUVESUFGT1JNQVRfS0VZX0hFSUdIVCwKKyAgICBBTUVESUFGT1JNQVRfS0VZX0lOVFJBX1JFRlJFU0hfUEVSSU9ELAorICAgIEFNRURJQUZPUk1BVF9LRVlfSVNfQURUUywKKyAgICBBTUVESUFGT1JNQVRfS0VZX0lTX0FVVE9TRUxFQ1QsCisgICAgQU1FRElBRk9STUFUX0tFWV9JU19ERUZBVUxULAorICAgIEFNRURJQUZPUk1BVF9LRVlfSVNfRk9SQ0VEX1NVQlRJVExFLAorICAgIEFNRURJQUZPUk1BVF9LRVlfTEFURU5DWSwKKyAgICBBTUVESUFGT1JNQVRfS0VZX0xFVkVMLAorICAgIEFNRURJQUZPUk1BVF9LRVlfTUFYX0hFSUdIVCwKKyAgICBBTUVESUFGT1JNQVRfS0VZX01BWF9JTlBVVF9TSVpFLAorICAgIEFNRURJQUZPUk1BVF9LRVlfTUFYX1dJRFRILAorICAgIEFNRURJQUZPUk1BVF9LRVlfUENNX0VOQ09ESU5HLAorICAgIEFNRURJQUZPUk1BVF9LRVlfUFJJT1JJVFksCisgICAgQU1FRElBRk9STUFUX0tFWV9QUk9GSUxFLAorICAgIEFNRURJQUZPUk1BVF9LRVlfUFVTSF9CTEFOS19CVUZGRVJTX09OX1NUT1AsCisgICAgQU1FRElBRk9STUFUX0tFWV9ST1RBVElPTiwKKyAgICBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLAorICAgIEFNRURJQUZPUk1BVF9LRVlfU0xJQ0VfSEVJR0hULAorICAgIEFNRURJQUZPUk1BVF9LRVlfU1RSSURFLAorICAgIEFNRURJQUZPUk1BVF9LRVlfVFJBQ0tfSUQsCisgICAgQU1FRElBRk9STUFUX0tFWV9XSURUSCwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpBTWVkaWFGb3JtYXRLZXlHcm91cEludDY0W10gPSB7CisgICAgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwKKyAgICBBTUVESUFGT1JNQVRfS0VZX1JFUEVBVF9QUkVWSU9VU19GUkFNRV9BRlRFUiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpBTWVkaWFGb3JtYXRLZXlHcm91cFN0cmluZ1tdID0geworICAgIEFNRURJQUZPUk1BVF9LRVlfTEFOR1VBR0UsCisgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLAorICAgIEFNRURJQUZPUk1BVF9LRVlfVEVNUE9SQUxfTEFZRVJJTkcsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqQU1lZGlhRm9ybWF0S2V5R3JvdXBCdWZmZXJbXSA9IHsKKyAgICBBTUVESUFGT1JNQVRfS0VZX0hEUl9TVEFUSUNfSU5GTywKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpBTWVkaWFGb3JtYXRLZXlHcm91cFJlY3RbXSA9IHsKKyAgICBBTUVESUFGT1JNQVRfS0VZX0RJU1BMQVlfQ1JPUCwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpBTWVkaWFGb3JtYXRLZXlHcm91cEZsb2F0SW50MzJbXSA9IHsKKyAgICBBTUVESUFGT1JNQVRfS0VZX0ZSQU1FX1JBVEUsCisgICAgQU1FRElBRk9STUFUX0tFWV9JX0ZSQU1FX0lOVEVSVkFMLAorICAgIEFNRURJQUZPUk1BVF9LRVlfT1BFUkFUSU5HX1JBVEUsCit9OworCitzdGF0aWMgc3RhdHVzX3QgdHJhbnNsYXRlRXJyb3JDb2RlKG1lZGlhX3N0YXR1c190IGVycikgeworICAgIGlmIChlcnIgPT0gQU1FRElBX09LKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9IGVsc2UgaWYgKGVyciA9PSBBTUVESUFDT0RFQ19JTkZPX1RSWV9BR0FJTl9MQVRFUikgeworICAgICAgICByZXR1cm4gLUVBR0FJTjsKKyAgICB9CisKKyAgICBBTE9HRSgibmRrIGVycm9yIGNvZGU6ICVkIiwgZXJyKTsKKyAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKK30KKworc3RhdGljIGludDMyX3QgdHJhbnNsYXRlQWN0aW9uQ29kZShpbnQzMl90IGFjdGlvbkNvZGUpIHsKKyAgICBpZiAoQU1lZGlhQ29kZWNBY3Rpb25Db2RlX2lzVHJhbnNpZW50KGFjdGlvbkNvZGUpKSB7CisgICAgICAgIHJldHVybiBBQ1RJT05fQ09ERV9UUkFOU0lFTlQ7CisgICAgfSBlbHNlIGlmIChBTWVkaWFDb2RlY0FjdGlvbkNvZGVfaXNSZWNvdmVyYWJsZShhY3Rpb25Db2RlKSkgeworICAgICAgICByZXR1cm4gQUNUSU9OX0NPREVfUkVDT1ZFUkFCTEU7CisgICAgfQorICAgIHJldHVybiBBQ1RJT05fQ09ERV9GQVRBTDsKK30KKworc3RhdGljIENyeXB0b1BsdWdpbjo6TW9kZSB0cmFuc2xhdGVUb0NyeXB0b1BsdWdpbk1vZGUoY3J5cHRvaW5mb19tb2RlX3QgbW9kZSkgeworICAgIENyeXB0b1BsdWdpbjo6TW9kZSByZXQgPSBDcnlwdG9QbHVnaW46OmtNb2RlX1VuZW5jcnlwdGVkOworICAgIHN3aXRjaCAobW9kZSkgeworICAgICAgICBjYXNlIEFNRURJQUNPREVDUllQVE9JTkZPX01PREVfQUVTX0NUUjogeworICAgICAgICAgICAgcmV0ID0gQ3J5cHRvUGx1Z2luOjprTW9kZV9BRVNfQ1RSOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEFNRURJQUNPREVDUllQVE9JTkZPX01PREVfQUVTX1dWOiB7CisgICAgICAgICAgICByZXQgPSBDcnlwdG9QbHVnaW46OmtNb2RlX0FFU19XVjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBBTUVESUFDT0RFQ1JZUFRPSU5GT19NT0RFX0FFU19DQkM6IHsKKyAgICAgICAgICAgIHJldCA9IENyeXB0b1BsdWdpbjo6a01vZGVfQUVTX0NCQzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjcnlwdG9pbmZvX21vZGVfdCB0cmFuc2xhdGVUb0NyeXB0b0luZm9Nb2RlKENyeXB0b1BsdWdpbjo6TW9kZSBtb2RlKSB7CisgICAgY3J5cHRvaW5mb19tb2RlX3QgcmV0ID0gQU1FRElBQ09ERUNSWVBUT0lORk9fTU9ERV9DTEVBUjsKKyAgICBzd2l0Y2ggKG1vZGUpIHsKKyAgICAgICAgY2FzZSBDcnlwdG9QbHVnaW46OmtNb2RlX0FFU19DVFI6IHsKKyAgICAgICAgICAgIHJldCA9IEFNRURJQUNPREVDUllQVE9JTkZPX01PREVfQUVTX0NUUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBDcnlwdG9QbHVnaW46OmtNb2RlX0FFU19XVjogeworICAgICAgICAgICAgcmV0ID0gQU1FRElBQ09ERUNSWVBUT0lORk9fTU9ERV9BRVNfV1Y7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgQ3J5cHRvUGx1Z2luOjprTW9kZV9BRVNfQ0JDOiB7CisgICAgICAgICAgICByZXQgPSBBTUVESUFDT0RFQ1JZUFRPSU5GT19NT0RFX0FFU19DQkM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCisvLy8vLy8vLy8vLy8gQU1lZGlhRm9ybWF0V3JhcHBlcgorLy8gc3RhdGljCitzcDxBTWVkaWFGb3JtYXRXcmFwcGVyPiBBTWVkaWFGb3JtYXRXcmFwcGVyOjpDcmVhdGUoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtZXNzYWdlKSB7CisgICAgc3A8QU1lZGlhRm9ybWF0V3JhcHBlcj4gYU1lZGlhRm9ybWF0ID0gbmV3IEFNZWRpYUZvcm1hdFdyYXBwZXIoKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWVzc2FnZS0+Y291bnRFbnRyaWVzKCk7ICsraSkgeworICAgICAgICBBTWVzc2FnZTo6VHlwZSB2YWx1ZVR5cGU7CisgICAgICAgIGNvbnN0IGNoYXIgKmtleSA9IG1lc3NhZ2UtPmdldEVudHJ5TmFtZUF0KGksICZ2YWx1ZVR5cGUpOworCisgICAgICAgIHN3aXRjaCAodmFsdWVUeXBlKSB7CisgICAgICAgICAgICBjYXNlIEFNZXNzYWdlOjprVHlwZUludDMyOiB7CisgICAgICAgICAgICAgICAgaW50MzJfdCB2YWw7CisgICAgICAgICAgICAgICAgaWYgKCFtZXNzYWdlLT5maW5kSW50MzIoa2V5LCAmdmFsKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQU1lZGlhRm9ybWF0V3JhcHBlcjo6Q3JlYXRlOiBlcnJvciBhdCBpdGVtICV6dSIsIGkpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYU1lZGlhRm9ybWF0LT5zZXRJbnQzMihrZXksIHZhbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlSW50NjQ6IHsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHZhbDsKKyAgICAgICAgICAgICAgICBpZiAoIW1lc3NhZ2UtPmZpbmRJbnQ2NChrZXksICZ2YWwpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJBTWVkaWFGb3JtYXRXcmFwcGVyOjpDcmVhdGU6IGVycm9yIGF0IGl0ZW0gJXp1IiwgaSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhTWVkaWFGb3JtYXQtPnNldEludDY0KGtleSwgdmFsKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSBBTWVzc2FnZTo6a1R5cGVGbG9hdDogeworICAgICAgICAgICAgICAgIGZsb2F0IHZhbDsKKyAgICAgICAgICAgICAgICBpZiAoIW1lc3NhZ2UtPmZpbmRGbG9hdChrZXksICZ2YWwpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJBTWVkaWFGb3JtYXRXcmFwcGVyOjpDcmVhdGU6IGVycm9yIGF0IGl0ZW0gJXp1IiwgaSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhTWVkaWFGb3JtYXQtPnNldEZsb2F0KGtleSwgdmFsKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSBBTWVzc2FnZTo6a1R5cGVEb3VibGU6IHsKKyAgICAgICAgICAgICAgICBkb3VibGUgdmFsOworICAgICAgICAgICAgICAgIGlmICghbWVzc2FnZS0+ZmluZERvdWJsZShrZXksICZ2YWwpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJBTWVkaWFGb3JtYXRXcmFwcGVyOjpDcmVhdGU6IGVycm9yIGF0IGl0ZW0gJXp1IiwgaSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhTWVkaWFGb3JtYXQtPnNldERvdWJsZShrZXksIHZhbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlU2l6ZTogeworICAgICAgICAgICAgICAgIHNpemVfdCB2YWw7CisgICAgICAgICAgICAgICAgaWYgKCFtZXNzYWdlLT5maW5kU2l6ZShrZXksICZ2YWwpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJBTWVkaWFGb3JtYXRXcmFwcGVyOjpDcmVhdGU6IGVycm9yIGF0IGl0ZW0gJXp1IiwgaSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhTWVkaWFGb3JtYXQtPnNldFNpemUoa2V5LCB2YWwpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIEFNZXNzYWdlOjprVHlwZVJlY3Q6IHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbTsKKyAgICAgICAgICAgICAgICBpZiAoIW1lc3NhZ2UtPmZpbmRSZWN0KGtleSwgJmxlZnQsICZ0b3AsICZyaWdodCwgJmJvdHRvbSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkFNZWRpYUZvcm1hdFdyYXBwZXI6OkNyZWF0ZTogZXJyb3IgYXQgaXRlbSAlenUiLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFNZWRpYUZvcm1hdC0+c2V0UmVjdChrZXksIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlU3RyaW5nOiB7CisgICAgICAgICAgICAgICAgQVN0cmluZyB2YWw7CisgICAgICAgICAgICAgICAgaWYgKCFtZXNzYWdlLT5maW5kU3RyaW5nKGtleSwgJnZhbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkFNZWRpYUZvcm1hdFdyYXBwZXI6OkNyZWF0ZTogZXJyb3IgYXQgaXRlbSAlenUiLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFNZWRpYUZvcm1hdC0+c2V0U3RyaW5nKGtleSwgdmFsKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSBBTWVzc2FnZTo6a1R5cGVCdWZmZXI6IHsKKyAgICAgICAgICAgICAgICBzcDxBQnVmZmVyPiB2YWw7CisgICAgICAgICAgICAgICAgaWYgKCFtZXNzYWdlLT5maW5kQnVmZmVyKGtleSwgJnZhbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkFNZWRpYUZvcm1hdFdyYXBwZXI6OkNyZWF0ZTogZXJyb3IgYXQgaXRlbSAlenUiLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFNZWRpYUZvcm1hdC0+c2V0QnVmZmVyKGtleSwgdmFsLT5kYXRhKCksIHZhbC0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGFNZWRpYUZvcm1hdDsKK30KKworQU1lZGlhRm9ybWF0V3JhcHBlcjo6QU1lZGlhRm9ybWF0V3JhcHBlcigpIHsKKyAgICBtQU1lZGlhRm9ybWF0ID0gQU1lZGlhRm9ybWF0X25ldygpOworfQorCitBTWVkaWFGb3JtYXRXcmFwcGVyOjpBTWVkaWFGb3JtYXRXcmFwcGVyKEFNZWRpYUZvcm1hdCAqYU1lZGlhRm9ybWF0KQorICAgIDogbUFNZWRpYUZvcm1hdChhTWVkaWFGb3JtYXQpIHsKK30KKworQU1lZGlhRm9ybWF0V3JhcHBlcjo6fkFNZWRpYUZvcm1hdFdyYXBwZXIoKSB7CisgICAgcmVsZWFzZSgpOworfQorCitzdGF0dXNfdCBBTWVkaWFGb3JtYXRXcmFwcGVyOjpyZWxlYXNlKCkgeworICAgIGlmIChtQU1lZGlhRm9ybWF0ICE9IE5VTEwpIHsKKyAgICAgICAgbWVkaWFfc3RhdHVzX3QgZXJyID0gQU1lZGlhRm9ybWF0X2RlbGV0ZShtQU1lZGlhRm9ybWF0KTsKKyAgICAgICAgbUFNZWRpYUZvcm1hdCA9IE5VTEw7CisgICAgICAgIHJldHVybiB0cmFuc2xhdGVFcnJvckNvZGUoZXJyKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitBTWVkaWFGb3JtYXQgKkFNZWRpYUZvcm1hdFdyYXBwZXI6OmdldEFNZWRpYUZvcm1hdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUFNZWRpYUZvcm1hdDsKK30KKworc3A8QU1lc3NhZ2U+IEFNZWRpYUZvcm1hdFdyYXBwZXI6OnRvQU1lc3NhZ2UoKSBjb25zdCB7CisgICAgaWYgKG1BTWVkaWFGb3JtYXQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlOworICAgIGZvciAoYXV0byYga2V5IDogQU1lZGlhRm9ybWF0S2V5R3JvdXBJbnQzMikgeworICAgICAgICBpbnQzMl90IHZhbDsKKyAgICAgICAgaWYgKGdldEludDMyKGtleSwgJnZhbCkpIHsKKyAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoa2V5LCB2YWwpOworICAgICAgICB9CisgICAgfQorICAgIGZvciAoYXV0byYga2V5IDogQU1lZGlhRm9ybWF0S2V5R3JvdXBJbnQ2NCkgeworICAgICAgICBpbnQ2NF90IHZhbDsKKyAgICAgICAgaWYgKGdldEludDY0KGtleSwgJnZhbCkpIHsKKyAgICAgICAgICAgIG1zZy0+c2V0SW50NjQoa2V5LCB2YWwpOworICAgICAgICB9CisgICAgfQorICAgIGZvciAoYXV0byYga2V5IDogQU1lZGlhRm9ybWF0S2V5R3JvdXBTdHJpbmcpIHsKKyAgICAgICAgQVN0cmluZyB2YWw7CisgICAgICAgIGlmIChnZXRTdHJpbmcoa2V5LCAmdmFsKSkgeworICAgICAgICAgICAgbXNnLT5zZXRTdHJpbmcoa2V5LCB2YWwpOworICAgICAgICB9CisgICAgfQorICAgIGZvciAoYXV0byYga2V5IDogQU1lZGlhRm9ybWF0S2V5R3JvdXBCdWZmZXIpIHsKKyAgICAgICAgdm9pZCAqZGF0YTsKKyAgICAgICAgc2l6ZV90IHNpemU7CisgICAgICAgIGlmIChnZXRCdWZmZXIoa2V5LCAmZGF0YSwgJnNpemUpKSB7CisgICAgICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoZGF0YSwgc2l6ZSk7CisgICAgICAgICAgICBtc2ctPnNldEJ1ZmZlcihrZXksIGJ1ZmZlcik7CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChhdXRvJiBrZXkgOiBBTWVkaWFGb3JtYXRLZXlHcm91cFJlY3QpIHsKKyAgICAgICAgaW50MzJfdCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b207CisgICAgICAgIGlmIChnZXRSZWN0KGtleSwgJmxlZnQsICZ0b3AsICZyaWdodCwgJmJvdHRvbSkpIHsKKyAgICAgICAgICAgIG1zZy0+c2V0UmVjdChrZXksIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChhdXRvJiBrZXkgOiBBTWVkaWFGb3JtYXRLZXlHcm91cEZsb2F0SW50MzIpIHsKKyAgICAgICAgZmxvYXQgdmFsRmxvYXQ7CisgICAgICAgIGlmIChnZXRGbG9hdChrZXksICZ2YWxGbG9hdCkpIHsKKyAgICAgICAgICAgIG1zZy0+c2V0RmxvYXQoa2V5LCB2YWxGbG9hdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQzMl90IHZhbEludDMyOworICAgICAgICAgICAgaWYgKGdldEludDMyKGtleSwgJnZhbEludDMyKSkgeworICAgICAgICAgICAgICAgIG1zZy0+c2V0RmxvYXQoa2V5LCAoZmxvYXQpdmFsSW50MzIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBtc2c7Cit9CisKK2NvbnN0IGNoYXIqIEFNZWRpYUZvcm1hdFdyYXBwZXI6OnRvU3RyaW5nKCkgY29uc3QgeworICAgIGlmIChtQU1lZGlhRm9ybWF0ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBBTWVkaWFGb3JtYXRfdG9TdHJpbmcobUFNZWRpYUZvcm1hdCk7Cit9CisKK2Jvb2wgQU1lZGlhRm9ybWF0V3JhcHBlcjo6Z2V0SW50MzIoY29uc3QgY2hhciAqbmFtZSwgaW50MzJfdCAqb3V0KSBjb25zdCB7CisgICAgaWYgKG1BTWVkaWFGb3JtYXQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUFNZWRpYUZvcm1hdCwgbmFtZSwgb3V0KTsKK30KKworYm9vbCBBTWVkaWFGb3JtYXRXcmFwcGVyOjpnZXRJbnQ2NChjb25zdCBjaGFyICpuYW1lLCBpbnQ2NF90ICpvdXQpIGNvbnN0IHsKKyAgICBpZiAobUFNZWRpYUZvcm1hdCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIEFNZWRpYUZvcm1hdF9nZXRJbnQ2NChtQU1lZGlhRm9ybWF0LCBuYW1lLCBvdXQpOworfQorCitib29sIEFNZWRpYUZvcm1hdFdyYXBwZXI6OmdldEZsb2F0KGNvbnN0IGNoYXIgKm5hbWUsIGZsb2F0ICpvdXQpIGNvbnN0IHsKKyAgICBpZiAobUFNZWRpYUZvcm1hdCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIEFNZWRpYUZvcm1hdF9nZXRGbG9hdChtQU1lZGlhRm9ybWF0LCBuYW1lLCBvdXQpOworfQorCitib29sIEFNZWRpYUZvcm1hdFdyYXBwZXI6OmdldERvdWJsZShjb25zdCBjaGFyICpuYW1lLCBkb3VibGUgKm91dCkgY29uc3QgeworICAgIGlmIChtQU1lZGlhRm9ybWF0ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gQU1lZGlhRm9ybWF0X2dldERvdWJsZShtQU1lZGlhRm9ybWF0LCBuYW1lLCBvdXQpOworfQorCitib29sIEFNZWRpYUZvcm1hdFdyYXBwZXI6OmdldFNpemUoY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90ICpvdXQpIGNvbnN0IHsKKyAgICBpZiAobUFNZWRpYUZvcm1hdCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIEFNZWRpYUZvcm1hdF9nZXRTaXplKG1BTWVkaWFGb3JtYXQsIG5hbWUsIG91dCk7Cit9CisKK2Jvb2wgQU1lZGlhRm9ybWF0V3JhcHBlcjo6Z2V0UmVjdCgKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgaW50MzJfdCAqbGVmdCwgaW50MzJfdCAqdG9wLCBpbnQzMl90ICpyaWdodCwgaW50MzJfdCAqYm90dG9tKSBjb25zdCB7CisgICAgaWYgKG1BTWVkaWFGb3JtYXQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBBTWVkaWFGb3JtYXRfZ2V0UmVjdChtQU1lZGlhRm9ybWF0LCBuYW1lLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOworfQorCitib29sIEFNZWRpYUZvcm1hdFdyYXBwZXI6OmdldEJ1ZmZlcihjb25zdCBjaGFyICpuYW1lLCB2b2lkKiogZGF0YSwgc2l6ZV90ICpvdXRTaXplKSBjb25zdCB7CisgICAgaWYgKG1BTWVkaWFGb3JtYXQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKG1BTWVkaWFGb3JtYXQsIG5hbWUsIGRhdGEsIG91dFNpemUpOworfQorCitib29sIEFNZWRpYUZvcm1hdFdyYXBwZXI6OmdldFN0cmluZyhjb25zdCBjaGFyICpuYW1lLCBBU3RyaW5nICpvdXQpIGNvbnN0IHsKKyAgICBpZiAobUFNZWRpYUZvcm1hdCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgY29uc3QgY2hhciAqb3V0Q2hhciA9IE5VTEw7CisgICAgYm9vbCByZXQgPSBBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKG1BTWVkaWFGb3JtYXQsIG5hbWUsICZvdXRDaGFyKTsKKyAgICBpZiAocmV0KSB7CisgICAgICAgICpvdXQgPSBBU3RyaW5nKG91dENoYXIpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCit2b2lkIEFNZWRpYUZvcm1hdFdyYXBwZXI6OnNldEludDMyKGNvbnN0IGNoYXIqIG5hbWUsIGludDMyX3QgdmFsdWUpIHsKKyAgICBpZiAobUFNZWRpYUZvcm1hdCAhPSBOVUxMKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtQU1lZGlhRm9ybWF0LCBuYW1lLCB2YWx1ZSk7CisgICAgfQorfQorCit2b2lkIEFNZWRpYUZvcm1hdFdyYXBwZXI6OnNldEludDY0KGNvbnN0IGNoYXIqIG5hbWUsIGludDY0X3QgdmFsdWUpIHsKKyAgICBpZiAobUFNZWRpYUZvcm1hdCAhPSBOVUxMKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtQU1lZGlhRm9ybWF0LCBuYW1lLCB2YWx1ZSk7CisgICAgfQorfQorCit2b2lkIEFNZWRpYUZvcm1hdFdyYXBwZXI6OnNldEZsb2F0KGNvbnN0IGNoYXIqIG5hbWUsIGZsb2F0IHZhbHVlKSB7CisgICAgaWYgKG1BTWVkaWFGb3JtYXQgIT0gTlVMTCkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0RmxvYXQobUFNZWRpYUZvcm1hdCwgbmFtZSwgdmFsdWUpOworICAgIH0KK30KKwordm9pZCBBTWVkaWFGb3JtYXRXcmFwcGVyOjpzZXREb3VibGUoY29uc3QgY2hhciogbmFtZSwgZG91YmxlIHZhbHVlKSB7CisgICAgaWYgKG1BTWVkaWFGb3JtYXQgIT0gTlVMTCkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0RG91YmxlKG1BTWVkaWFGb3JtYXQsIG5hbWUsIHZhbHVlKTsKKyAgICB9Cit9CisKK3ZvaWQgQU1lZGlhRm9ybWF0V3JhcHBlcjo6c2V0U2l6ZShjb25zdCBjaGFyKiBuYW1lLCBzaXplX3QgdmFsdWUpIHsKKyAgICBpZiAobUFNZWRpYUZvcm1hdCAhPSBOVUxMKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTaXplKG1BTWVkaWFGb3JtYXQsIG5hbWUsIHZhbHVlKTsKKyAgICB9Cit9CisKK3ZvaWQgQU1lZGlhRm9ybWF0V3JhcHBlcjo6c2V0UmVjdCgKKyAgICAgICAgY29uc3QgY2hhciogbmFtZSwgaW50MzJfdCBsZWZ0LCBpbnQzMl90IHRvcCwgaW50MzJfdCByaWdodCwgaW50MzJfdCBib3R0b20pIHsKKyAgICBpZiAobUFNZWRpYUZvcm1hdCAhPSBOVUxMKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRSZWN0KG1BTWVkaWFGb3JtYXQsIG5hbWUsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7CisgICAgfQorfQorCit2b2lkIEFNZWRpYUZvcm1hdFdyYXBwZXI6OnNldFN0cmluZyhjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBBU3RyaW5nICZ2YWx1ZSkgeworICAgIGlmIChtQU1lZGlhRm9ybWF0ICE9IE5VTEwpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtQU1lZGlhRm9ybWF0LCBuYW1lLCB2YWx1ZS5jX3N0cigpKTsKKyAgICB9Cit9CisKK3ZvaWQgQU1lZGlhRm9ybWF0V3JhcHBlcjo6c2V0QnVmZmVyKGNvbnN0IGNoYXIqIG5hbWUsIHZvaWQqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgaWYgKG1BTWVkaWFGb3JtYXQgIT0gTlVMTCkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1BTWVkaWFGb3JtYXQsIG5hbWUsIGRhdGEsIHNpemUpOworICAgIH0KK30KKworCisvLy8vLy8vLy8vLy8gQU5hdGl2ZVdpbmRvd1dyYXBwZXIKK0FOYXRpdmVXaW5kb3dXcmFwcGVyOjpBTmF0aXZlV2luZG93V3JhcHBlcihBTmF0aXZlV2luZG93ICphTmF0aXZlV2luZG93KQorICAgIDogbUFOYXRpdmVXaW5kb3coYU5hdGl2ZVdpbmRvdykgeworICAgIGlmIChhTmF0aXZlV2luZG93ICE9IE5VTEwpIHsKKyAgICAgICAgQU5hdGl2ZVdpbmRvd19hY3F1aXJlKGFOYXRpdmVXaW5kb3cpOworICAgIH0KK30KKworQU5hdGl2ZVdpbmRvd1dyYXBwZXI6On5BTmF0aXZlV2luZG93V3JhcHBlcigpIHsKKyAgICByZWxlYXNlKCk7Cit9CisKK3N0YXR1c190IEFOYXRpdmVXaW5kb3dXcmFwcGVyOjpyZWxlYXNlKCkgeworICAgIGlmIChtQU5hdGl2ZVdpbmRvdyAhPSBOVUxMKSB7CisgICAgICAgIEFOYXRpdmVXaW5kb3dfcmVsZWFzZShtQU5hdGl2ZVdpbmRvdyk7CisgICAgICAgIG1BTmF0aXZlV2luZG93ID0gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitBTmF0aXZlV2luZG93ICpBTmF0aXZlV2luZG93V3JhcHBlcjo6Z2V0QU5hdGl2ZVdpbmRvdygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUFOYXRpdmVXaW5kb3c7Cit9CisKKworLy8vLy8vLy8vLy8vIEFNZWRpYURybVdyYXBwZXIKK0FNZWRpYURybVdyYXBwZXI6OkFNZWRpYURybVdyYXBwZXIoY29uc3QgdWludDhfdCB1dWlkWzE2XSkgeworICAgIG1BTWVkaWFEcm0gPSBBTWVkaWFEcm1fY3JlYXRlQnlVVUlEKHV1aWQpOworfQorCitBTWVkaWFEcm1XcmFwcGVyOjpBTWVkaWFEcm1XcmFwcGVyKEFNZWRpYURybSAqYU1lZGlhRHJtKQorICAgIDogbUFNZWRpYURybShhTWVkaWFEcm0pIHsKK30KKworQU1lZGlhRHJtV3JhcHBlcjo6fkFNZWRpYURybVdyYXBwZXIoKSB7CisgICAgcmVsZWFzZSgpOworfQorCitzdGF0dXNfdCBBTWVkaWFEcm1XcmFwcGVyOjpyZWxlYXNlKCkgeworICAgIGlmIChtQU1lZGlhRHJtICE9IE5VTEwpIHsKKyAgICAgICAgQU1lZGlhRHJtX3JlbGVhc2UobUFNZWRpYURybSk7CisgICAgICAgIG1BTWVkaWFEcm0gPSBOVUxMOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK0FNZWRpYURybSAqQU1lZGlhRHJtV3JhcHBlcjo6Z2V0QU1lZGlhRHJtKCkgY29uc3QgeworICAgIHJldHVybiBtQU1lZGlhRHJtOworfQorCisvLyBzdGF0aWMKK2Jvb2wgQU1lZGlhRHJtV3JhcHBlcjo6aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sCisgICAgICAgIGNvbnN0IGNoYXIgKm1pbWVUeXBlKSB7CisgICAgcmV0dXJuIEFNZWRpYURybV9pc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkLCBtaW1lVHlwZSk7Cit9CisKKworLy8vLy8vLy8vLy8vIEFNZWRpYUNyeXB0b1dyYXBwZXIKK0FNZWRpYUNyeXB0b1dyYXBwZXI6OkFNZWRpYUNyeXB0b1dyYXBwZXIoCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IHZvaWQgKmluaXREYXRhLCBzaXplX3QgaW5pdERhdGFTaXplKSB7CisgICAgbUFNZWRpYUNyeXB0byA9IEFNZWRpYUNyeXB0b19uZXcodXVpZCwgaW5pdERhdGEsIGluaXREYXRhU2l6ZSk7Cit9CisKK0FNZWRpYUNyeXB0b1dyYXBwZXI6OkFNZWRpYUNyeXB0b1dyYXBwZXIoQU1lZGlhQ3J5cHRvICphTWVkaWFDcnlwdG8pCisgICAgOiBtQU1lZGlhQ3J5cHRvKGFNZWRpYUNyeXB0bykgeworfQorCitBTWVkaWFDcnlwdG9XcmFwcGVyOjp+QU1lZGlhQ3J5cHRvV3JhcHBlcigpIHsKKyAgICByZWxlYXNlKCk7Cit9CisKK3N0YXR1c190IEFNZWRpYUNyeXB0b1dyYXBwZXI6OnJlbGVhc2UoKSB7CisgICAgaWYgKG1BTWVkaWFDcnlwdG8gIT0gTlVMTCkgeworICAgICAgICBBTWVkaWFDcnlwdG9fZGVsZXRlKG1BTWVkaWFDcnlwdG8pOworICAgICAgICBtQU1lZGlhQ3J5cHRvID0gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitBTWVkaWFDcnlwdG8gKkFNZWRpYUNyeXB0b1dyYXBwZXI6OmdldEFNZWRpYUNyeXB0bygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUFNZWRpYUNyeXB0bzsKK30KKworYm9vbCBBTWVkaWFDcnlwdG9XcmFwcGVyOjppc0NyeXB0b1NjaGVtZVN1cHBvcnRlZChjb25zdCB1aW50OF90IHV1aWRbMTZdKSB7CisgICAgaWYgKG1BTWVkaWFDcnlwdG8gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBBTWVkaWFDcnlwdG9faXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCk7Cit9CisKK2Jvb2wgQU1lZGlhQ3J5cHRvV3JhcHBlcjo6cmVxdWlyZXNTZWN1cmVEZWNvZGVyQ29tcG9uZW50KGNvbnN0IGNoYXIgKm1pbWUpIHsKKyAgICBpZiAobUFNZWRpYUNyeXB0byA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIEFNZWRpYUNyeXB0b19yZXF1aXJlc1NlY3VyZURlY29kZXJDb21wb25lbnQobWltZSk7Cit9CisKKworLy8vLy8vLy8vLy8vIEFNZWRpYUNvZGVjQ3J5cHRvSW5mb1dyYXBwZXIKKy8vIHN0YXRpYworc3A8QU1lZGlhQ29kZWNDcnlwdG9JbmZvV3JhcHBlcj4gQU1lZGlhQ29kZWNDcnlwdG9JbmZvV3JhcHBlcjo6Q3JlYXRlKHNwPE1ldGFEYXRhPiBtZXRhKSB7CisgICAgaWYgKG1ldGEgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiQ3JlYXRlOiBVbmV4cGVjdGVkLiBObyBtZXRhIGRhdGEgZm9yIHNhbXBsZS4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgdWludDMyX3QgdHlwZTsKKyAgICBjb25zdCB2b2lkICpjcnlwdGVkZGF0YTsKKyAgICBzaXplX3QgY3J5cHRlZHNpemU7CisKKyAgICBpZiAoIW1ldGEtPmZpbmREYXRhKGtLZXlFbmNyeXB0ZWRTaXplcywgJnR5cGUsICZjcnlwdGVkZGF0YSwgJmNyeXB0ZWRzaXplKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpbnQgbnVtU3ViU2FtcGxlcyA9IGNyeXB0ZWRzaXplIC8gc2l6ZW9mKHNpemVfdCk7CisKKyAgICBpZiAobnVtU3ViU2FtcGxlcyA8PSAwKSB7CisgICAgICAgIEFMT0dFKCJDcmVhdGU6IElOVkFMSUQgbnVtU3ViU2FtcGxlczogJWQiLCBudW1TdWJTYW1wbGVzKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgY29uc3Qgdm9pZCAqY2xlYXJkYXRhOworICAgIHNpemVfdCBjbGVhcnNpemU7CisgICAgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlQbGFpblNpemVzLCAmdHlwZSwgJmNsZWFyZGF0YSwgJmNsZWFyc2l6ZSkpIHsKKyAgICAgICAgaWYgKGNsZWFyc2l6ZSAhPSBjcnlwdGVkc2l6ZSkgeworICAgICAgICAgICAgLy8gVGhlIHR3byBtdXN0IGJlIG9mIHRoZSBzYW1lIGxlbmd0aC4KKyAgICAgICAgICAgIEFMT0dFKCJDcmVhdGU6IG1pc21hdGNoIGNyeXB0ZWRzaXplOiAlenUgIT0gY2xlYXJzaXplOiAlenUiLCBjcnlwdGVkc2l6ZSwgY2xlYXJzaXplKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgY29uc3Qgdm9pZCAqa2V5OworICAgIHNpemVfdCBrZXlzaXplOworICAgIGlmIChtZXRhLT5maW5kRGF0YShrS2V5Q3J5cHRvS2V5LCAmdHlwZSwgJmtleSwgJmtleXNpemUpKSB7CisgICAgICAgIGlmIChrZXlzaXplICE9IGtBRVNCbG9ja1NpemUpIHsKKyAgICAgICAgICAgIC8vIEtleXMgbXVzdCBiZSAxNiBieXRlcyBpbiBsZW5ndGguCisgICAgICAgICAgICBBTE9HRSgiQ3JlYXRlOiBLZXlzIG11c3QgYmUgJXp1IGJ5dGVzIGluIGxlbmd0aDogJXp1Iiwga0FFU0Jsb2NrU2l6ZSwga2V5c2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNvbnN0IHZvaWQgKml2OworICAgIHNpemVfdCBpdnNpemU7CisgICAgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlDcnlwdG9JViwgJnR5cGUsICZpdiwgJml2c2l6ZSkpIHsKKyAgICAgICAgaWYgKGl2c2l6ZSAhPSBrQUVTQmxvY2tTaXplKSB7CisgICAgICAgICAgICAvLyBJVnMgbXVzdCBiZSAxNiBieXRlcyBpbiBsZW5ndGguCisgICAgICAgICAgICBBTE9HRSgiQ3JlYXRlOiBJViBtdXN0IGJlICV6dSBieXRlcyBpbiBsZW5ndGg6ICV6dSIsIGtBRVNCbG9ja1NpemUsIGl2c2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGludDMyX3QgbW9kZTsKKyAgICBpZiAoIW1ldGEtPmZpbmRJbnQzMihrS2V5Q3J5cHRvTW9kZSwgJm1vZGUpKSB7CisgICAgICAgIG1vZGUgPSBDcnlwdG9QbHVnaW46OmtNb2RlX0FFU19DVFI7CisgICAgfQorCisgICAgcmV0dXJuIG5ldyBBTWVkaWFDb2RlY0NyeXB0b0luZm9XcmFwcGVyKAorICAgICAgICAgICAgbnVtU3ViU2FtcGxlcywKKyAgICAgICAgICAgICh1aW50OF90Kikga2V5LAorICAgICAgICAgICAgKHVpbnQ4X3QqKSBpdiwKKyAgICAgICAgICAgIChDcnlwdG9QbHVnaW46Ok1vZGUpbW9kZSwKKyAgICAgICAgICAgIChzaXplX3QqKSBjbGVhcmRhdGEsCisgICAgICAgICAgICAoc2l6ZV90KikgY3J5cHRlZGRhdGEpOworfQorCitBTWVkaWFDb2RlY0NyeXB0b0luZm9XcmFwcGVyOjpBTWVkaWFDb2RlY0NyeXB0b0luZm9XcmFwcGVyKAorICAgICAgICBpbnQgbnVtc3Vic2FtcGxlcywKKyAgICAgICAgdWludDhfdCBrZXlbMTZdLAorICAgICAgICB1aW50OF90IGl2WzE2XSwKKyAgICAgICAgQ3J5cHRvUGx1Z2luOjpNb2RlIG1vZGUsCisgICAgICAgIHNpemVfdCAqY2xlYXJieXRlcywKKyAgICAgICAgc2l6ZV90ICplbmNyeXB0ZWRieXRlcykgeworICAgIG1BTWVkaWFDb2RlY0NyeXB0b0luZm8gPQorICAgICAgICBBTWVkaWFDb2RlY0NyeXB0b0luZm9fbmV3KG51bXN1YnNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZVRvQ3J5cHRvSW5mb01vZGUobW9kZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0ZWRieXRlcyk7Cit9CisKK0FNZWRpYUNvZGVjQ3J5cHRvSW5mb1dyYXBwZXI6OkFNZWRpYUNvZGVjQ3J5cHRvSW5mb1dyYXBwZXIoCisgICAgICAgIEFNZWRpYUNvZGVjQ3J5cHRvSW5mbyAqYU1lZGlhQ29kZWNDcnlwdG9JbmZvKQorICAgIDogbUFNZWRpYUNvZGVjQ3J5cHRvSW5mbyhhTWVkaWFDb2RlY0NyeXB0b0luZm8pIHsKK30KKworQU1lZGlhQ29kZWNDcnlwdG9JbmZvV3JhcHBlcjo6fkFNZWRpYUNvZGVjQ3J5cHRvSW5mb1dyYXBwZXIoKSB7CisgICAgcmVsZWFzZSgpOworfQorCitzdGF0dXNfdCBBTWVkaWFDb2RlY0NyeXB0b0luZm9XcmFwcGVyOjpyZWxlYXNlKCkgeworICAgIGlmIChtQU1lZGlhQ29kZWNDcnlwdG9JbmZvICE9IE5VTEwpIHsKKyAgICAgICAgbWVkaWFfc3RhdHVzX3QgZXJyID0gQU1lZGlhQ29kZWNDcnlwdG9JbmZvX2RlbGV0ZShtQU1lZGlhQ29kZWNDcnlwdG9JbmZvKTsKKyAgICAgICAgbUFNZWRpYUNvZGVjQ3J5cHRvSW5mbyA9IE5VTEw7CisgICAgICAgIHJldHVybiB0cmFuc2xhdGVFcnJvckNvZGUoZXJyKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitBTWVkaWFDb2RlY0NyeXB0b0luZm8gKkFNZWRpYUNvZGVjQ3J5cHRvSW5mb1dyYXBwZXI6OmdldEFNZWRpYUNvZGVjQ3J5cHRvSW5mbygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUFNZWRpYUNvZGVjQ3J5cHRvSW5mbzsKK30KKwordm9pZCBBTWVkaWFDb2RlY0NyeXB0b0luZm9XcmFwcGVyOjpzZXRQYXR0ZXJuKENyeXB0b1BsdWdpbjo6UGF0dGVybiAqcGF0dGVybikgeworICAgIGlmIChtQU1lZGlhQ29kZWNDcnlwdG9JbmZvID09IE5VTEwgfHwgcGF0dGVybiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY3J5cHRvaW5mb19wYXR0ZXJuX3QgbmRrUGF0dGVybiA9IHsoaW50MzJfdClwYXR0ZXJuLT5tRW5jcnlwdEJsb2NrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KXBhdHRlcm4tPm1Ta2lwQmxvY2tzIH07CisgICAgcmV0dXJuIEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19zZXRQYXR0ZXJuKG1BTWVkaWFDb2RlY0NyeXB0b0luZm8sICZuZGtQYXR0ZXJuKTsKK30KKworc2l6ZV90IEFNZWRpYUNvZGVjQ3J5cHRvSW5mb1dyYXBwZXI6OmdldE51bVN1YlNhbXBsZXMoKSB7CisgICAgaWYgKG1BTWVkaWFDb2RlY0NyeXB0b0luZm8gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19nZXROdW1TdWJTYW1wbGVzKG1BTWVkaWFDb2RlY0NyeXB0b0luZm8pOworfQorCitzdGF0dXNfdCBBTWVkaWFDb2RlY0NyeXB0b0luZm9XcmFwcGVyOjpnZXRLZXkodWludDhfdCAqZHN0KSB7CisgICAgaWYgKG1BTWVkaWFDb2RlY0NyeXB0b0luZm8gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIGlmIChkc3QgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICByZXR1cm4gdHJhbnNsYXRlRXJyb3JDb2RlKAorICAgICAgICBBTWVkaWFDb2RlY0NyeXB0b0luZm9fZ2V0S2V5KG1BTWVkaWFDb2RlY0NyeXB0b0luZm8sIGRzdCkpOworfQorCitzdGF0dXNfdCBBTWVkaWFDb2RlY0NyeXB0b0luZm9XcmFwcGVyOjpnZXRJVih1aW50OF90ICpkc3QpIHsKKyAgICBpZiAobUFNZWRpYUNvZGVjQ3J5cHRvSW5mbyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgaWYgKGRzdCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHJldHVybiB0cmFuc2xhdGVFcnJvckNvZGUoCisgICAgICAgIEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19nZXRJVihtQU1lZGlhQ29kZWNDcnlwdG9JbmZvLCBkc3QpKTsKK30KKworQ3J5cHRvUGx1Z2luOjpNb2RlIEFNZWRpYUNvZGVjQ3J5cHRvSW5mb1dyYXBwZXI6OmdldE1vZGUoKSB7CisgICAgaWYgKG1BTWVkaWFDb2RlY0NyeXB0b0luZm8gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQ3J5cHRvUGx1Z2luOjprTW9kZV9VbmVuY3J5cHRlZDsKKyAgICB9CisgICAgcmV0dXJuIHRyYW5zbGF0ZVRvQ3J5cHRvUGx1Z2luTW9kZSgKKyAgICAgICAgQU1lZGlhQ29kZWNDcnlwdG9JbmZvX2dldE1vZGUobUFNZWRpYUNvZGVjQ3J5cHRvSW5mbykpOworfQorCitzdGF0dXNfdCBBTWVkaWFDb2RlY0NyeXB0b0luZm9XcmFwcGVyOjpnZXRDbGVhckJ5dGVzKHNpemVfdCAqZHN0KSB7CisgICAgaWYgKG1BTWVkaWFDb2RlY0NyeXB0b0luZm8gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIGlmIChkc3QgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICByZXR1cm4gdHJhbnNsYXRlRXJyb3JDb2RlKAorICAgICAgICBBTWVkaWFDb2RlY0NyeXB0b0luZm9fZ2V0Q2xlYXJCeXRlcyhtQU1lZGlhQ29kZWNDcnlwdG9JbmZvLCBkc3QpKTsKK30KKworc3RhdHVzX3QgQU1lZGlhQ29kZWNDcnlwdG9JbmZvV3JhcHBlcjo6Z2V0RW5jcnlwdGVkQnl0ZXMoc2l6ZV90ICpkc3QpIHsKKyAgICBpZiAobUFNZWRpYUNvZGVjQ3J5cHRvSW5mbyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgaWYgKGRzdCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHJldHVybiB0cmFuc2xhdGVFcnJvckNvZGUoCisgICAgICAgIEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19nZXRFbmNyeXB0ZWRCeXRlcyhtQU1lZGlhQ29kZWNDcnlwdG9JbmZvLCBkc3QpKTsKK30KKworCisvLy8vLy8vLy8vLy8gQU1lZGlhQ29kZWNXcmFwcGVyCisvLyBzdGF0aWMKK3NwPEFNZWRpYUNvZGVjV3JhcHBlcj4gQU1lZGlhQ29kZWNXcmFwcGVyOjpDcmVhdGVDb2RlY0J5TmFtZShjb25zdCBBU3RyaW5nICZuYW1lKSB7CisgICAgQU1lZGlhQ29kZWMgKmFNZWRpYUNvZGVjID0gQU1lZGlhQ29kZWNfY3JlYXRlQ29kZWNCeU5hbWUobmFtZS5jX3N0cigpKTsKKyAgICByZXR1cm4gbmV3IEFNZWRpYUNvZGVjV3JhcHBlcihhTWVkaWFDb2RlYyk7Cit9CisKKy8vIHN0YXRpYworc3A8QU1lZGlhQ29kZWNXcmFwcGVyPiBBTWVkaWFDb2RlY1dyYXBwZXI6OkNyZWF0ZURlY29kZXJCeVR5cGUoY29uc3QgQVN0cmluZyAmbWltZVR5cGUpIHsKKyAgICBBTWVkaWFDb2RlYyAqYU1lZGlhQ29kZWMgPSBBTWVkaWFDb2RlY19jcmVhdGVEZWNvZGVyQnlUeXBlKG1pbWVUeXBlLmNfc3RyKCkpOworICAgIHJldHVybiBuZXcgQU1lZGlhQ29kZWNXcmFwcGVyKGFNZWRpYUNvZGVjKTsKK30KKworLy8gc3RhdGljCit2b2lkIEFNZWRpYUNvZGVjV3JhcHBlcjo6T25JbnB1dEF2YWlsYWJsZUNCKAorICAgICAgICBBTWVkaWFDb2RlYyAqIC8qIGFNZWRpYUNvZGVjICovLAorICAgICAgICB2b2lkICp1c2VyZGF0YSwKKyAgICAgICAgaW50MzJfdCBpbmRleCkgeworICAgIEFMT0dWKCJPbklucHV0QXZhaWxhYmxlQ0I6IGluZGV4KCVkKSIsIGluZGV4KTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gc3A8QU1lc3NhZ2U+KChBTWVzc2FnZSAqKXVzZXJkYXRhKS0+ZHVwKCk7CisgICAgbXNnLT5zZXRJbnQzMigiY2FsbGJhY2tJRCIsIENCX0lOUFVUX0FWQUlMQUJMRSk7CisgICAgbXNnLT5zZXRJbnQzMigiaW5kZXgiLCBpbmRleCk7CisgICAgbXNnLT5wb3N0KCk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBBTWVkaWFDb2RlY1dyYXBwZXI6Ok9uT3V0cHV0QXZhaWxhYmxlQ0IoCisgICAgICAgIEFNZWRpYUNvZGVjICogLyogYU1lZGlhQ29kZWMgKi8sCisgICAgICAgIHZvaWQgKnVzZXJkYXRhLAorICAgICAgICBpbnQzMl90IGluZGV4LAorICAgICAgICBBTWVkaWFDb2RlY0J1ZmZlckluZm8gKmJ1ZmZlckluZm8pIHsKKyAgICBBTE9HVigiT25PdXRwdXRBdmFpbGFibGVDQjogaW5kZXgoJWQpLCAoJWQsICVkLCAlbGxkLCAweCV4KSIsCisgICAgICAgICAgaW5kZXgsIGJ1ZmZlckluZm8tPm9mZnNldCwgYnVmZmVySW5mby0+c2l6ZSwKKyAgICAgICAgICAobG9uZyBsb25nKWJ1ZmZlckluZm8tPnByZXNlbnRhdGlvblRpbWVVcywgYnVmZmVySW5mby0+ZmxhZ3MpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBzcDxBTWVzc2FnZT4oKEFNZXNzYWdlICopdXNlcmRhdGEpLT5kdXAoKTsKKyAgICBtc2ctPnNldEludDMyKCJjYWxsYmFja0lEIiwgQ0JfT1VUUFVUX0FWQUlMQUJMRSk7CisgICAgbXNnLT5zZXRJbnQzMigiaW5kZXgiLCBpbmRleCk7CisgICAgbXNnLT5zZXRTaXplKCJvZmZzZXQiLCAoc2l6ZV90KShidWZmZXJJbmZvLT5vZmZzZXQpKTsKKyAgICBtc2ctPnNldFNpemUoInNpemUiLCAoc2l6ZV90KShidWZmZXJJbmZvLT5zaXplKSk7CisgICAgbXNnLT5zZXRJbnQ2NCgidGltZVVzIiwgYnVmZmVySW5mby0+cHJlc2VudGF0aW9uVGltZVVzKTsKKyAgICBtc2ctPnNldEludDMyKCJmbGFncyIsIChpbnQzMl90KShidWZmZXJJbmZvLT5mbGFncykpOworICAgIG1zZy0+cG9zdCgpOworfQorCisvLyBzdGF0aWMKK3ZvaWQgQU1lZGlhQ29kZWNXcmFwcGVyOjpPbkZvcm1hdENoYW5nZWRDQigKKyAgICAgICAgQU1lZGlhQ29kZWMgKiAvKiBhTWVkaWFDb2RlYyAqLywKKyAgICAgICAgdm9pZCAqdXNlcmRhdGEsCisgICAgICAgIEFNZWRpYUZvcm1hdCAqZm9ybWF0KSB7CisgICAgc3A8QU1lZGlhRm9ybWF0V3JhcHBlcj4gZm9ybWF0V3JhcHBlciA9IG5ldyBBTWVkaWFGb3JtYXRXcmFwcGVyKGZvcm1hdCk7CisgICAgc3A8QU1lc3NhZ2U+IG91dHB1dEZvcm1hdCA9IGZvcm1hdFdyYXBwZXItPnRvQU1lc3NhZ2UoKTsKKyAgICBBTE9HVigiT25Gb3JtYXRDaGFuZ2VkQ0I6IGZvcm1hdCglcykiLCBvdXRwdXRGb3JtYXQtPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7CisKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gc3A8QU1lc3NhZ2U+KChBTWVzc2FnZSAqKXVzZXJkYXRhKS0+ZHVwKCk7CisgICAgbXNnLT5zZXRJbnQzMigiY2FsbGJhY2tJRCIsIENCX09VVFBVVF9GT1JNQVRfQ0hBTkdFRCk7CisgICAgbXNnLT5zZXRNZXNzYWdlKCJmb3JtYXQiLCBvdXRwdXRGb3JtYXQpOworICAgIG1zZy0+cG9zdCgpOworfQorCisvLyBzdGF0aWMKK3ZvaWQgQU1lZGlhQ29kZWNXcmFwcGVyOjpPbkVycm9yQ0IoCisgICAgICAgIEFNZWRpYUNvZGVjICogLyogYU1lZGlhQ29kZWMgKi8sCisgICAgICAgIHZvaWQgKnVzZXJkYXRhLAorICAgICAgICBtZWRpYV9zdGF0dXNfdCBlcnIsCisgICAgICAgIGludDMyX3QgYWN0aW9uQ29kZSwKKyAgICAgICAgY29uc3QgY2hhciAqZGV0YWlsKSB7CisgICAgQUxPR1YoIk9uRXJyb3JDQjogZXJyKCVkKSwgYWN0aW9uQ29kZSglZCksIGRldGFpbCglcykiLCBlcnIsIGFjdGlvbkNvZGUsIGRldGFpbCk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IHNwPEFNZXNzYWdlPigoQU1lc3NhZ2UgKil1c2VyZGF0YSktPmR1cCgpOworICAgIG1zZy0+c2V0SW50MzIoImNhbGxiYWNrSUQiLCBDQl9FUlJPUik7CisgICAgbXNnLT5zZXRJbnQzMigiZXJyIiwgdHJhbnNsYXRlRXJyb3JDb2RlKGVycikpOworICAgIG1zZy0+c2V0SW50MzIoImFjdGlvbkNvZGUiLCB0cmFuc2xhdGVBY3Rpb25Db2RlKGFjdGlvbkNvZGUpKTsKKyAgICBtc2ctPnNldFN0cmluZygiZGV0YWlsIiwgZGV0YWlsKTsKKyAgICBtc2ctPnBvc3QoKTsKK30KKworQU1lZGlhQ29kZWNXcmFwcGVyOjpBTWVkaWFDb2RlY1dyYXBwZXIoQU1lZGlhQ29kZWMgKmFNZWRpYUNvZGVjKQorICAgIDogbUFNZWRpYUNvZGVjKGFNZWRpYUNvZGVjKSB7Cit9CisKK0FNZWRpYUNvZGVjV3JhcHBlcjo6fkFNZWRpYUNvZGVjV3JhcHBlcigpIHsKKyAgICByZWxlYXNlKCk7Cit9CisKK3N0YXR1c190IEFNZWRpYUNvZGVjV3JhcHBlcjo6cmVsZWFzZSgpIHsKKyAgICBpZiAobUFNZWRpYUNvZGVjICE9IE5VTEwpIHsKKyAgICAgICAgQU1lZGlhQ29kZWNPbkFzeW5jTm90aWZ5Q2FsbGJhY2sgYUNCID0ge307CisgICAgICAgIEFNZWRpYUNvZGVjX3NldEFzeW5jTm90aWZ5Q2FsbGJhY2sobUFNZWRpYUNvZGVjLCBhQ0IsIE5VTEwpOworICAgICAgICBtQ2FsbGJhY2sgPSBOVUxMOworCisgICAgICAgIG1lZGlhX3N0YXR1c190IGVyciA9IEFNZWRpYUNvZGVjX2RlbGV0ZShtQU1lZGlhQ29kZWMpOworICAgICAgICBtQU1lZGlhQ29kZWMgPSBOVUxMOworICAgICAgICByZXR1cm4gdHJhbnNsYXRlRXJyb3JDb2RlKGVycik7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworQU1lZGlhQ29kZWMgKkFNZWRpYUNvZGVjV3JhcHBlcjo6Z2V0QU1lZGlhQ29kZWMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1BTWVkaWFDb2RlYzsKK30KKworc3RhdHVzX3QgQU1lZGlhQ29kZWNXcmFwcGVyOjpnZXROYW1lKEFTdHJpbmcgKm91dENvbXBvbmVudE5hbWUpIGNvbnN0IHsKKyAgICBpZiAobUFNZWRpYUNvZGVjID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICBjaGFyICpuYW1lID0gTlVMTDsKKyAgICBtZWRpYV9zdGF0dXNfdCBlcnIgPSBBTWVkaWFDb2RlY19nZXROYW1lKG1BTWVkaWFDb2RlYywgJm5hbWUpOworICAgIGlmIChlcnIgIT0gQU1FRElBX09LKSB7CisgICAgICAgIHJldHVybiB0cmFuc2xhdGVFcnJvckNvZGUoZXJyKTsKKyAgICB9CisKKyAgICAqb3V0Q29tcG9uZW50TmFtZSA9IEFTdHJpbmcobmFtZSk7CisgICAgQU1lZGlhQ29kZWNfcmVsZWFzZU5hbWUobUFNZWRpYUNvZGVjLCBuYW1lKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEFNZWRpYUNvZGVjV3JhcHBlcjo6Y29uZmlndXJlKAorICAgIGNvbnN0IHNwPEFNZWRpYUZvcm1hdFdyYXBwZXI+ICZmb3JtYXQsCisgICAgY29uc3Qgc3A8QU5hdGl2ZVdpbmRvd1dyYXBwZXI+ICZud3csCisgICAgY29uc3Qgc3A8QU1lZGlhQ3J5cHRvV3JhcHBlcj4gJmNyeXB0bywKKyAgICB1aW50MzJfdCBmbGFncykgeworICAgIGlmIChtQU1lZGlhQ29kZWMgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorCisgICAgbWVkaWFfc3RhdHVzX3QgZXJyID0gQU1lZGlhQ29kZWNfY29uZmlndXJlKAorICAgICAgICAgICAgbUFNZWRpYUNvZGVjLAorICAgICAgICAgICAgZm9ybWF0LT5nZXRBTWVkaWFGb3JtYXQoKSwKKyAgICAgICAgICAgIChud3cgPT0gTlVMTCA/IE5VTEwgOiBud3ctPmdldEFOYXRpdmVXaW5kb3coKSksCisgICAgICAgICAgICBjcnlwdG8gPT0gTlVMTCA/IE5VTEwgOiBjcnlwdG8tPmdldEFNZWRpYUNyeXB0bygpLAorICAgICAgICAgICAgZmxhZ3MpOworCisgICAgcmV0dXJuIHRyYW5zbGF0ZUVycm9yQ29kZShlcnIpOworfQorCitzdGF0dXNfdCBBTWVkaWFDb2RlY1dyYXBwZXI6OnNldENhbGxiYWNrKGNvbnN0IHNwPEFNZXNzYWdlPiAmY2FsbGJhY2spIHsKKyAgICBpZiAobUFNZWRpYUNvZGVjID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKworICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOworCisgICAgQU1lZGlhQ29kZWNPbkFzeW5jTm90aWZ5Q2FsbGJhY2sgYUNCID0geworICAgICAgICBPbklucHV0QXZhaWxhYmxlQ0IsCisgICAgICAgIE9uT3V0cHV0QXZhaWxhYmxlQ0IsCisgICAgICAgIE9uRm9ybWF0Q2hhbmdlZENCLAorICAgICAgICBPbkVycm9yQ0IKKyAgICB9OworCisgICAgcmV0dXJuIHRyYW5zbGF0ZUVycm9yQ29kZSgKKyAgICAgICAgICAgIEFNZWRpYUNvZGVjX3NldEFzeW5jTm90aWZ5Q2FsbGJhY2sobUFNZWRpYUNvZGVjLCBhQ0IsIGNhbGxiYWNrLmdldCgpKSk7Cit9CisKK3N0YXR1c190IEFNZWRpYUNvZGVjV3JhcHBlcjo6cmVsZWFzZUNyeXB0bygpIHsKKyAgICBpZiAobUFNZWRpYUNvZGVjID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICByZXR1cm4gdHJhbnNsYXRlRXJyb3JDb2RlKEFNZWRpYUNvZGVjX3JlbGVhc2VDcnlwdG8obUFNZWRpYUNvZGVjKSk7Cit9CisKK3N0YXR1c190IEFNZWRpYUNvZGVjV3JhcHBlcjo6c3RhcnQoKSB7CisgICAgaWYgKG1BTWVkaWFDb2RlYyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgcmV0dXJuIHRyYW5zbGF0ZUVycm9yQ29kZShBTWVkaWFDb2RlY19zdGFydChtQU1lZGlhQ29kZWMpKTsKK30KKworc3RhdHVzX3QgQU1lZGlhQ29kZWNXcmFwcGVyOjpzdG9wKCkgeworICAgIGlmIChtQU1lZGlhQ29kZWMgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIHJldHVybiB0cmFuc2xhdGVFcnJvckNvZGUoQU1lZGlhQ29kZWNfc3RvcChtQU1lZGlhQ29kZWMpKTsKK30KKworc3RhdHVzX3QgQU1lZGlhQ29kZWNXcmFwcGVyOjpmbHVzaCgpIHsKKyAgICBpZiAobUFNZWRpYUNvZGVjID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICByZXR1cm4gdHJhbnNsYXRlRXJyb3JDb2RlKEFNZWRpYUNvZGVjX2ZsdXNoKG1BTWVkaWFDb2RlYykpOworfQorCit1aW50OF90KiBBTWVkaWFDb2RlY1dyYXBwZXI6OmdldElucHV0QnVmZmVyKHNpemVfdCBpZHgsIHNpemVfdCAqb3V0X3NpemUpIHsKKyAgICBpZiAobUFNZWRpYUNvZGVjID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBBTWVkaWFDb2RlY19nZXRJbnB1dEJ1ZmZlcihtQU1lZGlhQ29kZWMsIGlkeCwgb3V0X3NpemUpOworfQorCit1aW50OF90KiBBTWVkaWFDb2RlY1dyYXBwZXI6OmdldE91dHB1dEJ1ZmZlcihzaXplX3QgaWR4LCBzaXplX3QgKm91dF9zaXplKSB7CisgICAgaWYgKG1BTWVkaWFDb2RlYyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gQU1lZGlhQ29kZWNfZ2V0T3V0cHV0QnVmZmVyKG1BTWVkaWFDb2RlYywgaWR4LCBvdXRfc2l6ZSk7Cit9CisKK3N0YXR1c190IEFNZWRpYUNvZGVjV3JhcHBlcjo6cXVldWVJbnB1dEJ1ZmZlcigKKyAgICAgICAgc2l6ZV90IGlkeCwKKyAgICAgICAgc2l6ZV90IG9mZnNldCwKKyAgICAgICAgc2l6ZV90IHNpemUsCisgICAgICAgIHVpbnQ2NF90IHRpbWUsCisgICAgICAgIHVpbnQzMl90IGZsYWdzKSB7CisgICAgaWYgKG1BTWVkaWFDb2RlYyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgcmV0dXJuIHRyYW5zbGF0ZUVycm9yQ29kZSgKKyAgICAgICAgQU1lZGlhQ29kZWNfcXVldWVJbnB1dEJ1ZmZlcihtQU1lZGlhQ29kZWMsIGlkeCwgb2Zmc2V0LCBzaXplLCB0aW1lLCBmbGFncykpOworfQorCitzdGF0dXNfdCBBTWVkaWFDb2RlY1dyYXBwZXI6OnF1ZXVlU2VjdXJlSW5wdXRCdWZmZXIoCisgICAgICAgIHNpemVfdCBpZHgsCisgICAgICAgIHNpemVfdCBvZmZzZXQsCisgICAgICAgIHNwPEFNZWRpYUNvZGVjQ3J5cHRvSW5mb1dyYXBwZXI+ICZjb2RlY0NyeXB0b0luZm8sCisgICAgICAgIHVpbnQ2NF90IHRpbWUsCisgICAgICAgIHVpbnQzMl90IGZsYWdzKSB7CisgICAgaWYgKG1BTWVkaWFDb2RlYyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgcmV0dXJuIHRyYW5zbGF0ZUVycm9yQ29kZSgKKyAgICAgICAgQU1lZGlhQ29kZWNfcXVldWVTZWN1cmVJbnB1dEJ1ZmZlcigKKyAgICAgICAgICAgIG1BTWVkaWFDb2RlYywKKyAgICAgICAgICAgIGlkeCwKKyAgICAgICAgICAgIG9mZnNldCwKKyAgICAgICAgICAgIGNvZGVjQ3J5cHRvSW5mby0+Z2V0QU1lZGlhQ29kZWNDcnlwdG9JbmZvKCksCisgICAgICAgICAgICB0aW1lLAorICAgICAgICAgICAgZmxhZ3MpKTsKK30KKworc3A8QU1lZGlhRm9ybWF0V3JhcHBlcj4gQU1lZGlhQ29kZWNXcmFwcGVyOjpnZXRPdXRwdXRGb3JtYXQoKSB7CisgICAgaWYgKG1BTWVkaWFDb2RlYyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gbmV3IEFNZWRpYUZvcm1hdFdyYXBwZXIoQU1lZGlhQ29kZWNfZ2V0T3V0cHV0Rm9ybWF0KG1BTWVkaWFDb2RlYykpOworfQorCitzcDxBTWVkaWFGb3JtYXRXcmFwcGVyPiBBTWVkaWFDb2RlY1dyYXBwZXI6OmdldElucHV0Rm9ybWF0KCkgeworICAgIGlmIChtQU1lZGlhQ29kZWMgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBBTWVkaWFGb3JtYXRXcmFwcGVyKEFNZWRpYUNvZGVjX2dldElucHV0Rm9ybWF0KG1BTWVkaWFDb2RlYykpOworfQorCitzdGF0dXNfdCBBTWVkaWFDb2RlY1dyYXBwZXI6OnJlbGVhc2VPdXRwdXRCdWZmZXIoc2l6ZV90IGlkeCwgYm9vbCByZW5kZXIpIHsKKyAgICBpZiAobUFNZWRpYUNvZGVjID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICByZXR1cm4gdHJhbnNsYXRlRXJyb3JDb2RlKAorICAgICAgICBBTWVkaWFDb2RlY19yZWxlYXNlT3V0cHV0QnVmZmVyKG1BTWVkaWFDb2RlYywgaWR4LCByZW5kZXIpKTsKK30KKworc3RhdHVzX3QgQU1lZGlhQ29kZWNXcmFwcGVyOjpzZXRPdXRwdXRTdXJmYWNlKGNvbnN0IHNwPEFOYXRpdmVXaW5kb3dXcmFwcGVyPiAmbnd3KSB7CisgICAgaWYgKG1BTWVkaWFDb2RlYyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgcmV0dXJuIHRyYW5zbGF0ZUVycm9yQ29kZSgKKyAgICAgICAgQU1lZGlhQ29kZWNfc2V0T3V0cHV0U3VyZmFjZShtQU1lZGlhQ29kZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG53dyA9PSBOVUxMID8gTlVMTCA6IG53dy0+Z2V0QU5hdGl2ZVdpbmRvdygpKSkpOworfQorCitzdGF0dXNfdCBBTWVkaWFDb2RlY1dyYXBwZXI6OnJlbGVhc2VPdXRwdXRCdWZmZXJBdFRpbWUoc2l6ZV90IGlkeCwgaW50NjRfdCB0aW1lc3RhbXBOcykgeworICAgIGlmIChtQU1lZGlhQ29kZWMgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIHJldHVybiB0cmFuc2xhdGVFcnJvckNvZGUoCisgICAgICAgIEFNZWRpYUNvZGVjX3JlbGVhc2VPdXRwdXRCdWZmZXJBdFRpbWUobUFNZWRpYUNvZGVjLCBpZHgsIHRpbWVzdGFtcE5zKSk7Cit9CisKK3N0YXR1c190IEFNZWRpYUNvZGVjV3JhcHBlcjo6c2V0UGFyYW1ldGVycyhjb25zdCBzcDxBTWVkaWFGb3JtYXRXcmFwcGVyPiAmcGFyYW1zKSB7CisgICAgaWYgKG1BTWVkaWFDb2RlYyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgcmV0dXJuIHRyYW5zbGF0ZUVycm9yQ29kZSgKKyAgICAgICAgQU1lZGlhQ29kZWNfc2V0UGFyYW1ldGVycyhtQU1lZGlhQ29kZWMsIHBhcmFtcy0+Z2V0QU1lZGlhRm9ybWF0KCkpKTsKK30KKworLy8vLy8vLy8vLy8vIEFNZWRpYUV4dHJhY3RvcldyYXBwZXIKKworQU1lZGlhRXh0cmFjdG9yV3JhcHBlcjo6QU1lZGlhRXh0cmFjdG9yV3JhcHBlcihBTWVkaWFFeHRyYWN0b3IgKmFNZWRpYUV4dHJhY3RvcikKKyAgICA6IG1BTWVkaWFFeHRyYWN0b3IoYU1lZGlhRXh0cmFjdG9yKSB7Cit9CisKK0FNZWRpYUV4dHJhY3RvcldyYXBwZXI6On5BTWVkaWFFeHRyYWN0b3JXcmFwcGVyKCkgeworICAgIHJlbGVhc2UoKTsKK30KKworc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yV3JhcHBlcjo6cmVsZWFzZSgpIHsKKyAgICBpZiAobUFNZWRpYUV4dHJhY3RvciAhPSBOVUxMKSB7CisgICAgICAgIG1lZGlhX3N0YXR1c190IGVyciA9IEFNZWRpYUV4dHJhY3Rvcl9kZWxldGUobUFNZWRpYUV4dHJhY3Rvcik7CisgICAgICAgIG1BTWVkaWFFeHRyYWN0b3IgPSBOVUxMOworICAgICAgICByZXR1cm4gdHJhbnNsYXRlRXJyb3JDb2RlKGVycik7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworQU1lZGlhRXh0cmFjdG9yICpBTWVkaWFFeHRyYWN0b3JXcmFwcGVyOjpnZXRBTWVkaWFFeHRyYWN0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuIG1BTWVkaWFFeHRyYWN0b3I7Cit9CisKK3N0YXR1c190IEFNZWRpYUV4dHJhY3RvcldyYXBwZXI6OnNldERhdGFTb3VyY2UoaW50IGZkLCBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBsZW5ndGgpIHsKKyAgICBpZiAobUFNZWRpYUV4dHJhY3RvciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgcmV0dXJuIHRyYW5zbGF0ZUVycm9yQ29kZShBTWVkaWFFeHRyYWN0b3Jfc2V0RGF0YVNvdXJjZUZkKAorICAgICAgICAgICAgbUFNZWRpYUV4dHJhY3RvciwgZmQsIG9mZnNldCwgbGVuZ3RoKSk7Cit9CisKK3N0YXR1c190IEFNZWRpYUV4dHJhY3RvcldyYXBwZXI6OnNldERhdGFTb3VyY2UoY29uc3QgY2hhciAqbG9jYXRpb24pIHsKKyAgICBpZiAobUFNZWRpYUV4dHJhY3RvciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgcmV0dXJuIHRyYW5zbGF0ZUVycm9yQ29kZShBTWVkaWFFeHRyYWN0b3Jfc2V0RGF0YVNvdXJjZShtQU1lZGlhRXh0cmFjdG9yLCBsb2NhdGlvbikpOworfQorCitzaXplX3QgQU1lZGlhRXh0cmFjdG9yV3JhcHBlcjo6Z2V0VHJhY2tDb3VudCgpIHsKKyAgICBpZiAobUFNZWRpYUV4dHJhY3RvciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gQU1lZGlhRXh0cmFjdG9yX2dldFRyYWNrQ291bnQobUFNZWRpYUV4dHJhY3Rvcik7Cit9CisKK3NwPEFNZWRpYUZvcm1hdFdyYXBwZXI+IEFNZWRpYUV4dHJhY3RvcldyYXBwZXI6OmdldFRyYWNrRm9ybWF0KHNpemVfdCBpZHgpIHsKKyAgICBpZiAobUFNZWRpYUV4dHJhY3RvciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gbmV3IEFNZWRpYUZvcm1hdFdyYXBwZXIoQU1lZGlhRXh0cmFjdG9yX2dldFRyYWNrRm9ybWF0KG1BTWVkaWFFeHRyYWN0b3IsIGlkeCkpOworfQorCitzdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3JXcmFwcGVyOjpzZWxlY3RUcmFjayhzaXplX3QgaWR4KSB7CisgICAgaWYgKG1BTWVkaWFFeHRyYWN0b3IgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIHJldHVybiB0cmFuc2xhdGVFcnJvckNvZGUoQU1lZGlhRXh0cmFjdG9yX3NlbGVjdFRyYWNrKG1BTWVkaWFFeHRyYWN0b3IsIGlkeCkpOworfQorCitzdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3JXcmFwcGVyOjp1bnNlbGVjdFRyYWNrKHNpemVfdCBpZHgpIHsKKyAgICBpZiAobUFNZWRpYUV4dHJhY3RvciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgcmV0dXJuIHRyYW5zbGF0ZUVycm9yQ29kZShBTWVkaWFFeHRyYWN0b3JfdW5zZWxlY3RUcmFjayhtQU1lZGlhRXh0cmFjdG9yLCBpZHgpKTsKK30KKworc3NpemVfdCBBTWVkaWFFeHRyYWN0b3JXcmFwcGVyOjpyZWFkU2FtcGxlRGF0YShjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgaWYgKG1BTWVkaWFFeHRyYWN0b3IgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiBBTWVkaWFFeHRyYWN0b3JfcmVhZFNhbXBsZURhdGEobUFNZWRpYUV4dHJhY3RvciwgYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+Y2FwYWNpdHkoKSk7Cit9CisKK3VpbnQzMl90IEFNZWRpYUV4dHJhY3RvcldyYXBwZXI6OmdldFNhbXBsZUZsYWdzKCkgeworICAgIGlmIChtQU1lZGlhRXh0cmFjdG9yID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlRmxhZ3MobUFNZWRpYUV4dHJhY3Rvcik7Cit9CisKK2ludCBBTWVkaWFFeHRyYWN0b3JXcmFwcGVyOjpnZXRTYW1wbGVUcmFja0luZGV4KCkgeworICAgIGlmIChtQU1lZGlhRXh0cmFjdG9yID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZVRyYWNrSW5kZXgobUFNZWRpYUV4dHJhY3Rvcik7Cit9CisKK2ludDY0X3QgQU1lZGlhRXh0cmFjdG9yV3JhcHBlcjo6Z2V0U2FtcGxlVGltZSgpIHsKKyAgICBpZiAobUFNZWRpYUV4dHJhY3RvciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVUaW1lKG1BTWVkaWFFeHRyYWN0b3IpOworfQorCitib29sIEFNZWRpYUV4dHJhY3RvcldyYXBwZXI6OmFkdmFuY2UoKSB7CisgICAgaWYgKG1BTWVkaWFFeHRyYWN0b3IgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBBTWVkaWFFeHRyYWN0b3JfYWR2YW5jZShtQU1lZGlhRXh0cmFjdG9yKTsKK30KKworc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yV3JhcHBlcjo6c2Vla1RvKGludDY0X3Qgc2Vla1Bvc1VzLCBTZWVrTW9kZSBtb2RlKSB7CisgICAgaWYgKG1BTWVkaWFFeHRyYWN0b3IgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIHJldHVybiBBTWVkaWFFeHRyYWN0b3Jfc2Vla1RvKG1BTWVkaWFFeHRyYWN0b3IsIHNlZWtQb3NVcywgbW9kZSk7Cit9CisKK1Bzc2hJbmZvKiBBTWVkaWFFeHRyYWN0b3JXcmFwcGVyOjpnZXRQc3NoSW5mbygpIHsKKyAgICBpZiAobUFNZWRpYUV4dHJhY3RvciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gQU1lZGlhRXh0cmFjdG9yX2dldFBzc2hJbmZvKG1BTWVkaWFFeHRyYWN0b3IpOworfQorCitzcDxBTWVkaWFDb2RlY0NyeXB0b0luZm9XcmFwcGVyPiBBTWVkaWFFeHRyYWN0b3JXcmFwcGVyOjpnZXRTYW1wbGVDcnlwdG9JbmZvKCkgeworICAgIGlmIChtQU1lZGlhRXh0cmFjdG9yID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBuZXcgQU1lZGlhQ29kZWNDcnlwdG9JbmZvV3JhcHBlcihBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlQ3J5cHRvSW5mbyhtQU1lZGlhRXh0cmFjdG9yKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9UZXN0UGxheWVyU3R1Yi5jcHAgYi9tZWRpYS9saWJtZWRpYS9UZXN0UGxheWVyU3R1Yi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU0ODc5MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL1Rlc3RQbGF5ZXJTdHViLmNwcApAQCAtMCwwICsxLDE5OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJUZXN0UGxheWVyU3R1YiIKKyNpbmNsdWRlICJ1dGlscy9Mb2cuaCIKKworI2luY2x1ZGUgIlRlc3RQbGF5ZXJTdHViLmgiCisKKyNpbmNsdWRlIDxkbGZjbi5oPiAgLy8gZm9yIGRsb3Blbi9kbGNsb3NlCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4gIC8vIGZvciBzdGF0dXNfdAorCisjaW5jbHVkZSAibWVkaWEvTWVkaWFQbGF5ZXIySW50ZXJmYWNlLmgiCisKKworbmFtZXNwYWNlIHsKK3VzaW5nIGFuZHJvaWQ6OnN0YXR1c190OwordXNpbmcgYW5kcm9pZDo6TWVkaWFQbGF5ZXIyQmFzZTsKKworY29uc3QgY2hhciAqa1Rlc3RVcmxTY2hlbWUgPSAidGVzdDoiOworY29uc3QgY2hhciAqa1VybFBhcmFtID0gInVybD0iOworCitjb25zdCBjaGFyICprQnVpbGRUeXBlUHJvcE5hbWUgPSAicm8uYnVpbGQudHlwZSI7Citjb25zdCBjaGFyICprRW5nQnVpbGQgPSAiZW5nIjsKK2NvbnN0IGNoYXIgKmtUZXN0QnVpbGQgPSAidGVzdCI7CisKKy8vIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY3VycmVudCBidWlsZCBpcyAnZW5nJyBvciAndGVzdCcuCitib29sIGlzVGVzdEJ1aWxkKCkKK3sKKyAgICBjaGFyIHByb3BbUFJPUEVSVFlfVkFMVUVfTUFYXSA9IHsgJ1wwJywgfTsKKworICAgIHByb3BlcnR5X2dldChrQnVpbGRUeXBlUHJvcE5hbWUsIHByb3AsICJcMCIpOworICAgIHJldHVybiBzdHJjbXAocHJvcCwga0VuZ0J1aWxkKSA9PSAwIHx8IHN0cmNtcChwcm9wLCBrVGVzdEJ1aWxkKSA9PSAwOworfQorCisvLyBAcmV0dXJuIHRydWUgaWYgdGhlIHVybCBzY2hlbWUgaXMgJ3Rlc3Q6JworYm9vbCBpc1Rlc3RVcmwoY29uc3QgY2hhciAqdXJsKQoreworICAgIHJldHVybiB1cmwgJiYgc3RybmNtcCh1cmwsIGtUZXN0VXJsU2NoZW1lLCBzdHJsZW4oa1Rlc3RVcmxTY2hlbWUpKSA9PSAwOworfQorCit9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworVGVzdFBsYXllclN0dWI6OlRlc3RQbGF5ZXJTdHViKCkKKyAgICA6bVVybChOVUxMKSwgbUZpbGVuYW1lKE5VTEwpLCBtQ29udGVudFVybChOVUxMKSwKKyAgICAgbUhhbmRsZShOVUxMKSwgbU5ld1BsYXllcihOVUxMKSwgbURlbGV0ZVBsYXllcihOVUxMKSwKKyAgICAgbVBsYXllcihOVUxMKSB7IH0KKworVGVzdFBsYXllclN0dWI6On5UZXN0UGxheWVyU3R1YigpCit7CisgICAgcmVzZXRJbnRlcm5hbCgpOworfQorCitzdGF0dXNfdCBUZXN0UGxheWVyU3R1Yjo6aW5pdENoZWNrKCkKK3sKKyAgICByZXR1cm4gaXNUZXN0QnVpbGQoKSA/IE9LIDogSU5WQUxJRF9PUEVSQVRJT047Cit9CisKKy8vIFBhcnNlIG1VcmwgdG8gZ2V0OgorLy8gKiBUaGUgbGlicmFyeSB0byBiZSBkbG9wZW5lZC4KKy8vICogVGhlIHVybCB0byBiZSBwYXNzZWQgdG8gdGhlIHJlYWwgc2V0RGF0YVNvdXJjZSBpbXBsLgorLy8KKy8vIG1VcmwgaXMgZXhwZWN0ZWQgdG8gYmUgaW4gZm9sbG93aW5nIGZvcm1hdDoKKy8vCisvLyB0ZXN0OjxuYW1lIG9mIHRoZSAuc28+P3VybD08dXJsIGZvciBzZXREYXRhU291cmNlPgorLy8KKy8vIFRoZSB2YWx1ZSBvZiB0aGUgdXJsIHBhcmFtZXRlciBpcyB0cmVhdGVkIGFzIGEgc3RyaW5nIChubworLy8gdW5lc2NhcGluZyBvZiBpbGxlZ2FsIGNoYXJhdGVycykuCitzdGF0dXNfdCBUZXN0UGxheWVyU3R1Yjo6cGFyc2VVcmwoKQoreworICAgIGlmIChzdHJsZW4obVVybCkgPCBzdHJsZW4oa1Rlc3RVcmxTY2hlbWUpKSB7CisgICAgICAgIHJlc2V0SW50ZXJuYWwoKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBjaGFyICppID0gbVVybCArIHN0cmxlbihrVGVzdFVybFNjaGVtZSk7CisKKyAgICBtRmlsZW5hbWUgPSBpOworCisgICAgd2hpbGUgKCppICE9ICdcMCcgJiYgKmkgIT0gJz8nKSB7CisgICAgICAgICsraTsKKyAgICB9CisKKyAgICBpZiAoKmkgPT0gJ1wwJyB8fCBzdHJuY21wKGkgKyAxLCBrVXJsUGFyYW0sIHN0cmxlbihrVXJsUGFyYW0pKSAhPSAwKSB7CisgICAgICAgIHJlc2V0SW50ZXJuYWwoKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgKmkgPSAnXDAnOyAgLy8gcmVwbGFjZSAnPycgdG8gbnVsLXRlcm1pbmF0ZSBtRmlsZW5hbWUKKworICAgIG1Db250ZW50VXJsID0gaSArIDEgKyBzdHJsZW4oa1VybFBhcmFtKTsKKyAgICByZXR1cm4gT0s7Cit9CisKKy8vIExvYWQgdGhlIGR5bmFtaWMgbGlicmFyeS4KKy8vIENyZWF0ZSB0aGUgdGVzdCBwbGF5ZXIuCisvLyBDYWxsIHNldERhdGFTb3VyY2Ugb24gdGhlIHRlc3QgcGxheWVyIHdpdGggdGhlIHVybCBpbiBwYXJhbS4KK3N0YXR1c190IFRlc3RQbGF5ZXJTdHViOjpzZXREYXRhU291cmNlKAorICAgICAgICBjb25zdCBzcDxNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKKyAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKKyAgICBpZiAoIWlzVGVzdFVybCh1cmwpIHx8IE5VTEwgIT0gbUhhbmRsZSkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgbVVybCA9IHN0cmR1cCh1cmwpOworCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gcGFyc2VVcmwoKTsKKworICAgIGlmIChPSyAhPSBzdGF0dXMpIHsKKyAgICAgICAgcmVzZXRJbnRlcm5hbCgpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIDo6ZGxlcnJvcigpOyAgLy8gQ2xlYXJzIGFueSBwZW5kaW5nIGVycm9yLgorCisgICAgLy8gTG9hZCB0aGUgdGVzdCBwbGF5ZXIgZnJvbSB0aGUgdXJsLiBkbG9wZW4gd2lsbCBmYWlsIGlmIHRoZSBsaWIKKyAgICAvLyBpcyBub3QgdGhlcmUuIGRscyBhcmUgdW5kZXIgL3N5c3RlbS9saWIKKyAgICAvLyBOb25lIG9mIHRoZSBlbnRyeSBwb2ludHMgc2hvdWxkIGJlIE5VTEwuCisgICAgbUhhbmRsZSA9IDo6ZGxvcGVuKG1GaWxlbmFtZSwgUlRMRF9OT1cgfCBSVExEX0dMT0JBTCk7CisgICAgaWYgKCFtSGFuZGxlKSB7CisgICAgICAgIEFMT0dFKCJkbG9wZW4gZmFpbGVkOiAlcyIsIDo6ZGxlcnJvcigpKTsKKyAgICAgICAgcmVzZXRJbnRlcm5hbCgpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICAvLyBMb2FkIHRoZSAyIGVudHJ5IHBvaW50cyB0byBjcmVhdGUgYW5kIGRlbGV0ZSBpbnN0YW5jZXMuCisgICAgY29uc3QgY2hhciAqZXJyOworICAgIG1OZXdQbGF5ZXIgPSByZWludGVycHJldF9jYXN0PE5FV19QTEFZRVI+KGRsc3ltKG1IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5ld1BsYXllciIpKTsKKyAgICBlcnIgPSA6OmRsZXJyb3IoKTsKKyAgICBpZiAoZXJyIHx8IG1OZXdQbGF5ZXIgPT0gTlVMTCkgeworICAgICAgICAvLyBpZiBlcnIgaXMgTlVMTCB0aGUgc3RyaW5nIDxudWxsPiBpcyBpbnNlcnRlZCBpbiB0aGUgbG9ncyA9PgorICAgICAgICAvLyBtTmV3UGxheWVyIHdhcyBOVUxMLgorICAgICAgICBBTE9HRSgiZGxzeW0gZm9yIG5ld1BsYXllciBmYWlsZWQgJXMiLCBlcnIpOworICAgICAgICByZXNldEludGVybmFsKCk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIG1EZWxldGVQbGF5ZXIgPSByZWludGVycHJldF9jYXN0PERFTEVURV9QTEFZRVI+KGRsc3ltKG1IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlbGV0ZVBsYXllciIpKTsKKyAgICBlcnIgPSA6OmRsZXJyb3IoKTsKKyAgICBpZiAoZXJyIHx8IG1EZWxldGVQbGF5ZXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiZGxzeW0gZm9yIGRlbGV0ZVBsYXllciBmYWlsZWQgJXMiLCBlcnIpOworICAgICAgICByZXNldEludGVybmFsKCk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIG1QbGF5ZXIgPSAoKm1OZXdQbGF5ZXIpKCk7CisgICAgcmV0dXJuIG1QbGF5ZXItPnNldERhdGFTb3VyY2UoaHR0cFNlcnZpY2UsIG1Db250ZW50VXJsLCBoZWFkZXJzKTsKK30KKworLy8gSW50ZXJuYWwgY2xlYW51cC4KK3N0YXR1c190IFRlc3RQbGF5ZXJTdHViOjpyZXNldEludGVybmFsKCkKK3sKKyAgICBpZihtVXJsKSB7CisgICAgICAgIGZyZWUobVVybCk7CisgICAgICAgIG1VcmwgPSBOVUxMOworICAgIH0KKyAgICBtRmlsZW5hbWUgPSBOVUxMOworICAgIG1Db250ZW50VXJsID0gTlVMTDsKKworICAgIGlmIChtUGxheWVyKSB7CisgICAgICAgIEFMT0dfQVNTRVJUKG1EZWxldGVQbGF5ZXIgIT0gTlVMTCwgIm1EZWxldGVQbGF5ZXIgaXMgbnVsbCIpOworICAgICAgICAoKm1EZWxldGVQbGF5ZXIpKG1QbGF5ZXIpOworICAgICAgICBtUGxheWVyID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAobUhhbmRsZSkgeworICAgICAgICA6OmRsY2xvc2UobUhhbmRsZSk7CisgICAgICAgIG1IYW5kbGUgPSBOVUxMOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKKy8qIHN0YXRpYyAqLyBib29sIFRlc3RQbGF5ZXJTdHViOjpjYW5CZVVzZWQoY29uc3QgY2hhciAqdXJsKQoreworICAgIHJldHVybiBpc1Rlc3RCdWlsZCgpICYmIGlzVGVzdFVybCh1cmwpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvVGVzdFBsYXllclN0dWIuaCBiL21lZGlhL2xpYm1lZGlhL1Rlc3RQbGF5ZXJTdHViLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdjOGJmNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL1Rlc3RQbGF5ZXJTdHViLmgKQEAgLTAsMCArMSwxMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9GUkFNRVdPUktTX0JBU0VfTUVESUFfTElCTUVESUFfVEVTVFBMQVlFUlNUVUJfSF9fCisjZGVmaW5lIEFORFJPSURfRlJBTUVXT1JLU19CQVNFX01FRElBX0xJQk1FRElBX1RFU1RQTEFZRVJTVFVCX0hfXworCisjaW5jbHVkZSA8bWVkaWEvTWVkaWFQbGF5ZXIySW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK2NsYXNzIE1lZGlhUGxheWVyMkJhc2U7ICAvLyBpbiBtZWRpYS9NZWRpYVBsYXllcjJJbnRlcmZhY2UuaAorCisvLyBXcmFwcGVyIGFyb3VuZCBhIHRlc3QgbWVkaWEgcGxheWVyIHRoYXQgZ2V0cyBkeW5hbWljYWxseSBsb2FkZWQuCisvLworLy8gVGhlIFVSTCBwYXNzZWQgdG8gc2V0RGF0YVNvdXJjZSBoYXMgdGhpcyBmb3JtYXQ6CisvLworLy8gICB0ZXN0OjxuYW1lIG9mIHRoZSAuc28+P3VybD08dXJsIGZvciB0aGUgcmVhbCBzZXREYXRhU291cmNlIGltcGwuPgorLy8KKy8vIGUuZzoKKy8vICAgdGVzdDppbnZva2VfdGVzdF9tZWRpYV9wbGF5ZXIuc28/dXJsPWh0dHA6Ly95b3V0dWJlLmNvbS8KKy8vICAgdGVzdDppbnZva2VfdGVzdF9tZWRpYV9wbGF5ZXIuc28/dXJsPXNwZWVkdGVzdAorLy8KKy8vIFRlc3RQbGF5ZXJTdHViOjpzZXREYXRhU291cmNlIGxvYWRzIHRoZSBsaWJyYXJ5IGluIHRoZSB0ZXN0IHVybC4gMgorLy8gZW50cnkgcG9pbnRzIHdpdGggQyBsaW5rYWdlIGFyZSBleHBlY3RlZC4gT25lIHRvIGNyZWF0ZSB0aGUgdGVzdAorLy8gcGxheWVyIGFuZCBvbmUgdG8gZGVzdHJveSBpdC4KKy8vCisvLyBleHRlcm4gIkMiIGFuZHJvaWQ6Ok1lZGlhUGxheWVyMkJhc2UqIG5ld1BsYXllcigpOworLy8gZXh0ZXJuICJDIiBhbmRyb2lkOjpzdGF0dXNfdCBkZWxldGVQbGF5ZXIoYW5kcm9pZDo6TWVkaWFQbGF5ZXIyQmFzZSAqcCk7CisvLworLy8gT25jZSB0aGUgdGVzdCBwbGF5ZXIgaGFzIGJlZW4gbG9hZGVkLCBpdHMgc2V0RGF0YVNvdXJjZQorLy8gaW1wbGVtZW50YXRpb24gaXMgY2FsbGVkIHdpdGggdGhlIHZhbHVlIG9mIHRoZSAndXJsJyBwYXJhbWV0ZXIuCisvLworLy8gdHlwaWNhbCB1c2FnZSBpbiBhIGphdmEgdGVzdDoKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyAgTWVkaWFQbGF5ZXIyIHAgPSBuZXcgTWVkaWFQbGF5ZXIyKCk7CisvLyAgcC5zZXREYXRhU291cmNlKCJ0ZXN0Omludm9rZV9tb2NrX21lZGlhX3BsYXllci5zbz91cmw9aHR0cDovL3lvdXR1YmUuY29tIik7CisvLyAgcC5wcmVwYXJlKCk7CisvLyAgLi4uCisvLyAgcC5yZWxlYXNlKCk7CisKK2NsYXNzIFRlc3RQbGF5ZXJTdHViIDogcHVibGljIE1lZGlhUGxheWVyMkludGVyZmFjZSB7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIE1lZGlhUGxheWVyMkJhc2UqICgqTkVXX1BMQVlFUikoKTsKKyAgICB0eXBlZGVmIHN0YXR1c190ICgqREVMRVRFX1BMQVlFUikoTWVkaWFQbGF5ZXIyQmFzZSAqKTsKKworICAgIFRlc3RQbGF5ZXJTdHViKCk7CisgICAgdmlydHVhbCB+VGVzdFBsYXllclN0dWIoKTsKKworICAgIC8vIENhbGxlZCByaWdodCBhZnRlciB0aGUgY29uc3RydWN0b3IuIENoZWNrIGlmIHRoZSBjdXJyZW50IGJ1aWxkCisgICAgLy8gYWxsb3dzIHRlc3QgcGxheWVycy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpOworCisgICAgLy8gQHBhcmFtIHVybCBTaG91bGQgYmUgYSB0ZXN0IHVybC4gU2VlIGNsYXNzIGNvbW1lbnQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREYXRhU291cmNlKAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICAgICAgY29uc3QgY2hhciogdXJsLAorICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOworCisgICAgLy8gVGVzdCBwbGF5ZXIgZm9yIGEgZmlsZSBkZXNjcmlwdG9yIHNvdXJjZSBpcyBub3Qgc3VwcG9ydGVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShpbnQsIGludDY0X3QsIGludDY0X3QpICB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKworICAgIC8vIEFsbCB0aGUgbWV0aG9kcyBiZWxvdyB3cmFwIHRoZSBtUGxheWVyIGluc3RhbmNlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VmlkZW9TdXJmYWNlVGV4dHVyZSgKKyAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OkFOYXRpdmVXaW5kb3dXcmFwcGVyPiYgc3QpICB7CisgICAgICAgIHJldHVybiBtUGxheWVyLT5zZXRWaWRlb1N1cmZhY2VUZXh0dXJlKHN0KTsKKyAgICB9CisgICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlKCkge3JldHVybiBtUGxheWVyLT5wcmVwYXJlKCk7fQorICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJlcGFyZUFzeW5jKCkgIHtyZXR1cm4gbVBsYXllci0+cHJlcGFyZUFzeW5jKCk7fQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKSAge3JldHVybiBtUGxheWVyLT5zdGFydCgpO30KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKSAge3JldHVybiBtUGxheWVyLT5zdG9wKCk7fQorICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKSAge3JldHVybiBtUGxheWVyLT5wYXVzZSgpO30KKyAgICB2aXJ0dWFsIGJvb2wgaXNQbGF5aW5nKCkge3JldHVybiBtUGxheWVyLT5pc1BsYXlpbmcoKTt9CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZWVrVG8oCisgICAgICAgICAgICBpbnQgbXNlYywKKyAgICAgICAgICAgIE1lZGlhUGxheWVyMlNlZWtNb2RlIG1vZGUgPSBNZWRpYVBsYXllcjJTZWVrTW9kZTo6U0VFS19QUkVWSU9VU19TWU5DKSB7CisgICAgICAgIHJldHVybiBtUGxheWVyLT5zZWVrVG8obXNlYywgbW9kZSk7CisgICAgfQorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q3VycmVudFBvc2l0aW9uKGludCAqcCkgIHsKKyAgICAgICAgcmV0dXJuIG1QbGF5ZXItPmdldEN1cnJlbnRQb3NpdGlvbihwKTsKKyAgICB9CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXREdXJhdGlvbihpbnQgKmQpICB7cmV0dXJuIG1QbGF5ZXItPmdldER1cmF0aW9uKGQpO30KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlc2V0KCkge3JldHVybiBtUGxheWVyLT5yZXNldCgpO30KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldExvb3BpbmcoaW50IGIpICB7cmV0dXJuIG1QbGF5ZXItPnNldExvb3BpbmcoYik7fQorICAgIHZpcnR1YWwgcGxheWVyMl90eXBlIHBsYXllclR5cGUoKSB7cmV0dXJuIG1QbGF5ZXItPnBsYXllclR5cGUoKTt9CisgICAgdmlydHVhbCBzdGF0dXNfdCBpbnZva2UoY29uc3QgYW5kcm9pZDo6UGFyY2VsJiBpbiwgYW5kcm9pZDo6UGFyY2VsICpvdXQpIHsKKyAgICAgICAgcmV0dXJuIG1QbGF5ZXItPmludm9rZShpbiwgb3V0KTsKKyAgICB9CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXIoaW50IGtleSwgY29uc3QgUGFyY2VsICZyZXF1ZXN0KSB7CisgICAgICAgIHJldHVybiBtUGxheWVyLT5zZXRQYXJhbWV0ZXIoa2V5LCByZXF1ZXN0KTsKKyAgICB9CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXIoaW50IGtleSwgUGFyY2VsICpyZXBseSkgeworICAgICAgICByZXR1cm4gbVBsYXllci0+Z2V0UGFyYW1ldGVyKGtleSwgcmVwbHkpOworICAgIH0KKworCisgICAgLy8gQHJldHVybiB0cnVlIGlmIHRoZSBjdXJyZW50IGJ1aWxkIGlzICdlbmcnIG9yICd0ZXN0JyBhbmQgdGhlCisgICAgLy8gICAgICAgICAgICAgIHVybCdzIHNjaGVtZSBpcyAndGVzdDonCisgICAgc3RhdGljIGJvb2wgY2FuQmVVc2VkKGNvbnN0IGNoYXIgKnVybCk7CisKKyAgcHJpdmF0ZToKKyAgICAvLyBSZWxlYXNlIHRoZSBwbGF5ZXIsIGRsY2xvc2UgdGhlIGxpYnJhcnkuCisgICAgc3RhdHVzX3QgcmVzZXRJbnRlcm5hbCgpOworICAgIHN0YXR1c190IHBhcnNlVXJsKCk7CisKKyAgICBjaGFyICptVXJsOyAgICAgICAgICAgICAgICAvLyB0ZXN0OmZvby5zbz91cmw9aHR0cDovL2JhcgorICAgIGNoYXIgKm1GaWxlbmFtZTsgICAgICAgICAgIC8vIGZvby5zbworICAgIGNoYXIgKm1Db250ZW50VXJsOyAgICAgICAgIC8vIGh0dHA6Ly9iYXIKKyAgICB2b2lkICptSGFuZGxlOyAgICAgICAgICAgICAvLyByZXR1cm5lZCBieSBkbG9wZW4KKyAgICBORVdfUExBWUVSICAgIG1OZXdQbGF5ZXI7CisgICAgREVMRVRFX1BMQVlFUiBtRGVsZXRlUGxheWVyOworICAgIE1lZGlhUGxheWVyMkJhc2UgKm1QbGF5ZXI7IC8vIHdyYXBwZWQgcGxheWVyCit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfRlJBTUVXT1JLU19CQVNFX01FRElBX0xJQk1FRElBX1RFU1RQTEFZRVJTVFVCX0hfXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFIVFRQQ29ubmVjdGlvbi5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFIVFRQQ29ubmVjdGlvbi5oCmluZGV4IDJhNjNlYjcuLjBmYjZiYjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhSFRUUENvbm5lY3Rpb24uaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYUhUVFBDb25uZWN0aW9uLmgKQEAgLTE5LDE2ICsxOSwxNSBAQAogI2RlZmluZSBJX01FRElBX0hUVFBfQ09OTkVDVElPTl9IXwogCiAjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUhUVFBDb25uZWN0aW9uLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RydWN0IElNZWRpYUhUVFBDb25uZWN0aW9uOwotCiAvKiogTVVTVCBzdGF5IGluIHN5bmMgd2l0aCBJTWVkaWFIVFRQQ29ubmVjdGlvbi5haWRsICovCiAKLXN0cnVjdCBJTWVkaWFIVFRQQ29ubmVjdGlvbiA6IHB1YmxpYyBJSW50ZXJmYWNlIHsKK3N0cnVjdCBJTWVkaWFIVFRQQ29ubmVjdGlvbiA6IHB1YmxpYyBNZWRpYUhUVFBDb25uZWN0aW9uLCBwdWJsaWMgSUludGVyZmFjZSB7CiAgICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShNZWRpYUhUVFBDb25uZWN0aW9uKTsKIAogICAgIHZpcnR1YWwgYm9vbCBjb25uZWN0KApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oCmluZGV4IGY2NmQ2YzguLmU5NDhiNzggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmgKQEAgLTE5LDE4ICsxOSwxOSBAQAogI2RlZmluZSBJX01FRElBX0hUVFBfU0VSVklDRV9IXwogCiAjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0cnVjdCBJTWVkaWFIVFRQQ29ubmVjdGlvbjsKK3N0cnVjdCBNZWRpYUhUVFBDb25uZWN0aW9uOwogCiAvKiogTVVTVCBzdGF5IGluIHN5bmMgd2l0aCBJTWVkaWFIVFRQU2VydmljZS5haWRsICovCiAKLXN0cnVjdCBJTWVkaWFIVFRQU2VydmljZSA6IHB1YmxpYyBJSW50ZXJmYWNlIHsKK3N0cnVjdCBJTWVkaWFIVFRQU2VydmljZSA6IHB1YmxpYyBNZWRpYUhUVFBTZXJ2aWNlLCBwdWJsaWMgSUludGVyZmFjZSB7CiAgICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShNZWRpYUhUVFBTZXJ2aWNlKTsKIAotICAgIHZpcnR1YWwgc3A8SU1lZGlhSFRUUENvbm5lY3Rpb24+IG1ha2VIVFRQQ29ubmVjdGlvbigpID0gMDsKKyAgICB2aXJ0dWFsIHNwPE1lZGlhSFRUUENvbm5lY3Rpb24+IG1ha2VIVFRQQ29ubmVjdGlvbigpID0gMDsKIAogcHJpdmF0ZToKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhJTWVkaWFIVFRQU2VydmljZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYVNvdXJjZS5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFTb3VyY2UuaAppbmRleCA3YWVhOTBjLi40OTM3NDJlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYVNvdXJjZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhU291cmNlLmgKQEAgLTk1LDE0ICs5NSw2IEBACiAgICAgLy8gdW50aWwgYSBzdWJzZXF1ZW50IHJlYWQtd2l0aC1zZWVrLiBDdXJyZW50bHkgb25seSBzdXBwb3J0ZWQgYnkKICAgICAvLyBPTVhDb2RlYy4KICAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCkgID0gMDsKLQotICAgIC8vIFRoZSBjb25zdW1lciBvZiB0aGlzIG1lZGlhIHNvdXJjZSByZXF1ZXN0cyB0aGF0IHRoZSBnaXZlbiBidWZmZXJzCi0gICAgLy8gYXJlIHRvIGJlIHJldHVybmVkIGV4Y2x1c2l2ZWx5IGluIHJlc3BvbnNlIHRvIHJlYWQgY2FsbHMuCi0gICAgLy8gVGhpcyB3aWxsIGJlIGNhbGxlZCBhZnRlciBhIHN1Y2Nlc3NmdWwgc3RhcnQoKSBhbmQgYmVmb3JlIHRoZQotICAgIC8vIGZpcnN0IHJlYWQoKSBjYWxsLgotICAgIC8vIENhbGxlZSBhc3N1bWVzIG93bmVyc2hpcCBvZiB0aGUgYnVmZmVycyBpZiBubyBlcnJvciBpcyByZXR1cm5lZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEJ1ZmZlcnMoY29uc3QgVmVjdG9yPE1lZGlhQnVmZmVyICo+ICYgLyogYnVmZmVycyAqLykgPSAwOwotCiB9OwogCiBjbGFzcyBCbk1lZGlhU291cmNlOiBwdWJsaWMgQm5JbnRlcmZhY2U8SU1lZGlhU291cmNlPgpAQCAtMTE3LDEwICsxMDksNiBAQAogICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRCdWZmZXJzKGNvbnN0IFZlY3RvcjxNZWRpYUJ1ZmZlciAqPiAmIC8qIGJ1ZmZlcnMgKi8pIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwotICAgIH0KLQogICAgIC8vIFRPRE86IEltcGxlbWVudCB0aGlzIGZvciBsb2NhbCBtZWRpYSBzb3VyY2VzLgogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZE11bHRpcGxlKAogICAgICAgICAgICAgVmVjdG9yPE1lZGlhQnVmZmVyICo+ICogLyogYnVmZmVycyAqLywgdWludDMyX3QgLyogbWF4TnVtQnVmZmVycyA9IDEgKi8sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lTdHJlYW1Tb3VyY2UuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSVN0cmVhbVNvdXJjZS5oCmluZGV4IDRhNmFhZmQuLmMwOGMzZTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSVN0cmVhbVNvdXJjZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSVN0cmVhbVNvdXJjZS5oCkBAIC01NCw0MCArNTQsNiBAQAogCiAgICAgdmlydHVhbCB2b2lkIHF1ZXVlQnVmZmVyKHNpemVfdCBpbmRleCwgc2l6ZV90IHNpemUpID0gMDsKIAotICAgIC8vIFdoZW4gc2lnbmFsbGluZyBhIGRpc2NvbnRpbnVpdHkgeW91IGNhbiBvcHRpb25hbGx5Ci0gICAgLy8gc3BlY2lmeSBhbiBpbnQ2NF90IFBUUyB0aW1lc3RhbXAgaW4gIm1zZyIuCi0gICAgLy8gSWYgcHJlc2VudCwgcmVuZGVyaW5nIG9mIGRhdGEgZm9sbG93aW5nIHRoZSBkaXNjb250aW51aXR5Ci0gICAgLy8gd2lsbCBiZSBzdXBwcmVzc2VkIHVudGlsIG1lZGlhIHRpbWUgcmVhY2hlcyB0aGlzIHRpbWVzdGFtcC4KLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qga0tleVJlc3VtZUF0UFRTOwotCi0gICAgLy8gV2hlbiBzaWduYWxsaW5nIGEgZGlzY29udGludWl0eSB5b3UgY2FuIG9wdGlvbmFsbHkKLSAgICAvLyBzcGVjaWZ5IHRoZSB0eXBlKHMpIG9mIGRpc2NvbnRpbnVpdHksIGkuZS4gaWYgdGhlCi0gICAgLy8gYXVkaW8gZm9ybWF0IGhhcyBjaGFuZ2VkLCB0aGUgdmlkZW8gZm9ybWF0IGhhcyBjaGFuZ2VkLAotICAgIC8vIHRpbWUgaGFzIGp1bXBlZCBvciBhbnkgY29tYmluYXRpb24gdGhlcmVvZi4KLSAgICAvLyBUbyBkbyBzbywgaW5jbHVkZSBhIG5vbi16ZXJvIGludDMyX3QgdmFsdWUKLSAgICAvLyB1bmRlciB0aGUga2V5ICJrS2V5RGlzY29udGludWl0eU1hc2siIHdoZW4gaXNzdWluZyB0aGUgRElTQ09OVElOVUlUWQotICAgIC8vIGNvbW1hbmQuCi0gICAgLy8gSWYgdGhlcmUgaXMgYSBjaGFuZ2UgaW4gYXVkaW8vdmlkZW8gZm9ybWF0LCBUaGUgbmV3IGxvZ2ljYWwgc3RyZWFtCi0gICAgLy8gbXVzdCBzdGFydCB3aXRoIHByb3BlciBjb2RlYyBpbml0aWFsaXphdGlvbgotICAgIC8vIGluZm9ybWF0aW9uIGZvciBwbGF5YmFjayB0byBjb250aW51ZSwgaS5lLiBTUFMgYW5kIFBQUyBpbiB0aGUgY2FzZQotICAgIC8vIG9mIEFWQyB2aWRlbyBldGMuCi0gICAgLy8gSWYgdGhpcyBrZXkgaXMgbm90IHByZXNlbnQsIG9ubHkgYSB0aW1lIGRpc2NvbnRpbnVpdHkgaXMgYXNzdW1lZC4KLSAgICAvLyBUaGUgdmFsdWUgc2hvdWxkIGJlIGEgYml0bWFzayBvZiB2YWx1ZXMgZnJvbQotICAgIC8vIEFUU1BhcnNlcjo6RGlzY29udGludWl0eVR5cGUuCi0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGtLZXlEaXNjb250aW51aXR5TWFzazsKLQotICAgIC8vIE9wdGlvbmFsbHkgc2lnbmFsbGVkIGFzIHBhcnQgb2YgYSBkaXNjb250aW51aXR5IHRoYXQgaW5jbHVkZXMKLSAgICAvLyBESVNDT05USU5VSVRZX1RJTUUuIEl0IGluZGljYXRlcyB0aGUgbWVkaWEgdGltZSAoaW4gdXMpIHRvIGJlIGFzc29jaWF0ZWQKLSAgICAvLyB3aXRoIHRoZSBuZXh0IFBUUyBvY2N1cmluZyBpbiB0aGUgc3RyZWFtLiBUaGUgdmFsdWUgaXMgb2YgdHlwZSBpbnQ2NF90LgotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBrS2V5TWVkaWFUaW1lVXM7Ci0KLSAgICAvLyBPcHRpb25hbGx5IHNpZ25hbGxlZCBhcyBwYXJ0IG9mIGEgZGlzY29udGludWl0eSB0aGF0IGluY2x1ZGVzCi0gICAgLy8gRElTQ09OVElOVUlUWV9USU1FLiBJdCBpbmRpY2F0ZXMgdGhlIG1lZGlhIHRpbWUgKGluIHVzKSBvZiBhIHJlY2VudAotICAgIC8vIHNhbXBsZSBmcm9tIHRoZSBzYW1lIGNvbnRlbnQsIGFuZCBpcyB1c2VkIGFzIGEgaGludCBmb3IgdGhlIHBhcnNlciB0bwotICAgIC8vIGhhbmRsZSBQVFMgd3JhcGFyb3VuZC4gVGhpcyBpcyByZXF1aXJlZCB3aGVuIGEgbmV3IHBhcnNlciBpcyBjcmVhdGVkCi0gICAgLy8gdG8gY29udGludWUgcGFyc2luZyBjb250ZW50IGZyb20gdGhlIHNhbWUgdGltZWxpbmUuCi0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGtLZXlSZWNlbnRNZWRpYVRpbWVVczsKLQogICAgIHZpcnR1YWwgdm9pZCBpc3N1ZUNvbW1hbmQoCiAgICAgICAgICAgICBDb21tYW5kIGNtZCwgYm9vbCBzeW5jaHJvbm91cywgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cgPSBOVUxMKSA9IDA7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYUhUVFBDb25uZWN0aW9uLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhSFRUUENvbm5lY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzgxM2EyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYUhUVFBDb25uZWN0aW9uLmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNRURJQV9IVFRQX0NPTk5FQ1RJT05fSF8KKworI2RlZmluZSBNRURJQV9IVFRQX0NPTk5FQ1RJT05fSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IE1lZGlhSFRUUENvbm5lY3Rpb24gOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlIHsKKyAgICBNZWRpYUhUVFBDb25uZWN0aW9uKCkge30KKworICAgIHZpcnR1YWwgYm9vbCBjb25uZWN0KAorICAgICAgICAgICAgY29uc3QgY2hhciAqdXJpLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgPSAwOworCisgICAgdmlydHVhbCB2b2lkIGRpc2Nvbm5lY3QoKSA9IDA7CisgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpID0gMDsKKyAgICB2aXJ0dWFsIG9mZjY0X3QgZ2V0U2l6ZSgpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1JTUVUeXBlKFN0cmluZzggKm1pbWVUeXBlKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRVcmkoU3RyaW5nOCAqdXJpKSA9IDA7CisKK3ByaXZhdGU6CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTWVkaWFIVFRQQ29ubmVjdGlvbik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE1FRElBX0hUVFBfQ09OTkVDVElPTl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYUhUVFBTZXJ2aWNlLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhSFRUUFNlcnZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTlmMTI1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYUhUVFBTZXJ2aWNlLmgKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNRURJQV9IVFRQX1NFUlZJQ0VfSF8KKworI2RlZmluZSBNRURJQV9IVFRQX1NFUlZJQ0VfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgTWVkaWFIVFRQQ29ubmVjdGlvbjsKKworc3RydWN0IE1lZGlhSFRUUFNlcnZpY2UgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlIHsKKyAgICBNZWRpYUhUVFBTZXJ2aWNlKCkge30KKworICAgIHZpcnR1YWwgc3A8TWVkaWFIVFRQQ29ubmVjdGlvbj4gbWFrZUhUVFBDb25uZWN0aW9uKCkgPSAwOworCitwcml2YXRlOgorICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1lZGlhSFRUUFNlcnZpY2UpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBNRURJQV9IVFRQX1NFUlZJQ0VfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFNZXRhZGF0YVJldHJpZXZlckludGVyZmFjZS5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYU1ldGFkYXRhUmV0cmlldmVySW50ZXJmYWNlLmgKaW5kZXggZmM5ZTUzYy4uMTE2YjU0OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYU1ldGFkYXRhUmV0cmlldmVySW50ZXJmYWNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYU1ldGFkYXRhUmV0cmlldmVySW50ZXJmYWNlLmgKQEAgLTQ5LDcgKzQ5LDcgQEAKICAgICAgICAgICAgIGludCBpbmRleCwgaW50IGNvbG9yRm9ybWF0LCBib29sIG1ldGFPbmx5KSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGcmFtZUF0SW5kZXgoCiAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxWaWRlb0ZyYW1lKj4qIGZyYW1lcywKLSAgICAgICAgICAgIGludCBmcmFtZUluZGV4LCBpbnQgbnVtRnJhbWVzLCBpbnQgY29sb3JGb3JtYXQsIGJvb2wgbWV0YU9ubHkpOworICAgICAgICAgICAgaW50IGZyYW1lSW5kZXgsIGludCBudW1GcmFtZXMsIGludCBjb2xvckZvcm1hdCwgYm9vbCBtZXRhT25seSkgPSAwOwogICAgIHZpcnR1YWwgTWVkaWFBbGJ1bUFydCogZXh0cmFjdEFsYnVtQXJ0KCkgPSAwOwogICAgIHZpcnR1YWwgY29uc3QgY2hhciogZXh0cmFjdE1ldGFkYXRhKGludCBrZXlDb2RlKSA9IDA7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYVBsYXllcjJFbmdpbmUuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFQbGF5ZXIyRW5naW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI0MzkyMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFQbGF5ZXIyRW5naW5lLmgKQEAgLTAsMCArMSwxMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQVBMQVlFUjJFTkdJTkVfSAorI2RlZmluZSBBTkRST0lEX01FRElBUExBWUVSMkVOR0lORV9ICisKKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL1ZvbHVtZVNoYXBlci5oPgorCisvLyBGd2QgZGVjbCB0byBtYWtlIHN1cmUgZXZlcnlvbmUgYWdyZWVzIHRoYXQgdGhlIHNjb3BlIG9mIHN0cnVjdCBzb2NrYWRkcl9pbiBpcworLy8gZ2xvYmFsLCBhbmQgbm90IGluIGFuZHJvaWQ6Ogorc3RydWN0IHNvY2thZGRyX2luOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBBTmF0aXZlV2luZG93V3JhcHBlcjsKK2NsYXNzIFBhcmNlbDsKK2NsYXNzIElEYXRhU291cmNlOworc3RydWN0IElTdHJlYW1Tb3VyY2U7CitzdHJ1Y3QgTWVkaWFIVFRQU2VydmljZTsKK3N0cnVjdCBBdWRpb1BsYXliYWNrUmF0ZTsKK3N0cnVjdCBBVlN5bmNTZXR0aW5nczsKK3N0cnVjdCBCdWZmZXJpbmdTZXR0aW5nczsKKwordHlwZWRlZiBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNlZWtNb2RlIE1lZGlhUGxheWVyMlNlZWtNb2RlOworCitjbGFzcyBNZWRpYVBsYXllcjJFbmdpbmU6IHB1YmxpYyBSZWZCYXNlCit7CitwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgZGlzY29ubmVjdCgpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldERhdGFTb3VyY2UoCisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsCisgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiogaGVhZGVycykgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0RGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldERhdGFTb3VyY2UoY29uc3Qgc3A8SVN0cmVhbVNvdXJjZT4mIHNvdXJjZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldERhdGFTb3VyY2UoY29uc3Qgc3A8SURhdGFTb3VyY2U+JiBzb3VyY2UpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRWaWRlb1N1cmZhY2VUZXh0dXJlKGNvbnN0IHNwPEFOYXRpdmVXaW5kb3dXcmFwcGVyPiYgbnd3KSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZ2V0QnVmZmVyaW5nU2V0dGluZ3MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJpbmdTZXR0aW5ncyogYnVmZmVyaW5nIC8qIG5vbm51bGwgKi8pID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRCdWZmZXJpbmdTZXR0aW5ncyhjb25zdCBCdWZmZXJpbmdTZXR0aW5ncyYgYnVmZmVyaW5nKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgcHJlcGFyZUFzeW5jKCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHN0YXJ0KCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHN0b3AoKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgcGF1c2UoKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgaXNQbGF5aW5nKGJvb2wqIHN0YXRlKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0UGxheWJhY2tTZXR0aW5ncyhjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSYgcmF0ZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGdldFBsYXliYWNrU2V0dGluZ3MoQXVkaW9QbGF5YmFja1JhdGUqIHJhdGUgLyogbm9ubnVsbCAqLykgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldFN5bmNTZXR0aW5ncyhjb25zdCBBVlN5bmNTZXR0aW5ncyYgc3luYywgZmxvYXQgdmlkZW9GcHNIaW50KSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZ2V0U3luY1NldHRpbmdzKEFWU3luY1NldHRpbmdzKiBzeW5jIC8qIG5vbm51bGwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB2aWRlb0ZwcyAvKiBub25udWxsICovKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2Vla1RvKAorICAgICAgICAgICAgaW50IG1zZWMsCisgICAgICAgICAgICBNZWRpYVBsYXllcjJTZWVrTW9kZSBtb2RlID0gTWVkaWFQbGF5ZXIyU2Vla01vZGU6OlNFRUtfUFJFVklPVVNfU1lOQykgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGdldEN1cnJlbnRQb3NpdGlvbihpbnQqIG1zZWMpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBnZXREdXJhdGlvbihpbnQqIG1zZWMpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBub3RpZnlBdChpbnQ2NF90IG1lZGlhVGltZVVzKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgcmVzZXQoKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0QXVkaW9TdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3QgdHlwZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldExvb3BpbmcoaW50IGxvb3ApID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRWb2x1bWUoZmxvYXQgbGVmdFZvbHVtZSwgZmxvYXQgcmlnaHRWb2x1bWUpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRBdXhFZmZlY3RTZW5kTGV2ZWwoZmxvYXQgbGV2ZWwpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBhdHRhY2hBdXhFZmZlY3QoaW50IGVmZmVjdElkKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0UGFyYW1ldGVyKGludCBrZXksIGNvbnN0IFBhcmNlbCYgcmVxdWVzdCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGdldFBhcmFtZXRlcihpbnQga2V5LCBQYXJjZWwqIHJlcGx5KSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0UmV0cmFuc21pdEVuZHBvaW50KGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiogZW5kcG9pbnQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBnZXRSZXRyYW5zbWl0RW5kcG9pbnQoc3RydWN0IHNvY2thZGRyX2luKiBlbmRwb2ludCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldE5leHRQbGF5ZXIoY29uc3Qgc3A8TWVkaWFQbGF5ZXIyRW5naW5lPiYgbmV4dCkgPSAwOworCisgICAgdmlydHVhbCBtZWRpYTo6Vm9sdW1lU2hhcGVyOjpTdGF0dXMgYXBwbHlWb2x1bWVTaGFwZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uPiYgY29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbj4mIG9wZXJhdGlvbikgPSAwOworICAgIHZpcnR1YWwgc3A8bWVkaWE6OlZvbHVtZVNoYXBlcjo6U3RhdGU+IGdldFZvbHVtZVNoYXBlclN0YXRlKGludCBpZCkgPSAwOworCisgICAgLy8gTW9kdWxhciBEUk0KKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBwcmVwYXJlRHJtKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIGRybVNlc3Npb25JZCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHJlbGVhc2VEcm0oKSA9IDA7CisKKyAgICAvLyBJbnZva2UgYSBnZW5lcmljIG1ldGhvZCBvbiB0aGUgcGxheWVyIGJ5IHVzaW5nIG9wYXF1ZSBwYXJjZWxzCisgICAgLy8gZm9yIHRoZSByZXF1ZXN0IGFuZCByZXBseS4KKyAgICAvLyBAcGFyYW0gcmVxdWVzdCBQYXJjZWwgdGhhdCBtdXN0IHN0YXJ0IHdpdGggdGhlIG1lZGlhIHBsYXllcgorICAgIC8vIGludGVyZmFjZSB0b2tlbi4KKyAgICAvLyBAcGFyYW1bb3V0XSByZXBseSBQYXJjZWwgdG8gaG9sZCB0aGUgcmVwbHkgZGF0YS4gQ2Fubm90IGJlIG51bGwuCisgICAgLy8gQHJldHVybiBPSyBpZiB0aGUgaW52b2NhdGlvbiB3YXMgbWFkZSBzdWNjZXNzZnVsbHkuCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgaW52b2tlKGNvbnN0IFBhcmNlbCYgcmVxdWVzdCwgUGFyY2VsICpyZXBseSkgPSAwOworCisgICAgLy8gU2V0IGEgbmV3IG1ldGFkYXRhIGZpbHRlci4KKyAgICAvLyBAcGFyYW0gZmlsdGVyIEEgc2V0IG9mIGFsbG93IGFuZCBkcm9wIHJ1bGVzIHNlcmlhbGl6ZWQgaW4gYSBQYXJjZWwuCisgICAgLy8gQHJldHVybiBPSyBpZiB0aGUgaW52b2NhdGlvbiB3YXMgbWFkZSBzdWNjZXNzZnVsbHkuCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0TWV0YWRhdGFGaWx0ZXIoY29uc3QgUGFyY2VsJiBmaWx0ZXIpID0gMDsKKworICAgIC8vIFJldHJpZXZlIGEgc2V0IG9mIG1ldGFkYXRhLgorICAgIC8vIEBwYXJhbSB1cGRhdGVfb25seSBJbmNsdWRlIG9ubHkgdGhlIG1ldGFkYXRhIHRoYXQgaGF2ZSBjaGFuZ2VkCisgICAgLy8gICAgICAgICAgICAgICAgICAgIHNpbmNlIHRoZSBsYXN0IGludm9jYXRpb24gb2YgZ2V0TWV0YWRhdGEuCisgICAgLy8gICAgICAgICAgICAgICAgICAgIFRoZSBzZXQgaXMgYnVpbHQgdXNpbmcgdGhlIHVuZmlsdGVyZWQKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9ucyB0aGUgbmF0aXZlIHBsYXllciBzZW50IHRvIHRoZQorICAgIC8vICAgICAgICAgICAgICAgICAgICBNZWRpYVBsYXllcjJNYW5hZ2VyIGR1cmluZyB0aGF0IHBlcmlvZCBvZgorICAgIC8vICAgICAgICAgICAgICAgICAgICB0aW1lLiBJZiBmYWxzZSwgYWxsIHRoZSBtZXRhZGF0YXMgYXJlIGNvbnNpZGVyZWQuCisgICAgLy8gQHBhcmFtIGFwcGx5X2ZpbHRlciBJZiB0cnVlLCBvbmNlIHRoZSBtZXRhZGF0YSBzZXQgaGFzIGJlZW4gYnVpbHQgYmFzZWQKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgIG9uIHRoZSB2YWx1ZSB1cGRhdGVfb25seSwgdGhlIGN1cnJlbnQgZmlsdGVyIGlzCisgICAgLy8gICAgICAgICAgICAgICAgICAgICBhcHBsaWVkLgorICAgIC8vIEBwYXJhbVtvdXRdIG1ldGFkYXRhIE9uIGV4aXQgY29udGFpbnMgYSBzZXQgKHBvc3NpYmx5IGVtcHR5KSBvZiBtZXRhZGF0YS4KKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICBWYWxpZCBvbmx5IGlmIHRoZSBjYWxsIHJldHVybmVkIE9LLgorICAgIC8vIEByZXR1cm4gT0sgaWYgdGhlIGludm9jYXRpb24gd2FzIG1hZGUgc3VjY2Vzc2Z1bGx5LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGdldE1ldGFkYXRhKGJvb2wgdXBkYXRlX29ubHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhcHBseV9maWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsICptZXRhZGF0YSkgPSAwOworCisgICAgLy8gQXVkaW9Sb3V0aW5nCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0T3V0cHV0RGV2aWNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBnZXRSb3V0ZWREZXZpY2VJZChhdWRpb19wb3J0X2hhbmRsZV90ICpkZXZpY2VJZCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soYm9vbCBlbmFibGVkKSA9IDA7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9NRURJQVBMQVlFUjJFTkdJTkVfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYVBsYXllcjJFbmdpbmVDbGllbnQuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFQbGF5ZXIyRW5naW5lQ2xpZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJkZjA5NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFQbGF5ZXIyRW5naW5lQ2xpZW50LmgKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBUExBWUVSMkVOR0lORUNMSUVOVF9ICisjZGVmaW5lIEFORFJPSURfTUVESUFQTEFZRVIyRU5HSU5FQ0xJRU5UX0gKKworI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTWVkaWFQbGF5ZXIyRW5naW5lQ2xpZW50OiBwdWJsaWMgUmVmQmFzZQoreworcHVibGljOgorICAgIHZpcnR1YWwgdm9pZCBub3RpZnkoaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKm9iaikgPSAwOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfTUVESUFQTEFZRVIyRU5HSU5FQ0xJRU5UX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFQbGF5ZXIySW50ZXJmYWNlLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhUGxheWVyMkludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMWExMTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhUGxheWVyMkludGVyZmFjZS5oCkBAIC0wLDAgKzEsMzQwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFQTEFZRVIySU5URVJGQUNFX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQVBMQVlFUjJJTlRFUkZBQ0VfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1RpbWVzdGFtcC5oPgorI2luY2x1ZGUgPG1lZGlhL0FWU3luY1NldHRpbmdzLmg+CisjaW5jbHVkZSA8bWVkaWEvQnVmZmVyaW5nU2V0dGluZ3MuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZXRhZGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL21lZGlhcGxheWVyMi5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXIuaD4KKworLy8gRndkIGRlY2wgdG8gbWFrZSBzdXJlIGV2ZXJ5b25lIGFncmVlcyB0aGF0IHRoZSBzY29wZSBvZiBzdHJ1Y3Qgc29ja2FkZHJfaW4gaXMKKy8vIGdsb2JhbCwgYW5kIG5vdCBpbiBhbmRyb2lkOjoKK3N0cnVjdCBzb2NrYWRkcl9pbjsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBEYXRhU291cmNlOworc3RydWN0IE1lZGlhSFRUUFNlcnZpY2U7CitjbGFzcyBQYXJjZWw7CitzdHJ1Y3QgQU5hdGl2ZVdpbmRvd1dyYXBwZXI7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIFNvcnRlZFZlY3RvcjsKKworZW51bSBwbGF5ZXIyX3R5cGUgeworICAgIFBMQVlFUjJfU1RBR0VGUklHSFRfUExBWUVSID0gMywKKyAgICBQTEFZRVIyX05VX1BMQVlFUjIgPSA0LAorICAgIC8vIFRlc3QgcGxheWVycyBhcmUgYXZhaWxhYmxlIG9ubHkgaW4gdGhlICd0ZXN0JyBhbmQgJ2VuZycgYnVpbGRzLgorICAgIC8vIFRoZSBzaGFyZWQgbGlicmFyeSB3aXRoIHRoZSB0ZXN0IHBsYXllciBpcyBwYXNzZWQgcGFzc2VkIGFzIGFuCisgICAgLy8gYXJndW1lbnQgdG8gdGhlICd0ZXN0OicgdXJsIGluIHRoZSBzZXREYXRhU291cmNlIGNhbGwuCisgICAgUExBWUVSMl9URVNUX1BMQVlFUiA9IDUsCit9OworCisKKyNkZWZpbmUgREVGQVVMVF9BVURJT1NJTktfQlVGRkVSQ09VTlQgNAorI2RlZmluZSBERUZBVUxUX0FVRElPU0lOS19CVUZGRVJTSVpFIDEyMDAKKyNkZWZpbmUgREVGQVVMVF9BVURJT1NJTktfU0FNUExFUkFURSA0NDEwMAorCisvLyB3aGVuIHRoZSBjaGFubmVsIG1hc2sgaXNuJ3Qga25vd24sIHVzZSB0aGUgY2hhbm5lbCBjb3VudCB0byBkZXJpdmUgYSBtYXNrIGluIEF1ZGlvU2luazo6b3BlbigpCisjZGVmaW5lIENIQU5ORUxfTUFTS19VU0VfQ0hBTk5FTF9PUkRFUiAwCisKKy8vIGR1cmF0aW9uIGJlbG93IHdoaWNoIHdlIGRvIG5vdCBhbGxvdyBkZWVwIGF1ZGlvIGJ1ZmZlcmluZworI2RlZmluZSBBVURJT19TSU5LX01JTl9ERUVQX0JVRkZFUl9EVVJBVElPTl9VUyA1MDAwMDAwCisKKy8vIGFic3RyYWN0IGJhc2UgY2xhc3MgLSB1c2UgTWVkaWFQbGF5ZXIySW50ZXJmYWNlCitjbGFzcyBNZWRpYVBsYXllcjJCYXNlIDogcHVibGljIEFIYW5kbGVyCit7CitwdWJsaWM6CisgICAgLy8gY2FsbGJhY2sgbWVjaGFuaXNtIGZvciBwYXNzaW5nIG1lc3NhZ2VzIHRvIE1lZGlhUGxheWVyMiBvYmplY3QKKyAgICB0eXBlZGVmIHZvaWQgKCpOb3RpZnlDYWxsYmFjaykoY29uc3Qgd3A8TWVkaWFQbGF5ZXIyRW5naW5lPiAmbGlzdGVuZXIsCisgICAgICAgICAgICBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqb2JqKTsKKworICAgIC8vIEF1ZGlvU2luazogYWJzdHJhY3Rpb24gbGF5ZXIgZm9yIGF1ZGlvIG91dHB1dAorICAgIGNsYXNzIEF1ZGlvU2luayA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGVudW0gY2JfZXZlbnRfdCB7CisgICAgICAgICAgICBDQl9FVkVOVF9GSUxMX0JVRkZFUiwgICAvLyBSZXF1ZXN0IHRvIHdyaXRlIG1vcmUgZGF0YSB0byBidWZmZXIuCisgICAgICAgICAgICBDQl9FVkVOVF9TVFJFQU1fRU5ELCAgICAvLyBTZW50IGFmdGVyIGFsbCB0aGUgYnVmZmVycyBxdWV1ZWQgaW4gQUYgYW5kIEhXIGFyZSBwbGF5ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2sgKGFmdGVyIHN0b3AgaXMgY2FsbGVkKQorICAgICAgICAgICAgQ0JfRVZFTlRfVEVBUl9ET1dOICAgICAgLy8gVGhlIEF1ZGlvVHJhY2sgd2FzIGludmFsaWRhdGVkIGR1ZSB0byB1c2UgY2FzZSBjaGFuZ2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIHJlLWV2YWx1YXRlIG9mZmxvYWRpbmcgb3B0aW9ucworICAgICAgICB9OworCisgICAgICAgIC8vIENhbGxiYWNrIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSB3cml0dGVuIHRvIHRoZSBidWZmZXIuCisgICAgICAgIHR5cGVkZWYgc2l6ZV90ICgqQXVkaW9DYWxsYmFjaykoCisgICAgICAgICAgICAgICAgQXVkaW9TaW5rICphdWRpb1NpbmssIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUsIHZvaWQgKmNvb2tpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNiX2V2ZW50X3QgZXZlbnQpOworCisgICAgICAgIHZpcnR1YWwgICAgICAgICAgICAgfkF1ZGlvU2luaygpIHt9CisgICAgICAgIHZpcnR1YWwgYm9vbCAgICAgICAgcmVhZHkoKSBjb25zdCA9IDA7IC8vIGF1ZGlvIG91dHB1dCBpcyBvcGVuIGFuZCByZWFkeQorICAgICAgICB2aXJ0dWFsIHNzaXplX3QgICAgIGJ1ZmZlclNpemUoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgc3NpemVfdCAgICAgZnJhbWVDb3VudCgpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBzc2l6ZV90ICAgICBjaGFubmVsQ291bnQoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgc3NpemVfdCAgICAgZnJhbWVTaXplKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIHVpbnQzMl90ICAgIGxhdGVuY3koKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgZmxvYXQgICAgICAgbXNlY3NQZXJGcmFtZSgpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRQb3NpdGlvbih1aW50MzJfdCAqcG9zaXRpb24pIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRUaW1lc3RhbXAoQXVkaW9UaW1lc3RhbXAgJnRzKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgaW50NjRfdCAgICAgZ2V0UGxheWVkT3V0RHVyYXRpb25VcyhpbnQ2NF90IG5vd1VzKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0RnJhbWVzV3JpdHRlbih1aW50MzJfdCAqZnJhbWVzd3JpdHRlbikgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIGF1ZGlvX3Nlc3Npb25fdCBnZXRTZXNzaW9uSWQoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgYXVkaW9fc3RyZWFtX3R5cGVfdCBnZXRBdWRpb1N0cmVhbVR5cGUoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgdWludDMyX3QgICAgZ2V0U2FtcGxlUmF0ZSgpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBpbnQ2NF90ICAgICBnZXRCdWZmZXJEdXJhdGlvbkluVXMoKSBjb25zdCA9IDA7CisKKyAgICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgaXMgc3BlY2lmaWVkLCB1c2UgdGhlICJ3cml0ZSIgQVBJIGJlbG93IHRvIHN1Ym1pdAorICAgICAgICAvLyBhdWRpbyBkYXRhLgorICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9wZW4oCisgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwgaW50IGNoYW5uZWxDb3VudCwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0PUFVRElPX0ZPUk1BVF9QQ01fMTZfQklULAorICAgICAgICAgICAgICAgIGludCBidWZmZXJDb3VudD1ERUZBVUxUX0FVRElPU0lOS19CVUZGRVJDT1VOVCwKKyAgICAgICAgICAgICAgICBBdWRpb0NhbGxiYWNrIGNiID0gTlVMTCwKKyAgICAgICAgICAgICAgICB2b2lkICpjb29raWUgPSBOVUxMLAorICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKKyAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8gPSBOVUxMLAorICAgICAgICAgICAgICAgIGJvb2wgZG9Ob3RSZWNvbm5lY3QgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBzdWdnZXN0ZWRGcmFtZUNvdW50ID0gMCkgPSAwOworCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc3RhcnQoKSA9IDA7CisKKyAgICAgICAgLyogSW5wdXQgcGFyYW1ldGVyIHxzaXplfCBpcyBpbiBieXRlIHVuaXRzIHN0b3JlZCBpbiB8YnVmZmVyfC4KKyAgICAgICAgICogRGF0YSBpcyBjb3BpZWQgb3ZlciBhbmQgYWN0dWFsIG51bWJlciBvZiBieXRlcyB3cml0dGVuICg+PSAwKQorICAgICAgICAgKiBpcyByZXR1cm5lZCwgb3Igbm8gZGF0YSBpcyBjb3BpZWQgYW5kIGEgbmVnYXRpdmUgc3RhdHVzIGNvZGUKKyAgICAgICAgICogaXMgcmV0dXJuZWQgKGV2ZW4gd2hlbiB8YmxvY2tpbmd8IGlzIHRydWUpLgorICAgICAgICAgKiBXaGVuIHxibG9ja2luZ3wgaXMgZmFsc2UsIEF1ZGlvU2luayB3aWxsIGltbWVkaWF0ZWx5IHJldHVybiBhZnRlcgorICAgICAgICAgKiBwYXJ0IG9mIG9yIGZ1bGwgfGJ1ZmZlcnwgaXMgY29waWVkIG92ZXIuCisgICAgICAgICAqIFdoZW4gfGJsb2NraW5nfCBpcyB0cnVlLCBBdWRpb1Npbmsgd2lsbCB3YWl0IHRvIGNvcHkgdGhlIGVudGlyZQorICAgICAgICAgKiBidWZmZXIsIHVubGVzcyBhbiBlcnJvciBvY2N1cnMgb3IgdGhlIGNvcHkgb3BlcmF0aW9uIGlzCisgICAgICAgICAqIHByZW1hdHVyZWx5IHN0b3BwZWQuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHNzaXplX3QgICAgIHdyaXRlKGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUsIGJvb2wgYmxvY2tpbmcgPSB0cnVlKSA9IDA7CisKKyAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICBzdG9wKCkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIGZsdXNoKCkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHBhdXNlKCkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIGNsb3NlKCkgPSAwOworCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0UGxheWJhY2tSYXRlKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlJiByYXRlKSA9IDA7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0UGxheWJhY2tSYXRlKEF1ZGlvUGxheWJhY2tSYXRlKiByYXRlIC8qIG5vbm51bGwgKi8pID0gMDsKKyAgICAgICAgdmlydHVhbCBib29sICAgICAgICBuZWVkc1RyYWlsaW5nUGFkZGluZygpIHsgcmV0dXJuIHRydWU7IH0KKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYgLyoga2V5VmFsdWVQYWlycyAqLykgeyByZXR1cm4gTk9fRVJST1I7IH0KKyAgICAgICAgdmlydHVhbCBTdHJpbmc4ICAgICBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIC8qIGtleXMgKi8pIHsgcmV0dXJuIFN0cmluZzg6OmVtcHR5KCk7IH0KKworICAgICAgICB2aXJ0dWFsIG1lZGlhOjpWb2x1bWVTaGFwZXI6OlN0YXR1cyBhcHBseVZvbHVtZVNoYXBlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24+JiBjb25maWd1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8bWVkaWE6OlZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uPiYgb3BlcmF0aW9uKTsKKyAgICAgICAgdmlydHVhbCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpTdGF0ZT4gZ2V0Vm9sdW1lU2hhcGVyU3RhdGUoaW50IGlkKTsKKworICAgICAgICAvLyBBdWRpb1JvdXRpbmcKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRPdXRwdXREZXZpY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0Um91dGVkRGV2aWNlSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCogZGV2aWNlSWQpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soYm9vbCBlbmFibGVkKTsKKyAgICB9OworCisgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVBsYXllcjJCYXNlKCkgOiBtQ2xpZW50KDApLCBtTm90aWZ5KDApIHt9CisgICAgdmlydHVhbCAgICAgICAgICAgICB+TWVkaWFQbGF5ZXIyQmFzZSgpIHt9CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBpbml0Q2hlY2soKSA9IDA7CisgICAgdmlydHVhbCBib29sICAgICAgICBoYXJkd2FyZU91dHB1dCgpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0VUlEKHVpZF90IC8qIHVpZCAqLykgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXREYXRhU291cmNlKAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLAorICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMgPSBOVUxMKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0RGF0YVNvdXJjZShjb25zdCBzcDxJU3RyZWFtU291cmNlPiYgLyogc291cmNlICovKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldERhdGFTb3VyY2UoY29uc3Qgc3A8RGF0YVNvdXJjZT4mIC8qIHNvdXJjZSAqLykgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgLy8gcGFzcyB0aGUgYnVmZmVyZWQgbmF0aXZlIHdpbmRvdyB0byB0aGUgbWVkaWEgcGxheWVyIHNlcnZpY2UKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFZpZGVvU3VyZmFjZVRleHR1cmUoY29uc3Qgc3A8QU5hdGl2ZVdpbmRvd1dyYXBwZXI+JiBud3cpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0QnVmZmVyaW5nU2V0dGluZ3MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcmluZ1NldHRpbmdzKiBidWZmZXJpbmcgLyogbm9ubnVsbCAqLykgeworICAgICAgICAqYnVmZmVyaW5nID0gQnVmZmVyaW5nU2V0dGluZ3MoKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldEJ1ZmZlcmluZ1NldHRpbmdzKGNvbnN0IEJ1ZmZlcmluZ1NldHRpbmdzJiAvKiBidWZmZXJpbmcgKi8pIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgcHJlcGFyZSgpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHByZXBhcmVBc3luYygpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHN0YXJ0KCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc3RvcCgpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHBhdXNlKCkgPSAwOworICAgIHZpcnR1YWwgYm9vbCAgICAgICAgaXNQbGF5aW5nKCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0UGxheWJhY2tTZXR0aW5ncyhjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSYgcmF0ZSkgeworICAgICAgICAvLyBieSBkZWZhdWx0LCBwbGF5ZXJzIG9ubHkgc3VwcG9ydCBzZXR0aW5nIHJhdGUgdG8gdGhlIGRlZmF1bHQKKyAgICAgICAgaWYgKCFpc0F1ZGlvUGxheWJhY2tSYXRlRXF1YWwocmF0ZSwgQVVESU9fUExBWUJBQ0tfUkFURV9ERUZBVUxUKSkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gT0s7CisgICAgfQorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0UGxheWJhY2tTZXR0aW5ncyhBdWRpb1BsYXliYWNrUmF0ZSogcmF0ZSAvKiBub25udWxsICovKSB7CisgICAgICAgICpyYXRlID0gQVVESU9fUExBWUJBQ0tfUkFURV9ERUZBVUxUOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0U3luY1NldHRpbmdzKGNvbnN0IEFWU3luY1NldHRpbmdzJiBzeW5jLCBmbG9hdCAvKiB2aWRlb0ZwcyAqLykgeworICAgICAgICAvLyBCeSBkZWZhdWx0LCBwbGF5ZXJzIG9ubHkgc3VwcG9ydCBzZXR0aW5nIHN5bmMgc291cmNlIHRvIGRlZmF1bHQ7IGFsbCBvdGhlciBzeW5jCisgICAgICAgIC8vIHNldHRpbmdzIGFyZSBpZ25vcmVkLiBUaGVyZSBpcyBubyByZXF1aXJlbWVudCBmb3IgZ2V0dGVycyB0byByZXR1cm4gc2V0IHZhbHVlcy4KKyAgICAgICAgaWYgKHN5bmMubVNvdXJjZSAhPSBBVlNZTkNfU09VUkNFX0RFRkFVTFQpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGdldFN5bmNTZXR0aW5ncygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZTeW5jU2V0dGluZ3MqIHN5bmMgLyogbm9ubnVsbCAqLywgZmxvYXQqIHZpZGVvRnBzIC8qIG5vbm51bGwgKi8pIHsKKyAgICAgICAgKnN5bmMgPSBBVlN5bmNTZXR0aW5ncygpOworICAgICAgICAqdmlkZW9GcHMgPSAtMS5mOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2Vla1RvKAorICAgICAgICAgICAgaW50IG1zZWMsIE1lZGlhUGxheWVyMlNlZWtNb2RlIG1vZGUgPSBNZWRpYVBsYXllcjJTZWVrTW9kZTo6U0VFS19QUkVWSU9VU19TWU5DKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRDdXJyZW50UG9zaXRpb24oaW50ICptc2VjKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXREdXJhdGlvbihpbnQgKm1zZWMpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHJlc2V0KCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgbm90aWZ5QXQoaW50NjRfdCAvKiBtZWRpYVRpbWVVcyAqLykgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0TG9vcGluZyhpbnQgbG9vcCkgPSAwOworICAgIHZpcnR1YWwgcGxheWVyMl90eXBlIHBsYXllclR5cGUoKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRQYXJhbWV0ZXIoaW50IGtleSwgY29uc3QgUGFyY2VsICZyZXF1ZXN0KSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRQYXJhbWV0ZXIoaW50IGtleSwgUGFyY2VsICpyZXBseSkgPSAwOworCisgICAgLy8gZGVmYXVsdCBuby1vcCBpbXBsZW1lbnRhdGlvbiBvZiBvcHRpb25hbCBleHRlbnNpb25zCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRSZXRyYW5zbWl0RW5kcG9pbnQoY29uc3Qgc3RydWN0IHNvY2thZGRyX2luKiAvKiBlbmRwb2ludCAqLykgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UmV0cmFuc21pdEVuZHBvaW50KHN0cnVjdCBzb2NrYWRkcl9pbiogLyogZW5kcG9pbnQgKi8pIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE5leHRQbGF5ZXIoY29uc3Qgc3A8TWVkaWFQbGF5ZXIyQmFzZT4mIC8qIG5leHQgKi8pIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIC8vIEludm9rZSBhIGdlbmVyaWMgbWV0aG9kIG9uIHRoZSBwbGF5ZXIgYnkgdXNpbmcgb3BhcXVlIHBhcmNlbHMKKyAgICAvLyBmb3IgdGhlIHJlcXVlc3QgYW5kIHJlcGx5LgorICAgIC8vCisgICAgLy8gQHBhcmFtIHJlcXVlc3QgUGFyY2VsIHRoYXQgaXMgcG9zaXRpb25lZCBhdCB0aGUgc3RhcnQgb2YgdGhlCisgICAgLy8gICAgICAgICAgICAgICAgZGF0YSBzZW50IGJ5IHRoZSBqYXZhIGxheWVyLgorICAgIC8vIEBwYXJhbVtvdXRdIHJlcGx5IFBhcmNlbCB0byBob2xkIHRoZSByZXBseSBkYXRhLiBDYW5ub3QgYmUgbnVsbC4KKyAgICAvLyBAcmV0dXJuIE9LIGlmIHRoZSBjYWxsIHdhcyBzdWNjZXNzZnVsLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgaW52b2tlKGNvbnN0IFBhcmNlbCYgcmVxdWVzdCwgUGFyY2VsICpyZXBseSkgPSAwOworCisgICAgLy8gVGhlIENsaWVudCBpbiB0aGUgTWV0YWRhdGFQbGF5ZXJTZXJ2aWNlIGNhbGxzIHRoaXMgbWV0aG9kIG9uCisgICAgLy8gdGhlIG5hdGl2ZSBwbGF5ZXIgdG8gcmV0cmlldmUgYWxsIG9yIGEgc3Vic2V0IG9mIG1ldGFkYXRhLgorICAgIC8vCisgICAgLy8gQHBhcmFtIGlkcyBTb3J0ZWRMaXN0IG9mIG1ldGFkYXRhIElEIHRvIGJlIGZldGNoLiBJZiBlbXB0eSwgYWxsCisgICAgLy8gICAgICAgICAgICB0aGUga25vd24gbWV0YWRhdGEgc2hvdWxkIGJlIHJldHVybmVkLgorICAgIC8vIEBwYXJhbVtpbm91dF0gcmVjb3JkcyBQYXJjZWwgd2hlcmUgdGhlIHBsYXllciBhcHBlbmRzIGl0cyBtZXRhZGF0YS4KKyAgICAvLyBAcmV0dXJuIE9LIGlmIHRoZSBjYWxsIHdhcyBzdWNjZXNzZnVsLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0TWV0YWRhdGEoY29uc3QgbWVkaWE6Ok1ldGFkYXRhOjpGaWx0ZXImIC8qIGlkcyAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogLyogcmVjb3JkcyAqLykgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfTsKKworICAgIHZvaWQgICAgICAgIHNldE5vdGlmeUNhbGxiYWNrKAorICAgICAgICAgICAgY29uc3Qgd3A8TWVkaWFQbGF5ZXIyRW5naW5lPiAmY2xpZW50LCBOb3RpZnlDYWxsYmFjayBub3RpZnlGdW5jKSB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTm90aWZ5TG9jayk7CisgICAgICAgIG1DbGllbnQgPSBjbGllbnQ7IG1Ob3RpZnkgPSBub3RpZnlGdW5jOworICAgIH0KKworICAgIHZvaWQgICAgICAgIHNlbmRFdmVudChpbnQgbXNnLCBpbnQgZXh0MT0wLCBpbnQgZXh0Mj0wLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwgKm9iaj1OVUxMKSB7CisgICAgICAgIE5vdGlmeUNhbGxiYWNrIG5vdGlmeUNCOworICAgICAgICB3cDxNZWRpYVBsYXllcjJFbmdpbmU+IGNsaWVudDsKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Ob3RpZnlMb2NrKTsKKyAgICAgICAgICAgIG5vdGlmeUNCID0gbU5vdGlmeTsKKyAgICAgICAgICAgIGNsaWVudCA9IG1DbGllbnQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAobm90aWZ5Q0IpIG5vdGlmeUNCKGNsaWVudCwgbXNnLCBleHQxLCBleHQyLCBvYmopOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgLyogZmQgKi8sIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIC8qIGFyZ3MgKi8pIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJiAvKiBtc2cgKi8pIG92ZXJyaWRlIHsgfQorCisgICAgLy8gTW9kdWxhciBEUk0KKyAgICB2aXJ0dWFsIHN0YXR1c190IHByZXBhcmVEcm0oY29uc3QgdWludDhfdCAvKiB1dWlkICovWzE2XSwgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiAvKiBkcm1TZXNzaW9uSWQgKi8pIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VEcm0oKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIE1lZGlhUGxheWVyMk1hbmFnZXI7CisKKyAgICBNdXRleCAgICAgICAgICAgICAgICAgIG1Ob3RpZnlMb2NrOworICAgIHdwPE1lZGlhUGxheWVyMkVuZ2luZT4gbUNsaWVudDsKKyAgICBOb3RpZnlDYWxsYmFjayAgICAgICAgIG1Ob3RpZnk7Cit9OworCisvLyBJbXBsZW1lbnQgdGhpcyBjbGFzcyBmb3IgbWVkaWEgcGxheWVycyB0aGF0IHVzZSB0aGUgQXVkaW9GbGluZ2VyIHNvZnR3YXJlIG1peGVyCitjbGFzcyBNZWRpYVBsYXllcjJJbnRlcmZhY2UgOiBwdWJsaWMgTWVkaWFQbGF5ZXIyQmFzZQoreworcHVibGljOgorICAgIHZpcnR1YWwgICAgICAgICAgICAgfk1lZGlhUGxheWVyMkludGVyZmFjZSgpIHsgfQorICAgIHZpcnR1YWwgYm9vbCAgICAgICAgaGFyZHdhcmVPdXRwdXQoKSB7IHJldHVybiBmYWxzZTsgfQorICAgIHZpcnR1YWwgdm9pZCAgICAgICAgc2V0QXVkaW9TaW5rKGNvbnN0IHNwPEF1ZGlvU2luaz4mIGF1ZGlvU2luaykgeyBtQXVkaW9TaW5rID0gYXVkaW9TaW5rOyB9Citwcm90ZWN0ZWQ6CisgICAgc3A8QXVkaW9TaW5rPiAgICAgICBtQXVkaW9TaW5rOworfTsKKworLy8gSW1wbGVtZW50IHRoaXMgY2xhc3MgZm9yIG1lZGlhIHBsYXllcnMgdGhhdCBvdXRwdXQgYXVkaW8gZGlyZWN0bHkgdG8gaGFyZHdhcmUKK2NsYXNzIE1lZGlhUGxheWVyMkhXSW50ZXJmYWNlIDogcHVibGljIE1lZGlhUGxheWVyMkJhc2UKK3sKK3B1YmxpYzoKKyAgICB2aXJ0dWFsICAgICAgICAgICAgIH5NZWRpYVBsYXllcjJIV0ludGVyZmFjZSgpIHt9CisgICAgdmlydHVhbCBib29sICAgICAgICBoYXJkd2FyZU91dHB1dCgpIHsgcmV0dXJuIHRydWU7IH0KKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFZvbHVtZShmbG9hdCBsZWZ0Vm9sdW1lLCBmbG9hdCByaWdodFZvbHVtZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0QXVkaW9TdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSkgPSAwOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKworI2VuZGlmIC8vIEFORFJPSURfTUVESUFQTEFZRVIySU5URVJGQUNFX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTmRrV3JhcHBlci5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9OZGtXcmFwcGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBlMGZkNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTmRrV3JhcHBlci5oCkBAIC0wLDAgKzEsMzI1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE5ES19XUkFQUEVSX0hfCisKKyNkZWZpbmUgTkRLX1dSQVBQRVJfSF8KKworI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXJyb3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUV4dHJhY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0NyeXB0b0FQSS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKK3N0cnVjdCBBTWVkaWFDb2RlYzsKK3N0cnVjdCBBTWVkaWFDb2RlY0J1ZmZlckluZm87CitzdHJ1Y3QgQU1lZGlhQ29kZWNDcnlwdG9JbmZvOworc3RydWN0IEFNZWRpYUNyeXB0bzsKK3N0cnVjdCBBTWVkaWFEcm07CitzdHJ1Y3QgQU1lZGlhRm9ybWF0Oworc3RydWN0IEFNZWRpYUV4dHJhY3RvcjsKK3N0cnVjdCBBTmF0aXZlV2luZG93Oworc3RydWN0IFBzc2hJbmZvOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBBTWVzc2FnZTsKK2NsYXNzIE1ldGFEYXRhOworCitzdHJ1Y3QgQU1lZGlhRm9ybWF0V3JhcHBlciA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBzdGF0aWMgc3A8QU1lZGlhRm9ybWF0V3JhcHBlcj4gQ3JlYXRlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbWVzc2FnZSk7CisKKyAgICBBTWVkaWFGb3JtYXRXcmFwcGVyKCk7CisgICAgQU1lZGlhRm9ybWF0V3JhcHBlcihBTWVkaWFGb3JtYXQgKmFNZWRpYUZvcm1hdCk7CisKKyAgICAvLyB0aGUgcmV0dXJuZWQgQU1lZGlhRm9ybWF0IGlzIHN0aWxsIG93bmVkIGJ5IHRoaXMgd3JhcHBlci4KKyAgICBBTWVkaWFGb3JtYXQgKmdldEFNZWRpYUZvcm1hdCgpIGNvbnN0OworCisgICAgc3A8QU1lc3NhZ2U+IHRvQU1lc3NhZ2UoKSBjb25zdCA7CisgICAgY29uc3QgY2hhciogdG9TdHJpbmcoKSBjb25zdCA7CisKKyAgICBzdGF0dXNfdCByZWxlYXNlKCk7CisKKyAgICBib29sIGdldEludDMyKGNvbnN0IGNoYXIgKm5hbWUsIGludDMyX3QgKm91dCkgY29uc3Q7CisgICAgYm9vbCBnZXRJbnQ2NChjb25zdCBjaGFyICpuYW1lLCBpbnQ2NF90ICpvdXQpIGNvbnN0OworICAgIGJvb2wgZ2V0RmxvYXQoY29uc3QgY2hhciAqbmFtZSwgZmxvYXQgKm91dCkgY29uc3Q7CisgICAgYm9vbCBnZXREb3VibGUoY29uc3QgY2hhciAqbmFtZSwgZG91YmxlICpvdXQpIGNvbnN0OworICAgIGJvb2wgZ2V0U2l6ZShjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgKm91dCkgY29uc3Q7CisgICAgYm9vbCBnZXRSZWN0KGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgIGludDMyX3QgKmxlZnQsIGludDMyX3QgKnRvcCwgaW50MzJfdCAqcmlnaHQsIGludDMyX3QgKmJvdHRvbSkgY29uc3Q7CisgICAgYm9vbCBnZXRCdWZmZXIoY29uc3QgY2hhciAqbmFtZSwgdm9pZCoqIGRhdGEsIHNpemVfdCAqb3V0c2l6ZSkgY29uc3Q7CisgICAgYm9vbCBnZXRTdHJpbmcoY29uc3QgY2hhciAqbmFtZSwgQVN0cmluZyAqb3V0KSBjb25zdDsKKworICAgIHZvaWQgc2V0SW50MzIoY29uc3QgY2hhciogbmFtZSwgaW50MzJfdCB2YWx1ZSk7CisgICAgdm9pZCBzZXRJbnQ2NChjb25zdCBjaGFyKiBuYW1lLCBpbnQ2NF90IHZhbHVlKTsKKyAgICB2b2lkIHNldEZsb2F0KGNvbnN0IGNoYXIqIG5hbWUsIGZsb2F0IHZhbHVlKTsKKyAgICB2b2lkIHNldERvdWJsZShjb25zdCBjaGFyICpuYW1lLCBkb3VibGUgdmFsdWUpOworICAgIHZvaWQgc2V0U2l6ZShjb25zdCBjaGFyKiBuYW1lLCBzaXplX3QgdmFsdWUpOworICAgIHZvaWQgc2V0UmVjdChjb25zdCBjaGFyKiBuYW1lLAorICAgICAgICAgICAgICAgICBpbnQzMl90IGxlZnQsIGludDMyX3QgdG9wLCBpbnQzMl90IHJpZ2h0LCBpbnQzMl90IGJvdHRvbSk7CisgICAgdm9pZCBzZXRTdHJpbmcoY29uc3QgY2hhciogbmFtZSwgY29uc3QgQVN0cmluZyAmdmFsdWUpOworICAgIHZvaWQgc2V0QnVmZmVyKGNvbnN0IGNoYXIqIG5hbWUsIHZvaWQqIGRhdGEsIHNpemVfdCBzaXplKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkFNZWRpYUZvcm1hdFdyYXBwZXIoKTsKKworcHJpdmF0ZToKKyAgICBBTWVkaWFGb3JtYXQgKm1BTWVkaWFGb3JtYXQ7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBTWVkaWFGb3JtYXRXcmFwcGVyKTsKK307CisKK3N0cnVjdCBBTmF0aXZlV2luZG93V3JhcHBlciA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBBTmF0aXZlV2luZG93V3JhcHBlcihBTmF0aXZlV2luZG93ICphTmF0aXZlV2luZG93KTsKKworICAgIC8vIHRoZSByZXR1cm5lZCBBTmF0aXZlV2luZG93IGlzIHN0aWxsIG93bmVkIGJ5IHRoaXMgd3JhcHBlci4KKyAgICBBTmF0aXZlV2luZG93ICpnZXRBTmF0aXZlV2luZG93KCkgY29uc3Q7CisKKyAgICBzdGF0dXNfdCByZWxlYXNlKCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5BTmF0aXZlV2luZG93V3JhcHBlcigpOworCitwcml2YXRlOgorICAgIEFOYXRpdmVXaW5kb3cgKm1BTmF0aXZlV2luZG93OworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQU5hdGl2ZVdpbmRvd1dyYXBwZXIpOworfTsKKworc3RydWN0IEFNZWRpYURybVdyYXBwZXIgOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgQU1lZGlhRHJtV3JhcHBlcihjb25zdCB1aW50OF90IHV1aWRbMTZdKTsKKyAgICBBTWVkaWFEcm1XcmFwcGVyKEFNZWRpYURybSAqYU1lZGlhRHJtKTsKKworICAgIC8vIHRoZSByZXR1cm5lZCBBTWVkaWFEcm0gaXMgc3RpbGwgb3duZWQgYnkgdGhpcyB3cmFwcGVyLgorICAgIEFNZWRpYURybSAqZ2V0QU1lZGlhRHJtKCkgY29uc3Q7CisKKyAgICBzdGF0dXNfdCByZWxlYXNlKCk7CisKKyAgICBzdGF0aWMgYm9vbCBpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZChjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBjaGFyICptaW1lVHlwZSk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5BTWVkaWFEcm1XcmFwcGVyKCk7CisKK3ByaXZhdGU6CisgICAgQU1lZGlhRHJtICptQU1lZGlhRHJtOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQU1lZGlhRHJtV3JhcHBlcik7Cit9OworCitzdHJ1Y3QgQU1lZGlhQ3J5cHRvV3JhcHBlciA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBBTWVkaWFDcnlwdG9XcmFwcGVyKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICppbml0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpbml0RGF0YVNpemUpOworICAgIEFNZWRpYUNyeXB0b1dyYXBwZXIoQU1lZGlhQ3J5cHRvICphTWVkaWFDcnlwdG8pOworCisgICAgLy8gdGhlIHJldHVybmVkIEFNZWRpYUNyeXB0byBpcyBzdGlsbCBvd25lZCBieSB0aGlzIHdyYXBwZXIuCisgICAgQU1lZGlhQ3J5cHRvICpnZXRBTWVkaWFDcnlwdG8oKSBjb25zdDsKKworICAgIHN0YXR1c190IHJlbGVhc2UoKTsKKworICAgIGJvb2wgaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgdWludDhfdCB1dWlkWzE2XSk7CisKKyAgICBib29sIHJlcXVpcmVzU2VjdXJlRGVjb2RlckNvbXBvbmVudChjb25zdCBjaGFyICptaW1lKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkFNZWRpYUNyeXB0b1dyYXBwZXIoKTsKKworcHJpdmF0ZToKKyAgICBBTWVkaWFDcnlwdG8gKm1BTWVkaWFDcnlwdG87CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBTWVkaWFDcnlwdG9XcmFwcGVyKTsKK307CisKK3N0cnVjdCBBTWVkaWFDb2RlY0NyeXB0b0luZm9XcmFwcGVyIDogcHVibGljIFJlZkJhc2UgeworICAgIHN0YXRpYyBzcDxBTWVkaWFDb2RlY0NyeXB0b0luZm9XcmFwcGVyPiBDcmVhdGUoc3A8TWV0YURhdGE+IG1ldGEpOworCisgICAgQU1lZGlhQ29kZWNDcnlwdG9JbmZvV3JhcHBlcihpbnQgbnVtc3Vic2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qga2V5WzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgaXZbMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3J5cHRvUGx1Z2luOjpNb2RlIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKmNsZWFyYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKmVuY3J5cHRlZGJ5dGVzKTsKKyAgICBBTWVkaWFDb2RlY0NyeXB0b0luZm9XcmFwcGVyKEFNZWRpYUNvZGVjQ3J5cHRvSW5mbyAqYU1lZGlhQ29kZWNDcnlwdG9JbmZvKTsKKworICAgIC8vIHRoZSByZXR1cm5lZCBBTWVkaWFDcnlwdG9JbmZvIGlzIHN0aWxsIG93bmVkIGJ5IHRoaXMgd3JhcHBlci4KKyAgICBBTWVkaWFDb2RlY0NyeXB0b0luZm8gKmdldEFNZWRpYUNvZGVjQ3J5cHRvSW5mbygpIGNvbnN0OworCisgICAgc3RhdHVzX3QgcmVsZWFzZSgpOworCisgICAgdm9pZCBzZXRQYXR0ZXJuKENyeXB0b1BsdWdpbjo6UGF0dGVybiAqcGF0dGVybik7CisKKyAgICBzaXplX3QgZ2V0TnVtU3ViU2FtcGxlcygpOworCisgICAgc3RhdHVzX3QgZ2V0S2V5KHVpbnQ4X3QgKmRzdCk7CisKKyAgICBzdGF0dXNfdCBnZXRJVih1aW50OF90ICpkc3QpOworCisgICAgQ3J5cHRvUGx1Z2luOjpNb2RlIGdldE1vZGUoKTsKKworICAgIHN0YXR1c190IGdldENsZWFyQnl0ZXMoc2l6ZV90ICpkc3QpOworCisgICAgc3RhdHVzX3QgZ2V0RW5jcnlwdGVkQnl0ZXMoc2l6ZV90ICpkc3QpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+QU1lZGlhQ29kZWNDcnlwdG9JbmZvV3JhcHBlcigpOworCitwcml2YXRlOgorICAgIEFNZWRpYUNvZGVjQ3J5cHRvSW5mbyAqbUFNZWRpYUNvZGVjQ3J5cHRvSW5mbzsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEFNZWRpYUNvZGVjQ3J5cHRvSW5mb1dyYXBwZXIpOworfTsKKworc3RydWN0IEFNZWRpYUNvZGVjV3JhcHBlciA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBlbnVtIHsKKyAgICAgICAgQ0JfSU5QVVRfQVZBSUxBQkxFID0gMSwKKyAgICAgICAgQ0JfT1VUUFVUX0FWQUlMQUJMRSA9IDIsCisgICAgICAgIENCX0VSUk9SID0gMywKKyAgICAgICAgQ0JfT1VUUFVUX0ZPUk1BVF9DSEFOR0VEID0gNCwKKyAgICB9OworCisgICAgc3RhdGljIHNwPEFNZWRpYUNvZGVjV3JhcHBlcj4gQ3JlYXRlQ29kZWNCeU5hbWUoY29uc3QgQVN0cmluZyAmbmFtZSk7CisgICAgc3RhdGljIHNwPEFNZWRpYUNvZGVjV3JhcHBlcj4gQ3JlYXRlRGVjb2RlckJ5VHlwZShjb25zdCBBU3RyaW5nICZtaW1lVHlwZSk7CisKKyAgICBzdGF0aWMgdm9pZCBPbklucHV0QXZhaWxhYmxlQ0IoQU1lZGlhQ29kZWMgKmNvZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpbmRleCk7CisgICAgc3RhdGljIHZvaWQgT25PdXRwdXRBdmFpbGFibGVDQihBTWVkaWFDb2RlYyAqY29kZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFDb2RlY0J1ZmZlckluZm8gKmJ1ZmZlckluZm8pOworICAgIHN0YXRpYyB2b2lkIE9uRm9ybWF0Q2hhbmdlZENCKEFNZWRpYUNvZGVjICpjb2RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKmZvcm1hdCk7CisgICAgc3RhdGljIHZvaWQgT25FcnJvckNCKEFNZWRpYUNvZGVjICpjb2RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhX3N0YXR1c190IGVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBhY3Rpb25Db2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXRhaWwpOworCisgICAgQU1lZGlhQ29kZWNXcmFwcGVyKEFNZWRpYUNvZGVjICphTWVkaWFDb2RlYyk7CisKKyAgICAvLyB0aGUgcmV0dXJuZWQgQU1lZGlhQ29kZWMgaXMgc3RpbGwgb3duZWQgYnkgdGhpcyB3cmFwcGVyLgorICAgIEFNZWRpYUNvZGVjICpnZXRBTWVkaWFDb2RlYygpIGNvbnN0OworCisgICAgc3RhdHVzX3QgcmVsZWFzZSgpOworCisgICAgc3RhdHVzX3QgZ2V0TmFtZShBU3RyaW5nKiBvdXRDb21wb25lbnROYW1lKSBjb25zdDsKKworICAgIHN0YXR1c190IGNvbmZpZ3VyZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZWRpYUZvcm1hdFdyYXBwZXI+ICZmb3JtYXQsCisgICAgICAgICAgICBjb25zdCBzcDxBTmF0aXZlV2luZG93V3JhcHBlcj4gJm53dywKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZWRpYUNyeXB0b1dyYXBwZXI+ICZjcnlwdG8sCisgICAgICAgICAgICB1aW50MzJfdCBmbGFncyk7CisKKyAgICBzdGF0dXNfdCBzZXRDYWxsYmFjayhjb25zdCBzcDxBTWVzc2FnZT4gJmNhbGxiYWNrKTsKKworICAgIHN0YXR1c190IHJlbGVhc2VDcnlwdG8oKTsKKworICAgIHN0YXR1c190IHN0YXJ0KCk7CisgICAgc3RhdHVzX3Qgc3RvcCgpOworICAgIHN0YXR1c190IGZsdXNoKCk7CisKKyAgICB1aW50OF90KiBnZXRJbnB1dEJ1ZmZlcihzaXplX3QgaWR4LCBzaXplX3QgKm91dF9zaXplKTsKKyAgICB1aW50OF90KiBnZXRPdXRwdXRCdWZmZXIoc2l6ZV90IGlkeCwgc2l6ZV90ICpvdXRfc2l6ZSk7CisKKyAgICBzdGF0dXNfdCBxdWV1ZUlucHV0QnVmZmVyKAorICAgICAgICAgICAgc2l6ZV90IGlkeCwKKyAgICAgICAgICAgIHNpemVfdCBvZmZzZXQsCisgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgIHVpbnQ2NF90IHRpbWUsCisgICAgICAgICAgICB1aW50MzJfdCBmbGFncyk7CisKKyAgICBzdGF0dXNfdCBxdWV1ZVNlY3VyZUlucHV0QnVmZmVyKAorICAgICAgICAgICAgc2l6ZV90IGlkeCwKKyAgICAgICAgICAgIHNpemVfdCBvZmZzZXQsCisgICAgICAgICAgICBzcDxBTWVkaWFDb2RlY0NyeXB0b0luZm9XcmFwcGVyPiAmY29kZWNDcnlwdG9JbmZvLAorICAgICAgICAgICAgdWludDY0X3QgdGltZSwKKyAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzKTsKKworICAgIHNwPEFNZWRpYUZvcm1hdFdyYXBwZXI+IGdldE91dHB1dEZvcm1hdCgpOworICAgIHNwPEFNZWRpYUZvcm1hdFdyYXBwZXI+IGdldElucHV0Rm9ybWF0KCk7CisKKyAgICBzdGF0dXNfdCByZWxlYXNlT3V0cHV0QnVmZmVyKHNpemVfdCBpZHgsIGJvb2wgcmVuZGVyKTsKKworICAgIHN0YXR1c190IHNldE91dHB1dFN1cmZhY2UoY29uc3Qgc3A8QU5hdGl2ZVdpbmRvd1dyYXBwZXI+ICZud3cpOworCisgICAgc3RhdHVzX3QgcmVsZWFzZU91dHB1dEJ1ZmZlckF0VGltZShzaXplX3QgaWR4LCBpbnQ2NF90IHRpbWVzdGFtcE5zKTsKKworICAgIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lZGlhRm9ybWF0V3JhcHBlcj4gJnBhcmFtcyk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5BTWVkaWFDb2RlY1dyYXBwZXIoKTsKKworcHJpdmF0ZToKKyAgICBBTWVkaWFDb2RlYyAqbUFNZWRpYUNvZGVjOworCisgICAgc3A8QU1lc3NhZ2U+IG1DYWxsYmFjazsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEFNZWRpYUNvZGVjV3JhcHBlcik7Cit9OworCitzdHJ1Y3QgQU1lZGlhRXh0cmFjdG9yV3JhcHBlciA6IHB1YmxpYyBSZWZCYXNlIHsKKworICAgIEFNZWRpYUV4dHJhY3RvcldyYXBwZXIoQU1lZGlhRXh0cmFjdG9yICphTWVkaWFFeHRyYWN0b3IpOworCisgICAgLy8gdGhlIHJldHVybmVkIEFNZWRpYUV4dHJhY3RvciBpcyBzdGlsbCBvd25lZCBieSB0aGlzIHdyYXBwZXIuCisgICAgQU1lZGlhRXh0cmFjdG9yICpnZXRBTWVkaWFFeHRyYWN0b3IoKSBjb25zdDsKKworICAgIHN0YXR1c190IHJlbGVhc2UoKTsKKworICAgIHN0YXR1c190IHNldERhdGFTb3VyY2UoaW50IGZkLCBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBsZW5ndGgpOworCisgICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShjb25zdCBjaGFyICpsb2NhdGlvbik7CisKKyAgICBzaXplX3QgZ2V0VHJhY2tDb3VudCgpOworCisgICAgc3A8QU1lZGlhRm9ybWF0V3JhcHBlcj4gZ2V0VHJhY2tGb3JtYXQoc2l6ZV90IGlkeCk7CisKKyAgICBzdGF0dXNfdCBzZWxlY3RUcmFjayhzaXplX3QgaWR4KTsKKworICAgIHN0YXR1c190IHVuc2VsZWN0VHJhY2soc2l6ZV90IGlkeCk7CisKKyAgICBzc2l6ZV90IHJlYWRTYW1wbGVEYXRhKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOworCisgICAgdWludDMyX3QgZ2V0U2FtcGxlRmxhZ3MoKTsKKworICAgIGludCBnZXRTYW1wbGVUcmFja0luZGV4KCk7CisKKyAgICBpbnQ2NF90IGdldFNhbXBsZVRpbWUoKTsKKworICAgIGJvb2wgYWR2YW5jZSgpOworCisgICAgc3RhdHVzX3Qgc2Vla1RvKGludDY0X3Qgc2Vla1Bvc1VzLCBTZWVrTW9kZSBtb2RlKTsKKworICAgIC8vIHRoZSByZXR1cm5lZCBQc3NoSW5mbyBpcyBzdGlsbCBvd25lZCBieSB0aGlzIHdyYXBwZXIuCisgICAgUHNzaEluZm8qIGdldFBzc2hJbmZvKCk7CisKKyAgICBzcDxBTWVkaWFDb2RlY0NyeXB0b0luZm9XcmFwcGVyPiBnZXRTYW1wbGVDcnlwdG9JbmZvKCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5BTWVkaWFFeHRyYWN0b3JXcmFwcGVyKCk7CisKK3ByaXZhdGU6CisgICAgQU1lZGlhRXh0cmFjdG9yICptQU1lZGlhRXh0cmFjdG9yOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQU1lZGlhRXh0cmFjdG9yV3JhcHBlcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE5ES19XUkFQUEVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL21lZGlhcGxheWVyLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL21lZGlhcGxheWVyLmgKaW5kZXggZGMzYjNhYS4uYzRkYmY0MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9tZWRpYXBsYXllci5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvbWVkaWFwbGF5ZXIuaApAQCAtMTcsNiArMTcsOCBAQAogI2lmbmRlZiBBTkRST0lEX01FRElBUExBWUVSX0gKICNkZWZpbmUgQU5EUk9JRF9NRURJQVBMQVlFUl9ICiAKKyNpbmNsdWRlIDxtZWRpYS9tZWRpYXBsYXllcl9jb21tb24uaD4KKwogI2luY2x1ZGUgPGFycGEvaW5ldC5oPgogCiAjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KQEAgLTE4OCwxNiArMTkwLDYgQEAKICAgICBJTlZPS0VfSURfR0VUX1NFTEVDVEVEX1RSQUNLID0gNwogfTsKIAotLy8gS2VlcCBNRURJQV9UUkFDS19UWVBFXyogaW4gc3luYyB3aXRoIE1lZGlhUGxheWVyLmphdmEuCi1lbnVtIG1lZGlhX3RyYWNrX3R5cGUgewotICAgIE1FRElBX1RSQUNLX1RZUEVfVU5LTk9XTiA9IDAsCi0gICAgTUVESUFfVFJBQ0tfVFlQRV9WSURFTyA9IDEsCi0gICAgTUVESUFfVFJBQ0tfVFlQRV9BVURJTyA9IDIsCi0gICAgTUVESUFfVFJBQ0tfVFlQRV9USU1FRFRFWFQgPSAzLAotICAgIE1FRElBX1RSQUNLX1RZUEVfU1VCVElUTEUgPSA0LAotICAgIE1FRElBX1RSQUNLX1RZUEVfTUVUQURBVEEgPSA1LAotfTsKLQogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gcmVmLWNvdW50ZWQgb2JqZWN0IGZvciBjYWxsYmFja3MKIGNsYXNzIE1lZGlhUGxheWVyTGlzdGVuZXI6IHZpcnR1YWwgcHVibGljIFJlZkJhc2UKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvbWVkaWFwbGF5ZXIyLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL21lZGlhcGxheWVyMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMjcwNDMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL21lZGlhcGxheWVyMi5oCkBAIC0wLDAgKzEsMzA2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFQTEFZRVIyX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQVBMQVlFUjJfSAorCisjaW5jbHVkZSA8bWVkaWEvbWVkaWFwbGF5ZXJfY29tbW9uLmg+CisKKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmg+CisjaW5jbHVkZSA8bWVkaWEvQnVmZmVyaW5nU2V0dGluZ3MuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVBsYXllcjJFbmdpbmVDbGllbnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVBsYXllcjJFbmdpbmUuaD4KKworI2luY2x1ZGUgPHV0aWxzL0NvbmRpdGlvbi5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL1RocmVhZERlZnMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQVZTeW5jU2V0dGluZ3M7CitzdHJ1Y3QgQU5hdGl2ZVdpbmRvd1dyYXBwZXI7CisKK2VudW0gbWVkaWEyX2V2ZW50X3R5cGUgeworICAgIE1FRElBMl9OT1AgICAgICAgICAgICAgICA9IDAsIC8vIGludGVyZmFjZSB0ZXN0IG1lc3NhZ2UKKyAgICBNRURJQTJfUFJFUEFSRUQgICAgICAgICAgPSAxLAorICAgIE1FRElBMl9QTEFZQkFDS19DT01QTEVURSA9IDIsCisgICAgTUVESUEyX0JVRkZFUklOR19VUERBVEUgID0gMywKKyAgICBNRURJQTJfU0VFS19DT01QTEVURSAgICAgPSA0LAorICAgIE1FRElBMl9TRVRfVklERU9fU0laRSAgICA9IDUsCisgICAgTUVESUEyX1NUQVJURUQgICAgICAgICAgID0gNiwKKyAgICBNRURJQTJfUEFVU0VEICAgICAgICAgICAgPSA3LAorICAgIE1FRElBMl9TVE9QUEVEICAgICAgICAgICA9IDgsCisgICAgTUVESUEyX1NLSVBQRUQgICAgICAgICAgID0gOSwKKyAgICBNRURJQTJfTk9USUZZX1RJTUUgICAgICAgPSA5OCwKKyAgICBNRURJQTJfVElNRURfVEVYVCAgICAgICAgPSA5OSwKKyAgICBNRURJQTJfRVJST1IgICAgICAgICAgICAgPSAxMDAsCisgICAgTUVESUEyX0lORk8gICAgICAgICAgICAgID0gMjAwLAorICAgIE1FRElBMl9TVUJUSVRMRV9EQVRBICAgICA9IDIwMSwKKyAgICBNRURJQTJfTUVUQV9EQVRBICAgICAgICAgPSAyMDIsCisgICAgTUVESUEyX0RSTV9JTkZPICAgICAgICAgID0gMjEwLAorICAgIE1FRElBMl9BVURJT19ST1VUSU5HX0NIQU5HRUQgPSAxMDAwMCwKK307CisKKy8vIEdlbmVyaWMgZXJyb3IgY29kZXMgZm9yIHRoZSBtZWRpYSBwbGF5ZXIgZnJhbWV3b3JrLiAgRXJyb3JzIGFyZSBmYXRhbCwgdGhlCisvLyBwbGF5YmFjayBtdXN0IGFib3J0LgorLy8KKy8vIEVycm9ycyBhcmUgY29tbXVuaWNhdGVkIGJhY2sgdG8gdGhlIGNsaWVudCB1c2luZyB0aGUKKy8vIE1lZGlhUGxheWVyMkxpc3RlbmVyOjpub3RpZnkgbWV0aG9kIGRlZmluZWQgYmVsb3cuCisvLyBJbiB0aGlzIHNpdHVhdGlvbiwgJ25vdGlmeScgaXMgaW52b2tlZCB3aXRoIHRoZSBmb2xsb3dpbmc6CisvLyAgICdtc2cnIGlzIHNldCB0byBNRURJQV9FUlJPUi4KKy8vICAgJ2V4dDEnIHNob3VsZCBiZSBhIHZhbHVlIGZyb20gdGhlIGVudW0gbWVkaWEyX2Vycm9yX3R5cGUuCisvLyAgICdleHQyJyBjb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBkZXBlbmRhbnQgZXJyb3IgY29kZSB0byBwcm92aWRlCisvLyAgICAgICAgICBtb3JlIGRldGFpbHMuIFNob3VsZCBkZWZhdWx0IHRvIDAgd2hlbiBub3QgdXNlZC4KKy8vCisvLyBUaGUgY29kZXMgYXJlIGRpc3RyaWJ1dGVkIGFzIGZvbGxvdzoKKy8vICAgMHh4OiBSZXNlcnZlZAorLy8gICAxeHg6IEFuZHJvaWQgUGxheWVyIGVycm9ycy4gU29tZXRoaW5nIHdlbnQgd3JvbmcgaW5zaWRlIHRoZSBNZWRpYVBsYXllcjIuCisvLyAgIDJ4eDogTWVkaWEgZXJyb3JzIChlLmcgQ29kZWMgbm90IHN1cHBvcnRlZCkuIFRoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIHRoZQorLy8gICAgICAgIG1lZGlhIGl0c2VsZi4KKy8vICAgM3h4OiBSdW50aW1lIGVycm9ycy4gU29tZSBleHRyYW9yZGluYXJ5IGNvbmRpdGlvbiBhcm9zZSBtYWtpbmcgdGhlIHBsYXliYWNrCisvLyAgICAgICAgaW1wb3NzaWJsZS4KKy8vCitlbnVtIG1lZGlhMl9lcnJvcl90eXBlIHsKKyAgICAvLyAweHgKKyAgICBNRURJQTJfRVJST1JfVU5LTk9XTiA9IDEsCisgICAgLy8gMXh4CisgICAgTUVESUEyX0VSUk9SX1NFUlZFUl9ESUVEID0gMTAwLAorICAgIC8vIDJ4eAorICAgIE1FRElBMl9FUlJPUl9OT1RfVkFMSURfRk9SX1BST0dSRVNTSVZFX1BMQVlCQUNLID0gMjAwLAorICAgIC8vIDN4eAorfTsKKworCisvLyBJbmZvIGFuZCB3YXJuaW5nIGNvZGVzIGZvciB0aGUgbWVkaWEgcGxheWVyIGZyYW1ld29yay4gIFRoZXNlIGFyZSBub24gZmF0YWwsCisvLyB0aGUgcGxheWJhY2sgaXMgZ29pbmcgb24gYnV0IHRoZXJlIG1pZ2h0IGJlIHNvbWUgdXNlciB2aXNpYmxlIGlzc3Vlcy4KKy8vCisvLyBJbmZvIGFuZCB3YXJuaW5nIG1lc3NhZ2VzIGFyZSBjb21tdW5pY2F0ZWQgYmFjayB0byB0aGUgY2xpZW50IHVzaW5nIHRoZQorLy8gTWVkaWFQbGF5ZXIyTGlzdGVuZXI6Om5vdGlmeSBtZXRob2QgZGVmaW5lZCBiZWxvdy4gIEluIHRoaXMgc2l0dWF0aW9uLAorLy8gJ25vdGlmeScgaXMgaW52b2tlZCB3aXRoIHRoZSBmb2xsb3dpbmc6CisvLyAgICdtc2cnIGlzIHNldCB0byBNRURJQV9JTkZPLgorLy8gICAnZXh0MScgc2hvdWxkIGJlIGEgdmFsdWUgZnJvbSB0aGUgZW51bSBtZWRpYTJfaW5mb190eXBlLgorLy8gICAnZXh0MicgY29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gZGVwZW5kYW50IGluZm8gY29kZSB0byBwcm92aWRlCisvLyAgICAgICAgICBtb3JlIGRldGFpbHMuIFNob3VsZCBkZWZhdWx0IHRvIDAgd2hlbiBub3QgdXNlZC4KKy8vCisvLyBUaGUgY29kZXMgYXJlIGRpc3RyaWJ1dGVkIGFzIGZvbGxvdzoKKy8vICAgMHh4OiBSZXNlcnZlZAorLy8gICA3eHg6IEFuZHJvaWQgUGxheWVyIGluZm8vd2FybmluZyAoZS5nIHBsYXllciBsYWdnaW5nIGJlaGluZC4pCisvLyAgIDh4eDogTWVkaWEgaW5mby93YXJuaW5nIChlLmcgbWVkaWEgYmFkbHkgaW50ZXJsZWF2ZWQuKQorLy8KK2VudW0gbWVkaWEyX2luZm9fdHlwZSB7CisgICAgLy8gMHh4CisgICAgTUVESUEyX0lORk9fVU5LTk9XTiA9IDEsCisgICAgLy8gVGhlIHBsYXllciB3YXMgc3RhcnRlZCBiZWNhdXNlIGl0IHdhcyB1c2VkIGFzIHRoZSBuZXh0IHBsYXllciBmb3IgYW5vdGhlcgorICAgIC8vIHBsYXllciwgd2hpY2gganVzdCBjb21wbGV0ZWQgcGxheWJhY2sKKyAgICBNRURJQTJfSU5GT19TVEFSVEVEX0FTX05FWFQgPSAyLAorICAgIC8vIFRoZSBwbGF5ZXIganVzdCBwdXNoZWQgdGhlIHZlcnkgZmlyc3QgdmlkZW8gZnJhbWUgZm9yIHJlbmRlcmluZworICAgIE1FRElBMl9JTkZPX1JFTkRFUklOR19TVEFSVCA9IDMsCisgICAgLy8gN3h4CisgICAgLy8gVGhlIHZpZGVvIGlzIHRvbyBjb21wbGV4IGZvciB0aGUgZGVjb2RlcjogaXQgY2FuJ3QgZGVjb2RlIGZyYW1lcyBmYXN0CisgICAgLy8gZW5vdWdoLiBQb3NzaWJseSBvbmx5IHRoZSBhdWRpbyBwbGF5cyBmaW5lIGF0IHRoaXMgc3RhZ2UuCisgICAgTUVESUEyX0lORk9fVklERU9fVFJBQ0tfTEFHR0lORyA9IDcwMCwKKyAgICAvLyBNZWRpYVBsYXllcjIgaXMgdGVtcG9yYXJpbHkgcGF1c2luZyBwbGF5YmFjayBpbnRlcm5hbGx5IGluIG9yZGVyIHRvCisgICAgLy8gYnVmZmVyIG1vcmUgZGF0YS4KKyAgICBNRURJQTJfSU5GT19CVUZGRVJJTkdfU1RBUlQgPSA3MDEsCisgICAgLy8gTWVkaWFQbGF5ZXIyIGlzIHJlc3VtaW5nIHBsYXliYWNrIGFmdGVyIGZpbGxpbmcgYnVmZmVycy4KKyAgICBNRURJQTJfSU5GT19CVUZGRVJJTkdfRU5EID0gNzAyLAorICAgIC8vIEJhbmR3aWR0aCBpbiByZWNlbnQgcGFzdAorICAgIE1FRElBMl9JTkZPX05FVFdPUktfQkFORFdJRFRIID0gNzAzLAorCisgICAgLy8gOHh4CisgICAgLy8gQmFkIGludGVybGVhdmluZyBtZWFucyB0aGF0IGEgbWVkaWEgaGFzIGJlZW4gaW1wcm9wZXJseSBpbnRlcmxlYXZlZCBvciBub3QKKyAgICAvLyBpbnRlcmxlYXZlZCBhdCBhbGwsIGUuZyBoYXMgYWxsIHRoZSB2aWRlbyBzYW1wbGVzIGZpcnN0IHRoZW4gYWxsIHRoZSBhdWRpbworICAgIC8vIG9uZXMuIFZpZGVvIGlzIHBsYXlpbmcgYnV0IGEgbG90IG9mIGRpc2sgc2VlayBtYXkgYmUgaGFwcGVuaW5nLgorICAgIE1FRElBMl9JTkZPX0JBRF9JTlRFUkxFQVZJTkcgPSA4MDAsCisgICAgLy8gVGhlIG1lZGlhIGlzIG5vdCBzZWVrYWJsZSAoZS5nIGxpdmUgc3RyZWFtKS4KKyAgICBNRURJQTJfSU5GT19OT1RfU0VFS0FCTEUgPSA4MDEsCisgICAgLy8gTmV3IG1lZGlhIG1ldGFkYXRhIGlzIGF2YWlsYWJsZS4KKyAgICBNRURJQTJfSU5GT19NRVRBREFUQV9VUERBVEUgPSA4MDIsCisgICAgLy8gQXVkaW8gY2FuIG5vdCBiZSBwbGF5ZWQuCisgICAgTUVESUEyX0lORk9fUExBWV9BVURJT19FUlJPUiA9IDgwNCwKKyAgICAvLyBWaWRlbyBjYW4gbm90IGJlIHBsYXllZC4KKyAgICBNRURJQTJfSU5GT19QTEFZX1ZJREVPX0VSUk9SID0gODA1LAorCisgICAgLy85eHgKKyAgICBNRURJQTJfSU5GT19USU1FRF9URVhUX0VSUk9SID0gOTAwLAorfTsKKworCisKK2VudW0gbWVkaWFfcGxheWVyMl9zdGF0ZXMgeworICAgIE1FRElBX1BMQVlFUjJfU1RBVEVfRVJST1IgICAgICAgID0gMCwKKyAgICBNRURJQV9QTEFZRVIyX0lETEUgICAgICAgICAgICAgICA9IDEgPDwgMCwKKyAgICBNRURJQV9QTEFZRVIyX0lOSVRJQUxJWkVEICAgICAgICA9IDEgPDwgMSwKKyAgICBNRURJQV9QTEFZRVIyX1BSRVBBUklORyAgICAgICAgICA9IDEgPDwgMiwKKyAgICBNRURJQV9QTEFZRVIyX1BSRVBBUkVEICAgICAgICAgICA9IDEgPDwgMywKKyAgICBNRURJQV9QTEFZRVIyX1NUQVJURUQgICAgICAgICAgICA9IDEgPDwgNCwKKyAgICBNRURJQV9QTEFZRVIyX1BBVVNFRCAgICAgICAgICAgICA9IDEgPDwgNSwKKyAgICBNRURJQV9QTEFZRVIyX1NUT1BQRUQgICAgICAgICAgICA9IDEgPDwgNiwKKyAgICBNRURJQV9QTEFZRVIyX1BMQVlCQUNLX0NPTVBMRVRFICA9IDEgPDwgNworfTsKKworLy8gS2VlcCBLRVlfUEFSQU1FVEVSXyogaW4gc3luYyB3aXRoIE1lZGlhUGxheWVyMi5qYXZhLgorLy8gVGhlIHNhbWUgZW51bSBzcGFjZSBpcyB1c2VkIGZvciBib3RoIHNldCBhbmQgZ2V0LCBpbiBjYXNlIHRoZXJlIGFyZSBmdXR1cmUga2V5cyB0aGF0CisvLyBjYW4gYmUgYm90aCBzZXQgYW5kIGdldC4gIEJ1dCBhcyBvZiBub3csIGFsbCBwYXJhbWV0ZXJzIGFyZSBlaXRoZXIgc2V0IG9ubHkgb3IgZ2V0IG9ubHkuCitlbnVtIG1lZGlhMl9wYXJhbWV0ZXJfa2V5cyB7CisgICAgLy8gU3RyZWFtaW5nL2J1ZmZlcmluZyBwYXJhbWV0ZXJzCisgICAgTUVESUEyX0tFWV9QQVJBTUVURVJfQ0FDSEVfU1RBVF9DT0xMRUNUX0ZSRVFfTVMgPSAxMTAwLCAgICAgICAgICAgIC8vIHNldCBvbmx5CisKKyAgICAvLyBSZXR1cm4gYSBQYXJjZWwgY29udGFpbmluZyBhIHNpbmdsZSBpbnQsIHdoaWNoIGlzIHRoZSBjaGFubmVsIGNvdW50IG9mIHRoZQorICAgIC8vIGF1ZGlvIHRyYWNrLCBvciB6ZXJvIGZvciBlcnJvciAoZS5nLiBubyBhdWRpbyB0cmFjaykgb3IgdW5rbm93bi4KKyAgICBNRURJQTJfS0VZX1BBUkFNRVRFUl9BVURJT19DSEFOTkVMX0NPVU5UID0gMTIwMCwgICAgICAgICAgICAgICAgICAgLy8gZ2V0IG9ubHkKKworICAgIC8vIFBsYXliYWNrIHJhdGUgZXhwcmVzc2VkIGluIHBlcm1pbGxlICgxMDAwIGlzIG5vcm1hbCBzcGVlZCksIHNhdmVkIGFzIGludDMyX3QsIHdpdGggbmVnYXRpdmUKKyAgICAvLyB2YWx1ZXMgdXNlZCBmb3IgcmV3aW5kaW5nIG9yIHJldmVyc2UgcGxheWJhY2suCisgICAgTUVESUEyX0tFWV9QQVJBTUVURVJfUExBWUJBQ0tfUkFURV9QRVJNSUxMRSA9IDEzMDAsICAgICAgICAgICAgICAgIC8vIHNldCBvbmx5CisKKyAgICAvLyBTZXQgYSBQYXJjZWwgY29udGFpbmluZyB0aGUgdmFsdWUgb2YgYSBwYXJjZWxsZWQgSmF2YSBBdWRpb0F0dHJpYnV0ZSBpbnN0YW5jZQorICAgIE1FRElBMl9LRVlfUEFSQU1FVEVSX0FVRElPX0FUVFJJQlVURVMgPSAxNDAwICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgb25seQorfTsKKworLy8gS2VlcCBJTlZPS0VfSURfKiBpbiBzeW5jIHdpdGggTWVkaWFQbGF5ZXIyLmphdmEuCitlbnVtIG1lZGlhX3BsYXllcjJfaW52b2tlX2lkcyB7CisgICAgTUVESUFfUExBWUVSMl9JTlZPS0VfSURfR0VUX1RSQUNLX0lORk8gPSAxLAorICAgIE1FRElBX1BMQVlFUjJfSU5WT0tFX0lEX0FERF9FWFRFUk5BTF9TT1VSQ0UgPSAyLAorICAgIE1FRElBX1BMQVlFUjJfSU5WT0tFX0lEX0FERF9FWFRFUk5BTF9TT1VSQ0VfRkQgPSAzLAorICAgIE1FRElBX1BMQVlFUjJfSU5WT0tFX0lEX1NFTEVDVF9UUkFDSyA9IDQsCisgICAgTUVESUFfUExBWUVSMl9JTlZPS0VfSURfVU5TRUxFQ1RfVFJBQ0sgPSA1LAorICAgIE1FRElBX1BMQVlFUjJfSU5WT0tFX0lEX1NFVF9WSURFT19TQ0FMSU5HX01PREUgPSA2LAorICAgIE1FRElBX1BMQVlFUjJfSU5WT0tFX0lEX0dFVF9TRUxFQ1RFRF9UUkFDSyA9IDcKK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHJlZi1jb3VudGVkIG9iamVjdCBmb3IgY2FsbGJhY2tzCitjbGFzcyBNZWRpYVBsYXllcjJMaXN0ZW5lcjogdmlydHVhbCBwdWJsaWMgUmVmQmFzZQoreworcHVibGljOgorICAgIHZpcnR1YWwgdm9pZCBub3RpZnkoaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKm9iaikgPSAwOworfTsKKworc3RydWN0IE1lZGlhSFRUUFNlcnZpY2U7CisKK2NsYXNzIE1lZGlhUGxheWVyMiA6IHB1YmxpYyBNZWRpYVBsYXllcjJFbmdpbmVDbGllbnQKK3sKK3B1YmxpYzoKKyAgICBNZWRpYVBsYXllcjIoKTsKKyAgICB+TWVkaWFQbGF5ZXIyKCk7CisgICAgICAgICAgICB2b2lkICAgICAgICAgICAgZGlzY29ubmVjdCgpOworCisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0RGF0YVNvdXJjZSgKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKKworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldERhdGFTb3VyY2UoY29uc3Qgc3A8SURhdGFTb3VyY2U+ICZzb3VyY2UpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldFZpZGVvU3VyZmFjZVRleHR1cmUoY29uc3Qgc3A8QU5hdGl2ZVdpbmRvd1dyYXBwZXI+JiBud3cpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldExpc3RlbmVyKGNvbnN0IHNwPE1lZGlhUGxheWVyMkxpc3RlbmVyPiYgbGlzdGVuZXIpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGdldEJ1ZmZlcmluZ1NldHRpbmdzKEJ1ZmZlcmluZ1NldHRpbmdzKiBidWZmZXJpbmcgLyogbm9ubnVsbCAqLyk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0QnVmZmVyaW5nU2V0dGluZ3MoY29uc3QgQnVmZmVyaW5nU2V0dGluZ3MmIGJ1ZmZlcmluZyk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgcHJlcGFyZSgpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHByZXBhcmVBc3luYygpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHN0YXJ0KCk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc3RvcCgpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHBhdXNlKCk7CisgICAgICAgICAgICBib29sICAgICAgICAgICAgaXNQbGF5aW5nKCk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0UGxheWJhY2tTZXR0aW5ncyhjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSYgcmF0ZSk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgZ2V0UGxheWJhY2tTZXR0aW5ncyhBdWRpb1BsYXliYWNrUmF0ZSogcmF0ZSAvKiBub25udWxsICovKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRTeW5jU2V0dGluZ3MoY29uc3QgQVZTeW5jU2V0dGluZ3MmIHN5bmMsIGZsb2F0IHZpZGVvRnBzSGludCk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgZ2V0U3luY1NldHRpbmdzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZTeW5jU2V0dGluZ3MqIHN5bmMgLyogbm9ubnVsbCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB2aWRlb0ZwcyAvKiBub25udWxsICovKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBnZXRWaWRlb1dpZHRoKGludCAqdyk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgZ2V0VmlkZW9IZWlnaHQoaW50ICpoKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZWVrVG8oCisgICAgICAgICAgICAgICAgICAgIGludCBtc2VjLAorICAgICAgICAgICAgICAgICAgICBNZWRpYVBsYXllcjJTZWVrTW9kZSBtb2RlID0gTWVkaWFQbGF5ZXIyU2Vla01vZGU6OlNFRUtfUFJFVklPVVNfU1lOQyk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgbm90aWZ5QXQoaW50NjRfdCBtZWRpYVRpbWVVcyk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgZ2V0Q3VycmVudFBvc2l0aW9uKGludCAqbXNlYyk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgZ2V0RHVyYXRpb24oaW50ICptc2VjKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICByZXNldCgpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldEF1ZGlvU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHR5cGUpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGdldEF1ZGlvU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90ICp0eXBlKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRMb29waW5nKGludCBsb29wKTsKKyAgICAgICAgICAgIGJvb2wgICAgICAgICAgICBpc0xvb3BpbmcoKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRWb2x1bWUoZmxvYXQgbGVmdFZvbHVtZSwgZmxvYXQgcmlnaHRWb2x1bWUpOworICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIG5vdGlmeShpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqb2JqID0gTlVMTCk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgaW52b2tlKGNvbnN0IFBhcmNlbCYgcmVxdWVzdCwgUGFyY2VsICpyZXBseSk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0TWV0YWRhdGFGaWx0ZXIoY29uc3QgUGFyY2VsJiBmaWx0ZXIpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGdldE1ldGFkYXRhKGJvb2wgdXBkYXRlX29ubHksIGJvb2wgYXBwbHlfZmlsdGVyLCBQYXJjZWwgKm1ldGFkYXRhKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRBdWRpb1Nlc3Npb25JZChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKTsKKyAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBnZXRBdWRpb1Nlc3Npb25JZCgpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldEF1eEVmZmVjdFNlbmRMZXZlbChmbG9hdCBsZXZlbCk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgYXR0YWNoQXV4RWZmZWN0KGludCBlZmZlY3RJZCk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0UGFyYW1ldGVyKGludCBrZXksIGNvbnN0IFBhcmNlbCYgcmVxdWVzdCk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgZ2V0UGFyYW1ldGVyKGludCBrZXksIFBhcmNlbCogcmVwbHkpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldFJldHJhbnNtaXRFbmRwb2ludChjb25zdCBjaGFyKiBhZGRyU3RyaW5nLCB1aW50MTZfdCBwb3J0KTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXROZXh0TWVkaWFQbGF5ZXIoY29uc3Qgc3A8TWVkaWFQbGF5ZXIyPiYgcGxheWVyKTsKKworICAgICAgICAgICAgbWVkaWE6OlZvbHVtZVNoYXBlcjo6U3RhdHVzIGFwcGx5Vm9sdW1lU2hhcGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8bWVkaWE6OlZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbj4mIGNvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb24+JiBvcGVyYXRpb24pOworICAgICAgICAgICAgc3A8bWVkaWE6OlZvbHVtZVNoYXBlcjo6U3RhdGU+IGdldFZvbHVtZVNoYXBlclN0YXRlKGludCBpZCk7CisgICAgICAgICAgICAvLyBNb2R1bGFyIERSTQorICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHByZXBhcmVEcm0oY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBkcm1TZXNzaW9uSWQpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHJlbGVhc2VEcm0oKTsKKyAgICAgICAgICAgIC8vIEF1ZGlvUm91dGluZworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldE91dHB1dERldmljZShhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKTsKKyAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZ2V0Um91dGVkRGV2aWNlSWQoKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBlbmFibGVBdWRpb0RldmljZUNhbGxiYWNrKGJvb2wgZW5hYmxlZCk7CisKK3ByaXZhdGU6CisgICAgICAgICAgICB2b2lkICAgICAgICAgICAgY2xlYXJfbCgpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNlZWtUb19sKGludCBtc2VjLCBNZWRpYVBsYXllcjJTZWVrTW9kZSBtb2RlKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBwcmVwYXJlQXN5bmNfbCgpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGdldER1cmF0aW9uX2woaW50ICptc2VjKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBhdHRhY2hOZXdQbGF5ZXIoY29uc3Qgc3A8TWVkaWFQbGF5ZXIyRW5naW5lPiYgcGxheWVyKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICByZXNldF9sKCk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgZG9TZXRSZXRyYW5zbWl0RW5kcG9pbnQoY29uc3Qgc3A8TWVkaWFQbGF5ZXIyRW5naW5lPiYgcGxheWVyKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBjaGVja1N0YXRlRm9yS2V5U2V0X2woaW50IGtleSk7CisKKyAgICBzcDxNZWRpYVBsYXllcjJFbmdpbmU+ICAgICAgbVBsYXllcjsKKyAgICB0aHJlYWRfaWRfdCAgICAgICAgICAgICAgICAgbUxvY2tUaHJlYWRJZDsKKyAgICBNdXRleCAgICAgICAgICAgICAgICAgICAgICAgbUxvY2s7CisgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgIG1Ob3RpZnlMb2NrOworICAgIENvbmRpdGlvbiAgICAgICAgICAgICAgICAgICBtU2lnbmFsOworICAgIHNwPE1lZGlhUGxheWVyMkxpc3RlbmVyPiAgICBtTGlzdGVuZXI7CisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgIG1Db29raWU7CisgICAgbWVkaWFfcGxheWVyMl9zdGF0ZXMgICAgICAgIG1DdXJyZW50U3RhdGU7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50UG9zaXRpb247CisgICAgTWVkaWFQbGF5ZXIyU2Vla01vZGUgICAgICAgIG1DdXJyZW50U2Vla01vZGU7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIG1TZWVrUG9zaXRpb247CisgICAgTWVkaWFQbGF5ZXIyU2Vla01vZGUgICAgICAgIG1TZWVrTW9kZTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbVByZXBhcmVTeW5jOworICAgIHN0YXR1c190ICAgICAgICAgICAgICAgICAgICBtUHJlcGFyZVN0YXR1czsKKyAgICBhdWRpb19zdHJlYW1fdHlwZV90ICAgICAgICAgbVN0cmVhbVR5cGU7CisgICAgUGFyY2VsKiAgICAgICAgICAgICAgICAgICAgIG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWw7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1Mb29wOworICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICBtTGVmdFZvbHVtZTsKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgbVJpZ2h0Vm9sdW1lOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBtVmlkZW9XaWR0aDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgbVZpZGVvSGVpZ2h0OworICAgIGF1ZGlvX3Nlc3Npb25fdCAgICAgICAgICAgICBtQXVkaW9TZXNzaW9uSWQ7CisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgIG1TZW5kTGV2ZWw7CisgICAgc3RydWN0IHNvY2thZGRyX2luICAgICAgICAgIG1SZXRyYW5zbWl0RW5kcG9pbnQ7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1SZXRyYW5zbWl0RW5kcG9pbnRWYWxpZDsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX01FRElBUExBWUVSMl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL21lZGlhcGxheWVyX2NvbW1vbi5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9tZWRpYXBsYXllcl9jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWEwMTM1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9tZWRpYXBsYXllcl9jb21tb24uaApAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFQTEFZRVJfQ09NTU9OX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQVBMQVlFUl9DT01NT05fSAorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIEtlZXAgTUVESUFfVFJBQ0tfVFlQRV8qIGluIHN5bmMgd2l0aCBNZWRpYVBsYXllci5qYXZhLgorZW51bSBtZWRpYV90cmFja190eXBlIHsKKyAgICBNRURJQV9UUkFDS19UWVBFX1VOS05PV04gPSAwLAorICAgIE1FRElBX1RSQUNLX1RZUEVfVklERU8gPSAxLAorICAgIE1FRElBX1RSQUNLX1RZUEVfQVVESU8gPSAyLAorICAgIE1FRElBX1RSQUNLX1RZUEVfVElNRURURVhUID0gMywKKyAgICBNRURJQV9UUkFDS19UWVBFX1NVQlRJVExFID0gNCwKKyAgICBNRURJQV9UUkFDS19UWVBFX01FVEFEQVRBID0gNSwKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX01FRElBUExBWUVSX0NPTU1PTl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9tZWRpYXBsYXllcjIuY3BwIGIvbWVkaWEvbGlibWVkaWEvbWVkaWFwbGF5ZXIyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTUyYWJmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvbWVkaWFwbGF5ZXIyLmNwcApAQCAtMCwwICsxLDEwOTggQEAKKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMTcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTWVkaWFQbGF5ZXIyTmF0aXZlIgorCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKworI2luY2x1ZGUgPG1lZGlhL21lZGlhcGxheWVyMi5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KKyNpbmNsdWRlIDxtZWRpYS9BVlN5bmNTZXR0aW5ncy5oPgorI2luY2x1ZGUgPG1lZGlhL0lEYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFBbmFseXRpY3NJdGVtLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrV3JhcHBlci5oPgorCisjaW5jbHVkZSA8YmluZGVyL01lbW9yeUJhc2UuaD4KKworI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8c3lzdGVtL3dpbmRvdy5oPgorCisjaW5jbHVkZSAiTWVkaWFQbGF5ZXIyTWFuYWdlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3VzaW5nIG1lZGlhOjpWb2x1bWVTaGFwZXI7CisKK01lZGlhUGxheWVyMjo6TWVkaWFQbGF5ZXIyKCkKK3sKKyAgICBBTE9HVigiY29uc3RydWN0b3IiKTsKKyAgICBtTGlzdGVuZXIgPSBOVUxMOworICAgIG1Db29raWUgPSBOVUxMOworICAgIG1TdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX01VU0lDOworICAgIG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwgPSBOVUxMOworICAgIG1DdXJyZW50UG9zaXRpb24gPSAtMTsKKyAgICBtQ3VycmVudFNlZWtNb2RlID0gTWVkaWFQbGF5ZXIyU2Vla01vZGU6OlNFRUtfUFJFVklPVVNfU1lOQzsKKyAgICBtU2Vla1Bvc2l0aW9uID0gLTE7CisgICAgbVNlZWtNb2RlID0gTWVkaWFQbGF5ZXIyU2Vla01vZGU6OlNFRUtfUFJFVklPVVNfU1lOQzsKKyAgICBtQ3VycmVudFN0YXRlID0gTUVESUFfUExBWUVSMl9JRExFOworICAgIG1QcmVwYXJlU3luYyA9IGZhbHNlOworICAgIG1QcmVwYXJlU3RhdHVzID0gTk9fRVJST1I7CisgICAgbUxvb3AgPSBmYWxzZTsKKyAgICBtTGVmdFZvbHVtZSA9IG1SaWdodFZvbHVtZSA9IDEuMDsKKyAgICBtVmlkZW9XaWR0aCA9IG1WaWRlb0hlaWdodCA9IDA7CisgICAgbUxvY2tUaHJlYWRJZCA9IDA7CisgICAgbUF1ZGlvU2Vzc2lvbklkID0gKGF1ZGlvX3Nlc3Npb25fdCkgQXVkaW9TeXN0ZW06Om5ld0F1ZGlvVW5pcXVlSWQoQVVESU9fVU5JUVVFX0lEX1VTRV9TRVNTSU9OKTsKKyAgICBBdWRpb1N5c3RlbTo6YWNxdWlyZUF1ZGlvU2Vzc2lvbklkKG1BdWRpb1Nlc3Npb25JZCwgLTEpOworICAgIG1TZW5kTGV2ZWwgPSAwOworICAgIG1SZXRyYW5zbWl0RW5kcG9pbnRWYWxpZCA9IGZhbHNlOworfQorCitNZWRpYVBsYXllcjI6On5NZWRpYVBsYXllcjIoKQoreworICAgIEFMT0dWKCJkZXN0cnVjdG9yIik7CisgICAgaWYgKG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwgIT0gTlVMTCkgeworICAgICAgICBkZWxldGUgbUF1ZGlvQXR0cmlidXRlc1BhcmNlbDsKKyAgICAgICAgbUF1ZGlvQXR0cmlidXRlc1BhcmNlbCA9IE5VTEw7CisgICAgfQorICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlQXVkaW9TZXNzaW9uSWQobUF1ZGlvU2Vzc2lvbklkLCAtMSk7CisgICAgZGlzY29ubmVjdCgpOworICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKK30KKwordm9pZCBNZWRpYVBsYXllcjI6OmRpc2Nvbm5lY3QoKQoreworICAgIEFMT0dWKCJkaXNjb25uZWN0Iik7CisgICAgc3A8TWVkaWFQbGF5ZXIyRW5naW5lPiBwOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgcCA9IG1QbGF5ZXI7CisgICAgICAgIG1QbGF5ZXIuY2xlYXIoKTsKKyAgICB9CisKKyAgICBpZiAocCAhPSAwKSB7CisgICAgICAgIHAtPmRpc2Nvbm5lY3QoKTsKKyAgICB9Cit9CisKKy8vIGFsd2F5cyBjYWxsIHdpdGggbG9jayBoZWxkCit2b2lkIE1lZGlhUGxheWVyMjo6Y2xlYXJfbCgpCit7CisgICAgbUN1cnJlbnRQb3NpdGlvbiA9IC0xOworICAgIG1DdXJyZW50U2Vla01vZGUgPSBNZWRpYVBsYXllcjJTZWVrTW9kZTo6U0VFS19QUkVWSU9VU19TWU5DOworICAgIG1TZWVrUG9zaXRpb24gPSAtMTsKKyAgICBtU2Vla01vZGUgPSBNZWRpYVBsYXllcjJTZWVrTW9kZTo6U0VFS19QUkVWSU9VU19TWU5DOworICAgIG1WaWRlb1dpZHRoID0gbVZpZGVvSGVpZ2h0ID0gMDsKKyAgICBtUmV0cmFuc21pdEVuZHBvaW50VmFsaWQgPSBmYWxzZTsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzZXRMaXN0ZW5lcihjb25zdCBzcDxNZWRpYVBsYXllcjJMaXN0ZW5lcj4mIGxpc3RlbmVyKQoreworICAgIEFMT0dWKCJzZXRMaXN0ZW5lciIpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6YXR0YWNoTmV3UGxheWVyKGNvbnN0IHNwPE1lZGlhUGxheWVyMkVuZ2luZT4mIHBsYXllcikKK3sKKyAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOworICAgIHNwPE1lZGlhUGxheWVyMkVuZ2luZT4gcDsKKyAgICB7IC8vIHNjb3BlIGZvciB0aGUgbG9jaworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworCisgICAgICAgIGlmICggISggKG1DdXJyZW50U3RhdGUgJiBNRURJQV9QTEFZRVIyX0lETEUpIHx8CisgICAgICAgICAgICAgICAgKG1DdXJyZW50U3RhdGUgPT0gTUVESUFfUExBWUVSMl9TVEFURV9FUlJPUiApICkgKSB7CisgICAgICAgICAgICBBTE9HRSgiYXR0YWNoTmV3UGxheWVyIGNhbGxlZCBpbiBzdGF0ZSAlZCIsIG1DdXJyZW50U3RhdGUpOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisKKyAgICAgICAgY2xlYXJfbCgpOworICAgICAgICBwID0gbVBsYXllcjsKKyAgICAgICAgbVBsYXllciA9IHBsYXllcjsKKyAgICAgICAgaWYgKHBsYXllciAhPSAwKSB7CisgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gTUVESUFfUExBWUVSMl9JTklUSUFMSVpFRDsKKyAgICAgICAgICAgIGVyciA9IE5PX0VSUk9SOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBjcmVhdGUgbWVkaWEgcGxheWVyIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocCAhPSAwKSB7CisgICAgICAgIHAtPmRpc2Nvbm5lY3QoKTsKKyAgICB9CisKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OnNldERhdGFTb3VyY2UoCisgICAgICAgIGNvbnN0IHNwPE1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgY29uc3QgY2hhciAqdXJsLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykKK3sKKyAgICBBTE9HVigic2V0RGF0YVNvdXJjZSglcykiLCB1cmwpOworICAgIHN0YXR1c190IGVyciA9IEJBRF9WQUxVRTsKKyAgICBpZiAodXJsICE9IE5VTEwpIHsKKyAgICAgICAgc3A8TWVkaWFQbGF5ZXIyRW5naW5lPiBwbGF5ZXIoTWVkaWFQbGF5ZXIyTWFuYWdlcjo6Z2V0KCkuY3JlYXRlKHRoaXMsIG1BdWRpb1Nlc3Npb25JZCkpOworICAgICAgICBpZiAoKE5PX0VSUk9SICE9IGRvU2V0UmV0cmFuc21pdEVuZHBvaW50KHBsYXllcikpIHx8CisgICAgICAgICAgICAoTk9fRVJST1IgIT0gcGxheWVyLT5zZXREYXRhU291cmNlKGh0dHBTZXJ2aWNlLCB1cmwsIGhlYWRlcnMpKSkgeworICAgICAgICAgICAgcGxheWVyLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICAgICAgZXJyID0gYXR0YWNoTmV3UGxheWVyKHBsYXllcik7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6c2V0RGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkKK3sKKyAgICBBTE9HVigic2V0RGF0YVNvdXJjZSglZCwgJSIgUFJJZDY0ICIsICUiIFBSSWQ2NCAiKSIsIGZkLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKKyAgICBzcDxNZWRpYVBsYXllcjJFbmdpbmU+IHBsYXllcihNZWRpYVBsYXllcjJNYW5hZ2VyOjpnZXQoKS5jcmVhdGUodGhpcywgbUF1ZGlvU2Vzc2lvbklkKSk7CisgICAgaWYgKChOT19FUlJPUiAhPSBkb1NldFJldHJhbnNtaXRFbmRwb2ludChwbGF5ZXIpKSB8fAorICAgICAgICAoTk9fRVJST1IgIT0gcGxheWVyLT5zZXREYXRhU291cmNlKGZkLCBvZmZzZXQsIGxlbmd0aCkpKSB7CisgICAgICAgIHBsYXllci5jbGVhcigpOworICAgIH0KKyAgICBlcnIgPSBhdHRhY2hOZXdQbGF5ZXIocGxheWVyKTsKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OnNldERhdGFTb3VyY2UoY29uc3Qgc3A8SURhdGFTb3VyY2U+ICZzb3VyY2UpCit7CisgICAgQUxPR1YoInNldERhdGFTb3VyY2UoSURhdGFTb3VyY2UpIik7CisgICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKKyAgICBzcDxNZWRpYVBsYXllcjJFbmdpbmU+IHBsYXllcihNZWRpYVBsYXllcjJNYW5hZ2VyOjpnZXQoKS5jcmVhdGUodGhpcywgbUF1ZGlvU2Vzc2lvbklkKSk7CisgICAgaWYgKChOT19FUlJPUiAhPSBkb1NldFJldHJhbnNtaXRFbmRwb2ludChwbGF5ZXIpKSB8fAorICAgICAgICAoTk9fRVJST1IgIT0gcGxheWVyLT5zZXREYXRhU291cmNlKHNvdXJjZSkpKSB7CisgICAgICAgIHBsYXllci5jbGVhcigpOworICAgIH0KKyAgICBlcnIgPSBhdHRhY2hOZXdQbGF5ZXIocGxheWVyKTsKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjI6Omludm9rZShjb25zdCBQYXJjZWwmIHJlcXVlc3QsIFBhcmNlbCAqcmVwbHkpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBjb25zdCBib29sIGhhc0JlZW5Jbml0aWFsaXplZCA9CisgICAgICAgICAgICAobUN1cnJlbnRTdGF0ZSAhPSBNRURJQV9QTEFZRVIyX1NUQVRFX0VSUk9SKSAmJgorICAgICAgICAgICAgKChtQ3VycmVudFN0YXRlICYgTUVESUFfUExBWUVSMl9JRExFKSAhPSBNRURJQV9QTEFZRVIyX0lETEUpOworICAgIGlmICgobVBsYXllciAhPSBOVUxMKSAmJiBoYXNCZWVuSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgQUxPR1YoImludm9rZSAlenUiLCByZXF1ZXN0LmRhdGFTaXplKCkpOworICAgICAgICByZXR1cm4gIG1QbGF5ZXItPmludm9rZShyZXF1ZXN0LCByZXBseSk7CisgICAgfQorICAgIEFMT0dFKCJpbnZva2UgZmFpbGVkOiB3cm9uZyBzdGF0ZSAlWCwgbVBsYXllciglcCkiLCBtQ3VycmVudFN0YXRlLCBtUGxheWVyLmdldCgpKTsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6c2V0TWV0YWRhdGFGaWx0ZXIoY29uc3QgUGFyY2VsJiBmaWx0ZXIpCit7CisgICAgQUxPR0QoInNldE1ldGFkYXRhRmlsdGVyIik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIGlmIChtUGxheWVyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBtUGxheWVyLT5zZXRNZXRhZGF0YUZpbHRlcihmaWx0ZXIpOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OmdldE1ldGFkYXRhKGJvb2wgdXBkYXRlX29ubHksIGJvb2wgYXBwbHlfZmlsdGVyLCBQYXJjZWwgKm1ldGFkYXRhKQoreworICAgIEFMT0dEKCJnZXRNZXRhZGF0YSIpOworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobVBsYXllciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gbVBsYXllci0+Z2V0TWV0YWRhdGEodXBkYXRlX29ubHksIGFwcGx5X2ZpbHRlciwgbWV0YWRhdGEpOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OnNldFZpZGVvU3VyZmFjZVRleHR1cmUoY29uc3Qgc3A8QU5hdGl2ZVdpbmRvd1dyYXBwZXI+JiBud3cpCit7CisgICAgQUxPR1YoInNldFZpZGVvU3VyZmFjZVRleHR1cmUiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtUGxheWVyID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBtUGxheWVyLT5zZXRWaWRlb1N1cmZhY2VUZXh0dXJlKG53dyk7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6Z2V0QnVmZmVyaW5nU2V0dGluZ3MoQnVmZmVyaW5nU2V0dGluZ3MqIGJ1ZmZlcmluZyAvKiBub25udWxsICovKQoreworICAgIEFMT0dWKCJnZXRCdWZmZXJpbmdTZXR0aW5ncyIpOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobVBsYXllciA9PSAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gbVBsYXllci0+Z2V0QnVmZmVyaW5nU2V0dGluZ3MoYnVmZmVyaW5nKTsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzZXRCdWZmZXJpbmdTZXR0aW5ncyhjb25zdCBCdWZmZXJpbmdTZXR0aW5ncyYgYnVmZmVyaW5nKQoreworICAgIEFMT0dWKCJzZXRCdWZmZXJpbmdTZXR0aW5ncyIpOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobVBsYXllciA9PSAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gbVBsYXllci0+c2V0QnVmZmVyaW5nU2V0dGluZ3MoYnVmZmVyaW5nKTsKK30KKworLy8gbXVzdCBjYWxsIHdpdGggbG9jayBoZWxkCitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OnByZXBhcmVBc3luY19sKCkKK3sKKyAgICBpZiAoIChtUGxheWVyICE9IDApICYmICggbUN1cnJlbnRTdGF0ZSAmIChNRURJQV9QTEFZRVIyX0lOSVRJQUxJWkVEIHwgTUVESUFfUExBWUVSMl9TVE9QUEVEKSApICkgeworICAgICAgICBpZiAobUF1ZGlvQXR0cmlidXRlc1BhcmNlbCAhPSBOVUxMKSB7CisgICAgICAgICAgICBtUGxheWVyLT5zZXRQYXJhbWV0ZXIoTUVESUEyX0tFWV9QQVJBTUVURVJfQVVESU9fQVRUUklCVVRFUywgKm1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVBsYXllci0+c2V0QXVkaW9TdHJlYW1UeXBlKG1TdHJlYW1UeXBlKTsKKyAgICAgICAgfQorICAgICAgICBtQ3VycmVudFN0YXRlID0gTUVESUFfUExBWUVSMl9QUkVQQVJJTkc7CisgICAgICAgIHJldHVybiBtUGxheWVyLT5wcmVwYXJlQXN5bmMoKTsKKyAgICB9CisgICAgQUxPR0UoInByZXBhcmVBc3luYyBjYWxsZWQgaW4gc3RhdGUgJWQsIG1QbGF5ZXIoJXApIiwgbUN1cnJlbnRTdGF0ZSwgbVBsYXllci5nZXQoKSk7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCisvLyBUT0RPOiBJbiBjYXNlIG9mIGVycm9yLCBwcmVwYXJlQXN5bmMgcHJvdmlkZXMgdGhlIGNhbGxlciB3aXRoIDIgZXJyb3IgY29kZXMsCisvLyBvbmUgZGVmaW5lZCBpbiB0aGUgQW5kcm9pZCBmcmFtZXdvcmsgYW5kIG9uZSBwcm92aWRlZCBieSB0aGUgaW1wbGVtZW50YXRpb24KKy8vIHRoYXQgZ2VuZXJhdGVkIHRoZSBlcnJvci4gVGhlIHN5bmMgdmVyc2lvbiBvZiBwcmVwYXJlIHJldHVybnMgb25seSAxIGVycm9yCisvLyBjb2RlLgorc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpwcmVwYXJlKCkKK3sKKyAgICBBTE9HVigicHJlcGFyZSIpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbUxvY2tUaHJlYWRJZCA9IGdldFRocmVhZElkKCk7CisgICAgaWYgKG1QcmVwYXJlU3luYykgeworICAgICAgICBtTG9ja1RocmVhZElkID0gMDsKKyAgICAgICAgcmV0dXJuIC1FQUxSRUFEWTsKKyAgICB9CisgICAgbVByZXBhcmVTeW5jID0gdHJ1ZTsKKyAgICBzdGF0dXNfdCByZXQgPSBwcmVwYXJlQXN5bmNfbCgpOworICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgbUxvY2tUaHJlYWRJZCA9IDA7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaWYgKG1QcmVwYXJlU3luYykgeworICAgICAgICBtU2lnbmFsLndhaXQobUxvY2spOyAgLy8gd2FpdCBmb3IgcHJlcGFyZSBkb25lCisgICAgICAgIG1QcmVwYXJlU3luYyA9IGZhbHNlOworICAgIH0KKyAgICBBTE9HVigicHJlcGFyZSBjb21wbGV0ZSAtIHN0YXR1cz0lZCIsIG1QcmVwYXJlU3RhdHVzKTsKKyAgICBtTG9ja1RocmVhZElkID0gMDsKKyAgICByZXR1cm4gbVByZXBhcmVTdGF0dXM7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6cHJlcGFyZUFzeW5jKCkKK3sKKyAgICBBTE9HVigicHJlcGFyZUFzeW5jIik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gcHJlcGFyZUFzeW5jX2woKTsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzdGFydCgpCit7CisgICAgQUxPR1YoInN0YXJ0Iik7CisKKyAgICBzdGF0dXNfdCByZXQgPSBOT19FUlJPUjsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworCisgICAgbUxvY2tUaHJlYWRJZCA9IGdldFRocmVhZElkKCk7CisKKyAgICBpZiAobUN1cnJlbnRTdGF0ZSAmIE1FRElBX1BMQVlFUjJfU1RBUlRFRCkgeworICAgICAgICByZXQgPSBOT19FUlJPUjsKKyAgICB9IGVsc2UgaWYgKCAobVBsYXllciAhPSAwKSAmJiAoIG1DdXJyZW50U3RhdGUgJiAoIE1FRElBX1BMQVlFUjJfUFJFUEFSRUQgfAorICAgICAgICAgICAgICAgICAgICBNRURJQV9QTEFZRVIyX1BMQVlCQUNLX0NPTVBMRVRFIHwgTUVESUFfUExBWUVSMl9QQVVTRUQgKSApICkgeworICAgICAgICBtUGxheWVyLT5zZXRMb29waW5nKG1Mb29wKTsKKyAgICAgICAgbVBsYXllci0+c2V0Vm9sdW1lKG1MZWZ0Vm9sdW1lLCBtUmlnaHRWb2x1bWUpOworICAgICAgICBtUGxheWVyLT5zZXRBdXhFZmZlY3RTZW5kTGV2ZWwobVNlbmRMZXZlbCk7CisgICAgICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9QTEFZRVIyX1NUQVJURUQ7CisgICAgICAgIHJldCA9IG1QbGF5ZXItPnN0YXJ0KCk7CisgICAgICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9QTEFZRVIyX1NUQVRFX0VSUk9SOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKG1DdXJyZW50U3RhdGUgPT0gTUVESUFfUExBWUVSMl9QTEFZQkFDS19DT01QTEVURSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJwbGF5YmFjayBjb21wbGV0ZWQgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHN0YXJ0KCkiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJzdGFydCBjYWxsZWQgaW4gc3RhdGUgJWQsIG1QbGF5ZXIoJXApIiwgbUN1cnJlbnRTdGF0ZSwgbVBsYXllci5nZXQoKSk7CisgICAgICAgIHJldCA9IElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIG1Mb2NrVGhyZWFkSWQgPSAwOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzdG9wKCkKK3sKKyAgICBBTE9HVigic3RvcCIpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1DdXJyZW50U3RhdGUgJiBNRURJQV9QTEFZRVIyX1NUT1BQRUQpIHJldHVybiBOT19FUlJPUjsKKyAgICBpZiAoIChtUGxheWVyICE9IDApICYmICggbUN1cnJlbnRTdGF0ZSAmICggTUVESUFfUExBWUVSMl9TVEFSVEVEIHwgTUVESUFfUExBWUVSMl9QUkVQQVJFRCB8CisgICAgICAgICAgICAgICAgICAgIE1FRElBX1BMQVlFUjJfUEFVU0VEIHwgTUVESUFfUExBWUVSMl9QTEFZQkFDS19DT01QTEVURSApICkgKSB7CisgICAgICAgIHN0YXR1c190IHJldCA9IG1QbGF5ZXItPnN0b3AoKTsKKyAgICAgICAgaWYgKHJldCAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IE1FRElBX1BMQVlFUjJfU1RBVEVfRVJST1I7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gTUVESUFfUExBWUVSMl9TVE9QUEVEOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIEFMT0dFKCJzdG9wIGNhbGxlZCBpbiBzdGF0ZSAlZCwgbVBsYXllciglcCkiLCBtQ3VycmVudFN0YXRlLCBtUGxheWVyLmdldCgpKTsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6cGF1c2UoKQoreworICAgIEFMT0dWKCJwYXVzZSIpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1DdXJyZW50U3RhdGUgJiAoTUVESUFfUExBWUVSMl9QQVVTRUR8TUVESUFfUExBWUVSMl9QTEFZQkFDS19DT01QTEVURSkpCisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICBpZiAoKG1QbGF5ZXIgIT0gMCkgJiYgKG1DdXJyZW50U3RhdGUgJiBNRURJQV9QTEFZRVIyX1NUQVJURUQpKSB7CisgICAgICAgIHN0YXR1c190IHJldCA9IG1QbGF5ZXItPnBhdXNlKCk7CisgICAgICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9QTEFZRVIyX1NUQVRFX0VSUk9SOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IE1FRElBX1BMQVlFUjJfUEFVU0VEOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIEFMT0dFKCJwYXVzZSBjYWxsZWQgaW4gc3RhdGUgJWQsIG1QbGF5ZXIoJXApIiwgbUN1cnJlbnRTdGF0ZSwgbVBsYXllci5nZXQoKSk7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitib29sIE1lZGlhUGxheWVyMjo6aXNQbGF5aW5nKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtUGxheWVyICE9IDApIHsKKyAgICAgICAgYm9vbCB0ZW1wID0gZmFsc2U7CisgICAgICAgIG1QbGF5ZXItPmlzUGxheWluZygmdGVtcCk7CisgICAgICAgIEFMT0dWKCJpc1BsYXlpbmc6ICVkIiwgdGVtcCk7CisgICAgICAgIGlmICgobUN1cnJlbnRTdGF0ZSAmIE1FRElBX1BMQVlFUjJfU1RBUlRFRCkgJiYgISB0ZW1wKSB7CisgICAgICAgICAgICBBTE9HRSgiaW50ZXJuYWwvZXh0ZXJuYWwgc3RhdGUgbWlzbWF0Y2ggY29ycmVjdGVkIik7CisgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gTUVESUFfUExBWUVSMl9QQVVTRUQ7CisgICAgICAgIH0gZWxzZSBpZiAoKG1DdXJyZW50U3RhdGUgJiBNRURJQV9QTEFZRVIyX1BBVVNFRCkgJiYgdGVtcCkgeworICAgICAgICAgICAgQUxPR0UoImludGVybmFsL2V4dGVybmFsIHN0YXRlIG1pc21hdGNoIGNvcnJlY3RlZCIpOworICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IE1FRElBX1BMQVlFUjJfU1RBUlRFRDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGVtcDsKKyAgICB9CisgICAgQUxPR1YoImlzUGxheWluZzogbm8gYWN0aXZlIHBsYXllciIpOworICAgIHJldHVybiBmYWxzZTsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzZXRQbGF5YmFja1NldHRpbmdzKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlJiByYXRlKQoreworICAgIEFMT0dWKCJzZXRQbGF5YmFja1NldHRpbmdzOiAlZiAlZiAlZCAlZCIsCisgICAgICAgICAgICByYXRlLm1TcGVlZCwgcmF0ZS5tUGl0Y2gsIHJhdGUubUZhbGxiYWNrTW9kZSwgcmF0ZS5tU3RyZXRjaE1vZGUpOworICAgIC8vIE5lZ2F0aXZlIHNwZWVkIGFuZCBwaXRjaCBkb2VzIG5vdCBtYWtlIHNlbnNlLiBGdXJ0aGVyIHZhbGlkYXRpb24gd2lsbAorICAgIC8vIGJlIGRvbmUgYnkgdGhlIHJlc3BlY3RpdmUgbWVkaWFwbGF5ZXJzLgorICAgIGlmIChyYXRlLm1TcGVlZCA8IDAuZiB8fCByYXRlLm1QaXRjaCA8IDAuZikgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtUGxheWVyID09IDAgfHwgKG1DdXJyZW50U3RhdGUgJiBNRURJQV9QTEFZRVIyX1NUT1BQRUQpKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBpZiAocmF0ZS5tU3BlZWQgIT0gMC5mICYmICEobUN1cnJlbnRTdGF0ZSAmIE1FRElBX1BMQVlFUjJfU1RBUlRFRCkKKyAgICAgICAgICAgICYmIChtQ3VycmVudFN0YXRlICYgKE1FRElBX1BMQVlFUjJfUFJFUEFSRUQgfCBNRURJQV9QTEFZRVIyX1BBVVNFRAorICAgICAgICAgICAgICAgICAgICB8IE1FRElBX1BMQVlFUjJfUExBWUJBQ0tfQ09NUExFVEUpKSkgeworICAgICAgICBtUGxheWVyLT5zZXRMb29waW5nKG1Mb29wKTsKKyAgICAgICAgbVBsYXllci0+c2V0Vm9sdW1lKG1MZWZ0Vm9sdW1lLCBtUmlnaHRWb2x1bWUpOworICAgICAgICBtUGxheWVyLT5zZXRBdXhFZmZlY3RTZW5kTGV2ZWwobVNlbmRMZXZlbCk7CisgICAgfQorCisgICAgc3RhdHVzX3QgZXJyID0gbVBsYXllci0+c2V0UGxheWJhY2tTZXR0aW5ncyhyYXRlKTsKKyAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgIGlmIChyYXRlLm1TcGVlZCA9PSAwLmYgJiYgbUN1cnJlbnRTdGF0ZSA9PSBNRURJQV9QTEFZRVIyX1NUQVJURUQpIHsKKyAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9QTEFZRVIyX1BBVVNFRDsKKyAgICAgICAgfSBlbHNlIGlmIChyYXRlLm1TcGVlZCAhPSAwLmYKKyAgICAgICAgICAgICAgICAmJiAobUN1cnJlbnRTdGF0ZSAmIChNRURJQV9QTEFZRVIyX1BSRVBBUkVEIHwgTUVESUFfUExBWUVSMl9QQVVTRUQKKyAgICAgICAgICAgICAgICAgICAgfCBNRURJQV9QTEFZRVIyX1BMQVlCQUNLX0NPTVBMRVRFKSkpIHsKKyAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9QTEFZRVIyX1NUQVJURUQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpnZXRQbGF5YmFja1NldHRpbmdzKEF1ZGlvUGxheWJhY2tSYXRlKiByYXRlIC8qIG5vbm51bGwgKi8pCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobVBsYXllciA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1QbGF5ZXItPmdldFBsYXliYWNrU2V0dGluZ3MocmF0ZSk7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6c2V0U3luY1NldHRpbmdzKGNvbnN0IEFWU3luY1NldHRpbmdzJiBzeW5jLCBmbG9hdCB2aWRlb0Zwc0hpbnQpCit7CisgICAgQUxPR1YoInNldFN5bmNTZXR0aW5nczogJXUgJXUgJWYgJWYiLAorICAgICAgICAgICAgc3luYy5tU291cmNlLCBzeW5jLm1BdWRpb0FkanVzdE1vZGUsIHN5bmMubVRvbGVyYW5jZSwgdmlkZW9GcHNIaW50KTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtUGxheWVyID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVBsYXllci0+c2V0U3luY1NldHRpbmdzKHN5bmMsIHZpZGVvRnBzSGludCk7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6Z2V0U3luY1NldHRpbmdzKAorICAgICAgICBBVlN5bmNTZXR0aW5ncyogc3luYyAvKiBub25udWxsICovLCBmbG9hdCogdmlkZW9GcHMgLyogbm9ubnVsbCAqLykKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtUGxheWVyID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVBsYXllci0+Z2V0U3luY1NldHRpbmdzKHN5bmMsIHZpZGVvRnBzKTsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpnZXRWaWRlb1dpZHRoKGludCAqdykKK3sKKyAgICBBTE9HVigiZ2V0VmlkZW9XaWR0aCIpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1QbGF5ZXIgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICp3ID0gbVZpZGVvV2lkdGg7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OmdldFZpZGVvSGVpZ2h0KGludCAqaCkKK3sKKyAgICBBTE9HVigiZ2V0VmlkZW9IZWlnaHQiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtUGxheWVyID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAqaCA9IG1WaWRlb0hlaWdodDsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6Z2V0Q3VycmVudFBvc2l0aW9uKGludCAqbXNlYykKK3sKKyAgICBBTE9HVigiZ2V0Q3VycmVudFBvc2l0aW9uIik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobVBsYXllciAhPSAwKSB7CisgICAgICAgIGlmIChtQ3VycmVudFBvc2l0aW9uID49IDApIHsKKyAgICAgICAgICAgIEFMT0dWKCJVc2luZyBjYWNoZWQgc2VlayBwb3NpdGlvbjogJWQiLCBtQ3VycmVudFBvc2l0aW9uKTsKKyAgICAgICAgICAgICptc2VjID0gbUN1cnJlbnRQb3NpdGlvbjsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbVBsYXllci0+Z2V0Q3VycmVudFBvc2l0aW9uKG1zZWMpOworICAgIH0KKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6Z2V0RHVyYXRpb25fbChpbnQgKm1zZWMpCit7CisgICAgQUxPR1YoImdldER1cmF0aW9uX2wiKTsKKyAgICBib29sIGlzVmFsaWRTdGF0ZSA9IChtQ3VycmVudFN0YXRlICYgKE1FRElBX1BMQVlFUjJfUFJFUEFSRUQgfCBNRURJQV9QTEFZRVIyX1NUQVJURUQgfAorICAgICAgICAgICAgTUVESUFfUExBWUVSMl9QQVVTRUQgfCBNRURJQV9QTEFZRVIyX1NUT1BQRUQgfCBNRURJQV9QTEFZRVIyX1BMQVlCQUNLX0NPTVBMRVRFKSk7CisgICAgaWYgKG1QbGF5ZXIgIT0gMCAmJiBpc1ZhbGlkU3RhdGUpIHsKKyAgICAgICAgaW50IGR1cmF0aW9uTXM7CisgICAgICAgIHN0YXR1c190IHJldCA9IG1QbGF5ZXItPmdldER1cmF0aW9uKCZkdXJhdGlvbk1zKTsKKworICAgICAgICBpZiAocmV0ICE9IE9LKSB7CisgICAgICAgICAgICAvLyBEbyBub3QgZW50ZXIgZXJyb3Igc3RhdGUganVzdCBiZWNhdXNlIG5vIGR1cmF0aW9uIHdhcyBhdmFpbGFibGUuCisgICAgICAgICAgICBkdXJhdGlvbk1zID0gLTE7CisgICAgICAgICAgICByZXQgPSBPSzsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtc2VjKSB7CisgICAgICAgICAgICAqbXNlYyA9IGR1cmF0aW9uTXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgQUxPR0UoIkF0dGVtcHQgdG8gY2FsbCBnZXREdXJhdGlvbiBpbiB3cm9uZyBzdGF0ZTogbVBsYXllcj0lcCwgbUN1cnJlbnRTdGF0ZT0ldSIsCisgICAgICAgICAgICBtUGxheWVyLmdldCgpLCBtQ3VycmVudFN0YXRlKTsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6Z2V0RHVyYXRpb24oaW50ICptc2VjKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIGdldER1cmF0aW9uX2wobXNlYyk7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6c2Vla1RvX2woaW50IG1zZWMsIE1lZGlhUGxheWVyMlNlZWtNb2RlIG1vZGUpCit7CisgICAgQUxPR1YoInNlZWtUbyAoJWQsICVkKSIsIG1zZWMsIG1vZGUpOworICAgIGlmICgobVBsYXllciAhPSAwKSAmJiAoIG1DdXJyZW50U3RhdGUgJiAoIE1FRElBX1BMQVlFUjJfU1RBUlRFRCB8IE1FRElBX1BMQVlFUjJfUFJFUEFSRUQgfAorICAgICAgICAgICAgTUVESUFfUExBWUVSMl9QQVVTRUQgfCAgTUVESUFfUExBWUVSMl9QTEFZQkFDS19DT01QTEVURSkgKSApIHsKKyAgICAgICAgaWYgKCBtc2VjIDwgMCApIHsKKyAgICAgICAgICAgIEFMT0dXKCJBdHRlbXB0IHRvIHNlZWsgdG8gaW52YWxpZCBwb3NpdGlvbjogJWQiLCBtc2VjKTsKKyAgICAgICAgICAgIG1zZWMgPSAwOworICAgICAgICB9CisKKyAgICAgICAgaW50IGR1cmF0aW9uTXM7CisgICAgICAgIHN0YXR1c190IGVyciA9IG1QbGF5ZXItPmdldER1cmF0aW9uKCZkdXJhdGlvbk1zKTsKKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HVygiU3RyZWFtIGhhcyBubyBkdXJhdGlvbiBhbmQgaXMgdGhlcmVmb3JlIG5vdCBzZWVrYWJsZS4iKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKworICAgICAgICBpZiAobXNlYyA+IGR1cmF0aW9uTXMpIHsKKyAgICAgICAgICAgIEFMT0dXKCJBdHRlbXB0IHRvIHNlZWsgdG8gcGFzdCBlbmQgb2YgZmlsZTogcmVxdWVzdCA9ICVkLCAiCisgICAgICAgICAgICAgICAgICAiZHVyYXRpb25NcyA9ICVkIiwKKyAgICAgICAgICAgICAgICAgIG1zZWMsCisgICAgICAgICAgICAgICAgICBkdXJhdGlvbk1zKTsKKworICAgICAgICAgICAgbXNlYyA9IGR1cmF0aW9uTXM7CisgICAgICAgIH0KKworICAgICAgICAvLyBjYWNoZSBkdXJhdGlvbgorICAgICAgICBtQ3VycmVudFBvc2l0aW9uID0gbXNlYzsKKyAgICAgICAgbUN1cnJlbnRTZWVrTW9kZSA9IG1vZGU7CisgICAgICAgIGlmIChtU2Vla1Bvc2l0aW9uIDwgMCkgeworICAgICAgICAgICAgbVNlZWtQb3NpdGlvbiA9IG1zZWM7CisgICAgICAgICAgICBtU2Vla01vZGUgPSBtb2RlOworICAgICAgICAgICAgcmV0dXJuIG1QbGF5ZXItPnNlZWtUbyhtc2VjLCBtb2RlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dWKCJTZWVrIGluIHByb2dyZXNzIC0gcXVldWUgdXAgc2Vla1RvWyVkLCAlZF0iLCBtc2VjLCBtb2RlKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKyAgICBBTE9HRSgiQXR0ZW1wdCB0byBwZXJmb3JtIHNlZWtUbyBpbiB3cm9uZyBzdGF0ZTogbVBsYXllcj0lcCwgbUN1cnJlbnRTdGF0ZT0ldSIsIG1QbGF5ZXIuZ2V0KCksCisgICAgICAgICAgICBtQ3VycmVudFN0YXRlKTsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6c2Vla1RvKGludCBtc2VjLCBNZWRpYVBsYXllcjJTZWVrTW9kZSBtb2RlKQoreworICAgIG1Mb2NrVGhyZWFkSWQgPSBnZXRUaHJlYWRJZCgpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gc2Vla1RvX2wobXNlYywgbW9kZSk7CisgICAgbUxvY2tUaHJlYWRJZCA9IDA7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjI6Om5vdGlmeUF0KGludDY0X3QgbWVkaWFUaW1lVXMpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobVBsYXllciAhPSAwKSB7CisgICAgICAgIHJldHVybiBtUGxheWVyLT5ub3RpZnlBdChtZWRpYVRpbWVVcyk7CisgICAgfQorICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpyZXNldF9sKCkKK3sKKyAgICBtTG9vcCA9IGZhbHNlOworICAgIGlmIChtQ3VycmVudFN0YXRlID09IE1FRElBX1BMQVlFUjJfSURMRSkgcmV0dXJuIE5PX0VSUk9SOworICAgIG1QcmVwYXJlU3luYyA9IGZhbHNlOworICAgIGlmIChtUGxheWVyICE9IDApIHsKKyAgICAgICAgc3RhdHVzX3QgcmV0ID0gbVBsYXllci0+cmVzZXQoKTsKKyAgICAgICAgaWYgKHJldCAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgQUxPR0UoInJlc2V0KCkgZmFpbGVkIHdpdGggcmV0dXJuIGNvZGUgKCVkKSIsIHJldCk7CisgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gTUVESUFfUExBWUVSMl9TVEFURV9FUlJPUjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1QbGF5ZXItPmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9QTEFZRVIyX0lETEU7CisgICAgICAgIH0KKyAgICAgICAgLy8gc2V0RGF0YVNvdXJjZSBoYXMgdG8gYmUgY2FsbGVkIGFnYWluIHRvIGNyZWF0ZSBhCisgICAgICAgIC8vIG5ldyBtZWRpYXBsYXllci4KKyAgICAgICAgbVBsYXllciA9IDA7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIGNsZWFyX2woKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6ZG9TZXRSZXRyYW5zbWl0RW5kcG9pbnQoY29uc3Qgc3A8TWVkaWFQbGF5ZXIyRW5naW5lPiYgcGxheWVyKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKworICAgIGlmIChwbGF5ZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBpZiAobVJldHJhbnNtaXRFbmRwb2ludFZhbGlkKSB7CisgICAgICAgIHJldHVybiBwbGF5ZXItPnNldFJldHJhbnNtaXRFbmRwb2ludCgmbVJldHJhbnNtaXRFbmRwb2ludCk7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OnJlc2V0KCkKK3sKKyAgICBBTE9HVigicmVzZXQiKTsKKyAgICBtTG9ja1RocmVhZElkID0gZ2V0VGhyZWFkSWQoKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHN0YXR1c190IHJlc3VsdCA9IHJlc2V0X2woKTsKKyAgICBtTG9ja1RocmVhZElkID0gMDsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6c2V0QXVkaW9TdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3QgdHlwZSkKK3sKKyAgICBBTE9HVigiTWVkaWFQbGF5ZXIyOjpzZXRBdWRpb1N0cmVhbVR5cGUiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtU3RyZWFtVHlwZSA9PSB0eXBlKSByZXR1cm4gTk9fRVJST1I7CisgICAgaWYgKG1DdXJyZW50U3RhdGUgJiAoIE1FRElBX1BMQVlFUjJfUFJFUEFSRUQgfCBNRURJQV9QTEFZRVIyX1NUQVJURUQgfAorICAgICAgICAgICAgICAgIE1FRElBX1BMQVlFUjJfUEFVU0VEIHwgTUVESUFfUExBWUVSMl9QTEFZQkFDS19DT01QTEVURSApICkgeworICAgICAgICAvLyBDYW4ndCBjaGFuZ2UgdGhlIHN0cmVhbSB0eXBlIGFmdGVyIHByZXBhcmUKKyAgICAgICAgQUxPR0UoInNldEF1ZGlvU3RyZWFtIGNhbGxlZCBpbiBzdGF0ZSAlZCIsIG1DdXJyZW50U3RhdGUpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIC8vIGNhY2hlCisgICAgbVN0cmVhbVR5cGUgPSB0eXBlOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpnZXRBdWRpb1N0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCAqdHlwZSkKK3sKKyAgICBBTE9HVigiZ2V0QXVkaW9TdHJlYW1UeXBlIik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAqdHlwZSA9IG1TdHJlYW1UeXBlOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzZXRMb29waW5nKGludCBsb29wKQoreworICAgIEFMT0dWKCJNZWRpYVBsYXllcjI6OnNldExvb3BpbmciKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1Mb29wID0gKGxvb3AgIT0gMCk7CisgICAgaWYgKG1QbGF5ZXIgIT0gMCkgeworICAgICAgICByZXR1cm4gbVBsYXllci0+c2V0TG9vcGluZyhsb29wKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitib29sIE1lZGlhUGxheWVyMjo6aXNMb29waW5nKCkgeworICAgIEFMT0dWKCJpc0xvb3BpbmciKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtUGxheWVyICE9IDApIHsKKyAgICAgICAgcmV0dXJuIG1Mb29wOworICAgIH0KKyAgICBBTE9HVigiaXNMb29waW5nOiBubyBhY3RpdmUgcGxheWVyIik7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OnNldFZvbHVtZShmbG9hdCBsZWZ0Vm9sdW1lLCBmbG9hdCByaWdodFZvbHVtZSkKK3sKKyAgICBBTE9HVigiTWVkaWFQbGF5ZXIyOjpzZXRWb2x1bWUoJWYsICVmKSIsIGxlZnRWb2x1bWUsIHJpZ2h0Vm9sdW1lKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1MZWZ0Vm9sdW1lID0gbGVmdFZvbHVtZTsKKyAgICBtUmlnaHRWb2x1bWUgPSByaWdodFZvbHVtZTsKKyAgICBpZiAobVBsYXllciAhPSAwKSB7CisgICAgICAgIHJldHVybiBtUGxheWVyLT5zZXRWb2x1bWUobGVmdFZvbHVtZSwgcmlnaHRWb2x1bWUpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6c2V0QXVkaW9TZXNzaW9uSWQoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCkKK3sKKyAgICBBTE9HVigiTWVkaWFQbGF5ZXIyOjpzZXRBdWRpb1Nlc3Npb25JZCglZCkiLCBzZXNzaW9uSWQpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKCEobUN1cnJlbnRTdGF0ZSAmIE1FRElBX1BMQVlFUjJfSURMRSkpIHsKKyAgICAgICAgQUxPR0UoInNldEF1ZGlvU2Vzc2lvbklkIGNhbGxlZCBpbiBzdGF0ZSAlZCIsIG1DdXJyZW50U3RhdGUpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIGlmIChzZXNzaW9uSWQgPCAwKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmIChzZXNzaW9uSWQgIT0gbUF1ZGlvU2Vzc2lvbklkKSB7CisgICAgICAgIEF1ZGlvU3lzdGVtOjphY3F1aXJlQXVkaW9TZXNzaW9uSWQoc2Vzc2lvbklkLCAtMSk7CisgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlQXVkaW9TZXNzaW9uSWQobUF1ZGlvU2Vzc2lvbklkLCAtMSk7CisgICAgICAgIG1BdWRpb1Nlc3Npb25JZCA9IHNlc3Npb25JZDsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCithdWRpb19zZXNzaW9uX3QgTWVkaWFQbGF5ZXIyOjpnZXRBdWRpb1Nlc3Npb25JZCgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbUF1ZGlvU2Vzc2lvbklkOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OnNldEF1eEVmZmVjdFNlbmRMZXZlbChmbG9hdCBsZXZlbCkKK3sKKyAgICBBTE9HVigiTWVkaWFQbGF5ZXIyOjpzZXRBdXhFZmZlY3RTZW5kTGV2ZWwoJWYpIiwgbGV2ZWwpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbVNlbmRMZXZlbCA9IGxldmVsOworICAgIGlmIChtUGxheWVyICE9IDApIHsKKyAgICAgICAgcmV0dXJuIG1QbGF5ZXItPnNldEF1eEVmZmVjdFNlbmRMZXZlbChsZXZlbCk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjphdHRhY2hBdXhFZmZlY3QoaW50IGVmZmVjdElkKQoreworICAgIEFMT0dWKCJNZWRpYVBsYXllcjI6OmF0dGFjaEF1eEVmZmVjdCglZCkiLCBlZmZlY3RJZCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobVBsYXllciA9PSAwIHx8CisgICAgICAgIChtQ3VycmVudFN0YXRlICYgTUVESUFfUExBWUVSMl9JRExFKSB8fAorICAgICAgICAobUN1cnJlbnRTdGF0ZSA9PSBNRURJQV9QTEFZRVIyX1NUQVRFX0VSUk9SICkpIHsKKyAgICAgICAgQUxPR0UoImF0dGFjaEF1eEVmZmVjdCBjYWxsZWQgaW4gc3RhdGUgJWQsIG1QbGF5ZXIoJXApIiwgbUN1cnJlbnRTdGF0ZSwgbVBsYXllci5nZXQoKSk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICByZXR1cm4gbVBsYXllci0+YXR0YWNoQXV4RWZmZWN0KGVmZmVjdElkKTsKK30KKworLy8gYWx3YXlzIGNhbGwgd2l0aCBsb2NrIGhlbGQKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6Y2hlY2tTdGF0ZUZvcktleVNldF9sKGludCBrZXkpCit7CisgICAgc3dpdGNoKGtleSkgeworICAgIGNhc2UgTUVESUEyX0tFWV9QQVJBTUVURVJfQVVESU9fQVRUUklCVVRFUzoKKyAgICAgICAgaWYgKG1DdXJyZW50U3RhdGUgJiAoIE1FRElBX1BMQVlFUjJfUFJFUEFSRUQgfCBNRURJQV9QTEFZRVIyX1NUQVJURUQgfAorICAgICAgICAgICAgICAgIE1FRElBX1BMQVlFUjJfUEFVU0VEIHwgTUVESUFfUExBWUVSMl9QTEFZQkFDS19DT01QTEVURSkgKSB7CisgICAgICAgICAgICAvLyBDYW4ndCBjaGFuZ2UgdGhlIGF1ZGlvIGF0dHJpYnV0ZXMgYWZ0ZXIgcHJlcGFyZQorICAgICAgICAgICAgQUxPR0UoInRyeWluZyB0byBzZXQgYXVkaW8gYXR0cmlidXRlcyBjYWxsZWQgaW4gc3RhdGUgJWQiLCBtQ3VycmVudFN0YXRlKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICAvLyBwYXJhbWV0ZXIgZG9lc24ndCByZXF1aXJlIHBsYXllciBzdGF0ZSBjaGVjaworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OnNldFBhcmFtZXRlcihpbnQga2V5LCBjb25zdCBQYXJjZWwmIHJlcXVlc3QpCit7CisgICAgQUxPR1YoIk1lZGlhUGxheWVyMjo6c2V0UGFyYW1ldGVyKCVkKSIsIGtleSk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAoY2hlY2tTdGF0ZUZvcktleVNldF9sKGtleSkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgc3dpdGNoIChrZXkpIHsKKyAgICBjYXNlIE1FRElBMl9LRVlfUEFSQU1FVEVSX0FVRElPX0FUVFJJQlVURVM6CisgICAgICAgIC8vIHNhdmUgdGhlIG1hcnNoYWxsZWQgYXVkaW8gYXR0cmlidXRlcworICAgICAgICBpZiAobUF1ZGlvQXR0cmlidXRlc1BhcmNlbCAhPSBOVUxMKSB7IGRlbGV0ZSBtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsOyB9OworICAgICAgICBtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsID0gbmV3IFBhcmNlbCgpOworICAgICAgICBtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsLT5hcHBlbmRGcm9tKCZyZXF1ZXN0LCAwLCByZXF1ZXN0LmRhdGFTaXplKCkpOworICAgICAgICBzdGF0dXMgPSBPSzsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgQUxPR1ZfSUYobVBsYXllciA9PSBOVUxMLCAic2V0UGFyYW1ldGVyOiBubyBhY3RpdmUgcGxheWVyIik7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChtUGxheWVyICE9IE5VTEwpIHsKKyAgICAgICAgc3RhdHVzID0gbVBsYXllci0+c2V0UGFyYW1ldGVyKGtleSwgcmVxdWVzdCk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6Z2V0UGFyYW1ldGVyKGludCBrZXksIFBhcmNlbCAqcmVwbHkpCit7CisgICAgQUxPR1YoIk1lZGlhUGxheWVyMjo6Z2V0UGFyYW1ldGVyKCVkKSIsIGtleSk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobVBsYXllciAhPSBOVUxMKSB7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9ICBtUGxheWVyLT5nZXRQYXJhbWV0ZXIoa2V5LCByZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dEKCJnZXRQYXJhbWV0ZXIgcmV0dXJucyAlZCIsIHN0YXR1cyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgQUxPR1YoImdldFBhcmFtZXRlcjogbm8gYWN0aXZlIHBsYXllciIpOworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzZXRSZXRyYW5zbWl0RW5kcG9pbnQoY29uc3QgY2hhciogYWRkclN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcG9ydCkgeworICAgIEFMT0dWKCJNZWRpYVBsYXllcjI6OnNldFJldHJhbnNtaXRFbmRwb2ludCglczolaHUpIiwKKyAgICAgICAgICAgIGFkZHJTdHJpbmcgPyBhZGRyU3RyaW5nIDogIihudWxsKSIsIHBvcnQpOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAoKG1QbGF5ZXIgIT0gTlVMTCkgfHwgKG1DdXJyZW50U3RhdGUgIT0gTUVESUFfUExBWUVSMl9JRExFKSkKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworCisgICAgaWYgKE5VTEwgPT0gYWRkclN0cmluZykgeworICAgICAgICBtUmV0cmFuc21pdEVuZHBvaW50VmFsaWQgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHN0cnVjdCBpbl9hZGRyIHNhZGRyOworICAgIGlmKCFpbmV0X2F0b24oYWRkclN0cmluZywgJnNhZGRyKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIG1lbXNldCgmbVJldHJhbnNtaXRFbmRwb2ludCwgMCwgc2l6ZW9mKG1SZXRyYW5zbWl0RW5kcG9pbnQpKTsKKyAgICBtUmV0cmFuc21pdEVuZHBvaW50LnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICAgIG1SZXRyYW5zbWl0RW5kcG9pbnQuc2luX2FkZHIgICA9IHNhZGRyOworICAgIG1SZXRyYW5zbWl0RW5kcG9pbnQuc2luX3BvcnQgICA9IGh0b25zKHBvcnQpOworICAgIG1SZXRyYW5zbWl0RW5kcG9pbnRWYWxpZCAgICAgICA9IHRydWU7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgTWVkaWFQbGF5ZXIyOjpub3RpZnkoaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKm9iaikKK3sKKyAgICBBTE9HVigibWVzc2FnZSByZWNlaXZlZCBtc2c9JWQsIGV4dDE9JWQsIGV4dDI9JWQiLCBtc2csIGV4dDEsIGV4dDIpOworICAgIGJvb2wgc2VuZCA9IHRydWU7CisgICAgYm9vbCBsb2NrZWQgPSBmYWxzZTsKKworICAgIC8vIFRPRE86IEluIHRoZSBmdXR1cmUsIHdlIG1pZ2h0IGJlIG9uIHRoZSBzYW1lIHRocmVhZCBpZiB0aGUgYXBwIGlzCisgICAgLy8gcnVubmluZyBpbiB0aGUgc2FtZSBwcm9jZXNzIGFzIHRoZSBtZWRpYSBzZXJ2ZXIuIEluIHRoYXQgY2FzZSwKKyAgICAvLyB0aGlzIHdpbGwgZGVhZGxvY2suCisgICAgLy8KKyAgICAvLyBUaGUgdGhyZWFkSWQgaGFjayBiZWxvdyB3b3JrcyBhcm91bmQgdGhpcyBmb3IgdGhlIGNhcmUgb2YgcHJlcGFyZSwKKyAgICAvLyBzZWVrVG8sIHN0YXJ0LCBhbmQgcmVzZXQgd2l0aGluIHRoZSBzYW1lIHByb2Nlc3MuCisgICAgLy8gRklYTUU6IFJlbWVtYmVyLCB0aGlzIGlzIGEgaGFjaywgaXQncyBub3QgZXZlbiBhIGhhY2sgdGhhdCBpcyBhcHBsaWVkCisgICAgLy8gY29uc2lzdGVudGx5IGZvciBhbGwgdXNlLWNhc2VzLCB0aGlzIG5lZWRzIHRvIGJlIHJldmlzaXRlZC4KKyAgICBpZiAobUxvY2tUaHJlYWRJZCAhPSBnZXRUaHJlYWRJZCgpKSB7CisgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICAgICAgbG9ja2VkID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBBbGxvd3MgY2FsbHMgZnJvbSBKTkkgaW4gaWRsZSBzdGF0ZSB0byBub3RpZnkgZXJyb3JzCisgICAgaWYgKCEobXNnID09IE1FRElBMl9FUlJPUiAmJiBtQ3VycmVudFN0YXRlID09IE1FRElBX1BMQVlFUjJfSURMRSkgJiYgbVBsYXllciA9PSAwKSB7CisgICAgICAgIEFMT0dWKCJub3RpZnkoJWQsICVkLCAlZCkgY2FsbGJhY2sgb24gZGlzY29ubmVjdGVkIG1lZGlhcGxheWVyIiwgbXNnLCBleHQxLCBleHQyKTsKKyAgICAgICAgaWYgKGxvY2tlZCkgbUxvY2sudW5sb2NrKCk7ICAgLy8gcmVsZWFzZSB0aGUgbG9jayB3aGVuIGRvbmUuCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG1zZykgeworICAgIGNhc2UgTUVESUEyX05PUDogLy8gaW50ZXJmYWNlIHRlc3QgbWVzc2FnZQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE1FRElBMl9QUkVQQVJFRDoKKyAgICAgICAgQUxPR1YoIk1lZGlhUGxheWVyMjo6bm90aWZ5KCkgcHJlcGFyZWQiKTsKKyAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IE1FRElBX1BMQVlFUjJfUFJFUEFSRUQ7CisgICAgICAgIGlmIChtUHJlcGFyZVN5bmMpIHsKKyAgICAgICAgICAgIEFMT0dWKCJzaWduYWwgYXBwbGljYXRpb24gdGhyZWFkIik7CisgICAgICAgICAgICBtUHJlcGFyZVN5bmMgPSBmYWxzZTsKKyAgICAgICAgICAgIG1QcmVwYXJlU3RhdHVzID0gTk9fRVJST1I7CisgICAgICAgICAgICBtU2lnbmFsLnNpZ25hbCgpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUVESUEyX0RSTV9JTkZPOgorICAgICAgICBBTE9HVigiTWVkaWFQbGF5ZXIyOjpub3RpZnkoKSBNRURJQTJfRFJNX0lORk8oJWQsICVkLCAlZCwgJXApIiwgbXNnLCBleHQxLCBleHQyLCBvYmopOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1FRElBMl9QTEFZQkFDS19DT01QTEVURToKKyAgICAgICAgQUxPR1YoInBsYXliYWNrIGNvbXBsZXRlIik7CisgICAgICAgIGlmIChtQ3VycmVudFN0YXRlID09IE1FRElBX1BMQVlFUjJfSURMRSkgeworICAgICAgICAgICAgQUxPR0UoInBsYXliYWNrIGNvbXBsZXRlIGluIGlkbGUgc3RhdGUiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1Mb29wKSB7CisgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gTUVESUFfUExBWUVSMl9QTEFZQkFDS19DT01QTEVURTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE1FRElBMl9FUlJPUjoKKyAgICAgICAgLy8gQWx3YXlzIGxvZyBlcnJvcnMuCisgICAgICAgIC8vIGV4dDE6IE1lZGlhIGZyYW1ld29yayBlcnJvciBjb2RlLgorICAgICAgICAvLyBleHQyOiBJbXBsZW1lbnRhdGlvbiBkZXBlbmRhbnQgZXJyb3IgY29kZS4KKyAgICAgICAgQUxPR0UoImVycm9yICglZCwgJWQpIiwgZXh0MSwgZXh0Mik7CisgICAgICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9QTEFZRVIyX1NUQVRFX0VSUk9SOworICAgICAgICBpZiAobVByZXBhcmVTeW5jKQorICAgICAgICB7CisgICAgICAgICAgICBBTE9HVigic2lnbmFsIGFwcGxpY2F0aW9uIHRocmVhZCIpOworICAgICAgICAgICAgbVByZXBhcmVTeW5jID0gZmFsc2U7CisgICAgICAgICAgICBtUHJlcGFyZVN0YXR1cyA9IGV4dDE7CisgICAgICAgICAgICBtU2lnbmFsLnNpZ25hbCgpOworICAgICAgICAgICAgc2VuZCA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUVESUEyX0lORk86CisgICAgICAgIC8vIGV4dDE6IE1lZGlhIGZyYW1ld29yayBlcnJvciBjb2RlLgorICAgICAgICAvLyBleHQyOiBJbXBsZW1lbnRhdGlvbiBkZXBlbmRhbnQgZXJyb3IgY29kZS4KKyAgICAgICAgaWYgKGV4dDEgIT0gTUVESUEyX0lORk9fVklERU9fVFJBQ0tfTEFHR0lORykgeworICAgICAgICAgICAgQUxPR1coImluZm8vd2FybmluZyAoJWQsICVkKSIsIGV4dDEsIGV4dDIpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUVESUEyX1NFRUtfQ09NUExFVEU6CisgICAgICAgIEFMT0dWKCJSZWNlaXZlZCBzZWVrIGNvbXBsZXRlIik7CisgICAgICAgIGlmIChtU2Vla1Bvc2l0aW9uICE9IG1DdXJyZW50UG9zaXRpb24gfHwgKG1TZWVrTW9kZSAhPSBtQ3VycmVudFNlZWtNb2RlKSkgeworICAgICAgICAgICAgQUxPR1YoIkV4ZWN1dGluZyBxdWV1ZWQgc2Vla1RvKCVkLCAlZCkiLCBtQ3VycmVudFBvc2l0aW9uLCBtQ3VycmVudFNlZWtNb2RlKTsKKyAgICAgICAgICAgIG1TZWVrUG9zaXRpb24gPSAtMTsKKyAgICAgICAgICAgIG1TZWVrTW9kZSA9IE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkM7CisgICAgICAgICAgICBzZWVrVG9fbChtQ3VycmVudFBvc2l0aW9uLCBtQ3VycmVudFNlZWtNb2RlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dWKCJBbGwgc2Vla3MgY29tcGxldGUgLSByZXR1cm4gdG8gcmVndWxhcmx5IHNjaGVkdWxlZCBwcm9ncmFtIik7CisgICAgICAgICAgICBtQ3VycmVudFBvc2l0aW9uID0gbVNlZWtQb3NpdGlvbiA9IC0xOworICAgICAgICAgICAgbUN1cnJlbnRTZWVrTW9kZSA9IG1TZWVrTW9kZSA9IE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkM7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNRURJQTJfQlVGRkVSSU5HX1VQREFURToKKyAgICAgICAgQUxPR1YoImJ1ZmZlcmluZyAlZCIsIGV4dDEpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1FRElBMl9TRVRfVklERU9fU0laRToKKyAgICAgICAgQUxPR1YoIk5ldyB2aWRlbyBzaXplICVkIHggJWQiLCBleHQxLCBleHQyKTsKKyAgICAgICAgbVZpZGVvV2lkdGggPSBleHQxOworICAgICAgICBtVmlkZW9IZWlnaHQgPSBleHQyOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1FRElBMl9OT1RJRllfVElNRToKKyAgICAgICAgQUxPR1YoIlJlY2VpdmVkIG5vdGlmeSB0aW1lIG1lc3NhZ2UiKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNRURJQTJfVElNRURfVEVYVDoKKyAgICAgICAgQUxPR1YoIlJlY2VpdmVkIHRpbWVkIHRleHQgbWVzc2FnZSIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1FRElBMl9TVUJUSVRMRV9EQVRBOgorICAgICAgICBBTE9HVigiUmVjZWl2ZWQgc3VidGl0bGUgZGF0YSBtZXNzYWdlIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUVESUEyX01FVEFfREFUQToKKyAgICAgICAgQUxPR1YoIlJlY2VpdmVkIHRpbWVkIG1ldGFkYXRhIG1lc3NhZ2UiKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgQUxPR1YoInVucmVjb2duaXplZCBtZXNzYWdlOiAoJWQsICVkLCAlZCkiLCBtc2csIGV4dDEsIGV4dDIpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBzcDxNZWRpYVBsYXllcjJMaXN0ZW5lcj4gbGlzdGVuZXIgPSBtTGlzdGVuZXI7CisgICAgaWYgKGxvY2tlZCkgbUxvY2sudW5sb2NrKCk7CisKKyAgICAvLyB0aGlzIHByZXZlbnRzIHJlLWVudHJhbnQgY2FsbHMgaW50byBjbGllbnQgY29kZQorICAgIGlmICgobGlzdGVuZXIgIT0gMCkgJiYgc2VuZCkgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobU5vdGlmeUxvY2spOworICAgICAgICBBTE9HVigiY2FsbGJhY2sgYXBwbGljYXRpb24iKTsKKyAgICAgICAgbGlzdGVuZXItPm5vdGlmeShtc2csIGV4dDEsIGV4dDIsIG9iaik7CisgICAgICAgIEFMT0dWKCJiYWNrIGZyb20gY2FsbGJhY2siKTsKKyAgICB9Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6c2V0TmV4dE1lZGlhUGxheWVyKGNvbnN0IHNwPE1lZGlhUGxheWVyMj4mIG5leHQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtUGxheWVyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgaWYgKG5leHQgIT0gTlVMTCAmJiAhKG5leHQtPm1DdXJyZW50U3RhdGUgJgorICAgICAgICAgICAgKE1FRElBX1BMQVlFUjJfUFJFUEFSRUQgfCBNRURJQV9QTEFZRVIyX1BBVVNFRCB8IE1FRElBX1BMQVlFUjJfUExBWUJBQ0tfQ09NUExFVEUpKSkgeworICAgICAgICBBTE9HRSgibmV4dCBwbGF5ZXIgaXMgbm90IHByZXBhcmVkIik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICByZXR1cm4gbVBsYXllci0+c2V0TmV4dFBsYXllcihuZXh0ID09IE5VTEwgPyBOVUxMIDogbmV4dC0+bVBsYXllcik7Cit9CisKK1ZvbHVtZVNoYXBlcjo6U3RhdHVzIE1lZGlhUGxheWVyMjo6YXBwbHlWb2x1bWVTaGFwZXIoCisgICAgICAgIGNvbnN0IHNwPFZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbj4mIGNvbmZpZ3VyYXRpb24sCisgICAgICAgIGNvbnN0IHNwPFZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uPiYgb3BlcmF0aW9uKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1QbGF5ZXIgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gVm9sdW1lU2hhcGVyOjpTdGF0dXMoTk9fSU5JVCk7CisgICAgfQorICAgIFZvbHVtZVNoYXBlcjo6U3RhdHVzIHN0YXR1cyA9IG1QbGF5ZXItPmFwcGx5Vm9sdW1lU2hhcGVyKGNvbmZpZ3VyYXRpb24sIG9wZXJhdGlvbik7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3A8Vm9sdW1lU2hhcGVyOjpTdGF0ZT4gTWVkaWFQbGF5ZXIyOjpnZXRWb2x1bWVTaGFwZXJTdGF0ZShpbnQgaWQpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobVBsYXllciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gbVBsYXllci0+Z2V0Vm9sdW1lU2hhcGVyU3RhdGUoaWQpOworfQorCisvLyBNb2R1bGFyIERSTQorc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpwcmVwYXJlRHJtKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgZHJtU2Vzc2lvbklkKQoreworICAgIC8vIFRPRE8gY2hhbmdlIHRvIEFMT0dWCisgICAgQUxPR0QoInByZXBhcmVEcm06IHV1aWQ6ICVwICBkcm1TZXNzaW9uSWQ6ICVwKCV6dSkiLCB1dWlkLAorICAgICAgICAgICAgZHJtU2Vzc2lvbklkLmFycmF5KCksIGRybVNlc3Npb25JZC5zaXplKCkpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1QbGF5ZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICAvLyBPbmx5IGFsbG93ZWQgaXQgaW4gcGxheWVyJ3MgcHJlcGFyaW5nL3ByZXBhcmVkIHN0YXRlLgorICAgIC8vIFdlIGdldCBoZXJlIG9ubHkgaWYgTUVESUFfRFJNX0lORk8gaGFzIGFscmVhZHkgYXJyaXZlZCAoZS5nLiwgcHJlcGFyZSBpcyBoYWxmLXdheSB0aHJvdWdoIG9yCisgICAgLy8gY29tcGxldGVkKSBzbyB0aGUgc3RhdGUgY2hhbmdlIHRvICJwcmVwYXJlZCIgbWlnaHQgbm90IGhhdmUgaGFwcGVuZWQgeWV0IChlLmcuLCBidWZmZXJpbmcpLgorICAgIC8vIFN0aWxsLCB3ZSBjYW4gYWxsb3cgcHJlcGFyZURybSBmb3IgdGhlIHVzZSBjYXNlIG9mIGJlaW5nIGNhbGxlZCBpbiBPbkRybUluZm9MaXN0ZW5lci4KKyAgICBpZiAoIShtQ3VycmVudFN0YXRlICYgKE1FRElBX1BMQVlFUjJfUFJFUEFSSU5HIHwgTUVESUFfUExBWUVSMl9QUkVQQVJFRCkpKSB7CisgICAgICAgIEFMT0dFKCJwcmVwYXJlRHJtIGlzIGNhbGxlZCBpbiB0aGUgd3Jvbmcgc3RhdGUgKCVkKS4iLCBtQ3VycmVudFN0YXRlKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGlmIChkcm1TZXNzaW9uSWQuaXNFbXB0eSgpKSB7CisgICAgICAgIEFMT0dFKCJwcmVwYXJlRHJtOiBVbmV4cGVjdGVkLiBDYW4ndCBwcm9jZWVkIHdpdGggY3J5cHRvLiBFbXB0eSBkcm1TZXNzaW9uSWQuIik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICAvLyBQYXNzaW5nIGRvd24gdG8gbWVkaWFzZXJ2ZXIgbWFpbmx5IGZvciBjcmVhdGluZyB0aGUgY3J5cHRvCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVBsYXllci0+cHJlcGFyZURybSh1dWlkLCBkcm1TZXNzaW9uSWQpOworICAgIEFMT0dFX0lGKHN0YXR1cyAhPSBPSywgInByZXBhcmVEcm06IEZhaWxlZCBhdCBtZWRpYXNlcnZlciB3aXRoIHJldDogJWQiLCBzdGF0dXMpOworCisgICAgLy8gVE9ETyBjaGFuZ2UgdG8gQUxPR1YKKyAgICBBTE9HRCgicHJlcGFyZURybTogbWVkaWFzZXJ2ZXI6OnByZXBhcmVEcm0gcmV0PSVkIiwgc3RhdHVzKTsKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6cmVsZWFzZURybSgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobVBsYXllciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIC8vIE5vdCBhbGxvd2luZyByZWxlYXNlRHJtIGluIGFuIGFjdGl2ZS9yZXN1bWFibGUgc3RhdGUKKyAgICBpZiAobUN1cnJlbnRTdGF0ZSAmIChNRURJQV9QTEFZRVIyX1NUQVJURUQgfAorICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX1BMQVlFUjJfUEFVU0VEIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9QTEFZRVIyX1BMQVlCQUNLX0NPTVBMRVRFIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9QTEFZRVIyX1NUQVRFX0VSUk9SKSkgeworICAgICAgICBBTE9HRSgicmVsZWFzZURybSBVbmV4cGVjdGVkIHN0YXRlICVkLiBDYW4gb25seSBiZSBjYWxsZWQgaW4gc3RvcHBlZC9pZGxlLiIsIG1DdXJyZW50U3RhdGUpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVBsYXllci0+cmVsZWFzZURybSgpOworICAgIC8vIFRPRE8gY2hhbmdlIHRvIEFMT0dWCisgICAgQUxPR0QoInJlbGVhc2VEcm06IG1lZGlhc2VydmVyOjpyZWxlYXNlRHJtIHJldDogJWQiLCBzdGF0dXMpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoInJlbGVhc2VEcm06IEZhaWxlZCBhdCBtZWRpYXNlcnZlciB3aXRoIHJldDogJWQiLCBzdGF0dXMpOworICAgICAgICAvLyBPdmVycmlkaW5nIHRvIE9LIHNvIHRoZSBjbGllbnQgcHJvY2VlZCB3aXRoIGl0cyBvd24gY2xlYW51cAorICAgICAgICAvLyBDbGllbnQgY2FuJ3QgZG8gbW9yZSBjbGVhbnVwLiBtZWRpYXNlcnZlciByZWxlYXNlIGl0cyBjcnlwdG8gYXQgZW5kIG9mIHNlc3Npb24gYW55d2F5LgorICAgICAgICBzdGF0dXMgPSBPSzsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OnNldE91dHB1dERldmljZShhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1QbGF5ZXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HVigic2V0T3V0cHV0RGV2aWNlOiBwbGF5ZXIgbm90IGluaXQiKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBtUGxheWVyLT5zZXRPdXRwdXREZXZpY2UoZGV2aWNlSWQpOworfQorCithdWRpb19wb3J0X2hhbmRsZV90IE1lZGlhUGxheWVyMjo6Z2V0Um91dGVkRGV2aWNlSWQoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1QbGF5ZXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HVigiZ2V0Um91dGVkRGV2aWNlSWQ6IHBsYXllciBub3QgaW5pdCIpOworICAgICAgICByZXR1cm4gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICB9CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZDsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtUGxheWVyLT5nZXRSb3V0ZWREZXZpY2VJZCgmZGV2aWNlSWQpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgfQorICAgIHJldHVybiBkZXZpY2VJZDsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjplbmFibGVBdWRpb0RldmljZUNhbGxiYWNrKGJvb2wgZW5hYmxlZCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtUGxheWVyID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1YoImFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2s6IHBsYXllciBub3QgaW5pdCIpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1QbGF5ZXItPmVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soZW5hYmxlZCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL251cGxheWVyMi9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWEvbnVwbGF5ZXIyL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYwOWJhMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL251cGxheWVyMi9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNjggQEAKK2NjX2xpYnJhcnlfc3RhdGljIHsKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkpXYWtlTG9jay5jcHAiLAorICAgICAgICAiR2VuZXJpY1NvdXJjZS5jcHAiLAorICAgICAgICAiSFRUUExpdmVTb3VyY2UuY3BwIiwKKyAgICAgICAgIk51UGxheWVyMi5jcHAiLAorICAgICAgICAiTnVQbGF5ZXIyQ0NEZWNvZGVyLmNwcCIsCisgICAgICAgICJOdVBsYXllcjJEZWNvZGVyLmNwcCIsCisgICAgICAgICJOdVBsYXllcjJEZWNvZGVyQmFzZS5jcHAiLAorICAgICAgICAiTnVQbGF5ZXIyRGVjb2RlclBhc3NUaHJvdWdoLmNwcCIsCisgICAgICAgICJOdVBsYXllcjJEcml2ZXIuY3BwIiwKKyAgICAgICAgIk51UGxheWVyMkRybS5jcHAiLAorICAgICAgICAiTnVQbGF5ZXIyUmVuZGVyZXIuY3BwIiwKKyAgICAgICAgIk51UGxheWVyMlN0cmVhbUxpc3RlbmVyLmNwcCIsCisgICAgICAgICJSVFNQU291cmNlLmNwcCIsCisgICAgICAgICJTdHJlYW1pbmdTb3VyY2UuY3BwIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYm1lZGlhL2luY2x1ZGUiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0IiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgcHJvZHVjdF92YXJpYWJsZXM6IHsKKyAgICAgICAgZGVidWdnYWJsZTogeworICAgICAgICAgICAgY2ZsYWdzOiBbCisgICAgICAgICAgICAgICAgIi1ERU5BQkxFX1NUQUdFRlJJR0hUX0VYUEVSSU1FTlRTIiwKKyAgICAgICAgICAgIF0sCisgICAgICAgIH0KKyAgICB9LAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJ1aSIsCisgICAgICAgICJsaWJndWkiLAorICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGlibWVkaWFkcm0iLAorICAgICAgICAibGlibWVkaWFuZGsiLAorICAgICAgICAibGlicG93ZXJtYW5hZ2VyIiwKKyAgICBdLAorCisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X251cGxheWVyMiIsCisKKyAgICB0YWdzOiBbImVuZyJdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBkaWFnOiB7CisgICAgICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIH0sCisgICAgfSwKKworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvbnVwbGF5ZXIyL0dlbmVyaWNTb3VyY2UuY3BwIGIvbWVkaWEvbGlibWVkaWEvbnVwbGF5ZXIyL0dlbmVyaWNTb3VyY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4YmM0ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9udXBsYXllcjIvR2VuZXJpY1NvdXJjZS5jcHAKQEAgLTAsMCArMSwxNjcxIEBACisvKgorICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkdlbmVyaWNTb3VyY2UiCisKKyNpbmNsdWRlICJHZW5lcmljU291cmNlLmgiCisjaW5jbHVkZSAiTnVQbGF5ZXIyRHJtLmgiCisKKyNpbmNsdWRlICJBbm90aGVyUGFja2V0U291cmNlLmgiCisjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUV4dHJhY3RvclNlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUhUVFBTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL05ka1dyYXBwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlRmFjdG9yeS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9JbnRlcmZhY2VVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDbG9jay5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KKyNpbmNsdWRlICIuLi8uLi9saWJzdGFnZWZyaWdodC9pbmNsdWRlL051Q2FjaGVkU291cmNlMi5oIgorI2luY2x1ZGUgIi4uLy4uL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSFRUUEJhc2UuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0aWMgY29uc3QgaW50IGtJbml0aWFsTWFya01zICAgICAgICA9IDUwMDA7ICAvLyA1c2VjcworCisvL3N0YXRpYyBjb25zdCBpbnQga1BhdXNlUGxheWJhY2tNYXJrTXMgID0gMjAwMDsgIC8vIDJzZWNzCitzdGF0aWMgY29uc3QgaW50IGtSZXN1bWVQbGF5YmFja01hcmtNcyA9IDE1MDAwOyAgLy8gMTVzZWNzCisKK051UGxheWVyMjo6R2VuZXJpY1NvdXJjZTo6R2VuZXJpY1NvdXJjZSgKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCisgICAgICAgIGJvb2wgdWlkVmFsaWQsCisgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgY29uc3Qgc3A8TWVkaWFDbG9jaz4gJm1lZGlhQ2xvY2spCisgICAgOiBTb3VyY2Uobm90aWZ5KSwKKyAgICAgIG1BdWRpb1RpbWVVcygwKSwKKyAgICAgIG1BdWRpb0xhc3REZXF1ZXVlVGltZVVzKDApLAorICAgICAgbVZpZGVvVGltZVVzKDApLAorICAgICAgbVZpZGVvTGFzdERlcXVldWVUaW1lVXMoMCksCisgICAgICBtUHJldkJ1ZmZlclBlcmNlbnRhZ2UoLTEpLAorICAgICAgbVBvbGxCdWZmZXJpbmdHZW5lcmF0aW9uKDApLAorICAgICAgbVNlbnRQYXVzZU9uQnVmZmVyaW5nKGZhbHNlKSwKKyAgICAgIG1BdWRpb0RhdGFHZW5lcmF0aW9uKDApLAorICAgICAgbVZpZGVvRGF0YUdlbmVyYXRpb24oMCksCisgICAgICBtRmV0Y2hTdWJ0aXRsZURhdGFHZW5lcmF0aW9uKDApLAorICAgICAgbUZldGNoVGltZWRUZXh0RGF0YUdlbmVyYXRpb24oMCksCisgICAgICBtRHVyYXRpb25VcygtMWxsKSwKKyAgICAgIG1BdWRpb0lzVm9yYmlzKGZhbHNlKSwKKyAgICAgIG1Jc1NlY3VyZShmYWxzZSksCisgICAgICBtSXNTdHJlYW1pbmcoZmFsc2UpLAorICAgICAgbVVJRFZhbGlkKHVpZFZhbGlkKSwKKyAgICAgIG1VSUQodWlkKSwKKyAgICAgIG1NZWRpYUNsb2NrKG1lZGlhQ2xvY2spLAorICAgICAgbUZkKC0xKSwKKyAgICAgIG1CaXRyYXRlKC0xbGwpLAorICAgICAgbVBlbmRpbmdSZWFkQnVmZmVyVHlwZXMoMCkgeworICAgIEFMT0dWKCJHZW5lcmljU291cmNlIik7CisgICAgQ0hFQ0sobWVkaWFDbG9jayAhPSBOVUxMKTsKKworICAgIG1CdWZmZXJpbmdTZXR0aW5ncy5tSW5pdGlhbE1hcmtNcyA9IGtJbml0aWFsTWFya01zOworICAgIG1CdWZmZXJpbmdTZXR0aW5ncy5tUmVzdW1lUGxheWJhY2tNYXJrTXMgPSBrUmVzdW1lUGxheWJhY2tNYXJrTXM7CisgICAgcmVzZXREYXRhU291cmNlKCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlOjpyZXNldERhdGFTb3VyY2UoKSB7CisgICAgQUxPR1YoInJlc2V0RGF0YVNvdXJjZSIpOworCisgICAgbUhUVFBTZXJ2aWNlLmNsZWFyKCk7CisgICAgbUh0dHBTb3VyY2UuY2xlYXIoKTsKKyAgICBtRGlzY29ubmVjdGVkID0gZmFsc2U7CisgICAgbVVyaS5jbGVhcigpOworICAgIG1VcmlIZWFkZXJzLmNsZWFyKCk7CisgICAgaWYgKG1GZCA+PSAwKSB7CisgICAgICAgIGNsb3NlKG1GZCk7CisgICAgICAgIG1GZCA9IC0xOworICAgIH0KKyAgICBtT2Zmc2V0ID0gMDsKKyAgICBtTGVuZ3RoID0gMDsKKyAgICBtU3RhcnRlZCA9IGZhbHNlOworICAgIG1QcmVwYXJpbmcgPSBmYWxzZTsKKworICAgIG1Jc0RybVByb3RlY3RlZCA9IGZhbHNlOworICAgIG1Jc0RybVJlbGVhc2VkID0gZmFsc2U7CisgICAgbUlzU2VjdXJlID0gZmFsc2U7CisgICAgbU1pbWVzLmNsZWFyKCk7Cit9CisKK3N0YXR1c190IE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTo6c2V0RGF0YVNvdXJjZSgKKyAgICAgICAgY29uc3Qgc3A8TWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICBjb25zdCBjaGFyICp1cmwsCisgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBBTE9HVigic2V0RGF0YVNvdXJjZSB1cmw6ICVzIiwgdXJsKTsKKworICAgIHJlc2V0RGF0YVNvdXJjZSgpOworCisgICAgbUhUVFBTZXJ2aWNlID0gaHR0cFNlcnZpY2U7CisgICAgbVVyaSA9IHVybDsKKworICAgIGlmIChoZWFkZXJzKSB7CisgICAgICAgIG1VcmlIZWFkZXJzID0gKmhlYWRlcnM7CisgICAgfQorCisgICAgLy8gZGVsYXkgZGF0YSBzb3VyY2UgY3JlYXRpb24gdG8gcHJlcGFyZUFzeW5jKCkgdG8gYXZvaWQgYmxvY2tpbmcKKyAgICAvLyB0aGUgY2FsbGluZyB0aHJlYWQgaW4gc2V0RGF0YVNvdXJjZSBmb3IgYW55IHNpZ25pZmljYW50IHRpbWUuCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2U6OnNldERhdGFTb3VyY2UoCisgICAgICAgIGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBBTE9HVigic2V0RGF0YVNvdXJjZSAlZC8lbGxkLyVsbGQiLCBmZCwgKGxvbmcgbG9uZylvZmZzZXQsIChsb25nIGxvbmcpbGVuZ3RoKTsKKworICAgIHJlc2V0RGF0YVNvdXJjZSgpOworCisgICAgbUZkID0gZHVwKGZkKTsKKyAgICBtT2Zmc2V0ID0gb2Zmc2V0OworICAgIG1MZW5ndGggPSBsZW5ndGg7CisKKyAgICAvLyBkZWxheSBkYXRhIHNvdXJjZSBjcmVhdGlvbiB0byBwcmVwYXJlQXN5bmMoKSB0byBhdm9pZCBibG9ja2luZworICAgIC8vIHRoZSBjYWxsaW5nIHRocmVhZCBpbiBzZXREYXRhU291cmNlIGZvciBhbnkgc2lnbmlmaWNhbnQgdGltZS4KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTo6c2V0RGF0YVNvdXJjZShjb25zdCBzcDxEYXRhU291cmNlPiYgc291cmNlKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBBTE9HVigic2V0RGF0YVNvdXJjZSAoc291cmNlOiAlcCkiLCBzb3VyY2UuZ2V0KCkpOworCisgICAgcmVzZXREYXRhU291cmNlKCk7CisgICAgbURhdGFTb3VyY2UgPSBzb3VyY2U7CisgICAgcmV0dXJuIE9LOworfQorCitzcDxNZXRhRGF0YT4gTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlOjpnZXRGaWxlRm9ybWF0TWV0YSgpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtRmlsZU1ldGE7Cit9CisKK3N0YXR1c190IE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTo6aW5pdEZyb21EYXRhU291cmNlKCkgeworICAgIHNwPElNZWRpYUV4dHJhY3Rvcj4gZXh0cmFjdG9yOworICAgIENIRUNLKG1EYXRhU291cmNlICE9IE5VTEwgfHwgbUZkICE9IC0xKTsKKyAgICBzcDxEYXRhU291cmNlPiBkYXRhU291cmNlID0gbURhdGFTb3VyY2U7CisgICAgY29uc3QgaW50IGZkID0gbUZkOworICAgIGNvbnN0IGludDY0X3Qgb2Zmc2V0ID0gbU9mZnNldDsKKyAgICBjb25zdCBpbnQ2NF90IGxlbmd0aCA9IG1MZW5ndGg7CisKKyAgICBtTG9jay51bmxvY2soKTsKKyAgICAvLyBUaGlzIG1pZ2h0IHRha2UgbG9uZyB0aW1lIGlmIGRhdGEgc291cmNlIGlzIG5vdCByZWxpYWJsZS4KKyAgICBpZiAoZGF0YVNvdXJjZSAhPSBudWxscHRyKSB7CisgICAgICAgIGV4dHJhY3RvciA9IE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6Q3JlYXRlKGRhdGFTb3VyY2UsIE5VTEwgLyogbWltZSAqLyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZXh0cmFjdG9yID0gTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpDcmVhdGVGcm9tRmQoCisgICAgICAgICAgICAgICAgZmQsIG9mZnNldCwgbGVuZ3RoLCBOVUxMIC8qIG1pbWUgKi8sICZkYXRhU291cmNlKTsKKyAgICB9CisKKyAgICBpZiAoZGF0YVNvdXJjZSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJpbml0RnJvbURhdGFTb3VyY2UsIGZhaWxlZCB0byBjcmVhdGUgZGF0YSBzb3VyY2UhIik7CisgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgaWYgKGV4dHJhY3RvciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJpbml0RnJvbURhdGFTb3VyY2UsIGNhbm5vdCBjcmVhdGUgZXh0cmFjdG9yISIpOworICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHNwPE1ldGFEYXRhPiBmaWxlTWV0YSA9IGV4dHJhY3Rvci0+Z2V0TWV0YURhdGEoKTsKKworICAgIHNpemVfdCBudW10cmFja3MgPSBleHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7CisgICAgaWYgKG51bXRyYWNrcyA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJpbml0RnJvbURhdGFTb3VyY2UsIHNvdXJjZSBoYXMgbm8gdHJhY2shIik7CisgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgbUxvY2subG9jaygpOworICAgIG1GZCA9IC0xOworICAgIG1EYXRhU291cmNlID0gZGF0YVNvdXJjZTsKKyAgICBtRmlsZU1ldGEgPSBmaWxlTWV0YTsKKyAgICBpZiAobUZpbGVNZXRhICE9IE5VTEwpIHsKKyAgICAgICAgaW50NjRfdCBkdXJhdGlvbjsKKyAgICAgICAgaWYgKG1GaWxlTWV0YS0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uKSkgeworICAgICAgICAgICAgbUR1cmF0aW9uVXMgPSBkdXJhdGlvbjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGludDMyX3QgdG90YWxCaXRyYXRlID0gMDsKKworICAgIG1NaW1lcy5jbGVhcigpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW10cmFja3M7ICsraSkgeworICAgICAgICBzcDxJTWVkaWFTb3VyY2U+IHRyYWNrID0gZXh0cmFjdG9yLT5nZXRUcmFjayhpKTsKKyAgICAgICAgaWYgKHRyYWNrID09IE5VTEwpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBleHRyYWN0b3ItPmdldFRyYWNrTWV0YURhdGEoaSk7CisgICAgICAgIGlmIChtZXRhID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dFKCJubyBtZXRhZGF0YSBmb3IgdHJhY2sgJXp1IiwgaSk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgICAgIENIRUNLKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKKworICAgICAgICBBTE9HVigiaW5pdEZyb21EYXRhU291cmNlIHRyYWNrWyV6dV06ICVzIiwgaSwgbWltZSk7CisKKyAgICAgICAgLy8gRG8gdGhlIHN0cmluZyBjb21wYXJlIGltbWVkaWF0ZWx5IHdpdGggIm1pbWUiLAorICAgICAgICAvLyB3ZSBjYW4ndCBhc3N1bWUgIm1pbWUiIHdvdWxkIHN0YXkgdmFsaWQgYWZ0ZXIgYW5vdGhlcgorICAgICAgICAvLyBleHRyYWN0b3Igb3BlcmF0aW9uLCBzb21lIGV4dHJhY3RvcnMgbWlnaHQgbW9kaWZ5IG1ldGEKKyAgICAgICAgLy8gZHVyaW5nIGdldFRyYWNrKCkgYW5kIG1ha2UgaXQgaW52YWxpZC4KKyAgICAgICAgaWYgKCFzdHJuY2FzZWNtcChtaW1lLCAiYXVkaW8vIiwgNikpIHsKKyAgICAgICAgICAgIGlmIChtQXVkaW9UcmFjay5tU291cmNlID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBtQXVkaW9UcmFjay5tSW5kZXggPSBpOworICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrLm1Tb3VyY2UgPSB0cmFjazsKKyAgICAgICAgICAgICAgICBtQXVkaW9UcmFjay5tUGFja2V0cyA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBBbm90aGVyUGFja2V0U291cmNlKG1BdWRpb1RyYWNrLm1Tb3VyY2UtPmdldEZvcm1hdCgpKTsKKworICAgICAgICAgICAgICAgIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMpKSB7CisgICAgICAgICAgICAgICAgICAgIG1BdWRpb0lzVm9yYmlzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtQXVkaW9Jc1ZvcmJpcyA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1NaW1lcy5hZGQoU3RyaW5nOChtaW1lKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jYXNlY21wKG1pbWUsICJ2aWRlby8iLCA2KSkgeworICAgICAgICAgICAgaWYgKG1WaWRlb1RyYWNrLm1Tb3VyY2UgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1WaWRlb1RyYWNrLm1JbmRleCA9IGk7CisgICAgICAgICAgICAgICAgbVZpZGVvVHJhY2subVNvdXJjZSA9IHRyYWNrOworICAgICAgICAgICAgICAgIG1WaWRlb1RyYWNrLm1QYWNrZXRzID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IEFub3RoZXJQYWNrZXRTb3VyY2UobVZpZGVvVHJhY2subVNvdXJjZS0+Z2V0Rm9ybWF0KCkpOworCisgICAgICAgICAgICAgICAgLy8gdmlkZW8gYWx3YXlzIGF0IHRoZSBiZWdpbm5pbmcKKyAgICAgICAgICAgICAgICBtTWltZXMuaW5zZXJ0QXQoU3RyaW5nOChtaW1lKSwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBtU291cmNlcy5wdXNoKHRyYWNrKTsKKyAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzOworICAgICAgICBpZiAobWV0YS0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uVXMpKSB7CisgICAgICAgICAgICBpZiAoZHVyYXRpb25VcyA+IG1EdXJhdGlvblVzKSB7CisgICAgICAgICAgICAgICAgbUR1cmF0aW9uVXMgPSBkdXJhdGlvblVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCBiaXRyYXRlOworICAgICAgICBpZiAodG90YWxCaXRyYXRlID49IDAgJiYgbWV0YS0+ZmluZEludDMyKGtLZXlCaXRSYXRlLCAmYml0cmF0ZSkpIHsKKyAgICAgICAgICAgIHRvdGFsQml0cmF0ZSArPSBiaXRyYXRlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdG90YWxCaXRyYXRlID0gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBTE9HVigiaW5pdEZyb21EYXRhU291cmNlIG1Tb3VyY2VzLnNpemUoKTogJXp1ICBtSXNTZWN1cmU6ICVkICBtaW1lWzBdOiAlcyIsIG1Tb3VyY2VzLnNpemUoKSwKKyAgICAgICAgICAgIG1Jc1NlY3VyZSwgKG1NaW1lcy5pc0VtcHR5KCkgPyAiTk9ORSIgOiBtTWltZXNbMF0uc3RyaW5nKCkpKTsKKworICAgIGlmIChtU291cmNlcy5zaXplKCkgPT0gMCkgeworICAgICAgICBBTE9HRSgiYi8yMzcwNTY5NSIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICAvLyBNb2R1bGFyIERSTTogVGhlIHJldHVybiB2YWx1ZSBkb2Vzbid0IGFmZmVjdCBzb3VyY2UgaW5pdGlhbGl6YXRpb24uCisgICAgKHZvaWQpY2hlY2tEcm1JbmZvKCk7CisKKyAgICBtQml0cmF0ZSA9IHRvdGFsQml0cmF0ZTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlOjpnZXRCdWZmZXJpbmdTZXR0aW5ncygKKyAgICAgICAgQnVmZmVyaW5nU2V0dGluZ3MqIGJ1ZmZlcmluZyAvKiBub25udWxsICovKSB7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICAqYnVmZmVyaW5nID0gbUJ1ZmZlcmluZ1NldHRpbmdzOworICAgIH0KKworICAgIEFMT0dWKCJnZXRCdWZmZXJpbmdTZXR0aW5nc3slc30iLCBidWZmZXJpbmctPnRvU3RyaW5nKCkuc3RyaW5nKCkpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlOjpzZXRCdWZmZXJpbmdTZXR0aW5ncyhjb25zdCBCdWZmZXJpbmdTZXR0aW5ncyYgYnVmZmVyaW5nKSB7CisgICAgQUxPR1YoInNldEJ1ZmZlcmluZ1NldHRpbmdzeyVzfSIsIGJ1ZmZlcmluZy50b1N0cmluZygpLnN0cmluZygpKTsKKworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbUJ1ZmZlcmluZ1NldHRpbmdzID0gYnVmZmVyaW5nOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlOjpzdGFydFNvdXJjZXMoKSB7CisgICAgLy8gU3RhcnQgdGhlIHNlbGVjdGVkIEEvViB0cmFja3Mgbm93IGJlZm9yZSB3ZSBzdGFydCBidWZmZXJpbmcuCisgICAgLy8gV2lkZXZpbmUgc291cmNlcyBtaWdodCByZS1pbml0aWFsaXplIGNyeXB0byB3aGVuIHN0YXJ0aW5nLCBpZiB3ZSBkZWxheQorICAgIC8vIHRoaXMgdG8gc3RhcnQoKSwgYWxsIGRhdGEgYnVmZmVyZWQgZHVyaW5nIHByZXBhcmUgd291bGQgYmUgd2FzdGVkLgorICAgIC8vIChXZSBkb24ndCBhY3R1YWxseSBzdGFydCByZWFkaW5nIHVudGlsIHN0YXJ0KCkuKQorICAgIC8vCisgICAgLy8gVE9ETzogdGhpcyBsb2dpYyBtYXkgbm8gbG9uZ2VyIGJlIHJlbGV2YW50IGFmdGVyIHRoZSByZW1vdmFsIG9mIHdpZGV2aW5lCisgICAgLy8gc3VwcG9ydAorICAgIGlmIChtQXVkaW9UcmFjay5tU291cmNlICE9IE5VTEwgJiYgbUF1ZGlvVHJhY2subVNvdXJjZS0+c3RhcnQoKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIHN0YXJ0IGF1ZGlvIHRyYWNrISIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBpZiAobVZpZGVvVHJhY2subVNvdXJjZSAhPSBOVUxMICYmIG1WaWRlb1RyYWNrLm1Tb3VyY2UtPnN0YXJ0KCkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoImZhaWxlZCB0byBzdGFydCB2aWRlbyB0cmFjayEiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitpbnQ2NF90IE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTo6Z2V0TGFzdFJlYWRQb3NpdGlvbigpIHsKKyAgICBpZiAobUF1ZGlvVHJhY2subVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgIHJldHVybiBtQXVkaW9UaW1lVXM7CisgICAgfSBlbHNlIGlmIChtVmlkZW9UcmFjay5tU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIG1WaWRlb1RpbWVVczsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKK2Jvb2wgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlOjppc1N0cmVhbWluZygpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtSXNTdHJlYW1pbmc7Cit9CisKK051UGxheWVyMjo6R2VuZXJpY1NvdXJjZTo6fkdlbmVyaWNTb3VyY2UoKSB7CisgICAgQUxPR1YoIn5HZW5lcmljU291cmNlIik7CisgICAgaWYgKG1Mb29wZXIgIT0gTlVMTCkgeworICAgICAgICBtTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihpZCgpKTsKKyAgICAgICAgbUxvb3Blci0+c3RvcCgpOworICAgIH0KKyAgICByZXNldERhdGFTb3VyY2UoKTsKK30KKwordm9pZCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2U6OnByZXBhcmVBc3luYygpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIEFMT0dWKCJwcmVwYXJlQXN5bmM6IChsb29wZXI6ICVkKSIsIChtTG9vcGVyICE9IE5VTEwpKTsKKworICAgIGlmIChtTG9vcGVyID09IE5VTEwpIHsKKyAgICAgICAgbUxvb3BlciA9IG5ldyBBTG9vcGVyOworICAgICAgICBtTG9vcGVyLT5zZXROYW1lKCJnZW5lcmljIik7CisgICAgICAgIG1Mb29wZXItPnN0YXJ0KCk7CisKKyAgICAgICAgbUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKHRoaXMpOworICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRQcmVwYXJlQXN5bmMsIHRoaXMpOworICAgIG1zZy0+cG9zdCgpOworfQorCit2b2lkIE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTo6b25QcmVwYXJlQXN5bmMoKSB7CisgICAgQUxPR1YoIm9uUHJlcGFyZUFzeW5jOiBtRGF0YVNvdXJjZTogJWQiLCAobURhdGFTb3VyY2UgIT0gTlVMTCkpOworCisgICAgLy8gZGVsYXllZCBkYXRhIHNvdXJjZSBjcmVhdGlvbgorICAgIGlmIChtRGF0YVNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgIC8vIHNldCB0byBmYWxzZSBmaXJzdCwgaWYgdGhlIGV4dHJhY3RvcgorICAgICAgICAvLyBjb21lcyBiYWNrIGFzIHNlY3VyZSwgc2V0IGl0IHRvIHRydWUgdGhlbi4KKyAgICAgICAgbUlzU2VjdXJlID0gZmFsc2U7CisKKyAgICAgICAgaWYgKCFtVXJpLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVyaSA9IG1VcmkuY19zdHIoKTsKKyAgICAgICAgICAgIFN0cmluZzggY29udGVudFR5cGU7CisKKyAgICAgICAgICAgIGlmICghc3RybmNhc2VjbXAoImh0dHA6Ly8iLCB1cmksIDcpIHx8ICFzdHJuY2FzZWNtcCgiaHR0cHM6Ly8iLCB1cmksIDgpKSB7CisgICAgICAgICAgICAgICAgbUh0dHBTb3VyY2UgPSBEYXRhU291cmNlRmFjdG9yeTo6Q3JlYXRlTWVkaWFIVFRQKG1IVFRQU2VydmljZSk7CisgICAgICAgICAgICAgICAgaWYgKG1IdHRwU291cmNlID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjcmVhdGUgaHR0cCBzb3VyY2UhIik7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeVByZXBhcmVkQW5kQ2xlYW51cChVTktOT1dOX0VSUk9SKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAvLyBUaGlzIG1pZ2h0IHRha2UgbG9uZyB0aW1lIGlmIGNvbm5lY3Rpb24gaGFzIHNvbWUgaXNzdWUuCisgICAgICAgICAgICBzcDxEYXRhU291cmNlPiBkYXRhU291cmNlID0gRGF0YVNvdXJjZUZhY3Rvcnk6OkNyZWF0ZUZyb21VUkkoCisgICAgICAgICAgICAgICAgICAgbUhUVFBTZXJ2aWNlLCB1cmksICZtVXJpSGVhZGVycywgJmNvbnRlbnRUeXBlLAorICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEhUVFBCYXNlICo+KG1IdHRwU291cmNlLmdldCgpKSk7CisgICAgICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgICAgICAgICBpZiAoIW1EaXNjb25uZWN0ZWQpIHsKKyAgICAgICAgICAgICAgICBtRGF0YVNvdXJjZSA9IGRhdGFTb3VyY2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAobUZkID09IC0xICYmIG1EYXRhU291cmNlID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY3JlYXRlIGRhdGEgc291cmNlISIpOworICAgICAgICAgICAgbm90aWZ5UHJlcGFyZWRBbmRDbGVhbnVwKFVOS05PV05fRVJST1IpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1EYXRhU291cmNlICE9IG51bGxwdHIgJiYgbURhdGFTb3VyY2UtPmZsYWdzKCkgJiBEYXRhU291cmNlOjprSXNDYWNoaW5nRGF0YVNvdXJjZSkgeworICAgICAgICBtQ2FjaGVkU291cmNlID0gc3RhdGljX2Nhc3Q8TnVDYWNoZWRTb3VyY2UyICo+KG1EYXRhU291cmNlLmdldCgpKTsKKyAgICB9CisKKyAgICAvLyBGb3IgY2FjaGVkIHN0cmVhbWluZyBjYXNlcywgd2UgbmVlZCB0byB3YWl0IGZvciBlbm91Z2gKKyAgICAvLyBidWZmZXJpbmcgYmVmb3JlIHJlcG9ydGluZyBwcmVwYXJlZC4KKyAgICBtSXNTdHJlYW1pbmcgPSAobUNhY2hlZFNvdXJjZSAhPSBOVUxMKTsKKworICAgIC8vIGluaXQgZXh0cmFjdG9yIGZyb20gZGF0YSBzb3VyY2UKKyAgICBzdGF0dXNfdCBlcnIgPSBpbml0RnJvbURhdGFTb3VyY2UoKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBpbml0IGZyb20gZGF0YSBzb3VyY2UhIik7CisgICAgICAgIG5vdGlmeVByZXBhcmVkQW5kQ2xlYW51cChlcnIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1WaWRlb1RyYWNrLm1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IGdldEZvcm1hdE1ldGFfbChmYWxzZSAvKiBhdWRpbyAqLyk7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgIGVyciA9IGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZShtZXRhLCAmbXNnKTsKKyAgICAgICAgaWYoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBub3RpZnlQcmVwYXJlZEFuZENsZWFudXAoZXJyKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlWaWRlb1NpemVDaGFuZ2VkKG1zZyk7CisgICAgfQorCisgICAgbm90aWZ5RmxhZ3NDaGFuZ2VkKAorICAgICAgICAgICAgLy8gRkxBR19TRUNVUkUgd2lsbCBiZSBrbm93biBpZi93aGVuIHByZXBhcmVEcm0gaXMgY2FsbGVkIGJ5IHRoZSBhcHAKKyAgICAgICAgICAgIC8vIEZMQUdfUFJPVEVDVEVEIHdpbGwgYmUga25vd24gaWYvd2hlbiBwcmVwYXJlRHJtIGlzIGNhbGxlZCBieSB0aGUgYXBwCisgICAgICAgICAgICBGTEFHX0NBTl9QQVVTRSB8CisgICAgICAgICAgICBGTEFHX0NBTl9TRUVLX0JBQ0tXQVJEIHwKKyAgICAgICAgICAgIEZMQUdfQ0FOX1NFRUtfRk9SV0FSRCB8CisgICAgICAgICAgICBGTEFHX0NBTl9TRUVLKTsKKworICAgIGZpbmlzaFByZXBhcmVBc3luYygpOworCisgICAgQUxPR1YoIm9uUHJlcGFyZUFzeW5jOiBEb25lIik7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlOjpmaW5pc2hQcmVwYXJlQXN5bmMoKSB7CisgICAgQUxPR1YoImZpbmlzaFByZXBhcmVBc3luYyIpOworCisgICAgc3RhdHVzX3QgZXJyID0gc3RhcnRTb3VyY2VzKCk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGluaXQgc3RhcnQgZGF0YSBzb3VyY2UhIik7CisgICAgICAgIG5vdGlmeVByZXBhcmVkQW5kQ2xlYW51cChlcnIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1Jc1N0cmVhbWluZykgeworICAgICAgICBtQ2FjaGVkU291cmNlLT5yZXN1bWVGZXRjaGluZ0lmTmVjZXNzYXJ5KCk7CisgICAgICAgIG1QcmVwYXJpbmcgPSB0cnVlOworICAgICAgICBzY2hlZHVsZVBvbGxCdWZmZXJpbmcoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBub3RpZnlQcmVwYXJlZCgpOworICAgIH0KKworICAgIGlmIChtQXVkaW9UcmFjay5tU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgcG9zdFJlYWRCdWZmZXIoTUVESUFfVFJBQ0tfVFlQRV9BVURJTyk7CisgICAgfQorCisgICAgaWYgKG1WaWRlb1RyYWNrLm1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICBwb3N0UmVhZEJ1ZmZlcihNRURJQV9UUkFDS19UWVBFX1ZJREVPKTsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlOjpub3RpZnlQcmVwYXJlZEFuZENsZWFudXAoc3RhdHVzX3QgZXJyKSB7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBtRGF0YVNvdXJjZS5jbGVhcigpOworICAgICAgICBtQ2FjaGVkU291cmNlLmNsZWFyKCk7CisgICAgICAgIG1IdHRwU291cmNlLmNsZWFyKCk7CisKKyAgICAgICAgbUJpdHJhdGUgPSAtMTsKKyAgICAgICAgbVByZXZCdWZmZXJQZXJjZW50YWdlID0gLTE7CisgICAgICAgICsrbVBvbGxCdWZmZXJpbmdHZW5lcmF0aW9uOworICAgIH0KKyAgICBub3RpZnlQcmVwYXJlZChlcnIpOworfQorCit2b2lkIE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTo6c3RhcnQoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBBTE9HSSgic3RhcnQiKTsKKworICAgIGlmIChtQXVkaW9UcmFjay5tU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgcG9zdFJlYWRCdWZmZXIoTUVESUFfVFJBQ0tfVFlQRV9BVURJTyk7CisgICAgfQorCisgICAgaWYgKG1WaWRlb1RyYWNrLm1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICBwb3N0UmVhZEJ1ZmZlcihNRURJQV9UUkFDS19UWVBFX1ZJREVPKTsKKyAgICB9CisKKyAgICBtU3RhcnRlZCA9IHRydWU7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlOjpzdG9wKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKK30KKwordm9pZCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2U6OnBhdXNlKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKK30KKwordm9pZCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2U6OnJlc3VtZSgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1TdGFydGVkID0gdHJ1ZTsKK30KKwordm9pZCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2U6OmRpc2Nvbm5lY3QoKSB7CisgICAgc3A8RGF0YVNvdXJjZT4gZGF0YVNvdXJjZSwgaHR0cFNvdXJjZTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIGRhdGFTb3VyY2UgPSBtRGF0YVNvdXJjZTsKKyAgICAgICAgaHR0cFNvdXJjZSA9IG1IdHRwU291cmNlOworICAgICAgICBtRGlzY29ubmVjdGVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoZGF0YVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgIC8vIGRpc2Nvbm5lY3QgZGF0YSBzb3VyY2UKKyAgICAgICAgaWYgKGRhdGFTb3VyY2UtPmZsYWdzKCkgJiBEYXRhU291cmNlOjprSXNDYWNoaW5nRGF0YVNvdXJjZSkgeworICAgICAgICAgICAgc3RhdGljX2Nhc3Q8TnVDYWNoZWRTb3VyY2UyICo+KGRhdGFTb3VyY2UuZ2V0KCkpLT5kaXNjb25uZWN0KCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGh0dHBTb3VyY2UgIT0gTlVMTCkgeworICAgICAgICBzdGF0aWNfY2FzdDxIVFRQQmFzZSAqPihodHRwU291cmNlLmdldCgpKS0+ZGlzY29ubmVjdCgpOworICAgIH0KK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlOjpmZWVkTW9yZVRTRGF0YSgpIHsKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlOjpzZW5kQ2FjaGVTdGF0cygpIHsKKyAgICBpbnQzMl90IGticHMgPSAwOworICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisKKyAgICBpZiAobUNhY2hlZFNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgIGVyciA9IG1DYWNoZWRTb3VyY2UtPmdldEVzdGltYXRlZEJhbmR3aWR0aEticHMoJmticHMpOworICAgIH0KKworICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IGR1cE5vdGlmeSgpOworICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRDYWNoZVN0YXRzKTsKKyAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiYmFuZHdpZHRoIiwga2Jwcyk7CisgICAgICAgIG5vdGlmeS0+cG9zdCgpOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2U6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgICBjYXNlIGtXaGF0UHJlcGFyZUFzeW5jOgorICAgICAgeworICAgICAgICAgIG9uUHJlcGFyZUFzeW5jKCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIGtXaGF0RmV0Y2hTdWJ0aXRsZURhdGE6CisgICAgICB7CisgICAgICAgICAgZmV0Y2hUZXh0RGF0YShrV2hhdFNlbmRTdWJ0aXRsZURhdGEsIE1FRElBX1RSQUNLX1RZUEVfU1VCVElUTEUsCisgICAgICAgICAgICAgICAgICBtRmV0Y2hTdWJ0aXRsZURhdGFHZW5lcmF0aW9uLCBtU3VidGl0bGVUcmFjay5tUGFja2V0cywgbXNnKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBrV2hhdEZldGNoVGltZWRUZXh0RGF0YToKKyAgICAgIHsKKyAgICAgICAgICBmZXRjaFRleHREYXRhKGtXaGF0U2VuZFRpbWVkVGV4dERhdGEsIE1FRElBX1RSQUNLX1RZUEVfVElNRURURVhULAorICAgICAgICAgICAgICAgICAgbUZldGNoVGltZWRUZXh0RGF0YUdlbmVyYXRpb24sIG1UaW1lZFRleHRUcmFjay5tUGFja2V0cywgbXNnKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBrV2hhdFNlbmRTdWJ0aXRsZURhdGE6CisgICAgICB7CisgICAgICAgICAgc2VuZFRleHREYXRhKGtXaGF0U3VidGl0bGVEYXRhLCBNRURJQV9UUkFDS19UWVBFX1NVQlRJVExFLAorICAgICAgICAgICAgICAgICAgbUZldGNoU3VidGl0bGVEYXRhR2VuZXJhdGlvbiwgbVN1YnRpdGxlVHJhY2subVBhY2tldHMsIG1zZyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2Uga1doYXRTZW5kR2xvYmFsVGltZWRUZXh0RGF0YToKKyAgICAgIHsKKyAgICAgICAgICBzZW5kR2xvYmFsVGV4dERhdGEoa1doYXRUaW1lZFRleHREYXRhLCBtRmV0Y2hUaW1lZFRleHREYXRhR2VuZXJhdGlvbiwgbXNnKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2Uga1doYXRTZW5kVGltZWRUZXh0RGF0YToKKyAgICAgIHsKKyAgICAgICAgICBzZW5kVGV4dERhdGEoa1doYXRUaW1lZFRleHREYXRhLCBNRURJQV9UUkFDS19UWVBFX1RJTUVEVEVYVCwKKyAgICAgICAgICAgICAgICAgIG1GZXRjaFRpbWVkVGV4dERhdGFHZW5lcmF0aW9uLCBtVGltZWRUZXh0VHJhY2subVBhY2tldHMsIG1zZyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2Uga1doYXRDaGFuZ2VBVlNvdXJjZToKKyAgICAgIHsKKyAgICAgICAgICBpbnQzMl90IHRyYWNrSW5kZXg7CisgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInRyYWNrSW5kZXgiLCAmdHJhY2tJbmRleCkpOworICAgICAgICAgIGNvbnN0IHNwPElNZWRpYVNvdXJjZT4gc291cmNlID0gbVNvdXJjZXMuaXRlbUF0KHRyYWNrSW5kZXgpOworCisgICAgICAgICAgVHJhY2sqIHRyYWNrOworICAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgICAgICAgbWVkaWFfdHJhY2tfdHlwZSB0cmFja1R5cGUsIGNvdW50ZXJwYXJ0VHlwZTsKKyAgICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IHNvdXJjZS0+Z2V0Rm9ybWF0KCk7CisgICAgICAgICAgbWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSk7CisgICAgICAgICAgaWYgKCFzdHJuY2FzZWNtcChtaW1lLCAiYXVkaW8vIiwgNikpIHsKKyAgICAgICAgICAgICAgdHJhY2sgPSAmbUF1ZGlvVHJhY2s7CisgICAgICAgICAgICAgIHRyYWNrVHlwZSA9IE1FRElBX1RSQUNLX1RZUEVfQVVESU87CisgICAgICAgICAgICAgIGNvdW50ZXJwYXJ0VHlwZSA9IE1FRElBX1RSQUNLX1RZUEVfVklERU87OworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIENIRUNLKCFzdHJuY2FzZWNtcChtaW1lLCAidmlkZW8vIiwgNikpOworICAgICAgICAgICAgICB0cmFjayA9ICZtVmlkZW9UcmFjazsKKyAgICAgICAgICAgICAgdHJhY2tUeXBlID0gTUVESUFfVFJBQ0tfVFlQRV9WSURFTzsKKyAgICAgICAgICAgICAgY291bnRlcnBhcnRUeXBlID0gTUVESUFfVFJBQ0tfVFlQRV9BVURJTzs7CisgICAgICAgICAgfQorCisKKyAgICAgICAgICBpZiAodHJhY2stPm1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgICB0cmFjay0+bVNvdXJjZS0+c3RvcCgpOworICAgICAgICAgIH0KKyAgICAgICAgICB0cmFjay0+bVNvdXJjZSA9IHNvdXJjZTsKKyAgICAgICAgICB0cmFjay0+bVNvdXJjZS0+c3RhcnQoKTsKKyAgICAgICAgICB0cmFjay0+bUluZGV4ID0gdHJhY2tJbmRleDsKKyAgICAgICAgICArK21BdWRpb0RhdGFHZW5lcmF0aW9uOworICAgICAgICAgICsrbVZpZGVvRGF0YUdlbmVyYXRpb247CisKKyAgICAgICAgICBpbnQ2NF90IHRpbWVVcywgYWN0dWFsVGltZVVzOworICAgICAgICAgIGNvbnN0IGJvb2wgZm9ybWF0Q2hhbmdlID0gdHJ1ZTsKKyAgICAgICAgICBpZiAodHJhY2tUeXBlID09IE1FRElBX1RSQUNLX1RZUEVfQVVESU8pIHsKKyAgICAgICAgICAgICAgdGltZVVzID0gbUF1ZGlvTGFzdERlcXVldWVUaW1lVXM7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgdGltZVVzID0gbVZpZGVvTGFzdERlcXVldWVUaW1lVXM7CisgICAgICAgICAgfQorICAgICAgICAgIHJlYWRCdWZmZXIodHJhY2tUeXBlLCB0aW1lVXMsIE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkMgLyogbW9kZSAqLywKKyAgICAgICAgICAgICAgICAgICZhY3R1YWxUaW1lVXMsIGZvcm1hdENoYW5nZSk7CisgICAgICAgICAgcmVhZEJ1ZmZlcihjb3VudGVycGFydFR5cGUsIC0xLCBNZWRpYVBsYXllcjJTZWVrTW9kZTo6U0VFS19QUkVWSU9VU19TWU5DIC8qIG1vZGUgKi8sCisgICAgICAgICAgICAgICAgICBOVUxMLCAhZm9ybWF0Q2hhbmdlKTsKKyAgICAgICAgICBBTE9HVigidGltZVVzICVsbGQgYWN0dWFsVGltZVVzICVsbGQiLCAobG9uZyBsb25nKXRpbWVVcywgKGxvbmcgbG9uZylhY3R1YWxUaW1lVXMpOworCisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2Uga1doYXRTZWVrOgorICAgICAgeworICAgICAgICAgIG9uU2Vlayhtc2cpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIGtXaGF0UmVhZEJ1ZmZlcjoKKyAgICAgIHsKKyAgICAgICAgICBvblJlYWRCdWZmZXIobXNnKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBrV2hhdFBvbGxCdWZmZXJpbmc6CisgICAgICB7CisgICAgICAgICAgaW50MzJfdCBnZW5lcmF0aW9uOworICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJmdlbmVyYXRpb24pKTsKKyAgICAgICAgICBpZiAoZ2VuZXJhdGlvbiA9PSBtUG9sbEJ1ZmZlcmluZ0dlbmVyYXRpb24pIHsKKyAgICAgICAgICAgICAgb25Qb2xsQnVmZmVyaW5nKCk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBkZWZhdWx0OgorICAgICAgICAgIFNvdXJjZTo6b25NZXNzYWdlUmVjZWl2ZWQobXNnKTsKKyAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlOjpmZXRjaFRleHREYXRhKAorICAgICAgICB1aW50MzJfdCBzZW5kV2hhdCwKKyAgICAgICAgbWVkaWFfdHJhY2tfdHlwZSB0eXBlLAorICAgICAgICBpbnQzMl90IGN1ckdlbiwKKyAgICAgICAgY29uc3Qgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4mIHBhY2tldHMsCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiYgbXNnKSB7CisgICAgaW50MzJfdCBtc2dHZW5lcmF0aW9uOworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJm1zZ0dlbmVyYXRpb24pKTsKKyAgICBpZiAobXNnR2VuZXJhdGlvbiAhPSBjdXJHZW4pIHsKKyAgICAgICAgLy8gc3RhbGUKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludDMyX3QgYXZhaWw7CisgICAgaWYgKHBhY2tldHMtPmhhc0J1ZmZlckF2YWlsYWJsZSgmYXZhaWwpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQ2NF90IHRpbWVVczsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOworCisgICAgaW50NjRfdCBzdWJUaW1lVXMgPSAwOworICAgIHJlYWRCdWZmZXIodHlwZSwgdGltZVVzLCBNZWRpYVBsYXllcjJTZWVrTW9kZTo6U0VFS19QUkVWSU9VU19TWU5DIC8qIG1vZGUgKi8sICZzdWJUaW1lVXMpOworCisgICAgc3RhdHVzX3QgZW9zUmVzdWx0OworICAgIGlmICghcGFja2V0cy0+aGFzQnVmZmVyQXZhaWxhYmxlKCZlb3NSZXN1bHQpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobXNnLT53aGF0KCkgPT0ga1doYXRGZXRjaFN1YnRpdGxlRGF0YSkgeworICAgICAgICBzdWJUaW1lVXMgLT0gMTAwMDAwMGxsOyAgLy8gc2VuZCBzdWJ0aWxlIGRhdGEgb25lIHNlY29uZCBlYXJsaWVyCisgICAgfQorICAgIHNwPEFNZXNzYWdlPiBtc2cyID0gbmV3IEFNZXNzYWdlKHNlbmRXaGF0LCB0aGlzKTsKKyAgICBtc2cyLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1zZ0dlbmVyYXRpb24pOworICAgIG1NZWRpYUNsb2NrLT5hZGRUaW1lcihtc2cyLCBzdWJUaW1lVXMpOworfQorCit2b2lkIE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTo6c2VuZFRleHREYXRhKAorICAgICAgICB1aW50MzJfdCB3aGF0LAorICAgICAgICBtZWRpYV90cmFja190eXBlIHR5cGUsCisgICAgICAgIGludDMyX3QgY3VyR2VuLAorICAgICAgICBjb25zdCBzcDxBbm90aGVyUGFja2V0U291cmNlPiYgcGFja2V0cywKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+JiBtc2cpIHsKKyAgICBpbnQzMl90IG1zZ0dlbmVyYXRpb247CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmbXNnR2VuZXJhdGlvbikpOworICAgIGlmIChtc2dHZW5lcmF0aW9uICE9IGN1ckdlbikgeworICAgICAgICAvLyBzdGFsZQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50NjRfdCBzdWJUaW1lVXM7CisgICAgaWYgKHBhY2tldHMtPm5leHRCdWZmZXJUaW1lKCZzdWJUaW1lVXMpICE9IE9LKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQ2NF90IG5leHRTdWJUaW1lVXM7CisgICAgcmVhZEJ1ZmZlcih0eXBlLCAtMSwgTWVkaWFQbGF5ZXIyU2Vla01vZGU6OlNFRUtfUFJFVklPVVNfU1lOQyAvKiBtb2RlICovLCAmbmV4dFN1YlRpbWVVcyk7CisKKyAgICBzcDxBQnVmZmVyPiBidWZmZXI7CisgICAgc3RhdHVzX3QgZGVxdWV1ZVN0YXR1cyA9IHBhY2tldHMtPmRlcXVldWVBY2Nlc3NVbml0KCZidWZmZXIpOworICAgIGlmIChkZXF1ZXVlU3RhdHVzID09IE9LKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBkdXBOb3RpZnkoKTsKKyAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIHdoYXQpOworICAgICAgICBub3RpZnktPnNldEJ1ZmZlcigiYnVmZmVyIiwgYnVmZmVyKTsKKyAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisKKyAgICAgICAgaWYgKG1zZy0+d2hhdCgpID09IGtXaGF0U2VuZFN1YnRpdGxlRGF0YSkgeworICAgICAgICAgICAgbmV4dFN1YlRpbWVVcyAtPSAxMDAwMDAwbGw7ICAvLyBzZW5kIHN1YnRpbGUgZGF0YSBvbmUgc2Vjb25kIGVhcmxpZXIKKyAgICAgICAgfQorICAgICAgICBtTWVkaWFDbG9jay0+YWRkVGltZXIobXNnLCBuZXh0U3ViVGltZVVzKTsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlOjpzZW5kR2xvYmFsVGV4dERhdGEoCisgICAgICAgIHVpbnQzMl90IHdoYXQsCisgICAgICAgIGludDMyX3QgY3VyR2VuLAorICAgICAgICBzcDxBTWVzc2FnZT4gbXNnKSB7CisgICAgaW50MzJfdCBtc2dHZW5lcmF0aW9uOworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJm1zZ0dlbmVyYXRpb24pKTsKKyAgICBpZiAobXNnR2VuZXJhdGlvbiAhPSBjdXJHZW4pIHsKKyAgICAgICAgLy8gc3RhbGUKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHVpbnQzMl90IHRleHRUeXBlOworICAgIGNvbnN0IHZvaWQgKmRhdGE7CisgICAgc2l6ZV90IHNpemUgPSAwOworICAgIGlmIChtVGltZWRUZXh0VHJhY2subVNvdXJjZS0+Z2V0Rm9ybWF0KCktPmZpbmREYXRhKAorICAgICAgICAgICAgICAgICAgICBrS2V5VGV4dEZvcm1hdERhdGEsICZ0ZXh0VHlwZSwgJmRhdGEsICZzaXplKSkgeworICAgICAgICBtR2xvYmFsVGltZWRUZXh0ID0gbmV3IEFCdWZmZXIoc2l6ZSk7CisgICAgICAgIGlmIChtR2xvYmFsVGltZWRUZXh0LT5kYXRhKCkpIHsKKyAgICAgICAgICAgIG1lbWNweShtR2xvYmFsVGltZWRUZXh0LT5kYXRhKCksIGRhdGEsIHNpemUpOworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGdsb2JhbE1ldGEgPSBtR2xvYmFsVGltZWRUZXh0LT5tZXRhKCk7CisgICAgICAgICAgICBnbG9iYWxNZXRhLT5zZXRJbnQ2NCgidGltZVVzIiwgMCk7CisgICAgICAgICAgICBnbG9iYWxNZXRhLT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9URVhUXzNHUFApOworICAgICAgICAgICAgZ2xvYmFsTWV0YS0+c2V0SW50MzIoImdsb2JhbCIsIDEpOworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IGR1cE5vdGlmeSgpOworICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIHdoYXQpOworICAgICAgICAgICAgbm90aWZ5LT5zZXRCdWZmZXIoImJ1ZmZlciIsIG1HbG9iYWxUaW1lZFRleHQpOworICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3NwPE1ldGFEYXRhPiBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2U6OmdldEZvcm1hdE1ldGEoYm9vbCBhdWRpbykgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIGdldEZvcm1hdE1ldGFfbChhdWRpbyk7Cit9CisKK3NwPE1ldGFEYXRhPiBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2U6OmdldEZvcm1hdE1ldGFfbChib29sIGF1ZGlvKSB7CisgICAgc3A8SU1lZGlhU291cmNlPiBzb3VyY2UgPSBhdWRpbyA/IG1BdWRpb1RyYWNrLm1Tb3VyY2UgOiBtVmlkZW9UcmFjay5tU291cmNlOworCisgICAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBzb3VyY2UtPmdldEZvcm1hdCgpOworfQorCitzdGF0dXNfdCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2U6OmRlcXVldWVBY2Nlc3NVbml0KAorICAgICAgICBib29sIGF1ZGlvLCBzcDxBQnVmZmVyPiAqYWNjZXNzVW5pdCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgLy8gSWYgaGFzIGdvbmUgdGhyb3VnaCBzdG9wL3JlbGVhc2VEcm0gc2VxdWVuY2UsIHdlIG5vIGxvbmdlciBzZW5kIGRvd24gYW55IGJ1ZmZlciBiL2MKKyAgICAvLyB0aGUgY29kZWMncyBjcnlwdG8gb2JqZWN0IGhhcyBnb25lIGF3YXkgKGIvMzc5NjAwOTYpLgorICAgIC8vIE5vdGU6IFRoaXMgd2lsbCBiZSB1bm5lY2Vzc2FyeSB3aGVuIHN0b3AoKSBjaGFuZ2VzIGJlaGF2aW9yIGFuZCByZWxlYXNlcyBjb2RlYyAoYi8zNTI0ODI4MykuCisgICAgaWYgKCFtU3RhcnRlZCAmJiBtSXNEcm1SZWxlYXNlZCkgeworICAgICAgICByZXR1cm4gLUVXT1VMREJMT0NLOworICAgIH0KKworICAgIFRyYWNrICp0cmFjayA9IGF1ZGlvID8gJm1BdWRpb1RyYWNrIDogJm1WaWRlb1RyYWNrOworCisgICAgaWYgKHRyYWNrLT5tU291cmNlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FV09VTERCTE9DSzsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBmaW5hbFJlc3VsdDsKKyAgICBpZiAoIXRyYWNrLT5tUGFja2V0cy0+aGFzQnVmZmVyQXZhaWxhYmxlKCZmaW5hbFJlc3VsdCkpIHsKKyAgICAgICAgaWYgKGZpbmFsUmVzdWx0ID09IE9LKSB7CisgICAgICAgICAgICBwb3N0UmVhZEJ1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgYXVkaW8gPyBNRURJQV9UUkFDS19UWVBFX0FVRElPIDogTUVESUFfVFJBQ0tfVFlQRV9WSURFTyk7CisgICAgICAgICAgICByZXR1cm4gLUVXT1VMREJMT0NLOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmaW5hbFJlc3VsdDsKKyAgICB9CisKKyAgICBzdGF0dXNfdCByZXN1bHQgPSB0cmFjay0+bVBhY2tldHMtPmRlcXVldWVBY2Nlc3NVbml0KGFjY2Vzc1VuaXQpOworCisgICAgLy8gc3RhcnQgcHVsbGluZyBpbiBtb3JlIGJ1ZmZlcnMgaWYgY2FjaGUgaXMgcnVubmluZyBsb3cKKyAgICAvLyBzbyB0aGF0IGRlY29kZXIgaGFzIGxlc3MgY2hhbmNlIG9mIGJlaW5nIHN0YXJ2ZWQKKyAgICBpZiAoIW1Jc1N0cmVhbWluZykgeworICAgICAgICBpZiAodHJhY2stPm1QYWNrZXRzLT5nZXRBdmFpbGFibGVCdWZmZXJDb3VudCgmZmluYWxSZXN1bHQpIDwgMikgeworICAgICAgICAgICAgcG9zdFJlYWRCdWZmZXIoYXVkaW8/IE1FRElBX1RSQUNLX1RZUEVfQVVESU8gOiBNRURJQV9UUkFDS19UWVBFX1ZJREVPKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGludDY0X3QgZHVyYXRpb25VcyA9IHRyYWNrLT5tUGFja2V0cy0+Z2V0QnVmZmVyZWREdXJhdGlvblVzKCZmaW5hbFJlc3VsdCk7CisgICAgICAgIC8vIFRPRE86IG1heFJlYnVmZmVyaW5nTWFya01zIGNvdWxkIGJlIGxhcmdlciB0aGFuCisgICAgICAgIC8vIG1CdWZmZXJpbmdTZXR0aW5ncy5tUmVzdW1lUGxheWJhY2tNYXJrTXMKKyAgICAgICAgaW50NjRfdCByZXN0YXJ0QnVmZmVyaW5nTWFya1VzID0KKyAgICAgICAgICAgICBtQnVmZmVyaW5nU2V0dGluZ3MubVJlc3VtZVBsYXliYWNrTWFya01zICogMTAwMGxsIC8gMjsKKyAgICAgICAgaWYgKGZpbmFsUmVzdWx0ID09IE9LKSB7CisgICAgICAgICAgICBpZiAoZHVyYXRpb25VcyA8IHJlc3RhcnRCdWZmZXJpbmdNYXJrVXMpIHsKKyAgICAgICAgICAgICAgICBwb3N0UmVhZEJ1ZmZlcihhdWRpbz8gTUVESUFfVFJBQ0tfVFlQRV9BVURJTyA6IE1FRElBX1RSQUNLX1RZUEVfVklERU8pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRyYWNrLT5tUGFja2V0cy0+Z2V0QXZhaWxhYmxlQnVmZmVyQ291bnQoJmZpbmFsUmVzdWx0KSA8IDIKKyAgICAgICAgICAgICAgICAmJiAhbVNlbnRQYXVzZU9uQnVmZmVyaW5nICYmICFtUHJlcGFyaW5nKSB7CisgICAgICAgICAgICAgICAgbUNhY2hlZFNvdXJjZS0+cmVzdW1lRmV0Y2hpbmdJZk5lY2Vzc2FyeSgpOworICAgICAgICAgICAgICAgIHNlbmRDYWNoZVN0YXRzKCk7CisgICAgICAgICAgICAgICAgbVNlbnRQYXVzZU9uQnVmZmVyaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gZHVwTm90aWZ5KCk7CisgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0UGF1c2VPbkJ1ZmZlcmluZ1N0YXJ0KTsKKyAgICAgICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChyZXN1bHQgIT0gT0spIHsKKyAgICAgICAgaWYgKG1TdWJ0aXRsZVRyYWNrLm1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgbVN1YnRpdGxlVHJhY2subVBhY2tldHMtPmNsZWFyKCk7CisgICAgICAgICAgICBtRmV0Y2hTdWJ0aXRsZURhdGFHZW5lcmF0aW9uKys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1UaW1lZFRleHRUcmFjay5tU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1UaW1lZFRleHRUcmFjay5tUGFja2V0cy0+Y2xlYXIoKTsKKyAgICAgICAgICAgIG1GZXRjaFRpbWVkVGV4dERhdGFHZW5lcmF0aW9uKys7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBpbnQ2NF90IHRpbWVVczsKKyAgICBzdGF0dXNfdCBlb3NSZXN1bHQ7IC8vIGlnbm9yZWQKKyAgICBDSEVDSygoKmFjY2Vzc1VuaXQpLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOworICAgIGlmIChhdWRpbykgeworICAgICAgICBtQXVkaW9MYXN0RGVxdWV1ZVRpbWVVcyA9IHRpbWVVczsKKyAgICB9IGVsc2UgeworICAgICAgICBtVmlkZW9MYXN0RGVxdWV1ZVRpbWVVcyA9IHRpbWVVczsKKyAgICB9CisKKyAgICBpZiAobVN1YnRpdGxlVHJhY2subVNvdXJjZSAhPSBOVUxMCisgICAgICAgICAgICAmJiAhbVN1YnRpdGxlVHJhY2subVBhY2tldHMtPmhhc0J1ZmZlckF2YWlsYWJsZSgmZW9zUmVzdWx0KSkgeworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0RmV0Y2hTdWJ0aXRsZURhdGEsIHRoaXMpOworICAgICAgICBtc2ctPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOworICAgICAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUZldGNoU3VidGl0bGVEYXRhR2VuZXJhdGlvbik7CisgICAgICAgIG1zZy0+cG9zdCgpOworICAgIH0KKworICAgIGlmIChtVGltZWRUZXh0VHJhY2subVNvdXJjZSAhPSBOVUxMCisgICAgICAgICAgICAmJiAhbVRpbWVkVGV4dFRyYWNrLm1QYWNrZXRzLT5oYXNCdWZmZXJBdmFpbGFibGUoJmVvc1Jlc3VsdCkpIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEZldGNoVGltZWRUZXh0RGF0YSwgdGhpcyk7CisgICAgICAgIG1zZy0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CisgICAgICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtRmV0Y2hUaW1lZFRleHREYXRhR2VuZXJhdGlvbik7CisgICAgICAgIG1zZy0+cG9zdCgpOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXR1c190IE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTo6Z2V0RHVyYXRpb24oaW50NjRfdCAqZHVyYXRpb25VcykgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgKmR1cmF0aW9uVXMgPSBtRHVyYXRpb25VczsKKyAgICByZXR1cm4gT0s7Cit9CisKK3NpemVfdCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2U6OmdldFRyYWNrQ291bnQoKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbVNvdXJjZXMuc2l6ZSgpOworfQorCitzcDxBTWVzc2FnZT4gTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlOjpnZXRUcmFja0luZm8oc2l6ZV90IHRyYWNrSW5kZXgpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHNpemVfdCB0cmFja0NvdW50ID0gbVNvdXJjZXMuc2l6ZSgpOworICAgIGlmICh0cmFja0luZGV4ID49IHRyYWNrQ291bnQpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdCA9IG5ldyBBTWVzc2FnZSgpOworICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbVNvdXJjZXMuaXRlbUF0KHRyYWNrSW5kZXgpLT5nZXRGb3JtYXQoKTsKKyAgICBpZiAobWV0YSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJubyBtZXRhZGF0YSBmb3IgdHJhY2sgJXp1IiwgdHJhY2tJbmRleCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgQ0hFQ0sobWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgbWltZSk7CisKKyAgICBpbnQzMl90IHRyYWNrVHlwZTsKKyAgICBpZiAoIXN0cm5jYXNlY21wKG1pbWUsICJ2aWRlby8iLCA2KSkgeworICAgICAgICB0cmFja1R5cGUgPSBNRURJQV9UUkFDS19UWVBFX1ZJREVPOworICAgIH0gZWxzZSBpZiAoIXN0cm5jYXNlY21wKG1pbWUsICJhdWRpby8iLCA2KSkgeworICAgICAgICB0cmFja1R5cGUgPSBNRURJQV9UUkFDS19UWVBFX0FVRElPOworICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVEVYVF8zR1BQKSkgeworICAgICAgICB0cmFja1R5cGUgPSBNRURJQV9UUkFDS19UWVBFX1RJTUVEVEVYVDsKKyAgICB9IGVsc2UgeworICAgICAgICB0cmFja1R5cGUgPSBNRURJQV9UUkFDS19UWVBFX1VOS05PV047CisgICAgfQorICAgIGZvcm1hdC0+c2V0SW50MzIoInR5cGUiLCB0cmFja1R5cGUpOworCisgICAgY29uc3QgY2hhciAqbGFuZzsKKyAgICBpZiAoIW1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNZWRpYUxhbmd1YWdlLCAmbGFuZykpIHsKKyAgICAgICAgbGFuZyA9ICJ1bmQiOworICAgIH0KKyAgICBmb3JtYXQtPnNldFN0cmluZygibGFuZ3VhZ2UiLCBsYW5nKTsKKworICAgIGlmICh0cmFja1R5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9TVUJUSVRMRSkgeworICAgICAgICBpbnQzMl90IGlzQXV0b3NlbGVjdCA9IDEsIGlzRGVmYXVsdCA9IDAsIGlzRm9yY2VkID0gMDsKKyAgICAgICAgbWV0YS0+ZmluZEludDMyKGtLZXlUcmFja0lzQXV0b3NlbGVjdCwgJmlzQXV0b3NlbGVjdCk7CisgICAgICAgIG1ldGEtPmZpbmRJbnQzMihrS2V5VHJhY2tJc0RlZmF1bHQsICZpc0RlZmF1bHQpOworICAgICAgICBtZXRhLT5maW5kSW50MzIoa0tleVRyYWNrSXNGb3JjZWQsICZpc0ZvcmNlZCk7CisKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiYXV0byIsICEhaXNBdXRvc2VsZWN0KTsKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiZGVmYXVsdCIsICEhaXNEZWZhdWx0KTsKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiZm9yY2VkIiwgISFpc0ZvcmNlZCk7CisgICAgfQorCisgICAgcmV0dXJuIGZvcm1hdDsKK30KKworc3NpemVfdCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2U6OmdldFNlbGVjdGVkVHJhY2sobWVkaWFfdHJhY2tfdHlwZSB0eXBlKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBjb25zdCBUcmFjayAqdHJhY2sgPSBOVUxMOworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgTUVESUFfVFJBQ0tfVFlQRV9WSURFTzoKKyAgICAgICAgdHJhY2sgPSAmbVZpZGVvVHJhY2s7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUVESUFfVFJBQ0tfVFlQRV9BVURJTzoKKyAgICAgICAgdHJhY2sgPSAmbUF1ZGlvVHJhY2s7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUVESUFfVFJBQ0tfVFlQRV9USU1FRFRFWFQ6CisgICAgICAgIHRyYWNrID0gJm1UaW1lZFRleHRUcmFjazsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNRURJQV9UUkFDS19UWVBFX1NVQlRJVExFOgorICAgICAgICB0cmFjayA9ICZtU3VidGl0bGVUcmFjazsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKHRyYWNrICE9IE5VTEwgJiYgdHJhY2stPm1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICByZXR1cm4gdHJhY2stPm1JbmRleDsKKyAgICB9CisKKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXR1c190IE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTo6c2VsZWN0VHJhY2soc2l6ZV90IHRyYWNrSW5kZXgsIGJvb2wgc2VsZWN0LCBpbnQ2NF90IHRpbWVVcykgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgQUxPR1YoIiVzIHRyYWNrOiAlenUiLCBzZWxlY3QgPyAic2VsZWN0IiA6ICJkZXNlbGVjdCIsIHRyYWNrSW5kZXgpOworCisgICAgaWYgKHRyYWNrSW5kZXggPj0gbVNvdXJjZXMuc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBCQURfSU5ERVg7CisgICAgfQorCisgICAgaWYgKCFzZWxlY3QpIHsKKyAgICAgICAgVHJhY2sqIHRyYWNrID0gTlVMTDsKKyAgICAgICAgaWYgKG1TdWJ0aXRsZVRyYWNrLm1Tb3VyY2UgIT0gTlVMTCAmJiB0cmFja0luZGV4ID09IG1TdWJ0aXRsZVRyYWNrLm1JbmRleCkgeworICAgICAgICAgICAgdHJhY2sgPSAmbVN1YnRpdGxlVHJhY2s7CisgICAgICAgICAgICBtRmV0Y2hTdWJ0aXRsZURhdGFHZW5lcmF0aW9uKys7CisgICAgICAgIH0gZWxzZSBpZiAobVRpbWVkVGV4dFRyYWNrLm1Tb3VyY2UgIT0gTlVMTCAmJiB0cmFja0luZGV4ID09IG1UaW1lZFRleHRUcmFjay5tSW5kZXgpIHsKKyAgICAgICAgICAgIHRyYWNrID0gJm1UaW1lZFRleHRUcmFjazsKKyAgICAgICAgICAgIG1GZXRjaFRpbWVkVGV4dERhdGFHZW5lcmF0aW9uKys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRyYWNrID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgICAgICB0cmFjay0+bVNvdXJjZS0+c3RvcCgpOworICAgICAgICB0cmFjay0+bVNvdXJjZSA9IE5VTEw7CisgICAgICAgIHRyYWNrLT5tUGFja2V0cy0+Y2xlYXIoKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGNvbnN0IHNwPElNZWRpYVNvdXJjZT4gc291cmNlID0gbVNvdXJjZXMuaXRlbUF0KHRyYWNrSW5kZXgpOworICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gc291cmNlLT5nZXRGb3JtYXQoKTsKKyAgICBjb25zdCBjaGFyICptaW1lOworICAgIENIRUNLKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKKyAgICBpZiAoIXN0cm5jYXNlY21wKG1pbWUsICJ0ZXh0LyIsIDUpKSB7CisgICAgICAgIGJvb2wgaXNTdWJ0aXRsZSA9IHN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVEVYVF8zR1BQKTsKKyAgICAgICAgVHJhY2sgKnRyYWNrID0gaXNTdWJ0aXRsZSA/ICZtU3VidGl0bGVUcmFjayA6ICZtVGltZWRUZXh0VHJhY2s7CisgICAgICAgIGlmICh0cmFjay0+bVNvdXJjZSAhPSBOVUxMICYmIHRyYWNrLT5tSW5kZXggPT0gdHJhY2tJbmRleCkgeworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisgICAgICAgIHRyYWNrLT5tSW5kZXggPSB0cmFja0luZGV4OworICAgICAgICBpZiAodHJhY2stPm1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgdHJhY2stPm1Tb3VyY2UtPnN0b3AoKTsKKyAgICAgICAgfQorICAgICAgICB0cmFjay0+bVNvdXJjZSA9IG1Tb3VyY2VzLml0ZW1BdCh0cmFja0luZGV4KTsKKyAgICAgICAgdHJhY2stPm1Tb3VyY2UtPnN0YXJ0KCk7CisgICAgICAgIGlmICh0cmFjay0+bVBhY2tldHMgPT0gTlVMTCkgeworICAgICAgICAgICAgdHJhY2stPm1QYWNrZXRzID0gbmV3IEFub3RoZXJQYWNrZXRTb3VyY2UodHJhY2stPm1Tb3VyY2UtPmdldEZvcm1hdCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRyYWNrLT5tUGFja2V0cy0+Y2xlYXIoKTsKKyAgICAgICAgICAgIHRyYWNrLT5tUGFja2V0cy0+c2V0Rm9ybWF0KHRyYWNrLT5tU291cmNlLT5nZXRGb3JtYXQoKSk7CisKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpc1N1YnRpdGxlKSB7CisgICAgICAgICAgICBtRmV0Y2hTdWJ0aXRsZURhdGFHZW5lcmF0aW9uKys7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtRmV0Y2hUaW1lZFRleHREYXRhR2VuZXJhdGlvbisrOworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzX3QgZW9zUmVzdWx0OyAvLyBpZ25vcmVkCisgICAgICAgIGlmIChtU3VidGl0bGVUcmFjay5tU291cmNlICE9IE5VTEwKKyAgICAgICAgICAgICAgICAmJiAhbVN1YnRpdGxlVHJhY2subVBhY2tldHMtPmhhc0J1ZmZlckF2YWlsYWJsZSgmZW9zUmVzdWx0KSkgeworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEZldGNoU3VidGl0bGVEYXRhLCB0aGlzKTsKKyAgICAgICAgICAgIG1zZy0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CisgICAgICAgICAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUZldGNoU3VidGl0bGVEYXRhR2VuZXJhdGlvbik7CisgICAgICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICAgICAgfQorCisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cyID0gbmV3IEFNZXNzYWdlKGtXaGF0U2VuZEdsb2JhbFRpbWVkVGV4dERhdGEsIHRoaXMpOworICAgICAgICBtc2cyLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1GZXRjaFRpbWVkVGV4dERhdGFHZW5lcmF0aW9uKTsKKyAgICAgICAgbXNnMi0+cG9zdCgpOworCisgICAgICAgIGlmIChtVGltZWRUZXh0VHJhY2subVNvdXJjZSAhPSBOVUxMCisgICAgICAgICAgICAgICAgJiYgIW1UaW1lZFRleHRUcmFjay5tUGFja2V0cy0+aGFzQnVmZmVyQXZhaWxhYmxlKCZlb3NSZXN1bHQpKSB7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0RmV0Y2hUaW1lZFRleHREYXRhLCB0aGlzKTsKKyAgICAgICAgICAgIG1zZy0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CisgICAgICAgICAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUZldGNoVGltZWRUZXh0RGF0YUdlbmVyYXRpb24pOworICAgICAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gT0s7CisgICAgfSBlbHNlIGlmICghc3RybmNhc2VjbXAobWltZSwgImF1ZGlvLyIsIDYpIHx8ICFzdHJuY2FzZWNtcChtaW1lLCAidmlkZW8vIiwgNikpIHsKKyAgICAgICAgYm9vbCBhdWRpbyA9ICFzdHJuY2FzZWNtcChtaW1lLCAiYXVkaW8vIiwgNik7CisgICAgICAgIFRyYWNrICp0cmFjayA9IGF1ZGlvID8gJm1BdWRpb1RyYWNrIDogJm1WaWRlb1RyYWNrOworICAgICAgICBpZiAodHJhY2stPm1Tb3VyY2UgIT0gTlVMTCAmJiB0cmFjay0+bUluZGV4ID09IHRyYWNrSW5kZXgpIHsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorCisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDaGFuZ2VBVlNvdXJjZSwgdGhpcyk7CisgICAgICAgIG1zZy0+c2V0SW50MzIoInRyYWNrSW5kZXgiLCB0cmFja0luZGV4KTsKKyAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTo6c2Vla1RvKGludDY0X3Qgc2Vla1RpbWVVcywgTWVkaWFQbGF5ZXIyU2Vla01vZGUgbW9kZSkgeworICAgIEFMT0dWKCJzZWVrVG86ICVsbGQsICVkIiwgKGxvbmcgbG9uZylzZWVrVGltZVVzLCBtb2RlKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2VlaywgdGhpcyk7CisgICAgbXNnLT5zZXRJbnQ2NCgic2Vla1RpbWVVcyIsIHNlZWtUaW1lVXMpOworICAgIG1zZy0+c2V0SW50MzIoIm1vZGUiLCBtb2RlKTsKKworICAgIC8vIE5lZWQgdG8gY2FsbCByZWFkQnVmZmVyIG9uIHxtTG9vcGVyfCB0byBlbnN1cmUgdGhlIGNhbGxzIHRvCisgICAgLy8gSU1lZGlhU291cmNlOjpyZWFkKiBhcmUgc2VyaWFsaXplZC4gTm90ZSB0aGF0IElNZWRpYVNvdXJjZTo6cmVhZCoKKyAgICAvLyBpcyBjYWxsZWQgd2l0aG91dCB8bUxvY2t8IGFjcXVpcmVkIGFuZCBNZWRpYVNvdXJjZSBpcyBub3QgdGhyZWFkIHNhZmUuCisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOworICAgIHN0YXR1c190IGVyciA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKKyAgICBpZiAoZXJyID09IE9LICYmIHJlc3BvbnNlICE9IE5VTEwpIHsKKyAgICAgICAgQ0hFQ0socmVzcG9uc2UtPmZpbmRJbnQzMigiZXJyIiwgJmVycikpOworICAgIH0KKworICAgIHJldHVybiBlcnI7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlOjpvblNlZWsoY29uc3Qgc3A8QU1lc3NhZ2U+JiBtc2cpIHsKKyAgICBpbnQ2NF90IHNlZWtUaW1lVXM7CisgICAgaW50MzJfdCBtb2RlOworICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJzZWVrVGltZVVzIiwgJnNlZWtUaW1lVXMpKTsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigibW9kZSIsICZtb2RlKSk7CisKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CisgICAgc3RhdHVzX3QgZXJyID0gZG9TZWVrKHNlZWtUaW1lVXMsIChNZWRpYVBsYXllcjJTZWVrTW9kZSltb2RlKTsKKyAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7CisKKyAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKKyAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CisgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlOjpkb1NlZWsoaW50NjRfdCBzZWVrVGltZVVzLCBNZWRpYVBsYXllcjJTZWVrTW9kZSBtb2RlKSB7CisgICAgaWYgKG1WaWRlb1RyYWNrLm1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICArK21WaWRlb0RhdGFHZW5lcmF0aW9uOworCisgICAgICAgIGludDY0X3QgYWN0dWFsVGltZVVzOworICAgICAgICByZWFkQnVmZmVyKE1FRElBX1RSQUNLX1RZUEVfVklERU8sIHNlZWtUaW1lVXMsIG1vZGUsICZhY3R1YWxUaW1lVXMpOworCisgICAgICAgIGlmIChtb2RlICE9IE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX0NMT1NFU1QpIHsKKyAgICAgICAgICAgIHNlZWtUaW1lVXMgPSBhY3R1YWxUaW1lVXM7CisgICAgICAgIH0KKyAgICAgICAgbVZpZGVvTGFzdERlcXVldWVUaW1lVXMgPSBhY3R1YWxUaW1lVXM7CisgICAgfQorCisgICAgaWYgKG1BdWRpb1RyYWNrLm1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICArK21BdWRpb0RhdGFHZW5lcmF0aW9uOworICAgICAgICByZWFkQnVmZmVyKE1FRElBX1RSQUNLX1RZUEVfQVVESU8sIHNlZWtUaW1lVXMsIE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX0NMT1NFU1QpOworICAgICAgICBtQXVkaW9MYXN0RGVxdWV1ZVRpbWVVcyA9IHNlZWtUaW1lVXM7CisgICAgfQorCisgICAgaWYgKG1TdWJ0aXRsZVRyYWNrLm1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICBtU3VidGl0bGVUcmFjay5tUGFja2V0cy0+Y2xlYXIoKTsKKyAgICAgICAgbUZldGNoU3VidGl0bGVEYXRhR2VuZXJhdGlvbisrOworICAgIH0KKworICAgIGlmIChtVGltZWRUZXh0VHJhY2subVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgIG1UaW1lZFRleHRUcmFjay5tUGFja2V0cy0+Y2xlYXIoKTsKKyAgICAgICAgbUZldGNoVGltZWRUZXh0RGF0YUdlbmVyYXRpb24rKzsKKyAgICB9CisKKyAgICArK21Qb2xsQnVmZmVyaW5nR2VuZXJhdGlvbjsKKyAgICBzY2hlZHVsZVBvbGxCdWZmZXJpbmcoKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3NwPEFCdWZmZXI+IE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTo6bWVkaWFCdWZmZXJUb0FCdWZmZXIoCisgICAgICAgIE1lZGlhQnVmZmVyKiBtYiwKKyAgICAgICAgbWVkaWFfdHJhY2tfdHlwZSB0cmFja1R5cGUpIHsKKyAgICBib29sIGF1ZGlvID0gdHJhY2tUeXBlID09IE1FRElBX1RSQUNLX1RZUEVfQVVESU87CisgICAgc2l6ZV90IG91dExlbmd0aCA9IG1iLT5yYW5nZV9sZW5ndGgoKTsKKworICAgIGlmIChhdWRpbyAmJiBtQXVkaW9Jc1ZvcmJpcykgeworICAgICAgICBvdXRMZW5ndGggKz0gc2l6ZW9mKGludDMyX3QpOworICAgIH0KKworICAgIHNwPEFCdWZmZXI+IGFiOworCisgICAgaWYgKG1Jc0RybVByb3RlY3RlZCkgICB7CisgICAgICAgIC8vIE1vZHVsYXIgRFJNCisgICAgICAgIC8vIEVuYWJsZWQgZm9yIGJvdGggdmlkZW8vYXVkaW8gc28gMSkgbWVkaWEgYnVmZmVyIGlzIHJldXNlZCB3aXRob3V0IGV4dHJhIGNvcHlpbmcKKyAgICAgICAgLy8gMikgbWV0YSBkYXRhIGNhbiBiZSByZXRyaWV2ZWQgaW4gb25JbnB1dEJ1ZmZlckZldGNoZWQgZm9yIGNhbGxpbmcgcXVldWVTZWN1cmVJbnB1dEJ1ZmZlci4KKworICAgICAgICAvLyBkYXRhIGlzIGFscmVhZHkgcHJvdmlkZWQgaW4gdGhlIGJ1ZmZlcgorICAgICAgICBhYiA9IG5ldyBBQnVmZmVyKE5VTEwsIG1iLT5yYW5nZV9sZW5ndGgoKSk7CisgICAgICAgIG1iLT5hZGRfcmVmKCk7CisgICAgICAgIGFiLT5zZXRNZWRpYUJ1ZmZlckJhc2UobWIpOworCisgICAgICAgIC8vIE1vZHVsYXIgRFJNOiBSZXF1aXJlZCBiL2Mgb2YgdGhlIGFib3ZlIGFkZF9yZWYuCisgICAgICAgIC8vIElmIHJlZj4wLCB0aGVyZSBtdXN0IGJlIGFuIG9ic2VydmVyLCBvciBpdCdsbCBjcmFzaCBhdCByZWxlYXNlKCkuCisgICAgICAgIC8vIFRPRE86IE1lZGlhQnVmZmVyIG1pZ2h0IG5lZWQgdG8gYmUgcmV2aXNlZCB0byBlYXNlIHN1Y2ggbmVlZC4KKyAgICAgICAgbWItPnNldE9ic2VydmVyKHRoaXMpOworICAgICAgICAvLyBzZXRNZWRpYUJ1ZmZlckJhc2UoKSBpbnRlcmVzdGluZ2x5IGRvZXNuJ3QgaW5jcmVtZW50IHRoZSByZWYgY291bnQgb24gaXRzIG93bi4KKyAgICAgICAgLy8gRXh0cmEgaW5jcmVtZW50IChzaW5jZSB3ZSB3YW50IHRvIGtlZXAgbWIgYWxpdmUgYW5kIGF0dGFjaGVkIHRvIGFiIGJleW9uZCB0aGlzIGZ1bmN0aW9uCisgICAgICAgIC8vIGNhbGwuIFRoaXMgaXMgdG8gY291bnRlciB0aGUgZWZmZWN0IG9mIG1iLT5yZWxlYXNlKCkgdG93YXJkcyB0aGUgZW5kLgorICAgICAgICBtYi0+YWRkX3JlZigpOworCisgICAgfSBlbHNlIHsKKyAgICAgICAgYWIgPSBuZXcgQUJ1ZmZlcihvdXRMZW5ndGgpOworICAgICAgICBtZW1jcHkoYWItPmRhdGEoKSwKKyAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopbWItPmRhdGEoKSArIG1iLT5yYW5nZV9vZmZzZXQoKSwKKyAgICAgICAgICAgICAgIG1iLT5yYW5nZV9sZW5ndGgoKSk7CisgICAgfQorCisgICAgaWYgKGF1ZGlvICYmIG1BdWRpb0lzVm9yYmlzKSB7CisgICAgICAgIGludDMyX3QgbnVtUGFnZVNhbXBsZXM7CisgICAgICAgIGlmICghbWItPm1ldGFfZGF0YSgpLT5maW5kSW50MzIoa0tleVZhbGlkU2FtcGxlcywgJm51bVBhZ2VTYW1wbGVzKSkgeworICAgICAgICAgICAgbnVtUGFnZVNhbXBsZXMgPSAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQ4X3QqIGFiRW5kID0gYWItPmRhdGEoKSArIG1iLT5yYW5nZV9sZW5ndGgoKTsKKyAgICAgICAgbWVtY3B5KGFiRW5kLCAmbnVtUGFnZVNhbXBsZXMsIHNpemVvZihudW1QYWdlU2FtcGxlcykpOworICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiBtZXRhID0gYWItPm1ldGEoKTsKKworICAgIGludDY0X3QgdGltZVVzOworICAgIENIRUNLKG1iLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSk7CisgICAgbWV0YS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CisKKyAgICBpZiAodHJhY2tUeXBlID09IE1FRElBX1RSQUNLX1RZUEVfVklERU8pIHsKKyAgICAgICAgaW50MzJfdCBsYXllcklkOworICAgICAgICBpZiAobWItPm1ldGFfZGF0YSgpLT5maW5kSW50MzIoa0tleVRlbXBvcmFsTGF5ZXJJZCwgJmxheWVySWQpKSB7CisgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMigidGVtcG9yYWwtbGF5ZXItaWQiLCBsYXllcklkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh0cmFja1R5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9USU1FRFRFWFQpIHsKKyAgICAgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICAgICAgQ0hFQ0sobVRpbWVkVGV4dFRyYWNrLm1Tb3VyY2UgIT0gTlVMTAorICAgICAgICAgICAgICAgICYmIG1UaW1lZFRleHRUcmFjay5tU291cmNlLT5nZXRGb3JtYXQoKS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworICAgICAgICBtZXRhLT5zZXRTdHJpbmcoIm1pbWUiLCBtaW1lKTsKKyAgICB9CisKKyAgICBpbnQ2NF90IGR1cmF0aW9uVXM7CisgICAgaWYgKG1iLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uVXMpKSB7CisgICAgICAgIG1ldGEtPnNldEludDY0KCJkdXJhdGlvblVzIiwgZHVyYXRpb25Vcyk7CisgICAgfQorCisgICAgaWYgKHRyYWNrVHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX1NVQlRJVExFKSB7CisgICAgICAgIG1ldGEtPnNldEludDMyKCJ0cmFja0luZGV4IiwgbVN1YnRpdGxlVHJhY2subUluZGV4KTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBkYXRhVHlwZTsgLy8gdW51c2VkCisgICAgY29uc3Qgdm9pZCAqc2VpRGF0YTsKKyAgICBzaXplX3Qgc2VpTGVuZ3RoOworICAgIGlmIChtYi0+bWV0YV9kYXRhKCktPmZpbmREYXRhKGtLZXlTRUksICZkYXRhVHlwZSwgJnNlaURhdGEsICZzZWlMZW5ndGgpKSB7CisgICAgICAgIHNwPEFCdWZmZXI+IHNlaSA9IEFCdWZmZXI6OkNyZWF0ZUFzQ29weShzZWlEYXRhLCBzZWlMZW5ndGgpOzsKKyAgICAgICAgbWV0YS0+c2V0QnVmZmVyKCJzZWkiLCBzZWkpOworICAgIH0KKworICAgIGNvbnN0IHZvaWQgKm1wZWdVc2VyRGF0YVBvaW50ZXI7CisgICAgc2l6ZV90IG1wZWdVc2VyRGF0YUxlbmd0aDsKKyAgICBpZiAobWItPm1ldGFfZGF0YSgpLT5maW5kRGF0YSgKKyAgICAgICAgICAgIGtLZXlNcGVnVXNlckRhdGEsICZkYXRhVHlwZSwgJm1wZWdVc2VyRGF0YVBvaW50ZXIsICZtcGVnVXNlckRhdGFMZW5ndGgpKSB7CisgICAgICAgIHNwPEFCdWZmZXI+IG1wZWdVc2VyRGF0YSA9IEFCdWZmZXI6OkNyZWF0ZUFzQ29weShtcGVnVXNlckRhdGFQb2ludGVyLCBtcGVnVXNlckRhdGFMZW5ndGgpOworICAgICAgICBtZXRhLT5zZXRCdWZmZXIoIm1wZWdVc2VyRGF0YSIsIG1wZWdVc2VyRGF0YSk7CisgICAgfQorCisgICAgbWItPnJlbGVhc2UoKTsKKyAgICBtYiA9IE5VTEw7CisKKyAgICByZXR1cm4gYWI7Cit9CisKK2ludDMyX3QgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlOjpnZXREYXRhR2VuZXJhdGlvbihtZWRpYV90cmFja190eXBlIHR5cGUpIGNvbnN0IHsKKyAgICBpbnQzMl90IGdlbmVyYXRpb24gPSAtMTsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIE1FRElBX1RSQUNLX1RZUEVfVklERU86CisgICAgICAgIGdlbmVyYXRpb24gPSBtVmlkZW9EYXRhR2VuZXJhdGlvbjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNRURJQV9UUkFDS19UWVBFX0FVRElPOgorICAgICAgICBnZW5lcmF0aW9uID0gbUF1ZGlvRGF0YUdlbmVyYXRpb247CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUVESUFfVFJBQ0tfVFlQRV9USU1FRFRFWFQ6CisgICAgICAgIGdlbmVyYXRpb24gPSBtRmV0Y2hUaW1lZFRleHREYXRhR2VuZXJhdGlvbjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNRURJQV9UUkFDS19UWVBFX1NVQlRJVExFOgorICAgICAgICBnZW5lcmF0aW9uID0gbUZldGNoU3VidGl0bGVEYXRhR2VuZXJhdGlvbjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGdlbmVyYXRpb247Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlOjpwb3N0UmVhZEJ1ZmZlcihtZWRpYV90cmFja190eXBlIHRyYWNrVHlwZSkgeworICAgIGlmICgobVBlbmRpbmdSZWFkQnVmZmVyVHlwZXMgJiAoMSA8PCB0cmFja1R5cGUpKSA9PSAwKSB7CisgICAgICAgIG1QZW5kaW5nUmVhZEJ1ZmZlclR5cGVzIHw9ICgxIDw8IHRyYWNrVHlwZSk7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZWFkQnVmZmVyLCB0aGlzKTsKKyAgICAgICAgbXNnLT5zZXRJbnQzMigidHJhY2tUeXBlIiwgdHJhY2tUeXBlKTsKKyAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTo6b25SZWFkQnVmZmVyKGNvbnN0IHNwPEFNZXNzYWdlPiYgbXNnKSB7CisgICAgaW50MzJfdCB0bXBUeXBlOworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ0cmFja1R5cGUiLCAmdG1wVHlwZSkpOworICAgIG1lZGlhX3RyYWNrX3R5cGUgdHJhY2tUeXBlID0gKG1lZGlhX3RyYWNrX3R5cGUpdG1wVHlwZTsKKyAgICBtUGVuZGluZ1JlYWRCdWZmZXJUeXBlcyAmPSB+KDEgPDwgdHJhY2tUeXBlKTsKKyAgICByZWFkQnVmZmVyKHRyYWNrVHlwZSk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlOjpyZWFkQnVmZmVyKAorICAgICAgICBtZWRpYV90cmFja190eXBlIHRyYWNrVHlwZSwgaW50NjRfdCBzZWVrVGltZVVzLCBNZWRpYVBsYXllcjJTZWVrTW9kZSBtb2RlLAorICAgICAgICBpbnQ2NF90ICphY3R1YWxUaW1lVXMsIGJvb2wgZm9ybWF0Q2hhbmdlKSB7CisgICAgVHJhY2sgKnRyYWNrOworICAgIHNpemVfdCBtYXhCdWZmZXJzID0gMTsKKyAgICBzd2l0Y2ggKHRyYWNrVHlwZSkgeworICAgICAgICBjYXNlIE1FRElBX1RSQUNLX1RZUEVfVklERU86CisgICAgICAgICAgICB0cmFjayA9ICZtVmlkZW9UcmFjazsKKyAgICAgICAgICAgIG1heEJ1ZmZlcnMgPSA4OyAgLy8gdG9vIGxhcmdlIG9mIGEgbnVtYmVyIG1heSBpbmZsdWVuY2Ugc2Vla3MKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1FRElBX1RSQUNLX1RZUEVfQVVESU86CisgICAgICAgICAgICB0cmFjayA9ICZtQXVkaW9UcmFjazsKKyAgICAgICAgICAgIG1heEJ1ZmZlcnMgPSA2NDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1FRElBX1RSQUNLX1RZUEVfU1VCVElUTEU6CisgICAgICAgICAgICB0cmFjayA9ICZtU3VidGl0bGVUcmFjazsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1FRElBX1RSQUNLX1RZUEVfVElNRURURVhUOgorICAgICAgICAgICAgdHJhY2sgPSAmbVRpbWVkVGV4dFRyYWNrOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBUUkVTUEFTUygpOworICAgIH0KKworICAgIGlmICh0cmFjay0+bVNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoYWN0dWFsVGltZVVzKSB7CisgICAgICAgICphY3R1YWxUaW1lVXMgPSBzZWVrVGltZVVzOworICAgIH0KKworICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyBvcHRpb25zOworCisgICAgYm9vbCBzZWVraW5nID0gZmFsc2U7CisgICAgaWYgKHNlZWtUaW1lVXMgPj0gMCkgeworICAgICAgICBvcHRpb25zLnNldFNlZWtUbyhzZWVrVGltZVVzLCBtb2RlKTsKKyAgICAgICAgc2Vla2luZyA9IHRydWU7CisgICAgfQorCisgICAgY29uc3QgYm9vbCBjb3VsZFJlYWRNdWx0aXBsZSA9ICh0cmFjay0+bVNvdXJjZS0+c3VwcG9ydFJlYWRNdWx0aXBsZSgpKTsKKworICAgIGlmIChjb3VsZFJlYWRNdWx0aXBsZSkgeworICAgICAgICBvcHRpb25zLnNldE5vbkJsb2NraW5nKCk7CisgICAgfQorCisgICAgaW50MzJfdCBnZW5lcmF0aW9uID0gZ2V0RGF0YUdlbmVyYXRpb24odHJhY2tUeXBlKTsKKyAgICBmb3IgKHNpemVfdCBudW1CdWZmZXJzID0gMDsgbnVtQnVmZmVycyA8IG1heEJ1ZmZlcnM7ICkgeworICAgICAgICBWZWN0b3I8TWVkaWFCdWZmZXIgKj4gbWVkaWFCdWZmZXJzOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBOT19FUlJPUjsKKworICAgICAgICBzcDxJTWVkaWFTb3VyY2U+IHNvdXJjZSA9IHRyYWNrLT5tU291cmNlOworICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgaWYgKGNvdWxkUmVhZE11bHRpcGxlKSB7CisgICAgICAgICAgICBlcnIgPSBzb3VyY2UtPnJlYWRNdWx0aXBsZSgKKyAgICAgICAgICAgICAgICAgICAgJm1lZGlhQnVmZmVycywgbWF4QnVmZmVycyAtIG51bUJ1ZmZlcnMsICZvcHRpb25zKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyICptYnVmID0gTlVMTDsKKyAgICAgICAgICAgIGVyciA9IHNvdXJjZS0+cmVhZCgmbWJ1ZiwgJm9wdGlvbnMpOworICAgICAgICAgICAgaWYgKGVyciA9PSBPSyAmJiBtYnVmICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBtZWRpYUJ1ZmZlcnMucHVzaF9iYWNrKG1idWYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1Mb2NrLmxvY2soKTsKKworICAgICAgICBvcHRpb25zLmNsZWFyTm9uUGVyc2lzdGVudCgpOworCisgICAgICAgIHNpemVfdCBpZCA9IDA7CisgICAgICAgIHNpemVfdCBjb3VudCA9IG1lZGlhQnVmZmVycy5zaXplKCk7CisKKyAgICAgICAgLy8gaW4gY2FzZSB0cmFjayBoYXMgYmVlbiBjaGFuZ2VkIHNpbmNlIHdlIGRvbid0IGhhdmUgbG9jayBmb3Igc29tZSB0aW1lLgorICAgICAgICBpZiAoZ2VuZXJhdGlvbiAhPSBnZXREYXRhR2VuZXJhdGlvbih0cmFja1R5cGUpKSB7CisgICAgICAgICAgICBmb3IgKDsgaWQgPCBjb3VudDsgKytpZCkgeworICAgICAgICAgICAgICAgIG1lZGlhQnVmZmVyc1tpZF0tPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZm9yICg7IGlkIDwgY291bnQ7ICsraWQpIHsKKyAgICAgICAgICAgIGludDY0X3QgdGltZVVzOworICAgICAgICAgICAgTWVkaWFCdWZmZXIgKm1idWYgPSBtZWRpYUJ1ZmZlcnNbaWRdOworICAgICAgICAgICAgaWYgKCFtYnVmLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSkgeworICAgICAgICAgICAgICAgIG1idWYtPm1ldGFfZGF0YSgpLT5kdW1wVG9Mb2coKTsKKyAgICAgICAgICAgICAgICB0cmFjay0+bVBhY2tldHMtPnNpZ25hbEVPUyhFUlJPUl9NQUxGT1JNRUQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRyYWNrVHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX0FVRElPKSB7CisgICAgICAgICAgICAgICAgbUF1ZGlvVGltZVVzID0gdGltZVVzOworICAgICAgICAgICAgfSBlbHNlIGlmICh0cmFja1R5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9WSURFTykgeworICAgICAgICAgICAgICAgIG1WaWRlb1RpbWVVcyA9IHRpbWVVczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcXVldWVEaXNjb250aW51aXR5SWZOZWVkZWQoc2Vla2luZywgZm9ybWF0Q2hhbmdlLCB0cmFja1R5cGUsIHRyYWNrKTsKKworICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbWVkaWFCdWZmZXJUb0FCdWZmZXIobWJ1ZiwgdHJhY2tUeXBlKTsKKyAgICAgICAgICAgIGlmIChudW1CdWZmZXJzID09IDAgJiYgYWN0dWFsVGltZVVzICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAqYWN0dWFsVGltZVVzID0gdGltZVVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNlZWtpbmcgJiYgYnVmZmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbWV0YSA9IGJ1ZmZlci0+bWV0YSgpOworICAgICAgICAgICAgICAgIGlmIChtZXRhICE9IG51bGxwdHIgJiYgbW9kZSA9PSBNZWRpYVBsYXllcjJTZWVrTW9kZTo6U0VFS19DTE9TRVNUCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBzZWVrVGltZVVzID4gdGltZVVzKSB7CisgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBleHRyYSA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgICAgICAgICAgICAgZXh0cmEtPnNldEludDY0KCJyZXN1bWUtYXQtbWVkaWFUaW1lVXMiLCBzZWVrVGltZVVzKTsKKyAgICAgICAgICAgICAgICAgICAgbWV0YS0+c2V0TWVzc2FnZSgiZXh0cmEiLCBleHRyYSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cmFjay0+bVBhY2tldHMtPnF1ZXVlQWNjZXNzVW5pdChidWZmZXIpOworICAgICAgICAgICAgZm9ybWF0Q2hhbmdlID0gZmFsc2U7CisgICAgICAgICAgICBzZWVraW5nID0gZmFsc2U7CisgICAgICAgICAgICArK251bUJ1ZmZlcnM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlkIDwgY291bnQpIHsKKyAgICAgICAgICAgIC8vIEVycm9yLCBzb21lIG1lZGlhQnVmZmVyIGRvZXNuJ3QgaGF2ZSBrS2V5VGltZS4KKyAgICAgICAgICAgIGZvciAoOyBpZCA8IGNvdW50OyArK2lkKSB7CisgICAgICAgICAgICAgICAgbWVkaWFCdWZmZXJzW2lkXS0+cmVsZWFzZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZXJyID09IFdPVUxEX0JMT0NLKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIGlmIChlcnIgPT0gSU5GT19GT1JNQVRfQ0hBTkdFRCkgeworI2lmIDAKKyAgICAgICAgICAgIHRyYWNrLT5tUGFja2V0cy0+cXVldWVEaXNjb250aW51aXR5KAorICAgICAgICAgICAgICAgICAgICBBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfRk9STUFUQ0hBTkdFLAorICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBkaXNjYXJkICovKTsKKyNlbmRpZgorICAgICAgICB9IGVsc2UgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgcXVldWVEaXNjb250aW51aXR5SWZOZWVkZWQoc2Vla2luZywgZm9ybWF0Q2hhbmdlLCB0cmFja1R5cGUsIHRyYWNrKTsKKyAgICAgICAgICAgIHRyYWNrLT5tUGFja2V0cy0+c2lnbmFsRU9TKGVycik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtSXNTdHJlYW1pbmcKKyAgICAgICAgJiYgKHRyYWNrVHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX1ZJREVPIHx8IHRyYWNrVHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX0FVRElPKSkgeworICAgICAgICBzdGF0dXNfdCBmaW5hbFJlc3VsdDsKKyAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzID0gdHJhY2stPm1QYWNrZXRzLT5nZXRCdWZmZXJlZER1cmF0aW9uVXMoJmZpbmFsUmVzdWx0KTsKKworICAgICAgICAvLyBUT0RPOiBtYXhSZWJ1ZmZlcmluZ01hcmtNcyBjb3VsZCBiZSBsYXJnZXIgdGhhbgorICAgICAgICAvLyBtQnVmZmVyaW5nU2V0dGluZ3MubVJlc3VtZVBsYXliYWNrTWFya01zCisgICAgICAgIGludDY0X3QgbWFya1VzID0gKG1QcmVwYXJpbmcgPyBtQnVmZmVyaW5nU2V0dGluZ3MubUluaXRpYWxNYXJrTXMKKyAgICAgICAgICAgIDogbUJ1ZmZlcmluZ1NldHRpbmdzLm1SZXN1bWVQbGF5YmFja01hcmtNcykgKiAxMDAwbGw7CisgICAgICAgIGlmIChmaW5hbFJlc3VsdCA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNIHx8IGR1cmF0aW9uVXMgPj0gbWFya1VzKSB7CisgICAgICAgICAgICBpZiAobVByZXBhcmluZyB8fCBtU2VudFBhdXNlT25CdWZmZXJpbmcpIHsKKyAgICAgICAgICAgICAgICBUcmFjayAqY291bnRlclRyYWNrID0KKyAgICAgICAgICAgICAgICAgICAgKHRyYWNrVHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX1ZJREVPID8gJm1BdWRpb1RyYWNrIDogJm1WaWRlb1RyYWNrKTsKKyAgICAgICAgICAgICAgICBpZiAoY291bnRlclRyYWNrLT5tU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgZHVyYXRpb25VcyA9IGNvdW50ZXJUcmFjay0+bVBhY2tldHMtPmdldEJ1ZmZlcmVkRHVyYXRpb25VcygmZmluYWxSZXN1bHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZmluYWxSZXN1bHQgPT0gRVJST1JfRU5EX09GX1NUUkVBTSB8fCBkdXJhdGlvblVzID49IG1hcmtVcykgeworICAgICAgICAgICAgICAgICAgICBpZiAobVByZXBhcmluZykgeworICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5UHJlcGFyZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1QcmVwYXJpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRDYWNoZVN0YXRzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtU2VudFBhdXNlT25CdWZmZXJpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBkdXBOb3RpZnkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFJlc3VtZU9uQnVmZmVyaW5nRW5kKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgcG9zdFJlYWRCdWZmZXIodHJhY2tUeXBlKTsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlOjpxdWV1ZURpc2NvbnRpbnVpdHlJZk5lZWRlZCgKKyAgICAgICAgYm9vbCBzZWVraW5nLCBib29sIGZvcm1hdENoYW5nZSwgbWVkaWFfdHJhY2tfdHlwZSB0cmFja1R5cGUsIFRyYWNrICp0cmFjaykgeworICAgIC8vIGZvcm1hdENoYW5nZSAmJiBzZWVraW5nOiB0cmFjayB3aG9zZSBzb3VyY2UgaXMgY2hhbmdlZCBkdXJpbmcgc2VsZWN0aW9uCisgICAgLy8gZm9ybWF0Q2hhbmdlICYmICFzZWVraW5nOiB0cmFjayB3aG9zZSBzb3VyY2UgaXMgbm90IGNoYW5nZWQgZHVyaW5nIHNlbGVjdGlvbgorICAgIC8vICFmb3JtYXRDaGFuZ2U6IG5vcm1hbCBzZWVrCisgICAgaWYgKChzZWVraW5nIHx8IGZvcm1hdENoYW5nZSkKKyAgICAgICAgICAgICYmICh0cmFja1R5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9BVURJTworICAgICAgICAgICAgfHwgdHJhY2tUeXBlID09IE1FRElBX1RSQUNLX1RZUEVfVklERU8pKSB7CisgICAgICAgIEFUU1BhcnNlcjo6RGlzY29udGludWl0eVR5cGUgdHlwZSA9IChmb3JtYXRDaGFuZ2UgJiYgc2Vla2luZykKKyAgICAgICAgICAgICAgICA/IEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9GT1JNQVRDSEFOR0UKKyAgICAgICAgICAgICAgICA6IEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9OT05FOworICAgICAgICB0cmFjay0+bVBhY2tldHMtPnF1ZXVlRGlzY29udGludWl0eSh0eXBlLCBOVUxMIC8qIGV4dHJhICovLCB0cnVlIC8qIGRpc2NhcmQgKi8pOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2U6Om5vdGlmeUJ1ZmZlcmluZ1VwZGF0ZShpbnQzMl90IHBlcmNlbnRhZ2UpIHsKKyAgICAvLyBCdWZmZXJpbmcgcGVyY2VudCBjb3VsZCBnbyBiYWNrd2FyZCBhcyBpdCdzIGVzdGltYXRlZCBmcm9tIHJlbWFpbmluZworICAgIC8vIGRhdGEgYW5kIGxhc3QgYWNjZXNzIHRpbWUuIFRoaXMgY291bGQgY2F1c2UgdGhlIGJ1ZmZlcmluZyBwb3NpdGlvbgorICAgIC8vIGRyYXduIG9uIG1lZGlhIGNvbnRyb2wgdG8gaml0dGVyIHNsaWdodGx5LiBSZW1lbWJlciBwcmV2aW91c2x5IHJlcG9ydGVkCisgICAgLy8gcGVyY2VudGFnZSBhbmQgZG9uJ3QgYWxsb3cgaXQgdG8gZ28gYmFja3dhcmQuCisgICAgaWYgKHBlcmNlbnRhZ2UgPCBtUHJldkJ1ZmZlclBlcmNlbnRhZ2UpIHsKKyAgICAgICAgcGVyY2VudGFnZSA9IG1QcmV2QnVmZmVyUGVyY2VudGFnZTsKKyAgICB9IGVsc2UgaWYgKHBlcmNlbnRhZ2UgPiAxMDApIHsKKyAgICAgICAgcGVyY2VudGFnZSA9IDEwMDsKKyAgICB9CisKKyAgICBtUHJldkJ1ZmZlclBlcmNlbnRhZ2UgPSBwZXJjZW50YWdlOworCisgICAgQUxPR1YoIm5vdGlmeUJ1ZmZlcmluZ1VwZGF0ZTogYnVmZmVyaW5nICVkJSUiLCBwZXJjZW50YWdlKTsKKworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBkdXBOb3RpZnkoKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRCdWZmZXJpbmdVcGRhdGUpOworICAgIG5vdGlmeS0+c2V0SW50MzIoInBlcmNlbnRhZ2UiLCBwZXJjZW50YWdlKTsKKyAgICBub3RpZnktPnBvc3QoKTsKK30KKwordm9pZCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2U6OnNjaGVkdWxlUG9sbEJ1ZmZlcmluZygpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UG9sbEJ1ZmZlcmluZywgdGhpcyk7CisgICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1Qb2xsQnVmZmVyaW5nR2VuZXJhdGlvbik7CisgICAgLy8gRW5xdWlyZXMgYnVmZmVyaW5nIHN0YXR1cyBldmVyeSBzZWNvbmQuCisgICAgbXNnLT5wb3N0KDEwMDAwMDBsbCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlOjpvblBvbGxCdWZmZXJpbmcoKSB7CisgICAgc3RhdHVzX3QgZmluYWxTdGF0dXMgPSBVTktOT1dOX0VSUk9SOworICAgIGludDY0X3QgY2FjaGVkRHVyYXRpb25VcyA9IC0xbGw7CisgICAgc3NpemVfdCBjYWNoZWREYXRhUmVtYWluaW5nID0gLTE7CisKKyAgICBpZiAobUNhY2hlZFNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgIGNhY2hlZERhdGFSZW1haW5pbmcgPSBtQ2FjaGVkU291cmNlLT5hcHByb3hEYXRhUmVtYWluaW5nKCZmaW5hbFN0YXR1cyk7CisKKyAgICAgICAgaWYgKGZpbmFsU3RhdHVzID09IE9LKSB7CisgICAgICAgICAgICBvZmY2NF90IHNpemU7CisgICAgICAgICAgICBpbnQ2NF90IGJpdHJhdGUgPSAwbGw7CisgICAgICAgICAgICBpZiAobUR1cmF0aW9uVXMgPiAwICYmIG1DYWNoZWRTb3VyY2UtPmdldFNpemUoJnNpemUpID09IE9LKSB7CisgICAgICAgICAgICAgICAgLy8gfGJpdHJhdGV8IHVzZXMgYml0cy9zZWNvbmQgdW5pdCwgd2hpbGUgc2l6ZSBpcyBudW1iZXIgb2YgYnl0ZXMuCisgICAgICAgICAgICAgICAgYml0cmF0ZSA9IHNpemUgKiA4MDAwMDAwbGwgLyBtRHVyYXRpb25VczsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobUJpdHJhdGUgPiAwKSB7CisgICAgICAgICAgICAgICAgYml0cmF0ZSA9IG1CaXRyYXRlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGJpdHJhdGUgPiAwKSB7CisgICAgICAgICAgICAgICAgY2FjaGVkRHVyYXRpb25VcyA9IGNhY2hlZERhdGFSZW1haW5pbmcgKiA4MDAwMDAwbGwgLyBiaXRyYXRlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGZpbmFsU3RhdHVzICE9IE9LKSB7CisgICAgICAgIEFMT0dWKCJvblBvbGxCdWZmZXJpbmc6IEVPUyAoZmluYWxTdGF0dXMgPSAlZCkiLCBmaW5hbFN0YXR1cyk7CisKKyAgICAgICAgaWYgKGZpbmFsU3RhdHVzID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgICAgIG5vdGlmeUJ1ZmZlcmluZ1VwZGF0ZSgxMDApOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChjYWNoZWREdXJhdGlvblVzID49IDBsbCkgeworICAgICAgICBpZiAobUR1cmF0aW9uVXMgPiAwbGwpIHsKKyAgICAgICAgICAgIGludDY0X3QgY2FjaGVkUG9zVXMgPSBnZXRMYXN0UmVhZFBvc2l0aW9uKCkgKyBjYWNoZWREdXJhdGlvblVzOworICAgICAgICAgICAgaW50IHBlcmNlbnRhZ2UgPSAxMDAuMCAqIGNhY2hlZFBvc1VzIC8gbUR1cmF0aW9uVXM7CisgICAgICAgICAgICBpZiAocGVyY2VudGFnZSA+IDEwMCkgeworICAgICAgICAgICAgICAgIHBlcmNlbnRhZ2UgPSAxMDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG5vdGlmeUJ1ZmZlcmluZ1VwZGF0ZShwZXJjZW50YWdlKTsKKyAgICAgICAgfQorCisgICAgICAgIEFMT0dWKCJvblBvbGxCdWZmZXJpbmc6IGNhY2hlZER1cmF0aW9uVXMgJS4xZiBzZWMiLCBjYWNoZWREdXJhdGlvblVzIC8gMTAwMDAwMC4wZik7CisgICAgfQorCisgICAgc2NoZWR1bGVQb2xsQnVmZmVyaW5nKCk7Cit9CisKKy8vIE1vZHVsYXIgRFJNCitzdGF0dXNfdCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2U6OnByZXBhcmVEcm0oCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sCisgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmZHJtU2Vzc2lvbklkLAorICAgICAgICBzcDxBTWVkaWFDcnlwdG9XcmFwcGVyPiAqb3V0Q3J5cHRvKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBBTE9HVigicHJlcGFyZURybSIpOworCisgICAgbUlzRHJtUHJvdGVjdGVkID0gZmFsc2U7CisgICAgbUlzRHJtUmVsZWFzZWQgPSBmYWxzZTsKKyAgICBtSXNTZWN1cmUgPSBmYWxzZTsKKworICAgIHN0YXR1c190IHN0YXR1cyA9IE9LOworICAgIHNwPEFNZWRpYUNyeXB0b1dyYXBwZXI+IGNyeXB0byA9CisgICAgICAgIG5ldyBBTWVkaWFDcnlwdG9XcmFwcGVyKHV1aWQsIGRybVNlc3Npb25JZC5hcnJheSgpLCBkcm1TZXNzaW9uSWQuc2l6ZSgpKTsKKyAgICBpZiAoY3J5cHRvID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoInByZXBhcmVEcm06IGZhaWxlZCB0byBjcmVhdGUgY3J5cHRvLiIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgQUxPR1YoInByZXBhcmVEcm06IGNyeXB0byBjcmVhdGVkIGZvciB1dWlkOiAlcyIsCisgICAgICAgICAgICBEcm1VVUlEOjp0b0hleFN0cmluZyh1dWlkKS5zdHJpbmcoKSk7CisKKyAgICAqb3V0Q3J5cHRvID0gY3J5cHRvOworICAgIC8vIGFzIGxvbmcgYSB0aGVyZSBpcyBhbiBhY3RpdmUgY3J5cHRvCisgICAgbUlzRHJtUHJvdGVjdGVkID0gdHJ1ZTsKKworICAgIGlmIChtTWltZXMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgc3RhdHVzID0gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgQUxPR0UoInByZXBhcmVEcm06IFVuZXhwZWN0ZWQuIE11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgdHJhY2suIHN0YXR1czogJWQiLCBzdGF0dXMpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIC8vIGZpcnN0IG1pbWUgaW4gdGhpcyBsaXN0IGlzIGVpdGhlciB0aGUgdmlkZW8gdHJhY2ssIG9yIHRoZSBmaXJzdCBhdWRpbyB0cmFjaworICAgIGNvbnN0IGNoYXIgKm1pbWUgPSBtTWltZXNbMF0uc3RyaW5nKCk7CisgICAgbUlzU2VjdXJlID0gY3J5cHRvLT5yZXF1aXJlc1NlY3VyZURlY29kZXJDb21wb25lbnQobWltZSk7CisgICAgQUxPR1YoInByZXBhcmVEcm06IHJlcXVpcmVzU2VjdXJlRGVjb2RlckNvbXBvbmVudCBtaW1lOiAlcyAgaXNTZWN1cmU6ICVkIiwKKyAgICAgICAgICAgIG1pbWUsIG1Jc1NlY3VyZSk7CisKKyAgICAvLyBDaGVja2luZyB0aGUgbWVtYmVyIGZsYWdzIHdoaWxlIGluIHRoZSBsb29wZXIgdG8gc2VuZCBvdXQgdGhlIG5vdGlmaWNhdGlvbi4KKyAgICAvLyBUaGUgbGVnYWN5IG1EZWNyeXB0SGFuZGxlIT1OVUxMIGNoZWNrIChmb3IgRkxBR19QUk9URUNURUQpIGlzIGVxdWl2YWxlbnQgdG8gbUlzRHJtUHJvdGVjdGVkLgorICAgIG5vdGlmeUZsYWdzQ2hhbmdlZCgKKyAgICAgICAgICAgIChtSXNTZWN1cmUgPyBGTEFHX1NFQ1VSRSA6IDApIHwKKyAgICAgICAgICAgIC8vIFNldHRpbmcgInByb3RlY3RlZCBzY3JlZW4iIG9ubHkgZm9yIEwxOiBiLzM4MzkwODM2CisgICAgICAgICAgICAobUlzU2VjdXJlID8gRkxBR19QUk9URUNURUQgOiAwKSB8CisgICAgICAgICAgICBGTEFHX0NBTl9QQVVTRSB8CisgICAgICAgICAgICBGTEFHX0NBTl9TRUVLX0JBQ0tXQVJEIHwKKyAgICAgICAgICAgIEZMQUdfQ0FOX1NFRUtfRk9SV0FSRCB8CisgICAgICAgICAgICBGTEFHX0NBTl9TRUVLKTsKKworICAgIGlmIChzdGF0dXMgPT0gT0spIHsKKyAgICAgICAgQUxPR1YoInByZXBhcmVEcm06IG1DcnlwdG86ICVwIiwgb3V0Q3J5cHRvLT5nZXQoKSk7CisgICAgICAgIEFMT0dEKCJwcmVwYXJlRHJtIHJldDogJWQgIiwgc3RhdHVzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgicHJlcGFyZURybSBlcnI6ICVkIiwgc3RhdHVzKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlOjpyZWxlYXNlRHJtKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgQUxPR1YoInJlbGVhc2VEcm0iKTsKKworICAgIGlmIChtSXNEcm1Qcm90ZWN0ZWQpIHsKKyAgICAgICAgbUlzRHJtUHJvdGVjdGVkID0gZmFsc2U7CisgICAgICAgIC8vIHRvIHByZXZlbnQgcmV0dXJuaW5nIGFueSBtb3JlIGJ1ZmZlciBhZnRlciBzdG9wL3JlbGVhc2VEcm0gKGIvMzc5NjAwOTYpCisgICAgICAgIG1Jc0RybVJlbGVhc2VkID0gdHJ1ZTsKKyAgICAgICAgQUxPR1YoInJlbGVhc2VEcm06IG1Jc0RybVByb3RlY3RlZCBpcyByZXNldC4iKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgicmVsZWFzZURybTogbUlzRHJtUHJvdGVjdGVkIGlzIGFscmVhZHkgZmFsc2UuIik7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2U6OmNoZWNrRHJtSW5mbygpCit7CisgICAgLy8gY2xlYXJpbmcgdGhlIGZsYWcgYXQgcHJlcGFyZSBpbiBjYXNlIHRoZSBwbGF5ZXIgaXMgcmV1c2VkIGFmdGVyIHN0b3AvcmVsZWFzZURybSB3aXRoIHRoZQorICAgIC8vIHNhbWUgc291cmNlIHdpdGhvdXQgYmVpbmcgcmVzZXQgKGNhbGxlZCBieSBwcmVwYXJlQXN5bmMvaW5pdEZyb21EYXRhU291cmNlKQorICAgIG1Jc0RybVJlbGVhc2VkID0gZmFsc2U7CisKKyAgICBpZiAobUZpbGVNZXRhID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0koImNoZWNrRHJtSW5mbzogTm8gbWV0YWRhdGEiKTsKKyAgICAgICAgcmV0dXJuIE9LOyAvLyBsZXR0aW5nIHRoZSBjYWxsZXIgcmVzcG9uZHMgYWNjb3JkaW5nbHkKKyAgICB9CisKKyAgICB1aW50MzJfdCB0eXBlOworICAgIGNvbnN0IHZvaWQgKnBzc2g7CisgICAgc2l6ZV90IHBzc2hzaXplOworCisgICAgaWYgKCFtRmlsZU1ldGEtPmZpbmREYXRhKGtLZXlQc3NoLCAmdHlwZSwgJnBzc2gsICZwc3Noc2l6ZSkpIHsKKyAgICAgICAgQUxPR1YoImNoZWNrRHJtSW5mbzogTm8gUFNTSCIpOworICAgICAgICByZXR1cm4gT0s7IC8vIHNvdXJjZSB3aXRob3V0IERSTSBpbmZvCisgICAgfQorCisgICAgUGFyY2VsIHBhcmNlbDsKKyAgICBOdVBsYXllcjJEcm06OnJldHJpZXZlRHJtSW5mbyhwc3NoLCBwc3Noc2l6ZSwgJnBhcmNlbCk7CisgICAgQUxPR1YoImNoZWNrRHJtSW5mbzogTUVESUEyX0RSTV9JTkZPIFBTU0ggc2l6ZTogJWQgIFBhcmNlbCBzaXplOiAlZCAgb2JqZWN0cyM6ICVkIiwKKyAgICAgICAgICAoaW50KXBzc2hzaXplLCAoaW50KXBhcmNlbC5kYXRhU2l6ZSgpLCAoaW50KXBhcmNlbC5vYmplY3RzQ291bnQoKSk7CisKKyAgICBpZiAocGFyY2VsLmRhdGFTaXplKCkgPT0gMCkgeworICAgICAgICBBTE9HRSgiY2hlY2tEcm1JbmZvOiBVbmV4cGVjdGVkIHBhcmNlbCBzaXplOiAwIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIC8vIENhbid0IHBhc3MgcGFyY2VsIGFzIGEgbWVzc2FnZSB0byB0aGUgcGxheWVyLiBDb252ZXJ0aW5nIFBhcmNlbC0+QUJ1ZmZlciB0byBwYXNzIGl0CisgICAgLy8gdG8gdGhlIFBsYXllcidzIG9uU291cmNlTm90aWZ5IHRoZW4gYmFjayB0byBQYXJjZWwgZm9yIGNhbGxpbmcgZHJpdmVyJ3Mgbm90aWZ5TGlzdGVuZXIuCisgICAgc3A8QUJ1ZmZlcj4gZHJtSW5mb0J1ZmZlciA9IEFCdWZmZXI6OkNyZWF0ZUFzQ29weShwYXJjZWwuZGF0YSgpLCBwYXJjZWwuZGF0YVNpemUoKSk7CisgICAgbm90aWZ5RHJtSW5mbyhkcm1JbmZvQnVmZmVyKTsKKworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2U6OnNpZ25hbEJ1ZmZlclJldHVybmVkKE1lZGlhQnVmZmVyICpidWZmZXIpCit7CisgICAgLy9BTE9HVigic2lnbmFsQnVmZmVyUmV0dXJuZWQgJXAgIHJlZkNvdW50OiAlZCIsIGJ1ZmZlciwgYnVmZmVyLT5sb2NhbFJlZmNvdW50KCkpOworCisgICAgYnVmZmVyLT5zZXRPYnNlcnZlcihOVUxMKTsKKyAgICBidWZmZXItPnJlbGVhc2UoKTsgLy8gdGhpcyBsZWFkcyB0byBkZWxldGUgc2luY2UgdGhhdCB0aGVyZSBpcyBubyBvYnNlcnZvcgorfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvbnVwbGF5ZXIyL0dlbmVyaWNTb3VyY2UuaCBiL21lZGlhL2xpYm1lZGlhL251cGxheWVyMi9HZW5lcmljU291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY2NmQyNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL251cGxheWVyMi9HZW5lcmljU291cmNlLmgKQEAgLTAsMCArMSwyNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgR0VORVJJQ19TT1VSQ0VfSF8KKworI2RlZmluZSBHRU5FUklDX1NPVVJDRV9IXworCisjaW5jbHVkZSAiTnVQbGF5ZXIyLmgiCisjaW5jbHVkZSAiTnVQbGF5ZXIyU291cmNlLmgiCisKKyNpbmNsdWRlICJBVFNQYXJzZXIuaCIKKworI2luY2x1ZGUgPG1lZGlhL21lZGlhcGxheWVyMi5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgRGVjcnlwdEhhbmRsZTsKK3N0cnVjdCBBbm90aGVyUGFja2V0U291cmNlOworc3RydWN0IEFSVFNQQ29udHJvbGxlcjsKK2NsYXNzIERhdGFTb3VyY2U7CitjbGFzcyBJRGF0YVNvdXJjZTsKK3N0cnVjdCBNZWRpYUhUVFBTZXJ2aWNlOworc3RydWN0IE1lZGlhU291cmNlOworY2xhc3MgTWVkaWFCdWZmZXI7CitzdHJ1Y3QgTWVkaWFDbG9jazsKK3N0cnVjdCBOdUNhY2hlZFNvdXJjZTI7CisKK3N0cnVjdCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UgOiBwdWJsaWMgTnVQbGF5ZXIyOjpTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgTWVkaWFCdWZmZXJPYnNlcnZlciAvLyBNb2R1bGFyIERSTQoreworICAgIEdlbmVyaWNTb3VyY2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksIGJvb2wgdWlkVmFsaWQsIHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ2xvY2s+ICZtZWRpYUNsb2NrKTsKKworICAgIHN0YXR1c190IHNldERhdGFTb3VyY2UoCisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsCisgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7CisKKyAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKKworICAgIHN0YXR1c190IHNldERhdGFTb3VyY2UoY29uc3Qgc3A8RGF0YVNvdXJjZT4mIGRhdGFTb3VyY2UpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRCdWZmZXJpbmdTZXR0aW5ncygKKyAgICAgICAgICAgIEJ1ZmZlcmluZ1NldHRpbmdzKiBidWZmZXJpbmcgLyogbm9ubnVsbCAqLykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRCdWZmZXJpbmdTZXR0aW5ncyhjb25zdCBCdWZmZXJpbmdTZXR0aW5ncyYgYnVmZmVyaW5nKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgdm9pZCBwcmVwYXJlQXN5bmMoKTsKKworICAgIHZpcnR1YWwgdm9pZCBzdGFydCgpOworICAgIHZpcnR1YWwgdm9pZCBzdG9wKCk7CisgICAgdmlydHVhbCB2b2lkIHBhdXNlKCk7CisgICAgdmlydHVhbCB2b2lkIHJlc3VtZSgpOworCisgICAgdmlydHVhbCB2b2lkIGRpc2Nvbm5lY3QoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZmVlZE1vcmVUU0RhdGEoKTsKKworICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZpbGVGb3JtYXRNZXRhKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGRlcXVldWVBY2Nlc3NVbml0KGJvb2wgYXVkaW8sIHNwPEFCdWZmZXI+ICphY2Nlc3NVbml0KTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RHVyYXRpb24oaW50NjRfdCAqZHVyYXRpb25Vcyk7CisgICAgdmlydHVhbCBzaXplX3QgZ2V0VHJhY2tDb3VudCgpIGNvbnN0OworICAgIHZpcnR1YWwgc3A8QU1lc3NhZ2U+IGdldFRyYWNrSW5mbyhzaXplX3QgdHJhY2tJbmRleCkgY29uc3Q7CisgICAgdmlydHVhbCBzc2l6ZV90IGdldFNlbGVjdGVkVHJhY2sobWVkaWFfdHJhY2tfdHlwZSB0eXBlKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNlbGVjdFRyYWNrKHNpemVfdCB0cmFja0luZGV4LCBib29sIHNlbGVjdCwgaW50NjRfdCB0aW1lVXMpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2Vla1RvKAorICAgICAgICBpbnQ2NF90IHNlZWtUaW1lVXMsCisgICAgICAgIE1lZGlhUGxheWVyMlNlZWtNb2RlIG1vZGUgPSBNZWRpYVBsYXllcjJTZWVrTW9kZTo6U0VFS19QUkVWSU9VU19TWU5DKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgYm9vbCBpc1N0cmVhbWluZygpIGNvbnN0OworCisgICAgLy8gTW9kdWxhciBEUk0KKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXIgKmJ1ZmZlcik7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHByZXBhcmVEcm0oCisgICAgICAgICAgICBjb25zdCB1aW50OF90IHV1aWRbMTZdLAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZkcm1TZXNzaW9uSWQsCisgICAgICAgICAgICBzcDxBTWVkaWFDcnlwdG9XcmFwcGVyPiAqb3V0Q3J5cHRvKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZURybSgpOworCisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5HZW5lcmljU291cmNlKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworCisgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0TWV0YShib29sIGF1ZGlvKTsKKworcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAga1doYXRQcmVwYXJlQXN5bmMsCisgICAgICAgIGtXaGF0RmV0Y2hTdWJ0aXRsZURhdGEsCisgICAgICAgIGtXaGF0RmV0Y2hUaW1lZFRleHREYXRhLAorICAgICAgICBrV2hhdFNlbmRTdWJ0aXRsZURhdGEsCisgICAgICAgIGtXaGF0U2VuZEdsb2JhbFRpbWVkVGV4dERhdGEsCisgICAgICAgIGtXaGF0U2VuZFRpbWVkVGV4dERhdGEsCisgICAgICAgIGtXaGF0Q2hhbmdlQVZTb3VyY2UsCisgICAgICAgIGtXaGF0UG9sbEJ1ZmZlcmluZywKKyAgICAgICAga1doYXRTZWVrLAorICAgICAgICBrV2hhdFJlYWRCdWZmZXIsCisgICAgICAgIGtXaGF0U3RhcnQsCisgICAgICAgIGtXaGF0UmVzdW1lLAorICAgICAgICBrV2hhdFNlY3VyZURlY29kZXJzSW5zdGFudGlhdGVkLAorICAgIH07CisKKyAgICBzdHJ1Y3QgVHJhY2sgeworICAgICAgICBzaXplX3QgbUluZGV4OworICAgICAgICBzcDxJTWVkaWFTb3VyY2U+IG1Tb3VyY2U7CisgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IG1QYWNrZXRzOworICAgIH07CisKKyAgICBWZWN0b3I8c3A8SU1lZGlhU291cmNlPiA+IG1Tb3VyY2VzOworICAgIFRyYWNrIG1BdWRpb1RyYWNrOworICAgIGludDY0X3QgbUF1ZGlvVGltZVVzOworICAgIGludDY0X3QgbUF1ZGlvTGFzdERlcXVldWVUaW1lVXM7CisgICAgVHJhY2sgbVZpZGVvVHJhY2s7CisgICAgaW50NjRfdCBtVmlkZW9UaW1lVXM7CisgICAgaW50NjRfdCBtVmlkZW9MYXN0RGVxdWV1ZVRpbWVVczsKKyAgICBUcmFjayBtU3VidGl0bGVUcmFjazsKKyAgICBUcmFjayBtVGltZWRUZXh0VHJhY2s7CisKKyAgICBCdWZmZXJpbmdTZXR0aW5ncyBtQnVmZmVyaW5nU2V0dGluZ3M7CisgICAgaW50MzJfdCBtUHJldkJ1ZmZlclBlcmNlbnRhZ2U7CisgICAgaW50MzJfdCBtUG9sbEJ1ZmZlcmluZ0dlbmVyYXRpb247CisgICAgYm9vbCBtU2VudFBhdXNlT25CdWZmZXJpbmc7CisKKyAgICBpbnQzMl90IG1BdWRpb0RhdGFHZW5lcmF0aW9uOworICAgIGludDMyX3QgbVZpZGVvRGF0YUdlbmVyYXRpb247CisgICAgaW50MzJfdCBtRmV0Y2hTdWJ0aXRsZURhdGFHZW5lcmF0aW9uOworICAgIGludDMyX3QgbUZldGNoVGltZWRUZXh0RGF0YUdlbmVyYXRpb247CisgICAgaW50NjRfdCBtRHVyYXRpb25VczsKKyAgICBib29sIG1BdWRpb0lzVm9yYmlzOworICAgIC8vIFNlY3VyZSBjb2RlYyBpcyByZXF1aXJlZC4KKyAgICBib29sIG1Jc1NlY3VyZTsKKyAgICBib29sIG1Jc1N0cmVhbWluZzsKKyAgICBib29sIG1VSURWYWxpZDsKKyAgICB1aWRfdCBtVUlEOworICAgIGNvbnN0IHNwPE1lZGlhQ2xvY2s+IG1NZWRpYUNsb2NrOworICAgIHNwPE1lZGlhSFRUUFNlcnZpY2U+IG1IVFRQU2VydmljZTsKKyAgICBBU3RyaW5nIG1Vcmk7CisgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbVVyaUhlYWRlcnM7CisgICAgaW50IG1GZDsKKyAgICBpbnQ2NF90IG1PZmZzZXQ7CisgICAgaW50NjRfdCBtTGVuZ3RoOworCisgICAgYm9vbCBtRGlzY29ubmVjdGVkOworICAgIHNwPERhdGFTb3VyY2U+IG1EYXRhU291cmNlOworICAgIHNwPE51Q2FjaGVkU291cmNlMj4gbUNhY2hlZFNvdXJjZTsKKyAgICBzcDxEYXRhU291cmNlPiBtSHR0cFNvdXJjZTsKKyAgICBzcDxNZXRhRGF0YT4gbUZpbGVNZXRhOworICAgIGJvb2wgbVN0YXJ0ZWQ7CisgICAgYm9vbCBtUHJlcGFyaW5nOworICAgIGludDY0X3QgbUJpdHJhdGU7CisgICAgdWludDMyX3QgbVBlbmRpbmdSZWFkQnVmZmVyVHlwZXM7CisgICAgc3A8QUJ1ZmZlcj4gbUdsb2JhbFRpbWVkVGV4dDsKKworICAgIG11dGFibGUgTXV0ZXggbUxvY2s7CisKKyAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOworCisgICAgdm9pZCByZXNldERhdGFTb3VyY2UoKTsKKworICAgIHN0YXR1c190IGluaXRGcm9tRGF0YVNvdXJjZSgpOworICAgIGludDY0X3QgZ2V0TGFzdFJlYWRQb3NpdGlvbigpOworCisgICAgdm9pZCBub3RpZnlQcmVwYXJlZEFuZENsZWFudXAoc3RhdHVzX3QgZXJyKTsKKyAgICB2b2lkIG9uU2VjdXJlRGVjb2RlcnNJbnN0YW50aWF0ZWQoc3RhdHVzX3QgZXJyKTsKKyAgICB2b2lkIGZpbmlzaFByZXBhcmVBc3luYygpOworICAgIHN0YXR1c190IHN0YXJ0U291cmNlcygpOworCisgICAgdm9pZCBvblNlZWsoY29uc3Qgc3A8QU1lc3NhZ2U+JiBtc2cpOworICAgIHN0YXR1c190IGRvU2VlayhpbnQ2NF90IHNlZWtUaW1lVXMsIE1lZGlhUGxheWVyMlNlZWtNb2RlIG1vZGUpOworCisgICAgdm9pZCBvblByZXBhcmVBc3luYygpOworCisgICAgdm9pZCBmZXRjaFRleHREYXRhKAorICAgICAgICAgICAgdWludDMyX3Qgd2hhdCwgbWVkaWFfdHJhY2tfdHlwZSB0eXBlLAorICAgICAgICAgICAgaW50MzJfdCBjdXJHZW4sIGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+JiBwYWNrZXRzLCBjb25zdCBzcDxBTWVzc2FnZT4mIG1zZyk7CisKKyAgICB2b2lkIHNlbmRHbG9iYWxUZXh0RGF0YSgKKyAgICAgICAgICAgIHVpbnQzMl90IHdoYXQsCisgICAgICAgICAgICBpbnQzMl90IGN1ckdlbiwgc3A8QU1lc3NhZ2U+IG1zZyk7CisKKyAgICB2b2lkIHNlbmRUZXh0RGF0YSgKKyAgICAgICAgICAgIHVpbnQzMl90IHdoYXQsIG1lZGlhX3RyYWNrX3R5cGUgdHlwZSwKKyAgICAgICAgICAgIGludDMyX3QgY3VyR2VuLCBjb25zdCBzcDxBbm90aGVyUGFja2V0U291cmNlPiYgcGFja2V0cywgY29uc3Qgc3A8QU1lc3NhZ2U+JiBtc2cpOworCisgICAgc3A8QUJ1ZmZlcj4gbWVkaWFCdWZmZXJUb0FCdWZmZXIoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqbWJ1ZiwKKyAgICAgICAgICAgIG1lZGlhX3RyYWNrX3R5cGUgdHJhY2tUeXBlKTsKKworICAgIHZvaWQgcG9zdFJlYWRCdWZmZXIobWVkaWFfdHJhY2tfdHlwZSB0cmFja1R5cGUpOworICAgIHZvaWQgb25SZWFkQnVmZmVyKGNvbnN0IHNwPEFNZXNzYWdlPiYgbXNnKTsKKyAgICAvLyBXaGVuIHxtb2RlfCBpcyBNZWRpYVBsYXllcjJTZWVrTW9kZTo6U0VFS19DTE9TRVNULCB0aGUgYnVmZmVyIHJlYWQgc2hhbGwKKyAgICAvLyBpbmNsdWRlIGFuIGl0ZW0gaW5kaWNhdGluZyBza2lwcGluZyByZW5kZXJpbmcgYWxsIGJ1ZmZlcnMgd2l0aCB0aW1lc3RhbXAKKyAgICAvLyBlYXJsaWVyIHRoYW4gfHNlZWtUaW1lVXN8LgorICAgIC8vIEZvciBvdGhlciBtb2RlcywgdGhlIGJ1ZmZlciByZWFkIHdpbGwgbm90IGluY2x1ZGUgdGhlIGl0ZW0gYXMgYWJvdmUgaW4gb3JkZXIKKyAgICAvLyB0byBmYWNpbGl0YXRlIGZhc3Qgc2VlayBvcGVyYXRpb24uCisgICAgdm9pZCByZWFkQnVmZmVyKAorICAgICAgICAgICAgbWVkaWFfdHJhY2tfdHlwZSB0cmFja1R5cGUsCisgICAgICAgICAgICBpbnQ2NF90IHNlZWtUaW1lVXMgPSAtMWxsLAorICAgICAgICAgICAgTWVkaWFQbGF5ZXIyU2Vla01vZGUgbW9kZSA9IE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkMsCisgICAgICAgICAgICBpbnQ2NF90ICphY3R1YWxUaW1lVXMgPSBOVUxMLCBib29sIGZvcm1hdENoYW5nZSA9IGZhbHNlKTsKKworICAgIHZvaWQgcXVldWVEaXNjb250aW51aXR5SWZOZWVkZWQoCisgICAgICAgICAgICBib29sIHNlZWtpbmcsIGJvb2wgZm9ybWF0Q2hhbmdlLCBtZWRpYV90cmFja190eXBlIHRyYWNrVHlwZSwgVHJhY2sgKnRyYWNrKTsKKworICAgIHZvaWQgc2NoZWR1bGVQb2xsQnVmZmVyaW5nKCk7CisgICAgdm9pZCBvblBvbGxCdWZmZXJpbmcoKTsKKyAgICB2b2lkIG5vdGlmeUJ1ZmZlcmluZ1VwZGF0ZShpbnQzMl90IHBlcmNlbnRhZ2UpOworCisgICAgdm9pZCBzZW5kQ2FjaGVTdGF0cygpOworCisgICAgc3A8TWV0YURhdGE+IGdldEZvcm1hdE1ldGFfbChib29sIGF1ZGlvKTsKKyAgICBpbnQzMl90IGdldERhdGFHZW5lcmF0aW9uKG1lZGlhX3RyYWNrX3R5cGUgdHlwZSkgY29uc3Q7CisKKyAgICAvLyBNb2R1bGFyIERSTQorICAgIC8vIFRoZSBzb3VyY2UgaXMgRFJNIHByb3RlY3RlZCBhbmQgaXMgcHJlcGFyZWQgZm9yIERSTS4KKyAgICBib29sIG1Jc0RybVByb3RlY3RlZDsKKyAgICAvLyByZWxlYXNlRHJtIGhhcyBiZWVuIHByb2Nlc3NlZC4KKyAgICBib29sIG1Jc0RybVJlbGVhc2VkOworICAgIFZlY3RvcjxTdHJpbmc4PiBtTWltZXM7CisKKyAgICBzdGF0dXNfdCBjaGVja0RybUluZm8oKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEdlbmVyaWNTb3VyY2UpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBHRU5FUklDX1NPVVJDRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvbnVwbGF5ZXIyL0hUVFBMaXZlU291cmNlLmNwcCBiL21lZGlhL2xpYm1lZGlhL251cGxheWVyMi9IVFRQTGl2ZVNvdXJjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRiNjdjYWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9udXBsYXllcjIvSFRUUExpdmVTb3VyY2UuY3BwCkBAIC0wLDAgKzEsNDQ4IEBACisvKgorICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkhUVFBMaXZlU291cmNlIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiSFRUUExpdmVTb3VyY2UuaCIKKworI2luY2x1ZGUgIkFub3RoZXJQYWNrZXRTb3VyY2UuaCIKKyNpbmNsdWRlICJMaXZlRGF0YVNvdXJjZS5oIgorCisjaW5jbHVkZSA8bWVkaWEvTWVkaWFIVFRQU2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorCisvLyBkZWZhdWx0IGJ1ZmZlciBwcmVwYXJlL3JlYWR5L3VuZGVyZmxvdyBtYXJrcworc3RhdGljIGNvbnN0IGludCBrUmVhZHlNYXJrTXMgICAgID0gNTAwMDsgIC8vIDUgc2Vjb25kcworc3RhdGljIGNvbnN0IGludCBrUHJlcGFyZU1hcmtNcyAgID0gMTUwMDsgIC8vIDEuNSBzZWNvbmRzCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworTnVQbGF5ZXIyOjpIVFRQTGl2ZVNvdXJjZTo6SFRUUExpdmVTb3VyY2UoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAorICAgICAgICBjb25zdCBzcDxNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKKyAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpCisgICAgOiBTb3VyY2Uobm90aWZ5KSwKKyAgICAgIG1IVFRQU2VydmljZShodHRwU2VydmljZSksCisgICAgICBtVVJMKHVybCksCisgICAgICBtRmxhZ3MoMCksCisgICAgICBtRmluYWxSZXN1bHQoT0spLAorICAgICAgbU9mZnNldCgwKSwKKyAgICAgIG1GZXRjaFN1YnRpdGxlRGF0YUdlbmVyYXRpb24oMCksCisgICAgICBtRmV0Y2hNZXRhRGF0YUdlbmVyYXRpb24oMCksCisgICAgICBtSGFzTWV0YWRhdGEoZmFsc2UpLAorICAgICAgbU1ldGFkYXRhU2VsZWN0ZWQoZmFsc2UpIHsKKyAgICBtQnVmZmVyaW5nU2V0dGluZ3MubUluaXRpYWxNYXJrTXMgPSBrUHJlcGFyZU1hcmtNczsKKyAgICBtQnVmZmVyaW5nU2V0dGluZ3MubVJlc3VtZVBsYXliYWNrTWFya01zID0ga1JlYWR5TWFya01zOworICAgIGlmIChoZWFkZXJzKSB7CisgICAgICAgIG1FeHRyYUhlYWRlcnMgPSAqaGVhZGVyczsKKworICAgICAgICBzc2l6ZV90IGluZGV4ID0KKyAgICAgICAgICAgIG1FeHRyYUhlYWRlcnMuaW5kZXhPZktleShTdHJpbmc4KCJ4LWhpZGUtdXJscy1mcm9tLWxvZyIpKTsKKworICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgbUZsYWdzIHw9IGtGbGFnSW5jb2duaXRvOworCisgICAgICAgICAgICBtRXh0cmFIZWFkZXJzLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOworICAgICAgICB9CisgICAgfQorfQorCitOdVBsYXllcjI6OkhUVFBMaXZlU291cmNlOjp+SFRUUExpdmVTb3VyY2UoKSB7CisgICAgaWYgKG1MaXZlU2Vzc2lvbiAhPSBOVUxMKSB7CisgICAgICAgIG1MaXZlU2Vzc2lvbi0+ZGlzY29ubmVjdCgpOworCisgICAgICAgIG1MaXZlTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihtTGl2ZVNlc3Npb24tPmlkKCkpOworICAgICAgICBtTGl2ZUxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIoaWQoKSk7CisgICAgICAgIG1MaXZlTG9vcGVyLT5zdG9wKCk7CisKKyAgICAgICAgbUxpdmVTZXNzaW9uLmNsZWFyKCk7CisgICAgICAgIG1MaXZlTG9vcGVyLmNsZWFyKCk7CisgICAgfQorfQorCitzdGF0dXNfdCBOdVBsYXllcjI6OkhUVFBMaXZlU291cmNlOjpnZXRCdWZmZXJpbmdTZXR0aW5ncygKKyAgICAgICAgICAgIEJ1ZmZlcmluZ1NldHRpbmdzKiBidWZmZXJpbmcgLyogbm9ubnVsbCAqLykgeworICAgICpidWZmZXJpbmcgPSBtQnVmZmVyaW5nU2V0dGluZ3M7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE51UGxheWVyMjo6SFRUUExpdmVTb3VyY2U6OnNldEJ1ZmZlcmluZ1NldHRpbmdzKGNvbnN0IEJ1ZmZlcmluZ1NldHRpbmdzJiBidWZmZXJpbmcpIHsKKyAgICBtQnVmZmVyaW5nU2V0dGluZ3MgPSBidWZmZXJpbmc7CisKKyAgICBpZiAobUxpdmVTZXNzaW9uICE9IE5VTEwpIHsKKyAgICAgICAgbUxpdmVTZXNzaW9uLT5zZXRCdWZmZXJpbmdTZXR0aW5ncyhtQnVmZmVyaW5nU2V0dGluZ3MpOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBOdVBsYXllcjI6OkhUVFBMaXZlU291cmNlOjpwcmVwYXJlQXN5bmMoKSB7CisgICAgaWYgKG1MaXZlTG9vcGVyID09IE5VTEwpIHsKKyAgICAgICAgbUxpdmVMb29wZXIgPSBuZXcgQUxvb3BlcjsKKyAgICAgICAgbUxpdmVMb29wZXItPnNldE5hbWUoImh0dHAgbGl2ZSIpOworICAgICAgICBtTGl2ZUxvb3Blci0+c3RhcnQoKTsKKworICAgICAgICBtTGl2ZUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKHRoaXMpOworICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXNzaW9uTm90aWZ5LCB0aGlzKTsKKworICAgIG1MaXZlU2Vzc2lvbiA9IG5ldyBMaXZlU2Vzc2lvbigKKyAgICAgICAgICAgIG5vdGlmeSwKKyAgICAgICAgICAgIChtRmxhZ3MgJiBrRmxhZ0luY29nbml0bykgPyBMaXZlU2Vzc2lvbjo6a0ZsYWdJbmNvZ25pdG8gOiAwLAorICAgICAgICAgICAgbUhUVFBTZXJ2aWNlKTsKKworICAgIG1MaXZlTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobUxpdmVTZXNzaW9uKTsKKworICAgIG1MaXZlU2Vzc2lvbi0+c2V0QnVmZmVyaW5nU2V0dGluZ3MobUJ1ZmZlcmluZ1NldHRpbmdzKTsKKyAgICBtTGl2ZVNlc3Npb24tPmNvbm5lY3RBc3luYygKKyAgICAgICAgICAgIG1VUkwuY19zdHIoKSwgbUV4dHJhSGVhZGVycy5pc0VtcHR5KCkgPyBOVUxMIDogJm1FeHRyYUhlYWRlcnMpOworfQorCit2b2lkIE51UGxheWVyMjo6SFRUUExpdmVTb3VyY2U6OnN0YXJ0KCkgeworfQorCitzcDxNZXRhRGF0YT4gTnVQbGF5ZXIyOjpIVFRQTGl2ZVNvdXJjZTo6Z2V0Rm9ybWF0TWV0YShib29sIGF1ZGlvKSB7CisgICAgc3A8TWV0YURhdGE+IG1ldGE7CisgICAgaWYgKG1MaXZlU2Vzc2lvbiAhPSBOVUxMKSB7CisgICAgICAgIG1MaXZlU2Vzc2lvbi0+Z2V0U3RyZWFtRm9ybWF0TWV0YSgKKyAgICAgICAgICAgICAgICBhdWRpbyA/IExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX0FVRElPCisgICAgICAgICAgICAgICAgICAgICAgOiBMaXZlU2Vzc2lvbjo6U1RSRUFNVFlQRV9WSURFTywKKyAgICAgICAgICAgICAgICAmbWV0YSk7CisgICAgfQorCisgICAgcmV0dXJuIG1ldGE7Cit9CisKK3NwPEFNZXNzYWdlPiBOdVBsYXllcjI6OkhUVFBMaXZlU291cmNlOjpnZXRGb3JtYXQoYm9vbCBhdWRpbykgeworICAgIHNwPE1ldGFEYXRhPiBtZXRhOworICAgIHN0YXR1c190IGVyciA9IC1FV09VTERCTE9DSzsKKyAgICBpZiAobUxpdmVTZXNzaW9uICE9IE5VTEwpIHsKKyAgICAgICAgZXJyID0gbUxpdmVTZXNzaW9uLT5nZXRTdHJlYW1Gb3JtYXRNZXRhKAorICAgICAgICAgICAgICAgIGF1ZGlvID8gTGl2ZVNlc3Npb246OlNUUkVBTVRZUEVfQVVESU8KKyAgICAgICAgICAgICAgICAgICAgICA6IExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX1ZJREVPLAorICAgICAgICAgICAgICAgICZtZXRhKTsKKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gZm9ybWF0OworICAgIGlmIChlcnIgPT0gLUVXT1VMREJMT0NLKSB7CisgICAgICAgIGZvcm1hdCA9IG5ldyBBTWVzc2FnZSgpOworICAgICAgICBmb3JtYXQtPnNldEludDMyKCJlcnIiLCBlcnIpOworICAgICAgICByZXR1cm4gZm9ybWF0OworICAgIH0KKworICAgIGlmIChlcnIgIT0gT0sgfHwgY29udmVydE1ldGFEYXRhVG9NZXNzYWdlKG1ldGEsICZmb3JtYXQpICE9IE9LKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gZm9ybWF0OworfQorCitzdGF0dXNfdCBOdVBsYXllcjI6OkhUVFBMaXZlU291cmNlOjpmZWVkTW9yZVRTRGF0YSgpIHsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE51UGxheWVyMjo6SFRUUExpdmVTb3VyY2U6OmRlcXVldWVBY2Nlc3NVbml0KAorICAgICAgICBib29sIGF1ZGlvLCBzcDxBQnVmZmVyPiAqYWNjZXNzVW5pdCkgeworICAgIHJldHVybiBtTGl2ZVNlc3Npb24tPmRlcXVldWVBY2Nlc3NVbml0KAorICAgICAgICAgICAgYXVkaW8gPyBMaXZlU2Vzc2lvbjo6U1RSRUFNVFlQRV9BVURJTworICAgICAgICAgICAgICAgICAgOiBMaXZlU2Vzc2lvbjo6U1RSRUFNVFlQRV9WSURFTywKKyAgICAgICAgICAgIGFjY2Vzc1VuaXQpOworfQorCitzdGF0dXNfdCBOdVBsYXllcjI6OkhUVFBMaXZlU291cmNlOjpnZXREdXJhdGlvbihpbnQ2NF90ICpkdXJhdGlvblVzKSB7CisgICAgcmV0dXJuIG1MaXZlU2Vzc2lvbi0+Z2V0RHVyYXRpb24oZHVyYXRpb25Vcyk7Cit9CisKK3NpemVfdCBOdVBsYXllcjI6OkhUVFBMaXZlU291cmNlOjpnZXRUcmFja0NvdW50KCkgY29uc3QgeworICAgIHJldHVybiBtTGl2ZVNlc3Npb24tPmdldFRyYWNrQ291bnQoKTsKK30KKworc3A8QU1lc3NhZ2U+IE51UGxheWVyMjo6SFRUUExpdmVTb3VyY2U6OmdldFRyYWNrSW5mbyhzaXplX3QgdHJhY2tJbmRleCkgY29uc3QgeworICAgIHJldHVybiBtTGl2ZVNlc3Npb24tPmdldFRyYWNrSW5mbyh0cmFja0luZGV4KTsKK30KKworc3NpemVfdCBOdVBsYXllcjI6OkhUVFBMaXZlU291cmNlOjpnZXRTZWxlY3RlZFRyYWNrKG1lZGlhX3RyYWNrX3R5cGUgdHlwZSkgY29uc3QgeworICAgIGlmIChtTGl2ZVNlc3Npb24gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfSBlbHNlIGlmICh0eXBlID09IE1FRElBX1RSQUNLX1RZUEVfTUVUQURBVEEpIHsKKyAgICAgICAgLy8gTUVESUFfVFJBQ0tfVFlQRV9NRVRBREFUQSBpcyBhbHdheXMgbGFzdCB0cmFjaworICAgICAgICAvLyBtTWV0YWRhdGFTZWxlY3RlZCBjYW4gb25seSBiZSB0cnVlIHdoZW4gbUhhc01ldGFkYXRhIGlzIHRydWUKKyAgICAgICAgcmV0dXJuIG1NZXRhZGF0YVNlbGVjdGVkID8gKG1MaXZlU2Vzc2lvbi0+Z2V0VHJhY2tDb3VudCgpIC0gMSkgOiAtMTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbUxpdmVTZXNzaW9uLT5nZXRTZWxlY3RlZFRyYWNrKHR5cGUpOworICAgIH0KK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpIVFRQTGl2ZVNvdXJjZTo6c2VsZWN0VHJhY2soc2l6ZV90IHRyYWNrSW5kZXgsIGJvb2wgc2VsZWN0LCBpbnQ2NF90IC8qdGltZVVzKi8pIHsKKyAgICBpZiAobUxpdmVTZXNzaW9uID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IElOVkFMSURfT1BFUkFUSU9OOworICAgIGJvb2wgcG9zdEZldGNoTXNnID0gZmFsc2UsIGlzU3ViID0gZmFsc2U7CisgICAgaWYgKCFtSGFzTWV0YWRhdGEgfHwgdHJhY2tJbmRleCAhPSBtTGl2ZVNlc3Npb24tPmdldFRyYWNrQ291bnQoKSAtIDEpIHsKKyAgICAgICAgZXJyID0gbUxpdmVTZXNzaW9uLT5zZWxlY3RUcmFjayh0cmFja0luZGV4LCBzZWxlY3QpOworICAgICAgICBwb3N0RmV0Y2hNc2cgPSBzZWxlY3Q7CisgICAgICAgIGlzU3ViID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBtZXRhZGF0YSB0cmFjazsgaS5lLiAobUhhc01ldGFkYXRhICYmIHRyYWNrSW5kZXggPT0gbUxpdmVTZXNzaW9uLT5nZXRUcmFja0NvdW50KCkgLSAxKQorICAgICAgICBpZiAobU1ldGFkYXRhU2VsZWN0ZWQgJiYgIXNlbGVjdCkgeworICAgICAgICAgICAgZXJyID0gT0s7CisgICAgICAgIH0gZWxzZSBpZiAoIW1NZXRhZGF0YVNlbGVjdGVkICYmIHNlbGVjdCkgeworICAgICAgICAgICAgcG9zdEZldGNoTXNnID0gdHJ1ZTsKKyAgICAgICAgICAgIGVyciA9IE9LOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZXJyID0gQkFEX1ZBTFVFOyAvLyBiZWhhdmUgYXMgTGl2ZVNlc3Npb246OnNlbGVjdFRyYWNrCisgICAgICAgIH0KKworICAgICAgICBtTWV0YWRhdGFTZWxlY3RlZCA9IHNlbGVjdDsKKyAgICB9CisKKyAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgIGludDMyX3QgJmdlbmVyYXRpb24gPSBpc1N1YiA/IG1GZXRjaFN1YnRpdGxlRGF0YUdlbmVyYXRpb24gOiBtRmV0Y2hNZXRhRGF0YUdlbmVyYXRpb247CisgICAgICAgIGdlbmVyYXRpb24rKzsKKyAgICAgICAgaWYgKHBvc3RGZXRjaE1zZykgeworICAgICAgICAgICAgaW50MzJfdCB3aGF0ID0gaXNTdWIgPyBrV2hhdEZldGNoU3VidGl0bGVEYXRhIDoga1doYXRGZXRjaE1ldGFEYXRhOworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZSh3aGF0LCB0aGlzKTsKKyAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBnZW5lcmF0aW9uKTsKKyAgICAgICAgICAgIG1zZy0+cG9zdCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gTGl2ZVNlc3Npb246OnNlbGVjdFRyYWNrIHJldHVybnMgQkFEX1ZBTFVFIHdoZW4gc2VsZWN0aW5nIHRoZSBjdXJyZW50bHkKKyAgICAvLyBzZWxlY3RlZCB0cmFjaywgb3IgdW5zZWxlY3RpbmcgYSBub24tc2VsZWN0ZWQgdHJhY2suIEluIHRoaXMgY2FzZSBpdCdzIGFuCisgICAgLy8gbm8tb3Agc28gd2UgcmV0dXJuIE9LLgorICAgIHJldHVybiAoZXJyID09IE9LIHx8IGVyciA9PSBCQURfVkFMVUUpID8gKHN0YXR1c190KU9LIDogZXJyOworfQorCitzdGF0dXNfdCBOdVBsYXllcjI6OkhUVFBMaXZlU291cmNlOjpzZWVrVG8oaW50NjRfdCBzZWVrVGltZVVzLCBNZWRpYVBsYXllcjJTZWVrTW9kZSBtb2RlKSB7CisgICAgaWYgKG1MaXZlU2Vzc2lvbi0+aXNTZWVrYWJsZSgpKSB7CisgICAgICAgIHJldHVybiBtTGl2ZVNlc3Npb24tPnNlZWtUbyhzZWVrVGltZVVzLCBtb2RlKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorfQorCit2b2lkIE51UGxheWVyMjo6SFRUUExpdmVTb3VyY2U6OnBvbGxGb3JSYXdEYXRhKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZywgaW50MzJfdCBjdXJyZW50R2VuZXJhdGlvbiwKKyAgICAgICAgTGl2ZVNlc3Npb246OlN0cmVhbVR5cGUgZmV0Y2hUeXBlLCBpbnQzMl90IHB1c2hXaGF0KSB7CisKKyAgICBpbnQzMl90IGdlbmVyYXRpb247CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmZ2VuZXJhdGlvbikpOworCisgICAgaWYgKGdlbmVyYXRpb24gIT0gY3VycmVudEdlbmVyYXRpb24pIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNwPEFCdWZmZXI+IGJ1ZmZlcjsKKyAgICB3aGlsZSAobUxpdmVTZXNzaW9uLT5kZXF1ZXVlQWNjZXNzVW5pdChmZXRjaFR5cGUsICZidWZmZXIpID09IE9LKSB7CisKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IGR1cE5vdGlmeSgpOworICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgcHVzaFdoYXQpOworICAgICAgICBub3RpZnktPnNldEJ1ZmZlcigiYnVmZmVyIiwgYnVmZmVyKTsKKworICAgICAgICBpbnQ2NF90IHRpbWVVcywgYmFzZVVzLCBkZWxheVVzOworICAgICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJiYXNlVXMiLCAmYmFzZVVzKSk7CisgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKKyAgICAgICAgZGVsYXlVcyA9IGJhc2VVcyArIHRpbWVVcyAtIEFMb29wZXI6OkdldE5vd1VzKCk7CisKKyAgICAgICAgaWYgKGZldGNoVHlwZSA9PSBMaXZlU2Vzc2lvbjo6U1RSRUFNVFlQRV9TVUJUSVRMRVMpIHsKKyAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOworICAgICAgICAgICAgbXNnLT5wb3N0KGRlbGF5VXMgPiAwbGwgPyBkZWxheVVzIDogMGxsKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmIChmZXRjaFR5cGUgPT0gTGl2ZVNlc3Npb246OlNUUkVBTVRZUEVfTUVUQURBVEEpIHsKKyAgICAgICAgICAgIGlmIChkZWxheVVzIDwgLTEwMDAwMDBsbCkgeyAvLyAxIHNlY29uZAorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgICAgICAgICAvLyBwdXNoIGFsbCBjdXJyZW50bHkgYXZhaWxhYmxlIG1ldGFkYXRhIGJ1ZmZlcnMgaW4gZWFjaCBpbnZvY2F0aW9uIG9mIHBvbGxGb3JSYXdEYXRhCisgICAgICAgICAgICAvLyBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFRSRVNQQVNTKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyB0cnkgYWdhaW4gaW4gMSBzZWNvbmQKKyAgICBtc2ctPnBvc3QoMTAwMDAwMGxsKTsKK30KKwordm9pZCBOdVBsYXllcjI6OkhUVFBMaXZlU291cmNlOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgY2FzZSBrV2hhdFNlc3Npb25Ob3RpZnk6CisgICAgICAgIHsKKyAgICAgICAgICAgIG9uU2Vzc2lvbk5vdGlmeShtc2cpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0RmV0Y2hTdWJ0aXRsZURhdGE6CisgICAgICAgIHsKKyAgICAgICAgICAgIHBvbGxGb3JSYXdEYXRhKAorICAgICAgICAgICAgICAgICAgICBtc2csIG1GZXRjaFN1YnRpdGxlRGF0YUdlbmVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgIC8qIGZldGNoICovIExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX1NVQlRJVExFUywKKyAgICAgICAgICAgICAgICAgICAgLyogcHVzaCAqLyBrV2hhdFN1YnRpdGxlRGF0YSk7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdEZldGNoTWV0YURhdGE6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghbU1ldGFkYXRhU2VsZWN0ZWQpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcG9sbEZvclJhd0RhdGEoCisgICAgICAgICAgICAgICAgICAgIG1zZywgbUZldGNoTWV0YURhdGFHZW5lcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAvKiBmZXRjaCAqLyBMaXZlU2Vzc2lvbjo6U1RSRUFNVFlQRV9NRVRBREFUQSwKKyAgICAgICAgICAgICAgICAgICAgLyogcHVzaCAqLyBrV2hhdFRpbWVkTWV0YURhdGEpOworCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBTb3VyY2U6Om9uTWVzc2FnZVJlY2VpdmVkKG1zZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpIVFRQTGl2ZVNvdXJjZTo6b25TZXNzaW9uTm90aWZ5KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgaW50MzJfdCB3aGF0OworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ3aGF0IiwgJndoYXQpKTsKKworICAgIHN3aXRjaCAod2hhdCkgeworICAgICAgICBjYXNlIExpdmVTZXNzaW9uOjprV2hhdFByZXBhcmVkOgorICAgICAgICB7CisgICAgICAgICAgICAvLyBub3RpZnkgdGhlIGN1cnJlbnQgc2l6ZSBoZXJlIGlmIHdlIGhhdmUgaXQsIG90aGVyd2lzZSByZXBvcnQgYW4gaW5pdGlhbCBzaXplIG9mICgwLDApCisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gZm9ybWF0ID0gZ2V0Rm9ybWF0KGZhbHNlIC8qIGF1ZGlvICovKTsKKyAgICAgICAgICAgIGludDMyX3Qgd2lkdGg7CisgICAgICAgICAgICBpbnQzMl90IGhlaWdodDsKKyAgICAgICAgICAgIGlmIChmb3JtYXQgIT0gTlVMTCAmJgorICAgICAgICAgICAgICAgICAgICBmb3JtYXQtPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpICYmIGZvcm1hdC0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSkgeworICAgICAgICAgICAgICAgIG5vdGlmeVZpZGVvU2l6ZUNoYW5nZWQoZm9ybWF0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbm90aWZ5VmlkZW9TaXplQ2hhbmdlZCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgICAgICAgICBpZiAobUxpdmVTZXNzaW9uLT5pc1NlZWthYmxlKCkpIHsKKyAgICAgICAgICAgICAgICBmbGFncyB8PSBGTEFHX0NBTl9QQVVTRTsKKyAgICAgICAgICAgICAgICBmbGFncyB8PSBGTEFHX0NBTl9TRUVLOworICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZMQUdfQ0FOX1NFRUtfQkFDS1dBUkQ7CisgICAgICAgICAgICAgICAgZmxhZ3MgfD0gRkxBR19DQU5fU0VFS19GT1JXQVJEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobUxpdmVTZXNzaW9uLT5oYXNEeW5hbWljRHVyYXRpb24oKSkgeworICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZMQUdfRFlOQU1JQ19EVVJBVElPTjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbm90aWZ5RmxhZ3NDaGFuZ2VkKGZsYWdzKTsKKworICAgICAgICAgICAgbm90aWZ5UHJlcGFyZWQoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBMaXZlU2Vzc2lvbjo6a1doYXRQcmVwYXJhdGlvbkZhaWxlZDoKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzX3QgZXJyOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKKworICAgICAgICAgICAgbm90aWZ5UHJlcGFyZWQoZXJyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBMaXZlU2Vzc2lvbjo6a1doYXRTdHJlYW1zQ2hhbmdlZDoKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgY2hhbmdlZE1hc2s7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigKKyAgICAgICAgICAgICAgICAgICAgICAgICJjaGFuZ2VkTWFzayIsIChpbnQzMl90ICopJmNoYW5nZWRNYXNrKSk7CisKKyAgICAgICAgICAgIGJvb2wgYXVkaW8gPSBjaGFuZ2VkTWFzayAmIExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX0FVRElPOworICAgICAgICAgICAgYm9vbCB2aWRlbyA9IGNoYW5nZWRNYXNrICYgTGl2ZVNlc3Npb246OlNUUkVBTVRZUEVfVklERU87CisKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoInJlcGx5IiwgJnJlcGx5KSk7CisKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBkdXBOb3RpZnkoKTsKKyAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFF1ZXVlRGVjb2RlclNodXRkb3duKTsKKyAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImF1ZGlvIiwgYXVkaW8pOworICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigidmlkZW8iLCB2aWRlbyk7CisgICAgICAgICAgICBub3RpZnktPnNldE1lc3NhZ2UoInJlcGx5IiwgcmVwbHkpOworICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgTGl2ZVNlc3Npb246OmtXaGF0QnVmZmVyaW5nU3RhcnQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBkdXBOb3RpZnkoKTsKKyAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFBhdXNlT25CdWZmZXJpbmdTdGFydCk7CisgICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBMaXZlU2Vzc2lvbjo6a1doYXRCdWZmZXJpbmdFbmQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBkdXBOb3RpZnkoKTsKKyAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFJlc3VtZU9uQnVmZmVyaW5nRW5kKTsKKyAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworCisgICAgICAgIGNhc2UgTGl2ZVNlc3Npb246OmtXaGF0QnVmZmVyaW5nVXBkYXRlOgorICAgICAgICB7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gZHVwTm90aWZ5KCk7CisgICAgICAgICAgICBpbnQzMl90IHBlcmNlbnRhZ2U7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicGVyY2VudGFnZSIsICZwZXJjZW50YWdlKSk7CisgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRCdWZmZXJpbmdVcGRhdGUpOworICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigicGVyY2VudGFnZSIsIHBlcmNlbnRhZ2UpOworICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgTGl2ZVNlc3Npb246OmtXaGF0TWV0YWRhdGFEZXRlY3RlZDoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFtSGFzTWV0YWRhdGEpIHsKKyAgICAgICAgICAgICAgICBtSGFzTWV0YWRhdGEgPSB0cnVlOworCisgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IGR1cE5vdGlmeSgpOworICAgICAgICAgICAgICAgIC8vIG5vdGlmaWNhdGlvbiB3aXRob3V0IGJ1ZmZlciB0cmlnZ2VycyBNRURJQTJfSU5GT19NRVRBREFUQV9VUERBVEUKKyAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRUaW1lZE1ldGFEYXRhKTsKKyAgICAgICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBMaXZlU2Vzc2lvbjo6a1doYXRFcnJvcjoKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgVFJFU1BBU1MoKTsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL251cGxheWVyMi9IVFRQTGl2ZVNvdXJjZS5oIGIvbWVkaWEvbGlibWVkaWEvbnVwbGF5ZXIyL0hUVFBMaXZlU291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I2YTMxMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL251cGxheWVyMi9IVFRQTGl2ZVNvdXJjZS5oCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSFRUUF9MSVZFX1NPVVJDRV9IXworCisjZGVmaW5lIEhUVFBfTElWRV9TT1VSQ0VfSF8KKworI2luY2x1ZGUgIk51UGxheWVyMi5oIgorI2luY2x1ZGUgIk51UGxheWVyMlNvdXJjZS5oIgorCisjaW5jbHVkZSAiTGl2ZVNlc3Npb24uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgTGl2ZVNlc3Npb247CisKK3N0cnVjdCBOdVBsYXllcjI6OkhUVFBMaXZlU291cmNlIDogcHVibGljIE51UGxheWVyMjo6U291cmNlIHsKKyAgICBIVFRQTGl2ZVNvdXJjZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLAorICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRCdWZmZXJpbmdTZXR0aW5ncygKKyAgICAgICAgICAgIEJ1ZmZlcmluZ1NldHRpbmdzKiBidWZmZXJpbmcgLyogbm9ubnVsbCAqLykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRCdWZmZXJpbmdTZXR0aW5ncyhjb25zdCBCdWZmZXJpbmdTZXR0aW5ncyYgYnVmZmVyaW5nKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgdm9pZCBwcmVwYXJlQXN5bmMoKTsKKyAgICB2aXJ0dWFsIHZvaWQgc3RhcnQoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVxdWV1ZUFjY2Vzc1VuaXQoYm9vbCBhdWRpbywgc3A8QUJ1ZmZlcj4gKmFjY2Vzc1VuaXQpOworICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdE1ldGEoYm9vbCBhdWRpbyk7CisgICAgdmlydHVhbCBzcDxBTWVzc2FnZT4gZ2V0Rm9ybWF0KGJvb2wgYXVkaW8pOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBmZWVkTW9yZVRTRGF0YSgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RHVyYXRpb24oaW50NjRfdCAqZHVyYXRpb25Vcyk7CisgICAgdmlydHVhbCBzaXplX3QgZ2V0VHJhY2tDb3VudCgpIGNvbnN0OworICAgIHZpcnR1YWwgc3A8QU1lc3NhZ2U+IGdldFRyYWNrSW5mbyhzaXplX3QgdHJhY2tJbmRleCkgY29uc3Q7CisgICAgdmlydHVhbCBzc2l6ZV90IGdldFNlbGVjdGVkVHJhY2sobWVkaWFfdHJhY2tfdHlwZSAvKiB0eXBlICovKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNlbGVjdFRyYWNrKHNpemVfdCB0cmFja0luZGV4LCBib29sIHNlbGVjdCwgaW50NjRfdCB0aW1lVXMpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2Vla1RvKAorICAgICAgICAgICAgaW50NjRfdCBzZWVrVGltZVVzLAorICAgICAgICAgICAgTWVkaWFQbGF5ZXIyU2Vla01vZGUgbW9kZSA9IE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkMpIG92ZXJyaWRlOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+SFRUUExpdmVTb3VyY2UoKTsKKworICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisKK3ByaXZhdGU6CisgICAgZW51bSBGbGFncyB7CisgICAgICAgIC8vIERvbid0IGxvZyBhbnkgVVJMcy4KKyAgICAgICAga0ZsYWdJbmNvZ25pdG8gPSAxLAorICAgIH07CisKKyAgICBlbnVtIHsKKyAgICAgICAga1doYXRTZXNzaW9uTm90aWZ5LAorICAgICAgICBrV2hhdEZldGNoU3VidGl0bGVEYXRhLAorICAgICAgICBrV2hhdEZldGNoTWV0YURhdGEsCisgICAgfTsKKworICAgIHNwPE1lZGlhSFRUUFNlcnZpY2U+IG1IVFRQU2VydmljZTsKKyAgICBBU3RyaW5nIG1VUkw7CisgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbUV4dHJhSGVhZGVyczsKKyAgICB1aW50MzJfdCBtRmxhZ3M7CisgICAgc3RhdHVzX3QgbUZpbmFsUmVzdWx0OworICAgIG9mZjY0X3QgbU9mZnNldDsKKyAgICBzcDxBTG9vcGVyPiBtTGl2ZUxvb3BlcjsKKyAgICBzcDxMaXZlU2Vzc2lvbj4gbUxpdmVTZXNzaW9uOworICAgIGludDMyX3QgbUZldGNoU3VidGl0bGVEYXRhR2VuZXJhdGlvbjsKKyAgICBpbnQzMl90IG1GZXRjaE1ldGFEYXRhR2VuZXJhdGlvbjsKKyAgICBib29sIG1IYXNNZXRhZGF0YTsKKyAgICBib29sIG1NZXRhZGF0YVNlbGVjdGVkOworICAgIEJ1ZmZlcmluZ1NldHRpbmdzIG1CdWZmZXJpbmdTZXR0aW5nczsKKworICAgIHZvaWQgb25TZXNzaW9uTm90aWZ5KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2b2lkIHBvbGxGb3JSYXdEYXRhKAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2csIGludDMyX3QgY3VycmVudEdlbmVyYXRpb24sCisgICAgICAgICAgICBMaXZlU2Vzc2lvbjo6U3RyZWFtVHlwZSBmZXRjaFR5cGUsIGludDMyX3QgcHVzaFdoYXQpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSFRUUExpdmVTb3VyY2UpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBIVFRQX0xJVkVfU09VUkNFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9udXBsYXllcjIvSldha2VMb2NrLmNwcCBiL21lZGlhL2xpYm1lZGlhL251cGxheWVyMi9KV2FrZUxvY2suY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5YTEwNzEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9udXBsYXllcjIvSldha2VMb2NrLmNwcApAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJKV2FrZUxvY2siCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJKV2FrZUxvY2suaCIKKworI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPHBvd2VybWFuYWdlci9Qb3dlck1hbmFnZXIuaD4KKworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vVE9ETzogdXNlIEpBVkEgUG93ZXJNYW5hZ2VyLCBpbnN0ZWFkIG9mIGJpbmRlcgorSldha2VMb2NrOjpKV2FrZUxvY2soKSA6CisgICAgbVBvd2VyTWFuYWdlcihOVUxMKSwKKyAgICBtV2FrZUxvY2tUb2tlbihOVUxMKSwKKyAgICBtV2FrZUxvY2tDb3VudCgwKSwKKyAgICBtRGVhdGhSZWNpcGllbnQobmV3IFBNRGVhdGhSZWNpcGllbnQodGhpcykpIHt9CisKK0pXYWtlTG9jazo6fkpXYWtlTG9jaygpIHsKKyAgICBpZiAobVBvd2VyTWFuYWdlciAhPSBOVUxMKSB7CisgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IElJbnRlcmZhY2U6OmFzQmluZGVyKG1Qb3dlck1hbmFnZXIpOworICAgICAgICBiaW5kZXItPnVubGlua1RvRGVhdGgobURlYXRoUmVjaXBpZW50KTsKKyAgICB9CisgICAgY2xlYXJQb3dlck1hbmFnZXIoKTsKK30KKworYm9vbCBKV2FrZUxvY2s6OmFjcXVpcmUoKSB7CisgICAgaWYgKG1XYWtlTG9ja0NvdW50ID09IDApIHsKKyAgICAgICAgQ0hFQ0sobVdha2VMb2NrVG9rZW4gPT0gTlVMTCk7CisgICAgICAgIGlmIChtUG93ZXJNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgICAgIC8vIHVzZSBjaGVja1NlcnZpY2UoKSB0byBhdm9pZCBibG9ja2luZyBpZiBwb3dlciBzZXJ2aWNlIGlzIG5vdCB1cCB5ZXQKKyAgICAgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9CisgICAgICAgICAgICAgICAgZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCktPmNoZWNrU2VydmljZShTdHJpbmcxNigicG93ZXIiKSk7CisgICAgICAgICAgICBpZiAoYmluZGVyID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiY291bGQgbm90IGdldCB0aGUgcG93ZXIgbWFuYWdlciBzZXJ2aWNlIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1Qb3dlck1hbmFnZXIgPSBpbnRlcmZhY2VfY2FzdDxJUG93ZXJNYW5hZ2VyPihiaW5kZXIpOworICAgICAgICAgICAgICAgIGJpbmRlci0+bGlua1RvRGVhdGgobURlYXRoUmVjaXBpZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobVBvd2VyTWFuYWdlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBuZXcgQkJpbmRlcigpOworICAgICAgICAgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtUG93ZXJNYW5hZ2VyLT5hY3F1aXJlV2FrZUxvY2soCisgICAgICAgICAgICAgICAgICAgIFBPV0VSTUFOQUdFUl9QQVJUSUFMX1dBS0VfTE9DSywKKyAgICAgICAgICAgICAgICAgICAgYmluZGVyLCBTdHJpbmcxNigiSldha2VMb2NrIiksIFN0cmluZzE2KCJtZWRpYSIpKTsKKyAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIG1XYWtlTG9ja1Rva2VuID0gYmluZGVyOworICAgICAgICAgICAgICAgIG1XYWtlTG9ja0NvdW50Kys7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBtV2FrZUxvY2tDb3VudCsrOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIEpXYWtlTG9jazo6cmVsZWFzZShib29sIGZvcmNlKSB7CisgICAgaWYgKG1XYWtlTG9ja0NvdW50ID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoZm9yY2UpIHsKKyAgICAgICAgLy8gRm9yY2Ugd2FrZWxvY2sgcmVsZWFzZSBiZWxvdyBieSBzZXR0aW5nIHJlZmVyZW5jZSBjb3VudCB0byAxLgorICAgICAgICBtV2FrZUxvY2tDb3VudCA9IDE7CisgICAgfQorICAgIGlmICgtLW1XYWtlTG9ja0NvdW50ID09IDApIHsKKyAgICAgICAgQ0hFQ0sobVdha2VMb2NrVG9rZW4gIT0gTlVMTCk7CisgICAgICAgIGlmIChtUG93ZXJNYW5hZ2VyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOworICAgICAgICAgICAgbVBvd2VyTWFuYWdlci0+cmVsZWFzZVdha2VMb2NrKG1XYWtlTG9ja1Rva2VuLCAwIC8qIGZsYWdzICovKTsKKyAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOworICAgICAgICB9CisgICAgICAgIG1XYWtlTG9ja1Rva2VuLmNsZWFyKCk7CisgICAgfQorfQorCit2b2lkIEpXYWtlTG9jazo6Y2xlYXJQb3dlck1hbmFnZXIoKSB7CisgICAgcmVsZWFzZSh0cnVlKTsKKyAgICBtUG93ZXJNYW5hZ2VyLmNsZWFyKCk7Cit9CisKK3ZvaWQgSldha2VMb2NrOjpQTURlYXRoUmVjaXBpZW50OjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8gX191bnVzZWQpIHsKKyAgICBpZiAobVdha2VMb2NrICE9IE5VTEwpIHsKKyAgICAgICAgbVdha2VMb2NrLT5jbGVhclBvd2VyTWFuYWdlcigpOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL251cGxheWVyMi9KV2FrZUxvY2suaCBiL21lZGlhL2xpYm1lZGlhL251cGxheWVyMi9KV2FrZUxvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWNlODdlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvbnVwbGF5ZXIyL0pXYWtlTG9jay5oCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSl9XQUtFTE9DS19IXworI2RlZmluZSBKX1dBS0VMT0NLX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisjaW5jbHVkZSA8cG93ZXJtYW5hZ2VyL0lQb3dlck1hbmFnZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgSldha2VMb2NrIDogcHVibGljIFJlZkJhc2UgeworCitwdWJsaWM6CisgICAgSldha2VMb2NrKCk7CisKKyAgICAvLyBOT1RFOiBhY3F1aXJlIGFuZCByZWxlYXNlIGFyZSBub3QgdGhyZWFkIHNhZmUKKworICAgIC8vIHJldHVybnMgdHJ1ZSBpZiB3YWtlbG9jayB3YXMgYWNxdWlyZWQKKyAgICBib29sIGFjcXVpcmUoKTsKKyAgICB2b2lkIHJlbGVhc2UoYm9vbCBmb3JjZSA9IGZhbHNlKTsKKworICAgIHZpcnR1YWwgfkpXYWtlTG9jaygpOworCitwcml2YXRlOgorICAgIHNwPElQb3dlck1hbmFnZXI+IG1Qb3dlck1hbmFnZXI7CisgICAgc3A8SUJpbmRlcj4gICAgICAgbVdha2VMb2NrVG9rZW47CisgICAgdWludDMyX3QgICAgICAgICAgbVdha2VMb2NrQ291bnQ7CisKKyAgICBjbGFzcyBQTURlYXRoUmVjaXBpZW50IDogcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50IHsKKyAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IFBNRGVhdGhSZWNpcGllbnQoSldha2VMb2NrICp3YWtlTG9jaykgOiBtV2FrZUxvY2sod2FrZUxvY2spIHt9CisgICAgICAgIHZpcnR1YWwgflBNRGVhdGhSZWNpcGllbnQoKSB7fQorCisgICAgICAgIC8vIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50CisgICAgICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+ICZ3aG8pOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgUE1EZWF0aFJlY2lwaWVudChjb25zdCBQTURlYXRoUmVjaXBpZW50Jik7CisgICAgICAgIFBNRGVhdGhSZWNpcGllbnQmIG9wZXJhdG9yPSAoY29uc3QgUE1EZWF0aFJlY2lwaWVudCYpOworCisgICAgICAgIEpXYWtlTG9jayAqbVdha2VMb2NrOworICAgIH07CisKKyAgICBjb25zdCBzcDxQTURlYXRoUmVjaXBpZW50PiBtRGVhdGhSZWNpcGllbnQ7CisKKyAgICB2b2lkIGNsZWFyUG93ZXJNYW5hZ2VyKCk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhKV2FrZUxvY2spOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBKX1dBS0VMT0NLX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL21lZGlhL2xpYm1lZGlhL251cGxheWVyMi9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpyZW5hbWUgdG8gbWVkaWEvbGlibWVkaWEvbnVwbGF5ZXIyL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9OT1RJQ0UgYi9tZWRpYS9saWJtZWRpYS9udXBsYXllcjIvTk9USUNFCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvTk9USUNFCnJlbmFtZSB0byBtZWRpYS9saWJtZWRpYS9udXBsYXllcjIvTk9USUNFCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9udXBsYXllcjIvTnVQbGF5ZXIyLmNwcCBiL21lZGlhL2xpYm1lZGlhL251cGxheWVyMi9OdVBsYXllcjIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NDUyMTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9udXBsYXllcjIvTnVQbGF5ZXIyLmNwcApAQCAtMCwwICsxLDI5OTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTnVQbGF5ZXIyIgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiTnVQbGF5ZXIyLmgiCisKKyNpbmNsdWRlICJIVFRQTGl2ZVNvdXJjZS5oIgorI2luY2x1ZGUgIk51UGxheWVyMkNDRGVjb2Rlci5oIgorI2luY2x1ZGUgIk51UGxheWVyMkRlY29kZXIuaCIKKyNpbmNsdWRlICJOdVBsYXllcjJEZWNvZGVyQmFzZS5oIgorI2luY2x1ZGUgIk51UGxheWVyMkRlY29kZXJQYXNzVGhyb3VnaC5oIgorI2luY2x1ZGUgIk51UGxheWVyMkRyaXZlci5oIgorI2luY2x1ZGUgIk51UGxheWVyMlJlbmRlcmVyLmgiCisjaW5jbHVkZSAiTnVQbGF5ZXIyU291cmNlLmgiCisjaW5jbHVkZSAiUlRTUFNvdXJjZS5oIgorI2luY2x1ZGUgIlN0cmVhbWluZ1NvdXJjZS5oIgorI2luY2x1ZGUgIkdlbmVyaWNTb3VyY2UuaCIKKyNpbmNsdWRlICJUZXh0RGVzY3JpcHRpb25zLmgiCisKKyNpbmNsdWRlICJBVFNQYXJzZXIuaCIKKworI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmg+CisjaW5jbHVkZSA8bWVkaWEvQVZTeW5jU2V0dGluZ3MuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrV3JhcHBlci5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9hdmNfdXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ2xvY2suaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisKKyNpbmNsdWRlICJFU0RTLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KKworI2luY2x1ZGUgPHN5c3RlbS93aW5kb3cuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0aWMgc3RhdHVzX3Qgc2VuZE1ldGFEYXRhVG9IYWwoc3A8TWVkaWFQbGF5ZXIyQmFzZTo6QXVkaW9TaW5rPiYgc2luaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4mIG1ldGEpIHsKKyAgICBpbnQzMl90IHNhbXBsZVJhdGUgPSAwOworICAgIGludDMyX3QgYml0UmF0ZSA9IDA7CisgICAgaW50MzJfdCBjaGFubmVsTWFzayA9IDA7CisgICAgaW50MzJfdCBkZWxheVNhbXBsZXMgPSAwOworICAgIGludDMyX3QgcGFkZGluZ1NhbXBsZXMgPSAwOworCisgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcigpOworCisgICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJnNhbXBsZVJhdGUpKSB7CisgICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEFVRElPX09GRkxPQURfQ09ERUNfU0FNUExFX1JBVEUpLCBzYW1wbGVSYXRlKTsKKyAgICB9CisgICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5Q2hhbm5lbE1hc2ssICZjaGFubmVsTWFzaykpIHsKKyAgICAgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQVVESU9fT0ZGTE9BRF9DT0RFQ19OVU1fQ0hBTk5FTCksIGNoYW5uZWxNYXNrKTsKKyAgICB9CisgICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5Qml0UmF0ZSwgJmJpdFJhdGUpKSB7CisgICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEFVRElPX09GRkxPQURfQ09ERUNfQVZHX0JJVF9SQVRFKSwgYml0UmF0ZSk7CisgICAgfQorICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUVuY29kZXJEZWxheSwgJmRlbGF5U2FtcGxlcykpIHsKKyAgICAgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQVVESU9fT0ZGTE9BRF9DT0RFQ19ERUxBWV9TQU1QTEVTKSwgZGVsYXlTYW1wbGVzKTsKKyAgICB9CisgICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5RW5jb2RlclBhZGRpbmcsICZwYWRkaW5nU2FtcGxlcykpIHsKKyAgICAgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQVVESU9fT0ZGTE9BRF9DT0RFQ19QQURESU5HX1NBTVBMRVMpLCBwYWRkaW5nU2FtcGxlcyk7CisgICAgfQorCisgICAgQUxPR1YoInNlbmRNZXRhRGF0YVRvSGFsOiBiaXRSYXRlICVkLCBzYW1wbGVSYXRlICVkLCBjaGFuTWFzayAlZCwiCisgICAgICAgICAgImRlbGF5U2FtcGxlICVkLCBwYWRkaW5nU2FtcGxlICVkIiwgYml0UmF0ZSwgc2FtcGxlUmF0ZSwKKyAgICAgICAgICBjaGFubmVsTWFzaywgZGVsYXlTYW1wbGVzLCBwYWRkaW5nU2FtcGxlcyk7CisKKyAgICBzaW5rLT5zZXRQYXJhbWV0ZXJzKHBhcmFtLnRvU3RyaW5nKCkpOworICAgIHJldHVybiBPSzsKK30KKworCitzdHJ1Y3QgTnVQbGF5ZXIyOjpBY3Rpb24gOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgQWN0aW9uKCkge30KKworICAgIHZpcnR1YWwgdm9pZCBleGVjdXRlKE51UGxheWVyMiAqcGxheWVyKSA9IDA7CisKK3ByaXZhdGU6CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQWN0aW9uKTsKK307CisKK3N0cnVjdCBOdVBsYXllcjI6OlNlZWtBY3Rpb24gOiBwdWJsaWMgQWN0aW9uIHsKKyAgICBleHBsaWNpdCBTZWVrQWN0aW9uKGludDY0X3Qgc2Vla1RpbWVVcywgTWVkaWFQbGF5ZXIyU2Vla01vZGUgbW9kZSkKKyAgICAgICAgOiBtU2Vla1RpbWVVcyhzZWVrVGltZVVzKSwKKyAgICAgICAgICBtTW9kZShtb2RlKSB7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIGV4ZWN1dGUoTnVQbGF5ZXIyICpwbGF5ZXIpIHsKKyAgICAgICAgcGxheWVyLT5wZXJmb3JtU2VlayhtU2Vla1RpbWVVcywgbU1vZGUpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBpbnQ2NF90IG1TZWVrVGltZVVzOworICAgIE1lZGlhUGxheWVyMlNlZWtNb2RlIG1Nb2RlOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU2Vla0FjdGlvbik7Cit9OworCitzdHJ1Y3QgTnVQbGF5ZXIyOjpSZXN1bWVEZWNvZGVyQWN0aW9uIDogcHVibGljIEFjdGlvbiB7CisgICAgZXhwbGljaXQgUmVzdW1lRGVjb2RlckFjdGlvbihib29sIG5lZWROb3RpZnkpCisgICAgICAgIDogbU5lZWROb3RpZnkobmVlZE5vdGlmeSkgeworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBleGVjdXRlKE51UGxheWVyMiAqcGxheWVyKSB7CisgICAgICAgIHBsYXllci0+cGVyZm9ybVJlc3VtZURlY29kZXJzKG1OZWVkTm90aWZ5KTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgYm9vbCBtTmVlZE5vdGlmeTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFJlc3VtZURlY29kZXJBY3Rpb24pOworfTsKKworc3RydWN0IE51UGxheWVyMjo6U2V0U3VyZmFjZUFjdGlvbiA6IHB1YmxpYyBBY3Rpb24geworICAgIGV4cGxpY2l0IFNldFN1cmZhY2VBY3Rpb24oY29uc3Qgc3A8QU5hdGl2ZVdpbmRvd1dyYXBwZXI+ICZud3cpCisgICAgICAgIDogbU5hdGl2ZVdpbmRvdyhud3cpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgZXhlY3V0ZShOdVBsYXllcjIgKnBsYXllcikgeworICAgICAgICBwbGF5ZXItPnBlcmZvcm1TZXRTdXJmYWNlKG1OYXRpdmVXaW5kb3cpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzcDxBTmF0aXZlV2luZG93V3JhcHBlcj4gbU5hdGl2ZVdpbmRvdzsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNldFN1cmZhY2VBY3Rpb24pOworfTsKKworc3RydWN0IE51UGxheWVyMjo6Rmx1c2hEZWNvZGVyQWN0aW9uIDogcHVibGljIEFjdGlvbiB7CisgICAgRmx1c2hEZWNvZGVyQWN0aW9uKEZsdXNoQ29tbWFuZCBhdWRpbywgRmx1c2hDb21tYW5kIHZpZGVvKQorICAgICAgICA6IG1BdWRpbyhhdWRpbyksCisgICAgICAgICAgbVZpZGVvKHZpZGVvKSB7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIGV4ZWN1dGUoTnVQbGF5ZXIyICpwbGF5ZXIpIHsKKyAgICAgICAgcGxheWVyLT5wZXJmb3JtRGVjb2RlckZsdXNoKG1BdWRpbywgbVZpZGVvKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgRmx1c2hDb21tYW5kIG1BdWRpbzsKKyAgICBGbHVzaENvbW1hbmQgbVZpZGVvOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRmx1c2hEZWNvZGVyQWN0aW9uKTsKK307CisKK3N0cnVjdCBOdVBsYXllcjI6OlBvc3RNZXNzYWdlQWN0aW9uIDogcHVibGljIEFjdGlvbiB7CisgICAgZXhwbGljaXQgUG9zdE1lc3NhZ2VBY3Rpb24oY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpCisgICAgICAgIDogbU1lc3NhZ2UobXNnKSB7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIGV4ZWN1dGUoTnVQbGF5ZXIyICopIHsKKyAgICAgICAgbU1lc3NhZ2UtPnBvc3QoKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3A8QU1lc3NhZ2U+IG1NZXNzYWdlOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUG9zdE1lc3NhZ2VBY3Rpb24pOworfTsKKworLy8gVXNlIHRoaXMgaWYgdGhlcmUncyBubyBzdGF0ZSBuZWNlc3NhcnkgdG8gc2F2ZSBpbiBvcmRlciB0byBleGVjdXRlCisvLyB0aGUgYWN0aW9uLgorc3RydWN0IE51UGxheWVyMjo6U2ltcGxlQWN0aW9uIDogcHVibGljIEFjdGlvbiB7CisgICAgdHlwZWRlZiB2b2lkIChOdVBsYXllcjI6OipBY3Rpb25GdW5jKSgpOworCisgICAgZXhwbGljaXQgU2ltcGxlQWN0aW9uKEFjdGlvbkZ1bmMgZnVuYykKKyAgICAgICAgOiBtRnVuYyhmdW5jKSB7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIGV4ZWN1dGUoTnVQbGF5ZXIyICpwbGF5ZXIpIHsKKyAgICAgICAgKHBsYXllci0+Km1GdW5jKSgpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBBY3Rpb25GdW5jIG1GdW5jOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU2ltcGxlQWN0aW9uKTsKK307CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK051UGxheWVyMjo6TnVQbGF5ZXIyKHBpZF90IHBpZCwgY29uc3Qgc3A8TWVkaWFDbG9jaz4gJm1lZGlhQ2xvY2spCisgICAgOiBtVUlEVmFsaWQoZmFsc2UpLAorICAgICAgbVBJRChwaWQpLAorICAgICAgbU1lZGlhQ2xvY2sobWVkaWFDbG9jayksCisgICAgICBtU291cmNlRmxhZ3MoMCksCisgICAgICBtT2ZmbG9hZEF1ZGlvKGZhbHNlKSwKKyAgICAgIG1BdWRpb0RlY29kZXJHZW5lcmF0aW9uKDApLAorICAgICAgbVZpZGVvRGVjb2RlckdlbmVyYXRpb24oMCksCisgICAgICBtUmVuZGVyZXJHZW5lcmF0aW9uKDApLAorICAgICAgbUxhc3RTdGFydGVkUGxheWluZ1RpbWVOcygwKSwKKyAgICAgIG1QcmV2aW91c1NlZWtUaW1lVXMoMCksCisgICAgICBtQXVkaW9FT1MoZmFsc2UpLAorICAgICAgbVZpZGVvRU9TKGZhbHNlKSwKKyAgICAgIG1TY2FuU291cmNlc1BlbmRpbmcoZmFsc2UpLAorICAgICAgbVNjYW5Tb3VyY2VzR2VuZXJhdGlvbigwKSwKKyAgICAgIG1Qb2xsRHVyYXRpb25HZW5lcmF0aW9uKDApLAorICAgICAgbVRpbWVkVGV4dEdlbmVyYXRpb24oMCksCisgICAgICBtRmx1c2hpbmdBdWRpbyhOT05FKSwKKyAgICAgIG1GbHVzaGluZ1ZpZGVvKE5PTkUpLAorICAgICAgbVJlc3VtZVBlbmRpbmcoZmFsc2UpLAorICAgICAgbVZpZGVvU2NhbGluZ01vZGUoTkFUSVZFX1dJTkRPV19TQ0FMSU5HX01PREVfU0NBTEVfVE9fV0lORE9XKSwKKyAgICAgIG1QbGF5YmFja1NldHRpbmdzKEFVRElPX1BMQVlCQUNLX1JBVEVfREVGQVVMVCksCisgICAgICBtVmlkZW9GcHNIaW50KC0xLmYpLAorICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAorICAgICAgbVByZXBhcmVkKGZhbHNlKSwKKyAgICAgIG1SZXNldHRpbmcoZmFsc2UpLAorICAgICAgbVNvdXJjZVN0YXJ0ZWQoZmFsc2UpLAorICAgICAgbUF1ZGlvRGVjb2RlckVycm9yKGZhbHNlKSwKKyAgICAgIG1WaWRlb0RlY29kZXJFcnJvcihmYWxzZSksCisgICAgICBtUGF1c2VkKGZhbHNlKSwKKyAgICAgIG1QYXVzZWRCeUNsaWVudCh0cnVlKSwKKyAgICAgIG1QYXVzZWRGb3JCdWZmZXJpbmcoZmFsc2UpLAorICAgICAgbUlzRHJtUHJvdGVjdGVkKGZhbHNlKSwKKyAgICAgIG1EYXRhU291cmNlVHlwZShEQVRBX1NPVVJDRV9UWVBFX05PTkUpIHsKKyAgICBDSEVDSyhtZWRpYUNsb2NrICE9IE5VTEwpOworICAgIGNsZWFyRmx1c2hDb21wbGV0ZSgpOworfQorCitOdVBsYXllcjI6On5OdVBsYXllcjIoKSB7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpzZXRVSUQodWlkX3QgdWlkKSB7CisgICAgbVVJRFZhbGlkID0gdHJ1ZTsKKyAgICBtVUlEID0gdWlkOworfQorCit2b2lkIE51UGxheWVyMjo6c2V0RHJpdmVyKGNvbnN0IHdwPE51UGxheWVyMkRyaXZlcj4gJmRyaXZlcikgeworICAgIG1Ecml2ZXIgPSBkcml2ZXI7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpzZXREYXRhU291cmNlQXN5bmMoY29uc3Qgc3A8SVN0cmVhbVNvdXJjZT4gJnNvdXJjZSkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXREYXRhU291cmNlLCB0aGlzKTsKKworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTb3VyY2VOb3RpZnksIHRoaXMpOworCisgICAgbXNnLT5zZXRPYmplY3QoInNvdXJjZSIsIG5ldyBTdHJlYW1pbmdTb3VyY2Uobm90aWZ5LCBzb3VyY2UpKTsKKyAgICBtc2ctPnBvc3QoKTsKKyAgICBtRGF0YVNvdXJjZVR5cGUgPSBEQVRBX1NPVVJDRV9UWVBFX1NUUkVBTTsKK30KKworc3RhdGljIGJvb2wgSXNIVFRQTGl2ZVVSTChjb25zdCBjaGFyICp1cmwpIHsKKyAgICBpZiAoIXN0cm5jYXNlY21wKCJodHRwOi8vIiwgdXJsLCA3KQorICAgICAgICAgICAgfHwgIXN0cm5jYXNlY21wKCJodHRwczovLyIsIHVybCwgOCkKKyAgICAgICAgICAgIHx8ICFzdHJuY2FzZWNtcCgiZmlsZTovLyIsIHVybCwgNykpIHsKKyAgICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbih1cmwpOworICAgICAgICBpZiAobGVuID49IDUgJiYgIXN0cmNhc2VjbXAoIi5tM3U4IiwgJnVybFtsZW4gLSA1XSkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN0cnN0cih1cmwsIm0zdTgiKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpzZXREYXRhU291cmNlQXN5bmMoCisgICAgICAgIGNvbnN0IHNwPE1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgY29uc3QgY2hhciAqdXJsLAorICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgeworCisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNldERhdGFTb3VyY2UsIHRoaXMpOworICAgIHNpemVfdCBsZW4gPSBzdHJsZW4odXJsKTsKKworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTb3VyY2VOb3RpZnksIHRoaXMpOworCisgICAgc3A8U291cmNlPiBzb3VyY2U7CisgICAgaWYgKElzSFRUUExpdmVVUkwodXJsKSkgeworICAgICAgICBzb3VyY2UgPSBuZXcgSFRUUExpdmVTb3VyY2Uobm90aWZ5LCBodHRwU2VydmljZSwgdXJsLCBoZWFkZXJzKTsKKyAgICAgICAgQUxPR1YoInNldERhdGFTb3VyY2VBc3luYyBIVFRQTGl2ZVNvdXJjZSAlcyIsIHVybCk7CisgICAgICAgIG1EYXRhU291cmNlVHlwZSA9IERBVEFfU09VUkNFX1RZUEVfSFRUUF9MSVZFOworICAgIH0gZWxzZSBpZiAoIXN0cm5jYXNlY21wKHVybCwgInJ0c3A6Ly8iLCA3KSkgeworICAgICAgICBzb3VyY2UgPSBuZXcgUlRTUFNvdXJjZSgKKyAgICAgICAgICAgICAgICBub3RpZnksIGh0dHBTZXJ2aWNlLCB1cmwsIGhlYWRlcnMsIG1VSURWYWxpZCwgbVVJRCk7CisgICAgICAgIEFMT0dWKCJzZXREYXRhU291cmNlQXN5bmMgUlRTUFNvdXJjZSAlcyIsIHVybCk7CisgICAgICAgIG1EYXRhU291cmNlVHlwZSA9IERBVEFfU09VUkNFX1RZUEVfUlRTUDsKKyAgICB9IGVsc2UgaWYgKCghc3RybmNhc2VjbXAodXJsLCAiaHR0cDovLyIsIDcpCisgICAgICAgICAgICAgICAgfHwgIXN0cm5jYXNlY21wKHVybCwgImh0dHBzOi8vIiwgOCkpCisgICAgICAgICAgICAgICAgICAgICYmICgobGVuID49IDQgJiYgIXN0cmNhc2VjbXAoIi5zZHAiLCAmdXJsW2xlbiAtIDRdKSkKKyAgICAgICAgICAgICAgICAgICAgfHwgc3Ryc3RyKHVybCwgIi5zZHA/IikpKSB7CisgICAgICAgIHNvdXJjZSA9IG5ldyBSVFNQU291cmNlKAorICAgICAgICAgICAgICAgIG5vdGlmeSwgaHR0cFNlcnZpY2UsIHVybCwgaGVhZGVycywgbVVJRFZhbGlkLCBtVUlELCB0cnVlKTsKKyAgICAgICAgQUxPR1YoInNldERhdGFTb3VyY2VBc3luYyBSVFNQU291cmNlIGh0dHAvaHR0cHMvLnNkcCAlcyIsIHVybCk7CisgICAgICAgIG1EYXRhU291cmNlVHlwZSA9IERBVEFfU09VUkNFX1RZUEVfUlRTUDsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigic2V0RGF0YVNvdXJjZUFzeW5jIEdlbmVyaWNTb3VyY2UgJXMiLCB1cmwpOworCisgICAgICAgIHNwPEdlbmVyaWNTb3VyY2U+IGdlbmVyaWNTb3VyY2UgPQorICAgICAgICAgICAgICAgIG5ldyBHZW5lcmljU291cmNlKG5vdGlmeSwgbVVJRFZhbGlkLCBtVUlELCBtTWVkaWFDbG9jayk7CisKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gZ2VuZXJpY1NvdXJjZS0+c2V0RGF0YVNvdXJjZShodHRwU2VydmljZSwgdXJsLCBoZWFkZXJzKTsKKworICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICBzb3VyY2UgPSBnZW5lcmljU291cmNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgZGF0YSBzb3VyY2UhIik7CisgICAgICAgIH0KKworICAgICAgICAvLyByZWdhcmRsZXNzIG9mIHN1Y2Nlc3MvZmFpbHVyZQorICAgICAgICBtRGF0YVNvdXJjZVR5cGUgPSBEQVRBX1NPVVJDRV9UWVBFX0dFTkVSSUNfVVJMOworICAgIH0KKyAgICBtc2ctPnNldE9iamVjdCgic291cmNlIiwgc291cmNlKTsKKyAgICBtc2ctPnBvc3QoKTsKK30KKwordm9pZCBOdVBsYXllcjI6OnNldERhdGFTb3VyY2VBc3luYyhpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXREYXRhU291cmNlLCB0aGlzKTsKKworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTb3VyY2VOb3RpZnksIHRoaXMpOworCisgICAgc3A8R2VuZXJpY1NvdXJjZT4gc291cmNlID0KKyAgICAgICAgICAgIG5ldyBHZW5lcmljU291cmNlKG5vdGlmeSwgbVVJRFZhbGlkLCBtVUlELCBtTWVkaWFDbG9jayk7CisKKyAgICBBTE9HVigic2V0RGF0YVNvdXJjZUFzeW5jIGZkICVkLyVsbGQvJWxsZCBzb3VyY2U6ICVwIiwKKyAgICAgICAgICAgIGZkLCAobG9uZyBsb25nKW9mZnNldCwgKGxvbmcgbG9uZylsZW5ndGgsIHNvdXJjZS5nZXQoKSk7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBzb3VyY2UtPnNldERhdGFTb3VyY2UoZmQsIG9mZnNldCwgbGVuZ3RoKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgZGF0YSBzb3VyY2UhIik7CisgICAgICAgIHNvdXJjZSA9IE5VTEw7CisgICAgfQorCisgICAgbXNnLT5zZXRPYmplY3QoInNvdXJjZSIsIHNvdXJjZSk7CisgICAgbXNnLT5wb3N0KCk7CisgICAgbURhdGFTb3VyY2VUeXBlID0gREFUQV9TT1VSQ0VfVFlQRV9HRU5FUklDX0ZEOworfQorCit2b2lkIE51UGxheWVyMjo6c2V0RGF0YVNvdXJjZUFzeW5jKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZkYXRhU291cmNlKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNldERhdGFTb3VyY2UsIHRoaXMpOworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTb3VyY2VOb3RpZnksIHRoaXMpOworCisgICAgc3A8R2VuZXJpY1NvdXJjZT4gc291cmNlID0gbmV3IEdlbmVyaWNTb3VyY2Uobm90aWZ5LCBtVUlEVmFsaWQsIG1VSUQsIG1NZWRpYUNsb2NrKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBzb3VyY2UtPnNldERhdGFTb3VyY2UoZGF0YVNvdXJjZSk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IGRhdGEgc291cmNlISIpOworICAgICAgICBzb3VyY2UgPSBOVUxMOworICAgIH0KKworICAgIG1zZy0+c2V0T2JqZWN0KCJzb3VyY2UiLCBzb3VyY2UpOworICAgIG1zZy0+cG9zdCgpOworICAgIG1EYXRhU291cmNlVHlwZSA9IERBVEFfU09VUkNFX1RZUEVfTUVESUE7Cit9CisKK3N0YXR1c190IE51UGxheWVyMjo6Z2V0QnVmZmVyaW5nU2V0dGluZ3MoCisgICAgICAgIEJ1ZmZlcmluZ1NldHRpbmdzICpidWZmZXJpbmcgLyogbm9ubnVsbCAqLykgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRHZXRCdWZmZXJpbmdTZXR0aW5ncywgdGhpcyk7CisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOworICAgIHN0YXR1c190IGVyciA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKKyAgICBpZiAoZXJyID09IE9LICYmIHJlc3BvbnNlICE9IE5VTEwpIHsKKyAgICAgICAgQ0hFQ0socmVzcG9uc2UtPmZpbmRJbnQzMigiZXJyIiwgJmVycikpOworICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICByZWFkRnJvbUFNZXNzYWdlKHJlc3BvbnNlLCBidWZmZXJpbmcpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXR1c190IE51UGxheWVyMjo6c2V0QnVmZmVyaW5nU2V0dGluZ3MoY29uc3QgQnVmZmVyaW5nU2V0dGluZ3MmIGJ1ZmZlcmluZykgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXRCdWZmZXJpbmdTZXR0aW5ncywgdGhpcyk7CisgICAgd3JpdGVUb0FNZXNzYWdlKG1zZywgYnVmZmVyaW5nKTsKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOworICAgIGlmIChlcnIgPT0gT0sgJiYgcmVzcG9uc2UgIT0gTlVMTCkgeworICAgICAgICBDSEVDSyhyZXNwb25zZS0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpwcmVwYXJlQXN5bmMoKSB7CisgICAgQUxPR1YoInByZXBhcmVBc3luYyIpOworCisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFByZXBhcmUsIHRoaXMpKS0+cG9zdCgpOworfQorCit2b2lkIE51UGxheWVyMjo6c2V0VmlkZW9TdXJmYWNlVGV4dHVyZUFzeW5jKGNvbnN0IHNwPEFOYXRpdmVXaW5kb3dXcmFwcGVyPiAmbnd3KSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNldFZpZGVvU3VyZmFjZSwgdGhpcyk7CisKKyAgICBpZiAobnd3ID09IE5VTEwgfHwgbnd3LT5nZXRBTmF0aXZlV2luZG93KCkgPT0gTlVMTCkgeworICAgICAgICBtc2ctPnNldE9iamVjdCgic3VyZmFjZSIsIE5VTEwpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1zZy0+c2V0T2JqZWN0KCJzdXJmYWNlIiwgbnd3KTsKKyAgICB9CisKKyAgICBtc2ctPnBvc3QoKTsKK30KKwordm9pZCBOdVBsYXllcjI6OnNldEF1ZGlvU2luayhjb25zdCBzcDxNZWRpYVBsYXllcjJCYXNlOjpBdWRpb1Npbms+ICZzaW5rKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNldEF1ZGlvU2luaywgdGhpcyk7CisgICAgbXNnLT5zZXRPYmplY3QoInNpbmsiLCBzaW5rKTsKKyAgICBtc2ctPnBvc3QoKTsKK30KKwordm9pZCBOdVBsYXllcjI6OnN0YXJ0KCkgeworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTdGFydCwgdGhpcykpLT5wb3N0KCk7Cit9CisKK3N0YXR1c190IE51UGxheWVyMjo6c2V0UGxheWJhY2tTZXR0aW5ncyhjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcmF0ZSkgeworICAgIC8vIGRvIHNvbWUgY3Vyc29yeSB2YWxpZGF0aW9uIG9mIHRoZSBzZXR0aW5ncyBoZXJlLiBhdWRpbyBtb2RlcyBhcmUKKyAgICAvLyBvbmx5IHZhbGlkYXRlZCB3aGVuIHNldCBvbiB0aGUgYXVkaW9zaW5rLgorICAgICBpZiAoKHJhdGUubVNwZWVkICE9IDAuZiAmJiByYXRlLm1TcGVlZCA8IEFVRElPX1RJTUVTVFJFVENIX1NQRUVEX01JTikKKyAgICAgICAgICAgIHx8IHJhdGUubVNwZWVkID4gQVVESU9fVElNRVNUUkVUQ0hfU1BFRURfTUFYCisgICAgICAgICAgICB8fCByYXRlLm1QaXRjaCA8IEFVRElPX1RJTUVTVFJFVENIX1NQRUVEX01JTgorICAgICAgICAgICAgfHwgcmF0ZS5tUGl0Y2ggPiBBVURJT19USU1FU1RSRVRDSF9TUEVFRF9NQVgpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENvbmZpZ1BsYXliYWNrLCB0aGlzKTsKKyAgICB3cml0ZVRvQU1lc3NhZ2UobXNnLCByYXRlKTsKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOworICAgIGlmIChlcnIgPT0gT0sgJiYgcmVzcG9uc2UgIT0gTlVMTCkgeworICAgICAgICBDSEVDSyhyZXNwb25zZS0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXR1c190IE51UGxheWVyMjo6Z2V0UGxheWJhY2tTZXR0aW5ncyhBdWRpb1BsYXliYWNrUmF0ZSAqcmF0ZSAvKiBub25udWxsICovKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEdldFBsYXliYWNrU2V0dGluZ3MsIHRoaXMpOworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7CisgICAgaWYgKGVyciA9PSBPSyAmJiByZXNwb25zZSAhPSBOVUxMKSB7CisgICAgICAgIENIRUNLKHJlc3BvbnNlLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKKyAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgcmVhZEZyb21BTWVzc2FnZShyZXNwb25zZSwgcmF0ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpzZXRTeW5jU2V0dGluZ3MoY29uc3QgQVZTeW5jU2V0dGluZ3MgJnN5bmMsIGZsb2F0IHZpZGVvRnBzSGludCkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDb25maWdTeW5jLCB0aGlzKTsKKyAgICB3cml0ZVRvQU1lc3NhZ2UobXNnLCBzeW5jLCB2aWRlb0Zwc0hpbnQpOworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7CisgICAgaWYgKGVyciA9PSBPSyAmJiByZXNwb25zZSAhPSBOVUxMKSB7CisgICAgICAgIENIRUNLKHJlc3BvbnNlLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpnZXRTeW5jU2V0dGluZ3MoCisgICAgICAgIEFWU3luY1NldHRpbmdzICpzeW5jIC8qIG5vbm51bGwgKi8sIGZsb2F0ICp2aWRlb0ZwcyAvKiBub25udWxsICovKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEdldFN5bmNTZXR0aW5ncywgdGhpcyk7CisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOworICAgIHN0YXR1c190IGVyciA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKKyAgICBpZiAoZXJyID09IE9LICYmIHJlc3BvbnNlICE9IE5VTEwpIHsKKyAgICAgICAgQ0hFQ0socmVzcG9uc2UtPmZpbmRJbnQzMigiZXJyIiwgJmVycikpOworICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICByZWFkRnJvbUFNZXNzYWdlKHJlc3BvbnNlLCBzeW5jLCB2aWRlb0Zwcyk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKwordm9pZCBOdVBsYXllcjI6OnBhdXNlKCkgeworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRQYXVzZSwgdGhpcykpLT5wb3N0KCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpyZXNldEFzeW5jKCkgeworICAgIHNwPFNvdXJjZT4gc291cmNlOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Tb3VyY2VMb2NrKTsKKyAgICAgICAgc291cmNlID0gbVNvdXJjZTsKKyAgICB9CisKKyAgICBpZiAoc291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgLy8gRHVyaW5nIGEgcmVzZXQsIHRoZSBkYXRhIHNvdXJjZSBtaWdodCBiZSB1bnJlc3BvbnNpdmUgYWxyZWFkeSwgd2UgbmVlZCB0bworICAgICAgICAvLyBkaXNjb25uZWN0IGV4cGxpY2l0bHkgc28gdGhhdCByZWFkcyBleGl0IHByb21wdGx5LgorICAgICAgICAvLyBXZSBjYW4ndCBxdWV1ZSB0aGUgZGlzY29ubmVjdCByZXF1ZXN0IHRvIHRoZSBsb29wZXIsIGFzIGl0IG1pZ2h0IGJlCisgICAgICAgIC8vIHF1ZXVlZCBiZWhpbmQgYSBzdHVjayByZWFkIGFuZCBuZXZlciBnZXRzIHByb2Nlc3NlZC4KKyAgICAgICAgLy8gRG9pbmcgYSBkaXNjb25uZWN0IG91dHNpZGUgdGhlIGxvb3BlciB0byBhbGxvd3MgdGhlIHBlbmRpbmcgcmVhZHMgdG8gZXhpdAorICAgICAgICAvLyAoZWl0aGVyIHN1Y2Nlc3NmdWxseSBvciB3aXRoIGVycm9yKS4KKyAgICAgICAgc291cmNlLT5kaXNjb25uZWN0KCk7CisgICAgfQorCisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFJlc2V0LCB0aGlzKSktPnBvc3QoKTsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpub3RpZnlBdChpbnQ2NF90IG1lZGlhVGltZVVzKSB7CisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdE5vdGlmeVRpbWUsIHRoaXMpOworICAgIG5vdGlmeS0+c2V0SW50NjQoInRpbWVyVXMiLCBtZWRpYVRpbWVVcyk7CisgICAgbU1lZGlhQ2xvY2stPmFkZFRpbWVyKG5vdGlmeSwgbWVkaWFUaW1lVXMpOworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBOdVBsYXllcjI6OnNlZWtUb0FzeW5jKGludDY0X3Qgc2Vla1RpbWVVcywgTWVkaWFQbGF5ZXIyU2Vla01vZGUgbW9kZSwgYm9vbCBuZWVkTm90aWZ5KSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlZWssIHRoaXMpOworICAgIG1zZy0+c2V0SW50NjQoInNlZWtUaW1lVXMiLCBzZWVrVGltZVVzKTsKKyAgICBtc2ctPnNldEludDMyKCJtb2RlIiwgbW9kZSk7CisgICAgbXNnLT5zZXRJbnQzMigibmVlZE5vdGlmeSIsIG5lZWROb3RpZnkpOworICAgIG1zZy0+cG9zdCgpOworfQorCisKK3ZvaWQgTnVQbGF5ZXIyOjp3cml0ZVRyYWNrSW5mbygKKyAgICAgICAgUGFyY2VsKiByZXBseSwgY29uc3Qgc3A8QU1lc3NhZ2U+JiBmb3JtYXQpIGNvbnN0IHsKKyAgICBpZiAoZm9ybWF0ID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIk5VTEwgZm9ybWF0Iik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaW50MzJfdCB0cmFja1R5cGU7CisgICAgaWYgKCFmb3JtYXQtPmZpbmRJbnQzMigidHlwZSIsICZ0cmFja1R5cGUpKSB7CisgICAgICAgIEFMT0dFKCJubyB0cmFjayB0eXBlIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBU3RyaW5nIG1pbWU7CisgICAgaWYgKCFmb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpIHsKKyAgICAgICAgLy8gSmF2YSBNZWRpYVBsYXllciBvbmx5IHVzZXMgbWltZXR5cGUgZm9yIHN1YnRpdGxlIGFuZCB0aW1lZHRleHQgdHJhY2tzLgorICAgICAgICAvLyBJZiB3ZSBjYW4ndCBmaW5kIHRoZSBtaW1ldHlwZSBoZXJlIGl0IG1lYW5zIHRoYXQgd2Ugd291bGRuJ3QgYmUgbmVlZGluZworICAgICAgICAvLyB0aGUgbWltZXR5cGUgb24gdGhlIEphdmEgZW5kLiBXZSBzdGlsbCB3cml0ZSBhIHBsYWNlaG9sZGVyIG1pbWUgdG8ga2VlcCB0aGUKKyAgICAgICAgLy8gKGRlKXNlcmlhbGl6YXRpb24gbG9naWMgc2ltcGxlLgorICAgICAgICBpZiAodHJhY2tUeXBlID09IE1FRElBX1RSQUNLX1RZUEVfQVVESU8pIHsKKyAgICAgICAgICAgIG1pbWUgPSAiYXVkaW8vIjsKKyAgICAgICAgfSBlbHNlIGlmICh0cmFja1R5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9WSURFTykgeworICAgICAgICAgICAgbWltZSA9ICJ2aWRlby8iOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoInVua25vd24gdHJhY2sgdHlwZTogJWQiLCB0cmFja1R5cGUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgQVN0cmluZyBsYW5nOworICAgIGlmICghZm9ybWF0LT5maW5kU3RyaW5nKCJsYW5ndWFnZSIsICZsYW5nKSkgeworICAgICAgICBBTE9HRSgibm8gbGFuZ3VhZ2UiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHJlcGx5LT53cml0ZUludDMyKDIpOyAvLyB3cml0ZSBzb21ldGhpbmcgbm9uLXplcm8KKyAgICByZXBseS0+d3JpdGVJbnQzMih0cmFja1R5cGUpOworICAgIHJlcGx5LT53cml0ZVN0cmluZzE2KFN0cmluZzE2KG1pbWUuY19zdHIoKSkpOworICAgIHJlcGx5LT53cml0ZVN0cmluZzE2KFN0cmluZzE2KGxhbmcuY19zdHIoKSkpOworCisgICAgaWYgKHRyYWNrVHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX1NVQlRJVExFKSB7CisgICAgICAgIGludDMyX3QgaXNBdXRvLCBpc0RlZmF1bHQsIGlzRm9yY2VkOworICAgICAgICBDSEVDSyhmb3JtYXQtPmZpbmRJbnQzMigiYXV0byIsICZpc0F1dG8pKTsKKyAgICAgICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoImRlZmF1bHQiLCAmaXNEZWZhdWx0KSk7CisgICAgICAgIENIRUNLKGZvcm1hdC0+ZmluZEludDMyKCJmb3JjZWQiLCAmaXNGb3JjZWQpKTsKKworICAgICAgICByZXBseS0+d3JpdGVJbnQzMihpc0F1dG8pOworICAgICAgICByZXBseS0+d3JpdGVJbnQzMihpc0RlZmF1bHQpOworICAgICAgICByZXBseS0+d3JpdGVJbnQzMihpc0ZvcmNlZCk7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyMjo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgICAgIGNhc2Uga1doYXRTZXREYXRhU291cmNlOgorICAgICAgICB7CisgICAgICAgICAgICBBTE9HVigia1doYXRTZXREYXRhU291cmNlIik7CisKKyAgICAgICAgICAgIENIRUNLKG1Tb3VyY2UgPT0gTlVMTCk7CisKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IE9LOworICAgICAgICAgICAgc3A8UmVmQmFzZT4gb2JqOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJzb3VyY2UiLCAmb2JqKSk7CisgICAgICAgICAgICBpZiAob2JqICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVNvdXJjZUxvY2spOworICAgICAgICAgICAgICAgIG1Tb3VyY2UgPSBzdGF0aWNfY2FzdDxTb3VyY2UgKj4ob2JqLmdldCgpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZXJyID0gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ0hFQ0sobURyaXZlciAhPSBOVUxMKTsKKyAgICAgICAgICAgIHNwPE51UGxheWVyMkRyaXZlcj4gZHJpdmVyID0gbURyaXZlci5wcm9tb3RlKCk7CisgICAgICAgICAgICBpZiAoZHJpdmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeVNldERhdGFTb3VyY2VDb21wbGV0ZWQoZXJyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdEdldEJ1ZmZlcmluZ1NldHRpbmdzOgorICAgICAgICB7CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKKworICAgICAgICAgICAgQUxPR1YoImtXaGF0R2V0QnVmZmVyaW5nU2V0dGluZ3MiKTsKKyAgICAgICAgICAgIEJ1ZmZlcmluZ1NldHRpbmdzIGJ1ZmZlcmluZzsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IE9LOworICAgICAgICAgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGVyciA9IG1Tb3VyY2UtPmdldEJ1ZmZlcmluZ1NldHRpbmdzKCZidWZmZXJpbmcpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICB3cml0ZVRvQU1lc3NhZ2UocmVzcG9uc2UsIGJ1ZmZlcmluZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7CisgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0U2V0QnVmZmVyaW5nU2V0dGluZ3M6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOworCisgICAgICAgICAgICBBTE9HVigia1doYXRTZXRCdWZmZXJpbmdTZXR0aW5ncyIpOworICAgICAgICAgICAgQnVmZmVyaW5nU2V0dGluZ3MgYnVmZmVyaW5nOworICAgICAgICAgICAgcmVhZEZyb21BTWVzc2FnZShtc2csICZidWZmZXJpbmcpOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gT0s7CisgICAgICAgICAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgZXJyID0gbVNvdXJjZS0+c2V0QnVmZmVyaW5nU2V0dGluZ3MoYnVmZmVyaW5nKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZXJyID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7CisgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0UHJlcGFyZToKKyAgICAgICAgeworICAgICAgICAgICAgQUxPR1YoIm9uTWVzc2FnZVJlY2VpdmVkIGtXaGF0UHJlcGFyZSIpOworCisgICAgICAgICAgICBtU291cmNlLT5wcmVwYXJlQXN5bmMoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdEdldFRyYWNrSW5mbzoKKyAgICAgICAgeworICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CisKKyAgICAgICAgICAgIFBhcmNlbCogcmVwbHk7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRQb2ludGVyKCJyZXBseSIsICh2b2lkKiopJnJlcGx5KSk7CisKKyAgICAgICAgICAgIHNpemVfdCBpbmJhbmRUcmFja3MgPSAwOworICAgICAgICAgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGluYmFuZFRyYWNrcyA9IG1Tb3VyY2UtPmdldFRyYWNrQ291bnQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2l6ZV90IGNjVHJhY2tzID0gMDsKKyAgICAgICAgICAgIGlmIChtQ0NEZWNvZGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBjY1RyYWNrcyA9IG1DQ0RlY29kZXItPmdldFRyYWNrQ291bnQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gdG90YWwgdHJhY2sgY291bnQKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGluYmFuZFRyYWNrcyArIGNjVHJhY2tzKTsKKworICAgICAgICAgICAgLy8gd3JpdGUgaW5iYW5kIHRyYWNrcworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmJhbmRUcmFja3M7ICsraSkgeworICAgICAgICAgICAgICAgIHdyaXRlVHJhY2tJbmZvKHJlcGx5LCBtU291cmNlLT5nZXRUcmFja0luZm8oaSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyB3cml0ZSBDQyB0cmFjaworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjY1RyYWNrczsgKytpKSB7CisgICAgICAgICAgICAgICAgd3JpdGVUcmFja0luZm8ocmVwbHksIG1DQ0RlY29kZXItPmdldFRyYWNrSW5mbyhpKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRHZXRTZWxlY3RlZFRyYWNrOgorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBPSzsKKworICAgICAgICAgICAgICAgIGludDMyX3QgdHlwZTMyOworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ0eXBlIiwgKGludDMyX3QqKSZ0eXBlMzIpKTsKKyAgICAgICAgICAgICAgICBtZWRpYV90cmFja190eXBlIHR5cGUgPSAobWVkaWFfdHJhY2tfdHlwZSl0eXBlMzI7CisgICAgICAgICAgICAgICAgc3NpemVfdCBzZWxlY3RlZFRyYWNrID0gbVNvdXJjZS0+Z2V0U2VsZWN0ZWRUcmFjayh0eXBlKTsKKworICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHk7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kUG9pbnRlcigicmVwbHkiLCAodm9pZCoqKSZyZXBseSkpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNlbGVjdGVkVHJhY2spOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7CisKKyAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOworICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdFNlbGVjdFRyYWNrOgorICAgICAgICB7CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKKworICAgICAgICAgICAgc2l6ZV90IHRyYWNrSW5kZXg7CisgICAgICAgICAgICBpbnQzMl90IHNlbGVjdDsKKyAgICAgICAgICAgIGludDY0X3QgdGltZVVzOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kU2l6ZSgidHJhY2tJbmRleCIsICZ0cmFja0luZGV4KSk7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigic2VsZWN0IiwgJnNlbGVjdCkpOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKKworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gSU5WQUxJRF9PUEVSQVRJT047CisKKyAgICAgICAgICAgIHNpemVfdCBpbmJhbmRUcmFja3MgPSAwOworICAgICAgICAgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGluYmFuZFRyYWNrcyA9IG1Tb3VyY2UtPmdldFRyYWNrQ291bnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNpemVfdCBjY1RyYWNrcyA9IDA7CisgICAgICAgICAgICBpZiAobUNDRGVjb2RlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgY2NUcmFja3MgPSBtQ0NEZWNvZGVyLT5nZXRUcmFja0NvdW50KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0cmFja0luZGV4IDwgaW5iYW5kVHJhY2tzKSB7CisgICAgICAgICAgICAgICAgZXJyID0gbVNvdXJjZS0+c2VsZWN0VHJhY2sodHJhY2tJbmRleCwgc2VsZWN0LCB0aW1lVXMpOworCisgICAgICAgICAgICAgICAgaWYgKCFzZWxlY3QgJiYgZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdHlwZTsKKyAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGluZm8gPSBtU291cmNlLT5nZXRUcmFja0luZm8odHJhY2tJbmRleCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvICE9IE5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbmZvLT5maW5kSW50MzIoInR5cGUiLCAmdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB0eXBlID09IE1FRElBX1RSQUNLX1RZUEVfVElNRURURVhUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICArK21UaW1lZFRleHRHZW5lcmF0aW9uOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0cmFja0luZGV4IC09IGluYmFuZFRyYWNrczsKKworICAgICAgICAgICAgICAgIGlmICh0cmFja0luZGV4IDwgY2NUcmFja3MpIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gbUNDRGVjb2Rlci0+c2VsZWN0VHJhY2sodHJhY2tJbmRleCwgc2VsZWN0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKKworICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdFBvbGxEdXJhdGlvbjoKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCBnZW5lcmF0aW9uOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmZ2VuZXJhdGlvbikpOworCisgICAgICAgICAgICBpZiAoZ2VuZXJhdGlvbiAhPSBtUG9sbER1cmF0aW9uR2VuZXJhdGlvbikgeworICAgICAgICAgICAgICAgIC8vIHN0YWxlCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb25VczsKKyAgICAgICAgICAgIGlmIChtRHJpdmVyICE9IE5VTEwgJiYgbVNvdXJjZS0+Z2V0RHVyYXRpb24oJmR1cmF0aW9uVXMpID09IE9LKSB7CisgICAgICAgICAgICAgICAgc3A8TnVQbGF5ZXIyRHJpdmVyPiBkcml2ZXIgPSBtRHJpdmVyLnByb21vdGUoKTsKKyAgICAgICAgICAgICAgICBpZiAoZHJpdmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlEdXJhdGlvbihkdXJhdGlvblVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1zZy0+cG9zdCgxMDAwMDAwbGwpOyAgLy8gcG9sbCBhZ2FpbiBpbiBhIHNlY29uZC4KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdFNldFZpZGVvU3VyZmFjZToKKyAgICAgICAgeworCisgICAgICAgICAgICBzcDxSZWZCYXNlPiBvYmo7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoInN1cmZhY2UiLCAmb2JqKSk7CisgICAgICAgICAgICBzcDxBTmF0aXZlV2luZG93V3JhcHBlcj4gbnd3ID0gc3RhdGljX2Nhc3Q8QU5hdGl2ZVdpbmRvd1dyYXBwZXIgKj4ob2JqLmdldCgpKTsKKworICAgICAgICAgICAgQUxPR0QoIm9uU2V0VmlkZW9TdXJmYWNlKCVwLCAlcyB2aWRlbyBkZWNvZGVyKSIsCisgICAgICAgICAgICAgICAgICAgIChud3cgPT0gTlVMTCA/IE5VTEwgOiBud3ctPmdldEFOYXRpdmVXaW5kb3coKSksCisgICAgICAgICAgICAgICAgICAgIChtU291cmNlICE9IE5VTEwgJiYgbVN0YXJ0ZWQgJiYgbVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qIGF1ZGlvICovKSAhPSBOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbVZpZGVvRGVjb2RlciAhPSBOVUxMKSA/ICJoYXZlIiA6ICJubyIpOworCisgICAgICAgICAgICAvLyBOZWVkIHRvIGNoZWNrIG1TdGFydGVkIGJlZm9yZSBjYWxsaW5nIG1Tb3VyY2UtPmdldEZvcm1hdCBiZWNhdXNlIE51UGxheWVyMiBtaWdodAorICAgICAgICAgICAgLy8gYmUgaW4gcHJlcGFyaW5nIHN0YXRlIGFuZCBpdCBjb3VsZCB0YWtlIGxvbmcgdGltZS4KKyAgICAgICAgICAgIC8vIFdoZW4gbVN0YXJ0ZWQgaXMgdHJ1ZSwgbVNvdXJjZSBtdXN0IGhhdmUgYmVlbiBzZXQuCisgICAgICAgICAgICBpZiAobVNvdXJjZSA9PSBOVUxMIHx8ICFtU3RhcnRlZCB8fCBtU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyogYXVkaW8gKi8pID09IE5VTEwKKyAgICAgICAgICAgICAgICAgICAgLy8gTk9URTogbVZpZGVvRGVjb2RlcidzIG1OYXRpdmVXaW5kb3cgaXMgYWx3YXlzIG5vbi1udWxsCisgICAgICAgICAgICAgICAgICAgIHx8IChtVmlkZW9EZWNvZGVyICE9IE5VTEwgJiYgbVZpZGVvRGVjb2Rlci0+c2V0VmlkZW9TdXJmYWNlKG53dykgPT0gT0spKSB7CisgICAgICAgICAgICAgICAgcGVyZm9ybVNldFN1cmZhY2Uobnd3KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbURlZmVycmVkQWN0aW9ucy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgIG5ldyBGbHVzaERlY29kZXJBY3Rpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9iaiAhPSBOVUxMID8gRkxVU0hfQ01EX0ZMVVNIIDogRkxVU0hfQ01EX05PTkUpIC8qIGF1ZGlvICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMVVNIX0NNRF9TSFVURE9XTiAvKiB2aWRlbyAqLykpOworCisgICAgICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjayhuZXcgU2V0U3VyZmFjZUFjdGlvbihud3cpKTsKKworICAgICAgICAgICAgaWYgKG9iaiAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIElzc3VlIGEgc2VlayB0byByZWZyZXNoIHRoZSB2aWRlbyBzY3JlZW4gb25seSBpZiBzdGFydGVkIG90aGVyd2lzZQorICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZXh0cmFjdG9yIG1heSBub3QgeWV0IGJlIHN0YXJ0ZWQgYW5kIHdpbGwgYXNzZXJ0LgorICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgdmlkZW8gZGVjb2RlciBpcyBub3Qgc2V0IChwZXJoYXBzIGF1ZGlvIG9ubHkgaW4gdGhpcyBjYXNlKQorICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3QgcGVyZm9ybSBhIHNlZWsgYXMgaXQgaXMgbm90IG5lZWRlZC4KKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBjdXJyZW50UG9zaXRpb25VcyA9IDA7CisgICAgICAgICAgICAgICAgICAgIGlmIChnZXRDdXJyZW50UG9zaXRpb24oJmN1cnJlbnRQb3NpdGlvblVzKSA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgbURlZmVycmVkQWN0aW9ucy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTZWVrQWN0aW9uKGN1cnJlbnRQb3NpdGlvblVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkMgLyogbW9kZSAqLykpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBuZXcgc3VyZmFjZSB0ZXh0dXJlLCBpbnN0YW50aWF0ZSBkZWNvZGVycworICAgICAgICAgICAgICAgIC8vIGFnYWluIGlmIHBvc3NpYmxlLgorICAgICAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUFjdGlvbigmTnVQbGF5ZXIyOjpwZXJmb3JtU2NhblNvdXJjZXMpKTsKKworICAgICAgICAgICAgICAgIC8vIEFmdGVyIGEgZmx1c2ggd2l0aG91dCBzaHV0ZG93biwgZGVjb2RlciBpcyBwYXVzZWQuCisgICAgICAgICAgICAgICAgLy8gRG9uJ3QgcmVzdW1lIGl0IHVudGlsIHNvdXJjZSBzZWVrIGlzIGRvbmUsIG90aGVyd2lzZSBpdCBjb3VsZAorICAgICAgICAgICAgICAgIC8vIHN0YXJ0IHB1bGxpbmcgc3RhbGUgZGF0YSB0b28gc29vbi4KKyAgICAgICAgICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSZXN1bWVEZWNvZGVyQWN0aW9uKGZhbHNlIC8qIG5lZWROb3RpZnkgKi8pKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJvY2Vzc0RlZmVycmVkQWN0aW9ucygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0U2V0QXVkaW9TaW5rOgorICAgICAgICB7CisgICAgICAgICAgICBBTE9HVigia1doYXRTZXRBdWRpb1NpbmsiKTsKKworICAgICAgICAgICAgc3A8UmVmQmFzZT4gb2JqOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJzaW5rIiwgJm9iaikpOworCisgICAgICAgICAgICBtQXVkaW9TaW5rID0gc3RhdGljX2Nhc3Q8TWVkaWFQbGF5ZXIyQmFzZTo6QXVkaW9TaW5rICo+KG9iai5nZXQoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRTdGFydDoKKyAgICAgICAgeworICAgICAgICAgICAgQUxPR1YoImtXaGF0U3RhcnQiKTsKKyAgICAgICAgICAgIGlmIChtU3RhcnRlZCkgeworICAgICAgICAgICAgICAgIC8vIGRvIG5vdCByZXN1bWUgeWV0IGlmIHRoZSBzb3VyY2UgaXMgc3RpbGwgYnVmZmVyaW5nCisgICAgICAgICAgICAgICAgaWYgKCFtUGF1c2VkRm9yQnVmZmVyaW5nKSB7CisgICAgICAgICAgICAgICAgICAgIG9uUmVzdW1lKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvblN0YXJ0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUGF1c2VkQnlDbGllbnQgPSBmYWxzZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdENvbmZpZ1BsYXliYWNrOgorICAgICAgICB7CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKKyAgICAgICAgICAgIEF1ZGlvUGxheWJhY2tSYXRlIHJhdGUgLyogc2FuaXRpemVkICovOworICAgICAgICAgICAgcmVhZEZyb21BTWVzc2FnZShtc2csICZyYXRlKTsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IE9LOworICAgICAgICAgICAgaWYgKG1SZW5kZXJlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgLy8gQXVkaW9TaW5rIGFsbG93cyBvbmx5IDEuZiBhbmQgMC5mIGZvciBvZmZsb2FkIG1vZGUuCisgICAgICAgICAgICAgICAgLy8gRm9yIG90aGVyIHNwZWVkLCBzd2l0Y2ggdG8gbm9uLW9mZmxvYWQgbW9kZS4KKyAgICAgICAgICAgICAgICBpZiAobU9mZmxvYWRBdWRpbyAmJiAoKHJhdGUubVNwZWVkICE9IDAuZiAmJiByYXRlLm1TcGVlZCAhPSAxLmYpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCByYXRlLm1QaXRjaCAhPSAxLmYpKSB7CisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgY3VycmVudFBvc2l0aW9uVXM7CisgICAgICAgICAgICAgICAgICAgIGlmIChnZXRDdXJyZW50UG9zaXRpb24oJmN1cnJlbnRQb3NpdGlvblVzKSAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFBvc2l0aW9uVXMgPSBtUHJldmlvdXNTZWVrVGltZVVzOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gU2V0IG1QbGF5YmFja1NldHRpbmdzIHNvIHRoYXQgdGhlIG5ldyBhdWRpbyBkZWNvZGVyIGNhbgorICAgICAgICAgICAgICAgICAgICAvLyBiZSBjcmVhdGVkIGNvcnJlY3RseS4KKyAgICAgICAgICAgICAgICAgICAgbVBsYXliYWNrU2V0dGluZ3MgPSByYXRlOworICAgICAgICAgICAgICAgICAgICBpZiAoIW1QYXVzZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1SZW5kZXJlci0+cGF1c2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXN0YXJ0QXVkaW8oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFBvc2l0aW9uVXMsIHRydWUgLyogZm9yY2VOb25PZmZsb2FkICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogbmVlZHNUb0NyZWF0ZUF1ZGlvRGVjb2RlciAqLyk7CisgICAgICAgICAgICAgICAgICAgIGlmICghbVBhdXNlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVJlbmRlcmVyLT5yZXN1bWUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGVyciA9IG1SZW5kZXJlci0+c2V0UGxheWJhY2tTZXR0aW5ncyhyYXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICBpZiAocmF0ZS5tU3BlZWQgPT0gMC5mKSB7CisgICAgICAgICAgICAgICAgICAgIG9uUGF1c2UoKTsKKyAgICAgICAgICAgICAgICAgICAgbVBhdXNlZEJ5Q2xpZW50ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgLy8gc2F2ZSBhbGwgb3RoZXIgc2V0dGluZ3MgKHVzaW5nIG5vbi1wYXVzZWQgc3BlZWQpCisgICAgICAgICAgICAgICAgICAgIC8vIHNvIHdlIGNhbiByZXN0b3JlIHRoZW0gb24gc3RhcnQKKyAgICAgICAgICAgICAgICAgICAgQXVkaW9QbGF5YmFja1JhdGUgbmV3UmF0ZSA9IHJhdGU7CisgICAgICAgICAgICAgICAgICAgIG5ld1JhdGUubVNwZWVkID0gbVBsYXliYWNrU2V0dGluZ3MubVNwZWVkOworICAgICAgICAgICAgICAgICAgICBtUGxheWJhY2tTZXR0aW5ncyA9IG5ld1JhdGU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsgLyogcmF0ZS5tU3BlZWQgIT0gMC5mICovCisgICAgICAgICAgICAgICAgICAgIG1QbGF5YmFja1NldHRpbmdzID0gcmF0ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3QgcmVzdW1lIHlldCBpZiB0aGUgc291cmNlIGlzIHN0aWxsIGJ1ZmZlcmluZworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtUGF1c2VkRm9yQnVmZmVyaW5nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25SZXN1bWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtUHJlcGFyZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9uU3RhcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIG1QYXVzZWRCeUNsaWVudCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1WaWRlb0RlY29kZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBwYXJhbXMgPSBuZXcgQU1lc3NhZ2UoKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KCJwbGF5YmFjay1zcGVlZCIsIG1QbGF5YmFja1NldHRpbmdzLm1TcGVlZCk7CisgICAgICAgICAgICAgICAgbVZpZGVvRGVjb2Rlci0+c2V0UGFyYW1ldGVycyhwYXJhbXMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7CisgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0R2V0UGxheWJhY2tTZXR0aW5nczoKKyAgICAgICAgeworICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CisgICAgICAgICAgICBBdWRpb1BsYXliYWNrUmF0ZSByYXRlID0gbVBsYXliYWNrU2V0dGluZ3M7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKyAgICAgICAgICAgIGlmIChtUmVuZGVyZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGVyciA9IG1SZW5kZXJlci0+Z2V0UGxheWJhY2tTZXR0aW5ncygmcmF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgLy8gZ2V0IHBsYXliYWNrIHNldHRpbmdzIHVzZWQgYnkgcmVuZGVyZXIsIGFzIGl0IG1heSBiZQorICAgICAgICAgICAgICAgIC8vIHNsaWdodGx5IG9mZiBkdWUgdG8gYXVkaW9zaW5rIG5vdCB0YWtpbmcgc21hbGwgY2hhbmdlcy4KKyAgICAgICAgICAgICAgICBtUGxheWJhY2tTZXR0aW5ncyA9IHJhdGU7CisgICAgICAgICAgICAgICAgaWYgKG1QYXVzZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmF0ZS5tU3BlZWQgPSAwLmY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOworICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgIHdyaXRlVG9BTWVzc2FnZShyZXNwb25zZSwgcmF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7CisgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0Q29uZmlnU3luYzoKKyAgICAgICAgeworICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CisKKyAgICAgICAgICAgIEFMT0dWKCJrV2hhdENvbmZpZ1N5bmMiKTsKKyAgICAgICAgICAgIEFWU3luY1NldHRpbmdzIHN5bmM7CisgICAgICAgICAgICBmbG9hdCB2aWRlb0Zwc0hpbnQ7CisgICAgICAgICAgICByZWFkRnJvbUFNZXNzYWdlKG1zZywgJnN5bmMsICZ2aWRlb0Zwc0hpbnQpOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gT0s7CisgICAgICAgICAgICBpZiAobVJlbmRlcmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBtUmVuZGVyZXItPnNldFN5bmNTZXR0aW5ncyhzeW5jLCB2aWRlb0Zwc0hpbnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgIG1TeW5jU2V0dGluZ3MgPSBzeW5jOworICAgICAgICAgICAgICAgIG1WaWRlb0Zwc0hpbnQgPSB2aWRlb0Zwc0hpbnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7CisgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0R2V0U3luY1NldHRpbmdzOgorICAgICAgICB7CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKKyAgICAgICAgICAgIEFWU3luY1NldHRpbmdzIHN5bmMgPSBtU3luY1NldHRpbmdzOworICAgICAgICAgICAgZmxvYXQgdmlkZW9GcHMgPSBtVmlkZW9GcHNIaW50OworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gT0s7CisgICAgICAgICAgICBpZiAobVJlbmRlcmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBtUmVuZGVyZXItPmdldFN5bmNTZXR0aW5ncygmc3luYywgJnZpZGVvRnBzKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIG1TeW5jU2V0dGluZ3MgPSBzeW5jOworICAgICAgICAgICAgICAgICAgICBtVmlkZW9GcHNIaW50ID0gdmlkZW9GcHM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOworICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgIHdyaXRlVG9BTWVzc2FnZShyZXNwb25zZSwgc3luYywgdmlkZW9GcHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOworICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdFNjYW5Tb3VyY2VzOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IGdlbmVyYXRpb247CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZ2VuZXJhdGlvbiIsICZnZW5lcmF0aW9uKSk7CisgICAgICAgICAgICBpZiAoZ2VuZXJhdGlvbiAhPSBtU2NhblNvdXJjZXNHZW5lcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgLy8gRHJvcCBvYnNvbGV0ZSBtc2cuCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1TY2FuU291cmNlc1BlbmRpbmcgPSBmYWxzZTsKKworICAgICAgICAgICAgQUxPR1YoInNjYW5uaW5nIHNvdXJjZXMgaGF2ZUF1ZGlvPSVkLCBoYXZlVmlkZW89JWQiLAorICAgICAgICAgICAgICAgICBtQXVkaW9EZWNvZGVyICE9IE5VTEwsIG1WaWRlb0RlY29kZXIgIT0gTlVMTCk7CisKKyAgICAgICAgICAgIGJvb2wgbUhhZEFueVNvdXJjZXNCZWZvcmUgPQorICAgICAgICAgICAgICAgIChtQXVkaW9EZWNvZGVyICE9IE5VTEwpIHx8IChtVmlkZW9EZWNvZGVyICE9IE5VTEwpOworICAgICAgICAgICAgYm9vbCByZXNjYW4gPSBmYWxzZTsKKworICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSB2aWRlbyBiZWZvcmUgYXVkaW8gYmVjYXVzZSBzdWNjZXNzZnVsIGluaXRpYWxpemF0aW9uIG9mCisgICAgICAgICAgICAvLyB2aWRlbyBtYXkgY2hhbmdlIGRlZXAgYnVmZmVyIG1vZGUgb2YgYXVkaW8uCisgICAgICAgICAgICBpZiAobU5hdGl2ZVdpbmRvdyAhPSBOVUxMICYmIG1OYXRpdmVXaW5kb3ctPmdldEFOYXRpdmVXaW5kb3coKSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKGluc3RhbnRpYXRlRGVjb2RlcihmYWxzZSwgJm1WaWRlb0RlY29kZXIpID09IC1FV09VTERCTE9DSykgeworICAgICAgICAgICAgICAgICAgICByZXNjYW4gPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRG9uJ3QgdHJ5IHRvIHJlLW9wZW4gYXVkaW8gc2luayBpZiB0aGVyZSdzIGFuIGV4aXN0aW5nIGRlY29kZXIuCisgICAgICAgICAgICBpZiAobUF1ZGlvU2luayAhPSBOVUxMICYmIG1BdWRpb0RlY29kZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGlmIChpbnN0YW50aWF0ZURlY29kZXIodHJ1ZSwgJm1BdWRpb0RlY29kZXIpID09IC1FV09VTERCTE9DSykgeworICAgICAgICAgICAgICAgICAgICByZXNjYW4gPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFtSGFkQW55U291cmNlc0JlZm9yZQorICAgICAgICAgICAgICAgICAgICAmJiAobUF1ZGlvRGVjb2RlciAhPSBOVUxMIHx8IG1WaWRlb0RlY29kZXIgIT0gTlVMTCkpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlJ3ZlIGZvdW5kIGFueXRoaW5nIHBsYXlhYmxlLgorCisgICAgICAgICAgICAgICAgaWYgKG1Tb3VyY2VGbGFncyAmIFNvdXJjZTo6RkxBR19EWU5BTUlDX0RVUkFUSU9OKSB7CisgICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlUG9sbER1cmF0aW9uKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0dXNfdCBlcnI7CisgICAgICAgICAgICBpZiAoKGVyciA9IG1Tb3VyY2UtPmZlZWRNb3JlVFNEYXRhKCkpICE9IE9LKSB7CisgICAgICAgICAgICAgICAgaWYgKG1BdWRpb0RlY29kZXIgPT0gTlVMTCAmJiBtVmlkZW9EZWNvZGVyID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gV2UncmUgbm90IGN1cnJlbnRseSBkZWNvZGluZyBhbnl0aGluZyAobm8gYXVkaW8gb3IKKyAgICAgICAgICAgICAgICAgICAgLy8gdmlkZW8gdHJhY2tzIGZvdW5kKSBhbmQgd2UganVzdCByYW4gb3V0IG9mIGlucHV0IGRhdGEuCisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihNRURJQTJfUExBWUJBQ0tfQ09NUExFVEUsIDAsIDApOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoTUVESUEyX0VSUk9SLCBNRURJQTJfRVJST1JfVU5LTk9XTiwgZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHJlc2NhbikgeworICAgICAgICAgICAgICAgIG1zZy0+cG9zdCgxMDAwMDBsbCk7CisgICAgICAgICAgICAgICAgbVNjYW5Tb3VyY2VzUGVuZGluZyA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRWaWRlb05vdGlmeToKKyAgICAgICAgY2FzZSBrV2hhdEF1ZGlvTm90aWZ5OgorICAgICAgICB7CisgICAgICAgICAgICBib29sIGF1ZGlvID0gbXNnLT53aGF0KCkgPT0ga1doYXRBdWRpb05vdGlmeTsKKworICAgICAgICAgICAgaW50MzJfdCBjdXJyZW50RGVjb2RlckdlbmVyYXRpb24gPQorICAgICAgICAgICAgICAgIChhdWRpbz8gbUF1ZGlvRGVjb2RlckdlbmVyYXRpb24gOiBtVmlkZW9EZWNvZGVyR2VuZXJhdGlvbik7CisgICAgICAgICAgICBpbnQzMl90IHJlcXVlc3RlckdlbmVyYXRpb24gPSBjdXJyZW50RGVjb2RlckdlbmVyYXRpb24gLSAxOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmcmVxdWVzdGVyR2VuZXJhdGlvbikpOworCisgICAgICAgICAgICBpZiAocmVxdWVzdGVyR2VuZXJhdGlvbiAhPSBjdXJyZW50RGVjb2RlckdlbmVyYXRpb24pIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiZ290IG1lc3NhZ2UgZnJvbSBvbGQgJXMgZGVjb2RlciwgZ2VuZXJhdGlvbiglZDolZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIiwgcmVxdWVzdGVyR2VuZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnREZWNvZGVyR2VuZXJhdGlvbik7CisgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5OworICAgICAgICAgICAgICAgIGlmICghKG1zZy0+ZmluZE1lc3NhZ2UoInJlcGx5IiwgJnJlcGx5KSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJlcGx5LT5zZXRJbnQzMigiZXJyIiwgSU5GT19ESVNDT05USU5VSVRZKTsKKyAgICAgICAgICAgICAgICByZXBseS0+cG9zdCgpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50MzJfdCB3aGF0OworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoIndoYXQiLCAmd2hhdCkpOworCisgICAgICAgICAgICBpZiAod2hhdCA9PSBEZWNvZGVyQmFzZTo6a1doYXRJbnB1dERpc2NvbnRpbnVpdHkpIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGZvcm1hdENoYW5nZTsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZm9ybWF0Q2hhbmdlIiwgJmZvcm1hdENoYW5nZSkpOworCisgICAgICAgICAgICAgICAgQUxPR1YoIiVzIGRpc2NvbnRpbnVpdHk6IGZvcm1hdENoYW5nZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iLCBmb3JtYXRDaGFuZ2UpOworCisgICAgICAgICAgICAgICAgaWYgKGZvcm1hdENoYW5nZSkgeworICAgICAgICAgICAgICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmx1c2hEZWNvZGVyQWN0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbyA/IEZMVVNIX0NNRF9TSFVURE9XTiA6IEZMVVNIX0NNRF9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbyA/IEZMVVNIX0NNRF9OT05FIDogRkxVU0hfQ01EX1NIVVRET1dOKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbURlZmVycmVkQWN0aW9ucy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU2ltcGxlQWN0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTnVQbGF5ZXIyOjpwZXJmb3JtU2NhblNvdXJjZXMpKTsKKworICAgICAgICAgICAgICAgIHByb2Nlc3NEZWZlcnJlZEFjdGlvbnMoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBEZWNvZGVyQmFzZTo6a1doYXRFT1MpIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGVycjsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZXJyIiwgJmVycikpOworCisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJnb3QgJXMgZGVjb2RlciBFT1MiLCBhdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiZ290ICVzIGRlY29kZXIgRU9TIHcvIGVycm9yICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbVJlbmRlcmVyLT5xdWV1ZUVPUyhhdWRpbywgZXJyKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBEZWNvZGVyQmFzZTo6a1doYXRGbHVzaENvbXBsZXRlZCkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJkZWNvZGVyICVzIGZsdXNoIGNvbXBsZXRlZCIsIGF1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIpOworCisgICAgICAgICAgICAgICAgaGFuZGxlRmx1c2hDb21wbGV0ZShhdWRpbywgdHJ1ZSAvKiBpc0RlY29kZXIgKi8pOworICAgICAgICAgICAgICAgIGZpbmlzaEZsdXNoSWZQb3NzaWJsZSgpOworICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IERlY29kZXJCYXNlOjprV2hhdFZpZGVvU2l6ZUNoYW5nZWQpIHsKKyAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gZm9ybWF0OworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoImZvcm1hdCIsICZmb3JtYXQpKTsKKworICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBpbnB1dEZvcm1hdCA9CisgICAgICAgICAgICAgICAgICAgICAgICBtU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyogYXVkaW8gKi8pOworCisgICAgICAgICAgICAgICAgc2V0VmlkZW9TY2FsaW5nTW9kZShtVmlkZW9TY2FsaW5nTW9kZSk7CisgICAgICAgICAgICAgICAgdXBkYXRlVmlkZW9TaXplKGlucHV0Rm9ybWF0LCBmb3JtYXQpOworICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IERlY29kZXJCYXNlOjprV2hhdFNodXRkb3duQ29tcGxldGVkKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzIHNodXRkb3duIGNvbXBsZXRlZCIsIGF1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIpOworICAgICAgICAgICAgICAgIGlmIChhdWRpbykgeworICAgICAgICAgICAgICAgICAgICBtQXVkaW9EZWNvZGVyLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIG1BdWRpb0RlY29kZXJFcnJvciA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICArK21BdWRpb0RlY29kZXJHZW5lcmF0aW9uOworCisgICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKChpbnQpbUZsdXNoaW5nQXVkaW8sIChpbnQpU0hVVFRJTkdfRE9XTl9ERUNPREVSKTsKKyAgICAgICAgICAgICAgICAgICAgbUZsdXNoaW5nQXVkaW8gPSBTSFVUX0RPV047CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbVZpZGVvRGVjb2Rlci5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICBtVmlkZW9EZWNvZGVyRXJyb3IgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgKyttVmlkZW9EZWNvZGVyR2VuZXJhdGlvbjsKKworICAgICAgICAgICAgICAgICAgICBDSEVDS19FUSgoaW50KW1GbHVzaGluZ1ZpZGVvLCAoaW50KVNIVVRUSU5HX0RPV05fREVDT0RFUik7CisgICAgICAgICAgICAgICAgICAgIG1GbHVzaGluZ1ZpZGVvID0gU0hVVF9ET1dOOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZpbmlzaEZsdXNoSWZQb3NzaWJsZSgpOworICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IERlY29kZXJCYXNlOjprV2hhdFJlc3VtZUNvbXBsZXRlZCkgeworICAgICAgICAgICAgICAgIGZpbmlzaFJlc3VtZSgpOworICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IERlY29kZXJCYXNlOjprV2hhdEVycm9yKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyOworICAgICAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImVyciIsICZlcnIpIHx8IGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICBlcnIgPSBVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIERlY29kZXIgZXJyb3JzIGNhbiBiZSBkdWUgdG8gU291cmNlIChlLmcuIGZyb20gc3RyZWFtaW5nKSwKKyAgICAgICAgICAgICAgICAvLyBvciBmcm9tIGRlY29kaW5nIGNvcnJ1cHRlZCBiaXRzdHJlYW1zLCBvciBmcm9tIG90aGVyIGRlY29kZXIKKyAgICAgICAgICAgICAgICAvLyBNZWRpYUNvZGVjIG9wZXJhdGlvbnMgKGUuZy4gZnJvbSBhbiBvbmdvaW5nIHJlc2V0IG9yIHNlZWspLgorICAgICAgICAgICAgICAgIC8vIFRoZXkgbWF5IGFsc28gYmUgZHVlIHRvIG9wZW5BdWRpb1NpbmsgZmFpbHVyZSBhdAorICAgICAgICAgICAgICAgIC8vIGRlY29kZXIgc3RhcnQgb3IgYWZ0ZXIgYSBmb3JtYXQgY2hhbmdlLgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gV2UgdHJ5IHRvIGdyYWNlZnVsbHkgc2h1dCBkb3duIHRoZSBhZmZlY3RlZCBkZWNvZGVyIGlmIHBvc3NpYmxlLAorICAgICAgICAgICAgICAgIC8vIHJhdGhlciB0aGFuIHRyeWluZyB0byBmb3JjZSB0aGUgc2h1dGRvd24gd2l0aCBzb21ldGhpbmcKKyAgICAgICAgICAgICAgICAvLyBzaW1pbGFyIHRvIHBlcmZvcm1SZXNldCgpLiBUaGlzIG1ldGhvZCBjYW4gbGVhZCB0byBhIGhhbmcKKyAgICAgICAgICAgICAgICAvLyBpZiBNZWRpYUNvZGVjIGZ1bmN0aW9ucyBibG9jayBhZnRlciBhbiBlcnJvciwgYnV0IHRoZXkgc2hvdWxkCisgICAgICAgICAgICAgICAgLy8gdHlwaWNhbGx5IHJldHVybiBJTlZBTElEX09QRVJBVElPTiBpbnN0ZWFkIG9mIGJsb2NraW5nLgorCisgICAgICAgICAgICAgICAgRmx1c2hTdGF0dXMgKmZsdXNoaW5nID0gYXVkaW8gPyAmbUZsdXNoaW5nQXVkaW8gOiAmbUZsdXNoaW5nVmlkZW87CisgICAgICAgICAgICAgICAgQUxPR0UoInJlY2VpdmVkIGVycm9yKCUjeCkgZnJvbSAlcyBkZWNvZGVyLCBmbHVzaGluZyglZCksIG5vdyBzaHV0dGluZyBkb3duIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVyciwgYXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIiwgKmZsdXNoaW5nKTsKKworICAgICAgICAgICAgICAgIHN3aXRjaCAoKmZsdXNoaW5nKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTk9ORToKKyAgICAgICAgICAgICAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmx1c2hEZWNvZGVyQWN0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8gPyBGTFVTSF9DTURfU0hVVERPV04gOiBGTFVTSF9DTURfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvID8gRkxVU0hfQ01EX05PTkUgOiBGTFVTSF9DTURfU0hVVERPV04pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NEZWZlcnJlZEFjdGlvbnMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEZMVVNISU5HX0RFQ09ERVI6CisgICAgICAgICAgICAgICAgICAgICAgICAqZmx1c2hpbmcgPSBGTFVTSElOR19ERUNPREVSX1NIVVRET1dOOyAvLyBpbml0aWF0ZSBzaHV0ZG93biBhZnRlciBmbHVzaC4KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBXYWl0IGZvciBmbHVzaCB0byBjb21wbGV0ZS4KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGTFVTSElOR19ERUNPREVSX1NIVVRET1dOOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8vIFdhaXQgZm9yIGZsdXNoIHRvIGNvbXBsZXRlLgorICAgICAgICAgICAgICAgICAgICBjYXNlIFNIVVRUSU5HX0RPV05fREVDT0RFUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBXYWl0IGZvciBzaHV0ZG93biB0byBjb21wbGV0ZS4KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGTFVTSEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGVjb2RlcihhdWRpbyktPmluaXRpYXRlU2h1dGRvd24oKTsgLy8gSW4gdGhlIG1pZGRsZSBvZiBhIHNlZWsuCisgICAgICAgICAgICAgICAgICAgICAgICAqZmx1c2hpbmcgPSBTSFVUVElOR19ET1dOX0RFQ09ERVI7ICAgICAvLyBTaHV0IGRvd24uCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTSFVUX0RPV046CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hGbHVzaElmUG9zc2libGUoKTsgIC8vIFNob3VsZCBub3Qgb2NjdXIuCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgIC8vIEZpbmlzaCBhbnl3YXlzLgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobVNvdXJjZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChhdWRpbykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1WaWRlb0RlY29kZXJFcnJvciB8fCBtU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyogYXVkaW8gKi8pID09IE5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbU5hdGl2ZVdpbmRvdyA9PSBOVUxMIHx8IG1OYXRpdmVXaW5kb3ctPmdldEFOYXRpdmVXaW5kb3coKSA9PSBOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1WaWRlb0RlY29kZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gYm90aCBhdWRpbyBhbmQgdmlkZW8gaGF2ZSBlcnJvciwgb3IgdGhpcyBzdHJlYW0gaGFzIG9ubHkgYXVkaW8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCBoYXMgZXJyb3IsIG5vdGlmeSBjbGllbnQgb2YgZXJyb3IuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoTUVESUEyX0VSUk9SLCBNRURJQTJfRVJST1JfVU5LTk9XTiwgZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBhdWRpbyB0cmFjayBoYXMgZXJyb3IuIFZpZGVvIHRyYWNrIGNvdWxkIGJlIHN0aWxsIGdvb2QgdG8gcGxheS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihNRURJQTJfSU5GTywgTUVESUEyX0lORk9fUExBWV9BVURJT19FUlJPUiwgZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb0RlY29kZXJFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUF1ZGlvRGVjb2RlckVycm9yIHx8IG1Tb3VyY2UtPmdldEZvcm1hdCh0cnVlIC8qIGF1ZGlvICovKSA9PSBOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1BdWRpb1NpbmsgPT0gTlVMTCB8fCBtQXVkaW9EZWNvZGVyID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIGJvdGggYXVkaW8gYW5kIHZpZGVvIGhhdmUgZXJyb3IsIG9yIHRoaXMgc3RyZWFtIGhhcyBvbmx5IHZpZGVvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggaGFzIGVycm9yLCBub3RpZnkgY2xpZW50IG9mIGVycm9yLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKE1FRElBMl9FUlJPUiwgTUVESUEyX0VSUk9SX1VOS05PV04sIGVycik7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgdmlkZW8gdHJhY2sgaGFzIGVycm9yLiBBdWRpbyB0cmFjayBjb3VsZCBiZSBzdGlsbCBnb29kIHRvIHBsYXkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoTUVESUEyX0lORk8sIE1FRElBMl9JTkZPX1BMQVlfVklERU9fRVJST1IsIGVycik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBtVmlkZW9EZWNvZGVyRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiVW5oYW5kbGVkIGRlY29kZXIgbm90aWZpY2F0aW9uICVkICclYyVjJWMlYycuIiwKKyAgICAgICAgICAgICAgICAgICAgICB3aGF0LAorICAgICAgICAgICAgICAgICAgICAgIHdoYXQgPj4gMjQsCisgICAgICAgICAgICAgICAgICAgICAgKHdoYXQgPj4gMTYpICYgMHhmZiwKKyAgICAgICAgICAgICAgICAgICAgICAod2hhdCA+PiA4KSAmIDB4ZmYsCisgICAgICAgICAgICAgICAgICAgICAgd2hhdCAmIDB4ZmYpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRSZW5kZXJlck5vdGlmeToKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCByZXF1ZXN0ZXJHZW5lcmF0aW9uID0gbVJlbmRlcmVyR2VuZXJhdGlvbiAtIDE7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZ2VuZXJhdGlvbiIsICZyZXF1ZXN0ZXJHZW5lcmF0aW9uKSk7CisgICAgICAgICAgICBpZiAocmVxdWVzdGVyR2VuZXJhdGlvbiAhPSBtUmVuZGVyZXJHZW5lcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoImdvdCBtZXNzYWdlIGZyb20gb2xkIHJlbmRlcmVyLCBnZW5lcmF0aW9uKCVkOiVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZXJHZW5lcmF0aW9uLCBtUmVuZGVyZXJHZW5lcmF0aW9uKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludDMyX3Qgd2hhdDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ3aGF0IiwgJndoYXQpKTsKKworICAgICAgICAgICAgaWYgKHdoYXQgPT0gUmVuZGVyZXI6OmtXaGF0RU9TKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCBhdWRpbzsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiYXVkaW8iLCAmYXVkaW8pKTsKKworICAgICAgICAgICAgICAgIGludDMyX3QgZmluYWxSZXN1bHQ7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImZpbmFsUmVzdWx0IiwgJmZpbmFsUmVzdWx0KSk7CisKKyAgICAgICAgICAgICAgICBpZiAoYXVkaW8pIHsKKyAgICAgICAgICAgICAgICAgICAgbUF1ZGlvRU9TID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtVmlkZW9FT1MgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChmaW5hbFJlc3VsdCA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJyZWFjaGVkICVzIEVPUyIsIGF1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlcyB0cmFjayBlbmNvdW50ZXJlZCBhbiBlcnJvciAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iLCBmaW5hbFJlc3VsdCk7CisKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUEyX0VSUk9SLCBNRURJQTJfRVJST1JfVU5LTk9XTiwgZmluYWxSZXN1bHQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgobUF1ZGlvRU9TIHx8IG1BdWRpb0RlY29kZXIgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIChtVmlkZW9FT1MgfHwgbVZpZGVvRGVjb2RlciA9PSBOVUxMKSkgeworICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihNRURJQTJfUExBWUJBQ0tfQ09NUExFVEUsIDAsIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBSZW5kZXJlcjo6a1doYXRGbHVzaENvbXBsZXRlKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCBhdWRpbzsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiYXVkaW8iLCAmYXVkaW8pKTsKKworICAgICAgICAgICAgICAgIGlmIChhdWRpbykgeworICAgICAgICAgICAgICAgICAgICBtQXVkaW9FT1MgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtVmlkZW9FT1MgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBBTE9HVigicmVuZGVyZXIgJXMgZmx1c2ggY29tcGxldGVkLiIsIGF1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIpOworICAgICAgICAgICAgICAgIGlmIChhdWRpbyAmJiAobUZsdXNoaW5nQXVkaW8gPT0gTk9ORSB8fCBtRmx1c2hpbmdBdWRpbyA9PSBGTFVTSEVECisgICAgICAgICAgICAgICAgICAgICAgICB8fCBtRmx1c2hpbmdBdWRpbyA9PSBTSFVUX0RPV04pKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEZsdXNoIGhhcyBiZWVuIGhhbmRsZWQgYnkgdGVhciBkb3duLgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaGFuZGxlRmx1c2hDb21wbGV0ZShhdWRpbywgZmFsc2UgLyogaXNEZWNvZGVyICovKTsKKyAgICAgICAgICAgICAgICBmaW5pc2hGbHVzaElmUG9zc2libGUoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBSZW5kZXJlcjo6a1doYXRWaWRlb1JlbmRlcmluZ1N0YXJ0KSB7CisgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoTUVESUEyX0lORk8sIE1FRElBMl9JTkZPX1JFTkRFUklOR19TVEFSVCwgMCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gUmVuZGVyZXI6OmtXaGF0TWVkaWFSZW5kZXJpbmdTdGFydCkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJtZWRpYSByZW5kZXJpbmcgc3RhcnRlZCIpOworICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKE1FRElBMl9TVEFSVEVELCAwLCAwKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBSZW5kZXJlcjo6a1doYXRBdWRpb1RlYXJEb3duKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCByZWFzb247CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInJlYXNvbiIsICZyZWFzb24pKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiVGVhciBkb3duIGF1ZGlvIHdpdGggcmVhc29uICVkLiIsIHJlYXNvbik7CisgICAgICAgICAgICAgICAgaWYgKHJlYXNvbiA9PSBSZW5kZXJlcjo6a0R1ZVRvVGltZW91dCAmJiAhKG1QYXVzZWQgJiYgbU9mZmxvYWRBdWRpbykpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGltZW91dFdoZW5QYXVzZWQgaXMgb25seSBmb3Igb2ZmbG9hZCBtb2RlLgorICAgICAgICAgICAgICAgICAgICBBTE9HVygiUmVjZWl2ZSBhIHN0YWxlIG1lc3NhZ2UgZm9yIHRlYXJkb3duLiIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50NjRfdCBwb3NpdGlvblVzOworICAgICAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50NjQoInBvc2l0aW9uVXMiLCAmcG9zaXRpb25VcykpIHsKKyAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25VcyA9IG1QcmV2aW91c1NlZWtUaW1lVXM7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmVzdGFydEF1ZGlvKAorICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25VcywgcmVhc29uID09IFJlbmRlcmVyOjprRm9yY2VOb25PZmZsb2FkIC8qIGZvcmNlTm9uT2ZmbG9hZCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbiAhPSBSZW5kZXJlcjo6a0R1ZVRvVGltZW91dCAvKiBuZWVkc1RvQ3JlYXRlQXVkaW9EZWNvZGVyICovKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdE1vcmVEYXRhUXVldWVkOgorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRSZXNldDoKKyAgICAgICAgeworICAgICAgICAgICAgQUxPR1YoImtXaGF0UmVzZXQiKTsKKworICAgICAgICAgICAgbVJlc2V0dGluZyA9IHRydWU7CisgICAgICAgICAgICBzdG9wUGxheWJhY2tUaW1lcigia1doYXRSZXNldCIpOworICAgICAgICAgICAgc3RvcFJlYnVmZmVyaW5nVGltZXIodHJ1ZSk7CisKKyAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICBuZXcgRmx1c2hEZWNvZGVyQWN0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgRkxVU0hfQ01EX1NIVVRET1dOIC8qIGF1ZGlvICovLAorICAgICAgICAgICAgICAgICAgICAgICAgRkxVU0hfQ01EX1NIVVRET1dOIC8qIHZpZGVvICovKSk7CisKKyAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICBuZXcgU2ltcGxlQWN0aW9uKCZOdVBsYXllcjI6OnBlcmZvcm1SZXNldCkpOworCisgICAgICAgICAgICBwcm9jZXNzRGVmZXJyZWRBY3Rpb25zKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXROb3RpZnlUaW1lOgorICAgICAgICB7CisgICAgICAgICAgICBBTE9HVigia1doYXROb3RpZnlUaW1lIik7CisgICAgICAgICAgICBpbnQ2NF90IHRpbWVyVXM7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgidGltZXJVcyIsICZ0aW1lclVzKSk7CisKKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKE1FRElBMl9OT1RJRllfVElNRSwgdGltZXJVcywgMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRTZWVrOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQ2NF90IHNlZWtUaW1lVXM7CisgICAgICAgICAgICBpbnQzMl90IG1vZGU7CisgICAgICAgICAgICBpbnQzMl90IG5lZWROb3RpZnk7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgic2Vla1RpbWVVcyIsICZzZWVrVGltZVVzKSk7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigibW9kZSIsICZtb2RlKSk7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigibmVlZE5vdGlmeSIsICZuZWVkTm90aWZ5KSk7CisKKyAgICAgICAgICAgIEFMT0dWKCJrV2hhdFNlZWsgc2Vla1RpbWVVcz0lbGxkIHVzLCBtb2RlPSVkLCBuZWVkTm90aWZ5PSVkIiwKKyAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylzZWVrVGltZVVzLCBtb2RlLCBuZWVkTm90aWZ5KTsKKworICAgICAgICAgICAgaWYgKCFtU3RhcnRlZCkgeworICAgICAgICAgICAgICAgIC8vIFNlZWsgYmVmb3JlIHRoZSBwbGF5ZXIgaXMgc3RhcnRlZC4gSW4gb3JkZXIgdG8gcHJldmlldyB2aWRlbywKKyAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIHN0YXJ0IHRoZSBwbGF5ZXIgYW5kIHBhdXNlIGl0LiBUaGlzIGJyYW5jaCBpcyBjYWxsZWQKKyAgICAgICAgICAgICAgICAvLyBvbmx5IG9uY2UgaWYgbmVlZGVkLiBBZnRlciB0aGUgcGxheWVyIGlzIHN0YXJ0ZWQsIGFueSBzZWVrCisgICAgICAgICAgICAgICAgLy8gb3BlcmF0aW9uIHdpbGwgZ28gdGhyb3VnaCBub3JtYWwgcGF0aC4KKyAgICAgICAgICAgICAgICAvLyBBdWRpby1vbmx5IGNhc2VzIGFyZSBoYW5kbGVkIHNlcGFyYXRlbHkuCisgICAgICAgICAgICAgICAgb25TdGFydChzZWVrVGltZVVzLCAoTWVkaWFQbGF5ZXIyU2Vla01vZGUpbW9kZSk7CisgICAgICAgICAgICAgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgICAgICAgICAgICAgIG9uUGF1c2UoKTsKKyAgICAgICAgICAgICAgICAgICAgbVBhdXNlZEJ5Q2xpZW50ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG5lZWROb3RpZnkpIHsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5RHJpdmVyU2Vla0NvbXBsZXRlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgbmV3IEZsdXNoRGVjb2RlckFjdGlvbihGTFVTSF9DTURfRkxVU0ggLyogYXVkaW8gKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkxVU0hfQ01EX0ZMVVNIIC8qIHZpZGVvICovKSk7CisKKyAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICBuZXcgU2Vla0FjdGlvbihzZWVrVGltZVVzLCAoTWVkaWFQbGF5ZXIyU2Vla01vZGUpbW9kZSkpOworCisgICAgICAgICAgICAvLyBBZnRlciBhIGZsdXNoIHdpdGhvdXQgc2h1dGRvd24sIGRlY29kZXIgaXMgcGF1c2VkLgorICAgICAgICAgICAgLy8gRG9uJ3QgcmVzdW1lIGl0IHVudGlsIHNvdXJjZSBzZWVrIGlzIGRvbmUsIG90aGVyd2lzZSBpdCBjb3VsZAorICAgICAgICAgICAgLy8gc3RhcnQgcHVsbGluZyBzdGFsZSBkYXRhIHRvbyBzb29uLgorICAgICAgICAgICAgbURlZmVycmVkQWN0aW9ucy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgIG5ldyBSZXN1bWVEZWNvZGVyQWN0aW9uKG5lZWROb3RpZnkpKTsKKworICAgICAgICAgICAgcHJvY2Vzc0RlZmVycmVkQWN0aW9ucygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0UGF1c2U6CisgICAgICAgIHsKKyAgICAgICAgICAgIG9uUGF1c2UoKTsKKyAgICAgICAgICAgIG1QYXVzZWRCeUNsaWVudCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRTb3VyY2VOb3RpZnk6CisgICAgICAgIHsKKyAgICAgICAgICAgIG9uU291cmNlTm90aWZ5KG1zZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRDbG9zZWRDYXB0aW9uTm90aWZ5OgorICAgICAgICB7CisgICAgICAgICAgICBvbkNsb3NlZENhcHRpb25Ob3RpZnkobXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdFByZXBhcmVEcm06CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG9uUHJlcGFyZURybShtc2cpOworCisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoInN0YXR1cyIsIHN0YXR1cyk7CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRSZWxlYXNlRHJtOgorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBvblJlbGVhc2VEcm0oKTsKKworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOworICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJzdGF0dXMiLCBzdGF0dXMpOworICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CisgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgVFJFU1BBU1MoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjI6Om9uUmVzdW1lKCkgeworICAgIGlmICghbVBhdXNlZCB8fCBtUmVzZXR0aW5nKSB7CisgICAgICAgIEFMT0dEX0lGKG1SZXNldHRpbmcsICJyZXNldHRpbmcsIG9uUmVzdW1lIGRpc2NhcmRlZCIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1QYXVzZWQgPSBmYWxzZTsKKyAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgIG1Tb3VyY2UtPnJlc3VtZSgpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dXKCJyZXN1bWUgY2FsbGVkIHdoZW4gc291cmNlIGlzIGdvbmUgb3Igbm90IHNldCIpOworICAgIH0KKyAgICAvLyB8bUF1ZGlvRGVjb2RlcnwgbWF5IGhhdmUgYmVlbiByZWxlYXNlZCBkdWUgdG8gdGhlIHBhdXNlIHRpbWVvdXQsIHNvIHJlLWNyZWF0ZSBpdCBpZgorICAgIC8vIG5lZWRlZC4KKyAgICBpZiAoYXVkaW9EZWNvZGVyU3RpbGxOZWVkZWQoKSAmJiBtQXVkaW9EZWNvZGVyID09IE5VTEwpIHsKKyAgICAgICAgaW5zdGFudGlhdGVEZWNvZGVyKHRydWUgLyogYXVkaW8gKi8sICZtQXVkaW9EZWNvZGVyKTsKKyAgICB9CisgICAgaWYgKG1SZW5kZXJlciAhPSBOVUxMKSB7CisgICAgICAgIG1SZW5kZXJlci0+cmVzdW1lKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1coInJlc3VtZSBjYWxsZWQgd2hlbiByZW5kZXJlciBpcyBnb25lIG9yIG5vdCBzZXQiKTsKKyAgICB9CisKKyAgICBzdGFydFBsYXliYWNrVGltZXIoIm9ucmVzdW1lIik7Cit9CisKK3N0YXR1c190IE51UGxheWVyMjo6b25JbnN0YW50aWF0ZVNlY3VyZURlY29kZXJzKCkgeworICAgIHN0YXR1c190IGVycjsKKyAgICBpZiAoIShtU291cmNlRmxhZ3MgJiBTb3VyY2U6OkZMQUdfU0VDVVJFKSkgeworICAgICAgICByZXR1cm4gQkFEX1RZUEU7CisgICAgfQorCisgICAgaWYgKG1SZW5kZXJlciAhPSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJyZW5kZXJlciBzaG91bGQgbm90IGJlIHNldCB3aGVuIGluc3RhbnRpYXRpbmcgc2VjdXJlIGRlY29kZXJzIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIC8vIFRSSUNLWTogV2UgcmVseSBvbiBtUmVuZGVyZXIgYmVpbmcgbnVsbCwgc28gdGhhdCBkZWNvZGVyIGRvZXMgbm90IHN0YXJ0IHJlcXVlc3RpbmcKKyAgICAvLyBkYXRhIG9uIGluc3RhbnRpYXRpb24uCisgICAgaWYgKG1OYXRpdmVXaW5kb3cgIT0gTlVMTCAmJiBtTmF0aXZlV2luZG93LT5nZXRBTmF0aXZlV2luZG93KCkgIT0gTlVMTCkgeworICAgICAgICBlcnIgPSBpbnN0YW50aWF0ZURlY29kZXIoZmFsc2UsICZtVmlkZW9EZWNvZGVyKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtQXVkaW9TaW5rICE9IE5VTEwpIHsKKyAgICAgICAgZXJyID0gaW5zdGFudGlhdGVEZWNvZGVyKHRydWUsICZtQXVkaW9EZWNvZGVyKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpvblN0YXJ0KGludDY0X3Qgc3RhcnRQb3NpdGlvblVzLCBNZWRpYVBsYXllcjJTZWVrTW9kZSBtb2RlKSB7CisgICAgQUxPR1YoIm9uU3RhcnQ6IG1DcnlwdG86ICVwIiwgbUNyeXB0by5nZXQoKSk7CisKKyAgICBpZiAoIW1Tb3VyY2VTdGFydGVkKSB7CisgICAgICAgIG1Tb3VyY2VTdGFydGVkID0gdHJ1ZTsKKyAgICAgICAgbVNvdXJjZS0+c3RhcnQoKTsKKyAgICB9CisgICAgaWYgKHN0YXJ0UG9zaXRpb25VcyA+IDApIHsKKyAgICAgICAgcGVyZm9ybVNlZWsoc3RhcnRQb3NpdGlvblVzLCBtb2RlKTsKKyAgICAgICAgaWYgKG1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKiBhdWRpbyAqLykgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgbU9mZmxvYWRBdWRpbyA9IGZhbHNlOworICAgIG1BdWRpb0VPUyA9IGZhbHNlOworICAgIG1WaWRlb0VPUyA9IGZhbHNlOworICAgIG1TdGFydGVkID0gdHJ1ZTsKKyAgICBtUGF1c2VkID0gZmFsc2U7CisKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisKKyAgICBpZiAobVNvdXJjZS0+aXNSZWFsVGltZSgpKSB7CisgICAgICAgIGZsYWdzIHw9IFJlbmRlcmVyOjpGTEFHX1JFQUxfVElNRTsKKyAgICB9CisKKyAgICBib29sIGhhc0F1ZGlvID0gKG1Tb3VyY2UtPmdldEZvcm1hdCh0cnVlIC8qIGF1ZGlvICovKSAhPSBOVUxMKTsKKyAgICBib29sIGhhc1ZpZGVvID0gKG1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKiBhdWRpbyAqLykgIT0gTlVMTCk7CisgICAgaWYgKCFoYXNBdWRpbyAmJiAhaGFzVmlkZW8pIHsKKyAgICAgICAgQUxPR0UoIm5vIG1ldGFkYXRhIGZvciBlaXRoZXIgYXVkaW8gb3IgdmlkZW8gc291cmNlIik7CisgICAgICAgIG1Tb3VyY2UtPnN0b3AoKTsKKyAgICAgICAgbVNvdXJjZVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICAgICAgbm90aWZ5TGlzdGVuZXIoTUVESUEyX0VSUk9SLCBNRURJQTJfRVJST1JfVU5LTk9XTiwgRVJST1JfTUFMRk9STUVEKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBTE9HVl9JRighaGFzQXVkaW8sICJubyBtZXRhZGF0YSBmb3IgYXVkaW8gc291cmNlIik7ICAvLyB2aWRlbyBvbmx5IHN0cmVhbQorCisgICAgc3A8TWV0YURhdGE+IGF1ZGlvTWV0YSA9IG1Tb3VyY2UtPmdldEZvcm1hdE1ldGEodHJ1ZSAvKiBhdWRpbyAqLyk7CisKKyAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fTVVTSUM7CisgICAgaWYgKG1BdWRpb1NpbmsgIT0gTlVMTCkgeworICAgICAgICBzdHJlYW1UeXBlID0gbUF1ZGlvU2luay0+Z2V0QXVkaW9TdHJlYW1UeXBlKCk7CisgICAgfQorCisgICAgbU9mZmxvYWRBdWRpbyA9CisgICAgICAgIGNhbk9mZmxvYWRTdHJlYW0oYXVkaW9NZXRhLCBoYXNWaWRlbywgbVNvdXJjZS0+aXNTdHJlYW1pbmcoKSwgc3RyZWFtVHlwZSkKKyAgICAgICAgICAgICAgICAmJiAobVBsYXliYWNrU2V0dGluZ3MubVNwZWVkID09IDEuZiAmJiBtUGxheWJhY2tTZXR0aW5ncy5tUGl0Y2ggPT0gMS5mKTsKKworICAgIC8vIE1vZHVsYXIgRFJNOiBEaXNhYmxpbmcgYXVkaW8gb2ZmbG9hZCBpZiB0aGUgc291cmNlIGlzIHByb3RlY3RlZAorICAgIGlmIChtT2ZmbG9hZEF1ZGlvICYmIG1Jc0RybVByb3RlY3RlZCkgeworICAgICAgICBtT2ZmbG9hZEF1ZGlvID0gZmFsc2U7CisgICAgICAgIEFMT0dWKCJvblN0YXJ0OiBEaXNhYmxpbmcgbU9mZmxvYWRBdWRpbyBub3cgdGhhdCB0aGUgc291cmNlIGlzIHByb3RlY3RlZC4iKTsKKyAgICB9CisKKyAgICBpZiAobU9mZmxvYWRBdWRpbykgeworICAgICAgICBmbGFncyB8PSBSZW5kZXJlcjo6RkxBR19PRkZMT0FEX0FVRElPOworICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZW5kZXJlck5vdGlmeSwgdGhpcyk7CisgICAgKyttUmVuZGVyZXJHZW5lcmF0aW9uOworICAgIG5vdGlmeS0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtUmVuZGVyZXJHZW5lcmF0aW9uKTsKKyAgICBtUmVuZGVyZXIgPSBuZXcgUmVuZGVyZXIobUF1ZGlvU2luaywgbU1lZGlhQ2xvY2ssIG5vdGlmeSwgZmxhZ3MpOworICAgIG1SZW5kZXJlckxvb3BlciA9IG5ldyBBTG9vcGVyOworICAgIG1SZW5kZXJlckxvb3Blci0+c2V0TmFtZSgiTnVQbGF5ZXJSZW5kZXJlciIpOworICAgIG1SZW5kZXJlckxvb3Blci0+c3RhcnQoZmFsc2UsIGZhbHNlLCBBTkRST0lEX1BSSU9SSVRZX0FVRElPKTsKKyAgICBtUmVuZGVyZXJMb29wZXItPnJlZ2lzdGVySGFuZGxlcihtUmVuZGVyZXIpOworCisgICAgc3RhdHVzX3QgZXJyID0gbVJlbmRlcmVyLT5zZXRQbGF5YmFja1NldHRpbmdzKG1QbGF5YmFja1NldHRpbmdzKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIG1Tb3VyY2UtPnN0b3AoKTsKKyAgICAgICAgbVNvdXJjZVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICAgICAgbm90aWZ5TGlzdGVuZXIoTUVESUEyX0VSUk9SLCBNRURJQTJfRVJST1JfVU5LTk9XTiwgZXJyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZsb2F0IHJhdGUgPSBnZXRGcmFtZVJhdGUoKTsKKyAgICBpZiAocmF0ZSA+IDApIHsKKyAgICAgICAgbVJlbmRlcmVyLT5zZXRWaWRlb0ZyYW1lUmF0ZShyYXRlKTsKKyAgICB9CisKKyAgICBpZiAobVZpZGVvRGVjb2RlciAhPSBOVUxMKSB7CisgICAgICAgIG1WaWRlb0RlY29kZXItPnNldFJlbmRlcmVyKG1SZW5kZXJlcik7CisgICAgfQorICAgIGlmIChtQXVkaW9EZWNvZGVyICE9IE5VTEwpIHsKKyAgICAgICAgbUF1ZGlvRGVjb2Rlci0+c2V0UmVuZGVyZXIobVJlbmRlcmVyKTsKKyAgICB9CisKKyAgICBzdGFydFBsYXliYWNrVGltZXIoIm9uc3RhcnQiKTsKKworICAgIHBvc3RTY2FuU291cmNlcygpOworfQorCit2b2lkIE51UGxheWVyMjo6c3RhcnRQbGF5YmFja1RpbWVyKGNvbnN0IGNoYXIgKndoZXJlKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1QbGF5aW5nVGltZUxvY2spOworICAgIGlmIChtTGFzdFN0YXJ0ZWRQbGF5aW5nVGltZU5zID09IDApIHsKKyAgICAgICAgbUxhc3RTdGFydGVkUGxheWluZ1RpbWVOcyA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgQUxPR1YoInN0YXJ0UGxheWJhY2tUaW1lcigpIHRpbWUgJTIwIiBQUklkNjQgIiAoJXMpIiwgIG1MYXN0U3RhcnRlZFBsYXlpbmdUaW1lTnMsIHdoZXJlKTsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpzdG9wUGxheWJhY2tUaW1lcihjb25zdCBjaGFyICp3aGVyZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtUGxheWluZ1RpbWVMb2NrKTsKKworICAgIEFMT0dWKCJzdG9wUGxheWJhY2tUaW1lcigpICB0aW1lICUyMCIgUFJJZDY0ICIgKCVzKSIsIG1MYXN0U3RhcnRlZFBsYXlpbmdUaW1lTnMsIHdoZXJlKTsKKworICAgIGlmIChtTGFzdFN0YXJ0ZWRQbGF5aW5nVGltZU5zICE9IDApIHsKKyAgICAgICAgc3A8TnVQbGF5ZXIyRHJpdmVyPiBkcml2ZXIgPSBtRHJpdmVyLnByb21vdGUoKTsKKyAgICAgICAgaWYgKGRyaXZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBpbnQ2NF90IG5vdyA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgICAgIGludDY0X3QgcGxheWVkID0gbm93IC0gbUxhc3RTdGFydGVkUGxheWluZ1RpbWVOczsKKyAgICAgICAgICAgIEFMT0dWKCJzdG9wUGxheWJhY2tUaW1lcigpICBsb2cgICUyMCIgUFJJZDY0ICIiLCBwbGF5ZWQpOworCisgICAgICAgICAgICBpZiAocGxheWVkID4gMCkgeworICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5TW9yZVBsYXlpbmdUaW1lVXMoKHBsYXllZCs1MDApLzEwMDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1MYXN0U3RhcnRlZFBsYXlpbmdUaW1lTnMgPSAwOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjI6OnN0YXJ0UmVidWZmZXJpbmdUaW1lcigpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVBsYXlpbmdUaW1lTG9jayk7CisgICAgaWYgKG1MYXN0U3RhcnRlZFJlYnVmZmVyaW5nVGltZU5zID09IDApIHsKKyAgICAgICAgbUxhc3RTdGFydGVkUmVidWZmZXJpbmdUaW1lTnMgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgIEFMT0dWKCJzdGFydFJlYnVmZmVyaW5nVGltZXIoKSB0aW1lICUyMCIgUFJJZDY0ICIiLCAgbUxhc3RTdGFydGVkUmVidWZmZXJpbmdUaW1lTnMpOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjI6OnN0b3BSZWJ1ZmZlcmluZ1RpbWVyKGJvb2wgZXhpdGluZ1BsYXliYWNrKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1QbGF5aW5nVGltZUxvY2spOworCisgICAgQUxPR1YoInN0b3BSZWJ1ZmZlclRpbWVyKCkgIHRpbWUgJTIwIiBQUklkNjQgIiAoZXhpdGluZyAlZCkiLCBtTGFzdFN0YXJ0ZWRSZWJ1ZmZlcmluZ1RpbWVOcywgZXhpdGluZ1BsYXliYWNrKTsKKworICAgIGlmIChtTGFzdFN0YXJ0ZWRSZWJ1ZmZlcmluZ1RpbWVOcyAhPSAwKSB7CisgICAgICAgIHNwPE51UGxheWVyMkRyaXZlcj4gZHJpdmVyID0gbURyaXZlci5wcm9tb3RlKCk7CisgICAgICAgIGlmIChkcml2ZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgaW50NjRfdCBub3cgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgICAgICBpbnQ2NF90IHJlYnVmZmVyZWQgPSBub3cgLSBtTGFzdFN0YXJ0ZWRSZWJ1ZmZlcmluZ1RpbWVOczsKKyAgICAgICAgICAgIEFMT0dWKCJzdG9wUmVidWZmZXJpbmdUaW1lcigpICBsb2cgICUyMCIgUFJJZDY0ICIiLCByZWJ1ZmZlcmVkKTsKKworICAgICAgICAgICAgaWYgKHJlYnVmZmVyZWQgPiAwKSB7CisgICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlNb3JlUmVidWZmZXJpbmdUaW1lVXMoKHJlYnVmZmVyZWQrNTAwKS8xMDAwKTsKKyAgICAgICAgICAgICAgICBpZiAoZXhpdGluZ1BsYXliYWNrKSB7CisgICAgICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5UmVidWZmZXJpbmdXaGVuRXhpdCh0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUxhc3RTdGFydGVkUmVidWZmZXJpbmdUaW1lTnMgPSAwOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjI6Om9uUGF1c2UoKSB7CisKKyAgICBzdG9wUGxheWJhY2tUaW1lcigib25QYXVzZSIpOworCisgICAgaWYgKG1QYXVzZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtUGF1c2VkID0gdHJ1ZTsKKyAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgIG1Tb3VyY2UtPnBhdXNlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1coInBhdXNlIGNhbGxlZCB3aGVuIHNvdXJjZSBpcyBnb25lIG9yIG5vdCBzZXQiKTsKKyAgICB9CisgICAgaWYgKG1SZW5kZXJlciAhPSBOVUxMKSB7CisgICAgICAgIG1SZW5kZXJlci0+cGF1c2UoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVygicGF1c2UgY2FsbGVkIHdoZW4gcmVuZGVyZXIgaXMgZ29uZSBvciBub3Qgc2V0Iik7CisgICAgfQorCit9CisKK2Jvb2wgTnVQbGF5ZXIyOjphdWRpb0RlY29kZXJTdGlsbE5lZWRlZCgpIHsKKyAgICAvLyBBdWRpbyBkZWNvZGVyIGlzIG5vIGxvbmdlciBuZWVkZWQgaWYgaXQncyBpbiBzaHV0L3NodXR0aW5nIGRvd24gc3RhdHVzLgorICAgIHJldHVybiAoKG1GbHVzaGluZ0F1ZGlvICE9IFNIVVRfRE9XTikgJiYgKG1GbHVzaGluZ0F1ZGlvICE9IFNIVVRUSU5HX0RPV05fREVDT0RFUikpOworfQorCit2b2lkIE51UGxheWVyMjo6aGFuZGxlRmx1c2hDb21wbGV0ZShib29sIGF1ZGlvLCBib29sIGlzRGVjb2RlcikgeworICAgIC8vIFdlIHdhaXQgZm9yIGJvdGggdGhlIGRlY29kZXIgZmx1c2ggYW5kIHRoZSByZW5kZXJlciBmbHVzaCB0byBjb21wbGV0ZQorICAgIC8vIGJlZm9yZSBlbnRlcmluZyBlaXRoZXIgdGhlIEZMVVNIRUQgb3IgdGhlIFNIVVRUSU5HX0RPV05fREVDT0RFUiBzdGF0ZS4KKworICAgIG1GbHVzaENvbXBsZXRlW2F1ZGlvXVtpc0RlY29kZXJdID0gdHJ1ZTsKKyAgICBpZiAoIW1GbHVzaENvbXBsZXRlW2F1ZGlvXVshaXNEZWNvZGVyXSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgRmx1c2hTdGF0dXMgKnN0YXRlID0gYXVkaW8gPyAmbUZsdXNoaW5nQXVkaW8gOiAmbUZsdXNoaW5nVmlkZW87CisgICAgc3dpdGNoICgqc3RhdGUpIHsKKyAgICAgICAgY2FzZSBGTFVTSElOR19ERUNPREVSOgorICAgICAgICB7CisgICAgICAgICAgICAqc3RhdGUgPSBGTFVTSEVEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEZMVVNISU5HX0RFQ09ERVJfU0hVVERPV046CisgICAgICAgIHsKKyAgICAgICAgICAgICpzdGF0ZSA9IFNIVVRUSU5HX0RPV05fREVDT0RFUjsKKworICAgICAgICAgICAgQUxPR1YoImluaXRpYXRpbmcgJXMgZGVjb2RlciBzaHV0ZG93biIsIGF1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIpOworICAgICAgICAgICAgZ2V0RGVjb2RlcihhdWRpbyktPmluaXRpYXRlU2h1dGRvd24oKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8vIGRlY29kZXIgZmx1c2ggY29tcGxldGVzIG9ubHkgb2NjdXIgaW4gYSBmbHVzaGluZyBzdGF0ZS4KKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoaXNEZWNvZGVyLCAiZGVjb2RlciBmbHVzaCBpbiBpbnZhbGlkIHN0YXRlICVkIiwgKnN0YXRlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjI6OmZpbmlzaEZsdXNoSWZQb3NzaWJsZSgpIHsKKyAgICBpZiAobUZsdXNoaW5nQXVkaW8gIT0gTk9ORSAmJiBtRmx1c2hpbmdBdWRpbyAhPSBGTFVTSEVECisgICAgICAgICAgICAmJiBtRmx1c2hpbmdBdWRpbyAhPSBTSFVUX0RPV04pIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtRmx1c2hpbmdWaWRlbyAhPSBOT05FICYmIG1GbHVzaGluZ1ZpZGVvICE9IEZMVVNIRUQKKyAgICAgICAgICAgICYmIG1GbHVzaGluZ1ZpZGVvICE9IFNIVVRfRE9XTikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQUxPR1YoImJvdGggYXVkaW8gYW5kIHZpZGVvIGFyZSBmbHVzaGVkIG5vdy4iKTsKKworICAgIG1GbHVzaGluZ0F1ZGlvID0gTk9ORTsKKyAgICBtRmx1c2hpbmdWaWRlbyA9IE5PTkU7CisKKyAgICBjbGVhckZsdXNoQ29tcGxldGUoKTsKKworICAgIHByb2Nlc3NEZWZlcnJlZEFjdGlvbnMoKTsKK30KKwordm9pZCBOdVBsYXllcjI6OnBvc3RTY2FuU291cmNlcygpIHsKKyAgICBpZiAobVNjYW5Tb3VyY2VzUGVuZGluZykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNjYW5Tb3VyY2VzLCB0aGlzKTsKKyAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbVNjYW5Tb3VyY2VzR2VuZXJhdGlvbik7CisgICAgbXNnLT5wb3N0KCk7CisKKyAgICBtU2NhblNvdXJjZXNQZW5kaW5nID0gdHJ1ZTsKK30KKwordm9pZCBOdVBsYXllcjI6OnRyeU9wZW5BdWRpb1NpbmtGb3JPZmZsb2FkKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwgY29uc3Qgc3A8TWV0YURhdGE+ICZhdWRpb01ldGEsIGJvb2wgaGFzVmlkZW8pIHsKKyAgICAvLyBOb3RlOiBUaGlzIGlzIGNhbGxlZCBlYXJseSBpbiBOdVBsYXllcjIgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb2ZmbG9hZGluZworICAgIC8vIGlzIHBvc3NpYmxlOyBvdGhlcndpc2UgdGhlIGRlY29kZXJzIGNhbGwgdGhlIHJlbmRlcmVyIG9wZW5BdWRpb1NpbmsgZGlyZWN0bHkuCisKKyAgICBzdGF0dXNfdCBlcnIgPSBtUmVuZGVyZXItPm9wZW5BdWRpb1NpbmsoCisgICAgICAgICAgICBmb3JtYXQsIHRydWUgLyogb2ZmbG9hZE9ubHkgKi8sIGhhc1ZpZGVvLAorICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwgJm1PZmZsb2FkQXVkaW8sIG1Tb3VyY2UtPmlzU3RyZWFtaW5nKCkpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgLy8gQW55IGZhaWx1cmUgd2UgdHVybiBvZmYgbU9mZmxvYWRBdWRpby4KKyAgICAgICAgbU9mZmxvYWRBdWRpbyA9IGZhbHNlOworICAgIH0gZWxzZSBpZiAobU9mZmxvYWRBdWRpbykgeworICAgICAgICBzZW5kTWV0YURhdGFUb0hhbChtQXVkaW9TaW5rLCBhdWRpb01ldGEpOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjI6OmNsb3NlQXVkaW9TaW5rKCkgeworICAgIG1SZW5kZXJlci0+Y2xvc2VBdWRpb1NpbmsoKTsKK30KKwordm9pZCBOdVBsYXllcjI6OnJlc3RhcnRBdWRpbygKKyAgICAgICAgaW50NjRfdCBjdXJyZW50UG9zaXRpb25VcywgYm9vbCBmb3JjZU5vbk9mZmxvYWQsIGJvb2wgbmVlZHNUb0NyZWF0ZUF1ZGlvRGVjb2RlcikgeworICAgIGlmIChtQXVkaW9EZWNvZGVyICE9IE5VTEwpIHsKKyAgICAgICAgbUF1ZGlvRGVjb2Rlci0+cGF1c2UoKTsKKyAgICAgICAgbUF1ZGlvRGVjb2Rlci5jbGVhcigpOworICAgICAgICBtQXVkaW9EZWNvZGVyRXJyb3IgPSBmYWxzZTsKKyAgICAgICAgKyttQXVkaW9EZWNvZGVyR2VuZXJhdGlvbjsKKyAgICB9CisgICAgaWYgKG1GbHVzaGluZ0F1ZGlvID09IEZMVVNISU5HX0RFQ09ERVIpIHsKKyAgICAgICAgbUZsdXNoQ29tcGxldGVbMSAvKiBhdWRpbyAqL11bMSAvKiBpc0RlY29kZXIgKi9dID0gdHJ1ZTsKKyAgICAgICAgbUZsdXNoaW5nQXVkaW8gPSBGTFVTSEVEOworICAgICAgICBmaW5pc2hGbHVzaElmUG9zc2libGUoKTsKKyAgICB9IGVsc2UgaWYgKG1GbHVzaGluZ0F1ZGlvID09IEZMVVNISU5HX0RFQ09ERVJfU0hVVERPV04KKyAgICAgICAgICAgIHx8IG1GbHVzaGluZ0F1ZGlvID09IFNIVVRUSU5HX0RPV05fREVDT0RFUikgeworICAgICAgICBtRmx1c2hDb21wbGV0ZVsxIC8qIGF1ZGlvICovXVsxIC8qIGlzRGVjb2RlciAqL10gPSB0cnVlOworICAgICAgICBtRmx1c2hpbmdBdWRpbyA9IFNIVVRfRE9XTjsKKyAgICAgICAgZmluaXNoRmx1c2hJZlBvc3NpYmxlKCk7CisgICAgICAgIG5lZWRzVG9DcmVhdGVBdWRpb0RlY29kZXIgPSBmYWxzZTsKKyAgICB9CisgICAgaWYgKG1SZW5kZXJlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY2xvc2VBdWRpb1NpbmsoKTsKKyAgICBtUmVuZGVyZXItPmZsdXNoKHRydWUgLyogYXVkaW8gKi8sIGZhbHNlIC8qIG5vdGlmeUNvbXBsZXRlICovKTsKKyAgICBpZiAobVZpZGVvRGVjb2RlciAhPSBOVUxMKSB7CisgICAgICAgIG1SZW5kZXJlci0+Zmx1c2goZmFsc2UgLyogYXVkaW8gKi8sIGZhbHNlIC8qIG5vdGlmeUNvbXBsZXRlICovKTsKKyAgICB9CisKKyAgICBwZXJmb3JtU2VlayhjdXJyZW50UG9zaXRpb25VcywgTWVkaWFQbGF5ZXIyU2Vla01vZGU6OlNFRUtfUFJFVklPVVNfU1lOQyAvKiBtb2RlICovKTsKKworICAgIGlmIChmb3JjZU5vbk9mZmxvYWQpIHsKKyAgICAgICAgbVJlbmRlcmVyLT5zaWduYWxEaXNhYmxlT2ZmbG9hZEF1ZGlvKCk7CisgICAgICAgIG1PZmZsb2FkQXVkaW8gPSBmYWxzZTsKKyAgICB9CisgICAgaWYgKG5lZWRzVG9DcmVhdGVBdWRpb0RlY29kZXIpIHsKKyAgICAgICAgaW5zdGFudGlhdGVEZWNvZGVyKHRydWUgLyogYXVkaW8gKi8sICZtQXVkaW9EZWNvZGVyLCAhZm9yY2VOb25PZmZsb2FkKTsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpkZXRlcm1pbmVBdWRpb01vZGVDaGFuZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZhdWRpb0Zvcm1hdCkgeworICAgIGlmIChtU291cmNlID09IE5VTEwgfHwgbUF1ZGlvU2luayA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobVJlbmRlcmVyID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1coIk5vIHJlbmRlcmVyIGNhbiBiZSB1c2VkIHRvIGRldGVybWluZSBhdWRpbyBtb2RlLiBVc2Ugbm9uLW9mZmxvYWQgZm9yIHNhZmV0eS4iKTsKKyAgICAgICAgbU9mZmxvYWRBdWRpbyA9IGZhbHNlOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3A8TWV0YURhdGE+IGF1ZGlvTWV0YSA9IG1Tb3VyY2UtPmdldEZvcm1hdE1ldGEodHJ1ZSAvKiBhdWRpbyAqLyk7CisgICAgc3A8QU1lc3NhZ2U+IHZpZGVvRm9ybWF0ID0gbVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qIGF1ZGlvICovKTsKKyAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUgPSBtQXVkaW9TaW5rLT5nZXRBdWRpb1N0cmVhbVR5cGUoKTsKKyAgICBjb25zdCBib29sIGhhc1ZpZGVvID0gKHZpZGVvRm9ybWF0ICE9IE5VTEwpOworICAgIGJvb2wgY2FuT2ZmbG9hZCA9IGNhbk9mZmxvYWRTdHJlYW0oCisgICAgICAgICAgICBhdWRpb01ldGEsIGhhc1ZpZGVvLCBtU291cmNlLT5pc1N0cmVhbWluZygpLCBzdHJlYW1UeXBlKQorICAgICAgICAgICAgICAgICAgICAmJiAobVBsYXliYWNrU2V0dGluZ3MubVNwZWVkID09IDEuZiAmJiBtUGxheWJhY2tTZXR0aW5ncy5tUGl0Y2ggPT0gMS5mKTsKKworICAgIC8vIE1vZHVsYXIgRFJNOiBEaXNhYmxpbmcgYXVkaW8gb2ZmbG9hZCBpZiB0aGUgc291cmNlIGlzIHByb3RlY3RlZAorICAgIGlmIChjYW5PZmZsb2FkICYmIG1Jc0RybVByb3RlY3RlZCkgeworICAgICAgICBjYW5PZmZsb2FkID0gZmFsc2U7CisgICAgICAgIEFMT0dWKCJkZXRlcm1pbmVBdWRpb01vZGVDaGFuZ2U6IERpc2FibGluZyBtT2ZmbG9hZEF1ZGlvIGIvYyB0aGUgc291cmNlIGlzIHByb3RlY3RlZC4iKTsKKyAgICB9CisKKyAgICBpZiAoY2FuT2ZmbG9hZCkgeworICAgICAgICBpZiAoIW1PZmZsb2FkQXVkaW8pIHsKKyAgICAgICAgICAgIG1SZW5kZXJlci0+c2lnbmFsRW5hYmxlT2ZmbG9hZEF1ZGlvKCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gb3BlbiBhdWRpbyBzaW5rIGVhcmx5IHVuZGVyIG9mZmxvYWQgbW9kZS4KKyAgICAgICAgdHJ5T3BlbkF1ZGlvU2lua0Zvck9mZmxvYWQoYXVkaW9Gb3JtYXQsIGF1ZGlvTWV0YSwgaGFzVmlkZW8pOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtT2ZmbG9hZEF1ZGlvKSB7CisgICAgICAgICAgICBtUmVuZGVyZXItPnNpZ25hbERpc2FibGVPZmZsb2FkQXVkaW8oKTsKKyAgICAgICAgICAgIG1PZmZsb2FkQXVkaW8gPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjppbnN0YW50aWF0ZURlY29kZXIoCisgICAgICAgIGJvb2wgYXVkaW8sIHNwPERlY29kZXJCYXNlPiAqZGVjb2RlciwgYm9vbCBjaGVja0F1ZGlvTW9kZUNoYW5nZSkgeworICAgIC8vIFRoZSBhdWRpbyBkZWNvZGVyIGNvdWxkIGJlIGNsZWFyZWQgYnkgdGVhciBkb3duLiBJZiBzdGlsbCBpbiBzaHV0IGRvd24KKyAgICAvLyBwcm9jZXNzLCBubyBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBhdWRpbyBkZWNvZGVyLgorICAgIGlmICgqZGVjb2RlciAhPSBOVUxMIHx8IChhdWRpbyAmJiBtRmx1c2hpbmdBdWRpbyA9PSBTSFVUX0RPV04pKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gZm9ybWF0ID0gbVNvdXJjZS0+Z2V0Rm9ybWF0KGF1ZGlvKTsKKworICAgIGlmIChmb3JtYXQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGF0dXNfdCBlcnI7CisgICAgICAgIGlmIChmb3JtYXQtPmZpbmRJbnQzMigiZXJyIiwgJmVycikgJiYgZXJyKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgfQorCisgICAgZm9ybWF0LT5zZXRJbnQzMigicHJpb3JpdHkiLCAwIC8qIHJlYWx0aW1lICovKTsKKworICAgIGlmICghYXVkaW8pIHsKKyAgICAgICAgQVN0cmluZyBtaW1lOworICAgICAgICBDSEVDSyhmb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpOworCisgICAgICAgIHNwPEFNZXNzYWdlPiBjY05vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdENsb3NlZENhcHRpb25Ob3RpZnksIHRoaXMpOworICAgICAgICBpZiAobUNDRGVjb2RlciA9PSBOVUxMKSB7CisgICAgICAgICAgICBtQ0NEZWNvZGVyID0gbmV3IENDRGVjb2RlcihjY05vdGlmeSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobVNvdXJjZUZsYWdzICYgU291cmNlOjpGTEFHX1NFQ1VSRSkgeworICAgICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigic2VjdXJlIiwgdHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobVNvdXJjZUZsYWdzICYgU291cmNlOjpGTEFHX1BST1RFQ1RFRCkgeworICAgICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigicHJvdGVjdGVkIiwgdHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICBmbG9hdCByYXRlID0gZ2V0RnJhbWVSYXRlKCk7CisgICAgICAgIGlmIChyYXRlID4gMCkgeworICAgICAgICAgICAgZm9ybWF0LT5zZXRGbG9hdCgib3BlcmF0aW5nLXJhdGUiLCByYXRlICogbVBsYXliYWNrU2V0dGluZ3MubVNwZWVkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChhdWRpbykgeworICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0QXVkaW9Ob3RpZnksIHRoaXMpOworICAgICAgICArK21BdWRpb0RlY29kZXJHZW5lcmF0aW9uOworICAgICAgICBub3RpZnktPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUF1ZGlvRGVjb2RlckdlbmVyYXRpb24pOworCisgICAgICAgIGlmIChjaGVja0F1ZGlvTW9kZUNoYW5nZSkgeworICAgICAgICAgICAgZGV0ZXJtaW5lQXVkaW9Nb2RlQ2hhbmdlKGZvcm1hdCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1PZmZsb2FkQXVkaW8pIHsKKyAgICAgICAgICAgIG1Tb3VyY2UtPnNldE9mZmxvYWRBdWRpbyh0cnVlIC8qIG9mZmxvYWQgKi8pOworCisgICAgICAgICAgICBjb25zdCBib29sIGhhc1ZpZGVvID0gKG1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKmF1ZGlvICovKSAhPSBOVUxMKTsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImhhcy12aWRlbyIsIGhhc1ZpZGVvKTsKKyAgICAgICAgICAgICpkZWNvZGVyID0gbmV3IERlY29kZXJQYXNzVGhyb3VnaChub3RpZnksIG1Tb3VyY2UsIG1SZW5kZXJlcik7CisgICAgICAgICAgICBBTE9HVigiaW5zdGFudGlhdGVEZWNvZGVyIGF1ZGlvIERlY29kZXJQYXNzVGhyb3VnaCAgaGFzVmlkZW86ICVkIiwgaGFzVmlkZW8pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVNvdXJjZS0+c2V0T2ZmbG9hZEF1ZGlvKGZhbHNlIC8qIG9mZmxvYWQgKi8pOworCisgICAgICAgICAgICAqZGVjb2RlciA9IG5ldyBEZWNvZGVyKG5vdGlmeSwgbVNvdXJjZSwgbVBJRCwgbVVJRCwgbVJlbmRlcmVyKTsKKyAgICAgICAgICAgIEFMT0dWKCJpbnN0YW50aWF0ZURlY29kZXIgYXVkaW8gRGVjb2RlciIpOworICAgICAgICB9CisgICAgICAgIG1BdWRpb0RlY29kZXJFcnJvciA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRWaWRlb05vdGlmeSwgdGhpcyk7CisgICAgICAgICsrbVZpZGVvRGVjb2RlckdlbmVyYXRpb247CisgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtVmlkZW9EZWNvZGVyR2VuZXJhdGlvbik7CisKKyAgICAgICAgKmRlY29kZXIgPSBuZXcgRGVjb2RlcigKKyAgICAgICAgICAgICAgICBub3RpZnksIG1Tb3VyY2UsIG1QSUQsIG1VSUQsIG1SZW5kZXJlciwgbU5hdGl2ZVdpbmRvdywgbUNDRGVjb2Rlcik7CisgICAgICAgIG1WaWRlb0RlY29kZXJFcnJvciA9IGZhbHNlOworCisgICAgICAgIC8vIGVuYWJsZSBGUkMgaWYgaGlnaC1xdWFsaXR5IEFWIHN5bmMgaXMgcmVxdWVzdGVkLCBldmVuIGlmIG5vdAorICAgICAgICAvLyBkaXJlY3RseSBxdWV1aW5nIHRvIGRpc3BsYXksIGFzIHRoaXMgd2lsbCBldmVuIGltcHJvdmUgdGV4dHVyZXZpZXcKKyAgICAgICAgLy8gcGxheWJhY2suCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwcm9wZXJ0eV9nZXRfYm9vbCgicGVyc2lzdC5zeXMubWVkaWEuYXZzeW5jIiwgZmFsc2UpKSB7CisgICAgICAgICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiYXV0by1mcmMiLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAoKmRlY29kZXIpLT5pbml0KCk7CisKKyAgICAvLyBNb2R1bGFyIERSTQorICAgIGlmIChtSXNEcm1Qcm90ZWN0ZWQpIHsKKyAgICAgICAgZm9ybWF0LT5zZXRPYmplY3QoImNyeXB0byIsIG1DcnlwdG8pOworICAgICAgICBBTE9HVigiaW5zdGFudGlhdGVEZWNvZGVyOiBtQ3J5cHRvOiAlcCBpc1NlY3VyZTogJWQiLCBtQ3J5cHRvLmdldCgpLAorICAgICAgICAgICAgICAgIChtU291cmNlRmxhZ3MgJiBTb3VyY2U6OkZMQUdfU0VDVVJFKSAhPSAwKTsKKyAgICB9CisKKyAgICAoKmRlY29kZXIpLT5jb25maWd1cmUoZm9ybWF0KTsKKworICAgIGlmICghYXVkaW8pIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IHBhcmFtcyA9IG5ldyBBTWVzc2FnZSgpOworICAgICAgICBmbG9hdCByYXRlID0gZ2V0RnJhbWVSYXRlKCk7CisgICAgICAgIGlmIChyYXRlID4gMCkgeworICAgICAgICAgICAgcGFyYW1zLT5zZXRGbG9hdCgiZnJhbWUtcmF0ZS10b3RhbCIsIHJhdGUpOworICAgICAgICB9CisKKyAgICAgICAgc3A8TWV0YURhdGE+IGZpbGVNZXRhID0gZ2V0RmlsZU1ldGEoKTsKKyAgICAgICAgaWYgKGZpbGVNZXRhICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGludDMyX3QgdmlkZW9UZW1wb3JhbExheWVyQ291bnQ7CisgICAgICAgICAgICBpZiAoZmlsZU1ldGEtPmZpbmRJbnQzMihrS2V5VGVtcG9yYWxMYXllckNvdW50LCAmdmlkZW9UZW1wb3JhbExheWVyQ291bnQpCisgICAgICAgICAgICAgICAgICAgICYmIHZpZGVvVGVtcG9yYWxMYXllckNvdW50ID4gMCkgeworICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0SW50MzIoInRlbXBvcmFsLWxheWVyLWNvdW50IiwgdmlkZW9UZW1wb3JhbExheWVyQ291bnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHBhcmFtcy0+Y291bnRFbnRyaWVzKCkgPiAwKSB7CisgICAgICAgICAgICAoKmRlY29kZXIpLT5zZXRQYXJhbWV0ZXJzKHBhcmFtcyk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIE51UGxheWVyMjo6dXBkYXRlVmlkZW9TaXplKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmlucHV0Rm9ybWF0LAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm91dHB1dEZvcm1hdCkgeworICAgIGlmIChpbnB1dEZvcm1hdCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dXKCJVbmtub3duIHZpZGVvIHNpemUsIHJlcG9ydGluZyAweDAhIik7CisgICAgICAgIG5vdGlmeUxpc3RlbmVyKE1FRElBMl9TRVRfVklERU9fU0laRSwgMCwgMCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaW50MzJfdCBlcnIgPSBPSzsKKyAgICBpbnB1dEZvcm1hdC0+ZmluZEludDMyKCJlcnIiLCAmZXJyKTsKKyAgICBpZiAoZXJyID09IC1FV09VTERCTE9DSykgeworICAgICAgICBBTE9HVygiVmlkZW8gbWV0YSBpcyBub3QgYXZhaWxhYmxlIHlldCEiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dXKCJTb21ldGhpbmcgaXMgd3Jvbmcgd2l0aCB2aWRlbyBtZXRhISIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50MzJfdCBkaXNwbGF5V2lkdGgsIGRpc3BsYXlIZWlnaHQ7CisgICAgaWYgKG91dHB1dEZvcm1hdCAhPSBOVUxMKSB7CisgICAgICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKKyAgICAgICAgQ0hFQ0sob3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKSk7CisgICAgICAgIENIRUNLKG91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSk7CisKKyAgICAgICAgaW50MzJfdCBjcm9wTGVmdCwgY3JvcFRvcCwgY3JvcFJpZ2h0LCBjcm9wQm90dG9tOworICAgICAgICBDSEVDSyhvdXRwdXRGb3JtYXQtPmZpbmRSZWN0KAorICAgICAgICAgICAgICAgICAgICAiY3JvcCIsCisgICAgICAgICAgICAgICAgICAgICZjcm9wTGVmdCwgJmNyb3BUb3AsICZjcm9wUmlnaHQsICZjcm9wQm90dG9tKSk7CisKKyAgICAgICAgZGlzcGxheVdpZHRoID0gY3JvcFJpZ2h0IC0gY3JvcExlZnQgKyAxOworICAgICAgICBkaXNwbGF5SGVpZ2h0ID0gY3JvcEJvdHRvbSAtIGNyb3BUb3AgKyAxOworCisgICAgICAgIEFMT0dWKCJWaWRlbyBvdXRwdXQgZm9ybWF0IGNoYW5nZWQgdG8gJWQgeCAlZCAiCisgICAgICAgICAgICAgIihjcm9wOiAlZCB4ICVkIEAgKCVkLCAlZCkpIiwKKyAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgIGRpc3BsYXlXaWR0aCwKKyAgICAgICAgICAgICBkaXNwbGF5SGVpZ2h0LAorICAgICAgICAgICAgIGNyb3BMZWZ0LCBjcm9wVG9wKTsKKyAgICB9IGVsc2UgeworICAgICAgICBDSEVDSyhpbnB1dEZvcm1hdC0+ZmluZEludDMyKCJ3aWR0aCIsICZkaXNwbGF5V2lkdGgpKTsKKyAgICAgICAgQ0hFQ0soaW5wdXRGb3JtYXQtPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmRpc3BsYXlIZWlnaHQpKTsKKworICAgICAgICBBTE9HVigiVmlkZW8gaW5wdXQgZm9ybWF0ICVkIHggJWQiLCBkaXNwbGF5V2lkdGgsIGRpc3BsYXlIZWlnaHQpOworICAgIH0KKworICAgIC8vIFRha2UgaW50byBhY2NvdW50IHNhbXBsZSBhc3BlY3QgcmF0aW8gaWYgbmVjZXNzYXJ5OgorICAgIGludDMyX3Qgc2FyV2lkdGgsIHNhckhlaWdodDsKKyAgICBpZiAoaW5wdXRGb3JtYXQtPmZpbmRJbnQzMigic2FyLXdpZHRoIiwgJnNhcldpZHRoKQorICAgICAgICAgICAgJiYgaW5wdXRGb3JtYXQtPmZpbmRJbnQzMigic2FyLWhlaWdodCIsICZzYXJIZWlnaHQpCisgICAgICAgICAgICAmJiBzYXJXaWR0aCA+IDAgJiYgc2FySGVpZ2h0ID4gMCkgeworICAgICAgICBBTE9HVigiU2FtcGxlIGFzcGVjdCByYXRpbyAlZCA6ICVkIiwgc2FyV2lkdGgsIHNhckhlaWdodCk7CisKKyAgICAgICAgZGlzcGxheVdpZHRoID0gKGRpc3BsYXlXaWR0aCAqIHNhcldpZHRoKSAvIHNhckhlaWdodDsKKworICAgICAgICBBTE9HVigiZGlzcGxheSBkaW1lbnNpb25zICVkIHggJWQiLCBkaXNwbGF5V2lkdGgsIGRpc3BsYXlIZWlnaHQpOworICAgIH0gZWxzZSB7CisgICAgICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKKyAgICAgICAgaWYgKGlucHV0Rm9ybWF0LT5maW5kSW50MzIoImRpc3BsYXktd2lkdGgiLCAmd2lkdGgpCisgICAgICAgICAgICAgICAgJiYgaW5wdXRGb3JtYXQtPmZpbmRJbnQzMigiZGlzcGxheS1oZWlnaHQiLCAmaGVpZ2h0KQorICAgICAgICAgICAgICAgICYmIHdpZHRoID4gMCAmJiBoZWlnaHQgPiAwCisgICAgICAgICAgICAgICAgJiYgZGlzcGxheVdpZHRoID4gMCAmJiBkaXNwbGF5SGVpZ2h0ID4gMCkgeworICAgICAgICAgICAgaWYgKGRpc3BsYXlIZWlnaHQgKiAoaW50NjRfdCl3aWR0aCAvIGhlaWdodCA+IChpbnQ2NF90KWRpc3BsYXlXaWR0aCkgeworICAgICAgICAgICAgICAgIGRpc3BsYXlIZWlnaHQgPSAoaW50MzJfdCkoZGlzcGxheVdpZHRoICogKGludDY0X3QpaGVpZ2h0IC8gd2lkdGgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkaXNwbGF5V2lkdGggPSAoaW50MzJfdCkoZGlzcGxheUhlaWdodCAqIChpbnQ2NF90KXdpZHRoIC8gaGVpZ2h0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJWaWRlbyBkaXNwbGF5IHdpZHRoIGFuZCBoZWlnaHQgYXJlIG92ZXJyaWRkZW4gdG8gJWQgeCAlZCIsCisgICAgICAgICAgICAgICAgIGRpc3BsYXlXaWR0aCwgZGlzcGxheUhlaWdodCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnQzMl90IHJvdGF0aW9uRGVncmVlczsKKyAgICBpZiAoIWlucHV0Rm9ybWF0LT5maW5kSW50MzIoInJvdGF0aW9uLWRlZ3JlZXMiLCAmcm90YXRpb25EZWdyZWVzKSkgeworICAgICAgICByb3RhdGlvbkRlZ3JlZXMgPSAwOworICAgIH0KKworICAgIGlmIChyb3RhdGlvbkRlZ3JlZXMgPT0gOTAgfHwgcm90YXRpb25EZWdyZWVzID09IDI3MCkgeworICAgICAgICBpbnQzMl90IHRtcCA9IGRpc3BsYXlXaWR0aDsKKyAgICAgICAgZGlzcGxheVdpZHRoID0gZGlzcGxheUhlaWdodDsKKyAgICAgICAgZGlzcGxheUhlaWdodCA9IHRtcDsKKyAgICB9CisKKyAgICBub3RpZnlMaXN0ZW5lcigKKyAgICAgICAgICAgIE1FRElBMl9TRVRfVklERU9fU0laRSwKKyAgICAgICAgICAgIGRpc3BsYXlXaWR0aCwKKyAgICAgICAgICAgIGRpc3BsYXlIZWlnaHQpOworfQorCit2b2lkIE51UGxheWVyMjo6bm90aWZ5TGlzdGVuZXIoaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKmluKSB7CisgICAgaWYgKG1Ecml2ZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3A8TnVQbGF5ZXIyRHJpdmVyPiBkcml2ZXIgPSBtRHJpdmVyLnByb21vdGUoKTsKKworICAgIGlmIChkcml2ZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZHJpdmVyLT5ub3RpZnlMaXN0ZW5lcihtc2csIGV4dDEsIGV4dDIsIGluKTsKK30KKwordm9pZCBOdVBsYXllcjI6OmZsdXNoRGVjb2Rlcihib29sIGF1ZGlvLCBib29sIG5lZWRTaHV0ZG93bikgeworICAgIEFMT0dWKCJbJXNdIGZsdXNoRGVjb2RlciBuZWVkU2h1dGRvd249JWQiLAorICAgICAgICAgIGF1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIsIG5lZWRTaHV0ZG93bik7CisKKyAgICBjb25zdCBzcDxEZWNvZGVyQmFzZT4gJmRlY29kZXIgPSBnZXREZWNvZGVyKGF1ZGlvKTsKKyAgICBpZiAoZGVjb2RlciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dJKCJmbHVzaERlY29kZXIgJXMgd2l0aG91dCBkZWNvZGVyIHByZXNlbnQiLAorICAgICAgICAgICAgIGF1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gTWFrZSBzdXJlIHdlIGRvbid0IGNvbnRpbnVlIHRvIHNjYW4gc291cmNlcyB1bnRpbCB3ZSBmaW5pc2ggZmx1c2hpbmcuCisgICAgKyttU2NhblNvdXJjZXNHZW5lcmF0aW9uOworICAgIGlmIChtU2NhblNvdXJjZXNQZW5kaW5nKSB7CisgICAgICAgIGlmICghbmVlZFNodXRkb3duKSB7CisgICAgICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUFjdGlvbigmTnVQbGF5ZXIyOjpwZXJmb3JtU2NhblNvdXJjZXMpKTsKKyAgICAgICAgfQorICAgICAgICBtU2NhblNvdXJjZXNQZW5kaW5nID0gZmFsc2U7CisgICAgfQorCisgICAgZGVjb2Rlci0+c2lnbmFsRmx1c2goKTsKKworICAgIEZsdXNoU3RhdHVzIG5ld1N0YXR1cyA9CisgICAgICAgIG5lZWRTaHV0ZG93biA/IEZMVVNISU5HX0RFQ09ERVJfU0hVVERPV04gOiBGTFVTSElOR19ERUNPREVSOworCisgICAgbUZsdXNoQ29tcGxldGVbYXVkaW9dW2ZhbHNlIC8qIGlzRGVjb2RlciAqL10gPSAobVJlbmRlcmVyID09IE5VTEwpOworICAgIG1GbHVzaENvbXBsZXRlW2F1ZGlvXVt0cnVlIC8qIGlzRGVjb2RlciAqL10gPSBmYWxzZTsKKyAgICBpZiAoYXVkaW8pIHsKKyAgICAgICAgQUxPR0VfSUYobUZsdXNoaW5nQXVkaW8gIT0gTk9ORSwKKyAgICAgICAgICAgICAgICAiYXVkaW8gZmx1c2hEZWNvZGVyKCkgaXMgY2FsbGVkIGluIHN0YXRlICVkIiwgbUZsdXNoaW5nQXVkaW8pOworICAgICAgICBtRmx1c2hpbmdBdWRpbyA9IG5ld1N0YXR1czsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRV9JRihtRmx1c2hpbmdWaWRlbyAhPSBOT05FLAorICAgICAgICAgICAgICAgICJ2aWRlbyBmbHVzaERlY29kZXIoKSBpcyBjYWxsZWQgaW4gc3RhdGUgJWQiLCBtRmx1c2hpbmdWaWRlbyk7CisgICAgICAgIG1GbHVzaGluZ1ZpZGVvID0gbmV3U3RhdHVzOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjI6OnF1ZXVlRGVjb2RlclNodXRkb3duKAorICAgICAgICBib29sIGF1ZGlvLCBib29sIHZpZGVvLCBjb25zdCBzcDxBTWVzc2FnZT4gJnJlcGx5KSB7CisgICAgQUxPR0koInF1ZXVlRGVjb2RlclNodXRkb3duIGF1ZGlvPSVkLCB2aWRlbz0lZCIsIGF1ZGlvLCB2aWRlbyk7CisKKyAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKKyAgICAgICAgICAgIG5ldyBGbHVzaERlY29kZXJBY3Rpb24oCisgICAgICAgICAgICAgICAgYXVkaW8gPyBGTFVTSF9DTURfU0hVVERPV04gOiBGTFVTSF9DTURfTk9ORSwKKyAgICAgICAgICAgICAgICB2aWRlbyA/IEZMVVNIX0NNRF9TSFVURE9XTiA6IEZMVVNIX0NNRF9OT05FKSk7CisKKyAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKKyAgICAgICAgICAgIG5ldyBTaW1wbGVBY3Rpb24oJk51UGxheWVyMjo6cGVyZm9ybVNjYW5Tb3VyY2VzKSk7CisKKyAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjayhuZXcgUG9zdE1lc3NhZ2VBY3Rpb24ocmVwbHkpKTsKKworICAgIHByb2Nlc3NEZWZlcnJlZEFjdGlvbnMoKTsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpzZXRWaWRlb1NjYWxpbmdNb2RlKGludDMyX3QgbW9kZSkgeworICAgIG1WaWRlb1NjYWxpbmdNb2RlID0gbW9kZTsKKyAgICBpZiAobU5hdGl2ZVdpbmRvdyAhPSBOVUxMICYmIG1OYXRpdmVXaW5kb3ctPmdldEFOYXRpdmVXaW5kb3coKSAhPSBOVUxMKSB7CisgICAgICAgIHN0YXR1c190IHJldCA9IG5hdGl2ZV93aW5kb3dfc2V0X3NjYWxpbmdfbW9kZSgKKyAgICAgICAgICAgICAgICBtTmF0aXZlV2luZG93LT5nZXRBTmF0aXZlV2luZG93KCksIG1WaWRlb1NjYWxpbmdNb2RlKTsKKyAgICAgICAgaWYgKHJldCAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgc2NhbGluZyBtb2RlICglZCk6ICVzIiwKKyAgICAgICAgICAgICAgICAtcmV0LCBzdHJlcnJvcigtcmV0KSk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpnZXRUcmFja0luZm8oUGFyY2VsKiByZXBseSkgY29uc3QgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRHZXRUcmFja0luZm8sIHRoaXMpOworICAgIG1zZy0+c2V0UG9pbnRlcigicmVwbHkiLCByZXBseSk7CisKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXR1c190IE51UGxheWVyMjo6Z2V0U2VsZWN0ZWRUcmFjayhpbnQzMl90IHR5cGUsIFBhcmNlbCogcmVwbHkpIGNvbnN0IHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0R2V0U2VsZWN0ZWRUcmFjaywgdGhpcyk7CisgICAgbXNnLT5zZXRQb2ludGVyKCJyZXBseSIsIHJlcGx5KTsKKyAgICBtc2ctPnNldEludDMyKCJ0eXBlIiwgdHlwZSk7CisKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOworICAgIGlmIChlcnIgPT0gT0sgJiYgcmVzcG9uc2UgIT0gTlVMTCkgeworICAgICAgICBDSEVDSyhyZXNwb25zZS0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXR1c190IE51UGxheWVyMjo6c2VsZWN0VHJhY2soc2l6ZV90IHRyYWNrSW5kZXgsIGJvb2wgc2VsZWN0LCBpbnQ2NF90IHRpbWVVcykgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZWxlY3RUcmFjaywgdGhpcyk7CisgICAgbXNnLT5zZXRTaXplKCJ0cmFja0luZGV4IiwgdHJhY2tJbmRleCk7CisgICAgbXNnLT5zZXRJbnQzMigic2VsZWN0Iiwgc2VsZWN0KTsKKyAgICBtc2ctPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOworCisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOworICAgIHN0YXR1c190IGVyciA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpZiAoIXJlc3BvbnNlLT5maW5kSW50MzIoImVyciIsICZlcnIpKSB7CisgICAgICAgIGVyciA9IE9LOworICAgIH0KKworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXR1c190IE51UGxheWVyMjo6Z2V0Q3VycmVudFBvc2l0aW9uKGludDY0X3QgKm1lZGlhVXMpIHsKKyAgICBzcDxSZW5kZXJlcj4gcmVuZGVyZXIgPSBtUmVuZGVyZXI7CisgICAgaWYgKHJlbmRlcmVyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgcmV0dXJuIHJlbmRlcmVyLT5nZXRDdXJyZW50UG9zaXRpb24obWVkaWFVcyk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpnZXRTdGF0cyhWZWN0b3I8c3A8QU1lc3NhZ2U+ID4gKm1UcmFja1N0YXRzKSB7CisgICAgQ0hFQ0sobVRyYWNrU3RhdHMgIT0gTlVMTCk7CisKKyAgICBtVHJhY2tTdGF0cy0+Y2xlYXIoKTsKKyAgICBpZiAobVZpZGVvRGVjb2RlciAhPSBOVUxMKSB7CisgICAgICAgIG1UcmFja1N0YXRzLT5wdXNoX2JhY2sobVZpZGVvRGVjb2Rlci0+Z2V0U3RhdHMoKSk7CisgICAgfQorICAgIGlmIChtQXVkaW9EZWNvZGVyICE9IE5VTEwpIHsKKyAgICAgICAgbVRyYWNrU3RhdHMtPnB1c2hfYmFjayhtQXVkaW9EZWNvZGVyLT5nZXRTdGF0cygpKTsKKyAgICB9Cit9CisKK3NwPE1ldGFEYXRhPiBOdVBsYXllcjI6OmdldEZpbGVNZXRhKCkgeworICAgIHJldHVybiBtU291cmNlLT5nZXRGaWxlRm9ybWF0TWV0YSgpOworfQorCitmbG9hdCBOdVBsYXllcjI6OmdldEZyYW1lUmF0ZSgpIHsKKyAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1Tb3VyY2UtPmdldEZvcm1hdE1ldGEoZmFsc2UgLyogYXVkaW8gKi8pOworICAgIGlmIChtZXRhID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGludDMyX3QgcmF0ZTsKKyAgICBpZiAoIW1ldGEtPmZpbmRJbnQzMihrS2V5RnJhbWVSYXRlLCAmcmF0ZSkpIHsKKyAgICAgICAgLy8gZmFsbCBiYWNrIHRvIHRyeSBmaWxlIG1ldGEKKyAgICAgICAgc3A8TWV0YURhdGE+IGZpbGVNZXRhID0gZ2V0RmlsZU1ldGEoKTsKKyAgICAgICAgaWYgKGZpbGVNZXRhID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dXKCJzb3VyY2UgaGFzIHZpZGVvIG1ldGEgYnV0IG5vdCBmaWxlIG1ldGEiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpbnQzMl90IGZpbGVNZXRhUmF0ZTsKKyAgICAgICAgaWYgKCFmaWxlTWV0YS0+ZmluZEludDMyKGtLZXlGcmFtZVJhdGUsICZmaWxlTWV0YVJhdGUpKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZpbGVNZXRhUmF0ZTsKKyAgICB9CisgICAgcmV0dXJuIHJhdGU7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpzY2hlZHVsZVBvbGxEdXJhdGlvbigpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UG9sbER1cmF0aW9uLCB0aGlzKTsKKyAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbVBvbGxEdXJhdGlvbkdlbmVyYXRpb24pOworICAgIG1zZy0+cG9zdCgpOworfQorCit2b2lkIE51UGxheWVyMjo6Y2FuY2VsUG9sbER1cmF0aW9uKCkgeworICAgICsrbVBvbGxEdXJhdGlvbkdlbmVyYXRpb247Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpwcm9jZXNzRGVmZXJyZWRBY3Rpb25zKCkgeworICAgIHdoaWxlICghbURlZmVycmVkQWN0aW9ucy5lbXB0eSgpKSB7CisgICAgICAgIC8vIFdlIHdvbid0IGV4ZWN1dGUgYW55IGRlZmVycmVkIGFjdGlvbnMgdW50aWwgd2UncmUgbm8gbG9uZ2VyIGluCisgICAgICAgIC8vIGFuIGludGVybWVkaWF0ZSBzdGF0ZSwgaS5lLiBvbmUgbW9yZSBtb3JlIGRlY29kZXJzIGFyZSBjdXJyZW50bHkKKyAgICAgICAgLy8gZmx1c2hpbmcgb3Igc2h1dHRpbmcgZG93bi4KKworICAgICAgICBpZiAobUZsdXNoaW5nQXVkaW8gIT0gTk9ORSB8fCBtRmx1c2hpbmdWaWRlbyAhPSBOT05FKSB7CisgICAgICAgICAgICAvLyBXZSdyZSBjdXJyZW50bHkgZmx1c2hpbmcsIHBvc3Rwb25lIHRoZSByZXNldCB1bnRpbCB0aGF0J3MKKyAgICAgICAgICAgIC8vIGNvbXBsZXRlZC4KKworICAgICAgICAgICAgQUxPR1YoInBvc3Rwb25pbmcgYWN0aW9uIG1GbHVzaGluZ0F1ZGlvPSVkLCBtRmx1c2hpbmdWaWRlbz0lZCIsCisgICAgICAgICAgICAgICAgICBtRmx1c2hpbmdBdWRpbywgbUZsdXNoaW5nVmlkZW8pOworCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHNwPEFjdGlvbj4gYWN0aW9uID0gKm1EZWZlcnJlZEFjdGlvbnMuYmVnaW4oKTsKKyAgICAgICAgbURlZmVycmVkQWN0aW9ucy5lcmFzZShtRGVmZXJyZWRBY3Rpb25zLmJlZ2luKCkpOworCisgICAgICAgIGFjdGlvbi0+ZXhlY3V0ZSh0aGlzKTsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpwZXJmb3JtU2VlayhpbnQ2NF90IHNlZWtUaW1lVXMsIE1lZGlhUGxheWVyMlNlZWtNb2RlIG1vZGUpIHsKKyAgICBBTE9HVigicGVyZm9ybVNlZWsgc2Vla1RpbWVVcz0lbGxkIHVzICglLjJmIHNlY3MpLCBtb2RlPSVkIiwKKyAgICAgICAgICAobG9uZyBsb25nKXNlZWtUaW1lVXMsIHNlZWtUaW1lVXMgLyAxRTYsIG1vZGUpOworCisgICAgaWYgKG1Tb3VyY2UgPT0gTlVMTCkgeworICAgICAgICAvLyBUaGlzIGhhcHBlbnMgd2hlbiByZXNldCBvY2N1cnMgcmlnaHQgYmVmb3JlIHRoZSBsb29wIG1vZGUKKyAgICAgICAgLy8gYXN5bmNocm9ub3VzbHkgc2Vla3MgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzdHJlYW0uCisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobUF1ZGlvRGVjb2RlciAhPSBOVUxMIHx8IG1WaWRlb0RlY29kZXIgIT0gTlVMTCwKKyAgICAgICAgICAgICAgICAibVNvdXJjZSBpcyBOVUxMIGFuZCBkZWNvZGVycyBub3QgTlVMTCBhdWRpbyglcCkgdmlkZW8oJXApIiwKKyAgICAgICAgICAgICAgICBtQXVkaW9EZWNvZGVyLmdldCgpLCBtVmlkZW9EZWNvZGVyLmdldCgpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtUHJldmlvdXNTZWVrVGltZVVzID0gc2Vla1RpbWVVczsKKyAgICBtU291cmNlLT5zZWVrVG8oc2Vla1RpbWVVcywgbW9kZSk7CisgICAgKyttVGltZWRUZXh0R2VuZXJhdGlvbjsKKworICAgIC8vIGV2ZXJ5dGhpbmcncyBmbHVzaGVkLCBjb250aW51ZSBwbGF5YmFjay4KK30KKwordm9pZCBOdVBsYXllcjI6OnBlcmZvcm1EZWNvZGVyRmx1c2goRmx1c2hDb21tYW5kIGF1ZGlvLCBGbHVzaENvbW1hbmQgdmlkZW8pIHsKKyAgICBBTE9HVigicGVyZm9ybURlY29kZXJGbHVzaCBhdWRpbz0lZCwgdmlkZW89JWQiLCBhdWRpbywgdmlkZW8pOworCisgICAgaWYgKChhdWRpbyA9PSBGTFVTSF9DTURfTk9ORSB8fCBtQXVkaW9EZWNvZGVyID09IE5VTEwpCisgICAgICAgICAgICAmJiAodmlkZW8gPT0gRkxVU0hfQ01EX05PTkUgfHwgbVZpZGVvRGVjb2RlciA9PSBOVUxMKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGF1ZGlvICE9IEZMVVNIX0NNRF9OT05FICYmIG1BdWRpb0RlY29kZXIgIT0gTlVMTCkgeworICAgICAgICBmbHVzaERlY29kZXIodHJ1ZSAvKiBhdWRpbyAqLywgKGF1ZGlvID09IEZMVVNIX0NNRF9TSFVURE9XTikpOworICAgIH0KKworICAgIGlmICh2aWRlbyAhPSBGTFVTSF9DTURfTk9ORSAmJiBtVmlkZW9EZWNvZGVyICE9IE5VTEwpIHsKKyAgICAgICAgZmx1c2hEZWNvZGVyKGZhbHNlIC8qIGF1ZGlvICovLCAodmlkZW8gPT0gRkxVU0hfQ01EX1NIVVRET1dOKSk7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyMjo6cGVyZm9ybVJlc2V0KCkgeworICAgIEFMT0dWKCJwZXJmb3JtUmVzZXQiKTsKKworICAgIENIRUNLKG1BdWRpb0RlY29kZXIgPT0gTlVMTCk7CisgICAgQ0hFQ0sobVZpZGVvRGVjb2RlciA9PSBOVUxMKTsKKworICAgIHN0b3BQbGF5YmFja1RpbWVyKCJwZXJmb3JtUmVzZXQiKTsKKyAgICBzdG9wUmVidWZmZXJpbmdUaW1lcih0cnVlKTsKKworICAgIGNhbmNlbFBvbGxEdXJhdGlvbigpOworCisgICAgKyttU2NhblNvdXJjZXNHZW5lcmF0aW9uOworICAgIG1TY2FuU291cmNlc1BlbmRpbmcgPSBmYWxzZTsKKworICAgIGlmIChtUmVuZGVyZXJMb29wZXIgIT0gTlVMTCkgeworICAgICAgICBpZiAobVJlbmRlcmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1SZW5kZXJlckxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIobVJlbmRlcmVyLT5pZCgpKTsKKyAgICAgICAgfQorICAgICAgICBtUmVuZGVyZXJMb29wZXItPnN0b3AoKTsKKyAgICAgICAgbVJlbmRlcmVyTG9vcGVyLmNsZWFyKCk7CisgICAgfQorICAgIG1SZW5kZXJlci5jbGVhcigpOworICAgICsrbVJlbmRlcmVyR2VuZXJhdGlvbjsKKworICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgbVNvdXJjZS0+c3RvcCgpOworCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtU291cmNlTG9jayk7CisgICAgICAgIG1Tb3VyY2UuY2xlYXIoKTsKKyAgICB9CisKKyAgICBpZiAobURyaXZlciAhPSBOVUxMKSB7CisgICAgICAgIHNwPE51UGxheWVyMkRyaXZlcj4gZHJpdmVyID0gbURyaXZlci5wcm9tb3RlKCk7CisgICAgICAgIGlmIChkcml2ZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlSZXNldENvbXBsZXRlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtU3RhcnRlZCA9IGZhbHNlOworICAgIG1QcmVwYXJlZCA9IGZhbHNlOworICAgIG1SZXNldHRpbmcgPSBmYWxzZTsKKyAgICBtU291cmNlU3RhcnRlZCA9IGZhbHNlOworCisgICAgLy8gTW9kdWxhciBEUk0KKyAgICBpZiAobUNyeXB0byAhPSBOVUxMKSB7CisgICAgICAgIC8vIGRlY29kZXJzIHdpbGwgYmUgZmx1c2hlZCBiZWZvcmUgdGhpcyBzbyB0aGVpciBtQ3J5cHRvIHdvdWxkIGdvIGF3YXkgb24gdGhlaXIgb3duCisgICAgICAgIC8vIFRPRE8gY2hhbmdlIHRvIEFMT0dWCisgICAgICAgIEFMT0dEKCJwZXJmb3JtUmVzZXQgbUNyeXB0bzogJXAiLCBtQ3J5cHRvLmdldCgpKTsKKyAgICAgICAgbUNyeXB0by5jbGVhcigpOworICAgIH0KKyAgICBtSXNEcm1Qcm90ZWN0ZWQgPSBmYWxzZTsKK30KKwordm9pZCBOdVBsYXllcjI6OnBlcmZvcm1TY2FuU291cmNlcygpIHsKKyAgICBBTE9HVigicGVyZm9ybVNjYW5Tb3VyY2VzIik7CisKKyAgICBpZiAoIW1TdGFydGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobUF1ZGlvRGVjb2RlciA9PSBOVUxMIHx8IG1WaWRlb0RlY29kZXIgPT0gTlVMTCkgeworICAgICAgICBwb3N0U2NhblNvdXJjZXMoKTsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpwZXJmb3JtU2V0U3VyZmFjZShjb25zdCBzcDxBTmF0aXZlV2luZG93V3JhcHBlcj4gJm53dykgeworICAgIEFMT0dWKCJwZXJmb3JtU2V0U3VyZmFjZSIpOworCisgICAgbU5hdGl2ZVdpbmRvdyA9IG53dzsKKworICAgIC8vIFhYWCAtIGlnbm9yZSBlcnJvciBmcm9tIHNldFZpZGVvU2NhbGluZ01vZGUgZm9yIG5vdworICAgIHNldFZpZGVvU2NhbGluZ01vZGUobVZpZGVvU2NhbGluZ01vZGUpOworCisgICAgaWYgKG1Ecml2ZXIgIT0gTlVMTCkgeworICAgICAgICBzcDxOdVBsYXllcjJEcml2ZXI+IGRyaXZlciA9IG1Ecml2ZXIucHJvbW90ZSgpOworICAgICAgICBpZiAoZHJpdmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5U2V0U3VyZmFjZUNvbXBsZXRlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpwZXJmb3JtUmVzdW1lRGVjb2RlcnMoYm9vbCBuZWVkTm90aWZ5KSB7CisgICAgaWYgKG5lZWROb3RpZnkpIHsKKyAgICAgICAgbVJlc3VtZVBlbmRpbmcgPSB0cnVlOworICAgICAgICBpZiAobVZpZGVvRGVjb2RlciA9PSBOVUxMKSB7CisgICAgICAgICAgICAvLyBpZiBhdWRpby1vbmx5LCB3ZSBjYW4gbm90aWZ5IHNlZWsgY29tcGxldGUgbm93LAorICAgICAgICAgICAgLy8gYXMgdGhlIHJlc3VtZSBvcGVyYXRpb24gd2lsbCBiZSByZWxhdGl2ZWx5IGZhc3QuCisgICAgICAgICAgICBmaW5pc2hSZXN1bWUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtVmlkZW9EZWNvZGVyICE9IE5VTEwpIHsKKyAgICAgICAgLy8gV2hlbiB0aGVyZSBpcyBjb250aW51b3VzIHNlZWssIE1lZGlhUGxheWVyIHdpbGwgY2FjaGUgdGhlIHNlZWsKKyAgICAgICAgLy8gcG9zaXRpb24sIGFuZCBzZW5kIGRvd24gbmV3IHNlZWsgcmVxdWVzdCB3aGVuIHByZXZpb3VzIHNlZWsgaXMKKyAgICAgICAgLy8gY29tcGxldGUuIExldCdzIHdhaXQgZm9yIGF0IGxlYXN0IG9uZSB2aWRlbyBvdXRwdXQgZnJhbWUgYmVmb3JlCisgICAgICAgIC8vIG5vdGlmeWluZyBzZWVrIGNvbXBsZXRlLCBzbyB0aGF0IHRoZSB2aWRlbyB0aHVtYm5haWwgZ2V0cyB1cGRhdGVkCisgICAgICAgIC8vIHdoZW4gc2Vla2JhciBpcyBkcmFnZ2VkLgorICAgICAgICBtVmlkZW9EZWNvZGVyLT5zaWduYWxSZXN1bWUobmVlZE5vdGlmeSk7CisgICAgfQorCisgICAgaWYgKG1BdWRpb0RlY29kZXIgIT0gTlVMTCkgeworICAgICAgICBtQXVkaW9EZWNvZGVyLT5zaWduYWxSZXN1bWUoZmFsc2UgLyogbmVlZE5vdGlmeSAqLyk7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyMjo6ZmluaXNoUmVzdW1lKCkgeworICAgIGlmIChtUmVzdW1lUGVuZGluZykgeworICAgICAgICBtUmVzdW1lUGVuZGluZyA9IGZhbHNlOworICAgICAgICBub3RpZnlEcml2ZXJTZWVrQ29tcGxldGUoKTsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpub3RpZnlEcml2ZXJTZWVrQ29tcGxldGUoKSB7CisgICAgaWYgKG1Ecml2ZXIgIT0gTlVMTCkgeworICAgICAgICBzcDxOdVBsYXllcjJEcml2ZXI+IGRyaXZlciA9IG1Ecml2ZXIucHJvbW90ZSgpOworICAgICAgICBpZiAoZHJpdmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5U2Vla0NvbXBsZXRlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpvblNvdXJjZU5vdGlmeShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIGludDMyX3Qgd2hhdDsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigid2hhdCIsICZ3aGF0KSk7CisKKyAgICBzd2l0Y2ggKHdoYXQpIHsKKyAgICAgICAgY2FzZSBTb3VyY2U6OmtXaGF0SW5zdGFudGlhdGVTZWN1cmVEZWNvZGVyczoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG1Tb3VyY2UgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBzdGFsZSBub3RpZmljYXRpb24gZnJvbSBhIHNvdXJjZSB0aGF0IHdhcworICAgICAgICAgICAgICAgIC8vIGFzeW5jaHJvbm91c2x5IHByZXBhcmluZyB3aGVuIHRoZSBjbGllbnQgY2FsbGVkIHJlc2V0KCkuCisgICAgICAgICAgICAgICAgLy8gV2UgaGFuZGxlZCB0aGUgcmVzZXQsIHRoZSBzb3VyY2UgaXMgZ29uZS4KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5OworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgicmVwbHkiLCAmcmVwbHkpKTsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG9uSW5zdGFudGlhdGVTZWN1cmVEZWNvZGVycygpOworICAgICAgICAgICAgcmVwbHktPnNldEludDMyKCJlcnIiLCBlcnIpOworICAgICAgICAgICAgcmVwbHktPnBvc3QoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBTb3VyY2U6OmtXaGF0UHJlcGFyZWQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIEFMT0dWKCJOdVBsYXllcjI6Om9uU291cmNlTm90aWZ5IFNvdXJjZTo6a1doYXRQcmVwYXJlZCBzb3VyY2U6ICVwIiwgbVNvdXJjZS5nZXQoKSk7CisgICAgICAgICAgICBpZiAobVNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHN0YWxlIG5vdGlmaWNhdGlvbiBmcm9tIGEgc291cmNlIHRoYXQgd2FzCisgICAgICAgICAgICAgICAgLy8gYXN5bmNocm9ub3VzbHkgcHJlcGFyaW5nIHdoZW4gdGhlIGNsaWVudCBjYWxsZWQgcmVzZXQoKS4KKyAgICAgICAgICAgICAgICAvLyBXZSBoYW5kbGVkIHRoZSByZXNldCwgdGhlIHNvdXJjZSBpcyBnb25lLgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQzMl90IGVycjsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7CisKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAvLyBzaHV0IGRvd24gcG90ZW50aWFsIHNlY3VyZSBjb2RlY3MgaW4gY2FzZSBjbGllbnQgbmV2ZXIgY2FsbHMgcmVzZXQKKyAgICAgICAgICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGbHVzaERlY29kZXJBY3Rpb24oRkxVU0hfQ01EX1NIVVRET1dOIC8qIGF1ZGlvICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTFVTSF9DTURfU0hVVERPV04gLyogdmlkZW8gKi8pKTsKKyAgICAgICAgICAgICAgICBwcm9jZXNzRGVmZXJyZWRBY3Rpb25zKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1QcmVwYXJlZCA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNwPE51UGxheWVyMkRyaXZlcj4gZHJpdmVyID0gbURyaXZlci5wcm9tb3RlKCk7CisgICAgICAgICAgICBpZiAoZHJpdmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAvLyBub3RpZnkgZHVyYXRpb24gZmlyc3QsIHNvIHRoYXQgaXQncyBkZWZpbml0ZWx5IHNldCB3aGVuCisgICAgICAgICAgICAgICAgLy8gdGhlIGFwcCByZWNlaXZlZCB0aGUgInByZXBhcmUgY29tcGxldGUiIGNhbGxiYWNrLgorICAgICAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb25VczsKKyAgICAgICAgICAgICAgICBpZiAobVNvdXJjZS0+Z2V0RHVyYXRpb24oJmR1cmF0aW9uVXMpID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5RHVyYXRpb24oZHVyYXRpb25Vcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5UHJlcGFyZUNvbXBsZXRlZChlcnIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE1vZHVsYXIgRFJNCisgICAgICAgIGNhc2UgU291cmNlOjprV2hhdERybUluZm86CisgICAgICAgIHsKKyAgICAgICAgICAgIFBhcmNlbCBwYXJjZWw7CisgICAgICAgICAgICBzcDxBQnVmZmVyPiBkcm1JbmZvOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kQnVmZmVyKCJkcm1JbmZvIiwgJmRybUluZm8pKTsKKyAgICAgICAgICAgIHBhcmNlbC5zZXREYXRhKGRybUluZm8tPmRhdGEoKSwgZHJtSW5mby0+c2l6ZSgpKTsKKworICAgICAgICAgICAgQUxPR1YoIm9uU291cmNlTm90aWZ5KCkga1doYXREcm1JbmZvIE1FRElBMl9EUk1fSU5GTyBkcm1JbmZvOiAlcCAgcGFyY2VsIHNpemU6ICV6dSIsCisgICAgICAgICAgICAgICAgICAgIGRybUluZm8uZ2V0KCksIHBhcmNlbC5kYXRhU2l6ZSgpKTsKKworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoTUVESUEyX0RSTV9JTkZPLCAwIC8qIGV4dDEgKi8sIDAgLyogZXh0MiAqLywgJnBhcmNlbCk7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBTb3VyY2U6OmtXaGF0RmxhZ3NDaGFuZ2VkOgorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBmbGFnczsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJmbGFncyIsIChpbnQzMl90ICopJmZsYWdzKSk7CisKKyAgICAgICAgICAgIHNwPE51UGxheWVyMkRyaXZlcj4gZHJpdmVyID0gbURyaXZlci5wcm9tb3RlKCk7CisgICAgICAgICAgICBpZiAoZHJpdmVyICE9IE5VTEwpIHsKKworICAgICAgICAgICAgICAgIEFMT0dWKCJvblNvdXJjZU5vdGlmeSgpIGtXaGF0RmxhZ3NDaGFuZ2VkICBGTEFHX0NBTl9QQVVTRTogJWQgICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJGTEFHX0NBTl9TRUVLX0JBQ0tXQVJEOiAlZCBcblx0XHRcdFx0IEZMQUdfQ0FOX1NFRUtfRk9SV0FSRDogJWQgICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJGTEFHX0NBTl9TRUVLOiAlZCAgRkxBR19EWU5BTUlDX0RVUkFUSU9OOiAlZCBcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcdFx0XHRcdCBGTEFHX1NFQ1VSRTogJWQgIEZMQUdfUFJPVEVDVEVEOiAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAoZmxhZ3MgJiBTb3VyY2U6OkZMQUdfQ0FOX1BBVVNFKSAhPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgKGZsYWdzICYgU291cmNlOjpGTEFHX0NBTl9TRUVLX0JBQ0tXQVJEKSAhPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgKGZsYWdzICYgU291cmNlOjpGTEFHX0NBTl9TRUVLX0ZPUldBUkQpICE9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAoZmxhZ3MgJiBTb3VyY2U6OkZMQUdfQ0FOX1NFRUspICE9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAoZmxhZ3MgJiBTb3VyY2U6OkZMQUdfRFlOQU1JQ19EVVJBVElPTikgIT0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChmbGFncyAmIFNvdXJjZTo6RkxBR19TRUNVUkUpICE9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAoZmxhZ3MgJiBTb3VyY2U6OkZMQUdfUFJPVEVDVEVEKSAhPSAwKTsKKworICAgICAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBOdVBsYXllcjI6OlNvdXJjZTo6RkxBR19DQU5fU0VFSykgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeUxpc3RlbmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBMl9JTkZPLCBNRURJQTJfSU5GT19OT1RfU0VFS0FCTEUsIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeUZsYWdzQ2hhbmdlZChmbGFncyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgobVNvdXJjZUZsYWdzICYgU291cmNlOjpGTEFHX0RZTkFNSUNfRFVSQVRJT04pCisgICAgICAgICAgICAgICAgICAgICYmICghKGZsYWdzICYgU291cmNlOjpGTEFHX0RZTkFNSUNfRFVSQVRJT04pKSkgeworICAgICAgICAgICAgICAgIGNhbmNlbFBvbGxEdXJhdGlvbigpOworICAgICAgICAgICAgfSBlbHNlIGlmICghKG1Tb3VyY2VGbGFncyAmIFNvdXJjZTo6RkxBR19EWU5BTUlDX0RVUkFUSU9OKQorICAgICAgICAgICAgICAgICAgICAmJiAoZmxhZ3MgJiBTb3VyY2U6OkZMQUdfRFlOQU1JQ19EVVJBVElPTikKKyAgICAgICAgICAgICAgICAgICAgJiYgKG1BdWRpb0RlY29kZXIgIT0gTlVMTCB8fCBtVmlkZW9EZWNvZGVyICE9IE5VTEwpKSB7CisgICAgICAgICAgICAgICAgc2NoZWR1bGVQb2xsRHVyYXRpb24oKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbVNvdXJjZUZsYWdzID0gZmxhZ3M7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgU291cmNlOjprV2hhdFZpZGVvU2l6ZUNoYW5nZWQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJmb3JtYXQiLCAmZm9ybWF0KSk7CisKKyAgICAgICAgICAgIHVwZGF0ZVZpZGVvU2l6ZShmb3JtYXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFNvdXJjZTo6a1doYXRCdWZmZXJpbmdVcGRhdGU6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgcGVyY2VudGFnZTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJwZXJjZW50YWdlIiwgJnBlcmNlbnRhZ2UpKTsKKworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoTUVESUEyX0JVRkZFUklOR19VUERBVEUsIHBlcmNlbnRhZ2UsIDApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFNvdXJjZTo6a1doYXRQYXVzZU9uQnVmZmVyaW5nU3RhcnQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGlnbm9yZSBpZiBub3QgcGxheWluZworICAgICAgICAgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgICAgICAgICAgQUxPR0koImJ1ZmZlciBsb3csIHBhdXNpbmcuLi4iKTsKKworICAgICAgICAgICAgICAgIHN0YXJ0UmVidWZmZXJpbmdUaW1lcigpOworICAgICAgICAgICAgICAgIG1QYXVzZWRGb3JCdWZmZXJpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgIG9uUGF1c2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKE1FRElBMl9JTkZPLCBNRURJQTJfSU5GT19CVUZGRVJJTkdfU1RBUlQsIDApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFNvdXJjZTo6a1doYXRSZXN1bWVPbkJ1ZmZlcmluZ0VuZDoKKyAgICAgICAgeworICAgICAgICAgICAgLy8gaWdub3JlIGlmIG5vdCBwbGF5aW5nCisgICAgICAgICAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgICAgICAgICBBTE9HSSgiYnVmZmVyIHJlYWR5LCByZXN1bWluZy4uLiIpOworCisgICAgICAgICAgICAgICAgc3RvcFJlYnVmZmVyaW5nVGltZXIoZmFsc2UpOworICAgICAgICAgICAgICAgIG1QYXVzZWRGb3JCdWZmZXJpbmcgPSBmYWxzZTsKKworICAgICAgICAgICAgICAgIC8vIGRvIG5vdCByZXN1bWUgeWV0IGlmIGNsaWVudCBkaWRuJ3QgdW5wYXVzZQorICAgICAgICAgICAgICAgIGlmICghbVBhdXNlZEJ5Q2xpZW50KSB7CisgICAgICAgICAgICAgICAgICAgIG9uUmVzdW1lKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoTUVESUEyX0lORk8sIE1FRElBMl9JTkZPX0JVRkZFUklOR19FTkQsIDApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFNvdXJjZTo6a1doYXRDYWNoZVN0YXRzOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IGticHM7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiYmFuZHdpZHRoIiwgJmticHMpKTsKKworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoTUVESUEyX0lORk8sIE1FRElBMl9JTkZPX05FVFdPUktfQkFORFdJRFRILCBrYnBzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBTb3VyY2U6OmtXaGF0U3VidGl0bGVEYXRhOgorICAgICAgICB7CisgICAgICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXI7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRCdWZmZXIoImJ1ZmZlciIsICZidWZmZXIpKTsKKworICAgICAgICAgICAgc2VuZFN1YnRpdGxlRGF0YShidWZmZXIsIDAgLyogYmFzZUluZGV4ICovKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBTb3VyY2U6OmtXaGF0VGltZWRNZXRhRGF0YToKKyAgICAgICAgeworICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyOworICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRCdWZmZXIoImJ1ZmZlciIsICZidWZmZXIpKSB7CisgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoTUVESUEyX0lORk8sIE1FRElBMl9JTkZPX01FVEFEQVRBX1VQREFURSwgMCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNlbmRUaW1lZE1ldGFEYXRhKGJ1ZmZlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgU291cmNlOjprV2hhdFRpbWVkVGV4dERhdGE6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgZ2VuZXJhdGlvbjsKKyAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiZ2VuZXJhdGlvbiIsICZnZW5lcmF0aW9uKQorICAgICAgICAgICAgICAgICAgICAmJiBnZW5lcmF0aW9uICE9IG1UaW1lZFRleHRHZW5lcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlcjsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEJ1ZmZlcigiYnVmZmVyIiwgJmJ1ZmZlcikpOworCisgICAgICAgICAgICBzcDxOdVBsYXllcjJEcml2ZXI+IGRyaXZlciA9IG1Ecml2ZXIucHJvbW90ZSgpOworICAgICAgICAgICAgaWYgKGRyaXZlciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBwb3NNczsKKyAgICAgICAgICAgIGludDY0X3QgdGltZVVzLCBwb3NVczsKKyAgICAgICAgICAgIGRyaXZlci0+Z2V0Q3VycmVudFBvc2l0aW9uKCZwb3NNcyk7CisgICAgICAgICAgICBwb3NVcyA9IChpbnQ2NF90KSBwb3NNcyAqIDEwMDBsbDsKKyAgICAgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKKworICAgICAgICAgICAgaWYgKHBvc1VzIDwgdGltZVVzKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiZ2VuZXJhdGlvbiIsICZnZW5lcmF0aW9uKSkgeworICAgICAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbVRpbWVkVGV4dEdlbmVyYXRpb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtc2ctPnBvc3QodGltZVVzIC0gcG9zVXMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzZW5kVGltZWRUZXh0RGF0YShidWZmZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFNvdXJjZTo6a1doYXRRdWV1ZURlY29kZXJTaHV0ZG93bjoKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCBhdWRpbywgdmlkZW87CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiYXVkaW8iLCAmYXVkaW8pKTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ2aWRlbyIsICZ2aWRlbykpOworCisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHk7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJyZXBseSIsICZyZXBseSkpOworCisgICAgICAgICAgICBxdWV1ZURlY29kZXJTaHV0ZG93bihhdWRpbywgdmlkZW8sIHJlcGx5KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBTb3VyY2U6OmtXaGF0RHJtTm9MaWNlbnNlOgorICAgICAgICB7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihNRURJQTJfRVJST1IsIE1FRElBMl9FUlJPUl9VTktOT1dOLCBFUlJPUl9EUk1fTk9fTElDRU5TRSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBUUkVTUEFTUygpOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjI6Om9uQ2xvc2VkQ2FwdGlvbk5vdGlmeShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIGludDMyX3Qgd2hhdDsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigid2hhdCIsICZ3aGF0KSk7CisKKyAgICBzd2l0Y2ggKHdoYXQpIHsKKyAgICAgICAgY2FzZSBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6a1doYXRDbG9zZWRDYXB0aW9uRGF0YToKKyAgICAgICAgeworICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kQnVmZmVyKCJidWZmZXIiLCAmYnVmZmVyKSk7CisKKyAgICAgICAgICAgIHNpemVfdCBpbmJhbmRUcmFja3MgPSAwOworICAgICAgICAgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGluYmFuZFRyYWNrcyA9IG1Tb3VyY2UtPmdldFRyYWNrQ291bnQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2VuZFN1YnRpdGxlRGF0YShidWZmZXIsIGluYmFuZFRyYWNrcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgTnVQbGF5ZXIyOjpDQ0RlY29kZXI6OmtXaGF0VHJhY2tBZGRlZDoKKyAgICAgICAgeworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoTUVESUEyX0lORk8sIE1FRElBMl9JTkZPX01FVEFEQVRBX1VQREFURSwgMCk7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFRSRVNQQVNTKCk7CisgICAgfQorCisKK30KKwordm9pZCBOdVBsYXllcjI6OnNlbmRTdWJ0aXRsZURhdGEoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlciwgaW50MzJfdCBiYXNlSW5kZXgpIHsKKyAgICBpbnQzMl90IHRyYWNrSW5kZXg7CisgICAgaW50NjRfdCB0aW1lVXMsIGR1cmF0aW9uVXM7CisgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigidHJhY2tJbmRleCIsICZ0cmFja0luZGV4KSk7CisgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOworICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoImR1cmF0aW9uVXMiLCAmZHVyYXRpb25VcykpOworCisgICAgUGFyY2VsIGluOworICAgIGluLndyaXRlSW50MzIodHJhY2tJbmRleCArIGJhc2VJbmRleCk7CisgICAgaW4ud3JpdGVJbnQ2NCh0aW1lVXMpOworICAgIGluLndyaXRlSW50NjQoZHVyYXRpb25Vcyk7CisgICAgaW4ud3JpdGVJbnQzMihidWZmZXItPnNpemUoKSk7CisgICAgaW4ud3JpdGVJbnQzMihidWZmZXItPnNpemUoKSk7CisgICAgaW4ud3JpdGUoYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKKworICAgIG5vdGlmeUxpc3RlbmVyKE1FRElBMl9TVUJUSVRMRV9EQVRBLCAwLCAwLCAmaW4pOworfQorCit2b2lkIE51UGxheWVyMjo6c2VuZFRpbWVkTWV0YURhdGEoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgeworICAgIGludDY0X3QgdGltZVVzOworICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKKworICAgIFBhcmNlbCBpbjsKKyAgICBpbi53cml0ZUludDY0KHRpbWVVcyk7CisgICAgaW4ud3JpdGVJbnQzMihidWZmZXItPnNpemUoKSk7CisgICAgaW4ud3JpdGVJbnQzMihidWZmZXItPnNpemUoKSk7CisgICAgaW4ud3JpdGUoYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKKworICAgIG5vdGlmeUxpc3RlbmVyKE1FRElBMl9NRVRBX0RBVEEsIDAsIDAsICZpbik7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpzZW5kVGltZWRUZXh0RGF0YShjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgY29uc3Qgdm9pZCAqZGF0YTsKKyAgICBzaXplX3Qgc2l6ZSA9IDA7CisgICAgaW50NjRfdCB0aW1lVXM7CisgICAgaW50MzJfdCBmbGFnID0gVGV4dERlc2NyaXB0aW9uczo6SU5fQkFORF9URVhUXzNHUFA7CisKKyAgICBBU3RyaW5nIG1pbWU7CisgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpOworICAgIENIRUNLKHN0cmNhc2VjbXAobWltZS5jX3N0cigpLCBNRURJQV9NSU1FVFlQRV9URVhUXzNHUFApID09IDApOworCisgICAgZGF0YSA9IGJ1ZmZlci0+ZGF0YSgpOworICAgIHNpemUgPSBidWZmZXItPnNpemUoKTsKKworICAgIFBhcmNlbCBwYXJjZWw7CisgICAgaWYgKHNpemUgPiAwKSB7CisgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKKyAgICAgICAgaW50MzJfdCBnbG9iYWwgPSAwOworICAgICAgICBpZiAoYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigiZ2xvYmFsIiwgJmdsb2JhbCkgJiYgZ2xvYmFsKSB7CisgICAgICAgICAgICBmbGFnIHw9IFRleHREZXNjcmlwdGlvbnM6OkdMT0JBTF9ERVNDUklQVElPTlM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmbGFnIHw9IFRleHREZXNjcmlwdGlvbnM6OkxPQ0FMX0RFU0NSSVBUSU9OUzsKKyAgICAgICAgfQorICAgICAgICBUZXh0RGVzY3JpcHRpb25zOjpnZXRQYXJjZWxPZkRlc2NyaXB0aW9ucygKKyAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKWRhdGEsIHNpemUsIGZsYWcsIHRpbWVVcyAvIDEwMDAsICZwYXJjZWwpOworICAgIH0KKworICAgIGlmICgocGFyY2VsLmRhdGFTaXplKCkgPiAwKSkgeworICAgICAgICBub3RpZnlMaXN0ZW5lcihNRURJQTJfVElNRURfVEVYVCwgMCwgMCwgJnBhcmNlbCk7CisgICAgfSBlbHNlIHsgIC8vIHNlbmQgYW4gZW1wdHkgdGltZWQgdGV4dAorICAgICAgICBub3RpZnlMaXN0ZW5lcihNRURJQTJfVElNRURfVEVYVCwgMCwgMCk7CisgICAgfQorfQorCitjb25zdCBjaGFyICpOdVBsYXllcjI6OmdldERhdGFTb3VyY2VUeXBlKCkgeworICAgIHN3aXRjaCAobURhdGFTb3VyY2VUeXBlKSB7CisgICAgICAgIGNhc2UgREFUQV9TT1VSQ0VfVFlQRV9IVFRQX0xJVkU6CisgICAgICAgICAgICByZXR1cm4gIkhUVFBMaXZlIjsKKworICAgICAgICBjYXNlIERBVEFfU09VUkNFX1RZUEVfUlRTUDoKKyAgICAgICAgICAgIHJldHVybiAiUlRTUCI7CisKKyAgICAgICAgY2FzZSBEQVRBX1NPVVJDRV9UWVBFX0dFTkVSSUNfVVJMOgorICAgICAgICAgICAgcmV0dXJuICJHZW5VUkwiOworCisgICAgICAgIGNhc2UgREFUQV9TT1VSQ0VfVFlQRV9HRU5FUklDX0ZEOgorICAgICAgICAgICAgcmV0dXJuICJHZW5GRCI7CisKKyAgICAgICAgY2FzZSBEQVRBX1NPVVJDRV9UWVBFX01FRElBOgorICAgICAgICAgICAgcmV0dXJuICJNZWRpYSI7CisKKyAgICAgICAgY2FzZSBEQVRBX1NPVVJDRV9UWVBFX1NUUkVBTToKKyAgICAgICAgICAgIHJldHVybiAiU3RyZWFtIjsKKworICAgICAgICBjYXNlIERBVEFfU09VUkNFX1RZUEVfTk9ORToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiTm9uZSI7CisgICAgfQorIH0KKworLy8gTW9kdWxhciBEUk0gYmVnaW4KK3N0YXR1c190IE51UGxheWVyMjo6cHJlcGFyZURybShjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBWZWN0b3I8dWludDhfdD4gJmRybVNlc3Npb25JZCkKK3sKKyAgICBBTE9HVigicHJlcGFyZURybSAiKTsKKworICAgIC8vIFBhc3NpbmcgdG8gdGhlIGxvb3BlciBhbnl3YXk7IGNhbGxlZCBpbiBhIHByZS1jb25maWcgcHJlcGFyZWQgc3RhdGUgc28gbm8gcmFjZSBvbiBtQ3J5cHRvCisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFByZXBhcmVEcm0sIHRoaXMpOworICAgIC8vIHN5bmNocm9ub3VzIGNhbGwgc28ganVzdCBwYXNzaW5nIHRoZSBhZGRyZXNzIGJ1dCB3aXRoIGxvY2FsIGNvcGllcyBvZiAiY29uc3QiIGFyZ3MKKyAgICB1aW50OF90IFVVSURbMTZdOworICAgIG1lbWNweShVVUlELCB1dWlkLCBzaXplb2YoVVVJRCkpOworICAgIFZlY3Rvcjx1aW50OF90PiBzZXNzaW9uSWQgPSBkcm1TZXNzaW9uSWQ7CisgICAgbXNnLT5zZXRQb2ludGVyKCJ1dWlkIiwgKHZvaWQqKVVVSUQpOworICAgIG1zZy0+c2V0UG9pbnRlcigiZHJtU2Vzc2lvbklkIiwgKHZvaWQqKSZzZXNzaW9uSWQpOworCisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKKworICAgIGlmIChzdGF0dXMgPT0gT0sgJiYgcmVzcG9uc2UgIT0gTlVMTCkgeworICAgICAgICBDSEVDSyhyZXNwb25zZS0+ZmluZEludDMyKCJzdGF0dXMiLCAmc3RhdHVzKSk7CisgICAgICAgIEFMT0dWKCJwcmVwYXJlRHJtIHJldDogJWQgIiwgc3RhdHVzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgicHJlcGFyZURybSBlcnI6ICVkIiwgc3RhdHVzKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBOdVBsYXllcjI6OnJlbGVhc2VEcm0oKQoreworICAgIEFMT0dWKCJyZWxlYXNlRHJtICIpOworCisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFJlbGVhc2VEcm0sIHRoaXMpOworCisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKKworICAgIGlmIChzdGF0dXMgPT0gT0sgJiYgcmVzcG9uc2UgIT0gTlVMTCkgeworICAgICAgICBDSEVDSyhyZXNwb25zZS0+ZmluZEludDMyKCJzdGF0dXMiLCAmc3RhdHVzKSk7CisgICAgICAgIEFMT0dWKCJyZWxlYXNlRHJtIHJldDogJWQgIiwgc3RhdHVzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgicmVsZWFzZURybSBlcnI6ICVkIiwgc3RhdHVzKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBOdVBsYXllcjI6Om9uUHJlcGFyZURybShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykKK3sKKyAgICAvLyBUT0RPIGNoYW5nZSB0byBBTE9HVgorICAgIEFMT0dEKCJvblByZXBhcmVEcm0gIik7CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICBpZiAobVNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJvblByZXBhcmVEcm06IE5vIHNvdXJjZS4gb25QcmVwYXJlRHJtIGZhaWxlZCB3aXRoICVkLiIsIHN0YXR1cyk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgdWludDhfdCAqdXVpZDsKKyAgICBWZWN0b3I8dWludDhfdD4gKmRybVNlc3Npb25JZDsKKyAgICBDSEVDSyhtc2ctPmZpbmRQb2ludGVyKCJ1dWlkIiwgKHZvaWQqKikmdXVpZCkpOworICAgIENIRUNLKG1zZy0+ZmluZFBvaW50ZXIoImRybVNlc3Npb25JZCIsICh2b2lkKiopJmRybVNlc3Npb25JZCkpOworCisgICAgc3RhdHVzID0gT0s7CisgICAgc3A8QU1lZGlhQ3J5cHRvV3JhcHBlcj4gY3J5cHRvID0gTlVMTDsKKworICAgIHN0YXR1cyA9IG1Tb3VyY2UtPnByZXBhcmVEcm0odXVpZCwgKmRybVNlc3Npb25JZCwgJmNyeXB0byk7CisgICAgaWYgKGNyeXB0byA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJvblByZXBhcmVEcm06IG1Tb3VyY2UtPnByZXBhcmVEcm0gZmFpbGVkLiBzdGF0dXM6ICVkIiwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgQUxPR1YoIm9uUHJlcGFyZURybTogbVNvdXJjZS0+cHJlcGFyZURybSBzdWNjZWVkZWQiKTsKKworICAgIGlmIChtQ3J5cHRvICE9IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIm9uUHJlcGFyZURybTogVW5leHBlY3RlZC4gQWxyZWFkeSBoYXZpbmcgbUNyeXB0bzogJXAiLCBtQ3J5cHRvLmdldCgpKTsKKyAgICAgICAgbUNyeXB0by5jbGVhcigpOworICAgIH0KKworICAgIG1DcnlwdG8gPSBjcnlwdG87CisgICAgbUlzRHJtUHJvdGVjdGVkID0gdHJ1ZTsKKyAgICAvLyBUT0RPIGNoYW5nZSB0byBBTE9HVgorICAgIEFMT0dEKCJvblByZXBhcmVEcm06IG1DcnlwdG86ICVwIiwgbUNyeXB0by5nZXQoKSk7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBOdVBsYXllcjI6Om9uUmVsZWFzZURybSgpCit7CisgICAgLy8gVE9ETyBjaGFuZ2UgdG8gQUxPR1YKKyAgICBBTE9HRCgib25SZWxlYXNlRHJtICIpOworCisgICAgaWYgKCFtSXNEcm1Qcm90ZWN0ZWQpIHsKKyAgICAgICAgQUxPR1coIm9uUmVsZWFzZURybTogVW5leHBlY3RlZC4gbUlzRHJtUHJvdGVjdGVkIGlzIGFscmVhZHkgZmFsc2UuIik7CisgICAgfQorCisgICAgbUlzRHJtUHJvdGVjdGVkID0gZmFsc2U7CisKKyAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgaWYgKG1DcnlwdG8gIT0gTlVMTCkgeworICAgICAgICAvLyBub3RpZnlpbmcgdGhlIHNvdXJjZSBmaXJzdCBiZWZvcmUgcmVtb3ZpbmcgY3J5cHRvIGZyb20gY29kZWMKKyAgICAgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgbVNvdXJjZS0+cmVsZWFzZURybSgpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzPU9LOworICAgICAgICAvLyBmaXJzdCBtYWtpbmcgc3VyZSB0aGUgY29kZWNzIGhhdmUgcmVsZWFzZWQgdGhlaXIgY3J5cHRvIHJlZmVyZW5jZQorICAgICAgICBjb25zdCBzcDxEZWNvZGVyQmFzZT4gJnZpZGVvRGVjb2RlciA9IGdldERlY29kZXIoZmFsc2UvKmF1ZGlvKi8pOworICAgICAgICBpZiAodmlkZW9EZWNvZGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IHZpZGVvRGVjb2Rlci0+cmVsZWFzZUNyeXB0bygpOworICAgICAgICAgICAgQUxPR1YoIm9uUmVsZWFzZURybTogdmlkZW8gZGVjb2RlciByZXQ6ICVkIiwgc3RhdHVzKTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IHNwPERlY29kZXJCYXNlPiAmYXVkaW9EZWNvZGVyID0gZ2V0RGVjb2Rlcih0cnVlLyphdWRpbyovKTsKKyAgICAgICAgaWYgKGF1ZGlvRGVjb2RlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXNfYXVkaW8gPSBhdWRpb0RlY29kZXItPnJlbGVhc2VDcnlwdG8oKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsgICAvLyBvdGhlcndpc2UsIHJldHVybmluZyB0aGUgZmlyc3QgZXJyb3IKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzdGF0dXNfYXVkaW87CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigib25SZWxlYXNlRHJtOiBhdWRpbyBkZWNvZGVyIHJldDogJWQiLCBzdGF0dXNfYXVkaW8pOworICAgICAgICB9CisKKyAgICAgICAgLy8gVE9ETyBjaGFuZ2UgdG8gQUxPR1YKKyAgICAgICAgQUxPR0QoIm9uUmVsZWFzZURybTogbUNyeXB0bzogJXAiLCBtQ3J5cHRvLmdldCgpKTsKKyAgICAgICAgbUNyeXB0by5jbGVhcigpOworICAgIH0gZWxzZSB7ICAgLy8gbUNyeXB0byA9PSBOVUxMCisgICAgICAgIEFMT0dFKCJvblJlbGVhc2VEcm06IFVuZXhwZWN0ZWQuIFRoZXJlIGlzIG5vIGNyeXB0by4iKTsKKyAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsKK30KKy8vIE1vZHVsYXIgRFJNIGVuZAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3A8QU1lc3NhZ2U+IE51UGxheWVyMjo6U291cmNlOjpnZXRGb3JtYXQoYm9vbCBhdWRpbykgeworICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gZ2V0Rm9ybWF0TWV0YShhdWRpbyk7CisKKyAgICBpZiAobWV0YSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2U7CisKKyAgICBpZihjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2UobWV0YSwgJm1zZykgPT0gT0spIHsKKyAgICAgICAgcmV0dXJuIG1zZzsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpTb3VyY2U6Om5vdGlmeUZsYWdzQ2hhbmdlZCh1aW50MzJfdCBmbGFncykgeworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBkdXBOb3RpZnkoKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRGbGFnc0NoYW5nZWQpOworICAgIG5vdGlmeS0+c2V0SW50MzIoImZsYWdzIiwgZmxhZ3MpOworICAgIG5vdGlmeS0+cG9zdCgpOworfQorCit2b2lkIE51UGxheWVyMjo6U291cmNlOjpub3RpZnlWaWRlb1NpemVDaGFuZ2VkKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KSB7CisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IGR1cE5vdGlmeSgpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFZpZGVvU2l6ZUNoYW5nZWQpOworICAgIG5vdGlmeS0+c2V0TWVzc2FnZSgiZm9ybWF0IiwgZm9ybWF0KTsKKyAgICBub3RpZnktPnBvc3QoKTsKK30KKwordm9pZCBOdVBsYXllcjI6OlNvdXJjZTo6bm90aWZ5UHJlcGFyZWQoc3RhdHVzX3QgZXJyKSB7CisgICAgQUxPR1YoIlNvdXJjZTo6bm90aWZ5UHJlcGFyZWQgJWQiLCBlcnIpOworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBkdXBOb3RpZnkoKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRQcmVwYXJlZCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKKyAgICBub3RpZnktPnBvc3QoKTsKK30KKwordm9pZCBOdVBsYXllcjI6OlNvdXJjZTo6bm90aWZ5RHJtSW5mbyhjb25zdCBzcDxBQnVmZmVyPiAmZHJtSW5mb0J1ZmZlcikKK3sKKyAgICBBTE9HVigiU291cmNlOjpub3RpZnlEcm1JbmZvIik7CisKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gZHVwTm90aWZ5KCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0RHJtSW5mbyk7CisgICAgbm90aWZ5LT5zZXRCdWZmZXIoImRybUluZm8iLCBkcm1JbmZvQnVmZmVyKTsKKworICAgIG5vdGlmeS0+cG9zdCgpOworfQorCit2b2lkIE51UGxheWVyMjo6U291cmNlOjpub3RpZnlJbnN0YW50aWF0ZVNlY3VyZURlY29kZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmcmVwbHkpIHsKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gZHVwTm90aWZ5KCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0SW5zdGFudGlhdGVTZWN1cmVEZWNvZGVycyk7CisgICAgbm90aWZ5LT5zZXRNZXNzYWdlKCJyZXBseSIsIHJlcGx5KTsKKyAgICBub3RpZnktPnBvc3QoKTsKK30KKwordm9pZCBOdVBsYXllcjI6OlNvdXJjZTo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICYgLyogbXNnICovKSB7CisgICAgVFJFU1BBU1MoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL251cGxheWVyMi9OdVBsYXllcjIuaCBiL21lZGlhL2xpYm1lZGlhL251cGxheWVyMi9OdVBsYXllcjIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzhiMjU5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvbnVwbGF5ZXIyL051UGxheWVyMi5oCkBAIC0wLDAgKzEsMzQ2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE5VX1BMQVlFUjJfSF8KKworI2RlZmluZSBOVV9QTEFZRVIyX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhUGxheWVyMkludGVyZmFjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQUJ1ZmZlcjsKK3N0cnVjdCBBTWVkaWFDcnlwdG9XcmFwcGVyOworc3RydWN0IEFNZXNzYWdlOworc3RydWN0IEFOYXRpdmVXaW5kb3dXcmFwcGVyOworc3RydWN0IEF1ZGlvUGxheWJhY2tSYXRlOworc3RydWN0IEFWU3luY1NldHRpbmdzOworY2xhc3MgSURhdGFTb3VyY2U7CitzdHJ1Y3QgTWVkaWFDbG9jazsKK3N0cnVjdCBNZWRpYUhUVFBTZXJ2aWNlOworY2xhc3MgTWV0YURhdGE7CitzdHJ1Y3QgTnVQbGF5ZXIyRHJpdmVyOworCitzdHJ1Y3QgTnVQbGF5ZXIyIDogcHVibGljIEFIYW5kbGVyIHsKKyAgICBleHBsaWNpdCBOdVBsYXllcjIocGlkX3QgcGlkLCBjb25zdCBzcDxNZWRpYUNsb2NrPiAmbWVkaWFDbG9jayk7CisKKyAgICB2b2lkIHNldFVJRCh1aWRfdCB1aWQpOworCisgICAgdm9pZCBzZXREcml2ZXIoY29uc3Qgd3A8TnVQbGF5ZXIyRHJpdmVyPiAmZHJpdmVyKTsKKworICAgIHZvaWQgc2V0RGF0YVNvdXJjZUFzeW5jKGNvbnN0IHNwPElTdHJlYW1Tb3VyY2U+ICZzb3VyY2UpOworCisgICAgdm9pZCBzZXREYXRhU291cmNlQXN5bmMoCisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsCisgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7CisKKyAgICB2b2lkIHNldERhdGFTb3VyY2VBc3luYyhpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7CisKKyAgICB2b2lkIHNldERhdGFTb3VyY2VBc3luYyhjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKTsKKworICAgIHN0YXR1c190IGdldEJ1ZmZlcmluZ1NldHRpbmdzKEJ1ZmZlcmluZ1NldHRpbmdzKiBidWZmZXJpbmcgLyogbm9ubnVsbCAqLyk7CisgICAgc3RhdHVzX3Qgc2V0QnVmZmVyaW5nU2V0dGluZ3MoY29uc3QgQnVmZmVyaW5nU2V0dGluZ3MmIGJ1ZmZlcmluZyk7CisKKyAgICB2b2lkIHByZXBhcmVBc3luYygpOworCisgICAgdm9pZCBzZXRWaWRlb1N1cmZhY2VUZXh0dXJlQXN5bmMoY29uc3Qgc3A8QU5hdGl2ZVdpbmRvd1dyYXBwZXI+ICZud3cpOworCisgICAgdm9pZCBzZXRBdWRpb1NpbmsoY29uc3Qgc3A8TWVkaWFQbGF5ZXIyQmFzZTo6QXVkaW9TaW5rPiAmc2luayk7CisgICAgc3RhdHVzX3Qgc2V0UGxheWJhY2tTZXR0aW5ncyhjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcmF0ZSk7CisgICAgc3RhdHVzX3QgZ2V0UGxheWJhY2tTZXR0aW5ncyhBdWRpb1BsYXliYWNrUmF0ZSAqcmF0ZSAvKiBub25udWxsICovKTsKKyAgICBzdGF0dXNfdCBzZXRTeW5jU2V0dGluZ3MoY29uc3QgQVZTeW5jU2V0dGluZ3MgJnN5bmMsIGZsb2F0IHZpZGVvRnBzSGludCk7CisgICAgc3RhdHVzX3QgZ2V0U3luY1NldHRpbmdzKEFWU3luY1NldHRpbmdzICpzeW5jIC8qIG5vbm51bGwgKi8sIGZsb2F0ICp2aWRlb0ZwcyAvKiBub25udWxsICovKTsKKworICAgIHZvaWQgc3RhcnQoKTsKKworICAgIHZvaWQgcGF1c2UoKTsKKworICAgIC8vIFdpbGwgbm90aWZ5IHRoZSBkcml2ZXIgdGhyb3VnaCAibm90aWZ5UmVzZXRDb21wbGV0ZSIgb25jZSBmaW5pc2hlZC4KKyAgICB2b2lkIHJlc2V0QXN5bmMoKTsKKworICAgIC8vIFJlcXVlc3QgYSBub3RpZmljYXRpb24gd2hlbiBzcGVjaWZpZWQgbWVkaWEgdGltZSBpcyByZWFjaGVkLgorICAgIHN0YXR1c190IG5vdGlmeUF0KGludDY0X3QgbWVkaWFUaW1lVXMpOworCisgICAgLy8gV2lsbCBub3RpZnkgdGhlIGRyaXZlciB0aHJvdWdoICJub3RpZnlTZWVrQ29tcGxldGUiIG9uY2UgZmluaXNoZWQKKyAgICAvLyBhbmQgbmVlZE5vdGlmeSBpcyB0cnVlLgorICAgIHZvaWQgc2Vla1RvQXN5bmMoCisgICAgICAgICAgICBpbnQ2NF90IHNlZWtUaW1lVXMsCisgICAgICAgICAgICBNZWRpYVBsYXllcjJTZWVrTW9kZSBtb2RlID0gTWVkaWFQbGF5ZXIyU2Vla01vZGU6OlNFRUtfUFJFVklPVVNfU1lOQywKKyAgICAgICAgICAgIGJvb2wgbmVlZE5vdGlmeSA9IGZhbHNlKTsKKworICAgIHN0YXR1c190IHNldFZpZGVvU2NhbGluZ01vZGUoaW50MzJfdCBtb2RlKTsKKyAgICBzdGF0dXNfdCBnZXRUcmFja0luZm8oUGFyY2VsKiByZXBseSkgY29uc3Q7CisgICAgc3RhdHVzX3QgZ2V0U2VsZWN0ZWRUcmFjayhpbnQzMl90IHR5cGUsIFBhcmNlbCogcmVwbHkpIGNvbnN0OworICAgIHN0YXR1c190IHNlbGVjdFRyYWNrKHNpemVfdCB0cmFja0luZGV4LCBib29sIHNlbGVjdCwgaW50NjRfdCB0aW1lVXMpOworICAgIHN0YXR1c190IGdldEN1cnJlbnRQb3NpdGlvbihpbnQ2NF90ICptZWRpYVVzKTsKKyAgICB2b2lkIGdldFN0YXRzKFZlY3RvcjxzcDxBTWVzc2FnZT4gPiAqbVRyYWNrU3RhdHMpOworCisgICAgc3A8TWV0YURhdGE+IGdldEZpbGVNZXRhKCk7CisgICAgZmxvYXQgZ2V0RnJhbWVSYXRlKCk7CisKKyAgICAvLyBNb2R1bGFyIERSTQorICAgIHN0YXR1c190IHByZXBhcmVEcm0oY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZkcm1TZXNzaW9uSWQpOworICAgIHN0YXR1c190IHJlbGVhc2VEcm0oKTsKKworICAgIGNvbnN0IGNoYXIgKmdldERhdGFTb3VyY2VUeXBlKCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5OdVBsYXllcjIoKTsKKworICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisKK3B1YmxpYzoKKyAgICBzdHJ1Y3QgU3RyZWFtTGlzdGVuZXI7CisgICAgc3RydWN0IFNvdXJjZTsKKworcHJpdmF0ZToKKyAgICBzdHJ1Y3QgRGVjb2RlcjsKKyAgICBzdHJ1Y3QgRGVjb2RlckJhc2U7CisgICAgc3RydWN0IERlY29kZXJQYXNzVGhyb3VnaDsKKyAgICBzdHJ1Y3QgQ0NEZWNvZGVyOworICAgIHN0cnVjdCBHZW5lcmljU291cmNlOworICAgIHN0cnVjdCBIVFRQTGl2ZVNvdXJjZTsKKyAgICBzdHJ1Y3QgUmVuZGVyZXI7CisgICAgc3RydWN0IFJUU1BTb3VyY2U7CisgICAgc3RydWN0IFN0cmVhbWluZ1NvdXJjZTsKKyAgICBzdHJ1Y3QgQWN0aW9uOworICAgIHN0cnVjdCBTZWVrQWN0aW9uOworICAgIHN0cnVjdCBTZXRTdXJmYWNlQWN0aW9uOworICAgIHN0cnVjdCBSZXN1bWVEZWNvZGVyQWN0aW9uOworICAgIHN0cnVjdCBGbHVzaERlY29kZXJBY3Rpb247CisgICAgc3RydWN0IFBvc3RNZXNzYWdlQWN0aW9uOworICAgIHN0cnVjdCBTaW1wbGVBY3Rpb247CisKKyAgICBlbnVtIHsKKyAgICAgICAga1doYXRTZXREYXRhU291cmNlICAgICAgICAgICAgICA9ICc9RGFTJywKKyAgICAgICAga1doYXRQcmVwYXJlICAgICAgICAgICAgICAgICAgICA9ICdwcmVwJywKKyAgICAgICAga1doYXRTZXRWaWRlb1N1cmZhY2UgICAgICAgICAgICA9ICc9VlN1JywKKyAgICAgICAga1doYXRTZXRBdWRpb1NpbmsgICAgICAgICAgICAgICA9ICc9QXVTJywKKyAgICAgICAga1doYXRNb3JlRGF0YVF1ZXVlZCAgICAgICAgICAgICA9ICdtb3JlJywKKyAgICAgICAga1doYXRDb25maWdQbGF5YmFjayAgICAgICAgICAgICA9ICdjZlBCJywKKyAgICAgICAga1doYXRDb25maWdTeW5jICAgICAgICAgICAgICAgICA9ICdjZlN5JywKKyAgICAgICAga1doYXRHZXRQbGF5YmFja1NldHRpbmdzICAgICAgICA9ICdnUGJTJywKKyAgICAgICAga1doYXRHZXRTeW5jU2V0dGluZ3MgICAgICAgICAgICA9ICdnU3lTJywKKyAgICAgICAga1doYXRTdGFydCAgICAgICAgICAgICAgICAgICAgICA9ICdzdHJ0JywKKyAgICAgICAga1doYXRTY2FuU291cmNlcyAgICAgICAgICAgICAgICA9ICdzY2FuJywKKyAgICAgICAga1doYXRWaWRlb05vdGlmeSAgICAgICAgICAgICAgICA9ICd2aWROJywKKyAgICAgICAga1doYXRBdWRpb05vdGlmeSAgICAgICAgICAgICAgICA9ICdhdWROJywKKyAgICAgICAga1doYXRDbG9zZWRDYXB0aW9uTm90aWZ5ICAgICAgICA9ICdjYXBOJywKKyAgICAgICAga1doYXRSZW5kZXJlck5vdGlmeSAgICAgICAgICAgICA9ICdyZW5OJywKKyAgICAgICAga1doYXRSZXNldCAgICAgICAgICAgICAgICAgICAgICA9ICdyc2V0JywKKyAgICAgICAga1doYXROb3RpZnlUaW1lICAgICAgICAgICAgICAgICA9ICduZnlUJywKKyAgICAgICAga1doYXRTZWVrICAgICAgICAgICAgICAgICAgICAgICA9ICdzZWVrJywKKyAgICAgICAga1doYXRQYXVzZSAgICAgICAgICAgICAgICAgICAgICA9ICdwYXVzJywKKyAgICAgICAga1doYXRSZXN1bWUgICAgICAgICAgICAgICAgICAgICA9ICdyc21lJywKKyAgICAgICAga1doYXRQb2xsRHVyYXRpb24gICAgICAgICAgICAgICA9ICdwb2xEJywKKyAgICAgICAga1doYXRTb3VyY2VOb3RpZnkgICAgICAgICAgICAgICA9ICdzcmNOJywKKyAgICAgICAga1doYXRHZXRUcmFja0luZm8gICAgICAgICAgICAgICA9ICdnVHJJJywKKyAgICAgICAga1doYXRHZXRTZWxlY3RlZFRyYWNrICAgICAgICAgICA9ICdnU2VsJywKKyAgICAgICAga1doYXRTZWxlY3RUcmFjayAgICAgICAgICAgICAgICA9ICdzZWxUJywKKyAgICAgICAga1doYXRHZXRCdWZmZXJpbmdTZXR0aW5ncyAgICAgICA9ICdnQnVzJywKKyAgICAgICAga1doYXRTZXRCdWZmZXJpbmdTZXR0aW5ncyAgICAgICA9ICdzQnVTJywKKyAgICAgICAga1doYXRQcmVwYXJlRHJtICAgICAgICAgICAgICAgICA9ICdwRHJtJywKKyAgICAgICAga1doYXRSZWxlYXNlRHJtICAgICAgICAgICAgICAgICA9ICdyRHJtJywKKyAgICB9OworCisgICAgd3A8TnVQbGF5ZXIyRHJpdmVyPiBtRHJpdmVyOworICAgIGJvb2wgbVVJRFZhbGlkOworICAgIHVpZF90IG1VSUQ7CisgICAgcGlkX3QgbVBJRDsKKyAgICBjb25zdCBzcDxNZWRpYUNsb2NrPiBtTWVkaWFDbG9jazsKKyAgICBNdXRleCBtU291cmNlTG9jazsgIC8vIGd1YXJkIHxtU291cmNlfC4KKyAgICBzcDxTb3VyY2U+IG1Tb3VyY2U7CisgICAgdWludDMyX3QgbVNvdXJjZUZsYWdzOworICAgIHNwPEFOYXRpdmVXaW5kb3dXcmFwcGVyPiBtTmF0aXZlV2luZG93OworICAgIHNwPE1lZGlhUGxheWVyMkJhc2U6OkF1ZGlvU2luaz4gbUF1ZGlvU2luazsKKyAgICBzcDxEZWNvZGVyQmFzZT4gbVZpZGVvRGVjb2RlcjsKKyAgICBib29sIG1PZmZsb2FkQXVkaW87CisgICAgc3A8RGVjb2RlckJhc2U+IG1BdWRpb0RlY29kZXI7CisgICAgc3A8Q0NEZWNvZGVyPiBtQ0NEZWNvZGVyOworICAgIHNwPFJlbmRlcmVyPiBtUmVuZGVyZXI7CisgICAgc3A8QUxvb3Blcj4gbVJlbmRlcmVyTG9vcGVyOworICAgIGludDMyX3QgbUF1ZGlvRGVjb2RlckdlbmVyYXRpb247CisgICAgaW50MzJfdCBtVmlkZW9EZWNvZGVyR2VuZXJhdGlvbjsKKyAgICBpbnQzMl90IG1SZW5kZXJlckdlbmVyYXRpb247CisKKyAgICBNdXRleCBtUGxheWluZ1RpbWVMb2NrOworICAgIGludDY0X3QgbUxhc3RTdGFydGVkUGxheWluZ1RpbWVOczsKKyAgICB2b2lkIHN0b3BQbGF5YmFja1RpbWVyKGNvbnN0IGNoYXIgKndoZXJlKTsKKyAgICB2b2lkIHN0YXJ0UGxheWJhY2tUaW1lcihjb25zdCBjaGFyICp3aGVyZSk7CisKKyAgICBpbnQ2NF90IG1MYXN0U3RhcnRlZFJlYnVmZmVyaW5nVGltZU5zOworICAgIHZvaWQgc3RhcnRSZWJ1ZmZlcmluZ1RpbWVyKCk7CisgICAgdm9pZCBzdG9wUmVidWZmZXJpbmdUaW1lcihib29sIGV4aXRpbmdQbGF5YmFjayk7CisKKyAgICBpbnQ2NF90IG1QcmV2aW91c1NlZWtUaW1lVXM7CisKKyAgICBMaXN0PHNwPEFjdGlvbj4gPiBtRGVmZXJyZWRBY3Rpb25zOworCisgICAgYm9vbCBtQXVkaW9FT1M7CisgICAgYm9vbCBtVmlkZW9FT1M7CisKKyAgICBib29sIG1TY2FuU291cmNlc1BlbmRpbmc7CisgICAgaW50MzJfdCBtU2NhblNvdXJjZXNHZW5lcmF0aW9uOworCisgICAgaW50MzJfdCBtUG9sbER1cmF0aW9uR2VuZXJhdGlvbjsKKyAgICBpbnQzMl90IG1UaW1lZFRleHRHZW5lcmF0aW9uOworCisgICAgZW51bSBGbHVzaFN0YXR1cyB7CisgICAgICAgIE5PTkUsCisgICAgICAgIEZMVVNISU5HX0RFQ09ERVIsCisgICAgICAgIEZMVVNISU5HX0RFQ09ERVJfU0hVVERPV04sCisgICAgICAgIFNIVVRUSU5HX0RPV05fREVDT0RFUiwKKyAgICAgICAgRkxVU0hFRCwKKyAgICAgICAgU0hVVF9ET1dOLAorICAgIH07CisKKyAgICBlbnVtIEZsdXNoQ29tbWFuZCB7CisgICAgICAgIEZMVVNIX0NNRF9OT05FLAorICAgICAgICBGTFVTSF9DTURfRkxVU0gsCisgICAgICAgIEZMVVNIX0NNRF9TSFVURE9XTiwKKyAgICB9OworCisgICAgLy8gU3RhdHVzIG9mIGZsdXNoIHJlc3BvbnNlcyBmcm9tIHRoZSBkZWNvZGVyIGFuZCByZW5kZXJlci4KKyAgICBib29sIG1GbHVzaENvbXBsZXRlWzJdWzJdOworCisgICAgRmx1c2hTdGF0dXMgbUZsdXNoaW5nQXVkaW87CisgICAgRmx1c2hTdGF0dXMgbUZsdXNoaW5nVmlkZW87CisKKyAgICAvLyBTdGF0dXMgb2YgZmx1c2ggcmVzcG9uc2VzIGZyb20gdGhlIGRlY29kZXIgYW5kIHJlbmRlcmVyLgorICAgIGJvb2wgbVJlc3VtZVBlbmRpbmc7CisKKyAgICBpbnQzMl90IG1WaWRlb1NjYWxpbmdNb2RlOworCisgICAgQXVkaW9QbGF5YmFja1JhdGUgbVBsYXliYWNrU2V0dGluZ3M7CisgICAgQVZTeW5jU2V0dGluZ3MgbVN5bmNTZXR0aW5nczsKKyAgICBmbG9hdCBtVmlkZW9GcHNIaW50OworICAgIGJvb2wgbVN0YXJ0ZWQ7CisgICAgYm9vbCBtUHJlcGFyZWQ7CisgICAgYm9vbCBtUmVzZXR0aW5nOworICAgIGJvb2wgbVNvdXJjZVN0YXJ0ZWQ7CisgICAgYm9vbCBtQXVkaW9EZWNvZGVyRXJyb3I7CisgICAgYm9vbCBtVmlkZW9EZWNvZGVyRXJyb3I7CisKKyAgICAvLyBBY3R1YWwgcGF1c2Ugc3RhdGUsIGVpdGhlciBhcyByZXF1ZXN0ZWQgYnkgY2xpZW50IG9yIGR1ZSB0byBidWZmZXJpbmcuCisgICAgYm9vbCBtUGF1c2VkOworCisgICAgLy8gUGF1c2Ugc3RhdGUgYXMgcmVxdWVzdGVkIGJ5IGNsaWVudC4gTm90ZSB0aGF0IGlmIG1QYXVzZWRCeUNsaWVudCBpcworICAgIC8vIHRydWUsIG1QYXVzZWQgaXMgYWx3YXlzIHRydWU7IGlmIG1QYXVzZWRCeUNsaWVudCBpcyBmYWxzZSwgbVBhdXNlZCBjb3VsZAorICAgIC8vIHN0aWxsIGJlY29tZSB0cnVlLCB3aGVuIHdlIHBhdXNlIGludGVybmFsbHkgZHVlIHRvIGJ1ZmZlcmluZy4KKyAgICBib29sIG1QYXVzZWRCeUNsaWVudDsKKworICAgIC8vIFBhdXNlIHN0YXRlIGFzIHJlcXVlc3RlZCBieSBzb3VyY2UgKGludGVybmFsbHkpIGR1ZSB0byBidWZmZXJpbmcKKyAgICBib29sIG1QYXVzZWRGb3JCdWZmZXJpbmc7CisKKyAgICAvLyBNb2R1bGFyIERSTQorICAgIHNwPEFNZWRpYUNyeXB0b1dyYXBwZXI+IG1DcnlwdG87CisgICAgYm9vbCBtSXNEcm1Qcm90ZWN0ZWQ7CisKKyAgICB0eXBlZGVmIGVudW0geworICAgICAgICBEQVRBX1NPVVJDRV9UWVBFX05PTkUsCisgICAgICAgIERBVEFfU09VUkNFX1RZUEVfSFRUUF9MSVZFLAorICAgICAgICBEQVRBX1NPVVJDRV9UWVBFX1JUU1AsCisgICAgICAgIERBVEFfU09VUkNFX1RZUEVfR0VORVJJQ19VUkwsCisgICAgICAgIERBVEFfU09VUkNFX1RZUEVfR0VORVJJQ19GRCwKKyAgICAgICAgREFUQV9TT1VSQ0VfVFlQRV9NRURJQSwKKyAgICAgICAgREFUQV9TT1VSQ0VfVFlQRV9TVFJFQU0sCisgICAgfSBEQVRBX1NPVVJDRV9UWVBFOworCisgICAgc3RkOjphdG9taWM8REFUQV9TT1VSQ0VfVFlQRT4gbURhdGFTb3VyY2VUeXBlOworCisgICAgaW5saW5lIGNvbnN0IHNwPERlY29kZXJCYXNlPiAmZ2V0RGVjb2Rlcihib29sIGF1ZGlvKSB7CisgICAgICAgIHJldHVybiBhdWRpbyA/IG1BdWRpb0RlY29kZXIgOiBtVmlkZW9EZWNvZGVyOworICAgIH0KKworICAgIGlubGluZSB2b2lkIGNsZWFyRmx1c2hDb21wbGV0ZSgpIHsKKyAgICAgICAgbUZsdXNoQ29tcGxldGVbMF1bMF0gPSBmYWxzZTsKKyAgICAgICAgbUZsdXNoQ29tcGxldGVbMF1bMV0gPSBmYWxzZTsKKyAgICAgICAgbUZsdXNoQ29tcGxldGVbMV1bMF0gPSBmYWxzZTsKKyAgICAgICAgbUZsdXNoQ29tcGxldGVbMV1bMV0gPSBmYWxzZTsKKyAgICB9CisKKyAgICB2b2lkIHRyeU9wZW5BdWRpb1NpbmtGb3JPZmZsb2FkKAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsIGNvbnN0IHNwPE1ldGFEYXRhPiAmYXVkaW9NZXRhLCBib29sIGhhc1ZpZGVvKTsKKyAgICB2b2lkIGNsb3NlQXVkaW9TaW5rKCk7CisgICAgdm9pZCByZXN0YXJ0QXVkaW8oCisgICAgICAgICAgICBpbnQ2NF90IGN1cnJlbnRQb3NpdGlvblVzLCBib29sIGZvcmNlTm9uT2ZmbG9hZCwgYm9vbCBuZWVkc1RvQ3JlYXRlQXVkaW9EZWNvZGVyKTsKKyAgICB2b2lkIGRldGVybWluZUF1ZGlvTW9kZUNoYW5nZShjb25zdCBzcDxBTWVzc2FnZT4gJmF1ZGlvRm9ybWF0KTsKKworICAgIHN0YXR1c190IGluc3RhbnRpYXRlRGVjb2RlcigKKyAgICAgICAgICAgIGJvb2wgYXVkaW8sIHNwPERlY29kZXJCYXNlPiAqZGVjb2RlciwgYm9vbCBjaGVja0F1ZGlvTW9kZUNoYW5nZSA9IHRydWUpOworCisgICAgc3RhdHVzX3Qgb25JbnN0YW50aWF0ZVNlY3VyZURlY29kZXJzKCk7CisKKyAgICB2b2lkIHVwZGF0ZVZpZGVvU2l6ZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmaW5wdXRGb3JtYXQsCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm91dHB1dEZvcm1hdCA9IE5VTEwpOworCisgICAgdm9pZCBub3RpZnlMaXN0ZW5lcihpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqaW4gPSBOVUxMKTsKKworICAgIHZvaWQgaGFuZGxlRmx1c2hDb21wbGV0ZShib29sIGF1ZGlvLCBib29sIGlzRGVjb2Rlcik7CisgICAgdm9pZCBmaW5pc2hGbHVzaElmUG9zc2libGUoKTsKKworICAgIHZvaWQgb25TdGFydCgKKyAgICAgICAgICAgIGludDY0X3Qgc3RhcnRQb3NpdGlvblVzID0gLTEsCisgICAgICAgICAgICBNZWRpYVBsYXllcjJTZWVrTW9kZSBtb2RlID0gTWVkaWFQbGF5ZXIyU2Vla01vZGU6OlNFRUtfUFJFVklPVVNfU1lOQyk7CisgICAgdm9pZCBvblJlc3VtZSgpOworICAgIHZvaWQgb25QYXVzZSgpOworCisgICAgYm9vbCBhdWRpb0RlY29kZXJTdGlsbE5lZWRlZCgpOworCisgICAgdm9pZCBmbHVzaERlY29kZXIoYm9vbCBhdWRpbywgYm9vbCBuZWVkU2h1dGRvd24pOworCisgICAgdm9pZCBmaW5pc2hSZXN1bWUoKTsKKyAgICB2b2lkIG5vdGlmeURyaXZlclNlZWtDb21wbGV0ZSgpOworCisgICAgdm9pZCBwb3N0U2NhblNvdXJjZXMoKTsKKworICAgIHZvaWQgc2NoZWR1bGVQb2xsRHVyYXRpb24oKTsKKyAgICB2b2lkIGNhbmNlbFBvbGxEdXJhdGlvbigpOworCisgICAgdm9pZCBwcm9jZXNzRGVmZXJyZWRBY3Rpb25zKCk7CisKKyAgICB2b2lkIHBlcmZvcm1TZWVrKGludDY0X3Qgc2Vla1RpbWVVcywgTWVkaWFQbGF5ZXIyU2Vla01vZGUgbW9kZSk7CisgICAgdm9pZCBwZXJmb3JtRGVjb2RlckZsdXNoKEZsdXNoQ29tbWFuZCBhdWRpbywgRmx1c2hDb21tYW5kIHZpZGVvKTsKKyAgICB2b2lkIHBlcmZvcm1SZXNldCgpOworICAgIHZvaWQgcGVyZm9ybVNjYW5Tb3VyY2VzKCk7CisgICAgdm9pZCBwZXJmb3JtU2V0U3VyZmFjZShjb25zdCBzcDxBTmF0aXZlV2luZG93V3JhcHBlcj4gJm53KTsKKyAgICB2b2lkIHBlcmZvcm1SZXN1bWVEZWNvZGVycyhib29sIG5lZWROb3RpZnkpOworCisgICAgdm9pZCBvblNvdXJjZU5vdGlmeShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdm9pZCBvbkNsb3NlZENhcHRpb25Ob3RpZnkoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworCisgICAgdm9pZCBxdWV1ZURlY29kZXJTaHV0ZG93bigKKyAgICAgICAgICAgIGJvb2wgYXVkaW8sIGJvb2wgdmlkZW8sIGNvbnN0IHNwPEFNZXNzYWdlPiAmcmVwbHkpOworCisgICAgdm9pZCBzZW5kU3VidGl0bGVEYXRhKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIsIGludDMyX3QgYmFzZUluZGV4KTsKKyAgICB2b2lkIHNlbmRUaW1lZE1ldGFEYXRhKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOworICAgIHZvaWQgc2VuZFRpbWVkVGV4dERhdGEoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CisKKyAgICB2b2lkIHdyaXRlVHJhY2tJbmZvKFBhcmNlbCogcmVwbHksIGNvbnN0IHNwPEFNZXNzYWdlPiYgZm9ybWF0KSBjb25zdDsKKworICAgIHN0YXR1c190IG9uUHJlcGFyZURybShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgc3RhdHVzX3Qgb25SZWxlYXNlRHJtKCk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhOdVBsYXllcjIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBOVV9QTEFZRVIyX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9udXBsYXllcjIvTnVQbGF5ZXIyQ0NEZWNvZGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL251cGxheWVyMi9OdVBsYXllcjJDQ0RlY29kZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0YWZkNWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9udXBsYXllcjIvTnVQbGF5ZXIyQ0NEZWNvZGVyLmNwcApAQCAtMCwwICsxLDU3OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJOdVBsYXllcjJDQ0RlY29kZXIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgIk51UGxheWVyMkNDRGVjb2Rlci5oIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9hdmNfdXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBJbiBDRUEtNzA4QiwgdGhlIG1heGltdW0gYmFuZHdpZHRoIG9mIENDIGlzIHNldCB0byA5NjAwYnBzLgorc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4QmFuZHdpdGhTaXplQnl0ZXMgPSA5NjAwIC8gODsKKworc3RydWN0IENDRGF0YSB7CisgICAgQ0NEYXRhKHVpbnQ4X3QgdHlwZSwgdWludDhfdCBkYXRhMSwgdWludDhfdCBkYXRhMikKKyAgICAgICAgOiBtVHlwZSh0eXBlKSwgbURhdGExKGRhdGExKSwgbURhdGEyKGRhdGEyKSB7CisgICAgfQorICAgIGJvb2wgZ2V0Q2hhbm5lbChzaXplX3QgKmNoYW5uZWwpIGNvbnN0IHsKKyAgICAgICAgaWYgKG1EYXRhMSA+PSAweDEwICYmIG1EYXRhMSA8PSAweDFmKSB7CisgICAgICAgICAgICAqY2hhbm5lbCA9IChtRGF0YTEgPj0gMHgxOCA/IDEgOiAwKSArIChtVHlwZSA/IDIgOiAwKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB1aW50OF90IG1UeXBlOworICAgIHVpbnQ4X3QgbURhdGExOworICAgIHVpbnQ4X3QgbURhdGEyOworfTsKKworc3RhdGljIGJvb2wgaXNOdWxsUGFkKENDRGF0YSAqY2MpIHsKKyAgICByZXR1cm4gY2MtPm1EYXRhMSA8IDB4MTAgJiYgY2MtPm1EYXRhMiA8IDB4MTA7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBCeXRlUGFpcihjb25zdCBzcDxBQnVmZmVyPiAmY2NCdWYpIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKTsKK3N0YXRpYyB2b2lkIGR1bXBCeXRlUGFpcihjb25zdCBzcDxBQnVmZmVyPiAmY2NCdWYpIHsKKyAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKKyAgICBBU3RyaW5nIG91dDsKKworICAgIHdoaWxlIChvZmZzZXQgPCBjY0J1Zi0+c2l6ZSgpKSB7CisgICAgICAgIGNoYXIgdG1wWzEyOF07CisKKyAgICAgICAgQ0NEYXRhICpjYyA9IChDQ0RhdGEgKikgKGNjQnVmLT5kYXRhKCkgKyBvZmZzZXQpOworCisgICAgICAgIGlmIChpc051bGxQYWQoY2MpKSB7CisgICAgICAgICAgICAvLyAxIG51bGwgcGFkIG9yIFhEUyBtZXRhZGF0YSwgaWdub3JlCisgICAgICAgICAgICBvZmZzZXQgKz0gc2l6ZW9mKENDRGF0YSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjYy0+bURhdGExID49IDB4MjAgJiYgY2MtPm1EYXRhMSA8PSAweDdmKSB7CisgICAgICAgICAgICAvLyAyIGJhc2ljIGNoYXJzCisgICAgICAgICAgICBzbnByaW50Zih0bXAsIHNpemVvZih0bXApLCAiWyVkXUJhc2ljOiAlYyAlYyIsIGNjLT5tVHlwZSwgY2MtPm1EYXRhMSwgY2MtPm1EYXRhMik7CisgICAgICAgIH0gZWxzZSBpZiAoKGNjLT5tRGF0YTEgPT0gMHgxMSB8fCBjYy0+bURhdGExID09IDB4MTkpCisgICAgICAgICAgICAgICAgICYmIGNjLT5tRGF0YTIgPj0gMHgzMCAmJiBjYy0+bURhdGEyIDw9IDB4M2YpIHsKKyAgICAgICAgICAgIC8vIDEgc3BlY2lhbCBjaGFyCisgICAgICAgICAgICBzbnByaW50Zih0bXAsIHNpemVvZih0bXApLCAiWyVkXVNwZWNpYWw6ICUwMnggJTAyeCIsIGNjLT5tVHlwZSwgY2MtPm1EYXRhMSwgY2MtPm1EYXRhMik7CisgICAgICAgIH0gZWxzZSBpZiAoKGNjLT5tRGF0YTEgPT0gMHgxMiB8fCBjYy0+bURhdGExID09IDB4MUEpCisgICAgICAgICAgICAgICAgICYmIGNjLT5tRGF0YTIgPj0gMHgyMCAmJiBjYy0+bURhdGEyIDw9IDB4M2YpeworICAgICAgICAgICAgLy8gMSBTcGFuaXNoL0ZyZW5jaCBjaGFyCisgICAgICAgICAgICBzbnByaW50Zih0bXAsIHNpemVvZih0bXApLCAiWyVkXVNwYW5pc2g6ICUwMnggJTAyeCIsIGNjLT5tVHlwZSwgY2MtPm1EYXRhMSwgY2MtPm1EYXRhMik7CisgICAgICAgIH0gZWxzZSBpZiAoKGNjLT5tRGF0YTEgPT0gMHgxMyB8fCBjYy0+bURhdGExID09IDB4MUIpCisgICAgICAgICAgICAgICAgICYmIGNjLT5tRGF0YTIgPj0gMHgyMCAmJiBjYy0+bURhdGEyIDw9IDB4M2YpeworICAgICAgICAgICAgLy8gMSBQb3J0dWd1ZXNlL0dlcm1hbi9EYW5pc2ggY2hhcgorICAgICAgICAgICAgc25wcmludGYodG1wLCBzaXplb2YodG1wKSwgIlslZF1HZXJtYW46ICUwMnggJTAyeCIsIGNjLT5tVHlwZSwgY2MtPm1EYXRhMSwgY2MtPm1EYXRhMik7CisgICAgICAgIH0gZWxzZSBpZiAoKGNjLT5tRGF0YTEgPT0gMHgxMSB8fCBjYy0+bURhdGExID09IDB4MTkpCisgICAgICAgICAgICAgICAgICYmIGNjLT5tRGF0YTIgPj0gMHgyMCAmJiBjYy0+bURhdGEyIDw9IDB4MmYpeworICAgICAgICAgICAgLy8gTWlkLVJvdyBDb2RlcyAoVGFibGUgNjkpCisgICAgICAgICAgICBzbnByaW50Zih0bXAsIHNpemVvZih0bXApLCAiWyVkXU1pZC1yb3c6ICUwMnggJTAyeCIsIGNjLT5tVHlwZSwgY2MtPm1EYXRhMSwgY2MtPm1EYXRhMik7CisgICAgICAgIH0gZWxzZSBpZiAoKChjYy0+bURhdGExID09IDB4MTQgfHwgY2MtPm1EYXRhMSA9PSAweDFjKQorICAgICAgICAgICAgICAgICAgJiYgY2MtPm1EYXRhMiA+PSAweDIwICYmIGNjLT5tRGF0YTIgPD0gMHgyZikKKyAgICAgICAgICAgICAgICAgIHx8CisgICAgICAgICAgICAgICAgICAgKChjYy0+bURhdGExID09IDB4MTcgfHwgY2MtPm1EYXRhMSA9PSAweDFmKQorICAgICAgICAgICAgICAgICAgJiYgY2MtPm1EYXRhMiA+PSAweDIxICYmIGNjLT5tRGF0YTIgPD0gMHgyMykpeworICAgICAgICAgICAgLy8gTWlzYyBDb250cm9sIENvZGVzIChUYWJsZSA3MCkKKyAgICAgICAgICAgIHNucHJpbnRmKHRtcCwgc2l6ZW9mKHRtcCksICJbJWRdQ3RybDogJTAyeCAlMDJ4IiwgY2MtPm1UeXBlLCBjYy0+bURhdGExLCBjYy0+bURhdGEyKTsKKyAgICAgICAgfSBlbHNlIGlmICgoY2MtPm1EYXRhMSAmIDB4NzApID09IDB4MTAKKyAgICAgICAgICAgICAgICAmJiAoY2MtPm1EYXRhMiAmIDB4NDApID09IDB4NDAKKyAgICAgICAgICAgICAgICAmJiAoKGNjLT5tRGF0YTEgJiAweDA3KSB8fCAhKGNjLT5tRGF0YTIgJiAweDIwKSkgKSB7CisgICAgICAgICAgICAvLyBQcmVhbWJsZSBBZGRyZXNzIENvZGVzIChUYWJsZSA3MSkKKyAgICAgICAgICAgIHNucHJpbnRmKHRtcCwgc2l6ZW9mKHRtcCksICJbJWRdUEFDOiAlMDJ4ICUwMngiLCBjYy0+bVR5cGUsIGNjLT5tRGF0YTEsIGNjLT5tRGF0YTIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc25wcmludGYodG1wLCBzaXplb2YodG1wKSwgIlslZF1JbnZhbGlkOiAlMDJ4ICUwMngiLCBjYy0+bVR5cGUsIGNjLT5tRGF0YTEsIGNjLT5tRGF0YTIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG91dC5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBvdXQuYXBwZW5kKCIsICIpOworICAgICAgICB9CisKKyAgICAgICAgb3V0LmFwcGVuZCh0bXApOworCisgICAgICAgIG9mZnNldCArPSBzaXplb2YoQ0NEYXRhKTsKKyAgICB9CisKKyAgICBBTE9HSSgiJXMiLCBvdXQuY19zdHIoKSk7Cit9CisKK051UGxheWVyMjo6Q0NEZWNvZGVyOjpDQ0RlY29kZXIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpCisgICAgOiBtTm90aWZ5KG5vdGlmeSksCisgICAgICBtU2VsZWN0ZWRUcmFjaygtMSksCisgICAgICBtRFRWQ0NQYWNrZXQobmV3IEFCdWZmZXIoa01heEJhbmR3aXRoU2l6ZUJ5dGVzKSkgeworICAgIG1EVFZDQ1BhY2tldC0+c2V0UmFuZ2UoMCwgMCk7CisKKyAgICAvLyBJbiBDRUEtNjA4LCBzdHJlYW1zIGZyb20gcGFja2V0cyB3aGljaCBoYXZlIHRoZSB2YWx1ZSAwIG9mIGNjX3R5cGUgY29udGFpbiBDQzEgYW5kIENDMiwgYW5kCisgICAgLy8gc3RyZWFtcyBmcm9tIHBhY2tldHMgd2hpY2ggaGF2ZSB0aGUgdmFsdWUgMSBvZiBjY190eXBlIGNvbnRhaW4gQ0MzIGFuZCBDQzQuCisgICAgLy8gVGhlIGZvbGxvd2luZyBhcnJheSBpbmRpY2F0ZXMgdGhlIGN1cnJlbnQgdHJhbnNtaXR0aW5nIGNoYW5uZWxzIGZvciBlYWNoIHZhbHVlIG9mIGNjX3R5cGUuCisgICAgbUxpbmUyMUNoYW5uZWxzWzBdID0gMDsgLy8gQ0MxCisgICAgbUxpbmUyMUNoYW5uZWxzWzFdID0gMjsgLy8gQ0MzCit9CisKK3NpemVfdCBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6Z2V0VHJhY2tDb3VudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVRyYWNrcy5zaXplKCk7Cit9CisKK3NwPEFNZXNzYWdlPiBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6Z2V0VHJhY2tJbmZvKHNpemVfdCBpbmRleCkgY29uc3QgeworICAgIGlmICghaXNUcmFja1ZhbGlkKGluZGV4KSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gZm9ybWF0ID0gbmV3IEFNZXNzYWdlKCk7CisKKyAgICBDQ1RyYWNrIHRyYWNrID0gbVRyYWNrc1tpbmRleF07CisKKyAgICBmb3JtYXQtPnNldEludDMyKCJ0eXBlIiwgTUVESUFfVFJBQ0tfVFlQRV9TVUJUSVRMRSk7CisgICAgZm9ybWF0LT5zZXRTdHJpbmcoImxhbmd1YWdlIiwgInVuZCIpOworCisgICAgc3dpdGNoICh0cmFjay5tVHJhY2tUeXBlKSB7CisgICAgICAgIGNhc2Uga1RyYWNrVHlwZUNFQTYwODoKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfVEVYVF9DRUFfNjA4KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGtUcmFja1R5cGVDRUE3MDg6CisgICAgICAgICAgICBmb3JtYXQtPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX1RFWFRfQ0VBXzcwOCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCJVbmtub3duIHRyYWNrIHR5cGU6ICVkIiwgdHJhY2subVRyYWNrVHlwZSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvLyBGb3IgQ0VBLTYwOCBDQzEsIGZpZWxkIDAgY2hhbm5lbCAwCisgICAgYm9vbCBpc0RlZmF1bHRBdXRvID0gdHJhY2subVRyYWNrVHlwZSA9PSBrVHJhY2tUeXBlQ0VBNjA4CisgICAgICAgICAgICAmJiB0cmFjay5tVHJhY2tDaGFubmVsID09IDA7CisgICAgLy8gRm9yIENFQS03MDgsIFByaW1hcnkgQ2FwdGlvbiBTZXJ2aWNlLgorICAgIGJvb2wgaXNEZWZhdWx0T25seSA9IHRyYWNrLm1UcmFja1R5cGUgPT0ga1RyYWNrVHlwZUNFQTcwOAorICAgICAgICAgICAgJiYgdHJhY2subVRyYWNrQ2hhbm5lbCA9PSAxOworICAgIGZvcm1hdC0+c2V0SW50MzIoImF1dG8iLCBpc0RlZmF1bHRBdXRvKTsKKyAgICBmb3JtYXQtPnNldEludDMyKCJkZWZhdWx0IiwgaXNEZWZhdWx0QXV0byB8fCBpc0RlZmF1bHRPbmx5KTsKKyAgICBmb3JtYXQtPnNldEludDMyKCJmb3JjZWQiLCAwKTsKKworICAgIHJldHVybiBmb3JtYXQ7Cit9CisKK3N0YXR1c190IE51UGxheWVyMjo6Q0NEZWNvZGVyOjpzZWxlY3RUcmFjayhzaXplX3QgaW5kZXgsIGJvb2wgc2VsZWN0KSB7CisgICAgaWYgKCFpc1RyYWNrVmFsaWQoaW5kZXgpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYgKHNlbGVjdCkgeworICAgICAgICBpZiAobVNlbGVjdGVkVHJhY2sgPT0gKHNzaXplX3QpaW5kZXgpIHsKKyAgICAgICAgICAgIEFMT0dFKCJ0cmFjayAlenUgYWxyZWFkeSBzZWxlY3RlZCIsIGluZGV4KTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoInNlbGVjdGVkIHRyYWNrICV6dSIsIGluZGV4KTsKKyAgICAgICAgbVNlbGVjdGVkVHJhY2sgPSBpbmRleDsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAobVNlbGVjdGVkVHJhY2sgIT0gKHNzaXplX3QpaW5kZXgpIHsKKyAgICAgICAgICAgIEFMT0dFKCJ0cmFjayAlenUgaXMgbm90IHNlbGVjdGVkIiwgaW5kZXgpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigidW5zZWxlY3RlZCB0cmFjayAlenUiLCBpbmRleCk7CisgICAgICAgIG1TZWxlY3RlZFRyYWNrID0gLTE7CisgICAgfQorCisgICAgLy8gQ2xlYXIgdGhlIHByZXZpb3VzIHRyYWNrIHBheWxvYWRzCisgICAgbUNDTWFwLmNsZWFyKCk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK2Jvb2wgTnVQbGF5ZXIyOjpDQ0RlY29kZXI6OmlzU2VsZWN0ZWQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1TZWxlY3RlZFRyYWNrID49IDAgJiYgbVNlbGVjdGVkVHJhY2sgPCAoaW50MzJfdClnZXRUcmFja0NvdW50KCk7Cit9CisKK2Jvb2wgTnVQbGF5ZXIyOjpDQ0RlY29kZXI6OmlzVHJhY2tWYWxpZChzaXplX3QgaW5kZXgpIGNvbnN0IHsKKyAgICByZXR1cm4gaW5kZXggPCBnZXRUcmFja0NvdW50KCk7Cit9CisKKy8vIHJldHVybnMgdHJ1ZSBpZiBhIG5ldyBDQyB0cmFjayBpcyBmb3VuZAorYm9vbCBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6ZXh0cmFjdEZyb21TRUkoY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQpIHsKKyAgICBzcDxBQnVmZmVyPiBzZWk7CisgICAgaWYgKCFhY2Nlc3NVbml0LT5tZXRhKCktPmZpbmRCdWZmZXIoInNlaSIsICZzZWkpIHx8IHNlaSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbnQ2NF90IHRpbWVVczsKKyAgICBDSEVDSyhhY2Nlc3NVbml0LT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOworCisgICAgYm9vbCB0cmFja0FkZGVkID0gZmFsc2U7CisKKyAgICBjb25zdCBOQUxQb3NpdGlvbiAqbmFsID0gKE5BTFBvc2l0aW9uICopc2VpLT5kYXRhKCk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNlaS0+c2l6ZSgpIC8gc2l6ZW9mKE5BTFBvc2l0aW9uKTsgKytpLCArK25hbCkgeworICAgICAgICB0cmFja0FkZGVkIHw9IHBhcnNlU0VJTmFsVW5pdCgKKyAgICAgICAgICAgICAgICB0aW1lVXMsIGFjY2Vzc1VuaXQtPmRhdGEoKSArIG5hbC0+bmFsT2Zmc2V0LCBuYWwtPm5hbFNpemUpOworICAgIH0KKworICAgIHJldHVybiB0cmFja0FkZGVkOworfQorCisvLyByZXR1cm5zIHRydWUgaWYgYSBuZXcgQ0MgdHJhY2sgaXMgZm91bmQKK2Jvb2wgTnVQbGF5ZXIyOjpDQ0RlY29kZXI6OnBhcnNlU0VJTmFsVW5pdChpbnQ2NF90IHRpbWVVcywgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICB1bnNpZ25lZCBuYWxUeXBlID0gZGF0YVswXSAmIDB4MWY7CisKKyAgICAvLyB0aGUgYnVmZmVyIHNob3VsZCBvbmx5IGhhdmUgU0VJIGluIGl0CisgICAgaWYgKG5hbFR5cGUgIT0gNikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbCB0cmFja0FkZGVkID0gZmFsc2U7CisgICAgTkFMQml0UmVhZGVyIGJyKGRhdGEgKyAxLCBzaXplIC0gMSk7CisKKyAgICAvLyBzZWlfbWVzc2FnZSgpCisgICAgd2hpbGUgKGJyLmF0TGVhc3ROdW1CaXRzTGVmdCgxNikpIHsgLy8gYXQgbGVhc3QgMTYtYml0IGZvciBzZWlfbWVzc2FnZSgpCisgICAgICAgIHVpbnQzMl90IHBheWxvYWRfdHlwZSA9IDA7CisgICAgICAgIHNpemVfdCBwYXlsb2FkX3NpemUgPSAwOworICAgICAgICB1aW50OF90IGxhc3RfYnl0ZTsKKworICAgICAgICBkbyB7CisgICAgICAgICAgICBsYXN0X2J5dGUgPSBici5nZXRCaXRzKDgpOworICAgICAgICAgICAgcGF5bG9hZF90eXBlICs9IGxhc3RfYnl0ZTsKKyAgICAgICAgfSB3aGlsZSAobGFzdF9ieXRlID09IDB4RkYpOworCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGxhc3RfYnl0ZSA9IGJyLmdldEJpdHMoOCk7CisgICAgICAgICAgICBwYXlsb2FkX3NpemUgKz0gbGFzdF9ieXRlOworICAgICAgICB9IHdoaWxlIChsYXN0X2J5dGUgPT0gMHhGRik7CisKKyAgICAgICAgaWYgKHBheWxvYWRfc2l6ZSA+IFNJWkVfTUFYIC8gOAorICAgICAgICAgICAgICAgIHx8ICFici5hdExlYXN0TnVtQml0c0xlZnQocGF5bG9hZF9zaXplICogOCkpIHsKKyAgICAgICAgICAgIEFMT0dWKCJNYWxmb3JtZWQgU0VJIHBheWxvYWQiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8gc2VpX3BheWxvYWQoKQorICAgICAgICBpZiAocGF5bG9hZF90eXBlID09IDQpIHsKKyAgICAgICAgICAgIGJvb2wgaXNDQyA9IGZhbHNlOworICAgICAgICAgICAgaWYgKHBheWxvYWRfc2l6ZSA+IDEgKyAyICsgNCArIDEpIHsKKyAgICAgICAgICAgICAgICAvLyB1c2VyX2RhdGFfcmVnaXN0ZXJlZF9pdHVfdF90MzUoKQorCisgICAgICAgICAgICAgICAgLy8gQVRTQyBBLzcyOiA2LjQuMgorICAgICAgICAgICAgICAgIHVpbnQ4X3QgaXR1X3RfdDM1X2NvdW50cnlfY29kZSA9IGJyLmdldEJpdHMoOCk7CisgICAgICAgICAgICAgICAgdWludDE2X3QgaXR1X3RfdDM1X3Byb3ZpZGVyX2NvZGUgPSBici5nZXRCaXRzKDE2KTsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB1c2VyX2lkZW50aWZpZXIgPSBici5nZXRCaXRzKDMyKTsKKyAgICAgICAgICAgICAgICB1aW50OF90IHVzZXJfZGF0YV90eXBlX2NvZGUgPSBici5nZXRCaXRzKDgpOworCisgICAgICAgICAgICAgICAgcGF5bG9hZF9zaXplIC09IDEgKyAyICsgNCArIDE7CisKKyAgICAgICAgICAgICAgICBpc0NDID0gaXR1X3RfdDM1X2NvdW50cnlfY29kZSA9PSAweEI1CisgICAgICAgICAgICAgICAgICAgICAgICAmJiBpdHVfdF90MzVfcHJvdmlkZXJfY29kZSA9PSAweDAwMzEKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHVzZXJfaWRlbnRpZmllciA9PSAnR0E5NCcKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHVzZXJfZGF0YV90eXBlX2NvZGUgPT0gMHgzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaXNDQyAmJiBwYXlsb2FkX3NpemUgPiAyKSB7CisgICAgICAgICAgICAgICAgdHJhY2tBZGRlZCB8PSBwYXJzZU1QRUdDQ0RhdGEodGltZVVzLCBici5kYXRhKCksIGJyLm51bUJpdHNMZWZ0KCkgLyA4KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIk1hbGZvcm1lZCBTRUkgcGF5bG9hZCB0eXBlIDQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dWKCJVbnN1cHBvcnRlZCBTRUkgcGF5bG9hZCB0eXBlICVkIiwgcGF5bG9hZF90eXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHNraXBwaW5nIHJlbWFpbmluZyBiaXRzIG9mIHRoaXMgcGF5bG9hZAorICAgICAgICBici5za2lwQml0cyhwYXlsb2FkX3NpemUgKiA4KTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJhY2tBZGRlZDsKK30KKworLy8gcmV0dXJucyB0cnVlIGlmIGEgbmV3IENDIHRyYWNrIGlzIGZvdW5kCitib29sIE51UGxheWVyMjo6Q0NEZWNvZGVyOjpleHRyYWN0RnJvbU1QRUdVc2VyRGF0YShjb25zdCBzcDxBQnVmZmVyPiAmYWNjZXNzVW5pdCkgeworICAgIHNwPEFCdWZmZXI+IG1wZWdVc2VyRGF0YTsKKyAgICBpZiAoIWFjY2Vzc1VuaXQtPm1ldGEoKS0+ZmluZEJ1ZmZlcigibXBlZ1VzZXJEYXRhIiwgJm1wZWdVc2VyRGF0YSkKKyAgICAgICAgICAgIHx8IG1wZWdVc2VyRGF0YSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbnQ2NF90IHRpbWVVczsKKyAgICBDSEVDSyhhY2Nlc3NVbml0LT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOworCisgICAgYm9vbCB0cmFja0FkZGVkID0gZmFsc2U7CisKKyAgICBjb25zdCBzaXplX3QgKnVzZXJEYXRhID0gKHNpemVfdCAqKW1wZWdVc2VyRGF0YS0+ZGF0YSgpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtcGVnVXNlckRhdGEtPnNpemUoKSAvIHNpemVvZihzaXplX3QpOyArK2kpIHsKKyAgICAgICAgdHJhY2tBZGRlZCB8PSBwYXJzZU1QRUdVc2VyRGF0YVVuaXQoCisgICAgICAgICAgICAgICAgdGltZVVzLCBhY2Nlc3NVbml0LT5kYXRhKCkgKyB1c2VyRGF0YVtpXSwgYWNjZXNzVW5pdC0+c2l6ZSgpIC0gdXNlckRhdGFbaV0pOworICAgIH0KKworICAgIHJldHVybiB0cmFja0FkZGVkOworfQorCisvLyByZXR1cm5zIHRydWUgaWYgYSBuZXcgQ0MgdHJhY2sgaXMgZm91bmQKK2Jvb2wgTnVQbGF5ZXIyOjpDQ0RlY29kZXI6OnBhcnNlTVBFR1VzZXJEYXRhVW5pdChpbnQ2NF90IHRpbWVVcywgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBQml0UmVhZGVyIGJyKGRhdGEgKyA0LCA1KTsKKworICAgIHVpbnQzMl90IHVzZXJfaWRlbnRpZmllciA9IGJyLmdldEJpdHMoMzIpOworICAgIHVpbnQ4X3QgdXNlcl9kYXRhX3R5cGUgPSBici5nZXRCaXRzKDgpOworCisgICAgaWYgKHVzZXJfaWRlbnRpZmllciA9PSAnR0E5NCcgJiYgdXNlcl9kYXRhX3R5cGUgPT0gMHgzKSB7CisgICAgICAgIHJldHVybiBwYXJzZU1QRUdDQ0RhdGEodGltZVVzLCBkYXRhICsgOSwgc2l6ZSAtIDkpOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworLy8gcmV0dXJucyB0cnVlIGlmIGEgbmV3IENDIHRyYWNrIGlzIGZvdW5kCitib29sIE51UGxheWVyMjo6Q0NEZWNvZGVyOjpwYXJzZU1QRUdDQ0RhdGEoaW50NjRfdCB0aW1lVXMsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgYm9vbCB0cmFja0FkZGVkID0gZmFsc2U7CisKKyAgICAvLyBNUEVHX2NjX2RhdGEoKQorICAgIC8vIEFUU0MgQS81MyBQYXJ0IDQ6IDYuMi4zLjEKKyAgICBBQml0UmVhZGVyIGJyKGRhdGEsIHNpemUpOworCisgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPD0gMTYpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJyLnNraXBCaXRzKDEpOworICAgIGJvb2wgcHJvY2Vzc19jY19kYXRhX2ZsYWcgPSBici5nZXRCaXRzKDEpOworICAgIGJyLnNraXBCaXRzKDEpOworICAgIHNpemVfdCBjY19jb3VudCA9IGJyLmdldEJpdHMoNSk7CisgICAgYnIuc2tpcEJpdHMoOCk7CisKKyAgICBpZiAoIXByb2Nlc3NfY2NfZGF0YV9mbGFnIHx8IDMgKiA4ICogY2NfY291bnQgPj0gYnIubnVtQml0c0xlZnQoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3A8QUJ1ZmZlcj4gbGluZTIxQ0NCdWYgPSBOVUxMOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjY19jb3VudDsgKytpKSB7CisgICAgICAgIGJyLnNraXBCaXRzKDUpOworICAgICAgICBib29sIGNjX3ZhbGlkID0gYnIuZ2V0Qml0cygxKTsKKyAgICAgICAgdWludDhfdCBjY190eXBlID0gYnIuZ2V0Qml0cygyKTsKKworICAgICAgICBpZiAoY2NfdmFsaWQpIHsKKyAgICAgICAgICAgIGlmIChjY190eXBlID09IDMpIHsKKyAgICAgICAgICAgICAgICBpZiAobURUVkNDUGFja2V0LT5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIHRyYWNrQWRkZWQgfD0gcGFyc2VEVFZDQ1BhY2tldCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lVXMsIG1EVFZDQ1BhY2tldC0+ZGF0YSgpLCBtRFRWQ0NQYWNrZXQtPnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgIG1EVFZDQ1BhY2tldC0+c2V0UmFuZ2UoMCwgMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1lbWNweShtRFRWQ0NQYWNrZXQtPmRhdGEoKSArIG1EVFZDQ1BhY2tldC0+c2l6ZSgpLCBici5kYXRhKCksIDIpOworICAgICAgICAgICAgICAgIG1EVFZDQ1BhY2tldC0+c2V0UmFuZ2UoMCwgbURUVkNDUGFja2V0LT5zaXplKCkgKyAyKTsKKyAgICAgICAgICAgICAgICBici5za2lwQml0cygxNik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1EVFZDQ1BhY2tldC0+c2l6ZSgpID4gMCAmJiBjY190eXBlID09IDIpIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkobURUVkNDUGFja2V0LT5kYXRhKCkgKyBtRFRWQ0NQYWNrZXQtPnNpemUoKSwgYnIuZGF0YSgpLCAyKTsKKyAgICAgICAgICAgICAgICBtRFRWQ0NQYWNrZXQtPnNldFJhbmdlKDAsIG1EVFZDQ1BhY2tldC0+c2l6ZSgpICsgMik7CisgICAgICAgICAgICAgICAgYnIuc2tpcEJpdHMoMTYpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjY190eXBlID09IDAgfHwgY2NfdHlwZSA9PSAxKSB7CisgICAgICAgICAgICAgICAgdWludDhfdCBjY19kYXRhXzEgPSBici5nZXRCaXRzKDgpICYgMHg3ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGNjX2RhdGFfMiA9IGJyLmdldEJpdHMoOCkgJiAweDdmOworCisgICAgICAgICAgICAgICAgQ0NEYXRhIGNjKGNjX3R5cGUsIGNjX2RhdGFfMSwgY2NfZGF0YV8yKTsKKworICAgICAgICAgICAgICAgIGlmIChpc051bGxQYWQoJmNjKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzaXplX3QgY2hhbm5lbDsKKyAgICAgICAgICAgICAgICBpZiAoY2MuZ2V0Q2hhbm5lbCgmY2hhbm5lbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbUxpbmUyMUNoYW5uZWxzW2NjX3R5cGVdID0gY2hhbm5lbDsKKworICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgYSBuZXcgdHJhY2sgaWYgaXQgZG9lcyBub3QgZXhpc3QuCisgICAgICAgICAgICAgICAgICAgIGdldFRyYWNrSW5kZXgoa1RyYWNrVHlwZUNFQTYwOCwgY2hhbm5lbCwgJnRyYWNrQWRkZWQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChpc1NlbGVjdGVkKCkgJiYgbVRyYWNrc1ttU2VsZWN0ZWRUcmFja10ubVRyYWNrVHlwZSA9PSBrVHJhY2tUeXBlQ0VBNjA4CisgICAgICAgICAgICAgICAgICAgICAgICAmJiBtVHJhY2tzW21TZWxlY3RlZFRyYWNrXS5tVHJhY2tDaGFubmVsID09IG1MaW5lMjFDaGFubmVsc1tjY190eXBlXSkgeworICAgICAgICAgICAgICAgICAgICBpZiAobGluZTIxQ0NCdWYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGluZTIxQ0NCdWYgPSBuZXcgQUJ1ZmZlcigoY2NfY291bnQgLSBpKSAqIHNpemVvZihDQ0RhdGEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUyMUNDQnVmLT5zZXRSYW5nZSgwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtZW1jcHkobGluZTIxQ0NCdWYtPmRhdGEoKSArIGxpbmUyMUNDQnVmLT5zaXplKCksICZjYywgc2l6ZW9mKGNjKSk7CisgICAgICAgICAgICAgICAgICAgIGxpbmUyMUNDQnVmLT5zZXRSYW5nZSgwLCBsaW5lMjFDQ0J1Zi0+c2l6ZSgpICsgc2l6ZW9mKENDRGF0YSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnIuc2tpcEJpdHMoMTYpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKChjY190eXBlID09IDMgfHwgY2NfdHlwZSA9PSAyKSAmJiBtRFRWQ0NQYWNrZXQtPnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICB0cmFja0FkZGVkIHw9IHBhcnNlRFRWQ0NQYWNrZXQodGltZVVzLCBtRFRWQ0NQYWNrZXQtPmRhdGEoKSwgbURUVkNDUGFja2V0LT5zaXplKCkpOworICAgICAgICAgICAgICAgIG1EVFZDQ1BhY2tldC0+c2V0UmFuZ2UoMCwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBici5za2lwQml0cygxNik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaXNTZWxlY3RlZCgpICYmIG1UcmFja3NbbVNlbGVjdGVkVHJhY2tdLm1UcmFja1R5cGUgPT0ga1RyYWNrVHlwZUNFQTYwOAorICAgICAgICAgICAgJiYgbGluZTIxQ0NCdWYgIT0gTlVMTCAmJiBsaW5lMjFDQ0J1Zi0+c2l6ZSgpID4gMCkgeworICAgICAgICBtQ0NNYXAuYWRkKHRpbWVVcywgbGluZTIxQ0NCdWYpOworICAgIH0KKworICAgIHJldHVybiB0cmFja0FkZGVkOworfQorCisvLyByZXR1cm5zIHRydWUgaWYgYSBuZXcgQ0MgdHJhY2sgaXMgZm91bmQKK2Jvb2wgTnVQbGF5ZXIyOjpDQ0RlY29kZXI6OnBhcnNlRFRWQ0NQYWNrZXQoaW50NjRfdCB0aW1lVXMsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgLy8gQ0VBLTcwOEIgNSBEVFZDQyBQYWNrZXQgTGF5ZXIuCisgICAgQUJpdFJlYWRlciBicihkYXRhLCBzaXplKTsKKyAgICBici5za2lwQml0cygyKTsKKworICAgIHNpemVfdCBwYWNrZXRfc2l6ZSA9IGJyLmdldEJpdHMoNik7CisgICAgaWYgKHBhY2tldF9zaXplID09IDApIHBhY2tldF9zaXplID0gNjQ7CisgICAgcGFja2V0X3NpemUgKj0gMjsKKworICAgIGlmIChzaXplICE9IHBhY2tldF9zaXplKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sIHRyYWNrQWRkZWQgPSBmYWxzZTsKKworICAgIHdoaWxlIChici5udW1CaXRzTGVmdCgpID49IDE2KSB7CisgICAgICAgIC8vIENFQS03MDhCIEZpZ3VyZSA1IGFuZCA2LgorICAgICAgICB1aW50OF90IHNlcnZpY2VfbnVtYmVyID0gYnIuZ2V0Qml0cygzKTsKKyAgICAgICAgc2l6ZV90IGJsb2NrX3NpemUgPSBici5nZXRCaXRzKDUpOworCisgICAgICAgIGlmIChzZXJ2aWNlX251bWJlciA9PSA2NCkgeworICAgICAgICAgICAgYnIuc2tpcEJpdHMoMik7CisgICAgICAgICAgICBzZXJ2aWNlX251bWJlciA9IGJyLmdldEJpdHMoNik7CisKKyAgICAgICAgICAgIGlmIChzZXJ2aWNlX251bWJlciA8IDY0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRyYWNrQWRkZWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IGJsb2NrX3NpemUgKiA4KSB7CisgICAgICAgICAgICByZXR1cm4gdHJhY2tBZGRlZDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChibG9ja19zaXplID4gMCkgeworICAgICAgICAgICAgc2l6ZV90IHRyYWNrSW5kZXggPSBnZXRUcmFja0luZGV4KGtUcmFja1R5cGVDRUE3MDgsIHNlcnZpY2VfbnVtYmVyLCAmdHJhY2tBZGRlZCk7CisgICAgICAgICAgICBpZiAobVNlbGVjdGVkVHJhY2sgPT0gKHNzaXplX3QpdHJhY2tJbmRleCkgeworICAgICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGNjUGFja2V0ID0gbmV3IEFCdWZmZXIoYmxvY2tfc2l6ZSk7CisgICAgICAgICAgICAgICAgbWVtY3B5KGNjUGFja2V0LT5kYXRhKCksIGJyLmRhdGEoKSwgYmxvY2tfc2l6ZSk7CisgICAgICAgICAgICAgICAgbUNDTWFwLmFkZCh0aW1lVXMsIGNjUGFja2V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBici5za2lwQml0cyhibG9ja19zaXplICogOCk7CisgICAgfQorCisgICAgcmV0dXJuIHRyYWNrQWRkZWQ7Cit9CisKKy8vIHJldHVybiB0aGUgdHJhY2sgaW5kZXggZm9yIGEgZ2l2ZW4gdHlwZSBhbmQgY2hhbm5lbC4KKy8vIGlmIHRoZSB0cmFjayBkb2VzIG5vdCBleGlzdCwgY3JlYXRlcyBhIG5ldyBvbmUuCitzaXplX3QgTnVQbGF5ZXIyOjpDQ0RlY29kZXI6OmdldFRyYWNrSW5kZXgoCisgICAgICAgIGludDMyX3QgdHJhY2tUeXBlLCBzaXplX3QgY2hhbm5lbCwgYm9vbCAqdHJhY2tBZGRlZCkgeworICAgIENDVHJhY2sgdHJhY2sodHJhY2tUeXBlLCBjaGFubmVsKTsKKyAgICBzc2l6ZV90IGluZGV4ID0gbVRyYWNrSW5kaWNlcy5pbmRleE9mS2V5KHRyYWNrKTsKKworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgLy8gQSBuZXcgdHJhY2sgaXMgYWRkZWQuCisgICAgICAgIGluZGV4ID0gbVRyYWNrcy5zaXplKCk7CisgICAgICAgIG1UcmFja0luZGljZXMuYWRkKHRyYWNrLCBpbmRleCk7CisgICAgICAgIG1UcmFja3MuYWRkKHRyYWNrKTsKKyAgICAgICAgKnRyYWNrQWRkZWQgPSB0cnVlOworICAgICAgICByZXR1cm4gaW5kZXg7CisgICAgfQorCisgICAgcmV0dXJuIG1UcmFja0luZGljZXMudmFsdWVBdChpbmRleCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpDQ0RlY29kZXI6OmRlY29kZShjb25zdCBzcDxBQnVmZmVyPiAmYWNjZXNzVW5pdCkgeworICAgIGlmIChleHRyYWN0RnJvbU1QRUdVc2VyRGF0YShhY2Nlc3NVbml0KSB8fCBleHRyYWN0RnJvbVNFSShhY2Nlc3NVbml0KSkgeworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgICAgIG1zZy0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFRyYWNrQWRkZWQpOworICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICB9CisgICAgLy8gVE9ETzogZXh0cmFjdCBDQyBmcm9tIG90aGVyIHNvdXJjZXMKK30KKwordm9pZCBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6ZGlzcGxheShpbnQ2NF90IHRpbWVVcykgeworICAgIGlmICghaXNTZWxlY3RlZCgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzc2l6ZV90IGluZGV4ID0gbUNDTWFwLmluZGV4T2ZLZXkodGltZVVzKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dWKCJjYyBmb3IgdGltZXN0YW1wICUiIFBSSWQ2NCAiIG5vdCBmb3VuZCIsIHRpbWVVcyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzcDxBQnVmZmVyPiBjY0J1ZjsKKworICAgIGlmIChpbmRleCA9PSAwKSB7CisgICAgICAgIGNjQnVmID0gbUNDTWFwLnZhbHVlQXQoaW5kZXgpOworICAgIH0gZWxzZSB7CisgICAgICAgIHNpemVfdCBzaXplID0gMDsKKworICAgICAgICBmb3IgKHNzaXplX3QgaSA9IDA7IGkgPD0gaW5kZXg7ICsraSkgeworICAgICAgICAgICAgc2l6ZSArPSBtQ0NNYXAudmFsdWVBdChpKS0+c2l6ZSgpOworICAgICAgICB9CisKKyAgICAgICAgY2NCdWYgPSBuZXcgQUJ1ZmZlcihzaXplKTsKKyAgICAgICAgY2NCdWYtPnNldFJhbmdlKDAsIDApOworCisgICAgICAgIGZvciAoc3NpemVfdCBpID0gMDsgaSA8PSBpbmRleDsgKytpKSB7CisgICAgICAgICAgICBzcDxBQnVmZmVyPiBidWYgPSBtQ0NNYXAudmFsdWVBdChpKTsKKyAgICAgICAgICAgIG1lbWNweShjY0J1Zi0+ZGF0YSgpICsgY2NCdWYtPnNpemUoKSwgYnVmLT5kYXRhKCksIGJ1Zi0+c2l6ZSgpKTsKKyAgICAgICAgICAgIGNjQnVmLT5zZXRSYW5nZSgwLCBjY0J1Zi0+c2l6ZSgpICsgYnVmLT5zaXplKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGNjQnVmLT5zaXplKCkgPiAwKSB7CisjaWYgMAorICAgICAgICBkdW1wQnl0ZVBhaXIoY2NCdWYpOworI2VuZGlmCisKKyAgICAgICAgY2NCdWYtPm1ldGEoKS0+c2V0SW50MzIoInRyYWNrSW5kZXgiLCBtU2VsZWN0ZWRUcmFjayk7CisgICAgICAgIGNjQnVmLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOworICAgICAgICBjY0J1Zi0+bWV0YSgpLT5zZXRJbnQ2NCgiZHVyYXRpb25VcyIsIDBsbCk7CisKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG1Ob3RpZnktPmR1cCgpOworICAgICAgICBtc2ctPnNldEludDMyKCJ3aGF0Iiwga1doYXRDbG9zZWRDYXB0aW9uRGF0YSk7CisgICAgICAgIG1zZy0+c2V0QnVmZmVyKCJidWZmZXIiLCBjY0J1Zik7CisgICAgICAgIG1zZy0+cG9zdCgpOworICAgIH0KKworICAgIC8vIHJlbW92ZSBhbGwgZW50cmllcyBiZWZvcmUgdGltZVVzCisgICAgbUNDTWFwLnJlbW92ZUl0ZW1zQXQoMCwgaW5kZXggKyAxKTsKK30KKwordm9pZCBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6Zmx1c2goKSB7CisgICAgbUNDTWFwLmNsZWFyKCk7CisgICAgbURUVkNDUGFja2V0LT5zZXRSYW5nZSgwLCAwKTsKK30KKworaW50MzJfdCBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6Q0NUcmFjazo6Y29tcGFyZShjb25zdCBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6Q0NUcmFjayYgcmhzKSBjb25zdCB7CisgICAgaW50MzJfdCBjbXAgPSBtVHJhY2tUeXBlIC0gcmhzLm1UcmFja1R5cGU7CisgICAgaWYgKGNtcCAhPSAwKSByZXR1cm4gY21wOworICAgIHJldHVybiBtVHJhY2tDaGFubmVsIC0gcmhzLm1UcmFja0NoYW5uZWw7Cit9CisKK2Jvb2wgTnVQbGF5ZXIyOjpDQ0RlY29kZXI6OkNDVHJhY2s6Om9wZXJhdG9yPChjb25zdCBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6Q0NUcmFjayYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbXBhcmUocmhzKSA8IDA7Cit9CisKK2Jvb2wgTnVQbGF5ZXIyOjpDQ0RlY29kZXI6OkNDVHJhY2s6Om9wZXJhdG9yPT0oY29uc3QgTnVQbGF5ZXIyOjpDQ0RlY29kZXI6OkNDVHJhY2smIHJocykgY29uc3QgeworICAgIHJldHVybiBjb21wYXJlKHJocykgPT0gMDsKK30KKworYm9vbCBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6Q0NUcmFjazo6b3BlcmF0b3IhPShjb25zdCBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6Q0NUcmFjayYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbXBhcmUocmhzKSAhPSAwOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9udXBsYXllcjIvTnVQbGF5ZXIyQ0NEZWNvZGVyLmggYi9tZWRpYS9saWJtZWRpYS9udXBsYXllcjIvTnVQbGF5ZXIyQ0NEZWNvZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdkNWVhMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL251cGxheWVyMi9OdVBsYXllcjJDQ0RlY29kZXIuaApAQCAtMCwwICsxLDk3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE5VUExBWUVSMl9DQ0RFQ09ERVJfSF8KKworI2RlZmluZSBOVVBMQVlFUjJfQ0NERUNPREVSX0hfCisKKyNpbmNsdWRlICJOdVBsYXllcjIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgTnVQbGF5ZXIyOjpDQ0RlY29kZXIgOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgZW51bSB7CisgICAgICAgIGtXaGF0Q2xvc2VkQ2FwdGlvbkRhdGEsCisgICAgICAgIGtXaGF0VHJhY2tBZGRlZCwKKyAgICB9OworCisgICAgZW51bSB7CisgICAgICAgIGtUcmFja1R5cGVDRUE2MDgsCisgICAgICAgIGtUcmFja1R5cGVDRUE3MDgsCisgICAgfTsKKworICAgIGV4cGxpY2l0IENDRGVjb2Rlcihjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSk7CisKKyAgICBzaXplX3QgZ2V0VHJhY2tDb3VudCgpIGNvbnN0OworICAgIHNwPEFNZXNzYWdlPiBnZXRUcmFja0luZm8oc2l6ZV90IGluZGV4KSBjb25zdDsKKyAgICBzdGF0dXNfdCBzZWxlY3RUcmFjayhzaXplX3QgaW5kZXgsIGJvb2wgc2VsZWN0KTsKKyAgICBib29sIGlzU2VsZWN0ZWQoKSBjb25zdDsKKyAgICB2b2lkIGRlY29kZShjb25zdCBzcDxBQnVmZmVyPiAmYWNjZXNzVW5pdCk7CisgICAgdm9pZCBkaXNwbGF5KGludDY0X3QgdGltZVVzKTsKKyAgICB2b2lkIGZsdXNoKCk7CisKK3ByaXZhdGU6CisgICAgLy8gQ0MgdHJhY2sgaWRlbnRpZmllci4KKyAgICBzdHJ1Y3QgQ0NUcmFjayB7CisgICAgICAgIENDVHJhY2soKSA6IG1UcmFja1R5cGUoMCksIG1UcmFja0NoYW5uZWwoMCkgeyB9CisKKyAgICAgICAgQ0NUcmFjayhjb25zdCBpbnQzMl90IHRyYWNrVHlwZSwgY29uc3Qgc2l6ZV90IHRyYWNrQ2hhbm5lbCkKKyAgICAgICAgICAgIDogbVRyYWNrVHlwZSh0cmFja1R5cGUpLCBtVHJhY2tDaGFubmVsKHRyYWNrQ2hhbm5lbCkgeyB9CisKKyAgICAgICAgaW50MzJfdCBtVHJhY2tUeXBlOworICAgICAgICBzaXplX3QgbVRyYWNrQ2hhbm5lbDsKKworICAgICAgICAvLyBUaGUgb3JkZXJpbmcgb2YgQ0NUcmFja3MgaXMgdG8gYnVpbGQgYSBtYXAgb2YgdHJhY2sgdG8gaW5kZXguCisgICAgICAgIC8vIEl0IGlzIG5lY2Vzc2FyeSB0byBmaW5kIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCBDQ1RyYWNrIHdoZW4gQ0MgZGF0YSBjb21lcy4KKyAgICAgICAgaW50IGNvbXBhcmUoY29uc3QgTnVQbGF5ZXIyOjpDQ0RlY29kZXI6OkNDVHJhY2smIHJocykgY29uc3Q7CisgICAgICAgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6Q0NUcmFjayYgcmhzKSBjb25zdDsKKyAgICAgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6Q0NUcmFjayYgcmhzKSBjb25zdDsKKyAgICAgICAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6Q0NUcmFjayYgcmhzKSBjb25zdDsKKyAgICB9OworCisgICAgc3A8QU1lc3NhZ2U+IG1Ob3RpZnk7CisgICAgS2V5ZWRWZWN0b3I8aW50NjRfdCwgc3A8QUJ1ZmZlcj4gPiBtQ0NNYXA7CisgICAgc3NpemVfdCBtU2VsZWN0ZWRUcmFjazsKKyAgICBLZXllZFZlY3RvcjxDQ1RyYWNrLCBzaXplX3Q+IG1UcmFja0luZGljZXM7CisgICAgVmVjdG9yPENDVHJhY2s+IG1UcmFja3M7CisKKyAgICAvLyBDRUEtNjA4IGNsb3NlZCBjYXB0aW9uCisgICAgc2l6ZV90IG1MaW5lMjFDaGFubmVsc1syXTsgLy8gVGhlIGN1cnJlbnQgY2hhbm5lbHMgb2YgTlRTQ19DQ19GSUVMRF97MSwgMn0KKworICAgIC8vIENFQS03MDggY2xvc2VkIGNhcHRpb24KKyAgICBzcDxBQnVmZmVyPiBtRFRWQ0NQYWNrZXQ7CisKKyAgICBib29sIGlzVHJhY2tWYWxpZChzaXplX3QgaW5kZXgpIGNvbnN0OworICAgIHNpemVfdCBnZXRUcmFja0luZGV4KGludDMyX3QgdHJhY2tUeXBlLCBzaXplX3QgY2hhbm5lbCwgYm9vbCAqdHJhY2tBZGRlZCk7CisKKyAgICAvLyBFeHRyYWN0IGZyb20gSC4yNjQgU0VJcworICAgIGJvb2wgZXh0cmFjdEZyb21TRUkoY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQpOworICAgIGJvb2wgcGFyc2VTRUlOYWxVbml0KGludDY0X3QgdGltZVVzLCBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisKKyAgICAvLyBFeHRyYWN0IGZyb20gTVBFRyB1c2VyIGRhdGEKKyAgICBib29sIGV4dHJhY3RGcm9tTVBFR1VzZXJEYXRhKGNvbnN0IHNwPEFCdWZmZXI+ICZhY2Nlc3NVbml0KTsKKyAgICBib29sIHBhcnNlTVBFR1VzZXJEYXRhVW5pdChpbnQ2NF90IHRpbWVVcywgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworCisgICAgLy8gRXh0cmFjdCBDQyB0cmFja3MgZnJvbSBNUEVHX2NjX2RhdGEKKyAgICBib29sIHBhcnNlTVBFR0NDRGF0YShpbnQ2NF90IHRpbWVVcywgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworICAgIGJvb2wgcGFyc2VEVFZDQ1BhY2tldChpbnQ2NF90IHRpbWVVcywgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ0NEZWNvZGVyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTlVQTEFZRVIyX0NDREVDT0RFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvbnVwbGF5ZXIyL051UGxheWVyMkRlY29kZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvbnVwbGF5ZXIyL051UGxheWVyMkRlY29kZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ZDQxZjMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9udXBsYXllcjIvTnVQbGF5ZXIyRGVjb2Rlci5jcHAKQEAgLTAsMCArMSwxMjkxIEBACisvKgorICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk51UGxheWVyMkRlY29kZXIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2luY2x1ZGUgIk51UGxheWVyMkNDRGVjb2Rlci5oIgorI2luY2x1ZGUgIk51UGxheWVyMkRlY29kZXIuaCIKKyNpbmNsdWRlICJOdVBsYXllcjJEcm0uaCIKKyNpbmNsdWRlICJOdVBsYXllcjJSZW5kZXJlci5oIgorI2luY2x1ZGUgIk51UGxheWVyMlNvdXJjZS5oIgorCisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFDb2RlYy5oPgorI2luY2x1ZGUgPG1lZGlhL05ka1dyYXBwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2F2Y191dGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9TdXJmYWNlVXRpbHMuaD4KKworI2luY2x1ZGUgIkFUU1BhcnNlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXRpYyBmbG9hdCBrRGlzcGxheVJlZnJlc2hpbmdSYXRlID0gNjAuZjsgLy8gVE9ETzogZ2V0IHRoaXMgZnJvbSB0aGUgZGlzcGxheQorCisvLyBUaGUgZGVmYXVsdCB0b3RhbCB2aWRlbyBmcmFtZSByYXRlIG9mIGEgc3RyZWFtIHdoZW4gdGhhdCBpbmZvIGlzIG5vdCBhdmFpbGFibGUgZnJvbQorLy8gdGhlIHNvdXJjZS4KK3N0YXRpYyBmbG9hdCBrRGVmYXVsdFZpZGVvRnJhbWVSYXRlVG90YWwgPSAzMC5mOworCitzdGF0aWMgaW5saW5lIGJvb2wgZ2V0QXVkaW9EZWVwQnVmZmVyU2V0dGluZygpIHsKKyAgICByZXR1cm4gcHJvcGVydHlfZ2V0X2Jvb2woIm1lZGlhLnN0YWdlZnJpZ2h0LmF1ZGlvLmRlZXAiLCBmYWxzZSAvKiBkZWZhdWx0X3ZhbHVlICovKTsKK30KKworTnVQbGF5ZXIyOjpEZWNvZGVyOjpEZWNvZGVyKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKKyAgICAgICAgY29uc3Qgc3A8U291cmNlPiAmc291cmNlLAorICAgICAgICBwaWRfdCBwaWQsCisgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgY29uc3Qgc3A8UmVuZGVyZXI+ICZyZW5kZXJlciwKKyAgICAgICAgY29uc3Qgc3A8QU5hdGl2ZVdpbmRvd1dyYXBwZXI+ICZud3csCisgICAgICAgIGNvbnN0IHNwPENDRGVjb2Rlcj4gJmNjRGVjb2RlcikKKyAgICA6IERlY29kZXJCYXNlKG5vdGlmeSksCisgICAgICBtTmF0aXZlV2luZG93KG53dyksCisgICAgICBtU291cmNlKHNvdXJjZSksCisgICAgICBtUmVuZGVyZXIocmVuZGVyZXIpLAorICAgICAgbUNDRGVjb2RlcihjY0RlY29kZXIpLAorICAgICAgbVBpZChwaWQpLAorICAgICAgbVVpZCh1aWQpLAorICAgICAgbVNraXBSZW5kZXJpbmdVbnRpbE1lZGlhVGltZVVzKC0xbGwpLAorICAgICAgbU51bUZyYW1lc1RvdGFsKDBsbCksCisgICAgICBtTnVtSW5wdXRGcmFtZXNEcm9wcGVkKDBsbCksCisgICAgICBtTnVtT3V0cHV0RnJhbWVzRHJvcHBlZCgwbGwpLAorICAgICAgbVZpZGVvV2lkdGgoMCksCisgICAgICBtVmlkZW9IZWlnaHQoMCksCisgICAgICBtSXNBdWRpbyh0cnVlKSwKKyAgICAgIG1Jc1ZpZGVvQVZDKGZhbHNlKSwKKyAgICAgIG1Jc1NlY3VyZShmYWxzZSksCisgICAgICBtSXNFbmNyeXB0ZWQoZmFsc2UpLAorICAgICAgbUlzRW5jcnlwdGVkT2JzZXJ2ZWRFYXJsaWVyKGZhbHNlKSwKKyAgICAgIG1Gb3JtYXRDaGFuZ2VQZW5kaW5nKGZhbHNlKSwKKyAgICAgIG1UaW1lQ2hhbmdlUGVuZGluZyhmYWxzZSksCisgICAgICBtRnJhbWVSYXRlVG90YWwoa0RlZmF1bHRWaWRlb0ZyYW1lUmF0ZVRvdGFsKSwKKyAgICAgIG1QbGF5YmFja1NwZWVkKDEuMGYpLAorICAgICAgbU51bVZpZGVvVGVtcG9yYWxMYXllclRvdGFsKDEpLCAvLyBkZWNvZGUgYWxsIGxheWVycworICAgICAgbU51bVZpZGVvVGVtcG9yYWxMYXllckFsbG93ZWQoMSksCisgICAgICBtQ3VycmVudE1heFZpZGVvVGVtcG9yYWxMYXllcklkKDApLAorICAgICAgbVJlc3VtZVBlbmRpbmcoZmFsc2UpLAorICAgICAgbUNvbXBvbmVudE5hbWUoImRlY29kZXIiKSB7CisgICAgbVZpZGVvVGVtcG9yYWxMYXllckFnZ3JlZ2F0ZUZwc1swXSA9IG1GcmFtZVJhdGVUb3RhbDsKK30KKworTnVQbGF5ZXIyOjpEZWNvZGVyOjp+RGVjb2RlcigpIHsKKyAgICAvLyBOZWVkIHRvIHN0b3AgbG9vcGVyIGZpcnN0IHNpbmNlIG1Db2RlYyBjb3VsZCBiZSBhY2Nlc3NlZCBvbiB0aGUgbURlY29kZXJMb29wZXIuCisgICAgc3RvcExvb3BlcigpOworICAgIGlmIChtQ29kZWMgIT0gTlVMTCkgeworICAgICAgICBtQ29kZWMtPnJlbGVhc2UoKTsKKyAgICB9CisgICAgcmVsZWFzZUFuZFJlc2V0TWVkaWFCdWZmZXJzKCk7Cit9CisKK3NwPEFNZXNzYWdlPiBOdVBsYXllcjI6OkRlY29kZXI6OmdldFN0YXRzKCkgY29uc3QgeworICAgIG1TdGF0cy0+c2V0SW50NjQoImZyYW1lcy10b3RhbCIsIG1OdW1GcmFtZXNUb3RhbCk7CisgICAgbVN0YXRzLT5zZXRJbnQ2NCgiZnJhbWVzLWRyb3BwZWQtaW5wdXQiLCBtTnVtSW5wdXRGcmFtZXNEcm9wcGVkKTsKKyAgICBtU3RhdHMtPnNldEludDY0KCJmcmFtZXMtZHJvcHBlZC1vdXRwdXQiLCBtTnVtT3V0cHV0RnJhbWVzRHJvcHBlZCk7CisgICAgcmV0dXJuIG1TdGF0czsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpEZWNvZGVyOjpzZXRWaWRlb1N1cmZhY2UoY29uc3Qgc3A8QU5hdGl2ZVdpbmRvd1dyYXBwZXI+ICZud3cpIHsKKyAgICBpZiAobnd3ID09IE5VTEwgfHwgbnd3LT5nZXRBTmF0aXZlV2luZG93KCkgPT0gTlVMTAorICAgICAgICB8fCBBRGVidWc6OmlzRXhwZXJpbWVudEVuYWJsZWQoImxlZ2FjeS1zZXRzdXJmYWNlIikpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2V0VmlkZW9TdXJmYWNlLCB0aGlzKTsKKworICAgIG1zZy0+c2V0T2JqZWN0KCJzdXJmYWNlIiwgbnd3KTsKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOworICAgIGlmIChlcnIgPT0gT0sgJiYgcmVzcG9uc2UgIT0gTlVMTCkgeworICAgICAgICBDSEVDSyhyZXNwb25zZS0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpEZWNvZGVyOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIEFMT0dWKCJbJXNdIG9uTWVzc2FnZTogJXMiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBtc2ctPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7CisKKyAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgICAgIGNhc2Uga1doYXRDb2RlY05vdGlmeToKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCBjYklEOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImNhbGxiYWNrSUQiLCAmY2JJRCkpOworCisgICAgICAgICAgICBBTE9HVigiWyVzXSBrV2hhdENvZGVjTm90aWZ5OiBjYklEID0gJWQsIHBhdXNlZCA9ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgbUlzQXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIiwgY2JJRCwgbVBhdXNlZCk7CisKKyAgICAgICAgICAgIGlmIChtUGF1c2VkKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoY2JJRCkgeworICAgICAgICAgICAgICAgIGNhc2UgQU1lZGlhQ29kZWNXcmFwcGVyOjpDQl9JTlBVVF9BVkFJTEFCTEU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGluZGV4OworICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiaW5kZXgiLCAmaW5kZXgpKTsKKworICAgICAgICAgICAgICAgICAgICBoYW5kbGVBbklucHV0QnVmZmVyKGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBBTWVkaWFDb2RlY1dyYXBwZXI6OkNCX09VVFBVVF9BVkFJTEFCTEU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGluZGV4OworICAgICAgICAgICAgICAgICAgICBzaXplX3Qgb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lVXM7CisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZmxhZ3M7CisKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImluZGV4IiwgJmluZGV4KSk7CisgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFNpemUoIm9mZnNldCIsICZvZmZzZXQpKTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kU2l6ZSgic2l6ZSIsICZzaXplKSk7CisgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7CisgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJmbGFncyIsICZmbGFncykpOworCisgICAgICAgICAgICAgICAgICAgIGhhbmRsZUFuT3V0cHV0QnVmZmVyKGluZGV4LCBvZmZzZXQsIHNpemUsIHRpbWVVcywgZmxhZ3MpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEFNZWRpYUNvZGVjV3JhcHBlcjo6Q0JfT1VUUFVUX0ZPUk1BVF9DSEFOR0VEOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgiZm9ybWF0IiwgJmZvcm1hdCkpOworCisgICAgICAgICAgICAgICAgICAgIGhhbmRsZU91dHB1dEZvcm1hdENoYW5nZShmb3JtYXQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEFNZWRpYUNvZGVjV3JhcHBlcjo6Q0JfRVJST1I6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnI7CisgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJEZWNvZGVyICglcykgcmVwb3J0ZWQgZXJyb3IgOiAweCV4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSXNBdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iLCBlcnIpOworCisgICAgICAgICAgICAgICAgICAgIGhhbmRsZUVycm9yKGVycik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBUUkVTUEFTUygpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdFJlbmRlckJ1ZmZlcjoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFpc1N0YWxlUmVwbHkobXNnKSkgeworICAgICAgICAgICAgICAgIG9uUmVuZGVyQnVmZmVyKG1zZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRBdWRpb091dHB1dEZvcm1hdENoYW5nZWQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghaXNTdGFsZVJlcGx5KG1zZykpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnI7CisgICAgICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSAmJiBlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlJlbmRlcmVyIHJlcG9ydGVkIDB4JXggd2hlbiBjaGFuZ2luZyBhdWRpbyBvdXRwdXQgZm9ybWF0IiwgZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlRXJyb3IoZXJyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRTZXRWaWRlb1N1cmZhY2U6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOworCisgICAgICAgICAgICBzcDxSZWZCYXNlPiBvYmo7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoInN1cmZhY2UiLCAmb2JqKSk7CisgICAgICAgICAgICBzcDxBTmF0aXZlV2luZG93V3JhcHBlcj4gbnd3ID0KKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxBTmF0aXZlV2luZG93V3JhcHBlciAqPihvYmouZ2V0KCkpOyAvLyBub24tbnVsbAorICAgICAgICAgICAgaWYgKG53dyA9PSBOVUxMIHx8IG53dy0+Z2V0QU5hdGl2ZVdpbmRvdygpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludDMyX3QgZXJyID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAvLyBOT1RFOiBpbiBwcmFjdGljZSBtTmF0aXZlV2luZG93IGlzIGFsd2F5cyBub24tbnVsbCwKKyAgICAgICAgICAgIC8vIGJ1dCBjaGVja2luZyBoZXJlIGZvciBjb21wbGV0ZW5lc3MKKyAgICAgICAgICAgIGlmIChtQ29kZWMgIT0gTlVMTAorICAgICAgICAgICAgICAgICYmIG1OYXRpdmVXaW5kb3cgIT0gTlVMTCAmJiBtTmF0aXZlV2luZG93LT5nZXRBTmF0aXZlV2luZG93KCkgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IG9uY2UgQXdlc29tZVBsYXllciBpcyByZW1vdmVkLCByZW1vdmUgdGhpcyBhdXRvbWF0aWMgY29ubmVjdGluZworICAgICAgICAgICAgICAgIC8vIHRvIHRoZSBzdXJmYWNlIGJ5IE1lZGlhUGxheWVyU2VydmljZS4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIGF0IHRoaXMgcG9pbnQgTWVkaWFQbGF5ZXIyTWFuYWdlcjo6Y2xpZW50IGhhcyBhbHJlYWR5IGNvbm5lY3RlZCB0byB0aGUKKyAgICAgICAgICAgICAgICAvLyBzdXJmYWNlLCB3aGljaCBNZWRpYUNvZGVjIGRvZXMgbm90IGV4cGVjdAorICAgICAgICAgICAgICAgIGVyciA9IG5hdGl2ZVdpbmRvd0Rpc2Nvbm5lY3Qobnd3LT5nZXRBTmF0aXZlV2luZG93KCksICJrV2hhdFNldFZpZGVvU3VyZmFjZShud3cpIik7CisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICBlcnIgPSBtQ29kZWMtPnNldE91dHB1dFN1cmZhY2Uobnd3KTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0lfSUYoZXJyLCAiY29kZWMgc2V0T3V0cHV0U3VyZmFjZSByZXR1cm5lZDogJWQiLCBlcnIpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWNvbm5lY3QgdG8gdGhlIG9sZCBzdXJmYWNlIGFzIE1QUzo6Q2xpZW50IHdpbGwgZXhwZWN0IHRvCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZSBhYmxlIHRvIGRpc2Nvbm5lY3QgZnJvbSBpdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKW5hdGl2ZVdpbmRvd0Nvbm5lY3QobU5hdGl2ZVdpbmRvdy0+Z2V0QU5hdGl2ZVdpbmRvdygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAia1doYXRTZXRWaWRlb1N1cmZhY2UobU5hdGl2ZVdpbmRvdykiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1OYXRpdmVXaW5kb3cgPSBud3c7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICAvLyByZWNvbm5lY3QgdG8gdGhlIG5ldyBzdXJmYWNlIG9uIGVycm9yIGFzIE1QUzo6Q2xpZW50IHdpbGwgZXhwZWN0IHRvCisgICAgICAgICAgICAgICAgICAgIC8vIGJlIGFibGUgdG8gZGlzY29ubmVjdCBmcm9tIGl0LgorICAgICAgICAgICAgICAgICAgICAodm9pZCluYXRpdmVXaW5kb3dDb25uZWN0KG53dy0+Z2V0QU5hdGl2ZVdpbmRvdygpLCAia1doYXRTZXRWaWRlb1N1cmZhY2UoZXJyKSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOworICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOworICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdERybVJlbGVhc2VDcnlwdG86CisgICAgICAgIHsKKyAgICAgICAgICAgIEFMT0dWKCJrV2hhdERybVJlbGVhc2VDcnlwdG8iKTsKKyAgICAgICAgICAgIG9uUmVsZWFzZUNyeXB0byhtc2cpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgRGVjb2RlckJhc2U6Om9uTWVzc2FnZVJlY2VpdmVkKG1zZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpEZWNvZGVyOjpvbkNvbmZpZ3VyZShjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkgeworICAgIEFMT0dWKCJbJXNdIG9uQ29uZmlndXJlIChmb3JtYXQ9JXMpIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgZm9ybWF0LT5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOworICAgIENIRUNLKG1Db2RlYyA9PSBOVUxMKTsKKworICAgIG1Gb3JtYXRDaGFuZ2VQZW5kaW5nID0gZmFsc2U7CisgICAgbVRpbWVDaGFuZ2VQZW5kaW5nID0gZmFsc2U7CisKKyAgICArK21CdWZmZXJHZW5lcmF0aW9uOworCisgICAgQVN0cmluZyBtaW1lOworICAgIENIRUNLKGZvcm1hdC0+ZmluZFN0cmluZygibWltZSIsICZtaW1lKSk7CisKKyAgICBtSXNBdWRpbyA9ICFzdHJuY2FzZWNtcCgiYXVkaW8vIiwgbWltZS5jX3N0cigpLCA2KTsKKyAgICBtSXNWaWRlb0FWQyA9ICFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgbWltZS5jX3N0cigpKTsKKworICAgIG1Db21wb25lbnROYW1lID0gbWltZTsKKyAgICBtQ29tcG9uZW50TmFtZS5hcHBlbmQoIiBkZWNvZGVyIik7CisgICAgQUxPR1YoIlslc10gb25Db25maWd1cmUgKG53dz0lcCkiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpLAorICAgICAgICAgIChtTmF0aXZlV2luZG93ID09IE5VTEwgPyBOVUxMIDogbU5hdGl2ZVdpbmRvdy0+Z2V0QU5hdGl2ZVdpbmRvdygpKSk7CisKKyAgICBtQ29kZWMgPSBBTWVkaWFDb2RlY1dyYXBwZXI6OkNyZWF0ZURlY29kZXJCeVR5cGUobWltZSk7CisgICAgaW50MzJfdCBzZWN1cmUgPSAwOworICAgIGlmIChmb3JtYXQtPmZpbmRJbnQzMigic2VjdXJlIiwgJnNlY3VyZSkgJiYgc2VjdXJlICE9IDApIHsKKyAgICAgICAgaWYgKG1Db2RlYyAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZiAobUNvZGVjLT5nZXROYW1lKCZtQ29tcG9uZW50TmFtZSkgPT0gT0spIHsKKyAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5hcHBlbmQoIi5zZWN1cmUiKTsKKyAgICAgICAgICAgICAgICBtQ29kZWMtPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICBBTE9HSSgiWyVzXSBjcmVhdGluZyIsIG1Db21wb25lbnROYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIG1Db2RlYyA9IEFNZWRpYUNvZGVjV3JhcHBlcjo6Q3JlYXRlQ29kZWNCeU5hbWUobUNvbXBvbmVudE5hbWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtQ29kZWMgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChtQ29kZWMgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNyZWF0ZSAlcyVzIGRlY29kZXIiLAorICAgICAgICAgICAgICAgIChzZWN1cmUgPyAic2VjdXJlICIgOiAiIiksIG1pbWUuY19zdHIoKSk7CisgICAgICAgIGhhbmRsZUVycm9yKE5PX0lOSVQpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1Jc1NlY3VyZSA9IHNlY3VyZTsKKworICAgIG1Db2RlYy0+Z2V0TmFtZSgmbUNvbXBvbmVudE5hbWUpOworCisgICAgc3RhdHVzX3QgZXJyOworICAgIGlmIChtTmF0aXZlV2luZG93ICE9IE5VTEwgJiYgbU5hdGl2ZVdpbmRvdy0+Z2V0QU5hdGl2ZVdpbmRvdygpICE9IE5VTEwpIHsKKyAgICAgICAgLy8gZGlzY29ubmVjdCBmcm9tIHN1cmZhY2UgYXMgTWVkaWFDb2RlYyB3aWxsIHJlY29ubmVjdAorICAgICAgICBlcnIgPSBuYXRpdmVXaW5kb3dEaXNjb25uZWN0KG1OYXRpdmVXaW5kb3ctPmdldEFOYXRpdmVXaW5kb3coKSwgIm9uQ29uZmlndXJlIik7CisgICAgICAgIC8vIFdlIHRyZWF0IHRoaXMgYXMgYSB3YXJuaW5nLCBhcyB0aGlzIGlzIGEgcHJlcGFyYXRvcnkgc3RlcC4KKyAgICAgICAgLy8gQ29kZWMgd2lsbCB0cnkgdG8gY29ubmVjdCB0byB0aGUgc3VyZmFjZSwgd2hpY2ggaXMgd2hlcmUKKyAgICAgICAgLy8gYW55IGVycm9yIHNpZ25hbGluZyB3aWxsIG9jY3VyLgorICAgICAgICBBTE9HV19JRihlcnIgIT0gT0ssICJmYWlsZWQgdG8gZGlzY29ubmVjdCBmcm9tIHN1cmZhY2U6ICVkIiwgZXJyKTsKKyAgICB9CisKKyAgICAvLyBNb2R1bGFyIERSTQorICAgIHNwPFJlZkJhc2U+IG9iakNyeXB0bzsKKyAgICBmb3JtYXQtPmZpbmRPYmplY3QoImNyeXB0byIsICZvYmpDcnlwdG8pOworICAgIHNwPEFNZWRpYUNyeXB0b1dyYXBwZXI+IGNyeXB0byA9IHN0YXRpY19jYXN0PEFNZWRpYUNyeXB0b1dyYXBwZXIgKj4ob2JqQ3J5cHRvLmdldCgpKTsKKyAgICAvLyBub24tZW5jcnlwdGVkIHNvdXJjZSB3b24ndCBoYXZlIGEgY3J5cHRvCisgICAgbUlzRW5jcnlwdGVkID0gKGNyeXB0byAhPSBOVUxMKTsKKyAgICAvLyBjb25maWd1cmUgaXMgY2FsbGVkIG9uY2U7IHN0aWxsIHVzaW5nIE9SIGluIGNhc2UgdGhlIGJlaGF2aW9yIGNoYW5nZXMuCisgICAgbUlzRW5jcnlwdGVkT2JzZXJ2ZWRFYXJsaWVyID0gbUlzRW5jcnlwdGVkT2JzZXJ2ZWRFYXJsaWVyIHx8IG1Jc0VuY3J5cHRlZDsKKyAgICBBTE9HVigib25Db25maWd1cmUgbUNyeXB0bzogJXAsIG1Jc1NlY3VyZTogJWQiLCBjcnlwdG8uZ2V0KCksIG1Jc1NlY3VyZSk7CisKKyAgICBlcnIgPSBtQ29kZWMtPmNvbmZpZ3VyZSgKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdFdyYXBwZXI6OkNyZWF0ZShmb3JtYXQpLAorICAgICAgICAgICAgbU5hdGl2ZVdpbmRvdywKKyAgICAgICAgICAgIGNyeXB0bywKKyAgICAgICAgICAgIDAgLyogZmxhZ3MgKi8pOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNvbmZpZ3VyZSBbJXNdIGRlY29kZXIgKGVycj0lZCkiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBlcnIpOworICAgICAgICBtQ29kZWMtPnJlbGVhc2UoKTsKKyAgICAgICAgbUNvZGVjLmNsZWFyKCk7CisgICAgICAgIGhhbmRsZUVycm9yKGVycik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgcmVtZW1iZXJDb2RlY1NwZWNpZmljRGF0YShmb3JtYXQpOworCisgICAgLy8gdGhlIGZvbGxvd2luZyBzaG91bGQgd29yayBpbiBjb25maWd1cmVkIHN0YXRlCisgICAgc3A8QU1lZGlhRm9ybWF0V3JhcHBlcj4gb3V0cHV0Rm9ybWF0ID0gbUNvZGVjLT5nZXRPdXRwdXRGb3JtYXQoKTsKKyAgICBpZiAob3V0cHV0Rm9ybWF0ID09IE5VTEwpIHsKKyAgICAgICAgaGFuZGxlRXJyb3IoSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1JbnB1dEZvcm1hdCA9IG1Db2RlYy0+Z2V0SW5wdXRGb3JtYXQoKTsKKyAgICBpZiAobUlucHV0Rm9ybWF0ID09IE5VTEwpIHsKKyAgICAgICAgaGFuZGxlRXJyb3IoSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbVN0YXRzLT5zZXRTdHJpbmcoIm1pbWUiLCBtaW1lLmNfc3RyKCkpOworICAgIG1TdGF0cy0+c2V0U3RyaW5nKCJjb21wb25lbnQtbmFtZSIsIG1Db21wb25lbnROYW1lLmNfc3RyKCkpOworCisgICAgaWYgKCFtSXNBdWRpbykgeworICAgICAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7CisgICAgICAgIGlmIChvdXRwdXRGb3JtYXQtPmdldEludDMyKCJ3aWR0aCIsICZ3aWR0aCkKKyAgICAgICAgICAgICAgICAmJiBvdXRwdXRGb3JtYXQtPmdldEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSkgeworICAgICAgICAgICAgbVN0YXRzLT5zZXRJbnQzMigid2lkdGgiLCB3aWR0aCk7CisgICAgICAgICAgICBtU3RhdHMtPnNldEludDMyKCJoZWlnaHQiLCBoZWlnaHQpOworICAgICAgICB9CisgICAgfQorCisgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKGtXaGF0Q29kZWNOb3RpZnksIHRoaXMpOworICAgIG1Db2RlYy0+c2V0Q2FsbGJhY2socmVwbHkpOworCisgICAgZXJyID0gbUNvZGVjLT5zdGFydCgpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzdGFydCBbJXNdIGRlY29kZXIgKGVycj0lZCkiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBlcnIpOworICAgICAgICBtQ29kZWMtPnJlbGVhc2UoKTsKKyAgICAgICAgbUNvZGVjLmNsZWFyKCk7CisgICAgICAgIGhhbmRsZUVycm9yKGVycik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICByZWxlYXNlQW5kUmVzZXRNZWRpYUJ1ZmZlcnMoKTsKKworICAgIG1QYXVzZWQgPSBmYWxzZTsKKyAgICBtUmVzdW1lUGVuZGluZyA9IGZhbHNlOworfQorCit2b2lkIE51UGxheWVyMjo6RGVjb2Rlcjo6b25TZXRQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmcGFyYW1zKSB7CisgICAgYm9vbCBuZWVkQWRqdXN0TGF5ZXJzID0gZmFsc2U7CisgICAgZmxvYXQgZnJhbWVSYXRlVG90YWw7CisgICAgaWYgKHBhcmFtcy0+ZmluZEZsb2F0KCJmcmFtZS1yYXRlLXRvdGFsIiwgJmZyYW1lUmF0ZVRvdGFsKQorICAgICAgICAgICAgJiYgbUZyYW1lUmF0ZVRvdGFsICE9IGZyYW1lUmF0ZVRvdGFsKSB7CisgICAgICAgIG5lZWRBZGp1c3RMYXllcnMgPSB0cnVlOworICAgICAgICBtRnJhbWVSYXRlVG90YWwgPSBmcmFtZVJhdGVUb3RhbDsKKyAgICB9CisKKyAgICBpbnQzMl90IG51bVZpZGVvVGVtcG9yYWxMYXllclRvdGFsOworICAgIGlmIChwYXJhbXMtPmZpbmRJbnQzMigidGVtcG9yYWwtbGF5ZXItY291bnQiLCAmbnVtVmlkZW9UZW1wb3JhbExheWVyVG90YWwpCisgICAgICAgICAgICAmJiBudW1WaWRlb1RlbXBvcmFsTGF5ZXJUb3RhbCA+PSAwCisgICAgICAgICAgICAmJiBudW1WaWRlb1RlbXBvcmFsTGF5ZXJUb3RhbCA8PSBrTWF4TnVtVmlkZW9UZW1wb3JhbExheWVycworICAgICAgICAgICAgJiYgbU51bVZpZGVvVGVtcG9yYWxMYXllclRvdGFsICE9IG51bVZpZGVvVGVtcG9yYWxMYXllclRvdGFsKSB7CisgICAgICAgIG5lZWRBZGp1c3RMYXllcnMgPSB0cnVlOworICAgICAgICBtTnVtVmlkZW9UZW1wb3JhbExheWVyVG90YWwgPSBzdGQ6Om1heChudW1WaWRlb1RlbXBvcmFsTGF5ZXJUb3RhbCwgMSk7CisgICAgfQorCisgICAgaWYgKG5lZWRBZGp1c3RMYXllcnMgJiYgbU51bVZpZGVvVGVtcG9yYWxMYXllclRvdGFsID4gMSkgeworICAgICAgICAvLyBUT0RPOiBGb3Igbm93LCBsYXllciBmcHMgaXMgY2FsY3VsYXRlZCBmb3Igc29tZSBzcGVjaWZpYyBhcmNoaXRlY3R1cmVzLgorICAgICAgICAvLyBCdXQgaXQgcmVhbGx5IHNob3VsZCBiZSBleHRyYWN0ZWQgZnJvbSB0aGUgc3RyZWFtLgorICAgICAgICBtVmlkZW9UZW1wb3JhbExheWVyQWdncmVnYXRlRnBzWzBdID0KKyAgICAgICAgICAgIG1GcmFtZVJhdGVUb3RhbCAvIChmbG9hdCkoMWxsIDw8IChtTnVtVmlkZW9UZW1wb3JhbExheWVyVG90YWwgLSAxKSk7CisgICAgICAgIGZvciAoaW50MzJfdCBpID0gMTsgaSA8IG1OdW1WaWRlb1RlbXBvcmFsTGF5ZXJUb3RhbDsgKytpKSB7CisgICAgICAgICAgICBtVmlkZW9UZW1wb3JhbExheWVyQWdncmVnYXRlRnBzW2ldID0KKyAgICAgICAgICAgICAgICBtRnJhbWVSYXRlVG90YWwgLyAoZmxvYXQpKDFsbCA8PCAobU51bVZpZGVvVGVtcG9yYWxMYXllclRvdGFsIC0gaSkpCisgICAgICAgICAgICAgICAgKyBtVmlkZW9UZW1wb3JhbExheWVyQWdncmVnYXRlRnBzW2kgLSAxXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZsb2F0IHBsYXliYWNrU3BlZWQ7CisgICAgaWYgKHBhcmFtcy0+ZmluZEZsb2F0KCJwbGF5YmFjay1zcGVlZCIsICZwbGF5YmFja1NwZWVkKQorICAgICAgICAgICAgJiYgbVBsYXliYWNrU3BlZWQgIT0gcGxheWJhY2tTcGVlZCkgeworICAgICAgICBuZWVkQWRqdXN0TGF5ZXJzID0gdHJ1ZTsKKyAgICAgICAgbVBsYXliYWNrU3BlZWQgPSBwbGF5YmFja1NwZWVkOworICAgIH0KKworICAgIGlmIChuZWVkQWRqdXN0TGF5ZXJzKSB7CisgICAgICAgIGZsb2F0IGRlY29kZUZyYW1lUmF0ZSA9IG1GcmFtZVJhdGVUb3RhbDsKKyAgICAgICAgLy8gZW5hYmxlIHRlbXBvcmFsIGxheWVyaW5nIG9wdGltaXphdGlvbiBvbmx5IGlmIHdlIGtub3cgdGhlIGxheWVyaW5nIGRlcHRoCisgICAgICAgIGlmIChtTnVtVmlkZW9UZW1wb3JhbExheWVyVG90YWwgPiAxKSB7CisgICAgICAgICAgICBpbnQzMl90IGxheWVySWQ7CisgICAgICAgICAgICBmb3IgKGxheWVySWQgPSAwOyBsYXllcklkIDwgbU51bVZpZGVvVGVtcG9yYWxMYXllclRvdGFsIC0gMTsgKytsYXllcklkKSB7CisgICAgICAgICAgICAgICAgaWYgKG1WaWRlb1RlbXBvcmFsTGF5ZXJBZ2dyZWdhdGVGcHNbbGF5ZXJJZF0gKiBtUGxheWJhY2tTcGVlZAorICAgICAgICAgICAgICAgICAgICAgICAgPj0ga0Rpc3BsYXlSZWZyZXNoaW5nUmF0ZSAqIDAuOSkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtTnVtVmlkZW9UZW1wb3JhbExheWVyQWxsb3dlZCA9IGxheWVySWQgKyAxOworICAgICAgICAgICAgZGVjb2RlRnJhbWVSYXRlID0gbVZpZGVvVGVtcG9yYWxMYXllckFnZ3JlZ2F0ZUZwc1tsYXllcklkXTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigib25TZXRQYXJhbWV0ZXJzOiBhbGxvd2VkIGxheWVycz0lZCwgZGVjb2RlRnBzPSVnIiwKKyAgICAgICAgICAgICAgICBtTnVtVmlkZW9UZW1wb3JhbExheWVyQWxsb3dlZCwgZGVjb2RlRnJhbWVSYXRlKTsKKworICAgICAgICBpZiAobUNvZGVjID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dXKCJvblNldFBhcmFtZXRlcnMgY2FsbGVkIGJlZm9yZSBjb2RlYyBpcyBjcmVhdGVkLiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgc3A8QU1lZGlhRm9ybWF0V3JhcHBlcj4gY29kZWNQYXJhbXMgPSBuZXcgQU1lZGlhRm9ybWF0V3JhcHBlcigpOworICAgICAgICBjb2RlY1BhcmFtcy0+c2V0RmxvYXQoIm9wZXJhdGluZy1yYXRlIiwgZGVjb2RlRnJhbWVSYXRlICogbVBsYXliYWNrU3BlZWQpOworICAgICAgICBtQ29kZWMtPnNldFBhcmFtZXRlcnMoY29kZWNQYXJhbXMpOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjI6OkRlY29kZXI6Om9uU2V0UmVuZGVyZXIoY29uc3Qgc3A8UmVuZGVyZXI+ICZyZW5kZXJlcikgeworICAgIG1SZW5kZXJlciA9IHJlbmRlcmVyOworfQorCit2b2lkIE51UGxheWVyMjo6RGVjb2Rlcjo6b25SZXN1bWUoYm9vbCBub3RpZnlDb21wbGV0ZSkgeworICAgIG1QYXVzZWQgPSBmYWxzZTsKKworICAgIGlmIChub3RpZnlDb21wbGV0ZSkgeworICAgICAgICBtUmVzdW1lUGVuZGluZyA9IHRydWU7CisgICAgfQorCisgICAgaWYgKG1Db2RlYyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJbJXNdIG9uUmVzdW1lIHdpdGhvdXQgYSB2YWxpZCBjb2RlYyIsIG1Db21wb25lbnROYW1lLmNfc3RyKCkpOworICAgICAgICBoYW5kbGVFcnJvcihOT19JTklUKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtQ29kZWMtPnN0YXJ0KCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpEZWNvZGVyOjpkb0ZsdXNoKGJvb2wgbm90aWZ5Q29tcGxldGUpIHsKKyAgICBpZiAobUNDRGVjb2RlciAhPSBOVUxMKSB7CisgICAgICAgIG1DQ0RlY29kZXItPmZsdXNoKCk7CisgICAgfQorCisgICAgaWYgKG1SZW5kZXJlciAhPSBOVUxMKSB7CisgICAgICAgIG1SZW5kZXJlci0+Zmx1c2gobUlzQXVkaW8sIG5vdGlmeUNvbXBsZXRlKTsKKyAgICAgICAgbVJlbmRlcmVyLT5zaWduYWxUaW1lRGlzY29udGludWl0eSgpOworICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IE9LOworICAgIGlmIChtQ29kZWMgIT0gTlVMTCkgeworICAgICAgICBlcnIgPSBtQ29kZWMtPmZsdXNoKCk7CisgICAgICAgIG1DU0RzVG9TdWJtaXQgPSBtQ1NEc0ZvckN1cnJlbnRGb3JtYXQ7IC8vIGNvcHkgb3BlcmF0b3IKKyAgICAgICAgKyttQnVmZmVyR2VuZXJhdGlvbjsKKyAgICB9CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gZmx1c2ggWyVzXSAoZXJyPSVkKSIsIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGVycik7CisgICAgICAgIGhhbmRsZUVycm9yKGVycik7CisgICAgICAgIC8vIGZpbmlzaCB3aXRoIHBvc3Rpbmcga1doYXRGbHVzaENvbXBsZXRlZC4KKyAgICAgICAgLy8gd2UgYXR0ZW1wdCB0byByZWxlYXNlIHRoZSBidWZmZXJzIGV2ZW4gaWYgZmx1c2ggZmFpbHMuCisgICAgfQorICAgIHJlbGVhc2VBbmRSZXNldE1lZGlhQnVmZmVycygpOworICAgIG1QYXVzZWQgPSB0cnVlOworfQorCisKK3ZvaWQgTnVQbGF5ZXIyOjpEZWNvZGVyOjpvbkZsdXNoKCkgeworICAgIGRvRmx1c2godHJ1ZSk7CisKKyAgICBpZiAoaXNEaXNjb250aW51aXR5UGVuZGluZygpKSB7CisgICAgICAgIC8vIFRoaXMgY291bGQgaGFwcGVuIGlmIHRoZSBjbGllbnQgc3RhcnRzIHNlZWtpbmcvc2h1dGRvd24KKyAgICAgICAgLy8gYWZ0ZXIgd2UgcXVldWVkIGFuIEVPUyBmb3IgZGlzY29udGludWl0aWVzLgorICAgICAgICAvLyBXZSBjYW4gY29uc2lkZXIgZGlzY29udGludWl0eSBoYW5kbGVkLgorICAgICAgICBmaW5pc2hIYW5kbGVEaXNjb250aW51aXR5KGZhbHNlIC8qIGZsdXNoT25UaW1lQ2hhbmdlICovKTsKKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0Rmx1c2hDb21wbGV0ZWQpOworICAgIG5vdGlmeS0+cG9zdCgpOworfQorCit2b2lkIE51UGxheWVyMjo6RGVjb2Rlcjo6b25TaHV0ZG93bihib29sIG5vdGlmeUNvbXBsZXRlKSB7CisgICAgc3RhdHVzX3QgZXJyID0gT0s7CisKKyAgICAvLyBpZiB0aGVyZSBpcyBhIHBlbmRpbmcgcmVzdW1lIHJlcXVlc3QsIG5vdGlmeSBjb21wbGV0ZSBub3cKKyAgICBub3RpZnlSZXN1bWVDb21wbGV0ZUlmTmVjZXNzYXJ5KCk7CisKKyAgICBpZiAobUNvZGVjICE9IE5VTEwpIHsKKyAgICAgICAgZXJyID0gbUNvZGVjLT5yZWxlYXNlKCk7CisgICAgICAgIG1Db2RlYyA9IE5VTEw7CisgICAgICAgICsrbUJ1ZmZlckdlbmVyYXRpb247CisKKyAgICAgICAgaWYgKG1OYXRpdmVXaW5kb3cgIT0gTlVMTCAmJiBtTmF0aXZlV2luZG93LT5nZXRBTmF0aXZlV2luZG93KCkgIT0gTlVMTCkgeworICAgICAgICAgICAgLy8gcmVjb25uZWN0IHRvIHN1cmZhY2UgYXMgTWVkaWFDb2RlYyBkaXNjb25uZWN0ZWQgZnJvbSBpdAorICAgICAgICAgICAgc3RhdHVzX3QgZXJyb3IgPSBuYXRpdmVXaW5kb3dDb25uZWN0KG1OYXRpdmVXaW5kb3ctPmdldEFOYXRpdmVXaW5kb3coKSwgIm9uU2h1dGRvd24iKTsKKyAgICAgICAgICAgIEFMT0dXX0lGKGVycm9yICE9IE5PX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAiWyVzXSBmYWlsZWQgdG8gY29ubmVjdCB0byBuYXRpdmUgd2luZG93LCBlcnJvcj0lZCIsCisgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGVycm9yKTsKKyAgICAgICAgfQorICAgICAgICBtQ29tcG9uZW50TmFtZSA9ICJkZWNvZGVyIjsKKyAgICB9CisKKyAgICByZWxlYXNlQW5kUmVzZXRNZWRpYUJ1ZmZlcnMoKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoImZhaWxlZCB0byByZWxlYXNlIFslc10gKGVycj0lZCkiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBlcnIpOworICAgICAgICBoYW5kbGVFcnJvcihlcnIpOworICAgICAgICAvLyBmaW5pc2ggd2l0aCBwb3N0aW5nIGtXaGF0U2h1dGRvd25Db21wbGV0ZWQuCisgICAgfQorCisgICAgaWYgKG5vdGlmeUNvbXBsZXRlKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0U2h1dGRvd25Db21wbGV0ZWQpOworICAgICAgICBub3RpZnktPnBvc3QoKTsKKyAgICAgICAgbVBhdXNlZCA9IHRydWU7CisgICAgfQorfQorCisvKgorICogcmV0dXJucyB0cnVlIGlmIHdlIHNob3VsZCByZXF1ZXN0IG1vcmUgZGF0YQorICovCitib29sIE51UGxheWVyMjo6RGVjb2Rlcjo6ZG9SZXF1ZXN0QnVmZmVycygpIHsKKyAgICBpZiAoaXNEaXNjb250aW51aXR5UGVuZGluZygpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgc3RhdHVzX3QgZXJyID0gT0s7CisgICAgd2hpbGUgKGVyciA9PSBPSyAmJiAhbURlcXVldWVkSW5wdXRCdWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgc2l6ZV90IGJ1ZmZlckl4ID0gKm1EZXF1ZXVlZElucHV0QnVmZmVycy5iZWdpbigpOworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKCk7CisgICAgICAgIG1zZy0+c2V0U2l6ZSgiYnVmZmVyLWl4IiwgYnVmZmVySXgpOworICAgICAgICBlcnIgPSBmZXRjaElucHV0RGF0YShtc2cpOworICAgICAgICBpZiAoZXJyICE9IE9LICYmIGVyciAhPSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgICAgICAvLyBpZiBFT1MsIG5lZWQgdG8gcXVldWUgRU9TIGJ1ZmZlcgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgbURlcXVldWVkSW5wdXRCdWZmZXJzLmVyYXNlKG1EZXF1ZXVlZElucHV0QnVmZmVycy5iZWdpbigpKTsKKworICAgICAgICBpZiAoIW1QZW5kaW5nSW5wdXRNZXNzYWdlcy5lbXB0eSgpCisgICAgICAgICAgICAgICAgfHwgIW9uSW5wdXRCdWZmZXJGZXRjaGVkKG1zZykpIHsKKyAgICAgICAgICAgIG1QZW5kaW5nSW5wdXRNZXNzYWdlcy5wdXNoX2JhY2sobXNnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBlcnIgPT0gLUVXT1VMREJMT0NLCisgICAgICAgICAgICAmJiBtU291cmNlLT5mZWVkTW9yZVRTRGF0YSgpID09IE9LOworfQorCit2b2lkIE51UGxheWVyMjo6RGVjb2Rlcjo6aGFuZGxlRXJyb3IoaW50MzJfdCBlcnIpCit7CisgICAgLy8gV2UgY2Fubm90IGltbWVkaWF0ZWx5IHJlbGVhc2UgdGhlIGNvZGVjIGR1ZSB0byBidWZmZXJzIHN0aWxsIG91dHN0YW5kaW5nCisgICAgLy8gaW4gdGhlIHJlbmRlcmVyLiAgV2Ugc2lnbmFsIHRvIHRoZSBwbGF5ZXIgdGhlIGVycm9yIHNvIGl0IGNhbiBzaHV0ZG93bi9yZWxlYXNlIHRoZQorICAgIC8vIGRlY29kZXIgYWZ0ZXIgZmx1c2hpbmcgYW5kIGluY3JlbWVudCB0aGUgZ2VuZXJhdGlvbiB0byBkaXNjYXJkIHVubmVjZXNzYXJ5IG1lc3NhZ2VzLgorCisgICAgKyttQnVmZmVyR2VuZXJhdGlvbjsKKworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRFcnJvcik7CisgICAgbm90aWZ5LT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKKyAgICBub3RpZnktPnBvc3QoKTsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpEZWNvZGVyOjpyZWxlYXNlQ3J5cHRvKCkKK3sKKyAgICBBTE9HVigicmVsZWFzZUNyeXB0byIpOworCisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdERybVJlbGVhc2VDcnlwdG8sIHRoaXMpOworCisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKKyAgICBpZiAoc3RhdHVzID09IE9LICYmIHJlc3BvbnNlICE9IE5VTEwpIHsKKyAgICAgICAgQ0hFQ0socmVzcG9uc2UtPmZpbmRJbnQzMigic3RhdHVzIiwgJnN0YXR1cykpOworICAgICAgICBBTE9HVigicmVsZWFzZUNyeXB0byByZXQ6ICVkICIsIHN0YXR1cyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoInJlbGVhc2VDcnlwdG8gZXJyOiAlZCIsIHN0YXR1cyk7CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsKK30KKwordm9pZCBOdVBsYXllcjI6OkRlY29kZXI6Om9uUmVsZWFzZUNyeXB0byhjb25zdCBzcDxBTWVzc2FnZT4mIG1zZykKK3sKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICBpZiAobUNvZGVjICE9IE5VTEwpIHsKKyAgICAgICAgc3RhdHVzID0gbUNvZGVjLT5yZWxlYXNlQ3J5cHRvKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gcmV0dXJuaW5nIE9LIGlmIHRoZSBjb2RlYyBoYXMgYmVlbiBhbHJlYWR5IHJlbGVhc2VkCisgICAgICAgIHN0YXR1cyA9IE9LOworICAgICAgICBBTE9HRSgib25SZWxlYXNlQ3J5cHRvIE5vIG1Db2RlYy4gZXJyOiAlZCIsIHN0YXR1cyk7CisgICAgfQorCisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOworICAgIHJlc3BvbnNlLT5zZXRJbnQzMigic3RhdHVzIiwgc3RhdHVzKTsKKyAgICAvLyBDbGVhcmluZyB0aGUgc3RhdGUgYXMgaXQncyB0aWVkIHRvIGNyeXB0by4gbUlzRW5jcnlwdGVkT2JzZXJ2ZWRFYXJsaWVyIGlzIHN0aWNreSB0aG91Z2gKKyAgICAvLyBhbmQgbGFzdHMgZm9yIHRoZSBsaWZldGltZSBvZiB0aGlzIGNvZGVjLiBTZWUgaXRzIHVzZSBpbiBmZXRjaElucHV0RGF0YS4KKyAgICBtSXNFbmNyeXB0ZWQgPSBmYWxzZTsKKworICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOworICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKKyAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworfQorCitib29sIE51UGxheWVyMjo6RGVjb2Rlcjo6aGFuZGxlQW5JbnB1dEJ1ZmZlcihzaXplX3QgaW5kZXgpIHsKKyAgICBpZiAoaXNEaXNjb250aW51aXR5UGVuZGluZygpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAobUNvZGVjID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIlslc10gaGFuZGxlQW5JbnB1dEJ1ZmZlciB3aXRob3V0IGEgdmFsaWQgY29kZWMiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKKyAgICAgICAgaGFuZGxlRXJyb3IoTk9fSU5JVCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzaXplX3QgYnVmZmVyU2l6ZSA9IDA7CisgICAgdWludDhfdCAqYnVmZmVyQmFzZSA9IG1Db2RlYy0+Z2V0SW5wdXRCdWZmZXIoaW5kZXgsICZidWZmZXJTaXplKTsKKworICAgIGlmIChidWZmZXJCYXNlID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIlslc10gaGFuZGxlQW5JbnB1dEJ1ZmZlciwgZmFpbGVkIHRvIGdldCBpbnB1dCBidWZmZXIiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKKyAgICAgICAgaGFuZGxlRXJyb3IoVU5LTk9XTl9FUlJPUik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBidWZmZXIgPQorICAgICAgICBuZXcgTWVkaWFDb2RlY0J1ZmZlcihOVUxMIC8qIGZvcm1hdCAqLywgbmV3IEFCdWZmZXIoYnVmZmVyQmFzZSwgYnVmZmVyU2l6ZSkpOworCisgICAgaWYgKGluZGV4ID49IG1JbnB1dEJ1ZmZlcnMuc2l6ZSgpKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSBtSW5wdXRCdWZmZXJzLnNpemUoKTsgaSA8PSBpbmRleDsgKytpKSB7CisgICAgICAgICAgICBtSW5wdXRCdWZmZXJzLmFkZCgpOworICAgICAgICAgICAgbU1lZGlhQnVmZmVycy5hZGQoKTsKKyAgICAgICAgICAgIG1JbnB1dEJ1ZmZlcklzRGVxdWV1ZWQuYWRkKCk7CisgICAgICAgICAgICBtTWVkaWFCdWZmZXJzLmVkaXRJdGVtQXQoaSkgPSBOVUxMOworICAgICAgICAgICAgbUlucHV0QnVmZmVySXNEZXF1ZXVlZC5lZGl0SXRlbUF0KGkpID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgbUlucHV0QnVmZmVycy5lZGl0SXRlbUF0KGluZGV4KSA9IGJ1ZmZlcjsKKworICAgIC8vQ0hFQ0tfTFQoYnVmZmVySXgsIG1JbnB1dEJ1ZmZlcnMuc2l6ZSgpKTsKKworICAgIGlmIChtTWVkaWFCdWZmZXJzW2luZGV4XSAhPSBOVUxMKSB7CisgICAgICAgIG1NZWRpYUJ1ZmZlcnNbaW5kZXhdLT5yZWxlYXNlKCk7CisgICAgICAgIG1NZWRpYUJ1ZmZlcnMuZWRpdEl0ZW1BdChpbmRleCkgPSBOVUxMOworICAgIH0KKyAgICBtSW5wdXRCdWZmZXJJc0RlcXVldWVkLmVkaXRJdGVtQXQoaW5kZXgpID0gdHJ1ZTsKKworICAgIGlmICghbUNTRHNUb1N1Ym1pdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZSgpOworICAgICAgICBtc2ctPnNldFNpemUoImJ1ZmZlci1peCIsIGluZGV4KTsKKworICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBtQ1NEc1RvU3VibWl0Lml0ZW1BdCgwKTsKKyAgICAgICAgQUxPR0koIlslc10gcmVzdWJtaXR0aW5nIENTRCIsIG1Db21wb25lbnROYW1lLmNfc3RyKCkpOworICAgICAgICBtc2ctPnNldEJ1ZmZlcigiYnVmZmVyIiwgYnVmZmVyKTsKKyAgICAgICAgbUNTRHNUb1N1Ym1pdC5yZW1vdmVBdCgwKTsKKyAgICAgICAgaWYgKCFvbklucHV0QnVmZmVyRmV0Y2hlZChtc2cpKSB7CisgICAgICAgICAgICBoYW5kbGVFcnJvcihVTktOT1dOX0VSUk9SKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICB3aGlsZSAoIW1QZW5kaW5nSW5wdXRNZXNzYWdlcy5lbXB0eSgpKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSAqbVBlbmRpbmdJbnB1dE1lc3NhZ2VzLmJlZ2luKCk7CisgICAgICAgIGlmICghb25JbnB1dEJ1ZmZlckZldGNoZWQobXNnKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgbVBlbmRpbmdJbnB1dE1lc3NhZ2VzLmVyYXNlKG1QZW5kaW5nSW5wdXRNZXNzYWdlcy5iZWdpbigpKTsKKyAgICB9CisKKyAgICBpZiAoIW1JbnB1dEJ1ZmZlcklzRGVxdWV1ZWQuZWRpdEl0ZW1BdChpbmRleCkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgbURlcXVldWVkSW5wdXRCdWZmZXJzLnB1c2hfYmFjayhpbmRleCk7CisKKyAgICBvblJlcXVlc3RJbnB1dEJ1ZmZlcnMoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBOdVBsYXllcjI6OkRlY29kZXI6OmhhbmRsZUFuT3V0cHV0QnVmZmVyKAorICAgICAgICBzaXplX3QgaW5kZXgsCisgICAgICAgIHNpemVfdCBvZmZzZXQsCisgICAgICAgIHNpemVfdCBzaXplLAorICAgICAgICBpbnQ2NF90IHRpbWVVcywKKyAgICAgICAgaW50MzJfdCBmbGFncykgeworICAgIGlmIChtQ29kZWMgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiWyVzXSBoYW5kbGVBbk91dHB1dEJ1ZmZlciB3aXRob3V0IGEgdmFsaWQgY29kZWMiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKKyAgICAgICAgaGFuZGxlRXJyb3IoTk9fSU5JVCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKy8vICAgIENIRUNLX0xUKGJ1ZmZlckl4LCBtT3V0cHV0QnVmZmVycy5zaXplKCkpOworCisgICAgc2l6ZV90IGJ1ZmZlclNpemUgPSAwOworICAgIHVpbnQ4X3QgKmJ1ZmZlckJhc2UgPSBtQ29kZWMtPmdldE91dHB1dEJ1ZmZlcihpbmRleCwgJmJ1ZmZlclNpemUpOworCisgICAgaWYgKGJ1ZmZlckJhc2UgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiWyVzXSBoYW5kbGVBbk91dHB1dEJ1ZmZlciwgZmFpbGVkIHRvIGdldCBvdXRwdXQgYnVmZmVyIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CisgICAgICAgIGhhbmRsZUVycm9yKFVOS05PV05fRVJST1IpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gYnVmZmVyID0KKyAgICAgICAgbmV3IE1lZGlhQ29kZWNCdWZmZXIoTlVMTCAvKiBmb3JtYXQgKi8sIG5ldyBBQnVmZmVyKGJ1ZmZlckJhc2UsIGJ1ZmZlclNpemUpKTsKKworICAgIGlmIChpbmRleCA+PSBtT3V0cHV0QnVmZmVycy5zaXplKCkpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IG1PdXRwdXRCdWZmZXJzLnNpemUoKTsgaSA8PSBpbmRleDsgKytpKSB7CisgICAgICAgICAgICBtT3V0cHV0QnVmZmVycy5hZGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1PdXRwdXRCdWZmZXJzLmVkaXRJdGVtQXQoaW5kZXgpID0gYnVmZmVyOworCisgICAgYnVmZmVyLT5zZXRSYW5nZShvZmZzZXQsIHNpemUpOworICAgIGJ1ZmZlci0+bWV0YSgpLT5jbGVhcigpOworICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKKworICAgIGJvb2wgZW9zID0gZmxhZ3MgJiBBTUVESUFDT0RFQ19CVUZGRVJfRkxBR19FTkRfT0ZfU1RSRUFNOworICAgIC8vIHdlIGRvIG5vdCBleHBlY3QgQ09ERUNDT05GSUcgb3IgU1lOQ0ZSQU1FIGZvciBkZWNvZGVyCisKKyAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZW5kZXJCdWZmZXIsIHRoaXMpOworICAgIHJlcGx5LT5zZXRTaXplKCJidWZmZXItaXgiLCBpbmRleCk7CisgICAgcmVwbHktPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUJ1ZmZlckdlbmVyYXRpb24pOworCisgICAgaWYgKGVvcykgeworICAgICAgICBBTE9HSSgiWyVzXSBzYXcgb3V0cHV0IEVPUyIsIG1Jc0F1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIpOworCisgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQzMigiZW9zIiwgdHJ1ZSk7CisgICAgICAgIHJlcGx5LT5zZXRJbnQzMigiZW9zIiwgdHJ1ZSk7CisgICAgfQorCisgICAgbU51bUZyYW1lc1RvdGFsICs9ICFtSXNBdWRpbzsKKworICAgIGlmIChtU2tpcFJlbmRlcmluZ1VudGlsTWVkaWFUaW1lVXMgPj0gMCkgeworICAgICAgICBpZiAodGltZVVzIDwgbVNraXBSZW5kZXJpbmdVbnRpbE1lZGlhVGltZVVzKSB7CisgICAgICAgICAgICBBTE9HVigiWyVzXSBkcm9wcGluZyBidWZmZXIgYXQgdGltZSAlbGxkIGFzIHJlcXVlc3RlZC4iLAorICAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgKGxvbmcgbG9uZyl0aW1lVXMpOworCisgICAgICAgICAgICByZXBseS0+cG9zdCgpOworICAgICAgICAgICAgaWYgKGVvcykgeworICAgICAgICAgICAgICAgIG5vdGlmeVJlc3VtZUNvbXBsZXRlSWZOZWNlc3NhcnkoKTsKKyAgICAgICAgICAgICAgICBpZiAobVJlbmRlcmVyICE9IE5VTEwgJiYgIWlzRGlzY29udGludWl0eVBlbmRpbmcoKSkgeworICAgICAgICAgICAgICAgICAgICBtUmVuZGVyZXItPnF1ZXVlRU9TKG1Jc0F1ZGlvLCBFUlJPUl9FTkRfT0ZfU1RSRUFNKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIG1Ta2lwUmVuZGVyaW5nVW50aWxNZWRpYVRpbWVVcyA9IC0xOworICAgIH0KKworICAgIC8vIHdhaXQgdW50aWwgMXN0IGZyYW1lIGNvbWVzIG91dCB0byBzaWduYWwgcmVzdW1lIGNvbXBsZXRlCisgICAgbm90aWZ5UmVzdW1lQ29tcGxldGVJZk5lY2Vzc2FyeSgpOworCisgICAgaWYgKG1SZW5kZXJlciAhPSBOVUxMKSB7CisgICAgICAgIC8vIHNlbmQgdGhlIGJ1ZmZlciB0byByZW5kZXJlci4KKyAgICAgICAgbVJlbmRlcmVyLT5xdWV1ZUJ1ZmZlcihtSXNBdWRpbywgYnVmZmVyLCByZXBseSk7CisgICAgICAgIGlmIChlb3MgJiYgIWlzRGlzY29udGludWl0eVBlbmRpbmcoKSkgeworICAgICAgICAgICAgbVJlbmRlcmVyLT5xdWV1ZUVPUyhtSXNBdWRpbywgRVJST1JfRU5EX09GX1NUUkVBTSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBOdVBsYXllcjI6OkRlY29kZXI6OmhhbmRsZU91dHB1dEZvcm1hdENoYW5nZShjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkgeworICAgIGlmICghbUlzQXVkaW8pIHsKKyAgICAgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OworICAgICAgICBpZiAoZm9ybWF0LT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKQorICAgICAgICAgICAgICAgICYmIGZvcm1hdC0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSkgeworICAgICAgICAgICAgbVN0YXRzLT5zZXRJbnQzMigid2lkdGgiLCB3aWR0aCk7CisgICAgICAgICAgICBtU3RhdHMtPnNldEludDMyKCJoZWlnaHQiLCBoZWlnaHQpOworICAgICAgICB9CisgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0VmlkZW9TaXplQ2hhbmdlZCk7CisgICAgICAgIG5vdGlmeS0+c2V0TWVzc2FnZSgiZm9ybWF0IiwgZm9ybWF0KTsKKyAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgfSBlbHNlIGlmIChtUmVuZGVyZXIgIT0gTlVMTCkgeworICAgICAgICB1aW50MzJfdCBmbGFnczsKKyAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzOworICAgICAgICBib29sIGhhc1ZpZGVvID0gKG1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKiBhdWRpbyAqLykgIT0gTlVMTCk7CisgICAgICAgIGlmIChnZXRBdWRpb0RlZXBCdWZmZXJTZXR0aW5nKCkgLy8gb3ZlcnJpZGUgcmVnYXJkbGVzcyBvZiBzb3VyY2UgZHVyYXRpb24KKyAgICAgICAgICAgICAgICB8fCAobVNvdXJjZS0+Z2V0RHVyYXRpb24oJmR1cmF0aW9uVXMpID09IE9LCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBkdXJhdGlvblVzID4gQVVESU9fU0lOS19NSU5fREVFUF9CVUZGRVJfRFVSQVRJT05fVVMpKSB7CisgICAgICAgICAgICBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX0RFRVBfQlVGRkVSOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FOworICAgICAgICB9CisKKyAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKGtXaGF0QXVkaW9PdXRwdXRGb3JtYXRDaGFuZ2VkLCB0aGlzKTsKKyAgICAgICAgcmVwbHktPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUJ1ZmZlckdlbmVyYXRpb24pOworICAgICAgICBtUmVuZGVyZXItPmNoYW5nZUF1ZGlvRm9ybWF0KAorICAgICAgICAgICAgICAgIGZvcm1hdCwgZmFsc2UgLyogb2ZmbG9hZE9ubHkgKi8sIGhhc1ZpZGVvLAorICAgICAgICAgICAgICAgIGZsYWdzLCBtU291cmNlLT5pc1N0cmVhbWluZygpLCByZXBseSk7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyMjo6RGVjb2Rlcjo6cmVsZWFzZUFuZFJlc2V0TWVkaWFCdWZmZXJzKCkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1lZGlhQnVmZmVycy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAobU1lZGlhQnVmZmVyc1tpXSAhPSBOVUxMKSB7CisgICAgICAgICAgICBtTWVkaWFCdWZmZXJzW2ldLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBtTWVkaWFCdWZmZXJzLmVkaXRJdGVtQXQoaSkgPSBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIG1NZWRpYUJ1ZmZlcnMucmVzaXplKG1JbnB1dEJ1ZmZlcnMuc2l6ZSgpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1NZWRpYUJ1ZmZlcnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbU1lZGlhQnVmZmVycy5lZGl0SXRlbUF0KGkpID0gTlVMTDsKKyAgICB9CisgICAgbUlucHV0QnVmZmVySXNEZXF1ZXVlZC5jbGVhcigpOworICAgIG1JbnB1dEJ1ZmZlcklzRGVxdWV1ZWQucmVzaXplKG1JbnB1dEJ1ZmZlcnMuc2l6ZSgpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dEJ1ZmZlcklzRGVxdWV1ZWQuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbUlucHV0QnVmZmVySXNEZXF1ZXVlZC5lZGl0SXRlbUF0KGkpID0gZmFsc2U7CisgICAgfQorCisgICAgbVBlbmRpbmdJbnB1dE1lc3NhZ2VzLmNsZWFyKCk7CisgICAgbURlcXVldWVkSW5wdXRCdWZmZXJzLmNsZWFyKCk7CisgICAgbVNraXBSZW5kZXJpbmdVbnRpbE1lZGlhVGltZVVzID0gLTE7Cit9CisKK2Jvb2wgTnVQbGF5ZXIyOjpEZWNvZGVyOjppc1N0YWxlUmVwbHkoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBpbnQzMl90IGdlbmVyYXRpb247CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmZ2VuZXJhdGlvbikpOworICAgIHJldHVybiBnZW5lcmF0aW9uICE9IG1CdWZmZXJHZW5lcmF0aW9uOworfQorCitzdGF0dXNfdCBOdVBsYXllcjI6OkRlY29kZXI6OmZldGNoSW5wdXREYXRhKHNwPEFNZXNzYWdlPiAmcmVwbHkpIHsKKyAgICBzcDxBQnVmZmVyPiBhY2Nlc3NVbml0OworICAgIGJvb2wgZHJvcEFjY2Vzc1VuaXQgPSB0cnVlOworICAgIGRvIHsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbVNvdXJjZS0+ZGVxdWV1ZUFjY2Vzc1VuaXQobUlzQXVkaW8sICZhY2Nlc3NVbml0KTsKKworICAgICAgICBpZiAoZXJyID09IC1FV09VTERCTE9DSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfSBlbHNlIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gSU5GT19ESVNDT05USU5VSVRZKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCB0eXBlOworICAgICAgICAgICAgICAgIENIRUNLKGFjY2Vzc1VuaXQtPm1ldGEoKS0+ZmluZEludDMyKCJkaXNjb250aW51aXR5IiwgJnR5cGUpKTsKKworICAgICAgICAgICAgICAgIGJvb2wgZm9ybWF0Q2hhbmdlID0KKyAgICAgICAgICAgICAgICAgICAgKG1Jc0F1ZGlvICYmCisgICAgICAgICAgICAgICAgICAgICAodHlwZSAmIEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9BVURJT19GT1JNQVQpKQorICAgICAgICAgICAgICAgICAgICB8fCAoIW1Jc0F1ZGlvICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHR5cGUgJiBBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfVklERU9fRk9STUFUKSk7CisKKyAgICAgICAgICAgICAgICBib29sIHRpbWVDaGFuZ2UgPSAodHlwZSAmIEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9USU1FKSAhPSAwOworCisgICAgICAgICAgICAgICAgQUxPR0koIiVzIGRpc2NvbnRpbnVpdHkgKGZvcm1hdD0lZCwgdGltZT0lZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgbUlzQXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIiwgZm9ybWF0Q2hhbmdlLCB0aW1lQ2hhbmdlKTsKKworICAgICAgICAgICAgICAgIGJvb2wgc2VhbWxlc3NGb3JtYXRDaGFuZ2UgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbmV3Rm9ybWF0ID0gbVNvdXJjZS0+Z2V0Rm9ybWF0KG1Jc0F1ZGlvKTsKKyAgICAgICAgICAgICAgICBpZiAoZm9ybWF0Q2hhbmdlKSB7CisgICAgICAgICAgICAgICAgICAgIHNlYW1sZXNzRm9ybWF0Q2hhbmdlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRzU2VhbWxlc3NGb3JtYXRDaGFuZ2UobmV3Rm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgLy8gdHJlYXQgc2VhbWxlc3MgZm9ybWF0IGNoYW5nZSBzZXBhcmF0ZWx5CisgICAgICAgICAgICAgICAgICAgIGZvcm1hdENoYW5nZSA9ICFzZWFtbGVzc0Zvcm1hdENoYW5nZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBGb3IgZm9ybWF0IG9yIHRpbWUgY2hhbmdlLCByZXR1cm4gRU9TIHRvIHF1ZXVlIEVPUyBpbnB1dCwKKyAgICAgICAgICAgICAgICAvLyB0aGVuIHdhaXQgZm9yIEVPUyBvbiBvdXRwdXQuCisgICAgICAgICAgICAgICAgaWYgKGZvcm1hdENoYW5nZSAvKiBub3Qgc2VhbWxlc3MgKi8pIHsKKyAgICAgICAgICAgICAgICAgICAgbUZvcm1hdENoYW5nZVBlbmRpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBlcnIgPSBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGltZUNoYW5nZSkgeworICAgICAgICAgICAgICAgICAgICByZW1lbWJlckNvZGVjU3BlY2lmaWNEYXRhKG5ld0Zvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgIG1UaW1lQ2hhbmdlUGVuZGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZWFtbGVzc0Zvcm1hdENoYW5nZSkgeworICAgICAgICAgICAgICAgICAgICAvLyByZXVzZSBleGlzdGluZyBkZWNvZGVyIGFuZCBkb24ndCBmbHVzaAorICAgICAgICAgICAgICAgICAgICByZW1lbWJlckNvZGVjU3BlY2lmaWNEYXRhKG5ld0Zvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgc3RyZWFtIGlzIHVuYWZmZWN0ZWQgYnkgdGhlIGRpc2NvbnRpbnVpdHkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FV09VTERCTE9DSzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHJlcGx5IHNob3VsZCBvbmx5IGJlIHJldHVybmVkIHdpdGhvdXQgYSBidWZmZXIgc2V0CisgICAgICAgICAgICAvLyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIChpbmNsdWRpbmcgRU9TKQorICAgICAgICAgICAgQ0hFQ0soZXJyICE9IE9LKTsKKworICAgICAgICAgICAgcmVwbHktPnNldEludDMyKCJlcnIiLCBlcnIpOworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgIH0KKworICAgICAgICBkcm9wQWNjZXNzVW5pdCA9IGZhbHNlOworICAgICAgICBpZiAoIW1Jc0F1ZGlvICYmICFtSXNFbmNyeXB0ZWQpIHsKKyAgICAgICAgICAgIC8vIEV4dHJhIHNhZmVndWFyZCBpZiBoaWdoZXItbGV2ZWwgYmVoYXZpb3IgY2hhbmdlcy4gT3RoZXJ3aXNlLCBub3QgcmVxdWlyZWQgbm93LgorICAgICAgICAgICAgLy8gUHJldmVudGluZyB0aGUgYnVmZmVyIGZyb20gYmVpbmcgcHJvY2Vzc2VkIChhbmQgc2VudCB0byBjb2RlYykgaWYgdGhpcyBpcyBhIGxhdGVyCisgICAgICAgICAgICAvLyByb3VuZCBvZiBwbGF5YmFjayBidXQgdGhpcyB0aW1lIHdpdGhvdXQgcHJlcGFyZURybS4gT3IgaWYgdGhlcmUgaXMgYSByYWNlIGJldHdlZW4KKyAgICAgICAgICAgIC8vIHN0b3AgKHdoaWNoIGlzIG5vdCBibG9ja2luZykgYW5kIHJlbGVhc2VEcm0gYWxsb3dpbmcgYnVmZmVycyBiZWluZyBwcm9jZXNzZWQgYWZ0ZXIKKyAgICAgICAgICAgIC8vIENyeXB0byBoYXMgYmVlbiByZWxlYXNlZCAoR2VuZXJpY1NvdXJjZSBjdXJyZW50bHkgcHJldmVudHMgdGhpcyByYWNlIHRob3VnaCkuCisgICAgICAgICAgICAvLyBQYXJ0aWN1bGFybHkgZG9pbmcgdGhpcyBjaGVjayBiZWZvcmUgSXNBVkNSZWZlcmVuY2VGcmFtZSBjYWxsIHRvIHByZXZlbnQgcGFyc2luZworICAgICAgICAgICAgLy8gb2YgZW5jcnlwdGVkIGRhdGEuCisgICAgICAgICAgICBpZiAobUlzRW5jcnlwdGVkT2JzZXJ2ZWRFYXJsaWVyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImZldGNoSW5wdXREYXRhOiBtaXNtYXRjaGVkIG1Jc0VuY3J5cHRlZC9tSXNFbmNyeXB0ZWRPYnNlcnZlZEVhcmxpZXIgKDAvMSkiKTsKKworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50MzJfdCBsYXllcklkID0gMDsKKyAgICAgICAgICAgIGJvb2wgaGF2ZUxheWVySWQgPSBhY2Nlc3NVbml0LT5tZXRhKCktPmZpbmRJbnQzMigidGVtcG9yYWwtbGF5ZXItaWQiLCAmbGF5ZXJJZCk7CisgICAgICAgICAgICBpZiAobVJlbmRlcmVyLT5nZXRWaWRlb0xhdGVCeVVzKCkgPiAxMDAwMDBsbAorICAgICAgICAgICAgICAgICAgICAmJiBtSXNWaWRlb0FWQworICAgICAgICAgICAgICAgICAgICAmJiAhSXNBVkNSZWZlcmVuY2VGcmFtZShhY2Nlc3NVbml0KSkgeworICAgICAgICAgICAgICAgIGRyb3BBY2Nlc3NVbml0ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaGF2ZUxheWVySWQgJiYgbU51bVZpZGVvVGVtcG9yYWxMYXllclRvdGFsID4gMSkgeworICAgICAgICAgICAgICAgIC8vIEFkZCBvbmx5IG9uZSBsYXllciBlYWNoIHRpbWUuCisgICAgICAgICAgICAgICAgaWYgKGxheWVySWQgPiBtQ3VycmVudE1heFZpZGVvVGVtcG9yYWxMYXllcklkICsgMQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgbGF5ZXJJZCA+PSBtTnVtVmlkZW9UZW1wb3JhbExheWVyQWxsb3dlZCkgeworICAgICAgICAgICAgICAgICAgICBkcm9wQWNjZXNzVW5pdCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJkcm9wcGluZyBsYXllciglZCksIHNwZWVkPSVnLCBhbGxvd2VkIGxheWVyIGNvdW50PSVkLCBtYXggbGF5ZXJJZD0lZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJJZCwgbVBsYXliYWNrU3BlZWQsIG1OdW1WaWRlb1RlbXBvcmFsTGF5ZXJBbGxvd2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50TWF4VmlkZW9UZW1wb3JhbExheWVySWQpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGF5ZXJJZCA+IG1DdXJyZW50TWF4VmlkZW9UZW1wb3JhbExheWVySWQpIHsKKyAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRNYXhWaWRlb1RlbXBvcmFsTGF5ZXJJZCA9IGxheWVySWQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsYXllcklkID09IDAgJiYgbU51bVZpZGVvVGVtcG9yYWxMYXllclRvdGFsID4gMQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgSXNJRFIoYWNjZXNzVW5pdC0+ZGF0YSgpLCBhY2Nlc3NVbml0LT5zaXplKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50TWF4VmlkZW9UZW1wb3JhbExheWVySWQgPSBtTnVtVmlkZW9UZW1wb3JhbExheWVyVG90YWwgLSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChkcm9wQWNjZXNzVW5pdCkgeworICAgICAgICAgICAgICAgIGlmIChsYXllcklkIDw9IG1DdXJyZW50TWF4VmlkZW9UZW1wb3JhbExheWVySWQgJiYgbGF5ZXJJZCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRNYXhWaWRlb1RlbXBvcmFsTGF5ZXJJZCA9IGxheWVySWQgLSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICArK21OdW1JbnB1dEZyYW1lc0Ryb3BwZWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChkcm9wQWNjZXNzVW5pdCk7CisKKyAgICAvLyBBTE9HVigicmV0dXJuZWQgYSB2YWxpZCBidWZmZXIgb2YgJXMgZGF0YSIsIG1Jc0F1ZGlvID8gIm1Jc0F1ZGlvIiA6ICJ2aWRlbyIpOworI2lmIDAKKyAgICBpbnQ2NF90IG1lZGlhVGltZVVzOworICAgIENIRUNLKGFjY2Vzc1VuaXQtPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmbWVkaWFUaW1lVXMpKTsKKyAgICBBTE9HVigiWyVzXSBmZWVkaW5nIGlucHV0IGJ1ZmZlciBhdCBtZWRpYSB0aW1lICUuM2YiLAorICAgICAgICAgbUlzQXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIiwKKyAgICAgICAgIG1lZGlhVGltZVVzIC8gMUU2KTsKKyNlbmRpZgorCisgICAgaWYgKG1DQ0RlY29kZXIgIT0gTlVMTCkgeworICAgICAgICBtQ0NEZWNvZGVyLT5kZWNvZGUoYWNjZXNzVW5pdCk7CisgICAgfQorCisgICAgcmVwbHktPnNldEJ1ZmZlcigiYnVmZmVyIiwgYWNjZXNzVW5pdCk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK2Jvb2wgTnVQbGF5ZXIyOjpEZWNvZGVyOjpvbklucHV0QnVmZmVyRmV0Y2hlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIGlmIChtQ29kZWMgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiWyVzXSBvbklucHV0QnVmZmVyRmV0Y2hlZCB3aXRob3V0IGEgdmFsaWQgY29kZWMiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKKyAgICAgICAgaGFuZGxlRXJyb3IoTk9fSU5JVCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzaXplX3QgYnVmZmVySXg7CisgICAgQ0hFQ0sobXNnLT5maW5kU2l6ZSgiYnVmZmVyLWl4IiwgJmJ1ZmZlckl4KSk7CisgICAgQ0hFQ0tfTFQoYnVmZmVySXgsIG1JbnB1dEJ1ZmZlcnMuc2l6ZSgpKTsKKyAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBjb2RlY0J1ZmZlciA9IG1JbnB1dEJ1ZmZlcnNbYnVmZmVySXhdOworCisgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyOworICAgIGJvb2wgaGFzQnVmZmVyID0gbXNnLT5maW5kQnVmZmVyKCJidWZmZXIiLCAmYnVmZmVyKTsKKyAgICBib29sIG5lZWRzQ29weSA9IHRydWU7CisKKyAgICBpZiAoYnVmZmVyID09IE5VTEwgLyogaW5jbHVkZXMgIWhhc0J1ZmZlciAqLykgeworICAgICAgICBpbnQzMl90IHN0cmVhbUVyciA9IEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJlcnIiLCAmc3RyZWFtRXJyKSB8fCAhaGFzQnVmZmVyKTsKKworICAgICAgICBDSEVDSyhzdHJlYW1FcnIgIT0gT0spOworCisgICAgICAgIC8vIGF0dGVtcHQgdG8gcXVldWUgRU9TCisgICAgICAgIHN0YXR1c190IGVyciA9IG1Db2RlYy0+cXVldWVJbnB1dEJ1ZmZlcigKKyAgICAgICAgICAgICAgICBidWZmZXJJeCwKKyAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICBBTUVESUFDT0RFQ19CVUZGRVJfRkxBR19FTkRfT0ZfU1RSRUFNKTsKKyAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgbUlucHV0QnVmZmVySXNEZXF1ZXVlZC5lZGl0SXRlbUF0KGJ1ZmZlckl4KSA9IGZhbHNlOworICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbUVyciA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgICAgICBzdHJlYW1FcnIgPSBlcnI7CisgICAgICAgICAgICAvLyBlcnIgd2lsbCBub3QgYmUgRVJST1JfRU5EX09GX1NUUkVBTQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHN0cmVhbUVyciAhPSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgICAgICBBTE9HRSgiU3RyZWFtIGVycm9yIGZvciBbJXNdIChlcnI9JWQpLCBFT1MgJXMgcXVldWVkIiwKKyAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtRXJyLAorICAgICAgICAgICAgICAgICAgICBlcnIgPT0gT0sgPyAic3VjY2Vzc2Z1bGx5IiA6ICJ1bnN1Y2Nlc3NmdWxseSIpOworICAgICAgICAgICAgaGFuZGxlRXJyb3Ioc3RyZWFtRXJyKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBleHRyYTsKKyAgICAgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kTWVzc2FnZSgiZXh0cmEiLCAmZXh0cmEpICYmIGV4dHJhICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGludDY0X3QgcmVzdW1lQXRNZWRpYVRpbWVVczsKKyAgICAgICAgICAgIGlmIChleHRyYS0+ZmluZEludDY0KAorICAgICAgICAgICAgICAgICAgICAgICAgInJlc3VtZS1hdC1tZWRpYVRpbWVVcyIsICZyZXN1bWVBdE1lZGlhVGltZVVzKSkgeworICAgICAgICAgICAgICAgIEFMT0dJKCJbJXNdIHN1cHByZXNzaW5nIHJlbmRlcmluZyB1bnRpbCAlbGxkIHVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIChsb25nIGxvbmcpcmVzdW1lQXRNZWRpYVRpbWVVcyk7CisgICAgICAgICAgICAgICAgbVNraXBSZW5kZXJpbmdVbnRpbE1lZGlhVGltZVVzID0gcmVzdW1lQXRNZWRpYVRpbWVVczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGludDY0X3QgdGltZVVzID0gMDsKKyAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7CisKKyAgICAgICAgaW50MzJfdCBlb3MsIGNzZDsKKyAgICAgICAgLy8gd2UgZG8gbm90IGV4cGVjdCBTWU5DRlJBTUUgZm9yIGRlY29kZXIKKyAgICAgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImVvcyIsICZlb3MpICYmIGVvcykgeworICAgICAgICAgICAgZmxhZ3MgfD0gQU1FRElBQ09ERUNfQlVGRkVSX0ZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgfSBlbHNlIGlmIChidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJjc2QiLCAmY3NkKSAmJiBjc2QpIHsKKyAgICAgICAgICAgIGZsYWdzIHw9IEFNRURJQUNPREVDX0JVRkZFUl9GTEFHX0NPREVDX0NPTkZJRzsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE1vZHVsYXIgRFJNCisgICAgICAgIE1lZGlhQnVmZmVyICptZWRpYUJ1ZiA9IE5VTEw7CisgICAgICAgIHNwPEFNZWRpYUNvZGVjQ3J5cHRvSW5mb1dyYXBwZXI+IGNyeXB0SW5mbzsKKworICAgICAgICAvLyBjb3B5IGludG8gY29kZWMgYnVmZmVyCisgICAgICAgIGlmIChuZWVkc0NvcHkpIHsKKyAgICAgICAgICAgIGlmIChidWZmZXItPnNpemUoKSA+IGNvZGVjQnVmZmVyLT5jYXBhY2l0eSgpKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlRXJyb3IoRVJST1JfQlVGRkVSX1RPT19TTUFMTCk7CisgICAgICAgICAgICAgICAgbURlcXVldWVkSW5wdXRCdWZmZXJzLnB1c2hfYmFjayhidWZmZXJJeCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYnVmZmVyLT5kYXRhKCkgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGNvZGVjQnVmZmVyLT5zZXRSYW5nZSgwLCBidWZmZXItPnNpemUoKSk7CisgICAgICAgICAgICAgICAgbWVtY3B5KGNvZGVjQnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSk7CisgICAgICAgICAgICB9IGVsc2UgeyAvLyBObyBidWZmZXItPmRhdGEoKQorICAgICAgICAgICAgICAgIC8vTW9kdWxhciBEUk0KKyAgICAgICAgICAgICAgICBtZWRpYUJ1ZiA9IChNZWRpYUJ1ZmZlciopYnVmZmVyLT5nZXRNZWRpYUJ1ZmZlckJhc2UoKTsKKyAgICAgICAgICAgICAgICBpZiAobWVkaWFCdWYgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBjb2RlY0J1ZmZlci0+c2V0UmFuZ2UoMCwgbWVkaWFCdWYtPnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweShjb2RlY0J1ZmZlci0+ZGF0YSgpLCBtZWRpYUJ1Zi0+ZGF0YSgpLCBtZWRpYUJ1Zi0+c2l6ZSgpKTsKKworICAgICAgICAgICAgICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YV9kYXRhID0gbWVkaWFCdWYtPm1ldGFfZGF0YSgpOworICAgICAgICAgICAgICAgICAgICBjcnlwdEluZm8gPSBBTWVkaWFDb2RlY0NyeXB0b0luZm9XcmFwcGVyOjpDcmVhdGUobWV0YV9kYXRhKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSBnZXRNZWRpYUJ1ZmZlcigpIGhhcyBpbmNyZW1lbnRlZCB0aGUgcmVmQ291bnQKKyAgICAgICAgICAgICAgICAgICAgbWVkaWFCdWYtPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyBObyBtZWRpYUJ1ZgorICAgICAgICAgICAgICAgICAgICBBTE9HRSgib25JbnB1dEJ1ZmZlckZldGNoZWQ6IGJ1ZmZlci0+ZGF0YSgpL21lZGlhQnVmIGFyZSBOVUxMIGZvciAlcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmdldCgpKTsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlRXJyb3IoVU5LTk9XTl9FUlJPUik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IC8vIGJ1ZmZlci0+ZGF0YSgpCisgICAgICAgIH0gLy8gbmVlZHNDb3B5CisKKyAgICAgICAgc3RhdHVzX3QgZXJyOworICAgICAgICBpZiAoY3J5cHRJbmZvICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGVyciA9IG1Db2RlYy0+cXVldWVTZWN1cmVJbnB1dEJ1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVySXgsCisgICAgICAgICAgICAgICAgICAgIGNvZGVjQnVmZmVyLT5vZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgY3J5cHRJbmZvLAorICAgICAgICAgICAgICAgICAgICB0aW1lVXMsCisgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICAgICAgICAgIC8vIHN5bmNocm9ub3VzIGNhbGwgc28gZG9uZSB3aXRoIGNyeXB0SW5mbyBoZXJlCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlcnIgPSBtQ29kZWMtPnF1ZXVlSW5wdXRCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlckl4LAorICAgICAgICAgICAgICAgICAgICBjb2RlY0J1ZmZlci0+b2Zmc2V0KCksCisgICAgICAgICAgICAgICAgICAgIGNvZGVjQnVmZmVyLT5zaXplKCksCisgICAgICAgICAgICAgICAgICAgIHRpbWVVcywKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgICAgICB9IC8vIG5vIGNyeXB0SW5mbworCisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJvbklucHV0QnVmZmVyRmV0Y2hlZDogcXVldWUlc0lucHV0QnVmZmVyIGZhaWxlZCBmb3IgWyVzXSAoZXJyPSVkKSIsCisgICAgICAgICAgICAgICAgICAgIChjcnlwdEluZm8gIT0gTlVMTCA/ICJTZWN1cmUiIDogIiIpLAorICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBlcnIpOworICAgICAgICAgICAgaGFuZGxlRXJyb3IoZXJyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1JbnB1dEJ1ZmZlcklzRGVxdWV1ZWQuZWRpdEl0ZW1BdChidWZmZXJJeCkgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgfSAgIC8vIGJ1ZmZlciAhPSBOVUxMCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpEZWNvZGVyOjpvblJlbmRlckJ1ZmZlcihjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHN0YXR1c190IGVycjsKKyAgICBpbnQzMl90IHJlbmRlcjsKKyAgICBzaXplX3QgYnVmZmVySXg7CisgICAgaW50MzJfdCBlb3M7CisgICAgQ0hFQ0sobXNnLT5maW5kU2l6ZSgiYnVmZmVyLWl4IiwgJmJ1ZmZlckl4KSk7CisKKyAgICBpZiAoIW1Jc0F1ZGlvKSB7CisgICAgICAgIGludDY0X3QgdGltZVVzOworICAgICAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBidWZmZXIgPSBtT3V0cHV0QnVmZmVyc1tidWZmZXJJeF07CisgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpOworCisgICAgICAgIGlmIChtQ0NEZWNvZGVyICE9IE5VTEwgJiYgbUNDRGVjb2Rlci0+aXNTZWxlY3RlZCgpKSB7CisgICAgICAgICAgICBtQ0NEZWNvZGVyLT5kaXNwbGF5KHRpbWVVcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobUNvZGVjID09IE5VTEwpIHsKKyAgICAgICAgZXJyID0gTk9fSU5JVDsKKyAgICB9IGVsc2UgaWYgKG1zZy0+ZmluZEludDMyKCJyZW5kZXIiLCAmcmVuZGVyKSAmJiByZW5kZXIpIHsKKyAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBOczsKKyAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInRpbWVzdGFtcE5zIiwgJnRpbWVzdGFtcE5zKSk7CisgICAgICAgIGVyciA9IG1Db2RlYy0+cmVsZWFzZU91dHB1dEJ1ZmZlckF0VGltZShidWZmZXJJeCwgdGltZXN0YW1wTnMpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1OdW1PdXRwdXRGcmFtZXNEcm9wcGVkICs9ICFtSXNBdWRpbzsKKyAgICAgICAgZXJyID0gbUNvZGVjLT5yZWxlYXNlT3V0cHV0QnVmZmVyKGJ1ZmZlckl4LCBmYWxzZSAvKiByZW5kZXIgKi8pOworICAgIH0KKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gcmVsZWFzZSBvdXRwdXQgYnVmZmVyIGZvciBbJXNdIChlcnI9JWQpIiwKKyAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBlcnIpOworICAgICAgICBoYW5kbGVFcnJvcihlcnIpOworICAgIH0KKyAgICBpZiAobXNnLT5maW5kSW50MzIoImVvcyIsICZlb3MpICYmIGVvcworICAgICAgICAgICAgJiYgaXNEaXNjb250aW51aXR5UGVuZGluZygpKSB7CisgICAgICAgIGZpbmlzaEhhbmRsZURpc2NvbnRpbnVpdHkodHJ1ZSAvKiBmbHVzaE9uVGltZUNoYW5nZSAqLyk7CisgICAgfQorfQorCitib29sIE51UGxheWVyMjo6RGVjb2Rlcjo6aXNEaXNjb250aW51aXR5UGVuZGluZygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUZvcm1hdENoYW5nZVBlbmRpbmcgfHwgbVRpbWVDaGFuZ2VQZW5kaW5nOworfQorCit2b2lkIE51UGxheWVyMjo6RGVjb2Rlcjo6ZmluaXNoSGFuZGxlRGlzY29udGludWl0eShib29sIGZsdXNoT25UaW1lQ2hhbmdlKSB7CisgICAgQUxPR1YoImZpbmlzaEhhbmRsZURpc2NvbnRpbnVpdHk6IGZvcm1hdCAlZCwgdGltZSAlZCwgZmx1c2ggJWQiLAorICAgICAgICAgICAgbUZvcm1hdENoYW5nZVBlbmRpbmcsIG1UaW1lQ2hhbmdlUGVuZGluZywgZmx1c2hPblRpbWVDaGFuZ2UpOworCisgICAgLy8gSWYgd2UgaGF2ZSBmb3JtYXQgY2hhbmdlLCBwYXVzZSBhbmQgd2FpdCB0byBiZSBraWxsZWQ7CisgICAgLy8gSWYgd2UgaGF2ZSB0aW1lIGNoYW5nZSBvbmx5LCBmbHVzaCBhbmQgcmVzdGFydCBmZXRjaGluZy4KKworICAgIGlmIChtRm9ybWF0Q2hhbmdlUGVuZGluZykgeworICAgICAgICBtUGF1c2VkID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKG1UaW1lQ2hhbmdlUGVuZGluZykgeworICAgICAgICBpZiAoZmx1c2hPblRpbWVDaGFuZ2UpIHsKKyAgICAgICAgICAgIGRvRmx1c2goZmFsc2UgLyogbm90aWZ5Q29tcGxldGUgKi8pOworICAgICAgICAgICAgc2lnbmFsUmVzdW1lKGZhbHNlIC8qIG5vdGlmeUNvbXBsZXRlICovKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIE5vdGlmeSBOdVBsYXllcjIgdG8gZWl0aGVyIHNodXRkb3duIGRlY29kZXIsIG9yIHJlc2NhbiBzb3VyY2VzCisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG1Ob3RpZnktPmR1cCgpOworICAgIG1zZy0+c2V0SW50MzIoIndoYXQiLCBrV2hhdElucHV0RGlzY29udGludWl0eSk7CisgICAgbXNnLT5zZXRJbnQzMigiZm9ybWF0Q2hhbmdlIiwgbUZvcm1hdENoYW5nZVBlbmRpbmcpOworICAgIG1zZy0+cG9zdCgpOworCisgICAgbUZvcm1hdENoYW5nZVBlbmRpbmcgPSBmYWxzZTsKKyAgICBtVGltZUNoYW5nZVBlbmRpbmcgPSBmYWxzZTsKK30KKworYm9vbCBOdVBsYXllcjI6OkRlY29kZXI6OnN1cHBvcnRzU2VhbWxlc3NBdWRpb0Zvcm1hdENoYW5nZSgKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZ0YXJnZXRGb3JtYXQpIGNvbnN0IHsKKyAgICBpZiAodGFyZ2V0Rm9ybWF0ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQVN0cmluZyBtaW1lOworICAgIGlmICghdGFyZ2V0Rm9ybWF0LT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIXN0cmNhc2VjbXAobWltZS5jX3N0cigpLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpKSB7CisgICAgICAgIC8vIGZpZWxkLWJ5LWZpZWxkIGNvbXBhcmlzb24KKyAgICAgICAgY29uc3QgY2hhciAqIGtleXNbXSA9IHsgImNoYW5uZWwtY291bnQiLCAic2FtcGxlLXJhdGUiLCAiaXMtYWR0cyIgfTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBzaXplb2Yoa2V5cykgLyBzaXplb2Yoa2V5c1swXSk7IGkrKykgeworICAgICAgICAgICAgaW50MzJfdCBvbGRWYWwsIG5ld1ZhbDsKKyAgICAgICAgICAgIGlmICghbUlucHV0Rm9ybWF0LT5nZXRJbnQzMihrZXlzW2ldLCAmb2xkVmFsKSB8fAorICAgICAgICAgICAgICAgICAgICAhdGFyZ2V0Rm9ybWF0LT5maW5kSW50MzIoa2V5c1tpXSwgJm5ld1ZhbCkgfHwKKyAgICAgICAgICAgICAgICAgICAgb2xkVmFsICE9IG5ld1ZhbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHNwPEFCdWZmZXI+IG5ld0J1ZjsKKyAgICAgICAgdWludDhfdCAqb2xkQnVmRGF0YSA9IE5VTEw7CisgICAgICAgIHNpemVfdCBvbGRCdWZTaXplID0gMDsKKyAgICAgICAgaWYgKG1JbnB1dEZvcm1hdC0+Z2V0QnVmZmVyKCJjc2QtMCIsICh2b2lkKiopJm9sZEJ1ZkRhdGEsICZvbGRCdWZTaXplKSAmJgorICAgICAgICAgICAgICAgIHRhcmdldEZvcm1hdC0+ZmluZEJ1ZmZlcigiY3NkLTAiLCAmbmV3QnVmKSkgeworICAgICAgICAgICAgaWYgKG9sZEJ1ZlNpemUgIT0gbmV3QnVmLT5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gIW1lbWNtcChvbGRCdWZEYXRhLCBuZXdCdWYtPmRhdGEoKSwgb2xkQnVmU2l6ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIE51UGxheWVyMjo6RGVjb2Rlcjo6c3VwcG9ydHNTZWFtbGVzc0Zvcm1hdENoYW5nZShjb25zdCBzcDxBTWVzc2FnZT4gJnRhcmdldEZvcm1hdCkgY29uc3QgeworICAgIGlmIChtSW5wdXRGb3JtYXQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKHRhcmdldEZvcm1hdCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEFTdHJpbmcgb2xkTWltZSwgbmV3TWltZTsKKyAgICBpZiAoIW1JbnB1dEZvcm1hdC0+Z2V0U3RyaW5nKCJtaW1lIiwgJm9sZE1pbWUpCisgICAgICAgICAgICB8fCAhdGFyZ2V0Rm9ybWF0LT5maW5kU3RyaW5nKCJtaW1lIiwgJm5ld01pbWUpCisgICAgICAgICAgICB8fCAhKG9sZE1pbWUgPT0gbmV3TWltZSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2wgYXVkaW8gPSAhc3RybmNhc2VjbXAob2xkTWltZS5jX3N0cigpLCAiYXVkaW8vIiwgc3RybGVuKCJhdWRpby8iKSk7CisgICAgYm9vbCBzZWFtbGVzczsKKyAgICBpZiAoYXVkaW8pIHsKKyAgICAgICAgc2VhbWxlc3MgPSBzdXBwb3J0c1NlYW1sZXNzQXVkaW9Gb3JtYXRDaGFuZ2UodGFyZ2V0Rm9ybWF0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQzMl90IGlzQWRhcHRpdmU7CisgICAgICAgIHNlYW1sZXNzID0gKG1Db2RlYyAhPSBOVUxMICYmCisgICAgICAgICAgICAgICAgbUlucHV0Rm9ybWF0LT5nZXRJbnQzMigiYWRhcHRpdmUtcGxheWJhY2siLCAmaXNBZGFwdGl2ZSkgJiYKKyAgICAgICAgICAgICAgICBpc0FkYXB0aXZlKTsKKyAgICB9CisKKyAgICBBTE9HVigiJXMgc2VhbWxlc3Mgc3VwcG9ydCBmb3IgJXMiLCBzZWFtbGVzcyA/ICJ5ZXMiIDogIm5vIiwgb2xkTWltZS5jX3N0cigpKTsKKyAgICByZXR1cm4gc2VhbWxlc3M7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpEZWNvZGVyOjpyZW1lbWJlckNvZGVjU3BlY2lmaWNEYXRhKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KSB7CisgICAgaWYgKGZvcm1hdCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbUNTRHNGb3JDdXJyZW50Rm9ybWF0LmNsZWFyKCk7CisgICAgZm9yIChpbnQzMl90IGkgPSAwOyA7ICsraSkgeworICAgICAgICBBU3RyaW5nIHRhZyA9ICJjc2QtIjsKKyAgICAgICAgdGFnLmFwcGVuZChpKTsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyOworICAgICAgICBpZiAoIWZvcm1hdC0+ZmluZEJ1ZmZlcih0YWcuY19zdHIoKSwgJmJ1ZmZlcikpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIG1DU0RzRm9yQ3VycmVudEZvcm1hdC5wdXNoKGJ1ZmZlcik7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyMjo6RGVjb2Rlcjo6bm90aWZ5UmVzdW1lQ29tcGxldGVJZk5lY2Vzc2FyeSgpIHsKKyAgICBpZiAobVJlc3VtZVBlbmRpbmcpIHsKKyAgICAgICAgbVJlc3VtZVBlbmRpbmcgPSBmYWxzZTsKKworICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFJlc3VtZUNvbXBsZXRlZCk7CisgICAgICAgIG5vdGlmeS0+cG9zdCgpOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvbnVwbGF5ZXIyL051UGxheWVyMkRlY29kZXIuaCBiL21lZGlhL2xpYm1lZGlhL251cGxheWVyMi9OdVBsYXllcjJEZWNvZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRmYjEwZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL251cGxheWVyMi9OdVBsYXllcjJEZWNvZGVyLmgKQEAgLTAsMCArMSwxNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTlVQTEFZRVIyX0RFQ09ERVJfSF8KKyNkZWZpbmUgTlVQTEFZRVIyX0RFQ09ERVJfSF8KKworI2luY2x1ZGUgIk51UGxheWVyMi5oIgorCisjaW5jbHVkZSAiTnVQbGF5ZXIyRGVjb2RlckJhc2UuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNZWRpYUNvZGVjQnVmZmVyOworCitzdHJ1Y3QgQU1lZGlhQ29kZWNXcmFwcGVyOworc3RydWN0IEFNZWRpYUZvcm1hdFdyYXBwZXI7CisKK3N0cnVjdCBOdVBsYXllcjI6OkRlY29kZXIgOiBwdWJsaWMgRGVjb2RlckJhc2UgeworICAgIERlY29kZXIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCisgICAgICAgICAgICBjb25zdCBzcDxTb3VyY2U+ICZzb3VyY2UsCisgICAgICAgICAgICBwaWRfdCBwaWQsCisgICAgICAgICAgICB1aWRfdCB1aWQsCisgICAgICAgICAgICBjb25zdCBzcDxSZW5kZXJlcj4gJnJlbmRlcmVyID0gTlVMTCwKKyAgICAgICAgICAgIGNvbnN0IHNwPEFOYXRpdmVXaW5kb3dXcmFwcGVyPiAmbnd3ID0gTlVMTCwKKyAgICAgICAgICAgIGNvbnN0IHNwPENDRGVjb2Rlcj4gJmNjRGVjb2RlciA9IE5VTEwpOworCisgICAgdmlydHVhbCBzcDxBTWVzc2FnZT4gZ2V0U3RhdHMoKSBjb25zdDsKKworICAgIC8vIHNldHMgdGhlIG91dHB1dCBzdXJmYWNlIG9mIHZpZGVvIGRlY29kZXJzLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VmlkZW9TdXJmYWNlKGNvbnN0IHNwPEFOYXRpdmVXaW5kb3dXcmFwcGVyPiAmbnd3KTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZUNyeXB0bygpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+RGVjb2RlcigpOworCisgICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKworICAgIHZpcnR1YWwgdm9pZCBvbkNvbmZpZ3VyZShjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCk7CisgICAgdmlydHVhbCB2b2lkIG9uU2V0UGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJnBhcmFtcyk7CisgICAgdmlydHVhbCB2b2lkIG9uU2V0UmVuZGVyZXIoY29uc3Qgc3A8UmVuZGVyZXI+ICZyZW5kZXJlcik7CisgICAgdmlydHVhbCB2b2lkIG9uUmVzdW1lKGJvb2wgbm90aWZ5Q29tcGxldGUpOworICAgIHZpcnR1YWwgdm9pZCBvbkZsdXNoKCk7CisgICAgdmlydHVhbCB2b2lkIG9uU2h1dGRvd24oYm9vbCBub3RpZnlDb21wbGV0ZSk7CisgICAgdmlydHVhbCBib29sIGRvUmVxdWVzdEJ1ZmZlcnMoKTsKKworcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAga1doYXRDb2RlY05vdGlmeSAgICAgICAgID0gJ2NkY04nLAorICAgICAgICBrV2hhdFJlbmRlckJ1ZmZlciAgICAgICAgPSAncm5kcicsCisgICAgICAgIGtXaGF0U2V0VmlkZW9TdXJmYWNlICAgICA9ICdzU3VyJywKKyAgICAgICAga1doYXRBdWRpb091dHB1dEZvcm1hdENoYW5nZWQgPSAnYW9mYycsCisgICAgICAgIGtXaGF0RHJtUmVsZWFzZUNyeXB0byAgICA9ICdyRHJtJywKKyAgICB9OworCisgICAgZW51bSB7CisgICAgICAgIGtNYXhOdW1WaWRlb1RlbXBvcmFsTGF5ZXJzID0gMzIsCisgICAgfTsKKworICAgIHNwPEFOYXRpdmVXaW5kb3dXcmFwcGVyPiBtTmF0aXZlV2luZG93OworCisgICAgc3A8U291cmNlPiBtU291cmNlOworICAgIHNwPFJlbmRlcmVyPiBtUmVuZGVyZXI7CisgICAgc3A8Q0NEZWNvZGVyPiBtQ0NEZWNvZGVyOworCisgICAgc3A8QU1lZGlhRm9ybWF0V3JhcHBlcj4gbUlucHV0Rm9ybWF0OworICAgIHNwPEFNZWRpYUNvZGVjV3JhcHBlcj4gbUNvZGVjOworCisgICAgTGlzdDxzcDxBTWVzc2FnZT4gPiBtUGVuZGluZ0lucHV0TWVzc2FnZXM7CisKKyAgICBWZWN0b3I8c3A8TWVkaWFDb2RlY0J1ZmZlcj4gPiBtSW5wdXRCdWZmZXJzOworICAgIFZlY3RvcjxzcDxNZWRpYUNvZGVjQnVmZmVyPiA+IG1PdXRwdXRCdWZmZXJzOworICAgIFZlY3RvcjxzcDxBQnVmZmVyPiA+IG1DU0RzRm9yQ3VycmVudEZvcm1hdDsKKyAgICBWZWN0b3I8c3A8QUJ1ZmZlcj4gPiBtQ1NEc1RvU3VibWl0OworICAgIFZlY3Rvcjxib29sPiBtSW5wdXRCdWZmZXJJc0RlcXVldWVkOworICAgIFZlY3RvcjxNZWRpYUJ1ZmZlciAqPiBtTWVkaWFCdWZmZXJzOworICAgIFZlY3RvcjxzaXplX3Q+IG1EZXF1ZXVlZElucHV0QnVmZmVyczsKKworICAgIGNvbnN0IHBpZF90IG1QaWQ7CisgICAgY29uc3QgdWlkX3QgbVVpZDsKKyAgICBpbnQ2NF90IG1Ta2lwUmVuZGVyaW5nVW50aWxNZWRpYVRpbWVVczsKKyAgICBpbnQ2NF90IG1OdW1GcmFtZXNUb3RhbDsKKyAgICBpbnQ2NF90IG1OdW1JbnB1dEZyYW1lc0Ryb3BwZWQ7CisgICAgaW50NjRfdCBtTnVtT3V0cHV0RnJhbWVzRHJvcHBlZDsKKyAgICBpbnQzMl90IG1WaWRlb1dpZHRoOworICAgIGludDMyX3QgbVZpZGVvSGVpZ2h0OworICAgIGJvb2wgbUlzQXVkaW87CisgICAgYm9vbCBtSXNWaWRlb0FWQzsKKyAgICBib29sIG1Jc1NlY3VyZTsKKyAgICBib29sIG1Jc0VuY3J5cHRlZDsKKyAgICBib29sIG1Jc0VuY3J5cHRlZE9ic2VydmVkRWFybGllcjsKKyAgICBib29sIG1Gb3JtYXRDaGFuZ2VQZW5kaW5nOworICAgIGJvb2wgbVRpbWVDaGFuZ2VQZW5kaW5nOworICAgIGZsb2F0IG1GcmFtZVJhdGVUb3RhbDsKKyAgICBmbG9hdCBtUGxheWJhY2tTcGVlZDsKKyAgICBpbnQzMl90IG1OdW1WaWRlb1RlbXBvcmFsTGF5ZXJUb3RhbDsKKyAgICBpbnQzMl90IG1OdW1WaWRlb1RlbXBvcmFsTGF5ZXJBbGxvd2VkOworICAgIGludDMyX3QgbUN1cnJlbnRNYXhWaWRlb1RlbXBvcmFsTGF5ZXJJZDsKKyAgICBmbG9hdCBtVmlkZW9UZW1wb3JhbExheWVyQWdncmVnYXRlRnBzW2tNYXhOdW1WaWRlb1RlbXBvcmFsTGF5ZXJzXTsKKworICAgIGJvb2wgbVJlc3VtZVBlbmRpbmc7CisgICAgQVN0cmluZyBtQ29tcG9uZW50TmFtZTsKKworICAgIHZvaWQgaGFuZGxlRXJyb3IoaW50MzJfdCBlcnIpOworICAgIGJvb2wgaGFuZGxlQW5JbnB1dEJ1ZmZlcihzaXplX3QgaW5kZXgpOworICAgIGJvb2wgaGFuZGxlQW5PdXRwdXRCdWZmZXIoCisgICAgICAgICAgICBzaXplX3QgaW5kZXgsCisgICAgICAgICAgICBzaXplX3Qgb2Zmc2V0LAorICAgICAgICAgICAgc2l6ZV90IHNpemUsCisgICAgICAgICAgICBpbnQ2NF90IHRpbWVVcywKKyAgICAgICAgICAgIGludDMyX3QgZmxhZ3MpOworICAgIHZvaWQgaGFuZGxlT3V0cHV0Rm9ybWF0Q2hhbmdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KTsKKworICAgIHZvaWQgcmVsZWFzZUFuZFJlc2V0TWVkaWFCdWZmZXJzKCk7CisgICAgYm9vbCBpc1N0YWxlUmVwbHkoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworCisgICAgdm9pZCBkb0ZsdXNoKGJvb2wgbm90aWZ5Q29tcGxldGUpOworICAgIHN0YXR1c190IGZldGNoSW5wdXREYXRhKHNwPEFNZXNzYWdlPiAmcmVwbHkpOworICAgIGJvb2wgb25JbnB1dEJ1ZmZlckZldGNoZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHZvaWQgb25SZW5kZXJCdWZmZXIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworCisgICAgYm9vbCBzdXBwb3J0c1NlYW1sZXNzRm9ybWF0Q2hhbmdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmdG8pIGNvbnN0OworICAgIGJvb2wgc3VwcG9ydHNTZWFtbGVzc0F1ZGlvRm9ybWF0Q2hhbmdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmdGFyZ2V0Rm9ybWF0KSBjb25zdDsKKyAgICB2b2lkIHJlbWVtYmVyQ29kZWNTcGVjaWZpY0RhdGEoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpOworICAgIGJvb2wgaXNEaXNjb250aW51aXR5UGVuZGluZygpIGNvbnN0OworICAgIHZvaWQgZmluaXNoSGFuZGxlRGlzY29udGludWl0eShib29sIGZsdXNoT25UaW1lQ2hhbmdlKTsKKworICAgIHZvaWQgbm90aWZ5UmVzdW1lQ29tcGxldGVJZk5lY2Vzc2FyeSgpOworCisgICAgdm9pZCBvblJlbGVhc2VDcnlwdG8oY29uc3Qgc3A8QU1lc3NhZ2U+JiBtc2cpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRGVjb2Rlcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE5VUExBWUVSMl9ERUNPREVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9udXBsYXllcjIvTnVQbGF5ZXIyRGVjb2RlckJhc2UuY3BwIGIvbWVkaWEvbGlibWVkaWEvbnVwbGF5ZXIyL051UGxheWVyMkRlY29kZXJCYXNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDgwOTEyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvbnVwbGF5ZXIyL051UGxheWVyMkRlY29kZXJCYXNlLmNwcApAQCAtMCwwICsxLDIxNCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJOdVBsYXllcjJEZWNvZGVyQmFzZSIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSAiTnVQbGF5ZXIyRGVjb2RlckJhc2UuaCIKKworI2luY2x1ZGUgIk51UGxheWVyMlJlbmRlcmVyLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworTnVQbGF5ZXIyOjpEZWNvZGVyQmFzZTo6RGVjb2RlckJhc2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpCisgICAgOiAgbU5vdGlmeShub3RpZnkpLAorICAgICAgIG1CdWZmZXJHZW5lcmF0aW9uKDApLAorICAgICAgIG1QYXVzZWQoZmFsc2UpLAorICAgICAgIG1TdGF0cyhuZXcgQU1lc3NhZ2UpLAorICAgICAgIG1SZXF1ZXN0SW5wdXRCdWZmZXJzUGVuZGluZyhmYWxzZSkgeworICAgIC8vIEV2ZXJ5IGRlY29kZXIgaGFzIGl0cyBvd24gbG9vcGVyIGJlY2F1c2UgTWVkaWFDb2RlYyBvcGVyYXRpb25zCisgICAgLy8gYXJlIGJsb2NraW5nLCBidXQgTnVQbGF5ZXIyIG5lZWRzIGFzeW5jaHJvbm91cyBvcGVyYXRpb25zLgorICAgIG1EZWNvZGVyTG9vcGVyID0gbmV3IEFMb29wZXI7CisgICAgbURlY29kZXJMb29wZXItPnNldE5hbWUoIk5QRGVjb2RlciIpOworICAgIG1EZWNvZGVyTG9vcGVyLT5zdGFydChmYWxzZSwgZmFsc2UsIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOworfQorCitOdVBsYXllcjI6OkRlY29kZXJCYXNlOjp+RGVjb2RlckJhc2UoKSB7CisgICAgc3RvcExvb3BlcigpOworfQorCitzdGF0aWMKK3N0YXR1c190IFBvc3RBbmRBd2FpdFJlc3BvbnNlKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZywgc3A8QU1lc3NhZ2U+ICpyZXNwb25zZSkgeworICAgIHN0YXR1c190IGVyciA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UocmVzcG9uc2UpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGlmICghKCpyZXNwb25zZSktPmZpbmRJbnQzMigiZXJyIiwgJmVycikpIHsKKyAgICAgICAgZXJyID0gT0s7CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KKwordm9pZCBOdVBsYXllcjI6OkRlY29kZXJCYXNlOjpjb25maWd1cmUoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q29uZmlndXJlLCB0aGlzKTsKKyAgICBtc2ctPnNldE1lc3NhZ2UoImZvcm1hdCIsIGZvcm1hdCk7CisgICAgbXNnLT5wb3N0KCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpEZWNvZGVyQmFzZTo6aW5pdCgpIHsKKyAgICBtRGVjb2Rlckxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKHRoaXMpOworfQorCit2b2lkIE51UGxheWVyMjo6RGVjb2RlckJhc2U6OnN0b3BMb29wZXIoKSB7CisgICAgbURlY29kZXJMb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKGlkKCkpOworICAgIG1EZWNvZGVyTG9vcGVyLT5zdG9wKCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpEZWNvZGVyQmFzZTo6c2V0UGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJnBhcmFtcykgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXRQYXJhbWV0ZXJzLCB0aGlzKTsKKyAgICBtc2ctPnNldE1lc3NhZ2UoInBhcmFtcyIsIHBhcmFtcyk7CisgICAgbXNnLT5wb3N0KCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpEZWNvZGVyQmFzZTo6c2V0UmVuZGVyZXIoY29uc3Qgc3A8UmVuZGVyZXI+ICZyZW5kZXJlcikgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXRSZW5kZXJlciwgdGhpcyk7CisgICAgbXNnLT5zZXRPYmplY3QoInJlbmRlcmVyIiwgcmVuZGVyZXIpOworICAgIG1zZy0+cG9zdCgpOworfQorCit2b2lkIE51UGxheWVyMjo6RGVjb2RlckJhc2U6OnBhdXNlKCkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRQYXVzZSwgdGhpcyk7CisKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgUG9zdEFuZEF3YWl0UmVzcG9uc2UobXNnLCAmcmVzcG9uc2UpOworfQorCit2b2lkIE51UGxheWVyMjo6RGVjb2RlckJhc2U6OnNpZ25hbEZsdXNoKCkgeworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRGbHVzaCwgdGhpcykpLT5wb3N0KCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpEZWNvZGVyQmFzZTo6c2lnbmFsUmVzdW1lKGJvb2wgbm90aWZ5Q29tcGxldGUpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UmVzdW1lLCB0aGlzKTsKKyAgICBtc2ctPnNldEludDMyKCJub3RpZnlDb21wbGV0ZSIsIG5vdGlmeUNvbXBsZXRlKTsKKyAgICBtc2ctPnBvc3QoKTsKK30KKwordm9pZCBOdVBsYXllcjI6OkRlY29kZXJCYXNlOjppbml0aWF0ZVNodXRkb3duKCkgeworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTaHV0ZG93biwgdGhpcykpLT5wb3N0KCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpEZWNvZGVyQmFzZTo6b25SZXF1ZXN0SW5wdXRCdWZmZXJzKCkgeworICAgIGlmIChtUmVxdWVzdElucHV0QnVmZmVyc1BlbmRpbmcpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIGRvUmVxdWVzdEJ1ZmZlcnMoKSByZXR1cm4gdHJ1ZSBpZiB3ZSBzaG91bGQgcmVxdWVzdCBtb3JlIGRhdGEKKyAgICBpZiAoZG9SZXF1ZXN0QnVmZmVycygpKSB7CisgICAgICAgIG1SZXF1ZXN0SW5wdXRCdWZmZXJzUGVuZGluZyA9IHRydWU7CisKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFJlcXVlc3RJbnB1dEJ1ZmZlcnMsIHRoaXMpOworICAgICAgICBtc2ctPnBvc3QoMTAgKiAxMDAwbGwpOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjI6OkRlY29kZXJCYXNlOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworCisgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICBjYXNlIGtXaGF0Q29uZmlndXJlOgorICAgICAgICB7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gZm9ybWF0OworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgiZm9ybWF0IiwgJmZvcm1hdCkpOworICAgICAgICAgICAgb25Db25maWd1cmUoZm9ybWF0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdFNldFBhcmFtZXRlcnM6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBwYXJhbXM7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJwYXJhbXMiLCAmcGFyYW1zKSk7CisgICAgICAgICAgICBvblNldFBhcmFtZXRlcnMocGFyYW1zKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdFNldFJlbmRlcmVyOgorICAgICAgICB7CisgICAgICAgICAgICBzcDxSZWZCYXNlPiBvYmo7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoInJlbmRlcmVyIiwgJm9iaikpOworICAgICAgICAgICAgb25TZXRSZW5kZXJlcihzdGF0aWNfY2FzdDxSZW5kZXJlciAqPihvYmouZ2V0KCkpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdFBhdXNlOgorICAgICAgICB7CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKKworICAgICAgICAgICAgbVBhdXNlZCA9IHRydWU7CisKKyAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UpLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRSZXF1ZXN0SW5wdXRCdWZmZXJzOgorICAgICAgICB7CisgICAgICAgICAgICBtUmVxdWVzdElucHV0QnVmZmVyc1BlbmRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIG9uUmVxdWVzdElucHV0QnVmZmVycygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0Rmx1c2g6CisgICAgICAgIHsKKyAgICAgICAgICAgIG9uRmx1c2goKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdFJlc3VtZToKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCBub3RpZnlDb21wbGV0ZTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJub3RpZnlDb21wbGV0ZSIsICZub3RpZnlDb21wbGV0ZSkpOworCisgICAgICAgICAgICBvblJlc3VtZShub3RpZnlDb21wbGV0ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRTaHV0ZG93bjoKKyAgICAgICAgeworICAgICAgICAgICAgb25TaHV0ZG93bih0cnVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFRSRVNQQVNTKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpEZWNvZGVyQmFzZTo6aGFuZGxlRXJyb3IoaW50MzJfdCBlcnIpCit7CisgICAgLy8gV2UgY2Fubm90IGltbWVkaWF0ZWx5IHJlbGVhc2UgdGhlIGNvZGVjIGR1ZSB0byBidWZmZXJzIHN0aWxsIG91dHN0YW5kaW5nCisgICAgLy8gaW4gdGhlIHJlbmRlcmVyLiAgV2Ugc2lnbmFsIHRvIHRoZSBwbGF5ZXIgdGhlIGVycm9yIHNvIGl0IGNhbiBzaHV0ZG93bi9yZWxlYXNlIHRoZQorICAgIC8vIGRlY29kZXIgYWZ0ZXIgZmx1c2hpbmcgYW5kIGluY3JlbWVudCB0aGUgZ2VuZXJhdGlvbiB0byBkaXNjYXJkIHVubmVjZXNzYXJ5IG1lc3NhZ2VzLgorCisgICAgKyttQnVmZmVyR2VuZXJhdGlvbjsKKworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRFcnJvcik7CisgICAgbm90aWZ5LT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKKyAgICBub3RpZnktPnBvc3QoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvbnVwbGF5ZXIyL051UGxheWVyMkRlY29kZXJCYXNlLmggYi9tZWRpYS9saWJtZWRpYS9udXBsYXllcjIvTnVQbGF5ZXIyRGVjb2RlckJhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTU3ZjBkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvbnVwbGF5ZXIyL051UGxheWVyMkRlY29kZXJCYXNlLmgKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTlVQTEFZRVIyX0RFQ09ERVJfQkFTRV9IXworCisjZGVmaW5lIE5VUExBWUVSMl9ERUNPREVSX0JBU0VfSF8KKworI2luY2x1ZGUgIk51UGxheWVyMi5oIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBBQnVmZmVyOworc3RydWN0IEFOYXRpdmVXaW5kb3dXcmFwcGVyOworc3RydWN0IE1lZGlhQ29kZWM7CitjbGFzcyBNZWRpYUJ1ZmZlcjsKK2NsYXNzIE1lZGlhQ29kZWNCdWZmZXI7CisKK3N0cnVjdCBOdVBsYXllcjI6OkRlY29kZXJCYXNlIDogcHVibGljIEFIYW5kbGVyIHsKKyAgICBleHBsaWNpdCBEZWNvZGVyQmFzZShjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSk7CisKKyAgICB2b2lkIGNvbmZpZ3VyZShjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCk7CisgICAgdm9pZCBpbml0KCk7CisgICAgdm9pZCBzZXRQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmcGFyYW1zKTsKKworICAgIC8vIFN5bmNocm9ub3VzIGNhbGwgdG8gZW5zdXJlIGRlY29kZXIgd2lsbCBub3QgcmVxdWVzdCBvciBzZW5kIG91dCBkYXRhLgorICAgIHZvaWQgcGF1c2UoKTsKKworICAgIHZvaWQgc2V0UmVuZGVyZXIoY29uc3Qgc3A8UmVuZGVyZXI+ICZyZW5kZXJlcik7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWaWRlb1N1cmZhY2UoY29uc3Qgc3A8QU5hdGl2ZVdpbmRvd1dyYXBwZXI+ICYpIHsgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOyB9CisKKyAgICB2b2lkIHNpZ25hbEZsdXNoKCk7CisgICAgdm9pZCBzaWduYWxSZXN1bWUoYm9vbCBub3RpZnlDb21wbGV0ZSk7CisgICAgdm9pZCBpbml0aWF0ZVNodXRkb3duKCk7CisKKyAgICB2aXJ0dWFsIHNwPEFNZXNzYWdlPiBnZXRTdGF0cygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1TdGF0czsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VDcnlwdG8oKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBlbnVtIHsKKyAgICAgICAga1doYXRJbnB1dERpc2NvbnRpbnVpdHkgID0gJ2luRGknLAorICAgICAgICBrV2hhdFZpZGVvU2l6ZUNoYW5nZWQgICAgPSAndmlTQycsCisgICAgICAgIGtXaGF0Rmx1c2hDb21wbGV0ZWQgICAgICA9ICdmbHNDJywKKyAgICAgICAga1doYXRTaHV0ZG93bkNvbXBsZXRlZCAgID0gJ3NoREMnLAorICAgICAgICBrV2hhdFJlc3VtZUNvbXBsZXRlZCAgICAgPSAncmVzQycsCisgICAgICAgIGtXaGF0RU9TICAgICAgICAgICAgICAgICA9ICdlb3MgJywKKyAgICAgICAga1doYXRFcnJvciAgICAgICAgICAgICAgID0gJ2VyciAnLAorICAgIH07CisKK3Byb3RlY3RlZDoKKworICAgIHZpcnR1YWwgfkRlY29kZXJCYXNlKCk7CisKKyAgICB2b2lkIHN0b3BMb29wZXIoKTsKKworICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisKKyAgICB2aXJ0dWFsIHZvaWQgb25Db25maWd1cmUoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgb25TZXRQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmcGFyYW1zKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIG9uU2V0UmVuZGVyZXIoY29uc3Qgc3A8UmVuZGVyZXI+ICZyZW5kZXJlcikgPSAwOworICAgIHZpcnR1YWwgdm9pZCBvblJlc3VtZShib29sIG5vdGlmeUNvbXBsZXRlKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIG9uRmx1c2goKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIG9uU2h1dGRvd24oYm9vbCBub3RpZnlDb21wbGV0ZSkgPSAwOworCisgICAgdm9pZCBvblJlcXVlc3RJbnB1dEJ1ZmZlcnMoKTsKKyAgICB2aXJ0dWFsIGJvb2wgZG9SZXF1ZXN0QnVmZmVycygpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgaGFuZGxlRXJyb3IoaW50MzJfdCBlcnIpOworCisgICAgc3A8QU1lc3NhZ2U+IG1Ob3RpZnk7CisgICAgaW50MzJfdCBtQnVmZmVyR2VuZXJhdGlvbjsKKyAgICBib29sIG1QYXVzZWQ7CisgICAgc3A8QU1lc3NhZ2U+IG1TdGF0czsKKworcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAga1doYXRDb25maWd1cmUgICAgICAgICAgID0gJ2NvbmYnLAorICAgICAgICBrV2hhdFNldFBhcmFtZXRlcnMgICAgICAgPSAnc2V0UCcsCisgICAgICAgIGtXaGF0U2V0UmVuZGVyZXIgICAgICAgICA9ICdzZXRSJywKKyAgICAgICAga1doYXRQYXVzZSAgICAgICAgICAgICAgID0gJ3BhdXMnLAorICAgICAgICBrV2hhdFJlcXVlc3RJbnB1dEJ1ZmZlcnMgPSAncmVxQicsCisgICAgICAgIGtXaGF0Rmx1c2ggICAgICAgICAgICAgICA9ICdmbHVzJywKKyAgICAgICAga1doYXRTaHV0ZG93biAgICAgICAgICAgID0gJ3NodUQnLAorICAgIH07CisKKyAgICBzcDxBTG9vcGVyPiBtRGVjb2Rlckxvb3BlcjsKKyAgICBib29sIG1SZXF1ZXN0SW5wdXRCdWZmZXJzUGVuZGluZzsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKERlY29kZXJCYXNlKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTlVQTEFZRVIyX0RFQ09ERVJfQkFTRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvbnVwbGF5ZXIyL051UGxheWVyMkRlY29kZXJQYXNzVGhyb3VnaC5jcHAgYi9tZWRpYS9saWJtZWRpYS9udXBsYXllcjIvTnVQbGF5ZXIyRGVjb2RlclBhc3NUaHJvdWdoLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTBjMWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvbnVwbGF5ZXIyL051UGxheWVyMkRlY29kZXJQYXNzVGhyb3VnaC5jcHAKQEAgLTAsMCArMSw0MzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTnVQbGF5ZXIyRGVjb2RlclBhc3NUaHJvdWdoIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlICJOdVBsYXllcjJEZWNvZGVyUGFzc1Rocm91Z2guaCIKKworI2luY2x1ZGUgIk51UGxheWVyMlJlbmRlcmVyLmgiCisjaW5jbHVkZSAiTnVQbGF5ZXIyU291cmNlLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKworI2luY2x1ZGUgIkFUU1BhcnNlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIFRPRE8gb3B0aW1pemUgYnVmZmVyIHNpemUgZm9yIHBvd2VyIGNvbnN1bXB0aW9uCisvLyBUaGUgb2ZmbG9hZCByZWFkIGJ1ZmZlciBzaXplIGlzIDMyIEtCIGJ1dCAyNCBLQiB1c2VzIGxlc3MgcG93ZXIuCitzdGF0aWMgY29uc3Qgc2l6ZV90IGtBZ2dyZWdhdGVCdWZmZXJTaXplQnl0ZXMgPSAyNCAqIDEwMjQ7CitzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhDYWNoZWRCeXRlcyA9IDIwMDAwMDsKKworTnVQbGF5ZXIyOjpEZWNvZGVyUGFzc1Rocm91Z2g6OkRlY29kZXJQYXNzVGhyb3VnaCgKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCisgICAgICAgIGNvbnN0IHNwPFNvdXJjZT4gJnNvdXJjZSwKKyAgICAgICAgY29uc3Qgc3A8UmVuZGVyZXI+ICZyZW5kZXJlcikKKyAgICA6IERlY29kZXJCYXNlKG5vdGlmeSksCisgICAgICBtU291cmNlKHNvdXJjZSksCisgICAgICBtUmVuZGVyZXIocmVuZGVyZXIpLAorICAgICAgbVNraXBSZW5kZXJpbmdVbnRpbE1lZGlhVGltZVVzKC0xbGwpLAorICAgICAgbVJlYWNoZWRFT1ModHJ1ZSksCisgICAgICBtUGVuZGluZ0F1ZGlvRXJyKE9LKSwKKyAgICAgIG1QZW5kaW5nQnVmZmVyc1RvRHJhaW4oMCksCisgICAgICBtQ2FjaGVkQnl0ZXMoMCksCisgICAgICBtQ29tcG9uZW50TmFtZSgicGFzcyB0aHJvdWdoIGRlY29kZXIiKSB7CisgICAgQUxPR1dfSUYocmVuZGVyZXIgPT0gTlVMTCwgImV4cGVjdCBhIG5vbi1OVUxMIHJlbmRlcmVyIik7Cit9CisKK051UGxheWVyMjo6RGVjb2RlclBhc3NUaHJvdWdoOjp+RGVjb2RlclBhc3NUaHJvdWdoKCkgeworfQorCit2b2lkIE51UGxheWVyMjo6RGVjb2RlclBhc3NUaHJvdWdoOjpvbkNvbmZpZ3VyZShjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkgeworICAgIEFMT0dWKCJbJXNdIG9uQ29uZmlndXJlIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CisgICAgbUNhY2hlZEJ5dGVzID0gMDsKKyAgICBtUGVuZGluZ0J1ZmZlcnNUb0RyYWluID0gMDsKKyAgICBtUmVhY2hlZEVPUyA9IGZhbHNlOworICAgICsrbUJ1ZmZlckdlbmVyYXRpb247CisKKyAgICBvblJlcXVlc3RJbnB1dEJ1ZmZlcnMoKTsKKworICAgIGludDMyX3QgaGFzVmlkZW8gPSAwOworICAgIGZvcm1hdC0+ZmluZEludDMyKCJoYXMtdmlkZW8iLCAmaGFzVmlkZW8pOworCisgICAgLy8gVGhlIGF1ZGlvIHNpbmsgaXMgYWxyZWFkeSBvcGVuZWQgYmVmb3JlIHRoZSBQYXNzVGhyb3VnaCBkZWNvZGVyIGlzIGNyZWF0ZWQuCisgICAgLy8gT3BlbmluZyBhZ2FpbiBtaWdodCBiZSByZWxldmFudCBpZiBkZWNvZGVyIGlzIGluc3RhbnRpYXRlZCBhZnRlciBzaHV0ZG93biBhbmQKKyAgICAvLyBmb3JtYXQgaXMgZGlmZmVyZW50LgorICAgIHN0YXR1c190IGVyciA9IG1SZW5kZXJlci0+b3BlbkF1ZGlvU2luaygKKyAgICAgICAgICAgIGZvcm1hdCwgdHJ1ZSAvKiBvZmZsb2FkT25seSAqLywgaGFzVmlkZW8sCisgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FIC8qIGZsYWdzICovLCBOVUxMIC8qIGlzT2ZmbG9hZGVkICovLCBtU291cmNlLT5pc1N0cmVhbWluZygpKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIGhhbmRsZUVycm9yKGVycik7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyMjo6RGVjb2RlclBhc3NUaHJvdWdoOjpvblNldFBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICYvKnBhcmFtcyovKSB7CisgICAgQUxPR1coIm9uU2V0UGFyYW1ldGVycygpIGNhbGxlZCB1bmV4cGVjdGVkbHkiKTsKK30KKwordm9pZCBOdVBsYXllcjI6OkRlY29kZXJQYXNzVGhyb3VnaDo6b25TZXRSZW5kZXJlcigKKyAgICAgICAgY29uc3Qgc3A8UmVuZGVyZXI+ICZyZW5kZXJlcikgeworICAgIC8vIHJlbmRlcmVyIGNhbid0IGJlIGNoYW5nZWQgZHVyaW5nIG9mZmxvYWRpbmcKKyAgICBBTE9HV19JRihyZW5kZXJlciAhPSBtUmVuZGVyZXIsCisgICAgICAgICAgICAiaWdub3JpbmcgcmVxdWVzdCB0byBjaGFuZ2UgcmVuZGVyZXIiKTsKK30KKworYm9vbCBOdVBsYXllcjI6OkRlY29kZXJQYXNzVGhyb3VnaDo6aXNTdGFsZVJlcGx5KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgaW50MzJfdCBnZW5lcmF0aW9uOworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJmdlbmVyYXRpb24pKTsKKyAgICByZXR1cm4gZ2VuZXJhdGlvbiAhPSBtQnVmZmVyR2VuZXJhdGlvbjsKK30KKworYm9vbCBOdVBsYXllcjI6OkRlY29kZXJQYXNzVGhyb3VnaDo6aXNEb25lRmV0Y2hpbmcoKSBjb25zdCB7CisgICAgQUxPR1YoIlslc10gbUNhY2hlZEJ5dGVzID0gJXp1LCBtUmVhY2hlZEVPUyA9ICVkIG1QYXVzZWQgPSAlZCIsCisgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBtQ2FjaGVkQnl0ZXMsIG1SZWFjaGVkRU9TLCBtUGF1c2VkKTsKKworICAgIHJldHVybiBtQ2FjaGVkQnl0ZXMgPj0ga01heENhY2hlZEJ5dGVzIHx8IG1SZWFjaGVkRU9TIHx8IG1QYXVzZWQ7Cit9CisKKy8qCisgKiByZXR1cm5zIHRydWUgaWYgd2Ugc2hvdWxkIHJlcXVlc3QgbW9yZSBkYXRhCisgKi8KK2Jvb2wgTnVQbGF5ZXIyOjpEZWNvZGVyUGFzc1Rocm91Z2g6OmRvUmVxdWVzdEJ1ZmZlcnMoKSB7CisgICAgc3RhdHVzX3QgZXJyID0gT0s7CisgICAgd2hpbGUgKCFpc0RvbmVGZXRjaGluZygpKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2UoKTsKKworICAgICAgICBlcnIgPSBmZXRjaElucHV0RGF0YShtc2cpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIG9uSW5wdXRCdWZmZXJGZXRjaGVkKG1zZyk7CisgICAgfQorCisgICAgcmV0dXJuIGVyciA9PSAtRVdPVUxEQkxPQ0sKKyAgICAgICAgICAgICYmIG1Tb3VyY2UtPmZlZWRNb3JlVFNEYXRhKCkgPT0gT0s7Cit9CisKK3N0YXR1c190IE51UGxheWVyMjo6RGVjb2RlclBhc3NUaHJvdWdoOjpkZXF1ZXVlQWNjZXNzVW5pdChzcDxBQnVmZmVyPiAqYWNjZXNzVW5pdCkgeworICAgIHN0YXR1c190IGVycjsKKworICAgIC8vIERpZCB3ZSBzYXZlIGFuIGFjY2Vzc1VuaXQgZWFybGllciBiZWNhdXNlIG9mIGEgZGlzY29udGludWl0eT8KKyAgICBpZiAobVBlbmRpbmdBdWRpb0FjY2Vzc1VuaXQgIT0gTlVMTCkgeworICAgICAgICAqYWNjZXNzVW5pdCA9IG1QZW5kaW5nQXVkaW9BY2Nlc3NVbml0OworICAgICAgICBtUGVuZGluZ0F1ZGlvQWNjZXNzVW5pdC5jbGVhcigpOworICAgICAgICBlcnIgPSBtUGVuZGluZ0F1ZGlvRXJyOworICAgICAgICBBTE9HVigiZmVlZERlY29kZXJJbnB1dERhdGEoKSB1c2UgbVBlbmRpbmdBdWRpb0FjY2Vzc1VuaXQiKTsKKyAgICB9IGVsc2UgeworICAgICAgICBlcnIgPSBtU291cmNlLT5kZXF1ZXVlQWNjZXNzVW5pdCh0cnVlIC8qIGF1ZGlvICovLCBhY2Nlc3NVbml0KTsKKyAgICB9CisKKyAgICBpZiAoZXJyID09IElORk9fRElTQ09OVElOVUlUWSB8fCBlcnIgPT0gRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICBpZiAobUFnZ3JlZ2F0ZUJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAvLyBXZSBhbHJlYWR5IGhhdmUgc29tZSBkYXRhIHNvIHNhdmUgdGhpcyBmb3IgbGF0ZXIuCisgICAgICAgICAgICBtUGVuZGluZ0F1ZGlvRXJyID0gZXJyOworICAgICAgICAgICAgbVBlbmRpbmdBdWRpb0FjY2Vzc1VuaXQgPSAqYWNjZXNzVW5pdDsKKyAgICAgICAgICAgICgqYWNjZXNzVW5pdCkuY2xlYXIoKTsKKyAgICAgICAgICAgIEFMT0dEKCJyZXR1cm4gYWdncmVnYXRlZCBidWZmZXIgYW5kIHNhdmUgZXJyKD0lZCkgZm9yIGxhdGVyIiwgZXJyKTsKKyAgICAgICAgICAgIGVyciA9IE9LOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KKworc3A8QUJ1ZmZlcj4gTnVQbGF5ZXIyOjpEZWNvZGVyUGFzc1Rocm91Z2g6OmFnZ3JlZ2F0ZUJ1ZmZlcigKKyAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQpIHsKKyAgICBzcDxBQnVmZmVyPiBhZ2dyZWdhdGU7CisKKyAgICBpZiAoYWNjZXNzVW5pdCA9PSBOVUxMKSB7CisgICAgICAgIC8vIGFjY2Vzc1VuaXQgaXMgc2F2ZWQgdG8gbVBlbmRpbmdBdWRpb0FjY2Vzc1VuaXQKKyAgICAgICAgLy8gcmV0dXJuIGN1cnJlbnQgbUFnZ3JlZ2F0ZUJ1ZmZlcgorICAgICAgICBhZ2dyZWdhdGUgPSBtQWdncmVnYXRlQnVmZmVyOworICAgICAgICBtQWdncmVnYXRlQnVmZmVyLmNsZWFyKCk7CisgICAgICAgIHJldHVybiBhZ2dyZWdhdGU7CisgICAgfQorCisgICAgc2l6ZV90IHNtYWxsU2l6ZSA9IGFjY2Vzc1VuaXQtPnNpemUoKTsKKyAgICBpZiAoKG1BZ2dyZWdhdGVCdWZmZXIgPT0gTlVMTCkKKyAgICAgICAgICAgIC8vIERvbid0IGJvdGhlciBpZiBvbmx5IHJvb20gZm9yIGEgZmV3IHNtYWxsIGJ1ZmZlcnMuCisgICAgICAgICAgICAmJiAoc21hbGxTaXplIDwgKGtBZ2dyZWdhdGVCdWZmZXJTaXplQnl0ZXMgLyAzKSkpIHsKKyAgICAgICAgLy8gQ3JlYXRlIGEgbGFyZ2VyIGJ1ZmZlciBmb3IgY29tYmluaW5nIHNtYWxsZXIgYnVmZmVycyBmcm9tIHRoZSBleHRyYWN0b3IuCisgICAgICAgIG1BZ2dyZWdhdGVCdWZmZXIgPSBuZXcgQUJ1ZmZlcihrQWdncmVnYXRlQnVmZmVyU2l6ZUJ5dGVzKTsKKyAgICAgICAgbUFnZ3JlZ2F0ZUJ1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7IC8vIHN0YXJ0IGVtcHR5CisgICAgfQorCisgICAgaWYgKG1BZ2dyZWdhdGVCdWZmZXIgIT0gTlVMTCkgeworICAgICAgICBpbnQ2NF90IHRpbWVVczsKKyAgICAgICAgaW50NjRfdCBkdW1teTsKKyAgICAgICAgYm9vbCBzbWFsbFRpbWVzdGFtcFZhbGlkID0gYWNjZXNzVW5pdC0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpOworICAgICAgICBib29sIGJpZ1RpbWVzdGFtcFZhbGlkID0gbUFnZ3JlZ2F0ZUJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZkdW1teSk7CisgICAgICAgIC8vIFdpbGwgdGhlIHNtYWxsZXIgYnVmZmVyIGZpdD8KKyAgICAgICAgc2l6ZV90IGJpZ1NpemUgPSBtQWdncmVnYXRlQnVmZmVyLT5zaXplKCk7CisgICAgICAgIHNpemVfdCByb29tTGVmdCA9IG1BZ2dyZWdhdGVCdWZmZXItPmNhcGFjaXR5KCkgLSBiaWdTaXplOworICAgICAgICAvLyBTaG91bGQgd2Ugc2F2ZSB0aGlzIHNtYWxsIGJ1ZmZlciBmb3IgdGhlIG5leHQgYmlnIGJ1ZmZlcj8KKyAgICAgICAgLy8gSWYgdGhlIGZpcnN0IHNtYWxsIGJ1ZmZlciBkaWQgbm90IGhhdmUgYSB0aW1lc3RhbXAgdGhlbiBzYXZlCisgICAgICAgIC8vIGFueSBidWZmZXIgdGhhdCBkb2VzIGhhdmUgYSB0aW1lc3RhbXAgdW50aWwgdGhlIG5leHQgYmlnIGJ1ZmZlci4KKyAgICAgICAgaWYgKChzbWFsbFNpemUgPiByb29tTGVmdCkKKyAgICAgICAgICAgIHx8ICghYmlnVGltZXN0YW1wVmFsaWQgJiYgKGJpZ1NpemUgPiAwKSAmJiBzbWFsbFRpbWVzdGFtcFZhbGlkKSkgeworICAgICAgICAgICAgbVBlbmRpbmdBdWRpb0VyciA9IE9LOworICAgICAgICAgICAgbVBlbmRpbmdBdWRpb0FjY2Vzc1VuaXQgPSBhY2Nlc3NVbml0OworICAgICAgICAgICAgYWdncmVnYXRlID0gbUFnZ3JlZ2F0ZUJ1ZmZlcjsKKyAgICAgICAgICAgIG1BZ2dyZWdhdGVCdWZmZXIuY2xlYXIoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIEdyYWIgdGltZSBmcm9tIGZpcnN0IHNtYWxsIGJ1ZmZlciBpZiBhdmFpbGFibGUuCisgICAgICAgICAgICBpZiAoKGJpZ1NpemUgPT0gMCkgJiYgc21hbGxUaW1lc3RhbXBWYWxpZCkgeworICAgICAgICAgICAgICAgIG1BZ2dyZWdhdGVCdWZmZXItPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBBcHBlbmQgc21hbGwgYnVmZmVyIHRvIHRoZSBiaWdnZXIgYnVmZmVyLgorICAgICAgICAgICAgbWVtY3B5KG1BZ2dyZWdhdGVCdWZmZXItPmJhc2UoKSArIGJpZ1NpemUsIGFjY2Vzc1VuaXQtPmRhdGEoKSwgc21hbGxTaXplKTsKKyAgICAgICAgICAgIGJpZ1NpemUgKz0gc21hbGxTaXplOworICAgICAgICAgICAgbUFnZ3JlZ2F0ZUJ1ZmZlci0+c2V0UmFuZ2UoMCwgYmlnU2l6ZSk7CisKKyAgICAgICAgICAgIEFMT0dWKCJmZWVkRGVjb2RlcklucHV0RGF0YSgpIHNtYWxsU2l6ZSA9ICV6dSwgYmlnU2l6ZSA9ICV6dSwgY2FwYWNpdHkgPSAlenUiLAorICAgICAgICAgICAgICAgICAgICBzbWFsbFNpemUsIGJpZ1NpemUsIG1BZ2dyZWdhdGVCdWZmZXItPmNhcGFjaXR5KCkpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gZGVjaWRlZCBub3QgdG8gYWdncmVnYXRlCisgICAgICAgIGFnZ3JlZ2F0ZSA9IGFjY2Vzc1VuaXQ7CisgICAgfQorCisgICAgcmV0dXJuIGFnZ3JlZ2F0ZTsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpEZWNvZGVyUGFzc1Rocm91Z2g6OmZldGNoSW5wdXREYXRhKHNwPEFNZXNzYWdlPiAmcmVwbHkpIHsKKyAgICBzcDxBQnVmZmVyPiBhY2Nlc3NVbml0OworCisgICAgZG8geworICAgICAgICBzdGF0dXNfdCBlcnIgPSBkZXF1ZXVlQWNjZXNzVW5pdCgmYWNjZXNzVW5pdCk7CisKKyAgICAgICAgaWYgKGVyciA9PSAtRVdPVUxEQkxPQ0spIHsKKyAgICAgICAgICAgIC8vIEZsdXNoIG91dCB0aGUgYWdncmVnYXRlIGJ1ZmZlciB0byB0cnkgdG8gYXZvaWQgdW5kZXJydW4uCisgICAgICAgICAgICBhY2Nlc3NVbml0ID0gYWdncmVnYXRlQnVmZmVyKE5VTEwgLyogYWNjZXNzVW5pdCAqLyk7CisgICAgICAgICAgICBpZiAoYWNjZXNzVW5pdCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9IGVsc2UgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgaWYgKGVyciA9PSBJTkZPX0RJU0NPTlRJTlVJVFkpIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHR5cGU7CisgICAgICAgICAgICAgICAgQ0hFQ0soYWNjZXNzVW5pdC0+bWV0YSgpLT5maW5kSW50MzIoImRpc2NvbnRpbnVpdHkiLCAmdHlwZSkpOworCisgICAgICAgICAgICAgICAgYm9vbCBmb3JtYXRDaGFuZ2UgPQorICAgICAgICAgICAgICAgICAgICAgICAgKHR5cGUgJiBBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfQVVESU9fRk9STUFUKSAhPSAwOworCisgICAgICAgICAgICAgICAgYm9vbCB0aW1lQ2hhbmdlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICh0eXBlICYgQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX1RJTUUpICE9IDA7CisKKyAgICAgICAgICAgICAgICBBTE9HSSgiYXVkaW8gZGlzY29udGludWl0eSAoZm9ybWF0Q2hhbmdlPSVkLCB0aW1lPSVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRDaGFuZ2UsIHRpbWVDaGFuZ2UpOworCisgICAgICAgICAgICAgICAgaWYgKGZvcm1hdENoYW5nZSB8fCB0aW1lQ2hhbmdlKSB7CisgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigid2hhdCIsIGtXaGF0SW5wdXREaXNjb250aW51aXR5KTsKKyAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCBwZXJmb3JtIHNlYW1sZXNzIGZvcm1hdCBjaGFuZ2UsCisgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgbm90aWZ5IE51UGxheWVyMiB0byBzY2FuIHNvdXJjZXMKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiZm9ybWF0Q2hhbmdlIiwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGltZUNoYW5nZSkgeworICAgICAgICAgICAgICAgICAgICBkb0ZsdXNoKGZhbHNlIC8qIG5vdGlmeUNvbXBsZXRlICovKTsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gT0s7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtYXRDaGFuZ2UpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZG8gc2VhbWxlc3MgZm9ybWF0IGNoYW5nZQorICAgICAgICAgICAgICAgICAgICBlcnIgPSBPSzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHN0cmVhbSBpcyB1bmFmZmVjdGVkIGJ5IHRoZSBkaXNjb250aW51aXR5CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRVdPVUxEQkxPQ0s7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXBseS0+c2V0SW50MzIoImVyciIsIGVycik7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKworICAgICAgICBhY2Nlc3NVbml0ID0gYWdncmVnYXRlQnVmZmVyKGFjY2Vzc1VuaXQpOworICAgIH0gd2hpbGUgKGFjY2Vzc1VuaXQgPT0gTlVMTCk7CisKKyNpZiAwCisgICAgaW50NjRfdCBtZWRpYVRpbWVVczsKKyAgICBDSEVDSyhhY2Nlc3NVbml0LT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJm1lZGlhVGltZVVzKSk7CisgICAgQUxPR1YoImZlZWRpbmcgYXVkaW8gaW5wdXQgYnVmZmVyIGF0IG1lZGlhIHRpbWUgJS4yZiBzZWNzIiwKKyAgICAgICAgIG1lZGlhVGltZVVzIC8gMUU2KTsKKyNlbmRpZgorCisgICAgcmVwbHktPnNldEJ1ZmZlcigiYnVmZmVyIiwgYWNjZXNzVW5pdCk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpEZWNvZGVyUGFzc1Rocm91Z2g6Om9uSW5wdXRCdWZmZXJGZXRjaGVkKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIGlmIChtUmVhY2hlZEVPUykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyOworICAgIGJvb2wgaGFzQnVmZmVyID0gbXNnLT5maW5kQnVmZmVyKCJidWZmZXIiLCAmYnVmZmVyKTsKKyAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgaW50MzJfdCBzdHJlYW1FcnIgPSBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZXJyIiwgJnN0cmVhbUVycikgfHwgIWhhc0J1ZmZlcik7CisgICAgICAgIGlmIChzdHJlYW1FcnIgPT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdHJlYW1FcnIgIT0gRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICAgICAgaGFuZGxlRXJyb3Ioc3RyZWFtRXJyKTsKKyAgICAgICAgfQorICAgICAgICBtUmVhY2hlZEVPUyA9IHRydWU7CisgICAgICAgIGlmIChtUmVuZGVyZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgbVJlbmRlcmVyLT5xdWV1ZUVPUyh0cnVlIC8qIGF1ZGlvICovLCBFUlJPUl9FTkRfT0ZfU1RSRUFNKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3A8QU1lc3NhZ2U+IGV4dHJhOworICAgIGlmIChidWZmZXItPm1ldGEoKS0+ZmluZE1lc3NhZ2UoImV4dHJhIiwgJmV4dHJhKSAmJiBleHRyYSAhPSBOVUxMKSB7CisgICAgICAgIGludDY0X3QgcmVzdW1lQXRNZWRpYVRpbWVVczsKKyAgICAgICAgaWYgKGV4dHJhLT5maW5kSW50NjQoCisgICAgICAgICAgICAgICAgICAgICJyZXN1bWUtYXQtbWVkaWF0aW1lVXMiLCAmcmVzdW1lQXRNZWRpYVRpbWVVcykpIHsKKyAgICAgICAgICAgIEFMT0dJKCJbJXNdIHN1cHByZXNzaW5nIHJlbmRlcmluZyB1bnRpbCAlbGxkIHVzIiwKKyAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgKGxvbmcgbG9uZylyZXN1bWVBdE1lZGlhVGltZVVzKTsKKyAgICAgICAgICAgIG1Ta2lwUmVuZGVyaW5nVW50aWxNZWRpYVRpbWVVcyA9IHJlc3VtZUF0TWVkaWFUaW1lVXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnQzMl90IGJ1ZmZlclNpemUgPSBidWZmZXItPnNpemUoKTsKKyAgICBtQ2FjaGVkQnl0ZXMgKz0gYnVmZmVyU2l6ZTsKKworICAgIGludDY0X3QgdGltZVVzID0gMDsKKyAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7CisgICAgaWYgKG1Ta2lwUmVuZGVyaW5nVW50aWxNZWRpYVRpbWVVcyA+PSAwKSB7CisgICAgICAgIGlmICh0aW1lVXMgPCBtU2tpcFJlbmRlcmluZ1VudGlsTWVkaWFUaW1lVXMpIHsKKyAgICAgICAgICAgIEFMT0dWKCJbJXNdIGRyb3BwaW5nIGJ1ZmZlciBhdCB0aW1lICVsbGQgYXMgcmVxdWVzdGVkLiIsCisgICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCAobG9uZyBsb25nKXRpbWVVcyk7CisKKyAgICAgICAgICAgIG9uQnVmZmVyQ29uc3VtZWQoYnVmZmVyU2l6ZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBtU2tpcFJlbmRlcmluZ1VudGlsTWVkaWFUaW1lVXMgPSAtMTsKKyAgICB9CisKKyAgICBpZiAobVJlbmRlcmVyID09IE5VTEwpIHsKKyAgICAgICAgb25CdWZmZXJDb25zdW1lZChidWZmZXJTaXplKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZShrV2hhdEJ1ZmZlckNvbnN1bWVkLCB0aGlzKTsKKyAgICByZXBseS0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtQnVmZmVyR2VuZXJhdGlvbik7CisgICAgcmVwbHktPnNldEludDMyKCJzaXplIiwgYnVmZmVyU2l6ZSk7CisKKyAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBtY0J1ZmZlciA9IG5ldyBNZWRpYUNvZGVjQnVmZmVyKG51bGxwdHIsIGJ1ZmZlcik7CisgICAgbWNCdWZmZXItPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CisKKyAgICBtUmVuZGVyZXItPnF1ZXVlQnVmZmVyKHRydWUgLyogYXVkaW8gKi8sIG1jQnVmZmVyLCByZXBseSk7CisKKyAgICArK21QZW5kaW5nQnVmZmVyc1RvRHJhaW47CisgICAgQUxPR1YoIm9uSW5wdXRCdWZmZXJGaWxsZWQ6ICNUb0RyYWluID0gJXp1LCBjYWNoZWRCeXRlcyA9ICV6dSIsCisgICAgICAgICAgICBtUGVuZGluZ0J1ZmZlcnNUb0RyYWluLCBtQ2FjaGVkQnl0ZXMpOworfQorCit2b2lkIE51UGxheWVyMjo6RGVjb2RlclBhc3NUaHJvdWdoOjpvbkJ1ZmZlckNvbnN1bWVkKGludDMyX3Qgc2l6ZSkgeworICAgIC0tbVBlbmRpbmdCdWZmZXJzVG9EcmFpbjsKKyAgICBtQ2FjaGVkQnl0ZXMgLT0gc2l6ZTsKKyAgICBBTE9HVigib25CdWZmZXJDb25zdW1lZDogI1RvRHJhaW4gPSAlenUsIGNhY2hlZEJ5dGVzID0gJXp1IiwKKyAgICAgICAgICAgIG1QZW5kaW5nQnVmZmVyc1RvRHJhaW4sIG1DYWNoZWRCeXRlcyk7CisgICAgb25SZXF1ZXN0SW5wdXRCdWZmZXJzKCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpEZWNvZGVyUGFzc1Rocm91Z2g6Om9uUmVzdW1lKGJvb2wgbm90aWZ5Q29tcGxldGUpIHsKKyAgICBtUGF1c2VkID0gZmFsc2U7CisKKyAgICBvblJlcXVlc3RJbnB1dEJ1ZmZlcnMoKTsKKworICAgIGlmIChub3RpZnlDb21wbGV0ZSkgeworICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFJlc3VtZUNvbXBsZXRlZCk7CisgICAgICAgIG5vdGlmeS0+cG9zdCgpOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjI6OkRlY29kZXJQYXNzVGhyb3VnaDo6ZG9GbHVzaChib29sIG5vdGlmeUNvbXBsZXRlKSB7CisgICAgKyttQnVmZmVyR2VuZXJhdGlvbjsKKyAgICBtU2tpcFJlbmRlcmluZ1VudGlsTWVkaWFUaW1lVXMgPSAtMTsKKyAgICBtUGVuZGluZ0F1ZGlvQWNjZXNzVW5pdC5jbGVhcigpOworICAgIG1QZW5kaW5nQXVkaW9FcnIgPSBPSzsKKyAgICBtQWdncmVnYXRlQnVmZmVyLmNsZWFyKCk7CisKKyAgICBpZiAobVJlbmRlcmVyICE9IE5VTEwpIHsKKyAgICAgICAgbVJlbmRlcmVyLT5mbHVzaCh0cnVlIC8qIGF1ZGlvICovLCBub3RpZnlDb21wbGV0ZSk7CisgICAgICAgIG1SZW5kZXJlci0+c2lnbmFsVGltZURpc2NvbnRpbnVpdHkoKTsKKyAgICB9CisKKyAgICBtUGVuZGluZ0J1ZmZlcnNUb0RyYWluID0gMDsKKyAgICBtQ2FjaGVkQnl0ZXMgPSAwOworICAgIG1SZWFjaGVkRU9TID0gZmFsc2U7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpEZWNvZGVyUGFzc1Rocm91Z2g6Om9uRmx1c2goKSB7CisgICAgZG9GbHVzaCh0cnVlIC8qIG5vdGlmeUNvbXBsZXRlICovKTsKKworICAgIG1QYXVzZWQgPSB0cnVlOworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRGbHVzaENvbXBsZXRlZCk7CisgICAgbm90aWZ5LT5wb3N0KCk7CisKK30KKwordm9pZCBOdVBsYXllcjI6OkRlY29kZXJQYXNzVGhyb3VnaDo6b25TaHV0ZG93bihib29sIG5vdGlmeUNvbXBsZXRlKSB7CisgICAgKyttQnVmZmVyR2VuZXJhdGlvbjsKKyAgICBtU2tpcFJlbmRlcmluZ1VudGlsTWVkaWFUaW1lVXMgPSAtMTsKKworICAgIGlmIChub3RpZnlDb21wbGV0ZSkgeworICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFNodXRkb3duQ29tcGxldGVkKTsKKyAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgfQorCisgICAgbVJlYWNoZWRFT1MgPSB0cnVlOworfQorCit2b2lkIE51UGxheWVyMjo6RGVjb2RlclBhc3NUaHJvdWdoOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIEFMT0dWKCJbJXNdIG9uTWVzc2FnZTogJXMiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpLAorICAgICAgICAgICAgbXNnLT5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOworCisgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICBjYXNlIGtXaGF0QnVmZmVyQ29uc3VtZWQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghaXNTdGFsZVJlcGx5KG1zZykpIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHNpemU7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInNpemUiLCAmc2l6ZSkpOworICAgICAgICAgICAgICAgIG9uQnVmZmVyQ29uc3VtZWQoc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBEZWNvZGVyQmFzZTo6b25NZXNzYWdlUmVjZWl2ZWQobXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL251cGxheWVyMi9OdVBsYXllcjJEZWNvZGVyUGFzc1Rocm91Z2guaCBiL21lZGlhL2xpYm1lZGlhL251cGxheWVyMi9OdVBsYXllcjJEZWNvZGVyUGFzc1Rocm91Z2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzhjNjBhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvbnVwbGF5ZXIyL051UGxheWVyMkRlY29kZXJQYXNzVGhyb3VnaC5oCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTlVQTEFZRVIyX0RFQ09ERVJfUEFTU19USFJPVUdIX0hfCisKKyNkZWZpbmUgTlVQTEFZRVIyX0RFQ09ERVJfUEFTU19USFJPVUdIX0hfCisKKyNpbmNsdWRlICJOdVBsYXllcjIuaCIKKworI2luY2x1ZGUgIk51UGxheWVyMkRlY29kZXJCYXNlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IE51UGxheWVyMjo6RGVjb2RlclBhc3NUaHJvdWdoIDogcHVibGljIERlY29kZXJCYXNlIHsKKyAgICBEZWNvZGVyUGFzc1Rocm91Z2goY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFNvdXJjZT4gJnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8UmVuZGVyZXI+ICZyZW5kZXJlcik7CisKK3Byb3RlY3RlZDoKKworICAgIHZpcnR1YWwgfkRlY29kZXJQYXNzVGhyb3VnaCgpOworCisgICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKworICAgIHZpcnR1YWwgdm9pZCBvbkNvbmZpZ3VyZShjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCk7CisgICAgdmlydHVhbCB2b2lkIG9uU2V0UGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJnBhcmFtcyk7CisgICAgdmlydHVhbCB2b2lkIG9uU2V0UmVuZGVyZXIoY29uc3Qgc3A8UmVuZGVyZXI+ICZyZW5kZXJlcik7CisgICAgdmlydHVhbCB2b2lkIG9uUmVzdW1lKGJvb2wgbm90aWZ5Q29tcGxldGUpOworICAgIHZpcnR1YWwgdm9pZCBvbkZsdXNoKCk7CisgICAgdmlydHVhbCB2b2lkIG9uU2h1dGRvd24oYm9vbCBub3RpZnlDb21wbGV0ZSk7CisgICAgdmlydHVhbCBib29sIGRvUmVxdWVzdEJ1ZmZlcnMoKTsKKworcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAga1doYXRCdWZmZXJDb25zdW1lZCAgICAgPSAnYnVmQycsCisgICAgfTsKKworICAgIHNwPFNvdXJjZT4gbVNvdXJjZTsKKyAgICBzcDxSZW5kZXJlcj4gbVJlbmRlcmVyOworICAgIGludDY0X3QgbVNraXBSZW5kZXJpbmdVbnRpbE1lZGlhVGltZVVzOworCisgICAgYm9vbCAgICBtUmVhY2hlZEVPUzsKKworICAgIC8vIFVzZWQgYnkgZmVlZERlY29kZXJJbnB1dERhdGEgdG8gYWdncmVnYXRlIHNtYWxsIGJ1ZmZlcnMgaW50bworICAgIC8vIG9uZSBsYXJnZSBidWZmZXIuCisgICAgc3A8QUJ1ZmZlcj4gbVBlbmRpbmdBdWRpb0FjY2Vzc1VuaXQ7CisgICAgc3RhdHVzX3QgICAgbVBlbmRpbmdBdWRpb0VycjsKKyAgICBzcDxBQnVmZmVyPiBtQWdncmVnYXRlQnVmZmVyOworCisgICAgLy8gbVBlbmRpbmdCdWZmZXJzVG9EcmFpbiBhcmUgb25seSBmb3IgZGVidWdnaW5nLiBJdCBjYW4gYmUgcmVtb3ZlZAorICAgIC8vIHdoZW4gdGhlIHBvd2VyIGludmVzdGlnYXRpb24gaXMgZG9uZS4KKyAgICBzaXplX3QgIG1QZW5kaW5nQnVmZmVyc1RvRHJhaW47CisgICAgc2l6ZV90ICBtQ2FjaGVkQnl0ZXM7CisgICAgQVN0cmluZyBtQ29tcG9uZW50TmFtZTsKKworICAgIGJvb2wgaXNTdGFsZVJlcGx5KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICBib29sIGlzRG9uZUZldGNoaW5nKCkgY29uc3Q7CisKKyAgICBzdGF0dXNfdCBkZXF1ZXVlQWNjZXNzVW5pdChzcDxBQnVmZmVyPiAqYWNjZXNzVW5pdCk7CisgICAgc3A8QUJ1ZmZlcj4gYWdncmVnYXRlQnVmZmVyKGNvbnN0IHNwPEFCdWZmZXI+ICZhY2Nlc3NVbml0KTsKKyAgICBzdGF0dXNfdCBmZXRjaElucHV0RGF0YShzcDxBTWVzc2FnZT4gJnJlcGx5KTsKKyAgICB2b2lkIGRvRmx1c2goYm9vbCBub3RpZnlDb21wbGV0ZSk7CisKKyAgICB2b2lkIG9uSW5wdXRCdWZmZXJGZXRjaGVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2b2lkIG9uQnVmZmVyQ29uc3VtZWQoaW50MzJfdCBzaXplKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKERlY29kZXJQYXNzVGhyb3VnaCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE5VUExBWUVSMl9ERUNPREVSX1BBU1NfVEhST1VHSF9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvbnVwbGF5ZXIyL051UGxheWVyMkRyaXZlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9udXBsYXllcjIvTnVQbGF5ZXIyRHJpdmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGU0MmU3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvbnVwbGF5ZXIyL051UGxheWVyMkRyaXZlci5jcHAKQEAgLTAsMCArMSwxMTQ3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk51UGxheWVyMkRyaXZlciIKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisKKyNpbmNsdWRlICJOdVBsYXllcjJEcml2ZXIuaCIKKworI2luY2x1ZGUgIk51UGxheWVyMi5oIgorI2luY2x1ZGUgIk51UGxheWVyMlNvdXJjZS5oIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDbG9jay5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KKworI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUFuYWx5dGljc1NlcnZpY2UuaD4KKworc3RhdGljIGNvbnN0IGludCBrRHVtcExvY2tSZXRyaWVzID0gNTA7CitzdGF0aWMgY29uc3QgaW50IGtEdW1wTG9ja1NsZWVwVXMgPSAyMDAwMDsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBrZXkgZm9yIG1lZGlhIHN0YXRpc3RpY3MKK3N0YXRpYyBjb25zdCBjaGFyICprS2V5UGxheWVyID0gIm51cGxheWVyMiI7CisvLyBhdHRycyBmb3IgbWVkaWEgc3RhdGlzdGljcworc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJWTWltZSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLnZpZGVvLm1pbWUiOworc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJWQ29kZWMgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci52aWRlby5jb2RlYyI7CitzdGF0aWMgY29uc3QgY2hhciAqa1BsYXllcldpZHRoID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIud2lkdGgiOworc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJIZWlnaHQgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5oZWlnaHQiOworc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJGcmFtZXMgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5mcmFtZXMiOworc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJGcmFtZXNEcm9wcGVkID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZHJvcHBlZCI7CitzdGF0aWMgY29uc3QgY2hhciAqa1BsYXllckFNaW1lID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuYXVkaW8ubWltZSI7CitzdGF0aWMgY29uc3QgY2hhciAqa1BsYXllckFDb2RlYyA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmF1ZGlvLmNvZGVjIjsKK3N0YXRpYyBjb25zdCBjaGFyICprUGxheWVyRHVyYXRpb24gPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5kdXJhdGlvbk1zIjsKK3N0YXRpYyBjb25zdCBjaGFyICprUGxheWVyUGxheWluZyA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLnBsYXlpbmdNcyI7CitzdGF0aWMgY29uc3QgY2hhciAqa1BsYXllckVycm9yID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZXJyIjsKK3N0YXRpYyBjb25zdCBjaGFyICprUGxheWVyRXJyb3JDb2RlID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZXJyY29kZSI7CitzdGF0aWMgY29uc3QgY2hhciAqa1BsYXllckVycm9yU3RhdGUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5lcnJzdGF0ZSI7CitzdGF0aWMgY29uc3QgY2hhciAqa1BsYXllckRhdGFTb3VyY2VUeXBlID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZGF0YVNvdXJjZSI7CisvLworc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJSZWJ1ZmZlcmluZyA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLnJlYnVmZmVyaW5nTXMiOworc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJSZWJ1ZmZlcmluZ0NvdW50ID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIucmVidWZmZXJzIjsKK3N0YXRpYyBjb25zdCBjaGFyICprUGxheWVyUmVidWZmZXJpbmdBdEV4aXQgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5yZWJ1ZmZlckV4aXQiOworCisKK051UGxheWVyMkRyaXZlcjo6TnVQbGF5ZXIyRHJpdmVyKHBpZF90IHBpZCkKKyAgICA6IG1TdGF0ZShTVEFURV9JRExFKSwKKyAgICAgIG1Jc0FzeW5jUHJlcGFyZShmYWxzZSksCisgICAgICBtQXN5bmNSZXN1bHQoVU5LTk9XTl9FUlJPUiksCisgICAgICBtU2V0U3VyZmFjZUluUHJvZ3Jlc3MoZmFsc2UpLAorICAgICAgbUR1cmF0aW9uVXMoLTEpLAorICAgICAgbVBvc2l0aW9uVXMoLTEpLAorICAgICAgbVNlZWtJblByb2dyZXNzKGZhbHNlKSwKKyAgICAgIG1QbGF5aW5nVGltZVVzKDApLAorICAgICAgbVJlYnVmZmVyaW5nVGltZVVzKDApLAorICAgICAgbVJlYnVmZmVyaW5nRXZlbnRzKDApLAorICAgICAgbVJlYnVmZmVyaW5nQXRFeGl0KGZhbHNlKSwKKyAgICAgIG1Mb29wZXIobmV3IEFMb29wZXIpLAorICAgICAgbU51UGxheWVyMkxvb3BlcihuZXcgQUxvb3BlciksCisgICAgICBtTWVkaWFDbG9jayhuZXcgTWVkaWFDbG9jayksCisgICAgICBtUGxheWVyKG5ldyBOdVBsYXllcjIocGlkLCBtTWVkaWFDbG9jaykpLAorICAgICAgbVBsYXllckZsYWdzKDApLAorICAgICAgbUFuYWx5dGljc0l0ZW0oTlVMTCksCisgICAgICBtQ2xpZW50VWlkKC0xKSwKKyAgICAgIG1BdEVPUyhmYWxzZSksCisgICAgICBtTG9vcGluZyhmYWxzZSksCisgICAgICBtQXV0b0xvb3AoZmFsc2UpIHsKKyAgICBBTE9HRCgiTnVQbGF5ZXIyRHJpdmVyKCVwKSBjcmVhdGVkLCBjbGllbnRQaWQoJWQpIiwgdGhpcywgcGlkKTsKKyAgICBtTG9vcGVyLT5zZXROYW1lKCJOdVBsYXllcjJEcml2ZXIgTG9vcGVyIik7CisgICAgbU51UGxheWVyMkxvb3Blci0+c2V0TmFtZSgiTnVQbGF5ZXIyIExvb3BlciIpOworCisgICAgbU1lZGlhQ2xvY2stPmluaXQoKTsKKworICAgIC8vIHNldCB1cCBhbiBhbmFseXRpY3MgcmVjb3JkCisgICAgbUFuYWx5dGljc0l0ZW0gPSBuZXcgTWVkaWFBbmFseXRpY3NJdGVtKGtLZXlQbGF5ZXIpOworICAgIG1BbmFseXRpY3NJdGVtLT5nZW5lcmF0ZVNlc3Npb25JRCgpOworCisgICAgbU51UGxheWVyMkxvb3Blci0+c3RhcnQoCisgICAgICAgICAgICBmYWxzZSwgLyogcnVuT25DYWxsaW5nVGhyZWFkICovCisgICAgICAgICAgICB0cnVlLCAgLyogY2FuQ2FsbEphdmEgKi8KKyAgICAgICAgICAgIFBSSU9SSVRZX0FVRElPKTsKKworICAgIG1OdVBsYXllcjJMb29wZXItPnJlZ2lzdGVySGFuZGxlcihtUGxheWVyKTsKKworICAgIG1QbGF5ZXItPnNldERyaXZlcih0aGlzKTsKK30KKworTnVQbGF5ZXIyRHJpdmVyOjp+TnVQbGF5ZXIyRHJpdmVyKCkgeworICAgIEFMT0dWKCJ+TnVQbGF5ZXIyRHJpdmVyKCVwKSIsIHRoaXMpOworICAgIG1OdVBsYXllcjJMb29wZXItPnN0b3AoKTsKKyAgICBtTG9vcGVyLT5zdG9wKCk7CisKKyAgICAvLyBmaW5hbGl6ZSBhbnkgcGVuZGluZyBtZXRyaWNzLCB1c3VhbGx5IGEgbm8tb3AuCisgICAgdXBkYXRlTWV0cmljcygiZGVzdHJ1Y3RvciIpOworICAgIGxvZ01ldHJpY3MoImRlc3RydWN0b3IiKTsKKworICAgIGlmIChtQW5hbHl0aWNzSXRlbSAhPSBOVUxMKSB7CisgICAgICAgIGRlbGV0ZSBtQW5hbHl0aWNzSXRlbTsKKyAgICAgICAgbUFuYWx5dGljc0l0ZW0gPSBOVUxMOworICAgIH0KK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjppbml0Q2hlY2soKSB7CisgICAgbUxvb3Blci0+c3RhcnQoCisgICAgICAgICAgICBmYWxzZSwgLyogcnVuT25DYWxsaW5nVGhyZWFkICovCisgICAgICAgICAgICB0cnVlLCAgLyogY2FuQ2FsbEphdmEgKi8KKyAgICAgICAgICAgIFBSSU9SSVRZX0FVRElPKTsKKworICAgIG1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcih0aGlzKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE51UGxheWVyMkRyaXZlcjo6c2V0VUlEKHVpZF90IHVpZCkgeworICAgIG1QbGF5ZXItPnNldFVJRCh1aWQpOworICAgIG1DbGllbnRVaWQgPSB1aWQ7CisgICAgaWYgKG1BbmFseXRpY3NJdGVtKSB7CisgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRVaWQobUNsaWVudFVpZCk7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OnNldERhdGFTb3VyY2UoCisgICAgICAgIGNvbnN0IHNwPE1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgY29uc3QgY2hhciAqdXJsLAorICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgeworICAgIEFMT0dWKCJzZXREYXRhU291cmNlKCVwKSB1cmwoJXMpIiwgdGhpcywgdXJpRGVidWdTdHJpbmcodXJsLCBmYWxzZSkuY19zdHIoKSk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfSURMRSkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgbVN0YXRlID0gU1RBVEVfU0VUX0RBVEFTT1VSQ0VfUEVORElORzsKKworICAgIG1QbGF5ZXItPnNldERhdGFTb3VyY2VBc3luYyhodHRwU2VydmljZSwgdXJsLCBoZWFkZXJzKTsKKworICAgIHdoaWxlIChtU3RhdGUgPT0gU1RBVEVfU0VUX0RBVEFTT1VSQ0VfUEVORElORykgeworICAgICAgICBtQ29uZGl0aW9uLndhaXQobUxvY2spOworICAgIH0KKworICAgIHJldHVybiBtQXN5bmNSZXN1bHQ7Cit9CisKK3N0YXR1c190IE51UGxheWVyMkRyaXZlcjo6c2V0RGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkgeworICAgIEFMT0dWKCJzZXREYXRhU291cmNlKCVwKSBmaWxlKCVkKSIsIHRoaXMsIGZkKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9JRExFKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBtU3RhdGUgPSBTVEFURV9TRVRfREFUQVNPVVJDRV9QRU5ESU5HOworCisgICAgbVBsYXllci0+c2V0RGF0YVNvdXJjZUFzeW5jKGZkLCBvZmZzZXQsIGxlbmd0aCk7CisKKyAgICB3aGlsZSAobVN0YXRlID09IFNUQVRFX1NFVF9EQVRBU09VUkNFX1BFTkRJTkcpIHsKKyAgICAgICAgbUNvbmRpdGlvbi53YWl0KG1Mb2NrKTsKKyAgICB9CisKKyAgICByZXR1cm4gbUFzeW5jUmVzdWx0OworfQorCitzdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OnNldERhdGFTb3VyY2UoY29uc3Qgc3A8SVN0cmVhbVNvdXJjZT4gJnNvdXJjZSkgeworICAgIEFMT0dWKCJzZXREYXRhU291cmNlKCVwKSBzdHJlYW0gc291cmNlIiwgdGhpcyk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfSURMRSkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgbVN0YXRlID0gU1RBVEVfU0VUX0RBVEFTT1VSQ0VfUEVORElORzsKKworICAgIG1QbGF5ZXItPnNldERhdGFTb3VyY2VBc3luYyhzb3VyY2UpOworCisgICAgd2hpbGUgKG1TdGF0ZSA9PSBTVEFURV9TRVRfREFUQVNPVVJDRV9QRU5ESU5HKSB7CisgICAgICAgIG1Db25kaXRpb24ud2FpdChtTG9jayk7CisgICAgfQorCisgICAgcmV0dXJuIG1Bc3luY1Jlc3VsdDsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpzZXREYXRhU291cmNlKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UpIHsKKyAgICBBTE9HVigic2V0RGF0YVNvdXJjZSglcCkgY2FsbGJhY2sgc291cmNlIiwgdGhpcyk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfSURMRSkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgbVN0YXRlID0gU1RBVEVfU0VUX0RBVEFTT1VSQ0VfUEVORElORzsKKworICAgIG1QbGF5ZXItPnNldERhdGFTb3VyY2VBc3luYyhzb3VyY2UpOworCisgICAgd2hpbGUgKG1TdGF0ZSA9PSBTVEFURV9TRVRfREFUQVNPVVJDRV9QRU5ESU5HKSB7CisgICAgICAgIG1Db25kaXRpb24ud2FpdChtTG9jayk7CisgICAgfQorCisgICAgcmV0dXJuIG1Bc3luY1Jlc3VsdDsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpzZXRWaWRlb1N1cmZhY2VUZXh0dXJlKGNvbnN0IHNwPEFOYXRpdmVXaW5kb3dXcmFwcGVyPiAmbnd3KSB7CisgICAgQUxPR1YoInNldFZpZGVvU3VyZmFjZVRleHR1cmUoJXApIiwgdGhpcyk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChtU2V0U3VyZmFjZUluUHJvZ3Jlc3MpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHN3aXRjaCAobVN0YXRlKSB7CisgICAgICAgIGNhc2UgU1RBVEVfU0VUX0RBVEFTT1VSQ0VfUEVORElORzoKKyAgICAgICAgY2FzZSBTVEFURV9SRVNFVF9JTl9QUk9HUkVTUzoKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgbVNldFN1cmZhY2VJblByb2dyZXNzID0gdHJ1ZTsKKworICAgIG1QbGF5ZXItPnNldFZpZGVvU3VyZmFjZVRleHR1cmVBc3luYyhud3cpOworCisgICAgd2hpbGUgKG1TZXRTdXJmYWNlSW5Qcm9ncmVzcykgeworICAgICAgICBtQ29uZGl0aW9uLndhaXQobUxvY2spOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpnZXRCdWZmZXJpbmdTZXR0aW5ncyhCdWZmZXJpbmdTZXR0aW5ncyogYnVmZmVyaW5nKSB7CisgICAgQUxPR1YoImdldEJ1ZmZlcmluZ1NldHRpbmdzKCVwKSIsIHRoaXMpOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9JRExFKSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbVBsYXllci0+Z2V0QnVmZmVyaW5nU2V0dGluZ3MoYnVmZmVyaW5nKTsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpzZXRCdWZmZXJpbmdTZXR0aW5ncyhjb25zdCBCdWZmZXJpbmdTZXR0aW5ncyYgYnVmZmVyaW5nKSB7CisgICAgQUxPR1YoInNldEJ1ZmZlcmluZ1NldHRpbmdzKCVwKSIsIHRoaXMpOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9JRExFKSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbVBsYXllci0+c2V0QnVmZmVyaW5nU2V0dGluZ3MoYnVmZmVyaW5nKTsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpwcmVwYXJlKCkgeworICAgIEFMT0dWKCJwcmVwYXJlKCVwKSIsIHRoaXMpOworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgcmV0dXJuIHByZXBhcmVfbCgpOworfQorCitzdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OnByZXBhcmVfbCgpIHsKKyAgICBzd2l0Y2ggKG1TdGF0ZSkgeworICAgICAgICBjYXNlIFNUQVRFX1VOUFJFUEFSRUQ6CisgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9QUkVQQVJJTkc7CisKKyAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSdyZSBub3QgcG9zdGluZyBhbnkgbm90aWZpY2F0aW9ucywgc3VjY2VzcyBvcgorICAgICAgICAgICAgLy8gZmFpbHVyZSBpbmZvcm1hdGlvbiBpcyBvbmx5IGNvbW11bmljYXRlZCB0aHJvdWdoIG91ciByZXN1bHQKKyAgICAgICAgICAgIC8vIGNvZGUuCisgICAgICAgICAgICBtSXNBc3luY1ByZXBhcmUgPSBmYWxzZTsKKyAgICAgICAgICAgIG1QbGF5ZXItPnByZXBhcmVBc3luYygpOworICAgICAgICAgICAgd2hpbGUgKG1TdGF0ZSA9PSBTVEFURV9QUkVQQVJJTkcpIHsKKyAgICAgICAgICAgICAgICBtQ29uZGl0aW9uLndhaXQobUxvY2spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIChtU3RhdGUgPT0gU1RBVEVfUFJFUEFSRUQpID8gT0sgOiBVTktOT1dOX0VSUk9SOworICAgICAgICBjYXNlIFNUQVRFX1NUT1BQRUQ6CisgICAgICAgICAgICAvLyB0aGlzIGlzIHJlYWxseSBqdXN0IHBhdXNlZC4gaGFuZGxlIGFzIHNlZWsgdG8gc3RhcnQKKyAgICAgICAgICAgIG1BdEVPUyA9IGZhbHNlOworICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSSU5HOworICAgICAgICAgICAgbUlzQXN5bmNQcmVwYXJlID0gZmFsc2U7CisgICAgICAgICAgICBtUGxheWVyLT5zZWVrVG9Bc3luYygwLCBNZWRpYVBsYXllcjJTZWVrTW9kZTo6U0VFS19QUkVWSU9VU19TWU5DIC8qIG1vZGUgKi8sCisgICAgICAgICAgICAgICAgICAgIHRydWUgLyogbmVlZE5vdGlmeSAqLyk7CisgICAgICAgICAgICB3aGlsZSAobVN0YXRlID09IFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUklORykgeworICAgICAgICAgICAgICAgIG1Db25kaXRpb24ud2FpdChtTG9jayk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKG1TdGF0ZSA9PSBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJFRCkgPyBPSyA6IFVOS05PV05fRVJST1I7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfTsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpwcmVwYXJlQXN5bmMoKSB7CisgICAgQUxPR1YoInByZXBhcmVBc3luYyglcCkiLCB0aGlzKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgc3dpdGNoIChtU3RhdGUpIHsKKyAgICAgICAgY2FzZSBTVEFURV9VTlBSRVBBUkVEOgorICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfUFJFUEFSSU5HOworICAgICAgICAgICAgbUlzQXN5bmNQcmVwYXJlID0gdHJ1ZTsKKyAgICAgICAgICAgIG1QbGF5ZXItPnByZXBhcmVBc3luYygpOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICBjYXNlIFNUQVRFX1NUT1BQRUQ6CisgICAgICAgICAgICAvLyB0aGlzIGlzIHJlYWxseSBqdXN0IHBhdXNlZC4gaGFuZGxlIGFzIHNlZWsgdG8gc3RhcnQKKyAgICAgICAgICAgIG1BdEVPUyA9IGZhbHNlOworICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSSU5HOworICAgICAgICAgICAgbUlzQXN5bmNQcmVwYXJlID0gdHJ1ZTsKKyAgICAgICAgICAgIG1QbGF5ZXItPnNlZWtUb0FzeW5jKDAsIE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkMgLyogbW9kZSAqLywKKyAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBuZWVkTm90aWZ5ICovKTsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9OworfQorCitzdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OnN0YXJ0KCkgeworICAgIEFMT0dEKCJzdGFydCglcCksIHN0YXRlIGlzICVkLCBlb3MgaXMgJWQiLCB0aGlzLCBtU3RhdGUsIG1BdEVPUyk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gc3RhcnRfbCgpOworfQorCitzdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OnN0YXJ0X2woKSB7CisgICAgc3dpdGNoIChtU3RhdGUpIHsKKyAgICAgICAgY2FzZSBTVEFURV9VTlBSRVBBUkVEOgorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBwcmVwYXJlX2woKTsKKworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENIRUNLX0VRKG1TdGF0ZSwgU1RBVEVfUFJFUEFSRUQpOworCisgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgU1RBVEVfUEFVU0VEOgorICAgICAgICBjYXNlIFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUkVEOgorICAgICAgICBjYXNlIFNUQVRFX1BSRVBBUkVEOgorICAgICAgICB7CisgICAgICAgICAgICBtUGxheWVyLT5zdGFydCgpOworCisgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgU1RBVEVfUlVOTklORzoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG1BdEVPUykgeworICAgICAgICAgICAgICAgIG1QbGF5ZXItPnNlZWtUb0FzeW5jKDApOworICAgICAgICAgICAgICAgIG1BdEVPUyA9IGZhbHNlOworICAgICAgICAgICAgICAgIG1Qb3NpdGlvblVzID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgbVN0YXRlID0gU1RBVEVfUlVOTklORzsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpzdG9wKCkgeworICAgIEFMT0dEKCJzdG9wKCVwKSIsIHRoaXMpOworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBzd2l0Y2ggKG1TdGF0ZSkgeworICAgICAgICBjYXNlIFNUQVRFX1JVTk5JTkc6CisgICAgICAgICAgICBtUGxheWVyLT5wYXVzZSgpOworICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisKKyAgICAgICAgY2FzZSBTVEFURV9QQVVTRUQ6CisgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9TVE9QUEVEOworICAgICAgICAgICAgc2VuZE5vdGlmeU9uTG9vcGVyKE1FRElBMl9TVE9QUEVEKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU1RBVEVfUFJFUEFSRUQ6CisgICAgICAgIGNhc2UgU1RBVEVfU1RPUFBFRDoKKyAgICAgICAgY2FzZSBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJJTkc6CisgICAgICAgIGNhc2UgU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSRUQ6CisgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9TVE9QUEVEOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE51UGxheWVyMkRyaXZlcjo6cGF1c2UoKSB7CisgICAgQUxPR0QoInBhdXNlKCVwKSIsIHRoaXMpOworICAgIC8vIFRoZSBOdVBsYXllclJlbmRlcmVyIG1heSBnZXQgZmx1c2hlZCBpZiBwYXVzZSBmb3IgbG9uZyBlbm91Z2gsIGUuZy4gdGhlIHBhdXNlIHRpbWVvdXQgdGVhcgorICAgIC8vIGRvd24gZm9yIGF1ZGlvIG9mZmxvYWQgbW9kZS4gSWYgdGhhdCBoYXBwZW5zLCB0aGUgTnVQbGF5ZXJSZW5kZXJlciB3aWxsIG5vIGxvbmdlciBrbm93IHRoZQorICAgIC8vIGN1cnJlbnQgcG9zaXRpb24uIFNvIHNpbWlsYXIgdG8gc2Vla1RvLCB1cGRhdGUgfG1Qb3NpdGlvblVzfCB0byB0aGUgcGF1c2UgcG9zaXRpb24gYnkgY2FsbGluZworICAgIC8vIGdldEN1cnJlbnRQb3NpdGlvbiBoZXJlLgorICAgIGludCB1bnVzZWQ7CisgICAgZ2V0Q3VycmVudFBvc2l0aW9uKCZ1bnVzZWQpOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIHN3aXRjaCAobVN0YXRlKSB7CisgICAgICAgIGNhc2UgU1RBVEVfUEFVU0VEOgorICAgICAgICBjYXNlIFNUQVRFX1BSRVBBUkVEOgorICAgICAgICAgICAgcmV0dXJuIE9LOworCisgICAgICAgIGNhc2UgU1RBVEVfUlVOTklORzoKKyAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1BBVVNFRDsKKyAgICAgICAgICAgIHNlbmROb3RpZnlPbkxvb3BlcihNRURJQTJfUEFVU0VEKTsKKyAgICAgICAgICAgIG1QbGF5ZXItPnBhdXNlKCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworYm9vbCBOdVBsYXllcjJEcml2ZXI6OmlzUGxheWluZygpIHsKKyAgICByZXR1cm4gbVN0YXRlID09IFNUQVRFX1JVTk5JTkcgJiYgIW1BdEVPUzsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpzZXRQbGF5YmFja1NldHRpbmdzKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZyYXRlKSB7CisgICAgc3RhdHVzX3QgZXJyID0gbVBsYXllci0+c2V0UGxheWJhY2tTZXR0aW5ncyhyYXRlKTsKKyAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgIC8vIHRyeSB0byB1cGRhdGUgcG9zaXRpb24KKyAgICAgICAgaW50IHVudXNlZDsKKyAgICAgICAgZ2V0Q3VycmVudFBvc2l0aW9uKCZ1bnVzZWQpOworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICAgICBpZiAocmF0ZS5tU3BlZWQgPT0gMC5mICYmIG1TdGF0ZSA9PSBTVEFURV9SVU5OSU5HKSB7CisgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9QQVVTRUQ7CisgICAgICAgICAgICBzZW5kTm90aWZ5T25Mb29wZXIoTUVESUEyX1BBVVNFRCk7CisgICAgICAgIH0gZWxzZSBpZiAocmF0ZS5tU3BlZWQgIT0gMC5mCisgICAgICAgICAgICAgICAgJiYgKG1TdGF0ZSA9PSBTVEFURV9QQVVTRUQKKyAgICAgICAgICAgICAgICAgICAgfHwgbVN0YXRlID09IFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUkVECisgICAgICAgICAgICAgICAgICAgIHx8IG1TdGF0ZSA9PSBTVEFURV9QUkVQQVJFRCkpIHsKKyAgICAgICAgICAgIGVyciA9IHN0YXJ0X2woKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OmdldFBsYXliYWNrU2V0dGluZ3MoQXVkaW9QbGF5YmFja1JhdGUgKnJhdGUpIHsKKyAgICByZXR1cm4gbVBsYXllci0+Z2V0UGxheWJhY2tTZXR0aW5ncyhyYXRlKTsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpzZXRTeW5jU2V0dGluZ3MoY29uc3QgQVZTeW5jU2V0dGluZ3MgJnN5bmMsIGZsb2F0IHZpZGVvRnBzSGludCkgeworICAgIHJldHVybiBtUGxheWVyLT5zZXRTeW5jU2V0dGluZ3Moc3luYywgdmlkZW9GcHNIaW50KTsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpnZXRTeW5jU2V0dGluZ3MoQVZTeW5jU2V0dGluZ3MgKnN5bmMsIGZsb2F0ICp2aWRlb0ZwcykgeworICAgIHJldHVybiBtUGxheWVyLT5nZXRTeW5jU2V0dGluZ3Moc3luYywgdmlkZW9GcHMpOworfQorCitzdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OnNlZWtUbyhpbnQgbXNlYywgTWVkaWFQbGF5ZXIyU2Vla01vZGUgbW9kZSkgeworICAgIEFMT0dEKCJzZWVrVG8oJXApICglZCBtcywgJWQpIGF0IHN0YXRlICVkIiwgdGhpcywgbXNlYywgbW9kZSwgbVN0YXRlKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgaW50NjRfdCBzZWVrVGltZVVzID0gbXNlYyAqIDEwMDBsbDsKKworICAgIHN3aXRjaCAobVN0YXRlKSB7CisgICAgICAgIGNhc2UgU1RBVEVfUFJFUEFSRUQ6CisgICAgICAgIGNhc2UgU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSRUQ6CisgICAgICAgIGNhc2UgU1RBVEVfUEFVU0VEOgorICAgICAgICBjYXNlIFNUQVRFX1JVTk5JTkc6CisgICAgICAgIHsKKyAgICAgICAgICAgIG1BdEVPUyA9IGZhbHNlOworICAgICAgICAgICAgbVNlZWtJblByb2dyZXNzID0gdHJ1ZTsKKyAgICAgICAgICAgIC8vIHNlZWtzIGNhbiB0YWtlIGEgd2hpbGUsIHNvIHdlIGVzc2VudGlhbGx5IHBhdXNlZAorICAgICAgICAgICAgc2VuZE5vdGlmeU9uTG9vcGVyKE1FRElBMl9QQVVTRUQpOworICAgICAgICAgICAgbVBsYXllci0+c2Vla1RvQXN5bmMoc2Vla1RpbWVVcywgbW9kZSwgdHJ1ZSAvKiBuZWVkTm90aWZ5ICovKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBtUG9zaXRpb25VcyA9IHNlZWtUaW1lVXM7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OmdldEN1cnJlbnRQb3NpdGlvbihpbnQgKm1zZWMpIHsKKyAgICBpbnQ2NF90IHRlbXBVcyA9IDA7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICAgICBpZiAobVNlZWtJblByb2dyZXNzIHx8IChtU3RhdGUgPT0gU1RBVEVfUEFVU0VEICYmICFtQXRFT1MpKSB7CisgICAgICAgICAgICB0ZW1wVXMgPSAobVBvc2l0aW9uVXMgPD0gMCkgPyAwIDogbVBvc2l0aW9uVXM7CisgICAgICAgICAgICAqbXNlYyA9IChpbnQpZGl2Um91bmQodGVtcFVzLCAoaW50NjRfdCkoMTAwMCkpOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdHVzX3QgcmV0ID0gbVBsYXllci0+Z2V0Q3VycmVudFBvc2l0aW9uKCZ0ZW1wVXMpOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAvLyBXZSBuZWVkIHRvIGNoZWNrIG1TZWVrSW5Qcm9ncmVzcyBoZXJlIGJlY2F1c2UgbVBsYXllci0+c2Vla1RvQXN5bmMgaXMgYW4gYXN5bmMgY2FsbCwgd2hpY2gKKyAgICAvLyBtZWFucyBnZXRDdXJyZW50UG9zaXRpb24gY2FuIGJlIGNhbGxlZCBiZWZvcmUgc2VlayBpcyBjb21wbGV0ZWQuIElvdywgcmVuZGVyZXIgbWF5IHJldHVybiBhCisgICAgLy8gcG9zaXRpb24gdmFsdWUgdGhhdCdzIGRpZmZlcmVudCB0aGUgc2VlayB0byBwb3NpdGlvbi4KKyAgICBpZiAocmV0ICE9IE9LKSB7CisgICAgICAgIHRlbXBVcyA9IChtUG9zaXRpb25VcyA8PSAwKSA/IDAgOiBtUG9zaXRpb25VczsKKyAgICB9IGVsc2UgeworICAgICAgICBtUG9zaXRpb25VcyA9IHRlbXBVczsKKyAgICB9CisgICAgKm1zZWMgPSAoaW50KWRpdlJvdW5kKHRlbXBVcywgKGludDY0X3QpKDEwMDApKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE51UGxheWVyMkRyaXZlcjo6Z2V0RHVyYXRpb24oaW50ICptc2VjKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChtRHVyYXRpb25VcyA8IDApIHsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgKm1zZWMgPSAobUR1cmF0aW9uVXMgKyA1MDBsbCkgLyAxMDAwOworCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIE51UGxheWVyMkRyaXZlcjo6dXBkYXRlTWV0cmljcyhjb25zdCBjaGFyICp3aGVyZSkgeworICAgIGlmICh3aGVyZSA9PSBOVUxMKSB7CisgICAgICAgIHdoZXJlID0gInVua25vd24iOworICAgIH0KKyAgICBBTE9HVigidXBkYXRlTWV0cmljcyglcCkgZnJvbSAlcyBhdCBzdGF0ZSAlZCIsIHRoaXMsIHdoZXJlLCBtU3RhdGUpOworCisgICAgLy8gZ2F0aGVyIHRoZSBmaW5hbCBzdGF0cyBmb3IgdGhpcyByZWNvcmQKKyAgICBWZWN0b3I8c3A8QU1lc3NhZ2U+PiB0cmFja1N0YXRzOworICAgIG1QbGF5ZXItPmdldFN0YXRzKCZ0cmFja1N0YXRzKTsKKworICAgIGlmICh0cmFja1N0YXRzLnNpemUoKSA+IDApIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0cmFja1N0YXRzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJnN0YXRzID0gdHJhY2tTdGF0cy5pdGVtQXQoaSk7CisKKyAgICAgICAgICAgIEFTdHJpbmcgbWltZTsKKyAgICAgICAgICAgIHN0YXRzLT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpOworCisgICAgICAgICAgICBBU3RyaW5nIG5hbWU7CisgICAgICAgICAgICBzdGF0cy0+ZmluZFN0cmluZygiY29tcG9uZW50LW5hbWUiLCAmbmFtZSk7CisKKyAgICAgICAgICAgIGlmIChtaW1lLnN0YXJ0c1dpdGgoInZpZGVvLyIpKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OworICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtQbGF5ZXJWTWltZSwgbWltZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBpZiAoIW5hbWUuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhrUGxheWVyVkNvZGVjLCBuYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChzdGF0cy0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHN0YXRzLT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrUGxheWVyV2lkdGgsIHdpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtQbGF5ZXJIZWlnaHQsIGhlaWdodCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaW50NjRfdCBudW1GcmFtZXNUb3RhbCA9IDA7CisgICAgICAgICAgICAgICAgaW50NjRfdCBudW1GcmFtZXNEcm9wcGVkID0gMDsKKyAgICAgICAgICAgICAgICBzdGF0cy0+ZmluZEludDY0KCJmcmFtZXMtdG90YWwiLCAmbnVtRnJhbWVzVG90YWwpOworICAgICAgICAgICAgICAgIHN0YXRzLT5maW5kSW50NjQoImZyYW1lcy1kcm9wcGVkLW91dHB1dCIsICZudW1GcmFtZXNEcm9wcGVkKTsKKworICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQ2NChrUGxheWVyRnJhbWVzLCBudW1GcmFtZXNUb3RhbCk7CisgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDY0KGtQbGF5ZXJGcmFtZXNEcm9wcGVkLCBudW1GcmFtZXNEcm9wcGVkKTsKKworCisgICAgICAgICAgICB9IGVsc2UgaWYgKG1pbWUuc3RhcnRzV2l0aCgiYXVkaW8vIikpIHsKKyAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhrUGxheWVyQU1pbWUsIG1pbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgaWYgKCFuYW1lLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldENTdHJpbmcoa1BsYXllckFDb2RlYywgbmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBhbHdheXMgcHJvdmlkZSBkdXJhdGlvbiBhbmQgcGxheWluZyB0aW1lLCBldmVuIGlmIHRoZXkgaGF2ZSAwL3Vua25vd24gdmFsdWVzLgorCisgICAgLy8gZ2V0RHVyYXRpb24oKSB1c2VzIG1Mb2NrIGZvciBtdXRleCAtLSBjYXJlZnVsIHdoZXJlIHdlIHVzZSBpdC4KKyAgICBpbnQgZHVyYXRpb25fbXMgPSAtMTsKKyAgICBnZXREdXJhdGlvbigmZHVyYXRpb25fbXMpOworICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQ2NChrUGxheWVyRHVyYXRpb24sIGR1cmF0aW9uX21zKTsKKworICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQ2NChrUGxheWVyUGxheWluZywgKG1QbGF5aW5nVGltZVVzKzUwMCkvMTAwMCApOworCisgICAgaWYgKG1SZWJ1ZmZlcmluZ0V2ZW50cyAhPSAwKSB7CisgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQ2NChrUGxheWVyUmVidWZmZXJpbmcsIChtUmVidWZmZXJpbmdUaW1lVXMrNTAwKS8xMDAwICk7CisgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrUGxheWVyUmVidWZmZXJpbmdDb3VudCwgbVJlYnVmZmVyaW5nRXZlbnRzKTsKKyAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtQbGF5ZXJSZWJ1ZmZlcmluZ0F0RXhpdCwgbVJlYnVmZmVyaW5nQXRFeGl0KTsKKyAgICB9CisKKyAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhrUGxheWVyRGF0YVNvdXJjZVR5cGUsIG1QbGF5ZXItPmdldERhdGFTb3VyY2VUeXBlKCkpOworfQorCisKK3ZvaWQgTnVQbGF5ZXIyRHJpdmVyOjpsb2dNZXRyaWNzKGNvbnN0IGNoYXIgKndoZXJlKSB7CisgICAgaWYgKHdoZXJlID09IE5VTEwpIHsKKyAgICAgICAgd2hlcmUgPSAidW5rbm93biI7CisgICAgfQorICAgIEFMT0dWKCJsb2dNZXRyaWNzKCVwKSBmcm9tICVzIGF0IHN0YXRlICVkIiwgdGhpcywgd2hlcmUsIG1TdGF0ZSk7CisKKyAgICBpZiAobUFuYWx5dGljc0l0ZW0gPT0gTlVMTCB8fCBtQW5hbHl0aWNzSXRlbS0+aXNFbmFibGVkKCkgPT0gZmFsc2UpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIGxvZyBvbmx5IG5vbi1lbXB0eSByZWNvcmRzCisgICAgLy8gd2UgYWx3YXlzIHVwZGF0ZU1ldHJpY3MoKSBiZWZvcmUgd2UgZ2V0IGhlcmUKKyAgICAvLyBhbmQgdGhhdCBhbHdheXMgaW5qZWN0cyAzIGZpZWxkcyAoZHVyYXRpb24sIHBsYXlpbmcgdGltZSwgYW5kCisgICAgLy8gZGF0YXNvdXJjZSkgaW50byB0aGUgcmVjb3JkLgorICAgIC8vIFNvIHRoZSBjYW5vbmljYWwgImVtcHR5IiByZWNvcmQgaGFzIDMgZWxlbWVudHMgaW4gaXQuCisgICAgaWYgKG1BbmFseXRpY3NJdGVtLT5jb3VudCgpID4gMykgeworCisgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRGaW5hbGl6ZWQodHJ1ZSk7CisgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZWxmcmVjb3JkKCk7CisKKyAgICAgICAgLy8gcmUtaW5pdCBpbiBjYXNlIHdlIHByZXBhcmUoKSBhbmQgc3RhcnQoKSBhZ2Fpbi4KKyAgICAgICAgZGVsZXRlIG1BbmFseXRpY3NJdGVtIDsKKyAgICAgICAgbUFuYWx5dGljc0l0ZW0gPSBuZXcgTWVkaWFBbmFseXRpY3NJdGVtKCJudXBsYXllciIpOworICAgICAgICBpZiAobUFuYWx5dGljc0l0ZW0pIHsKKyAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5nZW5lcmF0ZVNlc3Npb25JRCgpOworICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldFVpZChtQ2xpZW50VWlkKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJkaWQgbm90IGhhdmUgYW55dGhpbmcgdG8gcmVjb3JkIik7CisgICAgfQorfQorCitzdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OnJlc2V0KCkgeworICAgIEFMT0dEKCJyZXNldCglcCkgYXQgc3RhdGUgJWQiLCB0aGlzLCBtU3RhdGUpOworCisgICAgdXBkYXRlTWV0cmljcygicmVzZXQiKTsKKyAgICBsb2dNZXRyaWNzKCJyZXNldCIpOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIHN3aXRjaCAobVN0YXRlKSB7CisgICAgICAgIGNhc2UgU1RBVEVfSURMRToKKyAgICAgICAgICAgIHJldHVybiBPSzsKKworICAgICAgICBjYXNlIFNUQVRFX1NFVF9EQVRBU09VUkNFX1BFTkRJTkc6CisgICAgICAgIGNhc2UgU1RBVEVfUkVTRVRfSU5fUFJPR1JFU1M6CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisKKyAgICAgICAgY2FzZSBTVEFURV9QUkVQQVJJTkc6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLKG1Jc0FzeW5jUHJlcGFyZSk7CisKKyAgICAgICAgICAgIHNlbmROb3RpZnlPbkxvb3BlcihNRURJQTJfUFJFUEFSRUQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9TVE9QUEVEKSB7CisgICAgICAgIHNlbmROb3RpZnlPbkxvb3BlcihNRURJQTJfU1RPUFBFRCk7CisgICAgfQorCisgICAgbVN0YXRlID0gU1RBVEVfUkVTRVRfSU5fUFJPR1JFU1M7CisgICAgbVBsYXllci0+cmVzZXRBc3luYygpOworCisgICAgd2hpbGUgKG1TdGF0ZSA9PSBTVEFURV9SRVNFVF9JTl9QUk9HUkVTUykgeworICAgICAgICBtQ29uZGl0aW9uLndhaXQobUxvY2spOworICAgIH0KKworICAgIG1EdXJhdGlvblVzID0gLTE7CisgICAgbVBvc2l0aW9uVXMgPSAtMTsKKyAgICBtTG9vcGluZyA9IGZhbHNlOworICAgIG1QbGF5aW5nVGltZVVzID0gMDsKKyAgICBtUmVidWZmZXJpbmdUaW1lVXMgPSAwOworICAgIG1SZWJ1ZmZlcmluZ0V2ZW50cyA9IDA7CisgICAgbVJlYnVmZmVyaW5nQXRFeGl0ID0gZmFsc2U7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE51UGxheWVyMkRyaXZlcjo6bm90aWZ5QXQoaW50NjRfdCBtZWRpYVRpbWVVcykgeworICAgIEFMT0dWKCJub3RpZnlBdCglcCksIHRpbWU6JWxsZCIsIHRoaXMsIChsb25nIGxvbmcpbWVkaWFUaW1lVXMpOworICAgIHJldHVybiBtUGxheWVyLT5ub3RpZnlBdChtZWRpYVRpbWVVcyk7Cit9CisKK3N0YXR1c190IE51UGxheWVyMkRyaXZlcjo6c2V0TG9vcGluZyhpbnQgbG9vcCkgeworICAgIG1Mb29waW5nID0gbG9vcCAhPSAwOworICAgIHJldHVybiBPSzsKK30KKworcGxheWVyMl90eXBlIE51UGxheWVyMkRyaXZlcjo6cGxheWVyVHlwZSgpIHsKKyAgICByZXR1cm4gUExBWUVSMl9OVV9QTEFZRVIyOworfQorCitzdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6Omludm9rZShjb25zdCBQYXJjZWwgJnJlcXVlc3QsIFBhcmNlbCAqcmVwbHkpIHsKKyAgICBpZiAocmVwbHkgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgicmVwbHkgaXMgYSBOVUxMIHBvaW50ZXIiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpbnQzMl90IG1ldGhvZElkOworICAgIHN0YXR1c190IHJldCA9IHJlcXVlc3QucmVhZEludDMyKCZtZXRob2RJZCk7CisgICAgaWYgKHJldCAhPSBPSykgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHJldHJpZXZlIHRoZSByZXF1ZXN0ZWQgbWV0aG9kIHRvIGludm9rZSwgZXJyKCVkKSIsIHJldCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgc3dpdGNoIChtZXRob2RJZCkgeworICAgICAgICBjYXNlIE1FRElBX1BMQVlFUjJfSU5WT0tFX0lEX1NFVF9WSURFT19TQ0FMSU5HX01PREU6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBtb2RlID0gcmVxdWVzdC5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHJldHVybiBtUGxheWVyLT5zZXRWaWRlb1NjYWxpbmdNb2RlKG1vZGUpOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBNRURJQV9QTEFZRVIyX0lOVk9LRV9JRF9HRVRfVFJBQ0tfSU5GTzoKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1QbGF5ZXItPmdldFRyYWNrSW5mbyhyZXBseSk7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE1FRElBX1BMQVlFUjJfSU5WT0tFX0lEX1NFTEVDVF9UUkFDSzoKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHRyYWNrSW5kZXggPSByZXF1ZXN0LnJlYWRJbnQzMigpOworICAgICAgICAgICAgaW50IG1zZWMgPSAwOworICAgICAgICAgICAgLy8gZ2V0Q3VycmVudFBvc2l0aW9uIHNob3VsZCBhbHdheXMgcmV0dXJuIE9LCisgICAgICAgICAgICBnZXRDdXJyZW50UG9zaXRpb24oJm1zZWMpOworICAgICAgICAgICAgcmV0dXJuIG1QbGF5ZXItPnNlbGVjdFRyYWNrKHRyYWNrSW5kZXgsIHRydWUgLyogc2VsZWN0ICovLCBtc2VjICogMTAwMGxsKTsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgTUVESUFfUExBWUVSMl9JTlZPS0VfSURfVU5TRUxFQ1RfVFJBQ0s6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCB0cmFja0luZGV4ID0gcmVxdWVzdC5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHJldHVybiBtUGxheWVyLT5zZWxlY3RUcmFjayh0cmFja0luZGV4LCBmYWxzZSAvKiBzZWxlY3QgKi8sIDB4ZGVhZGJlZWYgLyogbm90IHVzZWQgKi8pOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBNRURJQV9QTEFZRVIyX0lOVk9LRV9JRF9HRVRfU0VMRUNURURfVFJBQ0s6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgdHlwZSA9IHJlcXVlc3QucmVhZEludDMyKCk7CisgICAgICAgICAgICByZXR1cm4gbVBsYXllci0+Z2V0U2VsZWN0ZWRUcmFjayh0eXBlLCByZXBseSk7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyRHJpdmVyOjpzZXRBdWRpb1NpbmsoY29uc3Qgc3A8QXVkaW9TaW5rPiAmYXVkaW9TaW5rKSB7CisgICAgbVBsYXllci0+c2V0QXVkaW9TaW5rKGF1ZGlvU2luayk7CisgICAgbUF1ZGlvU2luayA9IGF1ZGlvU2luazsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpzZXRQYXJhbWV0ZXIoCisgICAgICAgIGludCAvKiBrZXkgKi8sIGNvbnN0IFBhcmNlbCAmIC8qIHJlcXVlc3QgKi8pIHsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IE51UGxheWVyMkRyaXZlcjo6Z2V0UGFyYW1ldGVyKGludCBrZXksIFBhcmNlbCAqcmVwbHkpIHsKKworICAgIGlmIChrZXkgPT0gRk9VUkNDKCdtJywndCcsJ3InLCdYJykpIHsKKyAgICAgICAgLy8gbXRyWCAtLSBhIHBsYXkgb24gJ21ldHJpY3MnIChub3QgbWF0cml4KQorICAgICAgICAvLyBnYXRoZXIgY3VycmVudCBpbmZvIGFsbCB0b2dldGhlciwgcGFyY2VsIGl0LCBhbmQgc2VuZCBpdCBiYWNrCisgICAgICAgIHVwZGF0ZU1ldHJpY3MoImFwaSIpOworICAgICAgICBtQW5hbHl0aWNzSXRlbS0+d3JpdGVUb1BhcmNlbChyZXBseSk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IE51UGxheWVyMkRyaXZlcjo6Z2V0TWV0YWRhdGEoCisgICAgICAgIGNvbnN0IG1lZGlhOjpNZXRhZGF0YTo6RmlsdGVyJiAvKiBpZHMgKi8sIFBhcmNlbCAqcmVjb3JkcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICB1c2luZyBtZWRpYTo6TWV0YWRhdGE7CisKKyAgICBNZXRhZGF0YSBtZXRhKHJlY29yZHMpOworCisgICAgbWV0YS5hcHBlbmRCb29sKAorICAgICAgICAgICAgTWV0YWRhdGE6OmtQYXVzZUF2YWlsYWJsZSwKKyAgICAgICAgICAgIG1QbGF5ZXJGbGFncyAmIE51UGxheWVyMjo6U291cmNlOjpGTEFHX0NBTl9QQVVTRSk7CisKKyAgICBtZXRhLmFwcGVuZEJvb2woCisgICAgICAgICAgICBNZXRhZGF0YTo6a1NlZWtCYWNrd2FyZEF2YWlsYWJsZSwKKyAgICAgICAgICAgIG1QbGF5ZXJGbGFncyAmIE51UGxheWVyMjo6U291cmNlOjpGTEFHX0NBTl9TRUVLX0JBQ0tXQVJEKTsKKworICAgIG1ldGEuYXBwZW5kQm9vbCgKKyAgICAgICAgICAgIE1ldGFkYXRhOjprU2Vla0ZvcndhcmRBdmFpbGFibGUsCisgICAgICAgICAgICBtUGxheWVyRmxhZ3MgJiBOdVBsYXllcjI6OlNvdXJjZTo6RkxBR19DQU5fU0VFS19GT1JXQVJEKTsKKworICAgIG1ldGEuYXBwZW5kQm9vbCgKKyAgICAgICAgICAgIE1ldGFkYXRhOjprU2Vla0F2YWlsYWJsZSwKKyAgICAgICAgICAgIG1QbGF5ZXJGbGFncyAmIE51UGxheWVyMjo6U291cmNlOjpGTEFHX0NBTl9TRUVLKTsKKworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBOdVBsYXllcjJEcml2ZXI6Om5vdGlmeVJlc2V0Q29tcGxldGUoKSB7CisgICAgQUxPR0QoIm5vdGlmeVJlc2V0Q29tcGxldGUoJXApIiwgdGhpcyk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIENIRUNLX0VRKG1TdGF0ZSwgU1RBVEVfUkVTRVRfSU5fUFJPR1JFU1MpOworICAgIG1TdGF0ZSA9IFNUQVRFX0lETEU7CisgICAgbUNvbmRpdGlvbi5icm9hZGNhc3QoKTsKK30KKwordm9pZCBOdVBsYXllcjJEcml2ZXI6Om5vdGlmeVNldFN1cmZhY2VDb21wbGV0ZSgpIHsKKyAgICBBTE9HVigibm90aWZ5U2V0U3VyZmFjZUNvbXBsZXRlKCVwKSIsIHRoaXMpOworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBDSEVDSyhtU2V0U3VyZmFjZUluUHJvZ3Jlc3MpOworICAgIG1TZXRTdXJmYWNlSW5Qcm9ncmVzcyA9IGZhbHNlOworCisgICAgbUNvbmRpdGlvbi5icm9hZGNhc3QoKTsKK30KKwordm9pZCBOdVBsYXllcjJEcml2ZXI6Om5vdGlmeUR1cmF0aW9uKGludDY0X3QgZHVyYXRpb25VcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgbUR1cmF0aW9uVXMgPSBkdXJhdGlvblVzOworfQorCit2b2lkIE51UGxheWVyMkRyaXZlcjo6bm90aWZ5TW9yZVBsYXlpbmdUaW1lVXMoaW50NjRfdCBwbGF5aW5nVXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIG1QbGF5aW5nVGltZVVzICs9IHBsYXlpbmdVczsKK30KKwordm9pZCBOdVBsYXllcjJEcml2ZXI6Om5vdGlmeU1vcmVSZWJ1ZmZlcmluZ1RpbWVVcyhpbnQ2NF90IHJlYnVmZmVyaW5nVXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIG1SZWJ1ZmZlcmluZ1RpbWVVcyArPSByZWJ1ZmZlcmluZ1VzOworICAgIG1SZWJ1ZmZlcmluZ0V2ZW50cysrOworfQorCit2b2lkIE51UGxheWVyMkRyaXZlcjo6bm90aWZ5UmVidWZmZXJpbmdXaGVuRXhpdChib29sIHN0YXR1cykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgbVJlYnVmZmVyaW5nQXRFeGl0ID0gc3RhdHVzOworfQorCit2b2lkIE51UGxheWVyMkRyaXZlcjo6bm90aWZ5U2Vla0NvbXBsZXRlKCkgeworICAgIEFMT0dWKCJub3RpZnlTZWVrQ29tcGxldGUoJXApIiwgdGhpcyk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBtU2Vla0luUHJvZ3Jlc3MgPSBmYWxzZTsKKyAgICBub3RpZnlTZWVrQ29tcGxldGVfbCgpOworfQorCit2b2lkIE51UGxheWVyMkRyaXZlcjo6bm90aWZ5U2Vla0NvbXBsZXRlX2woKSB7CisgICAgYm9vbCB3YXNTZWVraW5nID0gdHJ1ZTsKKyAgICBpZiAobVN0YXRlID09IFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUklORykgeworICAgICAgICB3YXNTZWVraW5nID0gZmFsc2U7CisgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUkVEOworICAgICAgICBtQ29uZGl0aW9uLmJyb2FkY2FzdCgpOworICAgICAgICBpZiAoIW1Jc0FzeW5jUHJlcGFyZSkgeworICAgICAgICAgICAgLy8gaWYgd2UgYXJlIHByZXBhcmluZyBzeW5jaHJvbm91c2x5LCBubyBuZWVkIHRvIG5vdGlmeSBsaXN0ZW5lcgorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChtU3RhdGUgPT0gU1RBVEVfU1RPUFBFRCkgeworICAgICAgICAvLyBubyBuZWVkIHRvIG5vdGlmeSBsaXN0ZW5lcgorICAgICAgICByZXR1cm47CisgICAgfQorICAgIG5vdGlmeUxpc3RlbmVyX2wod2FzU2Vla2luZyA/IE1FRElBMl9TRUVLX0NPTVBMRVRFIDogTUVESUEyX1BSRVBBUkVEKTsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpkdW1wKAorICAgICAgICBpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4gJiAvKiBhcmdzICovKSBjb25zdCB7CisKKyAgICBWZWN0b3I8c3A8QU1lc3NhZ2U+ID4gdHJhY2tTdGF0czsKKyAgICBtUGxheWVyLT5nZXRTdGF0cygmdHJhY2tTdGF0cyk7CisKKyAgICBBU3RyaW5nIGxvZ1N0cmluZygiIE51UGxheWVyMlxuIik7CisgICAgY2hhciBidWZbMjU2XSA9IHswfTsKKworICAgIGJvb2wgbG9ja2VkID0gZmFsc2U7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrRHVtcExvY2tSZXRyaWVzOyArK2kpIHsKKyAgICAgICAgaWYgKG1Mb2NrLnRyeUxvY2soKSA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgbG9ja2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHVzbGVlcChrRHVtcExvY2tTbGVlcFVzKTsKKyAgICB9CisKKyAgICBpZiAobG9ja2VkKSB7CisgICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIgIHN0YXRlKCVkKSwgYXRFT1MoJWQpLCBsb29waW5nKCVkKSwgYXV0b0xvb3AoJWQpXG4iLAorICAgICAgICAgICAgICAgIG1TdGF0ZSwgbUF0RU9TLCBtTG9vcGluZywgbUF1dG9Mb29wKTsKKyAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiAgTlBEKCVwKSBsb2NrIGlzIHRha2VuXG4iLCB0aGlzKTsKKyAgICB9CisgICAgbG9nU3RyaW5nLmFwcGVuZChidWYpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0cmFja1N0YXRzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmc3RhdHMgPSB0cmFja1N0YXRzLml0ZW1BdChpKTsKKworICAgICAgICBBU3RyaW5nIG1pbWU7CisgICAgICAgIGlmIChzdGF0cy0+ZmluZFN0cmluZygibWltZSIsICZtaW1lKSkgeworICAgICAgICAgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiAgbWltZSglcylcbiIsIG1pbWUuY19zdHIoKSk7CisgICAgICAgICAgICBsb2dTdHJpbmcuYXBwZW5kKGJ1Zik7CisgICAgICAgIH0KKworICAgICAgICBBU3RyaW5nIG5hbWU7CisgICAgICAgIGlmIChzdGF0cy0+ZmluZFN0cmluZygiY29tcG9uZW50LW5hbWUiLCAmbmFtZSkpIHsKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIgICAgZGVjb2RlciglcylcbiIsIG5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICBsb2dTdHJpbmcuYXBwZW5kKGJ1Zik7CisgICAgICAgIH0KKworICAgICAgICBpZiAobWltZS5zdGFydHNXaXRoKCJ2aWRlby8iKSkgeworICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OworICAgICAgICAgICAgaWYgKHN0YXRzLT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKQorICAgICAgICAgICAgICAgICAgICAmJiBzdGF0cy0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSkgeworICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIgICAgcmVzb2x1dGlvbiglZCB4ICVkKVxuIiwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICAgICAgbG9nU3RyaW5nLmFwcGVuZChidWYpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQ2NF90IG51bUZyYW1lc1RvdGFsID0gMDsKKyAgICAgICAgICAgIGludDY0X3QgbnVtRnJhbWVzRHJvcHBlZCA9IDA7CisKKyAgICAgICAgICAgIHN0YXRzLT5maW5kSW50NjQoImZyYW1lcy10b3RhbCIsICZudW1GcmFtZXNUb3RhbCk7CisgICAgICAgICAgICBzdGF0cy0+ZmluZEludDY0KCJmcmFtZXMtZHJvcHBlZC1vdXRwdXQiLCAmbnVtRnJhbWVzRHJvcHBlZCk7CisgICAgICAgICAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiICAgIG51bUZyYW1lc1RvdGFsKCVsbGQpLCBudW1GcmFtZXNEcm9wcGVkKCVsbGQpLCAiCisgICAgICAgICAgICAgICAgICAgICAicGVyY2VudGFnZURyb3BwZWQoJS4yZiUlKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpbnVtRnJhbWVzVG90YWwsCisgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKW51bUZyYW1lc0Ryb3BwZWQsCisgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXNUb3RhbCA9PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAwLjAgOiAoZG91YmxlKShudW1GcmFtZXNEcm9wcGVkICogMTAwKSAvIG51bUZyYW1lc1RvdGFsKTsKKyAgICAgICAgICAgIGxvZ1N0cmluZy5hcHBlbmQoYnVmKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFMT0dJKCIlcyIsIGxvZ1N0cmluZy5jX3N0cigpKTsKKworICAgIGlmIChmZCA+PSAwKSB7CisgICAgICAgIEZJTEUgKm91dCA9IGZkb3BlbihkdXAoZmQpLCAidyIpOworICAgICAgICBmcHJpbnRmKG91dCwgIiVzIiwgbG9nU3RyaW5nLmNfc3RyKCkpOworICAgICAgICBmY2xvc2Uob3V0KTsKKyAgICAgICAgb3V0ID0gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyRHJpdmVyOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgY2FzZSBrV2hhdE5vdGlmeUxpc3RlbmVyOiB7CisgICAgICAgICAgICBpbnQzMl90IG1zZ0lkOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoIm1lc3NhZ2VJZCIsICZtc2dJZCkpOworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobXNnSWQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjJEcml2ZXI6Om5vdGlmeUxpc3RlbmVyKAorICAgICAgICBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqaW4pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIG5vdGlmeUxpc3RlbmVyX2wobXNnLCBleHQxLCBleHQyLCBpbik7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyRHJpdmVyOjpub3RpZnlMaXN0ZW5lcl9sKAorICAgICAgICBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqaW4pIHsKKyAgICBBTE9HRCgibm90aWZ5TGlzdGVuZXJfbCglcCksICglZCwgJWQsICVkLCAlZCksIGxvb3Agc2V0dGluZyglZCwgJWQpIiwKKyAgICAgICAgICAgIHRoaXMsIG1zZywgZXh0MSwgZXh0MiwgKGluID09IE5VTEwgPyAtMSA6IChpbnQpaW4tPmRhdGFTaXplKCkpLCBtQXV0b0xvb3AsIG1Mb29waW5nKTsKKyAgICBzd2l0Y2ggKG1zZykgeworICAgICAgICBjYXNlIE1FRElBMl9QTEFZQkFDS19DT01QTEVURToKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9SRVNFVF9JTl9QUk9HUkVTUykgeworICAgICAgICAgICAgICAgIGlmIChtQXV0b0xvb3ApIHsKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX01VU0lDOworICAgICAgICAgICAgICAgICAgICBpZiAobUF1ZGlvU2luayAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1UeXBlID0gbUF1ZGlvU2luay0+Z2V0QXVkaW9TdHJlYW1UeXBlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbVR5cGUgPT0gQVVESU9fU1RSRUFNX05PVElGSUNBVElPTikgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coImRpc2FibGluZyBhdXRvLWxvb3AgZm9yIG5vdGlmaWNhdGlvbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgbUF1dG9Mb29wID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1Mb29waW5nIHx8IG1BdXRvTG9vcCkgeworICAgICAgICAgICAgICAgICAgICBtUGxheWVyLT5zZWVrVG9Bc3luYygwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1BdWRpb1NpbmsgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHJlbmRlcmVyIGhhcyBzdG9wcGVkIHRoZSBzaW5rIGF0IHRoZSBlbmQgaW4gb3JkZXIgdG8gcGxheSBvdXQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBsYXN0IGxpdHRsZSBiaXQgb2YgYXVkaW8uIElmIHdlJ3JlIGxvb3BpbmcsIHdlIG5lZWQgdG8gcmVzdGFydCBpdC4KKyAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb1NpbmstPnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3Qgc2VuZCBjb21wbGV0aW9uIGV2ZW50IHdoZW4gbG9vcGluZworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eV9nZXRfYm9vbCgicGVyc2lzdC5kZWJ1Zy5zZi5zdGF0cyIsIGZhbHNlKSkgeworICAgICAgICAgICAgICAgICAgICBWZWN0b3I8U3RyaW5nMTY+IGFyZ3M7CisgICAgICAgICAgICAgICAgICAgIGR1bXAoLTEsIGFyZ3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtUGxheWVyLT5wYXVzZSgpOworICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1BBVVNFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICB9CisKKyAgICAgICAgY2FzZSBNRURJQTJfRVJST1I6CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHdoZW4gd2UgaGF2ZSBhbiBlcnJvciwgYWRkIGl0IHRvIHRoZSBhbmFseXRpY3MgZm9yIHRoaXMgcGxheWJhY2suCisgICAgICAgICAgICAvLyBleHQxIGlzIG91ciBwcmltYXJ5ICdlcnJvciB0eXBlJyB2YWx1ZS4gT25seSBhZGQgZXh0MiB3aGVuIG5vbi16ZXJvLgorICAgICAgICAgICAgLy8gW3Rlc3QgYWdhaW5zdCBtc2cgaXMgZHVlIHRvIGZhbGwgdGhyb3VnaCBmcm9tIHByZXZpb3VzIHN3aXRjaCB2YWx1ZV0KKyAgICAgICAgICAgIGlmIChtc2cgPT0gTUVESUEyX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtQbGF5ZXJFcnJvciwgZXh0MSk7CisgICAgICAgICAgICAgICAgaWYgKGV4dDIgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa1BsYXllckVycm9yQ29kZSwgZXh0Mik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtQbGF5ZXJFcnJvclN0YXRlLCBzdGF0ZVN0cmluZyhtU3RhdGUpLmNfc3RyKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUF0RU9TID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIG1Mb2NrLnVubG9jaygpOworICAgIHNlbmRFdmVudChtc2csIGV4dDEsIGV4dDIsIGluKTsKKyAgICBtTG9jay5sb2NrKCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyRHJpdmVyOjpzZW5kTm90aWZ5T25Mb29wZXIoaW50IG1zZ0lkKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdE5vdGlmeUxpc3RlbmVyLCB0aGlzKTsKKyAgICBtc2ctPnNldEludDMyKCJtZXNzYWdlSWQiLCBtc2dJZCk7CisgICAgbXNnLT5wb3N0KCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyRHJpdmVyOjpub3RpZnlTZXREYXRhU291cmNlQ29tcGxldGVkKHN0YXR1c190IGVycikgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBDSEVDS19FUShtU3RhdGUsIFNUQVRFX1NFVF9EQVRBU09VUkNFX1BFTkRJTkcpOworCisgICAgbUFzeW5jUmVzdWx0ID0gZXJyOworICAgIG1TdGF0ZSA9IChlcnIgPT0gT0spID8gU1RBVEVfVU5QUkVQQVJFRCA6IFNUQVRFX0lETEU7CisgICAgbUNvbmRpdGlvbi5icm9hZGNhc3QoKTsKK30KKwordm9pZCBOdVBsYXllcjJEcml2ZXI6Om5vdGlmeVByZXBhcmVDb21wbGV0ZWQoc3RhdHVzX3QgZXJyKSB7CisgICAgQUxPR1YoIm5vdGlmeVByZXBhcmVDb21wbGV0ZWQgJWQiLCBlcnIpOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfUFJFUEFSSU5HKSB7CisgICAgICAgIC8vIFdlIHdlcmUgcHJlcGFyaW5nIGFzeW5jaHJvbm91c2x5IHdoZW4gdGhlIGNsaWVudCBjYWxsZWQKKyAgICAgICAgLy8gcmVzZXQoKSwgd2Ugc2VudCBhIHByZW1hdHVyZSAicHJlcGFyZWQiIG5vdGlmaWNhdGlvbiBhbmQKKyAgICAgICAgLy8gdGhlbiBpbml0aWF0ZWQgdGhlIHJlc2V0LiBUaGlzIG5vdGlmaWNhdGlvbiBpcyBzdGFsZS4KKyAgICAgICAgQ0hFQ0sobVN0YXRlID09IFNUQVRFX1JFU0VUX0lOX1BST0dSRVNTIHx8IG1TdGF0ZSA9PSBTVEFURV9JRExFKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIENIRUNLX0VRKG1TdGF0ZSwgU1RBVEVfUFJFUEFSSU5HKTsKKworICAgIG1Bc3luY1Jlc3VsdCA9IGVycjsKKworICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgLy8gdXBkYXRlIHN0YXRlIGJlZm9yZSBub3RpZnlpbmcgY2xpZW50LCBzbyB0aGF0IGlmIGNsaWVudCBjYWxscyBiYWNrIGludG8gTnVQbGF5ZXIyRHJpdmVyCisgICAgICAgIC8vIGluIHJlc3BvbnNlLCBOdVBsYXllcjJEcml2ZXIgaGFzIHRoZSByaWdodCBzdGF0ZQorICAgICAgICBtU3RhdGUgPSBTVEFURV9QUkVQQVJFRDsKKyAgICAgICAgaWYgKG1Jc0FzeW5jUHJlcGFyZSkgeworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQTJfUFJFUEFSRUQpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVN0YXRlID0gU1RBVEVfVU5QUkVQQVJFRDsKKyAgICAgICAgaWYgKG1Jc0FzeW5jUHJlcGFyZSkgeworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQTJfRVJST1IsIE1FRElBMl9FUlJPUl9VTktOT1dOLCBlcnIpOworICAgICAgICB9CisgICAgfQorCisgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBtUGxheWVyLT5nZXRGaWxlTWV0YSgpOworICAgIGludDMyX3QgbG9vcDsKKyAgICBpZiAobWV0YSAhPSBOVUxMCisgICAgICAgICAgICAmJiBtZXRhLT5maW5kSW50MzIoa0tleUF1dG9Mb29wLCAmbG9vcCkgJiYgbG9vcCAhPSAwKSB7CisgICAgICAgIG1BdXRvTG9vcCA9IHRydWU7CisgICAgfQorCisgICAgbUNvbmRpdGlvbi5icm9hZGNhc3QoKTsKK30KKwordm9pZCBOdVBsYXllcjJEcml2ZXI6Om5vdGlmeUZsYWdzQ2hhbmdlZCh1aW50MzJfdCBmbGFncykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBtUGxheWVyRmxhZ3MgPSBmbGFnczsKK30KKworLy8gTW9kdWxhciBEUk0KK3N0YXR1c190IE51UGxheWVyMkRyaXZlcjo6cHJlcGFyZURybShjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBWZWN0b3I8dWludDhfdD4gJmRybVNlc3Npb25JZCkKK3sKKyAgICBBTE9HVigicHJlcGFyZURybSglcCkgc3RhdGU6ICVkIiwgdGhpcywgbVN0YXRlKTsKKworICAgIC8vIGxlYXZpbmcgdGhlIHN0YXRlIHZlcmlmaWNhdGlvbiBmb3IgbWVkaWFwbGF5ZXIuY3BwCisgICAgc3RhdHVzX3QgcmV0ID0gbVBsYXllci0+cHJlcGFyZURybSh1dWlkLCBkcm1TZXNzaW9uSWQpOworCisgICAgQUxPR1YoInByZXBhcmVEcm0gcmV0OiAlZCIsIHJldCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OnJlbGVhc2VEcm0oKQoreworICAgIEFMT0dWKCJyZWxlYXNlRHJtKCVwKSBzdGF0ZTogJWQiLCB0aGlzLCBtU3RhdGUpOworCisgICAgLy8gbGVhdmluZyB0aGUgc3RhdGUgdmVyaWZpY2F0aW9uIGZvciBtZWRpYXBsYXllci5jcHAKKyAgICBzdGF0dXNfdCByZXQgPSBtUGxheWVyLT5yZWxlYXNlRHJtKCk7CisKKyAgICBBTE9HVigicmVsZWFzZURybSByZXQ6ICVkIiwgcmV0KTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0ZDo6c3RyaW5nIE51UGxheWVyMkRyaXZlcjo6c3RhdGVTdHJpbmcoU3RhdGUgc3RhdGUpIHsKKyAgICBjb25zdCBjaGFyICpydmFsID0gTlVMTDsKKyAgICBjaGFyIHJhd2J1ZmZlclsxNl07ICAvLyBhbGxvd3MgIiVkIgorCisgICAgc3dpdGNoIChzdGF0ZSkgeworICAgICAgICBjYXNlIFNUQVRFX0lETEU6IHJ2YWwgPSAiSURMRSI7IGJyZWFrOworICAgICAgICBjYXNlIFNUQVRFX1NFVF9EQVRBU09VUkNFX1BFTkRJTkc6IHJ2YWwgPSAiU0VUX0RBVEFTT1VSQ0VfUEVORElORyI7IGJyZWFrOworICAgICAgICBjYXNlIFNUQVRFX1VOUFJFUEFSRUQ6IHJ2YWwgPSAiVU5QUkVQQVJFRCI7IGJyZWFrOworICAgICAgICBjYXNlIFNUQVRFX1BSRVBBUklORzogcnZhbCA9ICJQUkVQQVJJTkciOyBicmVhazsKKyAgICAgICAgY2FzZSBTVEFURV9QUkVQQVJFRDogcnZhbCA9ICJQUkVQQVJFRCI7IGJyZWFrOworICAgICAgICBjYXNlIFNUQVRFX1JVTk5JTkc6IHJ2YWwgPSAiUlVOTklORyI7IGJyZWFrOworICAgICAgICBjYXNlIFNUQVRFX1BBVVNFRDogcnZhbCA9ICJQQVVTRUQiOyBicmVhazsKKyAgICAgICAgY2FzZSBTVEFURV9SRVNFVF9JTl9QUk9HUkVTUzogcnZhbCA9ICJSRVNFVF9JTl9QUk9HUkVTUyI7IGJyZWFrOworICAgICAgICBjYXNlIFNUQVRFX1NUT1BQRUQ6IHJ2YWwgPSAiU1RPUFBFRCI7IGJyZWFrOworICAgICAgICBjYXNlIFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUklORzogcnZhbCA9ICJTVE9QUEVEX0FORF9QUkVQQVJJTkciOyBicmVhazsKKyAgICAgICAgY2FzZSBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJFRDogcnZhbCA9ICJTVE9QUEVEX0FORF9QUkVQQVJFRCI7IGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLy8geWVzLCB0aGlzIGJ1ZmZlciBpcyBzaGFyZWQgYW5kIHZ1bG5lcmFibGUgdG8gcmFjZXMKKyAgICAgICAgICAgIHNucHJpbnRmKHJhd2J1ZmZlciwgc2l6ZW9mKHJhd2J1ZmZlciksICIlZCIsIHN0YXRlKTsKKyAgICAgICAgICAgIHJ2YWwgPSByYXdidWZmZXI7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gcnZhbDsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL251cGxheWVyMi9OdVBsYXllcjJEcml2ZXIuaCBiL21lZGlhL2xpYm1lZGlhL251cGxheWVyMi9OdVBsYXllcjJEcml2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDUxMzQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvbnVwbGF5ZXIyL051UGxheWVyMkRyaXZlci5oCkBAIC0wLDAgKzEsMTcwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bWVkaWEvTWVkaWFQbGF5ZXIySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUFuYWx5dGljc0l0ZW0uaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEFMb29wZXI7CitzdHJ1Y3QgTWVkaWFDbG9jazsKK3N0cnVjdCBOdVBsYXllcjI7CisKK3N0cnVjdCBOdVBsYXllcjJEcml2ZXIgOiBwdWJsaWMgTWVkaWFQbGF5ZXIySW50ZXJmYWNlIHsKKyAgICBleHBsaWNpdCBOdVBsYXllcjJEcml2ZXIocGlkX3QgcGlkKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFVJRCh1aWRfdCB1aWQpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREYXRhU291cmNlKAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLAorICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShjb25zdCBzcDxJU3RyZWFtU291cmNlPiAmc291cmNlKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShjb25zdCBzcDxEYXRhU291cmNlPiYgZGF0YVNvdXJjZSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZpZGVvU3VyZmFjZVRleHR1cmUoY29uc3Qgc3A8QU5hdGl2ZVdpbmRvd1dyYXBwZXI+ICZud3cpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRCdWZmZXJpbmdTZXR0aW5ncygKKyAgICAgICAgICAgIEJ1ZmZlcmluZ1NldHRpbmdzKiBidWZmZXJpbmcgLyogbm9ubnVsbCAqLykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRCdWZmZXJpbmdTZXR0aW5ncyhjb25zdCBCdWZmZXJpbmdTZXR0aW5ncyYgYnVmZmVyaW5nKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJlcGFyZSgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJlcGFyZUFzeW5jKCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKTsKKyAgICB2aXJ0dWFsIGJvb2wgaXNQbGF5aW5nKCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQbGF5YmFja1NldHRpbmdzKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZyYXRlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBsYXliYWNrU2V0dGluZ3MoQXVkaW9QbGF5YmFja1JhdGUgKnJhdGUpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3luY1NldHRpbmdzKGNvbnN0IEFWU3luY1NldHRpbmdzICZzeW5jLCBmbG9hdCB2aWRlb0Zwc0hpbnQpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3luY1NldHRpbmdzKEFWU3luY1NldHRpbmdzICpzeW5jLCBmbG9hdCAqdmlkZW9GcHMpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2Vla1RvKAorICAgICAgICAgICAgaW50IG1zZWMsIE1lZGlhUGxheWVyMlNlZWtNb2RlIG1vZGUgPSBNZWRpYVBsYXllcjJTZWVrTW9kZTo6U0VFS19QUkVWSU9VU19TWU5DKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEN1cnJlbnRQb3NpdGlvbihpbnQgKm1zZWMpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RHVyYXRpb24oaW50ICptc2VjKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlc2V0KCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBub3RpZnlBdChpbnQ2NF90IG1lZGlhVGltZVVzKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldExvb3BpbmcoaW50IGxvb3ApOworICAgIHZpcnR1YWwgcGxheWVyMl90eXBlIHBsYXllclR5cGUoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGludm9rZShjb25zdCBQYXJjZWwgJnJlcXVlc3QsIFBhcmNlbCAqcmVwbHkpOworICAgIHZpcnR1YWwgdm9pZCBzZXRBdWRpb1NpbmsoY29uc3Qgc3A8QXVkaW9TaW5rPiAmYXVkaW9TaW5rKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcihpbnQga2V5LCBjb25zdCBQYXJjZWwgJnJlcXVlc3QpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGFyYW1ldGVyKGludCBrZXksIFBhcmNlbCAqcmVwbHkpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhZGF0YSgKKyAgICAgICAgICAgIGNvbnN0IG1lZGlhOjpNZXRhZGF0YTo6RmlsdGVyJiBpZHMsIFBhcmNlbCAqcmVjb3Jkcyk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzKSBjb25zdDsKKworICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgb3ZlcnJpZGU7CisKKyAgICB2b2lkIG5vdGlmeVNldERhdGFTb3VyY2VDb21wbGV0ZWQoc3RhdHVzX3QgZXJyKTsKKyAgICB2b2lkIG5vdGlmeVByZXBhcmVDb21wbGV0ZWQoc3RhdHVzX3QgZXJyKTsKKyAgICB2b2lkIG5vdGlmeVJlc2V0Q29tcGxldGUoKTsKKyAgICB2b2lkIG5vdGlmeVNldFN1cmZhY2VDb21wbGV0ZSgpOworICAgIHZvaWQgbm90aWZ5RHVyYXRpb24oaW50NjRfdCBkdXJhdGlvblVzKTsKKyAgICB2b2lkIG5vdGlmeU1vcmVQbGF5aW5nVGltZVVzKGludDY0X3QgdGltZVVzKTsKKyAgICB2b2lkIG5vdGlmeU1vcmVSZWJ1ZmZlcmluZ1RpbWVVcyhpbnQ2NF90IHRpbWVVcyk7CisgICAgdm9pZCBub3RpZnlSZWJ1ZmZlcmluZ1doZW5FeGl0KGJvb2wgc3RhdHVzKTsKKyAgICB2b2lkIG5vdGlmeVNlZWtDb21wbGV0ZSgpOworICAgIHZvaWQgbm90aWZ5U2Vla0NvbXBsZXRlX2woKTsKKyAgICB2b2lkIG5vdGlmeUxpc3RlbmVyKGludCBtc2csIGludCBleHQxID0gMCwgaW50IGV4dDIgPSAwLCBjb25zdCBQYXJjZWwgKmluID0gTlVMTCk7CisgICAgdm9pZCBub3RpZnlGbGFnc0NoYW5nZWQodWludDMyX3QgZmxhZ3MpOworCisgICAgLy8gTW9kdWxhciBEUk0KKyAgICB2aXJ0dWFsIHN0YXR1c190IHByZXBhcmVEcm0oY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZkcm1TZXNzaW9uSWQpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZURybSgpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+TnVQbGF5ZXIyRHJpdmVyKCk7CisKK3ByaXZhdGU6CisgICAgZW51bSBTdGF0ZSB7CisgICAgICAgIFNUQVRFX0lETEUsCisgICAgICAgIFNUQVRFX1NFVF9EQVRBU09VUkNFX1BFTkRJTkcsCisgICAgICAgIFNUQVRFX1VOUFJFUEFSRUQsCisgICAgICAgIFNUQVRFX1BSRVBBUklORywKKyAgICAgICAgU1RBVEVfUFJFUEFSRUQsCisgICAgICAgIFNUQVRFX1JVTk5JTkcsCisgICAgICAgIFNUQVRFX1BBVVNFRCwKKyAgICAgICAgU1RBVEVfUkVTRVRfSU5fUFJPR1JFU1MsCisgICAgICAgIFNUQVRFX1NUT1BQRUQsICAgICAgICAgICAgICAgICAgLy8gZXF1aXZhbGVudCB0byBQQVVTRUQKKyAgICAgICAgU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSSU5HLCAgICAvLyBlcXVpdmFsZW50IHRvIFBBVVNFRCwgYnV0IHNlZWtpbmcKKyAgICAgICAgU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSRUQsICAgICAvLyBlcXVpdmFsZW50IHRvIFBBVVNFRCwgYnV0IHNlZWsgY29tcGxldGUKKyAgICB9OworCisgICAgc3RkOjpzdHJpbmcgc3RhdGVTdHJpbmcoU3RhdGUgc3RhdGUpOworCisgICAgZW51bSB7CisgICAgICAgIGtXaGF0Tm90aWZ5TGlzdGVuZXIsCisgICAgfTsKKworICAgIG11dGFibGUgTXV0ZXggbUxvY2s7CisgICAgQ29uZGl0aW9uIG1Db25kaXRpb247CisKKyAgICBTdGF0ZSBtU3RhdGU7CisKKyAgICBib29sIG1Jc0FzeW5jUHJlcGFyZTsKKyAgICBzdGF0dXNfdCBtQXN5bmNSZXN1bHQ7CisKKyAgICAvLyBUaGUgZm9sbG93aW5nIGFyZSBwcm90ZWN0ZWQgdGhyb3VnaCAibUxvY2siCisgICAgLy8gPj4+CisgICAgYm9vbCBtU2V0U3VyZmFjZUluUHJvZ3Jlc3M7CisgICAgaW50NjRfdCBtRHVyYXRpb25VczsKKyAgICBpbnQ2NF90IG1Qb3NpdGlvblVzOworICAgIGJvb2wgbVNlZWtJblByb2dyZXNzOworICAgIGludDY0X3QgbVBsYXlpbmdUaW1lVXM7CisgICAgaW50NjRfdCBtUmVidWZmZXJpbmdUaW1lVXM7CisgICAgaW50MzJfdCBtUmVidWZmZXJpbmdFdmVudHM7CisgICAgYm9vbCBtUmVidWZmZXJpbmdBdEV4aXQ7CisgICAgLy8gPDw8CisKKyAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOworICAgIHNwPEFMb29wZXI+IG1OdVBsYXllcjJMb29wZXI7CisgICAgY29uc3Qgc3A8TWVkaWFDbG9jaz4gbU1lZGlhQ2xvY2s7CisgICAgY29uc3Qgc3A8TnVQbGF5ZXIyPiBtUGxheWVyOworICAgIHNwPEF1ZGlvU2luaz4gbUF1ZGlvU2luazsKKyAgICB1aW50MzJfdCBtUGxheWVyRmxhZ3M7CisKKyAgICBNZWRpYUFuYWx5dGljc0l0ZW0gKm1BbmFseXRpY3NJdGVtOworICAgIHVpZF90IG1DbGllbnRVaWQ7CisKKyAgICBib29sIG1BdEVPUzsKKyAgICBib29sIG1Mb29waW5nOworICAgIGJvb2wgbUF1dG9Mb29wOworCisgICAgdm9pZCB1cGRhdGVNZXRyaWNzKGNvbnN0IGNoYXIgKndoZXJlKTsKKyAgICB2b2lkIGxvZ01ldHJpY3MoY29uc3QgY2hhciAqd2hlcmUpOworCisgICAgc3RhdHVzX3QgcHJlcGFyZV9sKCk7CisgICAgc3RhdHVzX3Qgc3RhcnRfbCgpOworICAgIHZvaWQgbm90aWZ5TGlzdGVuZXJfbChpbnQgbXNnLCBpbnQgZXh0MSA9IDAsIGludCBleHQyID0gMCwgY29uc3QgUGFyY2VsICppbiA9IE5VTEwpOworICAgIHZvaWQgc2VuZE5vdGlmeU9uTG9vcGVyKGludCBtc2dJZCk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhOdVBsYXllcjJEcml2ZXIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9udXBsYXllcjIvTnVQbGF5ZXIyRHJtLmNwcCBiL21lZGlhL2xpYm1lZGlhL251cGxheWVyMi9OdVBsYXllcjJEcm0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NTE4NDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9udXBsYXllcjIvTnVQbGF5ZXIyRHJtLmNwcApAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJOdVBsYXllcjJEcm0iCisKKyNpbmNsdWRlICJOdVBsYXllcjJEcm0uaCIKKworI2luY2x1ZGUgPG1lZGlhL05ka1dyYXBwZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK1ZlY3RvcjxEcm1VVUlEPiBOdVBsYXllcjJEcm06OnBhcnNlUFNTSChjb25zdCB2b2lkICpwc3NoLCBzaXplX3QgcHNzaHNpemUpCit7CisgICAgVmVjdG9yPERybVVVSUQ+IGRybVNjaGVtZXMsIGVtcHR5OworICAgIGNvbnN0IGludCBEQVRBTEVOX1NJWkUgPSA0OworCisgICAgLy8gdGhlIGZvcm1hdCBvZiB0aGUgYnVmZmVyIGlzIDEgb3IgbW9yZSBvZjoKKyAgICAvLyAgICB7CisgICAgLy8gICAgICAgIDE2IGJ5dGUgdXVpZAorICAgIC8vICAgICAgICA0IGJ5dGUgZGF0YSBsZW5ndGggTgorICAgIC8vICAgICAgICBOIGJ5dGVzIG9mIGRhdGEKKyAgICAvLyAgICB9CisgICAgLy8gRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgc291cmNlIGRhdGEuCisgICAgLy8gU2luY2Ugd2UgZ290IHRoZSBkYXRhIGZyb20gc3RhZ2VmcmlnaHQsIHdlIHRydXN0IGl0IGlzIHZhbGlkIGFuZCBwcm9wZXJseSBmb3JtYXR0ZWQuCisKKyAgICBjb25zdCB1aW50OF90ICpkYXRhID0gKGNvbnN0IHVpbnQ4X3QqKXBzc2g7CisgICAgc2l6ZV90IGxlbiA9IHBzc2hzaXplOworICAgIHNpemVfdCBudW1lbnRyaWVzID0gMDsKKyAgICB3aGlsZSAobGVuID4gMCkgeworICAgICAgICBpZiAobGVuIDwgRHJtVVVJRDo6VVVJRF9TSVpFKSB7CisgICAgICAgICAgICBBTE9HRSgiUGFyc2VQU1NIOiBpbnZhbGlkIFBTU0ggZGF0YSIpOworICAgICAgICAgICAgcmV0dXJuIGVtcHR5OworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgdWludDhfdCAqdXVpZFB0ciA9IGRhdGE7CisKKyAgICAgICAgLy8gc2tpcCB1dWlkCisgICAgICAgIGRhdGEgKz0gRHJtVVVJRDo6VVVJRF9TSVpFOworICAgICAgICBsZW4gLT0gRHJtVVVJRDo6VVVJRF9TSVpFOworCisgICAgICAgIC8vIGdldCBkYXRhIGxlbmd0aAorICAgICAgICBpZiAobGVuIDwgREFUQUxFTl9TSVpFKSB7CisgICAgICAgICAgICBBTE9HRSgiUGFyc2VQU1NIOiBpbnZhbGlkIFBTU0ggZGF0YSIpOworICAgICAgICAgICAgcmV0dXJuIGVtcHR5OworICAgICAgICB9CisKKyAgICAgICAgdWludDMyX3QgZGF0YWxlbiA9ICooKHVpbnQzMl90KilkYXRhKTsKKyAgICAgICAgZGF0YSArPSBEQVRBTEVOX1NJWkU7CisgICAgICAgIGxlbiAtPSBEQVRBTEVOX1NJWkU7CisKKyAgICAgICAgaWYgKGxlbiA8IGRhdGFsZW4pIHsKKyAgICAgICAgICAgIEFMT0dFKCJQYXJzZVBTU0g6IGludmFsaWQgUFNTSCBkYXRhIik7CisgICAgICAgICAgICByZXR1cm4gZW1wdHk7CisgICAgICAgIH0KKworICAgICAgICAvLyBza2lwIHRoZSBkYXRhCisgICAgICAgIGRhdGEgKz0gZGF0YWxlbjsKKyAgICAgICAgbGVuIC09IGRhdGFsZW47CisKKyAgICAgICAgRHJtVVVJRCBfdXVpZCh1dWlkUHRyKTsKKyAgICAgICAgZHJtU2NoZW1lcy5hZGQoX3V1aWQpOworCisgICAgICAgIEFMT0dWKCJQYXJzZVBTU0hbJXp1XTogJXM6ICVzIiwgbnVtZW50cmllcywKKyAgICAgICAgICAgICAgICBfdXVpZC50b0hleFN0cmluZygpLnN0cmluZygpLAorICAgICAgICAgICAgICAgIERybVVVSUQ6OmFycmF5VG9IZXgoZGF0YSwgZGF0YWxlbikuc3RyaW5nKCkKKyAgICAgICAgICAgICApOworCisgICAgICAgIG51bWVudHJpZXMrKzsKKyAgICB9CisKKyAgICByZXR1cm4gZHJtU2NoZW1lczsKK30KKworVmVjdG9yPERybVVVSUQ+IE51UGxheWVyMkRybTo6Z2V0U3VwcG9ydGVkRHJtU2NoZW1lcyhjb25zdCB2b2lkICpwc3NoLCBzaXplX3QgcHNzaHNpemUpCit7CisgICAgVmVjdG9yPERybVVVSUQ+IHBzc2hEUk1zID0gcGFyc2VQU1NIKHBzc2gsIHBzc2hzaXplKTsKKworICAgIFZlY3RvcjxEcm1VVUlEPiBzdXBwb3J0ZWREUk1zOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcHNzaERSTXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgRHJtVVVJRCB1dWlkID0gcHNzaERSTXNbaV07CisgICAgICAgIGlmIChBTWVkaWFEcm1XcmFwcGVyOjppc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkLnB0cigpLCBOVUxMKSkgeworICAgICAgICAgICAgc3VwcG9ydGVkRFJNcy5hZGQodXVpZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBTE9HVigiZ2V0U3VwcG9ydGVkRHJtU2NoZW1lczogcHNzaERSTXM6ICV6dSBzdXBwb3J0ZWREUk1zOiAlenUiLAorICAgICAgICAgICAgcHNzaERSTXMuc2l6ZSgpLCBzdXBwb3J0ZWREUk1zLnNpemUoKSk7CisKKyAgICByZXR1cm4gc3VwcG9ydGVkRFJNczsKK30KKworLy8gUGFyY2VsIGhhcyBvbmx5IHByaXZhdGUgY29weSBjb25zdHJ1Y3RvciBzbyBwYXNzaW5nIGl0IGluIHJhdGhlciB0aGFuIHJldHVybmluZwordm9pZCBOdVBsYXllcjJEcm06OnJldHJpZXZlRHJtSW5mbyhjb25zdCB2b2lkICpwc3NoLCBzaXplX3QgcHNzaHNpemUsIFBhcmNlbCAqcGFyY2VsKQoreworICAgIC8vIDEpIFBTU0ggYnl0ZXMKKyAgICBwYXJjZWwtPndyaXRlVWludDMyKHBzc2hzaXplKTsKKyAgICBwYXJjZWwtPndyaXRlQnl0ZUFycmF5KHBzc2hzaXplLCAoY29uc3QgdWludDhfdCopcHNzaCk7CisKKyAgICBBTE9HVigicmV0cmlldmVEcm1JbmZvOiBNRURJQTJfRFJNX0lORk8gIFBTU0g6IHNpemU6ICV6dSAlcyIsIHBzc2hzaXplLAorICAgICAgICAgICAgRHJtVVVJRDo6YXJyYXlUb0hleCgodWludDhfdCopcHNzaCwgcHNzaHNpemUpLnN0cmluZygpKTsKKworICAgIC8vIDIpIHN1cHBvcnRlZERSTXMKKyAgICBWZWN0b3I8RHJtVVVJRD4gc3VwcG9ydGVkRFJNcyA9IGdldFN1cHBvcnRlZERybVNjaGVtZXMocHNzaCwgcHNzaHNpemUpOworICAgIHBhcmNlbC0+d3JpdGVVaW50MzIoc3VwcG9ydGVkRFJNcy5zaXplKCkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3VwcG9ydGVkRFJNcy5zaXplKCk7IGkrKykgeworICAgICAgICBEcm1VVUlEIHV1aWQgPSBzdXBwb3J0ZWREUk1zW2ldOworICAgICAgICBwYXJjZWwtPndyaXRlQnl0ZUFycmF5KERybVVVSUQ6OlVVSURfU0laRSwgdXVpZC5wdHIoKSk7CisKKyAgICAgICAgQUxPR1YoInJldHJpZXZlRHJtSW5mbzogTUVESUEyX0RSTV9JTkZPICBzdXBwb3J0ZWRTY2hlbWVbJXp1XSAlcyIsIGksCisgICAgICAgICAgICAgICAgdXVpZC50b0hleFN0cmluZygpLnN0cmluZygpKTsKKyAgICB9Cit9CisKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvbnVwbGF5ZXIyL051UGxheWVyMkRybS5oIGIvbWVkaWEvbGlibWVkaWEvbnVwbGF5ZXIyL051UGxheWVyMkRybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NjJjY2MKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9udXBsYXllcjIvTnVQbGF5ZXIyRHJtLmgKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBOVVBMQVlFUjJfRFJNX0hfCisjZGVmaW5lIE5VUExBWUVSMl9EUk1fSF8KKworI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPiAvLyBmb3IgQ3J5cHRJbmZvCisKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisgICAgc3RydWN0IERybVVVSUQgeworICAgICAgICBzdGF0aWMgY29uc3QgaW50IFVVSURfU0laRSA9IDE2OworCisgICAgICAgIERybVVVSUQoKSB7CisgICAgICAgICAgICBtZW1zZXQodGhpcy0+dXVpZCwgMCwgc2l6ZW9mKHV1aWQpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRvIGFsbG93IGRlZmluaW5nIFZlY3Rvci9LZXllZFZlY3RvciBvZiBVVUlEIHR5cGUKKyAgICAgICAgRHJtVVVJRChjb25zdCBEcm1VVUlEICZhKSB7CisgICAgICAgICAgICBtZW1jcHkodGhpcy0+dXVpZCwgYS51dWlkLCBzaXplb2YodXVpZCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdG8gYWxsb3cgZGVmaW5pbmcgVmVjdG9yL0tleWVkVmVjdG9yIG9mIFVVSUQgdHlwZQorICAgICAgICBEcm1VVUlEKGNvbnN0IHVpbnQ4X3QgdXVpZF9pbltVVUlEX1NJWkVdKSB7CisgICAgICAgICAgICBtZW1jcHkodGhpcy0+dXVpZCwgdXVpZF9pbiwgc2l6ZW9mKHV1aWQpKTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnB0cigpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiB1dWlkOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nOCB0b0hleFN0cmluZygpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBhcnJheVRvSGV4KHV1aWQsIFVVSURfU0laRSk7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgU3RyaW5nOCB0b0hleFN0cmluZyhjb25zdCB1aW50OF90IHV1aWRfaW5bVVVJRF9TSVpFXSkgeworICAgICAgICAgICAgcmV0dXJuIGFycmF5VG9IZXgodXVpZF9pbiwgVVVJRF9TSVpFKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyBTdHJpbmc4IGFycmF5VG9IZXgoY29uc3QgdWludDhfdCAqYXJyYXksIGludCBieXRlcykgeworICAgICAgICAgICAgU3RyaW5nOCByZXN1bHQ7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ5dGVzOyBpKyspIHsKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlMDJ4IiwgYXJyYXlbaV0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIHVpbnQ4X3QgdXVpZFtVVUlEX1NJWkVdOworICAgIH07CisKKworICAgIHN0cnVjdCBOdVBsYXllcjJEcm0geworCisgICAgICAgIC8vIHN0YXRpYyBoZWxwZXJzIC0gaW50ZXJuYWwKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgc3RhdGljIFZlY3RvcjxEcm1VVUlEPiBwYXJzZVBTU0goY29uc3Qgdm9pZCAqcHNzaCwgc2l6ZV90IHBzc2hzaXplKTsKKyAgICAgICAgc3RhdGljIFZlY3RvcjxEcm1VVUlEPiBnZXRTdXBwb3J0ZWREcm1TY2hlbWVzKGNvbnN0IHZvaWQgKnBzc2gsIHNpemVfdCBwc3Noc2l6ZSk7CisKKyAgICAgICAgLy8gc3RhdGljIGhlbHBlcnMgLSBwdWJsaWMKKworICAgIHB1YmxpYzoKKyAgICAgICAgLy8gUGFyY2VsIGhhcyBvbmx5IHByaXZhdGUgY29weSBjb25zdHJ1Y3RvciBzbyBwYXNzaW5nIGl0IGluIHJhdGhlciB0aGFuIHJldHVybmluZworICAgICAgICBzdGF0aWMgdm9pZCByZXRyaWV2ZURybUluZm8oY29uc3Qgdm9pZCAqcHNzaCwgc2l6ZV90IHBzc2hzaXplLCBQYXJjZWwgKnBhcmNlbCk7CisKKyAgICB9OyAgLy8gTnVQbGF5ZXIyRHJtCisKK30gICAvLyBhbmRyb2lkCisKKyNlbmRpZiAgICAgLy9OVVBMQVlFUjJfRFJNX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9udXBsYXllcjIvTnVQbGF5ZXIyUmVuZGVyZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvbnVwbGF5ZXIyL051UGxheWVyMlJlbmRlcmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWY1ZGNlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvbnVwbGF5ZXIyL051UGxheWVyMlJlbmRlcmVyLmNwcApAQCAtMCwwICsxLDIwNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk51UGxheWVyMlJlbmRlcmVyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiSldha2VMb2NrLmgiCisjaW5jbHVkZSAiTnVQbGF5ZXIyUmVuZGVyZXIuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ2xvY2suaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0J1ZmZlci5oPgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKgorICogRXhhbXBsZSBvZiBjb21tb24gY29uZmlndXJhdGlvbiBzZXR0aW5ncyBpbiBzaGVsbCBzY3JpcHQgZm9ybQorCisgICAjVHVybiBvZmZsb2FkIGF1ZGlvIG9mZiAodXNlIFBDTSBmb3IgUGxheSBNdXNpYykgLS0gQXVkaW9Qb2xpY3lNYW5hZ2VyCisgICBhZGIgc2hlbGwgc2V0cHJvcCBhdWRpby5vZmZsb2FkLmRpc2FibGUgMQorCisgICAjQWxsb3cgb2ZmbG9hZCBhdWRpbyB3aXRoIHZpZGVvIChyZXF1aXJlcyBvZmZsb2FkaW5nIHRvIGJlIGVuYWJsZWQpIC0tIEF1ZGlvUG9saWN5TWFuYWdlcgorICAgYWRiIHNoZWxsIHNldHByb3AgYXVkaW8ub2ZmbG9hZC52aWRlbyAxCisKKyAgICNVc2UgYXVkaW8gY2FsbGJhY2tzIGZvciBQQ00gZGF0YQorICAgYWRiIHNoZWxsIHNldHByb3AgbWVkaWEuc3RhZ2VmcmlnaHQuYXVkaW8uY2JrIDEKKworICAgI1VzZSBkZWVwIGJ1ZmZlciBmb3IgUENNIGRhdGEgd2l0aCB2aWRlbyAoaXQgaXMgZ2VuZXJhbGx5IGVuYWJsZWQgZm9yIGF1ZGlvLW9ubHkpCisgICBhZGIgc2hlbGwgc2V0cHJvcCBtZWRpYS5zdGFnZWZyaWdodC5hdWRpby5kZWVwIDEKKworICAgI1NldCBzaXplIG9mIGJ1ZmZlcnMgZm9yIHBjbSBhdWRpbyBzaW5rIGluIG1zZWMgKGV4YW1wbGU6IDEwMDAgbXNlYykKKyAgIGFkYiBzaGVsbCBzZXRwcm9wIG1lZGlhLnN0YWdlZnJpZ2h0LmF1ZGlvLnNpbmsgMTAwMAorCisgKiBUaGVzZSBjb25maWd1cmF0aW9ucyB0YWtlIGVmZmVjdCBmb3IgdGhlIG5leHQgdHJhY2sgcGxheWVkIChub3QgdGhlIGN1cnJlbnQgdHJhY2spLgorICovCisKK3N0YXRpYyBpbmxpbmUgYm9vbCBnZXRVc2VBdWRpb0NhbGxiYWNrU2V0dGluZygpIHsKKyAgICByZXR1cm4gcHJvcGVydHlfZ2V0X2Jvb2woIm1lZGlhLnN0YWdlZnJpZ2h0LmF1ZGlvLmNiayIsIGZhbHNlIC8qIGRlZmF1bHRfdmFsdWUgKi8pOworfQorCitzdGF0aWMgaW5saW5lIGludDMyX3QgZ2V0QXVkaW9TaW5rUGNtTXNTZXR0aW5nKCkgeworICAgIHJldHVybiBwcm9wZXJ0eV9nZXRfaW50MzIoCisgICAgICAgICAgICAibWVkaWEuc3RhZ2VmcmlnaHQuYXVkaW8uc2luayIsIDUwMCAvKiBkZWZhdWx0X3ZhbHVlICovKTsKK30KKworLy8gTWF4aW11bSB0aW1lIGluIHBhdXNlZCBzdGF0ZSB3aGVuIG9mZmxvYWRpbmcgYXVkaW8gZGVjb21wcmVzc2lvbi4gV2hlbiBlbGFwc2VkLCB0aGUgQXVkaW9TaW5rCisvLyBpcyBjbG9zZWQgdG8gYWxsb3cgdGhlIGF1ZGlvIERTUCB0byBwb3dlciBkb3duLgorc3RhdGljIGNvbnN0IGludDY0X3Qga09mZmxvYWRQYXVzZU1heFVzID0gMTAwMDAwMDBsbDsKKworLy8gTWF4aW11bSBhbGxvd2VkIGRlbGF5IGZyb20gQXVkaW9TaW5rLCAxLjUgc2Vjb25kcy4KK3N0YXRpYyBjb25zdCBpbnQ2NF90IGtNYXhBbGxvd2VkQXVkaW9TaW5rRGVsYXlVcyA9IDE1MDAwMDBsbDsKKworc3RhdGljIGNvbnN0IGludDY0X3Qga01pbmltdW1BdWRpb0Nsb2NrVXBkYXRlUGVyaW9kVXMgPSAyMCAvKiBtc2VjICovICogMTAwMDsKKworLy8gc3RhdGljCitjb25zdCBOdVBsYXllcjI6OlJlbmRlcmVyOjpQY21JbmZvIE51UGxheWVyMjo6UmVuZGVyZXI6OkFVRElPX1BDTUlORk9fSU5JVElBTElaRVIgPSB7CisgICAgICAgIEFVRElPX0NIQU5ORUxfTk9ORSwKKyAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKKyAgICAgICAgQVVESU9fRk9STUFUX0lOVkFMSUQsCisgICAgICAgIDAsIC8vIG1OdW1DaGFubmVscworICAgICAgICAwIC8vIG1TYW1wbGVSYXRlCit9OworCisvLyBzdGF0aWMKK2NvbnN0IGludDY0X3QgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6a01pblBvc2l0aW9uVXBkYXRlRGVsYXlVcyA9IDEwMDAwMGxsOworCitOdVBsYXllcjI6OlJlbmRlcmVyOjpSZW5kZXJlcigKKyAgICAgICAgY29uc3Qgc3A8TWVkaWFQbGF5ZXIyQmFzZTo6QXVkaW9TaW5rPiAmc2luaywKKyAgICAgICAgY29uc3Qgc3A8TWVkaWFDbG9jaz4gJm1lZGlhQ2xvY2ssCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAorICAgICAgICB1aW50MzJfdCBmbGFncykKKyAgICA6IG1BdWRpb1Npbmsoc2luayksCisgICAgICBtVXNlVmlydHVhbEF1ZGlvU2luayhmYWxzZSksCisgICAgICBtTm90aWZ5KG5vdGlmeSksCisgICAgICBtRmxhZ3MoZmxhZ3MpLAorICAgICAgbU51bUZyYW1lc1dyaXR0ZW4oMCksCisgICAgICBtRHJhaW5BdWRpb1F1ZXVlUGVuZGluZyhmYWxzZSksCisgICAgICBtRHJhaW5WaWRlb1F1ZXVlUGVuZGluZyhmYWxzZSksCisgICAgICBtQXVkaW9RdWV1ZUdlbmVyYXRpb24oMCksCisgICAgICBtVmlkZW9RdWV1ZUdlbmVyYXRpb24oMCksCisgICAgICBtQXVkaW9EcmFpbkdlbmVyYXRpb24oMCksCisgICAgICBtVmlkZW9EcmFpbkdlbmVyYXRpb24oMCksCisgICAgICBtQXVkaW9FT1NHZW5lcmF0aW9uKDApLAorICAgICAgbU1lZGlhQ2xvY2sobWVkaWFDbG9jayksCisgICAgICBtUGxheWJhY2tTZXR0aW5ncyhBVURJT19QTEFZQkFDS19SQVRFX0RFRkFVTFQpLAorICAgICAgbUF1ZGlvRmlyc3RBbmNob3JUaW1lTWVkaWFVcygtMSksCisgICAgICBtQW5jaG9yVGltZU1lZGlhVXMoLTEpLAorICAgICAgbUFuY2hvck51bUZyYW1lc1dyaXR0ZW4oLTEpLAorICAgICAgbVZpZGVvTGF0ZUJ5VXMoMGxsKSwKKyAgICAgIG1OZXh0VmlkZW9UaW1lTWVkaWFVcygtMSksCisgICAgICBtSGFzQXVkaW8oZmFsc2UpLAorICAgICAgbUhhc1ZpZGVvKGZhbHNlKSwKKyAgICAgIG1Ob3RpZnlDb21wbGV0ZUF1ZGlvKGZhbHNlKSwKKyAgICAgIG1Ob3RpZnlDb21wbGV0ZVZpZGVvKGZhbHNlKSwKKyAgICAgIG1TeW5jUXVldWVzKGZhbHNlKSwKKyAgICAgIG1QYXVzZWQoZmFsc2UpLAorICAgICAgbVBhdXNlRHJhaW5BdWRpb0FsbG93ZWRVcygwKSwKKyAgICAgIG1WaWRlb1NhbXBsZVJlY2VpdmVkKGZhbHNlKSwKKyAgICAgIG1WaWRlb1JlbmRlcmluZ1N0YXJ0ZWQoZmFsc2UpLAorICAgICAgbVZpZGVvUmVuZGVyaW5nU3RhcnRHZW5lcmF0aW9uKDApLAorICAgICAgbUF1ZGlvUmVuZGVyaW5nU3RhcnRHZW5lcmF0aW9uKDApLAorICAgICAgbVJlbmRlcmluZ0RhdGFEZWxpdmVyZWQoZmFsc2UpLAorICAgICAgbU5leHRBdWRpb0Nsb2NrVXBkYXRlVGltZVVzKC0xKSwKKyAgICAgIG1MYXN0QXVkaW9NZWRpYVRpbWVVcygtMSksCisgICAgICBtQXVkaW9PZmZsb2FkUGF1c2VUaW1lb3V0R2VuZXJhdGlvbigwKSwKKyAgICAgIG1BdWRpb1Rvcm5Eb3duKGZhbHNlKSwKKyAgICAgIG1DdXJyZW50T2ZmbG9hZEluZm8oQVVESU9fSU5GT19JTklUSUFMSVpFUiksCisgICAgICBtQ3VycmVudFBjbUluZm8oQVVESU9fUENNSU5GT19JTklUSUFMSVpFUiksCisgICAgICBtVG90YWxCdWZmZXJzUXVldWVkKDApLAorICAgICAgbUxhc3RBdWRpb0J1ZmZlckRyYWluZWQoMCksCisgICAgICBtVXNlQXVkaW9DYWxsYmFjayhmYWxzZSksCisgICAgICBtV2FrZUxvY2sobmV3IEpXYWtlTG9jaygpKSB7CisgICAgQ0hFQ0sobWVkaWFDbG9jayAhPSBOVUxMKTsKKyAgICBtUGxheWJhY2tSYXRlID0gbVBsYXliYWNrU2V0dGluZ3MubVNwZWVkOworICAgIG1NZWRpYUNsb2NrLT5zZXRQbGF5YmFja1JhdGUobVBsYXliYWNrUmF0ZSk7Cit9CisKK051UGxheWVyMjo6UmVuZGVyZXI6On5SZW5kZXJlcigpIHsKKyAgICBpZiAob2ZmbG9hZGluZ0F1ZGlvKCkpIHsKKyAgICAgICAgbUF1ZGlvU2luay0+c3RvcCgpOworICAgICAgICBtQXVkaW9TaW5rLT5mbHVzaCgpOworICAgICAgICBtQXVkaW9TaW5rLT5jbG9zZSgpOworICAgIH0KKworICAgIC8vIFRyeSB0byBhdm9pZCByYWNpbmcgY29uZGl0aW9uIGluIGNhc2UgY2FsbGJhY2sgaXMgc3RpbGwgb24uCisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBpZiAobVVzZUF1ZGlvQ2FsbGJhY2spIHsKKyAgICAgICAgZmx1c2hRdWV1ZSgmbUF1ZGlvUXVldWUpOworICAgICAgICBmbHVzaFF1ZXVlKCZtVmlkZW9RdWV1ZSk7CisgICAgfQorICAgIG1XYWtlTG9jay5jbGVhcigpOworICAgIG1WaWRlb1NjaGVkdWxlci5jbGVhcigpOworICAgIG1Ob3RpZnkuY2xlYXIoKTsKKyAgICBtQXVkaW9TaW5rLmNsZWFyKCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6cXVldWVCdWZmZXIoCisgICAgICAgIGJvb2wgYXVkaW8sCisgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5Q29uc3VtZWQpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UXVldWVCdWZmZXIsIHRoaXMpOworICAgIG1zZy0+c2V0SW50MzIoInF1ZXVlR2VuZXJhdGlvbiIsIGdldFF1ZXVlR2VuZXJhdGlvbihhdWRpbykpOworICAgIG1zZy0+c2V0SW50MzIoImF1ZGlvIiwgc3RhdGljX2Nhc3Q8aW50MzJfdD4oYXVkaW8pKTsKKyAgICBtc2ctPnNldE9iamVjdCgiYnVmZmVyIiwgYnVmZmVyKTsKKyAgICBtc2ctPnNldE1lc3NhZ2UoIm5vdGlmeUNvbnN1bWVkIiwgbm90aWZ5Q29uc3VtZWQpOworICAgIG1zZy0+cG9zdCgpOworfQorCit2b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6OnF1ZXVlRU9TKGJvb2wgYXVkaW8sIHN0YXR1c190IGZpbmFsUmVzdWx0KSB7CisgICAgQ0hFQ0tfTkUoZmluYWxSZXN1bHQsIChzdGF0dXNfdClPSyk7CisKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UXVldWVFT1MsIHRoaXMpOworICAgIG1zZy0+c2V0SW50MzIoInF1ZXVlR2VuZXJhdGlvbiIsIGdldFF1ZXVlR2VuZXJhdGlvbihhdWRpbykpOworICAgIG1zZy0+c2V0SW50MzIoImF1ZGlvIiwgc3RhdGljX2Nhc3Q8aW50MzJfdD4oYXVkaW8pKTsKKyAgICBtc2ctPnNldEludDMyKCJmaW5hbFJlc3VsdCIsIGZpbmFsUmVzdWx0KTsKKyAgICBtc2ctPnBvc3QoKTsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6c2V0UGxheWJhY2tTZXR0aW5ncyhjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcmF0ZSkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDb25maWdQbGF5YmFjaywgdGhpcyk7CisgICAgd3JpdGVUb0FNZXNzYWdlKG1zZywgcmF0ZSk7CisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOworICAgIHN0YXR1c190IGVyciA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKKyAgICBpZiAoZXJyID09IE9LICYmIHJlc3BvbnNlICE9IE5VTEwpIHsKKyAgICAgICAgQ0hFQ0socmVzcG9uc2UtPmZpbmRJbnQzMigiZXJyIiwgJmVycikpOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0dXNfdCBOdVBsYXllcjI6OlJlbmRlcmVyOjpvbkNvbmZpZ1BsYXliYWNrKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZyYXRlIC8qIHNhbml0aXplZCAqLykgeworICAgIGlmIChyYXRlLm1TcGVlZCA9PSAwLmYpIHsKKyAgICAgICAgb25QYXVzZSgpOworICAgICAgICAvLyBkb24ndCBjYWxsIGF1ZGlvc2luaydzIHNldFBsYXliYWNrUmF0ZSBpZiBwYXVzaW5nLCBhcyBwaXRjaCBkb2VzIG5vdAorICAgICAgICAvLyBoYXZlIHRvIGNvcnJlc3BvbmQgdG8gdGhlIGFueSBub24tMCBzcGVlZCAoZS5nIG9sZCBzcGVlZCkuIEtlZXAKKyAgICAgICAgLy8gc2V0dGluZ3Mgbm9uZXRoZWxlc3MsIHVzaW5nIHRoZSBvbGQgc3BlZWQsIGluIGNhc2UgYXVkaW9zaW5rIGNoYW5nZXMuCisgICAgICAgIEF1ZGlvUGxheWJhY2tSYXRlIG5ld1JhdGUgPSByYXRlOworICAgICAgICBuZXdSYXRlLm1TcGVlZCA9IG1QbGF5YmFja1NldHRpbmdzLm1TcGVlZDsKKyAgICAgICAgbVBsYXliYWNrU2V0dGluZ3MgPSBuZXdSYXRlOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgaWYgKG1BdWRpb1NpbmsgIT0gTlVMTCAmJiBtQXVkaW9TaW5rLT5yZWFkeSgpKSB7CisgICAgICAgIHN0YXR1c190IGVyciA9IG1BdWRpb1NpbmstPnNldFBsYXliYWNrUmF0ZShyYXRlKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgIH0KKyAgICBtUGxheWJhY2tTZXR0aW5ncyA9IHJhdGU7CisgICAgbVBsYXliYWNrUmF0ZSA9IHJhdGUubVNwZWVkOworICAgIG1NZWRpYUNsb2NrLT5zZXRQbGF5YmFja1JhdGUobVBsYXliYWNrUmF0ZSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBOdVBsYXllcjI6OlJlbmRlcmVyOjpnZXRQbGF5YmFja1NldHRpbmdzKEF1ZGlvUGxheWJhY2tSYXRlICpyYXRlIC8qIG5vbm51bGwgKi8pIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0R2V0UGxheWJhY2tTZXR0aW5ncywgdGhpcyk7CisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOworICAgIHN0YXR1c190IGVyciA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKKyAgICBpZiAoZXJyID09IE9LICYmIHJlc3BvbnNlICE9IE5VTEwpIHsKKyAgICAgICAgQ0hFQ0socmVzcG9uc2UtPmZpbmRJbnQzMigiZXJyIiwgJmVycikpOworICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICByZWFkRnJvbUFNZXNzYWdlKHJlc3BvbnNlLCByYXRlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0dXNfdCBOdVBsYXllcjI6OlJlbmRlcmVyOjpvbkdldFBsYXliYWNrU2V0dGluZ3MoQXVkaW9QbGF5YmFja1JhdGUgKnJhdGUgLyogbm9ubnVsbCAqLykgeworICAgIGlmIChtQXVkaW9TaW5rICE9IE5VTEwgJiYgbUF1ZGlvU2luay0+cmVhZHkoKSkgeworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQXVkaW9TaW5rLT5nZXRQbGF5YmFja1JhdGUocmF0ZSk7CisgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgIGlmICghaXNBdWRpb1BsYXliYWNrUmF0ZUVxdWFsKCpyYXRlLCBtUGxheWJhY2tTZXR0aW5ncykpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiY29ycmVjdGluZyBtaXNtYXRjaCBpbiBpbnRlcm5hbC9leHRlcm5hbCBwbGF5YmFjayByYXRlIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBnZXQgcGxheWJhY2sgc2V0dGluZ3MgdXNlZCBieSBhdWRpb3NpbmssIGFzIGl0IG1heSBiZQorICAgICAgICAgICAgLy8gc2xpZ2h0bHkgb2ZmIGR1ZSB0byBhdWRpb3Npbmsgbm90IHRha2luZyBzbWFsbCBjaGFuZ2VzLgorICAgICAgICAgICAgbVBsYXliYWNrU2V0dGluZ3MgPSAqcmF0ZTsKKyAgICAgICAgICAgIGlmIChtUGF1c2VkKSB7CisgICAgICAgICAgICAgICAgcmF0ZS0+bVNwZWVkID0gMC5mOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgICpyYXRlID0gbVBsYXliYWNrU2V0dGluZ3M7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBOdVBsYXllcjI6OlJlbmRlcmVyOjpzZXRTeW5jU2V0dGluZ3MoY29uc3QgQVZTeW5jU2V0dGluZ3MgJnN5bmMsIGZsb2F0IHZpZGVvRnBzSGludCkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDb25maWdTeW5jLCB0aGlzKTsKKyAgICB3cml0ZVRvQU1lc3NhZ2UobXNnLCBzeW5jLCB2aWRlb0Zwc0hpbnQpOworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7CisgICAgaWYgKGVyciA9PSBPSyAmJiByZXNwb25zZSAhPSBOVUxMKSB7CisgICAgICAgIENIRUNLKHJlc3BvbnNlLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6b25Db25maWdTeW5jKGNvbnN0IEFWU3luY1NldHRpbmdzICZzeW5jLCBmbG9hdCB2aWRlb0Zwc0hpbnQgX191bnVzZWQpIHsKKyAgICBpZiAoc3luYy5tU291cmNlICE9IEFWU1lOQ19TT1VSQ0VfREVGQVVMVCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICAvLyBUT0RPOiBzdXBwb3J0IHN5bmMgc291cmNlcworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6Z2V0U3luY1NldHRpbmdzKEFWU3luY1NldHRpbmdzICpzeW5jLCBmbG9hdCAqdmlkZW9GcHMpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0R2V0U3luY1NldHRpbmdzLCB0aGlzKTsKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOworICAgIGlmIChlcnIgPT0gT0sgJiYgcmVzcG9uc2UgIT0gTlVMTCkgeworICAgICAgICBDSEVDSyhyZXNwb25zZS0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7CisgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgIHJlYWRGcm9tQU1lc3NhZ2UocmVzcG9uc2UsIHN5bmMsIHZpZGVvRnBzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0dXNfdCBOdVBsYXllcjI6OlJlbmRlcmVyOjpvbkdldFN5bmNTZXR0aW5ncygKKyAgICAgICAgQVZTeW5jU2V0dGluZ3MgKnN5bmMgLyogbm9ubnVsbCAqLywgZmxvYXQgKnZpZGVvRnBzIC8qIG5vbm51bGwgKi8pIHsKKyAgICAqc3luYyA9IG1TeW5jU2V0dGluZ3M7CisgICAgKnZpZGVvRnBzID0gLTEuZjsKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6Zmx1c2goYm9vbCBhdWRpbywgYm9vbCBub3RpZnlDb21wbGV0ZSkgeworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgICAgaWYgKGF1ZGlvKSB7CisgICAgICAgICAgICBtTm90aWZ5Q29tcGxldGVBdWRpbyB8PSBub3RpZnlDb21wbGV0ZTsKKyAgICAgICAgICAgIGNsZWFyQXVkaW9GaXJzdEFuY2hvclRpbWVfbCgpOworICAgICAgICAgICAgKyttQXVkaW9RdWV1ZUdlbmVyYXRpb247CisgICAgICAgICAgICArK21BdWRpb0RyYWluR2VuZXJhdGlvbjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Ob3RpZnlDb21wbGV0ZVZpZGVvIHw9IG5vdGlmeUNvbXBsZXRlOworICAgICAgICAgICAgKyttVmlkZW9RdWV1ZUdlbmVyYXRpb247CisgICAgICAgICAgICArK21WaWRlb0RyYWluR2VuZXJhdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIG1NZWRpYUNsb2NrLT5jbGVhckFuY2hvcigpOworICAgICAgICBtVmlkZW9MYXRlQnlVcyA9IDA7CisgICAgICAgIG1OZXh0VmlkZW9UaW1lTWVkaWFVcyA9IC0xOworICAgICAgICBtU3luY1F1ZXVlcyA9IGZhbHNlOworICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRGbHVzaCwgdGhpcyk7CisgICAgbXNnLT5zZXRJbnQzMigiYXVkaW8iLCBzdGF0aWNfY2FzdDxpbnQzMl90PihhdWRpbykpOworICAgIG1zZy0+cG9zdCgpOworfQorCit2b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6OnNpZ25hbFRpbWVEaXNjb250aW51aXR5KCkgeworfQorCit2b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6OnNpZ25hbERpc2FibGVPZmZsb2FkQXVkaW8oKSB7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdERpc2FibGVPZmZsb2FkQXVkaW8sIHRoaXMpKS0+cG9zdCgpOworfQorCit2b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6OnNpZ25hbEVuYWJsZU9mZmxvYWRBdWRpbygpIHsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0RW5hYmxlT2ZmbG9hZEF1ZGlvLCB0aGlzKSktPnBvc3QoKTsKK30KKwordm9pZCBOdVBsYXllcjI6OlJlbmRlcmVyOjpwYXVzZSgpIHsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0UGF1c2UsIHRoaXMpKS0+cG9zdCgpOworfQorCit2b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6OnJlc3VtZSgpIHsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0UmVzdW1lLCB0aGlzKSktPnBvc3QoKTsKK30KKwordm9pZCBOdVBsYXllcjI6OlJlbmRlcmVyOjpzZXRWaWRlb0ZyYW1lUmF0ZShmbG9hdCBmcHMpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2V0VmlkZW9GcmFtZVJhdGUsIHRoaXMpOworICAgIG1zZy0+c2V0RmxvYXQoImZyYW1lLXJhdGUiLCBmcHMpOworICAgIG1zZy0+cG9zdCgpOworfQorCisvLyBDYWxsZWQgb24gYW55IHRocmVhZHMgd2l0aG91dCBtTG9jayBhY3F1aXJlZC4KK3N0YXR1c190IE51UGxheWVyMjo6UmVuZGVyZXI6OmdldEN1cnJlbnRQb3NpdGlvbihpbnQ2NF90ICptZWRpYVVzKSB7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gbU1lZGlhQ2xvY2stPmdldE1lZGlhVGltZShBTG9vcGVyOjpHZXROb3dVcygpLCBtZWRpYVVzKTsKKyAgICBpZiAocmVzdWx0ID09IE9LKSB7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLy8gTWVkaWFDbG9jayBoYXMgbm90IHN0YXJ0ZWQgeWV0LiBUcnkgdG8gc3RhcnQgaXQgaWYgcG9zc2libGUuCisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICAgICBpZiAobUF1ZGlvRmlyc3RBbmNob3JUaW1lTWVkaWFVcyA9PSAtMSkgeworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIEF1ZGlvVGltZXN0YW1wIHRzOworICAgICAgICBzdGF0dXNfdCByZXMgPSBtQXVkaW9TaW5rLT5nZXRUaW1lc3RhbXAodHMpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgLy8gQXVkaW9TaW5rIGhhcyByZW5kZXJlZCBzb21lIGZyYW1lcy4KKyAgICAgICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisgICAgICAgIGludDY0X3Qgbm93TWVkaWFVcyA9IG1BdWRpb1NpbmstPmdldFBsYXllZE91dER1cmF0aW9uVXMobm93VXMpCisgICAgICAgICAgICAgICAgKyBtQXVkaW9GaXJzdEFuY2hvclRpbWVNZWRpYVVzOworICAgICAgICBtTWVkaWFDbG9jay0+dXBkYXRlQW5jaG9yKG5vd01lZGlhVXMsIG5vd1VzLCAtMSk7CisgICAgfQorCisgICAgcmV0dXJuIG1NZWRpYUNsb2NrLT5nZXRNZWRpYVRpbWUoQUxvb3Blcjo6R2V0Tm93VXMoKSwgbWVkaWFVcyk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6Y2xlYXJBdWRpb0ZpcnN0QW5jaG9yVGltZV9sKCkgeworICAgIG1BdWRpb0ZpcnN0QW5jaG9yVGltZU1lZGlhVXMgPSAtMTsKKyAgICBtTWVkaWFDbG9jay0+c2V0U3RhcnRpbmdUaW1lTWVkaWEoLTEpOworfQorCit2b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6OnNldEF1ZGlvRmlyc3RBbmNob3JUaW1lSWZOZWVkZWRfbChpbnQ2NF90IG1lZGlhVXMpIHsKKyAgICBpZiAobUF1ZGlvRmlyc3RBbmNob3JUaW1lTWVkaWFVcyA9PSAtMSkgeworICAgICAgICBtQXVkaW9GaXJzdEFuY2hvclRpbWVNZWRpYVVzID0gbWVkaWFVczsKKyAgICAgICAgbU1lZGlhQ2xvY2stPnNldFN0YXJ0aW5nVGltZU1lZGlhKG1lZGlhVXMpOworICAgIH0KK30KKworLy8gQ2FsbGVkIG9uIHJlbmRlcmVyIGxvb3Blci4KK3ZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6Y2xlYXJBbmNob3JUaW1lKCkgeworICAgIG1NZWRpYUNsb2NrLT5jbGVhckFuY2hvcigpOworICAgIG1BbmNob3JUaW1lTWVkaWFVcyA9IC0xOworICAgIG1BbmNob3JOdW1GcmFtZXNXcml0dGVuID0gLTE7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6c2V0VmlkZW9MYXRlQnlVcyhpbnQ2NF90IGxhdGVVcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgbVZpZGVvTGF0ZUJ5VXMgPSBsYXRlVXM7Cit9CisKK2ludDY0X3QgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6Z2V0VmlkZW9MYXRlQnlVcygpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIHJldHVybiBtVmlkZW9MYXRlQnlVczsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6b3BlbkF1ZGlvU2luaygKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgIGJvb2wgb2ZmbG9hZE9ubHksCisgICAgICAgIGJvb2wgaGFzVmlkZW8sCisgICAgICAgIHVpbnQzMl90IGZsYWdzLAorICAgICAgICBib29sICppc09mZmxvYWRlZCwKKyAgICAgICAgYm9vbCBpc1N0cmVhbWluZykgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRPcGVuQXVkaW9TaW5rLCB0aGlzKTsKKyAgICBtc2ctPnNldE1lc3NhZ2UoImZvcm1hdCIsIGZvcm1hdCk7CisgICAgbXNnLT5zZXRJbnQzMigib2ZmbG9hZC1vbmx5Iiwgb2ZmbG9hZE9ubHkpOworICAgIG1zZy0+c2V0SW50MzIoImhhcy12aWRlbyIsIGhhc1ZpZGVvKTsKKyAgICBtc2ctPnNldEludDMyKCJmbGFncyIsIGZsYWdzKTsKKyAgICBtc2ctPnNldEludDMyKCJpc1N0cmVhbWluZyIsIGlzU3RyZWFtaW5nKTsKKworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKKyAgICBzdGF0dXNfdCBwb3N0U3RhdHVzID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOworCisgICAgaW50MzJfdCBlcnI7CisgICAgaWYgKHBvc3RTdGF0dXMgIT0gT0sgfHwgcmVzcG9uc2UuZ2V0KCkgPT0gbnVsbHB0ciB8fCAhcmVzcG9uc2UtPmZpbmRJbnQzMigiZXJyIiwgJmVycikpIHsKKyAgICAgICAgZXJyID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfSBlbHNlIGlmIChlcnIgPT0gT0sgJiYgaXNPZmZsb2FkZWQgIT0gTlVMTCkgeworICAgICAgICBpbnQzMl90IG9mZmxvYWQ7CisgICAgICAgIENIRUNLKHJlc3BvbnNlLT5maW5kSW50MzIoIm9mZmxvYWQiLCAmb2ZmbG9hZCkpOworICAgICAgICAqaXNPZmZsb2FkZWQgPSAob2ZmbG9hZCAhPSAwKTsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKwordm9pZCBOdVBsYXllcjI6OlJlbmRlcmVyOjpjbG9zZUF1ZGlvU2luaygpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2xvc2VBdWRpb1NpbmssIHRoaXMpOworCisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOworICAgIG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKK30KKwordm9pZCBOdVBsYXllcjI6OlJlbmRlcmVyOjpjaGFuZ2VBdWRpb0Zvcm1hdCgKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgIGJvb2wgb2ZmbG9hZE9ubHksCisgICAgICAgIGJvb2wgaGFzVmlkZW8sCisgICAgICAgIHVpbnQzMl90IGZsYWdzLAorICAgICAgICBib29sIGlzU3RyZWFtaW5nLAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSkgeworICAgIHNwPEFNZXNzYWdlPiBtZXRhID0gbmV3IEFNZXNzYWdlOworICAgIG1ldGEtPnNldE1lc3NhZ2UoImZvcm1hdCIsIGZvcm1hdCk7CisgICAgbWV0YS0+c2V0SW50MzIoIm9mZmxvYWQtb25seSIsIG9mZmxvYWRPbmx5KTsKKyAgICBtZXRhLT5zZXRJbnQzMigiaGFzLXZpZGVvIiwgaGFzVmlkZW8pOworICAgIG1ldGEtPnNldEludDMyKCJmbGFncyIsIGZsYWdzKTsKKyAgICBtZXRhLT5zZXRJbnQzMigiaXNTdHJlYW1pbmciLCBpc1N0cmVhbWluZyk7CisKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2hhbmdlQXVkaW9Gb3JtYXQsIHRoaXMpOworICAgIG1zZy0+c2V0SW50MzIoInF1ZXVlR2VuZXJhdGlvbiIsIGdldFF1ZXVlR2VuZXJhdGlvbih0cnVlIC8qIGF1ZGlvICovKSk7CisgICAgbXNnLT5zZXRNZXNzYWdlKCJub3RpZnkiLCBub3RpZnkpOworICAgIG1zZy0+c2V0TWVzc2FnZSgibWV0YSIsIG1ldGEpOworICAgIG1zZy0+cG9zdCgpOworfQorCit2b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICBjYXNlIGtXaGF0T3BlbkF1ZGlvU2luazoKKyAgICAgICAgeworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoImZvcm1hdCIsICZmb3JtYXQpKTsKKworICAgICAgICAgICAgaW50MzJfdCBvZmZsb2FkT25seTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJvZmZsb2FkLW9ubHkiLCAmb2ZmbG9hZE9ubHkpKTsKKworICAgICAgICAgICAgaW50MzJfdCBoYXNWaWRlbzsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJoYXMtdmlkZW8iLCAmaGFzVmlkZW8pKTsKKworICAgICAgICAgICAgdWludDMyX3QgZmxhZ3M7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZmxhZ3MiLCAoaW50MzJfdCAqKSZmbGFncykpOworCisgICAgICAgICAgICB1aW50MzJfdCBpc1N0cmVhbWluZzsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJpc1N0cmVhbWluZyIsIChpbnQzMl90ICopJmlzU3RyZWFtaW5nKSk7CisKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG9uT3BlbkF1ZGlvU2luayhmb3JtYXQsIG9mZmxvYWRPbmx5LCBoYXNWaWRlbywgZmxhZ3MsIGlzU3RyZWFtaW5nKTsKKworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOworICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOworICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJvZmZsb2FkIiwgb2ZmbG9hZGluZ0F1ZGlvKCkpOworCisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdENsb3NlQXVkaW9TaW5rOgorICAgICAgICB7CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKKworICAgICAgICAgICAgb25DbG9zZUF1ZGlvU2luaygpOworCisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0U3RvcEF1ZGlvU2luazoKKyAgICAgICAgeworICAgICAgICAgICAgbUF1ZGlvU2luay0+c3RvcCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0Q2hhbmdlQXVkaW9Gb3JtYXQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgcXVldWVHZW5lcmF0aW9uOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInF1ZXVlR2VuZXJhdGlvbiIsICZxdWV1ZUdlbmVyYXRpb24pKTsKKworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoIm5vdGlmeSIsICZub3RpZnkpKTsKKworICAgICAgICAgICAgaWYgKG9mZmxvYWRpbmdBdWRpbygpKSB7CisgICAgICAgICAgICAgICAgQUxPR1coImNoYW5nZUF1ZGlvRm9ybWF0IHNob3VsZCBOT1QgYmUgY2FsbGVkIGluIG9mZmxvYWQgbW9kZSIpOworICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImVyciIsIElOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1ldGE7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJtZXRhIiwgJm1ldGEpKTsKKworICAgICAgICAgICAgaWYgKHF1ZXVlR2VuZXJhdGlvbiAhPSBnZXRRdWV1ZUdlbmVyYXRpb24odHJ1ZSAvKiBhdWRpbyAqLykKKyAgICAgICAgICAgICAgICAgICAgfHwgbUF1ZGlvUXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIG9uQ2hhbmdlQXVkaW9Gb3JtYXQobWV0YSwgbm90aWZ5KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgUXVldWVFbnRyeSBlbnRyeTsKKyAgICAgICAgICAgIGVudHJ5Lm1Ob3RpZnlDb25zdW1lZCA9IG5vdGlmeTsKKyAgICAgICAgICAgIGVudHJ5Lm1NZXRhID0gbWV0YTsKKworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgICAgICAgIG1BdWRpb1F1ZXVlLnB1c2hfYmFjayhlbnRyeSk7CisgICAgICAgICAgICBwb3N0RHJhaW5BdWRpb1F1ZXVlX2woKTsKKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0RHJhaW5BdWRpb1F1ZXVlOgorICAgICAgICB7CisgICAgICAgICAgICBtRHJhaW5BdWRpb1F1ZXVlUGVuZGluZyA9IGZhbHNlOworCisgICAgICAgICAgICBpbnQzMl90IGdlbmVyYXRpb247CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZHJhaW5HZW5lcmF0aW9uIiwgJmdlbmVyYXRpb24pKTsKKyAgICAgICAgICAgIGlmIChnZW5lcmF0aW9uICE9IGdldERyYWluR2VuZXJhdGlvbih0cnVlIC8qIGF1ZGlvICovKSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAob25EcmFpbkF1ZGlvUXVldWUoKSkgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IG51bUZyYW1lc1BsYXllZDsKKyAgICAgICAgICAgICAgICBDSEVDS19FUShtQXVkaW9TaW5rLT5nZXRQb3NpdGlvbigmbnVtRnJhbWVzUGxheWVkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoc3RhdHVzX3QpT0spOworCisgICAgICAgICAgICAgICAgLy8gSGFuZGxlIEF1ZGlvVHJhY2sgcmFjZSB3aGVuIHN0YXJ0IGlzIGltbWVkaWF0ZWx5IGNhbGxlZCBhZnRlciBmbHVzaC4KKyAgICAgICAgICAgICAgICB1aW50MzJfdCBudW1GcmFtZXNQZW5kaW5nUGxheW91dCA9CisgICAgICAgICAgICAgICAgICAgIChtTnVtRnJhbWVzV3JpdHRlbiA+IG51bUZyYW1lc1BsYXllZCA/CisgICAgICAgICAgICAgICAgICAgICAgICBtTnVtRnJhbWVzV3JpdHRlbiAtIG51bUZyYW1lc1BsYXllZCA6IDApOworCisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBob3cgbG9uZyB0aGUgYXVkaW8gc2luayB3aWxsIGhhdmUgZGF0YSB0bworICAgICAgICAgICAgICAgIC8vIHBsYXkgYmFjay4KKyAgICAgICAgICAgICAgICBpbnQ2NF90IGRlbGF5VXMgPQorICAgICAgICAgICAgICAgICAgICBtQXVkaW9TaW5rLT5tc2Vjc1BlckZyYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICogbnVtRnJhbWVzUGVuZGluZ1BsYXlvdXQgKiAxMDAwbGw7CisgICAgICAgICAgICAgICAgaWYgKG1QbGF5YmFja1JhdGUgPiAxLjBmKSB7CisgICAgICAgICAgICAgICAgICAgIGRlbGF5VXMgLz0gbVBsYXliYWNrUmF0ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBMZXQncyBnaXZlIGl0IG1vcmUgZGF0YSBhZnRlciBhYm91dCBoYWxmIHRoYXQgdGltZQorICAgICAgICAgICAgICAgIC8vIGhhcyBlbGFwc2VkLgorICAgICAgICAgICAgICAgIGRlbGF5VXMgLz0gMjsKKyAgICAgICAgICAgICAgICAvLyBjaGVjayB0aGUgYnVmZmVyIHNpemUgdG8gZXN0aW1hdGUgbWF4aW11bSBkZWxheSBwZXJtaXR0ZWQuCisgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCBtYXhEcmFpbkRlbGF5VXMgPSBzdGQ6Om1heCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb1NpbmstPmdldEJ1ZmZlckR1cmF0aW9uSW5VcygpLCAoaW50NjRfdCk1MDAwMDAgLyogaGFsZiBzZWNvbmQgKi8pOworICAgICAgICAgICAgICAgIEFMT0dEX0lGKGRlbGF5VXMgPiBtYXhEcmFpbkRlbGF5VXMsICJwb3N0RHJhaW5BdWRpb1F1ZXVlIGxvbmcgZGVsYXk6ICVsbGQgPiAlbGxkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpZGVsYXlVcywgKGxvbmcgbG9uZyltYXhEcmFpbkRlbGF5VXMpOworICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgICAgICAgICAgICAgcG9zdERyYWluQXVkaW9RdWV1ZV9sKGRlbGF5VXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0RHJhaW5WaWRlb1F1ZXVlOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IGdlbmVyYXRpb247CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZHJhaW5HZW5lcmF0aW9uIiwgJmdlbmVyYXRpb24pKTsKKyAgICAgICAgICAgIGlmIChnZW5lcmF0aW9uICE9IGdldERyYWluR2VuZXJhdGlvbihmYWxzZSAvKiBhdWRpbyAqLykpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbURyYWluVmlkZW9RdWV1ZVBlbmRpbmcgPSBmYWxzZTsKKworICAgICAgICAgICAgb25EcmFpblZpZGVvUXVldWUoKTsKKworICAgICAgICAgICAgcG9zdERyYWluVmlkZW9RdWV1ZSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0UG9zdERyYWluVmlkZW9RdWV1ZToKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCBnZW5lcmF0aW9uOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImRyYWluR2VuZXJhdGlvbiIsICZnZW5lcmF0aW9uKSk7CisgICAgICAgICAgICBpZiAoZ2VuZXJhdGlvbiAhPSBnZXREcmFpbkdlbmVyYXRpb24oZmFsc2UgLyogYXVkaW8gKi8pKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1EcmFpblZpZGVvUXVldWVQZW5kaW5nID0gZmFsc2U7CisgICAgICAgICAgICBwb3N0RHJhaW5WaWRlb1F1ZXVlKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRRdWV1ZUJ1ZmZlcjoKKyAgICAgICAgeworICAgICAgICAgICAgb25RdWV1ZUJ1ZmZlcihtc2cpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0UXVldWVFT1M6CisgICAgICAgIHsKKyAgICAgICAgICAgIG9uUXVldWVFT1MobXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdEVPUzoKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCBnZW5lcmF0aW9uOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImF1ZGlvRU9TR2VuZXJhdGlvbiIsICZnZW5lcmF0aW9uKSk7CisgICAgICAgICAgICBpZiAoZ2VuZXJhdGlvbiAhPSBtQXVkaW9FT1NHZW5lcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXNfdCBmaW5hbFJlc3VsdDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJmaW5hbFJlc3VsdCIsICZmaW5hbFJlc3VsdCkpOworICAgICAgICAgICAgbm90aWZ5RU9TKHRydWUgLyogYXVkaW8gKi8sIGZpbmFsUmVzdWx0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdENvbmZpZ1BsYXliYWNrOgorICAgICAgICB7CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKKyAgICAgICAgICAgIEF1ZGlvUGxheWJhY2tSYXRlIHJhdGU7CisgICAgICAgICAgICByZWFkRnJvbUFNZXNzYWdlKG1zZywgJnJhdGUpOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gb25Db25maWdQbGF5YmFjayhyYXRlKTsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRHZXRQbGF5YmFja1NldHRpbmdzOgorICAgICAgICB7CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKKyAgICAgICAgICAgIEF1ZGlvUGxheWJhY2tSYXRlIHJhdGUgPSBBVURJT19QTEFZQkFDS19SQVRFX0RFRkFVTFQ7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBvbkdldFBsYXliYWNrU2V0dGluZ3MoJnJhdGUpOworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOworICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgIHdyaXRlVG9BTWVzc2FnZShyZXNwb25zZSwgcmF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7CisgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0Q29uZmlnU3luYzoKKyAgICAgICAgeworICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CisgICAgICAgICAgICBBVlN5bmNTZXR0aW5ncyBzeW5jOworICAgICAgICAgICAgZmxvYXQgdmlkZW9GcHNIaW50OworICAgICAgICAgICAgcmVhZEZyb21BTWVzc2FnZShtc2csICZzeW5jLCAmdmlkZW9GcHNIaW50KTsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG9uQ29uZmlnU3luYyhzeW5jLCB2aWRlb0Zwc0hpbnQpOworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOworICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOworICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdEdldFN5bmNTZXR0aW5nczoKKyAgICAgICAgeworICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CisKKyAgICAgICAgICAgIEFMT0dWKCJrV2hhdEdldFN5bmNTZXR0aW5ncyIpOworICAgICAgICAgICAgQVZTeW5jU2V0dGluZ3Mgc3luYzsKKyAgICAgICAgICAgIGZsb2F0IHZpZGVvRnBzID0gLTEuZjsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG9uR2V0U3luY1NldHRpbmdzKCZzeW5jLCAmdmlkZW9GcHMpOworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOworICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgIHdyaXRlVG9BTWVzc2FnZShyZXNwb25zZSwgc3luYywgdmlkZW9GcHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOworICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdEZsdXNoOgorICAgICAgICB7CisgICAgICAgICAgICBvbkZsdXNoKG1zZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXREaXNhYmxlT2ZmbG9hZEF1ZGlvOgorICAgICAgICB7CisgICAgICAgICAgICBvbkRpc2FibGVPZmZsb2FkQXVkaW8oKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdEVuYWJsZU9mZmxvYWRBdWRpbzoKKyAgICAgICAgeworICAgICAgICAgICAgb25FbmFibGVPZmZsb2FkQXVkaW8oKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdFBhdXNlOgorICAgICAgICB7CisgICAgICAgICAgICBvblBhdXNlKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRSZXN1bWU6CisgICAgICAgIHsKKyAgICAgICAgICAgIG9uUmVzdW1lKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRTZXRWaWRlb0ZyYW1lUmF0ZToKKyAgICAgICAgeworICAgICAgICAgICAgZmxvYXQgZnBzOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kRmxvYXQoImZyYW1lLXJhdGUiLCAmZnBzKSk7CisgICAgICAgICAgICBvblNldFZpZGVvRnJhbWVSYXRlKGZwcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRBdWRpb1RlYXJEb3duOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IHJlYXNvbjsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJyZWFzb24iLCAmcmVhc29uKSk7CisKKyAgICAgICAgICAgIG9uQXVkaW9UZWFyRG93bigoQXVkaW9UZWFyRG93blJlYXNvbilyZWFzb24pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0QXVkaW9PZmZsb2FkUGF1c2VUaW1lb3V0OgorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IGdlbmVyYXRpb247CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZHJhaW5HZW5lcmF0aW9uIiwgJmdlbmVyYXRpb24pKTsKKyAgICAgICAgICAgIGlmIChnZW5lcmF0aW9uICE9IG1BdWRpb09mZmxvYWRQYXVzZVRpbWVvdXRHZW5lcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigiQXVkaW8gT2ZmbG9hZCB0ZWFyIGRvd24gZHVlIHRvIHBhdXNlIHRpbWVvdXQuIik7CisgICAgICAgICAgICBvbkF1ZGlvVGVhckRvd24oa0R1ZVRvVGltZW91dCk7CisgICAgICAgICAgICBtV2FrZUxvY2stPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFRSRVNQQVNTKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6cG9zdERyYWluQXVkaW9RdWV1ZV9sKGludDY0X3QgZGVsYXlVcykgeworICAgIGlmIChtRHJhaW5BdWRpb1F1ZXVlUGVuZGluZyB8fCBtU3luY1F1ZXVlcyB8fCBtVXNlQXVkaW9DYWxsYmFjaykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1BdWRpb1F1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIEZJWE1FOiBpZiBwYXVzZWQsIHdhaXQgdW50aWwgQXVkaW9UcmFjayBzdG9wKCkgaXMgY29tcGxldGUgYmVmb3JlIGRlbGl2ZXJpbmcgZGF0YS4KKyAgICBpZiAobVBhdXNlZCkgeworICAgICAgICBjb25zdCBpbnQ2NF90IGRpZmZVcyA9IG1QYXVzZURyYWluQXVkaW9BbGxvd2VkVXMgLSBBTG9vcGVyOjpHZXROb3dVcygpOworICAgICAgICBpZiAoZGlmZlVzID4gZGVsYXlVcykgeworICAgICAgICAgICAgZGVsYXlVcyA9IGRpZmZVczsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1EcmFpbkF1ZGlvUXVldWVQZW5kaW5nID0gdHJ1ZTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0RHJhaW5BdWRpb1F1ZXVlLCB0aGlzKTsKKyAgICBtc2ctPnNldEludDMyKCJkcmFpbkdlbmVyYXRpb24iLCBtQXVkaW9EcmFpbkdlbmVyYXRpb24pOworICAgIG1zZy0+cG9zdChkZWxheVVzKTsKK30KKwordm9pZCBOdVBsYXllcjI6OlJlbmRlcmVyOjpwcmVwYXJlRm9yTWVkaWFSZW5kZXJpbmdTdGFydF9sKCkgeworICAgIG1BdWRpb1JlbmRlcmluZ1N0YXJ0R2VuZXJhdGlvbiA9IG1BdWRpb0RyYWluR2VuZXJhdGlvbjsKKyAgICBtVmlkZW9SZW5kZXJpbmdTdGFydEdlbmVyYXRpb24gPSBtVmlkZW9EcmFpbkdlbmVyYXRpb247CisgICAgbVJlbmRlcmluZ0RhdGFEZWxpdmVyZWQgPSBmYWxzZTsKK30KKwordm9pZCBOdVBsYXllcjI6OlJlbmRlcmVyOjpub3RpZnlJZk1lZGlhUmVuZGVyaW5nU3RhcnRlZF9sKCkgeworICAgIGlmIChtVmlkZW9SZW5kZXJpbmdTdGFydEdlbmVyYXRpb24gPT0gbVZpZGVvRHJhaW5HZW5lcmF0aW9uICYmCisgICAgICAgIG1BdWRpb1JlbmRlcmluZ1N0YXJ0R2VuZXJhdGlvbiA9PSBtQXVkaW9EcmFpbkdlbmVyYXRpb24pIHsKKyAgICAgICAgbVJlbmRlcmluZ0RhdGFEZWxpdmVyZWQgPSB0cnVlOworICAgICAgICBpZiAobVBhdXNlZCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1WaWRlb1JlbmRlcmluZ1N0YXJ0R2VuZXJhdGlvbiA9IC0xOworICAgICAgICBtQXVkaW9SZW5kZXJpbmdTdGFydEdlbmVyYXRpb24gPSAtMTsKKworICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdE1lZGlhUmVuZGVyaW5nU3RhcnQpOworICAgICAgICBub3RpZnktPnBvc3QoKTsKKyAgICB9Cit9CisKKy8vIHN0YXRpYworc2l6ZV90IE51UGxheWVyMjo6UmVuZGVyZXI6OkF1ZGlvU2lua0NhbGxiYWNrKAorICAgICAgICBNZWRpYVBsYXllcjJCYXNlOjpBdWRpb1NpbmsgKiAvKiBhdWRpb1NpbmsgKi8sCisgICAgICAgIHZvaWQgKmJ1ZmZlciwKKyAgICAgICAgc2l6ZV90IHNpemUsCisgICAgICAgIHZvaWQgKmNvb2tpZSwKKyAgICAgICAgTWVkaWFQbGF5ZXIyQmFzZTo6QXVkaW9TaW5rOjpjYl9ldmVudF90IGV2ZW50KSB7CisgICAgTnVQbGF5ZXIyOjpSZW5kZXJlciAqbWUgPSAoTnVQbGF5ZXIyOjpSZW5kZXJlciAqKWNvb2tpZTsKKworICAgIHN3aXRjaCAoZXZlbnQpIHsKKyAgICAgICAgY2FzZSBNZWRpYVBsYXllcjJCYXNlOjpBdWRpb1Npbms6OkNCX0VWRU5UX0ZJTExfQlVGRkVSOgorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbWUtPmZpbGxBdWRpb0J1ZmZlcihidWZmZXIsIHNpemUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE1lZGlhUGxheWVyMkJhc2U6OkF1ZGlvU2luazo6Q0JfRVZFTlRfU1RSRUFNX0VORDoKKyAgICAgICAgeworICAgICAgICAgICAgQUxPR1YoIkF1ZGlvU2luazo6Q0JfRVZFTlRfU1RSRUFNX0VORCIpOworICAgICAgICAgICAgbWUtPm5vdGlmeUVPU0NhbGxiYWNrKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgTWVkaWFQbGF5ZXIyQmFzZTo6QXVkaW9TaW5rOjpDQl9FVkVOVF9URUFSX0RPV046CisgICAgICAgIHsKKyAgICAgICAgICAgIEFMT0dWKCJBdWRpb1Npbms6OkNCX0VWRU5UX1RFQVJfRE9XTiIpOworICAgICAgICAgICAgbWUtPm5vdGlmeUF1ZGlvVGVhckRvd24oa0R1ZVRvRXJyb3IpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBOdVBsYXllcjI6OlJlbmRlcmVyOjpub3RpZnlFT1NDYWxsYmFjaygpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgaWYgKCFtVXNlQXVkaW9DYWxsYmFjaykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbm90aWZ5RU9TX2wodHJ1ZSAvKiBhdWRpbyAqLywgRVJST1JfRU5EX09GX1NUUkVBTSk7Cit9CisKK3NpemVfdCBOdVBsYXllcjI6OlJlbmRlcmVyOjpmaWxsQXVkaW9CdWZmZXIodm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAoIW1Vc2VBdWRpb0NhbGxiYWNrKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGJvb2wgaGFzRU9TID0gZmFsc2U7CisKKyAgICBzaXplX3Qgc2l6ZUNvcGllZCA9IDA7CisgICAgYm9vbCBmaXJzdEVudHJ5ID0gdHJ1ZTsKKyAgICBRdWV1ZUVudHJ5ICplbnRyeTsgIC8vIHdpbGwgYmUgdmFsaWQgYWZ0ZXIgd2hpbGUgbG9vcCBpZiBoYXNFT1MgaXMgc2V0LgorICAgIHdoaWxlIChzaXplQ29waWVkIDwgc2l6ZSAmJiAhbUF1ZGlvUXVldWUuZW1wdHkoKSkgeworICAgICAgICBlbnRyeSA9ICYqbUF1ZGlvUXVldWUuYmVnaW4oKTsKKworICAgICAgICBpZiAoZW50cnktPm1CdWZmZXIgPT0gTlVMTCkgeyAvLyBFT1MKKyAgICAgICAgICAgIGhhc0VPUyA9IHRydWU7CisgICAgICAgICAgICBtQXVkaW9RdWV1ZS5lcmFzZShtQXVkaW9RdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZpcnN0RW50cnkgJiYgZW50cnktPm1PZmZzZXQgPT0gMCkgeworICAgICAgICAgICAgZmlyc3RFbnRyeSA9IGZhbHNlOworICAgICAgICAgICAgaW50NjRfdCBtZWRpYVRpbWVVczsKKyAgICAgICAgICAgIENIRUNLKGVudHJ5LT5tQnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJm1lZGlhVGltZVVzKSk7CisgICAgICAgICAgICBBTE9HVigiZmlsbEF1ZGlvQnVmZmVyOiByZW5kZXJpbmcgYXVkaW8gYXQgbWVkaWEgdGltZSAlLjJmIHNlY3MiLCBtZWRpYVRpbWVVcyAvIDFFNik7CisgICAgICAgICAgICBzZXRBdWRpb0ZpcnN0QW5jaG9yVGltZUlmTmVlZGVkX2wobWVkaWFUaW1lVXMpOworICAgICAgICB9CisKKyAgICAgICAgc2l6ZV90IGNvcHkgPSBlbnRyeS0+bUJ1ZmZlci0+c2l6ZSgpIC0gZW50cnktPm1PZmZzZXQ7CisgICAgICAgIHNpemVfdCBzaXplUmVtYWluaW5nID0gc2l6ZSAtIHNpemVDb3BpZWQ7CisgICAgICAgIGlmIChjb3B5ID4gc2l6ZVJlbWFpbmluZykgeworICAgICAgICAgICAgY29weSA9IHNpemVSZW1haW5pbmc7CisgICAgICAgIH0KKworICAgICAgICBtZW1jcHkoKGNoYXIgKilidWZmZXIgKyBzaXplQ29waWVkLAorICAgICAgICAgICAgICAgZW50cnktPm1CdWZmZXItPmRhdGEoKSArIGVudHJ5LT5tT2Zmc2V0LAorICAgICAgICAgICAgICAgY29weSk7CisKKyAgICAgICAgZW50cnktPm1PZmZzZXQgKz0gY29weTsKKyAgICAgICAgaWYgKGVudHJ5LT5tT2Zmc2V0ID09IGVudHJ5LT5tQnVmZmVyLT5zaXplKCkpIHsKKyAgICAgICAgICAgIGVudHJ5LT5tTm90aWZ5Q29uc3VtZWQtPnBvc3QoKTsKKyAgICAgICAgICAgIG1BdWRpb1F1ZXVlLmVyYXNlKG1BdWRpb1F1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgZW50cnkgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIHNpemVDb3BpZWQgKz0gY29weTsKKworICAgICAgICBub3RpZnlJZk1lZGlhUmVuZGVyaW5nU3RhcnRlZF9sKCk7CisgICAgfQorCisgICAgaWYgKG1BdWRpb0ZpcnN0QW5jaG9yVGltZU1lZGlhVXMgPj0gMCkgeworICAgICAgICBpbnQ2NF90IG5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKyAgICAgICAgaW50NjRfdCBub3dNZWRpYVVzID0KKyAgICAgICAgICAgIG1BdWRpb0ZpcnN0QW5jaG9yVGltZU1lZGlhVXMgKyBtQXVkaW9TaW5rLT5nZXRQbGF5ZWRPdXREdXJhdGlvblVzKG5vd1VzKTsKKyAgICAgICAgLy8gd2UgZG9uJ3Qga25vdyBob3cgbXVjaCBkYXRhIHdlIGFyZSBxdWV1ZWluZyBmb3Igb2ZmbG9hZGVkIHRyYWNrcy4KKyAgICAgICAgbU1lZGlhQ2xvY2stPnVwZGF0ZUFuY2hvcihub3dNZWRpYVVzLCBub3dVcywgSU5UNjRfTUFYKTsKKyAgICB9CisKKyAgICAvLyBmb3Igbm9uLW9mZmxvYWRlZCBhdWRpbywgd2UgbmVlZCB0byBjb21wdXRlIHRoZSBmcmFtZXMgd3JpdHRlbiBiZWNhdXNlCisgICAgLy8gdGhlcmUgaXMgbm8gRVZFTlRfU1RSRUFNX0VORCBub3RpZmljYXRpb24uIFRoZSBmcmFtZXMgd3JpdHRlbiBnaXZlcworICAgIC8vIGFuIGVzdGltYXRlIG9uIHRoZSBwZW5kaW5nIHBsYXllZCBvdXQgZHVyYXRpb24uCisgICAgaWYgKCFvZmZsb2FkaW5nQXVkaW8oKSkgeworICAgICAgICBtTnVtRnJhbWVzV3JpdHRlbiArPSBzaXplQ29waWVkIC8gbUF1ZGlvU2luay0+ZnJhbWVTaXplKCk7CisgICAgfQorCisgICAgaWYgKGhhc0VPUykgeworICAgICAgICAobmV3IEFNZXNzYWdlKGtXaGF0U3RvcEF1ZGlvU2luaywgdGhpcykpLT5wb3N0KCk7CisgICAgICAgIC8vIEFzIHRoZXJlIGlzIGN1cnJlbnRseSBubyBFVkVOVF9TVFJFQU1fRU5EIGNhbGxiYWNrIG5vdGlmaWNhdGlvbiBmb3IKKyAgICAgICAgLy8gbm9uLW9mZmxvYWRlZCBhdWRpbyB0cmFja3MsIHdlIG5lZWQgdG8gcG9zdCB0aGUgRU9TIG91cnNlbHZlcy4KKyAgICAgICAgaWYgKCFvZmZsb2FkaW5nQXVkaW8oKSkgeworICAgICAgICAgICAgaW50NjRfdCBwb3N0RU9TRGVsYXlVcyA9IDA7CisgICAgICAgICAgICBpZiAobUF1ZGlvU2luay0+bmVlZHNUcmFpbGluZ1BhZGRpbmcoKSkgeworICAgICAgICAgICAgICAgIHBvc3RFT1NEZWxheVVzID0gZ2V0UGVuZGluZ0F1ZGlvUGxheW91dER1cmF0aW9uVXMoQUxvb3Blcjo6R2V0Tm93VXMoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigiZmlsbEF1ZGlvQnVmZmVyOiBub3RpZnlFT1NfbCAiCisgICAgICAgICAgICAgICAgICAgICJtTnVtRnJhbWVzV3JpdHRlbjoldSAgZmluYWxSZXN1bHQ6JWQgIHBvc3RFT1NEZWxheTolbGxkIiwKKyAgICAgICAgICAgICAgICAgICAgbU51bUZyYW1lc1dyaXR0ZW4sIGVudHJ5LT5tRmluYWxSZXN1bHQsIChsb25nIGxvbmcpcG9zdEVPU0RlbGF5VXMpOworICAgICAgICAgICAgbm90aWZ5RU9TX2wodHJ1ZSAvKiBhdWRpbyAqLywgZW50cnktPm1GaW5hbFJlc3VsdCwgcG9zdEVPU0RlbGF5VXMpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzaXplQ29waWVkOworfQorCit2b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6OmRyYWluQXVkaW9RdWV1ZVVudGlsTGFzdEVPUygpIHsKKyAgICBMaXN0PFF1ZXVlRW50cnk+OjppdGVyYXRvciBpdCA9IG1BdWRpb1F1ZXVlLmJlZ2luKCksIGl0RU9TID0gaXQ7CisgICAgYm9vbCBmb3VuZEVPUyA9IGZhbHNlOworICAgIHdoaWxlIChpdCAhPSBtQXVkaW9RdWV1ZS5lbmQoKSkgeworICAgICAgICBpbnQzMl90IGVvczsKKyAgICAgICAgUXVldWVFbnRyeSAqZW50cnkgPSAmKml0Kys7CisgICAgICAgIGlmICgoZW50cnktPm1CdWZmZXIgPT0gbnVsbHB0ciAmJiBlbnRyeS0+bU5vdGlmeUNvbnN1bWVkID09IG51bGxwdHIpCisgICAgICAgICAgICAgICAgfHwgKGVudHJ5LT5tTm90aWZ5Q29uc3VtZWQtPmZpbmRJbnQzMigiZW9zIiwgJmVvcykgJiYgZW9zICE9IDApKSB7CisgICAgICAgICAgICBpdEVPUyA9IGl0OworICAgICAgICAgICAgZm91bmRFT1MgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGZvdW5kRU9TKSB7CisgICAgICAgIC8vIHBvc3QgYWxsIHJlcGxpZXMgYmVmb3JlIEVPUyBhbmQgZHJvcCB0aGUgc2FtcGxlcworICAgICAgICBmb3IgKGl0ID0gbUF1ZGlvUXVldWUuYmVnaW4oKTsgaXQgIT0gaXRFT1M7IGl0KyspIHsKKyAgICAgICAgICAgIGlmIChpdC0+bUJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgaWYgKGl0LT5tTm90aWZ5Q29uc3VtZWQgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAvLyBkZWxheSBkb2Vzbid0IG1hdHRlciBhcyB3ZSBkb24ndCBldmVuIGhhdmUgYW4gQXVkaW9UcmFjaworICAgICAgICAgICAgICAgICAgICBub3RpZnlFT1ModHJ1ZSAvKiBhdWRpbyAqLywgaXQtPm1GaW5hbFJlc3VsdCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVEFHIGZvciByZS1vcGVuaW5nIGF1ZGlvIHNpbmsuCisgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlQXVkaW9Gb3JtYXQoaXQtPm1NZXRhLCBpdC0+bU5vdGlmeUNvbnN1bWVkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGl0LT5tTm90aWZ5Q29uc3VtZWQtPnBvc3QoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtQXVkaW9RdWV1ZS5lcmFzZShtQXVkaW9RdWV1ZS5iZWdpbigpLCBpdEVPUyk7CisgICAgfQorfQorCitib29sIE51UGxheWVyMjo6UmVuZGVyZXI6Om9uRHJhaW5BdWRpb1F1ZXVlKCkgeworICAgIC8vIGRvIG5vdCBkcmFpbiBhdWRpbyBkdXJpbmcgdGVhcmRvd24gYXMgcXVldWVkIGJ1ZmZlcnMgbWF5IGJlIGludmFsaWQuCisgICAgaWYgKG1BdWRpb1Rvcm5Eb3duKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgLy8gVE9ETzogVGhpcyBjYWxsIHRvIGdldFBvc2l0aW9uIGNoZWNrcyBpZiBBdWRpb1RyYWNrIGhhcyBiZWVuIGNyZWF0ZWQKKyAgICAvLyBpbiBBdWRpb1NpbmsgYmVmb3JlIGRyYWluaW5nIGF1ZGlvLiBJZiBBdWRpb1RyYWNrIGRvZXNuJ3QgZXhpc3QsIHRoZW4KKyAgICAvLyBDSEVDS3Mgb24gZ2V0UG9zaXRpb24gd2lsbCBmYWlsLgorICAgIC8vIFdlIHN0aWxsIG5lZWQgdG8gZmlndXJlIG91dCB3aHkgQXVkaW9UcmFjayBpcyBub3QgY3JlYXRlZCB3aGVuCisgICAgLy8gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQuIE9uZSBwb3NzaWJsZSByZWFzb24gY291bGQgYmUgbGVmdG92ZXIKKyAgICAvLyBhdWRpby4gQW5vdGhlciBwb3NzaWJsZSBwbGFjZSBpcyB0byBjaGVjayB3aGV0aGVyIGRlY29kZXIKKyAgICAvLyBoYXMgcmVjZWl2ZWQgSU5GT19GT1JNQVRfQ0hBTkdFRCBhcyB0aGUgZmlyc3QgYnVmZmVyIHNpbmNlCisgICAgLy8gQXVkaW9TaW5rIGlzIG9wZW5lZCB0aGVyZSwgYW5kIHBvc3NpYmxlIGludGVyYWN0aW9ucyB3aXRoIGZsdXNoCisgICAgLy8gaW1tZWRpYXRlbHkgYWZ0ZXIgc3RhcnQuIEludmVzdGlnYXRlIGVycm9yIG1lc3NhZ2UKKyAgICAvLyAidm9yYmlzX2RzcF9zeW50aGVzaXMgcmV0dXJuZWQgLTEzNSIsIGFsb25nIHdpdGggUlRTUC4KKyAgICB1aW50MzJfdCBudW1GcmFtZXNQbGF5ZWQ7CisgICAgaWYgKG1BdWRpb1NpbmstPmdldFBvc2l0aW9uKCZudW1GcmFtZXNQbGF5ZWQpICE9IE9LKSB7CisgICAgICAgIC8vIFdoZW4gZ2V0UG9zaXRpb24gZmFpbHMsIHJlbmRlcmVyIHdpbGwgbm90IHJlc2NoZWR1bGUgdGhlIGRyYWluaW5nCisgICAgICAgIC8vIHVubGVzcyBuZXcgc2FtcGxlcyBhcmUgcXVldWVkLgorICAgICAgICAvLyBJZiB3ZSBoYXZlIHBlbmRpbmcgRU9TIChvciAiZW9zIiBtYXJrZXIgZm9yIGRpc2NvbnRpbnVpdGllcyksIHdlIG5lZWQKKyAgICAgICAgLy8gdG8gcG9zdCB0aGVzZSBub3cgYXMgTnVQbGF5ZXIyRGVjb2RlciBtaWdodCBiZSB3YWl0aW5nIGZvciBpdC4KKyAgICAgICAgZHJhaW5BdWRpb1F1ZXVlVW50aWxMYXN0RU9TKCk7CisKKyAgICAgICAgQUxPR1coIm9uRHJhaW5BdWRpb1F1ZXVlKCk6IGF1ZGlvIHNpbmsgaXMgbm90IHJlYWR5Iik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyNpZiAwCisgICAgc3NpemVfdCBudW1GcmFtZXNBdmFpbGFibGVUb1dyaXRlID0KKyAgICAgICAgbUF1ZGlvU2luay0+ZnJhbWVDb3VudCgpIC0gKG1OdW1GcmFtZXNXcml0dGVuIC0gbnVtRnJhbWVzUGxheWVkKTsKKworICAgIGlmIChudW1GcmFtZXNBdmFpbGFibGVUb1dyaXRlID09IG1BdWRpb1NpbmstPmZyYW1lQ291bnQoKSkgeworICAgICAgICBBTE9HSSgiYXVkaW8gc2luayB1bmRlcnJ1biIpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJhdWRpbyBxdWV1ZSBoYXMgJWQgZnJhbWVzIGxlZnQgdG8gcGxheSIsCisgICAgICAgICAgICAgbUF1ZGlvU2luay0+ZnJhbWVDb3VudCgpIC0gbnVtRnJhbWVzQXZhaWxhYmxlVG9Xcml0ZSk7CisgICAgfQorI2VuZGlmCisKKyAgICB1aW50MzJfdCBwcmV2RnJhbWVzV3JpdHRlbiA9IG1OdW1GcmFtZXNXcml0dGVuOworICAgIHdoaWxlICghbUF1ZGlvUXVldWUuZW1wdHkoKSkgeworICAgICAgICBRdWV1ZUVudHJ5ICplbnRyeSA9ICYqbUF1ZGlvUXVldWUuYmVnaW4oKTsKKworICAgICAgICBpZiAoZW50cnktPm1CdWZmZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKGVudHJ5LT5tTm90aWZ5Q29uc3VtZWQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIC8vIFRBRyBmb3IgcmUtb3BlbiBhdWRpbyBzaW5rLgorICAgICAgICAgICAgICAgIG9uQ2hhbmdlQXVkaW9Gb3JtYXQoZW50cnktPm1NZXRhLCBlbnRyeS0+bU5vdGlmeUNvbnN1bWVkKTsKKyAgICAgICAgICAgICAgICBtQXVkaW9RdWV1ZS5lcmFzZShtQXVkaW9RdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRU9TCisgICAgICAgICAgICBpZiAobVBhdXNlZCkgeworICAgICAgICAgICAgICAgIC8vIERvIG5vdCBub3RpZnkgRU9TIHdoZW4gcGF1c2VkLgorICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgbmVlZGVkIHRvIGF2b2lkIHN3aXRjaCB0byBuZXh0IGNsaXAgd2hpbGUgaW4gcGF1c2UuCisgICAgICAgICAgICAgICAgQUxPR1YoIm9uRHJhaW5BdWRpb1F1ZXVlKCk6IERvIG5vdCBub3RpZnkgRU9TIHdoZW4gcGF1c2VkIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQ2NF90IHBvc3RFT1NEZWxheVVzID0gMDsKKyAgICAgICAgICAgIGlmIChtQXVkaW9TaW5rLT5uZWVkc1RyYWlsaW5nUGFkZGluZygpKSB7CisgICAgICAgICAgICAgICAgcG9zdEVPU0RlbGF5VXMgPSBnZXRQZW5kaW5nQXVkaW9QbGF5b3V0RHVyYXRpb25VcyhBTG9vcGVyOjpHZXROb3dVcygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vdGlmeUVPUyh0cnVlIC8qIGF1ZGlvICovLCBlbnRyeS0+bUZpbmFsUmVzdWx0LCBwb3N0RU9TRGVsYXlVcyk7CisgICAgICAgICAgICBtTGFzdEF1ZGlvTWVkaWFUaW1lVXMgPSBnZXREdXJhdGlvblVzSWZQbGF5ZWRBdFNhbXBsZVJhdGUobU51bUZyYW1lc1dyaXR0ZW4pOworCisgICAgICAgICAgICBtQXVkaW9RdWV1ZS5lcmFzZShtQXVkaW9RdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgIGVudHJ5ID0gTlVMTDsKKyAgICAgICAgICAgIGlmIChtQXVkaW9TaW5rLT5uZWVkc1RyYWlsaW5nUGFkZGluZygpKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgd2UncmUgbm90IGluIGdhcGxlc3MgcGxheWJhY2sgKGkuZS4gdGhyb3VnaCBzZXROZXh0UGxheWVyKSwgd2UKKyAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIHN0b3AgdGhlIHRyYWNrIGhlcmUsIGJlY2F1c2UgdGhhdCB3aWxsIHBsYXkgb3V0IHRoZSBsYXN0CisgICAgICAgICAgICAgICAgLy8gbGl0dGxlIGJpdCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLiBPdGhlcndpc2Ugc2hvcnQgZmlsZXMgd29uJ3QgcGxheS4KKyAgICAgICAgICAgICAgICBtQXVkaW9TaW5rLT5zdG9wKCk7CisgICAgICAgICAgICAgICAgbU51bUZyYW1lc1dyaXR0ZW4gPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgbUxhc3RBdWRpb0J1ZmZlckRyYWluZWQgPSBlbnRyeS0+bUJ1ZmZlck9yZGluYWw7CisKKyAgICAgICAgLy8gaWdub3JlIDAtc2l6ZWQgYnVmZmVyIHdoaWNoIGNvdWxkIGJlIEVPUyBtYXJrZXIgd2l0aCBubyBkYXRhCisgICAgICAgIGlmIChlbnRyeS0+bU9mZnNldCA9PSAwICYmIGVudHJ5LT5tQnVmZmVyLT5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBpbnQ2NF90IG1lZGlhVGltZVVzOworICAgICAgICAgICAgQ0hFQ0soZW50cnktPm1CdWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmbWVkaWFUaW1lVXMpKTsKKyAgICAgICAgICAgIEFMT0dWKCJvbkRyYWluQXVkaW9RdWV1ZTogcmVuZGVyaW5nIGF1ZGlvIGF0IG1lZGlhIHRpbWUgJS4yZiBzZWNzIiwKKyAgICAgICAgICAgICAgICAgICAgbWVkaWFUaW1lVXMgLyAxRTYpOworICAgICAgICAgICAgb25OZXdBdWRpb01lZGlhVGltZShtZWRpYVRpbWVVcyk7CisgICAgICAgIH0KKworICAgICAgICBzaXplX3QgY29weSA9IGVudHJ5LT5tQnVmZmVyLT5zaXplKCkgLSBlbnRyeS0+bU9mZnNldDsKKworICAgICAgICBzc2l6ZV90IHdyaXR0ZW4gPSBtQXVkaW9TaW5rLT53cml0ZShlbnRyeS0+bUJ1ZmZlci0+ZGF0YSgpICsgZW50cnktPm1PZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHksIGZhbHNlIC8qIGJsb2NraW5nICovKTsKKyAgICAgICAgaWYgKHdyaXR0ZW4gPCAwKSB7CisgICAgICAgICAgICAvLyBBbiBlcnJvciBpbiBBdWRpb1Npbmsgd3JpdGUuIFBlcmhhcHMgdGhlIEF1ZGlvU2luayB3YXMgbm90IHByb3Blcmx5IG9wZW5lZC4KKyAgICAgICAgICAgIGlmICh3cml0dGVuID09IFdPVUxEX0JMT0NLKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvU2luayB3cml0ZSB3b3VsZCBibG9jayB3aGVuIHdyaXRpbmcgJXp1IGJ5dGVzIiwgY29weSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCJBdWRpb1Npbmsgd3JpdGUgZXJyb3IoJXpkKSB3aGVuIHdyaXRpbmcgJXp1IGJ5dGVzIiwgd3JpdHRlbiwgY29weSk7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBjYW4gb25seSBoYXBwZW4gd2hlbiBBdWRpb1Npbmsgd2FzIG9wZW5lZCB3aXRoIGRvTm90UmVjb25uZWN0IGZsYWcgc2V0IHRvCisgICAgICAgICAgICAgICAgLy8gdHJ1ZSwgaW4gd2hpY2ggY2FzZSB0aGUgTnVQbGF5ZXIyIHdpbGwgaGFuZGxlIHRoZSByZWNvbm5lY3QuCisgICAgICAgICAgICAgICAgbm90aWZ5QXVkaW9UZWFyRG93bihrRHVlVG9FcnJvcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGVudHJ5LT5tT2Zmc2V0ICs9IHdyaXR0ZW47CisgICAgICAgIHNpemVfdCByZW1haW5kZXIgPSBlbnRyeS0+bUJ1ZmZlci0+c2l6ZSgpIC0gZW50cnktPm1PZmZzZXQ7CisgICAgICAgIGlmICgoc3NpemVfdClyZW1haW5kZXIgPCBtQXVkaW9TaW5rLT5mcmFtZVNpemUoKSkgeworICAgICAgICAgICAgaWYgKHJlbWFpbmRlciA+IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiQ29ycnVwdGVkIGF1ZGlvIGJ1ZmZlciBoYXMgZnJhY3Rpb25hbCBmcmFtZXMsIGRpc2NhcmRpbmcgJXp1IGJ5dGVzLiIsCisgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5kZXIpOworICAgICAgICAgICAgICAgIGVudHJ5LT5tT2Zmc2V0ICs9IHJlbWFpbmRlcjsKKyAgICAgICAgICAgICAgICBjb3B5IC09IHJlbWFpbmRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZW50cnktPm1Ob3RpZnlDb25zdW1lZC0+cG9zdCgpOworICAgICAgICAgICAgbUF1ZGlvUXVldWUuZXJhc2UobUF1ZGlvUXVldWUuYmVnaW4oKSk7CisKKyAgICAgICAgICAgIGVudHJ5ID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIHNpemVfdCBjb3BpZWRGcmFtZXMgPSB3cml0dGVuIC8gbUF1ZGlvU2luay0+ZnJhbWVTaXplKCk7CisgICAgICAgIG1OdW1GcmFtZXNXcml0dGVuICs9IGNvcGllZEZyYW1lczsKKworICAgICAgICB7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICAgICAgICAgaW50NjRfdCBtYXhUaW1lTWVkaWE7CisgICAgICAgICAgICBtYXhUaW1lTWVkaWEgPQorICAgICAgICAgICAgICAgIG1BbmNob3JUaW1lTWVkaWFVcyArCisgICAgICAgICAgICAgICAgICAgICAgICAoaW50NjRfdCkobWF4KChsb25nIGxvbmcpbU51bUZyYW1lc1dyaXR0ZW4gLSBtQW5jaG9yTnVtRnJhbWVzV3JpdHRlbiwgMExMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIDEwMDBMTCAqIG1BdWRpb1NpbmstPm1zZWNzUGVyRnJhbWUoKSk7CisgICAgICAgICAgICBtTWVkaWFDbG9jay0+dXBkYXRlTWF4VGltZU1lZGlhKG1heFRpbWVNZWRpYSk7CisKKyAgICAgICAgICAgIG5vdGlmeUlmTWVkaWFSZW5kZXJpbmdTdGFydGVkX2woKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh3cml0dGVuICE9IChzc2l6ZV90KWNvcHkpIHsKKyAgICAgICAgICAgIC8vIEEgc2hvcnQgY291bnQgd2FzIHJlY2VpdmVkIGZyb20gQXVkaW9TaW5rOjp3cml0ZSgpCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gQXVkaW9TaW5rIHdyaXRlIGlzIGNhbGxlZCBpbiBub24tYmxvY2tpbmcgbW9kZS4KKyAgICAgICAgICAgIC8vIEl0IG1heSByZXR1cm4gd2l0aCBhIHNob3J0IGNvdW50IHdoZW46CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gMSkgU2l6ZSB0byBiZSBjb3BpZWQgaXMgbm90IGEgbXVsdGlwbGUgb2YgdGhlIGZyYW1lIHNpemUuIEZyYWN0aW9uYWwgZnJhbWVzIGFyZQorICAgICAgICAgICAgLy8gICAgZGlzY2FyZGVkLgorICAgICAgICAgICAgLy8gMikgVGhlIGRhdGEgdG8gYmUgY29waWVkIGV4Y2VlZHMgdGhlIGF2YWlsYWJsZSBidWZmZXIgaW4gQXVkaW9TaW5rLgorICAgICAgICAgICAgLy8gMykgQW4gZXJyb3Igb2NjdXJzIGFuZCBkYXRhIGhhcyBiZWVuIHBhcnRpYWxseSBjb3BpZWQgdG8gdGhlIGJ1ZmZlciBpbiBBdWRpb1NpbmsuCisgICAgICAgICAgICAvLyA0KSBBdWRpb1NpbmsgaXMgYW4gQXVkaW9DYWNoZSBmb3IgZGF0YSByZXRyaWV2YWwsIGFuZCB0aGUgQXVkaW9DYWNoZSBpcyBleGNlZWRlZC4KKworICAgICAgICAgICAgLy8gKENhc2UgMSkKKyAgICAgICAgICAgIC8vIE11c3QgYmUgYSBtdWx0aXBsZSBvZiB0aGUgZnJhbWUgc2l6ZS4gIElmIGl0IGlzIG5vdCBhIG11bHRpcGxlIG9mIGEgZnJhbWUgc2l6ZSwgaXQKKyAgICAgICAgICAgIC8vIG5lZWRzIHRvIGZhaWwsIGFzIHdlIHNob3VsZCBub3QgY2Fycnkgb3ZlciBmcmFjdGlvbmFsIGZyYW1lcyBiZXR3ZWVuIGNhbGxzLgorICAgICAgICAgICAgQ0hFQ0tfRVEoY29weSAlIG1BdWRpb1NpbmstPmZyYW1lU2l6ZSgpLCAwdSk7CisKKyAgICAgICAgICAgIC8vIChDYXNlIDIsIDMsIDQpCisgICAgICAgICAgICAvLyBSZXR1cm4gZWFybHkgdG8gdGhlIGNhbGxlci4KKyAgICAgICAgICAgIC8vIEJld2FyZSBvZiBjYWxsaW5nIGltbWVkaWF0ZWx5IGFnYWluIGFzIHRoaXMgbWF5IGJ1c3ktbG9vcCBpZiB5b3UgYXJlIG5vdCBjYXJlZnVsLgorICAgICAgICAgICAgQUxPR1YoIkF1ZGlvU2luayB3cml0ZSBzaG9ydCBmcmFtZSBjb3VudCAlemQgPCAlenUiLCB3cml0dGVuLCBjb3B5KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gY2FsY3VsYXRlIHdoZXRoZXIgd2UgbmVlZCB0byByZXNjaGVkdWxlIGFub3RoZXIgd3JpdGUuCisgICAgYm9vbCByZXNjaGVkdWxlID0gIW1BdWRpb1F1ZXVlLmVtcHR5KCkKKyAgICAgICAgICAgICYmICghbVBhdXNlZAorICAgICAgICAgICAgICAgIHx8IHByZXZGcmFtZXNXcml0dGVuICE9IG1OdW1GcmFtZXNXcml0dGVuKTsgLy8gcGVybWl0IHBhdXNlIHRvIGZpbGwgYnVmZmVycworICAgIC8vQUxPR0QoInJlc2NoZWR1bGU6JWQgIGVtcHR5OiVkICBtUGF1c2VkOiVkICBwcmV2RnJhbWVzV3JpdHRlbjoldSAgbU51bUZyYW1lc1dyaXR0ZW46JXUiLAorICAgIC8vICAgICAgICByZXNjaGVkdWxlLCBtQXVkaW9RdWV1ZS5lbXB0eSgpLCBtUGF1c2VkLCBwcmV2RnJhbWVzV3JpdHRlbiwgbU51bUZyYW1lc1dyaXR0ZW4pOworICAgIHJldHVybiByZXNjaGVkdWxlOworfQorCitpbnQ2NF90IE51UGxheWVyMjo6UmVuZGVyZXI6OmdldER1cmF0aW9uVXNJZlBsYXllZEF0U2FtcGxlUmF0ZSh1aW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICBpbnQzMl90IHNhbXBsZVJhdGUgPSBvZmZsb2FkaW5nQXVkaW8oKSA/CisgICAgICAgICAgICBtQ3VycmVudE9mZmxvYWRJbmZvLnNhbXBsZV9yYXRlIDogbUN1cnJlbnRQY21JbmZvLm1TYW1wbGVSYXRlOworICAgIGlmIChzYW1wbGVSYXRlID09IDApIHsKKyAgICAgICAgQUxPR0UoInNhbXBsZVJhdGUgaXMgMCBpbiAlcyBtb2RlIiwgb2ZmbG9hZGluZ0F1ZGlvKCkgPyAib2ZmbG9hZCIgOiAibm9uLW9mZmxvYWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIC8vIFRPRE86IHJlbW92ZSB0aGUgKGludDMyX3QpIGNhc3RpbmcgYmVsb3cgYXMgaXQgbWF5IG92ZXJmbG93IGF0IDEyLjQgaG91cnMuCisgICAgcmV0dXJuIChpbnQ2NF90KSgoaW50MzJfdCludW1GcmFtZXMgKiAxMDAwMDAwTEwgLyBzYW1wbGVSYXRlKTsKK30KKworLy8gQ2FsY3VsYXRlIGR1cmF0aW9uIG9mIHBlbmRpbmcgc2FtcGxlcyBpZiBwbGF5ZWQgYXQgbm9ybWFsIHJhdGUgKGkuZS4sIDEuMCkuCitpbnQ2NF90IE51UGxheWVyMjo6UmVuZGVyZXI6OmdldFBlbmRpbmdBdWRpb1BsYXlvdXREdXJhdGlvblVzKGludDY0X3Qgbm93VXMpIHsKKyAgICBpbnQ2NF90IHdyaXR0ZW5BdWRpb0R1cmF0aW9uVXMgPSBnZXREdXJhdGlvblVzSWZQbGF5ZWRBdFNhbXBsZVJhdGUobU51bUZyYW1lc1dyaXR0ZW4pOworICAgIGlmIChtVXNlVmlydHVhbEF1ZGlvU2luaykgeworICAgICAgICBpbnQ2NF90IG5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKyAgICAgICAgaW50NjRfdCBtZWRpYVVzOworICAgICAgICBpZiAobU1lZGlhQ2xvY2stPmdldE1lZGlhVGltZShub3dVcywgJm1lZGlhVXMpICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gMGxsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHdyaXR0ZW5BdWRpb0R1cmF0aW9uVXMgLSAobWVkaWFVcyAtIG1BdWRpb0ZpcnN0QW5jaG9yVGltZU1lZGlhVXMpOworICAgICAgICB9CisgICAgfQorCisgICAgY29uc3QgaW50NjRfdCBhdWRpb1NpbmtQbGF5ZWRVcyA9IG1BdWRpb1NpbmstPmdldFBsYXllZE91dER1cmF0aW9uVXMobm93VXMpOworICAgIGludDY0X3QgcGVuZGluZ1VzID0gd3JpdHRlbkF1ZGlvRHVyYXRpb25VcyAtIGF1ZGlvU2lua1BsYXllZFVzOworICAgIGlmIChwZW5kaW5nVXMgPCAwKSB7CisgICAgICAgIC8vIFRoaXMgc2hvdWxkbid0IGhhcHBlbiB1bmxlc3MgdGhlIHRpbWVzdGFtcCBpcyBzdGFsZS4KKyAgICAgICAgQUxPR1coIiVzOiBwZW5kaW5nVXMgJWxsZCA8IDAsIGNsYW1waW5nIHRvIHplcm8sIHBvdGVudGlhbCByZXN1bWUgYWZ0ZXIgcGF1c2UgIgorICAgICAgICAgICAgICAgICJ3cml0dGVuQXVkaW9EdXJhdGlvblVzOiAlbGxkLCBhdWRpb1NpbmtQbGF5ZWRVczogJWxsZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIChsb25nIGxvbmcpcGVuZGluZ1VzLAorICAgICAgICAgICAgICAgIChsb25nIGxvbmcpd3JpdHRlbkF1ZGlvRHVyYXRpb25VcywgKGxvbmcgbG9uZylhdWRpb1NpbmtQbGF5ZWRVcyk7CisgICAgICAgIHBlbmRpbmdVcyA9IDA7CisgICAgfQorICAgIHJldHVybiBwZW5kaW5nVXM7Cit9CisKK2ludDY0X3QgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6Z2V0UmVhbFRpbWVVcyhpbnQ2NF90IG1lZGlhVGltZVVzLCBpbnQ2NF90IG5vd1VzKSB7CisgICAgaW50NjRfdCByZWFsVXM7CisgICAgaWYgKG1NZWRpYUNsb2NrLT5nZXRSZWFsVGltZUZvcihtZWRpYVRpbWVVcywgJnJlYWxVcykgIT0gT0spIHsKKyAgICAgICAgLy8gSWYgZmFpbGVkIHRvIGdldCBjdXJyZW50IHBvc2l0aW9uLCBlLmcuIGR1ZSB0byBhdWRpbyBjbG9jayBpcworICAgICAgICAvLyBub3QgcmVhZHksIHRoZW4ganVzdCBwbGF5IG91dCB2aWRlbyBpbW1lZGlhdGVseSB3aXRob3V0IGRlbGF5LgorICAgICAgICByZXR1cm4gbm93VXM7CisgICAgfQorICAgIHJldHVybiByZWFsVXM7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6b25OZXdBdWRpb01lZGlhVGltZShpbnQ2NF90IG1lZGlhVGltZVVzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAvLyBUUklDS1k6IHZvcmJpcyBkZWNvZGVyIGdlbmVyYXRlcyBtdWx0aXBsZSBmcmFtZXMgd2l0aCB0aGUgc2FtZQorICAgIC8vIHRpbWVzdGFtcCwgc28gb25seSB1cGRhdGUgb24gdGhlIGZpcnN0IGZyYW1lIHdpdGggYSBnaXZlbiB0aW1lc3RhbXAKKyAgICBpZiAobWVkaWFUaW1lVXMgPT0gbUFuY2hvclRpbWVNZWRpYVVzKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc2V0QXVkaW9GaXJzdEFuY2hvclRpbWVJZk5lZWRlZF9sKG1lZGlhVGltZVVzKTsKKworICAgIC8vIG1OZXh0QXVkaW9DbG9ja1VwZGF0ZVRpbWVVcyBpcyAtMSBpZiB3ZSdyZSB3YWl0aW5nIGZvciBhdWRpbyBzaW5rIHRvIHN0YXJ0CisgICAgaWYgKG1OZXh0QXVkaW9DbG9ja1VwZGF0ZVRpbWVVcyA9PSAtMSkgeworICAgICAgICBBdWRpb1RpbWVzdGFtcCB0czsKKyAgICAgICAgaWYgKG1BdWRpb1NpbmstPmdldFRpbWVzdGFtcCh0cykgPT0gT0sgJiYgdHMubVBvc2l0aW9uID4gMCkgeworICAgICAgICAgICAgbU5leHRBdWRpb0Nsb2NrVXBkYXRlVGltZVVzID0gMDsgLy8gc3RhcnQgb3VyIGNsb2NrIHVwZGF0ZXMKKyAgICAgICAgfQorICAgIH0KKyAgICBpbnQ2NF90IG5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKyAgICBpZiAobU5leHRBdWRpb0Nsb2NrVXBkYXRlVGltZVVzID49IDApIHsKKyAgICAgICAgaWYgKG5vd1VzID49IG1OZXh0QXVkaW9DbG9ja1VwZGF0ZVRpbWVVcykgeworICAgICAgICAgICAgaW50NjRfdCBub3dNZWRpYVVzID0gbWVkaWFUaW1lVXMgLSBnZXRQZW5kaW5nQXVkaW9QbGF5b3V0RHVyYXRpb25Vcyhub3dVcyk7CisgICAgICAgICAgICBtTWVkaWFDbG9jay0+dXBkYXRlQW5jaG9yKG5vd01lZGlhVXMsIG5vd1VzLCBtZWRpYVRpbWVVcyk7CisgICAgICAgICAgICBtVXNlVmlydHVhbEF1ZGlvU2luayA9IGZhbHNlOworICAgICAgICAgICAgbU5leHRBdWRpb0Nsb2NrVXBkYXRlVGltZVVzID0gbm93VXMgKyBrTWluaW11bUF1ZGlvQ2xvY2tVcGRhdGVQZXJpb2RVczsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGludDY0X3QgdW51c2VkOworICAgICAgICBpZiAoKG1NZWRpYUNsb2NrLT5nZXRNZWRpYVRpbWUobm93VXMsICZ1bnVzZWQpICE9IE9LKQorICAgICAgICAgICAgICAgICYmIChnZXREdXJhdGlvblVzSWZQbGF5ZWRBdFNhbXBsZVJhdGUobU51bUZyYW1lc1dyaXR0ZW4pCisgICAgICAgICAgICAgICAgICAgICAgICA+IGtNYXhBbGxvd2VkQXVkaW9TaW5rRGVsYXlVcykpIHsKKyAgICAgICAgICAgIC8vIEVub3VnaCBkYXRhIGhhcyBiZWVuIHNlbnQgdG8gQXVkaW9TaW5rLCBidXQgQXVkaW9TaW5rIGhhcyBub3QgcmVuZGVyZWQKKyAgICAgICAgICAgIC8vIGFueSBkYXRhIHlldC4gU29tZXRoaW5nIGlzIHdyb25nIHdpdGggQXVkaW9TaW5rLCBlLmcuLCB0aGUgZGV2aWNlIGlzIG5vdAorICAgICAgICAgICAgLy8gY29ubmVjdGVkIHRvIGF1ZGlvIG91dC4KKyAgICAgICAgICAgIC8vIFN3aXRjaCB0byBzeXN0ZW0gY2xvY2suIFRoaXMgZXNzZW50aWFsbHkgY3JlYXRlcyBhIHZpcnR1YWwgQXVkaW9TaW5rIHdpdGgKKyAgICAgICAgICAgIC8vIGluaXRpYWwgbGF0ZW50eSBvZiBnZXREdXJhdGlvblVzSWZQbGF5ZWRBdFNhbXBsZVJhdGUobU51bUZyYW1lc1dyaXR0ZW4pLgorICAgICAgICAgICAgLy8gVGhpcyB2aXJ0dWFsIEF1ZGlvU2luayByZW5kZXJzIGF1ZGlvIGRhdGEgc3RhcnRpbmcgZnJvbSB0aGUgdmVyeSBmaXJzdCBzYW1wbGUKKyAgICAgICAgICAgIC8vIGFuZCBpdCdzIHBhY2VkIGJ5IHN5c3RlbSBjbG9jay4KKyAgICAgICAgICAgIEFMT0dXKCJBdWRpb1Npbmsgc3R1Y2suIEFSRSBZT1UgQ09OTkVDVEVEIFRPIEFVRElPIE9VVD8gU3dpdGNoaW5nIHRvIHN5c3RlbSBjbG9jay4iKTsKKyAgICAgICAgICAgIG1NZWRpYUNsb2NrLT51cGRhdGVBbmNob3IobUF1ZGlvRmlyc3RBbmNob3JUaW1lTWVkaWFVcywgbm93VXMsIG1lZGlhVGltZVVzKTsKKyAgICAgICAgICAgIG1Vc2VWaXJ0dWFsQXVkaW9TaW5rID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtQW5jaG9yTnVtRnJhbWVzV3JpdHRlbiA9IG1OdW1GcmFtZXNXcml0dGVuOworICAgIG1BbmNob3JUaW1lTWVkaWFVcyA9IG1lZGlhVGltZVVzOworfQorCisvLyBDYWxsZWQgd2l0aG91dCBtTG9jayBhY3F1aXJlZC4KK3ZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6cG9zdERyYWluVmlkZW9RdWV1ZSgpIHsKKyAgICBpZiAobURyYWluVmlkZW9RdWV1ZVBlbmRpbmcKKyAgICAgICAgICAgIHx8IGdldFN5bmNRdWV1ZXMoKQorICAgICAgICAgICAgfHwgKG1QYXVzZWQgJiYgbVZpZGVvU2FtcGxlUmVjZWl2ZWQpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobVZpZGVvUXVldWUuZW1wdHkoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgUXVldWVFbnRyeSAmZW50cnkgPSAqbVZpZGVvUXVldWUuYmVnaW4oKTsKKworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXREcmFpblZpZGVvUXVldWUsIHRoaXMpOworICAgIG1zZy0+c2V0SW50MzIoImRyYWluR2VuZXJhdGlvbiIsIGdldERyYWluR2VuZXJhdGlvbihmYWxzZSAvKiBhdWRpbyAqLykpOworCisgICAgaWYgKGVudHJ5Lm1CdWZmZXIgPT0gTlVMTCkgeworICAgICAgICAvLyBFT1MgZG9lc24ndCBjYXJyeSBhIHRpbWVzdGFtcC4KKyAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgICAgIG1EcmFpblZpZGVvUXVldWVQZW5kaW5nID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludDY0X3Qgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOworICAgIGlmIChtRmxhZ3MgJiBGTEFHX1JFQUxfVElNRSkgeworICAgICAgICBpbnQ2NF90IHJlYWxUaW1lVXM7CisgICAgICAgIENIRUNLKGVudHJ5Lm1CdWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmcmVhbFRpbWVVcykpOworCisgICAgICAgIHJlYWxUaW1lVXMgPSBtVmlkZW9TY2hlZHVsZXItPnNjaGVkdWxlKHJlYWxUaW1lVXMgKiAxMDAwKSAvIDEwMDA7CisKKyAgICAgICAgaW50NjRfdCB0d29Wc3luY3NVcyA9IDIgKiAobVZpZGVvU2NoZWR1bGVyLT5nZXRWc3luY1BlcmlvZCgpIC8gMTAwMCk7CisKKyAgICAgICAgaW50NjRfdCBkZWxheVVzID0gcmVhbFRpbWVVcyAtIG5vd1VzOworCisgICAgICAgIEFMT0dXX0lGKGRlbGF5VXMgPiA1MDAwMDAsICJ1bnVzdWFsbHkgaGlnaCBkZWxheVVzOiAlbGxkIiwgKGxvbmcgbG9uZylkZWxheVVzKTsKKyAgICAgICAgLy8gcG9zdCAyIGRpc3BsYXkgcmVmcmVzaGVzIGJlZm9yZSByZW5kZXJpbmcgaXMgZHVlCisgICAgICAgIG1zZy0+cG9zdChkZWxheVVzID4gdHdvVnN5bmNzVXMgPyBkZWxheVVzIC0gdHdvVnN5bmNzVXMgOiAwKTsKKworICAgICAgICBtRHJhaW5WaWRlb1F1ZXVlUGVuZGluZyA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQ2NF90IG1lZGlhVGltZVVzOworICAgIENIRUNLKGVudHJ5Lm1CdWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmbWVkaWFUaW1lVXMpKTsKKworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgICAgaWYgKG1BbmNob3JUaW1lTWVkaWFVcyA8IDApIHsKKyAgICAgICAgICAgIG1NZWRpYUNsb2NrLT51cGRhdGVBbmNob3IobWVkaWFUaW1lVXMsIG5vd1VzLCBtZWRpYVRpbWVVcyk7CisgICAgICAgICAgICBtQW5jaG9yVGltZU1lZGlhVXMgPSBtZWRpYVRpbWVVczsKKyAgICAgICAgfQorICAgIH0KKyAgICBtTmV4dFZpZGVvVGltZU1lZGlhVXMgPSBtZWRpYVRpbWVVcyArIDEwMDAwMDsKKyAgICBpZiAoIW1IYXNBdWRpbykgeworICAgICAgICAvLyBzbW9vdGggb3V0IHZpZGVvcyA+PSAxMGZwcworICAgICAgICBtTWVkaWFDbG9jay0+dXBkYXRlTWF4VGltZU1lZGlhKG1OZXh0VmlkZW9UaW1lTWVkaWFVcyk7CisgICAgfQorCisgICAgaWYgKCFtVmlkZW9TYW1wbGVSZWNlaXZlZCB8fCBtZWRpYVRpbWVVcyA8IG1BdWRpb0ZpcnN0QW5jaG9yVGltZU1lZGlhVXMpIHsKKyAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50NjRfdCB0d29Wc3luY3NVcyA9IDIgKiAobVZpZGVvU2NoZWR1bGVyLT5nZXRWc3luY1BlcmlvZCgpIC8gMTAwMCk7CisKKyAgICAgICAgLy8gcG9zdCAyIGRpc3BsYXkgcmVmcmVzaGVzIGJlZm9yZSByZW5kZXJpbmcgaXMgZHVlCisgICAgICAgIG1NZWRpYUNsb2NrLT5hZGRUaW1lcihtc2csIG1lZGlhVGltZVVzLCAtdHdvVnN5bmNzVXMpOworICAgIH0KKworICAgIG1EcmFpblZpZGVvUXVldWVQZW5kaW5nID0gdHJ1ZTsKK30KKwordm9pZCBOdVBsYXllcjI6OlJlbmRlcmVyOjpvbkRyYWluVmlkZW9RdWV1ZSgpIHsKKyAgICBpZiAobVZpZGVvUXVldWUuZW1wdHkoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgUXVldWVFbnRyeSAqZW50cnkgPSAmKm1WaWRlb1F1ZXVlLmJlZ2luKCk7CisKKyAgICBpZiAoZW50cnktPm1CdWZmZXIgPT0gTlVMTCkgeworICAgICAgICAvLyBFT1MKKworICAgICAgICBub3RpZnlFT1MoZmFsc2UgLyogYXVkaW8gKi8sIGVudHJ5LT5tRmluYWxSZXN1bHQpOworCisgICAgICAgIG1WaWRlb1F1ZXVlLmVyYXNlKG1WaWRlb1F1ZXVlLmJlZ2luKCkpOworICAgICAgICBlbnRyeSA9IE5VTEw7CisKKyAgICAgICAgc2V0VmlkZW9MYXRlQnlVcygwKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludDY0X3Qgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOworICAgIGludDY0X3QgcmVhbFRpbWVVczsKKyAgICBpbnQ2NF90IG1lZGlhVGltZVVzID0gLTE7CisgICAgaWYgKG1GbGFncyAmIEZMQUdfUkVBTF9USU1FKSB7CisgICAgICAgIENIRUNLKGVudHJ5LT5tQnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnJlYWxUaW1lVXMpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBDSEVDSyhlbnRyeS0+bUJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZtZWRpYVRpbWVVcykpOworCisgICAgICAgIHJlYWxUaW1lVXMgPSBnZXRSZWFsVGltZVVzKG1lZGlhVGltZVVzLCBub3dVcyk7CisgICAgfQorICAgIHJlYWxUaW1lVXMgPSBtVmlkZW9TY2hlZHVsZXItPnNjaGVkdWxlKHJlYWxUaW1lVXMgKiAxMDAwKSAvIDEwMDA7CisKKyAgICBib29sIHRvb0xhdGUgPSBmYWxzZTsKKworICAgIGlmICghbVBhdXNlZCkgeworICAgICAgICBzZXRWaWRlb0xhdGVCeVVzKG5vd1VzIC0gcmVhbFRpbWVVcyk7CisgICAgICAgIHRvb0xhdGUgPSAobVZpZGVvTGF0ZUJ5VXMgPiA0MDAwMCk7CisKKyAgICAgICAgaWYgKHRvb0xhdGUpIHsKKyAgICAgICAgICAgIEFMT0dWKCJ2aWRlbyBsYXRlIGJ5ICVsbGQgdXMgKCUuMmYgc2VjcykiLAorICAgICAgICAgICAgICAgICAobG9uZyBsb25nKW1WaWRlb0xhdGVCeVVzLCBtVmlkZW9MYXRlQnlVcyAvIDFFNik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQ2NF90IG1lZGlhVXMgPSAwOworICAgICAgICAgICAgbU1lZGlhQ2xvY2stPmdldE1lZGlhVGltZShyZWFsVGltZVVzLCAmbWVkaWFVcyk7CisgICAgICAgICAgICBBTE9HVigicmVuZGVyaW5nIHZpZGVvIGF0IG1lZGlhIHRpbWUgJS4yZiBzZWNzIiwKKyAgICAgICAgICAgICAgICAgICAgKG1GbGFncyAmIEZMQUdfUkVBTF9USU1FID8gcmVhbFRpbWVVcyA6CisgICAgICAgICAgICAgICAgICAgIG1lZGlhVXMpIC8gMUU2KTsKKworICAgICAgICAgICAgaWYgKCEobUZsYWdzICYgRkxBR19SRUFMX1RJTUUpCisgICAgICAgICAgICAgICAgICAgICYmIG1MYXN0QXVkaW9NZWRpYVRpbWVVcyAhPSAtMQorICAgICAgICAgICAgICAgICAgICAmJiBtZWRpYVRpbWVVcyA+IG1MYXN0QXVkaW9NZWRpYVRpbWVVcykgeworICAgICAgICAgICAgICAgIC8vIElmIGF1ZGlvIGVuZHMgYmVmb3JlIHZpZGVvLCB2aWRlbyBjb250aW51ZXMgdG8gZHJpdmUgbWVkaWEgY2xvY2suCisgICAgICAgICAgICAgICAgLy8gQWxzbyBzbW9vdGggb3V0IHZpZGVvcyA+PSAxMGZwcy4KKyAgICAgICAgICAgICAgICBtTWVkaWFDbG9jay0+dXBkYXRlTWF4VGltZU1lZGlhKG1lZGlhVGltZVVzICsgMTAwMDAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHNldFZpZGVvTGF0ZUJ5VXMoMCk7CisgICAgICAgIGlmICghbVZpZGVvU2FtcGxlUmVjZWl2ZWQgJiYgIW1IYXNBdWRpbykgeworICAgICAgICAgICAgLy8gVGhpcyB3aWxsIGVuc3VyZSB0aGF0IHRoZSBmaXJzdCBmcmFtZSBhZnRlciBhIGZsdXNoIHdvbid0IGJlIHVzZWQgYXMgYW5jaG9yCisgICAgICAgICAgICAvLyB3aGVuIHJlbmRlcmVyIGlzIGluIHBhdXNlZCBzdGF0ZSwgYmVjYXVzZSByZXN1bWUgY2FuIGhhcHBlbiBhbnkgdGltZSBhZnRlciBzZWVrLgorICAgICAgICAgICAgY2xlYXJBbmNob3JUaW1lKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBBbHdheXMgcmVuZGVyIHRoZSBmaXJzdCB2aWRlbyBmcmFtZSB3aGlsZSBrZWVwaW5nIHN0YXRzIG9uIEEvViBzeW5jLgorICAgIGlmICghbVZpZGVvU2FtcGxlUmVjZWl2ZWQpIHsKKyAgICAgICAgcmVhbFRpbWVVcyA9IG5vd1VzOworICAgICAgICB0b29MYXRlID0gZmFsc2U7CisgICAgfQorCisgICAgZW50cnktPm1Ob3RpZnlDb25zdW1lZC0+c2V0SW50NjQoInRpbWVzdGFtcE5zIiwgcmVhbFRpbWVVcyAqIDEwMDBsbCk7CisgICAgZW50cnktPm1Ob3RpZnlDb25zdW1lZC0+c2V0SW50MzIoInJlbmRlciIsICF0b29MYXRlKTsKKyAgICBlbnRyeS0+bU5vdGlmeUNvbnN1bWVkLT5wb3N0KCk7CisgICAgbVZpZGVvUXVldWUuZXJhc2UobVZpZGVvUXVldWUuYmVnaW4oKSk7CisgICAgZW50cnkgPSBOVUxMOworCisgICAgbVZpZGVvU2FtcGxlUmVjZWl2ZWQgPSB0cnVlOworCisgICAgaWYgKCFtUGF1c2VkKSB7CisgICAgICAgIGlmICghbVZpZGVvUmVuZGVyaW5nU3RhcnRlZCkgeworICAgICAgICAgICAgbVZpZGVvUmVuZGVyaW5nU3RhcnRlZCA9IHRydWU7CisgICAgICAgICAgICBub3RpZnlWaWRlb1JlbmRlcmluZ1N0YXJ0KCk7CisgICAgICAgIH0KKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgICAgbm90aWZ5SWZNZWRpYVJlbmRlcmluZ1N0YXJ0ZWRfbCgpOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjI6OlJlbmRlcmVyOjpub3RpZnlWaWRlb1JlbmRlcmluZ1N0YXJ0KCkgeworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRWaWRlb1JlbmRlcmluZ1N0YXJ0KTsKKyAgICBub3RpZnktPnBvc3QoKTsKK30KKwordm9pZCBOdVBsYXllcjI6OlJlbmRlcmVyOjpub3RpZnlFT1MoYm9vbCBhdWRpbywgc3RhdHVzX3QgZmluYWxSZXN1bHQsIGludDY0X3QgZGVsYXlVcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgbm90aWZ5RU9TX2woYXVkaW8sIGZpbmFsUmVzdWx0LCBkZWxheVVzKTsKK30KKwordm9pZCBOdVBsYXllcjI6OlJlbmRlcmVyOjpub3RpZnlFT1NfbChib29sIGF1ZGlvLCBzdGF0dXNfdCBmaW5hbFJlc3VsdCwgaW50NjRfdCBkZWxheVVzKSB7CisgICAgaWYgKGF1ZGlvICYmIGRlbGF5VXMgPiAwKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRFT1MsIHRoaXMpOworICAgICAgICBtc2ctPnNldEludDMyKCJhdWRpb0VPU0dlbmVyYXRpb24iLCBtQXVkaW9FT1NHZW5lcmF0aW9uKTsKKyAgICAgICAgbXNnLT5zZXRJbnQzMigiZmluYWxSZXN1bHQiLCBmaW5hbFJlc3VsdCk7CisgICAgICAgIG1zZy0+cG9zdChkZWxheVVzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0RU9TKTsKKyAgICBub3RpZnktPnNldEludDMyKCJhdWRpbyIsIHN0YXRpY19jYXN0PGludDMyX3Q+KGF1ZGlvKSk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigiZmluYWxSZXN1bHQiLCBmaW5hbFJlc3VsdCk7CisgICAgbm90aWZ5LT5wb3N0KGRlbGF5VXMpOworCisgICAgaWYgKGF1ZGlvKSB7CisgICAgICAgIC8vIFZpZGVvIG1pZ2h0IG91dGxpdmUgYXVkaW8uIENsZWFyIGFuY2hvciB0byBlbmFibGUgdmlkZW8gb25seSBjYXNlLgorICAgICAgICBtQW5jaG9yVGltZU1lZGlhVXMgPSAtMTsKKyAgICAgICAgbUhhc0F1ZGlvID0gZmFsc2U7CisgICAgICAgIGlmIChtTmV4dFZpZGVvVGltZU1lZGlhVXMgPj0gMCkgeworICAgICAgICAgICAgaW50NjRfdCBtZWRpYVVzID0gMDsKKyAgICAgICAgICAgIG1NZWRpYUNsb2NrLT5nZXRNZWRpYVRpbWUoQUxvb3Blcjo6R2V0Tm93VXMoKSwgJm1lZGlhVXMpOworICAgICAgICAgICAgaWYgKG1OZXh0VmlkZW9UaW1lTWVkaWFVcyA+IG1lZGlhVXMpIHsKKyAgICAgICAgICAgICAgICBtTWVkaWFDbG9jay0+dXBkYXRlTWF4VGltZU1lZGlhKG1OZXh0VmlkZW9UaW1lTWVkaWFVcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6bm90aWZ5QXVkaW9UZWFyRG93bihBdWRpb1RlYXJEb3duUmVhc29uIHJlYXNvbikgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRBdWRpb1RlYXJEb3duLCB0aGlzKTsKKyAgICBtc2ctPnNldEludDMyKCJyZWFzb24iLCByZWFzb24pOworICAgIG1zZy0+cG9zdCgpOworfQorCit2b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6Om9uUXVldWVCdWZmZXIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBpbnQzMl90IGF1ZGlvOworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJhdWRpbyIsICZhdWRpbykpOworCisgICAgaWYgKGRyb3BCdWZmZXJJZlN0YWxlKGF1ZGlvLCBtc2cpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoYXVkaW8pIHsKKyAgICAgICAgbUhhc0F1ZGlvID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBtSGFzVmlkZW8gPSB0cnVlOworICAgIH0KKworICAgIGlmIChtSGFzVmlkZW8pIHsKKyAgICAgICAgaWYgKG1WaWRlb1NjaGVkdWxlciA9PSBOVUxMKSB7CisgICAgICAgICAgICBtVmlkZW9TY2hlZHVsZXIgPSBuZXcgVmlkZW9GcmFtZVNjaGVkdWxlcigpOworICAgICAgICAgICAgbVZpZGVvU2NoZWR1bGVyLT5pbml0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzcDxSZWZCYXNlPiBvYmo7CisgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJidWZmZXIiLCAmb2JqKSk7CisgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gYnVmZmVyID0gc3RhdGljX2Nhc3Q8TWVkaWFDb2RlY0J1ZmZlciAqPihvYmouZ2V0KCkpOworCisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeUNvbnN1bWVkOworICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoIm5vdGlmeUNvbnN1bWVkIiwgJm5vdGlmeUNvbnN1bWVkKSk7CisKKyAgICBRdWV1ZUVudHJ5IGVudHJ5OworICAgIGVudHJ5Lm1CdWZmZXIgPSBidWZmZXI7CisgICAgZW50cnkubU5vdGlmeUNvbnN1bWVkID0gbm90aWZ5Q29uc3VtZWQ7CisgICAgZW50cnkubU9mZnNldCA9IDA7CisgICAgZW50cnkubUZpbmFsUmVzdWx0ID0gT0s7CisgICAgZW50cnkubUJ1ZmZlck9yZGluYWwgPSArK21Ub3RhbEJ1ZmZlcnNRdWV1ZWQ7CisKKyAgICBpZiAoYXVkaW8pIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgICAgbUF1ZGlvUXVldWUucHVzaF9iYWNrKGVudHJ5KTsKKyAgICAgICAgcG9zdERyYWluQXVkaW9RdWV1ZV9sKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVZpZGVvUXVldWUucHVzaF9iYWNrKGVudHJ5KTsKKyAgICAgICAgcG9zdERyYWluVmlkZW9RdWV1ZSgpOworICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgaWYgKCFtU3luY1F1ZXVlcyB8fCBtQXVkaW9RdWV1ZS5lbXB0eSgpIHx8IG1WaWRlb1F1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IGZpcnN0QXVkaW9CdWZmZXIgPSAoKm1BdWRpb1F1ZXVlLmJlZ2luKCkpLm1CdWZmZXI7CisgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gZmlyc3RWaWRlb0J1ZmZlciA9ICgqbVZpZGVvUXVldWUuYmVnaW4oKSkubUJ1ZmZlcjsKKworICAgIGlmIChmaXJzdEF1ZGlvQnVmZmVyID09IE5VTEwgfHwgZmlyc3RWaWRlb0J1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgIC8vIEVPUyBzaWduYWxsZWQgb24gZWl0aGVyIHF1ZXVlLgorICAgICAgICBzeW5jUXVldWVzRG9uZV9sKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQ2NF90IGZpcnN0QXVkaW9UaW1lVXM7CisgICAgaW50NjRfdCBmaXJzdFZpZGVvVGltZVVzOworICAgIENIRUNLKGZpcnN0QXVkaW9CdWZmZXItPm1ldGEoKQorICAgICAgICAgICAgLT5maW5kSW50NjQoInRpbWVVcyIsICZmaXJzdEF1ZGlvVGltZVVzKSk7CisgICAgQ0hFQ0soZmlyc3RWaWRlb0J1ZmZlci0+bWV0YSgpCisgICAgICAgICAgICAtPmZpbmRJbnQ2NCgidGltZVVzIiwgJmZpcnN0VmlkZW9UaW1lVXMpKTsKKworICAgIGludDY0X3QgZGlmZiA9IGZpcnN0VmlkZW9UaW1lVXMgLSBmaXJzdEF1ZGlvVGltZVVzOworCisgICAgQUxPR1YoInF1ZXVlRGlmZiA9ICUuMmYgc2VjcyIsIGRpZmYgLyAxRTYpOworCisgICAgaWYgKGRpZmYgPiAxMDAwMDBsbCkgeworICAgICAgICAvLyBBdWRpbyBkYXRhIHN0YXJ0cyBNb3JlIHRoYW4gMC4xIHNlY3MgYmVmb3JlIHZpZGVvLgorICAgICAgICAvLyBEcm9wIHNvbWUgYXVkaW8uCisKKyAgICAgICAgKCptQXVkaW9RdWV1ZS5iZWdpbigpKS5tTm90aWZ5Q29uc3VtZWQtPnBvc3QoKTsKKyAgICAgICAgbUF1ZGlvUXVldWUuZXJhc2UobUF1ZGlvUXVldWUuYmVnaW4oKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzeW5jUXVldWVzRG9uZV9sKCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6c3luY1F1ZXVlc0RvbmVfbCgpIHsKKyAgICBpZiAoIW1TeW5jUXVldWVzKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtU3luY1F1ZXVlcyA9IGZhbHNlOworCisgICAgaWYgKCFtQXVkaW9RdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgIHBvc3REcmFpbkF1ZGlvUXVldWVfbCgpOworICAgIH0KKworICAgIGlmICghbVZpZGVvUXVldWUuZW1wdHkoKSkgeworICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgcG9zdERyYWluVmlkZW9RdWV1ZSgpOworICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6Om9uUXVldWVFT1MoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBpbnQzMl90IGF1ZGlvOworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJhdWRpbyIsICZhdWRpbykpOworCisgICAgaWYgKGRyb3BCdWZmZXJJZlN0YWxlKGF1ZGlvLCBtc2cpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQzMl90IGZpbmFsUmVzdWx0OworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJmaW5hbFJlc3VsdCIsICZmaW5hbFJlc3VsdCkpOworCisgICAgUXVldWVFbnRyeSBlbnRyeTsKKyAgICBlbnRyeS5tT2Zmc2V0ID0gMDsKKyAgICBlbnRyeS5tRmluYWxSZXN1bHQgPSBmaW5hbFJlc3VsdDsKKworICAgIGlmIChhdWRpbykgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICAgICBpZiAobUF1ZGlvUXVldWUuZW1wdHkoKSAmJiBtU3luY1F1ZXVlcykgeworICAgICAgICAgICAgc3luY1F1ZXVlc0RvbmVfbCgpOworICAgICAgICB9CisgICAgICAgIG1BdWRpb1F1ZXVlLnB1c2hfYmFjayhlbnRyeSk7CisgICAgICAgIHBvc3REcmFpbkF1ZGlvUXVldWVfbCgpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtVmlkZW9RdWV1ZS5lbXB0eSgpICYmIGdldFN5bmNRdWV1ZXMoKSkgeworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgICAgICAgIHN5bmNRdWV1ZXNEb25lX2woKTsKKyAgICAgICAgfQorICAgICAgICBtVmlkZW9RdWV1ZS5wdXNoX2JhY2soZW50cnkpOworICAgICAgICBwb3N0RHJhaW5WaWRlb1F1ZXVlKCk7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6Om9uRmx1c2goY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBpbnQzMl90IGF1ZGlvLCBub3RpZnlDb21wbGV0ZTsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiYXVkaW8iLCAmYXVkaW8pKTsKKworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgICAgaWYgKGF1ZGlvKSB7CisgICAgICAgICAgICBub3RpZnlDb21wbGV0ZSA9IG1Ob3RpZnlDb21wbGV0ZUF1ZGlvOworICAgICAgICAgICAgbU5vdGlmeUNvbXBsZXRlQXVkaW8gPSBmYWxzZTsKKyAgICAgICAgICAgIG1MYXN0QXVkaW9NZWRpYVRpbWVVcyA9IC0xOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbm90aWZ5Q29tcGxldGUgPSBtTm90aWZ5Q29tcGxldGVWaWRlbzsKKyAgICAgICAgICAgIG1Ob3RpZnlDb21wbGV0ZVZpZGVvID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiB3ZSdyZSBjdXJyZW50bHkgc3luY2luZyB0aGUgcXVldWVzLCBpLmUuIGRyb3BwaW5nIGF1ZGlvIHdoaWxlCisgICAgICAgIC8vIGFsaWduaW5nIHRoZSBmaXJzdCBhdWRpby92aWRlbyBidWZmZXIgdGltZXMgYW5kIG9ubHkgb25lIG9mIHRoZQorICAgICAgICAvLyB0d28gcXVldWVzIGhhcyBkYXRhLCB3ZSBtYXkgc3RhcnZlIHRoYXQgcXVldWUgYnkgbm90IHJlcXVlc3RpbmcKKyAgICAgICAgLy8gbW9yZSBidWZmZXJzIGZyb20gdGhlIGRlY29kZXIuIElmIHRoZSBvdGhlciBzb3VyY2UgdGhlbiBlbmNvdW50ZXJzCisgICAgICAgIC8vIGEgZGlzY29udGludWl0eSB0aGF0IGxlYWRzIHRvIGZsdXNoaW5nLCB3ZSdsbCBuZXZlciBmaW5kIHRoZQorICAgICAgICAvLyBjb3JyZXNwb25kaW5nIGRpc2NvbnRpbnVpdHkgb24gdGhlIG90aGVyIHF1ZXVlLgorICAgICAgICAvLyBUaGVyZWZvcmUgd2UnbGwgc3RvcCBzeW5jaW5nIHRoZSBxdWV1ZXMgaWYgYXQgbGVhc3Qgb25lIG9mIHRoZW0KKyAgICAgICAgLy8gaXMgZmx1c2hlZC4KKyAgICAgICAgc3luY1F1ZXVlc0RvbmVfbCgpOworICAgIH0KKyAgICBjbGVhckFuY2hvclRpbWUoKTsKKworICAgIEFMT0dWKCJmbHVzaGluZyAlcyIsIGF1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIpOworICAgIGlmIChhdWRpbykgeworICAgICAgICB7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICAgICAgICAgZmx1c2hRdWV1ZSgmbUF1ZGlvUXVldWUpOworCisgICAgICAgICAgICArK21BdWRpb0RyYWluR2VuZXJhdGlvbjsKKyAgICAgICAgICAgICsrbUF1ZGlvRU9TR2VuZXJhdGlvbjsKKyAgICAgICAgICAgIHByZXBhcmVGb3JNZWRpYVJlbmRlcmluZ1N0YXJ0X2woKTsKKworICAgICAgICAgICAgLy8gdGhlIGZyYW1lIGNvdW50IHdpbGwgYmUgcmVzZXQgYWZ0ZXIgZmx1c2guCisgICAgICAgICAgICBjbGVhckF1ZGlvRmlyc3RBbmNob3JUaW1lX2woKTsKKyAgICAgICAgfQorCisgICAgICAgIG1EcmFpbkF1ZGlvUXVldWVQZW5kaW5nID0gZmFsc2U7CisKKyAgICAgICAgaWYgKG9mZmxvYWRpbmdBdWRpbygpKSB7CisgICAgICAgICAgICBtQXVkaW9TaW5rLT5wYXVzZSgpOworICAgICAgICAgICAgbUF1ZGlvU2luay0+Zmx1c2goKTsKKyAgICAgICAgICAgIGlmICghbVBhdXNlZCkgeworICAgICAgICAgICAgICAgIG1BdWRpb1NpbmstPnN0YXJ0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQXVkaW9TaW5rLT5wYXVzZSgpOworICAgICAgICAgICAgbUF1ZGlvU2luay0+Zmx1c2goKTsKKyAgICAgICAgICAgIC8vIENhbGwgc3RvcCgpIHRvIHNpZ25hbCB0byB0aGUgQXVkaW9TaW5rIHRvIGNvbXBsZXRlbHkgZmlsbCB0aGUKKyAgICAgICAgICAgIC8vIGludGVybmFsIGJ1ZmZlciBiZWZvcmUgcmVzdW1pbmcgcGxheWJhY2suCisgICAgICAgICAgICAvLyBGSVhNRTogdGhpcyBpcyBpZ25vcmVkIGFmdGVyIGZsdXNoKCkuCisgICAgICAgICAgICBtQXVkaW9TaW5rLT5zdG9wKCk7CisgICAgICAgICAgICBpZiAobVBhdXNlZCkgeworICAgICAgICAgICAgICAgIC8vIFJhY2UgY29uZGl0aW9uOiBpZiByZW5kZXJlciBpcyBwYXVzZWQgYW5kIGF1ZGlvIHNpbmsgaXMgc3RvcHBlZCwKKyAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBhdWRpbyB0cmFjayBidWZmZXIgZnVsbHkgZHJhaW5zCisgICAgICAgICAgICAgICAgLy8gYmVmb3JlIGRlbGl2ZXJpbmcgZGF0YS4KKyAgICAgICAgICAgICAgICAvLyBGSVhNRTogcmVtb3ZlIHRoaXMgaWYgd2UgY2FuIGRldGVjdCBpZiBzdG9wKCkgaXMgY29tcGxldGUuCisgICAgICAgICAgICAgICAgY29uc3QgaW50IGRlbGF5VXMgPSAyICogNTAgKiAxMDAwOyAvLyAoMiBmdWxsIG1peGVyIHRocmVhZCBjeWNsZXMgYXQgNTBtcykKKyAgICAgICAgICAgICAgICBtUGF1c2VEcmFpbkF1ZGlvQWxsb3dlZFVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKSArIGRlbGF5VXM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1BdWRpb1NpbmstPnN0YXJ0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtTnVtRnJhbWVzV3JpdHRlbiA9IDA7CisgICAgICAgIH0KKyAgICAgICAgbU5leHRBdWRpb0Nsb2NrVXBkYXRlVGltZVVzID0gLTE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmx1c2hRdWV1ZSgmbVZpZGVvUXVldWUpOworCisgICAgICAgIG1EcmFpblZpZGVvUXVldWVQZW5kaW5nID0gZmFsc2U7CisKKyAgICAgICAgaWYgKG1WaWRlb1NjaGVkdWxlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBtVmlkZW9TY2hlZHVsZXItPnJlc3RhcnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgICAgICsrbVZpZGVvRHJhaW5HZW5lcmF0aW9uOworICAgICAgICBwcmVwYXJlRm9yTWVkaWFSZW5kZXJpbmdTdGFydF9sKCk7CisgICAgfQorCisgICAgbVZpZGVvU2FtcGxlUmVjZWl2ZWQgPSBmYWxzZTsKKworICAgIGlmIChub3RpZnlDb21wbGV0ZSkgeworICAgICAgICBub3RpZnlGbHVzaENvbXBsZXRlKGF1ZGlvKTsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6Zmx1c2hRdWV1ZShMaXN0PFF1ZXVlRW50cnk+ICpxdWV1ZSkgeworICAgIHdoaWxlICghcXVldWUtPmVtcHR5KCkpIHsKKyAgICAgICAgUXVldWVFbnRyeSAqZW50cnkgPSAmKnF1ZXVlLT5iZWdpbigpOworCisgICAgICAgIGlmIChlbnRyeS0+bUJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBlbnRyeS0+bU5vdGlmeUNvbnN1bWVkLT5wb3N0KCk7CisgICAgICAgIH0gZWxzZSBpZiAoZW50cnktPm1Ob3RpZnlDb25zdW1lZCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAvLyBJcyBpdCBuZWVkZWQgdG8gb3BlbiBhdWRpbyBzaW5rIG5vdz8KKyAgICAgICAgICAgIG9uQ2hhbmdlQXVkaW9Gb3JtYXQoZW50cnktPm1NZXRhLCBlbnRyeS0+bU5vdGlmeUNvbnN1bWVkKTsKKyAgICAgICAgfQorCisgICAgICAgIHF1ZXVlLT5lcmFzZShxdWV1ZS0+YmVnaW4oKSk7CisgICAgICAgIGVudHJ5ID0gTlVMTDsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6bm90aWZ5Rmx1c2hDb21wbGV0ZShib29sIGF1ZGlvKSB7CisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdEZsdXNoQ29tcGxldGUpOworICAgIG5vdGlmeS0+c2V0SW50MzIoImF1ZGlvIiwgc3RhdGljX2Nhc3Q8aW50MzJfdD4oYXVkaW8pKTsKKyAgICBub3RpZnktPnBvc3QoKTsKK30KKworYm9vbCBOdVBsYXllcjI6OlJlbmRlcmVyOjpkcm9wQnVmZmVySWZTdGFsZSgKKyAgICAgICAgYm9vbCBhdWRpbywgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBpbnQzMl90IHF1ZXVlR2VuZXJhdGlvbjsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicXVldWVHZW5lcmF0aW9uIiwgJnF1ZXVlR2VuZXJhdGlvbikpOworCisgICAgaWYgKHF1ZXVlR2VuZXJhdGlvbiA9PSBnZXRRdWV1ZUdlbmVyYXRpb24oYXVkaW8pKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5Q29uc3VtZWQ7CisgICAgaWYgKG1zZy0+ZmluZE1lc3NhZ2UoIm5vdGlmeUNvbnN1bWVkIiwgJm5vdGlmeUNvbnN1bWVkKSkgeworICAgICAgICBub3RpZnlDb25zdW1lZC0+cG9zdCgpOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6Om9uQXVkaW9TaW5rQ2hhbmdlZCgpIHsKKyAgICBpZiAob2ZmbG9hZGluZ0F1ZGlvKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBDSEVDSyghbURyYWluQXVkaW9RdWV1ZVBlbmRpbmcpOworICAgIG1OdW1GcmFtZXNXcml0dGVuID0gMDsKKyAgICBtQW5jaG9yTnVtRnJhbWVzV3JpdHRlbiA9IC0xOworICAgIHVpbnQzMl90IHdyaXR0ZW47CisgICAgaWYgKG1BdWRpb1NpbmstPmdldEZyYW1lc1dyaXR0ZW4oJndyaXR0ZW4pID09IE9LKSB7CisgICAgICAgIG1OdW1GcmFtZXNXcml0dGVuID0gd3JpdHRlbjsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6b25EaXNhYmxlT2ZmbG9hZEF1ZGlvKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgbUZsYWdzICY9IH5GTEFHX09GRkxPQURfQVVESU87CisgICAgKyttQXVkaW9EcmFpbkdlbmVyYXRpb247CisgICAgaWYgKG1BdWRpb1JlbmRlcmluZ1N0YXJ0R2VuZXJhdGlvbiAhPSAtMSkgeworICAgICAgICBwcmVwYXJlRm9yTWVkaWFSZW5kZXJpbmdTdGFydF9sKCk7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6Om9uRW5hYmxlT2ZmbG9hZEF1ZGlvKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgbUZsYWdzIHw9IEZMQUdfT0ZGTE9BRF9BVURJTzsKKyAgICArK21BdWRpb0RyYWluR2VuZXJhdGlvbjsKKyAgICBpZiAobUF1ZGlvUmVuZGVyaW5nU3RhcnRHZW5lcmF0aW9uICE9IC0xKSB7CisgICAgICAgIHByZXBhcmVGb3JNZWRpYVJlbmRlcmluZ1N0YXJ0X2woKTsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6b25QYXVzZSgpIHsKKyAgICBpZiAobVBhdXNlZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICAgICAvLyB3ZSBkbyBub3QgaW5jcmVtZW50IGF1ZGlvIGRyYWluIGdlbmVyYXRpb24gc28gdGhhdCB3ZSBmaWxsIGF1ZGlvIGJ1ZmZlciBkdXJpbmcgcGF1c2UuCisgICAgICAgICsrbVZpZGVvRHJhaW5HZW5lcmF0aW9uOworICAgICAgICBwcmVwYXJlRm9yTWVkaWFSZW5kZXJpbmdTdGFydF9sKCk7CisgICAgICAgIG1QYXVzZWQgPSB0cnVlOworICAgICAgICBtTWVkaWFDbG9jay0+c2V0UGxheWJhY2tSYXRlKDAuMCk7CisgICAgfQorCisgICAgbURyYWluQXVkaW9RdWV1ZVBlbmRpbmcgPSBmYWxzZTsKKyAgICBtRHJhaW5WaWRlb1F1ZXVlUGVuZGluZyA9IGZhbHNlOworCisgICAgLy8gTm90ZTogYXVkaW8gZGF0YSBtYXkgbm90IGhhdmUgYmVlbiBkZWNvZGVkLCBhbmQgdGhlIEF1ZGlvU2luayBtYXkgbm90IGJlIG9wZW5lZC4KKyAgICBtQXVkaW9TaW5rLT5wYXVzZSgpOworICAgIHN0YXJ0QXVkaW9PZmZsb2FkUGF1c2VUaW1lb3V0KCk7CisKKyAgICBBTE9HVigibm93IHBhdXNlZCBhdWRpbyBxdWV1ZSBoYXMgJXp1IGVudHJpZXMsIHZpZGVvIGhhcyAlenUgZW50cmllcyIsCisgICAgICAgICAgbUF1ZGlvUXVldWUuc2l6ZSgpLCBtVmlkZW9RdWV1ZS5zaXplKCkpOworfQorCit2b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6Om9uUmVzdW1lKCkgeworICAgIGlmICghbVBhdXNlZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gTm90ZTogYXVkaW8gZGF0YSBtYXkgbm90IGhhdmUgYmVlbiBkZWNvZGVkLCBhbmQgdGhlIEF1ZGlvU2luayBtYXkgbm90IGJlIG9wZW5lZC4KKyAgICBjYW5jZWxBdWRpb09mZmxvYWRQYXVzZVRpbWVvdXQoKTsKKyAgICBpZiAobUF1ZGlvU2luay0+cmVhZHkoKSkgeworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQXVkaW9TaW5rLT5zdGFydCgpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiY2Fubm90IHN0YXJ0IEF1ZGlvU2luayBlcnIgJWQiLCBlcnIpOworICAgICAgICAgICAgbm90aWZ5QXVkaW9UZWFyRG93bihrRHVlVG9FcnJvcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgICAgIG1QYXVzZWQgPSBmYWxzZTsKKyAgICAgICAgLy8gcmVuZGVyaW5nIHN0YXJ0ZWQgbWVzc2FnZSBtYXkgaGF2ZSBiZWVuIGRlbGF5ZWQgaWYgd2Ugd2VyZSBwYXVzZWQuCisgICAgICAgIGlmIChtUmVuZGVyaW5nRGF0YURlbGl2ZXJlZCkgeworICAgICAgICAgICAgbm90aWZ5SWZNZWRpYVJlbmRlcmluZ1N0YXJ0ZWRfbCgpOworICAgICAgICB9CisgICAgICAgIC8vIGNvbmZpZ3VyZSBhdWRpb3NpbmsgYXMgd2UgZGlkIG5vdCBkbyBpdCB3aGVuIHBhdXNpbmcKKyAgICAgICAgaWYgKG1BdWRpb1NpbmsgIT0gTlVMTCAmJiBtQXVkaW9TaW5rLT5yZWFkeSgpKSB7CisgICAgICAgICAgICBtQXVkaW9TaW5rLT5zZXRQbGF5YmFja1JhdGUobVBsYXliYWNrU2V0dGluZ3MpOworICAgICAgICB9CisKKyAgICAgICAgbU1lZGlhQ2xvY2stPnNldFBsYXliYWNrUmF0ZShtUGxheWJhY2tSYXRlKTsKKworICAgICAgICBpZiAoIW1BdWRpb1F1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHBvc3REcmFpbkF1ZGlvUXVldWVfbCgpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFtVmlkZW9RdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgIHBvc3REcmFpblZpZGVvUXVldWUoKTsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6b25TZXRWaWRlb0ZyYW1lUmF0ZShmbG9hdCBmcHMpIHsKKyAgICBpZiAobVZpZGVvU2NoZWR1bGVyID09IE5VTEwpIHsKKyAgICAgICAgbVZpZGVvU2NoZWR1bGVyID0gbmV3IFZpZGVvRnJhbWVTY2hlZHVsZXIoKTsKKyAgICB9CisgICAgbVZpZGVvU2NoZWR1bGVyLT5pbml0KGZwcyk7Cit9CisKK2ludDMyX3QgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6Z2V0UXVldWVHZW5lcmF0aW9uKGJvb2wgYXVkaW8pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIHJldHVybiAoYXVkaW8gPyBtQXVkaW9RdWV1ZUdlbmVyYXRpb24gOiBtVmlkZW9RdWV1ZUdlbmVyYXRpb24pOworfQorCitpbnQzMl90IE51UGxheWVyMjo6UmVuZGVyZXI6OmdldERyYWluR2VuZXJhdGlvbihib29sIGF1ZGlvKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gKGF1ZGlvID8gbUF1ZGlvRHJhaW5HZW5lcmF0aW9uIDogbVZpZGVvRHJhaW5HZW5lcmF0aW9uKTsKK30KKworYm9vbCBOdVBsYXllcjI6OlJlbmRlcmVyOjpnZXRTeW5jUXVldWVzKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgcmV0dXJuIG1TeW5jUXVldWVzOworfQorCit2b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6Om9uQXVkaW9UZWFyRG93bihBdWRpb1RlYXJEb3duUmVhc29uIHJlYXNvbikgeworICAgIGlmIChtQXVkaW9Ub3JuRG93bikgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1BdWRpb1Rvcm5Eb3duID0gdHJ1ZTsKKworICAgIGludDY0X3QgY3VycmVudFBvc2l0aW9uVXM7CisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgIGlmIChnZXRDdXJyZW50UG9zaXRpb24oJmN1cnJlbnRQb3NpdGlvblVzKSA9PSBPSykgeworICAgICAgICBub3RpZnktPnNldEludDY0KCJwb3NpdGlvblVzIiwgY3VycmVudFBvc2l0aW9uVXMpOworICAgIH0KKworICAgIG1BdWRpb1NpbmstPnN0b3AoKTsKKyAgICBtQXVkaW9TaW5rLT5mbHVzaCgpOworCisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0QXVkaW9UZWFyRG93bik7CisgICAgbm90aWZ5LT5zZXRJbnQzMigicmVhc29uIiwgcmVhc29uKTsKKyAgICBub3RpZnktPnBvc3QoKTsKK30KKwordm9pZCBOdVBsYXllcjI6OlJlbmRlcmVyOjpzdGFydEF1ZGlvT2ZmbG9hZFBhdXNlVGltZW91dCgpIHsKKyAgICBpZiAob2ZmbG9hZGluZ0F1ZGlvKCkpIHsKKyAgICAgICAgbVdha2VMb2NrLT5hY3F1aXJlKCk7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRBdWRpb09mZmxvYWRQYXVzZVRpbWVvdXQsIHRoaXMpOworICAgICAgICBtc2ctPnNldEludDMyKCJkcmFpbkdlbmVyYXRpb24iLCBtQXVkaW9PZmZsb2FkUGF1c2VUaW1lb3V0R2VuZXJhdGlvbik7CisgICAgICAgIG1zZy0+cG9zdChrT2ZmbG9hZFBhdXNlTWF4VXMpOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjI6OlJlbmRlcmVyOjpjYW5jZWxBdWRpb09mZmxvYWRQYXVzZVRpbWVvdXQoKSB7CisgICAgLy8gV2UgbWF5IGhhdmUgY2FsbGVkIHN0YXJ0QXVkaW9PZmZsb2FkUGF1c2VUaW1lb3V0KCkgd2l0aG91dAorICAgIC8vIHRoZSBBdWRpb1Npbmsgb3BlbiBhbmQgd2l0aCBvZmZsb2FkaW5nQXVkaW8gZW5hYmxlZC4KKyAgICAvLworICAgIC8vIFdoZW4gd2UgY2FuY2VsLCBpdCBtYXkgYmUgdGhhdCBvZmZsb2FkaW5nQXVkaW8gaXMgc3Vic2VxdWVudGx5IGRpc2FibGVkLCBzbyByZWdhcmRsZXNzCisgICAgLy8gd2UgYWx3YXlzIHJlbGVhc2UgdGhlIHdha2Vsb2NrIGFuZCBpbmNyZW1lbnQgdGhlIHBhdXNlIHRpbWVvdXQgZ2VuZXJhdGlvbi4KKyAgICAvLworICAgIC8vIE5vdGU6IFRoZSBhY3F1aXJlZCB3YWtlbG9jayBwcmV2ZW50cyB0aGUgZGV2aWNlIGZyb20gc3VzcGVuZGluZworICAgIC8vIGltbWVkaWF0ZWx5IGFmdGVyIG9mZmxvYWQgcGF1c2UgKGluIGNhc2UgYSByZXN1bWUgaGFwcGVucyBzaG9ydGx5IHRoZXJlYWZ0ZXIpLgorICAgIG1XYWtlTG9jay0+cmVsZWFzZSh0cnVlKTsKKyAgICArK21BdWRpb09mZmxvYWRQYXVzZVRpbWVvdXRHZW5lcmF0aW9uOworfQorCitzdGF0dXNfdCBOdVBsYXllcjI6OlJlbmRlcmVyOjpvbk9wZW5BdWRpb1NpbmsoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICBib29sIG9mZmxvYWRPbmx5LAorICAgICAgICBib29sIGhhc1ZpZGVvLAorICAgICAgICB1aW50MzJfdCBmbGFncywKKyAgICAgICAgYm9vbCBpc1N0cmVhbWluZykgeworICAgIEFMT0dWKCJvcGVuQXVkaW9TaW5rOiBvZmZsb2FkT25seSglZCkgb2ZmbG9hZGluZ0F1ZGlvKCVkKSIsCisgICAgICAgICAgICBvZmZsb2FkT25seSwgb2ZmbG9hZGluZ0F1ZGlvKCkpOworICAgIGJvb2wgYXVkaW9TaW5rQ2hhbmdlZCA9IGZhbHNlOworCisgICAgaW50MzJfdCBudW1DaGFubmVsczsKKyAgICBDSEVDSyhmb3JtYXQtPmZpbmRJbnQzMigiY2hhbm5lbC1jb3VudCIsICZudW1DaGFubmVscykpOworCisgICAgaW50MzJfdCBjaGFubmVsTWFzazsKKyAgICBpZiAoIWZvcm1hdC0+ZmluZEludDMyKCJjaGFubmVsLW1hc2siLCAmY2hhbm5lbE1hc2spKSB7CisgICAgICAgIC8vIHNpZ25hbCB0byB0aGUgQXVkaW9TaW5rIHRvIGRlcml2ZSB0aGUgbWFzayBmcm9tIGNvdW50LgorICAgICAgICBjaGFubmVsTWFzayA9IENIQU5ORUxfTUFTS19VU0VfQ0hBTk5FTF9PUkRFUjsKKyAgICB9CisKKyAgICBpbnQzMl90IHNhbXBsZVJhdGU7CisgICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoInNhbXBsZS1yYXRlIiwgJnNhbXBsZVJhdGUpKTsKKworICAgIGlmIChvZmZsb2FkaW5nQXVkaW8oKSkgeworICAgICAgICBhdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworICAgICAgICBBU3RyaW5nIG1pbWU7CisgICAgICAgIENIRUNLKGZvcm1hdC0+ZmluZFN0cmluZygibWltZSIsICZtaW1lKSk7CisgICAgICAgIHN0YXR1c190IGVyciA9IG1hcE1pbWVUb0F1ZGlvRm9ybWF0KGF1ZGlvRm9ybWF0LCBtaW1lLmNfc3RyKCkpOworCisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJDb3VsZG4ndCBtYXAgbWltZSBcIiVzXCIgdG8gYSB2YWxpZCAiCisgICAgICAgICAgICAgICAgICAgICJhdWRpb19mb3JtYXQiLCBtaW1lLmNfc3RyKCkpOworICAgICAgICAgICAgb25EaXNhYmxlT2ZmbG9hZEF1ZGlvKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVigiTWltZSBcIiVzXCIgbWFwcGVkIHRvIGF1ZGlvX2Zvcm1hdCAweCV4IiwKKyAgICAgICAgICAgICAgICAgICAgbWltZS5jX3N0cigpLCBhdWRpb0Zvcm1hdCk7CisKKyAgICAgICAgICAgIGludCBhdmdCaXRSYXRlID0gLTE7CisgICAgICAgICAgICBmb3JtYXQtPmZpbmRJbnQzMigiYml0cmF0ZSIsICZhdmdCaXRSYXRlKTsKKworICAgICAgICAgICAgaW50MzJfdCBhYWNQcm9maWxlID0gLTE7CisgICAgICAgICAgICBpZiAoYXVkaW9Gb3JtYXQgPT0gQVVESU9fRk9STUFUX0FBQworICAgICAgICAgICAgICAgICAgICAmJiBmb3JtYXQtPmZpbmRJbnQzMigiYWFjLXByb2ZpbGUiLCAmYWFjUHJvZmlsZSkpIHsKKyAgICAgICAgICAgICAgICAvLyBSZWRlZmluZSBBQUMgZm9ybWF0IGFzIHBlciBhYWMgcHJvZmlsZQorICAgICAgICAgICAgICAgIG1hcEFBQ1Byb2ZpbGVUb0F1ZGlvRm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9Gb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICBhYWNQcm9maWxlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXVkaW9fb2ZmbG9hZF9pbmZvX3Qgb2ZmbG9hZEluZm8gPSBBVURJT19JTkZPX0lOSVRJQUxJWkVSOworICAgICAgICAgICAgb2ZmbG9hZEluZm8uZHVyYXRpb25fdXMgPSAtMTsKKyAgICAgICAgICAgIGZvcm1hdC0+ZmluZEludDY0KAorICAgICAgICAgICAgICAgICAgICAiZHVyYXRpb25VcyIsICZvZmZsb2FkSW5mby5kdXJhdGlvbl91cyk7CisgICAgICAgICAgICBvZmZsb2FkSW5mby5zYW1wbGVfcmF0ZSA9IHNhbXBsZVJhdGU7CisgICAgICAgICAgICBvZmZsb2FkSW5mby5jaGFubmVsX21hc2sgPSBjaGFubmVsTWFzazsKKyAgICAgICAgICAgIG9mZmxvYWRJbmZvLmZvcm1hdCA9IGF1ZGlvRm9ybWF0OworICAgICAgICAgICAgb2ZmbG9hZEluZm8uc3RyZWFtX3R5cGUgPSBBVURJT19TVFJFQU1fTVVTSUM7CisgICAgICAgICAgICBvZmZsb2FkSW5mby5iaXRfcmF0ZSA9IGF2Z0JpdFJhdGU7CisgICAgICAgICAgICBvZmZsb2FkSW5mby5oYXNfdmlkZW8gPSBoYXNWaWRlbzsKKyAgICAgICAgICAgIG9mZmxvYWRJbmZvLmlzX3N0cmVhbWluZyA9IGlzU3RyZWFtaW5nOworCisgICAgICAgICAgICBpZiAobWVtY21wKCZtQ3VycmVudE9mZmxvYWRJbmZvLCAmb2ZmbG9hZEluZm8sIHNpemVvZihvZmZsb2FkSW5mbykpID09IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVigib3BlbkF1ZGlvU2luazogbm8gY2hhbmdlIGluIG9mZmxvYWQgbW9kZSIpOworICAgICAgICAgICAgICAgIC8vIG5vIGNoYW5nZSBmcm9tIHByZXZpb3VzIGNvbmZpZ3VyYXRpb24sIGV2ZXJ5dGhpbmcgb2suCisgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUN1cnJlbnRQY21JbmZvID0gQVVESU9fUENNSU5GT19JTklUSUFMSVpFUjsKKworICAgICAgICAgICAgQUxPR1YoIm9wZW5BdWRpb1Npbms6IHRyeSB0byBvcGVuIEF1ZGlvU2luayBpbiBvZmZsb2FkIG1vZGUiKTsKKyAgICAgICAgICAgIHVpbnQzMl90IG9mZmxvYWRGbGFncyA9IGZsYWdzOworICAgICAgICAgICAgb2ZmbG9hZEZsYWdzIHw9IEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQ7CisgICAgICAgICAgICBvZmZsb2FkRmxhZ3MgJj0gfkFVRElPX09VVFBVVF9GTEFHX0RFRVBfQlVGRkVSOworICAgICAgICAgICAgYXVkaW9TaW5rQ2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICBtQXVkaW9TaW5rLT5jbG9zZSgpOworCisgICAgICAgICAgICBlcnIgPSBtQXVkaW9TaW5rLT5vcGVuKAorICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICBudW1DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX2NoYW5uZWxfbWFza190KWNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICBhdWRpb0Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgMCAvKiBidWZmZXJDb3VudCAtIHVudXNlZCAqLywKKyAgICAgICAgICAgICAgICAgICAgJk51UGxheWVyMjo6UmVuZGVyZXI6OkF1ZGlvU2lua0NhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICB0aGlzLAorICAgICAgICAgICAgICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3Qpb2ZmbG9hZEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAmb2ZmbG9hZEluZm8pOworCisgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgZXJyID0gbUF1ZGlvU2luay0+c2V0UGxheWJhY2tSYXRlKG1QbGF5YmFja1NldHRpbmdzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgIC8vIElmIHRoZSBwbGF5YmFjayBpcyBvZmZsb2FkZWQgdG8gaC93LCB3ZSBwYXNzCisgICAgICAgICAgICAgICAgLy8gdGhlIEhBTCBzb21lIG1ldGFkYXRhIGluZm9ybWF0aW9uLgorICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gZG8gdGhpcyBmb3IgUENNIGJlY2F1c2UgaXQKKyAgICAgICAgICAgICAgICAvLyB3aWxsIGJlIGdvaW5nIHRocm91Z2ggdGhlIEF1ZGlvRmxpbmdlciBtaXhlcgorICAgICAgICAgICAgICAgIC8vIGJlZm9yZSByZWFjaGluZyB0aGUgaGFyZHdhcmUuCisgICAgICAgICAgICAgICAgLy8gVE9ETworICAgICAgICAgICAgICAgIG1DdXJyZW50T2ZmbG9hZEluZm8gPSBvZmZsb2FkSW5mbzsKKyAgICAgICAgICAgICAgICBpZiAoIW1QYXVzZWQpIHsgLy8gZm9yIHByZXZpZXcgbW9kZSwgZG9uJ3Qgc3RhcnQgaWYgcGF1c2VkCisgICAgICAgICAgICAgICAgICAgIGVyciA9IG1BdWRpb1NpbmstPnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFMT0dWX0lGKGVyciA9PSBPSywgIm9wZW5BdWRpb1Npbms6IG9mZmxvYWQgc3VjY2VlZGVkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgLy8gQ2xlYW4gdXAsIGZhbGwgYmFjayB0byBub24gb2ZmbG9hZCBtb2RlLgorICAgICAgICAgICAgICAgIG1BdWRpb1NpbmstPmNsb3NlKCk7CisgICAgICAgICAgICAgICAgb25EaXNhYmxlT2ZmbG9hZEF1ZGlvKCk7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRPZmZsb2FkSW5mbyA9IEFVRElPX0lORk9fSU5JVElBTElaRVI7CisgICAgICAgICAgICAgICAgQUxPR1YoIm9wZW5BdWRpb1Npbms6IG9mZmxvYWQgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgaWYgKG9mZmxvYWRPbmx5KSB7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeUF1ZGlvVGVhckRvd24oa0ZvcmNlTm9uT2ZmbG9hZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtVXNlQXVkaW9DYWxsYmFjayA9IHRydWU7ICAvLyBvZmZsb2FkIG1vZGUgdHJhbnNmZXJzIGRhdGEgdGhyb3VnaCBjYWxsYmFjaworICAgICAgICAgICAgICAgICsrbUF1ZGlvRHJhaW5HZW5lcmF0aW9uOyAgLy8gZGlzY2FyZCBwZW5kaW5nIGtXaGF0RHJhaW5BdWRpb1F1ZXVlIG1lc3NhZ2UuCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFvZmZsb2FkT25seSAmJiAhb2ZmbG9hZGluZ0F1ZGlvKCkpIHsKKyAgICAgICAgQUxPR1YoIm9wZW5BdWRpb1Npbms6IG9wZW4gQXVkaW9TaW5rIGluIE5PTi1vZmZsb2FkIG1vZGUiKTsKKyAgICAgICAgdWludDMyX3QgcGNtRmxhZ3MgPSBmbGFnczsKKyAgICAgICAgcGNtRmxhZ3MgJj0gfkFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQ7CisKKyAgICAgICAgY29uc3QgUGNtSW5mbyBpbmZvID0geworICAgICAgICAgICAgICAgIChhdWRpb19jaGFubmVsX21hc2tfdCljaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpcGNtRmxhZ3MsCisgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsIC8vIFRPRE86IGNoYW5nZSB0byBhdWRpb0Zvcm1hdAorICAgICAgICAgICAgICAgIG51bUNoYW5uZWxzLAorICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUKKyAgICAgICAgfTsKKyAgICAgICAgaWYgKG1lbWNtcCgmbUN1cnJlbnRQY21JbmZvLCAmaW5mbywgc2l6ZW9mKGluZm8pKSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HVigib3BlbkF1ZGlvU2luazogbm8gY2hhbmdlIGluIHBjbSBtb2RlIik7CisgICAgICAgICAgICAvLyBubyBjaGFuZ2UgZnJvbSBwcmV2aW91cyBjb25maWd1cmF0aW9uLCBldmVyeXRoaW5nIG9rLgorICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisKKyAgICAgICAgYXVkaW9TaW5rQ2hhbmdlZCA9IHRydWU7CisgICAgICAgIG1BdWRpb1NpbmstPmNsb3NlKCk7CisgICAgICAgIG1DdXJyZW50T2ZmbG9hZEluZm8gPSBBVURJT19JTkZPX0lOSVRJQUxJWkVSOworICAgICAgICAvLyBOb3RlOiBJdCBpcyBwb3NzaWJsZSB0byBzZXQgdXAgdGhlIGNhbGxiYWNrLCBidXQgbm90IHVzZSBpdCB0byBzZW5kIGF1ZGlvIGRhdGEuCisgICAgICAgIC8vIFRoaXMgcmVxdWlyZXMgYSBmaXggaW4gQXVkaW9TaW5rIHRvIGV4cGxpY2l0bHkgc3BlY2lmeSB0aGUgdHJhbnNmZXIgbW9kZS4KKyAgICAgICAgbVVzZUF1ZGlvQ2FsbGJhY2sgPSBnZXRVc2VBdWRpb0NhbGxiYWNrU2V0dGluZygpOworICAgICAgICBpZiAobVVzZUF1ZGlvQ2FsbGJhY2spIHsKKyAgICAgICAgICAgICsrbUF1ZGlvRHJhaW5HZW5lcmF0aW9uOyAgLy8gZGlzY2FyZCBwZW5kaW5nIGtXaGF0RHJhaW5BdWRpb1F1ZXVlIG1lc3NhZ2UuCisgICAgICAgIH0KKworICAgICAgICAvLyBDb21wdXRlIHRoZSBkZXNpcmVkIGJ1ZmZlciBzaXplLgorICAgICAgICAvLyBGb3IgY2FsbGJhY2sgbW9kZSwgdGhlIGFtb3VudCBvZiB0aW1lIGJlZm9yZSB3YWtldXAgaXMgYWJvdXQgaGFsZiB0aGUgYnVmZmVyIHNpemUuCisgICAgICAgIGNvbnN0IHVpbnQzMl90IGZyYW1lQ291bnQgPQorICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2FtcGxlUmF0ZSAqIGdldEF1ZGlvU2lua1BjbU1zU2V0dGluZygpIC8gMTAwMDsKKworICAgICAgICAvLyBUaGUgZG9Ob3RSZWNvbm5lY3QgbWVhbnMgQXVkaW9TaW5rIHdpbGwgc2lnbmFsIGJhY2sgYW5kIGxldCBOdVBsYXllcjIgdG8gcmUtY29uc3RydWN0CisgICAgICAgIC8vIEF1ZGlvU2luay4gV2UgZG9uJ3Qgd2FudCB0aGlzIHdoZW4gdGhlcmUncyB2aWRlbyBiZWNhdXNlIGl0IHdpbGwgY2F1c2UgYSB2aWRlbyBzZWVrIHRvCisgICAgICAgIC8vIHRoZSBwcmV2aW91cyBJIGZyYW1lLiBCdXQgd2UgZG8gd2FudCB0aGlzIHdoZW4gdGhlcmUncyBvbmx5IGF1ZGlvIGJlY2F1c2UgaXQgd2lsbCBnaXZlCisgICAgICAgIC8vIE51UGxheWVyMiBhIGNoYW5jZSB0byBzd2l0Y2ggZnJvbSBub24tb2ZmbG9hZCBtb2RlIHRvIG9mZmxvYWQgbW9kZS4KKyAgICAgICAgLy8gU28gd2Ugb25seSBzZXQgZG9Ob3RSZWNvbm5lY3Qgd2hlbiB0aGVyZSdzIG5vIHZpZGVvLgorICAgICAgICBjb25zdCBib29sIGRvTm90UmVjb25uZWN0ID0gIWhhc1ZpZGVvOworCisgICAgICAgIC8vIFdlIHNob3VsZCBhbHdheXMgYmUgYWJsZSB0byBzZXQgb3VyIHBsYXliYWNrIHNldHRpbmdzIGlmIHRoZSBzaW5rIGlzIGNsb3NlZC4KKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtQXVkaW9TaW5rLT5zZXRQbGF5YmFja1JhdGUobVBsYXliYWNrU2V0dGluZ3MpICE9IE9LLAorICAgICAgICAgICAgICAgICJvbk9wZW5BdWRpb1Npbms6IGNhbid0IHNldCBwbGF5YmFjayByYXRlIG9uIGNsb3NlZCBzaW5rIik7CisgICAgICAgIHN0YXR1c190IGVyciA9IG1BdWRpb1NpbmstPm9wZW4oCisgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgIG51bUNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULAorICAgICAgICAgICAgICAgICAgICAwIC8qIGJ1ZmZlckNvdW50IC0gdW51c2VkICovLAorICAgICAgICAgICAgICAgICAgICBtVXNlQXVkaW9DYWxsYmFjayA/ICZOdVBsYXllcjI6OlJlbmRlcmVyOjpBdWRpb1NpbmtDYWxsYmFjayA6IE5VTEwsCisgICAgICAgICAgICAgICAgICAgIG1Vc2VBdWRpb0NhbGxiYWNrID8gdGhpcyA6IE5VTEwsCisgICAgICAgICAgICAgICAgICAgIChhdWRpb19vdXRwdXRfZmxhZ3NfdClwY21GbGFncywKKyAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgZG9Ob3RSZWNvbm5lY3QsCisgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HVygib3BlbkF1ZGlvU2luazogbm9uIG9mZmxvYWRlZCBvcGVuIGZhaWxlZCBzdGF0dXM6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgIG1BdWRpb1NpbmstPmNsb3NlKCk7CisgICAgICAgICAgICBtQ3VycmVudFBjbUluZm8gPSBBVURJT19QQ01JTkZPX0lOSVRJQUxJWkVSOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgICAgICBtQ3VycmVudFBjbUluZm8gPSBpbmZvOworICAgICAgICBpZiAoIW1QYXVzZWQpIHsgLy8gZm9yIHByZXZpZXcgbW9kZSwgZG9uJ3Qgc3RhcnQgaWYgcGF1c2VkCisgICAgICAgICAgICBtQXVkaW9TaW5rLT5zdGFydCgpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChhdWRpb1NpbmtDaGFuZ2VkKSB7CisgICAgICAgIG9uQXVkaW9TaW5rQ2hhbmdlZCgpOworICAgIH0KKyAgICBtQXVkaW9Ub3JuRG93biA9IGZhbHNlOworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBOdVBsYXllcjI6OlJlbmRlcmVyOjpvbkNsb3NlQXVkaW9TaW5rKCkgeworICAgIG1BdWRpb1NpbmstPmNsb3NlKCk7CisgICAgbUN1cnJlbnRPZmZsb2FkSW5mbyA9IEFVRElPX0lORk9fSU5JVElBTElaRVI7CisgICAgbUN1cnJlbnRQY21JbmZvID0gQVVESU9fUENNSU5GT19JTklUSUFMSVpFUjsKK30KKwordm9pZCBOdVBsYXllcjI6OlJlbmRlcmVyOjpvbkNoYW5nZUF1ZGlvRm9ybWF0KAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm1ldGEsIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5KSB7CisgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdDsKKyAgICBDSEVDSyhtZXRhLT5maW5kTWVzc2FnZSgiZm9ybWF0IiwgJmZvcm1hdCkpOworCisgICAgaW50MzJfdCBvZmZsb2FkT25seTsKKyAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoIm9mZmxvYWQtb25seSIsICZvZmZsb2FkT25seSkpOworCisgICAgaW50MzJfdCBoYXNWaWRlbzsKKyAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoImhhcy12aWRlbyIsICZoYXNWaWRlbykpOworCisgICAgdWludDMyX3QgZmxhZ3M7CisgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKCJmbGFncyIsIChpbnQzMl90ICopJmZsYWdzKSk7CisKKyAgICB1aW50MzJfdCBpc1N0cmVhbWluZzsKKyAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoImlzU3RyZWFtaW5nIiwgKGludDMyX3QgKikmaXNTdHJlYW1pbmcpKTsKKworICAgIHN0YXR1c190IGVyciA9IG9uT3BlbkF1ZGlvU2luayhmb3JtYXQsIG9mZmxvYWRPbmx5LCBoYXNWaWRlbywgZmxhZ3MsIGlzU3RyZWFtaW5nKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKKyAgICB9CisgICAgbm90aWZ5LT5wb3N0KCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL251cGxheWVyMi9OdVBsYXllcjJSZW5kZXJlci5oIGIvbWVkaWEvbGlibWVkaWEvbnVwbGF5ZXIyL051UGxheWVyMlJlbmRlcmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAwNzY1NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL251cGxheWVyMi9OdVBsYXllcjJSZW5kZXJlci5oCkBAIC0wLDAgKzEsMzAzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE5VUExBWUVSMl9SRU5ERVJFUl9IXworCisjZGVmaW5lIE5VUExBWUVSMl9SRU5ERVJFUl9IXworCisjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaD4KKyNpbmNsdWRlIDxtZWRpYS9BVlN5bmNTZXR0aW5ncy5oPgorCisjaW5jbHVkZSAiTnVQbGF5ZXIyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgIEpXYWtlTG9jazsKK3N0cnVjdCBNZWRpYUNsb2NrOworY2xhc3MgTWVkaWFDb2RlY0J1ZmZlcjsKK3N0cnVjdCBWaWRlb0ZyYW1lU2NoZWR1bGVyOworCitzdHJ1Y3QgTnVQbGF5ZXIyOjpSZW5kZXJlciA6IHB1YmxpYyBBSGFuZGxlciB7CisgICAgZW51bSBGbGFncyB7CisgICAgICAgIEZMQUdfUkVBTF9USU1FID0gMSwKKyAgICAgICAgRkxBR19PRkZMT0FEX0FVRElPID0gMiwKKyAgICB9OworICAgIFJlbmRlcmVyKGNvbnN0IHNwPE1lZGlhUGxheWVyMkJhc2U6OkF1ZGlvU2luaz4gJnNpbmssCisgICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDbG9jaz4gJm1lZGlhQ2xvY2ssCisgICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCisgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKKworICAgIHN0YXRpYyBzaXplX3QgQXVkaW9TaW5rQ2FsbGJhY2soCisgICAgICAgICAgICBNZWRpYVBsYXllcjJCYXNlOjpBdWRpb1NpbmsgKmF1ZGlvU2luaywKKyAgICAgICAgICAgIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCB2b2lkICptZSwKKyAgICAgICAgICAgIE1lZGlhUGxheWVyMkJhc2U6OkF1ZGlvU2luazo6Y2JfZXZlbnRfdCBldmVudCk7CisKKyAgICB2b2lkIHF1ZXVlQnVmZmVyKAorICAgICAgICAgICAgYm9vbCBhdWRpbywKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeUNvbnN1bWVkKTsKKworICAgIHZvaWQgcXVldWVFT1MoYm9vbCBhdWRpbywgc3RhdHVzX3QgZmluYWxSZXN1bHQpOworCisgICAgc3RhdHVzX3Qgc2V0UGxheWJhY2tTZXR0aW5ncyhjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcmF0ZSAvKiBzYW5pdGl6ZWQgKi8pOworICAgIHN0YXR1c190IGdldFBsYXliYWNrU2V0dGluZ3MoQXVkaW9QbGF5YmFja1JhdGUgKnJhdGUgLyogbm9ubnVsbCAqLyk7CisgICAgc3RhdHVzX3Qgc2V0U3luY1NldHRpbmdzKGNvbnN0IEFWU3luY1NldHRpbmdzICZzeW5jLCBmbG9hdCB2aWRlb0Zwc0hpbnQpOworICAgIHN0YXR1c190IGdldFN5bmNTZXR0aW5ncyhBVlN5bmNTZXR0aW5ncyAqc3luYyAvKiBub25udWxsICovLCBmbG9hdCAqdmlkZW9GcHMgLyogbm9ubnVsbCAqLyk7CisKKyAgICB2b2lkIGZsdXNoKGJvb2wgYXVkaW8sIGJvb2wgbm90aWZ5Q29tcGxldGUpOworCisgICAgdm9pZCBzaWduYWxUaW1lRGlzY29udGludWl0eSgpOworCisgICAgdm9pZCBzaWduYWxEaXNhYmxlT2ZmbG9hZEF1ZGlvKCk7CisgICAgdm9pZCBzaWduYWxFbmFibGVPZmZsb2FkQXVkaW8oKTsKKworICAgIHZvaWQgcGF1c2UoKTsKKyAgICB2b2lkIHJlc3VtZSgpOworCisgICAgdm9pZCBzZXRWaWRlb0ZyYW1lUmF0ZShmbG9hdCBmcHMpOworCisgICAgc3RhdHVzX3QgZ2V0Q3VycmVudFBvc2l0aW9uKGludDY0X3QgKm1lZGlhVXMpOworICAgIGludDY0X3QgZ2V0VmlkZW9MYXRlQnlVcygpOworCisgICAgc3RhdHVzX3Qgb3BlbkF1ZGlvU2luaygKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICAgICAgYm9vbCBvZmZsb2FkT25seSwKKyAgICAgICAgICAgIGJvb2wgaGFzVmlkZW8sCisgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKKyAgICAgICAgICAgIGJvb2wgKmlzT2ZmbG9hZGVkLAorICAgICAgICAgICAgYm9vbCBpc1N0cmVhbWluZyk7CisgICAgdm9pZCBjbG9zZUF1ZGlvU2luaygpOworCisgICAgLy8gcmUtb3BlbiBhdWRpbyBzaW5rIGFmdGVyIGFsbCBwZW5kaW5nIGF1ZGlvIGJ1ZmZlcnMgcGxheWVkLgorICAgIHZvaWQgY2hhbmdlQXVkaW9Gb3JtYXQoCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgICAgIGJvb2wgb2ZmbG9hZE9ubHksCisgICAgICAgICAgICBib29sIGhhc1ZpZGVvLAorICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsCisgICAgICAgICAgICBib29sIGlzU3RyZWFtaW5nLAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpOworCisgICAgZW51bSB7CisgICAgICAgIGtXaGF0RU9TICAgICAgICAgICAgICAgICAgICAgID0gJ2VvcyAnLAorICAgICAgICBrV2hhdEZsdXNoQ29tcGxldGUgICAgICAgICAgICA9ICdmbHVDJywKKyAgICAgICAga1doYXRQb3NpdGlvbiAgICAgICAgICAgICAgICAgPSAncG9zaScsCisgICAgICAgIGtXaGF0VmlkZW9SZW5kZXJpbmdTdGFydCAgICAgID0gJ3ZkcmQnLAorICAgICAgICBrV2hhdE1lZGlhUmVuZGVyaW5nU3RhcnQgICAgICA9ICdtZHJkJywKKyAgICAgICAga1doYXRBdWRpb1RlYXJEb3duICAgICAgICAgICAgPSAnYWRURCcsCisgICAgICAgIGtXaGF0QXVkaW9PZmZsb2FkUGF1c2VUaW1lb3V0ID0gJ2FPUFQnLAorICAgIH07CisKKyAgICBlbnVtIEF1ZGlvVGVhckRvd25SZWFzb24geworICAgICAgICBrRHVlVG9FcnJvciA9IDAsICAgLy8gQ291bGQgcmVzdGFydCB3aXRoIGVpdGhlciBvZmZsb2FkIG9yIG5vbi1vZmZsb2FkLgorICAgICAgICBrRHVlVG9UaW1lb3V0LAorICAgICAgICBrRm9yY2VOb25PZmZsb2FkLCAgLy8gUmVzdGFydCBvbmx5IHdpdGggbm9uLW9mZmxvYWQuCisgICAgfTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgflJlbmRlcmVyKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworCitwcml2YXRlOgorICAgIGVudW0geworICAgICAgICBrV2hhdERyYWluQXVkaW9RdWV1ZSAgICAgPSAnZHJhQScsCisgICAgICAgIGtXaGF0RHJhaW5WaWRlb1F1ZXVlICAgICA9ICdkcmFWJywKKyAgICAgICAga1doYXRQb3N0RHJhaW5WaWRlb1F1ZXVlID0gJ3BEVlEnLAorICAgICAgICBrV2hhdFF1ZXVlQnVmZmVyICAgICAgICAgPSAncXVlQicsCisgICAgICAgIGtXaGF0UXVldWVFT1MgICAgICAgICAgICA9ICdxRU9TJywKKyAgICAgICAga1doYXRDb25maWdQbGF5YmFjayAgICAgID0gJ2NmUEInLAorICAgICAgICBrV2hhdENvbmZpZ1N5bmMgICAgICAgICAgPSAnY2ZTeScsCisgICAgICAgIGtXaGF0R2V0UGxheWJhY2tTZXR0aW5ncyA9ICdnUGJTJywKKyAgICAgICAga1doYXRHZXRTeW5jU2V0dGluZ3MgICAgID0gJ2dTeVMnLAorICAgICAgICBrV2hhdEZsdXNoICAgICAgICAgICAgICAgPSAnZmx1cycsCisgICAgICAgIGtXaGF0UGF1c2UgICAgICAgICAgICAgICA9ICdwYXVzJywKKyAgICAgICAga1doYXRSZXN1bWUgICAgICAgICAgICAgID0gJ3Jlc20nLAorICAgICAgICBrV2hhdE9wZW5BdWRpb1NpbmsgICAgICAgPSAnb3BuQScsCisgICAgICAgIGtXaGF0Q2xvc2VBdWRpb1NpbmsgICAgICA9ICdjbHNBJywKKyAgICAgICAga1doYXRDaGFuZ2VBdWRpb0Zvcm1hdCAgID0gJ2NoZ0EnLAorICAgICAgICBrV2hhdFN0b3BBdWRpb1NpbmsgICAgICAgPSAnc3RwQScsCisgICAgICAgIGtXaGF0RGlzYWJsZU9mZmxvYWRBdWRpbyA9ICdub09BJywKKyAgICAgICAga1doYXRFbmFibGVPZmZsb2FkQXVkaW8gID0gJ2VuT0EnLAorICAgICAgICBrV2hhdFNldFZpZGVvRnJhbWVSYXRlICAgPSAnc1ZGUicsCisgICAgfTsKKworICAgIC8vIGlmIG1CdWZmZXIgIT0gbnVsbHB0ciwgaXQncyBhIGJ1ZmZlciBjb250YWluaW5nIHJlYWwgZGF0YS4KKyAgICAvLyBlbHNlIGlmIG1Ob3RpZnlDb25zdW1lZCA9PSBudWxscHRyLCBpdCdzIEVPUy4KKyAgICAvLyBlbHNlIGl0J3MgYSB0YWcgZm9yIHJlLW9wZW5pbmcgYXVkaW8gc2luayBpbiBkaWZmZXJlbnQgZm9ybWF0LgorICAgIHN0cnVjdCBRdWV1ZUVudHJ5IHsKKyAgICAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gbUJ1ZmZlcjsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1NZXRhOworICAgICAgICBzcDxBTWVzc2FnZT4gbU5vdGlmeUNvbnN1bWVkOworICAgICAgICBzaXplX3QgbU9mZnNldDsKKyAgICAgICAgc3RhdHVzX3QgbUZpbmFsUmVzdWx0OworICAgICAgICBpbnQzMl90IG1CdWZmZXJPcmRpbmFsOworICAgIH07CisKKyAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrTWluUG9zaXRpb25VcGRhdGVEZWxheVVzOworCisgICAgc3A8TWVkaWFQbGF5ZXIyQmFzZTo6QXVkaW9TaW5rPiBtQXVkaW9TaW5rOworICAgIGJvb2wgbVVzZVZpcnR1YWxBdWRpb1Npbms7CisgICAgc3A8QU1lc3NhZ2U+IG1Ob3RpZnk7CisgICAgTXV0ZXggbUxvY2s7CisgICAgdWludDMyX3QgbUZsYWdzOworICAgIExpc3Q8UXVldWVFbnRyeT4gbUF1ZGlvUXVldWU7CisgICAgTGlzdDxRdWV1ZUVudHJ5PiBtVmlkZW9RdWV1ZTsKKyAgICB1aW50MzJfdCBtTnVtRnJhbWVzV3JpdHRlbjsKKyAgICBzcDxWaWRlb0ZyYW1lU2NoZWR1bGVyPiBtVmlkZW9TY2hlZHVsZXI7CisKKyAgICBib29sIG1EcmFpbkF1ZGlvUXVldWVQZW5kaW5nOworICAgIGJvb2wgbURyYWluVmlkZW9RdWV1ZVBlbmRpbmc7CisgICAgaW50MzJfdCBtQXVkaW9RdWV1ZUdlbmVyYXRpb247CisgICAgaW50MzJfdCBtVmlkZW9RdWV1ZUdlbmVyYXRpb247CisgICAgaW50MzJfdCBtQXVkaW9EcmFpbkdlbmVyYXRpb247CisgICAgaW50MzJfdCBtVmlkZW9EcmFpbkdlbmVyYXRpb247CisgICAgaW50MzJfdCBtQXVkaW9FT1NHZW5lcmF0aW9uOworCisgICAgY29uc3Qgc3A8TWVkaWFDbG9jaz4gbU1lZGlhQ2xvY2s7CisgICAgZmxvYXQgbVBsYXliYWNrUmF0ZTsgLy8gYXVkaW8gdHJhY2sgcmF0ZQorCisgICAgQXVkaW9QbGF5YmFja1JhdGUgbVBsYXliYWNrU2V0dGluZ3M7CisgICAgQVZTeW5jU2V0dGluZ3MgbVN5bmNTZXR0aW5nczsKKyAgICBmbG9hdCBtVmlkZW9GcHNIaW50OworCisgICAgaW50NjRfdCBtQXVkaW9GaXJzdEFuY2hvclRpbWVNZWRpYVVzOworICAgIGludDY0X3QgbUFuY2hvclRpbWVNZWRpYVVzOworICAgIGludDY0X3QgbUFuY2hvck51bUZyYW1lc1dyaXR0ZW47CisgICAgaW50NjRfdCBtVmlkZW9MYXRlQnlVczsKKyAgICBpbnQ2NF90IG1OZXh0VmlkZW9UaW1lTWVkaWFVczsKKyAgICBib29sIG1IYXNBdWRpbzsKKyAgICBib29sIG1IYXNWaWRlbzsKKworICAgIGJvb2wgbU5vdGlmeUNvbXBsZXRlQXVkaW87CisgICAgYm9vbCBtTm90aWZ5Q29tcGxldGVWaWRlbzsKKworICAgIGJvb2wgbVN5bmNRdWV1ZXM7CisKKyAgICAvLyBtb2RpZmllZCBvbiBvbmx5IHJlbmRlcmVyJ3MgdGhyZWFkLgorICAgIGJvb2wgbVBhdXNlZDsKKyAgICBpbnQ2NF90IG1QYXVzZURyYWluQXVkaW9BbGxvd2VkVXM7IC8vIHRpbWUgd2hlbiB3ZSBjYW4gZHJhaW4vZGVsaXZlciBhdWRpbyBpbiBwYXVzZSBtb2RlLgorCisgICAgYm9vbCBtVmlkZW9TYW1wbGVSZWNlaXZlZDsKKyAgICBib29sIG1WaWRlb1JlbmRlcmluZ1N0YXJ0ZWQ7CisgICAgaW50MzJfdCBtVmlkZW9SZW5kZXJpbmdTdGFydEdlbmVyYXRpb247CisgICAgaW50MzJfdCBtQXVkaW9SZW5kZXJpbmdTdGFydEdlbmVyYXRpb247CisgICAgYm9vbCBtUmVuZGVyaW5nRGF0YURlbGl2ZXJlZDsKKworICAgIGludDY0X3QgbU5leHRBdWRpb0Nsb2NrVXBkYXRlVGltZVVzOworICAgIC8vIHRoZSBtZWRpYSB0aW1lc3RhbXAgb2YgbGFzdCBhdWRpbyBzYW1wbGUgcmlnaHQgYmVmb3JlIEVPUy4KKyAgICBpbnQ2NF90IG1MYXN0QXVkaW9NZWRpYVRpbWVVczsKKworICAgIGludDMyX3QgbUF1ZGlvT2ZmbG9hZFBhdXNlVGltZW91dEdlbmVyYXRpb247CisgICAgYm9vbCBtQXVkaW9Ub3JuRG93bjsKKyAgICBhdWRpb19vZmZsb2FkX2luZm9fdCBtQ3VycmVudE9mZmxvYWRJbmZvOworCisgICAgc3RydWN0IFBjbUluZm8geworICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBtQ2hhbm5lbE1hc2s7CisgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IG1GbGFnczsKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgbUZvcm1hdDsKKyAgICAgICAgaW50MzJfdCBtTnVtQ2hhbm5lbHM7CisgICAgICAgIGludDMyX3QgbVNhbXBsZVJhdGU7CisgICAgfTsKKyAgICBQY21JbmZvIG1DdXJyZW50UGNtSW5mbzsKKyAgICBzdGF0aWMgY29uc3QgUGNtSW5mbyBBVURJT19QQ01JTkZPX0lOSVRJQUxJWkVSOworCisgICAgaW50MzJfdCBtVG90YWxCdWZmZXJzUXVldWVkOworICAgIGludDMyX3QgbUxhc3RBdWRpb0J1ZmZlckRyYWluZWQ7CisgICAgYm9vbCBtVXNlQXVkaW9DYWxsYmFjazsKKworICAgIHNwPEpXYWtlTG9jaz4gbVdha2VMb2NrOworCisgICAgc3RhdHVzX3QgZ2V0Q3VycmVudFBvc2l0aW9uT25Mb29wZXIoaW50NjRfdCAqbWVkaWFVcyk7CisgICAgc3RhdHVzX3QgZ2V0Q3VycmVudFBvc2l0aW9uT25Mb29wZXIoCisgICAgICAgICAgICBpbnQ2NF90ICptZWRpYVVzLCBpbnQ2NF90IG5vd1VzLCBib29sIGFsbG93UGFzdFF1ZXVlZFZpZGVvID0gZmFsc2UpOworICAgIGJvb2wgZ2V0Q3VycmVudFBvc2l0aW9uSWZQYXVzZWRfbChpbnQ2NF90ICptZWRpYVVzKTsKKyAgICBzdGF0dXNfdCBnZXRDdXJyZW50UG9zaXRpb25Gcm9tQW5jaG9yKAorICAgICAgICAgICAgaW50NjRfdCAqbWVkaWFVcywgaW50NjRfdCBub3dVcywgYm9vbCBhbGxvd1Bhc3RRdWV1ZWRWaWRlbyA9IGZhbHNlKTsKKworICAgIHZvaWQgbm90aWZ5RU9TQ2FsbGJhY2soKTsKKyAgICBzaXplX3QgZmlsbEF1ZGlvQnVmZmVyKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpOworCisgICAgYm9vbCBvbkRyYWluQXVkaW9RdWV1ZSgpOworICAgIHZvaWQgZHJhaW5BdWRpb1F1ZXVlVW50aWxMYXN0RU9TKCk7CisgICAgaW50NjRfdCBnZXRQZW5kaW5nQXVkaW9QbGF5b3V0RHVyYXRpb25VcyhpbnQ2NF90IG5vd1VzKTsKKyAgICB2b2lkIHBvc3REcmFpbkF1ZGlvUXVldWVfbChpbnQ2NF90IGRlbGF5VXMgPSAwKTsKKworICAgIHZvaWQgY2xlYXJBbmNob3JUaW1lKCk7CisgICAgdm9pZCBjbGVhckF1ZGlvRmlyc3RBbmNob3JUaW1lX2woKTsKKyAgICB2b2lkIHNldEF1ZGlvRmlyc3RBbmNob3JUaW1lSWZOZWVkZWRfbChpbnQ2NF90IG1lZGlhVXMpOworICAgIHZvaWQgc2V0VmlkZW9MYXRlQnlVcyhpbnQ2NF90IGxhdGVVcyk7CisKKyAgICB2b2lkIG9uTmV3QXVkaW9NZWRpYVRpbWUoaW50NjRfdCBtZWRpYVRpbWVVcyk7CisgICAgaW50NjRfdCBnZXRSZWFsVGltZVVzKGludDY0X3QgbWVkaWFUaW1lVXMsIGludDY0X3Qgbm93VXMpOworCisgICAgdm9pZCBvbkRyYWluVmlkZW9RdWV1ZSgpOworICAgIHZvaWQgcG9zdERyYWluVmlkZW9RdWV1ZSgpOworCisgICAgdm9pZCBwcmVwYXJlRm9yTWVkaWFSZW5kZXJpbmdTdGFydF9sKCk7CisgICAgdm9pZCBub3RpZnlJZk1lZGlhUmVuZGVyaW5nU3RhcnRlZF9sKCk7CisKKyAgICB2b2lkIG9uUXVldWVCdWZmZXIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHZvaWQgb25RdWV1ZUVPUyhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdm9pZCBvbkZsdXNoKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2b2lkIG9uQXVkaW9TaW5rQ2hhbmdlZCgpOworICAgIHZvaWQgb25EaXNhYmxlT2ZmbG9hZEF1ZGlvKCk7CisgICAgdm9pZCBvbkVuYWJsZU9mZmxvYWRBdWRpbygpOworICAgIHN0YXR1c190IG9uQ29uZmlnUGxheWJhY2soY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnJhdGUgLyogc2FuaXRpemVkICovKTsKKyAgICBzdGF0dXNfdCBvbkdldFBsYXliYWNrU2V0dGluZ3MoQXVkaW9QbGF5YmFja1JhdGUgKnJhdGUgLyogbm9ubnVsbCAqLyk7CisgICAgc3RhdHVzX3Qgb25Db25maWdTeW5jKGNvbnN0IEFWU3luY1NldHRpbmdzICZzeW5jLCBmbG9hdCB2aWRlb0Zwc0hpbnQpOworICAgIHN0YXR1c190IG9uR2V0U3luY1NldHRpbmdzKEFWU3luY1NldHRpbmdzICpzeW5jIC8qIG5vbm51bGwgKi8sIGZsb2F0ICp2aWRlb0ZwcyAvKiBub25udWxsICovKTsKKworICAgIHZvaWQgb25QYXVzZSgpOworICAgIHZvaWQgb25SZXN1bWUoKTsKKyAgICB2b2lkIG9uU2V0VmlkZW9GcmFtZVJhdGUoZmxvYXQgZnBzKTsKKyAgICBpbnQzMl90IGdldFF1ZXVlR2VuZXJhdGlvbihib29sIGF1ZGlvKTsKKyAgICBpbnQzMl90IGdldERyYWluR2VuZXJhdGlvbihib29sIGF1ZGlvKTsKKyAgICBib29sIGdldFN5bmNRdWV1ZXMoKTsKKyAgICB2b2lkIG9uQXVkaW9UZWFyRG93bihBdWRpb1RlYXJEb3duUmVhc29uIHJlYXNvbik7CisgICAgc3RhdHVzX3Qgb25PcGVuQXVkaW9TaW5rKAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgICAgICBib29sIG9mZmxvYWRPbmx5LAorICAgICAgICAgICAgYm9vbCBoYXNWaWRlbywKKyAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLAorICAgICAgICAgICAgYm9vbCBpc1N0cmVhbWluZyk7CisgICAgdm9pZCBvbkNsb3NlQXVkaW9TaW5rKCk7CisgICAgdm9pZCBvbkNoYW5nZUF1ZGlvRm9ybWF0KGNvbnN0IHNwPEFNZXNzYWdlPiAmbWV0YSwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpOworCisgICAgdm9pZCBub3RpZnlFT1MoYm9vbCBhdWRpbywgc3RhdHVzX3QgZmluYWxSZXN1bHQsIGludDY0X3QgZGVsYXlVcyA9IDApOworICAgIHZvaWQgbm90aWZ5RU9TX2woYm9vbCBhdWRpbywgc3RhdHVzX3QgZmluYWxSZXN1bHQsIGludDY0X3QgZGVsYXlVcyA9IDApOworICAgIHZvaWQgbm90aWZ5Rmx1c2hDb21wbGV0ZShib29sIGF1ZGlvKTsKKyAgICB2b2lkIG5vdGlmeVBvc2l0aW9uKCk7CisgICAgdm9pZCBub3RpZnlWaWRlb0xhdGVCeShpbnQ2NF90IGxhdGVCeVVzKTsKKyAgICB2b2lkIG5vdGlmeVZpZGVvUmVuZGVyaW5nU3RhcnQoKTsKKyAgICB2b2lkIG5vdGlmeUF1ZGlvVGVhckRvd24oQXVkaW9UZWFyRG93blJlYXNvbiByZWFzb24pOworCisgICAgdm9pZCBmbHVzaFF1ZXVlKExpc3Q8UXVldWVFbnRyeT4gKnF1ZXVlKTsKKyAgICBib29sIGRyb3BCdWZmZXJJZlN0YWxlKGJvb2wgYXVkaW8sIGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2b2lkIHN5bmNRdWV1ZXNEb25lX2woKTsKKworICAgIGJvb2wgb2ZmbG9hZGluZ0F1ZGlvKCkgY29uc3QgeyByZXR1cm4gKG1GbGFncyAmIEZMQUdfT0ZGTE9BRF9BVURJTykgIT0gMDsgfQorCisgICAgdm9pZCBzdGFydEF1ZGlvT2ZmbG9hZFBhdXNlVGltZW91dCgpOworICAgIHZvaWQgY2FuY2VsQXVkaW9PZmZsb2FkUGF1c2VUaW1lb3V0KCk7CisKKyAgICBpbnQ2NF90IGdldER1cmF0aW9uVXNJZlBsYXllZEF0U2FtcGxlUmF0ZSh1aW50MzJfdCBudW1GcmFtZXMpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUmVuZGVyZXIpOworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE5VUExBWUVSMl9SRU5ERVJFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvbnVwbGF5ZXIyL051UGxheWVyMlNvdXJjZS5oIGIvbWVkaWEvbGlibWVkaWEvbnVwbGF5ZXIyL051UGxheWVyMlNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZGVkOWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9udXBsYXllcjIvTnVQbGF5ZXIyU291cmNlLmgKQEAgLTAsMCArMSwxNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTlVQTEFZRVIyX1NPVVJDRV9IXworCisjZGVmaW5lIE5VUExBWUVSMl9TT1VSQ0VfSF8KKworI2luY2x1ZGUgIk51UGxheWVyMi5oIgorCisjaW5jbHVkZSA8bWVkaWEvbWVkaWFwbGF5ZXIyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEFCdWZmZXI7CitzdHJ1Y3QgQU1lZGlhQ3J5cHRvV3JhcHBlcjsKK2NsYXNzIE1lZGlhQnVmZmVyOworCitzdHJ1Y3QgTnVQbGF5ZXIyOjpTb3VyY2UgOiBwdWJsaWMgQUhhbmRsZXIgeworICAgIGVudW0gRmxhZ3MgeworICAgICAgICBGTEFHX0NBTl9QQVVTRSAgICAgICAgICA9IDEsCisgICAgICAgIEZMQUdfQ0FOX1NFRUtfQkFDS1dBUkQgID0gMiwgIC8vIHRoZSAiMTAgc2VjIGJhY2sgYnV0dG9uIgorICAgICAgICBGTEFHX0NBTl9TRUVLX0ZPUldBUkQgICA9IDQsICAvLyB0aGUgIjEwIHNlYyBmb3J3YXJkIGJ1dHRvbiIKKyAgICAgICAgRkxBR19DQU5fU0VFSyAgICAgICAgICAgPSA4LCAgLy8gdGhlICJzZWVrIGJhciIKKyAgICAgICAgRkxBR19EWU5BTUlDX0RVUkFUSU9OICAgPSAxNiwKKyAgICAgICAgRkxBR19TRUNVUkUgICAgICAgICAgICAgPSAzMiwgLy8gU2VjdXJlIGNvZGVjIGlzIHJlcXVpcmVkLgorICAgICAgICBGTEFHX1BST1RFQ1RFRCAgICAgICAgICA9IDY0LCAvLyBUaGUgc2NyZWVuIG5lZWRzIHRvIGJlIHByb3RlY3RlZCAoc2NyZWVuc2hvdCBpcyBkaXNhYmxlZCkuCisgICAgfTsKKworICAgIGVudW0geworICAgICAgICBrV2hhdFByZXBhcmVkLAorICAgICAgICBrV2hhdEZsYWdzQ2hhbmdlZCwKKyAgICAgICAga1doYXRWaWRlb1NpemVDaGFuZ2VkLAorICAgICAgICBrV2hhdEJ1ZmZlcmluZ1VwZGF0ZSwKKyAgICAgICAga1doYXRQYXVzZU9uQnVmZmVyaW5nU3RhcnQsCisgICAgICAgIGtXaGF0UmVzdW1lT25CdWZmZXJpbmdFbmQsCisgICAgICAgIGtXaGF0Q2FjaGVTdGF0cywKKyAgICAgICAga1doYXRTdWJ0aXRsZURhdGEsCisgICAgICAgIGtXaGF0VGltZWRUZXh0RGF0YSwKKyAgICAgICAga1doYXRUaW1lZE1ldGFEYXRhLAorICAgICAgICBrV2hhdFF1ZXVlRGVjb2RlclNodXRkb3duLAorICAgICAgICBrV2hhdERybU5vTGljZW5zZSwKKyAgICAgICAga1doYXRJbnN0YW50aWF0ZVNlY3VyZURlY29kZXJzLAorICAgICAgICAvLyBNb2R1bGFyIERSTQorICAgICAgICBrV2hhdERybUluZm8sCisgICAgfTsKKworICAgIC8vIFRoZSBwcm92aWRlcyBtZXNzYWdlIGlzIHVzZWQgdG8gbm90aWZ5IHRoZSBwbGF5ZXIgYWJvdXQgdmFyaW91cworICAgIC8vIGV2ZW50cy4KKyAgICBleHBsaWNpdCBTb3VyY2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpCisgICAgICAgIDogbU5vdGlmeShub3RpZnkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEJ1ZmZlcmluZ1NldHRpbmdzKAorICAgICAgICAgICAgQnVmZmVyaW5nU2V0dGluZ3MqIGJ1ZmZlcmluZyAvKiBub25udWxsICovKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRCdWZmZXJpbmdTZXR0aW5ncyhjb25zdCBCdWZmZXJpbmdTZXR0aW5ncyYgYnVmZmVyaW5nKSA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgcHJlcGFyZUFzeW5jKCkgPSAwOworCisgICAgdmlydHVhbCB2b2lkIHN0YXJ0KCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBzdG9wKCkge30KKyAgICB2aXJ0dWFsIHZvaWQgcGF1c2UoKSB7fQorICAgIHZpcnR1YWwgdm9pZCByZXN1bWUoKSB7fQorCisgICAgLy8gRXhwbGljaXRseSBkaXNjb25uZWN0IHRoZSB1bmRlcmxpbmcgZGF0YSBzb3VyY2UKKyAgICB2aXJ0dWFsIHZvaWQgZGlzY29ubmVjdCgpIHt9CisKKyAgICAvLyBSZXR1cm5zIE9LIGlmZiBtb3JlIGRhdGEgd2FzIGF2YWlsYWJsZSwKKyAgICAvLyBhbiBlcnJvciBvciBFUlJPUl9FTkRfT0ZfU1RSRUFNIGlmIG5vdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGZlZWRNb3JlVFNEYXRhKCkgPSAwOworCisgICAgLy8gUmV0dXJucyBub24tTlVMTCBmb3JtYXQgd2hlbiB0aGUgc3BlY2lmaWVkIHRyYWNrIGV4aXN0cy4KKyAgICAvLyBXaGVuIHRoZSBmb3JtYXQgaGFzICJlcnIiIHNldCB0byAtRVdPVUxEQkxPQ0ssIHNvdXJjZSBuZWVkcyBtb3JlIHRpbWUgdG8gZ2V0IHZhbGlkIG1ldGEgZGF0YS4KKyAgICAvLyBSZXR1cm5zIE5VTEwgaWYgdGhlIHNwZWNpZmllZCB0cmFjayBkb2Vzbid0IGV4aXN0IG9yIGlzIGludmFsaWQ7CisgICAgdmlydHVhbCBzcDxBTWVzc2FnZT4gZ2V0Rm9ybWF0KGJvb2wgYXVkaW8pOworCisgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0TWV0YShib29sIC8qIGF1ZGlvICovKSB7IHJldHVybiBOVUxMOyB9CisgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0RmlsZUZvcm1hdE1ldGEoKSBjb25zdCB7IHJldHVybiBOVUxMOyB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGRlcXVldWVBY2Nlc3NVbml0KAorICAgICAgICAgICAgYm9vbCBhdWRpbywgc3A8QUJ1ZmZlcj4gKmFjY2Vzc1VuaXQpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RHVyYXRpb24oaW50NjRfdCAqIC8qIGR1cmF0aW9uVXMgKi8pIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHZpcnR1YWwgc2l6ZV90IGdldFRyYWNrQ291bnQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHZpcnR1YWwgc3A8QU1lc3NhZ2U+IGdldFRyYWNrSW5mbyhzaXplX3QgLyogdHJhY2tJbmRleCAqLykgY29uc3QgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHNzaXplX3QgZ2V0U2VsZWN0ZWRUcmFjayhtZWRpYV90cmFja190eXBlIC8qIHR5cGUgKi8pIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2VsZWN0VHJhY2soc2l6ZV90IC8qIHRyYWNrSW5kZXggKi8sIGJvb2wgLyogc2VsZWN0ICovLCBpbnQ2NF90IC8qIHRpbWVVcyovKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNlZWtUbygKKyAgICAgICAgICAgIGludDY0X3QgLyogc2Vla1RpbWVVcyAqLywKKyAgICAgICAgICAgIE1lZGlhUGxheWVyMlNlZWtNb2RlIC8qIG1vZGUgKi8gPSBNZWRpYVBsYXllcjJTZWVrTW9kZTo6U0VFS19QUkVWSU9VU19TWU5DKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgaXNSZWFsVGltZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBpc1N0cmVhbWluZygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHNldE9mZmxvYWRBdWRpbyhib29sIC8qIG9mZmxvYWQgKi8pIHt9CisKKyAgICAvLyBNb2R1bGFyIERSTQorICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJlcGFyZURybSgKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgLyogdXVpZCAqL1sxNl0sIGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmIC8qIGRybVNlc3Npb25JZCAqLywKKyAgICAgICAgICAgIHNwPEFNZWRpYUNyeXB0b1dyYXBwZXI+ICogLyogY3J5cHRvICovKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VEcm0oKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5Tb3VyY2UoKSB7fQorCisgICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKworICAgIHNwPEFNZXNzYWdlPiBkdXBOb3RpZnkoKSBjb25zdCB7IHJldHVybiBtTm90aWZ5LT5kdXAoKTsgfQorCisgICAgdm9pZCBub3RpZnlGbGFnc0NoYW5nZWQodWludDMyX3QgZmxhZ3MpOworICAgIHZvaWQgbm90aWZ5VmlkZW9TaXplQ2hhbmdlZChjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCA9IE5VTEwpOworICAgIHZvaWQgbm90aWZ5SW5zdGFudGlhdGVTZWN1cmVEZWNvZGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJnJlcGx5KTsKKyAgICB2b2lkIG5vdGlmeVByZXBhcmVkKHN0YXR1c190IGVyciA9IE9LKTsKKyAgICAvLyBNb2R1bGFyIERSTQorICAgIHZvaWQgbm90aWZ5RHJtSW5mbyhjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKKworcHJpdmF0ZToKKyAgICBzcDxBTWVzc2FnZT4gbU5vdGlmeTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNvdXJjZSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE5VUExBWUVSMl9TT1VSQ0VfSF8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvbnVwbGF5ZXIyL051UGxheWVyMlN0cmVhbUxpc3RlbmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL251cGxheWVyMi9OdVBsYXllcjJTdHJlYW1MaXN0ZW5lci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc2OTcxMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL251cGxheWVyMi9OdVBsYXllcjJTdHJlYW1MaXN0ZW5lci5jcHAKQEAgLTAsMCArMSwxNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTnVQbGF5ZXIyU3RyZWFtTGlzdGVuZXIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJOdVBsYXllcjJTdHJlYW1MaXN0ZW5lci5oIgorCisjaW5jbHVkZSA8YmluZGVyL01lbW9yeURlYWxlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworTnVQbGF5ZXIyOjpTdHJlYW1MaXN0ZW5lcjo6U3RyZWFtTGlzdGVuZXIoCisgICAgICAgIGNvbnN0IHNwPElTdHJlYW1Tb3VyY2U+ICZzb3VyY2UsCisgICAgICAgIGNvbnN0IHNwPEFIYW5kbGVyPiAmdGFyZ2V0SGFuZGxlcikKKyAgICA6IG1Tb3VyY2Uoc291cmNlKSwKKyAgICAgIG1UYXJnZXRIYW5kbGVyKHRhcmdldEhhbmRsZXIpLAorICAgICAgbUVPUyhmYWxzZSksCisgICAgICBtU2VuZERhdGFOb3RpZmljYXRpb24odHJ1ZSkgeworICAgIG1Tb3VyY2UtPnNldExpc3RlbmVyKHRoaXMpOworCisgICAgbU1lbW9yeURlYWxlciA9IG5ldyBNZW1vcnlEZWFsZXIoa051bUJ1ZmZlcnMgKiBrQnVmZmVyU2l6ZSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTnVtQnVmZmVyczsgKytpKSB7CisgICAgICAgIHNwPElNZW1vcnk+IG1lbSA9IG1NZW1vcnlEZWFsZXItPmFsbG9jYXRlKGtCdWZmZXJTaXplKTsKKyAgICAgICAgQ0hFQ0sobWVtICE9IE5VTEwpOworCisgICAgICAgIG1CdWZmZXJzLnB1c2gobWVtKTsKKyAgICB9CisgICAgbVNvdXJjZS0+c2V0QnVmZmVycyhtQnVmZmVycyk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpTdHJlYW1MaXN0ZW5lcjo6c3RhcnQoKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTnVtQnVmZmVyczsgKytpKSB7CisgICAgICAgIG1Tb3VyY2UtPm9uQnVmZmVyQXZhaWxhYmxlKGkpOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjI6OlN0cmVhbUxpc3RlbmVyOjpxdWV1ZUJ1ZmZlcihzaXplX3QgaW5kZXgsIHNpemVfdCBzaXplKSB7CisgICAgUXVldWVFbnRyeSBlbnRyeTsKKyAgICBlbnRyeS5tSXNDb21tYW5kID0gZmFsc2U7CisgICAgZW50cnkubUluZGV4ID0gaW5kZXg7CisgICAgZW50cnkubVNpemUgPSBzaXplOworICAgIGVudHJ5Lm1PZmZzZXQgPSAwOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBtUXVldWUucHVzaF9iYWNrKGVudHJ5KTsKKworICAgIGlmIChtU2VuZERhdGFOb3RpZmljYXRpb24pIHsKKyAgICAgICAgbVNlbmREYXRhTm90aWZpY2F0aW9uID0gZmFsc2U7CisKKyAgICAgICAgaWYgKG1UYXJnZXRIYW5kbGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRNb3JlRGF0YVF1ZXVlZCwgbVRhcmdldEhhbmRsZXIpKS0+cG9zdCgpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIE51UGxheWVyMjo6U3RyZWFtTGlzdGVuZXI6Omlzc3VlQ29tbWFuZCgKKyAgICAgICAgQ29tbWFuZCBjbWQsIGJvb2wgc3luY2hyb25vdXMsIGNvbnN0IHNwPEFNZXNzYWdlPiAmZXh0cmEpIHsKKyAgICBDSEVDSyghc3luY2hyb25vdXMpOworCisgICAgUXVldWVFbnRyeSBlbnRyeTsKKyAgICBlbnRyeS5tSXNDb21tYW5kID0gdHJ1ZTsKKyAgICBlbnRyeS5tQ29tbWFuZCA9IGNtZDsKKyAgICBlbnRyeS5tRXh0cmEgPSBleHRyYTsKKworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgbVF1ZXVlLnB1c2hfYmFjayhlbnRyeSk7CisKKyAgICBpZiAobVNlbmREYXRhTm90aWZpY2F0aW9uKSB7CisgICAgICAgIG1TZW5kRGF0YU5vdGlmaWNhdGlvbiA9IGZhbHNlOworCisgICAgICAgIGlmIChtVGFyZ2V0SGFuZGxlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAobmV3IEFNZXNzYWdlKGtXaGF0TW9yZURhdGFRdWV1ZWQsIG1UYXJnZXRIYW5kbGVyKSktPnBvc3QoKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3NpemVfdCBOdVBsYXllcjI6OlN0cmVhbUxpc3RlbmVyOjpyZWFkKAorICAgICAgICB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgc3A8QU1lc3NhZ2U+ICpleHRyYSkgeworICAgIENIRUNLX0dUKHNpemUsIDB1KTsKKworICAgIGV4dHJhLT5jbGVhcigpOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChtRU9TKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmIChtUXVldWUuZW1wdHkoKSkgeworICAgICAgICBtU2VuZERhdGFOb3RpZmljYXRpb24gPSB0cnVlOworCisgICAgICAgIHJldHVybiAtRVdPVUxEQkxPQ0s7CisgICAgfQorCisgICAgUXVldWVFbnRyeSAqZW50cnkgPSAmKm1RdWV1ZS5iZWdpbigpOworCisgICAgaWYgKGVudHJ5LT5tSXNDb21tYW5kKSB7CisgICAgICAgIHN3aXRjaCAoZW50cnktPm1Db21tYW5kKSB7CisgICAgICAgICAgICBjYXNlIEVPUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtUXVldWUuZXJhc2UobVF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgICAgIGVudHJ5ID0gTlVMTDsKKworICAgICAgICAgICAgICAgIG1FT1MgPSB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIERJU0NPTlRJTlVJVFk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKmV4dHJhID0gZW50cnktPm1FeHRyYTsKKworICAgICAgICAgICAgICAgIG1RdWV1ZS5lcmFzZShtUXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICAgICAgZW50cnkgPSBOVUxMOworCisgICAgICAgICAgICAgICAgcmV0dXJuIElORk9fRElTQ09OVElOVUlUWTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBUUkVTUEFTUygpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgc2l6ZV90IGNvcHkgPSBlbnRyeS0+bVNpemU7CisgICAgaWYgKGNvcHkgPiBzaXplKSB7CisgICAgICAgIGNvcHkgPSBzaXplOworICAgIH0KKworICAgIGlmIChlbnRyeS0+bUluZGV4ID49IG1CdWZmZXJzLnNpemUoKSkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIHNwPElNZW1vcnk+IG1lbSA9IG1CdWZmZXJzLmVkaXRJdGVtQXQoZW50cnktPm1JbmRleCk7CisgICAgaWYgKG1lbSA9PSBOVUxMIHx8IG1lbS0+c2l6ZSgpIDwgY29weSB8fCBtZW0tPnNpemUoKSAtIGNvcHkgPCBlbnRyeS0+bU9mZnNldCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIG1lbWNweShkYXRhLAorICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKW1lbS0+cG9pbnRlcigpCisgICAgICAgICAgICArIGVudHJ5LT5tT2Zmc2V0LAorICAgICAgICAgICBjb3B5KTsKKworICAgIGVudHJ5LT5tT2Zmc2V0ICs9IGNvcHk7CisgICAgZW50cnktPm1TaXplIC09IGNvcHk7CisKKyAgICBpZiAoZW50cnktPm1TaXplID09IDApIHsKKyAgICAgICAgbVNvdXJjZS0+b25CdWZmZXJBdmFpbGFibGUoZW50cnktPm1JbmRleCk7CisgICAgICAgIG1RdWV1ZS5lcmFzZShtUXVldWUuYmVnaW4oKSk7CisgICAgICAgIGVudHJ5ID0gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gY29weTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL251cGxheWVyMi9OdVBsYXllcjJTdHJlYW1MaXN0ZW5lci5oIGIvbWVkaWEvbGlibWVkaWEvbnVwbGF5ZXIyL051UGxheWVyMlN0cmVhbUxpc3RlbmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMyN2IyNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL251cGxheWVyMi9OdVBsYXllcjJTdHJlYW1MaXN0ZW5lci5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTlVQTEFZRVIyX1NUUkVBTV9MSVNURU5FUl9IXworCisjZGVmaW5lIE5VUExBWUVSMl9TVFJFQU1fTElTVEVORVJfSF8KKworI2luY2x1ZGUgIk51UGxheWVyMi5oIgorCisjaW5jbHVkZSA8bWVkaWEvSVN0cmVhbVNvdXJjZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE1lbW9yeURlYWxlcjsKKworc3RydWN0IE51UGxheWVyMjo6U3RyZWFtTGlzdGVuZXIgOiBwdWJsaWMgQm5TdHJlYW1MaXN0ZW5lciB7CisgICAgU3RyZWFtTGlzdGVuZXIoCisgICAgICAgICAgICBjb25zdCBzcDxJU3RyZWFtU291cmNlPiAmc291cmNlLAorICAgICAgICAgICAgY29uc3Qgc3A8QUhhbmRsZXI+ICZ0YXJnZXRIYW5kbGVyKTsKKworICAgIHZpcnR1YWwgdm9pZCBxdWV1ZUJ1ZmZlcihzaXplX3QgaW5kZXgsIHNpemVfdCBzaXplKTsKKworICAgIHZpcnR1YWwgdm9pZCBpc3N1ZUNvbW1hbmQoCisgICAgICAgICAgICBDb21tYW5kIGNtZCwgYm9vbCBzeW5jaHJvbm91cywgY29uc3Qgc3A8QU1lc3NhZ2U+ICZleHRyYSk7CisKKyAgICB2b2lkIHN0YXJ0KCk7CisgICAgc3NpemVfdCByZWFkKHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCBzcDxBTWVzc2FnZT4gKmV4dHJhKTsKKworcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAga051bUJ1ZmZlcnMgPSA4LAorICAgICAgICBrQnVmZmVyU2l6ZSA9IDE4OCAqIDEwCisgICAgfTsKKworICAgIHN0cnVjdCBRdWV1ZUVudHJ5IHsKKyAgICAgICAgYm9vbCBtSXNDb21tYW5kOworCisgICAgICAgIHNpemVfdCBtSW5kZXg7CisgICAgICAgIHNpemVfdCBtU2l6ZTsKKyAgICAgICAgc2l6ZV90IG1PZmZzZXQ7CisKKyAgICAgICAgQ29tbWFuZCBtQ29tbWFuZDsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1FeHRyYTsKKyAgICB9OworCisgICAgTXV0ZXggbUxvY2s7CisKKyAgICBzcDxJU3RyZWFtU291cmNlPiBtU291cmNlOworICAgIHNwPEFIYW5kbGVyPiBtVGFyZ2V0SGFuZGxlcjsKKyAgICBzcDxNZW1vcnlEZWFsZXI+IG1NZW1vcnlEZWFsZXI7CisgICAgVmVjdG9yPHNwPElNZW1vcnk+ID4gbUJ1ZmZlcnM7CisgICAgTGlzdDxRdWV1ZUVudHJ5PiBtUXVldWU7CisgICAgYm9vbCBtRU9TOworICAgIGJvb2wgbVNlbmREYXRhTm90aWZpY2F0aW9uOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU3RyZWFtTGlzdGVuZXIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIE5VUExBWUVSMl9TVFJFQU1fTElTVEVORVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL251cGxheWVyMi9SVFNQU291cmNlLmNwcCBiL21lZGlhL2xpYm1lZGlhL251cGxheWVyMi9SVFNQU291cmNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjY5NjZkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvbnVwbGF5ZXIyL1JUU1BTb3VyY2UuY3BwCkBAIC0wLDAgKzEsOTA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJSVFNQU291cmNlIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiUlRTUFNvdXJjZS5oIgorCisjaW5jbHVkZSAiQW5vdGhlclBhY2tldFNvdXJjZS5oIgorI2luY2x1ZGUgIk15SGFuZGxlci5oIgorI2luY2x1ZGUgIlNEUExvYWRlci5oIgorCisjaW5jbHVkZSA8bWVkaWEvTWVkaWFIVFRQU2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY29uc3QgaW50NjRfdCBrTmVhckVPU1RpbWVvdXRVcyA9IDIwMDAwMDBsbDsgLy8gMiBzZWNzCisKKy8vIERlZmF1bHQgQnVmZmVyIFVuZGVyZmxvdy9QcmVwYXJlL1N0YXJ0U2VydmVyL092ZXJmbG93IE1hcmtzCitzdGF0aWMgY29uc3QgaW50IGtVbmRlcmZsb3dNYXJrTXMgICA9ICAxMDAwOyAgLy8gMSBzZWNvbmQKK3N0YXRpYyBjb25zdCBpbnQga1ByZXBhcmVNYXJrTXMgICAgID0gIDMwMDA7ICAvLyAzIHNlY29uZHMKKy8vc3RhdGljIGNvbnN0IGludCBrU3RhcnRTZXJ2ZXJNYXJrTXMgPSAgNTAwMDsKK3N0YXRpYyBjb25zdCBpbnQga092ZXJmbG93TWFya01zICAgID0gMTAwMDA7ICAvLyAxMCBzZWNvbmRzCisKK051UGxheWVyMjo6UlRTUFNvdXJjZTo6UlRTUFNvdXJjZSgKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCisgICAgICAgIGNvbnN0IHNwPE1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgY29uc3QgY2hhciAqdXJsLAorICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycywKKyAgICAgICAgYm9vbCB1aWRWYWxpZCwKKyAgICAgICAgdWlkX3QgdWlkLAorICAgICAgICBib29sIGlzU0RQKQorICAgIDogU291cmNlKG5vdGlmeSksCisgICAgICBtSFRUUFNlcnZpY2UoaHR0cFNlcnZpY2UpLAorICAgICAgbVVSTCh1cmwpLAorICAgICAgbVVJRFZhbGlkKHVpZFZhbGlkKSwKKyAgICAgIG1VSUQodWlkKSwKKyAgICAgIG1GbGFncygwKSwKKyAgICAgIG1Jc1NEUChpc1NEUCksCisgICAgICBtU3RhdGUoRElTQ09OTkVDVEVEKSwKKyAgICAgIG1GaW5hbFJlc3VsdChPSyksCisgICAgICBtRGlzY29ubmVjdFJlcGx5SUQoMCksCisgICAgICBtQnVmZmVyaW5nKGZhbHNlKSwKKyAgICAgIG1JblByZXBhcmF0aW9uUGhhc2UodHJ1ZSksCisgICAgICBtRU9TUGVuZGluZyhmYWxzZSksCisgICAgICBtU2Vla0dlbmVyYXRpb24oMCksCisgICAgICBtRU9TVGltZW91dEF1ZGlvKDApLAorICAgICAgbUVPU1RpbWVvdXRWaWRlbygwKSB7CisgICAgbUJ1ZmZlcmluZ1NldHRpbmdzLm1Jbml0aWFsTWFya01zID0ga1ByZXBhcmVNYXJrTXM7CisgICAgbUJ1ZmZlcmluZ1NldHRpbmdzLm1SZXN1bWVQbGF5YmFja01hcmtNcyA9IGtPdmVyZmxvd01hcmtNczsKKyAgICBpZiAoaGVhZGVycykgeworICAgICAgICBtRXh0cmFIZWFkZXJzID0gKmhlYWRlcnM7CisKKyAgICAgICAgc3NpemVfdCBpbmRleCA9CisgICAgICAgICAgICBtRXh0cmFIZWFkZXJzLmluZGV4T2ZLZXkoU3RyaW5nOCgieC1oaWRlLXVybHMtZnJvbS1sb2ciKSk7CisKKyAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgIG1GbGFncyB8PSBrRmxhZ0luY29nbml0bzsKKworICAgICAgICAgICAgbUV4dHJhSGVhZGVycy5yZW1vdmVJdGVtc0F0KGluZGV4KTsKKyAgICAgICAgfQorICAgIH0KK30KKworTnVQbGF5ZXIyOjpSVFNQU291cmNlOjp+UlRTUFNvdXJjZSgpIHsKKyAgICBpZiAobUxvb3BlciAhPSBOVUxMKSB7CisgICAgICAgIG1Mb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKGlkKCkpOworICAgICAgICBtTG9vcGVyLT5zdG9wKCk7CisgICAgfQorfQorCitzdGF0dXNfdCBOdVBsYXllcjI6OlJUU1BTb3VyY2U6OmdldEJ1ZmZlcmluZ1NldHRpbmdzKAorICAgICAgICAgICAgQnVmZmVyaW5nU2V0dGluZ3MqIGJ1ZmZlcmluZyAvKiBub25udWxsICovKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1CdWZmZXJpbmdTZXR0aW5nc0xvY2spOworICAgICpidWZmZXJpbmcgPSBtQnVmZmVyaW5nU2V0dGluZ3M7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBOdVBsYXllcjI6OlJUU1BTb3VyY2U6OnNldEJ1ZmZlcmluZ1NldHRpbmdzKGNvbnN0IEJ1ZmZlcmluZ1NldHRpbmdzJiBidWZmZXJpbmcpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUJ1ZmZlcmluZ1NldHRpbmdzTG9jayk7CisgICAgbUJ1ZmZlcmluZ1NldHRpbmdzID0gYnVmZmVyaW5nOworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBOdVBsYXllcjI6OlJUU1BTb3VyY2U6OnByZXBhcmVBc3luYygpIHsKKyAgICBpZiAobUlzU0RQICYmIG1IVFRQU2VydmljZSA9PSBOVUxMKSB7CisgICAgICAgIG5vdGlmeVByZXBhcmVkKEJBRF9WQUxVRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobUxvb3BlciA9PSBOVUxMKSB7CisgICAgICAgIG1Mb29wZXIgPSBuZXcgQUxvb3BlcjsKKyAgICAgICAgbUxvb3Blci0+c2V0TmFtZSgicnRzcCIpOworICAgICAgICBtTG9vcGVyLT5zdGFydCgpOworCisgICAgICAgIG1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcih0aGlzKTsKKyAgICB9CisKKyAgICBDSEVDSyhtSGFuZGxlciA9PSBOVUxMKTsKKyAgICBDSEVDSyhtU0RQTG9hZGVyID09IE5VTEwpOworCisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdE5vdGlmeSwgdGhpcyk7CisKKyAgICBDSEVDS19FUShtU3RhdGUsIChpbnQpRElTQ09OTkVDVEVEKTsKKyAgICBtU3RhdGUgPSBDT05ORUNUSU5HOworCisgICAgaWYgKG1Jc1NEUCkgeworICAgICAgICBtU0RQTG9hZGVyID0gbmV3IFNEUExvYWRlcihub3RpZnksCisgICAgICAgICAgICAgICAgKG1GbGFncyAmIGtGbGFnSW5jb2duaXRvKSA/IFNEUExvYWRlcjo6a0ZsYWdJbmNvZ25pdG8gOiAwLAorICAgICAgICAgICAgICAgIG1IVFRQU2VydmljZSk7CisKKyAgICAgICAgbVNEUExvYWRlci0+bG9hZCgKKyAgICAgICAgICAgICAgICBtVVJMLmNfc3RyKCksIG1FeHRyYUhlYWRlcnMuaXNFbXB0eSgpID8gTlVMTCA6ICZtRXh0cmFIZWFkZXJzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtSGFuZGxlciA9IG5ldyBNeUhhbmRsZXIobVVSTC5jX3N0cigpLCBub3RpZnksIG1VSURWYWxpZCwgbVVJRCk7CisgICAgICAgIG1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcihtSGFuZGxlcik7CisKKyAgICAgICAgbUhhbmRsZXItPmNvbm5lY3QoKTsKKyAgICB9CisKKyAgICBzdGFydEJ1ZmZlcmluZ0lmTmVjZXNzYXJ5KCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpSVFNQU291cmNlOjpzdGFydCgpIHsKK30KKwordm9pZCBOdVBsYXllcjI6OlJUU1BTb3VyY2U6OnN0b3AoKSB7CisgICAgaWYgKG1Mb29wZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXREaXNjb25uZWN0LCB0aGlzKTsKKworICAgIHNwPEFNZXNzYWdlPiBkdW1teTsKKyAgICBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZkdW1teSk7Cit9CisKK3N0YXR1c190IE51UGxheWVyMjo6UlRTUFNvdXJjZTo6ZmVlZE1vcmVUU0RhdGEoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1CdWZmZXJpbmdMb2NrKTsKKyAgICByZXR1cm4gbUZpbmFsUmVzdWx0OworfQorCitzcDxNZXRhRGF0YT4gTnVQbGF5ZXIyOjpSVFNQU291cmNlOjpnZXRGb3JtYXRNZXRhKGJvb2wgYXVkaW8pIHsKKyAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBzb3VyY2UgPSBnZXRTb3VyY2UoYXVkaW8pOworCisgICAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBzb3VyY2UtPmdldEZvcm1hdCgpOworfQorCitib29sIE51UGxheWVyMjo6UlRTUFNvdXJjZTo6aGF2ZVN1ZmZpY2llbnREYXRhT25BbGxUcmFja3MoKSB7CisgICAgLy8gV2UncmUgZ29pbmcgdG8gYnVmZmVyIGF0IGxlYXN0IDIgc2VjcyB3b3J0aCBkYXRhIG9uIGFsbCB0cmFja3MgYmVmb3JlCisgICAgLy8gc3RhcnRpbmcgcGxheWJhY2sgKGJvdGggYXQgc3RhcnR1cCBhbmQgYWZ0ZXIgYSBzZWVrKS4KKworICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtNaW5EdXJhdGlvblVzID0gMjAwMDAwMGxsOworCisgICAgaW50NjRfdCBtZWRpYUR1cmF0aW9uVXMgPSAwOworICAgIGdldER1cmF0aW9uKCZtZWRpYUR1cmF0aW9uVXMpOworICAgIGlmICgobUF1ZGlvVHJhY2sgIT0gTlVMTCAmJiBtQXVkaW9UcmFjay0+aXNGaW5pc2hlZChtZWRpYUR1cmF0aW9uVXMpKQorICAgICAgICAgICAgfHwgKG1WaWRlb1RyYWNrICE9IE5VTEwgJiYgbVZpZGVvVHJhY2stPmlzRmluaXNoZWQobWVkaWFEdXJhdGlvblVzKSkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgc3RhdHVzX3QgZXJyOworICAgIGludDY0X3QgZHVyYXRpb25VczsKKyAgICBpZiAobUF1ZGlvVHJhY2sgIT0gTlVMTAorICAgICAgICAgICAgJiYgKGR1cmF0aW9uVXMgPSBtQXVkaW9UcmFjay0+Z2V0QnVmZmVyZWREdXJhdGlvblVzKCZlcnIpKQorICAgICAgICAgICAgICAgICAgICA8IGtNaW5EdXJhdGlvblVzCisgICAgICAgICAgICAmJiBlcnIgPT0gT0spIHsKKyAgICAgICAgQUxPR1YoImF1ZGlvIHRyYWNrIGRvZXNuJ3QgaGF2ZSBlbm91Z2ggZGF0YSB5ZXQuICglLjJmIHNlY3MgYnVmZmVyZWQpIiwKKyAgICAgICAgICAgICAgZHVyYXRpb25VcyAvIDFFNik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAobVZpZGVvVHJhY2sgIT0gTlVMTAorICAgICAgICAgICAgJiYgKGR1cmF0aW9uVXMgPSBtVmlkZW9UcmFjay0+Z2V0QnVmZmVyZWREdXJhdGlvblVzKCZlcnIpKQorICAgICAgICAgICAgICAgICAgICA8IGtNaW5EdXJhdGlvblVzCisgICAgICAgICAgICAmJiBlcnIgPT0gT0spIHsKKyAgICAgICAgQUxPR1YoInZpZGVvIHRyYWNrIGRvZXNuJ3QgaGF2ZSBlbm91Z2ggZGF0YSB5ZXQuICglLjJmIHNlY3MgYnVmZmVyZWQpIiwKKyAgICAgICAgICAgICAgZHVyYXRpb25VcyAvIDFFNik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpSVFNQU291cmNlOjpkZXF1ZXVlQWNjZXNzVW5pdCgKKyAgICAgICAgYm9vbCBhdWRpbywgc3A8QUJ1ZmZlcj4gKmFjY2Vzc1VuaXQpIHsKKyAgICBpZiAoIXN0b3BCdWZmZXJpbmdJZk5lY2Vzc2FyeSgpKSB7CisgICAgICAgIHJldHVybiAtRVdPVUxEQkxPQ0s7CisgICAgfQorCisgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gc291cmNlID0gZ2V0U291cmNlKGF1ZGlvKTsKKworICAgIGlmIChzb3VyY2UgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVXT1VMREJMT0NLOworICAgIH0KKworICAgIHN0YXR1c190IGZpbmFsUmVzdWx0OworICAgIGlmICghc291cmNlLT5oYXNCdWZmZXJBdmFpbGFibGUoJmZpbmFsUmVzdWx0KSkgeworICAgICAgICBpZiAoZmluYWxSZXN1bHQgPT0gT0spIHsKKworICAgICAgICAgICAgLy8gSWYgb3RoZXIgc291cmNlIGFscmVhZHkgc2lnbmFsZWQgRU9TLCB0aGlzIHNvdXJjZSBzaG91bGQgYWxzbyByZXR1cm4gRU9TCisgICAgICAgICAgICBpZiAoc291cmNlUmVhY2hlZEVPUyghYXVkaW8pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIElmIHRoaXMgc291cmNlIGhhcyBkZXRlY3RlZCBuZWFyIGVuZCwgZ2l2ZSBpdCBzb21lIHRpbWUgdG8gcmV0cmlldmUgbW9yZQorICAgICAgICAgICAgLy8gZGF0YSBiZWZvcmUgcmV0dXJuaW5nIEVPUworICAgICAgICAgICAgaW50NjRfdCBtZWRpYUR1cmF0aW9uVXMgPSAwOworICAgICAgICAgICAgZ2V0RHVyYXRpb24oJm1lZGlhRHVyYXRpb25Vcyk7CisgICAgICAgICAgICBpZiAoc291cmNlLT5pc0ZpbmlzaGVkKG1lZGlhRHVyYXRpb25VcykpIHsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IGVvc1RpbWVvdXQgPSBhdWRpbyA/IG1FT1NUaW1lb3V0QXVkaW8gOiBtRU9TVGltZW91dFZpZGVvOworICAgICAgICAgICAgICAgIGlmIChlb3NUaW1lb3V0ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0RU9TVGltZW91dChhdWRpbywgQUxvb3Blcjo6R2V0Tm93VXMoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoQUxvb3Blcjo6R2V0Tm93VXMoKSAtIGVvc1RpbWVvdXQpID4ga05lYXJFT1NUaW1lb3V0VXMpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0RU9TVGltZW91dChhdWRpbywgMCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gLUVXT1VMREJMT0NLOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIXNvdXJjZU5lYXJFT1MoIWF1ZGlvKSkgeworICAgICAgICAgICAgICAgIC8vIFdlIHNob3VsZCBub3QgZW50ZXIgYnVmZmVyaW5nIG1vZGUKKyAgICAgICAgICAgICAgICAvLyBpZiBhbnkgb2YgdGhlIHNvdXJjZXMgYWxyZWFkeSBoYXZlIGRldGVjdGVkIEVPUy4KKyAgICAgICAgICAgICAgICBzdGFydEJ1ZmZlcmluZ0lmTmVjZXNzYXJ5KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiAtRVdPVUxEQkxPQ0s7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZpbmFsUmVzdWx0OworICAgIH0KKworICAgIHNldEVPU1RpbWVvdXQoYXVkaW8sIDApOworCisgICAgcmV0dXJuIHNvdXJjZS0+ZGVxdWV1ZUFjY2Vzc1VuaXQoYWNjZXNzVW5pdCk7Cit9CisKK3NwPEFub3RoZXJQYWNrZXRTb3VyY2U+IE51UGxheWVyMjo6UlRTUFNvdXJjZTo6Z2V0U291cmNlKGJvb2wgYXVkaW8pIHsKKyAgICBpZiAobVRTUGFyc2VyICE9IE5VTEwpIHsKKyAgICAgICAgc3A8TWVkaWFTb3VyY2U+IHNvdXJjZSA9IG1UU1BhcnNlci0+Z2V0U291cmNlKAorICAgICAgICAgICAgICAgIGF1ZGlvID8gQVRTUGFyc2VyOjpBVURJTyA6IEFUU1BhcnNlcjo6VklERU8pOworCisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxBbm90aGVyUGFja2V0U291cmNlICo+KHNvdXJjZS5nZXQoKSk7CisgICAgfQorCisgICAgcmV0dXJuIGF1ZGlvID8gbUF1ZGlvVHJhY2sgOiBtVmlkZW9UcmFjazsKK30KKwordm9pZCBOdVBsYXllcjI6OlJUU1BTb3VyY2U6OnNldEVPU1RpbWVvdXQoYm9vbCBhdWRpbywgaW50NjRfdCB0aW1lb3V0KSB7CisgICAgaWYgKGF1ZGlvKSB7CisgICAgICAgIG1FT1NUaW1lb3V0QXVkaW8gPSB0aW1lb3V0OworICAgIH0gZWxzZSB7CisgICAgICAgIG1FT1NUaW1lb3V0VmlkZW8gPSB0aW1lb3V0OworICAgIH0KK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpSVFNQU291cmNlOjpnZXREdXJhdGlvbihpbnQ2NF90ICpkdXJhdGlvblVzKSB7CisgICAgKmR1cmF0aW9uVXMgPSAtMWxsOworCisgICAgaW50NjRfdCBhdWRpb0R1cmF0aW9uVXM7CisgICAgaWYgKG1BdWRpb1RyYWNrICE9IE5VTEwKKyAgICAgICAgICAgICYmIG1BdWRpb1RyYWNrLT5nZXRGb3JtYXQoKS0+ZmluZEludDY0KAorICAgICAgICAgICAgICAgIGtLZXlEdXJhdGlvbiwgJmF1ZGlvRHVyYXRpb25VcykKKyAgICAgICAgICAgICYmIGF1ZGlvRHVyYXRpb25VcyA+ICpkdXJhdGlvblVzKSB7CisgICAgICAgICpkdXJhdGlvblVzID0gYXVkaW9EdXJhdGlvblVzOworICAgIH0KKworICAgIGludDY0X3QgdmlkZW9EdXJhdGlvblVzOworICAgIGlmIChtVmlkZW9UcmFjayAhPSBOVUxMCisgICAgICAgICAgICAmJiBtVmlkZW9UcmFjay0+Z2V0Rm9ybWF0KCktPmZpbmRJbnQ2NCgKKyAgICAgICAgICAgICAgICBrS2V5RHVyYXRpb24sICZ2aWRlb0R1cmF0aW9uVXMpCisgICAgICAgICAgICAmJiB2aWRlb0R1cmF0aW9uVXMgPiAqZHVyYXRpb25VcykgeworICAgICAgICAqZHVyYXRpb25VcyA9IHZpZGVvRHVyYXRpb25VczsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE51UGxheWVyMjo6UlRTUFNvdXJjZTo6c2Vla1RvKGludDY0X3Qgc2Vla1RpbWVVcywgTWVkaWFQbGF5ZXIyU2Vla01vZGUgbW9kZSkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRQZXJmb3JtU2VlaywgdGhpcyk7CisgICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsICsrbVNlZWtHZW5lcmF0aW9uKTsKKyAgICBtc2ctPnNldEludDY0KCJ0aW1lVXMiLCBzZWVrVGltZVVzKTsKKyAgICBtc2ctPnNldEludDMyKCJtb2RlIiwgbW9kZSk7CisKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOworICAgIGlmIChlcnIgPT0gT0sgJiYgcmVzcG9uc2UgIT0gTlVMTCkgeworICAgICAgICBDSEVDSyhyZXNwb25zZS0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KKwordm9pZCBOdVBsYXllcjI6OlJUU1BTb3VyY2U6OnBlcmZvcm1TZWVrKGludDY0X3Qgc2Vla1RpbWVVcykgeworICAgIGlmIChtU3RhdGUgIT0gQ09OTkVDVEVEKSB7CisgICAgICAgIGZpbmlzaFNlZWsoSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbVN0YXRlID0gU0VFS0lORzsKKyAgICBtSGFuZGxlci0+c2VlayhzZWVrVGltZVVzKTsKKyAgICBtRU9TUGVuZGluZyA9IGZhbHNlOworfQorCit2b2lkIE51UGxheWVyMjo6UlRTUFNvdXJjZTo6c2NoZWR1bGVQb2xsQnVmZmVyaW5nKCkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRQb2xsQnVmZmVyaW5nLCB0aGlzKTsKKyAgICBtc2ctPnBvc3QoMTAwMDAwMGxsKTsgLy8gMSBzZWNvbmQgaW50ZXJ2YWxzCit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpSVFNQU291cmNlOjpjaGVja0J1ZmZlcmluZygKKyAgICAgICAgYm9vbCAqcHJlcGFyZWQsIGJvb2wgKnVuZGVyZmxvdywgYm9vbCAqb3ZlcmZsb3csIGJvb2wgKnN0YXJ0U2VydmVyLCBib29sICpmaW5pc2hlZCkgeworICAgIHNpemVfdCBudW1UcmFja3MgPSBtVHJhY2tzLnNpemUoKTsKKyAgICBzaXplX3QgcHJlcGFyZWRDb3VudCwgdW5kZXJmbG93Q291bnQsIG92ZXJmbG93Q291bnQsIHN0YXJ0Q291bnQsIGZpbmlzaGVkQ291bnQ7CisgICAgcHJlcGFyZWRDb3VudCA9IHVuZGVyZmxvd0NvdW50ID0gb3ZlcmZsb3dDb3VudCA9IHN0YXJ0Q291bnQgPSBmaW5pc2hlZENvdW50ID0gMDsKKworICAgIHNpemVfdCBjb3VudCA9IG51bVRyYWNrczsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKKyAgICAgICAgc3RhdHVzX3QgZmluYWxSZXN1bHQ7CisgICAgICAgIFRyYWNrSW5mbyAqaW5mbyA9ICZtVHJhY2tzLmVkaXRJdGVtQXQoaSk7CisgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHNyYyA9IGluZm8tPm1Tb3VyY2U7CisgICAgICAgIGlmIChzcmMgPT0gTlVMTCkgeworICAgICAgICAgICAgLS1udW1UcmFja3M7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpbnQ2NF90IGJ1ZmZlcmVkRHVyYXRpb25VcyA9IHNyYy0+Z2V0QnVmZmVyZWREdXJhdGlvblVzKCZmaW5hbFJlc3VsdCk7CisKKyAgICAgICAgaW50NjRfdCBpbml0aWFsTWFya1VzOworICAgICAgICBpbnQ2NF90IG1heFJlYnVmZmVyaW5nTWFya1VzOworICAgICAgICB7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUJ1ZmZlcmluZ1NldHRpbmdzTG9jayk7CisgICAgICAgICAgICBpbml0aWFsTWFya1VzID0gbUJ1ZmZlcmluZ1NldHRpbmdzLm1Jbml0aWFsTWFya01zICogMTAwMGxsOworICAgICAgICAgICAgLy8gVE9ETzogbWF4UmVidWZmZXJpbmdNYXJrVXMgY291bGQgYmUgbGFyZ2VyIHRoYW4KKyAgICAgICAgICAgIC8vIG1CdWZmZXJpbmdTZXR0aW5ncy5tUmVzdW1lUGxheWJhY2tNYXJrTXMgKiAxMDAwbGwuCisgICAgICAgICAgICBtYXhSZWJ1ZmZlcmluZ01hcmtVcyA9IG1CdWZmZXJpbmdTZXR0aW5ncy5tUmVzdW1lUGxheWJhY2tNYXJrTXMgKiAxMDAwbGw7CisgICAgICAgIH0KKyAgICAgICAgLy8gaXNGaW5pc2hlZCB3aGVuIGR1cmF0aW9uIGlzIDAgY2hlY2tzIGZvciBFT1MgcmVzdWx0IG9ubHkKKyAgICAgICAgaWYgKGJ1ZmZlcmVkRHVyYXRpb25VcyA+IGluaXRpYWxNYXJrVXMKKyAgICAgICAgICAgICAgICB8fCBzcmMtPmlzRmluaXNoZWQoLyogZHVyYXRpb24gKi8gMCkpIHsKKyAgICAgICAgICAgICsrcHJlcGFyZWRDb3VudDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzcmMtPmlzRmluaXNoZWQoLyogZHVyYXRpb24gKi8gMCkpIHsKKyAgICAgICAgICAgICsrb3ZlcmZsb3dDb3VudDsKKyAgICAgICAgICAgICsrZmluaXNoZWRDb3VudDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFRPRE86IHJlZGVmaW5lIGtVbmRlcmZsb3dNYXJrTXMgdG8gYSBmYWlyIHZhbHVlLAorICAgICAgICAgICAgaWYgKGJ1ZmZlcmVkRHVyYXRpb25VcyA8IGtVbmRlcmZsb3dNYXJrTXMgKiAxMDAwKSB7CisgICAgICAgICAgICAgICAgKyt1bmRlcmZsb3dDb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChidWZmZXJlZER1cmF0aW9uVXMgPiBtYXhSZWJ1ZmZlcmluZ01hcmtVcykgeworICAgICAgICAgICAgICAgICsrb3ZlcmZsb3dDb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludDY0X3Qgc3RhcnRTZXJ2ZXJNYXJrVXMgPQorICAgICAgICAgICAgICAgICAgICAoa1VuZGVyZmxvd01hcmtNcyAqIDEwMDBsbCArIG1heFJlYnVmZmVyaW5nTWFya1VzKSAvIDI7CisgICAgICAgICAgICBpZiAoYnVmZmVyZWREdXJhdGlvblVzIDwgc3RhcnRTZXJ2ZXJNYXJrVXMpIHsKKyAgICAgICAgICAgICAgICArK3N0YXJ0Q291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqcHJlcGFyZWQgICAgPSAocHJlcGFyZWRDb3VudCA9PSBudW1UcmFja3MpOworICAgICp1bmRlcmZsb3cgICA9ICh1bmRlcmZsb3dDb3VudCA+IDApOworICAgICpvdmVyZmxvdyAgICA9IChvdmVyZmxvd0NvdW50ID09IG51bVRyYWNrcyk7CisgICAgKnN0YXJ0U2VydmVyID0gKHN0YXJ0Q291bnQgPiAwKTsKKyAgICAqZmluaXNoZWQgICAgPSAoZmluaXNoZWRDb3VudCA+IDApOworfQorCit2b2lkIE51UGxheWVyMjo6UlRTUFNvdXJjZTo6b25Qb2xsQnVmZmVyaW5nKCkgeworICAgIGJvb2wgcHJlcGFyZWQsIHVuZGVyZmxvdywgb3ZlcmZsb3csIHN0YXJ0U2VydmVyLCBmaW5pc2hlZDsKKyAgICBjaGVja0J1ZmZlcmluZygmcHJlcGFyZWQsICZ1bmRlcmZsb3csICZvdmVyZmxvdywgJnN0YXJ0U2VydmVyLCAmZmluaXNoZWQpOworCisgICAgaWYgKHByZXBhcmVkICYmIG1JblByZXBhcmF0aW9uUGhhc2UpIHsKKyAgICAgICAgbUluUHJlcGFyYXRpb25QaGFzZSA9IGZhbHNlOworICAgICAgICBub3RpZnlQcmVwYXJlZCgpOworICAgIH0KKworICAgIGlmICghbUluUHJlcGFyYXRpb25QaGFzZSAmJiB1bmRlcmZsb3cpIHsKKyAgICAgICAgc3RhcnRCdWZmZXJpbmdJZk5lY2Vzc2FyeSgpOworICAgIH0KKworICAgIGlmIChoYXZlU3VmZmljaWVudERhdGFPbkFsbFRyYWNrcygpKSB7CisgICAgICAgIHN0b3BCdWZmZXJpbmdJZk5lY2Vzc2FyeSgpOworICAgIH0KKworICAgIGlmIChvdmVyZmxvdyAmJiBtSGFuZGxlciAhPSBOVUxMKSB7CisgICAgICAgIG1IYW5kbGVyLT5wYXVzZSgpOworICAgIH0KKworICAgIGlmIChzdGFydFNlcnZlciAmJiBtSGFuZGxlciAhPSBOVUxMKSB7CisgICAgICAgIG1IYW5kbGVyLT5yZXN1bWUoKTsKKyAgICB9CisKKyAgICBpZiAoZmluaXNoZWQgJiYgbUhhbmRsZXIgIT0gTlVMTCkgeworICAgICAgICBtSGFuZGxlci0+Y2FuY2VsQWNjZXNzVW5pdFRpbWVvdXRDaGVjaygpOworICAgIH0KKworICAgIHNjaGVkdWxlUG9sbEJ1ZmZlcmluZygpOworfQorCit2b2lkIE51UGxheWVyMjo6UlRTUFNvdXJjZTo6c2lnbmFsU291cmNlRU9TKHN0YXR1c190IHJlc3VsdCkgeworICAgIGNvbnN0IGJvb2wgYXVkaW8gPSB0cnVlOworICAgIGNvbnN0IGJvb2wgdmlkZW8gPSBmYWxzZTsKKworICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHNvdXJjZSA9IGdldFNvdXJjZShhdWRpbyk7CisgICAgaWYgKHNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgIHNvdXJjZS0+c2lnbmFsRU9TKHJlc3VsdCk7CisgICAgfQorCisgICAgc291cmNlID0gZ2V0U291cmNlKHZpZGVvKTsKKyAgICBpZiAoc291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgc291cmNlLT5zaWduYWxFT1MocmVzdWx0KTsKKyAgICB9Cit9CisKK2Jvb2wgTnVQbGF5ZXIyOjpSVFNQU291cmNlOjpzb3VyY2VSZWFjaGVkRU9TKGJvb2wgYXVkaW8pIHsKKyAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBzb3VyY2UgPSBnZXRTb3VyY2UoYXVkaW8pOworICAgIHN0YXR1c190IGZpbmFsUmVzdWx0OworICAgIHJldHVybiAoc291cmNlICE9IE5VTEwgJiYKKyAgICAgICAgICAgICFzb3VyY2UtPmhhc0J1ZmZlckF2YWlsYWJsZSgmZmluYWxSZXN1bHQpICYmCisgICAgICAgICAgICBmaW5hbFJlc3VsdCA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKTsKK30KKworYm9vbCBOdVBsYXllcjI6OlJUU1BTb3VyY2U6OnNvdXJjZU5lYXJFT1MoYm9vbCBhdWRpbykgeworICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHNvdXJjZSA9IGdldFNvdXJjZShhdWRpbyk7CisgICAgaW50NjRfdCBtZWRpYUR1cmF0aW9uVXMgPSAwOworICAgIGdldER1cmF0aW9uKCZtZWRpYUR1cmF0aW9uVXMpOworICAgIHJldHVybiAoc291cmNlICE9IE5VTEwgJiYgc291cmNlLT5pc0ZpbmlzaGVkKG1lZGlhRHVyYXRpb25VcykpOworfQorCit2b2lkIE51UGxheWVyMjo6UlRTUFNvdXJjZTo6b25TaWduYWxFT1MoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBpbnQzMl90IGdlbmVyYXRpb247CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmZ2VuZXJhdGlvbikpOworCisgICAgaWYgKGdlbmVyYXRpb24gIT0gbVNlZWtHZW5lcmF0aW9uKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobUVPU1BlbmRpbmcpIHsKKyAgICAgICAgc2lnbmFsU291cmNlRU9TKEVSUk9SX0VORF9PRl9TVFJFQU0pOworICAgICAgICBtRU9TUGVuZGluZyA9IGZhbHNlOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjI6OlJUU1BTb3VyY2U6OnBvc3RTb3VyY2VFT1NJZk5lY2Vzc2FyeSgpIHsKKyAgICBjb25zdCBib29sIGF1ZGlvID0gdHJ1ZTsKKyAgICBjb25zdCBib29sIHZpZGVvID0gZmFsc2U7CisgICAgLy8gSWYgYSBzb3VyY2UgaGFzIGRldGVjdGVkIG5lYXIgZW5kLCBnaXZlIGl0IHNvbWUgdGltZSB0byByZXRyaWV2ZSBtb3JlCisgICAgLy8gZGF0YSBiZWZvcmUgc2lnbmFsaW5nIEVPUworICAgIGlmIChzb3VyY2VOZWFyRU9TKGF1ZGlvKSB8fCBzb3VyY2VOZWFyRU9TKHZpZGVvKSkgeworICAgICAgICBpZiAoIW1FT1NQZW5kaW5nKSB7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2lnbmFsRU9TLCB0aGlzKTsKKyAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtU2Vla0dlbmVyYXRpb24pOworICAgICAgICAgICAgbXNnLT5wb3N0KGtOZWFyRU9TVGltZW91dFVzKTsKKyAgICAgICAgICAgIG1FT1NQZW5kaW5nID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBOdVBsYXllcjI6OlJUU1BTb3VyY2U6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgaWYgKG1zZy0+d2hhdCgpID09IGtXaGF0RGlzY29ubmVjdCkgeworICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKKyAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOworCisgICAgICAgIG1EaXNjb25uZWN0UmVwbHlJRCA9IHJlcGx5SUQ7CisgICAgICAgIGZpbmlzaERpc2Nvbm5lY3RJZlBvc3NpYmxlKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgaWYgKG1zZy0+d2hhdCgpID09IGtXaGF0UGVyZm9ybVNlZWspIHsKKyAgICAgICAgaW50MzJfdCBnZW5lcmF0aW9uOworICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZ2VuZXJhdGlvbiIsICZnZW5lcmF0aW9uKSk7CisgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJm1TZWVrUmVwbHlJRCkpOworCisgICAgICAgIGlmIChnZW5lcmF0aW9uICE9IG1TZWVrR2VuZXJhdGlvbikgeworICAgICAgICAgICAgLy8gb2Jzb2xldGUuCisgICAgICAgICAgICBmaW5pc2hTZWVrKE9LKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGludDY0X3Qgc2Vla1RpbWVVczsKKyAgICAgICAgaW50MzJfdCBtb2RlOworICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgidGltZVVzIiwgJnNlZWtUaW1lVXMpKTsKKyAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoIm1vZGUiLCAmbW9kZSkpOworCisgICAgICAgIC8vIFRPRE86IGFkZCAibW9kZSIgdG8gcGVyZm9ybVNlZWsuCisgICAgICAgIHBlcmZvcm1TZWVrKHNlZWtUaW1lVXMvKiwgKE1lZGlhUGxheWVyMlNlZWtNb2RlKW1vZGUgKi8pOworICAgICAgICByZXR1cm47CisgICAgfSBlbHNlIGlmIChtc2ctPndoYXQoKSA9PSBrV2hhdFBvbGxCdWZmZXJpbmcpIHsKKyAgICAgICAgb25Qb2xsQnVmZmVyaW5nKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgaWYgKG1zZy0+d2hhdCgpID09IGtXaGF0U2lnbmFsRU9TKSB7CisgICAgICAgIG9uU2lnbmFsRU9TKG1zZyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBDSEVDS19FUShtc2ctPndoYXQoKSwga1doYXROb3RpZnkpOworCisgICAgaW50MzJfdCB3aGF0OworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ3aGF0IiwgJndoYXQpKTsKKworICAgIHN3aXRjaCAod2hhdCkgeworICAgICAgICBjYXNlIE15SGFuZGxlcjo6a1doYXRDb25uZWN0ZWQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIG9uQ29ubmVjdGVkKCk7CisKKyAgICAgICAgICAgIG5vdGlmeVZpZGVvU2l6ZUNoYW5nZWQoKTsKKworICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwOworCisgICAgICAgICAgICBpZiAobUhhbmRsZXItPmlzU2Vla2FibGUoKSkgeworICAgICAgICAgICAgICAgIGZsYWdzID0gRkxBR19DQU5fUEFVU0UKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgRkxBR19DQU5fU0VFSworICAgICAgICAgICAgICAgICAgICAgICAgfCBGTEFHX0NBTl9TRUVLX0JBQ0tXQVJECisgICAgICAgICAgICAgICAgICAgICAgICB8IEZMQUdfQ0FOX1NFRUtfRk9SV0FSRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbm90aWZ5RmxhZ3NDaGFuZ2VkKGZsYWdzKTsKKyAgICAgICAgICAgIHNjaGVkdWxlUG9sbEJ1ZmZlcmluZygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE15SGFuZGxlcjo6a1doYXREaXNjb25uZWN0ZWQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIG9uRGlzY29ubmVjdGVkKG1zZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgTXlIYW5kbGVyOjprV2hhdFNlZWtEb25lOgorICAgICAgICB7CisgICAgICAgICAgICBtU3RhdGUgPSBDT05ORUNURUQ7CisgICAgICAgICAgICAvLyBVbmJsb2NrIHNlZWtUbyBoZXJlIGluIGNhc2Ugd2UgYXR0ZW1wdGVkIHRvIHNlZWsgaW4gYSBsaXZlIHN0cmVhbQorICAgICAgICAgICAgZmluaXNoU2VlayhPSyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgTXlIYW5kbGVyOjprV2hhdFNlZWtQYXVzZWQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHNvdXJjZSA9IGdldFNvdXJjZSh0cnVlIC8qIGF1ZGlvICovKTsKKyAgICAgICAgICAgIGlmIChzb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHNvdXJjZS0+cXVldWVEaXNjb250aW51aXR5KEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgLyogZXh0cmEgKi8gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRpc2NhcmQgKi8gdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzb3VyY2UgPSBnZXRTb3VyY2UoZmFsc2UgLyogdmlkZW8gKi8pOworICAgICAgICAgICAgaWYgKHNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgc291cmNlLT5xdWV1ZURpc2NvbnRpbnVpdHkoQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBleHRyYSAqLyBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgLyogZGlzY2FyZCAqLyB0cnVlKTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IE9LOworICAgICAgICAgICAgbXNnLT5maW5kSW50MzIoImVyciIsICZlcnIpOworCisgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lVXM7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInRpbWUiLCAmdGltZVVzKSk7CisgICAgICAgICAgICAgICAgbUhhbmRsZXItPmNvbnRpbnVlU2Vla0FmdGVyUGF1c2UodGltZVVzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZmluaXNoU2VlayhlcnIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE15SGFuZGxlcjo6a1doYXRBY2Nlc3NVbml0OgorICAgICAgICB7CisgICAgICAgICAgICBzaXplX3QgdHJhY2tJbmRleDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFNpemUoInRyYWNrSW5kZXgiLCAmdHJhY2tJbmRleCkpOworCisgICAgICAgICAgICBpZiAobVRTUGFyc2VyID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBDSEVDS19MVCh0cmFja0luZGV4LCBtVHJhY2tzLnNpemUoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIENIRUNLX0VRKHRyYWNrSW5kZXgsIDB1KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEJ1ZmZlcigiYWNjZXNzVW5pdCIsICZhY2Nlc3NVbml0KSk7CisKKyAgICAgICAgICAgIGludDMyX3QgZGFtYWdlZDsKKyAgICAgICAgICAgIGlmIChhY2Nlc3NVbml0LT5tZXRhKCktPmZpbmRJbnQzMigiZGFtYWdlZCIsICZkYW1hZ2VkKQorICAgICAgICAgICAgICAgICAgICAmJiBkYW1hZ2VkKSB7CisgICAgICAgICAgICAgICAgQUxPR0koImRyb3BwaW5nIGRhbWFnZWQgYWNjZXNzIHVuaXQuIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtVFNQYXJzZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHNpemVfdCBvZmZzZXQgPSAwOworICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IE9LOworICAgICAgICAgICAgICAgIHdoaWxlIChvZmZzZXQgKyAxODggPD0gYWNjZXNzVW5pdC0+c2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IG1UU1BhcnNlci0+ZmVlZFRTUGFja2V0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzc1VuaXQtPmRhdGEoKSArIG9mZnNldCwgMTg4KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMTg4OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPCBhY2Nlc3NVbml0LT5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgc2lnbmFsU291cmNlRU9TKGVycik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcG9zdFNvdXJjZUVPU0lmTmVjZXNzYXJ5KCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFRyYWNrSW5mbyAqaW5mbyA9ICZtVHJhY2tzLmVkaXRJdGVtQXQodHJhY2tJbmRleCk7CisKKyAgICAgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHNvdXJjZSA9IGluZm8tPm1Tb3VyY2U7CisgICAgICAgICAgICBpZiAoc291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBydHBUaW1lOworICAgICAgICAgICAgICAgIENIRUNLKGFjY2Vzc1VuaXQtPm1ldGEoKS0+ZmluZEludDMyKCJydHAtdGltZSIsIChpbnQzMl90ICopJnJ0cFRpbWUpKTsKKworICAgICAgICAgICAgICAgIGlmICghaW5mby0+bU5QVE1hcHBpbmdWYWxpZCkgeworICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgbGl2ZSBzdHJlYW0sIHdlIGRpZG4ndCByZWNlaXZlIGFueSBub3JtYWwKKyAgICAgICAgICAgICAgICAgICAgLy8gcGxheXRpbWUgbWFwcGluZy4gV2Ugd29uJ3QgbWFwIHRvIG5wdCB0aW1lLgorICAgICAgICAgICAgICAgICAgICBzb3VyY2UtPnF1ZXVlQWNjZXNzVW5pdChhY2Nlc3NVbml0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaW50NjRfdCBucHRVcyA9CisgICAgICAgICAgICAgICAgICAgICgoZG91YmxlKXJ0cFRpbWUgLSAoZG91YmxlKWluZm8tPm1SVFBUaW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgLyBpbmZvLT5tVGltZVNjYWxlCisgICAgICAgICAgICAgICAgICAgICAgICAqIDEwMDAwMDBsbAorICAgICAgICAgICAgICAgICAgICAgICAgKyBpbmZvLT5tTm9ybWFsUGxheXRpbWVVczsKKworICAgICAgICAgICAgICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIG5wdFVzKTsKKworICAgICAgICAgICAgICAgIHNvdXJjZS0+cXVldWVBY2Nlc3NVbml0KGFjY2Vzc1VuaXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcG9zdFNvdXJjZUVPU0lmTmVjZXNzYXJ5KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgTXlIYW5kbGVyOjprV2hhdEVPUzoKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCBmaW5hbFJlc3VsdDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJmaW5hbFJlc3VsdCIsICZmaW5hbFJlc3VsdCkpOworICAgICAgICAgICAgQ0hFQ0tfTkUoZmluYWxSZXN1bHQsIChzdGF0dXNfdClPSyk7CisKKyAgICAgICAgICAgIGlmIChtVFNQYXJzZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHNpZ25hbFNvdXJjZUVPUyhmaW5hbFJlc3VsdCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNpemVfdCB0cmFja0luZGV4OworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kU2l6ZSgidHJhY2tJbmRleCIsICZ0cmFja0luZGV4KSk7CisgICAgICAgICAgICBDSEVDS19MVCh0cmFja0luZGV4LCBtVHJhY2tzLnNpemUoKSk7CisKKyAgICAgICAgICAgIFRyYWNrSW5mbyAqaW5mbyA9ICZtVHJhY2tzLmVkaXRJdGVtQXQodHJhY2tJbmRleCk7CisgICAgICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBzb3VyY2UgPSBpbmZvLT5tU291cmNlOworICAgICAgICAgICAgaWYgKHNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgc291cmNlLT5zaWduYWxFT1MoZmluYWxSZXN1bHQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgTXlIYW5kbGVyOjprV2hhdFNlZWtEaXNjb250aW51aXR5OgorICAgICAgICB7CisgICAgICAgICAgICBzaXplX3QgdHJhY2tJbmRleDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFNpemUoInRyYWNrSW5kZXgiLCAmdHJhY2tJbmRleCkpOworICAgICAgICAgICAgQ0hFQ0tfTFQodHJhY2tJbmRleCwgbVRyYWNrcy5zaXplKCkpOworCisgICAgICAgICAgICBUcmFja0luZm8gKmluZm8gPSAmbVRyYWNrcy5lZGl0SXRlbUF0KHRyYWNrSW5kZXgpOworICAgICAgICAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gc291cmNlID0gaW5mby0+bVNvdXJjZTsKKyAgICAgICAgICAgIGlmIChzb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHNvdXJjZS0+cXVldWVEaXNjb250aW51aXR5KAorICAgICAgICAgICAgICAgICAgICAgICAgQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX1RJTUUsCisgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBkaXNjYXJkICovKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE15SGFuZGxlcjo6a1doYXROb3JtYWxQbGF5VGltZU1hcHBpbmc6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNpemVfdCB0cmFja0luZGV4OworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kU2l6ZSgidHJhY2tJbmRleCIsICZ0cmFja0luZGV4KSk7CisgICAgICAgICAgICBDSEVDS19MVCh0cmFja0luZGV4LCBtVHJhY2tzLnNpemUoKSk7CisKKyAgICAgICAgICAgIHVpbnQzMl90IHJ0cFRpbWU7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicnRwVGltZSIsIChpbnQzMl90ICopJnJ0cFRpbWUpKTsKKworICAgICAgICAgICAgaW50NjRfdCBucHRVczsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJucHRVcyIsICZucHRVcykpOworCisgICAgICAgICAgICBUcmFja0luZm8gKmluZm8gPSAmbVRyYWNrcy5lZGl0SXRlbUF0KHRyYWNrSW5kZXgpOworICAgICAgICAgICAgaW5mby0+bVJUUFRpbWUgPSBydHBUaW1lOworICAgICAgICAgICAgaW5mby0+bU5vcm1hbFBsYXl0aW1lVXMgPSBucHRVczsKKyAgICAgICAgICAgIGluZm8tPm1OUFRNYXBwaW5nVmFsaWQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFNEUExvYWRlcjo6a1doYXRTRFBMb2FkZWQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIG9uU0RQTG9hZGVkKG1zZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBUUkVTUEFTUygpOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjI6OlJUU1BTb3VyY2U6Om9uQ29ubmVjdGVkKCkgeworICAgIENIRUNLKG1BdWRpb1RyYWNrID09IE5VTEwpOworICAgIENIRUNLKG1WaWRlb1RyYWNrID09IE5VTEwpOworCisgICAgc2l6ZV90IG51bVRyYWNrcyA9IG1IYW5kbGVyLT5jb3VudFRyYWNrcygpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtVHJhY2tzOyArK2kpIHsKKyAgICAgICAgaW50MzJfdCB0aW1lU2NhbGU7CisgICAgICAgIHNwPE1ldGFEYXRhPiBmb3JtYXQgPSBtSGFuZGxlci0+Z2V0VHJhY2tGb3JtYXQoaSwgJnRpbWVTY2FsZSk7CisKKyAgICAgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICAgICAgQ0hFQ0soZm9ybWF0LT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CisKKyAgICAgICAgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHMlRTKSkgeworICAgICAgICAgICAgLy8gVmVyeSBzcGVjaWFsIGNhc2UgZm9yIE1QRUcyIFRyYW5zcG9ydCBTdHJlYW1zLgorICAgICAgICAgICAgQ0hFQ0tfRVEobnVtVHJhY2tzLCAxdSk7CisKKyAgICAgICAgICAgIG1UU1BhcnNlciA9IG5ldyBBVFNQYXJzZXI7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBib29sIGlzQXVkaW8gPSAhc3RybmNhc2VjbXAobWltZSwgImF1ZGlvLyIsIDYpOworICAgICAgICBib29sIGlzVmlkZW8gPSAhc3RybmNhc2VjbXAobWltZSwgInZpZGVvLyIsIDYpOworCisgICAgICAgIFRyYWNrSW5mbyBpbmZvOworICAgICAgICBpbmZvLm1UaW1lU2NhbGUgPSB0aW1lU2NhbGU7CisgICAgICAgIGluZm8ubVJUUFRpbWUgPSAwOworICAgICAgICBpbmZvLm1Ob3JtYWxQbGF5dGltZVVzID0gMGxsOworICAgICAgICBpbmZvLm1OUFRNYXBwaW5nVmFsaWQgPSBmYWxzZTsKKworICAgICAgICBpZiAoKGlzQXVkaW8gJiYgbUF1ZGlvVHJhY2sgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICB8fCAoaXNWaWRlbyAmJiBtVmlkZW9UcmFjayA9PSBOVUxMKSkgeworICAgICAgICAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gc291cmNlID0gbmV3IEFub3RoZXJQYWNrZXRTb3VyY2UoZm9ybWF0KTsKKworICAgICAgICAgICAgaWYgKGlzQXVkaW8pIHsKKyAgICAgICAgICAgICAgICBtQXVkaW9UcmFjayA9IHNvdXJjZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVZpZGVvVHJhY2sgPSBzb3VyY2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGluZm8ubVNvdXJjZSA9IHNvdXJjZTsKKyAgICAgICAgfQorCisgICAgICAgIG1UcmFja3MucHVzaChpbmZvKTsKKyAgICB9CisKKyAgICBtU3RhdGUgPSBDT05ORUNURUQ7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpSVFNQU291cmNlOjpvblNEUExvYWRlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHN0YXR1c190IGVycjsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicmVzdWx0IiwgJmVycikpOworCisgICAgbVNEUExvYWRlci5jbGVhcigpOworCisgICAgaWYgKG1EaXNjb25uZWN0UmVwbHlJRCAhPSAwKSB7CisgICAgICAgIGVyciA9IFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICBzcDxBU2Vzc2lvbkRlc2NyaXB0aW9uPiBkZXNjOworICAgICAgICBzcDxSZWZCYXNlPiBvYmo7CisgICAgICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgiZGVzY3JpcHRpb24iLCAmb2JqKSk7CisgICAgICAgIGRlc2MgPSBzdGF0aWNfY2FzdDxBU2Vzc2lvbkRlc2NyaXB0aW9uICo+KG9iai5nZXQoKSk7CisKKyAgICAgICAgQVN0cmluZyBydHNwVXJpOworICAgICAgICBpZiAoIWRlc2MtPmZpbmRBdHRyaWJ1dGUoMCwgImE9Y29udHJvbCIsICZydHNwVXJpKSkgeworICAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBmaW5kIHVybCBpbiBTRFAiKTsKKyAgICAgICAgICAgIGVyciA9IFVOS05PV05fRVJST1I7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0Tm90aWZ5LCB0aGlzKTsKKworICAgICAgICAgICAgbUhhbmRsZXIgPSBuZXcgTXlIYW5kbGVyKHJ0c3BVcmkuY19zdHIoKSwgbm90aWZ5LCBtVUlEVmFsaWQsIG1VSUQpOworICAgICAgICAgICAgbUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1IYW5kbGVyKTsKKworICAgICAgICAgICAgbUhhbmRsZXItPmxvYWRTRFAoZGVzYyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIGlmIChtU3RhdGUgPT0gQ09OTkVDVElORykgeworICAgICAgICAgICAgLy8gV2UncmUgc3RpbGwgaW4gdGhlIHByZXBhcmF0aW9uIHBoYXNlLCBzaWduYWwgdGhhdCBpdAorICAgICAgICAgICAgLy8gZmFpbGVkLgorICAgICAgICAgICAgbm90aWZ5UHJlcGFyZWQoZXJyKTsKKyAgICAgICAgfQorCisgICAgICAgIG1TdGF0ZSA9IERJU0NPTk5FQ1RFRDsKKyAgICAgICAgc2V0RXJyb3IoZXJyKTsKKworICAgICAgICBpZiAobURpc2Nvbm5lY3RSZXBseUlEICE9IDApIHsKKyAgICAgICAgICAgIGZpbmlzaERpc2Nvbm5lY3RJZlBvc3NpYmxlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpSVFNQU291cmNlOjpvbkRpc2Nvbm5lY3RlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIGlmIChtU3RhdGUgPT0gRElTQ09OTkVDVEVEKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBlcnI7CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInJlc3VsdCIsICZlcnIpKTsKKyAgICBDSEVDS19ORShlcnIsIChzdGF0dXNfdClPSyk7CisKKyAgICBtTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihtSGFuZGxlci0+aWQoKSk7CisgICAgbUhhbmRsZXIuY2xlYXIoKTsKKworICAgIGlmIChtU3RhdGUgPT0gQ09OTkVDVElORykgeworICAgICAgICAvLyBXZSdyZSBzdGlsbCBpbiB0aGUgcHJlcGFyYXRpb24gcGhhc2UsIHNpZ25hbCB0aGF0IGl0CisgICAgICAgIC8vIGZhaWxlZC4KKyAgICAgICAgbm90aWZ5UHJlcGFyZWQoZXJyKTsKKyAgICB9CisKKyAgICBtU3RhdGUgPSBESVNDT05ORUNURUQ7CisgICAgc2V0RXJyb3IoZXJyKTsKKworICAgIGlmIChtRGlzY29ubmVjdFJlcGx5SUQgIT0gMCkgeworICAgICAgICBmaW5pc2hEaXNjb25uZWN0SWZQb3NzaWJsZSgpOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjI6OlJUU1BTb3VyY2U6OmZpbmlzaERpc2Nvbm5lY3RJZlBvc3NpYmxlKCkgeworICAgIGlmIChtU3RhdGUgIT0gRElTQ09OTkVDVEVEKSB7CisgICAgICAgIGlmIChtSGFuZGxlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBtSGFuZGxlci0+ZGlzY29ubmVjdCgpOworICAgICAgICB9IGVsc2UgaWYgKG1TRFBMb2FkZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgbVNEUExvYWRlci0+Y2FuY2VsKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIChuZXcgQU1lc3NhZ2UpLT5wb3N0UmVwbHkobURpc2Nvbm5lY3RSZXBseUlEKTsKKyAgICBtRGlzY29ubmVjdFJlcGx5SUQgPSAwOworfQorCit2b2lkIE51UGxheWVyMjo6UlRTUFNvdXJjZTo6c2V0RXJyb3Ioc3RhdHVzX3QgZXJyKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1CdWZmZXJpbmdMb2NrKTsKKyAgICBtRmluYWxSZXN1bHQgPSBlcnI7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpSVFNQU291cmNlOjpzdGFydEJ1ZmZlcmluZ0lmTmVjZXNzYXJ5KCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtQnVmZmVyaW5nTG9jayk7CisKKyAgICBpZiAoIW1CdWZmZXJpbmcpIHsKKyAgICAgICAgbUJ1ZmZlcmluZyA9IHRydWU7CisKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IGR1cE5vdGlmeSgpOworICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRQYXVzZU9uQnVmZmVyaW5nU3RhcnQpOworICAgICAgICBub3RpZnktPnBvc3QoKTsKKyAgICB9Cit9CisKK2Jvb2wgTnVQbGF5ZXIyOjpSVFNQU291cmNlOjpzdG9wQnVmZmVyaW5nSWZOZWNlc3NhcnkoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1CdWZmZXJpbmdMb2NrKTsKKworICAgIGlmIChtQnVmZmVyaW5nKSB7CisgICAgICAgIGlmICghaGF2ZVN1ZmZpY2llbnREYXRhT25BbGxUcmFja3MoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgbUJ1ZmZlcmluZyA9IGZhbHNlOworCisgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBkdXBOb3RpZnkoKTsKKyAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0UmVzdW1lT25CdWZmZXJpbmdFbmQpOworICAgICAgICBub3RpZnktPnBvc3QoKTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBOdVBsYXllcjI6OlJUU1BTb3VyY2U6OmZpbmlzaFNlZWsoc3RhdHVzX3QgZXJyKSB7CisgICAgaWYgKG1TZWVrUmVwbHlJRCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3A8QU1lc3NhZ2U+IHNlZWtSZXBseSA9IG5ldyBBTWVzc2FnZTsKKyAgICBzZWVrUmVwbHktPnNldEludDMyKCJlcnIiLCBlcnIpOworICAgIHNlZWtSZXBseS0+cG9zdFJlcGx5KG1TZWVrUmVwbHlJRCk7CisgICAgbVNlZWtSZXBseUlEID0gTlVMTDsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL251cGxheWVyMi9SVFNQU291cmNlLmggYi9tZWRpYS9saWJtZWRpYS9udXBsYXllcjIvUlRTUFNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliY2U0NzMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9udXBsYXllcjIvUlRTUFNvdXJjZS5oCkBAIC0wLDAgKzEsMTY5IEBACisvKgorICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFJUU1BfU09VUkNFX0hfCisKKyNkZWZpbmUgUlRTUF9TT1VSQ0VfSF8KKworI2luY2x1ZGUgIk51UGxheWVyMlNvdXJjZS5oIgorCisjaW5jbHVkZSAiQVRTUGFyc2VyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEFMb29wZXI7CitzdHJ1Y3QgQVJlcGx5VG9rZW47CitzdHJ1Y3QgQW5vdGhlclBhY2tldFNvdXJjZTsKK3N0cnVjdCBNeUhhbmRsZXI7CitzdHJ1Y3QgU0RQTG9hZGVyOworCitzdHJ1Y3QgTnVQbGF5ZXIyOjpSVFNQU291cmNlIDogcHVibGljIE51UGxheWVyMjo6U291cmNlIHsKKyAgICBSVFNQU291cmNlKAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsCisgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycywKKyAgICAgICAgICAgIGJvb2wgdWlkVmFsaWQgPSBmYWxzZSwKKyAgICAgICAgICAgIHVpZF90IHVpZCA9IDAsCisgICAgICAgICAgICBib29sIGlzU0RQID0gZmFsc2UpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRCdWZmZXJpbmdTZXR0aW5ncygKKyAgICAgICAgICAgIEJ1ZmZlcmluZ1NldHRpbmdzKiBidWZmZXJpbmcgLyogbm9ubnVsbCAqLykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRCdWZmZXJpbmdTZXR0aW5ncyhjb25zdCBCdWZmZXJpbmdTZXR0aW5ncyYgYnVmZmVyaW5nKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgdm9pZCBwcmVwYXJlQXN5bmMoKTsKKyAgICB2aXJ0dWFsIHZvaWQgc3RhcnQoKTsKKyAgICB2aXJ0dWFsIHZvaWQgc3RvcCgpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBmZWVkTW9yZVRTRGF0YSgpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBkZXF1ZXVlQWNjZXNzVW5pdChib29sIGF1ZGlvLCBzcDxBQnVmZmVyPiAqYWNjZXNzVW5pdCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldER1cmF0aW9uKGludDY0X3QgKmR1cmF0aW9uVXMpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2Vla1RvKAorICAgICAgICAgICAgaW50NjRfdCBzZWVrVGltZVVzLAorICAgICAgICAgICAgTWVkaWFQbGF5ZXIyU2Vla01vZGUgbW9kZSA9IE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkMpIG92ZXJyaWRlOworCisgICAgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5SVFNQU291cmNlKCk7CisKKyAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXRNZXRhKGJvb2wgYXVkaW8pOworCitwcml2YXRlOgorICAgIGVudW0geworICAgICAgICBrV2hhdE5vdGlmeSAgICAgICAgICA9ICdub3RpJywKKyAgICAgICAga1doYXREaXNjb25uZWN0ICAgICAgPSAnZGlzYycsCisgICAgICAgIGtXaGF0UGVyZm9ybVNlZWsgICAgID0gJ3NlZWsnLAorICAgICAgICBrV2hhdFBvbGxCdWZmZXJpbmcgICA9ICdwb2xsJywKKyAgICAgICAga1doYXRTaWduYWxFT1MgICAgICAgPSAnZW9zICcsCisgICAgfTsKKworICAgIGVudW0gU3RhdGUgeworICAgICAgICBESVNDT05ORUNURUQsCisgICAgICAgIENPTk5FQ1RJTkcsCisgICAgICAgIENPTk5FQ1RFRCwKKyAgICAgICAgU0VFS0lORywKKyAgICB9OworCisgICAgZW51bSBGbGFncyB7CisgICAgICAgIC8vIERvbid0IGxvZyBhbnkgVVJMcy4KKyAgICAgICAga0ZsYWdJbmNvZ25pdG8gPSAxLAorICAgIH07CisKKyAgICBzdHJ1Y3QgVHJhY2tJbmZvIHsKKyAgICAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gbVNvdXJjZTsKKworICAgICAgICBpbnQzMl90IG1UaW1lU2NhbGU7CisgICAgICAgIHVpbnQzMl90IG1SVFBUaW1lOworICAgICAgICBpbnQ2NF90IG1Ob3JtYWxQbGF5dGltZVVzOworICAgICAgICBib29sIG1OUFRNYXBwaW5nVmFsaWQ7CisgICAgfTsKKworICAgIHNwPE1lZGlhSFRUUFNlcnZpY2U+IG1IVFRQU2VydmljZTsKKyAgICBBU3RyaW5nIG1VUkw7CisgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbUV4dHJhSGVhZGVyczsKKyAgICBib29sIG1VSURWYWxpZDsKKyAgICB1aWRfdCBtVUlEOworICAgIHVpbnQzMl90IG1GbGFnczsKKyAgICBib29sIG1Jc1NEUDsKKyAgICBTdGF0ZSBtU3RhdGU7CisgICAgc3RhdHVzX3QgbUZpbmFsUmVzdWx0OworICAgIHNwPEFSZXBseVRva2VuPiBtRGlzY29ubmVjdFJlcGx5SUQ7CisgICAgTXV0ZXggbUJ1ZmZlcmluZ0xvY2s7CisgICAgYm9vbCBtQnVmZmVyaW5nOworICAgIGJvb2wgbUluUHJlcGFyYXRpb25QaGFzZTsKKyAgICBib29sIG1FT1NQZW5kaW5nOworCisgICAgTXV0ZXggbUJ1ZmZlcmluZ1NldHRpbmdzTG9jazsKKyAgICBCdWZmZXJpbmdTZXR0aW5ncyBtQnVmZmVyaW5nU2V0dGluZ3M7CisKKyAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOworICAgIHNwPE15SGFuZGxlcj4gbUhhbmRsZXI7CisgICAgc3A8U0RQTG9hZGVyPiBtU0RQTG9hZGVyOworCisgICAgVmVjdG9yPFRyYWNrSW5mbz4gbVRyYWNrczsKKyAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBtQXVkaW9UcmFjazsKKyAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBtVmlkZW9UcmFjazsKKworICAgIHNwPEFUU1BhcnNlcj4gbVRTUGFyc2VyOworCisgICAgaW50MzJfdCBtU2Vla0dlbmVyYXRpb247CisKKyAgICBpbnQ2NF90IG1FT1NUaW1lb3V0QXVkaW87CisgICAgaW50NjRfdCBtRU9TVGltZW91dFZpZGVvOworCisgICAgc3A8QVJlcGx5VG9rZW4+IG1TZWVrUmVwbHlJRDsKKworICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IGdldFNvdXJjZShib29sIGF1ZGlvKTsKKworICAgIHZvaWQgb25Db25uZWN0ZWQoKTsKKyAgICB2b2lkIG9uU0RQTG9hZGVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2b2lkIG9uRGlzY29ubmVjdGVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2b2lkIGZpbmlzaERpc2Nvbm5lY3RJZlBvc3NpYmxlKCk7CisKKyAgICB2b2lkIHBlcmZvcm1TZWVrKGludDY0X3Qgc2Vla1RpbWVVcyk7CisgICAgdm9pZCBzY2hlZHVsZVBvbGxCdWZmZXJpbmcoKTsKKyAgICB2b2lkIGNoZWNrQnVmZmVyaW5nKAorICAgICAgICAgICAgYm9vbCAqcHJlcGFyZWQsCisgICAgICAgICAgICBib29sICp1bmRlcmZsb3csCisgICAgICAgICAgICBib29sICpvdmVyZmxvdywKKyAgICAgICAgICAgIGJvb2wgKnN0YXJ0U2VydmVyLAorICAgICAgICAgICAgYm9vbCAqZmluaXNoZWQpOworICAgIHZvaWQgb25Qb2xsQnVmZmVyaW5nKCk7CisKKyAgICBib29sIGhhdmVTdWZmaWNpZW50RGF0YU9uQWxsVHJhY2tzKCk7CisKKyAgICB2b2lkIHNldEVPU1RpbWVvdXQoYm9vbCBhdWRpbywgaW50NjRfdCB0aW1lb3V0KTsKKyAgICB2b2lkIHNldEVycm9yKHN0YXR1c190IGVycik7CisgICAgdm9pZCBzdGFydEJ1ZmZlcmluZ0lmTmVjZXNzYXJ5KCk7CisgICAgYm9vbCBzdG9wQnVmZmVyaW5nSWZOZWNlc3NhcnkoKTsKKyAgICB2b2lkIGZpbmlzaFNlZWsoc3RhdHVzX3QgZXJyKTsKKworICAgIHZvaWQgcG9zdFNvdXJjZUVPU0lmTmVjZXNzYXJ5KCk7CisgICAgdm9pZCBzaWduYWxTb3VyY2VFT1Moc3RhdHVzX3QgcmVzdWx0KTsKKyAgICB2b2lkIG9uU2lnbmFsRU9TKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKworICAgIGJvb2wgc291cmNlTmVhckVPUyhib29sIGF1ZGlvKTsKKyAgICBib29sIHNvdXJjZVJlYWNoZWRFT1MoYm9vbCBhdWRpbyk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhSVFNQU291cmNlKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gUlRTUF9TT1VSQ0VfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL251cGxheWVyMi9TdHJlYW1pbmdTb3VyY2UuY3BwIGIvbWVkaWEvbGlibWVkaWEvbnVwbGF5ZXIyL1N0cmVhbWluZ1NvdXJjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMzNzBiNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL251cGxheWVyMi9TdHJlYW1pbmdTb3VyY2UuY3BwCkBAIC0wLDAgKzEsMzEwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJTdHJlYW1pbmdTb3VyY2UiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJTdHJlYW1pbmdTb3VyY2UuaCIKKworI2luY2x1ZGUgIkFUU1BhcnNlci5oIgorI2luY2x1ZGUgIkFub3RoZXJQYWNrZXRTb3VyY2UuaCIKKyNpbmNsdWRlICJOdVBsYXllcjJTdHJlYW1MaXN0ZW5lci5oIgorCisjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhS2V5cy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdCBpbnQzMl90IGtOdW1MaXN0ZW5lclF1ZXVlUGFja2V0cyA9IDgwOworCitOdVBsYXllcjI6OlN0cmVhbWluZ1NvdXJjZTo6U3RyZWFtaW5nU291cmNlKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKKyAgICAgICAgY29uc3Qgc3A8SVN0cmVhbVNvdXJjZT4gJnNvdXJjZSkKKyAgICA6IFNvdXJjZShub3RpZnkpLAorICAgICAgbVNvdXJjZShzb3VyY2UpLAorICAgICAgbUZpbmFsUmVzdWx0KE9LKSwKKyAgICAgIG1CdWZmZXJpbmcoZmFsc2UpIHsKK30KKworTnVQbGF5ZXIyOjpTdHJlYW1pbmdTb3VyY2U6On5TdHJlYW1pbmdTb3VyY2UoKSB7CisgICAgaWYgKG1Mb29wZXIgIT0gTlVMTCkgeworICAgICAgICBtTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihpZCgpKTsKKyAgICAgICAgbUxvb3Blci0+c3RvcCgpOworICAgIH0KK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpTdHJlYW1pbmdTb3VyY2U6OmdldEJ1ZmZlcmluZ1NldHRpbmdzKAorICAgICAgICBCdWZmZXJpbmdTZXR0aW5ncyAqYnVmZmVyaW5nIC8qIG5vbm51bGwgKi8pIHsKKyAgICAqYnVmZmVyaW5nID0gQnVmZmVyaW5nU2V0dGluZ3MoKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE51UGxheWVyMjo6U3RyZWFtaW5nU291cmNlOjpzZXRCdWZmZXJpbmdTZXR0aW5ncygKKyAgICAgICAgY29uc3QgQnVmZmVyaW5nU2V0dGluZ3MgJiAvKiBidWZmZXJpbmcgKi8pIHsKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpTdHJlYW1pbmdTb3VyY2U6OnByZXBhcmVBc3luYygpIHsKKyAgICBpZiAobUxvb3BlciA9PSBOVUxMKSB7CisgICAgICAgIG1Mb29wZXIgPSBuZXcgQUxvb3BlcjsKKyAgICAgICAgbUxvb3Blci0+c2V0TmFtZSgic3RyZWFtaW5nIik7CisgICAgICAgIG1Mb29wZXItPnN0YXJ0KCk7CisKKyAgICAgICAgbUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKHRoaXMpOworICAgIH0KKworICAgIG5vdGlmeVZpZGVvU2l6ZUNoYW5nZWQoKTsKKyAgICBub3RpZnlGbGFnc0NoYW5nZWQoMCk7CisgICAgbm90aWZ5UHJlcGFyZWQoKTsKK30KKwordm9pZCBOdVBsYXllcjI6OlN0cmVhbWluZ1NvdXJjZTo6c3RhcnQoKSB7CisgICAgbVN0cmVhbUxpc3RlbmVyID0gbmV3IFN0cmVhbUxpc3RlbmVyKG1Tb3VyY2UsIE5VTEwpOworCisgICAgdWludDMyX3Qgc291cmNlRmxhZ3MgPSBtU291cmNlLT5mbGFncygpOworCisgICAgdWludDMyX3QgcGFyc2VyRmxhZ3MgPSBBVFNQYXJzZXI6OlRTX1RJTUVTVEFNUFNfQVJFX0FCU09MVVRFOworICAgIGlmIChzb3VyY2VGbGFncyAmIElTdHJlYW1Tb3VyY2U6OmtGbGFnQWxpZ25lZFZpZGVvRGF0YSkgeworICAgICAgICBwYXJzZXJGbGFncyB8PSBBVFNQYXJzZXI6OkFMSUdORURfVklERU9fREFUQTsKKyAgICB9CisKKyAgICBtVFNQYXJzZXIgPSBuZXcgQVRTUGFyc2VyKHBhcnNlckZsYWdzKTsKKworICAgIG1TdHJlYW1MaXN0ZW5lci0+c3RhcnQoKTsKKworICAgIHBvc3RSZWFkQnVmZmVyKCk7Cit9CisKK3N0YXR1c190IE51UGxheWVyMjo6U3RyZWFtaW5nU291cmNlOjpmZWVkTW9yZVRTRGF0YSgpIHsKKyAgICByZXR1cm4gcG9zdFJlYWRCdWZmZXIoKTsKK30KKwordm9pZCBOdVBsYXllcjI6OlN0cmVhbWluZ1NvdXJjZTo6b25SZWFkQnVmZmVyKCkgeworICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGtOdW1MaXN0ZW5lclF1ZXVlUGFja2V0czsgKytpKSB7CisgICAgICAgIGNoYXIgYnVmZmVyWzE4OF07CisgICAgICAgIHNwPEFNZXNzYWdlPiBleHRyYTsKKyAgICAgICAgc3NpemVfdCBuID0gbVN0cmVhbUxpc3RlbmVyLT5yZWFkKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICZleHRyYSk7CisKKyAgICAgICAgaWYgKG4gPT0gMCkgeworICAgICAgICAgICAgQUxPR0koImlucHV0IGRhdGEgRU9TIHJlYWNoZWQuIik7CisgICAgICAgICAgICBtVFNQYXJzZXItPnNpZ25hbEVPUyhFUlJPUl9FTkRfT0ZfU1RSRUFNKTsKKyAgICAgICAgICAgIHNldEVycm9yKEVSUk9SX0VORF9PRl9TVFJFQU0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAobiA9PSBJTkZPX0RJU0NPTlRJTlVJVFkpIHsKKyAgICAgICAgICAgIGludDMyX3QgdHlwZSA9IEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9USU1FOworCisgICAgICAgICAgICBpbnQzMl90IG1hc2s7CisgICAgICAgICAgICBpZiAoZXh0cmEgIT0gTlVMTAorICAgICAgICAgICAgICAgICAgICAmJiBleHRyYS0+ZmluZEludDMyKAorICAgICAgICAgICAgICAgICAgICAgICAga0lTdHJlYW1MaXN0ZW5lcktleURpc2NvbnRpbnVpdHlNYXNrLCAmbWFzaykpIHsKKyAgICAgICAgICAgICAgICBpZiAobWFzayA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDbGllbnQgc3BlY2lmaWVkIGFuIGlsbGVnYWwgZGlzY29udGludWl0eSB0eXBlLiIpOworICAgICAgICAgICAgICAgICAgICBzZXRFcnJvcihFUlJPUl9VTlNVUFBPUlRFRCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHR5cGUgPSBtYXNrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtVFNQYXJzZXItPnNpZ25hbERpc2NvbnRpbnVpdHkoCisgICAgICAgICAgICAgICAgICAgIChBVFNQYXJzZXI6OkRpc2NvbnRpbnVpdHlUeXBlKXR5cGUsIGV4dHJhKTsKKyAgICAgICAgfSBlbHNlIGlmIChuIDwgMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoYnVmZmVyWzBdID09IDB4MDApIHsKKyAgICAgICAgICAgICAgICAvLyBYWFggbGVnYWN5CisKKyAgICAgICAgICAgICAgICBpZiAoZXh0cmEgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBleHRyYSA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB1aW50OF90IHR5cGUgPSBidWZmZXJbMV07CisKKyAgICAgICAgICAgICAgICBpZiAodHlwZSAmIDIpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBtZWRpYVRpbWVVczsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCZtZWRpYVRpbWVVcywgJmJ1ZmZlclsyXSwgc2l6ZW9mKG1lZGlhVGltZVVzKSk7CisKKyAgICAgICAgICAgICAgICAgICAgZXh0cmEtPnNldEludDY0KGtBVFNQYXJzZXJLZXlNZWRpYVRpbWVVcywgbWVkaWFUaW1lVXMpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1UU1BhcnNlci0+c2lnbmFsRGlzY29udGludWl0eSgKKyAgICAgICAgICAgICAgICAgICAgICAgICgodHlwZSAmIDEpID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfVElNRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX0ZPUk1BVENIQU5HRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbVRTUGFyc2VyLT5mZWVkVFNQYWNrZXQoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CisKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJUUyBQYXJzZXIgcmV0dXJuZWQgZXJyb3IgJWQiLCBlcnIpOworCisgICAgICAgICAgICAgICAgICAgIG1UU1BhcnNlci0+c2lnbmFsRU9TKGVycik7CisgICAgICAgICAgICAgICAgICAgIHNldEVycm9yKGVycik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpTdHJlYW1pbmdTb3VyY2U6OnBvc3RSZWFkQnVmZmVyKCkgeworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1CdWZmZXJpbmdMb2NrKTsKKyAgICAgICAgaWYgKG1GaW5hbFJlc3VsdCAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIG1GaW5hbFJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBpZiAobUJ1ZmZlcmluZykgeworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisgICAgICAgIG1CdWZmZXJpbmcgPSB0cnVlOworICAgIH0KKworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRSZWFkQnVmZmVyLCB0aGlzKSktPnBvc3QoKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK2Jvb2wgTnVQbGF5ZXIyOjpTdHJlYW1pbmdTb3VyY2U6OmhhdmVTdWZmaWNpZW50RGF0YU9uQWxsVHJhY2tzKCkgeworICAgIC8vIFdlJ3JlIGdvaW5nIHRvIGJ1ZmZlciBhdCBsZWFzdCAyIHNlY3Mgd29ydGggZGF0YSBvbiBhbGwgdHJhY2tzIGJlZm9yZQorICAgIC8vIHN0YXJ0aW5nIHBsYXliYWNrIChib3RoIGF0IHN0YXJ0dXAgYW5kIGFmdGVyIGEgc2VlaykuCisKKyAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrTWluRHVyYXRpb25VcyA9IDIwMDAwMDBsbDsKKworICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IGF1ZGlvVHJhY2sgPSBnZXRTb3VyY2UodHJ1ZSAvKmF1ZGlvKi8pOworICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHZpZGVvVHJhY2sgPSBnZXRTb3VyY2UoZmFsc2UgLyphdWRpbyovKTsKKworICAgIHN0YXR1c190IGVycjsKKyAgICBpbnQ2NF90IGR1cmF0aW9uVXM7CisgICAgaWYgKGF1ZGlvVHJhY2sgIT0gTlVMTAorICAgICAgICAgICAgJiYgKGR1cmF0aW9uVXMgPSBhdWRpb1RyYWNrLT5nZXRCdWZmZXJlZER1cmF0aW9uVXMoJmVycikpCisgICAgICAgICAgICAgICAgICAgIDwga01pbkR1cmF0aW9uVXMKKyAgICAgICAgICAgICYmIGVyciA9PSBPSykgeworICAgICAgICBBTE9HVigiYXVkaW8gdHJhY2sgZG9lc24ndCBoYXZlIGVub3VnaCBkYXRhIHlldC4gKCUuMmYgc2VjcyBidWZmZXJlZCkiLAorICAgICAgICAgICAgICBkdXJhdGlvblVzIC8gMUU2KTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICh2aWRlb1RyYWNrICE9IE5VTEwKKyAgICAgICAgICAgICYmIChkdXJhdGlvblVzID0gdmlkZW9UcmFjay0+Z2V0QnVmZmVyZWREdXJhdGlvblVzKCZlcnIpKQorICAgICAgICAgICAgICAgICAgICA8IGtNaW5EdXJhdGlvblVzCisgICAgICAgICAgICAmJiBlcnIgPT0gT0spIHsKKyAgICAgICAgQUxPR1YoInZpZGVvIHRyYWNrIGRvZXNuJ3QgaGF2ZSBlbm91Z2ggZGF0YSB5ZXQuICglLjJmIHNlY3MgYnVmZmVyZWQpIiwKKyAgICAgICAgICAgICAgZHVyYXRpb25VcyAvIDFFNik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBOdVBsYXllcjI6OlN0cmVhbWluZ1NvdXJjZTo6c2V0RXJyb3Ioc3RhdHVzX3QgZXJyKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1CdWZmZXJpbmdMb2NrKTsKKyAgICBtRmluYWxSZXN1bHQgPSBlcnI7Cit9CisKK3NwPEFub3RoZXJQYWNrZXRTb3VyY2U+IE51UGxheWVyMjo6U3RyZWFtaW5nU291cmNlOjpnZXRTb3VyY2UoYm9vbCBhdWRpbykgeworICAgIGlmIChtVFNQYXJzZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBzcDxNZWRpYVNvdXJjZT4gc291cmNlID0gbVRTUGFyc2VyLT5nZXRTb3VyY2UoCisgICAgICAgICAgICBhdWRpbyA/IEFUU1BhcnNlcjo6QVVESU8gOiBBVFNQYXJzZXI6OlZJREVPKTsKKworICAgIHJldHVybiBzdGF0aWNfY2FzdDxBbm90aGVyUGFja2V0U291cmNlICo+KHNvdXJjZS5nZXQoKSk7Cit9CisKK3NwPEFNZXNzYWdlPiBOdVBsYXllcjI6OlN0cmVhbWluZ1NvdXJjZTo6Z2V0Rm9ybWF0KGJvb2wgYXVkaW8pIHsKKyAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBzb3VyY2UgPSBnZXRTb3VyY2UoYXVkaW8pOworCisgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdCA9IG5ldyBBTWVzc2FnZTsKKyAgICBpZiAoc291cmNlID09IE5VTEwpIHsKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiZXJyIiwgLUVXT1VMREJMT0NLKTsKKyAgICAgICAgcmV0dXJuIGZvcm1hdDsKKyAgICB9CisKKyAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IHNvdXJjZS0+Z2V0Rm9ybWF0KCk7CisgICAgaWYgKG1ldGEgPT0gTlVMTCkgeworICAgICAgICBmb3JtYXQtPnNldEludDMyKCJlcnIiLCAtRVdPVUxEQkxPQ0spOworICAgICAgICByZXR1cm4gZm9ybWF0OworICAgIH0KKyAgICBzdGF0dXNfdCBlcnIgPSBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2UobWV0YSwgJmZvcm1hdCk7CisgICAgaWYgKGVyciAhPSBPSykgeyAvLyBmb3JtYXQgbWF5IGhhdmUgYmVlbiBjbGVhcmVkIG9uIGVycm9yCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gZm9ybWF0OworfQorCitzdGF0dXNfdCBOdVBsYXllcjI6OlN0cmVhbWluZ1NvdXJjZTo6ZGVxdWV1ZUFjY2Vzc1VuaXQoCisgICAgICAgIGJvb2wgYXVkaW8sIHNwPEFCdWZmZXI+ICphY2Nlc3NVbml0KSB7CisgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gc291cmNlID0gZ2V0U291cmNlKGF1ZGlvKTsKKworICAgIGlmIChzb3VyY2UgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVXT1VMREJMT0NLOworICAgIH0KKworICAgIGlmICghaGF2ZVN1ZmZpY2llbnREYXRhT25BbGxUcmFja3MoKSkgeworICAgICAgICBwb3N0UmVhZEJ1ZmZlcigpOworICAgIH0KKworICAgIHN0YXR1c190IGZpbmFsUmVzdWx0OworICAgIGlmICghc291cmNlLT5oYXNCdWZmZXJBdmFpbGFibGUoJmZpbmFsUmVzdWx0KSkgeworICAgICAgICByZXR1cm4gZmluYWxSZXN1bHQgPT0gT0sgPyAtRVdPVUxEQkxPQ0sgOiBmaW5hbFJlc3VsdDsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBlcnIgPSBzb3VyY2UtPmRlcXVldWVBY2Nlc3NVbml0KGFjY2Vzc1VuaXQpOworCisjaWYgIWRlZmluZWQoTE9HX05ERUJVRykgfHwgTE9HX05ERUJVRyA9PSAwCisgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICBpbnQ2NF90IHRpbWVVczsKKyAgICAgICAgQ0hFQ0soKCphY2Nlc3NVbml0KS0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKKyAgICAgICAgQUxPR1YoImRlcXVldWVBY2Nlc3NVbml0IHRpbWVVcz0lbGxkIHVzIiwgdGltZVVzKTsKKyAgICB9CisjZW5kaWYKKworICAgIHJldHVybiBlcnI7Cit9CisKK2Jvb2wgTnVQbGF5ZXIyOjpTdHJlYW1pbmdTb3VyY2U6OmlzUmVhbFRpbWUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Tb3VyY2UtPmZsYWdzKCkgJiBJU3RyZWFtU291cmNlOjprRmxhZ0lzUmVhbFRpbWVEYXRhOworfQorCit2b2lkIE51UGxheWVyMjo6U3RyZWFtaW5nU291cmNlOjpvbk1lc3NhZ2VSZWNlaXZlZCgKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgICAgIGNhc2Uga1doYXRSZWFkQnVmZmVyOgorICAgICAgICB7CisgICAgICAgICAgICBvblJlYWRCdWZmZXIoKTsKKworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtQnVmZmVyaW5nTG9jayk7CisgICAgICAgICAgICAgICAgbUJ1ZmZlcmluZyA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgICAgVFJFU1BBU1MoKTsKKyAgICAgICAgfQorICAgIH0KK30KKworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9udXBsYXllcjIvU3RyZWFtaW5nU291cmNlLmggYi9tZWRpYS9saWJtZWRpYS9udXBsYXllcjIvU3RyZWFtaW5nU291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI4OWMzOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL251cGxheWVyMi9TdHJlYW1pbmdTb3VyY2UuaApAQCAtMCwwICsxLDc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTVFJFQU1JTkdfU09VUkNFX0hfCisKKyNkZWZpbmUgU1RSRUFNSU5HX1NPVVJDRV9IXworCisjaW5jbHVkZSAiTnVQbGF5ZXIyLmgiCisjaW5jbHVkZSAiTnVQbGF5ZXIyU291cmNlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEFCdWZmZXI7CitzdHJ1Y3QgQVRTUGFyc2VyOworc3RydWN0IEFub3RoZXJQYWNrZXRTb3VyY2U7CisKK3N0cnVjdCBOdVBsYXllcjI6OlN0cmVhbWluZ1NvdXJjZSA6IHB1YmxpYyBOdVBsYXllcjI6OlNvdXJjZSB7CisgICAgU3RyZWFtaW5nU291cmNlKAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCisgICAgICAgICAgICBjb25zdCBzcDxJU3RyZWFtU291cmNlPiAmc291cmNlKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QnVmZmVyaW5nU2V0dGluZ3MoCisgICAgICAgICAgICBCdWZmZXJpbmdTZXR0aW5ncyogYnVmZmVyaW5nIC8qIG5vbm51bGwgKi8pIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QnVmZmVyaW5nU2V0dGluZ3MoY29uc3QgQnVmZmVyaW5nU2V0dGluZ3MmIGJ1ZmZlcmluZykgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIHZvaWQgcHJlcGFyZUFzeW5jKCk7CisgICAgdmlydHVhbCB2b2lkIHN0YXJ0KCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGZlZWRNb3JlVFNEYXRhKCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGRlcXVldWVBY2Nlc3NVbml0KGJvb2wgYXVkaW8sIHNwPEFCdWZmZXI+ICphY2Nlc3NVbml0KTsKKworICAgIHZpcnR1YWwgYm9vbCBpc1JlYWxUaW1lKCkgY29uc3Q7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5TdHJlYW1pbmdTb3VyY2UoKTsKKworICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisKKyAgICB2aXJ0dWFsIHNwPEFNZXNzYWdlPiBnZXRGb3JtYXQoYm9vbCBhdWRpbyk7CisKK3ByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtXaGF0UmVhZEJ1ZmZlciwKKyAgICB9OworICAgIHNwPElTdHJlYW1Tb3VyY2U+IG1Tb3VyY2U7CisgICAgc3RhdHVzX3QgbUZpbmFsUmVzdWx0OworICAgIHNwPFN0cmVhbUxpc3RlbmVyPiBtU3RyZWFtTGlzdGVuZXI7CisgICAgc3A8QVRTUGFyc2VyPiBtVFNQYXJzZXI7CisKKyAgICBib29sIG1CdWZmZXJpbmc7CisgICAgTXV0ZXggbUJ1ZmZlcmluZ0xvY2s7CisgICAgc3A8QUxvb3Blcj4gbUxvb3BlcjsKKworICAgIHZvaWQgc2V0RXJyb3Ioc3RhdHVzX3QgZXJyKTsKKyAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBnZXRTb3VyY2UoYm9vbCBhdWRpbyk7CisgICAgYm9vbCBoYXZlU3VmZmljaWVudERhdGFPbkFsbFRyYWNrcygpOworICAgIHN0YXR1c190IHBvc3RSZWFkQnVmZmVyKCk7CisgICAgdm9pZCBvblJlYWRCdWZmZXIoKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFN0cmVhbWluZ1NvdXJjZSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFNUUkVBTUlOR19TT1VSQ0VfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL0RhdGFTb3VyY2UuY3BwIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvRGF0YVNvdXJjZS5jcHAKaW5kZXggYzIyZTRjYi4uNzI5NTljNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvRGF0YVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvRGF0YVNvdXJjZS5jcHAKQEAgLTE3LDcgKzE3LDYgQEAKICNkZWZpbmUgTE9HX1RBRyAiRGF0YVNvdXJjZSIKIAogI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9JRGF0YVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CkBAIC0xMjQsMTAgKzEyMyw2IEBACiAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwogfQogCi1zcDxJRGF0YVNvdXJjZT4gRGF0YVNvdXJjZTo6Z2V0SURhdGFTb3VyY2UoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci19Ci0KIFN0cmluZzggRGF0YVNvdXJjZTo6Z2V0TUlNRVR5cGUoKSBjb25zdCB7CiAgICAgcmV0dXJuIFN0cmluZzgoImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWVkaWFTb3VyY2UuY3BwIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWVkaWFTb3VyY2UuY3BwCmluZGV4IDgwMzhhNTkuLmE1ZDQxZjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01lZGlhU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYVNvdXJjZS5jcHAKQEAgLTMyLDcgKzMyLDYgQEAKIHZvaWQgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpyZXNldCgpIHsKICAgICBtT3B0aW9ucyA9IDA7CiAgICAgbVNlZWtUaW1lVXMgPSAwOwotICAgIG1MYXRlbmVzc1VzID0gMDsKICAgICBtTm9uQmxvY2tpbmcgPSBmYWxzZTsKIH0KIApAQCAtNjcsMTIgKzY2LDQgQEAKICAgICByZXR1cm4gKG1PcHRpb25zICYga1NlZWtUb19PcHRpb24pICE9IDA7CiB9CiAKLXZvaWQgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpzZXRMYXRlQnkoaW50NjRfdCBsYXRlbmVzc191cykgewotICAgIG1MYXRlbmVzc1VzID0gbGF0ZW5lc3NfdXM7Ci19Ci0KLWludDY0X3QgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpnZXRMYXRlQnkoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1MYXRlbmVzc1VzOwotfQotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlLmggYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2UuaAppbmRleCBlOTE3ZjRlLi40NGY5NGEwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2UuaApAQCAtMTAyLDcgKzEwMiw2IEBACiAgICAgdmlydHVhbCBzcDxEZWNyeXB0SGFuZGxlPiBEcm1Jbml0aWFsaXphdGlvbihjb25zdCBjaGFyICogLyptaW1lKi8gPSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQgZ2V0RHJtSW5mbyhzcDxEZWNyeXB0SGFuZGxlPiAmLypoYW5kbGUqLywgRHJtTWFuYWdlckNsaWVudCAqKiAvKmNsaWVudCovKSB7fTsKIAogICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRVcmkoKSB7CiAgICAgICAgIHJldHVybiBTdHJpbmc4KCk7CkBAIC0xMTIsOSArMTExLDYgQEAKIAogICAgIHZpcnR1YWwgdm9pZCBjbG9zZSgpIHt9OwogCi0gICAgLy8gcmV0dXJucyBhIHBvaW50ZXIgdG8gSURhdGFTb3VyY2UgaWYgaXQgaXMgd3JhcHBlZC4KLSAgICB2aXJ0dWFsIHNwPElEYXRhU291cmNlPiBnZXRJRGF0YVNvdXJjZSgpIGNvbnN0OwotCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+RGF0YVNvdXJjZSgpIHt9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvTWVkaWFTb3VyY2UuaCBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvTWVkaWFTb3VyY2UuaAppbmRleCA1MDQ2NTNiLi45OGIxMzZiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL01lZGlhU291cmNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9NZWRpYVNvdXJjZS5oCkBAIC03MiwxMCArNzIsNiBAQAogICAgICAgICB2b2lkIGNsZWFyU2Vla1RvKCk7CiAgICAgICAgIGJvb2wgZ2V0U2Vla1RvKGludDY0X3QgKnRpbWVfdXMsIFNlZWtNb2RlICptb2RlKSBjb25zdDsKIAotICAgICAgICAvLyBUT0RPOiByZW1vdmUgdGhpcyBpZiB1bnVzZWQuCi0gICAgICAgIHZvaWQgc2V0TGF0ZUJ5KGludDY0X3QgbGF0ZW5lc3NfdXMpOwotICAgICAgICBpbnQ2NF90IGdldExhdGVCeSgpIGNvbnN0OwotCiAgICAgICAgIHZvaWQgc2V0Tm9uQmxvY2tpbmcoKTsKICAgICAgICAgdm9pZCBjbGVhck5vbkJsb2NraW5nKCk7CiAgICAgICAgIGJvb2wgZ2V0Tm9uQmxvY2tpbmcoKSBjb25zdDsKQEAgLTkzLDcgKzg5LDYgQEAKICAgICAgICAgdWludDMyX3QgbU9wdGlvbnM7CiAgICAgICAgIGludDY0X3QgbVNlZWtUaW1lVXM7CiAgICAgICAgIFNlZWtNb2RlIG1TZWVrTW9kZTsKLSAgICAgICAgaW50NjRfdCBtTGF0ZW5lc3NVczsKICAgICAgICAgYm9vbCBtTm9uQmxvY2tpbmc7CiAgICAgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsgLy8gc2VudCB0aHJvdWdoIEJpbmRlcgogCkBAIC0xMTUsMTUgKzExMCw2IEBACiAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKICAgICB9CiAKLSAgICAvLyBUaGUgY29uc3VtZXIgb2YgdGhpcyBtZWRpYSBzb3VyY2UgcmVxdWVzdHMgdGhhdCB0aGUgZ2l2ZW4gYnVmZmVycwotICAgIC8vIGFyZSB0byBiZSByZXR1cm5lZCBleGNsdXNpdmVseSBpbiByZXNwb25zZSB0byByZWFkIGNhbGxzLgotICAgIC8vIFRoaXMgd2lsbCBiZSBjYWxsZWQgYWZ0ZXIgYSBzdWNjZXNzZnVsIHN0YXJ0KCkgYW5kIGJlZm9yZSB0aGUKLSAgICAvLyBmaXJzdCByZWFkKCkgY2FsbC4KLSAgICAvLyBDYWxsZWUgYXNzdW1lcyBvd25lcnNoaXAgb2YgdGhlIGJ1ZmZlcnMgaWYgbm8gZXJyb3IgaXMgcmV0dXJuZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRCdWZmZXJzKGNvbnN0IFZlY3RvcjxNZWRpYUJ1ZmZlciAqPiAmIC8qIGJ1ZmZlcnMgKi8pIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwotICAgIH0KLQogICAgIC8vIFRoZSBjb25zdW1lciBvZiB0aGlzIG1lZGlhIHNvdXJjZSByZXF1ZXN0cyB0aGUgc291cmNlIHN0b3BzIHNlbmRpbmcKICAgICAvLyBidWZmZXJzIHdpdGggdGltZXN0YW1wIGxhcmdlciB0aGFuIG9yIGVxdWFsIHRvIHN0b3BUaW1lVXMuIHN0b3BUaW1lVXMKICAgICAvLyBtdXN0IGJlIGluIHRoZSBzYW1lIHRpbWUgYmFzZSBhcyB0aGUgc3RhcnRUaW1lIHBhc3NlZCBpbiBzdGFydCgpLiBJZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyRmFjdG9yeS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJGYWN0b3J5LmNwcAppbmRleCAwNTVkNWFiLi4zMjA5YzZkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJGYWN0b3J5LmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJGYWN0b3J5LmNwcApAQCAtMTI2LDcgKzEyNiw3IEBACiAKIHNwPE1lZGlhUGxheWVyQmFzZT4gTWVkaWFQbGF5ZXJGYWN0b3J5OjpjcmVhdGVQbGF5ZXIoCiAgICAgICAgIHBsYXllcl90eXBlIHBsYXllclR5cGUsCi0gICAgICAgIHZvaWQqIGNvb2tpZSwKKyAgICAgICAgY29uc3Qgd3A8SU1lZGlhUGxheWVyPiAmY2xpZW50LAogICAgICAgICBub3RpZnlfY2FsbGJhY2tfZiBub3RpZnlGdW5jLAogICAgICAgICBwaWRfdCBwaWQpIHsKICAgICBzcDxNZWRpYVBsYXllckJhc2U+IHA7CkBAIC0xNTIsNyArMTUyLDcgQEAKIAogICAgIGluaXRfcmVzdWx0ID0gcC0+aW5pdENoZWNrKCk7CiAgICAgaWYgKGluaXRfcmVzdWx0ID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIHAtPnNldE5vdGlmeUNhbGxiYWNrKGNvb2tpZSwgbm90aWZ5RnVuYyk7CisgICAgICAgIHAtPnNldE5vdGlmeUNhbGxiYWNrKGNsaWVudCwgbm90aWZ5RnVuYyk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjcmVhdGUgcGxheWVyIG9iamVjdCBvZiB0eXBlICVkLCBpbml0Q2hlY2sgZmFpbGVkIgogICAgICAgICAgICAgICAiIChyZXMgPSAlZCkiLCBwbGF5ZXJUeXBlLCBpbml0X3Jlc3VsdCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJGYWN0b3J5LmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJGYWN0b3J5LmgKaW5kZXggZTIyYTU2Zi4uNmFlZGViMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyRmFjdG9yeS5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllckZhY3RvcnkuaApAQCAtNjUsNyArNjUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UpOwogCiAgICAgc3RhdGljIHNwPE1lZGlhUGxheWVyQmFzZT4gY3JlYXRlUGxheWVyKHBsYXllcl90eXBlIHBsYXllclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNvb2tpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd3A8SU1lZGlhUGxheWVyPiAmY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlfY2FsbGJhY2tfZiBub3RpZnlGdW5jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwCmluZGV4IDQ5NWM0MTguLjg4MjIxZWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwCkBAIC0xNDIxLDEyICsxNDIxLDEzIEBACiB9CiAKIHZvaWQgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpDbGllbnQ6Om5vdGlmeSgKLSAgICAgICAgdm9pZCogY29va2llLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqb2JqKQorICAgICAgICBjb25zdCB3cDxJTWVkaWFQbGF5ZXI+ICZsaXN0ZW5lciwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKm9iaikKIHsKLSAgICBDbGllbnQqIGNsaWVudCA9IHN0YXRpY19jYXN0PENsaWVudCo+KGNvb2tpZSk7Ci0gICAgaWYgKGNsaWVudCA9PSBOVUxMKSB7CisgICAgc3A8SU1lZGlhUGxheWVyPiBzcExpc3RlbmVyID0gbGlzdGVuZXIucHJvbW90ZSgpOworICAgIGlmIChzcExpc3RlbmVyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KKyAgICBDbGllbnQqIGNsaWVudCA9IHN0YXRpY19jYXN0PENsaWVudCo+KHNwTGlzdGVuZXIuZ2V0KCkpOwogCiAgICAgc3A8SU1lZGlhUGxheWVyQ2xpZW50PiBjOwogICAgIHNwPENsaWVudD4gbmV4dENsaWVudDsKQEAgLTE0NzQsNyArMTQ3NSw3IEBACiAgICAgfQogCiAgICAgaWYgKGMgIT0gTlVMTCkgewotICAgICAgICBBTE9HVigiWyVkXSBub3RpZnkgKCVwLCAlZCwgJWQsICVkKSIsIGNsaWVudC0+bUNvbm5JZCwgY29va2llLCBtc2csIGV4dDEsIGV4dDIpOworICAgICAgICBBTE9HVigiWyVkXSBub3RpZnkgKCVwLCAlZCwgJWQsICVkKSIsIGNsaWVudC0+bUNvbm5JZCwgc3BMaXN0ZW5lci5nZXQoKSwgbXNnLCBleHQxLCBleHQyKTsKICAgICAgICAgYy0+bm90aWZ5KG1zZywgZXh0MSwgZXh0Miwgb2JqKTsKICAgICB9CiB9CkBAIC0xNTY4LDcgKzE1NjksNyBAQAogI2lmIENBTExCQUNLX0FOVEFHT05JWkVSCiBjb25zdCBpbnQgQW50YWdvbml6ZXI6OmludGVydmFsID0gMTAwMDA7IC8vIDEwIG1zZWNzCiAKLUFudGFnb25pemVyOjpBbnRhZ29uaXplcihub3RpZnlfY2FsbGJhY2tfZiBjYiwgdm9pZCogY2xpZW50KSA6CitBbnRhZ29uaXplcjo6QW50YWdvbml6ZXIobm90aWZ5X2NhbGxiYWNrX2YgY2IsIGNvbnN0IHdwPElNZWRpYVBsYXllcj4gJmNsaWVudCkgOgogICAgIG1FeGl0KGZhbHNlKSwgbUFjdGl2ZShmYWxzZSksIG1DbGllbnQoY2xpZW50KSwgbUNiKGNiKQogewogICAgIGNyZWF0ZVRocmVhZChjYWxsYmFja1RocmVhZCwgdGhpcyk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmgKaW5kZXggZWVmZGQ3ZC4uNThlZmE4YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuaApAQCAtNTEsNyArNTEsNyBAQAogI2lmIENBTExCQUNLX0FOVEFHT05JWkVSCiBjbGFzcyBBbnRhZ29uaXplciB7CiBwdWJsaWM6Ci0gICAgQW50YWdvbml6ZXIobm90aWZ5X2NhbGxiYWNrX2YgY2IsIHZvaWQqIGNsaWVudCk7CisgICAgQW50YWdvbml6ZXIobm90aWZ5X2NhbGxiYWNrX2YgY2IsIGNvbnN0IHdwPElNZWRpYVBsYXllcj4gJmNsaWVudCk7CiAgICAgdm9pZCBzdGFydCgpIHsgbUFjdGl2ZSA9IHRydWU7IH0KICAgICB2b2lkIHN0b3AoKSB7IG1BY3RpdmUgPSBmYWxzZTsgfQogICAgIHZvaWQga2lsbCgpOwpAQCAtNjMsNyArNjMsNyBAQAogICAgIENvbmRpdGlvbiAgICAgICAgICAgbUNvbmRpdGlvbjsKICAgICBib29sICAgICAgICAgICAgICAgIG1FeGl0OwogICAgIGJvb2wgICAgICAgICAgICAgICAgbUFjdGl2ZTsKLSAgICB2b2lkKiAgICAgICAgICAgICAgIG1DbGllbnQ7CisgICAgd3A8SU1lZGlhUGxheWVyPiAgICBtQ2xpZW50OwogICAgIG5vdGlmeV9jYWxsYmFja19mICAgbUNiOwogfTsKICNlbmRpZgpAQCAtMzc3LDcgKzM3Nyw3IEBACiAgICAgICAgIHN0YXR1c190ICAgICAgICAgICAgICAgIHNldERhdGFTb3VyY2VfcG9zdChjb25zdCBzcDxNZWRpYVBsYXllckJhc2U+JiBwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzKTsKIAotICAgICAgICBzdGF0aWMgIHZvaWQgICAgICAgICAgICBub3RpZnkodm9pZCogY29va2llLCBpbnQgbXNnLAorICAgICAgICBzdGF0aWMgIHZvaWQgICAgICAgICAgICBub3RpZnkoY29uc3Qgd3A8SU1lZGlhUGxheWVyPiAmY29va2llLCBpbnQgbXNnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKm9iaik7CiAKICAgICAgICAgICAgICAgICBwaWRfdCAgICAgICAgICAgcGlkKCkgY29uc3QgeyByZXR1cm4gbVBpZDsgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL2luY2x1ZGUvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9pbmNsdWRlL01lZGlhUGxheWVySW50ZXJmYWNlLmgKaW5kZXggYTAzODg0Zi4uNGIzM2U2MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL2luY2x1ZGUvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvaW5jbHVkZS9NZWRpYVBsYXllckludGVyZmFjZS5oCkBAIC02Nyw3ICs2Nyw3IEBACiAjZGVmaW5lIEFVRElPX1NJTktfTUlOX0RFRVBfQlVGRkVSX0RVUkFUSU9OX1VTIDUwMDAwMDAKIAogLy8gY2FsbGJhY2sgbWVjaGFuaXNtIGZvciBwYXNzaW5nIG1lc3NhZ2VzIHRvIE1lZGlhUGxheWVyIG9iamVjdAotdHlwZWRlZiB2b2lkICgqbm90aWZ5X2NhbGxiYWNrX2YpKHZvaWQqIGNvb2tpZSwKK3R5cGVkZWYgdm9pZCAoKm5vdGlmeV9jYWxsYmFja19mKShjb25zdCB3cDxJTWVkaWFQbGF5ZXI+ICZsaXN0ZW5lciwKICAgICAgICAgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKm9iaik7CiAKIC8vIGFic3RyYWN0IGJhc2UgY2xhc3MgLSB1c2UgTWVkaWFQbGF5ZXJJbnRlcmZhY2UKQEAgLTE1Nyw3ICsxNTcsNyBAQAogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soYm9vbCBlbmFibGVkKTsKICAgICB9OwogCi0gICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVBsYXllckJhc2UoKSA6IG1Db29raWUoMCksIG1Ob3RpZnkoMCkge30KKyAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyQmFzZSgpIDogbUNsaWVudCgwKSwgbU5vdGlmeSgwKSB7fQogICAgIHZpcnR1YWwgICAgICAgICAgICAgfk1lZGlhUGxheWVyQmFzZSgpIHt9CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBpbml0Q2hlY2soKSA9IDA7CiAgICAgdmlydHVhbCBib29sICAgICAgICBoYXJkd2FyZU91dHB1dCgpID0gMDsKQEAgLTI3MSwyMiArMjcxLDIyIEBACiAgICAgfTsKIAogICAgIHZvaWQgICAgICAgIHNldE5vdGlmeUNhbGxiYWNrKAotICAgICAgICAgICAgdm9pZCogY29va2llLCBub3RpZnlfY2FsbGJhY2tfZiBub3RpZnlGdW5jKSB7CisgICAgICAgICAgICBjb25zdCB3cDxJTWVkaWFQbGF5ZXI+ICZjbGllbnQsIG5vdGlmeV9jYWxsYmFja19mIG5vdGlmeUZ1bmMpIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Ob3RpZnlMb2NrKTsKLSAgICAgICAgbUNvb2tpZSA9IGNvb2tpZTsgbU5vdGlmeSA9IG5vdGlmeUZ1bmM7CisgICAgICAgIG1DbGllbnQgPSBjbGllbnQ7IG1Ob3RpZnkgPSBub3RpZnlGdW5jOwogICAgIH0KIAogICAgIHZvaWQgICAgICAgIHNlbmRFdmVudChpbnQgbXNnLCBpbnQgZXh0MT0wLCBpbnQgZXh0Mj0wLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwgKm9iaj1OVUxMKSB7CiAgICAgICAgIG5vdGlmeV9jYWxsYmFja19mIG5vdGlmeUNCOwotICAgICAgICB2b2lkKiBjb29raWU7CisgICAgICAgIHdwPElNZWRpYVBsYXllcj4gY2xpZW50OwogICAgICAgICB7CiAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU5vdGlmeUxvY2spOwogICAgICAgICAgICAgbm90aWZ5Q0IgPSBtTm90aWZ5OwotICAgICAgICAgICAgY29va2llID0gbUNvb2tpZTsKKyAgICAgICAgICAgIGNsaWVudCA9IG1DbGllbnQ7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAobm90aWZ5Q0IpIG5vdGlmeUNCKGNvb2tpZSwgbXNnLCBleHQxLCBleHQyLCBvYmopOworICAgICAgICBpZiAobm90aWZ5Q0IpIG5vdGlmeUNCKGNsaWVudCwgbXNnLCBleHQxLCBleHQyLCBvYmopOwogICAgIH0KIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgLyogZmQgKi8sIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIC8qIGFyZ3MgKi8pIGNvbnN0IHsKQEAgLTMwNSw3ICszMDUsNyBAQAogICAgIGZyaWVuZCBjbGFzcyBNZWRpYVBsYXllclNlcnZpY2U7CiAKICAgICBNdXRleCAgICAgICAgICAgICAgIG1Ob3RpZnlMb2NrOwotICAgIHZvaWQqICAgICAgICAgICAgICAgbUNvb2tpZTsKKyAgICB3cDxJTWVkaWFQbGF5ZXI+ICAgIG1DbGllbnQ7CiAgICAgbm90aWZ5X2NhbGxiYWNrX2YgICBtTm90aWZ5OwogfTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0dlbmVyaWNTb3VyY2UuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0dlbmVyaWNTb3VyY2UuY3BwCmluZGV4IGEzZjRlZmIuLjMzYzMwOTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9HZW5lcmljU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvR2VuZXJpY1NvdXJjZS5jcHAKQEAgLTI2LDcgKzI2LDYgQEAKICNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUV4dHJhY3RvclNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CkBAIC0xNjEsMTUgKzE2MCwzMCBAQAogCiBzdGF0dXNfdCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6aW5pdEZyb21EYXRhU291cmNlKCkgewogICAgIHNwPElNZWRpYUV4dHJhY3Rvcj4gZXh0cmFjdG9yOwotICAgIENIRUNLKG1EYXRhU291cmNlICE9IE5VTEwpOworICAgIENIRUNLKG1EYXRhU291cmNlICE9IE5VTEwgfHwgbUZkICE9IC0xKTsKICAgICBzcDxEYXRhU291cmNlPiBkYXRhU291cmNlID0gbURhdGFTb3VyY2U7CisgICAgY29uc3QgaW50IGZkID0gbUZkOworICAgIGNvbnN0IGludDY0X3Qgb2Zmc2V0ID0gbU9mZnNldDsKKyAgICBjb25zdCBpbnQ2NF90IGxlbmd0aCA9IG1MZW5ndGg7CiAKICAgICBtTG9jay51bmxvY2soKTsKICAgICAvLyBUaGlzIG1pZ2h0IHRha2UgbG9uZyB0aW1lIGlmIGRhdGEgc291cmNlIGlzIG5vdCByZWxpYWJsZS4KLSAgICBleHRyYWN0b3IgPSBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OkNyZWF0ZShkYXRhU291cmNlLCBOVUxMKTsKKyAgICBpZiAoZGF0YVNvdXJjZSAhPSBudWxscHRyKSB7CisgICAgICAgIGV4dHJhY3RvciA9IE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6Q3JlYXRlKGRhdGFTb3VyY2UsIE5VTEwgLyogbWltZSAqLyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZXh0cmFjdG9yID0gTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpDcmVhdGVGcm9tRmQoCisgICAgICAgICAgICAgICAgZmQsIG9mZnNldCwgbGVuZ3RoLCBOVUxMIC8qIG1pbWUgKi8sICZkYXRhU291cmNlKTsKKyAgICB9CisKKyAgICBpZiAoZGF0YVNvdXJjZSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJpbml0RnJvbURhdGFTb3VyY2UsIGZhaWxlZCB0byBjcmVhdGUgZGF0YSBzb3VyY2UhIik7CisgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQogCiAgICAgaWYgKGV4dHJhY3RvciA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJpbml0RnJvbURhdGFTb3VyY2UsIGNhbm5vdCBjcmVhdGUgZXh0cmFjdG9yISIpOworICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KIApAQCAtMTc4LDEwICsxOTIsMTMgQEAKICAgICBzaXplX3QgbnVtdHJhY2tzID0gZXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOwogICAgIGlmIChudW10cmFja3MgPT0gMCkgewogICAgICAgICBBTE9HRSgiaW5pdEZyb21EYXRhU291cmNlLCBzb3VyY2UgaGFzIG5vIHRyYWNrISIpOworICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KIAogICAgIG1Mb2NrLmxvY2soKTsKKyAgICBtRmQgPSAtMTsKKyAgICBtRGF0YVNvdXJjZSA9IGRhdGFTb3VyY2U7CiAgICAgbUZpbGVNZXRhID0gZmlsZU1ldGE7CiAgICAgaWYgKG1GaWxlTWV0YSAhPSBOVUxMKSB7CiAgICAgICAgIGludDY0X3QgZHVyYXRpb247CkBAIC0zMjQsMTUgKzM0MSw2IEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6c2V0QnVmZmVycygKLSAgICAgICAgYm9vbCBhdWRpbywgVmVjdG9yPE1lZGlhQnVmZmVyICo+ICZidWZmZXJzKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobUlzU2VjdXJlICYmICFhdWRpbyAmJiBtVmlkZW9UcmFjay5tU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIG1WaWRlb1RyYWNrLm1Tb3VyY2UtPnNldEJ1ZmZlcnMoYnVmZmVycyk7Ci0gICAgfQotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQogYm9vbCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6aXNTdHJlYW1pbmcoKSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICByZXR1cm4gbUlzU3RyZWFtaW5nOwpAQCAtMzk0LDUxICs0MDIsMTUgQEAKICAgICAgICAgICAgIGlmICghbURpc2Nvbm5lY3RlZCkgewogICAgICAgICAgICAgICAgIG1EYXRhU291cmNlID0gZGF0YVNvdXJjZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChwcm9wZXJ0eV9nZXRfYm9vbCgibWVkaWEuc3RhZ2VmcmlnaHQuZXh0cmFjdHJlbW90ZSIsIHRydWUpICYmCi0gICAgICAgICAgICAgICAgICAgICFGaWxlU291cmNlOjpyZXF1aXJlc0RybShtRmQsIG1PZmZzZXQsIG1MZW5ndGgsIG51bGxwdHIgLyogbWltZSAqLykpIHsKLSAgICAgICAgICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCktPmdldFNlcnZpY2UoU3RyaW5nMTYoIm1lZGlhLmV4dHJhY3RvciIpKTsKLSAgICAgICAgICAgICAgICBpZiAoYmluZGVyICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0QoIkZpbGVTb3VyY2UgcmVtb3RlIik7Ci0gICAgICAgICAgICAgICAgICAgIHNwPElNZWRpYUV4dHJhY3RvclNlcnZpY2U+IG1lZGlhRXhTZXJ2aWNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9jYXN0PElNZWRpYUV4dHJhY3RvclNlcnZpY2U+KGJpbmRlcikpOwotICAgICAgICAgICAgICAgICAgICBzcDxJRGF0YVNvdXJjZT4gc291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUV4U2VydmljZS0+bWFrZUlEYXRhU291cmNlKG1GZCwgbU9mZnNldCwgbUxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJJRGF0YVNvdXJjZShGaWxlU291cmNlKTogJXAgJWQgJWxsZCAlbGxkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UuZ2V0KCksIG1GZCwgKGxvbmcgbG9uZyltT2Zmc2V0LCAobG9uZyBsb25nKW1MZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlLmdldCgpICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1EYXRhU291cmNlID0gQ3JlYXRlRGF0YVNvdXJjZUZyb21JRGF0YVNvdXJjZShzb3VyY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDbG9zZSB0aGUgbG9jYWwgZmlsZSBkZXNjcmlwdG9yIGFzIGl0IGlzIG5vdCBuZWVkZWQgYW55bW9yZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZShtRmQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GZCA9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coImV4dHJhY3RvciBzZXJ2aWNlIGNhbm5vdCBtYWtlIGRhdGEgc291cmNlIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygiZXh0cmFjdG9yIHNlcnZpY2Ugbm90IHJ1bm5pbmciKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobURhdGFTb3VyY2UgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIEFMT0dEKCJGaWxlU291cmNlIGxvY2FsIik7Ci0gICAgICAgICAgICAgICAgbURhdGFTb3VyY2UgPSBuZXcgRmlsZVNvdXJjZShtRmQsIG1PZmZzZXQsIG1MZW5ndGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gVE9ETzogY2xvc2Ugc2hvdWxkIGFsd2F5cyBiZSBkb25lIG9uIG1GZCwgc2VlIHRoZSBsaW5lcyBmb2xsb3dpbmcKLSAgICAgICAgICAgIC8vIENyZWF0ZURhdGFTb3VyY2VGcm9tSURhdGFTb3VyY2UgYWJvdmUsCi0gICAgICAgICAgICAvLyBhbmQgdGhlIEZpbGVTb3VyY2UgY29uc3RydWN0b3Igc2hvdWxkIGR1cCB0aGUgbUZkIGFyZ3VtZW50IGFzIG5lZWRlZC4KLSAgICAgICAgICAgIG1GZCA9IC0xOwogICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1EYXRhU291cmNlID09IE5VTEwpIHsKKyAgICAgICAgaWYgKG1GZCA9PSAtMSAmJiBtRGF0YVNvdXJjZSA9PSBOVUxMKSB7CiAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNyZWF0ZSBkYXRhIHNvdXJjZSEiKTsKICAgICAgICAgICAgIG5vdGlmeVByZXBhcmVkQW5kQ2xlYW51cChVTktOT1dOX0VSUk9SKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChtRGF0YVNvdXJjZS0+ZmxhZ3MoKSAmIERhdGFTb3VyY2U6OmtJc0NhY2hpbmdEYXRhU291cmNlKSB7CisgICAgaWYgKG1EYXRhU291cmNlICE9IG51bGxwdHIgJiYgbURhdGFTb3VyY2UtPmZsYWdzKCkgJiBEYXRhU291cmNlOjprSXNDYWNoaW5nRGF0YVNvdXJjZSkgewogICAgICAgICBtQ2FjaGVkU291cmNlID0gc3RhdGljX2Nhc3Q8TnVDYWNoZWRTb3VyY2UyICo+KG1EYXRhU291cmNlLmdldCgpKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9HZW5lcmljU291cmNlLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvR2VuZXJpY1NvdXJjZS5oCmluZGV4IGNiOWMyN2YuLjg1NmYwM2IgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9HZW5lcmljU291cmNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0dlbmVyaWNTb3VyY2UuaApAQCAtODIsOCArODIsNiBAQAogICAgICAgICBpbnQ2NF90IHNlZWtUaW1lVXMsCiAgICAgICAgIE1lZGlhUGxheWVyU2Vla01vZGUgbW9kZSA9IE1lZGlhUGxheWVyU2Vla01vZGU6OlNFRUtfUFJFVklPVVNfU1lOQykgb3ZlcnJpZGU7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEJ1ZmZlcnMoYm9vbCBhdWRpbywgVmVjdG9yPE1lZGlhQnVmZmVyICo+ICZidWZmZXJzKTsKLQogICAgIHZpcnR1YWwgYm9vbCBpc1N0cmVhbWluZygpIGNvbnN0OwogCiAgICAgLy8gTW9kdWxhciBEUk0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5jcHAKaW5kZXggYTg0ZDBlNS4uMWIwMmFkYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5jcHAKQEAgLTc1Miw2ICs3NTIsOCBAQAogICAgICAgICByZXBseS0+c2V0SW50MzIoImVvcyIsIHRydWUpOwogICAgIH0KIAorICAgIG1OdW1GcmFtZXNUb3RhbCArPSAhbUlzQXVkaW87CisKICAgICBpZiAobVNraXBSZW5kZXJpbmdVbnRpbE1lZGlhVGltZVVzID49IDApIHsKICAgICAgICAgaWYgKHRpbWVVcyA8IG1Ta2lwUmVuZGVyaW5nVW50aWxNZWRpYVRpbWVVcykgewogICAgICAgICAgICAgQUxPR1YoIlslc10gZHJvcHBpbmcgYnVmZmVyIGF0IHRpbWUgJWxsZCBhcyByZXF1ZXN0ZWQuIiwKQEAgLTc3MCw4ICs3NzIsNiBAQAogICAgICAgICBtU2tpcFJlbmRlcmluZ1VudGlsTWVkaWFUaW1lVXMgPSAtMTsKICAgICB9CiAKLSAgICBtTnVtRnJhbWVzVG90YWwgKz0gIW1Jc0F1ZGlvOwotCiAgICAgLy8gd2FpdCB1bnRpbCAxc3QgZnJhbWUgY29tZXMgb3V0IHRvIHNpZ25hbCByZXN1bWUgY29tcGxldGUKICAgICBub3RpZnlSZXN1bWVDb21wbGV0ZUlmTmVjZXNzYXJ5KCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuY3BwCmluZGV4IGViZjU3YzYuLjhhYTA2ZmMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmNwcApAQCAtNTUsNiArNTUsNyBAQAogc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJQbGF5aW5nID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIucGxheWluZ01zIjsKIHN0YXRpYyBjb25zdCBjaGFyICprUGxheWVyRXJyb3IgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5lcnIiOwogc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJFcnJvckNvZGUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5lcnJjb2RlIjsKK3N0YXRpYyBjb25zdCBjaGFyICprUGxheWVyRXJyb3JTdGF0ZSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmVycnN0YXRlIjsKIHN0YXRpYyBjb25zdCBjaGFyICprUGxheWVyRGF0YVNvdXJjZVR5cGUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5kYXRhU291cmNlIjsKIC8vCiBzdGF0aWMgY29uc3QgY2hhciAqa1BsYXllclJlYnVmZmVyaW5nID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIucmVidWZmZXJpbmdNcyI7CkBAIC05OTMsNiArOTk0LDcgQEAKICAgICAgICAgICAgICAgICBpZiAoZXh0MiAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrUGxheWVyRXJyb3JDb2RlLCBleHQyKTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldENTdHJpbmcoa1BsYXllckVycm9yU3RhdGUsIHN0YXRlU3RyaW5nKG1TdGF0ZSkuY19zdHIoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtQXRFT1MgPSB0cnVlOwogICAgICAgICAgICAgYnJlYWs7CkBAIC0xMDg5LDQgKzEwOTEsMzAgQEAKICAgICByZXR1cm4gcmV0OwogfQogCitzdGQ6OnN0cmluZyBOdVBsYXllckRyaXZlcjo6c3RhdGVTdHJpbmcoU3RhdGUgc3RhdGUpIHsKKyAgICBjb25zdCBjaGFyICpydmFsID0gTlVMTDsKKyAgICBjaGFyIHJhd2J1ZmZlclsxNl07ICAvLyBhbGxvd3MgIiVkIgorCisgICAgc3dpdGNoIChzdGF0ZSkgeworICAgICAgICBjYXNlIFNUQVRFX0lETEU6IHJ2YWwgPSAiSURMRSI7IGJyZWFrOworICAgICAgICBjYXNlIFNUQVRFX1NFVF9EQVRBU09VUkNFX1BFTkRJTkc6IHJ2YWwgPSAiU0VUX0RBVEFTT1VSQ0VfUEVORElORyI7IGJyZWFrOworICAgICAgICBjYXNlIFNUQVRFX1VOUFJFUEFSRUQ6IHJ2YWwgPSAiVU5QUkVQQVJFRCI7IGJyZWFrOworICAgICAgICBjYXNlIFNUQVRFX1BSRVBBUklORzogcnZhbCA9ICJQUkVQQVJJTkciOyBicmVhazsKKyAgICAgICAgY2FzZSBTVEFURV9QUkVQQVJFRDogcnZhbCA9ICJQUkVQQVJFRCI7IGJyZWFrOworICAgICAgICBjYXNlIFNUQVRFX1JVTk5JTkc6IHJ2YWwgPSAiUlVOTklORyI7IGJyZWFrOworICAgICAgICBjYXNlIFNUQVRFX1BBVVNFRDogcnZhbCA9ICJQQVVTRUQiOyBicmVhazsKKyAgICAgICAgY2FzZSBTVEFURV9SRVNFVF9JTl9QUk9HUkVTUzogcnZhbCA9ICJSRVNFVF9JTl9QUk9HUkVTUyI7IGJyZWFrOworICAgICAgICBjYXNlIFNUQVRFX1NUT1BQRUQ6IHJ2YWwgPSAiU1RPUFBFRCI7IGJyZWFrOworICAgICAgICBjYXNlIFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUklORzogcnZhbCA9ICJTVE9QUEVEX0FORF9QUkVQQVJJTkciOyBicmVhazsKKyAgICAgICAgY2FzZSBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJFRDogcnZhbCA9ICJTVE9QUEVEX0FORF9QUkVQQVJFRCI7IGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLy8geWVzLCB0aGlzIGJ1ZmZlciBpcyBzaGFyZWQgYW5kIHZ1bG5lcmFibGUgdG8gcmFjZXMKKyAgICAgICAgICAgIHNucHJpbnRmKHJhd2J1ZmZlciwgc2l6ZW9mKHJhd2J1ZmZlciksICIlZCIsIHN0YXRlKTsKKyAgICAgICAgICAgIHJ2YWwgPSByYXdidWZmZXI7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gcnZhbDsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmgKaW5kZXggMTNiNDZjMy4uYWQ4NzhmOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmgKQEAgLTExMyw2ICsxMTMsOCBAQAogICAgICAgICBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJFRCwgICAgIC8vIGVxdWl2YWxlbnQgdG8gUEFVU0VELCBidXQgc2VlayBjb21wbGV0ZQogICAgIH07CiAKKyAgICBzdGQ6OnN0cmluZyBzdGF0ZVN0cmluZyhTdGF0ZSBzdGF0ZSk7CisKICAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOwogICAgIENvbmRpdGlvbiBtQ29uZGl0aW9uOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJTb3VyY2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclNvdXJjZS5oCmluZGV4IDJkZjVlODguLjlmNWVmNzggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclNvdXJjZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclNvdXJjZS5oCkBAIC0xMjEsMTAgKzEyMSw2IEBACiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEJ1ZmZlcnMoYm9vbCAvKiBhdWRpbyAqLywgVmVjdG9yPE1lZGlhQnVmZmVyICo+ICYvKiBidWZmZXJzICovKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KICAgICB2aXJ0dWFsIGJvb2wgaXNSZWFsVGltZSgpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9TdHJlYW1pbmdTb3VyY2UuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1N0cmVhbWluZ1NvdXJjZS5jcHAKaW5kZXggMzg4Y2EyMC4uYjNkYTUzZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1N0cmVhbWluZ1NvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1N0cmVhbWluZ1NvdXJjZS5jcHAKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhS2V5cy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KIApAQCAtMTE0LDcgKzExNSw3IEBACiAgICAgICAgICAgICBpbnQzMl90IG1hc2s7CiAgICAgICAgICAgICBpZiAoZXh0cmEgIT0gTlVMTAogICAgICAgICAgICAgICAgICAgICAmJiBleHRyYS0+ZmluZEludDMyKAotICAgICAgICAgICAgICAgICAgICAgICAgSVN0cmVhbUxpc3RlbmVyOjprS2V5RGlzY29udGludWl0eU1hc2ssICZtYXNrKSkgeworICAgICAgICAgICAgICAgICAgICAgICAga0lTdHJlYW1MaXN0ZW5lcktleURpc2NvbnRpbnVpdHlNYXNrLCAmbWFzaykpIHsKICAgICAgICAgICAgICAgICBpZiAobWFzayA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDbGllbnQgc3BlY2lmaWVkIGFuIGlsbGVnYWwgZGlzY29udGludWl0eSB0eXBlLiIpOwogICAgICAgICAgICAgICAgICAgICBzZXRFcnJvcihFUlJPUl9VTlNVUFBPUlRFRCk7CkBAIC0xNDIsNyArMTQzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBtZWRpYVRpbWVVczsKICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCZtZWRpYVRpbWVVcywgJmJ1ZmZlclsyXSwgc2l6ZW9mKG1lZGlhVGltZVVzKSk7CiAKLSAgICAgICAgICAgICAgICAgICAgZXh0cmEtPnNldEludDY0KElTdHJlYW1MaXN0ZW5lcjo6a0tleU1lZGlhVGltZVVzLCBtZWRpYVRpbWVVcyk7CisgICAgICAgICAgICAgICAgICAgIGV4dHJhLT5zZXRJbnQ2NChrQVRTUGFyc2VyS2V5TWVkaWFUaW1lVXMsIG1lZGlhVGltZVVzKTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBtVFNQYXJzZXItPnNpZ25hbERpc2NvbnRpbnVpdHkoCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL05CTG9nLmggYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL05CTG9nLmgKaW5kZXggZWJiODhmMC4uZmI2ZjE3OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9OQkxvZy5oCisrKyBiL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvTkJMb2cuaApAQCAtMjM2LDcgKzIzNiw3IEBACiAgICAgICAgIC8vIG1FdmVudCwgbUxlbmd0aCwgbURhdGFbLi4uXSwgZHVwbGljYXRlIG1MZW5ndGgKICAgICAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrT3ZlcmhlYWQgPSBzaXplb2YoZW50cnkpICsgc2l6ZW9mKGVuZGluZyk7CiAgICAgICAgIC8vIGVuZGluZCBsZW5ndGggb2YgcHJldmlvdXMgZW50cnkKLSAgICAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrUHJldmlvdXNMZW5ndGhPZmZzZXQgPSAtIHNpemVvZihlbmRpbmcpICsKKyAgICAgICAgc3RhdGljIGNvbnN0IHNzaXplX3Qga1ByZXZpb3VzTGVuZ3RoT2Zmc2V0ID0gLSBzaXplb2YoZW5kaW5nKSArCiAgICAgICAgICAgICBvZmZzZXRvZihlbmRpbmcsIGxlbmd0aCk7CiAgICAgfTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQuYnAKaW5kZXggYTYxODY3Ni4uMjZkZTRjYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLmJwCkBAIC0xNzQsNiArMTc0LDkwIEBACiAgICAgfSwKIH0KIAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9wbGF5ZXIyIiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkNhbGxiYWNrRGF0YVNvdXJjZS5jcHAiLAorICAgICAgICAiQ2FsbGJhY2tNZWRpYVNvdXJjZS5jcHAiLAorICAgICAgICAiRGF0YVNvdXJjZUZhY3RvcnkuY3BwIiwKKyAgICAgICAgIkRhdGFVUklTb3VyY2UuY3BwIiwKKyAgICAgICAgIkZpbGVTb3VyY2UuY3BwIiwKKyAgICAgICAgIkhUVFBCYXNlLmNwcCIsCisgICAgICAgICJIZXZjVXRpbHMuY3BwIiwKKyAgICAgICAgIkludGVyZmFjZVV0aWxzLmNwcCIsCisgICAgICAgICJNZWRpYUNsb2NrLmNwcCIsCisgICAgICAgICJNZWRpYUV4dHJhY3RvckZhY3RvcnkuY3BwIiwKKyAgICAgICAgIk51Q2FjaGVkU291cmNlMi5jcHAiLAorICAgICAgICAiUmVtb3RlTWVkaWFFeHRyYWN0b3IuY3BwIiwKKyAgICAgICAgIlJlbW90ZU1lZGlhU291cmNlLmNwcCIsCisgICAgICAgICJTdXJmYWNlVXRpbHMuY3BwIiwKKyAgICAgICAgIlV0aWxzLmNwcCIsCisgICAgICAgICJWaWRlb0ZyYW1lU2NoZWR1bGVyLmNwcCIsCisgICAgICAgICJodHRwL01lZGlhSFRUUC5jcHAiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJkcm1mcmFtZXdvcmsiLAorICAgICAgICAibGliZ3VpIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJtZWRpYV9vbXgiLAorICAgICAgICAibGlibWVkaWFfcGxheWVyMl91dGlsIiwKKyAgICAgICAgImxpYmF1ZGlvY2xpZW50IiwKKyAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKKyAgICAgICAgImxpYm1lZGlhbWV0cmljcyIsCisgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKKyAgICAgICAgImxpYm5ldGRfY2xpZW50IiwKKyAgICAgICAgImxpYnVpIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYmRsIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2VzZHMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfaWQzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21wZWcyc3VwcG9ydCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF90aW1lZHRleHQiLAorICAgIF0sCisKKyAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJtZWRpYV9wbGF5ZXIyX3V0aWwiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV25vLW11bHRpY2hhciIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1Xbm8tZXJyb3I9ZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBwcm9kdWN0X3ZhcmlhYmxlczogeworICAgICAgICBkZWJ1Z2dhYmxlOiB7CisgICAgICAgICAgICAvLyBlbmFibGUgZXhwZXJpbWVudHMgb25seSBpbiB1c2VyZGVidWcgYW5kIGVuZyBidWlsZHMKKyAgICAgICAgICAgIGNmbGFnczogWyItREVOQUJMRV9TVEFHRUZSSUdIVF9FWFBFUklNRU5UUyJdLAorICAgICAgICB9LAorICAgIH0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBkaWFnOiB7CisgICAgICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIH0sCisgICAgfSwKK30KKwogc3ViZGlycyA9IFsKICAgICAiY29kZWMyIiwKICAgICAiY29kZWNzLyoiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ0NvZGVjLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NDb2RlYy5jcHAKaW5kZXggMDgwZDAwZi4uMDY4Y2E1ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ0NvZGVjLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9DQ29kZWMuY3BwCkBAIC0xODIsNyArMTgyLDcgQEAKICAgICBtTGlzdGVuZXIucmVzZXQobmV3IENDb2RlY0xpc3RlbmVyKG1DaGFubmVsKSk7CiAKICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IGNvbXAobmV3IEMyU29mdEF2Y0RlYyhjb21wb25lbnROYW1lLmNfc3RyKCksIDApKTsKLSAgICBjb21wLT5zZXRMaXN0ZW5lcl9zbShtTGlzdGVuZXIpOworICAgIGNvbXAtPnNldExpc3RlbmVyX3ZiKG1MaXN0ZW5lciwgQzJfRE9OVF9CTE9DSyk7CiAgICAgewogICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CiAgICAgICAgIGlmIChzdGF0ZS0+bVN0YXRlICE9IEFMTE9DQVRJTkcpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbGxiYWNrRGF0YVNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9DYWxsYmFja0RhdGFTb3VyY2UuY3BwCmluZGV4IDZkZmUyZGUuLmY0Nzk2NDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbGxiYWNrRGF0YVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FsbGJhY2tEYXRhU291cmNlLmNwcApAQCAtMTEzLDEwICsxMTMsNiBAQAogICAgIHJldHVybiBtSURhdGFTb3VyY2UtPkRybUluaXRpYWxpemF0aW9uKG1pbWUpOwogfQogCi1zcDxJRGF0YVNvdXJjZT4gQ2FsbGJhY2tEYXRhU291cmNlOjpnZXRJRGF0YVNvdXJjZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbUlEYXRhU291cmNlOwotfQotCiBUaW55Q2FjaGVTb3VyY2U6OlRpbnlDYWNoZVNvdXJjZShjb25zdCBzcDxEYXRhU291cmNlPiYgc291cmNlKQogICAgIDogbVNvdXJjZShzb3VyY2UpLCBtQ2FjaGVkT2Zmc2V0KDApLCBtQ2FjaGVkU2l6ZSgwKSB7CiAgICAgbU5hbWUgPSBTdHJpbmc4Ojpmb3JtYXQoIlRpbnlDYWNoZVNvdXJjZSglcykiLCBtU291cmNlLT50b1N0cmluZygpLnN0cmluZygpKTsKQEAgLTE5NCw4ICsxOTAsNCBAQAogICAgIHJldHVybiBtU291cmNlLT5Ecm1Jbml0aWFsaXphdGlvbihtaW1lKTsKIH0KIAotc3A8SURhdGFTb3VyY2U+IFRpbnlDYWNoZVNvdXJjZTo6Z2V0SURhdGFTb3VyY2UoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1Tb3VyY2UtPmdldElEYXRhU291cmNlKCk7Ci19Ci0KIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbGxiYWNrTWVkaWFTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FsbGJhY2tNZWRpYVNvdXJjZS5jcHAKaW5kZXggNTRlNjE0Mi4uNjgxMTg4MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FsbGJhY2tNZWRpYVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FsbGJhY2tNZWRpYVNvdXJjZS5jcHAKQEAgLTQ0LDggKzQ0LDQgQEAKICAgICByZXR1cm4gbVNvdXJjZS0+cGF1c2UoKTsKIH0KIAotc3RhdHVzX3QgQ2FsbGJhY2tNZWRpYVNvdXJjZTo6c2V0QnVmZmVycyhjb25zdCBWZWN0b3I8TWVkaWFCdWZmZXIgKj4gJmJ1ZmZlcnMpIHsKLSAgICByZXR1cm4gbVNvdXJjZS0+c2V0QnVmZmVycyhidWZmZXJzKTsKLX0KLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0RhdGFTb3VyY2VGYWN0b3J5LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0RhdGFTb3VyY2VGYWN0b3J5LmNwcAppbmRleCBhZWU4NThjLi41NGJmMGNjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9EYXRhU291cmNlRmFjdG9yeS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRGF0YVNvdXJjZUZhY3RvcnkuY3BwCkBAIC0xOSw4ICsxOSw4IEBACiAjaW5jbHVkZSAiaW5jbHVkZS9IVFRQQmFzZS5oIgogI2luY2x1ZGUgImluY2x1ZGUvTnVDYWNoZWRTb3VyY2UyLmgiCiAKLSNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQQ29ubmVjdGlvbi5oPgotI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFIVFRQQ29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlRmFjdG9yeS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFVUklTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmg+CkBAIC0zMSw3ICszMSw3IEBACiAKIC8vIHN0YXRpYwogc3A8RGF0YVNvdXJjZT4gRGF0YVNvdXJjZUZhY3Rvcnk6OkNyZWF0ZUZyb21VUkkoCi0gICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgIGNvbnN0IHNwPE1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKICAgICAgICAgY29uc3QgY2hhciAqdXJpLAogICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycywKICAgICAgICAgU3RyaW5nOCAqY29udGVudFR5cGUsCkBAIC01MCw3ICs1MCw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoaHR0cFNvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBzcDxJTWVkaWFIVFRQQ29ubmVjdGlvbj4gY29ubiA9IGh0dHBTZXJ2aWNlLT5tYWtlSFRUUENvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgIHNwPE1lZGlhSFRUUENvbm5lY3Rpb24+IGNvbm4gPSBodHRwU2VydmljZS0+bWFrZUhUVFBDb25uZWN0aW9uKCk7CiAgICAgICAgICAgICBpZiAoY29ubiA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBtYWtlIGh0dHAgY29ubmVjdGlvbiBmcm9tIGh0dHAgc2VydmljZSEiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTEwMSwxMiArMTAxLDEyIEBACiAgICAgcmV0dXJuIHNvdXJjZS0+aW5pdENoZWNrKCkgIT0gT0sgPyBudWxscHRyIDogc291cmNlOwogfQogCi1zcDxEYXRhU291cmNlPiBEYXRhU291cmNlRmFjdG9yeTo6Q3JlYXRlTWVkaWFIVFRQKGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UpIHsKK3NwPERhdGFTb3VyY2U+IERhdGFTb3VyY2VGYWN0b3J5OjpDcmVhdGVNZWRpYUhUVFAoY29uc3Qgc3A8TWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlKSB7CiAgICAgaWYgKGh0dHBTZXJ2aWNlID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgc3A8SU1lZGlhSFRUUENvbm5lY3Rpb24+IGNvbm4gPSBodHRwU2VydmljZS0+bWFrZUhUVFBDb25uZWN0aW9uKCk7CisgICAgc3A8TWVkaWFIVFRQQ29ubmVjdGlvbj4gY29ubiA9IGh0dHBTZXJ2aWNlLT5tYWtlSFRUUENvbm5lY3Rpb24oKTsKICAgICBpZiAoY29ubiA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0gZWxzZSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9GaWxlU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuY3BwCmluZGV4IDk3ZDg5ODguLmVlZjUzMTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuY3BwCkBAIC0xOTQsMTIgKzE5NCw2IEBACiAgICAgcmV0dXJuIG1EZWNyeXB0SGFuZGxlOwogfQogCi12b2lkIEZpbGVTb3VyY2U6OmdldERybUluZm8oc3A8RGVjcnlwdEhhbmRsZT4gJmhhbmRsZSwgRHJtTWFuYWdlckNsaWVudCAqKmNsaWVudCkgewotICAgIGhhbmRsZSA9IG1EZWNyeXB0SGFuZGxlOwotCi0gICAgKmNsaWVudCA9IG1Ecm1NYW5hZ2VyQ2xpZW50OwotfQotCiBzc2l6ZV90IEZpbGVTb3VyY2U6OnJlYWRBdERSTShvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKICAgICBzaXplX3QgRFJNX0NBQ0hFX1NJWkUgPSAxMDI0OwogICAgIGlmIChtRHJtQnVmID09IE5VTEwpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQWRhcHRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUFkYXB0ZXIuY3BwCmluZGV4IGQ2ODBlMGMuLjc0ZWIxZmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQWRhcHRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFBZGFwdGVyLmNwcApAQCAtNDUsMTcgKzQ1LDI0IEBACiB9CiAKIHN0YXR1c190IE1lZGlhQWRhcHRlcjo6c3RvcCgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUFkYXB0ZXJMb2NrKTsKLSAgICBpZiAobVN0YXJ0ZWQpIHsKLSAgICAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKLSAgICAgICAgLy8gSWYgc3RvcCgpIGhhcHBlbnMgaW1tZWRpYXRlbHkgYWZ0ZXIgYSBwdXNoQnVmZmVyKCksIHdlIHNob3VsZAotICAgICAgICAvLyBjbGVhbiB1cCB0aGUgbUN1cnJlbnRNZWRpYUJ1ZmZlcgotICAgICAgICBpZiAobUN1cnJlbnRNZWRpYUJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBtQ3VycmVudE1lZGlhQnVmZmVyLT5yZWxlYXNlKCk7CisgICAgTWVkaWFCdWZmZXIgKmN1cnJlbnRCdWZmZXIgPSBOVUxMOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1BZGFwdGVyTG9jayk7CisgICAgICAgIGlmIChtU3RhcnRlZCkgeworICAgICAgICAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIC8vIElmIHN0b3AoKSBoYXBwZW5zIGltbWVkaWF0ZWx5IGFmdGVyIGEgcHVzaEJ1ZmZlcigpLCB3ZSBzaG91bGQKKyAgICAgICAgICAgIC8vIGNsZWFuIHVwIHRoZSBtQ3VycmVudE1lZGlhQnVmZmVyLiBCdXQgbmVlZCB0byByZWxlYXNlIHdpdGhvdXQKKyAgICAgICAgICAgIC8vIHRoZSBsb2NrIGFzIHNpZ25hbEJ1ZmZlclJldHVybmVkKCkgd2lsbCBhY3F1aXJlIHRoZSBsb2NrLgorICAgICAgICAgICAgY3VycmVudEJ1ZmZlciA9IG1DdXJyZW50TWVkaWFCdWZmZXI7CiAgICAgICAgICAgICBtQ3VycmVudE1lZGlhQnVmZmVyID0gTlVMTDsKKworICAgICAgICAgICAgLy8gV2hpbGUgcmVhZCgpIGlzIHN0aWxsIHdhaXRpbmcsIHdlIHNob3VsZCBzaWduYWwgaXQgdG8gZmluaXNoLgorICAgICAgICAgICAgbUJ1ZmZlclJlYWRDb25kLnNpZ25hbCgpOwogICAgICAgICB9Ci0gICAgICAgIC8vIFdoaWxlIHJlYWQoKSBpcyBzdGlsbCB3YWl0aW5nLCB3ZSBzaG91bGQgc2lnbmFsIGl0IHRvIGZpbmlzaC4KLSAgICAgICAgbUJ1ZmZlclJlYWRDb25kLnNpZ25hbCgpOworICAgIH0KKyAgICBpZiAoY3VycmVudEJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgIGN1cnJlbnRCdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgY3VycmVudEJ1ZmZlciA9IE5VTEw7CiAgICAgfQogICAgIHJldHVybiBPSzsKIH0KQEAgLTk3LDcgKzEwNCw2IEBACiAKICAgICAqYnVmZmVyID0gbUN1cnJlbnRNZWRpYUJ1ZmZlcjsKICAgICBtQ3VycmVudE1lZGlhQnVmZmVyID0gTlVMTDsKLSAgICAoKmJ1ZmZlciktPnNldE9ic2VydmVyKHRoaXMpOwogCiAgICAgcmV0dXJuIE9LOwogfQpAQCAtMTE0LDYgKzEyMCw3IEBACiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAgICAgbUN1cnJlbnRNZWRpYUJ1ZmZlciA9IGJ1ZmZlcjsKKyAgICBtQ3VycmVudE1lZGlhQnVmZmVyLT5zZXRPYnNlcnZlcih0aGlzKTsKICAgICBtQnVmZmVyUmVhZENvbmQuc2lnbmFsKCk7CiAKICAgICBBTE9HVigid2FpdCBmb3IgdGhlIGJ1ZmZlciByZXR1cm5lZCBAIHB1c2hCdWZmZXIhICVwIiwgYnVmZmVyKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5jcHAKaW5kZXggNjc3ZDI1YS4uNmFkMTFmNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5jcHAKQEAgLTE0NDUsNyArMTQ0NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbkNvZGUgPT0gQUNUSU9OX0NPREVfRkFUQUwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtDb2RlY0Vycm9yLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa0NvZGVjRXJyb3JTdGF0ZSwgbVN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldENTdHJpbmcoa0NvZGVjRXJyb3JTdGF0ZSwgc3RhdGVTdHJpbmcobVN0YXRlKS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmx1c2hBbmFseXRpY3NJdGVtKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRBbmFseXRpY3NJdGVtKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTQ1OCw3ICsxNDU4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uQ29kZSA9PSBBQ1RJT05fQ09ERV9GQVRBTCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa0NvZGVjRXJyb3IsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrQ29kZWNFcnJvclN0YXRlLCBtU3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhrQ29kZWNFcnJvclN0YXRlLCBzdGF0ZVN0cmluZyhtU3RhdGUpLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbHVzaEFuYWx5dGljc0l0ZW0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdEFuYWx5dGljc0l0ZW0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC0xNDk5LDcgKzE0OTksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb25Db2RlID09IEFDVElPTl9DT0RFX0ZBVEFMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrQ29kZWNFcnJvciwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtDb2RlY0Vycm9yU3RhdGUsIG1TdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtDb2RlY0Vycm9yU3RhdGUsIHN0YXRlU3RyaW5nKG1TdGF0ZSkuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsdXNoQW5hbHl0aWNzSXRlbSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0QW5hbHl0aWNzSXRlbSgpOwogCkBAIC0xNTMyLDcgKzE1MzIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa0NvZGVjRXJyb3IsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrQ29kZWNFcnJvclN0YXRlLCBtU3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhrQ29kZWNFcnJvclN0YXRlLCBzdGF0ZVN0cmluZyhtU3RhdGUpLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbHVzaEFuYWx5dGljc0l0ZW0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdEFuYWx5dGljc0l0ZW0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoVU5JTklUSUFMSVpFRCk7CkBAIC0zMjI4LDQgKzMyMjgsMjggQEAKICAgICB9CiB9CiAKK3N0ZDo6c3RyaW5nIE1lZGlhQ29kZWM6OnN0YXRlU3RyaW5nKFN0YXRlIHN0YXRlKSB7CisgICAgY29uc3QgY2hhciAqcnZhbCA9IE5VTEw7CisgICAgY2hhciByYXdidWZmZXJbMTZdOyAvLyByb29tIGZvciAiJWQiCisKKyAgICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgICAgIGNhc2UgVU5JTklUSUFMSVpFRDogcnZhbCA9ICJVTklOSVRJQUxJWkVEIjsgYnJlYWs7CisgICAgICAgIGNhc2UgSU5JVElBTElaSU5HOiBydmFsID0gIklOSVRJQUxJWklORyI7IGJyZWFrOworICAgICAgICBjYXNlIElOSVRJQUxJWkVEOiBydmFsID0gIklOSVRJQUxJWkVEIjsgYnJlYWs7CisgICAgICAgIGNhc2UgQ09ORklHVVJJTkc6IHJ2YWwgPSAiQ09ORklHVVJJTkciOyBicmVhazsKKyAgICAgICAgY2FzZSBDT05GSUdVUkVEOiBydmFsID0gIkNPTkZJR1VSRUQiOyBicmVhazsKKyAgICAgICAgY2FzZSBTVEFSVElORzogcnZhbCA9ICJTVEFSVElORyI7IGJyZWFrOworICAgICAgICBjYXNlIFNUQVJURUQ6IHJ2YWwgPSAiU1RBUlRFRCI7IGJyZWFrOworICAgICAgICBjYXNlIEZMVVNISU5HOiBydmFsID0gIkZMVVNISU5HIjsgYnJlYWs7CisgICAgICAgIGNhc2UgRkxVU0hFRDogcnZhbCA9ICJGTFVTSEVEIjsgYnJlYWs7CisgICAgICAgIGNhc2UgU1RPUFBJTkc6IHJ2YWwgPSAiU1RPUFBJTkciOyBicmVhazsKKyAgICAgICAgY2FzZSBSRUxFQVNJTkc6IHJ2YWwgPSAiUkVMRUFTSU5HIjsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBzbnByaW50ZihyYXdidWZmZXIsIHNpemVvZihyYXdidWZmZXIpLCAiJWQiLCBzdGF0ZSk7CisgICAgICAgICAgICBydmFsID0gcmF3YnVmZmVyOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBydmFsOworfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5jcHAKaW5kZXggMWIxMjUxMC4uZTFlMDRlYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuY3BwCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFBbmFseXRpY3NJdGVtLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ludGVyZmFjZVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KQEAgLTQ0LDcgKzQ1LDcgQEAKIC8vIHN0YXRpYwogc3A8SU1lZGlhRXh0cmFjdG9yPiBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OkNyZWF0ZSgKICAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgY29uc3QgY2hhciAqbWltZSkgewotICAgIEFMT0dWKCJNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OkNyZWF0ZSAlcyIsIG1pbWUpOworICAgIEFMT0dWKCJNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OiVzICVzIiwgX19mdW5jX18sIG1pbWUpOwogCiAgICAgaWYgKCFwcm9wZXJ0eV9nZXRfYm9vbCgibWVkaWEuc3RhZ2VmcmlnaHQuZXh0cmFjdHJlbW90ZSIsIHRydWUpKSB7CiAgICAgICAgIC8vIGxvY2FsIGV4dHJhY3RvcgpAQCAtNjksMTAgKzcwLDQ4IEBACiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKKy8vIHN0YXRpYworc3A8SU1lZGlhRXh0cmFjdG9yPiBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OkNyZWF0ZUZyb21GZCgKKyAgICAgICAgaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgsIGNvbnN0IGNoYXIgKm1pbWUsIHNwPERhdGFTb3VyY2U+ICpvdXQpIHsKKyAgICBBTE9HVigiTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjolcyAlcyIsIF9fZnVuY19fLCBtaW1lKTsKKworICAgIGlmIChwcm9wZXJ0eV9nZXRfYm9vbCgibWVkaWEuc3RhZ2VmcmlnaHQuZXh0cmFjdHJlbW90ZSIsIHRydWUpKSB7CisgICAgICAgIC8vIHJlbW90ZSBleHRyYWN0b3IKKyAgICAgICAgQUxPR1YoImdldCBzZXJ2aWNlIG1hbmFnZXIiKTsKKyAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCktPmdldFNlcnZpY2UoU3RyaW5nMTYoIm1lZGlhLmV4dHJhY3RvciIpKTsKKworICAgICAgICBpZiAoYmluZGVyICE9IDApIHsKKyAgICAgICAgICAgIHNwPElNZWRpYUV4dHJhY3RvclNlcnZpY2U+IG1lZGlhRXhTZXJ2aWNlKAorICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VfY2FzdDxJTWVkaWFFeHRyYWN0b3JTZXJ2aWNlPihiaW5kZXIpKTsKKyAgICAgICAgICAgIGlmICghRmlsZVNvdXJjZTo6cmVxdWlyZXNEcm0oZmQsIG9mZnNldCwgbGVuZ3RoLCBudWxscHRyIC8qIG1pbWUgKi8pKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoIkZpbGVTb3VyY2UgcmVtb3RlIik7CisgICAgICAgICAgICAgICAgc3A8SURhdGFTb3VyY2U+IHJlbW90ZVNvdXJjZSA9CisgICAgICAgICAgICAgICAgICAgIG1lZGlhRXhTZXJ2aWNlLT5tYWtlSURhdGFTb3VyY2UoZmQsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiSURhdGFTb3VyY2UoRmlsZVNvdXJjZSk6ICVwICVkICVsbGQgJWxsZCIsCisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdGVTb3VyY2UuZ2V0KCksIGZkLCAobG9uZyBsb25nKW9mZnNldCwgKGxvbmcgbG9uZylsZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChyZW1vdGVTb3VyY2UuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAvLyByZXBsYWNlIHRoZSBjYWxsZXIncyBsb2NhbCBzb3VyY2Ugd2l0aCByZW1vdGUgc291cmNlLgorICAgICAgICAgICAgICAgICAgICAqb3V0ID0gQ3JlYXRlRGF0YVNvdXJjZUZyb21JRGF0YVNvdXJjZShyZW1vdGVTb3VyY2UpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWVkaWFFeFNlcnZpY2UtPm1ha2VFeHRyYWN0b3IocmVtb3RlU291cmNlLCBtaW1lKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiZXh0cmFjdG9yIHNlcnZpY2UgY2Fubm90IG1ha2UgZmlsZSBzb3VyY2UuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZmFsbGluZyBiYWNrIHRvIGxvY2FsIGZpbGUgc291cmNlLiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEZhbGxzIGJhY2suCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiZXh0cmFjdG9yIHNlcnZpY2Ugbm90IHJ1bm5pbmciKTsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgfQorICAgICpvdXQgPSBuZXcgRmlsZVNvdXJjZShmZCwgb2Zmc2V0LCBsZW5ndGgpOworICAgIHJldHVybiBDcmVhdGUoKm91dCwgbWltZSk7Cit9CisKIHNwPE1lZGlhRXh0cmFjdG9yPiBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OkNyZWF0ZUZyb21TZXJ2aWNlKAogICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBjb25zdCBjaGFyICptaW1lKSB7CiAKLSAgICBBTE9HVigiTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpDcmVhdGVGcm9tU2VydmljZSAlcyIsIG1pbWUpOworICAgIEFMT0dWKCJNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OiVzICVzIiwgX19mdW5jX18sIG1pbWUpOwogICAgIFJlZ2lzdGVyRGVmYXVsdFNuaWZmZXJzKCk7CiAKICAgICAvLyBpbml0aWFsaXplIHNvdXJjZSBkZWNyeXB0aW9uIGlmIG5lZWRlZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVDYWNoZWRTb3VyY2UyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051Q2FjaGVkU291cmNlMi5jcHAKaW5kZXggYWZkNmZmYi4uMThmNGIxMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVDYWNoZWRTb3VyY2UyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUNhY2hlZFNvdXJjZTIuY3BwCkBAIC02ODEsMTAgKzY4MSw2IEBACiAgICAgcmV0dXJuIG1Tb3VyY2UtPkRybUluaXRpYWxpemF0aW9uKG1pbWUpOwogfQogCi12b2lkIE51Q2FjaGVkU291cmNlMjo6Z2V0RHJtSW5mbyhzcDxEZWNyeXB0SGFuZGxlPiAmaGFuZGxlLCBEcm1NYW5hZ2VyQ2xpZW50ICoqY2xpZW50KSB7Ci0gICAgbVNvdXJjZS0+Z2V0RHJtSW5mbyhoYW5kbGUsIGNsaWVudCk7Ci19Ci0KIFN0cmluZzggTnVDYWNoZWRTb3VyY2UyOjpnZXRVcmkoKSB7CiAgICAgcmV0dXJuIG1Tb3VyY2UtPmdldFVyaSgpOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmNwcAppbmRleCBhMTc2MzgyLi4xN2M5NjQ4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmNwcApAQCAtNzIsNyArNzIsNyBAQAogfQogCiBzdGF0dXNfdCBOdU1lZGlhRXh0cmFjdG9yOjpzZXREYXRhU291cmNlKAotICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICBjb25zdCBzcDxNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCiAgICAgICAgIGNvbnN0IGNoYXIgKnBhdGgsCiAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhU291cmNlLmNwcAppbmRleCA3YTJhNDZiLi44NjZkMTYzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9SZW1vdGVNZWRpYVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFTb3VyY2UuY3BwCkBAIC00NCwxMCArNDQsNiBAQAogICAgIHJldHVybiBtU291cmNlLT5wYXVzZSgpOwogfQogCi1zdGF0dXNfdCBSZW1vdGVNZWRpYVNvdXJjZTo6c2V0QnVmZmVycyhjb25zdCBWZWN0b3I8TWVkaWFCdWZmZXIgKj4gJmJ1ZmZlcnMpIHsKLSAgICByZXR1cm4gbVNvdXJjZS0+c2V0QnVmZmVycyhidWZmZXJzKTsKLX0KLQogc3RhdHVzX3QgUmVtb3RlTWVkaWFTb3VyY2U6OnNldFN0b3BUaW1lVXMoaW50NjRfdCBzdG9wVGltZVVzKSB7CiAgICAgcmV0dXJuIG1Tb3VyY2UtPnNldFN0b3BUaW1lVXMoc3RvcFRpbWVVcyk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlYzIvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMi9BbmRyb2lkLmJwCmluZGV4IDY5NmEwNjIuLjc0NjA5ZTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMi9BbmRyb2lkLmJwCkBAIC0zNSw2ICszNSw0OCBAQAogICAgIGxkZmxhZ3M6IFsiLVdsLC1Cc3ltYm9saWMiXSwKIH0KIAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zaW1wbGVfYzJjb21wb25lbnQiLAorCisgICAgdGFnczogWworICAgICAgICAib3B0aW9uYWwiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIlNpbXBsZUMyQ29tcG9uZW50LmNwcCJdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMi9pbmNsdWRlIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYWxsb2NhdG9yQDIuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLm1hcHBlckAyLjAiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGliaW9uIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9jb2RlYzIiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisJImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2NvZGVjMl92bmRrIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgZGlhZzogeworICAgICAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICB9LAorICAgIH0sCisKKyAgICBsZGZsYWdzOiBbIi1XbCwtQnN5bWJvbGljIl0sCit9CisKIHN1YmRpcnMgPSBbCiAgICAgInRlc3RzIiwKICAgICAidm5kayIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlYzIvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMi9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1OTYwOGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlYzIvQW5kcm9pZC5tawpAQCAtMCwwICsxLDQyIEBACisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIERPQ1VNRU5UQVRJT04gR0VORVJBVElPTgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQzJfUk9PVCA6PSAkKGNhbGwgbXktZGlyKQorCitDMl9ET0NTX1JPT1QgOj0gJChPVVRfRElSKS90YXJnZXQvY29tbW9uL2RvY3MvY29kZWMyCisKK0MyX09VVF9URU1QIDo9ICQoUFJPRFVDVF9PVVQpL2dlbi9FVEMvQ29kZWMyLWRvY3NfaW50ZXJtZWRpYXRlcworCitDMl9ET1hZIDo9ICQob3IgJChzaGVsbCBjb21tYW5kIC12IGRveHlnZW4pLFwKKwkJJChzaGVsbCBjb21tYW5kIC12IC9BcHBsaWNhdGlvbnMvRG94eWdlbi5hcHAvQ29udGVudHMvUmVzb3VyY2VzL2RveHlnZW4pKQorCitjaGVjay1kb3h5Z2VuOgoraWZuZGVmIEMyX0RPWFkKKwkkKGVycm9yICdkb3h5Z2VuIGlzIG5vdCBhdmFpbGFibGUnKQorZW5kaWYKKworJChDMl9PVVRfVEVNUCkvZG94eS1hcGkuY29uZmlnOiAkKEMyX1JPT1QpL2RvY3MvZG94eWdlbi5jb25maWcKKwkjIG9ubHkgZG9jdW1lbnQgaW5jbHVkZSBkaXJlY3RvcnksIG5vIGludGVybmFsIHNlY3Rpb25zCisJc2VkICdzL1woXklOUFVUICo9LipcKS9cMWluY2x1ZGVcLy87IFwKKwlzL1woXklOVEVSTkFMX0RPQ1MgKj0gKlwpLiovXDFOTy87IFwKKwlzL1woXkVOQUJMRURfU0VDVElPTlMgKj0uKlwpSU5URVJOQUxcKC4qXCkuKi9cMVwyLzsgXAorCXM6XCheT1VUUFVUX0RJUkVDVE9SWSAqPSBcKW91dDpcMSckKE9VVF9ESVIpJzo7JyBcCisJCSQoQzJfUk9PVCkvZG9jcy9kb3h5Z2VuLmNvbmZpZyA+ICRACisKKyQoQzJfT1VUX1RFTVApL2RveHktaW50ZXJuYWwuY29uZmlnOiAkKEMyX1JPT1QpL2RvY3MvZG94eWdlbi5jb25maWcKKwlzZWQgJ3M6XCheT1VUUFVUX0RJUkVDVE9SWSAqPSBcKW91dFwoLipcKWFwaTpcMSckKE9VVF9ESVIpJ1wyaW50ZXJuYWw6OycgXAorCQkkKEMyX1JPT1QpL2RvY3MvZG94eWdlbi5jb25maWcgPiAkQAorCitkb2NzLWFwaTogJChDMl9PVVRfVEVNUCkvZG94eS1hcGkuY29uZmlnIGNoZWNrLWRveHlnZW4KKwllY2hvIEFQSSBkb2NzIGFyZSBidWlsZGluZyBpbiAkKEMyX0RPQ1NfUk9PVCkvYXBpCisJcm0gLXJmICQoQzJfRE9DU19ST09UKS9hcGkKKwlta2RpciAtcCAkKEMyX0RPQ1NfUk9PVCkvYXBpCisJJChDMl9ET1hZKSAkKEMyX09VVF9URU1QKS9kb3h5LWFwaS5jb25maWcKKworZG9jcy1pbnRlcm5hbDogJChDMl9PVVRfVEVNUCkvZG94eS1pbnRlcm5hbC5jb25maWcgY2hlY2stZG94eWdlbgorCWVjaG8gSW50ZXJuYWwgZG9jcyBhcmUgYnVpbGRpbmcgaW4gJChDMl9ET0NTX1JPT1QpL2ludGVybmFsCisJcm0gLXJmICQoQzJfRE9DU19ST09UKS9pbnRlcm5hbAorCW1rZGlyIC1wICQoQzJfRE9DU19ST09UKS9pbnRlcm5hbAorCSQoQzJfRE9YWSkgJChDMl9PVVRfVEVNUCkvZG94eS1pbnRlcm5hbC5jb25maWcKKworZG9jcy1hbGw6IGRvY3MtYXBpIGRvY3MtaW50ZXJuYWwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlYzIvU2ltcGxlQzJDb21wb25lbnQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWMyL1NpbXBsZUMyQ29tcG9uZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTRhMzU0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWMyL1NpbXBsZUMyQ29tcG9uZW50LmNwcApAQCAtMCwwICsxLDMwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlNpbXBsZUMyQ29tcG9uZW50IgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorCisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitTaW1wbGVDMkNvbXBvbmVudDo6U2ltcGxlQzJDb21wb25lbnQoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gJmludGYpCisgICAgOiBtSW50ZihpbnRmKSB7Cit9CisKK2MyX3N0YXR1c190IFNpbXBsZUMyQ29tcG9uZW50OjpzZXRMaXN0ZW5lcl92YigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50OjpMaXN0ZW5lcj4gJmxpc3RlbmVyLCBjMl9ibG9ja2luZ190IG1heUJsb2NrKSB7CisgICAgTXV0ZXhlZDxFeGVjU3RhdGU+OjpMb2NrZWQgc3RhdGUobUV4ZWNTdGF0ZSk7CisgICAgaWYgKHN0YXRlLT5tU3RhdGUgPT0gUlVOTklORykgeworICAgICAgICBpZiAobGlzdGVuZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBDMl9CQURfU1RBVEU7CisgICAgICAgIH0gZWxzZSBpZiAoIW1heUJsb2NrKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfQkxPQ0tJTkc7CisgICAgICAgIH0KKyAgICB9CisgICAgc3RhdGUtPm1MaXN0ZW5lciA9IGxpc3RlbmVyOworICAgIC8vIFRPRE86IHdhaXQgZm9yIGxpc3RlbmVyIGNoYW5nZSB0byBoYXZlIHRha2VuIHBsYWNlIGJlZm9yZSByZXR1cm5pbmcKKyAgICAvLyAoZS5nLiBpZiB0aGVyZSBpcyBhbiBvbmdvaW5nIGxpc3RlbmVyIGNhbGxiYWNrKQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgU2ltcGxlQzJDb21wb25lbnQ6OnF1ZXVlX25iKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gKiBjb25zdCBpdGVtcykgeworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxFeGVjU3RhdGU+OjpMb2NrZWQgc3RhdGUobUV4ZWNTdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+bVN0YXRlICE9IFJVTk5JTkcpIHsKKyAgICAgICAgICAgIHJldHVybiBDMl9CQURfU1RBVEU7CisgICAgICAgIH0KKyAgICB9CisgICAgeworICAgICAgICBNdXRleGVkPFdvcmtRdWV1ZT46OkxvY2tlZCBxdWV1ZShtV29ya1F1ZXVlKTsKKyAgICAgICAgd2hpbGUgKCFpdGVtcy0+ZW1wdHkoKSkgeworICAgICAgICAgICAgcXVldWUtPm1RdWV1ZS5wdXNoX2JhY2soc3RkOjptb3ZlKGl0ZW1zLT5mcm9udCgpKSk7CisgICAgICAgICAgICBpdGVtcy0+cG9wX2Zyb250KCk7CisgICAgICAgIH0KKyAgICAgICAgcXVldWUtPm1Db25kaXRpb24uYnJvYWRjYXN0KCk7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgU2ltcGxlQzJDb21wb25lbnQ6OmFubm91bmNlX25iKGNvbnN0IHN0ZDo6dmVjdG9yPEMyV29ya091dGxpbmU+ICZpdGVtcykgeworICAgICh2b2lkKSBpdGVtczsKKyAgICByZXR1cm4gQzJfT01JVFRFRDsKK30KKworYzJfc3RhdHVzX3QgU2ltcGxlQzJDb21wb25lbnQ6OmZsdXNoX3NtKAorICAgICAgICBmbHVzaF9tb2RlX3QgZmx1c2hUaHJvdWdoLCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+KiBjb25zdCBmbHVzaGVkV29yaykgeworICAgICh2b2lkKSBmbHVzaFRocm91Z2g7CisgICAgeworICAgICAgICBNdXRleGVkPEV4ZWNTdGF0ZT46OkxvY2tlZCBzdGF0ZShtRXhlY1N0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5tU3RhdGUgIT0gUlVOTklORykgeworICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9TVEFURTsKKyAgICAgICAgfQorICAgIH0KKyAgICB7CisgICAgICAgIE11dGV4ZWQ8V29ya1F1ZXVlPjo6TG9ja2VkIHF1ZXVlKG1Xb3JrUXVldWUpOworICAgICAgICArK3F1ZXVlLT5tR2VuZXJhdGlvbjsKKyAgICAgICAgd2hpbGUgKCFxdWV1ZS0+bVF1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGZsdXNoZWRXb3JrLT5wdXNoX2JhY2soc3RkOjptb3ZlKHF1ZXVlLT5tUXVldWUuZnJvbnQoKSkpOworICAgICAgICAgICAgcXVldWUtPm1RdWV1ZS5wb3BfZnJvbnQoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB7CisgICAgICAgIE11dGV4ZWQ8UGVuZGluZ1dvcms+OjpMb2NrZWQgcGVuZGluZyhtUGVuZGluZ1dvcmspOworICAgICAgICB3aGlsZSAoIXBlbmRpbmctPmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGZsdXNoZWRXb3JrLT5wdXNoX2JhY2soc3RkOjptb3ZlKHBlbmRpbmctPmJlZ2luKCktPnNlY29uZCkpOworICAgICAgICAgICAgcGVuZGluZy0+ZXJhc2UocGVuZGluZy0+YmVnaW4oKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gb25GbHVzaF9zbSgpOworfQorCitjMl9zdGF0dXNfdCBTaW1wbGVDMkNvbXBvbmVudDo6ZHJhaW5fbmIoZHJhaW5fbW9kZV90IGRyYWluVGhyb3VnaCkgeworICAgICh2b2lkKSBkcmFpblRocm91Z2g7CisgICAgeworICAgICAgICBNdXRleGVkPEV4ZWNTdGF0ZT46OkxvY2tlZCBzdGF0ZShtRXhlY1N0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5tU3RhdGUgIT0gUlVOTklORykgeworICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9TVEFURTsKKyAgICAgICAgfQorICAgIH0KKyAgICB7CisgICAgICAgIE11dGV4ZWQ8V29ya1F1ZXVlPjo6TG9ja2VkIHF1ZXVlKG1Xb3JrUXVldWUpOworICAgICAgICBpZiAoIXF1ZXVlLT5tUXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmsgPSBxdWV1ZS0+bVF1ZXVlLmJhY2soKTsKKyAgICAgICAgICAgIHdvcmstPmlucHV0LmZsYWdzID0gKEMyQnVmZmVyUGFjazo6ZmxhZ3NfdCkod29yay0+aW5wdXQuZmxhZ3MgfCBDMkJ1ZmZlclBhY2s6OkZMQUdfRU5EX09GX1NUUkVBTSk7CisgICAgICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gb25EcmFpbl9uYigpOworfQorCitjMl9zdGF0dXNfdCBTaW1wbGVDMkNvbXBvbmVudDo6c3RhcnQoKSB7CisgICAgTXV0ZXhlZDxFeGVjU3RhdGU+OjpMb2NrZWQgc3RhdGUobUV4ZWNTdGF0ZSk7CisgICAgaWYgKHN0YXRlLT5tU3RhdGUgPT0gUlVOTklORykgeworICAgICAgICByZXR1cm4gQzJfQkFEX1NUQVRFOworICAgIH0KKyAgICBib29sIG5lZWRzSW5pdCA9IChzdGF0ZS0+bVN0YXRlID09IFVOSU5JVElBTElaRUQpOworICAgIGlmIChuZWVkc0luaXQpIHsKKyAgICAgICAgc3RhdGUudW5sb2NrKCk7CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG9uSW5pdCgpOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgICAgIHN0YXRlLmxvY2soKTsKKyAgICB9CisgICAgaWYgKCFzdGF0ZS0+bVRocmVhZC5qb2luYWJsZSgpKSB7CisgICAgICAgIG1FeGl0UmVxdWVzdGVkID0gZmFsc2U7CisgICAgICAgIHN0YXRlLT5tVGhyZWFkID0gc3RkOjp0aHJlYWQoCisgICAgICAgICAgICAgICAgW10oc3RkOjp3ZWFrX3B0cjxTaW1wbGVDMkNvbXBvbmVudD4gd3ApIHsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxTaW1wbGVDMkNvbXBvbmVudD4gdGhpeiA9IHdwLmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpeikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGl6LT5leGl0UmVxdWVzdGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB0aGl6LT5wcm9jZXNzUXVldWUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgc2hhcmVkX2Zyb21fdGhpcygpKTsKKyAgICB9CisgICAgc3RhdGUtPm1TdGF0ZSA9IFJVTk5JTkc7CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBTaW1wbGVDMkNvbXBvbmVudDo6c3RvcCgpIHsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8RXhlY1N0YXRlPjo6TG9ja2VkIHN0YXRlKG1FeGVjU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPm1TdGF0ZSAhPSBSVU5OSU5HKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1NUQVRFOworICAgICAgICB9CisgICAgICAgIHN0YXRlLT5tU3RhdGUgPSBTVE9QUEVEOworICAgIH0KKyAgICB7CisgICAgICAgIE11dGV4ZWQ8V29ya1F1ZXVlPjo6TG9ja2VkIHF1ZXVlKG1Xb3JrUXVldWUpOworICAgICAgICBxdWV1ZS0+bVF1ZXVlLmNsZWFyKCk7CisgICAgfQorICAgIHsKKyAgICAgICAgTXV0ZXhlZDxQZW5kaW5nV29yaz46OkxvY2tlZCBwZW5kaW5nKG1QZW5kaW5nV29yayk7CisgICAgICAgIHBlbmRpbmctPmNsZWFyKCk7CisgICAgfQorICAgIGMyX3N0YXR1c190IGVyciA9IG9uU3RvcCgpOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBTaW1wbGVDMkNvbXBvbmVudDo6cmVzZXQoKSB7CisgICAgeworICAgICAgICBNdXRleGVkPEV4ZWNTdGF0ZT46OkxvY2tlZCBzdGF0ZShtRXhlY1N0YXRlKTsKKyAgICAgICAgc3RhdGUtPm1TdGF0ZSA9IFVOSU5JVElBTElaRUQ7CisgICAgfQorICAgIHsKKyAgICAgICAgTXV0ZXhlZDxXb3JrUXVldWU+OjpMb2NrZWQgcXVldWUobVdvcmtRdWV1ZSk7CisgICAgICAgIHF1ZXVlLT5tUXVldWUuY2xlYXIoKTsKKyAgICB9CisgICAgeworICAgICAgICBNdXRleGVkPFBlbmRpbmdXb3JrPjo6TG9ja2VkIHBlbmRpbmcobVBlbmRpbmdXb3JrKTsKKyAgICAgICAgcGVuZGluZy0+Y2xlYXIoKTsKKyAgICB9CisgICAgb25SZXNldCgpOworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgU2ltcGxlQzJDb21wb25lbnQ6OnJlbGVhc2UoKSB7CisgICAgeworICAgICAgICBNdXRleGVkPEV4ZWNTdGF0ZT46OkxvY2tlZCBzdGF0ZShtRXhlY1N0YXRlKTsKKyAgICAgICAgbUV4aXRSZXF1ZXN0ZWQgPSB0cnVlOworICAgICAgICBzdGF0ZS0+bVRocmVhZC5qb2luKCk7CisgICAgfQorICAgIG9uUmVsZWFzZSgpOworICAgIHJldHVybiBDMl9PSzsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBTaW1wbGVDMkNvbXBvbmVudDo6aW50ZigpIHsKKyAgICByZXR1cm4gbUludGY7Cit9CisKK25hbWVzcGFjZSB7CisKK3N0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiB2ZWMoc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gcmV0OworICAgIHJldC5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICByZXR1cm4gcmV0OworfQorCit9ICAvLyBuYW1lc3BhY2UKKwordm9pZCBTaW1wbGVDMkNvbXBvbmVudDo6ZmluaXNoKAorICAgICAgICB1aW50NjRfdCBmcmFtZUluZGV4LCBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJik+IGZpbGxXb3JrKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yazsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8UGVuZGluZ1dvcms+OjpMb2NrZWQgcGVuZGluZyhtUGVuZGluZ1dvcmspOworICAgICAgICBpZiAocGVuZGluZy0+Y291bnQoZnJhbWVJbmRleCkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHdvcmsgPSBzdGQ6Om1vdmUocGVuZGluZy0+YXQoZnJhbWVJbmRleCkpOworICAgICAgICBwZW5kaW5nLT5lcmFzZShmcmFtZUluZGV4KTsKKyAgICB9CisgICAgaWYgKHdvcmspIHsKKyAgICAgICAgZmlsbFdvcmsod29yayk7CisgICAgICAgIE11dGV4ZWQ8RXhlY1N0YXRlPjo6TG9ja2VkIHN0YXRlKG1FeGVjU3RhdGUpOworICAgICAgICBzdGF0ZS0+bUxpc3RlbmVyLT5vbldvcmtEb25lX25iKHNoYXJlZF9mcm9tX3RoaXMoKSwgdmVjKHdvcmspKTsKKyAgICB9Cit9CisKK3ZvaWQgU2ltcGxlQzJDb21wb25lbnQ6OnByb2Nlc3NRdWV1ZSgpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrOworICAgIHVpbnQ2NF90IGdlbmVyYXRpb247CisgICAgeworICAgICAgICBNdXRleGVkPFdvcmtRdWV1ZT46OkxvY2tlZCBxdWV1ZShtV29ya1F1ZXVlKTsKKyAgICAgICAgbnNlY3NfdCBkZWFkbGluZSA9IHN5c3RlbVRpbWUoKSArIG1zMm5zKDI1MCk7CisgICAgICAgIHdoaWxlIChxdWV1ZS0+bVF1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHF1ZXVlLndhaXRGb3JDb25kaXRpb25SZWxhdGl2ZSgKKyAgICAgICAgICAgICAgICAgICAgcXVldWUtPm1Db25kaXRpb24sIHN0ZDo6bWF4KGRlYWRsaW5lIC0gc3lzdGVtVGltZSgpLCAobnNlY3NfdCkwKSk7CisgICAgICAgICAgICBpZiAoZXJyID09IFRJTUVEX09VVCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGdlbmVyYXRpb24gPSBxdWV1ZS0+bUdlbmVyYXRpb247CisgICAgICAgIHdvcmsgPSBzdGQ6Om1vdmUocXVldWUtPm1RdWV1ZS5mcm9udCgpKTsKKyAgICAgICAgcXVldWUtPm1RdWV1ZS5wb3BfZnJvbnQoKTsKKyAgICB9CisgICAgaWYgKCF3b3JrKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBUT0RPOiBncmFiIHBvb2wgSUQgZnJvbSBpbnRmCisgICAgaWYgKCFtT3V0cHV0QmxvY2tQb29sKSB7CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IEdldENvZGVjMkJsb2NrUG9vbChDMkJsb2NrUG9vbDo6QkFTSUNfR1JBUEhJQywgc2hhcmVkX2Zyb21fdGhpcygpLCAmbU91dHB1dEJsb2NrUG9vbCk7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIE11dGV4ZWQ8RXhlY1N0YXRlPjo6TG9ja2VkIHN0YXRlKG1FeGVjU3RhdGUpOworICAgICAgICAgICAgc3RhdGUtPm1MaXN0ZW5lci0+b25FcnJvcl9uYihzaGFyZWRfZnJvbV90aGlzKCksIGVycik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sIGRvbmUgPSBwcm9jZXNzKHdvcmssIG1PdXRwdXRCbG9ja1Bvb2wpOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxXb3JrUXVldWU+OjpMb2NrZWQgcXVldWUobVdvcmtRdWV1ZSk7CisgICAgICAgIGlmIChxdWV1ZS0+bUdlbmVyYXRpb24gIT0gZ2VuZXJhdGlvbikgeworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9UX0ZPVU5EOworICAgICAgICAgICAgcXVldWUudW5sb2NrKCk7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTXV0ZXhlZDxFeGVjU3RhdGU+OjpMb2NrZWQgc3RhdGUobUV4ZWNTdGF0ZSk7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1MaXN0ZW5lci0+b25Xb3JrRG9uZV9uYihzaGFyZWRfZnJvbV90aGlzKCksIHZlYyh3b3JrKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBxdWV1ZS5sb2NrKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGRvbmUpIHsKKyAgICAgICAgTXV0ZXhlZDxFeGVjU3RhdGU+OjpMb2NrZWQgc3RhdGUobUV4ZWNTdGF0ZSk7CisgICAgICAgIHN0YXRlLT5tTGlzdGVuZXItPm9uV29ya0RvbmVfbmIoc2hhcmVkX2Zyb21fdGhpcygpLCB2ZWMod29yaykpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHVuZXhwZWN0ZWQ7CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4ZWQ8UGVuZGluZ1dvcms+OjpMb2NrZWQgcGVuZGluZyhtUGVuZGluZ1dvcmspOworICAgICAgICAgICAgdWludDY0X3QgZnJhbWVJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVfaW5kZXg7CisgICAgICAgICAgICBpZiAocGVuZGluZy0+Y291bnQoZnJhbWVJbmRleCkgIT0gMCkgeworICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWQgPSBzdGQ6Om1vdmUocGVuZGluZy0+YXQoZnJhbWVJbmRleCkpOworICAgICAgICAgICAgICAgIHBlbmRpbmctPmVyYXNlKGZyYW1lSW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKHZvaWQpIHBlbmRpbmctPmluc2VydCh7IGZyYW1lSW5kZXgsIHN0ZDo6bW92ZSh3b3JrKSB9KTsKKyAgICAgICAgfQorICAgICAgICBpZiAodW5leHBlY3RlZCkgeworICAgICAgICAgICAgdW5leHBlY3RlZC0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgTXV0ZXhlZDxFeGVjU3RhdGU+OjpMb2NrZWQgc3RhdGUobUV4ZWNTdGF0ZSk7CisgICAgICAgICAgICBzdGF0ZS0+bUxpc3RlbmVyLT5vbldvcmtEb25lX25iKHNoYXJlZF9mcm9tX3RoaXMoKSwgdmVjKHVuZXhwZWN0ZWQpKTsKKyAgICAgICAgfQorICAgIH0KK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWMyL2RvY3MvZG94eWZpbHRlci5zaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMi9kb2NzL2RveHlmaWx0ZXIuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDgxMzE1MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMi9kb2NzL2RveHlmaWx0ZXIuc2gKQEAgLTAsMCArMSwxMDAgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbjMKK2ltcG9ydCByZSwgc3lzCisKK2dsb2JhbCBpbl9jb21tZW50LCBjdXJyZW50LCBpbmRlbnQsIGhvbGQKK2luX2NvbW1lbnQsIGN1cnJlbnQsIGluZGVudCwgaG9sZCA9IEZhbHNlLCBOb25lLCAnJywgW10KKworY2xhc3MgQ2hhbmdlQ1N0eWxlQ29tbWVudHNUb0RveHk6CisgICAgZGVmIGR1bXBfaG9sZCgpOgorICAgICAgICBnbG9iYWwgaG9sZAorICAgICAgICBmb3IgaCBpbiBob2xkOgorICAgICAgICAgICAgcHJpbnQoaCwgZW5kPScnKQorICAgICAgICBob2xkWzpdID0gW10KKworICAgIGRlZiBkb3h5X2hvbGQoKToKKyAgICAgICAgZ2xvYmFsIGN1cnJlbnQsIGhvbGQKKyAgICAgICAgaWYgY3VycmVudCA9PSAnLy8nOgorICAgICAgICAgICAgZm9yIGggaW4gaG9sZDoKKyAgICAgICAgICAgICAgICBwcmludChyZS5zdWIocideKCAqLy8oPyEvKSknLCByJ1wxLycsIGgpLCBlbmQ9JycpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmaXJzdCA9IFRydWUKKyAgICAgICAgICAgIGZvciBoIGluIGhvbGQ6CisgICAgICAgICAgICAgICAgaWYgZmlyc3Q6CisgICAgICAgICAgICAgICAgICAgIGggPSByZS5zdWIocideKCAqL1sqXSg/IVsqXSkpJywgcidcMSonLCBoKQorICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IEZhbHNlCisgICAgICAgICAgICAgICAgcHJpbnQoaCwgZW5kPScnKQorICAgICAgICBob2xkWzpdID0gW10KKworICAgIGRlZiBwcm9jZXNzX2NvbW1lbnQodCwgaW5kLCBsaW5lKToKKyAgICAgICAgZ2xvYmFsIGN1cnJlbnQsIGluZGVudCwgaG9sZAorICAgICAgICBpZiB0ICE9IGN1cnJlbnQgb3IgaW5kIG5vdCBpbiAoaW5kZW50LCBpbmRlbnQgKyAnICcpOgorICAgICAgICAgICAgZHVtcF9ob2xkKCkKKyAgICAgICAgICAgIGN1cnJlbnQsIGluZGVudCA9IHQsIGluZAorICAgICAgICBob2xkLmFwcGVuZChsaW5lKQorCisgICAgZGVmIHByb2Nlc3NfbGluZShpbmQsIGxpbmUpOgorICAgICAgICBnbG9iYWwgY3VycmVudCwgaW5kZW50CisgICAgICAgIGlmIGluZCBpbiAoaW5kZW50LCAnJyk6CisgICAgICAgICAgICBkb3h5X2hvbGQoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZHVtcF9ob2xkKCkKKyAgICAgICAgY3VycmVudCwgaW5kZW50ID0gTm9uZSwgTm9uZQorICAgICAgICBwcmludChsaW5lLCBlbmQ9JycpCisKKyAgICBkZWYgcHJvY2VzcyhzZWxmLCBpbnB1dCwgcGF0aCk6CisgICAgICAgIGZvciBsaW5lIGluIGlucHV0OgorICAgICAgICAgICAgaW5kID0gcmUubWF0Y2gocideKCAqKScsIGxpbmUpLmdyb3VwKDEpCisgICAgICAgICAgICBpZiBpbl9jb21tZW50OgorICAgICAgICAgICAgICAgICMgVE9ETzogdGhpcyBpcyBub3QgcXVpdGUgcmlnaHQsIGJ1dCBnb29kIGVub3VnaAorICAgICAgICAgICAgICAgIG0gPSByZS5tYXRjaChyJ14gKlsqXS8nLCBsaW5lKQorICAgICAgICAgICAgICAgIGlmIG06CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NfY29tbWVudCgnLyonLCBpbmQsIGxpbmUpCisgICAgICAgICAgICAgICAgICAgIGluX2NvbW1lbnQgPSBGYWxzZQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NfY29tbWVudCgnLyonLCBpbmQsIGxpbmUpCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIG0gPSByZS5tYXRjaChyJ14gKi8vJywgbGluZSkKKyAgICAgICAgICAgIGlmIG06CisgICAgICAgICAgICAgICAgIyBvbmUtbGluZSBjb21tZW50CisgICAgICAgICAgICAgICAgcHJvY2Vzc19jb21tZW50KCcvLycsIGluZCwgbGluZSkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgbSA9IHJlLm1hdGNoKHInXiAqL1sqXScsIGxpbmUpCisgICAgICAgICAgICBpZiBtOgorICAgICAgICAgICAgICAgICMgbXVsdGktbGluZSBjb21tZW50CisgICAgICAgICAgICAgICAgcHJvY2Vzc19jb21tZW50KCcvKicsIGluZCwgbGluZSkKKyAgICAgICAgICAgICAgICAjIFRPRE86IHRoaXMgaXMgbm90IHF1aXRlIHJpZ2h0LCBidXQgZ29vZCBlbm91Z2gKKyAgICAgICAgICAgICAgICBpbl9jb21tZW50ID0gbm90IHJlLm1hdGNoKHInXiAqWypdLycsIGxpbmUpCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHByb2Nlc3NfbGluZShpbmQsIGxpbmUpCisKK2NsYXNzIEF1dG9Hcm91cDoKKyAgICBkZWYgcHJvY2VzcyhzZWxmLCBpbnB1dCwgcGF0aCk6CisgICAgICAgIGlmICcvY29kZWMyL2luY2x1ZGUvJyBpbiBwYXRoOgorICAgICAgICAgICAgZ3JvdXAgPSAnQVBJIENvZGVjMiBBUEknCisgICAgICAgIGVsaWYgRmFsc2U6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZWxpZiAnL2NvZGVjMi92bmRrLycgaW4gcGF0aDoKKyAgICAgICAgICAgIGdyb3VwID0gJ1ZOREsgUGxhdGZvcm0gcHJvdmlkZWQgZ2x1ZScKKyAgICAgICAgZWxpZiAnL2NvZGVjMi90ZXN0cy8nIGluIHBhdGg6CisgICAgICAgICAgICBncm91cCA9ICdUZXN0cyBVbml0IHRlc3RzJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgZ3JvdXAgPSAnUmFuZG9tIE1pc2MuIHNhbmRib3gnCisKKyAgICAgICAgcHJpbnQoJyN1bmRlZiBfX0FQUExFX18nKQorCisgICAgICAgIGZvciBsaW5lIGluIGlucHV0OgorICAgICAgICAgICAgaWYgcmUubWF0Y2gocidebmFtZXNwYWNlIGFuZHJvaWQgeycsIGxpbmUpOgorICAgICAgICAgICAgICAgIHByaW50KGxpbmUsIGVuZD0nJykKKyAgICAgICAgICAgICAgICBwcmludCgpCisgICAgICAgICAgICAgICAgcHJpbnQocicvLy8gXGFkZHRvZ3JvdXAge30nLmZvcm1hdChncm91cCkpCisgICAgICAgICAgICAgICAgcHJpbnQocicvLy8gQHsnKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBlbGlmIHJlLm1hdGNoKHInXn0gKy8vICtuYW1lc3BhY2UnLCBsaW5lKToKKyAgICAgICAgICAgICAgICBwcmludChyJy8vLyBAfScpCisgICAgICAgICAgICAgICAgcHJpbnQoKQorICAgICAgICAgICAgcHJpbnQobGluZSwgZW5kPScnKQorCitQID0gQXV0b0dyb3VwKCkKK2ZvciBwYXRoIGluIHN5cy5hcmd2WzE6XToKKyAgICB3aXRoIG9wZW4ocGF0aCwgJ3J0JykgYXMgaW5wdXQ6CisgICAgICAgIFAucHJvY2VzcyhpbnB1dCwgcGF0aCkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMi9kb2NzL2RveHlnZW4uY29uZmlnIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWMyL2RvY3MvZG94eWdlbi5jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFhOTIxZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMi9kb2NzL2RveHlnZW4uY29uZmlnCkBAIC0wLDAgKzEsMjQ0NiBAQAorIyBEb3h5ZmlsZSAxLjguMTEKKworIyBUaGlzIGZpbGUgZGVzY3JpYmVzIHRoZSBzZXR0aW5ncyB0byBiZSB1c2VkIGJ5IHRoZSBkb2N1bWVudGF0aW9uIHN5c3RlbQorIyBkb3h5Z2VuICh3d3cuZG94eWdlbi5vcmcpIGZvciBhIHByb2plY3QuCisjCisjIEFsbCB0ZXh0IGFmdGVyIGEgZG91YmxlIGhhc2ggKCMjKSBpcyBjb25zaWRlcmVkIGEgY29tbWVudCBhbmQgaXMgcGxhY2VkIGluCisjIGZyb250IG9mIHRoZSBUQUcgaXQgaXMgcHJlY2VkaW5nLgorIworIyBBbGwgdGV4dCBhZnRlciBhIHNpbmdsZSBoYXNoICgjKSBpcyBjb25zaWRlcmVkIGEgY29tbWVudCBhbmQgd2lsbCBiZSBpZ25vcmVkLgorIyBUaGUgZm9ybWF0IGlzOgorIyBUQUcgPSB2YWx1ZSBbdmFsdWUsIC4uLl0KKyMgRm9yIGxpc3RzLCBpdGVtcyBjYW4gYWxzbyBiZSBhcHBlbmRlZCB1c2luZzoKKyMgVEFHICs9IHZhbHVlIFt2YWx1ZSwgLi4uXQorIyBWYWx1ZXMgdGhhdCBjb250YWluIHNwYWNlcyBzaG91bGQgYmUgcGxhY2VkIGJldHdlZW4gcXVvdGVzIChcIiBcIikuCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUHJvamVjdCByZWxhdGVkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFRoaXMgdGFnIHNwZWNpZmllcyB0aGUgZW5jb2RpbmcgdXNlZCBmb3IgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIGNvbmZpZyBmaWxlCisjIHRoYXQgZm9sbG93LiBUaGUgZGVmYXVsdCBpcyBVVEYtOCB3aGljaCBpcyBhbHNvIHRoZSBlbmNvZGluZyB1c2VkIGZvciBhbGwgdGV4dAorIyBiZWZvcmUgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhpcyB0YWcuIERveHlnZW4gdXNlcyBsaWJpY29udiAob3IgdGhlIGljb252CisjIGJ1aWx0IGludG8gbGliYykgZm9yIHRoZSB0cmFuc2NvZGluZy4gU2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9saWJpY29udgorIyBmb3IgdGhlIGxpc3Qgb2YgcG9zc2libGUgZW5jb2RpbmdzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogVVRGLTguCisKK0RPWFlGSUxFX0VOQ09ESU5HICAgICAgPSBVVEYtOAorCisjIFRoZSBQUk9KRUNUX05BTUUgdGFnIGlzIGEgc2luZ2xlIHdvcmQgKG9yIGEgc2VxdWVuY2Ugb2Ygd29yZHMgc3Vycm91bmRlZCBieQorIyBkb3VibGUtcXVvdGVzLCB1bmxlc3MgeW91IGFyZSB1c2luZyBEb3h5d2l6YXJkKSB0aGF0IHNob3VsZCBpZGVudGlmeSB0aGUKKyMgcHJvamVjdCBmb3Igd2hpY2ggdGhlIGRvY3VtZW50YXRpb24gaXMgZ2VuZXJhdGVkLiBUaGlzIG5hbWUgaXMgdXNlZCBpbiB0aGUKKyMgdGl0bGUgb2YgbW9zdCBnZW5lcmF0ZWQgcGFnZXMgYW5kIGluIGEgZmV3IG90aGVyIHBsYWNlcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE15IFByb2plY3QuCisKK1BST0pFQ1RfTkFNRSAgICAgICAgICAgPSBDb2RlYzIKKworIyBUaGUgUFJPSkVDVF9OVU1CRVIgdGFnIGNhbiBiZSB1c2VkIHRvIGVudGVyIGEgcHJvamVjdCBvciByZXZpc2lvbiBudW1iZXIuIFRoaXMKKyMgY291bGQgYmUgaGFuZHkgZm9yIGFyY2hpdmluZyB0aGUgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24gb3IgaWYgc29tZSB2ZXJzaW9uCisjIGNvbnRyb2wgc3lzdGVtIGlzIHVzZWQuCisKK1BST0pFQ1RfTlVNQkVSICAgICAgICAgPSAKKworIyBVc2luZyB0aGUgUFJPSkVDVF9CUklFRiB0YWcgb25lIGNhbiBwcm92aWRlIGFuIG9wdGlvbmFsIG9uZSBsaW5lIGRlc2NyaXB0aW9uCisjIGZvciBhIHByb2plY3QgdGhhdCBhcHBlYXJzIGF0IHRoZSB0b3Agb2YgZWFjaCBwYWdlIGFuZCBzaG91bGQgZ2l2ZSB2aWV3ZXIgYQorIyBxdWljayBpZGVhIGFib3V0IHRoZSBwdXJwb3NlIG9mIHRoZSBwcm9qZWN0LiBLZWVwIHRoZSBkZXNjcmlwdGlvbiBzaG9ydC4KKworUFJPSkVDVF9CUklFRiAgICAgICAgICA9IAorCisjIFdpdGggdGhlIFBST0pFQ1RfTE9HTyB0YWcgb25lIGNhbiBzcGVjaWZ5IGEgbG9nbyBvciBhbiBpY29uIHRoYXQgaXMgaW5jbHVkZWQKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24uIFRoZSBtYXhpbXVtIGhlaWdodCBvZiB0aGUgbG9nbyBzaG91bGQgbm90IGV4Y2VlZCA1NQorIyBwaXhlbHMgYW5kIHRoZSBtYXhpbXVtIHdpZHRoIHNob3VsZCBub3QgZXhjZWVkIDIwMCBwaXhlbHMuIERveHlnZW4gd2lsbCBjb3B5CisjIHRoZSBsb2dvIHRvIHRoZSBvdXRwdXQgZGlyZWN0b3J5LgorCitQUk9KRUNUX0xPR08gICAgICAgICAgID0gCisKKyMgVGhlIE9VVFBVVF9ESVJFQ1RPUlkgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgKHJlbGF0aXZlIG9yIGFic29sdXRlKSBwYXRoCisjIGludG8gd2hpY2ggdGhlIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uIHdpbGwgYmUgd3JpdHRlbi4gSWYgYSByZWxhdGl2ZSBwYXRoIGlzCisjIGVudGVyZWQsIGl0IHdpbGwgYmUgcmVsYXRpdmUgdG8gdGhlIGxvY2F0aW9uIHdoZXJlIGRveHlnZW4gd2FzIHN0YXJ0ZWQuIElmCisjIGxlZnQgYmxhbmsgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHdpbGwgYmUgdXNlZC4KKworT1VUUFVUX0RJUkVDVE9SWSAgICAgICA9IG91dC90YXJnZXQvY29tbW9uL2RvY3MvY29kZWMyL2FwaQorCisjIElmIHRoZSBDUkVBVEVfU1VCRElSUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBjcmVhdGUgNDA5NiBzdWItCisjIGRpcmVjdG9yaWVzIChpbiAyIGxldmVscykgdW5kZXIgdGhlIG91dHB1dCBkaXJlY3Rvcnkgb2YgZWFjaCBvdXRwdXQgZm9ybWF0IGFuZAorIyB3aWxsIGRpc3RyaWJ1dGUgdGhlIGdlbmVyYXRlZCBmaWxlcyBvdmVyIHRoZXNlIGRpcmVjdG9yaWVzLiBFbmFibGluZyB0aGlzCisjIG9wdGlvbiBjYW4gYmUgdXNlZnVsIHdoZW4gZmVlZGluZyBkb3h5Z2VuIGEgaHVnZSBhbW91bnQgb2Ygc291cmNlIGZpbGVzLCB3aGVyZQorIyBwdXR0aW5nIGFsbCBnZW5lcmF0ZWQgZmlsZXMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IHdvdWxkIG90aGVyd2lzZSBjYXVzZXMKKyMgcGVyZm9ybWFuY2UgcHJvYmxlbXMgZm9yIHRoZSBmaWxlIHN5c3RlbS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitDUkVBVEVfU1VCRElSUyAgICAgICAgID0gTk8KKworIyBJZiB0aGUgQUxMT1dfVU5JQ09ERV9OQU1FUyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGFsbG93IG5vbi1BU0NJSQorIyBjaGFyYWN0ZXJzIHRvIGFwcGVhciBpbiB0aGUgbmFtZXMgb2YgZ2VuZXJhdGVkIGZpbGVzLiBJZiBzZXQgdG8gTk8sIG5vbi1BU0NJSQorIyBjaGFyYWN0ZXJzIHdpbGwgYmUgZXNjYXBlZCwgZm9yIGV4YW1wbGUgX3hFM194ODFfeDg0IHdpbGwgYmUgdXNlZCBmb3IgVW5pY29kZQorIyBVKzMwNDQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworQUxMT1dfVU5JQ09ERV9OQU1FUyAgICA9IE5PCisKKyMgVGhlIE9VVFBVVF9MQU5HVUFHRSB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBsYW5ndWFnZSBpbiB3aGljaCBhbGwKKyMgZG9jdW1lbnRhdGlvbiBnZW5lcmF0ZWQgYnkgZG94eWdlbiBpcyB3cml0dGVuLiBEb3h5Z2VuIHdpbGwgdXNlIHRoaXMKKyMgaW5mb3JtYXRpb24gdG8gZ2VuZXJhdGUgYWxsIGNvbnN0YW50IG91dHB1dCBpbiB0aGUgcHJvcGVyIGxhbmd1YWdlLgorIyBQb3NzaWJsZSB2YWx1ZXMgYXJlOiBBZnJpa2FhbnMsIEFyYWJpYywgQXJtZW5pYW4sIEJyYXppbGlhbiwgQ2F0YWxhbiwgQ2hpbmVzZSwKKyMgQ2hpbmVzZS1UcmFkaXRpb25hbCwgQ3JvYXRpYW4sIEN6ZWNoLCBEYW5pc2gsIER1dGNoLCBFbmdsaXNoIChVbml0ZWQgU3RhdGVzKSwKKyMgRXNwZXJhbnRvLCBGYXJzaSAoUGVyc2lhbiksIEZpbm5pc2gsIEZyZW5jaCwgR2VybWFuLCBHcmVlaywgSHVuZ2FyaWFuLAorIyBJbmRvbmVzaWFuLCBJdGFsaWFuLCBKYXBhbmVzZSwgSmFwYW5lc2UtZW4gKEphcGFuZXNlIHdpdGggRW5nbGlzaCBtZXNzYWdlcyksCisjIEtvcmVhbiwgS29yZWFuLWVuIChLb3JlYW4gd2l0aCBFbmdsaXNoIG1lc3NhZ2VzKSwgTGF0dmlhbiwgTGl0aHVhbmlhbiwKKyMgTWFjZWRvbmlhbiwgTm9yd2VnaWFuLCBQZXJzaWFuIChGYXJzaSksIFBvbGlzaCwgUG9ydHVndWVzZSwgUm9tYW5pYW4sIFJ1c3NpYW4sCisjIFNlcmJpYW4sIFNlcmJpYW4tQ3lyaWxsaWMsIFNsb3ZhaywgU2xvdmVuZSwgU3BhbmlzaCwgU3dlZGlzaCwgVHVya2lzaCwKKyMgVWtyYWluaWFuIGFuZCBWaWV0bmFtZXNlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogRW5nbGlzaC4KKworT1VUUFVUX0xBTkdVQUdFICAgICAgICA9IEVuZ2xpc2gKKworIyBJZiB0aGUgQlJJRUZfTUVNQkVSX0RFU0MgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBpbmNsdWRlIGJyaWVmIG1lbWJlcgorIyBkZXNjcmlwdGlvbnMgYWZ0ZXIgdGhlIG1lbWJlcnMgdGhhdCBhcmUgbGlzdGVkIGluIHRoZSBmaWxlIGFuZCBjbGFzcworIyBkb2N1bWVudGF0aW9uIChzaW1pbGFyIHRvIEphdmFkb2MpLiBTZXQgdG8gTk8gdG8gZGlzYWJsZSB0aGlzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitCUklFRl9NRU1CRVJfREVTQyAgICAgID0gWUVTCisKKyMgSWYgdGhlIFJFUEVBVF9CUklFRiB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIHByZXBlbmQgdGhlIGJyaWVmCisjIGRlc2NyaXB0aW9uIG9mIGEgbWVtYmVyIG9yIGZ1bmN0aW9uIGJlZm9yZSB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24KKyMKKyMgTm90ZTogSWYgYm90aCBISURFX1VORE9DX01FTUJFUlMgYW5kIEJSSUVGX01FTUJFUl9ERVNDIGFyZSBzZXQgdG8gTk8sIHRoZQorIyBicmllZiBkZXNjcmlwdGlvbnMgd2lsbCBiZSBjb21wbGV0ZWx5IHN1cHByZXNzZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK1JFUEVBVF9CUklFRiAgICAgICAgICAgPSBZRVMKKworIyBUaGlzIHRhZyBpbXBsZW1lbnRzIGEgcXVhc2ktaW50ZWxsaWdlbnQgYnJpZWYgZGVzY3JpcHRpb24gYWJicmV2aWF0b3IgdGhhdCBpcworIyB1c2VkIHRvIGZvcm0gdGhlIHRleHQgaW4gdmFyaW91cyBsaXN0aW5ncy4gRWFjaCBzdHJpbmcgaW4gdGhpcyBsaXN0LCBpZiBmb3VuZAorIyBhcyB0aGUgbGVhZGluZyB0ZXh0IG9mIHRoZSBicmllZiBkZXNjcmlwdGlvbiwgd2lsbCBiZSBzdHJpcHBlZCBmcm9tIHRoZSB0ZXh0CisjIGFuZCB0aGUgcmVzdWx0LCBhZnRlciBwcm9jZXNzaW5nIHRoZSB3aG9sZSBsaXN0LCBpcyB1c2VkIGFzIHRoZSBhbm5vdGF0ZWQKKyMgdGV4dC4gT3RoZXJ3aXNlLCB0aGUgYnJpZWYgZGVzY3JpcHRpb24gaXMgdXNlZCBhcy1pcy4gSWYgbGVmdCBibGFuaywgdGhlCisjIGZvbGxvd2luZyB2YWx1ZXMgYXJlIHVzZWQgKCRuYW1lIGlzIGF1dG9tYXRpY2FsbHkgcmVwbGFjZWQgd2l0aCB0aGUgbmFtZSBvZgorIyB0aGUgZW50aXR5KTpUaGUgJG5hbWUgY2xhc3MsIFRoZSAkbmFtZSB3aWRnZXQsIFRoZSAkbmFtZSBmaWxlLCBpcywgcHJvdmlkZXMsCisjIHNwZWNpZmllcywgY29udGFpbnMsIHJlcHJlc2VudHMsIGEsIGFuIGFuZCB0aGUuCisKK0FCQlJFVklBVEVfQlJJRUYgICAgICAgPSAiVGhlICRuYW1lIGNsYXNzIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSAkbmFtZSB3aWRnZXQiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlICRuYW1lIGZpbGUiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpcyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlcHJlc2VudHMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGEgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGFuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aGUKKworIyBJZiB0aGUgQUxXQVlTX0RFVEFJTEVEX1NFQyBhbmQgUkVQRUFUX0JSSUVGIHRhZ3MgYXJlIGJvdGggc2V0IHRvIFlFUyB0aGVuCisjIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGRldGFpbGVkIHNlY3Rpb24gZXZlbiBpZiB0aGVyZSBpcyBvbmx5IGEgYnJpZWYKKyMgZGVzY3JpcHRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworQUxXQVlTX0RFVEFJTEVEX1NFQyAgICA9IE5PCisKKyMgSWYgdGhlIElOTElORV9JTkhFUklURURfTUVNQiB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIHNob3cgYWxsCisjIGluaGVyaXRlZCBtZW1iZXJzIG9mIGEgY2xhc3MgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgdGhhdCBjbGFzcyBhcyBpZiB0aG9zZQorIyBtZW1iZXJzIHdlcmUgb3JkaW5hcnkgY2xhc3MgbWVtYmVycy4gQ29uc3RydWN0b3JzLCBkZXN0cnVjdG9ycyBhbmQgYXNzaWdubWVudAorIyBvcGVyYXRvcnMgb2YgdGhlIGJhc2UgY2xhc3NlcyB3aWxsIG5vdCBiZSBzaG93bi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitJTkxJTkVfSU5IRVJJVEVEX01FTUIgID0gWUVTCisKKyMgSWYgdGhlIEZVTExfUEFUSF9OQU1FUyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIHByZXBlbmQgdGhlIGZ1bGwgcGF0aAorIyBiZWZvcmUgZmlsZXMgbmFtZSBpbiB0aGUgZmlsZSBsaXN0IGFuZCBpbiB0aGUgaGVhZGVyIGZpbGVzLiBJZiBzZXQgdG8gTk8gdGhlCisjIHNob3J0ZXN0IHBhdGggdGhhdCBtYWtlcyB0aGUgZmlsZSBuYW1lIHVuaXF1ZSB3aWxsIGJlIHVzZWQKKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworRlVMTF9QQVRIX05BTUVTICAgICAgICA9IFlFUworCisjIFRoZSBTVFJJUF9GUk9NX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHN0cmlwIGEgdXNlci1kZWZpbmVkIHBhcnQgb2YgdGhlIHBhdGguCisjIFN0cmlwcGluZyBpcyBvbmx5IGRvbmUgaWYgb25lIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5ncyBtYXRjaGVzIHRoZSBsZWZ0LWhhbmQKKyMgcGFydCBvZiB0aGUgcGF0aC4gVGhlIHRhZyBjYW4gYmUgdXNlZCB0byBzaG93IHJlbGF0aXZlIHBhdGhzIGluIHRoZSBmaWxlIGxpc3QuCisjIElmIGxlZnQgYmxhbmsgdGhlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIGRveHlnZW4gaXMgcnVuIGlzIHVzZWQgYXMgdGhlIHBhdGggdG8KKyMgc3RyaXAuCisjCisjIE5vdGUgdGhhdCB5b3UgY2FuIHNwZWNpZnkgYWJzb2x1dGUgcGF0aHMgaGVyZSwgYnV0IGFsc28gcmVsYXRpdmUgcGF0aHMsIHdoaWNoCisjIHdpbGwgYmUgcmVsYXRpdmUgZnJvbSB0aGUgZGlyZWN0b3J5IHdoZXJlIGRveHlnZW4gaXMgc3RhcnRlZC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEZVTExfUEFUSF9OQU1FUyBpcyBzZXQgdG8gWUVTLgorCitTVFJJUF9GUk9NX1BBVEggICAgICAgID0gZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlYzIKKworIyBUaGUgU1RSSVBfRlJPTV9JTkNfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3RyaXAgYSB1c2VyLWRlZmluZWQgcGFydCBvZiB0aGUKKyMgcGF0aCBtZW50aW9uZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgYSBjbGFzcywgd2hpY2ggdGVsbHMgdGhlIHJlYWRlciB3aGljaAorIyBoZWFkZXIgZmlsZSB0byBpbmNsdWRlIGluIG9yZGVyIHRvIHVzZSBhIGNsYXNzLiBJZiBsZWZ0IGJsYW5rIG9ubHkgdGhlIG5hbWUgb2YKKyMgdGhlIGhlYWRlciBmaWxlIGNvbnRhaW5pbmcgdGhlIGNsYXNzIGRlZmluaXRpb24gaXMgdXNlZC4gT3RoZXJ3aXNlIG9uZSBzaG91bGQKKyMgc3BlY2lmeSB0aGUgbGlzdCBvZiBpbmNsdWRlIHBhdGhzIHRoYXQgYXJlIG5vcm1hbGx5IHBhc3NlZCB0byB0aGUgY29tcGlsZXIKKyMgdXNpbmcgdGhlIC1JIGZsYWcuCisKK1NUUklQX0ZST01fSU5DX1BBVEggICAgPSAKKworIyBJZiB0aGUgU0hPUlRfTkFNRVMgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBtdWNoIHNob3J0ZXIgKGJ1dAorIyBsZXNzIHJlYWRhYmxlKSBmaWxlIG5hbWVzLiBUaGlzIGNhbiBiZSB1c2VmdWwgaXMgeW91ciBmaWxlIHN5c3RlbXMgZG9lc24ndAorIyBzdXBwb3J0IGxvbmcgbmFtZXMgbGlrZSBvbiBET1MsIE1hYywgb3IgQ0QtUk9NLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1NIT1JUX05BTUVTICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBKQVZBRE9DX0FVVE9CUklFRiB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBpbnRlcnByZXQgdGhlCisjIGZpcnN0IGxpbmUgKHVudGlsIHRoZSBmaXJzdCBkb3QpIG9mIGEgSmF2YWRvYy1zdHlsZSBjb21tZW50IGFzIHRoZSBicmllZgorIyBkZXNjcmlwdGlvbi4gSWYgc2V0IHRvIE5PLCB0aGUgSmF2YWRvYy1zdHlsZSB3aWxsIGJlaGF2ZSBqdXN0IGxpa2UgcmVndWxhciBRdC0KKyMgc3R5bGUgY29tbWVudHMgKHRodXMgcmVxdWlyaW5nIGFuIGV4cGxpY2l0IEBicmllZiBjb21tYW5kIGZvciBhIGJyaWVmCisjIGRlc2NyaXB0aW9uLikKKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitKQVZBRE9DX0FVVE9CUklFRiAgICAgID0gWUVTCisKKyMgSWYgdGhlIFFUX0FVVE9CUklFRiB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBpbnRlcnByZXQgdGhlIGZpcnN0CisjIGxpbmUgKHVudGlsIHRoZSBmaXJzdCBkb3QpIG9mIGEgUXQtc3R5bGUgY29tbWVudCBhcyB0aGUgYnJpZWYgZGVzY3JpcHRpb24uIElmCisjIHNldCB0byBOTywgdGhlIFF0LXN0eWxlIHdpbGwgYmVoYXZlIGp1c3QgbGlrZSByZWd1bGFyIFF0LXN0eWxlIGNvbW1lbnRzICh0aHVzCisjIHJlcXVpcmluZyBhbiBleHBsaWNpdCBcYnJpZWYgY29tbWFuZCBmb3IgYSBicmllZiBkZXNjcmlwdGlvbi4pCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworUVRfQVVUT0JSSUVGICAgICAgICAgICA9IFlFUworCisjIFRoZSBNVUxUSUxJTkVfQ1BQX0lTX0JSSUVGIHRhZyBjYW4gYmUgc2V0IHRvIFlFUyB0byBtYWtlIGRveHlnZW4gdHJlYXQgYQorIyBtdWx0aS1saW5lIEMrKyBzcGVjaWFsIGNvbW1lbnQgYmxvY2sgKGkuZS4gYSBibG9jayBvZiAvLyEgb3IgLy8vIGNvbW1lbnRzKSBhcworIyBhIGJyaWVmIGRlc2NyaXB0aW9uLiBUaGlzIHVzZWQgdG8gYmUgdGhlIGRlZmF1bHQgYmVoYXZpb3IuIFRoZSBuZXcgZGVmYXVsdCBpcworIyB0byB0cmVhdCBhIG11bHRpLWxpbmUgQysrIGNvbW1lbnQgYmxvY2sgYXMgYSBkZXRhaWxlZCBkZXNjcmlwdGlvbi4gU2V0IHRoaXMKKyMgdGFnIHRvIFlFUyBpZiB5b3UgcHJlZmVyIHRoZSBvbGQgYmVoYXZpb3IgaW5zdGVhZC4KKyMKKyMgTm90ZSB0aGF0IHNldHRpbmcgdGhpcyB0YWcgdG8gWUVTIGFsc28gbWVhbnMgdGhhdCByYXRpb25hbCByb3NlIGNvbW1lbnRzIGFyZQorIyBub3QgcmVjb2duaXplZCBhbnkgbW9yZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitNVUxUSUxJTkVfQ1BQX0lTX0JSSUVGID0gTk8KKworIyBJZiB0aGUgSU5IRVJJVF9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gYW4gdW5kb2N1bWVudGVkIG1lbWJlciBpbmhlcml0cyB0aGUKKyMgZG9jdW1lbnRhdGlvbiBmcm9tIGFueSBkb2N1bWVudGVkIG1lbWJlciB0aGF0IGl0IHJlLWltcGxlbWVudHMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0lOSEVSSVRfRE9DUyAgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgU0VQQVJBVEVfTUVNQkVSX1BBR0VTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHByb2R1Y2UgYSBuZXcKKyMgcGFnZSBmb3IgZWFjaCBtZW1iZXIuIElmIHNldCB0byBOTywgdGhlIGRvY3VtZW50YXRpb24gb2YgYSBtZW1iZXIgd2lsbCBiZSBwYXJ0CisjIG9mIHRoZSBmaWxlL2NsYXNzL25hbWVzcGFjZSB0aGF0IGNvbnRhaW5zIGl0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1NFUEFSQVRFX01FTUJFUl9QQUdFUyAgPSBOTworCisjIFRoZSBUQUJfU0laRSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBudW1iZXIgb2Ygc3BhY2VzIGluIGEgdGFiLiBEb3h5Z2VuCisjIHVzZXMgdGhpcyB2YWx1ZSB0byByZXBsYWNlIHRhYnMgYnkgc3BhY2VzIGluIGNvZGUgZnJhZ21lbnRzLgorIyBNaW5pbXVtIHZhbHVlOiAxLCBtYXhpbXVtIHZhbHVlOiAxNiwgZGVmYXVsdCB2YWx1ZTogNC4KKworVEFCX1NJWkUgICAgICAgICAgICAgICA9IDQKKworIyBUaGlzIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbnVtYmVyIG9mIGFsaWFzZXMgdGhhdCBhY3QgYXMgY29tbWFuZHMgaW4KKyMgdGhlIGRvY3VtZW50YXRpb24uIEFuIGFsaWFzIGhhcyB0aGUgZm9ybToKKyMgbmFtZT12YWx1ZQorIyBGb3IgZXhhbXBsZSBhZGRpbmcKKyMgInNpZGVlZmZlY3Q9QHBhciBTaWRlIEVmZmVjdHM6XG4iCisjIHdpbGwgYWxsb3cgeW91IHRvIHB1dCB0aGUgY29tbWFuZCBcc2lkZWVmZmVjdCAob3IgQHNpZGVlZmZlY3QpIGluIHRoZQorIyBkb2N1bWVudGF0aW9uLCB3aGljaCB3aWxsIHJlc3VsdCBpbiBhIHVzZXItZGVmaW5lZCBwYXJhZ3JhcGggd2l0aCBoZWFkaW5nCisjICJTaWRlIEVmZmVjdHM6Ii4gWW91IGNhbiBwdXQgXG4ncyBpbiB0aGUgdmFsdWUgcGFydCBvZiBhbiBhbGlhcyB0byBpbnNlcnQKKyMgbmV3bGluZXMuCisKK0FMSUFTRVMgICAgICAgICAgICAgICAgPSAKKworIyBUaGlzIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbnVtYmVyIG9mIHdvcmQta2V5d29yZCBtYXBwaW5ncyAoVENMIG9ubHkpLgorIyBBIG1hcHBpbmcgaGFzIHRoZSBmb3JtICJuYW1lPXZhbHVlIi4gRm9yIGV4YW1wbGUgYWRkaW5nICJjbGFzcz1pdGNsOjpjbGFzcyIKKyMgd2lsbCBhbGxvdyB5b3UgdG8gdXNlIHRoZSBjb21tYW5kIGNsYXNzIGluIHRoZSBpdGNsOjpjbGFzcyBtZWFuaW5nLgorCitUQ0xfU1VCU1QgICAgICAgICAgICAgID0gCisKKyMgU2V0IHRoZSBPUFRJTUlaRV9PVVRQVVRfRk9SX0MgdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2YgQyBzb3VyY2VzCisjIG9ubHkuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIG1vcmUgdGFpbG9yZWQgZm9yIEMuIEZvcgorIyBpbnN0YW5jZSwgc29tZSBvZiB0aGUgbmFtZXMgdGhhdCBhcmUgdXNlZCB3aWxsIGJlIGRpZmZlcmVudC4gVGhlIGxpc3Qgb2YgYWxsCisjIG1lbWJlcnMgd2lsbCBiZSBvbWl0dGVkLCBldGMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworT1BUSU1JWkVfT1VUUFVUX0ZPUl9DICA9IE5PCisKKyMgU2V0IHRoZSBPUFRJTUlaRV9PVVRQVVRfSkFWQSB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBKYXZhIG9yCisjIFB5dGhvbiBzb3VyY2VzIG9ubHkuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIG1vcmUgdGFpbG9yZWQKKyMgZm9yIHRoYXQgbGFuZ3VhZ2UuIEZvciBpbnN0YW5jZSwgbmFtZXNwYWNlcyB3aWxsIGJlIHByZXNlbnRlZCBhcyBwYWNrYWdlcywKKyMgcXVhbGlmaWVkIHNjb3BlcyB3aWxsIGxvb2sgZGlmZmVyZW50LCBldGMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworT1BUSU1JWkVfT1VUUFVUX0pBVkEgICA9IE5PCisKKyMgU2V0IHRoZSBPUFRJTUlaRV9GT1JfRk9SVFJBTiB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBGb3J0cmFuCisjIHNvdXJjZXMuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIHRhaWxvcmVkIGZvciBGb3J0cmFuLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK09QVElNSVpFX0ZPUl9GT1JUUkFOICAgPSBOTworCisjIFNldCB0aGUgT1BUSU1JWkVfT1VUUFVUX1ZIREwgdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2YgVkhETAorIyBzb3VyY2VzLiBEb3h5Z2VuIHdpbGwgdGhlbiBnZW5lcmF0ZSBvdXRwdXQgdGhhdCBpcyB0YWlsb3JlZCBmb3IgVkhETC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitPUFRJTUlaRV9PVVRQVVRfVkhETCAgID0gTk8KKworIyBEb3h5Z2VuIHNlbGVjdHMgdGhlIHBhcnNlciB0byB1c2UgZGVwZW5kaW5nIG9uIHRoZSBleHRlbnNpb24gb2YgdGhlIGZpbGVzIGl0CisjIHBhcnNlcy4gV2l0aCB0aGlzIHRhZyB5b3UgY2FuIGFzc2lnbiB3aGljaCBwYXJzZXIgdG8gdXNlIGZvciBhIGdpdmVuCisjIGV4dGVuc2lvbi4gRG94eWdlbiBoYXMgYSBidWlsdC1pbiBtYXBwaW5nLCBidXQgeW91IGNhbiBvdmVycmlkZSBvciBleHRlbmQgaXQKKyMgdXNpbmcgdGhpcyB0YWcuIFRoZSBmb3JtYXQgaXMgZXh0PWxhbmd1YWdlLCB3aGVyZSBleHQgaXMgYSBmaWxlIGV4dGVuc2lvbiwgYW5kCisjIGxhbmd1YWdlIGlzIG9uZSBvZiB0aGUgcGFyc2VycyBzdXBwb3J0ZWQgYnkgZG94eWdlbjogSURMLCBKYXZhLCBKYXZhc2NyaXB0LAorIyBDIywgQywgQysrLCBELCBQSFAsIE9iamVjdGl2ZS1DLCBQeXRob24sIEZvcnRyYW4gKGZpeGVkIGZvcm1hdCBGb3J0cmFuOgorIyBGb3J0cmFuRml4ZWQsIGZyZWUgZm9ybWF0dGVkIEZvcnRyYW46IEZvcnRyYW5GcmVlLCB1bmtub3duIGZvcm1hdHRlZCBGb3J0cmFuOgorIyBGb3J0cmFuLiBJbiB0aGUgbGF0ZXIgY2FzZSB0aGUgcGFyc2VyIHRyaWVzIHRvIGd1ZXNzIHdoZXRoZXIgdGhlIGNvZGUgaXMgZml4ZWQKKyMgb3IgZnJlZSBmb3JtYXR0ZWQgY29kZSwgdGhpcyBpcyB0aGUgZGVmYXVsdCBmb3IgRm9ydHJhbiB0eXBlIGZpbGVzKSwgVkhETC4gRm9yCisjIGluc3RhbmNlIHRvIG1ha2UgZG94eWdlbiB0cmVhdCAuaW5jIGZpbGVzIGFzIEZvcnRyYW4gZmlsZXMgKGRlZmF1bHQgaXMgUEhQKSwKKyMgYW5kIC5mIGZpbGVzIGFzIEMgKGRlZmF1bHQgaXMgRm9ydHJhbiksIHVzZTogaW5jPUZvcnRyYW4gZj1DLgorIworIyBOb3RlOiBGb3IgZmlsZXMgd2l0aG91dCBleHRlbnNpb24geW91IGNhbiB1c2Ugbm9fZXh0ZW5zaW9uIGFzIGEgcGxhY2Vob2xkZXIuCisjCisjIE5vdGUgdGhhdCBmb3IgY3VzdG9tIGV4dGVuc2lvbnMgeW91IGFsc28gbmVlZCB0byBzZXQgRklMRV9QQVRURVJOUyBvdGhlcndpc2UKKyMgdGhlIGZpbGVzIGFyZSBub3QgcmVhZCBieSBkb3h5Z2VuLgorCitFWFRFTlNJT05fTUFQUElORyAgICAgID0gCisKKyMgSWYgdGhlIE1BUktET1dOX1NVUFBPUlQgdGFnIGlzIGVuYWJsZWQgdGhlbiBkb3h5Z2VuIHByZS1wcm9jZXNzZXMgYWxsIGNvbW1lbnRzCisjIGFjY29yZGluZyB0byB0aGUgTWFya2Rvd24gZm9ybWF0LCB3aGljaCBhbGxvd3MgZm9yIG1vcmUgcmVhZGFibGUKKyMgZG9jdW1lbnRhdGlvbi4gU2VlIGh0dHA6Ly9kYXJpbmdmaXJlYmFsbC5uZXQvcHJvamVjdHMvbWFya2Rvd24vIGZvciBkZXRhaWxzLgorIyBUaGUgb3V0cHV0IG9mIG1hcmtkb3duIHByb2Nlc3NpbmcgaXMgZnVydGhlciBwcm9jZXNzZWQgYnkgZG94eWdlbiwgc28geW91IGNhbgorIyBtaXggZG94eWdlbiwgSFRNTCwgYW5kIFhNTCBjb21tYW5kcyB3aXRoIE1hcmtkb3duIGZvcm1hdHRpbmcuIERpc2FibGUgb25seSBpbgorIyBjYXNlIG9mIGJhY2t3YXJkIGNvbXBhdGliaWxpdGllcyBpc3N1ZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK01BUktET1dOX1NVUFBPUlQgICAgICAgPSBZRVMKKworIyBXaGVuIGVuYWJsZWQgZG94eWdlbiB0cmllcyB0byBsaW5rIHdvcmRzIHRoYXQgY29ycmVzcG9uZCB0byBkb2N1bWVudGVkCisjIGNsYXNzZXMsIG9yIG5hbWVzcGFjZXMgdG8gdGhlaXIgY29ycmVzcG9uZGluZyBkb2N1bWVudGF0aW9uLiBTdWNoIGEgbGluayBjYW4KKyMgYmUgcHJldmVudGVkIGluIGluZGl2aWR1YWwgY2FzZXMgYnkgcHV0dGluZyBhICUgc2lnbiBpbiBmcm9udCBvZiB0aGUgd29yZCBvcgorIyBnbG9iYWxseSBieSBzZXR0aW5nIEFVVE9MSU5LX1NVUFBPUlQgdG8gTk8uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0FVVE9MSU5LX1NVUFBPUlQgICAgICAgPSBZRVMKKworIyBJZiB5b3UgdXNlIFNUTCBjbGFzc2VzIChpLmUuIHN0ZDo6c3RyaW5nLCBzdGQ6OnZlY3RvciwgZXRjLikgYnV0IGRvIG5vdCB3YW50CisjIHRvIGluY2x1ZGUgKGEgdGFnIGZpbGUgZm9yKSB0aGUgU1RMIHNvdXJjZXMgYXMgaW5wdXQsIHRoZW4geW91IHNob3VsZCBzZXQgdGhpcworIyB0YWcgdG8gWUVTIGluIG9yZGVyIHRvIGxldCBkb3h5Z2VuIG1hdGNoIGZ1bmN0aW9ucyBkZWNsYXJhdGlvbnMgYW5kCisjIGRlZmluaXRpb25zIHdob3NlIGFyZ3VtZW50cyBjb250YWluIFNUTCBjbGFzc2VzIChlLmcuIGZ1bmMoc3RkOjpzdHJpbmcpOworIyB2ZXJzdXMgZnVuYyhzdGQ6OnN0cmluZykge30pLiBUaGlzIGFsc28gbWFrZSB0aGUgaW5oZXJpdGFuY2UgYW5kIGNvbGxhYm9yYXRpb24KKyMgZGlhZ3JhbXMgdGhhdCBpbnZvbHZlIFNUTCBjbGFzc2VzIG1vcmUgY29tcGxldGUgYW5kIGFjY3VyYXRlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0JVSUxUSU5fU1RMX1NVUFBPUlQgICAgPSBZRVMKKworIyBJZiB5b3UgdXNlIE1pY3Jvc29mdCdzIEMrKy9DTEkgbGFuZ3VhZ2UsIHlvdSBzaG91bGQgc2V0IHRoaXMgb3B0aW9uIHRvIFlFUyB0bworIyBlbmFibGUgcGFyc2luZyBzdXBwb3J0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0NQUF9DTElfU1VQUE9SVCAgICAgICAgPSBOTworCisjIFNldCB0aGUgU0lQX1NVUFBPUlQgdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2Ygc2lwIChzZWU6CisjIGh0dHA6Ly93d3cucml2ZXJiYW5rY29tcHV0aW5nLmNvLnVrL3NvZnR3YXJlL3NpcC9pbnRybykgc291cmNlcyBvbmx5LiBEb3h5Z2VuCisjIHdpbGwgcGFyc2UgdGhlbSBsaWtlIG5vcm1hbCBDKysgYnV0IHdpbGwgYXNzdW1lIGFsbCBjbGFzc2VzIHVzZSBwdWJsaWMgaW5zdGVhZAorIyBvZiBwcml2YXRlIGluaGVyaXRhbmNlIHdoZW4gbm8gZXhwbGljaXQgcHJvdGVjdGlvbiBrZXl3b3JkIGlzIHByZXNlbnQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworU0lQX1NVUFBPUlQgICAgICAgICAgICA9IE5PCisKKyMgRm9yIE1pY3Jvc29mdCdzIElETCB0aGVyZSBhcmUgcHJvcGdldCBhbmQgcHJvcHB1dCBhdHRyaWJ1dGVzIHRvIGluZGljYXRlCisjIGdldHRlciBhbmQgc2V0dGVyIG1ldGhvZHMgZm9yIGEgcHJvcGVydHkuIFNldHRpbmcgdGhpcyBvcHRpb24gdG8gWUVTIHdpbGwgbWFrZQorIyBkb3h5Z2VuIHRvIHJlcGxhY2UgdGhlIGdldCBhbmQgc2V0IG1ldGhvZHMgYnkgYSBwcm9wZXJ0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhpcyB3aWxsIG9ubHkgd29yayBpZiB0aGUgbWV0aG9kcyBhcmUgaW5kZWVkIGdldHRpbmcgb3Igc2V0dGluZyBhIHNpbXBsZQorIyB0eXBlLiBJZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSwgb3IgeW91IHdhbnQgdG8gc2hvdyB0aGUgbWV0aG9kcyBhbnl3YXksIHlvdQorIyBzaG91bGQgc2V0IHRoaXMgb3B0aW9uIHRvIE5PLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitJRExfUFJPUEVSVFlfU1VQUE9SVCAgID0gWUVTCisKKyMgSWYgbWVtYmVyIGdyb3VwaW5nIGlzIHVzZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kIHRoZSBESVNUUklCVVRFX0dST1VQX0RPQworIyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCByZXVzZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgZmlyc3QKKyMgbWVtYmVyIGluIHRoZSBncm91cCAoaWYgYW55KSBmb3IgdGhlIG90aGVyIG1lbWJlcnMgb2YgdGhlIGdyb3VwLiBCeSBkZWZhdWx0CisjIGFsbCBtZW1iZXJzIG9mIGEgZ3JvdXAgbXVzdCBiZSBkb2N1bWVudGVkIGV4cGxpY2l0bHkuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRElTVFJJQlVURV9HUk9VUF9ET0MgICA9IE5PCisKKyMgSWYgb25lIGFkZHMgYSBzdHJ1Y3Qgb3IgY2xhc3MgdG8gYSBncm91cCBhbmQgdGhpcyBvcHRpb24gaXMgZW5hYmxlZCwgdGhlbiBhbHNvCisjIGFueSBuZXN0ZWQgY2xhc3Mgb3Igc3RydWN0IGlzIGFkZGVkIHRvIHRoZSBzYW1lIGdyb3VwLiBCeSBkZWZhdWx0IHRoaXMgb3B0aW9uCisjIGlzIGRpc2FibGVkIGFuZCBvbmUgaGFzIHRvIGFkZCBuZXN0ZWQgY29tcG91bmRzIGV4cGxpY2l0bHkgdmlhIFxpbmdyb3VwLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0dST1VQX05FU1RFRF9DT01QT1VORFMgPSBOTworCisjIFNldCB0aGUgU1VCR1JPVVBJTkcgdGFnIHRvIFlFUyB0byBhbGxvdyBjbGFzcyBtZW1iZXIgZ3JvdXBzIG9mIHRoZSBzYW1lIHR5cGUKKyMgKGZvciBpbnN0YW5jZSBhIGdyb3VwIG9mIHB1YmxpYyBmdW5jdGlvbnMpIHRvIGJlIHB1dCBhcyBhIHN1Ymdyb3VwIG9mIHRoYXQKKyMgdHlwZSAoZS5nLiB1bmRlciB0aGUgUHVibGljIEZ1bmN0aW9ucyBzZWN0aW9uKS4gU2V0IGl0IHRvIE5PIHRvIHByZXZlbnQKKyMgc3ViZ3JvdXBpbmcuIEFsdGVybmF0aXZlbHksIHRoaXMgY2FuIGJlIGRvbmUgcGVyIGNsYXNzIHVzaW5nIHRoZQorIyBcbm9zdWJncm91cGluZyBjb21tYW5kLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitTVUJHUk9VUElORyAgICAgICAgICAgID0gWUVTCisKKyMgV2hlbiB0aGUgSU5MSU5FX0dST1VQRURfQ0xBU1NFUyB0YWcgaXMgc2V0IHRvIFlFUywgY2xhc3Nlcywgc3RydWN0cyBhbmQgdW5pb25zCisjIGFyZSBzaG93biBpbnNpZGUgdGhlIGdyb3VwIGluIHdoaWNoIHRoZXkgYXJlIGluY2x1ZGVkIChlLmcuIHVzaW5nIFxpbmdyb3VwKQorIyBpbnN0ZWFkIG9mIG9uIGEgc2VwYXJhdGUgcGFnZSAoZm9yIEhUTUwgYW5kIE1hbiBwYWdlcykgb3Igc2VjdGlvbiAoZm9yIExhVGVYCisjIGFuZCBSVEYpLgorIworIyBOb3RlIHRoYXQgdGhpcyBmZWF0dXJlIGRvZXMgbm90IHdvcmsgaW4gY29tYmluYXRpb24gd2l0aAorIyBTRVBBUkFURV9NRU1CRVJfUEFHRVMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSU5MSU5FX0dST1VQRURfQ0xBU1NFUyA9IE5PCisKKyMgV2hlbiB0aGUgSU5MSU5FX1NJTVBMRV9TVFJVQ1RTIHRhZyBpcyBzZXQgdG8gWUVTLCBzdHJ1Y3RzLCBjbGFzc2VzLCBhbmQgdW5pb25zCisjIHdpdGggb25seSBwdWJsaWMgZGF0YSBmaWVsZHMgb3Igc2ltcGxlIHR5cGVkZWYgZmllbGRzIHdpbGwgYmUgc2hvd24gaW5saW5lIGluCisjIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBzY29wZSBpbiB3aGljaCB0aGV5IGFyZSBkZWZpbmVkIChpLmUuIGZpbGUsCisjIG5hbWVzcGFjZSwgb3IgZ3JvdXAgZG9jdW1lbnRhdGlvbiksIHByb3ZpZGVkIHRoaXMgc2NvcGUgaXMgZG9jdW1lbnRlZC4gSWYgc2V0CisjIHRvIE5PLCBzdHJ1Y3RzLCBjbGFzc2VzLCBhbmQgdW5pb25zIGFyZSBzaG93biBvbiBhIHNlcGFyYXRlIHBhZ2UgKGZvciBIVE1MIGFuZAorIyBNYW4gcGFnZXMpIG9yIHNlY3Rpb24gKGZvciBMYVRlWCBhbmQgUlRGKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitJTkxJTkVfU0lNUExFX1NUUlVDVFMgID0gTk8KKworIyBXaGVuIFRZUEVERUZfSElERVNfU1RSVUNUIHRhZyBpcyBlbmFibGVkLCBhIHR5cGVkZWYgb2YgYSBzdHJ1Y3QsIHVuaW9uLCBvcgorIyBlbnVtIGlzIGRvY3VtZW50ZWQgYXMgc3RydWN0LCB1bmlvbiwgb3IgZW51bSB3aXRoIHRoZSBuYW1lIG9mIHRoZSB0eXBlZGVmLiBTbworIyB0eXBlZGVmIHN0cnVjdCBUeXBlUyB7fSBUeXBlVCwgd2lsbCBhcHBlYXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYXMgYSBzdHJ1Y3QKKyMgd2l0aCBuYW1lIFR5cGVULiBXaGVuIGRpc2FibGVkIHRoZSB0eXBlZGVmIHdpbGwgYXBwZWFyIGFzIGEgbWVtYmVyIG9mIGEgZmlsZSwKKyMgbmFtZXNwYWNlLCBvciBjbGFzcy4gQW5kIHRoZSBzdHJ1Y3Qgd2lsbCBiZSBuYW1lZCBUeXBlUy4gVGhpcyBjYW4gdHlwaWNhbGx5IGJlCisjIHVzZWZ1bCBmb3IgQyBjb2RlIGluIGNhc2UgdGhlIGNvZGluZyBjb252ZW50aW9uIGRpY3RhdGVzIHRoYXQgYWxsIGNvbXBvdW5kCisjIHR5cGVzIGFyZSB0eXBlZGVmJ2VkIGFuZCBvbmx5IHRoZSB0eXBlZGVmIGlzIHJlZmVyZW5jZWQsIG5ldmVyIHRoZSB0YWcgbmFtZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitUWVBFREVGX0hJREVTX1NUUlVDVCAgID0gWUVTCisKKyMgVGhlIHNpemUgb2YgdGhlIHN5bWJvbCBsb29rdXAgY2FjaGUgY2FuIGJlIHNldCB1c2luZyBMT09LVVBfQ0FDSEVfU0laRS4gVGhpcworIyBjYWNoZSBpcyB1c2VkIHRvIHJlc29sdmUgc3ltYm9scyBnaXZlbiB0aGVpciBuYW1lIGFuZCBzY29wZS4gU2luY2UgdGhpcyBjYW4gYmUKKyMgYW4gZXhwZW5zaXZlIHByb2Nlc3MgYW5kIG9mdGVuIHRoZSBzYW1lIHN5bWJvbCBhcHBlYXJzIG11bHRpcGxlIHRpbWVzIGluIHRoZQorIyBjb2RlLCBkb3h5Z2VuIGtlZXBzIGEgY2FjaGUgb2YgcHJlLXJlc29sdmVkIHN5bWJvbHMuIElmIHRoZSBjYWNoZSBpcyB0b28gc21hbGwKKyMgZG94eWdlbiB3aWxsIGJlY29tZSBzbG93ZXIuIElmIHRoZSBjYWNoZSBpcyB0b28gbGFyZ2UsIG1lbW9yeSBpcyB3YXN0ZWQuIFRoZQorIyBjYWNoZSBzaXplIGlzIGdpdmVuIGJ5IHRoaXMgZm9ybXVsYTogMl4oMTYrTE9PS1VQX0NBQ0hFX1NJWkUpLiBUaGUgdmFsaWQgcmFuZ2UKKyMgaXMgMC4uOSwgdGhlIGRlZmF1bHQgaXMgMCwgY29ycmVzcG9uZGluZyB0byBhIGNhY2hlIHNpemUgb2YgMl4xNj02NTUzNgorIyBzeW1ib2xzLiBBdCB0aGUgZW5kIG9mIGEgcnVuIGRveHlnZW4gd2lsbCByZXBvcnQgdGhlIGNhY2hlIHVzYWdlIGFuZCBzdWdnZXN0CisjIHRoZSBvcHRpbWFsIGNhY2hlIHNpemUgZnJvbSBhIHNwZWVkIHBvaW50IG9mIHZpZXcuCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDksIGRlZmF1bHQgdmFsdWU6IDAuCisKK0xPT0tVUF9DQUNIRV9TSVpFICAgICAgPSAwCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQnVpbGQgcmVsYXRlZCBjb25maWd1cmF0aW9uIG9wdGlvbnMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgRVhUUkFDVF9BTEwgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBhc3N1bWUgYWxsIGVudGl0aWVzIGluCisjIGRvY3VtZW50YXRpb24gYXJlIGRvY3VtZW50ZWQsIGV2ZW4gaWYgbm8gZG9jdW1lbnRhdGlvbiB3YXMgYXZhaWxhYmxlLiBQcml2YXRlCisjIGNsYXNzIG1lbWJlcnMgYW5kIHN0YXRpYyBmaWxlIG1lbWJlcnMgd2lsbCBiZSBoaWRkZW4gdW5sZXNzIHRoZQorIyBFWFRSQUNUX1BSSVZBVEUgcmVzcGVjdGl2ZWx5IEVYVFJBQ1RfU1RBVElDIHRhZ3MgYXJlIHNldCB0byBZRVMuCisjIE5vdGU6IFRoaXMgd2lsbCBhbHNvIGRpc2FibGUgdGhlIHdhcm5pbmdzIGFib3V0IHVuZG9jdW1lbnRlZCBtZW1iZXJzIHRoYXQgYXJlCisjIG5vcm1hbGx5IHByb2R1Y2VkIHdoZW4gV0FSTklOR1MgaXMgc2V0IHRvIFlFUy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitFWFRSQUNUX0FMTCAgICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEVYVFJBQ1RfUFJJVkFURSB0YWcgaXMgc2V0IHRvIFlFUywgYWxsIHByaXZhdGUgbWVtYmVycyBvZiBhIGNsYXNzIHdpbGwKKyMgYmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRVhUUkFDVF9QUklWQVRFICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEVYVFJBQ1RfUEFDS0FHRSB0YWcgaXMgc2V0IHRvIFlFUywgYWxsIG1lbWJlcnMgd2l0aCBwYWNrYWdlIG9yIGludGVybmFsCisjIHNjb3BlIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRVhUUkFDVF9QQUNLQUdFICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEVYVFJBQ1RfU1RBVElDIHRhZyBpcyBzZXQgdG8gWUVTLCBhbGwgc3RhdGljIG1lbWJlcnMgb2YgYSBmaWxlIHdpbGwgYmUKKyMgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRVhUUkFDVF9TVEFUSUMgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEVYVFJBQ1RfTE9DQUxfQ0xBU1NFUyB0YWcgaXMgc2V0IHRvIFlFUywgY2xhc3NlcyAoYW5kIHN0cnVjdHMpIGRlZmluZWQKKyMgbG9jYWxseSBpbiBzb3VyY2UgZmlsZXMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gSWYgc2V0IHRvIE5PLAorIyBvbmx5IGNsYXNzZXMgZGVmaW5lZCBpbiBoZWFkZXIgZmlsZXMgYXJlIGluY2x1ZGVkLiBEb2VzIG5vdCBoYXZlIGFueSBlZmZlY3QKKyMgZm9yIEphdmEgc291cmNlcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworRVhUUkFDVF9MT0NBTF9DTEFTU0VTICA9IFlFUworCisjIFRoaXMgZmxhZyBpcyBvbmx5IHVzZWZ1bCBmb3IgT2JqZWN0aXZlLUMgY29kZS4gSWYgc2V0IHRvIFlFUywgbG9jYWwgbWV0aG9kcywKKyMgd2hpY2ggYXJlIGRlZmluZWQgaW4gdGhlIGltcGxlbWVudGF0aW9uIHNlY3Rpb24gYnV0IG5vdCBpbiB0aGUgaW50ZXJmYWNlIGFyZQorIyBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gSWYgc2V0IHRvIE5PLCBvbmx5IG1ldGhvZHMgaW4gdGhlIGludGVyZmFjZSBhcmUKKyMgaW5jbHVkZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRVhUUkFDVF9MT0NBTF9NRVRIT0RTICA9IE5PCisKKyMgSWYgdGhpcyBmbGFnIGlzIHNldCB0byBZRVMsIHRoZSBtZW1iZXJzIG9mIGFub255bW91cyBuYW1lc3BhY2VzIHdpbGwgYmUKKyMgZXh0cmFjdGVkIGFuZCBhcHBlYXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYXMgYSBuYW1lc3BhY2UgY2FsbGVkCisjICdhbm9ueW1vdXNfbmFtZXNwYWNle2ZpbGV9Jywgd2hlcmUgZmlsZSB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGhlIGJhc2UgbmFtZSBvZgorIyB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBhbm9ueW1vdXMgbmFtZXNwYWNlLiBCeSBkZWZhdWx0IGFub255bW91cyBuYW1lc3BhY2UKKyMgYXJlIGhpZGRlbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitFWFRSQUNUX0FOT05fTlNQQUNFUyAgID0gTk8KKworIyBJZiB0aGUgSElERV9VTkRPQ19NRU1CRVJTIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgaGlkZSBhbGwKKyMgdW5kb2N1bWVudGVkIG1lbWJlcnMgaW5zaWRlIGRvY3VtZW50ZWQgY2xhc3NlcyBvciBmaWxlcy4gSWYgc2V0IHRvIE5PIHRoZXNlCisjIG1lbWJlcnMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgdmFyaW91cyBvdmVydmlld3MsIGJ1dCBubyBkb2N1bWVudGF0aW9uCisjIHNlY3Rpb24gaXMgZ2VuZXJhdGVkLiBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IGlmIEVYVFJBQ1RfQUxMIGlzIGVuYWJsZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSElERV9VTkRPQ19NRU1CRVJTICAgICA9IE5PCisKKyMgSWYgdGhlIEhJREVfVU5ET0NfQ0xBU1NFUyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGhpZGUgYWxsCisjIHVuZG9jdW1lbnRlZCBjbGFzc2VzIHRoYXQgYXJlIG5vcm1hbGx5IHZpc2libGUgaW4gdGhlIGNsYXNzIGhpZXJhcmNoeS4gSWYgc2V0CisjIHRvIE5PLCB0aGVzZSBjbGFzc2VzIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIHZhcmlvdXMgb3ZlcnZpZXdzLiBUaGlzIG9wdGlvbgorIyBoYXMgbm8gZWZmZWN0IGlmIEVYVFJBQ1RfQUxMIGlzIGVuYWJsZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSElERV9VTkRPQ19DTEFTU0VTICAgICA9IE5PCisKKyMgSWYgdGhlIEhJREVfRlJJRU5EX0NPTVBPVU5EUyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGhpZGUgYWxsIGZyaWVuZAorIyAoY2xhc3N8c3RydWN0fHVuaW9uKSBkZWNsYXJhdGlvbnMuIElmIHNldCB0byBOTywgdGhlc2UgZGVjbGFyYXRpb25zIHdpbGwgYmUKKyMgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSElERV9GUklFTkRfQ09NUE9VTkRTICA9IE5PCisKKyMgSWYgdGhlIEhJREVfSU5fQk9EWV9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgaGlkZSBhbnkKKyMgZG9jdW1lbnRhdGlvbiBibG9ja3MgZm91bmQgaW5zaWRlIHRoZSBib2R5IG9mIGEgZnVuY3Rpb24uIElmIHNldCB0byBOTywgdGhlc2UKKyMgYmxvY2tzIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIGZ1bmN0aW9uJ3MgZGV0YWlsZWQgZG9jdW1lbnRhdGlvbiBibG9jay4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitISURFX0lOX0JPRFlfRE9DUyAgICAgID0gTk8KKworIyBUaGUgSU5URVJOQUxfRE9DUyB0YWcgZGV0ZXJtaW5lcyBpZiBkb2N1bWVudGF0aW9uIHRoYXQgaXMgdHlwZWQgYWZ0ZXIgYQorIyBcaW50ZXJuYWwgY29tbWFuZCBpcyBpbmNsdWRlZC4gSWYgdGhlIHRhZyBpcyBzZXQgdG8gTk8gdGhlbiB0aGUgZG9jdW1lbnRhdGlvbgorIyB3aWxsIGJlIGV4Y2x1ZGVkLiBTZXQgaXQgdG8gWUVTIHRvIGluY2x1ZGUgdGhlIGludGVybmFsIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSU5URVJOQUxfRE9DUyAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBDQVNFX1NFTlNFX05BTUVTIHRhZyBpcyBzZXQgdG8gTk8gdGhlbiBkb3h5Z2VuIHdpbGwgb25seSBnZW5lcmF0ZSBmaWxlCisjIG5hbWVzIGluIGxvd2VyLWNhc2UgbGV0dGVycy4gSWYgc2V0IHRvIFlFUywgdXBwZXItY2FzZSBsZXR0ZXJzIGFyZSBhbHNvCisjIGFsbG93ZWQuIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSBoYXZlIGNsYXNzZXMgb3IgZmlsZXMgd2hvc2UgbmFtZXMgb25seSBkaWZmZXIKKyMgaW4gY2FzZSBhbmQgaWYgeW91ciBmaWxlIHN5c3RlbSBzdXBwb3J0cyBjYXNlIHNlbnNpdGl2ZSBmaWxlIG5hbWVzLiBXaW5kb3dzCisjIGFuZCBNYWMgdXNlcnMgYXJlIGFkdmlzZWQgdG8gc2V0IHRoaXMgb3B0aW9uIHRvIE5PLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogc3lzdGVtIGRlcGVuZGVudC4KKworQ0FTRV9TRU5TRV9OQU1FUyAgICAgICA9IE5PCisKKyMgSWYgdGhlIEhJREVfU0NPUEVfTkFNRVMgdGFnIGlzIHNldCB0byBOTyB0aGVuIGRveHlnZW4gd2lsbCBzaG93IG1lbWJlcnMgd2l0aAorIyB0aGVpciBmdWxsIGNsYXNzIGFuZCBuYW1lc3BhY2Ugc2NvcGVzIGluIHRoZSBkb2N1bWVudGF0aW9uLiBJZiBzZXQgdG8gWUVTLCB0aGUKKyMgc2NvcGUgd2lsbCBiZSBoaWRkZW4uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSElERV9TQ09QRV9OQU1FUyAgICAgICA9IFlFUworCisjIElmIHRoZSBISURFX0NPTVBPVU5EX1JFRkVSRU5DRSB0YWcgaXMgc2V0IHRvIE5PIChkZWZhdWx0KSB0aGVuIGRveHlnZW4gd2lsbAorIyBhcHBlbmQgYWRkaXRpb25hbCB0ZXh0IHRvIGEgcGFnZSdzIHRpdGxlLCBzdWNoIGFzIENsYXNzIFJlZmVyZW5jZS4gSWYgc2V0IHRvCisjIFlFUyB0aGUgY29tcG91bmQgcmVmZXJlbmNlIHdpbGwgYmUgaGlkZGVuLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0hJREVfQ09NUE9VTkRfUkVGRVJFTkNFPSBOTworCisjIElmIHRoZSBTSE9XX0lOQ0xVREVfRklMRVMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgcHV0IGEgbGlzdCBvZgorIyB0aGUgZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgYnkgYSBmaWxlIGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoYXQgZmlsZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworU0hPV19JTkNMVURFX0ZJTEVTICAgICA9IFlFUworCisjIElmIHRoZSBTSE9XX0dST1VQRURfTUVNQl9JTkMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBEb3h5Z2VuIHdpbGwgYWRkIGZvciBlYWNoCisjIGdyb3VwZWQgbWVtYmVyIGFuIGluY2x1ZGUgc3RhdGVtZW50IHRvIHRoZSBkb2N1bWVudGF0aW9uLCB0ZWxsaW5nIHRoZSByZWFkZXIKKyMgd2hpY2ggZmlsZSB0byBpbmNsdWRlIGluIG9yZGVyIHRvIHVzZSB0aGUgbWVtYmVyLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1NIT1dfR1JPVVBFRF9NRU1CX0lOQyAgPSBOTworCisjIElmIHRoZSBGT1JDRV9MT0NBTF9JTkNMVURFUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBsaXN0IGluY2x1ZGUKKyMgZmlsZXMgd2l0aCBkb3VibGUgcXVvdGVzIGluIHRoZSBkb2N1bWVudGF0aW9uIHJhdGhlciB0aGFuIHdpdGggc2hhcnAgYnJhY2tldHMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRk9SQ0VfTE9DQUxfSU5DTFVERVMgICA9IE5PCisKKyMgSWYgdGhlIElOTElORV9JTkZPIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gYSB0YWcgW2lubGluZV0gaXMgaW5zZXJ0ZWQgaW4gdGhlCisjIGRvY3VtZW50YXRpb24gZm9yIGlubGluZSBtZW1iZXJzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitJTkxJTkVfSU5GTyAgICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIFNPUlRfTUVNQkVSX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgc29ydCB0aGUKKyMgKGRldGFpbGVkKSBkb2N1bWVudGF0aW9uIG9mIGZpbGUgYW5kIGNsYXNzIG1lbWJlcnMgYWxwaGFiZXRpY2FsbHkgYnkgbWVtYmVyCisjIG5hbWUuIElmIHNldCB0byBOTywgdGhlIG1lbWJlcnMgd2lsbCBhcHBlYXIgaW4gZGVjbGFyYXRpb24gb3JkZXIuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK1NPUlRfTUVNQkVSX0RPQ1MgICAgICAgPSBZRVMKKworIyBJZiB0aGUgU09SVF9CUklFRl9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHNvcnQgdGhlIGJyaWVmCisjIGRlc2NyaXB0aW9ucyBvZiBmaWxlLCBuYW1lc3BhY2UgYW5kIGNsYXNzIG1lbWJlcnMgYWxwaGFiZXRpY2FsbHkgYnkgbWVtYmVyCisjIG5hbWUuIElmIHNldCB0byBOTywgdGhlIG1lbWJlcnMgd2lsbCBhcHBlYXIgaW4gZGVjbGFyYXRpb24gb3JkZXIuIE5vdGUgdGhhdAorIyB0aGlzIHdpbGwgYWxzbyBpbmZsdWVuY2UgdGhlIG9yZGVyIG9mIHRoZSBjbGFzc2VzIGluIHRoZSBjbGFzcyBsaXN0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1NPUlRfQlJJRUZfRE9DUyAgICAgICAgPSBOTworCisjIElmIHRoZSBTT1JUX01FTUJFUlNfQ1RPUlNfMVNUIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHNvcnQgdGhlCisjIChicmllZiBhbmQgZGV0YWlsZWQpIGRvY3VtZW50YXRpb24gb2YgY2xhc3MgbWVtYmVycyBzbyB0aGF0IGNvbnN0cnVjdG9ycyBhbmQKKyMgZGVzdHJ1Y3RvcnMgYXJlIGxpc3RlZCBmaXJzdC4gSWYgc2V0IHRvIE5PIHRoZSBjb25zdHJ1Y3RvcnMgd2lsbCBhcHBlYXIgaW4gdGhlCisjIHJlc3BlY3RpdmUgb3JkZXJzIGRlZmluZWQgYnkgU09SVF9CUklFRl9ET0NTIGFuZCBTT1JUX01FTUJFUl9ET0NTLgorIyBOb3RlOiBJZiBTT1JUX0JSSUVGX0RPQ1MgaXMgc2V0IHRvIE5PIHRoaXMgb3B0aW9uIGlzIGlnbm9yZWQgZm9yIHNvcnRpbmcgYnJpZWYKKyMgbWVtYmVyIGRvY3VtZW50YXRpb24uCisjIE5vdGU6IElmIFNPUlRfTUVNQkVSX0RPQ1MgaXMgc2V0IHRvIE5PIHRoaXMgb3B0aW9uIGlzIGlnbm9yZWQgZm9yIHNvcnRpbmcKKyMgZGV0YWlsZWQgbWVtYmVyIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworU09SVF9NRU1CRVJTX0NUT1JTXzFTVCA9IE5PCisKKyMgSWYgdGhlIFNPUlRfR1JPVVBfTkFNRVMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgc29ydCB0aGUgaGllcmFyY2h5CisjIG9mIGdyb3VwIG5hbWVzIGludG8gYWxwaGFiZXRpY2FsIG9yZGVyLiBJZiBzZXQgdG8gTk8gdGhlIGdyb3VwIG5hbWVzIHdpbGwKKyMgYXBwZWFyIGluIHRoZWlyIGRlZmluZWQgb3JkZXIuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworU09SVF9HUk9VUF9OQU1FUyAgICAgICA9IE5PCisKKyMgSWYgdGhlIFNPUlRfQllfU0NPUEVfTkFNRSB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIGNsYXNzIGxpc3Qgd2lsbCBiZSBzb3J0ZWQgYnkKKyMgZnVsbHktcXVhbGlmaWVkIG5hbWVzLCBpbmNsdWRpbmcgbmFtZXNwYWNlcy4gSWYgc2V0IHRvIE5PLCB0aGUgY2xhc3MgbGlzdCB3aWxsCisjIGJlIHNvcnRlZCBvbmx5IGJ5IGNsYXNzIG5hbWUsIG5vdCBpbmNsdWRpbmcgdGhlIG5hbWVzcGFjZSBwYXJ0LgorIyBOb3RlOiBUaGlzIG9wdGlvbiBpcyBub3QgdmVyeSB1c2VmdWwgaWYgSElERV9TQ09QRV9OQU1FUyBpcyBzZXQgdG8gWUVTLgorIyBOb3RlOiBUaGlzIG9wdGlvbiBhcHBsaWVzIG9ubHkgdG8gdGhlIGNsYXNzIGxpc3QsIG5vdCB0byB0aGUgYWxwaGFiZXRpY2FsCisjIGxpc3QuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworU09SVF9CWV9TQ09QRV9OQU1FICAgICA9IE5PCisKKyMgSWYgdGhlIFNUUklDVF9QUk9UT19NQVRDSElORyBvcHRpb24gaXMgZW5hYmxlZCBhbmQgZG94eWdlbiBmYWlscyB0byBkbyBwcm9wZXIKKyMgdHlwZSByZXNvbHV0aW9uIG9mIGFsbCBwYXJhbWV0ZXJzIG9mIGEgZnVuY3Rpb24gaXQgd2lsbCByZWplY3QgYSBtYXRjaCBiZXR3ZWVuCisjIHRoZSBwcm90b3R5cGUgYW5kIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBhIG1lbWJlciBmdW5jdGlvbiBldmVuIGlmIHRoZXJlIGlzCisjIG9ubHkgb25lIGNhbmRpZGF0ZSBvciBpdCBpcyBvYnZpb3VzIHdoaWNoIGNhbmRpZGF0ZSB0byBjaG9vc2UgYnkgZG9pbmcgYQorIyBzaW1wbGUgc3RyaW5nIG1hdGNoLiBCeSBkaXNhYmxpbmcgU1RSSUNUX1BST1RPX01BVENISU5HIGRveHlnZW4gd2lsbCBzdGlsbAorIyBhY2NlcHQgYSBtYXRjaCBiZXR3ZWVuIHByb3RvdHlwZSBhbmQgaW1wbGVtZW50YXRpb24gaW4gc3VjaCBjYXNlcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitTVFJJQ1RfUFJPVE9fTUFUQ0hJTkcgID0gTk8KKworIyBUaGUgR0VORVJBVEVfVE9ET0xJU1QgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSAoWUVTKSBvciBkaXNhYmxlIChOTykgdGhlIHRvZG8KKyMgbGlzdC4gVGhpcyBsaXN0IGlzIGNyZWF0ZWQgYnkgcHV0dGluZyBcdG9kbyBjb21tYW5kcyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworR0VORVJBVEVfVE9ET0xJU1QgICAgICA9IFlFUworCisjIFRoZSBHRU5FUkFURV9URVNUTElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIChZRVMpIG9yIGRpc2FibGUgKE5PKSB0aGUgdGVzdAorIyBsaXN0LiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBieSBwdXR0aW5nIFx0ZXN0IGNvbW1hbmRzIGluIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitHRU5FUkFURV9URVNUTElTVCAgICAgID0gWUVTCisKKyMgVGhlIEdFTkVSQVRFX0JVR0xJU1QgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSAoWUVTKSBvciBkaXNhYmxlIChOTykgdGhlIGJ1ZworIyBsaXN0LiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBieSBwdXR0aW5nIFxidWcgY29tbWFuZHMgaW4gdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0dFTkVSQVRFX0JVR0xJU1QgICAgICAgPSBZRVMKKworIyBUaGUgR0VORVJBVEVfREVQUkVDQVRFRExJU1QgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSAoWUVTKSBvciBkaXNhYmxlIChOTykKKyMgdGhlIGRlcHJlY2F0ZWQgbGlzdC4gVGhpcyBsaXN0IGlzIGNyZWF0ZWQgYnkgcHV0dGluZyBcZGVwcmVjYXRlZCBjb21tYW5kcyBpbgorIyB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworR0VORVJBVEVfREVQUkVDQVRFRExJU1Q9IFlFUworCisjIFRoZSBFTkFCTEVEX1NFQ1RJT05TIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgY29uZGl0aW9uYWwgZG9jdW1lbnRhdGlvbgorIyBzZWN0aW9ucywgbWFya2VkIGJ5IFxpZiA8c2VjdGlvbl9sYWJlbD4gLi4uIFxlbmRpZiBhbmQgXGNvbmQgPHNlY3Rpb25fbGFiZWw+CisjIC4uLiBcZW5kY29uZCBibG9ja3MuCisKK0VOQUJMRURfU0VDVElPTlMgICAgICAgPSBJTlRFUk5BTAorCisjIFRoZSBNQVhfSU5JVElBTElaRVJfTElORVMgdGFnIGRldGVybWluZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRoYXQgdGhlCisjIGluaXRpYWwgdmFsdWUgb2YgYSB2YXJpYWJsZSBvciBtYWNybyAvIGRlZmluZSBjYW4gaGF2ZSBmb3IgaXQgdG8gYXBwZWFyIGluIHRoZQorIyBkb2N1bWVudGF0aW9uLiBJZiB0aGUgaW5pdGlhbGl6ZXIgY29uc2lzdHMgb2YgbW9yZSBsaW5lcyB0aGFuIHNwZWNpZmllZCBoZXJlCisjIGl0IHdpbGwgYmUgaGlkZGVuLiBVc2UgYSB2YWx1ZSBvZiAwIHRvIGhpZGUgaW5pdGlhbGl6ZXJzIGNvbXBsZXRlbHkuIFRoZQorIyBhcHBlYXJhbmNlIG9mIHRoZSB2YWx1ZSBvZiBpbmRpdmlkdWFsIHZhcmlhYmxlcyBhbmQgbWFjcm9zIC8gZGVmaW5lcyBjYW4gYmUKKyMgY29udHJvbGxlZCB1c2luZyBcc2hvd2luaXRpYWxpemVyIG9yIFxoaWRlaW5pdGlhbGl6ZXIgY29tbWFuZCBpbiB0aGUKKyMgZG9jdW1lbnRhdGlvbiByZWdhcmRsZXNzIG9mIHRoaXMgc2V0dGluZy4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMTAwMDAsIGRlZmF1bHQgdmFsdWU6IDMwLgorCitNQVhfSU5JVElBTElaRVJfTElORVMgID0gMzAKKworIyBTZXQgdGhlIFNIT1dfVVNFRF9GSUxFUyB0YWcgdG8gTk8gdG8gZGlzYWJsZSB0aGUgbGlzdCBvZiBmaWxlcyBnZW5lcmF0ZWQgYXQKKyMgdGhlIGJvdHRvbSBvZiB0aGUgZG9jdW1lbnRhdGlvbiBvZiBjbGFzc2VzIGFuZCBzdHJ1Y3RzLiBJZiBzZXQgdG8gWUVTLCB0aGUKKyMgbGlzdCB3aWxsIG1lbnRpb24gdGhlIGZpbGVzIHRoYXQgd2VyZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitTSE9XX1VTRURfRklMRVMgICAgICAgID0gWUVTCisKKyMgU2V0IHRoZSBTSE9XX0ZJTEVTIHRhZyB0byBOTyB0byBkaXNhYmxlIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBGaWxlcyBwYWdlLiBUaGlzCisjIHdpbGwgcmVtb3ZlIHRoZSBGaWxlcyBlbnRyeSBmcm9tIHRoZSBRdWljayBJbmRleCBhbmQgZnJvbSB0aGUgRm9sZGVyIFRyZWUgVmlldworIyAoaWYgc3BlY2lmaWVkKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworU0hPV19GSUxFUyAgICAgICAgICAgICA9IFlFUworCisjIFNldCB0aGUgU0hPV19OQU1FU1BBQ0VTIHRhZyB0byBOTyB0byBkaXNhYmxlIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBOYW1lc3BhY2VzCisjIHBhZ2UuIFRoaXMgd2lsbCByZW1vdmUgdGhlIE5hbWVzcGFjZXMgZW50cnkgZnJvbSB0aGUgUXVpY2sgSW5kZXggYW5kIGZyb20gdGhlCisjIEZvbGRlciBUcmVlIFZpZXcgKGlmIHNwZWNpZmllZCkuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK1NIT1dfTkFNRVNQQUNFUyAgICAgICAgPSBZRVMKKworIyBUaGUgRklMRV9WRVJTSU9OX0ZJTFRFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHByb2dyYW0gb3Igc2NyaXB0IHRoYXQKKyMgZG94eWdlbiBzaG91bGQgaW52b2tlIHRvIGdldCB0aGUgY3VycmVudCB2ZXJzaW9uIGZvciBlYWNoIGZpbGUgKHR5cGljYWxseSBmcm9tCisjIHRoZSB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtKS4gRG94eWdlbiB3aWxsIGludm9rZSB0aGUgcHJvZ3JhbSBieSBleGVjdXRpbmcgKHZpYQorIyBwb3BlbigpKSB0aGUgY29tbWFuZCBjb21tYW5kIGlucHV0LWZpbGUsIHdoZXJlIGNvbW1hbmQgaXMgdGhlIHZhbHVlIG9mIHRoZQorIyBGSUxFX1ZFUlNJT05fRklMVEVSIHRhZywgYW5kIGlucHV0LWZpbGUgaXMgdGhlIG5hbWUgb2YgYW4gaW5wdXQgZmlsZSBwcm92aWRlZAorIyBieSBkb3h5Z2VuLiBXaGF0ZXZlciB0aGUgcHJvZ3JhbSB3cml0ZXMgdG8gc3RhbmRhcmQgb3V0cHV0IGlzIHVzZWQgYXMgdGhlIGZpbGUKKyMgdmVyc2lvbi4gRm9yIGFuIGV4YW1wbGUgc2VlIHRoZSBkb2N1bWVudGF0aW9uLgorCitGSUxFX1ZFUlNJT05fRklMVEVSICAgID0gCisKKyMgVGhlIExBWU9VVF9GSUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbGF5b3V0IGZpbGUgd2hpY2ggd2lsbCBiZSBwYXJzZWQKKyMgYnkgZG94eWdlbi4gVGhlIGxheW91dCBmaWxlIGNvbnRyb2xzIHRoZSBnbG9iYWwgc3RydWN0dXJlIG9mIHRoZSBnZW5lcmF0ZWQKKyMgb3V0cHV0IGZpbGVzIGluIGFuIG91dHB1dCBmb3JtYXQgaW5kZXBlbmRlbnQgd2F5LiBUbyBjcmVhdGUgdGhlIGxheW91dCBmaWxlCisjIHRoYXQgcmVwcmVzZW50cyBkb3h5Z2VuJ3MgZGVmYXVsdHMsIHJ1biBkb3h5Z2VuIHdpdGggdGhlIC1sIG9wdGlvbi4gWW91IGNhbgorIyBvcHRpb25hbGx5IHNwZWNpZnkgYSBmaWxlIG5hbWUgYWZ0ZXIgdGhlIG9wdGlvbiwgaWYgb21pdHRlZCBEb3h5Z2VuTGF5b3V0LnhtbAorIyB3aWxsIGJlIHVzZWQgYXMgdGhlIG5hbWUgb2YgdGhlIGxheW91dCBmaWxlLgorIworIyBOb3RlIHRoYXQgaWYgeW91IHJ1biBkb3h5Z2VuIGZyb20gYSBkaXJlY3RvcnkgY29udGFpbmluZyBhIGZpbGUgY2FsbGVkCisjIERveHlnZW5MYXlvdXQueG1sLCBkb3h5Z2VuIHdpbGwgcGFyc2UgaXQgYXV0b21hdGljYWxseSBldmVuIGlmIHRoZSBMQVlPVVRfRklMRQorIyB0YWcgaXMgbGVmdCBlbXB0eS4KKworTEFZT1VUX0ZJTEUgICAgICAgICAgICA9IAorCisjIFRoZSBDSVRFX0JJQl9GSUxFUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBiaWIgZmlsZXMgY29udGFpbmluZworIyB0aGUgcmVmZXJlbmNlIGRlZmluaXRpb25zLiBUaGlzIG11c3QgYmUgYSBsaXN0IG9mIC5iaWIgZmlsZXMuIFRoZSAuYmliCisjIGV4dGVuc2lvbiBpcyBhdXRvbWF0aWNhbGx5IGFwcGVuZGVkIGlmIG9taXR0ZWQuIFRoaXMgcmVxdWlyZXMgdGhlIGJpYnRleCB0b29sCisjIHRvIGJlIGluc3RhbGxlZC4gU2VlIGFsc28gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CaWJUZVggZm9yIG1vcmUgaW5mby4KKyMgRm9yIExhVGVYIHRoZSBzdHlsZSBvZiB0aGUgYmlibGlvZ3JhcGh5IGNhbiBiZSBjb250cm9sbGVkIHVzaW5nCisjIExBVEVYX0JJQl9TVFlMRS4gVG8gdXNlIHRoaXMgZmVhdHVyZSB5b3UgbmVlZCBiaWJ0ZXggYW5kIHBlcmwgYXZhaWxhYmxlIGluIHRoZQorIyBzZWFyY2ggcGF0aC4gU2VlIGFsc28gXGNpdGUgZm9yIGluZm8gaG93IHRvIGNyZWF0ZSByZWZlcmVuY2VzLgorCitDSVRFX0JJQl9GSUxFUyAgICAgICAgID0gCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gd2FybmluZyBhbmQgcHJvZ3Jlc3MgbWVzc2FnZXMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBUaGUgUVVJRVQgdGFnIGNhbiBiZSB1c2VkIHRvIHR1cm4gb24vb2ZmIHRoZSBtZXNzYWdlcyB0aGF0IGFyZSBnZW5lcmF0ZWQgdG8KKyMgc3RhbmRhcmQgb3V0cHV0IGJ5IGRveHlnZW4uIElmIFFVSUVUIGlzIHNldCB0byBZRVMgdGhpcyBpbXBsaWVzIHRoYXQgdGhlCisjIG1lc3NhZ2VzIGFyZSBvZmYuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworUVVJRVQgICAgICAgICAgICAgICAgICA9IE5PCisKKyMgVGhlIFdBUk5JTkdTIHRhZyBjYW4gYmUgdXNlZCB0byB0dXJuIG9uL29mZiB0aGUgd2FybmluZyBtZXNzYWdlcyB0aGF0IGFyZQorIyBnZW5lcmF0ZWQgdG8gc3RhbmRhcmQgZXJyb3IgKHN0ZGVycikgYnkgZG94eWdlbi4gSWYgV0FSTklOR1MgaXMgc2V0IHRvIFlFUworIyB0aGlzIGltcGxpZXMgdGhhdCB0aGUgd2FybmluZ3MgYXJlIG9uLgorIworIyBUaXA6IFR1cm4gd2FybmluZ3Mgb24gd2hpbGUgd3JpdGluZyB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworV0FSTklOR1MgICAgICAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBXQVJOX0lGX1VORE9DVU1FTlRFRCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZQorIyB3YXJuaW5ncyBmb3IgdW5kb2N1bWVudGVkIG1lbWJlcnMuIElmIEVYVFJBQ1RfQUxMIGlzIHNldCB0byBZRVMgdGhlbiB0aGlzIGZsYWcKKyMgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGRpc2FibGVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitXQVJOX0lGX1VORE9DVU1FTlRFRCAgID0gWUVTCisKKyMgSWYgdGhlIFdBUk5fSUZfRE9DX0VSUk9SIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgd2FybmluZ3MgZm9yCisjIHBvdGVudGlhbCBlcnJvcnMgaW4gdGhlIGRvY3VtZW50YXRpb24sIHN1Y2ggYXMgbm90IGRvY3VtZW50aW5nIHNvbWUgcGFyYW1ldGVycworIyBpbiBhIGRvY3VtZW50ZWQgZnVuY3Rpb24sIG9yIGRvY3VtZW50aW5nIHBhcmFtZXRlcnMgdGhhdCBkb24ndCBleGlzdCBvciB1c2luZworIyBtYXJrdXAgY29tbWFuZHMgd3JvbmdseS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworV0FSTl9JRl9ET0NfRVJST1IgICAgICA9IFlFUworCisjIFRoaXMgV0FSTl9OT19QQVJBTURPQyBvcHRpb24gY2FuIGJlIGVuYWJsZWQgdG8gZ2V0IHdhcm5pbmdzIGZvciBmdW5jdGlvbnMgdGhhdAorIyBhcmUgZG9jdW1lbnRlZCwgYnV0IGhhdmUgbm8gZG9jdW1lbnRhdGlvbiBmb3IgdGhlaXIgcGFyYW1ldGVycyBvciByZXR1cm4KKyMgdmFsdWUuIElmIHNldCB0byBOTywgZG94eWdlbiB3aWxsIG9ubHkgd2FybiBhYm91dCB3cm9uZyBvciBpbmNvbXBsZXRlCisjIHBhcmFtZXRlciBkb2N1bWVudGF0aW9uLCBidXQgbm90IGFib3V0IHRoZSBhYnNlbmNlIG9mIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworV0FSTl9OT19QQVJBTURPQyAgICAgICA9IE5PCisKKyMgSWYgdGhlIFdBUk5fQVNfRVJST1IgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgaW1tZWRpYXRlbHkgc3RvcCB3aGVuCisjIGEgd2FybmluZyBpcyBlbmNvdW50ZXJlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitXQVJOX0FTX0VSUk9SICAgICAgICAgID0gTk8KKworIyBUaGUgV0FSTl9GT1JNQVQgdGFnIGRldGVybWluZXMgdGhlIGZvcm1hdCBvZiB0aGUgd2FybmluZyBtZXNzYWdlcyB0aGF0IGRveHlnZW4KKyMgY2FuIHByb2R1Y2UuIFRoZSBzdHJpbmcgc2hvdWxkIGNvbnRhaW4gdGhlICRmaWxlLCAkbGluZSwgYW5kICR0ZXh0IHRhZ3MsIHdoaWNoCisjIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIGZpbGUgYW5kIGxpbmUgbnVtYmVyIGZyb20gd2hpY2ggdGhlIHdhcm5pbmcgb3JpZ2luYXRlZAorIyBhbmQgdGhlIHdhcm5pbmcgdGV4dC4gT3B0aW9uYWxseSB0aGUgZm9ybWF0IG1heSBjb250YWluICR2ZXJzaW9uLCB3aGljaCB3aWxsCisjIGJlIHJlcGxhY2VkIGJ5IHRoZSB2ZXJzaW9uIG9mIHRoZSBmaWxlIChpZiBpdCBjb3VsZCBiZSBvYnRhaW5lZCB2aWEKKyMgRklMRV9WRVJTSU9OX0ZJTFRFUikKKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6ICRmaWxlOiRsaW5lOiAkdGV4dC4KKworV0FSTl9GT1JNQVQgICAgICAgICAgICA9ICIkZmlsZTokbGluZTogJHRleHQiCisKKyMgVGhlIFdBUk5fTE9HRklMRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIGZpbGUgdG8gd2hpY2ggd2FybmluZyBhbmQgZXJyb3IKKyMgbWVzc2FnZXMgc2hvdWxkIGJlIHdyaXR0ZW4uIElmIGxlZnQgYmxhbmsgdGhlIG91dHB1dCBpcyB3cml0dGVuIHRvIHN0YW5kYXJkCisjIGVycm9yIChzdGRlcnIpLgorCitXQVJOX0xPR0ZJTEUgICAgICAgICAgID0gCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGlucHV0IGZpbGVzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgVGhlIElOUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGZpbGVzIGFuZC9vciBkaXJlY3RvcmllcyB0aGF0IGNvbnRhaW4KKyMgZG9jdW1lbnRlZCBzb3VyY2UgZmlsZXMuIFlvdSBtYXkgZW50ZXIgZmlsZSBuYW1lcyBsaWtlIG15ZmlsZS5jcHAgb3IKKyMgZGlyZWN0b3JpZXMgbGlrZSAvdXNyL3NyYy9teXByb2plY3QuIFNlcGFyYXRlIHRoZSBmaWxlcyBvciBkaXJlY3RvcmllcyB3aXRoCisjIHNwYWNlcy4gU2VlIGFsc28gRklMRV9QQVRURVJOUyBhbmQgRVhURU5TSU9OX01BUFBJTkcKKyMgTm90ZTogSWYgdGhpcyB0YWcgaXMgZW1wdHkgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGlzIHNlYXJjaGVkLgorCitJTlBVVCAgICAgICAgICAgICAgICAgID0gZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlYzIvCisKKyMgVGhpcyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIG9mIHRoZSBzb3VyY2UgZmlsZXMKKyMgdGhhdCBkb3h5Z2VuIHBhcnNlcy4gSW50ZXJuYWxseSBkb3h5Z2VuIHVzZXMgdGhlIFVURi04IGVuY29kaW5nLiBEb3h5Z2VuIHVzZXMKKyMgbGliaWNvbnYgKG9yIHRoZSBpY29udiBidWlsdCBpbnRvIGxpYmMpIGZvciB0aGUgdHJhbnNjb2RpbmcuIFNlZSB0aGUgbGliaWNvbnYKKyMgZG9jdW1lbnRhdGlvbiAoc2VlOiBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvbGliaWNvbnYpIGZvciB0aGUgbGlzdCBvZgorIyBwb3NzaWJsZSBlbmNvZGluZ3MuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBVVEYtOC4KKworSU5QVVRfRU5DT0RJTkcgICAgICAgICA9IFVURi04CisKKyMgSWYgdGhlIHZhbHVlIG9mIHRoZSBJTlBVVCB0YWcgY29udGFpbnMgZGlyZWN0b3JpZXMsIHlvdSBjYW4gdXNlIHRoZQorIyBGSUxFX1BBVFRFUk5TIHRhZyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHdpbGRjYXJkIHBhdHRlcm5zIChsaWtlICouY3BwIGFuZAorIyAqLmgpIHRvIGZpbHRlciBvdXQgdGhlIHNvdXJjZS1maWxlcyBpbiB0aGUgZGlyZWN0b3JpZXMuCisjCisjIE5vdGUgdGhhdCBmb3IgY3VzdG9tIGV4dGVuc2lvbnMgb3Igbm90IGRpcmVjdGx5IHN1cHBvcnRlZCBleHRlbnNpb25zIHlvdSBhbHNvCisjIG5lZWQgdG8gc2V0IEVYVEVOU0lPTl9NQVBQSU5HIGZvciB0aGUgZXh0ZW5zaW9uIG90aGVyd2lzZSB0aGUgZmlsZXMgYXJlIG5vdAorIyByZWFkIGJ5IGRveHlnZW4uCisjCisjIElmIGxlZnQgYmxhbmsgdGhlIGZvbGxvd2luZyBwYXR0ZXJucyBhcmUgdGVzdGVkOiouYywgKi5jYywgKi5jeHgsICouY3BwLAorIyAqLmMrKywgKi5qYXZhLCAqLmlpLCAqLml4eCwgKi5pcHAsICouaSsrLCAqLmlubCwgKi5pZGwsICouZGRsLCAqLm9kbCwgKi5oLAorIyAqLmhoLCAqLmh4eCwgKi5ocHAsICouaCsrLCAqLmNzLCAqLmQsICoucGhwLCAqLnBocDQsICoucGhwNSwgKi5waHRtbCwgKi5pbmMsCisjICoubSwgKi5tYXJrZG93biwgKi5tZCwgKi5tbSwgKi5kb3gsICoucHksICoucHl3LCAqLmY5MCwgKi5mLCAqLmZvciwgKi50Y2wsCisjICoudmhkLCAqLnZoZGwsICoudWNmLCAqLnFzZiwgKi5hcyBhbmQgKi5qcy4KKworRklMRV9QQVRURVJOUyAgICAgICAgICA9IEMyKi5jIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDMiouY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDMiouaAorCisjIFRoZSBSRUNVUlNJVkUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgd2hldGhlciBvciBub3Qgc3ViZGlyZWN0b3JpZXMgc2hvdWxkCisjIGJlIHNlYXJjaGVkIGZvciBpbnB1dCBmaWxlcyBhcyB3ZWxsLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1JFQ1VSU0lWRSAgICAgICAgICAgICAgPSBZRVMKKworIyBUaGUgRVhDTFVERSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBmaWxlcyBhbmQvb3IgZGlyZWN0b3JpZXMgdGhhdCBzaG91bGQgYmUKKyMgZXhjbHVkZWQgZnJvbSB0aGUgSU5QVVQgc291cmNlIGZpbGVzLiBUaGlzIHdheSB5b3UgY2FuIGVhc2lseSBleGNsdWRlIGEKKyMgc3ViZGlyZWN0b3J5IGZyb20gYSBkaXJlY3RvcnkgdHJlZSB3aG9zZSByb290IGlzIHNwZWNpZmllZCB3aXRoIHRoZSBJTlBVVCB0YWcuCisjCisjIE5vdGUgdGhhdCByZWxhdGl2ZSBwYXRocyBhcmUgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIGRveHlnZW4gaXMKKyMgcnVuLgorCitFWENMVURFICAgICAgICAgICAgICAgID0gCisKKyMgVGhlIEVYQ0xVREVfU1lNTElOS1MgdGFnIGNhbiBiZSB1c2VkIHRvIHNlbGVjdCB3aGV0aGVyIG9yIG5vdCBmaWxlcyBvcgorIyBkaXJlY3RvcmllcyB0aGF0IGFyZSBzeW1ib2xpYyBsaW5rcyAoYSBVbml4IGZpbGUgc3lzdGVtIGZlYXR1cmUpIGFyZSBleGNsdWRlZAorIyBmcm9tIHRoZSBpbnB1dC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitFWENMVURFX1NZTUxJTktTICAgICAgID0gTk8KKworIyBJZiB0aGUgdmFsdWUgb2YgdGhlIElOUFVUIHRhZyBjb250YWlucyBkaXJlY3RvcmllcywgeW91IGNhbiB1c2UgdGhlCisjIEVYQ0xVREVfUEFUVEVSTlMgdGFnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgd2lsZGNhcmQgcGF0dGVybnMgdG8gZXhjbHVkZQorIyBjZXJ0YWluIGZpbGVzIGZyb20gdGhvc2UgZGlyZWN0b3JpZXMuCisjCisjIE5vdGUgdGhhdCB0aGUgd2lsZGNhcmRzIGFyZSBtYXRjaGVkIGFnYWluc3QgdGhlIGZpbGUgd2l0aCBhYnNvbHV0ZSBwYXRoLCBzbyB0bworIyBleGNsdWRlIGFsbCB0ZXN0IGRpcmVjdG9yaWVzIGZvciBleGFtcGxlIHVzZSB0aGUgcGF0dGVybiAqL3Rlc3QvKgorCitFWENMVURFX1BBVFRFUk5TICAgICAgID0gLl8qCisKKyMgVGhlIEVYQ0xVREVfU1lNQk9MUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBzeW1ib2wgbmFtZXMKKyMgKG5hbWVzcGFjZXMsIGNsYXNzZXMsIGZ1bmN0aW9ucywgZXRjLikgdGhhdCBzaG91bGQgYmUgZXhjbHVkZWQgZnJvbSB0aGUKKyMgb3V0cHV0LiBUaGUgc3ltYm9sIG5hbWUgY2FuIGJlIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUsIGEgd29yZCwgb3IgaWYgdGhlCisjIHdpbGRjYXJkICogaXMgdXNlZCwgYSBzdWJzdHJpbmcuIEV4YW1wbGVzOiBBTmFtZXNwYWNlLCBBQ2xhc3MsCisjIEFDbGFzczo6QU5hbWVzcGFjZSwgQU5hbWVzcGFjZTo6KlRlc3QKKyMKKyMgTm90ZSB0aGF0IHRoZSB3aWxkY2FyZHMgYXJlIG1hdGNoZWQgYWdhaW5zdCB0aGUgZmlsZSB3aXRoIGFic29sdXRlIHBhdGgsIHNvIHRvCisjIGV4Y2x1ZGUgYWxsIHRlc3QgZGlyZWN0b3JpZXMgdXNlIHRoZSBwYXR0ZXJuICovdGVzdC8qCisKK0VYQ0xVREVfU1lNQk9MUyAgICAgICAgPSAKKworIyBUaGUgRVhBTVBMRV9QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGZpbGVzIG9yIGRpcmVjdG9yaWVzCisjIHRoYXQgY29udGFpbiBleGFtcGxlIGNvZGUgZnJhZ21lbnRzIHRoYXQgYXJlIGluY2x1ZGVkIChzZWUgdGhlIFxpbmNsdWRlCisjIGNvbW1hbmQpLgorCitFWEFNUExFX1BBVEggICAgICAgICAgID0gCisKKyMgSWYgdGhlIHZhbHVlIG9mIHRoZSBFWEFNUExFX1BBVEggdGFnIGNvbnRhaW5zIGRpcmVjdG9yaWVzLCB5b3UgY2FuIHVzZSB0aGUKKyMgRVhBTVBMRV9QQVRURVJOUyB0YWcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB3aWxkY2FyZCBwYXR0ZXJuIChsaWtlICouY3BwIGFuZAorIyAqLmgpIHRvIGZpbHRlciBvdXQgdGhlIHNvdXJjZS1maWxlcyBpbiB0aGUgZGlyZWN0b3JpZXMuIElmIGxlZnQgYmxhbmsgYWxsCisjIGZpbGVzIGFyZSBpbmNsdWRlZC4KKworRVhBTVBMRV9QQVRURVJOUyAgICAgICA9ICoKKworIyBJZiB0aGUgRVhBTVBMRV9SRUNVUlNJVkUgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBzdWJkaXJlY3RvcmllcyB3aWxsIGJlCisjIHNlYXJjaGVkIGZvciBpbnB1dCBmaWxlcyB0byBiZSB1c2VkIHdpdGggdGhlIFxpbmNsdWRlIG9yIFxkb250aW5jbHVkZSBjb21tYW5kcworIyBpcnJlc3BlY3RpdmUgb2YgdGhlIHZhbHVlIG9mIHRoZSBSRUNVUlNJVkUgdGFnLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0VYQU1QTEVfUkVDVVJTSVZFICAgICAgPSBOTworCisjIFRoZSBJTUFHRV9QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGZpbGVzIG9yIGRpcmVjdG9yaWVzCisjIHRoYXQgY29udGFpbiBpbWFnZXMgdGhhdCBhcmUgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gKHNlZSB0aGUKKyMgXGltYWdlIGNvbW1hbmQpLgorCitJTUFHRV9QQVRIICAgICAgICAgICAgID0gCisKKyMgVGhlIElOUFVUX0ZJTFRFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHByb2dyYW0gdGhhdCBkb3h5Z2VuIHNob3VsZAorIyBpbnZva2UgdG8gZmlsdGVyIGZvciBlYWNoIGlucHV0IGZpbGUuIERveHlnZW4gd2lsbCBpbnZva2UgdGhlIGZpbHRlciBwcm9ncmFtCisjIGJ5IGV4ZWN1dGluZyAodmlhIHBvcGVuKCkpIHRoZSBjb21tYW5kOgorIworIyA8ZmlsdGVyPiA8aW5wdXQtZmlsZT4KKyMKKyMgd2hlcmUgPGZpbHRlcj4gaXMgdGhlIHZhbHVlIG9mIHRoZSBJTlBVVF9GSUxURVIgdGFnLCBhbmQgPGlucHV0LWZpbGU+IGlzIHRoZQorIyBuYW1lIG9mIGFuIGlucHV0IGZpbGUuIERveHlnZW4gd2lsbCB0aGVuIHVzZSB0aGUgb3V0cHV0IHRoYXQgdGhlIGZpbHRlcgorIyBwcm9ncmFtIHdyaXRlcyB0byBzdGFuZGFyZCBvdXRwdXQuIElmIEZJTFRFUl9QQVRURVJOUyBpcyBzcGVjaWZpZWQsIHRoaXMgdGFnCisjIHdpbGwgYmUgaWdub3JlZC4KKyMKKyMgTm90ZSB0aGF0IHRoZSBmaWx0ZXIgbXVzdCBub3QgYWRkIG9yIHJlbW92ZSBsaW5lczsgaXQgaXMgYXBwbGllZCBiZWZvcmUgdGhlCisjIGNvZGUgaXMgc2Nhbm5lZCwgYnV0IG5vdCB3aGVuIHRoZSBvdXRwdXQgY29kZSBpcyBnZW5lcmF0ZWQuIElmIGxpbmVzIGFyZSBhZGRlZAorIyBvciByZW1vdmVkLCB0aGUgYW5jaG9ycyB3aWxsIG5vdCBiZSBwbGFjZWQgY29ycmVjdGx5LgorIworIyBOb3RlIHRoYXQgZm9yIGN1c3RvbSBleHRlbnNpb25zIG9yIG5vdCBkaXJlY3RseSBzdXBwb3J0ZWQgZXh0ZW5zaW9ucyB5b3UgYWxzbworIyBuZWVkIHRvIHNldCBFWFRFTlNJT05fTUFQUElORyBmb3IgdGhlIGV4dGVuc2lvbiBvdGhlcndpc2UgdGhlIGZpbGVzIGFyZSBub3QKKyMgcHJvcGVybHkgcHJvY2Vzc2VkIGJ5IGRveHlnZW4uCisKK0lOUFVUX0ZJTFRFUiAgICAgICAgICAgPSBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMi9kb2NzL2RveHlmaWx0ZXIuc2gKKworIyBUaGUgRklMVEVSX1BBVFRFUk5TIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGZpbHRlcnMgb24gYSBwZXIgZmlsZSBwYXR0ZXJuCisjIGJhc2lzLiBEb3h5Z2VuIHdpbGwgY29tcGFyZSB0aGUgZmlsZSBuYW1lIHdpdGggZWFjaCBwYXR0ZXJuIGFuZCBhcHBseSB0aGUKKyMgZmlsdGVyIGlmIHRoZXJlIGlzIGEgbWF0Y2guIFRoZSBmaWx0ZXJzIGFyZSBhIGxpc3Qgb2YgdGhlIGZvcm06IHBhdHRlcm49ZmlsdGVyCisjIChsaWtlICouY3BwPW15X2NwcF9maWx0ZXIpLiBTZWUgSU5QVVRfRklMVEVSIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIG9uIGhvdworIyBmaWx0ZXJzIGFyZSB1c2VkLiBJZiB0aGUgRklMVEVSX1BBVFRFUk5TIHRhZyBpcyBlbXB0eSBvciBpZiBub25lIG9mIHRoZQorIyBwYXR0ZXJucyBtYXRjaCB0aGUgZmlsZSBuYW1lLCBJTlBVVF9GSUxURVIgaXMgYXBwbGllZC4KKyMKKyMgTm90ZSB0aGF0IGZvciBjdXN0b20gZXh0ZW5zaW9ucyBvciBub3QgZGlyZWN0bHkgc3VwcG9ydGVkIGV4dGVuc2lvbnMgeW91IGFsc28KKyMgbmVlZCB0byBzZXQgRVhURU5TSU9OX01BUFBJTkcgZm9yIHRoZSBleHRlbnNpb24gb3RoZXJ3aXNlIHRoZSBmaWxlcyBhcmUgbm90CisjIHByb3Blcmx5IHByb2Nlc3NlZCBieSBkb3h5Z2VuLgorCitGSUxURVJfUEFUVEVSTlMgICAgICAgID0gCisKKyMgSWYgdGhlIEZJTFRFUl9TT1VSQ0VfRklMRVMgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBpbnB1dCBmaWx0ZXIgKGlmIHNldCB1c2luZworIyBJTlBVVF9GSUxURVIpIHdpbGwgYWxzbyBiZSB1c2VkIHRvIGZpbHRlciB0aGUgaW5wdXQgZmlsZXMgdGhhdCBhcmUgdXNlZCBmb3IKKyMgcHJvZHVjaW5nIHRoZSBzb3VyY2UgZmlsZXMgdG8gYnJvd3NlIChpLmUuIHdoZW4gU09VUkNFX0JST1dTRVIgaXMgc2V0IHRvIFlFUykuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRklMVEVSX1NPVVJDRV9GSUxFUyAgICA9IFlFUworCisjIFRoZSBGSUxURVJfU09VUkNFX1BBVFRFUk5TIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHNvdXJjZSBmaWx0ZXJzIHBlciBmaWxlCisjIHBhdHRlcm4uIEEgcGF0dGVybiB3aWxsIG92ZXJyaWRlIHRoZSBzZXR0aW5nIGZvciBGSUxURVJfUEFUVEVSTiAoaWYgYW55KSBhbmQKKyMgaXQgaXMgYWxzbyBwb3NzaWJsZSB0byBkaXNhYmxlIHNvdXJjZSBmaWx0ZXJpbmcgZm9yIGEgc3BlY2lmaWMgcGF0dGVybiB1c2luZworIyAqLmV4dD0gKHNvIHdpdGhvdXQgbmFtaW5nIGEgZmlsdGVyKS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEZJTFRFUl9TT1VSQ0VfRklMRVMgaXMgc2V0IHRvIFlFUy4KKworRklMVEVSX1NPVVJDRV9QQVRURVJOUyA9IAorCisjIElmIHRoZSBVU0VfTURGSUxFX0FTX01BSU5QQUdFIHRhZyByZWZlcnMgdG8gdGhlIG5hbWUgb2YgYSBtYXJrZG93biBmaWxlIHRoYXQKKyMgaXMgcGFydCBvZiB0aGUgaW5wdXQsIGl0cyBjb250ZW50cyB3aWxsIGJlIHBsYWNlZCBvbiB0aGUgbWFpbiBwYWdlCisjIChpbmRleC5odG1sKS4gVGhpcyBjYW4gYmUgdXNlZnVsIGlmIHlvdSBoYXZlIGEgcHJvamVjdCBvbiBmb3IgaW5zdGFuY2UgR2l0SHViCisjIGFuZCB3YW50IHRvIHJldXNlIHRoZSBpbnRyb2R1Y3Rpb24gcGFnZSBhbHNvIGZvciB0aGUgZG94eWdlbiBvdXRwdXQuCisKK1VTRV9NREZJTEVfQVNfTUFJTlBBR0UgPSAKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byBzb3VyY2UgYnJvd3NpbmcKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgU09VUkNFX0JST1dTRVIgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBhIGxpc3Qgb2Ygc291cmNlIGZpbGVzIHdpbGwgYmUKKyMgZ2VuZXJhdGVkLiBEb2N1bWVudGVkIGVudGl0aWVzIHdpbGwgYmUgY3Jvc3MtcmVmZXJlbmNlZCB3aXRoIHRoZXNlIHNvdXJjZXMuCisjCisjIE5vdGU6IFRvIGdldCByaWQgb2YgYWxsIHNvdXJjZSBjb2RlIGluIHRoZSBnZW5lcmF0ZWQgb3V0cHV0LCBtYWtlIHN1cmUgdGhhdAorIyBhbHNvIFZFUkJBVElNX0hFQURFUlMgaXMgc2V0IHRvIE5PLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1NPVVJDRV9CUk9XU0VSICAgICAgICAgPSBZRVMKKworIyBTZXR0aW5nIHRoZSBJTkxJTkVfU09VUkNFUyB0YWcgdG8gWUVTIHdpbGwgaW5jbHVkZSB0aGUgYm9keSBvZiBmdW5jdGlvbnMsCisjIGNsYXNzZXMgYW5kIGVudW1zIGRpcmVjdGx5IGludG8gdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSU5MSU5FX1NPVVJDRVMgICAgICAgICA9IE5PCisKKyMgU2V0dGluZyB0aGUgU1RSSVBfQ09ERV9DT01NRU5UUyB0YWcgdG8gWUVTIHdpbGwgaW5zdHJ1Y3QgZG94eWdlbiB0byBoaWRlIGFueQorIyBzcGVjaWFsIGNvbW1lbnQgYmxvY2tzIGZyb20gZ2VuZXJhdGVkIHNvdXJjZSBjb2RlIGZyYWdtZW50cy4gTm9ybWFsIEMsIEMrKyBhbmQKKyMgRm9ydHJhbiBjb21tZW50cyB3aWxsIGFsd2F5cyByZW1haW4gdmlzaWJsZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworU1RSSVBfQ09ERV9DT01NRU5UUyAgICA9IFlFUworCisjIElmIHRoZSBSRUZFUkVOQ0VEX0JZX1JFTEFUSU9OIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZm9yIGVhY2ggZG9jdW1lbnRlZAorIyBmdW5jdGlvbiBhbGwgZG9jdW1lbnRlZCBmdW5jdGlvbnMgcmVmZXJlbmNpbmcgaXQgd2lsbCBiZSBsaXN0ZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworUkVGRVJFTkNFRF9CWV9SRUxBVElPTiA9IFlFUworCisjIElmIHRoZSBSRUZFUkVOQ0VTX1JFTEFUSU9OIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZm9yIGVhY2ggZG9jdW1lbnRlZCBmdW5jdGlvbgorIyBhbGwgZG9jdW1lbnRlZCBlbnRpdGllcyBjYWxsZWQvdXNlZCBieSB0aGF0IGZ1bmN0aW9uIHdpbGwgYmUgbGlzdGVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1JFRkVSRU5DRVNfUkVMQVRJT04gICAgPSBZRVMKKworIyBJZiB0aGUgUkVGRVJFTkNFU19MSU5LX1NPVVJDRSB0YWcgaXMgc2V0IHRvIFlFUyBhbmQgU09VUkNFX0JST1dTRVIgdGFnIGlzIHNldAorIyB0byBZRVMgdGhlbiB0aGUgaHlwZXJsaW5rcyBmcm9tIGZ1bmN0aW9ucyBpbiBSRUZFUkVOQ0VTX1JFTEFUSU9OIGFuZAorIyBSRUZFUkVOQ0VEX0JZX1JFTEFUSU9OIGxpc3RzIHdpbGwgbGluayB0byB0aGUgc291cmNlIGNvZGUuIE90aGVyd2lzZSB0aGV5IHdpbGwKKyMgbGluayB0byB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworUkVGRVJFTkNFU19MSU5LX1NPVVJDRSA9IFlFUworCisjIElmIFNPVVJDRV9UT09MVElQUyBpcyBlbmFibGVkICh0aGUgZGVmYXVsdCkgdGhlbiBob3ZlcmluZyBhIGh5cGVybGluayBpbiB0aGUKKyMgc291cmNlIGNvZGUgd2lsbCBzaG93IGEgdG9vbHRpcCB3aXRoIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gc3VjaCBhcyBwcm90b3R5cGUsCisjIGJyaWVmIGRlc2NyaXB0aW9uIGFuZCBsaW5rcyB0byB0aGUgZGVmaW5pdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4gU2luY2UgdGhpcworIyB3aWxsIG1ha2UgdGhlIEhUTUwgZmlsZSBsYXJnZXIgYW5kIGxvYWRpbmcgb2YgbGFyZ2UgZmlsZXMgYSBiaXQgc2xvd2VyLCB5b3UKKyMgY2FuIG9wdCB0byBkaXNhYmxlIHRoaXMgZmVhdHVyZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNPVVJDRV9CUk9XU0VSIGlzIHNldCB0byBZRVMuCisKK1NPVVJDRV9UT09MVElQUyAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgVVNFX0hUQUdTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIHJlZmVyZW5jZXMgdG8gc291cmNlIGNvZGUgd2lsbAorIyBwb2ludCB0byB0aGUgSFRNTCBnZW5lcmF0ZWQgYnkgdGhlIGh0YWdzKDEpIHRvb2wgaW5zdGVhZCBvZiBkb3h5Z2VuIGJ1aWx0LWluCisjIHNvdXJjZSBicm93c2VyLiBUaGUgaHRhZ3MgdG9vbCBpcyBwYXJ0IG9mIEdOVSdzIGdsb2JhbCBzb3VyY2UgdGFnZ2luZyBzeXN0ZW0KKyMgKHNlZSBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvZ2xvYmFsL2dsb2JhbC5odG1sKS4gWW91IHdpbGwgbmVlZCB2ZXJzaW9uCisjIDQuOC42IG9yIGhpZ2hlci4KKyMKKyMgVG8gdXNlIGl0IGRvIHRoZSBmb2xsb3dpbmc6CisjIC0gSW5zdGFsbCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgZ2xvYmFsCisjIC0gRW5hYmxlIFNPVVJDRV9CUk9XU0VSIGFuZCBVU0VfSFRBR1MgaW4gdGhlIGNvbmZpZyBmaWxlCisjIC0gTWFrZSBzdXJlIHRoZSBJTlBVVCBwb2ludHMgdG8gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlCisjIC0gUnVuIGRveHlnZW4gYXMgbm9ybWFsCisjCisjIERveHlnZW4gd2lsbCBpbnZva2UgaHRhZ3MgKGFuZCB0aGF0IHdpbGwgaW4gdHVybiBpbnZva2UgZ3RhZ3MpLCBzbyB0aGVzZQorIyB0b29scyBtdXN0IGJlIGF2YWlsYWJsZSBmcm9tIHRoZSBjb21tYW5kIGxpbmUgKGkuZS4gaW4gdGhlIHNlYXJjaCBwYXRoKS4KKyMKKyMgVGhlIHJlc3VsdDogaW5zdGVhZCBvZiB0aGUgc291cmNlIGJyb3dzZXIgZ2VuZXJhdGVkIGJ5IGRveHlnZW4sIHRoZSBsaW5rcyB0bworIyBzb3VyY2UgY29kZSB3aWxsIG5vdyBwb2ludCB0byB0aGUgb3V0cHV0IG9mIGh0YWdzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBTT1VSQ0VfQlJPV1NFUiBpcyBzZXQgdG8gWUVTLgorCitVU0VfSFRBR1MgICAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgVkVSQkFUSU1fSEVBREVSUyB0YWcgaXMgc2V0IHRoZSBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYQorIyB2ZXJiYXRpbSBjb3B5IG9mIHRoZSBoZWFkZXIgZmlsZSBmb3IgZWFjaCBjbGFzcyBmb3Igd2hpY2ggYW4gaW5jbHVkZSBpcworIyBzcGVjaWZpZWQuIFNldCB0byBOTyB0byBkaXNhYmxlIHRoaXMuCisjIFNlZSBhbHNvOiBTZWN0aW9uIFxjbGFzcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworVkVSQkFUSU1fSEVBREVSUyAgICAgICA9IFlFUworCisjIElmIHRoZSBDTEFOR19BU1NJU1RFRF9QQVJTSU5HIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHVzZSB0aGUKKyMgY2xhbmcgcGFyc2VyIChzZWU6IGh0dHA6Ly9jbGFuZy5sbHZtLm9yZy8pIGZvciBtb3JlIGFjY3VyYXRlIHBhcnNpbmcgYXQgdGhlCisjIGNvc3Qgb2YgcmVkdWNlZCBwZXJmb3JtYW5jZS4gVGhpcyBjYW4gYmUgcGFydGljdWxhcmx5IGhlbHBmdWwgd2l0aCB0ZW1wbGF0ZQorIyByaWNoIEMrKyBjb2RlIGZvciB3aGljaCBkb3h5Z2VuJ3MgYnVpbHQtaW4gcGFyc2VyIGxhY2tzIHRoZSBuZWNlc3NhcnkgdHlwZQorIyBpbmZvcm1hdGlvbi4KKyMgTm90ZTogVGhlIGF2YWlsYWJpbGl0eSBvZiB0aGlzIG9wdGlvbiBkZXBlbmRzIG9uIHdoZXRoZXIgb3Igbm90IGRveHlnZW4gd2FzCisjIGdlbmVyYXRlZCB3aXRoIHRoZSAtRHVzZS1saWJjbGFuZz1PTiBvcHRpb24gZm9yIENNYWtlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0NMQU5HX0FTU0lTVEVEX1BBUlNJTkcgPSBZRVMKKworIyBJZiBjbGFuZyBhc3Npc3RlZCBwYXJzaW5nIGlzIGVuYWJsZWQgeW91IGNhbiBwcm92aWRlIHRoZSBjb21waWxlciB3aXRoIGNvbW1hbmQKKyMgbGluZSBvcHRpb25zIHRoYXQgeW91IHdvdWxkIG5vcm1hbGx5IHVzZSB3aGVuIGludm9raW5nIHRoZSBjb21waWxlci4gTm90ZSB0aGF0CisjIHRoZSBpbmNsdWRlIHBhdGhzIHdpbGwgYWxyZWFkeSBiZSBzZXQgYnkgZG94eWdlbiBmb3IgdGhlIGZpbGVzIGFuZCBkaXJlY3RvcmllcworIyBzcGVjaWZpZWQgd2l0aCBJTlBVVCBhbmQgSU5DTFVERV9QQVRILgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgQ0xBTkdfQVNTSVNURURfUEFSU0lORyBpcyBzZXQgdG8gWUVTLgorCitDTEFOR19PUFRJT05TICAgICAgICAgID0gLXN0ZD1jKysxMQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBhbHBoYWJldGljYWwgY2xhc3MgaW5kZXgKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgQUxQSEFCRVRJQ0FMX0lOREVYIHRhZyBpcyBzZXQgdG8gWUVTLCBhbiBhbHBoYWJldGljYWwgaW5kZXggb2YgYWxsCisjIGNvbXBvdW5kcyB3aWxsIGJlIGdlbmVyYXRlZC4gRW5hYmxlIHRoaXMgaWYgdGhlIHByb2plY3QgY29udGFpbnMgYSBsb3Qgb2YKKyMgY2xhc3Nlcywgc3RydWN0cywgdW5pb25zIG9yIGludGVyZmFjZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0FMUEhBQkVUSUNBTF9JTkRFWCAgICAgPSBZRVMKKworIyBUaGUgQ09MU19JTl9BTFBIQV9JTkRFWCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4KKyMgd2hpY2ggdGhlIGFscGhhYmV0aWNhbCBpbmRleCBsaXN0IHdpbGwgYmUgc3BsaXQuCisjIE1pbmltdW0gdmFsdWU6IDEsIG1heGltdW0gdmFsdWU6IDIwLCBkZWZhdWx0IHZhbHVlOiA1LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgQUxQSEFCRVRJQ0FMX0lOREVYIGlzIHNldCB0byBZRVMuCisKK0NPTFNfSU5fQUxQSEFfSU5ERVggICAgPSA1CisKKyMgSW4gY2FzZSBhbGwgY2xhc3NlcyBpbiBhIHByb2plY3Qgc3RhcnQgd2l0aCBhIGNvbW1vbiBwcmVmaXgsIGFsbCBjbGFzc2VzIHdpbGwKKyMgYmUgcHV0IHVuZGVyIHRoZSBzYW1lIGhlYWRlciBpbiB0aGUgYWxwaGFiZXRpY2FsIGluZGV4LiBUaGUgSUdOT1JFX1BSRUZJWCB0YWcKKyMgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHByZWZpeCAob3IgYSBsaXN0IG9mIHByZWZpeGVzKSB0aGF0IHNob3VsZCBiZSBpZ25vcmVkCisjIHdoaWxlIGdlbmVyYXRpbmcgdGhlIGluZGV4IGhlYWRlcnMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBBTFBIQUJFVElDQUxfSU5ERVggaXMgc2V0IHRvIFlFUy4KKworSUdOT1JFX1BSRUZJWCAgICAgICAgICA9IAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBIVE1MIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9IVE1MIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgSFRNTCBvdXRwdXQKKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworR0VORVJBVEVfSFRNTCAgICAgICAgICA9IFlFUworCisjIFRoZSBIVE1MX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBIVE1MIGRvY3Mgd2lsbCBiZSBwdXQuIElmIGEKKyMgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUgcHV0IGluIGZyb250IG9mCisjIGl0LgorIyBUaGUgZGVmYXVsdCBkaXJlY3RvcnkgaXM6IGh0bWwuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfT1VUUFVUICAgICAgICAgICAgPSBodG1sCisKKyMgVGhlIEhUTUxfRklMRV9FWFRFTlNJT04gdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGZpbGUgZXh0ZW5zaW9uIGZvciBlYWNoCisjIGdlbmVyYXRlZCBIVE1MIHBhZ2UgKGZvciBleGFtcGxlOiAuaHRtLCAucGhwLCAuYXNwKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IC5odG1sLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX0ZJTEVfRVhURU5TSU9OICAgID0gLmh0bWwKKworIyBUaGUgSFRNTF9IRUFERVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSB1c2VyLWRlZmluZWQgSFRNTCBoZWFkZXIgZmlsZSBmb3IKKyMgZWFjaCBnZW5lcmF0ZWQgSFRNTCBwYWdlLiBJZiB0aGUgdGFnIGlzIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEKKyMgc3RhbmRhcmQgaGVhZGVyLgorIworIyBUbyBnZXQgdmFsaWQgSFRNTCB0aGUgaGVhZGVyIGZpbGUgdGhhdCBpbmNsdWRlcyBhbnkgc2NyaXB0cyBhbmQgc3R5bGUgc2hlZXRzCisjIHRoYXQgZG94eWdlbiBuZWVkcywgd2hpY2ggaXMgZGVwZW5kZW50IG9uIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdXNlZCAoZS5nLgorIyB0aGUgc2V0dGluZyBHRU5FUkFURV9UUkVFVklFVykuIEl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0byBzdGFydCB3aXRoIGEKKyMgZGVmYXVsdCBoZWFkZXIgdXNpbmcKKyMgZG94eWdlbiAtdyBodG1sIG5ld19oZWFkZXIuaHRtbCBuZXdfZm9vdGVyLmh0bWwgbmV3X3N0eWxlc2hlZXQuY3NzCisjIFlvdXJDb25maWdGaWxlCisjIGFuZCB0aGVuIG1vZGlmeSB0aGUgZmlsZSBuZXdfaGVhZGVyLmh0bWwuIFNlZSBhbHNvIHNlY3Rpb24gIkRveHlnZW4gdXNhZ2UiCisjIGZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gZ2VuZXJhdGUgdGhlIGRlZmF1bHQgaGVhZGVyIHRoYXQgZG94eWdlbiBub3JtYWxseQorIyB1c2VzLgorIyBOb3RlOiBUaGUgaGVhZGVyIGlzIHN1YmplY3QgdG8gY2hhbmdlIHNvIHlvdSB0eXBpY2FsbHkgaGF2ZSB0byByZWdlbmVyYXRlIHRoZQorIyBkZWZhdWx0IGhlYWRlciB3aGVuIHVwZ3JhZGluZyB0byBhIG5ld2VyIHZlcnNpb24gb2YgZG94eWdlbi4gRm9yIGEgZGVzY3JpcHRpb24KKyMgb2YgdGhlIHBvc3NpYmxlIG1hcmtlcnMgYW5kIGJsb2NrIG5hbWVzIHNlZSB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9IRUFERVIgICAgICAgICAgICA9IAorCisjIFRoZSBIVE1MX0ZPT1RFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHVzZXItZGVmaW5lZCBIVE1MIGZvb3RlciBmb3IgZWFjaAorIyBnZW5lcmF0ZWQgSFRNTCBwYWdlLiBJZiB0aGUgdGFnIGlzIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgc3RhbmRhcmQKKyMgZm9vdGVyLiBTZWUgSFRNTF9IRUFERVIgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gaG93IHRvIGdlbmVyYXRlIGEgZGVmYXVsdAorIyBmb290ZXIgYW5kIHdoYXQgc3BlY2lhbCBjb21tYW5kcyBjYW4gYmUgdXNlZCBpbnNpZGUgdGhlIGZvb3Rlci4gU2VlIGFsc28KKyMgc2VjdGlvbiAiRG94eWdlbiB1c2FnZSIgZm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBnZW5lcmF0ZSB0aGUgZGVmYXVsdCBmb290ZXIKKyMgdGhhdCBkb3h5Z2VuIG5vcm1hbGx5IHVzZXMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfRk9PVEVSICAgICAgICAgICAgPSAKKworIyBUaGUgSFRNTF9TVFlMRVNIRUVUIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgdXNlci1kZWZpbmVkIGNhc2NhZGluZyBzdHlsZQorIyBzaGVldCB0aGF0IGlzIHVzZWQgYnkgZWFjaCBIVE1MIHBhZ2UuIEl0IGNhbiBiZSB1c2VkIHRvIGZpbmUtdHVuZSB0aGUgbG9vayBvZgorIyB0aGUgSFRNTCBvdXRwdXQuIElmIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZGVmYXVsdCBzdHlsZSBzaGVldC4KKyMgU2VlIGFsc28gc2VjdGlvbiAiRG94eWdlbiB1c2FnZSIgZm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBnZW5lcmF0ZSB0aGUgc3R5bGUKKyMgc2hlZXQgdGhhdCBkb3h5Z2VuIG5vcm1hbGx5IHVzZXMuCisjIE5vdGU6IEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBIVE1MX0VYVFJBX1NUWUxFU0hFRVQgaW5zdGVhZCBvZiB0aGlzIHRhZywgYXMKKyMgaXQgaXMgbW9yZSByb2J1c3QgYW5kIHRoaXMgdGFnIChIVE1MX1NUWUxFU0hFRVQpIHdpbGwgaW4gdGhlIGZ1dHVyZSBiZWNvbWUKKyMgb2Jzb2xldGUuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfU1RZTEVTSEVFVCAgICAgICAgPSAKKworIyBUaGUgSFRNTF9FWFRSQV9TVFlMRVNIRUVUIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGFkZGl0aW9uYWwgdXNlci1kZWZpbmVkCisjIGNhc2NhZGluZyBzdHlsZSBzaGVldHMgdGhhdCBhcmUgaW5jbHVkZWQgYWZ0ZXIgdGhlIHN0YW5kYXJkIHN0eWxlIHNoZWV0cworIyBjcmVhdGVkIGJ5IGRveHlnZW4uIFVzaW5nIHRoaXMgb3B0aW9uIG9uZSBjYW4gb3ZlcnJ1bGUgY2VydGFpbiBzdHlsZSBhc3BlY3RzLgorIyBUaGlzIGlzIHByZWZlcnJlZCBvdmVyIHVzaW5nIEhUTUxfU1RZTEVTSEVFVCBzaW5jZSBpdCBkb2VzIG5vdCByZXBsYWNlIHRoZQorIyBzdGFuZGFyZCBzdHlsZSBzaGVldCBhbmQgaXMgdGhlcmVmb3JlIG1vcmUgcm9idXN0IGFnYWluc3QgZnV0dXJlIHVwZGF0ZXMuCisjIERveHlnZW4gd2lsbCBjb3B5IHRoZSBzdHlsZSBzaGVldCBmaWxlcyB0byB0aGUgb3V0cHV0IGRpcmVjdG9yeS4KKyMgTm90ZTogVGhlIG9yZGVyIG9mIHRoZSBleHRyYSBzdHlsZSBzaGVldCBmaWxlcyBpcyBvZiBpbXBvcnRhbmNlIChlLmcuIHRoZSBsYXN0CisjIHN0eWxlIHNoZWV0IGluIHRoZSBsaXN0IG92ZXJydWxlcyB0aGUgc2V0dGluZyBvZiB0aGUgcHJldmlvdXMgb25lcyBpbiB0aGUKKyMgbGlzdCkuIEZvciBhbiBleGFtcGxlIHNlZSB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9FWFRSQV9TVFlMRVNIRUVUICA9IAorCisjIFRoZSBIVE1MX0VYVFJBX0ZJTEVTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGV4dHJhIGltYWdlcyBvcgorIyBvdGhlciBzb3VyY2UgZmlsZXMgd2hpY2ggc2hvdWxkIGJlIGNvcGllZCB0byB0aGUgSFRNTCBvdXRwdXQgZGlyZWN0b3J5LiBOb3RlCisjIHRoYXQgdGhlc2UgZmlsZXMgd2lsbCBiZSBjb3BpZWQgdG8gdGhlIGJhc2UgSFRNTCBvdXRwdXQgZGlyZWN0b3J5LiBVc2UgdGhlCisjICRyZWxwYXRoXiBtYXJrZXIgaW4gdGhlIEhUTUxfSEVBREVSIGFuZC9vciBIVE1MX0ZPT1RFUiBmaWxlcyB0byBsb2FkIHRoZXNlCisjIGZpbGVzLiBJbiB0aGUgSFRNTF9TVFlMRVNIRUVUIGZpbGUsIHVzZSB0aGUgZmlsZSBuYW1lIG9ubHkuIEFsc28gbm90ZSB0aGF0IHRoZQorIyBmaWxlcyB3aWxsIGJlIGNvcGllZCBhcy1pczsgdGhlcmUgYXJlIG5vIGNvbW1hbmRzIG9yIG1hcmtlcnMgYXZhaWxhYmxlLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX0VYVFJBX0ZJTEVTICAgICAgID0gCisKKyMgVGhlIEhUTUxfQ09MT1JTVFlMRV9IVUUgdGFnIGNvbnRyb2xzIHRoZSBjb2xvciBvZiB0aGUgSFRNTCBvdXRwdXQuIERveHlnZW4KKyMgd2lsbCBhZGp1c3QgdGhlIGNvbG9ycyBpbiB0aGUgc3R5bGUgc2hlZXQgYW5kIGJhY2tncm91bmQgaW1hZ2VzIGFjY29yZGluZyB0bworIyB0aGlzIGNvbG9yLiBIdWUgaXMgc3BlY2lmaWVkIGFzIGFuIGFuZ2xlIG9uIGEgY29sb3J3aGVlbCwgc2VlCisjIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSHVlIGZvciBtb3JlIGluZm9ybWF0aW9uLiBGb3IgaW5zdGFuY2UgdGhlIHZhbHVlCisjIDAgcmVwcmVzZW50cyByZWQsIDYwIGlzIHllbGxvdywgMTIwIGlzIGdyZWVuLCAxODAgaXMgY3lhbiwgMjQwIGlzIGJsdWUsIDMwMAorIyBwdXJwbGUsIGFuZCAzNjAgaXMgcmVkIGFnYWluLgorIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAzNTksIGRlZmF1bHQgdmFsdWU6IDIyMC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9DT0xPUlNUWUxFX0hVRSAgICA9IDIyMAorCisjIFRoZSBIVE1MX0NPTE9SU1RZTEVfU0FUIHRhZyBjb250cm9scyB0aGUgcHVyaXR5IChvciBzYXR1cmF0aW9uKSBvZiB0aGUgY29sb3JzCisjIGluIHRoZSBIVE1MIG91dHB1dC4gRm9yIGEgdmFsdWUgb2YgMCB0aGUgb3V0cHV0IHdpbGwgdXNlIGdyYXlzY2FsZXMgb25seS4gQQorIyB2YWx1ZSBvZiAyNTUgd2lsbCBwcm9kdWNlIHRoZSBtb3N0IHZpdmlkIGNvbG9ycy4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMjU1LCBkZWZhdWx0IHZhbHVlOiAxMDAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfQ09MT1JTVFlMRV9TQVQgICAgPSAxMDAKKworIyBUaGUgSFRNTF9DT0xPUlNUWUxFX0dBTU1BIHRhZyBjb250cm9scyB0aGUgZ2FtbWEgY29ycmVjdGlvbiBhcHBsaWVkIHRvIHRoZQorIyBsdW1pbmFuY2UgY29tcG9uZW50IG9mIHRoZSBjb2xvcnMgaW4gdGhlIEhUTUwgb3V0cHV0LiBWYWx1ZXMgYmVsb3cgMTAwCisjIGdyYWR1YWxseSBtYWtlIHRoZSBvdXRwdXQgbGlnaHRlciwgd2hlcmVhcyB2YWx1ZXMgYWJvdmUgMTAwIG1ha2UgdGhlIG91dHB1dAorIyBkYXJrZXIuIFRoZSB2YWx1ZSBkaXZpZGVkIGJ5IDEwMCBpcyB0aGUgYWN0dWFsIGdhbW1hIGFwcGxpZWQsIHNvIDgwIHJlcHJlc2VudHMKKyMgYSBnYW1tYSBvZiAwLjgsIFRoZSB2YWx1ZSAyMjAgcmVwcmVzZW50cyBhIGdhbW1hIG9mIDIuMiwgYW5kIDEwMCBkb2VzIG5vdAorIyBjaGFuZ2UgdGhlIGdhbW1hLgorIyBNaW5pbXVtIHZhbHVlOiA0MCwgbWF4aW11bSB2YWx1ZTogMjQwLCBkZWZhdWx0IHZhbHVlOiA4MC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9DT0xPUlNUWUxFX0dBTU1BICA9IDgwCisKKyMgSWYgdGhlIEhUTUxfVElNRVNUQU1QIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIGZvb3RlciBvZiBlYWNoIGdlbmVyYXRlZCBIVE1MCisjIHBhZ2Ugd2lsbCBjb250YWluIHRoZSBkYXRlIGFuZCB0aW1lIHdoZW4gdGhlIHBhZ2Ugd2FzIGdlbmVyYXRlZC4gU2V0dGluZyB0aGlzCisjIHRvIFlFUyBjYW4gaGVscCB0byBzaG93IHdoZW4gZG94eWdlbiB3YXMgbGFzdCBydW4gYW5kIHRodXMgaWYgdGhlCisjIGRvY3VtZW50YXRpb24gaXMgdXAgdG8gZGF0ZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX1RJTUVTVEFNUCAgICAgICAgID0gTk8KKworIyBJZiB0aGUgSFRNTF9EWU5BTUlDX1NFQ1RJT05TIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIGdlbmVyYXRlZCBIVE1MCisjIGRvY3VtZW50YXRpb24gd2lsbCBjb250YWluIHNlY3Rpb25zIHRoYXQgY2FuIGJlIGhpZGRlbiBhbmQgc2hvd24gYWZ0ZXIgdGhlCisjIHBhZ2UgaGFzIGxvYWRlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX0RZTkFNSUNfU0VDVElPTlMgID0gWUVTCisKKyMgV2l0aCBIVE1MX0lOREVYX05VTV9FTlRSSUVTIG9uZSBjYW4gY29udHJvbCB0aGUgcHJlZmVycmVkIG51bWJlciBvZiBlbnRyaWVzCisjIHNob3duIGluIHRoZSB2YXJpb3VzIHRyZWUgc3RydWN0dXJlZCBpbmRpY2VzIGluaXRpYWxseTsgdGhlIHVzZXIgY2FuIGV4cGFuZAorIyBhbmQgY29sbGFwc2UgZW50cmllcyBkeW5hbWljYWxseSBsYXRlciBvbi4gRG94eWdlbiB3aWxsIGV4cGFuZCB0aGUgdHJlZSB0bworIyBzdWNoIGEgbGV2ZWwgdGhhdCBhdCBtb3N0IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGVudHJpZXMgYXJlIHZpc2libGUgKHVubGVzcworIyBhIGZ1bGx5IGNvbGxhcHNlZCB0cmVlIGFscmVhZHkgZXhjZWVkcyB0aGlzIGFtb3VudCkuIFNvIHNldHRpbmcgdGhlIG51bWJlciBvZgorIyBlbnRyaWVzIDEgd2lsbCBwcm9kdWNlIGEgZnVsbCBjb2xsYXBzZWQgdHJlZSBieSBkZWZhdWx0LiAwIGlzIGEgc3BlY2lhbCB2YWx1ZQorIyByZXByZXNlbnRpbmcgYW4gaW5maW5pdGUgbnVtYmVyIG9mIGVudHJpZXMgYW5kIHdpbGwgcmVzdWx0IGluIGEgZnVsbCBleHBhbmRlZAorIyB0cmVlIGJ5IGRlZmF1bHQuCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDk5OTksIGRlZmF1bHQgdmFsdWU6IDEwMC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9JTkRFWF9OVU1fRU5UUklFUyA9IDEwMAorCisjIElmIHRoZSBHRU5FUkFURV9ET0NTRVQgdGFnIGlzIHNldCB0byBZRVMsIGFkZGl0aW9uYWwgaW5kZXggZmlsZXMgd2lsbCBiZQorIyBnZW5lcmF0ZWQgdGhhdCBjYW4gYmUgdXNlZCBhcyBpbnB1dCBmb3IgQXBwbGUncyBYY29kZSAzIGludGVncmF0ZWQgZGV2ZWxvcG1lbnQKKyMgZW52aXJvbm1lbnQgKHNlZTogaHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vdG9vbHMveGNvZGUvKSwgaW50cm9kdWNlZCB3aXRoCisjIE9TWCAxMC41IChMZW9wYXJkKS4gVG8gY3JlYXRlIGEgZG9jdW1lbnRhdGlvbiBzZXQsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhCisjIE1ha2VmaWxlIGluIHRoZSBIVE1MIG91dHB1dCBkaXJlY3RvcnkuIFJ1bm5pbmcgbWFrZSB3aWxsIHByb2R1Y2UgdGhlIGRvY3NldCBpbgorIyB0aGF0IGRpcmVjdG9yeSBhbmQgcnVubmluZyBtYWtlIGluc3RhbGwgd2lsbCBpbnN0YWxsIHRoZSBkb2NzZXQgaW4KKyMgfi9MaWJyYXJ5L0RldmVsb3Blci9TaGFyZWQvRG9jdW1lbnRhdGlvbi9Eb2NTZXRzIHNvIHRoYXQgWGNvZGUgd2lsbCBmaW5kIGl0IGF0CisjIHN0YXJ0dXAuIFNlZSBodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS90b29scy9jcmVhdGluZ2RvY3NldHN3aXRoZG94eWdlbi5odG1sCisjIGZvciBtb3JlIGluZm9ybWF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0dFTkVSQVRFX0RPQ1NFVCAgICAgICAgPSBOTworCisjIFRoaXMgdGFnIGRldGVybWluZXMgdGhlIG5hbWUgb2YgdGhlIGRvY3NldCBmZWVkLiBBIGRvY3VtZW50YXRpb24gZmVlZCBwcm92aWRlcworIyBhbiB1bWJyZWxsYSB1bmRlciB3aGljaCBtdWx0aXBsZSBkb2N1bWVudGF0aW9uIHNldHMgZnJvbSBhIHNpbmdsZSBwcm92aWRlcgorIyAoc3VjaCBhcyBhIGNvbXBhbnkgb3IgcHJvZHVjdCBzdWl0ZSkgY2FuIGJlIGdyb3VwZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBEb3h5Z2VuIGdlbmVyYXRlZCBkb2NzLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfRE9DU0VUIGlzIHNldCB0byBZRVMuCisKK0RPQ1NFVF9GRUVETkFNRSAgICAgICAgPSAiRG94eWdlbiBnZW5lcmF0ZWQgZG9jcyIKKworIyBUaGlzIHRhZyBzcGVjaWZpZXMgYSBzdHJpbmcgdGhhdCBzaG91bGQgdW5pcXVlbHkgaWRlbnRpZnkgdGhlIGRvY3VtZW50YXRpb24KKyMgc2V0IGJ1bmRsZS4gVGhpcyBzaG91bGQgYmUgYSByZXZlcnNlIGRvbWFpbi1uYW1lIHN0eWxlIHN0cmluZywgZS5nLgorIyBjb20ubXljb21wYW55Lk15RG9jU2V0LiBEb3h5Z2VuIHdpbGwgYXBwZW5kIC5kb2NzZXQgdG8gdGhlIG5hbWUuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBvcmcuZG94eWdlbi5Qcm9qZWN0LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfRE9DU0VUIGlzIHNldCB0byBZRVMuCisKK0RPQ1NFVF9CVU5ETEVfSUQgICAgICAgPSBvcmcuZG94eWdlbi5Qcm9qZWN0CisKKyMgVGhlIERPQ1NFVF9QVUJMSVNIRVJfSUQgdGFnIHNwZWNpZmllcyBhIHN0cmluZyB0aGF0IHNob3VsZCB1bmlxdWVseSBpZGVudGlmeQorIyB0aGUgZG9jdW1lbnRhdGlvbiBwdWJsaXNoZXIuIFRoaXMgc2hvdWxkIGJlIGEgcmV2ZXJzZSBkb21haW4tbmFtZSBzdHlsZQorIyBzdHJpbmcsIGUuZy4gY29tLm15Y29tcGFueS5NeURvY1NldC5kb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogb3JnLmRveHlnZW4uUHVibGlzaGVyLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfRE9DU0VUIGlzIHNldCB0byBZRVMuCisKK0RPQ1NFVF9QVUJMSVNIRVJfSUQgICAgPSBvcmcuZG94eWdlbi5QdWJsaXNoZXIKKworIyBUaGUgRE9DU0VUX1BVQkxJU0hFUl9OQU1FIHRhZyBpZGVudGlmaWVzIHRoZSBkb2N1bWVudGF0aW9uIHB1Ymxpc2hlci4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFB1Ymxpc2hlci4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0RPQ1NFVCBpcyBzZXQgdG8gWUVTLgorCitET0NTRVRfUFVCTElTSEVSX05BTUUgID0gUHVibGlzaGVyCisKKyMgSWYgdGhlIEdFTkVSQVRFX0hUTUxIRUxQIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiBnZW5lcmF0ZXMgdGhyZWUKKyMgYWRkaXRpb25hbCBIVE1MIGluZGV4IGZpbGVzOiBpbmRleC5oaHAsIGluZGV4LmhoYywgYW5kIGluZGV4Lmhoay4gVGhlCisjIGluZGV4LmhocCBpcyBhIHByb2plY3QgZmlsZSB0aGF0IGNhbiBiZSByZWFkIGJ5IE1pY3Jvc29mdCdzIEhUTUwgSGVscCBXb3Jrc2hvcAorIyAoc2VlOiBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vZW4tdXMvZG93bmxvYWQvZGV0YWlscy5hc3B4P2lkPTIxMTM4KSBvbgorIyBXaW5kb3dzLgorIworIyBUaGUgSFRNTCBIZWxwIFdvcmtzaG9wIGNvbnRhaW5zIGEgY29tcGlsZXIgdGhhdCBjYW4gY29udmVydCBhbGwgSFRNTCBvdXRwdXQKKyMgZ2VuZXJhdGVkIGJ5IGRveHlnZW4gaW50byBhIHNpbmdsZSBjb21waWxlZCBIVE1MIGZpbGUgKC5jaG0pLiBDb21waWxlZCBIVE1MCisjIGZpbGVzIGFyZSBub3cgdXNlZCBhcyB0aGUgV2luZG93cyA5OCBoZWxwIGZvcm1hdCwgYW5kIHdpbGwgcmVwbGFjZSB0aGUgb2xkCisjIFdpbmRvd3MgaGVscCBmb3JtYXQgKC5obHApIG9uIGFsbCBXaW5kb3dzIHBsYXRmb3JtcyBpbiB0aGUgZnV0dXJlLiBDb21wcmVzc2VkCisjIEhUTUwgZmlsZXMgYWxzbyBjb250YWluIGFuIGluZGV4LCBhIHRhYmxlIG9mIGNvbnRlbnRzLCBhbmQgeW91IGNhbiBzZWFyY2ggZm9yCisjIHdvcmRzIGluIHRoZSBkb2N1bWVudGF0aW9uLiBUaGUgSFRNTCB3b3Jrc2hvcCBhbHNvIGNvbnRhaW5zIGEgdmlld2VyIGZvcgorIyBjb21wcmVzc2VkIEhUTUwgZmlsZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworR0VORVJBVEVfSFRNTEhFTFAgICAgICA9IE5PCisKKyMgVGhlIENITV9GSUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlIG5hbWUgb2YgdGhlIHJlc3VsdGluZyAuY2htCisjIGZpbGUuIFlvdSBjYW4gYWRkIGEgcGF0aCBpbiBmcm9udCBvZiB0aGUgZmlsZSBpZiB0aGUgcmVzdWx0IHNob3VsZCBub3QgYmUKKyMgd3JpdHRlbiB0byB0aGUgaHRtbCBvdXRwdXQgZGlyZWN0b3J5LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTEhFTFAgaXMgc2V0IHRvIFlFUy4KKworQ0hNX0ZJTEUgICAgICAgICAgICAgICA9IAorCisjIFRoZSBISENfTE9DQVRJT04gdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGxvY2F0aW9uIChhYnNvbHV0ZSBwYXRoCisjIGluY2x1ZGluZyBmaWxlIG5hbWUpIG9mIHRoZSBIVE1MIGhlbHAgY29tcGlsZXIgKGhoYy5leGUpLiBJZiBub24tZW1wdHksCisjIGRveHlnZW4gd2lsbCB0cnkgdG8gcnVuIHRoZSBIVE1MIGhlbHAgY29tcGlsZXIgb24gdGhlIGdlbmVyYXRlZCBpbmRleC5oaHAuCisjIFRoZSBmaWxlIGhhcyB0byBiZSBzcGVjaWZpZWQgd2l0aCBmdWxsIHBhdGguCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MSEVMUCBpcyBzZXQgdG8gWUVTLgorCitISENfTE9DQVRJT04gICAgICAgICAgID0gCisKKyMgVGhlIEdFTkVSQVRFX0NISSBmbGFnIGNvbnRyb2xzIGlmIGEgc2VwYXJhdGUgLmNoaSBpbmRleCBmaWxlIGlzIGdlbmVyYXRlZAorIyAoWUVTKSBvciB0aGF0IGl0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgbWFzdGVyIC5jaG0gZmlsZSAoTk8pLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MSEVMUCBpcyBzZXQgdG8gWUVTLgorCitHRU5FUkFURV9DSEkgICAgICAgICAgID0gTk8KKworIyBUaGUgQ0hNX0lOREVYX0VOQ09ESU5HIGlzIHVzZWQgdG8gZW5jb2RlIEh0bWxIZWxwIGluZGV4IChoaGspLCBjb250ZW50IChoaGMpCisjIGFuZCBwcm9qZWN0IGZpbGUgY29udGVudC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUxIRUxQIGlzIHNldCB0byBZRVMuCisKK0NITV9JTkRFWF9FTkNPRElORyAgICAgPSAKKworIyBUaGUgQklOQVJZX1RPQyBmbGFnIGNvbnRyb2xzIHdoZXRoZXIgYSBiaW5hcnkgdGFibGUgb2YgY29udGVudHMgaXMgZ2VuZXJhdGVkCisjIChZRVMpIG9yIGEgbm9ybWFsIHRhYmxlIG9mIGNvbnRlbnRzIChOTykgaW4gdGhlIC5jaG0gZmlsZS4gRnVydGhlcm1vcmUgaXQKKyMgZW5hYmxlcyB0aGUgUHJldmlvdXMgYW5kIE5leHQgYnV0dG9ucy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTEhFTFAgaXMgc2V0IHRvIFlFUy4KKworQklOQVJZX1RPQyAgICAgICAgICAgICA9IE5PCisKKyMgVGhlIFRPQ19FWFBBTkQgZmxhZyBjYW4gYmUgc2V0IHRvIFlFUyB0byBhZGQgZXh0cmEgaXRlbXMgZm9yIGdyb3VwIG1lbWJlcnMgdG8KKyMgdGhlIHRhYmxlIG9mIGNvbnRlbnRzIG9mIHRoZSBIVE1MIGhlbHAgZG9jdW1lbnRhdGlvbiBhbmQgdG8gdGhlIHRyZWUgdmlldy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTEhFTFAgaXMgc2V0IHRvIFlFUy4KKworVE9DX0VYUEFORCAgICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEdFTkVSQVRFX1FIUCB0YWcgaXMgc2V0IHRvIFlFUyBhbmQgYm90aCBRSFBfTkFNRVNQQUNFIGFuZAorIyBRSFBfVklSVFVBTF9GT0xERVIgYXJlIHNldCwgYW4gYWRkaXRpb25hbCBpbmRleCBmaWxlIHdpbGwgYmUgZ2VuZXJhdGVkIHRoYXQKKyMgY2FuIGJlIHVzZWQgYXMgaW5wdXQgZm9yIFF0J3MgcWhlbHBnZW5lcmF0b3IgdG8gZ2VuZXJhdGUgYSBRdCBDb21wcmVzc2VkIEhlbHAKKyMgKC5xY2gpIG9mIHRoZSBnZW5lcmF0ZWQgSFRNTCBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0dFTkVSQVRFX1FIUCAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBRSEdfTE9DQVRJT04gdGFnIGlzIHNwZWNpZmllZCwgdGhlIFFDSF9GSUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5CisjIHRoZSBmaWxlIG5hbWUgb2YgdGhlIHJlc3VsdGluZyAucWNoIGZpbGUuIFRoZSBwYXRoIHNwZWNpZmllZCBpcyByZWxhdGl2ZSB0bworIyB0aGUgSFRNTCBvdXRwdXQgZm9sZGVyLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUUhQIGlzIHNldCB0byBZRVMuCisKK1FDSF9GSUxFICAgICAgICAgICAgICAgPSAKKworIyBUaGUgUUhQX05BTUVTUEFDRSB0YWcgc3BlY2lmaWVzIHRoZSBuYW1lc3BhY2UgdG8gdXNlIHdoZW4gZ2VuZXJhdGluZyBRdCBIZWxwCisjIFByb2plY3Qgb3V0cHV0LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlIFF0IEhlbHAgUHJvamVjdCAvIE5hbWVzcGFjZQorIyAoc2VlOiBodHRwOi8vcXQtcHJvamVjdC5vcmcvZG9jL3F0LTQuOC9xdGhlbHBwcm9qZWN0Lmh0bWwjbmFtZXNwYWNlKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IG9yZy5kb3h5Z2VuLlByb2plY3QuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9RSFAgaXMgc2V0IHRvIFlFUy4KKworUUhQX05BTUVTUEFDRSAgICAgICAgICA9IG9yZy5kb3h5Z2VuLlByb2plY3QKKworIyBUaGUgUUhQX1ZJUlRVQUxfRk9MREVSIHRhZyBzcGVjaWZpZXMgdGhlIG5hbWVzcGFjZSB0byB1c2Ugd2hlbiBnZW5lcmF0aW5nIFF0CisjIEhlbHAgUHJvamVjdCBvdXRwdXQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUgUXQgSGVscCBQcm9qZWN0IC8gVmlydHVhbAorIyBGb2xkZXJzIChzZWU6IGh0dHA6Ly9xdC1wcm9qZWN0Lm9yZy9kb2MvcXQtNC44L3F0aGVscHByb2plY3QuaHRtbCN2aXJ0dWFsLQorIyBmb2xkZXJzKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IGRvYy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1FIUCBpcyBzZXQgdG8gWUVTLgorCitRSFBfVklSVFVBTF9GT0xERVIgICAgID0gZG9jCisKKyMgSWYgdGhlIFFIUF9DVVNUX0ZJTFRFUl9OQU1FIHRhZyBpcyBzZXQsIGl0IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhIGN1c3RvbQorIyBmaWx0ZXIgdG8gYWRkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlIFF0IEhlbHAgUHJvamVjdCAvIEN1c3RvbQorIyBGaWx0ZXJzIChzZWU6IGh0dHA6Ly9xdC1wcm9qZWN0Lm9yZy9kb2MvcXQtNC44L3F0aGVscHByb2plY3QuaHRtbCNjdXN0b20tCisjIGZpbHRlcnMpLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUUhQIGlzIHNldCB0byBZRVMuCisKK1FIUF9DVVNUX0ZJTFRFUl9OQU1FICAgPSAKKworIyBUaGUgUUhQX0NVU1RfRklMVEVSX0FUVFJTIHRhZyBzcGVjaWZpZXMgdGhlIGxpc3Qgb2YgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlCisjIGN1c3RvbSBmaWx0ZXIgdG8gYWRkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlIFF0IEhlbHAgUHJvamVjdCAvIEN1c3RvbQorIyBGaWx0ZXJzIChzZWU6IGh0dHA6Ly9xdC1wcm9qZWN0Lm9yZy9kb2MvcXQtNC44L3F0aGVscHByb2plY3QuaHRtbCNjdXN0b20tCisjIGZpbHRlcnMpLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUUhQIGlzIHNldCB0byBZRVMuCisKK1FIUF9DVVNUX0ZJTFRFUl9BVFRSUyAgPSAKKworIyBUaGUgUUhQX1NFQ1RfRklMVEVSX0FUVFJTIHRhZyBzcGVjaWZpZXMgdGhlIGxpc3Qgb2YgdGhlIGF0dHJpYnV0ZXMgdGhpcworIyBwcm9qZWN0J3MgZmlsdGVyIHNlY3Rpb24gbWF0Y2hlcy4gUXQgSGVscCBQcm9qZWN0IC8gRmlsdGVyIEF0dHJpYnV0ZXMgKHNlZToKKyMgaHR0cDovL3F0LXByb2plY3Qub3JnL2RvYy9xdC00LjgvcXRoZWxwcHJvamVjdC5odG1sI2ZpbHRlci1hdHRyaWJ1dGVzKS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1FIUCBpcyBzZXQgdG8gWUVTLgorCitRSFBfU0VDVF9GSUxURVJfQVRUUlMgID0gCisKKyMgVGhlIFFIR19MT0NBVElPTiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24gb2YgUXQncworIyBxaGVscGdlbmVyYXRvci4gSWYgbm9uLWVtcHR5IGRveHlnZW4gd2lsbCB0cnkgdG8gcnVuIHFoZWxwZ2VuZXJhdG9yIG9uIHRoZQorIyBnZW5lcmF0ZWQgLnFocCBmaWxlLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUUhQIGlzIHNldCB0byBZRVMuCisKK1FIR19MT0NBVElPTiAgICAgICAgICAgPSAKKworIyBJZiB0aGUgR0VORVJBVEVfRUNMSVBTRUhFTFAgdGFnIGlzIHNldCB0byBZRVMsIGFkZGl0aW9uYWwgaW5kZXggZmlsZXMgd2lsbCBiZQorIyBnZW5lcmF0ZWQsIHRvZ2V0aGVyIHdpdGggdGhlIEhUTUwgZmlsZXMsIHRoZXkgZm9ybSBhbiBFY2xpcHNlIGhlbHAgcGx1Z2luLiBUbworIyBpbnN0YWxsIHRoaXMgcGx1Z2luIGFuZCBtYWtlIGl0IGF2YWlsYWJsZSB1bmRlciB0aGUgaGVscCBjb250ZW50cyBtZW51IGluCisjIEVjbGlwc2UsIHRoZSBjb250ZW50cyBvZiB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIEhUTUwgYW5kIFhNTCBmaWxlcyBuZWVkcworIyB0byBiZSBjb3BpZWQgaW50byB0aGUgcGx1Z2lucyBkaXJlY3Rvcnkgb2YgZWNsaXBzZS4gVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeQorIyB3aXRoaW4gdGhlIHBsdWdpbnMgZGlyZWN0b3J5IHNob3VsZCBiZSB0aGUgc2FtZSBhcyB0aGUgRUNMSVBTRV9ET0NfSUQgdmFsdWUuCisjIEFmdGVyIGNvcHlpbmcgRWNsaXBzZSBuZWVkcyB0byBiZSByZXN0YXJ0ZWQgYmVmb3JlIHRoZSBoZWxwIGFwcGVhcnMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworR0VORVJBVEVfRUNMSVBTRUhFTFAgICA9IE5PCisKKyMgQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIEVjbGlwc2UgaGVscCBwbHVnaW4uIFdoZW4gaW5zdGFsbGluZyB0aGUgcGx1Z2luCisjIHRoZSBkaXJlY3RvcnkgbmFtZSBjb250YWluaW5nIHRoZSBIVE1MIGFuZCBYTUwgZmlsZXMgc2hvdWxkIGFsc28gaGF2ZSB0aGlzCisjIG5hbWUuIEVhY2ggZG9jdW1lbnRhdGlvbiBzZXQgc2hvdWxkIGhhdmUgaXRzIG93biBpZGVudGlmaWVyLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogb3JnLmRveHlnZW4uUHJvamVjdC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0VDTElQU0VIRUxQIGlzIHNldCB0byBZRVMuCisKK0VDTElQU0VfRE9DX0lEICAgICAgICAgPSBvcmcuZG94eWdlbi5Qcm9qZWN0CisKKyMgSWYgeW91IHdhbnQgZnVsbCBjb250cm9sIG92ZXIgdGhlIGxheW91dCBvZiB0aGUgZ2VuZXJhdGVkIEhUTUwgcGFnZXMgaXQgbWlnaHQKKyMgYmUgbmVjZXNzYXJ5IHRvIGRpc2FibGUgdGhlIGluZGV4IGFuZCByZXBsYWNlIGl0IHdpdGggeW91ciBvd24uIFRoZQorIyBESVNBQkxFX0lOREVYIHRhZyBjYW4gYmUgdXNlZCB0byB0dXJuIG9uL29mZiB0aGUgY29uZGVuc2VkIGluZGV4ICh0YWJzKSBhdCB0b3AKKyMgb2YgZWFjaCBIVE1MIHBhZ2UuIEEgdmFsdWUgb2YgTk8gZW5hYmxlcyB0aGUgaW5kZXggYW5kIHRoZSB2YWx1ZSBZRVMgZGlzYWJsZXMKKyMgaXQuIFNpbmNlIHRoZSB0YWJzIGluIHRoZSBpbmRleCBjb250YWluIHRoZSBzYW1lIGluZm9ybWF0aW9uIGFzIHRoZSBuYXZpZ2F0aW9uCisjIHRyZWUsIHlvdSBjYW4gc2V0IHRoaXMgb3B0aW9uIHRvIFlFUyBpZiB5b3UgYWxzbyBzZXQgR0VORVJBVEVfVFJFRVZJRVcgdG8gWUVTLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0RJU0FCTEVfSU5ERVggICAgICAgICAgPSBOTworCisjIFRoZSBHRU5FUkFURV9UUkVFVklFVyB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXRoZXIgYSB0cmVlLWxpa2UgaW5kZXgKKyMgc3RydWN0dXJlIHNob3VsZCBiZSBnZW5lcmF0ZWQgdG8gZGlzcGxheSBoaWVyYXJjaGljYWwgaW5mb3JtYXRpb24uIElmIHRoZSB0YWcKKyMgdmFsdWUgaXMgc2V0IHRvIFlFUywgYSBzaWRlIHBhbmVsIHdpbGwgYmUgZ2VuZXJhdGVkIGNvbnRhaW5pbmcgYSB0cmVlLWxpa2UKKyMgaW5kZXggc3RydWN0dXJlIChqdXN0IGxpa2UgdGhlIG9uZSB0aGF0IGlzIGdlbmVyYXRlZCBmb3IgSFRNTCBIZWxwKS4gRm9yIHRoaXMKKyMgdG8gd29yayBhIGJyb3dzZXIgdGhhdCBzdXBwb3J0cyBKYXZhU2NyaXB0LCBESFRNTCwgQ1NTIGFuZCBmcmFtZXMgaXMgcmVxdWlyZWQKKyMgKGkuZS4gYW55IG1vZGVybiBicm93c2VyKS4gV2luZG93cyB1c2VycyBhcmUgcHJvYmFibHkgYmV0dGVyIG9mZiB1c2luZyB0aGUKKyMgSFRNTCBoZWxwIGZlYXR1cmUuIFZpYSBjdXN0b20gc3R5bGUgc2hlZXRzIChzZWUgSFRNTF9FWFRSQV9TVFlMRVNIRUVUKSBvbmUgY2FuCisjIGZ1cnRoZXIgZmluZS10dW5lIHRoZSBsb29rIG9mIHRoZSBpbmRleC4gQXMgYW4gZXhhbXBsZSwgdGhlIGRlZmF1bHQgc3R5bGUKKyMgc2hlZXQgZ2VuZXJhdGVkIGJ5IGRveHlnZW4gaGFzIGFuIGV4YW1wbGUgdGhhdCBzaG93cyBob3cgdG8gcHV0IGFuIGltYWdlIGF0CisjIHRoZSByb290IG9mIHRoZSB0cmVlIGluc3RlYWQgb2YgdGhlIFBST0pFQ1RfTkFNRS4gU2luY2UgdGhlIHRyZWUgYmFzaWNhbGx5IGhhcworIyB0aGUgc2FtZSBpbmZvcm1hdGlvbiBhcyB0aGUgdGFiIGluZGV4LCB5b3UgY291bGQgY29uc2lkZXIgc2V0dGluZworIyBESVNBQkxFX0lOREVYIHRvIFlFUyB3aGVuIGVuYWJsaW5nIHRoaXMgb3B0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0dFTkVSQVRFX1RSRUVWSUVXICAgICAgPSBZRVMKKworIyBUaGUgRU5VTV9WQUxVRVNfUEVSX0xJTkUgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgbnVtYmVyIG9mIGVudW0gdmFsdWVzIHRoYXQKKyMgZG94eWdlbiB3aWxsIGdyb3VwIG9uIG9uZSBsaW5lIGluIHRoZSBnZW5lcmF0ZWQgSFRNTCBkb2N1bWVudGF0aW9uLgorIworIyBOb3RlIHRoYXQgYSB2YWx1ZSBvZiAwIHdpbGwgY29tcGxldGVseSBzdXBwcmVzcyB0aGUgZW51bSB2YWx1ZXMgZnJvbSBhcHBlYXJpbmcKKyMgaW4gdGhlIG92ZXJ2aWV3IHNlY3Rpb24uCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDIwLCBkZWZhdWx0IHZhbHVlOiA0LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitFTlVNX1ZBTFVFU19QRVJfTElORSAgID0gNAorCisjIElmIHRoZSB0cmVldmlldyBpcyBlbmFibGVkIChzZWUgR0VORVJBVEVfVFJFRVZJRVcpIHRoZW4gdGhpcyB0YWcgY2FuIGJlIHVzZWQKKyMgdG8gc2V0IHRoZSBpbml0aWFsIHdpZHRoIChpbiBwaXhlbHMpIG9mIHRoZSBmcmFtZSBpbiB3aGljaCB0aGUgdHJlZSBpcyBzaG93bi4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMTUwMCwgZGVmYXVsdCB2YWx1ZTogMjUwLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitUUkVFVklFV19XSURUSCAgICAgICAgID0gMjUwCisKKyMgSWYgdGhlIEVYVF9MSU5LU19JTl9XSU5ET1cgb3B0aW9uIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBvcGVuIGxpbmtzIHRvCisjIGV4dGVybmFsIHN5bWJvbHMgaW1wb3J0ZWQgdmlhIHRhZyBmaWxlcyBpbiBhIHNlcGFyYXRlIHdpbmRvdy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitFWFRfTElOS1NfSU5fV0lORE9XICAgID0gTk8KKworIyBVc2UgdGhpcyB0YWcgdG8gY2hhbmdlIHRoZSBmb250IHNpemUgb2YgTGFUZVggZm9ybXVsYXMgaW5jbHVkZWQgYXMgaW1hZ2VzIGluCisjIHRoZSBIVE1MIGRvY3VtZW50YXRpb24uIFdoZW4geW91IGNoYW5nZSB0aGUgZm9udCBzaXplIGFmdGVyIGEgc3VjY2Vzc2Z1bAorIyBkb3h5Z2VuIHJ1biB5b3UgbmVlZCB0byBtYW51YWxseSByZW1vdmUgYW55IGZvcm1fKi5wbmcgaW1hZ2VzIGZyb20gdGhlIEhUTUwKKyMgb3V0cHV0IGRpcmVjdG9yeSB0byBmb3JjZSB0aGVtIHRvIGJlIHJlZ2VuZXJhdGVkLgorIyBNaW5pbXVtIHZhbHVlOiA4LCBtYXhpbXVtIHZhbHVlOiA1MCwgZGVmYXVsdCB2YWx1ZTogMTAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0ZPUk1VTEFfRk9OVFNJWkUgICAgICAgPSAxMAorCisjIFVzZSB0aGUgRk9STVVMQV9UUkFOUEFSRU5UIHRhZyB0byBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgdGhlIGltYWdlcworIyBnZW5lcmF0ZWQgZm9yIGZvcm11bGFzIGFyZSB0cmFuc3BhcmVudCBQTkdzLiBUcmFuc3BhcmVudCBQTkdzIGFyZSBub3QKKyMgc3VwcG9ydGVkIHByb3Blcmx5IGZvciBJRSA2LjAsIGJ1dCBhcmUgc3VwcG9ydGVkIG9uIGFsbCBtb2Rlcm4gYnJvd3NlcnMuCisjCisjIE5vdGUgdGhhdCB3aGVuIGNoYW5naW5nIHRoaXMgb3B0aW9uIHlvdSBuZWVkIHRvIGRlbGV0ZSBhbnkgZm9ybV8qLnBuZyBmaWxlcyBpbgorIyB0aGUgSFRNTCBvdXRwdXQgZGlyZWN0b3J5IGJlZm9yZSB0aGUgY2hhbmdlcyBoYXZlIGVmZmVjdC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworRk9STVVMQV9UUkFOU1BBUkVOVCAgICA9IFlFUworCisjIEVuYWJsZSB0aGUgVVNFX01BVEhKQVggb3B0aW9uIHRvIHJlbmRlciBMYVRlWCBmb3JtdWxhcyB1c2luZyBNYXRoSmF4IChzZWUKKyMgaHR0cDovL3d3dy5tYXRoamF4Lm9yZykgd2hpY2ggdXNlcyBjbGllbnQgc2lkZSBKYXZhc2NyaXB0IGZvciB0aGUgcmVuZGVyaW5nCisjIGluc3RlYWQgb2YgdXNpbmcgcHJlLXJlbmRlcmVkIGJpdG1hcHMuIFVzZSB0aGlzIGlmIHlvdSBkbyBub3QgaGF2ZSBMYVRlWAorIyBpbnN0YWxsZWQgb3IgaWYgeW91IHdhbnQgdG8gZm9ybXVsYXMgbG9vayBwcmV0dGllciBpbiB0aGUgSFRNTCBvdXRwdXQuIFdoZW4KKyMgZW5hYmxlZCB5b3UgbWF5IGFsc28gbmVlZCB0byBpbnN0YWxsIE1hdGhKYXggc2VwYXJhdGVseSBhbmQgY29uZmlndXJlIHRoZSBwYXRoCisjIHRvIGl0IHVzaW5nIHRoZSBNQVRISkFYX1JFTFBBVEggb3B0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK1VTRV9NQVRISkFYICAgICAgICAgICAgPSBOTworCisjIFdoZW4gTWF0aEpheCBpcyBlbmFibGVkIHlvdSBjYW4gc2V0IHRoZSBkZWZhdWx0IG91dHB1dCBmb3JtYXQgdG8gYmUgdXNlZCBmb3IKKyMgdGhlIE1hdGhKYXggb3V0cHV0LiBTZWUgdGhlIE1hdGhKYXggc2l0ZSAoc2VlOgorIyBodHRwOi8vZG9jcy5tYXRoamF4Lm9yZy9lbi9sYXRlc3Qvb3V0cHV0Lmh0bWwpIGZvciBtb3JlIGRldGFpbHMuCisjIFBvc3NpYmxlIHZhbHVlcyBhcmU6IEhUTUwtQ1NTICh3aGljaCBpcyBzbG93ZXIsIGJ1dCBoYXMgdGhlIGJlc3QKKyMgY29tcGF0aWJpbGl0eSksIE5hdGl2ZU1NTCAoaS5lLiBNYXRoTUwpIGFuZCBTVkcuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBIVE1MLUNTUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFVTRV9NQVRISkFYIGlzIHNldCB0byBZRVMuCisKK01BVEhKQVhfRk9STUFUICAgICAgICAgPSBIVE1MLUNTUworCisjIFdoZW4gTWF0aEpheCBpcyBlbmFibGVkIHlvdSBuZWVkIHRvIHNwZWNpZnkgdGhlIGxvY2F0aW9uIHJlbGF0aXZlIHRvIHRoZSBIVE1MCisjIG91dHB1dCBkaXJlY3RvcnkgdXNpbmcgdGhlIE1BVEhKQVhfUkVMUEFUSCBvcHRpb24uIFRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkKKyMgc2hvdWxkIGNvbnRhaW4gdGhlIE1hdGhKYXguanMgc2NyaXB0LiBGb3IgaW5zdGFuY2UsIGlmIHRoZSBtYXRoamF4IGRpcmVjdG9yeQorIyBpcyBsb2NhdGVkIGF0IHRoZSBzYW1lIGxldmVsIGFzIHRoZSBIVE1MIG91dHB1dCBkaXJlY3RvcnksIHRoZW4KKyMgTUFUSEpBWF9SRUxQQVRIIHNob3VsZCBiZSAuLi9tYXRoamF4LiBUaGUgZGVmYXVsdCB2YWx1ZSBwb2ludHMgdG8gdGhlIE1hdGhKYXgKKyMgQ29udGVudCBEZWxpdmVyeSBOZXR3b3JrIHNvIHlvdSBjYW4gcXVpY2tseSBzZWUgdGhlIHJlc3VsdCB3aXRob3V0IGluc3RhbGxpbmcKKyMgTWF0aEpheC4gSG93ZXZlciwgaXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgdG8gaW5zdGFsbCBhIGxvY2FsIGNvcHkgb2YKKyMgTWF0aEpheCBmcm9tIGh0dHA6Ly93d3cubWF0aGpheC5vcmcgYmVmb3JlIGRlcGxveW1lbnQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBodHRwOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgVVNFX01BVEhKQVggaXMgc2V0IHRvIFlFUy4KKworTUFUSEpBWF9SRUxQQVRIICAgICAgICA9IGh0dHA6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QKKworIyBUaGUgTUFUSEpBWF9FWFRFTlNJT05TIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIE1hdGhKYXgKKyMgZXh0ZW5zaW9uIG5hbWVzIHRoYXQgc2hvdWxkIGJlIGVuYWJsZWQgZHVyaW5nIE1hdGhKYXggcmVuZGVyaW5nLiBGb3IgZXhhbXBsZQorIyBNQVRISkFYX0VYVEVOU0lPTlMgPSBUZVgvQU1TbWF0aCBUZVgvQU1Tc3ltYm9scworIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgVVNFX01BVEhKQVggaXMgc2V0IHRvIFlFUy4KKworTUFUSEpBWF9FWFRFTlNJT05TICAgICA9IAorCisjIFRoZSBNQVRISkFYX0NPREVGSUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgZmlsZSB3aXRoIGphdmFzY3JpcHQgcGllY2VzCisjIG9mIGNvZGUgdGhhdCB3aWxsIGJlIHVzZWQgb24gc3RhcnR1cCBvZiB0aGUgTWF0aEpheCBjb2RlLiBTZWUgdGhlIE1hdGhKYXggc2l0ZQorIyAoc2VlOiBodHRwOi8vZG9jcy5tYXRoamF4Lm9yZy9lbi9sYXRlc3Qvb3V0cHV0Lmh0bWwpIGZvciBtb3JlIGRldGFpbHMuIEZvciBhbgorIyBleGFtcGxlIHNlZSB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFVTRV9NQVRISkFYIGlzIHNldCB0byBZRVMuCisKK01BVEhKQVhfQ09ERUZJTEUgICAgICAgPSAKKworIyBXaGVuIHRoZSBTRUFSQ0hFTkdJTkUgdGFnIGlzIGVuYWJsZWQgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgc2VhcmNoIGJveCBmb3IKKyMgdGhlIEhUTUwgb3V0cHV0LiBUaGUgdW5kZXJseWluZyBzZWFyY2ggZW5naW5lIHVzZXMgamF2YXNjcmlwdCBhbmQgREhUTUwgYW5kCisjIHNob3VsZCB3b3JrIG9uIGFueSBtb2Rlcm4gYnJvd3Nlci4gTm90ZSB0aGF0IHdoZW4gdXNpbmcgSFRNTCBoZWxwCisjIChHRU5FUkFURV9IVE1MSEVMUCksIFF0IGhlbHAgKEdFTkVSQVRFX1FIUCksIG9yIGRvY3NldHMgKEdFTkVSQVRFX0RPQ1NFVCkKKyMgdGhlcmUgaXMgYWxyZWFkeSBhIHNlYXJjaCBmdW5jdGlvbiBzbyB0aGlzIG9uZSBzaG91bGQgdHlwaWNhbGx5IGJlIGRpc2FibGVkLgorIyBGb3IgbGFyZ2UgcHJvamVjdHMgdGhlIGphdmFzY3JpcHQgYmFzZWQgc2VhcmNoIGVuZ2luZSBjYW4gYmUgc2xvdywgdGhlbgorIyBlbmFibGluZyBTRVJWRVJfQkFTRURfU0VBUkNIIG1heSBwcm92aWRlIGEgYmV0dGVyIHNvbHV0aW9uLiBJdCBpcyBwb3NzaWJsZSB0bworIyBzZWFyY2ggdXNpbmcgdGhlIGtleWJvYXJkOyB0byBqdW1wIHRvIHRoZSBzZWFyY2ggYm94IHVzZSA8YWNjZXNzIGtleT4gKyBTCisjICh3aGF0IHRoZSA8YWNjZXNzIGtleT4gaXMgZGVwZW5kcyBvbiB0aGUgT1MgYW5kIGJyb3dzZXIsIGJ1dCBpdCBpcyB0eXBpY2FsbHkKKyMgPENUUkw+LCA8QUxUPi88b3B0aW9uPiwgb3IgYm90aCkuIEluc2lkZSB0aGUgc2VhcmNoIGJveCB1c2UgdGhlIDxjdXJzb3IgZG93bgorIyBrZXk+IHRvIGp1bXAgaW50byB0aGUgc2VhcmNoIHJlc3VsdHMgd2luZG93LCB0aGUgcmVzdWx0cyBjYW4gYmUgbmF2aWdhdGVkCisjIHVzaW5nIHRoZSA8Y3Vyc29yIGtleXM+LiBQcmVzcyA8RW50ZXI+IHRvIHNlbGVjdCBhbiBpdGVtIG9yIDxlc2NhcGU+IHRvIGNhbmNlbAorIyB0aGUgc2VhcmNoLiBUaGUgZmlsdGVyIG9wdGlvbnMgY2FuIGJlIHNlbGVjdGVkIHdoZW4gdGhlIGN1cnNvciBpcyBpbnNpZGUgdGhlCisjIHNlYXJjaCBib3ggYnkgcHJlc3NpbmcgPFNoaWZ0Pis8Y3Vyc29yIGRvd24+LiBBbHNvIGhlcmUgdXNlIHRoZSA8Y3Vyc29yIGtleXM+CisjIHRvIHNlbGVjdCBhIGZpbHRlciBhbmQgPEVudGVyPiBvciA8ZXNjYXBlPiB0byBhY3RpdmF0ZSBvciBjYW5jZWwgdGhlIGZpbHRlcgorIyBvcHRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK1NFQVJDSEVOR0lORSAgICAgICAgICAgPSBZRVMKKworIyBXaGVuIHRoZSBTRVJWRVJfQkFTRURfU0VBUkNIIHRhZyBpcyBlbmFibGVkIHRoZSBzZWFyY2ggZW5naW5lIHdpbGwgYmUKKyMgaW1wbGVtZW50ZWQgdXNpbmcgYSB3ZWIgc2VydmVyIGluc3RlYWQgb2YgYSB3ZWIgY2xpZW50IHVzaW5nIEphdmFzY3JpcHQuIFRoZXJlCisjIGFyZSB0d28gZmxhdm9ycyBvZiB3ZWIgc2VydmVyIGJhc2VkIHNlYXJjaGluZyBkZXBlbmRpbmcgb24gdGhlIEVYVEVSTkFMX1NFQVJDSAorIyBzZXR0aW5nLiBXaGVuIGRpc2FibGVkLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBQSFAgc2NyaXB0IGZvciBzZWFyY2hpbmcgYW5kCisjIGFuIGluZGV4IGZpbGUgdXNlZCBieSB0aGUgc2NyaXB0LiBXaGVuIEVYVEVSTkFMX1NFQVJDSCBpcyBlbmFibGVkIHRoZSBpbmRleGluZworIyBhbmQgc2VhcmNoaW5nIG5lZWRzIHRvIGJlIHByb3ZpZGVkIGJ5IGV4dGVybmFsIHRvb2xzLiBTZWUgdGhlIHNlY3Rpb24KKyMgIkV4dGVybmFsIEluZGV4aW5nIGFuZCBTZWFyY2hpbmciIGZvciBkZXRhaWxzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBTRUFSQ0hFTkdJTkUgaXMgc2V0IHRvIFlFUy4KKworU0VSVkVSX0JBU0VEX1NFQVJDSCAgICA9IE5PCisKKyMgV2hlbiBFWFRFUk5BTF9TRUFSQ0ggdGFnIGlzIGVuYWJsZWQgZG94eWdlbiB3aWxsIG5vIGxvbmdlciBnZW5lcmF0ZSB0aGUgUEhQCisjIHNjcmlwdCBmb3Igc2VhcmNoaW5nLiBJbnN0ZWFkIHRoZSBzZWFyY2ggcmVzdWx0cyBhcmUgd3JpdHRlbiB0byBhbiBYTUwgZmlsZQorIyB3aGljaCBuZWVkcyB0byBiZSBwcm9jZXNzZWQgYnkgYW4gZXh0ZXJuYWwgaW5kZXhlci4gRG94eWdlbiB3aWxsIGludm9rZSBhbgorIyBleHRlcm5hbCBzZWFyY2ggZW5naW5lIHBvaW50ZWQgdG8gYnkgdGhlIFNFQVJDSEVOR0lORV9VUkwgb3B0aW9uIHRvIG9idGFpbiB0aGUKKyMgc2VhcmNoIHJlc3VsdHMuCisjCisjIERveHlnZW4gc2hpcHMgd2l0aCBhbiBleGFtcGxlIGluZGV4ZXIgKGRveHlpbmRleGVyKSBhbmQgc2VhcmNoIGVuZ2luZQorIyAoZG94eXNlYXJjaC5jZ2kpIHdoaWNoIGFyZSBiYXNlZCBvbiB0aGUgb3BlbiBzb3VyY2Ugc2VhcmNoIGVuZ2luZSBsaWJyYXJ5CisjIFhhcGlhbiAoc2VlOiBodHRwOi8veGFwaWFuLm9yZy8pLgorIworIyBTZWUgdGhlIHNlY3Rpb24gIkV4dGVybmFsIEluZGV4aW5nIGFuZCBTZWFyY2hpbmciIGZvciBkZXRhaWxzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBTRUFSQ0hFTkdJTkUgaXMgc2V0IHRvIFlFUy4KKworRVhURVJOQUxfU0VBUkNIICAgICAgICA9IE5PCisKKyMgVGhlIFNFQVJDSEVOR0lORV9VUkwgc2hvdWxkIHBvaW50IHRvIGEgc2VhcmNoIGVuZ2luZSBob3N0ZWQgYnkgYSB3ZWIgc2VydmVyCisjIHdoaWNoIHdpbGwgcmV0dXJuIHRoZSBzZWFyY2ggcmVzdWx0cyB3aGVuIEVYVEVSTkFMX1NFQVJDSCBpcyBlbmFibGVkLgorIworIyBEb3h5Z2VuIHNoaXBzIHdpdGggYW4gZXhhbXBsZSBpbmRleGVyIChkb3h5aW5kZXhlcikgYW5kIHNlYXJjaCBlbmdpbmUKKyMgKGRveHlzZWFyY2guY2dpKSB3aGljaCBhcmUgYmFzZWQgb24gdGhlIG9wZW4gc291cmNlIHNlYXJjaCBlbmdpbmUgbGlicmFyeQorIyBYYXBpYW4gKHNlZTogaHR0cDovL3hhcGlhbi5vcmcvKS4gU2VlIHRoZSBzZWN0aW9uICJFeHRlcm5hbCBJbmRleGluZyBhbmQKKyMgU2VhcmNoaW5nIiBmb3IgZGV0YWlscy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNFQVJDSEVOR0lORSBpcyBzZXQgdG8gWUVTLgorCitTRUFSQ0hFTkdJTkVfVVJMICAgICAgID0gCisKKyMgV2hlbiBTRVJWRVJfQkFTRURfU0VBUkNIIGFuZCBFWFRFUk5BTF9TRUFSQ0ggYXJlIGJvdGggZW5hYmxlZCB0aGUgdW5pbmRleGVkCisjIHNlYXJjaCBkYXRhIGlzIHdyaXR0ZW4gdG8gYSBmaWxlIGZvciBpbmRleGluZyBieSBhbiBleHRlcm5hbCB0b29sLiBXaXRoIHRoZQorIyBTRUFSQ0hEQVRBX0ZJTEUgdGFnIHRoZSBuYW1lIG9mIHRoaXMgZmlsZSBjYW4gYmUgc3BlY2lmaWVkLgorIyBUaGUgZGVmYXVsdCBmaWxlIGlzOiBzZWFyY2hkYXRhLnhtbC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNFQVJDSEVOR0lORSBpcyBzZXQgdG8gWUVTLgorCitTRUFSQ0hEQVRBX0ZJTEUgICAgICAgID0gc2VhcmNoZGF0YS54bWwKKworIyBXaGVuIFNFUlZFUl9CQVNFRF9TRUFSQ0ggYW5kIEVYVEVSTkFMX1NFQVJDSCBhcmUgYm90aCBlbmFibGVkIHRoZQorIyBFWFRFUk5BTF9TRUFSQ0hfSUQgdGFnIGNhbiBiZSB1c2VkIGFzIGFuIGlkZW50aWZpZXIgZm9yIHRoZSBwcm9qZWN0LiBUaGlzIGlzCisjIHVzZWZ1bCBpbiBjb21iaW5hdGlvbiB3aXRoIEVYVFJBX1NFQVJDSF9NQVBQSU5HUyB0byBzZWFyY2ggdGhyb3VnaCBtdWx0aXBsZQorIyBwcm9qZWN0cyBhbmQgcmVkaXJlY3QgdGhlIHJlc3VsdHMgYmFjayB0byB0aGUgcmlnaHQgcHJvamVjdC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNFQVJDSEVOR0lORSBpcyBzZXQgdG8gWUVTLgorCitFWFRFUk5BTF9TRUFSQ0hfSUQgICAgID0gCisKKyMgVGhlIEVYVFJBX1NFQVJDSF9NQVBQSU5HUyB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIHNlYXJjaGluZyB0aHJvdWdoIGRveHlnZW4KKyMgcHJvamVjdHMgb3RoZXIgdGhhbiB0aGUgb25lIGRlZmluZWQgYnkgdGhpcyBjb25maWd1cmF0aW9uIGZpbGUsIGJ1dCB0aGF0IGFyZQorIyBhbGwgYWRkZWQgdG8gdGhlIHNhbWUgZXh0ZXJuYWwgc2VhcmNoIGluZGV4LiBFYWNoIHByb2plY3QgbmVlZHMgdG8gaGF2ZSBhCisjIHVuaXF1ZSBpZCBzZXQgdmlhIEVYVEVSTkFMX1NFQVJDSF9JRC4gVGhlIHNlYXJjaCBtYXBwaW5nIHRoZW4gbWFwcyB0aGUgaWQgb2YKKyMgdG8gYSByZWxhdGl2ZSBsb2NhdGlvbiB3aGVyZSB0aGUgZG9jdW1lbnRhdGlvbiBjYW4gYmUgZm91bmQuIFRoZSBmb3JtYXQgaXM6CisjIEVYVFJBX1NFQVJDSF9NQVBQSU5HUyA9IHRhZ25hbWUxPWxvYzEgdGFnbmFtZTI9bG9jMiAuLi4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNFQVJDSEVOR0lORSBpcyBzZXQgdG8gWUVTLgorCitFWFRSQV9TRUFSQ0hfTUFQUElOR1MgID0gCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIExhVGVYIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9MQVRFWCB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIExhVGVYIG91dHB1dC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworR0VORVJBVEVfTEFURVggICAgICAgICA9IE5PCisKKyMgVGhlIExBVEVYX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBMYVRlWCBkb2NzIHdpbGwgYmUgcHV0LiBJZiBhCisjIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlIHB1dCBpbiBmcm9udCBvZgorIyBpdC4KKyMgVGhlIGRlZmF1bHQgZGlyZWN0b3J5IGlzOiBsYXRleC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0xBVEVYX09VVFBVVCAgICAgICAgICAgPSBsYXRleAorCisjIFRoZSBMQVRFWF9DTURfTkFNRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgTGFUZVggY29tbWFuZCBuYW1lIHRvIGJlCisjIGludm9rZWQuCisjCisjIE5vdGUgdGhhdCB3aGVuIGVuYWJsaW5nIFVTRV9QREZMQVRFWCB0aGlzIG9wdGlvbiBpcyBvbmx5IHVzZWQgZm9yIGdlbmVyYXRpbmcKKyMgYml0bWFwcyBmb3IgZm9ybXVsYXMgaW4gdGhlIEhUTUwgb3V0cHV0LCBidXQgbm90IGluIHRoZSBNYWtlZmlsZSB0aGF0IGlzCisjIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBkaXJlY3RvcnkuCisjIFRoZSBkZWZhdWx0IGZpbGUgaXM6IGxhdGV4LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfQ01EX05BTUUgICAgICAgICA9IGxhdGV4CisKKyMgVGhlIE1BS0VJTkRFWF9DTURfTkFNRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgY29tbWFuZCBuYW1lIHRvIGdlbmVyYXRlCisjIGluZGV4IGZvciBMYVRlWC4KKyMgVGhlIGRlZmF1bHQgZmlsZSBpczogbWFrZWluZGV4LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTUFLRUlOREVYX0NNRF9OQU1FICAgICA9IG1ha2VpbmRleAorCisjIElmIHRoZSBDT01QQUNUX0xBVEVYIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIGdlbmVyYXRlcyBtb3JlIGNvbXBhY3QgTGFUZVgKKyMgZG9jdW1lbnRzLiBUaGlzIG1heSBiZSB1c2VmdWwgZm9yIHNtYWxsIHByb2plY3RzIGFuZCBtYXkgaGVscCB0byBzYXZlIHNvbWUKKyMgdHJlZXMgaW4gZ2VuZXJhbC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworQ09NUEFDVF9MQVRFWCAgICAgICAgICA9IE5PCisKKyMgVGhlIFBBUEVSX1RZUEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgcGFwZXIgdHlwZSB0aGF0IGlzIHVzZWQgYnkgdGhlCisjIHByaW50ZXIuCisjIFBvc3NpYmxlIHZhbHVlcyBhcmU6IGE0ICgyMTAgeCAyOTcgbW0pLCBsZXR0ZXIgKDguNSB4IDExIGluY2hlcyksIGxlZ2FsICg4LjUgeAorIyAxNCBpbmNoZXMpIGFuZCBleGVjdXRpdmUgKDcuMjUgeCAxMC41IGluY2hlcykuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBhNC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK1BBUEVSX1RZUEUgICAgICAgICAgICAgPSBhNAorCisjIFRoZSBFWFRSQV9QQUNLQUdFUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBMYVRlWCBwYWNrYWdlIG5hbWVzCisjIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBMYVRlWCBvdXRwdXQuIFRoZSBwYWNrYWdlIGNhbiBiZSBzcGVjaWZpZWQganVzdAorIyBieSBpdHMgbmFtZSBvciB3aXRoIHRoZSBjb3JyZWN0IHN5bnRheCBhcyB0byBiZSB1c2VkIHdpdGggdGhlIExhVGVYCisjIFx1c2VwYWNrYWdlIGNvbW1hbmQuIFRvIGdldCB0aGUgdGltZXMgZm9udCBmb3IgaW5zdGFuY2UgeW91IGNhbiBzcGVjaWZ5IDoKKyMgRVhUUkFfUEFDS0FHRVM9dGltZXMgb3IgRVhUUkFfUEFDS0FHRVM9e3RpbWVzfQorIyBUbyB1c2UgdGhlIG9wdGlvbiBpbnRsaW1pdHMgd2l0aCB0aGUgYW1zbWF0aCBwYWNrYWdlIHlvdSBjYW4gc3BlY2lmeToKKyMgRVhUUkFfUEFDS0FHRVM9W2ludGxpbWl0c117YW1zbWF0aH0KKyMgSWYgbGVmdCBibGFuayBubyBleHRyYSBwYWNrYWdlcyB3aWxsIGJlIGluY2x1ZGVkLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworRVhUUkFfUEFDS0FHRVMgICAgICAgICA9IAorCisjIFRoZSBMQVRFWF9IRUFERVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwZXJzb25hbCBMYVRlWCBoZWFkZXIgZm9yIHRoZQorIyBnZW5lcmF0ZWQgTGFUZVggZG9jdW1lbnQuIFRoZSBoZWFkZXIgc2hvdWxkIGNvbnRhaW4gZXZlcnl0aGluZyB1bnRpbCB0aGUgZmlyc3QKKyMgY2hhcHRlci4gSWYgaXQgaXMgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBzdGFuZGFyZCBoZWFkZXIuIFNlZQorIyBzZWN0aW9uICJEb3h5Z2VuIHVzYWdlIiBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIGxldCBkb3h5Z2VuIHdyaXRlIHRoZQorIyBkZWZhdWx0IGhlYWRlciB0byBhIHNlcGFyYXRlIGZpbGUuCisjCisjIE5vdGU6IE9ubHkgdXNlIGEgdXNlci1kZWZpbmVkIGhlYWRlciBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmchIFRoZQorIyBmb2xsb3dpbmcgY29tbWFuZHMgaGF2ZSBhIHNwZWNpYWwgbWVhbmluZyBpbnNpZGUgdGhlIGhlYWRlcjogJHRpdGxlLAorIyAkZGF0ZXRpbWUsICRkYXRlLCAkZG94eWdlbnZlcnNpb24sICRwcm9qZWN0bmFtZSwgJHByb2plY3RudW1iZXIsCisjICRwcm9qZWN0YnJpZWYsICRwcm9qZWN0bG9nby4gRG94eWdlbiB3aWxsIHJlcGxhY2UgJHRpdGxlIHdpdGggdGhlIGVtcHR5CisjIHN0cmluZywgZm9yIHRoZSByZXBsYWNlbWVudCB2YWx1ZXMgb2YgdGhlIG90aGVyIGNvbW1hbmRzIHRoZSB1c2VyIGlzIHJlZmVycmVkCisjIHRvIEhUTUxfSEVBREVSLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfSEVBREVSICAgICAgICAgICA9IAorCisjIFRoZSBMQVRFWF9GT09URVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwZXJzb25hbCBMYVRlWCBmb290ZXIgZm9yIHRoZQorIyBnZW5lcmF0ZWQgTGFUZVggZG9jdW1lbnQuIFRoZSBmb290ZXIgc2hvdWxkIGNvbnRhaW4gZXZlcnl0aGluZyBhZnRlciB0aGUgbGFzdAorIyBjaGFwdGVyLiBJZiBpdCBpcyBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIHN0YW5kYXJkIGZvb3Rlci4gU2VlCisjIExBVEVYX0hFQURFUiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgdG8gZ2VuZXJhdGUgYSBkZWZhdWx0IGZvb3RlciBhbmQgd2hhdAorIyBzcGVjaWFsIGNvbW1hbmRzIGNhbiBiZSB1c2VkIGluc2lkZSB0aGUgZm9vdGVyLgorIworIyBOb3RlOiBPbmx5IHVzZSBhIHVzZXItZGVmaW5lZCBmb290ZXIgaWYgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nIQorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfRk9PVEVSICAgICAgICAgICA9IAorCisjIFRoZSBMQVRFWF9FWFRSQV9TVFlMRVNIRUVUIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGFkZGl0aW9uYWwgdXNlci1kZWZpbmVkCisjIExhVGVYIHN0eWxlIHNoZWV0cyB0aGF0IGFyZSBpbmNsdWRlZCBhZnRlciB0aGUgc3RhbmRhcmQgc3R5bGUgc2hlZXRzIGNyZWF0ZWQKKyMgYnkgZG94eWdlbi4gVXNpbmcgdGhpcyBvcHRpb24gb25lIGNhbiBvdmVycnVsZSBjZXJ0YWluIHN0eWxlIGFzcGVjdHMuIERveHlnZW4KKyMgd2lsbCBjb3B5IHRoZSBzdHlsZSBzaGVldCBmaWxlcyB0byB0aGUgb3V0cHV0IGRpcmVjdG9yeS4KKyMgTm90ZTogVGhlIG9yZGVyIG9mIHRoZSBleHRyYSBzdHlsZSBzaGVldCBmaWxlcyBpcyBvZiBpbXBvcnRhbmNlIChlLmcuIHRoZSBsYXN0CisjIHN0eWxlIHNoZWV0IGluIHRoZSBsaXN0IG92ZXJydWxlcyB0aGUgc2V0dGluZyBvZiB0aGUgcHJldmlvdXMgb25lcyBpbiB0aGUKKyMgbGlzdCkuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitMQVRFWF9FWFRSQV9TVFlMRVNIRUVUID0gCisKKyMgVGhlIExBVEVYX0VYVFJBX0ZJTEVTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGV4dHJhIGltYWdlcyBvcgorIyBvdGhlciBzb3VyY2UgZmlsZXMgd2hpY2ggc2hvdWxkIGJlIGNvcGllZCB0byB0aGUgTEFURVhfT1VUUFVUIG91dHB1dAorIyBkaXJlY3RvcnkuIE5vdGUgdGhhdCB0aGUgZmlsZXMgd2lsbCBiZSBjb3BpZWQgYXMtaXM7IHRoZXJlIGFyZSBubyBjb21tYW5kcyBvcgorIyBtYXJrZXJzIGF2YWlsYWJsZS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0xBVEVYX0VYVFJBX0ZJTEVTICAgICAgPSAKKworIyBJZiB0aGUgUERGX0hZUEVSTElOS1MgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBMYVRlWCB0aGF0IGlzIGdlbmVyYXRlZCBpcworIyBwcmVwYXJlZCBmb3IgY29udmVyc2lvbiB0byBQREYgKHVzaW5nIHBzMnBkZiBvciBwZGZsYXRleCkuIFRoZSBQREYgZmlsZSB3aWxsCisjIGNvbnRhaW4gbGlua3MgKGp1c3QgbGlrZSB0aGUgSFRNTCBvdXRwdXQpIGluc3RlYWQgb2YgcGFnZSByZWZlcmVuY2VzLiBUaGlzCisjIG1ha2VzIHRoZSBvdXRwdXQgc3VpdGFibGUgZm9yIG9ubGluZSBicm93c2luZyB1c2luZyBhIFBERiB2aWV3ZXIuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitQREZfSFlQRVJMSU5LUyAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIFVTRV9QREZMQVRFWCB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIHVzZSBwZGZsYXRleCB0byBnZW5lcmF0ZQorIyB0aGUgUERGIGZpbGUgZGlyZWN0bHkgZnJvbSB0aGUgTGFUZVggZmlsZXMuIFNldCB0aGlzIG9wdGlvbiB0byBZRVMsIHRvIGdldCBhCisjIGhpZ2hlciBxdWFsaXR5IFBERiBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworVVNFX1BERkxBVEVYICAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBMQVRFWF9CQVRDSE1PREUgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBhZGQgdGhlIFxiYXRjaG1vZGUKKyMgY29tbWFuZCB0byB0aGUgZ2VuZXJhdGVkIExhVGVYIGZpbGVzLiBUaGlzIHdpbGwgaW5zdHJ1Y3QgTGFUZVggdG8ga2VlcCBydW5uaW5nCisjIGlmIGVycm9ycyBvY2N1ciwgaW5zdGVhZCBvZiBhc2tpbmcgdGhlIHVzZXIgZm9yIGhlbHAuIFRoaXMgb3B0aW9uIGlzIGFsc28gdXNlZAorIyB3aGVuIGdlbmVyYXRpbmcgZm9ybXVsYXMgaW4gSFRNTC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfQkFUQ0hNT0RFICAgICAgICA9IE5PCisKKyMgSWYgdGhlIExBVEVYX0hJREVfSU5ESUNFUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBub3QgaW5jbHVkZSB0aGUKKyMgaW5kZXggY2hhcHRlcnMgKHN1Y2ggYXMgRmlsZSBJbmRleCwgQ29tcG91bmQgSW5kZXgsIGV0Yy4pIGluIHRoZSBvdXRwdXQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0xBVEVYX0hJREVfSU5ESUNFUyAgICAgPSBOTworCisjIElmIHRoZSBMQVRFWF9TT1VSQ0VfQ09ERSB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBpbmNsdWRlIHNvdXJjZQorIyBjb2RlIHdpdGggc3ludGF4IGhpZ2hsaWdodGluZyBpbiB0aGUgTGFUZVggb3V0cHV0LgorIworIyBOb3RlIHRoYXQgd2hpY2ggc291cmNlcyBhcmUgc2hvd24gYWxzbyBkZXBlbmRzIG9uIG90aGVyIHNldHRpbmdzIHN1Y2ggYXMKKyMgU09VUkNFX0JST1dTRVIuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0xBVEVYX1NPVVJDRV9DT0RFICAgICAgPSBOTworCisjIFRoZSBMQVRFWF9CSUJfU1RZTEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIHN0eWxlIHRvIHVzZSBmb3IgdGhlCisjIGJpYmxpb2dyYXBoeSwgZS5nLiBwbGFpbm5hdCwgb3IgaWVlZXRyLiBTZWUKKyMgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CaWJUZVggYW5kIFxjaXRlIGZvciBtb3JlIGluZm8uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBwbGFpbi4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0xBVEVYX0JJQl9TVFlMRSAgICAgICAgPSBwbGFpbgorCisjIElmIHRoZSBMQVRFWF9USU1FU1RBTVAgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgZm9vdGVyIG9mIGVhY2ggZ2VuZXJhdGVkCisjIHBhZ2Ugd2lsbCBjb250YWluIHRoZSBkYXRlIGFuZCB0aW1lIHdoZW4gdGhlIHBhZ2Ugd2FzIGdlbmVyYXRlZC4gU2V0dGluZyB0aGlzCisjIHRvIE5PIGNhbiBoZWxwIHdoZW4gY29tcGFyaW5nIHRoZSBvdXRwdXQgb2YgbXVsdGlwbGUgcnVucy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfVElNRVNUQU1QICAgICAgICA9IE5PCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIFJURiBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgR0VORVJBVEVfUlRGIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgUlRGIG91dHB1dC4gVGhlCisjIFJURiBvdXRwdXQgaXMgb3B0aW1pemVkIGZvciBXb3JkIDk3IGFuZCBtYXkgbm90IGxvb2sgdG9vIHByZXR0eSB3aXRoIG90aGVyIFJURgorIyByZWFkZXJzL2VkaXRvcnMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworR0VORVJBVEVfUlRGICAgICAgICAgICA9IE5PCisKKyMgVGhlIFJURl9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgUlRGIGRvY3Mgd2lsbCBiZSBwdXQuIElmIGEKKyMgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUgcHV0IGluIGZyb250IG9mCisjIGl0LgorIyBUaGUgZGVmYXVsdCBkaXJlY3RvcnkgaXM6IHJ0Zi4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1JURiBpcyBzZXQgdG8gWUVTLgorCitSVEZfT1VUUFVUICAgICAgICAgICAgID0gcnRmCisKKyMgSWYgdGhlIENPTVBBQ1RfUlRGIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIGdlbmVyYXRlcyBtb3JlIGNvbXBhY3QgUlRGCisjIGRvY3VtZW50cy4gVGhpcyBtYXkgYmUgdXNlZnVsIGZvciBzbWFsbCBwcm9qZWN0cyBhbmQgbWF5IGhlbHAgdG8gc2F2ZSBzb21lCisjIHRyZWVzIGluIGdlbmVyYWwuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1JURiBpcyBzZXQgdG8gWUVTLgorCitDT01QQUNUX1JURiAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgUlRGX0hZUEVSTElOS1MgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBSVEYgdGhhdCBpcyBnZW5lcmF0ZWQgd2lsbAorIyBjb250YWluIGh5cGVybGluayBmaWVsZHMuIFRoZSBSVEYgZmlsZSB3aWxsIGNvbnRhaW4gbGlua3MgKGp1c3QgbGlrZSB0aGUgSFRNTAorIyBvdXRwdXQpIGluc3RlYWQgb2YgcGFnZSByZWZlcmVuY2VzLiBUaGlzIG1ha2VzIHRoZSBvdXRwdXQgc3VpdGFibGUgZm9yIG9ubGluZQorIyBicm93c2luZyB1c2luZyBXb3JkIG9yIHNvbWUgb3RoZXIgV29yZCBjb21wYXRpYmxlIHJlYWRlcnMgdGhhdCBzdXBwb3J0IHRob3NlCisjIGZpZWxkcy4KKyMKKyMgTm90ZTogV29yZFBhZCAod3JpdGUpIGFuZCBvdGhlcnMgZG8gbm90IHN1cHBvcnQgbGlua3MuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1JURiBpcyBzZXQgdG8gWUVTLgorCitSVEZfSFlQRVJMSU5LUyAgICAgICAgID0gTk8KKworIyBMb2FkIHN0eWxlc2hlZXQgZGVmaW5pdGlvbnMgZnJvbSBmaWxlLiBTeW50YXggaXMgc2ltaWxhciB0byBkb3h5Z2VuJ3MgY29uZmlnCisjIGZpbGUsIGkuZS4gYSBzZXJpZXMgb2YgYXNzaWdubWVudHMuIFlvdSBvbmx5IGhhdmUgdG8gcHJvdmlkZSByZXBsYWNlbWVudHMsCisjIG1pc3NpbmcgZGVmaW5pdGlvbnMgYXJlIHNldCB0byB0aGVpciBkZWZhdWx0IHZhbHVlLgorIworIyBTZWUgYWxzbyBzZWN0aW9uICJEb3h5Z2VuIHVzYWdlIiBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIGdlbmVyYXRlIHRoZQorIyBkZWZhdWx0IHN0eWxlIHNoZWV0IHRoYXQgZG94eWdlbiBub3JtYWxseSB1c2VzLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUlRGIGlzIHNldCB0byBZRVMuCisKK1JURl9TVFlMRVNIRUVUX0ZJTEUgICAgPSAKKworIyBTZXQgb3B0aW9uYWwgdmFyaWFibGVzIHVzZWQgaW4gdGhlIGdlbmVyYXRpb24gb2YgYW4gUlRGIGRvY3VtZW50LiBTeW50YXggaXMKKyMgc2ltaWxhciB0byBkb3h5Z2VuJ3MgY29uZmlnIGZpbGUuIEEgdGVtcGxhdGUgZXh0ZW5zaW9ucyBmaWxlIGNhbiBiZSBnZW5lcmF0ZWQKKyMgdXNpbmcgZG94eWdlbiAtZSBydGYgZXh0ZW5zaW9uRmlsZS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1JURiBpcyBzZXQgdG8gWUVTLgorCitSVEZfRVhURU5TSU9OU19GSUxFICAgID0gCisKKyMgSWYgdGhlIFJURl9TT1VSQ0VfQ09ERSB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBpbmNsdWRlIHNvdXJjZSBjb2RlCisjIHdpdGggc3ludGF4IGhpZ2hsaWdodGluZyBpbiB0aGUgUlRGIG91dHB1dC4KKyMKKyMgTm90ZSB0aGF0IHdoaWNoIHNvdXJjZXMgYXJlIHNob3duIGFsc28gZGVwZW5kcyBvbiBvdGhlciBzZXR0aW5ncyBzdWNoIGFzCisjIFNPVVJDRV9CUk9XU0VSLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9SVEYgaXMgc2V0IHRvIFlFUy4KKworUlRGX1NPVVJDRV9DT0RFICAgICAgICA9IE5PCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIG1hbiBwYWdlIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9NQU4gdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBtYW4gcGFnZXMgZm9yCisjIGNsYXNzZXMgYW5kIGZpbGVzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0dFTkVSQVRFX01BTiAgICAgICAgICAgPSBOTworCisjIFRoZSBNQU5fT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIG1hbiBwYWdlcyB3aWxsIGJlIHB1dC4gSWYgYQorIyByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZSBwdXQgaW4gZnJvbnQgb2YKKyMgaXQuIEEgZGlyZWN0b3J5IG1hbjMgd2lsbCBiZSBjcmVhdGVkIGluc2lkZSB0aGUgZGlyZWN0b3J5IHNwZWNpZmllZCBieQorIyBNQU5fT1VUUFVULgorIyBUaGUgZGVmYXVsdCBkaXJlY3RvcnkgaXM6IG1hbi4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX01BTiBpcyBzZXQgdG8gWUVTLgorCitNQU5fT1VUUFVUICAgICAgICAgICAgID0gbWFuCisKKyMgVGhlIE1BTl9FWFRFTlNJT04gdGFnIGRldGVybWluZXMgdGhlIGV4dGVuc2lvbiB0aGF0IGlzIGFkZGVkIHRvIHRoZSBnZW5lcmF0ZWQKKyMgbWFuIHBhZ2VzLiBJbiBjYXNlIHRoZSBtYW51YWwgc2VjdGlvbiBkb2VzIG5vdCBzdGFydCB3aXRoIGEgbnVtYmVyLCB0aGUgbnVtYmVyCisjIDMgaXMgcHJlcGVuZGVkLiBUaGUgZG90ICguKSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBNQU5fRVhURU5TSU9OIHRhZyBpcworIyBvcHRpb25hbC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IC4zLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTUFOIGlzIHNldCB0byBZRVMuCisKK01BTl9FWFRFTlNJT04gICAgICAgICAgPSAuMworCisjIFRoZSBNQU5fU1VCRElSIHRhZyBkZXRlcm1pbmVzIHRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgY3JlYXRlZCB3aXRoaW4KKyMgTUFOX09VVFBVVCBpbiB3aGljaCB0aGUgbWFuIHBhZ2VzIGFyZSBwbGFjZWQuIElmIGRlZmF1bHRzIHRvIG1hbiBmb2xsb3dlZCBieQorIyBNQU5fRVhURU5TSU9OIHdpdGggdGhlIGluaXRpYWwgLiByZW1vdmVkLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTUFOIGlzIHNldCB0byBZRVMuCisKK01BTl9TVUJESVIgICAgICAgICAgICAgPSAKKworIyBJZiB0aGUgTUFOX0xJTktTIHRhZyBpcyBzZXQgdG8gWUVTIGFuZCBkb3h5Z2VuIGdlbmVyYXRlcyBtYW4gb3V0cHV0LCB0aGVuIGl0CisjIHdpbGwgZ2VuZXJhdGUgb25lIGFkZGl0aW9uYWwgbWFuIGZpbGUgZm9yIGVhY2ggZW50aXR5IGRvY3VtZW50ZWQgaW4gdGhlIHJlYWwKKyMgbWFuIHBhZ2UocykuIFRoZXNlIGFkZGl0aW9uYWwgZmlsZXMgb25seSBzb3VyY2UgdGhlIHJlYWwgbWFuIHBhZ2UsIGJ1dCB3aXRob3V0CisjIHRoZW0gdGhlIG1hbiBjb21tYW5kIHdvdWxkIGJlIHVuYWJsZSB0byBmaW5kIHRoZSBjb3JyZWN0IHBhZ2UuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX01BTiBpcyBzZXQgdG8gWUVTLgorCitNQU5fTElOS1MgICAgICAgICAgICAgID0gTk8KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgWE1MIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9YTUwgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhbiBYTUwgZmlsZSB0aGF0CisjIGNhcHR1cmVzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGNvZGUgaW5jbHVkaW5nIGFsbCBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0dFTkVSQVRFX1hNTCAgICAgICAgICAgPSBOTworCisjIFRoZSBYTUxfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIFhNTCBwYWdlcyB3aWxsIGJlIHB1dC4gSWYgYQorIyByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZSBwdXQgaW4gZnJvbnQgb2YKKyMgaXQuCisjIFRoZSBkZWZhdWx0IGRpcmVjdG9yeSBpczogeG1sLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfWE1MIGlzIHNldCB0byBZRVMuCisKK1hNTF9PVVRQVVQgICAgICAgICAgICAgPSB4bWwKKworIyBJZiB0aGUgWE1MX1BST0dSQU1MSVNUSU5HIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZHVtcCB0aGUgcHJvZ3JhbQorIyBsaXN0aW5ncyAoaW5jbHVkaW5nIHN5bnRheCBoaWdobGlnaHRpbmcgYW5kIGNyb3NzLXJlZmVyZW5jaW5nIGluZm9ybWF0aW9uKSB0bworIyB0aGUgWE1MIG91dHB1dC4gTm90ZSB0aGF0IGVuYWJsaW5nIHRoaXMgd2lsbCBzaWduaWZpY2FudGx5IGluY3JlYXNlIHRoZSBzaXplCisjIG9mIHRoZSBYTUwgb3V0cHV0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfWE1MIGlzIHNldCB0byBZRVMuCisKK1hNTF9QUk9HUkFNTElTVElORyAgICAgPSBZRVMKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgRE9DQk9PSyBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgR0VORVJBVEVfRE9DQk9PSyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIERvY2Jvb2sgZmlsZXMKKyMgdGhhdCBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSBQREYuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworR0VORVJBVEVfRE9DQk9PSyAgICAgICA9IE5PCisKKyMgVGhlIERPQ0JPT0tfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIERvY2Jvb2sgcGFnZXMgd2lsbCBiZSBwdXQuCisjIElmIGEgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUgcHV0IGluCisjIGZyb250IG9mIGl0LgorIyBUaGUgZGVmYXVsdCBkaXJlY3RvcnkgaXM6IGRvY2Jvb2suCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9ET0NCT09LIGlzIHNldCB0byBZRVMuCisKK0RPQ0JPT0tfT1VUUFVUICAgICAgICAgPSBkb2Nib29rCisKKyMgSWYgdGhlIERPQ0JPT0tfUFJPR1JBTUxJU1RJTkcgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBpbmNsdWRlIHRoZQorIyBwcm9ncmFtIGxpc3RpbmdzIChpbmNsdWRpbmcgc3ludGF4IGhpZ2hsaWdodGluZyBhbmQgY3Jvc3MtcmVmZXJlbmNpbmcKKyMgaW5mb3JtYXRpb24pIHRvIHRoZSBET0NCT09LIG91dHB1dC4gTm90ZSB0aGF0IGVuYWJsaW5nIHRoaXMgd2lsbCBzaWduaWZpY2FudGx5CisjIGluY3JlYXNlIHRoZSBzaXplIG9mIHRoZSBET0NCT09LIG91dHB1dC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfRE9DQk9PSyBpcyBzZXQgdG8gWUVTLgorCitET0NCT09LX1BST0dSQU1MSVNUSU5HID0gTk8KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBBdXRvR2VuIERlZmluaXRpb25zIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9BVVRPR0VOX0RFRiB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGFuCisjIEF1dG9HZW4gRGVmaW5pdGlvbnMgKHNlZSBodHRwOi8vYXV0b2dlbi5zZi5uZXQpIGZpbGUgdGhhdCBjYXB0dXJlcyB0aGUKKyMgc3RydWN0dXJlIG9mIHRoZSBjb2RlIGluY2x1ZGluZyBhbGwgZG9jdW1lbnRhdGlvbi4gTm90ZSB0aGF0IHRoaXMgZmVhdHVyZSBpcworIyBzdGlsbCBleHBlcmltZW50YWwgYW5kIGluY29tcGxldGUgYXQgdGhlIG1vbWVudC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitHRU5FUkFURV9BVVRPR0VOX0RFRiAgID0gTk8KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgUGVybCBtb2R1bGUgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX1BFUkxNT0QgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIFBlcmwgbW9kdWxlCisjIGZpbGUgdGhhdCBjYXB0dXJlcyB0aGUgc3RydWN0dXJlIG9mIHRoZSBjb2RlIGluY2x1ZGluZyBhbGwgZG9jdW1lbnRhdGlvbi4KKyMKKyMgTm90ZSB0aGF0IHRoaXMgZmVhdHVyZSBpcyBzdGlsbCBleHBlcmltZW50YWwgYW5kIGluY29tcGxldGUgYXQgdGhlIG1vbWVudC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitHRU5FUkFURV9QRVJMTU9EICAgICAgID0gTk8KKworIyBJZiB0aGUgUEVSTE1PRF9MQVRFWCB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIHRoZSBuZWNlc3NhcnkKKyMgTWFrZWZpbGUgcnVsZXMsIFBlcmwgc2NyaXB0cyBhbmQgTGFUZVggY29kZSB0byBiZSBhYmxlIHRvIGdlbmVyYXRlIFBERiBhbmQgRFZJCisjIG91dHB1dCBmcm9tIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1BFUkxNT0QgaXMgc2V0IHRvIFlFUy4KKworUEVSTE1PRF9MQVRFWCAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIFBFUkxNT0RfUFJFVFRZIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgUGVybCBtb2R1bGUgb3V0cHV0IHdpbGwgYmUgbmljZWx5CisjIGZvcm1hdHRlZCBzbyBpdCBjYW4gYmUgcGFyc2VkIGJ5IGEgaHVtYW4gcmVhZGVyLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB0bworIyB1bmRlcnN0YW5kIHdoYXQgaXMgZ29pbmcgb24uIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB0aGlzIHRhZyBpcyBzZXQgdG8gTk8sIHRoZQorIyBzaXplIG9mIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQgd2lsbCBiZSBtdWNoIHNtYWxsZXIgYW5kIFBlcmwgd2lsbCBwYXJzZSBpdAorIyBqdXN0IHRoZSBzYW1lLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUEVSTE1PRCBpcyBzZXQgdG8gWUVTLgorCitQRVJMTU9EX1BSRVRUWSAgICAgICAgID0gWUVTCisKKyMgVGhlIG5hbWVzIG9mIHRoZSBtYWtlIHZhcmlhYmxlcyBpbiB0aGUgZ2VuZXJhdGVkIGRveHlydWxlcy5tYWtlIGZpbGUgYXJlCisjIHByZWZpeGVkIHdpdGggdGhlIHN0cmluZyBjb250YWluZWQgaW4gUEVSTE1PRF9NQUtFVkFSX1BSRUZJWC4gVGhpcyBpcyB1c2VmdWwKKyMgc28gZGlmZmVyZW50IGRveHlydWxlcy5tYWtlIGZpbGVzIGluY2x1ZGVkIGJ5IHRoZSBzYW1lIE1ha2VmaWxlIGRvbid0CisjIG92ZXJ3cml0ZSBlYWNoIG90aGVyJ3MgdmFyaWFibGVzLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUEVSTE1PRCBpcyBzZXQgdG8gWUVTLgorCitQRVJMTU9EX01BS0VWQVJfUFJFRklYID0gCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIHByZXByb2Nlc3NvcgorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBFTkFCTEVfUFJFUFJPQ0VTU0lORyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGV2YWx1YXRlIGFsbAorIyBDLXByZXByb2Nlc3NvciBkaXJlY3RpdmVzIGZvdW5kIGluIHRoZSBzb3VyY2VzIGFuZCBpbmNsdWRlIGZpbGVzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitFTkFCTEVfUFJFUFJPQ0VTU0lORyAgID0gWUVTCisKKyMgSWYgdGhlIE1BQ1JPX0VYUEFOU0lPTiB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGV4cGFuZCBhbGwgbWFjcm8gbmFtZXMKKyMgaW4gdGhlIHNvdXJjZSBjb2RlLiBJZiBzZXQgdG8gTk8sIG9ubHkgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gd2lsbCBiZQorIyBwZXJmb3JtZWQuIE1hY3JvIGV4cGFuc2lvbiBjYW4gYmUgZG9uZSBpbiBhIGNvbnRyb2xsZWQgd2F5IGJ5IHNldHRpbmcKKyMgRVhQQU5EX09OTFlfUFJFREVGIHRvIFlFUy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRU5BQkxFX1BSRVBST0NFU1NJTkcgaXMgc2V0IHRvIFlFUy4KKworTUFDUk9fRVhQQU5TSU9OICAgICAgICA9IFlFUworCisjIElmIHRoZSBFWFBBTkRfT05MWV9QUkVERUYgYW5kIE1BQ1JPX0VYUEFOU0lPTiB0YWdzIGFyZSBib3RoIHNldCB0byBZRVMgdGhlbgorIyB0aGUgbWFjcm8gZXhwYW5zaW9uIGlzIGxpbWl0ZWQgdG8gdGhlIG1hY3JvcyBzcGVjaWZpZWQgd2l0aCB0aGUgUFJFREVGSU5FRCBhbmQKKyMgRVhQQU5EX0FTX0RFRklORUQgdGFncy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRU5BQkxFX1BSRVBST0NFU1NJTkcgaXMgc2V0IHRvIFlFUy4KKworRVhQQU5EX09OTFlfUFJFREVGICAgICA9IFlFUworCisjIElmIHRoZSBTRUFSQ0hfSU5DTFVERVMgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBpbmNsdWRlIGZpbGVzIGluIHRoZQorIyBJTkNMVURFX1BBVEggd2lsbCBiZSBzZWFyY2hlZCBpZiBhICNpbmNsdWRlIGlzIGZvdW5kLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRU5BQkxFX1BSRVBST0NFU1NJTkcgaXMgc2V0IHRvIFlFUy4KKworU0VBUkNIX0lOQ0xVREVTICAgICAgICA9IFlFUworCisjIFRoZSBJTkNMVURFX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZGlyZWN0b3JpZXMgdGhhdAorIyBjb250YWluIGluY2x1ZGUgZmlsZXMgdGhhdCBhcmUgbm90IGlucHV0IGZpbGVzIGJ1dCBzaG91bGQgYmUgcHJvY2Vzc2VkIGJ5IHRoZQorIyBwcmVwcm9jZXNzb3IuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBTRUFSQ0hfSU5DTFVERVMgaXMgc2V0IHRvIFlFUy4KKworSU5DTFVERV9QQVRIICAgICAgICAgICA9IC9Wb2x1bWVzL0EvYW9zcC9wcmVidWlsdHMvY2xhbmcvZGFyd2luLXg4Ni9ob3N0LzMuNi9saWIvY2xhbmcvMy42L2luY2x1ZGUgXAorICAgICAgICAgICAgICAgICAgICAgICAgIC9Wb2x1bWVzL0EvYW9zcC9leHRlcm5hbC9saWJjeHgvaW5jbHVkZSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgL1ZvbHVtZXMvQS9hb3NwL2Jpb25pYy9saWJjL2luY2x1ZGUgXAorICAgICAgICAgICAgICAgICAgICAgICAgIC9Wb2x1bWVzL0EvYW9zcC9iaW9uaWMvbGliYy9rZXJuZWwvdWFwaSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgL1ZvbHVtZXMvQS9hb3NwL2Jpb25pYy9saWJjL2tlcm5lbC91YXBpL2FzbS1hcm02NCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgL1ZvbHVtZXMvQS9hb3NwL2V4dGVybmFsL2d0ZXN0CisKKyMgWW91IGNhbiB1c2UgdGhlIElOQ0xVREVfRklMRV9QQVRURVJOUyB0YWcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB3aWxkY2FyZAorIyBwYXR0ZXJucyAobGlrZSAqLmggYW5kICouaHBwKSB0byBmaWx0ZXIgb3V0IHRoZSBoZWFkZXItZmlsZXMgaW4gdGhlCisjIGRpcmVjdG9yaWVzLiBJZiBsZWZ0IGJsYW5rLCB0aGUgcGF0dGVybnMgc3BlY2lmaWVkIHdpdGggRklMRV9QQVRURVJOUyB3aWxsIGJlCisjIHVzZWQuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBFTkFCTEVfUFJFUFJPQ0VTU0lORyBpcyBzZXQgdG8gWUVTLgorCitJTkNMVURFX0ZJTEVfUEFUVEVSTlMgID0gCisKKyMgVGhlIFBSRURFRklORUQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgbWFjcm8gbmFtZXMgdGhhdCBhcmUKKyMgZGVmaW5lZCBiZWZvcmUgdGhlIHByZXByb2Nlc3NvciBpcyBzdGFydGVkIChzaW1pbGFyIHRvIHRoZSAtRCBvcHRpb24gb2YgZS5nLgorIyBnY2MpLiBUaGUgYXJndW1lbnQgb2YgdGhlIHRhZyBpcyBhIGxpc3Qgb2YgbWFjcm9zIG9mIHRoZSBmb3JtOiBuYW1lIG9yCisjIG5hbWU9ZGVmaW5pdGlvbiAobm8gc3BhY2VzKS4gSWYgdGhlIGRlZmluaXRpb24gYW5kIHRoZSAiPSIgYXJlIG9taXR0ZWQsICI9MSIKKyMgaXMgYXNzdW1lZC4gVG8gcHJldmVudCBhIG1hY3JvIGRlZmluaXRpb24gZnJvbSBiZWluZyB1bmRlZmluZWQgdmlhICN1bmRlZiBvcgorIyByZWN1cnNpdmVseSBleHBhbmRlZCB1c2UgdGhlIDo9IG9wZXJhdG9yIGluc3RlYWQgb2YgdGhlID0gb3BlcmF0b3IuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBFTkFCTEVfUFJFUFJPQ0VTU0lORyBpcyBzZXQgdG8gWUVTLgorCitQUkVERUZJTkVEICAgICAgICAgICAgID0gX19BUFBMRV9fPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgX19BTkRST0lEX189MSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRDo9MSBcCisJCQkgX191bnVzZWQ9CisKKyMgSWYgdGhlIE1BQ1JPX0VYUEFOU0lPTiBhbmQgRVhQQU5EX09OTFlfUFJFREVGIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbiB0aGlzCisjIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbGlzdCBvZiBtYWNybyBuYW1lcyB0aGF0IHNob3VsZCBiZSBleHBhbmRlZC4gVGhlCisjIG1hY3JvIGRlZmluaXRpb24gdGhhdCBpcyBmb3VuZCBpbiB0aGUgc291cmNlcyB3aWxsIGJlIHVzZWQuIFVzZSB0aGUgUFJFREVGSU5FRAorIyB0YWcgaWYgeW91IHdhbnQgdG8gdXNlIGEgZGlmZmVyZW50IG1hY3JvIGRlZmluaXRpb24gdGhhdCBvdmVycnVsZXMgdGhlCisjIGRlZmluaXRpb24gZm91bmQgaW4gdGhlIHNvdXJjZSBjb2RlLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRU5BQkxFX1BSRVBST0NFU1NJTkcgaXMgc2V0IHRvIFlFUy4KKworRVhQQU5EX0FTX0RFRklORUQgICAgICA9IERFRklORV9GTEVYSUJMRV9NRVRIT0RTIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBERUZJTkVfQ0FTVF9PUEVSQVRPUlMKKworIyBJZiB0aGUgU0tJUF9GVU5DVElPTl9NQUNST1MgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuJ3MgcHJlcHJvY2Vzc29yIHdpbGwKKyMgcmVtb3ZlIGFsbCByZWZlcmVuY2VzIHRvIGZ1bmN0aW9uLWxpa2UgbWFjcm9zIHRoYXQgYXJlIGFsb25lIG9uIGEgbGluZSwgaGF2ZQorIyBhbiBhbGwgdXBwZXJjYXNlIG5hbWUsIGFuZCBkbyBub3QgZW5kIHdpdGggYSBzZW1pY29sb24uIFN1Y2ggZnVuY3Rpb24gbWFjcm9zCisjIGFyZSB0eXBpY2FsbHkgdXNlZCBmb3IgYm9pbGVyLXBsYXRlIGNvZGUsIGFuZCB3aWxsIGNvbmZ1c2UgdGhlIHBhcnNlciBpZiBub3QKKyMgcmVtb3ZlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEVOQUJMRV9QUkVQUk9DRVNTSU5HIGlzIHNldCB0byBZRVMuCisKK1NLSVBfRlVOQ1RJT05fTUFDUk9TICAgPSBZRVMKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byBleHRlcm5hbCByZWZlcmVuY2VzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgVGhlIFRBR0ZJTEVTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHRhZyBmaWxlcy4gRm9yIGVhY2ggdGFnCisjIGZpbGUgdGhlIGxvY2F0aW9uIG9mIHRoZSBleHRlcm5hbCBkb2N1bWVudGF0aW9uIHNob3VsZCBiZSBhZGRlZC4gVGhlIGZvcm1hdCBvZgorIyBhIHRhZyBmaWxlIHdpdGhvdXQgdGhpcyBsb2NhdGlvbiBpcyBhcyBmb2xsb3dzOgorIyBUQUdGSUxFUyA9IGZpbGUxIGZpbGUyIC4uLgorIyBBZGRpbmcgbG9jYXRpb24gZm9yIHRoZSB0YWcgZmlsZXMgaXMgZG9uZSBhcyBmb2xsb3dzOgorIyBUQUdGSUxFUyA9IGZpbGUxPWxvYzEgImZpbGUyID0gbG9jMiIgLi4uCisjIHdoZXJlIGxvYzEgYW5kIGxvYzIgY2FuIGJlIHJlbGF0aXZlIG9yIGFic29sdXRlIHBhdGhzIG9yIFVSTHMuIFNlZSB0aGUKKyMgc2VjdGlvbiAiTGlua2luZyB0byBleHRlcm5hbCBkb2N1bWVudGF0aW9uIiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdXNlCisjIG9mIHRhZyBmaWxlcy4KKyMgTm90ZTogRWFjaCB0YWcgZmlsZSBtdXN0IGhhdmUgYSB1bmlxdWUgbmFtZSAod2hlcmUgdGhlIG5hbWUgZG9lcyBOT1QgaW5jbHVkZQorIyB0aGUgcGF0aCkuIElmIGEgdGFnIGZpbGUgaXMgbm90IGxvY2F0ZWQgaW4gdGhlIGRpcmVjdG9yeSBpbiB3aGljaCBkb3h5Z2VuIGlzCisjIHJ1biwgeW91IG11c3QgYWxzbyBzcGVjaWZ5IHRoZSBwYXRoIHRvIHRoZSB0YWdmaWxlIGhlcmUuCisKK1RBR0ZJTEVTICAgICAgICAgICAgICAgPSAKKworIyBXaGVuIGEgZmlsZSBuYW1lIGlzIHNwZWNpZmllZCBhZnRlciBHRU5FUkFURV9UQUdGSUxFLCBkb3h5Z2VuIHdpbGwgY3JlYXRlIGEKKyMgdGFnIGZpbGUgdGhhdCBpcyBiYXNlZCBvbiB0aGUgaW5wdXQgZmlsZXMgaXQgcmVhZHMuIFNlZSBzZWN0aW9uICJMaW5raW5nIHRvCisjIGV4dGVybmFsIGRvY3VtZW50YXRpb24iIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSB1c2FnZSBvZiB0YWcgZmlsZXMuCisKK0dFTkVSQVRFX1RBR0ZJTEUgICAgICAgPSAKKworIyBJZiB0aGUgQUxMRVhURVJOQUxTIHRhZyBpcyBzZXQgdG8gWUVTLCBhbGwgZXh0ZXJuYWwgY2xhc3Mgd2lsbCBiZSBsaXN0ZWQgaW4KKyMgdGhlIGNsYXNzIGluZGV4LiBJZiBzZXQgdG8gTk8sIG9ubHkgdGhlIGluaGVyaXRlZCBleHRlcm5hbCBjbGFzc2VzIHdpbGwgYmUKKyMgbGlzdGVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0FMTEVYVEVSTkFMUyAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBFWFRFUk5BTF9HUk9VUFMgdGFnIGlzIHNldCB0byBZRVMsIGFsbCBleHRlcm5hbCBncm91cHMgd2lsbCBiZSBsaXN0ZWQKKyMgaW4gdGhlIG1vZHVsZXMgaW5kZXguIElmIHNldCB0byBOTywgb25seSB0aGUgY3VycmVudCBwcm9qZWN0J3MgZ3JvdXBzIHdpbGwgYmUKKyMgbGlzdGVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitFWFRFUk5BTF9HUk9VUFMgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEVYVEVSTkFMX1BBR0VTIHRhZyBpcyBzZXQgdG8gWUVTLCBhbGwgZXh0ZXJuYWwgcGFnZXMgd2lsbCBiZSBsaXN0ZWQgaW4KKyMgdGhlIHJlbGF0ZWQgcGFnZXMgaW5kZXguIElmIHNldCB0byBOTywgb25seSB0aGUgY3VycmVudCBwcm9qZWN0J3MgcGFnZXMgd2lsbAorIyBiZSBsaXN0ZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0VYVEVSTkFMX1BBR0VTICAgICAgICAgPSBZRVMKKworIyBUaGUgUEVSTF9QQVRIIHNob3VsZCBiZSB0aGUgYWJzb2x1dGUgcGF0aCBhbmQgbmFtZSBvZiB0aGUgcGVybCBzY3JpcHQKKyMgaW50ZXJwcmV0ZXIgKGkuZS4gdGhlIHJlc3VsdCBvZiAnd2hpY2ggcGVybCcpLgorIyBUaGUgZGVmYXVsdCBmaWxlICh3aXRoIGFic29sdXRlIHBhdGgpIGlzOiAvdXNyL2Jpbi9wZXJsLgorCitQRVJMX1BBVEggICAgICAgICAgICAgID0gL3Vzci9iaW4vcGVybAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBkb3QgdG9vbAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBDTEFTU19ESUFHUkFNUyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgY2xhc3MgZGlhZ3JhbQorIyAoaW4gSFRNTCBhbmQgTGFUZVgpIGZvciBjbGFzc2VzIHdpdGggYmFzZSBvciBzdXBlciBjbGFzc2VzLiBTZXR0aW5nIHRoZSB0YWcgdG8KKyMgTk8gdHVybnMgdGhlIGRpYWdyYW1zIG9mZi4gTm90ZSB0aGF0IHRoaXMgb3B0aW9uIGFsc28gd29ya3Mgd2l0aCBIQVZFX0RPVAorIyBkaXNhYmxlZCwgYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIGluc3RhbGwgYW5kIHVzZSBkb3QsIHNpbmNlIGl0IHlpZWxkcyBtb3JlCisjIHBvd2VyZnVsIGdyYXBocy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworQ0xBU1NfRElBR1JBTVMgICAgICAgICA9IFlFUworCisjIFlvdSBjYW4gZGVmaW5lIG1lc3NhZ2Ugc2VxdWVuY2UgY2hhcnRzIHdpdGhpbiBkb3h5Z2VuIGNvbW1lbnRzIHVzaW5nIHRoZSBcbXNjCisjIGNvbW1hbmQuIERveHlnZW4gd2lsbCB0aGVuIHJ1biB0aGUgbXNjZ2VuIHRvb2wgKHNlZToKKyMgaHR0cDovL3d3dy5tY3Rlcm5hbi5tZS51ay9tc2NnZW4vKSkgdG8gcHJvZHVjZSB0aGUgY2hhcnQgYW5kIGluc2VydCBpdCBpbiB0aGUKKyMgZG9jdW1lbnRhdGlvbi4gVGhlIE1TQ0dFTl9QQVRIIHRhZyBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIGRpcmVjdG9yeSB3aGVyZQorIyB0aGUgbXNjZ2VuIHRvb2wgcmVzaWRlcy4gSWYgbGVmdCBlbXB0eSB0aGUgdG9vbCBpcyBhc3N1bWVkIHRvIGJlIGZvdW5kIGluIHRoZQorIyBkZWZhdWx0IHNlYXJjaCBwYXRoLgorCitNU0NHRU5fUEFUSCAgICAgICAgICAgID0gCisKKyMgWW91IGNhbiBpbmNsdWRlIGRpYWdyYW1zIG1hZGUgd2l0aCBkaWEgaW4gZG94eWdlbiBkb2N1bWVudGF0aW9uLiBEb3h5Z2VuIHdpbGwKKyMgdGhlbiBydW4gZGlhIHRvIHByb2R1Y2UgdGhlIGRpYWdyYW0gYW5kIGluc2VydCBpdCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gVGhlCisjIERJQV9QQVRIIHRhZyBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgZGlhIGJpbmFyeSByZXNpZGVzLgorIyBJZiBsZWZ0IGVtcHR5IGRpYSBpcyBhc3N1bWVkIHRvIGJlIGZvdW5kIGluIHRoZSBkZWZhdWx0IHNlYXJjaCBwYXRoLgorCitESUFfUEFUSCAgICAgICAgICAgICAgID0gCisKKyMgSWYgc2V0IHRvIFlFUyB0aGUgaW5oZXJpdGFuY2UgYW5kIGNvbGxhYm9yYXRpb24gZ3JhcGhzIHdpbGwgaGlkZSBpbmhlcml0YW5jZQorIyBhbmQgdXNhZ2UgcmVsYXRpb25zIGlmIHRoZSB0YXJnZXQgaXMgdW5kb2N1bWVudGVkIG9yIGlzIG5vdCBhIGNsYXNzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitISURFX1VORE9DX1JFTEFUSU9OUyAgID0gWUVTCisKKyMgSWYgeW91IHNldCB0aGUgSEFWRV9ET1QgdGFnIHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBhc3N1bWUgdGhlIGRvdCB0b29sIGlzCisjIGF2YWlsYWJsZSBmcm9tIHRoZSBwYXRoLiBUaGlzIHRvb2wgaXMgcGFydCBvZiBHcmFwaHZpeiAoc2VlOgorIyBodHRwOi8vd3d3LmdyYXBodml6Lm9yZy8pLCBhIGdyYXBoIHZpc3VhbGl6YXRpb24gdG9vbGtpdCBmcm9tIEFUJlQgYW5kIEx1Y2VudAorIyBCZWxsIExhYnMuIFRoZSBvdGhlciBvcHRpb25zIGluIHRoaXMgc2VjdGlvbiBoYXZlIG5vIGVmZmVjdCBpZiB0aGlzIG9wdGlvbiBpcworIyBzZXQgdG8gTk8KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitIQVZFX0RPVCAgICAgICAgICAgICAgID0gTk8KKworIyBUaGUgRE9UX05VTV9USFJFQURTIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGRvdCBpbnZvY2F0aW9ucyBkb3h5Z2VuIGlzIGFsbG93ZWQKKyMgdG8gcnVuIGluIHBhcmFsbGVsLiBXaGVuIHNldCB0byAwIGRveHlnZW4gd2lsbCBiYXNlIHRoaXMgb24gdGhlIG51bWJlciBvZgorIyBwcm9jZXNzb3JzIGF2YWlsYWJsZSBpbiB0aGUgc3lzdGVtLiBZb3UgY2FuIHNldCBpdCBleHBsaWNpdGx5IHRvIGEgdmFsdWUKKyMgbGFyZ2VyIHRoYW4gMCB0byBnZXQgY29udHJvbCBvdmVyIHRoZSBiYWxhbmNlIGJldHdlZW4gQ1BVIGxvYWQgYW5kIHByb2Nlc3NpbmcKKyMgc3BlZWQuCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDMyLCBkZWZhdWx0IHZhbHVlOiAwLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRE9UX05VTV9USFJFQURTICAgICAgICA9IDAKKworIyBXaGVuIHlvdSB3YW50IGEgZGlmZmVyZW50bHkgbG9va2luZyBmb250IGluIHRoZSBkb3QgZmlsZXMgdGhhdCBkb3h5Z2VuCisjIGdlbmVyYXRlcyB5b3UgY2FuIHNwZWNpZnkgdGhlIGZvbnQgbmFtZSB1c2luZyBET1RfRk9OVE5BTUUuIFlvdSBuZWVkIHRvIG1ha2UKKyMgc3VyZSBkb3QgaXMgYWJsZSB0byBmaW5kIHRoZSBmb250LCB3aGljaCBjYW4gYmUgZG9uZSBieSBwdXR0aW5nIGl0IGluIGEKKyMgc3RhbmRhcmQgbG9jYXRpb24gb3IgYnkgc2V0dGluZyB0aGUgRE9URk9OVFBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUgb3IgYnkKKyMgc2V0dGluZyBET1RfRk9OVFBBVEggdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBmb250LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogSGVsdmV0aWNhLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRE9UX0ZPTlROQU1FICAgICAgICAgICA9IEhlbHZldGljYQorCisjIFRoZSBET1RfRk9OVFNJWkUgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgc2l6ZSAoaW4gcG9pbnRzKSBvZiB0aGUgZm9udCBvZgorIyBkb3QgZ3JhcGhzLgorIyBNaW5pbXVtIHZhbHVlOiA0LCBtYXhpbXVtIHZhbHVlOiAyNCwgZGVmYXVsdCB2YWx1ZTogMTAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RfRk9OVFNJWkUgICAgICAgICAgID0gMTAKKworIyBCeSBkZWZhdWx0IGRveHlnZW4gd2lsbCB0ZWxsIGRvdCB0byB1c2UgdGhlIGRlZmF1bHQgZm9udCBhcyBzcGVjaWZpZWQgd2l0aAorIyBET1RfRk9OVE5BTUUuIElmIHlvdSBzcGVjaWZ5IGEgZGlmZmVyZW50IGZvbnQgdXNpbmcgRE9UX0ZPTlROQU1FIHlvdSBjYW4gc2V0CisjIHRoZSBwYXRoIHdoZXJlIGRvdCBjYW4gZmluZCBpdCB1c2luZyB0aGlzIHRhZy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0RPVF9GT05UUEFUSCAgICAgICAgICAgPSAKKworIyBJZiB0aGUgQ0xBU1NfR1JBUEggdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IKKyMgZWFjaCBkb2N1bWVudGVkIGNsYXNzIHNob3dpbmcgdGhlIGRpcmVjdCBhbmQgaW5kaXJlY3QgaW5oZXJpdGFuY2UgcmVsYXRpb25zLgorIyBTZXR0aW5nIHRoaXMgdGFnIHRvIFlFUyB3aWxsIGZvcmNlIHRoZSBDTEFTU19ESUFHUkFNUyB0YWcgdG8gTk8uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitDTEFTU19HUkFQSCAgICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIENPTExBQk9SQVRJT05fR1JBUEggdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYQorIyBncmFwaCBmb3IgZWFjaCBkb2N1bWVudGVkIGNsYXNzIHNob3dpbmcgdGhlIGRpcmVjdCBhbmQgaW5kaXJlY3QgaW1wbGVtZW50YXRpb24KKyMgZGVwZW5kZW5jaWVzIChpbmhlcml0YW5jZSwgY29udGFpbm1lbnQsIGFuZCBjbGFzcyByZWZlcmVuY2VzIHZhcmlhYmxlcykgb2YgdGhlCisjIGNsYXNzIHdpdGggb3RoZXIgZG9jdW1lbnRlZCBjbGFzc2VzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworQ09MTEFCT1JBVElPTl9HUkFQSCAgICA9IFlFUworCisjIElmIHRoZSBHUk9VUF9HUkFQSFMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IKKyMgZ3JvdXBzLCBzaG93aW5nIHRoZSBkaXJlY3QgZ3JvdXBzIGRlcGVuZGVuY2llcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0dST1VQX0dSQVBIUyAgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgVU1MX0xPT0sgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBpbmhlcml0YW5jZSBhbmQKKyMgY29sbGFib3JhdGlvbiBkaWFncmFtcyBpbiBhIHN0eWxlIHNpbWlsYXIgdG8gdGhlIE9NRydzIFVuaWZpZWQgTW9kZWxpbmcKKyMgTGFuZ3VhZ2UuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK1VNTF9MT09LICAgICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBVTUxfTE9PSyB0YWcgaXMgZW5hYmxlZCwgdGhlIGZpZWxkcyBhbmQgbWV0aG9kcyBhcmUgc2hvd24gaW5zaWRlIHRoZQorIyBjbGFzcyBub2RlLiBJZiB0aGVyZSBhcmUgbWFueSBmaWVsZHMgb3IgbWV0aG9kcyBhbmQgbWFueSBub2RlcyB0aGUgZ3JhcGggbWF5CisjIGJlY29tZSB0b28gYmlnIHRvIGJlIHVzZWZ1bC4gVGhlIFVNTF9MSU1JVF9OVU1fRklFTERTIHRocmVzaG9sZCBsaW1pdHMgdGhlCisjIG51bWJlciBvZiBpdGVtcyBmb3IgZWFjaCB0eXBlIHRvIG1ha2UgdGhlIHNpemUgbW9yZSBtYW5hZ2VhYmxlLiBTZXQgdGhpcyB0byAwCisjIGZvciBubyBsaW1pdC4gTm90ZSB0aGF0IHRoZSB0aHJlc2hvbGQgbWF5IGJlIGV4Y2VlZGVkIGJ5IDUwJSBiZWZvcmUgdGhlIGxpbWl0CisjIGlzIGVuZm9yY2VkLiBTbyB3aGVuIHlvdSBzZXQgdGhlIHRocmVzaG9sZCB0byAxMCwgdXAgdG8gMTUgZmllbGRzIG1heSBhcHBlYXIsCisjIGJ1dCBpZiB0aGUgbnVtYmVyIGV4Y2VlZHMgMTUsIHRoZSB0b3RhbCBhbW91bnQgb2YgZmllbGRzIHNob3duIGlzIGxpbWl0ZWQgdG8KKyMgMTAuCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDEwMCwgZGVmYXVsdCB2YWx1ZTogMTAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitVTUxfTElNSVRfTlVNX0ZJRUxEUyAgID0gMTAKKworIyBJZiB0aGUgVEVNUExBVEVfUkVMQVRJT05TIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIGluaGVyaXRhbmNlIGFuZAorIyBjb2xsYWJvcmF0aW9uIGdyYXBocyB3aWxsIHNob3cgdGhlIHJlbGF0aW9ucyBiZXR3ZWVuIHRlbXBsYXRlcyBhbmQgdGhlaXIKKyMgaW5zdGFuY2VzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitURU1QTEFURV9SRUxBVElPTlMgICAgID0gTk8KKworIyBJZiB0aGUgSU5DTFVERV9HUkFQSCwgRU5BQkxFX1BSRVBST0NFU1NJTkcgYW5kIFNFQVJDSF9JTkNMVURFUyB0YWdzIGFyZSBzZXQgdG8KKyMgWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZ3JhcGggZm9yIGVhY2ggZG9jdW1lbnRlZCBmaWxlIHNob3dpbmcgdGhlCisjIGRpcmVjdCBhbmQgaW5kaXJlY3QgaW5jbHVkZSBkZXBlbmRlbmNpZXMgb2YgdGhlIGZpbGUgd2l0aCBvdGhlciBkb2N1bWVudGVkCisjIGZpbGVzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworSU5DTFVERV9HUkFQSCAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBJTkNMVURFRF9CWV9HUkFQSCwgRU5BQkxFX1BSRVBST0NFU1NJTkcgYW5kIFNFQVJDSF9JTkNMVURFUyB0YWdzIGFyZQorIyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZ3JhcGggZm9yIGVhY2ggZG9jdW1lbnRlZCBmaWxlIHNob3dpbmcKKyMgdGhlIGRpcmVjdCBhbmQgaW5kaXJlY3QgaW5jbHVkZSBkZXBlbmRlbmNpZXMgb2YgdGhlIGZpbGUgd2l0aCBvdGhlciBkb2N1bWVudGVkCisjIGZpbGVzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworSU5DTFVERURfQllfR1JBUEggICAgICA9IFlFUworCisjIElmIHRoZSBDQUxMX0dSQVBIIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgY2FsbAorIyBkZXBlbmRlbmN5IGdyYXBoIGZvciBldmVyeSBnbG9iYWwgZnVuY3Rpb24gb3IgY2xhc3MgbWV0aG9kLgorIworIyBOb3RlIHRoYXQgZW5hYmxpbmcgdGhpcyBvcHRpb24gd2lsbCBzaWduaWZpY2FudGx5IGluY3JlYXNlIHRoZSB0aW1lIG9mIGEgcnVuLgorIyBTbyBpbiBtb3N0IGNhc2VzIGl0IHdpbGwgYmUgYmV0dGVyIHRvIGVuYWJsZSBjYWxsIGdyYXBocyBmb3Igc2VsZWN0ZWQKKyMgZnVuY3Rpb25zIG9ubHkgdXNpbmcgdGhlIFxjYWxsZ3JhcGggY29tbWFuZC4gRGlzYWJsaW5nIGEgY2FsbCBncmFwaCBjYW4gYmUKKyMgYWNjb21wbGlzaGVkIGJ5IG1lYW5zIG9mIHRoZSBjb21tYW5kIFxoaWRlY2FsbGdyYXBoLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitDQUxMX0dSQVBIICAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgQ0FMTEVSX0dSQVBIIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgY2FsbGVyCisjIGRlcGVuZGVuY3kgZ3JhcGggZm9yIGV2ZXJ5IGdsb2JhbCBmdW5jdGlvbiBvciBjbGFzcyBtZXRob2QuCisjCisjIE5vdGUgdGhhdCBlbmFibGluZyB0aGlzIG9wdGlvbiB3aWxsIHNpZ25pZmljYW50bHkgaW5jcmVhc2UgdGhlIHRpbWUgb2YgYSBydW4uCisjIFNvIGluIG1vc3QgY2FzZXMgaXQgd2lsbCBiZSBiZXR0ZXIgdG8gZW5hYmxlIGNhbGxlciBncmFwaHMgZm9yIHNlbGVjdGVkCisjIGZ1bmN0aW9ucyBvbmx5IHVzaW5nIHRoZSBcY2FsbGVyZ3JhcGggY29tbWFuZC4gRGlzYWJsaW5nIGEgY2FsbGVyIGdyYXBoIGNhbiBiZQorIyBhY2NvbXBsaXNoZWQgYnkgbWVhbnMgb2YgdGhlIGNvbW1hbmQgXGhpZGVjYWxsZXJncmFwaC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworQ0FMTEVSX0dSQVBIICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEdSQVBISUNBTF9ISUVSQVJDSFkgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ3JhcGhpY2FsCisjIGhpZXJhcmNoeSBvZiBhbGwgY2xhc3NlcyBpbnN0ZWFkIG9mIGEgdGV4dHVhbCBvbmUuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitHUkFQSElDQUxfSElFUkFSQ0hZICAgID0gWUVTCisKKyMgSWYgdGhlIERJUkVDVE9SWV9HUkFQSCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBzaG93IHRoZQorIyBkZXBlbmRlbmNpZXMgYSBkaXJlY3RvcnkgaGFzIG9uIG90aGVyIGRpcmVjdG9yaWVzIGluIGEgZ3JhcGhpY2FsIHdheS4gVGhlCisjIGRlcGVuZGVuY3kgcmVsYXRpb25zIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSAjaW5jbHVkZSByZWxhdGlvbnMgYmV0d2VlbiB0aGUKKyMgZmlsZXMgaW4gdGhlIGRpcmVjdG9yaWVzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRElSRUNUT1JZX0dSQVBIICAgICAgICA9IFlFUworCisjIFRoZSBET1RfSU1BR0VfRk9STUFUIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIGltYWdlIGZvcm1hdCBvZiB0aGUgaW1hZ2VzCisjIGdlbmVyYXRlZCBieSBkb3QuIEZvciBhbiBleHBsYW5hdGlvbiBvZiB0aGUgaW1hZ2UgZm9ybWF0cyBzZWUgdGhlIHNlY3Rpb24KKyMgb3V0cHV0IGZvcm1hdHMgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIGRvdCB0b29sIChHcmFwaHZpeiAoc2VlOgorIyBodHRwOi8vd3d3LmdyYXBodml6Lm9yZy8pKS4KKyMgTm90ZTogSWYgeW91IGNob29zZSBzdmcgeW91IG5lZWQgdG8gc2V0IEhUTUxfRklMRV9FWFRFTlNJT04gdG8geGh0bWwgaW4gb3JkZXIKKyMgdG8gbWFrZSB0aGUgU1ZHIGZpbGVzIHZpc2libGUgaW4gSUUgOSsgKG90aGVyIGJyb3dzZXJzIGRvIG5vdCBoYXZlIHRoaXMKKyMgcmVxdWlyZW1lbnQpLgorIyBQb3NzaWJsZSB2YWx1ZXMgYXJlOiBwbmcsIGpwZywgZ2lmLCBzdmcsIHBuZzpnZCwgcG5nOmdkOmdkLCBwbmc6Y2Fpcm8sCisjIHBuZzpjYWlybzpnZCwgcG5nOmNhaXJvOmNhaXJvLCBwbmc6Y2Fpcm86Z2RpcGx1cywgcG5nOmdkaXBsdXMgYW5kCisjIHBuZzpnZGlwbHVzOmdkaXBsdXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBwbmcuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RfSU1BR0VfRk9STUFUICAgICAgID0gcG5nCisKKyMgSWYgRE9UX0lNQUdFX0ZPUk1BVCBpcyBzZXQgdG8gc3ZnLCB0aGVuIHRoaXMgb3B0aW9uIGNhbiBiZSBzZXQgdG8gWUVTIHRvCisjIGVuYWJsZSBnZW5lcmF0aW9uIG9mIGludGVyYWN0aXZlIFNWRyBpbWFnZXMgdGhhdCBhbGxvdyB6b29taW5nIGFuZCBwYW5uaW5nLgorIworIyBOb3RlIHRoYXQgdGhpcyByZXF1aXJlcyBhIG1vZGVybiBicm93c2VyIG90aGVyIHRoYW4gSW50ZXJuZXQgRXhwbG9yZXIuIFRlc3RlZAorIyBhbmQgd29ya2luZyBhcmUgRmlyZWZveCwgQ2hyb21lLCBTYWZhcmksIGFuZCBPcGVyYS4KKyMgTm90ZTogRm9yIElFIDkrIHlvdSBuZWVkIHRvIHNldCBIVE1MX0ZJTEVfRVhURU5TSU9OIHRvIHhodG1sIGluIG9yZGVyIHRvIG1ha2UKKyMgdGhlIFNWRyBmaWxlcyB2aXNpYmxlLiBPbGRlciB2ZXJzaW9ucyBvZiBJRSBkbyBub3QgaGF2ZSBTVkcgc3VwcG9ydC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworSU5URVJBQ1RJVkVfU1ZHICAgICAgICA9IE5PCisKKyMgVGhlIERPVF9QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBwYXRoIHdoZXJlIHRoZSBkb3QgdG9vbCBjYW4gYmUKKyMgZm91bmQuIElmIGxlZnQgYmxhbmssIGl0IGlzIGFzc3VtZWQgdGhlIGRvdCB0b29sIGNhbiBiZSBmb3VuZCBpbiB0aGUgcGF0aC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0RPVF9QQVRIICAgICAgICAgICAgICAgPSAKKworIyBUaGUgRE9URklMRV9ESVJTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGRpcmVjdG9yaWVzIHRoYXQKKyMgY29udGFpbiBkb3QgZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gKHNlZSB0aGUgXGRvdGZpbGUKKyMgY29tbWFuZCkuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RGSUxFX0RJUlMgICAgICAgICAgID0gCisKKyMgVGhlIE1TQ0ZJTEVfRElSUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBkaXJlY3RvcmllcyB0aGF0CisjIGNvbnRhaW4gbXNjIGZpbGVzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uIChzZWUgdGhlIFxtc2NmaWxlCisjIGNvbW1hbmQpLgorCitNU0NGSUxFX0RJUlMgICAgICAgICAgID0gCisKKyMgVGhlIERJQUZJTEVfRElSUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBkaXJlY3RvcmllcyB0aGF0CisjIGNvbnRhaW4gZGlhIGZpbGVzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uIChzZWUgdGhlIFxkaWFmaWxlCisjIGNvbW1hbmQpLgorCitESUFGSUxFX0RJUlMgICAgICAgICAgID0gCisKKyMgV2hlbiB1c2luZyBwbGFudHVtbCwgdGhlIFBMQU5UVU1MX0pBUl9QQVRIIHRhZyBzaG91bGQgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZQorIyBwYXRoIHdoZXJlIGphdmEgY2FuIGZpbmQgdGhlIHBsYW50dW1sLmphciBmaWxlLiBJZiBsZWZ0IGJsYW5rLCBpdCBpcyBhc3N1bWVkCisjIFBsYW50VU1MIGlzIG5vdCB1c2VkIG9yIGNhbGxlZCBkdXJpbmcgYSBwcmVwcm9jZXNzaW5nIHN0ZXAuIERveHlnZW4gd2lsbAorIyBnZW5lcmF0ZSBhIHdhcm5pbmcgd2hlbiBpdCBlbmNvdW50ZXJzIGEgXHN0YXJ0dW1sIGNvbW1hbmQgaW4gdGhpcyBjYXNlIGFuZAorIyB3aWxsIG5vdCBnZW5lcmF0ZSBvdXRwdXQgZm9yIHRoZSBkaWFncmFtLgorCitQTEFOVFVNTF9KQVJfUEFUSCAgICAgID0gCisKKyMgV2hlbiB1c2luZyBwbGFudHVtbCwgdGhlIHNwZWNpZmllZCBwYXRocyBhcmUgc2VhcmNoZWQgZm9yIGZpbGVzIHNwZWNpZmllZCBieQorIyB0aGUgIWluY2x1ZGUgc3RhdGVtZW50IGluIGEgcGxhbnR1bWwgYmxvY2suCisKK1BMQU5UVU1MX0lOQ0xVREVfUEFUSCAgPSAKKworIyBUaGUgRE9UX0dSQVBIX01BWF9OT0RFUyB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBub2RlcworIyB0aGF0IHdpbGwgYmUgc2hvd24gaW4gdGhlIGdyYXBoLiBJZiB0aGUgbnVtYmVyIG9mIG5vZGVzIGluIGEgZ3JhcGggYmVjb21lcworIyBsYXJnZXIgdGhhbiB0aGlzIHZhbHVlLCBkb3h5Z2VuIHdpbGwgdHJ1bmNhdGUgdGhlIGdyYXBoLCB3aGljaCBpcyB2aXN1YWxpemVkCisjIGJ5IHJlcHJlc2VudGluZyBhIG5vZGUgYXMgYSByZWQgYm94LiBOb3RlIHRoYXQgZG94eWdlbiBpZiB0aGUgbnVtYmVyIG9mIGRpcmVjdAorIyBjaGlsZHJlbiBvZiB0aGUgcm9vdCBub2RlIGluIGEgZ3JhcGggaXMgYWxyZWFkeSBsYXJnZXIgdGhhbgorIyBET1RfR1JBUEhfTUFYX05PREVTIHRoZW4gdGhlIGdyYXBoIHdpbGwgbm90IGJlIHNob3duIGF0IGFsbC4gQWxzbyBub3RlIHRoYXQKKyMgdGhlIHNpemUgb2YgYSBncmFwaCBjYW4gYmUgZnVydGhlciByZXN0cmljdGVkIGJ5IE1BWF9ET1RfR1JBUEhfREVQVEguCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDEwMDAwLCBkZWZhdWx0IHZhbHVlOiA1MC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0RPVF9HUkFQSF9NQVhfTk9ERVMgICAgPSA1MAorCisjIFRoZSBNQVhfRE9UX0dSQVBIX0RFUFRIIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIG1heGltdW0gZGVwdGggb2YgdGhlIGdyYXBocworIyBnZW5lcmF0ZWQgYnkgZG90LiBBIGRlcHRoIHZhbHVlIG9mIDMgbWVhbnMgdGhhdCBvbmx5IG5vZGVzIHJlYWNoYWJsZSBmcm9tIHRoZQorIyByb290IGJ5IGZvbGxvd2luZyBhIHBhdGggdmlhIGF0IG1vc3QgMyBlZGdlcyB3aWxsIGJlIHNob3duLiBOb2RlcyB0aGF0IGxheQorIyBmdXJ0aGVyIGZyb20gdGhlIHJvb3Qgbm9kZSB3aWxsIGJlIG9taXR0ZWQuIE5vdGUgdGhhdCBzZXR0aW5nIHRoaXMgb3B0aW9uIHRvIDEKKyMgb3IgMiBtYXkgZ3JlYXRseSByZWR1Y2UgdGhlIGNvbXB1dGF0aW9uIHRpbWUgbmVlZGVkIGZvciBsYXJnZSBjb2RlIGJhc2VzLiBBbHNvCisjIG5vdGUgdGhhdCB0aGUgc2l6ZSBvZiBhIGdyYXBoIGNhbiBiZSBmdXJ0aGVyIHJlc3RyaWN0ZWQgYnkKKyMgRE9UX0dSQVBIX01BWF9OT0RFUy4gVXNpbmcgYSBkZXB0aCBvZiAwIG1lYW5zIG5vIGRlcHRoIHJlc3RyaWN0aW9uLgorIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAxMDAwLCBkZWZhdWx0IHZhbHVlOiAwLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworTUFYX0RPVF9HUkFQSF9ERVBUSCAgICA9IDAKKworIyBTZXQgdGhlIERPVF9UUkFOU1BBUkVOVCB0YWcgdG8gWUVTIHRvIGdlbmVyYXRlIGltYWdlcyB3aXRoIGEgdHJhbnNwYXJlbnQKKyMgYmFja2dyb3VuZC4gVGhpcyBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LCBiZWNhdXNlIGRvdCBvbiBXaW5kb3dzIGRvZXMgbm90IHNlZW0KKyMgdG8gc3VwcG9ydCB0aGlzIG91dCBvZiB0aGUgYm94LgorIworIyBXYXJuaW5nOiBEZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtIHVzZWQsIGVuYWJsaW5nIHRoaXMgb3B0aW9uIG1heSBsZWFkIHRvCisjIGJhZGx5IGFudGktYWxpYXNlZCBsYWJlbHMgb24gdGhlIGVkZ2VzIG9mIGEgZ3JhcGggKGkuZS4gdGhleSBiZWNvbWUgaGFyZCB0bworIyByZWFkKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRE9UX1RSQU5TUEFSRU5UICAgICAgICA9IE5PCisKKyMgU2V0IHRoZSBET1RfTVVMVElfVEFSR0VUUyB0YWcgdG8gWUVTIHRvIGFsbG93IGRvdCB0byBnZW5lcmF0ZSBtdWx0aXBsZSBvdXRwdXQKKyMgZmlsZXMgaW4gb25lIHJ1biAoaS5lLiBtdWx0aXBsZSAtbyBhbmQgLVQgb3B0aW9ucyBvbiB0aGUgY29tbWFuZCBsaW5lKS4gVGhpcworIyBtYWtlcyBkb3QgcnVuIGZhc3RlciwgYnV0IHNpbmNlIG9ubHkgbmV3ZXIgdmVyc2lvbnMgb2YgZG90ICg+MS44LjEwKSBzdXBwb3J0CisjIHRoaXMsIHRoaXMgZmVhdHVyZSBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RfTVVMVElfVEFSR0VUUyAgICAgID0gTk8KKworIyBJZiB0aGUgR0VORVJBVEVfTEVHRU5EIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGxlZ2VuZCBwYWdlCisjIGV4cGxhaW5pbmcgdGhlIG1lYW5pbmcgb2YgdGhlIHZhcmlvdXMgYm94ZXMgYW5kIGFycm93cyBpbiB0aGUgZG90IGdlbmVyYXRlZAorIyBncmFwaHMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitHRU5FUkFURV9MRUdFTkQgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIERPVF9DTEVBTlVQIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgcmVtb3ZlIHRoZSBpbnRlcm1lZGlhdGUgZG90CisjIGZpbGVzIHRoYXQgYXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIHZhcmlvdXMgZ3JhcGhzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRE9UX0NMRUFOVVAgICAgICAgICAgICA9IFlFUwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWMyL2luY2x1ZGUvQzIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMi9pbmNsdWRlL0MyLmgKaW5kZXggMDFkMTM0MS4uYTAxZDY3NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWMyL2luY2x1ZGUvQzIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlYzIvaW5jbHVkZS9DMi5oCkBAIC0xMjgsNiArMTI4LDcgQEAKICAgICBUSU1FRF9PVVQgICAgICAgICAgID0gLUVUSU1FRE9VVCwKICAgICBVTktOT1dOX0VSUk9SICAgICAgID0gLUVGQVVMVCwKICAgICBVTktOT1dOX1RSQU5TQUNUSU9OID0gLUVCQURNU0csCisgICAgV09VTERfQkxPQ0sgICAgICAgICA9IC1FV09VTERCTE9DSywKICNlbmRpZgogCiAgICAgQzJfT0sgICAgICAgID0gT0ssICAgICAgICAgICAgICAgICAgIC8vLzwgb3BlcmF0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkKQEAgLTE0MSw2ICsxNDIsNyBAQAogICAgIEMyX0RVUExJQ0FURSA9IEFMUkVBRFlfRVhJU1RTLCAgICAgICAvLy88IG9iamVjdCBhbHJlYWR5IGV4aXN0cwogICAgIEMyX05PVF9GT1VORCA9IE5BTUVfTk9UX0ZPVU5ELCAgICAgICAvLy88IG9iamVjdCBub3QgZm91bmQKICAgICBDMl9CQURfU1RBVEUgPSBJTlZBTElEX09QRVJBVElPTiwgICAgLy8vPCBvcGVyYXRpb24gaXMgbm90IHBlcm1pdHRlZCBpbiB0aGUgY3VycmVudCBzdGF0ZQorICAgIEMyX0JMT0NLSU5HICA9IFdPVUxEX0JMT0NLLCAgICAgICAgICAvLy88IG9wZXJhdGlvbiB3b3VsZCBibG9jayBidXQgYmxvY2tpbmcgaXMgbm90IHBlcm1pdHRlZAogCiAgICAgLy8gYmFkIGVudmlyb25tZW50CiAgICAgQzJfTk9fTUVNT1JZID0gTk9fTUVNT1JZLCAgICAgICAgICAgIC8vLzwgbm90IGVub3VnaCBtZW1vcnkgdG8gY29tcGxldGUgb3BlcmF0aW9uCkBAIC0xNTYsNiArMTU4LDI0IEBACiAgICAgQzJfTk9fSU5JVCAgID0gTk9fSU5JVCwgICAgICAgICAgICAgIC8vLzwgc3RhdHVzIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZAogfTsKIAorLyoqCisgKiBUeXBlIHRoYXQgZGVzY3JpYmVzIHRoZSBkZXNpcmVkIGJsb2NraW5nIGJlaGF2aW9yIGZvciB2YXJpYWJsZSBibG9ja2luZyBjYWxscy4gQmxvY2tpbmcgaW4gdGhpcworICogQVBJIGlzIHVzZWQgaW4gYSBzb21ld2hhdCBtb2RpZmllZCBtZWFuaW5nIHN1Y2ggdGhhdCBvcGVyYXRpb25zIHRoYXQgbWVyZWx5IHVwZGF0ZSB2YXJpYWJsZXMKKyAqIHByb3RlY3RlZCBieSBtdXRleGVzIGFyZSBzdGlsbCBjb25zaWRlcmVkICJub24tYmxvY2tpbmciIChhbHdheXMgdXNlZCBpbiBxdW90ZXMpLgorICovCitlbnVtIGMyX2Jsb2NraW5nX3QgOiBpbnQzMl90IHsKKyAgICAvKioKKyAgICAgKiBUaGUgb3BlcmF0aW9uIFNIQUxMIGJlICJub24tYmxvY2tpbmciLiBUaGlzIG1lYW5zIHRoYXQgaXQgc2hhbGwgbm90IHBlcmZvcm0gYW55IGZpbGUKKyAgICAgKiBvcGVyYXRpb25zLCBvciBjYWxsL3dhaXQgb24gb3RoZXIgcHJvY2Vzc2VzLiBJdCBtYXkgdXNlIGEgcHJvdGVjdGVkIHJlZ2lvbiBhcyBsb25nIGFzIHRoZQorICAgICAqIG11dGV4IGlzIG5ldmVyIHVzZWQgdG8gcHJvdGVjdCBjb2RlIHRoYXQgaXMgb3RoZXJ3aXNlICJtYXkgYmxvY2siLgorICAgICAqLworICAgIEMyX0RPTlRfQkxPQ0sgPSBmYWxzZSwKKyAgICAvKioKKyAgICAgKiBUaGUgb3BlcmF0aW9uIE1BWSBiZSB0ZW1wb3JhcmlseSBibG9ja2luZy4KKyAgICAgKi8KKyAgICBDMl9NQVlfQkxPQ0sgPSB0cnVlLAorfTsKKwogLy8vIEB9CiAKIC8vLyBcZGVmZ3JvdXAgdXRpbHMgVXRpbGl0aWVzCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlYzIvaW5jbHVkZS9DMkNvbXBvbmVudC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWMyL2luY2x1ZGUvQzJDb21wb25lbnQuaAppbmRleCBhNTU1YjM1Li4zOGQ1NDVlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlYzIvaW5jbHVkZS9DMkNvbXBvbmVudC5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMi9pbmNsdWRlL0MyQ29tcG9uZW50LmgKQEAgLTM3LDE3ICszNywxNyBAQAogY2xhc3MgQzJDb21wb25lbnQ7CiAKIHN0cnVjdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkgewotICAgIGVudW0gVHlwZSA6IHVpbnQzMl90IHsKKyAgICBlbnVtIHR5cGVfdCA6IHVpbnQzMl90IHsKICAgICAgICAgUE9TU0lCTEUsIC8vLzwgcXVlcnkgYWxsIHBvc3NpYmxlIHZhbHVlcyByZWdhcmRsZXNzIG9mIG90aGVyIHNldHRpbmdzCiAgICAgICAgIENVUlJFTlQsICAvLy88IHF1ZXJ5IGN1cnJlbnRseSBwb3NzaWJsZSB2YWx1ZXMgZ2l2ZW4gZGVwZW5kZW50IHNldHRpbmdzCiAgICAgfTsKIAogICAgIGNvbnN0IEMyUGFyYW1GaWVsZCBmaWVsZDsKLSAgICBjb25zdCBUeXBlIHR5cGU7CisgICAgY29uc3QgdHlwZV90IHR5cGU7CiAgICAgYzJfc3RhdHVzX3Qgc3RhdHVzOwogICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgdmFsdWVzOwogCi0gICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5KGNvbnN0IEMyUGFyYW1GaWVsZCAmZmllbGRfLCBUeXBlIHR5cGVfKQorICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeShjb25zdCBDMlBhcmFtRmllbGQgJmZpZWxkXywgdHlwZV90IHR5cGVfKQogICAgICAgICA6IGZpZWxkKGZpZWxkXyksIHR5cGUodHlwZV8pLCBzdGF0dXMoQzJfTk9fSU5JVCkgeyB9CiAKICAgICBzdGF0aWMgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5JiYKQEAgLTc4LDggKzc4LDggQEAKICAgICAgKiBUaGlzIGlzIGEgdW5pcXVlIG5hbWUgZm9yIHRoaXMgY29tcG9uZW50IG9yIGNvbXBvbmVudCBpbnRlcmZhY2UgJ2NsYXNzJzsgaG93ZXZlciwgbXVsdGlwbGUKICAgICAgKiBpbnN0YW5jZXMgb2YgdGhpcyBjb21wb25lbnQgU0hBTEwgaGF2ZSB0aGUgc2FtZSBuYW1lLgogICAgICAqCi0gICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gYW55IHN0YXRlLiBUaGlzIGNhbGwgZG9lcyBub3QgY2hhbmdlIHRoZSBzdGF0ZSBub3IgdGhlCi0gICAgICogaW50ZXJuYWwgc3RhdGVzIG9mIHRoZSBjb21wb25lbnQuCisgICAgICogV2hlbiBhdHRhY2hlZCB0byBhIGNvbXBvbmVudCwgdGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gYW55IGNvbXBvbmVudCBzdGF0ZS4KKyAgICAgKiBUaGlzIGNhbGwgZG9lcyBub3QgY2hhbmdlIHRoZSBzdGF0ZSBub3IgdGhlIGludGVybmFsIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGNvbXBvbmVudC4KICAgICAgKgogICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMW1zLgogICAgICAqCkBAIC05Miw4ICs5Miw4IEBACiAgICAgICogUmV0dXJucyBhIHVuaXF1ZSBJRCBmb3IgdGhpcyBjb21wb25lbnQgb3IgaW50ZXJmYWNlIG9iamVjdC4KICAgICAgKiBUaGlzIElEIGlzIHVzZWQgYXMgd29yayB0YXJnZXRzLCB1bmlxdWUgd29yayBJRHMsIGFuZCB3aGVuIGNvbmZpZ3VyaW5nIHR1bm5lbGluZy4KICAgICAgKgotICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIGFueSBzdGF0ZS4gVGhpcyBjYWxsIGRvZXMgbm90IGNoYW5nZSB0aGUgc3RhdGUgbm9yIHRoZQotICAgICAqIGludGVybmFsIHN0YXRlcyBvZiB0aGUgY29tcG9uZW50LgorICAgICAqIFdoZW4gYXR0YWNoZWQgdG8gYSBjb21wb25lbnQsIHRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIGFueSBjb21wb25lbnQgc3RhdGUuCisgICAgICogVGhpcyBjYWxsIGRvZXMgbm90IGNoYW5nZSB0aGUgc3RhdGUgbm9yIHRoZSBpbnRlcm5hbCBjb25maWd1cmF0aW9uIG9mIHRoZSBjb21wb25lbnQuCiAgICAgICoKICAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDFtcy4KICAgICAgKgpAQCAtMTA0LDExNSArMTA0LDExNSBAQAogICAgIC8qKgogICAgICAqIFF1ZXJpZXMgYSBzZXQgb2YgcGFyYW1ldGVycyBmcm9tIHRoZSBjb21wb25lbnQgb3IgaW50ZXJmYWNlIG9iamVjdC4KICAgICAgKiBRdWVyeWluZyBpcyBwZXJmb3JtZWQgYXQgYmVzdCBlZmZvcnQ6IHRoZSBjb21wb25lbnQgU0hBTEwgcXVlcnkgYWxsIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIGFuZAotICAgICAqIHNraXAgdW5zdXBwb3J0ZWQgb25lcywgb3IgaGVhcCBhbGxvY2F0ZWQgcGFyYW1ldGVycyB0aGF0IGNvdWxkIG5vdCBiZSBhbGxvY2F0ZWQuIEFueSBlcnJvcnMKLSAgICAgKiBhcmUgY29tbXVuaWNhdGVkIGluIHRoZSByZXR1cm4gdmFsdWUuIEFkZGl0aW9uYWxseSwgcHJlYWxsb2NhdGVkIChlLmcuIHN0YWNrKSBwYXJhbWV0ZXJzIHRoYXQKLSAgICAgKiBjb3VsZCBub3QgYmUgcXVlcmllZCBhcmUgaW52YWxpZGF0ZWQuIFBhcmFtZXRlcnMgdG8gYmUgYWxsb2NhdGVkIG9uIHRoZSBoZWFwIGFyZSBvbWl0dGVkIGZyb20KLSAgICAgKiB0aGUgcmVzdWx0LgorICAgICAqIHNraXAgdW5zdXBwb3J0ZWQgb25lcywgaGVhcCBhbGxvY2F0ZWQgcGFyYW1ldGVycyB0aGF0IGNvdWxkIG5vdCBiZSBhbGxvY2F0ZWQgb3IgcGFyYW1ldGVycworICAgICAqIHRoYXQgY291bGQgbm90IGJlIHF1ZXJpZWQgd2l0aG91dCBibG9ja2luZy4gQW55IGVycm9ycyBhcmUgY29tbXVuaWNhdGVkIGluIHRoZSByZXR1cm4gdmFsdWUuCisgICAgICogQWRkaXRpb25hbGx5LCBwcmVhbGxvY2F0ZWQgKGUuZy4gc3RhY2spIHBhcmFtZXRlcnMgdGhhdCBjb3VsZCBub3QgYmUgcXVlcmllZCBhcmUgaW52YWxpZGF0ZWQuCisgICAgICogSW52YWxpZCBvciBibG9ja2luZyBwYXJhbWV0ZXJzIHRvIGJlIGFsbG9jYXRlZCBvbiB0aGUgaGVhcCBhcmUgb21pdHRlZCBmcm9tIHRoZSByZXN1bHQuCiAgICAgICoKICAgICAgKiBcbm90ZSBQYXJhbWV0ZXIgdmFsdWVzIGRvIG5vdCBkZXBlbmQgb24gdGhlIG9yZGVyIG9mIHF1ZXJ5LgogICAgICAqCiAgICAgICogXHRvZG8gVGhpcyBtZXRob2QgY2Fubm90IGJlIHVzZWQgdG8gcXVlcnkgaW5mby1idWZmZXJzLiBJcyB0aGF0IGEgcHJvYmxlbT8KICAgICAgKgotICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIGFueSBzdGF0ZS4gVGhpcyBjYWxsIGRvZXMgbm90IGNoYW5nZSB0aGUgc3RhdGUgbm9yIHRoZQotICAgICAqIGludGVybmFsIHN0YXRlcyBvZiB0aGUgY29tcG9uZW50LgorICAgICAqIFdoZW4gYXR0YWNoZWQgdG8gYSBjb21wb25lbnQsIHRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIGFueSBjb21wb25lbnQgc3RhdGUgZXhjZXB0CisgICAgICogcmVsZWFzZWQuCisgICAgICogVGhpcyBjYWxsIGRvZXMgbm90IGNoYW5nZSB0aGUgc3RhdGUgbm9yIHRoZSBpbnRlcm5hbCBjb25maWd1cmF0aW9uIG9mIHRoZSBjb21wb25lbnQuCiAgICAgICoKLSAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDFtcy4KKyAgICAgKiBUaGlzIG1ldGhvZCBoYXMgYSB2YXJpYWJsZSBibG9ja2luZyBiZWhhdmlvciBiYXNlZCBvbiBzdGF0ZS4KKyAgICAgKiBJbiB0aGUgc3RvcHBlZCBzdGF0ZSB0aGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDFtcy4KKyAgICAgKiBJbiB0aGUgcnVubmluZyBzdGF0ZXMgdGhpcyBtZXRob2QgbWF5IGJlIG1vbWVudGFyaWx5IGJsb2NraW5nLCBidXQgTVVTVCByZXR1cm4gd2l0aGluIDVtcy4KICAgICAgKgotICAgICAqIFxwYXJhbVtpbixvdXRdIHN0YWNrUGFyYW1zICAgYSBsaXN0IG9mIHBhcmFtcyBxdWVyaWVkLiBUaGVzZSBhcmUgaW5pdGlhbGl6ZWQgc3BlY2lmaWMgdG8gZWFjaAotICAgICAqICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmc7IGUuZy4gc2l6ZSBhbmQgaW5kZXggYXJlIHNldCBhbmQgcmVzdCBvZiB0aGUgbWVtYmVycyBhcmUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBjbGVhcmVkLgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIFxub3RlIEZsZXhpYmxlIHNldHRpbmdzIHRoYXQgYXJlIG9mIGluY29ycmVjdCBzaXplIHdpbGwgYmUgaW52YWxpZGF0ZWQuCi0gICAgICogXHBhcmFtW2luXSBoZWFwUGFyYW1JbmRpY2VzIGEgdmVjdG9yIG9mIHBhcmFtIGluZGljZXMgZm9yIHBhcmFtcyB0byBiZSBxdWVyaWVkIGFuZCByZXR1cm5lZCBvbiB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBoZWFwLiBUaGVzZSBwYXJhbWV0ZXJzIHdpbGwgYmUgcmV0dXJuZWQgaW4gaGVhcFBhcmFtcy4gVW5zdXBwb3J0ZWQgcGFyYW0KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBpbmRpY2VzIHdpbGwgYmUgaWdub3JlZC4KLSAgICAgKiBccGFyYW1bb3V0XSBoZWFwUGFyYW1zICAgIGEgbGlzdCBvZiBwYXJhbXMgd2hlcmUgdG8gd2hpY2ggdGhlIHN1cHBvcnRlZCBoZWFwIHBhcmFtZXRlcnMgd2lsbCBiZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZGVkIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhciBpbiBoZWFwUGFyYW1JbmRpY2VzLgorICAgICAqIFxwYXJhbVtpbixvdXRdIHN0YWNrUGFyYW1zICBhIGxpc3Qgb2YgcGFyYW1zIHF1ZXJpZWQuIFRoZXNlIGFyZSBpbml0aWFsaXplZCBzcGVjaWZpYyB0byBlYWNoCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmc7IGUuZy4gc2l6ZSBhbmQgaW5kZXggYXJlIHNldCBhbmQgcmVzdCBvZiB0aGUgbWVtYmVycyBhcmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJlZC4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5vdGUgRmxleGlibGUgc2V0dGluZ3MgdGhhdCBhcmUgb2YgaW5jb3JyZWN0IHNpemUgd2lsbCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlZC4KKyAgICAgKiBccGFyYW1baW5dIGhlYXBQYXJhbUluZGljZXMgYSB2ZWN0b3Igb2YgcGFyYW0gaW5kaWNlcyBmb3IgcGFyYW1zIHRvIGJlIHF1ZXJpZWQgYW5kIHJldHVybmVkCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uIHRoZSBoZWFwLiBUaGVzZSBwYXJhbWV0ZXJzIHdpbGwgYmUgcmV0dXJuZWQgaW4gaGVhcFBhcmFtcy4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5zdXBwb3J0ZWQgcGFyYW0gaW5kaWNlcyB3aWxsIGJlIGlnbm9yZWQuCisgICAgICogXHBhcmFtW2luXSBtYXlCbG9jayAgICAgICAgIGlmIHRydWUgKEMyX01BWV9CTE9DSyksIGltcGxlbWVudGF0aW9uIG1heSBtb21lbnRhcmlseSBibG9jay4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlIChDMl9ET05UX0JMT0NLKSwgaXQgbXVzdCBiZSAibm9uLWJsb2NraW5nIi4KKyAgICAgKiBccGFyYW1bb3V0XSBoZWFwUGFyYW1zICAgICAgYSBsaXN0IG9mIHBhcmFtcyB3aGVyZSB0byB3aGljaCB0aGUgc3VwcG9ydGVkIGhlYXAgcGFyYW1ldGVycworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGFwcGVuZGVkIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhciBpbiBoZWFwUGFyYW1JbmRpY2VzLgogICAgICAqCiAgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgYWxsIHBhcmFtZXRlcnMgY291bGQgYmUgcXVlcmllZAogICAgICAqIFxyZXR2YWwgQzJfQkFEX0lOREVYIGFsbCBzdXBwb3J0ZWQgcGFyYW1ldGVycyBjb3VsZCBiZSBxdWVyaWVkLCBidXQgc29tZSBwYXJhbWV0ZXJzIHdlcmUgbm90CiAgICAgICogICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkCisgICAgICogXHJldHZhbCBDMl9CQURfU1RBVEUgd2hlbiBjYWxsZWQgaW4gdGhlIHJlbGVhc2VkIGNvbXBvbmVudCBzdGF0ZSAodXNlciBlcnJvcikKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodGhpcyBlcnJvciBjb2RlIGlzIG9ubHkgYWxsb3dlZCBmb3IgaW50ZXJmYWNlcyBjb25uZWN0ZWQgdG8gY29tcG9uZW50cykKICAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBjb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBhIHN1cHBvcnRlZCBwYXJhbWV0ZXIKKyAgICAgKiBccmV0dmFsIEMyX0JMT0NLSU5HICB0aGUgb3BlcmF0aW9uIG11c3QgYmxvY2sgdG8gY29tcGxldGUgYnV0IG1heUJsb2NrIGlzIGZhbHNlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHRoaXMgZXJyb3IgY29kZSBpcyBvbmx5IGFsbG93ZWQgZm9yIGludGVyZmFjZXMgY29ubmVjdGVkIHRvIGNvbXBvbmVudHMpCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgY291bGQgbm90IHF1ZXJ5IHRoZSBwYXJhbWV0ZXJzIHdpdGhpbiB0aGUgdGltZSBsaW1pdCAodW5leHBlY3RlZCkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodGhpcyBlcnJvciBjb2RlIGlzIG9ubHkgYWxsb3dlZCBmb3IgaW50ZXJmYWNlcyBjb25uZWN0ZWQgdG8gY29tcG9uZW50cworICAgICAqICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBydW5uaW5nIHN0YXRlKQogICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIHF1ZXJ5aW5nIG9mIHRoZSBwYXJhbWV0ZXJzCiAgICAgICogICAgICAgICAgICAgICAgICAgICAgKHVuZXhwZWN0ZWQpCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHRoaXMgZXJyb3IgY29kZSBpcyBvbmx5IGFsbG93ZWQgZm9yIGludGVyZmFjZXMgY29ubmVjdGVkIHRvIGNvbXBvbmVudHMpCiAgICAgICovCi0gICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeV9uYigKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5X3ZiKAogICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKiBjb25zdD4gJnN0YWNrUGFyYW1zLAogICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmhlYXBQYXJhbUluZGljZXMsCisgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCiAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4qIGNvbnN0IGhlYXBQYXJhbXMpIGNvbnN0ID0gMDsKIAogICAgIC8qKgogICAgICAqIFNldHMgYSBzZXQgb2YgcGFyYW1ldGVycyBmb3IgdGhlIGNvbXBvbmVudCBvciBpbnRlcmZhY2Ugb2JqZWN0LgotICAgICAqIFR1bmluZyBpcyBwZXJmb3JtZWQgYXQgYmVzdCBlZmZvcnQ6IHRoZSBjb21wb25lbnQgU0hBTEwgdXBkYXRlIGFsbCBzdXBwb3J0ZWQgY29uZmlndXJhdGlvbiBhdAotICAgICAqIGJlc3QgZWZmb3J0ICh1bmxlc3MgY29uZmlndXJlZCBvdGhlcndpc2UpIGFuZCBza2lwIHVuc3VwcG9ydGVkIG9uZXMuIEFueSBlcnJvcnMgYXJlCi0gICAgICogY29tbXVuaWNhdGVkIGluIHRoZSByZXR1cm4gdmFsdWUgYW5kIGluIHxmYWlsdXJlc3wuCisgICAgICoKKyAgICAgKiBUdW5pbmcgaXMgcGVyZm9ybWVkIGF0IGJlc3QgZWZmb3J0OiB0aGUgY29tcG9uZW50IFNIQUxMIHByb2Nlc3MgdGhlIGNvbmZpZ3VyYXRpb24gdXBkYXRlcyBpbgorICAgICAqIHRoZSBvcmRlciB0aGV5IGFwcGVhciBpbiB8cGFyYW1zfC4gSWYgYW55IHBhcmFtZXRlciB1cGRhdGUgZmFpbHMsIHRoZSBjb21wb25lbnQgc2hhbGwKKyAgICAgKiBjb21tdW5pY2F0ZSB0aGUgZmFpbHVyZSBpbiB0aGUgcmV0dXJuIHZhbHVlIGFuZCBpbiB8ZmFpbHVyZXN8LCBhbmQgc3RpbGwgcHJvY2VzcyB0aGUKKyAgICAgKiByZW1haW5pbmcgcGFyYW1ldGVycy4gVW5zdXBwb3J0ZWQgcGFyYW1ldGVycyBhcmUgc2tpcHBlZCwgdGhvdWdoIHRoZXkgYXJlIGNvbW11bmljYXRlZCBpbgorICAgICAqIHRoZXIgcmV0dXJuIHZhbHVlLiBNb3N0IHBhcmFtZXRlcnMgYXJlIHVwZGF0ZWQgYXQgYmVzdCBlZmZvcnQgLSBzdWNoIHRoYXQgZXZlbiBpZiBjbGllbnQKKyAgICAgKiBzcGVjaWZpZXMgYW4gdW5zdXBwb3J0ZWQgdmFsdWUgZm9yIGEgZmllbGQsIHRoZSBjbG9zZXN0IHN1cHBvcnRlZCB2YWx1ZSBpcyB1c2VkLiBPbiB0aGUKKyAgICAgKiBvdGhlciBoYW5kLCBzdHJpY3QgcGFyYW1ldGVycyBvbmx5IGFjY2VwdCBzcGVjaWZpYyB2YWx1ZXMgZm9yIHRoZWlyIGZpZWxkcywgYW5kIGlmIHRoZSBjbGllbnQKKyAgICAgKiBzcGVjaWZpZXMgYW4gdW5zdXBwb3J0ZWQgdmFsdWUsIHRoZSBwYXJhbWV0ZXIgc2V0dGluZyBzaGFsbCBmYWlsIGZvciB0aGF0IGZpZWxkLgorICAgICAqIElmIHRoZSBjbGllbnQgdHJpZXMgdG8gY2hhbmdlIHRoZSB2YWx1ZSBvZiBhIGZpZWxkIHRoYXQgcmVxdWlyZXMgbW9tZW50YXJ5IGJsb2NraW5nIHdpdGhvdXQKKyAgICAgKiBzZXR0aW5nIHxtYXlCbG9ja3wgdG8gQzJfTUFZX0JMT0NLLCB0aGF0IHBhcmFtZXRlciBzaGFsbCBhbHNvIGJlIHNraXBwZWQgYW5kIGEgc3BlY2lmaWMKKyAgICAgKiByZXR1cm4gdmFsdWUgc2hhbGwgYmUgdXNlZC4gRmluYWwgdmFsdWVzIGZvciBhbGwgcGFyYW1ldGVycyBzZXQgYXJlIHByb3BhZ2F0ZWQgYmFjayB0byB0aGUKKyAgICAgKiBjYWxsZXIgaW4gfHBhcmFtc3wuCiAgICAgICoKICAgICAgKiBcbm90ZSBQYXJhbWV0ZXIgdHVuaW5nIERPRVMgZGVwZW5kIG9uIHRoZSBvcmRlciBvZiB0aGUgdHVuaW5nIHBhcmFtZXRlcnMuIEUuZy4gc29tZSBwYXJhbWV0ZXIKLSAgICAgKiB1cGRhdGUgbWF5IGFsbG93IHNvbWUgc3Vic2VxdWVudCBwYXJhbWV0ZXIgdXBkYXRlLgorICAgICAqIHVwZGF0ZSBtYXkgYWxsb3cgc29tZSBzdWJzZXF1ZW50IHZhbHVlcyBmb3IgZnVydGhlciBwYXJhbWV0ZXIgdXBkYXRlcy4KICAgICAgKgotICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIGFueSBzdGF0ZS4KKyAgICAgKiBXaGVuIGF0dGFjaGVkIHRvIGEgY29tcG9uZW50LCB0aGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBhbnkgY29tcG9uZW50IHN0YXRlIGV4Y2VwdAorICAgICAqIHJlbGVhc2VkLgogICAgICAqCi0gICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxbXMuCisgICAgICogVGhpcyBtZXRob2QgaGFzIGEgdmFyaWFibGUgYmxvY2tpbmcgYmVoYXZpb3IgYmFzZWQgb24gc3RhdGUuCisgICAgICogSW4gdGhlIHN0b3BwZWQgc3RhdGUgdGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxbXMuCisgICAgICogSW4gdGhlIHJ1bm5pbmcgc3RhdGVzIHRoaXMgbWV0aG9kIG1heSBiZSBtb21lbnRhcmlseSBibG9ja2luZywgYnV0IE1VU1QgcmV0dXJuIHdpdGhpbiA1bXMuCiAgICAgICoKLSAgICAgKiBccGFyYW1baW4sb3V0XSBwYXJhbXMgICAgICAgICAgYSBsaXN0IG9mIHBhcmFtZXRlciB1cGRhdGVzLiBUaGVzZSB3aWxsIGJlIHVwZGF0ZWQgdG8gdGhlIGFjdHVhbAotICAgICAqICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciB2YWx1ZXMgYWZ0ZXIgdGhlIHVwZGF0ZXMgKHRoaXMgaXMgYmVjYXVzZSB0dW5pbmcgaXMgcGVyZm9ybWVkCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgYXQgYmVzdCBlZmZvcnQpLgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIFx0b2RvIHBhcmFtcyB0aGF0IGNvdWxkIG5vdCBiZSB1cGRhdGVkIGFyZSBub3QgbWFya2VkIGhlcmUsIHNvIGFyZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgIGNvbmZ1c2luZyAtIGFyZSB0aGV5ICJleGlzdGluZyIgdmFsdWVzIG9yIGludGVuZGVkIHRvIGJlIGNvbmZpZ3VyZWQKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM/Ci0gICAgICogXHBhcmFtW291dF0gZmFpbHVyZXMgICAgICAgIGEgbGlzdCBvZiBwYXJhbWV0ZXIgZmFpbHVyZXMKKyAgICAgKiBccGFyYW1baW4sb3V0XSBwYXJhbXMgYSBsaXN0IG9mIHBhcmFtZXRlciB1cGRhdGVzLiBUaGVzZSB3aWxsIGJlIHVwZGF0ZWQgdG8gdGhlIGFjdHVhbAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgdmFsdWVzIGFmdGVyIHRoZSB1cGRhdGVzICh0aGlzIGlzIGJlY2F1c2UgdHVuaW5nIGlzIHBlcmZvcm1lZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICBhdCBiZXN0IGVmZm9ydCkuCisgICAgICogICAgICAgICAgICAgICAgICAgICAgIFx0b2RvIHBhcmFtcyB0aGF0IGNvdWxkIG5vdCBiZSB1cGRhdGVkIGFyZSBub3QgbWFya2VkIGhlcmUsIHNvIGFyZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICBjb25mdXNpbmcgLSBhcmUgdGhleSAiZXhpc3RpbmciIHZhbHVlcyBvciBpbnRlbmRlZCB0byBiZSBjb25maWd1cmVkCisgICAgICogICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcz8KKyAgICAgKiBccGFyYW1baW5dIG1heUJsb2NrICAgaWYgdHJ1ZSAoQzJfTUFZX0JMT0NLKSwgaW1wbGVtZW50YXRpb24gbWF5IG1vbWVudGFyaWx5IGJsb2NrLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICBPdGhlcndpc2UgKEMyX0RPTlRfQkxPQ0spLCBpdCBtdXN0IGJlICJub24tYmxvY2tpbmciLgorICAgICAqIFxwYXJhbVtvdXRdIGZhaWx1cmVzICBhIGxpc3Qgb2YgcGFyYW1ldGVyIGZhaWx1cmVzIGFuZCBvcHRpb25hbCBndWlkYW5jZQogICAgICAqCiAgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgYWxsIHBhcmFtZXRlcnMgY291bGQgYmUgdXBkYXRlZCBzdWNjZXNzZnVsbHkKICAgICAgKiBccmV0dmFsIEMyX0JBRF9JTkRFWCBhbGwgc3VwcG9ydGVkIHBhcmFtZXRlcnMgY291bGQgYmUgdXBkYXRlZCBzdWNjZXNzZnVsbHksIGJ1dCBzb21lCiAgICAgICogICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyB3ZXJlIG5vdCBzdXBwb3J0ZWQKICAgICAgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSBzb21lIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIGNvdWxkIG5vdCBiZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseSBiZWNhdXNlCiAgICAgICogICAgICAgICAgICAgICAgICAgICAgdGhleSBjb250YWluZWQgdW5zdXBwb3J0ZWQgdmFsdWVzLiBUaGVzZSBhcmUgcmV0dXJuZWQgaW4gfGZhaWx1cmVzfC4KKyAgICAgKiBccmV0dmFsIEMyX0JBRF9TVEFURSB3aGVuIGNhbGxlZCBpbiB0aGUgcmVsZWFzZWQgY29tcG9uZW50IHN0YXRlICh1c2VyIGVycm9yKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGVycm9yIGNvZGUgaXMgb25seSBhbGxvd2VkIGZvciBpbnRlcmZhY2VzIGNvbm5lY3RlZCB0byBjb21wb25lbnRzKQogICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIHNvbWUgc3VwcG9ydGVkIHBhcmFtZXRlcnMgY291bGQgbm90IGJlIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5IGJlY2F1c2UKICAgICAgKiAgICAgICAgICAgICAgICAgICAgICB0aGV5IGNvbnRhaW5lZCB1bnN1cHBvcnRlZCB2YWx1ZXMsIGJ1dCBjb3VsZCBub3QgYWxsb2NhdGUgYSBmYWlsdXJlCiAgICAgICogICAgICAgICAgICAgICAgICAgICAgb2JqZWN0IGZvciB0aGVtLgorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIGNvdWxkIG5vdCBzZXQgdGhlIHBhcmFtZXRlcnMgd2l0aGluIHRoZSB0aW1lIGxpbWl0ICh1bmV4cGVjdGVkKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGVycm9yIGNvZGUgaXMgb25seSBhbGxvd2VkIGZvciBpbnRlcmZhY2VzIGNvbm5lY3RlZCB0byBjb21wb25lbnRzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHJ1bm5pbmcgc3RhdGUpCisgICAgICogXHJldHZhbCBDMl9CTE9DS0lORyAgdGhlIG9wZXJhdGlvbiBtdXN0IGJsb2NrIHRvIGNvbXBsZXRlIGJ1dCBtYXlCbG9jayBpcyBmYWxzZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGVycm9yIGNvZGUgaXMgb25seSBhbGxvd2VkIGZvciBpbnRlcmZhY2VzIGNvbm5lY3RlZCB0byBjb21wb25lbnRzKQogICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIHVwZGF0ZSBvZiB0aGUgcGFyYW1ldGVycwogICAgICAqICAgICAgICAgICAgICAgICAgICAgICh1bmV4cGVjdGVkKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGVycm9yIGNvZGUgaXMgb25seSBhbGxvd2VkIGZvciBpbnRlcmZhY2VzIGNvbm5lY3RlZCB0byBjb21wb25lbnRzKQogICAgICAqLwotICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29uZmlnX25iKAorICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29uZmlnX3ZiKAogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSogY29uc3Q+ICZwYXJhbXMsCi0gICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IGZhaWx1cmVzKSA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBBdG9taWNhbGx5IHNldHMgYSBzZXQgb2YgcGFyYW1ldGVycyBmb3IgdGhlIGNvbXBvbmVudCBvciBpbnRlcmZhY2Ugb2JqZWN0LgotICAgICAqCi0gICAgICogXG5vdGUgVGhpcyBtZXRob2QgaXMgdXNlZCBtYWlubHkgZm9yIHJlc2VydmluZyByZXNvdXJjZXMgZm9yIGEgY29tcG9uZW50LgotICAgICAqCi0gICAgICogVGhlIGNvbXBvbmVudCBTSEFMTCB1cGRhdGUgYWxsIHN1cHBvcnRlZCBjb25maWd1cmF0aW9uIGF0Ci0gICAgICogYmVzdCBlZmZvcnQoVEJEKSAodW5sZXNzIGNvbmZpZ3VyZWQgb3RoZXJ3aXNlKSBhbmQgc2tpcCB1bnN1cHBvcnRlZCBvbmVzLiBBbnkgZXJyb3JzIGFyZQotICAgICAqIGNvbW11bmljYXRlZCBpbiB0aGUgcmV0dXJuIHZhbHVlIGFuZCBpbiB8ZmFpbHVyZXN8LgotICAgICAqCi0gICAgICogXG5vdGUgUGFyYW1ldGVyIHR1bmluZyBET0VTIGRlcGVuZCBvbiB0aGUgb3JkZXIgb2YgdGhlIHR1bmluZyBwYXJhbWV0ZXJzLiBFLmcuIHNvbWUgcGFyYW1ldGVyCi0gICAgICogdXBkYXRlIG1heSBhbGxvdyBzb21lIHN1YnNlcXVlbnQgcGFyYW1ldGVyIHVwZGF0ZS4KLSAgICAgKgotICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIGFueSBzdGF0ZS4KLSAgICAgKgotICAgICAqIFRoaXMgbWV0aG9kIG1heSBiZSBtb21lbnRhcmlseSBibG9ja2luZywgYnV0IE1VU1QgcmV0dXJuIHdpdGhpbiA1bXMuCi0gICAgICoKLSAgICAgKiBccGFyYW0gcGFyYW1zW2luLG91dF0gICAgICAgICAgYSBsaXN0IG9mIHBhcmFtZXRlciB1cGRhdGVzLiBUaGVzZSB3aWxsIGJlIHVwZGF0ZWQgdG8gdGhlIGFjdHVhbAotICAgICAqICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciB2YWx1ZXMgYWZ0ZXIgdGhlIHVwZGF0ZXMgKHRoaXMgaXMgYmVjYXVzZSB0dW5pbmcgaXMgcGVyZm9ybWVkCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgYXQgYmVzdCBlZmZvcnQpLgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIFx0b2RvIHBhcmFtcyB0aGF0IGNvdWxkIG5vdCBiZSB1cGRhdGVkIGFyZSBub3QgbWFya2VkIGhlcmUsIHNvIGFyZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgIGNvbmZ1c2luZyAtIGFyZSB0aGV5ICJleGlzdGluZyIgdmFsdWVzIG9yIGludGVuZGVkIHRvIGJlIGNvbmZpZ3VyZWQKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM/Ci0gICAgICogXHBhcmFtIGZhaWx1cmVzW291dF0gICAgICAgIGEgbGlzdCBvZiBwYXJhbWV0ZXIgZmFpbHVyZXMKLSAgICAgKgotICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIGFsbCBwYXJhbWV0ZXJzIGNvdWxkIGJlIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5Ci0gICAgICogXHJldHZhbCBDMl9CQURfSU5ERVggYWxsIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIGNvdWxkIGJlIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LCBidXQgc29tZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgd2VyZSBub3Qgc3VwcG9ydGVkCi0gICAgICogXHJldHZhbCBDMl9CQURfVkFMVUUgc29tZSBzdXBwb3J0ZWQgcGFyYW1ldGVycyBjb3VsZCBub3QgYmUgdXBkYXRlZCBzdWNjZXNzZnVsbHkgYmVjYXVzZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRoZXkgY29udGFpbmVkIHVuc3VwcG9ydGVkIHZhbHVlcy4gVGhlc2UgYXJlIHJldHVybmVkIGluIHxmYWlsdXJlc3wuCi0gICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgc29tZSBzdXBwb3J0ZWQgcGFyYW1ldGVycyBjb3VsZCBub3QgYmUgdXBkYXRlZCBzdWNjZXNzZnVsbHkgYmVjYXVzZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRoZXkgY29udGFpbmVkIHVuc3VwcG9ydGVkIHZhbHVlcywgYnV0IGNvdWxkIG5vdCBhbGxvY2F0ZSBhIGZhaWx1cmUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBvYmplY3QgZm9yIHRoZW0uCi0gICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCB0aGUgdXBkYXRlIG9mIHRoZSBwYXJhbWV0ZXJzCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgKHVuZXhwZWN0ZWQpCi0gICAgICovCi0gICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjb21taXRfc20oCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKiBjb25zdD4gJnBhcmFtcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCiAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IGZhaWx1cmVzKSA9IDA7CiAKICAgICAvLyBUVU5ORUxJTkcKQEAgLTIyNCw3ICsyMjQsOCBAQAogICAgICAqIElmIHRoZSBjb21wb25lbnQgaXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQsIHN1YnNlcXVlbnQgd29yayBpdGVtcyBxdWV1ZWQgbWF5IGluY2x1ZGUgYQogICAgICAqIHR1bm5lbGVkIHBhdGggYmV0d2VlbiB0aGVzZSBjb21wb25lbnRzLgogICAgICAqCi0gICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gYW55IHN0YXRlLgorICAgICAqIFdoZW4gYXR0YWNoZWQgdG8gYSBjb21wb25lbnQsIHRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIGFueSBjb21wb25lbnQgc3RhdGUgZXhjZXB0CisgICAgICogcmVsZWFzZWQuCiAgICAgICoKICAgICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgbW9tZW50YXJpbHkgYmxvY2tpbmcsIGJ1dCBNVVNUIHJldHVybiB3aXRoaW4gNW1zLgogICAgICAqCkBAIC0yMzMsOSArMjM0LDEyIEBACiAgICAgICogXHJldHZhbCBDMl9EVVBMSUNBVEUgdGhlIHR1bm5lbCBhbHJlYWR5IGV4aXN0cwogICAgICAqIFxyZXR2YWwgQzJfT01JVFRFRCAgIHR1bm5lbGluZyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgY29tcG9uZW50CiAgICAgICogXHJldHZhbCBDMl9DQU5OT1RfRE8gdGhlIHNwZWNpZmljIHR1bm5lbCBpcyBub3Qgc3VwcG9ydGVkCisgICAgICogXHJldHZhbCBDMl9CQURfU1RBVEUgd2hlbiBjYWxsZWQgaW4gdGhlIHJlbGVhc2VkIGNvbXBvbmVudCBzdGF0ZSAodXNlciBlcnJvcikKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodGhpcyBlcnJvciBjb2RlIGlzIG9ubHkgYWxsb3dlZCBmb3IgaW50ZXJmYWNlcyBjb25uZWN0ZWQgdG8gY29tcG9uZW50cykKICAgICAgKgogICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIGNvdWxkIG5vdCBjcmVhdGUgdGhlIHR1bm5lbCB3aXRoaW4gdGhlIHRpbWUgbGltaXQgKHVuZXhwZWN0ZWQpCiAgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCB0aGUgY3JlYXRpb24gb2YgdGhlIHR1bm5lbCAodW5leHBlY3RlZCkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodGhpcyBlcnJvciBjb2RlIGlzIG9ubHkgYWxsb3dlZCBmb3IgaW50ZXJmYWNlcyBjb25uZWN0ZWQgdG8gY29tcG9uZW50cykKICAgICAgKi8KICAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZVR1bm5lbF9zbShjMl9ub2RlX2lkX3QgdGFyZ2V0Q29tcG9uZW50KSA9IDA7CiAKQEAgLTI0Niw3ICsyNTAsOCBAQAogICAgICAqIEFmdGVyIHJlbGVhc2luZyBhIHR1bm5lbCwgc3Vic2VxdWVudCB3b3JrIGl0ZW1zIHF1ZXVlZCBNVVNUIE5PVCBpbmNsdWRlIGEgdHVubmVsZWQKICAgICAgKiBwYXRoIGJldHdlZW4gdGhlc2UgY29tcG9uZW50cy4KICAgICAgKgotICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIGFueSBzdGF0ZS4KKyAgICAgKiBXaGVuIGF0dGFjaGVkIHRvIGEgY29tcG9uZW50LCB0aGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBhbnkgY29tcG9uZW50IHN0YXRlIGV4Y2VwdAorICAgICAqIHJlbGVhc2VkLgogICAgICAqCiAgICAgICogVGhpcyBtZXRob2QgbWF5IGJlIG1vbWVudGFyaWx5IGJsb2NraW5nLCBidXQgTVVTVCByZXR1cm4gd2l0aGluIDVtcy4KICAgICAgKgpAQCAtMjU0LDkgKzI1OSwxMiBAQAogICAgICAqIFxyZXR2YWwgQzJfQkFEX0lOREVYIHRoZSB0YXJnZXQgY29tcG9uZW50IGRvZXMgbm90IGV4aXN0CiAgICAgICogXHJldHZhbCBDMl9OT1RfRk9VTkQgdGhlIHR1bm5lbCBkb2VzIG5vdCBleGlzdAogICAgICAqIFxyZXR2YWwgQzJfT01JVFRFRCAgIHR1bm5lbGluZyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgY29tcG9uZW50CisgICAgICogXHJldHZhbCBDMl9CQURfU1RBVEUgd2hlbiBjYWxsZWQgaW4gdGhlIHJlbGVhc2VkIGNvbXBvbmVudCBzdGF0ZSAodXNlciBlcnJvcikKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodGhpcyBlcnJvciBjb2RlIGlzIG9ubHkgYWxsb3dlZCBmb3IgaW50ZXJmYWNlcyBjb25uZWN0ZWQgdG8gY29tcG9uZW50cykKICAgICAgKgogICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIGNvdWxkIG5vdCBtYXJrIHRoZSB0dW5uZWwgZm9yIHJlbGVhc2Ugd2l0aGluIHRoZSB0aW1lIGxpbWl0ICh1bmV4cGVjdGVkKQogICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIHJlbGVhc2Ugb2YgdGhlIHR1bm5lbCAodW5leHBlY3RlZCkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodGhpcyBlcnJvciBjb2RlIGlzIG9ubHkgYWxsb3dlZCBmb3IgaW50ZXJmYWNlcyBjb25uZWN0ZWQgdG8gY29tcG9uZW50cykKICAgICAgKi8KICAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHJlbGVhc2VUdW5uZWxfc20oYzJfbm9kZV9pZF90IHRhcmdldENvbXBvbmVudCkgPSAwOwogCkBAIC0yNjYsMTEgKzI3NCwxNiBAQAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIHNldCBvZiBzdXBwb3J0ZWQgcGFyYW1ldGVycy4KICAgICAgKgorICAgICAqIFdoZW4gYXR0YWNoZWQgdG8gYSBjb21wb25lbnQsIHRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIGFueSBjb21wb25lbnQgc3RhdGUgZXhjZXB0CisgICAgICogcmVsZWFzZWQuCisgICAgICoKICAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDFtcy4KICAgICAgKgogICAgICAqIFxwYXJhbVtvdXRdIHBhcmFtcyBhIHZlY3RvciBvZiBzdXBwb3J0ZWQgcGFyYW1ldGVycyB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoaXMgdmVjdG9yLgogICAgICAqCiAgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIG9wZXJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFIHdoZW4gY2FsbGVkIGluIHRoZSByZWxlYXNlZCBjb21wb25lbnQgc3RhdGUgKHVzZXIgZXJyb3IpCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHRoaXMgZXJyb3IgY29kZSBpcyBvbmx5IGFsbG93ZWQgZm9yIGludGVyZmFjZXMgY29ubmVjdGVkIHRvIGNvbXBvbmVudHMpCiAgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gY29tcGxldGUgdGhpcyBtZXRob2QuCiAgICAgICovCiAgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFBhcmFtc19uYigKQEAgLTI4NSwxNSArMjk4LDMxIEBACiAgICAgICogYXMgYSBzdGF0dXMgZm9yIGVhY2ggZmllbGQuIENvbXBvbmVudCBzaGFsbCBwcm9jZXNzIGFsbCBmaWVsZHMgcXVlcmllZCBldmVuIGlmIHNvbWUgcXVlcmllcwogICAgICAqIGZhaWwuCiAgICAgICoKLSAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDFtcy4KKyAgICAgKiBXaGVuIGF0dGFjaGVkIHRvIGEgY29tcG9uZW50LCB0aGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBhbnkgY29tcG9uZW50IHN0YXRlIGV4Y2VwdAorICAgICAqIHJlbGVhc2VkLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgaGFzIGEgdmFyaWFibGUgYmxvY2tpbmcgYmVoYXZpb3IgYmFzZWQgb24gc3RhdGUuCisgICAgICogSW4gdGhlIHN0b3BwZWQgc3RhdGUgdGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxbXMuCisgICAgICogSW4gdGhlIHJ1bm5pbmcgc3RhdGVzIHRoaXMgbWV0aG9kIG1heSBiZSBtb21lbnRhcmlseSBibG9ja2luZywgYnV0IE1VU1QgcmV0dXJuIHdpdGhpbiA1bXMuCiAgICAgICoKICAgICAgKiBccGFyYW1baW4gb3V0XSBmaWVsZHMgYSB2ZWN0b3Igb2YgZmllbGRzIGRlc2NyaXB0b3Igc3RydWN0dXJlcy4KKyAgICAgKiBccGFyYW1baW5dIG1heUJsb2NrICAgaWYgdHJ1ZSAoQzJfTUFZX0JMT0NLKSwgaW1wbGVtZW50YXRpb24gbWF5IG1vbWVudGFyaWx5IGJsb2NrLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICBPdGhlcndpc2UgKEMyX0RPTlRfQkxPQ0spLCBpdCBtdXN0IGJlICJub24tYmxvY2tpbmciLgogICAgICAqCiAgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIG9wZXJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFIHdoZW4gY2FsbGVkIGluIHRoZSByZWxlYXNlZCBjb21wb25lbnQgc3RhdGUgKHVzZXIgZXJyb3IpCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHRoaXMgZXJyb3IgY29kZSBpcyBvbmx5IGFsbG93ZWQgZm9yIGludGVyZmFjZXMgY29ubmVjdGVkIHRvIGNvbXBvbmVudHMpCiAgICAgICogXHJldHZhbCBDMl9CQURfSU5ERVggYXQgbGVhc3Qgb25lIGZpZWxkIHdhcyBub3QgcmVjb2duaXplZCBhcyBhIGNvbXBvbmVudCBmaWVsZAorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIGNvdWxkIG5vdCBxdWVyeSBzdXBwb3J0ZWQgdmFsdWVzIHdpdGhpbiB0aGUgdGltZSBsaW1pdCAodW5leHBlY3RlZCkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodGhpcyBlcnJvciBjb2RlIGlzIG9ubHkgYWxsb3dlZCBmb3IgaW50ZXJmYWNlcyBjb25uZWN0ZWQgdG8gY29tcG9uZW50cworICAgICAqICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBydW5uaW5nIHN0YXRlKQorICAgICAqIFxyZXR2YWwgQzJfQkxPQ0tJTkcgIHRoZSBvcGVyYXRpb24gbXVzdCBibG9jayB0byBjb21wbGV0ZSBidXQgbWF5QmxvY2sgaXMgZmFsc2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodGhpcyBlcnJvciBjb2RlIGlzIG9ubHkgYWxsb3dlZCBmb3IgaW50ZXJmYWNlcyBjb25uZWN0ZWQgdG8gY29tcG9uZW50cykKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSBvcGVyYXRpb24gZnJvbSBjb21wbGV0aW5nICh1bmV4cGVjdGVkKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGVycm9yIGNvZGUgaXMgb25seSBhbGxvd2VkIGZvciBpbnRlcmZhY2VzIGNvbm5lY3RlZCB0byBjb21wb25lbnRzKQogICAgICAqLwotICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRWYWx1ZXNfbmIoCi0gICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+ICZmaWVsZHMpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkVmFsdWVzX3ZiKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiAmZmllbGRzLCBjMl9ibG9ja2luZ190IG1heUJsb2NrKSBjb25zdCA9IDA7CiAKICAgICB2aXJ0dWFsIH5DMkNvbXBvbmVudEludGVyZmFjZSgpID0gZGVmYXVsdDsKIH07CkBAIC0zMTUsMjIgKzM0NCwyNCBAQAogCiAgICAgICAgIC8vIHZpcnR1YWwgdm9pZCBvbkNvbXBvbmVudFJlbGVhc2VkKDxpZD4pID0gMDsKIAotICAgIHByb3RlY3RlZDoKICAgICAgICAgdmlydHVhbCB+TGlzdGVuZXIoKSA9IGRlZmF1bHQ7CiAgICAgfTsKIAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIGxpc3RlbmVyIGZvciB0aGlzIGNvbXBvbmVudAogICAgICAqCi0gICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gYWxsIHN0YXRlcy4gVGhlIGxpc3RlbmVyIGNhbiBvbmx5IGJlIHNldCB0byBub24tbnVsbCB2YWx1ZQotICAgICAqIGluIG5vbi1ydW5uaW5nIHN0YXRlICh0aGF0IGRvZXMgbm90IGluY2x1ZGUgdHJpcHBlZCBvciBlcnJvcikuIEl0IGNhbiBiZSBzZXQgdG8gbnVsbHB0ciBpbgotICAgICAqIGFueSBzdGF0ZS4gQ29tcG9uZW50cyBvbmx5IHVzZSB0aGUgbGlzdGVuZXIgaW4gcnVubmluZyBzdGF0ZS4KKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBhbGwgc3RhdGVzIGV4Y2VwdCByZWxlYXNlZC4KKyAgICAgKiBUaGUgbGlzdGVuZXIgY2FuIG9ubHkgYmUgc2V0IHRvIG5vbi1udWxsIHZhbHVlIGluIHN0b3BwZWQgc3RhdGUgKHRoYXQgZG9lcyBub3QgaW5jbHVkZQorICAgICAqIHRyaXBwZWQgb3IgZXJyb3IpLiBJdCBjYW4gYmUgc2V0IHRvIG51bGxwdHIgaW4gYm90aCBzdG9wcGVkIGFuZCBydW5uaW5nIHN0YXRlcy4KKyAgICAgKiBDb21wb25lbnRzIG9ubHkgdXNlIHRoZSBsaXN0ZW5lciBpbiBydW5uaW5nIHN0YXRlLgogICAgICAqCiAgICAgICogSWYgbGlzdGVuZXIgaXMgbnVsbHB0ciwgdGhlIGNvbXBvbmVudCBTSEFMTCBndWFyYW50ZWUgdGhhdCBubyBtb3JlIGxpc3RlbmVyIGNhbGxiYWNrcyBhcmUKICAgICAgKiBkb25lIHRvIHRoZSBvcmlnaW5hbCBsaXN0ZW5lciBvbmNlIHRoaXMgbWV0aG9kIHJldHVybnMuIChBbnkgcGVuZGluZyBsaXN0ZW5lciBjYWxsYmFja3Mgd2lsbAogICAgICAqIG5lZWQgdG8gYmUgY29tcGxldGVkIGR1cmluZyB0aGlzIGNhbGwgLSBoZW5jZSB0aGlzIGNhbGwgbWF5IGJlIHRlbXBvcmFyaWx5IGJsb2NraW5nLikKICAgICAgKgotICAgICAqIFRoaXMgbWV0aG9kIG1heSBiZSBtb21lbnRhcmlseSBibG9ja2luZywgYnV0IG11c3QgcmV0dXJuIHdpdGhpbiA1bXMuCisgICAgICogVGhpcyBtZXRob2QgaGFzIGEgdmFyaWFibGUgYmxvY2tpbmcgYmVoYXZpb3IgYmFzZWQgb24gc3RhdGUuCisgICAgICogSW4gdGhlIHN0b3BwZWQgc3RhdGUgdGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxbXMuCisgICAgICogSW4gdGhlIHJ1bm5pbmcgc3RhdGVzIHRoaXMgbWV0aG9kIG1heSBiZSBtb21lbnRhcmlseSBibG9ja2luZywgYnV0IE1VU1QgcmV0dXJuIHdpdGhpbiA1bXMuCiAgICAgICoKICAgICAgKiBDb21wb25lbnQgU0hBTEwgaGFuZGxlIGxpc3RlbmVyIG5vdGlmaWNhdGlvbnMgZnJvbSB0aGUgc2FtZSB0aHJlYWQgKHRoZSB0aHJlYWQgdXNlZCBpcwogICAgICAqIGF0IHRoZSBjb21wb25lbnQncyBkaXNjcmV0aW9uLikKQEAgLTM0MCwzNCArMzcxLDM4IEBACiAgICAgICogcHV0IHRoZSBidXJkZW4gb24gdGhlIGNsaWVudCB0byBjbGVhciB0aGUgbGlzdGVuZXIgLSB3YWl0IGZvciBpdHMgZGVsZXRpb24gLSBhdCB3aGljaCBwb2ludAogICAgICAqIGl0IGlzIGd1YXJhbnRlZWQgdGhhdCBubyBtb3JlIGxpc3RlbmVyIGNhbGxiYWNrcyB3aWxsIG9jY3VyLgogICAgICAqCi0gICAgICogXHRvZG8gVEJEIGlzIHRoaXMgbmVlZGVkPyBvciBtb3ZlIGl0IHRvIGNyZWF0ZUNvbXBvbmVudCgpCisgICAgICogXHBhcmFtW2luXSBsaXN0ZW5lciB0aGUgY29tcG9uZW50IGxpc3RlbmVyIG9iamVjdAorICAgICAqIFxwYXJhbVtpbl0gbWF5QmxvY2sgaWYgdHJ1ZSAoQzJfTUFZX0JMT0NLKSwgaW1wbGVtZW50YXRpb24gbWF5IG1vbWVudGFyaWx5IGJsb2NrLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlIChDMl9ET05UX0JMT0NLKSwgaXQgbXVzdCBiZSAibm9uLWJsb2NraW5nIi4KICAgICAgKgotICAgICAqIFxwYXJhbSBsaXN0ZW5lciB0aGUgY29tcG9uZW50IGxpc3RlbmVyIG9iamVjdAotICAgICAqCi0gICAgICogXHJldHZhbCBDMl9CQURfU1RBVEUgYXR0ZW1wdGluZyB0byBjaGFuZ2UgdGhlIGxpc3RlbmVyIGluIHRoZSBydW5uaW5nIHN0YXRlICh1c2VyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFIGF0dGVtcHRpbmcgdG8gY2hhbmdlIHRoZSBsaXN0ZW5lciBpbiB0aGUgcnVubmluZyBzdGF0ZSB0byBhIG5vbi1udWxsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgdmFsdWUgKHVzZXIgZXJyb3IpLCBvciBjYWxsZWQgaW4gdGhlIHJlbGVhc2VkIHN0YXRlCisgICAgICogXHJldHZhbCBDMl9CTE9DS0lORyAgdGhlIG9wZXJhdGlvbiBtdXN0IGJsb2NrIHRvIGNvbXBsZXRlIGJ1dCBtYXlCbG9jayBpcyBmYWxzZQogICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIGxpc3RlbmVyIHdhcyB1cGRhdGVkIHN1Y2Nlc3NmdWxseS4KICAgICAgKi8KLSAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHNldExpc3RlbmVyX3NtKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxMaXN0ZW5lcj4gJmxpc3RlbmVyKSA9IDA7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBzZXRMaXN0ZW5lcl92YigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxMaXN0ZW5lcj4gJmxpc3RlbmVyLCBjMl9ibG9ja2luZ190IG1heUJsb2NrKSA9IDA7CisKKyAgICBlbnVtIGRvbWFpbl90IDogdWludDMyX3Q7CisgICAgZW51bSBraW5kX3QgOiB1aW50MzJfdDsKKyAgICB0eXBlZGVmIHVpbnQzMl90IHJhbmtfdDsKIAogICAgIC8qKgogICAgICAqIEluZm9ybWF0aW9uIGFib3V0IGEgY29tcG9uZW50LgogICAgICAqLwogICAgIHN0cnVjdCBUcmFpdHMgewogICAgIC8vIHB1YmxpYzoKLSAgICAvLyBUQkQKLSAgICAjaWYgMAotICAgICAgICBDMlN0cmluZyBuYW1lOyAgICAgICAgICAgICAvLy88IG5hbWUgb2YgdGhlIGNvbXBvbmVudAotICAgICAgICBDMkRvbWFpbktpbmQgZG9tYWluOyAgICAgICAvLy88IGNvbXBvbmVudCBkb21haW4gKGUuZy4gYXVkaW8gb3IgdmlkZW8pCi0gICAgICAgIEMyQ29tcG9uZW50S2luZCB0eXBlOyAgICAgIC8vLzwgY29tcG9uZW50IHR5cGUgKGUuZy4gZW5jb2RlciwgZGVjb2RlciBvciBmaWx0ZXIpCisgICAgICAgIEMyU3RyaW5nIG5hbWU7IC8vLzwgbmFtZSBvZiB0aGUgY29tcG9uZW50CisgICAgICAgIGRvbWFpbl90IGRvbWFpbjsgLy8vPCBjb21wb25lbnQgZG9tYWluIChlLmcuIGF1ZGlvIG9yIHZpZGVvKQorICAgICAgICBraW5kX3Qga2luZDsgLy8vPCBjb21wb25lbnQga2luZCAoZS5nLiBlbmNvZGVyLCBkZWNvZGVyIG9yIGZpbHRlcikKKyAgICAgICAgcmFua190IHJhbms7IC8vLzwgcmFuayB1c2VkIHRvIGRldGVybWluZSBjb21wb25lbnQgb3JkZXJpbmcgKHRoZSBsb3dlciB0aGUgc29vbmVyKQogICAgICAgICBDMlN0cmluZ0xpdGVyYWwgbWVkaWFUeXBlOyAvLy88IG1lZGlhIHR5cGUgc3VwcG9ydGVkIGJ5IHRoZSBjb21wb25lbnQKLSAgICAgICAgQzJDb21wb25lbnRQcmlvcml0eSBwcmlvcml0eTsgLy8vPCBwcmlvcml0eSB1c2VkIHRvIGRldGVybWluZSBjb21wb25lbnQgb3JkZXJpbmcKIAogICAgICAgICAvKioKICAgICAgICAgICogbmFtZSBhbGlhcyhlcykgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCiAgICAgICAgICAqIFxub3RlIE11bHRpcGxlIGNvbXBvbmVudHMgY2FuIGhhdmUgdGhlIHNhbWUgYWxpYXMgYXMgbG9uZyBhcyB0aGVpciBtZWRpYS10eXBlIGRpZmZlcnMuCiAgICAgICAgICAqLwogICAgICAgICBzdGQ6OnZlY3RvcjxDMlN0cmluZ0xpdGVyYWw+IGFsaWFzZXM7IC8vLzwgbmFtZSBhbGlhc2VzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5Ci0gICAgI2VuZGlmCiAgICAgfTsKIAogICAgIC8vIE1FVEhPRFMgQVZBSUxBQkxFIFdIRU4gUlVOTklORwpAQCAtMzc2LDkgKzQxMSw5IEBACiAgICAgLyoqCiAgICAgICogUXVldWVzIHVwIHdvcmsgZm9yIHRoZSBjb21wb25lbnQuCiAgICAgICoKLSAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBydW5uaW5nIChpbmNsdWRpbmcgdHJpcHBlZCkgc3RhdGVzLgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIHJ1bm5pbmcgKGluY2x1ZGluZyB0cmlwcGVkIGFuZCBlcnJvcikgc3RhdGVzLgogICAgICAqCi0gICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxbXMKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDEgbXMKICAgICAgKgogICAgICAqIEl0IGlzIGFjY2VwdGFibGUgZm9yIHRoaXMgbWV0aG9kIHRvIHJldHVybiBPSyBhbmQgcmV0dXJuIGFuIGVycm9yIHZhbHVlIHVzaW5nIHRoZQogICAgICAqIG9uV29ya0RvbmUoKSBjYWxsYmFjay4KQEAgLTM4Niw2ICs0MjEsNyBAQAogICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSB3b3JrIHdhcyBzdWNjZXNzZnVsbHkgcXVldWVkCiAgICAgICogXHJldHZhbCBDMl9CQURfSU5ERVggc29tZSBjb21wb25lbnQocykgaW4gdGhlIHdvcmsgZG8oZXMpIG5vdCBleGlzdAogICAgICAqIFxyZXR2YWwgQzJfQ0FOTk9UX0RPIHRoZSBjb21wb25lbnRzIGFyZSBub3QgdHVubmVsZWQKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9TVEFURSB3aGVuIGNhbGxlZCBpbiB0aGUgc3RvcHBlZCBvciByZWxlYXNlZCBzdGF0ZSAodXNlciBlcnJvcikKICAgICAgKgogICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIHF1ZXVlIHRoZSB3b3JrCiAgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCBxdWV1aW5nIHRoZSB3b3JrICh1bmV4cGVjdGVkKQpAQCAtMzk2LDEzICs0MzIsMTQgQEAKICAgICAgKiBBbm5vdW5jZXMgYSB3b3JrIHRvIGJlIHF1ZXVlZCBsYXRlciBmb3IgdGhlIGNvbXBvbmVudC4gVGhpcyByZXNlcnZlcyBhIHNsb3QgZm9yIHRoZSBxdWV1ZQogICAgICAqIHRvIGVuc3VyZSBjb3JyZWN0IHdvcmsgb3JkZXJpbmcgZXZlbiBpZiB0aGUgd29yayBpcyBxdWV1ZWQgbGF0ZXIuCiAgICAgICoKLSAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBydW5uaW5nIChpbmNsdWRpbmcgdHJpcHBlZCkgc3RhdGVzLgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIHJ1bm5pbmcgKGluY2x1ZGluZyB0cmlwcGVkIGFuZCBlcnJvcikgc3RhdGVzLgogICAgICAqCiAgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxIG1zCiAgICAgICoKICAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgd29yayBhbm5vdW5jZW1lbnQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHJlY29yZGVkCiAgICAgICogXHJldHZhbCBDMl9CQURfSU5ERVggc29tZSBjb21wb25lbnQocykgaW4gdGhlIHdvcmsgb3V0bGluZSBkbyhlcykgbm90IGV4aXN0CiAgICAgICogXHJldHZhbCBDMl9DQU5OT1RfRE8gdGhlIGNvbXBvbmVudGVzIGFyZSBub3QgdHVubmVsZWQKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9TVEFURSB3aGVuIGNhbGxlZCBpbiB0aGUgc3RvcHBlZCBvciByZWxlYXNlZCBzdGF0ZSAodXNlciBlcnJvcikKICAgICAgKgogICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIHJlY29yZCB0aGUgd29yayBhbm5vdW5jZW1lbnQKICAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHJlY29yZGluZyB0aGUgYW5ub3VuY2VtZW50ICh1bmV4cGVjdGVkKQpAQCAtNDE1LDkgKzQ1MiwxMCBAQAogICAgIGVudW0gZmx1c2hfbW9kZV90IDogdWludDMyX3QgewogICAgICAgICAvLy8gZmx1c2ggd29yayBmcm9tIHRoaXMgY29tcG9uZW50IG9ubHkKICAgICAgICAgRkxVU0hfQ09NUE9ORU5ULAorCiAgICAgICAgIC8vLyBmbHVzaCB3b3JrIGZyb20gdGhpcyBjb21wb25lbnQgYW5kIGFsbCBjb21wb25lbnRzIGNvbm5lY3RlZCBkb3duc3RyZWFtIGZyb20gaXQgdmlhCiAgICAgICAgIC8vLyB0dW5uZWxpbmcKLSAgICAgICAgRkxVU0hfQ0hBSU4sCisgICAgICAgIEZMVVNIX0NIQUlOID0gKDEgPDwgMTYpLAogICAgIH07CiAKICAgICAvKioKQEAgLTQzMyw3ICs0NzEsNyBAQAogICAgICAqIFx0b2RvIHdlIGNvdWxkIHNpbXBseSB0YWtlIGEgbGlzdCBvZiBudW1iZXJzIGFuZCBmbHVzaCB0aG9zZS4uLiB0aGlzIGlzIGJhZCBmb3IgZGVjb2RlcnMKICAgICAgKiAgICAgICBhbHNvLCB3aGF0IHdvdWxkIGhhcHBlbiB0byBmaW5lIGdyYWRlIHJlZmVyZW5jZXM/CiAgICAgICoKLSAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBydW5uaW5nIChpbmNsdWRpbmcgdHJpcHBlZCkgc3RhdGVzLgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIHJ1bm5pbmcgKGluY2x1ZGluZyB0cmlwcGVkIGFuZCBlcnJvcikgc3RhdGVzLgogICAgICAqCiAgICAgICogVGhpcyBtZXRob2QgbWF5IGJlIG1vbWVudGFyaWx5IGJsb2NraW5nLCBidXQgbXVzdCByZXR1cm4gd2l0aGluIDVtcy4KICAgICAgKgpAQCAtNDQ3LDE4ICs0ODUsMjYgQEAKICAgICAgKiBccGFyYW0gbW9kZSBmbHVzaCBtb2RlCiAgICAgICoKICAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgY29tcG9uZW50IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBmbHVzaGVkCisgICAgICogXHJldHZhbCBDMl9CQURfU1RBVEUgd2hlbiBjYWxsZWQgaW4gdGhlIHN0b3BwZWQgb3IgcmVsZWFzZWQgc3RhdGUgKHVzZXIgZXJyb3IpCiAgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIGZsdXNoIGNvdWxkIG5vdCBiZSBjb21wbGV0ZWQgd2l0aGluIHRoZSB0aW1lIGxpbWl0ICh1bmV4cGVjdGVkKQogICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgZmx1c2hpbmcgZnJvbSBjb21wbGV0aW9uICh1bmV4cGVjdGVkKQogICAgICAqLwogICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZmx1c2hfc20oZmx1c2hfbW9kZV90IG1vZGUsIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4qIGNvbnN0IGZsdXNoZWRXb3JrKSA9IDA7CiAKICAgICBlbnVtIGRyYWluX21vZGVfdCA6IHVpbnQzMl90IHsKLSAgICAgICAgLy8vIGRyYWluIGNvbXBvbmVudCBvbmx5Ci0gICAgICAgIERSQUlOX0NPTVBPTkVOVCwKKyAgICAgICAgLy8vIGRyYWluIGNvbXBvbmVudCBvbmx5IGFuZCBhZGQgYW4gImVuZC1vZi1zdHJlYW0iIG1hcmtlci4gQ29tcG9uZW50IHNoYWxsIHByb2Nlc3MgYWxsCisgICAgICAgIC8vLyBxdWV1ZWQgd29yayBhbmQgY29tcGxldGUgdGhlIGN1cnJlbnQgc3RyZWFtLiBJZiBuZXcgaW5wdXQgaXMgcmVjZWl2ZWQsIGl0IHNoYWxsIHN0YXJ0CisgICAgICAgIC8vLyBhIG5ldyBzdHJlYW0uIFx0b2RvIGRlZmluZSB3aGF0IGEgc3RyZWFtIGlzLgorICAgICAgICBEUkFJTl9DT01QT05FTlRfV0lUSF9FT1MsCisgICAgICAgIC8vLyBkcmFpbiBjb21wb25lbnQgd2l0aG91dCBzZXR0aW5nICJlbmQtb2Ytc3RyZWFtIiBtYXJrZXIuIENvbXBvbmVudCBzaGFsbCBwcm9jZXNzIGFsbAorICAgICAgICAvLy8gcXVldWVkIHdvcmsgYnV0IHNoYWxsIGV4cGVjdCBtb3JlIHdvcmsgaXRlbXMgZm9yIHRoZSBzYW1lIHN0cmVhbS4KKyAgICAgICAgRFJBSU5fQ09NUE9ORU5UX05PX0VPUyA9ICgxIDw8IDApLAorCiAgICAgICAgIC8vLyBtYXJrcyB0aGUgbGFzdCB3b3JrIGl0ZW0gd2l0aCBhIHBlcnNpc3RlbnQgImVuZC1vZi1zdHJlYW0iIG1hcmtlciB0aGF0IHdpbGwgZHJhaW4KICAgICAgICAgLy8vIGRvd25zdHJlYW0gY29tcG9uZW50cwogICAgICAgICAvLy8gXHRvZG8gdGhpcyBtYXkgY29uZnVzZSB3b3JrLW9yZGVyaW5nIGRvd25zdHJlYW0KLSAgICAgICAgRFJBSU5fQ0hBSU4sCisgICAgICAgIERSQUlOX0NIQUlOID0gKDEgPDwgMTYpLAorCiAgICAgICAgIC8qKgogICAgICAgICAgKiBcdG9kbyBkZWZpbmUgdGhpczsgd2UgY291bGQgcGxhY2UgRU9TIHRvIGFsbCB1cHN0cmVhbSBjb21wb25lbnRzLCBqdXN0IHRoaXMgY29tcG9uZW50LCBvcgogICAgICAgICAgKiAgICAgICBhbGwgdXBzdHJlYW0gYW5kIGRvd25zdHJlYW0gY29tcG9uZW50LgpAQCAtNDcwLDEwICs1MTYsMTAgQEAKICAgICAgKiBEcmFpbnMgdGhlIGNvbXBvbmVudCwgYW5kIG9wdGlvbmFsbHkgZG93bnN0cmVhbSBjb21wb25lbnRzLiBUaGlzIGlzIGEgc2lnbmFsbGluZyBtZXRob2Q7CiAgICAgICogYXMgc3VjaCBpdCBkb2VzIG5vdCB3YWl0IGZvciBhbnkgd29yayBjb21wbGV0aW9uLgogICAgICAqCi0gICAgICogTWFya3MgbGFzdCB3b3JrIGl0ZW0gYXMgImVuZC1vZi1zdHJlYW0iLCBzbyBjb21wb25lbnQgaXMgbm90aWZpZWQgbm90IHRvIHdhaXQgZm9yIGZ1cnRoZXIKLSAgICAgKiB3b3JrIGJlZm9yZSBpdCBwcm9jZXNzZXMgd29yayBhbHJlYWR5IHF1ZXVlZC4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIHRvIHNldCB0aGUgZW5kLW9mLXN0cmVhbQotICAgICAqIGZsYWcgYWZ0ZXIgd29yayBoYXMgYmVlbiBxdWV1ZWQuIENsaWVudCBjYW4gY29udGludWUgdG8gcXVldWUgZnVydGhlciB3b3JrIGltbWVkaWF0ZWx5IGFmdGVyCi0gICAgICogdGhpcyBtZXRob2QgcmV0dXJucy4KKyAgICAgKiBNYXJrcyBsYXN0IHdvcmsgaXRlbSBhcyAiZHJhaW4tdGlsbC1oZXJlIiwgc28gY29tcG9uZW50IGlzIG5vdGlmaWVkIG5vdCB0byB3YWl0IGZvciBmdXJ0aGVyCisgICAgICogd29yayBiZWZvcmUgaXQgcHJvY2Vzc2VzIHdvcmsgYWxyZWFkeSBxdWV1ZWQuIFRoaXMgbWV0aG9kIGNhbiBhbHNvIHVzZWQgdG8gc2V0IHRoZQorICAgICAqIGVuZC1vZi1zdHJlYW0gZmxhZyBhZnRlciB3b3JrIGhhcyBiZWVuIHF1ZXVlZC4gQ2xpZW50IGNhbiBjb250aW51ZSB0byBxdWV1ZSBmdXJ0aGVyIHdvcmsKKyAgICAgKiBpbW1lZGlhdGVseSBhZnRlciB0aGlzIG1ldGhvZCByZXR1cm5zLgogICAgICAqCiAgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gcnVubmluZyAoaW5jbHVkaW5nIHRyaXBwZWQpIHN0YXRlcy4KICAgICAgKgpAQCAtNDg0LDYgKzUzMCw5IEBACiAgICAgICogXHBhcmFtIG1vZGUgZHJhaW4gbW9kZQogICAgICAqCiAgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGRyYWluIHJlcXVlc3QgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHJlY29yZGVkCisgICAgICogXHJldHZhbCBDMl9CQURfU1RBVEUgd2hlbiBjYWxsZWQgaW4gdGhlIHN0b3BwZWQgb3IgcmVsZWFzZWQgc3RhdGUgKHVzZXIgZXJyb3IpCisgICAgICogXHJldHZhbCBDMl9CQURfVkFMVUUgdGhlIGRyYWluIG1vZGUgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgY29tcG9uZW50CisgICAgICogICAgICAgICAgICAgICAgICAgICAgXHRvZG8gZGVmaW5lIHN1cHBvcnRlZCBtb2RlcyBkaXNjb3ZlcnkKICAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCB0aGUgZmx1c2ggY291bGQgbm90IGJlIGNvbXBsZXRlZCB3aXRoaW4gdGhlIHRpbWUgbGltaXQgKHVuZXhwZWN0ZWQpCiAgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCBmbHVzaGluZyBmcm9tIGNvbXBsZXRpb24gKHVuZXhwZWN0ZWQpCiAgICAgICovCkBAIC00OTUsMTMgKzU0NCwyNiBAQAogICAgIC8qKgogICAgICAqIFN0YXJ0cyB0aGUgY29tcG9uZW50LgogICAgICAqCi0gICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gc3RvcHBlZCBzdGF0ZS4KKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBzdG9wcGVkIHN0YXRlLCBhcyB3ZWxsIGFzIGR1cmluZyB0aGUgdHJpcHBlZCBzdGF0ZS4KKyAgICAgKgorICAgICAqIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgQzJfT0ssIHRoZSBjb21wb25lbnQgc2hhbGwgYmUgaW4gdGhlIHJ1bm5pbmcgc3RhdGUuCisgICAgICogSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBDMl9CQURfU1RBVEUgb3IgQzJfRFVQTElDQVRFLCBubyBzdGF0ZSBjaGFuZ2UgaXMgZXhwZWN0ZWQgYXMgYQorICAgICAqIHJlc3BvbnNlIHRvIHRoaXMgY2FsbC4KKyAgICAgKiBPdGhlcndpc2UsIHRoZSBjb21wb25lbnQgc2hhbGwgYmUgaW4gdGhlIHN0b3BwZWQgc3RhdGUuCisgICAgICoKKyAgICAgKiBcbm90ZSBJZiBhIGNvbXBvbmVudCBpcyBpbiB0aGUgdHJpcHBlZCBzdGF0ZSBhbmQgc3RhcnQoKSBpcyBjYWxsZWQgd2hpbGUgdGhlIGNvbXBvbmVudAorICAgICAqIGNvbmZpZ3VyYXRpb24gc3RpbGwgcmVzdWx0cyBpbiBhIHRyaXAsIHN0YXJ0IHNoYWxsIHN1Y2NlZWQgYW5kIGEgbmV3IG9uVHJpcHBlZCBjYWxsYmFjaworICAgICAqIHNob3VsZCBiZSB1c2VkIHRvIGNvbW11bmljYXRlIHRoZSBjb25maWd1cmF0aW9uIGNvbmZsaWN0IHRoYXQgcmVzdWx0cyBpbiB0aGUgbmV3IHRyaXAuCiAgICAgICoKICAgICAgKiBcdG9kbyBUaGlzIG1ldGhvZCBNVVNUIHJldHVybiB3aXRoaW4gNTAwbXMuIFNlZW1zIHRoaXMgc2hvdWxkIGJlIGFibGUgdG8gcmV0dXJuIHF1aWNrbHksIGFzCiAgICAgICogdGhlcmUgYXJlIG5vIGltbWVkaWF0ZSBndWFyYW50ZWVzLiBUaG91Z2ggdGhlcmUgYXJlIGd1YXJhbnRlZXMgZm9yIHJlc3BvbnNpdmVuZXNzIGltbWVkaWF0ZWx5CiAgICAgICogYWZ0ZXIgc3RhcnQgcmV0dXJucy4KICAgICAgKgotICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBjb21wb25lbnQgaGFzIHN0YXJ0ZWQgc3VjY2Vzc2Z1bGx5CisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGNvbXBvbmVudCBoYXMgc3RhcnRlZCAob3IgcmVzdW1lZCkgc3VjY2Vzc2Z1bGx5CisgICAgICogXHJldHZhbCBDMl9EVVBMSUNBVEUgd2hlbiBjYWxsZWQgZHVyaW5nIGFub3RoZXIgc3RhcnQgY2FsbCBmcm9tIGFub3RoZXIgdGhyZWFkCisgICAgICogXHJldHZhbCBDMl9CQURfU1RBVEUgd2hlbiBjYWxsZWQgaW4gYW55IHN0YXRlIG90aGVyIHRoYW4gdGhlIHN0b3BwZWQgc3RhdGUgb3IgdHJpcHBlZCBzdGF0ZSwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRpbmcgd2hlbiBjYWxsZWQgZHVyaW5nIGFub3RoZXIgc3RhdGUgY2hhbmdlIGNhbGwgZnJvbSBhbm90aGVyCisgICAgICogICAgICAgICAgICAgICAgICAgICAgdGhyZWFkICh1c2VyIGVycm9yKQogICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIHN0YXJ0IHRoZSBjb21wb25lbnQKICAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCB0aGUgY29tcG9uZW50IGNvdWxkIG5vdCBiZSBzdGFydGVkIHdpdGhpbiB0aGUgdGltZSBsaW1pdCAodW5leHBlY3RlZCkKICAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHN0YXJ0aW5nIHRoZSBjb21wb25lbnQgKHVuZXhwZWN0ZWQpCkBAIC01MTUsMzkgKzU3Nyw1NiBAQAogICAgICAqCiAgICAgICogVGhpcyBtZXRob2QgTVVTVCByZXR1cm4gd2l0aGluZyA1MDBtcy4KICAgICAgKgotICAgICAqIFVwb24gdGhpcyBjYWxsLCBhbGwgcGVuZGluZyB3b3JrIFNIQUxMIGJlIGFiYW5kb25lZC4KKyAgICAgKiBVcG9uIHRoaXMgY2FsbCwgYWxsIHBlbmRpbmcgd29yayBTSEFMTCBiZSBhYmFuZG9uZWQgYW5kIGFsbCBidWZmZXIgcmVmZXJlbmNlcyBTSEFMTCBiZQorICAgICAqIHJlbGVhc2VkLgorICAgICAqIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgQzJfQkFEX1NUQVRFIG9yIEMyX0RVUExJQ0FURSwgbm8gc3RhdGUgY2hhbmdlIGlzIGV4cGVjdGVkIGFzIGEKKyAgICAgKiByZXNwb25zZSB0byB0aGlzIGNhbGwuCisgICAgICogRm9yIGFsbCBvdGhlciByZXR1cm4gdmFsdWVzLCB0aGUgY29tcG9uZW50IHNoYWxsIGJlIGluIHRoZSBzdG9wcGVkIHN0YXRlLgogICAgICAqCiAgICAgICogXHRvZG8gc2hvdWxkIHRoaXMgcmV0dXJuIGNvbXBsZXRlZCB3b3JrLCBzaW5jZSBjbGllbnQgd2lsbCBqdXN0IGZyZWUgaXQ/IFBlcmhhcHMganVzdCB0bwogICAgICAqIHZlcmlmeSBhY2NvdW50aW5nLgogICAgICAqCiAgICAgICogVGhpcyBkb2VzIG5vdCBhbHRlciBhbnkgc2V0dGluZ3MgYW5kIHR1bmluZ3MgdGhhdCBtYXkgaGF2ZSByZXN1bHRlZCBpbiBhIHRyaXBwZWQgc3RhdGUuCiAgICAgICogKElzIHRoaXMgbWF0ZXJpYWwgZ2l2ZW4gdGhlIGRlZmluaXRpb24/IFBlcmhhcHMgaW4gY2FzZSB3ZSB3YW50IHRvIHN0YXJ0IGFnYWluLikKKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBjb21wb25lbnQgaGFzIHN0YXJ0ZWQgc3VjY2Vzc2Z1bGx5CisgICAgICogXHJldHZhbCBDMl9EVVBMSUNBVEUgd2hlbiBjYWxsZWQgZHVyaW5nIGFub3RoZXIgc3RvcCBjYWxsIGZyb20gYW5vdGhlciB0aHJlYWQKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9TVEFURSB3aGVuIGNhbGxlZCBpbiBhbnkgc3RhdGUgb3RoZXIgdGhhbiB0aGUgcnVubmluZyBzdGF0ZSwgaW5jbHVkaW5nIHdoZW4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBjYWxsZWQgZHVyaW5nIGFub3RoZXIgc3RhdGUgY2hhbmdlIGNhbGwgZnJvbSBhbm90aGVyIHRocmVhZCAodXNlciBlcnJvcikKKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCB0aGUgY29tcG9uZW50IGNvdWxkIG5vdCBiZSBzdG9wcGVkIHdpdGhpbiB0aGUgdGltZSBsaW1pdCAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHN0b3BwaW5nIHRoZSBjb21wb25lbnQgKHVuZXhwZWN0ZWQpCiAgICAgICovCiAgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBzdG9wKCkgPSAwOwogCiAgICAgLyoqCiAgICAgICogUmVzZXRzIHRoZSBjb21wb25lbnQuCiAgICAgICoKLSAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBhbGwgKGluY2x1ZGluZyB0cmlwcGVkKSBzdGF0ZS4KKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBhbGwgKGluY2x1ZGluZyB0cmlwcGVkKSBzdGF0ZXMgb3RoZXIgdGhhbiByZWxlYXNlZC4KICAgICAgKgogICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGR1cmluZyBhbnkgb3RoZXIgYmxvY2tpbmcgY2FsbC4KICAgICAgKgogICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgcmV0dXJuIHdpdGhpbmcgNTAwbXMuCiAgICAgICoKLSAgICAgKiBBZnRlciB0aGlzIGNhbGwgcmV0dXJucyBhbGwgd29yayBpcy9tdXN0IGJlIGFiYW5kb25lZCwgYWxsIHJlZmVyZW5jZXMgc2hvdWxkIGJlIHJlbGVhc2VkLgorICAgICAqIEFmdGVyIHRoaXMgY2FsbCByZXR1cm5zIGFsbCB3b3JrIFNIQUxMIGJlIGFiYW5kb25lZCwgYWxsIGJ1ZmZlciByZWZlcmVuY2VzIFNIQUxMIGJlIHJlbGVhc2VkLgorICAgICAqIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgQzJfQkFEX1NUQVRFIG9yIEMyX0RVUExJQ0FURSwgbm8gc3RhdGUgY2hhbmdlIGlzIGV4cGVjdGVkIGFzIGEKKyAgICAgKiByZXNwb25zZSB0byB0aGlzIGNhbGwuCisgICAgICogRm9yIGFsbCBvdGhlciByZXR1cm4gdmFsdWVzLCB0aGUgY29tcG9uZW50IHNoYWxsIGJlIGluIHRoZSBzdG9wcGVkIHN0YXRlLgogICAgICAqCiAgICAgICogXHRvZG8gc2hvdWxkIHRoaXMgcmV0dXJuIGNvbXBsZXRlZCB3b3JrLCBzaW5jZSBjbGllbnQgd2lsbCBqdXN0IGZyZWUgaXQ/IEFsc28sIGlmIGl0IHVuYmxvY2tzCiAgICAgICogYSBzdG9wLCB3aGVyZSBzaG91bGQgY29tcGxldGVkIHdvcmsgYmUgcmV0dXJuZWQ/CiAgICAgICoKICAgICAgKiBUaGlzIGJyaW5ncyBzZXR0aW5ncyBiYWNrIHRvIHRoZWlyIGRlZmF1bHQgLSAiZ3VhcmFudGVlaW5nIiBubyB0cmlwcGVkIHNwYWNlLgogICAgICAqCi0gICAgICogXHRvZG8gcmVjbGFpbSBzdXBwb3J0IC0gaXQgc2VlbXMgdGhhdCBzaW5jZSBvd25lcnNoaXAgaXMgcGFzc2VkLCB0aGlzIHdpbGwgYWxsb3cgcmVjbGFpbWluZyBzdHVmZi4KKyAgICAgKiBcdG9kbyByZWNsYWltIHN1cHBvcnQgLSBpdCBzZWVtcyB0aGF0IHNpbmNlIG93bmVyc2hpcCBpcyBwYXNzZWQsIHRoaXMgd2lsbCBhbGxvdyByZWNsYWltaW5nCisgICAgICogc3R1ZmYuCiAgICAgICoKICAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgY29tcG9uZW50IGhhcyBiZWVuIHJlc2V0CisgICAgICogXHJldHZhbCBDMl9EVVBMSUNBVEUgd2hlbiBjYWxsZWQgZHVyaW5nIGFub3RoZXIgcmVzZXQgY2FsbCBmcm9tIGFub3RoZXIgdGhyZWFkCisgICAgICogXHJldHZhbCBDMl9CQURfU1RBVEUgd2hlbiBjYWxsZWQgaW4gdGhlIHJlbGVhc2VkIHN0YXRlCiAgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIGNvbXBvbmVudCBjb3VsZCBub3QgYmUgcmVzZXQgd2l0aGluIHRoZSB0aW1lIGxpbWl0ICh1bmV4cGVjdGVkKQogICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgcmVzZXR0aW5nIHRoZSBjb21wb25lbnQgKHVuZXhwZWN0ZWQpCiAgICAgICovCi0gICAgdmlydHVhbCB2b2lkIHJlc2V0KCkgPSAwOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcmVzZXQoKSA9IDA7CiAKICAgICAvKioKICAgICAgKiBSZWxlYXNlcyB0aGUgY29tcG9uZW50LgpAQCAtNTU3LDExICs2MzYsMTIgQEAKICAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIHJldHVybiB3aXRoaW5nIDUwMG1zLiBVcG9uIHJldHVybiBhbGwgcmVmZXJlbmNlcyBzaGFsbCBiZSBhYmFuZG9uZWQuCiAgICAgICoKICAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgY29tcG9uZW50IGhhcyBiZWVuIHJlbGVhc2VkCisgICAgICogXHJldHZhbCBDMl9EVVBMSUNBVEUgdGhlIGNvbXBvbmVudCBpcyBhbHJlYWR5IHJlbGVhc2VkCiAgICAgICogXHJldHZhbCBDMl9CQURfU1RBVEUgdGhlIGNvbXBvbmVudCBpcyBydW5uaW5nCiAgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIGNvbXBvbmVudCBjb3VsZCBub3QgYmUgcmVsZWFzZWQgd2l0aGluIHRoZSB0aW1lIGxpbWl0ICh1bmV4cGVjdGVkKQogICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgcmVsZWFzaW5nIHRoZSBjb21wb25lbnQgKHVuZXhwZWN0ZWQpCiAgICAgICovCi0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2UoKSA9IDA7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCByZWxlYXNlKCkgPSAwOwogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgaW50ZXJmYWNlIGZvciB0aGlzIGNvbXBvbmVudC4KQEAgLTgxMiw0NSArODkyLDYgQEAKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qIGNvbnN0PiAmcGFyYW1zLAogICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KiBjb25zdCBmYWlsdXJlcykgPSAwOwogCi0gICAgLyoqCi0gICAgICogQXRvbWljYWxseSBzZXRzIGEgc2V0IG9mIHN5c3RlbS13aWRlIHBhcmFtZXRlcnMuCi0gICAgICoKLSAgICAgKiBcbm90ZSBUaGVyZSBhcmUgbm8gc2V0dGFibGUgc3lzdGVtLXdpZGUgcGFyYW1ldGVycyBkZWZpbmVkIHRodXMgZmFyLCBidXQgbWF5IGJlIGFkZGVkIGluIHRoZQotICAgICAqIGZ1dHVyZS4KLSAgICAgKgotICAgICAqIFRoZSBjb21wb25lbnQgc3RvcmUgU0hBTEwgdXBkYXRlIGFsbCBzdXBwb3J0ZWQgY29uZmlndXJhdGlvbiBhdCBiZXN0IGVmZm9ydChUQkQpCi0gICAgICogKHVubGVzcyBjb25maWd1cmVkIG90aGVyd2lzZSkgYW5kIHNraXAgdW5zdXBwb3J0ZWQgb25lcy4gSWYgYW55IGVycm9ycyBhcmUgZW5jb3VudGVyZWQKLSAgICAgKiAob3RoZXIgdGhhbiB1bnN1cHBvcnRlZCBwYXJhbWV0ZXJzKSwgdGhlIGNvbmZpZ3VyYXRpb24gU0hBTEwgYmUgYWJvcnRlZCBhcyBpZiBpdCBkaWQgbm90Ci0gICAgICogaGFwcGVuLgotICAgICAqCi0gICAgICogXG5vdGUgUGFyYW1ldGVyIHR1bmluZyBET0VTIGRlcGVuZCBvbiB0aGUgb3JkZXIgb2YgdGhlIHR1bmluZyBwYXJhbWV0ZXJzLiBFLmcuIHNvbWUgcGFyYW1ldGVyCi0gICAgICogdXBkYXRlIG1heSBhbGxvdyBzb21lIHN1YnNlcXVlbnQgcGFyYW1ldGVyIHVwZGF0ZS4KLSAgICAgKgotICAgICAqIFRoaXMgbWV0aG9kIG1heSBiZSBtb21lbnRhcmlseSBibG9ja2luZywgYnV0IE1VU1QgcmV0dXJuIHdpdGhpbiA1bXMuCi0gICAgICoKLSAgICAgKiBccGFyYW0gcGFyYW1zW2luLG91dF0gYSBsaXN0IG9mIHBhcmFtZXRlciB1cGRhdGVzLiBUaGVzZSB3aWxsIGJlIHVwZGF0ZWQgdG8gdGhlIGFjdHVhbAotICAgICAqICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgdmFsdWVzIGFmdGVyIHRoZSB1cGRhdGVzICh0aGlzIGlzIGJlY2F1c2UgdHVuaW5nIGlzIHBlcmZvcm1lZAotICAgICAqICAgICAgICAgICAgICAgICAgICAgICBhdCBiZXN0IGVmZm9ydCkuCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgIFx0b2RvIHBhcmFtcyB0aGF0IGNvdWxkIG5vdCBiZSB1cGRhdGVkIGFyZSBub3QgbWFya2VkIGhlcmUsIHNvIGFyZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICBjb25mdXNpbmcgLSBhcmUgdGhleSAiZXhpc3RpbmciIHZhbHVlcyBvciBpbnRlbmRlZCB0byBiZSBjb25maWd1cmVkCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcz8KLSAgICAgKiBccGFyYW0gZmFpbHVyZXNbb3V0XSAgYSBsaXN0IG9mIHBhcmFtZXRlciBmYWlsdXJlcwotICAgICAqCi0gICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgYWxsIHBhcmFtZXRlcnMgY291bGQgYmUgdXBkYXRlZCBzdWNjZXNzZnVsbHkKLSAgICAgKiBccmV0dmFsIEMyX0JBRF9JTkRFWCBhbGwgc3VwcG9ydGVkIHBhcmFtZXRlcnMgY291bGQgYmUgdXBkYXRlZCBzdWNjZXNzZnVsbHksIGJ1dCBzb21lCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyB3ZXJlIG5vdCBzdXBwb3J0ZWQKLSAgICAgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSBzb21lIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIGNvdWxkIG5vdCBiZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseSBiZWNhdXNlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgdGhleSBjb250YWluZWQgdW5zdXBwb3J0ZWQgdmFsdWVzLiBUaGVzZSBhcmUgcmV0dXJuZWQgaW4gfGZhaWx1cmVzfC4KLSAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBzb21lIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIGNvdWxkIG5vdCBiZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseSBiZWNhdXNlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgdGhleSBjb250YWluZWQgdW5zdXBwb3J0ZWQgdmFsdWVzLCBidXQgY291bGQgbm90IGFsbG9jYXRlIGEgZmFpbHVyZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCBmb3IgdGhlbS4KLSAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSB1cGRhdGUgb2YgdGhlIHBhcmFtZXRlcnMKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodW5leHBlY3RlZCkKLSAgICAgKi8KLSAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNvbW1pdF9zbSgKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qIGNvbnN0PiAmcGFyYW1zLAotICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KiBjb25zdCBmYWlsdXJlcykgPSAwOwotCiAgICAgLy8gUkVGTEVDVElPTiBNRUNIQU5JU00gKFVTRUQgRk9SIEVYVEVOU0lPTikKICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIApAQCAtODg4LDE0ICs5MjksMTQgQEAKICAgICAgKiBhcyBhIHN0YXR1cyBmb3IgZWFjaCBmaWVsZC4gU3RvcmUgc2hhbGwgcHJvY2VzcyBhbGwgZmllbGRzIHF1ZXJpZWQgZXZlbiBpZiBzb21lIHF1ZXJpZXMKICAgICAgKiBmYWlsLgogICAgICAqCi0gICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxbXMuCisgICAgICogVGhpcyBtZXRob2QgbWF5IGJlIG1vbWVudGFyaWx5IGJsb2NraW5nLCBidXQgTVVTVCByZXR1cm4gd2l0aGluIDVtcy4KICAgICAgKgogICAgICAqIFxwYXJhbVtpbiBvdXRdIGZpZWxkcyBhIHZlY3RvciBvZiBmaWVsZHMgZGVzY3JpcHRvciBzdHJ1Y3R1cmVzLgogICAgICAqCiAgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIG9wZXJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgogICAgICAqIFxyZXR2YWwgQzJfQkFEX0lOREVYIGF0IGxlYXN0IG9uZSBmaWVsZCB3YXMgbm90IHJlY29nbml6ZWQgYXMgYSBjb21wb25lbnQgc3RvcmUgZmllbGQKICAgICAgKi8KLSAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkVmFsdWVzX25iKAorICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRWYWx1ZXNfc20oCiAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+ICZmaWVsZHMpIGNvbnN0ID0gMDsKIAogICAgIHZpcnR1YWwgfkMyQ29tcG9uZW50U3RvcmUoKSA9IGRlZmF1bHQ7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlYzIvaW5jbHVkZS9TaW1wbGVDMkNvbXBvbmVudC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWMyL2luY2x1ZGUvU2ltcGxlQzJDb21wb25lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGI4MzgyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWMyL2luY2x1ZGUvU2ltcGxlQzJDb21wb25lbnQuaApAQCAtMCwwICsxLDE1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU0lNUExFX0MyX0NPTVBPTkVOVF9IXworI2RlZmluZSBTSU1QTEVfQzJfQ09NUE9ORU5UX0hfCisKKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPHRocmVhZD4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTXV0ZXhlZC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFNpbXBsZUMyQ29tcG9uZW50CisgICAgICAgIDogcHVibGljIEMyQ29tcG9uZW50LCBwdWJsaWMgc3RkOjplbmFibGVfc2hhcmVkX2Zyb21fdGhpczxTaW1wbGVDMkNvbXBvbmVudD4geworcHVibGljOgorICAgIFNpbXBsZUMyQ29tcG9uZW50KAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiAmaW50Zik7CisgICAgdmlydHVhbCB+U2ltcGxlQzJDb21wb25lbnQoKSA9IGRlZmF1bHQ7CisKKyAgICAvLyBDMkNvbXBvbmVudAorICAgIC8vIEZyb20gQzJDb21wb25lbnQKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHNldExpc3RlbmVyX3ZiKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPExpc3RlbmVyPiAmbGlzdGVuZXIsIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2spIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVldWVfbmIoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiogY29uc3QgaXRlbXMpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgYW5ub3VuY2VfbmIoY29uc3Qgc3RkOjp2ZWN0b3I8QzJXb3JrT3V0bGluZT4gJml0ZW1zKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGZsdXNoX3NtKAorICAgICAgICAgICAgZmx1c2hfbW9kZV90IG1vZGUsIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4qIGNvbnN0IGZsdXNoZWRXb3JrKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGRyYWluX25iKGRyYWluX21vZGVfdCBtb2RlKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHN0YXJ0KCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBzdG9wKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCByZXNldCgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcmVsZWFzZSgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBpbnRmKCkgb3ZlcnJpZGU7CisKKyAgICAvLyBmb3IgdGhyZWFkCisgICAgaW5saW5lIGJvb2wgZXhpdFJlcXVlc3RlZCgpIHsgcmV0dXJuIG1FeGl0UmVxdWVzdGVkOyB9CisgICAgdm9pZCBwcm9jZXNzUXVldWUoKTsKKworcHJvdGVjdGVkOgorICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgaW50ZXJuYWwgc3RhdGVzIG9mIHRoZSBjb21wb25lbnQgYWNjb3JkaW5nIHRvIHRoZSBjb25maWcgc2V0CisgICAgICogaW4gdGhlIGludGVyZmFjZS4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBkdXJpbmcgc3RhcnQoKSwgYnV0IG9ubHkgYXQgdGhlIGZpcnN0IGludm9jYXRpb24gb3IKKyAgICAgKiBhZnRlciByZXNldCgpLgorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3Qgb25Jbml0KCkgPSAwOworCisgICAgLyoqCisgICAgICogU3RvcCB0aGUgY29tcG9uZW50LgorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3Qgb25TdG9wKCkgPSAwOworCisgICAgLyoqCisgICAgICogUmVzZXQgdGhlIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgb25SZXNldCgpID0gMDsKKworICAgIC8qKgorICAgICAqIFJlbGVhc2UgdGhlIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgb25SZWxlYXNlKCkgPSAwOworCisgICAgLyoqCisgICAgICogRmx1c2ggdGhlIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBEcmFpbiB0aGUgY29tcG9uZW50LgorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3Qgb25EcmFpbl9uYigpID0gMDsKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIGdpdmVuIHdvcmsgYW5kIGZpbmlzaCBwZW5kaW5nIHdvcmsgdXNpbmcgZmluaXNoKCkuCisgICAgICoKKyAgICAgKiBccGFyYW1baW4sb3V0XSAgIHdvcmsgICAgdGhlIHdvcmsgdG8gcHJvY2VzcworICAgICAqIFxwYXJhbVtpbl0gICAgICAgcG9vbCAgICB0aGUgcG9vbCB0byB1c2UgZm9yIGFsbG9jYXRpbmcgb3V0cHV0IGJsb2Nrcy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgdHJ1ZSAgICAgICAgICAgICB8d29ya3wgaXMgZG9uZSBhbmQgcmVhZHkgZm9yIHJldHVybiB0byBjbGllbnQKKyAgICAgKiBccmV0dmFsIGZhbHNlICAgICAgICAgICAgbW9yZSBkYXRhIGlzIG5lZWRlZCBmb3IgdGhlIHx3b3JrfCB0byBiZSBkb25lOworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrIHx3b3JrfCBhcyBwZW5kaW5nLgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IHBvb2wpID0gMDsKKworICAgIC8vIGZvciBkZXJpdmVkIGNsYXNzZXMKKyAgICAvKioKKyAgICAgKiBGaW5pc2ggcGVuZGluZyB3b3JrLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2Qgd2lsbCByZXRyaWV2ZSB0aGUgcGVuZGluZyB3b3JrIGFjY29yZGluZyB0byB8ZnJhbWVJbmRleHwgYW5kCisgICAgICogZmVlZCB0aGUgd29yayBpbnRvIHxmaWxsV29ya3wgZnVuY3Rpb24uIHxmaWxsV29ya3wgbXVzdCBiZQorICAgICAqICJub24tYmxvY2tpbmciLiBPbmNlIHxmaWxsV29ya3wgcmV0dXJucyB0aGUgZmlsbGVkIHdvcmsgd2lsbCBiZSByZXR1cm5lZAorICAgICAqIHRvIHRoZSBjbGllbnQuCisgICAgICoKKyAgICAgKiBccGFyYW1baW5dICAgZnJhbWVJbmRleCAgICB0aGUgaW5kZXggb2YgdGhlIHBlbmRpbmcgd29yaworICAgICAqIFxwYXJhbVtpbl0gICBmaWxsV29yayAgICAgIHRoZSBmdW5jdGlvbiB0byBmaWxsIHRoZSByZXRyaWV2ZWQgd29yay4KKyAgICAgKi8KKyAgICB2b2lkIGZpbmlzaCh1aW50NjRfdCBmcmFtZUluZGV4LCBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJik+IGZpbGxXb3JrKTsKKworcHJpdmF0ZToKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IG1JbnRmOworICAgIHN0ZDo6YXRvbWljX2Jvb2wgbUV4aXRSZXF1ZXN0ZWQ7CisKKyAgICBlbnVtIHsKKyAgICAgICAgVU5JTklUSUFMSVpFRCwKKyAgICAgICAgU1RPUFBFRCwKKyAgICAgICAgUlVOTklORywKKyAgICB9OworCisgICAgc3RydWN0IEV4ZWNTdGF0ZSB7CisgICAgICAgIEV4ZWNTdGF0ZSgpIDogbVN0YXRlKFVOSU5JVElBTElaRUQpIHt9CisKKyAgICAgICAgaW50IG1TdGF0ZTsKKyAgICAgICAgc3RkOjp0aHJlYWQgbVRocmVhZDsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50OjpMaXN0ZW5lcj4gbUxpc3RlbmVyOworICAgIH07CisgICAgTXV0ZXhlZDxFeGVjU3RhdGU+IG1FeGVjU3RhdGU7CisKKyAgICBzdHJ1Y3QgV29ya1F1ZXVlIHsKKyAgICAgICAgQ29uZGl0aW9uIG1Db25kaXRpb247CisgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gbVF1ZXVlOworICAgICAgICB1aW50NjRfdCBtR2VuZXJhdGlvbjsKKyAgICB9OworICAgIE11dGV4ZWQ8V29ya1F1ZXVlPiBtV29ya1F1ZXVlOworCisgICAgdHlwZWRlZiBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDY0X3QsIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBQZW5kaW5nV29yazsKKyAgICBNdXRleGVkPFBlbmRpbmdXb3JrPiBtUGVuZGluZ1dvcms7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IG1PdXRwdXRCbG9ja1Bvb2w7CisKKyAgICBTaW1wbGVDMkNvbXBvbmVudCgpID0gZGVsZXRlOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBTSU1QTEVfQzJfQ09NUE9ORU5UX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlYzIvdGVzdHMvQzJDb21wb25lbnRJbnRlcmZhY2VfdGVzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlYzIvdGVzdHMvQzJDb21wb25lbnRJbnRlcmZhY2VfdGVzdC5jcHAKaW5kZXggMDYxM2I1YS4uODMzM2ZiOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWMyL3Rlc3RzL0MyQ29tcG9uZW50SW50ZXJmYWNlX3Rlc3QuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMi90ZXN0cy9DMkNvbXBvbmVudEludGVyZmFjZV90ZXN0LmNwcApAQCAtMTA4LDcgKzEwOCw3IEBACiAgICAgICAgICAgICA6IG5hbWUobmFtZV8pLCByZXN1bHQocmVzdWx0Xykge30KICAgICB9OwogCi0gICAgLy8gcXVlcnlPblN0YWNrKCkgYW5kIHF1ZXJ5b25IZWFwKCkgYm90aCBjYWxsIGFuIGludGVyZmFjZSdzIHF1ZXJ5X25iKCkgYW5kCisgICAgLy8gcXVlcnlPblN0YWNrKCkgYW5kIHF1ZXJ5b25IZWFwKCkgYm90aCBjYWxsIGFuIGludGVyZmFjZSdzIHF1ZXJ5X3ZiKCkgYW5kCiAgICAgLy8gY2hlY2sgaWYgYSBjb21wb25lbnQgaGFzIGEgcGFyYW1ldGVyIHdob3NlIHR5cGUgaXMgfFR8LgogICAgIC8vIElmIGEgY29tcG9uZW50IGhhcywgdGhlIHZhbHVlIHNob3VsZCBiZSBjb3BpZWQgaW50byBhbiBhcmd1bWVudCwgdGhhdCBpcwogICAgIC8vIHxwfCBpbiBxdWVyeU9uU3RhY2soKSBhbmQgfGhlYXBQYXJhbXN8IGluIHF1ZXJ5T25IZWFwKCkuCkBAIC0xMzYsOCArMTM2LDggQEAKICAgICAvLyAiVW5zdXBwb3J0IiBtZWFucyBoZXJlIGEgY29tcG9uZW50IGRvZXNuJ3QgaGF2ZSB0aGUgcGFyYW1ldGVyLgogICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIHF1ZXJ5VW5zdXBwb3J0ZWRQYXJhbSgpOwogCi0gICAgLy8gRXhlY3V0ZSBhbiBpbnRlcmZhY2UncyBjb25maWdfbmIoKS4gfFR8IGlzIGEgc2luZ2xlIHBhcmFtZXRlciB0eXBlLCBub3Qgc3RkOjp2ZWN0b3IuCi0gICAgLy8gY29uZmlnKCkgY3JlYXRlcyBzdGQ6OnZlY3RvcjxDMlBhcmFtICpjb25zdD4ge3B9IGFuZCBwYXNzZXMgaXQgdG8gY29uZmlnX25iKCkuCisgICAgLy8gRXhlY3V0ZSBhbiBpbnRlcmZhY2UncyBjb25maWdfdmIoKS4gfFR8IGlzIGEgc2luZ2xlIHBhcmFtZXRlciB0eXBlLCBub3Qgc3RkOjp2ZWN0b3IuCisgICAgLy8gY29uZmlnKCkgY3JlYXRlcyBzdGQ6OnZlY3RvcjxDMlBhcmFtICpjb25zdD4ge3B9IGFuZCBwYXNzZXMgaXQgdG8gY29uZmlnX3ZiKCkuCiAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiAgICAgYzJfc3RhdHVzX3QKICAgICBjb25maWcoVCAqY29uc3QgcCwKQEAgLTE5Niw3ICsxOTYsNyBAQAogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gYzJfc3RhdHVzX3QgQzJDb21wSW50ZlRlc3Q6OnF1ZXJ5T25TdGFjayhUICpjb25zdCBwKSB7CiAgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSAqY29uc3Q+IHN0YWNrUGFyYW1ze3B9OwotICAgIHJldHVybiBtSW50Zi0+cXVlcnlfbmIoc3RhY2tQYXJhbXMsIHt9LCBudWxscHRyKTsKKyAgICByZXR1cm4gbUludGYtPnF1ZXJ5X3ZiKHN0YWNrUGFyYW1zLCB7fSwgQzJfRE9OVF9CTE9DSywgbnVsbHB0cik7CiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgpAQCAtMjA2LDcgKzIwNiw3IEBACiAgICAgaWYgKHAuZm9yU3RyZWFtKCkpIHsKICAgICAgICAgaW5kZXggfD0gKChwLnN0cmVhbSgpIDw8IDE3KSAmIDB4MDFGRTAwMDApIHwgMHgwMjAwMDAwMDsKICAgICB9Ci0gICAgcmV0dXJuIG1JbnRmLT5xdWVyeV9uYih7fSwge2luZGV4fSwgaGVhcFBhcmFtcyk7CisgICAgcmV0dXJuIG1JbnRmLT5xdWVyeV92Yih7fSwge2luZGV4fSwgQzJfRE9OVF9CTE9DSywgaGVhcFBhcmFtcyk7CiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIEMyQ29tcEludGZUZXN0OjpnZXRWYWx1ZShUICpjb25zdCBwYXJhbSkgewpAQCAtMjYxLDcgKzI2MSw3IEBACiBjMl9zdGF0dXNfdCBDMkNvbXBJbnRmVGVzdDo6Y29uZmlnKAogICAgICAgICBUICpjb25zdCBwLCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gKmNvbnN0IGZhaWx1cmVzKSB7CiAgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSAqY29uc3Q+IHBhcmFtc3twfTsKLSAgICByZXR1cm4gbUludGYtPmNvbmZpZ19uYihwYXJhbXMsIGZhaWx1cmVzKTsKKyAgICByZXR1cm4gbUludGYtPmNvbmZpZ192YihwYXJhbXMsIEMyX0RPTlRfQkxPQ0ssIGZhaWx1cmVzKTsKIH0KIAogLy8gQ3JlYXRlIGEgbmV3IHBhcmFtZXRlciBjb3BpZWQgZnJvbSB8cHwuCkBAIC0yNzksOCArMjc5LDggQEAKICAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtICpjb25zdD4gcGFyYW1ze3AuZ2V0KCl9OwogICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKIAotICAgIC8vIGNvbmZpZ19uYiBzaG91bGQgYmUgZmFpbGVkIGJlY2F1c2UgYSBwYXJhbWV0ZXIgaXMgcmVhZC1vbmx5LgotICAgIEFTU0VSVF9FUShDMl9CQURfVkFMVUUsIG1JbnRmLT5jb25maWdfbmIocGFyYW1zLCAmZmFpbHVyZXMpKTsKKyAgICAvLyBjb25maWdfdmIgc2hvdWxkIGJlIGZhaWxlZCBiZWNhdXNlIGEgcGFyYW1ldGVyIGlzIHJlYWQtb25seS4KKyAgICBBU1NFUlRfRVEoQzJfQkFEX1ZBTFVFLCBtSW50Zi0+Y29uZmlnX3ZiKHBhcmFtcywgQzJfRE9OVF9CTE9DSywgJmZhaWx1cmVzKSk7CiAgICAgQVNTRVJUX0VRKDF1LCBmYWlsdXJlcy5zaXplKCkpOwogICAgIEVYUEVDVF9FUShDMlNldHRpbmdSZXN1bHQ6OlJFQURfT05MWSwgZmFpbHVyZXNbMF0tPmZhaWx1cmUpOwogfQpAQCAtMjkxLDEzICsyOTEsMTMgQEAKIAogICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0gKmNvbnN0PiBwYXJhbXN7cC5nZXQoKX07CiAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOwotICAgIC8vIEluIG1vc3QgY2FzZXMsIGNvbmZpZ19uYiByZXR1cm4gQzJfT0sgYW5kIHRoZSBwYXJhbWV0ZXIncyB2YWx1ZSBzaG91bGQgYmUgY2hhbmdlZAorICAgIC8vIEluIG1vc3QgY2FzZXMsIGNvbmZpZ192YiByZXR1cm4gQzJfT0sgYW5kIHRoZSBwYXJhbWV0ZXIncyB2YWx1ZSBzaG91bGQgYmUgY2hhbmdlZAogICAgIC8vIHRvIHxuZXdQYXJhbXwsIHdoaWNoIGlzIGNvbmZpcm1lZCBpbiBhIGNhbGxlciBvZiBjb25maWdXcml0YWJsZVBhcmFtVmFsdWVWYWx1ZSgpLgogICAgIC8vIEhvd2V2ZXIsIHRoaXMgY2FuIHJldHVybiB+fn5+IGFuZCB0aGUgcGFyYW1ldGVyJ3MgdmFsdWVzIGlzIG5vdCBjaGFuZ2VkLAogICAgIC8vIGJlY2F1c2UgdGhlcmUgbWF5IGJlIGRlcGVuZGVudCBsaW1pdGF0aW9ucyBiZXR3ZWVuIGZpZWxkcyBvciBiZXR3ZWVuIHBhcmFtZXRlcnMuCiAgICAgLy8gVE9ETyhoaXJvaCk6IEkgaGF2ZSB0byBmaWxsIHRoZSByZXR1cm4gdmFsdWUuIENvbW1lbnRzIGluIEMyQ29tcG9uZW50LmggZG9lc24ndCBtZW50aW9uCiAgICAgLy8gYWJvdXQgdGhlIHJldHVybiB2YWx1ZSB3aGVuIGNvbmZsaWN0IGhhcHBlbnMuIEkgc2V0IEMyX0JBRF9WQUxVRSB0byBpdCB0ZW1wb3JhcmlseSBub3cuCi0gICAgYzJfc3RhdHVzX3Qgc3RDb25maWcgPSBtSW50Zi0+Y29uZmlnX25iKHBhcmFtcywgJmZhaWx1cmVzKTsKKyAgICBjMl9zdGF0dXNfdCBzdENvbmZpZyA9IG1JbnRmLT5jb25maWdfdmIocGFyYW1zLCBDMl9ET05UX0JMT0NLLCAmZmFpbHVyZXMpOwogICAgIGlmIChzdENvbmZpZyA9PSBDMl9PSykgewogICAgICAgICBFWFBFQ1RfRVEoMHUsIGZhaWx1cmVzLnNpemUoKSk7CiAgICAgfSBlbHNlIHsKQEAgLTMxNCw5ICszMTQsOSBAQAogCiAgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSAqY29uc3Q+IHBhcmFtc3twLmdldCgpfTsKICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7Ci0gICAgLy8gQWx0aG91Z2ggYSBwYXJhbWV0ZXIgaXMgd3JpdGFibGUsIGNvbmZpZ19uYiBzaG91bGQgYmUgZmFpbGVkLAorICAgIC8vIEFsdGhvdWdoIGEgcGFyYW1ldGVyIGlzIHdyaXRhYmxlLCBjb25maWdfdmIgc2hvdWxkIGJlIGZhaWxlZCwKICAgICAvLyBiZWNhdXNlIGEgbmV3IHZhbHVlIGlzIGludmFsaWQuCi0gICAgQVNTRVJUX0VRKEMyX0JBRF9WQUxVRSwgbUludGYtPmNvbmZpZ19uYihwYXJhbXMsICZmYWlsdXJlcykpOworICAgIEFTU0VSVF9FUShDMl9CQURfVkFMVUUsIG1JbnRmLT5jb25maWdfdmIocGFyYW1zLCBDMl9ET05UX0JMT0NLLCAmZmFpbHVyZXMpKTsKICAgICBBU1NFUlRfRVEoMXUsIGZhaWx1cmVzLnNpemUoKSk7CiAgICAgRVhQRUNUX0VRKEMyU2V0dGluZ1Jlc3VsdDo6QkFEX1ZBTFVFLCBmYWlsdXJlc1swXS0+ZmFpbHVyZSk7CiB9CkBAIC01OTQsNyArNTk0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgQzJQYXJhbUZpZWxkKHBhcmFtLmdldCgpLCAmZmllbGRfdHlwZV9uYW1lXzo6ZmllbGRfbmFtZV8pKSBcCiAgICAgICAgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIEFTU0VSVF9FUShDMl9PSywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICBtSW50Zi0+cXVlcnlTdXBwb3J0ZWRWYWx1ZXNfbmIodmFsaWRWYWx1ZUluZm9zKSk7ICAgICBcCisgICAgICAgICAgICAgICAgICBtSW50Zi0+cXVlcnlTdXBwb3J0ZWRWYWx1ZXNfdmIodmFsaWRWYWx1ZUluZm9zLCBDMl9ET05UX0JMT0NLKSk7ICAgICBcCiAgICAgICAgIEFTU0VSVF9FUSgxdSwgdmFsaWRWYWx1ZUluZm9zLnNpemUoKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIHN0ZDo6dmVjdG9yPGRlY2x0eXBlKHBhcmFtLT5maWVsZF9uYW1lXyk+IHZhbGlkVmFsdWVzOyAgICAgICAgICBcCiAgICAgICAgIHN0ZDo6dmVjdG9yPGRlY2x0eXBlKHBhcmFtLT5maWVsZF9uYW1lXyk+IGludmFsaWRWYWx1ZXM7ICAgICAgICBcCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlYzIvdGVzdHMvQzJQYXJhbV90ZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMi90ZXN0cy9DMlBhcmFtX3Rlc3QuY3BwCmluZGV4IGE2ODhkMmMuLjA1ZjhhOTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMi90ZXN0cy9DMlBhcmFtX3Rlc3QuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMi90ZXN0cy9DMlBhcmFtX3Rlc3QuY3BwCkBAIC0yNDAzLDE5ICsyNDAzLDEzIEBACiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAotICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29tbWl0X3NtKAorICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29uZmlnX3ZiKAogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSogY29uc3Q+ICZwYXJhbXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAogICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KiBjb25zdCBmYWlsdXJlcykgb3ZlcnJpZGUgewogICAgICAgICAodm9pZClwYXJhbXM7CiAgICAgICAgICh2b2lkKWZhaWx1cmVzOwotICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNvbmZpZ19uYigKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qIGNvbnN0PiAmcGFyYW1zLAotICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KiBjb25zdCBmYWlsdXJlcykgb3ZlcnJpZGUgewotICAgICAgICAodm9pZClwYXJhbXM7Ci0gICAgICAgICh2b2lkKWZhaWx1cmVzOworICAgICAgICAodm9pZCltYXlCbG9jazsKICAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CiAgICAgfQogCkBAIC0yNDI0LDExICsyNDE4LDEzIEBACiAgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOwogICAgIH0KIAotICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlfbmIoCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeV92YigKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qIGNvbnN0PiAmc3RhY2tQYXJhbXMsCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmhlYXBQYXJhbUluZGljZXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAogICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiogY29uc3QgaGVhcFBhcmFtcykgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgICBmb3IgKEMyUGFyYW0qIGNvbnN0IHBhcmFtIDogc3RhY2tQYXJhbXMpIHsKKyAgICAgICAgICAgICh2b2lkKW1heUJsb2NrOwogICAgICAgICAgICAgaWYgKCEqcGFyYW0pIHsgLy8gcGFyYW0gaXMgYWxyZWFkeSBpbnZhbGlkIC0gcmVtZW1iZXIgaXQKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KQEAgLTI0OTAsOCArMjQ4NiwxMCBAQAogICAgICAgICB9CiAgICAgfTsKIAotICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRWYWx1ZXNfbmIoCi0gICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+ICZmaWVsZHMpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkVmFsdWVzX3ZiKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiAmZmllbGRzLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaykgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAodm9pZCltYXlCbG9jazsKICAgICAgICAgZm9yIChDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkgJnF1ZXJ5IDogZmllbGRzKSB7CiAgICAgICAgICAgICBpZiAocXVlcnkuZmllbGQgPT0gQzJQYXJhbUZpZWxkKCZtRG9tYWluSW5mbywgJkMyQ29tcG9uZW50RG9tYWluSW5mbzo6bVZhbHVlKSkgewogICAgICAgICAgICAgICAgIHF1ZXJ5LnZhbHVlcyA9IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMoCkBAIC0yNzEzLDcgKzI3MTEsNyBAQAogICAgICAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OkN1cnJlbnQoQzJQYXJhbUZpZWxkKCZkb21haW5JbmZvLCAmQzJDb21wb25lbnREb21haW5JbmZvOjptVmFsdWUpKSwKICAgICB9OwogCi0gICAgRVhQRUNUX0VRKEMyX09LLCBjb21wLT5xdWVyeVN1cHBvcnRlZFZhbHVlc19uYihxdWVyeSkpOworICAgIEVYUEVDVF9FUShDMl9PSywgY29tcC0+cXVlcnlTdXBwb3J0ZWRWYWx1ZXNfdmIocXVlcnksIEMyX0RPTlRfQkxPQ0spKTsKIAogICAgIGZvciAoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5ICZxIDogcXVlcnkpIHsKICAgICAgICAgZHVtcEZTVihxLnZhbHVlcywgJmRvbWFpbkluZm8ubVZhbHVlKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMi92bmRrL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlYzIvdm5kay9BbmRyb2lkLmJwCmluZGV4IGQyY2ZlYmIuLmZiNDY5ZDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMi92bmRrL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWMyL3ZuZGsvQW5kcm9pZC5icApAQCAtMTUsNyArMTUsNiBAQAogCiAgICAgaW5jbHVkZV9kaXJzOiBbCiAgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMi9pbmNsdWRlIiwKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWMyL3ZuZGsvaW5jbHVkZSIsCiAgICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL2hhcmR3YXJlIiwKICAgICBdLAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlYzIvdm5kay9DMlN0b3JlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMi92bmRrL0MyU3RvcmUuY3BwCmluZGV4IDQ2MGNjNjAuLjIwNGY4OTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMi92bmRrL0MyU3RvcmUuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMi92bmRrL0MyU3RvcmUuY3BwCkBAIC0xNjIsNyArMTYyLDcgQEAKICAgICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzPj4gbGlzdENvbXBvbmVudHMoKSBvdmVycmlkZTsKICAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiBnZXRQYXJhbVJlZmxlY3RvcigpIGNvbnN0IG92ZXJyaWRlOwogICAgIHZpcnR1YWwgQzJTdHJpbmcgZ2V0TmFtZSgpIGNvbnN0IG92ZXJyaWRlOwotICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRWYWx1ZXNfbmIoCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFZhbHVlc19zbSgKICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gJmZpZWxkcykgY29uc3Qgb3ZlcnJpZGU7CiAgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFBhcmFtc19uYigKICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+ICpjb25zdCBwYXJhbXMpIGNvbnN0IG92ZXJyaWRlOwpAQCAtMTc5LDEwICsxNzksNiBAQAogICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29uZmlnX3NtKAogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSAqY29uc3Q+ICZwYXJhbXMsCiAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gKmNvbnN0IGZhaWx1cmVzKSBvdmVycmlkZTsKLSAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNvbW1pdF9zbSgKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0gKmNvbnN0PiAmcGFyYW1zLAotICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+ICpjb25zdCBmYWlsdXJlcykgb3ZlcnJpZGU7Ci0KICAgICBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKTsKIAogICAgIHZpcnR1YWwgfkMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKQEAgLTQzNCwxNCArNDMwLDYgQEAKICAgICByZXR1cm4gcGFyYW1zLmVtcHR5KCkgPyBDMl9PSyA6IEMyX0JBRF9JTkRFWDsKIH0KIAotYzJfc3RhdHVzX3QgQzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlOjpjb21taXRfc20oCi0gICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0gKmNvbnN0PiAmcGFyYW1zLAotICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gKmNvbnN0IGZhaWx1cmVzKSB7Ci0gICAgLy8gdGhlcmUgYXJlIG5vIHN1cHBvcnRlZCBjb25maWdzCi0gICAgKHZvaWQpZmFpbHVyZXM7Ci0gICAgcmV0dXJuIHBhcmFtcy5lbXB0eSgpID8gQzJfT0sgOiBDMl9CQURfSU5ERVg7Ci19Ci0KIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzPj4gQzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlOjpsaXN0Q29tcG9uZW50cygpIHsKICAgICAvLyBUaGlzIG1ldGhvZCBTSEFMTCByZXR1cm4gd2l0aGluIDUwMG1zLgogICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzPj4gbGlzdDsKQEAgLTUxMSw3ICs0OTksNyBAQAogICAgIHJldHVybiBDMl9PSzsKIH0KIAotYzJfc3RhdHVzX3QgQzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlOjpxdWVyeVN1cHBvcnRlZFZhbHVlc19uYigKK2MyX3N0YXR1c190IEMyUGxhdGZvcm1Db21wb25lbnRTdG9yZTo6cXVlcnlTdXBwb3J0ZWRWYWx1ZXNfc20oCiAgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gJmZpZWxkcykgY29uc3QgewogICAgIC8vIHRoZXJlIGFyZSBubyBzdXBwb3J0ZWQgY29uZmlnIHBhcmFtcwogICAgIHJldHVybiBmaWVsZHMuZW1wdHkoKSA/IEMyX09LIDogQzJfQkFEX0lOREVYOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2RlYy9BbmRyb2lkLmJwCmluZGV4IDVkY2ZmZDUuLjI1OWZiMjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZGVjL0FuZHJvaWQuYnAKQEAgLTExLDcgKzExLDYgQEAKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1XYWxsIiwKICAgICAgICAgIi1XZXJyb3IiLAotICAgICAgICAiLVduby11bnVzZWQtdmFyaWFibGUiLAogICAgIF0sCiAKICAgICBpbmNsdWRlX2RpcnM6IFsKQEAgLTUxLDYgKzUwLDExIEBACiAgICAgXSwKICAgICBzcmNzOiBbIkMyU29mdEF2Y0RlYy5jcHAiXSwKIAorICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgXSwKKwogICAgIGluY2x1ZGVfZGlyczogWwogICAgICAgICAiZXh0ZXJuYWwvbGliYXZjL2RlY29kZXIiLAogICAgICAgICAiZXh0ZXJuYWwvbGliYXZjL2NvbW1vbiIsCkBAIC02Nyw2ICs3MSw3IEBACiAgICAgICAgICJsaWJtZWRpYSIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9jb2RlYzIiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9zaW1wbGVfYzJjb21wb25lbnQiLAogICAgICAgICAibGlidXRpbHMiLAogICAgIF0sCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvQzJTb2Z0QXZjRGVjLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvQzJTb2Z0QXZjRGVjLmNwcAppbmRleCAyNDIzNjI5Li5hYzhlMWRlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZGVjL0MyU29mdEF2Y0RlYy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2RlYy9DMlNvZnRBdmNEZWMuY3BwCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE0LDEyICsxNCwxMyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2RlZmluZSBMT0dfTkRFQlVHIDAKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0QXZjRGVjIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSA8Y21hdGg+CiAjaW5jbHVkZSA8dGhyZWFkPgorI2luY2x1ZGUgPGNpbnR0eXBlcz4KIAogI2luY2x1ZGUgImloMjY0X3R5cGVkZWZzLmgiCiAjaW5jbHVkZSAiaXYuaCIKQEAgLTQ0MiwxMCArNDQzLDEyIEBACiAgICAgcmV0dXJuIG1JZDsKIH0KIAotYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRGVjSW50Zjo6cXVlcnlfbmIoCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNEZWNJbnRmOjpxdWVyeV92YigKICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSogY29uc3Q+ICYgc3RhY2tQYXJhbXMsCiAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAmIGhlYXBQYXJhbUluZGljZXMsCisgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCiAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4qIGNvbnN0IGhlYXBQYXJhbXMpIGNvbnN0IHsKKyAgICAodm9pZCltYXlCbG9jazsKICAgICBmb3IgKEMyUGFyYW0qIGNvbnN0IHBhcmFtIDogc3RhY2tQYXJhbXMpIHsKICAgICAgICAgaWYgKCEqcGFyYW0pIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtNDc3LDkgKzQ4MCwxMSBAQAogICAgIHJldHVybiBDMl9PSzsKIH0KIAotYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRGVjSW50Zjo6Y29uZmlnX25iKAorYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRGVjSW50Zjo6Y29uZmlnX3ZiKAogICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKiBjb25zdD4gJnBhcmFtcywKKyAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KiBjb25zdCBmYWlsdXJlcykgeworICAgICh2b2lkKW1heUJsb2NrOwogICAgIGMyX3N0YXR1c190IGVyciA9IEMyX09LOwogICAgIGZvciAoQzJQYXJhbSAqcGFyYW0gOiBwYXJhbXMpIHsKICAgICAgICAgdWludDMyX3QgaW5kZXggPSByZXN0b3JlSW5kZXgocGFyYW0pOwpAQCAtNTA4LDEzICs1MTMsNiBAQAogICAgIHJldHVybiBlcnI7CiB9CiAKLWMyX3N0YXR1c190IEMyU29mdEF2Y0RlY0ludGY6OmNvbW1pdF9zbSgKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSogY29uc3Q+ICZwYXJhbXMsCi0gICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgZmFpbHVyZXMpIHsKLSAgICAvLyBUT0RPCi0gICAgcmV0dXJuIGNvbmZpZ19uYihwYXJhbXMsIGZhaWx1cmVzKTsKLX0KLQogYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRGVjSW50Zjo6Y3JlYXRlVHVubmVsX3NtKGMyX25vZGVfaWRfdCB0YXJnZXRDb21wb25lbnQpIHsKICAgICAvLyBUdW5uZWxpbmcgaXMgbm90IHN1cHBvcnRlZAogICAgICh2b2lkKSB0YXJnZXRDb21wb25lbnQ7CkBAIC01MzcsOCArNTM1LDkgQEAKICAgICByZXR1cm4gQzJfT0s7CiB9CiAKLWMyX3N0YXR1c190IEMyU29mdEF2Y0RlY0ludGY6OnF1ZXJ5U3VwcG9ydGVkVmFsdWVzX25iKAotICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+ICZmaWVsZHMpIGNvbnN0IHsKK2MyX3N0YXR1c190IEMyU29mdEF2Y0RlY0ludGY6OnF1ZXJ5U3VwcG9ydGVkVmFsdWVzX3ZiKAorICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+ICZmaWVsZHMsIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2spIGNvbnN0IHsKKyAgICAodm9pZCltYXlCbG9jazsKICAgICBjMl9zdGF0dXNfdCByZXMgPSBDMl9PSzsKICAgICBmb3IgKEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSAmcXVlcnkgOiBmaWVsZHMpIHsKICAgICAgICAgaWYgKG1TdXBwb3J0ZWRWYWx1ZXMuY291bnQocXVlcnkuZmllbGQpID09IDApIHsKQEAgLTYwOCw0NyArNjA3LDEwIEBACiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotY2xhc3MgQzJTb2Z0QXZjRGVjOjpRdWV1ZVByb2Nlc3NUaHJlYWQgewotcHVibGljOgotICAgIFF1ZXVlUHJvY2Vzc1RocmVhZCgpIDogbUV4aXRSZXF1ZXN0ZWQoZmFsc2UpLCBtUnVubmluZyhmYWxzZSkge30KLQotICAgIH5RdWV1ZVByb2Nlc3NUaHJlYWQoKSB7Ci0gICAgICAgIGlmIChtVGhyZWFkICYmIG1UaHJlYWQtPmpvaW5hYmxlKCkpIHsKLSAgICAgICAgICAgIG1FeGl0UmVxdWVzdGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIG1UaHJlYWQtPmpvaW4oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgc3RhcnQoc3RkOjp3ZWFrX3B0cjxDMlNvZnRBdmNEZWM+IGNvbXBvbmVudCkgewotICAgICAgICBtVGhyZWFkLnJlc2V0KG5ldyBzdGQ6OnRocmVhZChbdGhpcywgY29tcG9uZW50XSAoKSB7Ci0gICAgICAgICAgICBtUnVubmluZyA9IHRydWU7Ci0gICAgICAgICAgICB3aGlsZSAoYXV0byBjb21wID0gY29tcG9uZW50LmxvY2soKSkgewotICAgICAgICAgICAgICAgIGlmIChtRXhpdFJlcXVlc3RlZCkgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY29tcC0+cHJvY2Vzc1F1ZXVlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUnVubmluZyA9IGZhbHNlOwotICAgICAgICB9KSk7Ci0gICAgfQotCi0gICAgdm9pZCByZXF1ZXN0RXhpdCgpIHsKLSAgICAgICAgbUV4aXRSZXF1ZXN0ZWQgPSB0cnVlOwotICAgIH0KLQotICAgIGJvb2wgaXNSdW5uaW5nKCkgewotICAgICAgICByZXR1cm4gbVJ1bm5pbmc7Ci0gICAgfQotCi1wcml2YXRlOgotICAgIHN0ZDo6YXRvbWljX2Jvb2wgbUV4aXRSZXF1ZXN0ZWQ7Ci0gICAgc3RkOjphdG9taWNfYm9vbCBtUnVubmluZzsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjp0aHJlYWQ+IG1UaHJlYWQ7Ci19OwotCiBDMlNvZnRBdmNEZWM6OkMyU29mdEF2Y0RlYygKICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKICAgICAgICAgYzJfbm9kZV9pZF90IGlkKQotICAgIDogbUludGYoc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRBdmNEZWNJbnRmPihuYW1lLCBpZCkpLAotICAgICAgbVRocmVhZChuZXcgUXVldWVQcm9jZXNzVGhyZWFkKSwKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0QXZjRGVjSW50Zj4obmFtZSwgaWQpKSwKICAgICAgIG1Db2RlY0N0eChOVUxMKSwKICAgICAgIG1GbHVzaE91dEJ1ZmZlcihOVUxMKSwKICAgICAgIG1JdkNvbG9yRm9ybWF0KElWX1lVVl80MjBQKSwKQEAgLTY3MCwxMDYgKzYzMiwxMiBAQAogICAgIENIRUNLX0VRKGRlSW5pdERlY29kZXIoKSwgKHN0YXR1c190KU9LKTsKIH0KIAotYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRGVjOjpzZXRMaXN0ZW5lcl9zbSgKLSAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50OjpMaXN0ZW5lcj4gJmxpc3RlbmVyKSB7Ci0gICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1MaXN0ZW5lckxvY2spOwotICAgIC8vIFRPRE86IHdlIHJlYWxseSBuZWVkIHRvIGxvY2sgdGhlIHJ1bm5pbmcgY2hlY2sgYXMgd2VsbAotICAgIGlmIChsaXN0ZW5lciAmJiBtVGhyZWFkLT5pc1J1bm5pbmcoKSkgewotICAgICAgICByZXR1cm4gQzJfQkFEX1NUQVRFOwotICAgIH0KLSAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKLSAgICBpZiAobUFjdGl2ZUxpc3RlbmVyICYmICFsaXN0ZW5lcikgewotICAgICAgICAvLyB3YWl0IHVudGlsIG5vIGFjdGl2ZSBsaXN0ZW5lcnMgYXJlIGluIHVzZQotICAgICAgICBtQWN0aXZlTGlzdGVuZXJDaGFuZ2VkLndhaXQobG9jaywgW3RoaXNdeyByZXR1cm4gIW1BY3RpdmVMaXN0ZW5lcjsgfSk7Ci0gICAgfQorYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRGVjOjpvbkluaXQoKSB7CisgICAgLy8gVE9ETzogaW5pdGlhbGl6ZSB1c2luZyBpbnRmCiAgICAgcmV0dXJuIEMyX09LOwogfQogCi1jMl9zdGF0dXNfdCBDMlNvZnRBdmNEZWM6OnF1ZXVlX25iKAotICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+KiBjb25zdCBpdGVtcykgewotICAgIGlmICghbVRocmVhZC0+aXNSdW5uaW5nKCkpIHsKLSAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKLSAgICB9Ci0gICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1RdWV1ZUxvY2spOwotICAgIHdoaWxlICghaXRlbXMtPmVtcHR5KCkpIHsKLSAgICAgICAgLy8gVE9ETzogZXhhbWluZSBpdGVtIGFuZCB1cGRhdGUgd2lkdGgvaGVpZ2h0PwotICAgICAgICBtUXVldWUuZW1wbGFjZV9iYWNrKHN0ZDo6bW92ZShpdGVtcy0+ZnJvbnQoKSkpOwotICAgICAgICBpdGVtcy0+cG9wX2Zyb250KCk7Ci0gICAgfQotICAgIG1RdWV1ZUNvbmQubm90aWZ5X2FsbCgpOwotICAgIHJldHVybiBDMl9PSzsKLX0KLQotYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRGVjOjphbm5vdW5jZV9uYihjb25zdCBzdGQ6OnZlY3RvcjxDMldvcmtPdXRsaW5lPiAmaXRlbXMpIHsKLSAgICAvLyBUdW5uZWxpbmcgaXMgbm90IHN1cHBvcnRlZAotICAgICh2b2lkKSBpdGVtczsKLSAgICByZXR1cm4gQzJfT01JVFRFRDsKLX0KLQotYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRGVjOjpmbHVzaF9zbSgKLSAgICAgICAgZmx1c2hfbW9kZV90IG1vZGUsIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4qIGNvbnN0IGZsdXNoZWRXb3JrKSB7Ci0gICAgLy8gVHVubmVsaW5nIGlzIG5vdCBzdXBwb3J0ZWQKLSAgICAodm9pZCkgbW9kZTsKLQotICAgIGlmICghbVRocmVhZC0+aXNSdW5uaW5nKCkpIHsKLSAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKLSAgICB9Ci0gICAgewotICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobVF1ZXVlTG9jayk7Ci0gICAgICAgIHdoaWxlICghbVF1ZXVlLmVtcHR5KCkpIHsKLSAgICAgICAgICAgIGZsdXNoZWRXb3JrLT5lbXBsYWNlX2JhY2soc3RkOjptb3ZlKG1RdWV1ZS5mcm9udCgpKSk7Ci0gICAgICAgICAgICBtUXVldWUucG9wX2Zyb250KCk7Ci0gICAgICAgIH0KLSAgICAgICAgbVF1ZXVlQ29uZC5ub3RpZnlfYWxsKCk7Ci0gICAgfQotICAgIHsKLSAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1QZW5kaW5nTG9jayk7Ci0gICAgICAgIGZvciAoYXV0byAmZWxlbSA6IG1QZW5kaW5nV29yaykgewotICAgICAgICAgICAgZmx1c2hlZFdvcmstPmVtcGxhY2VfYmFjayhzdGQ6Om1vdmUoZWxlbS5zZWNvbmQpKTsKLSAgICAgICAgfQotICAgICAgICBtUGVuZGluZ1dvcmsuY2xlYXIoKTsKLSAgICB9Ci0gICAgcmV0dXJuIEMyX09LOwotfQotCi1jMl9zdGF0dXNfdCBDMlNvZnRBdmNEZWM6OmRyYWluX25iKGRyYWluX21vZGVfdCBtb2RlKSB7Ci0gICAgLy8gVHVubmVsaW5nIGlzIG5vdCBzdXBwb3J0ZWQKLSAgICAodm9pZCkgbW9kZTsKLQotICAgIGlmICghbVRocmVhZC0+aXNSdW5uaW5nKCkpIHsKLSAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKLSAgICB9Ci0gICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1RdWV1ZUxvY2spOwotICAgIGlmICghbVF1ZXVlLmVtcHR5KCkpIHsKLSAgICAgICAgQzJCdWZmZXJQYWNrICZsYXN0SW5wdXQgPSBtUXVldWUuYmFjaygpLT5pbnB1dDsKLSAgICAgICAgbGFzdElucHV0LmZsYWdzID0gKEMyQnVmZmVyUGFjazo6ZmxhZ3NfdCkobGFzdElucHV0LmZsYWdzIHwgQzJCdWZmZXJQYWNrOjpGTEFHX0VORF9PRl9TVFJFQU0pOwotICAgICAgICBtUXVldWVDb25kLm5vdGlmeV9hbGwoKTsKLSAgICB9Ci0gICAgcmV0dXJuIEMyX09LOwotfQotCi1jMl9zdGF0dXNfdCBDMlNvZnRBdmNEZWM6OnN0YXJ0KCkgewotICAgIGlmICghbVRocmVhZC0+aXNSdW5uaW5nKCkpIHsKLSAgICAgICAgbVRocmVhZC0+c3RhcnQoc2hhcmVkX2Zyb21fdGhpcygpKTsKLSAgICB9Ci0gICAgcmV0dXJuIEMyX09LOwotfQotCi1jMl9zdGF0dXNfdCBDMlNvZnRBdmNEZWM6OnN0b3AoKSB7Ci0gICAgQUxPR1YoInN0b3AiKTsKLSAgICBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjp0aW1lX3BvaW50IG5vdyA9IHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6Om5vdygpOwotICAgIHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6OnRpbWVfcG9pbnQgZGVhZGxpbmUgPSBub3cgKyBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDUwMCk7Ci0KLSAgICBtVGhyZWFkLT5yZXF1ZXN0RXhpdCgpOwotICAgIHdoaWxlIChtVGhyZWFkLT5pc1J1bm5pbmcoKSAmJiAobm93ID0gc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6bm93KCkpIDwgZGVhZGxpbmUpIHsKLSAgICAgICAgc3RkOjp0aGlzX3RocmVhZDo6eWllbGQoKTsKLSAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1RdWV1ZUxvY2spOwotICAgICAgICBtUXVldWVDb25kLm5vdGlmeV9hbGwoKTsKLSAgICB9Ci0gICAgaWYgKG1UaHJlYWQtPmlzUnVubmluZygpKSB7Ci0gICAgICAgIHJldHVybiBDMl9USU1FRF9PVVQ7Ci0gICAgfQotCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNEZWM6Om9uU3RvcCgpIHsKICAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKICAgICByZXNldERlY29kZXIoKTsKICAgICByZXNldFBsdWdpbigpOwpAQCAtNzc3LDEwNyArNjQ1LDU1IEBACiAgICAgcmV0dXJuIEMyX09LOwogfQogCi12b2lkIEMyU29mdEF2Y0RlYzo6cmVzZXQoKSB7Ci0gICAgaWYgKG1UaHJlYWQtPmlzUnVubmluZygpKSB7Ci0gICAgICAgIHN0b3AoKTsKK3ZvaWQgQzJTb2Z0QXZjRGVjOjpvblJlc2V0KCkgeworICAgICh2b2lkKW9uU3RvcCgpOworfQorCit2b2lkIEMyU29mdEF2Y0RlYzo6b25SZWxlYXNlKCkgeworICAgICh2b2lkKWRlSW5pdERlY29kZXIoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRGVjOjpvbkZsdXNoX3NtKCkgeworICAgIHNldEZsdXNoTW9kZSgpOworCisgICAgLyogQWxsb2NhdGUgYSBwaWN0dXJlIGJ1ZmZlciB0byBmbHVzaGVkIGRhdGEgKi8KKyAgICB1aW50MzJfdCBkaXNwbGF5U3RyaWRlID0gbVdpZHRoOworICAgIHVpbnQzMl90IGRpc3BsYXlIZWlnaHQgPSBtSGVpZ2h0OworCisgICAgdWludDMyX3QgYnVmZmVyU2l6ZSA9IGRpc3BsYXlTdHJpZGUgKiBkaXNwbGF5SGVpZ2h0ICogMyAvIDI7CisgICAgbUZsdXNoT3V0QnVmZmVyID0gKHVpbnQ4X3QgKiltZW1hbGlnbigxMjgsIGJ1ZmZlclNpemUpOworICAgIGlmIChOVUxMID09IG1GbHVzaE91dEJ1ZmZlcikgeworICAgICAgICBBTE9HRSgiQ291bGQgbm90IGFsbG9jYXRlIGZsdXNoT3V0cHV0QnVmZmVyIG9mIHNpemUgJXUiLCBidWZmZXJTaXplKTsKKyAgICAgICAgcmV0dXJuIEMyX05PX01FTU9SWTsKICAgICB9CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX2lwX3Qgc19kZWNfaXA7CisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCBzX2RlY19vcDsKKyAgICAgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzOworICAgICAgICAvLyBzaXplX3Qgc2l6ZVksIHNpemVVVjsKKworICAgICAgICBzZXREZWNvZGVBcmdzKCZzX2RlY19pcCwgJnNfZGVjX29wLCBOVUxMLCBOVUxMLCAwLCAwdSk7CisKKyAgICAgICAgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgKHZvaWQgKikmc19kZWNfaXAsICh2b2lkICopJnNfZGVjX29wKTsKKyAgICAgICAgaWYgKDAgPT0gc19kZWNfb3AudTRfb3V0cHV0X3ByZXNlbnQpIHsKKyAgICAgICAgICAgIHJlc2V0UGx1Z2luKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtRmx1c2hPdXRCdWZmZXIpIHsKKyAgICAgICAgZnJlZShtRmx1c2hPdXRCdWZmZXIpOworICAgICAgICBtRmx1c2hPdXRCdWZmZXIgPSBOVUxMOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0RlYzo6b25EcmFpbl9uYigpIHsKICAgICAvLyBUT0RPCisgICAgcmV0dXJuIEMyX09LOwogfQogCi12b2lkIEMyU29mdEF2Y0RlYzo6cmVsZWFzZSgpIHsKLSAgICBpZiAobVRocmVhZC0+aXNSdW5uaW5nKCkpIHsKLSAgICAgICAgc3RvcCgpOwotICAgIH0KLSAgICAvLyBUT0RPCi19Ci0KLXN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gQzJTb2Z0QXZjRGVjOjppbnRmKCkgewotICAgIHJldHVybiBtSW50ZjsKLX0KLQotdm9pZCBDMlNvZnRBdmNEZWM6OnByb2Nlc3NRdWV1ZSgpIHsKLSNpZiAwCi0gICAgaWYgKG1Jc0luRmx1c2gpIHsKLSAgICAgICAgc2V0Rmx1c2hNb2RlKCk7Ci0KLSAgICAgICAgLyogQWxsb2NhdGUgYSBwaWN0dXJlIGJ1ZmZlciB0byBmbHVzaGVkIGRhdGEgKi8KLSAgICAgICAgdWludDMyX3QgZGlzcGxheVN0cmlkZSA9IG1XaWR0aDsKLSAgICAgICAgdWludDMyX3QgZGlzcGxheUhlaWdodCA9IG1IZWlnaHQ7Ci0KLSAgICAgICAgdWludDMyX3QgYnVmZmVyU2l6ZSA9IGRpc3BsYXlTdHJpZGUgKiBkaXNwbGF5SGVpZ2h0ICogMyAvIDI7Ci0gICAgICAgIG1GbHVzaE91dEJ1ZmZlciA9ICh1aW50OF90ICopbWVtYWxpZ24oMTI4LCBidWZmZXJTaXplKTsKLSAgICAgICAgaWYgKE5VTEwgPT0gbUZsdXNoT3V0QnVmZmVyKSB7Ci0gICAgICAgICAgICBBTE9HRSgiQ291bGQgbm90IGFsbG9jYXRlIGZsdXNoT3V0cHV0QnVmZmVyIG9mIHNpemUgJXUiLCBidWZmZXJTaXplKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX2lwX3Qgc19kZWNfaXA7Ci0gICAgICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3Qgc19kZWNfb3A7Ci0gICAgICAgICAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXM7Ci0gICAgICAgICAgICBzaXplX3Qgc2l6ZVksIHNpemVVVjsKLQotICAgICAgICAgICAgc2V0RGVjb2RlQXJncygmc19kZWNfaXAsICZzX2RlY19vcCwgTlVMTCwgTlVMTCwgMCwgMHUpOwotCi0gICAgICAgICAgICBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAodm9pZCAqKSZzX2RlY19pcCwgKHZvaWQgKikmc19kZWNfb3ApOwotICAgICAgICAgICAgaWYgKDAgPT0gc19kZWNfb3AudTRfb3V0cHV0X3ByZXNlbnQpIHsKLSAgICAgICAgICAgICAgICByZXNldFBsdWdpbigpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1GbHVzaE91dEJ1ZmZlcikgewotICAgICAgICAgICAgZnJlZShtRmx1c2hPdXRCdWZmZXIpOwotICAgICAgICAgICAgbUZsdXNoT3V0QnVmZmVyID0gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBtSXNJbkZsdXNoID0gZmFsc2U7Ci0gICAgfQotI2VuZGlmCi0KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrOwotICAgIGlmICghbUlzSW5GbHVzaCkgewotICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobVF1ZXVlTG9jayk7Ci0gICAgICAgIGlmIChtUXVldWUuZW1wdHkoKSkgewotICAgICAgICAgICAgbVF1ZXVlQ29uZC53YWl0KGxvY2spOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtUXVldWUuZW1wdHkoKSkgewotICAgICAgICAgICAgQUxPR1YoImVtcHR5IHF1ZXVlIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgd29yay5zd2FwKG1RdWV1ZS5mcm9udCgpKTsKLSAgICAgICAgbVF1ZXVlLnBvcF9mcm9udCgpOwotICAgIH0KLQotICAgIC8vIFByb2Nlc3MgdGhlIHdvcmsKLSAgICBwcm9jZXNzKHdvcmspOwotCi0gICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGRvbmU7Ci0gICAgaWYgKHdvcmspIHsKLSAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1QZW5kaW5nTG9jayk7Ci0gICAgICAgIHVpbnQzMl90IGluZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZV9pbmRleDsKLSAgICAgICAgbVBlbmRpbmdXb3JrW2luZGV4XS5zd2FwKHdvcmspOwotCi0gICAgICAgIGlmICh3b3JrKSB7Ci0gICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7Ci0gICAgICAgICAgICBkb25lLmVtcGxhY2VfYmFjayhzdGQ6Om1vdmUod29yaykpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFkb25lLmVtcHR5KCkpIHsKLSAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1MaXN0ZW5lckxvY2spOwotICAgICAgICBtQWN0aXZlTGlzdGVuZXIgPSBtTGlzdGVuZXI7Ci0KLSAgICAgICAgaWYgKG1BY3RpdmVMaXN0ZW5lcikgewotICAgICAgICAgICAgbG9jay51bmxvY2soKTsKLSAgICAgICAgICAgIG1BY3RpdmVMaXN0ZW5lci0+b25Xb3JrRG9uZV9uYihzaGFyZWRfZnJvbV90aGlzKCksIHN0ZDo6bW92ZShkb25lKSk7Ci0gICAgICAgICAgICBsb2NrLmxvY2soKTsKLSAgICAgICAgICAgIG1BY3RpdmVMaXN0ZW5lci5yZXNldCgpOwotICAgICAgICAgICAgbUFjdGl2ZUxpc3RlbmVyQ2hhbmdlZC5ub3RpZnlfYWxsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLQogc3RhdGljIHZvaWQgKml2ZF9hbGlnbmVkX21hbGxvYyh2b2lkICpjdHh0LCBXT1JEMzIgYWxpZ25tZW50LCBXT1JEMzIgc2l6ZSkgewogICAgICh2b2lkKSBjdHh0OwogICAgIHJldHVybiBtZW1hbGlnbihhbGlnbm1lbnQsIHNpemUpOwpAQCAtOTU1LDcgKzc3MSw2IEBACiB9CiAKIHN0YXR1c190IEMyU29mdEF2Y0RlYzo6cmVzZXRQbHVnaW4oKSB7Ci0gICAgbVJlY2VpdmVkRU9TID0gZmFsc2U7CiAgICAgbUlucHV0T2Zmc2V0ID0gMDsKIAogICAgIC8qIEluaXRpYWxpemUgYm90aCBzdGFydCBhbmQgZW5kIHRpbWVzICovCkBAIC0xMDI4LDcgKzg0Myw2IEBACiAgICAgICAgICAgICAgICAgc192aWRlb19mbHVzaF9vcC51NF9lcnJvcl9jb2RlKTsKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgfQotICAgIG1Jc0luRmx1c2ggPSB0cnVlOwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMTEwNyw3ICs5MjEsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0KICAgICBtQ2hhbmdpbmdSZXNvbHV0aW9uID0gZmFsc2U7CiAKICAgICByZXR1cm4gT0s7CkBAIC0xMjEwLDc4ICsxMDIzLDc3IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLXZvaWQgQzJTb2Z0QXZjRGVjOjpwcm9jZXNzKHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7Ci0gICAgaWYgKG1TaWduYWxsZWRFcnJvcikgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChOVUxMID09IG1Db2RlY0N0eCkgewotICAgICAgICBpZiAoT0sgIT0gaW5pdERlY29kZXIoKSkgewotICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBpbml0aWFsaXplIGRlY29kZXIiKTsKLSAgICAgICAgICAgIC8vIFRPRE86IG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nLCAwLCBOVUxMKTsKLSAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7Ci0gICAgICAgICAgICByZXR1cm47Citib29sIEMyU29mdEF2Y0RlYzo6cHJvY2Vzcyhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBwb29sKSB7CisgICAgYm9vbCBpc0luRmx1c2ggPSBmYWxzZTsKKyAgICBib29sIGVvcyA9IGZhbHNlOworCisgICAgYm9vbCBkb25lID0gZmFsc2U7CisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisKKyAgICBjb25zdCBDMkNvbnN0TGluZWFyQmxvY2sgJmJ1ZmZlciA9CisgICAgICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKTsKKyAgICBhdXRvIGZpbGxFbXB0eVdvcmsgPSBbXShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgICAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgICAgIGlmICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkJ1ZmZlclBhY2s6OkZMQUdfRU5EX09GX1NUUkVBTSkpIHsKKyAgICAgICAgICAgIGZsYWdzIHw9IEMyQnVmZmVyUGFjazo6RkxBR19FTkRfT0ZfU1RSRUFNOwogICAgICAgICB9Ci0gICAgfQotICAgIGlmIChtV2lkdGggIT0gbVN0cmlkZSkgewotICAgICAgICAvKiBTZXQgdGhlIHJ1bi10aW1lIChkeW5hbWljKSBwYXJhbWV0ZXJzICovCi0gICAgICAgIG1TdHJpZGUgPSBtV2lkdGg7Ci0gICAgICAgIHNldFBhcmFtcyhtU3RyaWRlKTsKLSAgICB9CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IChDMkJ1ZmZlclBhY2s6OmZsYWdzX3QpZmxhZ3M7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmVtcGxhY2VfYmFjayhudWxscHRyKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIH07CisgICAgaWYgKGJ1ZmZlci5jYXBhY2l0eSgpID09IDApIHsKKyAgICAgICAgQUxPR1YoImVtcHR5IGlucHV0OiAlIiBQUkl1NjQsIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVfaW5kZXgpOwogCi0gICAgdWludDMyX3Qgd29ya0luZGV4ID0gMDsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJSZWFkVmlldz4gaW5wdXQ7Ci0gICAgaWYgKHdvcmspIHsKLSAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7Ci0KLSAgICAgICAgY29uc3QgQzJDb25zdExpbmVhckJsb2NrICZidWZmZXIgPQotICAgICAgICAgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpOwotICAgICAgICBpZiAoYnVmZmVyLmNhcGFjaXR5KCkgPT0gMCkgewotICAgICAgICAgICAgLy8gVE9ETzogcmVzdWx0PwotCi0gICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gZG9uZTsKLSAgICAgICAgICAgIGRvbmUuZW1wbGFjZV9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7Ci0gICAgICAgICAgICBtTGlzdGVuZXItPm9uV29ya0RvbmVfbmIoc2hhcmVkX2Zyb21fdGhpcygpLCBzdGQ6Om1vdmUoZG9uZSkpOwotICAgICAgICAgICAgaWYgKCEod29yay0+aW5wdXQuZmxhZ3MgJiBDMkJ1ZmZlclBhY2s6OkZMQUdfRU5EX09GX1NUUkVBTSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1SZWNlaXZlZEVPUyA9IHRydWU7Ci0gICAgICAgICAgICAvLyBUT0RPOiBmbHVzaAotICAgICAgICB9IGVsc2UgaWYgKHdvcmstPmlucHV0LmZsYWdzICYgQzJCdWZmZXJQYWNrOjpGTEFHX0VORF9PRl9TVFJFQU0pIHsKLSAgICAgICAgICAgIEFMT0dWKCJpbnB1dCBFT1M6ICVsbHUiLCB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lX2luZGV4KTsKLSAgICAgICAgICAgIG1SZWNlaXZlZEVPUyA9IHRydWU7CisgICAgICAgIC8vIFRPRE86IHJlc3VsdD8KKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgaWYgKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyQnVmZmVyUGFjazo6RkxBR19FTkRfT0ZfU1RSRUFNKSkgeworICAgICAgICAgICAgZW9zID0gdHJ1ZTsKICAgICAgICAgfQotCi0gICAgICAgIGlucHV0LnJlc2V0KG5ldyBDMlJlYWRWaWV3KHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpKSk7Ci0gICAgICAgIHdvcmtJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVfaW5kZXggJiAweEZGRkZGRkZGOworICAgICAgICBkb25lID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKHdvcmstPmlucHV0LmZsYWdzICYgQzJCdWZmZXJQYWNrOjpGTEFHX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgQUxPR1YoImlucHV0IEVPUzogJSIgUFJJdTY0LCB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lX2luZGV4KTsKKyAgICAgICAgZW9zID0gdHJ1ZTsKICAgICB9CiAKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJSZWFkVmlldz4gZGVmZXJyZWQ7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyUmVhZFZpZXc+IGlucHV0KG5ldyBDMlJlYWRWaWV3KAorICAgICAgICAgICAgd29yay0+aW5wdXQuYnVmZmVyc1swXS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCkpKTsKKyAgICB1aW50MzJfdCB3b3JrSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lX2luZGV4ICYgMHhGRkZGRkZGRjsKICAgICBzaXplX3QgaW5PZmZzZXQgPSAwdTsKLSAgICB3aGlsZSAoIWlucHV0IHx8IGluT2Zmc2V0IDwgaW5wdXQtPmNhcGFjaXR5KCkpIHsKLSAgICAgICAgaWYgKCFpbnB1dCkgeworCisgICAgd2hpbGUgKGlucHV0IHx8IGlzSW5GbHVzaCkgeworICAgICAgICBpZiAobVNpZ25hbGxlZEVycm9yKSB7CisgICAgICAgICAgICByZXR1cm4gZG9uZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoTlVMTCA9PSBtQ29kZWNDdHgpIHsKKyAgICAgICAgICAgIGlmIChPSyAhPSBpbml0RGVjb2RlcigpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBpbml0aWFsaXplIGRlY29kZXIiKTsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZywgMCwgTlVMTCk7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZG9uZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobVdpZHRoICE9IG1TdHJpZGUpIHsKKyAgICAgICAgICAgIC8qIFNldCB0aGUgcnVuLXRpbWUgKGR5bmFtaWMpIHBhcmFtZXRlcnMgKi8KKyAgICAgICAgICAgIG1TdHJpZGUgPSBtV2lkdGg7CisgICAgICAgICAgICBzZXRQYXJhbXMobVN0cmlkZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaXNJbkZsdXNoKSB7CiAgICAgICAgICAgICBBTE9HVigiZmx1c2hpbmciKTsKICAgICAgICAgfQotICAgICAgICAvLyBUT0RPOiBwb3B1bGF0ZSAtLS0gYXNzdW1lIGRpc3BsYXkgb3JkZXI/CisKICAgICAgICAgaWYgKCFtQWxsb2NhdGVkQmxvY2spIHsKICAgICAgICAgICAgIC8vIFRPRE86IGVycm9yIGhhbmRsaW5nCiAgICAgICAgICAgICAvLyBUT0RPOiBmb3JtYXQgJiB1c2FnZQogICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyOwogICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6a1NvZnR3YXJlUmVhZCwgQzJNZW1vcnlVc2FnZTo6a1NvZnR3YXJlV3JpdGUgfTsKLSAgICAgICAgICAgIC8vIFRPRE86IGxvY2sgYWNjZXNzIHRvIGludGVyZmFjZQotICAgICAgICAgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgcG9vbElkID0KLSAgICAgICAgICAgICAgICBtSW50Zi0+bU91dHB1dEJsb2NrUG9vbHMtPmZsZXhDb3VudCgpID8KLSAgICAgICAgICAgICAgICAgICAgICAgIG1JbnRmLT5tT3V0cHV0QmxvY2tQb29scy0+bS5tVmFsdWVzWzBdIDogQzJCbG9ja1Bvb2w6OkJBU0lDX0dSQVBISUM7Ci0gICAgICAgICAgICBpZiAoIW1PdXRwdXRCbG9ja1Bvb2wgfHwgbU91dHB1dEJsb2NrUG9vbC0+Z2V0TG9jYWxJZCgpICE9IHBvb2xJZCkgewotICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IEdldENvZGVjMkJsb2NrUG9vbChwb29sSWQsIHNoYXJlZF9mcm9tX3RoaXMoKSwgJm1PdXRwdXRCbG9ja1Bvb2wpOwotICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogdHJpcAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMT0dFKCJ1c2luZyBhbGxvY2F0b3IgJXUiLCBtT3V0cHV0QmxvY2tQb29sLT5nZXRBbGxvY2F0b3JJZCgpKTsKKyAgICAgICAgICAgIEFMT0dWKCJ1c2luZyBhbGxvY2F0b3IgJXUiLCBwb29sLT5nZXRBbGxvY2F0b3JJZCgpKTsKIAotICAgICAgICAgICAgKHZvaWQpbU91dHB1dEJsb2NrUG9vbC0+ZmV0Y2hHcmFwaGljQmxvY2soCisgICAgICAgICAgICAodm9pZClwb29sLT5mZXRjaEdyYXBoaWNCbG9jaygKICAgICAgICAgICAgICAgICAgICAgbVdpZHRoLCBtSGVpZ2h0LCBmb3JtYXQsIHVzYWdlLCAmbUFsbG9jYXRlZEJsb2NrKTsKLSAgICAgICAgICAgIEFMT0dFKCJwcm92aWRlZCAoJWR4JWQpIHJlcXVpcmVkICglZHglZCkiLCBtQWxsb2NhdGVkQmxvY2stPndpZHRoKCksIG1BbGxvY2F0ZWRCbG9jay0+aGVpZ2h0KCksIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgICAgICBBTE9HVigicHJvdmlkZWQgKCVkeCVkKSByZXF1aXJlZCAoJWR4JWQpIiwgbUFsbG9jYXRlZEJsb2NrLT53aWR0aCgpLCBtQWxsb2NhdGVkQmxvY2stPmhlaWdodCgpLCBtV2lkdGgsIG1IZWlnaHQpOwogICAgICAgICB9CiAgICAgICAgIEMyR3JhcGhpY1ZpZXcgb3V0cHV0ID0gbUFsbG9jYXRlZEJsb2NrLT5tYXAoKS5nZXQoKTsKICAgICAgICAgaWYgKG91dHB1dC5lcnJvcigpICE9IE9LKSB7CkBAIC0xMjkxLDEzICsxMTAzLDEzIEBACiAgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfaXBfdCBzX2RlY19pcDsKICAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90IHNfZGVjX29wOwogICAgICAgICBXT1JEMzIgdGltZURlbGF5LCB0aW1lVGFrZW47Ci0gICAgICAgIHNpemVfdCBzaXplWSwgc2l6ZVVWOworICAgICAgICAvL3NpemVfdCBzaXplWSwgc2l6ZVVWOwogCiAgICAgICAgIGlmICghc2V0RGVjb2RlQXJncygmc19kZWNfaXAsICZzX2RlY19vcCwgaW5wdXQuZ2V0KCksICZvdXRwdXQsIHdvcmtJbmRleCwgaW5PZmZzZXQpKSB7CiAgICAgICAgICAgICBBTE9HRSgiRGVjb2RlciBhcmcgc2V0dXAgZmFpbGVkIik7CiAgICAgICAgICAgICAvLyBUT0RPOiBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7CiAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwotICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgcmV0dXJuIGRvbmU7CiAgICAgICAgIH0KICAgICAgICAgQUxPR1YoIkRlY29kZXIgYXJnIHNldHVwIHN1Y2NlZWRlZCIpOwogICAgICAgICAvLyBJZiBpbnB1dCBkdW1wIGlzIGVuYWJsZWQsIHRoZW4gd3JpdGUgdG8gZmlsZQpAQCAtMTMxOSw3ICsxMTMxLDcgQEAKICAgICAgICAgICAgIEFMT0dFKCJVbnN1cHBvcnRlZCByZXNvbHV0aW9uIDogJWR4JWQiLCBtV2lkdGgsIG1IZWlnaHQpOwogICAgICAgICAgICAgLy8gVE9ETzogbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmcsIDAsIE5VTEwpOwogICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKLSAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIHJldHVybiBkb25lOwogICAgICAgICB9CiAKICAgICAgICAgYm9vbCBhbGxvY2F0aW9uRmFpbGVkID0gKElWRF9NRU1fQUxMT0NfRkFJTEVEID09IChzX2RlY19vcC51NF9lcnJvcl9jb2RlICYgMHhGRikpOwpAQCAtMTMyNyw3ICsxMTM5LDcgQEAKICAgICAgICAgICAgIEFMT0dFKCJBbGxvY2F0aW9uIGZhaWx1cmUgaW4gZGVjb2RlciIpOwogICAgICAgICAgICAgLy8gVE9ETzogbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmcsIDAsIE5VTEwpOwogICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKLSAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIHJldHVybiBkb25lOwogICAgICAgICB9CiAKICAgICAgICAgYm9vbCByZXNDaGFuZ2VkID0gKElWRF9SRVNfQ0hBTkdFRCA9PSAoc19kZWNfb3AudTRfZXJyb3JfY29kZSAmIDB4RkYpKTsKQEAgLTEzNDEsMjMgKzExNTMsMTggQEAKICAgICAgICAgUFJJTlRfVElNRSgidGltZVRha2VuPSU2ZCBkZWxheT0lNmQgbnVtQnl0ZXM9JTZkIiwgdGltZVRha2VuLCB0aW1lRGVsYXksCiAgICAgICAgICAgICAgICBzX2RlY19vcC51NF9udW1fYnl0ZXNfY29uc3VtZWQpOwogICAgICAgICBpZiAoaW5wdXQpIHsKLSAgICAgICAgICAgIEFMT0dJKCJieXRlcyB0b3RhbD0ldSIsIGlucHV0LT5jYXBhY2l0eSgpKTsKKyAgICAgICAgICAgIEFMT0dWKCJieXRlcyB0b3RhbD0ldSIsIGlucHV0LT5jYXBhY2l0eSgpKTsKICAgICAgICAgfQogICAgICAgICBpZiAoc19kZWNfb3AudTRfZnJhbWVfZGVjb2RlZF9mbGFnICYmICFtRmx1c2hOZWVkZWQpIHsKICAgICAgICAgICAgIG1GbHVzaE5lZWRlZCA9IHRydWU7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoMSAhPSBzX2RlY19vcC51NF9mcmFtZV9kZWNvZGVkX2ZsYWcgJiYgd29yaykgeworICAgICAgICBpZiAoMSAhPSBzX2RlY19vcC51NF9mcmFtZV9kZWNvZGVkX2ZsYWcgJiYgaW5wdXQpIHsKICAgICAgICAgICAgIC8qIElmIHRoZSBpbnB1dCBkaWQgbm90IGNvbnRhaW4gcGljdHVyZSBkYXRhLCByZXR1cm4gd29yayB3aXRob3V0CiAgICAgICAgICAgICAgKiBidWZmZXIgKi8KLSAgICAgICAgICAgIEFMT0dWKCJubyBwaWN0dXJlIGRhdGEiKTsKLSAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBkb25lOwotICAgICAgICAgICAgZG9uZS5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKLSAgICAgICAgICAgIGRvbmVbMF0tPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IChDMkJ1ZmZlclBhY2s6OmZsYWdzX3QpMDsKLSAgICAgICAgICAgIGRvbmVbMF0tPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7Ci0gICAgICAgICAgICBkb25lWzBdLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5lbXBsYWNlX2JhY2sobnVsbHB0cik7Ci0gICAgICAgICAgICBkb25lWzBdLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IGRvbmVbMF0tPmlucHV0Lm9yZGluYWw7Ci0gICAgICAgICAgICBtTGlzdGVuZXItPm9uV29ya0RvbmVfbmIoc2hhcmVkX2Zyb21fdGhpcygpLCBzdGQ6Om1vdmUoZG9uZSkpOworICAgICAgICAgICAgQUxPR1YoIm5vIHBpY3R1cmUgZGF0YTogJXUiLCB3b3JrSW5kZXgpOworICAgICAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgICAgIGRvbmUgPSB0cnVlOwogICAgICAgICB9CiAKICAgICAgICAgLy8gSWYgdGhlIGRlY29kZXIgaXMgaW4gdGhlIGNoYW5naW5nIHJlc29sdXRpb24gbW9kZSBhbmQgdGhlcmUgaXMgbm8gb3V0cHV0IHByZXNlbnQsCkBAIC0xMzY5LDcgKzExNzYsNyBAQAogICAgICAgICAgICAgcmVzZXRQbHVnaW4oKTsKICAgICAgICAgICAgIG1TdHJpZGUgPSBtV2lkdGg7CiAgICAgICAgICAgICBzZXRQYXJhbXMobVN0cmlkZSk7Ci0gICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChyZXNDaGFuZ2VkKSB7CkBAIC0xMzc3LDggKzExODQsMTAgQEAKICAgICAgICAgICAgIG1DaGFuZ2luZ1Jlc29sdXRpb24gPSB0cnVlOwogICAgICAgICAgICAgaWYgKG1GbHVzaE5lZWRlZCkgewogICAgICAgICAgICAgICAgIHNldEZsdXNoTW9kZSgpOworICAgICAgICAgICAgICAgIGlzSW5GbHVzaCA9IHRydWU7CisgICAgICAgICAgICAgICAgZGVmZXJyZWQgPSBzdGQ6Om1vdmUoaW5wdXQpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBDb21iaW5lIHRoZSByZXNvbHV0aW9uIGNoYW5nZSBhbmQgY29sb3Jhc3BlY3RzIGNoYW5nZSBpbiBvbmUgUG9ydFNldHRpbmdDaGFuZ2UgZXZlbnQKQEAgLTEzOTcsNjkgKzEyMDYsNjggQEAKICAgICAgICAgICAgIC8vICAgIGtEZXNjcmliZUNvbG9yQXNwZWN0c0luZGV4LCBOVUxMKTsKICAgICAgICAgICAgIEFMT0dWKCJ1cGRhdGUgY29sb3IgYXNwZWN0Iik7CiAgICAgICAgICAgICBtVXBkYXRlQ29sb3JBc3BlY3RzID0gZmFsc2U7Ci0gICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChzX2RlY19vcC51NF9vdXRwdXRfcHJlc2VudCkgewogICAgICAgICAgICAgQUxPR1YoIm91dHB1dF9wcmVzZW50OiAlZCIsIHNfZGVjX29wLnU0X3RzKTsKLSAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBkb25lOwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtUGVuZGluZ0xvY2spOwotICAgICAgICAgICAgICAgIGRvbmUucHVzaF9iYWNrKHN0ZDo6bW92ZShtUGVuZGluZ1dvcmtbc19kZWNfb3AudTRfdHNdKSk7Ci0gICAgICAgICAgICAgICAgbVBlbmRpbmdXb3JrLmVyYXNlKHNfZGVjX29wLnU0X3RzKTsKKyAgICAgICAgICAgIGF1dG8gZmlsbFdvcmsgPSBbdGhpc10oY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgICAgICAgICAgICAgaWYgKHdvcmstPmlucHV0LmZsYWdzICYgQzJCdWZmZXJQYWNrOjpGTEFHX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MgfD0gQzJCdWZmZXJQYWNrOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJFT1MiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyQnVmZmVyUGFjazo6ZmxhZ3NfdClmbGFnczsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmVtcGxhY2VfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8R3JhcGhpY0J1ZmZlcj4oc3RkOjptb3ZlKG1BbGxvY2F0ZWRCbG9jaykpKTsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgICAgICB9OworICAgICAgICAgICAgaWYgKHNfZGVjX29wLnU0X3RzICE9IHdvcmtJbmRleCkgeworICAgICAgICAgICAgICAgIGZpbmlzaChzX2RlY19vcC51NF90cywgZmlsbFdvcmspOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmaWxsV29yayh3b3JrKTsKKyAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMDsKLSAgICAgICAgICAgIGlmIChkb25lWzBdLT5pbnB1dC5mbGFncyAmIEMyQnVmZmVyUGFjazo6RkxBR19FTkRfT0ZfU1RSRUFNKSB7Ci0gICAgICAgICAgICAgICAgZmxhZ3MgfD0gQzJCdWZmZXJQYWNrOjpGTEFHX0VORF9PRl9TVFJFQU07Ci0gICAgICAgICAgICAgICAgQUxPR1YoIkVPUyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZG9uZVswXS0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyQnVmZmVyUGFjazo6ZmxhZ3NfdClmbGFnczsKLSAgICAgICAgICAgIGRvbmVbMF0tPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7Ci0gICAgICAgICAgICBkb25lWzBdLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5lbXBsYWNlX2JhY2soCi0gICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8R3JhcGhpY0J1ZmZlcj4oc3RkOjptb3ZlKG1BbGxvY2F0ZWRCbG9jaykpKTsKLSAgICAgICAgICAgIGRvbmVbMF0tPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gZG9uZVswXS0+aW5wdXQub3JkaW5hbDsKLSAgICAgICAgICAgIG1MaXN0ZW5lci0+b25Xb3JrRG9uZV9uYihzaGFyZWRfZnJvbV90aGlzKCksIHN0ZDo6bW92ZShkb25lKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAobUlzSW5GbHVzaCkgewotICAgICAgICAgICAgQUxPR1YoImZsdXNoIik7CisgICAgICAgIH0gZWxzZSBpZiAoaXNJbkZsdXNoKSB7CisgICAgICAgICAgICBBTE9HVigiZmx1c2ggY29tcGxldGUiKTsKICAgICAgICAgICAgIC8qIElmIGluIGZsdXNoIG1vZGUgYW5kIG5vIG91dHB1dCBpcyByZXR1cm5lZCBieSB0aGUgY29kZWMsCiAgICAgICAgICAgICAgKiB0aGVuIGNvbWUgb3V0IG9mIGZsdXNoIG1vZGUgKi8KLSAgICAgICAgICAgIG1Jc0luRmx1c2ggPSBmYWxzZTsKKyAgICAgICAgICAgIGlzSW5GbHVzaCA9IGZhbHNlOwogCiAgICAgICAgICAgICAvKiBJZiBFT1Mgd2FzIHJlY2lldmVkIG9uIGlucHV0IHBvcnQgYW5kIHRoZXJlIGlzIG5vIG91dHB1dAogICAgICAgICAgICAgICogZnJvbSB0aGUgY29kZWMsIHRoZW4gc2lnbmFsIEVPUyBvbiBvdXRwdXQgcG9ydCAqLwotICAgICAgICAgICAgaWYgKG1SZWNlaXZlZEVPUykgewotICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBkb25lOwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1QZW5kaW5nTG9jayk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbVBlbmRpbmdXb3JrLmVtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUucHVzaF9iYWNrKHN0ZDo6bW92ZShtUGVuZGluZ1dvcmsuYmVnaW4oKS0+c2Vjb25kKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUGVuZGluZ1dvcmsuZXJhc2UobVBlbmRpbmdXb3JrLmJlZ2luKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghZG9uZS5lbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJzZW5kaW5nIGVtcHR5IEVPUyBidWZmZXIiKTsKLSAgICAgICAgICAgICAgICAgICAgZG9uZVswXS0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gQzJCdWZmZXJQYWNrOjpGTEFHX0VORF9PRl9TVFJFQU07Ci0gICAgICAgICAgICAgICAgICAgIGRvbmVbMF0tPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGRvbmVbMF0tPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmVtcGxhY2VfYmFjayhudWxscHRyKTsKLSAgICAgICAgICAgICAgICAgICAgZG9uZVswXS0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSBkb25lWzBdLT5pbnB1dC5vcmRpbmFsOwotICAgICAgICAgICAgICAgICAgICBtTGlzdGVuZXItPm9uV29ya0RvbmVfbmIoc2hhcmVkX2Zyb21fdGhpcygpLCBzdGQ6Om1vdmUoZG9uZSkpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBJdCdzIGFuIGVycm9yIGlmIG5vdCBkb25lLgogCiAgICAgICAgICAgICAgICAgcmVzZXRQbHVnaW4oKTsKLSAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgcmV0dXJuIGRvbmU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlucHV0ID0gc3RkOjptb3ZlKGRlZmVycmVkKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpbnB1dCkgeworICAgICAgICAgICAgaW5PZmZzZXQgKz0gc19kZWNfb3AudTRfbnVtX2J5dGVzX2NvbnN1bWVkOworICAgICAgICAgICAgaWYgKGluT2Zmc2V0ID49IGlucHV0LT5jYXBhY2l0eSgpKSB7CisgICAgICAgICAgICAgICAgLyogSWYgaW5wdXQgRU9TIGlzIHNlZW4gYW5kIGRlY29kZXIgaXMgbm90IGluIGZsdXNoIG1vZGUsCisgICAgICAgICAgICAgICAgICogc2V0IHRoZSBkZWNvZGVyIGluIGZsdXNoIG1vZGUuCisgICAgICAgICAgICAgICAgICogVGhlcmUgY2FuIGJlIGEgY2FzZSB3aGVyZSBFT1MgaXMgc2VudCBhbG9uZyB3aXRoIGxhc3QgcGljdHVyZSBkYXRhCisgICAgICAgICAgICAgICAgICogSW4gdGhhdCBjYXNlLCBvbmx5IGFmdGVyIGRlY29kaW5nIHRoYXQgaW5wdXQgZGF0YSwgZGVjb2RlciBoYXMgdG8gYmUKKyAgICAgICAgICAgICAgICAgKiBwdXQgaW4gZmx1c2guIFRoaXMgY2FzZSBpcyBoYW5kbGVkIGhlcmUgICovCisgICAgICAgICAgICAgICAgaWYgKGVvcyAmJiAhaXNJbkZsdXNoKSB7CisgICAgICAgICAgICAgICAgICAgIHNldEZsdXNoTW9kZSgpOworICAgICAgICAgICAgICAgICAgICBpc0luRmx1c2ggPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaXNJbkZsdXNoKSB7CisgICAgICAgICAgICAgICAgICAgIGlucHV0LnJlc2V0KCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGluT2Zmc2V0ICs9IHNfZGVjX29wLnU0X251bV9ieXRlc19jb25zdW1lZDsKICAgICB9Ci0gICAgLyogSWYgaW5wdXQgRU9TIGlzIHNlZW4gYW5kIGRlY29kZXIgaXMgbm90IGluIGZsdXNoIG1vZGUsCi0gICAgICogc2V0IHRoZSBkZWNvZGVyIGluIGZsdXNoIG1vZGUuCi0gICAgICogVGhlcmUgY2FuIGJlIGEgY2FzZSB3aGVyZSBFT1MgaXMgc2VudCBhbG9uZyB3aXRoIGxhc3QgcGljdHVyZSBkYXRhCi0gICAgICogSW4gdGhhdCBjYXNlLCBvbmx5IGFmdGVyIGRlY29kaW5nIHRoYXQgaW5wdXQgZGF0YSwgZGVjb2RlciBoYXMgdG8gYmUKLSAgICAgKiBwdXQgaW4gZmx1c2guIFRoaXMgY2FzZSBpcyBoYW5kbGVkIGhlcmUgICovCi0KLSAgICBpZiAobVJlY2VpdmVkRU9TICYmICFtSXNJbkZsdXNoKSB7Ci0gICAgICAgIHNldEZsdXNoTW9kZSgpOwotICAgIH0KKyAgICByZXR1cm4gZG9uZTsKIH0KIAogYm9vbCBDMlNvZnRBdmNEZWM6OmNvbG9yQXNwZWN0c0RpZmZlcigKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvQzJTb2Z0QXZjRGVjLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZGVjL0MyU29mdEF2Y0RlYy5oCmluZGV4IDI4ZjFkZmQuLmFhMjJlMjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvQzJTb2Z0QXZjRGVjLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2RlYy9DMlNvZnRBdmNEZWMuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0yOSw2ICsyOSw3IEBACiAKICNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgogI2luY2x1ZGUgPEMyUGFyYW0uaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgogCiAjaW5jbHVkZSAiQzJBdmNDb25maWcuaCIKIApAQCAtODIsMTUgKzgzLDE0IEBACiAgICAgLy8gRnJvbSBDMkNvbXBvbmVudEludGVyZmFjZQogICAgIHZpcnR1YWwgQzJTdHJpbmcgZ2V0TmFtZSgpIGNvbnN0IG92ZXJyaWRlOwogICAgIHZpcnR1YWwgYzJfbm9kZV9pZF90IGdldElkKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeV9uYigKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5X3ZiKAogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSogY29uc3Q+ICZzdGFja1BhcmFtcywKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAmaGVhcFBhcmFtSW5kaWNlcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCiAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+KiBjb25zdCBoZWFwUGFyYW1zKSBjb25zdCBvdmVycmlkZTsKLSAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNvbmZpZ19uYigKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNvbmZpZ192YigKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qIGNvbnN0PiAmcGFyYW1zLAotICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KiBjb25zdCBmYWlsdXJlcykgb3ZlcnJpZGU7Ci0gICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjb21taXRfc20oCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKiBjb25zdD4gJnBhcmFtcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCiAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IGZhaWx1cmVzKSBvdmVycmlkZTsKICAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZVR1bm5lbF9zbShjMl9ub2RlX2lkX3QgdGFyZ2V0Q29tcG9uZW50KSBvdmVycmlkZTsKICAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHJlbGVhc2VUdW5uZWxfc20oYzJfbm9kZV9pZF90IHRhcmdldENvbXBvbmVudCkgb3ZlcnJpZGU7CkBAIC05OCw4ICs5OCw4IEBACiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IGdldFBhcmFtUmVmbGVjdG9yKCkgY29uc3Q7CiAgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFBhcmFtc19uYigKICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+ICogY29uc3QgcGFyYW1zKSBjb25zdCBvdmVycmlkZTsKLSAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkVmFsdWVzX25iKAotICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiAmZmllbGRzKSBjb25zdCBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkVmFsdWVzX3ZiKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiAmZmllbGRzLCBjMl9ibG9ja2luZ190IG1heUJsb2NrKSBjb25zdCBvdmVycmlkZTsKIAogcHJpdmF0ZToKICAgICBjbGFzcyBQYXJhbVJlZmxlY3RvcjsKQEAgLTE0MCwyOSArMTQwLDIzIEBACiAgICAgZnJpZW5kIGNsYXNzIEMyU29mdEF2Y0RlYzsKIH07CiAKLWNsYXNzIEMyU29mdEF2Y0RlYwotICAgIDogcHVibGljIEMyQ29tcG9uZW50LAotICAgICAgcHVibGljIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8QzJTb2Z0QXZjRGVjPiB7CitjbGFzcyBDMlNvZnRBdmNEZWMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgewogcHVibGljOgogICAgIEMyU29mdEF2Y0RlYyhjb25zdCBjaGFyICpuYW1lLCBjMl9ub2RlX2lkX3QgaWQpOwogICAgIHZpcnR1YWwgfkMyU29mdEF2Y0RlYygpOwogCi0gICAgLy8gRnJvbSBDMkNvbXBvbmVudAotICAgIHZpcnR1YWwgYzJfc3RhdHVzX3Qgc2V0TGlzdGVuZXJfc20oY29uc3Qgc3RkOjpzaGFyZWRfcHRyPExpc3RlbmVyPiAmbGlzdGVuZXIpIG92ZXJyaWRlOwotICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVldWVfbmIoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiogY29uc3QgaXRlbXMpIG92ZXJyaWRlOwotICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgYW5ub3VuY2VfbmIoY29uc3Qgc3RkOjp2ZWN0b3I8QzJXb3JrT3V0bGluZT4gJml0ZW1zKSBvdmVycmlkZTsKLSAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGZsdXNoX3NtKAotICAgICAgICAgICAgZmx1c2hfbW9kZV90IG1vZGUsIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4qIGNvbnN0IGZsdXNoZWRXb3JrKSBvdmVycmlkZTsKLSAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGRyYWluX25iKGRyYWluX21vZGVfdCBtb2RlKSBvdmVycmlkZTsKLSAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHN0YXJ0KCkgb3ZlcnJpZGU7Ci0gICAgdmlydHVhbCBjMl9zdGF0dXNfdCBzdG9wKCkgb3ZlcnJpZGU7Ci0gICAgdmlydHVhbCB2b2lkIHJlc2V0KCkgb3ZlcnJpZGU7Ci0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2UoKSBvdmVycmlkZTsKLSAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gaW50ZigpIG92ZXJyaWRlOworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBvbkRyYWluX25iKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBib29sIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gcG9vbCkgb3ZlcnJpZGU7CiAKIHByaXZhdGU6Ci0gICAgY2xhc3MgUXVldWVQcm9jZXNzVGhyZWFkOwotCiAgICAgTXV0ZXggbUNvbG9yQXNwZWN0c0xvY2s7CiAgICAgLy8gY29sb3IgYXNwZWN0cyBwYXNzZWQgZnJvbSB0aGUgZnJhbWV3b3JrLgogICAgIENvbG9yQXNwZWN0cyBtRGVmYXVsdENvbG9yQXNwZWN0czsKQEAgLTE4MiwzMCArMTc2LDYgQEAKICAgICAvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgdXBkYXRlIHRoZSBtRmluYWxDb2xvckFzcGVjdHMgYmFzZWQgb24gY29kZWMgcHJlZmVyZW5jZS4KICAgICBzdGF0dXNfdCBoYW5kbGVDb2xvckFzcGVjdHNDaGFuZ2UoKTsKIAotICAgIC8vIE51bWJlciBvZiBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMKLSAgICBlbnVtIHsKLSAgICAgICAga051bUJ1ZmZlcnMgPSA4Ci0gICAgfTsKLQotICAgIHVzaW5nIEluZGV4VHlwZSA9IGRlY2x0eXBlKEMyV29ya09yZGluYWxTdHJ1Y3QoKS5mcmFtZV9pbmRleCk7Ci0KLSAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJTb2Z0QXZjRGVjSW50Zj4gbUludGY7Ci0gICAgc3RkOjpzaGFyZWRfcHRyPExpc3RlbmVyPiBtTGlzdGVuZXI7Ci0gICAgc3RkOjpzaGFyZWRfcHRyPExpc3RlbmVyPiBtQWN0aXZlTGlzdGVuZXI7Ci0gICAgc3RkOjptdXRleCBtTGlzdGVuZXJMb2NrOwotICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1BY3RpdmVMaXN0ZW5lckNoYW5nZWQ7Ci0KLSAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IG1PdXRwdXRCbG9ja1Bvb2w7Ci0KLSAgICBzdGQ6Om11dGV4IG1RdWV1ZUxvY2s7Ci0gICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbVF1ZXVlQ29uZDsKLSAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IG1RdWV1ZTsKLQotICAgIHN0ZDo6bXV0ZXggbVBlbmRpbmdMb2NrOwotICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxJbmRleFR5cGUsIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBtUGVuZGluZ1dvcms7Ci0KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8UXVldWVQcm9jZXNzVGhyZWFkPiBtVGhyZWFkOwotCiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBtQWxsb2NhdGVkQmxvY2s7CiAKICAgICBpdl9vYmpfdCAqbUNvZGVjQ3R4OyAgICAgICAgIC8vIENvZGVjIGNvbnRleHQKQEAgLTIzNyw5ICsyMDcsNiBAQAogICAgIHVpbnQzMl90IG1TdHJpZGU7CiAgICAgc2l6ZV90IG1JbnB1dE9mZnNldDsKIAotICAgIHZvaWQgcHJvY2Vzc1F1ZXVlKCk7Ci0gICAgdm9pZCBwcm9jZXNzKHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKTsKLQogICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CiAgICAgc3RhdHVzX3QgZGVJbml0RGVjb2RlcigpOwogICAgIHN0YXR1c190IHNldEZsdXNoTW9kZSgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2RlYy9Tb2Z0QVZDRGVjLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvU29mdEFWQ0RlYy5jcHAKaW5kZXggMTYyMjU2MS4uMzkyNGZjMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2RlYy9Tb2Z0QVZDRGVjLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZGVjL1NvZnRBVkNEZWMuY3BwCkBAIC0zMDQsNyArMzA0LDYgQEAKIH0KIAogc3RhdHVzX3QgU29mdEFWQzo6ZGVJbml0RGVjb2RlcigpIHsKLSAgICBzaXplX3QgaTsKICAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXM7CiAKICAgICBpZiAobUNvZGVjQ3R4KSB7CkBAIC00NTEsNyArNDUwLDYgQEAKICAgICAgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfaXBfdCBzX2RlY19pcDsKICAgICAgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCBzX2RlY19vcDsKICAgICAgICAgICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1czsKLSAgICAgICAgICAgIHNpemVfdCBzaXplWSwgc2l6ZVVWOwogCiAgICAgICAgICAgICBzZXREZWNvZGVBcmdzKCZzX2RlY19pcCwgJnNfZGVjX29wLCBOVUxMLCBOVUxMLCAwKTsKIApAQCAtNTYzLDcgKzU2MSw2IEBACiAgICAgICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX2lwX3Qgc19kZWNfaXA7CiAgICAgICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3Qgc19kZWNfb3A7CiAgICAgICAgICAgICBuc2Vjc190IHRpbWVEZWxheSwgdGltZVRha2VuOwotICAgICAgICAgICAgc2l6ZV90IHNpemVZLCBzaXplVVY7CiAKICAgICAgICAgICAgIGlmICghc2V0RGVjb2RlQXJncygmc19kZWNfaXAsICZzX2RlY19vcCwgaW5IZWFkZXIsIG91dEhlYWRlciwgdGltZVN0YW1wSXgpKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIkRlY29kZXIgYXJnIHNldHVwIGZhaWxlZCIpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9Tb2Z0QVZDRW5jLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvU29mdEFWQ0VuYy5jcHAKaW5kZXggMzU4Yzc0My4uMzJmZGJkMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9Tb2Z0QVZDRW5jLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL1NvZnRBVkNFbmMuY3BwCkBAIC0xMTcwLDYgKzExNzAsMTIgQEAKICAgICBwc19pbnBfcmF3X2J1Zi0+ZV9jb2xvcl9mbXQgPSBtSXZWaWRlb0NvbG9yRm9ybWF0OwogICAgIHNvdXJjZSA9IE5VTEw7CiAgICAgaWYgKChpbnB1dEJ1ZmZlckhlYWRlciAhPSBOVUxMKSAmJiBpbnB1dEJ1ZmZlckhlYWRlci0+bkZpbGxlZExlbikgeworICAgICAgICBPTVhfRVJST1JUWVBFIGVycm9yID0gdmFsaWRhdGVJbnB1dEJ1ZmZlcihpbnB1dEJ1ZmZlckhlYWRlcik7CisgICAgICAgIGlmIChlcnJvciAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICBBTE9HRSgiYi82OTA2NTY1MSIpOworICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICI2OTA2NTY1MSIpOworICAgICAgICAgICAgcmV0dXJuIGVycm9yOworICAgICAgICB9CiAgICAgICAgIHNvdXJjZSA9IGlucHV0QnVmZmVySGVhZGVyLT5wQnVmZmVyICsgaW5wdXRCdWZmZXJIZWFkZXItPm5PZmZzZXQ7CiAKICAgICAgICAgaWYgKG1JbnB1dERhdGFJc01ldGEpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jbWRzL2NvZGVjMi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY21kcy9jb2RlYzIuY3BwCmluZGV4IDE5NzJhN2EuLmFkNTg4NzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jbWRzL2NvZGVjMi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NtZHMvY29kZWMyLmNwcApAQCAtMTk3LDYgKzE5Nyw3IEBACiB9CiAKIHZvaWQgU2ltcGxlUGxheWVyOjpwbGF5KGNvbnN0IHNwPElNZWRpYVNvdXJjZT4gJnNvdXJjZSkgeworICAgIEFMT0dWKCJTaW1wbGVQbGF5ZXI6OnBsYXkiKTsKICAgICBzcDxBTWVzc2FnZT4gZm9ybWF0OwogICAgICh2b2lkKSBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2Uoc291cmNlLT5nZXRGb3JtYXQoKSwgJmZvcm1hdCk7CiAKQEAgLTIxNSwxMSArMjE2LDExIEBACiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQ7CiAgICAgKHZvaWQpc3RvcmUtPmNyZWF0ZUNvbXBvbmVudCgiYzIuZ29vZ2xlLmF2Yy5kZWNvZGVyIiwgJmNvbXBvbmVudCk7CiAKLSAgICAodm9pZCljb21wb25lbnQtPnNldExpc3RlbmVyX3NtKG1MaXN0ZW5lcik7CisgICAgKHZvaWQpY29tcG9uZW50LT5zZXRMaXN0ZW5lcl92YihtTGlzdGVuZXIsIEMyX0RPTlRfQkxPQ0spOwogICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlBvcnRCbG9ja1Bvb2xzVHVuaW5nOjpvdXRwdXQ+IHBvb2xzID0KICAgICAgICAgQzJQb3J0QmxvY2tQb29sc1R1bmluZzo6b3V0cHV0OjphbGxvY191bmlxdWUoeyAodWludDY0X3QpQzJCbG9ja1Bvb2w6OkJBU0lDX0dSQVBISUMgfSk7CiAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IHJlc3VsdDsKLSAgICAodm9pZCljb21wb25lbnQtPmludGYoKS0+Y29uZmlnX25iKHtwb29scy5nZXQoKX0sICZyZXN1bHQpOworICAgICh2b2lkKWNvbXBvbmVudC0+aW50ZigpLT5jb25maWdfdmIoe3Bvb2xzLmdldCgpfSwgQzJfRE9OVF9CTE9DSywgJnJlc3VsdCk7CiAgICAgY29tcG9uZW50LT5zdGFydCgpOwogCiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA4OyArK2kpIHsKQEAgLTM1Myw2ICszNTQsNyBAQAogICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGl0ZW1zOwogICAgICAgICBpdGVtcy5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKIAorICAgICAgICBBTE9HVigiRnJhbWUgIyVsZCBzaXplID0gJXp1IiwgbnVtRnJhbWVzLCBzaXplKTsKICAgICAgICAgLy8gRE8gVEhFIERFQ09ESU5HCiAgICAgICAgIGNvbXBvbmVudC0+cXVldWVfbmIoJml0ZW1zKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9Tb2Z0TVBFRzRFbmNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvU29mdE1QRUc0RW5jb2Rlci5jcHAKaW5kZXggN2I5MGEwMS4uZjZhN2IwZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9Tb2Z0TVBFRzRFbmNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuY3BwCkBAIC00MzQsNiArNDM0LDE0IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoaW5IZWFkZXItPm5GaWxsZWRMZW4gPiAwKSB7CisgICAgICAgICAgICBPTVhfRVJST1JUWVBFIGVycm9yID0gdmFsaWRhdGVJbnB1dEJ1ZmZlcihpbkhlYWRlcik7CisgICAgICAgICAgICBpZiAoZXJyb3IgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJiLzY5MDY1NjUxIik7CisgICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICI2OTA2NTY1MSIpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBlcnJvciwgMCwgMCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQogICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaW5wdXREYXRhID0gTlVMTDsKICAgICAgICAgICAgIGlmIChtSW5wdXREYXRhSXNNZXRhKSB7CiAgICAgICAgICAgICAgICAgaW5wdXREYXRhID0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUFhFbmNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUFhFbmNvZGVyLmNwcAppbmRleCBhNTY2NmRhLi5mNjI1N2IxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlBYRW5jb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQWEVuY29kZXIuY3BwCkBAIC02NTMsNiArNjUzLDEzIEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAorICAgICAgICBPTVhfRVJST1JUWVBFIGVycm9yID0gdmFsaWRhdGVJbnB1dEJ1ZmZlcihpbnB1dEJ1ZmZlckhlYWRlcik7CisgICAgICAgIGlmIChlcnJvciAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICBBTE9HRSgiYi8yNzU2OTYzNSIpOworICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyNzU2OTYzNSIpOworICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBlcnJvciwgMCwgMCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KICAgICAgICAgY29uc3QgdWludDhfdCAqc291cmNlID0KICAgICAgICAgICAgIGlucHV0QnVmZmVySGVhZGVyLT5wQnVmZmVyICsgaW5wdXRCdWZmZXJIZWFkZXItPm5PZmZzZXQ7CiAKQEAgLTY2OCwxNCArNjc1LDYgQEAKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoaW5wdXRCdWZmZXJIZWFkZXItPm5GaWxsZWRMZW4gPCBmcmFtZVNpemUpIHsKLSAgICAgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjI3NTY5NjM1Iik7Ci0gICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIDApOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXRCdWZmZXJIZWFkZXItPm5GaWxsZWRMZW4gPiBmcmFtZVNpemUpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiSW5wdXQgYnVmZmVyIGNvbnRhaW5zIHRvbyBtYW55IHBpeGVscyIpOwotICAgICAgICAgICAgfQotCiAgICAgICAgICAgICBpZiAobUNvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyKSB7CiAgICAgICAgICAgICAgICAgQ29udmVydFlVVjQyMFNlbWlQbGFuYXJUb1lVVjQyMFBsYW5hcigKICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSwgbUNvbnZlcnNpb25CdWZmZXIsIG1XaWR0aCwgbUhlaWdodCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDg0NTA5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLWNjX2xpYnJhcnlfc2hhcmVkIHsKLSAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF9oMjY0ZGVjIiwKLQotICAgIHNyY3M6IFsKLSAgICAgICAgInNvdXJjZS9oMjY0YnNkX3RyYW5zZm9ybS5jIiwKLSAgICAgICAgInNvdXJjZS9oMjY0YnNkX3V0aWwuYyIsCi0gICAgICAgICJzb3VyY2UvaDI2NGJzZF9ieXRlX3N0cmVhbS5jIiwKLSAgICAgICAgInNvdXJjZS9oMjY0YnNkX3NlcV9wYXJhbV9zZXQuYyIsCi0gICAgICAgICJzb3VyY2UvaDI2NGJzZF9waWNfcGFyYW1fc2V0LmMiLAotICAgICAgICAic291cmNlL2gyNjRic2Rfc2xpY2VfaGVhZGVyLmMiLAotICAgICAgICAic291cmNlL2gyNjRic2Rfc2xpY2VfZGF0YS5jIiwKLSAgICAgICAgInNvdXJjZS9oMjY0YnNkX21hY3JvYmxvY2tfbGF5ZXIuYyIsCi0gICAgICAgICJzb3VyY2UvaDI2NGJzZF9zdHJlYW0uYyIsCi0gICAgICAgICJzb3VyY2UvaDI2NGJzZF92bGMuYyIsCi0gICAgICAgICJzb3VyY2UvaDI2NGJzZF9jYXZsYy5jIiwKLSAgICAgICAgInNvdXJjZS9oMjY0YnNkX25hbF91bml0LmMiLAotICAgICAgICAic291cmNlL2gyNjRic2RfbmVpZ2hib3VyLmMiLAotICAgICAgICAic291cmNlL2gyNjRic2Rfc3RvcmFnZS5jIiwKLSAgICAgICAgInNvdXJjZS9oMjY0YnNkX3NsaWNlX2dyb3VwX21hcC5jIiwKLSAgICAgICAgInNvdXJjZS9oMjY0YnNkX2ludHJhX3ByZWRpY3Rpb24uYyIsCi0gICAgICAgICJzb3VyY2UvaDI2NGJzZF9pbnRlcl9wcmVkaWN0aW9uLmMiLAotICAgICAgICAic291cmNlL2gyNjRic2RfcmVjb25zdHJ1Y3QuYyIsCi0gICAgICAgICJzb3VyY2UvaDI2NGJzZF9kcGIuYyIsCi0gICAgICAgICJzb3VyY2UvaDI2NGJzZF9pbWFnZS5jIiwKLSAgICAgICAgInNvdXJjZS9oMjY0YnNkX2RlYmxvY2tpbmcuYyIsCi0gICAgICAgICJzb3VyY2UvaDI2NGJzZF9jb25jZWFsLmMiLAotICAgICAgICAic291cmNlL2gyNjRic2RfdnVpLmMiLAotICAgICAgICAic291cmNlL2gyNjRic2RfcGljX29yZGVyX2NudC5jIiwKLSAgICAgICAgInNvdXJjZS9oMjY0YnNkX2RlY29kZXIuYyIsCi0gICAgICAgICJzb3VyY2UvSDI2NFN3RGVjQXBpLmMiLAotICAgICAgICAiU29mdEFWQy5jcHAiLAotICAgIF0sCi0KLSAgICBhcmNoOiB7Ci0gICAgICAgIGFybTogewotICAgICAgICAgICAgaW5zdHJ1Y3Rpb25fc2V0OiAiYXJtIiwKLQotICAgICAgICAgICAgbmVvbjogewotICAgICAgICAgICAgICAgIGNmbGFnczogWwotICAgICAgICAgICAgICAgICAgICAiLURIMjY0REVDX05FT04iLAotICAgICAgICAgICAgICAgICAgICAiLURIMjY0REVDX09NWERMIiwKLSAgICAgICAgICAgICAgICBdLAotICAgICAgICAgICAgICAgIHNyY3M6IFsKLSAgICAgICAgICAgICAgICAgICAgInNvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2gyNjRic2RXcml0ZU1hY3JvYmxvY2suUyIsCi0gICAgICAgICAgICAgICAgICAgICJzb3VyY2UvYXJtX25lb25fYXNtX2djYy9oMjY0YnNkQ2xlYXJNYkxheWVyLlMiLAotICAgICAgICAgICAgICAgICAgICAic291cmNlL2FybV9uZW9uX2FzbV9nY2MvaDI2NGJzZEZpbGxSb3c3LlMiLAotICAgICAgICAgICAgICAgICAgICAic291cmNlL2FybV9uZW9uX2FzbV9nY2MvaDI2NGJzZENvdW50TGVhZGluZ1plcm9zLlMiLAotICAgICAgICAgICAgICAgICAgICAic291cmNlL2FybV9uZW9uX2FzbV9nY2MvaDI2NGJzZEZsdXNoQml0cy5TIiwKLQotICAgICAgICAgICAgICAgICAgICAib214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLmMiLAotICAgICAgICAgICAgICAgICAgICAib214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5jIiwKLSAgICAgICAgICAgICAgICAgICAgIm9teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLmMiLAotICAgICAgICAgICAgICAgICAgICAib214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuYyIsCi0gICAgICAgICAgICAgICAgICAgICJvbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLmMiLAotICAgICAgICAgICAgICAgICAgICAib214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYyIsCi0gICAgICAgICAgICAgICAgICAgICJvbXhkbC9hcm1fbmVvbi9zcmMvYXJtQ09NTV9CaXRzdHJlYW0uYyIsCi0gICAgICAgICAgICAgICAgICAgICJvbXhkbC9hcm1fbmVvbi9zcmMvYXJtQ09NTS5jIiwKLQotICAgICAgICAgICAgICAgICAgICAib214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFfdW5zYWZlX3MuUyIsCi0gICAgICAgICAgICAgICAgICAgICJvbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFfdW5zYWZlX3MuUyIsCi0gICAgICAgICAgICAgICAgICAgICJvbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX3MuUyIsCi0gICAgICAgICAgICAgICAgICAgICJvbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0FsaWduX3Vuc2FmZV9zLlMiLAotICAgICAgICAgICAgICAgICAgICAib214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5X3Vuc2FmZV9zLlMiLAotICAgICAgICAgICAgICAgICAgICAib214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9EaWFnQ29weV91bnNhZmVfcy5TIiwKLSAgICAgICAgICAgICAgICAgICAgIm9teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlX3MuUyIsCi0gICAgICAgICAgICAgICAgICAgICJvbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZV9zLlMiLAotICAgICAgICAgICAgICAgICAgICAib214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZV9zLlMiLAotICAgICAgICAgICAgICAgICAgICAib214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZV9zLlMiLAotICAgICAgICAgICAgICAgICAgICAib214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JX3MuUyIsCi0gICAgICAgICAgICAgICAgICAgICJvbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0lfcy5TIiwKLSAgICAgICAgICAgICAgICAgICAgIm9teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0lfcy5TIiwKLSAgICAgICAgICAgICAgICAgICAgIm9teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0lfcy5TIiwKLSAgICAgICAgICAgICAgICAgICAgIm9teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfcy5TIiwKLSAgICAgICAgICAgICAgICAgICAgIm9teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9BdmVyYWdlXzR4X0FsaWduX3Vuc2FmZV9zLlMiLAotICAgICAgICAgICAgICAgICAgICAib214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcl9zLlMiLAotICAgICAgICAgICAgICAgICAgICAib214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5TIiwKLSAgICAgICAgICAgICAgICAgICAgIm9teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9RdWFudFRhYmxlc19zLlMiLAotICAgICAgICAgICAgICAgICAgICAib214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0X3MuUyIsCi0gICAgICAgICAgICAgICAgICAgICJvbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDRfcy5TIiwKLSAgICAgICAgICAgICAgICAgICAgIm9teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXJfcy5TIiwKLSAgICAgICAgICAgICAgICAgICAgIm9teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTZfcy5TIiwKLSAgICAgICAgICAgICAgICAgICAgIm9teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0X3MuUyIsCi0gICAgICAgICAgICAgICAgICAgICJvbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OF9zLlMiLAotICAgICAgICAgICAgICAgICAgICAib214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkX3MuUyIsCi0gICAgICAgICAgICAgICAgICAgICJvbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXJfcy5TIiwKLSAgICAgICAgICAgICAgICBdLAotCi0gICAgICAgICAgICAgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICAgICAgICAgICAgICJzb3VyY2UvYXJtX25lb25fYXNtX2djYyIsCi0KLSAgICAgICAgICAgICAgICAgICAgIm9teGRsL2FybV9uZW9uL2FwaSIsCi0gICAgICAgICAgICAgICAgICAgICJvbXhkbC9hcm1fbmVvbi92Yy9hcGkiLAotICAgICAgICAgICAgICAgICAgICAib214ZGwvYXJtX25lb24vdmMvbTRwMTAvYXBpIiwKLSAgICAgICAgICAgICAgICBdLAotICAgICAgICAgICAgfSwKLSAgICAgICAgfSwKLSAgICB9LAotCi0gICAgY2ZsYWdzOiBbIi1XYWxsIiwgIi1XZXJyb3IiXSwKLQotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIiwKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCIsCi0gICAgXSwKLQotICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jIl0sCi0KLSAgICBzYW5pdGl6ZTogewotICAgICAgICBtaXNjX3VuZGVmaW5lZDogWwotICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKLSAgICAgICAgXSwKLSAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICBkaWFnOiB7Ci0gICAgICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIH0sCi0gICAgfSwKLQotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJtZWRpYSIsCi0gICAgICAgICJsaWJtZWRpYV9vbXgiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAotICAgICAgICAibGlidXRpbHMiLAotICAgICAgICAibGlibG9nIiwKLSAgICBdLAotfQotCi0vLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0vLyB0ZXN0IHV0aWxpdHk6IGRlY29kZXIKLS8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLS8vIwotLy8jIFRlc3QgYXBwbGljYXRpb24KLS8vIwotY2NfYmluYXJ5IHsKLSAgICBuYW1lOiAiZGVjb2RlciIsCi0KLSAgICBzcmNzOiBbInNvdXJjZS9EZWNUZXN0QmVuY2guYyJdLAotCi0gICAgY2ZsYWdzOiBbIi1XYWxsIiwgIi1XZXJyb3IiXSwKLQotICAgIHNoYXJlZF9saWJzOiBbImxpYnN0YWdlZnJpZ2h0X3NvZnRfaDI2NGRlYyJdLAotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL1NvZnRBVkMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL1NvZnRBVkMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjYxZDEyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9Tb2Z0QVZDLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDMzNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJTb2Z0QVZDIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiU29mdEFWQy5oIgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL0lPTVguaD4KLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0YXRpYyBjb25zdCBDb2RlY1Byb2ZpbGVMZXZlbCBrUHJvZmlsZUxldmVsc1tdID0gewotICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsMSAgfSwKLSAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDFiIH0sCi0gICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWwxMSB9LAotICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsMTIgfSwKLSAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDEzIH0sCi0gICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWwyICB9LAotICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsMjEgfSwKLSAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDIyIH0sCi0gICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWwzICB9LAotICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsMzEgfSwKLSAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDMyIH0sCi0gICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWw0ICB9LAotICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsNDEgfSwKLSAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDQyIH0sCi0gICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWw1ICB9LAotICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsNTEgfSwKLX07Ci0KLVNvZnRBVkM6OlNvZnRBVkMoCi0gICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCi0gICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKLSAgICAgICAgT01YX1BUUiBhcHBEYXRhLAotICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkKLSAgICA6IFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQoCi0gICAgICAgICAgICBuYW1lLCAidmlkZW9fZGVjb2Rlci5hdmMiLCBPTVhfVklERU9fQ29kaW5nQVZDLAotICAgICAgICAgICAga1Byb2ZpbGVMZXZlbHMsIEFSUkFZX1NJWkUoa1Byb2ZpbGVMZXZlbHMpLAotICAgICAgICAgICAgMzIwIC8qIHdpZHRoICovLCAyNDAgLyogaGVpZ2h0ICovLCBjYWxsYmFja3MsIGFwcERhdGEsIGNvbXBvbmVudCksCi0gICAgICBtSGFuZGxlKE5VTEwpLAotICAgICAgbUlucHV0QnVmZmVyQ291bnQoMCksCi0gICAgICBtRmlyc3RQaWN0dXJlKE5VTEwpLAotICAgICAgbUZpcnN0UGljdHVyZUlkKC0xKSwKLSAgICAgIG1QaWNJZCgwKSwKLSAgICAgIG1IZWFkZXJzRGVjb2RlZChmYWxzZSksCi0gICAgICBtRU9TU3RhdHVzKElOUFVUX0RBVEFfQVZBSUxBQkxFKSwKLSAgICAgIG1TaWduYWxsZWRFcnJvcihmYWxzZSkgewotICAgIGNvbnN0IHNpemVfdCBrTWluQ29tcHJlc3Npb25SYXRpbyA9IDI7Ci0gICAgY29uc3Qgc2l6ZV90IGtNYXhPdXRwdXRCdWZmZXJTaXplID0gMjA0OCAqIDIwNDggKiAzIC8gMjsKLSAgICBpbml0UG9ydHMoCi0gICAgICAgICAgICBrTnVtSW5wdXRCdWZmZXJzLCBrTWF4T3V0cHV0QnVmZmVyU2l6ZSAvIGtNaW5Db21wcmVzc2lvblJhdGlvIC8qIG1pbklucHV0QnVmZmVyU2l6ZSAqLywKLSAgICAgICAgICAgIGtOdW1PdXRwdXRCdWZmZXJzLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsIGtNaW5Db21wcmVzc2lvblJhdGlvKTsKLQotICAgIENIRUNLX0VRKGluaXREZWNvZGVyKCksIChzdGF0dXNfdClPSyk7Ci19Ci0KLVNvZnRBVkM6On5Tb2Z0QVZDKCkgewotICAgIEgyNjRTd0RlY1JlbGVhc2UobUhhbmRsZSk7Ci0gICAgbUhhbmRsZSA9IE5VTEw7Ci0KLSAgICB3aGlsZSAobVBpY1RvSGVhZGVyTWFwLnNpemUoKSAhPSAwKSB7Ci0gICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpoZWFkZXIgPSBtUGljVG9IZWFkZXJNYXAuZWRpdFZhbHVlQXQoMCk7Ci0gICAgICAgIG1QaWNUb0hlYWRlck1hcC5yZW1vdmVJdGVtc0F0KDApOwotICAgICAgICBkZWxldGUgaGVhZGVyOwotICAgICAgICBoZWFkZXIgPSBOVUxMOwotICAgIH0KLSAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJm91dFF1ZXVlID0gZ2V0UG9ydFF1ZXVlKGtPdXRwdXRQb3J0SW5kZXgpOwotICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmaW5RdWV1ZSA9IGdldFBvcnRRdWV1ZShrSW5wdXRQb3J0SW5kZXgpOwotICAgIENIRUNLKG91dFF1ZXVlLmVtcHR5KCkpOwotICAgIENIRUNLKGluUXVldWUuZW1wdHkoKSk7Ci0KLSAgICBkZWxldGVbXSBtRmlyc3RQaWN0dXJlOwotfQotCi1zdGF0dXNfdCBTb2Z0QVZDOjppbml0RGVjb2RlcigpIHsKLSAgICAvLyBGb3JjZSBkZWNvZGVyIHRvIG91dHB1dCBidWZmZXJzIGluIGRpc3BsYXkgb3JkZXIuCi0gICAgaWYgKEgyNjRTd0RlY0luaXQoJm1IYW5kbGUsIDApID09IEgyNjRTV0RFQ19PSykgewotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotfQotCi12b2lkIFNvZnRBVkM6Om9uUXVldWVGaWxsZWQoT01YX1UzMiAvKiBwb3J0SW5kZXggKi8pIHsKLSAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgIT0gTk9ORSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKG1FT1NTdGF0dXMgPT0gT1VUUFVUX0ZSQU1FU19GTFVTSEVEKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJmluUXVldWUgPSBnZXRQb3J0UXVldWUoa0lucHV0UG9ydEluZGV4KTsKLSAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJm91dFF1ZXVlID0gZ2V0UG9ydFF1ZXVlKGtPdXRwdXRQb3J0SW5kZXgpOwotCi0gICAgaWYgKG1IZWFkZXJzRGVjb2RlZCkgewotICAgICAgICAvLyBEZXF1ZXVlIGFueSBhbHJlYWR5IGRlY29kZWQgb3V0cHV0IGZyYW1lcyB0byBmcmVlIHVwIHNwYWNlCi0gICAgICAgIC8vIGluIHRoZSBvdXRwdXQgcXVldWUuCi0KLSAgICAgICAgZHJhaW5BbGxPdXRwdXRCdWZmZXJzKGZhbHNlIC8qIGVvcyAqLyk7Ci0gICAgfQotCi0gICAgSDI2NFN3RGVjUmV0IHJldCA9IEgyNjRTV0RFQ19QSUNfUkRZOwotICAgIGJvb2wgcG9ydFdpbGxSZXNldCA9IGZhbHNlOwotICAgIHdoaWxlICgobUVPU1N0YXR1cyAhPSBJTlBVVF9EQVRBX0FWQUlMQUJMRSB8fCAhaW5RdWV1ZS5lbXB0eSgpKQotICAgICAgICAgICAgJiYgb3V0UXVldWUuc2l6ZSgpID09IGtOdW1PdXRwdXRCdWZmZXJzKSB7Ci0KLSAgICAgICAgaWYgKG1FT1NTdGF0dXMgPT0gSU5QVVRfRU9TX1NFRU4pIHsKLSAgICAgICAgICAgIGRyYWluQWxsT3V0cHV0QnVmZmVycyh0cnVlIC8qIGVvcyAqLyk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBCdWZmZXJJbmZvICppbkluZm8gPSAqaW5RdWV1ZS5iZWdpbigpOwotICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaW5IZWFkZXIgPSBpbkluZm8tPm1IZWFkZXI7Ci0gICAgICAgICsrbVBpY0lkOwotCi0gICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpoZWFkZXIgPSBuZXcgT01YX0JVRkZFUkhFQURFUlRZUEU7Ci0gICAgICAgIG1lbXNldChoZWFkZXIsIDAsIHNpemVvZihPTVhfQlVGRkVSSEVBREVSVFlQRSkpOwotICAgICAgICBoZWFkZXItPm5UaW1lU3RhbXAgPSBpbkhlYWRlci0+blRpbWVTdGFtcDsKLSAgICAgICAgaGVhZGVyLT5uRmxhZ3MgPSBpbkhlYWRlci0+bkZsYWdzOwotICAgICAgICBpZiAoaGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpIHsKLSAgICAgICAgICAgIG1FT1NTdGF0dXMgPSBJTlBVVF9FT1NfU0VFTjsKLSAgICAgICAgfQotICAgICAgICBtUGljVG9IZWFkZXJNYXAuYWRkKG1QaWNJZCwgaGVhZGVyKTsKLSAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOwotCi0gICAgICAgIEgyNjRTd0RlY0lucHV0IGluUGljdHVyZTsKLSAgICAgICAgSDI2NFN3RGVjT3V0cHV0IG91dFBpY3R1cmU7Ci0gICAgICAgIG1lbXNldCgmaW5QaWN0dXJlLCAwLCBzaXplb2YoaW5QaWN0dXJlKSk7Ci0gICAgICAgIGluUGljdHVyZS5kYXRhTGVuID0gaW5IZWFkZXItPm5GaWxsZWRMZW47Ci0gICAgICAgIGluUGljdHVyZS5wU3RyZWFtID0gaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldDsKLSAgICAgICAgaW5QaWN0dXJlLnBpY0lkID0gbVBpY0lkOwotICAgICAgICBpblBpY3R1cmUuaW50cmFDb25jZWFsbWVudE1ldGhvZCA9IDE7Ci0gICAgICAgIEgyNjRTd0RlY1BpY3R1cmUgZGVjb2RlZFBpY3R1cmU7Ci0KLSAgICAgICAgd2hpbGUgKGluUGljdHVyZS5kYXRhTGVuID4gMCkgewotICAgICAgICAgICAgcmV0ID0gSDI2NFN3RGVjRGVjb2RlKG1IYW5kbGUsICZpblBpY3R1cmUsICZvdXRQaWN0dXJlKTsKLSAgICAgICAgICAgIGlmIChyZXQgPT0gSDI2NFNXREVDX0hEUlNfUkRZX0JVRkZfTk9UX0VNUFRZIHx8Ci0gICAgICAgICAgICAgICAgcmV0ID09IEgyNjRTV0RFQ19QSUNfUkRZX0JVRkZfTk9UX0VNUFRZKSB7Ci0gICAgICAgICAgICAgICAgaW5QaWN0dXJlLmRhdGFMZW4gLT0gKHUzMikob3V0UGljdHVyZS5wU3RybUN1cnJQb3MgLSBpblBpY3R1cmUucFN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgaW5QaWN0dXJlLnBTdHJlYW0gPSBvdXRQaWN0dXJlLnBTdHJtQ3VyclBvczsKLSAgICAgICAgICAgICAgICBpZiAocmV0ID09IEgyNjRTV0RFQ19IRFJTX1JEWV9CVUZGX05PVF9FTVBUWSkgewotICAgICAgICAgICAgICAgICAgICBtSGVhZGVyc0RlY29kZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBIMjY0U3dEZWNJbmZvIGRlY29kZXJJbmZvOwotICAgICAgICAgICAgICAgICAgICBDSEVDSyhIMjY0U3dEZWNHZXRJbmZvKG1IYW5kbGUsICZkZWNvZGVySW5mbykgPT0gSDI2NFNXREVDX09LKTsKLQotICAgICAgICAgICAgICAgICAgICBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50OjpDcm9wU2V0dGluZ3NNb2RlIGNyb3BTZXR0aW5nc01vZGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlQ3JvcFBhcmFtcyhkZWNvZGVySW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZVBvcnRTZXR0aW5nc0NoYW5nZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcG9ydFdpbGxSZXNldCwgZGVjb2RlckluZm8ucGljV2lkdGgsIGRlY29kZXJJbmZvLnBpY0hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9wU2V0dGluZ3NNb2RlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChwb3J0V2lsbFJlc2V0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChIMjY0U3dEZWNOZXh0UGljdHVyZShtSGFuZGxlLCAmZGVjb2RlZFBpY3R1cmUsIDApCi0gICAgICAgICAgICAgICAgICAgICAgICA9PSBIMjY0U1dERUNfUElDX1JEWSkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBTYXZlIHRoaXMgb3V0cHV0IGJ1ZmZlcjsgb3RoZXJ3aXNlLCBpdCB3aWxsIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBsb3N0IGR1cmluZyBkeW5hbWljIHBvcnQgcmVjb25maWd1cmF0aW9uIGJlY2F1c2UKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9wZW5NQVggY2xpZW50IHdpbGwgZGVsZXRlIF9hbGxfIG91dHB1dCBidWZmZXJzCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgcHJvY2Vzcy4KLSAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVGaXJzdE91dHB1dEJ1ZmZlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkUGljdHVyZS5waWNJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDhfdCAqKWRlY29kZWRQaWN0dXJlLnBPdXRwdXRQaWN0dXJlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpblBpY3R1cmUuZGF0YUxlbiA9IDA7Ci0gICAgICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkRlY29kZXIgZmFpbGVkOiAlZCIsIHJldCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJPUl9NQUxGT1JNRUQsIE5VTEwpOwotCi0gICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7Ci0gICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7Ci0KLSAgICAgICAgaWYgKHBvcnRXaWxsUmVzZXQpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtRmlyc3RQaWN0dXJlICYmICFvdXRRdWV1ZS5lbXB0eSgpKSB7Ci0gICAgICAgICAgICBpZiAoIWRyYWluT25lT3V0cHV0QnVmZmVyKG1GaXJzdFBpY3R1cmVJZCwgbUZpcnN0UGljdHVyZSkpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiRHJhaW4gZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOwotICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVsZXRlW10gbUZpcnN0UGljdHVyZTsKLSAgICAgICAgICAgIG1GaXJzdFBpY3R1cmUgPSBOVUxMOwotICAgICAgICAgICAgbUZpcnN0UGljdHVyZUlkID0gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICBkcmFpbkFsbE91dHB1dEJ1ZmZlcnMoZmFsc2UgLyogZW9zICovKTsKLSAgICB9Ci19Ci0KLVNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6OkNyb3BTZXR0aW5nc01vZGUgU29mdEFWQzo6aGFuZGxlQ3JvcFBhcmFtcygKLSAgICAgICAgY29uc3QgSDI2NFN3RGVjSW5mbyYgZGVjSW5mbykgewotICAgIGlmICghZGVjSW5mby5jcm9wcGluZ0ZsYWcpIHsKLSAgICAgICAgcmV0dXJuIGtDcm9wVW5TZXQ7Ci0gICAgfQotCi0gICAgY29uc3QgQ3JvcFBhcmFtcyYgY3JvcCA9IGRlY0luZm8uY3JvcFBhcmFtczsKLSAgICBpZiAobUNyb3BMZWZ0ID09IGNyb3AuY3JvcExlZnRPZmZzZXQgJiYKLSAgICAgICAgbUNyb3BUb3AgPT0gY3JvcC5jcm9wVG9wT2Zmc2V0ICYmCi0gICAgICAgIG1Dcm9wV2lkdGggPT0gY3JvcC5jcm9wT3V0V2lkdGggJiYKLSAgICAgICAgbUNyb3BIZWlnaHQgPT0gY3JvcC5jcm9wT3V0SGVpZ2h0KSB7Ci0gICAgICAgIHJldHVybiBrQ3JvcFNldDsKLSAgICB9Ci0KLSAgICBtQ3JvcExlZnQgPSBjcm9wLmNyb3BMZWZ0T2Zmc2V0OwotICAgIG1Dcm9wVG9wID0gY3JvcC5jcm9wVG9wT2Zmc2V0OwotICAgIG1Dcm9wV2lkdGggPSBjcm9wLmNyb3BPdXRXaWR0aDsKLSAgICBtQ3JvcEhlaWdodCA9IGNyb3AuY3JvcE91dEhlaWdodDsKLSAgICByZXR1cm4ga0Nyb3BDaGFuZ2VkOwotfQotCi12b2lkIFNvZnRBVkM6OnNhdmVGaXJzdE91dHB1dEJ1ZmZlcihpbnQzMl90IHBpY0lkLCB1aW50OF90ICpkYXRhKSB7Ci0gICAgQ0hFQ0sobUZpcnN0UGljdHVyZSA9PSBOVUxMKTsKLSAgICBtRmlyc3RQaWN0dXJlSWQgPSBwaWNJZDsKLQotICAgIHVpbnQzMl90IHBpY3R1cmVTaXplID0gbVdpZHRoICogbUhlaWdodCAqIDMgLyAyOwotICAgIG1GaXJzdFBpY3R1cmUgPSBuZXcgdWludDhfdFtwaWN0dXJlU2l6ZV07Ci0gICAgbWVtY3B5KG1GaXJzdFBpY3R1cmUsIGRhdGEsIHBpY3R1cmVTaXplKTsKLX0KLQotYm9vbCBTb2Z0QVZDOjpkcmFpbk9uZU91dHB1dEJ1ZmZlcihpbnQzMl90IHBpY0lkLCB1aW50OF90KiBkYXRhKSB7Ci0gICAgTGlzdDxCdWZmZXJJbmZvICo+ICZvdXRRdWV1ZSA9IGdldFBvcnRRdWV1ZShrT3V0cHV0UG9ydEluZGV4KTsKLSAgICBCdWZmZXJJbmZvICpvdXRJbmZvID0gKm91dFF1ZXVlLmJlZ2luKCk7Ci0gICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dEhlYWRlciA9IG91dEluZm8tPm1IZWFkZXI7Ci0gICAgT01YX1UzMiBmcmFtZVNpemUgPSBtV2lkdGggKiBtSGVpZ2h0ICogMyAvIDI7Ci0gICAgaWYgKG91dEhlYWRlci0+bkFsbG9jTGVuIC0gb3V0SGVhZGVyLT5uT2Zmc2V0IDwgZnJhbWVTaXplKSB7Ci0gICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMjc4MzM2MTYiKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKLSAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyID0gbVBpY1RvSGVhZGVyTWFwLnZhbHVlRm9yKHBpY0lkKTsKLSAgICBvdXRIZWFkZXItPm5UaW1lU3RhbXAgPSBoZWFkZXItPm5UaW1lU3RhbXA7Ci0gICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSBoZWFkZXItPm5GbGFnczsKLSAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSBmcmFtZVNpemU7Ci0KLSAgICB1aW50OF90ICpkc3QgPSBvdXRIZWFkZXItPnBCdWZmZXIgKyBvdXRIZWFkZXItPm5PZmZzZXQ7Ci0gICAgY29uc3QgdWludDhfdCAqc3JjWSA9IGRhdGE7Ci0gICAgY29uc3QgdWludDhfdCAqc3JjVSA9IHNyY1kgKyBtV2lkdGggKiBtSGVpZ2h0OwotICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1YgPSBzcmNVICsgbVdpZHRoICogbUhlaWdodCAvIDQ7Ci0gICAgc2l6ZV90IHNyY1lTdHJpZGUgPSBtV2lkdGg7Ci0gICAgc2l6ZV90IHNyY1VTdHJpZGUgPSBtV2lkdGggLyAyOwotICAgIHNpemVfdCBzcmNWU3RyaWRlID0gc3JjVVN0cmlkZTsKLSAgICBjb3B5WVYxMkZyYW1lVG9PdXRwdXRCdWZmZXIoZHN0LCBzcmNZLCBzcmNVLCBzcmNWLCBzcmNZU3RyaWRlLCBzcmNVU3RyaWRlLCBzcmNWU3RyaWRlKTsKLQotICAgIG1QaWNUb0hlYWRlck1hcC5yZW1vdmVJdGVtKHBpY0lkKTsKLSAgICBkZWxldGUgaGVhZGVyOwotICAgIG91dEluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKLSAgICBub3RpZnlGaWxsQnVmZmVyRG9uZShvdXRIZWFkZXIpOwotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIFNvZnRBVkM6OmRyYWluQWxsT3V0cHV0QnVmZmVycyhib29sIGVvcykgewotICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmb3V0UXVldWUgPSBnZXRQb3J0UXVldWUoa091dHB1dFBvcnRJbmRleCk7Ci0gICAgSDI2NFN3RGVjUGljdHVyZSBkZWNvZGVkUGljdHVyZTsKLQotICAgIGlmIChtSGVhZGVyc0RlY29kZWQpIHsKLSAgICAgICAgd2hpbGUgKCFvdXRRdWV1ZS5lbXB0eSgpCi0gICAgICAgICAgICAgICAgJiYgSDI2NFNXREVDX1BJQ19SRFkgPT0gSDI2NFN3RGVjTmV4dFBpY3R1cmUoCi0gICAgICAgICAgICAgICAgICAgIG1IYW5kbGUsICZkZWNvZGVkUGljdHVyZSwgZW9zIC8qIGZsdXNoICovKSkgewotICAgICAgICAgICAgaW50MzJfdCBwaWNJZCA9IGRlY29kZWRQaWN0dXJlLnBpY0lkOwotICAgICAgICAgICAgdWludDhfdCAqZGF0YSA9ICh1aW50OF90ICopIGRlY29kZWRQaWN0dXJlLnBPdXRwdXRQaWN0dXJlOwotICAgICAgICAgICAgaWYgKCFkcmFpbk9uZU91dHB1dEJ1ZmZlcihwaWNJZCwgZGF0YSkpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiRHJhaW4gZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOwotICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFlb3MpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHdoaWxlICghb3V0UXVldWUuZW1wdHkoKSkgewotICAgICAgICBCdWZmZXJJbmZvICpvdXRJbmZvID0gKm91dFF1ZXVlLmJlZ2luKCk7Ci0gICAgICAgIG91dFF1ZXVlLmVyYXNlKG91dFF1ZXVlLmJlZ2luKCkpOwotICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqb3V0SGVhZGVyID0gb3V0SW5mby0+bUhlYWRlcjsKLQotICAgICAgICBvdXRIZWFkZXItPm5UaW1lU3RhbXAgPSAwOwotICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSAwOwotICAgICAgICBvdXRIZWFkZXItPm5GbGFncyA9IE9NWF9CVUZGRVJGTEFHX0VPUzsKLQotICAgICAgICBvdXRJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7Ci0gICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dEhlYWRlcik7Ci0KLSAgICAgICAgbUVPU1N0YXR1cyA9IE9VVFBVVF9GUkFNRVNfRkxVU0hFRDsKLSAgICB9Ci19Ci0KLXZvaWQgU29mdEFWQzo6b25Qb3J0Rmx1c2hDb21wbGV0ZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKLSAgICBpZiAocG9ydEluZGV4ID09IGtJbnB1dFBvcnRJbmRleCkgewotICAgICAgICBtRU9TU3RhdHVzID0gSU5QVVRfREFUQV9BVkFJTEFCTEU7Ci0gICAgfQotfQotCi12b2lkIFNvZnRBVkM6Om9uUmVzZXQoKSB7Ci0gICAgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6b25SZXNldCgpOwotICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi1hbmRyb2lkOjpTb2Z0T01YQ29tcG9uZW50ICpjcmVhdGVTb2Z0T01YQ29tcG9uZW50KAotICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCi0gICAgICAgIE9NWF9QVFIgYXBwRGF0YSwgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpIHsKLSAgICByZXR1cm4gbmV3IGFuZHJvaWQ6OlNvZnRBVkMobmFtZSwgY2FsbGJhY2tzLCBhcHBEYXRhLCBjb21wb25lbnQpOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL1NvZnRBVkMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9Tb2Z0QVZDLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhZDk4OGIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL1NvZnRBVkMuaAorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFNPRlRfQVZDX0hfCi0KLSNkZWZpbmUgU09GVF9BVkNfSF8KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLQotI2luY2x1ZGUgIkgyNjRTd0RlY0FwaS5oIgotI2luY2x1ZGUgImJhc2V0eXBlLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IFNvZnRBVkMgOiBwdWJsaWMgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudCB7Ci0gICAgU29mdEFWQyhjb25zdCBjaGFyICpuYW1lLAotICAgICAgICAgICAgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAotICAgICAgICAgICAgT01YX1BUUiBhcHBEYXRhLAotICAgICAgICAgICAgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+U29mdEFWQygpOwotCi0gICAgdmlydHVhbCB2b2lkIG9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpOwotICAgIHZpcnR1YWwgdm9pZCBvblBvcnRGbHVzaENvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCk7Ci0gICAgdmlydHVhbCB2b2lkIG9uUmVzZXQoKTsKLQotcHJpdmF0ZToKLSAgICBlbnVtIHsKLSAgICAgICAga051bUlucHV0QnVmZmVycyAgPSA4LAotICAgICAgICBrTnVtT3V0cHV0QnVmZmVycyA9IDIsCi0gICAgfTsKLQotICAgIGVudW0gRU9TU3RhdHVzIHsKLSAgICAgICAgSU5QVVRfREFUQV9BVkFJTEFCTEUsCi0gICAgICAgIElOUFVUX0VPU19TRUVOLAotICAgICAgICBPVVRQVVRfRlJBTUVTX0ZMVVNIRUQsCi0gICAgfTsKLQotICAgIHZvaWQgKm1IYW5kbGU7Ci0KLSAgICBzaXplX3QgbUlucHV0QnVmZmVyQ291bnQ7Ci0KLSAgICB1aW50OF90ICptRmlyc3RQaWN0dXJlOwotICAgIGludDMyX3QgbUZpcnN0UGljdHVyZUlkOwotCi0gICAgaW50MzJfdCBtUGljSWQ7ICAvLyBXaGljaCBvdXRwdXQgcGljdHVyZSBpcyBmb3Igd2hpY2ggaW5wdXQgYnVmZmVyPwotCi0gICAgLy8gT01YX0JVRkZFUkhFQURFUlRZUEUgbWF5IGJlIG92ZXJraWxsLCBidXQgaXQgaXMgY29udmVuaWVudAotICAgIC8vIGZvciB0cmFja2luZyB0aGUgZm9sbG93aW5nIGZpZWxkczogbkZsYWdzLCBuVGltZVN0YW1wLCBldGMuCi0gICAgS2V5ZWRWZWN0b3I8aW50MzJfdCwgT01YX0JVRkZFUkhFQURFUlRZUEUgKj4gbVBpY1RvSGVhZGVyTWFwOwotICAgIGJvb2wgbUhlYWRlcnNEZWNvZGVkOwotCi0gICAgRU9TU3RhdHVzIG1FT1NTdGF0dXM7Ci0KLSAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKLQotICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7Ci0gICAgdm9pZCBkcmFpbkFsbE91dHB1dEJ1ZmZlcnMoYm9vbCBlb3MpOwotICAgIGJvb2wgZHJhaW5PbmVPdXRwdXRCdWZmZXIoaW50MzJfdCBwaWNJZCwgdWludDhfdCAqZGF0YSk7Ci0gICAgdm9pZCBzYXZlRmlyc3RPdXRwdXRCdWZmZXIoaW50MzJfdCBwaWRJZCwgdWludDhfdCAqZGF0YSk7Ci0gICAgQ3JvcFNldHRpbmdzTW9kZSBoYW5kbGVDcm9wUGFyYW1zKGNvbnN0IEgyNjRTd0RlY0luZm8mIGRlY0luZm8pOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU29mdEFWQyk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIFNPRlRfQVZDX0hfCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9pbmMvSDI2NFN3RGVjQXBpLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvaW5jL0gyNjRTd0RlY0FwaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODE0ZTczLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9pbmMvSDI2NFN3RGVjQXBpLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgMS4gSW5jbHVkZSBIZWFkZXJzCi0KLSAgICAyLiBFbnVtZXJhdGlvbnMgdXNlZCBhcyBhIHJldHVybiB2YWx1ZSBvciBhIHBhcmFtZXRlci4KLSAgICAgICAgMi4xLiBBUEkncyByZXR1cm4gdmFsdWUgZW51bWVyYXRpb25zLgotCi0gICAgMy4gVXNlciBTdHJ1Y3R1cmVzCi0gICAgICAgIDMuMS4gU3RydWN0dXJlcyBmb3IgSDI2NFN3RGVjRGVjb2RlKCkgcGFyYW1ldGVycy4KLSAgICAgICAgMy4yLiBTdHJ1Y3R1cmVzIGZvciBpbmZvcm1hdGlvbiBpbnRlcmNoYW5nZSB3aXRoCi0gICAgICAgICAgICAgREVDIEFQSSBhbmQgdXNlciBhcHBsaWNhdGlvbi4KLQotICAgIDQuIFByb3RvdHlwZXMgb2YgRGVjb2RlciBBUEkgZnVuY3Rpb25zCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgSDI2NFNXREVDQVBJX0gKLSNkZWZpbmUgSDI2NFNXREVDQVBJX0gKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi17Ci0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIEhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSAgICAjaW5jbHVkZSAiYmFzZXR5cGUuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLjEuIEFQSSdzIHJldHVybiB2YWx1ZSBlbnVtZXJhdGlvbnMuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgdHlwZWRlZiBlbnVtCi0gICAgewotICAgICAgICBIMjY0U1dERUNfT0sgPSAwLAotICAgICAgICBIMjY0U1dERUNfU1RSTV9QUk9DRVNTRUQgPSAxLAotICAgICAgICBIMjY0U1dERUNfUElDX1JEWSwKLSAgICAgICAgSDI2NFNXREVDX1BJQ19SRFlfQlVGRl9OT1RfRU1QVFksCi0gICAgICAgIEgyNjRTV0RFQ19IRFJTX1JEWV9CVUZGX05PVF9FTVBUWSwKLSAgICAgICAgSDI2NFNXREVDX1BBUkFNX0VSUiA9IC0xLAotICAgICAgICBIMjY0U1dERUNfU1RSTV9FUlIgPSAtMiwKLSAgICAgICAgSDI2NFNXREVDX05PVF9JTklUSUFMSVpFRCA9IC0zLAotICAgICAgICBIMjY0U1dERUNfTUVNRkFJTCA9IC00LAotICAgICAgICBIMjY0U1dERUNfSU5JVEZBSUwgPSAtNSwKLSAgICAgICAgSDI2NFNXREVDX0hEUlNfTk9UX1JEWSA9IC02LAotICAgICAgICBIMjY0U1dERUNfRVZBTFVBVElPTl9MSU1JVF9FWENFRURFRCA9IC03Ci0gICAgfSBIMjY0U3dEZWNSZXQ7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4xLiBTdHJ1Y3R1cmVzIGZvciBIMjY0U3dEZWNEZWNvZGUoKSBwYXJhbWV0ZXJzLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotICAgIC8qIHR5cGVkZWYgb2YgdGhlIERlY29kZXIgaW5zdGFuY2UgKi8KLSAgICB0eXBlZGVmIHZvaWQgKkgyNjRTd0RlY0luc3Q7Ci0KLSAgICAvKiBJbnB1dCBzdHJ1Y3R1cmUgKi8KLSAgICB0eXBlZGVmIHN0cnVjdAotICAgIHsKLSAgICAgICAgdTggICpwU3RyZWFtOyAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gc3RyZWFtIHRvIGJlIGRlY29kZWQgICAgICAgICAgKi8KLSAgICAgICAgdTMyICBkYXRhTGVuOyAgICAgICAgICAgIC8qIE51bWJlciBvZiBieXRlcyB0byBiZSBkZWNvZGVkICAgICAgICAgICAgKi8KLSAgICAgICAgdTMyICBwaWNJZDsgICAgICAgICAgICAgIC8qIElkZW50aWZpZXIgZm9yIHRoZSBwaWN0dXJlIHRvIGJlIGRlY29kZWQgKi8KLSAgICAgICAgdTMyIGludHJhQ29uY2VhbG1lbnRNZXRob2Q7IC8qIDAgPSBHcmF5IGNvbmNlYWxtZW50IGZvciBpbnRyYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSA9IFJlZmVyZW5jZSBjb25jZWFsbWVudCBmb3IgaW50cmEgKi8KLQotICAgIH0gSDI2NFN3RGVjSW5wdXQ7Ci0KLQotICAgIC8qIE91dHB1dCBzdHJ1Y3R1cmUgKi8KLSAgICB0eXBlZGVmIHN0cnVjdAotICAgIHsKLSAgICAgICAgdTggICpwU3RybUN1cnJQb3M7ICAgICAgLyogUG9pbnRlciB0byBzdHJlYW0gcG9zaXRpb24gd2hlcmUgZGVjb2RlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRlZCB1cCAqLwotICAgIH0gSDI2NFN3RGVjT3V0cHV0OwotCi0gICAgLyogT3V0cHV0IHN0cnVjdHVyZSBmb3IgSDI2NFN3RGVjTmV4dFBpY3R1cmUgKi8KLSAgICB0eXBlZGVmIHN0cnVjdAotICAgIHsKLSAgICAgICAgdTMyICpwT3V0cHV0UGljdHVyZTsgICAgLyogUG9pbnRlciB0byB0aGUgcGljdHVyZSwgWVVWIGZvcm1hdCAgICAgICAqLwotICAgICAgICB1MzIgcGljSWQ7ICAgICAgICAgICAgICAvKiBJZGVudGlmaWVyIG9mIHRoZSBwaWN0dXJlIHRvIGJlIGRpc3BsYXllZCovCi0gICAgICAgIHUzMiBpc0lkclBpY3R1cmU7ICAgICAgIC8qIEZsYWcgdG8gaW5kaWNhdGUgaWYgdGhlIHBpY3R1cmUgaXMgYW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURSIHBpY3R1cmUgKi8KLSAgICAgICAgdTMyIG5ick9mRXJyTUJzOyAgICAgICAgLyogTnVtYmVyIG9mIGNvbmNlYWxlZCBNQidzIGluIHRoZSBwaWN0dXJlICAqLwotICAgIH0gSDI2NFN3RGVjUGljdHVyZTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLjIuIFN0cnVjdHVyZXMgZm9yIGluZm9ybWF0aW9uIGludGVyY2hhbmdlIHdpdGggREVDIEFQSQotICAgICAgICAgYW5kIHVzZXIgYXBwbGljYXRpb24uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgdHlwZWRlZiBzdHJ1Y3QKLSAgICB7Ci0gICAgICAgIHUzMiBjcm9wTGVmdE9mZnNldDsKLSAgICAgICAgdTMyIGNyb3BPdXRXaWR0aDsKLSAgICAgICAgdTMyIGNyb3BUb3BPZmZzZXQ7Ci0gICAgICAgIHUzMiBjcm9wT3V0SGVpZ2h0OwotICAgIH0gQ3JvcFBhcmFtczsKLQotICAgIHR5cGVkZWYgc3RydWN0Ci0gICAgewotICAgICAgICB1MzIgcHJvZmlsZTsKLSAgICAgICAgdTMyIHBpY1dpZHRoOwotICAgICAgICB1MzIgcGljSGVpZ2h0OwotICAgICAgICB1MzIgdmlkZW9SYW5nZTsKLSAgICAgICAgdTMyIG1hdHJpeENvZWZmaWNpZW50czsKLSAgICAgICAgdTMyIHBhcldpZHRoOwotICAgICAgICB1MzIgcGFySGVpZ2h0OwotICAgICAgICB1MzIgY3JvcHBpbmdGbGFnOwotICAgICAgICBDcm9wUGFyYW1zIGNyb3BQYXJhbXM7Ci0gICAgfSBIMjY0U3dEZWNJbmZvOwotCi0gICAgLyogVmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIHR5cGVkZWYgc3RydWN0Ci0gICAgewotICAgICAgICB1MzIgbWFqb3I7ICAgIC8qIERlY29kZXIgQVBJIG1ham9yIHZlcnNpb24gKi8KLSAgICAgICAgdTMyIG1pbm9yOyAgICAvKiBEbmNvZGVyIEFQSSBtaW5vciB2ZXJzaW9uICovCi0gICAgfSBIMjY0U3dEZWNBcGlWZXJzaW9uOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIFByb3RvdHlwZXMgb2YgRGVjb2RlciBBUEkgZnVuY3Rpb25zCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgSDI2NFN3RGVjUmV0IEgyNjRTd0RlY0RlY29kZShIMjY0U3dEZWNJbnN0ICAgICAgZGVjSW5zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEgyNjRTd0RlY0lucHV0ICAgICAqcElucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSDI2NFN3RGVjT3V0cHV0ICAgICpwT3V0cHV0KTsKLQotICAgIEgyNjRTd0RlY1JldCBIMjY0U3dEZWNJbml0KEgyNjRTd0RlY0luc3QgKmRlY0luc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyICAgICAgICAgICAgbm9PdXRwdXRSZW9yZGVyaW5nKTsKLQotICAgIEgyNjRTd0RlY1JldCBIMjY0U3dEZWNOZXh0UGljdHVyZShIMjY0U3dEZWNJbnN0ICAgICBkZWNJbnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIMjY0U3dEZWNQaWN0dXJlICpwT3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgICAgICAgICAgICAgICBlbmRPZlN0cmVhbSk7Ci0KLSAgICBIMjY0U3dEZWNSZXQgSDI2NFN3RGVjR2V0SW5mbyhIMjY0U3dEZWNJbnN0IGRlY0luc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSDI2NFN3RGVjSW5mbyAqcERlY0luZm8pOwotCi0gICAgdm9pZCAgSDI2NFN3RGVjUmVsZWFzZShIMjY0U3dEZWNJbnN0IGRlY0luc3QpOwotCi0gICAgSDI2NFN3RGVjQXBpVmVyc2lvbiBIMjY0U3dEZWNHZXRBUElWZXJzaW9uKHZvaWQpOwotCi0gICAgLyogZnVuY3Rpb24gcHJvdG90eXBlIGZvciBBUEkgdHJhY2UgKi8KLSAgICB2b2lkIEgyNjRTd0RlY1RyYWNlKGNoYXIgKik7Ci0KLSAgICAvKiBmdW5jdGlvbiBwcm90b3R5cGUgZm9yIG1lbW9yeSBhbGxvY2F0aW9uICovCi0gICAgdm9pZCogSDI2NFN3RGVjTWFsbG9jKHUzMiBzaXplLCB1MzIgbnVtKTsKLQotICAgIC8qIGZ1bmN0aW9uIHByb3RvdHlwZSBmb3IgbWVtb3J5IGZyZWUgKi8KLSAgICB2b2lkIEgyNjRTd0RlY0ZyZWUodm9pZCAqcHRyKTsKLQotICAgIC8qIGZ1bmN0aW9uIHByb3RvdHlwZSBmb3IgbWVtb3J5IGNvcHkgKi8KLSAgICB2b2lkIEgyNjRTd0RlY01lbWNweSh2b2lkICpkZXN0LCB2b2lkICpzcmMsIHUzMiBjb3VudCk7Ci0KLSAgICAvKiBmdW5jdGlvbiBwcm90b3R5cGUgZm9yIG1lbXNldCAqLwotICAgIHZvaWQgSDI2NFN3RGVjTWVtc2V0KHZvaWQgKnB0ciwgaTMyIHZhbHVlLCB1MzIgY291bnQpOwotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBIMjY0U1dERUNBUElfSCAqLwotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL2luYy9iYXNldHlwZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL2luYy9iYXNldHlwZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2Q1NjUzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9pbmMvYmFzZXR5cGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLSNpZm5kZWYgQkFTRVRZUEVfSF9JTkNMVURFRAotI2RlZmluZSBCQVNFVFlQRV9IX0lOQ0xVREVECi0KLQotI2lmZGVmIF9fYXJtCi0jZGVmaW5lIFZPTEFUSUxFIHZvbGF0aWxlCi0jZWxzZQotI2RlZmluZSBWT0xBVElMRQotI2VuZGlmCi0KLXR5cGVkZWYgdW5zaWduZWQgY2hhciAgIHU4OwotdHlwZWRlZiBzaWduZWQgY2hhciAgICAgaTg7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0ICB1MTY7Ci10eXBlZGVmIHNpZ25lZCBzaG9ydCAgICBpMTY7Ci10eXBlZGVmIHVuc2lnbmVkIGludCAgICB1MzI7Ci10eXBlZGVmIHNpZ25lZCBpbnQgICAgICBpMzI7Ci0KLSNpZiBkZWZpbmVkKFZDMVNXREVDXzE2QklUKSB8fCBkZWZpbmVkKE1QNEVOQ19BUk0xMSkKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgIHUxNng7Ci10eXBlZGVmIHNpZ25lZCBzaG9ydCAgICBpMTZ4OwotI2Vsc2UKLXR5cGVkZWYgdW5zaWduZWQgaW50ICAgIHUxNng7Ci10eXBlZGVmIHNpZ25lZCBpbnQgICAgICBpMTZ4OwotI2VuZGlmCi0KLQotI2lmbmRlZiBOVUxMCi0jaWZkZWYgIF9fY3BsdXNwbHVzCi0jZGVmaW5lIE5VTEwgMAotI2Vsc2UKLSNkZWZpbmUgTlVMTCAoKHZvaWQgKikwKQotI2VuZGlmCi0jZW5kaWYKLQotI2VuZGlmICAvKiBCQVNFVFlQRV9IX0lOQ0xVREVEICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvQVJNX0RFTElWRVJZLlRYVCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9BUk1fREVMSVZFUlkuVFhUCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2U3MGNhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9BUk1fREVMSVZFUlkuVFhUCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotVGhlIGNvbnRlbnRzIG9mIHRoaXMgdHJhbnNhY3Rpb24gd2FzIGNyZWF0ZWQgYnkgSGVkbGV5IEZyYW5jaXMKLW9mIEFSTSBvbiAxOS1GZWItMjAwOC4KLQotSXQgY29udGFpbnMgdGhlIEFSTSBkYXRhIHZlcnNpb25zIGxpc3RlZCBiZWxvdy4KLQotVGhpcyBkYXRhLCB1bmxlc3Mgb3RoZXJ3aXNlIHN0YXRlZCwgaXMgQVJNIFByb3ByaWV0YXJ5IGFuZCBhY2Nlc3MgdG8gaXQKLWlzIHN1YmplY3QgdG8gdGhlIGFncmVlbWVudHMgaW5kaWNhdGVkIGJlbG93LgotCi1JZiB5b3UgZXhwZXJpZW5jZSBwcm9ibGVtcyB3aXRoIHRoaXMgZGF0YSwgcGxlYXNlIGNvbnRhY3QgQVJNIHN1cHBvcnQKLXF1b3RpbmcgdHJhbnNhY3Rpb24gcmVmZXJlbmNlIDw5NzQxMz4uCi0KLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0KLQotLSBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MQotICBWaWRlbyBjb2RlY3MgLSBvcHRpbWlzZWQgY29kZQotICBWNiBvcHRpbWl6ZWQgY29kZSByZWxlYXNlIGZvciBIYW50cm8gKFZlciAxLjAuMikKLSAgaW50ZXJuYWwgYWNjZXNzCi0KLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0KLQotVGhpcyB0cmFuc2FjdGlvbiBjb250YWlucyBkZWxpdmVyYWJsZXMgd2hpY2ggYXJlIGRlc2lnbmF0ZWQgYXMgYmVpbmcgb2YKLWJldGEgcmVsZWFzZSBzdGF0dXMgKEJFVCkuCi0KLUJldGEgcmVsZWFzZSBzdGF0dXMgaGFzIGEgcGFydGljdWxhciBtZWFuaW5nIHRvIEFSTSBvZiB3aGljaCB0aGUgcmVjaXBpZW50Ci1tdXN0IGJlIGF3YXJlLiBCZXRhIGlzIGEgcHJlLXJlbGVhc2Ugc3RhdHVzIGluZGljYXRpbmcgdGhhdCB0aGUgZGVsaXZlcmFibGUKLXNvIGRlc2NyaWJlZCBpcyBiZWxpZXZlZCB0byByb2J1c3RseSBkZW1vbnN0cmF0ZSBzcGVjaWZpZWQgYmVoYXZpb3VyLCB0byBiZQotY29uc2lzdGVudCBhY3Jvc3MgaXRzIGluY2x1ZGVkIGFzcGVjdHMgYW5kIGJlIHJlYWR5IGZvciBnZW5lcmFsIGRlcGxveW1lbnQuCi1CdXQgQmV0YSBhbHNvIGluZGljYXRlcyB0aGF0IHByZS1yZWxlYXNlIHJlbGlhYmlsaXR5IHRyaWFscyBhcmUgb25nb2luZyBhbmQKLXRoYXQgaXQgaXMgcG9zc2libGUgcmVzaWR1YWwgZGVmZWN0cyBvciBlcnJvcnMgaW4gb3BlcmF0aW9uLCBjb25zaXN0ZW5jeQotYW5kIGRvY3VtZW50YXRpb24gbWF5IHN0aWxsIGJlIGVuY291bnRlcmVkLiBUaGUgcmVjaXBpZW50IHNob3VsZCBjb25zaWRlcgotdGhpcyBwb3NpdGlvbiB3aGVuIHVzaW5nIHRoaXMgQmV0YSBtYXRlcmlhbCBzdXBwbGllZC4gQVJNIHdpbGwgbm9ybWFsbHkKLWF0dGVtcHQgdG8gcHJvdmlkZSBmaXhlcyBvciBhIHdvcmstYXJvdW5kIGZvciBkZWZlY3RzIGlkZW50aWZpZWQgYnkgdGhlCi1yZWNpcGllbnQsIGJ1dCB0aGUgcHJvdmlzaW9uIG9yIHRpbWVsaW5lc3Mgb2YgdGhpcyBzdXBwb3J0IGNhbm5vdCBiZQotZ3VhcmFudGVlZC4gQVJNIHNoYWxsIG5vdCBiZSByZXNwb25zaWJsZSBmb3IgZGlyZWN0IG9yIGNvbnNlcXVlbnRpYWwKLWRhbWFnZXMgYXMgYSByZXN1bHQgb2YgZW5jb3VudGVyaW5nIG9uZSBvciBtb3JlIG9mIHRoZXNlIHJlc2lkdWFsIGRlZmVjdHMuCi1CeSBhY2NlcHRpbmcgYSBCZXRhIHJlbGVhc2UsIHRoZSByZWNpcGllbnQgYWdyZWVzIHRvIHRoZXNlIGNvbnN0cmFpbnRzIGFuZAotdG8gcHJvdmlkaW5nIHJlYXNvbmFibGUgaW5mb3JtYXRpb24gdG8gQVJNIHRvIGVuYWJsZSB0aGUgcmVwbGljYXRpb24gb2YgdGhlCi1kZWZlY3RzIGlkZW50aWZpZWQgYnkgdGhlIHJlY2lwaWVudC4gVGhlIHNwZWNpZmljIEJldGEgdmVyc2lvbiBzdXBwbGllZAotd2lsbCBub3QgYmUgc3VwcG9ydGVkIGFmdGVyIHJlbGVhc2Ugb2YgYSBsYXRlciBvciBoaWdoZXIgc3RhdHVzIHZlcnNpb24uCi1JdCBzaG91bGQgYmUgbm90ZWQgdGhhdCBTdXBwb3J0IGZvciB0aGUgQmV0YSByZWxlYXNlIG9mIHRoZSBkZWxpdmVyYWJsZQotd2lsbCBvbmx5IGJlIHByb3ZpZGVkIGJ5IEFSTSB0byBhIHJlY2lwaWVudCB3aG8gaGFzIGEgY3VycmVudCBzdXBwb3J0IGFuZAotbWFpbnRlbmFuY2UgY29udHJhY3QgZm9yIHRoZSBkZWxpdmVyYWJsZS4KLQotCi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCi0KLUluIGFkZGl0aW9uIHRvIHRoZSBkYXRhIHZlcnNpb25zIGxpc3RlZCBhYm92ZSwgdGhpcyB0cmFuc2FjdGlvbiBjb250YWlucwotdHdvIGFkZGl0aW9uYWwgZmlsZXMgYXQgdGhlIHRvcCBsZXZlbC4KLQotVGhlIGZpcnN0IGlzIHRoaXMgZmlsZSwgQVJNX0RFTElWRVJZXzk3NDEzLlRYVCwgd2hpY2ggaXMgdGhlIGRlbGl2ZXJ5Ci1ub3RlLgotCi1UaGUgc2Vjb25kIGlzIEFSTV9NQU5JRkVTVF85NzQxMy5UWFQgd2hpY2ggY29udGFpbnMgYSBtYW5pZmVzdCBvZiBhbGwgdGhlCi1maWxlcyBpbmNsdWRlZCBpbiB0aGlzIHRyYW5zYWN0aW9uLCB0b2dldGhlciB3aXRoIHRoZWlyIGNoZWNrc3Vtcy4KLQotVGhlIGNoZWNrc3VtcyBwcm92aWRlZCBhcmUgY2FsY3VsYXRlZCB1c2luZyB0aGUgUlNBIERhdGEgU2VjdXJpdHksIEluYy4KLU1ENSBNZXNzYWdlLURpZ2VzdCBBbGdvcml0aG0uCi0KLVRoZSBjaGVja3N1bXMgY2FuIGJlIHVzZWQgdG8gdmVyaWZ5IHRoZSBpbnRlZ3JpdHkgb2YgdGhpcyBkYXRhIHVzaW5nIHRoZQotIm1kNXN1bSIgdG9vbCAod2hpY2ggaXMgcGFydCBvZiB0aGUgR05VICJ0ZXh0dXRpbHMiIHBhY2thZ2UpIGJ5IHJ1bm5pbmc6Ci0KLSAgJSBtZDVzdW0gLS1jaGVjayBBUk1fTUFOSUZFU1RfOTc0MTMuVFhUCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9BUk1fTUFOSUZFU1QuVFhUIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL0FSTV9NQU5JRkVTVC5UWFQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMjIzOGIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL0FSTV9NQU5JRkVTVC5UWFQKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0JCQkJICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS8KLQkJCQkgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS8KLWUwNDk3OTFjZmFiNjA2MGEwOGNiYWM3YjNhZDc2N2Q2ICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvYXJtQ09NTV9zLmgKLWVkNzk4ZmFjZTI1NDk3YjI3MDNlZGU3MzZkNmQ1MmI2ICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvb214dHlwZXNfcy5oCi00ZWViZDYzYWYwODczNzY4MTFkNjc0OWYwNjQ2Yjg2NCAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybUNPTU1fQml0RGVjX3MuaAotNDNjZjQ2YzJjZjJmZTFmOTNjNjE1YjU3YmNiZTQ4MDkgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1DT01NLmgKLThmMjQ4Y2VhYWM4ZjYwMmUyNzdhNTIxYjY3OWRjYmJlICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvYXJtQ09NTV9JRENUVGFibGUuaAotNTNmMmFlOGE5ODQ5NWYwNWUyNmE0Y2Y4NjJhN2Y3NTAgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1DT01NX1ZlcnNpb24uaAotM2EyZjQyMGRkZjZhMWI5NTA0NzBiZDBmNWViZDVjNjIgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1DT01NX0lEQ1Rfcy5oCi01MTFjMGJiNTM0ZmUyMjM1OTllMmM4NGVmZjI0YzllZCAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybUNPTU1fTWFza1RhYmxlLmgKLTg5NzE5MzJkNTZlZWQ2YjFhZDFiYTUwN2YwYmZmNWYwICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvYXJtQ09NTV9CaXRzdHJlYW0uaAotZjg3ZmVkZDljYTQzMmZlZmE3NTcwMDgxNzY4NjRlZjggIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1PTVguaAotOGU0OTg5OWE0Mjg4MjJjMzZlZjlkZDk0ZTBlMDVmMTggIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9vbXh0eXBlcy5oCi02OTQyODFkMTFhZjUyZjg4ZTZmOWQ0Y2IyMjZhYzhhNyAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvYnVpbGRfdmMucGwKLWU3MmQ5NmMwYTQxNTQ1OTc0OGRmOTgwN2YzZGFlNzJmICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS9maWxlbGlzdF92Yy50eHQKLQkJCQkgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3NyYy8KLTVlZWFlNjU5YTI5NDc3ZjVjNTIyOTZkMjRhZmZmZDNjICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS9zcmMvYXJtQ09NTV9JRENUVGFibGUuYwotZDY0Y2RjZjM4Zjc3NDlkYzdmNzc0NjVlNWI3ZDM1NmQgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3NyYy9hcm1DT01NX01hc2tUYWJsZS5jCi0JCQkJICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy8KLQkJCQkgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwLwotCQkJCSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjLwotZTdlMGMzMjA5Nzg1NjRhN2M5YjJjNzIzNzQ5YTk4ZDYgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmMKLTRhZGNkMGRmMDgxOTkwYmRmYzQ3MjkwNDFhMmE5MTUyICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jCi04NTJlMDQwNDE0Mjk2NWRjMWYzYWE3ZjAwZWU1MTI3YiAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDRfcy5zCi03MDU0MTUxYzViZmVhNmI1ZTc0ZmVlZTg2YjJkN2IwMSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYwotMzg5NDRjNWUwYmJhMDFlMzJmZjM0OWMyYzg3YzcxYjIgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5zCi0zMmZmNGI4YmU2MmUyZjBmM2U3NjRiODNjMWU1ZTJmZCAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLmMKLTkwYjBlNmEwNGU3NjQ5MDJjMGEwOTAzNjQwYzEwYjMyICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYV91bnNhZmVfcy5zCi0yOGExOWFlNGZlMjI1ODYyODA4MGQ2YTg5YmI1NGI5MSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYV91bnNhZmVfcy5zCi05OGUxOTZiOWUxZmZlYmFmOTFmNjJlYTlkMTdmYjk3ZCAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX3MucwotMDFiYTYwZWZmNjZlYTQ5YTRmODMzY2U2Mjc5ZjhlMmYgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYwotZjMwMWQ1YTk1ZTA3MzU0ZjU5M2VhNTc0N2MwMWNiMGEgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZV9zLnMKLTQ0YzllZjIxZTg0MGExMDAzMDFmN2Q3YTQxODk5NTdjICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlX3MucwotYTMzYjAzYmJkMzM1MmQyNGVkNzQ0NzY5ZTEyYmI4N2QgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZV9zLnMKLTAwYzIwYmZkYTY3YmI4NjA5NmI2MTVmYzE3Yzk0YjM1ICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpcl9zLnMKLTJkZGNhZjYwYThlYTFlNmU2Yjc3NzM3Zjc2OGJmYjlkICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9RdWFudFRhYmxlc19zLnMKLWMzMDAyYWFkNTYwMGY4NzJiNzBhNWQ3ZmUzOTE1ODQ2ICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQWxpZ25fdW5zYWZlX3MucwotYTI5MDBmMmM0N2YxYzYxZDIwYmQ2YzFlZGEzM2Q2ZDQgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5X3Vuc2FmZV9zLnMKLWU0ZmVjZDY2YmM0N2YwNzUzOWJjMzA4OTM1ZTg0YTFmICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0X3MucwotNzg4MTVjOWRmNTBiYTUzMTMxYmIyMmQyYjgyOWUzYzMgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcl9zLnMKLTE5MDlhZTMxMmFjNzlhMDNhNWZhYzFkMWU4YmMwMjkxICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSV9zLnMKLTNkMmM0ODU4MDY1NTkyODA2NWRlNzgzOTg2NmQ5YmM0ICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlX3MucwotMjNhYTJmZGYxNTVkNGZhNmZmNzQ1ZWFiNmUwMWYzMmIgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNl9zLnMKLTk3ZjIwYTkzYzQ4MWQ3ZjYxNzNkOTE5ZjQxZTQxNWJkICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSV9zLnMKLWJlY2Q1MTJkYTIwMjQzNjI4NjgxMWI2YWVjMDYxZjQ3ICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0lfcy5zCi1kZDI0YTk5YWUzY2Q4NDJkY2FjYWYzMWQ0N2RlODhiMyAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JX3MucwotYzJkOTk1Zjc4N2I2ZjQ0ZWYxMGM3NTFjMTJkMTkzNWYgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9EaWFnQ29weV91bnNhZmVfcy5zCi0zNjI4ZmJkZjBjZDIxN2MyODdiNmNjYzk0MTM1ZDA2ZSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OF9zLnMKLTRhNTJiM2U5ZTI2OGI4YThmMDc4MjliZjUwMGQwM2FmICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJfcy5zCi0xMTI0OWY4YTk4YzVkNGI4NGNiNTU3NWIwZTM3Y2E5YyAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQXZlcmFnZV80eF9BbGlnbl91bnNhZmVfcy5zCi0zNTk5YjEwNzQzMzA5NjVjOGNhMjg1ZDE2NGVmY2NmZiAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX3MucwotMzMzOWUwMjZjN2RlNjU1ZDk0MDA5NDllYjVlNTE0NTEgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0X3MucwotY2M0YTZmMzJkYjBiNzJhOTFkM2YyNzhmNjg1NWRmNjkgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMuYwotCQkJCSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvYXBpLwotNmU1MzBkZGFhN2MyYjU3ZmZlODgxNjJjMDIwY2I2NjIgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL2FwaS9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmgKLQkJCQkgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvCi0JCQkJICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy8KLWNkZjQxMjkyMGMyMDM3YTcyNWQwNDIwMDAyYjY3NTJlICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQ2xpcDhfcy5zCi1kYmE5ODI0ZTk1OWIyMWQ0MDFjYWM5MjVlNjhhMTFhNiAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcl9zLnMKLWI1NTliNzFkNWM5NDYyN2YxMGU2MTZmYjcyYzBjZWZjICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JX3MucwotNGZiYTRjNDMxYTc4M2E3OGEyZWI2NDk3YTk0YWM5NjcgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMKLTFlNGMzYmU4YzVlZGRjMDBjOWYwNWU4M2JjZjMxNWVmICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUNSZWNvbkJsb2NrX3MucwotMWIwYjI5OTBjMjY2OWRmYjg3Y2Y2YjgxMDYxMWMwMWIgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYwotMWM5Yjg3YWJmMzI4M2U5NTc4MTZiMzkzN2M2ODA3MDEgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QX3MucwotNGZlMWFmY2E2NTlhOTA1NWZjMTE3MmU1OGY3OGE1MDYgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEuYwotMmVhMDY3ZjA0MzZmOTFiYTEzNTFlZGFmNDExY2I0ZWEgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9Mb29rdXBfVGFibGVzLmMKLWFjYjkyYmUxZGJjZGIzZWJlODI0Y2JlOWUyOGQwM2JmICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfSURDVDh4OGJsa19zLnMKLWE2YjQxZjAxYjFkZjdkZDY1NmViZGJhMzA4NGJmYTJhICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRmluZE1WcHJlZF9zLnMKLTI5M2E0OGE2NDhhMzA4NTQ1NmU2NjY1YmI3MzY2ZmFkICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfU2V0UHJlZERpcl9zLnMKLWZmZTZiOTZjNzRkNDg4MWY0ZDNjOGRlOGNjNzM3Nzk3ICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JX3MucwotNDM3ZGZhMjA0NTA4ODUwZDYxZDRiODcwOTE0NDZlOWYgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQ19zLnMKLWZmNTkxNWQxODFiZmQyY2QyZjBiZDU4OGJkMjMwMGRjICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTENfcy5zCi02Nzc1ZWIwYzU2MWRiYWI5NjVjNjBmODViMDhjOTZmZCAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYV9zLnMKLWEwZDg1ZjRmNTE3Yzk0NWE0YzkzMTdhYzAyMWYyZDA4ICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZV9zLnMKLTM4NjAyMGRlZThiNzI1YzdmZTI1MjZmMWZjMjExZDdkICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLmMKLQkJCQkgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvYXBpLwotNDYyNGU3YzgzOGUxMGEyNDlhYmNjM2QzZjRmNDA3NDggIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvYXBpL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaAotNjVlMTA1N2QwNGUyY2I4NDQ1NTlkYzlmNmUwOTc5NWEgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvYXBpL2FybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgKLQkJCQkgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL3NyYy8KLWU2MjdiMzM0NmIwZGM5YWZmMTQ0NDYwMDVjZTBmYTQzICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9zcmMvYXJtVkNfVmVyc2lvbi5jCi0JCQkJICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9hcGkvCi03Y2E5NGIxYzMzYWMwMjExZTE3ZDM4YmFhZGQ3ZDFkZCAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvYXBpL2FybVZDLmgKLTEyY2Y3NTk2ZWRiYmY2MDQ4YjYyNmQxNWU4ZDBlZDQ4ICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9hcGkvb214VkMuaAotMTE3MjZlMjg2YTgxMjU3Y2I0NWY1NTQ3ZmI0ZDM3NGMgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2FwaS9vbXhWQ19zLmgKLWE1YjJhZjYwNWMzMTljZDI0OTEzMTllNDMwNzQxMzc3ICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9hcGkvYXJtVkNDT01NX3MuaAotCQkJCSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS8KLQkJCQkgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2NvbW0vc3JjLwotNTBjY2E2OTU0YzQ0N2IwMTJhYjM5Y2E3ODcyZTVlOGYgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5MTZ4MTZfcy5zCi1kMWMzYmNlNzdmYzU3NzRjODk5YjQ0N2QxM2YwMmNkMCAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHk4eDhfcy5zCi1mZGFjMWQxYmFkM2ZkMjNjODgwYmViMzliYzJlODlhYSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvb214VkNDT01NX0V4cGFuZEZyYW1lX0lfcy5zCi02ZDlhZGMyYmU1YmQwMzExNTkxMDMwZDBjNmRmNzcxYyAgQVJNX0RFTElWRVJZXzk3NDEzLlRYVApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJiOTdlMi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU0uaAorKysgL2Rldi9udWxsCkBAIC0xLDgwMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtQ09NTS5oCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiAgIAotICogRmlsZTogYXJtQ09NTS5oCi0gKiBCcmllZjogRGVjbGFyZXMgQ29tbW9uIEFQSXMvRGF0YSBUeXBlcyB1c2VkIGFjcm9zcyBPcGVuTUFYIEFQSSdzCi0gKgotICovCi0gCi0gIAotI2lmbmRlZiBfYXJtQ29tbW9uX0hfCi0jZGVmaW5lIF9hcm1Db21tb25fSF8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIE9NWF9GMzIgUmU7IC8qKiBSZWFsIHBhcnQgKi8KLSAgT01YX0YzMiBJbTsgLyoqIEltYWdpbmFyeSBwYXJ0ICovCQotICAgICAgICAKLX0gT01YX0ZDMzI7IC8qKiBzaW5nbGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IGNvbXBsZXggbnVtYmVyICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIE9NWF9GNjQgUmU7IC8qKiBSZWFsIHBhcnQgKi8KLSAgT01YX0Y2NCBJbTsgLyoqIEltYWdpbmFyeSBwYXJ0ICovCQotICAgICAgICAKLX0gT01YX0ZDNjQ7IC8qKiBkb3VibGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IGNvbXBsZXggbnVtYmVyICovCi0KLQotLyogVXNlZCBieSBib3RoIElQIGFuZCBJQyBkb21haW5zIGZvciA4eDggSlBFRyBibG9ja3MuICovCi10eXBlZGVmIE9NWF9TMTYgQVJNX0JMT0NLOHg4WzY0XTsKLQotCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0KLSNkZWZpbmUgIGFybVBJIChPTVhfRjY0KSgzLjE0MTU5MjY1MzU4OTc5MzIzODQ2MjY0MzM4MzI3OTUpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogQ29tcGlsZXIgZXh0ZW5zaW9ucyAqLwotI2lmZGVmIEFSTV9ERUJVRwotLyogZGVidWcgdmVyc2lvbiAqLwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jZGVmaW5lIGFybUVycm9yKHN0cikge3ByaW50Zigoc3RyKSk7IHByaW50ZigiXG4iKTsgZXhpdCgtMSk7fQotI2RlZmluZSBhcm1XYXJuKHN0cikge3ByaW50Zigoc3RyKSk7IHByaW50ZigiXG4iKTt9Ci0jZGVmaW5lIGFybUlnbm9yZShhKSAoKHZvaWQpYSkKLSNkZWZpbmUgYXJtQXNzZXJ0KGEpIGFzc2VydChhKQotI2Vsc2UgCi0vKiByZWxlYXNlIHZlcnNpb24gKi8KLSNkZWZpbmUgYXJtRXJyb3Ioc3RyKSAoKHZvaWQpIChzdHIpKQotI2RlZmluZSBhcm1XYXJuKHN0cikgICgodm9pZCkgKHN0cikpCi0jZGVmaW5lIGFybUlnbm9yZShhKSAgKCh2b2lkKSAoYSkpCi0jZGVmaW5lIGFybUFzc2VydChhKSAgKCh2b2lkKSAoYSkpCi0jZW5kaWYgLyogQVJNX0RFQlVHICovCi0KLS8qIEFyaXRobWV0aWMgb3BlcmF0aW9ucyAqLwotCi0jZGVmaW5lIGFybU1pbihhLGIpICAgICAgICAgICAgICggKGEpID4gKGIpID8gIChiKTooYSkgKQotI2RlZmluZSBhcm1NYXgoYSxiKSAgICAgICAgICAgICAoIChhKSA+IChiKSA/ICAoYSk6KGIpICkKLSNkZWZpbmUgYXJtQWJzKGEpICAgICAgICAgICAgICAgKCAoYSkgPCAgMCAgPyAtKGEpOihhKSApCi0KLS8qIEFsaWdubWVudCBvcGVyYXRpb24gKi8KLQotI2RlZmluZSBhcm1BbGlnblRvQnl0ZXMoUHRyLE4pICAgICAgKFB0ciArICggKChOLShpbnQpUHRyKSYoTi0xKSkgLyBzaXplb2YoKlB0cikgKSkKLSNkZWZpbmUgYXJtQWxpZ25UbzJCeXRlcyhQdHIpICAgICAgIGFybUFsaWduVG9CeXRlcyhQdHIsMikKLSNkZWZpbmUgYXJtQWxpZ25UbzRCeXRlcyhQdHIpICAgICAgIGFybUFsaWduVG9CeXRlcyhQdHIsNCkKLSNkZWZpbmUgYXJtQWxpZ25UbzhCeXRlcyhQdHIpICAgICAgIGFybUFsaWduVG9CeXRlcyhQdHIsOCkKLSNkZWZpbmUgYXJtQWxpZ25UbzE2Qnl0ZXMoUHRyKSAgICAgIGFybUFsaWduVG9CeXRlcyhQdHIsMTYpCi0KLS8qIEVycm9yIGFuZCBBbGlnbm1lbnQgY2hlY2sgKi8KLQotI2RlZmluZSBhcm1SZXRBcmdFcnJJZihjb25kaXRpb24sIGNvZGUpICBpZihjb25kaXRpb24pIHsgcmV0dXJuIChjb2RlKTsgfQotI2RlZmluZSBhcm1SZXREYXRhRXJySWYoY29uZGl0aW9uLCBjb2RlKSBpZihjb25kaXRpb24pIHsgcmV0dXJuIChjb2RlKTsgfQotCi0jaWZuZGVmIEFMSUdOTUVOVF9ET0VTTlRfTUFUVEVSCi0jZGVmaW5lIGFybUlzQnl0ZUFsaWduZWQoUHRyLE4pICAgICAoKCgoaW50KShQdHIpKSAlIE4pPT0wKQotI2RlZmluZSBhcm1Ob3RCeXRlQWxpZ25lZChQdHIsTikgICAgKCgoKGludCkoUHRyKSkgJSBOKSE9MCkKLSNlbHNlCi0jZGVmaW5lIGFybUlzQnl0ZUFsaWduZWQoUHRyLE4pICAgICAoMSkKLSNkZWZpbmUgYXJtTm90Qnl0ZUFsaWduZWQoUHRyLE4pICAgICgwKQotI2VuZGlmCi0KLSNkZWZpbmUgYXJtSXMyQnl0ZUFsaWduZWQoUHRyKSAgICAgIGFybUlzQnl0ZUFsaWduZWQoUHRyLDIpCi0jZGVmaW5lIGFybUlzNEJ5dGVBbGlnbmVkKFB0cikgICAgICBhcm1Jc0J5dGVBbGlnbmVkKFB0ciw0KQotI2RlZmluZSBhcm1JczhCeXRlQWxpZ25lZChQdHIpICAgICAgYXJtSXNCeXRlQWxpZ25lZChQdHIsOCkKLSNkZWZpbmUgYXJtSXMxNkJ5dGVBbGlnbmVkKFB0cikgICAgIGFybUlzQnl0ZUFsaWduZWQoUHRyLDE2KQotCi0jZGVmaW5lIGFybU5vdDJCeXRlQWxpZ25lZChQdHIpICAgICBhcm1Ob3RCeXRlQWxpZ25lZChQdHIsMikKLSNkZWZpbmUgYXJtTm90NEJ5dGVBbGlnbmVkKFB0cikgICAgIGFybU5vdEJ5dGVBbGlnbmVkKFB0ciw0KQotI2RlZmluZSBhcm1Ob3Q4Qnl0ZUFsaWduZWQoUHRyKSAgICAgYXJtTm90Qnl0ZUFsaWduZWQoUHRyLDgpCi0jZGVmaW5lIGFybU5vdDE2Qnl0ZUFsaWduZWQoUHRyKSAgICBhcm1Ob3RCeXRlQWxpZ25lZChQdHIsMTYpCi0jZGVmaW5lIGFybU5vdDMyQnl0ZUFsaWduZWQoUHRyKSAgICBhcm1Ob3RCeXRlQWxpZ25lZChQdHIsMzIpCi0KLS8qKgotICogRnVuY3Rpb246IGFybVJvdW5kRmxvYXRUb1MxNl9yZWYvYXJtUm91bmRGbG9hdFRvUzMyX3JlZi9hcm1Sb3VuZEZsb2F0VG9TNjQKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgc2hvcnQgaW50L2ludCBhZnRlciByb3VuZGluZwotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9TMTYvT01YX1MzMiBmb3JtYXQKLSAqCi0gKi8KLQotT01YX1MxNiBhcm1Sb3VuZEZsb2F0VG9TMTYgKE9NWF9GNjQgVmFsdWUpOwotT01YX1MzMiBhcm1Sb3VuZEZsb2F0VG9TMzIgKE9NWF9GNjQgVmFsdWUpOwotT01YX1M2NCBhcm1Sb3VuZEZsb2F0VG9TNjQgKE9NWF9GNjQgVmFsdWUpOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1TYXRSb3VuZEZsb2F0VG9TMTZfcmVmL2FybVNhdFJvdW5kRmxvYXRUb1MzMgotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSBzaG9ydCBpbnQvaW50IGFmdGVyIHJvdW5kaW5nIGFuZCBzYXR1cmF0aW9uCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1MxNi9PTVhfUzMyIGZvcm1hdAotICoKLSAqLwotCi1PTVhfUzE2IGFybVNhdFJvdW5kRmxvYXRUb1MxNiAoT01YX0Y2NCBWYWx1ZSk7Ci1PTVhfUzMyIGFybVNhdFJvdW5kRmxvYXRUb1MzMiAoT01YX0Y2NCBWYWx1ZSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVNhdFJvdW5kRmxvYXRUb1UxNl9yZWYvYXJtU2F0Um91bmRGbG9hdFRvVTMyCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIHVuc2lnbmVkIHNob3J0IGludC9pbnQgYWZ0ZXIgcm91bmRpbmcgYW5kIHNhdHVyYXRpb24KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfVTE2L09NWF9VMzIgZm9ybWF0Ci0gKgotICovCi0KLU9NWF9VMTYgYXJtU2F0Um91bmRGbG9hdFRvVTE2IChPTVhfRjY0IFZhbHVlKTsKLU9NWF9VMzIgYXJtU2F0Um91bmRGbG9hdFRvVTMyIChPTVhfRjY0IFZhbHVlKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtU2lnbkNoZWNrCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDaGVja3MgdGhlIHNpZ24gb2YgYSB2YXJpYWJsZToKLSAqIHJldHVybnMgMSBpZiBpdCBpcyBQb3NpdGl2ZQotICogcmV0dXJucyAwIGlmIGl0IGlzIDAKLSAqIHJldHVybnMgLTEgaWYgaXQgaXMgTmVnYXRpdmUgCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQkgICAgdmFyICAgICBWYXJpYWJsZSB0byBiZSBjaGVja2VkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX0lOVCAtLSAgIHJldHVybnMgMSBpZiBpdCBpcyBQb3NpdGl2ZQotICogICAgICAgICAgICAgIHJldHVybnMgMCBpZiBpdCBpcyAwCi0gKiAgICAgICAgICAgICAgcmV0dXJucyAtMSBpZiBpdCBpcyBOZWdhdGl2ZSAKLSAqLyAKLSAKLU9NWF9JTlQgYXJtU2lnbkNoZWNrIChPTVhfUzE2IHZhcik7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybUNsaXAKLSAqCi0gKiBEZXNjcmlwdGlvbjogQ2xpcHMgdGhlIGlucHV0IGJldHdlZW4gTUFYIGFuZCBNSU4gdmFsdWUKLSAqIAotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gTWluICAgICBsb3dlciBib3VuZAotICogW2luXSBNYXggICAgIHVwcGVyIGJvdW5kCi0gKiBbaW5dIHNyYyAgICAgdmFyaWFibGUgdG8gdGhlIGNsaXBwZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfUzMyIC0tICAgcmV0dXJucyBjbGlwcGVkIHZhbHVlCi0gKi8gCi0gCi1PTVhfUzMyIGFybUNsaXAgKAotICAgICAgICBPTVhfSU5UIG1pbiwKLSAgICAgICAgT01YX0lOVCBtYXgsIAotICAgICAgICBPTVhfUzMyIHNyYwotICAgICAgICApOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1DbGlwX0YzMgotICoKLSAqIERlc2NyaXB0aW9uOiBDbGlwcyB0aGUgaW5wdXQgYmV0d2VlbiBNQVggYW5kIE1JTiB2YWx1ZQotICogCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBNaW4gICAgIGxvd2VyIGJvdW5kCi0gKiBbaW5dIE1heCAgICAgdXBwZXIgYm91bmQKLSAqIFtpbl0gc3JjICAgICB2YXJpYWJsZSB0byB0aGUgY2xpcHBlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9GMzIgLS0gICByZXR1cm5zIGNsaXBwZWQgdmFsdWUKLSAqLyAKLSAKLU9NWF9GMzIgYXJtQ2xpcF9GMzIgKAotICAgICAgICBPTVhfRjMyIG1pbiwKLSAgICAgICAgT01YX0YzMiBtYXgsIAotICAgICAgICBPTVhfRjMyIHNyYwotICAgICAgICApOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1TaGlmdFNhdF9GMzIKLSAqCi0gKiBEZXNjcmlwdGlvbjogRGl2aWRlcyBhIGZsb2F0IHZhbHVlIGJ5IDJec2hpZnQgYW5kIAotICogc2F0dXJhdGVzIGl0IGZvciB1bnNpZ25lZCB2YWx1ZSByYW5nZSBmb3Igc2F0Qml0cy4KLSAqIFNlY29uZCBwYXJhbWV0ZXIgaXMgbGlrZSAic2hpZnRpbmciIHRoZSBjb3JyZXNwb25kaW5nIAotICogaW50ZWdlciB2YWx1ZS4gVGFrZXMgY2FyZSBvZiByb3VuZGluZyB3aGlsZSBjbGlwcGluZyB0aGUgZmluYWwgCi0gKiB2YWx1ZS4KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSB2ICAgICAgICAgIE51bWJlciB0byBiZSBvcGVyYXRlZCB1cG9uCi0gKiBbaW5dIHNoaWZ0ICAgICAgRGl2aWRlcyB0aGUgaW5wdXQgInYiIGJ5ICIyXnNoaWZ0IgotICogW2luXSBzYXRCaXRzICAgIEZpbmFsIHJhbmdlIGlzIFswLCAyXnNhdEJpdHMpCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX1MzMiAtLSAgIHJldHVybnMgInNoaWZ0ZWQiIHNhdHVyYXRlZCB2YWx1ZQotICovIAotIAotT01YX1UzMiBhcm1TaGlmdFNhdF9GMzIoCi0gICAgICAgIE9NWF9GMzIgdiwgCi0gICAgICAgIE9NWF9JTlQgc2hpZnQsIAotICAgICAgICBPTVhfSU5UIHNhdEJpdHMKLSAgICAgICAgKTsKLQotLyoqCi0gKiBGdW5jdGlvbnM6IGFybVN3YXBFbGVtCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHN3YXBzIHR3byBlbGVtZW50cyBhdCB0aGUgc3BlY2lmaWVkIHBvaW50ZXIgbG9jYXRpb25zLgotICogVGhlIHNpemUgb2YgZWFjaCBlbGVtZW50IGNvdWxkIGJlIGFueXRoaW5nIGFzIHNwZWNpZmllZCBieSA8ZWxlbVNpemU+Ci0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YUmVzdWx0IC0tIEVycm9yIHN0YXR1cyBmcm9tIHRoZSBmdW5jdGlvbgotICovCi1PTVhSZXN1bHQgYXJtU3dhcEVsZW0oT01YX1U4ICpwQnVmMSwgT01YX1U4ICpwQnVmMiwgT01YX0lOVCBlbGVtU2l6ZSk7Ci0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtTWVkaWFuT2YzCi0gKgotICogRGVzY3JpcHRpb246IEZpbmRzIHRoZSBtZWRpYW4gb2YgdGhyZWUgbnVtYmVycwotICogCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIGZFbnRyeSAgICAgRmlyc3QgZW50cnkKLSAqIFtpbl0gc0VudHJ5ICAgICBzZWNvbmQgZW50cnkKLSAqIFtpbl0gdEVudHJ5ICAgICBUaGlyZCBlbnRyeQotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9TMzIgLS0gICByZXR1cm5zIHRoZSBtZWRpYW4gdmFsdWUKLSAqLyAKLSAKLU9NWF9TMzIgYXJtTWVkaWFuT2YzICgKLSAgICBPTVhfUzMyIGZFbnRyeSwKLSAgICBPTVhfUzMyIHNFbnRyeSwgCi0gICAgT01YX1MzMiB0RW50cnkgCi0gICAgKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtTG9nU2l6ZQotICoKLSAqIERlc2NyaXB0aW9uOiBGaW5kcyB0aGUgc2l6ZSBvZiBhIHBvc2l0aXZlIHZhbHVlIGFuZCByZXR1cm5zIHRoZSBzYW1lCi0gKiAKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gdmFsdWUgICAgUG9zaXRpdmUgdmFsdWUKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfVTggLS0gICByZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBwb3NpdGl2ZSB2YWx1ZQotICovIAotIAotT01YX1U4IGFybUxvZ1NpemUgKAotICAgIE9NWF9VMTYgdmFsdWUgCi0gICAgKTsgICAgCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgICAgICAvKiBTYXR1cmF0aW5nIEFyaXRobWV0aWMgb3BlcmF0aW9ucyAqLwotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRBZGRfUzMyKCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgYWRkaXRpb24gb2YgdGhlIHR3byBpbnB1dHMgVmFsdWUxLCBWYWx1ZTIKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCi0gKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqIAotICogICAgCi0gKiovCi0KLU9NWF9TMzIgYXJtU2F0QWRkX1MzMigKLSAgICAgICAgICAgICAgICBPTVhfUzMyIFZhbHVlMSwKLSAgICAgICAgICAgICAgICBPTVhfUzMyIFZhbHVlMgotICAgICAgICAgICAgICAgICk7Ci0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdEFkZF9TNjQoKQotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBhZGRpdGlvbiBvZiB0aGUgdHdvIGlucHV0cyBWYWx1ZTEsIFZhbHVlMgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKLSAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogCi0gKiAgICAKLSAqKi8KLQotT01YX1M2NCBhcm1TYXRBZGRfUzY0KAotICAgICAgICAgICAgICAgIE9NWF9TNjQgVmFsdWUxLAotICAgICAgICAgICAgICAgIE9NWF9TNjQgVmFsdWUyCi0gICAgICAgICAgICAgICAgKTsKLQotLyoqIEZ1bmN0aW9uIDphcm1TYXRTdWJfUzMyKCkKLSAqIAotICogRGVzY3JpcHRpb24gOgotICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgc3Vic3RyYWN0aW9uIG9mIHRoZSB0d28gaW5wdXRzIFZhbHVlMSwgVmFsdWUyCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAotICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAKLSAqKi8KLQotT01YX1MzMiBhcm1TYXRTdWJfUzMyKAotICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIFZhbHVlMSwKLSAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBWYWx1ZTIKLSAgICAgICAgICAgICAgICAgICAgKTsKLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0TWFjX1MzMigpCi0gKgotICogRGVzY3JpcHRpb24gOgotICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBNdWx0aXBsaWNhdGlvbiBvZiBWYWx1ZTEgYW5kIFZhbHVlMiBhbmQgc3ViZXNxdWVudCBzYXR1cmF0ZWQKLSAqICAgICBhY2N1bXVsYXRpb24gd2l0aCBNYWMKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCi0gKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAotICogW2luXSBNYWMgICAgICAgICAgQWNjdW11bGF0b3IKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiovCi0KLU9NWF9TMzIgYXJtU2F0TWFjX1MzMigKLSAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBNYWMsCi0gICAgICAgICAgICAgICAgICAgIE9NWF9TMTYgVmFsdWUxLAotICAgICAgICAgICAgICAgICAgICBPTVhfUzE2IFZhbHVlMgotICAgICAgICAgICAgICAgICAgICApOwotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRNYWNfUzE2UzMyX1MzMgotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBNQUMgb3BlcmF0aW9uIG9mIHRoZSB0aHJlZSBpbnB1dHMgZGVsYXlFbGVtLCBmaWxUYXAgLCBtYWMKLSAqCi0gKiAgIG1hYyA9IG1hYyArIFNhdHVyYXRlX2luXzMyQml0cyhkZWxheUVsZW0gKiBmaWxUYXApCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBkZWxheUVsZW0gICAgRmlyc3QgMzIgYml0IE9wZXJhbmQKLSAqIFtpbl0gZmlsVGFwICAgICAgIFNlY29uZCAxNiBiaXQgT3BlcmFuZAotICogW2luXSBtYWMgICAgICAgICAgUmVzdWx0IG9mIE1BQyBvcGVyYXRpb24KLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgbWFjICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAgICAKLSAqKi8KLSAKLU9NWF9TMzIgYXJtU2F0TWFjX1MxNlMzMl9TMzIoCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIG1hYywgCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIGRlbGF5RWxlbSwgCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfUzE2IGZpbFRhcCApOwotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRSb3VuZFJpZ2h0U2hpZnRfUzMyX1MxNgotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHJvdW5kZWQgcmlnaHQgc2hpZnQgb3BlcmF0aW9uIG9mIGlucHV0IGJ5IHRoZSBzY2FsZWZhY3RvcgotICoKLSAqICAgb3V0cHV0ID0gU2F0dXJhdGVfaW5fMTZCaXRzKCAoIFJpZ2h0U2hpZnQoIChSb3VuZChpbnB1dCkgLCBzY2FsZUZhY3RvciApICkKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIGlucHV0ICAgICAgIFRoZSBpbnB1dCB0byBiZSBvcGVyYXRlZCBvbgotICogW2luXSBzY2FsZUZhY3RvciBUaGUgc2hpZnQgbnVtYmVyCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAgICAKLSAqKi8KLQotCi1PTVhfUzE2IGFybVNhdFJvdW5kUmlnaHRTaGlmdF9TMzJfUzE2KAotICAgICAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBpbnB1dCwgCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfSU5UIHNjYWxlRmFjdG9yKTsKLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0Um91bmRMZWZ0U2hpZnRfUzMyKCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRpbmcgbGVmdC1zaGlmdCBvcGVyYXRpb24gb24gaW5wdXQKLSAqICAgICBPciByb3VuZGVkIFJpZ2h0IHNoaWZ0IGlmIHRoZSBpbnB1dCBTaGlmdCBpcyBuZWdhdGl2ZS4KLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIFZhbHVlICAgICAgICBPcGVyYW5kCi0gKiBbaW5dIHNoaWZ0ICAgICAgICBPcGVyYW5kIGZvciBzaGlmdCBvcGVyYXRpb24KLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAgICAKLSAqKi8KLSAKLU9NWF9TMzIgYXJtU2F0Um91bmRMZWZ0U2hpZnRfUzMyKAotICAgICAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JTlQgc2hpZnQKLSAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdFJvdW5kTGVmdFNoaWZ0X1M2NCgpCi0gKgotICogRGVzY3JpcHRpb24gOgotICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0aW5nIGxlZnQtc2hpZnQgb3BlcmF0aW9uIG9uIGlucHV0Ci0gKiAgICAgT3Igcm91bmRlZCBSaWdodCBzaGlmdCBpZiB0aGUgaW5wdXQgU2hpZnQgaXMgbmVnYXRpdmUuCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBWYWx1ZSAgICAgICAgT3BlcmFuZAotICogW2luXSBzaGlmdCAgICAgICAgT3BlcmFuZCBmb3Igc2hpZnQgb3BlcmF0aW9uCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogICAgCi0gKiovCi0gCi1PTVhfUzY0IGFybVNhdFJvdW5kTGVmdFNoaWZ0X1M2NCgKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TNjQgVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfSU5UIHNoaWZ0Ci0gICAgICAgICAgICAgICAgICAgICAgICApOwotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRNdWxTMTZTMzJfUzMyKCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGEgUzE2IGRhdGEgdHlwZSBtdWx0aXBsaWVkIHdpdGggYW4gUzMyIGRhdGEgdHlwZQotICogICAgIGluIGEgUzMyIGNvbnRhaW5lcgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gaW5wdXQxICAgICAgIE9wZXJhbmQgMQotICogW2luXSBpbnB1dDIgICAgICAgT3BlcmFuZCAyCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogICAgCi0gKiovCi0KLQotT01YX1MzMiBhcm1TYXRNdWxTMTZTMzJfUzMyKAotICAgICAgICAgICAgICAgICAgICBPTVhfUzE2IGlucHV0MSwKLSAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBpbnB1dDIpOwotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRNdWxTMzJTMzJfUzMyKCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGEgUzMyIGRhdGEgdHlwZSBtdWx0aXBsaWVkIHdpdGggYW4gUzMyIGRhdGEgdHlwZQotICogICAgIGluIGEgUzMyIGNvbnRhaW5lcgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gaW5wdXQxICAgICAgIE9wZXJhbmQgMQotICogW2luXSBpbnB1dDIgICAgICAgT3BlcmFuZCAyCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogICAgCi0gKiovCi0KLU9NWF9TMzIgYXJtU2F0TXVsUzMyUzMyX1MzMigKLSAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBpbnB1dDEsCi0gICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgaW5wdXQyKTsKLQotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1JbnREaXZBd2F5RnJvbVplcm8oKQotICoKLSAqIERlc2NyaXB0aW9uIDogSW50ZWdlciBkaXZpc2lvbiB3aXRoIHJvdW5kaW5nIHRvIHRoZSBuZWFyZXN0IGludGVnZXIuIAotICogICAgICAgICAgICAgICBIYWxmLWludGVnZXIgdmFsdWVzIGFyZSByb3VuZGVkIGF3YXkgZnJvbSB6ZXJvCi0gKiAgICAgICAgICAgICAgIHVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkLiBGb3IgZXhhbXBsZSAzLy8yIGlzIHJvdW5kZWQgCi0gKiAgICAgICAgICAgICAgIHRvIDIsIGFuZCAtMy8vMiBpcyByb3VuZGVkIHRvIC0yLgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gTnVtICAgICAgICBPcGVyYW5kIDEKLSAqIFtpbl0gRGVubyAgICAgICBPcGVyYW5kIDIKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uIGlucHV0MS8vaW5wdXQyCi0gKiAgICAKLSAqKi8KLQotT01YX1MzMiBhcm1JbnREaXZBd2F5RnJvbVplcm8gKE9NWF9TMzIgTnVtLCBPTVhfUzMyIERlbm8pOwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBEZWJ1Z2dpbmcgbWFjcm9zCi0gKgotICovCi0KLQotLyoKLSAqIERlZmluaXRpb24gb2Ygb3V0cHV0IHN0cmVhbSAtIGNoYW5nZSB0byBzdGRlcnIgaWYgbmVjZXNzYXJ5Ci0gKi8KLSNkZWZpbmUgREVCVUdfU1RSRUFNIHN0ZG91dAotCi0vKgotICogRGVidWcgcHJpbnRmIG1hY3Jvcywgb25lIGZvciBlYWNoIGFyZ3VtZW50IGNvdW50LgotICogQWRkIG1vcmUgaWYgbmVlZGVkLgotICovCi0jaWZkZWYgREVCVUdfT04KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jZGVmaW5lIERFQlVHX1BSSU5URl8wKGEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSkKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzEoYSwgYikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiKQotI2RlZmluZSBERUJVR19QUklOVEZfMihhLCBiLCBjKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMpCi0jZGVmaW5lIERFQlVHX1BSSU5URl8zKGEsIGIsIGMsIGQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCkKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzQoYSwgYiwgYywgZCwgZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlKQotI2RlZmluZSBERUJVR19QUklOVEZfNShhLCBiLCBjLCBkLCBlLCBmKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYpCi0jZGVmaW5lIERFQlVHX1BSSU5URl82KGEsIGIsIGMsIGQsIGUsIGYsIGcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZykKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzcoYSwgYiwgYywgZCwgZSwgZiwgZywgaCkgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoKQotI2RlZmluZSBERUJVR19QUklOVEZfOChhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpKSAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGkpCi0jZGVmaW5lIERFQlVHX1BSSU5URl85KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGopICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaikKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzEwKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGspICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrKQotI2RlZmluZSBERUJVR19QUklOVEZfMTEoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCkgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwpCi0jZGVmaW5lIERFQlVHX1BSSU5URl8xMihhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtKSAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSkKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzEzKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0sIG4pICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtLCBuKQotI2RlZmluZSBERUJVR19QUklOVEZfMTQoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSwgbiwgbykgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0sIG4sIG8pCi0jZWxzZSAvKiBERUJVR19PTiAqLwotI2RlZmluZSBERUJVR19QUklOVEZfMChhKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzEoYSwgYikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0jZGVmaW5lIERFQlVHX1BSSU5URl8yKGEsIGIsIGMpICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotI2RlZmluZSBERUJVR19QUklOVEZfMyhhLCBiLCBjLCBkKSAgICAgICAgICAgICAgICAgICAgICAgICAKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzQoYSwgYiwgYywgZCwgZSkgICAgICAgICAgICAgICAgICAgICAgCi0jZGVmaW5lIERFQlVHX1BSSU5URl81KGEsIGIsIGMsIGQsIGUsIGYpICAgICAgICAgICAgICAgICAgIAotI2RlZmluZSBERUJVR19QUklOVEZfNihhLCBiLCBjLCBkLCBlLCBmLCBnKSAgICAgICAgICAgICAgICAKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzcoYSwgYiwgYywgZCwgZSwgZiwgZywgaCkgICAgICAgICAgICAgCi0jZGVmaW5lIERFQlVHX1BSSU5URl84KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGkpICAgICAgICAgIAotI2RlZmluZSBERUJVR19QUklOVEZfOShhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqKSAgICAgICAKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzEwKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGspICAgIAotI2RlZmluZSBERUJVR19QUklOVEZfMTEoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCkgICAgICAgICAgICAgCi0jZGVmaW5lIERFQlVHX1BSSU5URl8xMihhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtKSAgICAgICAgICAKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzEzKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0sIG4pICAgICAgCi0jZGVmaW5lIERFQlVHX1BSSU5URl8xNChhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtLCBuLCBvKSAgIAotI2VuZGlmIC8qIERFQlVHX09OICovCi0KLQotLyoKLSAqIERvbWFpbiBhbmQgc3ViIGRvbWFpbiBkZWZpbml0aW9ucwotICoKLSAqIEluIG9yZGVyIHRvIHR1cm4gb24gZGVidWcgZm9yIGFuIGVudGlyZSBkb21haW4gb3Igc3ViLWRvbWFpbgotICogYXQgY29tcGlsZSB0aW1lLCBvbmUgb2YgdGhlIERFQlVHX0RPTUFJTl8qIGJlbG93IG1heSBiZSBkZWZpbmVkLAotICogd2hpY2ggd2lsbCBhY3RpdmF0ZSBkZWJ1ZyBpbiBhbGwgb2YgdGhlIGRlZmluZXMgaXQgY29udGFpbnMuCi0gKi8KLQotI2lmZGVmIERFQlVHX0RPTUFJTl9BQwotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVDSEFOUEFJUkVMVF9NUEVHNAotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVDSEFOUEFJUkVMVAotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVEQVRTVFJFTFQKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFRklMTEVMVAotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVJU1NURVJFT19TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFTVNQTlNfUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERU1TU1RFUkVPX1MzMl9JCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERVBSR0NGR0VMVAotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVUTlNfUzMyX0kKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVJTlRFUkxFQVZFU1BFQ1RSVU1fUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX0VOQ09ERVROU19TMzJfSQotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19MT05HVEVSTVBSRURJQ1RfUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX0xPTkdURVJNUkVDT05TVFJVQ1RfUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX01EQ1RGV0RfUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX01EQ1RJTlZfUzMyX1MxNgotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19OT0lTRUxFU1NERUNPREUKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfUVVBTlRJTlZfUzMyX0kKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfVU5QQUNLQURJRkhFQURFUgotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19VTlBBQ0tBRFRTRlJBTUVIRUFERVIKLSNkZWZpbmUgREVCVUdfT01YQUNNUDNfSFVGRk1BTkRFQ09ERVNGQk1CUF9TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNNUDNfSFVGRk1BTkRFQ09ERVNGQl9TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNNUDNfSFVGRk1BTkRFQ09ERV9TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNNUDNfTURDVElOVl9TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNNUDNfUkVRVUFOVElaRVNGQl9TMzJfSQotI2RlZmluZSBERUJVR19PTVhBQ01QM19SRVFVQU5USVpFX1MzMl9JCi0jZGVmaW5lIERFQlVHX09NWEFDTVAzX1NZTlRIUFFNRl9TMzJfUzE2Ci0jZGVmaW5lIERFQlVHX09NWEFDTVAzX1VOUEFDS0ZSQU1FSEVBREVSCi0jZGVmaW5lIERFQlVHX09NWEFDTVAzX1VOUEFDS1NDQUxFRkFDVE9SU19TOAotI2RlZmluZSBERUJVR19PTVhBQ01QM19VTlBBQ0tTSURFSU5GTwotI2VuZGlmIC8qIERFQlVHX0RPTUFJTl9BQyAqLwotCi0KLSNpZmRlZiBERUJVR19ET01BSU5fVkMKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9BVkVSQUdFXzE2WAotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0FWRVJBR0VfNFgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9BVkVSQUdFXzhYCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfREVCTE9DS0NIUk9NQV9VOF9DMUlSCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfREVCTE9DS0xVTUFfVThfQzFJUgotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0RFQ09ERUNIUk9NQURDQ09FRkZTVE9QQUlSQ0FWTENfVTgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9ERUNPREVDT0VGRlNUT1BBSVJDQVZMQ19VOAotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0RFUVVBTlRUUkFOU0ZPUk1BQ0ZST01QQUlSX1U4X1MxNl9DMV9ETFgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9FWFBBTkRGUkFNRQotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0ZJTFRFUkRFQkxPQ0tJTkdDSFJPTUFfSE9SRURHRV9VOF9DMUlSCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfRklMVEVSREVCTE9DS0lOR0NIUk9NQV9WRVJFREdFX1U4X0MxSVIKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9GSUxURVJERUJMT0NLSU5HTFVNQV9IT1JFREdFX1U4X0MxSVIKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9GSUxURVJERUJMT0NLSU5HTFVNQV9WRVJFREdFX1U4X0MxSVIKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9QUkVESUNUSU5UUkFDSFJPTUE4WDhfVThfQzFSCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfUFJFRElDVElOVFJBXzE2WDE2X1U4X0MxUgotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1BSRURJQ1RJTlRSQV80WDRfVThfQzFSCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfU0FEUVVBUl8xNlgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9TQURRVUFSXzRYCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfU0FEUVVBUl84WAotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBRF8xNlgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9TQURfNFgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9TQURfOFgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9TQVREXzRYNAotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1RSQU5TRk9STURFUVVBTlRDSFJPTUFEQ0ZST01QQUlSX1U4X1MxNl9DMQotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1RSQU5TRk9STURFUVVBTlRMVU1BRENGUk9NUEFJUl9VOF9TMTZfQzEKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9UUkFOU0ZPUk1RVUFOVF9DSFJPTUFEQwotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1RSQU5TRk9STVFVQU5UX0xVTUFEQwotI2RlZmluZSBERUJVR19PTVhWQ000UDJfQkxPQ0tNQVRDSF9IQUxGXzE2WDE2Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9CTE9DS01BVENIX0hBTEZfOFg4Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9CTE9DS01BVENIX0lOVEVHRVJfMTZYMTYKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0JMT0NLTUFUQ0hfSU5URUdFUl84WDgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0NPTVBVVEVURVhUVVJFRVJST1JCTE9DS19TQURfVThfUzE2Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9DT01QVVRFVEVYVFVSRUVSUk9SQkxPQ0tfVThfUzE2Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9EQ1Q4WDhCTEtETFgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0RFQ09ERUJMT0NLQ09FRl9JTlRFUl9TMTYKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0RFQ09ERVBBRE1WX1BWT1AKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0RFQ09ERVZMQ1pJR1pBR19JTlRFUl9TMTYKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0RFQ09ERVZMQ1pJR1pBR19JTlRSQUFDVkxDX1MxNgotI2RlZmluZSBERUJVR19PTVhWQ000UDJfREVDT0RFVkxDWklHWkFHX0lOVFJBRENWTENfUzE2Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9FTkNPREVNVl9VOF9TMTYKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0VOQ09ERVZMQ1pJR1pBR19JTlRFUl9TMTYKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0VOQ09ERVZMQ1pJR1pBR19JTlRSQUFDVkxDX1MxNgotI2RlZmluZSBERUJVR19PTVhWQ000UDJfRU5DT0RFVkxDWklHWkFHX0lOVFJBRENWTENfUzE2Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9GSU5ETVZQUkVECi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9JRENUOFg4QkxLRExYCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9MSU1JVE1WVE9SRUNUCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9NT1RJT05FU1RJTUFUSU9OTUIKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1BBRE1CR1JBWV9VOAotI2RlZmluZSBERUJVR19PTVhWQ000UDJfUEFETUJIT1JJWk9OVEFMX1U4Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9QQURNQlZFUlRJQ0FMX1U4Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9QQURNVgotI2RlZmluZSBERUJVR19PTVhWQ000UDJfUVVBTlRJTlRFUl9TMTZfSQotI2RlZmluZSBERUJVR19PTVhWQ000UDJfUVVBTlRJTlRSQV9TMTZfSQotI2RlZmluZSBERUJVR19PTVhWQ000UDJfUVVBTlRJTlZJTlRFUl9TMTZfSQotI2RlZmluZSBERUJVR19PTVhWQ000UDJfUVVBTlRJTlZJTlRSQV9TMTZfSQotI2RlZmluZSBERUJVR19PTVhWQ000UDJfVFJBTlNSRUNCTE9DS0NFT0ZfSU5URVIKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1RSQU5TUkVDQkxPQ0tDRU9GX0lOVFJBCi0jZW5kaWYgLyogREVCVUdfRE9NQUlOX1ZDICovCi0KLQotI2lmZGVmIERFQlVHX0RPTUFJTl9JQwotLyogVG8gYmUgZmlsbGVkIGluICovCi0jZW5kaWYgLyogREVCVUdfRE9NQUlOX0lDICovCi0KLQotI2lmZGVmIERFQlVHX0RPTUFJTl9TUAotI2RlZmluZSBERUJVR19PTVhBQ1NQX0RPVFBST0RfUzE2Ci0jZGVmaW5lIERFQlVHX09NWEFDU1BfQkxPQ0tFWFBfUzE2Ci0jZGVmaW5lIERFQlVHX09NWEFDU1BfQkxPQ0tFWFBfUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfQ09QWV9TMTYKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9ET1RQUk9EX1MxNgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0RPVFBST0RfUzE2X1NGUwotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEZXRF9DVE9DX1NDMTZfU0ZTCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZURldEX0NUT0NfU0MzMl9TRlMKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRGV0RfUlRPQ0NTX1MxNlMzMl9TRlMKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRGV0RfUlRPQ0NTX1MzMl9TRlMKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRHRVRCVUZTSVpFX0NfU0MxNgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEdFVEJVRlNJWkVfQ19TQzMyCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUR0VUQlVGU0laRV9SX1MxNl9TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRHRVRCVUZTSVpFX1JfUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5JVF9DX1NDMTYKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTklUX0NfU0MzMgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOSVRfUl9TMTZfUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5JVF9SX1MzMgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOVl9DQ1NUT1JfUzMyUzE2X1NGUwotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOVl9DQ1NUT1JfUzMyX1NGUwotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOVl9DVE9DX1NDMTZfU0ZTCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5WX0NUT0NfU0MzMl9TRlMKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GSUxURVJNRURJQU5fUzMyX0kKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GSUxURVJNRURJQU5fUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRklST05FX0RJUkVDVF9TMTZfSVNGUwotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUk9ORV9ESVJFQ1RfUzE2X0kKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJPTkVfRElSRUNUX1MxNgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUk9ORV9ESVJFQ1RfUzE2X1NGUwotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUl9ESVJFQ1RfUzE2X0lTRlMKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJfRElSRUNUX1MxNl9JCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRklSX0RJUkVDVF9TMTYKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJfRElSRUNUX1MxNl9TRlMKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJPTkVfQklRVUFERElSRUNUX1MxNl9JCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfSUlST05FX0JJUVVBRERJUkVDVF9TMTYKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJPTkVfRElSRUNUX1MxNl9JCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfSUlST05FX0RJUkVDVF9TMTYKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJfQklRVUFERElSRUNUX1MxNl9JCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfSUlSX0JJUVVBRERJUkVDVF9TMTYKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJfRElSRUNUX1MxNl9JCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfSUlSX0RJUkVDVF9TMTYKLSNlbmRpZiAvKiBERUJVR19ET01BSU5fU1AgKi8KLQotCi0jaWZkZWYgREVCVUdfRE9NQUlOX0lQCi0jZGVmaW5lIERFQlVHX09NWElQQk1fQUREQ19VOF9DMVJfU0ZTCi0jZGVmaW5lIERFQlVHX09NWElQQk1fQ09QWV9VOF9DMVIKLSNkZWZpbmUgREVCVUdfT01YSVBCTV9DT1BZX1U4X0MzUgotI2RlZmluZSBERUJVR19PTVhJUEJNX01JUlJPUl9VOF9DMVIKLSNkZWZpbmUgREVCVUdfT01YSVBCTV9NVUxDX1U4X0MxUl9TRlMKLSNkZWZpbmUgREVCVUdfT01YSVBDU19DT0xPUlRXSVNUUTE0X1U4X0MzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1JHQjU2NVRPWUNCQ1I0MjBMU19NQ1VfVTE2X1MxNl9DM1AzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1JHQjU2NVRPWUNCQ1I0MjJMU19NQ1VfVTE2X1MxNl9DM1AzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1JHQjU2NVRPWUNCQ1I0NDRMU19NQ1VfVTE2X1MxNl9DM1AzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1JHQlRPWUNCQ1I0MjBMU19NQ1VfVThfUzE2X0MzUDNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfUkdCVE9ZQ0JDUjQyMkxTX01DVV9VOF9TMTZfQzNQM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19SR0JUT1lDQkNSNDQ0TFNfTUNVX1U4X1MxNl9DM1AzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIwUlNaUk9UX1U4X1AzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIwVE9SR0I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIwVE9SR0I1NjVfVThfVTE2X1AzQzNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjBUT1JHQkxTX01DVV9TMTZfVThfUDNDM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlJTWkNTQ1JPVFJHQl9VOF9DMlIKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlJTWlJPVF9VOF9QM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlRPUkdCNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlRPUkdCNTY1X1U4X1UxNl9DMkMzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyVE9SR0JMU19NQ1VfUzE2X1U4X1AzQzNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJUT1JHQl9VOF9DMkMzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyVE9ZQ0JDUjQyMFJPVEFURV9VOF9DMlAzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyVE9ZQ0JDUjQyMFJPVEFURV9VOF9QM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQ0NFRPUkdCNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQ0NFRPUkdCTFNfTUNVX1MxNl9VOF9QM0MzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSVE9SR0I1NjVfVThfVTE2X0MzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSVE9SR0I1NjVfVThfVTE2X1AzQzNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1JUT1JHQl9VOF9DM1IKLSNkZWZpbmUgREVCVUdfT01YSVBQUF9HRVRDRU5UUkFMTU9NRU5UX1M2NAotI2RlZmluZSBERUJVR19PTVhJUFBQX0dFVFNQQVRJQUxNT01FTlRfUzY0Ci0jZGVmaW5lIERFQlVHX09NWElQUFBfTU9NRU5UR0VUU1RBVEVTSVpFX1M2NAotI2RlZmluZSBERUJVR19PTVhJUFBQX01PTUVOVElOSVRfUzY0Ci0jZGVmaW5lIERFQlVHX09NWElQUFBfTU9NRU5UUzY0U19VOF9DMVIKLSNkZWZpbmUgREVCVUdfT01YSVBQUF9NT01FTlRTNjRTX1U4X0MzUgotI2VuZGlmIC8qIERFQlVHX0RPTUFJTl9JUCAqLwotCi0KLSNlbmRpZiAvKiBfYXJtQ29tbW9uX0hfICovCi0KLS8qRW5kIG9mIEZpbGUqLwotCi0KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU1fQml0RGVjX3MuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtQ09NTV9CaXREZWNfcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTg2NmZhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtQ09NTV9CaXREZWNfcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjg0ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBhcm1DT01NX0JpdERlY19zLmgKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICA5NjQxCi07Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLyBPcGVuTUFYIG9wdGltaXplZCBiaXRzdHJlYW0gZGVjb2RlIG1vZHVsZQotOy8vCi07Ly8gWW91IG11c3QgaW5jbHVkZSBhcm1DT01NX3MuaCBiZWZvcmUgaW5jbHVkaW5nIHRoaXMgZmlsZQotOy8vCi07Ly8gVGhpcyBtb2R1bGUgcHJvdmlkZXMgbWFjcm9zIHRvIHBlcmZvcm0gYXNzZW1ibHkgb3B0aW1pemVkIGZpeGVkIGFuZAotOy8vIHZhcmlhYmxlIGxlbmd0aCBkZWNvZGluZyBmcm9tIGEgcmVhZC1vbmx5IGJpdHN0cmVhbS4gVGhlIHZhcmlhYmxlCi07Ly8gbGVuZ3RoIGRlY29kZSBtb2R1bGVzIHRha2UgYXMgaW5wdXQgYSBwb2ludGVyIHRvIGEgdGFibGUgb2YgMTYtYml0Ci07Ly8gZW50cmllcyBvZiB0aGUgZm9sbG93aW5nIGZvcm1hdC4KLTsvLwotOy8vIFZMRCBUYWJsZSBFbnRyeSBmb3JtYXQKLTsvLwotOy8vICAgICAgICAxNSAxNCAxMyAxMiAxMSAxMCAwOSAwOCAwNyAwNiAwNSAwNCAwMyAwMiAwMSAwMAotOy8vICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi07Ly8gICAgICAgfCAgTGVuICAgfCAgICAgICAgICAgICAgIFN5bWJvbCAgICAgICAgICAgICAgfCAxIHwKLTsvLyAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotOy8vICAgICAgIHwgICAgICAgICAgICAgICAgT2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgIHwgMCB8Ci07Ly8gICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLTsvLwotOy8vIElmIHRoZSB0YWJsZSBlbnRyeSBpcyBhIGxlYWYgZW50cnkgdGhlbiBiaXQgMCBzZXQ6Ci07Ly8gICAgTGVuICAgID0gTnVtYmVyIG9mIGJpdHMgb3ZlcnJlYWQgKDAgdG8gNykKLTsvLyAgICBTeW1ib2wgPSBTeW1ib2wgcGF5bG9hZCAodW5zaWduZWQgMTIgYml0cykKLTsvLwotOy8vIElmIHRoZSB0YWJsZSBlbnRyeSBpcyBhbiBpbnRlcm5hbCBub2RlIHRoZW4gYml0IDAgaXMgY2xlYXI6Ci07Ly8gICAgT2Zmc2V0ID0gTnVtYmVyIG9mICgxNi1iaXQpIGhhbGYgd29yZHMgZnJvbSB0aGUgdGFibGUKLTsvLyAgICAgICAgICAgICBzdGFydCB0byB0aGUgbmV4dCB0YWJsZSBub2RlCi07Ly8KLTsvLyBUaGUgdGFibGUgaXMgYWNjZXNzZWQgYnkgc3VjY2Vzc2l2ZSBsb29rdXAgdXAgb24gdGhlCi07Ly8gbmV4dCBTdGVwIGJpdHMgb2YgdGhlIGlucHV0IGJpdHN0cmVhbSB1bnRpbCBhIGxlYWYgbm9kZQotOy8vIGlzIG9idGFpbmVkLiBUaGUgU3RlcCBzaXplcyBhcmUgc3VwcGxpZWQgdG8gdGhlIFZMRCBtYWNyby4KLTsvLwotOy8vIFVTQUdFOgotOy8vCi07Ly8gVG8gdXNlIGFueSBvZiB0aGUgbWFjcm9zIGluIHRoaXMgcGFja2FnZSwgZmlyc3QgY2FsbDoKLTsvLwotOy8vICAgIE1fQkRfSU5JVCBwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcEJpdFN0cmVhbSwgUkJpdEJ1ZmZlciwgUkJpdENvdW50LCBUbXAKLTsvLwotOy8vIFRoaXMgY2FjaGVzIHRoZSBjdXJyZW50IGJpdHN0cmVhbSBwb3NpdGlvbiBhbmQgbmV4dCBhdmFpbGFibGUKLTsvLyBiaXRzIGluIHJlZ2lzdGVycyBwQml0U3RyZWFtLCBSQml0QnVmZmVyLCBSQml0Q291bnQuIFRoZXNlIHJlZ2lzdGVycwotOy8vIGFyZSByZXNlcnZlZCBmb3IgdXNlIGJ5IHRoZSBiaXRzdHJlYW0gZGVjb2RlIHBhY2thZ2UgdW50aWwgeW91Ci07Ly8gY2FsbCBNX0JEX0ZJTkkuCi07Ly8KLTsvLyBOZXh0IGNhbGwgdGhlIGZvbGxvd2luZyBtYWNybyhzKSBhcyBtYW55IHRpbWVzIGFzIHlvdSBuZWVkOgotOy8vCi07Ly8gICAgTV9CRF9MT09LOCAgICAgICAtIExvb2sgYWhlYWQgY29uc3RhbnQgMTw9Tjw9OCAgYml0cyBpbnRvIHRoZSBiaXRzdHJlYW0KLTsvLyAgICBNX0JEX0xPT0sxNiAgICAgIC0gTG9vayBhaGVhZCBjb25zdGFudCAxPD1OPD0xNiBiaXRzIGludG8gdGhlIGJpdHN0cmVhbQotOy8vICAgIE1fQkRfUkVBRDggICAgICAgLSBSZWFkIGNvbnN0YW50IDE8PU48PTggIGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtCi07Ly8gICAgTV9CRF9SRUFEMTYgICAgICAtIFJlYWQgY29uc3RhbnQgMTw9Tjw9MTYgYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0KLTsvLyAgICBNX0JEX1ZSRUFEOCAgICAgIC0gUmVhZCB2YXJpYWJsZSAxPD1OPD04ICBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbQotOy8vICAgIE1fQkRfVlJFQUQxNiAgICAgLSBSZWFkIHZhcmlhYmxlIDE8PU48PTE2IGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtCi07Ly8gICAgTV9CRF9WTEQgICAgICAgICAtIFBlcmZvcm0gdmFyaWFibGUgbGVuZ3RoIGRlY29kZSB1c2luZyBsb29rdXAgdGFibGUKLTsvLwotOy8vIEZpbmFsbHkgY2FsbCB0aGUgbWFjcm86Ci07Ly8KLTsvLyAgICBNX0JEX0ZJTkkgcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQKLTsvLwotOy8vIFRoaXMgd3JpdGVzIHRoZSBiaXRzdHJlYW0gc3RhdGUgYmFjayB0byBtZW1vcnkuCi07Ly8KLTsvLyBUaGUgdGhyZWUgYml0c3RyZWFtIGNhY2hlIHJlZ2lzdGVyIG5hbWVzIGFyZSBhc3NpZ25lZCB0byB0aGUgZm9sbG93aW5nIGdsb2JhbAotOy8vIHZhcmlhYmxlczoKLTsvLwotCi0gICAgICAgIEdCTFMgICAgcEJpdFN0cmVhbSAgOy8vIFJlZ2lzdGVyIG5hbWUgZm9yIHBCaXRTdHJlYW0KLSAgICAgICAgR0JMUyAgICBCaXRCdWZmZXIgICA7Ly8gUmVnaXN0ZXIgbmFtZSBmb3IgQml0QnVmZmVyCi0gICAgICAgIEdCTFMgICAgQml0Q291bnQgICAgOy8vIFJlZ2lzdGVyIG5hbWUgZm9yIEJpdENvdW50Ci0gICAKLTsvLyAgICAgICAgCi07Ly8gVGhlc2UgcmVnaXN0ZXIgdmFyaWFibGVzIG11c3QgaGF2ZSBhIGNlcnRhaW4gZGVmaW5lZCBzdGF0ZSBvbiBlbnRyeSB0byBldmVyeSBiaXRzdHJlYW0KLTsvLyBtYWNybyAoZXhjZXB0IE1fQkRfSU5JVCkgYW5kIG9uIGV4aXQgZnJvbSBldmVyeSBiaXRzdHJlYW0gbWFjcm8gKGV4Y2VwdCBNX0JEX0ZJTkkpLgotOy8vIFRoZSBzdGF0ZSBtYXkgZGVwZW5kIG9uIGltcGxlbWVudGF0aW9uLgotOy8vCi07Ly8gRm9yIHRoZSBkZWZhdWx0IChBUk0xMSkgaW1wbGVtZW50YXRpb24gdGhlIGZvbGxvd2luZyBob2xkOgotOy8vICAgIHBCaXRTdHJlYW0gLSBwb2ludHMgdG8gdGhlIGZpcnN0IGJ5dGUgbm90IGhlbGQgaW4gdGhlIEJpdEJ1ZmZlcgotOy8vICAgIEJpdEJ1ZmZlciAgLSBpcyBhIGNhY2hlIG9mICg0IGJ5dGVzKSAzMiBiaXRzLCBiaXQgMzEgdGhlIGZpcnN0IGJpdAotOy8vICAgIEJpdENvdW50ICAgLSBpcyBvZmZzZXQgKGZyb20gdGhlIHRvcCBiaXQpIHRvIHRoZSBuZXh0IHVudXNlZCBiaXRzdHJlYW0gYml0Ci07Ly8gICAgMDw9Qml0Q291bnQ8PTE1IChzbyBCaXRCdWZmZXIgaG9sZHMgYXQgbGVhc3QgMTcgdW51c2VkIGJpdHMpCi07Ly8KLTsvLwotCi0gICAgICAgIDsvLyBCaXRzdHJlYW0gRGVjb2RlIGluaXRpYWxpc2UKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbml0aWFsaXNlcyB0aGUgYml0c3RyZWFtIGRlY29kZSBnbG9iYWwgcmVnaXN0ZXJzIGZyb20KLSAgICAgICAgOy8vIGJpdHN0cmVhbSBwb2ludGVycy4gVGhpcyBtYWNybyBpcyBzcGxpdCBpbnRvIDMgcGFydHMgdG8gZW5hYmxlCi0gICAgICAgIDsvLyBzY2hlZHVsaW5nLgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkcHBCaXRTdHJlYW0gICAgLSBwb2ludGVyIHRvIHBvaW50ZXIgdG8gdGhlIG5leHQgYml0c3RyZWFtIGJ5dGUKLSAgICAgICAgOy8vICRwQml0T2Zmc2V0ICAgICAtIHBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBiaXRzIHVzZWQgaW4gdGhlIGN1cnJlbnQgYnl0ZSAoMC4uNykKLSAgICAgICAgOy8vICRSQml0U3RyZWFtICAgICAtIHJlZ2lzdGVyIHRvIHVzZSBmb3IgcEJpdFN0cmVhbSAoY2FuIGJlICRwcEJpdFN0cmVhbSkKLSAgICAgICAgOy8vICRSQml0QnVmZmVyICAgICAtIHJlZ2lzdGVyIHRvIHVzZSBmb3IgQml0QnVmZmVyCi0gICAgICAgIDsvLyAkUkJpdENvdW50ICAgICAgLSByZWdpc3RlciB0byB1c2UgZm9yIEJpdENvdW50ICAgKGNhbiBiZSAkcEJpdE9mZnNldCkKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRUMSwkVDIsJFQzICAgICAtIHJlZ2lzdGVycyB0aGF0IG11c3QgYmUgcHJlc2VydmVkIGJldHdlZW4gY2FsbHMgdG8KLSAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgIE1fQkRfSU5JVDEgYW5kIE1fQkRfSU5JVDIKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9CRF9JTklUMCAgJHBwQml0U3RyZWFtLCAkcEJpdE9mZnNldCwgJFJCaXRTdHJlYW0sICRSQml0QnVmZmVyLCAkUkJpdENvdW50Ci0KLXBCaXRTdHJlYW0gIFNFVFMgIiRSQml0U3RyZWFtIgotQml0QnVmZmVyICAgU0VUUyAiJFJCaXRCdWZmZXIiCi1CaXRDb3VudCAgICBTRVRTICIkUkJpdENvdW50IiAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gbG9hZCBpbnB1dHMKLSAgICAgICAgTERSICAgICAkcEJpdFN0cmVhbSwgWyRwcEJpdFN0cmVhbV0KLSAgICAgICAgTERSICAgICAkQml0Q291bnQsIFskcEJpdE9mZnNldF0KLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9CRF9JTklUMSAgJFQxLCAkVDIsICRUMwotICAgICAgICBMRFJCICAgICRUMiwgWyRwQml0U3RyZWFtLCAjMl0KLSAgICAgICAgTERSQiAgICAkVDEsIFskcEJpdFN0cmVhbSwgIzFdCi0gICAgICAgIExEUkIgICAgJEJpdEJ1ZmZlciwgIFskcEJpdFN0cmVhbV0sICMzCi0gICAgICAgIEFERCAgICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4Ci0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQkRfSU5JVDIgICRUMSwgJFQyLCAkVDMKLSAgICAgICAgT1JSICAgICAkVDIsICRUMiwgJFQxLCBMU0wgIzgKLSAgICAgICAgT1JSICAgICAkQml0QnVmZmVyLCAkVDIsICRCaXRCdWZmZXIsIExTTCAjMTYKLSAgICAgICAgTUVORCAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gTG9vayBhaGVhZCBmaXhlZCAxPD1OPD04IGJpdHMgd2l0aG91dCBjb25zdW1pbmcgYW55IGJpdHMKLSAgICAgICAgOy8vIFRoZSBuZXh0IGJpdHMgd2lsbCBiZSBwbGFjZWQgYXQgYml0IDMxLi4yNCBvZiBkZXN0aW5hdGlvbiByZWdpc3RlcgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkTiAgICAgICAgICAgICAgLSBudW1iZXIgb2YgYml0cyB0byBsb29rCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vIAotICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkU3ltYm9sICAgICAgICAgLSB0aGUgbmV4dCBOIGJpdHMgb2YgdGhlIGJpdHN0cmVhbQotICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLwotICAgICAgICBNQUNSTwotICAgICAgICBNX0JEX0xPT0s4ICAkU3ltYm9sLCAkTgotICAgICAgICBBU1NFUlQgICgkTj49MSk6TEFORDooJE48PTgpCi0gICAgICAgIE1PViAgICAgJFN5bWJvbCwgJEJpdEJ1ZmZlciwgTFNMICRCaXRDb3VudAotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIExvb2sgYWhlYWQgZml4ZWQgMTw9Tjw9MTYgYml0cyB3aXRob3V0IGNvbnN1bWluZyBhbnkgYml0cwotICAgICAgICA7Ly8gVGhlIG5leHQgYml0cyB3aWxsIGJlIHBsYWNlZCBhdCBiaXQgMzEuLjE2IG9mIGRlc3RpbmF0aW9uIHJlZ2lzdGVyCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICROICAgICAgICAgICAgICAtIG51bWJlciBvZiBiaXRzIHRvIGxvb2sKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8gCi0gICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRTeW1ib2wgICAgICAgICAtIHRoZSBuZXh0IE4gYml0cyBvZiB0aGUgYml0c3RyZWFtCi0gICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQkRfTE9PSzE2ICAkU3ltYm9sLCAkTiwgJFQxCi0gICAgICAgIEFTU0VSVCAgKCROID49IDEpOkxBTkQ6KCROIDw9IDE2KQotICAgICAgICBNT1YgICAgICRTeW1ib2wsICRCaXRCdWZmZXIsIExTTCAkQml0Q291bnQKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBTa2lwcyBmaXhlZCAxPD1OPD04IGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtLCBhZHZhbmNpbmcgdGhlIGJpdHN0cmVhbSBwb2ludGVyCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICROICAgICAgICAgICAgICAtIG51bWJlciBvZiBiaXRzCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vIAotICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQkRfU0tJUDggJE4sICRUMQotICAgICAgICBBU1NFUlQgICgkTj49MSk6TEFORDooJE48PTgpICAgICAgICAKLSAgICAgICAgU1VCUyAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIyg4LSROKQotICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEgICAKLSAgICAgICAgQUREQ0MgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKLSAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBSZWFkIGZpeGVkIDE8PU48PTggYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0sIGFkdmFuY2luZyB0aGUgYml0c3RyZWFtIHBvaW50ZXIKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJE4gICAgICAgICAgICAgIC0gbnVtYmVyIG9mIGJpdHMgdG8gcmVhZAotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLyAKLSAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJFN5bWJvbCAgICAgICAgIC0gdGhlIG5leHQgTiBiaXRzIG9mIHRoZSBiaXRzdHJlYW0KLSAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9CRF9SRUFEOCAkU3ltYm9sLCAkTiwgJFQxCi0gICAgICAgIEFTU0VSVCAgKCROPj0xKTpMQU5EOigkTjw9OCkgICAgICAgICAgICAgICAgCi0gICAgICAgIE1PVlMgICAgJFN5bWJvbCwgJEJpdEJ1ZmZlciwgTFNMICRCaXRDb3VudCAgICAgICAgCi0gICAgICAgIFNVQlMgICAgJEJpdENvdW50LCAkQml0Q291bnQsICMoOC0kTikKLSAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxICAgCi0gICAgICAgIEFERENDICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4Ci0gICAgICAgIE1PViAgICAgJFN5bWJvbCwgJFN5bWJvbCwgTFNSICMoMzItJE4pCi0gICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKLSAgICAgICAgTUVORAotCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gUmVhZCBmaXhlZCAxPD1OPD0xNiBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbSwgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlcgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkTiAgICAgICAgICAgICAgLSBudW1iZXIgb2YgYml0cyB0byByZWFkCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vIAotICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkU3ltYm9sICAgICAgICAgLSB0aGUgbmV4dCBOIGJpdHMgb2YgdGhlIGJpdHN0cmVhbQotICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8gJFQyICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLwotICAgICAgICBNQUNSTwotICAgICAgICBNX0JEX1JFQUQxNiAkU3ltYm9sLCAkTiwgJFQxLCAkVDIKLSAgICAgICAgQVNTRVJUICAoJE4+PTEpOkxBTkQ6KCROPD0xNikKLSAgICAgICAgQVNTRVJUICAkU3ltYm9sPD4kVDEKLSAgICAgICAgSUYgKCROPD04KQotICAgICAgICAgICAgTV9CRF9SRUFEOCAgJFN5bWJvbCwgJE4sICRUMQotICAgICAgICBFTFNFICAgICAgICAKLSAgICAgICAgICAgIDsvLyBOPjggc28gd2Ugd2lsbCBiZSBhYmxlIHRvIHJlZmlsbCBhdCBsZWFzdCBvbmUgYnl0ZSAgICAgICAgICAgIAotICAgICAgICAgICAgTERSQiAgICAkVDEsIFskcEJpdFN0cmVhbV0sICMxICAgICAgICAgICAgCi0gICAgICAgICAgICBNT1ZTICAgICRTeW1ib2wsICRCaXRCdWZmZXIsIExTTCAkQml0Q291bnQKLSAgICAgICAgICAgIE9SUiAgICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzggICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgU1VCUyAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIygxNi0kTikKLSAgICAgICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMSAgICAgICAgICAgIAotICAgICAgICAgICAgTU9WICAgICAkU3ltYm9sLCAkU3ltYm9sLCBMU1IgIygzMi0kTikKLSAgICAgICAgICAgIEFERENDICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4Ci0gICAgICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4Ci0gICAgICAgIEVORElGCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gU2tpcCB2YXJpYWJsZSAxPD1OPD04IGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtLCBhZHZhbmNpbmcgdGhlIGJpdHN0cmVhbSBwb2ludGVyLgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkTiAgICAgICAgICAgICAgLSBudW1iZXIgb2YgYml0cy4gMTw9Tjw9OAotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLyAKLSAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8gJFQyICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLwotICAgICAgICBNQUNSTwotICAgICAgICBNX0JEX1ZTS0lQOCAkTiwgJFQxCi0gICAgICAgIEFERCAgICAgJEJpdENvdW50LCAkQml0Q291bnQsICROCi0gICAgICAgIFNVQlMgICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4Ci0gICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMSAgICAgICAgCi0gICAgICAgIEFERENDICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4Ci0gICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKLSAgICAgICAgTUVORCAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIFNraXAgdmFyaWFibGUgMTw9Tjw9MTYgYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0sIGFkdmFuY2luZyB0aGUgYml0c3RyZWFtIHBvaW50ZXIuCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICROICAgICAgICAgICAgICAtIG51bWJlciBvZiBiaXRzLiAxPD1OPD0xNgotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLyAKLSAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8gJFQyICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLwotICAgICAgICBNQUNSTwotICAgICAgICBNX0JEX1ZTS0lQMTYgJE4sICRUMSwgJFQyCi0gICAgICAgIEFERCAgICAgJEJpdENvdW50LCAkQml0Q291bnQsICROCi0gICAgICAgIFNVQlMgICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4Ci0gICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMSAgICAgICAgCi0gICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKLSAgICAgICAgU1VCQ1NTICAkQml0Q291bnQsICRCaXRDb3VudCwgIzggICAgICAgIAotICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEKLSAgICAgICAgQUREQ0MgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKLSAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAotICAgICAgICBNRU5EICAgICAgICAKLQotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIFJlYWQgdmFyaWFibGUgMTw9Tjw9OCBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbSwgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlci4KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJE4gICAgICAgICAgICAgIC0gbnVtYmVyIG9mIGJpdHMgdG8gcmVhZC4gMTw9Tjw9OAotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLyAKLSAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJFN5bWJvbCAgICAgICAgIC0gdGhlIG5leHQgTiBiaXRzIG9mIHRoZSBiaXRzdHJlYW0KLSAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vICRUMiAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9CRF9WUkVBRDggJFN5bWJvbCwgJE4sICRUMSwgJFQyCi0gICAgICAgIE1PViAgICAgJFN5bWJvbCwgJEJpdEJ1ZmZlciwgTFNMICRCaXRDb3VudCAgICAgICAgCi0gICAgICAgIEFERCAgICAgJEJpdENvdW50LCAkQml0Q291bnQsICROCi0gICAgICAgIFNVQlMgICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4Ci0gICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMSAgICAgICAgCi0gICAgICAgIFJTQiAgICAgJFQyLCAkTiwgIzMyICAgICAgICAKLSAgICAgICAgQUREQ0MgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKLSAgICAgICAgTU9WICAgICAkU3ltYm9sLCAkU3ltYm9sLCBMU1IgJFQyCi0gICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKLSAgICAgICAgTUVORAotCi0KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBSZWFkIHZhcmlhYmxlIDE8PU48PTE2IGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtLCBhZHZhbmNpbmcgdGhlIGJpdHN0cmVhbSBwb2ludGVyLgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkTiAgICAgICAgICAgICAgLSBudW1iZXIgb2YgYml0cyB0byByZWFkLiAxPD1OPD0xNgotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLyAKLSAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJFN5bWJvbCAgICAgICAgIC0gdGhlIG5leHQgTiBiaXRzIG9mIHRoZSBiaXRzdHJlYW0KLSAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vICRUMiAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9CRF9WUkVBRDE2ICRTeW1ib2wsICROLCAkVDEsICRUMgotICAgICAgICBNT1YgICAgICRTeW1ib2wsICRCaXRCdWZmZXIsIExTTCAkQml0Q291bnQgICAgICAgIAotICAgICAgICBBREQgICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAkTgotICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAotICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEgICAgICAgIAotICAgICAgICBSU0IgICAgICRUMiwgJE4sICMzMiAgICAgICAgCi0gICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKLSAgICAgICAgU1VCQ1NTICAkQml0Q291bnQsICRCaXRDb3VudCwgIzggICAgICAgIAotICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEKLSAgICAgICAgQUREQ0MgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKLSAgICAgICAgTU9WICAgICAkU3ltYm9sLCAkU3ltYm9sLCBMU1IgJFQyCi0gICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKLSAgICAgICAgTUVORAotCi0KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBEZWNvZGUgYSBjb2RlIG9mIHRoZSBmb3JtIDAwMDAuLi4wMDEgd2hlcmUgdGhlcmUKLSAgICAgICAgOy8vIGFyZSBOIHplcm9zIGJlZm9yZSB0aGUgMSBhbmQgTjw9MTUgKGNvZGUgbGVuZ3RoPD0xNikKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLyAKLSAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJFN5bWJvbCAgICAgICAgIC0gdGhlIG51bWJlciBvZiB6ZXJvcyBiZWZvcmUgdGhlIG5leHQgMQotICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgPj0xNiBpcyBhbiBpbGxlZ2FsIGNvZGUKLSAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vICRUMiAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBNX0JEX0NMWjE2ICRTeW1ib2wsICRUMSwgJFQyCi0gICAgICAgIE1PVlMgICAgJFN5bWJvbCwgJEJpdEJ1ZmZlciwgTFNMICRCaXRDb3VudAotICAgICAgICBDTFogICAgICRTeW1ib2wsICRTeW1ib2wgICAgICAgICAgICAgICAgCi0gICAgICAgIEFERCAgICAgJEJpdENvdW50LCAkQml0Q291bnQsICRTeW1ib2wKLSAgICAgICAgU1VCUyAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzcgICAgICAgIDsvLyBsZW5ndGggaXMgU3ltYm9sKzEKLSAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxCi0gICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKLSAgICAgICAgU1VCQ1NTICAkQml0Q291bnQsICRCaXRDb3VudCwgIzggICAgICAgIAotICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEKLSAgICAgICAgQUREQ0MgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKLSAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAotICAgICAgICBNRU5EICAKLQotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIERlY29kZSBhIGNvZGUgb2YgdGhlIGZvcm0gMTExMS4uLjExMCB3aGVyZSB0aGVyZQotICAgICAgICA7Ly8gYXJlIE4gb25lcyBiZWZvcmUgdGhlIDAgYW5kIE48PTE1IChjb2RlIGxlbmd0aDw9MTYpCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8gCi0gICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRTeW1ib2wgICAgICAgICAtIHRoZSBudW1iZXIgb2YgemVyb3MgYmVmb3JlIHRoZSBuZXh0IDEKLSAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgID49MTYgaXMgYW4gaWxsZWdhbCBjb2RlCi0gICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyAkVDIgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9CRF9DTE8xNiAkU3ltYm9sLCAkVDEsICRUMgotICAgICAgICBNT1YgICAgICRTeW1ib2wsICRCaXRCdWZmZXIsIExTTCAkQml0Q291bnQKLSAgICAgICAgTVZOICAgICAkU3ltYm9sLCAkU3ltYm9sCi0gICAgICAgIENMWiAgICAgJFN5bWJvbCwgJFN5bWJvbCAgICAgICAgICAgICAgICAKLSAgICAgICAgQUREICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgJFN5bWJvbAotICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjNyAgICAgICAgOy8vIGxlbmd0aCBpcyBTeW1ib2wrMQotICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEKLSAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAotICAgICAgICBTVUJDU1MgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOCAgICAgICAgCi0gICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMQotICAgICAgICBBRERDQyAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAotICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4Ci0gICAgICAgIE1FTkQgIAotCi0KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBWYXJpYWJsZSBMZW5ndGggRGVjb2RlIG1vZHVsZQotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIERlY29kZXMgb25lIFZMRCBTeW1ib2wgZnJvbSBhIGJpdHN0cmVhbSBhbmQgcmVmaWxsIHRoZSBiaXRzdHJlYW0KLSAgICAgICAgOy8vIGJ1ZmZlci4KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJHBWTERUYWJsZSAgICAgIC0gcG9pbnRlciB0byBWTEQgZGVjb2RlIHRhYmxlIG9mIDE2LWJpdCBlbnRyaWVzLgotICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgVGhlIGZvcm1hdCBpcyBkZXNjcmliZWQgYWJvdmUgYXQgdGhlIHN0YXJ0IG9mCi0gICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICB0aGlzIGZpbGUuCi0gICAgICAgIDsvLyAkUzAgICAgICAgICAgICAgLSBUaGUgbnVtYmVyIG9mIGJpdHMgdG8gbG9vayB1cCBmb3IgdGhlIGZpcnN0IHN0ZXAKLSAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgIDE8PSRTMDw9OAotICAgICAgICA7Ly8gJFMxICAgICAgICAgICAgIC0gVGhlIG51bWJlciBvZiBiaXRzIHRvIGxvb2sgdXAgZm9yIGVhY2ggc3Vic2VxdWVudAotICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgc3RlcCAxPD0kUzE8PSRTMC4KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vIAotICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkU3ltYm9sICAgICAgICAgLSBkZWNvZGVkIFZMRCBzeW1ib2wgdmFsdWUKLSAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vICRUMiAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9CRF9WTEQgJFN5bWJvbCwgJFQxLCAkVDIsICRwVkxEVGFibGUsICRTMCwgJFMxCi0gICAgICAgIEFTU0VSVCAoMTw9JFMwKTpMQU5EOigkUzA8PTgpCi0gICAgICAgIEFTU0VSVCAoMTw9JFMxKTpMQU5EOigkUzE8PSRTMCkKLSAgICAgICAgCi0gICAgICAgIDsvLyBOb3RlIDA8PUJpdENvdW50PD0xNSBvbiBlbnRyeSBhbmQgZXhpdAotICAgICAgICAKLSAgICAgICAgTU9WUyAgICAkVDEsICRCaXRCdWZmZXIsIExTTCAkQml0Q291bnQgICAgICAgOy8vIGxlZnQgYWxpZ24gbmV4dCBiaXRzCi0gICAgICAgIE1PVlMgICAgJFN5bWJvbCwgIygyPDwkUzApLTIgICAgICAgICAgICAgICAgIDsvLyBjcmVhdGUgbWFzawotICAgICAgICBBTkQgICAgICRTeW1ib2wsICRTeW1ib2wsICRUMSwgTFNSICMoMzEtJFMwKSA7Ly8gMioobmV4dCAkUzAgYml0cykKLSAgICAgICAgU1VCUyAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzggICAgICAgICAgICAgOy8vIENTIGlmIGJ1ZmZlciBjYW4gYmUgZmlsbGVkCi0wMQotICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEgICAgICAgICAgICAgICA7Ly8gbG9hZCByZWZpbGwgYnl0ZQotICAgICAgICBMRFJIICAgICRTeW1ib2wsIFskcFZMRFRhYmxlLCAkU3ltYm9sXSAgICAgICA7Ly8gbG9hZCB0YWJsZSBlbnRyeQotICAgICAgICBBRERDQyAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOCAgICAgICAgICAgICA7Ly8gcmVmaWxsIG5vdCBwb3NzaWJsZQotICAgICAgICBBREQgICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjJFMwICAgICAgICAgICA7Ly8gYXNzdW1lICRTMCBiaXRzIHVzZWQKLSAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOCAgOy8vIG1lcmdlIGluIHJlZmlsbCBieXRlCi0gICAgICAgIE1PVlMgICAgJFQxLCAkU3ltYm9sLCBMU1IgIzEgICAgICAgICAgICAgICAgIDsvLyBDUz1sZWFmIGVudHJ5Ci0gICAgICAgIEJDUyAgICAgJUZUMDIKLSAgICAgICAgCi0gICAgICAgIE1PVlMgICAgJFQxLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50ICAgICAgIDsvLyBsZWZ0IGFsaWduIG5leHQgYml0Ci0gICAgICAgIElGICgyKiRTMC0kUzE8PTgpCi0gICAgICAgICAgICA7Ly8gQ2FuIGNvbWJpbmUgcmVmaWxsIGNoZWNrIGFuZCAtUzArUzEgYW5kIGtlZXAgJEJpdENvdW50PD0xNQotICAgICAgICAgICAgU1VCUyAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgrKCRTMC0kUzEpCi0gICAgICAgIEVMU0UKLSAgICAgICAgICAgIDsvLyBTZXBhcmF0ZSByZWZpbGwgY2hlY2sgYW5kIC1TMCtTMSBvZmZzZXQKLSAgICAgICAgICAgIFNVQlMgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAotICAgICAgICAgICAgU1VCICAgJEJpdENvdW50LCAkQml0Q291bnQsICMoJFMwLSRTMSkKLSAgICAgICAgRU5ESUYKLSAgICAgICAgQUREICAgICAkU3ltYm9sLCAkU3ltYm9sLCAkVDEsIExTUiAjKDMxLSRTMSkgOy8vIGFkZCAyKihuZXh0ICRTMSBiaXRzKSB0bwotICAgICAgICBCSUMgICAgICRTeW1ib2wsICRTeW1ib2wsICMxICAgICAgICAgICAgICAgICA7Ly8gICB0YWJsZSBvZmZzZXQKLSAgICAgICAgQiAgICAgICAlQlQwMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGxvYWQgbmV4dCB0YWJsZSBlbnRyeQotMDIKLSAgICAgICAgOy8vIEJpdENvdW50IHJhbmdlIG5vdyBkZXBlbmQgb24gdGhlIHJvdXRlIGhlcmUKLSAgICAgICAgOy8vIGlmIChmaXJzdCBzdGVwKSAgICAgICBTMCA8PSBCaXRDb3VudCA8PSA3K1MwICAgICAgICA8PTE1Ci0gICAgICAgIDsvLyBlbHNlIGlmICgyKlMwLVMxPD04KSAgUzAgPD0gQml0Q291bnQgPD0gNysoMipTMC1TMSkgPD0xNQotICAgICAgICA7Ly8gZWxzZSAgICAgICAgICAgICAgICAgIFMxIDw9IEJpdENvdW50IDw9IDcrUzEgICAgICAgIDw9MTUKLSAgICAgICAgCi0gICAgICAgIFNVQiAgICAgJEJpdENvdW50LCAkQml0Q291bnQsICRTeW1ib2wsIExTUiMxMwotICAgICAgICBCSUMgICAgICRTeW1ib2wsICRUMSwgIzB4RjAwMAotICAgICAgICBNRU5ECi0gICAgICAgIAotCi0gICAgICAgIDsvLyBBZGQgYW4gb2Zmc2V0IG51bWJlciBvZiBiaXRzCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gT3V0cHV0cyBkZXN0aW5hdGlvbiBieXRlIGFuZCBiaXQgaW5kZXggdmFsdWVzIHdoaWNoIGNvcnJlc3BvbmRzIHRvIGFuIG9mZnNldCBudW1iZXIgb2YgYml0cyAKLSAgICAgICAgOy8vIGZyb20gdGhlIGN1cnJlbnQgbG9jYXRpb24uIFRoaXMgaXMgdXNlZCB0byBjb21wYXJlIGJpdHN0cmVhbSBwb3NpdGlvbnMgdXNpbmcuIE1fQkRfQ01QLgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkT2Zmc2V0ICAgICAgICAgLSBPZmZzZXQgdG8gYmUgYWRkZWQgaW4gYml0cy4KLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJEJ5dGVJbmRleCAgICAgIC0gRGVzdGluYXRpb24gcEJpdFN0cmVhbSBwb2ludGVyIGFmdGVyIGFkZGluZyB0aGUgT2Zmc2V0LiAKLSAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgIFRoaXMgdmFsdWUgd2lsbCBiZSA0IGJ5dGUgYWhlYWQgYW5kIG5lZWRzIHRvIHN1YnRyYWN0IGJ5IDQgdG8gZ2V0IGV4YWN0IAotICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgcG9pbnRlciAoYXMgaW4gTV9CRF9GSU5JKS4gQnV0IGZvciB1c2luZyB3aXRoIE1fQkRfQ01QIHN1YnRyYWN0IGlzIG5vdCBuZWVkZWQuCi0gICAgICAgIDsvLyAkQml0SW5kZXggICAgICAgLSBEZXN0aW5hdGlvbiBCaXRDb3VudCBhZnRlciB0aGUgYWRkaXRpb24gb2YgT2Zmc2V0IG51bWJlciBvZiBiaXRzCi0gICAgICAgIDsvLwotICAgICAgICBNQUNSTwotICAgICAgICBNX0JEX0FERCAgJEJ5dGVJbmRleCwgJEJpdEluZGV4LCAkT2Zmc2V0Ci0KLSAgICAgICAgOy8vICgkQnl0ZUluZGV4LCRCaXRJbmRleCkgPSBDdXJyZW50IHBvc2l0aW9uICsgJE9mZnNldCBiaXRzCi0gICAgICAgIEFERCAgICAgJE9mZnNldCwgJE9mZnNldCwgJEJpdENvdW50Ci0gICAgICAgIEFORCAgICAgJEJpdEluZGV4LCAkT2Zmc2V0LCAjNwotICAgICAgICBBREQgICAgICRCeXRlSW5kZXgsICRwQml0U3RyZWFtLCAkT2Zmc2V0LCBBU1IgIzMgICAgICAgIAotICAgICAgICBNRU5ECi0KLSAgICAgICAgOy8vIE1vdmUgYml0c3RyZWFtIHBvaW50ZXJzIHRvIHRoZSBsb2NhdGlvbiBnaXZlbgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIE91dHB1dHMgZGVzdGluYXRpb24gYnl0ZSBhbmQgYml0IGluZGV4IHZhbHVlcyB3aGljaCBjb3JyZXNwb25kcyB0byAgCi0gICAgICAgIDsvLyB0aGUgY3VycmVudCBsb2NhdGlvbiBnaXZlbiAoY2FsY3VsYXRlZCB1c2luZyBNX0JEX0FERCkuIAotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vICRCeXRlSW5kZXggICAgICAtIERlc3RpbmF0aW9uIHBCaXRTdHJlYW0gcG9pbnRlciBhZnRlciBtb3ZlLiAKLSAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgIFRoaXMgdmFsdWUgd2lsbCBiZSA0IGJ5dGUgYWhlYWQgYW5kIG5lZWRzIHRvIHN1YnRyYWN0IGJ5IDQgdG8gZ2V0IGV4YWN0IAotICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgcG9pbnRlciAoYXMgaW4gTV9CRF9GSU5JKS4KLSAgICAgICAgOy8vICRCaXRJbmRleCAgICAgICAtIERlc3RpbmF0aW9uIEJpdENvdW50IGFmdGVyIHRoZSBtb3ZlCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuICAKLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9CRF9NT1YgICRCeXRlSW5kZXgsICRCaXRJbmRleAotCi0gICAgICAgIDsvLyAoJHBCaXRTdHJlYW0sICRPZmZzZXQpID0gKCRCeXRlSW5kZXgsJEJpdEluZGV4KQotICAgICAgICBNT1YgICAgICRCaXRDb3VudCwgJEJpdEluZGV4Ci0gICAgICAgIE1PViAgICAgJHBCaXRTdHJlYW0sICRCeXRlSW5kZXgKLSAgICAgICAgTUVORAotCi0gICAgICAgIDsvLyBCaXRzdHJlYW0gQ29tcGFyZQotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIENvbXBhcmVzIGJpdHN0cmVhbSBwb3NpdGlvbiB3aXRoIHRoYXQgb2YgYSBkZXN0aW5hdGlvbiBwb3NpdGlvbi4gRGVzdGluYXRpb24gcG9zaXRpb24gCi0gICAgICAgIDsvLyBpcyBoZWxkIGluIHR3byBpbnB1dCByZWdpc3RlcnMgd2hpY2ggYXJlIGNhbGN1bGF0ZWQgdXNpbmcgTV9CRF9BREQgbWFjcm8KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJEJ5dGVJbmRleCAgICAgIC0gRGVzdGluYXRpb24gcEJpdFN0cmVhbSBwb2ludGVyLCAoNCBieXRlIGFoZWFkIGFzIGRlc2NyaWJlZCBpbiBNX0JEX0FERCkKLSAgICAgICAgOy8vICRCaXRJbmRleCAgICAgICAtIERlc3RpbmF0aW9uIEJpdENvdW50Ci0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIEZMQUdTICAgICAgICAgICAtIEdFIGlmIGRlc3RpbmF0aW9uIGlzIHJlYWNoZWQsIExUID0gaXMgZGVzdGluYXRpb24gaXMgYWhlYWQKLSAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQkRfQ01QICAkQnl0ZUluZGV4LCAkQml0SW5kZXgsICRUMQotICAgICAgICAKLSAgICAgICAgOy8vIFJldHVybiBmbGFncyBzZXQgYnkgKGN1cnJlbnQgcG9zaXRvbiktKCRCeXRlSW5kZXgsJEJpdEluZGV4KQotICAgICAgICA7Ly8gc28gR0UgbWVhbnMgdGhhdCB3ZSBoYXZlIHJlYWNoZWQgdGhlIGluZGljYXRlZCBwb3NpdGlvbgotCi0gICAgICAgIEFERCAgICAgICAgICRUMSwgJHBCaXRTdHJlYW0sICRCaXRDb3VudCwgTFNSICMzCi0gICAgICAgIENNUCAgICAgICAgICRUMSwgJEJ5dGVJbmRleAotICAgICAgICBBTkQgICAgICAgICAkVDEsICRCaXRDb3VudCwgIzcKLSAgICAgICAgQ01QRVEgICAgICAgJFQxLCAkQml0SW5kZXggICAgICAgIAotICAgICAgICBNRU5ECi0KLSAgICAgICAgCi0gICAgICAgIDsvLyBCaXRzdHJlYW0gRGVjb2RlIGZpbmFsaXNlCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gV3JpdGVzIGJhY2sgdGhlIGJpdHN0cmVhbSBzdGF0ZSB0byB0aGUgYml0c3RyZWFtIHBvaW50ZXJzCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJHBwQml0U3RyZWFtICAgIC0gcG9pbnRlciB0byBwb2ludGVyIHRvIHRoZSBuZXh0IGJpdHN0cmVhbSBieXRlCi0gICAgICAgIDsvLyAkcEJpdE9mZnNldCAgICAgLSBwb2ludGVyIHRvIHRoZSBudW1iZXIgb2YgYml0cyB1c2VkIGluIHRoZSBjdXJyZW50IGJ5dGUgKDAuLjcpCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSB0aGVzZSByZWdpc3RlciBhcmUgY29ycnVwdGVkCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQkRfRklOSSAgJHBwQml0U3RyZWFtLCAkcEJpdE9mZnNldAotICAgICAgICAKLSAgICAgICAgOy8vIEFkdmFuY2UgcG9pbnRlciBieSB0aGUgbnVtYmVyIG9mIGZyZWUgYml0cyBpbiB0aGUgYnVmZmVyCi0gICAgICAgIEFERCAgICAgJHBCaXRTdHJlYW0sICRwQml0U3RyZWFtLCAkQml0Q291bnQsIExTUiMzCi0gICAgICAgIEFORCAgICAgJEJpdENvdW50LCAkQml0Q291bnQsICM3Ci0gICAgICAgIAotICAgICAgICA7Ly8gTm93IG1vdmUgYmFjayAzMiBiaXRzIHRvIHJlYWNoIHRoZSBmaXJzdCB1c3VlZCBiaXQKLSAgICAgICAgU1VCICAgICAkcEJpdFN0cmVhbSwgJHBCaXRTdHJlYW0sICM0Ci0gICAgICAgIAotICAgICAgICA7Ly8gU3RvcmUgb3V0IGJpdHN0cmVhbSBzdGF0ZQotICAgICAgICBTVFIgICAgICRCaXRDb3VudCwgWyRwQml0T2Zmc2V0XQotICAgICAgICBTVFIgICAgICRwQml0U3RyZWFtLCBbJHBwQml0U3RyZWFtXQotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBFTkQKLSAgICAgICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU1fQml0c3RyZWFtLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU1fQml0c3RyZWFtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3NmI2NmQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NX0JpdHN0cmVhbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1DT01NX0JpdHN0cmVhbS5oCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRmlsZTogYXJtQ09NTV9CaXRzdHJlYW0uaAotICogQnJpZWY6IERlY2xhcmVzIGNvbW1vbiBBUEkncy9EYXRhIHR5cGVzIHVzZWQgYWNyb3NzIHRoZSBPcGVuTWF4IEVuY29kZXJzL0RlY29kZXJzLgotICoKLSAqLwotCi0jaWZuZGVmIF9hcm1Db2RlY19IXwotI2RlZmluZSBfYXJtQ29kZWNfSF8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBPTVhfVTggICBjb2RlTGVuOwotICAgIE9NWF9VMzIJIGNvZGVXb3JkOwotfSBBUk1fVkxDMzI7Ci0KLS8qIFRoZSBhYm92ZSBzaG91bGQgYmUgcmVuYW1lZCBhcyAiQVJNX1ZMQzMyIiAqLwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1Mb29rQWhlYWRCaXRzKCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIEdldCB0aGUgbmV4dCBOIGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtIHdpdGhvdXQgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlcgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICAgICAqKnBwQml0U3RyZWFtCi0gKiBbaW5dICAgICAqcE9mZnNldAotICogW2luXSAgICAgTj0xLi4uMzIKLSAqCi0gKiBSZXR1cm5zICBWYWx1ZQotICovCi0KLU9NWF9VMzIgYXJtTG9va0FoZWFkQml0cyhjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwgT01YX0lOVCAqcE9mZnNldCwgT01YX0lOVCBOKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtR2V0Qml0cygpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBSZWFkIE4gYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0KLSAqICAgIAotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQotICogW2luXSAgICAgKnBPZmZzZXQKLSAqIFtpbl0gICAgIE49MS4uMzIKLSAqCi0gKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KLSAqIFtvdXRdICAgICpwT2Zmc2V0Ci0gKiBSZXR1cm5zICBWYWx1ZQotICovCi0KLU9NWF9VMzIgYXJtR2V0Qml0cyhjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwgT01YX0lOVCAqcE9mZnNldCwgT01YX0lOVCBOKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtQnl0ZUFsaWduKCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIEFsaWduIHRoZSBwb2ludGVyICpwcEJpdFN0cmVhbSB0byB0aGUgbmV4dCBieXRlIGJvdW5kYXJ5Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQotICogW2luXSAgICAgKnBPZmZzZXQKLSAqCi0gKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KLSAqIFtvdXRdICAgICpwT2Zmc2V0Ci0gKgotICoqLwotIAotT01YVm9pZCBhcm1CeXRlQWxpZ24oY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sT01YX0lOVCAqcE9mZnNldCk7Ci0KLS8qKiAKLSAqIEZ1bmN0aW9uOiBhcm1Ta2lwQml0cygpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBTa2lwIE4gYml0cyBmcm9tIHRoZSB2YWx1ZSBhdCAqcHBCaXRTdHJlYW0KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgICAgKnBwQml0U3RyZWFtCi0gKiBbaW5dICAgICAqcE9mZnNldAotICogW2luXSAgICAgTgotICoKLSAqIFtvdXRdICAgICpwcEJpdFN0cmVhbQotICogW291dF0gICAgKnBPZmZzZXQKLSAqCi0gKiovCi0KLU9NWFZvaWQgYXJtU2tpcEJpdHMoY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sT01YX0lOVCAqcE9mZnNldCxPTVhfSU5UIE4pOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBWYXJpYWJsZSBiaXQgbGVuZ3RoIERlY29kZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVW5QYWNrVkxDMzIoKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVmFyaWFibGUgbGVuZ3RoIGRlY29kZSBvZiB2YXJpYWJsZSBsZW5ndGggc3ltYm9sIChtYXggc2l6ZSAzMiBiaXRzKSByZWFkIGZyb20KLSAqIHRoZSBiaXQgc3RyZWFtIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIGF0ICpwT2Zmc2V0IGJ5IHVzaW5nIHRoZSB0YWJsZQotICogcG9pbnRlZCBieSBwQ29kZUJvb2sKLSAqIAotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gICAgICoqcHBCaXRTdHJlYW0KLSAqIFtpbl0gICAgICpwT2Zmc2V0Ci0gKiBbaW5dICAgICBwQ29kZUJvb2sKLSAqIAotICogW291dF0gICAgKipwcEJpdFN0cmVhbQotICogW291dF0gICAgKnBPZmZzZXQKLSAqCi0gKiBSZXR1cm5zIDogQ29kZSBCb29rIEluZGV4IGlmIHN1Y2Nlc3NmdWxsLiAKLSAqICAgICAgICAgOiAiQVJNX05PX0NPREVCT09LX0lOREVYID0gMHhGRkZGIiBpZiBzZWFyY2ggZmFpbHMuCi0gKiovCi0KLSNkZWZpbmUgQVJNX05PX0NPREVCT09LX0lOREVYIChPTVhfVTE2KSgweEZGRkYpCi0KLU9NWF9VMTYgYXJtVW5QYWNrVkxDMzIoCi0gICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgT01YX0lOVCAqcE9mZnNldCwKLSAgICBjb25zdCBBUk1fVkxDMzIgKnBDb2RlQm9vawotKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRml4ZWQgYml0IGxlbmd0aCBFbmNvZGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogRnVuY3Rpb246IGFybVBhY2tCaXRzCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQYWNrIGEgVkxDIGNvZGUgd29yZCBpbnRvIHRoZSBiaXRzdHJlYW0KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbS4KLSAqIFtpbl0JcE9mZnNldAkgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSAKLSAqICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMAotICogICAgICAgICAgICAgICAgICAgICAgdG8gNy4KLSAqIFtpbl0JY29kZVdvcmQJCUNvZGUgd29yZCB0aGF0IG5lZWQgdG8gYmUgaW5zZXJ0ZWQgaW4gdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtCi0gKiBbaW5dCWNvZGVMZW5ndGgJCUxlbmd0aCBvZiB0aGUgY29kZSB3b3JkIHZhbGlkIHJhbmdlIDEuLi4zMgotICoKLSAqIFtvdXRdIHBwQml0U3RyZWFtCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLAotICoJICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0Ci0gKgkJCQkJCQlzdHJlYW0gYnVmZmVyLgotICogW291dF0gcEJpdE9mZnNldAkJKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKLSAqCQkJCQkJCWN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKLSAqCQkJCQkJCSpwcEJpdFN0cmVhbS4KLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhfUkVTVUxUIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0gCi1PTVhSZXN1bHQgYXJtUGFja0JpdHMgKAotICAgIE9NWF9VOCAgKipwcEJpdFN0cmVhbSwgCi0gICAgT01YX0lOVCAqcE9mZnNldCwKLSAgICBPTVhfVTMyIGNvZGVXb3JkLCAKLSAgICBPTVhfSU5UIGNvZGVMZW5ndGggCi0pOwotIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVmFyaWFibGUgYml0IGxlbmd0aCBFbmNvZGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogRnVuY3Rpb246IGFybVBhY2tWTEMzMgotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGFjayBhIFZMQyBjb2RlIHdvcmQgaW50byB0aGUgYml0c3RyZWFtCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIAotICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0uCi0gKiBbaW5dCXBCaXRPZmZzZXQJICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSAKLSAqICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMAotICogICAgICAgICAgICAgICAgICAgICAgdG8gNy4KLSAqIFtpbl0JIGNvZGUgICAgIAkJVkxDIGNvZGUgd29yZCB0aGF0IG5lZWQgdG8gYmUgaW5zZXJ0ZWQgaW4gdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICBiaXRzdHJlYW0KLSAqCi0gKiBbb3V0XSBwcEJpdFN0cmVhbQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwKLSAqCSAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0Ci0gKgkJCQkJCXN0cmVhbSBidWZmZXIuCi0gKiBbb3V0XSBwQml0T2Zmc2V0CQkqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQotICoJCQkJCQljdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Ci0gKgkJCQkJCSpwcEJpdFN0cmVhbS4KLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhfUkVTVUxUIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0gCi1PTVhSZXN1bHQgYXJtUGFja1ZMQzMyICgKLSAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwgCi0gICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICBBUk1fVkxDMzIgY29kZSAKLSk7Ci0KLSNlbmRpZiAgICAgIC8qX2FybUNvZGVjX0hfKi8KLQotLypFbmQgb2YgRmlsZSovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU1fSURDVFRhYmxlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU1fSURDVFRhYmxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyMzY4NGUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NX0lEQ1RUYWJsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1DT01NX0lEQ1RUYWJsZS5oCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRmlsZSAgICAgICAgIDogYXJtQ09NTV9JRENUVGFibGUuaAotICogRGVzY3JpcHRpb24gIDogQ29udGFpbnMgZGVjbGFyYXRpb25zIG9mIHRhYmxlcyBmb3IgSURDVCBjYWxjdWxhdGlvbi4KLSAqCi0gKi8KLSAgCi0jaWZuZGVmIF9hcm1DT01NX0lEQ1RUYWJsZV9IXwotI2RlZmluZSBfYXJtQ09NTV9JRENUVGFibGVfSF8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0KLSAgICAgLyogIFRhYmxlIG9mIHModSkqQSh1KSpBKHYpLzE2IGF0IFExNQotICAgICAgKiAgcyh1KT0xLjAgMCA8PSB1IDw9IDUKLSAgICAgICogIHMoNik9Mi4wCi0gICAgICAqICBzKDcpPTQuMAotICAgICAgKiAgQSgwKSA9IDIqc3FydCgyKQotICAgICAgKiAgQSh1KSA9IDQqY29zKHUqcGkvMTYpICBmb3IgKHUhPTApCi0JICAqLwotZXh0ZXJuIGNvbnN0IE9NWF9VMTYgYXJtQ09NTV9JRENUUHJlU2NhbGUgWzY0XTsKLWV4dGVybiBjb25zdCBPTVhfVTE2IGFybUNPTU1fSURDVENvZWYgWzRdOwotCi0jZW5kaWYgLyogX2FybUNPTU1fSURDVFRhYmxlX0hfICovCi0KLQotLyogRW5kIG9mIEZpbGUgKi8KLQotCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NX0lEQ1Rfcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NX0lEQ1Rfcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTdkMjRmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtQ09NTV9JRENUX3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0NTMgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA0IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLwotOy8vIElEQ1Rfcy5zCi07Ly8KLTsvLyBJbnZlcnNlIERDVCBtb2R1bGUKLTsvLwotOy8vIAotOy8vIEFMR09SSVRITSBERVNDUklQVElPTgotOy8vCi07Ly8gVGhlIDh4OCAyRCBJRENUIGlzIHBlcmZvcm1lZCBieSBjYWxjdWxhdGluZyBhIDFEIElEQ1QgZm9yIGVhY2gKLTsvLyBjb2x1bW4gYW5kIHRoZW4gYSAxRCBJRENUIGZvciBlYWNoIHJvdy4KLTsvLwotOy8vIFRoZSA4LXBvaW50IDFEIElEQ1QgaXMgZGVmaW5lZCBieQotOy8vICAgZih4KSA9IChDKDApKlQoMCkqYygwLHgpICsgLi4uICsgQyg3KSpUKDcpKmMoNyx4KSkvMgotOy8vCi07Ly8gICBDKHUpID0gMS9zcXJ0KDIpIGlmIHU9MCBvciAxIGlmIHUhPTAKLTsvLyAgIGModSx4KSA9IGNvcyggKDJ4KzEpKnUqcGkvMTYgKQotOy8vCi07Ly8gV2UgY29tcHV0ZSB0aGUgOC1wb2ludCAxRCBJRENUIHVzaW5nIHRoZSByZXZlcnNlIG9mCi07Ly8gdGhlIEFyYWktQWd1aS1OYWthamltYSBmbG93IGdyYXBoIHdoaWNoIHdlIHNwbGl0IGludG8KLTsvLyA1IHN0YWdlcyBuYW1lZCBpbiByZXZlcnNlIG9yZGVyIHRvIGlkZW50aWZ5IHdpdGggdGhlCi07Ly8gZm9yd2FyZCBEQ1QuIERpcmVjdCBpbnZlcnNpb24gb2YgdGhlIGZvcndhcmQgZm9ybXVsYWUKLTsvLyBpbiBmaWxlIEZEQ1Rfcy5zIGdpdmVzOgotOy8vCi07Ly8gSVN0YWdlIDU6ICAgaih1KSA9IFQodSkqQSh1KSAgWyBBKHUpPTQqQyh1KSpjKHUsMCkgXQotOy8vICAgICAgICAgICAgIFsgQSgwKSA9IDIqc3FydCgyKQotOy8vICAgICAgICAgICAgICAgQSh1KSA9IDQqY29zKHUqcGkvMTYpICBmb3IgKHUhPTApIF0KLTsvLwotOy8vIElTdGFnZSA0OiAgIGkwID0gajAgICAgICAgICAgICAgaTEgPSBqNAotOy8vICAgICAgICAgICAgIGkzID0gKGoyK2o2KS8yICAgICAgaTIgPSAoajItajYpLzIKLTsvLyAgICAgICAgICAgICBpNyA9IChqNStqMykvMiAgICAgIGk0ID0gKGo1LWozKS8yCi07Ly8gICAgICAgICAgICAgaTUgPSAoajErajcpLzIgICAgICBpNiA9IChqMS1qNykvMgotOy8vCi07Ly8gSVN0YWdlIDM6ICAgaDAgPSAoaTAraTEpLzIgICAgICBoMSA9IChpMC1pMSkvMgotOy8vICAgICAgICAgICAgIGgyID0gKGkyKnNxcnQyKS1pMyAgaDMgPSBpMwotOy8vICAgICAgICAgICAgIGg0ID0gIGNvcyhwaS84KSppNCArIHNpbihwaS84KSppNgotOy8vICAgICAgICAgICAgIGg2ID0gLXNpbihwaS84KSppNCArIGNvcyhwaS84KSppNgotOy8vICAgICAgICAgICAgIFsgVGhlIGFib3ZlIHR3byBsaW5lcyByb3RhdGUgYnkgLShwaS84KSBdCi07Ly8gICAgICAgICAgICAgaDUgPSAoaTUtaTcpL3NxcnQyICBoNyA9IChpNStpNykvMiAKLTsvLyAgICAgICAgICAgICAKLTsvLyBJU3RhZ2UgMjogICBnMCA9IChoMCtoMykvMiAgICAgIGczID0gKGgwLWgzKS8yCi07Ly8gICAgICAgICAgICAgZzEgPSAoaDEraDIpLzIgICAgICBnMiA9IChoMS1oMikvMgotOy8vICAgICAgICAgICAgIGc3ID0gaDcgICAgICAgICAgICAgZzYgPSBoNiAtIGg3Ci07Ly8gICAgICAgICAgICAgZzUgPSBoNSAtIGc2ICAgICAgICBnNCA9IGg0IC0gZzUKLTsvLwotOy8vIElTdGFnZSAxOiAgIGYwID0gKGcwK2c3KS8yICAgICAgZjcgPSAoZzAtZzcpLzIKLTsvLyAgICAgICAgICAgICBmMSA9IChnMStnNikvMiAgICAgIGY2ID0gKGcxLWc2KS8yCi07Ly8gICAgICAgICAgICAgZjIgPSAoZzIrZzUpLzIgICAgICBmNSA9IChnMi1nNSkvMgotOy8vICAgICAgICAgICAgIGYzID0gKGczK2c0KS8yICAgICAgZjQgPSAoZzMtZzQpLzIKLTsvLwotOy8vIE5vdGUgdGhhdCBtb3N0IGNvZWZmaWNpZW50cyBhcmUgaGFsdmVkIDMgdGltZXMgZHVyaW5nIHRoZQotOy8vIGFib3ZlIGNhbGN1bGF0aW9uLiBXZSBjYW4gcmVzY2FsZSB0aGUgYWxnb3JpdGhtIGRpdmlkaW5nCi07Ly8gdGhlIGlucHV0IGJ5IDggdG8gcmVtb3ZlIHRoZSBoYWx2aW5ncy4KLTsvLwotOy8vIElTdGFnZSA1OiAgIGoodSkgPSBUKHUpKkEodSkvOAotOy8vCi07Ly8gSVN0YWdlIDQ6ICAgaTAgPSBqMCAgICAgICAgICAgICBpMSA9IGo0Ci07Ly8gICAgICAgICAgICAgaTMgPSBqMiArIGo2ICAgICAgICBpMiA9IGoyIC0gajYKLTsvLyAgICAgICAgICAgICBpNyA9IGo1ICsgajMgICAgICAgIGk0ID0gajUgLSBqMwotOy8vICAgICAgICAgICAgIGk1ID0gajEgKyBqNyAgICAgICAgaTYgPSBqMSAtIGo3Ci07Ly8KLTsvLyBJU3RhZ2UgMzogICBoMCA9IGkwICsgaTEgICAgICAgIGgxID0gaTAgLSBpMQotOy8vICAgICAgICAgICAgIGgyID0gKGkyKnNxcnQyKS1pMyAgaDMgPSBpMwotOy8vICAgICAgICAgICAgIGg0ID0gMiooIGNvcyhwaS84KSppNCArIHNpbihwaS84KSppNikKLTsvLyAgICAgICAgICAgICBoNiA9IDIqKC1zaW4ocGkvOCkqaTQgKyBjb3MocGkvOCkqaTYpCi07Ly8gICAgICAgICAgICAgaDUgPSAoaTUtaTcpKnNxcnQyICBoNyA9IGk1ICsgaTcgCi07Ly8gICAgICAgICAgICAgCi07Ly8gSVN0YWdlIDI6ICAgZzAgPSBoMCArIGgzICAgICAgICBnMyA9IGgwIC0gaDMKLTsvLyAgICAgICAgICAgICBnMSA9IGgxICsgaDIgICAgICAgIGcyID0gaDEgLSBoMgotOy8vICAgICAgICAgICAgIGc3ID0gaDcgICAgICAgICAgICAgZzYgPSBoNiAtIGg3Ci07Ly8gICAgICAgICAgICAgZzUgPSBoNSAtIGc2ICAgICAgICBnNCA9IGg0IC0gZzUKLTsvLwotOy8vIElTdGFnZSAxOiAgIGYwID0gZzAgKyBnNyAgICAgICAgZjcgPSBnMCAtIGc3Ci07Ly8gICAgICAgICAgICAgZjEgPSBnMSArIGc2ICAgICAgICBmNiA9IGcxIC0gZzYKLTsvLyAgICAgICAgICAgICBmMiA9IGcyICsgZzUgICAgICAgIGY1ID0gZzIgLSBnNQotOy8vICAgICAgICAgICAgIGYzID0gZzMgKyBnNCAgICAgICAgZjQgPSBnMyAtIGc0Ci07Ly8KLTsvLyBOb3RlOgotOy8vIDEuIFRoZSBzY2FsaW5nIGJ5IEEodSkvOCBjYW4gb2Z0ZW4gYmUgY29tYmluZWQgd2l0aCBpbnZlcnNlCi07Ly8gICAgcXVhbnRpemF0aW9uLiBUaGUgY29sdW1uIGFuZCByb3cgc2NhbGluZ3MgY2FuIGJlIGNvbWJpbmVkLgotOy8vIDIuIFRoZSBmbG93Z3JhcGggaW4gdGhlIEFBTiBwYXBlciBoYXMgaDQsZzYgbmVnYXRlZCBjb21wYXJlZAotOy8vICAgIHRvIHRoZSBhYm92ZSBjb2RlIGJ1dCBpcyBvdGhlcndpc2UgaWRlbnRpY2FsLgotOy8vIDMuIFRoZSByb3RhdGlvbiBieSAtcGkvOCBjYW4gYmUgcGVmb3JtZWQgdXNpbmcgdGhyZWUgbXVsdGlwbGllcwotOy8vICAgIEVnICBjKmk0K3MqaTYgPSAoaTYtaTQpKnMgKyAoYytzKSppNAotOy8vICAgICAgIC1zKmk0K2MqaTYgPSAoaTYtaTQpKnMgKyAoYy1zKSppNgotOy8vIDQuIElmIHxUKHUpfDw9MSB0aGVuIGZyb20gdGhlIElEQ1QgZGVmaW5pdGlvbiwKLTsvLyAgICB8Zih4KXwgPD0gKCgxL3NxcnQyKSArIHxjKDEseCl8ICsgLi4gKyB8Yyg3LHgpfCkvMgotOy8vICAgICAgICAgICAgPSAoKDEvc3FydDIpICsgY29zKHBpLzE2KSArIC4uLiArIGNvcyg3KnBpLzE2KSkvMgotOy8vICAgICAgICAgICAgPSAoKDEvc3FydDIpICsgKGNvdChwaS8zMiktMSkvMikvMgotOy8vICAgICAgICAgICAgPSAoMSArIGNvcyhwaS8xNikgKyBjb3MoMnBpLzE2KSArIGNvcygzcGkvMTYpKS9zcXJ0KDIpCi07Ly8gICAgICAgICAgICA9IChhcHByb3gpMi42NAotOy8vICAgIFNvIHRoZSBtYXggZ2FpbiBvZiB0aGUgMkQgSURDVCBpcyB+eDcuMCA9IDMgYml0cy4KLTsvLyAgICBUaGUgdGFibGUgYmVsb3cgc2hvd3MgaW5wdXQgcGF0dGVybnMgZ2VuZXJhdGluZyB0aGUgbWF4aW11bQotOy8vICAgIHZhbHVlIG9mIHxmKHUpfCBmb3IgaW5wdXQgaW4gdGhlIHJhbmdlIHxUKHgpfDw9MS4gTT0tMSwgUD0rMQotOy8vICAgIElucHV0UGF0dGVybiAgICAgIE1heCB8Zih4KXwKLTsvLyAgICAgIFBQUFBQUFBQICAgICAgICB8ZjB8ID0gIDIuNjQKLTsvLyAgICAgIFBQUE1NTU1NICAgICAgICB8ZjF8ID0gIDIuNjQKLTsvLyAgICAgIFBQTU1NUFBQICAgICAgICB8ZjJ8ID0gIDIuNjQKLTsvLyAgICAgIFBQTU1QUE1NICAgICAgICB8ZjN8ID0gIDIuNjQKLTsvLyAgICAgIFBNTVBQTU1QICAgICAgICB8ZjR8ID0gIDIuNjQKLTsvLyAgICAgIFBNTVBNTVBNICAgICAgICB8ZjV8ID0gIDIuNjQKLTsvLyAgICAgIFBNUFBNUE1QICAgICAgICB8ZjZ8ID0gIDIuNjQKLTsvLyAgICAgIFBNUE1QTVBNICAgICAgICB8Zjd8ID0gIDIuNjQKLTsvLyAgIE5vdGUgdGhhdCB0aGlzIGlucHV0IHBhdHRlcm4gaXMgdGhlIHRyYW5zcG9zZSBvZiB0aGUKLTsvLyAgIGNvcnJlc3BvbmRpbmcgbWF4IGlucHV0IHBhdHRlciBmb3IgdGhlIEZEQ1QuCi0KLTsvLyBBcmd1bWVudHMKLQotcFNyYyAgICBSTiAwICAgIDsvLyBzb3VyY2UgZGF0YSBidWZmZXIKLVN0cmlkZSAgUk4gMSAgICA7Ly8gZGVzdGluYXRpb24gc3RyaWRlIGluIGJ5dGVzCi1wRGVzdCAgIFJOIDIgICAgOy8vIGRlc3RpbmF0aW9uIGRhdGEgYnVmZmVyCi1wU2NhbGUgIFJOIDMgICAgOy8vIHBvaW50ZXIgdG8gc2NhbGluZyB0YWJsZQotCi0KLSAgICAgICAgOy8vIERDVCBJbnZlcnNlIE1hY3JvCi0gICAgICAgIDsvLyBUaGUgRENUIGNvZGUgc2hvdWxkIGJlIHBhcmFtZXRyaXplZCBhY2NvcmRpbmcKLSAgICAgICAgOy8vIHRvIHRoZSBmb2xsb3dpbmcgaW5wdXRzOgotICAgICAgICA7Ly8gJG91dHNpemUgPSAidTgiICA6ICA4LWJpdCB1bnNpZ25lZCBkYXRhIHNhdHVyYXRlZCAoMCB0byArMjU1KQotICAgICAgICA7Ly8gICAgICAgICAgICAiczkiICA6IDE2LWJpdCBzaWduZWQgZGF0YSBzYXR1cmF0ZWQgdG8gOS1iaXQgKC0yNTYgdG8gKzI1NSkKLSAgICAgICAgOy8vICAgICAgICAgICAgInMxNiIgOiAxNi1iaXQgc2lnbmVkIGRhdGEgbm90IHNhdHVyYXRlZCAobWF4IHNpemUgfisvLTE0MjczKQotICAgICAgICA7Ly8gJGluc2NhbGUgPSAiczE2IiA6IHNpZ25lZCAxNi1iaXQgYWFuLXNjYWxlIHRhYmxlLCBRMTUgZm9ybWF0LCB3aXRoIDQgYnl0ZSBhbGlnbm1lbnQKLSAgICAgICAgOy8vICAgICAgICAgICAgInMzMiIgOiBzaWduZWQgMzItYml0IGFhbi1zY2FsZSB0YWJsZSwgUTIzIGZvcm1hdCwgd2l0aCA0IGJ5dGUgYWxpZ25tZW50Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW5wdXRzOgotICAgICAgICA7Ly8gcFNyYyAgID0gcjAgPSBQb2ludGVyIHRvIGlucHV0IGRhdGEKLSAgICAgICAgOy8vICAgICAgICAgICAgICAgUmFuZ2UgaXMgLTI1NiB0byArMjU1ICg5LWJpdCkKLSAgICAgICAgOy8vIFN0cmlkZSA9IHIxID0gU3RyaWRlIGJldHdlZW4gaW5wdXQgbGluZXMKLSAgICAgICAgOy8vIHBEZXN0ICA9IHIyID0gUG9pbnRlciB0byBvdXRwdXQgZGF0YQotICAgICAgICA7Ly8gcFNjYWxlID0gcjMgPSBQb2ludGVyIHRvIGFhbi1zY2FsZSB0YWJsZSBpbiB0aGUgZm9ybWF0IGRlZmluZWQgYnkgJGluc2NhbGUKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9JRENUICAkb3V0c2l6ZSwgJGluc2NhbGUsICRzdHJpZGUKLSAgICAgICAgTENMQSAgICBTSElGVAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIElGIEFSTTExMzZKUwotICAgICAgICAKLTsvLyBSRUdJU1RFUiBBTExPQ0FUSU9OCi07Ly8gVGhpcyBpcyBoYXJkIHNpbmNlIHdlIGhhdmUgOCB2YWx1ZXMsIDkgZnJlZSByZWdpc3RlcnMgYW5kIGVhY2gKLTsvLyBidXR0ZXJmbHkgcmVxdWlyZXMgYSB0ZW1wb3JhcnkgcmVnaXN0ZXIuIFdlIGFsc28gd2FudCB0byAKLTsvLyBtYWludGFpbiByZWdpc3RlciBvcmRlciBzbyB3ZSBjYW4gdXNlIExETS9TVE0uIFRoZSB0YWJsZSBiZWxvdwotOy8vIHN1bW1hcmlzZXMgdGhlIHJlZ2lzdGVyIGFsbG9jYXRpb24gdGhhdCBtZWV0cyBhbGwgdGhlc2UgY3JpdGVyaWEuCi07Ly8gYT0xc3Rjb2wsIGI9Mm5kY29sLCBmLGcsaCxpIGFyZSBkYXRhZmxvdyBwb2ludHMgZGVzY3JpYmVkIGFib3ZlLgotOy8vCi07Ly8gcjEgIGEwMSAgICAgZzAgIGgwCi07Ly8gcjQgIGIwMSBmMCAgZzEgIGgxICBpMAotOy8vIHI1ICBhMjMgZjEgIGcyICAgICAgaTEKLTsvLyByNiAgYjIzIGYyICBnMyAgaDIgIGkyCi07Ly8gcjcgIGE0NSBmMyAgICAgIGgzICBpMwotOy8vIHI4ICBiNDUgZjQgIGc0ICBoNCAgaTQKLTsvLyByOSAgYTY3IGY1ICBnNSAgaDUgIGk1Ci07Ly8gcjEwIGI2NyBmNiAgZzYgIGg2ICBpNgotOy8vIHIxMSAgICAgZjcgIGc3ICBoNyAgaTcKLTsvLwotcmEwMSAgICBSTiAxCi1yYjAxICAgIFJOIDQKLXJhMjMgICAgUk4gNQotcmIyMyAgICBSTiA2Ci1yYTQ1ICAgIFJOIDcKLXJiNDUgICAgUk4gOAotcmE2NyAgICBSTiA5Ci1yYjY3ICAgIFJOIDEwCi1ydG1wICAgIFJOIDExCi1jc1BpQnk4IFJOIDEyICAgOy8vIFsgKFNpbihwaS84KUBRMTUpLCAoQ29zKHBpLzgpQFExNSkgXQotTG9vcFJSMiBSTiAxNCAgIDsvLyBbIExvb3BOdW1iZXI8PDEzICwgKDEvU3FydCgyKSlAUTE1IF0KLTsvLyBUcmFuc3Bvc2UgYWxsb2NhdGlvbgoteGZ0ICAgICBSTiByYTAxCi14ZjAgICAgIFJOIHJiMDEKLXhmMSAgICAgUk4gcmEyMwoteGYyICAgICBSTiByYjIzCi14ZjMgICAgIFJOIHJhNDUKLXhmNCAgICAgUk4gcmI0NQoteGY1ICAgICBSTiByYTY3Ci14ZjYgICAgIFJOIHJiNjcKLXhmNyAgICAgUk4gcnRtcAotOy8vIElTdGFnZSAxIGFsbG9jYXRpb24KLXhnMCAgICAgUk4geGZ0Ci14ZzEgICAgIFJOIHhmMAoteGcyICAgICBSTiB4ZjEKLXhnMyAgICAgUk4geGYyCi14Z3QgICAgIFJOIHhmMwoteGc0ICAgICBSTiB4ZjQKLXhnNSAgICAgUk4geGY1Ci14ZzYgICAgIFJOIHhmNgoteGc3ICAgICBSTiB4ZjcKLTsvLyBJU3RhZ2UgMiBhbGxvY2F0aW9uCi14aDAgICAgIFJOIHhnMAoteGgxICAgICBSTiB4ZzEKLXhodCAgICAgUk4geGcyCi14aDIgICAgIFJOIHhnMwoteGgzICAgICBSTiB4Z3QKLXhoNCAgICAgUk4geGc0Ci14aDUgICAgIFJOIHhnNQoteGg2ICAgICBSTiB4ZzYKLXhoNyAgICAgUk4geGc3Ci07Ly8gSVN0YWdlIDMsNCBhbGxvY2F0aW9uCi14aXQgICAgIFJOIHhoMAoteGkwICAgICBSTiB4aDEKLXhpMSAgICAgUk4geGh0Ci14aTIgICAgIFJOIHhoMgoteGkzICAgICBSTiB4aDMKLXhpNCAgICAgUk4geGg0Ci14aTUgICAgIFJOIHhoNQoteGk2ICAgICBSTiB4aDYKLXhpNyAgICAgUk4geGg3Ci0gICAgICAgIAotICAgICAgICBNX1NUUiAgIHBEZXN0LCAgcHBEZXN0Ci0gICAgICAgIElGICIkc3RyaWRlIj0icyIKLSAgICAgICAgICAgIE1fU1RSICAgU3RyaWRlLCBwU3RyaWRlCi0gICAgICAgIEVORElGCi0gICAgICAgIE1fQURSICAgcERlc3QsICBwQmxrCi0gICAgICAgIExEUiAgICAgY3NQaUJ5OCwgPTB4MzBmYzc2NDIKLSAgICAgICAgTERSICAgICBMb29wUlIyLCA9MHgwMDAwNWE4MgotICAKLXY2X2lkY3RfY29sJF9GCi0gICAgICAgIDsvLyBMb2FkIGV2ZW4gdmFsdWVzCi0gICAgICAgIExEUiAgICAgeGk0LCBbcFNyY10sICM0ICA7Ly8gajAKLSAgICAgICAgTERSICAgICB4aTUsIFtwU3JjLCAjNCoxNi00XSAgOy8vIGo0Ci0gICAgICAgIExEUiAgICAgeGk2LCBbcFNyYywgIzIqMTYtNF0gIDsvLyBqMgotICAgICAgICBMRFIgICAgIHhpNywgW3BTcmMsICM2KjE2LTRdICA7Ly8gajYKLSAgICAgICAgCi0gICAgICAgIDsvLyBTY2FsZSBFdmVuIFZhbHVlcwotICAgICAgICBJRiAiJGluc2NhbGUiPSJzMTYiIDsvLyAxNngxNiBtdWwKLVNISUZUICAgICAgIFNFVEEgICAgMTIKLSAgICAgICAgICAgIExEUiAgICAgeGkwLCBbcFNjYWxlXSwgIzQKLSAgICAgICAgICAgIExEUiAgICAgeGkxLCBbcFNjYWxlLCAjNCoxNi00XSAgICAgICAgCi0gICAgICAgICAgICBMRFIgICAgIHhpMiwgW3BTY2FsZSwgIzIqMTYtNF0KLSAgICAgICAgICAgIE1PViAgICAgeGl0LCAjMTw8KFNISUZULTEpCi0gICAgICAgICAgICBTTUxBQkIgIHhpMywgeGkwLCB4aTQsIHhpdAotICAgICAgICAgICAgU01MQVRUICB4aTQsIHhpMCwgeGk0LCB4aXQKLSAgICAgICAgICAgIFNNTEFCQiAgeGkwLCB4aTEsIHhpNSwgeGl0Ci0gICAgICAgICAgICBTTUxBVFQgIHhpNSwgeGkxLCB4aTUsIHhpdAotICAgICAgICAgICAgTU9WICAgICB4aTMsIHhpMywgQVNSICNTSElGVAotICAgICAgICAgICAgUEtIQlQgICB4aTQsIHhpMywgeGk0LCBMU0wgIygxNi1TSElGVCkKLSAgICAgICAgICAgIExEUiAgICAgeGkzLCBbcFNjYWxlLCAjNioxNi00XQotICAgICAgICAgICAgU01MQUJCICB4aTEsIHhpMiwgeGk2LCB4aXQKLSAgICAgICAgICAgIFNNTEFUVCAgeGk2LCB4aTIsIHhpNiwgeGl0Ci0gICAgICAgICAgICBNT1YgICAgIHhpMCwgeGkwLCBBU1IgI1NISUZUCi0gICAgICAgICAgICBQS0hCVCAgIHhpNSwgeGkwLCB4aTUsIExTTCAjKDE2LVNISUZUKQotICAgICAgICAgICAgU01MQUJCICB4aTIsIHhpMywgeGk3LCB4aXQKLSAgICAgICAgICAgIFNNTEFUVCAgeGk3LCB4aTMsIHhpNywgeGl0Ci0gICAgICAgICAgICBNT1YgICAgIHhpMSwgeGkxLCBBU1IgI1NISUZUCi0gICAgICAgICAgICBQS0hCVCAgIHhpNiwgeGkxLCB4aTYsIExTTCAjKDE2LVNISUZUKQotICAgICAgICAgICAgTU9WICAgICB4aTIsIHhpMiwgQVNSICNTSElGVAotICAgICAgICAgICAgUEtIQlQgICB4aTcsIHhpMiwgeGk3LCBMU0wgIygxNi1TSElGVCkKLSAgICAgICAgRU5ESUYKLSAgICAgICAgSUYgIiRpbnNjYWxlIj0iczMyIiA7Ly8gMzJ4MTYgbXVsCi1TSElGVCAgICAgICBTRVRBICAgICgxMis4LTE2KQotICAgICAgICAgICAgTU9WICAgICB4aXQsICMxPDwoU0hJRlQtMSkKLSAgICAgICAgICAgIExEUiAgICAgeGkwLCBbcFNjYWxlXSwgIzgKLSAgICAgICAgICAgIExEUiAgICAgeGkxLCBbcFNjYWxlLCAjMCozMis0LThdCi0gICAgICAgICAgICBMRFIgICAgIHhpMiwgW3BTY2FsZSwgIzQqMzItOF0KLSAgICAgICAgICAgIExEUiAgICAgeGkzLCBbcFNjYWxlLCAjNCozMis0LThdICAgICAgICAgICAgCi0gICAgICAgICAgICBTTUxBV0IgIHhpMCwgeGkwLCB4aTQsIHhpdAotICAgICAgICAgICAgU01MQVdUICB4aTEsIHhpMSwgeGk0LCB4aXQKLSAgICAgICAgICAgIFNNTEFXQiAgeGkyLCB4aTIsIHhpNSwgeGl0Ci0gICAgICAgICAgICBTTUxBV1QgIHhpMywgeGkzLCB4aTUsIHhpdCAgICAgICAgICAgIAotICAgICAgICAgICAgTU9WICAgICB4aTAsIHhpMCwgQVNSICNTSElGVAotICAgICAgICAgICAgUEtIQlQgICB4aTQsIHhpMCwgeGkxLCBMU0wgIygxNi1TSElGVCkKLSAgICAgICAgICAgIE1PViAgICAgeGkyLCB4aTIsIEFTUiAjU0hJRlQgICAgICAgICAgICAKLSAgICAgICAgICAgIFBLSEJUICAgeGk1LCB4aTIsIHhpMywgTFNMICMoMTYtU0hJRlQpCi0gICAgICAgICAgICBMRFIgICAgIHhpMCwgW3BTY2FsZSwgIzIqMzItOF0KLSAgICAgICAgICAgIExEUiAgICAgeGkxLCBbcFNjYWxlLCAjMiozMis0LThdCi0gICAgICAgICAgICBMRFIgICAgIHhpMiwgW3BTY2FsZSwgIzYqMzItOF0KLSAgICAgICAgICAgIExEUiAgICAgeGkzLCBbcFNjYWxlLCAjNiozMis0LThdICAgICAgICAgICAgCi0gICAgICAgICAgICBTTUxBV0IgIHhpMCwgeGkwLCB4aTYsIHhpdAotICAgICAgICAgICAgU01MQVdUICB4aTEsIHhpMSwgeGk2LCB4aXQKLSAgICAgICAgICAgIFNNTEFXQiAgeGkyLCB4aTIsIHhpNywgeGl0Ci0gICAgICAgICAgICBTTUxBV1QgIHhpMywgeGkzLCB4aTcsIHhpdCAgICAgICAgICAgIAotICAgICAgICAgICAgTU9WICAgICB4aTAsIHhpMCwgQVNSICNTSElGVAotICAgICAgICAgICAgUEtIQlQgICB4aTYsIHhpMCwgeGkxLCBMU0wgIygxNi1TSElGVCkKLSAgICAgICAgICAgIE1PViAgICAgeGkyLCB4aTIsIEFTUiAjU0hJRlQgICAgICAgICAgICAKLSAgICAgICAgICAgIFBLSEJUICAgeGk3LCB4aTIsIHhpMywgTFNMICMoMTYtU0hJRlQpCi0gICAgICAgIEVORElGCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIDsvLyBMb2FkIG9kZCB2YWx1ZXMKLSAgICAgICAgTERSICAgICB4aTAsIFtwU3JjLCAjMSoxNi00XSAgICAgIDsvLyBqMQotICAgICAgICBMRFIgICAgIHhpMSwgW3BTcmMsICM3KjE2LTRdICAgICAgOy8vIGo3Ci0gICAgICAgIExEUiAgICAgeGkyLCBbcFNyYywgIzUqMTYtNF0gICAgICA7Ly8gajUKLSAgICAgICAgTERSICAgICB4aTMsIFtwU3JjLCAjMyoxNi00XSAgICAgIDsvLyBqMwotICAgICAgICAKLSAgICAgICAgSUYgIHtUUlVFfQotICAgICAgICAgICAgOy8vIHNob3J0Y3V0IGlmIG9kZCB2YWx1ZXMgMAotICAgICAgICAgICAgVEVRICAgICB4aTAsICMwCi0gICAgICAgICAgICBURVFFUSAgIHhpMSwgIzAKLSAgICAgICAgICAgIFRFUUVRICAgeGkyLCAjMAotICAgICAgICAgICAgVEVRRVEgICB4aTMsICMwCi0gICAgICAgICAgICBCRVEgICAgIHY2T2RkWmVybyRfRgotICAgICAgICBFTkRJRgotICAgICAgICAKLSAgICAgICAgOy8vIFN0b3JlIHNjYWxlZCBldmVuIHZhbHVlcwotICAgICAgICBTVE1JQSAgIHBEZXN0LCB7eGk0LCB4aTUsIHhpNiwgeGk3fQotICAgICAgICAKLSAgICAgICAgOy8vIFNjYWxlIG9kZCB2YWx1ZXMKLSAgICAgICAgSUYgIiRpbnNjYWxlIj0iczE2IgotICAgICAgICAgICAgOy8vIFBlcmZvcm0gQUFOIFNjYWxlCi0gICAgICAgICAgICBMRFIgICAgIHhpNCwgW3BTY2FsZSwgIzEqMTYtNF0KLSAgICAgICAgICAgIExEUiAgICAgeGk1LCBbcFNjYWxlLCAjNyoxNi00XSAgICAgICAgCi0gICAgICAgICAgICBMRFIgICAgIHhpNiwgW3BTY2FsZSwgIzUqMTYtNF0KLSAgICAgICAgICAgIFNNTEFCQiAgeGk3LCB4aTAsIHhpNCwgeGl0Ci0gICAgICAgICAgICBTTUxBVFQgIHhpMCwgeGkwLCB4aTQsIHhpdAotICAgICAgICAgICAgU01MQUJCICB4aTQsIHhpMSwgeGk1LCB4aXQKLSAgICAgICAgICAgIFNNTEFUVCAgeGkxLCB4aTEsIHhpNSwgeGl0Ci0gICAgICAgICAgICBNT1YgICAgIHhpNywgeGk3LCBBU1IgI1NISUZUCi0gICAgICAgICAgICBQS0hCVCAgIHhpMCwgeGk3LCB4aTAsIExTTCAjKDE2LVNISUZUKQotICAgICAgICAgICAgTERSICAgICB4aTcsIFtwU2NhbGUsICMzKjE2LTRdCi0gICAgICAgICAgICBTTUxBQkIgIHhpNSwgeGkyLCB4aTYsIHhpdAotICAgICAgICAgICAgU01MQVRUICB4aTIsIHhpMiwgeGk2LCB4aXQKLSAgICAgICAgICAgIE1PViAgICAgeGk0LCB4aTQsIEFTUiAjU0hJRlQKLSAgICAgICAgICAgIFBLSEJUICAgeGkxLCB4aTQsIHhpMSwgTFNMICMoMTYtU0hJRlQpCi0gICAgICAgICAgICBTTUxBQkIgIHhpNiwgeGkzLCB4aTcsIHhpdAotICAgICAgICAgICAgU01MQVRUICB4aTMsIHhpMywgeGk3LCB4aXQKLSAgICAgICAgICAgIE1PViAgICAgeGk1LCB4aTUsIEFTUiAjU0hJRlQKLSAgICAgICAgICAgIFBLSEJUICAgeGkyLCB4aTUsIHhpMiwgTFNMICMoMTYtU0hJRlQpCi0gICAgICAgICAgICBNT1YgICAgIHhpNiwgeGk2LCBBU1IgI1NISUZUCi0gICAgICAgICAgICBQS0hCVCAgIHhpMywgeGk2LCB4aTMsIExTTCAjKDE2LVNISUZUKQotICAgICAgICBFTkRJRgotICAgICAgICBJRiAiJGluc2NhbGUiPSJzMzIiIDsvLyAzMngxNiBtdWwKLSAgICAgICAgICAgIExEUiAgICAgeGk0LCBbcFNjYWxlLCAjMSozMi04XQotICAgICAgICAgICAgTERSICAgICB4aTUsIFtwU2NhbGUsICMxKjMyKzQtOF0KLSAgICAgICAgICAgIExEUiAgICAgeGk2LCBbcFNjYWxlLCAjNyozMi04XQotICAgICAgICAgICAgTERSICAgICB4aTcsIFtwU2NhbGUsICM3KjMyKzQtOF0gICAgICAgICAgICAKLSAgICAgICAgICAgIFNNTEFXQiAgeGk0LCB4aTQsIHhpMCwgeGl0Ci0gICAgICAgICAgICBTTUxBV1QgIHhpNSwgeGk1LCB4aTAsIHhpdAotICAgICAgICAgICAgU01MQVdCICB4aTYsIHhpNiwgeGkxLCB4aXQKLSAgICAgICAgICAgIFNNTEFXVCAgeGk3LCB4aTcsIHhpMSwgeGl0ICAgICAgICAgICAgCi0gICAgICAgICAgICBNT1YgICAgIHhpNCwgeGk0LCBBU1IgI1NISUZUCi0gICAgICAgICAgICBQS0hCVCAgIHhpMCwgeGk0LCB4aTUsIExTTCAjKDE2LVNISUZUKQotICAgICAgICAgICAgTU9WICAgICB4aTYsIHhpNiwgQVNSICNTSElGVCAgICAgICAgICAgIAotICAgICAgICAgICAgUEtIQlQgICB4aTEsIHhpNiwgeGk3LCBMU0wgIygxNi1TSElGVCkKLSAgICAgICAgICAgIExEUiAgICAgeGk0LCBbcFNjYWxlLCAjNSozMi04XQotICAgICAgICAgICAgTERSICAgICB4aTUsIFtwU2NhbGUsICM1KjMyKzQtOF0KLSAgICAgICAgICAgIExEUiAgICAgeGk2LCBbcFNjYWxlLCAjMyozMi04XQotICAgICAgICAgICAgTERSICAgICB4aTcsIFtwU2NhbGUsICMzKjMyKzQtOF0gICAgICAgICAgICAKLSAgICAgICAgICAgIFNNTEFXQiAgeGk0LCB4aTQsIHhpMiwgeGl0Ci0gICAgICAgICAgICBTTUxBV1QgIHhpNSwgeGk1LCB4aTIsIHhpdAotICAgICAgICAgICAgU01MQVdCICB4aTYsIHhpNiwgeGkzLCB4aXQKLSAgICAgICAgICAgIFNNTEFXVCAgeGk3LCB4aTcsIHhpMywgeGl0ICAgICAgICAgICAgCi0gICAgICAgICAgICBNT1YgICAgIHhpNCwgeGk0LCBBU1IgI1NISUZUCi0gICAgICAgICAgICBQS0hCVCAgIHhpMiwgeGk0LCB4aTUsIExTTCAjKDE2LVNISUZUKQotICAgICAgICAgICAgTU9WICAgICB4aTYsIHhpNiwgQVNSICNTSElGVCAgICAgICAgICAgIAotICAgICAgICAgICAgUEtIQlQgICB4aTMsIHhpNiwgeGk3LCBMU0wgIygxNi1TSElGVCkKLSAgICAgICAgRU5ESUYKLSAgICAgICAgCi0gICAgICAgIFNIQUREMTYgeGk1LCB4aTAsIHhpMSAgICAgICAgICAgOy8vIChqMStqNykvMgotICAgICAgICBTU1VCMTYgIHhpNiwgeGkwLCB4aTEgICAgICAgICAgIDsvLyBqMS1qNwotICAgICAgICBTSEFERDE2IHhpNywgeGkyLCB4aTMgICAgICAgICAgIDsvLyAoajUrajMpLzIKLSAgICAgICAgU1NVQjE2ICB4aTQsIHhpMiwgeGkzICAgICAgICAgICA7Ly8gajUtajMKLSAgICAgICAgCi0gICAgICAgIFNTVUIxNiAgeGkzLCB4aTUsIHhpNyAgICAgICAgICAgOy8vIChpNS1pNykvMgotICAgICAgICAKLSAgICAgICAgUEtIQlQgICB4aTAsIHhpNiwgeGk0LCBMU0wjMTYgICA7Ly8gW2k0LGk2XSByb3cgYQotICAgICAgICBQS0hUQiAgIHhpMSwgeGk0LCB4aTYsIEFTUiMxNiAgIDsvLyBbaTQsaTZdIHJvdyBiCi0gICAgICAgIAotICAgICAgICBTTVVBRFggIHhpMiwgeGkwLCBjc1BpQnk4ICAgICAgIDsvLyByb3dhIGJ5IFtjLHNdCi0gICAgICAgIFNNVUFEWCAgeGk0LCB4aTEsIGNzUGlCeTggICAgICAgOy8vIHJvd2IgYnkgW2Msc10KLSAgICAgICAgU01VU0QgICB4aTAsIHhpMCwgY3NQaUJ5OCAgICAgICA7Ly8gcm93YSBieSBbLXMsY10gICAKLSAgICAgICAgU01VU0QgICB4aTYsIHhpMSwgY3NQaUJ5OCAgICAgICA7Ly8gcm93YiBieSBbLXMsY10KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgU01VTEJCICB4aTEsIHhpMywgTG9vcFJSMgotICAgICAgICBTTVVMVEIgIHhpMywgeGkzLCBMb29wUlIyCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIFBLSFRCICAgeGg0LCB4aTQsIHhpMiwgQVNSIzE2ICAgOy8vIGg0LzQKLSAgICAgICAgUEtIVEIgICB4aDYsIHhpNiwgeGkwLCBBU1IjMTYgICA7Ly8gaDYvNAotICAgICAgICBTSEFERDE2IHhoNywgeGk1LCB4aTcgICAgICAgICAgIDsvLyAoaTUraTcpLzQKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgOy8vIHhpMCx4aTEseGkyLHhpMyBub3cgZnJlZQotICAgICAgICA7Ly8gSVN0YWdlIDQsMywgcm93cyAydG8zIHgxLzIKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgeGkzLCB4aTMsIExTTCAjMQotICAgICAgICBQS0hUQiAgIHhoNSwgeGkzLCB4aTEsIEFTUiMxNSAgIDsvLyBoNS80Ci0gICAgICAgIExEUkQgICAgeGkwLCBbcERlc3QsICM4XSAgICAgICAgOy8vIGoyLGo2IHNjYWxlZAotICAgICAgICAgICAgICAgIAotICAgICAgICA7Ly8gSVN0YWdlIDIsIHJvd3M0dG83Ci0gICAgICAgIFNTVUIxNiAgeGc2LCB4aDYsIHhoNwotICAgICAgICBTU1VCMTYgIHhnNSwgeGg1LCB4ZzYgICAgICAgIAotICAgICAgICBTU1VCMTYgIHhnNCwgeGg0LCB4ZzUKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgU1NVQjE2ICB4aTIsIHhpMCwgeGkxICAgICAgICAgICA7Ly8gKGoyLWo2KQotICAgICAgICBTSEFERDE2IHhpMywgeGkwLCB4aTEgICAgICAgICAgIDsvLyAoajIrajYpLzIKLSAgICAgICAgCi0gICAgICAgIFNNVUxCQiAgeGkwLCB4aTIsIExvb3BSUjIKLSAgICAgICAgU01VTFRCICB4aTIsIHhpMiwgTG9vcFJSMgotICAgICAgICAKLSAgICAgICAgTU9WICAgICB4aTIsIHhpMiwgTFNMICMxCi0gICAgICAgIFBLSFRCICAgeGgyLCB4aTIsIHhpMCwgQVNSIzE1ICAgOy8vIGkyKnNxcnQoMikvNAotICAgICAgICAKLSAgICAgICAgOy8vIHhpMCwgeGkxIG5vdyBmcmVlCi0gICAgICAgIDsvLyBJU3RhZ2UgNCwzIHJvd3MgMHRvMSB4IDEvMgotICAgICAgICBMRFJEICAgIHhpMCwgW3BEZXN0XSAgICAgICAgICAgIDsvLyBqMCwgajQgc2NhbGVkCi0gICAgICAgIFNTVUIxNiAgeGgyLCB4aDIsIHhpMwotICAgICAgICBBRERTICAgIExvb3BSUjIsIExvb3BSUjIsICMyPDwyOSAgICA7Ly8gZG9uZSB0d28gcm93cwotICAgICAgICAKLSAgICAgICAgU0hBREQxNiB4aDAsIHhpMCwgeGkxCi0gICAgICAgIFNIU1VCMTYgeGgxLCB4aTAsIHhpMSAgICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBJU3RhZ2UgMiByb3dzIDB0bzMgeCAxLzIKLSAgICAgICAgU0hTVUIxNiB4ZzIsIHhoMSwgeGgyCi0gICAgICAgIFNIQUREMTYgeGcxLCB4aDEsIHhoMgotICAgICAgICBTSFNVQjE2IHhnMywgeGgwLCB4aDMKLSAgICAgICAgU0hBREQxNiB4ZzAsIHhoMCwgeGgzCi0gICAgICAgIAotICAgICAgICA7Ly8gSVN0YWdlIDEgYWxsIHJvd3MKLSAgICAgICAgU0FERDE2ICB4ZjMsIHhnMywgeGc0Ci0gICAgICAgIFNTVUIxNiAgeGY0LCB4ZzMsIHhnNAotICAgICAgICBTQUREMTYgIHhmMiwgeGcyLCB4ZzUKLSAgICAgICAgU1NVQjE2ICB4ZjUsIHhnMiwgeGc1Ci0gICAgICAgIFNBREQxNiAgeGYxLCB4ZzEsIHhnNgotICAgICAgICBTU1VCMTYgIHhmNiwgeGcxLCB4ZzYKLSAgICAgICAgU0FERDE2ICB4ZjAsIHhnMCwgeGc3Ci0gICAgICAgIFNTVUIxNiAgeGY3LCB4ZzAsIHhnNwotICAgICAgICAKLSAgICAgICAgOy8vIFRyYW5zcG9zZSwgc3RvcmUgYW5kIGxvb3AKLSAgICAgICAgUEtIQlQgICByYTAxLCB4ZjAsIHhmMSwgTFNMICMxNgotICAgICAgICBQS0hUQiAgIHJiMDEsIHhmMSwgeGYwLCBBU1IgIzE2Ci0gICAgICAgIAotICAgICAgICBQS0hCVCAgIHJhMjMsIHhmMiwgeGYzLCBMU0wgIzE2Ci0gICAgICAgIFBLSFRCICAgcmIyMywgeGYzLCB4ZjIsIEFTUiAjMTYKLSAgICAgICAgCi0gICAgICAgIFBLSEJUICAgcmE0NSwgeGY0LCB4ZjUsIExTTCAjMTYKLSAgICAgICAgUEtIVEIgICByYjQ1LCB4ZjUsIHhmNCwgQVNSICMxNgotICAgICAgICAKLSAgICAgICAgUEtIQlQgICByYTY3LCB4ZjYsIHhmNywgTFNMICMxNgotICAgICAgICBTVE1JQSAgIHBEZXN0ISwge3JhMDEsIHJhMjMsIHJhNDUsIHJhNjd9ICAgICAgCi0gICAgICAgIFBLSFRCICAgcmI2NywgeGY3LCB4ZjYsIEFTUiAjMTYKLSAgICAgICAgU1RNSUEgICBwRGVzdCEsIHtyYjAxLCByYjIzLCByYjQ1LCByYjY3fSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBCQ0MgICAgIHY2X2lkY3RfY29sJF9GCi0gICAgICAgIAotICAgICAgICBTVUIgICAgIHBTcmMsIHBEZXN0LCAjKDY0KjIpCi0gICAgICAgIE1fTERSICAgcERlc3QsIHBwRGVzdAotICAgICAgICBJRiAiJHN0cmlkZSI9InMiCi0gICAgICAgICAgICBNX0xEUiAgIHBTY2FsZSwgcFN0cmlkZSAKLSAgICAgICAgRU5ESUYKLSAgICAgICAgQiAgICAgICB2Nl9pZGN0X3JvdyRfRgotICAgICAgICAKLXY2T2RkWmVybyRfRgotICAgICAgICBTU1VCMTYgIHhpMiwgeGk2LCB4aTcgICAgICAgICAgIDsvLyAoajItajYpCi0gICAgICAgIFNIQUREMTYgeGkzLCB4aTYsIHhpNyAgICAgICAgICAgOy8vIChqMitqNikvMgotICAgICAgICAKLSAgICAgICAgU01VTEJCICB4aTAsIHhpMiwgTG9vcFJSMgotICAgICAgICBTTVVMVEIgIHhpMiwgeGkyLCBMb29wUlIyCi0gICAgICAgIAotICAgICAgICBNT1YgICAgIHhpMiwgeGkyLCBMU0wgIzEKLSAgICAgICAgUEtIVEIgICB4aDIsIHhpMiwgeGkwLCBBU1IjMTUgICA7Ly8gaTIqc3FydCgyKS80Ci0gICAgICAgIFNTVUIxNiAgeGgyLCB4aDIsIHhpMwotICAgICAgICAKLSAgICAgICAgOy8vIHhpMCwgeGkxIG5vdyBmcmVlCi0gICAgICAgIDsvLyBJU3RhZ2UgNCwzIHJvd3MgMHRvMSB4IDEvMgotICAgICAgICAKLSAgICAgICAgU0hBREQxNiB4aDAsIHhpNCwgeGk1Ci0gICAgICAgIFNIU1VCMTYgeGgxLCB4aTQsIHhpNSAgICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBJU3RhZ2UgMiByb3dzIDB0bzMgeCAxLzIKLSAgICAgICAgU0hTVUIxNiB4ZzIsIHhoMSwgeGgyCi0gICAgICAgIFNIQUREMTYgeGcxLCB4aDEsIHhoMgotICAgICAgICBTSFNVQjE2IHhnMywgeGgwLCB4aDMKLSAgICAgICAgU0hBREQxNiB4ZzAsIHhoMCwgeGgzCi0gICAgICAgICAgICAgICAKLSAgICAgICAgOy8vIElTdGFnZSAxIGFsbCByb3dzCi0gICAgICAgIE1PViAgeGYzLCB4ZzMKLSAgICAgICAgTU9WICB4ZjQsIHhnMwotICAgICAgICBNT1YgIHhmMiwgeGcyCi0gICAgICAgIE1PViAgeGY1LCB4ZzIKLSAgICAgICAgTU9WICB4ZjEsIHhnMQotICAgICAgICBNT1YgIHhmNiwgeGcxCi0gICAgICAgIE1PViAgeGYwLCB4ZzAKLSAgICAgICAgTU9WICB4ZjcsIHhnMAotICAgICAgICAKLSAgICAgICAgOy8vIFRyYW5zcG9zZQotICAgICAgICBQS0hCVCAgIHJhMDEsIHhmMCwgeGYxLCBMU0wgIzE2Ci0gICAgICAgIFBLSFRCICAgcmIwMSwgeGYxLCB4ZjAsIEFTUiAjMTYKLSAgICAgICAgCi0gICAgICAgIFBLSEJUICAgcmEyMywgeGYyLCB4ZjMsIExTTCAjMTYKLSAgICAgICAgUEtIVEIgICByYjIzLCB4ZjMsIHhmMiwgQVNSICMxNgotICAgICAgICAKLSAgICAgICAgUEtIQlQgICByYTQ1LCB4ZjQsIHhmNSwgTFNMICMxNgotICAgICAgICBQS0hUQiAgIHJiNDUsIHhmNSwgeGY0LCBBU1IgIzE2Ci0gICAgICAgIAotICAgICAgICBQS0hCVCAgIHJhNjcsIHhmNiwgeGY3LCBMU0wgIzE2Ci0gICAgICAgIFBLSFRCICAgcmI2NywgeGY3LCB4ZjYsIEFTUiAjMTYKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgU1RNSUEgICBwRGVzdCEsIHtyYTAxLCByYTIzLCByYTQ1LCByYTY3fSAgICAgIAotICAgICAgICBBRERTICAgIExvb3BSUjIsIExvb3BSUjIsICMyPDwyOSAgICA7Ly8gZG9uZSB0d28gcm93cwotICAgICAgICBTVE1JQSAgIHBEZXN0ISwge3JiMDEsIHJiMjMsIHJiNDUsIHJiNjd9ICAgICAgCi0gICAgICAgIAotICAgICAgICBCQ0MgICAgIHY2X2lkY3RfY29sJF9GCi0gICAgICAgIFNVQiAgICAgcFNyYywgcERlc3QsICMoNjQqMikKLSAgICAgICAgTV9MRFIgICBwRGVzdCwgcHBEZXN0Ci0gICAgICAgIElGICIkc3RyaWRlIj0icyIKLSAgICAgICAgICAgIE1fTERSICAgcFNjYWxlLCBwU3RyaWRlIAotICAgICAgICBFTkRJRgotICAgICAgICAgICAgICAgCi0gICAgICAgIAotdjZfaWRjdF9yb3ckX0YKLSAgICAgICAgOy8vIElTdGFnZSA0LDMsIHJvd3M0dG83IHgxLzQKLSAgICAgICAgTERSICAgICB4aXQsID0weDAwMDEwMDAxICAgICAgICA7Ly8gcm91bmRpbmcgY29uc3RhbnQKLSAgICAgICAgTERSICAgICB4aTAsIFtwU3JjLCAjMSoxNl0gICAgICA7Ly8gajEKLSAgICAgICAgTERSICAgICB4aTEsIFtwU3JjLCAjNyoxNl0gICAgICA7Ly8gNCpqNwotICAgICAgICBMRFIgICAgIHhpMiwgW3BTcmMsICM1KjE2XSAgICAgIDsvLyBqNQotICAgICAgICBMRFIgICAgIHhpMywgW3BTcmMsICMzKjE2XSAgICAgIDsvLyBqMwotICAgICAgICAKLSAgICAgICAgU0hBREQxNiB4aTEsIHhpMSwgeGl0ICAgICAgICAgICA7Ly8gMipqNwotICAgICAgICBTSEFERDE2IHhpMSwgeGkxLCB4aXQgICAgICAgICAgIDsvLyBqNyAgICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFNIQUREMTYgeGk1LCB4aTAsIHhpMSAgICAgICAgICAgOy8vIChqMStqNykvMgotICAgICAgICBTU1VCMTYgIHhpNiwgeGkwLCB4aTEgICAgICAgICAgIDsvLyBqMS1qNwotICAgICAgICBTSEFERDE2IHhpNywgeGkyLCB4aTMgICAgICAgICAgIDsvLyAoajUrajMpLzIKLSAgICAgICAgU1NVQjE2ICB4aTQsIHhpMiwgeGkzICAgICAgICAgICA7Ly8gajUtajMKLSAgICAgICAgCi0gICAgICAgIFNTVUIxNiAgeGkzLCB4aTUsIHhpNyAgICAgICAgICAgOy8vIChpNS1pNykvMgotICAgICAgICAKLSAgICAgICAgUEtIQlQgICB4aTAsIHhpNiwgeGk0LCBMU0wjMTYgICA7Ly8gW2k0LGk2XSByb3cgYQotICAgICAgICBQS0hUQiAgIHhpMSwgeGk0LCB4aTYsIEFTUiMxNiAgIDsvLyBbaTQsaTZdIHJvdyBiCi0gICAgICAgIAotICAgICAgICBTTVVBRFggIHhpMiwgeGkwLCBjc1BpQnk4ICAgICAgIDsvLyByb3dhIGJ5IFtjLHNdCi0gICAgICAgIFNNVUFEWCAgeGk0LCB4aTEsIGNzUGlCeTggICAgICAgOy8vIHJvd2IgYnkgW2Msc10KLSAgICAgICAgU01VU0QgICB4aTAsIHhpMCwgY3NQaUJ5OCAgICAgICA7Ly8gcm93YSBieSBbLXMsY10gICAKLSAgICAgICAgU01VU0QgICB4aTYsIHhpMSwgY3NQaUJ5OCAgICAgICA7Ly8gcm93YiBieSBbLXMsY10KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgU01VTEJCICB4aTEsIHhpMywgTG9vcFJSMgotICAgICAgICBTTVVMVEIgIHhpMywgeGkzLCBMb29wUlIyCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIFBLSFRCICAgeGg0LCB4aTQsIHhpMiwgQVNSIzE2ICAgOy8vIGg0LzQKLSAgICAgICAgUEtIVEIgICB4aDYsIHhpNiwgeGkwLCBBU1IjMTYgICA7Ly8gaDYvNAotICAgICAgICBTSEFERDE2IHhoNywgeGk1LCB4aTcgICAgICAgICAgIDsvLyAoaTUraTcpLzQKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgeGkzLCB4aTMsIExTTCAjMQotICAgICAgICBQS0hUQiAgIHhoNSwgeGkzLCB4aTEsIEFTUiMxNSAgIDsvLyBoNS80Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgOy8vIHhpMCx4aTEseGkyLHhpMyBub3cgZnJlZQotICAgICAgICA7Ly8gSVN0YWdlIDQsMywgcm93cyAydG8zIHgxLzIKLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgeGkwLCBbcFNyYywgIzIqMTZdICAgICAgOy8vIGoyCi0gICAgICAgIExEUiAgICAgeGkxLCBbcFNyYywgIzYqMTZdICAgICAgOy8vIDIqajYKLSAgICAgICAgCi0gICAgICAgIDsvLyBJU3RhZ2UgMiwgcm93czR0bzcKLSAgICAgICAgU1NVQjE2ICB4ZzYsIHhoNiwgeGg3Ci0gICAgICAgIFNTVUIxNiAgeGc1LCB4aDUsIHhnNgotICAgICAgICBTU1VCMTYgIHhnNCwgeGg0LCB4ZzUKLSAgICAgICAgCi0gICAgICAgIFNIQUREMTYgeGkxLCB4aTEsIHhpdCAgICAgICAgICAgOy8vIGo2Ci0gICAgICAgIFNTVUIxNiAgeGkyLCB4aTAsIHhpMSAgICAgICAgICAgOy8vIChqMi1qNikgICAgICAgIAotICAgICAgICBTSEFERDE2IHhpMywgeGkwLCB4aTEgICAgICAgICAgIDsvLyAoajIrajYpLzIKLSAgICAgICAgCi0gICAgICAgIFNNVUxCQiAgeGkwLCB4aTIsIExvb3BSUjIKLSAgICAgICAgU01VTFRCICB4aTIsIHhpMiwgTG9vcFJSMgotICAgICAgICAKLSAgICAgICAgTU9WICAgICB4aTIsIHhpMiwgTFNMICMxCi0gICAgICAgIAotICAgICAgICBQS0hUQiAgIHhoMiwgeGkyLCB4aTAsIEFTUiMxNSAgIDsvLyBpMipzcXJ0KDIpLzQKLSAgICAgICAgCi0gICAgICAgIDsvLyB4aTAsIHhpMSBub3cgZnJlZQotICAgICAgICA7Ly8gSVN0YWdlIDQsMyByb3dzIDB0bzEgeCAxLzIKLSAgICAgICAgTERSICAgICB4aTEsIFtwU3JjLCAjNCoxNl0gICAgICA7Ly8gajQKLSAgICAgICAgTERSICAgICB4aTAsIFtwU3JjXSwgIzQgICAgICAgICA7Ly8gajAKLQotICAgICAgICBTU1VCMTYgIHhoMiwgeGgyLCB4aTMKLSAgICAgICAgQUREUyAgICBMb29wUlIyLCBMb29wUlIyLCAjMjw8MjkgICAgOy8vIGRvbmUgdHdvIHJvd3MKLSAgICAgICAgCi0gICAgICAgIEFERCAgICAgeGkwLCB4aTAsIHhpdCwgTFNMICMyICAgOy8vIGVuc3VyZSBjb3JyZWN0IHJvdW5kCi0gICAgICAgIFNIQUREMTYgeGgwLCB4aTAsIHhpMSAgICAgICAgICAgOy8vIG9mIERDIHJlc3VsdAotICAgICAgICBTSFNVQjE2IHhoMSwgeGkwLCB4aTEKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgOy8vIElTdGFnZSAyIHJvd3MgMHRvMyB4IDEvMgotICAgICAgICBTSFNVQjE2IHhnMiwgeGgxLCB4aDIKLSAgICAgICAgU0hBREQxNiB4ZzEsIHhoMSwgeGgyCi0gICAgICAgIFNIU1VCMTYgeGczLCB4aDAsIHhoMwotICAgICAgICBTSEFERDE2IHhnMCwgeGgwLCB4aDMKLSAgICAgICAgCi0gICAgICAgIDsvLyBJU3RhZ2UgMSBhbGwgcm93cwotICAgICAgICBTSEFERDE2IHhmMywgeGczLCB4ZzQKLSAgICAgICAgU0hTVUIxNiB4ZjQsIHhnMywgeGc0Ci0gICAgICAgIFNIQUREMTYgeGYyLCB4ZzIsIHhnNQotICAgICAgICBTSFNVQjE2IHhmNSwgeGcyLCB4ZzUKLSAgICAgICAgU0hBREQxNiB4ZjEsIHhnMSwgeGc2Ci0gICAgICAgIFNIU1VCMTYgeGY2LCB4ZzEsIHhnNgotICAgICAgICBTSEFERDE2IHhmMCwgeGcwLCB4ZzcKLSAgICAgICAgU0hTVUIxNiB4ZjcsIHhnMCwgeGc3Ci0gICAgICAgIAotICAgICAgICA7Ly8gU2F0dXJhdGUKLSAgICAgICAgSUYgKCIkb3V0c2l6ZSI9InU4IikKLSAgICAgICAgICAgIFVTQVQxNiAgeGYwLCAjOCwgeGYwCi0gICAgICAgICAgICBVU0FUMTYgIHhmMSwgIzgsIHhmMQotICAgICAgICAgICAgVVNBVDE2ICB4ZjIsICM4LCB4ZjIKLSAgICAgICAgICAgIFVTQVQxNiAgeGYzLCAjOCwgeGYzCi0gICAgICAgICAgICBVU0FUMTYgIHhmNCwgIzgsIHhmNAotICAgICAgICAgICAgVVNBVDE2ICB4ZjUsICM4LCB4ZjUKLSAgICAgICAgICAgIFVTQVQxNiAgeGY2LCAjOCwgeGY2Ci0gICAgICAgICAgICBVU0FUMTYgIHhmNywgIzgsIHhmNyAgICAgICAgCi0gICAgICAgIEVORElGCi0gICAgICAgIElGICgiJG91dHNpemUiPSJzOSIpCi0gICAgICAgICAgICBTU0FUMTYgIHhmMCwgIzksIHhmMAotICAgICAgICAgICAgU1NBVDE2ICB4ZjEsICM5LCB4ZjEKLSAgICAgICAgICAgIFNTQVQxNiAgeGYyLCAjOSwgeGYyCi0gICAgICAgICAgICBTU0FUMTYgIHhmMywgIzksIHhmMwotICAgICAgICAgICAgU1NBVDE2ICB4ZjQsICM5LCB4ZjQKLSAgICAgICAgICAgIFNTQVQxNiAgeGY1LCAjOSwgeGY1Ci0gICAgICAgICAgICBTU0FUMTYgIHhmNiwgIzksIHhmNgotICAgICAgICAgICAgU1NBVDE2ICB4ZjcsICM5LCB4ZjcgICAgICAgIAotICAgICAgICBFTkRJRgotICAgICAgICAKLSAgICAgICAgOy8vIFRyYW5zcG9zZSB0byBSb3csIFBhY2sgYW5kIHN0b3JlCi0gICAgICAgIElGICgiJG91dHNpemUiPSJ1OCIpCi0gICAgICAgICAgICBPUlIgICAgIHhmMCwgeGYwLCB4ZjEsIExTTCAjOCA7Ly8gWyBiMSBiMCBhMSBhMCBdCi0gICAgICAgICAgICBPUlIgICAgIHhmMiwgeGYyLCB4ZjMsIExTTCAjOCA7Ly8gWyBiMyBiMiBhMyBhMiBdCi0gICAgICAgICAgICBPUlIgICAgIHhmNCwgeGY0LCB4ZjUsIExTTCAjOCA7Ly8gWyBiNSBiNCBhNSBhNCBdCi0gICAgICAgICAgICBPUlIgICAgIHhmNiwgeGY2LCB4ZjcsIExTTCAjOCA7Ly8gWyBiNyBiNiBhNyBhNiBdCi0gICAgICAgICAgICBQS0hCVCAgIHJhMDEsIHhmMCwgeGYyLCBMU0wgIzE2Ci0gICAgICAgICAgICBQS0hUQiAgIHJiMDEsIHhmMiwgeGYwLCBBU1IgIzE2Ci0gICAgICAgICAgICBQS0hCVCAgIHJhMjMsIHhmNCwgeGY2LCBMU0wgIzE2Ci0gICAgICAgICAgICBQS0hUQiAgIHJiMjMsIHhmNiwgeGY0LCBBU1IgIzE2Ci0gICAgICAgICAgICBTVE1JQSAgIHBEZXN0LCB7cmEwMSwgcmEyM30KLSAgICAgICAgICAgIElGICIkc3RyaWRlIj0icyIKLSAgICAgICAgICAgICAgICBBREQgICAgIHBEZXN0LCBwRGVzdCwgcFNjYWxlCi0gICAgICAgICAgICAgICAgU1RNSUEgICBwRGVzdCwge3JiMDEsIHJiMjN9Ci0gICAgICAgICAgICAgICAgQUREICAgICBwRGVzdCwgcERlc3QsIHBTY2FsZQotICAgICAgICAgICAgRUxTRSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBBREQgICAgIHBEZXN0LCBwRGVzdCwgIygkc3RyaWRlKQotICAgICAgICAgICAgICAgIFNUTUlBICAgcERlc3QsIHtyYjAxLCByYjIzfQotICAgICAgICAgICAgICAgIEFERCAgICAgcERlc3QsIHBEZXN0LCAjKCRzdHJpZGUpCi0gICAgICAgICAgICBFTkRJRgotICAgICAgICBFTkRJRgotICAgICAgICBJRiAoIiRvdXRzaXplIj0iczkiKTpMT1I6KCIkb3V0c2l6ZSI9InMxNiIpICAgICAgICAKLSAgICAgICAgICAgIFBLSEJUICAgcmEwMSwgeGYwLCB4ZjEsIExTTCAjMTYKLSAgICAgICAgICAgIFBLSFRCICAgcmIwMSwgeGYxLCB4ZjAsIEFTUiAjMTYKLSAgICAgICAgCi0gICAgICAgICAgICBQS0hCVCAgIHJhMjMsIHhmMiwgeGYzLCBMU0wgIzE2Ci0gICAgICAgICAgICBQS0hUQiAgIHJiMjMsIHhmMywgeGYyLCBBU1IgIzE2Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFBLSEJUICAgcmE0NSwgeGY0LCB4ZjUsIExTTCAjMTYKLSAgICAgICAgICAgIFBLSFRCICAgcmI0NSwgeGY1LCB4ZjQsIEFTUiAjMTYKLSAgICAgICAgICAgIAotICAgICAgICAgICAgUEtIQlQgICByYTY3LCB4ZjYsIHhmNywgTFNMICMxNgotICAgICAgICAgICAgUEtIVEIgICByYjY3LCB4ZjcsIHhmNiwgQVNSICMxNgotICAgICAgICAgICAgCi0gICAgICAgICAgICBTVE1JQSAgIHBEZXN0LCB7cmEwMSwgcmEyMywgcmE0NSwgcmE2N30gICAgICAKLSAgICAgICAgICAgIElGICIkc3RyaWRlIj0icyIKLSAgICAgICAgICAgICAgICBBREQgICAgIHBEZXN0LCBwRGVzdCwgcFNjYWxlCi0gICAgICAgICAgICAgICAgU1RNSUEgICBwRGVzdCwge3JiMDEsIHJiMjMsIHJiNDUsIHJiNjd9ICAgICAgCi0gICAgICAgICAgICAgICAgQUREICAgICBwRGVzdCwgcERlc3QsIHBTY2FsZQotICAgICAgICAgICAgRUxTRSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBBREQgICAgIHBEZXN0LCBwRGVzdCwgIygkc3RyaWRlKQotICAgICAgICAgICAgICAgIFNUTUlBICAgcERlc3QsIHtyYjAxLCByYjIzLCByYjQ1LCByYjY3fSAgICAgIAotICAgICAgICAgICAgICAgIEFERCAgICAgcERlc3QsIHBEZXN0LCAjKCRzdHJpZGUpCi0gICAgICAgICAgICBFTkRJRgotICAgICAgICBFTkRJRgotICAgICAgICAKLSAgICAgICAgQkNDICAgICB2Nl9pZGN0X3JvdyRfRgotICAgICAgICBFTkRJRiA7Ly8gQVJNMTEzNkpTCi0KLQotICAgICAgICBJRiBDb3J0ZXhBOAotICAgICAgICAKLVNyYzAgICAgICAgICAgICBFUVUgIDcgICAgICAgICAgICAgIAotU3JjMSAgICAgICAgICAgIEVRVSAgOCAgICAgICAgICAgICAgCi1TcmMyICAgICAgICAgICAgRVFVICA5ICAgICAgICAgICAgICAKLVNyYzMgICAgICAgICAgICBFUVUgIDEwICAgICAgICAgICAgICAKLVNyYzQgICAgICAgICAgICBFUVUgIDExICAgICAgICAgICAgICAKLVNyYzUgICAgICAgICAgICBFUVUgIDEyICAgICAgICAgICAgICAKLVNyYzYgICAgICAgICAgICBFUVUgIDEzCi1TcmM3ICAgICAgICAgICAgRVFVICAxNAotVG1wICAgICAgICAgICAgIEVRVSAgMTUKLQotcVhqMCAgICAgICAgICAgIFFOIFNyYzAuUzE2IAotcVhqMSAgICAgICAgICAgIFFOIFNyYzEuUzE2Ci1xWGoyICAgICAgICAgICAgUU4gU3JjMi5TMTYKLXFYajMgICAgICAgICAgICBRTiBTcmMzLlMxNgotcVhqNCAgICAgICAgICAgIFFOIFNyYzQuUzE2Ci1xWGo1ICAgICAgICAgICAgUU4gU3JjNS5TMTYKLXFYajYgICAgICAgICAgICBRTiBTcmM2LlMxNgotcVhqNyAgICAgICAgICAgIFFOIFNyYzcuUzE2Ci1xWGp0ICAgICAgICAgICAgUU4gVG1wLlMxNgotCi1kWGowbG8gICAgICAgICAgRE4gKFNyYzAqMikuUzE2Ci1kWGowaGkgICAgICAgICAgRE4gKFNyYzAqMisxKS5TMTYKLWRYajFsbyAgICAgICAgICBETiAoU3JjMSoyKS5TMTYKLWRYajFoaSAgICAgICAgICBETiAoU3JjMSoyKzEpLlMxNgotZFhqMmxvICAgICAgICAgIEROIChTcmMyKjIpLlMxNgotZFhqMmhpICAgICAgICAgIEROIChTcmMyKjIrMSkuUzE2Ci1kWGozbG8gICAgICAgICAgRE4gKFNyYzMqMikuUzE2Ci1kWGozaGkgICAgICAgICAgRE4gKFNyYzMqMisxKS5TMTYKLWRYajRsbyAgICAgICAgICBETiAoU3JjNCoyKS5TMTYKLWRYajRoaSAgICAgICAgICBETiAoU3JjNCoyKzEpLlMxNgotZFhqNWxvICAgICAgICAgIEROIChTcmM1KjIpLlMxNgotZFhqNWhpICAgICAgICAgIEROIChTcmM1KjIrMSkuUzE2Ci1kWGo2bG8gICAgICAgICAgRE4gKFNyYzYqMikuUzE2Ci1kWGo2aGkgICAgICAgICAgRE4gKFNyYzYqMisxKS5TMTYKLWRYajdsbyAgICAgICAgICBETiAoU3JjNyoyKS5TMTYKLWRYajdoaSAgICAgICAgICBETiAoU3JjNyoyKzEpLlMxNgotZFhqdGxvICAgICAgICAgIEROIChUbXAqMikuUzE2Ci1kWGp0aGkgICAgICAgICAgRE4gKFRtcCoyKzEpLlMxNgotCi1xWGkwICAgICAgICAgICAgUU4gcVhqMAotcVhpMSAgICAgICAgICAgIFFOIHFYajQKLXFYaTIgICAgICAgICAgICBRTiBxWGoyCi1xWGkzICAgICAgICAgICAgUU4gcVhqNwotcVhpNCAgICAgICAgICAgIFFOIHFYajUKLXFYaTUgICAgICAgICAgICBRTiBxWGp0Ci1xWGk2ICAgICAgICAgICAgUU4gcVhqMQotcVhpNyAgICAgICAgICAgIFFOIHFYajYKLXFYaXQgICAgICAgICAgICBRTiBxWGozCi0KLWRYaTBsbyAgICAgICAgICBETiBkWGowbG8KLWRYaTBoaSAgICAgICAgICBETiBkWGowaGkKLWRYaTFsbyAgICAgICAgICBETiBkWGo0bG8KLWRYaTFoaSAgICAgICAgICBETiBkWGo0aGkKLWRYaTJsbyAgICAgICAgICBETiBkWGoybG8KLWRYaTJoaSAgICAgICAgICBETiBkWGoyaGkKLWRYaTNsbyAgICAgICAgICBETiBkWGo3bG8KLWRYaTNoaSAgICAgICAgICBETiBkWGo3aGkKLWRYaTRsbyAgICAgICAgICBETiBkWGo1bG8KLWRYaTRoaSAgICAgICAgICBETiBkWGo1aGkKLWRYaTVsbyAgICAgICAgICBETiBkWGp0bG8KLWRYaTVoaSAgICAgICAgICBETiBkWGp0aGkKLWRYaTZsbyAgICAgICAgICBETiBkWGoxbG8KLWRYaTZoaSAgICAgICAgICBETiBkWGoxaGkKLWRYaTdsbyAgICAgICAgICBETiBkWGo2bG8KLWRYaTdoaSAgICAgICAgICBETiBkWGo2aGkKLWRYaXRsbyAgICAgICAgICBETiBkWGozbG8KLWRYaXRoaSAgICAgICAgICBETiBkWGozaGkKLQotcVhoMCAgICAgICAgICAgIFFOIHFYaXQKLXFYaDEgICAgICAgICAgICBRTiBxWGkwCi1xWGgyICAgICAgICAgICAgUU4gcVhpMgotcVhoMyAgICAgICAgICAgIFFOIHFYaTMKLXFYaDQgICAgICAgICAgICBRTiBxWGk3Ci1xWGg1ICAgICAgICAgICAgUU4gcVhpNQotcVhoNiAgICAgICAgICAgIFFOIHFYaTQKLXFYaDcgICAgICAgICAgICBRTiBxWGkxCi1xWGh0ICAgICAgICAgICAgUU4gcVhpNgotCi1kWGgwbG8gICAgICAgICAgRE4gZFhpdGxvCi1kWGgwaGkgICAgICAgICAgRE4gZFhpdGhpCi1kWGgxbG8gICAgICAgICAgRE4gZFhpMGxvCi1kWGgxaGkgICAgICAgICAgRE4gZFhpMGhpCi1kWGgybG8gICAgICAgICAgRE4gZFhpMmxvCi1kWGgyaGkgICAgICAgICAgRE4gZFhpMmhpCi1kWGgzbG8gICAgICAgICAgRE4gZFhpM2xvCi1kWGgzaGkgICAgICAgICAgRE4gZFhpM2hpCi1kWGg0bG8gICAgICAgICAgRE4gZFhpN2xvCi1kWGg0aGkgICAgICAgICAgRE4gZFhpN2hpCi1kWGg1bG8gICAgICAgICAgRE4gZFhpNWxvCi1kWGg1aGkgICAgICAgICAgRE4gZFhpNWhpCi1kWGg2bG8gICAgICAgICAgRE4gZFhpNGxvCi1kWGg2aGkgICAgICAgICAgRE4gZFhpNGhpCi1kWGg3bG8gICAgICAgICAgRE4gZFhpMWxvCi1kWGg3aGkgICAgICAgICAgRE4gZFhpMWhpCi1kWGh0bG8gICAgICAgICAgRE4gZFhpNmxvCi1kWGh0aGkgICAgICAgICAgRE4gZFhpNmhpCi0KLXFYZzAgICAgICAgICAgICBRTiBxWGgyCi1xWGcxICAgICAgICAgICAgUU4gcVhodAotcVhnMiAgICAgICAgICAgIFFOIHFYaDEKLXFYZzMgICAgICAgICAgICBRTiBxWGgwCi1xWGc0ICAgICAgICAgICAgUU4gcVhoNAotcVhnNSAgICAgICAgICAgIFFOIHFYaDUKLXFYZzYgICAgICAgICAgICBRTiBxWGg2Ci1xWGc3ICAgICAgICAgICAgUU4gcVhoNwotcVhndCAgICAgICAgICAgIFFOIHFYaDMKLQotcVhmMCAgICAgICAgICAgIFFOIHFYZzYKLXFYZjEgICAgICAgICAgICBRTiBxWGc1Ci1xWGYyICAgICAgICAgICAgUU4gcVhnNAotcVhmMyAgICAgICAgICAgIFFOIHFYZ3QKLXFYZjQgICAgICAgICAgICBRTiBxWGczCi1xWGY1ICAgICAgICAgICAgUU4gcVhnMgotcVhmNiAgICAgICAgICAgIFFOIHFYZzEKLXFYZjcgICAgICAgICAgICBRTiBxWGcwCi1xWGZ0ICAgICAgICAgICAgUU4gcVhnNwotCi0KLXFYdDAgICAgICAgICAgICBRTiAxLlMzMgotcVh0MSAgICAgICAgICAgIFFOIDIuUzMyCi1xVDBsbyAgICAgICAgICAgUU4gMS5TMzIgICAgICAgICAKLXFUMGhpICAgICAgICAgICBRTiAyLlMzMiAgICAgICAgIAotcVQxbG8gICAgICAgICAgIFFOIDMuUzMyICAgICAgICAgCi1xVDFoaSAgICAgICAgICAgUU4gNC5TMzIgICAgICAgICAKLXFTY2FsZWxvICAgICAgICBRTiA1LlMzMiAgICAgICAgOy8vIHVzZWQgdG8gcmVhZCBwb3N0IHNjYWxlIHZhbHVlcwotcVNjYWxlaGkgICAgICAgIFFOIDYuUzMyCi1xVGVtcDAgICAgICAgICAgUU4gNS5TMzIgICAgICAgICAKLXFUZW1wMSAgICAgICAgICBRTiA2LlMzMiAgICAKLQotCi1TY2FsZTEgICAgICAgICAgRVFVIDYKLVNjYWxlMiAgICAgICAgICBFUVUgMTUKLXFTY2FsZTEgICAgICAgICBRTiBTY2FsZTEuUzE2ICAgICAKLXFTY2FsZTIgICAgICAgICBRTiBTY2FsZTIuUzE2ICAgICAKLWRTY2FsZTFsbyAgICAgICBETiAoU2NhbGUxKjIpLlMxNiAgICAgCi1kU2NhbGUxaGkgICAgICAgRE4gKFNjYWxlMSoyKzEpLlMxNgotZFNjYWxlMmxvICAgICAgIEROIChTY2FsZTIqMikuUzE2ICAgICAKLWRTY2FsZTJoaSAgICAgICBETiAoU2NhbGUyKjIrMSkuUzE2Ci0KLWRDb2VmcyAgICAgICAgICBETiAwLlMxNiAgICAgICAgOy8vIFNjYWxlIGNvZWZmaWNpZW50cyBpbiBmb3JtYXQge1swXSBbQ10gW1NdIFtJbnZTcXJ0Ml19Ci1JbnZTcXJ0MiAgICAgICAgRE4gZENvZWZzWzBdICAgIDsvLyAxL3NxcnQoMikgaW4gUTE1Ci1TICAgICAgICAgICAgICAgRE4gZENvZWZzWzFdICAgIDsvLyBTaW4oUEkvOCkgaW4gUTE1Ci1DICAgICAgICAgICAgICAgRE4gZENvZWZzWzJdICAgIDsvLyBDb3MoUEkvOCkgaW4gUTE1Ci0KLXBUZW1wICAgICAgICAgICBSTiAxMgotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIElNUE9SVCAgYXJtQ09NTV9JRENUQ29lZgotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgVkxEMSAgICAgICAge3FYajAscVhqMX0sIFtwU3JjIEA2NF0hCi0gICAgICAgIFZMRDEgICAgICAgIHtxWGoyLHFYajN9LCBbcFNyYyBANjRdIQotICAgICAgICBWTEQxICAgICAgICB7cVhqNCxxWGo1fSwgW3BTcmMgQDY0XSEKLSAgICAgICAgVkxEMSAgICAgICAge3FYajYscVhqN30sIFtwU3JjIEA2NF0hCi0gICAgICAgIAotICAgICAgICA7Ly8gTG9hZCBQcmVTY2FsZSBhbmQgbXVsdGlwbHkgd2l0aCBTcmMKLSAgICAgICAgOy8vIElTdGFnZSA0Ci0gICAgICAgIAotICAgICAgICBJRiAiJGluc2NhbGUiPSJzMTYiICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAxNlgxNiBNdWwKLSAgICAgICAgICAgIE1fSURDVF9QUkVTQ0FMRTE2Ci0gICAgICAgIEVORElGCi0gICAgICAgIAotICAgICAgICBJRiAiJGluc2NhbGUiPSJzMzIiICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAzMlgzMiAsdWwKLSAgICAgICAgICAgIE1fSURDVF9QUkVTQ0FMRTMyCi0gICAgICAgIEVORElGCi0KLSAgICAgICAgOy8vIElTdGFnZSAzCi0gICAgICAgIFZRUkRNVUxIICAgICBxWGkyLCBxWGkyLCBJbnZTcXJ0MiAgICAgICAgICAgIDsvLyBpMi9zcXJ0KDIpCi0gICAgICAgIFZIQUREICAgICAgIHFYaDAsIHFYaTAsIHFYaTEgICAgICAgICAgICAgICAgOy8vIChpMCtpMSkvMgotICAgICAgICBWSFNVQiAgICAgICBxWGgxLCBxWGkwLCBxWGkxICAgICAgICAgICAgICAgIDsvLyAoaTAtaTEpLzIKLSAgICAgICAgVkhBREQgICAgICAgcVhoNywgcVhpNSwgcVhpNyAgICAgICAgICAgICAgICA7Ly8gKGk1K2k3KS80Ci0gICAgICAgIFZTVUIgICAgICAgIHFYaDUsIHFYaTUsIHFYaTcgICAgICAgICAgICAgICAgOy8vIChpNS1pNykvMgotICAgICAgICBWUVJETVVMSCAgICAgcVhoNSwgcVhoNSwgSW52U3FydDIgICAgICAgICAgICA7Ly8gaDUvc3FydCgyKQotICAgICAgICBWU1VCICAgICAgICBxWGgyLCBxWGkyLCBxWGkzICAgICAgICAgICAgICAgIDsvLyBoMiwgaDMKLQotICAgICAgICBWTVVMTCAgICAgICBxWHQwLCBkWGk0bG8sIEMgICAgICAgICAgICAgICAgIDsvLyBjKmk0Ci0gICAgICAgIFZNTEFMICAgICAgIHFYdDAsIGRYaTZsbywgUyAgICAgICAgICAgICAgICAgOy8vIGMqaTQrcyppNgotICAgICAgICBWTVVMTCAgICAgICBxWHQxLCBkWGk0aGksIEMKLSAgICAgICAgVk1MQUwgICAgICAgcVh0MSwgZFhpNmhpLCBTCi0gICAgICAgIFZTSFJOICAgICAgIGRYaDRsbywgcVh0MCwgIzE2ICAgICAgICAgICAgICAgOy8vIGg0Ci0gICAgICAgIFZTSFJOICAgICAgIGRYaDRoaSwgcVh0MSwgIzE2Ci0gICAgICAgIAotICAgICAgICBWTVVMTCAgICAgICBxWHQwLCBkWGk2bG8sIEMgICAgICAgICAgICAgICAgIDsvLyBjKmk2Ci0gICAgICAgIFZNTFNMICAgICAgIHFYdDAsIGRYaTRsbywgUyAgICAgICAgICAgICAgICAgOy8vIC1zKmk0ICsgYypoNgotICAgICAgICBWTVVMTCAgICAgICBxWHQxLCBkWGk2aGksIEMKLSAgICAgICAgVk1MU0wgICAgICAgcVh0MSwgZFhpNGhpLCBTCi0gICAgICAgIFZTSFJOICAgICAgIGRYaDZsbywgcVh0MCwgIzE2ICAgICAgICAgICAgICAgOy8vIGg2Ci0gICAgICAgIFZTSFJOICAgICAgIGRYaDZoaSwgcVh0MSwgIzE2Ci0gICAgICAgIAotICAgICAgICA7Ly8gSVN0YWdlIDIKLSAgICAgICAgVlNVQiAgICAgICAgcVhnNiwgcVhoNiwgcVhoNwotICAgICAgICBWU1VCICAgICAgICBxWGc1LCBxWGg1LCBxWGc2Ci0gICAgICAgIFZTVUIgICAgICAgIHFYZzQsIHFYaDQsIHFYZzUKLSAgICAgICAgVkhBREQgICAgICAgcVhnMSwgcVhoMSwgcVhoMiAgICAgICAgOy8vIChoMStoMikvMgotICAgICAgICBWSFNVQiAgICAgICBxWGcyLCBxWGgxLCBxWGgyICAgICAgICA7Ly8gKGgxLWgyKS8yCi0gICAgICAgIFZIQUREICAgICAgIHFYZzAsIHFYaDAsIHFYaDMgICAgICAgIDsvLyAoaDAraDMpLzIKLSAgICAgICAgVkhTVUIgICAgICAgcVhnMywgcVhoMCwgcVhoMyAgICAgICAgOy8vIChoMC1oMykvMgotCi0gICAgICAgIDsvLyBJU3RhZ2UgMSBhbGwgcm93cwotICAgICAgICBWQUREICAgICAgICBxWGYzLCBxWGczLCBxWGc0ICAgICAgICAKLSAgICAgICAgVlNVQiAgICAgICAgcVhmNCwgcVhnMywgcVhnNCAgICAgICAgCi0gICAgICAgIFZBREQgICAgICAgIHFYZjIsIHFYZzIsIHFYZzUgICAgICAgIAotICAgICAgICBWU1VCICAgICAgICBxWGY1LCBxWGcyLCBxWGc1ICAgICAgICAKLSAgICAgICAgVkFERCAgICAgICAgcVhmMSwgcVhnMSwgcVhnNgotICAgICAgICBWU1VCICAgICAgICBxWGY2LCBxWGcxLCBxWGc2ICAgICAgICAKLSAgICAgICAgVkFERCAgICAgICAgcVhmMCwgcVhnMCwgcVhnNwotICAgICAgICBWU1VCICAgICAgICBxWGY3LCBxWGcwLCBxWGc3ICAgICAgCi0KLSAgICAgICAgOy8vIFRyYW5zcG9zZSwgc3RvcmUgYW5kIGxvb3AKLVhUUjAgICAgICAgICAgICBFUVUgU3JjNQotWFRSMSAgICAgICAgICAgIEVRVSBUbXAKLVhUUjIgICAgICAgICAgICBFUVUgU3JjNgotWFRSMyAgICAgICAgICAgIEVRVSBTcmM3Ci1YVFI0ICAgICAgICAgICAgRVFVIFNyYzMKLVhUUjUgICAgICAgICAgICBFUVUgU3JjMAotWFRSNiAgICAgICAgICAgIEVRVSBTcmMxCi1YVFI3ICAgICAgICAgICAgRVFVIFNyYzIKLVhUUnQgICAgICAgICAgICBFUVUgU3JjNAotICAgICAgICAgICAgICAgIAotcUEwICAgICAgICAgICAgIFFOICBYVFIwLlMzMiAgOy8vIGZvciBYVFJwb3NlCi1xQTEgICAgICAgICAgICAgUU4gIFhUUjEuUzMyCi1xQTIgICAgICAgICAgICAgUU4gIFhUUjIuUzMyCi1xQTMgICAgICAgICAgICAgUU4gIFhUUjMuUzMyCi1xQTQgICAgICAgICAgICAgUU4gIFhUUjQuUzMyCi1xQTUgICAgICAgICAgICAgUU4gIFhUUjUuUzMyCi1xQTYgICAgICAgICAgICAgUU4gIFhUUjYuUzMyCi1xQTcgICAgICAgICAgICAgUU4gIFhUUjcuUzMyCi0KLWRCMCAgICAgICAgICAgICBETiAgWFRSMCoyKzEgICAgICA7Ly8gZm9yIHVzaW5nIFZTV1AKLWRCMSAgICAgICAgICAgICBETiAgWFRSMSoyKzEKLWRCMiAgICAgICAgICAgICBETiAgWFRSMioyKzEKLWRCMyAgICAgICAgICAgICBETiAgWFRSMyoyKzEKLWRCNCAgICAgICAgICAgICBETiAgWFRSNCoyCi1kQjUgICAgICAgICAgICAgRE4gIFhUUjUqMgotZEI2ICAgICAgICAgICAgIEROICBYVFI2KjIKLWRCNyAgICAgICAgICAgICBETiAgWFRSNyoyCi0KLSAgICAgICAgICAKLSAgICAgICAgVlRSTiAgICAgICAgcVhmMCwgcVhmMQotICAgICAgICBWVFJOICAgICAgICBxWGYyLCBxWGYzCi0gICAgICAgIFZUUk4gICAgICAgIHFYZjQsIHFYZjUKLSAgICAgICAgVlRSTiAgICAgICAgcVhmNiwgcVhmNwotICAgICAgICBWVFJOICAgICAgICBxQTAsIHFBMgotICAgICAgICBWVFJOICAgICAgICBxQTEsIHFBMwotICAgICAgICBWVFJOICAgICAgICBxQTQsIHFBNgotICAgICAgICBWVFJOICAgICAgICBxQTUsIHFBNyAgICAgICAgCi0gICAgICAgIFZTV1AgICAgICAgIGRCMCwgZEI0Ci0gICAgICAgIFZTV1AgICAgICAgIGRCMSwgZEI1Ci0gICAgICAgIFZTV1AgICAgICAgIGRCMiwgZEI2Ci0gICAgICAgIFZTV1AgICAgICAgIGRCMywgZEI3Ci0gICAgICAgIAotCi1xWWowICAgICAgICAgICAgUU4gcVhmMAotcVlqMSAgICAgICAgICAgIFFOIHFYZjEKLXFZajIgICAgICAgICAgICBRTiBxWGYyCi1xWWozICAgICAgICAgICAgUU4gcVhmMwotcVlqNCAgICAgICAgICAgIFFOIHFYZjQKLXFZajUgICAgICAgICAgICBRTiBxWGY1Ci1xWWo2ICAgICAgICAgICAgUU4gcVhmNgotcVlqNyAgICAgICAgICAgIFFOIHFYZjcKLXFZanQgICAgICAgICAgICBRTiBxWGZ0Ci0KLWRZajBsbyAgICAgICAgICBETiAoWFRSMCoyKS5TMTYKLWRZajBoaSAgICAgICAgICBETiAoWFRSMCoyKzEpLlMxNgotZFlqMWxvICAgICAgICAgIEROIChYVFIxKjIpLlMxNgotZFlqMWhpICAgICAgICAgIEROIChYVFIxKjIrMSkuUzE2Ci1kWWoybG8gICAgICAgICAgRE4gKFhUUjIqMikuUzE2Ci1kWWoyaGkgICAgICAgICAgRE4gKFhUUjIqMisxKS5TMTYKLWRZajNsbyAgICAgICAgICBETiAoWFRSMyoyKS5TMTYKLWRZajNoaSAgICAgICAgICBETiAoWFRSMyoyKzEpLlMxNgotZFlqNGxvICAgICAgICAgIEROIChYVFI0KjIpLlMxNgotZFlqNGhpICAgICAgICAgIEROIChYVFI0KjIrMSkuUzE2Ci1kWWo1bG8gICAgICAgICAgRE4gKFhUUjUqMikuUzE2Ci1kWWo1aGkgICAgICAgICAgRE4gKFhUUjUqMisxKS5TMTYKLWRZajZsbyAgICAgICAgICBETiAoWFRSNioyKS5TMTYKLWRZajZoaSAgICAgICAgICBETiAoWFRSNioyKzEpLlMxNgotZFlqN2xvICAgICAgICAgIEROIChYVFI3KjIpLlMxNgotZFlqN2hpICAgICAgICAgIEROIChYVFI3KjIrMSkuUzE2Ci1kWWp0bG8gICAgICAgICAgRE4gKFhUUnQqMikuUzE2Ci1kWWp0aGkgICAgICAgICAgRE4gKFhUUnQqMisxKS5TMTYKLQotcVlpMCAgICAgICAgICAgIFFOIHFZajAKLXFZaTEgICAgICAgICAgICBRTiBxWWo0Ci1xWWkyICAgICAgICAgICAgUU4gcVlqMgotcVlpMyAgICAgICAgICAgIFFOIHFZajcKLXFZaTQgICAgICAgICAgICBRTiBxWWo1Ci1xWWk1ICAgICAgICAgICAgUU4gcVlqdAotcVlpNiAgICAgICAgICAgIFFOIHFZajEKLXFZaTcgICAgICAgICAgICBRTiBxWWo2Ci1xWWl0ICAgICAgICAgICAgUU4gcVlqMwotCi1kWWkwbG8gICAgICAgICAgRE4gZFlqMGxvCi1kWWkwaGkgICAgICAgICAgRE4gZFlqMGhpCi1kWWkxbG8gICAgICAgICAgRE4gZFlqNGxvCi1kWWkxaGkgICAgICAgICAgRE4gZFlqNGhpCi1kWWkybG8gICAgICAgICAgRE4gZFlqMmxvCi1kWWkyaGkgICAgICAgICAgRE4gZFlqMmhpCi1kWWkzbG8gICAgICAgICAgRE4gZFlqN2xvCi1kWWkzaGkgICAgICAgICAgRE4gZFlqN2hpCi1kWWk0bG8gICAgICAgICAgRE4gZFlqNWxvCi1kWWk0aGkgICAgICAgICAgRE4gZFlqNWhpCi1kWWk1bG8gICAgICAgICAgRE4gZFlqdGxvCi1kWWk1aGkgICAgICAgICAgRE4gZFlqdGhpCi1kWWk2bG8gICAgICAgICAgRE4gZFlqMWxvCi1kWWk2aGkgICAgICAgICAgRE4gZFlqMWhpCi1kWWk3bG8gICAgICAgICAgRE4gZFlqNmxvCi1kWWk3aGkgICAgICAgICAgRE4gZFlqNmhpCi1kWWl0bG8gICAgICAgICAgRE4gZFlqM2xvCi1kWWl0aGkgICAgICAgICAgRE4gZFlqM2hpCi0KLXFZaDAgICAgICAgICAgICBRTiBxWWl0Ci1xWWgxICAgICAgICAgICAgUU4gcVlpMAotcVloMiAgICAgICAgICAgIFFOIHFZaTIKLXFZaDMgICAgICAgICAgICBRTiBxWWkzCi1xWWg0ICAgICAgICAgICAgUU4gcVlpNwotcVloNSAgICAgICAgICAgIFFOIHFZaTUKLXFZaDYgICAgICAgICAgICBRTiBxWWk0Ci1xWWg3ICAgICAgICAgICAgUU4gcVlpMQotcVlodCAgICAgICAgICAgIFFOIHFZaTYKLQotZFloMGxvICAgICAgICAgIEROIGRZaXRsbwotZFloMGhpICAgICAgICAgIEROIGRZaXRoaQotZFloMWxvICAgICAgICAgIEROIGRZaTBsbwotZFloMWhpICAgICAgICAgIEROIGRZaTBoaQotZFloMmxvICAgICAgICAgIEROIGRZaTJsbwotZFloMmhpICAgICAgICAgIEROIGRZaTJoaQotZFloM2xvICAgICAgICAgIEROIGRZaTNsbwotZFloM2hpICAgICAgICAgIEROIGRZaTNoaQotZFloNGxvICAgICAgICAgIEROIGRZaTdsbwotZFloNGhpICAgICAgICAgIEROIGRZaTdoaQotZFloNWxvICAgICAgICAgIEROIGRZaTVsbwotZFloNWhpICAgICAgICAgIEROIGRZaTVoaQotZFloNmxvICAgICAgICAgIEROIGRZaTRsbwotZFloNmhpICAgICAgICAgIEROIGRZaTRoaQotZFloN2xvICAgICAgICAgIEROIGRZaTFsbwotZFloN2hpICAgICAgICAgIEROIGRZaTFoaQotZFlodGxvICAgICAgICAgIEROIGRZaTZsbwotZFlodGhpICAgICAgICAgIEROIGRZaTZoaQotCi1xWWcwICAgICAgICAgICAgUU4gcVloMgotcVlnMSAgICAgICAgICAgIFFOIHFZaHQKLXFZZzIgICAgICAgICAgICBRTiBxWWgxCi1xWWczICAgICAgICAgICAgUU4gcVloMAotcVlnNCAgICAgICAgICAgIFFOIHFZaDQKLXFZZzUgICAgICAgICAgICBRTiBxWWg1Ci1xWWc2ICAgICAgICAgICAgUU4gcVloNgotcVlnNyAgICAgICAgICAgIFFOIHFZaDcKLXFZZ3QgICAgICAgICAgICBRTiBxWWgzCi0KLXFZZjAgICAgICAgICAgICBRTiBxWWc2Ci1xWWYxICAgICAgICAgICAgUU4gcVlnNQotcVlmMiAgICAgICAgICAgIFFOIHFZZzQKLXFZZjMgICAgICAgICAgICBRTiBxWWd0Ci1xWWY0ICAgICAgICAgICAgUU4gcVlnMwotcVlmNSAgICAgICAgICAgIFFOIHFZZzIKLXFZZjYgICAgICAgICAgICBRTiBxWWcxCi1xWWY3ICAgICAgICAgICAgUU4gcVlnMAotcVlmdCAgICAgICAgICAgIFFOIHFZZzcKLQotICAgICAgICBWUlNIUiAgICAgICBxWWo3LCBxWWo3LCAjMgotICAgICAgICBWUlNIUiAgICAgICBxWWo2LCBxWWo2LCAjMQotICAgICAgICAKLSAgICAgICAgVkhBREQgICAgICAgcVlpNSwgcVlqMSwgcVlqNyAgICAgICAgOy8vIGk1ID0gKGoxK2o3KS8yCi0gICAgICAgIFZTVUIgICAgICAgIHFZaTYsIHFZajEsIHFZajcgICAgICAgIDsvLyBpNiA9IGoxLWo3Ci0gICAgICAgIFZIQUREICAgICAgIHFZaTMsIHFZajIsIHFZajYgICAgICAgIDsvLyBpMyA9IChqMitqNikvMgotICAgICAgICBWU1VCICAgICAgICBxWWkyLCBxWWoyLCBxWWo2ICAgICAgICA7Ly8gaTIgPSBqMi1qNgotICAgICAgICBWSEFERCAgICAgICBxWWk3LCBxWWo1LCBxWWozICAgICAgICA7Ly8gaTcgPSAoajUrajMpLzIKLSAgICAgICAgVlNVQiAgICAgICAgcVlpNCwgcVlqNSwgcVlqMyAgICAgICAgOy8vIGk0ID0gajUtajMKLQotICAgICAgICBWUVJETVVMSCAgICAgcVlpMiwgcVlpMiwgSW52U3FydDIgICAgOy8vIGkyL3NxcnQoMikKLSAgICAgICAgOy8vIElTdGFnZSA0LDMgcm93cyAwdG8xIHggMS8yCi0gICAgICAgIAotICAgICAgICBNT1YgICAgICAgICBwVGVtcCwgIzB4NCAgICAgICAgICAgICA7Ly8gZW5zdXJlIGNvcnJlY3Qgcm91bmQKLSAgICAgICAgVkRVUCAgICAgICAgcVNjYWxlMSwgcFRlbXAgICAgICAgICAgIDsvLyBvZiBEQyByZXN1bHQKLSAgICAgICAgVkFERCAgICAgICAgcVlpMCwgcVlpMCwgcVNjYWxlMQotICAgICAgICAKLSAgICAgICAgVkhBREQgICAgICAgcVloMCwgcVlpMCwgcVlpMSAgICAgICAgOy8vIChpMCtpMSkvMgotICAgICAgICBWSFNVQiAgICAgICBxWWgxLCBxWWkwLCBxWWkxICAgICAgICA7Ly8gKGkwLWkxKS8yCi0KLSAgICAgICAgVkhBREQgICAgICAgcVloNywgcVlpNSwgcVlpNyAgICAgICAgOy8vIChpNStpNykvNAotICAgICAgICBWU1VCICAgICAgICBxWWg1LCBxWWk1LCBxWWk3ICAgICAgICA7Ly8gKGk1LWk3KS8yCi0gICAgICAgIFZTVUIgICAgICAgIHFZaDIsIHFZaTIsIHFZaTMgICAgICAgIDsvLyBoMiwgaDMKLSAgICAgICAgVlFSRE1VTEggICAgIHFZaDUsIHFZaDUsIEludlNxcnQyICAgIDsvLyBoNS9zcXJ0KDIpCi0KLSAgICAgICAgVk1VTEwgICAgICAgcVh0MCwgZFlpNGxvLCBDICAgICAgICAgOy8vIGMqaTQKLSAgICAgICAgVk1MQUwgICAgICAgcVh0MCwgZFlpNmxvLCBTICAgICAgICAgOy8vIGMqaTQrcyppNgotICAgICAgICBWTVVMTCAgICAgICBxWHQxLCBkWWk0aGksIEMKLSAgICAgICAgVk1MQUwgICAgICAgcVh0MSwgZFlpNmhpLCBTCi0gICAgICAgIFZTSFJOICAgICAgIGRZaDRsbywgcVh0MCwgIzE2ICAgICAgIDsvLyBoNAotICAgICAgICBWU0hSTiAgICAgICBkWWg0aGksIHFYdDEsICMxNgotICAgICAgICAKLSAgICAgICAgVk1VTEwgICAgICAgcVh0MCwgZFlpNmxvLCBDICAgICAgICAgOy8vIGMqaTYKLSAgICAgICAgVk1MU0wgICAgICAgcVh0MCwgZFlpNGxvLCBTICAgICAgICAgOy8vIC1zKmk0ICsgYypoNgotICAgICAgICBWTVVMTCAgICAgICBxWHQxLCBkWWk2aGksIEMKLSAgICAgICAgVk1MU0wgICAgICAgcVh0MSwgZFlpNGhpLCBTCi0gICAgICAgIFZTSFJOICAgICAgIGRZaDZsbywgcVh0MCwgIzE2ICAgICAgIDsvLyBoNgotICAgICAgICBWU0hSTiAgICAgICBkWWg2aGksIHFYdDEsICMxNgotICAgICAgICAKLSAgICAgICAgVlNVQiAgICAgICAgcVlnNiwgcVloNiwgcVloNwotICAgICAgICBWU1VCICAgICAgICBxWWc1LCBxWWg1LCBxWWc2Ci0gICAgICAgIFZTVUIgICAgICAgIHFZZzQsIHFZaDQsIHFZZzUKLSAgICAgICAgCi0gICAgICAgIDsvLyBJU3RhZ2UgMiByb3dzIDB0bzMgeCAxLzIKLSAgICAgICAgVkhBREQgICAgICAgcVlnMSwgcVloMSwgcVloMiAgICAgICAgOy8vIChoMStoMikvMgotICAgICAgICBWSFNVQiAgICAgICBxWWcyLCBxWWgxLCBxWWgyICAgICAgICA7Ly8gKGgxLWgyKS8yCi0gICAgICAgIFZIQUREICAgICAgIHFZZzAsIHFZaDAsIHFZaDMgICAgICAgIDsvLyAoaDAraDMpLzIKLSAgICAgICAgVkhTVUIgICAgICAgcVlnMywgcVloMCwgcVloMyAgICAgICAgOy8vIChoMC1oMykvMgotICAgICAgICAKLQotICAgICAgICA7Ly8gSVN0YWdlIDEgYWxsIHJvd3MKLSAgICAgICAgVkhBREQgICAgICAgIHFZZjMsIHFZZzMsIHFZZzQgICAgICAgIAotICAgICAgICBWSFNVQiAgICAgICAgcVlmNCwgcVlnMywgcVlnNCAgICAgICAgCi0gICAgICAgIFZIQUREICAgICAgICBxWWYyLCBxWWcyLCBxWWc1ICAgICAgICAKLSAgICAgICAgVkhTVUIgICAgICAgIHFZZjUsIHFZZzIsIHFZZzUgICAgICAgIAotICAgICAgICBWSEFERCAgICAgICAgcVlmMSwgcVlnMSwgcVlnNgotICAgICAgICBWSFNVQiAgICAgICAgcVlmNiwgcVlnMSwgcVlnNiAgICAgICAgCi0gICAgICAgIFZIQUREICAgICAgICBxWWYwLCBxWWcwLCBxWWc3Ci0gICAgICAgIFZIU1VCICAgICAgICBxWWY3LCBxWWcwLCBxWWc3ICAgICAgCi0KLVlUUjAgICAgICAgICAgICBFUVUgU3JjMAotWVRSMSAgICAgICAgICAgIEVRVSBTcmM0Ci1ZVFIyICAgICAgICAgICAgRVFVIFNyYzEKLVlUUjMgICAgICAgICAgICBFUVUgU3JjMgotWVRSNCAgICAgICAgICAgIEVRVSBTcmM3Ci1ZVFI1ICAgICAgICAgICAgRVFVIFNyYzUKLVlUUjYgICAgICAgICAgICBFUVUgVG1wCi1ZVFI3ICAgICAgICAgICAgRVFVIFNyYzYKLVlUUnQgICAgICAgICAgICBFUVUgU3JjMwotCi1xQzAgICAgICAgICAgICAgUU4gIFlUUjAuUzMyICAgICAgICAgICAgICAgIDsvLyBmb3IgWVRScG9zZQotcUMxICAgICAgICAgICAgIFFOICBZVFIxLlMzMgotcUMyICAgICAgICAgICAgIFFOICBZVFIyLlMzMgotcUMzICAgICAgICAgICAgIFFOICBZVFIzLlMzMgotcUM0ICAgICAgICAgICAgIFFOICBZVFI0LlMzMgotcUM1ICAgICAgICAgICAgIFFOICBZVFI1LlMzMgotcUM2ICAgICAgICAgICAgIFFOICBZVFI2LlMzMgotcUM3ICAgICAgICAgICAgIFFOICBZVFI3LlMzMgotCi1kRDAgICAgICAgICAgICAgRE4gIFlUUjAqMisxICAgICAgICAgICAgICAgIDsvLyBmb3IgdXNpbmcgVlNXUAotZEQxICAgICAgICAgICAgIEROICBZVFIxKjIrMQotZEQyICAgICAgICAgICAgIEROICBZVFIyKjIrMQotZEQzICAgICAgICAgICAgIEROICBZVFIzKjIrMQotZEQ0ICAgICAgICAgICAgIEROICBZVFI0KjIKLWRENSAgICAgICAgICAgICBETiAgWVRSNSoyCi1kRDYgICAgICAgICAgICAgRE4gIFlUUjYqMgotZEQ3ICAgICAgICAgICAgIEROICBZVFI3KjIKLSAgICAgICAgICAKLSAgICAgICAgVlRSTiAgICAgICAgcVlmMCwgcVlmMQotICAgICAgICBWVFJOICAgICAgICBxWWYyLCBxWWYzCi0gICAgICAgIFZUUk4gICAgICAgIHFZZjQsIHFZZjUKLSAgICAgICAgVlRSTiAgICAgICAgcVlmNiwgcVlmNwotICAgICAgICBWVFJOICAgICAgICBxQzAsIHFDMgotICAgICAgICBWVFJOICAgICAgICBxQzEsIHFDMwotICAgICAgICBWVFJOICAgICAgICBxQzQsIHFDNgotICAgICAgICBWVFJOICAgICAgICBxQzUsIHFDNyAgICAgICAgCi0gICAgICAgIFZTV1AgICAgICAgIGREMCwgZEQ0Ci0gICAgICAgIFZTV1AgICAgICAgIGREMSwgZEQ1Ci0gICAgICAgIFZTV1AgICAgICAgIGREMiwgZEQ2Ci0gICAgICAgIFZTV1AgICAgICAgIGREMywgZEQ3Ci0KLSAgICAgICAgCi1kWWYwVTggICAgICAgICAgRE4gWVRSMCoyLlU4Ci1kWWYxVTggICAgICAgICAgRE4gWVRSMSoyLlU4Ci1kWWYyVTggICAgICAgICAgRE4gWVRSMioyLlU4Ci1kWWYzVTggICAgICAgICAgRE4gWVRSMyoyLlU4Ci1kWWY0VTggICAgICAgICAgRE4gWVRSNCoyLlU4Ci1kWWY1VTggICAgICAgICAgRE4gWVRSNSoyLlU4Ci1kWWY2VTggICAgICAgICAgRE4gWVRSNioyLlU4Ci1kWWY3VTggICAgICAgICAgRE4gWVRSNyoyLlU4Ci0gICAgICAgIAotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIERvIHNhdHVyYXRpb24gaWYgb3V0c2l6ZSBpcyBvdGhlciB0aGFuIFMxNgotICAgICAgICA7Ly8KLSAgICAgICAgCi0gICAgICAgIElGICgiJG91dHNpemUiPSJ1OCIpCi0gICAgICAgICAgICA7Ly8gT3V0cHV0IHJhbmdlIFswLTI1NV0KLSAgICAgICAgICAgIFZRTU9WTiAgICAgICAgICAgIGRZZjBVOCwgcVlmMAotICAgICAgICAgICAgVlFNT1ZOICAgICAgICAgICAgZFlmMVU4LCBxWWYxCi0gICAgICAgICAgICBWUU1PVk4gICAgICAgICAgICBkWWYyVTgsIHFZZjIKLSAgICAgICAgICAgIFZRTU9WTiAgICAgICAgICAgIGRZZjNVOCwgcVlmMwotICAgICAgICAgICAgVlFNT1ZOICAgICAgICAgICAgZFlmNFU4LCBxWWY0Ci0gICAgICAgICAgICBWUU1PVk4gICAgICAgICAgICBkWWY1VTgsIHFZZjUKLSAgICAgICAgICAgIFZRTU9WTiAgICAgICAgICAgIGRZZjZVOCwgcVlmNgotICAgICAgICAgICAgVlFNT1ZOICAgICAgICAgICAgZFlmN1U4LCBxWWY3Ci0gICAgICAgIEVORElGCi0gICAgICAgIAotICAgICAgICBJRiAoIiRvdXRzaXplIj0iczkiKQotICAgICAgICAgICAgOy8vIE91dHB1dCByYW5nZSBbLTI1NiB0byArMjU1XQotICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWYwLCBxWWYwLCAjMTYtOQotICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWYxLCBxWWYxLCAjMTYtOQotICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWYyLCBxWWYyLCAjMTYtOQotICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWYzLCBxWWYzLCAjMTYtOQotICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWY0LCBxWWY0LCAjMTYtOQotICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWY1LCBxWWY1LCAjMTYtOQotICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWY2LCBxWWY2LCAjMTYtOQotICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWY3LCBxWWY3LCAjMTYtOQotICAgICAgICAgICAgCi0gICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjAsIHFZZjAsICMxNi05Ci0gICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjEsIHFZZjEsICMxNi05Ci0gICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjIsIHFZZjIsICMxNi05Ci0gICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjMsIHFZZjMsICMxNi05Ci0gICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjQsIHFZZjQsICMxNi05Ci0gICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjUsIHFZZjUsICMxNi05Ci0gICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjYsIHFZZjYsICMxNi05Ci0gICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjcsIHFZZjcsICMxNi05Ci0gICAgICAgIEVORElGCi0KLSAgICAgICAgOy8vIFN0b3JlIG91dHB1dCBkZXBlbmRpbmcgb24gdGhlIFN0cmlkZSBzaXplCi0gICAgICAgIElGICIkc3RyaWRlIj0icyIKLSAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjAsIFtwRGVzdCBANjRdLCBTdHJpZGUKLSAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjEsIFtwRGVzdCBANjRdLCBTdHJpZGUKLSAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjIsIFtwRGVzdCBANjRdLCBTdHJpZGUKLSAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjMsIFtwRGVzdCBANjRdLCBTdHJpZGUKLSAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjQsIFtwRGVzdCBANjRdLCBTdHJpZGUKLSAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjUsIFtwRGVzdCBANjRdLCBTdHJpZGUKLSAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjYsIFtwRGVzdCBANjRdLCBTdHJpZGUKLSAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjcsIFtwRGVzdCBANjRdICAgICAgICAgICAgCi0gICAgICAgIEVMU0UKLSAgICAgICAgICAgIElGICgiJG91dHNpemUiPSJ1OCIpCi0gICAgICAgICAgICAgICAgVlNUMSAgICAgICAgZFlmMFU4LCBbcERlc3QgQDY0XSwgIzgKLSAgICAgICAgICAgICAgICBWU1QxICAgICAgICBkWWYxVTgsIFtwRGVzdCBANjRdLCAjOAotICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIGRZZjJVOCwgW3BEZXN0IEA2NF0sICM4Ci0gICAgICAgICAgICAgICAgVlNUMSAgICAgICAgZFlmM1U4LCBbcERlc3QgQDY0XSwgIzgKLSAgICAgICAgICAgICAgICBWU1QxICAgICAgICBkWWY0VTgsIFtwRGVzdCBANjRdLCAjOAotICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIGRZZjVVOCwgW3BEZXN0IEA2NF0sICM4Ci0gICAgICAgICAgICAgICAgVlNUMSAgICAgICAgZFlmNlU4LCBbcERlc3QgQDY0XSwgIzgKLSAgICAgICAgICAgICAgICBWU1QxICAgICAgICBkWWY3VTgsIFtwRGVzdCBANjRdCi0gICAgICAgICAgICBFTFNFCi0gICAgICAgICAgICAgICAgOy8vICgiJG91dHNpemUiPSJzOSIpIG9yICgiJG91dHNpemUiPSJzMTYiKQotICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjAsIFtwRGVzdCBANjRdLCAjMTYKLSAgICAgICAgICAgICAgICBWU1QxICAgICAgICBxWWYxLCBbcERlc3QgQDY0XSwgIzE2Ci0gICAgICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmMiwgW3BEZXN0IEA2NF0sICMxNgotICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjMsIFtwRGVzdCBANjRdLCAjMTYKLSAgICAgICAgICAgICAgICBWU1QxICAgICAgICBxWWY0LCBbcERlc3QgQDY0XSwgIzE2Ci0gICAgICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmNSwgW3BEZXN0IEA2NF0sICMxNgotICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjYsIFtwRGVzdCBANjRdLCAjMTYKLSAgICAgICAgICAgICAgICBWU1QxICAgICAgICBxWWY3LCBbcERlc3QgQDY0XQotICAgICAgICAgICAgRU5ESUYKLSAgICAgICAgCi0gICAgICAgIEVORElGCi0KLQotCi0gICAgICAgIEVORElGIDsvLyBDb3J0ZXhBOAotCi0KLQotICAgICAgICBNRU5EICAgICAgICAKLQotICAgICAgICA7Ly8gU2NhbGUgVFdPIGlucHV0IHJvd3Mgd2l0aCBUV08gcm93cyBvZiAxNiBiaXQgc2NhbGUgdmFsdWVzCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gVGhpcyBtYWNybyBpcyB1c2VkIGJ5IE1fSURDVF9QUkVTQ0FMRTE2IHRvIHByZS1zY2FsZSBvbmUgcm93Ci0gICAgICAgIDsvLyBpbnB1dCAoRWlnaHQgaW5wdXQgdmFsdWVzKSB3aXRoIG9uZSByb3cgb2Ygc2NhbGUgdmFsdWVzLiBBbHNvIAotICAgICAgICA7Ly8gTG9hZHMgbmV4dCBzY2FsZSB2YWx1ZXMgZnJvbSBwU2NhbGUsIGlmICRMYXN0Um93IGZsYWcgaXMgbm90IHNldC4KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJGRBbG8gICAgICAgICAgIC0gSW5wdXQgRCByZWdpc3RlciB3aXRoIGZpcnN0IGZvdXIgUzE2IHZhbHVlcyBvZiByb3cgbgotICAgICAgICA7Ly8gJGRBaGkgICAgICAgICAgIC0gSW5wdXQgRCByZWdpc3RlciB3aXRoIG5leHQgZm91ciBTMTYgdmFsdWVzIG9mIHJvdyBuCi0gICAgICAgIDsvLyAkZEJsbyAgICAgICAgICAgLSBJbnB1dCBEIHJlZ2lzdGVyIHdpdGggZmlyc3QgZm91ciBTMTYgdmFsdWVzIG9mIHJvdyBuKzEKLSAgICAgICAgOy8vICRkQmhpICAgICAgICAgICAtIElucHV0IEQgcmVnaXN0ZXIgd2l0aCBuZXh0IGZvdXIgUzE2IHZhbHVlcyBvZiByb3cgbisxCi0gICAgICAgIDsvLyBwU2NhbGUgICAgICAgICAgLSBQb2ludGVyIHRvIG5leHQgcm93IG9mIHNjYWxlIHZhbHVlcwotICAgICAgICA7Ly8gcVQwbG8gICAgICAgICAgIC0gVGVtcG9yYXJ5IHNjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vIHFUMGhpICAgICAgICAgICAtIFRlbXBvcmFyeSBzY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyBxVDFsbyAgICAgICAgICAgLSBUZW1wb3Jhcnkgc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8gcVQxaGkgICAgICAgICAgIC0gVGVtcG9yYXJ5IHNjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vIGRTY2FsZTFsbyAgICAgICAtIFNjYWxlIHZhbHVlIG9mIHJvdyBuCi0gICAgICAgIDsvLyBkU2NhbGUxaGkgICAgICAgLSBTY2FsZSB2YWx1ZSBvZiByb3cgbgotICAgICAgICA7Ly8gZFNjYWxlMmxvICAgICAgIC0gU2NhbGUgdmFsdWUgb2Ygcm93IG4rMQotICAgICAgICA7Ly8gZFNjYWxlMmhpICAgICAgIC0gU2NhbGUgdmFsdWUgb2Ygcm93IG4rMQotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIElucHV0IEZsYWcKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkTGFzdFJvdyAgICAgICAgLSBGbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgY3VycmVudCByb3cgaXMgbGFzdCByb3cKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRkQWxvICAgICAgICAgICAtIFNjYWxlZCBvdXRwdXQgdmFsdWVzIChmaXJzdCBmb3VyIFMxNiBvZiByb3cgbikKLSAgICAgICAgOy8vICRkQWhpICAgICAgICAgICAtIFNjYWxlZCBvdXRwdXQgdmFsdWVzIChuZXh0IGZvdXIgUzE2IG9mIHJvdyBuKQotICAgICAgICA7Ly8gJGRCbG8gICAgICAgICAgIC0gU2NhbGVkIG91dHB1dCB2YWx1ZXMgKGZpcnN0IGZvdXIgUzE2IG9mIHJvdyBuKzEpCi0gICAgICAgIDsvLyAkZEJoaSAgICAgICAgICAgLSBTY2FsZWQgb3V0cHV0IHZhbHVlcyAobmV4dCBmb3VyIFMxNiBvZiByb3cgbisxKQotICAgICAgICA7Ly8gcVNjYWxlMSAgICAgICAgIC0gU2NhbGUgdmFsdWVzIGZvciBuZXh0IHJvdwotICAgICAgICA7Ly8gcVNjYWxlMiAgICAgICAgIC0gU2NhbGUgdmFsdWVzIGZvciBuZXh0IHJvdysxCi0gICAgICAgIDsvLyBwU2NhbGUgICAgICAgICAgLSBQb2ludGVyIHRvIG5leHQgcm93IG9mIHNjYWxlIHZhbHVlcwotICAgICAgICA7Ly8KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9JRENUX1NDQUxFMTYgJGRBbG8sICRkQWhpLCAkZEJsbywgJGRCaGksICRMYXN0Um93Ci0gICAgICAgIFZNVUxMICAgICAgIHFUMGxvLCAkZEFsbywgZFNjYWxlMWxvCi0gICAgICAgIFZNVUxMICAgICAgIHFUMGhpLCAkZEFoaSwgZFNjYWxlMWhpCi0gICAgICAgIFZNVUxMICAgICAgIHFUMWxvLCAkZEJsbywgZFNjYWxlMmxvCi0gICAgICAgIFZNVUxMICAgICAgIHFUMWhpLCAkZEJoaSwgZFNjYWxlMmhpCi0gICAgICAgIElGICIkTGFzdFJvdyI9IjAiCi0gICAgICAgICAgICBWTEQxICAgICAgICBxU2NhbGUxLCBbcFNjYWxlXSwgIzE2ICA7Ly8gTG9hZCBzY2FsZSBmb3Igcm93IG4rMQotICAgICAgICAgICAgVkxEMSAgICAgICAgcVNjYWxlMiwgW3BTY2FsZV0sICMxNiAgOy8vIExvYWQgc2NhbGUgZm9yIHJvdyBuKzIKLSAgICAgICAgRU5ESUYKLSAgICAgICAgVlFSU0hSTiAgICAgICAkZEFsbywgcVQwbG8sICMxMiAgICAgICAgCi0gICAgICAgIFZRUlNIUk4gICAgICAgJGRBaGksIHFUMGhpLCAjMTIgICAgICAgIAotICAgICAgICBWUVJTSFJOICAgICAgICRkQmxvLCBxVDFsbywgIzEyICAgICAgICAKLSAgICAgICAgVlFSU0hSTiAgICAgICAkZEJoaSwgcVQxaGksICMxMiAgICAgICAgCi0gICAgICAgIE1FTkQKLQotICAgICAgICA7Ly8gU2NhbGUgOHg4IGJsb2NrIGlucHV0IHZhbHVlcyB3aXRoIDE2IGJpdCBzY2FsZSB2YWx1ZXMKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBUaGlzIG1hY3JvIGlzIHVzZWQgdG8gcHJlLXNjYWxlIGJsb2NrIG9mIDh4OCBpbnB1dC4KLSAgICAgICAgOy8vIFRoaXMgYWxzbyBkbyB0aGUgSXN0IHN0YWdlIHRyYW5zZm9ybWF0aW9ucyBvZiBJRENULgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBkWGpubG8gICAgICAgICAgLSBuIHRoIGlucHV0IEQgcmVnaXN0ZXIgd2l0aCBmaXJzdCBmb3VyIFMxNiB2YWx1ZXMKLSAgICAgICAgOy8vIGRYam5oaSAgICAgICAgICAtIG4gdGggaW5wdXQgRCByZWdpc3RlciB3aXRoIG5leHQgZm91ciBTMTYgdmFsdWVzCi0gICAgICAgIDsvLyBxWGpuICAgICAgICAgICAgLSBuIHRoIGlucHV0IFEgcmVnaXN0ZXIgd2l0aCBlaWdodCBTMTYgdmFsdWVzCi0gICAgICAgIDsvLyBwU2NhbGUgICAgICAgICAgLSBQb2ludGVyIHRvIHNjYWxlIHZhbHVlcwotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gcVhpbiAgICAgICAgICAgIC0gbiB0aCBvdXRwdXQgUSByZWdpc3RlciB3aXRoIGVpZ2h0IFMxNiBvdXRwdXQgdmFsdWVzIG9mIDFzdCBzdGFnZQotICAgICAgICA7Ly8KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9JRENUX1BSRVNDQUxFMTYKLSAgICAgICAgVkxEMSAgICAgICAgcVNjYWxlMSwgW3BTY2FsZV0sICMxNiAgICAgIDsvLyBMb2FkIFByZSBzY2FsZSBmb3Igcm93IDAKLSAgICAgICAgVkxEMSAgICAgICAgcVNjYWxlMiwgW3BTY2FsZV0sICMxNiAgICAgIDsvLyBMb2FkIFByZSBzY2FsZSBmb3Igcm93IDAKLSAgICAgICAgTV9JRENUX1NDQUxFMTYgZFhqMGxvLCBkWGowaGksIGRYajFsbywgZFhqMWhpLCAwICAgICAgICA7Ly8gUHJlIHNjYWxlIHJvdyAwICYgMQotICAgICAgICBNX0lEQ1RfU0NBTEUxNiBkWGoybG8sIGRYajJoaSwgZFhqM2xvLCBkWGozaGksIDAgICAgICAgIAotICAgICAgICBNX0lEQ1RfU0NBTEUxNiBkWGo0bG8sIGRYajRoaSwgZFhqNWxvLCBkWGo1aGksIDAgICAgICAgIAotICAgICAgICBNX0lEQ1RfU0NBTEUxNiBkWGo2bG8sIGRYajZoaSwgZFhqN2xvLCBkWGo3aGksIDEgICAgICAgIAotICAgICAgICBWSEFERCAgICAgICBxWGk1LCBxWGoxLCBxWGo3ICAgICAgICAgICAgOy8vIChqMStqNykvMgotICAgICAgICBWU1VCICAgICAgICBxWGk2LCBxWGoxLCBxWGo3ICAgICAgICAgICAgOy8vIGoxLWo3Ci0gICAgICAgIExEUiAgICAgICAgIHBTcmMsID1hcm1DT01NX0lEQ1RDb2VmIDsvLyBBZGRyZXNzIG9mIERDVCBpbnZlcnNlIEFBTiBjb25zdGFudHMKLSAgICAgICAgVkhBREQgICAgICAgcVhpMywgcVhqMiwgcVhqNiAgICAgICAgICAgIDsvLyAoajIrajYpLzIKLSAgICAgICAgVlNVQiAgICAgICAgcVhpMiwgcVhqMiwgcVhqNiAgICAgICAgICAgIDsvLyBqMi1qNgotICAgICAgICBWTERSICAgICAgICBkQ29lZnMsIFtwU3JjXSAgICAgICAgICAgICAgOy8vIExvYWQgRENUIGludmVyc2UgQUFOIGNvbnN0YW50cwotICAgICAgICBWSEFERCAgICAgICBxWGk3LCBxWGo1LCBxWGozICAgICAgICAgICAgOy8vIChqNStqMykvMgotICAgICAgICBWU1VCICAgICAgICBxWGk0LCBxWGo1LCBxWGozICAgICAgICAgICAgOy8vIGo1LWozCi0gICAgICAgIE1FTkQgICAgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIFNjYWxlIDh4OCBibG9jayBpbnB1dCB2YWx1ZXMgd2l0aCAzMiBiaXQgc2NhbGUgdmFsdWVzCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gVGhpcyBtYWNybyBpcyB1c2VkIHRvIHByZS1zY2FsZSBibG9jayBvZiA4eDggaW5wdXQuCi0gICAgICAgIDsvLyBUaGlzIGFsc28gZG8gdGhlIElzdCBzdGFnZSB0cmFuc2Zvcm1hdGlvbnMgb2YgSURDVC4KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gZFhqbmxvICAgICAgICAgIC0gbiB0aCBpbnB1dCBEIHJlZ2lzdGVyIHdpdGggZmlyc3QgZm91ciBTMTYgdmFsdWVzCi0gICAgICAgIDsvLyBkWGpuaGkgICAgICAgICAgLSBuIHRoIGlucHV0IEQgcmVnaXN0ZXIgd2l0aCBuZXh0IGZvdXIgUzE2IHZhbHVlcwotICAgICAgICA7Ly8gcVhqbiAgICAgICAgICAgIC0gbiB0aCBpbnB1dCBRIHJlZ2lzdGVyIHdpdGggZWlnaHQgUzE2IHZhbHVlcwotICAgICAgICA7Ly8gcFNjYWxlICAgICAgICAgIC0gUG9pbnRlciB0byAzMmJpdCBzY2FsZSB2YWx1ZXMgaW4gUTIzIGZvcm1hdAotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gZFhpbmxvICAgICAgICAgIC0gbiB0aCBvdXRwdXQgRCByZWdpc3RlciB3aXRoIGZpcnN0IGZvdXIgUzE2IG91dHB1dCB2YWx1ZXMgb2YgMXN0IHN0YWdlCi0gICAgICAgIDsvLyBkWGluaGkgICAgICAgICAgLSBuIHRoIG91dHB1dCBEIHJlZ2lzdGVyIHdpdGggbmV4dCBmb3VyIFMxNiBvdXRwdXQgdmFsdWVzIG9mIDFzdCBzdGFnZQotICAgICAgICA7Ly8KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9JRENUX1BSRVNDQUxFMzIKLXFTY2FsZTBsbyAgICAgICBRTiAwLlMzMgotcVNjYWxlMGhpICAgICAgIFFOIDEuUzMyCi1xU2NhbGUxbG8gICAgICAgUU4gMi5TMzIKLXFTY2FsZTFoaSAgICAgICBRTiAzLlMzMgotcVNjYWxlMmxvICAgICAgIFFOIHFTY2FsZTFsbwotcVNjYWxlMmhpICAgICAgIFFOIHFTY2FsZTFoaQotcVNjYWxlM2xvICAgICAgIFFOIHFTY2FsZTFsbwotcVNjYWxlM2hpICAgICAgIFFOIHFTY2FsZTFoaQotcVNjYWxlNGxvICAgICAgIFFOIHFTY2FsZTFsbwotcVNjYWxlNGhpICAgICAgIFFOIHFTY2FsZTFoaQotcVNjYWxlNWxvICAgICAgIFFOIHFTY2FsZTBsbwotcVNjYWxlNWhpICAgICAgIFFOIHFTY2FsZTBoaQotcVNjYWxlNmxvICAgICAgIFFOIHFTY2FsZTBsbwotcVNjYWxlNmhpICAgICAgIFFOIHFTY2FsZTBoaQotcVNjYWxlN2xvICAgICAgIFFOIHFTY2FsZTBsbwotcVNjYWxlN2hpICAgICAgIFFOIHFTY2FsZTBoaQotCi1xU3JjMGxvICAgICAgICAgUU4gNC5TMzIKLXFTcmMwaGkgICAgICAgICBRTiA1LlMzMgotcVNyYzFsbyAgICAgICAgIFFOIDYuUzMyCi1xU3JjMWhpICAgICAgICAgUU4gU3JjNC5TMzIKLXFTcmMybG8gICAgICAgICBRTiBxU3JjMGxvCi1xU3JjMmhpICAgICAgICAgUU4gcVNyYzBoaQotcVNyYzNsbyAgICAgICAgIFFOIHFTcmMwbG8KLXFTcmMzaGkgICAgICAgICBRTiBxU3JjMGhpCi1xU3JjNGxvICAgICAgICAgUU4gcVNyYzBsbwotcVNyYzRoaSAgICAgICAgIFFOIHFTcmMwaGkKLXFTcmM1bG8gICAgICAgICBRTiBxU3JjMWxvCi1xU3JjNWhpICAgICAgICAgUU4gcVNyYzFoaQotcVNyYzZsbyAgICAgICAgIFFOIHFTcmMxbG8KLXFTcmM2aGkgICAgICAgICBRTiBxU3JjMWhpCi1xU3JjN2xvICAgICAgICAgUU4gcVNyYzBsbwotcVNyYzdoaSAgICAgICAgIFFOIHFTcmMwaGkKLQotcVJlczE3bG8gICAgICAgIFFOIHFTY2FsZTBsbwotcVJlczE3aGkgICAgICAgIFFOIHFTY2FsZTBoaQotcVJlczI2bG8gICAgICAgIFFOIHFTY2FsZTBsbwotcVJlczI2aGkgICAgICAgIFFOIHFTY2FsZTBoaQotcVJlczUzbG8gICAgICAgIFFOIHFTY2FsZTBsbwotcVJlczUzaGkgICAgICAgIFFOIHFTY2FsZTBoaQotCi0gICAgICAgICAgICBBREQgICAgICAgICBwVGVtcCwgcFNjYWxlLCAjNCo4KjcgICAgICAgICAgIDsvLyBBZGRyZXNzIG9mICBwU2NhbGVbN10KLSAgICAgICAgICAgIAotICAgICAgICAgICAgOy8vIFJvdyAwCi0gICAgICAgICAgICBWTEQxICAgICAgICB7cVNjYWxlMGxvLCBxU2NhbGUwaGl9LCBbcFNjYWxlXSEKLSAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmMwbG8sIGRYajBsbywgIygxMi0xKQotICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzBoaSwgZFhqMGhpLCAjKDEyLTEpICAgICAgICAgICAgCi0gICAgICAgICAgICBWTEQxICAgICAgICB7cVNjYWxlMWxvLCBxU2NhbGUxaGl9LCBbcFNjYWxlXSEKLSAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmMwbG8sIHFTY2FsZTBsbywgcVNyYzBsbwotICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzBoaSwgcVNjYWxlMGhpLCBxU3JjMGhpCi0gICAgICAgICAgICBWTEQxICAgICAgICB7cVNjYWxlN2xvLCBxU2NhbGU3aGl9LCBbcFRlbXBdIQotICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzFsbywgZFhqMWxvLCAjKDEyLTEpCi0gICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjMWhpLCBkWGoxaGksICMoMTItMSkgICAgICAgICAgICAKLSAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTBsbywgcVNyYzBsbyAgICAgICAgICAgICAgICAgOy8vIE91dHB1dCBpMAotICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpMGhpLCBxU3JjMGhpCi0gICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjN2xvLCBkWGo3bG8sICMoMTItMSkKLSAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmM3aGksIGRYajdoaSwgIygxMi0xKQotICAgICAgICAgICAgU1VCICAgICAgICAgcFRlbXAsIHBUZW1wLCAjKCgxNioyKSsoNCo4KjEpKQotICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzFsbywgcVNjYWxlMWxvLCBxU3JjMWxvCi0gICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjMWhpLCBxU2NhbGUxaGksIHFTcmMxaGkKLSAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmM3bG8sIHFTY2FsZTdsbywgcVNyYzdsbwotICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzdoaSwgcVNjYWxlN2hpLCBxU3JjN2hpCi0gICAgICAgICAgICBWTEQxICAgICAgICB7cVNjYWxlMmxvLCBxU2NhbGUyaGl9LCBbcFNjYWxlXSEKLQotICAgICAgICAgICAgOy8vIFJvdyAxICYgNwotICAgICAgICAgICAgVkhBREQgICAgICAgcVJlczE3bG8sIHFTcmMxbG8sIHFTcmM3bG8gICAgICA7Ly8gKGoxK2o3KS8yCi0gICAgICAgICAgICBWSEFERCAgICAgICBxUmVzMTdoaSwgcVNyYzFoaSwgcVNyYzdoaSAgICAgIDsvLyAoajErajcpLzIKLSAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTVsbywgcVJlczE3bG8gICAgICAgICAgICAgICAgOy8vIE91dHB1dCBpNQotICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpNWhpLCBxUmVzMTdoaSAgICAgICAgICAgICAgCi0gICAgICAgICAgICBWU1VCICAgICAgICBxUmVzMTdsbywgcVNyYzFsbywgcVNyYzdsbyAgICAgIDsvLyBqMS1qNwotICAgICAgICAgICAgVlNVQiAgICAgICAgcVJlczE3aGksIHFTcmMxaGksIHFTcmM3aGkgICAgICA7Ly8gajEtajcKLSAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTZsbywgcVJlczE3bG8gICAgICAgICAgICAgICAgOy8vIE91dHB1dCBpNgotICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpNmhpLCBxUmVzMTdoaSAgICAgIAotICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzJsbywgZFhqMmxvLCAjKDEyLTEpCi0gICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjMmhpLCBkWGoyaGksICMoMTItMSkKLSAgICAgICAgICAgIFZMRDEgICAgICAgIHtxU2NhbGU2bG8sIHFTY2FsZTZoaX0sIFtwVGVtcF0hCi0gICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjNmxvLCBkWGo2bG8sICMoMTItMSkKLSAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmM2aGksIGRYajZoaSwgIygxMi0xKQotICAgICAgICAgICAgU1VCICAgICAgICAgcFRlbXAsIHBUZW1wLCAjKCgxNioyKSsoNCo4KjEpKQotICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzJsbywgcVNjYWxlMmxvLCBxU3JjMmxvCi0gICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjMmhpLCBxU2NhbGUyaGksIHFTcmMyaGkKLSAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmM2bG8sIHFTY2FsZTZsbywgcVNyYzZsbwotICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzZoaSwgcVNjYWxlNmhpLCBxU3JjNmhpCi0gICAgICAgICAgICBWTEQxICAgICAgICB7cVNjYWxlM2xvLCBxU2NhbGUzaGl9LCBbcFNjYWxlXSEKLQotICAgICAgICAgICAgOy8vIFJvdyAyICYgNgotICAgICAgICAgICAgVkhBREQgICAgICAgcVJlczI2bG8sIHFTcmMybG8sIHFTcmM2bG8gICAgICA7Ly8gKGoyK2o2KS8yCi0gICAgICAgICAgICBWSEFERCAgICAgICBxUmVzMjZoaSwgcVNyYzJoaSwgcVNyYzZoaSAgICAgIDsvLyAoajIrajYpLzIKLSAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTNsbywgcVJlczI2bG8gICAgICAgICAgICAgICAgOy8vIE91dHB1dCBpMwotICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpM2hpLCBxUmVzMjZoaSAgICAgICAgICAgICAgCi0gICAgICAgICAgICBWU1VCICAgICAgICBxUmVzMjZsbywgcVNyYzJsbywgcVNyYzZsbyAgICAgIDsvLyBqMi1qNgotICAgICAgICAgICAgVlNVQiAgICAgICAgcVJlczI2aGksIHFTcmMyaGksIHFTcmM2aGkgICAgICA7Ly8gajItajYKLSAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTJsbywgcVJlczI2bG8gICAgICAgICAgICAgICAgOy8vIE91dHB1dCBpMgotICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpMmhpLCBxUmVzMjZoaSAgICAgIAotICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzNsbywgZFhqM2xvLCAjKDEyLTEpCi0gICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjM2hpLCBkWGozaGksICMoMTItMSkKLSAgICAgICAgICAgIFZMRDEgICAgICAgIHtxU2NhbGU1bG8sIHFTY2FsZTVoaX0sIFtwVGVtcF0hCi0gICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjNWxvLCBkWGo1bG8sICMoMTItMSkKLSAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmM1aGksIGRYajVoaSwgIygxMi0xKQotICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzNsbywgcVNjYWxlM2xvLCBxU3JjM2xvCi0gICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjM2hpLCBxU2NhbGUzaGksIHFTcmMzaGkKLSAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmM1bG8sIHFTY2FsZTVsbywgcVNyYzVsbwotICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzVoaSwgcVNjYWxlNWhpLCBxU3JjNWhpCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIDsvLyBSb3cgMyAmIDUKLSAgICAgICAgICAgIFZIQUREICAgICAgIHFSZXM1M2xvLCBxU3JjNWxvLCBxU3JjM2xvICAgICAgOy8vIChqNStqMykvMgotICAgICAgICAgICAgVkhBREQgICAgICAgcVJlczUzaGksIHFTcmM1aGksIHFTcmMzaGkgICAgICA7Ly8gKGo1K2ozKS8yCi0gICAgICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCAjMTYqMioyCi0gICAgICAgICAgICBWTU9WTiAgICAgICBkWGk3bG8sIHFSZXM1M2xvICAgICAgICAgICAgICAgIDsvLyBPdXRwdXQgaTcKLSAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTdoaSwgcVJlczUzaGkgICAgICAgICAgICAgIAotICAgICAgICAgICAgVlNVQiAgICAgICAgcVJlczUzbG8sIHFTcmM1bG8sIHFTcmMzbG8gICAgICA7Ly8gajUtajMKLSAgICAgICAgICAgIFZTVUIgICAgICAgIHFSZXM1M2hpLCBxU3JjNWhpLCBxU3JjM2hpICAgICAgOy8vIGo1LWozCi0gICAgICAgICAgICBWTEQxICAgICAgICBxWGo0LCBbcFNyYyBANjRdCi0gICAgICAgICAgICBWTU9WTiAgICAgICBkWGk0bG8sIHFSZXM1M2xvICAgICAgICAgICAgICAgIDsvLyBPdXRwdXQgaTQKLSAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTRoaSwgcVJlczUzaGkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmM0bG8sIGRYajRsbywgIygxMi0xKQotICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzRoaSwgZFhqNGhpLCAjKDEyLTEpCi0gICAgICAgICAgICBWTEQxICAgICAgICB7cVNjYWxlNGxvLCBxU2NhbGU0aGl9LCBbcFNjYWxlXSAgICAgICAgICAgIAotICAgICAgICAgICAgTERSICAgICAgICAgcFNyYywgPWFybUNPTU1fSURDVENvZWYgICAgIDsvLyBBZGRyZXNzIG9mIERDVCBpbnZlcnNlIEFBTiBjb25zdGFudHMKLSAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmM0bG8sIHFTY2FsZTRsbywgcVNyYzRsbwotICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzRoaSwgcVNjYWxlNGhpLCBxU3JjNGhpCi0gICAgICAgICAgICBWTERSICAgICAgICBkQ29lZnMsIFtwU3JjXSAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIERDVCBpbnZlcnNlIEFBTiBjb25zdGFudHMKLSAgICAgICAgICAgIDsvLyBSb3cgNAotICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpMWxvLCBxU3JjNGxvICAgICAgICAgICAgICAgICA7Ly8gT3V0cHV0IGkxCi0gICAgICAgICAgICBWTU9WTiAgICAgICBkWGkxaGksIHFTcmM0aGkgICAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgTUVORAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NX01hc2tUYWJsZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NX01hc2tUYWJsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjQ2ZjE1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtQ09NTV9NYXNrVGFibGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1DT01NX01hc2tUYWJsZS5oCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogTWFzayBUYWJsZSB0byBtYXNrIHRoZSBlbmQgb2YgYXJyYXkKLSAqLwotIAotCi0KLSNpZm5kZWYgX0FSTUNPTU1fTUFTS1RBQkxFX0hfCi0jZGVmaW5lIF9BUk1DT01NX01BU0tUQUJMRV9IXwotCi0jZGVmaW5lIE1hc2tUYWJsZVNpemUgNzIKLSAgCi0vKiBNYXNrIHRhYmxlICovCi0KLWV4dGVybiBjb25zdCBPTVhfVTE2IGFybUNPTU1fcU1hc2tUYWJsZTE2W01hc2tUYWJsZVNpemVdOwotZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1DT01NX3FNYXNrVGFibGU4W01hc2tUYWJsZVNpemVdOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtQ09NTV9WZXJzaW9uLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU1fVmVyc2lvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2U1YjJiLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtQ09NTV9WZXJzaW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKiBHdWFyZCB0aGUgaGVhZGVyIGFnYWluc3QgbXVsdGlwbGUgaW5jbHVzaW9uLiAqLwotI2lmbmRlZiBfX0FSTV9DT01NX1ZFUlNJT05fSF9fCi0jZGVmaW5lIF9fQVJNX0NPTU1fVkVSU0lPTl9IX18KLQotCi0vKiBUaGUgZm9sbG93aW5nIGxpbmUgc2hvdWxkIGJlIGluIG9teHR5cGVzLmggYnV0IGhhc24ndCBiZWVuIGFwcHJvdmVkIGJ5IE9wZW5NQVggeWV0ICovCi0jZGVmaW5lIE9NWF9WRVJTSU9OIDEwMgotCi0vKiBXZSBuZWVkIHRvIGRlZmluZSB0aGVzZSBtYWNyb3MgaW4gb3JkZXIgdG8gY29udmVydCBhICNkZWZpbmUgbnVtYmVyIGludG8gYSAjZGVmaW5lIHN0cmluZy4gKi8KLSNkZWZpbmUgQVJNX1FVT1RFKGEpICNhCi0jZGVmaW5lIEFSTV9JTkRJUkVDVChBKSBBUk1fUVVPVEUoQSkKLQotLyogQ29udmVydCB0aGUgT01YX1ZFUlNJT04gbnVtYmVyIGludG8gYSBzdHJpbmcgdGhhdCBjYW4gYmUgdXNlZCwgZm9yIGV4YW1wbGUsIHRvIHByaW50IGl0IG91dC4gKi8KLSNkZWZpbmUgQVJNX1ZFUlNJT05fU1RSSU5HIEFSTV9JTkRJUkVDVChPTVhfVkVSU0lPTikKLQotCi0vKiBEZWZpbmUgdGhpcyBpbiBvcmRlciB0byB0dXJuIG9uIEFSTSB2ZXJzaW9uL3JlbGVhc2UvYnVpbGQgc3RyaW5ncyBpbiBlYWNoIGRvbWFpbiAqLwotI2RlZmluZSBBUk1fSU5DTFVERV9WRVJTSU9OX0RFU0NSSVBUSU9OUwotCi0jaWZkZWYgQVJNX0lOQ0xVREVfVkVSU0lPTl9ERVNDUklQVElPTlMKLSAgZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb25zdCBvbXhBQ19WZXJzaW9uRGVzY3JpcHRpb247Ci0gIGV4dGVybiBjb25zdCBjaGFyICogY29uc3Qgb214SUNfVmVyc2lvbkRlc2NyaXB0aW9uOwotICBleHRlcm4gY29uc3QgY2hhciAqIGNvbnN0IG9teElQX1ZlcnNpb25EZXNjcmlwdGlvbjsKLSAgZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb25zdCBvbXhTUF9WZXJzaW9uRGVzY3JpcHRpb247Ci0gIGV4dGVybiBjb25zdCBjaGFyICogY29uc3Qgb214VkNfVmVyc2lvbkRlc2NyaXB0aW9uOwotI2VuZGlmIC8qIEFSTV9JTkNMVURFX1ZFUlNJT05fREVTQ1JJUFRJT05TICovCi0KLQotLyogVGhlIGZvbGxvd2luZyBlbnRyaWVzIHNob3VsZCBiZSBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgYnkgdGhlIHJlbGVhc2Ugc2NyaXB0ICovCi0vKiBUaGV5IGFyZSB1c2VkIGluIHRoZSBBUk0gdmVyc2lvbiBzdHJpbmdzIGRlZmluZWQgZm9yIGVhY2ggZG9tYWluLiAgICAgICAgICAgICAqLwotCi0vKiBUaGUgcmVsZWFzZSB0YWcgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVsZWFzZSBvZiB0aGUgbGlicmFyeS4gLSB1c2VkIGZvciBzb3VyY2UgYW5kIG9iamVjdCByZWxlYXNlcyAqLwotI2RlZmluZSBPTVhfQVJNX1JFTEVBU0VfVEFHICAicjBwMC0wMGJldDEiCi0KLS8qIFRoZSBBUk0gYXJjaGl0ZWN0dXJlIHVzZWQgdG8gYnVpbGQgYW55IG9iamVjdHMgb3IgZXhlY3V0YWJsZXMgaW4gdGhpcyByZWxlYXNlLiAqLwotI2RlZmluZSBPTVhfQVJNX0JVSUxEX0FSQ0hJVEVDVFVSRSAiQVJNIEFyY2hpdGVjdHVyZSBWNiIKLQotLyogVGhlIEFSTSBUb29sY2hhaW4gdXNlZCB0byBidWlsZCBhbnkgb2JqZWN0cyBvciBleGVjdXRhYmxlcyBpbiB0aGlzIHJlbGVhc2UuICovCi0jZGVmaW5lIE9NWF9BUk1fQlVJTERfVE9PTENIQUlOICAgICJBUk0gUlZDVCAzLjEiCi0KLQotI2VuZGlmIC8qIF9fQVJNX0NPTU1fVkVSU0lPTl9IX18gKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NX3MuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtQ09NTV9zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NzM1YTkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NX3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDExNjggKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIGFybUNPTU1fcy5oCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgOTY0MQotOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLTsvLyBBUk0gb3B0aW1pemVkIE9wZW5NQVggY29tbW9uIGhlYWRlciBmaWxlCi07Ly8KLQotOy8vIFByb3RlY3QgYWdhaW5zdCBtdWx0aXBsZSBpbmNsdXNpb24KLSBJRiA6TE5PVDo6REVGOkFSTUNPTU1fU19ICi0gR0JMTCBBUk1DT01NX1NfSAotCi0gICAgICAgIFJFUVVJUkU4ICAgICAgICAgICAgOy8vIFJlcXVpcmVzIDgtYnl0ZSBzdGFjayBhbGlnbm1lbnQKLSAgICAgICAgUFJFU0VSVkU4ICAgICAgICAgICA7Ly8gUHJlc2VydmVzIDgtYnl0ZSBzdGFjayBhbGlnbm1lbnQKLSAgICAgICAgCi0gICAgICAgIEdCTEwgICAgQVJNX0VSUk9SQ0hFQ0sKLUFSTV9FUlJPUkNIRUNLICBTRVRMIHtGQUxTRX0KLQotOy8vIEdsb2JhbHMKLQotICAgICAgICBHQkxTICAgIF9SUmVnTGlzdCAgIDsvLyBSIHNhdmVkIHJlZ2lzdGVyIGxpc3QKLSAgICAgICAgR0JMUyAgICBfRFJlZ0xpc3QgICA7Ly8gRCBzYXZlZCByZWdpc3RlciBsaXN0Ci0gICAgICAgIEdCTFMgICAgX1ZhcmlhbnQgICAgOy8vIFNlbGVjdGVkIHByb2Nlc3NvciB2YXJpYW50Ci0gICAgICAgIEdCTFMgICAgX0NQVSAgICAgICAgOy8vIENQVSBuYW1lCi0gICAgICAgIEdCTFMgICAgX1N0cnVjdCAgICAgOy8vIFN0cnVjdHVyZSBuYW1lCi0gICAgICAgIAotICAgICAgICBHQkxMICAgIF9JbkZ1bmMgICAgIDsvLyBJbnNpZGUgZnVuY3Rpb24gYXNzZW1ibHkgZmxhZwotICAgICAgICBHQkxMICAgIF9Td0xvbmcgICAgIDsvLyBMb25nIHN3aXRjaCBmbGFnCi0gICAgICAgIAotICAgICAgICBHQkxBICAgIF9SQnl0ZXMgICAgIDsvLyBOdW1iZXIgb2YgcmVnaXN0ZXIgYnl0ZXMgb24gc3RhY2sKLSAgICAgICAgR0JMQSAgICBfU0J5dGVzICAgICA7Ly8gTnVtYmVyIG9mIHNjcmF0Y2ggYnl0ZXMgb24gc3RhY2sgCi0gICAgICAgIEdCTEEgICAgX0FCeXRlcyAgICAgOy8vIFN0YWNrIG9mZnNldCBvZiBuZXh0IGFyZ3VtZW50Ci0gICAgICAgIEdCTEEgICAgX1dvcmtzcGFjZSAgOy8vIFN0YWNrIG9mZnNldCBvZiBzY3JhdGNoIHdvcmtzcGFjZQotICAgICAgICBHQkxBICAgIF9GICAgICAgICAgIDsvLyBGdW5jdGlvbiBudW1iZXIKLSAgICAgICAgR0JMQSAgICBfU3RPZmYgICAgICA7Ly8gU3RydWN0IG9mZnNldAotICAgICAgICBHQkxBICAgIF9Td051bSAgICAgIDsvLyBTd2l0Y2ggbnVtYmVyCi0gICAgICAgIEdCTFMgICAgXzMyICAgICAgICAgOy8vIFN1ZmZpeCBmb3IgMzIgYnl0ZSBhbGlnbm1uZXQKLSAgICAgICAgR0JMUyAgICBfMTYgICAgICAgICA7Ly8gU3VmZml4IGZvciAxNiBieXRlIGFsaWdubW5ldAotICAgICAgICAKLV9JbkZ1bmMgICAgICAgICBTRVRMICAgIHtGQUxTRX0KLV9TQnl0ZXMgICAgICAgICBTRVRBICAgIDAKLV9GICAgICAgICAgICAgICBTRVRBICAgIDAKLV9Td051bSAgICAgICAgICBTRVRBICAgIDAKLV8zMiAgICAgICAgICAgICBTRVRTICAgICJBTElHTjMyIgotXzE2ICAgICAgICAgICAgIFNFVFMgICAgIkFMSUdOMTYiCi0KLTsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLTsvLyBPdmVycmlkZSB0aGUgdG9vbHMgc2V0dGluZ3Mgb2YgdGhlIENQVSBpZiB0aGUgI2RlZmluZQotOy8vIFVTRUNQVSBpcyBzZXQsIG90aGVyd2lzZSB1c2UgdGhlIENQVSBkZWZpbmVkIGJ5IHRoZQotOy8vIGFzc2VtYmxlciBzZXR0aW5ncy4KLTsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgICAgIElGIDpERUY6IE9WRVJSSURFQ1BVCi1fQ1BVICAgICAgIFNFVFMgIE9WRVJSSURFQ1BVCi0gICAgICAgRUxTRQotX0NQVSAgICAgICBTRVRTICAgIHtDUFV9ICAgICAgIAotICAgICAgIEVORElGCi0KLQotCi07Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi07Ly8gV29yayBvdXQgd2hpY2ggY29kZSB0byBidWlsZAotOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgICAgIElGIDpERUY6QVJNMTEzNkpTOkxPUjo6REVGOkNvcnRleEE4OkxPUjo6REVGOkFSTV9HRU5FUklDCi0gICAgICAgICAgICBJTkZPIDEsIlBsZWFzZSBzd2l0Y2ggdG8gdXNpbmcgTV9WQVJJQU5UUyIKLSAgICAgICAgRU5ESUYKLQotICAgICAgICA7Ly8gRGVmaW5lIGFuZCByZXNldCBhbGwgb2ZmaWNpYWxseSByZWNvbmduaXNlZCB2YXJpYW50cwotICAgICAgICBNQUNSTwotICAgICAgICBfTV9ERUZfVkFSSUFOVFMKLSAgICAgICAgX01fREVGX1ZBUklBTlQgQVJNOTI2RUpTCi0gICAgICAgIF9NX0RFRl9WQVJJQU5UIEFSTTExMzZKUwotICAgICAgICBfTV9ERUZfVkFSSUFOVCBBUk0xMTM2SlNfVQotICAgICAgICBfTV9ERUZfVkFSSUFOVCBDb3J0ZXhBOAotICAgICAgICBfTV9ERUZfVkFSSUFOVCBBUk03VERNSQotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBfTV9ERUZfVkFSSUFOVCAkdmFyCi0gICAgICAgIEdCTEwgJHZhcgotICAgICAgICBHQkxMIF9vayR2YXIKLSR2YXIgICAgU0VUTCB7RkFMU0V9Ci0gICAgICAgIE1FTkQgICAgICAgIAotICAgICAgICAKLQotICAgICAgICA7Ly8gVmFyaWFudCBkZWNsYXJhdGlvbgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIERlZmluZSBhIGxpc3Qgb2YgY29kZSB2YXJpYW50cyBzdXBwb3J0ZWQgYnkgdGhpcwotICAgICAgICA7Ly8gc291cmNlIGZpbGUuIFRoaXMgbWFjcm8gdGhlbiBjaG9vc2VzIHRoZSBtb3N0Ci0gICAgICAgIDsvLyBhcHByb3ByaWF0ZSB2YXJpYW50IHRvIGJ1aWxkIGZvciB0aGUgY3VycmVudGx5IGNvbmZpZ3VyZWQKLSAgICAgICAgOy8vIGNvcmUuCi0gICAgICAgIDsvLyAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fVkFSSUFOVFMgJHYwLCR2MSwkdjIsJHYzLCR2NCwkdjUsJHY2LCR2NyAgICAgICAgCi0gICAgICAgIDsvLyBTZXQgdG8gVFJVRSB2YXJpYW50cyB0aGF0IGFyZSBzdXBwb3J0ZWQKLSAgICAgICAgX01fREVGX1ZBUklBTlRTCi0gICAgICAgIF9NX1ZBUklBTlQgJHYwCi0gICAgICAgIF9NX1ZBUklBTlQgJHYxCi0gICAgICAgIF9NX1ZBUklBTlQgJHYyCi0gICAgICAgIF9NX1ZBUklBTlQgJHYzCi0gICAgICAgIF9NX1ZBUklBTlQgJHY0Ci0gICAgICAgIF9NX1ZBUklBTlQgJHY1Ci0gICAgICAgIF9NX1ZBUklBTlQgJHY2Ci0gICAgICAgIF9NX1ZBUklBTlQgJHY3Ci0gICAgICAgIAotICAgICAgICA7Ly8gTG9vayBmb3IgZmlyc3QgYXZhaWxhYmxlIHZhcmlhbnQgdG8gbWF0Y2ggYSBDUFUKLSAgICAgICAgOy8vIF9NX1RSWSBjcHUsIHZhcmlhbnQgZmFsbCBiYWNrIGxpc3QKLV9WYXJpYW50IFNFVFMgIiIgICAgICAgICAgICAgICAgCi0gICAgICAgIF9NX1RSWSBBUk05MjZFSi1TLCAgIEFSTTkyNkVKUwotICAgICAgICBfTV9UUlkgQVJNMTE3NkpaLVMsICBBUk0xMTM2SlMKLSAgICAgICAgX01fVFJZIEFSTTExNzZKWkYtUywgQVJNMTEzNkpTCi0gICAgICAgIF9NX1RSWSBBUk0xMTU2VDItUywgIEFSTTExMzZKUwotICAgICAgICBfTV9UUlkgQVJNMTE1NlQyRi1TLCBBUk0xMTM2SlMKLSAgICAgICAgX01fVFJZIEFSTTExMzZKLVMsICAgQVJNMTEzNkpTCi0gICAgICAgIF9NX1RSWSBBUk0xMTM2SkYtUywgIEFSTTExMzZKUwotICAgICAgICBfTV9UUlkgTVBDb3JlLCAgICAgICBBUk0xMTM2SlMKLSAgICAgICAgX01fVFJZIENvcnRleC1BOCwgICAgQ29ydGV4QTgsIEFSTTExMzZKUwotICAgICAgICBfTV9UUlkgQ29ydGV4LVI0LCAgICBBUk0xMTM2SlMKLSAgICAgICAgX01fVFJZIEFSTTdURE1JCi0gICAgICAgIAotICAgICAgICA7Ly8gU2VsZWN0IHRoZSBjb3JyZWN0IHZhcmlhbnQKLSAgICAgICAgX01fREVGX1ZBUklBTlRTCi0gICAgICAgIElGIF9WYXJpYW50PSIiCi0gICAgICAgICAgICBJTkZPIDEsICJObyBtYXRjaCBmb3VuZCBmb3IgQ1BVICckX0NQVSciCi0gICAgICAgIEVMU0UKLSRfVmFyaWFudCAgIFNFVEwge1RSVUV9Ci0gICAgICAgIEVORElGCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLyBSZWdpc3RlciBhIHZhcmlhbnQgYXMgYXZhaWxhYmxlCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIF9NX1ZBUklBTlQgJHZhcgotICAgICAgICBJRiAiJHZhciI9IiIKLSAgICAgICAgICAgIE1FWElUCi0gICAgICAgIEVORElGCi0gICAgICAgIElGIDpMTk9UOjpERUY6X29rJHZhcgotICAgICAgICAgICAgSU5GTyAxLCAiVW5yZWNvZ25pemVkIHZhcmlhbnQgJyR2YXInIgotICAgICAgICBFTkRJRgotJHZhciAgICBTRVRMIHtUUlVFfQotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8gRm9yIGEgZ2l2ZW4gQ1BVLCBzZWUgaWYgYW55IG9mIHRoZSB2YXJpYW50cyBzdXBwb3J0aW5nCi0gICAgICAgIDsvLyB0aGlzIENQVSBhcmUgYXZhaWxhYmxlLiBUaGUgZmlyc3QgYXZhaWxhYmxlIHZhcmlhbnQgaXMKLSAgICAgICAgOy8vIGNob3NlbgotICAgICAgICBNQUNSTwotICAgICAgICBfTV9UUlkgJGNwdSwgJHYwLCR2MSwkdjIsJHYzLCR2NCwkdjUsJHY2LCR2NwotICAgICAgICBJRiAiJGNwdSI8Pl9DUFUKLSAgICAgICAgICAgIE1FWElUCi0gICAgICAgIEVORElGCi0gICAgICAgIF9NX1RSWTEgJHYwCi0gICAgICAgIF9NX1RSWTEgJHYxCi0gICAgICAgIF9NX1RSWTEgJHYyCi0gICAgICAgIF9NX1RSWTEgJHYzCi0gICAgICAgIF9NX1RSWTEgJHY0Ci0gICAgICAgIF9NX1RSWTEgJHY1Ci0gICAgICAgIF9NX1RSWTEgJHY2Ci0gICAgICAgIF9NX1RSWTEgJHY3Ci0gICAgICAgIDsvLyBDaGVjayBhIG1hdGNoIHdhcyBmb3VuZAotICAgICAgICBJRiBfVmFyaWFudD0iIgotICAgICAgICAgICAgSU5GTyAxLCAiTm8gdmFyaWFudCBtYXRjaCBmb3VuZCBmb3IgQ1BVICckX0NQVSciCi0gICAgICAgIEVORElGCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIF9NX1RSWTEgJHZhcgotICAgICAgICBJRiAiJHZhciI9IiIKLSAgICAgICAgICAgIE1FWElUCi0gICAgICAgIEVORElGCi0gICAgICAgIElGIChfVmFyaWFudD0iIik6TEFORDokdmFyCi1fVmFyaWFudCBTRVRTICIkdmFyIgotICAgICAgICBFTkRJRgotICAgICAgICBNRU5ECi0gICAgICAgIAotOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi07Ly8gU3RydWN0dXJlIGRlZmluaXRpb24KLTsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgICAgIDsvLyBEZWNsYXJlIGEgc3RydWN0dXJlIG9mIGdpdmVuIG5hbWUKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9TVFJVQ1QgJHNuYW1lCi1fU3RydWN0IFNFVFMgIiRzbmFtZSIKLV9TdE9mZiAgU0VUQSAwCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLyBEZWNsYXJlIGEgc3RydWN0dXJlIGZpZWxkCi0gICAgICAgIDsvLyBUaGUgZmllbGQgaXMgY2FsbGVkICRzbmFtZV8kZm5hbWUKLSAgICAgICAgOy8vICRzaXplICAgPSB0aGUgc2l6ZSBvZiBlYWNoIGVudHJ5LCBtdXN0IGJlIHBvd2VyIG9mIDIgCi0gICAgICAgIDsvLyAkbnVtYmVyID0gKGlmIHByb3ZpZGVkKSB0aGUgbnVtYmVyIG9mIGVudHJpZXMgZm9yIGFuIGFycmF5Ci0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fRklFTEQgJGZuYW1lLCAkc2l6ZSwgJG51bWJlcgotICAgICAgICBJRiAoX1N0T2ZmOkFORDooJHNpemUtMSkpIT0wCi1fU3RPZmYgICAgICBTRVRBIF9TdE9mZiArICgkc2l6ZSAtIChfU3RPZmY6QU5EOigkc2l6ZS0xKSkpCi0gICAgICAgIEVORElGCi0kX1N0cnVjdC5fJGZuYW1lIEVRVSBfU3RPZmYKLSAgICAgICAgSUYgIiRudW1iZXIiPD4iIgotX1N0T2ZmICAgICAgU0VUQSBfU3RPZmYgKyAkc2l6ZSokbnVtYmVyCi0gICAgICAgIEVMU0UKLV9TdE9mZiAgICAgIFNFVEEgX1N0T2ZmICsgJHNpemUKLSAgICAgICAgRU5ESUYKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fRU5EU1RSVUNUCi1zaXplb2ZfJF9TdHJ1Y3QgRVFVIF9TdE9mZgotX1N0cnVjdCBTRVRTICIiCi0gICAgICAgIE1FTkQKLQotOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLTsvLyBTd2l0Y2ggYW5kIHRhYmxlIG1hY3JvcwotOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgICAgICA7Ly8gU3RhcnQgYSByZWxhdGl2ZSBzd2l0Y2ggdGFibGUgd2l0aCByZWdpc3RlciB0byBzd2l0Y2ggb24KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkdiA9IHRoZSByZWdpc3RlciB0byBzd2l0Y2ggb24KLSAgICAgICAgOy8vICRzID0gaWYgc3BlY2lmaWVkIG11c3QgYmUgIkwiIHRvIGluZGljYXRlIGxvbmcKLSAgICAgICAgOy8vICAgICAgdGhpcyBhbGxvd3MgYSBncmVhdGVyIHJhbmdlIHRvIHRoZSBjYXNlIGNvZGUKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9TV0lUQ0ggJHYsICRzCi0gICAgICAgIEFTU0VSVCAiJHMiPSIiOkxPUjoiJHMiPSJMIgotX1N3TG9uZyBTRVRMIHtGQUxTRX0KLSAgICAgICAgSUYgIiRzIj0iTCIKLV9Td0xvbmcgICAgIFNFVEwge1RSVUV9Ci0gICAgICAgIEVORElGCi1fU3dOdW0gIFNFVEEgX1N3TnVtKzEgICAgICAgIAotICAgICAgICBJRiB7Q09ORklHfT0xNgotICAgICAgICAgICAgOy8vIFRodW1iCi0gICAgICAgICAgICBJRiBfU3dMb25nCi0gICAgICAgICAgICAgICAgVEJIIFtwYywgJHYsIExTTCMxXQotICAgICAgICAgICAgRUxTRQotICAgICAgICAgICAgICAgIFRCQiBbcGMsICR2XQotICAgICAgICAgICAgRU5ESUYKLV9Td2l0Y2gkX1N3TnVtCi0gICAgICAgIEVMU0UKLSAgICAgICAgICAgIDsvLyBBUk0KLSAgICAgICAgICAgIEFERCBwYywgcGMsICR2LCBMU0wgIzIKLSAgICAgICAgICAgIE5PUAotICAgICAgICBFTkRJRgotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8gQWRkIGEgY2FzZSB0byB0aGUgc3dpdGNoIHN0YXRlbWVudAotICAgICAgICBNQUNSTwotICAgICAgICBNX0NBU0UgICRsYWJlbAotICAgICAgICBJRiB7Q09ORklHfT0xNgotICAgICAgICAgICAgOy8vIFRodW1iCi0gICAgICAgICAgICBJRiBfU3dMb25nCi0gICAgICAgICAgICAgICAgRENXICgkbGFiZWwgLSBfU3dpdGNoJF9Td051bSkvMgotICAgICAgICAgICAgRUxTRQotICAgICAgICAgICAgICAgIERDQiAoJGxhYmVsIC0gX1N3aXRjaCRfU3dOdW0pLzIKLSAgICAgICAgICAgIEVORElGCi0gICAgICAgIEVMU0UKLSAgICAgICAgICAgIDsvLyBBUk0KLSAgICAgICAgICAgIEIgICAkbGFiZWwKLSAgICAgICAgRU5ESUYKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vIEVuZCBvZiBzd2l0Y2ggc3RhdGVtZW50Ci0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fRU5EU1dJVENICi0gICAgICAgIEFMSUdOIDIKLSAgICAgICAgTUVORCAgICAgICAKLQotCi07Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLTsvLyBEYXRhIGFyZWEgYWxsb2NhdGlvbgotOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICAgICAgOy8vIENvbnN0YW50IHRhYmxlIGFsbG9jYXRvciBtYWNybwotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIENyZWF0ZXMgYSBuZXcgc2VjdGlvbiBmb3IgZWFjaCBjb25zdGFudCB0YWJsZQotICAgICAgICA7Ly8gJG5hbWUgaXMgc3ltYm9sIHRocm91Z2ggd2hpY2ggdGhlIHRhYmxlIGNhbiBiZSBhY2Nlc3NlZC4KLSAgICAgICAgOy8vICRhbGlnbiBpcyB0aGUgb3B0aW9uYWwgYWxpZ25tZW50IG9mIHRoZSB0YWJsZSwgbG9nMiBvZiAKLSAgICAgICAgOy8vICB0aGUgYnl0ZSBhbGlnbm1lbnQgLSAkYWxpZ249NCBpcyAxNiBieXRlIGFsaWduZWQKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9UQUJMRSAgJG5hbWUsICRhbGlnbgotICAgICAgICBBU1NFUlQgOkxOT1Q6X0luRnVuYwotICAgICAgICBJRiAiJGFsaWduIj0iIgotICAgICAgICAgICAgQVJFQSB8LmNvbnN0ZGF0YXwsIFJFQURPTkxZLCBEQVRBCi0gICAgICAgIEVMU0UKLSAgICAgICAgICAgIDsvLyBBUkVBcyBpbmhlcml0IHRoZSBhbGlnbm1lbnQgb2YgdGhlIGZpcnN0IGRlY2xhcmF0aW9uLgotICAgICAgICAgICAgOy8vIFRoZXJlZm9yZSBmb3IgZWFjaCBhbGlnbm1lbnQgc2l6ZSB3ZSBtdXN0IGhhdmUgYW4gYXJlYQotICAgICAgICAgICAgOy8vIG9mIGEgZGlmZmVyZW50IG5hbWUuCi0gICAgICAgICAgICBBUkVBIGNvbnN0ZGF0YV9hJGFsaWduLCBSRUFET05MWSwgREFUQSwgQUxJR049JGFsaWduCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIDsvLyBXZSBhbHNvIGZvcmNlIGFsaWdubWVudCBpbmNhc2Ugd2UgYXJlIHRhZ2dpbmcgb250bwotICAgICAgICAgICAgOy8vIGFuIGFscmVhZHkgc3RhcnRlZCBhcmVhLgotICAgICAgICAgICAgQUxJR04gKDE8PCRhbGlnbikKLSAgICAgICAgRU5ESUYKLSRuYW1lCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi07Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLTsvLyBNYWNyb3MgdG8gYWxsb2NhdGUgc3BhY2Ugb24gdGhlIHN0YWNrCi07Ly8KLTsvLyBUaGVzZSBhbGwgYXNzdW1lIHRoYXQgdGhlIHN0YWNrIGlzIDgtYnl0ZSBhbGlnbmVkCi07Ly8gYXQgZW50cnkgdG8gdGhlIGZ1bmN0aW9uLCB3aGljaCBtZWFucyB0aGF0IHRoZSAKLTsvLyAzMi1ieXRlIGFsaWdubWVudCBtYWNybyBuZWVkcyB0byB3b3JrIGluIGEKLTsvLyBiaXQgbW9yZSBvZiBhIHNwZWNpYWwgd2F5Li4uCi07Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgICAgICAKLQotCi0gICAgICAgIDsvLyBBbGxvY2F0ZSAxLWJ5dGUgYWxpZ25lZCBhcmVhIG9mIG5hbWUKLSAgICAgICAgOy8vICRuYW1lIHNpemUgJHNpemUgYnl0ZXMuCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQUxMT0MxICAkbmFtZSwgJHNpemUKLSAgICAgICAgQVNTRVJUIDpMTk9UOl9JbkZ1bmMKLSRuYW1lJF9GICAgRVFVIF9TQnl0ZXMKLV9TQnl0ZXMgU0VUQSBfU0J5dGVzICsgKCRzaXplKQotICAgICAgICBNRU5ECi0gICAgICAgICAgICAKLSAgICAgICAgOy8vIEFsbG9jYXRlIDItYnl0ZSBhbGlnbmVkIGFyZWEgb2YgbmFtZQotICAgICAgICA7Ly8gJG5hbWUgc2l6ZSAkc2l6ZSBieXRlcy4KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9BTExPQzIgICRuYW1lLCAkc2l6ZQotICAgICAgICBBU1NFUlQgOkxOT1Q6X0luRnVuYwotICAgICAgICBJRiAoX1NCeXRlczpBTkQ6MSkhPTAKLV9TQnl0ZXMgICAgIFNFVEEgX1NCeXRlcyArICgyIC0gKF9TQnl0ZXM6QU5EOjEpKQotICAgICAgICBFTkRJRgotJG5hbWUkX0YgICBFUVUgX1NCeXRlcwotX1NCeXRlcyBTRVRBIF9TQnl0ZXMgKyAoJHNpemUpCi0gICAgICAgIE1FTkQKLSAgICAgICAgICAgIAotICAgICAgICA7Ly8gQWxsb2NhdGUgNC1ieXRlIGFsaWduZWQgYXJlYSBvZiBuYW1lCi0gICAgICAgIDsvLyAkbmFtZSBzaXplICRzaXplIGJ5dGVzLgotICAgICAgICBNQUNSTwotICAgICAgICBNX0FMTE9DNCAgJG5hbWUsICRzaXplCi0gICAgICAgIEFTU0VSVCA6TE5PVDpfSW5GdW5jCi0gICAgICAgIElGIChfU0J5dGVzOkFORDozKSE9MAotX1NCeXRlcyAgICAgU0VUQSBfU0J5dGVzICsgKDQgLSAoX1NCeXRlczpBTkQ6MykpCi0gICAgICAgIEVORElGCi0kbmFtZSRfRiAgIEVRVSBfU0J5dGVzCi1fU0J5dGVzIFNFVEEgX1NCeXRlcyArICgkc2l6ZSkKLSAgICAgICAgTUVORAotICAgICAgICAgICAgCi0gICAgICAgIDsvLyBBbGxvY2F0ZSA4LWJ5dGUgYWxpZ25lZCBhcmVhIG9mIG5hbWUKLSAgICAgICAgOy8vICRuYW1lIHNpemUgJHNpemUgYnl0ZXMuCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQUxMT0M4ICAkbmFtZSwgJHNpemUKLSAgICAgICAgQVNTRVJUIDpMTk9UOl9JbkZ1bmMKLSAgICAgICAgSUYgKF9TQnl0ZXM6QU5EOjcpIT0wCi1fU0J5dGVzICAgICBTRVRBIF9TQnl0ZXMgKyAoOCAtIChfU0J5dGVzOkFORDo3KSkKLSAgICAgICAgRU5ESUYKLSRuYW1lJF9GICAgRVFVIF9TQnl0ZXMKLV9TQnl0ZXMgU0VUQSBfU0J5dGVzICsgKCRzaXplKQotICAgICAgICBNRU5EICAgICAgICAKLQotICAgICAgICAKLSAgICAgICAgOy8vIEFsbG9jYXRlIDgtYnl0ZSBhbGlnbmVkIGFyZWEgb2YgbmFtZQotICAgICAgICA7Ly8gJG5hbWUgc2l6ZSAoJHNpemUrMTYpIGJ5dGVzLgotICAgICAgICA7Ly8gVGhlIGV4dHJhIDE2IGJ5dGVzIGFyZSBsYXRlciB1c2VkIHRvIGFsaWduIHRoZSBwb2ludGVyIHRvIDE2IGJ5dGVzCi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBNX0FMTE9DMTYgICRuYW1lLCAkc2l6ZQotICAgICAgICBBU1NFUlQgOkxOT1Q6X0luRnVuYwotICAgICAgICBJRiAoX1NCeXRlczpBTkQ6NykhPTAKLV9TQnl0ZXMgICAgIFNFVEEgX1NCeXRlcyArICg4IC0gKF9TQnl0ZXM6QU5EOjcpKQotICAgICAgICBFTkRJRgotJG5hbWUkX0YkXzE2ICAgRVFVIChfU0J5dGVzICsgOCkKLV9TQnl0ZXMgU0VUQSBfU0J5dGVzICsgKCRzaXplKSArIDgKLSAgICAgICAgTUVORCAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gQWxsb2NhdGUgOC1ieXRlIGFsaWduZWQgYXJlYSBvZiBuYW1lCi0gICAgICAgIDsvLyAkbmFtZSBzaXplICgkc2l6ZSszMikgYnl0ZXMuCi0gICAgICAgIDsvLyBUaGUgZXh0cmEgMzIgYnl0ZXMgYXJlIGxhdGVyIHVzZWQgdG8gYWxpZ24gdGhlIHBvaW50ZXIgdG8gMzIgYnl0ZXMKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQUxMT0MzMiAgJG5hbWUsICRzaXplCi0gICAgICAgIEFTU0VSVCA6TE5PVDpfSW5GdW5jCi0gICAgICAgIElGIChfU0J5dGVzOkFORDo3KSE9MAotX1NCeXRlcyAgICAgU0VUQSBfU0J5dGVzICsgKDggLSAoX1NCeXRlczpBTkQ6NykpCi0gICAgICAgIEVORElGCi0kbmFtZSRfRiRfMzIgICBFUVUgKF9TQnl0ZXMgKyAyNCkKLV9TQnl0ZXMgU0VUQSBfU0J5dGVzICsgKCRzaXplKSArIDI0Ci0gICAgICAgIE1FTkQgICAgICAgIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIEFyZ3VtZW50IERlY2xhcmF0aW9uIE1hY3JvCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gQWxsb2NhdGUgYW4gYXJndW1lbnQgbmFtZSAkbmFtZQotICAgICAgICA7Ly8gc2l6ZSAkc2l6ZSBieXRlcwotICAgICAgICBNQUNSTwotICAgICAgICBNX0FSRyAgICAgJG5hbWUsICRzaXplCi0gICAgICAgIEFTU0VSVCBfSW5GdW5jCi0kbmFtZSRfRiAgICBFUVUgX0FCeXRlcwotX0FCeXRlcyBTRVRBIF9BQnl0ZXMgKyAoJHNpemUpCi0gICAgICAgIE1FTkQgICAgICAgIAotICAgICAgICAKLTsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotOy8vIE1hY3JvcyB0byBhY2Nlc3Mgc3RhY2tlZCB2YXJpYWJsZXMKLTsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgICAgIDsvLyBNYWNybyB0byBwZXJmb3JtIGEgZGF0YSBwcm9jZXNzaW5nIG9wZXJhdGlvbgotICAgICAgICA7Ly8gd2l0aCBhIGNvbnN0YW50IHNlY29uZCBvcGVyYW5kCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIF9NX09QQyAkb3AsJHJkLCRybiwkY29uc3QKLSAgICAgICAgTENMQSAgICBfc2gKLSAgICAgICAgTENMQSAgICBfY3N0Ci1fc2ggICAgIFNFVEEgICAgMAotX2NzdCAgICBTRVRBICAgICRjb25zdAotICAgICAgICBJRiBfY3N0PTAKLSAgICAgICAgJG9wICRyZCwgJHJuLCAjX2NzdAotICAgICAgICAgICAgTUVYSVQKLSAgICAgICAgRU5ESUYKLSAgICAgICAgV0hJTEUgKF9jc3Q6QU5EOjMpPTAKLV9jc3QgICAgICAgIFNFVEEgX2NzdD4+MgotX3NoICAgICAgICAgU0VUQSBfc2grMgotICAgICAgICBXRU5ECi0gICAgICAgICRvcCAkcmQsICRybiwgIyhfY3N0OkFORDoweDAwMDAwMEZGKTw8X3NoCi0gICAgICAgIElGIF9jc3Q+PTI1NgotICAgICAgICAgICAgJG9wICRyZCwgJHJkLCAjKF9jc3Q6QU5EOjB4RkZGRkZGMDApPDxfc2gKLSAgICAgICAgRU5ESUYKLSAgICAgICAgTUVORAotCi0gICAgICAgIDsvLyBNYWNybyB0byBwZXJmb3JtIGEgZGF0YSBhY2Nlc3Mgb3BlcmF0aW9uCi0gICAgICAgIDsvLyBTdWNoIGFzIExEUiBvciBTVFIKLSAgICAgICAgOy8vIFRoZSBhZGRyZXNzaW5nIG1vZGUgaXMgbW9kaWZpZWQgc3VjaCB0aGF0Ci0gICAgICAgIDsvLyAxLiBJZiBubyBhZGRyZXNzIGlzIGdpdmVuIHRoZW4gdGhlIG5hbWUgaXMgdGFrZW4KLSAgICAgICAgOy8vICAgIGFzIGEgc3RhY2sgb2Zmc2V0Ci0gICAgICAgIDsvLyAyLiBJZiB0aGUgYWRkcmVzc2luZyBtb2RlIGlzIG5vdCBhdmFpbGFibGUgZm9yIHRoZQotICAgICAgICA7Ly8gICAgc3RhdGUgYmVpbmcgYXNzZW1ibGVkIGZvciAoZWcgVGh1bWIpIHRoZW4gYSBzdWl0YWJsZQotICAgICAgICA7Ly8gICAgYWRkcmVzc2luZyBtb2RlIGlzIHN1YnN0aXR1dGVkLgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIE9uIEVudHJ5OgotICAgICAgICA7Ly8gJGkgPSBJbnN0cnVjdGlvbiB0byBwZXJmb3JtIChlZyAiTERSQiIpCi0gICAgICAgIDsvLyAkYSA9IFJlcXVpcmVkIGJ5dGUgYWxpZ25tZW50Ci0gICAgICAgIDsvLyAkciA9IFJlZ2lzdGVyKHMpIHRvIHRyYW5zZmVyIChlZyAicjEiKQotICAgICAgICA7Ly8gJGEwLCRhMSwkYTIuIEFkZHJlc3NpbmcgbW9kZSBhbmQgY29uZGl0aW9uLiBPbmUgb2Y6Ci0gICAgICAgIDsvLyAgICAgbGFiZWwgeyxjY30KLSAgICAgICAgOy8vICAgICBbYmFzZV0gICAgICAgICAgICAgICAgICAgIHssLCxjY30KLSAgICAgICAgOy8vICAgICBbYmFzZSwgb2Zmc2V0XXshfSAgICAgICAgIHssLGNjfQotICAgICAgICA7Ly8gICAgIFtiYXNlLCBvZmZzZXQsIHNoaWZ0XXshfSAgeyxjY30KLSAgICAgICAgOy8vICAgICBbYmFzZV0sIG9mZnNldCAgICAgICAgICAgIHssLGNjfQotICAgICAgICA7Ly8gICAgIFtiYXNlXSwgb2Zmc2V0LCBzaGlmdCAgICAgeyxjY30KLSAgICAgICAgTUFDUk8KLSAgICAgICAgX01fREFUQSAkaSwkYSwkciwkYTAsJGExLCRhMiwkYTMKLSAgICAgICAgSUYgIiRhMCI6TEVGVDoxPSJbIgotICAgICAgICAgICAgSUYgIiRhMSI9IiIKLSAgICAgICAgICAgICAgICAkaSRhMyAgICRyLCAkYTAKLSAgICAgICAgICAgIEVMU0UKLSAgICAgICAgICAgICAgICBJRiAiJGEwIjpSSUdIVDoxPSJdIgotICAgICAgICAgICAgICAgICAgICBJRiAiJGEyIj0iIgotICAgICAgICAgICAgICAgICAgICAgICAgX01fUE9TVElORCAkaSRhMywgIiRyIiwgJGEwLCAkYTEKLSAgICAgICAgICAgICAgICAgICAgRUxTRQotICAgICAgICAgICAgICAgICAgICAgICAgX01fUE9TVElORCAkaSRhMywgIiRyIiwgJGEwLCAiJGExLCRhMiIKLSAgICAgICAgICAgICAgICAgICAgRU5ESUYKLSAgICAgICAgICAgICAgICBFTFNFCi0gICAgICAgICAgICAgICAgICAgIElGICIkYTIiPSIiCi0gICAgICAgICAgICAgICAgICAgICAgICBfTV9QUkVJTkQgICRpJGEzLCAiJHIiLCAkYTAsICRhMQotICAgICAgICAgICAgICAgICAgICBFTFNFCi0gICAgICAgICAgICAgICAgICAgICAgICBfTV9QUkVJTkQgICRpJGEzLCAiJHIiLCAkYTAsICIkYTEsJGEyIgotICAgICAgICAgICAgICAgICAgICBFTkRJRgotICAgICAgICAgICAgICAgIEVORElGCi0gICAgICAgICAgICBFTkRJRgotICAgICAgICBFTFNFCi0gICAgICAgICAgICBMQ0xBICAgIF9PZmZzZXQKLV9PZmZzZXQgICAgIFNFVEEgICAgX1dvcmtzcGFjZSArICRhMCRfRgotICAgICAgICAgICAgQVNTRVJUICAoX09mZnNldDpBTkQ6KCRhLTEpKT0wCi0gICAgICAgICAgICAkaSRhMSAgICRyLCBbc3AsICNfT2Zmc2V0XQotICAgICAgICBFTkRJRgotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8gSGFuZGxlIHBvc3QgaW5kZXhlZCBsb2FkL3N0b3JlcwotICAgICAgICA7Ly8gb3AgIHJlZywgW2Jhc2VdLCBvZmZzZXQKLSAgICAgICAgTUFDUk8KLSAgICAgICAgX01fUE9TVElORCAkaSwkciwkYTAsJGExCi0gICAgICAgIExDTFMgX2Jhc2UKLSAgICAgICAgTENMUyBfb2Zmc2V0Ci0gICAgICAgIElGIHtDT05GSUd9PTE2IDsvLyBUaHVtYgotX2Jhc2UgICAgICAgU0VUUyAoIiRhMCI6TEVGVDooOkxFTjoiJGEwIi0xKSk6UklHSFQ6KDpMRU46IiRhMCItMikgICA7Ly8gcmVtb3ZlIFtdCi1fb2Zmc2V0ICAgICBTRVRTICIkYTEiCi0gICAgICAgICAgICBJRiBfb2Zmc2V0OkxFRlQ6MT0iKyIKLV9vZmZzZXQgICAgICAgICBTRVRTIF9vZmZzZXQ6UklHSFQ6KDpMRU46X29mZnNldC0xKQotICAgICAgICAgICAgRU5ESUYKLSAgICAgICAgICAgICRpICAkciwgJGEwCi0gICAgICAgICAgICBJRiBfb2Zmc2V0OkxFRlQ6MT0iLSIKLV9vZmZzZXQgICAgICAgICBTRVRTIF9vZmZzZXQ6UklHSFQ6KDpMRU46X29mZnNldC0xKQotICAgICAgICAgICAgICAgIFNVQiAkX2Jhc2UsICRfYmFzZSwgJF9vZmZzZXQKLSAgICAgICAgICAgIEVMU0UgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgQUREICRfYmFzZSwgJF9iYXNlLCAkX29mZnNldAotICAgICAgICAgICAgRU5ESUYKLSAgICAgICAgRUxTRSA7Ly8gQVJNCi0gICAgICAgICAgICAkaSAgJHIsICRhMCwgJGExCi0gICAgICAgIEVORElGCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLyBIYW5kbGUgcHJlIGluZGV4ZWQgbG9hZC9zdG9yZQotICAgICAgICA7Ly8gb3AgIHJlZywgW2Jhc2UsIG9mZnNldF17IX0KLSAgICAgICAgTUFDUk8KLSAgICAgICAgX01fUFJFSU5EICRpLCRyLCRhMCwkYTEKLSAgICAgICAgTENMUyBfYmFzZQotICAgICAgICBMQ0xTIF9vZmZzZXQKLSAgICAgICAgSUYgKHtDT05GSUd9PTE2KTpMQU5EOigoIiRhMSI6UklHSFQ6Mik9Il0hIikKLV9iYXNlICAgICAgIFNFVFMgIiRhMCI6UklHSFQ6KDpMRU46KCIkYTAiKS0xKQotX29mZnNldCAgICAgU0VUUyAiJGExIjpMRUZUOig6TEVOOigiJGExIiktMikKLSAgICAgICAgICAgICRpICRyLCBbJF9iYXNlLCAkX29mZnNldF0KLSAgICAgICAgICAgIEFERCAkX2Jhc2UsICRfYmFzZSwgJF9vZmZzZXQKLSAgICAgICAgRUxTRQotICAgICAgICAgICAgJGkgICRyLCAkYTAsICRhMQotICAgICAgICBFTkRJRgotICAgICAgICBNRU5ECi0KLSAgICAgICAgOy8vIExvYWQgdW5zaWduZWQgYnl0ZSBmcm9tIHN0YWNrCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fTERSQiAgJHIsJGEwLCRhMSwkYTIsJGEzCi0gICAgICAgIF9NX0RBVEEgIkxEUkIiLDEsJHIsJGEwLCRhMSwkYTIsJGEzCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLyBMb2FkIHNpZ25lZCBieXRlIGZyb20gc3RhY2sKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9MRFJTQiAkciwkYTAsJGExLCRhMiwkYTMKLSAgICAgICAgX01fREFUQSAiTERSU0IiLDEsJHIsJGEwLCRhMSwkYTIsJGEzCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLyBTdG9yZSBieXRlIHRvIHN0YWNrCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fU1RSQiAgJHIsJGEwLCRhMSwkYTIsJGEzCi0gICAgICAgIF9NX0RBVEEgIlNUUkIiLDEsJHIsJGEwLCRhMSwkYTIsJGEzCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLyBMb2FkIHVuc2lnbmVkIGhhbGYgd29yZCBmcm9tIHN0YWNrCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fTERSSCAgJHIsJGEwLCRhMSwkYTIsJGEzCi0gICAgICAgIF9NX0RBVEEgIkxEUkgiLDIsJHIsJGEwLCRhMSwkYTIsJGEzCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLyBMb2FkIHNpZ25lZCBoYWxmIHdvcmQgZnJvbSBzdGFjawotICAgICAgICBNQUNSTwotICAgICAgICBNX0xEUlNIICRyLCRhMCwkYTEsJGEyLCRhMwotICAgICAgICBfTV9EQVRBICJMRFJTSCIsMiwkciwkYTAsJGExLCRhMiwkYTMKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vIFN0b3JlIGhhbGYgd29yZCB0byBzdGFjawotICAgICAgICBNQUNSTwotICAgICAgICBNX1NUUkggICRyLCRhMCwkYTEsJGEyLCRhMwotICAgICAgICBfTV9EQVRBICJTVFJIIiwyLCRyLCRhMCwkYTEsJGEyLCRhMwotICAgICAgICBNRU5ECi0KLSAgICAgICAgOy8vIExvYWQgd29yZCBmcm9tIHN0YWNrCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fTERSICAgJHIsJGEwLCRhMSwkYTIsJGEzCi0gICAgICAgIF9NX0RBVEEgIkxEUiIsNCwkciwkYTAsJGExLCRhMiwkYTMKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vIFN0b3JlIHdvcmQgdG8gc3RhY2sKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9TVFIgICAkciwkYTAsJGExLCRhMiwkYTMKLSAgICAgICAgX01fREFUQSAiU1RSIiw0LCRyLCRhMCwkYTEsJGEyLCRhMwotICAgICAgICBNRU5ECi0KLSAgICAgICAgOy8vIExvYWQgZG91YmxlIHdvcmQgZnJvbSBzdGFjawotICAgICAgICBNQUNSTwotICAgICAgICBNX0xEUkQgICRyMCwkcjEsJGEwLCRhMSwkYTIsJGEzCi0gICAgICAgIF9NX0RBVEEgIkxEUkQiLDgsIiRyMCwkcjEiLCRhMCwkYTEsJGEyLCRhMwotICAgICAgICBNRU5ECi0gICAgICAgICAgICAgICAgCi0gICAgICAgIDsvLyBTdG9yZSBkb3VibGUgd29yZCB0byBzdGFjawotICAgICAgICBNQUNSTwotICAgICAgICBNX1NUUkQgICRyMCwkcjEsJGEwLCRhMSwkYTIsJGEzCi0gICAgICAgIF9NX0RBVEEgIlNUUkQiLDgsIiRyMCwkcjEiLCRhMCwkYTEsJGEyLCRhMwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8gR2V0IGFic29sdXRlIGFkZHJlc3Mgb2Ygc3RhY2sgYWxsb2NhdGVkIGxvY2F0aW9uCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQURSICAgJGEsICRiLCAkY2MKLSAgICAgICAgX01fT1BDICBBREQkY2MsICRhLCBzcCwgKF9Xb3Jrc3BhY2UgKyAkYiRfRikKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vIEdldCBhYnNvbHV0ZSBhZGRyZXNzIG9mIHN0YWNrIGFsbG9jYXRlZCBsb2NhdGlvbiBhbmQgYWxpZ24gdGhlIGFkZHJlc3MgdG8gMTYgYnl0ZXMKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9BRFIxNiAkYSwgJGIsICRjYwotICAgICAgICAgICAgX01fT1BDICBBREQkY2MsICRhLCBzcCwgKF9Xb3Jrc3BhY2UgKyAkYiRfRiRfMTYpCi0gICAgICAgIAotICAgICAgICAgICAgOy8vIE5vdyBhbGlnbiAkYSB0byAxNiBieXRlcwotICAgICAgICAgICAgQklDJGNjICAkYSwkYSwjMHgwRgotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8gR2V0IGFic29sdXRlIGFkZHJlc3Mgb2Ygc3RhY2sgYWxsb2NhdGVkIGxvY2F0aW9uIGFuZCBhbGlnbiB0aGUgYWRkcmVzcyB0byAzMiBieXRlcwotICAgICAgICBNQUNSTwotICAgICAgICBNX0FEUjMyICRhLCAkYiwgJGNjCi0gICAgICAgICAgICBfTV9PUEMgIEFERCRjYywgJGEsIHNwLCAoX1dvcmtzcGFjZSArICRiJF9GJF8zMikKLSAgICAgICAgCi0gICAgICAgICAgICA7Ly8gTm93IGFsaWduICRhIHRvIDMyIGJ5dGVzCi0gICAgICAgICAgICBCSUMkY2MgICRhLCRhLCMweDFGCi0gICAgICAgIE1FTkQKLQotOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLTsvLyBGdW5jdGlvbiBoZWFkZXIgYW5kIGZvb3RlciBtYWNyb3MKLTsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gRnVuY3Rpb24gSGVhZGVyIE1hY3JvICAgIAotICAgICAgICA7Ly8gR2VuZXJhdGVzIHRoZSBmdW5jdGlvbiBwcm9sb2d1ZQotICAgICAgICA7Ly8gTm90ZSB0aGF0IGZ1bmN0aW9ucyBzaG91bGQgYWxsIGJlICJzdGFjay1tb3Zlcy1vbmNlIgotICAgICAgICA7Ly8gVGhlIEZOU1RBUlQgYW5kIEZORU5EIG1hY3JvcyBzaG91bGQgYmUgdGhlIG9ubHkgcGxhY2VzCi0gICAgICAgIDsvLyB3aGVyZSB0aGUgc3RhY2sgbW92ZXMuCi0gICAgICAgIDsvLyAgICAKLSAgICAgICAgOy8vICRuYW1lICA9IGZ1bmN0aW9uIG5hbWUKLSAgICAgICAgOy8vICRycmVnICA9ICIiICAgZG9uJ3Qgc3RhY2sgYW55IHJlZ2lzdGVycwotICAgICAgICA7Ly8gICAgICAgICAgImxyIiBzdGFjayAibHIiIG9ubHkKLSAgICAgICAgOy8vICAgICAgICAgICJyTiIgc3RhY2sgcmVnaXN0ZXJzICJyNC1yTixsciIKLSAgICAgICAgOy8vICRkcmVnICA9ICIiICAgZG9uJ3Qgc3RhY2sgYW55IEQgcmVnaXN0ZXJzCi0gICAgICAgIDsvLyAgICAgICAgICAiZE4iIHN0YWNrIHJlZ2lzdGVycyAiZDgtZE4iCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gTm90ZTogQVJNIEFyY2hpY3R1cmUgcHJvY2VkdXJlIGNhbGwgc3RhbmRhcmQgQUFQQ1MKLSAgICAgICAgOy8vIHN0YXRlcyB0aGF0IHI0LXIxMSwgc3AsIGQ4LWQxNSBtdXN0IGJlIHByZXNlcnZlZCBieQotICAgICAgICA7Ly8gYSBjb21wbGlhbnQgZnVuY3Rpb24uCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fU1RBUlQgJG5hbWUsICRycmVnLCAkZHJlZwotICAgICAgICBBU1NFUlQgOkxOT1Q6X0luRnVuYwotICAgICAgICBBU1NFUlQgIiRuYW1lIiE9IiIKLV9JbkZ1bmMgU0VUTCB7VFJVRX0KLV9SQnl0ZXMgU0VUQSAwCi1fV29ya3NwYWNlIFNFVEEgMAotCi0gICAgICAgIDsvLyBDcmVhdGUgYW4gYXJlYSBmb3IgdGhlIGZ1bmN0aW9uICAgICAgICAKLSAgICAgICAgQVJFQSAgICB8LnRleHR8LCBDT0RFCi0gICAgICAgIEVYUE9SVCAgJG5hbWUKLSRuYW1lICAgRlVOQ1RJT04KLSAgICAgICAgCi0gICAgICAgIDsvLyBTYXZlIFIgcmVnaXN0ZXJzCi0gICAgICAgIF9NX0dFVFJSRUdMSVNUICRycmVnCi0gICAgICAgIElGIF9SUmVnTGlzdDw+IiIKLSAgICAgICAgICAgIFNUTUZEICAgc3AhLCB7JF9SUmVnTGlzdCwgbHJ9Ci0gICAgICAgIEVORElGCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIDsvLyBTYXZlIEQgcmVnaXN0ZXJzCi0gICAgICAgIF9NX0dFVERSRUdMSVNUICAkZHJlZyAgICAgICAgCi0gICAgICAgIElGIF9EUmVnTGlzdDw+IiIKLSAgICAgICAgICAgIFZTVE1GRCAgc3AhLCB7JF9EUmVnTGlzdH0KLSAgICAgICAgRU5ESUYgICAgICAgICAgICAKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgOy8vIEVuc3VyZSBzaXplIGNsYWltZWQgb24gc3RhY2sgaXMgOC1ieXRlIGFsaWduZWQKLSAgICAgICAgSUYgKChfU0J5dGVzOkFORDo3KSE9MCkKLV9TQnl0ZXMgICAgIFNFVEEgX1NCeXRlcyArICg4IC0gKF9TQnl0ZXM6QU5EOjcpKQotICAgICAgICBFTkRJRgotICAgICAgICAKLSAgICAgICAgSUYgKF9TQnl0ZXMhPTApCi0gICAgICAgICAgICBfTV9PUEMgU1VCLCBzcCwgc3AsIF9TQnl0ZXMKLSAgICAgICAgRU5ESUYKLSAgICAgICAgCi0gICAgICAgIAotX0FCeXRlcyBTRVRBIF9TQnl0ZXMgKyBfUkJ5dGVzIC0gX1dvcmtzcGFjZQotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgOy8vIFByaW50IGZ1bmN0aW9uIG5hbWUgaWYgZGVidWcgZW5hYmxlZAotICAgICAgICBNX1BSSU5URiAiJG5hbWVcbiIsCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLyBXb3JrIG91dCBhIGxpc3Qgb2YgUiBzYXZlZCByZWdpc3RlcnMKLSAgICAgICAgTUFDUk8KLSAgICAgICAgX01fR0VUUlJFR0xJU1QgJHJyZWcKLSAgICAgICAgSUYgIiRycmVnIj0iIgotX1JSZWdMaXN0ICAgU0VUUyAiIgotICAgICAgICAgICAgTUVYSVQKLSAgICAgICAgRU5ESUYgICAgICAgIAotICAgICAgICBJRiAiJHJyZWciPSJsciI6TE9SOiIkcnJlZyI9InI0IgotX1JSZWdMaXN0ICAgU0VUUyAicjQiCi1fUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrOAotICAgICAgICAgICAgTUVYSVQKLSAgICAgICAgRU5ESUYKLSAgICAgICAgSUYgIiRycmVnIj0icjUiOkxPUjoiJHJyZWciPSJyNiIKLV9SUmVnTGlzdCAgIFNFVFMgInI0LXI2IgotX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzE2Ci0gICAgICAgICAgICBNRVhJVAotICAgICAgICBFTkRJRgotICAgICAgICBJRiAiJHJyZWciPSJyNyI6TE9SOiIkcnJlZyI9InI4IgotX1JSZWdMaXN0ICAgU0VUUyAicjQtcjgiCi1fUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrMjQKLSAgICAgICAgICAgIE1FWElUCi0gICAgICAgIEVORElGCi0gICAgICAgIElGICIkcnJlZyI9InI5IjpMT1I6IiRycmVnIj0icjEwIgotX1JSZWdMaXN0ICAgU0VUUyAicjQtcjEwIgotX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzMyCi0gICAgICAgICAgICBNRVhJVAotICAgICAgICBFTkRJRgotICAgICAgICBJRiAiJHJyZWciPSJyMTEiOkxPUjoiJHJyZWciPSJyMTIiCi1fUlJlZ0xpc3QgICBTRVRTICJyNC1yMTIiCi1fUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrNDAKLSAgICAgICAgICAgIE1FWElUCi0gICAgICAgIEVORElGCi0gICAgICAgIElORk8gMSwgIlVucmVjb2duaXplZCBzYXZlZCByIHJlZ2lzdGVyIGxpbWl0ICckcnJlZyciCi0gICAgICAgIE1FTkQgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIFdvcmsgb3V0IGEgbGlzdCBvZiBEIHNhdmVkIHJlZ2lzdGVycwotICAgICAgICBNQUNSTwotICAgICAgICBfTV9HRVREUkVHTElTVCAkZHJlZwotICAgICAgICBJRiAiJGRyZWciPSIiCi1fRFJlZ0xpc3QgICBTRVRTICIiCi0gICAgICAgICAgICBNRVhJVAotICAgICAgICBFTkRJRiAgICAgICAgCi0gICAgICAgIElGICIkZHJlZyI9ImQ4IgotX0RSZWdMaXN0ICAgU0VUUyAiZDgiCi1fUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrOAotICAgICAgICAgICAgTUVYSVQKLSAgICAgICAgRU5ESUYKLSAgICAgICAgSUYgIiRkcmVnIj0iZDkiCi1fRFJlZ0xpc3QgICBTRVRTICJkOC1kOSIKLV9SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcysxNgotICAgICAgICAgICAgTUVYSVQKLSAgICAgICAgRU5ESUYKLSAgICAgICAgSUYgIiRkcmVnIj0iZDEwIgotX0RSZWdMaXN0ICAgU0VUUyAiZDgtZDEwIgotX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzI0Ci0gICAgICAgICAgICBNRVhJVAotICAgICAgICBFTkRJRgotICAgICAgICBJRiAiJGRyZWciPSJkMTEiCi1fRFJlZ0xpc3QgICBTRVRTICJkOC1kMTEiCi1fUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrMzIKLSAgICAgICAgICAgIE1FWElUCi0gICAgICAgIEVORElGCi0gICAgICAgIElGICIkZHJlZyI9ImQxMiIKLV9EUmVnTGlzdCAgIFNFVFMgImQ4LWQxMiIKLV9SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcys0MAotICAgICAgICAgICAgTUVYSVQKLSAgICAgICAgRU5ESUYKLSAgICAgICAgSUYgIiRkcmVnIj0iZDEzIgotX0RSZWdMaXN0ICAgU0VUUyAiZDgtZDEzIgotX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzQ4Ci0gICAgICAgICAgICBNRVhJVAotICAgICAgICBFTkRJRgotICAgICAgICBJRiAiJGRyZWciPSJkMTQiCi1fRFJlZ0xpc3QgICBTRVRTICJkOC1kMTQiCi1fUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrNTYKLSAgICAgICAgICAgIE1FWElUCi0gICAgICAgIEVORElGCi0gICAgICAgIElGICIkZHJlZyI9ImQxNSIKLV9EUmVnTGlzdCAgIFNFVFMgImQ4LWQxNSIKLV9SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcys2NAotICAgICAgICAgICAgTUVYSVQKLSAgICAgICAgRU5ESUYKLSAgICAgICAgSU5GTyAxLCAiVW5yZWNvZ25pemVkIHNhdmVkIGQgcmVnaXN0ZXIgbGltaXQgJyRkcmVnJyIKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vIFByb2R1Y2UgZnVuY3Rpb24gcmV0dXJuIGluc3RydWN0aW9ucwotICAgICAgICBNQUNSTwotICAgICAgICBfTV9SRVQgJGNjCi0gICAgICAgIElGIF9EUmVnTGlzdDw+IiIKLSAgICAgICAgICAgIFZQT1AkY2MgeyRfRFJlZ0xpc3R9Ci0gICAgICAgIEVORElGCi0gICAgICAgIElGIF9SUmVnTGlzdD0iIgotICAgICAgICAgICAgQlgkY2MgbHIKLSAgICAgICAgRUxTRQotICAgICAgICAgICAgTERNJGNjLkZEIHNwISwgeyRfUlJlZ0xpc3QsIHBjfQotICAgICAgICBFTkRJRgotICAgICAgICBNRU5EICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBFYXJseSBGdW5jdGlvbiBFeGl0IE1hY3JvCi0gICAgICAgIDsvLyAkY2MgPSBjb25kaXRpb24gdG8gZXhpdCB3aXRoCi0gICAgICAgIDsvLyAoRXhhbXBsZTogTV9FWElUIEVRKQotICAgICAgICBNQUNSTwotICAgICAgICBNX0VYSVQgICRjYwotICAgICAgICBBU1NFUlQgIF9JbkZ1bmMKLSAgICAgICAgSUYgIF9TQnl0ZXMhPTAKLSAgICAgICAgICAgIDsvLyBSZXN0b3JlIHN0YWNrIGZyYW1lIGFuZCBleGl0Ci0gICAgICAgICAgICBCJGNjICBfRW5kJF9GCi0gICAgICAgIEVMU0UKLSAgICAgICAgICAgIDsvLyBDYW4gcmV0dXJuIGRpcmVjdGx5Ci0gICAgICAgICAgICBfTV9SRVQgJGNjCi0gICAgICAgIEVORElGICAgICAgICAKLSAgICAgICAgTUVORCAgICAgICAgCi0KLSAgICAgICAgOy8vIEZ1bmN0aW9uIEZvb3RlciBNYWNybyAgICAgICAgCi0gICAgICAgIDsvLyBHZW5lcmF0ZXMgdGhlIGZ1bmN0aW9uIGVwaWxvZ3VlCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fRU5ECi0gICAgICAgIEFTU0VSVCBfSW5GdW5jCi1fSW5GdW5jIFNFVEwge0ZBTFNFfQotX0VuZCRfRgotCi0gICAgICAgIDsvLyBSZXN0b3JlIHRoZSBzdGFjayBwb2ludGVyIHRvIGl0cyBvcmlnaW5hbCB2YWx1ZSBvbiBmdW5jdGlvbiBlbnRyeQotICAgICAgICBJRiBfU0J5dGVzIT0wCi0gICAgICAgICAgICBfTV9PUEMgQURELCBzcCwgc3AsIF9TQnl0ZXMKLSAgICAgICAgRU5ESUYKLSAgICAgICAgX01fUkVUCi0gICAgICAgIEVOREZVTkMKLQotICAgICAgICA7Ly8gUmVzZXQgdGhlIGdsb2JhbCBzdGFjayB0cmFja2luZyB2YXJpYWJsZXMgYmFjayB0byB0aGVpciAKLSAgICAgICAgOy8vIGluaXRpYWwgdmFsdWVzLCBhbmQgaW5jcmVtZW50IHRoZSBmdW5jdGlvbiBjb3VudAotX1NCeXRlcyAgICAgICAgU0VUQSAwCi1fRiAgICAgICAgICAgICBTRVRBIF9GKzEKLSAgICAgICAgTUVORAotCi0gICAgICAgICAgICAgICAgCi07Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOy8vIERlYnVnIE1hY3JvcwotOy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgICAgICBHQkxMICAgIERFQlVHX09OCi1ERUJVR19PTiBTRVRMICAge0ZBTFNFfQotICAgICAgICBHQkxMICAgIERFQlVHX1NUQUxMU19PTgotREVCVUdfU1RBTExTX09OIFNFVEwge0ZBTFNFfQotICAgICAgICAKLSAgICAgICAgOy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgICAgOy8vIERlYnVnIGNhbGwgdG8gcHJpbnRmCi0gICAgICAgIDsvLyAgTV9QUklOVEYgJGZvcm1hdCwgJHZhbDAsICR2YWwxLCAkdmFsMgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIEV4YW1wbGVzOgotICAgICAgICA7Ly8gIE1fUFJJTlRGICJ4PSUwOHhcbiIsIHIwCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gVGhpcyBtYWNybyBwcmVzZXJ2ZXMgdGhlIHZhbHVlIG9mIGFsbCByZWdpc3RlcnMgaW5jbHVkaW5nIHRoZQotICAgICAgICA7Ly8gZmxhZ3MuCi0gICAgICAgIDsvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9QUklOVEYgICRmb3JtYXQsICR2YWwwLCAkdmFsMSwgJHZhbDIKLSAgICAgICAgSUYgREVCVUdfT04KLSAgICAgICAgCi0gICAgICAgIElNUE9SVCAgcHJpbnRmCi0gICAgICAgIExDTEEgICAgbkFyZ3MKLW5BcmdzCVNFVEEgICAgMAotICAgICAgICAKLSAgICAgICAgOy8vIHNhdmUgcmVnaXN0ZXJzIHNvIHdlIGRvbid0IGNvcnJ1cHQgdGhlbQotICAgICAgICBTVE1GRCAgIHNwISwge3IwLXIxMiwgbHJ9Ci0gICAgICAgIAotICAgICAgICA7Ly8gRHJvcCBzdGFjayB0byBnaXZlIHVzIHNvbWUgd29ya3NwYWNlCi0gICAgICAgIFNVQiAgICAgc3AsIHNwLCAjMTYKLSAgICAgICAgCi0gICAgICAgIDsvLyBTYXZlIHJlZ2lzdGVycyB3ZSBuZWVkIHRvIHByaW50IHRvIHRoZSBzdGFjawotICAgICAgICBJRiAiJHZhbDIiIDw+ICIiCi0gICAgICAgICAgICBBU1NFUlQgIiR2YWwxIiA8PiAiIgotICAgICAgICAgICAgU1RSICAgICR2YWwyLCBbc3AsICM4XQotbkFyZ3MgICAgICAgU0VUQSAgIG5BcmdzKzEKLSAgICAgICAgRU5ESUYKLSAgICAgICAgSUYgIiR2YWwxIiA8PiAiIgotICAgICAgICAgICAgQVNTRVJUICIkdmFsMCIgPD4gIiIKLSAgICAgICAgICAgIFNUUiAgICAkdmFsMSwgW3NwLCAjNF0KLW5BcmdzCSAgICBTRVRBICAgbkFyZ3MrMQotICAgICAgICBFTkRJRgotICAgICAgICBJRiAiJHZhbDAiPD4iIgotICAgICAgICAgICAgU1RSICAgICR2YWwwLCBbc3BdCi1uQXJncwkgICAgU0VUQSAgIG5BcmdzKzEKLSAgICAgICAgRU5ESUYKLSAgICAgICAgCi0gICAgICAgIDsvLyBOb3cgd2UgYXJlIHNhZmUgdG8gY29ycnVwdCByZWdpc3RlcnMKLSAgICAgICAgQURSICAgICByMCwgJUZUMDAKLSAgICAgICAgSUYgbkFyZ3M9MQotICAgICAgICAgIExEUiAgIHIxLCBbc3BdCi0gICAgICAgIEVORElGCi0gICAgICAgIElGIG5BcmdzPTIKLSAgICAgICAgICBMRE1JQSBzcCwge3IxLHIyfQotICAgICAgICBFTkRJRgotICAgICAgICBJRiBuQXJncz0zCi0gICAgICAgICAgTERNSUEgc3AsIHtyMSxyMixyM30KLSAgICAgICAgRU5ESUYKLSAgICAgICAgCi0gICAgICAgIDsvLyBwcmludCB0aGUgdmFsdWVzCi0gICAgICAgIE1SUyAgICAgcjQsIGNwc3IgICAgICAgIDsvLyBwcmVzZXJ2ZSBmbGFncwotICAgICAgICBCTCAgICAgIHByaW50ZgotICAgICAgICBNU1IgICAgIGNwc3JfZiwgcjQgICAgICA7Ly8gcmVzdG9yZSBmbGFncwotICAgICAgICBCICAgICAgICVGVDAxCi0wMCAgICAgIDsvLyBzdHJpbmcgdG8gcHJpbnQKLSAgICAgICAgRENCICAgICAiJGZvcm1hdCIsIDAKLSAgICAgICAgQUxJR04KLTAxICAgICAgOy8vIEZpbmlzaGVkCi0gICAgICAgIEFERCAgICAgc3AsIHNwLCAjMTYKLSAgICAgICAgOy8vIFJlc3RvcmUgcmVnaXN0ZXJzCi0gICAgICAgIExETUZECXNwISwge3IwLXIxMixscn0KLQotICAgICAgICBFTkRJRiAgIDsvLyBERUJVR19PTgotICAgICAgICBNRU5ECi0KLQotICAgICAgICA7Ly8gU3RhbGwgU2ltdWxhdGlvbiBNYWNybwotICAgICAgICA7Ly8gSW5zZXJ0cyBhIGdpdmVuIG51bWJlciBvZiBOT1BzIGZvciB0aGUgY3VycmVudGx5Ci0gICAgICAgIDsvLyAgZGVmaW5lZCBwbGF0Zm9ybQotICAgICAgICBNQUNSTwotICAgICAgICBNX1NUQUxMICRwbGF0MXN0YWxsLCAkcGxhdDJzdGFsbCwgJHBsYXQzc3RhbGwsICRwbGF0NHN0YWxsLCAkcGxhdDVzdGFsbCwgJHBsYXQ2c3RhbGwKLSAgICAgICAgSUYgREVCVUdfU1RBTExTX09OCi0gICAgICAgICAgICBfTV9TVEFMTF9TVUIgJHBsYXQxc3RhbGwgICAgCi0gICAgICAgICAgICBfTV9TVEFMTF9TVUIgJHBsYXQyc3RhbGwgICAgCi0gICAgICAgICAgICBfTV9TVEFMTF9TVUIgJHBsYXQzc3RhbGwgICAgCi0gICAgICAgICAgICBfTV9TVEFMTF9TVUIgJHBsYXQ0c3RhbGwgICAgCi0gICAgICAgICAgICBfTV9TVEFMTF9TVUIgJHBsYXQ1c3RhbGwgICAgCi0gICAgICAgICAgICBfTV9TVEFMTF9TVUIgJHBsYXQ2c3RhbGwgICAgCi0gICAgICAgIEVORElGCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIF9NX1NUQUxMX1NVQiAkcGxhdHN0YWxsCi0gICAgICAgIElGICIkcGxhdHN0YWxsIiE9IiIKLSAgICAgICAgICAgIExDTEEgX3BsbGVuCi0gICAgICAgICAgICBMQ0xTIF9wbAotICAgICAgICAgICAgTENMTCBfcGxsb2cKLV9wbGxlbiAgICAgIFNFVEEgOkxFTjoiJHBsYXRzdGFsbCIKLV9wbCAgICAgICAgIFNFVFMgIiRwbGF0c3RhbGwiOkxFRlQ6KF9wbGxlbiAtIDIpCi0gICAgICAgICAgICBJRiA6REVGOiRfcGwKLSAgICAgICAgICAgICAgICBJRiAkX3BsCi0gICAgICAgICAgICAgICAgICAgIExDTFMgX3N0Ci0gICAgICAgICAgICAgICAgICAgIExDTEEgX3N0bnVtCi1fc3QgICAgICAgICAgICAgICAgIFNFVFMgIiRwbGF0c3RhbGwiOlJJR0hUOjEgICAgICAgIAotX3N0bnVtICAgICAgICAgICAgICBTRVRBICRfc3QKLSAgICAgICAgICAgICAgICAgICAgV0hJTEUgX3N0bnVtPjAKLQkJCU1PViBzcCwgc3AKLV9zdG51bSAgICAgICAgICAgICAgICAgIFNFVEEgX3N0bnVtIC0gMQotICAgICAgICAgICAgICAgICAgICBXRU5ECi0gICAgICAgICAgICAgICAgRU5ESUYKLSAgICAgICAgICAgIEVORElGCi0gICAgICAgIEVORElGCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAKLTsvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07Ly8gRW5kaWFuIEludmFyaWVuY2UgTWFjcm9zCi07Ly8gCi07Ly8gVGhlIGlkZWEgYmVoaW5kIHRoZXNlIG1hY3JvcyBpcyB0aGF0IGlmIGFuIGFycmF5IGlzCi07Ly8gbG9hZGVkIGFzIHdvcmRzIHRoZW4gdGhlIFNNVUwwMCBtYWNybyB3aWxsIG11bHRpcGx5Ci07Ly8gYXJyYXkgZWxlbWVudHMgMCByZWdhcmRsZXNzIG9mIHRoZSBlbmRpYW5lc3Mgb2YgdGhlCi07Ly8gc3lzdGVtLiBGb3IgbGl0dGxlIGVuZGlhbiBTTVVMMDA9U01VTEJCLCBmb3IgYmlnCi07Ly8gZW5kaWFuIFNNVUwwMD1TTVVMVFQgYW5kIHNpbWlsYXJseSBmb3Igb3RoZXIgcGFja2VkIG9wZXJhdGlvbnMuCi07Ly8KLTsvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTElCSTQgICAkY29tbGksICRjb21iaSwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBJRiB7RU5ESUFOfT0iYmlnIgotICAgICAgICAkY29tYmkuJGNjICRhLCAkYiwgJGMsICRkCi0gICAgICAgIEVMU0UKLSAgICAgICAgJGNvbWxpLiRjYyAkYSwgJGIsICRjLCAkZAotICAgICAgICBFTkRJRgotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBMSUJJMyAgICRjb21saSwgJGNvbWJpLCAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgSUYge0VORElBTn09ImJpZyIKLSAgICAgICAgJGNvbWJpLiRjYyAkYSwgJGIsICRjCi0gICAgICAgIEVMU0UKLSAgICAgICAgJGNvbWxpLiRjYyAkYSwgJGIsICRjCi0gICAgICAgIEVORElGCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLyBTTUxBeHkgbWFjcm9zCi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBMDAgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQUJCLCBTTUxBVFQsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQTAxICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFCVCwgU01MQVRCLCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEEwQiAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBQkIsIFNNTEFUQiwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBMFQgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQUJULCBTTUxBVFQsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQTEwICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFUQiwgU01MQUJULCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEExMSAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBVFQsIFNNTEFCQiwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBMUIgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQVRCLCBTTUxBQkIsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQTFUICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFUVCwgU01MQUJULCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEFCMCAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBQkIsIFNNTEFCVCwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBQjEgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQUJULCBTTUxBQkIsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQVQwICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFUQiwgU01MQVRULCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEFUMSAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBVFQsIFNNTEFUQiwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8gU01VTHh5IG1hY3JvcwotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01VTDAwICAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTElCSTMgU01VTEJCLCBTTVVMVFQsICRhLCAkYiwgJGMsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTVVMMDEgICRhLCAkYiwgJGMsICRjYwotICAgICAgICBMSUJJMyBTTVVMQlQsIFNNVUxUQiwgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNVUwwQiAgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIExJQkkzIFNNVUxCQiwgU01VTFRCLCAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01VTDBUICAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTElCSTMgU01VTEJULCBTTVVMVFQsICRhLCAkYiwgJGMsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTVVMMTAgICRhLCAkYiwgJGMsICRjYwotICAgICAgICBMSUJJMyBTTVVMVEIsIFNNVUxCVCwgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNVUwxMSAgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIExJQkkzIFNNVUxUVCwgU01VTEJCLCAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01VTDFCICAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTElCSTMgU01VTFRCLCBTTVVMQkIsICRhLCAkYiwgJGMsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTVVMMVQgICRhLCAkYiwgJGMsICRjYwotICAgICAgICBMSUJJMyBTTVVMVFQsIFNNVUxCVCwgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNVUxCMCAgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIExJQkkzIFNNVUxCQiwgU01VTEJULCAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01VTEIxICAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTElCSTMgU01VTEJULCBTTVVMQkIsICRhLCAkYiwgJGMsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTVVMVDAgICRhLCAkYiwgJGMsICRjYwotICAgICAgICBMSUJJMyBTTVVMVEIsIFNNVUxUVCwgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNVUxUMSAgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIExJQkkzIFNNVUxUVCwgU01VTFRCLCAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vIFNNTEFXeCwgU01VTFd4IG1hY3JvcwotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQVcwICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFXQiwgU01MQVdULCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEFXMSAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBV1QsIFNNTEFXQiwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTVVMVzAgICRhLCAkYiwgJGMsICRjYwotICAgICAgICBMSUJJMyBTTVVMV0IsIFNNVUxXVCwgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNVUxXMSAgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIExJQkkzIFNNVUxXVCwgU01VTFdCLCAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTUVORAotCi0gICAgICAgIDsvLyBTTUxBTHh5IG1hY3JvcwotCi0KLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQUwwMCAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBTEJCLCBTTUxBTFRULCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEFMMDEgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQUxCVCwgU01MQUxUQiwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBTDBCICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFMQkIsIFNNTEFMVEIsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQUwwVCAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBTEJULCBTTUxBTFRULCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEFMMTAgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQUxUQiwgU01MQUxCVCwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0KLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQUwxMSAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBTFRULCBTTUxBTEJCLCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEFMMUIgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQUxUQiwgU01MQUxCQiwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBTDFUICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFMVFQsIFNNTEFMQlQsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQUxCMCAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBTEJCLCBTTUxBTEJULCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEFMQjEgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQUxCVCwgU01MQUxCQiwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBTFQwICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFMVEIsIFNNTEFMVFQsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQUxUMSAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBTFRULCBTTUxBTFRCLCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gIEVORElGIDsvLyBBUk1DT01NX1NfSAotICAgICAgICAgICAgCi0gIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1PTVguaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtT01YLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3YzBjMjYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1PTVguaAorKysgL2Rldi9udWxsCkBAIC0xLDI4OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtT01YX1JlbGVhc2VWZXJzaW9uLmgKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBUaGlzIGZpbGUgYWxsb3dzIGEgdmVyc2lvbiBvZiB0aGUgT01YIERMIGxpYnJhcmllcyB0byBiZSBidWlsdCB3aGVyZSBzb21lIG9yCi0gKiBhbGwgb2YgdGhlIGZ1bmN0aW9uIG5hbWVzIGNhbiBiZSBnaXZlbiBhIHVzZXIgc3BlY2lmaWVkIHN1ZmZpeC4gCi0gKgotICogWW91IG1pZ2h0IHdhbnQgdG8gdXNlIGl0IHdoZXJlOgotICoKLSAqIC0geW91IHdhbnQgdG8gcmVuYW1lIGEgZnVuY3Rpb24gIm91dCBvZiB0aGUgd2F5IiBzbyB0aGF0IHlvdSBjb3VsZCByZXBsYWNlCi0gKiAgIGEgZnVuY3Rpb24gd2l0aCBhIGRpZmZlcmVudCB2ZXJzaW9uICh0aGUgb3JpZ2luYWwgdmVyc2lvbiB3b3VsZCBzdGlsbCBiZQotICogICBpbiB0aGUgbGlicmFyeSBqdXN0IHdpdGggYSBkaWZmZXJlbnQgbmFtZSAtIHNvIHlvdSBjb3VsZCBkZWJ1ZyB0aGUgbmV3Ci0gKiAgIHZlcnNpb24gYnkgY29tcGFyaW5nIGl0IHRvIHRoZSBvdXRwdXQgb2YgdGhlIG9sZCkKLSAqCi0gKiAtIHlvdSB3YW50IHRvIHJlbmFtZSBhbGwgdGhlIGZ1bmN0aW9ucyB0byB2ZXJzaW9ucyB3aXRoIGEgc3VmZml4IHNvIHRoYXQgCi0gKiAgIHlvdSBjYW4gaW5jbHVkZSB0d28gdmVyc2lvbnMgb2YgdGhlIGxpYnJhcnkgYW5kIGNob29zZSBiZXR3ZWVuIGZ1bmN0aW9ucwotICogICBhdCBydW50aW1lLgotICoKLSAqICAgICBlLmcuIG9teElQQk1fQ29weV9VOF9DMVIgY291bGQgYmUgcmVuYW1lZCBvbXhJUEJNX0NvcHlfVThfQzFSX0NvcnRleEE4Ci0gKiAKLSAqLwotCi0gIAotI2lmbmRlZiBfYXJtT01YX0hfCi0jZGVmaW5lIF9hcm1PTVhfSF8KLQotCi0vKiBXZSBuZWVkIHRvIGRlZmluZSB0aGVzZSB0d28gbWFjcm9zIGluIG9yZGVyIHRvIGV4cGFuZCBhbmQgY29uY2F0ZW5hdGUgdGhlIG5hbWVzICovCi0jZGVmaW5lIE9NWENBVDJCQVIoQSwgQikgb214ICMjIEEgIyMgQgotI2RlZmluZSBPTVhDQVRCQVIoQSwgQikgT01YQ0FUMkJBUihBLCBCKQotCi0vKiBEZWZpbmUgdGhlIHN1ZmZpeCB0byBhZGQgdG8gYWxsIGZ1bmN0aW9ucyAtIHRoZSBkZWZhdWx0IGlzIG5vIHN1ZmZpeCAqLwotI2RlZmluZSBCQVJFX1NVRkZJWCAKLQotCi0KLS8qIERlZmluZSB3aGF0IGhhcHBlbnMgdG8gdGhlIGJhcmUgc3VmZml4LWxlc3MgZnVuY3Rpb25zLCBkb3duIHRvIHRoZSBzdWItZG9tYWluIGFjY3VyYWN5ICovCi0jZGVmaW5lIE9NWEFDQUFDX1NVRkZJWCAgICBCQVJFX1NVRkZJWCAgIAotI2RlZmluZSBPTVhBQ01QM19TVUZGSVggICAgQkFSRV9TVUZGSVgKLSNkZWZpbmUgT01YSUNKUF9TVUZGSVggICAgIEJBUkVfU1VGRklYCi0jZGVmaW5lIE9NWElQQk1fU1VGRklYICAgICBCQVJFX1NVRkZJWAotI2RlZmluZSBPTVhJUENTX1NVRkZJWCAgICAgQkFSRV9TVUZGSVgKLSNkZWZpbmUgT01YSVBQUF9TVUZGSVggICAgIEJBUkVfU1VGRklYCi0jZGVmaW5lIE9NWFNQX1NVRkZJWCAgICAgICBCQVJFX1NVRkZJWAotI2RlZmluZSBPTVhWQ0NPTU1fU1VGRklYICAgQkFSRV9TVUZGSVgKLSNkZWZpbmUgT01YVkNNNFAxMF9TVUZGSVggIEJBUkVfU1VGRklYCi0jZGVmaW5lIE9NWFZDTTRQMl9TVUZGSVggICBCQVJFX1NVRkZJWAotCi0KLQotCi0vKiBEZWZpbmUgd2hhdCB0aGUgZWFjaCBiYXJlLCB1bi1zdWZmaXhlZCBPcGVuTUFYIEFQSSBmdW5jdGlvbiBuYW1lcyBpcyB0byBiZSByZW5hbWVkICovCi0jZGVmaW5lIG9teEFDQUFDX0RlY29kZUNoYW5QYWlyRWx0ICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZUNoYW5QYWlyRWx0LCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX0RlY29kZURhdFN0ckVsdCAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZURhdFN0ckVsdCwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVGaWxsRWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVGaWxsRWx0LCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX0RlY29kZUlzU3RlcmVvX1MzMiAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZUlzU3RlcmVvX1MzMiwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVNc1BOU19TMzJfSSAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVNc1BOU19TMzJfSSwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVNc1N0ZXJlb19TMzJfSSAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVNc1N0ZXJlb19TMzJfSSwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVQcmdDZmdFbHQgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVQcmdDZmdFbHQsIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfRGVjb2RlVE5TX1MzMl9JICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlVE5TX1MzMl9JLCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX0RlaW50ZXJsZWF2ZVNwZWN0cnVtX1MzMiAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlaW50ZXJsZWF2ZVNwZWN0cnVtX1MzMiwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19FbmNvZGVUTlNfUzMyX0kgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19FbmNvZGVUTlNfUzMyX0ksIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfTG9uZ1Rlcm1QcmVkaWN0X1MzMiAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfTG9uZ1Rlcm1QcmVkaWN0X1MzMiwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19Mb25nVGVybVJlY29uc3RydWN0X1MzMl9JICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19Mb25nVGVybVJlY29uc3RydWN0X1MzMl9JLCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX01EQ1RGd2RfUzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX01EQ1RGd2RfUzMyLCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX01EQ1RJbnZfUzMyX1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX01EQ1RJbnZfUzMyX1MxNiwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19Ob2lzZWxlc3NEZWNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19Ob2lzZWxlc3NEZWNvZGUsIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfUXVhbnRJbnZfUzMyX0kgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfUXVhbnRJbnZfUzMyX0ksIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfVW5wYWNrQURJRkhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfVW5wYWNrQURJRkhlYWRlciwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19VbnBhY2tBRFRTRnJhbWVIZWFkZXIgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19VbnBhY2tBRFRTRnJhbWVIZWFkZXIsIE9NWEFDQUFDX1NVRkZJWCkKLQotCi0jZGVmaW5lIG9teEFDTVAzX0h1ZmZtYW5EZWNvZGVfUzMyICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX0h1ZmZtYW5EZWNvZGVfUzMyLCBPTVhBQ01QM19TVUZGSVgpCi0jZGVmaW5lIG9teEFDTVAzX0h1ZmZtYW5EZWNvZGVTZmJfUzMyICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX0h1ZmZtYW5EZWNvZGVTZmJfUzMyLCBPTVhBQ01QM19TVUZGSVgpCi0jZGVmaW5lIG9teEFDTVAzX0h1ZmZtYW5EZWNvZGVTZmJNYnBfUzMyICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX0h1ZmZtYW5EZWNvZGVTZmJNYnBfUzMyLCBPTVhBQ01QM19TVUZGSVgpCi0jZGVmaW5lIG9teEFDTVAzX01EQ1RJbnZfUzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX01EQ1RJbnZfUzMyLCBPTVhBQ01QM19TVUZGSVgpCi0jZGVmaW5lIG9teEFDTVAzX1JlUXVhbnRpemVfUzMyX0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX1JlUXVhbnRpemVfUzMyX0ksIE9NWEFDTVAzX1NVRkZJWCkKLSNkZWZpbmUgb214QUNNUDNfUmVRdWFudGl6ZVNmYl9TMzJfSSAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfUmVRdWFudGl6ZVNmYl9TMzJfSSwgT01YQUNNUDNfU1VGRklYKQotI2RlZmluZSBvbXhBQ01QM19TeW50aFBRTUZfUzMyX1MxNiAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19TeW50aFBRTUZfUzMyX1MxNiwgT01YQUNNUDNfU1VGRklYKQotI2RlZmluZSBvbXhBQ01QM19VbnBhY2tGcmFtZUhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19VbnBhY2tGcmFtZUhlYWRlciwgT01YQUNNUDNfU1VGRklYKQotI2RlZmluZSBvbXhBQ01QM19VbnBhY2tTY2FsZUZhY3RvcnNfUzggICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19VbnBhY2tTY2FsZUZhY3RvcnNfUzgsIE9NWEFDTVAzX1NVRkZJWCkKLSNkZWZpbmUgb214QUNNUDNfVW5wYWNrU2lkZUluZm8gICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfVW5wYWNrU2lkZUluZm8sIE9NWEFDTVAzX1NVRkZJWCkKLQotI2RlZmluZSBvbXhJQ0pQX0NvcHlFeHBhbmRfVThfQzMgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0NvcHlFeHBhbmRfVThfQzMsIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RDVEZ3ZF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVEZ3ZF9TMTYsIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RDVEZ3ZF9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVEZ3ZF9TMTZfSSwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRENUSW52X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUSW52X1MxNiwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRENUSW52X1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUSW52X1MxNl9JLCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEZ3ZF9NdWx0aXBsZV9TMTYgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEZ3ZF9NdWx0aXBsZV9TMTYsIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50RndkX1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50RndkX1MxNiwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRENUUXVhbnRGd2RfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRGd2RfUzE2X0ksIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50RndkVGFibGVJbml0ICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50RndkVGFibGVJbml0LCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEludl9NdWx0aXBsZV9TMTYgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEludl9NdWx0aXBsZV9TMTYsIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50SW52X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50SW52X1MxNiwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRENUUXVhbnRJbnZfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRJbnZfUzE2X0ksIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50SW52VGFibGVJbml0ICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50SW52VGFibGVJbml0LCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9EZWNvZGVIdWZmbWFuOHg4X0RpcmVjdF9TMTZfQzEgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EZWNvZGVIdWZmbWFuOHg4X0RpcmVjdF9TMTZfQzEsIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RlY29kZUh1ZmZtYW5TcGVjR2V0QnVmU2l6ZV9VOCAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RlY29kZUh1ZmZtYW5TcGVjR2V0QnVmU2l6ZV9VOCwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRGVjb2RlSHVmZm1hblNwZWNJbml0X1U4ICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRGVjb2RlSHVmZm1hblNwZWNJbml0X1U4LCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9FbmNvZGVIdWZmbWFuOHg4X0RpcmVjdF9TMTZfVTFfQzEgICAgICAgICBPTVhDQVRCQVIoSUNKUF9FbmNvZGVIdWZmbWFuOHg4X0RpcmVjdF9TMTZfVTFfQzEsIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0VuY29kZUh1ZmZtYW5TcGVjR2V0QnVmU2l6ZV9VOCAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0VuY29kZUh1ZmZtYW5TcGVjR2V0QnVmU2l6ZV9VOCwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRW5jb2RlSHVmZm1hblNwZWNJbml0X1U4ICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRW5jb2RlSHVmZm1hblNwZWNJbml0X1U4LCBPTVhJQ0pQX1NVRkZJWCkKLQotI2RlZmluZSBvbXhJUEJNX0FkZENfVThfQzFSX1NmcyAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUEJNX0FkZENfVThfQzFSX1NmcywgT01YSVBCTV9TVUZGSVgpCi0jZGVmaW5lIG9teElQQk1fQ29weV9VOF9DMVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQk1fQ29weV9VOF9DMVIsIE9NWElQQk1fU1VGRklYKQotI2RlZmluZSBvbXhJUEJNX0NvcHlfVThfQzNSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUEJNX0NvcHlfVThfQzNSLCBPTVhJUEJNX1NVRkZJWCkKLSNkZWZpbmUgb214SVBCTV9NaXJyb3JfVThfQzFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBCTV9NaXJyb3JfVThfQzFSLCBPTVhJUEJNX1NVRkZJWCkKLSNkZWZpbmUgb214SVBCTV9NdWxDX1U4X0MxUl9TZnMgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBCTV9NdWxDX1U4X0MxUl9TZnMsIE9NWElQQk1fU1VGRklYKQotCi0jZGVmaW5lIG9teElQQ1NfQ29sb3JUd2lzdFExNF9VOF9DM1IgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfQ29sb3JUd2lzdFExNF9VOF9DM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX0JHUjU2NVRvWUNiQ3I0MjBMU19NQ1VfVTE2X1MxNl9DM1AzUiAgICAgIE9NWENBVEJBUihJUENTX0JHUjU2NVRvWUNiQ3I0MjBMU19NQ1VfVTE2X1MxNl9DM1AzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfQkdSNTY1VG9ZQ2JDcjQyMkxTX01DVV9VMTZfUzE2X0MzUDNSICAgICAgT01YQ0FUQkFSKElQQ1NfQkdSNTY1VG9ZQ2JDcjQyMkxTX01DVV9VMTZfUzE2X0MzUDNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19CR1I1NjVUb1lDYkNyNDQ0TFNfTUNVX1UxNl9TMTZfQzNQM1IgICAgICBPTVhDQVRCQVIoSVBDU19CR1I1NjVUb1lDYkNyNDQ0TFNfTUNVX1UxNl9TMTZfQzNQM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX0JHUjg4OFRvWUNiQ3I0MjBMU19NQ1VfVThfUzE2X0MzUDNSICAgICAgIE9NWENBVEJBUihJUENTX0JHUjg4OFRvWUNiQ3I0MjBMU19NQ1VfVThfUzE2X0MzUDNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19CR1I4ODhUb1lDYkNyNDIyTFNfTUNVX1U4X1MxNl9DM1AzUiAgICAgICBPTVhDQVRCQVIoSVBDU19CR1I4ODhUb1lDYkNyNDIyTFNfTUNVX1U4X1MxNl9DM1AzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfQkdSODg4VG9ZQ2JDcjQ0NExTX01DVV9VOF9TMTZfQzNQM1IgICAgICAgT01YQ0FUQkFSKElQQ1NfQkdSODg4VG9ZQ2JDcjQ0NExTX01DVV9VOF9TMTZfQzNQM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDIwUnN6Q3NjUm90QkdSX1U4X1AzQzNSICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIwUnN6Q3NjUm90QkdSX1U4X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMFJzelJvdF9VOF9QM1IgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMFJzelJvdF9VOF9QM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDIwVG9CR1I1NjVfVThfVTE2X1AzQzNSICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIwVG9CR1I1NjVfVThfVTE2X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMFRvQkdSNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMFRvQkdSNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDIwVG9CR1I4ODhMU19NQ1VfUzE2X1U4X1AzQzNSICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIwVG9CR1I4ODhMU19NQ1VfUzE2X1U4X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMlJzekNzY1JvdEJHUl9VOF9QM0MzUiAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMlJzekNzY1JvdEJHUl9VOF9QM0MzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfQ2JZQ3JZNDIyUnN6Q3NjUm90QkdSX1U4X1UxNl9DMlIgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfQ2JZQ3JZNDIyUnN6Q3NjUm90QkdSX1U4X1UxNl9DMlIsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDIyUnN6Um90X1U4X1AzUiAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIyUnN6Um90X1U4X1AzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiWUNyNDIyVG9CR1I1NjVfVThfVTE2X0MyQzNSICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiWUNyNDIyVG9CR1I1NjVfVThfVTE2X0MyQzNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMlRvQkdSNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMlRvQkdSNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYllDcjQyMlRvQkdSODg4X1U4X0MyQzNSICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYllDcjQyMlRvQkdSODg4X1U4X0MyQzNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMlRvQkdSODg4TFNfTUNVX1MxNl9VOF9QM0MzUiAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMlRvQkdSODg4TFNfTUNVX1MxNl9VOF9QM0MzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjJUb0JHUjg4OExTX01DVV9TMTZfVThfUDNDM1IgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjJUb0JHUjg4OExTX01DVV9TMTZfVThfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX0NiWUNyWTQyMlRvWUNiQ3I0MjBSb3RhdGVfVThfQzJQM1IgICAgICAgIE9NWENBVEJBUihJUENTX0NiWUNyWTQyMlRvWUNiQ3I0MjBSb3RhdGVfVThfQzJQM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDIyVG9ZQ2JDcjQyMFJvdGF0ZV9VOF9QM1IgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIyVG9ZQ2JDcjQyMFJvdGF0ZV9VOF9QM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDQ0VG9CR1I1NjVfVThfVTE2X0MzUiAgICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDQ0VG9CR1I1NjVfVThfVTE2X0MzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiQ3I0NDRUb0JHUjU2NV9VOF9VMTZfUDNDM1IgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0NDRUb0JHUjU2NV9VOF9VMTZfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDQ0VG9CR1I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUiAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDQ0VG9CR1I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiQ3I0NDRUb0JHUjg4OF9VOF9DM1IgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0NDRUb0JHUjg4OF9VOF9DM1IsIE9NWElQQ1NfU1VGRklYKQotCi0jZGVmaW5lIG9teElQUFBfRGVibG9ja19Ib3JFZGdlX1U4X0kgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfRGVibG9ja19Ib3JFZGdlX1U4X0ksIE9NWElQUFBfU1VGRklYKQotI2RlZmluZSBvbXhJUFBQX0RlYmxvY2tfVmVyRWRnZV9VOF9JICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX0RlYmxvY2tfVmVyRWRnZV9VOF9JLCBPTVhJUFBQX1NVRkZJWCkKLSNkZWZpbmUgb214SVBQUF9GaWx0ZXJGSVJfVThfQzFSICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9GaWx0ZXJGSVJfVThfQzFSLCBPTVhJUFBQX1NVRkZJWCkKLSNkZWZpbmUgb214SVBQUF9GaWx0ZXJNZWRpYW5fVThfQzFSICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9GaWx0ZXJNZWRpYW5fVThfQzFSLCBPTVhJUFBQX1NVRkZJWCkKLSNkZWZpbmUgb214SVBQUF9HZXRDZW50cmFsTW9tZW50X1M2NCAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9HZXRDZW50cmFsTW9tZW50X1M2NCwgT01YSVBQUF9TVUZGSVgpCi0jZGVmaW5lIG9teElQUFBfR2V0U3BhdGlhbE1vbWVudF9TNjQgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfR2V0U3BhdGlhbE1vbWVudF9TNjQsIE9NWElQUFBfU1VGRklYKQotI2RlZmluZSBvbXhJUFBQX01vbWVudEdldFN0YXRlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX01vbWVudEdldFN0YXRlU2l6ZSwgT01YSVBQUF9TVUZGSVgpCi0jZGVmaW5lIG9teElQUFBfTW9tZW50SW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfTW9tZW50SW5pdCwgT01YSVBQUF9TVUZGSVgpCi0jZGVmaW5lIG9teElQUFBfTW9tZW50c19VOF9DMVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfTW9tZW50c19VOF9DMVIsIE9NWElQUFBfU1VGRklYKQotI2RlZmluZSBvbXhJUFBQX01vbWVudHNfVThfQzNSICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX01vbWVudHNfVThfQzNSLCBPTVhJUFBQX1NVRkZJWCkKLQotI2RlZmluZSBvbXhTUF9CbG9ja0V4cF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9CbG9ja0V4cF9TMTYsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfQmxvY2tFeHBfUzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfQmxvY2tFeHBfUzMyLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0NvcHlfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0NvcHlfUzE2LCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0RvdFByb2RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0RvdFByb2RfUzE2LCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0RvdFByb2RfUzE2X1NmcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0RvdFByb2RfUzE2X1NmcywgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRGd2RfQ1RvQ19TQzE2X1NmcyAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRGd2RfQ1RvQ19TQzE2X1NmcywgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRGd2RfQ1RvQ19TQzMyX1NmcyAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRGd2RfQ1RvQ19TQzMyX1NmcywgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRGd2RfUlRvQ0NTX1MxNlMzMl9TZnMgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRGd2RfUlRvQ0NTX1MxNlMzMl9TZnMsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRkZURndkX1JUb0NDU19TMzJfU2ZzICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZURndkX1JUb0NDU19TMzJfU2ZzLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEdldEJ1ZlNpemVfQ19TQzE2ICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEdldEJ1ZlNpemVfQ19TQzE2LCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEdldEJ1ZlNpemVfQ19TQzMyICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEdldEJ1ZlNpemVfQ19TQzMyLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEdldEJ1ZlNpemVfUl9TMTZTMzIgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEdldEJ1ZlNpemVfUl9TMTZTMzIsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRkZUR2V0QnVmU2l6ZV9SX1MzMiAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUR2V0QnVmU2l6ZV9SX1MzMiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRJbml0X0NfU0MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbml0X0NfU0MxNiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRJbml0X0NfU0MzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbml0X0NfU0MzMiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRJbml0X1JfUzE2UzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbml0X1JfUzE2UzMyLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEluaXRfUl9TMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEluaXRfUl9TMzIsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRkZUSW52X0NDU1RvUl9TMzJfU2ZzICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUSW52X0NDU1RvUl9TMzJfU2ZzLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEludl9DQ1NUb1JfUzMyUzE2X1NmcyAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEludl9DQ1NUb1JfUzMyUzE2X1NmcywgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRJbnZfQ1RvQ19TQzE2X1NmcyAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbnZfQ1RvQ19TQzE2X1NmcywgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRJbnZfQ1RvQ19TQzMyX1NmcyAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbnZfQ1RvQ19TQzMyX1NmcywgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GaWx0ZXJNZWRpYW5fUzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GaWx0ZXJNZWRpYW5fUzMyLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZpbHRlck1lZGlhbl9TMzJfSSAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZpbHRlck1lZGlhbl9TMzJfSSwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GSVJfRGlyZWN0X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJfRGlyZWN0X1MxNiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GSVJfRGlyZWN0X1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJfRGlyZWN0X1MxNl9JLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZJUl9EaXJlY3RfUzE2X0lTZnMgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUl9EaXJlY3RfUzE2X0lTZnMsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRklSX0RpcmVjdF9TMTZfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklSX0RpcmVjdF9TMTZfU2ZzLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZJUk9uZV9EaXJlY3RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUk9uZV9EaXJlY3RfUzE2LCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZJUk9uZV9EaXJlY3RfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUk9uZV9EaXJlY3RfUzE2X0ksIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRklST25lX0RpcmVjdF9TMTZfSVNmcyAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklST25lX0RpcmVjdF9TMTZfSVNmcywgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GSVJPbmVfRGlyZWN0X1MxNl9TZnMgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJPbmVfRGlyZWN0X1MxNl9TZnMsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfSUlSX0JpUXVhZERpcmVjdF9TMTYgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlSX0JpUXVhZERpcmVjdF9TMTYsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfSUlSX0JpUXVhZERpcmVjdF9TMTZfSSAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlSX0JpUXVhZERpcmVjdF9TMTZfSSwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9JSVJfRGlyZWN0X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJfRGlyZWN0X1MxNiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9JSVJfRGlyZWN0X1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJfRGlyZWN0X1MxNl9JLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0lJUk9uZV9CaVF1YWREaXJlY3RfUzE2ICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUk9uZV9CaVF1YWREaXJlY3RfUzE2LCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0lJUk9uZV9CaVF1YWREaXJlY3RfUzE2X0kgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUk9uZV9CaVF1YWREaXJlY3RfUzE2X0ksIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfSUlST25lX0RpcmVjdF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlST25lX0RpcmVjdF9TMTYsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfSUlST25lX0RpcmVjdF9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlST25lX0RpcmVjdF9TMTZfSSwgT01YU1BfU1VGRklYKQotCi0jZGVmaW5lIG9teFZDQ09NTV9BdmVyYWdlXzE2eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9BdmVyYWdlXzE2eCwgT01YVkNDT01NX1NVRkZJWCkKLSNkZWZpbmUgb214VkNDT01NX0F2ZXJhZ2VfOHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0F2ZXJhZ2VfOHgsIE9NWFZDQ09NTV9TVUZGSVgpCi0jZGVmaW5lIG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2sgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2ssIE9NWFZDQ09NTV9TVUZGSVgpCi0jZGVmaW5lIG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2tfU0FEICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2tfU0FELCBPTVhWQ0NPTU1fU1VGRklYKQotI2RlZmluZSBvbXhWQ0NPTU1fQ29weTE2eDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fQ29weTE2eDE2LCBPTVhWQ0NPTU1fU1VGRklYKQotI2RlZmluZSBvbXhWQ0NPTU1fQ29weTh4OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fQ29weTh4OCwgT01YVkNDT01NX1NVRkZJWCkKLSNkZWZpbmUgb214VkNDT01NX0V4cGFuZEZyYW1lX0kgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0V4cGFuZEZyYW1lX0ksIE9NWFZDQ09NTV9TVUZGSVgpCi0jZGVmaW5lIG9teFZDQ09NTV9MaW1pdE1WVG9SZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9MaW1pdE1WVG9SZWN0LCBPTVhWQ0NPTU1fU1VGRklYKQotI2RlZmluZSBvbXhWQ0NPTU1fU0FEXzE2eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fU0FEXzE2eCwgT01YVkNDT01NX1NVRkZJWCkKLSNkZWZpbmUgb214VkNDT01NX1NBRF84eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX1NBRF84eCwgT01YVkNDT01NX1NVRkZJWCkKLQotI2RlZmluZSBvbXhWQ000UDEwX0F2ZXJhZ2VfNHggICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0F2ZXJhZ2VfNHgsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZiAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZiwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9CbG9ja01hdGNoX1F1YXJ0ZXIgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9CbG9ja01hdGNoX1F1YXJ0ZXIsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSSAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0RlYmxvY2tDaHJvbWFfSSwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfRGVibG9ja0x1bWFfSSAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRGVibG9ja0x1bWFfSSwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQyAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQywgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkIE9NWENBVEJBUihWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSSAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSSwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0kgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0ksIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSSAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSSwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9HZXRWTENJbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9HZXRWTENJbmZvLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYSAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYSwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfQ2hyb21hREMgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfQ2hyb21hREMsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfTHVtYURDICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfTHVtYURDLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1SZXNpZHVhbEFuZEFkZCAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9JbnZUcmFuc2Zvcm1SZXNpZHVhbEFuZEFkZCwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfTUVHZXRCdWZTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfTUVHZXRCdWZTaXplLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9NRUluaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9NRUluaXQsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQiAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQiwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2ICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2LCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0ICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0LCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4ICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfU0FEXzR4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfU0FEXzR4LCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9TQURRdWFyXzE2eCAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9TQURRdWFyXzE2eCwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfU0FEUXVhcl80eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfU0FEUXVhcl80eCwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfU0FEUXVhcl84eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfU0FEUXVhcl84eCwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfU0FURF80eDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfU0FURF80eDQsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX1N1YkFuZFRyYW5zZm9ybVFEUVJlc2lkdWFsICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1N1YkFuZFRyYW5zZm9ybVFEUVJlc2lkdWFsLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpciAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpciwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9DaHJvbWFEQyAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9DaHJvbWFEQywgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfTHVtYURDICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfTHVtYURDLCBPTVhWQ000UDEwX1NVRkZJWCkKLQotI2RlZmluZSBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2ICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2LCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OCAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OCwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl84eDggICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl84eDgsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9EQ1Q4eDhibGsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EQ1Q4eDhibGssIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQywgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX0VuY29kZU1WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0VuY29kZU1WLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhQUNWTEMgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhQUNWTEMsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQywgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX0ZpbmRNVnByZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0ZpbmRNVnByZWQsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9JRENUOHg4YmxrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9JRENUOHg4YmxrLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfTUNSZWNvbkJsb2NrICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfTUNSZWNvbkJsb2NrLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfTUVHZXRCdWZTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfTUVHZXRCdWZTaXplLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfTUVJbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfTUVJbml0LCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfTW90aW9uRXN0aW1hdGlvbk1CICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfTW90aW9uRXN0aW1hdGlvbk1CLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfUXVhbnRJbnRlcl9JICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfUXVhbnRJbnRlcl9JLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfUXVhbnRJbnRyYV9JICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfUXVhbnRJbnRyYV9JLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfUXVhbnRJbnZJbnRlcl9JLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfUXVhbnRJbnZJbnRyYV9JLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50ZXIgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50ZXIsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYSAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYSwgT01YVkNNNFAyX1NVRkZJWCkKLQotCi0jZW5kaWYgLyogX2FybU9NWF9oXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9vbXh0eXBlcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9vbXh0eXBlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTJjYjBkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvb214dHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKioKLSAqIEZpbGU6IG9teHR5cGVzLmgKLSAqIEJyaWVmOiBEZWZpbmVzIGJhc2ljIERhdGEgdHlwZXMgdXNlZCBpbiBPcGVuTUFYIHYxLjAuMiBoZWFkZXIgZmlsZXMuCi0gKgotICogQ29weXJpZ2h0IKkgMjAwNS0yMDA4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCi0gKgotICogVGhlc2UgbWF0ZXJpYWxzIGFyZSBwcm90ZWN0ZWQgYnkgY29weXJpZ2h0IGxhd3MgYW5kIGNvbnRhaW4gbWF0ZXJpYWwgCi0gKiBwcm9wcmlldGFyeSB0byB0aGUgS2hyb25vcyBHcm91cCwgSW5jLiAgWW91IG1heSB1c2UgdGhlc2UgbWF0ZXJpYWxzIAotICogZm9yIGltcGxlbWVudGluZyBLaHJvbm9zIHNwZWNpZmljYXRpb25zLCB3aXRob3V0IGFsdGVyaW5nIG9yIHJlbW92aW5nIAotICogYW55IHRyYWRlbWFyaywgY29weXJpZ2h0IG9yIG90aGVyIG5vdGljZSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uLgotICogCi0gKiBLaHJvbm9zIEdyb3VwIG1ha2VzIG5vLCBhbmQgZXhwcmVzc2x5IGRpc2NsYWltcyBhbnksIHJlcHJlc2VudGF0aW9ucyAKLSAqIG9yIHdhcnJhbnRpZXMsIGV4cHJlc3Mgb3IgaW1wbGllZCwgcmVnYXJkaW5nIHRoZXNlIG1hdGVyaWFscywgaW5jbHVkaW5nLCAKLSAqIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgb3IgZml0bmVzcyAKLSAqIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBvciBub24taW5mcmluZ2VtZW50IG9mIGFueSBpbnRlbGxlY3R1YWwgcHJvcGVydHkuIAotICogS2hyb25vcyBHcm91cCBtYWtlcyBubywgYW5kIGV4cHJlc3NseSBkaXNjbGFpbXMgYW55LCB3YXJyYW50aWVzLCBleHByZXNzIAotICogb3IgaW1wbGllZCwgcmVnYXJkaW5nIHRoZSBjb3JyZWN0bmVzcywgYWNjdXJhY3ksIGNvbXBsZXRlbmVzcywgdGltZWxpbmVzcywgCi0gKiBhbmQgcmVsaWFiaWxpdHkgb2YgdGhlc2UgbWF0ZXJpYWxzLiAKLSAqCi0gKiBVbmRlciBubyBjaXJjdW1zdGFuY2VzIHdpbGwgdGhlIEtocm9ub3MgR3JvdXAsIG9yIGFueSBvZiBpdHMgUHJvbW90ZXJzLCAKLSAqIENvbnRyaWJ1dG9ycyBvciBNZW1iZXJzIG9yIHRoZWlyIHJlc3BlY3RpdmUgcGFydG5lcnMsIG9mZmljZXJzLCBkaXJlY3RvcnMsIAotICogZW1wbG95ZWVzLCBhZ2VudHMgb3IgcmVwcmVzZW50YXRpdmVzIGJlIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMsIHdoZXRoZXIgCi0gKiBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBmb3IgbG9zdCByZXZlbnVlcywgCi0gKiBsb3N0IHByb2ZpdHMsIG9yIG90aGVyd2lzZSwgYXJpc2luZyBmcm9tIG9yIGluIGNvbm5lY3Rpb24gd2l0aCB0aGVzZSAKLSAqIG1hdGVyaWFscy4KLSAqIAotICogS2hyb25vcyBhbmQgT3Blbk1BWCBhcmUgdHJhZGVtYXJrcyBvZiB0aGUgS2hyb25vcyBHcm91cCBJbmMuIAotICoKLSAqLwotICAKLSNpZm5kZWYgX09NWFRZUEVTX0hfCi0jZGVmaW5lIF9PTVhUWVBFU19IXwotCi0jaW5jbHVkZSA8bGltaXRzLmg+IAotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jZGVmaW5lIE9NWF9JTgotI2RlZmluZSBPTVhfT1VUCi0jZGVmaW5lIE9NWF9JTk9VVAotCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgCi0gICAgLyogTWFuZGF0b3J5IHJldHVybiBjb2RlcyAtIHVzZSBjYXNlcyBhcmUgZXhwbGljaXRseSBkZXNjcmliZWQgZm9yIGVhY2ggZnVuY3Rpb24gKi8KLSAgICBPTVhfU3RzX05vRXJyICAgICAgICAgICAgICAgICAgICA9ICAwLCAgICAvKiBObyBlcnJvciwgdGhlIGZ1bmN0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgKi8KLSAgICBPTVhfU3RzX0VyciAgICAgICAgICAgICAgICAgICAgICA9IC0yLCAgICAvKiBVbmtub3duL3Vuc3BlY2lmaWVkIGVycm9yICovICAgIAotICAgIE9NWF9TdHNfSW52YWxpZEJpdHN0cmVhbVZhbEVyciAgID0gLTE4MiwgIC8qIEludmFsaWQgdmFsdWUgZGV0ZWN0ZWQgZHVyaW5nIGJpdHN0cmVhbSBwcm9jZXNzaW5nICovICAgIAotICAgIE9NWF9TdHNfTWVtQWxsb2NFcnIgICAgICAgICAgICAgID0gLTksICAgIC8qIE5vdCBlbm91Z2ggbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGhlIG9wZXJhdGlvbiAqLwotICAgIE9NWF9TdHNBQ0FBQ19HYWluQ3RyRXJyICAgIAkgICAgID0gLTE1OSwgIC8qIEFBQzogVW5zdXBwb3J0ZWQgZ2FpbiBjb250cm9sIGRhdGEgZGV0ZWN0ZWQgKi8KLSAgICBPTVhfU3RzQUNBQUNfUHJnTnVtRXJyICAgICAgICAgICA9IC0xNjcsICAvKiBBQUM6IEludmFsaWQgbnVtYmVyIG9mIGVsZW1lbnRzIGZvciBvbmUgcHJvZ3JhbSAgICovCi0gICAgT01YX1N0c0FDQUFDX0NvZWZWYWxFcnIgICAgICAgICAgPSAtMTYzLCAgLyogQUFDOiBJbnZhbGlkIHF1YW50aXplZCBjb2VmZmljaWVudCB2YWx1ZSAgICAgICAgICAqLyAgICAgCi0gICAgT01YX1N0c0FDQUFDX01heFNmYkVyciAgICAgICAgICAgPSAtMTYyLCAgLyogQUFDOiBJbnZhbGlkIG1heFNmYiB2YWx1ZSBpbiByZWxhdGlvbiB0byBudW1Td2IgKi8gICAgCi0JT01YX1N0c0FDQUFDX1Bsc0RhdGFFcnIJCSAgICAgPSAtMTYwLCAgLyogQUFDOiBwdWxzZSBlc2NhcGUgc2VxdWVuY2UgZGF0YSBlcnJvciAqLwotCi0gICAgLyogT3B0aW9uYWwgcmV0dXJuIGNvZGVzIC0gdXNlIGNhc2VzIGFyZSBleHBsaWNpdGx5IGRlc2NyaWJlZCBmb3IgZWFjaCBmdW5jdGlvbiovCi0gICAgT01YX1N0c19CYWRBcmdFcnIgICAgICAgICAgICAgICAgPSAtNSwgICAgLyogQmFkIEFyZ3VtZW50cyAqLwotCi0gICAgT01YX1N0c0FDQUFDX1Ruc051bUZpbHRFcnIgICAgICAgPSAtMTU3LCAgLyogQUFDOiBJbnZhbGlkIG51bWJlciBvZiBUTlMgZmlsdGVycyAgKi8KLSAgICBPTVhfU3RzQUNBQUNfVG5zTGVuRXJyICAgICAgICAgICA9IC0xNTYsICAvKiBBQUM6IEludmFsaWQgVE5TIHJlZ2lvbiBsZW5ndGggICovICAgCi0gICAgT01YX1N0c0FDQUFDX1Ruc09yZGVyRXJyICAgICAgICAgPSAtMTU1LCAgLyogQUFDOiBJbnZhbGlkIG9yZGVyIG9mIFROUyBmaWx0ZXIgICovICAgICAgICAgICAgICAgICAgCi0gICAgT01YX1N0c0FDQUFDX1Ruc0NvZWZSZXNFcnIgICAgICAgPSAtMTU0LCAgLyogQUFDOiBJbnZhbGlkIGJpdC1yZXNvbHV0aW9uIGZvciBUTlMgZmlsdGVyIGNvZWZmaWNpZW50cyAgKi8KLSAgICBPTVhfU3RzQUNBQUNfVG5zQ29lZkVyciAgICAgICAgICA9IC0xNTMsICAvKiBBQUM6IEludmFsaWQgVE5TIGZpbHRlciBjb2VmZmljaWVudHMgICovICAgICAgICAgICAgICAgICAgCi0gICAgT01YX1N0c0FDQUFDX1Ruc0RpcmVjdEVyciAgICAgICAgPSAtMTUyLCAgLyogQUFDOiBJbnZhbGlkIFROUyBmaWx0ZXIgZGlyZWN0aW9uICAqLyAgCi0KLSAgICBPTVhfU3RzSUNKUF9KUEVHTWFya2VyRXJyICAgICAgICA9IC0xODMsICAvKiBKUEVHIG1hcmtlciBlbmNvdW50ZXJlZCB3aXRoaW4gYW4gZW50cm9weS1jb2RlZCBibG9jazsgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBIdWZmbWFuIGRlY29kaW5nIG9wZXJhdGlvbiB0ZXJtaW5hdGVkIGVhcmx5LiAgICAgICAgICAgKi8KLSAgICBPTVhfU3RzSUNKUF9KUEVHTWFya2VyICAgICAgICAgICA9IC0xODEsICAvKiBKUEVHIG1hcmtlciBlbmNvdW50ZXJlZDsgSHVmZm1hbiBkZWNvZGluZyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9wZXJhdGlvbiB0ZXJtaW5hdGVkIGVhcmx5LiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIE9NWF9TdHNJUFBQX0NvbnRleHRNYXRjaEVyciAgICAgID0gLTE3LCAgIC8qIENvbnRleHQgcGFyYW1ldGVyIGRvZXNuJ3QgbWF0Y2ggdG8gdGhlIG9wZXJhdGlvbiAqLwotCi0gICAgT01YX1N0c1NQX0V2ZW5NZWRpYW5NYXNrU2l6ZUVyciAgPSAtMTgwLCAgLyogRXZlbiBzaXplIG9mIHRoZSBNZWRpYW4gRmlsdGVyIG1hc2sgd2FzIHJlcGxhY2VkIGJ5IHRoZSBvZGQgb25lICovCi0KLSAgICBPTVhfU3RzX01heGltdW1FbnVtZXJhdGlvbiAgICAgICA9IElOVF9NQVggIC8qUGxhY2Vob2xkZXIsIGZvcmNlcyBlbnVtIG9mIHNpemUgT01YX0lOVCovCi0gICAgCi0gfSBPTVhSZXN1bHQ7ICAgICAgICAgIC8qKiBSZXR1cm4gdmFsdWUgb3IgZXJyb3IgdmFsdWUgcmV0dXJuZWQgZnJvbSBhIGZ1bmN0aW9uLiBJZGVudGljYWwgdG8gT01YX0lOVCAqLwotCi0gCi0vKiBPTVhfVTggKi8KLXR5cGVkZWYgdWludDhfdCBPTVhfVTg7Ci0gCi0vKiBPTVhfUzggKi8KLXR5cGVkZWYgaW50OF90IE9NWF9TODsKLSAKLS8qIE9NWF9VMTYgKi8KLXR5cGVkZWYgdWludDE2X3QgT01YX1UxNjsKLQotLyogT01YX1MxNiAqLwotdHlwZWRlZiBpbnQxNl90IE9NWF9TMTY7Ci0KLS8qIE9NWF9VMzIgKi8KLXR5cGVkZWYgdWludDMyX3QgT01YX1UzMjsKLQotLyogT01YX1MzMiAqLwotdHlwZWRlZiBpbnQzMl90IE9NWF9TMzI7Ci0KLS8qIE9NWF9VNjQgJiBPTVhfUzY0ICovCi0jaWYgZGVmaW5lZCggX1dJTjMyICkgfHwgZGVmaW5lZCAoIF9XSU42NCApCi0gICAgdHlwZWRlZiBfX2ludDY0IE9NWF9TNjQ7IC8qKiBTaWduZWQgNjQtYml0IGludGVnZXIgKi8KLSAgICB0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgT01YX1U2NDsgLyoqIFVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyICovCi0gICAgI2RlZmluZSBPTVhfTUlOX1M2NAkJCSgweDgwMDAwMDAwMDAwMDAwMDBpNjQpCi0gICAgI2RlZmluZSBPTVhfTUlOX1U2NAkJCSgweDAwMDAwMDAwMDAwMDAwMDBpNjQpCi0gICAgI2RlZmluZSBPTVhfTUFYX1M2NAkJCSgweDdGRkZGRkZGRkZGRkZGRkZpNjQpCi0gICAgI2RlZmluZSBPTVhfTUFYX1U2NAkJCSgweEZGRkZGRkZGRkZGRkZGRkZpNjQpCi0jZWxzZQotICAgIHR5cGVkZWYgaW50NjRfdCBPTVhfUzY0OyAvKiogU2lnbmVkIDY0LWJpdCBpbnRlZ2VyICovCi0gICAgdHlwZWRlZiB1aW50NjRfdCBPTVhfVTY0OyAvKiogVW5zaWduZWQgNjQtYml0IGludGVnZXIgKi8KLSAgICAjZGVmaW5lIE9NWF9NSU5fUzY0CQkJKDB4ODAwMDAwMDAwMDAwMDAwMExMKQotICAgICNkZWZpbmUgT01YX01JTl9VNjQJCQkoMHgwMDAwMDAwMDAwMDAwMDAwTEwpCi0gICAgI2RlZmluZSBPTVhfTUFYX1M2NAkJCSgweDdGRkZGRkZGRkZGRkZGRkZMTCkKLSAgICAjZGVmaW5lIE9NWF9NQVhfVTY0CQkJKDB4RkZGRkZGRkZGRkZGRkZGRkxMKQotI2VuZGlmCi0KLS8qIE9NWF9TQzggKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIE9NWF9TOCBSZTsgLyoqIFJlYWwgcGFydCAqLwotICBPTVhfUzggSW07IC8qKiBJbWFnaW5hcnkgcGFydCAqLwkKLQkKLX0gT01YX1NDODsgLyoqIFNpZ25lZCA4LWJpdCBjb21wbGV4IG51bWJlciAqLwotCi0KLS8qIE9NWF9TQzE2ICovCi10eXBlZGVmIHN0cnVjdAotewotICBPTVhfUzE2IFJlOyAvKiogUmVhbCBwYXJ0ICovCi0gIE9NWF9TMTYgSW07IC8qKiBJbWFnaW5hcnkgcGFydCAqLwkKLQkKLX0gT01YX1NDMTY7IC8qKiBTaWduZWQgMTYtYml0IGNvbXBsZXggbnVtYmVyICovCi0KLQotLyogT01YX1NDMzIgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIE9NWF9TMzIgUmU7IC8qKiBSZWFsIHBhcnQgKi8KLSAgT01YX1MzMiBJbTsgLyoqIEltYWdpbmFyeSBwYXJ0ICovCQotCQotfSBPTVhfU0MzMjsgLyoqIFNpZ25lZCAzMi1iaXQgY29tcGxleCBudW1iZXIgKi8KLQotCi0vKiBPTVhfU0M2NCAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgT01YX1M2NCBSZTsgLyoqIFJlYWwgcGFydCAqLwotICBPTVhfUzY0IEltOyAvKiogSW1hZ2luYXJ5IHBhcnQgKi8JCi0JCi19IE9NWF9TQzY0OyAvKiogU2lnbmVkIDY0LWJpdCBjb21wbGV4IG51bWJlciAqLwotCi0KLS8qIE9NWF9GMzIgKi8KLXR5cGVkZWYgZmxvYXQgT01YX0YzMjsgLyoqIFNpbmdsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQsSUVFRSA3NTQgKi8KLQotCi0vKiBPTVhfRjY0ICovCi10eXBlZGVmIGRvdWJsZSBPTVhfRjY0OyAvKiogRG91YmxlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCxJRUVFIDc1NCAqLwotCi0KLS8qIE9NWF9JTlQgKi8KLXR5cGVkZWYgaW50IE9NWF9JTlQ7IC8qKiBzaWduZWQgaW50ZWdlciBjb3JyZXNwb25kaW5nIHRvIG1hY2hpbmUgd29yZCBsZW5ndGgsIGhhcyBtYXhpbXVtIHNpZ25lZCB2YWx1ZSBJTlRfTUFYKi8KLQotCi0jZGVmaW5lIE9NWF9NSU5fUzggIAkgICAJKC0xMjgpCi0jZGVmaW5lIE9NWF9NSU5fVTggIAkJMAotI2RlZmluZSBPTVhfTUlOX1MxNgkJIAkoLTMyNzY4KQotI2RlZmluZSBPTVhfTUlOX1UxNgkJCTAKLSNkZWZpbmUgT01YX01JTl9TMzIJCQkoLTIxNDc0ODM2NDctMSkKLSNkZWZpbmUgT01YX01JTl9VMzIJCQkwCi0KLSNkZWZpbmUgT01YX01BWF9TOAkJCSgxMjcpCi0jZGVmaW5lIE9NWF9NQVhfVTgJCQkoMjU1KQotI2RlZmluZSBPTVhfTUFYX1MxNgkJCSgzMjc2NykKLSNkZWZpbmUgT01YX01BWF9VMTYJCQkoMHhGRkZGKQotI2RlZmluZSBPTVhfTUFYX1MzMgkJCSgyMTQ3NDgzNjQ3KQotI2RlZmluZSBPTVhfTUFYX1UzMgkJCSgweEZGRkZGRkZGKQotCi10eXBlZGVmIHZvaWQgT01YVm9pZDsKLQotI2lmbmRlZiBOVUxMCi0jZGVmaW5lIE5VTEwgKCh2b2lkKikwKQotI2VuZGlmCi0KLS8qKiBEZWZpbmVzIHRoZSBnZW9tZXRyaWMgcG9zaXRpb24gYW5kIHNpemUgb2YgYSByZWN0YW5nbGUsIAotICAqIHdoZXJlIHgseSBkZWZpbmVzIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgdG9wIGxlZnQgY29ybmVyCi0gICogb2YgdGhlIHJlY3RhbmdsZSwgd2l0aCBkaW1lbnNpb25zIHdpZHRoIGluIHRoZSB4LWRpcmVjdGlvbiAKLSAgKiBhbmQgaGVpZ2h0IGluIHRoZSB5LWRpcmVjdGlvbiAqLwotdHlwZWRlZiBzdHJ1Y3QgewotCU9NWF9JTlQgeDsgICAgICAvKiogeC1jb29yZGluYXRlIG9mIHRvcCBsZWZ0IGNvcm5lciBvZiByZWN0YW5nbGUgKi8KLQlPTVhfSU5UIHk7ICAgICAgLyoqIHktY29vcmRpbmF0ZSBvZiB0b3AgbGVmdCBjb3JuZXIgb2YgcmVjdGFuZ2xlICovCi0JT01YX0lOVCB3aWR0aDsgIC8qKiBXaWR0aCBpbiB0aGUgeC1kaXJlY3Rpb24uICovCi0JT01YX0lOVCBoZWlnaHQ7IC8qKiBIZWlnaHQgaW4gdGhlIHktZGlyZWN0aW9uLiAqLwotfU9NWFJlY3Q7Ci0KLQotLyoqIERlZmluZXMgdGhlIGdlb21ldHJpYyBwb3NpdGlvbiBvZiBhIHBvaW50LCAqLwotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gT01YX0lOVCB4OyAvKiogeC1jb29yZGluYXRlICovCi0gT01YX0lOVCB5OwkvKiogeS1jb29yZGluYXRlICovCi0JCi19IE9NWFBvaW50OwotCi0KLS8qKiBEZWZpbmVzIHRoZSBkaW1lbnNpb25zIG9mIGEgcmVjdGFuZ2xlLCBvciByZWdpb24gb2YgaW50ZXJlc3QgaW4gYW4gaW1hZ2UgKi8KLXR5cGVkZWYgc3RydWN0IAotewotIE9NWF9JTlQgd2lkdGg7ICAvKiogV2lkdGggb2YgdGhlIHJlY3RhbmdsZSwgaW4gdGhlIHgtZGlyZWN0aW9uICovCi0gT01YX0lOVCBoZWlnaHQ7IC8qKiBIZWlnaHQgb2YgdGhlIHJlY3RhbmdsZSwgaW4gdGhlIHktZGlyZWN0aW9uICovCi0JCi19IE9NWFNpemU7Ci0KLSNlbmRpZiAvKiBfT01YVFlQRVNfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvb214dHlwZXNfcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9vbXh0eXBlc19zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MWEwMzcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9vbXh0eXBlc19zLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgb214dHlwZXNfcy5oCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgOTY0MQotOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotOy8vIE1hbmRhdG9yeSByZXR1cm4gY29kZXMgLSB1c2UgY2FzZXMgYXJlIGV4cGxpY2l0bHkgZGVzY3JpYmVkIGZvciBlYWNoIGZ1bmN0aW9uIAotT01YX1N0c19Ob0VyciAgICAgICAgICAgICAgICAgICAgRVFVICAwICAgIDsvLyBObyBlcnJvciB0aGUgZnVuY3Rpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseSAKLU9NWF9TdHNfRXJyICAgICAgICAgICAgICAgICAgICAgIEVRVSAtMiAgICA7Ly8gVW5rbm93bi91bnNwZWNpZmllZCBlcnJvciAgICAgCi1PTVhfU3RzX0ludmFsaWRCaXRzdHJlYW1WYWxFcnIgICBFUVUgLTE4MiAgOy8vIEludmFsaWQgdmFsdWUgZGV0ZWN0ZWQgZHVyaW5nIGJpdHN0cmVhbSBwcm9jZXNzaW5nICAgICAKLU9NWF9TdHNfTWVtQWxsb2NFcnIgICAgICAgICAgICAgIEVRVSAtOSAgICA7Ly8gTm90IGVub3VnaCBtZW1vcnkgYWxsb2NhdGVkIGZvciB0aGUgb3BlcmF0aW9uIAotT01YX1N0c0FDQUFDX0dhaW5DdHJFcnIgICAgCSAgICAgRVFVIC0xNTkgIDsvLyBBQUM6IFVuc3VwcG9ydGVkIGdhaW4gY29udHJvbCBkYXRhIGRldGVjdGVkIAotT01YX1N0c0FDQUFDX1ByZ051bUVyciAgICAgICAgICAgRVFVIC0xNjcgIDsvLyBBQUM6IEludmFsaWQgbnVtYmVyIG9mIGVsZW1lbnRzIGZvciBvbmUgcHJvZ3JhbSAgIAotT01YX1N0c0FDQUFDX0NvZWZWYWxFcnIgICAgICAgICAgRVFVIC0xNjMgIDsvLyBBQUM6IEludmFsaWQgcXVhbnRpemVkIGNvZWZmaWNpZW50IHZhbHVlICAgICAgICAgICAgICAgCi1PTVhfU3RzQUNBQUNfTWF4U2ZiRXJyICAgICAgICAgICBFUVUgLTE2MiAgOy8vIEFBQzogSW52YWxpZCBtYXhTZmIgdmFsdWUgaW4gcmVsYXRpb24gdG8gbnVtU3diICAgICAKLU9NWF9TdHNBQ0FBQ19QbHNEYXRhRXJyCQkgICAgIEVRVSAtMTYwICA7Ly8gQUFDOiBwdWxzZSBlc2NhcGUgc2VxdWVuY2UgZGF0YSBlcnJvciAKLQotOy8vIE9wdGlvbmFsIHJldHVybiBjb2RlcyAtIHVzZSBjYXNlcyBhcmUgZXhwbGljaXRseSBkZXNjcmliZWQgZm9yIGVhY2ggZnVuY3Rpb24KLU9NWF9TdHNfQmFkQXJnRXJyICAgICAgICAgICAgICAgIEVRVSAtNSAgICA7Ly8gQmFkIEFyZ3VtZW50cyAKLQotT01YX1N0c0FDQUFDX1Ruc051bUZpbHRFcnIgICAgICAgRVFVIC0xNTcgIDsvLyBBQUM6IEludmFsaWQgbnVtYmVyIG9mIFROUyBmaWx0ZXJzICAKLU9NWF9TdHNBQ0FBQ19UbnNMZW5FcnIgICAgICAgICAgIEVRVSAtMTU2ICA7Ly8gQUFDOiBJbnZhbGlkIFROUyByZWdpb24gbGVuZ3RoICAgICAKLU9NWF9TdHNBQ0FBQ19UbnNPcmRlckVyciAgICAgICAgIEVRVSAtMTU1ICA7Ly8gQUFDOiBJbnZhbGlkIG9yZGVyIG9mIFROUyBmaWx0ZXIgICAgICAgICAgICAgICAgICAgIAotT01YX1N0c0FDQUFDX1Ruc0NvZWZSZXNFcnIgICAgICAgRVFVIC0xNTQgIDsvLyBBQUM6IEludmFsaWQgYml0LXJlc29sdXRpb24gZm9yIFROUyBmaWx0ZXIgY29lZmZpY2llbnRzICAKLU9NWF9TdHNBQ0FBQ19UbnNDb2VmRXJyICAgICAgICAgIEVRVSAtMTUzICA7Ly8gQUFDOiBJbnZhbGlkIFROUyBmaWx0ZXIgY29lZmZpY2llbnRzICAgICAgICAgICAgICAgICAgICAKLU9NWF9TdHNBQ0FBQ19UbnNEaXJlY3RFcnIgICAgICAgIEVRVSAtMTUyICA7Ly8gQUFDOiBJbnZhbGlkIFROUyBmaWx0ZXIgZGlyZWN0aW9uICAgIAotCi1PTVhfU3RzSUNKUF9KUEVHTWFya2VyRXJyICAgICAgICBFUVUgLTE4MyAgOy8vIEpQRUcgbWFya2VyIGVuY291bnRlcmVkIHdpdGhpbiBhbiBlbnRyb3B5LWNvZGVkIGJsb2NrOyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEh1ZmZtYW4gZGVjb2Rpbmcgb3BlcmF0aW9uIHRlcm1pbmF0ZWQgZWFybHkuICAgICAgICAgICAKLU9NWF9TdHNJQ0pQX0pQRUdNYXJrZXIgICAgICAgICAgIEVRVSAtMTgxICA7Ly8gSlBFRyBtYXJrZXIgZW5jb3VudGVyZWQ7IEh1ZmZtYW4gZGVjb2RpbmcgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBvcGVyYXRpb24gdGVybWluYXRlZCBlYXJseS4gICAgICAgICAgICAgICAgICAgICAgICAgCi1PTVhfU3RzSVBQUF9Db250ZXh0TWF0Y2hFcnIgICAgICBFUVUgLTE3ICAgOy8vIENvbnRleHQgcGFyYW1ldGVyIGRvZXNuJ3QgbWF0Y2ggdG8gdGhlIG9wZXJhdGlvbiAKLQotT01YX1N0c1NQX0V2ZW5NZWRpYW5NYXNrU2l6ZUVyciAgRVFVIC0xODAgIDsvLyBFdmVuIHNpemUgb2YgdGhlIE1lZGlhbiBGaWx0ZXIgbWFzayB3YXMgcmVwbGFjZWQgYnkgdGhlIG9kZCBvbmUgCi0KLU9NWF9TdHNfTWF4aW11bUVudW1lcmF0aW9uICAgICAgIEVRVSAweDdGRkZGRkZGCi0KLQotCi1PTVhfTUlOX1M4ICAgICAgRVFVIAkgICAJKC0xMjgpCi1PTVhfTUlOX1U4ICAJRVFVICAgICAJMAotT01YX01JTl9TMTYJCUVRVSAgICAgIAkoLTMyNzY4KQotT01YX01JTl9VMTYJCUVRVQkgICAgICAgIDAKLQotCi1PTVhfTUlOX1MzMgkJRVFVCSgtMjE0NzQ4MzY0Ny0xKQotT01YX01JTl9VMzIJCUVRVQkwCi0KLU9NWF9NQVhfUzgJCUVRVQkoMTI3KQotT01YX01BWF9VOAkJRVFVCSgyNTUpCi1PTVhfTUFYX1MxNgkJRVFVCSgzMjc2NykKLU9NWF9NQVhfVTE2CQlFUVUJKDB4RkZGRikKLU9NWF9NQVhfUzMyCQlFUVUJKDIxNDc0ODM2NDcpCi1PTVhfTUFYX1UzMgkJRVFVCSgweEZGRkZGRkZGKQotCi1PTVhfVkNfVVBQRVIgICAgRVFVIDB4MSAgICAgICAgICAgICAgICAgOy8vIFVzZWQgYnkgdGhlIFByZWRpY3RJbnRyYSBmdW5jdGlvbnMgICAKLU9NWF9WQ19MRUZUICAgICBFUVUgMHgyICAgICAgICAgICAgICAgICA7Ly8gVXNlZCBieSB0aGUgUHJlZGljdEludHJhIGZ1bmN0aW9ucyAKLU9NWF9WQ19VUFBFUl9SSUdIVCAgICBFUVUgMHg0MCAgICAgICAgICA7Ly8gVXNlZCBieSB0aGUgUHJlZGljdEludHJhIGZ1bmN0aW9ucyAgIAotCi1OVUxMICAgIEVRVSAwCi0KLTsvLyBTdHJ1Y3R1cmVzCi0KLSAgICBJTkNMVURFICAgICBhcm1DT01NX3MuaAotCi0gICAgTV9TVFJVQ1QgICAgT01YUG9pbnQKLSAgICBNX0ZJRUxEICAgICB4LCA0Ci0gICAgTV9GSUVMRCAgICAgeSwgNAotICAgIE1fRU5EU1RSVUNUCi0KLSAgICAgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYnVpbGRfdmMucGwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYnVpbGRfdmMucGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVkNjcyYjMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2J1aWxkX3ZjLnBsCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLSMhL3Vzci9iaW4vcGVybAotIwotIyAKLSMgRmlsZSBOYW1lOiAgYnVpbGRfdmMucGwKLSMgT3Blbk1BWCBETDogdjEuMC4yCi0jIFJldmlzaW9uOiAgIDk2NDEKLSMgRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSMgCi0jIAotIyAKLSMKLSMgVGhpcyBmaWxlIGJ1aWxkcyB0aGUgT3Blbk1BWCBETCB2YyBkb21haW4gbGlicmFyeSBvbXhWQy5vLgotIwotCi11c2UgRmlsZTo6U3BlYzsKLXVzZSBzdHJpY3Q7Ci0KLW15ICgkQ0MsICRDQ19PUFRTLCAkQVMsICRBU19PUFRTLCAkTElCLCAkTElCX09QVFMsICRMSUJfVFlQRSk7Ci0KLSRDQyAgICAgICA9ICdhcm1jYyc7Ci0kQ0NfT1BUUyAgPSAnLS1ub191bmFsaWduZWRfYWNjZXNzIC0tY3B1IEFSTTExMzZKLVMgLWMnOwotJEFTICAgICAgID0gJ2FybWFzbSc7Ci0kQVNfT1BUUyAgPSAnLS1ub191bmFsaWduZWRfYWNjZXNzIC0tY3B1IEFSTTExMzZKLVMnOwotIyAkTElCICAgICAgPSAnYXJtbGluayc7Ci0jICRMSUJfT1BUUyA9ICctLXBhcnRpYWwgLW8nOwotIyAkTElCX1RZUEUgPSAnLm8nOwotJExJQiAgICAgID0gJ2FybWFyJzsKLSRMSUJfT1BUUyA9ICctLWNyZWF0ZSAtcic7Ci0kTElCX1RZUEUgPSAnLmEnOwotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLW15IChAaGVhZGVybGlzdCwgQGZpbGVsaXN0LCAkaGQsICRmaWxlLCAkb2ZpbGUsICRjb21tYW5kLCAkb2JqbGlzdCwgJGxpYmZpbGUsICRoKTsKLQotIyBEZWZpbmUgdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXMgY29udGFpbmluZyBpbmNsdWRlZCBoZWFkZXIgZmlsZXMuCi1AaGVhZGVybGlzdCA9IHF3KGFwaSB2Yy9hcGkgdmMvbTRwMi9hcGkgdmMvbTRwMTAvYXBpKTsKLQotIyBEZWZpbmUgdGhlIGxpc3Qgb2Ygc291cmNlIGZpbGVzIHRvIGNvbXBpbGUuCi1vcGVuKEZJTEVTLCAnPGZpbGVsaXN0X3ZjLnR4dCcpIG9yIGRpZSgiQ2FuJ3Qgb3BlbiBzb3VyY2UgZmlsZSBsaXN0XG4iKTsKLUBmaWxlbGlzdCA9IDxGSUxFUz47Ci1jbG9zZShGSUxFUyk7Ci0KLSMgRml4IHRoZSBmaWxlIHNlcGFyYXRvcnMgaW4gdGhlIGhlYWRlciBwYXRocwotZm9yZWFjaCAkaCAoQGhlYWRlcmxpc3QpCi17Ci0gICAgICAgICRoID0gRmlsZTo6U3BlYy0+Y2Fub25wYXRoKCRoKTsKLX0KLQotIyBDcmVhdGUgdGhlIGluY2x1ZGUgcGF0aCB0byBiZSBwYXNzZWQgdG8gdGhlIGNvbXBpbGVyCi0kaGQgPSAnLUknIC4gam9pbignIC1JJywgQGhlYWRlcmxpc3QpOwotCi0jIENyZWF0ZSB0aGUgYnVpbGQgZGlyZWN0b3JpZXMgIi9saWIvIiBhbmQgIi9vYmovIiAoaWYgdGhleSBhcmUgbm90IHRoZXJlIGFscmVhZHkpCi1ta2RpciAib2JqIiwgMDc3NyBpZiAoISAtZCAib2JqIik7Ci1ta2RpciAibGliIiwgMDc3NyBpZiAoISAtZCAibGliIik7Ci0KLSRvYmpsaXN0ID0gJyc7Ci0KLSMgQ29tcGlsZSBlYWNoIGZpbGUKLWZvcmVhY2ggJGZpbGUgKEBmaWxlbGlzdCkKLXsKLQlteSAkZjsKLQlteSAkYmFzZTsKLQlteSAkZXh0OwotCW15ICRvYmpmaWxlOwotCi0JY2hvbXAoJGZpbGUpOwotCSRmaWxlID0gRmlsZTo6U3BlYy0+Y2Fub25wYXRoKCRmaWxlKTsKLQotCSh1bmRlZiwgdW5kZWYsICRmKSA9IEZpbGU6OlNwZWMtPnNwbGl0cGF0aCgkZmlsZSk7Ci0JaWYoKCRiYXNlLCAkZXh0KSA9ICRmID1+IC8oLispXC4oXHcpJC8pCi0JewotCQkkb2JqZmlsZSA9IEZpbGU6OlNwZWMtPmNhdGZpbGUoJ29iaicsICRiYXNlLicubycpOwotCi0JCWlmKCRleHQgZXEgJ2MnKQotCQl7Ci0JCQkkb2JqbGlzdCAuPSAiJG9iamZpbGUgIjsKLQkJCSRjb21tYW5kID0gJENDLicgJy4kQ0NfT1BUUy4nICcuJGhkLicgLW8gJy4kb2JqZmlsZS4nICcuJGZpbGU7Ci0JCQlwcmludCAiJGNvbW1hbmRcbiI7Ci0JCQlzeXN0ZW0oJGNvbW1hbmQpOwotCQl9Ci0JCWVsc2lmKCRleHQgZXEgJ3MnKQotCQl7Ci0JCQkkb2JqbGlzdCAuPSAiJG9iamZpbGUgIjsKLQkJCSRjb21tYW5kID0gJEFTLicgJy4kQVNfT1BUUy4nICcuJGhkLicgLW8gJy4kb2JqZmlsZS4nICcuJGZpbGU7Ci0JCQlwcmludCAiJGNvbW1hbmRcbiI7Ci0JCQlzeXN0ZW0oJGNvbW1hbmQpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJcHJpbnQgIklnbm9yaW5nIGZpbGU6ICRmXG4iOwotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCWRpZSAiTm8gZmlsZSBleHRlbnNpb24gZm91bmQ6ICRmXG4iOwotCX0KLX0KLQotIyBEbyB0aGUgZmluYWwgbGluayBzdGFnZSB0byBjcmVhdGUgdGhlIGxpYnJhcmllcy4KLSRsaWJmaWxlID0gRmlsZTo6U3BlYy0+Y2F0ZmlsZSgnbGliJywgJ29teFZDJy4kTElCX1RZUEUpOwotJGNvbW1hbmQgPSAkTElCLicgJy4kTElCX09QVFMuJyAnLiRsaWJmaWxlLicgJy4kb2JqbGlzdDsKLXByaW50ICIkY29tbWFuZFxuIjsKLShzeXN0ZW0oJGNvbW1hbmQpID09IDApIGFuZCBwcmludCAiQnVpbGQgc3VjY2Vzc2Z1bFxuIjsKLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2ZpbGVsaXN0X3ZjLnR4dCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9maWxlbGlzdF92Yy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMTYyM2YuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2ZpbGVsaXN0X3ZjLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS4vYXBpL2FybUNPTU0uaAotLi9hcGkvYXJtQ09NTV9CaXREZWNfcy5oCi0uL2FwaS9hcm1DT01NX0JpdHN0cmVhbS5oCi0uL2FwaS9hcm1DT01NX0lEQ1Rfcy5oCi0uL2FwaS9hcm1DT01NX0lEQ1RUYWJsZS5oCi0uL2FwaS9hcm1DT01NX01hc2tUYWJsZS5oCi0uL2FwaS9hcm1DT01NX3MuaAotLi9hcGkvYXJtQ09NTV9WZXJzaW9uLmgKLS4vYXBpL2FybU9NWF9SZWxlYXNlVmVyc2lvbi5oCi0uL2FwaS9vbXh0eXBlcy5oCi0uL2FwaS9vbXh0eXBlc19zLmgKLS4vc3JjL2FybUNPTU1fSURDVFRhYmxlLmMKLS4vc3JjL2FybUNPTU1fTWFza1RhYmxlLmMKLS4vdmMvYXBpL2FybVZDLmgKLS4vdmMvYXBpL2FybVZDQ09NTV9zLmgKLS4vdmMvYXBpL29teFZDLmgKLS4vdmMvYXBpL29teFZDX3MuaAotLi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTE2eDE2X3MucwotLi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTh4OF9zLnMKLS4vdmMvY29tbS9zcmMvb214VkNDT01NX0V4cGFuZEZyYW1lX0lfcy5zCi0uL3ZjL200cDEwL2FwaS9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmgKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQXZlcmFnZV80eF9BbGlnbl91bnNhZmVfcy5zCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYV91bnNhZmVfcy5zCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hX3Vuc2FmZV9zLnMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyX3MucwotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzX3MucwotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWFfcy5zCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9BbGlnbl91bnNhZmVfcy5zCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5X3Vuc2FmZV9zLnMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0RpYWdDb3B5X3Vuc2FmZV9zLnMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZV9zLnMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZV9zLnMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlX3MucwotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmVfcy5zCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1F1YW50VGFibGVzX3MucwotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NF9zLnMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDRfcy5zCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSS5jCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSV9zLnMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0lfcy5zCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSV9zLnMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JX3MucwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYV9zLnMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2X3MucwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0X3MucwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4X3MucwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpcl9zLnMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyX3MucwotLi92Yy9tNHAyL2FwaS9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgKLS4vdmMvbTRwMi9hcGkvYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaAotLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQ2xpcDhfcy5zCi0uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlX3MucwotLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMKLS4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0xvb2t1cF9UYWJsZXMuYwotLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfU2V0UHJlZERpcl9zLnMKLS4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuYwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLmMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYS5jCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QX3MucwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyX3MucwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTENfcy5zCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQ19zLnMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0ZpbmRNVnByZWRfcy5zCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9JRENUOHg4YmxrX3MucwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUNSZWNvbkJsb2NrX3MucwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhX3MucwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JX3MucwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JX3MucwotLi92Yy9zcmMvYXJtVkNfVmVyc2lvbi5jClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3NyYy9hcm1DT01NLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvc3JjL2FybUNPTU0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThkYmY0MS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvc3JjL2FybUNPTU0uYworKysgL2Rldi9udWxsCkBAIC0xLDk1MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtQ09NTS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRGVmaW5lcyBDb21tb24gQVBJcyB1c2VkIGFjcm9zcyBPcGVuTUFYIEFQSSdzCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAgICAgLyogTWlzY2VsbGFuZW91cyBBcml0aG1ldGljIG9wZXJhdGlvbnMgKi8KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtUm91bmRGbG9hdFRvUzE2Ci0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIHNob3J0IGludCBhZnRlciByb3VuZGluZwotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9TMTYgZm9ybWF0Ci0gKgotICovCi0KLU9NWF9TMTYgYXJtUm91bmRGbG9hdFRvUzE2IChPTVhfRjY0IFZhbHVlKQotewotICAgIGlmIChWYWx1ZSA+IDApCi0gICAgewotICAgICAgICByZXR1cm4gKE9NWF9TMTYpKFZhbHVlICsgLjUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXR1cm4gKE9NWF9TMTYpKFZhbHVlIC0gLjUpOwotICAgIH0KLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtUm91bmRGbG9hdFRvUzMyCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIGludCBhZnRlciByb3VuZGluZwotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9TMzIgZm9ybWF0Ci0gKgotICovCi0KLU9NWF9TMzIgYXJtUm91bmRGbG9hdFRvUzMyIChPTVhfRjY0IFZhbHVlKQotewotICAgIGlmIChWYWx1ZSA+IDApCi0gICAgewotICAgICAgICByZXR1cm4gKE9NWF9TMzIpKFZhbHVlICsgLjUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXR1cm4gKE9NWF9TMzIpKFZhbHVlIC0gLjUpOwotICAgIH0KLX0KLS8qKgotICogRnVuY3Rpb246IGFybVNhdFJvdW5kRmxvYXRUb1MxNgotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSBzaG9ydCBpbnQgYWZ0ZXIgcm91bmRpbmcgYW5kIHNhdHVyYXRpb24KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfUzE2IGZvcm1hdAotICoKLSAqLwotCi1PTVhfUzE2IGFybVNhdFJvdW5kRmxvYXRUb1MxNiAoT01YX0Y2NCBWYWx1ZSkKLXsKLSAgICBpZiAoVmFsdWUgPiAwKQotICAgIHsKLSAgICAgICAgVmFsdWUgKz0gMC41OwotICAgICAgICAKLSAgICAgICAgaWYoVmFsdWUgPiAoT01YX1MxNilPTVhfTUFYX1MxNiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoT01YX1MxNilPTVhfTUFYX1MxNjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoT01YX1MxNilWYWx1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBWYWx1ZSAtPSAwLjU7Ci0KLSAgICAgICAgaWYoVmFsdWUgPCAoT01YX1MxNilPTVhfTUlOX1MxNiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoT01YX1MxNilPTVhfTUlOX1MxNjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoT01YX1MxNilWYWx1ZTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtU2F0Um91bmRGbG9hdFRvUzMyCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIGludCBhZnRlciByb3VuZGluZyBhbmQgc2F0dXJhdGlvbgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9TMzIgZm9ybWF0Ci0gKgotICovCi0KLU9NWF9TMzIgYXJtU2F0Um91bmRGbG9hdFRvUzMyIChPTVhfRjY0IFZhbHVlKQotewotICAgIGlmIChWYWx1ZSA+IDApCi0gICAgewotICAgICAgICBWYWx1ZSArPSAwLjU7Ci0gICAgICAgIAotICAgICAgICBpZihWYWx1ZSA+IChPTVhfUzMyKU9NWF9NQVhfUzMyICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChPTVhfUzMyKU9NWF9NQVhfUzMyOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChPTVhfUzMyKVZhbHVlOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIFZhbHVlIC09IDAuNTsKLQotICAgICAgICBpZihWYWx1ZSA8IChPTVhfUzMyKU9NWF9NSU5fUzMyICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChPTVhfUzMyKU9NWF9NSU5fUzMyOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChPTVhfUzMyKVZhbHVlOwotICAgICAgICB9Ci0gICAgfQotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1TYXRSb3VuZEZsb2F0VG9VMTYKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgdW5zaWduZWQgc2hvcnQgaW50IGFmdGVyIHJvdW5kaW5nIGFuZCBzYXR1cmF0aW9uCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1UxNiBmb3JtYXQKLSAqCi0gKi8KLQotT01YX1UxNiBhcm1TYXRSb3VuZEZsb2F0VG9VMTYgKE9NWF9GNjQgVmFsdWUpCi17Ci0gICAgVmFsdWUgKz0gMC41OwotICAgIAotICAgIGlmKFZhbHVlID4gKE9NWF9VMTYpT01YX01BWF9VMTYgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChPTVhfVTE2KU9NWF9NQVhfVTE2OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXR1cm4gKE9NWF9VMTYpVmFsdWU7Ci0gICAgfQotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1TYXRSb3VuZEZsb2F0VG9VMzIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgdW5zaWduZWQgaW50IGFmdGVyIHJvdW5kaW5nIGFuZCBzYXR1cmF0aW9uCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1UzMiBmb3JtYXQKLSAqCi0gKi8KLQotT01YX1UzMiBhcm1TYXRSb3VuZEZsb2F0VG9VMzIgKE9NWF9GNjQgVmFsdWUpCi17Ci0gICAgVmFsdWUgKz0gMC41OwotICAgIAotICAgIGlmKFZhbHVlID4gKE9NWF9VMzIpT01YX01BWF9VMzIgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChPTVhfVTMyKU9NWF9NQVhfVTMyOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXR1cm4gKE9NWF9VMzIpVmFsdWU7Ci0gICAgfQotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1Sb3VuZEZsb2F0VG9TNjQKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgNjQgYml0IGludCBhZnRlciByb3VuZGluZwotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9TNjQgZm9ybWF0Ci0gKgotICovCi0KLU9NWF9TNjQgYXJtUm91bmRGbG9hdFRvUzY0IChPTVhfRjY0IFZhbHVlKQotewotICAgIGlmIChWYWx1ZSA+IDApCi0gICAgewotICAgICAgICByZXR1cm4gKE9NWF9TNjQpKFZhbHVlICsgLjUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXR1cm4gKE9NWF9TNjQpKFZhbHVlIC0gLjUpOwotICAgIH0KLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtU2lnbkNoZWNrCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDaGVja3MgdGhlIHNpZ24gb2YgYSB2YXJpYWJsZToKLSAqIHJldHVybnMgMSBpZiBpdCBpcyBQb3NpdGl2ZQotICogcmV0dXJucyAwIGlmIGl0IGlzIDAKLSAqIHJldHVybnMgLTEgaWYgaXQgaXMgTmVnYXRpdmUgCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQkgICAgdmFyICAgICBWYXJpYWJsZSB0byBiZSBjaGVja2VkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX0lOVCAtLSAgIHJldHVybnMgMSBpZiBpdCBpcyBQb3NpdGl2ZQotICogICAgICAgICAgICAgIHJldHVybnMgMCBpZiBpdCBpcyAwCi0gKiAgICAgICAgICAgICAgcmV0dXJucyAtMSBpZiBpdCBpcyBOZWdhdGl2ZSAKLSAqLyAKLQotT01YX0lOVCBhcm1TaWduQ2hlY2sgKAotICAgIE9NWF9TMTYgdmFyCi0pCi0KLXsKLSAgICBPTVhfSU5UIFNpZ247Ci0gICAgCi0gICAgaWYgKHZhciA8IDApCi0gICAgewotICAgICAgICBTaWduID0gLTE7Ci0gICAgfQotICAgIGVsc2UgaWYgKCB2YXIgPiAwKQotICAgIHsKLSAgICAgICAgU2lnbiA9IDE7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIFNpZ24gPSAwOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gU2lnbjsKLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtQ2xpcAotICoKLSAqIERlc2NyaXB0aW9uOiBDbGlwcyB0aGUgaW5wdXQgYmV0d2VlbiBNQVggYW5kIE1JTiB2YWx1ZQotICogCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBNaW4gICAgIGxvd2VyIGJvdW5kCi0gKiBbaW5dIE1heCAgICAgdXBwZXIgYm91bmQKLSAqIFtpbl0gc3JjICAgICB2YXJpYWJsZSB0byB0aGUgY2xpcHBlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9TMzIgLS0gICByZXR1cm5zIGNsaXBwZWQgdmFsdWUKLSAqLyAKLSAKLU9NWF9TMzIgYXJtQ2xpcCAoCi0gICAgT01YX0lOVCBtaW4sCi0gICAgT01YX0lOVCBtYXgsIAotICAgIE9NWF9TMzIgc3JjIAotKQotIAotewotICAgIGlmIChzcmMgPiBtYXgpCi0gICAgewotICAgICAgICBzcmMgPSBtYXg7Ci0gICAgfQotICAgIGVsc2UgaWYgKHNyYyA8IG1pbikKLSAgICB7Ci0gICAgICAgIHNyYyA9IG1pbjsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHNyYzsKLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtQ2xpcF9GMzIKLSAqCi0gKiBEZXNjcmlwdGlvbjogQ2xpcHMgdGhlIGlucHV0IGJldHdlZW4gTUFYIGFuZCBNSU4gdmFsdWUKLSAqIAotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gTWluICAgICBsb3dlciBib3VuZAotICogW2luXSBNYXggICAgIHVwcGVyIGJvdW5kCi0gKiBbaW5dIHNyYyAgICAgdmFyaWFibGUgdG8gdGhlIGNsaXBwZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfRjMyIC0tICAgcmV0dXJucyBjbGlwcGVkIHZhbHVlCi0gKi8gCi0gCi1PTVhfRjMyIGFybUNsaXBfRjMyICgKLSAgICBPTVhfRjMyIG1pbiwKLSAgICBPTVhfRjMyIG1heCwgCi0gICAgT01YX0YzMiBzcmMgCi0pCi0gCi17Ci0gICAgaWYgKHNyYyA+IG1heCkKLSAgICB7Ci0gICAgICAgIHNyYyA9IG1heDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3JjIDwgbWluKQotICAgIHsKLSAgICAgICAgc3JjID0gbWluOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gc3JjOwotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1TaGlmdFNhdF9GMzIKLSAqCi0gKiBEZXNjcmlwdGlvbjogRGl2aWRlcyBhIGZsb2F0IHZhbHVlIGJ5IDJec2hpZnQgYW5kIAotICogc2F0dXJhdGVzIGl0IGZvciB1bnNpZ25lZCB2YWx1ZSByYW5nZSBmb3Igc2F0Qml0cy4KLSAqIFNlY29uZCBwYXJhbWV0ZXIgaXMgbGlrZSAic2hpZnRpbmciIHRoZSBjb3JyZXNwb25kaW5nIAotICogaW50ZWdlciB2YWx1ZS4gVGFrZXMgY2FyZSBvZiByb3VuZGluZyB3aGlsZSBjbGlwcGluZyB0aGUgZmluYWwgCi0gKiB2YWx1ZS4KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSB2ICAgICAgICAgIE51bWJlciB0byBiZSBvcGVyYXRlZCB1cG9uCi0gKiBbaW5dIHNoaWZ0ICAgICAgRGl2aWRlcyB0aGUgaW5wdXQgInYiIGJ5ICIyXnNoaWZ0IgotICogW2luXSBzYXRCaXRzICAgIEZpbmFsIHJhbmdlIGlzIFswLCAyXnNhdEJpdHMpCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX1MzMiAtLSAgIHJldHVybnMgInNoaWZ0ZWQiIHNhdHVyYXRlZCB2YWx1ZQotICovIAotIAotT01YX1UzMiBhcm1TaGlmdFNhdF9GMzIoT01YX0YzMiB2LCBPTVhfSU5UIHNoaWZ0LCBPTVhfSU5UIHNhdEJpdHMpIAotewotICAgIE9NWF9VMzIgYWxsT25lcyA9IChPTVhfVTMyKSgtMSk7Ci0gICAgT01YX1UzMiBtYXhWID0gYWxsT25lcyA+PiAoMzItc2F0Qml0cyk7Ci0gICAgT01YX0YzMiB2U2hpZnRlZCwgdlJvdW5kZWQsIHNoaWZ0RGl2ID0gKE9NWF9GMzIpKDEgPDwgc2hpZnQpOwotICAgIE9NWF9VMzIgdkludDsKLSAgICBPTVhfVTMyIHZJbnRTYXQ7Ci0gICAgCi0gICAgaWYodiA8PSAwKQotICAgICAgICByZXR1cm4gMDsKLSAgICAKLSAgICB2U2hpZnRlZCA9IHYgLyBzaGlmdERpdjsKLSAgICB2Um91bmRlZCA9IChPTVhfRjMyKSh2U2hpZnRlZCArIDAuNSk7Ci0gICAgdkludCA9IChPTVhfVTMyKXZSb3VuZGVkOwotICAgIHZJbnRTYXQgPSB2SW50OwotICAgIGlmKHZJbnRTYXQgPiBtYXhWKSAKLSAgICAgICAgdkludFNhdCA9IG1heFY7Ci0gICAgcmV0dXJuIHZJbnRTYXQ7Ci19Ci0KLS8qKgotICogRnVuY3Rpb25zOiBhcm1Td2FwRWxlbQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhlc2UgZnVuY3Rpb24gc3dhcHMgdHdvIGVsZW1lbnRzIGF0IHRoZSBzcGVjaWZpZWQgcG9pbnRlciBsb2NhdGlvbnMuCi0gKiBUaGUgc2l6ZSBvZiBlYWNoIGVsZW1lbnQgY291bGQgYmUgYW55dGhpbmcgYXMgc3BlY2lmaWVkIGJ5IDxlbGVtU2l6ZT4KLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhSZXN1bHQgLS0gRXJyb3Igc3RhdHVzIGZyb20gdGhlIGZ1bmN0aW9uCi0gKi8KLU9NWFJlc3VsdCBhcm1Td2FwRWxlbSgKLSAgICAgICAgT01YX1U4ICpwQnVmMSwKLSAgICAgICAgT01YX1U4ICpwQnVmMiwKLSAgICAgICAgT01YX0lOVCBlbGVtU2l6ZQotICAgICAgICkKLXsKLSAgICBPTVhfSU5UIGk7Ci0gICAgT01YX1U4IHRlbXA7Ci0gICAgYXJtUmV0QXJnRXJySWYoIXBCdWYxIHx8ICFwQnVmMiwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIAotICAgIGZvcihpID0gMDsgaSA8IGVsZW1TaXplOyBpKyspCi0gICAgewotICAgICAgICB0ZW1wID0gKihwQnVmMSArIGkpOwotICAgICAgICAqKHBCdWYxICsgaSkgPSAqKHBCdWYyICsgaSk7Ci0gICAgICAgICoocEJ1ZjIgKyBpKSA9IHRlbXA7Ci0gICAgfQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1NZWRpYW5PZjMKLSAqCi0gKiBEZXNjcmlwdGlvbjogRmluZHMgdGhlIG1lZGlhbiBvZiB0aHJlZSBudW1iZXJzCi0gKiAKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gZkVudHJ5ICAgICBGaXJzdCBlbnRyeQotICogW2luXSBzRW50cnkgICAgIHNlY29uZCBlbnRyeQotICogW2luXSB0RW50cnkgICAgIFRoaXJkIGVudHJ5Ci0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX1MzMiAtLSAgIHJldHVybnMgdGhlIG1lZGlhbiB2YWx1ZQotICovIAotIAotT01YX1MzMiBhcm1NZWRpYW5PZjMgKAotICAgIE9NWF9TMzIgZkVudHJ5LAotICAgIE9NWF9TMzIgc0VudHJ5LCAKLSAgICBPTVhfUzMyIHRFbnRyeSAKLSkKLXsKLSAgICBPTVhfUzMyIGEsIGIsIGM7Ci0gICAgCi0gICAgYSA9IGFybU1pbiAoZkVudHJ5LCBzRW50cnkpOwotICAgIGIgPSBhcm1NYXggKGZFbnRyeSwgc0VudHJ5KTsKLSAgICBjID0gYXJtTWluIChiLCB0RW50cnkpOwotICAgIHJldHVybiAoYXJtTWF4IChhLCBjKSk7Ci19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybUxvZ1NpemUKLSAqCi0gKiBEZXNjcmlwdGlvbjogRmluZHMgdGhlIHNpemUgb2YgYSBwb3NpdGl2ZSB2YWx1ZSBhbmQgcmV0dXJucyB0aGUgc2FtZQotICogCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHZhbHVlICAgIFBvc2l0aXZlIHZhbHVlCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX1U4IC0tICAgICBSZXR1cm5zIHRoZSBtaW5pbXVtIG51bWJlciBvZiBiaXRzIHJlcXVpcmVkIHRvIHJlcHJlc2VudCB0aGUgcG9zaXRpdmUgdmFsdWUuIAotICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBzbWFsbGVzdCBrPj0wIHN1Y2ggdGhhdCB0aGF0IHZhbHVlIGlzIGxlc3MgdGhhbiAoMTw8aykuCi0gKi8gCi0gCi1PTVhfVTggYXJtTG9nU2l6ZSAoCi0gICAgT01YX1UxNiB2YWx1ZSAKLSkKLXsKLSAgICBPTVhfVTggaTsgICAgCi0gICAgZm9yICggaSA9IDA7IHZhbHVlID4gMDsgdmFsdWUgPSB2YWx1ZSA+PiAxKSAKLSAgICB7Ci0gICAgICAgIGkrKzsKLSAgICB9Ci0gICAgcmV0dXJuIGk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgICAgICAvKiBTYXR1cmF0aW5nIEFyaXRobWV0aWMgb3BlcmF0aW9ucyAqLwotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRBZGRfUzMyKCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgYWRkaXRpb24gb2YgdGhlIHR3byBpbnB1dHMgVmFsdWUxLCBWYWx1ZTIKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCi0gKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqIAotICogICAgCi0gKiovCi0gCi1PTVhfUzMyIGFybVNhdEFkZF9TMzIoT01YX1MzMiBWYWx1ZTEsT01YX1MzMiBWYWx1ZTIpCi17Ci0gICAgT01YX1MzMiBSZXN1bHQ7Ci0gICAgCi0gICAgUmVzdWx0ID0gVmFsdWUxICsgVmFsdWUyOwotCi0gICAgaWYoIChWYWx1ZTFeVmFsdWUyKSA+PSAwKQotICAgIHsKLSAgICAgICAgLypTYW1lIHNpZ24qLwotICAgICAgICBpZiggKFJlc3VsdF5WYWx1ZTEpID49IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBub3Qgc2F0dXJhdGVkKi8KLSAgICAgICAgICAgIHJldHVybiBSZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihWYWx1ZTEgPj0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKlJlc3VsdCBoYXMgc2F0dXJhdGVkIGluIHBvc2l0aXZlIHNpZGUqLwotICAgICAgICAgICAgICAgIHJldHVybiBPTVhfTUFYX1MzMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKlJlc3VsdCBoYXMgc2F0dXJhdGVkIGluIG5lZ2F0aXZlIHNpZGUqLwotICAgICAgICAgICAgICAgIHJldHVybiBPTVhfTUlOX1MzMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIH0KLSAgIAotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXR1cm4gUmVzdWx0OwotICAgIH0KLSAgICAKLX0KLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0QWRkX1M2NCgpCi0gKgotICogRGVzY3JpcHRpb24gOgotICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIGFkZGl0aW9uIG9mIHRoZSB0d28gaW5wdXRzIFZhbHVlMSwgVmFsdWUyCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAotICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAKLSAqICAgIAotICoqLwotIAotT01YX1M2NCBhcm1TYXRBZGRfUzY0KE9NWF9TNjQgVmFsdWUxLE9NWF9TNjQgVmFsdWUyKQotewotICAgIE9NWF9TNjQgUmVzdWx0OwotICAgIAotICAgIFJlc3VsdCA9IFZhbHVlMSArIFZhbHVlMjsKLQotICAgIGlmKCAoVmFsdWUxXlZhbHVlMikgPj0gMCkKLSAgICB7Ci0gICAgICAgIC8qU2FtZSBzaWduKi8KLSAgICAgICAgaWYoIChSZXN1bHReVmFsdWUxKSA+PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKlJlc3VsdCBoYXMgbm90IHNhdHVyYXRlZCovCi0gICAgICAgICAgICByZXR1cm4gUmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYoVmFsdWUxID49IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLypSZXN1bHQgaGFzIHNhdHVyYXRlZCBpbiBwb3NpdGl2ZSBzaWRlKi8KLSAgICAgICAgICAgICAgICBSZXN1bHQgPSBPTVhfTUFYX1M2NDsKLSAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBzYXR1cmF0ZWQgaW4gbmVnYXRpdmUgc2lkZSovCi0gICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9NSU5fUzY0OwotICAgICAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgfQotICAgCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJldHVybiBSZXN1bHQ7Ci0gICAgfQotICAgIAotfQotCi0vKiogRnVuY3Rpb24gOmFybVNhdFN1Yl9TMzIoKQotICogCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBzdWJzdHJhY3Rpb24gb2YgdGhlIHR3byBpbnB1dHMgVmFsdWUxLCBWYWx1ZTIKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCi0gKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqIAotICoqLwotCi1PTVhfUzMyIGFybVNhdFN1Yl9TMzIoT01YX1MzMiBWYWx1ZTEsT01YX1MzMiBWYWx1ZTIpCi17Ci0gICAgT01YX1MzMiBSZXN1bHQ7Ci0gICAgCi0gICAgUmVzdWx0ID0gVmFsdWUxIC0gVmFsdWUyOwotCi0gICAgaWYoIChWYWx1ZTFeVmFsdWUyKSA8IDApCi0gICAgewotICAgICAgICAvKk9wcG9zaXRlIHNpZ24qLwotICAgICAgICBpZiggKFJlc3VsdF5WYWx1ZTEpID49IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBub3Qgc2F0dXJhdGVkKi8KLSAgICAgICAgICAgIHJldHVybiBSZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihWYWx1ZTEgPj0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKlJlc3VsdCBoYXMgc2F0dXJhdGVkIGluIHBvc2l0aXZlIHNpZGUqLwotICAgICAgICAgICAgICAgIHJldHVybiBPTVhfTUFYX1MzMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKlJlc3VsdCBoYXMgc2F0dXJhdGVkIGluIG5lZ2F0aXZlIHNpZGUqLwotICAgICAgICAgICAgICAgIHJldHVybiBPTVhfTUlOX1MzMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIH0KLSAgIAotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXR1cm4gUmVzdWx0OwotICAgIH0KLSAgICAKLX0KLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0TWFjX1MzMigpCi0gKgotICogRGVzY3JpcHRpb24gOgotICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBNdWx0aXBsaWNhdGlvbiBvZiBWYWx1ZTEgYW5kIFZhbHVlMiBhbmQgc3ViZXNxdWVudCBzYXR1cmF0ZWQKLSAqICAgICBhY2N1bXVsYXRpb24gd2l0aCBNYWMKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCi0gKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAotICogW2luXSBNYWMgICAgICAgICAgQWNjdW11bGF0b3IKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiovCi0KLU9NWF9TMzIgYXJtU2F0TWFjX1MzMihPTVhfUzMyIE1hYyxPTVhfUzE2IFZhbHVlMSxPTVhfUzE2IFZhbHVlMikKLXsKLSAgICBPTVhfUzMyIFJlc3VsdDsKLSAgICAKLSAgICBSZXN1bHQgPSAoT01YX1MzMikoVmFsdWUxKlZhbHVlMik7Ci0gICAgUmVzdWx0ID0gYXJtU2F0QWRkX1MzMiggTWFjICwgUmVzdWx0ICk7Ci0KLSAgICByZXR1cm4gUmVzdWx0OyAgICAKLX0KLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0TWFjX1MxNlMzMl9TMzIKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgTUFDIG9wZXJhdGlvbiBvZiB0aGUgdGhyZWUgaW5wdXRzIGRlbGF5RWxlbSwgZmlsVGFwICwgbWFjCi0gKgotICogICBtYWMgPSBtYWMgKyBTYXR1cmF0ZV9pbl8zMkJpdHMoZGVsYXlFbGVtICogZmlsVGFwKQotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gZGVsYXlFbGVtICAgIEZpcnN0IDMyIGJpdCBPcGVyYW5kCi0gKiBbaW5dIGZpbFRhcCAgICAgICBTZWNvbmQgMTYgYml0IE9wZXJhbmQKLSAqIFtpbl0gbWFjICAgICAgICAgIFJlc3VsdCBvZiBNQUMgb3BlcmF0aW9uCi0gKgotICogUmV0dXJuOgotICogW291dF0gIG1hYyAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogICAgCi0gKiovCi0gCi1PTVhfUzMyIGFybVNhdE1hY19TMTZTMzJfUzMyKE9NWF9TMzIgbWFjLCBPTVhfUzMyIGRlbGF5RWxlbSwgT01YX1MxNiBmaWxUYXAgKQotewotICAgIAotICAgIE9NWF9TMzIgcmVzdWx0OwotCi0gICAgcmVzdWx0ID0gYXJtU2F0TXVsUzE2UzMyX1MzMihmaWxUYXAsZGVsYXlFbGVtKTsgCi0KLSAgICBpZiAoIHJlc3VsdCA+IE9NWF9NQVhfUzE2ICkKLSAgICB7Ci0gICAgICAgIHJlc3VsdCA9IE9NWF9NQVhfUzMyOwotICAgIH0KLSAgICBlbHNlIGlmKCByZXN1bHQgPCBPTVhfTUlOX1MxNiApCi0gICAgewotICAgICAgICByZXN1bHQgPSBPTVhfTUlOX1MzMjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZGVsYXlFbGVtICogZmlsVGFwOwotICAgIH0KLQotICAgIG1hYyA9IGFybVNhdEFkZF9TMzIobWFjLHJlc3VsdCk7Ci0gICAgCi0gICAgcmV0dXJuIG1hYzsKLX0KLQotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRSb3VuZFJpZ2h0U2hpZnRfUzMyX1MxNgotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHJvdW5kZWQgcmlnaHQgc2hpZnQgb3BlcmF0aW9uIG9mIGlucHV0IGJ5IHRoZSBzY2FsZWZhY3RvcgotICoKLSAqICAgb3V0cHV0ID0gU2F0dXJhdGVfaW5fMTZCaXRzKCAoIFJpZ2h0L0xlZnRTaGlmdCggKFJvdW5kKGlucHV0KSAsIHNoaWZ0ICkgKQotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gaW5wdXQgICAgICAgVGhlIGlucHV0IHRvIGJlIG9wZXJhdGVkIG9uCi0gKiBbaW5dIHNoaWZ0IFRoZSBzaGlmdCBudW1iZXIKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqICAgIAotICoqLwotCi0KLU9NWF9TMTYgYXJtU2F0Um91bmRSaWdodFNoaWZ0X1MzMl9TMTYoT01YX1MzMiBpbnB1dCwgT01YX0lOVCBzaGlmdCkKLXsKLSAgICBpbnB1dCA9IGFybVNhdFJvdW5kTGVmdFNoaWZ0X1MzMihpbnB1dCwtc2hpZnQpOwotCi0gICAgaWYgKCBpbnB1dCA+IE9NWF9NQVhfUzE2ICkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoT01YX1MxNilPTVhfTUFYX1MxNjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXQgPCBPTVhfTUlOX1MxNikKLSAgICB7Ci0gICAgICAgIHJldHVybiAoT01YX1MxNilPTVhfTUlOX1MxNjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICByZXR1cm4gKE9NWF9TMTYpaW5wdXQ7Ci0gICAgfQotCi19Ci0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdFJvdW5kTGVmdFNoaWZ0X1MzMigpCi0gKgotICogRGVzY3JpcHRpb24gOgotICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0aW5nIGxlZnQtc2hpZnQgb3BlcmF0aW9uIG9uIGlucHV0Ci0gKiAgICAgT3Igcm91bmRlZCBSaWdodCBzaGlmdCBpZiB0aGUgaW5wdXQgU2hpZnQgaXMgbmVnYXRpdmUuCi0gKiAgICAgCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIFZhbHVlICAgICAgICBPcGVyYW5kCi0gKiBbaW5dIFNoaWZ0ICAgICAgICBPcGVyYW5kIGZvciBzaGlmdCBvcGVyYXRpb24KLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAgICAKLSAqKi8KLQotT01YX1MzMiBhcm1TYXRSb3VuZExlZnRTaGlmdF9TMzIoT01YX1MzMiBWYWx1ZSwgT01YX0lOVCBTaGlmdCkKLXsKLSAgICBPTVhfSU5UIGk7Ci0gICAgCi0gICAgaWYgKFNoaWZ0IDwgMCkKLSAgICB7Ci0gICAgICAgIFNoaWZ0ID0gLVNoaWZ0OwotICAgICAgICBWYWx1ZSA9IGFybVNhdEFkZF9TMzIoVmFsdWUsICgxIDw8IChTaGlmdCAtIDEpKSk7Ci0gICAgICAgIFZhbHVlID0gVmFsdWUgPj4gU2hpZnQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBTaGlmdDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWx1ZSA9IGFybVNhdEFkZF9TMzIoVmFsdWUsIFZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gVmFsdWU7Ci19Ci0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdFJvdW5kTGVmdFNoaWZ0X1M2NCgpCi0gKgotICogRGVzY3JpcHRpb24gOgotICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0aW5nIGxlZnQtc2hpZnQgb3BlcmF0aW9uIG9uIGlucHV0Ci0gKiAgICAgT3Igcm91bmRlZCBSaWdodCBzaGlmdCBpZiB0aGUgaW5wdXQgU2hpZnQgaXMgbmVnYXRpdmUuCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBWYWx1ZSAgICAgICAgT3BlcmFuZAotICogW2luXSBzaGlmdCAgICAgICAgT3BlcmFuZCBmb3Igc2hpZnQgb3BlcmF0aW9uCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogICAgCi0gKiovCi0gCi1PTVhfUzY0IGFybVNhdFJvdW5kTGVmdFNoaWZ0X1M2NChPTVhfUzY0IFZhbHVlLCBPTVhfSU5UIFNoaWZ0KQotewotICAgIE9NWF9JTlQgaTsKLSAgICAKLSAgICBpZiAoU2hpZnQgPCAwKQotICAgIHsKLSAgICAgICAgU2hpZnQgPSAtU2hpZnQ7Ci0gICAgICAgIFZhbHVlID0gYXJtU2F0QWRkX1M2NChWYWx1ZSwgKChPTVhfUzY0KTEgPDwgKFNoaWZ0IC0gMSkpKTsKLSAgICAgICAgVmFsdWUgPSBWYWx1ZSA+PiBTaGlmdDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IFNoaWZ0OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbHVlID0gYXJtU2F0QWRkX1M2NChWYWx1ZSwgVmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBWYWx1ZTsKLX0KLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0TXVsUzE2UzMyX1MzMigpCi0gKgotICogRGVzY3JpcHRpb24gOgotICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBhIFMxNiBkYXRhIHR5cGUgbXVsdGlwbGllZCB3aXRoIGFuIFMzMiBkYXRhIHR5cGUKLSAqICAgICBpbiBhIFMzMiBjb250YWluZXIKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIGlucHV0MSAgICAgICBPcGVyYW5kIDEKLSAqIFtpbl0gaW5wdXQyICAgICAgIE9wZXJhbmQgMgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqICAgIAotICoqLwotCi0KLU9NWF9TMzIgYXJtU2F0TXVsUzE2UzMyX1MzMihPTVhfUzE2IGlucHV0MSxPTVhfUzMyIGlucHV0MikKLXsKLSAgICBPTVhfUzE2IGhpMixsbzE7Ci0gICAgT01YX1UxNiBsbzI7Ci0gICAgCi0gICAgT01YX1MzMiB0ZW1wMSx0ZW1wMjsKLSAgICBPTVhfUzMyIHJlc3VsdDsKLSAgICAKLSAgICBsbzEgID0gaW5wdXQxOwotCi0gICAgaGkyICA9ICggaW5wdXQyID4+ICAxNiApOwotICAgIGxvMiAgPSAoIChPTVhfVTMyKSggaW5wdXQyIDw8IDE2ICkgPj4gMTYgKTsKLSAgICAKLSAgICB0ZW1wMSA9IGhpMiAqIGxvMTsKLSAgICB0ZW1wMiA9ICggbG8yKiBsbzEgKSA+PiAxNjsKLQotICAgIHJlc3VsdCA9ICBhcm1TYXRBZGRfUzMyKHRlbXAxLHRlbXAyKTsKLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdE11bFMzMlMzMl9TMzIoKQotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYSBTMzIgZGF0YSB0eXBlIG11bHRpcGxpZWQgd2l0aCBhbiBTMzIgZGF0YSB0eXBlCi0gKiAgICAgaW4gYSBTMzIgY29udGFpbmVyCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBpbnB1dDEgICAgICAgT3BlcmFuZCAxCi0gKiBbaW5dIGlucHV0MiAgICAgICBPcGVyYW5kIDIKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAgICAKLSAqKi8KLQotT01YX1MzMiBhcm1TYXRNdWxTMzJTMzJfUzMyKE9NWF9TMzIgaW5wdXQxLE9NWF9TMzIgaW5wdXQyKQotewotICAgIE9NWF9TMTYgaGkxLGhpMjsKLSAgICBPTVhfVTE2IGxvMSxsbzI7Ci0gICAgCi0gICAgT01YX1MzMiB0ZW1wMSx0ZW1wMix0ZW1wMzsKLSAgICBPTVhfUzMyIHJlc3VsdDsKLQotICAgIGhpMSAgPSAoIGlucHV0MSA+PiAgMTYgKTsKLSAgICBsbzEgID0gKCAoT01YX1UzMikoIGlucHV0MSA8PCAxNiApID4+IDE2ICk7Ci0KLSAgICBoaTIgID0gKCBpbnB1dDIgPj4gIDE2ICk7Ci0gICAgbG8yICA9ICggKE9NWF9VMzIpKCBpbnB1dDIgPDwgMTYgKSA+PiAxNiApOwotICAgIAotICAgIHRlbXAxID0gICBoaTEgKiBoaTI7Ci0gICAgdGVtcDIgPSAoIGhpMSogbG8yICkgPj4gMTY7Ci0gICAgdGVtcDMgPSAoIGhpMiogbG8xICkgPj4gMTY7Ci0KLSAgICByZXN1bHQgPSBhcm1TYXRBZGRfUzMyKHRlbXAxLHRlbXAyKTsKLSAgICByZXN1bHQgPSBhcm1TYXRBZGRfUzMyKHJlc3VsdCx0ZW1wMyk7Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1JbnREaXZBd2F5RnJvbVplcm8oKQotICoKLSAqIERlc2NyaXB0aW9uIDogSW50ZWdlciBkaXZpc2lvbiB3aXRoIHJvdW5kaW5nIHRvIHRoZSBuZWFyZXN0IGludGVnZXIuIAotICogICAgICAgICAgICAgICBIYWxmLWludGVnZXIgdmFsdWVzIGFyZSByb3VuZGVkIGF3YXkgZnJvbSB6ZXJvCi0gKiAgICAgICAgICAgICAgIHVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkLiBGb3IgZXhhbXBsZSAzLy8yIGlzIHJvdW5kZWQgCi0gKiAgICAgICAgICAgICAgIHRvIDIsIGFuZCAtMy8vMiBpcyByb3VuZGVkIHRvIC0yLgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gTnVtICAgICAgICBPcGVyYW5kIDEKLSAqIFtpbl0gRGVubyAgICAgICBPcGVyYW5kIDIKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uIGlucHV0MS8vaW5wdXQyCi0gKiAgICAKLSAqKi8KLQotT01YX1MzMiBhcm1JbnREaXZBd2F5RnJvbVplcm8gKE9NWF9TMzIgTnVtLCBPTVhfUzMyIERlbm8pCi17Ci0gICAgT01YX0Y2NCByZXN1bHQ7Ci0gICAgCi0gICAgcmVzdWx0ID0gKChPTVhfRjY0KU51bSkvKChPTVhfRjY0KURlbm8pOwotICAgIAotICAgIGlmIChyZXN1bHQgPj0gMCkKLSAgICB7Ci0gICAgICAgIHJlc3VsdCArPSAwLjU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJlc3VsdCAtPSAwLjU7Ci0gICAgfQotCi0gICAgcmV0dXJuIChPTVhfUzMyKShyZXN1bHQpOwotfQotCi0KLS8qRW5kIG9mIEZpbGUqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvc3JjL2FybUNPTU1fQml0c3RyZWFtLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvc3JjL2FybUNPTU1fQml0c3RyZWFtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ZjUzY2EuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3NyYy9hcm1DT01NX0JpdHN0cmVhbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1DT01NX0JpdHN0cmVhbS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRGVmaW5lcyBiaXRzdHJlYW0gZW5jb2RlIGFuZCBkZWNvZGUgZnVuY3Rpb25zIGNvbW1vbiB0byBhbGwgY29kZWNzCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybUNPTU1fQml0c3RyZWFtLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEZpeGVkIGJpdCBsZW5ndGggRGVjb2RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1Mb29rQWhlYWRCaXRzKCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIEdldCB0aGUgbmV4dCBOIGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtIHdpdGhvdXQgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlcgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICAgICAqKnBwQml0U3RyZWFtCi0gKiBbaW5dICAgICAqcE9mZnNldAotICogW2luXSAgICAgTj0xLi4uMzIKLSAqCi0gKiBSZXR1cm5zICBWYWx1ZQotICovCi0KLU9NWF9VMzIgYXJtTG9va0FoZWFkQml0cyhjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwgT01YX0lOVCAqcE9mZnNldCwgT01YX0lOVCBOKQotewotICAgIGNvbnN0IE9NWF9VOCAqcEJpdFN0cmVhbSA9ICpwcEJpdFN0cmVhbTsKLSAgICBPTVhfSU5UIE9mZnNldCA9ICpwT2Zmc2V0OwotICAgIE9NWF9VMzIgVmFsdWU7Ci0KLSAgICBhcm1Bc3NlcnQoT2Zmc2V0Pj0wICYmIE9mZnNldDw9Nyk7Ci0gICAgYXJtQXNzZXJ0KE4+PTEgJiYgTjw9MzIpOwotCi0gICAgLyogUmVhZCBuZXh0IDMyIGJpdHMgZnJvbSBzdHJlYW0gKi8KLSAgICBWYWx1ZSA9IChwQml0U3RyZWFtWzBdIDw8IDI0ICkgfCAoIHBCaXRTdHJlYW1bMV0gPDwgMTYpICB8IChwQml0U3RyZWFtWzJdIDw8IDggKSB8IChwQml0U3RyZWFtWzNdKSA7Ci0gICAgVmFsdWUgPSAoVmFsdWUgPDwgT2Zmc2V0ICkgfCAocEJpdFN0cmVhbVs0XSA+PiAoOC1PZmZzZXQpKTsKLQotICAgIC8qIFJldHVybiBOIGJpdHMgKi8KLSAgICByZXR1cm4gVmFsdWUgPj4gKDMyLU4pOwotfQotCi0KLS8qKgotICogRnVuY3Rpb246IGFybUdldEJpdHMoKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUmVhZCBOIGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtCi0gKiAgICAKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICAgICAqcHBCaXRTdHJlYW0KLSAqIFtpbl0gICAgICpwT2Zmc2V0Ci0gKiBbaW5dICAgICBOPTEuLjMyCi0gKgotICogW291dF0gICAgKnBwQml0U3RyZWFtCi0gKiBbb3V0XSAgICAqcE9mZnNldAotICogUmV0dXJucyAgVmFsdWUKLSAqLwotCi0KLU9NWF9VMzIgYXJtR2V0Qml0cyhjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwgT01YX0lOVCAqcE9mZnNldCwgT01YX0lOVCBOKQotewotICAgIGNvbnN0IE9NWF9VOCAqcEJpdFN0cmVhbSA9ICpwcEJpdFN0cmVhbTsKLSAgICBPTVhfSU5UIE9mZnNldCA9ICpwT2Zmc2V0OwotICAgIE9NWF9VMzIgVmFsdWU7Ci0gICAgCi0gICAgaWYoTiA9PSAwKQotICAgIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGFybUFzc2VydChPZmZzZXQ+PTAgJiYgT2Zmc2V0PD03KTsKLSAgICBhcm1Bc3NlcnQoTj49MSAmJiBOPD0zMik7Ci0KLSAgICAvKiBSZWFkIG5leHQgMzIgYml0cyBmcm9tIHN0cmVhbSAqLwotICAgIFZhbHVlID0gKHBCaXRTdHJlYW1bMF0gPDwgMjQgKSB8ICggcEJpdFN0cmVhbVsxXSA8PCAxNikgIHwgKHBCaXRTdHJlYW1bMl0gPDwgOCApIHwgKHBCaXRTdHJlYW1bM10pIDsKLSAgICBWYWx1ZSA9IChWYWx1ZSA8PCBPZmZzZXQgKSB8IChwQml0U3RyZWFtWzRdID4+ICg4LU9mZnNldCkpOwotCi0gICAgLyogQWR2YW5jZSBiaXRzdHJlYW0gcG9pbnRlciBieSBOIGJpdHMgKi8KLSAgICBPZmZzZXQgKz0gTjsKLSAgICAqcHBCaXRTdHJlYW0gPSBwQml0U3RyZWFtICsgKE9mZnNldD4+Myk7Ci0gICAgKnBPZmZzZXQgPSBPZmZzZXQgJiA3OwotCi0gICAgLyogUmV0dXJuIE4gYml0cyAqLwotICAgIHJldHVybiBWYWx1ZSA+PiAoMzItTik7Ci19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybUJ5dGVBbGlnbigpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBBbGlnbiB0aGUgcG9pbnRlciAqcHBCaXRTdHJlYW0gdG8gdGhlIG5leHQgYnl0ZSBib3VuZGFyeQotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICAgICAqcHBCaXRTdHJlYW0KLSAqIFtpbl0gICAgICpwT2Zmc2V0Ci0gKgotICogW291dF0gICAgKnBwQml0U3RyZWFtCi0gKiBbb3V0XSAgICAqcE9mZnNldAotICoKLSAqKi8KLSAKLU9NWFZvaWQgYXJtQnl0ZUFsaWduKGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLE9NWF9JTlQgKnBPZmZzZXQpCi17Ci0gICAgaWYoKnBPZmZzZXQgPiAwKQotICAgIHsKLSAgICAgICAgKnBwQml0U3RyZWFtICs9IDE7Ci0gICAgICAgICpwT2Zmc2V0ID0gMDsKLSAgICB9ICAgIAotfQotCi0vKiogCi0gKiBGdW5jdGlvbjogYXJtU2tpcEJpdHMoKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogU2tpcCBOIGJpdHMgZnJvbSB0aGUgdmFsdWUgYXQgKnBwQml0U3RyZWFtCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQotICogW2luXSAgICAgKnBPZmZzZXQKLSAqIFtpbl0gICAgIE4KLSAqCi0gKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KLSAqIFtvdXRdICAgICpwT2Zmc2V0Ci0gKgotICoqLwotCi0KLU9NWFZvaWQgYXJtU2tpcEJpdHMoY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sT01YX0lOVCAqcE9mZnNldCxPTVhfSU5UIE4pCi17Ci0gICAgT01YX0lOVCBPZmZzZXQgPSAqcE9mZnNldDsKLSAgICBjb25zdCBPTVhfVTggKnBCaXRTdHJlYW0gPSAqcHBCaXRTdHJlYW07Ci0gICAKLSAgICAvKiBBZHZhbmNlIGJpdHN0cmVhbSBwb2ludGVyIGJ5IE4gYml0cyAqLwotICAgIE9mZnNldCArPSBOOwotICAgICpwcEJpdFN0cmVhbSA9IHBCaXRTdHJlYW0gKyAoT2Zmc2V0Pj4zKTsKLSAgICAqcE9mZnNldCA9IE9mZnNldCAmIDc7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFZhcmlhYmxlIGJpdCBsZW5ndGggRGVjb2RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1VblBhY2tWTEMzMigpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBWYXJpYWJsZSBsZW5ndGggZGVjb2RlIG9mIHZhcmlhYmxlIGxlbmd0aCBzeW1ib2wgKG1heCBzaXplIDMyIGJpdHMpIHJlYWQgZnJvbQotICogdGhlIGJpdCBzdHJlYW0gcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gYXQgKnBPZmZzZXQgYnkgdXNpbmcgdGhlIHRhYmxlCi0gKiBwb2ludGVkIGJ5IHBDb2RlQm9vawotICogCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgICAgKnBCaXRTdHJlYW0KLSAqIFtpbl0gICAgICpwT2Zmc2V0Ci0gKiBbaW5dICAgICBwQ29kZUJvb2sKLSAqIAotICogW291dF0gICAgKnBCaXRTdHJlYW0KLSAqIFtvdXRdICAgICpwT2Zmc2V0Ci0gKgotICogUmV0dXJucyA6IENvZGUgQm9vayBJbmRleCBpZiBzdWNjZXNzZnVsbC4gCi0gKiAgICAgICAgIDogQVJNX05PX0NPREVCT09LX0lOREVYID0gLTEgaWYgc2VhcmNoIGZhaWxzLgotICoqLwotI2lmbmRlZiBDX09QVElNSVpFRF9JTVBMRU1FTlRBVElPTiAKLQotT01YX1UxNiBhcm1VblBhY2tWTEMzMigKLSAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICBPTVhfSU5UICpwT2Zmc2V0LAotICAgIGNvbnN0IEFSTV9WTEMzMiAqcENvZGVCb29rCi0pCi17ICAgIAotICAgIGNvbnN0IE9NWF9VOCAqcEJpdFN0cmVhbSA9ICpwcEJpdFN0cmVhbTsKLSAgICBPTVhfSU5UIE9mZnNldCA9ICpwT2Zmc2V0OwotICAgIE9NWF9VMzIgVmFsdWU7Ci0gICAgT01YX0lOVCBJbmRleDsKLSAgICAgICAgCi0gICAgYXJtQXNzZXJ0KE9mZnNldD49MCAmJiBPZmZzZXQ8PTcpOwotCi0gICAgLyogUmVhZCBuZXh0IDMyIGJpdHMgZnJvbSBzdHJlYW0gKi8KLSAgICBWYWx1ZSA9IChwQml0U3RyZWFtWzBdIDw8IDI0ICkgfCAoIHBCaXRTdHJlYW1bMV0gPDwgMTYpICB8IChwQml0U3RyZWFtWzJdIDw8IDggKSB8IChwQml0U3RyZWFtWzNdKSA7Ci0gICAgVmFsdWUgPSAoVmFsdWUgPDwgT2Zmc2V0ICkgfCAocEJpdFN0cmVhbVs0XSA+PiAoOC1PZmZzZXQpKTsKLQotICAgIC8qIFNlYXJjaCB0aHJvdWdoIHRoZSBjb2RlYm9vayAqLyAgICAKLSAgICBmb3IgKEluZGV4PTA7IHBDb2RlQm9vay0+Y29kZUxlbiAhPSAwOyBJbmRleCsrKQotICAgIHsKLSAgICAgICAgaWYgKHBDb2RlQm9vay0+Y29kZVdvcmQgPT0gKFZhbHVlID4+ICgzMiAtIHBDb2RlQm9vay0+Y29kZUxlbikpKQotICAgICAgICB7Ci0gICAgICAgICAgICBPZmZzZXQgICAgICAgPSBPZmZzZXQgKyBwQ29kZUJvb2stPmNvZGVMZW47Ci0gICAgICAgICAgICAqcHBCaXRTdHJlYW0gPSBwQml0U3RyZWFtICsgKE9mZnNldCA+PiAzKSA7Ci0gICAgICAgICAgICAqcE9mZnNldCAgICAgPSBPZmZzZXQgJiA3OwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gSW5kZXg7Ci0gICAgICAgIH0gICAgICAgIAotICAgICAgICBwQ29kZUJvb2srKzsKLSAgICB9Ci0KLSAgICAvKiBObyBjb2RlIG1hdGNoIGZvdW5kICovCi0gICAgcmV0dXJuIEFSTV9OT19DT0RFQk9PS19JTkRFWDsKLX0KLQotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEZpeGVkIGJpdCBsZW5ndGggRW5jb2RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1QYWNrQml0cwotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGFjayBhIFZMQyBjb2RlIHdvcmQgaW50byB0aGUgYml0c3RyZWFtCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBwcEJpdFN0cmVhbSAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIAotICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0uCi0gKiBbaW5dIHBPZmZzZXQgICAgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAKLSAqICAgICAgICAgICAgICAgICAgICAgIHRvIDcuCi0gKiBbaW5dIGNvZGVXb3JkICAgICAgICBDb2RlIHdvcmQgdGhhdCBuZWVkIHRvIGJlIGluc2VydGVkIGluIHRvIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHN0cmVhbQotICogW2luXSBjb2RlTGVuZ3RoICAgICAgTGVuZ3RoIG9mIHRoZSBjb2RlIHdvcmQgdmFsaWQgcmFuZ2UgMS4uLjMyCi0gKgotICogW291dF0gcHBCaXRTdHJlYW0gICAgKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4KLSAqIFtvdXRdIHBCaXRPZmZzZXQgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQotICogICAgICAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbS4KLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhfUkVTVUxUIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0gCi1PTVhSZXN1bHQgYXJtUGFja0JpdHMgKAotICAgIE9NWF9VOCAgKipwcEJpdFN0cmVhbSwgCi0gICAgT01YX0lOVCAqcE9mZnNldCwKLSAgICBPTVhfVTMyIGNvZGVXb3JkLCAKLSAgICBPTVhfSU5UIGNvZGVMZW5ndGggCi0pCi17Ci0gICAgT01YX1U4ICAqcEJpdFN0cmVhbSA9ICpwcEJpdFN0cmVhbTsKLSAgICBPTVhfSU5UIE9mZnNldCA9ICpwT2Zmc2V0OwotICAgIE9NWF9VMzIgVmFsdWU7Ci0gICAgICAgIAotICAgIC8qIGNoZWNraW5nIGFyZ3VtZW50IHZhbGlkaXR5ICovCi0gICAgYXJtUmV0QXJnRXJySWYoT2Zmc2V0IDwgMCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKE9mZnNldCA+IDcsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihjb2RlTGVuZ3RoIDwgMSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGNvZGVMZW5ndGggPiAzMiwgT01YX1N0c19CYWRBcmdFcnIpOwotCi0gICAgLyogUHJlcGFyZSB0aGUgZmlyc3QgYnl0ZSAqLwotICAgIGNvZGVXb3JkID0gY29kZVdvcmQgPDwgKDMyLWNvZGVMZW5ndGgpOwotICAgIFZhbHVlID0gKHBCaXRTdHJlYW1bMF0gPj4gKDgtT2Zmc2V0KSkgPDwgKDgtT2Zmc2V0KTsKLSAgICBWYWx1ZSA9IFZhbHVlIHwgKGNvZGVXb3JkID4+ICgyNCtPZmZzZXQpKTsKLQotICAgIC8qIFdyaXRlIG91dCB3aG9sZSBieXRlcyAqLwotICAgIHdoaWxlICg4LU9mZnNldCA8PSBjb2RlTGVuZ3RoKQotICAgIHsKLSAgICAgICAgKnBCaXRTdHJlYW0rKyA9IChPTVhfVTgpVmFsdWU7Ci0gICAgICAgIGNvZGVXb3JkICAgPSBjb2RlV29yZCAgPDwgKDgtT2Zmc2V0KTsKLSAgICAgICAgY29kZUxlbmd0aCA9IGNvZGVMZW5ndGggLSAoOC1PZmZzZXQpOwotICAgICAgICBPZmZzZXQgPSAwOwotICAgICAgICBWYWx1ZSA9IGNvZGVXb3JkID4+IDI0OwotICAgIH0KLQotICAgIC8qIFdyaXRlIG91dCBmaW5hbCBwYXJ0aWFsIGJ5dGUgKi8KLSAgICAqcEJpdFN0cmVhbSAgPSAoT01YX1U4KVZhbHVlOwotICAgICpwcEJpdFN0cmVhbSA9IHBCaXRTdHJlYW07Ci0gICAgKnBPZmZzZXQgPSBPZmZzZXQgKyBjb2RlTGVuZ3RoOwotICAgIAotICAgIHJldHVybiAgT01YX1N0c19Ob0VycjsKLX0KLSAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFZhcmlhYmxlIGJpdCBsZW5ndGggRW5jb2RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1QYWNrVkxDMzIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBhY2sgYSBWTEMgY29kZSB3b3JkIGludG8gdGhlIGJpdHN0cmVhbQotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcHBCaXRTdHJlYW0JCXBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSAKLSAqICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBiaXQgc3RyZWFtLgotICogW2luXQlwQml0T2Zmc2V0CSAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAKLSAqICAgICAgICAgICAgICAgICAgICAgIHRvIDcuCi0gKiBbaW5dCSBjb2RlICAgICAJCVZMQyBjb2RlIHdvcmQgdGhhdCBuZWVkIHRvIGJlIGluc2VydGVkIGluIHRvIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtCi0gKgotICogW291dF0gcHBCaXRTdHJlYW0JKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQsCi0gKgkgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAotICoJCQkJCQlzdHJlYW0gYnVmZmVyLgotICogW291dF0gcEJpdE9mZnNldAkJKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKLSAqCQkJCQkJY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQotICoJCQkJCQkqcHBCaXRTdHJlYW0uCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YX1JFU1VMVCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotIAotT01YUmVzdWx0IGFybVBhY2tWTEMzMiAoCi0gICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sIAotICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCi0gICAgQVJNX1ZMQzMyIGNvZGUgCi0pCi17Ci0gICAgcmV0dXJuIChhcm1QYWNrQml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgY29kZS5jb2RlV29yZCwgY29kZS5jb2RlTGVuKSk7Ci19Ci0KLS8qRW5kIG9mIEZpbGUqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3NyYy9hcm1DT01NX0lEQ1RUYWJsZS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3NyYy9hcm1DT01NX0lEQ1RUYWJsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjBiODdmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9zcmMvYXJtQ09NTV9JRENUVGFibGUuYworKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1DT01NX0lEQ1RUYWJsZS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiAgIAotICogRmlsZTogYXJtQ09NTV9JRENUVGFibGUuYwotICogQnJpZWY6IERlZmluZXMgVGFibGVzIHVzZWQgaW4gSURDVCBjb21wdXRhdGlvbgotICoKLSAqLwotCi0jaW5jbHVkZSAiYXJtQ09NTV9JRENUVGFibGUuaCIKLQotICAgICAvKiAgVGFibGUgb2Ygcyh1KSpBKHUpKkEodikvMTYgYXQgUTE1Ci0gICAgICAqICBzKHUpPTEuMCAwIDw9IHUgPD0gNQotICAgICAgKiAgcyg2KT0yLjAKLSAgICAgICogIHMoNyk9NC4wCi0gICAgICAqICBBKDApID0gMipzcXJ0KDIpCi0gICAgICAqICBBKHUpID0gNCpjb3ModSpwaS8xNikgIGZvciAodSE9MCkKLQkgICovCi0JICAKLV9fYWxpZ24oNCkgY29uc3QgT01YX1UxNiBhcm1DT01NX0lEQ1RQcmVTY2FsZSBbNjRdID0KLXsKLSAgICAweDQwMDAsIDB4NThjNSwgMHg1MzlmLCAweDRiNDIsIDB4NDAwMCwgMHgzMjQ5LCAweDQ1NDYsIDB4NDZhMSwKLSAgICAweDU4YzUsIDB4N2IyMSwgMHg3M2ZjLCAweDY4NjIsIDB4NThjNSwgMHg0NWJmLCAweDYwMTYsIDB4NjFmOCwKLSAgICAweDUzOWYsIDB4NzNmYywgMHg2ZDQxLCAweDYyNTQsIDB4NTM5ZiwgMHg0MWIzLCAweDVhODIsIDB4NWM0OCwKLSAgICAweDRiNDIsIDB4Njg2MiwgMHg2MjU0LCAweDU4N2UsIDB4NGI0MiwgMHgzYjIxLCAweDUxNzUsIDB4NTMwZCwKLSAgICAweDQwMDAsIDB4NThjNSwgMHg1MzlmLCAweDRiNDIsIDB4NDAwMCwgMHgzMjQ5LCAweDQ1NDYsIDB4NDZhMSwKLSAgICAweDMyNDksIDB4NDViZiwgMHg0MWIzLCAweDNiMjEsIDB4MzI0OSwgMHgyNzgyLCAweDM2NmQsIDB4Mzc3ZSwKLSAgICAweDIyYTMsIDB4MzAwYiwgMHgyZDQxLCAweDI4YmEsIDB4MjJhMywgMHgxYjM3LCAweDI1N2UsIDB4MjYzYSwKLSAgICAweDExYTgsIDB4MTg3ZSwgMHgxNzEyLCAweDE0YzMsIDB4MTFhOCwgMHgwZGUwLCAweDEzMWQsIDB4MTM3ZCAgICAKLX07Ci0gICAgLyogQWJvdmUgYXJyYXkgYXJtQ09NTV9JRENUUHJlU2NhbGUsICBpbiBRMjMgZm9ybWF0ICovCi1jb25zdCBPTVhfVTMyIGFybUNPTU1fSURDVFByZVNjYWxlVTMyIFs2NF0gPQotewotICAgIDB4NDAwMDAwLCAweDU4YzU0MywgMHg1MzllYmEsIDB4NGI0MThjLCAweDQwMDAwMCwgMHgzMjQ4ZDQsIDB4NDU0NWVhLCAweDQ2YTE1NywKLSAgICAweDU4YzU0MywgMHg3YjIwZDgsIDB4NzNmYmZjLCAweDY4NjIxNCwgMHg1OGM1NDMsIDB4NDViZjFmLCAweDYwMTVhNSwgMHg2MWY3OGIsCi0gICAgMHg1MzllYmEsIDB4NzNmYmZjLCAweDZkNDEzZCwgMHg2MjUzYTYsIDB4NTM5ZWJhLCAweDQxYjMyOCwgMHg1YTgyN2EsIDB4NWM0ODY5LAotICAgIDB4NGI0MThjLCAweDY4NjIxNCwgMHg2MjUzYTYsIDB4NTg3ZGUzLCAweDRiNDE4YywgMHgzYjIwZDgsIDB4NTE3NGUwLCAweDUzMGQ2OSwKLSAgICAweDQwMDAwMCwgMHg1OGM1NDMsIDB4NTM5ZWJhLCAweDRiNDE4YywgMHg0MDAwMDAsIDB4MzI0OGQ0LCAweDQ1NDVlYSwgMHg0NmExNTcsCi0gICAgMHgzMjQ4ZDQsIDB4NDViZjFmLCAweDQxYjMyOCwgMHgzYjIwZDgsIDB4MzI0OGQ0LCAweDI3ODIxZCwgMHgzNjZkNzIsIDB4Mzc3ZTZiLAotICAgIDB4MjJhMmY1LCAweDMwMGFkMywgMHgyZDQxM2QsIDB4MjhiYTcwLCAweDIyYTJmNSwgMHgxYjM2YjksIDB4MjU3ZDg2LCAweDI2Mzk4ZCwKLSAgICAweDExYTg1NiwgMHgxODdkZTMsIDB4MTcxMjFhLCAweDE0YzM1YSwgMHgxMWE4NTYsIDB4MGRkZjliLCAweDEzMWNjNywgMHgxMzdjYTIKLX07Ci0gICAKLWNvbnN0IE9NWF9VMTYgYXJtQ09NTV9JRENUQ29lZiBbNF0gPQotewotICAgIDB4NWE4MiwgLyogSW52U3FydDIgKi8KLSAgICAweDMwZmMsIC8qIFNpblBJQnk4ICovCi0gICAgMHg3NjQyLCAvKiBDb3NQSUJ5OCAqLwotICAgIDB4MDAwMCAgICAKLX07Ci0KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvc3JjL2FybUNPTU1fTWFza1RhYmxlLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvc3JjL2FybUNPTU1fTWFza1RhYmxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNmE4ZTUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3NyYy9hcm1DT01NX01hc2tUYWJsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtQ09NTV9NYXNrVGFibGUuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIE1hc2sgVGFibGUgdG8gbWFzayB0aGUgZW5kIG9mIGFycmF5LgotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotCi0jZGVmaW5lIE1hc2tUYWJsZVNpemUgNzIKLQotY29uc3QgT01YX1UxNiBhcm1DT01NX3FNYXNrVGFibGUxNltNYXNrVGFibGVTaXplXSA9IAotewotICAgICAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAgICAgMHhGRkZGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgICAgIDB4RkZGRiwgMHhGRkZGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgICAgICAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAgICAgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgICAgIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAKLSAgICAgICAgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHgwMDAwLCAweDAwMDAsIAotICAgICAgICAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4MDAwMCwKLSAgICAgICAgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYgICAgCi19OwotCi1jb25zdCBPTVhfVTggYXJtQ09NTV9xTWFza1RhYmxlOFtNYXNrVGFibGVTaXplXSA9IAotewotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAKLSAgICAgICAgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCi0gICAgICAgIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAotICAgICAgICAweEZGLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAKLSAgICAgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCi0gICAgICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsICAKLSAgICAgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgIAotICAgICAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDAwLCAKLSAgICAgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiAgICAKLX07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvYXBpL2FybVZDLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvYXBpL2FybVZDLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYmU4YjYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL2FwaS9hcm1WQy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE2OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkMuaAotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIEZpbGU6IGFybVZpZGVvLmgKLSAqIEJyaWVmOiBEZWNsYXJlcyBBUEkncy9CYXNpYyBEYXRhIHR5cGVzIHVzZWQgYWNyb3NzIHRoZSBPcGVuTUFYIFZpZGVvIGRvbWFpbgotICoKLSAqLwotCi0KLSNpZm5kZWYgX2FybVZpZGVvX0hfCi0jZGVmaW5lIF9hcm1WaWRlb19IXwotCi0jaW5jbHVkZSAib214VkMuaCIKLSNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgotCi0vKioKLSAqIEFSTSBzcGVjaWZpYyBzdGF0ZSBzdHJ1Y3R1cmUgdG8gaG9sZCBNb3Rpb24gRXN0aW1hdGlvbiBpbmZvcm1hdGlvbi4KLSAqLwotIAotc3RydWN0IG00cDJfTUVTcGVjCi17Ci0gICAgT01YVkNNNFAyTUVQYXJhbXMgTUVQYXJhbXM7Ci0gICAgT01YVkNNNFAyTUVNb2RlICAgTUVNb2RlOwotfTsKLQotc3RydWN0IG00cDEwX01FU3BlYwotewotICAgIE9NWFZDTTRQMTBNRVBhcmFtcyBNRVBhcmFtczsKLSAgICBPTVhWQ000UDEwTUVNb2RlICAgTUVNb2RlOwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgbTRwMl9NRVNwZWMgIEFSTVZDTTRQMl9NRVNwZWM7Ci10eXBlZGVmIHN0cnVjdCBtNHAxMF9NRVNwZWMgQVJNVkNNNFAxMF9NRVNwZWM7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9Db21wYXJlTVYKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGNvbXBhcmlzaW9uIG9mIG1vdGlvbiB2ZWN0b3JzIGFuZCBTQUQncyB0byBkZWNpZGUgdGhlCi0gKiBiZXN0IE1WIGFuZCBTQUQKLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICAgICBtdlggICAgIHggY29vcmRpbmF0ZSBvZiB0aGUgY2FuZGlkYXRlIG1vdGlvbiB2ZWN0b3IKLSAqIFtpbl0gICAgIG12WSAgICAgeSBjb29yZGluYXRlIG9mIHRoZSBjYW5kaWRhdGUgbW90aW9uIHZlY3RvcgotICogW2luXSAgICAgY2FuZFNBRCBDYW5kaWRhdGUgU0FECi0gKiBbaW5dICAgICBiZXN0TVZYIHggY29vcmRpbmF0ZSBvZiB0aGUgYmVzdCBtb3Rpb24gdmVjdG9yCi0gKiBbaW5dICAgICBiZXN0TVZZIHkgY29vcmRpbmF0ZSBvZiB0aGUgYmVzdCBtb3Rpb24gdmVjdG9yCi0gKiBbaW5dICAgICBiZXN0U0FEIGJlc3QgU0FECi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX0lOVCAtLSAxIHRvIGluZGljYXRlIHRoYXQgdGhlIGN1cnJlbnQgc2FkIGlzIHRoZSBiZXN0Ci0gKiAgICAgICAgICAgIDAgdG8gaW5kaWNhdGUgdGhhdCBpdCBpcyBOT1QgdGhlIGJlc3QgU0FECi0gKi8KLQotT01YX0lOVCBhcm1WQ000UDJfQ29tcGFyZU1WICgKLSAgICBPTVhfUzE2IG12WCwKLSAgICBPTVhfUzE2IG12WSwKLSAgICBPTVhfSU5UIGNhbmRTQUQsCi0gICAgT01YX1MxNiBiZXN0TVZYLAotICAgIE9NWF9TMTYgYmVzdE1WWSwKLSAgICBPTVhfSU5UIGJlc3RTQUQpOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfQUNEQ1ByZWRpY3QKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGFkYXB0aXZlIERDL0FDIGNvZWZmaWNpZW50IHByZWRpY3Rpb24gZm9yIGFuIGludHJhIGJsb2NrLiBQcmlvcgotICogdG8gdGhlIGZ1bmN0aW9uIGNhbGwsIHByZWRpY3Rpb24gZGlyZWN0aW9uIChwcmVkRGlyKSBzaG91bGQgYmUgc2VsZWN0ZWQKLSAqIGFzIHNwZWNpZmllZCBpbiBzdWJjbGF1c2UgNy40LjMuMSBvZiBJU08vSUVDIDE0NDk2LTIuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBwU3JjRHN0ICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgd2hpY2ggY29udGFpbnMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcXVhbnRpemVkIGNvZWZmaWNpZW50IHJlc2lkdWFscyAoUFFGKSBvZiB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJsb2NrCi0gKiBbaW5dIHBQcmVkQnVmUm93IHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHJvdyBidWZmZXIKLSAqIFtpbl0gcFByZWRCdWZDb2wgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcgotICogW2luXSBjdXJRUCAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBjdXJyZW50IGJsb2NrLiBjdXJRUAotICogICAgICAgICAgICAgICAgICAgICAgICAgIG1heSBlcXVhbCB0byBwcmVkUVAgZXNwZWNpYWxseSB3aGVuIHRoZSBjdXJyZW50Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sgYW5kIHRoZSBwcmVkaWN0b3IgYmxvY2sgYXJlIGluIHRoZSBzYW1lCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9jay4KLSAqIFtpbl0gcHJlZFFQICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgcHJlZGljdG9yIGJsb2NrCi0gKiBbaW5dIHByZWREaXIgICAgIGluZGljYXRlcyB0aGUgcHJlZGljdGlvbiBkaXJlY3Rpb24gd2hpY2ggdGFrZXMgb25lCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX0hPUklaT05UQUwgICAgcHJlZGljdCBob3Jpem9udGFsbHkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fVkVSVElDQUwgICAgICBwcmVkaWN0IHZlcnRpY2FsbHkKLSAqIFtpbl0gQUNQcmVkRmxhZyAgYSBmbGFnIGluZGljYXRpbmcgaWYgQUMgcHJlZGljdGlvbiBzaG91bGQgYmUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtZWQuIEl0IGlzIGVxdWFsIHRvIGFjX3ByZWRfZmxhZyBpbiB0aGUgYml0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIHN5bnRheCBvZiBNUEVHLTQKLSAqIFtpbl0gdmlkZW9Db21wICAgdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSwgY2hyb21pbmFuY2Ugb3IKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSkgb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqIFtpbl0gZmxhZyAgICAgICAgVGhpcyBmbGFnIGRlZmluZXMgdGhlIGlmIG9uZSB3YW50cyB0byB1c2UgdGhpcyBmdW5jdGlvbnMgdG8KLSAqICAgICAgICAgICAgICAgICAgY2FsY3VsYXRlIFBRRiAoc2V0IDEsIHByZWRpY3Rpb24pIG9yIFFGIChzZXQgMCwgcmVjb25zdHJ1Y3Rpb24pCi0gKiBbb3V0XSAgICBwUHJlQUNQcmVkaWN0ICAgcG9pbnRlciB0byB0aGUgcHJlZGljdGVkIGNvZWZmaWNpZW50cyBidWZmZXIuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsbGVkIE9OTFkgaWYgaXQgaXMgbm90IE5VTEwKLSAqIFtvdXRdICAgIHBTcmNEc3QgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucwotICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBxdWFudGl6ZWQgY29lZmZpY2llbnRzIChRRikgb2YgdGhlIGN1cnJlbnQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jawotICogW291dF0gICAgcFByZWRCdWZSb3cgcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyCi0gKiBbb3V0XSAgICBwUHJlZEJ1ZkNvbCBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIKLSAqIFtvdXRdICAgIHBTdW1FcnIgICAgIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgc3VtIG9mIHRoZSBkaWZmZXJlbmNlCi0gKiAgICAgICAgICAgICAgICAgICAgICBiZXR3ZWVuIHByZWRpY3RlZCBhbmQgdW5wcmVkaWN0ZWQgY29lZmZpY2llbnRzCi0gKiAgICAgICAgICAgICAgICAgICAgICBJZiB0aGlzIGlzIE5VTEwsIGRvIG5vdCB1cGRhdGUKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMl9BQ0RDUHJlZGljdCgKLSAgICAgT01YX1MxNiAqIHBTcmNEc3QsCi0gICAgIE9NWF9TMTYgKiBwUHJlQUNQcmVkaWN0LAotICAgICBPTVhfUzE2ICogcFByZWRCdWZSb3csCi0gICAgIE9NWF9TMTYgKiBwUHJlZEJ1ZkNvbCwKLSAgICAgT01YX0lOVCBjdXJRUCwKLSAgICAgT01YX0lOVCBwcmVkUVAsCi0gICAgIE9NWF9JTlQgcHJlZERpciwKLSAgICAgT01YX0lOVCBBQ1ByZWRGbGFnLAotICAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCAgdmlkZW9Db21wLAotICAgICBPTVhfVTggZmxhZywKLSAgICAgT01YX0lOVCAqcFN1bUVycgotKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX1NldFByZWREaXIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGRldGVjdGluZyB0aGUgcHJlZGljdGlvbiBkaXJlY3Rpb24KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIGJsb2NrSW5kZXggIGJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uIGFzIGRlZmluZWQgaW4gc3ViY2xhdXNlIDYuMS4zLjgsIG9mIElTTy9JRUMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAxNDQ5Ni0yLiBGdXJ0aGVybW9yZSwgaW5kZXhlcyA2IHRvIDkgaW5kaWNhdGUgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEgYmxvY2tzIHNwYXRpYWxseSBjb3JyZXNwb25kaW5nIHRvIGx1bWluYW5jZQotICogICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrcyAwIHRvIDMgaW4gdGhlIHNhbWUgbWFjcm9ibG9jay4KLSAqIFtpbl0gcENvZWZCdWZSb3cgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcgotICogW2luXSBwUXBCdWYgICAgICBwb2ludGVyIHRvIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGJ1ZmZlcgotICogW291dF0gICAgcHJlZFFQICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgcHJlZGljdG9yIGJsb2NrCi0gKiBbb3V0XSAgICBwcmVkRGlyICAgICBpbmRpY2F0ZXMgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uIHdoaWNoIHRha2VzIG9uZQotICogICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgotICogICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19IT1JJWk9OVEFMICAgIHByZWRpY3QgaG9yaXpvbnRhbGx5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX1ZFUlRJQ0FMICAgICAgcHJlZGljdCB2ZXJ0aWNhbGx5Ci0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDJfU2V0UHJlZERpcigKLSAgICAgT01YX0lOVCBibG9ja0luZGV4LAotICAgICBPTVhfUzE2ICpwQ29lZkJ1ZlJvdywKLSAgICAgT01YX1MxNiAqcENvZWZCdWZDb2wsCi0gICAgIE9NWF9JTlQgKnByZWREaXIsCi0gICAgIE9NWF9JTlQgKnByZWRRUCwKLSAgICAgY29uc3QgT01YX1U4ICpwUXBCdWYKLSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmEKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGVuY29kaW5nIGZvciBvbmUgaW50cmEgYmxvY2suCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBwcEJpdFN0cmVhbSAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiaXQgc3RyZWFtCi0gKiBbaW5dIHBCaXRPZmZzZXQgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcuCi0gKiBbaW5dIHBRRGN0QmxrQ29lZiAgICBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50Ci0gKiBbaW5dIHByZWREaXIgICAgICAgICBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbiwgd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHppZ3phZyBzY2FuIHBhdHRlcm4uIFRoaXMgdGFrZXMgb25lIG9mIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xsb3dpbmcgdmFsdWVzOgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fTk9ORSAgICAgICAgICBBQyBwcmVkaWN0aW9uIG5vdCB1c2VkLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW4uCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19IT1JJWk9OVEFMICAgIEhvcml6b250YWwgcHJlZGljdGlvbi4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLXZlcnRpY2FsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppZ3phZyBzY2FuLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fVkVSVElDQUwgICAgICBWZXJ0aWNhbCBwcmVkaWN0aW9uLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtaG9yaXpvbnRhbAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aWd6YWcgc2Nhbi4KLSAqIFtpbl0gcGF0dGVybiAgICAgICAgIGJsb2NrIHBhdHRlcm4gd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgd2hldGhlcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGJsb2NrIGlzIGVuY29kZWQKLSAqIFtpbl0gc3RhcnQgICAgICAgICAgIHN0YXJ0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBlbmNvZGluZyBiZWdpbnMgd2l0aCAwdGggZWxlbWVudAotICogICAgICAgICAgICAgICAgICAgICAgb3IgMXN0LgotICogW291dF0gICAgcHBCaXRTdHJlYW0gICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4KLSAqIFtvdXRdICAgIHBCaXRPZmZzZXQgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbS4KLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmEoCi0gICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgICBjb25zdCBPTVhfUzE2ICpwUURjdEJsa0NvZWYsCi0gICAgIE9NWF9VOCBwcmVkRGlyLAotICAgICBPTVhfVTggcGF0dGVybiwKLSAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAotICAgICBPTVhfVTggc3RhcnQKLSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmEKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBmb3Igb25lIGludHJhIGNvZGVkIGJsb2NrLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gcHBCaXRTdHJlYW0gICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYml0c3RyZWFtIGJ1ZmZlcgotICogW2luXSBwQml0T2Zmc2V0ICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYnkgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAtN10uCi0gKiBbaW5dIHByZWREaXIgICAgICAgICBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbiB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgemlnemFnIHNjYW4gcGF0dGVybi4gSXQgdGFrZXMgb25lIG9mIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xsb3dpbmcgdmFsdWVzOgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fTk9ORSAgQUMgcHJlZGljdGlvbiBub3QgdXNlZDsKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm0gY2xhc3NpY2FsIHppZ3phZyBzY2FuOwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fSE9SSVpPTlRBTCAgICBIb3Jpem9udGFsIHByZWRpY3Rpb247Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm0gYWx0ZXJuYXRlLXZlcnRpY2FsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppZ3phZyBzY2FuOwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fVkVSVElDQUwgICAgICBWZXJ0aWNhbCBwcmVkaWN0aW9uOwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHVzIHBlcmZvcm0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0ZXJuYXRlLWhvcml6b250YWwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemlnemFnIHNjYW4uCi0gKiBbaW5dIHZpZGVvQ29tcCAgICAgICB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlLCBjaHJvbWluYW5jZSBvcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSkgb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiBzaG9ydFZpZGVvSGVhZGVyPT0wLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MS4KLSAqIFtpbl0gc3RhcnQgICAgICAgICAgIHN0YXJ0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBlbmNvZGluZyBiZWdpbnMgd2l0aCAwdGggZWxlbWVudAotICogICAgICAgICAgICAgICAgICAgICAgb3IgMXN0LgotICogW291dF0gICAgcHBCaXRTdHJlYW0gICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkLCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlcgotICogW291dF0gICAgcEJpdE9mZnNldCAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtCi0gKiBbb3V0XSAgICBwRHN0ICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2suIFNob3VsZCBiZSAzMi1iaXQgYWxpZ25lZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYSgKLSAgICAgY29uc3QgT01YX1U4ICoqIHBwQml0U3RyZWFtLAotICAgICBPTVhfSU5UICogcEJpdE9mZnNldCwKLSAgICAgT01YX1MxNiAqIHBEc3QsCi0gICAgIE9NWF9VOCBwcmVkRGlyLAotICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsIAotICAgICBPTVhfVTggIHN0YXJ0Ci0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfRmlsbFZMREJ1ZmZlcgotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgZmlsbGluZyBvZiB0aGUgY29lZmZpY2llbnQgYnVmZmVyIGFjY29yZGluZyB0byB0aGUgcnVuLCBsZXZlbAotICogYW5kIHNpZ24sIGFsc28gdXBkYXRlcyB0aGUgaW5kZXgKLSAqIAotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gIHN0b3JlUnVuICAgICAgICBTdG9yZWQgUnVuIHZhbHVlIChjb3VudCBvZiB6ZXJvcykgICAKLSAqIFtpbl0gIHN0b3JlTGV2ZWwgICAgICBTdG9yZWQgTGV2ZWwgdmFsdWUgKG5vbi16ZXJvIHZhbHVlKQotICogW2luXSAgc2lnbiAgICAgICAgICAgIEZsYWcgaW5kaWNhdGluZyB0aGUgc2lnbiBvZiBsZXZlbAotICogW2luXSAgbGFzdCAgICAgICAgICAgIHN0YXR1cyBvZiB0aGUgbGFzdCBmbGFnCi0gKiBbaW5dICBwSW5kZXggICAgICAgICAgcG9pbnRlciB0byBjb2VmZmljaWVudCBpbmRleCBpbiA4eDggbWF0cml4Ci0gKiBbb3V0XSBwSW5kZXggICAgICAgICAgcG9pbnRlciB0byB1cGRhdGVkIGNvZWZmaWNpZW50IGluZGV4IGluIDh4OCAKLSAqICAgICAgICAgICAgICAgICAgICAgICBtYXRyaXgKLSAqIFtpbl0gIHBaaWd6YWdUYWJsZSAgICBwb2ludGVyIHRvIHRoZSB6aWd6YWcgdGFibGVzCi0gKiBbb3V0XSBwRHN0ICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQKLSAqICAgICAgICAgICAgICAgICAgICAgICBibG9jay4gU2hvdWxkIGJlIDMyLWJpdCBhbGlnbmVkCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMl9GaWxsVkxEQnVmZmVyKAotICAgIE9NWF9VMzIgc3RvcmVSdW4sCi0gICAgT01YX1MxNiAqIHBEc3QsCi0gICAgT01YX1MxNiBzdG9yZUxldmVsLAotICAgIE9NWF9VOCAgc2lnbiwKLSAgICBPTVhfVTggIGxhc3QsCi0gICAgT01YX1U4ICAqIGluZGV4LAotICAgIGNvbnN0IE9NWF9VOCAqIHBaaWd6YWdUYWJsZQotKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX0dldFZMQ0JpdHMKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGVzY2FwZSBtb2RlIGRlY2lzaW9uIGJhc2VkIG9uIHRoZSBydW4sIHJ1bissIGxldmVsLCBsZXZlbCsgYW5kIAotICogbGFzdCBjb21iaW5hdGlvbnMuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCi0gKgkJCQkJCQkJdGhlIGJpdCBzdHJlYW0KLSAqIFtpbl0JcEJpdE9mZnNldAkJcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKLSAqCQkJCQkJCQlieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcKLSAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiBzaG9ydFZpZGVvSGVhZGVyPT0wLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MS4KLSAqIFtpbl0gc3RhcnQgICAgICAgICAgIHN0YXJ0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBlbmNvZGluZyBiZWdpbnMgd2l0aCAKLSAqICAgICAgICAgICAgICAgICAgICAgIDB0aCBlbGVtZW50IG9yIDFzdC4KLSAqIFtpbi9vdXRdIHBMYXN0ICAgICAgIHBvaW50ZXIgdG8gbGFzdCBzdGF0dXMgZmxhZwotICogW2luXSBydW5CZWdpblNpbmdsZUxldmVsRW50cmllc0wwICAgICAgVGhlIHJ1biB2YWx1ZSBmcm9tIHdoaWNoIGxldmVsIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBlcXVhbCB0byAxOiBsYXN0ID09IDAKLSAqIFtpbl0gSW5kZXhCZWdpblNpbmdsZUxldmVsRW50cmllc0wwICAgIEFycmF5IGluZGV4IGluIHRoZSBWTEMgdGFibGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGluZyB0byB0aGUgIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMCAKLSAqIFtpbl0gcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMSAgICAgIFRoZSBydW4gdmFsdWUgZnJvbSB3aGljaCBsZXZlbCAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZXF1YWwgdG8gMTogbGFzdCA9PSAxCi0gKiBbaW5dIEluZGV4QmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMSAgICBBcnJheSBpbmRleCBpbiB0aGUgVkxDIHRhYmxlIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRpbmcgdG8gdGhlICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDAgCi0gKiBbaW5dIHBSdW5JbmRleFRhYmxlTDAgICAgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKLSAqIFtpbl0gcFZsY1RhYmxlTDAgICAgICAgICBWTEMgdGFibGUgZm9yIGxhc3QgPT0gMAotICogW2luXSBwUnVuSW5kZXhUYWJsZUwxICAgIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCi0gKiBbaW5dIHBWbGNUYWJsZUwxICAgICAgICAgVkxDIHRhYmxlIGZvciBsYXN0ID09IDEKLSAqIFtpbl0gcExNQVhUYWJsZUwwICAgICAgICBMZXZlbCBNQVggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAotICogW2luXSBwTE1BWFRhYmxlTDEgICAgICAgIExldmVsIE1BWCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCi0gKiBbaW5dIHBSTUFYVGFibGVMMCAgICAgICAgUnVuIE1BWCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCi0gKiBbaW5dIHBSTUFYVGFibGVMMSAgICAgICAgUnVuIE1BWCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCi0gKiBbb3V0XXBEc3QJCQkgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQKLSAqCQkJCQkJCWJsb2NrLiBTaG91bGQgYmUgMzItYml0IGFsaWduZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMl9HZXRWTENCaXRzICgKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgICAgICAgICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAotCQkJICBPTVhfUzE2ICogcERzdCwKLQkJCSAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAotCQkJICBPTVhfVTggICAgc3RhcnQsCQkJICAKLQkJCSAgT01YX1U4ICAqIHBMYXN0LAotCQkJICBPTVhfVTggICAgcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMCwKLQkJCSAgT01YX1U4ICAgIG1heEluZGV4Rm9yTXVsdGlwbGVFbnRyaWVzTDAsCi0JCQkgIE9NWF9VOCAgICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMSwKLQkJCSAgT01YX1U4ICAgIG1heEluZGV4Rm9yTXVsdGlwbGVFbnRyaWVzTDEsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUnVuSW5kZXhUYWJsZUwwLAotICAgICAgICAgICAgICBjb25zdCBBUk1fVkxDMzIgKnBWbGNUYWJsZUwwLAotCQkJICBjb25zdCBPTVhfVTggICogcFJ1bkluZGV4VGFibGVMMSwKLSAgICAgICAgICAgICAgY29uc3QgQVJNX1ZMQzMyICpwVmxjVGFibGVMMSwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBMTUFYVGFibGVMMCwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBMTUFYVGFibGVMMSwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSTUFYVGFibGVMMCwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSTUFYVGFibGVMMSwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBaaWd6YWdUYWJsZQotKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX1B1dFZMQ0JpdHMKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENoZWNrcyB0aGUgdHlwZSBvZiBFc2NhcGUgTW9kZSBhbmQgcHV0IGVuY29kZWQgYml0cyBmb3IgCi0gKiBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50cy4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCSBwcEJpdFN0cmVhbSAgICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgotICoJCQkJCQkgIHRoZSBiaXQgc3RyZWFtCi0gKiBbaW5dCSBwQml0T2Zmc2V0ICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNwotICogW2luXSBzaG9ydFZpZGVvSGVhZGVyIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIHNob3J0VmlkZW9IZWFkZXI9PTAsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLgotICogW2luXSAgc3RhcnQgICAgICAgICAgICBzdGFydCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZW5jb2RpbmcgYmVnaW5zIHdpdGggCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIDB0aCBlbGVtZW50IG9yIDFzdC4KLSAqIFtpbl0gIG1heFN0b3JlUnVuTDAgICAgTWF4IHN0b3JlIHBvc3NpYmxlIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGxhc3QgPSAwCi0gKiBbaW5dICBtYXhTdG9yZVJ1bkwxICAgIE1heCBzdG9yZSBwb3NzaWJsZSAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBsYXN0ID0gMQotICogW2luXSAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBydW4gdmFsdWUgYWZ0ZXIgd2hpY2ggbGV2ZWwgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZXF1YWwgdG8gMTogCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSBzdGF0dXMpIGZvciBsYXN0ID0gMAotICogW2luXSAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDEgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBydW4gdmFsdWUgYWZ0ZXIgd2hpY2ggbGV2ZWwgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZXF1YWwgdG8gMTogCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSBzdGF0dXMpIGZvciBsYXN0ID0gMQotICogW2luXSAgcFJ1bkluZGV4VGFibGVMMCBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKLSAqIFtpbl0gIHBWbGNUYWJsZUwwICAgICAgVkxDIHRhYmxlIGZvciBsYXN0ID09IDAKLSAqIFtpbl0gIHBSdW5JbmRleFRhYmxlTDEgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCi0gKiBbaW5dICBwVmxjVGFibGVMMSAgICAgIFZMQyB0YWJsZSBmb3IgbGFzdCA9PSAxCi0gKiBbaW5dICBwTE1BWFRhYmxlTDAgICAgIExldmVsIE1BWCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAotICogW2luXSAgcExNQVhUYWJsZUwxICAgICBMZXZlbCBNQVggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKLSAqIFtpbl0gIHBSTUFYVGFibGVMMCAgICAgUnVuIE1BWCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAotICogW2luXSAgcFJNQVhUYWJsZUwxICAgICBSdW4gTUFYIHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCi0gKiBbb3V0XSBwUURjdEJsa0NvZWYgICAgIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQKLSAqIFtvdXRdIHBwQml0U3RyZWFtICAgICAgKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuCi0gKiBbb3V0XSBwQml0T2Zmc2V0ICAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotCi0KLU9NWFJlc3VsdCBhcm1WQ000UDJfUHV0VkxDQml0cyAoCi0gICAgICAgICAgICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgICAgICAgICAgICBPTVhfSU5UICogcEJpdE9mZnNldCwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1MxNiAqcFFEY3RCbGtDb2VmLAotICAgICAgICAgICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCi0gICAgICAgICAgICAgIE9NWF9VOCBzdGFydCwKLSAgICAgICAgICAgICAgT01YX1U4IG1heFN0b3JlUnVuTDAsCi0gICAgICAgICAgICAgIE9NWF9VOCBtYXhTdG9yZVJ1bkwxLAotICAgICAgICAgICAgICBPTVhfVTggIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wwLAotICAgICAgICAgICAgICBPTVhfVTggIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wxLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJ1bkluZGV4VGFibGVMMCwKLSAgICAgICAgICAgICAgY29uc3QgQVJNX1ZMQzMyICpwVmxjVGFibGVMMCwKLQkJCSAgY29uc3QgT01YX1U4ICAqIHBSdW5JbmRleFRhYmxlTDEsCi0gICAgICAgICAgICAgIGNvbnN0IEFSTV9WTEMzMiAqcFZsY1RhYmxlTDEsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwTE1BWFRhYmxlTDAsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwTE1BWFRhYmxlTDEsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUk1BWFRhYmxlTDAsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUk1BWFRhYmxlTDEsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwWmlnemFnVGFibGUKLSk7Ci0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfRmlsbFZMQ0J1ZmZlcgotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgY2FsY3VsYXRpbmcgdGhlIFZMQyBiaXRzIGRlcGVuZGluZyBvbiB0aGUgZXNjYXBlIHR5cGUgYW5kIGluc2VydCAKLSAqIHRoZSBzYW1lIGluIHRoZSBiaXRzdHJlYW0KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCSBwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCi0gKgkgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYml0IHN0cmVhbQotICogW2luXQkgcEJpdE9mZnNldCAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3Ci0gKiBbaW5dICBydW4gICAgICAgICAgICAgICAgUnVuIHZhbHVlIChjb3VudCBvZiB6ZXJvcykgdG8gYmUgZW5jb2RlZCAgCi0gKiBbaW5dICBsZXZlbCAgICAgICAgICAgICAgTGV2ZWwgdmFsdWUgKG5vbi16ZXJvIHZhbHVlKSB0byBiZSBlbmNvZGVkCi0gKiBbaW5dICBydW5QbHVzICAgICAgICAgICAgQ2FsY3VsYXRlZCBhcyBydW5QbHVzID0gcnVuIC0gKFJNQVggKyAxKSAgCi0gKiBbaW5dICBsZXZlbFBsdXMgICAgICAgICAgQ2FsY3VsYXRlZCBhcyAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFBsdXMgPSBzaWduKGxldmVsKSpbYWJzKGxldmVsKSAtIExNQVhdCi0gKiBbaW5dICBmTW9kZSAgICAgICAgICAgICAgRmxhZyBpbmRpY2F0aW5nIHRoZSBlc2NhcGUgbW9kZXMKLSAqIFtpbl0gIGxhc3QgICAgICAgICAgICAgICBzdGF0dXMgb2YgdGhlIGxhc3QgZmxhZwotICogW2luXSAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBydW4gdmFsdWUgYWZ0ZXIgd2hpY2ggbGV2ZWwgd2lsbCBiZSBlcXVhbCB0byAxOiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEgc3RhdHVzKQotICogW2luXSAgcFJ1bkluZGV4VGFibGUgICAgIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfdGFibGVzX1ZMQy5oCi0gKiBbaW5dICBwVmxjVGFibGUgICAgICAgICAgVkxDIHRhYmxlIGRlZmluZWQgaW4gYXJtVkNNNFAyX0h1ZmZfdGFibGVzX1ZMQy5oCi0gKiBbb3V0XSBwcEJpdFN0cmVhbQkJKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gYnVmZmVyLgotICogW291dF0gcEJpdE9mZnNldCAgICAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQotICogICAgICAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbS4KLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMl9GaWxsVkxDQnVmZmVyICgKLSAgICAgICAgICAgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgICAgICAgICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAotICAgICAgICAgICAgICBPTVhfVTMyIHJ1biwKLSAgICAgICAgICAgICAgT01YX1MxNiBsZXZlbCwgCi0JCQkgIE9NWF9VMzIgcnVuUGx1cywKLSAgICAgICAgICAgICAgT01YX1MxNiBsZXZlbFBsdXMsIAotICAgICAgICAgICAgICBPTVhfVTggIGZNb2RlLAotCQkJICBPTVhfVTggIGxhc3QsCi0gICAgICAgICAgICAgIE9NWF9VOCAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzLCAKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqcFJ1bkluZGV4VGFibGUsCi0gICAgICAgICAgICAgIGNvbnN0IEFSTV9WTEMzMiAqcFZsY1RhYmxlCi0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfQ2hlY2tWTENFc2NhcGVNb2RlCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBlc2NhcGUgbW9kZSBkZWNpc2lvbiBiYXNlZCBvbiB0aGUgcnVuLCBydW4rLCBsZXZlbCwgbGV2ZWwrIGFuZCAKLSAqIGxhc3QgY29tYmluYXRpb25zLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gcnVuICAgICAgICAgICAgIFJ1biB2YWx1ZSAoY291bnQgb2YgemVyb3MpIHRvIGJlIGVuY29kZWQgIAotICogW2luXSBsZXZlbCAgICAgICAgICAgTGV2ZWwgdmFsdWUgKG5vbi16ZXJvIHZhbHVlKSB0byBiZSBlbmNvZGVkCi0gKiBbaW5dIHJ1blBsdXMgICAgICAgICBDYWxjdWxhdGVkIGFzIHJ1blBsdXMgPSBydW4gLSAoUk1BWCArIDEpICAKLSAqIFtpbl0gbGV2ZWxQbHVzICAgICAgIENhbGN1bGF0ZWQgYXMgCi0gKiAgICAgICAgICAgICAgICAgICAgICBsZXZlbFBsdXMgPSBzaWduKGxldmVsKSpbYWJzKGxldmVsKSAtIExNQVhdCi0gKiBbaW5dIG1heFN0b3JlUnVuICAgICBNYXggc3RvcmUgcG9zc2libGUgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhKQotICogW2luXSBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXMgCi0gKiAgICAgICAgICAgICAgICAgICAgICBUaGUgcnVuIHZhbHVlIGFmdGVyIHdoaWNoIGxldmVsIAotICogICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBlcXVhbCB0byAxOiAKLSAqICAgICAgICAgICAgICAgICAgICAgIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSBzdGF0dXMpCi0gKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgc2hvcnRWaWRlb0hlYWRlcj09MCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIHNob3J0VmlkZW9IZWFkZXI9PTEuCi0gKiBbaW5dIHBSdW5JbmRleFRhYmxlICBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYwotICogICAgICAgICAgICAgICAgICAgICAgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhIHN0YXR1cykKLSAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAKLSAqIFJldHVybiBWYWx1ZToKLSAqIFJldHVybnMgYW4gRXNjYXBlIG1vZGUgd2hpY2ggY2FuIHRha2UgdmFsdWVzIGZyb20gMCB0byAzCi0gKiAwIC0tPiBubyBlc2NhcGUgbW9kZSwgMSAtLT4gZXNjYXBlIHR5cGUgMSwKLSAqIDEgLS0+IGVzY2FwZSB0eXBlIDIsIDMgLS0+IGVzY2FwZSB0eXBlIDMsIGNoZWNrIHNlY3Rpb24gNy40LjEuMwotICogaW4gdGhlIE1QRUcgSVNPIHN0YW5kYXJkLgotICoKLSAqLwotCi1PTVhfVTggYXJtVkNNNFAyX0NoZWNrVkxDRXNjYXBlTW9kZSgKLSAgICAgT01YX1UzMiBydW4sCi0gICAgIE9NWF9VMzIgcnVuUGx1cywKLSAgICAgT01YX1MxNiBsZXZlbCwKLSAgICAgT01YX1MxNiBsZXZlbFBsdXMsCi0gICAgIE9NWF9VOCAgbWF4U3RvcmVSdW4sCi0gICAgIE9NWF9VOCAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzLAotICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCi0gICAgIGNvbnN0IE9NWF9VOCAgKnBSdW5JbmRleFRhYmxlCi0pOwotCi0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGEgMTZ4MTYgYmxvY2sgc2VhcmNoOyBlc3RpbWF0ZXMgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCBtaW5pbXVtIFNBRC4gIAotICogQm90aCB0aGUgaW5wdXQgYW5kIG91dHB1dCBtb3Rpb24gdmVjdG9ycyBhcmUgcmVwcmVzZW50ZWQgdXNpbmcgaGFsZi1waXhlbCB1bml0cywgYW5kIAotICogdGhlcmVmb3JlIGEgc2hpZnQgbGVmdCBvciByaWdodCBieSAxIGJpdCBtYXkgYmUgcmVxdWlyZWQsIHJlc3BlY3RpdmVseSwgdG8gbWF0Y2ggdGhlIAotICogaW5wdXQgb3Igb3V0cHV0IE1WcyB3aXRoIG90aGVyIGZ1bmN0aW9ucyB0aGF0IGVpdGhlciBnZW5lcmF0ZSBvdXRwdXQgTVZzIG9yIGV4cGVjdCAKLSAqIGlucHV0IE1WcyByZXByZXNlbnRlZCB1c2luZyBpbnRlZ2VyIHBpeGVsIHVuaXRzLiAKLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBTcmNSZWZCdWYJCXBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSBNQiB0aGF0IAotICogICAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IAotICogICAgICAgICAgICAgICAgICAgIHBsYW5lLgotICogW2luXQlyZWZXaWR0aAkJICB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lCi0gKiBbaW5dCXBSZWZSZWN0CQkgIHBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlY3Rhbmd1bGFyIGluIHJlZmVyZW5jZSBwbGFuZS4gUmVsYXRpdmUgdG8gaW1hZ2Ugb3JpZ2luLiAKLSAqICAgICAgICAgICAgICAgICAgICBJdCdzIG5vdCBsaW1pdGVkIHRvIHRoZSBpbWFnZSBib3VuZGFyeSwgYnV0IGRlcGVuZGVkIG9uIHRoZSBwYWRkaW5nLiBGb3IgZXhhbXBsZSwgCi0gKiAgICAgICAgICAgICAgICAgICAgaWYgeW91IHBhZCA0IHBpeGVscyBvdXRzaWRlIHRoZSBpbWFnZSBib3JkZXIsIHRoZW4gdGhlIHZhbHVlIGZvciBsZWZ0IGJvcmRlciAKLSAqICAgICAgICAgICAgICAgICAgICBjYW4gYmUgLTQKLSAqIFtpbl0JcFNyY0N1cnJCdWYJCXBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBleHRyYWN0ZWQgZnJvbSBvcmlnaW5hbCBwbGFuZSAobGluZWFyIGFycmF5LCAKLSAqICAgICAgICAgICAgICAgICAgICAyNTYgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuCi0gKiBbaW5dIHBDdXJyUG9pbnRQb3MJcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZQotICogW2luXSBwU3JjUHJlTVYJCSAgcG9pbnRlciB0byBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvcjsgTlVMTCBpbmRpY2F0ZXMgbm8gcHJlZGljdGVkIE1WCi0gKiBbaW5dIHBTcmNQcmVTQUQJCXBvaW50ZXIgdG8gU0FEIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJlZGljdGVkIE1WIChyZWZlcmVuY2VkIGJ5IHBTcmNQcmVNVikKLSAqIFtpbl0gc2VhcmNoUmFuZ2UJCXNlYXJjaCByYW5nZSBmb3IgMTZYMTYgaW50ZWdlciBibG9jayx0aGUgdW5pdHMgb2YgaXQgaXMgZnVsbCBwaXhlbCx0aGUgc2VhcmNoIHJhbmdlIAotICogICAgICAgICAgICAgICAgICAgIGlzIHRoZSBzYW1lIGluIGFsbCBkaXJlY3Rpb25zLkl0IGlzIGluIGluY2x1c2l2ZSBvZiB0aGUgYm91bmRhcnkgYW5kIHNwZWNpZmllZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICB0ZXJtcyBvZiBpbnRlZ2VyIHBpeGVsIHVuaXRzLgotICogW2luXSBwTUVTcGVjCQkJICB2ZW5kb3Itc3BlY2lmaWMgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmU7IG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKLSAqICAgICAgICAgICAgICAgICAgICBhbmQgdGhlbiBpbml0aWFsaXplZCB1c2luZyBvbXhWQ000UDJfTUVJbml0IHByaW9yIHRvIGNhbGxpbmcgdGhlIGJsb2NrIG1hdGNoaW5nIAotICogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLgotICogW2luXSBCbG9ja1NpemUgICAgIE1hY3JvQmxvY2sgU2l6ZSBpLmUgZWl0aGVyIDE2eDE2IG9yIDh4OC4KLSAqIFtvdXRdCXBEc3RNVgkJCXBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WCi0gKiBbb3V0XQlwRHN0U0FECQkJcG9pbnRlciB0byBtaW5pbXVtIFNBRAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9TdHNfTm9FcnIgqEMgbm8gZXJyb3IuCi0gKiBPTVhfU3RzX0JhZEFyZ0VyciCoQyBiYWQgYXJndW1lbnRzCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyKAotICAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCi0gICAgIE9NWF9JTlQgcmVmV2lkdGgsCi0gICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAotICAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAotICAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAotICAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY1ByZU1WLAotICAgICBjb25zdCBPTVhfSU5UICpwU3JjUHJlU0FELAotICAgICB2b2lkICpwTUVTcGVjLAotICAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WLAotICAgICBPTVhfSU5UICpwRHN0U0FELAotICAgICBPTVhfVTggQmxvY2tTaXplCi0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfQmxvY2tNYXRjaF9IYWxmCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBhIDE2eDE2IGJsb2NrIG1hdGNoIHdpdGggaGFsZi1waXhlbCByZXNvbHV0aW9uLiAgUmV0dXJucyB0aGUgZXN0aW1hdGVkIAotICogbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCBtaW5pbXVtIFNBRC4gIFRoaXMgZnVuY3Rpb24gZXN0aW1hdGVzIHRoZSBoYWxmLXBpeGVsIAotICogbW90aW9uIHZlY3RvciBieSBpbnRlcnBvbGF0aW5nIHRoZSBpbnRlZ2VyIHJlc29sdXRpb24gbW90aW9uIHZlY3RvciByZWZlcmVuY2VkIAotICogYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0TVYsIGkuZS4sIHRoZSBpbml0aWFsIGludGVnZXIgTVYgaXMgZ2VuZXJhdGVkIAotICogZXh0ZXJuYWxseS4gIFRoZSBpbnB1dCBwYXJhbWV0ZXJzIHBTcmNSZWZCdWYgYW5kIHBTZWFyY2hQb2ludFJlZlBvcyBzaG91bGQgYmUgCi0gKiBzaGlmdGVkIGJ5IHRoZSB3aW5uaW5nIE1WIG9mIDE2eDE2IGludGVnZXIgc2VhcmNoIHByaW9yIHRvIGNhbGxpbmcgQmxvY2tNYXRjaF9IYWxmXzE2eDE2LiAgCi0gKiBUaGUgZnVuY3Rpb24gQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2IG1heSBiZSB1c2VkIGZvciBpbnRlZ2VyIG1vdGlvbiBlc3RpbWF0aW9uLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcFNyY1JlZkJ1ZgkJcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIE1CIAotICogICAgICAgICAgICAgICAgICAgIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgdGhlCWN1cnJlbnQgcGxhbmUuCi0gKiBbaW5dCXJlZldpZHRoCQkgIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUKLSAqIFtpbl0JcFJlZlJlY3QJCSAgcmVmZXJlbmNlIHBsYW5lIHZhbGlkIHJlZ2lvbiByZWN0YW5nbGUKLSAqIFtpbl0JcFNyY0N1cnJCdWYJCXBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBleHRyYWN0ZWQgZnJvbSBvcmlnaW5hbCBwbGFuZSAKLSAqICAgICAgICAgICAgICAgICAgICAobGluZWFyIGFycmF5LCAyNTYgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogW2luXQlwU2VhcmNoUG9pbnRSZWZQb3MJcG9zaXRpb24gb2YgdGhlIHN0YXJ0aW5nIHBvaW50IGZvciBoYWxmIHBpeGVsIHNlYXJjaCAoc3BlY2lmaWVkIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRlcm1zIG9mIGludGVnZXIgcGl4ZWwgdW5pdHMpIGluIHRoZSByZWZlcmVuY2UgcGxhbmUuCi0gKiBbaW5dCXJuZFZhbAkJCSAgcm91bmRpbmcgY29udHJvbCBiaXQgZm9yIGhhbGYgcGl4ZWwgbW90aW9uIGVzdGltYXRpb247IAotICogICAgICAgICAgICAgICAgICAgIDA9cm91bmRpbmcgY29udHJvbCBkaXNhYmxlZDsgMT1yb3VuZGluZyBjb250cm9sIGVuYWJsZWQKLSAqIFtpbl0JcFNyY0RzdE1WCQlwb2ludGVyIHRvIHRoZSBpbml0aWFsIE1WIGVzdGltYXRlOyB0eXBpY2FsbHkgZ2VuZXJhdGVkIGR1cmluZyBhIHByaW9yIAotICogICAgICAgICAgICAgICAgICAxNlgxNiBpbnRlZ2VyIHNlYXJjaCBhbmQgaXRzIHVuaXQgaXMgaGFsZiBwaXhlbC4KLSAqIFtpbl0gQmxvY2tTaXplICAgICBNYWNyb0Jsb2NrIFNpemUgaS5lIGVpdGhlciAxNngxNiBvciA4eDguCi0gKiBbb3V0XXBTcmNEc3RNVgkJcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYKLSAqIFtvdXRdcERzdFNBRAkJCXBvaW50ZXIgdG8gbWluaW11bSBTQUQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfU3RzX05vRXJyIKhDIG5vIGVycm9yCi0gKiBPTVhfU3RzX0JhZEFyZ0VyciCoQyBiYWQgYXJndW1lbnRzCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDJfQmxvY2tNYXRjaF9IYWxmKAotICAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCi0gICAgIE9NWF9JTlQgcmVmV2lkdGgsCi0gICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAotICAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAotICAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwU2VhcmNoUG9pbnRSZWZQb3MsCi0gICAgIE9NWF9JTlQgcm5kVmFsLAotICAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0RzdE1WLAotICAgICBPTVhfSU5UICpwRHN0U0FELAotICAgICBPTVhfVTggQmxvY2tTaXplCi0pOwotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX1BhZE1WCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBtb3Rpb24gdmVjdG9yIHBhZGRpbmcgZm9yIGEgbWFjcm9ibG9jay4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHBTcmNEc3RNViAgICAgICBwb2ludGVyIHRvIG1vdGlvbiB2ZWN0b3IgYnVmZmVyIG9mIHRoZSBjdXJyZW50Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2sKLSAqIFtpbl0gcFRyYW5zcCAgICAgICAgIHBvaW50ZXIgdG8gdHJhbnNwYXJlbnQgc3RhdHVzIGJ1ZmZlciBvZiB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBtYWNyb2Jsb2NrCi0gKiBbb3V0XSAgICBwU3JjRHN0TVYgICAgICAgcG9pbnRlciB0byBtb3Rpb24gdmVjdG9yIGJ1ZmZlciBpbiB3aGljaCB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW90aW9uIHZlY3RvcnMgaGF2ZSBiZWVuIHBhZGRlZAotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDJfUGFkTVYoCi0gICAgIE9NWFZDTW90aW9uVmVjdG9yICogcFNyY0RzdE1WLAotICAgICBPTVhfVTggKiBwVHJhbnNwCi0pOwotCi0vKiAKLSAqIEguMjY0IFNwZWNpZmljIERlY2xhcmF0aW9ucyAKLSAqLwotLyogRGVmaW5lcyAqLwotI2RlZmluZSBBUk1fTTRQMTBfUV9PRkZTRVQgICAgICAgICgxNSkKLQotCi0vKiBEZXF1YW50IHRhYmxlcyAqLwotCi1leHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMTBfUG9zVG9WQ29sNHg0WzE2XTsKLWV4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAxMF9Qb3NUb1ZDb2wyeDJbNF07Ci1leHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMTBfVk1hdHJpeFs2XVszXTsKLWV4dGVybiBjb25zdCBPTVhfVTMyIGFybVZDTTRQMTBfTUZNYXRyaXhbNl1bM107Ci0KLQotLyoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtIHRoZSB3b3JrIHJlcXVpcmVkIGJ5IHRoZSBPcGVuTUFYCi0gKiBEZWNvZGVDb2VmZnNUb1BhaXIgZnVuY3Rpb24gYW5kIERlY29kZUNocm9tYURDQ29lZmZzVG9QYWlyLgotICogU2luY2UgbW9zdCBvZiB0aGUgY29kZSBpcyBjb21tb24gd2Ugc2hhcmUgaXQgaGVyZS4KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwcEJpdFN0cmVhbQkJRG91YmxlIHBvaW50ZXIgdG8gY3VycmVudCBieXRlIGluIGJpdCBzdHJlYW0gYnVmZmVyCi0gKiBbaW5dCXBPZmZzZXQJCQlQb2ludGVyIHRvIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKLSAqCQkJCQkJCQl0byBieSAqcHBCaXRTdHJlYW0KLSAqIFtpbl0Jc01heE51bUNvZWZmCU1heGltdW0gbnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyBpbiBjdXJyZW50Ci0gKgkJCQkJCQkJYmxvY2sgKDQsMTUgb3IgMTYpCi0gKiBbaW5dCW5UYWJsZSAgICAgICAgICBUYWJsZSBudW1iZXIgKDAgdG8gNCkgYWNjb3JkaW5nIHRvIHRoZSBmaXZlIGNvbHVtbnMKLSAqICAgICAgICAgICAgICAgICAgICAgIG9mIFRhYmxlIDktNSBpbiB0aGUgSC4yNjQgc3BlYwotICogW291dF0JcHBCaXRTdHJlYW0JCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZAotICogW291dF0JcE9mZnNldAkJCSpwT2Zmc2V0IGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkCi0gKiBbb3V0XQlwTnVtQ29lZmYJCVBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBub256ZXJvIGNvZWZmaWNpZW50cyBpbgotICoJCQkJCQkJCXRoaXMgYmxvY2sKLSAqIFtvdXRdCXBwUG9zQ29lZmJ1ZglEb3VibGUgcG9pbnRlciB0byBkZXN0aW5hdGlvbiByZXNpZHVhbAotICoJCQkJCQkJCWNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBvbXhFcnJvciByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyKAotICAgICBjb25zdCBPTVhfVTgqKiBwcEJpdFN0cmVhbSwKLSAgICAgT01YX1MzMiogcE9mZnNldCwKLSAgICAgT01YX1U4KiBwTnVtQ29lZmYsCi0gICAgIE9NWF9VOCoqcHBQb3NDb2VmYnVmLAotICAgICBPTVhfSU5UIG5UYWJsZSwKLSAgICAgT01YX0lOVCBzTWF4TnVtQ29lZmYgICAgICAgIAotICk7Ci0KLS8qCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm0gREMgc3R5bGUgaW50cmEgcHJlZGljdGlvbiwgYXZlcmFnaW5nIHVwcGVyIGFuZCBsZWZ0IGJsb2NrCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcFNyY0xlZnQJCVBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiAxNiBsZWZ0IGNvZWZmaWNpZW50czoKLSAqCQkJCQkJCQlwW3gsIHldICh4ID0gLTEsIHkgPSAwLi4zKQotICogW2luXQlwU3JjQWJvdmUJCVBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiAxNiBhYm92ZSBjb2VmZmljaWVudHM6Ci0gKgkJCQkJCQkJcFt4LHldICh4ID0gMC4uMywgeSA9IC0xKQotICogW2luXQlsZWZ0U3RlcAkJU3RlcCBvZiBsZWZ0IGNvZWZmaWNpZW50IGJ1ZmZlcgotICogW2luXQlkc3RTdGVwCQkJU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyCi0gKiBbaW5dCWF2YWlsYWJpbGl0eQlOZWlnaGJvcmluZyAxNngxNiBNQiBhdmFpbGFiaWxpdHkgZmxhZwotICogW291dF0JcERzdAkJCVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE5vbmUKLSAqLwotCi12b2lkIGFybVZDTTRQMTBfUHJlZGljdEludHJhREM0eDQoCi0gICAgIGNvbnN0IE9NWF9VOCogcFNyY0xlZnQsCi0gICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlLAotICAgICBPTVhfVTgqIHBEc3QsCi0gICAgIE9NWF9JTlQgbGVmdFN0ZXAsCi0gICAgIE9NWF9JTlQgZHN0U3RlcCwKLSAgICAgT01YX1MzMiBhdmFpbGFiaWxpdHkgICAgICAgIAotKTsKLQotLyoKLSAqIERlc2NyaXB0aW9uCi0gKiBVbnBhY2sgYSA0eDQgYmxvY2sgb2YgY29lZmZpY2llbnQtcmVzaWR1YWwgcGFpciB2YWx1ZXMKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwcFNyYwlEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyCi0gKgkJCQkJCWJ1ZmZlciBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcKLSAqIFtvdXRdCXBwU3JjCSpwcFNyYyBpcyB1cGRhdGVkIHRvIHRoZSBzdGFydCBvZiBuZXh0IG5vbiBlbXB0eSBibG9jawotICogW291dF0JcERzdAlQb2ludGVyIHRvIHVucGFja2VkIDR4NCBibG9jawotICovCi0KLXZvaWQgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NCgKLSAgICAgY29uc3QgT01YX1U4ICoqcHBTcmMsCi0gICAgIE9NWF9TMTYqIHBEc3QKLSk7Ci0KLS8qCi0gKiBEZXNjcmlwdGlvbgotICogVW5wYWNrIGEgMngyIGJsb2NrIG9mIGNvZWZmaWNpZW50LXJlc2lkdWFsIHBhaXIgdmFsdWVzCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcHBTcmMJRG91YmxlIHBvaW50ZXIgdG8gcmVzaWR1YWwgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpcgotICoJCQkJCQlidWZmZXIgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nCi0gKiBbb3V0XQlwcFNyYwkqcHBTcmMgaXMgdXBkYXRlZCB0byB0aGUgc3RhcnQgb2YgbmV4dCBub24gZW1wdHkgYmxvY2sKLSAqIFtvdXRdCXBEc3QJUG9pbnRlciB0byB1bnBhY2tlZCA0eDQgYmxvY2sKLSAqLwotCi12b2lkIGFybVZDTTRQMTBfVW5wYWNrQmxvY2syeDIoCi0gICAgIGNvbnN0IE9NWF9VOCAqKnBwU3JjLAotICAgICBPTVhfUzE2KiBwRHN0Ci0pOwotCi0vKgotICogRGVzY3JpcHRpb24KLSAqIERlYmxvY2sgb25lIGJvdW5kYXJ5IHBpeGVsCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcFEwICAgICAgICAgUG9pbnRlciB0byBwaXhlbCBxMAotICogW2luXSBTdGVwICAgICAgICBTdGVwIGJldHdlZW4gcGl4ZWxzIHEwIGFuZCBxMQotICogW2luXSB0QzAgICAgICAgICBFZGdlIHRocmVzaG9sZCB2YWx1ZQotICogW2luXSBhbHBoYSAgICAgICBhbHBoYSB0aHJlc2hvbGQgdmFsdWUKLSAqIFtpbl0gYmV0YSAgICAgICAgYmV0YSB0aHJlc2hvbGQgdmFsdWUKLSAqIFtpbl0gYlMgICAgICAgICAgZGVibG9ja2luZyBzdHJlbmd0aAotICogW2luXSBDaHJvbWFGbGFnICBUcnVlIGZvciBjaHJvbWEgYmxvY2tzCi0gKiBbb3V0XSBwUTAgICAgICAgIERlYmxvY2tlZCBwaXhlbHMKLSAqIAotICovCi0KLXZvaWQgYXJtVkNNNFAxMF9EZUJsb2NrUGl4ZWwoCi0gICAgT01YX1U4ICpwUTAsICAgIC8qIHBvaW50ZXIgdG8gdGhlIHBpeGVsIHEwICovCi0gICAgaW50IFN0ZXAsICAgICAgIC8qIHN0ZXAgYmV0d2VlbiBwaXhlbHMgcTAgYW5kIHExICovCi0gICAgaW50IHRDMCwgICAgICAgIC8qIGVkZ2UgdGhyZXNob2xkIHZhbHVlICovCi0gICAgaW50IGFscGhhLCAgICAgIC8qIGFscGhhICovCi0gICAgaW50IGJldGEsICAgICAgIC8qIGJldGEgKi8KLSAgICBpbnQgYlMsICAgICAgICAgLyogZGVibG9ja2luZyBzdHJlbmd0aCAqLwotICAgIGludCBDaHJvbWFGbGFnCi0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yIGhvcml6b250YWwgMS8yLXBlbCBwb3NpdGlvbnMKLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqCVtpbl0JcFNyYwkJCVBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgCi0gCQkJCQkJCQkJCQkJCWluIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lCi0gKglbaW5dCWlTcmNTdGVwCVN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuCi0gKglbaW5dCWlEc3RTdGVwCVN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KLSAqCVtpbl0JaVdpZHRoCQlXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jawotICoJW2luXQlpSGVpZ2h0CQlIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqCVtvdXRdCXBEc3QJICAgIFBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSAxLzItcGVsIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEoCi0gICAgICAgIGNvbnN0IE9NWF9VOCoJCXBTcmMsIAotCQlPTVhfVTMyIAlpU3JjU3RlcCwgCi0JCU9NWF9VOCogCXBEc3QsIAotCQlPTVhfVTMyIAlpRHN0U3RlcCwgCi0JCU9NWF9VMzIgCWlXaWR0aCwgCi0JCU9NWF9VMzIgCWlIZWlnaHQKLSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yIHZlcnRpY2FsIDEvMi1wZWwgcG9zaXRpb25zIAotICogYXJvdW5kIGEgZnVsbC1wZWwgcG9zaXRpb24uCi0gKgotICogUmVtYXJrczoKLSAqCi0gKglbaW5dCXBTcmMJCQlQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIGludGVycG9sYXRlIAotICoJCQkJCQkJCQkJCQlpbiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZQotICoJW2luXQlpU3JjU3RlcAlTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLgotICoJW2luXQlpRHN0U3RlcAlTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXIuCi0gKglbaW5dCWlXaWR0aAkJV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqCVtpbl0JaUhlaWdodAkJSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKglbb3V0XQlwRHN0ICAgIAlQb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgMS8yLXBlbAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEoCQotCSBjb25zdCBPTVhfVTgqIAlwU3JjLCAKLQkgT01YX1UzMiAJaVNyY1N0ZXAsIAotIAkgT01YX1U4KiAJcERzdCwKLSAJIE9NWF9VMzIgCWlEc3RTdGVwLCAKLSAJIE9NWF9VMzIgCWlXaWR0aCwgCi0gCSBPTVhfVTMyIAlpSGVpZ2h0Ci0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkRpYWdfTHVtYQotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgKDEvMiwgMS8yKSAgcG9zaXRpb25zIAotICogYXJvdW5kIGEgZnVsbC1wZWwgcG9zaXRpb24uCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiAgW2luXSAgICBwU3JjICAgICAgICBQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIGludGVycG9sYXRlIAotICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHJlY29uc3RydWN0ZWQgZnJhbWUgcGxhbmUKLSAqICBbaW5dICAgIGlTcmNTdGVwICAgIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuCi0gKiAgW2luXSAgICBpRHN0U3RlcCAgICBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXIuCi0gKiAgW2luXSAgICBpV2lkdGggICAgICBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jawotICogIFtpbl0gICAgaUhlaWdodCAgICAgSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKiAgW291dF0gICBwRHN0ICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgKDEvMiwxLzIpLXBlbAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmRGlhZ19MdW1hKCAgCi0gICAgICAgIGNvbnN0IE9NWF9VOCogICAgIHBTcmMsIAotICAgICAgICBPTVhfVTMyICAgICBpU3JjU3RlcCwgCi0gICAgICAgIE9NWF9VOCogICAgIHBEc3QsIAotICAgICAgICBPTVhfVTMyICAgICBpRHN0U3RlcCwKLSAgICAgICAgT01YX1UzMiAgICAgaVdpZHRoLCAKLSAgICAgICAgT01YX1UzMiAgICAgaUhlaWdodAotKTsKLQotLyoKLSAqIERlc2NyaXB0aW9uOgotICogVHJhbnNmb3JtIFJlc2lkdWFsIDR4NCBDb2VmZmljaWVudHMKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgcFNyYwkJU291cmNlIDR4NCBibG9jawotICogW291dF0gcERzdAkJRGVzdGluYXRpb24gNHg0IGJsb2NrCi0gKgotICovCi0KLXZvaWQgYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NChPTVhfUzE2KiBwRHN0LCBPTVhfUzE2ICpwU3JjKTsKLQotLyoKLSAqIERlc2NyaXB0aW9uOgotICogRm9yd2FyZCBUcmFuc2Zvcm0gUmVzaWR1YWwgNHg0IENvZWZmaWNpZW50cwotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICBwU3JjCQlTb3VyY2UgNHg0IGJsb2NrCi0gKiBbb3V0XSBwRHN0CQlEZXN0aW5hdGlvbiA0eDQgYmxvY2sKLSAqCi0gKi8KLQotdm9pZCBhcm1WQ000UDEwX0Z3ZFRyYW5zZm9ybVJlc2lkdWFsNHg0KE9NWF9TMTYqIHBEc3QsIE9NWF9TMTYgKnBTcmMpOwotCi1PTVhfSU5UIGFybVZDTTRQMTBfQ29tcGFyZU1vdGlvbkNvc3RUb01WICgKLSAgICBPTVhfUzE2ICBtdlgsCi0gICAgT01YX1MxNiAgbXZZLAotICAgIE9NWFZDTW90aW9uVmVjdG9yIGRpZmZNViwgCi0gICAgT01YX0lOVCBjYW5kU0FELCAKLSAgICBPTVhWQ01vdGlvblZlY3RvciAqYmVzdE1WLCAKLSAgICBPTVhfVTMyIG5MYW1kYSwKLSAgICBPTVhfUzMyICpwQmVzdENvc3QpOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ0NPTU1fU0FECi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZSB0aGUgU0FEIGZvciBOeE0gYmxvY2tzLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogW2luXQkJcFNyY09yZwkJUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2sKLSAqIFtpbl0JCWlTdGVwT3JnCVN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcgotICogW2luXQkJcFNyY1JlZgkJUG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrCi0gKiBbaW5dCQlpU3RlcFJlZglTdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyCi0gKiBbaW5dCQlpSGVpZ2h0CQlIZWlnaHQgb2YgdGhlIGJsb2NrCi0gKiBbaW5dCQlpV2lkdGgJCVdpZHRoIG9mIHRoZSBibG9jawotICogW291dF0JcERzdFNBRAkJUG9pbnRlciBvZiByZXN1bHQgU0FECi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgotICoKLSAqLwotT01YUmVzdWx0IGFybVZDQ09NTV9TQUQoCQotCWNvbnN0IE9NWF9VOCogCXBTcmNPcmcsCi0JT01YX1UzMiAJaVN0ZXBPcmcsCi0JY29uc3QgT01YX1U4KiAJcFNyY1JlZiwKLQlPTVhfVTMyIAlpU3RlcFJlZiwKLQlPTVhfUzMyKglwRHN0U0FELAotCU9NWF9VMzIJCWlIZWlnaHQsCi0JT01YX1UzMgkJaVdpZHRoKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNDT01NX0F2ZXJhZ2UKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgYXZlcmFnZSBvZiB0d28gYmxvY2tzIGFuZCBzdG9yZXMgdGhlIHJlc3VsdC4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqCVtpbl0JcFByZWQwCQkJUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAwCi0gKglbaW5dCXBQcmVkMQkJCVBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMQotICoJW2luXQlpUHJlZFN0ZXAwCSAgICBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwCi0gKglbaW5dCWlQcmVkU3RlcDEJICAgIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEKLSAqCVtpbl0JaURzdFN0ZXAgCQlTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKLSAqCVtpbl0JaVdpZHRoCQkJV2lkdGggb2YgdGhlIGJsb2NrcwotICoJW2luXQlpSGVpZ2h0CQkJSGVpZ2h0IG9mIHRoZSBibG9ja3MKLSAqCVtvdXRdCXBEc3RQcmVkCQlQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCi0gKgotICovCi0gT01YUmVzdWx0IGFybVZDQ09NTV9BdmVyYWdlICgKLQkgY29uc3QgT01YX1U4KiAJICAgIHBQcmVkMCwKLQkgY29uc3QgT01YX1U4KiAJICAgIHBQcmVkMSwJCi0JIE9NWF9VMzIJCWlQcmVkU3RlcDAsCi0JIE9NWF9VMzIJCWlQcmVkU3RlcDEsCi0JIE9NWF9VOCoJCXBEc3RQcmVkLAotCSBPTVhfVTMyCQlpRHN0U3RlcCwgCi0JIE9NWF9VMzIJCWlXaWR0aCwKLQkgT01YX1UzMgkJaUhlaWdodAotKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9TQURRdWFyCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBiZXR3ZWVuIG9uZSBibG9jayAocFNyYykgYW5kIHRoZSAKLSAqIGF2ZXJhZ2Ugb2YgdGhlIG90aGVyIHR3byAocFNyY1JlZjAgYW5kIHBTcmNSZWYxKQotICoKLSAqIFJlbWFya3M6Ci0gKgotICogW2luXQkJcFNyYwkJCQlQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jawotICogW2luXQkJcFNyY1JlZjAJCVBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDAKLSAqIFtpbl0JCXBTcmNSZWYxCQlQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAxCi0gKiBbaW5dCQlpU3JjU3RlcCAJCVN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcgotICogW2luXQkJaVJlZlN0ZXAwCQlTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAotICogW2luXQkJaVJlZlN0ZXAxIAlTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAotICogW2luXQkJaUhlaWdodAkJCUhlaWdodCBvZiB0aGUgYmxvY2sKLSAqIFtpbl0JCWlXaWR0aAkJCVdpZHRoIG9mIHRoZSBibG9jawotICogW291dF0JcERzdFNBRAkJCVBvaW50ZXIgb2YgcmVzdWx0IFNBRAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KLSAqCi0gKi8KLU9NWFJlc3VsdCBhcm1WQ000UDEwX1NBRFF1YXIoCi0JY29uc3QgT01YX1U4KiAJcFNyYywKLSAgICBjb25zdCBPTVhfVTgqIAlwU3JjUmVmMCwKLQljb25zdCBPTVhfVTgqIAlwU3JjUmVmMSwJCi0gICAgT01YX1UzMiAJaVNyY1N0ZXAsCi0gICAgT01YX1UzMgkJaVJlZlN0ZXAwLAotICAgIE9NWF9VMzIJCWlSZWZTdGVwMSwKLSAgICBPTVhfVTMyKglwRHN0U0FELAotICAgIE9NWF9VMzIgICAgIGlIZWlnaHQsCi0gICAgT01YX1UzMiAgICAgaVdpZHRoCi0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciBjaHJvbWEgY29tcG9uZW50cy4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqICBbaW5dICAgIHBTcmMgICAgICAgICAgICBQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJwb2xhdGUgaW4gdGhlIHJlY29uc3RydWN0ZWQgZnJhbWUgcGxhbmUKLSAqICBbaW5dICAgIGlTcmNTdGVwICAgIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuCi0gKiAgW2luXSAgICBpRHN0U3RlcCAgICBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXIuCi0gKiAgW2luXSAgICBpV2lkdGggICAgICBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jawotICogIFtpbl0gICAgaUhlaWdodCAgICAgSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKiAgW2luXSAgICBkeCAgICAgICAgICAgICAgRnJhY3Rpb25hbCBwYXJ0IG9mIGhvcml6b250YWwgbW90aW9uIHZlY3RvciAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCBpbiAxLzggcGl4ZWwgdW5pdCAoMH43KSAKLSAqICBbaW5dICAgIGR5ICAgICAgICAgICAgICBGcmFjdGlvbmFsIHBhcnQgb2YgdmVydGljYWwgbW90aW9uIHZlY3RvciAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCBpbiAxLzggcGl4ZWwgdW5pdCAoMH43KQotICogIFtvdXRdICAgcERzdCAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgotICoKLSAqLwotIE9NWFJlc3VsdCBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYSgKLSAgICAgICAgT01YX1U4ICAgICAgKnBTcmMsCi0gICAgICAgIE9NWF9VMzIgICAgIGlTcmNTdGVwLAotICAgICAgICBPTVhfVTggICAgICAqcERzdCwKLSAgICAgICAgT01YX1UzMiAgICAgaURzdFN0ZXAsCi0gICAgICAgIE9NWF9VMzIgICAgIGlXaWR0aCwKLSAgICAgICAgT01YX1UzMiAgICAgaUhlaWdodCwKLSAgICAgICAgT01YX1UzMiAgICAgZHgsCi0gICAgICAgIE9NWF9VMzIgICAgIGR5Ci0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVycG9sYXRlX0x1bWEKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgbHVtYSBjb21wb25lbnRzLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogIFtpbl0gICAgcFNyYyAgICAgICAgICAgIFBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnBvbGF0ZSBpbiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZQotICogIFtpbl0gICAgaVNyY1N0ZXAgICAgU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4KLSAqICBbaW5dICAgIGlEc3RTdGVwICAgIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KLSAqICBbaW5dICAgIGlXaWR0aCAgICAgIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKiAgW2luXSAgICBpSGVpZ2h0ICAgICBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqICBbaW5dICAgIGR4ICAgICAgICAgICAgICBGcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvNCBwaXhlbCB1bml0ICgwfjMpIAotICogIFtpbl0gICAgZHkgICAgICAgICAgICAgIEZyYWN0aW9uYWwgcGFydCBvZiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvNCBwaXhlbCB1bml0ICgwfjMpIAotICogIFtvdXRdICAgcERzdCAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgotICoKLSAqLwotCi0gT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfTHVtYSgKLSAgICAgY29uc3QgT01YX1U4ICAgICAqcFNyYywKLSAgICAgT01YX1UzMiAgICBpU3JjU3RlcCwKLSAgICAgT01YX1U4ICAgICAqcERzdCwKLSAgICAgT01YX1UzMiAgICBpRHN0U3RlcCwKLSAgICAgT01YX1UzMiAgICBpV2lkdGgsCi0gICAgIE9NWF9VMzIgICAgaUhlaWdodCwKLSAgICAgT01YX1UzMiAgICBkeCwKLSAgICAgT01YX1UzMiAgICBkeQotKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogb214VkNIMjY0X0RlcXVhbnRUcmFuc2Zvcm1BQ0Zyb21QYWlyX1U4X1MxNl9DMV9ETHgKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFJlY29uc3RydWN0IHRoZSA0eDQgcmVzaWR1YWwgYmxvY2sgZnJvbSBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciwKLSAqIHBlcmZvcm0gZGVxdWFudGlzYXRpb24gYW5kIGludGVnZXIgaW52ZXJzZSB0cmFuc2Zvcm1hdGlvbiBmb3IgNHg0IGJsb2NrIG9mCi0gKiByZXNpZHVhbHMgYW5kIHVwZGF0ZSB0aGUgcGFpciBidWZmZXIgcG9pbnRlciB0byBuZXh0IG5vbi1lbXB0eSBibG9jay4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBwU3JjCQlEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbgotICoJCQkJCQkJcGFpciBidWZmZXIgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nCi0gKiBbaW5dCXBEQwkJCVBvaW50ZXIgdG8gdGhlIERDIGNvZWZmaWNpZW50IG9mIHRoaXMgYmxvY2ssIE5VTEwKLSAqCQkJCQkJCWlmIGl0IGRvZXNuJ3QgZXhpc3QKLSAqIFtpbl0JUVAJCQlRdWFudGl6YXRpb24gcGFyYW1ldGVyCi0gKiBbaW5dIEFDICAgICAgICAgIEZsYWcgaW5kaWNhdGluZyBpZiBhdCBsZWFzdCBvbmUgbm9uLXplcm8gY29lZmZpY2llbnQgZXhpc3RzCi0gKiBbb3V0XQlwRHN0CQlwb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIDR4NCBibG9jayBkYXRhCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgb214RXJyb3IgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybUFDRnJvbVBhaXJfVThfUzE2X0MxX0RMeCgKLSAgICAgT01YX1U4ICoqcHBTcmMsCi0gICAgIE9NWF9TMTYgKnBEc3QsCi0gICAgIE9NWF9JTlQgUVAsCi0gICAgIE9NWF9TMTYqIHBEQywKLSAgICAgaW50IEFDCi0pOwotCi0jZW5kaWYgIC8qX2FybVZpZGVvX0hfKi8KLQotLypFbmQgb2YgRmlsZSovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9hcGkvYXJtVkNDT01NX3MuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9hcGkvYXJtVkNDT01NX3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTlkNDY0NC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvYXBpL2FybVZDQ09NTV9zLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgYXJtVkNDT01NX3MuaAotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDk2NDEKLTsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi07Ly8gQVJNIG9wdGltaXplZCBPcGVuTUFYIEFDIGhlYWRlciBmaWxlCi07Ly8gCi07Ly8gRm9ybXVsYSB1c2VkOgotOy8vIE1BQ1JPIGZvciBjYWxjdWxhdGluZyBtZWRpYW4gZm9yIHRocmVlIHZhbHVlcy4KLQotCi0KLSAgICBJRiA6TE5PVDo6REVGOkFSTVZDQ09NTV9TX0gKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgIE1fVkFSSUFOVFMgICAgICBDb3J0ZXhBOCwgQVJNMTEzNkpTCi0gICAgCi0gICAgSUYgQVJNMTEzNkpTIDpMT1I6IENvcnRleEE4IAotICAgICAKLSAgICAgOy8vLyoKLSAgICAgOy8vICogTWFjcm86IE1fTUVESUFOMwotICAgICA7Ly8gKgotICAgICA7Ly8gKiBEZXNjcmlwdGlvbjogRmluZHMgdGhlIG1lZGlhbiBvZiB0aHJlZSBudW1iZXJzCi0gICAgIDsvLyAqIAotICAgICA7Ly8gKiBSZW1hcmtzOgotICAgICA7Ly8gKgotICAgICA7Ly8gKiBQYXJhbWV0ZXJzOgotICAgICA7Ly8gKiBbaW5dIHggICAgIEZpcnN0IGVudHJ5IGZvciB0aGUgbGlzdCBvZiB0aHJlZSBudW1iZXJzLgotICAgICA7Ly8gKiBbaW5dIHkgICAgIFNlY29uZCBlbnRyeSBmb3IgdGhlIGxpc3Qgb2YgdGhyZWUgbnVtYmVycy4KLSAgICAgOy8vICogICAgICAgICAgICBJbnB1dCB2YWx1ZSBtYXkgYmUgY29ycnVwdGVkIGF0IHRoZSBlbmQgb2YKLSAgICAgOy8vICogICAgICAgICAgICB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgbWFjcm8uCi0gICAgIDsvLyAqIFtpbl0geiAgICAgVGhpcmQgZW50cnkgb2YgdGhlIGxpc3Qgb2YgdGhyZWUgbnVtYmVycy4KLSAgICAgOy8vICogICAgICAgICAgICBJbnB1dCB2YWx1ZSBjb3JydXB0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgCi0gICAgIDsvLyAqICAgICAgICAgICAgZXhlY3V0aW9uIG9mIHRoaXMgbWFjcm8uCi0gICAgIDsvLyAqIFtpbl0gdCAgICAgVGVtcG9yYXJ5IHNjcmF0Y2ggIHJlZ2lzdGVyLgotICAgICA7Ly8gKiBbb3V0XXogICAgIE1lZGlhbiBvZiB0aGUgdGhyZWUgbnVtYmVycy4gICAgICAgCi0gICAgIDsvLyAqLwotICAgICAKLSAgICAgTUFDUk8KLQotICAgICBNX01FRElBTjMgJHgsICR5LCAkeiwgJHQgCi0gICAgIAotICAgICBTVUJTICAkdCwgJHksICR6OyAvLyBpZiAoeSA8IHopCi0gICAgIEFERExUICR6LCAkeiwgJHQ7IC8vICBzd2FwIHkgYW5kIHoKLSAgICAgU1VCTFQgJHksICR5LCAkdDsKLQotICAgICA7Ly8gTm93IHonIDw9IHknLCBzbyB0aGVyZSBhcmUgdGhyZWUgY2FzZXMgZm9yIHRoZQotICAgICA7Ly8gbWVkaWFuIHZhbHVlLCBkZXBlbmRpbmcgb24geC4KLQotICAgICA7Ly8gMSkgeCA8PSB6JyAgICAgIDw9IHknICAgICAgOiBtZWRpYW4gdmFsdWUgaXMgeicKLSAgICAgOy8vIDIpICAgICAgeicgPD0geCA8PSB5JyAgICAgIDogbWVkaWFuIHZhbHVlIGlzIHgKLSAgICAgOy8vIDMpICAgICAgeicgICAgICA8PSB5JyA8PSB4IDogbWVkaWFuIHZhbHVlIGlzIHknCi0KLSAgICAgQ01QICAgJHosICR4OyAgICAgLy8gaWYgKCB4ID4gbWluKHkseikgKQotICAgICBNT1ZMVCAkeiwgJHg7ICAgICAvLyBhbnMgPSB4IAotCi0gICAgIENNUCAgICR4LCAkeTsgICAgIC8vIGlmICggeCA+IG1heCh5LHopICkKLSAgICAgTU9WR1QgJHosICR5OyAgICAgLy8gYW5zID0gbWF4KHkseikKLSAgICAgCi0gICAgIE1FTkQKLSAgICBFTkRJRiAgICAgIAotICAgIAotICAgIAotICAgICAgICAKLSAgICBFTkRJRiA7Ly8gQVJNQUNDT01NX1NfSAotCi0gRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvYXBpL29teFZDLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvYXBpL29teFZDLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiM2NjNzIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL2FwaS9vbXhWQy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDM4MSArMCwwIEBACi0vKioKLSAqIEZpbGU6IG9teFZDLmgKLSAqIEJyaWVmOiBPcGVuTUFYIERMIHYxLjAuMiAtIFZpZGVvIENvZGluZyBsaWJyYXJ5Ci0gKgotICogQ29weXJpZ2h0IKkgMjAwNS0yMDA4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCi0gKgotICogVGhlc2UgbWF0ZXJpYWxzIGFyZSBwcm90ZWN0ZWQgYnkgY29weXJpZ2h0IGxhd3MgYW5kIGNvbnRhaW4gbWF0ZXJpYWwgCi0gKiBwcm9wcmlldGFyeSB0byB0aGUgS2hyb25vcyBHcm91cCwgSW5jLiAgWW91IG1heSB1c2UgdGhlc2UgbWF0ZXJpYWxzIAotICogZm9yIGltcGxlbWVudGluZyBLaHJvbm9zIHNwZWNpZmljYXRpb25zLCB3aXRob3V0IGFsdGVyaW5nIG9yIHJlbW92aW5nIAotICogYW55IHRyYWRlbWFyaywgY29weXJpZ2h0IG9yIG90aGVyIG5vdGljZSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uLgotICogCi0gKiBLaHJvbm9zIEdyb3VwIG1ha2VzIG5vLCBhbmQgZXhwcmVzc2x5IGRpc2NsYWltcyBhbnksIHJlcHJlc2VudGF0aW9ucyAKLSAqIG9yIHdhcnJhbnRpZXMsIGV4cHJlc3Mgb3IgaW1wbGllZCwgcmVnYXJkaW5nIHRoZXNlIG1hdGVyaWFscywgaW5jbHVkaW5nLCAKLSAqIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgb3IgZml0bmVzcyAKLSAqIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBvciBub24taW5mcmluZ2VtZW50IG9mIGFueSBpbnRlbGxlY3R1YWwgcHJvcGVydHkuIAotICogS2hyb25vcyBHcm91cCBtYWtlcyBubywgYW5kIGV4cHJlc3NseSBkaXNjbGFpbXMgYW55LCB3YXJyYW50aWVzLCBleHByZXNzIAotICogb3IgaW1wbGllZCwgcmVnYXJkaW5nIHRoZSBjb3JyZWN0bmVzcywgYWNjdXJhY3ksIGNvbXBsZXRlbmVzcywgdGltZWxpbmVzcywgCi0gKiBhbmQgcmVsaWFiaWxpdHkgb2YgdGhlc2UgbWF0ZXJpYWxzLiAKLSAqCi0gKiBVbmRlciBubyBjaXJjdW1zdGFuY2VzIHdpbGwgdGhlIEtocm9ub3MgR3JvdXAsIG9yIGFueSBvZiBpdHMgUHJvbW90ZXJzLCAKLSAqIENvbnRyaWJ1dG9ycyBvciBNZW1iZXJzIG9yIHRoZWlyIHJlc3BlY3RpdmUgcGFydG5lcnMsIG9mZmljZXJzLCBkaXJlY3RvcnMsIAotICogZW1wbG95ZWVzLCBhZ2VudHMgb3IgcmVwcmVzZW50YXRpdmVzIGJlIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMsIHdoZXRoZXIgCi0gKiBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBmb3IgbG9zdCByZXZlbnVlcywgCi0gKiBsb3N0IHByb2ZpdHMsIG9yIG90aGVyd2lzZSwgYXJpc2luZyBmcm9tIG9yIGluIGNvbm5lY3Rpb24gd2l0aCB0aGVzZSAKLSAqIG1hdGVyaWFscy4KLSAqIAotICogS2hyb25vcyBhbmQgT3Blbk1BWCBhcmUgdHJhZGVtYXJrcyBvZiB0aGUgS2hyb25vcyBHcm91cCBJbmMuIAotICoKLSAqLwotCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfT01YVkNfSF8KLSNkZWZpbmUgX09NWFZDX0hfCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLQotLyogNi4xLjEuMSBNb3Rpb24gVmVjdG9ycyAgKi8KLS8qIEluIG9teFZDLCBtb3Rpb24gdmVjdG9ycyBhcmUgcmVwcmVzZW50ZWQgYXMgZm9sbG93czogICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBPTVhfUzE2IGR4OwotICAgIE9NWF9TMTYgZHk7Ci19IE9NWFZDTW90aW9uVmVjdG9yOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDQ09NTV9BdmVyYWdlXzh4ICAgKDYuMS4zLjEuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgYXZlcmFnZSBvZiB0d28gOHg0LCA4eDgsIG9yIDh4MTYgYmxvY2tzLiAgVGhlIAotICogcmVzdWx0IGlzIHJvdW5kZWQgYWNjb3JkaW5nIHRvIChhK2IrMSkvMi4gIFRoZSBibG9jayBhdmVyYWdlIGZ1bmN0aW9uIGNhbiAKLSAqIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBoYWxmLXBpeGVsIGludGVycG9sYXRpb24gdG8gb2J0YWluIHF1YXJ0ZXIgCi0gKiBwaXhlbCBtb3Rpb24gZXN0aW1hdGVzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTEwXSwgc3ViY2xhdXNlIDguNC4yLjIuMS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFByZWQwICAgICAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMCAKLSAqICAgcFByZWQxICAgICAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMSAKLSAqICAgaVByZWRTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiAgIGlQcmVkU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAotICogICBpRHN0U3RlcCAgIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiAKLSAqICAgaUhlaWdodCAgICAtIEhlaWdodCBvZiB0aGUgYmxvY2tzIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0UHJlZCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gOC1ieXRlIGFsaWduZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKLSAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBQcmVkMCwgcFByZWQxLCBvciAKLSAqICAgICAgICAgICAgICBwRHN0UHJlZC4gCi0gKiAgICAtICAgcERzdFByZWQgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgIC0gICBpUHJlZFN0ZXAwIDw9IDAgb3IgaVByZWRTdGVwMCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgIC0gICBpUHJlZFN0ZXAxIDw9IDAgb3IgaVByZWRTdGVwMSBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgIC0gICBpRHN0U3RlcCAgIDw9IDAgb3IgaURzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgICAtICAgaUhlaWdodCBpcyBub3QgNCwgOCwgb3IgMTYuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDQ09NTV9BdmVyYWdlXzh4ICgKLSAgICBjb25zdCBPTVhfVTggKnBQcmVkMCwKLSAgICBjb25zdCBPTVhfVTggKnBQcmVkMSwKLSAgICBPTVhfVTMyIGlQcmVkU3RlcDAsCi0gICAgT01YX1UzMiBpUHJlZFN0ZXAxLAotICAgIE9NWF9VOCAqcERzdFByZWQsCi0gICAgT01YX1UzMiBpRHN0U3RlcCwKLSAgICBPTVhfVTMyIGlIZWlnaHQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0F2ZXJhZ2VfMTZ4ICAgKDYuMS4zLjEuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgYXZlcmFnZSBvZiB0d28gMTZ4MTYgb3IgMTZ4OCBibG9ja3MuICBUaGUgCi0gKiByZXN1bHQgaXMgcm91bmRlZCBhY2NvcmRpbmcgdG8gKGErYisxKS8yLiAgVGhlIGJsb2NrIGF2ZXJhZ2UgZnVuY3Rpb24gY2FuIAotICogYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGhhbGYtcGl4ZWwgaW50ZXJwb2xhdGlvbiB0byBvYnRhaW4gcXVhcnRlciAKLSAqIHBpeGVsIG1vdGlvbiBlc3RpbWF0ZXMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMTBdLCBzdWJjbGF1c2UgOC40LjIuMi4xLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwUHJlZDAgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiAgIHBQcmVkMSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMSAKLSAqICAgaVByZWRTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiAgIGlQcmVkU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAotICogICBpRHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciAKLSAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgYmxvY2tzIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0UHJlZCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gMTYtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCi0gKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwUHJlZDAsIHBQcmVkMSwgb3IgCi0gKiAgICAgICAgICAgICAgcERzdFByZWQuIAotICogICAgLSAgIHBEc3RQcmVkIGlzIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKiAgICAtICAgaVByZWRTdGVwMCA8PSAwIG9yIGlQcmVkU3RlcDAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAotICogICAgLSAgIGlQcmVkU3RlcDEgPD0gMCBvciBpUHJlZFN0ZXAxIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgIC0gICBpRHN0U3RlcCA8PSAwIG9yIGlEc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgIC0gICBpSGVpZ2h0IGlzIG5vdCA4IG9yIDE2LiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ0NPTU1fQXZlcmFnZV8xNnggKAotICAgIGNvbnN0IE9NWF9VOCAqcFByZWQwLAotICAgIGNvbnN0IE9NWF9VOCAqcFByZWQxLAotICAgIE9NWF9VMzIgaVByZWRTdGVwMCwKLSAgICBPTVhfVTMyIGlQcmVkU3RlcDEsCi0gICAgT01YX1U4ICpwRHN0UHJlZCwKLSAgICBPTVhfVTMyIGlEc3RTdGVwLAotICAgIE9NWF9VMzIgaUhlaWdodAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSSAgICg2LjEuMy4yLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGV4cGFuZHMgYSByZWNvbnN0cnVjdGVkIGZyYW1lIGluLXBsYWNlLiAgVGhlIHVuZXhwYW5kZWQgCi0gKiBzb3VyY2UgZnJhbWUgc2hvdWxkIGJlIHN0b3JlZCBpbiBhIHBsYW5lIGJ1ZmZlciB3aXRoIHN1ZmZpY2llbnQgc3BhY2UgCi0gKiBwcmUtYWxsb2NhdGVkIGZvciBlZGdlIGV4cGFuc2lvbiwgYW5kIHRoZSBpbnB1dCBmcmFtZSBzaG91bGQgYmUgbG9jYXRlZCBpbiAKLSAqIHRoZSBwbGFuZSBidWZmZXIgY2VudGVyLiAgVGhpcyBmdW5jdGlvbiBleGVjdXRlcyB0aGUgcGl4ZWwgZXhwYW5zaW9uIGJ5IAotICogcmVwbGljYXRpbmcgc291cmNlIGZyYW1lIGVkZ2UgcGl4ZWwgaW50ZW5zaXRpZXMgaW4gdGhlIGVtcHR5IHBpeGVsIAotICogbG9jYXRpb25zIChleHBhbnNpb24gcmVnaW9uKSBiZXR3ZWVuIHRoZSBzb3VyY2UgZnJhbWUgZWRnZSBhbmQgdGhlIHBsYW5lIAotICogYnVmZmVyIGVkZ2UuICBUaGUgd2lkdGgvaGVpZ2h0IG9mIHRoZSBleHBhbnNpb24gcmVnaW9ucyBvbiB0aGUgCi0gKiBob3Jpem9udGFsL3ZlcnRpY2FsIGVkZ2VzIGlzIGNvbnRyb2xsZWQgYnkgdGhlIHBhcmFtZXRlciBpRXhwYW5kUGVscy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdFBsYW5lIC0gcG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBmcmFtZSB0byBiZSAKLSAqICAgICAgICAgICAgZXhwYW5kZWQ7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICBpRnJhbWVXaWR0aCAtIGZyYW1lIHdpZHRoOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIGlGcmFtZUhlaWdodCAtZnJhbWUgaGVpZ2h0OyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIGlFeHBhbmRQZWxzIC0gbnVtYmVyIG9mIHBpeGVscyB0byBiZSBleHBhbmRlZCBpbiB0aGUgaG9yaXpvbnRhbCBhbmQgCi0gKiAgICAgICAgICAgIHZlcnRpY2FsIGRpcmVjdGlvbnM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgaVBsYW5lU3RlcCAtIGRpc3RhbmNlLCBpbiBieXRlcywgYmV0d2VlbiB0aGUgc3RhcnQgb2YgY29uc2VjdXRpdmUgbGluZXMgCi0gKiAgICAgICAgICAgIGluIHRoZSBwbGFuZSBidWZmZXI7IG11c3QgYmUgbGFyZ2VyIHRoYW4gb3IgZXF1YWwgdG8gCi0gKiAgICAgICAgICAgIChpRnJhbWVXaWR0aCArIDIgKiBpRXhwYW5kUGVscykuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0UGxhbmUgLVBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgZnJhbWUgKE5PVCB0aGUgCi0gKiAgICAgICAgICAgIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgcGxhbmUpOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAotICogICAgLSAgICBwU3JjRHN0UGxhbmUgaXMgTlVMTC4gCi0gKiAgICAtICAgIHBTcmNEc3RQbGFuZSBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICAgLSAgICBvbmUgb2YgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGlzIGVpdGhlciBlcXVhbCB0byB6ZXJvIG9yIGlzIGEgCi0gKiAgICAgICAgICAgICAgbm9uLW11bHRpcGxlIG9mIDg6IGlGcmFtZUhlaWdodCwgaUZyYW1lV2lkdGgsIGlQbGFuZVN0ZXAsIG9yIAotICogICAgICAgICAgICAgIGlFeHBhbmRQZWxzLiAKLSAqICAgIC0gICAgaVBsYW5lU3RlcCA8IChpRnJhbWVXaWR0aCArIDIgKiBpRXhwYW5kUGVscykuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDQ09NTV9FeHBhbmRGcmFtZV9JICgKLSAgICBPTVhfVTggKnBTcmNEc3RQbGFuZSwKLSAgICBPTVhfVTMyIGlGcmFtZVdpZHRoLAotICAgIE9NWF9VMzIgaUZyYW1lSGVpZ2h0LAotICAgIE9NWF9VMzIgaUV4cGFuZFBlbHMsCi0gICAgT01YX1UzMiBpUGxhbmVTdGVwCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDQ09NTV9Db3B5OHg4ICAgKDYuMS4zLjMuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvcGllcyB0aGUgcmVmZXJlbmNlIDh4OCBibG9jayB0byB0aGUgY3VycmVudCBibG9jay4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jayBpbiB0aGUgc291cmNlIGZyYW1lOyBtdXN0IGJlIAotICogICAgICAgICAgICBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHN0ZXAgLSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydHMgb2YgY29uc2VjdXRpdmUgbGluZXMgaW4gdGhlIHJlZmVyZW5jZSAKLSAqICAgICAgICAgICAgZnJhbWUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOCBhbmQgbXVzdCBiZSBsYXJnZXIgdGhhbiAKLSAqICAgICAgICAgICAgb3IgZXF1YWwgdG8gOC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKLSAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBEc3QgCi0gKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCi0gKiAgICAgICAgICAgICAgYm91bmRhcnk6IHBTcmMsIHBEc3QgCi0gKiAgICAtICAgIHN0ZXAgPDggb3Igc3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ0NPTU1fQ29weTh4OCAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjLAotICAgIE9NWF9VOCAqcERzdCwKLSAgICBPTVhfSU5UIHN0ZXAKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0NvcHkxNngxNiAgICg2LjEuMy4zLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb3BpZXMgdGhlIHJlZmVyZW5jZSAxNngxNiBtYWNyb2Jsb2NrIHRvIHRoZSBjdXJyZW50IG1hY3JvYmxvY2suIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgbWFjcm9ibG9jayBpbiB0aGUgc291cmNlIGZyYW1lOyBtdXN0IGJlIAotICogICAgICAgICAgICBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHN0ZXAgLSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydHMgb2YgY29uc2VjdXRpdmUgbGluZXMgaW4gdGhlIHJlZmVyZW5jZSAKLSAqICAgICAgICAgICAgZnJhbWUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYgYW5kIG11c3QgYmUgbGFyZ2VyIAotICogICAgICAgICAgICB0aGFuIG9yIGVxdWFsIHRvIDE2LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIG1hY3JvYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIAotICogICAgICAgICAgICAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCi0gKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwRHN0IAotICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIAotICogICAgICAgICAgICAgIGJvdW5kYXJ5OiBwU3JjLCBwRHN0IAotICogICAgLSAgICBzdGVwIDwxNiBvciBzdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ0NPTU1fQ29weTE2eDE2ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmMsCi0gICAgT01YX1U4ICpwRHN0LAotICAgIE9NWF9JTlQgc3RlcAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrX1NBRCAgICg2LjEuNC4xLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb21wdXRlcyB0ZXh0dXJlIGVycm9yIG9mIHRoZSBibG9jazsgYWxzbyByZXR1cm5zIFNBRC4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBwbGFuZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICogICBzcmNTdGVwIC0gc3RlcCBvZiB0aGUgc291cmNlIHBsYW5lIAotICogICBwU3JjUmVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJ1ZmZlciwgYW4gOHg4IGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgCi0gKiAgICAgICAgICAgIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIsIGFuIDh4OCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIAotICogICAgICAgICAgICBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICBwRHN0U0FEIC0gcG9pbnRlciB0byB0aGUgU3VtIG9mIEFic29sdXRlIERpZmZlcmVuY2VzIChTQUQpIHZhbHVlIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzIAotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcFNyY1JlZiwgcERzdCBhbmQgcERzdFNBRC4gCi0gKiAgICAtICAgIHBTcmMgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgU3JjU3RlcCA8PSAwIG9yIHNyY1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgICAtICAgIHBTcmNSZWYgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgcERzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2tfU0FEICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmMsCi0gICAgT01YX0lOVCBzcmNTdGVwLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZiwKLSAgICBPTVhfUzE2ICpwRHN0LAotICAgIE9NWF9JTlQgKnBEc3RTQUQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9jayAgICg2LjEuNC4xLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb21wdXRlcyB0aGUgdGV4dHVyZSBlcnJvciBvZiB0aGUgYmxvY2suIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBzb3VyY2UgcGxhbmUuIFRoaXMgc2hvdWxkIGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKiAgIHNyY1N0ZXAgLSBzdGVwIG9mIHRoZSBzb3VyY2UgcGxhbmUgCi0gKiAgIHBTcmNSZWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYnVmZmVyLCBhbiA4eDggYmxvY2suIFRoaXMgc2hvdWxkIGJlIAotICogICAgICAgICAgICBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIsIGFuIDh4OCBibG9jay4gVGhpcyBzaG91bGQgYmUgCi0gKiAgICAgICAgICAgIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBTcmMsIHBTcmNSZWYsIHBEc3QuIAotICogICAgLSAgICBwU3JjIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIFNyY1N0ZXAgPD0gMCBvciBzcmNTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICogICAgLSAgICBwU3JjUmVmIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIHBEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2sgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKLSAgICBPTVhfSU5UIHNyY1N0ZXAsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAotICAgIE9NWF9TMTYgKnBEc3QKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0xpbWl0TVZUb1JlY3QgICAoNi4xLjQuMS4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogTGltaXRzIHRoZSBtb3Rpb24gdmVjdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBibG9jay9tYWNyb2Jsb2NrIHRvIAotICogcHJldmVudCB0aGUgbW90aW9uIGNvbXBlbnNhdGVkIGJsb2NrL21hY3JvYmxvY2sgZnJvbSBtb3Zpbmcgb3V0c2lkZSBhIAotICogYm91bmRpbmcgcmVjdGFuZ2xlIGFzIHNob3duIGluIEZpZ3VyZSA2LTEuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNNViAtIHBvaW50ZXIgdG8gdGhlIG1vdGlvbiB2ZWN0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IGJsb2NrIAotICogICAgICAgICAgICBvciBtYWNyb2Jsb2NrIAotICogICBwUmVjdFZPUFJlZiAtIHBvaW50ZXIgdG8gdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSAKLSAqICAgWGNvb3JkLCBZY29vcmQgIC0gY29vcmRpbmF0ZXMgb2YgdGhlIGN1cnJlbnQgYmxvY2sgb3IgbWFjcm9ibG9jayAKLSAqICAgc2l6ZSAtIHNpemUgb2YgdGhlIGN1cnJlbnQgYmxvY2sgb3IgbWFjcm9ibG9jazsgbXVzdCBiZSBlcXVhbCB0byA4IG9yIAotICogICAgICAgICAgICAxNi4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RNViAtIHBvaW50ZXIgdG8gdGhlIGxpbWl0ZWQgbW90aW9uIHZlY3RvciAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvciBtb3JlIG9mIHRoZSAKLSAqICAgICAgICAgICAgICBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBTcmNNViwgcERzdE1WLCBvciBwUmVjdFZPUFJlZi4gCi0gKiAgICAtICAgIHNpemUgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA4IG9yIDE2LiAKLSAqICAgIC0gICAgdGhlIHdpZHRoIG9yIGhlaWdodCBvZiB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlIGlzIGxlc3MgdGhhbiAKLSAqICAgICAgICAgdHdpY2UgdGhlIGJsb2NrIHNpemUuCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ0NPTU1fTGltaXRNVlRvUmVjdCAoCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNNViwKLSAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WLAotICAgIGNvbnN0IE9NWFJlY3QgKnBSZWN0Vk9QUmVmLAotICAgIE9NWF9JTlQgWGNvb3JkLAotICAgIE9NWF9JTlQgWWNvb3JkLAotICAgIE9NWF9JTlQgc2l6ZQotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fU0FEXzE2eCAgICg2LjEuNC4xLjQpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBmb3IgMTZ4MTYgYW5kIDE2eDggYmxvY2tzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjT3JnIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCi0gKiAgICAgICAgICAgICBib3VuZGFyeS4gCi0gKiAgIGlTdGVwT3JnIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyIAotICogICBwU3JjUmVmICAtIFBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jayAKLSAqICAgaVN0ZXBSZWYgLSBTdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyIAotICogICBpSGVpZ2h0ICAtIEhlaWdodCBvZiB0aGUgYmxvY2sgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RTQUQgLSBQb2ludGVyIG9mIHJlc3VsdCBTQUQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb3IgbW9yZSBvZiB0aGUgCi0gKiAgICAgICAgICAgICAgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwU3JjT3JnLCBwRHN0U0FELCBvciBwU3JjUmVmIAotICogICAgLSAgICBwU3JjT3JnIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBpU3RlcE9yZyAgPD0gMCBvciBpU3RlcE9yZyBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiAKLSAqICAgIC0gICAgaVN0ZXBSZWYgPD0gMCBvciBpU3RlcFJlZiBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiAKLSAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgOCBvciAxNiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ0NPTU1fU0FEXzE2eCAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjT3JnLAotICAgIE9NWF9VMzIgaVN0ZXBPcmcsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAotICAgIE9NWF9VMzIgaVN0ZXBSZWYsCi0gICAgT01YX1MzMiAqcERzdFNBRCwKLSAgICBPTVhfVTMyIGlIZWlnaHQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNDT01NX1NBRF84eCAgICg2LjEuNC4xLjUpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBmb3IgOHgxNiwgOHg4LCA4eDQgYmxvY2tzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjT3JnICAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA4LWJ5dGUgCi0gKiAgICAgICAgICAgICAgYm91bmRhcnkuIAotICogICBpU3RlcE9yZyAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlciAKLSAqICAgcFNyY1JlZiAgLSBQb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sgCi0gKiAgIGlTdGVwUmVmIC0gU3RlcCBvZiB0aGUgcmVmZXJlbmNlIGJsb2NrIGJ1ZmZlciAKLSAqICAgaUhlaWdodCAgLSBIZWlnaHQgb2YgdGhlIGJsb2NrIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0U0FEIC1Qb2ludGVyIG9mIHJlc3VsdCBTQUQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb3IgbW9yZSBvZiB0aGUgCi0gKiAgICAgICAgICAgICAgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwU3JjT3JnLCBwRHN0U0FELCBvciBwU3JjUmVmIAotICogICAgLSAgICBwU3JjT3JnIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIGlTdGVwT3JnICA8PSAwIG9yIGlTdGVwT3JnIGlzIG5vdCBhIG11bHRpcGxlIG9mIDggCi0gKiAgICAtICAgIGlTdGVwUmVmIDw9IDAgb3IgaVN0ZXBSZWYgaXMgbm90IGEgbXVsdGlwbGUgb2YgOCAKLSAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgNCwgOCBvciAxNiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ0NPTU1fU0FEXzh4ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNPcmcsCi0gICAgT01YX1UzMiBpU3RlcE9yZywKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYsCi0gICAgT01YX1UzMiBpU3RlcFJlZiwKLSAgICBPTVhfUzMyKnBEc3RTQUQsCi0gICAgT01YX1UzMiBpSGVpZ2h0Ci0pOwotCi0KLQotLyogNi4yLjEuMSBEaXJlY3Rpb24gICovCi0vKiBUaGUgZGlyZWN0aW9uIGVudW1lcmF0b3IgaXMgdXNlZCB3aXRoIGZ1bmN0aW9ucyB0aGF0IHBlcmZvcm0gQUMvREMgcHJlZGljdGlvbiBhbmQgemlnLXphZyBzY2FuLiAgKi8KLQotZW51bSB7Ci0gICAgT01YX1ZDX05PTkUgICAgICAgPSAwLAotICAgIE9NWF9WQ19IT1JJWk9OVEFMID0gMSwKLSAgICBPTVhfVkNfVkVSVElDQUwgICA9IDIgCi19OwotCi0KLQotLyogNi4yLjEuMiBCaWxpbmVhciBJbnRlcnBvbGF0aW9uICAqLwotLyogVGhlIGJpbGluZWFyIGludGVycG9sYXRpb24gZW51bWVyYXRvciBpcyB1c2VkIHdpdGggbW90aW9uIGVzdGltYXRpb24sIG1vdGlvbiBjb21wZW5zYXRpb24sIGFuZCByZWNvbnN0cnVjdGlvbiBmdW5jdGlvbnMuICAqLwotCi1lbnVtIHsKLSAgICBPTVhfVkNfSU5URUdFUl9QSVhFTCA9IDAsIC8qIGNhc2UgYSAqLwotICAgIE9NWF9WQ19IQUxGX1BJWEVMX1ggID0gMSwgLyogY2FzZSBiICovCi0gICAgT01YX1ZDX0hBTEZfUElYRUxfWSAgPSAyLCAvKiBjYXNlIGMgKi8KLSAgICBPTVhfVkNfSEFMRl9QSVhFTF9YWSA9IDMgIC8qIGNhc2UgZCAqLyAKLX07Ci0KLQotCi0vKiA2LjIuMS4zIE5laWdoYm9yaW5nIE1hY3JvYmxvY2sgQXZhaWxhYmlsaXR5ICAqLwotLyogTmVpZ2hib3JpbmcgbWFjcm9ibG9jayBhdmFpbGFiaWxpdHkgaXMgaW5kaWNhdGVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgZmxhZ3M6ICAgKi8KLQotZW51bSB7Ci0gICAgT01YX1ZDX1VQUEVSID0gMSwgICAgICAgIC8qKiBhYm92ZSBtYWNyb2Jsb2NrIGlzIGF2YWlsYWJsZSAqLwotICAgIE9NWF9WQ19MRUZUID0gMiwgICAgICAgICAvKiogbGVmdCBtYWNyb2Jsb2NrIGlzIGF2YWlsYWJsZSAqLwotICAgIE9NWF9WQ19DRU5URVIgPSA0LAotICAgIE9NWF9WQ19SSUdIVCA9IDgsCi0gICAgT01YX1ZDX0xPV0VSID0gMTYsCi0gICAgT01YX1ZDX1VQUEVSX0xFRlQgPSAzMiwgIC8qKiBhYm92ZS1sZWZ0IG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlICovCi0gICAgT01YX1ZDX1VQUEVSX1JJR0hUID0gNjQsIC8qKiBhYm92ZS1yaWdodCBtYWNyb2Jsb2NrIGlzIGF2YWlsYWJsZSAqLwotICAgIE9NWF9WQ19MT1dFUl9MRUZUID0gMTI4LAotICAgIE9NWF9WQ19MT1dFUl9SSUdIVCA9IDI1NiAKLX07Ci0KLQotCi0vKiA2LjIuMS40IFZpZGVvIENvbXBvbmVudHMgICovCi0vKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgdmlkZW8gY29tcG9uZW50cyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLwotCi10eXBlZGVmIGVudW0gewotICAgIE9NWF9WQ19MVU1JTkFOQ0UsICAgIC8qKiBMdW1pbmFuY2UgY29tcG9uZW50ICovCi0gICAgT01YX1ZDX0NIUk9NSU5BTkNFICAgLyoqIGNocm9taW5hbmNlIGNvbXBvbmVudCAqLyAKLX0gT01YVkNNNFAyVmlkZW9Db21wb25lbnQ7Ci0KLQotCi0vKiA2LjIuMS41IE1hY3JvYmxvY2tUeXBlcyAgKi8KLS8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBtYWNyb2Jsb2NrIHR5cGVzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgT01YX1ZDX0lOVEVSICAgICA9IDAsIC8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKi8KLSAgICBPTVhfVkNfSU5URVJfUSAgID0gMSwgLyoqIFAgcGljdHVyZSBvciBQLVZPUCAqLwotICAgIE9NWF9WQ19JTlRFUjRWICAgPSAyLCAvKiogUCBwaWN0dXJlIG9yIFAtVk9QICovCi0gICAgT01YX1ZDX0lOVFJBICAgICA9IDMsIC8qKiBJIGFuZCBQIHBpY3R1cmUsIEktIGFuZCBQLVZPUCAqLwotICAgIE9NWF9WQ19JTlRSQV9RICAgPSA0LCAvKiogSSBhbmQgUCBwaWN0dXJlLCBJLSBhbmQgUC1WT1AgKi8KLSAgICBPTVhfVkNfSU5URVI0Vl9RID0gNSAgLyoqIFAgcGljdHVyZSBvciBQLVZPUCAoSC4yNjMpKi8KLX0gT01YVkNNNFAyTWFjcm9ibG9ja1R5cGU7Ci0KLQotCi0vKiA2LjIuMS42IENvb3JkaW5hdGVzICAqLwotLyogQ29vcmRpbmF0ZXMgYXJlIHJlcHJlc2VudGVkIGFzIGZvbGxvd3M6ICAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgT01YX0lOVCB4OwotICAgIE9NWF9JTlQgeTsKLX0gT01YVkNNNFAyQ29vcmRpbmF0ZTsKLQotCi0KLS8qIDYuMi4xLjcgTW90aW9uIEVzdGltYXRpb24gQWxnb3JpdGhtcyAgKi8KLS8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBtb3Rpb24gZXN0aW1hdGlvbiBzZWFyY2ggbWV0aG9kcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLwotCi10eXBlZGVmIGVudW0gewotICAgIE9NWF9WQ19NNFAyX0ZBU1RfU0VBUkNIID0gMCwgIC8qKiBGYXN0IG1vdGlvbiBzZWFyY2ggKi8KLSAgICBPTVhfVkNfTTRQMl9GVUxMX1NFQVJDSCA9IDEgICAvKiogRnVsbCBtb3Rpb24gc2VhcmNoICovIAotfSBPTVhWQ000UDJNRU1vZGU7Ci0KLQotCi0vKiA2LjIuMS44IE1vdGlvbiBFc3RpbWF0aW9uIFBhcmFtZXRlcnMgICovCi0vKiBBIGRhdGEgc3RydWN0dXJlIGNvbnRhaW5pbmcgY29udHJvbCBwYXJhbWV0ZXJzIGZvciAKLSAqIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9ucyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAKLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgT01YX0lOVCBzZWFyY2hFbmFibGU4eDg7ICAgICAvKiogZW5hYmxlcyA4eDggc2VhcmNoICovCi0gICAgT01YX0lOVCBoYWxmUGVsU2VhcmNoRW5hYmxlOyAvKiogZW5hYmxlcyBoYWxmLXBlbCByZXNvbHV0aW9uICovCi0gICAgT01YX0lOVCBzZWFyY2hSYW5nZTsgICAgICAgICAvKiogc2VhcmNoIHJhbmdlICovCi0gICAgT01YX0lOVCBybmRWYWw7ICAgICAgICAgICAgICAvKiogcm91bmRpbmcgY29udHJvbDsgMC1kaXNhYmxlZCwgMS1lbmFibGVkKi8KLX0gT01YVkNNNFAyTUVQYXJhbXM7Ci0KLQotCi0vKiA2LjIuMS45IE1hY3JvYmxvY2sgSW5mb3JtYXRpb24gICAqLwotLyogQSBkYXRhIHN0cnVjdHVyZSBjb250YWluaW5nIG1hY3JvYmxvY2sgcGFyYW1ldGVycyBmb3IgCi0gKiBtb3Rpb24gZXN0aW1hdGlvbiBmdW5jdGlvbnMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE9NWF9TMzIgc2xpY2VJZDsgICAgICAgICAgICAgICAgIC8qIHNsaWNlIG51bWJlciAqLwotICAgIE9NWFZDTTRQMk1hY3JvYmxvY2tUeXBlIG1iVHlwZTsgIC8qIE1CIHR5cGU6IE9NWF9WQ19JTlRSQSwgT01YX1ZDX0lOVEVSLCBvciBPTVhfVkNfSU5URVI0ICovCi0gICAgT01YX1MzMiBxcDsgICAgICAgICAgICAgICAgICAgICAgLyogcXVhbnRpemF0aW9uIHBhcmFtZXRlciovCi0gICAgT01YX1UzMiBjYnB5OyAgICAgICAgICAgICAgICAgICAgLyogQ0JQIEx1bWEgKi8KLSAgICBPTVhfVTMyIGNicGM7ICAgICAgICAgICAgICAgICAgICAvKiBDQlAgQ2hyb21hICovCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgcE1WMFsyXVsyXTsgICAgLyogbW90aW9uIHZlY3RvciwgcmVwcmVzZW50ZWQgdXNpbmcgMS8yLXBlbCB1bml0cywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcE1WMFtibG9ja3ldW2Jsb2NreF0gKGJsb2NreSA9IDB+MSwgYmxvY2t4ID0wfjEpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIE9NWFZDTW90aW9uVmVjdG9yIHBNVlByZWRbMl1bMl07IC8qIG1vdGlvbiB2ZWN0b3IgcHJlZGljdGlvbiwgcmVwcmVzZW50ZWQgdXNpbmcgMS8yLXBlbCB1bml0cywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcE1WUHJlZFtibG9ja3ldW2Jsb2NreF0gKGJsb2NreSA9IDB+MSwgYmxvY2t4ID0gMH4xKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBPTVhfVTggcFByZWREaXJbMl1bMl07ICAgICAgICAgICAvKiBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbjogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBPTVhfVkNfTk9ORSwgT01YX1ZDX1ZFUlRJQ0FMLCBPTVhfVkNfSE9SSVpPTlRBTCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLX0gT01YVkNNNFAyTUJJbmZvLCAqT01YVkNNNFAyTUJJbmZvUHRyOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9GaW5kTVZwcmVkICAgKDYuMi4zLjEuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFByZWRpY3RzIGEgbW90aW9uIHZlY3RvciBmb3IgdGhlIGN1cnJlbnQgYmxvY2sgdXNpbmcgdGhlIHByb2NlZHVyZSAKLSAqIHNwZWNpZmllZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuNS4gIFRoZSByZXN1bHRpbmcgcHJlZGljdGVkIE1WIGlzIAotICogcmV0dXJuZWQgaW4gcERzdE1WUHJlZC4gSWYgdGhlIHBhcmFtZXRlciBwRHN0TVZQcmVkTUUgaWYgaXMgbm90IE5VTEwgdGhlbiAKLSAqIHRoZSBzZXQgb2YgdGhyZWUgTVYgY2FuZGlkYXRlcyB1c2VkIGZvciBwcmVkaWN0aW9uIGlzIGFsc28gcmV0dXJuZWQsIAotICogb3RoZXJ3aXNlIHBEc3RNVlByZWRNRWlzIE5VTEwgdXBvbiByZXR1cm4uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNNVkN1ck1CIC0gcG9pbnRlciB0byB0aGUgTVYgYnVmZmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBZIAotICogICAgICAgICAgICBtYWNyb2Jsb2NrOyBhIHZhbHVlIG9mIE5VTEwgaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAKLSAqICAgcFNyY0NhbmRNVjEgLSBwb2ludGVyIHRvIHRoZSBNViBidWZmZXIgY29udGFpbmluZyB0aGUgNCBNVnMgYXNzb2NpYXRlZCAKLSAqICAgICAgICAgICAgd2l0aCB0aGUgTUIgbG9jYXRlZCB0byB0aGUgbGVmdCBvZiB0aGUgY3VycmVudCBNQjsgc2V0IHRvIE5VTEwgCi0gKiAgICAgICAgICAgIGlmIHRoZXJlIGlzIG5vIE1CIHRvIHRoZSBsZWZ0LiAKLSAqICAgcFNyY0NhbmRNVjIgLSBwb2ludGVyIHRvIHRoZSBNViBidWZmZXIgY29udGFpbmluZyB0aGUgNCBNVnMgYXNzb2NpYXRlZCAKLSAqICAgICAgICAgICAgd2l0aCB0aGUgTUIgbG9jYXRlZCBhYm92ZSB0aGUgY3VycmVudCBNQjsgc2V0IHRvIE5VTEwgaWYgdGhlcmUgCi0gKiAgICAgICAgICAgIGlzIG5vIE1CIGxvY2F0ZWQgYWJvdmUgdGhlIGN1cnJlbnQgTUIuIAotICogICBwU3JjQ2FuZE1WMyAtIHBvaW50ZXIgdG8gdGhlIE1WIGJ1ZmZlciBjb250YWluaW5nIHRoZSA0IE1WcyBhc3NvY2lhdGVkIAotICogICAgICAgICAgICB3aXRoIHRoZSBNQiBsb2NhdGVkIHRvIHRoZSByaWdodCBhbmQgYWJvdmUgdGhlIGN1cnJlbnQgTUI7IHNldCAKLSAqICAgICAgICAgICAgdG8gTlVMTCBpZiB0aGVyZSBpcyBubyBNQiBsb2NhdGVkIHRvIHRoZSBhYm92ZS1yaWdodC4gCi0gKiAgIGlCbGsgLSB0aGUgaW5kZXggb2YgYmxvY2sgaW4gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayAKLSAqICAgcERzdE1WUHJlZE1FIC0gTVYgY2FuZGlkYXRlIHJldHVybiBidWZmZXI7ICBpZiBzZXQgdG8gTlVMTCB0aGVuIAotICogICAgICAgICAgICBwcmVkaWN0aW9uIGNhbmRpZGF0ZSBNVnMgYXJlIG5vdCByZXR1cm5lZCBhbmQgcERzdE1WUHJlZE1FIHdpbGwgCi0gKiAgICAgICAgICAgIGJlIE5VTEwgdXBvbiBmdW5jdGlvbiByZXR1cm47IGlmIHBEc3RNVlByZWRNRSBpcyBub24tTlVMTCB0aGVuIGl0IAotICogICAgICAgICAgICBtdXN0IHBvaW50IHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgc3VmZmljaWVudCBzcGFjZSBmb3IgdGhyZWUgCi0gKiAgICAgICAgICAgIHJldHVybiBNVnMuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0TVZQcmVkIC0gcG9pbnRlciB0byB0aGUgcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3IgCi0gKiAgIHBEc3RNVlByZWRNRSAtIGlmIG5vbi1OVUxMIHVwb24gaW5wdXQgdGhlbiBwRHN0TVZQcmVkTUUgIHBvaW50cyB1cG9uIAotICogICAgICAgICAgICByZXR1cm4gdG8gYSBidWZmZXIgY29udGFpbmluZyB0aGUgdGhyZWUgbW90aW9uIHZlY3RvciBjYW5kaWRhdGVzIAotICogICAgICAgICAgICB1c2VkIGZvciBwcmVkaWN0aW9uIGFzIHNwZWNpZmllZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSAKLSAqICAgICAgICAgICAgNy42LjUsIG90aGVyd2lzZSBpZiBOVUxMIHVwb24gaW5wdXQgdGhlbiBwRHN0TVZQcmVkTUUgaXMgTlVMTCAKLSAqICAgICAgICAgICAgdXBvbiBvdXRwdXQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKLSAqICAgIC0gICAgdGhlIHBvaW50ZXIgcERzdE1WUHJlZCBpcyBOVUxMIAotICogICAgLSAgICB0aGUgcGFyYW1ldGVyIGlCbGsgZG9lcyBub3QgZmFsbCBpbnRvIHRoZSByYW5nZSAwIDw9IGlCbGs8PTMgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0ZpbmRNVnByZWQgKAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjTVZDdXJNQiwKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0NhbmRNVjEsCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNDYW5kTVYyLAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjQ2FuZE1WMywKLSAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WUHJlZCwKLSAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WUHJlZE1FLAotICAgIE9NWF9JTlQgaUJsawotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfSURDVDh4OGJsayAgICg2LjIuMy4yLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb21wdXRlcyBhIDJEIGludmVyc2UgRENUIGZvciBhIHNpbmdsZSA4eDggYmxvY2ssIGFzIGRlZmluZWQgaW4gCi0gKiBbSVNPMTQ0OTYtMl0uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZWFybHkgYXJyYW5nZWQgSURDVCBpbnB1dCBidWZmZXI7IAotICogICAgICAgICAgICBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgQWNjb3JkaW5nIHRvIAotICogICAgICAgICAgICBbSVNPMTQ0OTYtMl0sIHRoZSBpbnB1dCBjb2VmZmljaWVudCB2YWx1ZXMgc2hvdWxkIGxpZSB3aXRoaW4gdGhlIAotICogICAgICAgICAgICByYW5nZSBbLTIwNDgsIDIwNDddLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lYXJseSBhcnJhbmdlZCBJRENUIG91dHB1dCBidWZmZXI7IAotICogICAgICAgICAgICBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKLSAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIE5VTEwuIAotICogICAgLSAgICBwU3JjIG9yIHBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0lEQ1Q4eDhibGsgKAotICAgIGNvbnN0IE9NWF9TMTYgKnBTcmMsCi0gICAgT01YX1MxNiAqcERzdAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfTUVHZXRCdWZTaXplICAgKDYuMi40LjEuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbXB1dGVzIHRoZSBzaXplLCBpbiBieXRlcywgb2YgdGhlIHZlbmRvci1zcGVjaWZpYyBzcGVjaWZpY2F0aW9uIAotICogc3RydWN0dXJlIGZvciB0aGUgZm9sbG93aW5nIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9uczogCi0gKiBCbG9ja01hdGNoX0ludGVnZXJfOHg4LCBCbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYsIGFuZCBNb3Rpb25Fc3RpbWF0aW9uTUIuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIE1FbW9kZSAtIG1vdGlvbiBlc3RpbWF0aW9uIG1vZGU7IGF2YWlsYWJsZSBtb2RlcyBhcmUgZGVmaW5lZCBieSB0aGUgCi0gKiAgICAgICAgICAgIGVudW1lcmF0ZWQgdHlwZSBPTVhWQ000UDJNRU1vZGUgCi0gKiAgIHBNRVBhcmFtcyAtIG1vdGlvbiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTaXplIC0gcG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgc3BlY2lmaWNhdGlvbiAKLSAqICAgICAgICAgICAgc3RydWN0dXJlIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6IAotICogICAgLSAgICBhbiBpbnZhbGlkIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSBwYXJhbWV0ZXIgTUVtb2RlIAotICogICAgLSAgICBhIG5lZ2F0aXZlIG9yIHplcm8gdmFsdWUgd2FzIHNwZWNpZmllZCBmb3IgdGhlIAotICogICAgICAgICBwYXJhbWV0ZXIgcE1FUGFyYW1zLT5zZWFyY2hSYW5nZSAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfTUVHZXRCdWZTaXplICgKLSAgICBPTVhWQ000UDJNRU1vZGUgTUVtb2RlLAotICAgIGNvbnN0IE9NWFZDTTRQMk1FUGFyYW1zICpwTUVQYXJhbXMsCi0gICAgT01YX1UzMiAqcFNpemUKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX01FSW5pdCAgICg2LjIuNC4xLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBJbml0aWFsaXplcyB0aGUgdmVuZG9yLXNwZWNpZmljIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIHJlcXVpcmVkIGZvciB0aGUgCi0gKiBmb2xsb3dpbmcgbW90aW9uIGVzdGltYXRpb24gZnVuY3Rpb25zOiAgQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCwgCi0gKiBCbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYsIGFuZCBNb3Rpb25Fc3RpbWF0aW9uTUIuIE1lbW9yeSBmb3IgdGhlIAotICogc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgKnBNRVNwZWMgbXVzdCBiZSBhbGxvY2F0ZWQgcHJpb3IgdG8gY2FsbGluZyB0aGUgCi0gKiBmdW5jdGlvbiwgYW5kIHNob3VsZCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgRm9sbG93aW5nIAotICogaW5pdGlhbGl6YXRpb24gYnkgdGhpcyBmdW5jdGlvbiwgdGhlIHZlbmRvci1zcGVjaWZpYyBzdHJ1Y3R1cmUgKnBNRVNwZWMgCi0gKiBzaG91bGQgY29udGFpbiBhbiBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyByZXByZXNlbnRhdGlvbiBvZiBhbGwgbW90aW9uIAotICogZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIHJlY2VpdmVkIHZpYSB0aGUgc3RydWN0dXJlIHBNRVBhcmFtcywgZm9yIGV4YW1wbGUgIAotICogcm5kVmFsLCBzZWFyY2hSYW5nZSwgZXRjLiAgVGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCBmb3IgdGhlIAotICogc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgY2FuIGJlIGRldGVybWluZWQgdXNpbmcgdGhlIGZ1bmN0aW9uIAotICogb214VkNNNFAyX01FR2V0QnVmU2l6ZS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgTUVtb2RlIC0gbW90aW9uIGVzdGltYXRpb24gbW9kZTsgYXZhaWxhYmxlIG1vZGVzIGFyZSBkZWZpbmVkIGJ5IHRoZSAKLSAqICAgICAgICAgICAgZW51bWVyYXRlZCB0eXBlIE9NWFZDTTRQMk1FTW9kZSAKLSAqICAgcE1FUGFyYW1zIC0gbW90aW9uIGVzdGltYXRpb24gcGFyYW1ldGVycyAKLSAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIHVuaW5pdGlhbGl6ZWQgTUUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSBpbml0aWFsaXplZCBNRSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYW4gaW52YWxpZCB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciB0aGUgcGFyYW1ldGVyIE1FbW9kZSAKLSAqICAgIC0gICAgYSBuZWdhdGl2ZSBvciB6ZXJvIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSAKLSAqICAgICAgICAgcGFyYW1ldGVyIHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2UgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX01FSW5pdCAoCi0gICAgT01YVkNNNFAyTUVNb2RlIE1FbW9kZSwKLSAgICBjb25zdCBPTVhWQ000UDJNRVBhcmFtcypwTUVQYXJhbXMsCi0gICAgdm9pZCAqcE1FU3BlYwotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2ICAgKDYuMi40LjIuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGEgMTZ4MTYgYmxvY2sgc2VhcmNoOyBlc3RpbWF0ZXMgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCAKLSAqIG1pbmltdW0gU0FELiBCb3RoIHRoZSBpbnB1dCBhbmQgb3V0cHV0IG1vdGlvbiB2ZWN0b3JzIGFyZSByZXByZXNlbnRlZCB1c2luZyAKLSAqIGhhbGYtcGl4ZWwgdW5pdHMsIGFuZCB0aGVyZWZvcmUgYSBzaGlmdCBsZWZ0IG9yIHJpZ2h0IGJ5IDEgYml0IG1heSBiZSAKLSAqIHJlcXVpcmVkLCByZXNwZWN0aXZlbHksIHRvIG1hdGNoIHRoZSBpbnB1dCBvciBvdXRwdXQgTVZzIHdpdGggb3RoZXIgCi0gKiBmdW5jdGlvbnMgdGhhdCBlaXRoZXIgZ2VuZXJhdGUgb3V0cHV0IE1WcyBvciBleHBlY3QgaW5wdXQgTVZzIHJlcHJlc2VudGVkIAotICogdXNpbmcgaW50ZWdlciBwaXhlbCB1bml0cy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY1JlZkJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSAKLSAqICAgICAgICAgICAgTUIgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiAKLSAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgcGxhbmUuIAotICogICByZWZXaWR0aCAtIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUgCi0gKiAgIHBSZWZSZWN0IC0gcG9pbnRlciB0byB0aGUgdmFsaWQgcmVmZXJlbmNlIHBsYW5lIHJlY3RhbmdsZTsgY29vcmRpbmF0ZXMgCi0gKiAgICAgICAgICAgIGFyZSBzcGVjaWZpZWQgcmVsYXRpdmUgdG8gdGhlIGltYWdlIG9yaWdpbi4gIFJlY3RhbmdsZSAKLSAqICAgICAgICAgICAgYm91bmRhcmllcyBtYXkgZXh0ZW5kIGJleW9uZCBpbWFnZSBib3VuZGFyaWVzIGlmIHRoZSBpbWFnZSBoYXMgCi0gKiAgICAgICAgICAgIGJlZW4gcGFkZGVkLiAgRm9yIGV4YW1wbGUsIGlmIHBhZGRpbmcgZXh0ZW5kcyA0IHBpeGVscyBiZXlvbmQgCi0gKiAgICAgICAgICAgIGZyYW1lIGJvcmRlciwgdGhlbiB0aGUgdmFsdWUgZm9yIHRoZSBsZWZ0IGJvcmRlciBjb3VsZCBiZSBzZXQgdG8gCi0gKiAgICAgICAgICAgIC00LiAKLSAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCi0gKiAgICAgICAgICAgIGJ1ZmZlciBleHRyYWN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgMjU2IAotICogICAgICAgICAgICBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIFRoZSBudW1iZXIgb2YgCi0gKiAgICAgICAgICAgIGJ5dGVzIGJldHdlZW4gbGluZXMgKHN0ZXApIGlzIDE2LiAKLSAqICAgcEN1cnJQb2ludFBvcyAtIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUgCi0gKiAgIHBTcmNQcmVNViAtIHBvaW50ZXIgdG8gcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3I7IE5VTEwgaW5kaWNhdGVzIG5vIAotICogICAgICAgICAgICBwcmVkaWN0ZWQgTVYgCi0gKiAgIHBTcmNQcmVTQUQgLSBwb2ludGVyIHRvIFNBRCBhc3NvY2lhdGVkIHdpdGggdGhlIHByZWRpY3RlZCBNViAocmVmZXJlbmNlZCAKLSAqICAgICAgICAgICAgYnkgcFNyY1ByZU1WKTsgbWF5IGJlIHNldCB0byBOVUxMIGlmIHVuYXZhaWxhYmxlLiAKLSAqICAgcE1FU3BlYyAtIHZlbmRvci1zcGVjaWZpYyBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZTsgCi0gKiAgICAgICAgICAgIG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCBhbmQgdGhlbiBpbml0aWFsaXplZCB1c2luZyAKLSAqICAgICAgICAgICAgb214VkNNNFAyX01FSW5pdCBwcmlvciB0byBjYWxsaW5nIHRoZSBibG9jayBtYXRjaGluZyBmdW5jdGlvbi4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RNViAtIHBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WIAotICogICBwRHN0U0FEIC0gcG9pbnRlciB0byBtaW5pbXVtIFNBRCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNSZWZCdWYsIAotICogICAgICAgICAgICAgIHBSZWZSZWN0LCBwU3JjQ3VyckJ1ZmYsIHBDdXJyUG9pbnRQb3MsIHBEc3RNViwgcERzdFNBRCBvciAKLSAqICAgICAgICAgICAgICBwTUVTcGVjLCBvciAKLSAqICAgIC0gICAgcFNyY0N1cnJCdWYgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCi0gICAgT01YX0lOVCByZWZXaWR0aCwKLSAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAotICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IqcFNyY1ByZU1WLAotICAgIGNvbnN0IE9NWF9JTlQgKnBTcmNQcmVTQUQsCi0gICAgdm9pZCAqcE1FU3BlYywKLSAgICBPTVhWQ01vdGlvblZlY3RvcipwRHN0TVYsCi0gICAgT01YX0lOVCAqcERzdFNBRAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCAgICg2LjIuNC4yLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBhbiA4eDggYmxvY2sgc2VhcmNoOyBlc3RpbWF0ZXMgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCAKLSAqIG1pbmltdW0gU0FELiAgQm90aCB0aGUgaW5wdXQgYW5kIG91dHB1dCBtb3Rpb24gdmVjdG9ycyBhcmUgcmVwcmVzZW50ZWQgCi0gKiB1c2luZyBoYWxmLXBpeGVsIHVuaXRzLCBhbmQgdGhlcmVmb3JlIGEgc2hpZnQgbGVmdCBvciByaWdodCBieSAxIGJpdCBtYXkgYmUgCi0gKiByZXF1aXJlZCwgcmVzcGVjdGl2ZWx5LCB0byBtYXRjaCB0aGUgaW5wdXQgb3Igb3V0cHV0IE1WcyB3aXRoIG90aGVyIAotICogZnVuY3Rpb25zIHRoYXQgZWl0aGVyIGdlbmVyYXRlIG91dHB1dCBNVnMgb3IgZXhwZWN0IGlucHV0IE1WcyByZXByZXNlbnRlZCAKLSAqIHVzaW5nIGludGVnZXIgcGl4ZWwgdW5pdHMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNSZWZCdWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgCi0gKiAgICAgICAgICAgIGJsb2NrIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IDh4OCBibG9jayAKLSAqICAgICAgICAgICAgaW4gdGhlIGN1cnJlbnQgcGxhbmUuIAotICogICByZWZXaWR0aCAtIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUgCi0gKiAgIHBSZWZSZWN0IC0gcG9pbnRlciB0byB0aGUgdmFsaWQgcmVmZXJlbmNlIHBsYW5lIHJlY3RhbmdsZTsgY29vcmRpbmF0ZXMgCi0gKiAgICAgICAgICAgIGFyZSBzcGVjaWZpZWQgcmVsYXRpdmUgdG8gdGhlIGltYWdlIG9yaWdpbi4gIFJlY3RhbmdsZSAKLSAqICAgICAgICAgICAgYm91bmRhcmllcyBtYXkgZXh0ZW5kIGJleW9uZCBpbWFnZSBib3VuZGFyaWVzIGlmIHRoZSBpbWFnZSBoYXMgCi0gKiAgICAgICAgICAgIGJlZW4gcGFkZGVkLiAKLSAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCi0gKiAgICAgICAgICAgIGJ1ZmZlciBleHRyYWN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgMTI4IAotICogICAgICAgICAgICBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gIFRoZSBudW1iZXIgb2YgCi0gKiAgICAgICAgICAgIGJ5dGVzIGJldHdlZW4gbGluZXMgKHN0ZXApIGlzIDE2IGJ5dGVzLiAKLSAqICAgcEN1cnJQb2ludFBvcyAtIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lIAotICogICBwU3JjUHJlTVYgLSBwb2ludGVyIHRvIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yOyBOVUxMIGluZGljYXRlcyBubyAKLSAqICAgICAgICAgICAgcHJlZGljdGVkIE1WIAotICogICBwU3JjUHJlU0FEIC0gcG9pbnRlciB0byBTQUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmVkaWN0ZWQgTVYgKHJlZmVyZW5jZWQgCi0gKiAgICAgICAgICAgIGJ5IHBTcmNQcmVNVik7IG1heSBiZSBzZXQgdG8gTlVMTCBpZiB1bmF2YWlsYWJsZS4gCi0gKiAgIHBNRVNwZWMgLSB2ZW5kb3Itc3BlY2lmaWMgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmU7IAotICogICAgICAgICAgICBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgYW5kIHRoZW4gaW5pdGlhbGl6ZWQgdXNpbmcgCi0gKiAgICAgICAgICAgIG9teFZDTTRQMl9NRUluaXQgcHJpb3IgdG8gY2FsbGluZyB0aGUgYmxvY2sgbWF0Y2hpbmcgZnVuY3Rpb24uIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0TVYgLSBwb2ludGVyIHRvIGVzdGltYXRlZCBNViAKLSAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gbWluaW11bSBTQUQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjUmVmQnVmLCAKLSAqICAgICAgICAgICAgICBwUmVmUmVjdCwgcFNyY0N1cnJCdWZmLCBwQ3VyclBvaW50UG9zLCBwRHN0TVYsIHBEc3RTQUQgb3IgCi0gKiAgICAgICAgICAgICAgcE1FU3BlYywgb3IgCi0gKiAgICAtICAgIHBTcmNDdXJyQnVmIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAotICAgIE9NWF9JTlQgcmVmV2lkdGgsCi0gICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKLSAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjUHJlTVYsCi0gICAgY29uc3QgT01YX0lOVCAqcFNyY1ByZVNBRCwKLSAgICB2b2lkICpwTUVTcGVjLAotICAgIE9NWFZDTW90aW9uVmVjdG9yICpwRHN0TVYsCi0gICAgT01YX0lOVCAqcERzdFNBRAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2ICAgKDYuMi40LjIuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGEgMTZ4MTYgYmxvY2sgbWF0Y2ggd2l0aCBoYWxmLXBpeGVsIHJlc29sdXRpb24uICBSZXR1cm5zIHRoZSAKLSAqIGVzdGltYXRlZCBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIG1pbmltdW0gU0FELiAgVGhpcyBmdW5jdGlvbiAKLSAqIGVzdGltYXRlcyB0aGUgaGFsZi1waXhlbCBtb3Rpb24gdmVjdG9yIGJ5IGludGVycG9sYXRpbmcgdGhlIGludGVnZXIgCi0gKiByZXNvbHV0aW9uIG1vdGlvbiB2ZWN0b3IgcmVmZXJlbmNlZCBieSB0aGUgaW5wdXQgcGFyYW1ldGVyIHBTcmNEc3RNViwgaS5lLiwgCi0gKiB0aGUgaW5pdGlhbCBpbnRlZ2VyIE1WIGlzIGdlbmVyYXRlZCBleHRlcm5hbGx5LiAgVGhlIGlucHV0IHBhcmFtZXRlcnMgCi0gKiBwU3JjUmVmQnVmIGFuZCBwU2VhcmNoUG9pbnRSZWZQb3Mgc2hvdWxkIGJlIHNoaWZ0ZWQgYnkgdGhlIHdpbm5pbmcgTVYgb2YgCi0gKiAxNngxNiBpbnRlZ2VyIHNlYXJjaCBwcmlvciB0byBjYWxsaW5nIEJsb2NrTWF0Y2hfSGFsZl8xNngxNi4gVGhlIGZ1bmN0aW9uIAotICogQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2IG1heSBiZSB1c2VkIGZvciBpbnRlZ2VyIG1vdGlvbiBlc3RpbWF0aW9uLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjUmVmQnVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIAotICogICAgICAgICAgICBtYWNyb2Jsb2NrIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IAotICogICAgICAgICAgICBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lLiAKLSAqICAgcmVmV2lkdGggLSB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lIAotICogICBwUmVmUmVjdCAtIHJlZmVyZW5jZSBwbGFuZSB2YWxpZCByZWdpb24gcmVjdGFuZ2xlIAotICogICBwU3JjQ3VyckJ1ZiAtIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayAKLSAqICAgICAgICAgICAgYnVmZmVyIGV4dHJhY3RlZCBmcm9tIHRoZSBvcmlnaW5hbCBwbGFuZSAobGluZWFyIGFycmF5LCAyNTYgCi0gKiAgICAgICAgICAgIGVudHJpZXMpOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgVGhlIG51bWJlciBvZiAKLSAqICAgICAgICAgICAgYnl0ZXMgYmV0d2VlbiBsaW5lcyAoc3RlcCkgaXMgMTYuIAotICogICBwU2VhcmNoUG9pbnRSZWZQb3MgLSBwb3NpdGlvbiBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIGhhbGYgcGl4ZWwgCi0gKiAgICAgICAgICAgIHNlYXJjaCAoc3BlY2lmaWVkIGluIHRlcm1zIG9mIGludGVnZXIgcGl4ZWwgdW5pdHMpIGluIHRoZSAKLSAqICAgICAgICAgICAgcmVmZXJlbmNlIHBsYW5lLCBpLmUuLCB0aGUgcmVmZXJlbmNlIHBvc2l0aW9uIHBvaW50ZWQgdG8gYnkgdGhlIAotICogICAgICAgICAgICBwcmVkaWN0ZWQgbW90aW9uIHZlY3Rvci4gCi0gKiAgIHJuZFZhbCAtIHJvdW5kaW5nIGNvbnRyb2wgcGFyYW1ldGVyOiAwIC0gZGlzYWJsZWQ7IDEgLSBlbmFibGVkLiAKLSAqICAgcFNyY0RzdE1WIC0gcG9pbnRlciB0byB0aGUgaW5pdGlhbCBNViBlc3RpbWF0ZTsgdHlwaWNhbGx5IGdlbmVyYXRlZCAKLSAqICAgICAgICAgICAgZHVyaW5nIGEgcHJpb3IgMTZYMTYgaW50ZWdlciBzZWFyY2g7IHNwZWNpZmllZCBpbiB0ZXJtcyBvZiAKLSAqICAgICAgICAgICAgaGFsZi1waXhlbCB1bml0cy4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3RNViAtIHBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WIAotICogICBwRHN0U0FEIC0gcG9pbnRlciB0byBtaW5pbXVtIFNBRCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNSZWZCdWYsIAotICogICAgICAgICBwUmVmUmVjdCwgcFNyY0N1cnJCdWZmLCBwU2VhcmNoUG9pbnRSZWZQb3MsIHBTcmNEc3RNVi4KLSAqICAgIC0gICAgcFNyY0N1cnJCdWYgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCwgb3IgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl8xNngxNiAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAotICAgIE9NWF9JTlQgcmVmV2lkdGgsCi0gICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKLSAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwU2VhcmNoUG9pbnRSZWZQb3MsCi0gICAgT01YX0lOVCBybmRWYWwsCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNEc3RNViwKLSAgICBPTVhfSU5UICpwRHN0U0FECi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfOHg4ICAgKDYuMi40LjIuNCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGFuIDh4OCBibG9jayBtYXRjaCB3aXRoIGhhbGYtcGl4ZWwgcmVzb2x1dGlvbi4gUmV0dXJucyB0aGUgCi0gKiBlc3RpbWF0ZWQgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCBtaW5pbXVtIFNBRC4gIFRoaXMgZnVuY3Rpb24gCi0gKiBlc3RpbWF0ZXMgdGhlIGhhbGYtcGl4ZWwgbW90aW9uIHZlY3RvciBieSBpbnRlcnBvbGF0aW5nIHRoZSBpbnRlZ2VyIAotICogcmVzb2x1dGlvbiBtb3Rpb24gdmVjdG9yIHJlZmVyZW5jZWQgYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0TVYsIGkuZS4sIAotICogdGhlIGluaXRpYWwgaW50ZWdlciBNViBpcyBnZW5lcmF0ZWQgZXh0ZXJuYWxseS4gIFRoZSBpbnB1dCBwYXJhbWV0ZXJzIAotICogcFNyY1JlZkJ1ZiBhbmQgcFNlYXJjaFBvaW50UmVmUG9zIHNob3VsZCBiZSBzaGlmdGVkIGJ5IHRoZSB3aW5uaW5nIE1WIG9mIAotICogOHg4IGludGVnZXIgc2VhcmNoIHByaW9yIHRvIGNhbGxpbmcgQmxvY2tNYXRjaF9IYWxmXzh4OC4gVGhlIGZ1bmN0aW9uIAotICogQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCBtYXkgYmUgdXNlZCBmb3IgaW50ZWdlciBtb3Rpb24gZXN0aW1hdGlvbi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY1JlZkJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSAKLSAqICAgICAgICAgICAgYmxvY2sgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgOHg4IGJsb2NrIAotICogICAgICAgICAgICBpbiB0aGUgY3VycmVudCBwbGFuZS4gCi0gKiAgIHJlZldpZHRoIC0gd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZSAKLSAqICAgcFJlZlJlY3QgLSByZWZlcmVuY2UgcGxhbmUgdmFsaWQgcmVnaW9uIHJlY3RhbmdsZSAKLSAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCi0gKiAgICAgICAgICAgIGJ1ZmZlciBleHRyYWN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgMTI4IAotICogICAgICAgICAgICBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5LiAgVGhlIG51bWJlciBvZiAKLSAqICAgICAgICAgICAgYnl0ZXMgYmV0d2VlbiBsaW5lcyAoc3RlcCkgaXMgMTYuIAotICogICBwU2VhcmNoUG9pbnRSZWZQb3MgLSBwb3NpdGlvbiBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIGhhbGYgcGl4ZWwgCi0gKiAgICAgICAgICAgIHNlYXJjaCAoc3BlY2lmaWVkIGluIHRlcm1zIG9mIGludGVnZXIgcGl4ZWwgdW5pdHMpIGluIHRoZSAKLSAqICAgICAgICAgICAgcmVmZXJlbmNlIHBsYW5lLiAKLSAqICAgcm5kVmFsIC0gcm91bmRpbmcgY29udHJvbCBwYXJhbWV0ZXI6IDAgLSBkaXNhYmxlZDsgMSAtIGVuYWJsZWQuIAotICogICBwU3JjRHN0TVYgLSBwb2ludGVyIHRvIHRoZSBpbml0aWFsIE1WIGVzdGltYXRlOyB0eXBpY2FsbHkgZ2VuZXJhdGVkIAotICogICAgICAgICAgICBkdXJpbmcgYSBwcmlvciA4eDggaW50ZWdlciBzZWFyY2gsIHNwZWNpZmllZCBpbiB0ZXJtcyBvZiAKLSAqICAgICAgICAgICAgaGFsZi1waXhlbCB1bml0cy4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3RNViAtIHBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WIAotICogICBwRHN0U0FEIC0gcG9pbnRlciB0byBtaW5pbXVtIFNBRCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwU3JjUmVmQnVmLCBwUmVmUmVjdCwgcFNyY0N1cnJCdWZmLCBwU2VhcmNoUG9pbnRSZWZQb3MsIHBTcmNEc3RNVgotICogICAgLSAgICBwU3JjQ3VyckJ1ZiBpcyBub3QgOC1ieXRlIGFsaWduZWQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl84eDggKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKLSAgICBPTVhfSU5UIHJlZldpZHRoLAotICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCi0gICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcFNlYXJjaFBvaW50UmVmUG9zLAotICAgIE9NWF9JTlQgcm5kVmFsLAotICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjRHN0TVYsCi0gICAgT01YX0lOVCAqcERzdFNBRAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfTW90aW9uRXN0aW1hdGlvbk1CICAgKDYuMi40LjMuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIG1vdGlvbiBzZWFyY2ggZm9yIGEgMTZ4MTYgbWFjcm9ibG9jay4gIFNlbGVjdHMgYmVzdCBtb3Rpb24gc2VhcmNoIAotICogc3RyYXRlZ3kgZnJvbSBhbW9uZyBpbnRlci0xTVYsIGludGVyLTRNViwgYW5kIGludHJhIG1vZGVzLiAgU3VwcG9ydHMgCi0gKiBpbnRlZ2VyIGFuZCBoYWxmIHBpeGVsIHJlc29sdXRpb24uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNDdXJyQnVmIC0gcG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjdXJyZW50IE1CIGluIHRoZSAKLSAqICAgICAgICAgICAgb3JpZ2luYWwgcGljdHVyZSBwbGFuZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIAotICogICAgICAgICAgICBUaGUgZnVuY3Rpb24gZG9lcyBub3QgZXhwZWN0IHNvdXJjZSBkYXRhIG91dHNpZGUgdGhlIHJlZ2lvbiAKLSAqICAgICAgICAgICAgYm91bmRlZCBieSB0aGUgTUIgdG8gYmUgYXZhaWxhYmxlOyBmb3IgZXhhbXBsZSBpdCBpcyBub3QgCi0gKiAgICAgICAgICAgIG5lY2Vzc2FyeSBmb3IgdGhlIGNhbGxlciB0byBndWFyYW50ZWUgdGhlIGF2YWlsYWJpbGl0eSBvZiAKLSAqICAgICAgICAgICAgcFNyY0N1cnJCdWZbLVNyY0N1cnJTdGVwXSwgaS5lLiwgdGhlIHJvdyBvZiBwaXhlbHMgYWJvdmUgdGhlIE1CIAotICogICAgICAgICAgICB0byBiZSBwcm9jZXNzZWQuIAotICogICBzcmNDdXJyU3RlcCAtIHdpZHRoIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lLCBpbiB0ZXJtcyBvZiBmdWxsIAotICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgIHBTcmNSZWZCdWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgCi0gKiAgICAgICAgICAgIHBsYW5lIGxvY2F0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IAotICogICAgICAgICAgICBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKiAgIHNyY1JlZlN0ZXAgLSB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBpY3R1cmUgcGxhbmUsIGluIHRlcm1zIG9mIGZ1bGwgCi0gKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgcFJlZlJlY3QgLSByZWZlcmVuY2UgcGxhbmUgdmFsaWQgcmVnaW9uIHJlY3RhbmdsZSwgc3BlY2lmaWVkIHJlbGF0aXZlIHRvIAotICogICAgICAgICAgICB0aGUgaW1hZ2Ugb3JpZ2luIAotICogICBwQ3VyclBvaW50UG9zIC0gcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZSAKLSAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIHZlbmRvci1zcGVjaWZpYyBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIAotICogICAgICAgICAgICBzdHJ1Y3R1cmU7IG11c3QgYmUgYWxsb2NhdGVkIGFuZCB0aGVuIGluaXRpYWxpemVkIHVzaW5nIAotICogICAgICAgICAgICBvbXhWQ000UDJfTUVJbml0IHByaW9yIHRvIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4gCi0gKiAgIHBNQkluZm8gLSBhcnJheSwgb2YgZGltZW5zaW9uIGZvdXIsIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gaW5mb3JtYXRpb24gCi0gKiAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCBmb3VyIG5lYXJieSBNQnM6IAotICogICAgICAgICAgICAtICAgcE1CSW5mb1swXSAtIHBvaW50ZXIgdG8gbGVmdCBNQiBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgLSAgIHBNQkluZm9bMV0gLSBwb2ludGVyIHRvIHRvcCBNQiBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgLSAgIHBNQkluZm9bMl0gLSBwb2ludGVyIHRvIHRvcC1sZWZ0IE1CIGluZm9ybWF0aW9uIAotICogICAgICAgICAgICAtICAgcE1CSW5mb1szXSAtIHBvaW50ZXIgdG8gdG9wLXJpZ2h0IE1CIGluZm9ybWF0aW9uIAotICogICAgICAgICAgICBBbnkgcG9pbnRlciBpbiB0aGUgYXJyYXkgbWF5IGJlIHNldCBlcXVhbCB0byBOVUxMIGlmIHRoZSAKLSAqICAgICAgICAgICAgY29ycmVzcG9uZGluZyBNQiBkb2Vzbid0IGV4aXN0LiAgRm9yIGVhY2ggTUIsIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIAotICogICAgICAgICAgICBtZW1iZXJzIGFyZSB1c2VkOiAgICAKLSAqICAgICAgICAgICAgLSAgIG1iVHlwZSAtIG1hY3JvYmxvY2sgdHlwZSwgZWl0aGVyIE9NWF9WQ19JTlRSQSwgT01YX1ZDX0lOVEVSLCBvciAKLSAqICAgICAgICAgICAgICAgIE9NWF9WQ19JTlRFUjRWIAotICogICAgICAgICAgICAtICAgcE1WMFsyXVsyXSAtIGVzdGltYXRlZCBtb3Rpb24gdmVjdG9yczsgcmVwcmVzZW50ZWQgCi0gKiAgICAgICAgICAgICAgICBpbiAxLzIgcGl4ZWwgdW5pdHMgCi0gKiAgICAgICAgICAgIC0gICBzbGljZUlEIC0gbnVtYmVyIG9mIHRoZSBzbGljZSB0byB3aGljaCB0aGUgTUIgYmVsb25ncyAKLSAqICAgcFNyY0RzdE1CQ3VyciAtIHBvaW50ZXIgdG8gaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciB0aGUgY3VycmVudCBNQi4gIAotICogICAgICAgICAgICBUaGUgZm9sbG93aW5nIGVudHJpZXMgc2hvdWxkIGJlIHNldCBwcmlvciB0byBjYWxsaW5nIHRoZSAKLSAqICAgICAgICAgICAgZnVuY3Rpb246IHNsaWNlSUQgLSB0aGUgbnVtYmVyIG9mIHRoZSBzbGljZSB0aGUgdG8gd2hpY2ggdGhlIAotICogICAgICAgICAgICBjdXJyZW50IE1CIGJlbG9uZ3MuICBUaGUgc3RydWN0dXJlIGVsZW1lbnRzIGNicHkgYW5kIGNicGMgYXJlIAotICogICAgICAgICAgICBpZ25vcmVkLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdE1CQ3VyciAtIHBvaW50ZXIgdG8gdXBkYXRlZCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBjdXJyZW50IAotICogICAgICAgICAgICBNQiBhZnRlciBNQi1sZXZlbCBtb3Rpb24gZXN0aW1hdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQuICBUaGUgCi0gKiAgICAgICAgICAgIGZvbGxvd2luZyBzdHJ1Y3R1cmUgbWVtYmVycyBhcmUgdXBkYXRlZCBieSB0aGUgTUUgZnVuY3Rpb246ICAgCi0gKiAgICAgICAgICAgICAgLSAgbWJUeXBlIC0gbWFjcm9ibG9jayB0eXBlOiBPTVhfVkNfSU5UUkEsIE9NWF9WQ19JTlRFUiwgb3IgCi0gKiAgICAgICAgICAgICAgICAgT01YX1ZDX0lOVEVSNFYuIAotICogICAgICAgICAgICAgIC0gIHBNVjBbMl1bMl0gLSBlc3RpbWF0ZWQgbW90aW9uIHZlY3RvcnM7IHJlcHJlc2VudGVkIGluIAotICogICAgICAgICAgICAgICAgIHRlcm1zIG9mIDEvMiBwZWwgdW5pdHMuIAotICogICAgICAgICAgICAgIC0gIHBNVlByZWRbMl1bMl0gLSBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvcnM7IHJlcHJlc2VudGVkIAotICogICAgICAgICAgICAgICAgIGluIHRlcm1zIG9mIDEvMiBwZWwgdW5pdHMuIAotICogICAgICAgICAgICBUaGUgc3RydWN0dXJlIG1lbWJlcnMgY2JweSBhbmQgY2JwYyBhcmUgbm90IHVwZGF0ZWQgYnkgdGhlIGZ1bmN0aW9uLiAKLSAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gdGhlIG1pbmltdW0gU0FEIGZvciBJTlRFUjFWLCBvciBzdW0gb2YgbWluaW11bSBTQURzIAotICogICAgICAgICAgICBmb3IgSU5URVI0ViAKLSAqICAgcERzdEJsb2NrU0FEIC0gcG9pbnRlciB0byBhbiBhcnJheSBvZiBTQUQgdmFsdWVzIGZvciBlYWNoIG9mIHRoZSBmb3VyIAotICogICAgICAgICAgICA4eDggbHVtYSBibG9ja3MgaW4gdGhlIE1CLiAgVGhlIGJsb2NrIFNBRHMgYXJlIGluIHNjYW4gb3JkZXIgZm9yIAotICogICAgICAgICAgICBlYWNoIE1CLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvciBtb3JlIG9mIHRoZSAKLSAqICAgICAgICAgICAgICBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0N1cnJCdWYsIAotICogICAgICAgICAgICAgIHBTcmNSZWZCdWYsIHBSZWZSZWN0LCBwQ3VyclBvaW50UG9zLCBwTUJJbnRlciwgcE1CSW50cmEsIAotICogICAgICAgICAgICAgIHBTcmNEc3RNQkN1cnIsIG9yIHBEc3RTQUQuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9Nb3Rpb25Fc3RpbWF0aW9uTUIgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCi0gICAgT01YX1MzMiBzcmNDdXJyU3RlcCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCi0gICAgT01YX1MzMiBzcmNSZWZTdGVwLAotICAgIGNvbnN0IE9NWFJlY3QqcFJlZlJlY3QsCi0gICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKLSAgICB2b2lkICpwTUVTcGVjLAotICAgIGNvbnN0IE9NWFZDTTRQMk1CSW5mb1B0ciAqcE1CSW5mbywKLSAgICBPTVhWQ000UDJNQkluZm8gKnBTcmNEc3RNQkN1cnIsCi0gICAgT01YX1UxNiAqcERzdFNBRCwKLSAgICBPTVhfVTE2ICpwRHN0QmxvY2tTQUQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RDVDh4OGJsayAgICg2LjIuNC40LjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb21wdXRlcyBhIDJEIGZvcndhcmQgRENUIGZvciBhIHNpbmdsZSA4eDggYmxvY2ssIGFzIGRlZmluZWQgaW4gCi0gKiBbSVNPMTQ0OTYtMl0uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZWFybHkgYXJyYW5nZWQgaW5wdXQgYnVmZmVyOyBtdXN0IAotICogICAgICAgICAgICBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIElucHV0IHZhbHVlcyAocGl4ZWwgCi0gKiAgICAgICAgICAgIGludGVuc2l0aWVzKSBhcmUgdmFsaWQgaW4gdGhlIHJhbmdlIFstMjU1LDI1NV0uIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmVhcmx5IGFycmFuZ2VkIG91dHB1dCBidWZmZXI7IG11c3QgCi0gKiAgICAgICAgICAgIGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cywgcmV0dXJuZWQgaWY6Ci0gKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKLSAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9EQ1Q4eDhibGsgKAotICAgIGNvbnN0IE9NWF9TMTYgKnBTcmMsCi0gICAgT01YX1MxNiAqcERzdAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfUXVhbnRJbnRyYV9JICAgKDYuMi40LjQuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIHF1YW50aXphdGlvbiBvbiBpbnRyYSBibG9jayBjb2VmZmljaWVudHMuIFRoaXMgZnVuY3Rpb24gc3VwcG9ydHMgCi0gKiBiaXRzX3Blcl9waXhlbCA9PSA4LiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgaW50cmEgYmxvY2sgY29lZmZpY2llbnRzOyBtdXN0IGJlIGFsaWduZWQgCi0gKiAgICAgICAgICAgIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpemVyX3NjYWxlKS4gCi0gKiAgIGJsb2NrSW5kZXggLSBibG9jayBpbmRleCBpbmRpY2F0aW5nIHRoZSBjb21wb25lbnQgdHlwZSBhbmQgcG9zaXRpb24sIAotICogICAgICAgICAgICB2YWxpZCBpbiB0aGUgcmFuZ2UgMCB0byA1LCBhcyBkZWZpbmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIAotICogICAgICAgICAgICA2LjEuMy44LiAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCi0gKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyAKLSAqICAgICAgICAgICAgbW9kZSwgYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub24gbGluZWFyIGludHJhIERDIG1vZGUuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgb3V0cHV0IChxdWFudGl6ZWQpIGludGVyYmxvY2sgY29lZmZpY2llbnRzLiAgCi0gKiAgICAgICAgICAgIFdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MSwgQUMgY29lZmZpY2llbnRzIGFyZSBzYXR1cmF0ZWQgb24gdGhlIAotICogICAgICAgICAgICBpbnRlcnZhbCBbLTEyNywgMTI3XSwgYW5kIERDIGNvZWZmaWNpZW50cyBhcmUgc2F0dXJhdGVkIG9uIHRoZSAKLSAqICAgICAgICAgICAgaW50ZXJ2YWwgWzEsIDI1NF0uICBXaGVuIHNob3J0VmlkZW9IZWFkZXI9PTAsIEFDIGNvZWZmaWNpZW50cyAKLSAqICAgICAgICAgICAgYXJlIHNhdHVyYXRlZCBvbiB0aGUgaW50ZXJ2YWwgWy0yMDQ3LCAyMDQ3XS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6Ci0gKiAgICAtICAgIHBTcmNEc3QgaXMgTlVMTC4gCi0gKiAgICAtICAgIGJsb2NrSW5kZXggPCAwIG9yIGJsb2NrSW5kZXggPj0gMTAgCi0gKiAgICAtICAgIFFQIDw9IDAgb3IgUVAgPj0gMzIuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9RdWFudEludHJhX0kgKAotICAgIE9NWF9TMTYgKnBTcmNEc3QsCi0gICAgT01YX1U4IFFQLAotICAgIE9NWF9JTlQgYmxvY2tJbmRleCwKLSAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1F1YW50SW50ZXJfSSAgICg2LjIuNC40LjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBxdWFudGl6YXRpb24gb24gYW4gaW50ZXIgY29lZmZpY2llbnQgYmxvY2s7IHN1cHBvcnRzIAotICogYml0c19wZXJfcGl4ZWwgPT0gOC4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IGludGVyIGJsb2NrIGNvZWZmaWNpZW50czsgbXVzdCBiZSBhbGlnbmVkIAotICogICAgICAgICAgICBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICogICBRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKHF1YW50aXplcl9zY2FsZSkgCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsgCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgbW9kZSwgYW5kIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIG91dHB1dCAocXVhbnRpemVkKSBpbnRlcmJsb2NrIGNvZWZmaWNpZW50cy4gIAotICogICAgICAgICAgICBXaGVuIHNob3J0VmlkZW9IZWFkZXI9PTEsIEFDIGNvZWZmaWNpZW50cyBhcmUgc2F0dXJhdGVkIG9uIHRoZSAKLSAqICAgICAgICAgICAgaW50ZXJ2YWwgWy0xMjcsIDEyN10sIGFuZCBEQyBjb2VmZmljaWVudHMgYXJlIHNhdHVyYXRlZCBvbiB0aGUgCi0gKiAgICAgICAgICAgIGludGVydmFsIFsxLCAyNTRdLiAgV2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0wLCBBQyBjb2VmZmljaWVudHMgCi0gKiAgICAgICAgICAgIGFyZSBzYXR1cmF0ZWQgb24gdGhlIGludGVydmFsIFstMjA0NywgMjA0N10uIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgotICogICAgLSAgICBwU3JjRHN0IGlzIE5VTEwuIAotICogICAgLSAgICBRUCA8PSAwIG9yIFFQID49IDMyLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfUXVhbnRJbnRlcl9JICgKLSAgICBPTVhfUzE2ICpwU3JjRHN0LAotICAgIE9NWF9VOCBRUCwKLSAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludHJhICAgKDYuMi40LjQuNCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFF1YW50aXplcyB0aGUgRENUIGNvZWZmaWNpZW50cywgaW1wbGVtZW50cyBpbnRyYSBibG9jayBBQy9EQyBjb2VmZmljaWVudCAKLSAqIHByZWRpY3Rpb24sIGFuZCByZWNvbnN0cnVjdHMgdGhlIGN1cnJlbnQgaW50cmEgYmxvY2sgdGV4dHVyZSBmb3IgcHJlZGljdGlvbiAKLSAqIG9uIHRoZSBuZXh0IGZyYW1lLiAgUXVhbnRpemVkIHJvdyBhbmQgY29sdW1uIGNvZWZmaWNpZW50cyBhcmUgcmV0dXJuZWQgaW4gCi0gKiB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCBidWZmZXJzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgcGl4ZWxzIG9mIGN1cnJlbnQgaW50cmEgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiAKLSAqICAgICAgICAgICAgYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcFByZWRCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyIGNvbnRhaW5pbmcgCi0gKiAgICAgICAgICAgICgobnVtX21iX3Blcl9yb3cgKiAyICsgMSkgKiA4KSBlbGVtZW50cyBvZiB0eXBlIE9NWF9TMTYuIAotICogICAgICAgICAgICBDb2VmZmljaWVudHMgYXJlIG9yZ2FuaXplZCBpbnRvIGJsb2NrcyBvZiBlaWdodCBhcyBkZXNjcmliZWQgCi0gKiAgICAgICAgICAgIGJlbG93IChJbnRlcm5hbCBQcmVkaWN0aW9uIENvZWZmaWNpZW50IFVwZGF0ZSBQcm9jZWR1cmVzKS4gIFRoZSAKLSAqICAgICAgICAgICAgREMgY29lZmZpY2llbnQgaXMgZmlyc3QsIGFuZCB0aGUgcmVtYWluaW5nIGJ1ZmZlciBsb2NhdGlvbnMgCi0gKiAgICAgICAgICAgIGNvbnRhaW4gdGhlIHF1YW50aXplZCBBQyBjb2VmZmljaWVudHMuIEVhY2ggZ3JvdXAgb2YgZWlnaHQgcm93IAotICogICAgICAgICAgICBidWZmZXIgZWxlbWVudHMgY29tYmluZWQgd2l0aCBvbmUgZWxlbWVudCBlaWdodCBlbGVtZW50cyBhaGVhZCAKLSAqICAgICAgICAgICAgY29udGFpbnMgdGhlIGNvZWZmaWNpZW50IHByZWRpY3RvcnMgb2YgdGhlIG5laWdoYm9yaW5nIGJsb2NrIAotICogICAgICAgICAgICB0aGF0IGlzIHNwYXRpYWxseSBhYm92ZSBvciB0byB0aGUgbGVmdCBvZiB0aGUgYmxvY2sgY3VycmVudGx5IHRvIAotICogICAgICAgICAgICBiZSBkZWNvZGVkLiBBIG5lZ2F0aXZlLXZhbHVlZCBEQyBjb2VmZmljaWVudCBpbmRpY2F0ZXMgdGhhdCB0aGlzIAotICogICAgICAgICAgICBuZWlnaGJvcmluZyBibG9jayBpcyBub3QgSU5UUkEtY29kZWQgb3Igb3V0IG9mIGJvdW5kcywgYW5kIAotICogICAgICAgICAgICB0aGVyZWZvcmUgdGhlIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgYXJlIGludmFsaWQuICBQb2ludGVyIG11c3QgCi0gKiAgICAgICAgICAgIGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcFByZWRCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSBwcmVkaWN0aW9uIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIgCi0gKiAgICAgICAgICAgIGNvbnRhaW5pbmcgMTYgZWxlbWVudHMgb2YgdHlwZSBPTVhfUzE2LiBDb2VmZmljaWVudHMgYXJlIAotICogICAgICAgICAgICBvcmdhbml6ZWQgYXMgZGVzY3JpYmVkIGluIHNlY3Rpb24gNi4yLjIuNS4gIFBvaW50ZXIgbXVzdCBiZSAKLSAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICBwU3VtRXJyIC0gcG9pbnRlciB0byBhIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCBBQyBwcmVkaWN0aW9uIGlzIAotICogICAgICAgICAgICByZXF1aXJlZDsgQUMgcHJlZGljdGlvbiBpcyBlbmFibGVkIGlmICpwU3VtRXJyID49MCwgYnV0IHRoZSAKLSAqICAgICAgICAgICAgdmFsdWUgaXMgbm90IHVzZWQgZm9yIGNvZWZmaWNpZW50IHByZWRpY3Rpb24sIGkuZS4sIHRoZSBzdW0gb2YgCi0gKiAgICAgICAgICAgIGFic29sdXRlIGRpZmZlcmVuY2VzIHN0YXJ0cyBmcm9tIDAgZm9yIGVhY2ggY2FsbCB0byB0aGlzIAotICogICAgICAgICAgICBmdW5jdGlvbi4gIE90aGVyd2lzZSBBQyBwcmVkaWN0aW9uIGlzIGRpc2FibGVkIGlmICpwU3VtRXJyIDwgMCAuIAotICogICBibG9ja0luZGV4IC0gYmxvY2sgaW5kZXggaW5kaWNhdGluZyB0aGUgY29tcG9uZW50IHR5cGUgYW5kIHBvc2l0aW9uLCBhcyAKLSAqICAgICAgICAgICAgZGVmaW5lZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA2LjEuMy44LiAKLSAqICAgY3VyUXAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBtYWNyb2Jsb2NrIHRvIHdoaWNoIHRoZSBjdXJyZW50IAotICogICAgICAgICAgICBibG9jayBiZWxvbmdzIAotICogICBwUXBCdWYgLSBwb2ludGVyIHRvIGEgMi1lbGVtZW50IHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYnVmZmVyOyBwUXBCdWZbMF0gCi0gKiAgICAgICAgICAgIGNvbnRhaW5zIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgOHg4IAotICogICAgICAgICAgICBibG9jayBsZWZ0IG9mIHRoZSBjdXJyZW50IGJsb2NrIChRUGEpLCBhbmQgcFFwQnVmWzFdIGNvbnRhaW5zIAotICogICAgICAgICAgICB0aGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBhc3NvY2lhdGVkIHdpdGggdGhlIDh4OCBibG9jayBhYm92ZSAKLSAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgYmxvY2sgKFFQYykuICBJbiB0aGUgZXZlbnQgdGhhdCB0aGUgY29ycmVzcG9uZGluZyAKLSAqICAgICAgICAgICAgYmxvY2sgaXMgb3V0c2lkZSBvZiB0aGUgVk9QIGJvdW5kLCB0aGUgUXAgdmFsdWUgd2lsbCBub3QgYWZmZWN0IAotICogICAgICAgICAgICB0aGUgaW50cmEgcHJlZGljdGlvbiBwcm9jZXNzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCAKLSAqICAgICAgICAgICAgc3ViLWNsYXVzZSA3LjQuMy4zLCAgQWRhcHRpdmUgQUMgQ29lZmZpY2llbnQgUHJlZGljdGlvbi4gIAotICogICBzcmNTdGVwIC0gd2lkdGggb2YgdGhlIHNvdXJjZSBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgZHN0U3RlcCAtIHdpZHRoIG9mIHRoZSByZWNvbnN0cnVjdGVkIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIAotICogICAgICAgICAgICBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAotICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgCi0gKiAgICAgICAgICAgIG1vZGUsIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQgYnVmZmVyOyBwRHN0WzBdIGNvbnRhaW5zIAotICogICAgICAgICAgICB0aGUgcHJlZGljdGVkIERDIGNvZWZmaWNpZW50OyB0aGUgcmVtYWluaW5nIGVudHJpZXMgY29udGFpbiB0aGUgCi0gKiAgICAgICAgICAgIHF1YW50aXplZCBBQyBjb2VmZmljaWVudHMgKHdpdGhvdXQgcHJlZGljdGlvbikuICBUaGUgcG9pbnRlciAKLSAqICAgICAgICAgICAgcERzdG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICogICBwUmVjIC0gcG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCB0ZXh0dXJlOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gCi0gKiAgICAgICAgICAgIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBQcmVkQnVmUm93IC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyIAotICogICBwUHJlZEJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlciAKLSAqICAgcFByZUFDUHJlZGljdCAtIGlmIHByZWRpY3Rpb24gaXMgZW5hYmxlZCwgdGhlIHBhcmFtZXRlciBwb2ludHMgdG8gdGhlIAotICogICAgICAgICAgICBzdGFydCBvZiB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGNvZWZmaWNpZW50IGRpZmZlcmVuY2VzIGZvciAKLSAqICAgICAgICAgICAgVkxDIGVuY29kaW5nLiBUaGUgZW50cnkgcFByZUFDUHJlZGljdFswXWluZGljYXRlcyBwcmVkaWN0aW9uIAotICogICAgICAgICAgICBkaXJlY3Rpb24gZm9yIHRoZSBjdXJyZW50IGJsb2NrIGFuZCB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgdmFsdWVzOiBPTVhfVkNfTk9ORSAocHJlZGljdGlvbiBkaXNhYmxlZCksIE9NWF9WQ19IT1JJWk9OVEFMLCBvciAKLSAqICAgICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMLiAgVGhlIGVudHJpZXMgCi0gKiAgICAgICAgICAgIHBQcmVBQ1ByZWRpY3RbMV0tcFByZUFDUHJlZGljdFs3XWNvbnRhaW4gcHJlZGljdGVkIEFDIAotICogICAgICAgICAgICBjb2VmZmljaWVudHMuICBJZiBwcmVkaWN0aW9uIGlzIGRpc2FibGVkICgqcFN1bUVycjwwKSB0aGVuIHRoZSAKLSAqICAgICAgICAgICAgY29udGVudHMgb2YgdGhpcyBidWZmZXIgYXJlIHVuZGVmaW5lZCB1cG9uIHJldHVybiBmcm9tIHRoZSAKLSAqICAgICAgICAgICAgZnVuY3Rpb24gCi0gKiAgIHBTdW1FcnIgLSBwb2ludGVyIHRvIHRoZSB2YWx1ZSBvZiB0aGUgYWNjdW11bGF0ZWQgQUMgY29lZmZpY2llbnQgZXJyb3JzLCAKLSAqICAgICAgICAgICAgaS5lLiwgc3VtIG9mIHRoZSBhYnNvbHV0ZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHByZWRpY3RlZCBhbmQgCi0gKiAgICAgICAgICAgIHVucHJlZGljdGVkIEFDIGNvZWZmaWNpZW50cyAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gQmFkIGFyZ3VtZW50czoKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcERzdCwgcFJlYywgCi0gKiAgICAgICAgIHBDb2VmQnVmUm93LCBwQ29lZkJ1ZkNvbCwgcFFwQnVmLCBwUHJlQUNQcmVkaWN0LCBwU3VtRXJyLiAKLSAqICAgIC0gICAgYmxvY2tJbmRleCA8IDAgb3IgYmxvY2tJbmRleCA+PSAxMDsgCi0gKiAgICAtICAgIGN1clFQIDw9IDAgb3IgY3VyUVAgPj0gMzIuIAotICogICAgLSAgICBzcmNTdGVwLCBvciBkc3RTdGVwIDw9IDAgb3Igbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgICAtICAgIHBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZDogLiAKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgbm90IDgtYnl0ZSBhbGlnbmVkOiAKLSAqICAgICAgICAgcFNyYywgcFJlYy4gIAotICoKLSAqICBOb3RlOiBUaGUgY29lZmZpY2llbnQgYnVmZmVycyBtdXN0IGJlIHVwZGF0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSAKLSAqICAgICAgICB1cGRhdGUgcHJvY2VkdXJlcyBkZWZpbmVkIGluIHNlY3Rpb24gaW4gNi4yLjIuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYSAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjLAotICAgIE9NWF9TMTYgKnBEc3QsCi0gICAgT01YX1U4ICpwUmVjLAotICAgIE9NWF9TMTYgKnBQcmVkQnVmUm93LAotICAgIE9NWF9TMTYgKnBQcmVkQnVmQ29sLAotICAgIE9NWF9TMTYgKnBQcmVBQ1ByZWRpY3QsCi0gICAgT01YX0lOVCAqcFN1bUVyciwKLSAgICBPTVhfSU5UIGJsb2NrSW5kZXgsCi0gICAgT01YX1U4IGN1clFwLAotICAgIGNvbnN0IE9NWF9VOCAqcFFwQnVmLAotICAgIE9NWF9JTlQgc3JjU3RlcCwKLSAgICBPTVhfSU5UIGRzdFN0ZXAsCi0gICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRlciAgICg2LjIuNC40LjUpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBJbXBsZW1lbnRzIERDVCwgYW5kIHF1YW50aXplcyB0aGUgRENUIGNvZWZmaWNpZW50cyBvZiB0aGUgaW50ZXIgYmxvY2sgCi0gKiB3aGlsZSByZWNvbnN0cnVjdGluZyB0aGUgdGV4dHVyZSByZXNpZHVhbC4gVGhlcmUgaXMgbm8gYm91bmRhcnkgY2hlY2sgZm9yIAotICogdGhlIGJpdCBzdHJlYW0gYnVmZmVyLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC1wb2ludGVyIHRvIHRoZSByZXNpZHVhbHMgdG8gYmUgZW5jb2RlZDsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIAotICogICAgICAgICAgICAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyLiAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyAKLSAqICAgICAgICAgICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgbW9kZSwgYW5kIAotICogICAgICAgICAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50cyBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCAKLSAqICAgICAgICAgICAgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcFJlYyAtIHBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgdGV4dHVyZSByZXNpZHVhbHM7IG11c3QgYmUgYWxpZ25lZCAKLSAqICAgICAgICAgICAgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgZWl0aGVyIE5VTEwgb3IgCi0gKiAgICAgICAgIG5vdCAxNi1ieXRlIGFsaWduZWQ6IAotICogICAgICAgICAgICAtIHBTcmMgCi0gKiAgICAgICAgICAgIC0gcERzdAotICogICAgICAgICAgICAtIHBSZWMKLSAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PSAzMi4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludGVyICgKLSAgICBjb25zdCBPTVhfUzE2ICpwU3JjLAotICAgIE9NWF9TMTYgKnBEc3QsCi0gICAgT01YX1MxNiAqcFJlYywKLSAgICBPTVhfVTggUVAsCi0gICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyAgICg2LjIuNC41LjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyB6aWd6YWcgc2NhbiBhbmQgVkxDIGVuY29kaW5nIG9mIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgZm9yIG9uZSAKLSAqIGludHJhIGJsb2NrLiAgVHdvIHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbiAoRENWTEMgYW5kIEFDVkxDKSBhcmUgcHJvdmlkZWQgCi0gKiBpbiBvcmRlciB0byBzdXBwb3J0IHRoZSB0d28gZGlmZmVyZW50IG1ldGhvZHMgb2YgcHJvY2Vzc2luZyBEQyAKLSAqIGNvZWZmaWNpZW50cywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4xLjQsICJJbnRyYSBEQyAKLSAqIENvZWZmaWNpZW50IERlY29kaW5nIGZvciB0aGUgQ2FzZSBvZiBTd2l0Y2hlZCBWTEMgRW5jb2RpbmciLiAgCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSBkb3VibGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXRzdHJlYW0gCi0gKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAKLSAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3LiAKLSAqICAgcFFEY3RCbGtDb2VmIC0gcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudCAKLSAqICAgcHJlZERpciAtIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uLCB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB0aGUgemlnemFnIAotICogICAgICAgICAgICBzY2FuIHBhdHRlcm47IHRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogCi0gKiAgICAgICAgICAgIC0gIE9NWF9WQ19OT05FIC0gQUMgcHJlZGljdGlvbiBub3QgdXNlZC4gIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcgc2Nhbi4gCi0gKiAgICAgICAgICAgIC0gIE9NWF9WQ19IT1JJWk9OVEFMIC0gSG9yaXpvbnRhbCBwcmVkaWN0aW9uLiAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLXZlcnRpY2FsIHppZ3phZyBzY2FuLiAKLSAqICAgICAgICAgICAgLSAgT01YX1ZDX1ZFUlRJQ0FMIC0gVmVydGljYWwgcHJlZGljdGlvbi4gIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS1ob3Jpem9udGFsIHppZ3phZyBzY2FuLiAKLSAqICAgcGF0dGVybiAtIGJsb2NrIHBhdHRlcm4gd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgd2hldGhlciB0aGlzIGJsb2NrIGlzIAotICogICAgICAgICAgICBlbmNvZGVkIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKLSAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAotICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlLCBjaHJvbWluYW5jZSkgb2YgdGhlIGN1cnJlbnQgCi0gKiAgICAgICAgICAgIGJsb2NrIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLCBzbyAKLSAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIuIAotICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCi0gKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gQmFkIGFyZ3VtZW50czoKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sIAotICogICAgICAgICAgICAgICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcFFEY3RCbGtDb2VmLiAKLSAqICAgIC0gICAqcEJpdE9mZnNldCA8IDAsIG9yICpwQml0T2Zmc2V0ID43LiAKLSAqICAgIC0gICAgUHJlZERpciBpcyBub3Qgb25lIG9mOiBPTVhfVkNfTk9ORSwgT01YX1ZDX0hPUklaT05UQUwsIG9yIAotICogICAgICAgICBPTVhfVkNfVkVSVElDQUwuIAotICogICAgLSAgICBWaWRlb0NvbXAgaXMgbm90IG9uZSBjb21wb25lbnQgb2YgZW51bSBPTVhWQ000UDJWaWRlb0NvbXBvbmVudC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDICgKLSAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgIGNvbnN0IE9NWF9TMTYgKnBRRGN0QmxrQ29lZiwKLSAgICBPTVhfVTggcHJlZERpciwKLSAgICBPTVhfVTggcGF0dGVybiwKLSAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCi0gICAgT01YVkNNNFAyVmlkZW9Db21wb25lbnQgdmlkZW9Db21wCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQyAgICg2LjIuNC41LjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyB6aWd6YWcgc2NhbiBhbmQgVkxDIGVuY29kaW5nIG9mIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgZm9yIG9uZSAKLSAqIGludHJhIGJsb2NrLiAgVHdvIHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbiAoRENWTEMgYW5kIEFDVkxDKSBhcmUgcHJvdmlkZWQgCi0gKiBpbiBvcmRlciB0byBzdXBwb3J0IHRoZSB0d28gZGlmZmVyZW50IG1ldGhvZHMgb2YgcHJvY2Vzc2luZyBEQyAKLSAqIGNvZWZmaWNpZW50cywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4xLjQsICBJbnRyYSBEQyAKLSAqIENvZWZmaWNpZW50IERlY29kaW5nIGZvciB0aGUgQ2FzZSBvZiBTd2l0Y2hlZCBWTEMgRW5jb2RpbmcuICAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIGRvdWJsZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdHN0cmVhbSAKLSAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5IAotICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcuIAotICogICBwUURjdEJsa0NvZWYgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50IAotICogICBwcmVkRGlyIC0gQUMgcHJlZGljdGlvbiBkaXJlY3Rpb24sIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHRoZSB6aWd6YWcgCi0gKiAgICAgICAgICAgIHNjYW4gcGF0dGVybjsgdGFrZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiAKLSAqICAgICAgICAgICAgLSAgT01YX1ZDX05PTkUgLSBBQyBwcmVkaWN0aW9uIG5vdCB1c2VkLiAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgY2xhc3NpY2FsIHppZ3phZyBzY2FuLiAKLSAqICAgICAgICAgICAgLSAgT01YX1ZDX0hPUklaT05UQUwgLSBIb3Jpem9udGFsIHByZWRpY3Rpb24uICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtdmVydGljYWwgemlnemFnIHNjYW4uIAotICogICAgICAgICAgICAtICBPTVhfVkNfVkVSVElDQUwgLSBWZXJ0aWNhbCBwcmVkaWN0aW9uLiAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLWhvcml6b250YWwgemlnemFnIHNjYW4uIAotICogICBwYXR0ZXJuIC0gYmxvY2sgcGF0dGVybiB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyIHRoaXMgYmxvY2sgaXMgCi0gKiAgICAgICAgICAgIGVuY29kZWQgCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAotICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQsIHNvIAotICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4gCi0gKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKLSAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0uIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBCYWQgYXJndW1lbnRzOgotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgCi0gKiAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwUURjdEJsa0NvZWYuIAotICogICAgLSAgICpwQml0T2Zmc2V0IDwgMCwgb3IgKnBCaXRPZmZzZXQgPjcuIAotICogICAgLSAgICBQcmVkRGlyIGlzIG5vdCBvbmUgb2Y6IE9NWF9WQ19OT05FLCBPTVhfVkNfSE9SSVpPTlRBTCwgb3IgCi0gKiAgICAgICAgIE9NWF9WQ19WRVJUSUNBTC4gCi0gKiAgICAtICAgIFZpZGVvQ29tcCBpcyBub3Qgb25lIGNvbXBvbmVudCBvZiBlbnVtIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50LiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhQUNWTEMgKAotICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCi0gICAgY29uc3QgT01YX1MxNiAqcFFEY3RCbGtDb2VmLAotICAgIE9NWF9VOCBwcmVkRGlyLAotICAgIE9NWF9VOCBwYXR0ZXJuLAotICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyICAgKDYuMi40LjUuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcgc2Nhbm5pbmcgYW5kIFZMQyBlbmNvZGluZyBmb3Igb25lIGludGVyIGJsb2NrLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IAotICogICAgICAgICAgICBzdHJlYW0gCi0gKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAKLSAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3IAotICogICBwUURjdEJsa0NvZWYgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50IAotICogICBwYXR0ZXJuIC0gYmxvY2sgcGF0dGVybiB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyIHRoaXMgYmxvY2sgaXMgCi0gKiAgICAgICAgICAgIGVuY29kZWQgCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAotICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQgc28gdGhhdCAKLSAqICAgICAgICAgICAgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyLiAKLSAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAotICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIEJhZCBhcmd1bWVudHMgCi0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgcG9pbnRlcnM6IGlzIE5VTEw6IHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIAotICogICAgICAgICAgICAgIHBCaXRPZmZzZXQsIHBRRGN0QmxrQ29lZiAKLSAqICAgIC0gICAqcEJpdE9mZnNldCA8IDAsIG9yICpwQml0T2Zmc2V0ID43LiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyICgKLSAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgIGNvbnN0IE9NWF9TMTYgKnBRRGN0QmxrQ29lZiwKLSAgICBPTVhfVTggcGF0dGVybiwKLSAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0VuY29kZU1WICAgKDYuMi40LjUuNCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFByZWRpY3RzIGEgbW90aW9uIHZlY3RvciBmb3IgdGhlIGN1cnJlbnQgbWFjcm9ibG9jaywgZW5jb2RlcyB0aGUgCi0gKiBkaWZmZXJlbmNlLCBhbmQgd3JpdGVzIHRoZSBvdXRwdXQgdG8gdGhlIHN0cmVhbSBidWZmZXIuIFRoZSBpbnB1dCBNVnMgCi0gKiBwTVZDdXJNQiwgcFNyY01WTGVmdE1CLCBwU3JjTVZVcHBlck1CLCBhbmQgcFNyY01WVXBwZXJSaWdodE1CIHNob3VsZCBsaWUgCi0gKiB3aXRoaW4gdGhlIHJhbmdlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGlucHV0IHBhcmFtZXRlciBmY29kZUZvcndhcmQsIGFzIAotICogZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi4zLiAgVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhIAotICogc3VwZXJzZXQgb2YgdGhlIGZ1bmN0aW9uYWxpdHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBmdW5jdGlvbiAKLSAqIG9teFZDTTRQMl9GaW5kTVZwcmVkLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIGRvdWJsZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdHN0cmVhbSBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSBpbmRleCBvZiB0aGUgZmlyc3QgZnJlZSAobmV4dCBhdmFpbGFibGUpIGJpdCBpbiB0aGUgc3RyZWFtIAotICogICAgICAgICAgICBidWZmZXIgcmVmZXJlbmNlZCBieSAqcHBCaXRTdHJlYW0sIHZhbGlkIGluIHRoZSByYW5nZSAwIHRvIDcuIAotICogICBwTVZDdXJNQiAtIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBtb3Rpb24gdmVjdG9yOyBhIHZhbHVlIG9mIAotICogICAgICAgICAgICBOVUxMIGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gCi0gKiAgIHBTcmNNVkxlZnRNQiAtIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBsZWZ0IG1hY3JvYmxvY2sgbW90aW9uIHZlY3RvcjsgYSAKLSAqICAgICAgICAgICAgdmFsdWUgb2YgIE5VTExpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuIAotICogICBwU3JjTVZVcHBlck1CIC0gcG9pbnRlciB0byBzb3VyY2UgdXBwZXIgbWFjcm9ibG9jayBtb3Rpb24gdmVjdG9yOyBhIAotICogICAgICAgICAgICB2YWx1ZSBvZiBOVUxMIGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gCi0gKiAgIHBTcmNNVlVwcGVyUmlnaHRNQiAtIHBvaW50ZXIgdG8gc291cmNlIHVwcGVyIHJpZ2h0IE1CIG1vdGlvbiB2ZWN0b3I7IGEgCi0gKiAgICAgICAgICAgIHZhbHVlIG9mIE5VTEwgaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAKLSAqICAgZmNvZGVGb3J3YXJkIC0gYW4gaW50ZWdlciB3aXRoIHZhbHVlcyBmcm9tIDEgdG8gNzsgdXNlZCBpbiBlbmNvZGluZyAKLSAqICAgICAgICAgICAgbW90aW9uIHZlY3RvcnMgcmVsYXRlZCB0byBzZWFyY2ggcmFuZ2UsIGFzIGRlc2NyaWJlZCBpbiAKLSAqICAgICAgICAgICAgW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjMuIAotICogICBNQlR5cGUgLSBtYWNybyBibG9jayB0eXBlLCB2YWxpZCBpbiB0aGUgcmFuZ2UgMCB0byA1IAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIHVwZGF0ZWQgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIAotICogICAgICAgICAgICBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSB1cGRhdGVkIGluZGV4IG9mIHRoZSBuZXh0IGF2YWlsYWJsZSBiaXQgcG9zaXRpb24gaW4gc3RyZWFtIAotICogICAgICAgICAgICBidWZmZXIgcmVmZXJlbmNlZCBieSAqcHBCaXRTdHJlYW0gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMgCi0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAKLSAqICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBNVkN1ck1CIAotICogICAgLSAgICAqcEJpdE9mZnNldCA8IDAsIG9yICpwQml0T2Zmc2V0ID43LiAKLSAqICAgIC0gICAgZmNvZGVGb3J3YXJkIDw9IDAsIG9yIGZjb2RlRm9yd2FyZCA+IDcsIG9yIE1CVHlwZSA8IDAuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9FbmNvZGVNViAoCi0gICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcE1WQ3VyTUIsCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IqcFNyY01WTGVmdE1CLAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjTVZVcHBlck1CLAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjTVZVcHBlclJpZ2h0TUIsCi0gICAgT01YX0lOVCBmY29kZUZvcndhcmQsCi0gICAgT01YVkNNNFAyTWFjcm9ibG9ja1R5cGUgTUJUeXBlCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QICAgKDYuMi41LjEuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIERlY29kZXMgYW5kIHBhZHMgdGhlIGZvdXIgbW90aW9uIHZlY3RvcnMgYXNzb2NpYXRlZCB3aXRoIGEgbm9uLWludHJhIFAtVk9QIAotICogbWFjcm9ibG9jay4gIEZvciBtYWNyb2Jsb2NrcyBvZiB0eXBlIE9NWF9WQ19JTlRFUjRWLCB0aGUgb3V0cHV0IE1WIGlzIAotICogcGFkZGVkIGFzIHNwZWNpZmllZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuMS42LiBPdGhlcndpc2UsIGZvciAKLSAqIG1hY3JvYmxvY2tzIG9mIHR5cGVzIG90aGVyIHRoYW4gT01YX1ZDX0lOVEVSNFYsIHRoZSBkZWNvZGVkIE1WIGlzIGNvcGllZCB0byAKLSAqIGFsbCBmb3VyIG91dHB1dCBNViBidWZmZXIgZW50cmllcy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCAKLSAqICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIHRvIGJ5IAotICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbiBbMC03XS4gCi0gKiAgIHBTcmNNVkxlZnRNQiwgcFNyY01WVXBwZXJNQiwgYW5kIHBTcmNNVlVwcGVyUmlnaHRNQiAtIHBvaW50ZXJzIHRvIHRoZSAKLSAqICAgICAgICAgICAgbW90aW9uIHZlY3RvciBidWZmZXJzIG9mIHRoZSBtYWNyb2Jsb2NrcyBzcGVjaWFsbHkgYXQgdGhlIGxlZnQsIAotICogICAgICAgICAgICB1cHBlciwgYW5kIHVwcGVyLXJpZ2h0IHNpZGUgb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jaywgCi0gKiAgICAgICAgICAgIHJlc3BlY3RpdmVseTsgYSB2YWx1ZSBvZiBOVUxMIGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gIE5vdGU6IAotICogICAgICAgICAgICBBbnkgbmVpZ2hib3Job29kIG1hY3JvYmxvY2sgb3V0c2lkZSB0aGUgY3VycmVudCBWT1Agb3IgdmlkZW8gCi0gKiAgICAgICAgICAgIHBhY2tldCBvciBvdXRzaWRlIHRoZSBjdXJyZW50IEdPQiAod2hlbiBzaG9ydF92aWRlb19oZWFkZXIgaXMgCi0gKiAgICAgICAgICAgICAxICkgZm9yIHdoaWNoIGdvYl9oZWFkZXJfZW1wdHkgaXMgIDAgIGlzIHRyZWF0ZWQgYXMgCi0gKiAgICAgICAgICAgIHRyYW5zcGFyZW50LCBhY2NvcmRpbmcgdG8gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjUuIAotICogICBmY29kZUZvcndhcmQgLSBhIGNvZGUgZXF1YWwgdG8gdm9wX2Zjb2RlX2ZvcndhcmQgaW4gTVBFRy00IGJpdCBzdHJlYW0gCi0gKiAgICAgICAgICAgIHN5bnRheCAKLSAqICAgTUJUeXBlIC0gdGhlIHR5cGUgb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jay4gSWYgTUJUeXBlIGlzIG5vdCBlcXVhbCB0byAKLSAqICAgICAgICAgICAgT01YX1ZDX0lOVEVSNFYsIHRoZSBkZXN0aW5hdGlvbiBtb3Rpb24gdmVjdG9yIGJ1ZmZlciBpcyBzdGlsbCAKLSAqICAgICAgICAgICAgZmlsbGVkIHdpdGggdGhlIHNhbWUgZGVjb2RlZCB2ZWN0b3IuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkLCBzbyAKLSAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKLSAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gCi0gKiAgIHBEc3RNVkN1ck1CIC0gcG9pbnRlciB0byB0aGUgbW90aW9uIHZlY3RvciBidWZmZXIgZm9yIHRoZSBjdXJyZW50IAotICogICAgICAgICAgICBtYWNyb2Jsb2NrOyBjb250YWlucyBmb3VyIGRlY29kZWQgbW90aW9uIHZlY3RvcnMgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6Ci0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0TVZDdXJNQiAKLSAqICAgIC0gICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XQotICogICAgLSAgICBmY29kZUZvcndhcmQgZXhjZWVkcyAoMCw3XQotICogICAgLSAgICBNQlR5cGUgbGVzcyB0aGFuIHplcm8KLSAqICAgIC0gICAgbW90aW9uIHZlY3RvciBidWZmZXIgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QICgKLSAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjTVZMZWZ0TUIsCi0gICAgT01YVkNNb3Rpb25WZWN0b3IqcFNyY01WVXBwZXJNQiwKLSAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY01WVXBwZXJSaWdodE1CLAotICAgIE9NWFZDTW90aW9uVmVjdG9yKnBEc3RNVkN1ck1CLAotICAgIE9NWF9JTlQgZmNvZGVGb3J3YXJkLAotICAgIE9NWFZDTTRQMk1hY3JvYmxvY2tUeXBlIE1CVHlwZQotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMgICAoNi4yLjUuMi4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIG9mIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgCi0gKiBmb3Igb25lIGludHJhIGJsb2NrLiAgVHdvIHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbiAoRENWTEMgYW5kIEFDVkxDKSBhcmUgCi0gKiBwcm92aWRlZCBpbiBvcmRlciB0byBzdXBwb3J0IHRoZSB0d28gZGlmZmVyZW50IG1ldGhvZHMgb2YgcHJvY2Vzc2luZyBEQyAKLSAqIGNvZWZmaWNpZW50cywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4xLjQsICBJbnRyYSBEQyAKLSAqIENvZWZmaWNpZW50IERlY29kaW5nIGZvciB0aGUgQ2FzZSBvZiBTd2l0Y2hlZCBWTEMgRW5jb2RpbmcuICAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgCi0gKiAgICAgICAgICAgIGJpdHN0cmVhbSBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGN1cnJlbnQgYnl0ZSByZWZlcmVuY2VkIAotICogICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uICBUaGUgcGFyYW1ldGVyICpwQml0T2Zmc2V0IGlzIHZhbGlkIGluIHRoZSAKLSAqICAgICAgICAgICAgcmFuZ2UgWzAtN10uIAotICogICAgICAgICAgICBCaXQgUG9zaXRpb24gaW4gb25lIGJ5dGU6ICB8TW9zdCAgICAgIExlYXN0fCAKLSAqICAgICAgICAgICAgICAgICAgICAqcEJpdE9mZnNldCAgICAgICAgfDAgMSAyIDMgNCA1IDYgN3wgCi0gKiAgIHByZWREaXIgLSBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbjsgdXNlZCB0byBzZWxlY3QgdGhlIHppZ3phZyBzY2FuIAotICogICAgICAgICAgICBwYXR0ZXJuOyB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IAotICogICAgICAgICAgICAtICBPTVhfVkNfTk9ORSAtIEFDIHByZWRpY3Rpb24gbm90IHVzZWQ7IAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcgc2Nhbi4gCi0gKiAgICAgICAgICAgIC0gIE9NWF9WQ19IT1JJWk9OVEFMIC0gSG9yaXpvbnRhbCBwcmVkaWN0aW9uOyAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtcyBhbHRlcm5hdGUtdmVydGljYWwgemlnemFnIHNjYW47IAotICogICAgICAgICAgICAtICBPTVhfVkNfVkVSVElDQUwgLSBWZXJ0aWNhbCBwcmVkaWN0aW9uOyAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtcyBhbHRlcm5hdGUtaG9yaXpvbnRhbCB6aWd6YWcgc2Nhbi4gCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAotICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCi0gKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2Ugb3IgY2hyb21pbmFuY2UpIG9mIHRoZSAKLSAqICAgICAgICAgICAgY3VycmVudCBibG9jayAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCBzdWNoIAotICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc3VjaCB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCAKLSAqICAgICAgICAgICAgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgCi0gKiAgICAgICAgICAgIDQtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cywgaWY6Ci0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0Ci0gKiAgICAtICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10KLSAqICAgIC0gICAgcHJlRGlyIGV4Y2VlZHMgWzAsMl0KLSAqICAgIC0gICAgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQgCi0gKiAgICBPTVhfU3RzX0VyciAtIGlmOgotICogICAgLSAgICBJbiBEZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQywgZGNfc2l6ZSA+IDEyIAotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgbWFyayBiaXRzIGVxdWFscyB6ZXJvIAotICogICAgLSAgICBJbGxlZ2FsIHN0cmVhbSBlbmNvdW50ZXJlZDsgY29kZSBjYW5ub3QgYmUgbG9jYXRlZCBpbiBWTEMgdGFibGUgCi0gKiAgICAtICAgIEZvcmJpZGRlbiBjb2RlIGVuY291bnRlcmVkIGluIHRoZSBWTEMgRkxDIHRhYmxlLiAKLSAqICAgIC0gICAgVGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgaXMgZ3JlYXRlciB0aGFuIDY0IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyAoCi0gICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICBPTVhfUzE2ICpwRHN0LAotICAgIE9NWF9VOCBwcmVkRGlyLAotICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKLSAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCB2aWRlb0NvbXAKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDICAgKDYuMi41LjIuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBvZiBBQyBhbmQgREMgY29lZmZpY2llbnRzIAotICogZm9yIG9uZSBpbnRyYSBibG9jay4gIFR3byB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb24gKERDVkxDIGFuZCBBQ1ZMQykgYXJlIAotICogcHJvdmlkZWQgaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGUgdHdvIGRpZmZlcmVudCBtZXRob2RzIG9mIHByb2Nlc3NpbmcgREMgCi0gKiBjb2VmZmljaWVudHMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjQuMS40LCAgSW50cmEgREMgCi0gKiBDb2VmZmljaWVudCBEZWNvZGluZyBmb3IgdGhlIENhc2Ugb2YgU3dpdGNoZWQgVkxDIEVuY29kaW5nLiAgCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIAotICogICAgICAgICAgICBiaXRzdHJlYW0gYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBjdXJyZW50IGJ5dGUgcmVmZXJlbmNlZCAKLSAqICAgICAgICAgICAgYnkgKnBwQml0U3RyZWFtLiAgVGhlIHBhcmFtZXRlciAqcEJpdE9mZnNldCBpcyB2YWxpZCBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJhbmdlIFswLTddLiBCaXQgUG9zaXRpb24gaW4gb25lIGJ5dGU6ICB8TW9zdCBMZWFzdHwgKnBCaXRPZmZzZXQgCi0gKiAgICAgICAgICAgIHwwIDEgMiAzIDQgNSA2IDd8IAotICogICBwcmVkRGlyIC0gQUMgcHJlZGljdGlvbiBkaXJlY3Rpb247IHVzZWQgdG8gc2VsZWN0IHRoZSB6aWd6YWcgc2NhbiAKLSAqICAgICAgICAgICAgcGF0dGVybjsgdGFrZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiBPTVhfVkNfTk9ORSAtIEFDIAotICogICAgICAgICAgICBwcmVkaWN0aW9uIG5vdCB1c2VkOyBwZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnIHNjYW4uIAotICogICAgICAgICAgICBPTVhfVkNfSE9SSVpPTlRBTCAtIEhvcml6b250YWwgcHJlZGljdGlvbjsgcGVyZm9ybXMgCi0gKiAgICAgICAgICAgIGFsdGVybmF0ZS12ZXJ0aWNhbCB6aWd6YWcgc2NhbjsgT01YX1ZDX1ZFUlRJQ0FMIC0gVmVydGljYWwgCi0gKiAgICAgICAgICAgIHByZWRpY3Rpb247IHBlcmZvcm1zIGFsdGVybmF0ZS1ob3Jpem9udGFsIHppZ3phZyBzY2FuLiAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCi0gKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKLSAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSBvciBjaHJvbWluYW5jZSkgb2YgdGhlIAotICogICAgICAgICAgICBjdXJyZW50IGJsb2NrIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkIHN1Y2ggCi0gKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzdWNoIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IAotICogICAgICAgICAgICBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudCBibG9jazsgbXVzdCBiZSAKLSAqICAgICAgICAgICAgNC1ieXRlIGFsaWduZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBEc3QsIAotICogICAgICAgICAgICAgIG9yIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAgICAgICAgICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XSwgcHJlRGlyIGV4Y2VlZHMgWzAsMl0sIG9yIHBEc3QgaXMgCi0gKiAgICAgICAgICAgICAgbm90IDQtYnl0ZSBhbGlnbmVkIAotICogICAgT01YX1N0c19FcnIgSW4gRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMsIGRjX3NpemUgPiAxMiBBdCBsZWFzdCBvbmUgb2YgCi0gKiAgICAgICAgICAgICAgbWFyayBiaXRzIGVxdWFscyB6ZXJvIElsbGVnYWwgc3RyZWFtIGVuY291bnRlcmVkOyBjb2RlIGNhbm5vdCAKLSAqICAgICAgICAgICAgICBiZSBsb2NhdGVkIGluIFZMQyB0YWJsZSBGb3JiaWRkZW4gY29kZSBlbmNvdW50ZXJlZCBpbiB0aGUgVkxDIAotICogICAgICAgICAgICAgIEZMQyB0YWJsZSBUaGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBpcyBncmVhdGVyIHRoYW4gNjQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDICgKLSAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgIE9NWF9TMTYgKnBEc3QsCi0gICAgT01YX1U4IHByZWREaXIsCi0gICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIgICAoNi4yLjUuMi4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIGZvciBvbmUgaW50ZXItY29kZWQgYmxvY2suIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gZG91YmxlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgc3RyZWFtIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIG5leHQgYXZhaWxhYmxlIGJpdCBpbiB0aGUgY3VycmVudCBzdHJlYW0gCi0gKiAgICAgICAgICAgIGJ5dGUgcmVmZXJlbmNlZCBieSAqcHBCaXRTdHJlYW0uIFRoZSBwYXJhbWV0ZXIgKnBCaXRPZmZzZXQgaXMgCi0gKiAgICAgICAgICAgIHZhbGlkIHdpdGhpbiB0aGUgcmFuZ2UgWzAtN10uIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKLSAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkIHN1Y2ggCi0gKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIHN0cmVhbSBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGRlY29kaW5nIHN1Y2ggdGhhdCBpdCBwb2ludHMgCi0gKiAgICAgICAgICAgIHRvIHRoZSBuZXh0IGF2YWlsYWJsZSBiaXQgaW4gdGhlIHN0cmVhbSBieXRlIHJlZmVyZW5jZWQgYnkgCi0gKiAgICAgICAgICAgICpwcEJpdFN0cmVhbSAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIAotICogICAgICAgICAgICA0LWJ5dGUgYWxpZ25lZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6Ci0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0Ci0gKiAgICAtICAgIHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkCi0gKiAgICAtICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XQotICogICAgT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IsIGlmOgotICogICAgLSAgICBBdCBsZWFzdCBvbmUgbWFyayBiaXQgaXMgZXF1YWwgdG8gemVybyAKLSAqICAgIC0gICAgRW5jb3VudGVyZWQgYW4gaWxsZWdhbCBzdHJlYW0gY29kZSB0aGF0IGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgVkxDIHRhYmxlIAotICogICAgLSAgICBFbmNvdW50ZXJlZCBhbiBpbGxlZ2FsIGNvZGUgaW4gdGhlIFZMQyBGTEMgdGFibGUgCi0gKiAgICAtICAgIFRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGlzIGdyZWF0ZXIgdGhhbiA2NCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyICgKLSAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgIE9NWF9TMTYgKnBEc3QsCi0gICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9RdWFudEludkludHJhX0kgICAoNi4yLjUuMy4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgdGhlIHNlY29uZCBpbnZlcnNlIHF1YW50aXphdGlvbiBtb2RlIG9uIGFuIGludHJhL2ludGVyIGNvZGVkIAotICogYmxvY2suIFN1cHBvcnRzIGJpdHNfcGVyX3BpeGVsID0gOC4gVGhlIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIGNsaXBwZWQgdG8gCi0gKiB0aGUgcmFuZ2UgWy0yMDQ4LCAyMDQ3XS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IChxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrOyBtdXN0IGJlIAotICogICAgICAgICAgICBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpemVyX3NjYWxlKSAKLSAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgb2YgdGhlIGN1cnJlbnQgYmxvY2suIFRha2VzIG9uZSBvZiB0aGUgCi0gKiAgICAgICAgICAgIGZvbGxvd2luZyBmbGFnczogT01YX1ZDX0xVTUlOQU5DRSwgT01YX1ZDX0NIUk9NSU5BTkNFIChpbnRyYSAKLSAqICAgICAgICAgICAgdmVyc2lvbiBvbmx5KS4gCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlciAKLSAqICAgICAgICAgICAgKGludHJhIHZlcnNpb24gb25seSkuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgb3V0cHV0IChkZXF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2sgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgaXMgCi0gKiAgICAgICAgICAgICAgdHJ1ZTogCi0gKiAgICAtICAgIHBTcmNEc3QgaXMgTlVMTCAKLSAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PTMxIAotICogICAgLSAgICB2aWRlb0NvbXAgaXMgbmVpdGhlciBPTVhfVkNfTFVNSU5BTkNFIG5vciBPTVhfVkNfQ0hST01JTkFOQ0UuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9RdWFudEludkludHJhX0kgKAotICAgIE9NWF9TMTYgKnBTcmNEc3QsCi0gICAgT01YX0lOVCBRUCwKLSAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCB2aWRlb0NvbXAsCi0gICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9RdWFudEludkludGVyX0kgICAoNi4yLjUuMy4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgdGhlIHNlY29uZCBpbnZlcnNlIHF1YW50aXphdGlvbiBtb2RlIG9uIGFuIGludHJhL2ludGVyIGNvZGVkIAotICogYmxvY2suIFN1cHBvcnRzIGJpdHNfcGVyX3BpeGVsID0gOC4gVGhlIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIGNsaXBwZWQgdG8gCi0gKiB0aGUgcmFuZ2UgWy0yMDQ4LCAyMDQ3XS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IChxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrOyBtdXN0IGJlIAotICogICAgICAgICAgICBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpemVyX3NjYWxlKSAKLSAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgb2YgdGhlIGN1cnJlbnQgYmxvY2suIFRha2VzIG9uZSBvZiB0aGUgCi0gKiAgICAgICAgICAgIGZvbGxvd2luZyBmbGFnczogT01YX1ZDX0xVTUlOQU5DRSwgT01YX1ZDX0NIUk9NSU5BTkNFIChpbnRyYSAKLSAqICAgICAgICAgICAgdmVyc2lvbiBvbmx5KS4gCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlciAKLSAqICAgICAgICAgICAgKGludHJhIHZlcnNpb24gb25seSkuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgb3V0cHV0IChkZXF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2sgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgaXMgCi0gKiAgICAgICAgICAgICAgdHJ1ZTogCi0gKiAgICAtICAgIHBTcmNEc3QgaXMgTlVMTCAKLSAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PTMxIAotICogICAgLSAgICB2aWRlb0NvbXAgaXMgbmVpdGhlciBPTVhfVkNfTFVNSU5BTkNFIG5vciBPTVhfVkNfQ0hST01JTkFOQ0UuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9RdWFudEludkludGVyX0kgKAotICAgIE9NWF9TMTYgKnBTcmNEc3QsCi0gICAgT01YX0lOVCBRUAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhICAgKDYuMi41LjQuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIERlY29kZXMgdGhlIElOVFJBIGJsb2NrIGNvZWZmaWNpZW50cy4gSW52ZXJzZSBxdWFudGl6YXRpb24sIGludmVyc2VseSAKLSAqIHppZ3phZyBwb3NpdGlvbmluZywgYW5kIElEQ1QsIHdpdGggYXBwcm9wcmlhdGUgY2xpcHBpbmcgb24gZWFjaCBzdGVwLCBhcmUgCi0gKiBwZXJmb3JtZWQgb24gdGhlIGNvZWZmaWNpZW50cy4gVGhlIHJlc3VsdHMgYXJlIHRoZW4gcGxhY2VkIGluIHRoZSBvdXRwdXQgCi0gKiBmcmFtZS9wbGFuZSBvbiBhIHBpeGVsIGJhc2lzLiAgTm90ZTogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIHVzZWQgb25seSB3aGVuIAotICogYXQgbGVhc3Qgb25lIG5vbi16ZXJvIEFDIGNvZWZmaWNpZW50IG9mIGN1cnJlbnQgYmxvY2sgZXhpc3RzIGluIHRoZSBiaXQgCi0gKiBzdHJlYW0uIFRoZSBEQyBvbmx5IGNvbmRpdGlvbiB3aWxsIGJlIGhhbmRsZWQgaW4gYW5vdGhlciBmdW5jdGlvbi4gCi0gKgotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgCi0gKiAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuIFRoZXJlIGlzIG5vIGJvdW5kYXJ5IGNoZWNrIGZvciB0aGUgYml0IHN0cmVhbSAKLSAqICAgICAgICAgICAgYnVmZmVyLiAKLSAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIHRvIGJ5IAotICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbiBbMC03XS4gCi0gKiAgIHN0ZXAgLSB3aWR0aCBvZiB0aGUgZGVzdGluYXRpb24gcGxhbmUgCi0gKiAgIHBDb2VmQnVmUm93IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIAotICogICAgICAgICAgICBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICBwQ29lZkJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCAKLSAqICAgICAgICAgICAgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgY3VyUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBtYWNyb2Jsb2NrIHdoaWNoIHRoZSBjdXJyZW50IGJsb2NrIAotICogICAgICAgICAgICBiZWxvbmdzIHRvIAotICogICBwUVBCdWYgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGJ1ZmZlciAKLSAqICAgYmxvY2tJbmRleCAtIGJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZCBwb3NpdGlvbiBhcyAKLSAqICAgICAgICAgICAgZGVmaW5lZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA2LjEuMy44LCBGaWd1cmUgNi01LiAKLSAqICAgaW50cmFEQ1ZMQyAtIGEgY29kZSBkZXRlcm1pbmVkIGJ5IGludHJhX2RjX3ZsY190aHIgYW5kIFFQLiBUaGlzIGFsbG93cyBhIAotICogICAgICAgICAgICBtZWNoYW5pc20gdG8gc3dpdGNoIGJldHdlZW4gdHdvIFZMQyBmb3IgY29kaW5nIG9mIEludHJhIERDIAotICogICAgICAgICAgICBjb2VmZmljaWVudHMgYXMgcGVyIFtJU08xNDQ5Ni0yXSwgVGFibGUgNi0yMS4gCi0gKiAgIEFDUHJlZEZsYWcgLSBhIGZsYWcgZXF1YWwgdG8gYWNfcHJlZF9mbGFnIChvZiBsdW1pbmFuY2UpIGluZGljYXRpbmcgaWYgCi0gKiAgICAgICAgICAgIHRoZSBhYyBjb2VmZmljaWVudHMgb2YgdGhlIGZpcnN0IHJvdyBvciBmaXJzdCBjb2x1bW4gYXJlIAotICogICAgICAgICAgICBkaWZmZXJlbnRpYWxseSBjb2RlZCBmb3IgaW50cmEgY29kZWQgbWFjcm9ibG9jay4gCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAotICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgCi0gKiAgICAgICAgICAgIG1vZGUsIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCwgc28gCi0gKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCi0gKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgYmxvY2sgaW4gdGhlIGRlc3RpbmF0aW9uIHBsYW5lOyBtdXN0IGJlIGFsaWduZWQgb24gCi0gKiAgICAgICAgICAgIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBDb2VmQnVmUm93IC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyLiAKLSAqICAgcENvZWZCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIgIE5vdGU6IAotICogICAgICAgICAgICBUaGUgY29lZmZpY2llbnQgYnVmZmVycyBtdXN0IGJlIHVwZGF0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSAKLSAqICAgICAgICAgICAgdXBkYXRlIHByb2NlZHVyZSBkZWZpbmVkIGluIHNlY3Rpb24gNi4yLjIuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLCBpZjoKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBDb2VmQnVmUm93LCBwQ29lZkJ1ZkNvbCwgCi0gKiAgICAgICAgIHBRUEJ1ZiwgcERzdC4gCi0gKiAgICAtICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10gCi0gKiAgICAtICAgIGN1clFQIGV4Y2VlZHMgKDEsIDMxKQotICogICAgLSAgICBibG9ja0luZGV4IGV4Y2VlZHMgWzAsNV0KLSAqICAgIC0gICAgc3RlcCBpcyBub3QgdGhlIG11bHRpcGxlIG9mIDgKLSAqICAgIC0gICAgYSBwb2ludGVyIGFsaWdubWVudCByZXF1aXJlbWVudCB3YXMgdmlvbGF0ZWQuIAotICogICAgT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IuIFJlZmVyIHRvIE9NWF9TdHNfRXJyIG9mIERlY29kZVZMQ1ppZ3phZ19JbnRyYS4gIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEgKAotICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCi0gICAgT01YX1U4ICpwRHN0LAotICAgIE9NWF9JTlQgc3RlcCwKLSAgICBPTVhfUzE2ICpwQ29lZkJ1ZlJvdywKLSAgICBPTVhfUzE2ICpwQ29lZkJ1ZkNvbCwKLSAgICBPTVhfVTggY3VyUVAsCi0gICAgY29uc3QgT01YX1U4ICpwUVBCdWYsCi0gICAgT01YX0lOVCBibG9ja0luZGV4LAotICAgIE9NWF9JTlQgaW50cmFEQ1ZMQywKLSAgICBPTVhfSU5UIEFDUHJlZEZsYWcsCi0gICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIgICAoNi4yLjUuNC4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogRGVjb2RlcyB0aGUgSU5URVIgYmxvY2sgY29lZmZpY2llbnRzLiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludmVyc2UgCi0gKiBxdWFudGl6YXRpb24sIGludmVyc2UgemlnemFnIHBvc2l0aW9uaW5nLCBhbmQgSURDVCAod2l0aCBhcHByb3ByaWF0ZSAKLSAqIGNsaXBwaW5nIG9uIGVhY2ggc3RlcCkgb24gdGhlIGNvZWZmaWNpZW50cy4gVGhlIHJlc3VsdHMgKHJlc2lkdWFscykgYXJlIAotICogcGxhY2VkIGluIGEgY29udGlndW91cyBhcnJheSBvZiA2NCBlbGVtZW50cy4gRm9yIElOVEVSIGJsb2NrLCB0aGUgb3V0cHV0IAotICogYnVmZmVyIGhvbGRzIHRoZSByZXNpZHVhbHMgZm9yIGZ1cnRoZXIgcmVjb25zdHJ1Y3Rpb24uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgCi0gKiAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuIFRoZXJlIGlzIG5vIGJvdW5kYXJ5IGNoZWNrIGZvciB0aGUgYml0IHN0cmVhbSAKLSAqICAgICAgICAgICAgYnVmZmVyLiAKLSAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIHRvIGJ5IAotICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbiBbMC03XSAKLSAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKLSAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIAotICogICAgICAgICAgICBtb2RlLCBhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQsIHNvIAotICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAotICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlY29kZWQgcmVzaWR1YWwgYnVmZmVyIChhIGNvbnRpZ3VvdXMgYXJyYXkgb2YgNjQgCi0gKiAgICAgICAgICAgIGVsZW1lbnRzIG9mIE9NWF9TMTYgZGF0YSB0eXBlKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLCBpZjoKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTnVsbDogCi0gKiAgICAgICAgIHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQgLCBwRHN0IAotICogICAgLSAgICAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddCi0gKiAgICAtICAgIFFQIDw9IDAuIAotICogICAgLSAgICBwRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQgCi0gKiAgICBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvci4gUmVmZXIgdG8gT01YX1N0c19FcnIgb2YgRGVjb2RlVkxDWmlnemFnX0ludGVyIC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlciAoCi0gICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICBPTVhfUzE2ICpwRHN0LAotICAgIE9NWF9JTlQgUVAsCi0gICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEgICAoNi4yLjUuNC4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgYWRhcHRpdmUgREMvQUMgY29lZmZpY2llbnQgcHJlZGljdGlvbiBmb3IgYW4gaW50cmEgYmxvY2suICBQcmlvciAKLSAqIHRvIHRoZSBmdW5jdGlvbiBjYWxsLCBwcmVkaWN0aW9uIGRpcmVjdGlvbiAocHJlZERpcikgc2hvdWxkIGJlIHNlbGVjdGVkIGFzIAotICogc3BlY2lmaWVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4zLjEuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgd2hpY2ggY29udGFpbnMgdGhlIHF1YW50aXplZCAKLSAqICAgICAgICAgICAgY29lZmZpY2llbnQgcmVzaWR1YWxzIChQUUYpIG9mIHRoZSBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIAotICogICAgICAgICAgICBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgVGhlIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIAotICogICAgICAgICAgICBzYXR1cmF0ZWQgdG8gdGhlIHJhbmdlIFstMjA0OCwgMjA0N10uIAotICogICBwUHJlZEJ1ZlJvdyAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHJvdyBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCBvbiAKLSAqICAgICAgICAgICAgYSA0LWJ5dGUgYm91bmRhcnkuIAotICogICBwUHJlZEJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCAKLSAqICAgICAgICAgICAgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAotICogICBjdXJRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIGN1cnJlbnQgYmxvY2suIGN1clFQIG1heSBlcXVhbCB0byAKLSAqICAgICAgICAgICAgcHJlZFFQIGVzcGVjaWFsbHkgd2hlbiB0aGUgY3VycmVudCBibG9jayBhbmQgdGhlIHByZWRpY3RvciBibG9jayAKLSAqICAgICAgICAgICAgYXJlIGluIHRoZSBzYW1lIG1hY3JvYmxvY2suIAotICogICBwcmVkUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBwcmVkaWN0b3IgYmxvY2sgCi0gKiAgIHByZWREaXIgLSBpbmRpY2F0ZXMgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uIHdoaWNoIHRha2VzIG9uZSBvZiB0aGUgCi0gKiAgICAgICAgICAgIGZvbGxvd2luZyB2YWx1ZXM6IE9NWF9WQ19IT1JJWk9OVEFMIC0gcHJlZGljdCBob3Jpem9udGFsbHkgCi0gKiAgICAgICAgICAgIE9NWF9WQ19WRVJUSUNBTCAtIHByZWRpY3QgdmVydGljYWxseSAKLSAqICAgQUNQcmVkRmxhZyAtIGEgZmxhZyBpbmRpY2F0aW5nIGlmIEFDIHByZWRpY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZC4gSXQgCi0gKiAgICAgICAgICAgIGlzIGVxdWFsIHRvIGFjX3ByZWRfZmxhZyBpbiB0aGUgYml0IHN0cmVhbSBzeW50YXggb2YgTVBFRy00IAotICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlIG9yIGNocm9taW5hbmNlKSBvZiB0aGUgCi0gKiAgICAgICAgICAgIGN1cnJlbnQgYmxvY2sgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgd2hpY2ggY29udGFpbnMgdGhlIHF1YW50aXplZCAKLSAqICAgICAgICAgICAgY29lZmZpY2llbnRzIChRRikgb2YgdGhlIGN1cnJlbnQgYmxvY2sgCi0gKiAgIHBQcmVkQnVmUm93IC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyIAotICogICBwUHJlZEJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlciAgTm90ZTogCi0gKiAgICAgICAgICAgIEJ1ZmZlciB1cGRhdGU6IFVwZGF0ZSB0aGUgQUMgcHJlZGljdGlvbiBidWZmZXIgKGJvdGggcm93IGFuZCAKLSAqICAgICAgICAgICAgY29sdW1uIGJ1ZmZlcikuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLCBpZjoKLSAqICAgICAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgICAgICAgcFNyY0RzdCwgcFByZWRCdWZSb3csIG9yIHBQcmVkQnVmQ29sLiAKLSAqICAgICAgICAtICAgIGN1clFQIDw9IDAsIAotICogICAgICAgIC0gICAgcHJlZFFQIDw9IDAsIAotICogICAgICAgIC0gICAgY3VyUVAgPjMxLCAKLSAqICAgICAgICAtICAgIHByZWRRUCA+IDMxLCAKLSAqICAgICAgICAtICAgIHByZURpciBleGNlZWRzIFsxLDJdCi0gKiAgICAgICAgLSAgICBwU3JjRHN0LCBwUHJlZEJ1ZlJvdywgb3IgcFByZWRCdWZDb2wgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhICgKLSAgICBPTVhfUzE2ICpwU3JjRHN0LAotICAgIE9NWF9TMTYgKnBQcmVkQnVmUm93LAotICAgIE9NWF9TMTYgKnBQcmVkQnVmQ29sLAotICAgIE9NWF9JTlQgY3VyUVAsCi0gICAgT01YX0lOVCBwcmVkUVAsCi0gICAgT01YX0lOVCBwcmVkRGlyLAotICAgIE9NWF9JTlQgQUNQcmVkRmxhZywKLSAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCB2aWRlb0NvbXAKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX01DUmVjb25CbG9jayAgICg2LjIuNS41LjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBtb3Rpb24gY29tcGVuc2F0aW9uIHByZWRpY3Rpb24gZm9yIGFuIDh4OCBibG9jayB1c2luZyAKLSAqIGludGVycG9sYXRpb24gZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi4yLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgYmxvY2sgaW4gdGhlIHJlZmVyZW5jZSBwbGFuZS4gCi0gKiAgIHNyY1N0ZXAgLSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydCBvZiBjb25zZWN1dGl2ZSBsaW5lcyBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJlZmVyZW5jZSBwbGFuZSwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgZHN0U3RlcCAtIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZSAKLSAqICAgICAgICAgICAgZGVzdGluYXRpb24gcGxhbmUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIHBTcmNSZXNpZHVlIC0gcG9pbnRlciB0byBhIGJ1ZmZlciBjb250YWluaW5nIHRoZSAxNi1iaXQgcHJlZGljdGlvbiAKLSAqICAgICAgICAgICAgcmVzaWR1YWxzOyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gSWYgdGhlIHBvaW50ZXIgaXMgTlVMTCwgdGhlbiAKLSAqICAgICAgICAgICAgbm8gcHJlZGljdGlvbiBpcyBkb25lLCBvbmx5IG1vdGlvbiBjb21wZW5zYXRpb24sIGkuZS4sIHRoZSBibG9jayAKLSAqICAgICAgICAgICAgaXMgbW92ZWQgd2l0aCBpbnRlcnBvbGF0aW9uLiAKLSAqICAgcHJlZGljdFR5cGUgLSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIHR5cGUsIGFzIGRlZmluZWQgaW4gc2VjdGlvbiAKLSAqICAgICAgICAgICAgNi4yLjEuMi4gCi0gKiAgIHJuZFZhbCAtIHJvdW5kaW5nIGNvbnRyb2wgcGFyYW1ldGVyOiAwIC0gZGlzYWJsZWQ7IDEgLSBlbmFibGVkLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4gIElmIAotICogICAgICAgICAgICBwcmVkaWN0aW9uIHJlc2lkdWFscyBhcmUgYWRkZWQgdGhlbiBvdXRwdXQgaW50ZW5zaXRpZXMgYXJlIAotICogICAgICAgICAgICBjbGlwcGVkIHRvIHRoZSByYW5nZSBbMCwyNTVdLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCi0gKiAgICAtICAgIHBEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgcFNyY1Jlc2lkdWUgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYyBvciBwRHN0LiAKLSAqICAgIC0gICAgZWl0aGVyIHNyY1N0ZXAgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgIC0gICAgaW52YWxpZCB0eXBlIHNwZWNpZmllZCBmb3IgdGhlIHBhcmFtZXRlciBwcmVkaWN0VHlwZS4gCi0gKiAgICAtICAgIHRoZSBwYXJhbWV0ZXIgcm5kVmFsIGlzIG5vdCBlcXVhbCBlaXRoZXIgdG8gMCBvciAxLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfTUNSZWNvbkJsb2NrICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmMsCi0gICAgT01YX0lOVCBzcmNTdGVwLAotICAgIGNvbnN0IE9NWF9TMTYgKnBTcmNSZXNpZHVlLAotICAgIE9NWF9VOCAqcERzdCwKLSAgICBPTVhfSU5UIGRzdFN0ZXAsCi0gICAgT01YX0lOVCBwcmVkaWN0VHlwZSwKLSAgICBPTVhfSU5UIHJuZFZhbAotKTsKLQotCi0KLS8qIDYuMy4xLjEgSW50cmEgMTZ4MTYgUHJlZGljdGlvbiBNb2RlcyAgKi8KLS8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBpbnRyYV8xNngxNiBtYWNyb2Jsb2NrIHByZWRpY3Rpb24gbW9kZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgICBPTVhfVkNfMTZYMTZfVkVSVCA9IDAsICAvKiogSW50cmFfMTZ4MTZfVmVydGljYWwgKi8KLSAgICBPTVhfVkNfMTZYMTZfSE9SID0gMSwgICAvKiogSW50cmFfMTZ4MTZfSG9yaXpvbnRhbCAqLwotICAgIE9NWF9WQ18xNlgxNl9EQyA9IDIsICAgIC8qKiBJbnRyYV8xNngxNl9EQyAqLwotICAgIE9NWF9WQ18xNlgxNl9QTEFORSA9IDMgIC8qKiBJbnRyYV8xNngxNl9QbGFuZSAqLyAKLX0gT01YVkNNNFAxMEludHJhMTZ4MTZQcmVkTW9kZTsKLQotCi0KLS8qIDYuMy4xLjIgSW50cmEgNHg0IFByZWRpY3Rpb24gTW9kZXMgICovCi0vKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgaW50cmFfNHg0IG1hY3JvYmxvY2sgcHJlZGljdGlvbiBtb2RlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLwotCi10eXBlZGVmIGVudW0gewotICAgIE9NWF9WQ180WDRfVkVSVCA9IDAsICAgICAvKiogSW50cmFfNHg0X1ZlcnRpY2FsICovCi0gICAgT01YX1ZDXzRYNF9IT1IgPSAxLCAgICAgIC8qKiBJbnRyYV80eDRfSG9yaXpvbnRhbCAqLwotICAgIE9NWF9WQ180WDRfREMgPSAyLCAgICAgICAvKiogSW50cmFfNHg0X0RDICovCi0gICAgT01YX1ZDXzRYNF9ESUFHX0RMID0gMywgIC8qKiBJbnRyYV80eDRfRGlhZ29uYWxfRG93bl9MZWZ0ICovCi0gICAgT01YX1ZDXzRYNF9ESUFHX0RSID0gNCwgIC8qKiBJbnRyYV80eDRfRGlhZ29uYWxfRG93bl9SaWdodCAqLwotICAgIE9NWF9WQ180WDRfVlIgPSA1LCAgICAgICAvKiogSW50cmFfNHg0X1ZlcnRpY2FsX1JpZ2h0ICovCi0gICAgT01YX1ZDXzRYNF9IRCA9IDYsICAgICAgIC8qKiBJbnRyYV80eDRfSG9yaXpvbnRhbF9Eb3duICovCi0gICAgT01YX1ZDXzRYNF9WTCA9IDcsICAgICAgIC8qKiBJbnRyYV80eDRfVmVydGljYWxfTGVmdCAqLwotICAgIE9NWF9WQ180WDRfSFUgPSA4ICAgICAgICAvKiogSW50cmFfNHg0X0hvcml6b250YWxfVXAgKi8gCi19IE9NWFZDTTRQMTBJbnRyYTR4NFByZWRNb2RlOwotCi0KLQotLyogNi4zLjEuMyBDaHJvbWEgUHJlZGljdGlvbiBNb2RlcyAgKi8KLS8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBpbnRyYSBjaHJvbWEgcHJlZGljdGlvbiBtb2RlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLwotCi10eXBlZGVmIGVudW0gewotICAgIE9NWF9WQ19DSFJPTUFfREMgPSAwLCAgICAvKiogSW50cmFfQ2hyb21hX0RDICovCi0gICAgT01YX1ZDX0NIUk9NQV9IT1IgPSAxLCAgIC8qKiBJbnRyYV9DaHJvbWFfSG9yaXpvbnRhbCAqLwotICAgIE9NWF9WQ19DSFJPTUFfVkVSVCA9IDIsICAvKiogSW50cmFfQ2hyb21hX1ZlcnRpY2FsICovCi0gICAgT01YX1ZDX0NIUk9NQV9QTEFORSA9IDMgIC8qKiBJbnRyYV9DaHJvbWFfUGxhbmUgKi8gCi19IE9NWFZDTTRQMTBJbnRyYUNocm9tYVByZWRNb2RlOwotCi0KLQotLyogNi4zLjEuNCBNb3Rpb24gRXN0aW1hdGlvbiBNb2RlcyAgKi8KLS8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBILjI2NCBtb3Rpb24gZXN0aW1hdGlvbiBtb2RlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLwotCi10eXBlZGVmIGVudW0gewotICAgIE9NWF9WQ19NNFAxMF9GQVNUX1NFQVJDSCA9IDAsIC8qKiBGYXN0IG1vdGlvbiBzZWFyY2ggKi8KLSAgICBPTVhfVkNfTTRQMTBfRlVMTF9TRUFSQ0ggPSAxICAvKiogRnVsbCBtb3Rpb24gc2VhcmNoICovIAotfSBPTVhWQ000UDEwTUVNb2RlOwotCi0KLQotLyogNi4zLjEuNSBNYWNyb2Jsb2NrIFR5cGVzICAqLwotLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIEguMjY0IG1hY3JvYmxvY2sgdHlwZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgICBPTVhfVkNfUF8xNngxNiAgPSAwLCAvKiBkZWZpbmVkIGJ5IFtJU08xNDQ5Ni0xMF0gKi8KLSAgICBPTVhfVkNfUF8xNng4ICA9IDEsCi0gICAgT01YX1ZDX1BfOHgxNiAgPSAyLAotICAgIE9NWF9WQ19QXzh4OCAgPSAzLAotICAgIE9NWF9WQ19QUkVGMF84eDggID0gNCwKLSAgICBPTVhfVkNfSU5URVJfU0tJUCAgPSA1LAotICAgIE9NWF9WQ19JTlRSQV80eDQgID0gOCwKLSAgICBPTVhfVkNfSU5UUkFfMTZ4MTYgID0gOSwKLSAgICBPTVhfVkNfSU5UUkFfUENNID0gMTAgCi19IE9NWFZDTTRQMTBNYWNyb2Jsb2NrVHlwZTsKLQotCi0KLS8qIDYuMy4xLjYgU3ViLU1hY3JvYmxvY2sgVHlwZXMgICovCi0vKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgSC4yNjQgc3ViLW1hY3JvYmxvY2sgdHlwZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgICBPTVhfVkNfU1VCX1BfOHg4ID0gMCwgLyogZGVmaW5lZCBieSBbSVNPMTQ0OTYtMTBdICovCi0gICAgT01YX1ZDX1NVQl9QXzh4NCA9IDEsCi0gICAgT01YX1ZDX1NVQl9QXzR4OCA9IDIsCi0gICAgT01YX1ZDX1NVQl9QXzR4NCA9IDMgCi19IE9NWFZDTTRQMTBTdWJNYWNyb2Jsb2NrVHlwZTsKLQotCi0KLS8qIDYuMy4xLjcgVmFyaWFibGUgTGVuZ3RoIENvZGluZyAoVkxDKSBJbmZvcm1hdGlvbiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE9NWF9VOCB1VHJhaWxpbmdfT25lczsgICAgICAvKiBUcmFpbGluZyBvbmVzOyAzIGF0IG1vc3QgKi8KLSAgICBPTVhfVTggdVRyYWlsaW5nX09uZV9TaWduczsgLyogVHJhaWxpbmcgb25lcyBzaWduYWwgKi8KLSAgICBPTVhfVTggdU51bUNvZWZmczsgICAgICAgICAgLyogVG90YWwgbnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZzLCBpbmNsdWRpbmcgdHJhaWxpbmcgb25lcyAqLwotICAgIE9NWF9VOCB1VG90YWxaZXJvczsgICAgICAgICAvKiBUb3RhbCBudW1iZXIgb2YgemVybyBjb2VmcyAqLwotICAgIE9NWF9TMTYgaUxldmVsc1sxNl07ICAgICAgICAvKiBMZXZlbHMgb2Ygbm9uLXplcm8gY29lZnMsIGluIHJldmVyc2UgemlnLXphZyBvcmRlciAqLwotICAgIE9NWF9VOCB1UnVuc1sxNl07ICAgICAgICAgICAvKiBSdW5zIGZvciBsZXZlbHMgYW5kIHRyYWlsaW5nIG9uZXMsIGluIHJldmVyc2UgemlnLXphZyBvcmRlciAqLwotfSBPTVhWQ000UDEwVkxDSW5mbzsKLQotCi0KLS8qIDYuMy4xLjggTWFjcm9ibG9jayBJbmZvcm1hdGlvbiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE9NWF9TMzIgc2xpY2VJZDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNsaWNlIG51bWJlciAqLwotICAgIE9NWFZDTTRQMTBNYWNyb2Jsb2NrVHlwZSBtYlR5cGU7ICAgICAgICAgIC8qIE1CIHR5cGUgKi8KLSAgICBPTVhWQ000UDEwU3ViTWFjcm9ibG9ja1R5cGUgc3ViTUJUeXBlWzRdOyAvKiBzdWItYmxvY2sgdHlwZSAqLwotICAgIE9NWF9TMzIgcXB5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHFwIGZvciBsdW1hICovCi0gICAgT01YX1MzMiBxcGM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcXAgZm9yIGNocm9tYSAqLwotICAgIE9NWF9VMzIgY2JweTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENCUCBMdW1hICovCi0gICAgT01YX1UzMiBjYnBjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ0JQIENocm9tYSAqLwotICAgIE9NWFZDTW90aW9uVmVjdG9yIHBNVjBbNF1bNF07IC8qIG1vdGlvbiB2ZWN0b3IsIHJlcHJlc2VudGVkIHVzaW5nIDEvNC1wZWwgdW5pdHMsIHBNVjBbYmxvY2t5XVtibG9ja3hdIChibG9ja3kgPSAwfjMsIGJsb2NreCA9MH4zKSAqLwotICAgIE9NWFZDTW90aW9uVmVjdG9yIHBNVlByZWRbNF1bNF07IC8qIG1vdGlvbiB2ZWN0b3IgcHJlZGljdGlvbiwgUmVwcmVzZW50ZWQgdXNpbmcgMS80LXBlbCB1bml0cywgcE1WUHJlZFtibG9ja3ldW2Jsb2NreF0gKGJsb2NreSA9IDB+MywgYmxvY2t4ID0gMH4zKSAqLwotICAgIE9NWF9VOCBwUmVmTDBJZHhbNF07ICAgICAgICAgICAgICAgICAgICAgIC8qIHJlZmVyZW5jZSBwaWN0dXJlIGluZGljZXMgKi8KLSAgICBPTVhWQ000UDEwSW50cmExNngxNlByZWRNb2RlIEludHJhMTZ4MTZQcmVkTW9kZTsgLyogYmVzdCBpbnRyYSAxNngxNiBwcmVkaWN0aW9uIG1vZGUgKi8KLSAgICBPTVhWQ000UDEwSW50cmE0eDRQcmVkTW9kZSBwSW50cmE0eDRQcmVkTW9kZVsxNl07IC8qIGJlc3QgaW50cmEgNHg0IHByZWRpY3Rpb24gbW9kZSBmb3IgZWFjaCBibG9jaywgcE1WMCBpbmRleGVkIGFzIGFib3ZlICovCi19IE9NWFZDTTRQMTBNQkluZm8sICpPTVhWQ000UDEwTUJJbmZvUHRyOwotCi0KLQotLyogNi4zLjEuOSBNb3Rpb24gRXN0aW1hdGlvbiBQYXJhbWV0ZXJzICAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgT01YX1MzMiBibG9ja1NwbGl0RW5hYmxlOHg4OyAvKiBlbmFibGVzIDE2eDgsIDh4MTYsIDh4OCAqLwotICAgIE9NWF9TMzIgYmxvY2tTcGxpdEVuYWJsZTR4NDsgLyogZW5hYmxlIHNwbGl0dGluZyBvZiA4eDQsIDR4OCwgNHg0IGJsb2NrcyAqLwotICAgIE9NWF9TMzIgaGFsZlNlYXJjaEVuYWJsZTsKLSAgICBPTVhfUzMyIHF1YXJ0ZXJTZWFyY2hFbmFibGU7Ci0gICAgT01YX1MzMiBpbnRyYUVuYWJsZTR4NDsgICAgICAvKiAxPWVuYWJsZSwgMD1kaXNhYmxlICovCi0gICAgT01YX1MzMiBzZWFyY2hSYW5nZTE2eDE2OyAgICAvKiBpbnRlZ2VyIHBpeGVsIHVuaXRzICovCi0gICAgT01YX1MzMiBzZWFyY2hSYW5nZTh4ODsKLSAgICBPTVhfUzMyIHNlYXJjaFJhbmdlNHg0OwotfSBPTVhWQ000UDEwTUVQYXJhbXM7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0ICAgKDYuMy4zLjEuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm0gSW50cmFfNHg0IHByZWRpY3Rpb24gZm9yIGx1bWEgc2FtcGxlcy4gSWYgdGhlIHVwcGVyLXJpZ2h0IGJsb2NrIGlzIAotICogbm90IGF2YWlsYWJsZSwgdGhlbiBkdXBsaWNhdGlvbiB3b3JrIHNob3VsZCBiZSBoYW5kbGVkIGluc2lkZSB0aGUgZnVuY3Rpb24uIAotICogVXNlcnMgbmVlZCBub3QgZGVmaW5lIHRoZW0gb3V0c2lkZS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0xlZnQgLSAgUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDQgbGVmdCBwaXhlbHM6IAotICogICAgICAgICAgICAgICAgICBwW3gsIHldICh4ID0gLTEsIHkgPSAwLi4zKSAKLSAqICAgcFNyY0Fib3ZlIC0gUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDggYWJvdmUgcGl4ZWxzOiAKLSAqICAgICAgICAgICAgICAgICAgcFt4LHldICh4ID0gMC4uNywgeSA9LTEpOyAKLSAqICAgICAgICAgICAgICAgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcFNyY0Fib3ZlTGVmdCAtIFBvaW50ZXIgdG8gdGhlIGFib3ZlIGxlZnQgcGl4ZWxzOiBwW3gseV0gKHggPSAtMSwgeSA9IC0xKSAKLSAqICAgbGVmdFN0ZXAgLSBTdGVwIG9mIGxlZnQgcGl4ZWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgIGRzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgcHJlZE1vZGUgLSBJbnRyYV80eDQgcHJlZGljdGlvbiBtb2RlLiAKLSAqICAgYXZhaWxhYmlsaXR5IC0gTmVpZ2hib3JpbmcgNHg0IGJsb2NrIGF2YWlsYWJpbGl0eSBmbGFnLCByZWZlciB0byAKLSAqICAgICAgICAgICAgICJOZWlnaGJvcmluZyBNYWNyb2Jsb2NrIEF2YWlsYWJpbGl0eSIgLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKLSAqICAgIElmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCi0gKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAotICogICAgcERzdCBpcyBOVUxMLiAKLSAqICAgIGRzdFN0ZXAgPCA0LCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQuIAotICogICAgbGVmdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgICBwcmVkTW9kZSBpcyBub3QgaW4gdGhlIHZhbGlkIHJhbmdlIG9mIGVudW1lcmF0aW9uIAotICogICAgICAgICAgICAgIE9NWFZDTTRQMTBJbnRyYTR4NFByZWRNb2RlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfVkVSVCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfVVBQRVIgCi0gKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwW3gsLTFdICh4ID0gMC4uMykgaXMgbm90IGF2YWlsYWJsZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X0hPUiwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfTEVGVCAKLSAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbLTEseV0gKHkgPSAwLi4zKSBpcyBub3QgYXZhaWxhYmxlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfRElBR19ETCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKLSAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVIgaW5kaWNhdGluZyBwW3gsIC0xXSAoeCA9IDAuLjMpIGlzIG5vdCBhdmFpbGFibGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9ESUFHX0RSLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAotICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUl9MRUZUIG9yIE9NWF9WQ19VUFBFUiBvciBPTVhfVkNfTEVGVCBpbmRpY2F0aW5nIAotICogICAgICAgICAgICAgIHBbeCwtMV0gKHggPSAwLi4zKSwgb3IgcFstMSx5XSAoeSA9IDAuLjMpIG9yIHBbLTEsLTFdIGlzIG5vdCAKLSAqICAgICAgICAgICAgICBhdmFpbGFibGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9WUiwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKLSAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVJfTEVGVCBvciBPTVhfVkNfVVBQRVIgb3IgT01YX1ZDX0xFRlQgaW5kaWNhdGluZyAKLSAqICAgICAgICAgICAgICBwW3gsLTFdICh4ID0gMC4uMyksIG9yIHBbLTEseV0gKHkgPSAwLi4zKSBvciBwWy0xLC0xXSBpcyBub3QgCi0gKiAgICAgICAgICAgICAgYXZhaWxhYmxlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfSEQsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCi0gKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSX0xFRlQgb3IgT01YX1ZDX1VQUEVSIG9yIE9NWF9WQ19MRUZUIGluZGljYXRpbmcgCi0gKiAgICAgICAgICAgICAgcFt4LC0xXSAoeCA9IDAuLjMpLCBvciBwWy0xLHldICh5ID0gMC4uMykgb3IgcFstMSwtMV0gaXMgbm90IAotICogICAgICAgICAgICAgIGF2YWlsYWJsZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X1ZMLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19VUFBFUiAKLSAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbeCwtMV0gKHggPSAwLi4zKSBpcyBub3QgYXZhaWxhYmxlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfSFUsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX0xFRlQgCi0gKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwWy0xLHldICh5ID0gMC4uMykgaXMgbm90IGF2YWlsYWJsZS4gCi0gKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVIsIGJ1dCBwU3JjQWJvdmUgaXMgTlVMTC4gCi0gKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfTEVGVCwgYnV0IHBTcmNMZWZ0IGlzIE5VTEwuIAotICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSX0xFRlQsIGJ1dCBwU3JjQWJvdmVMZWZ0IGlzIE5VTEwuIAotICogICAgZWl0aGVyIHBTcmNBYm92ZSBvciBwRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgCi0gKgotICogTm90ZTogCi0gKiAgICAgcFNyY0Fib3ZlLCBwU3JjQWJvdmUsIHBTcmNBYm92ZUxlZnQgbWF5IGJlIGludmFsaWQgcG9pbnRlcnMgaWYgCi0gKiAgICAgdGhleSBhcmUgbm90IHVzZWQgYnkgaW50cmEgcHJlZGljdGlvbiBhcyBpbXBsaWVkIGluIHByZWRNb2RlLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0xlZnQsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmUsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmVMZWZ0LAotICAgIE9NWF9VOCAqcERzdCwKLSAgICBPTVhfSU5UIGxlZnRTdGVwLAotICAgIE9NWF9JTlQgZHN0U3RlcCwKLSAgICBPTVhWQ000UDEwSW50cmE0eDRQcmVkTW9kZSBwcmVkTW9kZSwKLSAgICBPTVhfUzMyIGF2YWlsYWJpbGl0eQotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNiAgICg2LjMuMy4xLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtIEludHJhXzE2eDE2IHByZWRpY3Rpb24gZm9yIGx1bWEgc2FtcGxlcy4gSWYgdGhlIHVwcGVyLXJpZ2h0IGJsb2NrIAotICogaXMgbm90IGF2YWlsYWJsZSwgdGhlbiBkdXBsaWNhdGlvbiB3b3JrIHNob3VsZCBiZSBoYW5kbGVkIGluc2lkZSB0aGUgCi0gKiBmdW5jdGlvbi4gVXNlcnMgbmVlZCBub3QgZGVmaW5lIHRoZW0gb3V0c2lkZS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0xlZnQgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgMTYgbGVmdCBwaXhlbHM6IHBbeCwgeV0gKHggPSAtMSwgeSA9IAotICogICAgICAgICAgICAwLi4xNSkgCi0gKiAgIHBTcmNBYm92ZSAtIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiAxNiBhYm92ZSBwaXhlbHM6IHBbeCx5XSAoeCA9IDAuLjE1LCAKLSAqICAgICAgICAgICAgeT0gLTEpOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcFNyY0Fib3ZlTGVmdCAtIFBvaW50ZXIgdG8gdGhlIGFib3ZlIGxlZnQgcGl4ZWxzOiBwW3gseV0gKHggPSAtMSwgeSA9IC0xKSAKLSAqICAgbGVmdFN0ZXAgLSBTdGVwIG9mIGxlZnQgcGl4ZWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAotICogICBkc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAotICogICBwcmVkTW9kZSAtIEludHJhXzE2eDE2IHByZWRpY3Rpb24gbW9kZSwgcGxlYXNlIHJlZmVyIHRvIHNlY3Rpb24gMy40LjEuIAotICogICBhdmFpbGFiaWxpdHkgLSBOZWlnaGJvcmluZyAxNngxNiBNQiBhdmFpbGFiaWxpdHkgZmxhZy4gUmVmZXIgdG8gCi0gKiAgICAgICAgICAgICAgICAgIHNlY3Rpb24gMy40LjQuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC1Qb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAotICogICAgSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKLSAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCi0gKiAgICBwRHN0IGlzIE5VTEwuIAotICogICAgZHN0U3RlcCA8IDE2LiBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgIGxlZnRTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgIHByZWRNb2RlIGlzIG5vdCBpbiB0aGUgdmFsaWQgcmFuZ2Ugb2YgZW51bWVyYXRpb24gCi0gKiAgICAgICAgICAgICAgT01YVkNNNFAxMEludHJhMTZ4MTZQcmVkTW9kZSAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ18xNlgxNl9WRVJULCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAotICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUiBpbmRpY2F0aW5nIHBbeCwtMV0gKHggPSAwLi4xNSkgaXMgbm90IGF2YWlsYWJsZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfMTZYMTZfSE9SLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19MRUZUIAotICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFstMSx5XSAoeSA9IDAuLjE1KSBpcyBub3QgYXZhaWxhYmxlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ18xNlgxNl9QTEFORSwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKLSAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVJfTEVGVCBvciBPTVhfVkNfVVBQRVIgb3IgT01YX1ZDX0xFRlQgaW5kaWNhdGluZyAKLSAqICAgICAgICAgICAgICBwW3gsLTFdKHggPSAwLi4xNSksIG9yIHBbLTEseV0gKHkgPSAwLi4xNSksIG9yIHBbLTEsLTFdIGlzIG5vdCAKLSAqICAgICAgICAgICAgICBhdmFpbGFibGUuIAotICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSLCBidXQgcFNyY0Fib3ZlIGlzIE5VTEwuIAotICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX0xFRlQsIGJ1dCBwU3JjTGVmdCBpcyBOVUxMLiAKLSAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUl9MRUZULCBidXQgcFNyY0Fib3ZlTGVmdCBpcyBOVUxMLiAKLSAqICAgIGVpdGhlciBwU3JjQWJvdmUgb3IgcERzdCBpcyBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuICAKLSAqCi0gKiBOb3RlOiAKLSAqICAgICBwU3JjQWJvdmUsIHBTcmNBYm92ZSwgcFNyY0Fib3ZlTGVmdCBtYXkgYmUgaW52YWxpZCBwb2ludGVycyBpZiAKLSAqICAgICB0aGV5IGFyZSBub3QgdXNlZCBieSBpbnRyYSBwcmVkaWN0aW9uIGltcGxpZWQgaW4gcHJlZE1vZGUuIAotICogTm90ZTogCi0gKiAgICAgT01YX1ZDX1VQUEVSX1JJR0hUIGlzIG5vdCB1c2VkIGluIGludHJhXzE2eDE2IGx1bWEgcHJlZGljdGlvbi4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0xlZnQsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmUsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmVMZWZ0LAotICAgIE9NWF9VOCAqcERzdCwKLSAgICBPTVhfSU5UIGxlZnRTdGVwLAotICAgIE9NWF9JTlQgZHN0U3RlcCwKLSAgICBPTVhWQ000UDEwSW50cmExNngxNlByZWRNb2RlIHByZWRNb2RlLAotICAgIE9NWF9TMzIgYXZhaWxhYmlsaXR5Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCAgICg2LjMuMy4xLjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBpbnRyYSBwcmVkaWN0aW9uIGZvciBjaHJvbWEgc2FtcGxlcy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0xlZnQgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgOCBsZWZ0IHBpeGVsczogcFt4LCB5XSAoeCA9IC0xLCB5PSAKLSAqICAgICAgICAgICAgMC4uNykuIAotICogICBwU3JjQWJvdmUgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgOCBhYm92ZSBwaXhlbHM6IHBbeCx5XSAoeCA9IDAuLjcsIHkgCi0gKiAgICAgICAgICAgID0gLTEpOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcFNyY0Fib3ZlTGVmdCAtIFBvaW50ZXIgdG8gdGhlIGFib3ZlIGxlZnQgcGl4ZWxzOiBwW3gseV0gKHggPSAtMSwgeSA9IC0xKSAKLSAqICAgbGVmdFN0ZXAgLSBTdGVwIG9mIGxlZnQgcGl4ZWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIGRzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgcHJlZE1vZGUgLSBJbnRyYSBjaHJvbWEgcHJlZGljdGlvbiBtb2RlLCBwbGVhc2UgcmVmZXIgdG8gc2VjdGlvbiAzLjQuMy4gCi0gKiAgIGF2YWlsYWJpbGl0eSAtIE5laWdoYm9yaW5nIGNocm9tYSBibG9jayBhdmFpbGFiaWxpdHkgZmxhZywgcGxlYXNlIHJlZmVyIAotICogICAgICAgICAgICB0byAgIk5laWdoYm9yaW5nIE1hY3JvYmxvY2sgQXZhaWxhYmlsaXR5Ii4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAotICogICAgSWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKLSAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCi0gKiAgICBwRHN0IGlzIE5VTEwuIAotICogICAgZHN0U3RlcCA8IDggb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgIGxlZnRTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICogICAgcHJlZE1vZGUgaXMgbm90IGluIHRoZSB2YWxpZCByYW5nZSBvZiBlbnVtZXJhdGlvbiAKLSAqICAgICAgICAgICAgICBPTVhWQ000UDEwSW50cmFDaHJvbWFQcmVkTW9kZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfQ0hST01BX1ZFUlQsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCi0gKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSIGluZGljYXRpbmcgcFt4LC0xXSAoeCA9IDAuLjcpIGlzIG5vdCBhdmFpbGFibGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDX0NIUk9NQV9IT1IsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX0xFRlQgCi0gKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwWy0xLHldICh5ID0gMC4uNykgaXMgbm90IGF2YWlsYWJsZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfQ0hST01BX1BMQU5FLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAotICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUl9MRUZUIG9yIE9NWF9WQ19VUFBFUiBvciBPTVhfVkNfTEVGVCBpbmRpY2F0aW5nIAotICogICAgICAgICAgICAgIHBbeCwtMV0oeCA9IDAuLjcpLCBvciBwWy0xLHldICh5ID0gMC4uNyksIG9yIHBbLTEsLTFdIGlzIG5vdCAKLSAqICAgICAgICAgICAgICBhdmFpbGFibGUuIAotICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSLCBidXQgcFNyY0Fib3ZlIGlzIE5VTEwuIAotICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX0xFRlQsIGJ1dCBwU3JjTGVmdCBpcyBOVUxMLiAKLSAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUl9MRUZULCBidXQgcFNyY0Fib3ZlTGVmdCBpcyBOVUxMLiAKLSAqICAgIGVpdGhlciBwU3JjQWJvdmUgb3IgcERzdCBpcyBub3QgYWxpZ25lZCBvbiBhIDgtYnl0ZSBib3VuZGFyeS4gIAotICoKLSAqICBOb3RlOiBwU3JjQWJvdmUsIHBTcmNBYm92ZSwgcFNyY0Fib3ZlTGVmdCBtYXkgYmUgaW52YWxpZCBwb2ludGVyIGlmIAotICogIHRoZXkgYXJlIG5vdCB1c2VkIGJ5IGludHJhIHByZWRpY3Rpb24gaW1wbGllZCBpbiBwcmVkTW9kZS4gCi0gKgotICogIE5vdGU6IE9NWF9WQ19VUFBFUl9SSUdIVCBpcyBub3QgdXNlZCBpbiBpbnRyYSBjaHJvbWEgcHJlZGljdGlvbi4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNMZWZ0LAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlTGVmdCwKLSAgICBPTVhfVTggKnBEc3QsCi0gICAgT01YX0lOVCBsZWZ0U3RlcCwKLSAgICBPTVhfSU5UIGRzdFN0ZXAsCi0gICAgT01YVkNNNFAxMEludHJhQ2hyb21hUHJlZE1vZGUgcHJlZE1vZGUsCi0gICAgT01YX1MzMiBhdmFpbGFiaWxpdHkKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEgICAoNi4zLjMuMi4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgcXVhcnRlci1waXhlbCBpbnRlcnBvbGF0aW9uIGZvciBpbnRlciBsdW1hIE1CLiBJdCBpcyBhc3N1bWVkIHRoYXQgCi0gKiB0aGUgZnJhbWUgaXMgYWxyZWFkeSBwYWRkZWQgd2hlbiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSBzb3VyY2UgcmVmZXJlbmNlIGZyYW1lIGJ1ZmZlciAKLSAqICAgc3JjU3RlcCAtIHJlZmVyZW5jZSBmcmFtZSBzdGVwLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIHJvaS53aWR0aCAKLSAqICAgZHN0U3RlcCAtIGRlc3RpbmF0aW9uIGZyYW1lIHN0ZXAsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgCi0gKiAgICAgICAgICAgIHJvaS53aWR0aCAKLSAqICAgZHggLSBGcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIGNvbXBvbmVudCBpbiAxLzQgcGl4ZWwgCi0gKiAgICAgICAgICAgIHVuaXQ7IHZhbGlkIGluIHRoZSByYW5nZSBbMCwzXSAKLSAqICAgZHkgLSBGcmFjdGlvbmFsIHBhcnQgb2YgdmVydGljYWwgbW90aW9uIHZlY3RvciB5IGNvbXBvbmVudCBpbiAxLzQgcGl4ZWwgCi0gKiAgICAgICAgICAgIHVuaXQ7IHZhbGlkIGluIHRoZSByYW5nZSBbMCwzXSAKLSAqICAgcm9pIC0gRGltZW5zaW9uIG9mIHRoZSBpbnRlcnBvbGF0aW9uIHJlZ2lvbjsgdGhlIHBhcmFtZXRlcnMgcm9pLndpZHRoIGFuZCAKLSAqICAgICAgICAgICAgcm9pLmhlaWdodCBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBmcmFtZSBidWZmZXI6IAotICogICAgICAgICAgaWYgcm9pLndpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKLSAqICAgICAgICAgIGlmIHJvaS53aWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCi0gKiAgICAgICAgICBpZiByb2kud2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAotICogICAgSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKLSAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCi0gKiAgICBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCi0gKiAgICBzcmNTdGVwIG9yIGRzdFN0ZXAgPCByb2kud2lkdGguIAotICogICAgZHggb3IgZHkgaXMgb3V0IG9mIHJhbmdlIFswLDNdLiAKLSAqICAgIHJvaS53aWR0aCBvciByb2kuaGVpZ2h0IGlzIG91dCBvZiByYW5nZSB7NCwgOCwgMTZ9LiAKLSAqICAgIHJvaS53aWR0aCBpcyBlcXVhbCB0byA0LCBidXQgcERzdCBpcyBub3QgNCBieXRlIGFsaWduZWQuIAotICogICAgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDggb3IgMTYsIGJ1dCBwRHN0IGlzIG5vdCA4IGJ5dGUgYWxpZ25lZC4gCi0gKiAgICBzcmNTdGVwIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKLSAgICBPTVhfUzMyIHNyY1N0ZXAsCi0gICAgT01YX1U4ICpwRHN0LAotICAgIE9NWF9TMzIgZHN0U3RlcCwKLSAgICBPTVhfUzMyIGR4LAotICAgIE9NWF9TMzIgZHksCi0gICAgT01YU2l6ZSByb2kKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYSAgICg2LjMuMy4yLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyAxLzgtcGl4ZWwgaW50ZXJwb2xhdGlvbiBmb3IgaW50ZXIgY2hyb21hIE1CLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC1Qb2ludGVyIHRvIHRoZSBzb3VyY2UgcmVmZXJlbmNlIGZyYW1lIGJ1ZmZlciAKLSAqICAgc3JjU3RlcCAtUmVmZXJlbmNlIGZyYW1lIHN0ZXAgaW4gYnl0ZXMgCi0gKiAgIGRzdFN0ZXAgLURlc3RpbmF0aW9uIGZyYW1lIHN0ZXAgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAKLSAqICAgICAgICAgICAgcm9pLndpZHRoLiAKLSAqICAgZHggLUZyYWN0aW9uYWwgcGFydCBvZiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgY29tcG9uZW50IGluIDEvOCBwaXhlbCAKLSAqICAgICAgICAgICAgdW5pdDsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDddIAotICogICBkeSAtRnJhY3Rpb25hbCBwYXJ0IG9mIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgY29tcG9uZW50IGluIDEvOCBwaXhlbCAKLSAqICAgICAgICAgICAgdW5pdDsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDddIAotICogICByb2kgLURpbWVuc2lvbiBvZiB0aGUgaW50ZXJwb2xhdGlvbiByZWdpb247IHRoZSBwYXJhbWV0ZXJzIHJvaS53aWR0aCBhbmQgCi0gKiAgICAgICAgICAgIHJvaS5oZWlnaHQgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgMiwgNCwgb3IgOC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGZyYW1lIGJ1ZmZlcjoKLSAqICAgICAgICAgaWYgcm9pLndpZHRoPT0yLCAgMi1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKLSAqICAgICAgICAgaWYgcm9pLndpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKLSAqICAgICAgICAgaWYgcm9pLndpZHRoPT04LCA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCi0gKiAgICBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAotICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKLSAqICAgIHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKLSAqICAgIHNyY1N0ZXAgb3IgZHN0U3RlcCA8IDguIAotICogICAgZHggb3IgZHkgaXMgb3V0IG9mIHJhbmdlIFswLTddLiAKLSAqICAgIHJvaS53aWR0aCBvciByb2kuaGVpZ2h0IGlzIG91dCBvZiByYW5nZSB7Miw0LDh9LiAKLSAqICAgIHJvaS53aWR0aCBpcyBlcXVhbCB0byAyLCBidXQgcERzdCBpcyBub3QgMi1ieXRlIGFsaWduZWQuIAotICogICAgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDQsIGJ1dCBwRHN0IGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICByb2kud2lkdGggaXMgZXF1YWwgdG8gOCwgYnV0IHBEc3QgaXMgbm90IDggYnl0ZSBhbGlnbmVkLiAKLSAqICAgIHNyY1N0ZXAgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmMsCi0gICAgT01YX1MzMiBzcmNTdGVwLAotICAgIE9NWF9VOCAqcERzdCwKLSAgICBPTVhfUzMyIGRzdFN0ZXAsCi0gICAgT01YX1MzMiBkeCwKLSAgICBPTVhfUzMyIGR5LAotICAgIE9NWFNpemUgcm9pCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JICAgKDYuMy4zLjMuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2sgZmlsdGVyaW5nIG9uIGZvdXIgdmVydGljYWwgZWRnZXMgb2YgdGhlIGx1bWEgCi0gKiBtYWNyb2Jsb2NrICgxNngxNikuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBQb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gCi0gKiAgIHNyY2RzdFN0ZXAgLVN0ZXAgb2YgdGhlIGFycmF5czsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgcEFscGhhIC1BcnJheSBvZiBzaXplIDIgb2YgYWxwaGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGFscGhhIAotICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIAotICogICAgICAgICAgICBmb3IgdGhlIGludGVybmFsIHZlcnRpY2FsIGVkZ2UpOyBwZXIgW0lTTzE0NDk2LTEwXSBhbHBoYSB2YWx1ZXMgCi0gKiAgICAgICAgICAgIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1NV0uIAotICogICBwQmV0YSAtQXJyYXkgb2Ygc2l6ZSAyIG9mIGJldGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGJldGEgCi0gKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gaXMgCi0gKiAgICAgICAgICAgIGZvciB0aGUgaW50ZXJuYWwgdmVydGljYWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGJldGEgdmFsdWVzIAotICogICAgICAgICAgICBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAotICogICBwVGhyZXNob2xkcyAtQXJyYXkgb2Ygc2l6ZSAxNiBvZiBUaHJlc2hvbGRzIChUQzApICh2YWx1ZXMgZm9yIHRoZSBsZWZ0IAotICogICAgICAgICAgICBlZGdlIG9mIGVhY2ggNHg0IGJsb2NrLCBhcnJhbmdlZCBpbiB2ZXJ0aWNhbCBibG9jayBvcmRlcik7IG11c3QgCi0gKiAgICAgICAgICAgIGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuLiAgUGVyIFtJU08xNDQ5Ni0xMF0gdmFsdWVzIG11c3QgCi0gKiAgICAgICAgICAgIGJlIGluIHRoZSByYW5nZSBbMCwyNV0uIAotICogICBwQlMgLUFycmF5IG9mIHNpemUgMTYgb2YgQlMgcGFyYW1ldGVycyAoYXJyYW5nZWQgaW4gdmVydGljYWwgYmxvY2sgCi0gKiAgICAgICAgICAgIG9yZGVyKTsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgCi0gKiAgICAgICAgICAgIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leM109PSA0LiAgTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLVBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCi0gKiAgICBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAotICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKLSAqICAgIEVpdGhlciBvZiB0aGUgcG9pbnRlcnMgaW4gcFNyY0RzdCwgcEFscGhhLCBwQmV0YSwgcFRocmVzaG9sZHMsIG9yIHBCUyAKLSAqICAgICAgICAgICAgICBpcyBOVUxMLiAKLSAqICAgIEVpdGhlciBwVGhyZXNob2xkcyBvciBwQlMgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAotICogICAgcFNyY0RzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAotICogICAgcEFscGhhWzBdIGFuZC9vciBwQWxwaGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMjU1XS4gCi0gKiAgICBwQmV0YVswXSBhbmQvb3IgcEJldGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMThdLiAKLSAqICAgIE9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjE1XWlzIG91dHNpZGUgb2YgdGhlIAotICogICAgICAgICAgICAgIHJhbmdlIFswLDI1XS4gCi0gKiAgICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgICAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAocEJTW2ldPT00ICYmIAotICogICAgICAgICAgICAgIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0kgKAotICAgIE9NWF9VOCAqcFNyY0RzdCwKLSAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCi0gICAgY29uc3QgT01YX1U4ICpwQWxwaGEsCi0gICAgY29uc3QgT01YX1U4ICpwQmV0YSwKLSAgICBjb25zdCBPTVhfVTggKnBUaHJlc2hvbGRzLAotICAgIGNvbnN0IE9NWF9VOCAqcEJTCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JICAgKDYuMy4zLjMuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2sgZmlsdGVyaW5nIG9uIGZvdXIgaG9yaXpvbnRhbCBlZGdlcyBvZiB0aGUgbHVtYSAKLSAqIG1hY3JvYmxvY2sgKDE2eDE2KS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqICAgc3JjZHN0U3RlcCAtIHN0ZXAgb2YgdGhlIGFycmF5czsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgcEFscGhhIC0gYXJyYXkgb2Ygc2l6ZSAyIG9mIGFscGhhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBhbHBoYSAKLSAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgYW5kIHRoZSBzZWNvbmQgaXRlbSBpcyAKLSAqICAgICAgICAgICAgZm9yIHRoZSBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UpOyBwZXIgW0lTTzE0NDk2LTEwXSBhbHBoYSAKLSAqICAgICAgICAgICAgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1NV0uIAotICogICBwQmV0YSAtIGFycmF5IG9mIHNpemUgMiBvZiBiZXRhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBiZXRhIAotICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCBob3Jpem9udGFsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gCi0gKiAgICAgICAgICAgIGlzIGZvciB0aGUgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlKS4gUGVyIFtJU08xNDQ5Ni0xMF0gYmV0YSAKLSAqICAgICAgICAgICAgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDE4XS4gCi0gKiAgIHBUaHJlc2hvbGRzIC0gYXJyYXkgb2Ygc2l6ZSAxNiBjb250YWluaW5nIHRocmVzaG9sZHMsIFRDMCwgZm9yIHRoZSB0b3AgCi0gKiAgICAgICAgICAgIGhvcml6b250YWwgZWRnZSBvZiBlYWNoIDR4NCBibG9jaywgYXJyYW5nZWQgaW4gaG9yaXpvbnRhbCBibG9jayAKLSAqICAgICAgICAgICAgb3JkZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIFBlciBbSVNPMTQ0OTYgMTBdIAotICogICAgICAgICAgICB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjVdLiAKLSAqICAgcEJTIC0gYXJyYXkgb2Ygc2l6ZSAxNiBvZiBCUyBwYXJhbWV0ZXJzIChhcnJhbmdlZCBpbiBob3Jpem9udGFsIGJsb2NrIAotICogICAgICAgICAgICBvcmRlcik7IHZhbGlkIGluIHRoZSByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIAotICogICAgICAgICAgICBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjNdPT0gNC4gIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC1Qb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyLCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QsIHBBbHBoYSwgCi0gKiAgICAgICAgICAgICAgcEJldGEsIHBUaHJlc2hvbGRzLCBvciBwQlMuIAotICogICAgLSAgICBlaXRoZXIgcFRocmVzaG9sZHMgb3IgcEJTIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgIC0gICAgcFNyY0RzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgICAtICAgIHBBbHBoYVswXSBhbmQvb3IgcEFscGhhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDI1NV0uIAotICogICAgLSAgICBwQmV0YVswXSBhbmQvb3IgcEJldGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMThdLiAKLSAqICAgIC0gICAgT25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uMTVdIGlzIAotICogICAgICAgICBvdXRzaWRlIG9mIHRoZSByYW5nZSBbMCwyNV0uIAotICogICAgLSAgICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgICAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAKLSAqICAgICAgICAgICAgICAocEJTW2ldPT00ICYmIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0kgKAotICAgIE9NWF9VOCAqcFNyY0RzdCwKLSAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCi0gICAgY29uc3QgT01YX1U4ICpwQWxwaGEsCi0gICAgY29uc3QgT01YX1U4ICpwQmV0YSwKLSAgICBjb25zdCBPTVhfVTggKnBUaHJlc2hvbGRzLAotICAgIGNvbnN0IE9NWF9VOCAqcEJTCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0kgICAoNi4zLjMuMy4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgaW4tcGxhY2UgZGVibG9jayBmaWx0ZXJpbmcgb24gZm91ciB2ZXJ0aWNhbCBlZGdlcyBvZiB0aGUgY2hyb21hIAotICogbWFjcm9ibG9jayAoOHg4KS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgOC1ieXRlIGFsaWduZWQuIAotICogICBzcmNkc3RTdGVwIC0gU3RlcCBvZiB0aGUgYXJyYXlzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIHBBbHBoYSAtIEFycmF5IG9mIHNpemUgMiBvZiBhbHBoYSB0aHJlc2hvbGRzICh0aGUgZmlyc3QgaXRlbSBpcyBhbHBoYSAKLSAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIGZvciAKLSAqICAgICAgICAgICAgaW50ZXJuYWwgdmVydGljYWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGFscGhhIHZhbHVlcyBtdXN0IGJlIAotICogICAgICAgICAgICBpbiB0aGUgcmFuZ2UgWzAsMjU1XS4gCi0gKiAgIHBCZXRhIC0gQXJyYXkgb2Ygc2l6ZSAyIG9mIGJldGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGJldGEgCi0gKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gaXMgCi0gKiAgICAgICAgICAgIGZvciB0aGUgaW50ZXJuYWwgdmVydGljYWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGJldGEgdmFsdWVzIAotICogICAgICAgICAgICBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAotICogICBwVGhyZXNob2xkcyAtIEFycmF5IG9mIHNpemUgOCBjb250YWluaW5nIHRocmVzaG9sZHMsIFRDMCwgZm9yIHRoZSBsZWZ0IAotICogICAgICAgICAgICB2ZXJ0aWNhbCBlZGdlIG9mIGVhY2ggNHgyIGNocm9tYSBibG9jaywgYXJyYW5nZWQgaW4gdmVydGljYWwgCi0gKiAgICAgICAgICAgIGJsb2NrIG9yZGVyOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBQZXIgCi0gKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCi0gKiAgIHBCUyAtIEFycmF5IG9mIHNpemUgMTYgb2YgQlMgcGFyYW1ldGVycyAodmFsdWVzIGZvciBlYWNoIDJ4MiBjaHJvbWEgCi0gKiAgICAgICAgICAgIGJsb2NrLCBhcnJhbmdlZCBpbiB2ZXJ0aWNhbCBibG9jayBvcmRlcikuIFRoaXMgcGFyYW1ldGVyIGlzIHRoZSAKLSAqICAgICAgICAgICAgc2FtZSBhcyB0aGUgcEJTIHBhcmFtZXRlciBwYXNzZWQgaW50byBGaWx0ZXJEZWJsb2NrTHVtYV9WZXJFZGdlOyAKLSAqICAgICAgICAgICAgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6IGkpIAotICogICAgICAgICAgICBwQlNbaV09PSA0IG1heSBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgcEJTW2ldPT0gNCBpZiBhbmQgCi0gKiAgICAgICAgICAgIG9ubHkgaWYgcEJTW2leM109PSA0LiAgTXVzdCBiZSA0IGJ5dGUgYWxpZ25lZC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLVBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QsIHBBbHBoYSwgCi0gKiAgICAgICAgICAgICAgcEJldGEsIHBUaHJlc2hvbGRzLCBvciBwQlMuIAotICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgICAtICAgIHBUaHJlc2hvbGRzIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIHBBbHBoYVswXSBhbmQvb3IgcEFscGhhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDI1NV0uIAotICogICAgLSAgICBwQmV0YVswXSBhbmQvb3IgcEJldGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMThdLiAKLSAqICAgIC0gICAgT25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uN10gaXMgb3V0c2lkZSAKLSAqICAgICAgICAgb2YgdGhlIHJhbmdlIFswLDI1XS4gCi0gKiAgICAtICAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAKLSAqICAgICAgICAgKHBCU1tpXT09NCAmJiBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAotICogICAgLSAgICBwQlMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JICgKLSAgICBPTVhfVTggKnBTcmNEc3QsCi0gICAgT01YX1MzMiBzcmNkc3RTdGVwLAotICAgIGNvbnN0IE9NWF9VOCAqcEFscGhhLAotICAgIGNvbnN0IE9NWF9VOCAqcEJldGEsCi0gICAgY29uc3QgT01YX1U4ICpwVGhyZXNob2xkcywKLSAgICBjb25zdCBPTVhfVTggKnBCUwotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JICAgKDYuMy4zLjMuNCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2sgZmlsdGVyaW5nIG9uIHRoZSBob3Jpem9udGFsIGVkZ2VzIG9mIHRoZSBjaHJvbWEgCi0gKiBtYWNyb2Jsb2NrICg4eDgpLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4gCi0gKiAgIHNyY2RzdFN0ZXAgLSBhcnJheSBzdGVwOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIHBBbHBoYSAtIGFycmF5IG9mIHNpemUgMiBjb250YWluaW5nIGFscGhhIHRocmVzaG9sZHM7IHRoZSBmaXJzdCBlbGVtZW50IAotICogICAgICAgICAgICBjb250YWlucyB0aGUgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBhbmQgdGhlIAotICogICAgICAgICAgICBzZWNvbmQgZWxlbWVudCBjb250YWlucyB0aGUgdGhyZXNob2xkIGZvciBpbnRlcm5hbCBob3Jpem9udGFsIAotICogICAgICAgICAgICBlZGdlLiAgUGVyIFtJU08xNDQ5Ni0xMF0gYWxwaGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIAotICogICAgICAgICAgICBbMCwyNTVdLiAKLSAqICAgcEJldGEgLSBhcnJheSBvZiBzaXplIDIgY29udGFpbmluZyBiZXRhIHRocmVzaG9sZHM7IHRoZSBmaXJzdCBlbGVtZW50IAotICogICAgICAgICAgICBjb250YWlucyB0aGUgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBhbmQgdGhlIAotICogICAgICAgICAgICBzZWNvbmQgZWxlbWVudCBjb250YWlucyB0aGUgdGhyZXNob2xkIGZvciB0aGUgaW50ZXJuYWwgCi0gKiAgICAgICAgICAgIGhvcml6b250YWwgZWRnZS4gIFBlciBbSVNPMTQ0OTYtMTBdIGJldGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIAotICogICAgICAgICAgICByYW5nZSBbMCwxOF0uIAotICogICBwVGhyZXNob2xkcyAtIGFycmF5IG9mIHNpemUgOCBjb250YWluaW5nIHRocmVzaG9sZHMsIFRDMCwgZm9yIHRoZSB0b3AgCi0gKiAgICAgICAgICAgIGhvcml6b250YWwgZWRnZSBvZiBlYWNoIDJ4NCBjaHJvbWEgYmxvY2ssIGFycmFuZ2VkIGluIGhvcml6b250YWwgCi0gKiAgICAgICAgICAgIGJsb2NrIG9yZGVyOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBQZXIgCi0gKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCi0gKiAgIHBCUyAtIGFycmF5IG9mIHNpemUgMTYgY29udGFpbmluZyBCUyBwYXJhbWV0ZXJzIGZvciBlYWNoIDJ4MiBjaHJvbWEgCi0gKiAgICAgICAgICAgIGJsb2NrLCBhcnJhbmdlZCBpbiBob3Jpem9udGFsIGJsb2NrIG9yZGVyOyB2YWxpZCBpbiB0aGUgcmFuZ2UgCi0gKiAgICAgICAgICAgIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IG9jY3VyIAotICogICAgICAgICAgICBvbmx5IGZvciAwPD1pPD0zLCBpaSkgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4zXT09IDQuIAotICogICAgICAgICAgICBNdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtUG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciwgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgYW55IG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBTcmNEc3QsIHBBbHBoYSwgcEJldGEsIHBUaHJlc2hvbGRzLCBvciBwQlMuIAotICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgICAtICAgIHBUaHJlc2hvbGRzIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIHBBbHBoYVswXSBhbmQvb3IgcEFscGhhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDI1NV0uIAotICogICAgLSAgICBwQmV0YVswXSBhbmQvb3IgcEJldGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMThdLiAKLSAqICAgIC0gICAgT25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uN10gaXMgb3V0c2lkZSAKLSAqICAgICAgICAgb2YgdGhlIHJhbmdlIFswLDI1XS4gCi0gKiAgICAtICAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAgICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIAotICogICAgICAgICAgICAgIChwQlNbaV09PTQgJiYgcEJTW2leM10hPTQpIGZvciAwPD1pPD0zLgotICogICAgLSAgICBwQlMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JICgKLSAgICBPTVhfVTggKnBTcmNEc3QsCi0gICAgT01YX1MzMiBzcmNkc3RTdGVwLAotICAgIGNvbnN0IE9NWF9VOCAqcEFscGhhLAotICAgIGNvbnN0IE9NWF9VOCAqcEJldGEsCi0gICAgY29uc3QgT01YX1U4ICpwVGhyZXNob2xkcywKLSAgICBjb25zdCBPTVhfVTggKnBCUwotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kgICAoNi4zLjMuMy41KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NrIGZpbHRlcmluZyB0aGUgaG9yaXpvbnRhbCBhbmQgCi0gKiB2ZXJ0aWNhbCBlZGdlcyBvZiBhIGx1bWEgbWFjcm9ibG9jayAoMTZ4MTYpLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIAotICogICBzcmNkc3RTdGVwIC0gaW1hZ2Ugd2lkdGg7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgIHBBbHBoYSAtIHBvaW50ZXIgdG8gYSAyeDIgdGFibGUgb2YgYWxwaGEgdGhyZXNob2xkcywgb3JnYW5pemVkIGFzIAotICogICAgICAgICAgICBmb2xsb3dzOiB7ZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgdmVydGljYWwgZWRnZSwgCi0gKiAgICAgICAgICAgIGV4dGVybmFsIGhvcml6b250YWwgZWRnZSwgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlIH0uICBQZXIgCi0gKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gYWxwaGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1NV0uIAotICogICBwQmV0YSAtIHBvaW50ZXIgdG8gYSAyeDIgdGFibGUgb2YgYmV0YSB0aHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgZm9sbG93czogCi0gKiAgICAgICAgICAgIHtleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBleHRlcm5hbCAKLSAqICAgICAgICAgICAgaG9yaXpvbnRhbCBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfS4gIFBlciBbSVNPMTQ0OTYtMTBdIAotICogICAgICAgICAgICBiZXRhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAotICogICBwVGhyZXNob2xkcyAtIHBvaW50ZXIgdG8gYSAxNngyIHRhYmxlIG9mIHRocmVzaG9sZCAoVEMwKSwgb3JnYW5pemVkIGFzIAotICogICAgICAgICAgICBmb2xsb3dzOiB7dmFsdWVzIGZvciB0aGUgbGVmdCBvciBhYm92ZSBlZGdlIG9mIGVhY2ggNHg0IGJsb2NrLCAKLSAqICAgICAgICAgICAgYXJyYW5nZWQgaW4gdmVydGljYWwgYmxvY2sgb3JkZXIgYW5kIHRoZW4gaW4gaG9yaXpvbnRhbCBibG9jayAKLSAqICAgICAgICAgICAgb3JkZXJ9OyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBQZXIgW0lTTzE0NDk2LTEwXSAKLSAqICAgICAgICAgICAgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCi0gKiAgIHBCUyAtIHBvaW50ZXIgdG8gYSAxNngyIHRhYmxlIG9mIEJTIHBhcmFtZXRlcnMgYXJyYW5nZWQgaW4gc2NhbiBibG9jayAKLSAqICAgICAgICAgICAgb3JkZXIgZm9yIHZlcnRpY2FsIGVkZ2VzIGFuZCB0aGVuIGhvcml6b250YWwgZWRnZXM7IHZhbGlkIGluIHRoZSAKLSAqICAgICAgICAgICAgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgCi0gKiAgICAgICAgICAgIG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjNdPT0gCi0gKiAgICAgICAgICAgIDQuIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMgCi0gKiAgICAtICAgICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QsIHBBbHBoYSwgCi0gKiAgICAgICAgICAgICAgcEJldGEsIHBUaHJlc2hvbGRzIG9yIHBCUy4gCi0gKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIGVpdGhlciBwVGhyZXNob2xkcyBvciBwQlMgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAotICogICAgLSAgICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwQWxwaGFbMC4uM10gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgCi0gKiAgICAgICAgICAgICAgWzAsMjU1XS4gCi0gKiAgICAtICAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBCZXRhWzAuLjNdIGlzIG91dHNpZGUgdGhlIHJhbmdlIAotICogICAgICAgICAgICAgIFswLDE4XS4gCi0gKiAgICAtICAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjMxXWlzIG91dHNpZGUgb2YgCi0gKiAgICAgICAgICAgICAgdGhlIHJhbmdlIFswLDI1XS4gCi0gKiAgICAtICAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAgICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIAotICogICAgICAgICAgICAgKHBCU1tpXT09NCAmJiBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAotICogICAgLSAgICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kgKAotICAgIE9NWF9VOCAqcFNyY0RzdCwKLSAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCi0gICAgY29uc3QgT01YX1U4ICpwQWxwaGEsCi0gICAgY29uc3QgT01YX1U4ICpwQmV0YSwKLSAgICBjb25zdCBPTVhfVTggKnBUaHJlc2hvbGRzLAotICAgIGNvbnN0IE9NWF9VOCAqcEJTCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JICAgKDYuMy4zLjMuNikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2tpbmcgZmlsdGVyaW5nIG9uIGFsbCBlZGdlcyBvZiB0aGUgY2hyb21hIAotICogbWFjcm9ibG9jayAoMTZ4MTYpLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4gCi0gKiAgIHNyY2RzdFN0ZXAgLSBzdGVwIG9mIHRoZSBhcnJheXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgcEFscGhhIC0gcG9pbnRlciB0byBhIDJ4MiBhcnJheSBvZiBhbHBoYSB0aHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgCi0gKiAgICAgICAgICAgIGZvbGxvd3M6IHtleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCAKLSAqICAgICAgICAgICAgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfS4gIFBlciAKLSAqICAgICAgICAgICAgW0lTTzE0NDk2LTEwXSBhbHBoYSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjU1XS4gCi0gKiAgIHBCZXRhIC0gcG9pbnRlciB0byBhIDJ4MiBhcnJheSBvZiBCZXRhIFRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyBmb2xsb3dzOiAKLSAqICAgICAgICAgICAgeyBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBleHRlcm5hbCAKLSAqICAgICAgICAgICAgaG9yaXpvbnRhbCBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfS4gIFBlciBbSVNPMTQ0OTYtMTBdIAotICogICAgICAgICAgICBiZXRhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAotICogICBwVGhyZXNob2xkcyAtIGFycmF5IG9mIHNpemUgOHgyIG9mIFRocmVzaG9sZHMgKFRDMCkgKHZhbHVlcyBmb3IgdGhlIGxlZnQgCi0gKiAgICAgICAgICAgIG9yIGFib3ZlIGVkZ2Ugb2YgZWFjaCA0eDIgb3IgMng0IGJsb2NrLCBhcnJhbmdlZCBpbiB2ZXJ0aWNhbCAKLSAqICAgICAgICAgICAgYmxvY2sgb3JkZXIgYW5kIHRoZW4gaW4gaG9yaXpvbnRhbCBibG9jayBvcmRlcik7IG11c3QgYmUgYWxpZ25lZCAKLSAqICAgICAgICAgICAgb24gYSA0LWJ5dGUgYm91bmRhcnkuIFBlciBbSVNPMTQ0OTYtMTBdIHZhbHVlcyBtdXN0IGJlIGluIHRoZSAKLSAqICAgICAgICAgICAgcmFuZ2UgWzAsMjVdLiAKLSAqICAgcEJTIC0gYXJyYXkgb2Ygc2l6ZSAxNngyIG9mIEJTIHBhcmFtZXRlcnMgKGFycmFuZ2VkIGluIHNjYW4gYmxvY2sgb3JkZXIgCi0gKiAgICAgICAgICAgIGZvciB2ZXJ0aWNhbCBlZGdlcyBhbmQgdGhlbiBob3Jpem9udGFsIGVkZ2VzKTsgdmFsaWQgaW4gdGhlIAotICogICAgICAgICAgICByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSAKLSAqICAgICAgICAgICAgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leM109PSAKLSAqICAgICAgICAgICAgNC4gIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMgCi0gKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjRHN0LCBwQWxwaGEsIAotICogICAgICAgICAgICAgIHBCZXRhLCBwVGhyZXNob2xkcywgb3IgcEJTLiAKLSAqICAgIC0gICBwU3JjRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgZWl0aGVyIHBUaHJlc2hvbGRzIG9yIHBCUyBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBBbHBoYVswLi4zXSBpcyBvdXRzaWRlIHRoZSByYW5nZSAKLSAqICAgICAgICAgICAgICBbMCwyNTVdLiAKLSAqICAgIC0gICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwQmV0YVswLi4zXSBpcyBvdXRzaWRlIHRoZSByYW5nZSAKLSAqICAgICAgICAgICAgICBbMCwxOF0uIAotICogICAgLSAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjE1XWlzIG91dHNpZGUgb2YgCi0gKiAgICAgICAgICAgICAgdGhlIHJhbmdlIFswLDI1XS4gCi0gKiAgICAtICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgIGZvciBpPj00LCBvciAKLSAqICAgICAgICAgICAgKHBCU1tpXT09NCAmJiBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAotICogICAgLSAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kgKAotICAgIE9NWF9VOCAqcFNyY0RzdCwKLSAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCi0gICAgY29uc3QgT01YX1U4ICpwQWxwaGEsCi0gICAgY29uc3QgT01YX1U4ICpwQmV0YSwKLSAgICBjb25zdCBPTVhfVTggKnBUaHJlc2hvbGRzLAotICAgIGNvbnN0IE9NWF9VOCAqcEJTCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQyAgICg2LjMuNC4xLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBDQVZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSByYXN0ZXIgc2NhbiBmb3IgYSAyeDIgYmxvY2sgb2YgCi0gKiBDaHJvbWFEQ0xldmVsLiAgVGhlIGRlY29kZWQgY29lZmZpY2llbnRzIGluIHRoZSBwYWNrZWQgcG9zaXRpb24tY29lZmZpY2llbnQgCi0gKiBidWZmZXIgYXJlIHN0b3JlZCBpbiByZXZlcnNlIHppZy16YWcgb3JkZXIsIGkuZS4sIHRoZSBmaXJzdCBidWZmZXIgZWxlbWVudCAKLSAqIGNvbnRhaW5zIHRoZSBsYXN0IG5vbi16ZXJvIHBvc3Rpb24tY29lZmZpY2llbnQgcGFpciBvZiB0aGUgYmxvY2suIFdpdGhpbiAKLSAqIGVhY2ggcG9zaXRpb24tY29lZmZpY2llbnQgcGFpciwgdGhlIHBvc2l0aW9uIGVudHJ5IGluZGljYXRlcyB0aGUgCi0gKiByYXN0ZXItc2NhbiBwb3NpdGlvbiBvZiB0aGUgY29lZmZpY2llbnQsIHdoaWxlIHRoZSBjb2VmZmljaWVudCBlbnRyeSAKLSAqIGNvbnRhaW5zIHRoZSBjb2VmZmljaWVudCB2YWx1ZS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSBEb3VibGUgcG9pbnRlciB0byBjdXJyZW50IGJ5dGUgaW4gYml0IHN0cmVhbSBidWZmZXIgCi0gKiAgIHBPZmZzZXQgLSBQb2ludGVyIHRvIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgdG8gYnkgCi0gKiAgICAgICAgICAgICpwcEJpdFN0cmVhbTsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDddLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQgCi0gKiAgIHBPZmZzZXQgLSAqcE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZCAKLSAqICAgcE51bUNvZWZmIC0gUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIG5vbnplcm8gY29lZmZpY2llbnRzIGluIHRoaXMgYmxvY2sgCi0gKiAgIHBwUG9zQ29lZkJ1ZiAtIERvdWJsZSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIHJlc2lkdWFsIAotICogICAgICAgICAgICBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlci4gIEJ1ZmZlciBwb3NpdGlvbiAKLSAqICAgICAgICAgICAgKCpwcFBvc0NvZWZCdWYpIGlzIHVwZGF0ZWQgdXBvbiByZXR1cm4sIHVubGVzcyB0aGVyZSBhcmUgb25seSAKLSAqICAgICAgICAgICAgemVybyBjb2VmZmljaWVudHMgaW4gdGhlIGN1cnJlbnRseSBkZWNvZGVkIGJsb2NrLiAgSW4gdGhpcyBjYXNlIAotICogICAgICAgICAgICB0aGUgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIGJ5cGFzcyB0aGUgdHJhbnNmb3JtL2RlcXVhbnRpemF0aW9uIG9mIAotICogICAgICAgICAgICB0aGUgZW1wdHkgYmxvY2tzLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBwcEJpdFN0cmVhbSBvciBwT2Zmc2V0IGlzIE5VTEwuIAotICogICAgLSAgICBwcFBvc0NvZWZCdWYgb3IgcE51bUNvZWZmIGlzIE5VTEwuIAotICogICAgT01YX1N0c19FcnIgLSBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYW4gaWxsZWdhbCBjb2RlIGlzIGVuY291bnRlcmVkIGluIHRoZSBiaXRzdHJlYW0gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDICgKLSAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICBPTVhfUzMyKnBPZmZzZXQsCi0gICAgT01YX1U4ICpwTnVtQ29lZmYsCi0gICAgT01YX1U4ICoqcHBQb3NDb2VmYnVmCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMgICAoNi4zLjQuMS4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgQ0FWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gZm9yIDR4NCBibG9jayBvZiAKLSAqIEludHJhMTZ4MTZEQ0xldmVsLCBJbnRyYTE2eDE2QUNMZXZlbCwgTHVtYUxldmVsLCBhbmQgQ2hyb21hQUNMZXZlbC4gSW52ZXJzZSAKLSAqIGZpZWxkIHNjYW4gaXMgbm90IHN1cHBvcnRlZC4gVGhlIGRlY29kZWQgY29lZmZpY2llbnRzIGluIHRoZSBwYWNrZWQgCi0gKiBwb3NpdGlvbi1jb2VmZmljaWVudCBidWZmZXIgYXJlIHN0b3JlZCBpbiByZXZlcnNlIHppZy16YWcgb3JkZXIsIGkuZS4sIHRoZSAKLSAqIGZpcnN0IGJ1ZmZlciBlbGVtZW50IGNvbnRhaW5zIHRoZSBsYXN0IG5vbi16ZXJvIHBvc3Rpb24tY29lZmZpY2llbnQgcGFpciBvZiAKLSAqIHRoZSBibG9jay4gV2l0aGluIGVhY2ggcG9zaXRpb24tY29lZmZpY2llbnQgcGFpciwgdGhlIHBvc2l0aW9uIGVudHJ5IAotICogaW5kaWNhdGVzIHRoZSByYXN0ZXItc2NhbiBwb3NpdGlvbiBvZiB0aGUgY29lZmZpY2llbnQsIHdoaWxlIHRoZSAKLSAqIGNvZWZmaWNpZW50IGVudHJ5IGNvbnRhaW5zIHRoZSBjb2VmZmljaWVudCB2YWx1ZS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLURvdWJsZSBwb2ludGVyIHRvIGN1cnJlbnQgYnl0ZSBpbiBiaXQgc3RyZWFtIGJ1ZmZlciAKLSAqICAgcE9mZnNldCAtIFBvaW50ZXIgdG8gY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCB0byBieSAKLSAqICAgICAgICAgICAgKnBwQml0U3RyZWFtOyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsN10uIAotICogICBzTWF4TnVtQ29lZmYgLSBNYXhpbXVtIHRoZSBudW1iZXIgb2Ygbm9uLXplcm8gY29lZmZpY2llbnRzIGluIGN1cnJlbnQgCi0gKiAgICAgICAgICAgIGJsb2NrIAotICogICBzVkxDU2VsZWN0IC0gVkxDIHRhYmxlIHNlbGVjdG9yLCBvYnRhaW5lZCBmcm9tIHRoZSBudW1iZXIgb2Ygbm9uLXplcm8gCi0gKiAgICAgICAgICAgIGNvZWZmaWNpZW50cyBjb250YWluZWQgaW4gdGhlIGFib3ZlIGFuZCBsZWZ0IDR4NCBibG9ja3MuICBJdCBpcyAKLSAqICAgICAgICAgICAgZXF1aXZhbGVudCB0byB0aGUgdmFyaWFibGUgbkMgZGVzY3JpYmVkIGluIEguMjY0IHN0YW5kYXJkIHRhYmxlIAotICogICAgICAgICAgICA5IDUsIGV4Y2VwdCBpdHMgdmFsdWUgY2FuIHQgYmUgbGVzcyB0aGFuIHplcm8uIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZC4gIAotICogICAgICAgICAgICBCdWZmZXIgcG9zaXRpb24gKCpwcFBvc0NvZWZCdWYpIGlzIHVwZGF0ZWQgdXBvbiByZXR1cm4sIHVubGVzcyAKLSAqICAgICAgICAgICAgdGhlcmUgYXJlIG9ubHkgemVybyBjb2VmZmljaWVudHMgaW4gdGhlIGN1cnJlbnRseSBkZWNvZGVkIGJsb2NrLiAKLSAqICAgICAgICAgICAgIEluIHRoaXMgY2FzZSB0aGUgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIGJ5cGFzcyB0aGUgCi0gKiAgICAgICAgICAgIHRyYW5zZm9ybS9kZXF1YW50aXphdGlvbiBvZiB0aGUgZW1wdHkgYmxvY2tzLiAKLSAqICAgcE9mZnNldCAtICpwT2Zmc2V0IGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkIAotICogICBwTnVtQ29lZmYgLSBQb2ludGVyIHRvIHRoZSBudW1iZXIgb2Ygbm9uemVybyBjb2VmZmljaWVudHMgaW4gdGhpcyBibG9jayAKLSAqICAgcHBQb3NDb2VmQnVmIC0gRG91YmxlIHBvaW50ZXIgdG8gZGVzdGluYXRpb24gcmVzaWR1YWwgCi0gKiAgICAgICAgICAgIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgcHBCaXRTdHJlYW0gb3IgcE9mZnNldCBpcyBOVUxMLiAKLSAqICAgIC0gICAgcHBQb3NDb2VmQnVmIG9yIHBOdW1Db2VmZiBpcyBOVUxMLiAKLSAqICAgIC0gICAgc01heE51bUNvZWZmIGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgMTUgb3IgMTYuIAotICogICAgLSAgICBzVkxDU2VsZWN0IGlzIGxlc3MgdGhhbiAwLiAKLSAqCi0gKiAgICBPTVhfU3RzX0VyciAtIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6IAotICogICAgLSAgICBhbiBpbGxlZ2FsIGNvZGUgaXMgZW5jb3VudGVyZWQgaW4gdGhlIGJpdHN0cmVhbSAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDICgKLSAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICBPTVhfUzMyICpwT2Zmc2V0LAotICAgIE9NWF9VOCAqcE51bUNvZWZmLAotICAgIE9NWF9VOCAqKnBwUG9zQ29lZmJ1ZiwKLSAgICBPTVhfSU5UIHNWTENTZWxlY3QsCi0gICAgT01YX0lOVCBzTWF4TnVtQ29lZmYKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIgICAoNi4zLjQuMi4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUmVjb25zdHJ1Y3RzIHRoZSA0eDQgTHVtYURDIGJsb2NrIGZyb20gdGhlIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgCi0gKiBidWZmZXIsIHBlcmZvcm1zIGludGVnZXIgaW52ZXJzZSwgYW5kIGRlcXVhbnRpemF0aW9uIGZvciA0eDQgTHVtYURDIAotICogY29lZmZpY2llbnRzLCBhbmQgdXBkYXRlcyB0aGUgcGFpciBidWZmZXIgcG9pbnRlciB0byB0aGUgbmV4dCBub24tZW1wdHkgCi0gKiBibG9jay4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBTcmMgLSBEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciAKLSAqICAgICAgICAgICAgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nIAotICogICBRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXIgUXBZIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcFNyYyAtICpwcFNyYyBpcyB1cGRhdGVkIHRvIHRoZSBzdGFydCBvZiBuZXh0IG5vbiBlbXB0eSBibG9jayAKLSAqICAgcERzdCAtIFBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgNHg0IEx1bWFEQyBjb2VmZmljaWVudHMgYnVmZmVyOyBtdXN0IAotICogICAgICAgICAgICBiZSBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBwcFNyYyBvciBwRHN0IGlzIE5VTEwuIAotICogICAgLSAgICBwRHN0IGlzIG5vdCA4IGJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIFFQIGlzIG5vdCBpbiB0aGUgcmFuZ2Ugb2YgWzAtNTFdLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpciAoCi0gICAgY29uc3QgT01YX1U4ICoqcHBTcmMsCi0gICAgT01YX1MxNiAqcERzdCwKLSAgICBPTVhfSU5UIFFQCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIgICAoNi4zLjQuMi4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUmVjb25zdHJ1Y3QgdGhlIDJ4MiBDaHJvbWFEQyBibG9jayBmcm9tIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyLCAKLSAqIHBlcmZvcm0gaW50ZWdlciBpbnZlcnNlIHRyYW5zZm9ybWF0aW9uLCBhbmQgZGVxdWFudGl6YXRpb24gZm9yIDJ4MiBjaHJvbWEgCi0gKiBEQyBjb2VmZmljaWVudHMsIGFuZCB1cGRhdGUgdGhlIHBhaXIgYnVmZmVyIHBvaW50ZXIgdG8gbmV4dCBub24tZW1wdHkgCi0gKiBibG9jay4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBTcmMgLSBEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciAKLSAqICAgICAgICAgICAgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nIAotICogICBRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXIgUXBDIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcFNyYyAtICpwcFNyYyBpcyB1cGRhdGVkIHRvIHRoZSBzdGFydCBvZiBuZXh0IG5vbiBlbXB0eSBibG9jayAKLSAqICAgcERzdCAtIFBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgMngyIENocm9tYURDIGNvZWZmaWNpZW50cyBidWZmZXI7IAotICogICAgICAgICAgICBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIHBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCi0gKiAgICAtICAgIHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgUVAgaXMgbm90IGluIHRoZSByYW5nZSBvZiBbMC01MV0uIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIgKAotICAgIGNvbnN0IE9NWF9VOCAqKnBwU3JjLAotICAgIE9NWF9TMTYgKnBEc3QsCi0gICAgT01YX0lOVCBRUAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkICAgKDYuMy40LjIuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFJlY29uc3RydWN0IHRoZSA0eDQgcmVzaWR1YWwgYmxvY2sgZnJvbSBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciwgCi0gKiBwZXJmb3JtIGRlcXVhbnRpemF0aW9uIGFuZCBpbnRlZ2VyIGludmVyc2UgdHJhbnNmb3JtYXRpb24gZm9yIDR4NCBibG9jayBvZiAKLSAqIHJlc2lkdWFscyB3aXRoIHByZXZpb3VzIGludHJhIHByZWRpY3Rpb24gb3IgbW90aW9uIGNvbXBlbnNhdGlvbiBkYXRhLCBhbmQgCi0gKiB1cGRhdGUgdGhlIHBhaXIgYnVmZmVyIHBvaW50ZXIgdG8gbmV4dCBub24tZW1wdHkgYmxvY2suIElmIHBEQyA9PSBOVUxMLCAKLSAqIHRoZXJlIHJlIDE2IG5vbi16ZXJvIEFDIGNvZWZmaWNpZW50cyBhdCBtb3N0IGluIHRoZSBwYWNrZWQgYnVmZmVyIHN0YXJ0aW5nIAotICogZnJvbSA0eDQgYmxvY2sgcG9zaXRpb24gMDsgSWYgcERDICE9IE5VTEwsIHRoZXJlIHJlIDE1IG5vbi16ZXJvIEFDIAotICogY29lZmZpY2llbnRzIGF0IG1vc3QgaW4gdGhlIHBhY2tldCBidWZmZXIgc3RhcnRpbmcgZnJvbSA0eDQgYmxvY2sgcG9zaXRpb24gCi0gKiAxLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcFNyYyAtIERvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyIAotICogICAgICAgICAgICBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcgCi0gKiAgIHBQcmVkIC0gUG9pbnRlciB0byB0aGUgcHJlZGljdGVkIDR4NCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeSAKLSAqICAgcHJlZFN0ZXAgLSBQcmVkaWN0ZWQgZnJhbWUgc3RlcCBzaXplIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAKLSAqICAgZHN0U3RlcCAtIERlc3RpbmF0aW9uIGZyYW1lIHN0ZXAgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IAotICogICBwREMgLSBQb2ludGVyIHRvIHRoZSBEQyBjb2VmZmljaWVudCBvZiB0aGlzIGJsb2NrLCBOVUxMIGlmIGl0IGRvZXNuJ3QgCi0gKiAgICAgICAgICAgIGV4aXN0IAotICogICBRUCAtIFFQIFF1YW50aXphdGlvbiBwYXJhbWV0ZXIuICBJdCBzaG91bGQgYmUgUXBDIGluIGNocm9tYSA0eDQgYmxvY2sgCi0gKiAgICAgICAgICAgIGRlY29kaW5nLCBvdGhlcndpc2UgaXQgc2hvdWxkIGJlIFFwWS4gCi0gKiAgIEFDIC0gRmxhZyBpbmRpY2F0aW5nIGlmIGF0IGxlYXN0IG9uZSBub24temVybyBBQyBjb2VmZmljaWVudCBleGlzdHMgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIDR4NCBibG9jayBkYXRhOyBtdXN0IGJlIGFsaWduZWQgb24gYSAKLSAqICAgICAgICAgICAgNC1ieXRlIGJvdW5kYXJ5IAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIHBQcmVkIG9yIHBEc3QgaXMgTlVMTC4gCi0gKiAgICAtICAgIHBQcmVkIG9yIHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgcHJlZFN0ZXAgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgIC0gICAgQUMgIT0wIGFuZCBRcCBpcyBub3QgaW4gdGhlIHJhbmdlIG9mIFswLTUxXSBvciBwcFNyYyA9PSBOVUxMLiAKLSAqICAgIC0gICAgQUMgPT0wICYmIHBEQyA9PU5VTEwuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQgKAotICAgIGNvbnN0IE9NWF9VOCAqKnBwU3JjLAotICAgIGNvbnN0IE9NWF9VOCAqcFByZWQsCi0gICAgY29uc3QgT01YX1MxNiAqcERDLAotICAgIE9NWF9VOCAqcERzdCwKLSAgICBPTVhfSU5UIHByZWRTdGVwLAotICAgIE9NWF9JTlQgZHN0U3RlcCwKLSAgICBPTVhfSU5UIFFQLAotICAgIE9NWF9JTlQgQUMKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9NRUdldEJ1ZlNpemUgICAoNi4zLjUuMS4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29tcHV0ZXMgdGhlIHNpemUsIGluIGJ5dGVzLCBvZiB0aGUgdmVuZG9yLXNwZWNpZmljIHNwZWNpZmljYXRpb24gCi0gKiBzdHJ1Y3R1cmUgZm9yIHRoZSBvbXhWQ000UDEwIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9ucyBCbG9ja01hdGNoX0ludGVnZXIgCi0gKiBhbmQgTW90aW9uRXN0aW1hdGlvbk1CLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBNRW1vZGUgLSBtb3Rpb24gZXN0aW1hdGlvbiBtb2RlOyBhdmFpbGFibGUgbW9kZXMgYXJlIGRlZmluZWQgYnkgdGhlIAotICogICAgICAgICAgICBlbnVtZXJhdGVkIHR5cGUgT01YVkNNNFAxME1FTW9kZSAKLSAqICAgcE1FUGFyYW1zIC1tb3Rpb24gZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU2l6ZSAtIHBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCBmb3IgdGhlIG1vdGlvbiAKLSAqICAgICAgICAgICAgZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBwTUVQYXJhbXMgb3IgcFNpemUgaXMgTlVMTC4gCi0gKiAgICAtICAgIGFuIGludmFsaWQgTUVNb2RlIGlzIHNwZWNpZmllZC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9NRUdldEJ1ZlNpemUgKAotICAgIE9NWFZDTTRQMTBNRU1vZGUgTUVtb2RlLAotICAgIGNvbnN0IE9NWFZDTTRQMTBNRVBhcmFtcyAqcE1FUGFyYW1zLAotICAgIE9NWF9VMzIgKnBTaXplCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfTUVJbml0ICAgKDYuMy41LjEuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIEluaXRpYWxpemVzIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgcmVxdWlyZWQgZm9yIHRoZSAKLSAqIG9teFZDTTRQMTAgbW90aW9uIGVzdGltYXRpb24gZnVuY3Rpb25zOiAgQmxvY2tNYXRjaF9JbnRlZ2VyIGFuZCAKLSAqIE1vdGlvbkVzdGltYXRpb25NQi4gTWVtb3J5IGZvciB0aGUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgKnBNRVNwZWMgbXVzdCBiZSAKLSAqIGFsbG9jYXRlZCBwcmlvciB0byBjYWxsaW5nIHRoZSBmdW5jdGlvbiwgYW5kIHNob3VsZCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAotICogYm91bmRhcnkuICBUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgY2FuIAotICogYmUgZGV0ZXJtaW5lZCB1c2luZyB0aGUgZnVuY3Rpb24gb214VkNNNFAxMF9NRUdldEJ1ZlNpemUuIEZvbGxvd2luZyAKLSAqIGluaXRpYWxpemF0aW9uIGJ5IHRoaXMgZnVuY3Rpb24sIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3RydWN0dXJlICpwTUVTcGVjIAotICogc2hvdWxkIGNvbnRhaW4gYW4gaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgcmVwcmVzZW50YXRpb24gb2YgYWxsIG1vdGlvbiAKLSAqIGVzdGltYXRpb24gcGFyYW1ldGVycyByZWNlaXZlZCB2aWEgdGhlIHN0cnVjdHVyZSBwTUVQYXJhbXMsIGZvciBleGFtcGxlICAKLSAqIHNlYXJjaFJhbmdlMTZ4MTYsIHNlYXJjaFJhbmdlOHg4LCBldGMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIE1FbW9kZSAtIG1vdGlvbiBlc3RpbWF0aW9uIG1vZGU7IGF2YWlsYWJsZSBtb2RlcyBhcmUgZGVmaW5lZCBieSB0aGUgCi0gKiAgICAgICAgICAgIGVudW1lcmF0ZWQgdHlwZSBPTVhWQ000UDEwTUVNb2RlIAotICogICBwTUVQYXJhbXMgLSBtb3Rpb24gZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIAotICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgdW5pbml0aWFsaXplZCBNRSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIGluaXRpYWxpemVkIE1FIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIHBNRVBhcmFtcyBvciBwU2l6ZSBpcyBOVUxMLiAKLSAqICAgIC0gICAgYW4gaW52YWxpZCB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciB0aGUgcGFyYW1ldGVyIE1FbW9kZSAKLSAqICAgIC0gICAgYSBuZWdhdGl2ZSBvciB6ZXJvIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIG9uZSBvZiB0aGUgc2VhcmNoIHJhbmdlcyAKLSAqICAgICAgICAgKGUuZy4sICBwTUJQYXJhbXMgPnNlYXJjaFJhbmdlOHg4LCBwTUVQYXJhbXMtPnNlYXJjaFJhbmdlMTZ4MTYsIGV0Yy4pIAotICogICAgLSAgICBlaXRoZXIgaW4gaXNvbGF0aW9uIG9yIGluIGNvbWJpbmF0aW9uLCBvbmUgb3IgbW9yZSBvZiB0aGUgZW5hYmxlcyBvciAKLSAqICAgICAgICAgc2VhcmNoIHJhbmdlcyBpbiB0aGUgc3RydWN0dXJlICpwTUVQYXJhbXMgd2VyZSBjb25maWd1cmVkIHN1Y2ggCi0gKiAgICAgICAgIHRoYXQgdGhlIHJlcXVlc3RlZCBiZWhhdmlvciBmYWlscyB0byBjb21wbHkgd2l0aCBbSVNPMTQ0OTYtMTBdLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX01FSW5pdCAoCi0gICAgT01YVkNNNFAxME1FTW9kZSBNRW1vZGUsCi0gICAgY29uc3QgT01YVkNNNFAxME1FUGFyYW1zICpwTUVQYXJhbXMsCi0gICAgdm9pZCAqcE1FU3BlYwotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSW50ZWdlciAgICg2LjMuNS4yLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBpbnRlZ2VyIGJsb2NrIG1hdGNoLiAgUmV0dXJucyBiZXN0IE1WIGFuZCBhc3NvY2lhdGVkIGNvc3QuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNPcmdZIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjdXJyZW50IGJsb2NrOgotICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgcFNyY1JlZlkgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGNvLWxvY2F0ZWQgYmxvY2sgaW4gdGhlIAotICogICAgICAgICAgICByZWZlcmVuY2UgcGljdHVyZTogCi0gKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIAotICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuICAKLSAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIG5TcmNPcmdTdGVwIC0gU3RyaWRlIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lLCBleHByZXNzZWQgaW4gdGVybXMgCi0gKiAgICAgICAgICAgIG9mIGludGVnZXIgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgaUJsb2NrV2lkdGguIAotICogICBuU3JjUmVmU3RlcCAtIFN0cmlkZSBvZiB0aGUgcmVmZXJlbmNlIHBpY3R1cmUgcGxhbmUsIGV4cHJlc3NlZCBpbiB0ZXJtcyAKLSAqICAgICAgICAgICAgb2YgaW50ZWdlciBwaXhlbHMgCi0gKiAgIHBSZWZSZWN0IC0gcG9pbnRlciB0byB0aGUgdmFsaWQgcmVmZXJlbmNlIHJlY3RhbmdsZSBpbnNpZGUgdGhlIHJlZmVyZW5jZSAKLSAqICAgICAgICAgICAgcGljdHVyZSBwbGFuZSAKLSAqICAgbkN1cnJQb2ludFBvcyAtIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lIAotICogICBpQmxvY2tXaWR0aCAtIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrLCBleHByZXNzZWQgaW4gdGVybXMgb2YgaW50ZWdlciAKLSAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCi0gKiAgIGlCbG9ja0hlaWdodCAtIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jaywgZXhwcmVzc2VkIGluIHRlcm1zIG9mIAotICogICAgICAgICAgICBpbnRlZ2VyIHBpeGVsczsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAotICogICBuTGFtZGEgLSBMYW1kYSBmYWN0b3I7IHVzZWQgdG8gY29tcHV0ZSBtb3Rpb24gY29zdCAKLSAqICAgcE1WUHJlZCAtIFByZWRpY3RlZCBNVjsgdXNlZCB0byBjb21wdXRlIG1vdGlvbiBjb3N0LCBleHByZXNzZWQgaW4gdGVybXMgCi0gKiAgICAgICAgICAgIG9mIDEvNC1wZWwgdW5pdHMgCi0gKiAgIHBNVkNhbmRpZGF0ZSAtIENhbmRpZGF0ZSBNVjsgdXNlZCB0byBpbml0aWFsaXplIHRoZSBtb3Rpb24gc2VhcmNoLCAKLSAqICAgICAgICAgICAgZXhwcmVzc2VkIGluIHRlcm1zIG9mIGludGVnZXIgcGl4ZWxzIAotICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgTUUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RCZXN0TVYgLSBCZXN0IE1WIHJlc3VsdGluZyBmcm9tIGludGVnZXIgc2VhcmNoLCBleHByZXNzZWQgaW4gdGVybXMgCi0gKiAgICAgICAgICAgIG9mIDEvNC1wZWwgdW5pdHMgCi0gKiAgIHBCZXN0Q29zdCAtIE1vdGlvbiBjb3N0IGFzc29jaWF0ZWQgd2l0aCB0aGUgYmVzdCBNVjsgY29tcHV0ZWQgYXMgCi0gKiAgICAgICAgICAgIFNBRCtMYW1kYSpCaXRzVXNlZEJ5TVYgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgYW55IG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgYXJlIE5VTEw6Ci0gKiAgICAgICAgIHBTcmNPcmdZLCBwU3JjUmVmWSwgcFJlZlJlY3QsIHBNVlByZWQsIHBNVkNhbmRpZGF0ZSwgb3IgcE1FU3BlYy4gCi0gKiAgICAtICAgIEVpdGhlciBpQmxvY2tXaWR0aCBvciBpQmxvY2tIZWlnaHQgYXJlIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2LiAKLSAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNPcmdZLAotICAgIE9NWF9TMzIgblNyY09yZ1N0ZXAsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmWSwKLSAgICBPTVhfUzMyIG5TcmNSZWZTdGVwLAotICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAotICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCi0gICAgT01YX1U4IGlCbG9ja1dpZHRoLAotICAgIE9NWF9VOCBpQmxvY2tIZWlnaHQsCi0gICAgT01YX1UzMiBuTGFtZGEsCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBNVlByZWQsCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBNVkNhbmRpZGF0ZSwKLSAgICBPTVhWQ01vdGlvblZlY3RvciAqcEJlc3RNViwKLSAgICBPTVhfUzMyICpwQmVzdENvc3QsCi0gICAgdm9pZCAqcE1FU3BlYwotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZiAgICg2LjMuNS4yLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBhIGhhbGYtcGVsIGJsb2NrIG1hdGNoIHVzaW5nIHJlc3VsdHMgZnJvbSBhIHByaW9yIGludGVnZXIgc2VhcmNoLiAKLSAqICBSZXR1cm5zIHRoZSBiZXN0IE1WIGFuZCBhc3NvY2lhdGVkIGNvc3QuICBUaGlzIGZ1bmN0aW9uIGVzdGltYXRlcyB0aGUgCi0gKiBoYWxmLXBpeGVsIG1vdGlvbiB2ZWN0b3IgYnkgaW50ZXJwb2xhdGluZyB0aGUgaW50ZWdlciByZXNvbHV0aW9uIG1vdGlvbiAKLSAqIHZlY3RvciByZWZlcmVuY2VkIGJ5IHRoZSBpbnB1dCBwYXJhbWV0ZXIgcFNyY0RzdEJlc3RNViwgaS5lLiwgdGhlIGluaXRpYWwgCi0gKiBpbnRlZ2VyIE1WIGlzIGdlbmVyYXRlZCBleHRlcm5hbGx5LiAgVGhlIGZ1bmN0aW9uIAotICogb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIgbWF5IGJlIHVzZWQgZm9yIGludGVnZXIgbW90aW9uIGVzdGltYXRpb24uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNPcmdZIC0gUG9pbnRlciB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lOgotICogICAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgcFNyY1JlZlkgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGNvLWxvY2F0ZWQgYmxvY2sgaW4gdGhlIAotICogICAgICAgICAgICByZWZlcmVuY2UgcGljdHVyZTogIAotICogICAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIAotICogICAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIAotICogICAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBuU3JjT3JnU3RlcCAtIFN0cmlkZSBvZiB0aGUgb3JpZ2luYWwgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAotICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiBpQmxvY2tXaWR0aC4gCi0gKiAgIG5TcmNSZWZTdGVwIC0gU3RyaWRlIG9mIHRoZSByZWZlcmVuY2UgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAotICogICAgICAgICAgICBwaXhlbHMgCi0gKiAgIGlCbG9ja1dpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGVybXMgb2YgZnVsbCBwaXhlbHM7IG11c3QgCi0gKiAgICAgICAgICAgIGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCi0gKiAgIGlCbG9ja0hlaWdodCAtIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0ZXJtcyBvZiBmdWxsIHBpeGVsczsgbXVzdCAKLSAqICAgICAgICAgICAgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKLSAqICAgbkxhbWRhIC0gTGFtZGEgZmFjdG9yLCB1c2VkIHRvIGNvbXB1dGUgbW90aW9uIGNvc3QgCi0gKiAgIHBNVlByZWQgLSBQcmVkaWN0ZWQgTVYsIHJlcHJlc2VudGVkIGluIHRlcm1zIG9mIDEvNC1wZWwgdW5pdHM7IHVzZWQgdG8gCi0gKiAgICAgICAgICAgIGNvbXB1dGUgbW90aW9uIGNvc3QgCi0gKiAgIHBTcmNEc3RCZXN0TVYgLSBUaGUgYmVzdCBNViByZXN1bHRpbmcgZnJvbSBhIHByaW9yIGludGVnZXIgc2VhcmNoLCAKLSAqICAgICAgICAgICAgcmVwcmVzZW50ZWQgaW4gdGVybXMgb2YgMS80LXBlbCB1bml0cyAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdEJlc3RNViAtIEJlc3QgTVYgcmVzdWx0aW5nIGZyb20gdGhlIGhhbGYtcGVsIHNlYXJjaCwgZXhwcmVzc2VkIGluIAotICogICAgICAgICAgICB0ZXJtcyBvZiAxLzQtcGVsIHVuaXRzIAotICogICBwQmVzdENvc3QgLSBNb3Rpb24gY29zdCBhc3NvY2lhdGVkIHdpdGggdGhlIGJlc3QgTVY7IGNvbXB1dGVkIGFzIAotICogICAgICAgICAgICBTQUQrTGFtZGEqQml0c1VzZWRCeU1WIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIGFueSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNPcmdZLCBwU3JjUmVmWSwgCi0gKiAgICAgICAgICAgICAgcFNyY0RzdEJlc3RNViwgcE1WUHJlZCwgcEJlc3RDb3N0IAotICogICAgLSAgICBpQmxvY2tXaWR0aCBvciBpQmxvY2tIZWlnaHQgYXJlIGVxdWFsIHRvIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2LiAKLSAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNPcmdZLAotICAgIE9NWF9TMzIgblNyY09yZ1N0ZXAsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmWSwKLSAgICBPTVhfUzMyIG5TcmNSZWZTdGVwLAotICAgIE9NWF9VOCBpQmxvY2tXaWR0aCwKLSAgICBPTVhfVTggaUJsb2NrSGVpZ2h0LAotICAgIE9NWF9VMzIgbkxhbWRhLAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwTVZQcmVkLAotICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjRHN0QmVzdE1WLAotICAgIE9NWF9TMzIgKnBCZXN0Q29zdAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfUXVhcnRlciAgICg2LjMuNS4yLjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBhIHF1YXJ0ZXItcGVsIGJsb2NrIG1hdGNoIHVzaW5nIHJlc3VsdHMgZnJvbSBhIHByaW9yIGhhbGYtcGVsIAotICogc2VhcmNoLiAgUmV0dXJucyB0aGUgYmVzdCBNViBhbmQgYXNzb2NpYXRlZCBjb3N0LiAgVGhpcyBmdW5jdGlvbiBlc3RpbWF0ZXMgCi0gKiB0aGUgcXVhcnRlci1waXhlbCBtb3Rpb24gdmVjdG9yIGJ5IGludGVycG9sYXRpbmcgdGhlIGhhbGYtcGVsIHJlc29sdXRpb24gCi0gKiBtb3Rpb24gdmVjdG9yIHJlZmVyZW5jZWQgYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0QmVzdE1WLCBpLmUuLCB0aGUgCi0gKiBpbml0aWFsIGhhbGYtcGVsIE1WIGlzIGdlbmVyYXRlZCBleHRlcm5hbGx5LiAgVGhlIGZ1bmN0aW9uIAotICogb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYgbWF5IGJlIHVzZWQgZm9yIGhhbGYtcGVsIG1vdGlvbiBlc3RpbWF0aW9uLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjT3JnWSAtIFBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gb3JpZ2luYWwgcGljdHVyZSBwbGFuZToKLSAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIHBTcmNSZWZZIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjby1sb2NhdGVkIGJsb2NrIGluIHRoZSAKLSAqICAgICAgICAgICAgcmVmZXJlbmNlIHBpY3R1cmU6Ci0gKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIAotICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuICAKLSAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIG5TcmNPcmdTdGVwIC0gU3RyaWRlIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCi0gKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIGlCbG9ja1dpZHRoLiAKLSAqICAgblNyY1JlZlN0ZXAgLSBTdHJpZGUgb2YgdGhlIHJlZmVyZW5jZSBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCi0gKiAgICAgICAgICAgIHBpeGVscyAKLSAqICAgaUJsb2NrV2lkdGggLSBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0ZXJtcyBvZiBmdWxsIHBpeGVsczsgbXVzdCAKLSAqICAgICAgICAgICAgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKLSAqICAgaUJsb2NrSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRlcm1zIG9mIGZ1bGwgcGl4ZWxzOyBtdXN0IAotICogICAgICAgICAgICBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAotICogICBuTGFtZGEgLSBMYW1kYSBmYWN0b3IsIHVzZWQgdG8gY29tcHV0ZSBtb3Rpb24gY29zdCAKLSAqICAgcE1WUHJlZCAtIFByZWRpY3RlZCBNViwgcmVwcmVzZW50ZWQgaW4gdGVybXMgb2YgMS80LXBlbCB1bml0czsgdXNlZCB0byAKLSAqICAgICAgICAgICAgY29tcHV0ZSBtb3Rpb24gY29zdCAKLSAqICAgcFNyY0RzdEJlc3RNViAtIFRoZSBiZXN0IE1WIHJlc3VsdGluZyBmcm9tIGEgcHJpb3IgaGFsZi1wZWwgc2VhcmNoLCAKLSAqICAgICAgICAgICAgcmVwcmVzZW50ZWQgaW4gdGVybXMgb2YgMS80IHBlbCB1bml0cyAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdEJlc3RNViAtIEJlc3QgTVYgcmVzdWx0aW5nIGZyb20gdGhlIHF1YXJ0ZXItcGVsIHNlYXJjaCwgZXhwcmVzc2VkIAotICogICAgICAgICAgICBpbiB0ZXJtcyBvZiAxLzQtcGVsIHVuaXRzIAotICogICBwQmVzdENvc3QgLSBNb3Rpb24gY29zdCBhc3NvY2lhdGVkIHdpdGggdGhlIGJlc3QgTVY7IGNvbXB1dGVkIGFzIAotICogICAgICAgICAgICBTQUQrTGFtZGEqQml0c1VzZWRCeU1WIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIE9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBTcmNPcmdZLCBwU3JjUmVmWSwgcFNyY0RzdEJlc3RNViwgcE1WUHJlZCwgcEJlc3RDb3N0IAotICogICAgLSAgICBpQmxvY2tXaWR0aCBvciBpQmxvY2tIZWlnaHQgYXJlIGVxdWFsIHRvIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2LiAKLSAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfQmxvY2tNYXRjaF9RdWFydGVyICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNPcmdZLAotICAgIE9NWF9TMzIgblNyY09yZ1N0ZXAsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmWSwKLSAgICBPTVhfUzMyIG5TcmNSZWZTdGVwLAotICAgIE9NWF9VOCBpQmxvY2tXaWR0aCwKLSAgICBPTVhfVTggaUJsb2NrSGVpZ2h0LAotICAgIE9NWF9VMzIgbkxhbWRhLAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwTVZQcmVkLAotICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjRHN0QmVzdE1WLAotICAgIE9NWF9TMzIgKnBCZXN0Q29zdAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQiAgICg2LjMuNS4zLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBNQi1sZXZlbCBtb3Rpb24gZXN0aW1hdGlvbiBhbmQgc2VsZWN0cyBiZXN0IG1vdGlvbiBlc3RpbWF0aW9uIAotICogc3RyYXRlZ3kgZnJvbSB0aGUgc2V0IG9mIG1vZGVzIHN1cHBvcnRlZCBpbiBiYXNlbGluZSBwcm9maWxlIFtJU08xNDQ5Ni0xMF0uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNDdXJyQnVmIC0gUG9pbnRlciB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lOyAKLSAqICAgICAgICAgICAgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCi0gKiAgIHBTcmNSZWZCdWZMaXN0IC0gUG9pbnRlciB0byBhbiBhcnJheSB3aXRoIDE2IGVudHJpZXMuICBFYWNoIGVudHJ5IHBvaW50cyAKLSAqICAgICAgICAgICAgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY28tbG9jYXRlZCBNQiBpbiBhIHJlZmVyZW5jZSAKLSAqICAgICAgICAgICAgcGljdHVyZS4gIFRoZSBhcnJheSBpcyBmaWxsZWQgZnJvbSBsb3ctdG8taGlnaCB3aXRoIHZhbGlkIAotICogICAgICAgICAgICByZWZlcmVuY2UgZnJhbWUgcG9pbnRlcnM7IHRoZSB1bnVzZWQgaGlnaCBlbnRyaWVzIHNob3VsZCBiZSBzZXQgCi0gKiAgICAgICAgICAgIHRvIE5VTEwuICBPcmRlcmluZyBvZiB0aGUgcmVmZXJlbmNlIGZyYW1lcyBzaG91bGQgZm9sbG93IAotICogICAgICAgICAgICBbSVNPMTQ0OTYtMTBdIHN1YmNsYXVzZSA4LjIuNCAgRGVjb2RpbmcgUHJvY2VzcyBmb3IgUmVmZXJlbmNlIAotICogICAgICAgICAgICBQaWN0dXJlIExpc3RzLiAgIFRoZSBlbnRyaWVzIG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqICAgcFNyY1JlY0J1ZiAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY28tbG9jYXRlZCBNQiBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJlY29uc3RydWN0ZWQgcGljdHVyZTsgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIAotICogICBTcmNDdXJyU3RlcCAtIFdpZHRoIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCi0gKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgU3JjUmVmU3RlcCAtIFdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAotICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgIFNyY1JlY1N0ZXAgLSBXaWR0aCBvZiB0aGUgcmVjb25zdHJ1Y3RlZCBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCi0gKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgcFJlZlJlY3QgLSBQb2ludGVyIHRvIHRoZSB2YWxpZCByZWZlcmVuY2UgcmVjdGFuZ2xlOyByZWxhdGl2ZSB0byB0aGUgCi0gKiAgICAgICAgICAgIGltYWdlIG9yaWdpbi4gCi0gKiAgIHBDdXJyUG9pbnRQb3MgLSBQb3NpdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lLiAKLSAqICAgTGFtYmRhIC0gTGFncmFuZ2UgZmFjdG9yIGZvciBjb21wdXRpbmcgdGhlIGNvc3QgZnVuY3Rpb24gCi0gKiAgIHBNRVNwZWMgLSBQb2ludGVyIHRvIHRoZSBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZTsgbXVzdCAKLSAqICAgICAgICAgICAgaGF2ZSBiZWVuIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQgcHJpb3IgdG8gY2FsbGluZyB0aGlzIAotICogICAgICAgICAgICBmdW5jdGlvbi4gCi0gKiAgIHBNQkludGVyIC0gQXJyYXksIG9mIGRpbWVuc2lvbiBmb3VyLCBjb250YWluaW5nIHBvaW50ZXJzIHRvIGluZm9ybWF0aW9uIAotICogICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggZm91ciBhZGphY2VudCB0eXBlIElOVEVSIE1CcyAoTGVmdCwgVG9wLCAKLSAqICAgICAgICAgICAgVG9wLUxlZnQsIFRvcC1SaWdodCkuIEFueSBwb2ludGVyIGluIHRoZSBhcnJheSBtYXkgYmUgc2V0IGVxdWFsIAotICogICAgICAgICAgICB0byBOVUxMIGlmIHRoZSBjb3JyZXNwb25kaW5nIE1CIGRvZXNuIHQgZXhpc3Qgb3IgaXMgbm90IG9mIHR5cGUgCi0gKiAgICAgICAgICAgIElOVEVSLiAKLSAqICAgICAgICAgICAgLSAgcE1CSW50ZXJbMF0gLSBQb2ludGVyIHRvIGxlZnQgTUIgaW5mb3JtYXRpb24gCi0gKiAgICAgICAgICAgIC0gIHBNQkludGVyWzFdIC0gUG9pbnRlciB0byB0b3AgTUIgaW5mb3JtYXRpb24gCi0gKiAgICAgICAgICAgIC0gIHBNQkludGVyWzJdIC0gUG9pbnRlciB0byB0b3AtbGVmdCBNQiBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgLSAgcE1CSW50ZXJbM10gLSBQb2ludGVyIHRvIHRvcC1yaWdodCBNQiBpbmZvcm1hdGlvbiAKLSAqICAgcE1CSW50cmEgLSBBcnJheSwgb2YgZGltZW5zaW9uIGZvdXIsIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gaW5mb3JtYXRpb24gCi0gKiAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCBmb3VyIGFkamFjZW50IHR5cGUgSU5UUkEgTUJzIChMZWZ0LCBUb3AsIAotICogICAgICAgICAgICBUb3AtTGVmdCwgVG9wLVJpZ2h0KS4gQW55IHBvaW50ZXIgaW4gdGhlIGFycmF5IG1heSBiZSBzZXQgZXF1YWwgCi0gKiAgICAgICAgICAgIHRvIE5VTEwgaWYgdGhlIGNvcnJlc3BvbmRpbmcgTUIgZG9lc24gdCBleGlzdCBvciBpcyBub3Qgb2YgdHlwZSAKLSAqICAgICAgICAgICAgSU5UUkEuIAotICogICAgICAgICAgICAtICBwTUJJbnRyYVswXSAtIFBvaW50ZXIgdG8gbGVmdCBNQiBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgLSAgcE1CSW50cmFbMV0gLSBQb2ludGVyIHRvIHRvcCBNQiBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgLSAgcE1CSW50cmFbMl0gLSBQb2ludGVyIHRvIHRvcC1sZWZ0IE1CIGluZm9ybWF0aW9uIAotICogICAgICAgICAgICAtICBwTUJJbnRyYVszXSAtIFBvaW50ZXIgdG8gdG9wLXJpZ2h0IE1CIGluZm9ybWF0aW9uIAotICogICBwU3JjRHN0TUJDdXJyIC0gUG9pbnRlciB0byBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBjdXJyZW50IE1CLiAgCi0gKiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgZW50cmllcyBzaG91bGQgYmUgc2V0IHByaW9yIHRvIGNhbGxpbmcgdGhlIAotICogICAgICAgICAgICBmdW5jdGlvbjogIHNsaWNlSUQgLSB0aGUgbnVtYmVyIG9mIHRoZSBzbGljZSB0aGUgdG8gd2hpY2ggdGhlIAotICogICAgICAgICAgICBjdXJyZW50IE1CIGJlbG9uZ3MuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0Q29zdCAtIFBvaW50ZXIgdG8gdGhlIG1pbmltdW0gbW90aW9uIGNvc3QgZm9yIHRoZSBjdXJyZW50IE1CLiAKLSAqICAgcERzdEJsb2NrU0FEIC0gUG9pbnRlciB0byB0aGUgYXJyYXkgb2YgU0FEcyBmb3IgZWFjaCBvZiB0aGUgc2l4dGVlbiBsdW1hIAotICogICAgICAgICAgICA0eDQgYmxvY2tzIGluIGVhY2ggTUIuICBUaGUgYmxvY2sgU0FEcyBhcmUgaW4gc2NhbiBvcmRlciBmb3IgCi0gKiAgICAgICAgICAgIGVhY2ggTUIuICBGb3IgaW1wbGVtZW50YXRpb25zIHRoYXQgY2Fubm90IGNvbXB1dGUgdGhlIFNBRCB2YWx1ZXMgCi0gKiAgICAgICAgICAgIGluZGl2aWR1YWxseSwgdGhlIG1heGltdW0gcG9zc2libGUgdmFsdWUgKDB4ZmZmZikgaXMgcmV0dXJuZWQgCi0gKiAgICAgICAgICAgIGZvciBlYWNoIG9mIHRoZSAxNiBibG9jayBTQUQgZW50cmllcy4gCi0gKiAgIHBTcmNEc3RNQkN1cnIgLSBQb2ludGVyIHRvIHVwZGF0ZWQgaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciB0aGUgY3VycmVudCAKLSAqICAgICAgICAgICAgTUIgYWZ0ZXIgTUItbGV2ZWwgbW90aW9uIGVzdGltYXRpb24gaGFzIGJlZW4gY29tcGxldGVkLiAgVGhlIAotICogICAgICAgICAgICBmb2xsb3dpbmcgZmllbGRzIGFyZSB1cGRhdGVkIGJ5IHRoZSBNRSBmdW5jdGlvbi4gICBUaGUgZm9sbG93aW5nIAotICogICAgICAgICAgICBwYXJhbWV0ZXIgc2V0IHF1YW50aWZpZXMgdGhlIE1CLWxldmVsIE1FIHNlYXJjaCByZXN1bHRzOiAKLSAqICAgICAgICAgICAgLSAgTWJUeXBlIAotICogICAgICAgICAgICAtICBzdWJNQlR5cGVbNF0gCi0gKiAgICAgICAgICAgIC0gIHBNVjBbNF1bNF0gCi0gKiAgICAgICAgICAgIC0gIHBNVlByZWRbNF1bNF0gCi0gKiAgICAgICAgICAgIC0gIHBSZWZMMElkeFs0XSAKLSAqICAgICAgICAgICAgLSAgSW50cmExNngxNlByZWRNb2RlIAotICogICAgICAgICAgICAtICBwSW50cmE0eDRQcmVkTW9kZVs0XVs0XSAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgIE9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0N1cnJCdWYsIAotICogICAgICAgICAgIHBTcmNSZWZCdWZMaXN0LCBwU3JjUmVjQnVmLCBwUmVmUmVjdCwgcEN1cnJQb2ludFBvcywgcE1FU3BlYywgCi0gKiAgICAgICAgICAgcE1CSW50ZXIsIHBNQkludHJhLHBTcmNEc3RNQkN1cnIsIHBEc3RDb3N0LCBwU3JjUmVmQnVmTGlzdFswXSAKLSAqICAgIC0gICAgU3JjUmVmU3RlcCwgU3JjUmVjU3RlcCBhcmUgbm90IG11bHRpcGxlcyBvZiAxNiAKLSAqICAgIC0gICAgaUJsb2NrV2lkdGggb3IgaUJsb2NrSGVpZ2h0IGFyZSB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNi4gCi0gKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQiAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKLSAgICBPTVhfUzMyIFNyY0N1cnJTdGVwLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1Zkxpc3RbMTVdLAotICAgIE9NWF9TMzIgU3JjUmVmU3RlcCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWNCdWYsCi0gICAgT01YX1MzMiBTcmNSZWNTdGVwLAotICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAotICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCi0gICAgT01YX1UzMiBMYW1iZGEsCi0gICAgdm9pZCAqcE1FU3BlYywKLSAgICBjb25zdCBPTVhWQ000UDEwTUJJbmZvUHRyICpwTUJJbnRlciwKLSAgICBjb25zdCBPTVhWQ000UDEwTUJJbmZvUHRyICpwTUJJbnRyYSwKLSAgICBPTVhWQ000UDEwTUJJbmZvUHRyIHBTcmNEc3RNQkN1cnIsCi0gICAgT01YX0lOVCAqcERzdENvc3QsCi0gICAgT01YX1UxNiAqcERzdEJsb2NrU0FECi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU0FEXzR4ICAgKDYuMy41LjQuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGZvciA0eDggYW5kIDR4NCBibG9ja3MuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNPcmcgLVBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqICAgaVN0ZXBPcmcgLVN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAotICogICBwU3JjUmVmIC1Qb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sgCi0gKiAgIGlTdGVwUmVmIC1TdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyIAotICogICBpSGVpZ2h0IC1IZWlnaHQgb2YgdGhlIGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0IG9yIDguIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0U0FEIC1Qb2ludGVyIG9mIHJlc3VsdCBTQUQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgT25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcFNyY09yZywgcFNyY1JlZiwgb3IgcERzdFNBRCAKLSAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDQgb3IgOC4gCi0gKiAgICAtICAgIGlTdGVwT3JnIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCi0gKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1NBRF80eCAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjT3JnLAotICAgIE9NWF9VMzIgaVN0ZXBPcmcsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAotICAgIE9NWF9VMzIgaVN0ZXBSZWYsCi0gICAgT01YX1MzMiAqcERzdFNBRCwKLSAgICBPTVhfVTMyIGlIZWlnaHQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TQURRdWFyXzR4ICAgKDYuMy41LjQuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGJldHdlZW4gb25lIGJsb2NrIChwU3JjKSBhbmQgdGhlIGF2ZXJhZ2UgCi0gKiBvZiB0aGUgb3RoZXIgdHdvIChwU3JjUmVmMCBhbmQgcFNyY1JlZjEpIGZvciA0eDggb3IgNHg0IGJsb2Nrcy4gIFJvdW5kaW5nIAotICogaXMgYXBwbGllZCBhY2NvcmRpbmcgdG8gdGhlIGNvbnZlbnRpb24gKGErYisxKT4+MS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqICAgcFNyY1JlZjAgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAwIAotICogICBwU3JjUmVmMSAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiAgIGlTcmNTdGVwIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgIGlSZWZTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiAgIGlSZWZTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0IG9yIDguIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0U0FEIC0gUG9pbnRlciBvZiByZXN1bHQgU0FEIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA0IG9yIDguIAotICogICAgLSAgICBPbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBTcmNSZWYwLCAKLSAqICAgICAgICAgICAgICBwU3JjUmVmMSwgcERzdFNBRC4gCi0gKiAgICAtICAgIGlTcmNTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCi0gKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1NBRFF1YXJfNHggKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYwLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZjEsCi0gICAgT01YX1UzMiBpU3JjU3RlcCwKLSAgICBPTVhfVTMyIGlSZWZTdGVwMCwKLSAgICBPTVhfVTMyIGlSZWZTdGVwMSwKLSAgICBPTVhfVTMyICpwRHN0U0FELAotICAgIE9NWF9VMzIgaUhlaWdodAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1NBRFF1YXJfOHggICAoNi4zLjUuNC4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgYmV0d2VlbiBvbmUgYmxvY2sgKHBTcmMpIGFuZCB0aGUgYXZlcmFnZSAKLSAqIG9mIHRoZSBvdGhlciB0d28gKHBTcmNSZWYwIGFuZCBwU3JjUmVmMSkgZm9yIDh4MTYsIDh4OCwgb3IgOHg0IGJsb2Nrcy4gIAotICogUm91bmRpbmcgaXMgYXBwbGllZCBhY2NvcmRpbmcgdG8gdGhlIGNvbnZlbnRpb24gKGErYisxKT4+MS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKiAgIHBTcmNSZWYwIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMCAKLSAqICAgcFNyY1JlZjEgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAxIAotICogICBpU3JjU3RlcCAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBpUmVmU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAotICogICBpUmVmU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAotICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBibG9jazsgbXVzdCBiZSBlcXVhbCBlaXRoZXIgNCwgOCwgb3IgMTYuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0U0FEIC0gUG9pbnRlciBvZiByZXN1bHQgU0FEIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCi0gKiAgICAtICAgIE9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcFNyY1JlZjAsIAotICogICAgICAgICAgICAgIHBTcmNSZWYxLCBwRHN0U0FELiAKLSAqICAgIC0gICAgaVNyY1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOCAKLSAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfU0FEUXVhcl84eCAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZjAsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmMSwKLSAgICBPTVhfVTMyIGlTcmNTdGVwLAotICAgIE9NWF9VMzIgaVJlZlN0ZXAwLAotICAgIE9NWF9VMzIgaVJlZlN0ZXAxLAotICAgIE9NWF9VMzIgKnBEc3RTQUQsCi0gICAgT01YX1UzMiBpSGVpZ2h0Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU0FEUXVhcl8xNnggICAoNi4zLjUuNC40KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgYmV0d2VlbiBvbmUgYmxvY2sgKHBTcmMpIGFuZCB0aGUgYXZlcmFnZSAKLSAqIG9mIHRoZSBvdGhlciB0d28gKHBTcmNSZWYwIGFuZCBwU3JjUmVmMSkgZm9yIDE2eDE2IG9yIDE2eDggYmxvY2tzLiAgCi0gKiBSb3VuZGluZyBpcyBhcHBsaWVkIGFjY29yZGluZyB0byB0aGUgY29udmVudGlvbiAoYStiKzEpPj4xLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqICAgcFNyY1JlZjAgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAwIAotICogICBwU3JjUmVmMSAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiAgIGlTcmNTdGVwIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYgCi0gKiAgIGlSZWZTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiAgIGlSZWZTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA4IG9yIDE2IAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0U0FEIC1Qb2ludGVyIG9mIHJlc3VsdCBTQUQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDggb3IgMTYuIAotICogICAgLSAgICBPbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBTcmNSZWYwLCAKLSAqICAgICAgICAgICAgICBwU3JjUmVmMSwgcERzdFNBRC4gCi0gKiAgICAtICAgIGlTcmNTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2IAotICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9TQURRdWFyXzE2eCAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZjAsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmMSwKLSAgICBPTVhfVTMyIGlTcmNTdGVwLAotICAgIE9NWF9VMzIgaVJlZlN0ZXAwLAotICAgIE9NWF9VMzIgaVJlZlN0ZXAxLAotICAgIE9NWF9VMzIgKnBEc3RTQUQsCi0gICAgT01YX1UzMiBpSGVpZ2h0Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU0FURF80eDQgICAoNi4zLjUuNC41KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBzdW0gb2YgYWJzb2x1dGUgdHJhbnNmb3JtIGRpZmZlcmVuY2VzIChTQVREKSAKLSAqIGZvciBhIDR4NCBibG9jayBieSBhcHBseWluZyBhIEhhZGFtYXJkIHRyYW5zZm9ybSB0byB0aGUgZGlmZmVyZW5jZSBibG9jayAKLSAqIGFuZCB0aGVuIGNhbGN1bGF0aW5nIHRoZSBzdW0gb2YgYWJzb2x1dGUgY29lZmZpY2llbnQgdmFsdWVzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjT3JnIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkgCi0gKiAgIGlTdGVwT3JnIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAKLSAqICAgcFNyY1JlZiAtIFBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeSAKLSAqICAgaVN0ZXBSZWYgLSBTdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gdGhlIHJlc3VsdGluZyBTQUQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcFNyY09yZywgcFNyY1JlZiwgb3IgcERzdFNBRCBlaXRoZXIgcFNyY09yZyAKLSAqICAgIC0gICAgcFNyY1JlZiBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKLSAqICAgIC0gICAgaVN0ZXBPcmcgPD0gMCBvciBpU3RlcE9yZyBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAotICogICAgLSAgICBpU3RlcFJlZiA8PSAwIG9yIGlTdGVwUmVmIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9TQVREXzR4NCAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjT3JnLAotICAgIE9NWF9VMzIgaVN0ZXBPcmcsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAotICAgIE9NWF9VMzIgaVN0ZXBSZWYsCi0gICAgT01YX1UzMiAqcERzdFNBRAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hICAgKDYuMy41LjUuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgdHdvIGhvcml6b250YWwgMS8yLXBlbCBwb3NpdGlvbnMgCi0gKiAoLTEvMiwwKSBhbmQgKDEvMiwgMCkgLSBhcm91bmQgYSBmdWxsLXBlbCBwb3NpdGlvbi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgYmxvY2sgdXNlZCB0byBpbnRlcnBvbGF0ZSBpbiAKLSAqICAgICAgICAgICAgdGhlIHJlY29uc3RydWN0aW9uIGZyYW1lIHBsYW5lLiAKLSAqICAgaVNyY1N0ZXAgLSBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLiAKLSAqICAgaURzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXI7IG11c3QgYmUgYSAKLSAqICAgICAgICAgICAgbXVsdGlwbGUgb2YgaVdpZHRoLiAKLSAqICAgaVdpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2IAotICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIDQsIDgsIG9yIDE2IAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0TGVmdCAtUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIGxlZnQgLXBlbCBwb3NpdGlvbiAKLSAqICAgICAgICAgICAgKC0xLzIsIDApIAotICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgcERzdFJpZ2h0IC1Qb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgcmlnaHQgLXBlbCAKLSAqICAgICAgICAgICAgcG9zaXRpb24gKDEvMiwgMCkgCi0gKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgICAgICBwU3JjLCBwRHN0TGVmdCwgb3IgcERzdFJpZ2h0IAotICogICAgLSAgICBpV2lkdGggb3IgaUhlaWdodCBoYXZlIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2IAotICogICAgLSAgICBpV2lkdGg9PTQgYnV0IHBEc3RMZWZ0IGFuZC9vciBwRHN0UmlnaHQgaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAotICogICAgLSAgICBpV2lkdGg9PTggYnV0IHBEc3RMZWZ0IGFuZC9vciBwRHN0UmlnaHQgaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5IAotICogICAgLSAgICBpV2lkdGg9PTE2IGJ1dCBwRHN0TGVmdCBhbmQvb3IgcERzdFJpZ2h0IGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkgCi0gKiAgICAtICAgIGFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmMsCi0gICAgT01YX1UzMiBpU3JjU3RlcCwKLSAgICBPTVhfVTggKnBEc3RMZWZ0LAotICAgIE9NWF9VOCAqcERzdFJpZ2h0LAotICAgIE9NWF9VMzIgaURzdFN0ZXAsCi0gICAgT01YX1UzMiBpV2lkdGgsCi0gICAgT01YX1UzMiBpSGVpZ2h0Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEgICAoNi4zLjUuNS4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciB0d28gdmVydGljYWwgMS8yLXBlbCBwb3NpdGlvbnMgLSAKLSAqICgwLCAtMS8yKSBhbmQgKDAsIDEvMikgLSBhcm91bmQgYSBmdWxsLXBlbCBwb3NpdGlvbi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgaW4gdGhlIAotICogICAgICAgICAgICByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lIAotICogICBpU3JjU3RlcCAtIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuIAotICogICBpRHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIChpbnRlcnBvbGF0aW9uKSBidWZmZXI7IG11c3QgYmUgYSAKLSAqICAgICAgICAgICAgbXVsdGlwbGUgb2YgaVdpZHRoLiAKLSAqICAgaVdpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2IAotICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFVwIC1Qb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgLXBlbCBwb3NpdGlvbiBhYm92ZSAKLSAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgZnVsbC1wZWwgcG9zaXRpb24gKDAsIC0xLzIpIAotICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT00LCA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09OCwgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIHBEc3REb3duIC1Qb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgLXBlbCBwb3NpdGlvbiBiZWxvdyAKLSAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgZnVsbC1wZWwgcG9zaXRpb24gKDAsIDEvMikgCi0gKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTQsIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT04LCA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICAgICBwU3JjLCBwRHN0VXAsIG9yIHBEc3REb3duIAotICogICAgLSAgICBpV2lkdGggb3IgaUhlaWdodCBoYXZlIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2IAotICogICAgLSAgICBpV2lkdGg9PTQgYnV0IHBEc3RVcCBhbmQvb3IgcERzdERvd24gaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAotICogICAgLSAgICBpV2lkdGg9PTggYnV0IHBEc3RVcCBhbmQvb3IgcERzdERvd24gaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5IAotICogICAgLSAgICBpV2lkdGg9PTE2IGJ1dCBwRHN0VXAgYW5kL29yIHBEc3REb3duIGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYSAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjLAotICAgIE9NWF9VMzIgaVNyY1N0ZXAsCi0gICAgT01YX1U4ICpwRHN0VXAsCi0gICAgT01YX1U4ICpwRHN0RG93biwKLSAgICBPTVhfVTMyIGlEc3RTdGVwLAotICAgIE9NWF9VMzIgaVdpZHRoLAotICAgIE9NWF9VMzIgaUhlaWdodAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0F2ZXJhZ2VfNHggICAoNi4zLjUuNS4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBhdmVyYWdlIG9mIHR3byA0eDQsIDR4OCBibG9ja3MuICBUaGUgcmVzdWx0IAotICogaXMgcm91bmRlZCBhY2NvcmRpbmcgdG8gKGErYisxKS8yLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwUHJlZDAgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiAgIHBQcmVkMSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMSAKLSAqICAgaVByZWRTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDA7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgaVByZWRTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDE7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgaURzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgYmxvY2tzOyBtdXN0IGJlIGVpdGhlciA0IG9yIDguIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0UHJlZCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgICBwUHJlZDAsIHBQcmVkMSwgb3IgcERzdFByZWQgCi0gKiAgICAtICAgIHBEc3RQcmVkIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAotICogICAgLSAgICBpUHJlZFN0ZXAwIDw9IDAgb3IgaVByZWRTdGVwMCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAotICogICAgLSAgICBpUHJlZFN0ZXAxIDw9IDAgb3IgaVByZWRTdGVwMSBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAotICogICAgLSAgICBpRHN0U3RlcCA8PSAwIG9yIGlEc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCi0gKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA0IG9yIDggCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9BdmVyYWdlXzR4ICgKLSAgICBjb25zdCBPTVhfVTggKnBQcmVkMCwKLSAgICBjb25zdCBPTVhfVTggKnBQcmVkMSwKLSAgICBPTVhfVTMyIGlQcmVkU3RlcDAsCi0gICAgT01YX1UzMiBpUHJlZFN0ZXAxLAotICAgIE9NWF9VOCAqcERzdFByZWQsCi0gICAgT01YX1UzMiBpRHN0U3RlcCwKLSAgICBPTVhfVTMyIGlIZWlnaHQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9DaHJvbWFEQyAgICg2LjMuNS42LjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIDJ4MiBIYWRhbWFyZCB0cmFuc2Zvcm0gb2YgY2hyb21hIERDIGNvZWZmaWNpZW50cyAKLSAqIGFuZCB0aGVuIHF1YW50aXplcyB0aGUgY29lZmZpY2llbnRzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0aGUgMngyIGFycmF5IG9mIGNocm9tYSBEQyBjb2VmZmljaWVudHMuICA4LWJ5dGUgCi0gKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIGlRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXI7IG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDUxXS4gCi0gKiAgIGJJbnRyYSAtIEluZGljYXRlIHdoZXRoZXIgdGhpcyBpcyBhbiBJTlRSQSBibG9jay4gMS1JTlRSQSwgMC1JTlRFUiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdHJhbnNmb3JtZWQgYW5kIHF1YW50aXplZCBjb2VmZmljaWVudHMuICA4LWJ5dGUgCi0gKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgICAgIHBTcmNEc3QgCi0gKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfQ2hyb21hREMgKAotICAgIE9NWF9TMTYgKnBTcmNEc3QsCi0gICAgT01YX1UzMiBpUVAsCi0gICAgT01YX1U4IGJJbnRyYQotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0x1bWFEQyAgICg2LjMuNS42LjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGEgNHg0IEhhZGFtYXJkIHRyYW5zZm9ybSBvZiBsdW1hIERDIGNvZWZmaWNpZW50cyAKLSAqIGFuZCB0aGVuIHF1YW50aXplcyB0aGUgY29lZmZpY2llbnRzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0aGUgNHg0IGFycmF5IG9mIGx1bWEgREMgY29lZmZpY2llbnRzLiAgMTYtYnl0ZSAKLSAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdHJhbnNmb3JtZWQgYW5kIHF1YW50aXplZCBjb2VmZmljaWVudHMuICAxNi1ieXRlIAotICogICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QgCi0gKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IGFsaWduZWQgb24gYW4gMTYtYnl0ZSBib3VuZGFyeSAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0x1bWFEQyAoCi0gICAgT01YX1MxNiAqcFNyY0RzdCwKLSAgICBPTVhfVTMyIGlRUAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfTHVtYURDICAgKDYuMy41LjYuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW52ZXJzZSA0eDQgSGFkYW1hcmQgdHJhbnNmb3JtIGFuZCB0aGVuIGRlcXVhbnRpemVzIAotICogdGhlIGNvZWZmaWNpZW50cy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIDR4NCBhcnJheSBvZiB0aGUgNHg0IEhhZGFtYXJkLXRyYW5zZm9ybWVkIGFuZCAKLSAqICAgICAgICAgICAgcXVhbnRpemVkIGNvZWZmaWNpZW50cy4gIDE2IGJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIFBvaW50ZXIgdG8gaW52ZXJzZS10cmFuc2Zvcm1lZCBhbmQgZGVxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgCi0gKiAgICAgICAgICAgIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMgCi0gKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0x1bWFEQyAoCi0gICAgY29uc3QgT01YX1MxNiAqcFNyYywKLSAgICBPTVhfUzE2ICpwRHN0LAotICAgIE9NWF9VMzIgaVFQCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9DaHJvbWFEQyAgICg2LjMuNS42LjQpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludmVyc2UgMngyIEhhZGFtYXJkIHRyYW5zZm9ybSBhbmQgdGhlbiBkZXF1YW50aXplcyAKLSAqIHRoZSBjb2VmZmljaWVudHMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSAyeDIgYXJyYXkgb2YgdGhlIDJ4MiBIYWRhbWFyZC10cmFuc2Zvcm1lZCBhbmQgCi0gKiAgICAgICAgICAgIHF1YW50aXplZCBjb2VmZmljaWVudHMuICA4IGJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIFBvaW50ZXIgdG8gaW52ZXJzZS10cmFuc2Zvcm1lZCBhbmQgZGVxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgCi0gKiAgICAgICAgICAgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYyAKLSAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfQ2hyb21hREMgKAotICAgIGNvbnN0IE9NWF9TMTYgKnBTcmMsCi0gICAgT01YX1MxNiAqcERzdCwKLSAgICBPTVhfVTMyIGlRUAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludlRyYW5zZm9ybVJlc2lkdWFsQW5kQWRkICAgKDYuMy41LjcuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW52ZXJzZSBhbiA0eDQgaW50ZWdlciB0cmFuc2Zvcm1hdGlvbiB0byBwcm9kdWNlIAotICogdGhlIGRpZmZlcmVuY2Ugc2lnbmFsIGFuZCB0aGVuIGFkZHMgdGhlIGRpZmZlcmVuY2UgdG8gdGhlIHByZWRpY3Rpb24gdG8gZ2V0IAotICogdGhlIHJlY29uc3RydWN0ZWQgc2lnbmFsLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjUHJlZCAtIFBvaW50ZXIgdG8gcHJlZGljdGlvbiBzaWduYWwuICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgcERlcXVhbnRDb2VmZiAtIFBvaW50ZXIgdG8gdGhlIHRyYW5zZm9ybWVkIGNvZWZmaWNpZW50cy4gIDgtYnl0ZSAKLSAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgaVNyY1ByZWRTdGVwIC0gU3RlcCBvZiB0aGUgcHJlZGljdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgaURzdFJlY29uU3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIHJlY29uc3RydWN0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIAotICogICAgICAgICAgICBtdWx0aXBsZSBvZiA0LiAKLSAqICAgYkFDIC0gSW5kaWNhdGUgd2hldGhlciB0aGVyZSBpcyBBQyBjb2VmZmljaWVudHMgaW4gdGhlIGNvZWZmaWNpZW50cyAKLSAqICAgICAgICAgICAgbWF0cml4LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFJlY29uIC1Qb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiByZWNvbnN0cnVjdGlvbiBidWZmZXIuICA0LWJ5dGUgCi0gKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgICAgcFNyY1ByZWQsIHBEZXF1YW50Q29lZmYsIHBEc3RSZWNvbiAKLSAqICAgIC0gICAgcFNyY1ByZWQgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCi0gKiAgICAtICAgIGlTcmNQcmVkU3RlcCBvciBpRHN0UmVjb25TdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQuIAotICogICAgLSAgICBwRGVxdWFudENvZWZmIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0ludlRyYW5zZm9ybVJlc2lkdWFsQW5kQWRkICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNQcmVkLAotICAgIGNvbnN0IE9NWF9TMTYgKnBEZXF1YW50Q29lZmYsCi0gICAgT01YX1U4ICpwRHN0UmVjb24sCi0gICAgT01YX1UzMiBpU3JjUHJlZFN0ZXAsCi0gICAgT01YX1UzMiBpRHN0UmVjb25TdGVwLAotICAgIE9NWF9VOCBiQUMKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TdWJBbmRUcmFuc2Zvcm1RRFFSZXNpZHVhbCAgICg2LjMuNS44LjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHN1YnRyYWN0cyB0aGUgcHJlZGljdGlvbiBzaWduYWwgZnJvbSB0aGUgb3JpZ2luYWwgc2lnbmFsIHRvIAotICogcHJvZHVjZSB0aGUgZGlmZmVyZW5jZSBzaWduYWwgYW5kIHRoZW4gcGVyZm9ybXMgYSA0eDQgaW50ZWdlciB0cmFuc2Zvcm0gYW5kIAotICogcXVhbnRpemF0aW9uLiBUaGUgcXVhbnRpemVkIHRyYW5zZm9ybWVkIGNvZWZmaWNpZW50cyBhcmUgc3RvcmVkIGFzIAotICogcERzdFF1YW50Q29lZmYuIFRoaXMgZnVuY3Rpb24gY2FuIGFsc28gb3V0cHV0IGRlcXVhbnRpemVkIGNvZWZmaWNpZW50cyBvciAKLSAqIHVucXVhbnRpemVkIERDIGNvZWZmaWNpZW50cyBvcHRpb25hbGx5IGJ5IHNldHRpbmcgdGhlIHBvaW50ZXJzIAotICogcERzdERlUXVhbnRDb2VmZiwgcERDQ29lZmYuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNPcmcgLSBQb2ludGVyIHRvIG9yaWdpbmFsIHNpZ25hbC4gNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIHBTcmNQcmVkIC0gUG9pbnRlciB0byBwcmVkaWN0aW9uIHNpZ25hbC4gNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIGlTcmNPcmdTdGVwIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgc2lnbmFsIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIAotICogICAgICAgICAgICA0LiAKLSAqICAgaVNyY1ByZWRTdGVwIC0gU3RlcCBvZiB0aGUgcHJlZGljdGlvbiBzaWduYWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgCi0gKiAgICAgICAgICAgIG9mIDQuIAotICogICBwTnVtQ29lZmYgLU51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMgYWZ0ZXIgcXVhbnRpemF0aW9uLiBJZiB0aGlzIAotICogICAgICAgICAgICBwYXJhbWV0ZXIgaXMgbm90IHJlcXVpcmVkLCBpdCBpcyBzZXQgdG8gTlVMTC4gCi0gKiAgIG5UaHJlc2hTQUQgLSBaZXJvLWJsb2NrIGVhcmx5IGRldGVjdGlvbiB0aHJlc2hvbGQuIElmIHRoaXMgcGFyYW1ldGVyIGlzIAotICogICAgICAgICAgICBub3QgcmVxdWlyZWQsIGl0IGlzIHNldCB0byAwLiAKLSAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKLSAqICAgYkludHJhIC0gSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBpcyBhbiBJTlRSQSBibG9jaywgZWl0aGVyIDEtSU5UUkEgb3IgCi0gKiAgICAgICAgICAgIDAtSU5URVIgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RRdWFudENvZWZmIC0gUG9pbnRlciB0byB0aGUgcXVhbnRpemVkIHRyYW5zZm9ybWVkIGNvZWZmaWNpZW50cy4gIAotICogICAgICAgICAgICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgcERzdERlUXVhbnRDb2VmZiAtIFBvaW50ZXIgdG8gdGhlIGRlcXVhbnRpemVkIHRyYW5zZm9ybWVkIGNvZWZmaWNpZW50cyAKLSAqICAgICAgICAgICAgaWYgdGhpcyBwYXJhbWV0ZXIgaXMgbm90IGVxdWFsIHRvIE5VTEwuICA4LWJ5dGUgYWxpZ25tZW50IAotICogICAgICAgICAgICByZXF1aXJlZC4gCi0gKiAgIHBEQ0NvZWZmIC0gUG9pbnRlciB0byB0aGUgdW5xdWFudGl6ZWQgREMgY29lZmZpY2llbnQgaWYgdGhpcyBwYXJhbWV0ZXIgCi0gKiAgICAgICAgICAgIGlzIG5vdCBlcXVhbCB0byBOVUxMLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICAgICBwU3JjT3JnLCBwU3JjUHJlZCwgcE51bUNvZWZmLCBwRHN0UXVhbnRDb2VmZiwgCi0gKiAgICAgICAgICAgIHBEc3REZVF1YW50Q29lZmYsIHBEQ0NvZWZmIAotICogICAgLSAgICBwU3JjT3JnIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAotICogICAgLSAgICBwU3JjUHJlZCBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKLSAqICAgIC0gICAgaVNyY09yZ1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKLSAqICAgIC0gICAgaVNyY1ByZWRTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCi0gKiAgICAtICAgIHBEc3RRdWFudENvZWZmIG9yIHBEc3REZVF1YW50Q29lZmYgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfU3ViQW5kVHJhbnNmb3JtUURRUmVzaWR1YWwgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY09yZywKLSAgICBjb25zdCBPTVhfVTggKnBTcmNQcmVkLAotICAgIE9NWF9VMzIgaVNyY09yZ1N0ZXAsCi0gICAgT01YX1UzMiBpU3JjUHJlZFN0ZXAsCi0gICAgT01YX1MxNiAqcERzdFF1YW50Q29lZmYsCi0gICAgT01YX1MxNiAqcERzdERlUXVhbnRDb2VmZiwKLSAgICBPTVhfUzE2ICpwRENDb2VmZiwKLSAgICBPTVhfUzggKnBOdW1Db2VmZiwKLSAgICBPTVhfVTMyIG5UaHJlc2hTQUQsCi0gICAgT01YX1UzMiBpUVAsCi0gICAgT01YX1U4IGJJbnRyYQotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0dldFZMQ0luZm8gICAoNi4zLjUuOS4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBleHRyYWN0cyBydW4tbGVuZ3RoIGVuY29kaW5nIChSTEUpIGluZm9ybWF0aW9uIGZyb20gdGhlIAotICogY29lZmZpY2llbnQgbWF0cml4LiAgVGhlIHJlc3VsdHMgYXJlIHJldHVybmVkIGluIGFuIE9NWFZDTTRQMTBWTENJbmZvIAotICogc3RydWN0dXJlLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjQ29lZmYgLSBwb2ludGVyIHRvIHRoZSB0cmFuc2Zvcm0gY29lZmZpY2llbnQgbWF0cml4LiAgOC1ieXRlIAotICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBwU2Nhbk1hdHJpeCAtIHBvaW50ZXIgdG8gdGhlIHNjYW4gb3JkZXIgZGVmaW5pdGlvbiBtYXRyaXguICBGb3IgYSBsdW1hIAotICogICAgICAgICAgICBibG9jayB0aGUgc2NhbiBtYXRyaXggc2hvdWxkIGZvbGxvdyBbSVNPMTQ0OTYtMTBdIHNlY3Rpb24gOC41LjQsIAotICogICAgICAgICAgICBhbmQgc2hvdWxkIGNvbnRhaW4gdGhlIHZhbHVlcyAwLCAxLCA0LCA4LCA1LCAyLCAzLCA2LCA5LCAxMiwgMTMsIAotICogICAgICAgICAgICAxMCwgNywgMTEsIDE0LCAxNS4gIEZvciBhIGNocm9tYSBibG9jaywgdGhlIHNjYW4gbWF0cml4IHNob3VsZCAKLSAqICAgICAgICAgICAgY29udGFpbiB0aGUgdmFsdWVzIDAsIDEsIDIsIDMuIAotICogICBiQUMgLSBpbmRpY2F0ZXMgcHJlc2VuY2Ugb2YgYSBEQyBjb2VmZmljaWVudDsgMCA9IERDIGNvZWZmaWNpZW50IAotICogICAgICAgICAgICBwcmVzZW50LCAxPSBEQyBjb2VmZmljaWVudCBhYnNlbnQuIAotICogICBNYXhOdW1Db2VmIC0gc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGNvbnRhaW5lZCBpbiB0aGUgCi0gKiAgICAgICAgICAgIHRyYW5zZm9ybSBjb2VmZmljaWVudCBtYXRyaXgsIHBTcmNDb2VmZi4gVGhlIHZhbHVlIHNob3VsZCBiZSAxNiAKLSAqICAgICAgICAgICAgZm9yIGJsb2NrcyBvZiB0eXBlIExVTUFEQywgTFVNQUFDLCBMVU1BTEVWRUwsIGFuZCBDSFJPTUFBQy4gVGhlIAotICogICAgICAgICAgICB2YWx1ZSBzaG91bGQgYmUgNCBmb3IgYmxvY2tzIG9mIHR5cGUgQ0hST01BREMuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0VkxDSW5mbyAtIHBvaW50ZXIgdG8gc3RydWN0dXJlIHRoYXQgc3RvcmVzIGluZm9ybWF0aW9uIGZvciAKLSAqICAgICAgICAgICAgcnVuLWxlbmd0aCBjb2RpbmcuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgICAgIHBTcmNDb2VmZiwgcFNjYW5NYXRyaXgsIHBEc3RWTENJbmZvIAotICogICAgLSAgICBwU3JjQ29lZmYgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfR2V0VkxDSW5mbyAoCi0gICAgY29uc3QgT01YX1MxNiAqcFNyY0NvZWZmLAotICAgIGNvbnN0IE9NWF9VOCAqcFNjYW5NYXRyaXgsCi0gICAgT01YX1U4IGJBQywKLSAgICBPTVhfVTMyIE1heE51bUNvZWYsCi0gICAgT01YVkNNNFAxMFZMQ0luZm8qcERzdFZMQ0luZm8KLSk7Ci0KLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgLyoqIGVuZCBvZiAjZGVmaW5lIF9PTVhWQ19IXyAqLwotCi0vKiogRU9GICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9hcGkvb214VkNfcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL2FwaS9vbXhWQ19zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlOTc0ZDUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL2FwaS9vbXhWQ19zLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotOy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLTsvLyBDb3B5cmlnaHQgKGMpIDE5OTktMjAwNSBUaGUgS2hyb25vcyBHcm91cCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKLTsvLwotOy8vCi07Ly8KLTsvLwotOy8vCi07Ly8KLTsvLwotOy8vCi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi07LyoqID09PT09PT09PT09PT09PSBTdHJ1Y3R1cmUgRGVmaW5pdGlvbiBmb3IgU2FtcGxlIEdlbmVyYXRpb24gPT09PT09PT09PT09PT0gKi8KLTsvKiogdHJhbnNwYXJlbnQgc3RhdHVzICovCi0KLTtlbnVtIHsKLU9NWF9WSURFT19UUkFOU1BBUkVOVAlFUVUgMDsJLyoqIFdob2xseSB0cmFuc3BhcmVudCAqLwotT01YX1ZJREVPX1BBUlRJQUwJCUVRVSAxOwkvKiogUGFydGlhbGx5IHRyYW5zcGFyZW50ICovCi1PTVhfVklERU9fT1BBUVVFCQlFUVUgMjsJLyoqIE9wYXF1ZSAqLwotO30KLQotOy8qKiBkaXJlY3Rpb24gKi8KLTtlbnVtIHsKLU9NWF9WSURFT19OT05FCQkJRVFVIDA7Ci1PTVhfVklERU9fSE9SSVpPTlRBTAlFUVUgMTsKLU9NWF9WSURFT19WRVJUSUNBTAkJRVFVIDI7Ci07fQotCi07LyoqIGJpbGluZWFyIGludGVycG9sYXRpb24gdHlwZSAqLwotO2VudW0gewotT01YX1ZJREVPX0lOVEVHRVJfUElYRUwgRVFVIDA7CS8qKiBjYXNlIKGwYaGxICovCi1PTVhfVklERU9fSEFMRl9QSVhFTF9YICBFUVUgMTsJLyoqIGNhc2UgobBiobEgKi8KLU9NWF9WSURFT19IQUxGX1BJWEVMX1kgIEVRVSAyOwkvKiogY2FzZSChsGOhsSAqLwotT01YX1ZJREVPX0hBTEZfUElYRUxfWFkgRVFVIDM7CS8qKiBjYXNlIKGwZKGxICovCi07fQotCi07ZW51bSB7Ci1PTVhfVVBQRVIgIAkJCQlFUVUgMTsJCQkvKiogc2V0IGlmIHRoZSBhYm92ZSBtYWNyb2Jsb2NrIGlzIGF2YWlsYWJsZSAqLwotT01YX0xFRlQgICAJCQkJRVFVIDI7CQkJLyoqIHNldCBpZiB0aGUgbGVmdCBtYWNyb2Jsb2NrIGlzIGF2YWlsYWJsZSAqLwotT01YX0NFTlRFUiAJCQkJRVFVIDQ7Ci1PTVhfUklHSFQJCQkJRVFVIDg7Ci1PTVhfTE9XRVIgIAkJCQlFUVUJMTY7Ci1PTVhfVVBQRVJfTEVGVCAgCQlFUVUgMzI7CQkvKiogc2V0IGlmIHRoZSBhYm92ZS1sZWZ0IG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlICovCi1PTVhfVVBQRVJfUklHSFQgCQlFUVUgNjQ7CQkvKiogc2V0IGlmIHRoZSBhYm92ZS1yaWdodCBtYWNyb2Jsb2NrIGlzIGF2YWlsYWJsZSAqLwotT01YX0xPV0VSX0xFRlQgIAkJRVFVIDEyODsKLU9NWF9MT1dFUl9SSUdIVCAJCUVRVSAyNTYKLTt9Ci0KLTtlbnVtIHsKLU9NWF9WSURFT19MVU1JTkFOQ0UgIAlFUVUgMDsJLyoqIEx1bWluYW5jZSBjb21wb25lbnQgKi8KLU9NWF9WSURFT19DSFJPTUlOQU5DRSAgCUVRVSAxOwkvKiogY2hyb21pbmFuY2UgY29tcG9uZW50ICovCi1PTVhfVklERU9fQUxQSEEgIAkJRVFVIDI7CQkJLyoqIEFscGhhIGNvbXBvbmVudCAqLwotO30KLQotO2VudW0gewotT01YX1ZJREVPX0lOVEVSCQkJRVFVIDA7CS8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKi8KLU9NWF9WSURFT19JTlRFUl9RCQlFUVUgMTsJLyoqIFAgcGljdHVyZSBvciBQLVZPUCAqLwotT01YX1ZJREVPX0lOVEVSNFYJCUVRVSAyOwkvKiogUCBwaWN0dXJlIG9yIFAtVk9QICovCi1PTVhfVklERU9fSU5UUkEJCQlFUVUgMzsJLyoqIEkgYW5kIFAgcGljdHVyZTsgSS0gYW5kIFAtVk9QICovCi1PTVhfVklERU9fSU5UUkFfUQkJRVFVIDQ7CS8qKiBJIGFuZCBQIHBpY3R1cmU7IEktIGFuZCBQLVZPUCAqLwotT01YX1ZJREVPX0lOVEVSNFZfUQkJRVFVIDU7CS8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKEguMjYzKSovCi1PTVhfVklERU9fRElSRUNUCQlFUVUgNjsJLyoqIEIgcGljdHVyZSBvciBCLVZPUCAoTVBFRy00IG9ubHkpICovCi1PTVhfVklERU9fSU5URVJQT0xBVEUJRVFVIDc7CS8qKiBCIHBpY3R1cmUgb3IgQi1WT1AgKi8KLU9NWF9WSURFT19CQUNLV0FSRAkJRVFVIDg7CS8qKiBCIHBpY3R1cmUgb3IgQi1WT1AgKi8KLU9NWF9WSURFT19GT1JXQVJECQlFUVUgOTsJLyoqIEIgcGljdHVyZSBvciBCLVZPUCAqLwotT01YX1ZJREVPX05PVENPREVECQlFUVUgMTA7CS8qKiBCIHBpY3R1cmUgb3IgQi1WT1AgKi8KLTt9Ci0KLTtlbnVtIHsKLU9NWF8xNlgxNl9WRVJUIAkJCUVRVSAwOwkJLyoqIEludHJhXzE2eDE2X1ZlcnRpY2FsIChwcmVkaWN0aW9uIG1vZGUpICovCi1PTVhfMTZYMTZfSE9SIAkJCUVRVSAxOwkJLyoqIEludHJhXzE2eDE2X0hvcml6b250YWwgKHByZWRpY3Rpb24gbW9kZSkgKi8KLU9NWF8xNlgxNl9EQyAJCQlFUVUgMjsJCS8qKiBJbnRyYV8xNngxNl9EQyAocHJlZGljdGlvbiBtb2RlKSAqLwotT01YXzE2WDE2X1BMQU5FIAkJRVFVIDM7CS8qKiBJbnRyYV8xNngxNl9QbGFuZSAocHJlZGljdGlvbiBtb2RlKSAqLwotO30KLQotO2VudW0gewotT01YXzR4NF9WRVJUIAkJCUVRVSAwOwkJLyoqIEludHJhXzR4NF9WZXJ0aWNhbCAocHJlZGljdGlvbiBtb2RlKSAqLwotT01YXzR4NF9IT1IgIAkJCUVRVSAxOwkJLyoqIEludHJhXzR4NF9Ib3Jpem9udGFsIChwcmVkaWN0aW9uIG1vZGUpICovCi1PTVhfNHg0X0RDICAgCQkJRVFVIDI7CQkvKiogSW50cmFfNHg0X0RDIChwcmVkaWN0aW9uIG1vZGUpICovCi1PTVhfNHg0X0RJQUdfREwgCQlFUVUgMzsJLyoqIEludHJhXzR4NF9EaWFnb25hbF9Eb3duX0xlZnQgKHByZWRpY3Rpb24gbW9kZSkgKi8KLU9NWF80eDRfRElBR19EUiAJCUVRVSA0OwkvKiogSW50cmFfNHg0X0RpYWdvbmFsX0Rvd25fUmlnaHQgKHByZWRpY3Rpb24gbW9kZSkgKi8KLU9NWF80eDRfVlIgCQkJCUVRVSA1OwkJCS8qKiBJbnRyYV80eDRfVmVydGljYWxfUmlnaHQgKHByZWRpY3Rpb24gbW9kZSkgKi8KLU9NWF80eDRfSEQgCQkJCUVRVSA2OwkJCS8qKiBJbnRyYV80eDRfSG9yaXpvbnRhbF9Eb3duIChwcmVkaWN0aW9uIG1vZGUpICovCi1PTVhfNHg0X1ZMIAkJCQlFUVUgNzsJCQkvKiogSW50cmFfNHg0X1ZlcnRpY2FsX0xlZnQgKHByZWRpY3Rpb24gbW9kZSkgKi8KLU9NWF80eDRfSFUgCQkJCUVRVSA4OwkJCS8qKiBJbnRyYV80eDRfSG9yaXpvbnRhbF9VcCAocHJlZGljdGlvbiBtb2RlKSAqLwotO30KLQotO2VudW0gewotT01YX0NIUk9NQV9EQyAJCQlFUVUgMDsJCS8qKiBJbnRyYV9DaHJvbWFfREMgKHByZWRpY3Rpb24gbW9kZSkgKi8KLU9NWF9DSFJPTUFfSE9SIAkJCUVRVSAxOwkJLyoqIEludHJhX0Nocm9tYV9Ib3Jpem9udGFsIChwcmVkaWN0aW9uIG1vZGUpICovCi1PTVhfQ0hST01BX1ZFUlQgCQlFUVUgMjsJLyoqIEludHJhX0Nocm9tYV9WZXJ0aWNhbCAocHJlZGljdGlvbiBtb2RlKSAqLwotT01YX0NIUk9NQV9QTEFORSAJCUVRVSAzOwkvKiogSW50cmFfQ2hyb21hX1BsYW5lIChwcmVkaWN0aW9uIG1vZGUpICovCi07fQotCi07dHlwZWRlZglzdHJ1Y3QgewkKLXgJRVFVCTA7Ci15CUVRVQk0OwotO31PTVhDb29yZGluYXRlOwotCi07dHlwZWRlZiBzdHJ1Y3QgewotZHgJRVFVCTA7Ci1keQlFUVUJMjsKLTt9T01YTW90aW9uVmVjdG9yOwotCi07dHlwZWRlZiBzdHJ1Y3QgewoteHgJCUVRVQkwOwoteXkJCUVRVQk0Owotd2lkdGgJRVFVCTg7Ci1oZWlnaHQJRVFVCTEyOwotO31PTVhpUmVjdDsKLQotO3R5cGVkZWYgZW51bSB7Ci1PTVhfVkNfSU5URVIgICAgICAgICBFUVUgMDsgICAgICAgIC8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKi8KLU9NWF9WQ19JTlRFUl9RICAgICAgIEVRVSAxOyAgICAgICAvKiogUCBwaWN0dXJlIG9yIFAtVk9QICovCi1PTVhfVkNfSU5URVI0ViAgICAgICBFUVUgMjsgICAgICAgLyoqIFAgcGljdHVyZSBvciBQLVZPUCAqLwotT01YX1ZDX0lOVFJBICAgICAgICAgRVFVIDM7ICAgICAgICAvKiogSSBhbmQgUCBwaWN0dXJlLCBJLSBhbmQgUC1WT1AgKi8KLU9NWF9WQ19JTlRSQV9RICAgICAgIEVRVSA0OyAgICAgICAvKiogSSBhbmQgUCBwaWN0dXJlLCBJLSBhbmQgUC1WT1AgKi8KLU9NWF9WQ19JTlRFUjRWX1EgICAgIEVRVSA1OyAgICAvKiogUCBwaWN0dXJlIG9yIFAtVk9QIChILjI2MykqLwotO30gT01YVkNNNFAyTWFjcm9ibG9ja1R5cGU7Ci0KLTtlbnVtIHsKLU9NWF9WQ19OT05FICAgICAgICAgIEVRVSAwCi1PTVhfVkNfSE9SSVpPTlRBTCAgICBFUVUgMQotT01YX1ZDX1ZFUlRJQ0FMICAgICAgRVFVIDIgCi07fTsKLQotCi0JRU5ECi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTE2eDE2X3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTE2eDE2X3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY2M2E3MC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHkxNngxNl9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotIDsvKioKLSA7ICogRnVuY3Rpb246IG9teFZDQ09NTV9Db3B5MTZ4MTYKLSA7ICoKLSA7ICogRGVzY3JpcHRpb246Ci0gOyAqIENvcGllcyB0aGUgcmVmZXJlbmNlIDE2eDE2IGJsb2NrIHRvIHRoZSBjdXJyZW50IGJsb2NrLgotIDsgKiBQYXJhbWV0ZXJzOgotIDsgKiBbaW5dIHBTcmMgICAgICAgICAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jayBpbiB0aGUgc291cmNlIGZyYW1lOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gMTYtYnl0ZSBib3VuZGFyeS4KLSA7ICogW2luXSBzdGVwICAgICAgICAgLSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydHMgb2YgY29uc2VjdXRpdmUgbGluZXMgaW4gdGhlIHJlZmVyZW5jZSBmcmFtZSwgaW4gYnl0ZXM7Ci0gOyAqICAgICAgICAgICAgICAgICAgICAgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2IGFuZCBtdXN0IGJlIGxhcmdlciB0aGFuIG9yIGVxdWFsIHRvIDE2LgotIDsgKiBbb3V0XSBwRHN0ICAgICAgICAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LgotIDsgKiBSZXR1cm4gVmFsdWU6Ci0gOyAqIE9NWF9TdHNfTm9FcnIgICAgIC0gbm8gZXJyb3IKLSA7ICogT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotIDsgKiAgICAgICAgICAgICAgICAgICAtIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogIHBTcmMsIHBEc3QKLSA7ICogICAgICAgICAgICAgICAgICAgLSBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDE2LWJ5dGUgYm91bmRhcnk6ICBwU3JjLCBwRHN0Ci0gOyAqICAgICAgICAgICAgICAgICAgIC0gc3RlcCA8MTYgb3Igc3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gIAotIDsgKi8KLQotICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgIAotICAgICAKLSAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLSAgICAgCi0KLQotCi0gICAgIElGIEFSTTExMzZKUwotCi07Ly9JbnB1dCBBcmd1bWVudHMKLXBTcmMgICAgUk4gMCAgICAgICAgCi1wRHN0ICAgIFJOIDEgICAgICAgIAotc3RlcCAgICBSTiAyCi0KLTsvL0xvY2FsIFZhcmlhYmxlcwotQ291bnQgICBSTiAxNAotWDAgICAgICBSTiAyCi1YMSAgICAgIFJOIDQKLQotUmV0dXJuICBSTiAwCi0gICAgIAotICAgICBNX1NUQVJUIG9teFZDQ09NTV9Db3B5MTZ4MTYscjUKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgU1VCICAgQ291bnQsc3RlcCwjOCAgICAgICAgICAgICAgICAgOy8vQ291bnQ9c3RlcC04Ci0gICAgICAgIExEUkQgIFgwLFtwU3JjXSwjOCAgICAgICAgICAgICAgICAgIDsvL3BTcmMgYWZ0ZXIgbG9hZGluZyBwU3JjPXBTcmMrOAotICAgICAgICBMRFJEICBYMSxbcFNyY10sQ291bnQgICAgICAgICAgICAgICA7Ly9wU3JjIGFmdGVyIGxvYWRpbmcgcFNyYz1wU3JjK3N0ZXAKLSAgICAgICAgCi0gICAgICAgIDsvLyBsb2FkaW5nIDE2IGJ5dGVzIGFuZCBzdG9yaW5nCi0gICAgICAgIFNUUkQgIFgwLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAotICAgICAgICBMRFJEICBYMCxbcFNyY10sIzggCi0gICAgICAgIFNUUkQgIFgxLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAotICAgICAgICBMRFJEICBYMSxbcFNyY10sQ291bnQKLSAgICAgICAgCi0gICAgICAgIDsvLyBsb2FkaW5nIDE2IGJ5dGVzIGFuZCBzdG9yaW5nCi0gICAgICAgIFNUUkQgIFgwLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAotICAgICAgICBMRFJEICBYMCxbcFNyY10sIzgKLSAgICAgICAgU1RSRCAgWDEsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCi0gICAgICAgIExEUkQgIFgxLFtwU3JjXSxDb3VudAotICAgICAgICAKLSAgICAgICAgOy8vIGxvYWRpbmcgMTYgYnl0ZXMgYW5kIHN0b3JpbmcKLSAgICAgICAgU1RSRCAgWDAsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCi0gICAgICAgIExEUkQgIFgwLFtwU3JjXSwjOAotICAgICAgICBTVFJEICBYMSxbcERzdF0sIzggICAgICAgICAgICAgICAKLSAgICAgICAgTERSRCAgWDEsW3BTcmNdLENvdW50Ci0gICAgICAgIAotICAgICAgICA7Ly8gbG9hZGluZyAxNiBieXRlcyBhbmQgc3RvcmluZwotICAgICAgICBTVFJEICBYMCxbcERzdF0sIzggICAgICAgICAgICAgICAKLSAgICAgICAgTERSRCAgWDAsW3BTcmNdLCM4Ci0gICAgICAgIFNUUkQgIFgxLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAotICAgICAgICBMRFJEICBYMSxbcFNyY10sQ291bnQKLSAgICAgICAgCi0gICAgICAgIDsvLyBsb2FkaW5nIDE2IGJ5dGVzIGFuZCBzdG9yaW5nCi0gICAgICAgIFNUUkQgIFgwLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAotICAgICAgICBMRFJEICBYMCxbcFNyY10sIzgKLSAgICAgICAgU1RSRCAgWDEsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCi0gICAgICAgIExEUkQgIFgxLFtwU3JjXSxDb3VudAotICAgICAgIAotICAgICAgICA7Ly8gbG9hZGluZyAxNiBieXRlcyBhbmQgc3RvcmluZwotICAgICAgICBTVFJEICBYMCxbcERzdF0sIzggICAgICAgICAgICAgICAKLSAgICAgICAgTERSRCAgWDAsW3BTcmNdLCM4Ci0gICAgICAgIFNUUkQgIFgxLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAotICAgICAgICBMRFJEICBYMSxbcFNyY10sQ291bnQKLQotICAgICAgICA7Ly8gbG9hZGluZyAxNiBieXRlcyBhbmQgc3RvcmluZwotICAgICAgICBTVFJEICBYMCxbcERzdF0sIzggICAgICAgICAgICAgICAKLSAgICAgICAgTERSRCAgWDAsW3BTcmNdLCM4Ci0gICAgICAgIFNUUkQgIFgxLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAotICAgICAgICBMRFJEICBYMSxbcFNyY10sQ291bnQKLSAgICAgICAgCi0gICAgICAgIDsvLyBsb2FkaW5nIDE2IGJ5dGVzIGFuZCBzdG9yaW5nCi0gICAgICAgIFNUUkQgIFgwLFtwRHN0XSwjOCAgICAgICAgICAgICAgCi0gICAgICAgIExEUkQgIFgwLFtwU3JjXSwjOCAKLSAgICAgICAgU1RSRCAgWDEsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCi0gICAgICAgIExEUkQgIFgxLFtwU3JjXSxDb3VudAotICAgICAgICAKLSAgICAgICAgOy8vIGxvYWRpbmcgMTYgYnl0ZXMgYW5kIHN0b3JpbmcKLSAgICAgICAgU1RSRCAgWDAsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCi0gICAgICAgIExEUkQgIFgwLFtwU3JjXSwjOCAKLSAgICAgICAgU1RSRCAgWDEsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCi0gICAgICAgIExEUkQgIFgxLFtwU3JjXSxDb3VudAotCi0gICAgICAgIDsvLyBsb2FkaW5nIDE2IGJ5dGVzIGFuZCBzdG9yaW5nCi0gICAgICAgIFNUUkQgIFgwLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAotICAgICAgICBMRFJEICBYMCxbcFNyY10sIzggCi0gICAgICAgIFNUUkQgIFgxLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAotICAgICAgICBMRFJEICBYMSxbcFNyY10sQ291bnQKLQotICAgICAgICA7Ly8gbG9hZGluZyAxNiBieXRlcyBhbmQgc3RvcmluZwotICAgICAgICBTVFJEICBYMCxbcERzdF0sIzggICAgICAgICAgICAgICAKLSAgICAgICAgTERSRCAgWDAsW3BTcmNdLCM4IAotICAgICAgICBTVFJEICBYMSxbcERzdF0sIzggICAgICAgICAgICAgICAKLSAgICAgICAgTERSRCAgWDEsW3BTcmNdLENvdW50Ci0KLSAgICAgICAgOy8vIGxvYWRpbmcgMTYgYnl0ZXMgYW5kIHN0b3JpbmcKLSAgICAgICAgU1RSRCAgWDAsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCi0gICAgICAgIExEUkQgIFgwLFtwU3JjXSwjOCAKLSAgICAgICAgU1RSRCAgWDEsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCi0gICAgICAgIExEUkQgIFgxLFtwU3JjXSxDb3VudAotCi0gICAgICAgIDsvLyBsb2FkaW5nIDE2IGJ5dGVzIGFuZCBzdG9yaW5nCi0gICAgICAgIFNUUkQgIFgwLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAotICAgICAgICBMRFJEICBYMCxbcFNyY10sIzggCi0gICAgICAgIFNUUkQgIFgxLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAotICAgICAgICBMRFJEICBYMSxbcFNyY10sQ291bnQKLQotICAgICAgICA7Ly8gbG9hZGluZyAxNiBieXRlcyBhbmQgc3RvcmluZwotICAgICAgICBTVFJEICBYMCxbcERzdF0sIzggICAgICAgICAgICAgICAKLSAgICAgICAgTERSRCAgWDAsW3BTcmNdLCM4IAotICAgICAgICBTVFJEICBYMSxbcERzdF0sIzggICAgICAgICAgICAgICAKLSAgICAgICAgTERSRCAgWDEsW3BTcmNdLENvdW50Ci0gICAgICAgCi0gICAgICAgIDsvLyBsb2FkaW5nIDE2IGJ5dGVzIGFuZCBzdG9yaW5nCi0gICAgICAgIFNUUkQgIFgwLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAotICAgICAgICBMRFJEICBYMCxbcFNyY10sIzggCi0gICAgICAgIFNUUkQgIFgxLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAotICAgICAgICBMRFJEICBYMSxbcFNyY10sQ291bnQKLQotICAgICAgICBTVFJEICBYMCxbcERzdF0sIzggICAgICAgICAgICAgICAKLSAgICAgICAgTU9WICAgUmV0dXJuLCNPTVhfU3RzX05vRXJyCi0gICAgICAgIFNUUkQgIFgxLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAotCi0gICAgICAgCi0gICAgICAgIE1fRU5ECi0gICAgICAgIEVORElGCi0gICAgICAgIAotICAgICAgICBFTkQKLSAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHk4eDhfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5OHg4X3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkzODczYy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHk4eDhfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotIDsvKioKLSA7ICogRnVuY3Rpb246IG9teFZDQ09NTV9Db3B5OHg4Ci0gOyAqCi0gOyAqIERlc2NyaXB0aW9uOgotIDsgKiBDb3BpZXMgdGhlIHJlZmVyZW5jZSA4eDggYmxvY2sgdG8gdGhlIGN1cnJlbnQgYmxvY2suCi0gOyAqIFBhcmFtZXRlcnM6Ci0gOyAqIFtpbl0gcFNyYyAgICAgICAgIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrIGluIHRoZSBzb3VyY2UgZnJhbWU7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuCi0gOyAqIFtpbl0gc3RlcCAgICAgICAgIC0gZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnRzIG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZSByZWZlcmVuY2UgZnJhbWUsIGluIGJ5dGVzOwotIDsgKiAgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4IGFuZCBtdXN0IGJlIGxhcmdlciB0aGFuIG9yIGVxdWFsIHRvIDguCi0gOyAqIFtvdXRdIHBEc3QgICAgICAgIC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuCi0gOyAqIFJldHVybiBWYWx1ZToKLSA7ICogT01YX1N0c19Ob0VyciAgICAgLSBubyBlcnJvcgotIDsgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0gOyAqICAgICAgICAgICAgICAgICAgIC0gb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAgcFNyYywgcERzdAotIDsgKiAgICAgICAgICAgICAgICAgICAtIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5OiAgcFNyYywgcERzdAotIDsgKiAgICAgICAgICAgICAgICAgICAtIHN0ZXAgPDggb3Igc3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAgCi0gOyAqLwotCi0gICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgCi0gICAgIAotICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotICAgICAKLQotCi0KLSAgICAgSUYgQVJNMTEzNkpTCi0KLTsvL0lucHV0IEFyZ3VtZW50cwotcFNyYyAgICBSTiAwICAgICAgICAKLXBEc3QgICAgUk4gMSAgICAgICAgCi1zdGVwICAgIFJOIDIKLQotOy8vTG9jYWwgVmFyaWFibGVzCi1Db3VudCAgIFJOIDE0Ci1YMCAgICAgIFJOIDIKLVgxICAgICAgUk4gNAotUmV0dXJuICBSTiAwCi0gICAgIE1fU1RBUlQgb214VkNDT01NX0NvcHk4eDgscjUKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgTU9WICAgQ291bnQsc3RlcCAgICAgICAgICAgICAgICAgOy8vQ291bnQ9c3RlcCAKLSAgICAgICAgCi0gICAgICAgIExEUkQgIFgwLFtwU3JjXSxDb3VudCAgICAgICAgICAgIDsvL3BTcmMgYWZ0ZXIgbG9hZGluZyA6IHBTcmM9cFNyYytzdGVwCi0gICAgICAgIExEUkQgIFgxLFtwU3JjXSxDb3VudAotICAgICAgICAKLSAgICAgICAgU1RSRCAgWDAsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCi0gICAgICAgIExEUkQgIFgwLFtwU3JjXSxDb3VudCAKLSAgICAgICAgU1RSRCAgWDEsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCi0gICAgICAgIExEUkQgIFgxLFtwU3JjXSxDb3VudAotICAgICAgICAKLSAgICAgICAgU1RSRCAgWDAsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCi0gICAgICAgIExEUkQgIFgwLFtwU3JjXSxDb3VudAotICAgICAgICBTVFJEICBYMSxbcERzdF0sIzggICAgICAgICAgICAgICAKLSAgICAgICAgTERSRCAgWDEsW3BTcmNdLENvdW50Ci0gICAgICAgIAotICAgICAgICBTVFJEICBYMCxbcERzdF0sIzggICAgICAgICAgICAgIAotICAgICAgICBMRFJEICBYMCxbcFNyY10sQ291bnQKLSAgICAgICAgU1RSRCAgWDEsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCi0gICAgICAgIExEUkQgIFgxLFtwU3JjXSxDb3VudAotICAgICAgICAKLSAgICAgICAgU1RSRCAgWDAsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCi0gICAgICAgIE1PViAgIFJldHVybiwjT01YX1N0c19Ob0VycgotICAgICAgICBTVFJEICBYMSxbcERzdF0sIzggICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBNX0VORAotICAgICAgICBFTkRJRgotICAgICAgICAKLSAgICAgICAgRU5ECi0gICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvY29tbS9zcmMvb214VkNDT01NX0V4cGFuZEZyYW1lX0lfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWQyMjcxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIG9teFZDQ09NTV9FeHBhbmRGcmFtZV9JX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDk2NDEKLTsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi07Ly8gRGVzY3JpcHRpb246Ci07Ly8gVGhpcyBmdW5jdGlvbiB3aWxsIEV4cGFuZCBGcmFtZSBib3VuZGFyeSBwaXhlbHMgaW50byBQbGFuZQotOy8vIAotOy8vIAotCi07Ly8gSW5jbHVkZSBzdGFuZGFyZCBoZWFkZXJzCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgICAKLSAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLQotOy8vIEltcG9ydCBzeW1ib2xzIHJlcXVpcmVkIGZyb20gb3RoZXIgZmlsZXMKLTsvLyAoRm9yIGV4YW1wbGUgdGFibGVzKQotICAgIAotICAKLTsvLyBTZXQgZGVidWdnaW5nIGxldmVsICAgICAgICAKLURFQlVHX09OICAgIFNFVEwge0ZBTFNFfQotCi0KLSAgICAKLQotCi0KLSAgICAgICAgCi07Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCi0gICAgCi0gICAgSUYgIEFSTTExMzZKUwotICAgIAotOy8vSW5wdXQgUmVnaXN0ZXJzCi0KLXBTcmNEc3RQbGFuZSAgICBSTiAgMAotaUZyYW1lV2lkdGggICAgIFJOICAxCi1pRnJhbWVIZWlnaHQgICAgUk4gIDIgICAgCi1pRXhwYW5kUGVscyAgICAgUk4gIDMKLQotCi07Ly9PdXRwdXQgUmVnaXN0ZXJzCi0KLXJlc3VsdCAgICAgICAgICBSTiAgMAotCi07Ly9Mb2NhbCBTY3JhdGNoIFJlZ2lzdGVycwotCi1pUGxhbmVTdGVwICAgICAgUk4gIDQKLXBUb3AgICAgICAgICAgICBSTiAgNQotcEJvdHRvbSAgICAgICAgIFJOICA2Ci1wQm90dG9tSW5kZXggICAgUk4gIDcKLXggICAgICAgICAgICAgICBSTiAgOAoteSAgICAgICAgICAgICAgIFJOICA5Ci10ZW1wVG9wICAgICAgICAgUk4gIDEwCi10ZW1wQm90ICAgICAgICAgUk4gIDExCi1Db2xTdGVwICAgICAgICAgUk4gIDEyCi1wTGVmdCAgICAgICAgICAgUk4gIDUKLXBSaWdodCAgICAgICAgICBSTiAgNgotcFJpZ2h0SW5kZXggICAgIFJOICA3Ci10ZW1wTGVmdDEgICAgICAgUk4gIDEwCi10ZW1wUmlnaHQxICAgICAgUk4gIDExCi10ZW1wTGVmdDIgICAgICAgUk4gIDE0Ci10ZW1wUmlnaHQyICAgICAgUk4gIDIKLWluZGV4WSAgICAgICAgICBSTiAgMTQKLVJvd1N0ZXAgICAgICAgICBSTiAgMTIKLWV4cGFuZFRvNGJ5dGVzICBSTiAgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY29weSBhIGJ5dGUgdG8gNCBieXRlcyBvZiBhIHdvcmQKLSAgICAKLSAgICAgICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSByZXF1aXJlZCBieSB0aGUgZnVuY3Rpb24KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIE1fU1RBUlQgb214VkNDT01NX0V4cGFuZEZyYW1lX0kscjExCi0gICAgICAgIAotICAgICAgICA7Ly8gRGVmaW5lIHN0YWNrIGFyZ3VtZW50cwotICAgICAgICBNX0FSRyAgIGlQbGFuZVN0ZXBPblN0YWNrLCA0Ci0gICAgICAgIAotICAgICAgICA7Ly8gTG9hZCBhcmd1bWVudCBmcm9tIHRoZSBzdGFjawotICAgICAgICBNX0xEUiAgIGlQbGFuZVN0ZXAsIGlQbGFuZVN0ZXBPblN0YWNrCi0gICAgICAgIAotICAgICAgICBNVUwgICAgIHBUb3AsaUV4cGFuZFBlbHMsaVBsYW5lU3RlcAotICAgICAgICBNTEEgICAgIHBCb3R0b20saUZyYW1lSGVpZ2h0LGlQbGFuZVN0ZXAscFNyY0RzdFBsYW5lCi0gICAgICAgIFNVQiAgICAgeCxpRnJhbWVXaWR0aCwjNAotICAgICAgICBNT1YgICAgIGluZGV4WSxwVG9wCi0gICAgICAgIEFERCAgICAgQ29sU3RlcCxpbmRleFksIzQKLSAgICAgICAgU1VCICAgICBwQm90dG9tSW5kZXgscEJvdHRvbSxpUGxhbmVTdGVwCi0gICAgICAgIFNVQiAgICAgcFRvcCxwU3JjRHN0UGxhbmUscFRvcAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIEFERCAgICAgcFRvcCxwVG9wLHgKLSAgICAgICAgQUREICAgICBwQm90dG9tLHBCb3R0b20seAotCi0gICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICA7Ly8gVGhlIGZvbGxvd2luZyBpbXByb3ZlcyB1cG9uIHRoZSBDIGltcGxtZW50YXRpb24KLSAgICAgICAgOy8vIFRoZSB4IGFuZCB5IGxvb3BzIGFyZSBpbnRlcmNoYW5nZWQ6IFRoaXMgZW5zdXJlcyB0aGF0IHRoZSB2YWx1ZXMgb2YKLSAgICAgICAgOy8vIHBTcmNEc3RQbGFuZSBbeF0gYW5kIHBTcmNEc3RQbGFuZSBbKGlGcmFtZUhlaWdodCAtIDEpICogaVBsYW5lU3RlcCArIHhdIAotICAgICAgICA7Ly8gd2hpY2ggZGVwZW5kIG9ubHkgb24gbG9vcCB2YXJpYWJsZSAneCcgYXJlIGxvYWRlZCBvbmNlIGFuZCB1c2VkIGluIAotICAgICAgICA7Ly8gbXVsdGlwbGUgc3RvcmVzIGluIHRoZSAnWScgbG9vcAotICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICA7Ly8geGxvb3AKLUV4cGFuZEZyYW1lVG9wQm90WGxvb3AKLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgdGVtcFRvcCxbcFNyY0RzdFBsYW5lLHhdCi0gICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICA7Ly8gcFNyY0RzdFBsYW5lIFsoaUZyYW1lSGVpZ2h0IC0gMSkgKiBpUGxhbmVTdGVwICsgeF0gaXMgc2ltcGxpZmllZCBhczoKLSAgICAgICAgOy8vIHBTcmNEc3RQbGFuZSArIChpRnJhbWVIZWlnaHQgKiBpUGxhbmVTdGVwKSAtIGlQbGFuZVN0ZXAgKyB4ID09Ci0gICAgICAgIDsvLyBwQm90dG9tIC0gaVBsYW5lU3RlcCArIHggPT0gcEJvdHRvbUluZGV4IFt4XQotICAgICAgICA7Ly8gVGhlIHZhbHVlIG9mIHBCb3R0b21JbmRleCBpcyBjYWxjdWxhdGVkIGFib3ZlIHRoaXMgJ3gnIGxvb3AKLSAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIExEUiAgICAgdGVtcEJvdCxbcEJvdHRvbUluZGV4LHhdCi0gICAgICAgIAotICAgICAgICA7Ly8geWxvb3AKLSAgICAgICAgTU9WICAgICB5LGlFeHBhbmRQZWxzCi0KLUV4cGFuZEZyYW1lVG9wQm90WWxvb3AgICAgICAgIAotICAgICAgICBTVUJTICAgIHkseSwjMQotICAgICAgICBNX1NUUiAgIHRlbXBUb3AsW3BUb3BdLGlQbGFuZVN0ZXAKLSAgICAgICAgTV9TVFIgICB0ZW1wQm90LFtwQm90dG9tXSxpUGxhbmVTdGVwCi0gICAgICAgIEJHVCAgICAgRXhwYW5kRnJhbWVUb3BCb3RZbG9vcAotICAgICAgICAKLSAgICAgICAgU1VCUyAgICB4LHgsIzQKLSAgICAgICAgU1VCICAgICBwVG9wLHBUb3AsQ29sU3RlcAotICAgICAgICBTVUIgICAgIHBCb3R0b20scEJvdHRvbSxDb2xTdGVwCi0gICAgICAgIEJHRSAgICAgRXhwYW5kRnJhbWVUb3BCb3RYbG9vcAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyB5IGxvb3AKLSAgICAgICAgOy8vIFRoZSBwcm9kdWN0IGlzIGFscmVhZHkgY2FsY3VsYXRlZCBhYm92ZSA6IFJldXNlCi0gICAgICAgIDsvL01VTCAgICAgaW5kZXhZLGlFeHBhbmRQZWxzLGlQbGFuZVN0ZXAgICAgICAKLSAgICAgIAotICAgICAgICBTVUIgICAgIHBTcmNEc3RQbGFuZSxwU3JjRHN0UGxhbmUsaW5kZXhZCi0gICAgICAgIFNVQiAgICAgcExlZnQscFNyY0RzdFBsYW5lLGlFeHBhbmRQZWxzICAgICAgICAgICAgICAgICAgOy8vIHBMZWZ0LT5wb2ludHMgdG8gdGhlIHRvcCBsZWZ0IG9mIHRoZSBleHBhbmRlZCBibG9jawotICAgICAgICBBREQgICAgIHBSaWdodCxwU3JjRHN0UGxhbmUsaUZyYW1lV2lkdGgKLSAgICAgICAgU1VCICAgICBwUmlnaHRJbmRleCxwUmlnaHQsIzEgCi0gICAgICAgIAotICAgICAgICBBREQgICAgIHksaUZyYW1lSGVpZ2h0LGlFeHBhbmRQZWxzLExTTCAjMQotICAgICAgICBMRFIgICAgIGV4cGFuZFRvNGJ5dGVzLD0weDAxMDEwMTAxCi0gICAgICAgIAotICAgICAgICBSU0IgICAgIFJvd1N0ZXAsaUV4cGFuZFBlbHMsaVBsYW5lU3RlcCxMU0wgIzEKLQotICAgICAgICA7Ly8gVGhlIFkgTG9vcCBpcyB1bnJvbGxlZCB0d2ljZQotRXhwYW5kRnJhbWVMZWZ0UmlnaHRZbG9vcCAgCi0gICAgICAgIExEUkIgICAgdGVtcExlZnQyLFtwU3JjRHN0UGxhbmUsaVBsYW5lU3RlcF0gICAgICAgICAgICAgOy8vIFByZUxvYWQgdGhlIHZhbHVlcwotICAgICAgICBMRFJCICAgIHRlbXBSaWdodDIsW3BSaWdodEluZGV4LGlQbGFuZVN0ZXBdCi0gICAgICAgIE1fTERSQiAgdGVtcExlZnQxLFtwU3JjRHN0UGxhbmVdLGlQbGFuZVN0ZXAsTFNMICMxICAgICAgOy8vIFByZUxvYWQgdGhlIHZhbHVlcwotICAgICAgICBNX0xEUkIgIHRlbXBSaWdodDEsW3BSaWdodEluZGV4XSxpUGxhbmVTdGVwLExTTCAjMQotICAgICAgICAgICAgICAKLSAgICAgICAgU1VCICAgICB4LGlFeHBhbmRQZWxzLCM0Ci0gICAgICAgIE1VTCAgICAgdGVtcExlZnQyLHRlbXBMZWZ0MixleHBhbmRUbzRieXRlcyAgICAgICAgICAgICAgOy8vIENvcHkgdGhlIHNpbmdsZSBieXRlIHRvIDQgYnl0ZXMKLSAgICAgICAgTVVMICAgICB0ZW1wUmlnaHQyLHRlbXBSaWdodDIsZXhwYW5kVG80Ynl0ZXMKLSAgICAgICAgTVVMICAgICB0ZW1wTGVmdDEsdGVtcExlZnQxLGV4cGFuZFRvNGJ5dGVzICAgICAgICAgICAgICA7Ly8gQ29weSB0aGUgc2luZ2xlIGJ5dGUgdG8gNCBieXRlcwotICAgICAgICBNVUwgICAgIHRlbXBSaWdodDEsdGVtcFJpZ2h0MSxleHBhbmRUbzRieXRlcwotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyB4IGxvb3AKLUV4cGFuZEZyYW1lTGVmdFJpZ2h0WGxvb3AgICAgICAgIAotICAgICAgICBTVUJTICAgIHgseCwjNAotICAgICAgICBTVFIgICAgIHRlbXBMZWZ0MixbcExlZnQsaVBsYW5lU3RlcF0gICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgdGhlIDQgYnl0ZXMgYXQgb25lIGdvCi0gICAgICAgIFNUUiAgICAgdGVtcFJpZ2h0MixbcFJpZ2h0LGlQbGFuZVN0ZXBdCi0gICAgICAgIFNUUiAgICAgdGVtcExlZnQxLFtwTGVmdF0sIzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSB0aGUgNCBieXRlcyBhdCBvbmUgZ28KLSAgICAgICAgU1RSICAgICB0ZW1wUmlnaHQxLFtwUmlnaHRdLCM0Ci0gICAgICAgIEJHRSAgICAgRXhwYW5kRnJhbWVMZWZ0UmlnaHRYbG9vcAotICAgICAgICAKLSAgICAgICAgU1VCUyAgICB5LHksIzIKLSAgICAgICAgQUREICAgICBwTGVmdCxwTGVmdCxSb3dTdGVwCi0gICAgICAgIEFERCAgICAgcFJpZ2h0LHBSaWdodCxSb3dTdGVwCi0gICAgICAgIEJHVCAgICAgRXhwYW5kRnJhbWVMZWZ0UmlnaHRZbG9vcAotICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICA7Ly8gU2V0IHJldHVybiB2YWx1ZQotICAgICAgICAgIAotICAgICAgICBNT1YgICAgICAgICByZXN1bHQsI09NWF9TdHNfTm9FcnIgIAotRW5kICAgICAgICAgICAgIAotICAgICAgCi0gICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiB0YWlsCi0gICAgICAgIAotICAgICAgICBNX0VORAotICAgICAgICAKLSAgICBFTkRJRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly9BUk0xMTM2SlMgICAgICAgIAotIAotICAgICAgICAgICAgCi0gICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvYXBpL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9hcGkvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDNkODZiLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9hcGkvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfQ0FWTENUYWJsZXMuaAotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogCi0gKiBIZWFkZXIgZmlsZSBmb3Igb3B0aW1pemVkIEguMjY0IENBTFZDIHRhYmxlcwotICogCi0gKi8KLSAKLSNpZm5kZWYgQVJNVkNNNFAxMF9DQVZMQ1RBQkxFU19ICi0jZGVmaW5lIEFSTVZDTTRQMTBfQ0FWTENUQUJMRVNfSAotICAKLS8qIENBVkxDIHRhYmxlcyAqLwotCi1leHRlcm4gY29uc3QgT01YX1UxNiAqYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNbMThdOwotZXh0ZXJuIGNvbnN0IE9NWF9VMTYgKmFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNbMTVdOwotZXh0ZXJuIGNvbnN0IE9NWF9VMTYgKmFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzWzNdOwotZXh0ZXJuIGNvbnN0IE9NWF9VMTYgKmFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNbMTVdOwotZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1ppZ1phZ180eDRbMTZdOwotZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1ppZ1phZ18yeDJbNF07Ci1leHRlcm4gY29uc3QgT01YX1M4IGFybVZDTTRQMTBfU3VmZml4VG9MZXZlbFs3XTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQXZlcmFnZV80eF9BbGlnbl91bnNhZmVfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0F2ZXJhZ2VfNHhfQWxpZ25fdW5zYWZlX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk4ZjBhYy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQXZlcmFnZV80eF9BbGlnbl91bnNhZmVfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjM2ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0F2ZXJhZ2VfNHhfQWxpZ25fdW5zYWZlX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDk2NDEKLTsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLQotOy8vIEZ1bmN0aW9uczoKLTsvLyAgICAgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjxBTElHTk1FTlQ+X3Vuc2FmZSAgCi07Ly8KLTsvLyBJbXBsZW1lbnRzIEF2ZXJhZ2Ugb2YgNHg0IHdpdGggZXF1YXRpb24gYyA9IChhK2IrMSk+PjEuCi07Ly8gRmlyc3Qgb3BlcmFuZCB3aWxsIGJlIGF0IG9mZnNldCBBTElHTk1FTlQgZnJvbSBhbGlnbmVkIGFkZHJlc3MKLTsvLyBTZWNvbmQgb3BlcmFuZCB3aWxsIGJlIGF0IGFsaWduZWQgbG9jYXRpb24gYW5kIHdpbGwgYmUgdXNlZCBhcyBvdXRwdXQuCi07Ly8gZGVzdGluYXRpb24gcG9pbnRlZCBieSAocERzdCkgZm9yIHZlcnRpY2FsIGludGVycG9sYXRpb24uCi07Ly8gVGhpcyBmdW5jdGlvbiBuZWVkcyB0byBjb3B5IDQgYnl0ZXMgaW4gaG9yaXpvbnRhbCBkaXJlY3Rpb24gCi07Ly8KLTsvLyBSZWdpc3RlcnMgdXNlZCBhcyBpbnB1dCBmb3IgdGhpcyBmdW5jdGlvbgotOy8vIHIwLHIxLHIyLHIzIHdoZXJlIHIyIGNvbnRhaW5pbmdzIGFsaWduZWQgbWVtb3J5IHBvaW50ZXIgYW5kIHIzIHN0ZXAgc2l6ZQotOy8vCi07Ly8gUmVnaXN0ZXJzIHByZXNlcnZlZCBmb3IgdG9wIGxldmVsIGZ1bmN0aW9uCi07Ly8gcjQscjUscjYscjgscjkscjE0Ci07Ly8KLTsvLyBSZWdpc3RlcnMgbW9kaWZpZWQgYnkgdGhlIGZ1bmN0aW9uCi07Ly8gcjcscjEwLHIxMSxyMTIKLTsvLwotOy8vIE91dHB1dCByZWdpc3RlcnMKLTsvLyByMiAtIHBvaW50ZXIgdG8gdGhlIGFsaWduZWQgbG9jYXRpb24KLTsvLyByMyAtIHN0ZXAgc2l6ZSB0byB0aGlzIGFsaWduZWQgbG9jYXRpb24KLQotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAgIAotICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotCi0gICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMF91bnNhZmUKLSAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24yX3Vuc2FmZQotICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjNfdW5zYWZlCi0KLURFQlVHX09OICAgIFNFVEwge0ZBTFNFfQotCi07Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKLXBQcmVkMCAgICAgICAgICBSTiAwCi1pUHJlZFN0ZXAwICAgICAgUk4gMQotcFByZWQxICAgICAgICAgIFJOIDIKLWlQcmVkU3RlcDEgICAgICBSTiAzCi1wRHN0UHJlZCAgICAgICAgUk4gMgotaURzdFN0ZXAgICAgICAgIFJOIDMKLQotOy8vIERlY2xhcmUgb3RoZXIgaW50ZXJtZWRpYXRlIHJlZ2lzdGVycwotaVByZWRBMCAgICAgICAgIFJOIDEwCi1pUHJlZEExICAgICAgICAgUk4gMTEKLWlQcmVkQjAgICAgICAgICBSTiAxMgotaVByZWRCMSAgICAgICAgIFJOIDE0Ci1UZW1wMSAgICAgICAgICAgUk4gNAotVGVtcDIgICAgICAgICAgIFJOIDUKLVJlc3VsdEEgICAgICAgICBSTiA1Ci1SZXN1bHRCICAgICAgICAgUk4gNAotcjB4ODA4MDgwODAgICAgIFJOIDcKLQotICAgIElGIEFSTTExMzZKUwotICAgICAgICAKLSAgICAgICAgOy8vIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyBhdmVyYWdlIG9mIDR4NCBibG9jayAKLSAgICAgICAgOy8vIHBQcmVkMCBpcyBhdCBhbGlnbm1lbnQgb2Zmc2V0IDAgYW5kIHBQcmVkMSBpcyBhbGlnbm1lbnQgNAotCi0gICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMF91bnNhZmUsIHI2Ci0KLSAgICAgICAgOy8vIENvZGUgc3RhcnQgICAgICAgIAotICAgICAgICBMRFIgICAgICAgICByMHg4MDgwODA4MCwgPTB4ODA4MDgwODAKLQotICAgICAgICA7Ly8gMXN0IGxvYWQKLSAgICAgICAgTV9MRFIgICAgICAgaVByZWRCMCwgW3BQcmVkMV0KLSAgICAgICAgTV9MRFIgICAgICAgaVByZWRBMCwgW3BQcmVkMF0sIGlQcmVkU3RlcDAgICAgICAgIAotICAgICAgICBNX0xEUiAgICAgICBpUHJlZEIxLCBbcFByZWQxLCBpUHJlZFN0ZXAxXQotICAgICAgICBNX0xEUiAgICAgICBpUHJlZEExLCBbcFByZWQwXSwgaVByZWRTdGVwMAotCi0gICAgICAgIDsvLyAoYStiKzEpLzIgPSAoYSsyNTYtKDI1NS1iKSkvMiA9IChhLSgyNTUtYikpLzIgKyAxMjgKLSAgICAgICAgTVZOICAgICAgICAgaVByZWRCMCwgaVByZWRCMAotICAgICAgICBNVk4gICAgICAgICBpUHJlZEIxLCBpUHJlZEIxCi0gICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEEsIGlQcmVkQTAsIGlQcmVkQjAKLSAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QiwgaVByZWRBMSwgaVByZWRCMQotICAgICAgICBFT1IgICAgICAgICBSZXN1bHRBLCBSZXN1bHRBLCByMHg4MDgwODA4MAotICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRBLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgCi0gICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEIsIFJlc3VsdEIsIHIweDgwODA4MDgwCi0gICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEIsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyAybmQgbG9hZAotICAgICAgICBNX0xEUiAgICAgICBpUHJlZEEwLCBbcFByZWQwXSwgaVByZWRTdGVwMCAgICAgICAgCi0gICAgICAgIE1fTERSICAgICAgIGlQcmVkQjAsIFtwUHJlZDFdCi0gICAgICAgIE1fTERSICAgICAgIGlQcmVkQTEsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwCi0gICAgICAgIE1fTERSICAgICAgIGlQcmVkQjEsIFtwUHJlZDEsIGlQcmVkU3RlcDFdCi0KLSAgICAgICAgTVZOICAgICAgICAgaVByZWRCMCwgaVByZWRCMAotICAgICAgICBVSFNVQjggICAgICBSZXN1bHRBLCBpUHJlZEEwLCBpUHJlZEIwCi0gICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjEsIGlQcmVkQjEKLSAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QiwgaVByZWRBMSwgaVByZWRCMQotICAgICAgICBFT1IgICAgICAgICBSZXN1bHRBLCBSZXN1bHRBLCByMHg4MDgwODA4MCAgICAgICAgCi0gICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEEsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAKLSAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QiwgUmVzdWx0QiwgcjB4ODA4MDgwODAKLSAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QiwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgICAgICAgICAgCi1FbmQwCi0gICAgICAgIE1fRU5ECi0KLSAgICAgICAgOy8vIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyBhdmVyYWdlIG9mIDR4NCBibG9jayAKLSAgICAgICAgOy8vIHBQcmVkMCBpcyBhdCBhbGlnbm1lbnQgb2Zmc2V0IDIgYW5kIHBQcmVkMSBpcyBhbGlnbm1lbnQgNAotCi0gICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMl91bnNhZmUsIHI2Ci0KLSAgICAgICAgOy8vIENvZGUgc3RhcnQgICAgICAgIAotICAgICAgICBMRFIgICAgICAgICByMHg4MDgwODA4MCwgPTB4ODA4MDgwODAKLQotICAgICAgICA7Ly8gMXN0IGxvYWQKLSAgICAgICAgTERSICAgICAgICAgVGVtcDEsIFtwUHJlZDAsICM0XQotICAgICAgICBNX0xEUiAgICAgICBpUHJlZEEwLCBbcFByZWQwXSwgaVByZWRTdGVwMCAgICAgICAgCi0gICAgICAgIE1fTERSICAgICAgIGlQcmVkQjAsIFtwUHJlZDFdCi0gICAgICAgIE1fTERSICAgICAgIGlQcmVkQjEsIFtwUHJlZDEsIGlQcmVkU3RlcDFdCi0gICAgICAgIE1fTERSICAgICAgIFRlbXAyLCBbcFByZWQwLCAjNF0KLSAgICAgICAgTV9MRFIgICAgICAgaVByZWRBMSwgW3BQcmVkMF0sIGlQcmVkU3RlcDAKLSAgICAgICAgTVZOICAgICAgICAgaVByZWRCMCwgaVByZWRCMAotICAgICAgICBNVk4gICAgICAgICBpUHJlZEIxLCBpUHJlZEIxICAgICAgICAKLSAgICAgICAgTU9WICAgICAgICAgaVByZWRBMCwgaVByZWRBMCwgTFNSICMxNgotICAgICAgICBPUlIgICAgICAgICBpUHJlZEEwLCBpUHJlZEEwLCBUZW1wMSwgTFNMICMxNiAgICAgICAgCi0gICAgICAgIE1PViAgICAgICAgIGlQcmVkQTEsIGlQcmVkQTEsIExTUiAjMTYKLSAgICAgICAgT1JSICAgICAgICAgaVByZWRBMSwgaVByZWRBMSwgVGVtcDIsIExTTCAjMTYKLQotICAgICAgICA7Ly8gKGErYisxKS8yID0gKGErMjU2LSgyNTUtYikpLzIgPSAoYS0oMjU1LWIpKS8yICsgMTI4Ci0gICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEEsIGlQcmVkQTAsIGlQcmVkQjAKLSAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QiwgaVByZWRBMSwgaVByZWRCMQotICAgICAgICBFT1IgICAgICAgICBSZXN1bHRBLCBSZXN1bHRBLCByMHg4MDgwODA4MAotICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRBLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgCi0gICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEIsIFJlc3VsdEIsIHIweDgwODA4MDgwCi0gICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEIsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyAybmQgbG9hZAotICAgICAgICBMRFIgICAgICAgICBUZW1wMSwgW3BQcmVkMCwgIzRdCi0gICAgICAgIE1fTERSICAgICAgICAgaVByZWRBMCwgW3BQcmVkMF0sIGlQcmVkU3RlcDAgICAgICAgIAotICAgICAgICBMRFIgICAgICAgICBpUHJlZEIwLCBbcFByZWQxXQotICAgICAgICBMRFIgICAgICAgICBpUHJlZEIxLCBbcFByZWQxLCBpUHJlZFN0ZXAxXQotICAgICAgICBMRFIgICAgICAgICBUZW1wMiwgW3BQcmVkMCwgIzRdCi0gICAgICAgIE1fTERSICAgICAgICAgaVByZWRBMSwgW3BQcmVkMF0sIGlQcmVkU3RlcDAKLSAgICAgICAgTVZOICAgICAgICAgaVByZWRCMCwgaVByZWRCMAotICAgICAgICBNVk4gICAgICAgICBpUHJlZEIxLCBpUHJlZEIxCi0gICAgICAgIE1PViAgICAgICAgIGlQcmVkQTAsIGlQcmVkQTAsIExTUiAjMTYKLSAgICAgICAgT1JSICAgICAgICAgaVByZWRBMCwgaVByZWRBMCwgVGVtcDEsIExTTCAjMTYgICAgICAgIAotICAgICAgICBNT1YgICAgICAgICBpUHJlZEExLCBpUHJlZEExLCBMU1IgIzE2Ci0gICAgICAgIE9SUiAgICAgICAgIGlQcmVkQTEsIGlQcmVkQTEsIFRlbXAyLCBMU0wgIzE2Ci0KLSAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QSwgaVByZWRBMCwgaVByZWRCMAotICAgICAgICBVSFNVQjggICAgICBSZXN1bHRCLCBpUHJlZEExLCBpUHJlZEIxCi0gICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEEsIFJlc3VsdEEsIHIweDgwODA4MDgwICAgICAgICAKLSAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QSwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgIAotICAgICAgICBFT1IgICAgICAgICBSZXN1bHRCLCBSZXN1bHRCLCByMHg4MDgwODA4MAotICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRCLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgICAgICAgICAKLUVuZDIKLSAgICAgICAgTV9FTkQKLQotCi0gICAgICAgIDsvLyBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgYXZlcmFnZSBvZiA0eDQgYmxvY2sgCi0gICAgICAgIDsvLyBwUHJlZDAgaXMgYXQgYWxpZ25tZW50IG9mZnNldCAzIGFuZCBwUHJlZDEgaXMgYWxpZ25tZW50IDQKLQotICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjNfdW5zYWZlLCByNgotCi0gICAgICAgIDsvLyBDb2RlIHN0YXJ0ICAgICAgICAKLSAgICAgICAgTERSICAgICAgICAgcjB4ODA4MDgwODAsID0weDgwODA4MDgwCi0KLSAgICAgICAgOy8vIDFzdCBsb2FkCi0gICAgICAgIExEUiAgICAgICAgIFRlbXAxLCBbcFByZWQwLCAjNF0KLSAgICAgICAgTV9MRFIgICAgICAgaVByZWRBMCwgW3BQcmVkMF0sIGlQcmVkU3RlcDAgICAgICAgIAotICAgICAgICBMRFIgICAgICAgICBpUHJlZEIwLCBbcFByZWQxXQotICAgICAgICBMRFIgICAgICAgICBpUHJlZEIxLCBbcFByZWQxLCBpUHJlZFN0ZXAxXQotICAgICAgICBMRFIgICAgICAgICBUZW1wMiwgW3BQcmVkMCwgIzRdCi0gICAgICAgIE1fTERSICAgICAgIGlQcmVkQTEsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwCi0KLSAgICAgICAgTVZOICAgICAgICAgaVByZWRCMCwgaVByZWRCMAotICAgICAgICBNVk4gICAgICAgICBpUHJlZEIxLCBpUHJlZEIxCi0gICAgICAgIE1PViAgICAgICAgIGlQcmVkQTAsIGlQcmVkQTAsIExTUiAjMjQKLSAgICAgICAgT1JSICAgICAgICAgaVByZWRBMCwgaVByZWRBMCwgVGVtcDEsIExTTCAjOCAgICAgICAgICAgICAgICAKLSAgICAgICAgTU9WICAgICAgICAgaVByZWRBMSwgaVByZWRBMSwgTFNSICMyNAotICAgICAgICBPUlIgICAgICAgICBpUHJlZEExLCBpUHJlZEExLCBUZW1wMiwgTFNMICM4Ci0gICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEEsIGlQcmVkQTAsIGlQcmVkQjAKLSAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QiwgaVByZWRBMSwgaVByZWRCMQotICAgICAgICBFT1IgICAgICAgICBSZXN1bHRBLCBSZXN1bHRBLCByMHg4MDgwODA4MAotICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRBLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgCi0gICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEIsIFJlc3VsdEIsIHIweDgwODA4MDgwCi0gICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEIsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyAybmQgbG9hZAotICAgICAgICBMRFIgICAgICAgICBUZW1wMSwgW3BQcmVkMCwgIzRdCi0gICAgICAgIE1fTERSICAgICAgIGlQcmVkQTAsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwICAgICAgICAKLSAgICAgICAgTERSICAgICAgICAgaVByZWRCMCwgW3BQcmVkMV0KLSAgICAgICAgTERSICAgICAgICAgaVByZWRCMSwgW3BQcmVkMSwgaVByZWRTdGVwMV0KLSAgICAgICAgTERSICAgICAgICAgVGVtcDIsIFtwUHJlZDAsICM0XQotICAgICAgICBNX0xEUiAgICAgICBpUHJlZEExLCBbcFByZWQwXSwgaVByZWRTdGVwMAotCi0gICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjAsIGlQcmVkQjAKLSAgICAgICAgTVZOICAgICAgICAgaVByZWRCMSwgaVByZWRCMQotICAgICAgICBNT1YgICAgICAgICBpUHJlZEEwLCBpUHJlZEEwLCBMU1IgIzI0Ci0gICAgICAgIE9SUiAgICAgICAgIGlQcmVkQTAsIGlQcmVkQTAsIFRlbXAxLCBMU0wgIzggICAgICAgIAotICAgICAgICBNT1YgICAgICAgICBpUHJlZEExLCBpUHJlZEExLCBMU1IgIzI0Ci0gICAgICAgIE9SUiAgICAgICAgIGlQcmVkQTEsIGlQcmVkQTEsIFRlbXAyLCBMU0wgIzgKLQotICAgICAgICBVSFNVQjggICAgICBSZXN1bHRBLCBpUHJlZEEwLCBpUHJlZEIwCi0gICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEIsIGlQcmVkQTEsIGlQcmVkQjEKLSAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QSwgUmVzdWx0QSwgcjB4ODA4MDgwODAgICAgICAgIAotICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRBLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgCi0gICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEIsIFJlc3VsdEIsIHIweDgwODA4MDgwCi0gICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEIsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAgICAgICAgIAotRW5kMwotICAgICAgICBNX0VORAotCi0gICAgRU5ESUYKLSAgICAKLSAgICBFTkQKLSAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiODRjOGQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiAKLSAqIE9wdGltaXplZCBDQVZMQyB0YWJsZXMgZm9yIEguMjY0Ci0gKiAKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0KLSNpbmNsdWRlICJhcm1WQ000UDEwX0NBVkxDVGFibGVzLmgiCi0KLS8qIDR4NCBEZVppZ1phZyB0YWJsZSAqLwotCi1jb25zdCBPTVhfVTggYXJtVkNNNFAxMF9aaWdaYWdfNHg0WzE2XSA9Ci17Ci0gICAgMCwgMSwgNCwgOCwgNSwgMiwgMywgNiwgOSwgMTIsIDEzLCAxMCwgNywgMTEsIDE0LCAxNQotfTsKLQotLyogMngyIERlWmlnWmFnIHRhYmxlICovCi0KLWNvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1ppZ1phZ18yeDJbNF0gPQotewotICAgIDAsIDEsIDIsIDMKLX07Ci0KLQotLyoKLSAqIFN1ZmZpeCBUbyBMZXZlbCB0YWJsZQotICogV2UgaW5jcmVtZW50IHRoZSBzdWZmaXggbGVuZ3RoIGlmIAotICogKChMZXZlbENvZGU+PjEpKzEpPigzPDwoU3VmZml4TGVuZ3RoLTEpKSAmJiBTdWZmaXhMZW5ndGg8NgotICogKExldmVsQ29kZT4+MSk+PSgzPDwoU3VmZml4TGVuZ3RoLTEpKSAgICAmJiBTdWZmaXhMZW5ndGg8NgotICogIExldmVsQ29kZSAgICA+PSAzPDxTdWZmaXhMZW5ndGggICAgICAgICAmJiBTdWZmaXhMZW5ndGg8NgotICogKExldmVsQ29kZSsyKSA+PSAoMzw8U3VmZml4TGVuZ3RoKSsyICAgICAmJiBTdWZmaXhMZW5ndGg8NgotICovCi1jb25zdCBPTVhfUzggYXJtVkNNNFAxMF9TdWZmaXhUb0xldmVsWzddID0KLXsKLSAgICAoMzw8MSkrMiwgICAgICAgLyogU3VmZml4TGVuZ3RoPTEgKi8KLSAgICAoMzw8MSkrMiwgICAgICAgLyogU3VmZml4TGVuZ3RoPTEgKi8KLSAgICAoMzw8MikrMiwgICAgICAgLyogU3VmZml4TGVuZ3RoPTIgKi8KLSAgICAoMzw8MykrMiwgICAgICAgLyogU3VmZml4TGVuZ3RoPTMgKi8KLSAgICAoMzw8NCkrMiwgICAgICAgLyogU3VmZml4TGVuZ3RoPTQgKi8KLSAgICAoMzw8NSkrMiwgICAgICAgLyogU3VmZml4TGVuZ3RoPTUgKi8KLSAgICAtMSAgICAgICAgICAgICAgLyogU3VmZml4TGVuZ3RoPTYgLSBuZXZlciBpbmNyZW1lbnQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzBbMTMyXSA9IHsKLSAgICAweDAwMjAsIDB4MDEwMCwgMHgyMDE1LCAweDIwMTUsIDB4NDAwYiwgMHg0MDBiLCAweDQwMGIsIDB4NDAwYiwKLSAgICAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwKLSAgICAweDAwMjgsIDB4MDBmMCwgMHgwMGY4LCAweDAwMjcsIDB4MDAzMCwgMHgwMGQ4LCAweDAwZTAsIDB4MDBlOCwKLSAgICAweDAwMzgsIDB4MDBhMCwgMHgwMGM4LCAweDAwZDAsIDB4MDA0MCwgMHgwMDY4LCAweDAwOTAsIDB4MDA5OCwKLSAgICAweDAwNDgsIDB4MDA1MCwgMHgwMDU4LCAweDAwNjAsIDB4MjdmZiwgMHgyN2ZmLCAweDIwNmIsIDB4MjA2YiwKLSAgICAweDAwODEsIDB4MDA4NSwgMHgwMDgzLCAweDAwNzksIDB4MDA4NywgMHgwMDdkLCAweDAwN2IsIDB4MDA3MSwKLSAgICAweDAwN2YsIDB4MDA3NSwgMHgwMDczLCAweDAwNjksIDB4MDA3MCwgMHgwMDc4LCAweDAwODAsIDB4MDA4OCwKLSAgICAweDIwNzcsIDB4MjA3NywgMHgyMDZkLCAweDIwNmQsIDB4MjA2MywgMHgyMDYzLCAweDIwNjEsIDB4MjA2MSwKLSAgICAweDIwNmYsIDB4MjA2ZiwgMHgyMDY1LCAweDIwNjUsIDB4MjA1YiwgMHgyMDViLCAweDIwNTksIDB4MjA1OSwKLSAgICAweDAwNjcsIDB4MDA1ZCwgMHgwMDUzLCAweDAwNTEsIDB4MDA1ZiwgMHgwMDU1LCAweDAwNGIsIDB4MDA0OSwKLSAgICAweDAwYTgsIDB4MDBiMCwgMHgwMGI4LCAweDAwYzAsIDB4MjA0MSwgMHgyMDQxLCAweDIwNGQsIDB4MjA0ZCwKLSAgICAweDIwNDMsIDB4MjA0MywgMHgyMDM5LCAweDIwMzksIDB4MjA1NywgMHgyMDU3LCAweDIwNDUsIDB4MjA0NSwKLSAgICAweDIwM2IsIDB4MjAzYiwgMHgyMDMxLCAweDIwMzEsIDB4MjA0ZiwgMHgyMDRmLCAweDIwM2QsIDB4MjAzZCwKLSAgICAweDIwMzMsIDB4MjAzMywgMHgyMDI5LCAweDIwMjksIDB4MDA0NywgMHgwMDM1LCAweDAwMmIsIDB4MDAyMSwKLSAgICAweDIwM2YsIDB4MjAzZiwgMHgyMDJkLCAweDIwMmQsIDB4MjAyMywgMHgyMDIzLCAweDIwMTksIDB4MjAxOSwKLSAgICAweDAwMzcsIDB4MDAyNSwgMHgwMDFiLCAweDAwMTEsIDB4MjAyZiwgMHgyMDJmLCAweDIwMWQsIDB4MjAxZCwKLSAgICAweDAwMTMsIDB4MDAwOSwgMHgyMDFmLCAweDIwMWYKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzFbMTI4XSA9IHsKLSAgICAweDAwMjAsIDB4MDBlOCwgMHgwMGYwLCAweDAwZjgsIDB4MDAyNywgMHgwMDFmLCAweDIwMTUsIDB4MjAxNSwKLSAgICAweDQwMGIsIDB4NDAwYiwgMHg0MDBiLCAweDQwMGIsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEsIDB4NDAwMSwKLSAgICAweDAwMjgsIDB4MDBkMCwgMHgwMGQ4LCAweDAwZTAsIDB4MDAzMCwgMHgwMDk4LCAweDAwYzAsIDB4MDBjOCwKLSAgICAweDAwMzgsIDB4MDA2MCwgMHgwMDg4LCAweDAwOTAsIDB4MDA0MCwgMHgwMDQ4LCAweDAwNTAsIDB4MDA1OCwKLSAgICAweDI3ZmYsIDB4MjdmZiwgMHgyMDdmLCAweDIwN2YsIDB4MDA4NywgMHgwMDg1LCAweDAwODMsIDB4MDA4MSwKLSAgICAweDAwN2IsIDB4MDA3OSwgMHgwMDdkLCAweDAwNzMsIDB4MjA3NSwgMHgyMDc1LCAweDIwNzEsIDB4MjA3MSwKLSAgICAweDAwNjgsIDB4MDA3MCwgMHgwMDc4LCAweDAwODAsIDB4MjA3NywgMHgyMDc3LCAweDIwNmQsIDB4MjA2ZCwKLSAgICAweDIwNmIsIDB4MjA2YiwgMHgyMDY5LCAweDIwNjksIDB4MjA2ZiwgMHgyMDZmLCAweDIwNjUsIDB4MjA2NSwKLSAgICAweDIwNjMsIDB4MjA2MywgMHgyMDYxLCAweDIwNjEsIDB4MDA1OSwgMHgwMDVkLCAweDAwNWIsIDB4MDA1MSwKLSAgICAweDAwNjcsIDB4MDA1NSwgMHgwMDUzLCAweDAwNDksIDB4MDBhMCwgMHgwMGE4LCAweDAwYjAsIDB4MDBiOCwKLSAgICAweDIwNWYsIDB4MjA1ZiwgMHgyMDRkLCAweDIwNGQsIDB4MjA0YiwgMHgyMDRiLCAweDIwNDEsIDB4MjA0MSwKLSAgICAweDIwNTcsIDB4MjA1NywgMHgyMDQ1LCAweDIwNDUsIDB4MjA0MywgMHgyMDQzLCAweDIwMzksIDB4MjAzOSwKLSAgICAweDIwNGYsIDB4MjA0ZiwgMHgyMDNkLCAweDIwM2QsIDB4MjAzYiwgMHgyMDNiLCAweDIwMzEsIDB4MjAzMSwKLSAgICAweDAwMjksIDB4MDAzNSwgMHgwMDMzLCAweDAwMjEsIDB4MjA0NywgMHgyMDQ3LCAweDIwMmQsIDB4MjAyZCwKLSAgICAweDIwMmIsIDB4MjAyYiwgMHgyMDE5LCAweDIwMTksIDB4MDAzZiwgMHgwMDI1LCAweDAwMjMsIDB4MDAxMSwKLSAgICAweDAwMzcsIDB4MDAxZCwgMHgwMDFiLCAweDAwMDksIDB4MjAyZiwgMHgyMDJmLCAweDIwMTMsIDB4MjAxMwotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMlsxMTJdID0gewotICAgIDB4MDAyMCwgMHgwMDg4LCAweDAwYjAsIDB4MDBiOCwgMHgwMGMwLCAweDAwYzgsIDB4MDBkMCwgMHgwMGQ4LAotICAgIDB4MDAzZiwgMHgwMDM3LCAweDAwMmYsIDB4MDAyNywgMHgwMDFmLCAweDAwMTUsIDB4MDAwYiwgMHgwMDAxLAotICAgIDB4MDAyOCwgMHgwMDUwLCAweDAwNzgsIDB4MDA4MCwgMHgwMDMwLCAweDAwMzgsIDB4MDA0MCwgMHgwMDQ4LAotICAgIDB4MDdmZiwgMHgwMDgxLCAweDAwODcsIDB4MDA4NSwgMHgwMDgzLCAweDAwNzksIDB4MDA3ZiwgMHgwMDdkLAotICAgIDB4MDA3YiwgMHgwMDcxLCAweDAwNzcsIDB4MDA3NSwgMHgwMDczLCAweDAwNjksIDB4MjA2YiwgMHgyMDZiLAotICAgIDB4MDA1OCwgMHgwMDYwLCAweDAwNjgsIDB4MDA3MCwgMHgyMDYxLCAweDIwNjEsIDB4MjA2ZCwgMHgyMDZkLAotICAgIDB4MjA2MywgMHgyMDYzLCAweDIwNTksIDB4MjA1OSwgMHgyMDZmLCAweDIwNmYsIDB4MjA2NSwgMHgyMDY1LAotICAgIDB4MjA1YiwgMHgyMDViLCAweDIwNTEsIDB4MjA1MSwgMHgwMDY3LCAweDAwNWQsIDB4MDA1MywgMHgwMDQ5LAotICAgIDB4MDA1ZiwgMHgwMDU1LCAweDAwNGIsIDB4MDA0MSwgMHgwMDkwLCAweDAwOTgsIDB4MDBhMCwgMHgwMGE4LAotICAgIDB4MjAzOSwgMHgyMDM5LCAweDIwMzEsIDB4MjAzMSwgMHgyMDRkLCAweDIwNGQsIDB4MjAyOSwgMHgyMDI5LAotICAgIDB4MjA1NywgMHgyMDU3LCAweDIwNDUsIDB4MjA0NSwgMHgyMDQzLCAweDIwNDMsIDB4MjAyMSwgMHgyMDIxLAotICAgIDB4MDAxOSwgMHgwMDNkLCAweDAwM2IsIDB4MDAxMSwgMHgwMDRmLCAweDAwMzUsIDB4MDAzMywgMHgwMDA5LAotICAgIDB4MjAyYiwgMHgyMDJiLCAweDIwMmQsIDB4MjAyZCwgMHgyMDIzLCAweDIwMjMsIDB4MjAyNSwgMHgyMDI1LAotICAgIDB4MjAxYiwgMHgyMDFiLCAweDIwNDcsIDB4MjA0NywgMHgyMDFkLCAweDIwMWQsIDB4MjAxMywgMHgyMDEzCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18zWzgwXSA9IHsKLSAgICAweDAwMjAsIDB4MDAyOCwgMHgwMDMwLCAweDAwMzgsIDB4MDA0MCwgMHgwMDQ4LCAweDAwNTAsIDB4MDA1OCwKLSAgICAweDAwNjAsIDB4MDA2OCwgMHgwMDcwLCAweDAwNzgsIDB4MDA4MCwgMHgwMDg4LCAweDAwOTAsIDB4MDA5OCwKLSAgICAweDAwMDksIDB4MDAwYiwgMHgwN2ZmLCAweDAwMDEsIDB4MDAxMSwgMHgwMDEzLCAweDAwMTUsIDB4MDdmZiwKLSAgICAweDAwMTksIDB4MDAxYiwgMHgwMDFkLCAweDAwMWYsIDB4MDAyMSwgMHgwMDIzLCAweDAwMjUsIDB4MDAyNywKLSAgICAweDAwMjksIDB4MDAyYiwgMHgwMDJkLCAweDAwMmYsIDB4MDAzMSwgMHgwMDMzLCAweDAwMzUsIDB4MDAzNywKLSAgICAweDAwMzksIDB4MDAzYiwgMHgwMDNkLCAweDAwM2YsIDB4MDA0MSwgMHgwMDQzLCAweDAwNDUsIDB4MDA0NywKLSAgICAweDAwNDksIDB4MDA0YiwgMHgwMDRkLCAweDAwNGYsIDB4MDA1MSwgMHgwMDUzLCAweDAwNTUsIDB4MDA1NywKLSAgICAweDAwNTksIDB4MDA1YiwgMHgwMDVkLCAweDAwNWYsIDB4MDA2MSwgMHgwMDYzLCAweDAwNjUsIDB4MDA2NywKLSAgICAweDAwNjksIDB4MDA2YiwgMHgwMDZkLCAweDAwNmYsIDB4MDA3MSwgMHgwMDczLCAweDAwNzUsIDB4MDA3NywKLSAgICAweDAwNzksIDB4MDA3YiwgMHgwMDdkLCAweDAwN2YsIDB4MDA4MSwgMHgwMDgzLCAweDAwODUsIDB4MDA4NwotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfNFszMl0gPSB7Ci0gICAgMHgwMDIwLCAweDAwMzgsIDB4MjAxNSwgMHgyMDE1LCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEsCi0gICAgMHg2MDBiLCAweDYwMGIsIDB4NjAwYiwgMHg2MDBiLCAweDYwMGIsIDB4NjAwYiwgMHg2MDBiLCAweDYwMGIsCi0gICAgMHgwMDI4LCAweDAwMzAsIDB4MDAyMSwgMHgwMDE5LCAweDIwMjcsIDB4MjAyNywgMHgwMDI1LCAweDAwMjMsCi0gICAgMHgyMDFkLCAweDIwMWQsIDB4MjAxYiwgMHgyMDFiLCAweDAwMTEsIDB4MDAxZiwgMHgwMDEzLCAweDAwMDkKLX07Ci0KLWNvbnN0IE9NWF9VMTYgKiBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc1sxOF0gPSB7Ci0gICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMCwgLyogbkM9MCAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzAsIC8qIG5DPTEgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18xLCAvKiBuQz0yICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMSwgLyogbkM9MyAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzIsIC8qIG5DPTQgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18yLCAvKiBuQz01ICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMiwgLyogbkM9NiAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzIsIC8qIG5DPTcgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18zLCAvKiBuQz04ICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMywgLyogbkM9OSAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzMsIC8qIG5DPTEwICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMywgLyogbkM9MTEgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18zLCAvKiBuQz0xMiAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzMsIC8qIG5DPTEzICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMywgLyogbkM9MTQgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18zLCAvKiBuQz0xNSAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzMsIC8qIG5DPTE2ICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfNCAgLyogbkM9LTEgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMFs0MF0gPSB7Ci0gICAgMHgwMDIwLCAweDAwNDgsIDB4MDAwOSwgMHgwMDA3LCAweDIwMDUsIDB4MjAwNSwgMHgyMDAzLCAweDIwMDMsCi0gICAgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsCi0gICAgMHgwMDI4LCAweDAwNDAsIDB4MDAxMSwgMHgwMDBmLCAweDAwMzAsIDB4MDAzOCwgMHgwMDE5LCAweDAwMTcsCi0gICAgMHgyN2ZmLCAweDI3ZmYsIDB4MjAxZiwgMHgyMDFmLCAweDIwMWQsIDB4MjAxZCwgMHgyMDFiLCAweDIwMWIsCi0gICAgMHgyMDE1LCAweDIwMTUsIDB4MjAxMywgMHgyMDEzLCAweDIwMGQsIDB4MjAwZCwgMHgyMDBiLCAweDIwMGIKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMVsyNF0gPSB7Ci0gICAgMHgwMDIwLCAweDAwMjgsIDB4MDAxMSwgMHgwMDBmLCAweDAwMGQsIDB4MDAwYiwgMHgyMDA5LCAweDIwMDksCi0gICAgMHgyMDA3LCAweDIwMDcsIDB4MjAwNSwgMHgyMDA1LCAweDIwMDMsIDB4MjAwMywgMHgyMDAxLCAweDIwMDEsCi0gICAgMHgwMDFkLCAweDAwMWIsIDB4MDAxOSwgMHgwMDE3LCAweDIwMTUsIDB4MjAxNSwgMHgyMDEzLCAweDIwMTMKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMlsyNF0gPSB7Ci0gICAgMHgwMDIwLCAweDAwMjgsIDB4MDAxMSwgMHgwMDBiLCAweDAwMDksIDB4MDAwMSwgMHgyMDBmLCAweDIwMGYsCi0gICAgMHgyMDBkLCAweDIwMGQsIDB4MjAwNywgMHgyMDA3LCAweDIwMDUsIDB4MjAwNSwgMHgyMDAzLCAweDIwMDMsCi0gICAgMHgwMDFiLCAweDAwMTcsIDB4MjAxOSwgMHgyMDE5LCAweDIwMTUsIDB4MjAxNSwgMHgyMDEzLCAweDIwMTMKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfM1syNF0gPSB7Ci0gICAgMHgwMDIwLCAweDAwMjgsIDB4MDAxMywgMHgwMDBmLCAweDAwMDcsIDB4MDAwNSwgMHgyMDExLCAweDIwMTEsCi0gICAgMHgyMDBkLCAweDIwMGQsIDB4MjAwYiwgMHgyMDBiLCAweDIwMDksIDB4MjAwOSwgMHgyMDAzLCAweDIwMDMsCi0gICAgMHgyMDE5LCAweDIwMTksIDB4MjAxNywgMHgyMDE3LCAweDIwMTUsIDB4MjAxNSwgMHgyMDAxLCAweDIwMDEKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfNFsyMF0gPSB7Ci0gICAgMHgwMDIwLCAweDAwMTUsIDB4MDAxMSwgMHgwMDA1LCAweDAwMDMsIDB4MDAwMSwgMHgyMDBmLCAweDIwMGYsCi0gICAgMHgyMDBkLCAweDIwMGQsIDB4MjAwYiwgMHgyMDBiLCAweDIwMDksIDB4MjAwOSwgMHgyMDA3LCAweDIwMDcsCi0gICAgMHgyMDE3LCAweDIwMTcsIDB4MjAxMywgMHgyMDEzCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzVbMjBdID0gewotICAgIDB4MDAyMCwgMHgwMDExLCAweDIwMTMsIDB4MjAxMywgMHgyMDBmLCAweDIwMGYsIDB4MjAwZCwgMHgyMDBkLAotICAgIDB4MjAwYiwgMHgyMDBiLCAweDIwMDksIDB4MjAwOSwgMHgyMDA3LCAweDIwMDcsIDB4MjAwNSwgMHgyMDA1LAotICAgIDB4MDAxNSwgMHgwMDAxLCAweDIwMDMsIDB4MjAwMwotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc182WzIwXSA9IHsKLSAgICAweDAwMjAsIDB4MDAwZiwgMHgyMDExLCAweDIwMTEsIDB4MjAwZCwgMHgyMDBkLCAweDIwMDksIDB4MjAwOSwKLSAgICAweDIwMDcsIDB4MjAwNywgMHgyMDA1LCAweDIwMDUsIDB4NDAwYiwgMHg0MDBiLCAweDQwMGIsIDB4NDAwYiwKLSAgICAweDAwMTMsIDB4MDAwMSwgMHgyMDAzLCAweDIwMDMKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfN1syMF0gPSB7Ci0gICAgMHgwMDIwLCAweDAwMDMsIDB4MjAwZiwgMHgyMDBmLCAweDIwMGQsIDB4MjAwZCwgMHgyMDA3LCAweDIwMDcsCi0gICAgMHg0MDBiLCAweDQwMGIsIDB4NDAwYiwgMHg0MDBiLCAweDQwMDksIDB4NDAwOSwgMHg0MDA5LCAweDQwMDksCi0gICAgMHgwMDExLCAweDAwMDEsIDB4MjAwNSwgMHgyMDA1Ci19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzhbMjBdID0gewotICAgIDB4MDAyMCwgMHgwMDA1LCAweDIwMGIsIDB4MjAwYiwgMHg0MDBkLCAweDQwMGQsIDB4NDAwZCwgMHg0MDBkLAotICAgIDB4NDAwOSwgMHg0MDA5LCAweDQwMDksIDB4NDAwOSwgMHg0MDA3LCAweDQwMDcsIDB4NDAwNywgMHg0MDA3LAotICAgIDB4MDAwMywgMHgwMDAxLCAweDIwMGYsIDB4MjAwZgotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc185WzIwXSA9IHsKLSAgICAweDAwMjAsIDB4MDAwZCwgMHgyMDA1LCAweDIwMDUsIDB4NDAwYiwgMHg0MDBiLCAweDQwMGIsIDB4NDAwYiwKLSAgICAweDQwMDksIDB4NDAwOSwgMHg0MDA5LCAweDQwMDksIDB4NDAwNywgMHg0MDA3LCAweDQwMDcsIDB4NDAwNywKLSAgICAweDIwMDMsIDB4MjAwMywgMHgyMDAxLCAweDIwMDEKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMTBbMTZdID0gewotICAgIDB4MDAwMSwgMHgwMDAzLCAweDIwMDUsIDB4MjAwNSwgMHgyMDA3LCAweDIwMDcsIDB4MjAwYiwgMHgyMDBiLAotICAgIDB4NjAwOSwgMHg2MDA5LCAweDYwMDksIDB4NjAwOSwgMHg2MDA5LCAweDYwMDksIDB4NjAwOSwgMHg2MDA5Ci19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzExWzE2XSA9IHsKLSAgICAweDAwMDEsIDB4MDAwMywgMHgyMDA5LCAweDIwMDksIDB4NDAwNSwgMHg0MDA1LCAweDQwMDUsIDB4NDAwNSwKLSAgICAweDYwMDcsIDB4NjAwNywgMHg2MDA3LCAweDYwMDcsIDB4NjAwNywgMHg2MDA3LCAweDYwMDcsIDB4NjAwNwotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18xMlsxNl0gPSB7Ci0gICAgMHgyMDAxLCAweDIwMDEsIDB4MjAwMywgMHgyMDAzLCAweDQwMDcsIDB4NDAwNywgMHg0MDA3LCAweDQwMDcsCi0gICAgMHg2MDA1LCAweDYwMDUsIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUsIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMTNbMTZdID0gewotICAgIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywgMHg0MDAzLAotICAgIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUsIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUsIDB4NjAwNSwgMHg2MDA1Ci19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzE0WzE2XSA9IHsKLSAgICAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwKLSAgICAweDYwMDMsIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsIDB4NjAwMwotfTsKLQotY29uc3QgT01YX1UxNiAqIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNbMTVdID0gewotICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMCwKLSAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzEsCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18yLAotICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMywKLSAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzQsCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc181LAotICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfNiwKLSAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzcsCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc184LAotICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfOSwKLSAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzEwLAotICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMTEsCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18xMiwKLSAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzEzLAotICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMTQKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzXzBbMTZdID0gewotICAgIDB4MjAwNywgMHgyMDA3LCAweDIwMDUsIDB4MjAwNSwgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywgMHg0MDAzLAotICAgIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlc18xWzE2XSA9IHsKLSAgICAweDQwMDUsIDB4NDAwNSwgMHg0MDA1LCAweDQwMDUsIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywKLSAgICAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMQotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXNfMlsxNl0gPSB7Ci0gICAgMHg2MDAzLCAweDYwMDMsIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsCi0gICAgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEKLX07Ci0KLWNvbnN0IE9NWF9VMTYgKiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlc1szXSA9IHsKLSAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlc18wLAotICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzXzEsCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXNfMgotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc18wWzhdID0gewotICAgIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywgMHg0MDAxLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzFbOF0gPSB7Ci0gICAgMHgyMDA1LCAweDIwMDUsIDB4MjAwMywgMHgyMDAzLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfMls4XSA9IHsKLSAgICAweDIwMDcsIDB4MjAwNywgMHgyMDA1LCAweDIwMDUsIDB4MjAwMywgMHgyMDAzLCAweDIwMDEsIDB4MjAwMQotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc18zWzhdID0gewotICAgIDB4MDAwOSwgMHgwMDA3LCAweDIwMDUsIDB4MjAwNSwgMHgyMDAzLCAweDIwMDMsIDB4MjAwMSwgMHgyMDAxCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzRbOF0gPSB7Ci0gICAgMHgwMDBiLCAweDAwMDksIDB4MDAwNywgMHgwMDA1LCAweDIwMDMsIDB4MjAwMywgMHgyMDAxLCAweDIwMDEKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNVs4XSA9IHsKLSAgICAweDAwMDMsIDB4MDAwNSwgMHgwMDA5LCAweDAwMDcsIDB4MDAwZCwgMHgwMDBiLCAweDIwMDEsIDB4MjAwMQotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc182WzI0XSA9IHsKLSAgICAweDAwMTAsIDB4MDAwZCwgMHgwMDBiLCAweDAwMDksIDB4MDAwNywgMHgwMDA1LCAweDAwMDMsIDB4MDAwMSwKLSAgICAweDAwMTgsIDB4MDAxMSwgMHgyMDBmLCAweDIwMGYsIDB4MDAyMCwgMHgwMDE1LCAweDIwMTMsIDB4MjAxMywKLSAgICAweDAwMjgsIDB4MDAxOSwgMHgyMDE3LCAweDIwMTcsIDB4MDdmZiwgMHgwMDFkLCAweDIwMWIsIDB4MjAxYgotfTsKLQotLyogVGFibGVzIDcgdG8gMTQgYXJlIGR1cGxpY2F0ZXMgb2YgdGFibGUgNiAqLwotCi1jb25zdCBPTVhfVTE2ICogYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc1sxNV0gPSB7Ci0gICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc18wLCAgLyogWmVyb3NMZWZ0PTEgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzEsCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc18yLAotICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfMywKLSAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzQsCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc181LCAgLyogWmVyb3NMZWZ0PTYgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9NyAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNiwgIC8qIFplcm9zTGVmdD04ICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc182LCAgLyogWmVyb3NMZWZ0PTkgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9MTAgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9MTEgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9MTIgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9MTMgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9MTQgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYgICAvKiBaZXJvc0xlZnQ9MTUgKi8KLX07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYV91bnNhZmVfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFfdW5zYWZlX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFkY2I5Mi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYV91bnNhZmVfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYV91bnNhZmVfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgOTY0MQotOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAgIAotICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotCi0KLQotICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYV91bnNhZmVfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hX3Vuc2FmZV9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwODUyMzMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hX3Vuc2FmZV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzODAgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFfdW5zYWZlX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDk2NDEKLTsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgICAKLSAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLQotCi0KLSAgICBJRiAgQVJNMTEzNkpTCi0KLU1BU0tfMSAgRVFVIDB4MDEwMTAxMDEKLQotOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCi0KLXBRMCAgICAgICAgUk4gMAotU3RlcEFyZyAgICBSTiAxCi10QzBBcmcgICAgIFJOIDIKLWFscGhhICAgICAgUk4gNgotCi1iZXRhICAgICAgIFJOIDE0Ci1iUyAgICAgICAgIFJOIDE0Ci10QzAgICAgICAgIFJOIDE0Ci1wdEMwICAgICAgIFJOIDEKLQotOy8vIERlY2xhcmUgTG9jYWwvVGVtcG9yYXJ5IHZhcmlhYmxlcwotCi07Ly8gUGl4ZWxzCi1wXzAgICAgIFJOIDMgCi1wXzEgICAgIFJOIDUgIAotcF8yICAgICBSTiA0ICAKLXBfMyAgICAgUk4gMiAgCi1xXzAgICAgIFJOIDggIAotcV8xICAgICBSTiA5ICAKLXFfMiAgICAgUk4gMTAgCi1xXzMgICAgIFJOIDEyIAotCi0KLTsvLyBGaWx0ZXJpbmcKLQotYXAwcTAgICBSTiAxICAKLWZpbHQgICAgUk4gMgotICAgICAgICAKLW0wMCAgICAgUk4gNwotbTAxICAgICBSTiAxMQotCi1hcGZsZyAgIFJOIDAgCi1hcWZsZyAgIFJOIDYKLQotdEMgICAgICBSTiAxCi0KLQotOy8vRGVjbGFyYXRpb25zIGZvciBiU0xUNCBrZXJuZWwKLQotcG9zICAgICBSTiA3Ci1uZWcgICAgIFJOIDEyCi0KLVAwYSAgICAgUk4gMSAgIAotUDFhICAgICBSTiA4ICAgCi1RMGEgICAgIFJOIDcgIAotUTFhICAgICBSTiA0ICAgCi0KLXUxICAgICAgUk4gMyAgIAotbWF4ICAgICBSTiAxMgotbWluICAgICBSTiAyICAgCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLTsvL0RlY2xhcmF0aW9ucyBmb3IgYlNHRTQga2VybmVsCi0KLXFfM2IgICAgUk4gOSAgIAotcF8zYiAgICBSTiAwCi1hcHFmbGcgIFJOIDEyCi0KLVAwYiAgICAgUk4gNgotUDFiICAgICBSTiA3IAotUDJiICAgICBSTiAxCi0KLVEwYiAgICAgUk4gOSAKLVExYiAgICAgUk4gMCAKLVEyYiAgICAgUk4gMgotCi07Ly8gTWlzY2VsbGFub3VzCi0KLWEgICAgICAgUk4gMAotdDAgICAgICBSTiAzIAotdDEgICAgICBSTiAxMgotdDIgICAgICBSTiA3Ci10MyAgICAgIFJOIDExCi10NCAgICAgIFJOIDQgICAKLXQ1ICAgICAgUk4gMSAgIAotdDggICAgICBSTiA2ICAgCi10OSAgICAgIFJOIDE0ICAKLXQxMCAgICAgUk4gNSAgIAotdDExICAgICBSTiA5ICAgCi0KLTsvLyBSZWdpc3RlciB1c2FnZSBmb3IgLSBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNMVDRfdW5zYWZlKCkKLTsvLwotOy8vIElucHV0cyAtIDMsNCw1LDgsOSwxMCAtIElucHV0IFBpeGVscyAocDAtcDIscTAtcTIpCi07Ly8gICAgICAgIC0gMiAtIGZpbHQsIDAgLSBhcGZsZywgNiAtIGFxZmxnCi07Ly8gICAgICAgIC0gMTEgLSBtMDEsIDcgLSB0QzAKLTsvLyAgICAgICAgIAotOy8vIE91dHB1dHMgLSAxLDgsNywxMSAtIE91dHB1dCBQaXhlbHMoUDBhLFAxYSxRMGEsUTFhKQotOy8vCi07Ly8gUmVnaXN0ZXJzIENvcnJ1cHRlZCAtIDAtMyw1LTEyLDE0Ci0KLQotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0xUNF91bnNhZmUsIGxyCi0KLSAgICAgICAgOy8vIFNpbmNlIGJldGEgPD0gMTggYW5kIGFscGhhIDw9IDI1NSB3ZSBrbm93Ci0gICAgICAgIDsvLyAtMjU0IDw9IHAwLXEwIDw9IDI1NAotICAgICAgICA7Ly8gIC0xNyA8PSBxMS1xMCA8PSAxNwotICAgICAgICA7Ly8gIC0xNyA8PSBwMS1wMCA8PSAxNwotCi0gICAgICAgIDsvLyBkZWx0YSA9IENsaXAzKCAtdEMsIHRDLCAoKCgocTAtcDApPDwyKSArIChwMS1xMSkgKyA0KT4+MykpCi0gICAgICAgIDsvLyAKLSAgICAgICAgOy8vICAgIENhbGN1bGF0ZSBBID0gKCgocTAtcDApPDwyKSArIChwMS1xMSkgKyA0KT4+MwotICAgICAgICA7Ly8gICAgICAgICAgICAgICAgPSAoNCpxMCAtIDQqcDAgKyBwMSAtIHExICsgNCk+PjMKLSAgICAgICAgOy8vICAgICAgICAgICAgICAgID0gKChwMS1wMCkgLSAocTEtcTApIC0gMyoocDAtcTApICsgNCk+PjMKLSAgICAgICAgCi0gICAgICAgIFVTVUI4ICAgdDEsIHBfMSwgcF8wCi0gICAgICAgIE1VTCAgICAgdEMwLCB0MiwgbTAxCi0gICAgICAgIAotICAgICAgICBVU1VCOCAgIHQyLCBxXzEsIHFfMAotICAgICAgICBTU1VCOCAgIHQxLCB0MSwgdDIKLQotICAgICAgICBVU1VCOCAgIHQyLCBwXzAsIHFfMAotICAgICAgICBBTkQgICAgIHQyLCB0MiwgbTAxCi0gICAgICAgIFNIU1VCOCAgdDEsIHQxLCB0MgotICAgICAgICBVSFNVQjggIHQ1LCBwXzAsIHFfMAotICAgICAgICBTU1VCOCAgIHQxLCB0MSwgdDIKLSAgICAgICAgU0hTVUI4ICB0MSwgdDEsIHQ1Ci0gICAgICAgIE1PViAgICAgbTAwLCAjMAotICAgICAgICBTQUREOCAgIHQxLCB0MSwgbTAxCi0gICAgICAgIFNIU1VCOCAgdDEsIHQxLCB0NQotICAgICAgICAKLSAgICAgICAgOy8vIHRDID0gdEMwCi0gICAgICAgIDsvLyBpZiAoYXAgPCBiZXRhKSB0QysrOwotICAgICAgICA7Ly8gaWYgKGFxIDwgYmV0YSkgdEMrKzsKLSAgICAgICAgVVNVQjggICB0NSwgZmlsdCwgbTAxICAgCi0gICAgICAgIFNFTCAgICAgdEMwLCB0QzAsIG0wMAotICAgICAgICBVUUFERDggIHRDLCB0QzAsIGFwZmxnCi0gICAgICAgIFNTVUI4ICAgdDEsIHQxLCBtMDAKLSAgICAgICAgVVFBREQ4ICB0QywgdEMsIGFxZmxnCi0KLSAgICAgICAgOy8vIFNwbGl0IGludG8gcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIHBhcnQgYW5kIGNsaXAgCi0gICAgICAgIFNFTCAgICAgcG9zLCB0MSwgbTAwCi0gICAgICAgIFVTVUI4ICAgbmVnLCBwb3MsIHQxCi0gICAgICAgIFVTVUI4ICAgdDMsIHBvcywgdEMKLSAgICAgICAgU0VMICAgICBwb3MsIHRDLCBwb3MKLSAgICAgICAgVVNVQjggICB0MywgbmVnLCB0QwotICAgICAgICBTRUwgICAgIG5lZywgdEMsIG5lZwotICAgICAgICAKLSAgICAgICAgOy8vUmVsb2FkIG0wMQotICAgICAgICBMRFIgICAgIG0wMSw9TUFTS18xCi0KLSAgICAgICAgVVFBREQ4ICBQMGEsIHBfMCwgcG9zCi0gICAgICAgIFVRU1VCOCAgUTBhLCBxXzAsIHBvcwotICAgICAgICBVUVNVQjggIFAwYSwgUDBhLCBuZWcKLSAgICAgICAgVVFBREQ4ICBRMGEsIFEwYSwgbmVnCi0gICAgICAgIAotICAgICAgICA7Ly8gQ2hvb3NlIHRvIHN0b3JlIHRoZSBmaWx0ZXJlZAotICAgICAgICA7Ly8gdmFsdWUgb3IgdGhlIG9yaWdpbmFsIHBpeGVsCi0gICAgICAgIFVTVUI4ICAgdDEsIGZpbHQsIG0wMSAgICAKLSAgICAgICAgU0VMICAgICBQMGEsIFAwYSwgcF8wCi0gICAgICAgIFNFTCAgICAgUTBhLCBRMGEsIHFfMAotICAgIAotICAgICAgICA7Ly8gZGVsdGEgPSAocDIgKyAoKHAwK3EwKzEpPj4xKSAtIChwMTw8MSkpPj4xOwotICAgICAgICA7Ly8gdTEgPSAocDAgKyBxMCArIDEpPj4xCi0gICAgICAgIDsvLyB1MSA9ICggKHFfMCAtIHBfMCcpPj4xICkgXiAweDgwCi0gICAgICAgIE1WTiAgICAgcF8wLCBwXzAKLSAgICAgICAgVUhTVUI4ICB1MSwgcV8wLCBwXzAgCi0gICAgICAgIFVRQUREOCAgbWF4LCBwXzEsIHRDMAotICAgICAgICBFT1IgICAgIHUxLCB1MSwgbTAxICxMU0wgIzcKLSAgICAKLSAgICAgICAgOy8vIENhbGN1bGF0ZSBBID0gKHAyK3UxKT4+MSAKLSAgICAgICAgOy8vIFRoZW4gZGVsdGEgPSBDbGlwMyggLXRDMCwgdEMwLCBBIC0gcDEpCi0KLSAgICAgICAgOy8vIENsaXAgUDEKLSAgICAgICAgVUhBREQ4ICBQMWEsIHBfMiwgdTEKLSAgICAgICAgVVFTVUI4ICBtaW4sIHBfMSwgdEMwCi0gICAgICAgIFVTVUI4ICAgdDQsIFAxYSwgbWF4Ci0gICAgICAgIFNFTCAgICAgUDFhLCBtYXgsIFAxYQotICAgICAgICBVU1VCOCAgIHQ0LCBQMWEsIG1pbgotICAgICAgICBTRUwgICAgIFAxYSwgUDFhLCBtaW4KLQotICAgICAgICA7Ly8gQ2xpcCBRMQotICAgICAgICBVSEFERDggIFExYSwgcV8yLCB1MQotICAgICAgICBVUUFERDggIG1heCwgcV8xLCB0QzAKLSAgICAgICAgVVFTVUI4ICBtaW4sIHFfMSwgdEMwCi0gICAgICAgIFVTVUI4ICAgdDAsIFExYSwgbWF4Ci0gICAgICAgIFNFTCAgICAgUTFhLCBtYXgsIFExYQotICAgICAgICBVU1VCOCAgIHQwLCBRMWEsIG1pbgotICAgICAgICBTRUwgICAgIFExYSwgUTFhLCBtaW4KLSAgICAgICAgCi0gICAgICAgIDsvLyBDaG9vc2UgdG8gc3RvcmUgdGhlIGZpbHRlcmVkCi0gICAgICAgIDsvLyB2YWx1ZSBvciB0aGUgb3JpZ2luYWwgcGl4ZWwKLSAgICAgICAgVVNVQjggICB0MCwgYXBmbGcsIG0wMQotICAgICAgICBTRUwgICAgIFAxYSwgUDFhLCBwXzEKLSAgICAgICAgVVNVQjggICB0MCwgYXFmbGcsIG0wMQotICAgICAgICBTRUwgICAgIHQzLCBRMWEsIHFfMQotICAgICAgICAKLSAgICAgICAgTV9FTkQKLQotOy8vIFJlZ2lzdGVyIHVzYWdlIGZvciAtIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0dFNF91bnNhZmUoKQotOy8vCi07Ly8gSW5wdXRzIC0gMyw0LDUsOCw5LDEwIC0gSW5wdXQgUGl4ZWxzIChwMC1wMixxMC1xMikKLTsvLyAgICAgICAgLSAyIC0gZmlsdCwgMCAtIGFwZmxnLGFxZmxnCi07Ly8gICAgICAgIC0gMSAtIGFwMHEwLCA2IC0gYWxwaGEKLTsvLyAgICAgICAgLSA3IC0gbTAwLCAxMSAtIG0wMQotOy8vICAgICAgICAgCi07Ly8gT3V0cHV0cyAtIDYsNywxLDksMCwyIC0gT3V0cHV0IFBpeGVscyhQMGIsUDFiLFAyYiwgUTBiLFExYixRMmIpCi07Ly8gCi07Ly8gUmVnaXN0ZXJzIENvcnJ1cHRlZCAtIDAtMyw1LTEyLDE0Ci0KLSAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNHRTRfdW5zYWZlLCBscgotICAgIAotICAgICAgICA7Ly8gYXBmbGcgPSBhcGZsZyAmJiB8cDAtcTB8PCgoYWxwaGE+PjIpKzIpIAotICAgICAgICA7Ly8gYXBmbGcgPSBhcWZsZyAmJiB8cDAtcTB8PCgoYWxwaGE+PjIpKzIpIAotCi0gICAgICAgIE1fQVJHICAgcER1bW15LDQKLSAgICAgICAgTV9BUkcgICBwUV8zLDQKLSAgICAgICAgTV9BUkcgICBwUF8zLDQKLSAgICAgICAgCi0gICAgICAgIFVIQUREOCAgYWxwaGEsIGFscGhhLCBtMDAKLSAgICAgICAgVVNVQjggICB0OSwgcF8yLCBwXzAgICAgOy8vdDkgPSBkcDJwMAotICAgICAgICBVSEFERDggIGFscGhhLCBhbHBoYSwgbTAwCi0gICAgICAgIEFERCAgICAgYWxwaGEsIGFscGhhLCBtMDEsIExTTCAjMSAgICAgICAgCi0gICAgICAgIFVTVUI4ICAgYXAwcTAsIGFwMHEwLCBhbHBoYQotICAgICAgICBTRUwgICAgIGFwcWZsZywgbTAwLCBhcGZsZwotCi0gICAgICAgIDsvLyBQMCA9IChwMiArIDIqcDEgKyAyKnAwICsgMipxMCArIHExICsgNCk+PjMgCi0gICAgICAgIDsvLyAgICA9ICgocDItcDApICsgMioocDEtcDApICsgKHExLXEwKSArIDMqKHEwLXAwKSArIDgqcDAgKyA0KT4+MwotICAgICAgICA7Ly8gICAgPSBwMCArICgoKHAyLXAwKSArIDIqKHAxLXAwKSArIChxMS1xMCkgLSAzKihwMC1xMCkgKyA0KT4+MykKLQotICAgICAgICA7Ly8gUDEgPSAocDIgKyBwMSArIHEwICsgcDAgKyAyKT4+MgotICAgICAgICA7Ly8gICAgPSBwMCArICgoKHAyLXAwKSArIChwMS1wMCkgLSAocDAtcTApICsgMik+PjIpCi0gICAgICAgIAotICAgICAgICA7Ly8gUDIgPSAoMipwMyArIDMqcDIgKyBwMSArIHAwICsgcTAgKyA0KT4+MwotICAgICAgICA7Ly8gICAgPSAoMioocDMtcDApICsgMyoocDItcDApICsgKHAxLXAwKSAtIChwMC1xMCkgKyA4KnAwICsgNCk+PjMKLSAgICAgICAgOy8vICAgID0gcDAgKyAoKChwMy1wMCkgKyAocDItcDApICsgdDIgKyAyKT4+MikKLQotICAgICAgICA7Ly8gQ29tcHV0ZSBQMGIKLSAgICAgICAgVVNVQjggICB0MiwgcF8wLCBxXzAgICAgICAgICAKLSAgICAgICAgU1NVQjggICB0NSwgdDksIHQyICAgICAgICAgICAKLQotICAgICAgICBVU1VCOCAgIHQ4LCBxXzEsIHFfMCAgICAgICAgIAotICAgICAgICBTSEFERDggIHQ4LCB0NSwgdDgKLQotICAgICAgICBVU1VCOCAgIHQ5LCBwXzEsIHBfMCAgICAgICAgIAotICAgICAgICBTQUREOCAgIHQ4LCB0OCwgdDkKLSAgICAgICAgU0hTVUI4ICB0OCwgdDgsIHQyCi0gICAgICAgIFNIQUREOCAgdDUsIHQ1LCB0OQotICAgICAgICBTSEFERDggIHQ4LCB0OCwgbTAxCi0gICAgICAgIFNIQUREOCAgdDksIHQ1LCBtMDEKLSAgICAgICAgU0FERDggICBQMGIsIHBfMCwgdDggICAgICAgICAKLSAgICAgICAgOy8vIFAwYiByZWFkeQotICAgICAgICAKLSAgICAgICAgOy8vIENvbXB1dGUgUDFiCi0gICAgICAgIE1fTERSICAgcF8zYiwgcFBfMwotICAgICAgICBTQUREOCAgIFAxYiwgcF8wLCB0OSAgICAgICAgIAotICAgICAgICA7Ly8gUDFiIHJlYWR5Ci0gICAgICAgIAotICAgICAgICA7Ly8gQ29tcHV0ZSBQMmIKLSAgICAgICAgVVNVQjggICB0OSwgcF8yLCBwXzAgICAgICAgICAKLSAgICAgICAgU0FERDggICB0NSwgdDUsIHQ5Ci0gICAgICAgIFVIU1VCOCAgdDksIHBfM2IsIHBfMCAgICAgICAgCi0gICAgICAgIEVPUiAgICAgYSwgcF8zYiwgcF8wICAgICAgICAgCi0gICAgICAgIEFORCAgICAgYSwgYSwgbTAxCi0gICAgICAgIFNIQUREOCAgdDUsIHQ1LCBhCi0gICAgICAgIFVIQUREOCAgYSwgcF8wLCBxXzEKLSAgICAgICAgU0FERDggICB0NSwgdDUsIG0wMQotICAgICAgICBTSEFERDggIHQ1LCB0NSwgdDkKLSAgICAgICAgTVZOICAgICB0OSwgcF8xCi0gICAgICAgIFNBREQ4ICAgUDJiLCBwXzAsIHQ1ICAgICAgICAgCi0gICAgICAgIDsvLyBQMmIgcmVhZHkKLSAgICAgICAgCi0gICAgICAgIFVIU1VCOCAgYSwgYSwgdDkKLSAgICAgICAgT1JSICAgICB0OSwgYXBxZmxnLCBtMDEKLSAgICAgICAgVVNVQjggICB0OSwgYXBxZmxnLCB0OQotCi0gICAgICAgIEVPUiAgICAgYSwgYSwgbTAxLCBMU0wgIzcKLSAgICAgICAgU0VMICAgICBQMGIsIFAwYiwgYQotICAgICAgICBTRUwgICAgIFAxYiwgUDFiLCBwXzEKLSAgICAgICAgU0VMICAgICBQMmIsIFAyYiwgcF8yCi0KLSAgICAgICAgVVNVQjggICB0NCwgZmlsdCwgbTAxCi0gICAgICAgIFNFTCAgICAgUDBiLCBQMGIsIHBfMAotCi0gICAgICAgIAotICAgICAgICA7Ly8gUTAgPSAocTIgKyAyKnExICsgMipxMCArIDIqcDAgKyBwMSArIDQpPj4zIAotICAgICAgICA7Ly8gICAgPSAoKHEyLXEwKSArIDIqKHExLXEwKSArIChwMS1wMCkgKyAzKihwMC1xMCkgKyA4KnEwICsgNCk+PjMKLSAgICAgICAgOy8vICAgID0gcTAgKyAoKChxMi1xMCkgKyAyKihxMS1xMCkgKyAocDEtcDApICsgMyoocDAtcTApICsgNCk+PjMpCi0KLSAgICAgICAgOy8vIFExID0gKHEyICsgcTEgKyBwMCArIHEwICsgMik+PjIKLSAgICAgICAgOy8vICAgID0gcTAgKyAoKChxMi1xMCkgKyAocTEtcTApICsgKHAwLXEwKSArIDIpPj4yKQotCi0gICAgICAgIDsvLyBRMiA9ICgyKnEzICsgMypxMiArIHExICsgcTAgKyBwMCArIDQpPj4zCi0gICAgICAgIDsvLyAgICA9ICgyKihxMy1xMCkgKyAzKihxMi1xMCkgKyAocTEtcTApICsgKHAwLXEwKSArIDgqcTAgKyA0KT4+MwotICAgICAgICA7Ly8gICAgPSBxMCArICgoKHEzLXEwKSArIChxMi1xMCkgKyB0MiArIDIpPj4yKQotCi0KLSAgICAgICAgOy8vIENvbXB1dGUgUTBiIFExYgotICAgICAgICBVU1VCOCAgIHQ0LCBxXzIsIHFfMCAgICAgICAgICAgCi0gICAgICAgIFVTVUI4ICAgYSwgcF8wLCBxXzAKLSAgICAgICAgVVNVQjggICB0OSwgcF8xLCBwXzAKLSAgICAgICAgU0FERDggICB0MCwgdDQsIGEKLSAgICAgICAgU0hBREQ4ICB0OSwgdDAsIHQ5Ci0gICAgICAgIFVIQUREOCAgdDEwLCBxXzAsIHBfMQotICAgICAgICBTQUREOCAgIHQ5LCB0OSwgYQotICAgICAgICBVU1VCOCAgIGEsIHFfMSwgcV8wCi0gICAgICAgIFNIQUREOCAgdDksIHQ5LCBhCi0gICAgICAgIFNIQUREOCAgdDAsIHQwLCBhCi0gICAgICAgIFNIQUREOCAgdDksIHQ5LCBtMDEKLSAgICAgICAgU0hBREQ4ICBhLCB0MCwgbTAxCi0gICAgICAgIFNBREQ4ICAgdDksIHFfMCwgdDkgICAgICAgICAgICAKLSAgICAgICAgOy8vIFEwYiByZWFkeSAtIHQ5Ci0gICAgICAgIAotICAgICAgICBNT1YgICAgIHQ0LCAjMAotICAgICAgICBVSEFERDggIGFwcWZsZywgYXBxZmxnLCB0NAotICAgICAgICAKLSAgICAgICAgU0FERDggICBRMWIsIHFfMCwgYSAKLSAgICAgICAgOy8vIFExYiByZWFkeQotICAgICAgIAotICAgICAgICBVU1VCOCAgIHQ0LCBhcHFmbGcsIG0wMQotICAgICAgICBTRUwgICAgIFExYiwgUTFiLCBxXzEKLSAgICAgICAgTVZOICAgICB0MTEsIHFfMQotICAgICAgICBVSFNVQjggIHQxMCwgdDEwLCB0MTEKLSAgICAgICAgTV9MRFIgICBxXzNiLCBwUV8zCi0gICAgICAgIEVPUiAgICAgdDEwLCB0MTAsIG0wMSwgTFNMICM3Ci0gICAgICAgIFNFTCAgICAgdDksIHQ5LCB0MTAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBDb21wdXRlIFEyYgotICAgICAgICBVU1VCOCAgIHQ0LCBxXzIsIHFfMAotICAgICAgICBTQUREOCAgIHQ0LCB0MCwgdDQKLSAgICAgICAgRU9SICAgICB0MCwgcV8zYiwgcV8wIAotICAgICAgICBBTkQgICAgIHQwLCB0MCwgbTAxCi0gICAgICAgIFNIQUREOCAgdDQsIHQ0LCB0MAotICAgICAgICBVSFNVQjggIHQxMCwgcV8zYiwgcV8wCi0gICAgICAgIFNBREQ4ICAgdDQsIHQ0LCBtMDEKLSAgICAgICAgU0hBREQ4ICB0NCwgdDQsIHQxMAotCi0gICAgICAgIFVTVUI4ICAgdDEwLCBmaWx0LCBtMDEKLSAgICAgICAgU0VMICAgICBRMGIsIHQ5LCBxXzAKLQotICAgICAgICBTQUREOCAgIHQ0LCBxXzAsIHQ0ICAgICAgICAgICAgCi0gICAgICAgIDsvLyBRMmIgcmVhZHkgLSB0NAotCi0gICAgICAgIFVTVUI4ICAgdDEwLCBhcHFmbGcsIG0wMQotICAgICAgICBTRUwgICAgIFEyYiwgdDQsIHFfMgotCi0gICAgICAgIE1fRU5ECi0gICAgCi0gICAgRU5ESUYKLQotICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcl9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNjM4YmYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcl9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzkgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDk2NDEKLTsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fQml0RGVjX3MuaAotICAgICAgICAKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzCi0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzCi0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlcwotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlcwotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9TdWZmaXhUb0xldmVsCi0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1ppZ1phZ180eDQKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfWmlnWmFnXzJ4MgotICAgICAgICAKLSAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLSAgICAgICAgCi07Ly9ERUJVR19PTiAgICBTRVRMIHtUUlVFfQotICAgICAgICAKLUxBU1RfQ09FRkYgICAgICAgICAgICAgICBFUVUgMHgyMCAgICAgICAgOy8vIEVuZCBvZiBibG9jayBmbGFnCi1UV09fQllURV9DT0VGRiAgICAgICAgICAgRVFVIDB4MTAKLQotOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCi0KLXBwQml0U3RyZWFtICAgICBSTiAwCi1wT2Zmc2V0ICAgICAgICAgUk4gMQotcE51bUNvZWZmICAgICAgIFJOIDIKLXBwUG9zQ29lZmJ1ZiAgICBSTiAzCi1uQyAgICAgICAgICAgICAgUk4gNCA7Ly8gbnVtYmVyIG9mIGNvZWZmcyBvciAxNyBmb3IgY2hyb21hCi1zTWF4TnVtQ29lZmYgICAgUk4gNQotCi07Ly8gRGVjbGFyZSBpbm5lciBsb29wIHJlZ2lzdGVycwotCi07Ly8gTGV2ZWwgbG9vcAotQ291bnQgICAgICAgICAgIFJOIDAKLVRyYWlsaW5nT25lcyAgICBSTiAxCi1wTGV2ZWwgICAgICAgICAgUk4gMgotTGV2ZWxTdWZmaXggICAgIFJOIDMKLVN1ZmZpeExlbmd0aCAgICBSTiA0Ci1Ub3RhbENvZWZmICAgICAgUk4gNQotCi1wVkxEVGFibGUgICAgICAgUk4gNgotU3ltYm9sICAgICAgICAgIFJOIDcKLVQxICAgICAgICAgICAgICBSTiA4Ci1UMiAgICAgICAgICAgICAgUk4gOQotUkJpdFN0cmVhbSAgICAgIFJOIDEwCi1SQml0QnVmZmVyICAgICAgUk4gMTEKLVJCaXRDb3VudCAgICAgICBSTiAxMgotbHIgICAgICAgICAgICAgIFJOIDE0Ci0KLTsvLyBSdW4gbG9vcAotQ291bnQgICAgICAgICAgIFJOIDAKLVplcm9zTGVmdCAgICAgICBSTiAxCi1wTGV2ZWwgICAgICAgICAgUk4gMgotcHBSdW5UYWJsZSAgICAgIFJOIDMKLXBSdW4gICAgICAgICAgICBSTiA0Ci1Ub3RhbENvZWZmICAgICAgUk4gNQotCi1wVkxEVGFibGUgICAgICAgUk4gNgotU3ltYm9sICAgICAgICAgIFJOIDcKLVQxICAgICAgICAgICAgICBSTiA4Ci1UMiAgICAgICAgICAgICAgUk4gOQotUkJpdFN0cmVhbSAgICAgIFJOIDEwCi1SQml0QnVmZmVyICAgICAgUk4gMTEKLVJCaXRDb3VudCAgICAgICBSTiAxMgotbHIgICAgICAgICAgICAgIFJOIDE0Ci0KLTsvLyBGaWxsIGluIGNvZWZmaWNpZW50cyBsb29wCi1wUG9zQ29lZmJ1ZiAgICAgUk4gMAotdGVtcCAgICAgICAgICAgIFJOIDEKLXBMZXZlbCAgICAgICAgICBSTiAyCi1wcFBvc0NvZWZidWYgICAgUk4gMwotcFJ1biAgICAgICAgICAgIFJOIDQKLVRvdGFsQ29lZmYgICAgICBSTiA1Ci1wWmlnWmFnICAgICAgICAgUk4gNgotCi1UMSAgICAgICAgICAgICAgUk4gOAotVDIgICAgICAgICAgICAgIFJOIDkKLVJCaXRTdHJlYW0gICAgICBSTiAxMAotUkJpdEJ1ZmZlciAgICAgIFJOIDExCi1SQml0Q291bnQgICAgICAgUk4gMTIKLUNvZWZmTnVtICAgICAgICBSTiAxNAotCi0KLQotICAgIElGIEFSTTExMzZKUwotICAgICAgICAKLSAgICAgICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSByZXF1aXJlZCBieSB0aGUgZnVuY3Rpb24KLSAgICAgICAgTV9BTExPQzQgcHBwQml0U3RyZWFtLCA0Ci0gICAgICAgIE1fQUxMT0M0IHBwT2Zmc2V0LCA0Ci0gICAgICAgIE1fQUxMT0M0IHBwcFBvc0NvZWZidWYsIDQKLSAgICAgICAgTV9BTExPQzQgcHBMZXZlbCwgMTYqMgotICAgICAgICBNX0FMTE9DNCBwcFJ1biwgMTYKLSAgICAgICAgCi0gICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpciwgcjExCi0gICAgICAgIAotICAgICAgICA7Ly8gRGVmaW5lIHN0YWNrIGFyZ3VtZW50cwotICAgICAgICBNX0FSRyAgIHBOQywgNAotICAgICAgICBNX0FSRyAgIHBTTWF4TnVtQ29lZmYsNAotICAgICAgICAKLSAgICAgICAgOy8vIENvZGUgc3RhcnQgICAgICAgIAotICAgICAgICBNX0JEX0lOSVQwIHBwQml0U3RyZWFtLCBwT2Zmc2V0LCBSQml0U3RyZWFtLCBSQml0QnVmZmVyLCBSQml0Q291bnQKLSAgICAgICAgTERSICAgICAgICBwVkxEVGFibGUsID1hcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlcwotICAgICAgICBNX0xEUiAgICAgIG5DLCBwTkMKLSAgICAgICAgCi0gICAgICAgIE1fQkRfSU5JVDEgVDEsIFQyLCBscgotICAgICAgICBMRFIgICAgIHBWTERUYWJsZSwgW3BWTERUYWJsZSwgbkMsIExTTCAjMl0gIDsvLyBGaW5kIFZMRCB0YWJsZSAgICAKLSAgICAgICAgCi0gICAgICAgIE1fQkRfSU5JVDIgVDEsIFQyLCBscgotCi0gICAgICAgIDsvLyBEZWNvZGUgU3ltYm9sID0gVG90YWxDb2VmZio0ICsgVHJhaWxpbmdPbmVzCi0gICAgICAgIE1fQkRfVkxEICBTeW1ib2wsIFQxLCBUMiwgcFZMRFRhYmxlLCA0LCAyCi0gICAgCi0gICAgICAgIE1PVlMgICAgVG90YWxDb2VmZiwgU3ltYm9sLCBMU1IgIzIgICAgCi0gICAgICAgIFNUUkIgICAgVG90YWxDb2VmZiwgW3BOdW1Db2VmZl0gICAgCi0gICAgICAgIE1fUFJJTlRGICJUb3RhbENvZWZmPSVkXG4iLCBUb3RhbENvZWZmCi0gICAgICAgIEJFUS5XICAgRW5kTm9FcnJvciAgICAgICAgICAgICAgICAgIDsvLyBGaW5pc2hlZCBpZiBubyBjb2VmZmljaWVudHMKLQotICAgICAgICBDTVAgICAgIFN5bWJvbCwgIzE3KjQKLSAgICAgICAgQkdFLlcgICBFbmRCYWRTeW1ib2wgICAgICAgICAgICAgICAgOy8vIEVycm9yIGlmIGJhZCBzeW1ib2wKLSAgICAgICAgCi0gICAgICAgIDsvLyBTYXZlIGJpdHN0cmVhbSBwb2ludGVycwotICAgICAgICBNX1NUUiAgIHBwQml0U3RyZWFtLCAgcHBwQml0U3RyZWFtCi0gICAgICAgIE1fU1RSICAgcE9mZnNldCwgICAgICBwcE9mZnNldAotICAgICAgICBNX1NUUiAgIHBwUG9zQ29lZmJ1ZiwgcHBwUG9zQ29lZmJ1ZiAgICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBEZWNvZGUgVHJhaWxpbmcgT25lcwotICAgICAgICBBTkRTICAgIFRyYWlsaW5nT25lcywgU3ltYm9sLCAjMwotICAgICAgICBNX0FEUiAgIHBMZXZlbCwgcHBMZXZlbCAgICAgICAgICAgIAotICAgICAgICBNX1BSSU5URiAiVHJhaWxpbmdPbmVzPSVkXG4iLCBUcmFpbGluZ09uZXMKLSAgICAgICAgQkVRICAgICBUcmFpbGluZ09uZXNEb25lICAgIAotICAgICAgICBNT1YgICAgIENvdW50LCBUcmFpbGluZ09uZXMKLVRyYWlsaW5nT25lc0xvb3AgICAgCi0gICAgICAgIE1fQkRfUkVBRDggU3ltYm9sLCAxLCBUMQotICAgICAgICBTVUJTICAgIENvdW50LCBDb3VudCwgIzEKLSAgICAgICAgTU9WICAgICBUMSwgIzEKLSAgICAgICAgU1VCICAgICBUMSwgVDEsIFN5bWJvbCwgTFNMICMxCi0gICAgICAgIE1fUFJJTlRGICJMZXZlbD0lZFxuIiwgVDEKLSAgICAgICAgU1RSSCAgICBUMSwgW3BMZXZlbF0sICMyCi0gICAgICAgIEJHVCAgICAgVHJhaWxpbmdPbmVzTG9vcAotVHJhaWxpbmdPbmVzRG9uZSAgICAKLSAgICAKLSAgICAgICAgOy8vIERlY29kZSBsZXZlbCB2YWx1ZXMgICAgCi0gICAgICAgIFNVQlMgICAgQ291bnQsIFRvdGFsQ29lZmYsIFRyYWlsaW5nT25lcyAgICAgOy8vIE51bWJlciBvZiBsZXZlbHMgdG8gcmVhZAotICAgICAgICBCRVEgICAgIERlY29kZVJ1bnMgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBOb25lIGxlZnQKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgU3VmZml4TGVuZ3RoLCAjMQotICAgICAgICBDTVAgICAgIFRvdGFsQ29lZmYsICMxMAotICAgICAgICBNT1ZMRSAgIFN1ZmZpeExlbmd0aCwgIzAKLSAgICAgICAgQ01QICAgICBUcmFpbGluZ09uZXMsICMzICAgIDsvLyBpZiAoVHJhaWxpbmdPbmVzPDMpCi0gICAgICAgIE1PVkxUICAgVHJhaWxpbmdPbmVzLCAjNCAgICA7Ly8gdGhlbiBUcmFpbGluZ09uZXMgPSArNAotICAgICAgICBNT1ZHRSAgIFRyYWlsaW5nT25lcywgIzIgICAgOy8vIGVsc2UgVHJhaWxpbmdPbmVzID0gKzIKLSAgICAgICAgTU9WR0UgICBTdWZmaXhMZW5ndGgsICMwICAgIDsvLyAgICAgIFN1ZmZpeExlbmd0aCA9IDAKLSAgICAgICAgCi1MZXZlbExvb3AKLSAgICAgICAgTV9CRF9DTFoxNiBTeW1ib2wsIFQxLCBUMiAgIDsvLyBTeW1ib2w9TGV2ZWxQcmVmaXgKLSAgICAgICAgQ01QICAgICBTeW1ib2wsIzE2Ci0gICAgICAgIEJHRSAgICAgRW5kQmFkU3ltYm9sCi0gICAgICAgIAotICAgICAgICBNT1ZTICAgIGxyLCBTdWZmaXhMZW5ndGggICAgOy8vIGlmIExldmVsU3VmZml4U2l6ZT09MAotICAgICAgICBURVFFUSAgIFN5bWJvbCwgIzE0ICAgICAgICAgOy8vICAgYW5kICBMZXZlbFByZWZpeD09MTQKLSAgICAgICAgTU9WRVEgICBsciwgIzQgICAgICAgICAgICAgIDsvLyAgIHRoZW4gTGV2ZWxTdWZmaXhTaXplPTQKLSAgICAgICAgVEVRICAgICBTeW1ib2wsICMxNSAgICAgICAgIDsvLyBpZiBMZXZlbFN1ZmZpeFNpemU9PTE1Ci0gICAgICAgIE1PVkVRICAgbHIsICMxMiAgICAgICAgICAgICA7Ly8gICB0aGVuIExldmVsU3VmZml4U2l6ZT0xMgotICAgICAgICAKLSAgICAgICAgVEVRRVEgICBTdWZmaXhMZW5ndGgsIzAKLSAgICAgICAgQURERVEgICBTeW1ib2wsU3ltYm9sLCMxNQotICAgICAgICAKLSAgICAgICAgVEVRICAgICBsciwgIzAgICAgICAgICAgICAgIDsvLyBpZiBMZXZlbFN1ZmZpeFNpemU9PTAKLSAgICAgICAgQkVRICAgICBMZXZlbENvZGVSZWFkICAgICAgIDsvLyBMZXZlbENvZGUgPSBMZXZlbFByZWZpeAotICAgICAgICAKLSAgICAgICAgTV9CRF9WUkVBRDE2IExldmVsU3VmZml4LCBsciwgVDEsIFQyICA7Ly8gUmVhZCBMZXZlbCBTdWZmaXgKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgU3ltYm9sLCBTeW1ib2wsIExTTCBTdWZmaXhMZW5ndGgKLSAgICAgICAgQUREICAgICBTeW1ib2wsIExldmVsU3VmZml4LCBTeW1ib2wKLSAgICAgICAgICAgICAKLUxldmVsQ29kZVJlYWQgICAgICAgIAotICAgICAgICA7Ly8gU3ltYm9sID0gTGV2ZWxDb2RlCi0gICAgICAgIEFERCAgICAgU3ltYm9sLCBTeW1ib2wsIFRyYWlsaW5nT25lcyA7Ly8gKzQgaWYgbGV2ZWwgY2Fubm90IGJlICsvLTEsICsyIG8vdwotICAgICAgICBNT1YgICAgIFRyYWlsaW5nT25lcywgIzIKLSAgICAgICAgTU9WUyAgICBUMSwgU3ltYm9sLCBMU1IgIzEKLSAgICAgICAgUlNCQ1MgICBUMSwgVDEsICMwICAgICAgICAgICAgICAgICAgOy8vIElmIFN5bWJvbCBvZGQgdGhlbiBuZWdhdGUKLSAgICAgICAgTV9QUklOVEYgIkxldmVsPSVkXG4iLCBUMQotICAgICAgICBTVFJIICAgIFQxLCBbcExldmVsXSwgIzIgICAgICAgICAgICA7Ly8gU3RvcmUgbGV2ZWwuCi0gICAgICAgIAotICAgICAgICBMRFIgICAgIFQyLCA9YXJtVkNNNFAxMF9TdWZmaXhUb0xldmVsCi0gICAgICAgIExEUlNCICAgVDEsIFtUMiwgU3VmZml4TGVuZ3RoXSAgICAgIDsvLyBGaW5kIGluY3JlbWVudCBsZXZlbCAgICAgICAgCi0gICAgICAgIFRFUSAgICAgU3VmZml4TGVuZ3RoLCAjMAotICAgICAgICBNT1ZFUSAgIFN1ZmZpeExlbmd0aCwgIzEKLSAgICAgICAgQ01QICAgICBTeW1ib2wsIFQxCi0gICAgICAgIEFERENTICAgU3VmZml4TGVuZ3RoLCBTdWZmaXhMZW5ndGgsICMxICAgICAgICAKLSAgICAgICAgU1VCUyAgICBDb3VudCwgQ291bnQsICMxICAgICAgICAKLSAgICAgICAgQkdUICAgICBMZXZlbExvb3AKLSAgICAgICAgCi1EZWNvZGVSdW5zICAgICAgICAKLSAgICAgICAgOy8vIEZpbmQgbnVtYmVyIG9mIHplcm9zCi0gICAgICAgIE1fTERSICAgVDEsIHBTTWF4TnVtQ29lZmYgICAgICAgICAgIDsvLyBzTWF4TnVtQ29lZmYKLSAgICAgICAgU1VCICAgICBDb3VudCwgVG90YWxDb2VmZiwgIzEgICAgICAgOy8vIE51bWJlciBvZiBydW5zIGV4Y2x1ZGluZyBsYXN0Ci0gICAgICAgIFNVQlMgICAgWmVyb3NMZWZ0LCBUMSwgVG90YWxDb2VmZiAgIDsvLyBNYXhpbXVtIG51bWJlciBvZiB6ZXJvcyB0aGVyZSBjb3VsZCBiZQotICAgICAgICBNX0FEUiAgIHBSdW4sIHBwUnVuCi0gICAgICAgIE1PViAgICAgQ29lZmZOdW0sVG90YWxDb2VmZgotICAgICAgICBTVUIgICAgIENvZWZmTnVtLENvZWZmTnVtLCMxCi0gICAgICAgIEJFUSAgICAgTm9aZXJvc0xlZnQKLSAgICAgICAgCi0gICAgICAgIDsvLyBVbnBhY2sgbnVtYmVyIG9mIHplcm9zIGZyb20gYml0c3RyZWFtCi0gICAgICAgIFRFUSAgICAgVDEsICM0ICAgICAgICAKLSAgICAgICAgTERSRVEgICBwVkxEVGFibGUsID0oYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXMtNCkKLSAgICAgICAgTERSTkUgICBwVkxEVGFibGUsID0oYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlcy00KQotICAgICAgICBMRFIgICAgIHBWTERUYWJsZSwgW3BWTERUYWJsZSwgVG90YWxDb2VmZiwgTFNMICMyXQotICAgICAgICAKLSAgICAgICAgTV9CRF9WTEQgIFN5bWJvbCwgVDEsIFQyLCBwVkxEVGFibGUsIDQsIDIgOy8vIFN5bWJvbCA9IFplcm9zTGVmdAotICAgICAgICBDTVAgICAgIFN5bWJvbCwjMTYKLSAgICAgICAgQkdFICAgICBFbmRCYWRTeW1ib2wKLQotICAgICAgICBMRFIgICAgIHBwUnVuVGFibGUsID0oYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlcy00KQotICAgICAgICBNX0FEUiAgIHBSdW4sIHBwUnVuCi0gICAgICAgIE1PVlMgICAgWmVyb3NMZWZ0LCBTeW1ib2wKLQotICAgICAgICBBREQgICAgIENvZWZmTnVtLENvZWZmTnVtLFplcm9zTGVmdCAgICAgICAgCi0KLSAgICAgICAgQkVRICAgICBOb1plcm9zTGVmdAotICAgICAgICAKLSAgICAgICAgOy8vIERlY29kZSBydW5zIHdoaWxlIHplcm9zIGFyZSBsZWZ0IGFuZCBtb3JlIHRoYW4gb25lIGNvZWZmaWNpZW50Ci1SdW5Mb29wIAotICAgICAgICBTVUJTICAgIENvdW50LCBDb3VudCwgIzEKLSAgICAgICAgTERSICAgICBwVkxEVGFibGUsIFtwcFJ1blRhYmxlLCBaZXJvc0xlZnQsIExTTCMyXQotICAgICAgICBCTFQgICAgIExhc3RSdW4KLSAgICAgICAgTV9CRF9WTEQgIFN5bWJvbCwgVDEsIFQyLCBwVkxEVGFibGUsIDMsIDIgOy8vIFN5bWJvbCA9IFJ1bgotICAgICAgICBDTVAgICAgIFN5bWJvbCwjMTUgICAgICAgICAKLSAgICAgICAgQkdFICAgICBFbmRCYWRTeW1ib2wgICAgICAgIAotCi0gICAgICAgIFNVQlMgICAgWmVyb3NMZWZ0LCBaZXJvc0xlZnQsIFN5bWJvbAotICAgICAgICBNX1BSSU5URiAiUnVuPSVkXG4iLCBTeW1ib2wKLSAgICAgICAgU1RSQiAgICBTeW1ib2wsIFtwUnVuXSwgIzEKLSAgICAgICAgQkdUICAgICBSdW5Mb29wCi0gICAgICAgIAotICAgICAgICA7Ly8gRGVjb2RlIHJ1bnMgd2hpbGUgbm8gemVyb3MgYXJlIGxlZnQKLU5vWmVyb3NMZWZ0IAotICAgICAgICBTVUJTICAgIENvdW50LCBDb3VudCwgIzEKLSAgICAgICAgTV9QUklOVEYgIlJ1bj0lZFxuIiwgWmVyb3NMZWZ0Ci0gICAgICAgIFNUUkdFQiAgWmVyb3NMZWZ0LCBbcFJ1bl0sICMxCi0gICAgICAgIEJHVCAgICAgTm9aZXJvc0xlZnQKLQotTGFzdFJ1biAgICAgICAgCi0gICAgICAgIDsvLyBGaW5hbCBydW4gbGVuZ3RoIGlzIHJlbWFpbmluZyB6ZXJvcwotICAgICAgICBNX1BSSU5URiAiTGFzdFJ1bj0lZFxuIiwgWmVyb3NMZWZ0Ci0gICAgICAgIFNUUkIgICAgWmVyb3NMZWZ0LCBbcFJ1bl0sICMxICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBXcml0ZSBjb2VmZmljaWVudHMgdG8gb3V0cHV0IGFycmF5Ci0gICAgICAgIE1fTERSICAgVDEsIHBTTWF4TnVtQ29lZmYgICAgICAgICAgICAgICAgICAgIDsvLyBzTWF4TnVtQ29lZmYKLSAgICAgICAgVEVRICAgICBUMSwgIzE1Ci0gICAgICAgIEFEREVRICAgQ29lZmZOdW0sQ29lZmZOdW0sIzEKLSAgICAgICAgCi0KLSAgICAgICAgU1VCICAgICBwUnVuLHBSdW4sVG90YWxDb2VmZgotICAgICAgICBTVUIgICAgIHBMZXZlbCxwTGV2ZWwsVG90YWxDb2VmZiAgCi0gICAgICAgIFNVQiAgICAgcExldmVsLHBMZXZlbCxUb3RhbENvZWZmICAgCi0KLSAgICAgICAgTV9MRFIgICBwcFBvc0NvZWZidWYsIHBwcFBvc0NvZWZidWYKLSAgICAgICAgTERSICAgICBwUG9zQ29lZmJ1ZiwgW3BwUG9zQ29lZmJ1Zl0KLSAgICAgICAgVEVRICAgICBUMSwgIzQKLSAgICAgICAgTERSRVEgICBwWmlnWmFnLCA9YXJtVkNNNFAxMF9aaWdaYWdfMngyCi0gICAgICAgIExEUk5FICAgcFppZ1phZywgPWFybVZDTTRQMTBfWmlnWmFnXzR4NAotCi0gICAgICAgIAotICAgICAgICAKLU91dHB1dExvb3AKLSAgICAgICAgCi0gICAgICAgIExEUkIgICAgVDIsIFtwUnVuXSwjMQotICAgICAgICBMRFJCICAgIFQxLCBbcFppZ1phZywgQ29lZmZOdW1dCi0gICAgICAgIFNVQiAgICAgQ29lZmZOdW0sIENvZWZmTnVtLCAjMSAgICAgIDsvLyBTa2lwIE5vbiB6ZXJvCi0gICAgICAgIFNVQiAgICAgQ29lZmZOdW0sIENvZWZmTnVtLCBUMiAgICAgIDsvLyBTa2lwIFplcm8gcnVuCi0gICAgICAgIAotICAgICAgICBMRFJTSCAgIFQyLCBbcExldmVsXSwjMgotICAgICAgICAKLSAgICAgICAgU1VCUyAgICBUb3RhbENvZWZmLCBUb3RhbENvZWZmLCAjMSAgICAgICAKLSAgICAgICAgT1JSRVEgICBUMSwgVDEsICNMQVNUX0NPRUZGCi0gICAgICAgIAotICAgICAgICBBREQgICAgIHRlbXAsIFQyLCAjMTI4Ci0gICAgICAgIENNUCAgICAgdGVtcCwgIzI1NgotICAgICAgICBPUlJDUyAgIFQxLCBUMSwgI1RXT19CWVRFX0NPRUZGCi0KLSAgICAgICAgCi0gICAgICAgIFRFUSAgICAgVG90YWxDb2VmZiwgIzAgICAgICAgICAgICAgIDsvLyBQcmVzZXJ2ZXMgY2FycnkgICAgICAgIAotICAgICAgICAKLSAgICAgICAgTV9QUklOVEYgIk91dHB1dD0lMDJ4ICUwNHhcbiIsIFQxLCBUMgotICAgICAgICBTVFJCICAgIFQxLCBbcFBvc0NvZWZidWZdLCAjMQotICAgICAgICBTVFJCICAgIFQyLCBbcFBvc0NvZWZidWZdLCAjMQotICAgICAgICBNT1YgICAgIFQyLCBUMiwgTFNSICM4Ci0gICAgICAgIFNUUkNTQiAgVDIsIFtwUG9zQ29lZmJ1Zl0sICMxICAgICAgICAgICAgICAgIAotICAgICAgICBCTkUgICAgIE91dHB1dExvb3AKLSAgICAgICAgCi0gICAgICAgIDsvLyBGaW5pc2hlZAotICAgICAgICBTVFIgICAgIHBQb3NDb2VmYnVmLCBbcHBQb3NDb2VmYnVmXQotICAgICAgICBNX0xEUiAgIHBwQml0U3RyZWFtLCBwcHBCaXRTdHJlYW0KLSAgICAgICAgTV9MRFIgICBwT2Zmc2V0LCBwcE9mZnNldAotICAgICAgICBCICAgICAgIEVuZE5vRXJyb3IKLSAgICAgICAgICAgIAotRW5kQmFkU3ltYm9sCi0gICAgICAgIE1PViAgICAgcjAsICNPTVhfU3RzX0VycgotICAgICAgICBCICAgICAgIEVuZCAgICAKLSAgICAgICAgCi1FbmROb0Vycm9yCi0gICAgICAgIDsvLyBGaW5pc2hlZCByZWFkaW5nIGZyb20gdGhlIGJpdHN0cmVhbSAgICAgICAgICAgICAgICAKLSAgICAgICAgTV9CRF9GSU5JIHBwQml0U3RyZWFtLCBwT2Zmc2V0Ci0gICAgICAgIAotICAgICAgICA7Ly8gU2V0IHJldHVybiB2YWx1ZQotICAgICAgICBNT1YgICAgIHIwLCAjT01YX1N0c19Ob0VyciAgICAKLUVuZAotICAgICAgICBNX0VORAotICAgIAotICAgIEVORElGCi0gICAgCi0gICAgRU5ECi0gICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVxdWFudFRhYmxlc19zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVxdWFudFRhYmxlc19zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmZTA3YjUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgOTY0MQotOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotICAgICAgICAKLQotICAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgCi0gICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9RUERpdlRhYmxlCi0gICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9WTWF0cml4UVBNb2RUYWJsZQotICAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfUG9zVG9WQ29sNHg0Ci0gICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9Qb3NUb1ZDb2wyeDIKLSAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX1ZNYXRyaXggCi0gICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9RUE1vZHVsb1RhYmxlCi0gICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9WTWF0cml4VTE2Ci0gICAgICAgICAKLTsvLyBEZWZpbmUgdGhlIHByb2Nlc3NvciB2YXJpYW50cyBzdXBwb3J0ZWQgYnkgdGhpcyBmaWxlCi0gICAgICAgICAKLSAgICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0gICAgICAgICAgIAotICAgICAgICAgCi07Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCi0KLSAgICAKLSAgICBJRiBBUk0xMTM2SlMgOkxPUjogQ29ydGV4QTgKLSAgICAgICAgICAgCi0gCi0gICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfUG9zVG9WQ29sNHg0Ci0gICAgICAgICBEQ0IgIDAsIDIsIDAsIDIKLSAgICAgICAgIERDQiAgMiwgMSwgMiwgMQotICAgICAgICAgRENCICAwLCAyLCAwLCAyCi0gICAgICAgICBEQ0IgIDIsIDEsIDIsIDEKLQotCi0gICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfUG9zVG9WQ29sMngyCi0gICAgICAgICBEQ0IgIDAsIDIKLSAgICAgICAgIERDQiAgMiwgMQotCi0KLSAgICAgICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9WTWF0cml4Ci0gICAgICAgICBEQ0IgIDEwLCAxNiwgMTMKLSAgICAgICAgIERDQiAgMTEsIDE4LCAxNAotICAgICAgICAgRENCICAxMywgMjAsIDE2Ci0gICAgICAgICBEQ0IgIDE0LCAyMywgMTgKLSAgICAgICAgIERDQiAgMTYsIDI1LCAyMAotICAgICAgICAgRENCICAxOCwgMjksIDIzCi0KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBUaGlzIHRhYmxlIGV2YWx1YXRlcyB0aGUgZXhwcmVzc2lvbiBbKElOVCkoUVAvNildLAotOy8vIGZvciB2YWx1ZXMgb2YgUVAgZnJvbSAwIHRvIDUxIChpbmNsdXNpdmUpLiAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAgTV9UQUJMRSBhcm1WQ000UDEwX1FQRGl2VGFibGUKLSAgICAgICAgIERDQiAgMCwgIDAsICAwLCAgMCwgIDAsICAwCi0gICAgICAgICBEQ0IgIDEsICAxLCAgMSwgIDEsICAxLCAgMQotICAgICAgICAgRENCICAyLCAgMiwgIDIsICAyLCAgMiwgIDIKLSAgICAgICAgIERDQiAgMywgIDMsICAzLCAgMywgIDMsICAzCi0gICAgICAgICBEQ0IgIDQsICA0LCAgNCwgIDQsICA0LCAgNAotICAgICAgICAgRENCICA1LCAgNSwgIDUsICA1LCAgNSwgIDUKLSAgICAgICAgIERDQiAgNiwgIDYsICA2LCAgNiwgIDYsICA2Ci0gICAgICAgICBEQ0IgIDcsICA3LCAgNywgIDcsICA3LCAgNwotICAgICAgICAgRENCICA4LCAgOCwgIDgsICA4LCAgOCwgIDgKLSAgICAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBUaGlzIHRhYmxlIGNvbnRhaW5zIGFybVZDTTRQMTBfVk1hdHJpeFtRUCU2XVswXSBlbnRpcmVzLAotOy8vIGZvciB2YWx1ZXMgb2YgUVAgZnJvbSAwIHRvIDUxIChpbmNsdXNpdmUpLiAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAgTV9UQUJMRSBhcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlCi0gICAgICAgICBEQ0IgMTAsIDExLCAxMywgMTQsIDE2LCAxOAotICAgICAgICAgRENCIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKLSAgICAgICAgIERDQiAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4Ci0gICAgICAgICBEQ0IgMTAsIDExLCAxMywgMTQsIDE2LCAxOAotICAgICAgICAgRENCIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKLSAgICAgICAgIERDQiAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4Ci0gICAgICAgICBEQ0IgMTAsIDExLCAxMywgMTQsIDE2LCAxOAotICAgICAgICAgRENCIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKLSAgICAgICAgIERDQiAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4Ci0gICAgCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gVGhpcyB0YWJsZSBldmFsdWF0ZXMgdGhlIG1vZHVsdXMgZXhwcmVzc2lvbiBbUVAlNl0qNiwKLTsvLyBmb3IgdmFsdWVzIG9mIFFQIGZyb20gMCB0byA1MSAoaW5jbHVzaXZlKS4gCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9RUE1vZHVsb1RhYmxlCi0gICAgICAgICBEQ0IgMCwgNiwgMTIsIDE4LCAyNCwgMzAKLSAgICAgICAgIERDQiAwLCA2LCAxMiwgMTgsIDI0LCAzMAotICAgICAgICAgRENCIDAsIDYsIDEyLCAxOCwgMjQsIDMwCi0gICAgICAgICBEQ0IgMCwgNiwgMTIsIDE4LCAyNCwgMzAKLSAgICAgICAgIERDQiAwLCA2LCAxMiwgMTgsIDI0LCAzMAotICAgICAgICAgRENCIDAsIDYsIDEyLCAxOCwgMjQsIDMwCi0gICAgICAgICBEQ0IgMCwgNiwgMTIsIDE4LCAyNCwgMzAKLSAgICAgICAgIERDQiAwLCA2LCAxMiwgMTgsIDI0LCAzMAotICAgICAgICAgRENCIDAsIDYsIDEyLCAxOCwgMjQsIDMwCi0gICAgICAgIAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIFRoaXMgdGFibGUgY29udGFpbnMgdGhlIGludmlkdWFsIGJ5dGUgdmFsdWVzIHN0b3JlZCBhcwotOy8vIGhhbGZ3b3Jkcy4gVGhpcyBhdm9pZHMgdW5wYWNraW5nIGluc2lkZSB0aGUgZnVuY3Rpb24KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgCi0gICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfVk1hdHJpeFUxNgotICAgICAgICAgRENXIDEwLCAxNiwgMTMgCi0gICAgICAgICBEQ1cgMTEsIDE4LCAxNAotICAgICAgICAgRENXIDEzLCAyMCwgMTYKLSAgICAgICAgIERDVyAxNCwgMjMsIDE4Ci0gICAgICAgICBEQ1cgMTYsIDI1LCAyMAotICAgICAgICAgRENXIDE4LCAyOSwgMjMgCi0gICAgICAgICAKLSAgICBFTkRJRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vQVJNMTEzNkpTICAgICAgICAgICAgCi0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgCi0gICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQWxpZ25fdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQWxpZ25fdW5zYWZlX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZlMTIzZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0FsaWduX3Vuc2FmZV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0FsaWduX3Vuc2FmZV9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICA5NjQxCi07Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgICAgCi0gICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0KLSAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckFsaWduOXhfdW5zYWZlCi0gICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJBbGlnbjR4X3Vuc2FmZQotCi1ERUJVR19PTiAgICBTRVRMIHtGQUxTRX0KLQotICAgIElGIEFSTTExMzZKUyAKLQotOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCi1wU3JjICAgICAgICAgICAgUk4gMAotc3JjU3RlcCAgICAgICAgIFJOIDEKLXBEc3QgICAgICAgICAgICBSTiA4Ci1pSGVpZ2h0ICAgICAgICAgUk4gOQotCi07Ly8gRGVjbGFyZSBpbm5lciBsb29wIHJlZ2lzdGVycwoteCAgICAgICAgICAgICAgIFJOIDcKLXgwICAgICAgICAgICAgICBSTiA3Ci14MSAgICAgICAgICAgICAgUk4gMTAKLXgyICAgICAgICAgICAgICBSTiAxMQotU2NyYXRjaCAgICAgICAgIFJOIDEyCi0KLTsvLyBGdW5jdGlvbjogCi07Ly8gICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckFsaWduOXhfdW5zYWZlCi07Ly8KLTsvLyBJbXBsZW1lbnRzIGNvcHkgZnJvbSBhbiBhcmJpdHJhcnkgYWxpZ25lZCBzb3VyY2UgbWVtb3J5IGxvY2F0aW9uIChwU3JjKSB0byBhIDQgYnl0ZSBhbGlnbmVkCi07Ly8gZGVzdGluYXRpb24gcG9pbnRlZCBieSAocERzdCkgZm9yIGhvcml6b250YWwgaW50ZXJwb2xhdGlvbi4KLTsvLyBUaGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGNvcHkgOSBieXRlcyBpbiBob3Jpem9udGFsIGRpcmVjdGlvbi4gCi07Ly8KLTsvLyBSZWdpc3RlcnMgdXNlZCBhcyBpbnB1dCBmb3IgdGhpcyBmdW5jdGlvbgotOy8vIHIwLHIxLHI4LHI5IHdoZXJlIHI4IGNvbnRhaW5pbmdzIGFsaWduZWQgbWVtb3J5IHBvaW50ZXIgYW5kIHI5IG5vIHJvd3MgdG8gY29weQotOy8vCi07Ly8gUmVnaXN0ZXJzIHByZXNlcnZlZCBmb3IgdG9wIGxldmVsIGZ1bmN0aW9uCi07Ly8gcjIscjMscjQscjUscjYKLTsvLwotOy8vIFJlZ2lzdGVycyBtb2RpZmllZCBieSB0aGUgZnVuY3Rpb24KLTsvLyByNyxyOCxyOSxyMTAscjExLHIxMgotOy8vCi07Ly8gT3V0cHV0IHJlZ2lzdGVycwotOy8vIHIwIC0gcG9pbnRlciB0byB0aGUgbmV3IGFsaWduZWQgbG9jYXRpb24gd2hpY2ggd2lsbCBiZSB1c2VkIGFzIHBTcmMKLTsvLyByMSAtIHN0ZXAgc2l6ZSB0byB0aGlzIGFsaWduZWQgbG9jYXRpb24KLQotICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIENvcHkgcERzdCB0byBzY3JhdGNoCi0gICAgICAgIE1PViAgICAgU2NyYXRjaCwgcERzdAotCi1TdGFydEFsaWduZWRTdGFja0NvcHkKLSAgICAgICAgQU5EICAgICB4LCBwU3JjLCAjMwotICAgICAgICBCSUMgICAgIHBTcmMsIHBTcmMsICMzCi0gICAgICAgIAotICAgICAgICBNX1NXSVRDSCB4Ci0gICAgICAgIE1fQ0FTRSAgIENvcHkwdG9BbGlnbmVkCi0gICAgICAgIE1fQ0FTRSAgIENvcHkxdG9BbGlnbmVkCi0gICAgICAgIE1fQ0FTRSAgIENvcHkydG9BbGlnbmVkCi0gICAgICAgIE1fQ0FTRSAgIENvcHkzdG9BbGlnbmVkCi0gICAgICAgIE1fRU5EU1dJVENICi0KLUNvcHkwdG9BbGlnbmVkICAKLSAgICAgICAgTERNICAgICBwU3JjLCB7eDAsIHgxLCB4Mn0KLSAgICAgICAgU1VCUyAgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjMQotICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAKLSAgICAgICAgCi0gICAgICAgIDsvLyBPbmUgY3ljbGUgc3RhbGwKLQotICAgICAgICBTVE0gICAgIHBEc3QhLCB7eDAsIHgxLCB4Mn0gICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgYWxpZ25lZCBvdXRwdXQgcm93Ci0gICAgICAgIEJHVCAgICAgQ29weTB0b0FsaWduZWQKLSAgICAgICAgQiAgICAgICBDb3B5RW5kICAKLSAgICAgIAotQ29weTF0b0FsaWduZWQgICAgICAgIAotICAgICAgICBMRE0gICAgIHBTcmMsIHt4MCwgeDEsIHgyfQotICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMxCi0gICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgc3JjU3RlcAotICAgICAgICAKLSAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAotCi0gICAgICAgIE1PViAgICAgeDAsIHgwLCBMU1IgIzgKLSAgICAgICAgT1JSICAgICB4MCwgeDAsIHgxLCBMU0wgIzI0Ci0gICAgICAgIE1PViAgICAgeDEsIHgxLCBMU1IgIzgKLSAgICAgICAgT1JSICAgICB4MSwgeDEsIHgyLCBMU0wgIzI0Ci0gICAgICAgIE1PViAgICAgeDIsIHgyLCBMU1IgIzgKLSAgICAgICAgU1RNICAgICBwRHN0ISwge3gwLCB4MSwgeDJ9ICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIGFsaWduZWQgb3V0cHV0IHJvdwotICAgICAgICBCR1QgICAgIENvcHkxdG9BbGlnbmVkCi0gICAgICAgIEIgICAgICAgQ29weUVuZCAgCi0KLUNvcHkydG9BbGlnbmVkICAgICAgICAKLSAgICAgICAgTERNICAgICBwU3JjLCB7eDAsIHgxLCB4Mn0KLSAgICAgICAgU1VCUyAgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjMQotICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAKLSAgICAgICAgCi0gICAgICAgIDsvLyBPbmUgY3ljbGUgc3RhbGwKLQotICAgICAgICBNT1YgICAgIHgwLCB4MCwgTFNSICMxNgotICAgICAgICBPUlIgICAgIHgwLCB4MCwgeDEsIExTTCAjMTYKLSAgICAgICAgTU9WICAgICB4MSwgeDEsIExTUiAjMTYKLSAgICAgICAgT1JSICAgICB4MSwgeDEsIHgyLCBMU0wgIzE2Ci0gICAgICAgIE1PViAgICAgeDIsIHgyLCBMU1IgIzE2Ci0gICAgICAgIFNUTSAgICAgcERzdCEsIHt4MCwgeDEsIHgyfSAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBhbGlnbmVkIG91dHB1dCByb3cKLSAgICAgICAgQkdUICAgICBDb3B5MnRvQWxpZ25lZAotICAgICAgICBCICAgICAgIENvcHlFbmQgIAotCi1Db3B5M3RvQWxpZ25lZCAgICAgICAgCi0gICAgICAgIExETSAgICAgcFNyYywge3gwLCB4MSwgeDJ9Ci0gICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzEKLSAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwCi0gICAgICAgIAotICAgICAgICA7Ly8gT25lIGN5Y2xlIHN0YWxsCi0KLSAgICAgICAgTU9WICAgICB4MCwgeDAsIExTUiAjMjQKLSAgICAgICAgT1JSICAgICB4MCwgeDAsIHgxLCBMU0wgIzgKLSAgICAgICAgTU9WICAgICB4MSwgeDEsIExTUiAjMjQKLSAgICAgICAgT1JSICAgICB4MSwgeDEsIHgyLCBMU0wgIzgKLSAgICAgICAgTU9WICAgICB4MiwgeDIsIExTUiAjMjQKLSAgICAgICAgU1RNICAgICBwRHN0ISwge3gwLCB4MSwgeDJ9ICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIGFsaWduZWQgb3V0cHV0IHJvdwotICAgICAgICBCR1QgICAgIENvcHkzdG9BbGlnbmVkCi0KLUNvcHlFbmQgIAotICAgICAgICAKLSAgICAgICAgTU9WICAgICBwU3JjLCBTY3JhdGNoCi0gICAgICAgIE1PViAgICAgc3JjU3RlcCwgIzEyCi0KLSAgICAgICAgTV9FTkQKLSAgICAKLQotOy8vIEZ1bmN0aW9uOgotOy8vICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJBbGlnbjR4X3Vuc2FmZQotOy8vCi07Ly8gSW1wbGVtZW50cyBjb3B5IGZyb20gYW4gYXJiaXRyYXJ5IGFsaWduZWQgc291cmNlIG1lbW9yeSBsb2NhdGlvbiAocFNyYykgdG8gYW4gYWxpZ25lZAotOy8vIGRlc3RpbmF0aW9uIHBvaW50ZWQgYnkgKHBEc3QpIGZvciB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uLgotOy8vIFRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gY29weSA0IGJ5dGVzIGluIGhvcml6b250YWwgZGlyZWN0aW9uIAotOy8vCi07Ly8gUmVnaXN0ZXJzIHVzZWQgYXMgaW5wdXQgZm9yIHRoaXMgZnVuY3Rpb24KLTsvLyByMCxyMSxyOCxyOSB3aGVyZSByOCBjb250YWluaW5ncyBhbGlnbmVkIG1lbW9yeSBwb2ludGVyIGFuZCByOSBubyBvZiByb3dzIHRvIGNvcHkKLTsvLwotOy8vIFJlZ2lzdGVycyBwcmVzZXJ2ZWQgZm9yIHRvcCBsZXZlbCBmdW5jdGlvbgotOy8vIHIyLHIzLHI0LHI1LHI2Ci07Ly8KLTsvLyBSZWdpc3RlcnMgbW9kaWZpZWQgYnkgdGhlIGZ1bmN0aW9uCi07Ly8gcjcscjgscjkscjEwLHIxMSxyMTIKLTsvLwotOy8vIE91dHB1dCByZWdpc3RlcnMKLTsvLyByMCAtIHBvaW50ZXIgdG8gdGhlIG5ldyBhbGlnbmVkIGxvY2F0aW9uIHdoaWNoIHdpbGwgYmUgdXNlZCBhcyBwU3JjCi07Ly8gcjEgLSBzdGVwIHNpemUgdG8gdGhpcyBhbGlnbmVkIGxvY2F0aW9uCi0KLSAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckFsaWduNHhfdW5zYWZlICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBDb3B5IHBTcmMgdG8gc3RhY2sKLVN0YXJ0VkFsaWduZWRTdGFja0NvcHkKLSAgICAgICAgQU5EICAgICB4LCBwU3JjLCAjMwotICAgICAgICBCSUMgICAgIHBTcmMsIHBTcmMsICMzICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgTV9TV0lUQ0ggeAotICAgICAgICBNX0NBU0UgICBDb3B5MHRvVkFsaWduZWQKLSAgICAgICAgTV9DQVNFICAgQ29weTF0b1ZBbGlnbmVkCi0gICAgICAgIE1fQ0FTRSAgIENvcHkydG9WQWxpZ25lZAotICAgICAgICBNX0NBU0UgICBDb3B5M3RvVkFsaWduZWQKLSAgICAgICAgTV9FTkRTV0lUQ0gKLSAgICAgICAgCi1Db3B5MHRvVkFsaWduZWQgIAotICAgICAgICBNX0xEUiAgIHgwLCBbcFNyY10sIHNyY1N0ZXAKLSAgICAgICAgU1VCUyAgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjMQotICAgICAgICAKLSAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAotCi0gICAgICAgIFNUUiAgICAgeDAsIFtwRHN0XSwgIzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgYWxpZ25lZCBvdXRwdXQgcm93Ci0gICAgICAgIEJHVCAgICAgQ29weTB0b1ZBbGlnbmVkCi0gICAgICAgIEIgICAgICAgQ29weVZFbmQgIAotICAgICAgCi1Db3B5MXRvVkFsaWduZWQgICAgICAgIAotICAgICAgICBMRFIgICAgIHgxLCBbcFNyYywgIzRdCi0gICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMxICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBPbmUgY3ljbGUgc3RhbGwKLQotICAgICAgICBNT1YgICAgIHgxLCB4MSwgTFNMICMyNAotICAgICAgICBPUlIgICAgIHgwLCB4MSwgeDAsIExTUiAjOAotICAgICAgICBTVFIgICAgIHgwLCBbcERzdF0sICM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIGFsaWduZWQgb3V0cHV0IHJvdwotICAgICAgICBCR1QgICAgIENvcHkxdG9WQWxpZ25lZAotICAgICAgICBCICAgICAgIENvcHlWRW5kICAKLQotQ29weTJ0b1ZBbGlnbmVkICAgICAgICAKLSAgICAgICAgTERSICAgICB4MSwgW3BTcmMsICM0XQotICAgICAgICBNX0xEUiAgIHgwLCBbcFNyY10sIHNyY1N0ZXAKLSAgICAgICAgU1VCUyAgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjMSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gT25lIGN5Y2xlIHN0YWxsCi0KLSAgICAgICAgTU9WICAgICB4MSwgeDEsIExTTCAjMTYKLSAgICAgICAgT1JSICAgICB4MCwgeDEsIHgwLCBMU1IgIzE2Ci0gICAgICAgIFNUUiAgICAgeDAsIFtwRHN0XSwgIzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgYWxpZ25lZCBvdXRwdXQgcm93Ci0gICAgICAgIEJHVCAgICAgQ29weTJ0b1ZBbGlnbmVkCi0gICAgICAgIEIgICAgICAgQ29weVZFbmQgIAotCi1Db3B5M3RvVkFsaWduZWQgICAgICAgIAotICAgICAgICBMRFIgICAgIHgxLCBbcFNyYywgIzRdCi0gICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMxICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBPbmUgY3ljbGUgc3RhbGwKLQotICAgICAgICBNT1YgICAgIHgxLCB4MSwgTFNMICM4Ci0gICAgICAgIE9SUiAgICAgeDAsIHgxLCB4MCwgTFNSICMyNAotICAgICAgICBTVFIgICAgIHgwLCBbcERzdF0sICM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIGFsaWduZWQgb3V0cHV0IHJvdwotICAgICAgICBCR1QgICAgIENvcHkzdG9WQWxpZ25lZAotCi1Db3B5VkVuZCAgCi0KLSAgICAgICAgU1VCICAgICBwU3JjLCBwRHN0LCAjMjgKLSAgICAgICAgTU9WICAgICBzcmNTdGVwLCAjNAotCi0gICAgICAgIE1fRU5ECi0KLQotICAgIEVORElGCi0KLSAgICBFTkQKLSAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weV91bnNhZmVfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5X3Vuc2FmZV9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5YTg5ZmQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5X3Vuc2FmZV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHlfdW5zYWZlX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDk2NDEKLTsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLTsvLyBGdW5jdGlvbjoKLTsvLyAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weTR4NF91bnNhZmUgCi07Ly8KLTsvLyBJbXBsZW1lbnRzIGNvcHkgZnJvbSBhbiBhcmJpdHJhcnkgYWxpZ25lZCBzb3VyY2UgbWVtb3J5IGxvY2F0aW9uIChwU3JjKSB0byBhbiBhbGlnbmVkCi07Ly8gZGVzdGluYXRpb24gcG9pbnRlZCBieSAocERzdCkKLTsvLwotOy8vIFJlZ2lzdGVycyBwcmVzZXJ2ZWQgZm9yIHRvcCBsZXZlbCBmdW5jdGlvbgotOy8vIHIxLHIzLHI0LHI1LHI2LHI3LHIxMCxyMTEscjE0Ci07Ly8KLTsvLyBSZWdpc3RlcnMgbW9kaWZpZWQgYnkgdGhlIGZ1bmN0aW9uCi07Ly8gcjAscjIscjgscjkscjEyCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgICAKLSAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLQotICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weTR4NF91bnNhZmUKLSAgICAgICAgCi07Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKLXBTcmMgICAgICAgICAgICBSTiAwCi1zcmNTdGVwICAgICAgICAgUk4gMQotcERzdCAgICAgICAgICAgIFJOIDIKLWRzdFN0ZXAgICAgICAgICBSTiAzCi0KLTsvLyBEZWNsYXJlIG90aGVyIGludGVybWVkaWF0ZSByZWdpc3RlcnMKLXgwICAgICAgICAgICAgICBSTiA0Ci14MSAgICAgICAgICAgICAgUk4gNQoteDIgICAgICAgICAgICAgIFJOIDgKLXgzICAgICAgICAgICAgICBSTiA5Ci1UZW1wICAgICAgICAgICAgUk4gMTIKLQotICAgIElGIEFSTTExMzZKUwotCi0gICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weTR4NF91bnNhZmUsIHI2Ci0KLUNvcHk0eDRTdGFydAotICAgICAgICA7Ly8gRG8gQ29weSBhbmQgYnJhbmNoIHRvIEVuZE9mSW50ZXJwb2xhdGlvbgotICAgICAgICBBTkQgICAgIFRlbXAsIHBTcmMsICMzCi0gICAgICAgIEJJQyAgICAgcFNyYywgcFNyYywgIzMgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICBNX1NXSVRDSCBUZW1wCi0gICAgICAgIE1fQ0FTRSAgQ29weTR4NEFsaWduMAotICAgICAgICBNX0NBU0UgIENvcHk0eDRBbGlnbjEKLSAgICAgICAgTV9DQVNFICBDb3B5NHg0QWxpZ24yCi0gICAgICAgIE1fQ0FTRSAgQ29weTR4NEFsaWduMwotICAgICAgICBNX0VORFNXSVRDSAotCi1Db3B5NHg0QWxpZ24wCi0gICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBNX0xEUiAgIHgxLCBbcFNyY10sIHNyY1N0ZXAKLSAgICAgICAgTV9TVFIgICB4MCwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIE1fTERSICAgeDIsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBNX1NUUiAgIHgxLCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgTV9MRFIgICB4MywgW3BTcmNdLCBzcmNTdGVwCi0gICAgICAgIE1fU1RSICAgeDIsIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBNX1NUUiAgIHgzLCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgQiAgICAgICBDb3B5NHg0RW5kICAKLQotQ29weTR4NEFsaWduMQotICAgICAgICBMRFIgICAgIHgxLCBbcFNyYywgIzRdCi0gICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBMRFIgICAgIHgzLCBbcFNyYywgIzRdCi0gICAgICAgIE1fTERSICAgeDIsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBNT1YgICAgIHgwLCB4MCwgTFNSICM4Ci0gICAgICAgIE9SUiAgICAgeDAsIHgwLCB4MSwgTFNMICMyNAotICAgICAgICBNX1NUUiAgIHgwLCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgTU9WICAgICB4MiwgeDIsIExTUiAjOAotICAgICAgICBPUlIgICAgIHgyLCB4MiwgeDMsIExTTCAjMjQKLSAgICAgICAgTERSICAgICB4MSwgW3BTcmMsICM0XQotICAgICAgICBNX0xEUiAgIHgwLCBbcFNyY10sIHNyY1N0ZXAKLSAgICAgICAgTV9TVFIgICB4MiwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIExEUiAgICAgeDMsIFtwU3JjLCAjNF0KLSAgICAgICAgTV9MRFIgICB4MiwgW3BTcmNdLCBzcmNTdGVwCi0gICAgICAgIE1PViAgICAgeDAsIHgwLCBMU1IgIzgKLSAgICAgICAgT1JSICAgICB4MCwgeDAsIHgxLCBMU0wgIzI0Ci0gICAgICAgIE1fU1RSICAgeDAsIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBNT1YgICAgIHgyLCB4MiwgTFNSICM4Ci0gICAgICAgIE9SUiAgICAgeDIsIHgyLCB4MywgTFNMICMyNAotICAgICAgICBNX1NUUiAgIHgyLCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgQiAgICAgICBDb3B5NHg0RW5kICAKLSAgICAgIAotQ29weTR4NEFsaWduMgotICAgICAgICBMRFIgICAgIHgxLCBbcFNyYywgIzRdCi0gICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBMRFIgICAgIHgzLCBbcFNyYywgIzRdCi0gICAgICAgIE1fTERSICAgeDIsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBNT1YgICAgIHgwLCB4MCwgTFNSICMxNgotICAgICAgICBPUlIgICAgIHgwLCB4MCwgeDEsIExTTCAjMTYKLSAgICAgICAgTV9TVFIgICB4MCwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIE1PViAgICAgeDIsIHgyLCBMU1IgIzE2Ci0gICAgICAgIE9SUiAgICAgeDIsIHgyLCB4MywgTFNMICMxNgotICAgICAgICBNX1NUUiAgIHgyLCBbcERzdF0sIGRzdFN0ZXAgICAgICAgIAotCi0gICAgICAgIExEUiAgICAgeDEsIFtwU3JjLCAjNF0KLSAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCi0gICAgICAgIExEUiAgICAgeDMsIFtwU3JjLCAjNF0KLSAgICAgICAgTV9MRFIgICB4MiwgW3BTcmNdLCBzcmNTdGVwCi0gICAgICAgIE1PViAgICAgeDAsIHgwLCBMU1IgIzE2Ci0gICAgICAgIE9SUiAgICAgeDAsIHgwLCB4MSwgTFNMICMxNgotICAgICAgICBNX1NUUiAgIHgwLCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgTU9WICAgICB4MiwgeDIsIExTUiAjMTYKLSAgICAgICAgT1JSICAgICB4MiwgeDIsIHgzLCBMU0wgIzE2Ci0gICAgICAgIE1fU1RSICAgeDIsIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgCi0gICAgICAgIEIgICAgICAgQ29weTR4NEVuZCAgCi0KLUNvcHk0eDRBbGlnbjMgCi0gICAgICAgIExEUiAgICAgeDEsIFtwU3JjLCAjNF0KLSAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCi0gICAgICAgIExEUiAgICAgeDMsIFtwU3JjLCAjNF0KLSAgICAgICAgTV9MRFIgICB4MiwgW3BTcmNdLCBzcmNTdGVwCi0gICAgICAgIE1PViAgICAgeDAsIHgwLCBMU1IgIzI0Ci0gICAgICAgIE9SUiAgICAgeDAsIHgwLCB4MSwgTFNMICM4Ci0gICAgICAgIE1fU1RSICAgeDAsIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBNT1YgICAgIHgyLCB4MiwgTFNSICMyNAotICAgICAgICBPUlIgICAgIHgyLCB4MiwgeDMsIExTTCAjOAotICAgICAgICBNX1NUUiAgIHgyLCBbcERzdF0sIGRzdFN0ZXAKLQotICAgICAgICBMRFIgICAgIHgxLCBbcFNyYywgIzRdCi0gICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBMRFIgICAgIHgzLCBbcFNyYywgIzRdCi0gICAgICAgIE1fTERSICAgeDIsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBNT1YgICAgIHgwLCB4MCwgTFNSICMyNAotICAgICAgICBPUlIgICAgIHgwLCB4MCwgeDEsIExTTCAjOAotICAgICAgICBNX1NUUiAgIHgwLCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgTU9WICAgICB4MiwgeDIsIExTUiAjMjQKLSAgICAgICAgT1JSICAgICB4MiwgeDIsIHgzLCBMU0wgIzgKLSAgICAgICAgTV9TVFIgICB4MiwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIEIgICAgICAgQ29weTR4NEVuZCAgCi0KLUNvcHk0eDRFbmQKLSAgICAgICAgTV9FTkQKLQotICAgIEVORElGCi0KLSAgICBFTkQKLSAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfRGlhZ0NvcHlfdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfRGlhZ0NvcHlfdW5zYWZlX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThiNjdlYi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0RpYWdDb3B5X3Vuc2FmZV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0RpYWdDb3B5X3Vuc2FmZV9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICA5NjQxCi07Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgICAgCi0gICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0KLSAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckRpYWdDb3B5X3Vuc2FmZQotICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyRGlhZ0NvcHlfdW5zYWZlCi0KLTsvLyBGdW5jdGlvbnM6IAotOy8vICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JEaWFnQ29weV91bnNhZmUgYW5kCi07Ly8gICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckRpYWdDb3B5X3Vuc2FmZSAKLTsvLwotOy8vIEltcGxlbWVudHMgcmUtYXJyYW5nZW1lbnQgb2YgZGF0YSBmcm9tIHRlbXBvcmFyeSBidWZmZXIgdG8gYSBidWZmZXIgcG9pbnRlZCBieSBwQnVmLgotOy8vIFRoaXMgd2lsbCBkbyB0aGUgY29udmVydGlvbiBvZiBkYXRhIGZyb20gMTYgYml0IHRvIDggYml0IGFuZCBpdCBhbHNvCi07Ly8gcmVtb3ZlIG9mZnNldCBhbmQgY2hlY2sgZm9yIHNhdHVyYXRpb24uCi07Ly8KLTsvLyBSZWdpc3RlcnMgdXNlZCBhcyBpbnB1dCBmb3IgdGhpcyBmdW5jdGlvbgotOy8vIHIwLHIxLHI3IHdoZXJlIHIwIGlzIGlucHV0IHBvaW50ZXIgYW5kIHIyIGl0cyBzdGVwIHNpemUsIHI3IGlzIG91dHB1dCBwb2ludGVyCi07Ly8KLTsvLyBSZWdpc3RlcnMgcHJlc2VydmVkIGZvciB0b3AgbGV2ZWwgZnVuY3Rpb24KLTsvLyByNCxyNSxyNixyOCxyOSxyMTQKLTsvLwotOy8vIFJlZ2lzdGVycyBtb2RpZmllZCBieSB0aGUgZnVuY3Rpb24KLTsvLyByNyxyMTAscjExLHIxMgotOy8vCi07Ly8gT3V0cHV0IHJlZ2lzdGVycwotOy8vIHIwIC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gbG9jYXRpb24KLTsvLyByMSAtIHN0ZXAgc2l6ZSB0byB0aGlzIGRlc3RpbmF0aW9uIGxvY2F0aW9uCi0KLQotREVCVUdfT04gICAgU0VUTCB7RkFMU0V9Ci0gICAgICAgIAotTUFTSyAgICAgICAgICAgIEVRVSAweDgwODA4MDgwICA7Ly8gTWFzayBpcyB1c2VkIHRvIGltcGxlbWVudCAoYStiKzEpLzIKLQotOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCi0KLXBTcmMwICAgICAgICAgICBSTiAwCi1zcmNTdGVwMCAgICAgICAgUk4gMQotCi07Ly8gRGVjbGFyZSBvdGhlciBpbnRlcm1lZGlhdGUgcmVnaXN0ZXJzCi1UZW1wMSAgICAgICAgICAgUk4gNAotVGVtcDIgICAgICAgICAgIFJOIDUKLVRlbXAzICAgICAgICAgICBSTiAxMAotVGVtcDQgICAgICAgICAgIFJOIDExCi1wQnVmICAgICAgICAgICAgUk4gNwotcjB4MGZlMDBmZTAgICAgIFJOIDYKLXIweDAwZmYwMGZmICAgICBSTiAxMgotQ291bnQgICAgICAgICAgIFJOIDE0Ci1WYWx1ZUEwICAgICAgICAgUk4gMTAKLVZhbHVlQTEgICAgICAgICBSTiAxMQotCi0gICAgSUYgQVJNMTEzNkpTCi0KLQotICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yRGlhZ0NvcHlfdW5zYWZlLCByNgotCi0gICAgICAgIDsvLyBDb2RlIHN0YXJ0ICAgICAKLSAgICAgICAgTU9WICAgICAgICAgQ291bnQsICM0ICAgCi0gICAgICAgIExEUiAgICAgICAgIHIweDBmZTAwZmUwLCA9MHgwZmUwMGZlMAotICAgICAgICBMRFIgICAgICAgICByMHgwMGZmMDBmZiwgPTB4MDBmZjAwZmYgICAgICAgIAotTG9vcFN0YXJ0MQotICAgICAgICBMRFIgICAgICAgICBUZW1wNCwgW3BTcmMwLCAjMTJdCi0gICAgICAgIExEUiAgICAgICAgIFRlbXAzLCBbcFNyYzAsICM4XSAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgIFRlbXAyLCBbcFNyYzAsICM0XQotICAgICAgICBNX0xEUiAgICAgICBUZW1wMSwgW3BTcmMwXSwgc3JjU3RlcDAgICAgICAgICAgICAgIAotICAgICAgICBVUVNVQjE2ICAgICBUZW1wNCwgVGVtcDQsIHIweDBmZTAwZmUwICAgICAgICAKLSAgICAgICAgVVFTVUIxNiAgICAgVGVtcDMsIFRlbXAzLCByMHgwZmUwMGZlMCAgICAgICAgICAgICAgICAgCi0gICAgICAgIFVRU1VCMTYgICAgIFRlbXAyLCBUZW1wMiwgcjB4MGZlMDBmZTAgICAgICAgIAotICAgICAgICBVUVNVQjE2ICAgICBUZW1wMSwgVGVtcDEsIHIweDBmZTAwZmUwICAgICAgICAgICAgICAgICAKLSAgICAgICAgVVNBVDE2ICAgICAgVGVtcDQsICMxMywgVGVtcDQKLSAgICAgICAgVVNBVDE2ICAgICAgVGVtcDMsICMxMywgVGVtcDMgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBVU0FUMTYgICAgICBUZW1wMiwgIzEzLCBUZW1wMgotICAgICAgICBVU0FUMTYgICAgICBUZW1wMSwgIzEzLCBUZW1wMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgQU5EICAgICAgICAgVGVtcDQsIHIweDAwZmYwMGZmLCBUZW1wNCwgTFNSICM1ICAgICAgICAgCi0gICAgICAgIEFORCAgICAgICAgIFRlbXAzLCByMHgwMGZmMDBmZiwgVGVtcDMsIExTUiAjNSAgICAgICAgIAotICAgICAgICBBTkQgICAgICAgICBUZW1wMiwgcjB4MDBmZjAwZmYsIFRlbXAyLCBMU1IgIzUgICAgICAgICAKLSAgICAgICAgQU5EICAgICAgICAgVGVtcDEsIHIweDAwZmYwMGZmLCBUZW1wMSwgTFNSICM1ICAgICAgICAgCi0gICAgICAgIE9SUiAgICAgICAgIFZhbHVlQTEsIFRlbXAzLCBUZW1wNCwgTFNMICM4ICAgICAgICAgICAgIAotICAgICAgICBPUlIgICAgICAgICBWYWx1ZUEwLCBUZW1wMSwgVGVtcDIsIExTTCAjOCAgICAgICAgICAgICAKLSAgICAgICAgU1VCUyAgICAgICAgQ291bnQsIENvdW50LCAjMSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgU1RSRCAgICAgICAgVmFsdWVBMCwgW3BCdWZdLCAjOCAKLSAgICAgICAgQkdUICAgICAgICAgTG9vcFN0YXJ0MQotRW5kMQotICAgICAgICBTVUIgICAgICAgIHBTcmMwLCBwQnVmLCAjMzIKLSAgICAgICAgTU9WICAgICAgICBzcmNTdGVwMCwgIzgKLQotICAgICAgICBNX0VORAotCi0KLSAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckRpYWdDb3B5X3Vuc2FmZSwgcjYKLSAgICAgICAgCi0gICAgICAgIDsvLyBDb2RlIHN0YXJ0ICAgICAgICAKLSAgICAgICAgTERSICAgICAgICAgcjB4MGZlMDBmZTAsID0weDBmZTAwZmUwCi0gICAgICAgIExEUiAgICAgICAgIHIweDAwZmYwMGZmLCA9MHgwMGZmMDBmZgotICAgICAgICBNT1YgICAgICAgICBDb3VudCwgIzIKLQotTG9vcFN0YXJ0ICAgIAotICAgICAgICBMRFIgICAgICAgICBUZW1wNCwgW3BTcmMwLCAjMTJdCi0gICAgICAgIExEUiAgICAgICAgIFRlbXAzLCBbcFNyYzAsICM4XSAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgIFRlbXAyLCBbcFNyYzAsICM0XQotICAgICAgICBNX0xEUiAgICAgICBUZW1wMSwgW3BTcmMwXSwgc3JjU3RlcDAKLSAgICAgICAgCi0gICAgICAgIFVRU1VCMTYgICAgIFRlbXA0LCBUZW1wNCwgcjB4MGZlMDBmZTAgICAgICAgIAotICAgICAgICBVUVNVQjE2ICAgICBUZW1wMywgVGVtcDMsIHIweDBmZTAwZmUwICAgICAgICAgICAgICAgICAKLSAgICAgICAgVVFTVUIxNiAgICAgVGVtcDIsIFRlbXAyLCByMHgwZmUwMGZlMCAgICAgICAgCi0gICAgICAgIFVRU1VCMTYgICAgIFRlbXAxLCBUZW1wMSwgcjB4MGZlMDBmZTAgICAgICAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgVVNBVDE2ICAgICAgVGVtcDQsICMxMywgVGVtcDQKLSAgICAgICAgVVNBVDE2ICAgICAgVGVtcDMsICMxMywgVGVtcDMgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBVU0FUMTYgICAgICBUZW1wMiwgIzEzLCBUZW1wMgotICAgICAgICBVU0FUMTYgICAgICBUZW1wMSwgIzEzLCBUZW1wMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBBTkQgICAgICAgICBUZW1wNCwgcjB4MDBmZjAwZmYsIFRlbXA0LCBMU1IgIzUgICAgICAgICAKLSAgICAgICAgQU5EICAgICAgICAgVGVtcDMsIHIweDAwZmYwMGZmLCBUZW1wMywgTFNSICM1ICAgICAgICAgCi0gICAgICAgIEFORCAgICAgICAgIFRlbXAyLCByMHgwMGZmMDBmZiwgVGVtcDIsIExTUiAjNSAgICAgICAgIAotICAgICAgICBBTkQgICAgICAgICBUZW1wMSwgcjB4MDBmZjAwZmYsIFRlbXAxLCBMU1IgIzUgICAgICAgICAKLSAgICAgICAgT1JSICAgICAgICAgVmFsdWVBMSwgVGVtcDMsIFRlbXA0LCBMU0wgIzggICAgICAgIDsvLyBbZDIgYzIgZDAgYzBdICAgICAgICAgICAgIAotICAgICAgICBPUlIgICAgICAgICBWYWx1ZUEwLCBUZW1wMSwgVGVtcDIsIExTTCAjOCAgICAgICAgOy8vIFtiMiBhMiBiMCBhMF0gICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFBLSEJUICAgICAgIFRlbXAxLCBWYWx1ZUEwLCBWYWx1ZUExLCBMU0wgIzE2ICAgICA7Ly8gW2QwIGMwIGIwIGEwXQotCi0gICAgICAgIFNUUiAgICAgICAgIFRlbXAxLCBbcEJ1Zl0sICM4IAotICAgICAgICBQS0hUQiAgICAgICBUZW1wMiwgVmFsdWVBMSwgVmFsdWVBMCwgQVNSICMxNiAgICAgOy8vIFtkMiBjMiBiMiBhMl0KLSAgICAgICAgU1RSICAgICAgICAgVGVtcDIsIFtwQnVmXSwgIy00ICAKLQotICAgICAgICBMRFIgICAgICAgICBUZW1wNCwgW3BTcmMwLCAjMTJdCi0gICAgICAgIExEUiAgICAgICAgIFRlbXAzLCBbcFNyYzAsICM4XSAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgIFRlbXAyLCBbcFNyYzAsICM0XQotICAgICAgICBNX0xEUiAgICAgICBUZW1wMSwgW3BTcmMwXSwgc3JjU3RlcDAKLSAgICAgICAgCi0gICAgICAgIFVRU1VCMTYgICAgIFRlbXA0LCBUZW1wNCwgcjB4MGZlMDBmZTAgICAgICAgIAotICAgICAgICBVUVNVQjE2ICAgICBUZW1wMywgVGVtcDMsIHIweDBmZTAwZmUwICAgICAgICAgICAgICAgICAKLSAgICAgICAgVVFTVUIxNiAgICAgVGVtcDIsIFRlbXAyLCByMHgwZmUwMGZlMCAgICAgICAgCi0gICAgICAgIFVRU1VCMTYgICAgIFRlbXAxLCBUZW1wMSwgcjB4MGZlMDBmZTAgICAgICAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgVVNBVDE2ICAgICAgVGVtcDQsICMxMywgVGVtcDQKLSAgICAgICAgVVNBVDE2ICAgICAgVGVtcDMsICMxMywgVGVtcDMgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBVU0FUMTYgICAgICBUZW1wMiwgIzEzLCBUZW1wMgotICAgICAgICBVU0FUMTYgICAgICBUZW1wMSwgIzEzLCBUZW1wMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBBTkQgICAgICAgICBUZW1wNCwgcjB4MDBmZjAwZmYsIFRlbXA0LCBMU1IgIzUgICAgICAgICAKLSAgICAgICAgQU5EICAgICAgICAgVGVtcDMsIHIweDAwZmYwMGZmLCBUZW1wMywgTFNSICM1ICAgICAgICAgCi0gICAgICAgIEFORCAgICAgICAgIFRlbXAyLCByMHgwMGZmMDBmZiwgVGVtcDIsIExTUiAjNSAgICAgICAgIAotICAgICAgICBBTkQgICAgICAgICBUZW1wMSwgcjB4MDBmZjAwZmYsIFRlbXAxLCBMU1IgIzUgICAgICAgICAKLSAgICAgICAgT1JSICAgICAgICAgVmFsdWVBMSwgVGVtcDMsIFRlbXA0LCBMU0wgIzggICAgICAgIDsvLyBbZDIgYzIgZDAgYzBdICAgICAgICAgICAgIAotICAgICAgICBPUlIgICAgICAgICBWYWx1ZUEwLCBUZW1wMSwgVGVtcDIsIExTTCAjOCAgICAgICAgOy8vIFtiMiBhMiBiMCBhMF0gICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFBLSEJUICAgICAgIFRlbXAxLCBWYWx1ZUEwLCBWYWx1ZUExLCBMU0wgIzE2ICAgICA7Ly8gW2QwIGMwIGIwIGEwXQotICAgICAgICBTVUJTICAgICAgICBDb3VudCwgQ291bnQsICMxCi0gICAgICAgIFNUUiAgICAgICAgIFRlbXAxLCBbcEJ1Zl0sICM4IAotICAgICAgICBQS0hUQiAgICAgICBUZW1wMiwgVmFsdWVBMSwgVmFsdWVBMCwgQVNSICMxNiAgICAgOy8vIFtkMiBjMiBiMiBhMl0KLSAgICAgICAgU1RSICAgICAgICAgVGVtcDIsIFtwQnVmXSwgIzQgIAotICAgICAgICAKLSAgICAgICAgQkdUICAgICAgICAgTG9vcFN0YXJ0Ci1FbmQyCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmMwLCBwQnVmLCAjMzItOAotICAgICAgICBNT1YgICAgICAgICBzcmNTdGVwMCwgIzQKLQotICAgICAgICBNX0VORAotCi0gICAgRU5ESUYKLSAgICAKLSAgICBFTkQKLSAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIzZWFjZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzMTAgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZV9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICA5NjQxCi07Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgICAgCi0gICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmUKLQotICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotCi0KLQotICAgIElGIEFSTTExMzZKUyAKLQotCi0gICAgICAgIE1fQUxMT0M4IHBwRHN0QXJncywgOAotICAgICAgICBNX0FMTE9DOCBwVGVtcFJlc3VsdDEsIDgKLSAgICAgICAgTV9BTExPQzggcFRlbXBSZXN1bHQyLCA4Ci0gICAgICAgIE1fQUxMT0M0IHBwU3JjLCA0Ci0gICAgICAgIE1fQUxMT0M0IHBwRHN0LCA0Ci0gICAgICAgIE1fQUxMT0M0IHBEc3RTdGVwLCA0Ci0gICAgICAgIE1fQUxMT0M0IHBTcmNTdGVwLCA0Ci0gICAgICAgIE1fQUxMT0M0IHBDb3VudGVyLCA0Ci0KLSAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgotICAgICAgICA7Ly8gRnVuY3Rpb246IAotICAgICAgICA7Ly8gICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZQotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIEltcGxlbWVudHMgZGlhZ29uYWwgaW50ZXJwb2xhdGlvbiBmb3IgYSBibG9jayBvZiBzaXplIDR4NC4gSW5wdXQgYW5kIG91dHB1dCBzaG91bGQgCi0gICAgICAgIDsvLyBiZSBhbGlnbmVkLiAKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBSZWdpc3RlcnMgdXNlZCBhcyBpbnB1dCBmb3IgdGhpcyBmdW5jdGlvbgotICAgICAgICA7Ly8gcjAscjEscjIscjMsIHI4IHdoZXJlIHIwLHIyICBpbnB1dCBwb2ludGVyIGFuZCByMSxyMyBzdGVwIHNpemUsIHI4IGludGVybWVkaWF0ZS1idWYgcG9pbnRlcgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIFJlZ2lzdGVycyBwcmVzZXJ2ZWQgZm9yIHRvcCBsZXZlbCBmdW5jdGlvbgotICAgICAgICA7Ly8gcjAscjEscjIscjMscjQscjUscjYscjE0Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gUmVnaXN0ZXJzIG1vZGlmaWVkIGJ5IHRoZSBmdW5jdGlvbgotICAgICAgICA7Ly8gcjcscjgscjkscjEwLHIxMSxyMTIKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBPdXRwdXQgcmVnaXN0ZXJzCi0gICAgICAgIDsvLyBOb25lLiBGdW5jdGlvbiB3aWxsIHByZXNlcnZlIHIwLXIzCi0KLSAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmUsIHI2Ci0gICAgICAgIAotOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCi1wU3JjICAgICAgICAgICAgUk4gMAotc3JjU3RlcCAgICAgICAgIFJOIDEKLXBEc3QgICAgICAgICAgICBSTiAyCi1kc3RTdGVwICAgICAgICAgUk4gMwotCi07Ly8gRGVjbGFyZSBpbm5lciBsb29wIHJlZ2lzdGVycwotQWNjMCAgICAgICAgICAgIFJOIDQKLUFjYzEgICAgICAgICAgICBSTiA1Ci1BY2MyICAgICAgICAgICAgUk4gNgotQWNjMyAgICAgICAgICAgIFJOIDcKLQotVmFsQSAgICAgICAgICAgIFJOIDQKLVZhbEIgICAgICAgICAgICBSTiA1Ci1WYWxDICAgICAgICAgICAgUk4gNgotVmFsRCAgICAgICAgICAgIFJOIDcKLVZhbEUgICAgICAgICAgICBSTiA4Ci1WYWxGICAgICAgICAgICAgUk4gOQotVmFsRyAgICAgICAgICAgIFJOIDEyCi1WYWxIICAgICAgICAgICAgUk4gMTQKLVZhbEkgICAgICAgICAgICBSTiAxCi0KLVRlbXAxICAgICAgICAgICBSTiAzCi1UZW1wMiAgICAgICAgICAgUk4gMQotVGVtcDMgICAgICAgICAgIFJOIDEyCi1UZW1wNCAgICAgICAgICAgUk4gNwotVGVtcDUgICAgICAgICAgIFJOIDUKLXIweDBmZTAwZmUwICAgICBSTiAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFswICgxNioyNTUgLSAxNikgMCAoMTYqMjU1IC0gMTYpXQotcjB4MDBmZjAwZmYgICAgIFJOIDEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gWzAgMjU1IDAgMjU1XSB3aGVyZSAyNTUgaXMgb2Zmc2V0Ci1Db3VudGVyICAgICAgICAgUk4gMTEKLXBJbnRlckJ1ZiAgICAgICBSTiA4Ci0KLVZhbENBICAgICAgICAgICBSTiA4Ci1WYWxEQiAgICAgICAgICAgUk4gOQotVmFsR0UgICAgICAgICAgIFJOIDEwCi1WYWxIRiAgICAgICAgICAgUk4gMTEKLXIweDAwMTQwMDAxICAgICBSTiAxMgotcjB4MDAxNGZmZmIgICAgIFJOIDE0Ci0KLXIweDAwMDFmYzAwICAgICBSTiAxMQotCi1BY2N4ICAgICAgICAgICAgUk4gOAotQWNjeSAgICAgICAgICAgIFJOIDkKLVRlbXA2ICAgICAgICAgICBSTiAxNAotCi0gICAgICAgIE1fU1RSRCAgICAgIHBEc3QsIGRzdFN0ZXAsIHBwRHN0QXJncwotCi0gICAgICAgIE1PViAgICAgICAgIHBEc3QsIHBJbnRlckJ1ZiAgICAgICAgICAgICAgICAKLSAgICAgICAgTU9WICAgICAgICAgZHN0U3RlcCwgIzE2Ci0KLSAgICAgICAgOy8vIFNldCB1cCBjb3VudGVyIG9mIGZvcm1hdCwgWzBdICBbMF0gIFsxIChoZWlnaHQpXSAgWzggKHdpZHRoKV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgTU9WICAgICAgICAgQ291bnRlciwgIzQKLSAgICAgICAgTV9TVFIgICAgICAgZHN0U3RlcCwgcERzdFN0ZXAgICAgICAgIAotICAgICAgICBNX1NUUiAgICAgICBzcmNTdGVwLCBwU3JjU3RlcCAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgIHIweDAwZmYwMGZmLCA9MHgwMGZmMDBmZiAgICAgICAgICAgICAgIDsvLyBbMCAyNTUgMCAyNTVdIDI1NSBpcyBvZmZzZXQgdG8gYXZvaWQgbmVnYXRpdmUgcmVzdWx0cyAKLQotSGVpZ2h0TG9vcAotTmV4dFR3b1Jvd3NMb29wCi0gICAgICAgIExEUiAgICAgVmFsRCwgW3BTcmMsIHNyY1N0ZXBdICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIHJvdyAxIFtkMSBjMSBiMSBhMV0KLSAgICAgICAgTERSICAgICBWYWxBLCBbcFNyY10sICM0ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgcm93IDAgW2QwIGMwIGIwIGEwXQotICAgICAgICBMRFIgICAgIFZhbEgsIFtwU3JjLCBzcmNTdGVwXSAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgW2gxIGcxIGYxIGUxXSAgICAgICAgCi0gICAgICAgIExEUiAgICAgVmFsRSwgW3BTcmNdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkICBbaDAgZzAgZjAgZTBdCi0gICAgICAgIExEUkIgICAgVGVtcDIsIFtwU3JjLCBzcmNTdGVwXSAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIHJvdyAxIFtsMSBrMSBqMSBpMV0KLSAgICAgICAgTERSQiAgICBUZW1wMSwgW3BTcmNdLCAjLTggICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgcm93IDAgW2wwIGswIGowIGkwXQotICAgICAgICAKLSAgICAgICAgUEtIQlQgICBWYWxCLCBWYWxBLCBWYWxELCBMU0wgIzE2ICAgICAgICAgICAgICAgOy8vIFtiMSBhMSBiMCBhMF0KLSAgICAgICAgUEtIVEIgICBWYWxELCBWYWxELCBWYWxBLCBBU1IgIzE2ICAgICAgICAgICAgICAgOy8vIFtkMSBjMSBkMCBjMF0KLSAgICAgICAgVVhUQUIxNiBWYWxBLCByMHgwMGZmMDBmZiwgVmFsQiAgICAgICAgICAgICAgICAgOy8vIFswMCBhMSAwMCBhMF0gKyBbMCAyNTUgMCAyNTVdCi0gICAgICAgIFVYVEFCMTYgVmFsQywgcjB4MDBmZjAwZmYsIFZhbEQgICAgICAgICAgICAgICAgIDsvLyBbMDAgYzEgMDAgYzBdICsgWzAgMjU1IDAgMjU1XQotICAgICAgICBQS0hCVCAgIFZhbEksIFRlbXAxLCBUZW1wMiwgTFNMICMxNiAgICAgICAgICAgICA7Ly8gWzAwIGkxIDAwIGkwXSAgICAgICAgICAgIAotICAgICAgICBQS0hCVCAgIFZhbEYsIFZhbEUsIFZhbEgsIExTTCAjMTYgICAgICAgICAgICAgICA7Ly8gW2YxIGUxIGYwIGUwXQotICAgICAgICBQS0hUQiAgIFZhbEgsIFZhbEgsIFZhbEUsIEFTUiAjMTYgICAgICAgICAgICAgICA7Ly8gW2gxIGcxIGgwIGcwXQotICAgICAgICBVWFRBQjE2IFZhbEUsIHIweDAwZmYwMGZmLCBWYWxGICAgICAgICAgICAgICAgICA7Ly8gWzAwIGUxIDAwIGUwXSArIFswIDI1NSAwIDI1NV0KLQotICAgICAgICA7Ly8gQ2FsY3VsYXRlIEFjYzAKLSAgICAgICAgOy8vIEFjYzAgPSBhIC0gNSpiICsgMjAqYyArIDIwKmQgLSA1KmUgKyBmCi0gICAgICAgIFVYVEFCMTYgVGVtcDEsIFZhbEMsIFZhbEQsIFJPUiAjOAotICAgICAgICBVWFRBQjE2IFRlbXAzLCBWYWxFLCBWYWxCLCBST1IgIzgKLSAgICAgICAgUlNCICAgICBUZW1wMSwgVGVtcDMsIFRlbXAxLCBMU0wgIzIgICAgICAgICAgICAgICAgCi0gICAgICAgIFVYVEFCMTYgQWNjMCwgVmFsQSwgVmFsRiwgUk9SICM4Ci0gICAgICAgIEFERCAgICAgVGVtcDEsIFRlbXAxLCBUZW1wMSwgTFNMICMyICAgICAgICAKLSAgICAgICAgQUREICAgICBBY2MwLCBBY2MwLCBUZW1wMSAgICAgICAKLQotICAgICAgICA7Ly8gQ2FsY3VsYXRlIEFjYzEKLSAgICAgICAgOy8vIEFjYzEgPSBiIC0gNSpjICsgMjAqZCArIDIwKmUgLSA1KmYgKyBnCi0gICAgICAgIFVYVEFCMTYgVGVtcDEsIFZhbEUsIFZhbEQsIFJPUiAjOAotICAgICAgICBVWFRBQjE2IFRlbXAzLCBWYWxDLCBWYWxGLCBST1IgIzgKLSAgICAgICAgUlNCICAgICBUZW1wMSwgVGVtcDMsIFRlbXAxLCBMU0wgIzIgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgVVhUQUIxNiBWYWxHLCByMHgwMGZmMDBmZiwgVmFsSCAgICAgICAgICAgICAgICAgOy8vIFswMCBnMSAwMCBnMF0gKyBbMCAyNTUgMCAyNTVdCi0gICAgICAgIEFERCAgICAgVGVtcDEsIFRlbXAxLCBUZW1wMSwgTFNMICMyICAgICAgICAKLSAgICAgICAgVVhUQUIxNiBBY2MxLCBWYWxHLCBWYWxCLCBST1IgIzgKLSAgICAgICAgQUREICAgICBBY2MxLCBBY2MxLCBUZW1wMSAgICAgICAgCi0KLSAgICAgICAgVVhUQUIxNiBBY2MyLCBWYWxDLCBWYWxILCBST1IgIzggICAgICAgIAotICAgICAgICBBREQgICAgIFZhbEksIHIweDAwZmYwMGZmLCBWYWxJICAgICAgICAgICAgICAgICA7Ly8gWzAwIGkxIDAwIGkwXSArIFswIDI1NSAwIDI1NV0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIENhbGN1bGF0ZSBBY2MyCi0gICAgICAgIDsvLyBBY2MyID0gYyAtIDUqZCArIDIwKmUgKyAyMCpmIC0gNSpnICsgaAotICAgICAgICBVWFRBQjE2IFRlbXAxLCBWYWxHLCBWYWxELCBST1IgIzgKLSAgICAgICAgVVhUQUIxNiBBY2MzLCBWYWxJLCBWYWxELCBST1IgIzgKLSAgICAgICAgVVhUQUIxNiBUZW1wMiwgVmFsRSwgVmFsRiwgUk9SICM4Ci0gICAgICAgIAotICAgICAgICBSU0IgICAgIFRlbXAxLCBUZW1wMSwgVGVtcDIsIExTTCAjMiAgICAgICAgCi0gICAgICAgIFVYVEFCMTYgVGVtcDIsIFZhbEcsIFZhbEYsIFJPUiAjOAotICAgICAgICBBREQgICAgIFRlbXAxLCBUZW1wMSwgVGVtcDEsIExTTCAjMiAgICAgICAgCi0gICAgICAgIEFERCAgICAgQWNjMiwgQWNjMiwgVGVtcDEgICAgICAgIAotCi0gICAgICAgIDsvLyBDYWxjdWxhdGUgQWNjMwotICAgICAgICA7Ly8gQWNjMyA9IGQgLSA1KmUgKyAyMCpmICsgMjAqZyAtIDUqaCArIGkKLSAgICAgICAgVVhUQUIxNiBUZW1wMSwgVmFsRSwgVmFsSCwgUk9SICM4Ci0gICAgICAgIFJTQiAgICAgVGVtcDEsIFRlbXAxLCBUZW1wMiwgTFNMICMyCi0gICAgICAgIEFERCAgICAgVGVtcDEsIFRlbXAxLCBUZW1wMSwgTFNMICMyICAgICAgICAKLSAgICAgICAgQUREICAgICBBY2MzLCBBY2MzLCBUZW1wMQotICAgICAgICAKLSAgICAgICAgTV9MRFIgICBkc3RTdGVwLCBwRHN0U3RlcCAgICAgICAgCi0gICAgICAgIE1fTERSICAgc3JjU3RlcCwgcFNyY1N0ZXAKLQotICAgICAgICA7Ly8gSWYgQ291bnRlciBpcyBldmVuIHN0b3JlIEFjYzAtQWNjMyBpbiBhIHRlbXBvcmFyeSBidWZmZXIKLSAgICAgICAgOy8vIElmIENvdW50ZXIgaXMgb2ZmIHN0b3JlIEFjYzAtQWNjMyBhbmQgcHJldmlvdXMgQWNjMC1BY2MzIGluIGEgaW50ZXJtZWRpYXRlIGJ1ZiAKLSAgICAgICAgQU5EUyAgICAgICAgVGVtcDMsIENvdW50ZXIsICMxCi0gICAgICAgIEJFUSAgICAgICAgIE5vUHJvY2Vzc2luZyAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gUGFja2luZyBwcmV2aW91cyBhbmQgY3VycmVudCBBY2MwLUFjYzMgdmFsdWVzCi0gICAgICAgIE1fTERSRCAgICAgIEFjY3gsIEFjY3ksIHBUZW1wUmVzdWx0MQotICAgICAgICBQS0hCVCAgICAgICBUZW1wNiwgQWNjeCwgQWNjMCwgTFNMICMxNiAgICAgICAgICA7Ly9bMCBhMiAwIGEwXSA9IFswIGEzIDAgYTJdIFswIGExIDAgYTBdCi0gICAgICAgIFBLSFRCICAgICAgIEFjYzAsIEFjYzAsIEFjY3gsIEFTUiAjMTYgICAgICAgICAgIDsvL1swIGEzIDAgYTFdID0gWzAgYTEgMCBhMF0gWzAgYTMgMCBhMl0gCi0gICAgICAgIFNUUiAgICAgICAgIEFjYzAsIFtwRHN0LCBkc3RTdGVwXSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBTVFIgICAgICAgICBUZW1wNiwgW3BEc3RdLCAjNCAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgUEtIQlQgICAgICAgVGVtcDYsIEFjY3ksIEFjYzEsIExTTCAjMTYgICAgICAgICAgOy8vWzAgYjIgMCBiMF0gPSBbMCBiMyAwIGIyXSBbMCBiMSAwIGIwXQotICAgICAgICBQS0hUQiAgICAgICBBY2MxLCBBY2MxLCBBY2N5LCBBU1IgIzE2ICAgICAgICAgICAgOy8vWzAgYjMgMCBiMV0gPSBbMCBiMSAwIGIwXSBbMCBiMyAwIGIyXQotICAgICAgICBNX0xEUkQgICAgICBBY2N4LCBBY2N5LCBwVGVtcFJlc3VsdDIKLSAgICAgICAgU1RSICAgICAgICAgQWNjMSwgW3BEc3QsIGRzdFN0ZXBdICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFNUUiAgICAgICAgIFRlbXA2LCBbcERzdF0sICM0ICAgICAgICAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgUEtIQlQgICAgICAgVGVtcDYsIEFjY3gsIEFjYzIsIExTTCAjMTYgICAgICAgICAgOy8vWzAgYzIgMCBjMF0gPSBbMCBjMyAwIGMyXSBbMCBjMSAwIGMwXQotICAgICAgICBQS0hUQiAgICAgICBBY2MyLCBBY2MyLCBBY2N4LCBBU1IgIzE2ICAgICAgICAgICAgOy8vWzAgYzMgMCBjMV0gPSBbMCBjMSAwIGMwXSBbMCBjMyAwIGMyXQotICAgICAgICBTVFIgICAgICAgICBBY2MyLCBbcERzdCwgZHN0U3RlcF0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgU1RSICAgICAgICAgVGVtcDYsIFtwRHN0XSwgIzQgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFBLSEJUICAgICAgIFRlbXA2LCBBY2N5LCBBY2MzLCBMU0wgIzE2ICAgICAgICAgIDsvL1swIGQyIDAgZDBdID0gWzAgZDMgMCBkMl0gWzAgZDEgMCBkMF0KLSAgICAgICAgUEtIVEIgICAgICAgQWNjMywgQWNjMywgQWNjeSwgQVNSICMxNiAgICAgICAgICAgIDsvL1swIGQzIDAgZDFdID0gWzAgZDEgMCBkMF0gWzAgZDMgMCBkMl0KLSAgICAgICAgU1RSICAgICAgICAgQWNjMywgW3BEc3QsIGRzdFN0ZXBdICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFNUUiAgICAgICAgIFRlbXA2LCBbcERzdF0sICMtMTIKLSAgICAgICAgQUREICAgICAgICAgcERzdCwgcERzdCwgZHN0U3RlcCwgTFNMICMxICAgICAgICAgICAgICAgICAgIAotICAgICAgICBCICAgICAgICAgICBBZnRlclN0b3JlCi0KLU5vUHJvY2Vzc2luZwotICAgICAgICBNX1NUUkQgICAgICBBY2MwLCBBY2MxLCBwVGVtcFJlc3VsdDEKLSAgICAgICAgTV9TVFJEICAgICAgQWNjMiwgQWNjMywgcFRlbXBSZXN1bHQyCi1BZnRlclN0b3JlCi0gICAgICAgIFNVQlMgICAgICAgIENvdW50ZXIsIENvdW50ZXIsICMxICAgICAgICAgICAgICAgIDsvLyBMb29wIHRpbGwgaGVpZ2h0IGlzIDEwCi0gICAgICAgIEFERCAgICAgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQotICAgICAgICBCUEwgICAgICAgICBIZWlnaHRMb29wCi0KLSAgICAgICAgU1RSICAgICAgICAgQWNjMCwgW3BEc3RdLCAjNCAgICAgICAgICAgICAgICAgICAgOy8vWzAgYTEgMCBhMF0KLSAgICAgICAgU1RSICAgICAgICAgQWNjMSwgW3BEc3RdLCAjNAotICAgICAgICBTVFIgICAgICAgICBBY2MyLCBbcERzdF0sICM0Ci0gICAgICAgIFNUUiAgICAgICAgIEFjYzMsIFtwRHN0XSwgIy0xMgotICAgICAgICAKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBIb3Jpem9udGFsIGludGVycG9sYXRpb24gdXNpbmcgbXVsdGlwbGljYXRpb24KLSAgICAgICAgOy8vCi0gICAgCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMgotICAgICAgICBNT1YgICAgICAgICBzcmNTdGVwLCAjMTYKLSAgICAgICAgTV9MRFJEICAgICAgcERzdCwgZHN0U3RlcCwgcHBEc3RBcmdzCi0KLSAgICAgICAgTU9WICAgICAgICAgQ291bnRlciwgIzQKLSAgICAgICAgTERSICAgICAgICAgcjB4MDAxNGZmZmIsID0weDAwMTRmZmZiCi0gICAgICAgIExEUiAgICAgICAgIHIweDAwMTQwMDAxLCA9MHgwMDE0MDAwMQotCi1IZWlnaHRMb29wMQotICAgICAgICBNX1NUUiAgICAgICBDb3VudGVyLCBwQ291bnRlcgotCi0gICAgICAgIE1fTERSICAgICAgIFZhbENBLCBbcFNyY10sIHNyY1N0ZXAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgWzAgYyAwIGFdCi0gICAgICAgIE1fTERSICAgICAgIFZhbERCLCBbcFNyY10sIHNyY1N0ZXAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgWzAgZCAwIGJdCi0gICAgICAgIE1fTERSICAgICAgIFZhbEdFLCBbcFNyY10sIHNyY1N0ZXAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgWzAgZyAwIGVdCi0gICAgICAgIE1fTERSICAgICAgIFZhbEhGLCBbcFNyY10sIHNyY1N0ZXAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgWzAgaCAwIGZdCi0KLQotICAgICAgICA7Ly8gQWNjMCA9IHNtdWFkIChbMCAyMCAwIDFdLCBhZGQoWzAgYyAwIGFdICsgWzAgZCAwIGZdKSkgLSAoNSAqIChiICsgZSkpIAotICAgICAgICA7Ly8gQWNjMSA9IHNtdWFkIChbMCAyMCAwIDFdLCBhZGQoWzAgZSAwIGddICsgWzAgZCAwIGJdKSkgLSAoNSAqIChjICsgZikpIAotICAgICAgICA7Ly8gQWNjMiA9IHNtdWFkIChbMCAxIDAgMjBdLCBhZGQoWzAgYyAwIGVdICsgWzAgaCAwIGZdKSkgLSAoNSAqIChkICsgZykpIAotICAgICAgICA7Ly8gQWNjMyA9IHNtdWFkIChbMCAyMCAwIDFdLCBhZGQoWzAgZCAwIGZdICsgWzAgaSAwIGddKSkgLSAoNSAqIChlICsgaCkpIAotCi0gICAgICAgIFNNVUFEICAgICAgIEFjYzAsIFZhbENBLCByMHgwMDE0MDAwMSAgICAgICAgICAgIDsvLyBBY2MwICA9IFswIGMgMCBhXSAqIFswIDIwIDAgMV0KLSAgICAgICAgU01VQUQgICAgICAgQWNjMSwgVmFsREIsIHIweDAwMTQwMDAxICAgICAgICAgICAgOy8vIEFjYzEgID0gWzAgYyAwIGFdICogWzAgMjAgMCAxXQotICAgICAgICBTTVVBRFggICAgICBBY2MyLCBWYWxHRSwgcjB4MDAxNGZmZmIgICAgICAgICAgICA7Ly8gQWNjMiAgPSBbMCBnIDAgZV0gKiBbMCAyMCAwIC01XQotICAgICAgICBTTVVBRCAgICAgICBBY2MzLCBWYWxHRSwgcjB4MDAxNGZmZmIgICAgICAgICAgICA7Ly8gQWNjMyAgPSBbMCBnIDAgZV0gKiBbMCAyMCAwIC01XQotCi0gICAgICAgIFNNTEFEICAgICAgIEFjYzAsIFZhbERCLCByMHgwMDE0ZmZmYiwgQWNjMCAgICAgIDsvLyBBY2MwICs9IFswIGQgMCBiXSAqIFswIDIwIDAgLTVdCi0gICAgICAgIFNNTEFEWCAgICAgIEFjYzEsIFZhbEdFLCByMHgwMDE0MDAwMSwgQWNjMSAgICAgIDsvLyBBY2MxICs9IFswIGcgMCBlXSAqIFswIDIwIDAgMV0KLSAgICAgICAgU01MQURYICAgICAgQWNjMiwgVmFsSEYsIHIweDAwMTQwMDAxLCBBY2MyICAgICAgOy8vIEFjYzIgKz0gWzAgaCAwIGZdICogWzAgMjAgMCAxXQotICAgICAgICBTTUxBRFggICAgICBBY2MzLCBWYWxIRiwgcjB4MDAxNGZmZmIsIEFjYzMgICAgICA7Ly8gQWNjMyArPSBbMCBoIDAgZl0gKiBbMCAyMCAwIC01XQotCi0gICAgICAgIFNNTEFCQiAgICAgIEFjYzAsIFZhbEdFLCByMHgwMDE0ZmZmYiwgQWNjMCAgICAgIDsvLyBBY2MwICs9IFswIGcgMCBlXSAqIFswIDAgMCAtNV0KLSAgICAgICAgU01MQVRCICAgICAgQWNjMSwgVmFsQ0EsIHIweDAwMTRmZmZiLCBBY2MxICAgICAgOy8vIEFjYzEgKz0gWzAgZCAwIGJdICogWzAgMCAwIC01XQotICAgICAgICBTTUxBVEIgICAgICBBY2MyLCBWYWxDQSwgcjB4MDAxNDAwMDEsIEFjYzIgICAgICA7Ly8gQWNjMiArPSBbMCBjIDAgYV0gKiBbMCAwIDAgMV0KLSAgICAgICAgU01MQVRCICAgICAgQWNjMywgVmFsREIsIHIweDAwMTQwMDAxLCBBY2MzICAgICAgOy8vIEFjYzMgKz0gWzAgYyAwIGFdICogWzAgMCAwIDFdCi0KLSAgICAgICAgTERSSCAgICAgICAgVmFsQ0EsIFtwU3JjXSwgIzQgICAgICAgICAgICAgICAgICAgOy8vIDggPSBzcmNTdGVwIC0gMTYKLSAgICAgICAgU01MQUJCICAgICAgQWNjMCwgVmFsSEYsIHIweDAwMTQwMDAxLCBBY2MwICAgICAgOy8vIEFjYzAgKz0gWzAgaCAwIGZdICogWzAgMCAwIDFdICAgICAgICAKLSAgICAgICAgU01MQUJCICAgICAgQWNjMSwgVmFsSEYsIHIweDAwMTRmZmZiLCBBY2MxICAgICAgOy8vIEFjYzEgKz0gWzAgaCAwIGZdICogWzAgMCAwIC01XQotICAgICAgICBTTUxBVEIgICAgICBBY2MyLCBWYWxEQiwgcjB4MDAxNGZmZmIsIEFjYzIgICAgICA7Ly8gQWNjMiArPSBbMCBkIDAgYl0gKiBbMCAwIDAgLTVdICAgICAgICAKLSAgICAgICAgU01MQUJCICAgICAgQWNjMywgVmFsQ0EsIHIweDAwMTQwMDAxLCBBY2MzICAgICAgOy8vIEFjYzMgKz0gWzAgZCAwIGJdICogWzAgMCAwIDFdCi0gICAgICAgIAotICAgICAgICBMRFIgICAgICAgICByMHgwMDAxZmMwMCwgPTB4MDAwMWZjMDAgICAgICAgICAgICA7Ly8gKDB4ZmYgKiAxNiAqIDMyKSAtIDUxMgotICAgICAgICBTVUIgICAgICAgICBBY2MwLCBBY2MwLCByMHgwMDAxZmMwMCAgICAgICAgCi0gICAgICAgIFNVQiAgICAgICAgIEFjYzEsIEFjYzEsIHIweDAwMDFmYzAwICAgICAgICAKLSAgICAgICAgU1VCICAgICAgICAgQWNjMiwgQWNjMiwgcjB4MDAwMWZjMDAgICAgICAgIAotICAgICAgICBTVUIgICAgICAgICBBY2MzLCBBY2MzLCByMHgwMDAxZmMwMCAgICAgICAgCi0KLSAgICAgICAgVVNBVCAgICAgICAgQWNjMCwgIzE4LCBBY2MwCi0gICAgICAgIFVTQVQgICAgICAgIEFjYzEsICMxOCwgQWNjMQotICAgICAgICBVU0FUICAgICAgICBBY2MyLCAjMTgsIEFjYzIKLSAgICAgICAgVVNBVCAgICAgICAgQWNjMywgIzE4LCBBY2MzCi0gICAgICAgIAotICAgICAgICBNT1YgICAgICAgICBBY2MwLCBBY2MwLCBMU1IgIzEwCi0gICAgICAgIE1fU1RSQiAgICAgIEFjYzAsIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBNT1YgICAgICAgICBBY2MxLCBBY2MxLCBMU1IgIzEwCi0gICAgICAgIE1fU1RSQiAgICAgIEFjYzEsIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBNT1YgICAgICAgICBBY2MyLCBBY2MyLCBMU1IgIzEwCi0gICAgICAgIE1fU1RSQiAgICAgIEFjYzIsIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBNT1YgICAgICAgICBBY2MzLCBBY2MzLCBMU1IgIzEwCi0gICAgICAgIE1fU1RSQiAgICAgIEFjYzMsIFtwRHN0XSwgZHN0U3RlcAotCi0KLSAgICAgICAgTV9MRFIgICAgICAgQ291bnRlciwgcENvdW50ZXIKLSAgICAgICAgU1VCICAgICAgICAgcERzdCwgcERzdCwgZHN0U3RlcCwgTFNMICMyCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMgotICAgICAgICBBREQgICAgICAgICBwRHN0LCBwRHN0LCAjMQotICAgICAgICBTVUJTICAgICAgICBDb3VudGVyLCBDb3VudGVyLCAjMQotICAgICAgICBCR1QgICAgICAgICBIZWlnaHRMb29wMQotRW5kCi0gICAgICAgIFNVQiAgICAgICAgIHBEc3QsIHBEc3QsICM0Ci0gICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsICMxNgotCi0gICAgICAgIE1fRU5ECi0gICAgCi0gICAgRU5ESUYKLSAgICAKLSAgICBFTkQKLSAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU3YzVjNy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyOTAgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZV9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICA5NjQxCi07Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLQotICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlCi0KLSAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLQotICAgIAotICAgIAotICAgIAotCi0gICAgSUYgQVJNMTEzNkpTIAotICAgICAgICAKLSAgICAgICAgTV9BTExPQzggcHBEc3RBcmdzLCA4Ci0gICAgICAgIE1fQUxMT0M0IHBwU3JjLCA0Ci0gICAgICAgIE1fQUxMT0M0IHBwRHN0LCA0Ci0gICAgICAgIE1fQUxMT0M0IHBDb3VudGVyLCA0Ci0KLSAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgotICAgICAgICA7Ly8gRnVuY3Rpb246Ci0gICAgICAgIDsvLyAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW1wbGVtZW50cyBkaWFnb25hbCBpbnRlcnBvbGF0aW9uIGZvciBhIGJsb2NrIG9mIHNpemUgNHg0LiBJbnB1dCBhbmQgb3V0cHV0IHNob3VsZCAKLSAgICAgICAgOy8vIGJlIGFsaWduZWQuIAotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIFJlZ2lzdGVycyB1c2VkIGFzIGlucHV0IGZvciB0aGlzIGZ1bmN0aW9uCi0gICAgICAgIDsvLyByMCxyMSxyMixyMywgcjggd2hlcmUgcjAscjIgIGlucHV0IHBvaW50ZXIgYW5kIHIxLHIzIHN0ZXAgc2l6ZSwgcjggaW50ZXJtZWRpYXRlLWJ1ZiBwb2ludGVyCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gUmVnaXN0ZXJzIHByZXNlcnZlZCBmb3IgdG9wIGxldmVsIGZ1bmN0aW9uCi0gICAgICAgIDsvLyByMCxyMSxyMixyMyxyNCxyNSxyNixyMTQKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBSZWdpc3RlcnMgbW9kaWZpZWQgYnkgdGhlIGZ1bmN0aW9uCi0gICAgICAgIDsvLyByNyxyOCxyOSxyMTAscjExLHIxMgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIE91dHB1dCByZWdpc3RlcnMKLSAgICAgICAgOy8vIE5vbmUuIEZ1bmN0aW9uIHdpbGwgcHJlc2VydmUgcjAtcjMKLQotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZSwgcjYKLQotOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCi1wU3JjICAgICAgICAgICAgUk4gMAotc3JjU3RlcCAgICAgICAgIFJOIDEKLXBEc3QgICAgICAgICAgICBSTiAyCi1kc3RTdGVwICAgICAgICAgUk4gMwotCi07Ly8gRGVjbGFyZSBpbm5lciBsb29wIHJlZ2lzdGVycwotVmFsQSAgICAgICAgICAgIFJOIDUKLVZhbEEwICAgICAgICAgICBSTiA0Ci1WYWxBMSAgICAgICAgICAgUk4gNQotVmFsQUYwICAgICAgICAgIFJOIDQKLVZhbEFGMSAgICAgICAgICBSTiA1Ci0KLVZhbEIgICAgICAgICAgICBSTiAxMQotCi1WYWxDICAgICAgICAgICAgUk4gNQotVmFsQzAgICAgICAgICAgIFJOIDQKLVZhbEMxICAgICAgICAgICBSTiA1Ci1WYWxDRDAgICAgICAgICAgUk4gMTIKLVZhbENEMSAgICAgICAgICBSTiAxNAotVmFsQ0YwICAgICAgICAgIFJOIDQKLVZhbENGMSAgICAgICAgICBSTiA1Ci0KLVZhbEQgICAgICAgICAgICBSTiAxMAotCi1WYWxFICAgICAgICAgICAgUk4gNwotVmFsRTAgICAgICAgICAgIFJOIDYKLVZhbEUxICAgICAgICAgICBSTiA3Ci1WYWxFQjAgICAgICAgICAgUk4gMTAKLVZhbEVCMSAgICAgICAgICBSTiAxMQotVmFsRUQwICAgICAgICAgIFJOIDYKLVZhbEVEMSAgICAgICAgICBSTiA3Ci0KLVZhbEYgICAgICAgICAgICBSTiAxMAotCi1WYWxHICAgICAgICAgICAgUk4gMTQKLVZhbEcwICAgICAgICAgICBSTiAxMgotVmFsRzEgICAgICAgICAgIFJOIDE0Ci1WYWxHQjAgICAgICAgICAgUk4gMTIKLVZhbEdCMSAgICAgICAgICBSTiAxNAotCi1BY2MwICAgICAgICAgICAgUk4gNAotQWNjMSAgICAgICAgICAgIFJOIDUKLUFjYzIgICAgICAgICAgICBSTiA2Ci1BY2MzICAgICAgICAgICAgUk4gNwotCi1UZW1wICAgICAgICAgICAgUk4gNwotU3RlcCAgICAgICAgICAgIFJOIDYKLQotcEludGVyQnVmICAgICAgIFJOIDgKLUNvdW50ZXIgICAgICAgICBSTiA4Ci1yMHgwMGZmMDBmZiAgICAgUk4gOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gWzAgMjU1IDAgMjU1XSB3aGVyZSAyNTUgaXMgb2Zmc2V0Ci1yMHgwMDAxZmMwMCAgICAgUk4gMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gWzAgKDE2KjI1NSAtIDE2KSAwICgxNioyNTUgLSAxNildCi0KLSAgICAKLTsvLyBEZWNsYXJlIGlubmVyIGxvb3AgcmVnaXN0ZXJzCi1WYWxDQSAgICAgICAgICAgUk4gOAotVmFsREIgICAgICAgICAgIFJOIDkKLVZhbEdFICAgICAgICAgICBSTiAxMAotVmFsSEYgICAgICAgICAgIFJOIDExCi1yMHgwMDE0MDAwMSAgICAgUk4gMTIKLXIweDAwMTRmZmZiICAgICBSTiAxNAotCi1yMHgwMDAwMDIwMCAgICAgUk4gMTIKLXIweDAwMDAwMGZmICAgICBSTiAxMgotICAgICAgICAKLSAgICAgICAgTV9TVFJEICAgICAgcERzdCwgZHN0U3RlcCwgcHBEc3RBcmdzCi0gICAgICAgIE1PViAgICAgICAgIHBEc3QsIHBJbnRlckJ1ZiAgICAgICAgICAgICAgICAKLSAgICAgICAgTU9WICAgICAgICAgZHN0U3RlcCwgIzI0Ci0KLSAgICAgICAgOy8vIFNldCB1cCBjb3VudGVyIG9mIGZvcm1hdCwgWzBdICBbMF0gIFsxIChoZWlnaHQpXSAgWzggKHdpZHRoKV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgTU9WICAgICAgICAgQ291bnRlciwgIzEKLSAgICAgICAgTU9WICAgICAgICAgVGVtcCwgIzggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBBREQgICAgICAgICBDb3VudGVyLCBUZW1wLCBDb3VudGVyLCBMU0wgIzggICAgICAgIDsvLyBbMCAwIEggV10gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgIHIweDAwZmYwMGZmLCA9MHgwMGZmMDBmZiAgICAgICAgICAgICAgICA7Ly8gWzAgMjU1IDAgMjU1XSAyNTUgaXMgb2Zmc2V0IHRvIGF2b2lkIG5lZ2F0aXZlIHJlc3VsdHMgCi1XaWR0aExvb3AKLSAgICAgICAgTV9TVFIgICAgICAgcFNyYywgcHBTcmMKLSAgICAgICAgTV9TVFIgICAgICAgcERzdCwgcHBEc3QKLUhlaWdodExvb3AKLVR3b1Jvd3NMb29wCi0gICAgICAgIE1fTERSICAgICAgIFZhbEMsIFtwU3JjXSwgc3JjU3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgW2MzIGMyIGMxIGMwXQotICAgICAgICBNX0xEUiAgICAgICBWYWxELCBbcFNyY10sIHNyY1N0ZXAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgIFtkMyBkMiBkMSBkMF0KLSAgICAgICAgTV9MRFIgICAgICAgVmFsRSwgW3BTcmNdLCBzcmNTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkICBbZTMgZTIgZTEgZTBdICAgICAgICAKLSAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMyICAgICAgICAgICAgICAgIAotICAgICAgICBVWFRBQjE2ICAgICBWYWxDMCwgcjB4MDBmZjAwZmYsIFZhbEMgICAgICAgICAgICAgICAgOy8vIFswIGMyIDAgYzBdICsgWzAgMjU1IDAgMjU1XQotICAgICAgICBVWFRBQjE2ICAgICBWYWxDMSwgcjB4MDBmZjAwZmYsIFZhbEMsIFJPUiAjOCAgICAgICAgOy8vIFswIGMzIDAgYzFdICsgWzAgMjU1IDAgMjU1XSAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgIFZhbEIsIFtwU3JjXSAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgW2IzIGIyIGIxIGIwXSAgICAgICAgCi0gICAgICAgIFVYVEFCMTYgICAgIFZhbEUwLCByMHgwMGZmMDBmZiwgVmFsRSAgICAgICAgICAgICAgICA7Ly8gWzAgZTIgMCBlMF0gKyBbMCAyNTUgMCAyNTVdCi0gICAgICAgIFVYVEFCMTYgICAgIFZhbEUxLCByMHgwMGZmMDBmZiwgVmFsRSwgUk9SICM4ICAgICAgICA7Ly8gWzAgZTMgMCBlMV0gKyBbMCAyNTUgMCAyNTVdICAgICAgICAKLSAgICAgICAgVVhUQUIxNiAgICAgVmFsQ0QwLCBWYWxDMCwgVmFsRCAgICAgICAgICAgICAgICAgICAgIDsvLyBbMCBjMiAwIGMwXSArIFswIDI1NSAwIDI1NV0gKyBbMCBkMiAwIGQwXQotICAgICAgICBVWFRBQjE2ICAgICBWYWxDRDEsIFZhbEMxLCBWYWxELCBST1IgIzggICAgICAgICAgICAgOy8vIFswIGMzIDAgYzFdICsgWzAgMjU1IDAgMjU1XSArIFswIGQzIDAgZDFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgVVhUQUIxNiAgICAgVmFsRUIwLCBWYWxFMCwgVmFsQiAgICAgICAgICAgICAgICAgICAgIDsvLyBbMCBlMiAwIGUwXSArIFswIDI1NSAwIDI1NV0gKyBbMCBiMiAwIGIwXQotICAgICAgICBSU0IgICAgICAgICBWYWxDRDAsIFZhbEVCMCwgVmFsQ0QwLCBMU0wgIzIgICAgICAgICAgOy8vIDQqKE9mZitDK0QpIC0gKE9mZitCK0UpCi0gICAgICAgIAotICAgICAgICBMRFIgICAgICAgICBWYWxELCBbcFNyYywgc3JjU3RlcCwgTFNMICMxXSAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgIFtkMyBkMiBkMSBkMF0KLSAgICAgICAgVVhUQUIxNiAgICAgVmFsRUIxLCBWYWxFMSwgVmFsQiwgUk9SICM4ICAgICAgICAgICAgIDsvLyBbMCBlMyAwIGUxXSArIFswIDI1NSAwIDI1NV0gKyBbMCBiMyAwIGIxXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFJTQiAgICAgICAgIFZhbENEMSwgVmFsRUIxLCBWYWxDRDEsIExTTCAjMiAgICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFVYVEFCMTYgICAgIFZhbEVEMCwgVmFsRTAsIFZhbEQgICAgICAgICAgICAgICAgICAgICA7Ly8gWzAgZTIgMCBlMF0gKyBbMCAyNTUgMCAyNTVdICsgWzAgZDIgMCBkMF0KLSAgICAgICAgVVhUQUIxNiAgICAgVmFsRUQxLCBWYWxFMSwgVmFsRCwgUk9SICM4ICAgICAgICAgICAgIDsvLyBbMCBlMyAwIGUxXSArIFswIDI1NSAwIDI1NV0gKyBbMCBkMyAwIGQxXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgTERSICAgICAgICAgVmFsRiwgW3BTcmMsIHNyY1N0ZXAsIExTTCAjMl0gICAgICAgICAgIDsvLyBMb2FkICBbZjMgZjIgZjEgZjBdCi0gICAgICAgIE1fTERSICAgICAgIFZhbEIsIFtwU3JjXSwgc3JjU3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgW2IzIGIyIGIxIGIwXSAgICAgICAgICAgICAgICAKLSAgICAgICAgQUREICAgICAgICAgVmFsQ0QwLCBWYWxDRDAsIFZhbENEMCwgTFNMICMyICAgICAgICAgIDsvLyA1ICogWzQqKE9mZitDK0QpIC0gKE9mZitCK0UpXQotICAgICAgICBBREQgICAgICAgICBWYWxDRDEsIFZhbENEMSwgVmFsQ0QxLCBMU0wgIzIgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBVWFRBQjE2ICAgICBWYWxDRjEsIFZhbEMxLCBWYWxGLCBST1IgIzggICAgICAgICAgICAgOy8vIFswIGMzIDAgYzFdICsgWzAgMjU1IDAgMjU1XSArIFswIGYzIDAgZjFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgVVhUQUIxNiAgICAgVmFsQ0YwLCBWYWxDMCwgVmFsRiAgICAgICAgICAgICAgICAgICAgIDsvLyBbMCBjMiAwIGMwXSArIFswIDI1NSAwIDI1NV0gKyBbMCBmMiAwIGYwXSAgICAgICAgCi0gICAgICAgIFJTQiAgICAgICAgIFZhbEVEMSwgVmFsQ0YxLCBWYWxFRDEsIExTTCAjMiAgICAgICAgCi0gICAgICAgIAotICAgICAgICBTVUIgICAgICAgICBWYWxBLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKLSAgICAgICAgTERSICAgICAgICAgVmFsQSwgW1ZhbEFdICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkICBbYTMgYTIgYTEgYTBdCi0gICAgICAgIFJTQiAgICAgICAgIFZhbEVEMCwgVmFsQ0YwLCBWYWxFRDAsIExTTCAjMiAgICAgICAgICA7Ly8gNCooT2ZmK0UrRCkgLSAoT2ZmK0MrRikgICAgICAgIAotICAgICAgICBBREQgICAgICAgICBWYWxFRDEsIFZhbEVEMSwgVmFsRUQxLCBMU0wgIzIgICAgICAgICAgCi0gICAgICAgIEFERCAgICAgICAgIFZhbEVEMCwgVmFsRUQwLCBWYWxFRDAsIExTTCAjMiAgICAgICAgICA7Ly8gNSAqIFs0KihPZmYrRStEKSAtIChPZmYrQytGKV0KLSAgICAgICAgVVhUQUIxNiAgICAgVmFsQTAsIHIweDAwZmYwMGZmLCBWYWxBICAgICAgICAgICAgICAgIDsvLyBbMCBhMiAwIGEwXSArIFswIDI1NSAwIDI1NV0KLSAgICAgICAgVVhUQUIxNiAgICAgVmFsQTEsIHIweDAwZmYwMGZmLCBWYWxBLCBST1IgIzggICAgICAgIDsvLyBbMCBhMyAwIGExXSArIFswIDI1NSAwIDI1NV0KLSAgICAgICAgVVhUQUIxNiAgICAgVmFsQUYwLCBWYWxBMCwgVmFsRiAgICAgICAgICAgICAgICAgICAgIDsvLyBbMCBhMiAwIGEwXSArIFswIDI1NSAwIDI1NV0gKyBbMCBmMiAwIGYwXQotICAgICAgICBVWFRBQjE2ICAgICBWYWxBRjEsIFZhbEExLCBWYWxGLCBST1IgIzggICAgICAgICAgICAgOy8vIFswIGEzIDAgYTFdICsgWzAgMjU1IDAgMjU1XSArIFswIGYzIDAgZjFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBBREQgICAgICAgICBBY2MxLCBWYWxDRDEsIFZhbEFGMSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBMRFIgICAgICAgICBWYWxHLCBbcFNyYywgc3JjU3RlcCwgTFNMICMyXSAgICAgICAgICAgOy8vIExvYWQgIFtnMyBnMiBnMSBnMF0KLSAgICAgICAgQUREICAgICAgICAgQWNjMCwgVmFsQ0QwLCBWYWxBRjAgICAgICAgICAgICAgICAgICAgIDsvLyBBY2MwID0gMTYqT2ZmICsgKEErRikgKyAyMCooQytEKSAtIDUqKEIrRSkgICAgICAgIAotICAgICAgICBTVFIgICAgICAgICBBY2MxLCBbcERzdCwgIzRdICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHJlc3VsdCAmIGFkanVzdCBwb2ludGVyCi0gICAgICAgIE1fU1RSICAgICAgIEFjYzAsIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgcmVzdWx0ICYgYWRqdXN0IHBvaW50ZXIKLSAgICAgICAgVVhUQUIxNiAgICAgVmFsRzAsIHIweDAwZmYwMGZmLCBWYWxHICAgICAgICAgICAgICAgIDsvLyBbMCBnMiAwIGcwXSArIFswIDI1NSAwIDI1NV0KLSAgICAgICAgVVhUQUIxNiAgICAgVmFsRzEsIHIweDAwZmYwMGZmLCBWYWxHLCBST1IgIzggICAgICAgIDsvLyBbMCBnMyAwIGcxXSArIFswIDI1NSAwIDI1NV0KLSAgICAgICAgVVhUQUIxNiAgICAgVmFsR0IwLCBWYWxHMCwgVmFsQiAgICAgICAgICAgICAgICAgICAgIDsvLyBbMCBnMiAwIGcwXSArIFswIDI1NSAwIDI1NV0gKyBbMCBiMiAwIGIwXQotICAgICAgICBVWFRBQjE2ICAgICBWYWxHQjEsIFZhbEcxLCBWYWxCLCBST1IgIzggICAgICAgICAgICAgOy8vIFswIGczIDAgZzFdICsgWzAgMjU1IDAgMjU1XSArIFswIGIzIDAgYjFdICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIEFERCAgICAgICAgIEFjYzIsIFZhbEVEMCwgVmFsR0IwICAgICAgICAgICAgICAgICAgICA7Ly8gQWNjMiA9IDE2Kk9mZiArIChCK0cpICsgMjAqKEQrRSkgLSA1KihDK0YpCi0gICAgICAgIEFERCAgICAgICAgIEFjYzMsIFZhbEVEMSwgVmFsR0IxICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFNUUiAgICAgICAgIEFjYzMsIFtwRHN0LCAjNF0gICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgcmVzdWx0ICYgYWRqdXN0IHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgTV9TVFIgICAgICAgQWNjMiwgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSByZXN1bHQgJiBhZGp1c3QgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICBTVUJTICAgICAgICBDb3VudGVyLCBDb3VudGVyLCAjMSA8PCA4ICAgICAgICAgICAgICAgOy8vIExvb3AgdGlsbCBoZWlnaHQgaXMgMTAKLSAgICAgICAgQUREICAgICAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCi0gICAgICAgIEJQTCAgICAgICAgIEhlaWdodExvb3AKLSAgICAgICAgCi0gICAgICAgIE1fTERSICAgICAgIHBTcmMsIHBwU3JjCi0gICAgICAgIE1fTERSICAgICAgIHBEc3QsIHBwRHN0Ci0gICAgICAgIEFERFMgICAgICAgIENvdW50ZXIsIENvdW50ZXIsICMoMSA8PCA4KS00ICAgICAgICAgICA7Ly8gTG9vcCB0aWxsIHdpZHRoIGlzIDEyCi0gICAgICAgIEFERCAgICAgICAgIHBTcmMsIHBTcmMsICM0Ci0gICAgICAgIEFERCAgICAgICAgIHBEc3QsIHBEc3QsICM4Ci0gICAgICAgIEFERCAgICAgICAgIENvdW50ZXIsIENvdW50ZXIsICMxPDw4Ci0gICAgICAgIEJQTCAgICAgICAgIFdpZHRoTG9vcAotICAgIAotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIEhvcml6b250YWwgaW50ZXJwb2xhdGlvbiB1c2luZyBtdWx0aXBsaWNhdGlvbgotICAgICAgICA7Ly8KLSAgICAKLSAgICAgICAgU1VCICAgICAgICAgcFNyYywgcERzdCwgIzI0Ci0gICAgICAgIE1PViAgICAgICAgIHNyY1N0ZXAsICMyNAotICAgICAgICBNX0xEUkQgICAgICBwRHN0LCBkc3RTdGVwLCBwcERzdEFyZ3MKLQotICAgICAgICBNT1YgICAgICAgICBDb3VudGVyLCAjNAotICAgICAgICBMRFIgICAgICAgICByMHgwMDE0ZmZmYiwgPTB4MDAxNGZmZmIKLSAgICAgICAgTERSICAgICAgICAgcjB4MDAxNDAwMDEsID0weDAwMTQwMDAxCi0KLUhlaWdodExvb3AxCi0gICAgICAgIE1fU1RSICAgICAgIENvdW50ZXIsIHBDb3VudGVyCi0KLQotICAgICAgICBMRFIgICAgICAgICBWYWxDQSwgW3BTcmNdLCAjNCAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgWzAgYyAwIGFdCi0gICAgICAgIExEUiAgICAgICAgIFZhbERCLCBbcFNyY10sICM0ICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkICBbMCBkIDAgYl0KLSAgICAgICAgTERSICAgICAgICAgVmFsR0UsIFtwU3JjXSwgIzQgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgIFswIGcgMCBlXQotICAgICAgICBMRFIgICAgICAgICBWYWxIRiwgW3BTcmNdLCAjNCAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgWzAgaCAwIGZdCi0KLSAgICAgICAgOy8vIEFjYzAgPSBzbXVhZCAoWzAgMjAgMCAxXSwgYWRkKFswIGMgMCBhXSArIFswIGQgMCBmXSkpIC0gKDUgKiAoYiArIGUpKSAKLSAgICAgICAgOy8vIEFjYzEgPSBzbXVhZCAoWzAgMjAgMCAxXSwgYWRkKFswIGUgMCBnXSArIFswIGQgMCBiXSkpIC0gKDUgKiAoYyArIGYpKSAKLSAgICAgICAgOy8vIEFjYzIgPSBzbXVhZCAoWzAgMSAwIDIwXSwgYWRkKFswIGMgMCBlXSArIFswIGggMCBmXSkpIC0gKDUgKiAoZCArIGcpKSAKLSAgICAgICAgOy8vIEFjYzMgPSBzbXVhZCAoWzAgMjAgMCAxXSwgYWRkKFswIGQgMCBmXSArIFswIGkgMCBnXSkpIC0gKDUgKiAoZSArIGgpKSAKLSAgICAgICAgU01VQUQgICAgICAgQWNjMCwgVmFsQ0EsIHIweDAwMTQwMDAxICAgICAgICAgICAgOy8vIEFjYzAgID0gWzAgYyAwIGFdICogWzAgMjAgMCAxXQotICAgICAgICBTTVVBRCAgICAgICBBY2MxLCBWYWxEQiwgcjB4MDAxNDAwMDEgICAgICAgICAgICA7Ly8gQWNjMSAgPSBbMCBjIDAgYV0gKiBbMCAyMCAwIDFdCi0gICAgICAgIFNNVUFEWCAgICAgIEFjYzIsIFZhbEdFLCByMHgwMDE0ZmZmYiAgICAgICAgICAgIDsvLyBBY2MyICA9IFswIGcgMCBlXSAqIFswIDIwIDAgLTVdCi0gICAgICAgIFNNVUFEICAgICAgIEFjYzMsIFZhbEdFLCByMHgwMDE0ZmZmYiAgICAgICAgICAgIDsvLyBBY2MzICA9IFswIGcgMCBlXSAqIFswIDIwIDAgLTVdCi0KLSAgICAgICAgU01MQUQgICAgICAgQWNjMCwgVmFsREIsIHIweDAwMTRmZmZiLCBBY2MwICAgICAgOy8vIEFjYzAgKz0gWzAgZCAwIGJdICogWzAgMjAgMCAtNV0KLSAgICAgICAgU01MQURYICAgICAgQWNjMSwgVmFsR0UsIHIweDAwMTQwMDAxLCBBY2MxICAgICAgOy8vIEFjYzEgKz0gWzAgZyAwIGVdICogWzAgMjAgMCAxXQotICAgICAgICBTTUxBRFggICAgICBBY2MyLCBWYWxIRiwgcjB4MDAxNDAwMDEsIEFjYzIgICAgICA7Ly8gQWNjMiArPSBbMCBoIDAgZl0gKiBbMCAyMCAwIDFdCi0gICAgICAgIFNNTEFEWCAgICAgIEFjYzMsIFZhbEhGLCByMHgwMDE0ZmZmYiwgQWNjMyAgICAgIDsvLyBBY2MzICs9IFswIGggMCBmXSAqIFswIDIwIDAgLTVdCi0KLSAgICAgICAgU01MQUJCICAgICAgQWNjMCwgVmFsR0UsIHIweDAwMTRmZmZiLCBBY2MwICAgICAgOy8vIEFjYzAgKz0gWzAgZyAwIGVdICogWzAgMCAwIC01XQotICAgICAgICBTTUxBVEIgICAgICBBY2MxLCBWYWxDQSwgcjB4MDAxNGZmZmIsIEFjYzEgICAgICA7Ly8gQWNjMSArPSBbMCBkIDAgYl0gKiBbMCAwIDAgLTVdCi0gICAgICAgIFNNTEFUQiAgICAgIEFjYzIsIFZhbENBLCByMHgwMDE0MDAwMSwgQWNjMiAgICAgIDsvLyBBY2MyICs9IFswIGMgMCBhXSAqIFswIDAgMCAxXQotICAgICAgICBTTUxBVEIgICAgICBBY2MzLCBWYWxEQiwgcjB4MDAxNDAwMDEsIEFjYzMgICAgICA7Ly8gQWNjMyArPSBbMCBjIDAgYV0gKiBbMCAwIDAgMV0KLQotICAgICAgICBMRFJIICAgICAgICBWYWxDQSwgW3BTcmNdLCAjOCAgICAgICAgICAgICAgICAgICA7Ly8gOCA9IHNyY1N0ZXAgLSAxNgotICAgICAgICBTTUxBQkIgICAgICBBY2MwLCBWYWxIRiwgcjB4MDAxNDAwMDEsIEFjYzAgICAgICA7Ly8gQWNjMCArPSBbMCBoIDAgZl0gKiBbMCAwIDAgMV0gICAgICAgIAotICAgICAgICBTTUxBQkIgICAgICBBY2MxLCBWYWxIRiwgcjB4MDAxNGZmZmIsIEFjYzEgICAgICA7Ly8gQWNjMSArPSBbMCBoIDAgZl0gKiBbMCAwIDAgLTVdCi0gICAgICAgIFNNTEFUQiAgICAgIEFjYzIsIFZhbERCLCByMHgwMDE0ZmZmYiwgQWNjMiAgICAgIDsvLyBBY2MyICs9IFswIGQgMCBiXSAqIFswIDAgMCAtNV0gICAgICAgIAotICAgICAgICBTTUxBQkIgICAgICBBY2MzLCBWYWxDQSwgcjB4MDAxNDAwMDEsIEFjYzMgICAgICA7Ly8gQWNjMyArPSBbMCBkIDAgYl0gKiBbMCAwIDAgMV0KLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgIHIweDAwMDFmYzAwLCA9MHgwMDAxZmMwMCAgICAgICAgICAgIDsvLyAoMHhmZiAqIDE2ICogMzIpIC0gNTEyCi0gICAgICAgIFNVQiAgICAgICAgIEFjYzAsIEFjYzAsIHIweDAwMDFmYzAwICAgICAgICAKLSAgICAgICAgU1VCICAgICAgICAgQWNjMSwgQWNjMSwgcjB4MDAwMWZjMDAgICAgICAgIAotICAgICAgICBTVUIgICAgICAgICBBY2MyLCBBY2MyLCByMHgwMDAxZmMwMCAgICAgICAgCi0gICAgICAgIFNVQiAgICAgICAgIEFjYzMsIEFjYzMsIHIweDAwMDFmYzAwICAgICAgICAKLQotICAgICAgICBVU0FUICAgICAgICBBY2MwLCAjMTgsIEFjYzAKLSAgICAgICAgVVNBVCAgICAgICAgQWNjMSwgIzE4LCBBY2MxCi0gICAgICAgIFVTQVQgICAgICAgIEFjYzIsICMxOCwgQWNjMgotICAgICAgICBVU0FUICAgICAgICBBY2MzLCAjMTgsIEFjYzMKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgICAgIEFjYzAsIEFjYzAsIExTUiAjMTAKLSAgICAgICAgTU9WICAgICAgICAgQWNjMSwgQWNjMSwgTFNSICMxMAotICAgICAgICBNT1YgICAgICAgICBBY2MyLCBBY2MyLCBMU1IgIzEwCi0gICAgICAgIE1PViAgICAgICAgIEFjYzMsIEFjYzMsIExTUiAjMTAKLQotICAgICAgICBNX0xEUiAgICAgICBDb3VudGVyLCBwQ291bnRlciAgICAgICAgCi0gICAgICAgIE9SUiAgICAgICAgIEFjYzAsIEFjYzAsIEFjYzEsIExTTCAjOAotICAgICAgICBPUlIgICAgICAgICBBY2MyLCBBY2MyLCBBY2MzLCBMU0wgIzgKLSAgICAgICAgU1VCUyAgICAgICAgQ291bnRlciwgQ291bnRlciwgIzEKLSAgICAgICAgT1JSICAgICAgICAgQWNjMCwgQWNjMCwgQWNjMiwgTFNMICMxNgotICAgICAgICBNX1NUUiAgICAgICBBY2MwLCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgQkdUICAgICAgICAgSGVpZ2h0TG9vcDEKLUVuZAotICAgICAgICBTVUIgICAgICAgICBwRHN0LCBwRHN0LCBkc3RTdGVwLCBMU0wgIzIKLSAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMyCi0KLSAgICAgICAgTV9FTkQKLSAgICAKLSAgICBFTkRJRgotICAgIAotICAgIEVORAotICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFhZjc1YS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlX3MucworKysgL2Rldi9udWxsCkBAIC0xLDI1MyArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmVfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgOTY0MQotOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0KLSAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLSAgICAgICAgCi0gICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZQotCi1ERUJVR19PTiAgICBTRVRMIHtGQUxTRX0KLQotCi0gICAgSUYgQVJNMTEzNkpTCi0KLTsvLyBGdW5jdGlvbjogCi07Ly8gICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCi07Ly8KLTsvLyBJbXBsZW1lbnRzIGhvcml6b250YWwgaW50ZXJwb2xhdGlvbiBmb3IgYSBibG9jayBvZiBzaXplIDR4NC4gSW5wdXQgYW5kIG91dHB1dCBzaG91bGQgCi07Ly8gYmUgYWxpZ25lZC4gCi07Ly8KLTsvLyBSZWdpc3RlcnMgdXNlZCBhcyBpbnB1dCBmb3IgdGhpcyBmdW5jdGlvbgotOy8vIHIwLHIxLHIyLHIzIHdoZXJlIHIwLHIyICBpbnB1dCBwb2ludGVyIGFuZCByMSxyMyBjb3JyZXNwb25kaW5nIHN0ZXAgc2l6ZQotOy8vCi07Ly8gUmVnaXN0ZXJzIHByZXNlcnZlZCBmb3IgdG9wIGxldmVsIGZ1bmN0aW9uCi07Ly8gcjAscjEscjIscjMscjQscjUscjYscjE0Ci07Ly8KLTsvLyBSZWdpc3RlcnMgbW9kaWZpZWQgYnkgdGhlIGZ1bmN0aW9uCi07Ly8gcjcscjgscjkscjEwLHIxMSxyMTIKLTsvLwotOy8vIE91dHB1dCByZWdpc3RlcnMKLTsvLyBOb25lLiBGdW5jdGlvbiB3aWxsIHByZXNlcnZlIHIwLXIzCi0KLQotOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCi1wU3JjICAgICAgICAgICAgUk4gMAotc3JjU3RlcCAgICAgICAgIFJOIDEKLXBEc3QgICAgICAgICAgICBSTiAyCi1kc3RTdGVwICAgICAgICAgUk4gMwotCi07Ly8gRGVjbGFyZSBpbm5lciBsb29wIHJlZ2lzdGVycwotQWNjMCAgICAgICAgICAgIFJOIDQKLUFjYzEgICAgICAgICAgICBSTiA1Ci1BY2MyICAgICAgICAgICAgUk4gNgotQWNjMyAgICAgICAgICAgIFJOIDcKLQotVmFsQSAgICAgICAgICAgIFJOIDQKLVZhbEIgICAgICAgICAgICBSTiA1Ci1WYWxDICAgICAgICAgICAgUk4gNgotVmFsRCAgICAgICAgICAgIFJOIDcKLVZhbEUgICAgICAgICAgICBSTiA4Ci1WYWxGICAgICAgICAgICAgUk4gOQotVmFsRyAgICAgICAgICAgIFJOIDEyCi1WYWxIICAgICAgICAgICAgUk4gMTQKLVZhbEkgICAgICAgICAgICBSTiAxCi0KLVRlbXAxICAgICAgICAgICBSTiAzCi1UZW1wMiAgICAgICAgICAgUk4gMQotVGVtcDMgICAgICAgICAgIFJOIDEyCi1UZW1wNCAgICAgICAgICAgUk4gNwotVGVtcDUgICAgICAgICAgIFJOIDUKLXIweDBmZTAwZmUwICAgICBSTiAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFswICgxNioyNTUgLSAxNikgMCAoMTYqMjU1IC0gMTYpXQotcjB4MDBmZjAwZmYgICAgIFJOIDEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gWzAgMjU1IDAgMjU1XSB3aGVyZSAyNTUgaXMgb2Zmc2V0Ci1Db3VudGVyICAgICAgICAgUk4gMTEKLQotSGVpZ2h0ICAgICAgICAgIFJOIDMKLQotICAgICAgICBNX0FMTE9DNCBwRHN0U3RlcCwgNAotICAgICAgICBNX0FMTE9DNCBwU3JjU3RlcCwgNAotCi0gICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZSwgcjYKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgQ291bnRlciwgIzIKLSAgICAgICAgTV9TVFIgICBkc3RTdGVwLCBwRHN0U3RlcCAgICAgICAgCi0gICAgICAgIE1fU1RSICAgc3JjU3RlcCwgcFNyY1N0ZXAgICAgICAgIAotICAgICAgICBMRFIgICAgIHIweDAwZmYwMGZmLCA9MHgwMGZmMDBmZiAgICAgICAgICAgICAgIDsvLyBbMCAyNTUgMCAyNTVdIDI1NSBpcyBvZmZzZXQgdG8gYXZvaWQgbmVnYXRpdmUgcmVzdWx0cyAKLQotTmV4dFR3b1Jvd3NMb29wCi0gICAgICAgIExEUiAgICAgVmFsRCwgW3BTcmMsIHNyY1N0ZXBdICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIHJvdyAxIFtkMSBjMSBiMSBhMV0KLSAgICAgICAgTERSICAgICBWYWxBLCBbcFNyY10sICM0ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgcm93IDAgW2QwIGMwIGIwIGEwXQotICAgICAgICBMRFIgICAgIFZhbEgsIFtwU3JjLCBzcmNTdGVwXSAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgW2gxIGcxIGYxIGUxXSAgICAgICAgCi0gICAgICAgIExEUiAgICAgVmFsRSwgW3BTcmNdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkICBbaDAgZzAgZjAgZTBdCi0gICAgICAgIExEUkIgICAgVGVtcDIsIFtwU3JjLCBzcmNTdGVwXSAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIHJvdyAxIFtsMSBrMSBqMSBpMV0KLSAgICAgICAgTERSQiAgICBUZW1wMSwgW3BTcmNdLCAjLTggICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgcm93IDAgW2wwIGswIGowIGkwXQotICAgICAgICAKLSAgICAgICAgUEtIQlQgICBWYWxCLCBWYWxBLCBWYWxELCBMU0wgIzE2ICAgICAgICAgICAgICAgOy8vIFtiMSBhMSBiMCBhMF0KLSAgICAgICAgUEtIVEIgICBWYWxELCBWYWxELCBWYWxBLCBBU1IgIzE2ICAgICAgICAgICAgICAgOy8vIFtkMSBjMSBkMCBjMF0KLSAgICAgICAgVVhUQUIxNiBWYWxBLCByMHgwMGZmMDBmZiwgVmFsQiAgICAgICAgICAgICAgICAgOy8vIFswMCBhMSAwMCBhMF0gKyBbMCAyNTUgMCAyNTVdCi0gICAgICAgIFVYVEFCMTYgVmFsQywgcjB4MDBmZjAwZmYsIFZhbEQgICAgICAgICAgICAgICAgIDsvLyBbMDAgYzEgMDAgYzBdICsgWzAgMjU1IDAgMjU1XQotICAgICAgICBQS0hCVCAgIFZhbEksIFRlbXAxLCBUZW1wMiwgTFNMICMxNiAgICAgICAgICAgICA7Ly8gWzAwIGkxIDAwIGkwXSAgICAgICAgICAgIAotICAgICAgICBQS0hCVCAgIFZhbEYsIFZhbEUsIFZhbEgsIExTTCAjMTYgICAgICAgICAgICAgICA7Ly8gW2YxIGUxIGYwIGUwXQotICAgICAgICBQS0hUQiAgIFZhbEgsIFZhbEgsIFZhbEUsIEFTUiAjMTYgICAgICAgICAgICAgICA7Ly8gW2gxIGcxIGgwIGcwXQotICAgICAgICBVWFRBQjE2IFZhbEUsIHIweDAwZmYwMGZmLCBWYWxGICAgICAgICAgICAgICAgICA7Ly8gWzAwIGUxIDAwIGUwXSArIFswIDI1NSAwIDI1NV0KLQotICAgICAgICA7Ly8gQ2FsY3VsYXRlIEFjYzAKLSAgICAgICAgOy8vIEFjYzAgPSBhIC0gNSpiICsgMjAqYyArIDIwKmQgLSA1KmUgKyBmCi0gICAgICAgIFVYVEFCMTYgVGVtcDEsIFZhbEMsIFZhbEQsIFJPUiAjOAotICAgICAgICBVWFRBQjE2IFRlbXAzLCBWYWxFLCBWYWxCLCBST1IgIzgKLSAgICAgICAgUlNCICAgICBUZW1wMSwgVGVtcDMsIFRlbXAxLCBMU0wgIzIgICAgICAgICAgICAgICAgCi0gICAgICAgIFVYVEFCMTYgQWNjMCwgVmFsQSwgVmFsRiwgUk9SICM4Ci0gICAgICAgIEFERCAgICAgVGVtcDEsIFRlbXAxLCBUZW1wMSwgTFNMICMyICAgICAgICAKLSAgICAgICAgQUREICAgICBBY2MwLCBBY2MwLCBUZW1wMSAgICAgICAKLQotICAgICAgICA7Ly8gQ2FsY3VsYXRlIEFjYzEKLSAgICAgICAgOy8vIEFjYzEgPSBiIC0gNSpjICsgMjAqZCArIDIwKmUgLSA1KmYgKyBnCi0gICAgICAgIFVYVEFCMTYgVGVtcDEsIFZhbEUsIFZhbEQsIFJPUiAjOAotICAgICAgICBVWFRBQjE2IFRlbXAzLCBWYWxDLCBWYWxGLCBST1IgIzgKLSAgICAgICAgUlNCICAgICBUZW1wMSwgVGVtcDMsIFRlbXAxLCBMU0wgIzIgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgVVhUQUIxNiBWYWxHLCByMHgwMGZmMDBmZiwgVmFsSCAgICAgICAgICAgICAgICAgOy8vIFswMCBnMSAwMCBnMF0gKyBbMCAyNTUgMCAyNTVdCi0gICAgICAgIEFERCAgICAgVGVtcDEsIFRlbXAxLCBUZW1wMSwgTFNMICMyICAgICAgICAKLSAgICAgICAgVVhUQUIxNiBBY2MxLCBWYWxHLCBWYWxCLCBST1IgIzgKLSAgICAgICAgQUREICAgICBBY2MxLCBBY2MxLCBUZW1wMSAgICAgICAgCi0KLSAgICAgICAgTERSICAgICByMHgwZmUwMGZlMCwgPTB4MGZlMDBmZTAgICAgICAgICAgICAgICAgOy8vIDB4MGZlMDBmZTAgPSAoMTYgKiBPZmZzZXQpIC0gMTYgd2hlcmUgT2Zmc2V0IGlzIDI1NSAgICAgICAgCi0gICAgICAgIFVYVEFCMTYgQWNjMiwgVmFsQywgVmFsSCwgUk9SICM4ICAgICAgICAKLSAgICAgICAgQUREICAgICBWYWxJLCByMHgwMGZmMDBmZiwgVmFsSSAgICAgICAgICAgICAgICAgOy8vIFswMCBpMSAwMCBpMF0gKyBbMCAyNTUgMCAyNTVdICAgICAgICAKLSAgICAgICAgVVFTVUIxNiBBY2MwLCBBY2MwLCByMHgwZmUwMGZlMCAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFVRU1VCMTYgQWNjMSwgQWNjMSwgcjB4MGZlMDBmZTAKLSAgICAgICAgVVNBVDE2ICBBY2MwLCAjMTMsIEFjYzAKLSAgICAgICAgVVNBVDE2ICBBY2MxLCAjMTMsIEFjYzEgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIENhbGN1bGF0ZSBBY2MyCi0gICAgICAgIDsvLyBBY2MyID0gYyAtIDUqZCArIDIwKmUgKyAyMCpmIC0gNSpnICsgaAotICAgICAgICBVWFRBQjE2IFRlbXAxLCBWYWxHLCBWYWxELCBST1IgIzgKLSAgICAgICAgVVhUQUIxNiBBY2MzLCBWYWxJLCBWYWxELCBST1IgIzgKLSAgICAgICAgVVhUQUIxNiBUZW1wMiwgVmFsRSwgVmFsRiwgUk9SICM4Ci0gICAgICAgIEFORCAgICAgQWNjMSwgcjB4MDBmZjAwZmYsIEFjYzEsIExTUiAjNQotICAgICAgICBBTkQgICAgIEFjYzAsIHIweDAwZmYwMGZmLCBBY2MwLCBMU1IgIzUKLSAgICAgICAgT1JSICAgICBBY2MwLCBBY2MwLCBBY2MxLCBMU0wgIzggICAgICAgIAotICAgICAgICBSU0IgICAgIFRlbXA1LCBUZW1wMSwgVGVtcDIsIExTTCAjMiAgICAgICAgCi0gICAgICAgIFVYVEFCMTYgVGVtcDIsIFZhbEcsIFZhbEYsIFJPUiAjOAotICAgICAgICBBREQgICAgIFRlbXA1LCBUZW1wNSwgVGVtcDUsIExTTCAjMiAgICAgICAgCi0gICAgICAgIEFERCAgICAgQWNjMiwgQWNjMiwgVGVtcDUgICAgICAgIAotCi0gICAgICAgIDsvLyBDYWxjdWxhdGUgQWNjMwotICAgICAgICA7Ly8gQWNjMyA9IGQgLSA1KmUgKyAyMCpmICsgMjAqZyAtIDUqaCArIGkKLSAgICAgICAgVVhUQUIxNiBUZW1wNSwgVmFsRSwgVmFsSCwgUk9SICM4Ci0gICAgICAgIFJTQiAgICAgVGVtcDUsIFRlbXA1LCBUZW1wMiwgTFNMICMyCi0gICAgICAgIExEUiAgICAgcjB4MGZlMDBmZTAsID0weDBmZTAwZmUwCi0gICAgICAgIEFERCAgICAgVGVtcDUsIFRlbXA1LCBUZW1wNSwgTFNMICMyICAgICAgICAKLSAgICAgICAgQUREICAgICBBY2MzLCBBY2MzLCBUZW1wNQotICAgICAgICAKLSAgICAgICAgVVFTVUIxNiBBY2MzLCBBY2MzLCByMHgwZmUwMGZlMCAgICAgICAgCi0gICAgICAgIFVRU1VCMTYgQWNjMiwgQWNjMiwgcjB4MGZlMDBmZTAgICAgICAgIAotICAgICAgICBVU0FUMTYgIEFjYzMsICMxMywgQWNjMwotICAgICAgICBVU0FUMTYgIEFjYzIsICMxMywgQWNjMiAgICAgICAgCi0KLSAgICAgICAgTV9MRFIgICBkc3RTdGVwLCBwRHN0U3RlcAotICAgICAgICBBTkQgICAgIEFjYzMsIHIweDAwZmYwMGZmLCBBY2MzLCBMU1IgIzUKLSAgICAgICAgQU5EICAgICBBY2MyLCByMHgwMGZmMDBmZiwgQWNjMiwgTFNSICM1Ci0gICAgICAgIE9SUiAgICAgQWNjMiwgQWNjMiwgQWNjMywgTFNMICM4Ci0gICAgICAgIAotICAgICAgICBTVUJTICAgIENvdW50ZXIsIENvdW50ZXIsICMxCi0gICAgICAgIE1fTERSICAgc3JjU3RlcCwgcFNyY1N0ZXAKLSAgICAgICAgUEtIQlQgICBBY2MxLCBBY2MwLCBBY2MyLCBMU0wgIzE2ICAgCi0gICAgICAgIE1fU1RSICAgQWNjMSwgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSByZXN1bHQxCi0gICAgICAgIFBLSFRCICAgQWNjMiwgQWNjMiwgQWNjMCwgQVNSICMxNiAgIAotICAgICAgICBNX1NUUiAgIEFjYzIsIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgcmVzdWx0MgotICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQotICAgICAgICAKLSAgICAgICAgQkdUICAgICBOZXh0VHdvUm93c0xvb3AKLUVuZAotICAgICAgICBTVUIgICAgIHBEc3QsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMgotICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMgotCi0gICAgICAgIE1fRU5ECi0gICAgCi0gICAgRU5ESUYKLQotICAgIEVORAotICAgIAotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmVfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDZjYmYzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmVfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZV9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICA5NjQxCi07Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgICAKLSAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLSAgICAgICAKLSAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCi0KLQotICAgIAotICAgIElGIEFSTTExMzZKUwotICAgIAotICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCi0KLSAgICAgICAgOy8vIEZ1bmN0aW9uOiAKLSAgICAgICAgOy8vICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZSAgCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW1wbGVtZW50cyB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uIGZvciBhIGJsb2NrIG9mIHNpemUgNHg0LiBJbnB1dCBhbmQgb3V0cHV0IHNob3VsZCAKLSAgICAgICAgOy8vIGJlIGFsaWduZWQuIAotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIFJlZ2lzdGVycyB1c2VkIGFzIGlucHV0IGZvciB0aGlzIGZ1bmN0aW9uCi0gICAgICAgIDsvLyByMCxyMSxyMixyMyB3aGVyZSByMCxyMiAgaW5wdXQgcG9pbnRlciBhbmQgcjEscjMgY29ycmVzcG9uZGluZyBzdGVwIHNpemUKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBSZWdpc3RlcnMgcHJlc2VydmVkIGZvciB0b3AgbGV2ZWwgZnVuY3Rpb24KLSAgICAgICAgOy8vIHIwLHIxLHIyLHIzLHI0LHI1LHI2LHIxNAotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIFJlZ2lzdGVycyBtb2RpZmllZCBieSB0aGUgZnVuY3Rpb24KLSAgICAgICAgOy8vIHI3LHI4LHI5LHIxMCxyMTEscjEyCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gT3V0cHV0IHJlZ2lzdGVycwotICAgICAgICA7Ly8gTm9uZS4gRnVuY3Rpb24gd2lsbCBwcmVzZXJ2ZSByMC1yMwotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlLCByNgotCi07Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKLXBTcmMgICAgICAgICAgICBSTiAwCi1zcmNTdGVwICAgICAgICAgUk4gMQotcERzdCAgICAgICAgICAgIFJOIDIKLWRzdFN0ZXAgICAgICAgICBSTiAzCi0KLTsvLyBEZWNsYXJlIGlubmVyIGxvb3AgcmVnaXN0ZXJzCi1WYWxBICAgICAgICAgICAgUk4gNQotVmFsQTAgICAgICAgICAgIFJOIDQKLVZhbEExICAgICAgICAgICBSTiA1Ci1WYWxBRjAgICAgICAgICAgUk4gNAotVmFsQUYxICAgICAgICAgIFJOIDUKLQotVmFsQiAgICAgICAgICAgIFJOIDExCi0KLVZhbEMgICAgICAgICAgICBSTiA1Ci1WYWxDMCAgICAgICAgICAgUk4gNAotVmFsQzEgICAgICAgICAgIFJOIDUKLVZhbENEMCAgICAgICAgICBSTiAxMgotVmFsQ0QxICAgICAgICAgIFJOIDE0Ci1WYWxDRjAgICAgICAgICAgUk4gNAotVmFsQ0YxICAgICAgICAgIFJOIDUKLQotVmFsRCAgICAgICAgICAgIFJOIDEwCi0KLVZhbEUgICAgICAgICAgICBSTiA3Ci1WYWxFMCAgICAgICAgICAgUk4gNgotVmFsRTEgICAgICAgICAgIFJOIDcKLVZhbEVCMCAgICAgICAgICBSTiAxMAotVmFsRUIxICAgICAgICAgIFJOIDExCi1WYWxFRDAgICAgICAgICAgUk4gNgotVmFsRUQxICAgICAgICAgIFJOIDcKLQotVmFsRiAgICAgICAgICAgIFJOIDEwCi0KLVZhbEcgICAgICAgICAgICBSTiAxNAotVmFsRzAgICAgICAgICAgIFJOIDEyCi1WYWxHMSAgICAgICAgICAgUk4gMTQKLVZhbEdCMCAgICAgICAgICBSTiAxMgotVmFsR0IxICAgICAgICAgIFJOIDE0Ci0KLUFjYzAgICAgICAgICAgICBSTiA0Ci1BY2MxICAgICAgICAgICAgUk4gNQotQWNjMiAgICAgICAgICAgIFJOIDYKLUFjYzMgICAgICAgICAgICBSTiA3Ci0KLVRlbXAgICAgICAgICAgICBSTiA3Ci1IZWlnaHQgICAgICAgICAgUk4gMwotU3RlcCAgICAgICAgICAgIFJOIDYKLQotQ291bnRlciAgICAgICAgIFJOIDgKLXIweDAwZmYwMGZmICAgICBSTiA5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBbMCAyNTUgMCAyNTVdIHdoZXJlIDI1NSBpcyBvZmZzZXQKLXIweDBmZTAwZmUwICAgICBSTiAxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBbMCAoMTYqMjU1IC0gMTYpIDAgKDE2KjI1NSAtIDE2KV0KLQotICAgICAgICAKLSAgICAgICAgTERSICAgICAgICAgcjB4MDBmZjAwZmYsID0weDAwZmYwMGZmICAgICAgICAgICAgICAgIDsvLyBbMCAyNTUgMCAyNTVdIDI1NSBpcyBvZmZzZXQgdG8gYXZvaWQgbmVnYXRpdmUgcmVzdWx0cyAKLSAgICAgICAgTU9WICAgICAgICAgQ291bnRlciwgIzIKLSAgICAgICAgCi1Ud29Sb3dzTG9vcAotICAgICAgICBNX0xEUiAgICAgICBWYWxDLCBbcFNyY10sIHNyY1N0ZXAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgIFtjMyBjMiBjMSBjMF0KLSAgICAgICAgTV9MRFIgICAgICAgVmFsRCwgW3BTcmNdLCBzcmNTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkICBbZDMgZDIgZDEgZDBdCi0gICAgICAgIE1fTERSICAgICAgIFZhbEUsIFtwU3JjXSwgc3JjU3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgW2UzIGUyIGUxIGUwXSAgICAgICAgCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMiAgICAgICAgICAgICAgICAKLSAgICAgICAgTERSICAgICAgICAgVmFsQiwgW3BTcmNdICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkICBbYjMgYjIgYjEgYjBdICAgICAgICAKLSAgICAgICAgVVhUQUIxNiAgICAgVmFsQzAsIHIweDAwZmYwMGZmLCBWYWxDICAgICAgICAgICAgICAgIDsvLyBbMCBjMiAwIGMwXSArIFswIDI1NSAwIDI1NV0KLSAgICAgICAgVVhUQUIxNiAgICAgVmFsQzEsIHIweDAwZmYwMGZmLCBWYWxDLCBST1IgIzggICAgICAgIDsvLyBbMCBjMyAwIGMxXSArIFswIDI1NSAwIDI1NV0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgVVhUQUIxNiAgICAgVmFsRTAsIHIweDAwZmYwMGZmLCBWYWxFICAgICAgICAgICAgICAgIDsvLyBbMCBlMiAwIGUwXSArIFswIDI1NSAwIDI1NV0KLSAgICAgICAgVVhUQUIxNiAgICAgVmFsRTEsIHIweDAwZmYwMGZmLCBWYWxFLCBST1IgIzggICAgICAgIDsvLyBbMCBlMyAwIGUxXSArIFswIDI1NSAwIDI1NV0gICAgICAgIAotICAgICAgICBVWFRBQjE2ICAgICBWYWxDRDAsIFZhbEMwLCBWYWxEICAgICAgICAgICAgICAgICAgICAgOy8vIFswIGMyIDAgYzBdICsgWzAgMjU1IDAgMjU1XSArIFswIGQyIDAgZDBdCi0gICAgICAgIFVYVEFCMTYgICAgIFZhbENEMSwgVmFsQzEsIFZhbEQsIFJPUiAjOCAgICAgICAgICAgICA7Ly8gWzAgYzMgMCBjMV0gKyBbMCAyNTUgMCAyNTVdICsgWzAgZDMgMCBkMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBVWFRBQjE2ICAgICBWYWxFQjAsIFZhbEUwLCBWYWxCICAgICAgICAgICAgICAgICAgICAgOy8vIFswIGUyIDAgZTBdICsgWzAgMjU1IDAgMjU1XSArIFswIGIyIDAgYjBdCi0gICAgICAgIFJTQiAgICAgICAgIFZhbENEMCwgVmFsRUIwLCBWYWxDRDAsIExTTCAjMiAgICAgICAgICA7Ly8gNCooT2ZmK0MrRCkgLSAoT2ZmK0IrRSkKLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgIFZhbEQsIFtwU3JjLCBzcmNTdGVwLCBMU0wgIzFdICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgW2QzIGQyIGQxIGQwXQotICAgICAgICBVWFRBQjE2ICAgICBWYWxFQjEsIFZhbEUxLCBWYWxCLCBST1IgIzggICAgICAgICAgICAgOy8vIFswIGUzIDAgZTFdICsgWzAgMjU1IDAgMjU1XSArIFswIGIzIDAgYjFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgUlNCICAgICAgICAgVmFsQ0QxLCBWYWxFQjEsIFZhbENEMSwgTFNMICMyICAgICAgICAgICAgICAgIAotICAgICAgICA7Ly8gT25lIGN5Y2xlIHN0YWxsCi0gICAgICAgIFVYVEFCMTYgICAgIFZhbEVEMCwgVmFsRTAsIFZhbEQgICAgICAgICAgICAgICAgICAgICA7Ly8gWzAgZTIgMCBlMF0gKyBbMCAyNTUgMCAyNTVdICsgWzAgZDIgMCBkMF0KLSAgICAgICAgVVhUQUIxNiAgICAgVmFsRUQxLCBWYWxFMSwgVmFsRCwgUk9SICM4ICAgICAgICAgICAgIDsvLyBbMCBlMyAwIGUxXSArIFswIDI1NSAwIDI1NV0gKyBbMCBkMyAwIGQxXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICBMRFIgICAgICAgICBWYWxGLCBbcFNyYywgc3JjU3RlcCwgTFNMICMyXSAgICAgICAgICAgOy8vIExvYWQgIFtmMyBmMiBmMSBmMF0KLSAgICAgICAgTV9MRFIgICAgICAgVmFsQiwgW3BTcmNdLCBzcmNTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkICBbYjMgYjIgYjEgYjBdICAgICAgICAgICAgICAgIAotICAgICAgICBBREQgICAgICAgICBWYWxDRDAsIFZhbENEMCwgVmFsQ0QwLCBMU0wgIzIgICAgICAgICAgOy8vIDUgKiBbNCooT2ZmK0MrRCkgLSAoT2ZmK0IrRSldCi0gICAgICAgIEFERCAgICAgICAgIFZhbENEMSwgVmFsQ0QxLCBWYWxDRDEsIExTTCAjMiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFVYVEFCMTYgICAgIFZhbENGMSwgVmFsQzEsIFZhbEYsIFJPUiAjOCAgICAgICAgICAgICA7Ly8gWzAgYzMgMCBjMV0gKyBbMCAyNTUgMCAyNTVdICsgWzAgZjMgMCBmMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBVWFRBQjE2ICAgICBWYWxDRjAsIFZhbEMwLCBWYWxGICAgICAgICAgICAgICAgICAgICAgOy8vIFswIGMyIDAgYzBdICsgWzAgMjU1IDAgMjU1XSArIFswIGYyIDAgZjBdCi0gICAgICAgIFJTQiAgICAgICAgIFZhbEVEMSwgVmFsQ0YxLCBWYWxFRDEsIExTTCAjMiAgICAgICAgCi0gICAgICAgIAotICAgICAgICBTVUIgICAgICAgICBWYWxBLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKLSAgICAgICAgTERSICAgICAgICAgVmFsQSwgW1ZhbEFdICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkICBbYTMgYTIgYTEgYTBdCi0gICAgICAgIFJTQiAgICAgICAgIFZhbEVEMCwgVmFsQ0YwLCBWYWxFRDAsIExTTCAjMiAgICAgICAgICA7Ly8gNCooT2ZmK0UrRCkgLSAoT2ZmK0MrRikgICAgICAgIAotICAgICAgICBBREQgICAgICAgICBWYWxFRDEsIFZhbEVEMSwgVmFsRUQxLCBMU0wgIzIgICAgICAgICAgCi0gICAgICAgIEFERCAgICAgICAgIFZhbEVEMCwgVmFsRUQwLCBWYWxFRDAsIExTTCAjMiAgICAgICAgICA7Ly8gNSAqIFs0KihPZmYrRStEKSAtIChPZmYrQytGKV0KLSAgICAgICAgVVhUQUIxNiAgICAgVmFsQTAsIHIweDAwZmYwMGZmLCBWYWxBICAgICAgICAgICAgICAgIDsvLyBbMCBhMiAwIGEwXSArIFswIDI1NSAwIDI1NV0KLSAgICAgICAgVVhUQUIxNiAgICAgVmFsQTEsIHIweDAwZmYwMGZmLCBWYWxBLCBST1IgIzggICAgICAgIDsvLyBbMCBhMyAwIGExXSArIFswIDI1NSAwIDI1NV0KLSAgICAgICAgVVhUQUIxNiAgICAgVmFsQUYwLCBWYWxBMCwgVmFsRiAgICAgICAgICAgICAgICAgICAgIDsvLyBbMCBhMiAwIGEwXSArIFswIDI1NSAwIDI1NV0gKyBbMCBmMiAwIGYwXQotICAgICAgICBVWFRBQjE2ICAgICBWYWxBRjEsIFZhbEExLCBWYWxGLCBST1IgIzggICAgICAgICAgICAgOy8vIFswIGEzIDAgYTFdICsgWzAgMjU1IDAgMjU1XSArIFswIGYzIDAgZjFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgIHIweDBmZTAwZmUwLCA9MHgwZmUwMGZlMCAgICAgICAgICAgICAgICA7Ly8gWzAgMjU1IDAgMjU1XSAyNTUgaXMgb2Zmc2V0IHRvIGF2b2lkIG5lZ2F0aXZlIHJlc3VsdHMgCi0gICAgICAgIEFERCAgICAgICAgIEFjYzEsIFZhbENEMSwgVmFsQUYxICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgIFZhbEcsIFtwU3JjLCBzcmNTdGVwLCBMU0wgIzJdICAgICAgICAgICA7Ly8gTG9hZCAgW2czIGcyIGcxIGcwXQotICAgICAgICBBREQgICAgICAgICBBY2MwLCBWYWxDRDAsIFZhbEFGMCAgICAgICAgICAgICAgICAgICAgOy8vIEFjYzAgPSAxNipPZmYgKyAoQStGKSArIDIwKihDK0QpIC0gNSooQitFKSAgICAgICAgCi0gICAgICAgIFVRU1VCMTYgICAgIEFjYzEsIEFjYzEsIHIweDBmZTAwZmUwICAgICAgICAgICAgICAgICA7Ly8gQWNjMSAtPSAoMTYqT2ZmIC0gMTYpCi0gICAgICAgIFVRU1VCMTYgICAgIEFjYzAsIEFjYzAsIHIweDBmZTAwZmUwICAgICAgICAKLSAgICAgICAgVVhUQUIxNiAgICAgVmFsRzAsIHIweDAwZmYwMGZmLCBWYWxHICAgICAgICAgICAgICAgIDsvLyBbMCBnMiAwIGcwXSArIFswIDI1NSAwIDI1NV0KLSAgICAgICAgVVhUQUIxNiAgICAgVmFsRzEsIHIweDAwZmYwMGZmLCBWYWxHLCBST1IgIzggICAgICAgIDsvLyBbMCBnMyAwIGcxXSArIFswIDI1NSAwIDI1NV0KLSAgICAgICAgVVhUQUIxNiAgICAgVmFsR0IwLCBWYWxHMCwgVmFsQiAgICAgICAgICAgICAgICAgICAgIDsvLyBbMCBnMiAwIGcwXSArIFswIDI1NSAwIDI1NV0gKyBbMCBiMiAwIGIwXQotICAgICAgICBVWFRBQjE2ICAgICBWYWxHQjEsIFZhbEcxLCBWYWxCLCBST1IgIzggICAgICAgICAgICAgOy8vIFswIGczIDAgZzFdICsgWzAgMjU1IDAgMjU1XSArIFswIGIzIDAgYjFdICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIEFERCAgICAgICAgIEFjYzIsIFZhbEVEMCwgVmFsR0IwICAgICAgICAgICAgICAgICAgICA7Ly8gQWNjMiA9IDE2Kk9mZiArIChCK0cpICsgMjAqKEQrRSkgLSA1KihDK0YpCi0gICAgICAgIEFERCAgICAgICAgIEFjYzMsIFZhbEVEMSwgVmFsR0IxICAgICAgICAKLSAgICAgICAgVVFTVUIxNiAgICAgQWNjMywgQWNjMywgcjB4MGZlMDBmZTAgICAgICAgICAgICAgICAgIDsvLyBBY2MzIC09ICgxNipPZmYgLSAxNikKLSAgICAgICAgVVFTVUIxNiAgICAgQWNjMiwgQWNjMiwgcjB4MGZlMDBmZTAgICAgICAgIAotICAgICAgICBVU0FUMTYgICAgICBBY2MxLCAjMTMsIEFjYzEgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNhdHVyYXRlIHRvIDgrNSA9IDEzIGJpdHMKLSAgICAgICAgVVNBVDE2ICAgICAgQWNjMCwgIzEzLCBBY2MwCi0gICAgICAgIFVTQVQxNiAgICAgIEFjYzMsICMxMywgQWNjMyAgICAgICAgCi0gICAgICAgIFVTQVQxNiAgICAgIEFjYzIsICMxMywgQWNjMgotICAgICAgICBBTkQgICAgICAgICBBY2MxLCByMHgwMGZmMDBmZiwgQWNjMSwgTFNSICM1ICAgICAgICAgOy8vIFswIGEzIDAgYTFdCi0gICAgICAgIEFORCAgICAgICAgIEFjYzAsIHIweDAwZmYwMGZmLCBBY2MwLCBMU1IgIzUgICAgICAgICA7Ly8gWzAgYTIgMCBhMF0KLSAgICAgICAgT1JSICAgICAgICAgQWNjMCwgQWNjMCwgQWNjMSwgTFNMICM4ICAgICAgICAgICAgICAgIDsvLyBbYTMgYTIgYTEgYTBdCi0gICAgICAgIEFORCAgICAgICAgIEFjYzMsIHIweDAwZmYwMGZmLCBBY2MzLCBMU1IgIzUgICAgICAgICA7Ly8gWzAgYjMgMCBiMV0KLSAgICAgICAgQU5EICAgICAgICAgQWNjMiwgcjB4MDBmZjAwZmYsIEFjYzIsIExTUiAjNSAgICAgICAgIDsvLyBbMCBiMiAwIGIwXQotICAgICAgICAKLSAgICAgICAgTV9TVFIgICAgICAgQWNjMCwgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSByZXN1bHQgJiBhZGp1c3QgcG9pbnRlcgotICAgICAgICBPUlIgICAgICAgICBBY2MyLCBBY2MyLCBBY2MzLCBMU0wgIzggICAgICAgICAgICAgICAgOy8vIFtiMyBiMiBiMSBiMF0gICAgICAgIAotICAgICAgICBNX1NUUiAgICAgICBBY2MyLCBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHJlc3VsdCAmIGFkanVzdCBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIEFERCAgICAgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQotICAgICAgICAKLSAgICAgICAgU1VCUyAgICAgICAgQ291bnRlciwgQ291bnRlciwgIzEKLSAgICAgICAgQkdUICAgICAgICAgVHdvUm93c0xvb3AKLUVuZAotICAgICAgICBTVUIgICAgIHBEc3QsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMgotICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMgotCi0gICAgICAgIE1fRU5ECi0gICAgCi0gICAgRU5ESUYKLSAgICAKLSAgICBFTkQKLSAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWFfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYV9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1YmY2N2MuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyODcgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDk2NDEKLTsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLQotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAgIAotICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotICAgICAgICAKLSAgICBJRiBBUk0xMTM2SlMKLQotOy8vIGlucHV0IHJlZ2lzdGVycwotCi1wU3JjICAgICAgICAgICAgICAgICBSTiAwCi1pU3JjU3RlcCAgICAgICAgICAgICBSTiAxCi1wRHN0ICAgICAgICAgICAgICAgICBSTiAyCi1pRHN0U3RlcCAgICAgICAgICAgICBSTiAzCi1pV2lkdGggICAgICAgICAgICAgICBSTiA0Ci1pSGVpZ2h0ICAgICAgICAgICAgICBSTiA1Ci1keCAgICAgICAgICAgICAgICAgICBSTiA2Ci1keSAgICAgICAgICAgICAgICAgICBSTiA3Ci0KLQotOy8vIGxvY2FsIHZhcmlhYmxlIHJlZ2lzdGVycwotdGVtcCAgICAgICAgICAgICAgICAgUk4gMTEKLXIweDIwICAgICAgICAgICAgICAgIFJOIDEyCi10bXAweDIwICAgICAgICAgICAgICBSTiAxNAotcmV0dXJuICAgICAgICAgICAgICAgUk4gMAotZHhQbHVzZHkgICAgICAgICAgICAgUk4gMTAKLUVpZ2h0TWludXNkeCAgICAgICAgIFJOIDggCi1FaWdodE1pbnVzZHkgICAgICAgICBSTiA5Ci1keEVpZ2h0TWludXNkeCAgICAgICBSTiA4Ci1CQUNvZWZmICAgICAgICAgICAgICBSTiA2Ci1EQ0NvZWZmICAgICAgICAgICAgICBSTiA3Ci0gICAgICAgICAgICAgICAgICAgICAKLWlEc3RTdGVweDJNaW51c1dpZHRoIFJOIDgKLWlTcmNTdGVweDJNaW51c1dpZHRoIFJOIDkKLWlTcmNTdGVwMSAgICAgICAgICAgIFJOIDEwCi0KLXBTcmMxICAgICAgICAgICAgICAgIFJOIDEKLXBTcmMyICAgICAgICAgICAgICAgIFJOIDgKLXBEc3QxICAgICAgICAgICAgICAgIFJOIDgKLXBEc3QyICAgICAgICAgICAgICAgIFJOIDEyCi0gICAgICAgICAgICAgICAgICAgICAKLXBpeDAwICAgICAgICAgICAgICAgIFJOIDgKLXBpeDAxICAgICAgICAgICAgICAgIFJOIDkKLXBpeDEwICAgICAgICAgICAgICAgIFJOIDEwCi1waXgxMSAgICAgICAgICAgICAgICBSTiAxMQotCi1PdXQwMTAwICAgICAgICAgICAgICBSTiA4ICAKLU91dDExMTAgICAgICAgICAgICAgIFJOIDEwIAotCi14MDAgICAgICAgICAgICAgICAgICBSTiA4Ci14MDEgICAgICAgICAgICAgICAgICBSTiAxMAoteDAyICAgICAgICAgICAgICAgICAgUk4gMTIKLXgxMCAgICAgICAgICAgICAgICAgIFJOIDkKLXgxMSAgICAgICAgICAgICAgICAgIFJOIDExCi14MTIgICAgICAgICAgICAgICAgICBSTiAxNAoteDIwICAgICAgICAgICAgICAgICAgUk4gMTAKLXgyMSAgICAgICAgICAgICAgICAgIFJOIDEyCi14MjIgICAgICAgICAgICAgICAgICBSTiAxNAotICAgICAgICAgICAgICAgICAgICAgCi14MDF4MDAgICAgICAgICAgICAgICBSTiA4ICAKLXgwMngwMSAgICAgICAgICAgICAgIFJOIDEwIAoteDExeDEwICAgICAgICAgICAgICAgUk4gOSAgCi14MTJ4MTEgICAgICAgICAgICAgICBSTiAxMSAKLXgyMXgyMCAgICAgICAgICAgICAgIFJOIDEwIAoteDIyeDIxICAgICAgICAgICAgICAgUk4gMTIgCi0gICAgICAgICAgICAgICAgICAgICAKLU91dFJvdzAwICAgICAgICAgICAgIFJOIDEyCi1PdXRSb3cwMSAgICAgICAgICAgICBSTiAxNAotT3V0Um93MTAgICAgICAgICAgICAgUk4gMTAKLU91dFJvdzExICAgICAgICAgICAgIFJOIDEyCi0gICAgICAgICAgICAgICAgICAgICAKLU91dFJvdzAxMDAgICAgICAgICAgIFJOIDEyCi1PdXRSb3cxMTEwICAgICAgICAgICBSTiAxMgotICAgICAgICAgICAgICAgICAgICAgCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX2FzbSBzdGFydHMKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIAotICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEsIHIxMQotICAgICAgICAKLSAgICAgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKLSAgICAgICAgTV9BUkcgICBXaWR0aCwgICAgICA0Ci0gICAgICAgIE1fQVJHICAgSGVpZ2h0LCAgICAgNAotICAgICAgICBNX0FSRyAgIER4LCAgICAgICAgIDQKLSAgICAgICAgTV9BUkcgICBEeSwgICAgICAgICA0Ci0gICAgICAgIAotICAgICAgICA7Ly8gTG9hZCBhcmd1bWVudCBmcm9tIHRoZSBzdGFjawotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9NAotICAgICAgICAKLSAgICAgICAgTV9MRFIgICBpV2lkdGgsICBXaWR0aCAgCi0gICAgICAgIE1fTERSICAgaUhlaWdodCwgSGVpZ2h0ICAKLSAgICAgICAgTV9MRFIgICBkeCwgICAgICBEeCAKLSAgICAgICAgTV9MRFIgICBkeSwgICAgICBEeQotICAgICAgICAKLSAgICAgICAgOy8vIEVpZ2h0TWludXNkeCA9IDggLSBkeAotICAgICAgICA7Ly8gRWlnaHRNaW51c2R5ID0gOCAtIGR5Ci0gICAgICAgIAotICAgICAgICA7Ly8gQUNvZWZmID0gRWlnaHRNaW51c2R4ICogRWlnaHRNaW51c2R5Ci0gICAgICAgIDsvLyBCQ29lZmYgPSBkeCAqIEVpZ2h0TWludXNkeQotICAgICAgICA7Ly8gQ0NvZWZmID0gRWlnaHRNaW51c2R4ICogZHkKLSAgICAgICAgOy8vIERDb2VmZiA9IGR4ICogZHkKLSAgICAgICAgCi0gICAgICAgIEFERCAgICAgcFNyYzEsIHBTcmMsIGlTcmNTdGVwCi0gICAgICAgIFNVQiAgICAgdGVtcCwgaVdpZHRoLCAjMQotICAgICAgICBSU0IgICAgIEVpZ2h0TWludXNkeCwgZHgsICM4IAotICAgICAgICBSU0IgICAgIEVpZ2h0TWludXNkeSwgZHksICM4Ci0gICAgICAgIENNTiAgICAgZHgsZHkKLSAgICAgICAgQUREICAgICBkeEVpZ2h0TWludXNkeCwgRWlnaHRNaW51c2R4LCBkeCwgTFNMICMxNgotICAgICAgICBPUlIgICAgIGlXaWR0aCwgaVdpZHRoLCB0ZW1wLCBMU0wgIzE2Ci0gICAgICAgIAotICAgICAgICA7Ly8gUGFja2VkIENvZWZmcy4KLSAgICAgICAgCi0gICAgICAgIE1VTCAgICAgQkFDb2VmZiwgZHhFaWdodE1pbnVzZHgsIEVpZ2h0TWludXNkeQotICAgICAgICBNVUwgICAgIERDQ29lZmYsIGR4RWlnaHRNaW51c2R4LCBkeSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIENoZWNraW5nIGVpdGhlciBvZiBkeCBhbmQgZHkgYmVpbmcgbm9uLXplcm8KLSAgICAgICAgCi0gICAgICAgIEJFUSAgICAgTVZJc1plcm8KLSAgICAgICAgCi07Ly8gUGl4ZWwgbGF5b3V0OgotOy8vCi07Ly8gICB4MDAgeDAxIHgwMgotOy8vICAgeDEwIHgxMSB4MTIKLTsvLyAgIHgyMCB4MjEgeDIyCi0KLTsvLyBJZiBmcmFjdGlvbmwgbXYgaXMgbm90ICgwLCAwKQotICAgICAgICAKLU91dGVyTG9vcE1WSXNOb3RaZXJvCi0KLUlubmVyTG9vcE1WSXNOb3RaZXJvCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBMRFJCICAgIHgwMCwgW3BTcmMsICAjKzBdICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIExEUkIgICAgeDEwLCBbcFNyYzEsICMrMF0gICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgTERSQiAgICB4MDEsIFtwU3JjLCAgIysxXSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIExEUkIgICAgeDExLCBbcFNyYzEsICMrMV0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBMRFJCICAgIHgwMiwgW3BTcmMsICAjKzJdISAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBMRFJCICAgIHgxMiwgW3BTcmMxLCAjKzJdISAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBPUlIgICAgIHgwMXgwMCwgeDAwLCB4MDEsIExTTCAjMTYgICAgICAgIAotICAgICAgICAgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCi0gICAgICAgICAgICAgICAgT1JSICAgICB4MDJ4MDEsIHgwMSwgeDAyLCBMU0wgIzE2ICAgICAgICAKLSAgICAgICAgICAgICAgICBNT1YgICAgIHIweDIwLCAgIzMyCi0gICAgICAgICAgICAgICAgT1JSICAgICB4MTF4MTAsIHgxMCwgeDExLCBMU0wgIzE2ICAgIAotICAgICAgICAgICAgICAgIE9SUiAgICAgeDEyeDExLCB4MTEsIHgxMiwgTFNMICMxNiAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgU01MQUQgICB4MDF4MDAsIHgwMXgwMCwgQkFDb2VmZiwgcjB4MjAKLSAgICAgICAgICAgICAgICBTTUxBRCAgIHgwMngwMSwgeDAyeDAxLCBCQUNvZWZmLCByMHgyMCAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICA7Ly8gaVdpZHRoIHBhY2tlZCB3aXRoIE1TQiAodG9wIDE2IGJpdHMpIAotICAgICAgICAgICAgICAgIDsvLyBhcyBpbm5lciBsb29wIGNvdW50ZXIgdmFsdWUgaS5lIAotICAgICAgICAgICAgICAgIDsvLyAoaVdpZHRoIC0xKSBhbmQgTFNCIChsb3dlciAxNiBiaXRzKQotICAgICAgICAgICAgICAgIDsvLyBhcyBvcmlnaW5hbCB3aWR0aAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFNVQlMgICAgaVdpZHRoLCBpV2lkdGgsICMxPDwxNwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFNNTEFEICAgT3V0Um93MDAsIHgxMXgxMCwgRENDb2VmZiwgeDAxeDAwICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgU01MQUQgICBPdXRSb3cwMSwgeDEyeDExLCBEQ0NvZWZmLCB4MDJ4MDEgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBSU0IgICAgIHBTcmMyLCBwU3JjLCBwU3JjMSwgTFNMICMxCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgTU9WICAgICBPdXRSb3cwMCwgT3V0Um93MDAsIExTUiAjNgotICAgICAgICAgICAgICAgIE1PViAgICAgT3V0Um93MDEsIE91dFJvdzAxLCBMU1IgIzYKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBMRFJCICAgIHgyMCxbcFNyYzIsICMtMl0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBPUlIgICAgIE91dFJvdzAxMDAsIE91dFJvdzAwLCBPdXRSb3cwMSwgTFNMICM4Ci0gICAgICAgICAgICAgICAgU1RSSCAgICBPdXRSb3cwMTAwLCBbcERzdF0sICMyCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgTERSQiAgICB4MjEsW3BTcmMyLCAjLTFdCi0gICAgICAgICAgICAgICAgTERSQiAgICB4MjIsW3BTcmMyLCAjKzBdCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgQUREICAgICBwRHN0MSwgcERzdCwgaURzdFN0ZXAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBPUlIgICAgIHgyMXgyMCwgeDIwLCB4MjEsIExTTCAjMTYKLSAgICAgICAgICAgICAgICBPUlIgICAgIHgyMngyMSwgeDIxLCB4MjIsIExTTCAjMTYgICAgIAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIE1PViAgICAgdG1wMHgyMCwgIzMyCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgOy8vIFJldXNpbmcgdGhlIHBhY2tlZCBkYXRhIHgxMXgxMCBhbmQgeDEyeDExCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgU01MQUQgICB4MTF4MTAsICB4MTF4MTAsICBCQUNvZWZmLCB0bXAweDIwCi0gICAgICAgICAgICAgICAgU01MQUQgICB4MTJ4MTEsICB4MTJ4MTEsICBCQUNvZWZmLCB0bXAweDIwCi0gICAgICAgICAgICAgICAgU01MQUQgICBPdXRSb3cxMCwgeDIxeDIwLCBEQ0NvZWZmLCB4MTF4MTAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBTTUxBRCAgIE91dFJvdzExLCB4MjJ4MjEsIERDQ29lZmYsIHgxMngxMQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIE1PViAgICAgT3V0Um93MTAsIE91dFJvdzEwLCBMU1IgIzYKLSAgICAgICAgICAgICAgICBNT1YgICAgIE91dFJvdzExLCBPdXRSb3cxMSwgTFNSICM2Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIE9SUiAgICAgT3V0Um93MTExMCwgT3V0Um93MTAsIE91dFJvdzExLCBMU0wgIzgKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBTVFJIICAgIE91dFJvdzExMTAsIFtwRHN0MSwgIy0yXQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIEJHVCAgICAgSW5uZXJMb29wTVZJc05vdFplcm8KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMyCi0gICAgICAgICAgICAgICAgQUREICAgICBpV2lkdGgsIGlXaWR0aCwgIzE8PDE2Ci0gICAgICAgICAgICAgICAgUlNCICAgICBpRHN0U3RlcHgyTWludXNXaWR0aCwgaVdpZHRoLCBpRHN0U3RlcCwgTFNMICMxCi0gICAgICAgICAgICAgICAgU1VCICAgICBpU3JjU3RlcDEsIHBTcmMxLCBwU3JjCi0gICAgICAgICAgICAgICAgU1VCICAgICB0ZW1wLCBpV2lkdGgsICMxCi0gICAgICAgICAgICAgICAgUlNCICAgICBpU3JjU3RlcHgyTWludXNXaWR0aCwgaVdpZHRoLCBpU3JjU3RlcDEsIExTTCAjMQotICAgICAgICAgICAgICAgIEFERCAgICAgcERzdCwgcERzdCwgaURzdFN0ZXB4Mk1pbnVzV2lkdGgKLSAgICAgICAgICAgICAgICBBREQgICAgIHBTcmMxLCBwU3JjMSwgaVNyY1N0ZXB4Mk1pbnVzV2lkdGgKLSAgICAgICAgICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsIGlTcmNTdGVweDJNaW51c1dpZHRoCi0gICAgICAgICAgICAgICAgT1JSICAgICBpV2lkdGgsIGlXaWR0aCwgdGVtcCwgTFNMICMxNgotICAgICAgICAgICAgICAgIEJHVCAgICAgT3V0ZXJMb29wTVZJc05vdFplcm8KLSAgICAgICAgICAgICAgICBNT1YgICAgIHJldHVybiwgICNPTVhfU3RzX05vRXJyCi0gICAgICAgICAgICAgICAgTV9FWElUCi0KLTsvLyBJZiBmcmFjdGlvbmwgbXYgaXMgKDAsIDApCi0KLU1WSXNaZXJvCi0gICAgICAgICAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTQKLU91dGVyTG9vcE1WSXNaZXJvCi0KLUlubmVyTG9vcE1WSXNaZXJvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIExEUkIgICAgcGl4MDAsIFtwU3JjXSwgICMrMQotICAgICAgICAgICAgICAgIExEUkIgICAgcGl4MDEsIFtwU3JjXSwgICMrMQotICAgICAgICAgICAgICAgIExEUkIgICAgcGl4MTAsIFtwU3JjMV0sICMrMQotICAgICAgICAgICAgICAgIExEUkIgICAgcGl4MTEsIFtwU3JjMV0sICMrMQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIEFERCAgICAgcERzdDIsICBwRHN0LCBpRHN0U3RlcAotICAgICAgICAgICAgICAgIFNVQlMgICAgaVdpZHRoLCBpV2lkdGgsICMxPDwxNyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBPUlIgICAgIE91dDAxMDAsIHBpeDAwLCBwaXgwMSwgTFNMICM4IAotICAgICAgICAgICAgICAgIE9SUiAgICAgT3V0MTExMCwgcGl4MTAsIHBpeDExLCBMU0wgIzgKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBTVFJIICAgIE91dDAxMDAsIFtwRHN0XSwgICMyCi0gICAgICAgICAgICAgICAgU1RSSCAgICBPdXQxMTEwLCBbcERzdDJdLCAjMgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIEJHVCAgICAgSW5uZXJMb29wTVZJc1plcm8KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMyCi0gICAgICAgICAgICAgICAgQUREICAgICBpV2lkdGgsIGlXaWR0aCwgIzE8PDE2Ci0gICAgICAgICAgICAgICAgUlNCICAgICBpRHN0U3RlcHgyTWludXNXaWR0aCwgaVdpZHRoLCBpRHN0U3RlcCwgTFNMICMxCi0gICAgICAgICAgICAgICAgU1VCICAgICBpU3JjU3RlcDEsIHBTcmMxLCBwU3JjCi0gICAgICAgICAgICAgICAgU1VCICAgICB0ZW1wLCBpV2lkdGgsICMxCi0gICAgICAgICAgICAgICAgUlNCICAgICBpU3JjU3RlcHgyTWludXNXaWR0aCwgaVdpZHRoLCBpU3JjU3RlcDEsIExTTCAjMQotICAgICAgICAgICAgICAgIEFERCAgICAgcERzdCwgcERzdCwgaURzdFN0ZXB4Mk1pbnVzV2lkdGgKLSAgICAgICAgICAgICAgICBBREQgICAgIHBTcmMxLCBwU3JjMSwgaVNyY1N0ZXB4Mk1pbnVzV2lkdGgKLSAgICAgICAgICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsIGlTcmNTdGVweDJNaW51c1dpZHRoCi0gICAgICAgICAgICAgICAgT1JSICAgICBpV2lkdGgsIGlXaWR0aCwgdGVtcCwgTFNMICMxNgotICAgICAgICAgICAgICAgIEJHVCAgICAgT3V0ZXJMb29wTVZJc1plcm8KLSAgICAgICAgICAgICAgICBNT1YgICAgIHJldHVybiwgICNPTVhfU3RzX05vRXJyCi0gICAgICAgICAgICAgICAgTV9FTkQKLQotICAgICAgICBFTkRJRiA7Ly8gQVJNMTEzNkpTCi0KLSAgICAgICAgCi0gICAgICAgIEVORAotCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX2FzbSBlbmRzCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfUXVhbnRUYWJsZXNfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1F1YW50VGFibGVzX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM4YzcxOS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfUXVhbnRUYWJsZXNfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfUXVhbnRUYWJsZXNfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgOTY0MQotOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8gRGVzY3JpcHRpb246Ci07Ly8gVGhpcyBmaWxlIGNvbnRhaW5zIHF1YW50aXphdGlvbiB0YWJsZXMKLTsvLyAKLTsvLyAKLQotICAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgCi0gICAgICAgICAKLSAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX01GTWF0cml4UVBNb2RUYWJsZQotICAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfUVBEaXZJbnRyYVRhYmxlCi0gICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9RUERpdlBsdXNPbmVUYWJsZSAgCi0gICAgICAgICAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gVGhpcyB0YWJsZSBjb250YWlucyBhcm1WQ000UDEwX01GTWF0cml4IFtpUVAgJSA2XVswXSBlbnRpcmVzLAotOy8vIGZvciB2YWx1ZXMgb2YgaVFQIGZyb20gMCB0byA1MSAoaW5jbHVzaXZlKS4gCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfTUZNYXRyaXhRUE1vZFRhYmxlCi0gICAgICAgICBEQ1cgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgotICAgICAgICAgRENXIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKLSAgICAgICAgIERDVyAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCi0gICAgICAgICBEQ1cgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgotICAgICAgICAgRENXIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKLSAgICAgICAgIERDVyAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCi0gICAgICAgICBEQ1cgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgotICAgICAgICAgRENXIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKLSAgICAgICAgIERDVyAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCi0gICAgICAgICAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIFRoaXMgdGFibGUgY29udGFpbnMgQVJNX000UDEwX1FfT0ZGU0VUICsgMSArIChpUVAgLyA2KSB2YWx1ZXMsCi07Ly8gZm9yIHZhbHVlcyBvZiBpUVAgZnJvbSAwIHRvIDUxIChpbmNsdXNpdmUpLiAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfUVBEaXZQbHVzT25lVGFibGUKLSAgICAgICAgIERDQiAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2Ci0gICAgICAgICBEQ0IgMTcsIDE3LCAxNywgMTcsIDE3LCAxNwotICAgICAgICAgRENCIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgKLSAgICAgICAgIERDQiAxOSwgMTksIDE5LCAxOSwgMTksIDE5Ci0gICAgICAgICBEQ0IgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMAotICAgICAgICAgRENCIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEKLSAgICAgICAgIERDQiAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyCi0gICAgICAgICBEQ0IgMjMsIDIzLCAyMywgMjMsIDIzLCAyMwotICAgICAgICAgRENCIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQKLQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gVGhpcyB0YWJsZSBjb250YWlucyAoMSA8PCBRYml0c1BsdXNPbmUpIC8gMyBWYWx1ZXMgKEludHJhIGNhc2UpICwKLTsvLyBmb3IgdmFsdWVzIG9mIGlRUCBmcm9tIDAgdG8gNTEgKGluY2x1c2l2ZSkuIAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgCi0gICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfUVBEaXZJbnRyYVRhYmxlLCAyCi0gICAgICAgICBEQ0QgMjE4NDUsIDIxODQ1LCAyMTg0NSwgMjE4NDUsIDIxODQ1LCAyMTg0NQotICAgICAgICAgRENEIDQzNjkwLCA0MzY5MCwgNDM2OTAsIDQzNjkwLCA0MzY5MCwgNDM2OTAKLSAgICAgICAgIERDRCA4NzM4MSwgODczODEsIDg3MzgxLCA4NzM4MSwgODczODEsIDg3MzgxCi0gICAgICAgICBEQ0QgMTc0NzYyLCAxNzQ3NjIsIDE3NDc2MiwgMTc0NzYyLCAxNzQ3NjIsIDE3NDc2MgotICAgICAgICAgRENEIDM0OTUyNSwgMzQ5NTI1LCAzNDk1MjUsIDM0OTUyNSwgMzQ5NTI1LCAzNDk1MjUKLSAgICAgICAgIERDRCA2OTkwNTAsIDY5OTA1MCwgNjk5MDUwLCA2OTkwNTAsIDY5OTA1MCwgNjk5MDUwCi0gICAgICAgICBEQ0QgMTM5ODEwMSwgMTM5ODEwMSwgMTM5ODEwMSwgMTM5ODEwMSwgMTM5ODEwMSwgMTM5ODEwMQotICAgICAgICAgRENEIDI3OTYyMDIsIDI3OTYyMDIsIDI3OTYyMDIsIDI3OTYyMDIsIDI3OTYyMDIsIDI3OTYyMDIKLSAgICAgICAgIERDRCA1NTkyNDA1LCA1NTkyNDA1LCA1NTkyNDA1LCA1NTkyNDA1LCA1NTkyNDA1LCA1NTkyNDA1ICAgICAgICAgICAgICAgIAotICAgICAgICAgCi0gICAgICAgICAKLSAgICAgICAgIEVORAotICAgICAgICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDRfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0X3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTUzNzJlMS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDRfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsNDIxICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0X3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDk2NDEKLTsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi07Ly8gRGVzY3JpcHRpb246Ci07Ly8gVHJhbnNmb3JtIFJlc2lkdWFsIDR4NCBDb2VmZmljaWVudHMKLTsvLyAKLTsvLyAKLQotICAgICAgICAKLTsvLyBJbmNsdWRlIHN0YW5kYXJkIGhlYWRlcnMKLQotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAgIAotICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotICAgICAgICAKLTsvLyBJbXBvcnQgc3ltYm9scyByZXF1aXJlZCBmcm9tIG90aGVyIGZpbGVzCi07Ly8gKEZvciBleGFtcGxlIHRhYmxlcykKLSAgICAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAKLTsvLyBTZXQgZGVidWdnaW5nIGxldmVsICAgICAgICAKLTsvL0RFQlVHX09OICAgIFNFVEwge1RSVUV9Ci0KLQotCi07Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCi0gICAgCi0gICAgSUYgIEFSTTExMzZKUyAKLSAgICAKLTsvL0lucHV0IFJlZ2lzdGVycwotcERzdCAgICAgICAgICAgICAgICBSTiAgMAotcFNyYyAgICAgICAgICAgICAgICBSTiAgMQotCi07Ly9PdXRwdXQgUmVnaXN0ZXJzCi0KLQotOy8vTG9jYWwgU2NyYXRjaCBSZWdpc3RlcnMKLQotOy8vIFBhY2tlZCBJbnB1dCBwaXhlbHMKLWluMDAgICAgICAgICAgICAgICAgUk4gIDIgICAgICAgICAgICAgICAgICAgOy8vIFNyY1swXSAmIFNyY1sxXSAKLWluMDIgICAgICAgICAgICAgICAgUk4gIDMgICAgICAgICAgICAgICAgICAgOy8vIFNyY1syXSAmIFNyY1szXQotaW4xMCAgICAgICAgICAgICAgICBSTiAgNCAgICAgICAgICAgICAgICAgICA7Ly8gU3JjWzRdICYgU3JjWzVdCi1pbjEyICAgICAgICAgICAgICAgIFJOICA1ICAgICAgICAgICAgICAgICAgIDsvLyBTcmNbNl0gJiBTcmNbN10KLWluMjAgICAgICAgICAgICAgICAgUk4gIDYgICAgICAgICAgICAgICAgICAgOy8vIFNyY1s4XSAmIFNyY1s5XQotaW4yMiAgICAgICAgICAgICAgICBSTiAgNyAgICAgICAgICAgICAgICAgICA7Ly8gU3JjWzEwXSAmIFNyY1sxMV0KLWluMzAgICAgICAgICAgICAgICAgUk4gIDggICAgICAgICAgICAgICAgICAgOy8vIFNyY1sxMl0gJiBTcmNbMTNdCi1pbjMyICAgICAgICAgICAgICAgIFJOICA5ICAgICAgICAgICAgICAgICAgIDsvLyBTcmNbMTRdICYgU3JjWzE1XQotCi07Ly8gVHJhbnNwb3NlIGZvciBSb3cgb3BlcmF0aW9ucyAoUm93cyB0byBjb2xzKQotdHJSb3cwMCAgICAgICAgICAgICBSTiAgMgotdHJSb3cxMCAgICAgICAgICAgICBSTiAgMTAKLXRyUm93MDIgICAgICAgICAgICAgUk4gIDMKLXRyUm93MTIgICAgICAgICAgICAgUk4gIDUKLXRyUm93MjAgICAgICAgICAgICAgUk4gIDExCi10clJvdzMwICAgICAgICAgICAgIFJOICAxMgotdHJSb3czMiAgICAgICAgICAgICBSTiAgMTQKLXRyUm93MjIgICAgICAgICAgICAgUk4gIDcKLQotOy8vIEludGVybWVkaWF0ZSBjYWxjdWxhdGlvbnMKLWUwICAgICAgICAgICAgICAgICAgUk4gIDQgICAgICAgICAgICAgICAgICAgCi1lMSAgICAgICAgICAgICAgICAgIFJOICA2Ci1lMiAgICAgICAgICAgICAgICAgIFJOICA4Ci1lMyAgICAgICAgICAgICAgICAgIFJOICA5Ci1jb25zdFplcm8gICAgICAgICAgIFJOICAxCi0KLTsvLyBSb3cgb3BlcmF0ZWQgcGl4ZWxzCi1yb3dPcDAwICAgICAgICAgICAgIFJOICAyCi1yb3dPcDEwICAgICAgICAgICAgIFJOICAxMAotcm93T3AyMCAgICAgICAgICAgICBSTiAgMTEKLXJvd09wMzAgICAgICAgICAgICAgUk4gIDEyCi1yb3dPcDAyICAgICAgICAgICAgIFJOICAzCi1yb3dPcDEyICAgICAgICAgICAgIFJOICA1Ci1yb3dPcDIyICAgICAgICAgICAgIFJOICA3Ci1yb3dPcDMyICAgICAgICAgICAgIFJOICAxNAotCi07Ly8gVHJhbnNwb3NlIGZvciBjb2x1bG1uIG9wZXJhdGlvbnMKLXRyQ29sMDAgICAgICAgICAgICAgUk4gIDIgICAgICAgICAgICAgICAgICAgCi10ckNvbDAyICAgICAgICAgICAgIFJOICAzICAgICAgICAgICAgICAgICAgIAotdHJDb2wxMCAgICAgICAgICAgICBSTiAgNCAgICAgICAgICAgICAgICAgICAKLXRyQ29sMTIgICAgICAgICAgICAgUk4gIDUgICAgICAgICAgICAgICAgICAgCi10ckNvbDIwICAgICAgICAgICAgIFJOICA2ICAgICAgICAgICAgICAgICAgIAotdHJDb2wyMiAgICAgICAgICAgICBSTiAgNyAgICAgICAgICAgICAgICAgICAKLXRyQ29sMzAgICAgICAgICAgICAgUk4gIDggICAgICAgICAgICAgICAgICAgCi10ckNvbDMyICAgICAgICAgICAgIFJOICA5ICAKLQotOy8vIEludGVybWVkaWF0ZSBjYWxjdWxhdGlvbnMKLWcwICAgICAgICAgICAgICAgICAgUk4gIDEwCi1nMSAgICAgICAgICAgICAgICAgIFJOICAxMQotZzIgICAgICAgICAgICAgICAgICBSTiAgMTIKLWczICAgICAgICAgICAgICAgICAgUk4gIDE0ICAgCi0KLTsvLyBDb2xvdW1uIG9wZXJhdGVkIHBpeGVscwotY29sT3AwMCAgICAgICAgICAgICBSTiAgMiAgICAgICAgICAgICAgICAgICAKLWNvbE9wMDIgICAgICAgICAgICAgUk4gIDMgICAgICAgICAgICAgICAgICAgCi1jb2xPcDEwICAgICAgICAgICAgIFJOICA0ICAgICAgICAgICAgICAgICAgIAotY29sT3AxMiAgICAgICAgICAgICBSTiAgNSAgICAgICAgICAgICAgICAgICAKLWNvbE9wMjAgICAgICAgICAgICAgUk4gIDYgICAgICAgICAgICAgICAgICAgCi1jb2xPcDIyICAgICAgICAgICAgIFJOICA3ICAgICAgICAgICAgICAgICAgIAotY29sT3AzMCAgICAgICAgICAgICBSTiAgOCAgICAgICAgICAgICAgICAgICAKLWNvbE9wMzIgICAgICAgICAgICAgUk4gIDkgIAotCi0KLXRlbXAxICAgICAgICAgICAgICAgUk4gIDEwICAgICAgICAgICAgICAgICAgOy8vIFRlbXBvcmFyeSBzY3JhdGNoIHZhcmFpYmxlcwotY29uc3QxICAgICAgICAgICAgICBSTiAgMTEgICAgICAKLWNvbnN0MiAgICAgICAgICAgICAgUk4gIDEyCi1tYXNrICAgICAgICAgICAgICAgIFJOICAxNAotCi07Ly8gT3V0cHV0IHBpeGVscwotb3V0MDAgICAgICAgICAgICAgICBSTiAgMiAgICAgICAgICAgICAgICAgICAKLW91dDAyICAgICAgICAgICAgICAgUk4gIDMgICAgICAgICAgICAgICAgICAgCi1vdXQxMCAgICAgICAgICAgICAgIFJOICA0ICAgICAgICAgICAgICAgICAgIAotb3V0MTIgICAgICAgICAgICAgICBSTiAgNSAgICAgICAgICAgICAgICAgICAKLW91dDIwICAgICAgICAgICAgICAgUk4gIDYgICAgICAgICAgICAgICAgICAgCi1vdXQyMiAgICAgICAgICAgICAgIFJOICA3ICAgICAgICAgICAgICAgICAgIAotb3V0MzAgICAgICAgICAgICAgICBSTiAgOCAgICAgICAgICAgICAgICAgICAKLW91dDMyICAgICAgICAgICAgICAgUk4gIDkgIAotICAgICAgCi0gICAgICAgCi0gICAgICAgCi0gICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSByZXF1aXJlZCBieSB0aGUgZnVuY3Rpb24KLSAgICAgICAgCi0KLSAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NCxyMTEKLSAgICAgICAgCi0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgOy8vIFRoZSBzdHJhdGVneSB1c2VkIGluIGltcGxlbWVudGluZyB0aGUgdHJhbnNmb3JtIGlzIGFzIGZvbGxvd3M6KgotICAgICAgICA7Ly8gTG9hZCB0aGUgNHg0IGJsb2NrIGludG8gOCByZWdpc3RlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAKLSAgICAgICAgOy8vIFRyYW5zcG9zZSB0aGUgNHg0IG1hdHJpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgCi0gICAgICAgIDsvLyBQZXJmb3JtIHRoZSByb3cgb3BlcmF0aW9ucyAob24gY29sdW1ucykgdXNpbmcgU0lNRCAgICAgICAgICAgICogIAotICAgICAgICA7Ly8gVHJhbnNwb3NlIHRoZSA0eDQgcmVzdWx0IG1hdHJpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAKLSAgICAgICAgOy8vIFBlcmZvcm0gdGhlIGNvbG91bW4gb3BlcmF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgICAgICA7Ly8gU3RvcmUgdGhlIDR4NCBibG9jayBhdCBvbmUgZ28gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAKLSAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgICAgIDsvLyBMb2FkIGFsbCB0aGUgNHg0IHBpeGVscwotICAgICAgICAKLSAgICAgICAgTERNSUEgICBwU3JjLHtpbjAwLGluMDIsaW4xMCxpbjEyLGluMjAsaW4yMixpbjMwLGluMzJ9Ci0gICAgICAgIAotICAgICAgICBNT1YgICAgICAgY29uc3RaZXJvLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBVc2VkIHRvIHJpZ2h0IHNoaWZ0IGJ5IDEgCi0gICAgICAgIDtMRFIgICAgICAgY29uc3RaZXJvLD0weDAwMDAwMDAwICAKLSAgICAgICAgCi0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIFRyYW5zcG9zZSB0aGUgbWF0cml4IGlub3JkZXIgdG8gcGVyZm9ybSByb3cgb3BzIGFzIGNvbG91bW4gb3BzCi0gICAgICAgIDsvLyBJbnB1dDogICBpbltdW10gPSBvcmlnaW5hbCBtYXRyaXgKLSAgICAgICAgOy8vIE91dHB1dDogIHRyUm93W11bXT0gdHJhbnNwb3NlZCBtYXRyaXgKLSAgICAgICAgOy8vIFN0ZXAxOiBPYnRhaW4gdGhlIExMIHBhcnQgb2YgdGhlIHRyYW5zcG9zZWQgbWF0cml4Ci0gICAgICAgIDsvLyBTdGVwMjogT2J0YWluIHRoZSBITCBwYXJ0Ci0gICAgICAgIDsvLyBzdGVwMzogT2J0YWluIHRoZSBMSCBwYXJ0Ci0gICAgICAgIDsvLyBTdGVwNDogT2J0YWluIHRoZSBISCBwYXJ0Ci0gICAgICAgIDsvLwotICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgCi0gICAgICAgIDsvLyBMTCAyeDIgdHJhbnNwb3NlZCBtYXRyaXggCi0gICAgICAgIDsvLyAgIGQwIGQxIC0gLQotICAgICAgICA7Ly8gICBkNCBkNSAtIC0KLSAgICAgICAgOy8vICAgLSAgLSAgLSAtCi0gICAgICAgIDsvLyAgIC0gIC0gIC0gLQotICAgICAgICAKLSAgICAgICAgUEtIVEIgICB0clJvdzEwLGluMTAsaW4wMCxBU1IgIzE2ICAgICAgICAgICAgICAgOy8vIFs1IDRdID0gW2Y1OmYxXSAgICAKLSAgICAgICAgUEtIQlQgICB0clJvdzAwLGluMDAsaW4xMCxMU0wgIzE2ICAgICAgICAgICAgICAgOy8vIFsxIDBdID0gW2Y0OmYwXSAgCi0gICAgICAgIAotICAgICAgICA7Ly8gSEwgMngyIHRyYW5zcG9zZWQgbWF0cml4ICAKLSAgICAgICAgOy8vICAgIC0gICAtICAgLSAtCi0gICAgICAgIDsvLyAgICAtICAgLSAgIC0gLQotICAgICAgICA7Ly8gICAgZDggIGQ5ICAtIC0KLSAgICAgICAgOy8vICAgZDEyIGQxMyAgLSAtCi0gICAgICAgIAotICAgICAgICAgCi0gICAgICAgICBQS0hUQiAgIHRyUm93MzAsaW4xMixpbjAyLEFTUiAjMTYgICAgICAgICAgICAgIDsvLyBbMTMgMTJdID0gWzcgM10KLSAgICAgICAgIFBLSEJUICAgdHJSb3cyMCxpbjAyLGluMTIsTFNMICMxNiAgICAgICAgICAgICAgOy8vIFs5IDhdID0gWzYgMl0gCi0gICAgICAgIAotICAgICAgICA7Ly8gTEggMngyIHRyYW5zcG9zZWQgbWF0cml4IAotICAgICAgICA7Ly8gICAtIC0gZDIgZDMgCi0gICAgICAgIDsvLyAgIC0gLSBkNiBkNyAKLSAgICAgICAgOy8vICAgLSAtIC0gIC0KLSAgICAgICAgOy8vICAgLSAtIC0gIC0KLSAgICAgICAgCi0gICAgICAgIFBLSEJUICAgdHJSb3cwMixpbjIwLGluMzAsTFNMICMxNiAgICAgICAgICAgICAgIDsvLyBbMyAyXSA9IFtmMTI6ZjhdICAKLSAgICAgICAgUEtIVEIgICB0clJvdzEyLGluMzAsaW4yMCxBU1IgIzE2ICAgICAgICAgICAgICAgOy8vIFs3IDZdID0gW2YxMzpmOV0gCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAKLSAgICAgICAgOy8vIEhIIDJ4MiB0cmFuc3Bvc2VkIG1hdHJpeCAgCi0gICAgICAgIDsvLyAgICAtIC0gICAtICAgLQotICAgICAgICA7Ly8gICAgLSAtICAgLSAgIC0KLSAgICAgICAgOy8vICAgIC0gLSAgZDEwIGQxMQotICAgICAgICA7Ly8gICAgLSAtICBkMTQgZDE1Ci0gICAgICAgIAotICAgICAgICBQS0hUQiAgIHRyUm93MzIsaW4zMixpbjIyLEFTUiAjMTYgICAgICAgICAgICAgICA7Ly8gWzE1IDE0XSA9IFsxNSAxMV0KLSAgICAgICAgUEtIQlQgICB0clJvdzIyLGluMjIsaW4zMixMU0wgIzE2ICAgICAgICAgICAgICAgOy8vIFsxMSAxMF0gPSBbMTQgMTBdCi0gICAgICAgCi0gICAgICAgIAotICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAgICAgICAgOy8vIFJvdyBPcGVyYXRpb25zIChQZXJmb3JtZWQgb24gY29sdW1ucykKLSAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIFNJTUQgb3BlcmF0aW9ucyBvbiBmaXJzdCB0d28gY29sdW1ucyh0d28gcm93cyBvZiB0aGUgb3JpZ2luYWwgbWF0cml4KQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFNBREQxNiAgICAgIGUwLCB0clJvdzAwLHRyUm93MjAgICAgICAgICAgICAgICAgICAgOy8vICBlMCA9IGQwICsgZDIgCi0gICAgICAgIFNTVUIxNiAgICBlMSwgdHJSb3cwMCx0clJvdzIwICAgICAgICAgICAgICAgICAgIDsvLyAgZTEgPSBkMCAtIGQyICAKLSAgICAgICAgU0hBREQxNiAgIGUyLCB0clJvdzEwLGNvbnN0WmVybyAgICAgICAgICAgICAgICAgOy8vIChmMT4+MSkgY29uc3RaZXJvIGlzIGEgcmVnaXN0ZXIgaG9sZGluZyAwCi0gICAgICAgIFNIQUREMTYgICBlMywgdHJSb3czMCxjb25zdFplcm8gICAgICAgICAgICAgICAgIDsvLyAgYXZvaWQgcGlwZWxpbmUgc3RhbGxzIGZvciBlMiBhbmQgZTMKLSAgICAgICAgU1NVQjE2ICAgIGUyLCBlMiwgdHJSb3czMCAgICAgICAgICAgICAgICAgICAgICAgOy8vICBlMiA9IChkMT4+MSkgLSBkMyAgCi0gICAgICAgIFNBREQxNiAgICBlMywgZTMsIHRyUm93MTAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZTMgPSBkMSArIChkMz4+MSkgIAotICAgICAgICBTQUREMTYgICAgcm93T3AwMCwgZTAsIGUzICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGYwID0gZTAgKyBlMyAgCi0gICAgICAgIFNBREQxNiAgICByb3dPcDEwLCBlMSwgZTIgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZjEgPSBlMSArIGUyICAKLSAgICAgICAgU1NVQjE2ICAgIHJvd09wMjAsIGUxLCBlMiAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMiA9IGUxIC0gZTIgIAotICAgICAgICBTU1VCMTYgICAgcm93T3AzMCwgZTAsIGUzICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGYzID0gZTAgLSBlMwotICAgICAgICAKLSAgICAgICAgOy8vIFNJTUQgb3BlcmF0aW9ucyBvbiBuZXh0IHR3byBjb2x1bW5zKG5leHQgdHdvIHJvd3Mgb2YgdGhlIG9yaWdpbmFsIG1hdHJpeCkKLSAgICAgICAgCi0gICAgICAgIFNBREQxNiAgICAgIGUwLCB0clJvdzAyLHRyUm93MjIKLSAgICAgICAgU1NVQjE2ICAgIGUxLCB0clJvdzAyLHRyUm93MjIKLSAgICAgICAgU0hBREQxNiAgIGUyLCB0clJvdzEyLGNvbnN0WmVybyAgICAgICAgICAgICAgICAgOy8vKGYxPj4xKSBjb25zdFplcm8gaXMgYSByZWdpc3RlciBob2xkaW5nIDAKLSAgICAgICAgU0hBREQxNiAgIGUzLCB0clJvdzMyLGNvbnN0WmVybwotICAgICAgICBTU1VCMTYgICAgZTIsIGUyLCB0clJvdzMyCi0gICAgICAgIFNBREQxNiAgICBlMywgZTMsIHRyUm93MTIKLSAgICAgICAgU0FERDE2ICAgIHJvd09wMDIsIGUwLCBlMwotICAgICAgICBTQUREMTYgICAgcm93T3AxMiwgZTEsIGUyCi0gICAgICAgIFNTVUIxNiAgICByb3dPcDIyLCBlMSwgZTIKLSAgICAgICAgU1NVQjE2ICAgIHJvd09wMzIsIGUwLCBlMwotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICA7Ly8gVHJhbnNwb3NlIHRoZSByZXN1bHRhbnQgbWF0cml4Ci0gICAgICAgIDsvLyBJbnB1dDogIHJvd09wW11bXQotICAgICAgICA7Ly8gT3V0cHV0OiB0ckNvbFtdW10gCi0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAKLSAgICAgICAgOy8vIExMIDJ4MiB0cmFuc3Bvc2VkIG1hdHJpeCAKLSAgICAgICAgOy8vICAgZDAgZDEgLSAtCi0gICAgICAgIDsvLyAgIGQ0IGQ1IC0gLQotICAgICAgICA7Ly8gICAtICAtICAtIC0KLSAgICAgICAgOy8vICAgLSAgLSAgLSAtCi0gICAgICAgIAotICAgICAgICBQS0hUQiAgIHRyQ29sMTAscm93T3AxMCxyb3dPcDAwLEFTUiAjMTYgICAgICAgICAgIDsvLyBbNSA0XSA9IFtmNTpmMV0KLSAgICAgICAgUEtIQlQgICB0ckNvbDAwLHJvd09wMDAscm93T3AxMCxMU0wgIzE2ICAgICAgICAgICA7Ly8gWzEgMF0gPSBbZjQ6ZjBdICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBITCAyeDIgdHJhbnNwb3NlZCBtYXRyaXggIAotICAgICAgICA7Ly8gICAgLSAgIC0gICAtIC0KLSAgICAgICAgOy8vICAgIC0gICAtICAgLSAtCi0gICAgICAgIDsvLyAgICBkOCAgZDkgIC0gLQotICAgICAgICA7Ly8gICBkMTIgZDEzICAtIC0KLSAgICAgICAgCi0gICAgICAgICAKLSAgICAgICAgIFBLSFRCICAgdHJDb2wzMCxyb3dPcDEyLHJvd09wMDIsQVNSICMxNiAgICAgICAgICA7Ly8gWzEzIDEyXSA9IFs3IDNdCi0gICAgICAgICBQS0hCVCAgIHRyQ29sMjAscm93T3AwMixyb3dPcDEyLExTTCAjMTYgICAgICAgICAgOy8vIFs5IDhdID0gWzYgMl0gCi0gICAgICAgIAotICAgICAgICA7Ly8gTEggMngyIHRyYW5zcG9zZWQgbWF0cml4IAotICAgICAgICA7Ly8gICAtIC0gZDIgZDMgCi0gICAgICAgIDsvLyAgIC0gLSBkNiBkNyAKLSAgICAgICAgOy8vICAgLSAtIC0gIC0KLSAgICAgICAgOy8vICAgLSAtIC0gIC0KLSAgICAgICAgCi0gICAgICAgIFBLSEJUICAgdHJDb2wwMixyb3dPcDIwLHJvd09wMzAsTFNMICMxNiAgICAgICAgICAgOy8vIFszIDJdID0gW2YxMjpmOF0gIAotICAgICAgICBQS0hUQiAgIHRyQ29sMTIscm93T3AzMCxyb3dPcDIwLEFTUiAjMTYgICAgICAgICAgIDsvLyBbNyA2XSA9IFtmMTM6ZjldIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgCi0gICAgICAgIDsvLyBISCAyeDIgdHJhbnNwb3NlZCBtYXRyaXggIAotICAgICAgICA7Ly8gICAgLSAtICAgLSAgIC0KLSAgICAgICAgOy8vICAgIC0gLSAgIC0gICAtCi0gICAgICAgIDsvLyAgICAtIC0gIGQxMCBkMTEKLSAgICAgICAgOy8vICAgIC0gLSAgZDE0IGQxNQotICAgICAgICAKLSAgICAgICAgUEtIVEIgICB0ckNvbDMyLHJvd09wMzIscm93T3AyMixBU1IgIzE2ICAgICAgICAgICAgOy8vIFsxNSAxNF0gPSBbMTUgMTFdCi0gICAgICAgIFBLSEJUICAgdHJDb2wyMixyb3dPcDIyLHJvd09wMzIsTFNMICMxNiAgICAgICAgICAgIDsvLyBbMTEgMTBdID0gWzE0IDEwXQotICAgICAgIAotICAgICAgICAKLSAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gICAgICAgIDsvLyBDb2xvdW1uIE9wZXJhdGlvbnMgCi0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBTSU1EIG9wZXJhdGlvbnMgb24gZmlyc3QgdHdvIGNvbHVtbnMKLSAgICAgICAgCi0gICAgICAgICAgCi0gICAgICAgIFNBREQxNiAgICAgIGcwLCB0ckNvbDAwLHRyQ29sMjAKLSAgICAgICAgU1NVQjE2ICAgIGcxLCB0ckNvbDAwLHRyQ29sMjAKLSAgICAgICAgU0hBREQxNiAgIGcyLCB0ckNvbDEwLGNvbnN0WmVybyAgICAgICAgICAgICAgICAgICAgIDsvLyAoZjE+PjEpIGNvbnN0WmVybyBpcyBhIHJlZ2lzdGVyIGhvbGRpbmcgMAotICAgICAgICBTSEFERDE2ICAgZzMsIHRyQ29sMzAsY29uc3RaZXJvCi0gICAgICAgIFNTVUIxNiAgICBnMiwgZzIsIHRyQ29sMzAKLSAgICAgICAgU0FERDE2ICAgIGczLCBnMywgdHJDb2wxMAotICAgICAgICBTQUREMTYgICAgY29sT3AwMCwgZzAsIGczCi0gICAgICAgIFNBREQxNiAgICBjb2xPcDEwLCBnMSwgZzIKLSAgICAgICAgU1NVQjE2ICAgIGNvbE9wMjAsIGcxLCBnMgotICAgICAgICBTU1VCMTYgICAgY29sT3AzMCwgZzAsIGczCi0gICAgICAgIAotICAgICAgICA7Ly8gU0lNRCBvcGVyYXRpb25zIG9uIG5leHQgdHdvIGNvbHVtbnMKLSAgICAgICAgCi0gICAgICAgIFNBREQxNiAgICAgIGcwLCB0ckNvbDAyLHRyQ29sMjIKLSAgICAgICAgU1NVQjE2ICAgIGcxLCB0ckNvbDAyLHRyQ29sMjIKLSAgICAgICAgU0hBREQxNiAgIGcyLCB0ckNvbDEyLGNvbnN0WmVybyAgICAgICAgICAgICAgICAgICAgIDsvLyAoZjE+PjEpIGNvbnN0WmVybyBpcyBhIHJlZ2lzdGVyIGhvbGRpbmcgMAotICAgICAgICBTSEFERDE2ICAgZzMsIHRyQ29sMzIsY29uc3RaZXJvCi0gICAgICAgIFNTVUIxNiAgICBnMiwgZzIsIHRyQ29sMzIKLSAgICAgICAgU0FERDE2ICAgIGczLCBnMywgdHJDb2wxMgotICAgICAgICBTQUREMTYgICAgY29sT3AwMiwgZzAsIGczCi0gICAgICAgIFNBREQxNiAgICBjb2xPcDEyLCBnMSwgZzIKLSAgICAgICAgU1NVQjE2ICAgIGNvbE9wMjIsIGcxLCBnMgotICAgICAgICBTU1VCMTYgICAgY29sT3AzMiwgZzAsIGczCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgIAotICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgIDsvLyBDYWxjdWxhdGUgZmluYWwgdmFsdWUgKGNvbE9wW2ldW2pdICsgMzIpPj42Ci0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgCi0gICAgICAgIDsvLyBjb25zdDE6IFNlcnZlcyBkdWFsIHB1cnBvc2UgCi0gICAgICAgIDsvLyAoMSkgQWRkICMzMiB0byBib3RoIHRoZSBsb3dlciBhbmQgaGlnaGVyIDE2Yml0cyBvZiB0aGUgU0lNRCByZXN1bHQgCi0gICAgICAgIDsvLyAoMikgQ29udmVydCB0aGUgbG93ZXIgMTYgYml0IHZhbHVlIHRvIGFuIHVuc2lnbmVkIG51bWJlciAoQWRkIDMyNzY4KQotICAgICAgICAKLSAgICAgICAgTERSICAgICBjb25zdDEsID0weDAwMjA4MDIwICAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgTERSICAgICBtYXNrLCA9MHhmZmZmMDNmZiAgICAgICAgICAgICAgICAgICAgICAgOy8vIFVzZWQgdG8gbWFzayB0aGUgZG93biBzaGlmdGVkIDYgYml0cyAgCi0gICAgICAgIAotICAgICAgICA7Ly8gY29uc3QyKCM1MTIpOiB1c2VkIHRvIGNvbnZlcnQgdGhlIGxvd2VyIDE2Yml0IG51bWJlciBiYWNrIHRvIHNpZ25lZCB2YWx1ZSAKLSAgICAgIAotICAgICAgICBNT1YgICAgIGNvbnN0MiwjMHgyMDAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY29uc3QyID0gMl45Ci0gICAgICAgIAotICAgICAgICA7Ly8gRmlyc3QgUm93IAotICAgICAgICAKLSAgICAgICAgU0FERDE2ICAgIGNvbE9wMDAsIGNvbE9wMDAsIGNvbnN0MQotICAgICAgICBTQUREMTYgICAgY29sT3AwMiwgY29sT3AwMiwgY29uc3QxCi0gICAgICAgIEFORCAgICAgY29sT3AwMCwgbWFzaywgY29sT3AwMCwgQVNSICM2Ci0gICAgICAgIEFORCAgICAgY29sT3AwMiwgbWFzaywgY29sT3AwMiwgQVNSICM2Ci0gICAgICAgIFNTVUIxNiAgb3V0MDAsY29sT3AwMCxjb25zdDIKLSAgICAgICAgU1NVQjE2ICBvdXQwMixjb2xPcDAyLGNvbnN0MiAgICAKLSAgICAgICAgCi0KLSAgICAgICAgOy8vIFNlY29uZCBSb3cKLSAgICAgICAgCi0gICAgICAgIFNBREQxNiAgICBjb2xPcDEwLCBjb2xPcDEwLCBjb25zdDEKLSAgICAgICAgU0FERDE2ICAgIGNvbE9wMTIsIGNvbE9wMTIsIGNvbnN0MQotICAgICAgICBBTkQgICAgIGNvbE9wMTAsIG1hc2ssIGNvbE9wMTAsIEFTUiAjNgotICAgICAgICBBTkQgICAgIGNvbE9wMTIsIG1hc2ssIGNvbE9wMTIsIEFTUiAjNgotICAgICAgICBTU1VCMTYgIG91dDEwLGNvbE9wMTAsY29uc3QyCi0gICAgICAgIFNTVUIxNiAgb3V0MTIsY29sT3AxMixjb25zdDIgICAgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIFRoaXJkIFJvdwotICAgICAgICAKLSAgICAgICAgU0FERDE2ICAgIGNvbE9wMjAsIGNvbE9wMjAsIGNvbnN0MQotICAgICAgICBTQUREMTYgICAgY29sT3AyMiwgY29sT3AyMiwgY29uc3QxCi0gICAgICAgIEFORCAgICAgY29sT3AyMCwgbWFzaywgY29sT3AyMCwgQVNSICM2Ci0gICAgICAgIEFORCAgICAgY29sT3AyMiwgbWFzaywgY29sT3AyMiwgQVNSICM2Ci0gICAgICAgIFNTVUIxNiAgb3V0MjAsY29sT3AyMCxjb25zdDIKLSAgICAgICAgU1NVQjE2ICBvdXQyMixjb2xPcDIyLGNvbnN0MgotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBGb3VydGggUm93ICAgCi0gICAgICAgIAotICAgICAgICBTQUREMTYgICAgY29sT3AzMCwgY29sT3AzMCwgY29uc3QxCi0gICAgICAgIFNBREQxNiAgICBjb2xPcDMyLCBjb2xPcDMyLCBjb25zdDEKLSAgICAgICAgQU5EICAgICBjb2xPcDMwLCBtYXNrLCBjb2xPcDMwLCBBU1IgIzYKLSAgICAgICAgQU5EICAgICBjb2xPcDMyLCBtYXNrLCBjb2xPcDMyLCBBU1IgIzYKLSAgICAgICAgU1NVQjE2ICBvdXQzMCxjb2xPcDMwLGNvbnN0MgotICAgICAgICBTU1VCMTYgIG91dDMyLGNvbE9wMzIsY29uc3QyCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgOy8vIFN0b3JlIGFsbCB0aGUgNHg0IHBpeGVscwotICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgIAotICAgICAgICBTVE1JQSAgIHBEc3Qse291dDAwLG91dDAyLG91dDEwLG91dDEyLG91dDIwLG91dDIyLG91dDMwLG91dDMyfQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAKLSAgICAgICAgOy8vIFNldCByZXR1cm4gdmFsdWUKLSAgICAgICAgCi1FbmQgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgCi0gICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiB0YWlsCi0gICAgICAgIE1fRU5ECi0gICAgICAgIAotICAgIEVORElGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly9BUk0xMTM2SlMgICAgCi0gICAgCi0gICAgCi0KLQotCi0KLQotOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQotICAgIAotICAgICAgICAgICAgCi0gICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDRfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0X3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAyYjRmMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDRfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0X3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDk2NDEKLTsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLSAgICAgICAgCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgICAgCi07Ly8gRGVmaW5lIHRoZSBwcm9jZXNzb3IgdmFyaWFudHMgc3VwcG9ydGVkIGJ5IHRoaXMgZmlsZQotCi0gICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0gICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgSUYgQVJNMTEzNkpTCi0gICAgICAgIAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBJbnB1dCBBcmd1bWVudHMgYW5kIHRoZWlyIHNjb3BlL3VzYWdlCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcHBTcmMgICAgICAgICAgIFJOIDAgICAgOy8vIFBlcnNpc3RlbnQgdmFyaWFibGUKLXBEc3QgICAgICAgICAgICBSTiAxICAgIDsvLyBQZXJzaXN0ZW50IHZhcmlhYmxlCi0KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gVmFyaWFibGVzIGFuZCB0aGVpciBzY29wZS91c2FnZQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBTcmMgICAgICAgICAgICBSTiAyICAgIDsvLyBQZXJzaXN0ZW50IHZhcmlhYmxlcwotRmxhZyAgICAgICAgICAgIFJOIDMgICAgCi1WYWx1ZSAgICAgICAgICAgUk4gNCAgICAKLVZhbHVlMiAgICAgICAgICBSTiA1ICAgIAotc3RyT2Zmc2V0ICAgICAgIFJOIDYgICAgCi1jc3RPZmZzZXQgICAgICAgUk4gNyAgICAKLQotICAgICAgICAKLSAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0LCByNwotICAgICAgICAKLSAgICAgICAgTERSICAgICBwU3JjLCBbcHBTcmNdICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBwU3JjCi0gICAgICAgIE1PViAgICAgY3N0T2Zmc2V0LCAjMzEgICAgICAgICAgICAgICAgICAgICAgOy8vIFRvIGJlIHVzZWQgaW4gdGhlIGxvb3AsIHRvIGNvbXB1dGUgb2Zmc2V0Ci0gICAgICAgIAotICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICA7IEZpcnN0bHksIGZpbGwgYWxsIHRoZSBjb2VmZmljaWVudCB2YWx1ZXMgb24gdGhlIDxwRHN0PiBidWZmZXIgYnkgemVybwotICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAKLSAgICAgICAgTU9WICAgICAgVmFsdWUsICAjMCAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSW5pdGlhbGl6ZSB0aGUgemVybyB2YWx1ZQotICAgICAgICBNT1YgICAgICBWYWx1ZTIsICMwICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJbml0aWFsaXplIHRoZSB6ZXJvIHZhbHVlCi0gICAgICAgIExEUkIgICAgIEZsYWcsICBbcFNyY10sICMxICAgICAgICAgICAgICAgICAgOy8vIFByZWxvYWQgPEZsYWc+IGJlZm9yZSA8dW5wYWNrTG9vcD4KLSAgICAgICAgCi0gICAgICAgIFNUUkQgICAgIFZhbHVlLCBbcERzdCwgIzBdICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMF0gID0gcERzdFsxXSAgPSBwRHN0WzJdICA9IHBEc3RbM10gID0gMAotICAgICAgICBTVFJEICAgICBWYWx1ZSwgW3BEc3QsICM4XSAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzRdICA9IHBEc3RbNV0gID0gcERzdFs2XSAgPSBwRHN0WzddICA9IDAKLSAgICAgICAgU1RSRCAgICAgVmFsdWUsIFtwRHN0LCAjMTZdICAgICAgICAgICAgICAgICA7Ly8gcERzdFs4XSAgPSBwRHN0WzldICA9IHBEc3RbMTBdID0gcERzdFsxMV0gPSAwCi0gICAgICAgIFNUUkQgICAgIFZhbHVlLCBbcERzdCwgIzI0XSAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMTJdID0gcERzdFsxM10gPSBwRHN0WzE0XSA9IHBEc3RbMTVdID0gMAotICAgICAgICAKLSAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICA7Ly8gVGhlIGxvb3AgYmVsb3cgcGFyc2VzIGFuZCB1bnBhY2tzIHRoZSBpbnB1dCBzdHJlYW0uIFRoZSBDLW1vZGVsIGhhcyAKLSAgICAgICAgOy8vIGEgc29tZXdoYXQgY29tcGxpY2F0ZWQgbG9naWMgZm9yIHNpZ24gZXh0ZW5zaW9uLiAgQnV0IGluIHRoZSB2NiB2ZXJzaW9uLAotICAgICAgICA7Ly8gdGhhdCBjYW4gYmUgZWFzaWx5IHRha2VuIGNhcmUgYnkgbG9hZGluZyB0aGUgZGF0YSBmcm9tIDxwU3JjPiBzdHJlYW0gYXMgCi0gICAgICAgIDsvLyBTSUdORUQgYnl0ZS9oYWxmd29yZC4gU28sIGJhc2VkIG9uIHRoZSBmaXJzdCBUU1QgaW5zdHJ1Y3Rpb24sIDgtYml0cyBvciAKLSAgICAgICAgOy8vIDE2LWJpdHMgYXJlIHJlYWQuCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gTmV4dCwgdG8gY29tcHV0ZSB0aGUgb2Zmc2V0LCB3aGVyZSB0aGUgdW5wYWNrZWQgdmFsdWUgbmVlZHMgdG8gYmUgc3RvcmVkLAotICAgICAgICA7Ly8gd2UgbW9kaWZ5IHRoZSBjb21wdXRhdGlvbiB0byBwZXJmb3JtIFsoRmxhZyAmIDE1KSA8IDFdIGFzIFsoRmxhZyA8IDEpICYgMzFdCi0gICAgICAgIDsvLyBUaGlzIHJlc3VsdHMgaW4gYSBzYXZpbmcgb2Ygb25lIGN5Y2xlLgotICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIAotdW5wYWNrTG9vcAotICAgICAgICBUU1QgICAgICBGbGFnLCAgIzB4MTAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ29tcHV0aW5nIChGbGFnICYgMHgxMCkKLSAgICAgICAgTERSU0JORSAgVmFsdWUyLFtwU3JjLCMxXSAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgYnl0ZSB3aXNlIHRvIGF2b2lkIHVuYWxpZ25lZCBhY2Nlc3MgICAKLSAgICAgICAgTERSQk5FICAgVmFsdWUsIFtwU3JjXSwgIzIgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIEFORCAgICAgIHN0ck9mZnNldCwgY3N0T2Zmc2V0LCBGbGFnLCBMU0wgIzEgIDsvLyBzdHJPZmZzZXQgPSAoRmxhZyAmIDE1KSA8IDE7Ci0gICAgICAgIExEUlNCRVEgIFZhbHVlLCBbcFNyY10sICMxICAgICAgICAgICAgICAgICAgIDsvLyBWYWx1ZSA9IChPTVhfVTgpICAqcFNyYysrCi0gICAgICAgIE9SUk5FICAgIFZhbHVlLFZhbHVlLFZhbHVlMiwgTFNMICM4ICAgICAgICAgIDsvLyBWYWx1ZSA9IChPTVhfVTE2KSAqcFNyYysrCi0gICAgICAgIAotICAgICAgICBUU1QgICAgICBGbGFnLCAgIzB4MjAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ29tcHV0aW5nIChGbGFnICYgMHgyMCkgdG8gY2hlY2ssIGlmIHdlJ3JlIGRvbmUKLSAgICAgICAgTERSQkVRICAgRmxhZywgIFtwU3JjXSwgIzEgICAgICAgICAgICAgICAgICAgOy8vIEZsYWcgID0gKE9NWF9VOCkgKnBTcmMrKywgZm9yIG5leHQgaXRlcmF0aW9uCi0gICAgICAgIFNUUkggICAgIFZhbHVlLCBbcERzdCwgc3RyT2Zmc2V0XSAgICAgICAgICAgIDsvLyBTdG9yZSA8VmFsdWU+IGF0IG9mZnNldCA8c3RyT2Zmc2V0PgotICAgICAgICBCRVEgICAgICB1bnBhY2tMb29wICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQnJhbmNoIHRvIHRoZSBsb29wIGJlZ2lubmluZwotICAgICAgICAKLSAgICAgICAgU1RSICAgICAgcFNyYywgW3BwU3JjXSAgICAgICAgICAgICAgICAgICAgICAgOy8vIFVwZGF0ZSB0aGUgYml0c3RyZWFtIHBvaW50ZXIKLSAgICAgICAgTV9FTkQKLSAgICAKLSAgICBFTkRJRgotICAgIAotICAgIAotICAgIAotICAgIEVORAotICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGFkZWE4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kuYworKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogSC4yNjQgaW50cmEgY2hyb21hIGRlYmxvY2sKLSAqIAotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0KLS8qKgotICogRnVuY3Rpb246IG9teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBkZWJsb2NraW5nIGZpbHRlcmluZyBvbiBhbGwgZWRnZXMgb2YgdGhlIGNocm9tYSBtYWNyb2Jsb2NrICgxNngxNikuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwU3JjRHN0ICAgICAgICAgcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jay4gTXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4KLSAqIFtpbl0Jc3JjZHN0U3RlcCAgICAgIFN0ZXAgb2YgdGhlIGFycmF5cwotICogW2luXQlwQWxwaGEgICAgICAgICAgcG9pbnRlciB0byBhIDJ4MiBhcnJheSBvZiBhbHBoYSB0aHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgZm9sbG93czogeyBleHRlcm5hbAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsICB2ZXJ0aWNhbCBlZGdlLCBleHRlcm5hbAotICogICAgICAgICAgICAgICAgICAgICAgICAgaG9yaXpvbnRhbCBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfQotICogW2luXQlwQmV0YQkJCXBvaW50ZXIgdG8gYSAyeDIgYXJyYXkgb2YgYmV0YSB0aHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgZm9sbG93czogeyBleHRlcm5hbAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBleHRlcm5hbCAgaG9yaXpvbnRhbCBlZGdlLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbCAgaG9yaXpvbnRhbCBlZGdlIH0KLSAqIFtpbl0JcFRocmVzaG9sZHMJCUFBcnJheSBvZiBzaXplICA4eDIgb2YgVGhyZXNob2xkcyAoVEMwKSAodmFsdWVzIGZvciB0aGUgbGVmdCBvcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvdmUgZWRnZSBvZiBlYWNoIDR4MiBvciAyeDQgYmxvY2ssIGFycmFuZ2VkIGluICB2ZXJ0aWNhbCBibG9jayBvcmRlcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZW4gaW4gIGhvcml6b250YWwgYmxvY2sgb3JkZXIpCi0gKiBbaW5dCXBCUwkJCQlhcnJheSBvZiBzaXplIDE2eDIgb2YgQlMgcGFyYW1ldGVycyAoYXJyYW5nZWQgaW4gc2NhbiBibG9jayBvcmRlciBmb3IgdmVydGljYWwgZWRnZXMgYW5kIHRoZW4gaG9yaXpvbnRhbCBlZGdlcyk7Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leMV09PSA0LiAgTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4KLSAqIFtvdXRdCXBTcmNEc3QJCXBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2sKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IKLSAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cwotICogICAtIEVpdGhlciBvZiB0aGUgcG9pbnRlcnMgaW4gcFNyY0RzdCwgcEFscGhhLCBwQmV0YSwgcFRyZXNob2xkcywgb3IgcEJTIGlzIE5VTEwuCi0gKiAgIC0gcFNyY0RzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuCi0gKiAgIC0gZWl0aGVyIHBUaHJlc2hvbGRzIG9yIHBCUyBpcyBub3QgNC1ieXRlIGFsaWduZWQuCi0gKiAgIC0gcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCBmb3IgaT49NCwgb3IgKHBCU1tpXT09NCAmJiBwQlNbaV4xXSE9NCkgZm9yIDA8PWk8PTMuCi0gKiAgIC0gc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LgotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JKAotCU9NWF9VOCogcFNyY0RzdCwgCi0JT01YX1MzMiBzcmNkc3RTdGVwLCAKLQljb25zdCBPTVhfVTgqIHBBbHBoYSwgCi0JY29uc3QgT01YX1U4KiBwQmV0YSwgCi0JY29uc3QgT01YX1U4KiBwVGhyZXNob2xkcywKLSAgICBjb25zdCBPTVhfVTggKnBCUwotKQotewotICAgIE9NWFJlc3VsdCBlcnJvckNvZGU7Ci0gICAgCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdCA9PSBOVUxMLCAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDhCeXRlQWxpZ25lZChwU3JjRHN0KSwgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihzcmNkc3RTdGVwICYgNywgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocEFscGhhID09IE5VTEwsICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBCZXRhID09IE5VTEwsICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwVGhyZXNob2xkcyA9PSBOVUxMLCAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBUaHJlc2hvbGRzKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBCUyA9PSBOVUxMLCAgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocEJTKSwgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0KLSAgICBlcnJvckNvZGUgPSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JKAotICAgICAgICBwU3JjRHN0LCBzcmNkc3RTdGVwLCBwQWxwaGEsIHBCZXRhLCBwVGhyZXNob2xkcywgcEJTKTsKLQotICAgIGFybVJldEFyZ0VycklmKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyLCBlcnJvckNvZGUpCi0gICAgCi0gICAgZXJyb3JDb2RlID0gb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSSgKLSAgICAgICAgcFNyY0RzdCwgc3JjZHN0U3RlcCwgcEFscGhhKzIsIHBCZXRhKzIsIHBUaHJlc2hvbGRzKzgsIHBCUysxNik7Ci0KLSAgICByZXR1cm4gZXJyb3JDb2RlOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNDdkYzIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIEguMjY0IGx1bWEgZGVibG9jawotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSAKLQotLyoqCi0gKiBGdW5jdGlvbjogb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGRlYmxvY2sgZmlsdGVyaW5nIHRoZSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBlZGdlcyBvZiBhIGx1bWEgbWFjcm9ibG9jawotICooMTZ4MTYpLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcFNyY0RzdCAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2suIE11c3QgYmUgOC1ieXRlIGFsaWduZWQuCi0gKiBbaW5dCXNyY2RzdFN0ZXAgICAgICBpbWFnZSB3aWR0aAotICogW2luXQlwQWxwaGEgICAgICAgICAgcG9pbnRlciB0byBhIDJ4MiB0YWJsZSBvZiBhbHBoYSB0aHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgZm9sbG93czogeyBleHRlcm5hbAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsIHZlcnRpY2FsIGVkZ2UsIGV4dGVybmFsIGhvcml6b250YWwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfQotICogW2luXQlwQmV0YQkJCXBvaW50ZXIgdG8gYSAyeDIgdGFibGUgb2YgYmV0YSB0aHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgZm9sbG93czogeyBleHRlcm5hbAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBleHRlcm5hbCAgaG9yaXpvbnRhbCBlZGdlLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbCAgaG9yaXpvbnRhbCBlZGdlIH0KLSAqIFtpbl0JcFRocmVzaG9sZHMJCXBvaW50ZXIgdG8gYSAxNngyIHRhYmxlIG9mIHRocmVzaG9sZCAoVEMwKSwgb3JnYW5pemVkIGFzIGZvbGxvd3M6IHsgdmFsdWVzIGZvcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgIGxlZnQgb3IgYWJvdmUgZWRnZSBvZiBlYWNoIDR4NCBibG9jaywgYXJyYW5nZWQgaW4gIHZlcnRpY2FsIGJsb2NrIG9yZGVyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGVuIGluIGhvcml6b250YWwgYmxvY2sgb3JkZXIpCi0gKiBbaW5dCXBCUwkJCQkgcG9pbnRlciB0byBhIDE2eDIgdGFibGUgb2YgQlMgcGFyYW1ldGVycyBhcnJhbmdlZCBpbiBzY2FuIGJsb2NrIG9yZGVyIGZvciB2ZXJ0aWNhbCBlZGdlcyBhbmQgdGhlbiBob3Jpem9udGFsIGVkZ2VzOwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjFdPT0gNC4gIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuCi0gKiBbb3V0XQlwU3JjRHN0CQlwb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvcgotICogT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzCi0gKiAgICAtIEVpdGhlciBvZiB0aGUgcG9pbnRlcnMgaW4gcFNyY0RzdCwgcEFscGhhLCBwQmV0YSwgcFRyZXNob2xkcyBvciBwQlMgaXMgTlVMTC4KLSAqICAgIC0gcFNyY0RzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuCi0gKiAgICAtIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOAotICogICAgLSBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAocEJTW2ldPT00ICYmIHBCU1tpXjFdIT00KSBmb3IgMDw9aTw9My4KLS4KLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMTBfRGVibG9ja0x1bWFfSSgKLQlPTVhfVTgqIHBTcmNEc3QsIAotCU9NWF9TMzIgc3JjZHN0U3RlcCwgCi0JY29uc3QgT01YX1U4KiBwQWxwaGEsIAotCWNvbnN0IE9NWF9VOCogcEJldGEsIAotCWNvbnN0IE9NWF9VOCogcFRocmVzaG9sZHMsIAotCWNvbnN0IE9NWF9VOCAqcEJTCi0pCi17Ci0gICAgT01YUmVzdWx0IGVycm9yQ29kZTsKLSAgICAKLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0ID09IE5VTEwsICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q4Qnl0ZUFsaWduZWQocFNyY0RzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihzcmNkc3RTdGVwICYgNywgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsgICAgCi0gICAgYXJtUmV0QXJnRXJySWYocEFscGhhID09IE5VTEwsICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocEJldGEgPT0gTlVMTCwgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFRocmVzaG9sZHMgPT0gTlVMTCwgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBUaHJlc2hvbGRzKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBCUyA9PSBOVUxMLCAgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocEJTKSwgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0KLSAgICBlcnJvckNvZGUgPSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSSgKLSAgICAgICAgcFNyY0RzdCwgc3JjZHN0U3RlcCwgcEFscGhhLCBwQmV0YSwgcFRocmVzaG9sZHMsIHBCUyk7Ci0KLSAgICBhcm1SZXRBcmdFcnJJZihlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciwgZXJyb3JDb2RlKQotICAgIAotICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JKAotICAgICAgICBwU3JjRHN0LCBzcmNkc3RTdGVwLCBwQWxwaGErMiwgcEJldGErMiwgcFRocmVzaG9sZHMrMTYsIHBCUysxNik7Ci0KLSAgICByZXR1cm4gZXJyb3JDb2RlOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZDY1Y2EuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMuYworKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQy5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogSC4yNjQgZGVjb2RlIGNvZWZmaWNpZW50cyBtb2R1bGUKLSAqIAotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0KLS8qKgotICogRnVuY3Rpb246IG9teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQwotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgQ0FWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgcmFzdGVyIHNjYW4gZm9yIDJ4MiBibG9jayBvZiAKLSAqIENocm9tYURDTGV2ZWwuIFRoZSBkZWNvZGVkIGNvZWZmaWNpZW50cyBpbiBwYWNrZWQgcG9zaXRpb24tY29lZmZpY2llbnQgCi0gKiBidWZmZXIgYXJlIHN0b3JlZCBpbiBpbmNyZWFzaW5nIHJhc3RlciBzY2FuIG9yZGVyLCBuYW1lbHkgcG9zaXRpb24gb3JkZXIuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwcEJpdFN0cmVhbQkJRG91YmxlIHBvaW50ZXIgdG8gY3VycmVudCBieXRlIGluIGJpdCBzdHJlYW0KLSAqCQkJCQkJCQlidWZmZXIKLSAqIFtpbl0JcE9mZnNldAkJCVBvaW50ZXIgdG8gY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgCi0gKgkJCQkJCQkJcG9pbnRlZCB0byBieSAqcHBCaXRTdHJlYW0KLSAqIFtvdXRdCXBwQml0U3RyZWFtCQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQKLSAqIFtvdXRdCXBPZmZzZXQJCQkqcE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZAotICogW291dF0JcE51bUNvZWZmCQlQb2ludGVyIHRvIHRoZSBudW1iZXIgb2Ygbm9uemVybyBjb2VmZmljaWVudHMKLSAqCQkJCQkJCQlpbiB0aGlzIGJsb2NrCi0gKiBbb3V0XQlwcFBvc0NvZWZidWYJRG91YmxlIHBvaW50ZXIgdG8gZGVzdGluYXRpb24gcmVzaWR1YWwKLSAqCQkJCQkJCQljb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlcgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIG9teEVycm9yIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMgKAotICAgICBjb25zdCBPTVhfVTgqKiBwcEJpdFN0cmVhbSwKLSAgICAgT01YX1MzMiogcE9mZnNldCwKLSAgICAgT01YX1U4KiBwTnVtQ29lZmYsCi0gICAgIE9NWF9VOCoqIHBwUG9zQ29lZmJ1ZiAgICAgICAgCi0gKQotCi17Ci0gICAgcmV0dXJuIGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyKHBwQml0U3RyZWFtLCBwT2Zmc2V0LCBwTnVtQ29lZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwUG9zQ29lZmJ1ZiwgMTcsIDQpOwotCi19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Zjk3MDZiLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQy5jCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQy5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogSC4yNjQgZGVjb2RlIGNvZWZmaWNpZW50cyBtb2R1bGUKLSAqIAotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0KLS8qKgotICogRnVuY3Rpb246IG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIENBVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIGZvciA0eDQgYmxvY2sgb2YgCi0gKiBJbnRyYTE2eDE2RENMZXZlbCwgSW50cmExNngxNkFDTGV2ZWwsTHVtYUxldmVsLCBhbmQgQ2hyb21hQUNMZXZlbC4gCi0gKiBJbnZlcnNlIGZpZWxkIHNjYW4gaXMgbm90IHN1cHBvcnRlZC4gVGhlIGRlY29kZWQgY29lZmZpY2llbnRzIGluIHBhY2tlZCAKLSAqIHBvc2l0aW9uLWNvZWZmaWNpZW50IGJ1ZmZlciBhcmUgc3RvcmVkIGluIGluY3JlYXNpbmcgemlnemFnIG9yZGVyIGluc3RlYWQgCi0gKiBvZiBwb3NpdGlvbiBvcmRlci4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBwQml0U3RyZWFtCQlEb3VibGUgcG9pbnRlciB0byBjdXJyZW50IGJ5dGUgaW4gYml0IHN0cmVhbSBidWZmZXIKLSAqIFtpbl0JcE9mZnNldAkJCVBvaW50ZXIgdG8gY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAotICoJCQkJCQkJCXRvIGJ5ICpwcEJpdFN0cmVhbQotICogW2luXQlzTWF4TnVtQ29lZmYJTWF4aW11bSBudW1iZXIgb2Ygbm9uLXplcm8gY29lZmZpY2llbnRzIGluIGN1cnJlbnQKLSAqCQkJCQkJCQlibG9jawotICogW2luXQlzVkxDU2VsZWN0CQlWTEMgdGFibGUgc2VsZWN0b3IsIG9idGFpbmVkIGZyb20gbnVtYmVyIG9mIG5vbi16ZXJvCi0gKgkJCQkJCQkJQUMgY29lZmZpY2llbnRzIG9mIGFib3ZlIGFuZCBsZWZ0IDR4NCBibG9ja3MuIEl0IGlzIAotICoJCQkJCQkJCWVxdWl2YWxlbnQgdG8gdGhlIHZhcmlhYmxlIG5DIGRlc2NyaWJlZCBpbiBILjI2NCBzdGFuZGFyZCAKLSAqCQkJCQkJCQl0YWJsZSA5LTUsIGV4Y2VwdCBpdHMgdmFsdWUgY2Fuoa90IGJlIGxlc3MgdGhhbiB6ZXJvLgotICogW291dF0JcHBCaXRTdHJlYW0JCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZAotICogW291dF0JcE9mZnNldAkJCSpwT2Zmc2V0IGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkCi0gKiBbb3V0XQlwTnVtQ29lZmYJCVBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBub256ZXJvIGNvZWZmaWNpZW50cyBpbgotICoJCQkJCQkJCXRoaXMgYmxvY2sKLSAqIFtvdXRdCXBwUG9zQ29lZmJ1ZglEb3VibGUgcG9pbnRlciB0byBkZXN0aW5hdGlvbiByZXNpZHVhbAotICoJCQkJCQkJCWNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBvbXhFcnJvciByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQygKLSAgICAgY29uc3QgT01YX1U4KiogcHBCaXRTdHJlYW0sCi0gICAgIE9NWF9TMzIqIHBPZmZzZXQsCi0gICAgIE9NWF9VOCogcE51bUNvZWZmLAotICAgICBPTVhfVTgqKnBwUG9zQ29lZmJ1ZiwKLSAgICAgT01YX0lOVCBzVkxDU2VsZWN0LAotICAgICBPTVhfSU5UIHNNYXhOdW1Db2VmZiAgICAgICAgCi0gKQotewotICAgIHJldHVybiBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcihwcEJpdFN0cmVhbSwgcE9mZnNldCwgcE51bUNvZWZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcFBvc0NvZWZidWYsIHNWTENTZWxlY3QsIHNNYXhOdW1Db2VmZik7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGRfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE4N2YyYi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGRfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsNDk0ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNyBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8KLTsvLyBEZXNjcmlwdGlvbjoKLTsvLyBILjI2NCBpbnZlcnNlIHF1YW50aXplIGFuZCB0cmFuc2Zvcm0gbW9kdWxlCi07Ly8gCi07Ly8gCi0KLSAgICAgICAgCi0KLTsvLyBJbmNsdWRlIHN0YW5kYXJkIGhlYWRlcnMKLQotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAgIAotOy8vIEltcG9ydCBzeW1ib2xzIHJlcXVpcmVkIGZyb20gb3RoZXIgZmlsZXMKLTsvLyAoRm9yIGV4YW1wbGUgdGFibGVzKQotICAgIAotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NAotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NAotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9RUERpdlRhYmxlCi0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1ZNYXRyaXhVMTYKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfUVBNb2R1bG9UYWJsZSAKLSAgICAgICAgCi0gICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMsIEFSTTExMzZKU19VCi0gICAgICAgIAotOy8vIFNldCBkZWJ1Z2dpbmcgbGV2ZWwgICAgICAgIAotOy8vREVCVUdfT04gICAgU0VUTCB7VFJVRX0KLQotCi07Ly8gU3RhdGljIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0RlcXVhbnRMdW1hQUM0eDQKLQotOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQotICAgIAotICAgIElGICBBUk0xMTM2SlMgCi0gICAgCi07Ly9JbnB1dCBSZWdpc3RlcnMKLXBTcmNEc3QgICAgICAgUk4gIDAKLVFQICAgICAgICAgICAgUk4gIDEKLQotCi07Ly9PdXRwdXQgUmVnaXN0ZXJzCi0KLQotOy8vTG9jYWwgU2NyYXRjaCBSZWdpc3RlcnMKLXBRUGRpdiAgICAgICAgICBSTiAgNAotcFFQbW9kICAgICAgICAgIFJOICA1Ci1wVlJvdyAgICAgICAgICAgUk4gIDIKLVFQbW9kICAgICAgICAgICBSTiAgNgotc2hpZnQgICAgICAgICAgIFJOICAzCi1yb3dMdW1hMDEgICAgICAgUk4gIDEKLXJvd0x1bWEyMyAgICAgICBSTiAgNAotCi1TcmNEc3QwMCAgICAgICAgUk4gIDUKLVNyY0RzdDAyICAgICAgICBSTiAgNgotU3JjRHN0MTAgICAgICAgIFJOICA3Ci1TcmNEc3QxMiAgICAgICAgUk4gIDgKLVNyY0RzdDIwICAgICAgICBSTiAgOQotU3JjRHN0MjIgICAgICAgIFJOICAxMAotU3JjRHN0MzAgICAgICAgIFJOICAxMQotU3JjRHN0MzIgICAgICAgIFJOICAxMgotCi10ZW1wMSAgICAgICAgICAgUk4gIDIKLXRlbXAyICAgICAgICAgICBSTiAgMwotdGVtcDMgICAgICAgICAgIFJOICAxNAotICAgIAotICAgIAotICAgICAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IHJlcXVpcmVkIGJ5IHRoZSBmdW5jdGlvbgotICAgICAgICAKLSAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfRGVxdWFudEx1bWFBQzR4NCxyMTEKLSAgICAgICAgIAotICAgICAgICBMRFIgICAgcFFQbW9kLD1hcm1WQ000UDEwX1FQTW9kdWxvVGFibGUKLSAgICAgICAgTERSICAgIHBRUGRpdiw9YXJtVkNNNFAxMF9RUERpdlRhYmxlICAgICAgICAKLSAgICAgICAgTERSICAgIHBWUm93LD1hcm1WQ000UDEwX1ZNYXRyaXhVMTYKLSAgICAgICAgIAotICAgICAgICBMRFJTQiAgUVBtb2QsW3BRUG1vZCxRUF0gICAgICAgICAgICAgICAgICAgIDsvLyAoUVAlNikgKiA2Ci0gICAgICAgIExEUlNCICBzaGlmdCxbcFFQZGl2LFFQXSAgICAgICAgICAgICAgICAgICAgOy8vIFNoaWZ0ID0gUVAgLyA2Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIExEUkggICAgcm93THVtYTAxLFtwVlJvdyxRUG1vZF0hICAgICAgICAgICAgIDsvLyByb3dMdW1hMDEgPSBbMDB8MGFdCi0gICAgICAgIExEUkggICAgdGVtcDMsW3BWUm93LCMyXSAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wMyAgICAgPSBbMDB8MGJdICAgCi0gICAgICAgIExEUkggICAgcm93THVtYTIzLFtwVlJvdywjNF0gICAgICAgICAgICAgICAgIDsvLyByb3dMdW1hMjMgPSBbMDB8MGNdIAotICAgICAgICBPUlIgICAgIHJvd0x1bWEwMSxyb3dMdW1hMDEsdGVtcDMsTFNMICMxNiAgICA7Ly8gcm93THVtYTAxID0gWzBifDBhXSAgIAotICAgICAgICAKLSAgICAgICAgOy8vIExvYWQgYWxsIHRoZSAxNiAnc3JjJyB2YWx1ZXMKLSAgICAgICAgTERNSUEgICBwU3JjRHN0LHtTcmNEc3QwMCxTcmNEc3QwMixTcmNEc3QxMCxTcmNEc3QxMixTcmNEc3QyMCxTcmNEc3QyMixTcmNEc3QzMCxTcmNEc3QzMn0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAnU2hpZnQnIHJhbmdlcyBiZXR3ZWVuIFswLDhdIAotICAgICAgICA7Ly8gU28gd2UgY2FuIHNoaWZ0IHRoZSBwYWNrZWQgcm93THVtYSB2YWx1ZXMgWzBifDBhXSB3aXRoIGEgc2luZ2xlIExTTCBvcGVyYXRpb24KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAKLSAgICAgICAgTFNMICAgIHJvd0x1bWEwMSxyb3dMdW1hMDEsc2hpZnQKLSAgICAgICAgTFNMICAgIHJvd0x1bWEyMyxyb3dMdW1hMjMsc2hpZnQKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gVGhlIGlkZWEgaXMgdG8gdW5yb2xsIHRoZSBMb29wIGNvbXBsZXRlbHkKLSAgICAgICAgOy8vIEFsbCB0aGUgMTYgc3JjIHZhbHVlcyBhcmUgbG9hZGVkIGF0IG9uY2UgaW50byA4IHJlZ2lzdGVycyA6IFNyY0RzdDx5Pjx4PiAoYWJvdmUpCi0gICAgICAgIDsvLyAwPD0gYXJtVkNNNFAxMF9Qb3NUb1ZDb2w0eDRbaV0gPD0yIGZvciBhbnkgJ2k8MTYnIAotICAgICAgICA7Ly8gU28gdGhlIG9ubHkgdmFsdWVzIG9mIHBWUm93W2ldIHRoYXQgbmVlZCB0byBiZSBsb2FkZWQgYXJlIGZvciBpPTAsMSwyCi0gICAgICAgIDsvLyBUaGVzZSAzIHZhbHVlcyBhcmUgbG9hZGVkIGludG8gcm93THVtYTAxIGFuZCByb3dMdW1hMjMgKGFib3ZlKQotICAgICAgICA7Ly8gV2UgZmlyc3QgY2FsY3VsYXRlIHBWUm93W2FybVZDTTRQMTBfUG9zVG9WQ29sNHg0W2ldXSkgPDwgU2hpZnQgd2hpY2ggZml0cyBpbnRvIDE2IGJpdHMgKGFib3ZlKQotICAgICAgICA7Ly8gVGhlbiB0aGUgcHJvZHVjdCBwU3JjRHN0W2ldICogKHBWUm93W2FybVZDTTRQMTBfUG9zVG9WQ29sNHg0W2ldXSA8PCBTaGlmdCkgaXMgY2FsY3VsYXRlZAotICAgICAgICA7Ly8gSGVyZSB3ZSBpbnRlcmxlYXZlIHRoZSBQS0hCVCBvcGVyYXRpb25zIGZvciB2YXJpb3VzIHJvd3MgIHRvIGF2b2lkZSBwaXBlbGluZSBzdGFsbHMKLSAgICAgICAgOy8vIAotICAgICAgICA7Ly8gV2UgdGhlbiBwYWNrIHRoZSB0d28gMTYgYml0IG11bHRpcGxpY2F0aW9uIHJlc3VsdCBpbnRvIGEgd29yZCBhbmQgc3RvcmUgYXQgb25lIGdvCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIFJvdyAxCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgU01VTFRCICB0ZW1wMSxTcmNEc3QwMCxyb3dMdW1hMjMgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzFdICogKHBWUm93WzJdPDxTaGlmdCkgCi0gICAgICAgIFNNVUxCQiAgU3JjRHN0MDAsU3JjRHN0MDAscm93THVtYTAxICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFswXSAqIChwVlJvd1swXTw8U2hpZnQpICAKLSAgICAgICAgCi0gICAgICAgIFNNVUxUQiAgdGVtcDIsU3JjRHN0MDIscm93THVtYTIzICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFszXSAqIChwVlJvd1syXTw8U2hpZnQpIAotICAgICAgICBTTVVMQkIgIFNyY0RzdDAyLFNyY0RzdDAyLHJvd0x1bWEwMSAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbMl0gKiAocFZSb3dbMF08PFNoaWZ0KQotICAgICAgICAKLSAgICAgICAgUEtIQlQgICBTcmNEc3QwMCxTcmNEc3QwMCx0ZW1wMSxMU0wgIzE2ICAgICAgICAgICAgIDsvLyBQYWNrIHRoZSBmaXJzdCB0d28gcHJvZHVjdCB2YWx1ZXMKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIDsvLyBSb3cgMgotICAgICAgICBTTVVMVFQgIHRlbXAxLFNyY0RzdDEwLHJvd0x1bWEwMSAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbNV0gKiAocFZSb3dbMV08PFNoaWZ0KQotICAgICAgICBTTVVMQkIgIFNyY0RzdDEwLFNyY0RzdDEwLHJvd0x1bWEyMyAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbNF0gKiAocFZSb3dbMl08PFNoaWZ0KQotICAgICAgICAKLSAgICAgICAgUEtIQlQgICBTcmNEc3QwMixTcmNEc3QwMix0ZW1wMixMU0wgIzE2ICAgICAgICAgICAgIDsvLyBQYWNrIHRoZSBuZXh0IHR3byBwcm9kdWN0IHZhbHVlcwotICAgICAgICBTTVVMVFQgIHRlbXAyLFNyY0RzdDEyLHJvd0x1bWEwMSAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbN10gKiAocFZSb3dbMV08PFNoaWZ0KQotICAgICAgICBTTVVMQkIgIFNyY0RzdDEyLFNyY0RzdDEyLHJvd0x1bWEyMyAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbNl0gKiAocFZSb3dbMl08PFNoaWZ0KQotICAgICAgICAKLSAgICAgICAgUEtIQlQgICBTcmNEc3QxMCxTcmNEc3QxMCx0ZW1wMSxMU0wgIzE2ICAgICAgICAgICAgIDsvLyBQYWNrIHRoZSBuZXh0IHR3byBwcm9kdWN0IHZhbHVlcwotICAgICAgICAKLSAgICAgICAgICAgICAgIAotICAgICAgICA7Ly8gUm93IDMgICAgCi0gICAgICAgIAotICAgICAgICBTTVVMVEIgIHRlbXAxLFNyY0RzdDIwLHJvd0x1bWEyMyAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbOV0gKiAocFZSb3dbMl08PFNoaWZ0KSAgICAgICAgIAotICAgICAgICBTTVVMQkIgIFNyY0RzdDIwLFNyY0RzdDIwLHJvd0x1bWEwMSAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbOF0gKiAocFZSb3dbMF08PFNoaWZ0KSAgCi0gICAgICAgCi0gICAgICAgIFBLSEJUICAgU3JjRHN0MTIsU3JjRHN0MTIsdGVtcDIsTFNMICMxNiAgICAgICAgICAgICAgIDsvLyBQYWNrIHRoZSBuZXh0IHR3byBwcm9kdWN0IHZhbHVlcwotICAgICAgICBTTVVMVEIgIHRlbXAyLFNyY0RzdDIyLHJvd0x1bWEyMyAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbMTFdICogKHBWUm93WzJdPDxTaGlmdCkgCi0gICAgICAgIFNNVUxCQiAgU3JjRHN0MjIsU3JjRHN0MjIscm93THVtYTAxICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFsxMF0gKiAocFZSb3dbMF08PFNoaWZ0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFBLSEJUICAgU3JjRHN0MjAsU3JjRHN0MjAsdGVtcDEsTFNMICMxNiAgICAgICAgICAgICA7Ly8gUGFjayB0aGUgbmV4dCB0d28gcHJvZHVjdCB2YWx1ZXMKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIDsvLyBSb3cgNCAgIAotICAgICAgICAKLSAgICAgICAgU01VTFRUICB0ZW1wMSxTcmNEc3QzMCxyb3dMdW1hMDEgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzEzXSAqIChwVlJvd1sxXTw8U2hpZnQpCi0gICAgICAgIFNNVUxCQiAgU3JjRHN0MzAsU3JjRHN0MzAscm93THVtYTIzICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFsxMl0gKiAocFZSb3dbMl08PFNoaWZ0KQotICAgICAgICAKLSAgICAgICAgU01VTFRUICB0ZW1wMyxTcmNEc3QzMixyb3dMdW1hMDEgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzE1XSAqIChwVlJvd1sxXTw8U2hpZnQpCi0gICAgICAgIFNNVUxCQiAgU3JjRHN0MzIsU3JjRHN0MzIscm93THVtYTIzICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFsxNF0gKiAocFZSb3dbMl08PFNoaWZ0KQotICAgICAgIAotICAgICAgICBQS0hCVCAgIFNyY0RzdDIyLFNyY0RzdDIyLHRlbXAyLExTTCAjMTYgICAgICAgICAgICAgOy8vIFBhY2sgdGhlIHJlbWFpbmluZyBwcm9kdWN0IHZhbHVlcwotICAgICAgICBQS0hCVCAgIFNyY0RzdDMwLFNyY0RzdDMwLHRlbXAxLExTTCAjMTYKLSAgICAgICAgUEtIQlQgICBTcmNEc3QzMixTcmNEc3QzMix0ZW1wMyxMU0wgIzE2Ci0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgU1RNSUEgICBwU3JjRHN0LHtTcmNEc3QwMCxTcmNEc3QwMixTcmNEc3QxMCxTcmNEc3QxMixTcmNEc3QyMCxTcmNEc3QyMixTcmNEc3QzMCxTcmNEc3QzMn0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gU2V0IHJldHVybiB2YWx1ZQotICAgICAgICAgIAotICAgICAgICAgICAKLSAgICAgIAotICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gdGFpbAotICAgICAgICBNX0VORAotICAgICAgICAKLSAgICBFTkRJRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly9BUk0xMTM2SlMgICAgICAgIAotIAotCi07Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCi0gICAgCi0gICAgSUYgIEFSTTExMzZKU19VCi0gICAgCi07Ly9JbnB1dCBSZWdpc3RlcnMKLXBTcmNEc3QgICAgICAgUk4gIDAKLVFQICAgICAgICAgICAgUk4gIDEKLQotCi07Ly9PdXRwdXQgUmVnaXN0ZXJzCi0KLQotOy8vTG9jYWwgU2NyYXRjaCBSZWdpc3RlcnMKLXBRUGRpdiAgICAgICAgICBSTiAgNAotcFFQbW9kICAgICAgICAgIFJOICA1Ci1wVlJvdyAgICAgICAgICAgUk4gIDIKLVFQbW9kICAgICAgICAgICBSTiAgNgotc2hpZnQgICAgICAgICAgIFJOICAzCi1yb3dMdW1hMDEgICAgICAgUk4gIDEKLXJvd0x1bWEyMyAgICAgICBSTiAgNAotCi1TcmNEc3QwMCAgICAgICAgUk4gIDUKLVNyY0RzdDAyICAgICAgICBSTiAgNgotU3JjRHN0MTAgICAgICAgIFJOICA3Ci1TcmNEc3QxMiAgICAgICAgUk4gIDgKLVNyY0RzdDIwICAgICAgICBSTiAgOQotU3JjRHN0MjIgICAgICAgIFJOICAxMAotU3JjRHN0MzAgICAgICAgIFJOICAxMQotU3JjRHN0MzIgICAgICAgIFJOICAxMgotCi10ZW1wMSAgICAgICAgICAgUk4gIDIKLXRlbXAyICAgICAgICAgICBSTiAgMwotdGVtcDMgICAgICAgICAgIFJOICAxNAotICAgIAotICAgIAotICAgICAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IHJlcXVpcmVkIGJ5IHRoZSBmdW5jdGlvbgotICAgICAgICAKLSAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfRGVxdWFudEx1bWFBQzR4NCxyMTEKLSAgICAgICAgIAotICAgICAgICBMRFIgICAgcFFQbW9kLD1hcm1WQ000UDEwX1FQTW9kdWxvVGFibGUKLSAgICAgICAgTERSICAgIHBRUGRpdiw9YXJtVkNNNFAxMF9RUERpdlRhYmxlICAgICAgICAKLSAgICAgICAgTERSICAgIHBWUm93LD1hcm1WQ000UDEwX1ZNYXRyaXhVMTYKLSAgICAgICAgIAotICAgICAgICBMRFJTQiAgUVBtb2QsW3BRUG1vZCxRUF0gICAgICAgICAgICAgICAgICAgIDsvLyAoUVAlNikgKiA2Ci0gICAgICAgIExEUlNCICBzaGlmdCxbcFFQZGl2LFFQXSAgICAgICAgICAgICAgICAgICAgOy8vIFNoaWZ0ID0gUVAgLyA2Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIExEUiAgICByb3dMdW1hMDEsW3BWUm93LFFQbW9kXSEgICAgICAgICAgICAgOy8vIHJvd0x1bWEwMSA9IFswYnwwYV0KLSAgICAgICAgTERSICAgIHJvd0x1bWEyMyxbcFZSb3csIzRdICAgICAgICAgICAgICAgICA7Ly8gcm93THVtYTIzID0gWzBkfDBjXSAgICAKLQotICAgICAgICA7Ly8gTG9hZCBhbGwgdGhlIDE2ICdzcmMnIHZhbHVlcwotICAgICAgICBMRE1JQSAgIHBTcmNEc3Qse1NyY0RzdDAwLFNyY0RzdDAyLFNyY0RzdDEwLFNyY0RzdDEyLFNyY0RzdDIwLFNyY0RzdDIyLFNyY0RzdDMwLFNyY0RzdDMyfQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICdTaGlmdCcgcmFuZ2VzIGJldHdlZW4gWzAsOF0gCi0gICAgICAgIDsvLyBTbyB3ZSBjYW4gc2hpZnQgdGhlIHBhY2tlZCByb3dMdW1hIHZhbHVlcyBbMGJ8MGFdIHdpdGggYSBzaW5nbGUgTFNMIG9wZXJhdGlvbgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgIAotICAgICAgICBMU0wgICAgcm93THVtYTAxLHJvd0x1bWEwMSxzaGlmdAotICAgICAgICBMU0wgICAgcm93THVtYTIzLHJvd0x1bWEyMyxzaGlmdAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBUaGUgaWRlYSBpcyB0byB1bnJvbGwgdGhlIExvb3AgY29tcGxldGVseQotICAgICAgICA7Ly8gQWxsIHRoZSAxNiBzcmMgdmFsdWVzIGFyZSBsb2FkZWQgYXQgb25jZSBpbnRvIDggcmVnaXN0ZXJzIDogU3JjRHN0PHk+PHg+IChhYm92ZSkKLSAgICAgICAgOy8vIDA8PSBhcm1WQ000UDEwX1Bvc1RvVkNvbDR4NFtpXSA8PTIgZm9yIGFueSAnaTwxNicgCi0gICAgICAgIDsvLyBTbyB0aGUgb25seSB2YWx1ZXMgb2YgcFZSb3dbaV0gdGhhdCBuZWVkIHRvIGJlIGxvYWRlZCBhcmUgZm9yIGk9MCwxLDIKLSAgICAgICAgOy8vIFRoZXNlIDMgdmFsdWVzIGFyZSBsb2FkZWQgaW50byByb3dMdW1hMDEgYW5kIHJvd0x1bWEyMyAoYWJvdmUpCi0gICAgICAgIDsvLyBXZSBmaXJzdCBjYWxjdWxhdGUgcFZSb3dbYXJtVkNNNFAxMF9Qb3NUb1ZDb2w0eDRbaV1dKSA8PCBTaGlmdCB3aGljaCBmaXRzIGludG8gMTYgYml0cyAoYWJvdmUpCi0gICAgICAgIDsvLyBUaGVuIHRoZSBwcm9kdWN0IHBTcmNEc3RbaV0gKiAocFZSb3dbYXJtVkNNNFAxMF9Qb3NUb1ZDb2w0eDRbaV1dIDw8IFNoaWZ0KSBpcyBjYWxjdWxhdGVkCi0gICAgICAgIDsvLyBIZXJlIHdlIGludGVybGVhdmUgdGhlIFBLSEJUIG9wZXJhdGlvbnMgZm9yIHZhcmlvdXMgcm93cyAgdG8gYXZvaWRlIHBpcGVsaW5lIHN0YWxscwotICAgICAgICA7Ly8gCi0gICAgICAgIDsvLyBXZSB0aGVuIHBhY2sgdGhlIHR3byAxNiBiaXQgbXVsdGlwbGljYXRpb24gcmVzdWx0IGludG8gYSB3b3JkIGFuZCBzdG9yZSBhdCBvbmUgZ28KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gUm93IDEKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBTTVVMVEIgIHRlbXAxLFNyY0RzdDAwLHJvd0x1bWEyMyAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbMV0gKiAocFZSb3dbMl08PFNoaWZ0KSAKLSAgICAgICAgU01VTEJCICBTcmNEc3QwMCxTcmNEc3QwMCxyb3dMdW1hMDEgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzBdICogKHBWUm93WzBdPDxTaGlmdCkgIAotICAgICAgICAKLSAgICAgICAgU01VTFRCICB0ZW1wMixTcmNEc3QwMixyb3dMdW1hMjMgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzNdICogKHBWUm93WzJdPDxTaGlmdCkgCi0gICAgICAgIFNNVUxCQiAgU3JjRHN0MDIsU3JjRHN0MDIscm93THVtYTAxICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFsyXSAqIChwVlJvd1swXTw8U2hpZnQpCi0gICAgICAgIAotICAgICAgICBQS0hCVCAgIFNyY0RzdDAwLFNyY0RzdDAwLHRlbXAxLExTTCAjMTYgICAgICAgICAgICAgOy8vIFBhY2sgdGhlIGZpcnN0IHR3byBwcm9kdWN0IHZhbHVlcwotICAgICAgICAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgOy8vIFJvdyAyCi0gICAgICAgIFNNVUxUVCAgdGVtcDEsU3JjRHN0MTAscm93THVtYTAxICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFs1XSAqIChwVlJvd1sxXTw8U2hpZnQpCi0gICAgICAgIFNNVUxCQiAgU3JjRHN0MTAsU3JjRHN0MTAscm93THVtYTIzICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFs0XSAqIChwVlJvd1syXTw8U2hpZnQpCi0gICAgICAgIAotICAgICAgICBQS0hCVCAgIFNyY0RzdDAyLFNyY0RzdDAyLHRlbXAyLExTTCAjMTYgICAgICAgICAgICAgOy8vIFBhY2sgdGhlIG5leHQgdHdvIHByb2R1Y3QgdmFsdWVzCi0gICAgICAgIFNNVUxUVCAgdGVtcDIsU3JjRHN0MTIscm93THVtYTAxICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFs3XSAqIChwVlJvd1sxXTw8U2hpZnQpCi0gICAgICAgIFNNVUxCQiAgU3JjRHN0MTIsU3JjRHN0MTIscm93THVtYTIzICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFs2XSAqIChwVlJvd1syXTw8U2hpZnQpCi0gICAgICAgIAotICAgICAgICBQS0hCVCAgIFNyY0RzdDEwLFNyY0RzdDEwLHRlbXAxLExTTCAjMTYgICAgICAgICAgICAgOy8vIFBhY2sgdGhlIG5leHQgdHdvIHByb2R1Y3QgdmFsdWVzCi0gICAgICAgIAotICAgICAgICAgICAgICAgCi0gICAgICAgIDsvLyBSb3cgMyAgICAKLSAgICAgICAgCi0gICAgICAgIFNNVUxUQiAgdGVtcDEsU3JjRHN0MjAscm93THVtYTIzICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFs5XSAqIChwVlJvd1syXTw8U2hpZnQpICAgICAgICAgCi0gICAgICAgIFNNVUxCQiAgU3JjRHN0MjAsU3JjRHN0MjAscm93THVtYTAxICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFs4XSAqIChwVlJvd1swXTw8U2hpZnQpICAKLSAgICAgICAKLSAgICAgICAgUEtIQlQgICBTcmNEc3QxMixTcmNEc3QxMix0ZW1wMixMU0wgIzE2ICAgICAgICAgICAgICAgOy8vIFBhY2sgdGhlIG5leHQgdHdvIHByb2R1Y3QgdmFsdWVzCi0gICAgICAgIFNNVUxUQiAgdGVtcDIsU3JjRHN0MjIscm93THVtYTIzICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFsxMV0gKiAocFZSb3dbMl08PFNoaWZ0KSAKLSAgICAgICAgU01VTEJCICBTcmNEc3QyMixTcmNEc3QyMixyb3dMdW1hMDEgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzEwXSAqIChwVlJvd1swXTw8U2hpZnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgUEtIQlQgICBTcmNEc3QyMCxTcmNEc3QyMCx0ZW1wMSxMU0wgIzE2ICAgICAgICAgICAgIDsvLyBQYWNrIHRoZSBuZXh0IHR3byBwcm9kdWN0IHZhbHVlcwotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgOy8vIFJvdyA0ICAgCi0gICAgICAgIAotICAgICAgICBTTVVMVFQgIHRlbXAxLFNyY0RzdDMwLHJvd0x1bWEwMSAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbMTNdICogKHBWUm93WzFdPDxTaGlmdCkKLSAgICAgICAgU01VTEJCICBTcmNEc3QzMCxTcmNEc3QzMCxyb3dMdW1hMjMgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzEyXSAqIChwVlJvd1syXTw8U2hpZnQpCi0gICAgICAgIAotICAgICAgICBTTVVMVFQgIHRlbXAzLFNyY0RzdDMyLHJvd0x1bWEwMSAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbMTVdICogKHBWUm93WzFdPDxTaGlmdCkKLSAgICAgICAgU01VTEJCICBTcmNEc3QzMixTcmNEc3QzMixyb3dMdW1hMjMgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzE0XSAqIChwVlJvd1syXTw8U2hpZnQpCi0gICAgICAgCi0gICAgICAgIFBLSEJUICAgU3JjRHN0MjIsU3JjRHN0MjIsdGVtcDIsTFNMICMxNiAgICAgICAgICAgICA7Ly8gUGFjayB0aGUgcmVtYWluaW5nIHByb2R1Y3QgdmFsdWVzCi0gICAgICAgIFBLSEJUICAgU3JjRHN0MzAsU3JjRHN0MzAsdGVtcDEsTFNMICMxNgotICAgICAgICBQS0hCVCAgIFNyY0RzdDMyLFNyY0RzdDMyLHRlbXAzLExTTCAjMTYKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBTVE1JQSAgIHBTcmNEc3Qse1NyY0RzdDAwLFNyY0RzdDAyLFNyY0RzdDEwLFNyY0RzdDEyLFNyY0RzdDIwLFNyY0RzdDIyLFNyY0RzdDMwLFNyY0RzdDMyfQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBTZXQgcmV0dXJuIHZhbHVlCi0gICAgICAgICAgCi0gICAgICAgICAgIAotICAgICAgCi0gICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiB0YWlsCi0gICAgICAgIE1fRU5ECi0gICAgICAgIAotICAgIEVORElGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvL0FSTTExMzZKU19VICAgICAgICAKLQotCi0KLQotCi07Ly8gRnVuY3Rpb246IG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQgICAgICAgICAgICAKLSAgICAKLTsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKLSAgICAKLSAgICBJRiAgQVJNMTEzNkpTCi0gICAgCi07Ly9JbnB1dCBSZWdpc3RlcnMKLXBwU3JjICAgICAgIFJOICAwCi1wUHJlZCAgICAgICBSTiAgMQotcERDICAgICAgICAgUk4gIDIKLXBEc3QgICAgICAgIFJOICAzCi0gICAKLQotOy8vT3V0cHV0IFJlZ2lzdGVycwotcmVzdWx0ICAgICAgUk4gIDAKLQotOy8vTG9jYWwgU2NyYXRjaCBSZWdpc3RlcnMKLXBEZWx0YSAgICAgIFJOICA0Ci1wRGVsdGFUbXAgICBSTiAgNgotQUMgICAgICAgICAgUk4gIDUgICAgICAgICAgICAgICAgICAgOy8vTG9hZCBmcm9tIHN0YWNrCi1wUHJlZFRlbXAgICBSTiAgNwotcERDVGVtcCAgICAgUk4gIDgKLXBEc3RUZW1wICAgIFJOICA5Ci1wRGVsdGFBcmcxICBSTiAgMQotcERlbHRhQXJnMCAgUk4gIDAKLVFQICAgICAgICAgIFJOICAxICAgICAgICAgICAgICAgICAgIDsvL0xvYWQgZnJvbSBzdGFjawotREN2YWwgICAgICAgUk4gIDEwICAKLURDdmFsQ29weSAgIFJOICAxMQotcHJlZHN0ZXAgICAgUk4gIDEKLWRzdFN0ZXAgICAgIFJOICAxMAoteWNvdW50ZXIgICAgUk4gIDAKLVByZWRWYWwxICAgIFJOICAzCi1QcmVkVmFsMiAgICBSTiAgNQotRGVsdGFWYWwxICAgUk4gIDIKLURlbHRhVmFsMiAgIFJOICAxMQotUHJlZFZhbCAgICAgUk4gIDgKLXRtcERlbHRhVmFsIFJOICA2Ci1zdW0xICAgICAgICBSTiAgMTIKLXN1bTIgICAgICAgIFJOICAxNAotICAgIAotICAgIAotICAgICAgICAgICAKLSAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IHJlcXVpcmVkIGJ5IHRoZSBmdW5jdGlvbgotICAgICAgICBNX0FMTE9DOCBwQnVmZmVyLCAzMgotICAgICAgICAgICAgICAgCi0KLSAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIE1fU1RBUlQgb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCxyMTEKLSAgICAgICAgCi0gICAgICAgIDsvLyBEZWZpbmUgc3RhY2sgYXJndW1lbnRzCi0gICAgICAgIE1fQVJHICAgcHJlZFN0ZXBPblN0YWNrLCA0Ci0gICAgICAgIE1fQVJHICAgZHN0U3RlcE9uU3RhY2ssNAotICAgICAgICBNX0FSRyAgIFFQT25TdGFjaywgNAotICAgICAgICBNX0FSRyAgIEFDT25TdGFjayw0Ci0gIAotICAgICAgICAKLSAgICAgICAgTV9BRFIgICBwRGVsdGEscEJ1ZmZlciAKLSAgICAgICAgTV9MRFIgICBBQyxBQ09uU3RhY2sgCi0gICAgICAgIAotICAgICAgICAgCi0gICAgICAgIDsvLyBTYXZlIHJlZ2lzdGVycyByMSxyMixyMyBiZWZvcmUgZnVuY3Rpb24gY2FsbCAgICAKLSAgICAgICAgTU9WICAgICBwUHJlZFRlbXAscFByZWQKLSAgICAgICAgTU9WICAgICBwRENUZW1wLHBEQwotICAgICAgICBNT1YgICAgIHBEc3RUZW1wLHBEc3QKLSAgICAgICAgCi0gICAgICAgIENNUCAgICAgQUMsIzAKLSAgICAgICAgQkVRICAgICBEQ2Nhc2UKLSAgICAgICAgTU9WICAgICBwRGVsdGFBcmcxLHBEZWx0YSAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTZXQgdXAgcjEgZm9yIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQKLSAgICAKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0Ci0gICAgCi0gICAgICAgIE1fTERSICAgUVAsUVBPblN0YWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2V0IHVwIHIxIGZvciBEZXF1YW50THVtYUFDNHg0Ci0gICAgICAgIE1PViAgICAgcERlbHRhQXJnMCxwRGVsdGEgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2V0IHVwIHIwIGZvciBEZXF1YW50THVtYUFDNHg0Ci0KLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0RlcXVhbnRMdW1hQUM0eDQKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBDTVAgICAgIHBEQ1RlbXAsIzAKLSAgICAgICAgTERSU0hORSBEQ3ZhbCxbcERDVGVtcF0KLSAgICAgICAgTU9WICAgICBwRGVsdGFBcmcwLHBEZWx0YSAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTZXQgdXAgcjAgZm9yIGFybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQKLSAgICAgICAgTU9WICAgICBwRGVsdGFBcmcxLHBEZWx0YSAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTZXQgdXAgcjEgZm9yIGFybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQKLSAgICAgICAgU1RSSE5FICBEQ3ZhbCxbcERlbHRhXQotICAgICAgICAKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0Ci0gICAgICAgIEIgICAgICAgT3V0RENjYXNlIAotICAgICAgICAKLQotRENjYXNlCi0gICAgICAgIExEUlNIICAgREN2YWwsW3BEQ1RlbXBdIAotICAgICAgICBBREQgICAgIERDdmFsLERDdmFsLCMzMiAKLSAgICAgICAgQVNSICAgICBEQ3ZhbCxEQ3ZhbCwjNgotICAgICAgICBQS0hCVCAgIERDdmFsLERDdmFsLERDdmFsLExTTCAjMTYgICAgICAgICAgICAgICAgICA7Ly8gRHVwbGljYXRpbmcgdGhlIExvd2VyIGhhbGZ3b3JkCi0gICAgICAgIE1PViAgICAgREN2YWxDb3B5LCBEQ3ZhbCAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBOZWVkZWQgZm9yIFNUUkQKLSAgICAgICAgU1RSRCAgICBEQ3ZhbCwgW3BEZWx0YSwgIzBdICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBEZWx0YVswXSAgPSBwRGVsdGFbMV0gID0gcERlbHRhWzJdICA9IHBEZWx0YVszXSA9IERDdmFsCi0gICAgICAgIFNUUkQgICAgREN2YWwsIFtwRGVsdGEsICM4XSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwRGVsdGFbNF0gID0gcERlbHRhWzVdICA9IHBEZWx0YVs2XSAgPSBwRGVsdGFbN10gPSBEQ3ZhbAotICAgICAgICBTVFJEICAgIERDdmFsLCBbcERlbHRhLCAjMTZdICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcERlbHRhWzhdICA9IHBEZWx0YVs5XSAgPSBwRGVsdGFbMTBdID0gcERlbHRhWzExXSA9IERDdmFsCi0gICAgICAgIFNUUkQgICAgREN2YWwsIFtwRGVsdGEsICMyNF0gICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAKLU91dERDY2FzZSAgICAgIAotICAgICAgICBNX0xEUiAgIHByZWRzdGVwLHByZWRTdGVwT25TdGFjawotICAgICAgICBNX0xEUiAgIGRzdFN0ZXAsZHN0U3RlcE9uU3RhY2sKLSAgICAgICAgCi0gICAgICAgIExETUlBICAgcERlbHRhISx7dG1wRGVsdGFWYWwsRGVsdGFWYWwyfSAgICAgICAgICAgICA7Ly8gUHJlIGxvYWQKLSAgICAgICAgTU9WICAgICB5Y291bnRlciwjNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDb3VudGVyIGZvciB0aGUgUHJlZFBsdXNEZWx0YUxvb3AKLSAgICAgICAgTERSICAgICBQcmVkVmFsLFtwUHJlZFRlbXBdICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBQcmUgbG9hZAotCi1QcmVkUGx1c0RlbHRhTG9vcAotICAgICAgICAKLSAgICAgICAKLSAgICAgICAgU1VCUyAgICB5Y291bnRlcix5Y291bnRlciwjMQotICAgICAgICBBREQgICAgIHBQcmVkVGVtcCxwUHJlZFRlbXAscHJlZHN0ZXAgICAgICAgICAgICAgICAgOy8vIEluY3JlbWVudCBwUHJlZCBwdHIKLSAgICAgICAgCi0gICAgICAgIFBLSEJUICAgRGVsdGFWYWwxLHRtcERlbHRhVmFsLERlbHRhVmFsMixMU0wgIzE2ICAgICA7Ly8gRGVsdGF2YWwxID0gW0MgQV0gICAKLSAgICAgICAgUEtIVEIgICBEZWx0YVZhbDIsRGVsdGFWYWwyLHRtcERlbHRhVmFsLEFTUiAjMTYgICAgIDsvLyBEZWx0YVZhbDIgPSBbRCBCXQotICAgICAgICAKLSAgICAgICAgVVhUQjE2ICBQcmVkVmFsMSxQcmVkVmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBQcmVkVmFsMSA9IFswYzBhXQotICAgICAgICBVWFRCMTYgIFByZWRWYWwyLFByZWRWYWwsUk9SICM4ICAgICAgICAgICAgICAgICAgICAgOy8vIFByZWRWYWwyID0gWzBkMGJdCi0gICAgICAgIAotICAgICAgICBMRFJHVCAgIFByZWRWYWwsW3BQcmVkVGVtcF0gICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFByZSBsb2FkCi0gICAgICAgIAotICAgICAgICBRQUREMTYgIHN1bTIsRGVsdGFWYWwyLFByZWRWYWwyICAgICAgICAgICAgICAgICAgICAgOy8vIEFkZCBhbmQgc2F0dXJhdGUgdG8gMTYgYml0cwotICAgICAgICBRQUREMTYgIHN1bTEsRGVsdGFWYWwxLFByZWRWYWwxCi0gICAgICAgIAotICAgICAgICBVU0FUMTYgIHN1bTIsIzgsc3VtMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGFybUNsaXAoMCwyNTUsc3VtMikKLSAgICAgICAgVVNBVDE2ICBzdW0xLCM4LHN1bTEKLSAgICAgICAgCi0gICAgICAgIExETUdUSUEgICBwRGVsdGEhLHt0bXBEZWx0YVZhbCxEZWx0YVZhbDJ9ICAgICAgICAgICA7Ly8gUHJlIGxvYWQKLSAgICAgICAgICAKLSAgICAgICAgT1JSICAgICBzdW0xLHN1bTEsc3VtMixMU0wgIzggICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdW0xID0gW2RjYmFdCi0gICAgICAgIFNUUiAgICAgc3VtMSxbcERzdFRlbXBdCi0gICAgICAgIAotICAgICAgICBBREQgICAgIHBEc3RUZW1wLHBEc3RUZW1wLGRzdFN0ZXAgICAgICAgICAgICAgICAgICAgOy8vIEluY3JlbWVudCBwRHN0IHB0cgotICAgICAgICBCR1QgICAgIFByZWRQbHVzRGVsdGFMb29wICAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gU2V0IHJldHVybiB2YWx1ZQotICAgICAgICBNT1YgICAgIHJlc3VsdCwjT01YX1N0c19Ob0VycgotICAgICAgICAKLUVuZCAgICAgICAgICAgICAgICAKLQotICAgICAgICAKLSAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIHRhaWwKLSAgICAgICAgCi0gICAgICAgIE1fRU5ECi0gICAgICAgIAotICAgIEVORElGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvL0FSTTExMzZKUyAgIAotICAgIAotICAgIAotOy8vIEZ1bmN0aW9uOiBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkICAgICAgICAgICAgCi0gICAgCi07Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCi0gICAgCi0gICAgCi0gICAgICAgICAKLSAgICAgICAgICAgIAotICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSV9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NDA0MTguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JX3MucworKysgL2Rldi9udWxsCkBAIC0xLDM1MCArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSV9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICA5NjQxCi07Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotCi0gICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0KLSAgICAgICAgCi0gICAgICAgIElGIEFSTTExMzZKUwotICAgICAgICAKLU1BU0tfMCAgICAgIEVRVSAweDAwMDAwMDAwICAgCi1NQVNLXzEgICAgICBFUVUgMHgwMTAxMDEwMQotTE9PUF9DT1VOVCAgRVFVIDB4NTAwMDAwMDAKLQotOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCi0KLXBTcmNEc3QgICAgIFJOIDAKLXNyY2RzdFN0ZXAgIFJOIDEKLXBBbHBoYUFyZyAgIFJOIDIKLXBCZXRhQXJnICAgIFJOIDMKLQotcFRocmVzaG9sZHMgUk4gNgotcEJTICAgICAgICAgUk4gOQotcFEwICAgICAgICAgUk4gMAotYlMgICAgICAgICAgUk4gMTAKLQotYWxwaGEgICAgICAgUk4gNgotYWxwaGEwICAgICAgUk4gNgotYWxwaGExICAgICAgUk4gOAotCi1iZXRhICAgICAgICBSTiA3Ci1iZXRhMCAgICAgICBSTiA3Ci1iZXRhMSAgICAgICBSTiA5Ci0KLTsvLyBEZWNsYXJlIExvY2FsL1RlbXBvcmFyeSB2YXJpYWJsZXMKLQotOy8vIFBpeGVscwotcF8wICAgICAgICAgUk4gMyAgCi1wXzEgICAgICAgICBSTiA1ICAKLXFfMCAgICAgICAgIFJOIDggIAotcV8xICAgICAgICAgUk4gOSAgCi0KLTsvLyBGaWx0ZXJpbmcKLQotZHAwcTAgICAgICAgUk4gMTIKLWRwMXAwICAgICAgIFJOIDEyCi1kcTFxMCAgICAgICBSTiAxMgotCi1hcDBxMCAgICAgICBSTiA0ICAKLWZpbHQgICAgICAgIFJOIDIKLSAgICAgICAgCi1tMDAgICAgICAgICBSTiAxNAotbTAxICAgICAgICAgUk4gMTEKLSAgICAgICAgICAgIAotcFEwICAgICAgICAgUk4gMAotU3RlcCAgICAgICAgUk4gMQotICAgICAgICAgICAgCi07Ly8gT3V0cHV0Ci0gICAgICAgICAgICAKLVBfMCAgICAgICAgIFJOIDYKLVFfMCAgICAgICAgIFJOIDcgCi0KLTsvL0RlY2xhcmF0aW9ucyBmb3IgYlNMVDQga2VybmVsCi0KLXRDICAgICAgICAgIFJOIDEyCi10QzAgICAgICAgICBSTiA1Ci10QzEgICAgICAgICBSTiAxMgotcG9zICAgICAgICAgUk4gNQotbmVnICAgICAgICAgUk4gOQotCi07Ly9EZWNsYXJhdGlvbnMgZm9yIGJTR0U0IGtlcm5lbAotCi0KLTsvLyBNaXNjZWxsYW5vdXMKLVhZICAgICAgICAgIFJOIDgKLQotYSAgICAgICAgICAgUk4gMTAKLXQxICAgICAgICAgIFJOIDEwCi10MiAgICAgICAgICBSTiAxMgotdDMgICAgICAgICAgUk4gMTQKLXQ0ICAgICAgICAgIFJOIDYKLXQ1ICAgICAgICAgIFJOIDUKLQotICAgICAgICAKLSAgICAgICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSAKLSAgICAgICAgTV9BTExPQzQgcHBUaHJlc2hvbGRzLDQKLSAgICAgICAgTV9BTExPQzggcEFscGhhQmV0YTAsOAotICAgICAgICBNX0FMTE9DOCBwQWxwaGFCZXRhMSw4Ci0gICAgICAgIE1fQUxMT0M4IHBYWUJTLDQKLSAgICAgICAgTV9BTExPQzQgcHBCUyw0Ci0gICAgICAgIAotICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIE1fU1RBUlQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSSwgcjExCi0gICAgICAgIAotICAgICAgICA7Ly9JbnB1dCBhcmd1bWVudHMgb24gdGhlIHN0YWNrCi0gICAgICAgIE1fQVJHICAgcHBUaHJlc2hvbGRzQXJnLCA0Ci0gICAgICAgIE1fQVJHICAgcHBCU0FyZywgNAotICAgICAgICAKLSAgICAgICAgTERSQiAgICBhbHBoYTEsIFtwQWxwaGFBcmcsIzFdCi0gICAgICAgIExEUkIgICAgYmV0YTEsICBbcEJldGFBcmcsIzFdCi0gICAgICAgIE1fTERSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkc0FyZwotICAgICAgICBMRFIgICAgIGEsPU1BU0tfMQotICAgICAgICBMRFJCICAgIGJldGEwLCAgW3BCZXRhQXJnXQotICAgICAgICBNX1NUUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKLSAgICAgICAgTERSQiAgICBhbHBoYTAsIFtwQWxwaGFBcmddCi0KLSAgICAgICAgTVVMICAgICBhbHBoYTEsIGFscGhhMSwgYQotICAgICAgICBNVUwgICAgIGJldGExLCBiZXRhMSwgYQotICAgICAgICBNVUwgICAgIGFscGhhMCwgYWxwaGEwLCBhCi0gICAgICAgIE1VTCAgICAgYmV0YTAsIGJldGEwLCBhCi0KLSAgICAgICAgTV9TVFJEICBhbHBoYTEsIGJldGExLCBwQWxwaGFCZXRhMQotICAgICAgICBNX0xEUiAgIHBCUywgcHBCU0FyZwotICAgICAgICBNX1NUUkQgIGFscGhhMCwgYmV0YTAsIHBBbHBoYUJldGEwCi0KLSAgICAgICAgTERSICAgICBYWSw9TE9PUF9DT1VOVAotICAgICAgICBNX1NUUkQgIFhZLCBwQlMsIHBYWUJTCi0KLSAgICAgICAgU1VCICAgICBwUTAsIHBRMCwgc3JjZHN0U3RlcCwgTFNMICMxCi1Mb29wWQotTG9vcFgKLTsvLy0tLS0tLS0tLS0tLS0tLUxvYWQgUGl4ZWxzLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBMRFJIICAgIGJTLCBbcEJTXSwgIzIKLSAgICAgICAgCi0gICAgICAgIE1fU1RSICAgcEJTLCBwcEJTCi0gICAgICAgIE1fTERSICAgcF8xLCBbcFEwXSxzcmNkc3RTdGVwCi0KLSAgICAgICAgQ01QICAgICBiUywgIzAKLSAgICAgICAgCi0gICAgICAgIE1fTERSICAgcF8wLCBbcFEwXSxzcmNkc3RTdGVwCi0gICAgICAgIE1fTERSICAgcV8wLCBbcFEwXSxzcmNkc3RTdGVwCi0gICAgICAgIE1fTERSICAgcV8xLCBbcFEwXQotICAgICAgICBMRFIgICAgIG0wMSwgPU1BU0tfMSAgICAgICAgICAgICAgICA7Ly8gIDAxMDEwMTAxIG1hc2sgCi0gICAgICAgIEJFUSAgICAgTm9GaWx0ZXJCUzAKLQotICAgICAgICAKLSAgICAgICAgOy8vIHBfMCA9IFtyM3AwIHIycDAgcjFwMCByMHAwXQotICAgICAgICA7Ly8gcF8xID0gW3IzcDEgcjJwMSByMXAxIHIwcDFdCi0gICAgICAgIDsvLyBxXzAgPSBbcjNxMCByMnEwIHIxcTAgcjBxMF0KLSAgICAgICAgOy8vIHFfMSA9IFtyM3ExIHIycTEgcjFxMSByMHExXQotCi07Ly8tLS0tLS0tLS0tLS0tLUZpbHRlcmluZyBEZWNpc2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIE1PViAgICAgbTAwLCAjTUFTS18wICAgICAgICAgICAgICAgIDsvLyAgMDAwMDAwMDAgbWFzayAKLQotICAgICAgICBNT1YgICAgIGZpbHQsIG0wMQotICAgICAgICBUU1QgICAgIGJTLCAjMHhmZjAwCi0gICAgICAgIE1PVkVRICAgZmlsdCwgZmlsdCwgTFNSICMxNgotICAgICAgICBUU1QgICAgIGJTLCAjMHhmZgotICAgICAgICBNT1ZFUSAgIGZpbHQsIGZpbHQsIExTTCAjMTYKLSAgICAgICAgVFNUICAgICBiUywgIzQKLQotICAgICAgICAKLSAgICAgICAgOy8vIENoZWNrIHxwMC1xMHw8QWxwaGEgCi0gICAgICAgIFVTVUI4ICAgZHAwcTAsIHBfMCwgcV8wIAotICAgICAgICBVU1VCOCAgIGEsIHFfMCwgcF8wCi0gICAgICAgIFNFTCAgICAgYXAwcTAsIGEsIGRwMHEwCi0gICAgICAgIFVTVUI4ICAgYSwgYXAwcTAsIGFscGhhCi0gICAgICAgIFNFTCAgICAgZmlsdCwgbTAwLCBmaWx0Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIDsvLyBDaGVjayB8cDEtcDB8PEJldGEgCi0gICAgICAgIFVTVUI4ICAgZHAxcDAsIHBfMSwgcF8wCi0gICAgICAgIFVTVUI4ICAgYSwgcF8wLCBwXzEKLSAgICAgICAgU0VMICAgICBhLCBhLCBkcDFwMAotICAgICAgICBVU1VCOCAgIGEsIGEsIGJldGEKLSAgICAgICAgU0VMICAgICBmaWx0LCBtMDAsIGZpbHQKLQotICAgICAgICA7Ly8gQ2hlY2sgfHExLXEwfDxCZXRhIAotICAgICAgICBVU1VCOCAgIGRxMXEwLCBxXzEsIHFfMAotICAgICAgICBVU1VCOCAgIGEsIHFfMCwgcV8xCi0gICAgICAgIFNFTCAgICAgYSwgYSwgZHExcTAKLSAgICAgICAgVVNVQjggICBhLCBhLCBiZXRhCi0gICAgICAgIFNFTCAgICAgZmlsdCwgbTAwLCBmaWx0Ci0KLSAgICAgICAgQkVRICAgICBiU0xUNCAgICAgICAgCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tRmlsdGVyLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWJTR0U0ICAgICAgICAKLSAgICAgICAgOy8vLS0tLS0tLS0tYlNHRTQgRXhlY3V0aW9uLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIENNUCAgICAgZmlsdCwgIzAKLQotICAgICAgICBNX0xEUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKLQotICAgICAgICA7Ly8gQ29tcHV0ZSBQMGIKLSAgICAgICAgVUhBREQ4ICB0MSwgcF8wLCBxXzEKLSAgICAgICAgQkVRICAgICBOb0ZpbHRlckZpbHQwCi0gICAgICAgIE1WTiAgICAgdDIsIHBfMQotICAgICAgICBVSFNVQjggIHQxLCB0MSwgdDIKLSAgICAgICAgVVNVQjggICB0MiwgZmlsdCwgbTAxCi0gICAgICAgIEVPUiAgICAgdDEsIHQxLCBtMDEsIExTTCAjNwotCi0gICAgICAgIEFERCAgICAgcFRocmVzaG9sZHMscFRocmVzaG9sZHMsICMyCi0gICAgICAgIAotICAgICAgICA7Ly8gQ29tcHV0ZSBRMGIgCi0gICAgICAgIFVIQUREOCAgdDIsIHFfMCwgcF8xCi0gICAgICAgIE1WTiAgICAgdDMsIHFfMQotICAgICAgICBVSFNVQjggIHQyLCB0MiwgdDMKLSAgICAgICAgTV9TVFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCi0gICAgICAgIFNFTCAgICAgUF8wLCB0MSwgcF8wCi0gICAgICAgIEVPUiAgICAgdDIsIHQyLCBtMDEsIExTTCAjNwotICAgICAgICBTRUwgICAgIFFfMCwgdDIsIHFfMAotCi0gICAgICAgIFNVQiAgICAgcFEwLCBwUTAsIHNyY2RzdFN0ZXAsIExTTCAjMQotICAgICAgICBCICAgICAgIFN0b3JlUmVzdWx0QW5kRXhpdAotCi07Ly8tLS0tLS0tLS0tIEV4aXQgb2YgTG9vcFggLS0tLS0tLS0tLS0tLS0KLTsvLy0tLS0gZm9yIHRoZSBjYXNlIG9mIG5vIGZpbHRlcmluZyAtLS0tLQotCi1Ob0ZpbHRlckZpbHQwCi1Ob0ZpbHRlckJTMAotICAgICAgICBNX0xEUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKLSAgICAgICAgU1VCICAgICBwUTAsIHBRMCwgc3JjZHN0U3RlcCwgTFNMICMxCi0gICAgICAgIFNVQiAgICAgcFEwLCBwUTAsIHNyY2RzdFN0ZXAKLSAgICAgICAgQUREICAgICBwUTAsIHBRMCwgIzQKLSAgICAgICAgQUREICAgICBwVGhyZXNob2xkcywgcFRocmVzaG9sZHMsICMyCi0KLSAgICAgICAgOy8vIExvYWQgY291bnRlciBmb3IgTG9vcFgKLSAgICAgICAgTV9MRFJEICBYWSwgcEJTLCBwWFlCUwotICAgICAgICBNX1NUUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKLSAgICAgICAgTV9MRFJEICBhbHBoYSwgYmV0YSwgcEFscGhhQmV0YTAKLQotICAgICAgICA7Ly8gQWxpZ24gdGhlIHBvaW50ZXIKLSAgICAgICAgQUREUyAgICBYWSwgWFksIFhZCi0gICAgICAgIE1fU1RSICAgWFksIHBYWUJTCi0gICAgICAgIEJDQyAgICAgTG9vcFkKLSAgICAgICAgQiAgICAgICBFeGl0TG9vcFkKLSAgICAgICAgCi1iU0xUNCAgICAgICAgIAotICAgICAgICA7Ly8tLS0tLS0tLS1iU0xUNCBFeGVjdXRpb24tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgTV9MRFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCi0gICAgICAgIENNUCAgICAgZmlsdCwgIzAKLSAgICAgICAgCi0gICAgICAgIDsvLyBTaW5jZSBiZXRhIDw9IDE4IGFuZCBhbHBoYSA8PSAyNTUgd2Uga25vdwotICAgICAgICA7Ly8gLTI1NCA8PSBwMC1xMCA8PSAyNTQKLSAgICAgICAgOy8vICAtMTcgPD0gcTEtcTAgPD0gMTcKLSAgICAgICAgOy8vICAtMTcgPD0gcDEtcDAgPD0gMTcKLQotICAgICAgICA7Ly8gZGVsdGEgPSBDbGlwMyggLXRDLCB0QywgKCgoKHEwLXAwKTw8MikgKyAocDEtcTEpICsgNCk+PjMpKQotICAgICAgICA7Ly8gCi0gICAgICAgIDsvLyAgICBDYWxjdWxhdGUgQSA9ICgoKHEwLXAwKTw8MikgKyAocDEtcTEpICsgNCk+PjMKLSAgICAgICAgOy8vICAgICAgICAgICAgICAgID0gKDQqcTAgLSA0KnAwICsgcDEgLSBxMSArIDQpPj4zCi0gICAgICAgIDsvLyAgICAgICAgICAgICAgICA9ICgocDEtcDApIC0gKHExLXEwKSAtIDMqKHAwLXEwKSArIDQpPj4zCi0KLSAgICAgICAgVVNVQjggICB0MSwgcF8xLCBwXzAKLSAgICAgICAgVVNVQjggICB0MiwgcV8xLCBxXzAKLSAgICAgICAgQkVRICAgICBOb0ZpbHRlckZpbHQwCi0gICAgICAgIAotICAgICAgICBMRFJCICAgIHRDMCwgW3BUaHJlc2hvbGRzXSwjMQotICAgICAgICBTU1VCOCAgIHQxLCB0MSwgdDIKLSAgICAgICAgTERSQiAgICB0QzEsIFtwVGhyZXNob2xkc10sIzEKLSAgICAgICAgTV9TVFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCi0gICAgICAgIFVIU1VCOCAgdDQsIHBfMCwgcV8wCi0gICAgICAgIE9SUiAgICAgdEMsIHRDMCwgdEMxLCBMU0wgIzE2Ci0gICAgICAgIFVTVUI4ICAgdDUsIHBfMCwgcV8wCi0gICAgICAgIEFORCAgICAgdDUsIHQ1LCBtMDEKLSAgICAgICAgU0hTVUI4ICB0MSwgdDEsIHQ1Ci0gICAgICAgIE9SUiAgICAgdEMsIHRDLCBMU0wgIzggICAgICAgIAotICAgICAgICBTU1VCOCAgIHQxLCB0MSwgdDUKLSAgICAgICAgU0hTVUI4ICB0MSwgdDEsIHQ0Ci0gICAgICAgIFVRQUREOCAgdEMsIHRDLCBtMDEKLSAgICAgICAgU0FERDggICB0MSwgdDEsIG0wMQotICAgICAgICBVU1VCOCAgIHQ1LCBmaWx0LCBtMDEgICAKLSAgICAgICAgU0hTVUI4ICB0MSwgdDEsIHQ0Ci0gICAgICAgIFNFTCAgICAgdEMsIHRDLCBtMDAKLQotICAgICAgICA7Ly8gU3BsaXQgaW50byBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgcGFydCBhbmQgY2xpcCAKLQotICAgICAgICBTU1VCOCAgIHQxLCB0MSwgbTAwCi0gICAgICAgIFNFTCAgICAgcG9zLCB0MSwgbTAwCi0gICAgICAgIFVTVUI4ICAgbmVnLCBwb3MsIHQxCi0gICAgICAgIFVTVUI4ICAgdDMsIHBvcywgdEMKLSAgICAgICAgU0VMICAgICBwb3MsIHRDLCBwb3MKLSAgICAgICAgVVNVQjggICB0MywgbmVnLCB0QwotICAgICAgICBTRUwgICAgIG5lZywgdEMsIG5lZwotICAgICAgICBVUUFERDggIFBfMCwgcF8wLCBwb3MKLSAgICAgICAgVVFTVUI4ICBRXzAsIHFfMCwgcG9zCi0gICAgICAgIFVRU1VCOCAgUF8wLCBQXzAsIG5lZwotICAgICAgICBVUUFERDggIFFfMCwgUV8wLCBuZWcKLSAgICAgICAgCi0gICAgICAgIFNVQiAgICAgcFEwLCBwUTAsIHNyY2RzdFN0ZXAsIExTTCAjMQotCi0gICAgICAgIDsvLyBDaG9vc2UgdG8gc3RvcmUgdGhlIGZpbHRlcmVkCi0gICAgICAgIDsvLyB2YWx1ZSBvciB0aGUgb3JpZ2luYWwgcGl4ZWwKLSAgICAgICAgVVNVQjggICB0MSwgZmlsdCwgbTAxICAgIAotICAgICAgICBTRUwgICAgIFBfMCwgUF8wLCBwXzAKLSAgICAgICAgU0VMICAgICBRXzAsIFFfMCwgcV8wCi0gICAgCi1TdG9yZVJlc3VsdEFuZEV4aXQKLQotICAgICAgICA7Ly8tLS0tLS0tLS1TdG9yZSByZXN1bHQtLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICA7Ly8gUF8wID0gW3IwcDAgcjFwMCByMnAwIHIzcDBdCi0gICAgICAgIDsvLyBRXzAgPSBbcjBxMCByMXEwIHIycTAgcjNxMF0KLQotICAgICAgICBNX1NUUiAgIFBfMCwgW3BRMF0sIHNyY2RzdFN0ZXAKLSAgICAgICAgU1RSICAgICBRXzAsIFtwUTBdLCAjNAotCi0gICAgICAgIE1fTERSRCAgWFksIHBCUywgcFhZQlMKLSAgICAgICAgTV9MRFJEICBhbHBoYSwgYmV0YSwgcEFscGhhQmV0YTAKLQotICAgICAgICBTVUIgICAgIHBRMCwgcFEwLCBzcmNkc3RTdGVwLCBMU0wgIzEKLQotICAgICAgICBBRERTICAgIFhZLCBYWSwgWFkKLSAgICAgICAgTV9TVFIgICBYWSwgcFhZQlMKLSAgICAgICAgQkNDICAgICBMb29wWAotCi07Ly8tLS0tLS0tLSBDb21tb24gRXhpdCBvZiBMb29wWSAtLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICA7Ly8gQWxpZ24gdGhlIHBvaW50ZXJzIAotCi1FeGl0TG9vcFkKLSAgICAgICAgQUREICAgICBwQlMsIHBCUywgIzQKLSAgICAgICAgTV9MRFJEICBhbHBoYSwgYmV0YSwgcEFscGhhQmV0YTEKLSAgICAgICAgU1VCICAgICBwUTAsIHBRMCwgIzgKLSAgICAgICAgQUREICAgICBwUTAsIHBRMCwgc3JjZHN0U3RlcCwgTFNMICMyCi0gICAgICAgIE1fU1RSRCAgYWxwaGEsIGJldGEsIHBBbHBoYUJldGEwCi0KLSAgICAgICAgQk5FICAgICBMb29wWQotICAgICAgICBNT1YgICAgIHIwLCAjT01YX1N0c19Ob0VycgotCi07Ly8tLS0tLS0tLS0tLS0tLS0tLUVuZCBGaWx0ZXItLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBNX0VORAotCi0gICAgRU5ESUYgICAgICAgIAotCi0gICAgICAgIEVORAotICAgICAgICAKLSAgICAgICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0lfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRjOTM2OS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0lfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsNDUxICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDk2NDEKLTsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotCi0gICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0KLQotICAgICAgICBJRiBBUk0xMTM2SlMKLSAgICAgICAgCi0gICAgICAgIAotTUFTS18wICAgICAgRVFVIDB4MDAwMDAwMDAgICAKLU1BU0tfMSAgICAgIEVRVSAweDAxMDEwMTAxCi1NQVNLXzIgICAgICBFUVUgMHgwMDAwZmYwMAotTE9PUF9DT1VOVCAgRVFVIDB4NTAwMDAwMDAKLQotOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCi0KLXBTcmNEc3QgICAgIFJOIDAKLXNyY2RzdFN0ZXAgIFJOIDEKLXBBbHBoYUFyZyAgIFJOIDIKLXBCZXRhQXJnICAgIFJOIDMKLQotcFRocmVzaG9sZHMgUk4gNgotcEJTICAgICAgICAgUk4gOQotcFEwICAgICAgICAgUk4gMAotYlMgICAgICAgICAgUk4gMgotYlNUZW1wICAgICAgUk4gMTAKLQotYWxwaGEgICAgICAgUk4gNgotYWxwaGEwICAgICAgUk4gNgotYWxwaGExICAgICAgUk4gOAotCi1iZXRhICAgICAgICBSTiA3Ci1iZXRhMCAgICAgICBSTiA3Ci1iZXRhMSAgICAgICBSTiA5Ci0KLTsvLyBEZWNsYXJlIExvY2FsL1RlbXBvcmFyeSB2YXJpYWJsZXMKLQotOy8vIFBpeGVscwotcF8wICAgICAgICAgUk4gMyAgCi1wXzEgICAgICAgICBSTiA1ICAKLXFfMCAgICAgICAgIFJOIDggIAotcV8xICAgICAgICAgUk4gOSAgCi0KLTsvLyBVbnBhY2tpbmcKLW1hc2sgICAgICAgIFJOIDExIAotCi1yb3cwICAgICAgICBSTiAyCi1yb3cxICAgICAgICBSTiA0Ci1yb3cyICAgICAgICBSTiA1Ci1yb3czICAgICAgICBSTiAzCi0KLXJvdzQgICAgICAgIFJOIDgKLXJvdzUgICAgICAgIFJOIDkKLXJvdzYgICAgICAgIFJOIDEwCi1yb3c3ICAgICAgICBSTiAxMgotCi10dW5wazAgICAgICBSTiAyCi10dW5wazIgICAgICBSTiAxMAotdHVucGszICAgICAgUk4gMTIKLQotdHVucGs0ICAgICAgUk4gNAotdHVucGs1ICAgICAgUk4gNQotdHVucGs2ICAgICAgUk4gMTQKLXR1bnBrNyAgICAgIFJOIDIgCi0KLTsvLyBGaWx0ZXJpbmcKLQotZHAwcTAgICAgICAgUk4gMTIKLWRwMXAwICAgICAgIFJOIDEyCi1kcTFxMCAgICAgICBSTiAxMgotCi1hcDBxMCAgICAgICBSTiA0ICAKLWZpbHQgICAgICAgIFJOIDIKLSAgICAgICAgCi1tMDAgICAgICAgICBSTiAxNAotbTAxICAgICAgICAgUk4gMTEKLSAgICAgICAgICAgIAotcFEwICAgICAgICAgUk4gMAotU3RlcCAgICAgICAgUk4gMQotICAgICAgICAgICAgCi07Ly8gT3V0cHV0Ci0gICAgICAgICAgICAKLVBfMCAgICAgICAgIFJOIDYKLVFfMCAgICAgICAgIFJOIDcgCi0KLTsvL0RlY2xhcmF0aW9ucyBmb3IgYlNMVDQga2VybmVsCi0KLXRDICAgICAgICAgIFJOIDEyCi10QzAgICAgICAgICBSTiA1Ci10QzEgICAgICAgICBSTiAxMgotcG9zICAgICAgICAgUk4gNQotbmVnICAgICAgICAgUk4gOQotCi07Ly9EZWNsYXJhdGlvbnMgZm9yIGJTR0U0IGtlcm5lbAotCi0KLTsvLyBNaXNjZWxsYW5vdXMKLVhZICAgICAgICAgIFJOIDgKLQotYSAgICAgICAgICAgUk4gMTAKLXQxICAgICAgICAgIFJOIDEwCi10MiAgICAgICAgICBSTiAxMgotdDMgICAgICAgICAgUk4gMTQKLXQ0ICAgICAgICAgIFJOIDYKLXQ1ICAgICAgICAgIFJOIDUKLQotCi0gICAgICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgCi0gICAgICAgIE1fQUxMT0M0IHBwVGhyZXNob2xkcyw0Ci0gICAgICAgIE1fQUxMT0M4IHBBbHBoYUJldGEwLDgKLSAgICAgICAgTV9BTExPQzggcEFscGhhQmV0YTEsOAotICAgICAgICBNX0FMTE9DOCBwWFlCUyw0Ci0gICAgICAgIE1fQUxMT0M0IHBwQlMsNAotICAgICAgICAKLSAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgotICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0ksIHIxMQotICAgICAgICAKLSAgICAgICAgOy8vSW5wdXQgYXJndW1lbnRzIG9uIHRoZSBzdGFjawotICAgICAgICBNX0FSRyAgIHBwVGhyZXNob2xkc0FyZywgNAotICAgICAgICBNX0FSRyAgIHBwQlNBcmcsIDQKLSAgICAgICAgCi0gICAgICAgIExEUkIgICAgYWxwaGExLCBbcEFscGhhQXJnLCMxXQotICAgICAgICBMRFJCICAgIGJldGExLCAgW3BCZXRhQXJnLCMxXQotICAgICAgICBNX0xEUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHNBcmcKLSAgICAgICAgTERSICAgICBhLD1NQVNLXzEKLSAgICAgICAgTERSQiAgICBiZXRhMCwgIFtwQmV0YUFyZ10KLSAgICAgICAgTV9TVFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCi0gICAgICAgIExEUkIgICAgYWxwaGEwLCBbcEFscGhhQXJnXQotCi0gICAgICAgIE1VTCAgICAgYWxwaGExLCBhbHBoYTEsIGEKLSAgICAgICAgTVVMICAgICBiZXRhMSwgYmV0YTEsIGEKLSAgICAgICAgTVVMICAgICBhbHBoYTAsIGFscGhhMCwgYQotICAgICAgICBNVUwgICAgIGJldGEwLCBiZXRhMCwgYQotCi0gICAgICAgIE1fU1RSRCAgYWxwaGExLCBiZXRhMSwgcEFscGhhQmV0YTEKLSAgICAgICAgTV9MRFIgICBwQlMsIHBwQlNBcmcKLSAgICAgICAgTV9TVFJEICBhbHBoYTAsIGJldGEwLCBwQWxwaGFCZXRhMAotCi0gICAgICAgIExEUiAgICAgWFksPUxPT1BfQ09VTlQKLSAgICAgICAgTV9TVFJEICBYWSwgcEJTLCBwWFlCUwotICAgICAgICAKLSAgICAgICAgCi1Mb29wWQotTG9vcFgKLTsvLy0tLS0tLS0tLS0tLS0tLUxvYWQgUGl4ZWxzLS0tLS0tLS0tLS0tLS0tLS0tLQotCi07Ly8tLS0tLS0tLS0tLS0tLS0tUGFjayBxMC1xMS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIExEUkggICAgYlMsIFtwQlNdLCAjOAotICAgICAgICBMRFIgICAgIG1hc2ssID1NQVNLXzIKLQotICAgICAgICBNX0xEUkggIHJvdzQsIFtwUTBdLCBzcmNkc3RTdGVwCi0gICAgICAgIENNUCAgICAgYlMsICMwCi0gICAgICAgIE1fU1RSICAgcEJTLCBwcEJTCi0gICAgICAgIE1fTERSSCAgcm93NSwgW3BRMF0sIHNyY2RzdFN0ZXAKLSAgICAgICAgQkVRLlcgICBOb0ZpbHRlckJTMAotICAgICAgICBMRFJIICAgIHJvdzYsIFtwUTBdCi0gICAgICAgIExEUkggICAgcm93NywgW3BRMCwgc3JjZHN0U3RlcF0KLQotICAgICAgICA7Ly8gcm93NCA9IFswIDAgcjBxMCByMHExXQotICAgICAgICA7Ly8gcm93NSA9IFswIDAgcjFxMCByMXExXQotICAgICAgICA7Ly8gcm93NiA9IFswIDAgcjJxMCByMnExXQotICAgICAgICA7Ly8gcm93NyA9IFswIDAgcjNxMCByM3ExXQotCi0gICAgICAgIEFORCAgICAgdHVucGs0LCBtYXNrLCByb3c0Ci0gICAgICAgIEFORCAgICAgdHVucGs1LCBtYXNrLCByb3c0LCBMU0wjOAotICAgICAgICBVWFRBQiAgIHR1bnBrNCwgdHVucGs0LCByb3c1LCBST1IjOAotICAgICAgICBVWFRBQiAgIHR1bnBrNSwgdHVucGs1LCByb3c1Ci0gICAgICAgIEFORCAgICAgdHVucGs2LCBtYXNrLCByb3c2Ci0gICAgICAgIEFORCAgICAgdHVucGs3LCBtYXNrLCByb3c2LCBMU0wjOAotICAgICAgICBVWFRBQiAgIHR1bnBrNiwgdHVucGs2LCByb3c3LCBST1IjOAotICAgICAgICBVWFRBQiAgIHR1bnBrNywgdHVucGs3LCByb3c3Ci0KLSAgICAgICAgOy8vIHR1bnBrNCA9IFswIDAgcjBxMCByMXEwXQotICAgICAgICA7Ly8gdHVucGs1ID0gWzAgMCByMHExIHIxcTFdCi0gICAgICAgIDsvLyB0dW5wazYgPSBbMCAwIHIycTAgcjNxMF0KLSAgICAgICAgOy8vIHR1bnBrNyA9IFswIDAgcjJxMSByM3ExXQotCi0gICAgICAgIFNVQiAgICAgcFEwLCBwUTAsIHNyY2RzdFN0ZXAsIExTTCAjMQotICAgICAgICBTVUIgICAgIHBRMCwgcFEwLCAjMgotCi0gICAgICAgIFBLSEJUICAgcV8xLCB0dW5wazYsIHR1bnBrNCwgTFNMIzE2Ci0gICAgICAgIFBLSEJUICAgcV8wLCB0dW5wazcsIHR1bnBrNSwgTFNMIzE2Ci0KLSAgICAgICAgOy8vIHFfMCA9IFtyMHEwIHIxcTAgcjJxMCByM3EwXQotICAgICAgICA7Ly8gcV8xID0gW3IwcTEgcjFxMSByMnExIHIzcTFdCi0KLQotOy8vLS0tLS0tLS0tLS0tLS0tLVBhY2sgcDAtcDEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIE1fTERSSCAgcm93MCwgW3BRMF0sIHNyY2RzdFN0ZXAgICAgICAgICAgCi0gICAgICAgIE1fTERSSCAgcm93MSwgW3BRMF0sIHNyY2RzdFN0ZXAgICAgICAgICAgCi0gICAgICAgIExEUkggICAgcm93MiwgW3BRMF0KLSAgICAgICAgTERSSCAgICByb3czLCBbcFEwLCBzcmNkc3RTdGVwXQotICAgICAgICAKLSAgICAgICAgOy8vIHJvdzAgPSBbMCAwIHIwcDAgcjBwMV0KLSAgICAgICAgOy8vIHJvdzEgPSBbMCAwIHIxcDAgcjFwMV0KLSAgICAgICAgOy8vIHJvdzIgPSBbMCAwIHIycDAgcjJwMV0KLSAgICAgICAgOy8vIHJvdzMgPSBbMCAwIHIzcDAgcjNwMV0KLQotICAgICAgICBBTkQgICAgIHR1bnBrMiwgbWFzaywgcm93MAotICAgICAgICBBTkQgICAgIHR1bnBrNiwgbWFzaywgcm93MCwgTFNMIzgKLSAgICAgICAgVVhUQUIgICB0dW5wazIsIHR1bnBrMiwgcm93MSwgUk9SIzgKLSAgICAgICAgVVhUQUIgICB0dW5wazYsIHR1bnBrNiwgcm93MQotCi0gICAgICAgIEFORCAgICAgdHVucGswLCBtYXNrLCByb3cyCi0gICAgICAgIEFORCAgICAgdHVucGszLCBtYXNrLCByb3cyLCBMU0wjOAotICAgICAgICBVWFRBQiAgIHR1bnBrMCwgdHVucGswLCByb3czLCBST1IjOAotICAgICAgICBVWFRBQiAgIHR1bnBrMywgdHVucGszLCByb3czCi0KLSAgICAgICAgOy8vIHR1bnBrMiA9IFswIDAgcjBwMCByMXAwXQotICAgICAgICA7Ly8gdHVucGs2ID0gWzAgMCByMHAxIHIxcDFdCi0gICAgICAgIDsvLyB0dW5wazAgPSBbMCAwIHIycDAgcjNwMF0KLSAgICAgICAgOy8vIHR1bnBrMyA9IFswIDAgcjJwMSByM3AxXQotCi0gICAgICAgIFBLSEJUICAgcF8wLCB0dW5wazAsIHR1bnBrMiwgTFNMIzE2Ci0gICAgICAgIE1fTERSICAgYlNUZW1wLCBwcEJTCi0gICAgICAgIFBLSEJUICAgcF8xLCB0dW5wazMsIHR1bnBrNiwgTFNMIzE2Ci0KLSAgICAgICAgOy8vIHBfMCA9IFtyMHAwIHIxcDAgcjJwMCByM3AwXQotICAgICAgICA7Ly8gcF8xID0gW3IwcDEgcjFwMSByMnAxIHIzcDFdCi0KLTsvLy0tLS0tLS0tLS0tLS0tRmlsdGVyaW5nIERlY2lzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgVVNVQjggICBkcDBxMCwgcF8wLCBxXzAgCi0gICAgICAgIExEUiAgICAgbTAxLCA9TUFTS18xCi0gICAgICAgIExEUkggICAgYlNUZW1wLCBbYlNUZW1wICwjLThdCi0gICAgICAgIE1PViAgICAgbTAwLCAjTUFTS18wICAgICAgICAgICAgICAgIDsvLyAgMDAwMDAwMDAgbWFzayAKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgZmlsdCwgbTAxCi0gICAgICAgIFRTVCAgICAgYlNUZW1wLCAjMHhmZjAwCi0gICAgICAgIE1PVkVRICAgZmlsdCwgZmlsdCwgTFNMICMxNgotICAgICAgICBUU1QgICAgIGJTVGVtcCwgIzB4ZmYKLSAgICAgICAgTU9WRVEgICBmaWx0LCBmaWx0LCBMU1IgIzE2Ci0gICAgICAgIFRTVCAgICAgYlNUZW1wLCAjNAotCi0gICAgICAgIDsvLyBDaGVjayB8cDAtcTB8PEFscGhhIAotICAgICAgICBVU1VCOCAgIGEsIHFfMCwgcF8wCi0gICAgICAgIFNFTCAgICAgYXAwcTAsIGEsIGRwMHEwCi0gICAgICAgIFVTVUI4ICAgYSwgYXAwcTAsIGFscGhhCi0gICAgICAgIFNFTCAgICAgZmlsdCwgbTAwLCBmaWx0Ci0gICAgICAgIAotICAgICAgICA7Ly8gQ2hlY2sgfHAxLXAwfDxCZXRhIAotICAgICAgICBVU1VCOCAgIGRwMXAwLCBwXzEsIHBfMAotICAgICAgICBVU1VCOCAgIGEsIHBfMCwgcF8xCi0gICAgICAgIFNFTCAgICAgYSwgYSwgZHAxcDAKLSAgICAgICAgVVNVQjggICBhLCBhLCBiZXRhCi0gICAgICAgIFNFTCAgICAgZmlsdCwgbTAwLCBmaWx0Ci0KLSAgICAgICAgOy8vIENoZWNrIHxxMS1xMHw8QmV0YSAKLSAgICAgICAgVVNVQjggICBkcTFxMCwgcV8xLCBxXzAKLSAgICAgICAgVVNVQjggICBhLCBxXzAsIHFfMQotICAgICAgICBTRUwgICAgIGEsIGEsIGRxMXEwCi0gICAgICAgIFVTVUI4ICAgYSwgYSwgYmV0YQotICAgICAgICBTRUwgICAgIGZpbHQsIG0wMCwgZmlsdAotCi0gICAgICAgIEJFUSAgICAgYlNMVDQgICAgICAgIAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLUZpbHRlci0tLS0tLS0tLS0tLS0tLS0tLS0tCi1iU0dFNCAgICAgICAgCi0gICAgICAgIDsvLy0tLS0tLS0tLWJTR0U0IEV4ZWN1dGlvbi0tLS0tLS0tLS0tLS0tLQotICAgICAgICBDTVAgICAgIGZpbHQsICMwCi0KLSAgICAgICAgTV9MRFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCi0KLSAgICAgICAgOy8vIENvbXB1dGUgUDBiCi0gICAgICAgIFVIQUREOCAgdDEsIHBfMCwgcV8xCi0gICAgICAgIEJFUSAgICAgTm9GaWx0ZXJGaWx0MAotICAgICAgICBNVk4gICAgIHQyLCBwXzEKLSAgICAgICAgVUhTVUI4ICB0MSwgdDEsIHQyCi0gICAgICAgIFVTVUI4ICAgdDIsIGZpbHQsIG0wMQotICAgICAgICBFT1IgICAgIHQxLCB0MSwgbTAxLCBMU0wgIzcKLQotICAgICAgICBBREQgICAgIHBUaHJlc2hvbGRzLHBUaHJlc2hvbGRzLCAjNAotICAgICAgICAKLSAgICAgICAgOy8vIENvbXB1dGUgUTBiIAotICAgICAgICBVSEFERDggIHQyLCBxXzAsIHBfMQotICAgICAgICBNVk4gICAgIHQzLCBxXzEKLSAgICAgICAgVUhTVUI4ICB0MiwgdDIsIHQzCi0gICAgICAgIE1fU1RSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcwotICAgICAgICBTRUwgICAgIFBfMCwgdDEsIHBfMAotICAgICAgICBFT1IgICAgIHQyLCB0MiwgbTAxLCBMU0wgIzcKLSAgICAgICAgU0VMICAgICBRXzAsIHQyLCBxXzAKLQotICAgICAgICBCICAgICAgIFN0b3JlUmVzdWx0QW5kRXhpdAotCi07Ly8tLS0tLS0tLS0tIEV4aXQgb2YgTG9vcFggLS0tLS0tLS0tLS0tLS0KLTsvLy0tLS0gZm9yIHRoZSBjYXNlIG9mIG5vIGZpbHRlcmluZyAtLS0tLQotCi1Ob0ZpbHRlckZpbHQwCi0gICAgICAgIEFERCAgICAgcFEwLCBwUTAsICMyCi1Ob0ZpbHRlckJTMAotICAgICAgICBNX0xEUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKLSAgICAgICAgU1VCICAgICBwUTAsIHBRMCwgc3JjZHN0U3RlcCwgTFNMICMxCi0gICAgICAgIEFERCAgICAgcFEwLCBwUTAsICM0Ci0gICAgICAgIEFERCAgICAgcFRocmVzaG9sZHMsIHBUaHJlc2hvbGRzLCAjNAotICAgICAgICA7Ly8gTG9hZCBjb3VudGVyIGZvciBMb29wWAotICAgICAgICBNX0xEUkQgIFhZLCBwQlMsIHBYWUJTCi0gICAgICAgIE1fU1RSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcwotICAgICAgICBNX0xEUkQgIGFscGhhLCBiZXRhLCBwQWxwaGFCZXRhMQotCi0gICAgICAgIDsvLyBBbGlnbiB0aGUgcG9pbnRlcgotICAgICAgICBBRERTICAgIFhZLCBYWSwgWFkKLSAgICAgICAgTV9TVFIgICBYWSwgcFhZQlMKLSAgICAgICAgQkNDICAgICBMb29wWQotICAgICAgICBCICAgICAgIEV4aXRMb29wWQotICAgICAgICAKLWJTTFQ0ICAgICAgICAKLSAgICAgICAgOy8vLS0tLS0tLS0tYlNMVDQgRXhlY3V0aW9uLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIE1fTERSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcwotICAgICAgICBDTVAgICAgIGZpbHQsICMwCi0gICAgICAgIAotCi0gICAgICAgIDsvLyBTaW5jZSBiZXRhIDw9IDE4IGFuZCBhbHBoYSA8PSAyNTUgd2Uga25vdwotICAgICAgICA7Ly8gLTI1NCA8PSBwMC1xMCA8PSAyNTQKLSAgICAgICAgOy8vICAtMTcgPD0gcTEtcTAgPD0gMTcKLSAgICAgICAgOy8vICAtMTcgPD0gcDEtcDAgPD0gMTcKLQotICAgICAgICA7Ly8gZGVsdGEgPSBDbGlwMyggLXRDLCB0QywgKCgoKHEwLXAwKTw8MikgKyAocDEtcTEpICsgNCk+PjMpKQotICAgICAgICA7Ly8gCi0gICAgICAgIDsvLyAgICBDYWxjdWxhdGUgQSA9ICgoKHEwLXAwKTw8MikgKyAocDEtcTEpICsgNCk+PjMKLSAgICAgICAgOy8vICAgICAgICAgICAgICAgID0gKDQqcTAgLSA0KnAwICsgcDEgLSBxMSArIDQpPj4zCi0gICAgICAgIDsvLyAgICAgICAgICAgICAgICA9ICgocDEtcDApIC0gKHExLXEwKSAtIDMqKHAwLXEwKSArIDQpPj4zCi0KLSAgICAgICAgVVNVQjggICB0MSwgcF8xLCBwXzAKLSAgICAgICAgVVNVQjggICB0MiwgcV8xLCBxXzAKLSAgICAgICAgQkVRICAgICBOb0ZpbHRlckZpbHQwCi0gICAgICAgIAotICAgICAgICBMRFJCICAgIHRDMCwgW3BUaHJlc2hvbGRzXSwgIzEKLSAgICAgICAgU1NVQjggICB0MSwgdDEsIHQyCi0gICAgICAgIExEUkIgICAgdEMxLCBbcFRocmVzaG9sZHNdLCAjMwotICAgICAgICBNX1NUUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKLSAgICAgICAgVUhTVUI4ICB0NCwgcF8wLCBxXzAKLSAgICAgICAgT1JSICAgICB0QywgdEMxLCB0QzAsIExTTCAjMTYKLSAgICAgICAgVVNVQjggICB0NSwgcF8wLCBxXzAKLSAgICAgICAgQU5EICAgICB0NSwgdDUsIG0wMQotICAgICAgICBTSFNVQjggIHQxLCB0MSwgdDUKLSAgICAgICAgT1JSICAgICB0QywgdEMsIExTTCAjOCAgICAgICAgCi0gICAgICAgIFNTVUI4ICAgdDEsIHQxLCB0NQotICAgICAgICBTSFNVQjggIHQxLCB0MSwgdDQKLSAgICAgICAgVVFBREQ4ICB0QywgdEMsIG0wMQotICAgICAgICBTQUREOCAgIHQxLCB0MSwgbTAxCi0gICAgICAgIFVTVUI4ICAgdDUsIGZpbHQsIG0wMSAgIAotICAgICAgICBTSFNVQjggIHQxLCB0MSwgdDQKLSAgICAgICAgU0VMICAgICB0QywgdEMsIG0wMAotCi0gICAgICAgIDsvLyBTcGxpdCBpbnRvIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBwYXJ0IGFuZCBjbGlwIAotCi0gICAgICAgIFNTVUI4ICAgdDEsIHQxLCBtMDAKLSAgICAgICAgU0VMICAgICBwb3MsIHQxLCBtMDAKLSAgICAgICAgVVNVQjggICBuZWcsIHBvcywgdDEKLSAgICAgICAgVVNVQjggICB0MywgcG9zLCB0QwotICAgICAgICBTRUwgICAgIHBvcywgdEMsIHBvcwotICAgICAgICBVU1VCOCAgIHQzLCBuZWcsIHRDCi0gICAgICAgIFNFTCAgICAgbmVnLCB0QywgbmVnCi0gICAgICAgIFVRQUREOCAgUF8wLCBwXzAsIHBvcwotICAgICAgICBVUVNVQjggIFFfMCwgcV8wLCBwb3MKLSAgICAgICAgVVFTVUI4ICBQXzAsIFBfMCwgbmVnCi0gICAgICAgIFVRQUREOCAgUV8wLCBRXzAsIG5lZwotICAgICAgICAKLSAgICAgICAgOy8vIENob29zZSB0byBzdG9yZSB0aGUgZmlsdGVyZWQKLSAgICAgICAgOy8vIHZhbHVlIG9yIHRoZSBvcmlnaW5hbCBwaXhlbAotICAgICAgICBVU1VCOCAgIHQxLCBmaWx0LCBtMDEgICAgCi0gICAgICAgIFNFTCAgICAgUF8wLCBQXzAsIHBfMAotICAgICAgICBTRUwgICAgIFFfMCwgUV8wLCBxXzAKLSAgICAKLVN0b3JlUmVzdWx0QW5kRXhpdAotCi0gICAgICAgIDsvLy0tLS0tLS0tLVN0b3JlIHJlc3VsdC0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIDsvLyBQXzAgPSBbcjBwMCByMXAwIHIycDAgcjNwMF0KLSAgICAgICAgOy8vIFFfMCA9IFtyMHEwIHIxcTAgcjJxMCByM3EwXQotCi0gICAgICAgIFNVQiAgICAgcFEwLCBwUTAsIHNyY2RzdFN0ZXAsIExTTCAjMQotICAgICAgICBBREQgICAgICAgIHBRMCwgcFEwLCAjMSAgICAgIAotIAotICAgICAgICBNT1YgICAgIHQxLCBRXzAsIExTUiAjMjQKLSAgICAgICAgU1RSQiAgICB0MSwgW3BRMCwgIzFdCi0gICAgICAgIE1PViAgICAgdDEsIFBfMCwgTFNSICMyNAotICAgICAgICBNX1NUUkIgIHQxLCBbcFEwXSwgc3JjZHN0U3RlcAotCi0gICAgICAgIE1PViAgICAgdDEsIFFfMCwgTFNSICMxNgotICAgICAgICBTVFJCICAgIHQxLCBbcFEwLCAjMV0KLSAgICAgICAgTU9WICAgICB0MSwgUF8wLCBMU1IgIzE2Ci0gICAgICAgIE1fU1RSQiAgdDEsIFtwUTBdLCBzcmNkc3RTdGVwCi0KLSAgICAgICAgTU9WICAgICB0MSwgUF8wLCBMU1IgIzgKLSAgICAgICAgU1RSQiAgICB0MSwgW3BRMF0KLSAgICAgICAgU1RSQiAgICBQXzAsIFtwUTAsIHNyY2RzdFN0ZXBdCi0gICAgICAgIE1PViAgICAgdDEsIFFfMCwgTFNSICM4Ci0gICAgICAgIFNUUkIgICAgdDEsIFtwUTAsICMxXSEKLSAgICAgICAgU1RSQiAgICBRXzAsIFtwUTAsIHNyY2RzdFN0ZXBdCi0KLSAgICAgICAgTV9MRFJEICBYWSwgcEJTLCBwWFlCUwotICAgICAgICBNX0xEUkQgIGFscGhhLCBiZXRhLCBwQWxwaGFCZXRhMQotCi0gICAgICAgIFNVQiAgICAgcFEwLCBwUTAsIHNyY2RzdFN0ZXAsIExTTCAjMQotICAgICAgICBBREQgICAgIHBRMCwgcFEwLCAjNAotCi0gICAgICAgIEFERFMgICAgWFksIFhZLCBYWQotICAgICAgICBNX1NUUiAgIFhZLCBwWFlCUwotICAgICAgICBCQ0MgICAgIExvb3BYCi0KLTsvLy0tLS0tLS0tIENvbW1vbiBFeGl0IG9mIExvb3BZIC0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIDsvLyBBbGlnbiB0aGUgcG9pbnRlcnMgCi0KLUV4aXRMb29wWQotCi0gICAgICAgIE1fTERSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcwotICAgICAgICBTVUIgICAgIHBRMCwgcFEwLCAjOAotICAgICAgICBBREQgICAgIHBRMCwgcFEwLCBzcmNkc3RTdGVwLCBMU0wgIzIKLSAgICAgICAgU1VCICAgICBwQlMsIHBCUywgIzE0IAotICAgICAgICBTVUIgICAgIHBUaHJlc2hvbGRzLCBwVGhyZXNob2xkcywgIzYKLSAgICAgICAgTV9TVFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCi0KLSAgICAgICAgTV9MRFJEICBhbHBoYSwgYmV0YSwgcEFscGhhQmV0YTAKLQotICAgICAgICBCTkUgICAgIExvb3BZCi0gICAgICAgIE1PViAgICAgcjAsICNPTVhfU3RzX05vRXJyCi07Ly8tLS0tLS0tLS0tLS0tLS0tLUVuZCBGaWx0ZXItLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIE1fRU5ECi0KLSAgICAgICAgRU5ESUYgICAgICAgIAotCi0gICAgICAgIEVORAotICAgICAgICAKLSAgICAgICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0lfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGZiZmE0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0lfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMzQ1ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSV9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICA5NjQxCi07Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLQotICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotCi0gICAgICAgIElNUE9SVCAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTTFQ0X3Vuc2FmZQotICAgICAgICBJTVBPUlQgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0dFNF91bnNhZmUKLQotICAgIAotCi0gICAgSUYgQVJNMTEzNkpTCi0KLQotTUFTS18wICAgICAgRVFVIDB4MDAwMDAwMDAgICAKLU1BU0tfMSAgICAgIEVRVSAweDAxMDEwMTAxCi1NQVNLXzIgICAgICBFUVUgMHhmZjAwZmYwMAotTE9PUF9DT1VOVCAgRVFVIDB4MTExMTAwMDAKLQotOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCi0KLXBTcmNEc3QgICAgIFJOIDAKLXNyY2RzdFN0ZXAgIFJOIDEKLXBBbHBoYUFyZyAgIFJOIDIKLXBCZXRhQXJnICAgIFJOIDMKLQotcFRocmVzaG9sZHMgUk4gMTQKLXBCUyAgICAgICAgIFJOIDkKLXBRMCAgICAgICAgIFJOIDAKLWJTICAgICAgICAgIFJOIDIKLQotYWxwaGEgICAgICAgUk4gNgotYWxwaGEwICAgICAgUk4gNgotYWxwaGExICAgICAgUk4gOAotCi1iZXRhICAgICAgICBSTiA3Ci1iZXRhMCAgICAgICBSTiA3Ci1iZXRhMSAgICAgICBSTiA5Ci0KLTsvLyBEZWNsYXJlIExvY2FsL1RlbXBvcmFyeSB2YXJpYWJsZXMKLQotOy8vIFBpeGVscwotcF8wICAgICAgICAgUk4gMyAgCi1wXzEgICAgICAgICBSTiA1ICAKLXBfMiAgICAgICAgIFJOIDQgIAotcF8zICAgICAgICAgUk4gMiAgCi1xXzAgICAgICAgICBSTiA4ICAKLXFfMSAgICAgICAgIFJOIDkgIAotcV8yICAgICAgICAgUk4gMTAgCi1xXzMgICAgICAgICBSTiAxMiAKLQotOy8vIEZpbHRlcmluZwotCi1kcDBxMCAgICAgICBSTiAxMgotZHAxcDAgICAgICAgUk4gMTIKLWRxMXEwICAgICAgIFJOIDEyCi1kcDJwMCAgICAgICBSTiAxMgotZHEycTAgICAgICAgUk4gMTIKLSAgICAgICAgICAgIAotYXAwcTAgICAgICAgUk4gMSAgCi1maWx0ICAgICAgICBSTiAyCi0gICAgICAgIAotbTAwICAgICAgICAgUk4gMTQKLW0wMSAgICAgICAgIFJOIDExCi0gICAgICAgICAgICAKLWFwZmxnICAgICAgIFJOIDAgCi1hcWZsZyAgICAgICBSTiA2Ci1hcHFmbGcgICAgICBSTiAwCi0gICAgICAgICAgICAKLQotOy8vRGVjbGFyYXRpb25zIGZvciBiU0xUNCBrZXJuZWwKLQotdEMwICAgICAgICAgUk4gNwotcHRDMCAgICAgICAgUk4gMQotCi1wUTBhICAgICAgICBSTiAwICAgIAotU3RlcGEgICAgICAgUk4gMSAgICAKLW1hc2thICAgICAgIFJOIDE0Ci0gICAgICAgICAgICAKLVAwYSAgICAgICAgIFJOIDEKLVAxYSAgICAgICAgIFJOIDgKLVEwYSAgICAgICAgIFJOIDcKLVExYSAgICAgICAgIFJOIDExCi0gICAgICAgICAgICAKLTsvL0RlY2xhcmF0aW9ucyBmb3IgYlNHRTQga2VybmVsCi0KLXBRMGIgICAgICAgIFJOIDAKLVN0ZXBiICAgICAgIFJOIDEKLW1hc2tiICAgICAgIFJOIDE0Ci0gICAgICAgICAgICAKLVAwYiAgICAgICAgIFJOIDYKLVAxYiAgICAgICAgIFJOIDcKLVAyYiAgICAgICAgIFJOIDEKLVAzYiAgICAgICAgIFJOIDMKLSAgICAgICAgICAgIAotUTBiICAgICAgICAgUk4gOSAKLVExYiAgICAgICAgIFJOIDAgICAKLVEyYiAgICAgICAgIFJOIDIgCi1RM2IgICAgICAgICBSTiAzIAotCi07Ly8gTWlzY2VsbGFub3VzCi1YWSAgICAgICAgICBSTiA4Ci10MCAgICAgICAgICBSTiAzIAotdDEgICAgICAgICAgUk4gMTIKLXQyICAgICAgICAgIFJOIDE0Ci10NyAgICAgICAgICBSTiA3Ci10NCAgICAgICAgICBSTiA0Ci10NSAgICAgICAgICBSTiAxICAKLXQ4ICAgICAgICAgIFJOIDYgIAotYSAgICAgICAgICAgUk4gMAotCi0gICAgICAgICAgICAKLQotICAgICAgICAKLSAgICAgICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSAKLSAgICAgICAgTV9BTExPQzQgcHBUaHJlc2hvbGRzLDQKLSAgICAgICAgTV9BTExPQzQgcFFfMyw0Ci0gICAgICAgIE1fQUxMT0M0IHBQXzMsNAotICAgICAgICBNX0FMTE9DOCBwQWxwaGFCZXRhMCw4Ci0gICAgICAgIE1fQUxMT0M4IHBBbHBoYUJldGExLDgKLSAgICAgICAgTV9BTExPQzggcFhZQlMsNAotICAgICAgICBNX0FMTE9DNCBwcEJTLDQKLSAgICAgICAgTV9BTExPQzggcHBRMFN0ZXAsNAotICAgICAgICBNX0FMTE9DNCBwU3RlcCw0Ci0gICAgICAgIAotICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIE1fU1RBUlQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0ksIHIxMQotICAgICAgICAKLSAgICAgICAgOy8vSW5wdXQgYXJndW1lbnRzIG9uIHRoZSBzdGFjawotICAgICAgICBNX0FSRyAgIHBwVGhyZXNob2xkc0FyZywgNAotICAgICAgICBNX0FSRyAgIHBwQlNBcmcsIDQKLQotICAgICAgICBMRFIgICAgIHQ0LD1NQVNLXzEKLQotICAgICAgICBMRFJCICAgIGFscGhhMCwgW3BBbHBoYUFyZ10KLSAgICAgICAgTERSQiAgICBiZXRhMCwgIFtwQmV0YUFyZ10KLSAgICAgICAgTERSQiAgICBhbHBoYTEsIFtwQWxwaGFBcmcsIzFdCi0gICAgICAgIExEUkIgICAgYmV0YTEsICBbcEJldGFBcmcsIzFdCi0KLSAgICAgICAgTVVMICAgICBhbHBoYTAsIGFscGhhMCwgdDQKLSAgICAgICAgTVVMICAgICBiZXRhMCwgYmV0YTAsIHQ0Ci0gICAgICAgIE1VTCAgICAgYWxwaGExLCBhbHBoYTEsIHQ0Ci0gICAgICAgIE1VTCAgICAgYmV0YTEsIGJldGExLCB0NAotCi0gICAgICAgIE1fU1RSRCAgYWxwaGEwLCBiZXRhMCwgcEFscGhhQmV0YTAKLSAgICAgICAgTV9TVFJEICBhbHBoYTEsIGJldGExLCBwQWxwaGFCZXRhMQotCi0gICAgICAgIExEUiAgICAgWFksPUxPT1BfQ09VTlQKLSAgICAgICAgTV9MRFIgICBwQlMsIHBwQlNBcmcKLSAgICAgICAgTV9MRFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzQXJnCi0gICAgICAgIE1fU1RSICAgc3JjZHN0U3RlcCwgcFN0ZXAKLSAgICAgICAgTV9TVFJEICBYWSwgcEJTLCBwWFlCUwotICAgICAgICBTVUIgICAgIHBRMCwgcFEwLCBzcmNkc3RTdGVwLCBMU0wgIzIKLSAgICAgICAgTV9TVFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCi1Mb29wWQotTG9vcFgKLTsvLy0tLS0tLS0tLS0tLS0tLUxvYWQgUGl4ZWxzLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBNX1NUUiAgIHBRMCwgcHBRMFN0ZXAKLSAgICAgICAgTV9MRFIgICBwXzMsIFtwUTBdLCBzcmNkc3RTdGVwCi0gICAgICAgIE1fTERSICAgcF8yLCBbcFEwXSwgc3JjZHN0U3RlcAotICAgICAgICBNX1NUUiAgIHBfMywgcFBfMwotICAgICAgICBMRFJCICAgIGJTLCBbcEJTXSwgIzEKLSAgICAgICAgTV9TVFIgICBwQlMsIHBwQlMKLSAgICAgICAgTV9MRFIgICBwXzEsIFtwUTBdLCBzcmNkc3RTdGVwCi0gICAgICAgIENNUCAgICAgYlMsICMwCi0gICAgICAgIE1fTERSICAgcF8wLCBbcFEwXSwgc3JjZHN0U3RlcAotICAgICAgICBNX0xEUiAgIHFfMCwgW3BRMF0sIHNyY2RzdFN0ZXAKLSAgICAgICAgTV9MRFIgICBxXzEsIFtwUTBdLCBzcmNkc3RTdGVwCi0gICAgICAgIE1fTERSICAgcV8yLCBbcFEwXSwgc3JjZHN0U3RlcAotICAgICAgICBNX0xEUiAgIHFfMywgW3BRMF0sIHNyY2RzdFN0ZXAKLSAgICAgICAgQkVRICAgICBOb0ZpbHRlckJTMAotICAgICAgICBDTVAgICAgIGJTLCAjNAotICAgICAgICBNX1NUUiAgIHFfMywgcFFfMwotCi07Ly8tLS0tLS0tLS0tLS0tLUZpbHRlcmluZyBEZWNpc2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIExEUiAgICAgbTAxLCA9TUFTS18xICAgICAgICAgICAgICAgIDsvLyAgMDEwMTAxMDEgbWFzayAKLSAgICAgICAgTU9WICAgICBtMDAsICNNQVNLXzAgICAgICAgICAgICAgICAgOy8vICAwMDAwMDAwMCBtYXNrIAotCi0gICAgICAgIDsvLyBDaGVjayB8cDAtcTB8PEFscGhhIAotICAgICAgICBVU1VCOCAgIGRwMHEwLCBwXzAsIHFfMCAKLSAgICAgICAgVVNVQjggICBhLCBxXzAsIHBfMAotICAgICAgICBTRUwgICAgIGFwMHEwLCBhLCBkcDBxMAotICAgICAgICBVU1VCOCAgIGEsIGFwMHEwLCBhbHBoYQotICAgICAgICBTRUwgICAgIGZpbHQsIG0wMCwgbTAxCi0gICAgICAgIAotICAgICAgICA7Ly8gQ2hlY2sgfHAxLXAwfDxCZXRhIAotICAgICAgICBVU1VCOCAgIGRwMXAwLCBwXzEsIHBfMAotICAgICAgICBVU1VCOCAgIGEsIHBfMCwgcF8xCi0gICAgICAgIFNFTCAgICAgYSwgYSwgZHAxcDAKLSAgICAgICAgVVNVQjggICBhLCBhLCBiZXRhCi0gICAgICAgIFNFTCAgICAgZmlsdCwgbTAwLCBmaWx0Ci0KLSAgICAgICAgOy8vIENoZWNrIHxxMS1xMHw8QmV0YSAKLSAgICAgICAgVVNVQjggICBkcTFxMCwgcV8xLCBxXzAKLSAgICAgICAgVVNVQjggICBhLCBxXzAsIHFfMQotICAgICAgICBTRUwgICAgIGEsIGEsIGRxMXEwCi0gICAgICAgIFVTVUI4ICAgYSwgYSwgYmV0YQotICAgICAgICBTRUwgICAgIGZpbHQsIG0wMCwgZmlsdAotCi0gICAgICAgIDsvLyBDaGVjayBhcDxCZXRhIAotICAgICAgICBVU1VCOCAgIGRwMnAwLCBwXzIsIHBfMAotICAgICAgICBVU1VCOCAgIGEsIHBfMCwgcF8yCi0gICAgICAgIFNFTCAgICAgYSwgYSwgZHAycDAKLSAgICAgICAgVVNVQjggICBhLCBhLCBiZXRhCi0gICAgICAgIFNFTCAgICAgYXBmbGcsIG0wMCwgZmlsdCAgICAgICAgICAgIDsvLyBhcGZsZyA9IGZpbHQgJiYgKGFwPGJldGEpCi0KLSAgICAgICAgOy8vIENoZWNrIGFxPEJldGEgCi0gICAgICAgIFVTVUI4ICAgZHEycTAsIHFfMiwgcV8wCi0gICAgICAgIFVTVUI4ICAgdDIsIHFfMCwgcV8yCi0gICAgICAgIFNFTCAgICAgdDIsIHQyLCBkcTJxMAotICAgICAgICBVU1VCOCAgIHQyLCB0MiwgYmV0YQotICAgICAgICBNT1YgICAgIHQ3LCMwCi0KLSAgICAgICAgQkxUICAgICBiU0xUNCAgICAgICAgCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tRmlsdGVyLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWJTR0U0ICAgICAgICAKLSAgICAgICAgOy8vLS0tLS0tLS0tYlNHRTQgRXhlY3V0aW9uLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIFNFTCAgICAgdDEsIHQ3LCBmaWx0ICAgICAgICAgICAgOy8vIGFxZmxnID0gZmlsdCAmJiAoYXE8YmV0YSkgCi0gICAgICAgIENNUCAgICAgZmlsdCwgIzAKLSAgICAgICAgT1JSICAgICBhcHFmbGcsIGFwZmxnLCB0MSwgTFNMICMxCi0gICAgICAgIE1fTERSRCAgcFEwLCBzcmNkc3RTdGVwLCBwcFEwU3RlcCwgRVEKLSAgICAgICAgQkVRICAgICBOb0ZpbHRlckZpbHQwCi0KLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNHRTRfdW5zYWZlCi0gICAgICAgIAotICAgICAgICA7Ly8tLS0tLS0tLS1TdG9yZSByZXN1bHQtLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgTV9MRFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCi0gICAgICAgIE1PViAgICAgcF8yLCBRMWIKLSAgICAgICAgTU9WICAgICBwXzEsIFAyYgotICAgICAgICBNX0xEUkQgIHBRMGIsIFN0ZXBiLCBwcFEwU3RlcAotICAgICAgICBBREQgICAgIHBUaHJlc2hvbGRzLCAjMQotICAgICAgICBNX1NUUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKLSAgICAgICAgTV9TVFIgICBwXzEsIFtwUTBiLCBTdGVwYl0hCi0gICAgICAgIE1fU1RSICAgUDFiLCBbcFEwYiwgU3RlcGJdIQotICAgICAgICBNX1NUUiAgIFAwYiwgW3BRMGIsIFN0ZXBiXSEKLSAgICAgICAgTV9TVFIgICBRMGIsIFtwUTBiLCBTdGVwYl0hCi0gICAgICAgIFNUUiAgICAgcF8yLCBbcFEwYiwgU3RlcGJdCi0gICAgICAgIFNUUiAgICAgUTJiLCBbcFEwYiwgU3RlcGIsIExTTCAjMV0KLQotCi0gICAgICAgIE1fTERSRCAgWFksIHBCUywgcFhZQlMKLSAgICAgICAgU1VCICAgICBwUTAsIHBRMGIsIFN0ZXBiLCBMU0wgIzIKLSAgICAgICAgQUREICAgICBwUTAsIHBRMCwgIzQKLSAgICAgICAgTV9MRFJEICBhbHBoYSwgYmV0YSwgcEFscGhhQmV0YTAKLSAgICAgICAgQUREUyAgICBYWSwgWFksIFhZCi0gICAgICAgIE1fU1RSICAgWFksIHBYWUJTCi0gICAgICAgIEJDQyAgICAgTG9vcFgKLSAgICAgICAgQiAgICAgICBFeGl0TG9vcFkKLQotOy8vLS0tLS0tLS0tLSBFeGl0IG9mIExvb3BYIC0tLS0tLS0tLS0tLS0tCi07Ly8tLS0tIGZvciB0aGUgY2FzZSBvZiBubyBmaWx0ZXJpbmcgLS0tLS0KLQotTm9GaWx0ZXJCUzAKLSAgICAgICAgU1VCICAgICBwUTAsIHBRMCwgc3JjZHN0U3RlcCwgTFNMICMzCi1Ob0ZpbHRlckZpbHQwCi0gICAgICAgIEFERCAgICAgcFEwLCBwUTAsICM0Ci0gICAgICAgIDsvLyBMb2FkIGNvdW50ZXIgZm9yIExvb3BYCi0gICAgICAgIE1fTERSRCAgWFksIHBCUywgcFhZQlMKLSAgICAgICAgTV9MRFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCi0gICAgICAgIE1fTERSRCAgYWxwaGEsIGJldGEsIHBBbHBoYUJldGEwCi0KLSAgICAgICAgOy8vIEFsaWduIHRoZSBwb2ludGVycwotICAgICAgICBBRERTICAgIFhZLCBYWSwgWFkKLSAgICAgICAgQUREICAgICBwVGhyZXNob2xkcywgcFRocmVzaG9sZHMsICMxCi0gICAgICAgIE1fU1RSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcwotICAgICAgICBNX1NUUiAgIFhZLCBwWFlCUwotICAgICAgICBCQ0MgICAgIExvb3BYCi0gICAgICAgIEIgICAgICAgRXhpdExvb3BZCi0KLWJTTFQ0ICAgICAgICAKLSAgICAgICAgOy8vLS0tLS0tLS0tYlNMVDQgRXhlY3V0aW9uLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIFNFTCAgICAgYXFmbGcsIHQ3LCBmaWx0ICAgICAgICAgICAgOy8vIGFxZmxnID0gZmlsdCAmJiAoYXE8YmV0YSkgCi0gICAgICAgIE1fTERSICAgcHRDMCwgcHBUaHJlc2hvbGRzCi0gICAgICAgIENNUCAgICAgZmlsdCwgIzAKLSAgICAgICAgTV9MRFJEICBwUTAsIHNyY2RzdFN0ZXAsIHBwUTBTdGVwLCBFUQotICAgICAgICBCRVEgICAgIE5vRmlsdGVyRmlsdDAKLSAgICAgICAgCi0gICAgICAgIExEUkIgICAgdEMwLCBbcHRDMF0sICMxCi0gICAgICAgIE1fU1RSICAgcHRDMCwgcHBUaHJlc2hvbGRzCi0KLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNMVDRfdW5zYWZlCi0KLSAgICAgICAgOy8vLS0tLS0tLS0tU3RvcmUgcmVzdWx0LS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIE1PViAgICAgcF8yLCBQMGEKLSAgICAgICAgTV9MRFJEICBwUTBhLCBTdGVwYSwgcHBRMFN0ZXAKLSAgICAgICAgTV9TVFIgICBQMWEsIFtwUTBhLCBTdGVwYSwgTFNMICMxXSEKLSAgICAgICAgTV9TVFIgICBwXzIsIFtwUTBhLCBTdGVwYV0hCi0gICAgICAgIE1fU1RSICAgUTBhLCBbcFEwYSwgU3RlcGFdIQotICAgICAgICBTVFIgICAgIFExYSwgW3BRMGEsIFN0ZXBhXQotICAgICAgIAotICAgICAgICA7Ly8gTG9hZCBjb3VudGVyCi0gICAgICAgIE1fTERSRCAgWFksIHBCUywgcFhZQlMKLSAgICAgICAgTV9MRFJEICBhbHBoYSwgYmV0YSwgcEFscGhhQmV0YTAKLQotICAgICAgICBTVUIgICAgIHBRMCwgcFEwYSwgU3RlcGEsIExTTCAjMgotICAgICAgICBBREQgICAgIHBRMCwgcFEwLCAjNAotCi0gICAgICAgIEFERFMgICAgWFksIFhZLCBYWQotICAgICAgICBNX1NUUiAgIFhZLCBwWFlCUwotICAgICAgICBCQ0MgICAgIExvb3BYCi0gICAgICAgIAotOy8vLS0tLS0tLS0gQ29tbW9uIEV4aXQgb2YgTG9vcFkgLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgOy8vIEFsaWduIHRoZSBwb2ludGVycyAKLUV4aXRMb29wWQotICAgICAgICBNX0xEUkQgIGFscGhhLCBiZXRhLCBwQWxwaGFCZXRhMQotICAgICAgICBTVUIgICAgIHBRMCwgcFEwLCAjMTYKLSAgICAgICAgQUREICAgICBwUTAsIHBRMCwgc3JjZHN0U3RlcCwgTFNMICMyCi0gICAgICAgIE1fU1RSRCAgYWxwaGEsIGJldGEsIHBBbHBoYUJldGEwCi0KLSAgICAgICAgQk5FICAgICBMb29wWQotICAgICAgICBNT1YgICAgIHIwLCAjT01YX1N0c19Ob0VycgotOy8vLS0tLS0tLS0tLS0tLS0tLS1FbmQgRmlsdGVyLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgTV9FTkQKLQotICAgIEVORElGICAgICAgICAKLSAgICAgICAgCi0KLSAgICAgICAgRU5ECi0gICAgICAgIAotICAgICAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0lfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSV9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhZGYyN2IuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1NjQgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDk2NDEKLTsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotCi0gICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0KLSAgICAgICAgSU1QT1JUICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNMVDRfdW5zYWZlCi0gICAgICAgIElNUE9SVCAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTR0U0X3Vuc2FmZQotICAgICAgICAKLSAgICAKLSAgICBJRiBBUk0xMTM2SlMKLQotTUFTS18wICAgICAgRVFVIDB4MDAwMDAwMDAgICAKLU1BU0tfMSAgICAgIEVRVSAweDAxMDEwMTAxCi1NQVNLXzIgICAgICBFUVUgMHhmZjAwZmYwMAotTE9PUF9DT1VOVCAgRVFVIDB4MTExMTAwMDAKLQotOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCi0KLXBTcmNEc3QgICAgIFJOIDAKLXNyY2RzdFN0ZXAgIFJOIDEKLXBBbHBoYUFyZyAgIFJOIDIKLXBCZXRhQXJnICAgIFJOIDMKLQotcFRocmVzaG9sZHMgUk4gMTQKLXBCUyAgICAgICAgIFJOIDkKLXBRMCAgICAgICAgIFJOIDAKLWJTICAgICAgICAgIFJOIDIKLQotYWxwaGEgICAgICAgUk4gNgotYWxwaGEwICAgICAgUk4gNgotYWxwaGExICAgICAgUk4gOAotCi1iZXRhICAgICAgICBSTiA3Ci1iZXRhMCAgICAgICBSTiA3Ci1iZXRhMSAgICAgICBSTiA5Ci0KLTsvLyBEZWNsYXJlIExvY2FsL1RlbXBvcmFyeSB2YXJpYWJsZXMKLQotOy8vIFBpeGVscwotcF8wICAgICAgICAgUk4gMyAgCi1wXzEgICAgICAgICBSTiA1ICAKLXBfMiAgICAgICAgIFJOIDQgIAotcF8zICAgICAgICAgUk4gMiAgCi1xXzAgICAgICAgICBSTiA4ICAKLXFfMSAgICAgICAgIFJOIDkgIAotcV8yICAgICAgICAgUk4gMTAgCi1xXzMgICAgICAgICBSTiAxMiAKLQotOy8vIFVucGFja2luZwotbWFzayAgICAgICAgUk4gMTEgCi0KLXJvdzAgICAgICAgIFJOIDIKLXJvdzEgICAgICAgIFJOIDQKLXJvdzIgICAgICAgIFJOIDUKLXJvdzMgICAgICAgIFJOIDMKLQotcm93NCAgICAgICAgUk4gOAotcm93NSAgICAgICAgUk4gOQotcm93NiAgICAgICAgUk4gMTAKLXJvdzcgICAgICAgIFJOIDEyCi1yb3c4ICAgICAgICBSTiAxNAotcm93OSAgICAgICAgUk4gNwotICAgICAgICAgICAgCi10dW5wazAgICAgICBSTiA4Ci10dW5wazEgICAgICBSTiA5Ci10dW5wazIgICAgICBSTiAxMAotdHVucGszICAgICAgUk4gMTIKLXR1bnBrNCAgICAgIFJOIDAKLQotdHVucGs1ICAgICAgUk4gMQotdHVucGs2ICAgICAgUk4gMTQKLXR1bnBrNyAgICAgIFJOIDIgCi10dW5wazggICAgICBSTiA1IAotdHVucGs5ICAgICAgUk4gNiAKLSAKLQotOy8vIEZpbHRlcmluZwotCi1kcDBxMCAgICAgICBSTiAxMgotZHAxcDAgICAgICAgUk4gMTIKLWRxMXEwICAgICAgIFJOIDEyCi1kcDJwMCAgICAgICBSTiAxMgotZHEycTAgICAgICAgUk4gMTIKLSAgICAgICAgICAgIAotYXAwcTAgICAgICAgUk4gMSAgCi1maWx0ICAgICAgICBSTiAyCi0gICAgICAgIAotbTAwICAgICAgICAgUk4gMTQKLW0wMSAgICAgICAgIFJOIDExCi0gICAgICAgICAgICAKLWFwZmxnICAgICAgIFJOIDAgCi1hcWZsZyAgICAgICBSTiA2Ci1hcHFmbGcgICAgICBSTiAwCi0gICAgICAgICAgICAKLQotOy8vRGVjbGFyYXRpb25zIGZvciBiU0xUNCBrZXJuZWwKLQotdEMwICAgICAgICAgUk4gNwotcHRDMCAgICAgICAgUk4gMQotCi1wUTBhICAgICAgICBSTiAwICAgIAotU3RlcGEgICAgICAgUk4gMSAgICAKLW1hc2thICAgICAgIFJOIDE0Ci0gICAgICAgICAgICAKLVAwYSAgICAgICAgIFJOIDEKLVAxYSAgICAgICAgIFJOIDgKLVEwYSAgICAgICAgIFJOIDcKLVExYSAgICAgICAgIFJOIDExCi0gICAgICAgICAgICAKLTsvL0RlY2xhcmF0aW9ucyBmb3IgYlNHRTQga2VybmVsCi0KLXBRMGIgICAgICAgIFJOIDAKLVN0ZXBiICAgICAgIFJOIDEKLW1hc2tiICAgICAgIFJOIDE0Ci0gICAgICAgICAgICAKLVAwYiAgICAgICAgIFJOIDYKLVAxYiAgICAgICAgIFJOIDcKLVAyYiAgICAgICAgIFJOIDEKLVAzYiAgICAgICAgIFJOIDMKLSAgICAgICAgICAgIAotUTBiICAgICAgICAgUk4gOSAKLVExYiAgICAgICAgIFJOIDAgICAKLVEyYiAgICAgICAgIFJOIDIgCi1RM2IgICAgICAgICBSTiAzIAotCi07Ly8gTWlzY2VsbGFub3VzCi1YWSAgICAgICAgICBSTiA4Ci10MCAgICAgICAgICBSTiAzIAotdDEgICAgICAgICAgUk4gMTIKLXQyICAgICAgICAgIFJOIDE0Ci10NyAgICAgICAgICBSTiA3Ci10NCAgICAgICAgICBSTiA0Ci10NSAgICAgICAgICBSTiAxICAKLXQ4ICAgICAgICAgIFJOIDYgIAotYSAgICAgICAgICAgUk4gMAotCi0gICAgICAgICAgICAKLQotICAgICAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IAotICAgICAgICBNX0FMTE9DNCBwcFRocmVzaG9sZHMsNAotICAgICAgICBNX0FMTE9DNCBwUV8zLDQKLSAgICAgICAgTV9BTExPQzQgcFBfMyw0Ci0gICAgICAgIE1fQUxMT0M4IHBBbHBoYUJldGEwLDgKLSAgICAgICAgTV9BTExPQzggcEFscGhhQmV0YTEsOAotICAgICAgICBNX0FMTE9DOCBwWFlCUyw0Ci0gICAgICAgIE1fQUxMT0M0IHBwQlMsNAotICAgICAgICBNX0FMTE9DOCBwcFEwU3RlcCw0Ci0gICAgICAgIE1fQUxMT0M0IHBTdGVwLDQKLSAgICAgICAgCi0gICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSSwgcjExCi0gICAgICAgIAotICAgICAgICA7Ly9JbnB1dCBhcmd1bWVudHMgb24gdGhlIHN0YWNrCi0gICAgICAgIE1fQVJHICAgcHBUaHJlc2hvbGRzQXJnLCA0Ci0gICAgICAgIE1fQVJHICAgcHBCU0FyZywgNAotICAgICAgICAKLSAgICAgICAgTERSICAgICB0NCw9TUFTS18xCi0KLSAgICAgICAgTERSQiAgICBhbHBoYTAsIFtwQWxwaGFBcmddCi0gICAgICAgIExEUkIgICAgYmV0YTAsICBbcEJldGFBcmddCi0gICAgICAgIExEUkIgICAgYWxwaGExLCBbcEFscGhhQXJnLCMxXQotICAgICAgICBMRFJCICAgIGJldGExLCAgW3BCZXRhQXJnLCMxXQotCi0gICAgICAgIE1VTCAgICAgYWxwaGEwLCBhbHBoYTAsIHQ0Ci0gICAgICAgIE1VTCAgICAgYmV0YTAsIGJldGEwLCB0NAotICAgICAgICBNVUwgICAgIGFscGhhMSwgYWxwaGExLCB0NAotICAgICAgICBNVUwgICAgIGJldGExLCBiZXRhMSwgdDQKLQotICAgICAgICBNX1NUUkQgIGFscGhhMCwgYmV0YTAsIHBBbHBoYUJldGEwCi0gICAgICAgIE1fU1RSRCAgYWxwaGExLCBiZXRhMSwgcEFscGhhQmV0YTEKLQotICAgICAgICBMRFIgICAgIFhZLD1MT09QX0NPVU5UCi0gICAgICAgIE1fTERSICAgcEJTLCBwcEJTQXJnCi0gICAgICAgIE1fTERSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkc0FyZwotICAgICAgICBNX1NUUiAgIHNyY2RzdFN0ZXAsIHBTdGVwCi0gICAgICAgIE1fU1RSRCAgWFksIHBCUywgcFhZQlMKLSAgICAgICAgTV9TVFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCi0gICAgICAgIAotICAgICAgICBTVUIgICAgIHBRMCwgcFEwLCAjNAotTG9vcFkKLTsvLy0tLS0tLS0tLS0tLS0tLUxvYWQgUGl4ZWxzLS0tLS0tLS0tLS0tLS0tLS0tLQotCi07Ly8tLS0tLS0tLS0tLS0tLS0tUGFjayBwMC1wMy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIExEUiAgICAgbWFzaywgPU1BU0tfMgotICAgICAgICAKLSAgICAgICAgTV9MRFIgICByb3cwLCBbcFEwXSwgc3JjZHN0U3RlcCAgICAgICAgICAKLSAgICAgICAgTV9MRFIgICByb3cxLCBbcFEwXSwgc3JjZHN0U3RlcCAgICAgICAgICAKLSAgICAgICAgTERSICAgICByb3cyLCBbcFEwXQotICAgICAgICBMRFIgICAgIHJvdzMsIFtwUTAsIHNyY2RzdFN0ZXBdCi0gICAgICAgIFNVQiAgICAgcFEwLCBwUTAsIHNyY2RzdFN0ZXAsIExTTCAjMQotICAgICAgICAKLSAgICAgICAgOy8vIHJvdzAgPSBbcjBwMCByMHAxIHIwcDIgcjBwM10KLSAgICAgICAgOy8vIHJvdzEgPSBbcjFwMCByMXAxIHIxcDIgcjFwM10KLSAgICAgICAgOy8vIHJvdzIgPSBbcjJwMCByMnAxIHIycDIgcjJwM10KLSAgICAgICAgOy8vIHJvdzMgPSBbcjNwMCByM3AxIHIzcDIgcjNwM10KLQotICAgICAgICBBTkQgICAgIHR1bnBrMCwgbWFzaywgcm93MAotICAgICAgICBBTkQgICAgIHR1bnBrNiwgbWFzaywgcm93MCwgTFNMIzgKLSAgICAgICAgVVhUQUIxNiB0dW5wazAsIHR1bnBrMCwgcm93MSwgUk9SIzgKLSAgICAgICAgVVhUQUIxNiB0dW5wazYsIHR1bnBrNiwgcm93MQotICAgICAgICBBTkQgICAgIHR1bnBrMiwgbWFzaywgcm93MgotICAgICAgICBBTkQgICAgIHR1bnBrMywgbWFzaywgcm93MiwgTFNMIzgKLSAgICAgICAgVVhUQUIxNiB0dW5wazIsIHR1bnBrMiwgcm93MywgUk9SIzgKLSAgICAgICAgVVhUQUIxNiB0dW5wazMsIHR1bnBrMywgcm93MwotCi0gICAgICAgIDsvLyB0dW5wazAgPSBbcjBwMCByMXAwIHIwcDIgcjFwMl0KLSAgICAgICAgOy8vIHR1bnBrNiA9IFtyMHAxIHIxcDEgcjBwMyByMXAzXQotICAgICAgICA7Ly8gdHVucGsyID0gW3IycDAgcjNwMCByMnAyIHIzcDJdCi0gICAgICAgIDsvLyB0dW5wazMgPSBbcjJwMSByM3AxIHIycDMgcjNwM10KLQotICAgICAgICBQS0hUQiAgIHBfMCwgdHVucGswLCB0dW5wazIsIEFTUiMxNgotICAgICAgICBQS0hUQiAgIHBfMSwgdHVucGs2LCB0dW5wazMsIEFTUiMxNgotICAgICAgICBQS0hCVCAgIHBfMiwgdHVucGsyLCB0dW5wazAsIExTTCMxNgotICAgICAgICBQS0hCVCAgIHBfMywgdHVucGszLCB0dW5wazYsIExTTCMxNgotCi0KLSAgICAgICAgOy8vIHBfMCA9IFtyMHAwIHIxcDAgcjJwMCByM3AwXQotICAgICAgICA7Ly8gcF8xID0gW3IwcDEgcjFwMSByMnAxIHIzcDFdCi0gICAgICAgIDsvLyBwXzIgPSBbcjBwMiByMXAyIHIycDEgcjNwMl0KLSAgICAgICAgOy8vIHBfMyA9IFtyMHAzIHIxcDMgcjJwMyByM3AzXQotCi0gICAgICAgIE1fU1RSICAgcF8zLCBwUF8zCi0KLTsvLy0tLS0tLS0tLS0tLS0tLS1QYWNrIHEwLXEzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUxvb3BYCi0gICAgICAgIExEUkIgICAgYlMsIFtwQlNdLCAjNAotICAgICAgICBNX1NUUiAgIHBRMCwgcHBRMFN0ZXAKLSAgICAgICAgTERSICAgICBtYXNrLCA9TUFTS18yCi0gICAgICAgIENNUCAgICAgYlMsICMwCi0gICAgICAgIE1fU1RSICAgcEJTLCBwcEJTCi0KLSAgICAgICAgTERSICAgICByb3c0LCBbcFEwLCAjNF0hCi0gICAgICAgIEJFUS5XICAgTm9GaWx0ZXJCUzAKLSAgICAgICAgTV9MRFIgICByb3c1LCBbcFEwLCBzcmNkc3RTdGVwXSEKLSAgICAgICAgTV9MRFIgICByb3c2LCBbcFEwLCBzcmNkc3RTdGVwXSEKLSAgICAgICAgTV9MRFIgICByb3c3LCBbcFEwLCBzcmNkc3RTdGVwXQotCi0gICAgICAgIDsvLyByb3c0ID0gW3IwcTMgcjBxMiByMHExIHIwcTBdCi0gICAgICAgIDsvLyByb3c1ID0gW3IxcTMgcjFxMiByMXExIHIxcTBdCi0gICAgICAgIDsvLyByb3c2ID0gW3IycTMgcjJxMiByMnExIHIycTBdCi0gICAgICAgIDsvLyByb3c3ID0gW3IzcTMgcjNxMiByM3ExIHIzcTBdCi0gICAgCi0gICAgICAgIEFORCAgICAgdHVucGs0LCBtYXNrLCByb3c0Ci0gICAgICAgIENNUCAgICAgYlMsICM0Ci0gICAgICAgIEFORCAgICAgdHVucGs1LCBtYXNrLCByb3c0LCBMU0wjOAotICAgICAgICBVWFRBQjE2IHR1bnBrNCwgdHVucGs0LCByb3c1LCBST1IjOAotICAgICAgICBVWFRBQjE2IHR1bnBrNSwgdHVucGs1LCByb3c1Ci0gICAgICAgIEFORCAgICAgdHVucGs2LCBtYXNrLCByb3c2Ci0gICAgICAgIEFORCAgICAgdHVucGs3LCBtYXNrLCByb3c2LCBMU0wjOAotICAgICAgICBVWFRBQjE2IHR1bnBrNiwgdHVucGs2LCByb3c3LCBST1IjOAotICAgICAgICBVWFRBQjE2IHR1bnBrNywgdHVucGs3LCByb3c3Ci0KLSAgICAgICAgOy8vIHR1bnBrNCA9IFtyMHEwIHIxcTAgcjBxMiByMXEyXQotICAgICAgICA7Ly8gdHVucGs1ID0gW3IwcTEgcjFxMSByMHEzIHIxcTNdCi0gICAgICAgIDsvLyB0dW5wazYgPSBbcjJxMCByM3EwIHIycTIgcjNxMl0KLSAgICAgICAgOy8vIHR1bnBrNyA9IFtyMnExIHIzcTEgcjJxMyByM3EzXQotCi0gICAgICAgIFBLSFRCICAgcV8zLCB0dW5wazQsIHR1bnBrNiwgQVNSIzE2Ci0gICAgICAgIFBLSFRCICAgcV8yLCB0dW5wazUsIHR1bnBrNywgQVNSIzE2Ci0gICAgICAgIFBLSEJUICAgcV8xLCB0dW5wazYsIHR1bnBrNCwgTFNMIzE2Ci0gICAgICAgIE1fU1RSICAgcV8zLCBwUV8zCi0gICAgICAgIFBLSEJUICAgcV8wLCB0dW5wazcsIHR1bnBrNSwgTFNMIzE2Ci0KLQotICAgICAgICA7Ly8gcV8wID0gW3IwcTAgcjFxMCByMnEwIHIzcTBdCi0gICAgICAgIDsvLyBxXzEgPSBbcjBxMSByMXExIHIycTEgcjNxMV0KLSAgICAgICAgOy8vIHFfMiA9IFtyMHEyIHIxcTIgcjJxMSByM3EyXQotICAgICAgICA7Ly8gcV8zID0gW3IwcTMgcjFxMyByMnEzIHIzcTNdCi0KLQotOy8vLS0tLS0tLS0tLS0tLS1GaWx0ZXJpbmcgRGVjaXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBMRFIgICAgIG0wMSwgPU1BU0tfMSAgICAgICAgICAgICAgICA7Ly8gIDAxMDEwMTAxIG1hc2sgCi0gICAgICAgIE1PViAgICAgbTAwLCAjTUFTS18wICAgICAgICAgICAgICAgIDsvLyAgMDAwMDAwMDAgbWFzayAKLQotICAgICAgICA7Ly8gQ2hlY2sgfHAwLXEwfDxBbHBoYSAKLSAgICAgICAgVVNVQjggICBkcDBxMCwgcF8wLCBxXzAgCi0gICAgICAgIFVTVUI4ICAgYSwgcV8wLCBwXzAKLSAgICAgICAgU0VMICAgICBhcDBxMCwgYSwgZHAwcTAKLSAgICAgICAgVVNVQjggICBhLCBhcDBxMCwgYWxwaGEKLSAgICAgICAgU0VMICAgICBmaWx0LCBtMDAsIG0wMQotICAgICAgICAKLSAgICAgICAgOy8vIENoZWNrIHxwMS1wMHw8QmV0YSAKLSAgICAgICAgVVNVQjggICBkcDFwMCwgcF8xLCBwXzAKLSAgICAgICAgVVNVQjggICBhLCBwXzAsIHBfMQotICAgICAgICBTRUwgICAgIGEsIGEsIGRwMXAwCi0gICAgICAgIFVTVUI4ICAgYSwgYSwgYmV0YQotICAgICAgICBTRUwgICAgIGZpbHQsIG0wMCwgZmlsdAotCi0gICAgICAgIDsvLyBDaGVjayB8cTEtcTB8PEJldGEgCi0gICAgICAgIFVTVUI4ICAgZHExcTAsIHFfMSwgcV8wCi0gICAgICAgIFVTVUI4ICAgYSwgcV8wLCBxXzEKLSAgICAgICAgU0VMICAgICBhLCBhLCBkcTFxMAotICAgICAgICBVU1VCOCAgIGEsIGEsIGJldGEKLSAgICAgICAgU0VMICAgICBmaWx0LCBtMDAsIGZpbHQKLQotICAgICAgICA7Ly8gQ2hlY2sgYXA8QmV0YSAKLSAgICAgICAgVVNVQjggICBkcDJwMCwgcF8yLCBwXzAKLSAgICAgICAgVVNVQjggICBhLCBwXzAsIHBfMgotICAgICAgICBTRUwgICAgIGEsIGEsIGRwMnAwCi0gICAgICAgIFVTVUI4ICAgYSwgYSwgYmV0YQotICAgICAgICBTRUwgICAgIGFwZmxnLCBtMDAsIGZpbHQgICAgICAgICAgICA7Ly8gYXBmbGcgPSBmaWx0ICYmIChhcDxiZXRhKQotCi0gICAgICAgIDsvLyBDaGVjayBhcTxCZXRhIAotICAgICAgICBVU1VCOCAgIGRxMnEwLCBxXzIsIHFfMAotICAgICAgICBVU1VCOCAgIHQyLCBxXzAsIHFfMgotICAgICAgICBTRUwgICAgIHQyLCB0MiwgZHEycTAKLSAgICAgICAgVVNVQjggICB0MiwgdDIsIGJldGEKLSAgICAgICAgTU9WICAgICB0NywjMAotICAgICAgICAKLQotICAgICAgICBCTFQgICAgIGJTTFQ0ICAgICAgICAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS1GaWx0ZXItLS0tLS0tLS0tLS0tLS0tLS0tLQotYlNHRTQgICAgICAgIAotICAgICAgICA7Ly8tLS0tLS0tLS1iU0dFNCBFeGVjdXRpb24tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgU0VMICAgICB0MSwgdDcsIGZpbHQgICAgICAgICAgICA7Ly8gYXFmbGcgPSBmaWx0ICYmIChhcTxiZXRhKSAKLSAgICAgICAgQ01QICAgICBmaWx0LCAjMAotICAgICAgICBPUlIgICAgIGFwcWZsZywgYXBmbGcsIHQxLCBMU0wgIzEKLSAgICAgICAgTV9MRFJEICBwUTAsIHNyY2RzdFN0ZXAsIHBwUTBTdGVwLCBFUQotICAgICAgICBCRVEgICAgIE5vRmlsdGVyRmlsdDAKLQotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0dFNF91bnNhZmUKLSAgICAgICAgCi0gICAgICAgIDsvLy0tLS0tLS0tLVN0b3JlIHJlc3VsdC0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIExEUiAgICAgbWFza2IsPU1BU0tfMgotCi0gICAgICAgIDsvLyBQMGIgPSBbcjBwMCByMXAwIHIycDAgcjNwMF0KLSAgICAgICAgOy8vIFAxYiA9IFtyMHAxIHIxcDEgcjJwMSByM3AxXQotICAgICAgICA7Ly8gUDJiID0gW3IwcDIgcjFwMiByMnAyIHIzcDJdCi0gICAgICAgIDsvLyBQM2IgPSBbcjBwMyByMXAzIHIycDMgcjNwM10KLQotICAgICAgICBNX0xEUiAgIFAzYiwgcFBfMyAgIAotICAgICAgICBNX1NUUiAgIFEwYiwgcFBfMyAgIAotCi0gICAgICAgIDsvLy0tLS0tLVBhY2sgcDAtcDMtLS0tLS0KLSAgICAgICAgQU5EICAgICB0dW5wazAsIG1hc2tiLCBQMGIKLSAgICAgICAgQU5EICAgICB0dW5wazIsIG1hc2tiLCBQMGIsIExTTCM4Ci0gICAgICAgIFVYVEFCMTYgdHVucGswLCB0dW5wazAsIFAxYiwgUk9SIzgKLSAgICAgICAgVVhUQUIxNiB0dW5wazIsIHR1bnBrMiwgUDFiCi0KLSAgICAgICAgQU5EICAgICB0dW5wazMsIG1hc2tiLCBQMmIKLSAgICAgICAgQU5EICAgICB0dW5wazgsIG1hc2tiLCBQMmIsIExTTCM4Ci0gICAgICAgIFVYVEFCMTYgdHVucGszLCB0dW5wazMsIFAzYiwgUk9SIzgKLSAgICAgICAgVVhUQUIxNiB0dW5wazgsIHR1bnBrOCwgUDNiCi0KLSAgICAgICAgOy8vIHR1bnBrMCA9IFtyMHAwIHIwcDEgcjJwMCByMnAxXQotICAgICAgICA7Ly8gdHVucGsyID0gW3IxcDAgcjFwMSByM3AwIHIzcDFdCi0gICAgICAgIDsvLyB0dW5wazMgPSBbcjBwMiByMHAzIHIycDIgcjJwM10KLSAgICAgICAgOy8vIHR1bnBrOCA9IFtyMXAyIHIxcDMgcjNwMiByM3AzXQotCi0gICAgICAgIE1PViAgICAgcF8yLCBRMWIKLSAgICAgICAgTV9MRFJEICBwUTBiLCBTdGVwYiwgcHBRMFN0ZXAKLQotICAgICAgICBQS0hUQiAgIHJvdzksIHR1bnBrMCwgdHVucGszLCBBU1IjMTYKLSAgICAgICAgUEtIQlQgICByb3c3LCB0dW5wazMsIHR1bnBrMCwgTFNMIzE2Ci0gICAgICAgIFBLSFRCICAgcm93MywgdHVucGsyLCB0dW5wazgsIEFTUiMxNgotICAgICAgICBQS0hCVCAgIHJvdzYsIHR1bnBrOCwgdHVucGsyLCBMU0wjMTYKLQotICAgICAgICA7Ly8gcm93OSA9IFtyMHAwIHIwcDEgcjBwMiByMHAzXQotICAgICAgICA7Ly8gcm93MyA9IFtyMXAwIHIxcDEgcjFwMiByMXAzXQotICAgICAgICA7Ly8gcm93NyA9IFtyMnAwIHIycDEgcjJwMiByMnAzXQotICAgICAgICA7Ly8gcm93NiA9IFtyM3AwIHIzcDEgcjNwMiByM3AzXQotCi0gICAgICAgIE1fU1RSICAgcm93OSwgW3BRMGJdLCBTdGVwYgotICAgICAgICBTVFIgICAgIHJvdzcsIFtwUTBiLCBTdGVwYl0KLSAgICAgICAgU1RSICAgICByb3c2LCBbcFEwYiwgU3RlcGIsIExTTCAjMV0KLSAgICAgICAgU1RSICAgICByb3czLCBbcFEwYl0sICM0Ci0gICAgICAgIAotICAgICAgICBNX0xEUiAgIFEzYiwgcFFfMwotCi0gICAgICAgIDsvLyBRMGIgPSBbcjBxMCByMXEwIHIycTAgcjNxMF0KLSAgICAgICAgOy8vIFExYiA9IFtyMHExIHIxcTEgcjJxMSByM3ExXQotICAgICAgICA7Ly8gUTJiID0gW3IwcTIgcjFxMiByMnEyIHIzcTJdCi0gICAgICAgIDsvLyBRM2IgPSBbcjBxMyByMXEzIHIycTMgcjNxM10KLQotICAgICAgICA7Ly8tLS0tLS1QYWNrIHEwLXEzLS0tLS0tCi0gICAgICAgIEFORCAgICAgdHVucGswLCBtYXNrYiwgcF8yCi0gICAgICAgIEFORCAgICAgdHVucGsyLCBtYXNrYiwgcF8yLCBMU0wjOAotICAgICAgICBVWFRBQjE2IHR1bnBrMCwgdHVucGswLCBRMGIsIFJPUiM4Ci0gICAgICAgIFVYVEFCMTYgdHVucGsyLCB0dW5wazIsIFEwYgotCi0gICAgICAgIEFORCAgICAgdHVucGszLCBtYXNrYiwgUTNiCi0gICAgICAgIEFORCAgICAgdHVucGs4LCBtYXNrYiwgUTNiLCBMU0wjOAotICAgICAgICBVWFRBQjE2IHR1bnBrMywgdHVucGszLCBRMmIsIFJPUiM4Ci0gICAgICAgIFVYVEFCMTYgdHVucGs4LCB0dW5wazgsIFEyYgotCi0gICAgICAgIDsvLyB0dW5wazAgPSBbcjBxMSByMHEwIHIycTEgcjJxMF0KLSAgICAgICAgOy8vIHR1bnBrMiA9IFtyMXExIHIxcTAgcjNxMSByM3EwXQotICAgICAgICA7Ly8gdHVucGszID0gW3IwcTMgcjBxMiByMnEzIHIycTJdCi0gICAgICAgIDsvLyB0dW5wazggPSBbcjFxMyByMXEyIHIzcTMgcjNxMl0KLQotICAgICAgICBQS0hUQiAgIHJvdzgsIHR1bnBrMywgdHVucGswLCBBU1IjMTYKLSAgICAgICAgUEtIQlQgICByb3c3LCB0dW5wazAsIHR1bnBrMywgTFNMIzE2Ci0gICAgICAgIFBLSFRCICAgcm93NCwgdHVucGs4LCB0dW5wazIsIEFTUiMxNgotICAgICAgICBQS0hCVCAgIHJvdzYsIHR1bnBrMiwgdHVucGs4LCBMU0wjMTYKLQotICAgICAgICA7Ly8gcm93OCA9IFtyMHEwIHIwcTEgcjBxMiByMHEzXQotICAgICAgICA7Ly8gcm93NCA9IFtyMXEwIHIxcTEgcjFxMiByMXEzXQotICAgICAgICA7Ly8gcm93NyA9IFtyMnEwIHIycTEgcjJxMiByMnEzXQotICAgICAgICA7Ly8gcm93NiA9IFtyM3EwIHIzcTEgcjNxMiByM3EzXQotCi0gICAgICAgIFNUUiAgICAgcm93NCwgW3BRMGJdCi0gICAgICAgIFNUUiAgICAgcm93NywgW3BRMGIsIFN0ZXBiXQotICAgICAgICBTVFIgICAgIHJvdzYsIFtwUTBiLCBTdGVwYiwgTFNMICMxXQotCi0gICAgICAgIFNVQiAgICAgcFEwLCBwUTBiLCBTdGVwYgotICAgICAgICBNT1YgICAgIHBfMSwgUTJiCi0KLSAgICAgICAgU1RSICAgICByb3c4LCBbcFEwXQotCi0gICAgICAgIE1fTERSRCAgWFksIHBCUywgcFhZQlMKLSAgICAgICAgTV9MRFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCi0gICAgICAgIE1fTERSRCAgYWxwaGEsIGJldGEsIHBBbHBoYUJldGExCi0KLSAgICAgICAgQUREUyAgICBYWSwgWFksIFhZCi0gICAgICAgIEFERCAgICAgcFRocmVzaG9sZHMsICM0Ci0gICAgICAgIE1fU1RSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcwotICAgICAgICBNX1NUUiAgIFhZLCBwWFlCUwotICAgICAgICBCQ0MgICAgIExvb3BYCi0gICAgICAgIEIgICAgICAgRXhpdExvb3BZCi0KLTsvLy0tLS0tLS0tLS0gRXhpdCBvZiBMb29wWCAtLS0tLS0tLS0tLS0tLQotOy8vLS0tLSBmb3IgdGhlIGNhc2Ugb2Ygbm8gZmlsdGVyaW5nIC0tLS0tCi0KLU5vRmlsdGVyRmlsdDAKLSAgICAgICAgQUREICAgICBwUTAsIHBRMCwgIzQKLU5vRmlsdGVyQlMwCi0gICAgICAgIDsvLyBMb2FkIGNvdW50ZXIgZm9yIExvb3BYCi0gICAgICAgIE1fTERSRCAgWFksIHBCUywgcFhZQlMKLSAgICAgICAgTV9MRFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCi0gICAgICAgIE1fTERSRCAgYWxwaGEsIGJldGEsIHBBbHBoYUJldGExCi0KLSAgICAgICAgOy8vIEFsaWduIHRoZSBwb2ludGVyCi0gICAgICAgIEFERFMgICAgWFksIFhZLCBYWQotICAgICAgICBBREQgICAgIHBUaHJlc2hvbGRzLCBwVGhyZXNob2xkcywgIzQKLSAgICAgICAgTV9TVFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCi0gICAgICAgIE1fU1RSICAgWFksIHBYWUJTCi0gICAgICAgIEJDQyAgICAgTG9vcFkKLSAgICAgICAgQiAgICAgICBFeGl0TG9vcFkKLSAgICAgICAgCi1iU0xUNCAgICAgICAgCi0gICAgICAgIDsvLy0tLS0tLS0tLWJTTFQ0IEV4ZWN1dGlvbi0tLS0tLS0tLS0tLS0tLQotICAgICAgICBTRUwgICAgIGFxZmxnLCB0NywgZmlsdCAgICAgICAgICAgIDsvLyBhcWZsZyA9IGZpbHQgJiYgKGFxPGJldGEpIAotICAgICAgICBNX0xEUiAgIHB0QzAsIHBwVGhyZXNob2xkcwotICAgICAgICBDTVAgICAgIGZpbHQsICMwCi0gICAgICAgIE1fTERSRCAgcFEwLCBzcmNkc3RTdGVwLCBwcFEwU3RlcCwgRVEKLSAgICAgICAgQkVRICAgICBOb0ZpbHRlckZpbHQwCi0gICAgICAgIAotICAgICAgICBMRFJCICAgIHRDMCwgW3B0QzBdLCAjNAotICAgICAgICBNX1NUUiAgIHB0QzAsIHBwVGhyZXNob2xkcwotCi0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTTFQ0X3Vuc2FmZQotCi0gICAgICAgIDsvLy0tLS0tLS0tLVN0b3JlIHJlc3VsdC0tLS0tLS0tLS0tLS0tLQotICAgICAgICA7Ly8tLS0tLS0tLVBhY2sgcDEscDAscTEscTAtLS0tLS0tLS0tLS0KLSAgICAgICAgCi0gICAgICAgIDsvL0xvYWQgZGVzdGluYXRpb24gcG9pbnRlcgotICAgICAgICBMRFIgICAgIG1hc2thLD1NQVNLXzIKLSAgICAgICAgTV9TVFIgICBRMGEsIHBQXzMKLSAgICAgICAgTU9WICAgICBwXzEsIHFfMgotCi0gICAgICAgIDsvLyBQMWEgPSBbcjBwMSByMXAxIHIycDEgcjNwMV0KLSAgICAgICAgOy8vIFAwYSA9IFtyMHAwIHIxcDAgcjJwMCByM3AwXQotICAgICAgICA7Ly8gUTBhID0gW3IwcTAgcjFxMCByMnEwIHIzcTBdCi0gICAgICAgIDsvLyBRMWEgPSBbcjBxMSByMXExIHIycTEgcjNxMV0KLQotICAgICAgICBBTkQgICAgIHR1bnBrMSwgbWFza2EsIFAwYQotICAgICAgICBBTkQgICAgIHR1bnBrMiwgbWFza2EsIFAwYSwgTFNMIzgKLSAgICAgICAgVVhUQUIxNiB0dW5wazEsIHR1bnBrMSwgUDFhLCBST1IjOAotICAgICAgICBVWFRBQjE2IHR1bnBrMiwgdHVucGsyLCBQMWEKLQotICAgICAgICBNX0xEUkQgIHBRMGEsIFN0ZXBhLCBwcFEwU3RlcAotCi0gICAgICAgIEFORCAgICAgdHVucGs5LCBtYXNrYSwgUTFhCi0gICAgICAgIEFORCAgICAgdHVucGszLCBtYXNrYSwgUTFhLCBMU0wjOAotICAgICAgICBVWFRBQjE2IHR1bnBrOSwgdHVucGs5LCBRMGEsIFJPUiM4Ci0gICAgICAgIFVYVEFCMTYgdHVucGszLCB0dW5wazMsIFEwYQotCi0gICAgICAgIDsvLyB0dW5wazEgPSBbcjBwMCByMHAxIHIycDAgcjJwMV0KLSAgICAgICAgOy8vIHR1bnBrMiA9IFtyMXAwIHIxcDEgcjNwMCByM3AxXQotICAgICAgICA7Ly8gdHVucGs5ID0gW3IwcTEgcjBxMCByMnExIHIycTBdCi0gICAgICAgIDsvLyB0dW5wazMgPSBbcjFxMSByMXEwIHIzcTEgcjNxMF0KLQotICAgICAgICBNT1YgICAgIHQ0LCB0dW5wazEsIExTUiAjMTYKLSAgICAgICAgTU9WICAgICB0MCwgdHVucGs5LCBMU1IgIzE2Ci0KLSAgICAgICAgU1RSSCAgICB0NCxbcFEwYSwgIzJdISAgICAgICAgICA7Ly9TdG9yZXMgW3IwcDAgcjBwMV0KLSAgICAgICAgU1RSSCAgICB0MCxbcFEwYSwgIzJdICAgICAgICAgICA7Ly9TdG9yZXMgW3IwcTAgcjBxMV0KLQotICAgICAgICBNT1YgICAgIHQ0LCB0dW5wazIsIExTUiAjMTYKLSAgICAgICAgTU9WICAgICB0MCwgdHVucGszLCBMU1IgIzE2Ci0KLSAgICAgICAgTV9TVFJIICB0NCxbcFEwYSwgU3RlcGFdISAgICAgICA7Ly9TdG9yZXMgW3IxcDAgcjFwMV0KLSAgICAgICAgU1RSSCAgICB0MCxbcFEwYSwgIzJdICAgICAgICAgICA7Ly9TdG9yZXMgW3IxcTAgcjFxMV0KLSAgICAgICAgCi0gICAgICAgIE1fU1RSSCAgdHVucGsxLFtwUTBhLCBTdGVwYV0hICAgOy8vU3RvcmVzIFtyMnAwIHIycDFdCi0gICAgICAgIFNUUkggICAgdHVucGsyLFtwUTBhLCBTdGVwYV0gICAgOy8vU3RvcmVzIFtyM3AwIHIzcDFdCi0gICAgICAgIFNUUkggICAgdHVucGs5LFtwUTBhLCAjMl0hICAgICAgICA7Ly9TdG9yZXMgW3IycTAgcjJxMV0KLSAgICAgICAgU1RSSCAgICB0dW5wazMsW3BRMGEsIFN0ZXBhXSAgICA7Ly9TdG9yZXMgW3IzcTAgcjNxMV0KLQotICAgICAgICBTVUIgICAgIHBRMCwgcFEwYSwgU3RlcGEsIExTTCAjMQotCi0gICAgICAgIDsvLyBMb2FkIGNvdW50ZXIKLSAgICAgICAgTV9MRFJEICBYWSwgcEJTLCBwWFlCUwotCi0gICAgICAgIDsvLyBSZWxvYWQgUGl4ZWxzCi0gICAgICAgIE1fTERSICAgcF8wLCBwUV8zCi0gICAgICAgIE1PViAgICAgcF8yLCBRMWEKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgTV9MRFJEICBhbHBoYSwgYmV0YSwgcEFscGhhQmV0YTEKLQotICAgICAgICBBRERTICAgIFhZLCBYWSwgWFkKLSAgICAgICAgTV9TVFIgICBYWSwgcFhZQlMKLSAgICAgICAgQkNDICAgICBMb29wWAotICAgICAgICAKLTsvLy0tLS0tLS0tIENvbW1vbiBFeGl0IG9mIExvb3BZIC0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIDsvLyBBbGlnbiB0aGUgcG9pbnRlcnMgCi0gICAgICAgIE1fTERSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcwotRXhpdExvb3BZCi0gICAgICAgIFNVQiAgICAgcFEwLCBwUTAsICMxNgotICAgICAgICBBREQgICAgIHBRMCwgcFEwLCBzcmNkc3RTdGVwLCBMU0wgIzIKLSAgICAgICAgU1VCICAgICBwQlMsIHBCUywgIzE1Ci0gICAgICAgIFNVQiAgICAgcFRocmVzaG9sZHMsIHBUaHJlc2hvbGRzLCAjMTUKLSAgICAgICAgTV9TVFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCi0KLSAgICAgICAgTV9MRFJEICBhbHBoYSwgYmV0YSwgcEFscGhhQmV0YTAKLQotICAgICAgICBCTkUgICAgIExvb3BZCi0gICAgICAgIE1PViAgICAgcjAsICNPTVhfU3RzX05vRXJyCi0KLSAgICAgICAgTV9FTkQKLTsvLy0tLS0tLS0tLS0tLS0tLS0tRW5kIEZpbHRlci0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBFTkRJRiAgICAgICAgCi0gICAgICAgIAotICAgICAgICBFTkQKLSAgICAgICAgCi0gICAgICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNkMTg1Zi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEuYworKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSAxLzggUGl4ZWwgaW50ZXJwb2xhdGlvbiBmb3IgQ2hyb21hIEJsb2NrCi0gKiAKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYSwKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIDEvOC1waXhlbCBpbnRlcnBvbGF0aW9uIGZvciBpbnRlciBjaHJvbWEgTUIuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwU3JjCVBvaW50ZXIgdG8gdGhlIHNvdXJjZSByZWZlcmVuY2UgZnJhbWUgYnVmZmVyCi0gKiBbaW5dCXNyY1N0ZXAgUmVmZXJlbmNlIGZyYW1lIHN0ZXAgaW4gYnl0ZQotICogW2luXQlkc3RTdGVwIERlc3RpbmF0aW9uIGZyYW1lIHN0ZXAgaW4gYnl0ZS4gTXVzdCBiZSBtdWx0aXBsZSBvZiByb2kud2lkdGguCi0gKiBbaW5dCWR4CQlGcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIGNvbXBvbmVudAotICoJCQkJCQlpbiAxLzggcGl4ZWwgdW5pdDt2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsN10KLSAqIFtpbl0JZHkJCUZyYWN0aW9uYWwgcGFydCBvZiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIGNvbXBvbmVudAotICoJCQkJCQlpbiAxLzggcGl4ZWwgdW5pdDt2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsN10KLSAqIFtpbl0Jcm9pCQlEaW1lbnNpb24gb2YgdGhlIGludGVycG9sYXRpb24gcmVnaW9uO3RoZSBwYXJhbWV0ZXJzIHJvaS53aWR0aCBhbmQgcm9pLmhlaWdodCBtdXN0Ci0gKiAgICAgICAgICAgICAgICAgICAgICBiZSBlcXVhbCB0byBlaXRoZXIgMiwgNCwgb3IgOC4KLSAqIFtvdXRdCXBEc3QJUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gZnJhbWUgYnVmZmVyLgotICogICAgICAgICAgICAgICAgICAgaWYgcm9pLndpZHRoPT0yLCAgMi1ieXRlIGFsaWdubWVudCByZXF1aXJlZAotICogICAgICAgICAgICAgICAgICAgaWYgcm9pLndpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZAotICogICAgICAgICAgICAgICAgICAgaWYgcm9pLndpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4KLSAqIElmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgT01YX1N0c19CYWRBcmdFcnI6Ci0gKglwU3JjIG9yIHBEc3QgaXMgTlVMTC4KLSAqCXNyY1N0ZXAgb3IgZHN0U3RlcCA8IDguCi0gKglkeCBvciBkeSBpcyBvdXQgb2YgcmFuZ2UgWzAtN10uCi0gKglyb2kud2lkdGggb3Igcm9pLmhlaWdodCBpcyBvdXQgb2YgcmFuZ2UgezIsNCw4fS4KLSAqCXJvaS53aWR0aCBpcyBlcXVhbCB0byAyLCBidXQgcERzdCBpcyBub3QgMi1ieXRlIGFsaWduZWQuCi0gKglyb2kud2lkdGggaXMgZXF1YWwgdG8gNCwgYnV0IHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLgotICoJcm9pLndpZHRoIGlzIGVxdWFsIHRvIDgsIGJ1dCBwRHN0IGlzIG5vdCA4IGJ5dGUgYWxpZ25lZC4KLSAqCXNyY1N0ZXAgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LgotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYSAoCi0gICAgIGNvbnN0IE9NWF9VOCogcFNyYywKLSAgICAgT01YX1MzMiBzcmNTdGVwLAotICAgICBPTVhfVTgqIHBEc3QsCi0gICAgIE9NWF9TMzIgZHN0U3RlcCwKLSAgICAgT01YX1MzMiBkeCwKLSAgICAgT01YX1MzMiBkeSwKLSAgICAgT01YU2l6ZSByb2kKLSApCi17Ci0gICAgcmV0dXJuIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hIAotICAgICAgICAoKE9NWF9VOCopcFNyYywgc3JjU3RlcCwgcERzdCwgZHN0U3RlcCwgcm9pLndpZHRoLCByb2kuaGVpZ2h0LCBkeCwgZHkpOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjNiNGUyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsNDQwICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYV9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICA5NjQxCi07Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi07Ly8gRnVuY3Rpb246Ci07Ly8gICAgIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hCi07Ly8KLTsvLyBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEgaW4gdjYgYXNzZW1ibHkuCi07Ly8gUGVyZm9ybXMgcXVhcnRlciBwZWwgaW50ZXJwb2xhdGlvbiBvZiBpbnRlciBsdW1hIE1CLgotOy8vIEl0J3MgYXNzdW1lZCB0aGF0IHRoZSBmcmFtZSBpcyBhbHJlYWR5IHBhZGRlZCB3aGVuIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KLTsvLyBQYXJhbWV0ZXJzOgotOy8vIFtpbl0gICAgcFNyYyAgICAgICAgUG9pbnRlciB0byB0aGUgc291cmNlIHJlZmVyZW5jZSBmcmFtZSBidWZmZXIKLTsvLyBbaW5dICAgIHNyY1N0ZXAgICAgIFJlZmVyZW5jZSBmcmFtZSBzdGVwIGluIGJ5dGUKLTsvLyBbaW5dICAgIGRzdFN0ZXAgICAgIERlc3RpbmF0aW9uIGZyYW1lIHN0ZXAgaW4gYnl0ZS4gTXVzdCBiZSBtdWx0aXBsZSBvZiByb2kud2lkdGgKLTsvLyBbaW5dICAgIGR4ICAgICAgICAgIEZyYWN0aW9uYWwgcGFydCBvZiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IKLTsvLyAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gMS80IHBpeGVsIHVuaXQ7IHZhbGlkIGluIHRoZSByYW5nZSBbMCwzXQotOy8vIFtpbl0gICAgZHkgICAgICAgICAgRnJhY3Rpb25hbCBwYXJ0IG9mIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IKLTsvLyAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gMS80IHBpeGVsIHVuaXQ7IHZhbGlkIGluIHRoZSByYW5nZSBbMCwzXQotOy8vIFtpbl0gICAgcm9pICAgICAgICAgRGltZW5zaW9uIG9mIHRoZSBpbnRlcnBvbGF0aW9uIHJlZ2lvbjt0aGUgcGFyYW1ldGVycyByb2kud2lkdGggYW5kIHJvaS5oZWlnaHQgbXVzdAotOy8vICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4KLTsvLyBbb3V0XSAgIHBEc3QgICAgICAgIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGZyYW1lIGJ1ZmZlci4KLTsvLyAgICAgICAgICAgICAgICAgICBpZiByb2kud2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkCi07Ly8gICAgICAgICAgICAgICAgICAgaWYgcm9pLndpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZAotOy8vICAgICAgICAgICAgICAgICAgIGlmIHJvaS53aWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkCi07Ly8KLTsvLyBSZXR1cm4gVmFsdWU6Ci07Ly8gSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLgotOy8vIEl0IGlzIGFzc3VlZCB0aGF0IGZvbGxvd2luZyBjYXNlcyBhcmUgc2F0aXNmaWVkIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb246Ci07Ly8gIHBTcmMgb3IgcERzdCBpcyBub3QgTlVMTC4KLTsvLyAgc3JjU3RlcCBvciBkc3RTdGVwID49IHJvaS53aWR0aC4KLTsvLyAgICAgZHggb3IgZHkgaXMgaW4gdGhlIHJhbmdlIFswLTNdLgotOy8vICAgICByb2kud2lkdGggb3Igcm9pLmhlaWdodCBpcyBub3Qgb3V0IG9mIHJhbmdlIHs0LCA4LCAxNn0uCi07Ly8gICAgIElmIHJvaS53aWR0aCBpcyBlcXVhbCB0byA0LCBEc3QgaXMgNCBieXRlIGFsaWduZWQuCi07Ly8gICAgIElmIHJvaS53aWR0aCBpcyBlcXVhbCB0byA4LCBwRHN0IGlzIDggYnl0ZSBhbGlnbmVkLgotOy8vICAgICBJZiByb2kud2lkdGggaXMgZXF1YWwgdG8gMTYsIHBEc3QgaXMgMTYgYnl0ZSBhbGlnbmVkLgotOy8vICAgICBzcmNTdGVwIGFuZCBkc3RTdGVwIGlzIG11bHRpcGxlIG9mIDguCi07Ly8KLTsvLwotCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotCi0gICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0KLSAgICAgICAgRVhQT1JUIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hCi0gICAgICAgIAotICAgIElGIEFSTTExMzZKUwotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weTR4NF91bnNhZmUKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckFsaWduOXhfdW5zYWZlCi0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJBbGlnbjR4X3Vuc2FmZQotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjBfdW5zYWZlCi0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMl91bnNhZmUKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24zX3Vuc2FmZQotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yRGlhZ0NvcHlfdW5zYWZlCi0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJEaWFnQ29weV91bnNhZmUKLSAgICBFTkRJRgotCi0gICAgSUYgQVJNMTEzNkpTCi0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZQotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZQotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlCi0gICAgRU5ESUYKLSAgICAKLSAgICAKLQotOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCi1wU3JjICAgICAgICAgICAgUk4gMAotc3JjU3RlcCAgICAgICAgIFJOIDEKLXBEc3QgICAgICAgICAgICBSTiAyCi1kc3RTdGVwICAgICAgICAgUk4gMwotaUhlaWdodCAgICAgICAgIFJOIDQKLWlXaWR0aCAgICAgICAgICBSTiA1Ci0KLTsvLyBEZWNsYXJlIG90aGVyIGludGVybWVkaWF0ZSByZWdpc3RlcnMKLWlkeCAgICAgICAgICAgICBSTiA2Ci1pZHkgICAgICAgICAgICAgUk4gNwotaW5kZXggICAgICAgICAgIFJOIDYKLVRlbXAgICAgICAgICAgICBSTiAxMgotcEFyZ3MgICAgICAgICAgIFJOIDExCi0KLQotICAgICAgICA7Ly8gRW5kIG9mIENvcnRleEE4Ci0gICAgICAgICAgICAgICAgICAgIAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgCi0gICAgSUYgQVJNMTEzNkpTCi0KLQotICAgICAgICBNX0FMTE9DNCBwcERzdCwgOAotICAgICAgICBNX0FMTE9DNCBwcFNyYywgOAotICAgICAgICBNX0FMTE9DNCBwcEFyZ3MsIDE2Ci0gICAgICAgIE1fQUxMT0M0IHBCdWZmZXIsIDEyMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAxMjAgPSAxMngxMAotICAgICAgICBNX0FMTE9DOCBwSW50ZXJCdWYsIDEyMCAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gMTIwID0gMTIqNSoyCi0gICAgICAgIE1fQUxMT0M4IHBUZW1wQnVmLCAzMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAzMiA9ICA4KjQKLSAgICAgICAgCi0gICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgOy8vIEludGVycG9sYXRpb24gb2YgbHVtYSBpcyBpbXBsZW1lbnRlZCBieSBwcm9jZXNzaW5nIGJsb2NrIG9mIHBpeGVscywgc2l6ZSA0eDQgYXQgYSB0aW1lLgotICAgICAgICA7Ly8gRGVwZW5kaW5nIG9uIHRoZSB2YWx1ZXMgb2YgbW90aW9uIHZlY3RvciBmcmFjdGlvbmFsIHBhcnRzIChkeCxkeSksIG9uZSBvdXQgb2YgMTYgY2FzZXMgd2lsbCBiZSBwcm9jZXNzZWQuCi0gICAgICAgIDsvLyBSZWdpc3RlcnMgcjQsIHI1LCByNiB0byBiZSBwcmVzZXJ2ZWQgYnkgaW50ZXJuYWwgdW5zYWZlIGZ1bmN0aW9ucwotICAgICAgICA7Ly8gcjQgLSBpSGVpZ2h0Ci0gICAgICAgIDsvLyByNSAtIGlXaWR0aAotICAgICAgICA7Ly8gcjYgLSBpbmRleAotICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hLCByMTEKLQotOy8vIERlY2xhcmUgb3RoZXIgaW50ZXJtZWRpYXRlIHJlZ2lzdGVycwotaWR4ICAgICAgICAgICAgIFJOIDYKLWlkeSAgICAgICAgICAgICBSTiA3Ci1pbmRleCAgICAgICAgICAgUk4gNgotVGVtcCAgICAgICAgICAgIFJOIDEyCi1wQXJncyAgICAgICAgICAgUk4gMTEKLQotcEJ1ZiAgICAgICAgICAgIFJOIDgKLUhlaWdodCAgICAgICAgICBSTiA5IAotYnVmU3RlcCAgICAgICAgIFJOIDkKLSAgICAgICAgCi0gICAgICAgIDsvLyBEZWZpbmUgc3RhY2sgYXJndW1lbnRzCi0gICAgICAgIE1fQVJHICAgcHRyaWR4LCA0Ci0gICAgICAgIE1fQVJHICAgcHRyaWR5LCA0ICAgICAgICAKLSAgICAgICAgTV9BUkcgICBwdHJXaWR0aCwgNAotICAgICAgICBNX0FSRyAgIHB0ckhlaWdodCwgNCAgICAgICAgCi0KLSAgICAgICAgOy8vIExvYWQgc3RydWN0dXJlIGVsZW1lbnRzIG9mIHJvaSAKLSAgICAgICAgTV9MRFIgICBpZHgsIHB0cmlkeAotICAgICAgICBNX0xEUiAgIGlkeSwgcHRyaWR5Ci0gICAgICAgIE1fTERSICAgaVdpZHRoLCBwdHJXaWR0aAotICAgICAgICBNX0xEUiAgIGlIZWlnaHQsIHB0ckhlaWdodAotICAgICAgICAKLSAgICAgICAgTV9QUklOVEYgInJvaS53aWR0aCAlZFxuIiwgaVdpZHRoCi0gICAgICAgIE1fUFJJTlRGICJyb2kuaGVpZ2h0ICVkXG4iLCBpSGVpZ2h0Ci0KLSAgICAgICAgQUREICAgICBpbmRleCwgaWR4LCBpZHksIExTTCAjMiAgICAgICAgICAgICAgICAgOy8vICBbaW5kZXhdID0gW2lkeV1baWR4XQotICAgICAgICBNX0FEUiAgIHBBcmdzLCBwcEFyZ3MKLQotSW50ZXJwb2xhdGVMdW1hCi1CbG9jazR4NFdpZHRoTG9vcAotQmxvY2s0eDRIZWlnaHRMb29wCi0KLSAgICAgICAgU1RNICAgICBwQXJncywge3BTcmMsc3JjU3RlcCxwRHN0LGRzdFN0ZXB9IAotICAgICAgICBNX0FEUiAgIHBCdWYsIHBCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICA7Ly8gc3dpdGNoIHRhYmxlIHVzaW5nIG1vdGlvbiB2ZWN0b3IgYXMgaW5kZXgKLSAgICAgICAgTV9TV0lUQ0ggaW5kZXgsIEwKLSAgICAgICAgTV9DQVNFICBDYXNlXzAKLSAgICAgICAgTV9DQVNFICBDYXNlXzEKLSAgICAgICAgTV9DQVNFICBDYXNlXzIKLSAgICAgICAgTV9DQVNFICBDYXNlXzMKLSAgICAgICAgTV9DQVNFICBDYXNlXzQKLSAgICAgICAgTV9DQVNFICBDYXNlXzUKLSAgICAgICAgTV9DQVNFICBDYXNlXzYKLSAgICAgICAgTV9DQVNFICBDYXNlXzcKLSAgICAgICAgTV9DQVNFICBDYXNlXzgKLSAgICAgICAgTV9DQVNFICBDYXNlXzkKLSAgICAgICAgTV9DQVNFICBDYXNlX2EKLSAgICAgICAgTV9DQVNFICBDYXNlX2IKLSAgICAgICAgTV9DQVNFICBDYXNlX2MKLSAgICAgICAgTV9DQVNFICBDYXNlX2QKLSAgICAgICAgTV9DQVNFICBDYXNlX2UKLSAgICAgICAgTV9DQVNFICBDYXNlX2YKLSAgICAgICAgTV9FTkRTV0lUQ0gKLQotQ2FzZV8wCi0gICAgICAgIDsvLyBDYXNlIEcKLSAgICAgICAgTV9QUklOVEYgIkNhc2UgMCBcbiIKLQotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHk0eDRfdW5zYWZlCi0gICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCi0KLUNhc2VfMQotICAgICAgICA7Ly8gQ2FzZSBhCi0gICAgICAgIE1fUFJJTlRGICJDYXNlIDEgXG4iCi0KLSAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCAjMgotICAgICAgICBNT1YgICAgIEhlaWdodCwgIzQKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZQotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCi0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjJfdW5zYWZlCi0gICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCi1DYXNlXzIKLSAgICAgICAgOy8vIENhc2UgYgotICAgICAgICBNX1BSSU5URiAiQ2FzZSAyIFxuIgotICAgICAgICAKLSAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCAjMgotICAgICAgICBNT1YgICAgIEhlaWdodCwgIzQKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZQotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlICAgICAgICAKLSAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQKLUNhc2VfMwotICAgICAgICA7Ly8gQ2FzZSBjCi0gICAgICAgIE1fUFJJTlRGICJDYXNlIDMgXG4iCi0KLSAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCAjMgotICAgICAgICBNT1YgICAgIEhlaWdodCwgIzQKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZQotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCi0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjNfdW5zYWZlCi0gICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCi1DYXNlXzQKLSAgICAgICAgOy8vIENhc2UgZAotICAgICAgICBNX1BSSU5URiAiQ2FzZSA0IFxuIgotCi0gICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCi0gICAgICAgIE1PViAgICAgSGVpZ2h0LCAjOQotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckFsaWduNHhfdW5zYWZlCi0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMF91bnNhZmUKLQotICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAotQ2FzZV81Ci0gICAgICAgIDsvLyBDYXNlIGUKLSAgICAgICAgTV9QUklOVEYgIkNhc2UgNSBcbiIKLQotICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsICMyCi0gICAgICAgIE1PViAgICAgSGVpZ2h0LCAjNAotICAgICAgICBNX0FEUiAgIHBEc3QsIHBUZW1wQnVmCi0gICAgICAgIE1PViAgICAgZHN0U3RlcCwgIzQKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZQotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCi0gICAgICAgIE1fQURSICAgcEFyZ3MsIHBwQXJncwotICAgICAgICBMRE0gICAgIHBBcmdzLCB7cFNyYywgc3JjU3RlcCwgcERzdCwgZHN0U3RlcH0KLSAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKLSAgICAgICAgTV9BRFIgICBwQnVmLCBwQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIE1PViAgICAgSGVpZ2h0LCAjOQotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckFsaWduNHhfdW5zYWZlCi0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUKLSAgICAgICAgTV9BRFIgICBwU3JjLCBwVGVtcEJ1ZgotICAgICAgICBNT1YgICAgIHNyY1N0ZXAsICM0Ci0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjBfdW5zYWZlCi0gICAgICAgIAotCi0gICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCi1DYXNlXzYKLSAgICAgICAgOy8vIENhc2UgZgotICAgICAgICBNX1BSSU5URiAiQ2FzZSA2IFxuIgotCi0gICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgIzIKLSAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKLSAgICAgICAgTU9WICAgICBIZWlnaHQsICM5Ci0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUKLSAgICAgICAgTV9BRFIgICBwQnVmLCBwSW50ZXJCdWYKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmUKLSAgICAgICAgTV9BRFIgICBpZHksIHBUZW1wQnVmCi0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyRGlhZ0NvcHlfdW5zYWZlICAgIAotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24wX3Vuc2FmZQotICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAotQ2FzZV83Ci0gICAgICAgIDsvLyBDYXNlIGcKLSAgICAgICAgTV9QUklOVEYgIkNhc2UgNyBcbiIKLSAgICAgICAgCi0gICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgIzIKLSAgICAgICAgTU9WICAgICBIZWlnaHQsICM0Ci0gICAgICAgIE1fQURSICAgcERzdCwgcFRlbXBCdWYKLSAgICAgICAgTU9WICAgICBkc3RTdGVwLCAjNAotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckFsaWduOXhfdW5zYWZlCi0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUKLSAgICAgICAgTV9BRFIgICBwQXJncywgcHBBcmdzCi0gICAgICAgIExETSAgICAgcEFyZ3MsIHtwU3JjLCBzcmNTdGVwLCBwRHN0LCBkc3RTdGVwfQotICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQotICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsICMxCi0gICAgICAgIE1fQURSICAgcEJ1ZiwgcEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBNT1YgICAgIEhlaWdodCwgIzkKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJBbGlnbjR4X3Vuc2FmZQotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCi0gICAgICAgIE1fQURSICAgcFNyYywgcFRlbXBCdWYKLSAgICAgICAgTU9WICAgICBzcmNTdGVwLCAjNAotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24wX3Vuc2FmZQotCi0gICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCi1DYXNlXzgKLSAgICAgICAgOy8vIENhc2UgaAotICAgICAgICBNX1BSSU5URiAiQ2FzZSA4IFxuIgotCi0gICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCi0gICAgICAgIE1PViAgICAgSGVpZ2h0LCAjOQotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckFsaWduNHhfdW5zYWZlCi0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUKLSAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQKLUNhc2VfOQotICAgICAgICA7Ly8gQ2FzZSBpCi0gICAgICAgIE1fUFJJTlRGICJDYXNlIDkgXG4iCi0KLSAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCAjMgotICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQotICAgICAgICBNT1YgICAgIEhlaWdodCwgIzkKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZQotICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQotICAgICAgICBNX0FEUiAgIHBCdWYsIHBJbnRlckJ1ZgotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZQotICAgICAgICBNX0FEUiAgIGlkeSwgcFRlbXBCdWYKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JEaWFnQ29weV91bnNhZmUgICAgCi0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjJfdW5zYWZlCi0gICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCi1DYXNlX2EKLSAgICAgICAgOy8vIENhc2UgagotICAgICAgICBNX1BSSU5URiAiQ2FzZSBhIFxuIgotCi0gICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgIzIKLSAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKLSAgICAgICAgTU9WICAgICBIZWlnaHQsICM5Ci0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUKLSAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKLSAgICAgICAgTV9BRFIgICBwQnVmLCBwSW50ZXJCdWYKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmUKLSAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQKLUNhc2VfYgotICAgICAgICA7Ly8gQ2FzZSBrCi0gICAgICAgIE1fUFJJTlRGICJDYXNlIGIgXG4iCi0gICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgIzIKLSAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKLSAgICAgICAgTU9WICAgICBIZWlnaHQsICM5Ci0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUKLSAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKLSAgICAgICAgTV9BRFIgICBwQnVmLCBwSW50ZXJCdWYKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmUKLSAgICAgICAgTV9BRFIgICBpZHksIHBUZW1wQnVmCi0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yRGlhZ0NvcHlfdW5zYWZlICAgIAotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24zX3Vuc2FmZQotICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAotQ2FzZV9jCi0gICAgICAgIDsvLyBDYXNlIG4KLSAgICAgICAgTV9QUklOVEYgIkNhc2UgYyBcbiIKLQotICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQotICAgICAgICBNT1YgICAgIEhlaWdodCwgIzkKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJBbGlnbjR4X3Vuc2FmZQotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCi0gICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgc3JjU3RlcCAgICAgICAgICAgICAgICAgICAgIDsvLyBVcGRhdGUgcFNyYyB0byBvbmUgcm93IGRvd24KLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMF91bnNhZmUKLSAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQKLUNhc2VfZAotICAgICAgICA7Ly8gQ2FzZSBwCi0gICAgICAgIE1fUFJJTlRGICJDYXNlIGQgXG4iCi0gICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgIzIKLSAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwCi0gICAgICAgIE1PViAgICAgSGVpZ2h0LCAjNAotICAgICAgICBNX0FEUiAgIHBEc3QsIHBUZW1wQnVmCi0gICAgICAgIE1PViAgICAgZHN0U3RlcCwgIzQKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZQotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCi0gICAgICAgIE1fQURSICAgcEFyZ3MsIHBwQXJncwotICAgICAgICBMRE0gICAgIHBBcmdzLCB7cFNyYywgc3JjU3RlcCwgcERzdCwgZHN0U3RlcH0KLSAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKLSAgICAgICAgTV9BRFIgICBwQnVmLCBwQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIE1PViAgICAgSGVpZ2h0LCAjOQotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckFsaWduNHhfdW5zYWZlCi0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUKLSAgICAgICAgTV9BRFIgICBwU3JjLCBwVGVtcEJ1ZgotICAgICAgICBNT1YgICAgIHNyY1N0ZXAsICM0Ci0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjBfdW5zYWZlCi0gICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCi1DYXNlX2UKLSAgICAgICAgOy8vIENhc2UgcQotICAgICAgICBNX1BSSU5URiAiQ2FzZSBlIFxuIgotICAgICAgICAKLSAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCAjMgotICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQotICAgICAgICBNT1YgICAgIEhlaWdodCwgIzkKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZQotICAgICAgICBNX0FEUiAgIHBCdWYsIHBJbnRlckJ1ZgotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZQotICAgICAgICBNX0FEUiAgIGlkeSwgcFRlbXBCdWYKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJEaWFnQ29weV91bnNhZmUKLSAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCAjNCAgICAKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMF91bnNhZmUKLQotICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAotQ2FzZV9mCi0gICAgICAgIDsvLyBDYXNlIHIKLSAgICAgICAgTV9QUklOVEYgIkNhc2UgZiBcbiIKLSAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCAjMgotICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAKLSAgICAgICAgTU9WICAgICBIZWlnaHQsICM0Ci0gICAgICAgIE1fQURSICAgcERzdCwgcFRlbXBCdWYKLSAgICAgICAgTU9WICAgICBkc3RTdGVwLCAjNAotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckFsaWduOXhfdW5zYWZlCi0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUKLSAgICAgICAgTV9BRFIgICBwQXJncywgcHBBcmdzCi0gICAgICAgIExETSAgICAgcEFyZ3MsIHtwU3JjLCBzcmNTdGVwLCBwRHN0LCBkc3RTdGVwfQotICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQotICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsICMxCi0gICAgICAgIE1fQURSICAgcEJ1ZiwgcEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBNT1YgICAgIEhlaWdodCwgIzkKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJBbGlnbjR4X3Vuc2FmZQotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCi0gICAgICAgIE1fQURSICAgcFNyYywgcFRlbXBCdWYKLSAgICAgICAgTU9WICAgICBzcmNTdGVwLCAjNAotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24wX3Vuc2FmZQotCi1CbG9jazR4NExvb3BFbmQKLQotICAgICAgICA7Ly8gV2lkdGggTG9vcAotICAgICAgICBTVUJTICAgIGlXaWR0aCwgaVdpZHRoLCAjNAotICAgICAgICBNX0FEUiAgIHBBcmdzLCBwcEFyZ3MKLSAgICAgICAgTERNICAgICBwQXJncywge3BTcmMsc3JjU3RlcCxwRHN0LGRzdFN0ZXB9ICA7Ly8gTG9hZCBhcmd1bWVudHMKLSAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCAjNCAgICAgIAotICAgICAgICBBREQgICAgIHBEc3QsIHBEc3QsICM0Ci0gICAgICAgIEJHVCAgICAgQmxvY2s0eDRXaWR0aExvb3AKLQotICAgICAgICA7Ly8gSGVpZ2h0IExvb3AKLSAgICAgICAgU1VCUyAgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjNAotICAgICAgICBNX0xEUiAgIGlXaWR0aCwgcHRyV2lkdGgKLSAgICAgICAgTV9BRFIgICBwQXJncywgcHBBcmdzCi0gICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMyICAgICAgCi0gICAgICAgIEFERCAgICAgcERzdCwgcERzdCwgZHN0U3RlcCwgTFNMICMyCi0gICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgaVdpZHRoCi0gICAgICAgIFNVQiAgICAgcERzdCwgcERzdCwgaVdpZHRoCi0gICAgICAgIEJHVCAgICAgQmxvY2s0eDRIZWlnaHRMb29wCi0KLUVuZE9mSW50ZXJwb2xhdGlvbgotICAgICAgICBNT1YgICAgIHIwLCAjMAotICAgICAgICBNX0VORAotCi0gICAgRU5ESUYKLSAgICAgICAgICAgICAgICAgICAgCi0KLSAgICBFTkQKLSAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4X3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4X3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDliNGNmNi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OF9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1MDggKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OF9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICA5NjQxCi07Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi0gIAotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAgIAotICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9wSW5kZXhUYWJsZTh4OAotICAgICAgICAKLTsvLyBEZWZpbmUgdGhlIHByb2Nlc3NvciB2YXJpYW50cyBzdXBwb3J0ZWQgYnkgdGhpcyBmaWxlCi0gICAgICAgICAKLSAgICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0gICAgIAotICAgICBBUkVBIHRhYmxlLCBEQVRBICAgIAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIFRoaXMgdGFibGUgZm9yIGltcGxlbWVudGluZyBzd2l0Y2ggY2FzZSBvZiBDIGluIGFzbSBieQotOy8vIHRoZSBtZWh0b2Qgb2YgdHdvIGxldmVscyBvZiBpbmRleGluZy4KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9wSW5kZXhUYWJsZTh4OAotICAgIERDRCAgT01YX1ZDX0NIUk9NQV9EQywgICAgIE9NWF9WQ19DSFJPTUFfSE9SIAotICAgIERDRCAgT01YX1ZDX0NIUk9NQV9WRVJULCAgIE9NWF9WQ19DSFJPTUFfUExBTkUgIAotICAgIAotICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9NdWx0aXBsaWVyVGFibGVDaHJvbWE4eDgsMQotICAgIERDVyAgIDMsIDIsIDEsNCAKLSAgICBEQ1cgIC0zLC0yLC0xLDAKLSAgICBEQ1cgICAxLCAyLCAzLDQKLSAgICAKLSAgICBJRiBBUk0xMTM2SlMKLSAgCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIENvbnN0YW50cwotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAotCi1CTEtfU0laRSAgICAgICAgRVFVIDB4OAotTVVMX0NPTlNUMCAgICAgIEVRVSAweDAxMDEwMTAxCi1NQVNLX0NPTlNUICAgICAgRVFVIDB4MDBGRjAwRkYKLU1VTF9DT05TVDEgICAgICBFUVUgMHg4MDgwODA4MAotCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIFNjcmF0Y2ggdmFyaWFibGUKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi15ICAgICAgICAgICAgICAgUk4gMTIgICAKLXBjICAgICAgICAgICAgICBSTiAxNSAgIAotcmV0dXJuICAgICAgICAgIFJOIDAgICAgCi1wU3JjTGVmdDIgICAgICAgUk4gMSAgICAKLXBEc3QyICAgICAgICAgICBSTiAyICAgIAotc3VtMSAgICAgICAgICAgIFJOIDYgICAgCi1zdW0yICAgICAgICAgICAgUk4gNyAgICAKLXBUYWJsZSAgICAgICAgICBSTiA5ICAgIAotZHN0U3RlcHgyICAgICAgIFJOIDExICAgCi1sZWZ0U3RlcHgyICAgICAgUk4gMTQgICAKLW91dGVyQ291bnQgICAgICBSTiAxNCAgIAotcjB4MDEwMTAxMDEgICAgIFJOIDEwICAgCi1yMHgwMEZGMDBGRiAgICAgUk4gMTEgICAKLQotdFZhbDAgICAgICAgICAgIFJOIDAgICAgCi10VmFsMSAgICAgICAgICAgUk4gMSAgICAKLXRWYWwyICAgICAgICAgICBSTiAyICAgIAotdFZhbDMgICAgICAgICAgIFJOIDMgICAgCi10VmFsNCAgICAgICAgICAgUk4gNCAgICAKLXRWYWw1ICAgICAgICAgICBSTiA1ICAgIAotdFZhbDYgICAgICAgICAgIFJOIDYgICAgCi10VmFsNyAgICAgICAgICAgUk4gNyAgICAKLXRWYWw4ICAgICAgICAgICBSTiA4ICAgIAotdFZhbDkgICAgICAgICAgIFJOIDkgICAgCi10VmFsMTAgICAgICAgICAgUk4gMTAgICAKLXRWYWwxMSAgICAgICAgICBSTiAxMSAgIAotdFZhbDEyICAgICAgICAgIFJOIDEyICAgCi10VmFsMTQgICAgICAgICAgUk4gMTQgICAKLQotYiAgICAgICAgICAgICAgIFJOIDE0ICAgCi1jICAgICAgICAgICAgICAgUk4gMTIgICAKLQotcDJwMCAgICAgICAgICAgIFJOIDAgICAgCi1wM3AxICAgICAgICAgICAgUk4gMSAgICAKLXA2cDQgICAgICAgICAgICBSTiAyICAgIAotcDdwNSAgICAgICAgICAgIFJOIDQgICAgCi0KLXBwMnBwMCAgICAgICAgICBSTiA2ICAgIAotcHAzcHAxICAgICAgICAgIFJOIDcgICAgCi1wcDZwcDQgICAgICAgICAgUk4gOCAgICAKLXBwN3BwNSAgICAgICAgICBSTiA5ICAgIAotCi1wMzIxMCAgICAgICAgICAgUk4gMTAgICAKLXA3NjU0ICAgICAgICAgICBSTiAxMCAgIAotCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIElucHV0IEFyZ3VtZW50cwotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBTcmNMZWZ0ICAgICAgICBSTiAwICAgIDsvLyBpbnB1dCBwb2ludGVyCi1wU3JjQWJvdmUgICAgICAgUk4gMSAgICA7Ly8gaW5wdXQgcG9pbnRlcgotcFNyY0Fib3ZlTGVmdCAgIFJOIDIgICAgOy8vIGlucHV0IHBvaW50ZXIKLXBEc3QgICAgICAgICAgICBSTiAzICAgIDsvLyBvdXRwdXQgcG9pbnRlcgotbGVmdFN0ZXAgICAgICAgIFJOIDQgICAgOy8vIGlucHV0IHZhcmlhYmxlCi1kc3RTdGVwICAgICAgICAgUk4gNSAgICA7Ly8gaW5wdXQgdmFyaWFibGUKLXByZWRNb2RlICAgICAgICBSTiA2ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQotYXZhaWxhYmlsaXR5ICAgIFJOIDcgICAgOy8vIGlucHV0IHZhcmlhYmxlCi0KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4IHN0YXJ0cwotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgCi0gICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDgsIHIxMQotICAgICAgICAKLSAgICAgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKLSAgICAgICAgTV9BUkcgICAgTGVmdFN0ZXAsICAgICA0Ci0gICAgICAgIE1fQVJHICAgIERzdFN0ZXAsICAgICAgNAotICAgICAgICBNX0FSRyAgICBQcmVkTW9kZSwgICAgIDQKLSAgICAgICAgTV9BUkcgICAgQXZhaWxhYmlsaXR5LCA0Ci0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9NAotICAgICAgICAKLSAgICAgICAgTERSICAgICAgcFRhYmxlLD1hcm1WQ000UDEwX3BJbmRleFRhYmxlOHg4ICAgOy8vIExvYWQgaW5kZXggdGFibGUgZm9yIHN3aXRjaCBjYXNlCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIExvYWQgYXJndW1lbnQgZnJvbSB0aGUgc3RhY2sKLSAgICAgICAgTV9MRFIgICAgcHJlZE1vZGUsIFByZWRNb2RlICAgICAgICAgICAgICAgICAgOy8vIEFyZyBwcmVkTW9kZSBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgCi0gICAgICAgIE1fTERSICAgIGxlZnRTdGVwLCBMZWZ0U3RlcCAgICAgICAgICAgICAgICAgIDsvLyBBcmcgbGVmdFN0ZXAgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnIAotICAgICAgICBNX0xEUiAgICBkc3RTdGVwLCAgRHN0U3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gQXJnIGRzdFN0ZXAgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnICAgICAgICAgCi0gICAgICAgIE1fTERSICAgIGF2YWlsYWJpbGl0eSwgQXZhaWxhYmlsaXR5ICAgICAgICAgIDsvLyBBcmcgYXZhaWxhYmlsaXR5IGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZyAKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgIHksICNCTEtfU0laRSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBPdXRlciBMb29wIENvdW50Ci0gICAgICAgIExEUiAgICAgIHBjLCBbcFRhYmxlLCBwcmVkTW9kZSwgTFNMICMyXSAgICAgIDsvLyBCcmFuY2ggdG8gdGhlIGNhc2UgYmFzZWQgb24gcHJlTW9kZQotCi1PTVhfVkNfQ0hST01BX0RDCi0gICAgICAgIEFORCAgICAgIGF2YWlsYWJpbGl0eSwgYXZhaWxhYmlsaXR5LCMoT01YX1ZDX1VQUEVSICsgT01YX1ZDX0xFRlQpCi0gICAgICAgIENNUCAgICAgIGF2YWlsYWJpbGl0eSwgIyhPTVhfVkNfVVBQRVIgKyBPTVhfVkNfTEVGVCkgOy8vIGlmKGF2YWlsYWJpbGl0eSAmICgjT01YX1ZDX1VQUEVSIHwgI09NWF9WQ19MRUZUKSkKLSAgICAgICAgTERSICAgICAgcjB4MDEwMTAxMDEsID1NVUxfQ09OU1QwCi0gICAgICAgIEJORSAgICAgIFRTVF9VUFBFUiAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBKdW1wIHRvIFVwcGVyIGlmIG5vdCBib3RoCi0gICAgICAgIExETSAgICAgIHBTcmNBYm92ZSx7dFZhbDgsdFZhbDl9ICAgICAgICAgICAgIDsvLyB0VmFsIDggdG8gOSA9IHBTcmNBYm92ZVswIHRvIDddCi0gICAgICAgIAotICAgICAgICBBREQgICAgICBsZWZ0U3RlcHgyLCBsZWZ0U3RlcCxsZWZ0U3RlcCAgICAgICA7Ly8gbGVmdFN0ZXB4MiA9IDIgKiBsZWZ0U3RlcAotICAgICAgICBBREQgICAgICBwU3JjTGVmdDIsIHBTcmNMZWZ0LCBsZWZ0U3RlcCAgICAgICA7Ly8gcFNyY0xlZnQyID0gcFNyY0xlZnQgKyBsZWZ0U3RlcAotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKLSAgICAgICAKLSAgICAgICAgVVhUQjE2ICAgdFZhbDcsIHRWYWw4ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVswLCAyXQotICAgICAgICBVWFRCMTYgICB0VmFsOCwgdFZhbDgsIFJPUiAjOCAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzEsIDNdCi0gICAgICAgIFVBREQxNiAgIHN1bTEsIHRWYWw3LCB0VmFsOCAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMCwgMl0gKyBwU3JjQWJvdmVbMSwgM10KLSAgICAgICAgCi0gICAgICAgIFVYVEIxNiAgIHRWYWw3LCB0VmFsOSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbNCwgNl0KLSAgICAgICAgVVhUQjE2ICAgdFZhbDksIHRWYWw5LCBST1IgIzggICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs1LCA3XQotICAgICAgICBVQUREMTYgICBzdW0yLCB0VmFsNywgdFZhbDkgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzAsIDJdICsgcFNyY0Fib3ZlWzQsIDZdCi0gICAgICAgIEFERCAgICAgIHN1bTEsIHN1bTEsIHN1bTEsIExTUiAjMTYgICAgICAgICAgIDsvLyBzdW0ocFNyY0Fib3ZlWzBdIHRvIHBTcmNBYm92ZVszXSkKLSAgICAgICAgQUREICAgICAgc3VtMiwgc3VtMiwgc3VtMiwgTFNSICMxNiAgICAgICAgICAgOy8vIHN1bShwU3JjQWJvdmVbNF0gdG8gcFNyY0Fib3ZlWzddKQotICAgICAgICBVWFRIICAgICBzdW0xLCBzdW0xICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdXBzdW0xIChDbGVhciB0aGUgdG9wIGp1bmsgYml0cykKLSAgICAgICAgVVhUSCAgICAgc3VtMiwgc3VtMiAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHVwc3VtMiAoQ2xlYXIgdGhlIHRvcCBqdW5rIGJpdHMpCi0gICAgICAgIAotICAgICAgICBNX0xEUkIgICB0VmFsOCwgW3BTcmNMZWZ0XSwgICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDggPSBwU3JjTGVmdFswXQotICAgICAgICBNX0xEUkIgICB0VmFsOSwgW3BTcmNMZWZ0Ml0sICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDkgPSBwU3JjTGVmdFsxXQotICAgICAgICBNX0xEUkIgICB0VmFsNCwgW3BTcmNMZWZ0XSwgICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDQgPSBwU3JjTGVmdFsyXQotICAgICAgICBNX0xEUkIgICB0VmFsMTIsW3BTcmNMZWZ0Ml0sICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDEyPSBwU3JjTGVmdFszXQotICAgICAgICBBREQgICAgICB0VmFsMiwgdFZhbDgsIHRWYWw5ICAgICAgICAgICAgICAgICA7Ly8gdFZhbDE0ID0gdFZhbDggKyB0VmFsOQotICAgICAgICAKLSAgICAgICAgTV9MRFJCICAgdFZhbDgsIFtwU3JjTGVmdF0sICArbGVmdFN0ZXB4MiAgICAgOy8vIHRWYWw4ID0gcFNyY0xlZnRbNF0KLSAgICAgICAgTV9MRFJCICAgdFZhbDksIFtwU3JjTGVmdDJdLCArbGVmdFN0ZXB4MiAgICAgOy8vIHRWYWw5ID0gcFNyY0xlZnRbNV0KLSAgICAgICAgQUREICAgICAgdFZhbDE0LCB0VmFsNCwgdFZhbDEyICAgICAgICAgICAgICAgOy8vIHRWYWwxNCA9IHRWYWw0ICsgdFZhbDEyCi0gICAgICAgIAotICAgICAgICBMRFJCICAgICB0VmFsNCwgW3BTcmNMZWZ0XSAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDQgPSBwU3JjTGVmdFs2XQotICAgICAgICBMRFJCICAgICB0VmFsMTIsW3BTcmNMZWZ0Ml0gICAgICAgICAgICAgICAgICA7Ly8gdFZhbDEyPSBwU3JjTGVmdFs3XQotICAgICAgICBBREQgICAgICB0VmFsOCwgdFZhbDgsIHRWYWw5ICAgICAgICAgICAgICAgICA7Ly8gdFZhbDggPSB0VmFsOCArIHRWYWw5Ci0gICAgICAgIEFERCAgICAgIHRWYWwyLCB0VmFsMiwgdFZhbDE0ICAgICAgICAgICAgICAgIDsvLyBsZWZ0c3VtMSAgPSBzdW0ocFNyY0xlZnRbMF0gdG8gcFNyY0xlZnRbM10pCi0gICAgICAgIEFERCAgICAgIHRWYWw0LCB0VmFsNCwgdFZhbDEyICAgICAgICAgICAgICAgIDsvLyB0VmFsNCA9IHRWYWw0ICsgdFZhbDEyCi0gICAgICAgIEFERCAgICAgIHRWYWwxNCwgdFZhbDgsIHRWYWw0ICAgICAgICAgICAgICAgIDsvLyBsZWZ0c3VtMiAgPSBzdW0ocFNyY0xlZnRbNF0gdG8gcFNyY0xlZnRbN10pCi0gICAgICAgIEFERCAgICAgIHRWYWw4LCB0VmFsMTQsICMyICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsOCA9IGxlZnRzdW0yICsgMgotICAgICAgICBBREQgICAgICB0VmFsOSwgc3VtMiwgICAjMiAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDggPSB1cHN1bTIgKyAyCi0gICAgICAgIEFERCAgICAgIHN1bTEsICBzdW0xLCB0VmFsMiAgICAgICAgICAgICAgICAgIDsvLyBzdW0xID0gdXBzdW0xICsgbGVmdHN1bTEKLSAgICAgICAgQUREICAgICAgc3VtMiwgIHN1bTIsIHRWYWwxNCAgICAgICAgICAgICAgICAgOy8vIHN1bTIgPSB1cHN1bTIgKyBsZWZ0c3VtMgotICAgICAgICBBREQgICAgICBzdW0xLCBzdW0xLCAjNCAgICAgICAgICAgICAgICAgICAgICA7Ly8gKHN1bTEgKyA0KQotICAgICAgICBBREQgICAgICBzdW0yLCBzdW0yLCAjNCAgICAgICAgICAgICAgICAgICAgICA7Ly8gKHN1bTIgKyA0KQotICAgICAgICBNT1YgICAgICBzdW0xLCAgc3VtMSwgIExTUiAjMyAgICAgICAgICAgICAgICA7Ly8gKHN1bTEgKyA0KT4+MwotICAgICAgICBNT1YgICAgICB0VmFsOSwgdFZhbDksIExTUiAjMiAgICAgICAgICAgICAgICA7Ly8gKHRWYWw5ICsgMik+PjIKLSAgICAgICAgTU9WICAgICAgdFZhbDgsIHRWYWw4LCBMU1IgIzIgICAgICAgICAgICAgICAgOy8vICh0VmFsOCArIDIpPj4yCi0gICAgICAgIE1PViAgICAgIHN1bTIsICBzdW0yLCAgTFNSICMzICAgICAgICAgICAgICAgIDsvLyAoc3VtMiArIDQpPj4zCi0gICAgICAgIAotICAgICAgICBNVUwgICAgICB0VmFsMCwgc3VtMSwgcjB4MDEwMTAxMDEgICAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcwotICAgICAgICBNVUwgICAgICB0VmFsMSwgdFZhbDkscjB4MDEwMTAxMDEgICAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcwotICAgICAgICBNVUwgICAgICB0VmFsOCwgdFZhbDgscjB4MDEwMTAxMDEgICAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcwotICAgICAgICBNVUwgICAgICB0VmFsOSwgc3VtMiwgcjB4MDEwMTAxMDEgICAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcwotICAgICAgICAKLSAgICAgICAgTV9TVFJEICAgdFZhbDAsIHRWYWwxLCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbMCB0byA3XSAgID0gdFZhbCAwIHRvIDEKLSAgICAgICAgTV9TVFJEICAgdFZhbDAsIHRWYWwxLCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbOCB0byAxNV0gID0gdFZhbCAwIHRvIDEKLSAgICAgICAgTV9TVFJEICAgdFZhbDAsIHRWYWwxLCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbMTYgdG8gMjNdID0gdFZhbCAwIHRvIDEKLSAgICAgICAgTV9TVFJEICAgdFZhbDAsIHRWYWwxLCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbMjQgdG8gMzFdID0gdFZhbCAwIHRvIDEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBNX1NUUkQgICB0VmFsOCwgdFZhbDksIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFszMiB0byAzOV0gPSB0VmFsIDggdG8gOQotICAgICAgICBNX1NUUkQgICB0VmFsOCwgdFZhbDksIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs0MCB0byA0N10gPSB0VmFsIDggdG8gOQotICAgICAgICBNX1NUUkQgICB0VmFsOCwgdFZhbDksIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs0OCB0byA1NV0gPSB0VmFsIDggdG8gOQotICAgICAgICBNX1NUUkQgICB0VmFsOCwgdFZhbDksIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs1NiB0byA2M10gPSB0VmFsIDggdG8gOQotICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCi0gICAgICAgIE1fRVhJVAotICAgICAgICAKLVRTVF9VUFBFUgotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTMKLSAgICAgICAgCi0gICAgICAgIENNUCAgICAgIGF2YWlsYWJpbGl0eSwgI09NWF9WQ19VUFBFUiAgICAgICAgIDsvLyBpZihhdmFpbGFiaWxpdHkgJiAjT01YX1ZDX1VQUEVSKQotICAgICAgICAKLSAgICAgICAgQk5FICAgICAgVFNUX0xFRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEp1bXAgdG8gTGVmdCBpZiBub3QgdXBwZXIKLSAgICAgICAgTERNICAgICAgcFNyY0Fib3ZlLHt0VmFsOCx0VmFsOX0gICAgICAgICAgICAgOy8vIHRWYWwgOCB0byA5ID0gcFNyY0Fib3ZlWzAgdG8gN10KLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0zCi0gICAgICAgIAotICAgICAgICBVWFRCMTYgICB0VmFsNywgdFZhbDggICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzAsIDJdCi0gICAgICAgIFVYVEIxNiAgIHRWYWw4LCB0VmFsOCwgUk9SICM4ICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMSwgM10KLSAgICAgICAgVUFERDE2ICAgc3VtMSwgIHRWYWw3LCB0VmFsOCAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVswLCAyXSArIHBTcmNBYm92ZVsxLCAzXQotICAgICAgICAKLSAgICAgICAgVVhUQjE2ICAgdFZhbDcsIHRWYWw5ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs0LCA2XQotICAgICAgICBVWFRCMTYgICB0VmFsOSwgdFZhbDksIFJPUiAjOCAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzUsIDddCi0gICAgICAgIFVBREQxNiAgIHN1bTIsICB0VmFsNywgdFZhbDkgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMCwgMl0gKyBwU3JjQWJvdmVbNCwgNl0KLSAgICAgICAgCi0gICAgICAgIEFERCAgICAgIHN1bTEsIHN1bTEsIHN1bTEsIExTUiAjMTYgICAgICAgICAgIDsvLyBzdW0ocFNyY0Fib3ZlWzBdIHRvIHBTcmNBYm92ZVszXSkKLSAgICAgICAgQUREICAgICAgc3VtMiwgc3VtMiwgc3VtMiwgTFNSICMxNiAgICAgICAgICAgOy8vIHN1bShwU3JjQWJvdmVbNF0gdG8gcFNyY0Fib3ZlWzddKQotICAgICAgICAKLSAgICAgICAgVVhUSCAgICAgc3VtMSwgc3VtMSAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHVwc3VtMSAoQ2xlYXIgdGhlIHRvcCBqdW5rIGJpdHMpCi0gICAgICAgIFVYVEggICAgIHN1bTIsIHN1bTIgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB1cHN1bTIgKENsZWFyIHRoZSB0b3AganVuayBiaXRzKQotICAgICAgICAKLSAgICAgICAgQUREICAgICAgc3VtMSwgc3VtMSwgIzIgICAgICAgICAgICAgICAgICAgICAgOy8vIHN1bTEgKyAyCi0gICAgICAgIEFERCAgICAgIHN1bTIsIHN1bTIsICMyICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdW0yICsgMgotICAgICAgICAKLSAgICAgICAgTU9WICAgICAgc3VtMSwgc3VtMSwgTFNSICMyICAgICAgICAgICAgICAgICAgOy8vIChzdW0xICsgMik+PjIKLSAgICAgICAgTU9WICAgICAgc3VtMiwgc3VtMiwgTFNSICMyICAgICAgICAgICAgICAgICAgOy8vIChzdW0yICsgMik+PjIKLSAgICAgICAgCi0gICAgICAgIE1VTCAgICAgIHN1bTEsIHN1bTEscjB4MDEwMTAxMDEgICAgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCi0gICAgICAgIE1VTCAgICAgIHN1bTIsIHN1bTIscjB4MDEwMTAxMDEgICAgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCi0gICAgICAgIAotICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFswIHRvIDddICAgPSB0VmFsIDYgdG8gNwotICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs4IHRvIDE1XSAgPSB0VmFsIDYgdG8gNwotICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFsxNiB0byAyM10gPSB0VmFsIDYgdG8gNwotICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFsyNCB0byAzMV0gPSB0VmFsIDYgdG8gNwotICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFszMiB0byAzOV0gPSB0VmFsIDYgdG8gNwotICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs0MCB0byA0N10gPSB0VmFsIDYgdG8gNwotICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs0OCB0byA1NV0gPSB0VmFsIDYgdG8gNwotICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs1NiB0byA2M10gPSB0VmFsIDYgdG8gNwotICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCi0gICAgICAgIE1fRVhJVAotICAgICAgICAKLVRTVF9MRUZUIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MyAgICAgICAKLSAgICAgICAgCi0gICAgICAgIENNUCAgICAgIGF2YWlsYWJpbGl0eSwgI09NWF9WQ19MRUZUCi0gICAgICAgIEJORSAgICAgIFRTVF9DT1VOVDAKLSAgICAgICAgQUREICAgICAgbGVmdFN0ZXB4MiwgbGVmdFN0ZXAsbGVmdFN0ZXAgICAgICAgOy8vIGxlZnRTdGVweDIgPSAyICogbGVmdFN0ZXAKLSAgICAgICAgQUREICAgICAgcFNyY0xlZnQyLCBwU3JjTGVmdCwgbGVmdFN0ZXAgICAgICAgOy8vIHBTcmNMZWZ0MiA9IHBTcmNMZWZ0ICsgbGVmdFN0ZXAKLSAgICAgICAgCi0gICAgICAgIE1fTERSQiAgIHRWYWw4LCBbcFNyY0xlZnRdLCAgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsOCA9IHBTcmNMZWZ0WzBdCi0gICAgICAgIE1fTERSQiAgIHRWYWw5LCBbcFNyY0xlZnQyXSwgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsOSA9IHBTcmNMZWZ0WzFdCi0gICAgICAgIE1fTERSQiAgIHRWYWw0LCBbcFNyY0xlZnRdLCAgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsNCA9IHBTcmNMZWZ0WzJdCi0gICAgICAgIE1fTERSQiAgIHRWYWwxMixbcFNyY0xlZnQyXSwgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsMTI9IHBTcmNMZWZ0WzNdCi0gICAgICAgIAotICAgICAgICBBREQgICAgICB0VmFsNiwgdFZhbDgsIHRWYWw5ICAgICAgICAgICAgICAgICA7Ly8gdFZhbDYgPSB0VmFsOCArIHRWYWw5Ci0gICAgICAgIAotICAgICAgICBNX0xEUkIgICB0VmFsOCwgW3BTcmNMZWZ0XSwgICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDggPSBwU3JjTGVmdFs0XQotICAgICAgICBBREQgICAgICB0VmFsNywgdFZhbDQsIHRWYWwxMiAgICAgICAgICAgICAgICA7Ly8gdFZhbDcgPSB0VmFsNCArIHRWYWwxMgotICAgICAgICBNX0xEUkIgICB0VmFsOSwgW3BTcmNMZWZ0Ml0sICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDkgPSBwU3JjTGVmdFs1XQotICAgICAgICBNX0xEUkIgICB0VmFsNCwgW3BTcmNMZWZ0XSwgICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDQgPSBwU3JjTGVmdFs2XQotICAgICAgICBNX0xEUkIgICB0VmFsMTIsW3BTcmNMZWZ0Ml0sICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDEyPSBwU3JjTGVmdFs3XQotICAgICAgICAKLSAgICAgICAgQUREICAgICAgdFZhbDgsIHRWYWw4LCB0VmFsOSAgICAgICAgICAgICAgICAgOy8vIHRWYWw4ID0gdFZhbDggKyB0VmFsOQotICAgICAgICBBREQgICAgICBzdW0xLCAgdFZhbDYsIHRWYWw3ICAgICAgICAgICAgICAgICA7Ly8gc3VtMSAgPSBzdW0ocFNyY0xlZnRbMF0gdG8gcFNyY0xlZnRbM10pCi0gICAgICAgIEFERCAgICAgIHRWYWw0LCB0VmFsNCwgdFZhbDEyICAgICAgICAgICAgICAgIDsvLyB0VmFsNCA9IHRWYWw0ICsgdFZhbDEyCi0gICAgICAgIEFERCAgICAgIHN1bTIsICB0VmFsOCwgdFZhbDQgICAgICAgICAgICAgICAgIDsvLyBzdW0yICA9IHN1bShwU3JjTGVmdFs0XSB0byBwU3JjTGVmdFs3XSkKLSAgICAgICAgCi0gICAgICAgIEFERCAgICAgIHN1bTEsIHN1bTEsICMyICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdW0xICsgMgotICAgICAgICBBREQgICAgICBzdW0yLCBzdW0yLCAjMiAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3VtMiArIDIKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgIHN1bTEsIHN1bTEsIExTUiAjMiAgICAgICAgICAgICAgICAgIDsvLyAoc3VtMSArIDIpPj4yCi0gICAgICAgIE1PViAgICAgIHN1bTIsIHN1bTIsIExTUiAjMiAgICAgICAgICAgICAgICAgIDsvLyAoc3VtMiArIDIpPj4yCi0gICAgICAgIAotICAgICAgICBNVUwgICAgICB0VmFsNiwgc3VtMSxyMHgwMTAxMDEwMSAgICAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcwotICAgICAgICBNVUwgICAgICB0VmFsOCwgc3VtMixyMHgwMTAxMDEwMSAgICAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcwotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKLSAgICAgICAgTU9WICAgICAgdFZhbDcsdFZhbDYgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWw3ID0gc3VtMQotICAgICAgICBNT1YgICAgICB0VmFsOSx0VmFsOCAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDkgPSBzdW0yCi0gICAgICAgIAotICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFswIHRvIDddICAgPSB0VmFsIDYgdG8gNwotICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs4IHRvIDE1XSAgPSB0VmFsIDYgdG8gNwotICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFsxNiB0byAyM10gPSB0VmFsIDYgdG8gNwotICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFsyNCB0byAzMV0gPSB0VmFsIDYgdG8gNwotICAgICAgICAKLSAgICAgICAgTV9TVFJEICAgdFZhbDgsIHRWYWw5LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbMzIgdG8gMzldID0gdFZhbCA4IHRvIDkKLSAgICAgICAgTV9TVFJEICAgdFZhbDgsIHRWYWw5LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbNDAgdG8gNDddID0gdFZhbCA4IHRvIDkKLSAgICAgICAgTV9TVFJEICAgdFZhbDgsIHRWYWw5LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbNDggdG8gNTVdID0gdFZhbCA4IHRvIDkKLSAgICAgICAgTV9TVFJEICAgdFZhbDgsIHRWYWw5LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbNTYgdG8gNjNdID0gdFZhbCA4IHRvIDkKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgTV9FWElUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE1hY3JvIHRvIGV4aXQgbWlkd2F5LWJyZWFrIGZybSBjYXNlCi0KLVRTVF9DT1VOVDAKLSAgICAgICAgTERSICAgICAgc3VtMSwgPU1VTF9DT05TVDEgICAgICAgICAgICAgICAgICA7Ly8gc3VtMSA9IDB4ODA4MDgwODAgaWYoY291bnQgPT0gMCkKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0yCi0gICAgICAgIAotICAgICAgICBNT1YgICAgICB0VmFsNywgc3VtMSAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDcgPSBzdW0xCi0gICAgICAgIAotICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFswIHRvIDddICAgPSB0VmFsIDYgdG8gNwotICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs4IHRvIDE1XSAgPSB0VmFsIDYgdG8gNwotICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFsxNiB0byAyM10gPSB0VmFsIDYgdG8gNwotICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFsyNCB0byAzMV0gPSB0VmFsIDYgdG8gNwotICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFszMiB0byAzOV0gPSB0VmFsIDYgdG8gNwotICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs0MCB0byA0N10gPSB0VmFsIDYgdG8gNwotICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs0OCB0byA1NV0gPSB0VmFsIDYgdG8gNwotICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs1NiB0byA2M10gPSB0VmFsIDYgdG8gNwotICAgICAgICAKLSAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgotICAgICAgICBNX0VYSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTWFjcm8gdG8gZXhpdCBtaWR3YXktYnJlYWsgZnJtIGNhc2UKLQotT01YX1ZDX0NIUk9NQV9IT1IKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0yIAotICAgICAgICAKLSAgICAgICAgQUREICAgICAgcFNyY0xlZnQyLCBwU3JjTGVmdCwgbGVmdFN0ZXAgICAgICAgOy8vIHBTcmNMZWZ0MiA9IHBTcmNMZWZ0ICsgbGVmdFN0ZXAKLSAgICAgICAgQUREICAgICAgbGVmdFN0ZXB4MiwgbGVmdFN0ZXAsIGxlZnRTdGVwICAgICAgOy8vIGxlZnRTdGVweDIgPSBsZWZ0U3RlcCAqIDIKLSAgICAgICAgQUREICAgICAgcERzdDIsIHBEc3QsIGRzdFN0ZXAgICAgICAgICAgICAgICAgOy8vIHBEc3QyID0gcERzdCArIGRzdFN0ZXAKLSAgICAgICAgQUREICAgICAgZHN0U3RlcHgyLCBkc3RTdGVwLCBkc3RTdGVwICAgICAgICAgOy8vIGRvdWJsZSBkc3RTdGVwCi0gICAgICAgIFNVQiAgICAgIGRzdFN0ZXB4MiwgZHN0U3RlcHgyLCAjNCAgICAgICAgICAgIDsvLyBkb3VibGUgZHN0U3RlcCAgbWludXMgNAotICAgICAgICBMRFIgICAgICByMHgwMTAxMDEwMSwgPU1VTF9DT05TVDAgICAgICAgICAgICA7Ly8gQ29uc3QgdG8gcmVwZWF0IHRoZSBieXRlIGluIHJlZyA0IHRpbWVzCi0gICAgICAgIE1fTERSQiAgIHRWYWw2LCBbcFNyY0xlZnRdLCArbGVmdFN0ZXB4MiAgICAgIDsvLyB0VmFsNiA9IHBTcmNMZWZ0WzBdCi0gICAgICAgIE1fTERSQiAgIHRWYWw3LCBbcFNyY0xlZnQyXSwrbGVmdFN0ZXB4MiAgICAgIDsvLyB0VmFsNyA9IHBTcmNMZWZ0WzFdCi0gICAgICAgIE1fTERSQiAgIHRWYWw4LCBbcFNyY0xlZnRdLCArbGVmdFN0ZXB4MiAgICAgIDsvLyB0VmFsOCA9IHBTcmNMZWZ0WzJdCi0gICAgICAgIE1fTERSQiAgIHRWYWw5LCBbcFNyY0xlZnQyXSwrbGVmdFN0ZXB4MiAgICAgIDsvLyB0VmFsOSA9IHBTcmNMZWZ0WzNdCi0gICAgICAgIE1VTCAgICAgIHRWYWw2LCB0VmFsNiwgcjB4MDEwMTAxMDEgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCi0gICAgICAgIE1VTCAgICAgIHRWYWw3LCB0VmFsNywgcjB4MDEwMTAxMDEgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCi0gICAgICAgIE1VTCAgICAgIHRWYWw4LCB0VmFsOCwgcjB4MDEwMTAxMDEgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCi0gICAgICAgIE1VTCAgICAgIHRWYWw5LCB0VmFsOSwgcjB4MDEwMTAxMDEgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCi0gICAgICAgIFNUUiAgICAgIHRWYWw2LCBbcERzdF0sICAjKzQgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3QgWzAgdG8gM10gCi0gICAgICAgIFNUUiAgICAgIHRWYWw3LCBbcERzdDJdLCAjKzQgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDd9IGF0IHBEc3QyWzAgdG8gM10KLSAgICAgICAgTV9TVFIgICAgdFZhbDYsIFtwRHN0XSwgIGRzdFN0ZXB4MiAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdCBbNCB0byA3XQotICAgICAgICBNX1NUUiAgICB0VmFsNywgW3BEc3QyXSwgZHN0U3RlcHgyICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw3fSBhdCBwRHN0Mls0IHRvIDddCi0gICAgICAgIFNUUiAgICAgIHRWYWw4LCBbcERzdF0sICAjKzQgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3QgWzAgdG8gM10KLSAgICAgICAgU1RSICAgICAgdFZhbDksIFtwRHN0Ml0sICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsN30gYXQgcERzdDJbMCB0byAzXQotICAgICAgICBNX1NUUiAgICB0VmFsOCwgW3BEc3RdLCAgZHN0U3RlcHgyICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw2fSBhdCBwRHN0IFs0IHRvIDddCi0gICAgICAgIE1fU1RSICAgIHRWYWw5LCBbcERzdDJdLCBkc3RTdGVweDIgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDd9IGF0IHBEc3QyWzQgdG8gN10KLSAgICAgICAgTV9MRFJCICAgdFZhbDYsIFtwU3JjTGVmdF0sICtsZWZ0U3RlcHgyICAgICAgOy8vIHRWYWw2ID0gcFNyY0xlZnRbNF0KLSAgICAgICAgTV9MRFJCICAgdFZhbDcsIFtwU3JjTGVmdDJdLCtsZWZ0U3RlcHgyICAgICAgOy8vIHRWYWw3ID0gcFNyY0xlZnRbNV0KLSAgICAgICAgTV9MRFJCICAgdFZhbDgsIFtwU3JjTGVmdF0sICtsZWZ0U3RlcHgyICAgICAgOy8vIHRWYWw4ID0gcFNyY0xlZnRbNl0KLSAgICAgICAgTV9MRFJCICAgdFZhbDksIFtwU3JjTGVmdDJdLCtsZWZ0U3RlcHgyICAgICAgOy8vIHRWYWw5ID0gcFNyY0xlZnRbN10KLSAgICAgICAgTVVMICAgICAgdFZhbDYsIHRWYWw2LCByMHgwMTAxMDEwMSAgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKLSAgICAgICAgTVVMICAgICAgdFZhbDcsIHRWYWw3LCByMHgwMTAxMDEwMSAgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKLSAgICAgICAgTVVMICAgICAgdFZhbDgsIHRWYWw4LCByMHgwMTAxMDEwMSAgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKLSAgICAgICAgTVVMICAgICAgdFZhbDksIHRWYWw5LCByMHgwMTAxMDEwMSAgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKLSAgICAgICAgU1RSICAgICAgdFZhbDYsIFtwRHN0XSwgICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdCBbMCB0byAzXSAKLSAgICAgICAgU1RSICAgICAgdFZhbDcsIFtwRHN0Ml0sICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsN30gYXQgcERzdDJbMCB0byAzXQotICAgICAgICBNX1NUUiAgICB0VmFsNiwgW3BEc3RdLCAgZHN0U3RlcHgyICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw2fSBhdCBwRHN0IFs0IHRvIDddCi0gICAgICAgIE1fU1RSICAgIHRWYWw3LCBbcERzdDJdLCBkc3RTdGVweDIgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDd9IGF0IHBEc3QyWzQgdG8gN10KLSAgICAgICAgU1RSICAgICAgdFZhbDgsIFtwRHN0XSwgICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdCBbMCB0byAzXQotICAgICAgICBTVFIgICAgICB0VmFsOSwgW3BEc3QyXSwgIys0ICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw3fSBhdCBwRHN0MlswIHRvIDNdCi0gICAgICAgIE1fU1RSICAgIHRWYWw4LCBbcERzdF0sICBkc3RTdGVweDIgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3QgWzQgdG8gN10KLSAgICAgICAgTV9TVFIgICAgdFZhbDksIFtwRHN0Ml0sIGRzdFN0ZXB4MiAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsN30gYXQgcERzdDJbNCB0byA3XQotICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCi0gICAgICAgIE1fRVhJVAotICAgICAgICAKLU9NWF9WQ19DSFJPTUFfVkVSVAotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTQgICAgICAgIAotICAgICAgICAKLSAgICAgICAgTERNSUEgICAgcFNyY0Fib3ZlLCB7dFZhbDYsdFZhbDd9ICAgICAgICAgICAgOy8vIHRWYWwgNiB0byA3ID0gcFNyY0Fib3ZlWzAgdG8gN10KLSAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgotICAgICAgICAKLSAgICAgICAgTV9TVFJEICAgdFZhbDYsIHRWYWw3LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbMCB0byA3XSAgID0gdFZhbCA2IHRvIDcKLSAgICAgICAgTV9TVFJEICAgdFZhbDYsIHRWYWw3LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbOCB0byAxNV0gID0gdFZhbCA2IHRvIDcKLSAgICAgICAgTV9TVFJEICAgdFZhbDYsIHRWYWw3LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbMTYgdG8gMjNdID0gdFZhbCA2IHRvIDcKLSAgICAgICAgTV9TVFJEICAgdFZhbDYsIHRWYWw3LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbMjQgdG8gMzFdID0gdFZhbCA2IHRvIDcKLSAgICAgICAgTV9TVFJEICAgdFZhbDYsIHRWYWw3LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbMzIgdG8gMzldID0gdFZhbCA2IHRvIDcKLSAgICAgICAgTV9TVFJEICAgdFZhbDYsIHRWYWw3LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbNDAgdG8gNDddID0gdFZhbCA2IHRvIDcKLSAgICAgICAgTV9TVFJEICAgdFZhbDYsIHRWYWw3LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbNDggdG8gNTVdID0gdFZhbCA2IHRvIDcKLSAgICAgICAgTV9TVFJEICAgdFZhbDYsIHRWYWw3LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbNTYgdG8gNjNdID0gdFZhbCA2IHRvIDcKLQotICAgICAgICBNX0VYSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTWFjcm8gdG8gZXhpdCBtaWR3YXktYnJlYWsgZnJtIGNhc2UKLSAgICAgICAgCi1PTVhfVkNfQ0hST01BX1BMQU5FCi0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MwotICAgICAgICAKLSAgICAgICAgUlNCICAgICAgdFZhbDE0LCBsZWZ0U3RlcCwgbGVmdFN0ZXAsIExTTCAjMyAgOy8vIDcqbGVmdFN0ZXAKLSAgICAgICAgTERSQiAgICAgdFZhbDcsIFtwU3JjQWJvdmUsICMrN10gICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs3XQotICAgICAgICBMRFJCICAgICB0VmFsNiwgW3BTcmNMZWZ0LCArdFZhbDE0XSAgICAgICAgICA7Ly8gcFNyY0xlZnRbNypsZWZ0U3RlcF0KLSAgICAgICAgTERSQiAgICAgdFZhbDgsIFtwU3JjQWJvdmVMZWZ0XSAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZUxlZnRbMF0KLSAgICAgICAgTERSQiAgICAgdFZhbDksIFtwU3JjQWJvdmUsICMrNiBdICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs2XQotICAgICAgICBMRFJCICAgICB0VmFsMTAsW3BTcmNBYm92ZV0gICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzBdCi0gICAgICAgIEFERCAgICAgIHRWYWwyLCB0VmFsNywgdFZhbDYgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbN10gKyBwU3JjTGVmdFs3KmxlZnRTdGVwXQotICAgICAgICBTVUIgICAgICB0VmFsNiwgdFZhbDYsIHRWYWw4ICAgICAgICAgICAgICAgICA7Ly8gVjAgPSBwU3JjTGVmdFs3KmxlZnRTdGVwXSAtIHBTcmNBYm92ZUxlZnRbMF0KLSAgICAgICAgU1VCICAgICAgdFZhbDcsIHRWYWw3LCB0VmFsOCAgICAgICAgICAgICAgICAgOy8vIEgwID0gcFNyY0Fib3ZlWzddIC0gcFNyY0Fib3ZlTGVmdFswXSAgICAgICAgCi0gICAgICAgIExTTCAgICAgIHRWYWwyLCB0VmFsMiwgIzQgICAgICAgICAgICAgICAgICAgIDsvLyBhID0gMTYgKiAocFNyY0Fib3ZlWzE1XSArIHBTcmNMZWZ0WzE1KmxTXSkKLSAgICAgICAgQUREICAgICAgdFZhbDIsIHRWYWwyLCAjMTYgICAgICAgICAgICAgICAgICAgOy8vIGEgKyAxNgotICAgICAgICBTVUIgICAgICB0VmFsOSwgdFZhbDksdFZhbDEwICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzZdIC0gcFNyY0Fib3ZlWzBdCi0gICAgICAgIExEUkIgICAgIHRWYWw4LCBbcFNyY0Fib3ZlLCMrNV0gICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbNV0KLSAgICAgICAgTERSQiAgICAgdFZhbDEwLFtwU3JjQWJvdmUsIysxXSAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVsxXQotICAgICAgICBBREQgICAgICB0VmFsOSwgdFZhbDksIHRWYWw5LCBMU0wgIzEgICAgICAgICA7Ly8gSDEgPSAzICogKHBTcmNBYm92ZVs2XSAtIHBTcmNBYm92ZVswXSkKLSAgICAgICAgQUREICAgICAgdFZhbDcsIHRWYWw5LCB0VmFsNywgTFNMICMyICAgICAgICAgOy8vIEggPSBIMSArIEgwCi0gICAgICAgIFNVQiAgICAgIHRWYWw4LCB0VmFsOCwgdFZhbDEwICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbNV0gLSBwU3JjQWJvdmVbMV0KLSAgICAgICAgTERSQiAgICAgdFZhbDksIFtwU3JjQWJvdmUsIys0XSAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs0XQotICAgICAgICBMRFJCICAgICB0VmFsMTAsW3BTcmNBYm92ZSwjKzJdICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzJdCi0gICAgICAgIEFERCAgICAgIHRWYWw3LCB0VmFsNywgdFZhbDgsIExTTCAjMSAgICAgICAgIDsvLyBIID0gSCArIEgyCi0gICAgICAgIFNVQiAgICAgIHRWYWwxMSwgdFZhbDE0LGxlZnRTdGVwICAgICAgICAgICAgIDsvLyA2KmxlZnRTdGVwCi0gICAgICAgIEFERCAgICAgIHRWYWwxMSwgcFNyY0xlZnQsIHRWYWwxMSAgICAgICAgICAgIDsvLyBwU3JjTGVmdCArIDYqbGVmdFN0ZXAKLSAgICAgICAgTU9WICAgICAgdFZhbDEyLCBwU3JjTGVmdCAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0Ci0gICAgICAgIFNVQiAgICAgIHRWYWw5LCB0VmFsOSwgdFZhbDEwICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbNF0gLSBwU3JjQWJvdmVbMl0KLSAgICAgICAgQUREICAgICAgdFZhbDcsIHRWYWw3LCB0VmFsOSAgICAgICAgICAgICAgICAgOy8vIEggPSBIICsgSDMKLSAgICAgICAgTV9MRFJCICAgdFZhbDgsIFt0VmFsMTFdLC1sZWZ0U3RlcCAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzYqbGVmdFN0ZXBdCi0gICAgICAgIE1fTERSQiAgIHRWYWwxMCxbdFZhbDEyXSwrbGVmdFN0ZXAgICAgICAgICAgIDsvLyBwU3JjTGVmdFswXQotICAgICAgICBBREQgICAgICB0VmFsNywgdFZhbDcsIHRWYWw3LCBMU0wgIzQgICAgICAgICA7Ly8gMTcgKiBICi0gICAgICAgIEFERCAgICAgIHRWYWw3LCB0VmFsNywgIzE2ICAgICAgICAgICAgICAgICAgIDsvLyAxNyAqIEggKyAxNgotICAgICAgICBTVUIgICAgICB0VmFsOCwgdFZhbDgsIHRWYWwxMCAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNipsZWZ0U3RlcF0gLSBwU3JjTGVmdFswXQotICAgICAgICBBU1IgICAgICBiLCB0VmFsNywgIzUgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gYiA9ICgxNyAqIEggKyAxNikgPj4gNQotICAgICAgICBBREQgICAgICB0VmFsOCwgdFZhbDgsIHRWYWw4LCBMU0wgIzEgICAgICAgICA7Ly8gVjEgPSAzICogKHBTcmNMZWZ0WzYqbGVmdFN0ZXBdIC0gcFNyY0xlZnRbMF0pCi0gICAgICAgIEFERCAgICAgIHRWYWw2LCB0VmFsOCwgdFZhbDYsIExTTCAjMiAgICAgICAgIDsvLyBWID0gVjAgK1YxCi0gICAgICAgIE1fTERSQiAgIHRWYWw4LCBbdFZhbDExXSwtbGVmdFN0ZXAgICAgICAgICAgIDsvLyBwU3JjTGVmdFs1KmxlZnRTdGVwXQotICAgICAgICBNX0xEUkIgICB0VmFsMTAsW3RWYWwxMl0sK2xlZnRTdGVwICAgICAgICAgICA7Ly8gcFNyY0xlZnRbbGVmdFN0ZXBdCi0gICAgICAgIEFERCAgICAgIHRWYWw3LCBiLCBiLCBMU0wgIzEgICAgICAgICAgICAgICAgIDsvLyAzKmIKLSAgICAgICAgU1VCICAgICAgdFZhbDIsIHRWYWwyLCB0VmFsNyAgICAgICAgICAgICAgICAgOy8vIGEgKyAxNiAtIDMqYgotICAgICAgICBTVUIgICAgICB0VmFsNywgdFZhbDgsIHRWYWwxMCAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNSpsZWZ0U3RlcF0gLSBwU3JjTGVmdFtsZWZ0U3RlcF0KLSAgICAgICAgTV9MRFJCICAgdFZhbDgsIFt0VmFsMTFdLC1sZWZ0U3RlcCAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzQqbGVmdFN0ZXBdCi0gICAgICAgIE1fTERSQiAgIHRWYWwxMCxbdFZhbDEyXSwrbGVmdFN0ZXAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsyKmxlZnRTdGVwXSAgICAgICAgCi0gICAgICAgIEFERCAgICAgIHRWYWw2LCB0VmFsNiwgdFZhbDcsIExTTCAjMSAgICAgICAgIDsvLyBWID0gViArIFYyCi0gICAgICAgIExEUiAgICAgIHIweDAwRkYwMEZGLCA9TUFTS19DT05TVCAgICAgICAgICAgIDsvLyByMHgwMEZGMDBGRiA9IDB4MDBGRjAwRkYKLSAgICAgICAgU1VCICAgICAgdFZhbDcsIHRWYWw4LCB0VmFsMTAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzQqbGVmdFN0ZXBdIC0gcFNyY0xlZnRbMipsZWZ0U3RlcF0KLSAgICAgICAgQUREICAgICAgdFZhbDYsIHRWYWw2LCB0VmFsNyAgICAgICAgICAgICAgICAgOy8vIFYgPSBWICsgVjcKLSAgICAgICAgU1VCICAgICAgZHN0U3RlcCwgZHN0U3RlcCwgIzQgICAgICAgICAgICAgICAgOy8vIGRzdFN0ZXAgLSA0Ci0gICAgICAgIEFERCAgICAgIHRWYWw2LCB0VmFsNiwgdFZhbDYsIExTTCAjNCAgICAgICAgIDsvLyAxNypWCi0gICAgICAgIEFERCAgICAgIHRWYWw2LCB0VmFsNiwgIzE2ICAgICAgICAgICAgICAgICAgIDsvLyAxNypWICsgMTYKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCi0gICAgICAgIAotICAgICAgICBBU1IgICAgICBjLCB0VmFsNiwgIzUgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gYyA9ICgxNypWICsgMTYpPj41Ci0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQotICAgICAgICAKLSAgICAgICAgQUREICAgICAgdFZhbDYsIGMsIGMsIExTTCAjMSAgICAgICAgICAgICAgICAgOy8vIDMqYwotICAgICAgICBVWFRIICAgICBjLCBjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gb25seSBpbiBoYWxmIHdvcmQKLSAgICAgICAgU1VCICAgICAgdFZhbDYsIHRWYWwyLCB0VmFsNiAgICAgICAgICAgICAgICAgOy8vIGEgLSAzKmIgLSAzKmMgKyAxNgotICAgICAgICBPUlIgICAgICBjLCBjLCBjLCBMU0wgIzE2ICAgICAgICAgICAgICAgICAgICA7Ly8gYyBjCi0gICAgICAgIEFERCAgICAgIHRWYWw3LCBiLCBiICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAyYgotICAgICAgICBBREQgICAgICB0VmFsMiwgdFZhbDYsIHRWYWw3ICAgICAgICAgICAgICAgICA7Ly8gcHAyID0gZCArIDIqYgotICAgICAgICBBREQgICAgICB0VmFsNywgdFZhbDcsIGIgICAgICAgICAgICAgICAgICAgICA7Ly8gM2IKLSAgICAgICAgT1JSICAgICAgcDJwMCwgICB0VmFsNiwgIHRWYWwyLCAgTFNMICMxNiAgICAgOy8vIHAycDAgICA9IHBhY2sge3AyLCBwMH0KLSAgICAgICAgVVhUSCAgICAgYiwgYgotICAgICAgICBVWFRIICAgICB0VmFsNywgdFZhbDcKLSAgICAgICAgT1JSICAgICAgYiwgYiwgYiwgTFNMICMxNiAgICAgICAgICAgICAgICAgICAgOy8vIHtiLGJ9Ci0gICAgICAgIE9SUiAgICAgIHRWYWw3LCB0VmFsNywgdFZhbDcsIExTTCAjMTYgICAgICAgIDsvLyB7M2IsM2J9Ci0gICAgICAgIFNBREQxNiAgIHAzcDEsICAgcDJwMCwgYiAgICAgICAgICAgICAgICAgICAgIDsvLyBwM3AxICAgPSBwMnAwICsge2IsYn0KLSAgICAgICAgU0FERDE2ICAgcDZwNCwgICBwM3AxLCB0VmFsNyAgICAgICAgICAgICAgICAgOy8vIHA2cDQgICA9IHAzcDEgKyB7M2IsM2J9Ci0gICAgICAgIFNBREQxNiAgIHA3cDUsICAgcDZwNCwgYiAgICAgICAgICAgICAgICAgICAgIDsvLyBwN3A1ICAgPSBwNnA0ICsge2IsYn0KLSAgICAgICAgTU9WICAgICAgb3V0ZXJDb3VudCwgI0JMS19TSVpFICAgICAgICAgICAgICAgOy8vIE91dGVyIExvb3AgQ291bnQgICAgICAgIAotICAgICAgICAKLUxPT1BfUExBTkUgICAgICAgIAotCi0gICAgICAgIFVTQVQxNiAgIHA3cDUsICAgIzEzLCBwN3A1ICAgICAgICAgICAgICAgICAgICA7Ly8gY2xpcDEzKHA3KSBjbGlwMTMocDUpCi0gICAgICAgIFVTQVQxNiAgIHA2cDQsICAgIzEzLCBwNnA0ICAgICAgICAgICAgICAgICAgICA7Ly8gY2xpcDEzKHA2KSBjbGlwMTMocDQpCi0gICAgICAgIFVTQVQxNiAgIHAzcDEsICAgIzEzLCBwM3AxICAgICAgICAgICAgICAgICAgICA7Ly8gY2xpcDEzKHAzKSBjbGlwMTMocDEpCi0gICAgICAgIFVTQVQxNiAgIHAycDAsICAgIzEzLCBwMnAwICAgICAgICAgICAgICAgICAgICA7Ly8gY2xpcDEzKHAyKSBjbGlwMTMocDApCi0gICAgICAgIAotICAgICAgICBBTkQgICAgICBwcDdwcDUsIHIweDAwRkYwMEZGLCBwN3A1LCBBU1IgIzUgICAgOy8vIGNsaXA4KHA3KSBjbGlwOChwNSkKLSAgICAgICAgQU5EICAgICAgcHA2cHA0LCByMHgwMEZGMDBGRiwgcDZwNCwgQVNSICM1ICAgIDsvLyBjbGlwOChwNikgY2xpcDgocDQpCi0gICAgICAgIEFORCAgICAgIHBwM3BwMSwgcjB4MDBGRjAwRkYsIHAzcDEsIEFTUiAjNSAgICA7Ly8gY2xpcDgocDMpIGNsaXA4KHAxKQotICAgICAgICBBTkQgICAgICBwcDJwcDAsIHIweDAwRkYwMEZGLCBwMnAwLCBBU1IgIzUgICAgOy8vIGNsaXA4KHAyKSBjbGlwOChwMCkKLSAgICAgICAgCi0gICAgICAgIFNVQlMgICAgIG91dGVyQ291bnQsIG91dGVyQ291bnQsICMxICAgICAgICAgICA7Ly8gb3V0ZXJDb3VudC0tCi0gICAgICAKLSAgICAgICAgT1JSICAgICAgcDMyMTAsIHBwMnBwMCwgcHAzcHAxLCBMU0wgIzggICAgICAgIDsvLyBwYWNrIHtwMyxwMiwgcDEsIHAwfQotICAgICAgICBTVFIgICAgICBwMzIxMCwgW3BEc3RdLCAjNCAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHtwRHN0WzBdIHRvIHBEc3RbM119ICAKLSAgICAgICAgCi0gICAgICAgIE9SUiAgICAgIHA3NjU0LCBwcDZwcDQsIHBwN3BwNSwgTFNMICM4ICAgICAgICA7Ly8gcGFjayB7cDcscDYsIHA1LCBwNH0KLSAgICAgICAgTV9TVFIgICAgcDc2NTQsIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7cERzdFs0XSB0byBwRHN0WzddfQotCi0gICAgICAgIFNBREQxNiAgIHA3cDUsICAgcDdwNSwgICBjICAgICAgICAgICAgICAgICAgICA7Ly8ge3A3ICsgY30sIHtwNSArIGN9Ci0gICAgICAgIFNBREQxNiAgIHA2cDQsICAgcDZwNCwgICBjICAgICAgICAgICAgICAgICAgICA7Ly8ge3A2ICsgY30sIHtwNCArIGN9Ci0gICAgICAgIFNBREQxNiAgIHAzcDEsICAgcDNwMSwgICBjICAgICAgICAgICAgICAgICAgICA7Ly8ge3AzICsgY30sIHtwMSArIGN9Ci0gICAgICAgIFNBREQxNiAgIHAycDAsICAgcDJwMCwgICBjICAgICAgICAgICAgICAgICAgICA7Ly8ge3AyICsgY30sIHtwMCArIGN9Ci0gICAgICAKLSAgICAgICAgQk5FICAgICAgTE9PUF9QTEFORSAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb29wIGZvciA4IHRpbWVzCi0gICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgTV9FTkQKLSAgICAgICAgCi0gICAgICAgIEVORElGIDsvLyBBUk0xMTM2SlMKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgRU5ECi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCBlbmRzCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNl9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2X3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMwY2JhNy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2X3MucworKysgL2Rldi9udWxsCkBAIC0xLDUxNSArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTZfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgOTY0MQotOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAgIAotICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUyAgICAKLSAgCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gVGhpcyB0YWJsZSBmb3IgaW1wbGVtZW50aW5nIHN3aXRjaCBjYXNlIG9mIEMgaW4gYXNtIGJ5Ci07Ly8gdGhlIG1laHRvZCBvZiB0d28gbGV2ZWxzIG9mIGluZGV4aW5nLgotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgTV9UQUJMRSBhcm1WQ000UDEwX3BJbmRleFRhYmxlMTZ4MTYKLSAgICBEQ0QgIE9NWF9WQ18xNlgxNl9WRVJULCBPTVhfVkNfMTZYMTZfSE9SIAotICAgIERDRCAgT01YX1ZDXzE2WDE2X0RDLCAgIE9NWF9WQ18xNlgxNl9QTEFORQotICAgIAotICAgIElGIEFSTTExMzZKUwotCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIENvbnN0YW50cyAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKLUJMS19TSVpFICAgICAgICBFUVUgMHgxMAotTVVMX0NPTlNUMCAgICAgIEVRVSAweDAxMDEwMTAxCi1NVUxfQ09OU1QxICAgICAgRVFVIDB4MDAwNjAwMDQKLU1VTF9DT05TVDIgICAgICBFUVUgMHgwMDA3MDAwNQotTVVMX0NPTlNUMyAgICAgIEVRVSAweDAwMDMwMDAxCi1NQVNLX0NPTlNUICAgICAgRVFVIDB4MDBGRjAwRkYKLQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBTY3JhdGNoIHZhcmlhYmxlCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoteSAgICAgICAgICAgICAgIFJOIDEyICAgCi1wYyAgICAgICAgICAgICAgUk4gMTUgICAKLQotcmV0dXJuICAgICAgICAgIFJOIDAgICAgCi1pbm5lckNvdW50ICAgICAgUk4gMCAgICAKLW91dGVyQ291bnQgICAgICBSTiAxICAgIAotcFNyY0xlZnQyICAgICAgIFJOIDEgICAgCi1wRHN0MiAgICAgICAgICAgUk4gMiAgICAKLXN1bSAgICAgICAgICAgICBSTiA2ICAgIAotcFRhYmxlICAgICAgICAgIFJOIDkgICAgCi10ZW1wMSAgICAgICAgICAgUk4gMTAgICAKLXRlbXAyICAgICAgICAgICBSTiAxMiAgIAotY011bDEgICAgICAgICAgIFJOIDExICAgCi1jTXVsMiAgICAgICAgICAgUk4gMTIgICAKLWNvdW50ICAgICAgICAgICBSTiAxMiAgIAotZHN0U3RlcHgyICAgICAgIFJOIDExICAgCi1sZWZ0U3RlcHgyICAgICAgUk4gMTQgICAKLXIweDAxMDEwMTAxICAgICBSTiAxMCAgIAotcjB4MDBGRjAwRkYgICAgIFJOIDExCi0KLXRWYWwwICAgICAgICAgICBSTiAwICAgIAotdFZhbDEgICAgICAgICAgIFJOIDEgICAgCi10VmFsMiAgICAgICAgICAgUk4gMiAgICAKLXRWYWwzICAgICAgICAgICBSTiAzICAgIAotdFZhbDQgICAgICAgICAgIFJOIDQgICAgCi10VmFsNSAgICAgICAgICAgUk4gNSAgICAKLXRWYWw2ICAgICAgICAgICBSTiA2ICAgIAotdFZhbDcgICAgICAgICAgIFJOIDcgICAgCi10VmFsOCAgICAgICAgICAgUk4gOCAgICAKLXRWYWw5ICAgICAgICAgICBSTiA5ICAgIAotdFZhbDEwICAgICAgICAgIFJOIDEwICAgCi10VmFsMTEgICAgICAgICAgUk4gMTEgICAKLXRWYWwxMiAgICAgICAgICBSTiAxMiAgIAotdFZhbDE0ICAgICAgICAgIFJOIDE0ICAgCi0KLWIgICAgICAgICAgICAgICBSTiAxMiAgIAotYyAgICAgICAgICAgICAgIFJOIDE0ICAgCi0KLXAycDAgICAgICAgICAgICBSTiAwICAgIAotcDNwMSAgICAgICAgICAgIFJOIDEgICAgCi1wNnA0ICAgICAgICAgICAgUk4gMiAgICAKLXA3cDUgICAgICAgICAgICBSTiA0ICAgIAotcDEwcDggICAgICAgICAgIFJOIDYgICAgCi1wMTFwOSAgICAgICAgICAgUk4gNyAgICAKLXAxNHAxMiAgICAgICAgICBSTiA4ICAgIAotcDE1cDEzICAgICAgICAgIFJOIDkgICAgCi0KLXAzMjEwICAgICAgICAgICBSTiAxMCAgIAotcDc2NTQgICAgICAgICAgIFJOIDEwICAgCi1wMTExMDk4ICAgICAgICAgUk4gMTAgICAKLXAxNTE0MTMxMiAgICAgICBSTiAxMCAgIAotCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcFNyY0xlZnQgICAgICAgIFJOIDAgICAgOy8vIGlucHV0IHBvaW50ZXIKLXBTcmNBYm92ZSAgICAgICBSTiAxICAgIDsvLyBpbnB1dCBwb2ludGVyCi1wU3JjQWJvdmVMZWZ0ICAgUk4gMiAgICA7Ly8gaW5wdXQgcG9pbnRlcgotcERzdCAgICAgICAgICAgIFJOIDMgICAgOy8vIG91dHB1dCBwb2ludGVyCi1sZWZ0U3RlcCAgICAgICAgUk4gNCAgICA7Ly8gaW5wdXQgdmFyaWFibGUKLWRzdFN0ZXAgICAgICAgICBSTiA1ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQotcHJlZE1vZGUgICAgICAgIFJOIDYgICAgOy8vIGlucHV0IHZhcmlhYmxlCi1hdmFpbGFiaWxpdHkgICAgUk4gNyAgICA7Ly8gaW5wdXQgdmFyaWFibGUKLQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNiBzdGFydHMKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIAotICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIE1fU1RBUlQgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYsIHIxMQotICAgICAgICAKLSAgICAgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKLSAgICAgICAgTV9BUkcgICAgTGVmdFN0ZXAsICAgICA0Ci0gICAgICAgIE1fQVJHICAgIERzdFN0ZXAsICAgICAgNAotICAgICAgICBNX0FSRyAgICBQcmVkTW9kZSwgICAgIDQKLSAgICAgICAgTV9BUkcgICAgQXZhaWxhYmlsaXR5LCA0Ci0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9NAotICAgICAgICAKLSAgICAgICAgTERSICAgICAgcFRhYmxlLD1hcm1WQ000UDEwX3BJbmRleFRhYmxlMTZ4MTYgOy8vIExvYWQgaW5kZXggdGFibGUgZm9yIHN3aXRjaCBjYXNlCi0gICAgICAgIAotICAgICAgICA7Ly8gTG9hZCBhcmd1bWVudCBmcm9tIHRoZSBzdGFjawotICAgICAgICBNX0xEUiAgICBwcmVkTW9kZSwgUHJlZE1vZGUgICAgICAgICAgICAgICAgICA7Ly8gQXJnIHByZWRNb2RlIGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZyAKLSAgICAgICAgTV9MRFIgICAgbGVmdFN0ZXAsIExlZnRTdGVwICAgICAgICAgICAgICAgICAgOy8vIEFyZyBsZWZ0U3RlcCBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgCi0gICAgICAgIE1fTERSICAgIGRzdFN0ZXAsICBEc3RTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBBcmcgZHN0U3RlcCBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgICAgICAgICAKLSAgICAgICAgTV9MRFIgICAgYXZhaWxhYmlsaXR5LCBBdmFpbGFiaWxpdHkgICAgICAgICAgOy8vIEFyZyBhdmFpbGFiaWxpdHkgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnCi0gICAgICAgIAotICAgICAgICBNT1YgICAgICB5LCAjQkxLX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gT3V0ZXIgTG9vcCBDb3VudAotICAgICAgICBMRFIgICAgICBwYywgW3BUYWJsZSwgcHJlZE1vZGUsIExTTCAjMl0gICAgICA7Ly8gQnJhbmNoIHRvIHRoZSBjYXNlIGJhc2VkIG9uIHByZU1vZGUKLSAgICAgICAgCi1PTVhfVkNfMTZYMTZfVkVSVAotICAgICAgICBMRE0gICAgICBwU3JjQWJvdmUsIHt0VmFsNix0VmFsNyx0VmFsOCx0VmFsOX07Ly8gdFZhbCA2IHRvIDkgPSBwU3JjQWJvdmVbMCB0byAxNV0KLSAgICAgICAgQUREICAgICAgZHN0U3RlcHgyLCBkc3RTdGVwLCBkc3RTdGVwICAgICAgICAgOy8vIGRvdWJsZSBkc3RTdGVwCi0gICAgICAgIEFERCAgICAgIHBEc3QyLCBwRHN0LCBkc3RTdGVwICAgICAgICAgICAgICAgIDsvLyBwRHN0Mi0gcERzdCBhZHZhbmNlZCBieSBkc3RTdGVwCi0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MiAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0YWxsIG91dHNpZGUgdGhlIGxvb3AKLQotTE9PUF9WRVJUCi0gICAgICAgIFNUTSAgICAgIHBEc3QsIHt0VmFsNix0VmFsNyx0VmFsOCx0VmFsOX0gICAgIDsvLyBwRHN0WzAgdG8gMTVdID0gdFZhbCA2IHRvIDkKLSAgICAgICAgU1VCUyAgICAgeSwgeSwgIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHktLQotICAgICAgICBBREQgICAgICBwRHN0LCBwRHN0LCBkc3RTdGVweDIgICAgICAgICAgICAgICA7Ly8gcERzdCBhZHZhbmNlZCBieSBkc3RTdGVwCi0gICAgICAgIFNUTSAgICAgIHBEc3QyLCB7dFZhbDYsdFZhbDcsdFZhbDgsdFZhbDl9ICAgIDsvLyBwRHN0MlsxNiB0byAzMV0gPSB0VmFsIDYgdG8gOQotICAgICAgICBBREQgICAgICBwRHN0MiwgcERzdDIsIGRzdFN0ZXB4MiAgICAgICAgICAgICA7Ly8gcERzdCBhZHZhbmNlZCBieSBkc3RTdGVwCi0gICAgICAgIEJORSAgICAgIExPT1BfVkVSVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb29wIGZvciA4IHRpbWVzCi0gICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgTV9FWElUCi0KLSAgICAgICAgCi1PTVhfVkNfMTZYMTZfSE9SCi0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9NiAKLSAgICAgICAgICAgICAgIAotICAgICAgICBMRFIgICAgICByMHgwMTAxMDEwMSwgPU1VTF9DT05TVDAgICAgICAgICAgICA7Ly8gQ29uc3QgdG8gcmVwZWF0IHRoZSBieXRlIGluIHJlZyA0IHRpbWVzCi0gICAgICAgIE1PViAgICAgIHksICM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBPdXRlciBMb29wIENvdW50Ci0gICAgICAgIE1fTERSQiAgIHRWYWw2LCBbcFNyY0xlZnRdLCArbGVmdFN0ZXAgICAgICAgIDsvLyB0VmFsNiA9IHBTcmNMZWZ0WzAgdG8gM10KLSAgICAgICAgQUREICAgICAgcERzdDIsIHBEc3QsIGRzdFN0ZXAgICAgICAgICAgICAgICAgOy8vIHBEc3QyLSBwRHN0IGFkdmFuY2VkIGJ5IGRzdFN0ZXAKLSAgICAgICAgTV9MRFJCICAgdFZhbDcsIFtwU3JjTGVmdF0sICtsZWZ0U3RlcCAgICAgICAgOy8vIHRWYWwxID0gcFNyY0xlZnRbNCB0byA3XQotICAgICAgICBBREQgICAgICBkc3RTdGVweDIsIGRzdFN0ZXAsIGRzdFN0ZXAgICAgICAgICA7Ly8gZG91YmxlIGRzdFN0ZXAKLSAgICAgICAgU1VCICAgICAgZHN0U3RlcHgyLCBkc3RTdGVweDIsICMxMiAgICAgICAgICAgOy8vIGRvdWJsZSBkc3RTdGVwICBtaW51cyAxMgotICAgICAgIAotTE9PUF9IT1IgICAgICAgIAotICAgICAgICBNX0xEUkIgICB0VmFsOCwgW3BTcmNMZWZ0XSwgK2xlZnRTdGVwICAgICAgICA7Ly8gdFZhbDggPSBwU3JjTGVmdFswIHRvIDNdCi0gICAgICAgIE1VTCAgICAgIHRWYWw2LCB0VmFsNiwgcjB4MDEwMTAxMDEgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCi0gICAgICAgIE1fTERSQiAgIHRWYWw5LCBbcFNyY0xlZnRdLCArbGVmdFN0ZXAgICAgICAgIDsvLyB0VmFsOSA9IHBTcmNMZWZ0WzQgdG8gN10KLSAgICAgICAgTVVMICAgICAgdFZhbDcsIHRWYWw3LCByMHgwMTAxMDEwMSAgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKLSAgICAgICAgU1VCUyAgICAgeSwgeSwgIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHktLQotICAgICAgICBTVFIgICAgICB0VmFsNiwgW3BEc3RdLCAgIys0ICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw2fSBhdCBwRHN0WzAgdG8gM10gCi0gICAgICAgIFNUUiAgICAgIHRWYWw3LCBbcERzdDJdLCAjKzQgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDd9IGF0IHBEc3QyWzAgdG8gM10KLSAgICAgICAgU1RSICAgICAgdFZhbDYsIFtwRHN0XSwgICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdFs0IHRvIDddCi0gICAgICAgIFNUUiAgICAgIHRWYWw3LCBbcERzdDJdLCAjKzQgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDd9IGF0IHBEc3QyWzQgdG8gN10KLSAgICAgICAgTVVMICAgICAgdFZhbDgsIHRWYWw4LCByMHgwMTAxMDEwMSAgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKLSAgICAgICAgU1RSICAgICAgdFZhbDYsIFtwRHN0XSwgICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdFs4IHRvIDExXQotICAgICAgICBTVFIgICAgICB0VmFsNywgW3BEc3QyXSwgIys0ICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw3fSBhdCBwRHN0Mls4IHRvIDExXQotICAgICAgICBNVUwgICAgICB0VmFsOSwgdFZhbDksIHIweDAxMDEwMTAxICAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcwotICAgICAgICBNX1NUUiAgICB0VmFsNiwgW3BEc3RdLCBkc3RTdGVweDIgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw2fSBhdCBwRHN0WzEyIHRvIDE1XQotICAgICAgICBNX1NUUiAgICB0VmFsNywgW3BEc3QyXSwgZHN0U3RlcHgyICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw3fSBhdCBwRHN0MlsxMiB0byAxNV0KLSAgICAgICAgU1RSICAgICAgdFZhbDgsIFtwRHN0XSwgICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdFswIHRvIDNdIAotICAgICAgICBTVFIgICAgICB0VmFsOSwgW3BEc3QyXSwgIys0ICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw3fSBhdCBwRHN0MlswIHRvIDNdCi0gICAgICAgIFNUUiAgICAgIHRWYWw4LCBbcERzdF0sICAjKzQgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3RbNCB0byA3XQotICAgICAgICBTVFIgICAgICB0VmFsOSwgW3BEc3QyXSwgIys0ICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw3fSBhdCBwRHN0Mls0IHRvIDddCi0gICAgICAgIFNUUiAgICAgIHRWYWw4LCBbcERzdF0sICAjKzQgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3RbOCB0byAxMV0KLSAgICAgICAgU1RSICAgICAgdFZhbDksIFtwRHN0Ml0sICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsN30gYXQgcERzdDJbOCB0byAxMV0KLSAgICAgICAgTV9TVFIgICAgdFZhbDgsIFtwRHN0XSwgZHN0U3RlcHgyICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdFsxMiB0byAxNV0KLSAgICAgICAgTV9MRFJCICAgdFZhbDYsIFtwU3JjTGVmdF0sICtsZWZ0U3RlcCAgICAgICAgOy8vIHRWYWw2ID0gcFNyY0xlZnRbMCB0byAzXQotICAgICAgICBNX1NUUiAgICB0VmFsOSwgW3BEc3QyXSwgZHN0U3RlcHgyICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw3fSBhdCBwRHN0MlsxMiB0byAxNV0KLSAgICAgICAgTV9MRFJCICAgdFZhbDcsIFtwU3JjTGVmdF0sICtsZWZ0U3RlcCAgICAgICAgOy8vIHRWYWw3ID0gcFNyY0xlZnRbNCB0byA3XQotICAgICAgICBCTkUgICAgICBMT09QX0hPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9vcCBmb3IgMyB0aW1lcwotICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCi0gICAgICAgIE1fRVhJVAotICAgICAgICAKLU9NWF9WQ18xNlgxNl9EQwotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTIKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgIGNvdW50LCAjMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBjb3VudCA9IDAKLSAgICAgICAgVFNUICAgICAgYXZhaWxhYmlsaXR5LCAjT01YX1ZDX1VQUEVSICAgICAgICAgOy8vIGlmKGF2YWlsYWJpbGl0eSAmICNPTVhfVkNfVVBQRVIpCi0gICAgICAgIEJFUSAgICAgIFRTVF9MRUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBKdW1wIHRvIExlZnQgaWYgbm90IHVwcGVyCi0gICAgICAgIExETSAgICAgIHBTcmNBYm92ZSx7dFZhbDgsdFZhbDksdFZhbDEwLHRWYWwxMX07Ly8gdFZhbCA4IHRvIDExID0gcFNyY0Fib3ZlWzAgdG8gMTVdCi0gICAgICAgIEFERCAgICAgIGNvdW50LCBjb3VudCwgIzEgICAgICAgICAgICAgICAgICAgIDsvLyBpZiB1cHBlciBpbmMgY291bnQgYnkgMQotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTIKLSAgICAgICAgCi0gICAgICAgIFVYVEIxNiAgIHRWYWwyLCB0VmFsOCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMCwgMl0KLSAgICAgICAgVVhUQjE2ICAgdFZhbDYsIHRWYWw5ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs0LCA2XQotICAgICAgICBVQUREMTYgICB0VmFsMiwgdFZhbDIsIHRWYWw2ICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzAsIDJdICsgcFNyY0Fib3ZlWzQsIDZdCi0gICAgICAgIFVYVEIxNiAgIHRWYWw4LCB0VmFsOCwgUk9SICM4ICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMSwgM10KLSAgICAgICAgVVhUQjE2ICAgdFZhbDksIHRWYWw5LCBST1IgIzggICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs1LCA3XQotICAgICAgICBVQUREMTYgICB0VmFsOCwgdFZhbDgsIHRWYWw5ICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzEsIDNdICsgcFNyY0Fib3ZlWzUsIDddCi0gICAgICAgIFVBREQxNiAgIHRWYWwyLCB0VmFsMiwgdFZhbDggICAgICAgICAgICAgICAgIDsvLyBzdW0ocFNyY0Fib3ZlWzBdIHRvIHBTcmNBYm92ZVs3XSkKLSAgICAgICAgCi0gICAgICAgIFVYVEIxNiAgIHRWYWw4LCB0VmFsMTAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbOCwgMTBdCi0gICAgICAgIFVYVEIxNiAgIHRWYWw5LCB0VmFsMTEgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMTIsIDE0XQotICAgICAgICBVQUREMTYgICB0VmFsOCwgdFZhbDgsIHRWYWw5ICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzgsIDEwXSArIHBTcmNBYm92ZVsxMiwgMTRdCi0gICAgICAgIFVYVEIxNiAgIHRWYWwxMCwgdFZhbDEwLCBST1IgIzggICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbOSwgMTFdCi0gICAgICAgIFVYVEIxNiAgIHRWYWwxMSwgdFZhbDExLCBST1IgIzggICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMTMsIDE1XQotICAgICAgICBVQUREMTYgICB0VmFsMTAsIHRWYWwxMCwgdFZhbDExICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzksIDExXSArIHBTcmNBYm92ZVsxMywgMTVdCi0gICAgICAgIFVBREQxNiAgIHRWYWw4LCB0VmFsOCwgdFZhbDEwICAgICAgICAgICAgICAgIDsvLyBzdW0ocFNyY0Fib3ZlWzhdIHRvIHBTcmNBYm92ZVsxNV0pCi0gICAgICAgIAotICAgICAgICBVQUREMTYgICB0VmFsMiwgdFZhbDIsIHRWYWw4ICAgICAgICAgICAgICAgICA7Ly8gc3VtKHBTcmNBYm92ZVswXSB0byBwU3JjQWJvdmVbMTVdKQotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKLSAgICAgICAgCi0gICAgICAgIEFERCAgICAgIHRWYWwyLCB0VmFsMiwgdFZhbDIsIExTUiAjMTYgICAgICAgIDsvLyBzdW0ocFNyY0Fib3ZlWzBdIHRvIHBTcmNBYm92ZVsxNV0pCi0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQotICAgICAgICAKLSAgICAgICAgVVhUSCAgICAgc3VtLCB0VmFsMiAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEV4dHJhY3QgdGhlIGxvd2VyIGhhbGYgZm9yIHJlc3VsdAotICAgICAgICAKLVRTVF9MRUZUICAgICAgICAKLSAgICAgICAgVFNUICAgICAgYXZhaWxhYmlsaXR5LCAjT01YX1ZDX0xFRlQKLSAgICAgICAgQkVRICAgICAgVFNUX0NPVU5UCi0gICAgICAgIEFERCAgICAgIGxlZnRTdGVweDIsIGxlZnRTdGVwLGxlZnRTdGVwICAgICAgIDsvLyBsZWZ0U3RlcHgyID0gMiAqIGxlZnRTdGVwCi0gICAgICAgIEFERCAgICAgIHBTcmNMZWZ0MiwgcFNyY0xlZnQsIGxlZnRTdGVwICAgICAgIDsvLyBwU3JjTGVmdDIgPSBwU3JjTGVmdCArIGxlZnRTdGVwCi0gICAgICAgIAotICAgICAgICBNX0xEUkIgICB0VmFsOCwgW3BTcmNMZWZ0XSwgICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDggPSBwU3JjTGVmdFswXQotICAgICAgICBNX0xEUkIgICB0VmFsOSwgW3BTcmNMZWZ0Ml0sICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDkgPSBwU3JjTGVmdFsxXQotICAgICAgICBNX0xEUkIgICB0VmFsMTAsIFtwU3JjTGVmdF0sICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDEwPSBwU3JjTGVmdFsyXQotICAgICAgICBNX0xEUkIgICB0VmFsMTEsIFtwU3JjTGVmdDJdLCtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDExPSBwU3JjTGVmdFszXQotICAgICAgICBBREQgICAgICB0VmFsNywgdFZhbDgsIHRWYWw5ICAgICAgICAgICAgICAgICA7Ly8gdFZhbDcgPSB0VmFsOCArIHRWYWw5Ci0gICAgICAgIEFERCAgICAgIGNvdW50LCBjb3VudCwgIzEgICAgICAgICAgICAgICAgICAgIDsvLyBJbmMgQ291bnRlciBpZiBMZWZ0IGlzIGF2YWlsYWJsZQotICAgICAgICBBREQgICAgICB0VmFsNiwgdFZhbDEwLCB0VmFsMTEgICAgICAgICAgICAgICA7Ly8gdFZhbDYgPSB0VmFsMTAgKyB0VmFsMTEKLSAgICAgICAgCi0gICAgICAgIE1fTERSQiAgIHRWYWw4LCBbcFNyY0xlZnRdLCAgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsOCA9IHBTcmNMZWZ0WzBdCi0gICAgICAgIE1fTERSQiAgIHRWYWw5LCBbcFNyY0xlZnQyXSwgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsOSA9IHBTcmNMZWZ0WzFdCi0gICAgICAgIE1fTERSQiAgIHRWYWwxMCwgW3BTcmNMZWZ0XSwgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsMTA9IHBTcmNMZWZ0WzJdCi0gICAgICAgIE1fTERSQiAgIHRWYWwxMSwgW3BTcmNMZWZ0Ml0sK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsMTE9IHBTcmNMZWZ0WzNdCi0gICAgICAgIEFERCAgICAgIHN1bSwgdFZhbDcsIHRWYWw2ICAgICAgICAgICAgICAgICAgIDsvLyBzdW0gPSB0VmFsOCArIHRWYWwxMAotICAgICAgICBBREQgICAgICB0VmFsOCwgdFZhbDgsIHRWYWw5ICAgICAgICAgICAgICAgICA7Ly8gdFZhbDggPSB0VmFsOCArIHRWYWw5Ci0gICAgICAgIEFERCAgICAgIHRWYWwxMCwgdFZhbDEwLCB0VmFsMTEgICAgICAgICAgICAgIDsvLyB0VmFsMTA9IHRWYWwxMCArIHRWYWwxMQotICAgICAgICBBREQgICAgICB0VmFsNywgdFZhbDgsIHRWYWwxMCAgICAgICAgICAgICAgICA7Ly8gdFZhbDcgPSB0VmFsOCArIHRWYWwxMAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIE1fTERSQiAgIHRWYWw4LCBbcFNyY0xlZnRdLCAgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsOCA9IHBTcmNMZWZ0WzBdCi0gICAgICAgIE1fTERSQiAgIHRWYWw5LCBbcFNyY0xlZnQyXSwgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsOSA9IHBTcmNMZWZ0WzFdCi0gICAgICAgIE1fTERSQiAgIHRWYWwxMCwgW3BTcmNMZWZ0XSwgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsMTA9IHBTcmNMZWZ0WzJdCi0gICAgICAgIE1fTERSQiAgIHRWYWwxMSwgW3BTcmNMZWZ0Ml0sK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsMTE9IHBTcmNMZWZ0WzNdCi0gICAgICAgIEFERCAgICAgIHN1bSwgc3VtLCB0VmFsNyAgICAgICAgICAgICAgICAgICAgIDsvLyBzdW0gPSBzdW0gKyB0VmFsNwotICAgICAgICBBREQgICAgICB0VmFsOCwgdFZhbDgsIHRWYWw5ICAgICAgICAgICAgICAgICA7Ly8gdFZhbDggPSB0VmFsOCArIHRWYWw5Ci0gICAgICAgIEFERCAgICAgIHRWYWwxMCwgdFZhbDEwLCB0VmFsMTEgICAgICAgICAgICAgIDsvLyB0VmFsMTA9IHRWYWwxMCArIHRWYWwxMQotICAgICAgICBBREQgICAgICB0VmFsNywgdFZhbDgsIHRWYWwxMCAgICAgICAgICAgICAgICA7Ly8gdFZhbDcgPSB0VmFsOCArIHRWYWwxMAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIE1fTERSQiAgIHRWYWw4LCBbcFNyY0xlZnRdLCAgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsOCA9IHBTcmNMZWZ0WzBdCi0gICAgICAgIE1fTERSQiAgIHRWYWw5LCBbcFNyY0xlZnQyXSwgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsOSA9IHBTcmNMZWZ0WzFdCi0gICAgICAgIE1fTERSQiAgIHRWYWwxMCwgW3BTcmNMZWZ0XSwgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsMTA9IHBTcmNMZWZ0WzJdCi0gICAgICAgIE1fTERSQiAgIHRWYWwxMSwgW3BTcmNMZWZ0Ml0sK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsMTE9IHBTcmNMZWZ0WzNdCi0gICAgICAgIEFERCAgICAgIHN1bSwgc3VtLCB0VmFsNyAgICAgICAgICAgICAgICAgICAgIDsvLyBzdW0gPSBzdW0gKyB0VmFsNwotICAgICAgICBBREQgICAgICB0VmFsOCwgdFZhbDgsIHRWYWw5ICAgICAgICAgICAgICAgICA7Ly8gdFZhbDggPSB0VmFsOCArIHRWYWw5Ci0gICAgICAgIEFERCAgICAgIHRWYWwxMCwgdFZhbDEwLCB0VmFsMTEgICAgICAgICAgICAgIDsvLyB0VmFsMTA9IHRWYWwxMCArIHRWYWwxMQotICAgICAgICBBREQgICAgICB0VmFsNywgdFZhbDgsIHRWYWwxMCAgICAgICAgICAgICAgICA7Ly8gdFZhbDcgPSB0VmFsOCArIHRWYWwxMAotICAgICAgICBBREQgICAgICBzdW0sIHN1bSwgdFZhbDcgICAgICAgICAgICAgICAgICAgICA7Ly8gc3VtID0gc3VtICsgdFZhbDcKLQotVFNUX0NPVU5UICAgICAgICAKLSAgICAgICAgQ01QICAgICAgY291bnQsICMwICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGlmKGNvdW50ID09IDApCi0gICAgICAgIE1PVkVRICAgIHN1bSwgIzEyOCAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdW0gPSAxMjggaWYoY291bnQgPT0gMCkKLSAgICAgICAgQkVRICAgICAgVFNUX0NPVU5UMCAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGlmKGNvdW50ID09IDApCi0gICAgICAgIENNUCAgICAgIGNvdW50LCAjMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBpZihjb3VudCA9PSAxKQotICAgICAgICBBRERFUSAgICBzdW0sIHN1bSwgIzggICAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3VtICs9IDggaWYoY291bnQgPT0gMSkKLSAgICAgICAgQURETkUgICAgc3VtLCBzdW0sIHRWYWwyICAgICAgICAgICAgICAgICAgICAgOy8vIHN1bSA9IHN1bWxlZnQgKyBzdW11cHBlcgotICAgICAgICBBRERORSAgICBzdW0sIHN1bSwgIzE2ICAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3VtICs9IDE2IGlmKGNvdW50ID09IDIpCi0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQotICAgICAgICAKLSAgICAgICAgVVhUSCAgICAgc3VtLCBzdW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHN1bSBvbmx5IGJ5dGUgcmVzdCBjbGVhcmVkCi0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQotICAgICAgICAKLSAgICAgICAgTFNSRVEgICAgc3VtLCBzdW0sICM0ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHN1bSA+PiA0IGlmKGNvdW50ID09IDEpCi0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQotICAgICAgICAKLSAgICAgICAgTFNSTkUgICAgc3VtLCBzdW0sICM1ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHN1bSA+PiA1IGlmKGNvdW50ID09IDIpCi0KLVRTVF9DT1VOVDAKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCi0gICAgICAgIAotICAgICAgICBPUlIgICAgICBzdW0sIHN1bSwgc3VtLCBMU0wgIzggICAgICAgICAgICAgICA7Ly8gc3VtIHJlcGxpY2F0ZWQgaW4gdHdvIGhhbGZ3b3JkCi0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQotICAgICAgICAKLSAgICAgICAgT1JSICAgICAgdFZhbDYsIHN1bSwgc3VtLCBMU0wgIzE2ICAgICAgICAgICAgOy8vIHN1bSAgcmVwbGljYXRlZCBpbiBhbGwgYnl0ZXMKLSAgICAgICAgQ1BZICAgICAgdFZhbDcsIHRWYWw2ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWwxID0gdFZhbDAKLSAgICAgICAgQ1BZICAgICAgdFZhbDgsIHRWYWw2ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWwyID0gdFZhbDAKLSAgICAgICAgQ1BZICAgICAgdFZhbDksIHRWYWw2ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWwzID0gdFZhbDAKLSAgICAgICAgQUREICAgICAgZHN0U3RlcHgyLCBkc3RTdGVwLCBkc3RTdGVwICAgICAgICAgOy8vIGRvdWJsZSBkc3RTdGVwCi0gICAgICAgIEFERCAgICAgIHBEc3QyLCBwRHN0LCBkc3RTdGVwICAgICAgICAgICAgICAgIDsvLyBwRHN0Mi0gcERzdCBhZHZhbmNlZCBieSBkc3RTdGVwCi0gICAgICAgIE1PViAgICAgIHksICNCTEtfU0laRSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBPdXRlciBMb29wIENvdW50Ci0gICAgICAgIAotTE9PUF9EQyAgICAgICAgCi0gICAgICAgIFNUTSAgICAgIHBEc3QsIHt0VmFsNix0VmFsNyx0VmFsOCx0VmFsOX0gICAgIDsvLyBwRHN0WzAgdG8gMTVdID0gdFZhbCA2IHRvIDkKLSAgICAgICAgU1VCUyAgICAgeSwgeSwgIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHktLQotICAgICAgICBBREQgICAgICBwRHN0LCBwRHN0LCBkc3RTdGVweDIgICAgICAgICAgICAgICA7Ly8gcERzdCBhZHZhbmNlZCBieSBkc3RTdGVwCi0gICAgICAgIFNUTSAgICAgIHBEc3QyLCB7dFZhbDYsdFZhbDcsdFZhbDgsdFZhbDl9ICAgIDsvLyBwRHN0MlsxNiB0byAzMV0gPSB0VmFsIDYgdG8gOQotICAgICAgICBBREQgICAgICBwRHN0MiwgcERzdDIsIGRzdFN0ZXB4MiAgICAgICAgICAgICA7Ly8gcERzdCBhZHZhbmNlZCBieSBkc3RTdGVwCi0gICAgICAgIEJORSAgICAgIExPT1BfREMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb29wIGZvciA4IHRpbWVzCi0gICAgICAgIAotICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCi0gICAgICAgIE1fRVhJVAotCi1PTVhfVkNfMTZYMTZfUExBTkUKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0zCi0gICAgICAgIFJTQiAgICAgIHRWYWwxNCwgbGVmdFN0ZXAsIGxlZnRTdGVwLCBMU0wgIzQgIDsvLyB0VmFsMTQgPSAxNSpsZWZ0U3RlcAotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTIKLSAgICAgICAgTERSQiAgICAgdFZhbDEwLCBbcFNyY0xlZnQsICB0VmFsMTRdICAgICAgICAgOy8vIHRWYWwxMCA9IHBTcmNMZWZ0WzE1KmxlZnRTdGVwXQotICAgICAgICBMRFJCICAgICB0VmFsMTEsIFtwU3JjQWJvdmVMZWZ0XSAgICAgICAgICAgICA7Ly8gdFZhbDExID0gcFNyY0Fib3ZlTGVmdFswXQotICAgICAgICBMRFJCICAgICB0VmFsMTIsIFtwU3JjQWJvdmUsICMxNV0KLQotICAgICAgICBBREQgICAgICB0VmFsMiwgIHRWYWwxMiwgIHRWYWwxMCAgICAgICAgICAgICA7Ly8gdFZhbDIgID0gcFNyY0Fib3ZlWzE1XSArIHBTcmNMZWZ0WzE1KmxlZnRTdGVwXQotICAgICAgICBTVUIgICAgICB0VmFsMTAsIHRWYWwxMCwgIHRWYWwxMSAgICAgICAgICAgICA7Ly8gdFZhbDEwID0gVjAgPSBwU3JjTGVmdFsxNSpsZWZ0U3RlcF0gLSBwU3JjQWJvdmVMZWZ0WzBdCi0gICAgICAgIFNVQiAgICAgIHRWYWwxMSwgdFZhbDEyLCAgdFZhbDExICAgICAgICAgICAgIDsvLyB0VmFsMTEgPSBIMCA9IHBTcmNBYm92ZVsxNV0gLSBwU3JjQWJvdmVMZWZ0WzBdCi0gICAgICAgIE1PViAgICAgIHRWYWwyLCAgdFZhbDIsICAgTFNMICM0ICAgICAgICAgICAgIDsvLyB0VmFsMiAgPSBhID0gMTYgKiAocFNyY0Fib3ZlWzE1XSArIHBTcmNMZWZ0WzE1KmxlZnRTdGVwXSkKLQotICAgICAgICBNT1YgICAgIHRWYWwxMSwgdFZhbDExLCBMU0wgIzMgICAgICAgICAgICAgIDsvLyA4KlsxNV0tWy0xXQotICAgICAgICBMRFJCICAgIHRWYWw2LCBbcFNyY0Fib3ZlLCAjMF0KLSAgICAgICAgTERSQiAgICB0VmFsNywgW3BTcmNBYm92ZSwgIzE0XQotICAgICAgICBTVUIgICAgIHRWYWw4LCB0VmFsNywgdFZhbDYKLSAgICAgICAgUlNCICAgICB0VmFsOCwgdFZhbDgsIHRWYWw4LCBMU0wgIzMgICAgICAgICA7Ly8gNypbMTRdLVswXQotICAgICAgICBBREQgICAgIHRWYWwxMSwgdFZhbDExLCB0VmFsOAotICAgICAgICBMRFJCICAgIHRWYWw2LCBbcFNyY0Fib3ZlLCAjMV0KLSAgICAgICAgTERSQiAgICB0VmFsNywgW3BTcmNBYm92ZSwgIzEzXQotICAgICAgICBTVUIgICAgIHRWYWw4LCB0VmFsNywgdFZhbDYKLSAgICAgICAgQUREICAgICB0VmFsOCwgdFZhbDgsIHRWYWw4Ci0gICAgICAgIEFERCAgICAgdFZhbDgsIHRWYWw4LCB0VmFsOCwgTFNMICMxICAgICAgICAgOy8vIDYqWzEzXS1bMV0KLSAgICAgICAgQUREICAgICB0VmFsMTEsIHRWYWwxMSwgdFZhbDgKLSAgICAgICAgTERSQiAgICB0VmFsNiwgW3BTcmNBYm92ZSwgIzJdCi0gICAgICAgIExEUkIgICAgdFZhbDcsIFtwU3JjQWJvdmUsICMxMl0KLSAgICAgICAgU1VCICAgICB0VmFsOCwgdFZhbDcsIHRWYWw2Ci0gICAgICAgIEFERCAgICAgdFZhbDgsIHRWYWw4LCB0VmFsOCwgTFNMICMyICAgICAgICAgOy8vIDUqWzEyXS1bMl0KLSAgICAgICAgQUREICAgICB0VmFsMTEsIHRWYWwxMSwgdFZhbDgKLSAgICAgICAgTERSQiAgICB0VmFsNiwgW3BTcmNBYm92ZSwgIzNdCi0gICAgICAgIExEUkIgICAgdFZhbDcsIFtwU3JjQWJvdmUsICMxMV0KLSAgICAgICAgU1VCICAgICB0VmFsOCwgdFZhbDcsIHRWYWw2Ci0gICAgICAgIEFERCAgICAgdFZhbDExLCB0VmFsMTEsIHRWYWw4LCBMU0wgIzIgICAgICAgOy8vICsgNCpbMTFdLVszXQotICAgICAgICBMRFJCICAgIHRWYWw2LCBbcFNyY0Fib3ZlLCAjNF0KLSAgICAgICAgTERSQiAgICB0VmFsNywgW3BTcmNBYm92ZSwgIzEwXQotICAgICAgICBTVUIgICAgIHRWYWw4LCB0VmFsNywgdFZhbDYKLSAgICAgICAgQUREICAgICB0VmFsOCwgdFZhbDgsIHRWYWw4LCBMU0wgIzEgICAgICAgICA7Ly8gMypbMTBdLVs0XQotICAgICAgICBBREQgICAgIHRWYWwxMSwgdFZhbDExLCB0VmFsOAotICAgICAgICBMRFJCICAgIHRWYWw2LCBbcFNyY0Fib3ZlLCAjNV0KLSAgICAgICAgTERSQiAgICB0VmFsNywgW3BTcmNBYm92ZSwgIzldCi0gICAgICAgIFNVQiAgICAgdFZhbDgsIHRWYWw3LCB0VmFsNgotICAgICAgICBBREQgICAgIHRWYWwxMSwgdFZhbDExLCB0VmFsOCwgTFNMICMxICAgICAgIDsvLyArIDIqWzldLVs1XQotICAgICAgICBMRFJCICAgIHRWYWw2LCBbcFNyY0Fib3ZlLCAjNl0KLSAgICAgICAgTERSQiAgICB0VmFsNywgW3BTcmNBYm92ZSwgIzhdCi0gICAgICAgIFNVQiAgICAgdFZhbDgsIHRWYWw3LCB0VmFsNiAgICAgICAgICAgICAgICAgOy8vIDEqWzhdLVs2XQotICAgICAgICBBREQgICAgIHRWYWw3LCB0VmFsMTEsIHRWYWw4Ci0KLSAgICAgICAgQUREICAgICAgdFZhbDIsICB0VmFsMiwgICAjMTYgICAgICAgICAgICAgICAgOy8vIHRWYWwyICA9IGEgKyAxNgotICAgICAgICBNT1YgICAgICB0VmFsMSwgIHBTcmNMZWZ0ICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDQgID0gcFNyY0xlZnQKLSAgICAgICAgU1VCICAgICAgdFZhbDksICB0VmFsMTQsICAgbGVmdFN0ZXAgICAgICAgICAgOy8vIHRWYWw5ICA9IDE0KmxlZnRTdGVwCi0gICAgICAgIEFERCAgICAgIHRWYWw5LCAgcFNyY0xlZnQsIHRWYWw5ICAgICAgICAgICAgIDsvLyB0VmFsOSAgPSBwU3JjTGVmdCArIDE0KmxlZnRTdGVwCi0gICAgICAgIAotICAgICAgICBNX0xEUkIgICB0VmFsOCwgIFt0VmFsOV0sIC1sZWZ0U3RlcCAgICAgICAgICA7Ly8gdFZhbDggID0gcFNyY0xlZnRbMTQqbGVmdFN0ZXBdCi0gICAgICAgIE1fTERSQiAgIHRWYWwxMSwgW3RWYWwxXSwgK2xlZnRTdGVwICAgICAgICAgIDsvLyB0VmFsMTEgPSBwU3JjTGVmdFswXQotICAgICAgICBBREQgICAgICB0VmFsNywgIHRWYWw3LCAgdFZhbDcsICBMU0wgIzIgICAgICA7Ly8gdFZhbDcgID0gNSAqIEgKLSAgICAgICAgQUREICAgICAgdFZhbDcsICB0VmFsNywgICMzMiAgICAgICAgICAgICAgICAgOy8vIHRWYWw3ICA9IDUgKiBIICsgMzIKLSAgICAgICAgU1VCICAgICAgdFZhbDgsICB0VmFsOCwgIHRWYWwxMSAgICAgICAgICAgICAgOy8vIHRWYWw4ICA9IHBTcmNMZWZ0WzE0KmxlZnRTdGVwXSAtIHBTcmNMZWZ0WzBdCi0gICAgICAgIEFTUiAgICAgIHRWYWwxMiwgdFZhbDcsICAjNiAgICAgICAgICAgICAgICAgIDsvLyB0VmFsMTIgPSBiID0gKDUgKiBIICsgMzIpID4+IDYKLSAgICAgICAgCi0gICAgICAgIFJTQiAgICAgIHRWYWw4LCAgdFZhbDgsICB0VmFsOCwgIExTTCAjMyAgICAgIDsvLyB0VmFsOCAgPSBWMSA9IDcqIChwU3JjTGVmdFsxNCpsZWZ0U3RlcF0tcFNyY0xlZnRbMF0pCi0gICAgICAgIEFERCAgICAgIHRWYWw2LCAgdFZhbDgsICB0VmFsMTAsIExTTCAjMyAgICAgIDsvLyB0VmFsNiAgPSBWID0gVjAgK1YxCi0gICAgICAgIE1fTERSQiAgIHRWYWw4LCAgW3RWYWw5XSwgLWxlZnRTdGVwICAgICAgICAgIDsvLyB0VmFsOCAgPSBwU3JjTGVmdFsxMypsZWZ0U3RlcF0KLSAgICAgICAgTV9MRFJCICAgdFZhbDEwLCBbdFZhbDFdLCArbGVmdFN0ZXAgICAgICAgICAgOy8vIHRWYWwxMCA9IHBTcmNMZWZ0W2xlZnRTdGVwXQotICAgICAgICBSU0IgICAgICB0VmFsNywgIHRWYWwxMiwgIHRWYWwxMiwgIExTTCAjMyAgICA7Ly8gdFZhbDcgID0gNypiCi0gICAgICAgIFNVQiAgICAgIHRWYWwyLCAgdFZhbDIsICAgdFZhbDcgICAgICAgICAgICAgIDsvLyB0VmFsMiAgPSBhICsgMTYgLSA3KmIKLSAgICAgICAgU1VCICAgICAgdFZhbDcsICB0VmFsOCwgICB0VmFsMTAgICAgICAgICAgICAgOy8vIHRWYWw3ICA9IHBTcmNMZWZ0WzEzKmxlZnRTdGVwXSAtIHBTcmNMZWZ0W2xlZnRTdGVwXQotICAgICAgICBNX0xEUkIgICB0VmFsOCwgIFt0VmFsOV0sIC1sZWZ0U3RlcCAgICAgICAgICA7Ly8gdFZhbDggID0gcFNyY0xlZnRbMTIqbFNdCi0gICAgICAgIEFERCAgICAgIHRWYWw3LCAgdFZhbDcsICAgdFZhbDcgICAgICAgICAgICAgIDsvLyB0VmFsNyAgPSAyICogKHBTcmNMZWZ0WzEzKmxlZnRTdGVwXSAtIHBTcmNMZWZ0W2xlZnRTdGVwXSkKLSAgICAgICAgTV9MRFJCICAgdFZhbDEwLCBbdFZhbDFdLCArbGVmdFN0ZXAgICAgICAgICAgOy8vIHRWYWwxMCA9IHBTcmNMZWZ0WzIqbGVmdFN0ZXBdICAgICAgICAKLSAgICAgICAgQUREICAgICAgdFZhbDcsICB0VmFsNywgICB0VmFsNywgIExTTCAjMSAgICAgOy8vIHRWYWw3ICA9IDYgKiAocFNyY0xlZnRbMTMqbGVmdFN0ZXBdIC0gcFNyY0xlZnRbbGVmdFN0ZXBdKQotICAgICAgICBBREQgICAgICB0VmFsNiwgIHRWYWw2LCAgIHRWYWw3ICAgICAgICAgICAgICA7Ly8gdFZhbDYgID0gViA9IFYgKyBWMgotICAgICAgICBTVUIgICAgICB0VmFsNywgIHRWYWw4LCAgIHRWYWwxMCAgICAgICAgICAgICA7Ly8gdFZhbDcgID0gcFNyY0xlZnRbMTIqbGVmdFN0ZXBdIC0gcFNyY0xlZnRbMipsZWZ0U3RlcF0KLSAgICAgICAgTV9MRFJCICAgdFZhbDgsICBbdFZhbDldLCAtbGVmdFN0ZXAgICAgICAgICAgOy8vIHRWYWw4ICA9IHBTcmNMZWZ0WzExKmxlZnRTdGVwXQotICAgICAgICBNX0xEUkIgICB0VmFsMTAsIFt0VmFsMV0sICtsZWZ0U3RlcCAgICAgICAgICA7Ly8gdFZhbDEwID0gcFNyY0xlZnRbMypsZWZ0U3RlcF0KLSAgICAgICAgQUREICAgICAgdFZhbDcsICB0VmFsNywgICB0VmFsNywgIExTTCAjMiAgICAgOy8vIHRWYWw3ICA9IDUgKiAocFNyY0xlZnRbMTIqbGVmdFN0ZXBdIC0gcFNyY0xlZnRbMipsZWZ0U3RlcF0pCi0gICAgICAgIEFERCAgICAgIHRWYWw2LCAgdFZhbDYsICAgdFZhbDcgICAgICAgICAgICAgIDsvLyB0VmFsNiAgPSBWID0gViArIFYzCi0gICAgICAgIFNVQiAgICAgIHRWYWw3LCAgdFZhbDgsICAgdFZhbDEwICAgICAgICAgICAgIDsvLyB0VmFsNyAgPSBwU3JjTGVmdFsxMSpsZWZ0U3RlcF0gLSBwU3JjTGVmdFszKmxlZnRTdGVwXQotICAgICAgICBNX0xEUkIgICB0VmFsOCwgIFt0VmFsOV0sIC1sZWZ0U3RlcCAgICAgICAgICA7Ly8gdFZhbDggID0gcFNyY0xlZnRbMTAqbGVmdFN0ZXBdCi0gICAgICAgIE1fTERSQiAgIHRWYWwxMCwgW3RWYWwxXSwgK2xlZnRTdGVwICAgICAgICAgIDsvLyB0VmFsMTAgPSBwU3JjTGVmdFs0KmxlZnRTdGVwXQotICAgICAgICBBREQgICAgICB0VmFsNiwgIHRWYWw2LCAgIHRWYWw3LCAgTFNMICMyICAgICA7Ly8gdFZhbDYgID0gViA9IFYgKyBWNAotICAgICAgICBTVUIgICAgICBkc3RTdGVwLCBkc3RTdGVwLCAjMTYgICAgICAgICAgICAgICA7Ly8gdFZhbDUgID0gZHN0U3RlcCAtIDE2Ci0gICAgICAgIFNVQiAgICAgIHRWYWw3LCAgdFZhbDgsICAgdFZhbDEwICAgICAgICAgICAgIDsvLyB0VmFsNyAgPSBwU3JjTGVmdFsxMCpsZWZ0U3RlcF0gLSBwU3JjTGVmdFs0KmxlZnRTdGVwXQotICAgICAgICBNX0xEUkIgICB0VmFsOCwgIFt0VmFsOV0sIC1sZWZ0U3RlcCAgICAgICAgICA7Ly8gdFZhbDggID0gcFNyY0xlZnRbOSpsZWZ0U3RlcF0KLSAgICAgICAgTV9MRFJCICAgdFZhbDEwLCBbdFZhbDFdLCArbGVmdFN0ZXAgICAgICAgICAgOy8vIHRWYWwxMCA9IHBTcmNMZWZ0WzUqbGVmdFN0ZXBdCi0gICAgICAgIEFERCAgICAgIHRWYWw3LCAgdFZhbDcsICAgdFZhbDcsICBMU0wgIzEgICAgIDsvLyB0VmFsNyAgPSAzICogKHBTcmNMZWZ0WzEwKmxlZnRTdGVwXSAtIHBTcmNMZWZ0WzQqbGVmdFN0ZXBdKQotICAgICAgICBBREQgICAgICB0VmFsNiwgIHRWYWw2LCAgIHRWYWw3ICAgICAgICAgICAgICA7Ly8gdFZhbDYgID0gViA9IFYgKyBWNQotICAgICAgICBTVUIgICAgICB0VmFsNywgIHRWYWw4LCAgIHRWYWwxMCAgICAgICAgICAgICA7Ly8gdFZhbDcgID0gcFNyY0xlZnRbOSpsZWZ0U3RlcF0gLSBwU3JjTGVmdFs1KmxlZnRTdGVwXQotICAgICAgICBNX0xEUkIgICB0VmFsOCwgIFt0VmFsOV0sIC1sZWZ0U3RlcCAgICAgICAgICA7Ly8gdFZhbDggID0gcFNyY0xlZnRbOCpsZWZ0U3RlcF0KLSAgICAgICAgTV9MRFJCICAgdFZhbDEwLCBbdFZhbDFdLCArbGVmdFN0ZXAgICAgICAgICAgOy8vIHRWYWwxMCA9IHBTcmNMZWZ0WzYqbGVmdFN0ZXBdCi0gICAgICAgIEFERCAgICAgIHRWYWw2LCAgdFZhbDYsICAgdFZhbDcsICBMU0wgIzEgICAgIDsvLyB0VmFsNiAgPSBWID0gViArIFY2Ci0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQotICAgICAgICBTVUIgICAgICB0VmFsNywgIHRWYWw4LCAgIHRWYWwxMCAgICAgICAgICAgICA7Ly8gdFZhbDcgID0gcFNyY0xlZnRbOCpsZWZ0U3RlcF0gLSBwU3JjTGVmdFs2KmxlZnRTdGVwXQotICAgICAgICBBREQgICAgICB0VmFsNiwgIHRWYWw2LCAgIHRWYWw3ICAgICAgICAgICAgICA7Ly8gdFZhbDYgID0gViA9IFYgKyBWNwotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKLSAgICAgICAgQUREICAgICAgdFZhbDYsICB0VmFsNiwgICB0VmFsNiwgIExTTCAjMiAgICAgOy8vIHRWYWw2ICA9IDUqVgotICAgICAgICBBREQgICAgICB0VmFsNiwgIHRWYWw2LCAgICMzMiAgICAgICAgICAgICAgICA7Ly8gdFZhbDYgID0gNSpWICsgMzIKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCi0gICAgICAgIEFTUiAgICAgIHRWYWwxNCwgdFZhbDYsICAgIzYgICAgICAgICAgICAgICAgIDsvLyB0VmFsMTQgPSBjID0gKDUqViArIDMyKT4+NgotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKLSAgICAgICAgUlNCICAgICAgdFZhbDYsICB0VmFsMTQsICB0VmFsMTQsIExTTCAjMyAgICAgOy8vIHRWYWw2ICA9IDcqYwotICAgICAgICBVWFRIICAgICB0VmFsMTQsIHRWYWwxNCAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDE0ID0gQ2xlYXJlZCB0aGUgdXBwZXIgaGFsZiB3b3JkCi0gICAgICAgIEFERCAgICAgIHRWYWwxMCwgdFZhbDEyLCAgdFZhbDEyICAgICAgICAgICAgIDsvLyB0VmFsMTAgPSAyKmIKLSAgICAgICAgT1JSICAgICAgdFZhbDE0LCB0VmFsMTQsICB0VmFsMTQsIExTTCAjMTYgICAgOy8vIHRWYWwxNCA9IHtjICAsICBjfQotICAgICAgICBTVUIgICAgICB0VmFsNiwgIHRWYWwyLCAgIHRWYWw2ICAgICAgICAgICAgICA7Ly8gdFZhbDYgID0gZCA9IGEgLSA3KmIgLSA3KmMgKyAxNgotICAgICAgICBBREQgICAgICB0VmFsMSwgIHRWYWw2LCAgIHRWYWwxMCAgICAgICAgICAgICA7Ly8gdFZhbDEgID0gcHAyID0gZCArIDIqYgotICAgICAgICBBREQgICAgICB0VmFsMTAsIHRWYWwxMCwgIHRWYWwxMiAgICAgICAgICAgICA7Ly8gdFZhbDEwID0zKmIKLSAgICAgICAgT1JSICAgICAgdFZhbDAsICB0VmFsNiwgICB0VmFsMSwgIExTTCAjMTYgICAgOy8vIHR2YWwwICA9IHAycDAgICA9IHBhY2sge3AyLCBwMH0KLSAgICAgICAgVVhUSCAgICAgdFZhbDEyLCB0VmFsMTIgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWwxMiA9IENsZWFyZWQgdGhlIHVwcGVyIGhhbGYgd29yZAotICAgICAgICBVWFRIICAgICB0VmFsMTAsIHRWYWwxMCAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDEyID0gQ2xlYXJlZCB0aGUgdXBwZXIgaGFsZiB3b3JkCi0gICAgICAgIE9SUiAgICAgIHRWYWwxMiwgdFZhbDEyLCAgdFZhbDEyLCBMU0wgIzE2ICAgIDsvLyB0VmFsMTIgPSB7YiAgLCAgYn0KLSAgICAgICAgT1JSICAgICAgdFZhbDEwLCB0VmFsMTAsICB0VmFsMTAsIExTTCAjMTYgICAgOy8vIHRWYWwxMCA9IHszYiAsIDNifQotICAgICAgICBTQUREMTYgICB0VmFsMSwgIHRWYWwwLCAgIHRWYWwxMiAgICAgICAgICAgICA7Ly8gdFZhbDEgID0gcDNwMSAgID0gcDJwMCAgICsge2IsYn0KLSAgICAgICAgU0FERDE2ICAgdFZhbDIsICB0VmFsMSwgICB0VmFsMTAgICAgICAgICAgICAgOy8vIHRWYWwyICA9IHA2cDQgICA9IHAzcDEgICArIHszYiwzYn0KLSAgICAgICAgU0FERDE2ICAgdFZhbDQsICB0VmFsMiwgICB0VmFsMTIgICAgICAgICAgICAgOy8vIHRWYWw0ICA9IHA3cDUgICA9IHA2cDQgICArIHtiLGJ9Ci0gICAgICAgIFNBREQxNiAgIHRWYWw2LCAgdFZhbDQsICAgdFZhbDEwICAgICAgICAgICAgIDsvLyB0VmFsNiAgPSBwMTBwOCAgPSBwN3A1ICAgKyB7M2IsM2J9Ci0gICAgICAgIFNBREQxNiAgIHRWYWw3LCAgdFZhbDYsICAgdFZhbDEyICAgICAgICAgICAgIDsvLyB0VmFsNyAgPSBwMTFwOSAgPSBwMTBwOCAgKyB7YixifQotICAgICAgICBTQUREMTYgICB0VmFsOCwgIHRWYWw3LCAgIHRWYWwxMCAgICAgICAgICAgICA7Ly8gdFZhbDggID0gcDE0cDEyID0gcDExcDkgICsgezNiLDNifQotICAgICAgICBTQUREMTYgICB0VmFsOSwgIHRWYWw4LCAgIHRWYWwxMiAgICAgICAgICAgICA7Ly8gdFZhbDkgID0gcDE1cDEzID0gcDE0cDEyICsge2IsYn0KLSAgICAgICAgTERSICAgICAgcjB4MDBGRjAwRkYsICAgICA9TUFTS19DT05TVCAgICAgICAgOy8vIHIweDAwRkYwMEZGID0gMHgwMEZGMDBGRgotICAgICAgICAKLUxPT1BfUExBTkUgICAgICAgIAotCi0gICAgICAgIFVTQVQxNiAgIHRlbXAyLCAjMTMsIHAzcDEKLSAgICAgICAgVVNBVDE2ICAgdGVtcDEsICMxMywgcDJwMAotICAgICAgICBTQUREMTYgICBwM3AxLCAgIHAzcDEsICAgYyAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFNBREQxNiAgIHAycDAsICAgcDJwMCwgICBjICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgQU5EICAgICAgdGVtcDIsIHIweDAwRkYwMEZGLCB0ZW1wMiwgQVNSICM1Ci0gICAgICAgIEFORCAgICAgIHRlbXAxLCByMHgwMEZGMDBGRiwgdGVtcDEsIEFTUiAjNQotICAgICAgICBPUlIgICAgICB0ZW1wMSwgdGVtcDEsIHRlbXAyLCBMU0wgIzgKLSAgICAgICAgU1RSICAgICAgdGVtcDEsIFtwRHN0XSwgIzQKLSAgICAgICAgCi0gICAgICAgIFVTQVQxNiAgIHRlbXAyLCAjMTMsIHA3cDUKLSAgICAgICAgVVNBVDE2ICAgdGVtcDEsICMxMywgcDZwNAotICAgICAgICBTQUREMTYgICBwN3A1LCAgIHA3cDUsICAgYyAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFNBREQxNiAgIHA2cDQsICAgcDZwNCwgICBjICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgQU5EICAgICAgdGVtcDIsIHIweDAwRkYwMEZGLCB0ZW1wMiwgQVNSICM1Ci0gICAgICAgIEFORCAgICAgIHRlbXAxLCByMHgwMEZGMDBGRiwgdGVtcDEsIEFTUiAjNQotICAgICAgICBPUlIgICAgICB0ZW1wMSwgdGVtcDEsIHRlbXAyLCBMU0wgIzgKLSAgICAgICAgU1RSICAgICAgdGVtcDEsIFtwRHN0XSwgIzQKLSAgICAgICAgCi0gICAgICAgIFVTQVQxNiAgIHRlbXAyLCAjMTMsIHAxMXA5Ci0gICAgICAgIFVTQVQxNiAgIHRlbXAxLCAjMTMsIHAxMHA4Ci0gICAgICAgIFNBREQxNiAgIHAxMXA5LCAgcDExcDksICBjICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgU0FERDE2ICAgcDEwcDgsICBwMTBwOCwgIGMgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBBTkQgICAgICB0ZW1wMiwgcjB4MDBGRjAwRkYsIHRlbXAyLCBBU1IgIzUKLSAgICAgICAgQU5EICAgICAgdGVtcDEsIHIweDAwRkYwMEZGLCB0ZW1wMSwgQVNSICM1Ci0gICAgICAgIE9SUiAgICAgIHRlbXAxLCB0ZW1wMSwgdGVtcDIsIExTTCAjOAotICAgICAgICBTVFIgICAgICB0ZW1wMSwgW3BEc3RdLCAjNAotICAgICAgICAKLSAgICAgICAgVVNBVDE2ICAgdGVtcDIsICMxMywgcDE1cDEzCi0gICAgICAgIFVTQVQxNiAgIHRlbXAxLCAjMTMsIHAxNHAxMgotICAgICAgICBTQUREMTYgICBwMTVwMTMsIHAxNXAxMywgYyAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFNBREQxNiAgIHAxNHAxMiwgcDE0cDEyLCBjICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgQU5EICAgICAgdGVtcDIsIHIweDAwRkYwMEZGLCB0ZW1wMiwgQVNSICM1Ci0gICAgICAgIEFORCAgICAgIHRlbXAxLCByMHgwMEZGMDBGRiwgdGVtcDEsIEFTUiAjNQotICAgICAgICBPUlIgICAgICB0ZW1wMSwgdGVtcDEsIHRlbXAyLCBMU0wgIzgKLSAgICAgICAgU1RSICAgICAgdGVtcDEsIFtwRHN0XSwgIzQKLSAgICAgICAgCi0gICAgICAgIEFERFMgICAgIHIweDAwRkYwMEZGLCByMHgwMEZGMDBGRiwgIzE8PDI4ICAgICA7Ly8gTG9vcCBjb3VudGVyIHZhbHVlIGluIHRvcCA0IGJpdHMKLSAgICAgICAgCi0gICAgICAgIEFERCAgICAgIHBEc3QsIHBEc3QsIGRzdFN0ZXAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICBCQ0MgICAgICBMT09QX1BMQU5FICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvb3AgZm9yIDE2IHRpbWVzCi0gICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgTV9FTkQKLSAgICAgICAgCi0gICAgICAgIEVORElGIDsvLyBBUk0xMTM2SlMKLQotICAgICAgICAgICAgCi0gICAgICAgIEVORAotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2IGVuZHMKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDRfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDRfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTIxMzlmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0X3MucworKysgL2Rldi9udWxsCkBAIC0xLDU4MSArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0X3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDk2NDEKLTsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLSAgICAgICAgCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgICAgCi07Ly8gRGVmaW5lIHRoZSBwcm9jZXNzb3IgdmFyaWFudHMgc3VwcG9ydGVkIGJ5IHRoaXMgZmlsZQotICAgICAgICAgCi0gICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotICAgICAgICAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBUaGlzIHRhYmxlIGZvciBpbXBsZW1lbnRpbmcgc3dpdGNoIGNhc2Ugb2YgQyBpbiBhc20gYnkKLTsvLyB0aGUgbWVodG9kIG9mIHR3byBsZXZlbHMgb2YgaW5kZXhpbmcuCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBNX1RBQkxFIGFybVZDTTRQMTBfcFN3aXRjaFRhYmxlNHg0Ci0gICAgRENEICBPTVhfVkNfNHg0X1ZFUlQsICAgICBPTVhfVkNfNHg0X0hPUiAKLSAgICBEQ0QgIE9NWF9WQ180eDRfREMsICAgICAgIE9NWF9WQ180eDRfRElBR19ETAotICAgIERDRCAgT01YX1ZDXzR4NF9ESUFHX0RSLCAgT01YX1ZDXzR4NF9WUgotICAgIERDRCAgT01YX1ZDXzR4NF9IRCwgICAgICAgT01YX1ZDXzR4NF9WTAotICAgIERDRCAgT01YX1ZDXzR4NF9IVSAgIAotICAgIAotICAgIElGIEFSTTExMzZKUwotICAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gQ29uc3RhbnRzCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCi1CTEtfU0laRSAgICAgICAgICAgICAgRVFVIDB4OAotTVVMX0NPTlNUMCAgICAgICAgICAgIEVRVSAweDAxMDEwMTAxCi1BRERfQ09OU1QxICAgICAgICAgICAgRVFVIDB4ODA4MDgwODAKLQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBTY3JhdGNoIHZhcmlhYmxlCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcmV0dXJuICAgICAgICAgIFJOIDAKLXBUYWJsZSAgICAgICAgICBSTiA5Ci1wYyAgICAgICAgICAgICAgUk4gMTUKLXIweDAxMDEwMTAxICAgICBSTiAxCi1yMHg4MDgwODA4MCAgICAgUk4gMAotCi10VmFsMCAgICAgICAgICAgUk4gMAotdFZhbDEgICAgICAgICAgIFJOIDEKLXRWYWwyICAgICAgICAgICBSTiAyCi10VmFsNCAgICAgICAgICAgUk4gNAotdFZhbDYgICAgICAgICAgIFJOIDYKLXRWYWw3ICAgICAgICAgICBSTiA3Ci10VmFsOCAgICAgICAgICAgUk4gOAotdFZhbDkgICAgICAgICAgIFJOIDkKLXRWYWwxMCAgICAgICAgICBSTiAxMAotdFZhbDExICAgICAgICAgIFJOIDExCi10VmFsMTIgICAgICAgICAgUk4gMTIKLXRWYWwxNCAgICAgICAgICBSTiAxNAotCi1PdXQwICAgICAgICAgICAgUk4gNgotT3V0MSAgICAgICAgICAgIFJOIDcKLU91dDIgICAgICAgICAgICBSTiA4Ci1PdXQzICAgICAgICAgICAgUk4gOQotCi1MZWZ0MCAgICAgICAgICAgUk4gNgotTGVmdDEgICAgICAgICAgIFJOIDcKLUxlZnQyICAgICAgICAgICBSTiA4Ci1MZWZ0MyAgICAgICAgICAgUk4gOQotCi1BYm92ZTAxMjMgICAgICAgUk4gMTIKLUFib3ZlNDU2NyAgICAgICBSTiAxNAotCi1BYm92ZUxlZnQgICAgICAgUk4gMTAKLQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycwotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBTcmNMZWZ0ICAgICAgICBSTiAwICAgIDsvLyBpbnB1dCBwb2ludGVyCi1wU3JjQWJvdmUgICAgICAgUk4gMSAgICA7Ly8gaW5wdXQgcG9pbnRlcgotcFNyY0Fib3ZlTGVmdCAgIFJOIDIgICAgOy8vIGlucHV0IHBvaW50ZXIKLXBEc3QgICAgICAgICAgICBSTiAzICAgIDsvLyBvdXRwdXQgcG9pbnRlcgotbGVmdFN0ZXAgICAgICAgIFJOIDQgICAgOy8vIGlucHV0IHZhcmlhYmxlCi1kc3RTdGVwICAgICAgICAgUk4gNSAgICA7Ly8gaW5wdXQgdmFyaWFibGUKLXByZWRNb2RlICAgICAgICBSTiA2ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQotYXZhaWxhYmlsaXR5ICAgIFJOIDcgICAgOy8vIGlucHV0IHZhcmlhYmxlCi0KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0IHN0YXJ0cwotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgCi0gICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQsIHIxMQotICAgICAgICAKLSAgICAgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKLSAgICAgICAgTV9BUkcgICAgTGVmdFN0ZXAsICAgICA0Ci0gICAgICAgIE1fQVJHICAgIERzdFN0ZXAsICAgICAgNAotICAgICAgICBNX0FSRyAgICBQcmVkTW9kZSwgICAgIDQKLSAgICAgICAgTV9BUkcgICAgQXZhaWxhYmlsaXR5LCA0Ci0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9NAotICAgICAgICAKLSAgICAgICAgTERSICAgICAgcFRhYmxlLD1hcm1WQ000UDEwX3BTd2l0Y2hUYWJsZTR4NCAgOy8vIExvYWQgaW5kZXggdGFibGUgZm9yIHN3aXRjaCBjYXNlCi0gICAgICAgIAotICAgICAgICA7Ly8gTG9hZCBhcmd1bWVudCBmcm9tIHRoZSBzdGFjawotICAgICAgICBNX0xEUiAgICBwcmVkTW9kZSwgUHJlZE1vZGUgICAgICAgICAgICAgICAgICA7Ly8gQXJnIHByZWRNb2RlIGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZyAKLSAgICAgICAgTV9MRFIgICAgbGVmdFN0ZXAsIExlZnRTdGVwICAgICAgICAgICAgICAgICAgOy8vIEFyZyBsZWZ0U3RlcCBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgCi0gICAgICAgIE1fTERSICAgIGRzdFN0ZXAsICBEc3RTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBBcmcgZHN0U3RlcCBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgICAgICAgICAKLSAgICAgICAgTV9MRFIgICAgYXZhaWxhYmlsaXR5LCBBdmFpbGFiaWxpdHkgICAgICAgICAgOy8vIEFyZyBhdmFpbGFiaWxpdHkgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnIAotICAgICAgICAKLSAgICAgICAgTERSICAgICAgcGMsIFtwVGFibGUsIHByZWRNb2RlLCBMU0wgIzJdICAgICAgOy8vIEJyYW5jaCB0byB0aGUgY2FzZSBiYXNlZCBvbiBwcmVNb2RlCi0KLU9NWF9WQ180eDRfVkVSVAotICAgICAgICAKLSAgICAgICAgTERSICAgICAgQWJvdmUwMTIzLCAgW3BTcmNBYm92ZV0gICAgICAgICAgICAgOy8vIEFib3ZlMDEyMyA9IHBTcmNBYm92ZVswIHRvIDNdCi0gICAgICAgIE1fU1RSICAgIEFib3ZlMDEyMywgIFtwRHN0XSwgIGRzdFN0ZXAgICAgICAgIDsvLyBwRHN0WzAgIHRvIDNdICA9IEFib3ZlMDEyMwotICAgICAgICBNX1NUUiAgICBBYm92ZTAxMjMsICBbcERzdF0sICBkc3RTdGVwICAgICAgICA7Ly8gcERzdFs0ICB0byA3XSAgPSBBYm92ZTAxMjMKLSAgICAgICAgTV9TVFIgICAgQWJvdmUwMTIzLCAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgOy8vIHBEc3RbOCAgdG8gMTFdID0gQWJvdmUwMTIzCi0gICAgICAgIFNUUiAgICAgIEFib3ZlMDEyMywgIFtwRHN0XSAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzEyIHRvIDE1XSA9IEFib3ZlMDEyMwotICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCi0gICAgICAgIE1fRVhJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE1hY3JvIHRvIGV4aXQgbWlkd2F5LWJyZWFrIGZybSBjYXNlCi0KLU9NWF9WQ180eDRfSE9SCi0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9NiAKLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgIHIweDAxMDEwMTAxLCAgPU1VTF9DT05TVDAgICAgICAgICAgIDsvLyBDb25zdCB0byByZXBlYXQgdGhlIGJ5dGUgaW4gcmVnIDQgdGltZXMKLSAgICAgICAgTV9MRFJCICAgTGVmdDAsICBbcFNyY0xlZnRdLCAgbGVmdFN0ZXAgICAgICAgOy8vIExlZnQwID0gcFNyY0xlZnRbMF0KLSAgICAgICAgTV9MRFJCICAgTGVmdDEsICBbcFNyY0xlZnRdLCAgbGVmdFN0ZXAgICAgICAgOy8vIExlZnQxID0gcFNyY0xlZnRbMV0KLSAgICAgICAgTV9MRFJCICAgTGVmdDIsICBbcFNyY0xlZnRdLCAgbGVmdFN0ZXAgICAgICAgOy8vIExlZnQyID0gcFNyY0xlZnRbMl0KLSAgICAgICAgTERSQiAgICAgTGVmdDMsICBbcFNyY0xlZnRdICAgICAgICAgICAgICAgICAgOy8vIExlZnQzID0gcFNyY0xlZnRbM10KLSAgICAgICAgTVVMICAgICAgT3V0MCwgICBMZWZ0MCwgICByMHgwMTAxMDEwMSAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKLSAgICAgICAgTVVMICAgICAgT3V0MSwgICBMZWZ0MSwgICByMHgwMTAxMDEwMSAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKLSAgICAgICAgTVVMICAgICAgT3V0MiwgICBMZWZ0MiwgICByMHgwMTAxMDEwMSAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKLSAgICAgICAgTVVMICAgICAgT3V0MywgICBMZWZ0MywgICByMHgwMTAxMDEwMSAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKLSAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sICBkc3RTdGVwICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQwfSBhdCBwRHN0IFswICB0byAzIF0gCi0gICAgICAgIE1fU1RSICAgIE91dDEsICAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MX0gYXQgcERzdCBbNCAgdG8gNyBdCi0gICAgICAgIE1fU1RSICAgIE91dDIsICAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0Mn0gYXQgcERzdCBbOCAgdG8gMTFdCi0gICAgICAgIFNUUiAgICAgIE91dDMsICAgW3BEc3RdICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0M30gYXQgcERzdCBbMTIgdG8gMTVdCi0gICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgTV9FWElUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE1hY3JvIHRvIGV4aXQgbWlkd2F5LWJyZWFrIGZybSBjYXNlCi0gICAgICAgIAotT01YX1ZDXzR4NF9EQwotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTYKLSAgICAgICAgCi0gICAgICAgIEFORCAgICAgIGF2YWlsYWJpbGl0eSwgIGF2YWlsYWJpbGl0eSwgICMoT01YX1ZDX1VQUEVSICsgT01YX1ZDX0xFRlQpCi0gICAgICAgIENNUCAgICAgIGF2YWlsYWJpbGl0eSwgICMoT01YX1ZDX1VQUEVSICsgT01YX1ZDX0xFRlQpCi0gICAgICAgIEJORSAgICAgIFVwcGVyT3JMZWZ0T3JOb25lQXZhaWxhYmxlICAgICAgICAgIDsvLyBKdW1wIHRvIFVwcGVyIGlmIG5vdCBib3RoCi0gICAgICAgIExEUiAgICAgIEFib3ZlMDEyMywgIFtwU3JjQWJvdmVdICAgICAgICAgICAgIDsvLyBBYm92ZTAxMjMgID0gcFNyY0Fib3ZlWzAgdG8gM10KLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCi0gICAgICAgIAotICAgICAgICBVWFRCMTYgICB0VmFsNywgIEFib3ZlMDEyMyAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzAsIDJdCi0gICAgICAgIFVYVEIxNiAgIHRWYWw2LCAgQWJvdmUwMTIzLCAgUk9SICM4ICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMSwgM10KLSAgICAgICAgVUFERDE2ICAgdFZhbDExLCB0VmFsNiwgICB0VmFsNyAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVswLCAyXSArIHBTcmNBYm92ZVsxLCAzXQotICAgICAgICBNX0xEUkIgICBMZWZ0MCwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDAgPSBwU3JjTGVmdFswXQotICAgICAgICBNX0xEUkIgICBMZWZ0MSwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDEgPSBwU3JjTGVmdFsxXQotICAgICAgICBBREQgICAgICB0VmFsMTEsIHRWYWwxMSwgIExTUiAjMTYgICAgICAgICAgICA7Ly8gc3VtKHBTcmNBYm92ZVswXSB0byBwU3JjQWJvdmVbM10pCi0gICAgICAgIE1fTERSQiAgIExlZnQyLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MiA9IHBTcmNMZWZ0WzJdCi0gICAgICAgIExEUkIgICAgIExlZnQzLCAgW3BTcmNMZWZ0XSAgICAgICAgICAgICAgICAgIDsvLyBMZWZ0MyA9IHBTcmNMZWZ0WzNdCi0gICAgICAgIFVYVEggICAgIHRWYWwxMSwgdFZhbDExICAgICAgICAgICAgICAgICAgICAgIDsvLyB1cHN1bTEgKENsZWFyIHRoZSB0b3AganVuayBiaXRzKQotICAgICAgICBBREQgICAgICB0VmFsNiwgIExlZnQwLCAgTGVmdDEgICAgICAgICAgICAgICA7Ly8gdFZhbDYgPSBMZWZ0MCArIExlZnQxCi0gICAgICAgIEFERCAgICAgIHRWYWw3LCAgTGVmdDIsICBMZWZ0MyAgICAgICAgICAgICAgIDsvLyB0VmFsNyA9IExlZnQyICsgTGVmdDMKLSAgICAgICAgQUREICAgICAgdFZhbDYsICB0VmFsNiwgIHRWYWw3ICAgICAgICAgICAgICAgOy8vIHRWYWw2ID0gdFZhbDYgKyB0VmFsNwotICAgICAgICBBREQgICAgICBPdXQwLCAgIHRWYWw2LCAgdFZhbDExICAgICAgICAgICAgICA7Ly8gT3V0MCAgPSB0VmFsNiArIHRWYWwxMSAgIAotICAgICAgICBBREQgICAgICBPdXQwLCAgIE91dDAsICAgIzQgICAgICAgICAgICAgICAgICA7Ly8gT3V0MCAgPSBPdXQwICsgNAotICAgICAgICBMRFIgICAgICByMHgwMTAxMDEwMSwgICA9TVVMX0NPTlNUMCAgICAgICAgICA7Ly8gMHgwMTAxMDEwMQotICAgICAgICBNT1YgICAgICBPdXQwLCAgIE91dDAsICBMU1IgIzMgICAgICAgICAgICAgICA7Ly8gT3V0MCA9IChPdXQwICsgNCk+PjMKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCi0gICAgICAgIAotICAgICAgICBNVUwgICAgICBPdXQwLCAgIE91dDAsICByMHgwMTAxMDEwMSAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcwotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgIHJldHVybiwgICNPTVhfU3RzX05vRXJyCi0gICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MH0gYXQgcERzdCBbMCAgdG8gMyBdCi0gICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MH0gYXQgcERzdCBbNCAgdG8gNyBdCi0gICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MH0gYXQgcERzdCBbOCAgdG8gMTFdCi0gICAgICAgIFNUUiAgICAgIE91dDAsICAgW3BEc3RdICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MH0gYXQgcERzdCBbMTIgdG8gMTVdCi0gICAgICAgIE1fRVhJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBNYWNybyB0byBleGl0IG1pZHdheS1icmVhayBmcm0gY2FzZQotICAgICAgICAKLVVwcGVyT3JMZWZ0T3JOb25lQXZhaWxhYmxlCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0zCi0gICAgICAgIAotICAgICAgICBDTVAgICAgICBhdmFpbGFiaWxpdHksICAjT01YX1ZDX1VQUEVSICAgICAgICA7Ly8gaWYoYXZhaWxhYmlsaXR5ICYgI09NWF9WQ19VUFBFUikKLSAgICAgICAgQk5FICAgICAgTGVmdE9yTm9uZUF2YWlsYWJsZSAgICAgICAgICAgICAgICAgOy8vIEp1bXAgdG8gTGVmdCBpZiBub3QgdXBwZXIKLSAgICAgICAgTERSICAgICAgQWJvdmUwMTIzLCAgW3BTcmNBYm92ZV0gICAgICAgICAgICAgOy8vIEFib3ZlMDEyMyAgPSBwU3JjQWJvdmVbMCB0byAzXQotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTMKLSAgICAgICAgCi0gICAgICAgIFVYVEIxNiAgIHRWYWw3LCAgQWJvdmUwMTIzICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMCwgMl0KLSAgICAgICAgVVhUQjE2ICAgdFZhbDYsICBBYm92ZTAxMjMsICBST1IgIzggICAgICAgICAgOy8vIHBTcmNBYm92ZVsxLCAzXQotICAgICAgICBVQUREMTYgICBPdXQwLCAgIHRWYWw2LCAgdFZhbDcgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzAsIDJdICsgcFNyY0Fib3ZlWzEsIDNdCi0gICAgICAgIExEUiAgICAgIHIweDAxMDEwMTAxLCAgID1NVUxfQ09OU1QwICAgICAgICAgIDsvLyAweDAxMDEwMTAxCi0gICAgICAgIEFERCAgICAgIE91dDAsICAgT3V0MCwgICBMU1IgIzE2ICAgICAgICAgICAgIDsvLyBzdW0ocFNyY0Fib3ZlWzBdIHRvIHBTcmNBYm92ZVszXSkKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCi0gICAgICAgIAotICAgICAgICBVWFRIICAgICBPdXQwLCAgIE91dDAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdXBzdW0xIChDbGVhciB0aGUgdG9wIGp1bmsgYml0cykKLSAgICAgICAgQUREICAgICAgT3V0MCwgICBPdXQwLCAgICMyICAgICAgICAgICAgICAgICAgOy8vIE91dDAgID0gT3V0MCArIDIKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCi0gICAgICAgIAotICAgICAgICBNT1YgICAgICBPdXQwLCAgIE91dDAsICAgTFNSICMyICAgICAgICAgICAgICA7Ly8gT3V0MCAgPSAoT3V0MCArIDIpPj4yCi0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQotICAgICAgICAKLSAgICAgICAgTVVMICAgICAgT3V0MCwgICBPdXQwLCAgIHIweDAxMDEwMTAxICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCi0gICAgICAgIAotICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCi0gICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3QgWzAgIHRvIDMgXQotICAgICAgICBNX1NUUiAgICBPdXQwLCAgIFtwRHN0XSwgIGRzdFN0ZXAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw2fSBhdCBwRHN0IFs0ICB0byA3IF0gCi0gICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3QgWzggIHRvIDExXQotICAgICAgICBTVFIgICAgICBPdXQwLCAgIFtwRHN0XSAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw2fSBhdCBwRHN0IFsxMiB0byAxNV0KLSAgICAgICAgCi0gICAgICAgIE1fRVhJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBNYWNybyB0byBleGl0IG1pZHdheS1icmVhayBmcm0gY2FzZQotICAgICAgICAKLUxlZnRPck5vbmVBdmFpbGFibGUgICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MwotICAgICAgICAKLSAgICAgICAgTERSICAgICAgcjB4MDEwMTAxMDEsICAgPU1VTF9DT05TVDAgICAgICAgICAgOy8vIDB4MDEwMTAxMDEKLSAgICAgICAgQ01QICAgICAgYXZhaWxhYmlsaXR5LCAjT01YX1ZDX0xFRlQKLSAgICAgICAgQk5FICAgICAgTm9uZUF2YWlsYWJsZQotICAgICAgICBNX0xEUkIgICBMZWZ0MCwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDAgPSBwU3JjTGVmdFswXQotICAgICAgICBNX0xEUkIgICBMZWZ0MSwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDEgPSBwU3JjTGVmdFsxXQotICAgICAgICBNX0xEUkIgICBMZWZ0MiwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDIgPSBwU3JjTGVmdFsyXQotICAgICAgICBMRFJCICAgICBMZWZ0MywgIFtwU3JjTGVmdF0gICAgICAgICAgICAgICAgICA7Ly8gTGVmdDMgPSBwU3JjTGVmdFszXQotICAgICAgICBBREQgICAgICBPdXQwLCAgIExlZnQwLCAgTGVmdDEgICAgICAgICAgICAgICA7Ly8gT3V0MCAgPSBMZWZ0MCArIExlZnQxCi0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQotICAgICAgICAKLSAgICAgICAgQUREICAgICAgT3V0MSwgICBMZWZ0MiwgIExlZnQzICAgICAgICAgICAgICAgOy8vIE91dDEgID0gTGVmdDIgKyBMZWZ0MwotICAgICAgICBBREQgICAgICBPdXQwLCAgIE91dDAsICAgT3V0MSAgICAgICAgICAgICAgICA7Ly8gT3V0MCAgPSBPdXQwICArIE91dDEKLSAgICAgICAgQUREICAgICAgT3V0MCwgICBPdXQwLCAgICMyICAgICAgICAgICAgICAgICAgOy8vIE91dDAgID0gT3V0MCArIDIKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCi0gICAgICAgIAotICAgICAgICBNT1YgICAgICBPdXQwLCAgIE91dDAsICAgTFNSICMyICAgICAgICAgICAgICA7Ly8gT3V0MCAgPSAoT3V0MCArIDIpPj4yCi0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQotICAgICAgICAKLSAgICAgICAgTVVMICAgICAgT3V0MCwgICBPdXQwLCAgIHIweDAxMDEwMTAxICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCi0gICAgICAgIAotICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCi0gICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MH0gYXQgcERzdCBbMCAgdG8gMyBdCi0gICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MH0gYXQgcERzdCBbNCAgdG8gNyBdIAotICAgICAgICBNX1NUUiAgICBPdXQwLCAgIFtwRHN0XSwgIGRzdFN0ZXAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDB9IGF0IHBEc3QgWzggIHRvIDExXQotICAgICAgICBTVFIgICAgICBPdXQwLCAgIFtwRHN0XSAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDB9IGF0IHBEc3QgWzEyIHRvIDE1XQotICAgICAgICBNX0VYSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTWFjcm8gdG8gZXhpdCBtaWR3YXktYnJlYWsgZnJtIGNhc2UKLQotTm9uZUF2YWlsYWJsZQotICAgICAgICBNT1YgICAgICBPdXQwLCAgICMxMjggICAgICAgICAgICAgICAgICAgICAgICA7Ly8gT3V0MCA9IDEyOCBpZihjb3VudCA9PSAwKQotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTUKLSAgICAgICAgCi0gICAgICAgIE1VTCAgICAgIE91dDAsICAgT3V0MCwgIHIweDAxMDEwMTAxICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCi0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQotICAgICAgICAKLSAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgotICAgICAgICBNX1NUUiAgICBPdXQwLCAgIFtwRHN0XSwgIGRzdFN0ZXAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDB9IGF0IHBEc3QgWzAgIHRvIDMgXQotICAgICAgICBNX1NUUiAgICBPdXQwLCAgIFtwRHN0XSwgIGRzdFN0ZXAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDB9IGF0IHBEc3QgWzQgIHRvIDcgXSAKLSAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sICBkc3RTdGVwICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQwfSBhdCBwRHN0IFs4ICB0byAxMV0KLSAgICAgICAgU1RSICAgICAgT3V0MCwgICBbcERzdF0gICAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQwfSBhdCBwRHN0IFsxMiB0byAxNV0KLSAgICAgICAgTV9FWElUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE1hY3JvIHRvIGV4aXQgbWlkd2F5LWJyZWFrIGZybSBjYXNlCi0gICAgICAgIAotT01YX1ZDXzR4NF9ESUFHX0RMCi0gICAgICAgIAotICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgOy8vIGYgPSAoYSsyKmIrYysyKT4+MgotICAgICAgICA7Ly8gQ2FsY3VsYXRlIGFzOgotICAgICAgICA7Ly8gZCA9IChhICsgYyApPj4xCi0gICAgICAgIDsvLyBlID0gKGQgLSBiJyk+PjEKLSAgICAgICAgOy8vIGYgPSBlICsgMTI4Ci0gICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTMKLSAgICAgICAgCi0gICAgICAgIFRTVCAgICAgIGF2YWlsYWJpbGl0eSwgI09NWF9WQ19VUFBFUl9SSUdIVCAgICAgICAgICAgICAgICAgIAotICAgICAgICBMRE1JQSAgICBwU3JjQWJvdmUsICB7QWJvdmUwMTIzLCBBYm92ZTQ1Njd9ICA7Ly8gQWJvdmUwMTIzLCBBYm92ZTQ1NjcgPSBwU3JjQWJvdmVbMCB0byA3XQotICAgICAgICBMRFIgICAgICByMHg4MDgwODA4MCwgID1BRERfQ09OU1QxICAgICAgICAgICA7Ly8gMHg4MDgwODA4MAotICAgICAgICBCTkUgICAgICBETFVwcGVyUmlnaHRBdmFpbGFibGUKLSAgICAgICAgTERSICAgICAgcjB4MDEwMTAxMDEsICA9TVVMX0NPTlNUMCAgICAgICAgICAgOy8vIDB4MDEwMTAxMDEKLSAgICAgICAgTU9WICAgICAgdFZhbDcsICBBYm92ZTAxMjMsICBMU1IgIzI0ICAgICAgICAgOy8vIHswMCwgIDAwLCAgMDAsICBVMyB9Ci0gICAgICAgIE1PViAgICAgIHRWYWwxMSwgdFZhbDcsICBMU0wgIzI0ICAgICAgICAgICAgIDsvLyB7VTMsICAwMCwgIDAwLCAgMDAgfQotICAgICAgICBNVUwgICAgICBPdXQzLCAgIHRWYWw3LCAgcjB4MDEwMTAxMDEgICAgICAgICA7Ly8ge1UzLCAgVTMsICBVMywgIFUzIH0gCi0gICAgICAgIE1PViAgICAgIHRWYWw4LCAgQWJvdmUwMTIzLCAgTFNSICMxNiAgICAgICAgIDsvLyB7MDAsICAwMCwgIFUzLCAgVTIgfQotICAgICAgICBNT1YgICAgICB0VmFsMTAsIEFib3ZlMDEyMywgIExTUiAjOCAgICAgICAgICA7Ly8gezAwLCAgVTMsICBVMiwgIFUxIH0KLSAgICAgICAgTVZOICAgICAgdFZhbDEwLCB0VmFsMTAgICAgICAgICAgICAgICAgICAgICAgOy8vIHswMCcsIFUzJywgVTInLCBVMSd9Ci0gICAgICAgIFVIQUREOCAgIHRWYWw4LCAgdFZhbDgsICBBYm92ZTAxMjMgICAgICAgICAgIDsvLyB7eHgsICB4eCwgIGQxLCAgZDAgfQotICAgICAgICBVSEFERDggICB0VmFsNiwgIEFib3ZlMDEyMywgIHRWYWw5ICAgICAgICAgICA7Ly8ge3h4LCAgZDIsICB4eCwgIHh4IH0KLSAgICAgICAgVUhTVUI4ICAgdFZhbDgsICB0VmFsOCwgIHRWYWwxMCAgICAgICAgICAgICAgOy8vIHt4eCwgIHh4LCAgZTEsICBlMCB9Ci0gICAgICAgIFVIU1VCOCAgIHRWYWw2LCAgdFZhbDYsICB0VmFsMTAgICAgICAgICAgICAgIDsvLyB7eHgsICBlMiwgIHh4LCAgeHggfQotICAgICAgICBVQUREOCAgICB0VmFsOCwgIHRWYWw4LCAgcjB4ODA4MDgwODAgICAgICAgICA7Ly8ge3h4LCAgeHgsICBmMSwgIGYwIH0KLSAgICAgICAgVUFERDggICAgdFZhbDYsICB0VmFsNiwgIHIweDgwODA4MDgwICAgICAgICAgOy8vIHt4eCwgIGYyLCAgeHgsICB4eCB9Ci0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQotICAgICAgICAKLSAgICAgICAgUEtIQlQgICAgdFZhbDYsICB0VmFsOCwgIHRWYWw2ICAgICAgICAgICAgICAgOy8vIHt4eCwgIGYyLCAgZjEsICBmMCB9Ci0gICAgICAgIEJJQyAgICAgIHRWYWw2LCAgdFZhbDYsICAjMHhGRjAwMDAwMCAgICAgICAgIDsvLyB7MDAsICBmMiwgIGYxLCAgZjAgfQotICAgICAgICBPUlIgICAgICBPdXQwLCAgIHRWYWw2LCAgdFZhbDExICAgICAgICAgICAgICA7Ly8ge1UzLCAgZjIsICBmMSwgIGYwIH0KLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCi0gICAgICAgIAotICAgICAgICBQS0hUQiAgICBPdXQxLCAgIE91dDMsICAgT3V0MCwgIEFTUiAjOCAgICAgICA7Ly8ge1UzLCAgVTMsICBmMiwgIGYxIH0KLSAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgotICAgICAgICBQS0hUQiAgICBPdXQyLCAgIE91dDMsICAgT3V0MSwgIEFTUiAjOCAgICAgICA7Ly8ge1UzLCAgVTMsICBVMywgIGYyIH0KLSAgICAgICAgCi0gICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7ZjMgdG8gZjB9IGF0IHBEc3RbMyAgdG8gMCBdCi0gICAgICAgIE1fU1RSICAgIE91dDEsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7ZjQgdG8gZjF9IGF0IHBEc3RbNyAgdG8gNCBdCi0gICAgICAgIE1fU1RSICAgIE91dDIsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7ZjUgdG8gZjJ9IGF0IHBEc3RbMTEgdG8gOCBdCi0gICAgICAgIFNUUiAgICAgIE91dDMsICAgW3BEc3RdICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7ZjYgdG8gZjN9IGF0IHBEU3RbMTUgdG8gMTJdCi0gICAgICAgIE1fRVhJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBNYWNybyB0byBleGl0IG1pZHdheS1icmVhayBmcm0gY2FzZQotCi1ETFVwcGVyUmlnaHRBdmFpbGFibGUgICAgICAgIAotICAgICAgICAKLSAgICAgICAgTU9WICAgICAgdFZhbDgsICBBYm92ZTAxMjMsICBMU1IgIzI0ICAgICAgICAgOy8vIHswMCwgIDAwLCAgMDAsICBVMyB9Ci0gICAgICAgIE1PViAgICAgIHRWYWw5LCAgQWJvdmUwMTIzLCAgTFNSICMxNiAgICAgICAgIDsvLyB7MDAsICAwMCwgIFUzLCAgVTIgfQotICAgICAgICBNT1YgICAgICB0VmFsMTAsIEFib3ZlMDEyMywgIExTUiAjOCAgICAgICAgICA7Ly8gezAwLCAgVTMsICBVMiwgIFUxIH0KLSAgICAgICAgT1JSICAgICAgdFZhbDgsICB0VmFsOCwgIEFib3ZlNDU2NywgTFNMICM4ICAgOy8vIHtVNiwgIFU1LCAgVTQsICBVMyB9Ci0gICAgICAgIE9SUiAgICAgIHRWYWwxMCwgdFZhbDEwLCBBYm92ZTQ1NjcsIExTTCAjMjQgIDsvLyB7VTQsICBVMywgIFUyLCAgVTEgfQotICAgICAgICBQS0hCVCAgICB0VmFsOSwgIHRWYWw5LCAgQWJvdmU0NTY3LCBMU0wgIzE2ICA7Ly8ge1U1LCAgVTQsICBVMywgIFUyIH0KLSAgICAgICAgTVZOICAgICAgdFZhbDEsICB0VmFsOCAgICAgICAgICAgICAgICAgICAgICAgOy8vIHtVNicsIFU1JywgVTQnLCBVMyd9Ci0gICAgICAgIE1WTiAgICAgIHRWYWwxMCwgdFZhbDEwICAgICAgICAgICAgICAgICAgICAgIDsvLyB7VTQnLCBVMycsIFUyJywgVTEnfQotICAgICAgICBNVk4gICAgICB0VmFsMiwgIEFib3ZlNDU2NyAgICAgICAgICAgICAgICAgICA7Ly8ge1U3JywgVTYnLCBVNScsIFU0J30KLSAgICAgICAgVUhBREQ4ICAgdFZhbDYsICBBYm92ZTAxMjMsICB0VmFsOSAgICAgICAgICAgOy8vIHtkMywgIGQyLCAgZDEsICBkMCB9Ci0gICAgICAgIFVIQUREOCAgIHRWYWw5LCAgdFZhbDksICBBYm92ZTQ1NjcgICAgICAgICAgIDsvLyB7ZDUsICBkNCwgIGQzLCAgZDIgfQotICAgICAgICBVSEFERDggICB0VmFsOCwgIEFib3ZlNDU2NywgIHRWYWw4ICAgICAgICAgICA7Ly8ge2Q2LCAgeHgsICB4eCwgIHh4IH0KLSAgICAgICAgVUhTVUI4ICAgdFZhbDYsICB0VmFsNiwgIHRWYWwxMCAgICAgICAgICAgICAgOy8vIHtlMywgIGUyLCAgZTEsICBlMCB9Ci0gICAgICAgIFVIU1VCOCAgIHRWYWwxMiwgdFZhbDksICB0VmFsMSAgICAgICAgICAgICAgIDsvLyB7ZTUsICBlNCwgIGUzLCAgZTIgfQotICAgICAgICBVSFNVQjggICB0VmFsOCwgIHRWYWw4LCAgdFZhbDIgICAgICAgICAgICAgICA7Ly8ge2U2LCAgeHgsICB4eCwgIHh4IH0KLSAgICAgICAgVUFERDggICAgT3V0MCwgICB0VmFsNiwgIHIweDgwODA4MDgwICAgICAgICAgOy8vIHtmMywgIGYyLCAgZjEsICBmMCB9Ci0gICAgICAgIFVBREQ4ICAgIHRWYWw5LCAgdFZhbDgsICByMHg4MDgwODA4MCAgICAgICAgIDsvLyB7ZjYsICB4eCwgIHh4LCAgeHggfQotICAgICAgICBVQUREOCAgICBPdXQyLCAgIHRWYWwxMiwgcjB4ODA4MDgwODAgICAgICAgICA7Ly8ge2Y1LCAgZjQsICBmMywgIGYyIH0KLSAgICAgICAgTU9WICAgICAgdFZhbDcsICBPdXQwLCAgIExTUiAjOCAgICAgICAgICAgICAgOy8vIHswMCwgIGYzLCAgZjIsICBmMSB9Ci0gICAgICAgIEFORCAgICAgIHRWYWw5LCAgdFZhbDksICAjMHhGRjAwMDAwMCAgICAgICAgIDsvLyB7ZjYsICAwMCwgIDAwLCAgMDAgfQotICAgICAgICBQS0hCVCAgICBPdXQxLCAgIHRWYWw3LCAgT3V0MiwgIExTTCAjOCAgICAgICA7Ly8ge2Y0LCAgZjMsICBmMiwgIGYxIH0KLSAgICAgICAgT1JSICAgICAgT3V0MywgICB0VmFsOSwgIE91dDIsICBMU1IgIzggICAgICAgOy8vIHtmNiwgIGY1LCAgZjQsICBmMyB9Ci0gICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7ZjMgdG8gZjB9IGF0IHBEc3RbMyAgdG8gMCBdCi0gICAgICAgIE1fU1RSICAgIE91dDEsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7ZjQgdG8gZjF9IGF0IHBEc3RbNyAgdG8gNCBdCi0gICAgICAgIE1fU1RSICAgIE91dDIsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7ZjUgdG8gZjJ9IGF0IHBEc3RbMTEgdG8gOCBdCi0gICAgICAgIFNUUiAgICAgIE91dDMsICAgW3BEc3RdICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7ZjYgdG8gZjN9IGF0IHBEU3RbMTUgdG8gMTJdCi0gICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgTV9FWElUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE1hY3JvIHRvIGV4aXQgbWlkd2F5LWJyZWFrIGZybSBjYXNlCi0gICAgICAgIAotCi1PTVhfVkNfNHg0X0RJQUdfRFIKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz00Ci0gICAgICAgIAotICAgICAgICBNX0xEUkIgICBMZWZ0MCwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDAgPSBwU3JjTGVmdFswXQotICAgICAgICBNX0xEUkIgICBMZWZ0MSwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDEgPSBwU3JjTGVmdFsxXQotICAgICAgICBNX0xEUkIgICBMZWZ0MiwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDIgPSBwU3JjTGVmdFsyXQotICAgICAgICBMRFJCICAgICBMZWZ0MywgIFtwU3JjTGVmdF0gICAgICAgICAgICAgICAgICA7Ly8gTGVmdDMgPSBwU3JjTGVmdFszXQotICAgICAgICBMRFJCICAgICBBYm92ZUxlZnQsIFtwU3JjQWJvdmVMZWZ0XSAgICAgICAgICA7Ly8gQWJvdmVMZWZ0ID0gcFNyY0Fib3ZlTGVmdFswXQotICAgICAgICBPUlIgICAgICB0VmFsNywgIExlZnQxLCAgTGVmdDAsICBMU0wgIzggICAgICA7Ly8gdFZhbDcgPSAwMCAwMCBMMCBMMQotICAgICAgICBMRFIgICAgICBBYm92ZTAxMjMsICBbcFNyY0Fib3ZlXSAgICAgICAgICAgICA7Ly8gQWJvdmUwMTIzID0gVTMgVTIgVTEgVTAKLSAgICAgICAgTERSICAgICAgcjB4ODA4MDgwODAsID1BRERfQ09OU1QxICAgICAgICAgICAgOy8vIDB4ODA4MDgwODAKLSAgICAgICAgT1JSICAgICAgdFZhbDgsICBMZWZ0MywgIExlZnQyLCAgTFNMICM4ICAgICAgOy8vIHRWYWw4ID0gMDAgMDAgTDIgTDMKLSAgICAgICAgUEtIQlQgICAgdFZhbDcsICB0VmFsOCwgIHRWYWw3LCAgTFNMICMxNiAgICAgOy8vIHRWYWw3ID0gTDAgTDEgTDIgTDMKLSAgICAgICAgTU9WICAgICAgdFZhbDgsICBBYm92ZTAxMjMsICBMU0wgIzggICAgICAgICAgOy8vIHRWYWw4ID0gVTIgVTEgVTAgMDAKLSAgICAgICAgTU9WICAgICAgdFZhbDksICB0VmFsNywgIExTUiAjOCAgICAgICAgICAgICAgOy8vIHRWYWw5ID0gMDAgTDAgTDEgTDIKLSAgICAgICAgT1JSICAgICAgdFZhbDgsICB0VmFsOCwgIEFib3ZlTGVmdCAgICAgICAgICAgOy8vIHRWYWw4ID0gVTIgVTEgVTAgVUwKLSAgICAgICAgT1JSICAgICAgdFZhbDksICB0VmFsOSwgIEFib3ZlTGVmdCwgTFNMICMyNCAgOy8vIHRWYWw5ID0gVUwgTDAgTDEgTDIKLSAgICAgICAgTU9WICAgICAgdFZhbDEwLCBBYm92ZTAxMjMsICBMU0wgIzI0ICAgICAgICAgOy8vIHRWYWwxMD0gVTAgMDAgMDAgMDAKLSAgICAgICAgVVhUQiAgICAgdFZhbDExLCB0VmFsNywgIFJPUiAjMjQgICAgICAgICAgICAgOy8vIHRWYWwxMT0gMDAgMDAgMDAgTDAKLSAgICAgICAgT1JSICAgICAgdFZhbDEwLCB0VmFsMTAsIHRWYWw5LCAgTFNSICM4ICAgICAgOy8vIHRWYWwxMD0gVTAgVUwgTDAgTDEKLSAgICAgICAgT1JSICAgICAgdFZhbDExLCB0VmFsMTEsIHRWYWw4LCAgTFNMICM4ICAgICAgOy8vIHRWYWwxMT0gVTEgVTAgVUwgTDAKLSAgICAgICAgVUhBREQ4ICAgdFZhbDExLCBBYm92ZTAxMjMsICB0VmFsMTEgICAgICAgICAgOy8vIHRWYWwxMT0gZDEgZDAgZEwgZzAKLSAgICAgICAgVUhBREQ4ICAgdFZhbDEwLCB0VmFsNywgIHRWYWwxMCAgICAgICAgICAgICAgOy8vIHRWYWwxMD0gZzAgZzEgZzIgZzMKLSAgICAgICAgTVZOICAgICAgdFZhbDgsICB0VmFsOCAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWw4ID0gVTInVTEnVTAnVUwnCi0gICAgICAgIE1WTiAgICAgIHRWYWw5LCAgdFZhbDkgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsOSA9IFVMJ0wwJ0wxJ0wyJwotICAgICAgICBVSFNVQjggICB0VmFsMTEsIHRWYWwxMSwgdFZhbDggICAgICAgICAgICAgICA7Ly8gdFZhbDExPSBlMSBlMCBlTCBoMAotICAgICAgICBVSFNVQjggICB0VmFsMTAsIHRWYWwxMCwgdFZhbDkgICAgICAgICAgICAgICA7Ly8gdFZhbDEwPSBoMCBoMSBoMiBoMwotICAgICAgICBVQUREOCAgICBPdXQzLCAgIHRWYWwxMCwgcjB4ODA4MDgwODAgICAgICAgICA7Ly8gT3V0MyAgPSBpMCBpMSBpMiBpMwotICAgICAgICBVQUREOCAgICBPdXQwLCAgIHRWYWwxMSwgcjB4ODA4MDgwODAgICAgICAgICA7Ly8gT3V0MCAgPSBmMSBmMCBmTCBpMAotICAgICAgICBVWFRIICAgICB0VmFsMTEsIE91dDMsICAgUk9SICM4ICAgICAgICAgICAgICA7Ly8gdFZhbDExPSAwMCAwMCBpMSBpMgotICAgICAgICBNT1YgICAgICB0VmFsNywgIE91dDAsICAgTFNMICM4ICAgICAgICAgICAgICA7Ly8gdFZhbDcgPSBmMCBmTCBpMCAwMAotICAgICAgICBPUlIgICAgICBPdXQxLCAgIHRWYWw3LCAgdFZhbDExLCAgTFNSICM4ICAgICA7Ly8gT3V0MSAgPSBmMCBmTCBpMCBpMQotICAgICAgICBQS0hCVCAgICBPdXQyLCAgIHRWYWwxMSwgT3V0MCwgICAgTFNMICMxNiAgICA7Ly8gT3V0MiAgPSBmTCBpMCBpMSBpMgotICAgICAgICBNX1NUUiAgICBPdXQwLCAgIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICA7Ly8gc3RvcmUge2YxIHRvIGkwfSBhdCBwRHN0WzMgIHRvIDAgXQotICAgICAgICBNX1NUUiAgICBPdXQxLCAgIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICA7Ly8gc3RvcmUge2YwIHRvIGkxfSBhdCBwRHN0WzcgIHRvIDQgXQotICAgICAgICBNX1NUUiAgICBPdXQyLCAgIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICA7Ly8gc3RvcmUge2ZMIHRvIGkyfSBhdCBwRHN0WzExIHRvIDggXQotICAgICAgICBTVFIgICAgICBPdXQzLCAgIFtwRHN0XSAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge2kwIHRvIGkzfSBhdCBwRHN0WzE1IHRvIDEyXSAKLSAgICAgICAgTU9WICAgICAgcmV0dXJuLCAgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgTV9FWElUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE1hY3JvIHRvIGV4aXQgbWlkd2F5LWJyZWFrIGZybSBjYXNlCi0KLU9NWF9WQ180eDRfVlIKLQotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9NAotICAgICAgICAKLSAgICAgICAgTERSICAgICAgQWJvdmUwMTIzLCAgW3BTcmNBYm92ZV0gICAgICAgICAgICAgOy8vIEFib3ZlMDEyMyA9IFUzIFUyIFUxIFUwCi0gICAgICAgIExEUkIgICAgIEFib3ZlTGVmdCwgIFtwU3JjQWJvdmVMZWZ0XSAgICAgICAgIDsvLyBBYm92ZUxlZnQgPSAwMCAwMCAwMCBVTAotICAgICAgICBNX0xEUkIgICBMZWZ0MCwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDAgICAgID0gMDAgMDAgMDAgTDAKLSAgICAgICAgTV9MRFJCICAgTGVmdDEsICBbcFNyY0xlZnRdLCAgbGVmdFN0ZXAgICAgICAgOy8vIExlZnQxICAgICA9IDAwIDAwIDAwIEwxCi0gICAgICAgIExEUkIgICAgIExlZnQyLCAgW3BTcmNMZWZ0XSAgICAgICAgICAgICAgICAgIDsvLyBMZWZ0MiAgICAgPSAwMCAwMCAwMCBMMgotICAgICAgICBNT1YgICAgICB0VmFsMCwgIEFib3ZlMDEyMywgIExTTCAjOCAgICAgICAgICA7Ly8gdFZhbDAgICAgID0gVTIgVTEgVTAgMDAKLSAgICAgICAgTU9WICAgICAgdFZhbDksICBBYm92ZTAxMjMgICAgICAgICAgICAgICAgICAgOy8vIHRWYWw5ICAgICA9IFUzIFUyIFUxIFUwIAotICAgICAgICBPUlIgICAgICB0VmFsMTQsIHRWYWwwLCAgIEFib3ZlTGVmdCAgICAgICAgICA7Ly8gdFZhbDE0ICAgID0gVTIgVTEgVTAgVUwKLSAgICAgICAgTVZOICAgICAgdFZhbDExLCB0VmFsMTQgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWwxMSAgICA9IFUyJ1UxJ1UwJ1VMJwotICAgICAgICBNT1YgICAgICB0VmFsMiwgIHRWYWwxNCwgIExTTCAjOCAgICAgICAgICAgICA7Ly8gdFZhbDIgICAgID0gVTEgVTAgVUwgMDAKLSAgICAgICAgVUhTVUI4ICAgdFZhbDEsICBBYm92ZTAxMjMsICB0VmFsMTEgICAgICAgICAgOy8vIHRWYWwxICAgICA9IGQyIGQxIGQwIGRMCi0gICAgICAgIFVIQUREOCAgIHRWYWwxMCwgQWJvdmVMZWZ0LCBMZWZ0MSAgICAgICAgICAgIDsvLyB0VmFsMTAgICAgPSAwMCAwMCAwMCBqMSAgICAgICAKLSAgICAgICAgTVZOICAgICAgdFZhbDQsICBMZWZ0MCAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWw0ICAgICA9IDAwIDAwIDAwIEwwJwotICAgICAgICBVSFNVQjggICB0VmFsNCwgIHRWYWwxMCwgIHRWYWw0ICAgICAgICAgICAgICA7Ly8gdFZhbDQgICAgID0gMDAgMDAgMDAgazEKLSAgICAgICAgT1JSICAgICAgdFZhbDEyLCB0VmFsMCwgICBMZWZ0MCAgICAgICAgICAgICAgOy8vIHRWYWwxMiAgICA9IFUyIFUxIFUwIEwwCi0gICAgICAgIE9SUiAgICAgIHRWYWwxNCwgdFZhbDIsICAgTGVmdDAgICAgICAgICAgICAgIDsvLyB0VmFsMTQgICAgPSBVMSBVMCBVTCBMMAotICAgICAgICBMRFIgICAgICByMHg4MDgwODA4MCwgID1BRERfQ09OU1QxICAgICAgICAgICA7Ly8gMHg4MDgwODA4MAotICAgICAgICBVSEFERDggICB0VmFsMTAsIHRWYWw5LCAgIHRWYWwxNCAgICAgICAgICAgICA7Ly8gdFZhbDEwICAgID0gZzMgZzIgZzEgZzAKLSAgICAgICAgVUFERDggICAgT3V0MCwgICB0VmFsMSwgICByMHg4MDgwODA4MCAgICAgICAgOy8vIE91dDAgICAgICA9IGUyIGUxIGUwIGVMCi0gICAgICAgIFVIU1VCOCAgIHRWYWwxMCwgdFZhbDEwLCAgdFZhbDExICAgICAgICAgICAgIDsvLyB0VmFsMTAgICAgPSBoMyBoMiBoMSBoMAotICAgICAgICBNX1NUUiAgICBPdXQwLCAgIFtwRHN0XSwgIGRzdFN0ZXAgICAgICAgICAgICA7Ly8gc3RvcmUge2UyIHRvIGVMfSBhdCBwRHN0WzMgIHRvIDAgXQotICAgICAgICBNT1YgICAgICB0VmFsMSwgIHRWYWwxNCwgIExTTCAjOCAgICAgICAgICAgICA7Ly8gdFZhbDEgICAgID0gVTAgVUwgTDAgMDAKLSAgICAgICAgTU9WICAgICAgdFZhbDYsICBPdXQwLCAgICBMU0wgIzggICAgICAgICAgICAgOy8vIHRWYWw2ICAgICA9IGUxIGUwIGVMIDAwCi0gICAgICAgIE9SUiAgICAgIHRWYWwyLCAgdFZhbDIsICAgTGVmdDEgICAgICAgICAgICAgIDsvLyB0VmFsMiAgICAgPSBVMSBVMCBVTCBMMQotICAgICAgICBVQUREOCAgICB0VmFsNCwgIHRWYWw0LCAgIHIweDgwODA4MDgwICAgICAgICA7Ly8gdFZhbDQgICAgID0gMDAgMDAgMDAgbDEgICAgICAgIAotICAgICAgICBVQUREOCAgICBPdXQxLCAgIHRWYWwxMCwgIHIweDgwODA4MDgwICAgICAgICA7Ly8gT3V0MSAgICAgID0gaTMgaTIgaTEgaTAKLSAgICAgICAgTVZOICAgICAgdFZhbDIsICB0VmFsMiAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWwxNCAgICA9IFUxJ1UwJ1VMJ0wxJwotICAgICAgICBPUlIgICAgICB0VmFsMSwgIHRWYWwxLCAgIExlZnQyICAgICAgICAgICAgICA7Ly8gdFZhbDEgICAgID0gVTAgVUwgTDAgTDIKLSAgICAgICAgT1JSICAgICAgT3V0MiwgICB0VmFsNiwgICB0VmFsNCAgICAgICAgICAgICAgOy8vIE91dDIgICAgICA9IGUxIGUwIGVMIGwxCi0gICAgICAgIFVIQUREOCAgIHRWYWwxLCAgdFZhbDEsICAgdFZhbDEyICAgICAgICAgICAgIDsvLyB0VmFsMSAgICAgPSBnMiBnMSBnMCBqMgotICAgICAgICBNX1NUUiAgICBPdXQxLCAgIFtwRHN0XSwgIGRzdFN0ZXAgICAgICAgICAgICA7Ly8gc3RvcmUge2kzIHRvIGkwfSBhdCBwRHN0WzcgIHRvIDQgXQotICAgICAgICBNX1NUUiAgICBPdXQyLCAgIFtwRHN0XSwgIGRzdFN0ZXAgICAgICAgICAgICA7Ly8gc3RvcmUge2UxIHRvIGwxfSBhdCBwRHN0WzExIHRvIDggXQotICAgICAgICBVSFNVQjggICB0VmFsOSwgIHRWYWwxLCAgIHRWYWwyICAgICAgICAgICAgICA7Ly8gdFZhbDkgICAgID0gaDIgaDEgaDAgazIKLSAgICAgICAgVUFERDggICAgT3V0MywgICB0VmFsOSwgICByMHg4MDgwODA4MCAgICAgICAgOy8vIE91dDMgICAgICA9IGkyIGkxIGkwIGwyCi0gICAgICAgIFNUUiAgICAgIE91dDMsICAgW3BEc3RdICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7aTIgdG8gbDJ9IGF0IHBEc3RbMTUgdG8gMTJdIAotICAgICAgICBNT1YgICAgICByZXR1cm4sICAjT01YX1N0c19Ob0VycgotICAgICAgICBNX0VYSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTWFjcm8gdG8gZXhpdCBtaWR3YXktYnJlYWsgZnJtIGNhc2UKLSAgICAgICAgCi1PTVhfVkNfNHg0X0hECi0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9NAotICAgICAgICAKLSAgICAgICAgTERSICAgICAgQWJvdmUwMTIzLCAgW3BTcmNBYm92ZV0gICAgICAgICAgICAgOy8vIEFib3ZlMDEyMyA9IFUzIFUyIFUxIFUwCi0gICAgICAgIExEUkIgICAgIEFib3ZlTGVmdCwgIFtwU3JjQWJvdmVMZWZ0XSAgICAgICAgIDsvLyBBYm92ZUxlZnQgPSAwMCAwMCAwMCBVTAotICAgICAgICBNX0xEUkIgICBMZWZ0MCwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDAgPSAwMCAwMCAwMCBMMAotICAgICAgICBNX0xEUkIgICBMZWZ0MSwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDEgPSAwMCAwMCAwMCBMMQotICAgICAgICBNX0xEUkIgICBMZWZ0MiwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDIgPSAwMCAwMCAwMCBMMgotICAgICAgICBMRFJCICAgICBMZWZ0MywgIFtwU3JjTGVmdF0gICAgICAgICAgICAgICAgICA7Ly8gTGVmdDMgPSAwMCAwMCAwMCBMMwotICAgICAgICBMRFIgICAgICByMHg4MDgwODA4MCwgID1BRERfQ09OU1QxICAgICAgICAgICA7Ly8gMHg4MDgwODA4MAotICAgICAgICBPUlIgICAgICB0VmFsMiwgIEFib3ZlTGVmdCwgQWJvdmUwMTIzLCBMU0wgIzg7Ly8gdFZhbDIgPSBVMiBVMSBVMCBVTAotICAgICAgICBNVk4gICAgICB0VmFsMSwgIExlZnQwICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDEgPSAwMCAwMCAwMCBMMCcKLSAgICAgICAgT1JSICAgICAgdFZhbDQsICBMZWZ0MCwgIHRWYWwyLCAgTFNMICM4ICAgICAgOy8vIHRWYWw0ID0gVTEgVTAgVUwgTDAKLSAgICAgICAgTVZOICAgICAgdFZhbDIsICB0VmFsMiAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWwyID0gVTInVTEnVTAnVUwnCi0gICAgICAgIFVIQUREOCAgIHRWYWw0LCAgdFZhbDQsICBBYm92ZTAxMjMgICAgICAgICAgIDsvLyB0VmFsNCA9IGczIGcyIGcxIGcwCi0gICAgICAgIFVIU1VCOCAgIHRWYWwxLCAgQWJvdmVMZWZ0LCAgdFZhbDEgICAgICAgICAgIDsvLyB0VmFsMSA9IDAwIDAwIDAwIGRMCi0gICAgICAgIFVIU1VCOCAgIHRWYWw0LCAgdFZhbDQsICB0VmFsMiAgICAgICAgICAgICAgIDsvLyB0VmFsNCA9IGgzIGgyIGgxIGgwCi0gICAgICAgIFVBREQ4ICAgIHRWYWwxLCAgdFZhbDEsICByMHg4MDgwODA4MCAgICAgICAgIDsvLyB0VmFsMSA9IDAwIDAwIDAwIGVMCi0gICAgICAgIFVBREQ4ICAgIHRWYWw0LCAgdFZhbDQsICByMHg4MDgwODA4MCAgICAgICAgIDsvLyB0VmFsNCA9IGkzIGkyIGkxIGkwCi0gICAgICAgIE9SUiAgICAgIHRWYWwyLCAgTGVmdDAsICBBYm92ZUxlZnQsICBMU0wgIzE2IDsvLyB0VmFsMiA9IDAwIFVMIDAwIEwwCi0gICAgICAgIE1PViAgICAgIHRWYWw0LCAgdFZhbDQsICBMU0wgIzggICAgICAgICAgICAgIDsvLyB0VmFsNCA9IGkyIGkxIGkwIDAwCi0gICAgICAgIE9SUiAgICAgIHRWYWwxMSwgTGVmdDEsICBMZWZ0MCwgIExTTCAjMTYgICAgIDsvLyB0VmFsMTE9IDAwIEwwIDAwIEwxCi0gICAgICAgIE9SUiAgICAgIHRWYWw3LCAgTGVmdDIsICBMZWZ0MSwgIExTTCAjMTYgICAgIDsvLyB0VmFsNyA9IDAwIEwxIDAwIEwyCi0gICAgICAgIE9SUiAgICAgIHRWYWwxMCwgTGVmdDMsICBMZWZ0MiwgIExTTCAjMTYgICAgIDsvLyB0VmFsMTA9IDAwIEwyIDAwIEwzCi0gICAgICAgIE9SUiAgICAgIE91dDAsICAgdFZhbDQsICB0VmFsMSAgICAgICAgICAgICAgIDsvLyBPdXQwICA9IGkyIGkxIGkwIGVMCi0gICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MH0gIGF0IHBEc3QgWzAgIHRvIDMgXSAKLSAgICAgICAgTU9WICAgICAgdFZhbDQsICBPdXQwLCAgIExTTCAjMTYgICAgICAgICAgICAgOy8vIHRWYWw0ID0gaTEgaTAgMDAgMDAKLSAgICAgICAgVUhBREQ4ICAgdFZhbDIsICB0VmFsMiwgIHRWYWw3ICAgICAgICAgICAgICAgOy8vIHRWYWwyID0gMDAgajEgMDAgajIKLSAgICAgICAgVUhBREQ4ICAgdFZhbDYsICB0VmFsMTEsIHRWYWwxMCAgICAgICAgICAgICAgOy8vIHRWYWwxMT0gMDAgajIgMDAgajMKLSAgICAgICAgTVZOICAgICAgdFZhbDEyLCB0VmFsMTEgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWwxMj0gMDAgTDAnMDAgTDEnCi0gICAgICAgIE1WTiAgICAgIHRWYWwxNCwgdFZhbDcgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsMTQ9IDAwIEwxJzAwIEwyJwotICAgICAgICBVSFNVQjggICB0VmFsMiwgIHRWYWwyLCAgdFZhbDEyICAgICAgICAgICAgICA7Ly8gdFZhbDIgPSAwMCBrMSAwMCBrMgotICAgICAgICBVSFNVQjggICB0VmFsOCwgIHRWYWw3LCAgdFZhbDEyICAgICAgICAgICAgICA7Ly8gdFZhbDggPSAwMCBkMSAwMCBkMgotICAgICAgICBVSFNVQjggICB0VmFsMTEsIHRWYWw2LCAgdFZhbDE0ICAgICAgICAgICAgICA7Ly8gdFZhbDExPSAwMCBrMiAwMCBrMwotICAgICAgICBVSFNVQjggICB0VmFsOSwgIHRWYWwxMCwgdFZhbDE0ICAgICAgICAgICAgICA7Ly8gdFZhbDkgPSAwMCBkMiAwMCBkMwotICAgICAgICBVQUREOCAgICB0VmFsMiwgIHRWYWwyLCAgcjB4ODA4MDgwODAgICAgICAgICA7Ly8gdFZhbDIgPSAwMCBsMSAwMCBsMgotICAgICAgICBVQUREOCAgICB0VmFsOCwgIHRWYWw4LCAgcjB4ODA4MDgwODAgICAgICAgICA7Ly8gdFZhbDggPSAwMCBlMSAwMCBlMgotICAgICAgICBVQUREOCAgICB0VmFsMTEsIHRWYWwxMSwgcjB4ODA4MDgwODAgICAgICAgICA7Ly8gdFZhbDExPSAwMCBsMiAwMCBsMwotICAgICAgICBVQUREOCAgICB0VmFsOSwgIHRWYWw5LCAgcjB4ODA4MDgwODAgICAgICAgICA7Ly8gdFZhbDkgPSAwMCBlMiAwMCBlMwotICAgICAgICBPUlIgICAgICBPdXQyLCAgIHRWYWw4LCAgdFZhbDIsICBMU0wgIzggICAgICA7Ly8gT3V0MiAgPSBsMSBlMSBsMiBlMgotICAgICAgICBPUlIgICAgICBPdXQzLCAgIHRWYWw5LCAgdFZhbDExLCBMU0wgIzggICAgICA7Ly8gT3V0MyAgPSBsMiBlMiBsMyBlMwotICAgICAgICBQS0hUQiAgICBPdXQxLCAgIHRWYWw0LCAgT3V0MiwgICBBU1IgIzE2ICAgICA7Ly8gT3V0MSAgPSBpMSBpMCBsMSBlMQotICAgICAgICBNX1NUUiAgICBPdXQxLCAgIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDF9ICBhdCBwRHN0IFs0ICB0byA3IF0KLSAgICAgICAgTV9TVFIgICAgT3V0MiwgICBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQyfSAgYXQgcERzdCBbOCAgdG8gMTFdCi0gICAgICAgIFNUUiAgICAgIE91dDMsICAgW3BEc3RdICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0M30gIGF0IHBEc3QgWzEyIHRvIDE1XQotICAgICAgICBNT1YgICAgICByZXR1cm4sICAjT01YX1N0c19Ob0VycgotICAgICAgICBNX0VYSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTWFjcm8gdG8gZXhpdCBtaWR3YXktYnJlYWsgZnJtIGNhc2UKLSAgICAgICAgCi1PTVhfVkNfNHg0X1ZMCi0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MwotICAgICAgICAKLSAgICAgICAgTERNSUEgICAgcFNyY0Fib3ZlLCB7QWJvdmUwMTIzLCBBYm92ZTQ1Njd9ICAgOy8vIEFib3ZlMDEyMywgQWJvdmU0NTY3ID0gcFNyY0Fib3ZlWzAgdG8gN10KLSAgICAgICAgVFNUICAgICAgYXZhaWxhYmlsaXR5LCAjT01YX1ZDX1VQUEVSX1JJR0hUCi0gICAgICAgIExEUiAgICAgIHIweDgwODA4MDgwLCAgPUFERF9DT05TVDEgICAgICAgICAgIDsvLyAweDgwODA4MDgwCi0gICAgICAgIExEUiAgICAgIHIweDAxMDEwMTAxLCAgPU1VTF9DT05TVDAgICAgICAgICAgIDsvLyAweDAxMDEwMTAxCi0gICAgICAgIE1PViAgICAgIHRWYWwxMSwgQWJvdmUwMTIzLCAgTFNSICMyNCAgICAgICAgIDsvLyB0VmFsMTE9IDAwIDAwIDAwIFUzCi0gICAgICAgIE1VTEVRICAgIEFib3ZlNDU2NywgdFZhbDExLCByMHgwMTAxMDEwMSAgICAgIDsvLyBBYm92ZTQ1NjcgPSBVMyBVMyBVMyBVMwotICAgICAgICBNT1YgICAgICB0VmFsOSwgIEFib3ZlMDEyMywgIExTUiAjOCAgICAgICAgICA7Ly8gdFZhbDkgPSAwMCBVMyBVMiBVMQotICAgICAgICBNVk4gICAgICB0VmFsMTAsIEFib3ZlMDEyMyAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDEwPSBVMydVMidVMSdVMCcKLSAgICAgICAgT1JSICAgICAgdFZhbDIsICB0VmFsOSwgIEFib3ZlNDU2NywgIExTTCAjMjQgOy8vIHRWYWwyID0gVTQgVTMgVTIgVTEKLSAgICAgICAgVUhTVUI4ICAgdFZhbDgsICB0VmFsMiwgIHRWYWwxMCAgICAgICAgICAgICAgOy8vIHRWYWw4ID0gZDQgZDMgZDIgZDEKLSAgICAgICAgVUFERDggICAgT3V0MCwgICB0VmFsOCwgIHIweDgwODA4MDgwICAgICAgICAgOy8vIE91dDAgPSBlNCBlMyBlMiBlMQotICAgICAgICBNX1NUUiAgICBPdXQwLCAgIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDB9ICBhdCBwRHN0IFswICB0byAzIF0KLSAgICAgICAgTU9WICAgICAgdFZhbDksICB0VmFsOSwgIExTUiAjOCAgICAgICAgICAgICAgOy8vIHRWYWw5ID0gMDAgMDAgVTMgVTIKLSAgICAgICAgTU9WICAgICAgdFZhbDEwLCBBYm92ZTQ1NjcsICBMU0wgIzggICAgICAgICAgOy8vIHRWYWwxMD0gVTYgVTUgVTQgMDAKLSAgICAgICAgUEtIQlQgICAgdFZhbDksICB0VmFsOSwgIEFib3ZlNDU2NywgTFNMICMxNiAgOy8vIHRWYWw5ID0gVTUgVTQgVTMgVTIKLSAgICAgICAgT1JSICAgICAgdFZhbDEwLCB0VmFsMTAsIHRWYWwxMSAgICAgICAgICAgICAgOy8vIHRWYWwxMD0gVTYgVTUgVTQgVTMKLSAgICAgICAgVUhBREQ4ICAgdFZhbDExLCB0VmFsOSwgIEFib3ZlMDEyMyAgICAgICAgICAgOy8vIHRWYWwxMT0gZzUgZzQgZzMgZzIKLSAgICAgICAgVUhBREQ4ICAgdFZhbDE0LCB0VmFsMiwgIHRWYWwxMCAgICAgICAgICAgICAgOy8vIHRWYWwxND0gZzYgZzUgZzQgZzMKLSAgICAgICAgTVZOICAgICAgdFZhbDgsICB0VmFsMiAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWw4ID0gVTQnVTMnVTInVTEnCi0gICAgICAgIE1WTiAgICAgIHRWYWw3LCAgdFZhbDkgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsNyA9IFU1J1U0J1UzJ1UyJwotICAgICAgICBVSFNVQjggICB0VmFsMTIsIHRWYWw5LCAgdFZhbDggICAgICAgICAgICAgICA7Ly8gdFZhbDEyPSBkNSBkNCBkMyBkMgotICAgICAgICBVSFNVQjggICB0VmFsMTEsIHRWYWwxMSwgdFZhbDggICAgICAgICAgICAgICA7Ly8gdFZhbDExPSBoNSBoNCBoMyBoMgotICAgICAgICBVSFNVQjggICB0VmFsMiwgIHRWYWwxNCwgdFZhbDcgICAgICAgICAgICAgICA7Ly8gdFZhbDIgPSBoNiBoNSBoNCBoMwotICAgICAgICBVQUREOCAgICBPdXQxLCAgIHRWYWwxMSwgcjB4ODA4MDgwODAgICAgICAgICA7Ly8gT3V0MSAgPSBpNSBpNCBpMyBpMgotICAgICAgICBVQUREOCAgICBPdXQyLCAgIHRWYWwxMiwgcjB4ODA4MDgwODAgICAgICAgICA7Ly8gT3V0MiAgPSBlNSBlNCBlMyBlMgotICAgICAgICBVQUREOCAgICBPdXQzLCAgIHRWYWwyLCAgcjB4ODA4MDgwODAgICAgICAgICA7Ly8gT3V0MyAgPSBpNiBpNSBpNCBpMwotICAgICAgICBNX1NUUiAgICBPdXQxLCAgIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDF9IGF0IHBEc3QgWzQgIHRvIDcgXQotICAgICAgICBNX1NUUiAgICBPdXQyLCAgIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDJ9IGF0IHBEc3QgWzggIHRvIDExXQotICAgICAgICBNX1NUUiAgICBPdXQzLCAgIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDN9IGF0IHBEc3QgWzEyIHRvIDE1XQotICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCi0gICAgICAgIE1fRVhJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBNYWNybyB0byBleGl0IG1pZHdheS1icmVhayBmcm0gY2FzZQotICAgICAgICAKLU9NWF9WQ180eDRfSFUKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0yCi0gICAgICAgIAotICAgICAgICBMRFIgICAgICByMHgwMTAxMDEwMSwgID1NVUxfQ09OU1QwICAgICAgICAgICA7Ly8gMHgwMTAxMDEwMQotICAgICAgICBNX0xEUkIgICBMZWZ0MCwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDAgPSBwU3JjTGVmdFswXQotICAgICAgICBNX0xEUkIgICBMZWZ0MSwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDEgPSBwU3JjTGVmdFsxXQotICAgICAgICBNX0xEUkIgICBMZWZ0MiwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDIgPSBwU3JjTGVmdFsyXQotICAgICAgICBMRFJCICAgICBMZWZ0MywgIFtwU3JjTGVmdF0gICAgICAgICAgICAgICAgICA7Ly8gTGVmdDMgPSBwU3JjTGVmdFszXQotICAgICAgICBNT1YgICAgICByMHg4MDgwODA4MCwgIHIweDAxMDEwMTAxLCBMU0wgIzcgICA7Ly8gMHg4MDgwODA4MAotICAgICAgICBPUlIgICAgICB0VmFsNiwgIExlZnQwLCAgTGVmdDEsICBMU0wgIzE2ICAgICA7Ly8gdFZhbDYgPSAwMCBMMSAwMCBMMAotICAgICAgICBPUlIgICAgICB0VmFsNywgIExlZnQxLCAgTGVmdDIsICBMU0wgIzE2ICAgICA7Ly8gdFZhbDcgPSAwMCBMMiAwMCBMMQotICAgICAgICBPUlIgICAgICB0VmFsMTEsIExlZnQyLCAgTGVmdDMsICBMU0wgIzE2ICAgICA7Ly8gdFZhbDExPSAwMCBMMyAwMCBMMgotICAgICAgICBNVUwgICAgICBPdXQzLCAgIExlZnQzLCAgcjB4MDEwMTAxMDEgICAgICAgICA7Ly8gT3V0MyAgPSBMMyBMMyBMMyBMMwotICAgICAgICBNVk4gICAgICB0VmFsOCwgIHRWYWw3ICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDggPSAwMCBMMicwMCBMMScKLSAgICAgICAgTVZOICAgICAgdFZhbDEwLCB0VmFsMTEgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWwxMD0gMDAgTDMnMDAgTDInCi0gICAgICAgIFVIQUREOCAgIHRWYWw0LCAgdFZhbDYsICB0VmFsMTEgICAgICAgICAgICAgIDsvLyB0VmFsNCA9IDAwIGczIDAwIGcyCi0gICAgICAgIFVYVEIxNiAgIHRWYWwxMiwgT3V0MyAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsMTI9IDAwIEwzIDAwIEwzCi0gICAgICAgIFVIU1VCOCAgIHRWYWw0LCAgdFZhbDQsICB0VmFsOCAgICAgICAgICAgICAgIDsvLyB0VmFsNCA9IDAwIGgzIDAwIGgyCi0gICAgICAgIFVIU1VCOCAgIHRWYWw2LCAgdFZhbDYsICB0VmFsOCAgICAgICAgICAgICAgIDsvLyB0VmFsNiA9IDAwIGQyIDAwIGQxCi0gICAgICAgIFVIU1VCOCAgIHRWYWwxMSwgdFZhbDExLCB0VmFsOCAgICAgICAgICAgICAgIDsvLyB0VmFsMTE9IDAwIGQzIDAwIGQyCi0gICAgICAgIFVIQUREOCAgIHRWYWwxMiwgdFZhbDEyLCB0VmFsNyAgICAgICAgICAgICAgIDsvLyB0VmFsMTI9IDAwIGc0IDAwIGczCi0gICAgICAgIFVBREQ4ICAgIHRWYWw0LCAgdFZhbDQsICByMHg4MDgwODA4MCAgICAgICAgIDsvLyB0VmFsNCA9IDAwIGkzIDAwIGkyCi0gICAgICAgIFVIU1VCOCAgIHRWYWwxMiwgdFZhbDEyLCB0VmFsMTAgICAgICAgICAgICAgIDsvLyB0VmFsMTI9IDAwIGg0IDAwIGgzCi0gICAgICAgIFVBREQ4ICAgIHRWYWw4LCAgdFZhbDYsICByMHg4MDgwODA4MCAgICAgICAgIDsvLyB0VmFsOCA9IDAwIGUyIDAwIGUxCi0gICAgICAgIFVBREQ4ICAgIHRWYWwxMSwgdFZhbDExLCByMHg4MDgwODA4MCAgICAgICAgIDsvLyB0VmFsMTE9IDAwIGUzIDAwIGUyCi0gICAgICAgIFVBREQ4ICAgIHRWYWwxMiwgdFZhbDEyLCByMHg4MDgwODA4MCAgICAgICAgIDsvLyB0VmFsMTI9IDAwIGk0IDAwIGkzCi0gICAgICAgIE9SUiAgICAgIE91dDAsICAgdFZhbDgsICB0VmFsNCwgIExTTCAjOCAgICAgIDsvLyBPdXQwICA9IGkzIGUyIGkyIGUxCi0gICAgICAgIE9SUiAgICAgIE91dDEsICAgdFZhbDExLCB0VmFsMTIsIExTTCAjOCAgICAgIDsvLyBPdXQxICA9IGk0IGUzIGkzIGUyCi0gICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MH0gIGF0IHBEc3QgWzAgIHRvIDMgXQotICAgICAgICBQS0hUQiAgICBPdXQyLCAgIE91dDMsICAgT3V0MSwgICBBU1IgIzE2ICAgICA7Ly8gT3V0MiAgPSBMMyBMMyBpNCBlMwotICAgICAgICBNX1NUUiAgICBPdXQxLCAgIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDF9ICBhdCBwRHN0IFs0ICB0byA3IF0KLSAgICAgICAgTV9TVFIgICAgT3V0MiwgICBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQyfSAgYXQgcERzdCBbOCAgdG8gMTFdCi0gICAgICAgIFNUUiAgICAgIE91dDMsICAgW3BEc3RdICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0M30gIGF0IHBEc3QgWzEyIHRvIDE1XQotICAgICAgICBNT1YgICAgICByZXR1cm4sICAjT01YX1N0c19Ob0VycgotICAgICAgICBNX0VORAotCi0gICAgICAgIEVORElGIDsvLyBBUk0xMTM2SlMKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBFTkQKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0IGVuZHMKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXJfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgzZDdmMC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXJfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDk2NDEKLTsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLSAgICAgICAgCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgICAgCi0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1FQRGl2VGFibGUKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfVk1hdHJpeFFQTW9kVGFibGUKLSAgICAgICAgICAgIAotICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotICAgIAotCi0gICAgSUYgQVJNMTEzNkpTCi0KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wcFNyYyAgICAgICBSTiAwCi1wRHN0ICAgICAgICBSTiAxCi1RUCAgICAgICAgICBSTiAyCi0KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gU2NyYXRjaCB2YXJpYWJsZSBmb3IgVW5wYWNrMngyIAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBTcmMgICAgICAgIFJOIDkKLVZhbHVlICAgICAgIFJOIDQKLVZhbHVlMiAgICAgIFJOIDUKLUZsYWcgICAgICAgIFJOIDYKLXN0ck9mZnNldCAgIFJOIDcKLWNzdE9mZnNldCAgIFJOIDgKLQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBTY3JhdGNoIHZhcmlhYmxlCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcjB3MCAgICAgICAgUk4gIDMKLXIwdzEgICAgICAgIFJOICA0Ci0KLWMwdzAgICAgICAgIFJOICA1Ci1jMXcwICAgICAgICBSTiAgNgotCi1yZXR1cm4gICAgICBSTiAgMAotcFFQRGl2VGFibGUgUk4gIDUKLXBRUE1vZFRhYmxlICAgIFJOICA2Ci1TaGlmdCAgICAgICAgUk4gIDkKLVNjYWxlICAgICAgICBSTiAgMgotCi1UZW1wMSAgICAgICBSTiAgMwotVGVtcDIgICAgICAgUk4gIDQKLVRlbXAzICAgICAgIFJOICA3Ci1UZW1wNCAgICAgICBSTiAgOAotCi0gICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyLCByOQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgcFNyYywgW3BwU3JjXSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIHBTcmMKLSAgICAgICAgTU9WICAgICBjc3RPZmZzZXQsICMzMSAgICAgICAgICAgICAgICAgICAgICAgOy8vIFRvIGJlIHVzZWQgaW4gdGhlIGxvb3AsIHRvIGNvbXB1dGUgb2Zmc2V0Ci0gICAgICAgIAotICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICA7Ly8gRmlyc3RseSwgZmlsbCBhbGwgdGhlIGNvZWZmaWNpZW50IHZhbHVlcyBvbiB0aGUgPHBEc3Q+IGJ1ZmZlciBieSB6ZXJvCi0gICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIAotICAgICAgICBNT1YgICAgICBWYWx1ZSwgICMwICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSW5pdGlhbGl6ZSB0aGUgemVybyB2YWx1ZQotICAgICAgICBNT1YgICAgICBWYWx1ZTIsICAjMCAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSW5pdGlhbGl6ZSB0aGUgemVybyB2YWx1ZQotICAgICAgICBMRFJCICAgICBGbGFnLCAgW3BTcmNdLCAjMSAgICAgICAgICAgICAgICAgICA7Ly8gUHJlbG9hZCA8RmxhZz4gYmVmb3JlIDx1bnBhY2tMb29wPgotICAgICAgICBTVFJEICAgICBWYWx1ZSwgW3BEc3QsICMwXSAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFswXSAgPSBwRHN0WzFdICA9IHBEc3RbMl0gID0gcERzdFszXSAgPSAwCi0gICAgICAgIAotCi11bnBhY2tMb29wCi0gICAgICAgIFRTVCAgICAgIEZsYWcsICAjMHgxMCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDb21wdXRpbmcgKEZsYWcgJiAweDEwKQotICAgICAgICBMRFJTQk5FICBWYWx1ZTIsW3BTcmMsIzFdICAgICAgICAgICAgICAgICAgCi0gICAgICAgIExEUkJORSAgIFZhbHVlLCBbcFNyY10sICMyICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIGJ5dGUgd2lzZSB0byBhdm9pZCB1bmFsaWduZWQgYWNjZXNzCi0gICAgICAgIEFORCAgICAgIHN0ck9mZnNldCwgY3N0T2Zmc2V0LCBGbGFnLCBMU0wgIzEgIDsvLyBzdHJPZmZzZXQgPSAoRmxhZyAmIDE1KSA8IDE7Ci0gICAgICAgIExEUlNCRVEgIFZhbHVlLCBbcFNyY10sICMxICAgICAgICAgICAgICAgICAgIDsvLyBWYWx1ZSA9IChPTVhfVTgpICAqcFNyYysrCi0gICAgICAgIE9SUk5FICAgIFZhbHVlLFZhbHVlLFZhbHVlMiwgTFNMICM4ICAgICAgICAgIDsvLyBWYWx1ZSA9IChPTVhfVTE2KSAqcFNyYysrCi0gICAgICAgIAotICAgICAgICBUU1QgICAgICBGbGFnLCAgIzB4MjAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ29tcHV0aW5nIChGbGFnICYgMHgyMCkgdG8gY2hlY2ssIGlmIHdlJ3JlIGRvbmUKLSAgICAgICAgTERSQkVRICAgRmxhZywgIFtwU3JjXSwgIzEgICAgICAgICAgICAgICAgICAgOy8vIEZsYWcgID0gKE9NWF9VOCkgKnBTcmMrKywgZm9yIG5leHQgaXRlcmF0aW9uCi0gICAgICAgIFNUUkggICAgIFZhbHVlLCBbcERzdCwgc3RyT2Zmc2V0XSAgICAgICAgICAgIDsvLyBTdG9yZSA8VmFsdWU+IGF0IG9mZnNldCA8c3RyT2Zmc2V0PgotICAgICAgICBCRVEgICAgICB1bnBhY2tMb29wICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQnJhbmNoIHRvIHRoZSBsb29wIGJlZ2lubmluZwotICAgICAgICAKLSAgICAgICAgTERNSUEgICAgcERzdCwge3IwdzAsIHIwdzF9ICAgICAgICAgICAgICAgICAgOy8vIHIwdzAgPSB8YzF8YzB8ICYgcjB3MSA9IHxjM3xjMnwKLQotCi0gICAgICAgIFNUUiAgICAgIHBTcmMsIFtwcFNyY10gICAgICAgICAgICAgICAgICAgICAgIDsvLyBVcGRhdGUgdGhlIGJpdHN0cmVhbSBwb2ludGVyCi0gICAgICAgIAotICAgICAgICBMRFIgICAgICBwUVBEaXZUYWJsZSwgPWFybVZDTTRQMTBfUVBEaXZUYWJsZSA7Ly8gUVAgRGl2aXNpb24gbG9vay11cC10YWJsZSBiYXNlIHBvaW50ZXIKLSAgICAgICAgTERSICAgICAgcFFQTW9kVGFibGUsID1hcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlIDsvLyBRUCBNb2R1bG8gbG9vay11cC10YWJsZSBiYXNlIHBvaW50ZXIKLSAgICAgICAgCi0gICAgICAgIFNBRERTVUJYIHIwdzAsIHIwdzAsICByMHcwICAgICAgICAgICAgICAgICAgIDsvLyBbIGMwMCtjMDEsIGMwMC1jMDEgXQotICAgICAgICBTQUREU1VCWCByMHcxLCByMHcxLCAgcjB3MSAgICAgICAgICAgICAgICAgICA7Ly8gWyBjMTArYzExLCBjMTAtYzExIF0KLSAgICAgICAgCi0gICAgICAgIExEUlNCICAgIFNoaWZ0LCBbcFFQRGl2VGFibGUsIFFQXSAgICAgICAgICAgIDsvLyBTaGlmdCA9IHBRUERpdlRhYmxlW1FQXQotICAgICAgICBMRFJTQiAgICBTY2FsZSwgW3BRUE1vZFRhYmxlLCBRUF0gICAgICAgICAgICA7Ly8gU2NhbGUgPSBwUVBNb2RUYWJsZVtRUF0KLSAgICAgICAgCi0gICAgICAgIFNBREQxNiAgIGMwdzAsIHIwdzAsIHIwdzEgICAgICAgICAgICAgICAgICAgIDsvLyBbIGQwMCtkMTAsIGQwMStkMTEgXQotICAgICAgICBTU1VCMTYgICBjMXcwLCByMHcwLCByMHcxICAgICAgICAgICAgICAgICAgICA7Ly8gWyBkMDAtZDEwLCBkMDEtZDExIF0KLSAgICAgICAgCi0gICAgICAgIExTTCAgICAgIFNjYWxlLCBTY2FsZSwgU2hpZnQgICAgICAgICAgICAgICAgIDsvLyBTY2FsZSA9IFNjYWxlIDw8IFNoaWZ0Ci0gICAgICAgIAotICAgICAgICBTTVVMVEIgICBUZW1wMiwgYzB3MCwgIFNjYWxlICAgICAgICAgICAgICAgICA7Ly8gVGVtcDIgPSBUKGMwdzApICogU2NhbGUKLSAgICAgICAgU01VTFRCICAgVGVtcDQsIGMxdzAsICBTY2FsZSAgICAgICAgICAgICAgICAgOy8vIFRlbXA0ID0gVChjMXcwKSAqIFNjYWxlCi0gICAgICAgIFNNVUxCQiAgIFRlbXAxLCBjMHcwLCAgU2NhbGUgICAgICAgICAgICAgICAgIDsvLyBUZW1wMSA9IEIoYzB3MCkgKiBTY2FsZQotICAgICAgICBTTVVMQkIgICBUZW1wMywgYzF3MCwgIFNjYWxlICAgICAgICAgICAgICAgICA7Ly8gVGVtcDMgPSBCKGMxdzApICogU2NhbGUKLSAgICAgICAgTU9WICAgICAgVGVtcDIsIFRlbXAyLCBBU1IgIzEgICAgICAgICAgICAgICAgOy8vIFRlbXAyID0gVGVtcDIgPj4gMSAmIFRlbXAxID0gKFRlbXAxID4+IDEpIDw8IDE2Ci0gICAgICAgIE1PViAgICAgIFRlbXA0LCBUZW1wNCwgQVNSICMxICAgICAgICAgICAgICAgIDsvLyBUZW1wNCA9IFRlbXA0ID4+IDEgJiBUZW1wMyA9IChUZW1wMyA+PiAxKSA8PCAxNgotICAgICAgICBQS0hCVCAgICBjMHcwLCAgVGVtcDIsIFRlbXAxLCBMU0wgIzE1ICAgICAgICA7Ly8gYzB3MCAgPSB8IFRlbXAxIHwgVGVtcDIgfAotICAgICAgICBQS0hCVCAgICBjMXcwLCAgVGVtcDQsIFRlbXAzLCBMU0wgIzE1ICAgICAgICA7Ly8gYzF3MCAgPSB8IFRlbXAzIHwgVGVtcDQgfAotICAgICAgICBTVE1JQSAgICBwRHN0LCB7YzB3MCwgYzF3MH0gICAgICAgICAgICAgICAgICA7Ly8gU3RvcmluZyBhbGwgdGhlIGNvZWZmaWNpZW50cyBhdCBvbmNlCi0gICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgTV9FTkQKLSAgICAgICAgCi0gICAgRU5ESUYgOy8vIEFSTTExMzZKUwotICAgIAotICAgIAotICAgIAotICAgIAotICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcl9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk3NGNkMS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyX3MucworKysgL2Rldi9udWxsCkBAIC0xLDQ4MyArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXJfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgOTY0MQotOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLTsvLyBEZXNjcmlwdGlvbjoKLTsvLyBILjI2NCBpbnZlcnNlIHF1YW50aXplIGFuZCB0cmFuc2Zvcm0gbW9kdWxlCi07Ly8gCi07Ly8gCi0KLTsvLyBJbmNsdWRlIHN0YW5kYXJkIGhlYWRlcnMKLQotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAgIAotOy8vIEltcG9ydC9FeHBvcnQgc3ltYm9scyByZXF1aXJlZCBmcm9tL3RvIG90aGVyIGZpbGVzCi07Ly8gKEZvciBleGFtcGxlIHRhYmxlcykKLSAgICAgICAgCi0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0IAotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9RUERpdlRhYmxlCi0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlCi0gICAgICAgIAotICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotCi07Ly8gU2V0IGRlYnVnZ2luZyBsZXZlbCAgICAgICAgCi07Ly9ERUJVR19PTiAgICBTRVRMIHtUUlVFfQotCi0KLTsvLyBTdGF0aWMgRnVuY3Rpb246IGFybVZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudEx1bWFEQzR4NAotICAgIAotCi07Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCi0gICAgCi0gICAgSUYgIEFSTTExMzZKUyAKLQotCi07Ly9JbnB1dCBSZWdpc3RlcnMKLXBEYXRhICAgICAgICAgICAgICAgUk4gIDAKLVFQICAgICAgICAgICAgICAgICAgUk4gIDEKLQotOy8vT3V0cHV0IFJlZ2lzdGVycwotCi0KLTsvL0xvY2FsIFNjcmF0Y2ggUmVnaXN0ZXJzCi0KLTsvLyBQYWNrZWQgSW5wdXQgcGl4ZWxzCi1pbjAwICAgICAgICAgICAgICAgIFJOICAyICAgICAgICAgICAgICAgICAgIDsvLyBTcmNbMF0gJiBTcmNbMV0gCi1pbjAyICAgICAgICAgICAgICAgIFJOICAzICAgICAgICAgICAgICAgICAgIDsvLyBTcmNbMl0gJiBTcmNbM10KLWluMTAgICAgICAgICAgICAgICAgUk4gIDQgICAgICAgICAgICAgICAgICAgOy8vIFNyY1s0XSAmIFNyY1s1XQotaW4xMiAgICAgICAgICAgICAgICBSTiAgNSAgICAgICAgICAgICAgICAgICA7Ly8gU3JjWzZdICYgU3JjWzddCi1pbjIwICAgICAgICAgICAgICAgIFJOICA2ICAgICAgICAgICAgICAgICAgIDsvLyBTcmNbOF0gJiBTcmNbOV0KLWluMjIgICAgICAgICAgICAgICAgUk4gIDcgICAgICAgICAgICAgICAgICAgOy8vIFNyY1sxMF0gJiBTcmNbMTFdCi1pbjMwICAgICAgICAgICAgICAgIFJOICA4ICAgICAgICAgICAgICAgICAgIDsvLyBTcmNbMTJdICYgU3JjWzEzXQotaW4zMiAgICAgICAgICAgICAgICBSTiAgOSAgICAgICAgICAgICAgICAgICA7Ly8gU3JjWzE0XSAmIFNyY1sxNV0KLQotOy8vIFRyYW5zcG9zZSBmb3IgUm93IG9wZXJhdGlvbnMgKFJvd3MgdG8gY29scykKLXRyUm93MDAgICAgICAgICAgICAgUk4gIDIKLXRyUm93MTAgICAgICAgICAgICAgUk4gIDEwCi10clJvdzAyICAgICAgICAgICAgIFJOICAzCi10clJvdzEyICAgICAgICAgICAgIFJOICA1Ci10clJvdzIwICAgICAgICAgICAgIFJOICAxMQotdHJSb3czMCAgICAgICAgICAgICBSTiAgMTIKLXRyUm93MzIgICAgICAgICAgICAgUk4gIDE0Ci10clJvdzIyICAgICAgICAgICAgIFJOICA3Ci0KLTsvLyBJbnRlcm1lZGlhdGUgY2FsY3VsYXRpb25zCi1yb3dTdW0xICAgICAgICAgICAgIFJOICA0Ci1yb3dTdW0yICAgICAgICAgICAgIFJOICA2Ci1yb3dEaWZmMSAgICAgICAgICAgIFJOICA4Ci1yb3dEaWZmMiAgICAgICAgICAgIFJOICA5Ci0KLQotOy8vIFJvdyBvcGVyYXRlZCBwaXhlbHMKLXJvd09wMDAgICAgICAgICAgICAgUk4gIDIKLXJvd09wMTAgICAgICAgICAgICAgUk4gIDEwCi1yb3dPcDIwICAgICAgICAgICAgIFJOICAxMQotcm93T3AzMCAgICAgICAgICAgICBSTiAgMTIKLXJvd09wMDIgICAgICAgICAgICAgUk4gIDMKLXJvd09wMTIgICAgICAgICAgICAgUk4gIDUKLXJvd09wMjIgICAgICAgICAgICAgUk4gIDcKLXJvd09wMzIgICAgICAgICAgICAgUk4gIDE0Ci0KLTsvLyBUcmFuc3Bvc2UgZm9yIGNvbHVsbW4gb3BlcmF0aW9ucwotdHJDb2wwMCAgICAgICAgICAgICBSTiAgMiAgICAgICAgICAgICAgICAgICAKLXRyQ29sMDIgICAgICAgICAgICAgUk4gIDMgICAgICAgICAgICAgICAgICAgCi10ckNvbDEwICAgICAgICAgICAgIFJOICA0ICAgICAgICAgICAgICAgICAgIAotdHJDb2wxMiAgICAgICAgICAgICBSTiAgNSAgICAgICAgICAgICAgICAgICAKLXRyQ29sMjAgICAgICAgICAgICAgUk4gIDYgICAgICAgICAgICAgICAgICAgCi10ckNvbDIyICAgICAgICAgICAgIFJOICA3ICAgICAgICAgICAgICAgICAgIAotdHJDb2wzMCAgICAgICAgICAgICBSTiAgOCAgICAgICAgICAgICAgICAgICAKLXRyQ29sMzIgICAgICAgICAgICAgUk4gIDkgIAotCi07Ly8gSW50ZXJtZWRpYXRlIGNhbGN1bGF0aW9ucwotY29sU3VtMSAgICAgICAgICAgICBSTiAgMTAKLWNvbFN1bTIgICAgICAgICAgICAgUk4gIDExCi1jb2xEaWZmMSAgICAgICAgICAgIFJOICAxMgotY29sRGlmZjIgICAgICAgICAgICBSTiAgMTQKLQotCi07Ly8gQ29sb3VtbiBvcGVyYXRlZCBwaXhlbHMKLWNvbE9wMDAgICAgICAgICAgICAgUk4gIDIgICAgICAgICAgICAgICAgICAgCi1jb2xPcDAyICAgICAgICAgICAgIFJOICAzICAgICAgICAgICAgICAgICAgIAotY29sT3AxMCAgICAgICAgICAgICBSTiAgNCAgICAgICAgICAgICAgICAgICAKLWNvbE9wMTIgICAgICAgICAgICAgUk4gIDUgICAgICAgICAgICAgICAgICAgCi1jb2xPcDIwICAgICAgICAgICAgIFJOICA2ICAgICAgICAgICAgICAgICAgIAotY29sT3AyMiAgICAgICAgICAgICBSTiAgNyAgICAgICAgICAgICAgICAgICAKLWNvbE9wMzAgICAgICAgICAgICAgUk4gIDggICAgICAgICAgICAgICAgICAgCi1jb2xPcDMyICAgICAgICAgICAgIFJOICA5ICAKLQotOy8vIFRlbXBvcmFyeSBzY3JhdGNoIHZhcmFpYmxlcwotcFFQRGl2VGFibGUgICAgICAgICBSTiAgMAotcFFQTW9kVGFibGUgICAgICAgICBSTiAgMTEKLVNoaWZ0ICAgICAgICAgICAgICAgUk4gIDEwCi1TY2FsZSAgICAgICAgICAgICAgIFJOICAxNAotUm91bmQgICAgICAgICAgICAgICBSTiAgMAotCi10ZW1wMSAgICAgICAgICAgICAgIFJOICAxMAotdGVtcDIgICAgICAgICAgICAgICAgUk4gIDExCi10ZW1wMyAgICAgICAgICAgICAgIFJOICAxMgotdGVtcDQgICAgICAgICAgICAgICBSTiAgMQotCi0KLQotOy8vIEludlRyYW5zZm9ybWVkIGFuZCBEZXF1YW50aXplZCBwaXhlbHMKLW91dDAwICAgICAgICAgICAgICAgUk4gIDIgICAgICAgICAgICAgICAgICAgCi1vdXQwMiAgICAgICAgICAgICAgIFJOICAzICAgICAgICAgICAgICAgICAgIAotb3V0MTAgICAgICAgICAgICAgICBSTiAgNCAgICAgICAgICAgICAgICAgICAKLW91dDEyICAgICAgICAgICAgICAgUk4gIDUgICAgICAgICAgICAgICAgICAgCi1vdXQyMCAgICAgICAgICAgICAgIFJOICA2ICAgICAgICAgICAgICAgICAgIAotb3V0MjIgICAgICAgICAgICAgICBSTiAgNyAgICAgICAgICAgICAgICAgICAKLW91dDMwICAgICAgICAgICAgICAgUk4gIDggICAgICAgICAgICAgICAgICAgCi1vdXQzMiAgICAgICAgICAgICAgIFJOICA5ICAKLSAgICAgIAotICAgICAgICAKLQotICAgICAgIAotICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgcmVxdWlyZWQgYnkgdGhlIGZ1bmN0aW9uCi0gICAgICAgIE1fQUxMT0M0ICAgIHBEYXRhT25TdGFjaywgNAotCi0gICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudEx1bWFEQzR4NCxyMTEKLSAgICAgICAgCi0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgOy8vIFRoZSBzdHJhdGVneSB1c2VkIGluIGltcGxlbWVudGluZyB0aGUgdHJhbnNmb3JtIGlzIGFzIGZvbGxvd3M6KgotICAgICAgICA7Ly8gTG9hZCB0aGUgNHg0IGJsb2NrIGludG8gOCByZWdpc3RlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAKLSAgICAgICAgOy8vIFRyYW5zcG9zZSB0aGUgNHg0IG1hdHJpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgCi0gICAgICAgIDsvLyBQZXJmb3JtIHRoZSByb3cgb3BlcmF0aW9ucyAob24gY29sdW1ucykgdXNpbmcgU0lNRCAgICAgICAgICAgICogIAotICAgICAgICA7Ly8gVHJhbnNwb3NlIHRoZSA0eDQgcmVzdWx0IG1hdHJpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAKLSAgICAgICAgOy8vIFBlcmZvcm0gdGhlIGNvbG91bW4gb3BlcmF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgICAgICA7Ly8gU3RvcmUgdGhlIDR4NCBibG9jayBhdCBvbmUgZ28gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAKLSAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgICAgIDsvLyBMb2FkIGFsbCB0aGUgNHg0IHBpeGVscwotICAgICAgICAKLSAgICAgICAgTERNSUEgICBwRGF0YSx7aW4wMCxpbjAyLGluMTAsaW4xMixpbjIwLGluMjIsaW4zMCxpbjMyfQotICAgICAgICAKLSAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBUcmFuc3Bvc2UgdGhlIG1hdHJpeCBpbm9yZGVyIHRvIHBlcmZvcm0gcm93IG9wcyBhcyBjb2xvdW1uIG9wcwotICAgICAgICA7Ly8gSW5wdXQ6ICAgaW5bXVtdID0gb3JpZ2luYWwgbWF0cml4Ci0gICAgICAgIDsvLyBPdXRwdXQ6ICB0clJvd1tdW109IHRyYW5zcG9zZWQgbWF0cml4Ci0gICAgICAgIDsvLyBTdGVwMTogT2J0YWluIHRoZSBMTCBwYXJ0IG9mIHRoZSB0cmFuc3Bvc2VkIG1hdHJpeAotICAgICAgICA7Ly8gU3RlcDI6IE9idGFpbiB0aGUgSEwgcGFydAotICAgICAgICA7Ly8gc3RlcDM6IE9idGFpbiB0aGUgTEggcGFydAotICAgICAgICA7Ly8gU3RlcDQ6IE9idGFpbiB0aGUgSEggcGFydAotICAgICAgICA7Ly8KLSAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgCi0gICAgICAgIDsvLyBMTCAyeDIgdHJhbnNwb3NlZCBtYXRyaXggCi0gICAgICAgIDsvLyAgIGQwIGQxIC0gLQotICAgICAgICA7Ly8gICBkNCBkNSAtIC0KLSAgICAgICAgOy8vICAgLSAgLSAgLSAtCi0gICAgICAgIDsvLyAgIC0gIC0gIC0gLQotICAgICAgICAKLSAgICAgICAgUEtIVEIgICB0clJvdzEwLGluMTAsaW4wMCxBU1IgIzE2ICAgICAgICAgICAgICAgOy8vIFs1IDRdID0gW2Y1OmYxXSAgICAKLSAgICAgICAgUEtIQlQgICB0clJvdzAwLGluMDAsaW4xMCxMU0wgIzE2ICAgICAgICAgICAgICAgOy8vIFsxIDBdID0gW2Y0OmYwXSAgCi0gICAgICAgIAotICAgICAgICA7Ly8gSEwgMngyIHRyYW5zcG9zZWQgbWF0cml4ICAKLSAgICAgICAgOy8vICAgIC0gICAtICAgLSAtCi0gICAgICAgIDsvLyAgICAtICAgLSAgIC0gLQotICAgICAgICA7Ly8gICAgZDggIGQ5ICAtIC0KLSAgICAgICAgOy8vICAgZDEyIGQxMyAgLSAtCi0gICAgICAgIAotICAgICAgICAgCi0gICAgICAgICBQS0hUQiAgIHRyUm93MzAsaW4xMixpbjAyLEFTUiAjMTYgICAgICAgICAgICAgIDsvLyBbMTMgMTJdID0gWzcgM10KLSAgICAgICAgIFBLSEJUICAgdHJSb3cyMCxpbjAyLGluMTIsTFNMICMxNiAgICAgICAgICAgICAgOy8vIFs5IDhdID0gWzYgMl0gCi0gICAgICAgIAotICAgICAgICA7Ly8gTEggMngyIHRyYW5zcG9zZWQgbWF0cml4IAotICAgICAgICA7Ly8gICAtIC0gZDIgZDMgCi0gICAgICAgIDsvLyAgIC0gLSBkNiBkNyAKLSAgICAgICAgOy8vICAgLSAtIC0gIC0KLSAgICAgICAgOy8vICAgLSAtIC0gIC0KLSAgICAgICAgCi0gICAgICAgIFBLSEJUICAgdHJSb3cwMixpbjIwLGluMzAsTFNMICMxNiAgICAgICAgICAgICAgIDsvLyBbMyAyXSA9IFtmMTI6ZjhdICAKLSAgICAgICAgUEtIVEIgICB0clJvdzEyLGluMzAsaW4yMCxBU1IgIzE2ICAgICAgICAgICAgICAgOy8vIFs3IDZdID0gW2YxMzpmOV0gCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAKLSAgICAgICAgOy8vIEhIIDJ4MiB0cmFuc3Bvc2VkIG1hdHJpeCAgCi0gICAgICAgIDsvLyAgICAtIC0gICAtICAgLQotICAgICAgICA7Ly8gICAgLSAtICAgLSAgIC0KLSAgICAgICAgOy8vICAgIC0gLSAgZDEwIGQxMQotICAgICAgICA7Ly8gICAgLSAtICBkMTQgZDE1Ci0gICAgICAgIAotICAgICAgICBQS0hUQiAgIHRyUm93MzIsaW4zMixpbjIyLEFTUiAjMTYgICAgICAgICAgICAgICA7Ly8gWzE1IDE0XSA9IFsxNSAxMV0KLSAgICAgICAgUEtIQlQgICB0clJvdzIyLGluMjIsaW4zMixMU0wgIzE2ICAgICAgICAgICAgICAgOy8vIFsxMSAxMF0gPSBbMTQgMTBdCi0gICAgICAgCi0gICAgICAgIAotICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAgICAgICAgOy8vIFJvdyBPcGVyYXRpb25zIChQZXJmb3JtZWQgb24gY29sdW1ucykKLSAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIFNJTUQgb3BlcmF0aW9ucyBvbiBmaXJzdCB0d28gY29sdW1ucyh0d28gcm93cyBvZiB0aGUgb3JpZ2luYWwgbWF0cml4KQotICAgICAgICAKLSAgICAgICAgU0FERDE2ICAgICAgcm93U3VtMSx0clJvdzAwLHRyUm93MTAgICAgICAgICAgICAgICAgOy8vIChjMCtjMSkKLSAgICAgICAgU0FERDE2ICAgICAgcm93U3VtMix0clJvdzIwLHRyUm93MzAgICAgICAgICAgICAgICAgOy8vIChjMitjMykKLSAgICAgICAgU1NVQjE2ICAgICAgcm93RGlmZjEsdHJSb3cwMCx0clJvdzEwICAgICAgICAgICAgICAgOy8vIChjMC1jMSkKLSAgICAgICAgU1NVQjE2ICAgICAgcm93RGlmZjIsdHJSb3cyMCx0clJvdzMwICAgICAgICAgICAgICAgOy8vIChjMi1jMykKLSAgICAgICAgU0FERDE2ICAgICAgcm93T3AwMCxyb3dTdW0xLHJvd1N1bTIgICAgICAgICAgICAgICAgOy8vIChjMCtjMStjMitjMykKLSAgICAgICAgU1NVQjE2ICAgICAgcm93T3AxMCxyb3dTdW0xLHJvd1N1bTIgICAgICAgICAgICAgICAgOy8vIChjMCtjMS1jMi1jMykKLSAgICAgICAgU1NVQjE2ICAgICAgcm93T3AyMCxyb3dEaWZmMSxyb3dEaWZmMiAgICAgICAgICAgICAgOy8vIChjMC1jMS1jMitjMykKLSAgICAgICAgU0FERDE2ICAgICAgcm93T3AzMCxyb3dEaWZmMSxyb3dEaWZmMiAgICAgICAgICAgICAgOy8vIChjMC1jMStjMi1jMykKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIDsvLyBTSU1EIG9wZXJhdGlvbnMgb24gbmV4dCB0d28gY29sdW1ucyhuZXh0IHR3byByb3dzIG9mIHRoZSBvcmlnaW5hbCBtYXRyaXgpCi0gICAgICAgIAotICAgICAgICBTQUREMTYgICAgICByb3dTdW0xLHRyUm93MDIsdHJSb3cxMiAgICAgICAgICAgICAgICA7Ly8gKGMwK2MxKQotICAgICAgICBTQUREMTYgICAgICByb3dTdW0yLHRyUm93MjIsdHJSb3czMiAgICAgICAgICAgICAgICA7Ly8gKGMyK2MzKQotICAgICAgICBTU1VCMTYgICAgICByb3dEaWZmMSx0clJvdzAyLHRyUm93MTIgICAgICAgICAgICAgICA7Ly8gKGMwLWMxKQotICAgICAgICBTU1VCMTYgICAgICByb3dEaWZmMix0clJvdzIyLHRyUm93MzIgICAgICAgICAgICAgICA7Ly8gKGMyLWMzKQotICAgICAgICBTQUREMTYgICAgICByb3dPcDAyLHJvd1N1bTEscm93U3VtMiAgICAgICAgICAgICAgICA7Ly8gKGMwK2MxK2MyK2MzKQotICAgICAgICBTU1VCMTYgICAgICByb3dPcDEyLHJvd1N1bTEscm93U3VtMiAgICAgICAgICAgICAgICA7Ly8gKGMwK2MxLWMyLWMzKQotICAgICAgICBTU1VCMTYgICAgICByb3dPcDIyLHJvd0RpZmYxLHJvd0RpZmYyICAgICAgICAgICAgICA7Ly8gKGMwLWMxLWMyK2MzKQotICAgICAgICBTQUREMTYgICAgICByb3dPcDMyLHJvd0RpZmYxLHJvd0RpZmYyICAgICAgICAgICAgICA7Ly8gKGMwLWMxK2MyLWMzKQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgOy8vIFRyYW5zcG9zZSB0aGUgcmVzdWx0YW50IG1hdHJpeAotICAgICAgICA7Ly8gSW5wdXQ6ICByb3dPcFtdW10KLSAgICAgICAgOy8vIE91dHB1dDogdHJDb2xbXVtdIAotICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgCi0gICAgICAgIDsvLyBMTCAyeDIgdHJhbnNwb3NlZCBtYXRyaXggCi0gICAgICAgIDsvLyAgIGQwIGQxIC0gLQotICAgICAgICA7Ly8gICBkNCBkNSAtIC0KLSAgICAgICAgOy8vICAgLSAgLSAgLSAtCi0gICAgICAgIDsvLyAgIC0gIC0gIC0gLQotICAgICAgICAKLSAgICAgICAgUEtIVEIgICB0ckNvbDEwLHJvd09wMTAscm93T3AwMCxBU1IgIzE2ICAgICAgICAgICA7Ly8gWzUgNF0gPSBbZjU6ZjFdCi0gICAgICAgIFBLSEJUICAgdHJDb2wwMCxyb3dPcDAwLHJvd09wMTAsTFNMICMxNiAgICAgICAgICAgOy8vIFsxIDBdID0gW2Y0OmYwXSAgCi0gICAgICAgIAotICAgICAgICA7Ly8gSEwgMngyIHRyYW5zcG9zZWQgbWF0cml4ICAKLSAgICAgICAgOy8vICAgIC0gICAtICAgLSAtCi0gICAgICAgIDsvLyAgICAtICAgLSAgIC0gLQotICAgICAgICA7Ly8gICAgZDggIGQ5ICAtIC0KLSAgICAgICAgOy8vICAgZDEyIGQxMyAgLSAtCi0gICAgICAgIAotICAgICAgICAgCi0gICAgICAgICBQS0hUQiAgIHRyQ29sMzAscm93T3AxMixyb3dPcDAyLEFTUiAjMTYgICAgICAgICAgOy8vIFsxMyAxMl0gPSBbNyAzXQotICAgICAgICAgUEtIQlQgICB0ckNvbDIwLHJvd09wMDIscm93T3AxMixMU0wgIzE2ICAgICAgICAgIDsvLyBbOSA4XSA9IFs2IDJdIAotICAgICAgICAKLSAgICAgICAgOy8vIExIIDJ4MiB0cmFuc3Bvc2VkIG1hdHJpeCAKLSAgICAgICAgOy8vICAgLSAtIGQyIGQzIAotICAgICAgICA7Ly8gICAtIC0gZDYgZDcgCi0gICAgICAgIDsvLyAgIC0gLSAtICAtCi0gICAgICAgIDsvLyAgIC0gLSAtICAtCi0gICAgICAgIAotICAgICAgICBQS0hCVCAgIHRyQ29sMDIscm93T3AyMCxyb3dPcDMwLExTTCAjMTYgICAgICAgICAgIDsvLyBbMyAyXSA9IFtmMTI6ZjhdICAKLSAgICAgICAgUEtIVEIgICB0ckNvbDEyLHJvd09wMzAscm93T3AyMCxBU1IgIzE2ICAgICAgICAgICA7Ly8gWzcgNl0gPSBbZjEzOmY5XSAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgIAotICAgICAgICA7Ly8gSEggMngyIHRyYW5zcG9zZWQgbWF0cml4ICAKLSAgICAgICAgOy8vICAgIC0gLSAgIC0gICAtCi0gICAgICAgIDsvLyAgICAtIC0gICAtICAgLQotICAgICAgICA7Ly8gICAgLSAtICBkMTAgZDExCi0gICAgICAgIDsvLyAgICAtIC0gIGQxNCBkMTUKLSAgICAgICAgCi0gICAgICAgIFBLSFRCICAgdHJDb2wzMixyb3dPcDMyLHJvd09wMjIsQVNSICMxNiAgICAgICAgICAgIDsvLyBbMTUgMTRdID0gWzE1IDExXQotICAgICAgICBQS0hCVCAgIHRyQ29sMjIscm93T3AyMixyb3dPcDMyLExTTCAjMTYgICAgICAgICAgICA7Ly8gWzExIDEwXSA9IFsxNCAxMF0KLSAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICAgICAgICA7Ly8gQ29sb3VtbiBPcGVyYXRpb25zIAotICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAgICAgICAgCi0gICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIDsvLyBTdG9yZSBwRGF0YShSTjApIG9uIHN0YWNrIGFuZCByZXN0b3JlIGl0IG9ubHkgYXQgdGhlIGZpbmFsIHN0b3JlIGJhY2sKLSAgICAgICAgOy8vIFRoaXMgZnJlZXMgdXAgYSByZWdpc3RlciAoUk4wKSB3aGljaCBpcyB1c2VkIHRvIHJlZHVjZSBudW1iZXIgb2YgaW50ZXJtZWRpYXRlIHN0YWxscyAKLSAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgTV9TVFIgICAgICAgcERhdGEscERhdGFPblN0YWNrCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIFNJTUQgb3BlcmF0aW9ucyBvbiBmaXJzdCB0d28gY29sdW1ucyh0d28gcm93cyBvZiB0aGUgb3JpZ2luYWwgbWF0cml4KQotICAgICAgICAgICAgICAgIAotICAgICAgICBTQUREMTYgICAgICBjb2xTdW0xLHRyQ29sMDAsdHJDb2wxMCAgICAgICAgICAgICAgICA7Ly8gKGMwK2MxKQotICAgICAgICBTQUREMTYgICAgICBjb2xTdW0yLHRyQ29sMjAsdHJDb2wzMCAgICAgICAgICAgICAgICA7Ly8gKGMyK2MzKQotICAgICAgICBTU1VCMTYgICAgICBjb2xEaWZmMSx0ckNvbDAwLHRyQ29sMTAgICAgICAgICAgICAgICA7Ly8gKGMwLWMxKQotICAgICAgICBTU1VCMTYgICAgICBjb2xEaWZmMix0ckNvbDIwLHRyQ29sMzAgICAgICAgICAgICAgICA7Ly8gKGMyLWMzKQotICAgICAgICBTQUREMTYgICAgICBjb2xPcDAwLGNvbFN1bTEsY29sU3VtMiAgICAgICAgICAgICAgICA7Ly8gKGMwK2MxK2MyK2MzKQotICAgICAgICBTU1VCMTYgICAgICBjb2xPcDEwLGNvbFN1bTEsY29sU3VtMiAgICAgICAgICAgICAgICA7Ly8gKGMwK2MxLWMyLWMzKQotICAgICAgICBTU1VCMTYgICAgICBjb2xPcDIwLGNvbERpZmYxLGNvbERpZmYyICAgICAgICAgICAgICA7Ly8gKGMwLWMxLWMyK2MzKQotICAgICAgICBTQUREMTYgICAgICBjb2xPcDMwLGNvbERpZmYxLGNvbERpZmYyICAgICAgICAgICAgICA7Ly8gKGMwLWMxK2MyLWMzKQotICAgICAgICAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgOy8vIFNJTUQgb3BlcmF0aW9ucyBvbiBuZXh0IHR3byBjb2x1bW5zKG5leHQgdHdvIHJvd3Mgb2YgdGhlIG9yaWdpbmFsIG1hdHJpeCkKLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgIHBRUERpdlRhYmxlLCA9YXJtVkNNNFAxMF9RUERpdlRhYmxlICAgIDsvLyBRUCBEaXZpc2lvbiBsb29rLXVwLXRhYmxlIGJhc2UgcG9pbnRlcgotICAgICAgICBTQUREMTYgICAgICBjb2xTdW0xLHRyQ29sMDIsdHJDb2wxMiAgICAgICAgICAgICAgICA7Ly8gKGMwK2MxKQotICAgICAgICBTQUREMTYgICAgICBjb2xTdW0yLHRyQ29sMjIsdHJDb2wzMiAgICAgICAgICAgICAgICA7Ly8gKGMyK2MzKQotICAgICAgICBTU1VCMTYgICAgICBjb2xEaWZmMSx0ckNvbDAyLHRyQ29sMTIgICAgICAgICAgICAgICA7Ly8gKGMwLWMxKQotICAgICAgICBTU1VCMTYgICAgICBjb2xEaWZmMix0ckNvbDIyLHRyQ29sMzIgICAgICAgICAgICAgICA7Ly8gKGMyLWMzKQotICAgICAgICBTQUREMTYgICAgICBjb2xPcDAyLGNvbFN1bTEsY29sU3VtMiAgICAgICAgICAgICAgICA7Ly8gKGMwK2MxK2MyK2MzKQotICAgICAgICBTU1VCMTYgICAgICBjb2xPcDEyLGNvbFN1bTEsY29sU3VtMiAgICAgICAgICAgICAgICA7Ly8gKGMwK2MxLWMyLWMzKQotICAgICAgICBMRFIgICAgICAgICBwUVBNb2RUYWJsZSwgPWFybVZDTTRQMTBfVk1hdHJpeFFQTW9kVGFibGUgOy8vIFFQIE1vZHVsbyBsb29rLXVwLXRhYmxlIGJhc2UgcG9pbnRlcgotICAgICAgICBMRFJTQiAgICAgICBTaGlmdCwgW3BRUERpdlRhYmxlLCBRUF0gICAgICAgICAgICAgICA7Ly8gU2hpZnQgPSBwUVBEaXZUYWJsZVtRUF0KLSAgICAgICAgU1NVQjE2ICAgICAgY29sT3AyMixjb2xEaWZmMSxjb2xEaWZmMiAgICAgICAgICAgICAgOy8vIChjMC1jMS1jMitjMykKLSAgICAgICAgU0FERDE2ICAgICAgY29sT3AzMixjb2xEaWZmMSxjb2xEaWZmMiAgICAgICAgICAgICAgOy8vIChjMC1jMStjMi1jMykKLSAgICAgICAgCi0gICAgICAgICAgICAgICAKLSAgICAgICAgTERSU0IgICAgICAgU2NhbGUsIFtwUVBNb2RUYWJsZSwgUVBdICAgICAgICAgICAgICAgOy8vIFNjYWxlID0gcFFQTW9kVGFibGVbUVBdIAotICAgICAgICAKLSAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIDxEZXF1YW50aXplPiBpbXByb3ZlcyBvbiB0aGUgYy1yZWZlcmVuY2UgY29kZQotICAgICAgICA7Ly8gQm90aCB0aGUgIGNhc2VzIGkuZS4sIFNoaWZ0Pj0wIGFuZCBTaGlmdDwwIGNhc2VzIGFyZSBjb3ZlcmVkIHRvZ2V0aGVyCi0gICAgICAgIDsvLyBXZSBkbyBub3Qgc3VidHJhY3QgMiBmcm9tIFNoaWZ0IGFzIGluIEMgcmVmZXJlbmNlLCBpbnN0ZWFkIHBlcmZvcm0gYQotICAgICAgICA7Ly8gU2NhbGUgPDwgU2hpZnQgb25jZSBpbiB0aGUgYmVnaW5uaW5nIGFuZCBkbyBhIHJpZ2h0IHNoaWZ0IGJ5IGEgCi0gICAgICAgIDsvLyBjb25zdGFudCAyIGFmdGVyIHRoZSBNdWx0aXBsaWNhdGlvbi4gVGhlIHZhbHVlIG9mIFJvdW5kIHdvdWxkIGJlIDIgCi0gICAgICAgIDsvLyAKLSAgICAgICAgOy8vIEJ5IGRvaW5nIHRoaXMgd2UgYXZpb2QgdGhlIEJyYW5jaGVzIHJlcXVpcmVkIGFuZCBhbHNvIAotICAgICAgICA7Ly8gcmVkdWNlIHRoZSBjb2RlIHNpemUgc3Vic3RhbnRpYWxseQotICAgICAgICA7Ly8gCi0gICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgICAgIFJvdW5kLCAjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUm91bmQgPSAyCi0gICAgICAgIExTTCAgICAgICAgIFNjYWxlLCBTY2FsZSwgU2hpZnQgICAgICAgICAgICAgICAgICAgICA7Ly8gU2NhbGUgPSBTY2FsZSA8PCBTaGlmdAotICAgICAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIFJvdyAxCi0gICAgICAgIFNNTEFCQiAgdGVtcDEsIGNvbE9wMDAsIFNjYWxlLCBSb3VuZCAgICAgICAgICAgICAgICA7Ly8gVGVtcDEgPSBCKGMwdzApICogU2NhbGUgKyBSb3VuZAotICAgICAgICBTTUxBQkIgIHRlbXAzLCBjb2xPcDAyLCBTY2FsZSwgUm91bmQgICAgICAgICAgICAgICAgOy8vIFRlbXAzID0gQihjMXcwKSAqIFNjYWxlICsgUm91bmQKLSAgICAgICAgU01MQVRCICB0ZW1wMiwgY29sT3AwMCwgU2NhbGUsIFJvdW5kICAgICAgICAgICAgICAgIDsvLyBUZW1wMiA9IFQoYzB3MCkgKiBTY2FsZSArIFJvdW5kCi0gICAgICAgIFNNTEFUQiAgdGVtcDQsIGNvbE9wMDIsIFNjYWxlLCBSb3VuZCAgICAgICAgICAgICAgICA7Ly8gVGVtcDQgPSBUKGMxdzApICogU2NhbGUgKyBSb3VuZAotICAgICAgICAKLSAgICAgICAgQVNSICAgICB0ZW1wMSwgdGVtcDEsICMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBUZW1wMSA9IFRlbXAxID4+IDIKLSAgICAgICAgQVNSICAgICB0ZW1wMywgdGVtcDMsICMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBUZW1wMyA9IFRlbXAzID4+IDIKLSAgICAgICAgUEtIQlQgICBvdXQwMCwgIHRlbXAxLCB0ZW1wMiwgTFNMICMxNCAgICAgICAgICAgICAgIDsvLyBjMHcwICA9IHwgVGVtcDIgfCBUZW1wMSB8Ci0gICAgICAgIFBLSEJUICAgb3V0MDIsICB0ZW1wMywgdGVtcDQsIExTTCAjMTQgICAgICAgICAgICAgICA7Ly8gYzF3MCAgPSB8IFRlbXAyIHwgVGVtcDEgfAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBSb3cgMgotICAgICAgICBTTUxBQkIgIHRlbXAxLCBjb2xPcDEwLCBTY2FsZSwgUm91bmQgICAgICAgICAgICAgICAgOy8vIFRlbXAxID0gQihjMHcwKSAqIFNjYWxlICsgUm91bmQKLSAgICAgICAgU01MQUJCICB0ZW1wMywgY29sT3AxMiwgU2NhbGUsIFJvdW5kICAgICAgICAgICAgICAgIDsvLyBUZW1wMyA9IEIoYzF3MCkgKiBTY2FsZSArIFJvdW5kCi0gICAgICAgIFNNTEFUQiAgdGVtcDIsIGNvbE9wMTAsIFNjYWxlLCBSb3VuZCAgICAgICAgICAgICAgICA7Ly8gVGVtcDIgPSBUKGMwdzApICogU2NhbGUgKyBSb3VuZAotICAgICAgICBTTUxBVEIgIHRlbXA0LCBjb2xPcDEyLCBTY2FsZSwgUm91bmQgICAgICAgICAgICAgICAgOy8vIFRlbXA0ID0gVChjMXcwKSAqIFNjYWxlICsgUm91bmQKLSAgICAgICAgCi0gICAgICAgIEFTUiAgICAgdGVtcDEsIHRlbXAxLCAjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVGVtcDEgPSBUZW1wMSA+PiAyCi0gICAgICAgIEFTUiAgICAgdGVtcDMsIHRlbXAzLCAjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVGVtcDMgPSBUZW1wMyA+PiAyCi0gICAgICAgIFBLSEJUICAgb3V0MTAsICB0ZW1wMSwgdGVtcDIsIExTTCAjMTQgICAgICAgICAgICAgICA7Ly8gYzB3MCAgPSB8IFRlbXAyIHwgVGVtcDEgfAotICAgICAgICBQS0hCVCAgIG91dDEyLCAgdGVtcDMsIHRlbXA0LCBMU0wgIzE0ICAgICAgICAgICAgICAgOy8vIGMxdzAgID0gfCBUZW1wMiB8IFRlbXAxIHwKLSAgICAgICAgCi0gICAgICAgIDsvLyBSb3cgMwotICAgICAgICBTTUxBQkIgIHRlbXAxLCBjb2xPcDIwLCBTY2FsZSwgUm91bmQgICAgICAgICAgICAgICAgOy8vIFRlbXAxID0gQihjMHcwKSAqIFNjYWxlICsgUm91bmQKLSAgICAgICAgU01MQUJCICB0ZW1wMywgY29sT3AyMiwgU2NhbGUsIFJvdW5kICAgICAgICAgICAgICAgIDsvLyBUZW1wMyA9IEIoYzF3MCkgKiBTY2FsZSArIFJvdW5kCi0gICAgICAgIFNNTEFUQiAgdGVtcDIsIGNvbE9wMjAsIFNjYWxlLCBSb3VuZCAgICAgICAgICAgICAgICA7Ly8gVGVtcDIgPSBUKGMwdzApICogU2NhbGUgKyBSb3VuZAotICAgICAgICBTTUxBVEIgIHRlbXA0LCBjb2xPcDIyLCBTY2FsZSwgUm91bmQgICAgICAgICAgICAgICAgOy8vIFRlbXA0ID0gVChjMXcwKSAqIFNjYWxlICsgUm91bmQKLSAgICAgICAgCi0gICAgICAgIEFTUiAgICAgdGVtcDEsIHRlbXAxLCAjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVGVtcDEgPSBUZW1wMSA+PiAyIAotICAgICAgICBBU1IgICAgIHRlbXAzLCB0ZW1wMywgIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFRlbXAzID0gVGVtcDMgPj4gMgotICAgICAgICBQS0hCVCAgIG91dDIwLCAgdGVtcDEsIHRlbXAyLCBMU0wgIzE0ICAgICAgICAgICAgICAgOy8vIGMwdzAgID0gfCBUZW1wMiB8IFRlbXAxIHwKLSAgICAgICAgUEtIQlQgICBvdXQyMiwgIHRlbXAzLCB0ZW1wNCwgTFNMICMxNCAgICAgICAgICAgICAgIDsvLyBjMXcwICA9IHwgVGVtcDIgfCBUZW1wMSB8Ci0gICAgICAgIAotICAgICAgICA7Ly8gUm93IDQKLSAgICAgICAgU01MQUJCICB0ZW1wMSwgY29sT3AzMCwgU2NhbGUsIFJvdW5kICAgICAgICAgICAgICAgIDsvLyBUZW1wMSA9IEIoYzB3MCkgKiBTY2FsZSArIFJvdW5kCi0gICAgICAgIFNNTEFCQiAgdGVtcDMsIGNvbE9wMzIsIFNjYWxlLCBSb3VuZCAgICAgICAgICAgICAgICA7Ly8gVGVtcDMgPSBCKGMxdzApICogU2NhbGUgKyBSb3VuZAotICAgICAgICBTTUxBVEIgIHRlbXAyLCBjb2xPcDMwLCBTY2FsZSwgUm91bmQgICAgICAgICAgICAgICAgOy8vIFRlbXAyID0gVChjMHcwKSAqIFNjYWxlICsgUm91bmQKLSAgICAgICAgU01MQVRCICB0ZW1wNCwgY29sT3AzMiwgU2NhbGUsIFJvdW5kICAgICAgICAgICAgICAgIDsvLyBUZW1wNCA9IFQoYzF3MCkgKiBTY2FsZSArIFJvdW5kCi0gICAgICAgIAotICAgICAgICBNX0xEUiAgIHBEYXRhLHBEYXRhT25TdGFjayAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFJlc3RvcmUgcERhdGEgcG9pbnRlciBmcm9tIHN0YWNrCi0gICAgICAgIEFTUiAgICAgdGVtcDEsIHRlbXAxLCAjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVGVtcDEgPSBUZW1wMSA+PiAyCi0gICAgICAgIEFTUiAgICAgdGVtcDMsIHRlbXAzLCAjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVGVtcDMgPSBUZW1wMyA+PiAyCi0gICAgICAgIFBLSEJUICAgb3V0MzAsICB0ZW1wMSwgdGVtcDIsIExTTCAjMTQgICAgICAgICAgICAgICA7Ly8gYzB3MCAgPSB8IFRlbXAyIHwgVGVtcDEgfAotICAgICAgICBQS0hCVCAgIG91dDMyLCAgdGVtcDMsIHRlbXA0LCBMU0wgIzE0ICAgICAgICAgICAgICAgOy8vIGMxdzAgID0gfCBUZW1wMiB8IFRlbXAxIHwKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICA7Ly8gU3RvcmUgYWxsIHRoZSA0eDQgcGl4ZWxzCi0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotc3RvcmVfY29lZmYKLSAgICAgICAgCi0gICAgICAgIFNUTUlBICAgcERhdGEse291dDAwLG91dDAyLG91dDEwLG91dDEyLG91dDIwLG91dDIyLG91dDMwLG91dDMyfQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAKLSAgICAgICAgOy8vIFNldCByZXR1cm4gdmFsdWUKLSAgICAgICAgCi0gICAgICAgCi0gICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiB0YWlsCi0gICAgICAgIE1fRU5EICAgICAgICAKLSAgICAgICAgCi0gICAgRU5ESUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvL0FSTTExMzZKUyAgICAgICAgCi0gICAgCi0KLTsvLyBTdGF0aWMgRnVuY3Rpb246IGFybVZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudEx1bWFEQzR4NAotCi07Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCi0gICAgCi0gICAgICAgIAotCi0KLTsvLyBGdW5jdGlvbjogb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIKLSAgICAKLTsvL0lucHV0IFJlZ2lzdGVycwotcHBTcmMgICAgICAgICAgICAgICBSTiAgMAotcERzdCAgICAgICAgICAgICAgICBSTiAgMQotUVBSMiAgICAgICAgICAgICAgICBSTiAgMgotCi07Ly9PdXRwdXQgUmVnaXN0ZXJzCi1yZXN1bHQgICAgICAgICAgICAgIFJOICAwCi0KLTsvL0xvY2FsIFNjcmF0Y2ggUmVnaXN0ZXJzCi1wRHN0UjQgICAgICAgICAgICAgIFJOICA0Ci1wRHN0UjAgICAgICAgICAgICAgIFJOICAwCi1RUFIxICAgICAgICAgICAgICAgIFJOICAxCi1RUFI1ICAgICAgICAgICAgICAgIFJOICA1Ci0KLTsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKLSAgICAKLSAgICBJRiBBUk0xMTM2SlMKLSAgICAgICAKLSAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IHJlcXVpcmVkIGJ5IHRoZSBmdW5jdGlvbgotICAgICAgICAKLQotICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcixyNQotICAgICAgICAKLSAgICAgICAgTU9WICAgICBwRHN0UjQscERzdCAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2F2aW5nIHJlZ2lzdGVyIHIxCi0gICAgICAgIE1PViAgICAgUVBSNSxRUFIyICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNhdmluZyByZWdpc3RlciByMgotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgcERzdFIwLHBEc3RSNCAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNldHRpbmcgdXAgcmVnaXN0ZXIgcjAKLSAgICAgICAgTU9WICAgICBRUFIxLFFQUjUgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2V0dGluZyB1cCByZWdpc3RlciByMQotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudEx1bWFEQzR4NAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgIAotICAgICAgICA7Ly8gU2V0IHJldHVybiB2YWx1ZQotICAgICAgICBNT1YgICAgIHJlc3VsdCwjT01YX1N0c19Ob0VyciAgICAgICAgCi0gICAgICAgCi0gICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiB0YWlsCi0gICAgICAgIE1fRU5ECi0gICAgICAgIAotICAgICAgICAgICAgCi0gICAgRU5ESUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvL0FSTTExMzZKUyAgCi0gICAgCi0KLSAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL2FwaS9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTllNzUyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL2FwaS9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICoKLSAqIEZpbGU6ICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXMuaAotICogRGVzY3JpcHRpb246IERlY2xhcmVzIFRhYmxlcyB1c2VkIGZvciBIdWZmZm1hbiBjb2RpbmcgYW5kIGRlY29kaW5nIAotICogICAgICAgICAgICAgIGluIE1QNFAyIGNvZGVjLgotICoKLSAqLwotIAotI2lmbmRlZiBfT01YSFVGRlRBQl9IXwotI2RlZmluZSBfT01YSFVGRlRBQl9IXwotCi0KLWV4dGVybiBjb25zdCBPTVhfVTE2IGFybVZDTTRQMl9JbnRyYVZsY0wwTDFbMjAwXTsKLQotCi1leHRlcm4gY29uc3QgT01YX1UxNiBhcm1WQ000UDJfSW50ZXJWbGNMMEwxWzIwMF07Ci0KLWV4dGVybiBjb25zdCBPTVhfVTE2IGFybVZDTTRQMl9hSW50cmFEQ0x1bWFDaHJvbWFJbmRleFs2NF07Ci0vL2V4dGVybiBjb25zdCBPTVhfVTE2IGFybVZDTTRQMl9hSW50cmFEQ0Nocm9tYUluZGV4WzMyXTsKLWV4dGVybiBjb25zdCBPTVhfVTE2IGFybVZDTTRQMl9hVmxjTVZEWzEyNF07Ci0KLWV4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDBMMUxNQVhbNzNdOwotZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50ZXJMMEwxUk1BWFszNV07Ci1leHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRyYUwwTDFMTUFYWzUzXTsKLWV4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDBMMVJNQVhbNDBdCi0KLSNlbmRpZiAvKiBfT01YSFVGRlRBQl9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvYXBpL2FybVZDTTRQMl9aaWdaYWdfVGFibGVzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg2YmEwNC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICoKLSAqIEZpbGU6ICAgICAgICBhcm1WQ000UDJfWmlnemFnX1RhYmxlcy5oCi0gKiBEZXNjcmlwdGlvbjogRGVjbGFyZXMgVGFibGVzIHVzZWQgZm9yIFppZ3phZyBzY2FuIGluIE1QNFAyIGNvZGVjLgotICoKLSAqLwotIAotI2lmbmRlZiBfT01YWklHWkFHVEFCX0gKLSNkZWZpbmUgX09NWFpJR1pBR1RBQl9ICi0KLWV4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuIFsxOTJdOwotLy9leHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9hSG9yaXpvbnRhbFppZ3phZ1NjYW4gWzY0XTsKLS8vZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfYVZlcnRpY2FsWmlnemFnU2NhbiBbNjRdOwotCi0jZW5kaWYgLyogX09NWFpJR1pBR1RBQl9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL2FybVZDTTRQMl9DbGlwOF9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0NsaXA4X3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQxZDQ0MS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0NsaXA4X3MucworKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07IC8qKgotOyAqIAotOyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9DbGlwOF9zLnMKLTsgKiBPcGVuTUFYIERMOiB2MS4wLjIKLTsgKiBSZXZpc2lvbjogICA5NjQxCi07ICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsgKiAKLTsgKiAKLTsgKiAKLTsgKgotOyAqIERlc2NyaXB0aW9uOiAKLTsgKiBDb250YWlucyBtb2R1bGUgZm9yIENsaXBwaW5nIDE2IGJpdCB2YWx1ZSB0byBbMCwyNTVdIFJhbmdlCi07ICovIAotCi0gICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgCi0KLSAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0KLSAgICAgICAgCi0gICAgIAotICAgICAgSUYgQVJNMTEzNkpTCi0gCi07Ly9JbnB1dCBBcmd1bWVudHMKLQotcFNyYyAgICAgICAgICAgICAgICAgUk4gMAotcERzdCAgICAgICAgICAgICAgICAgUk4gMQotc3RlcCAgICAgICAgICAgICAgICAgUk4gMgotCi07Ly8gTG9jYWwgdmFyaWFibGVzCi0KLXgwICAgICAgICAgICAgICAgICAgIFJOIDMKLXgxICAgICAgICAgICAgICAgICAgIFJOIDQKLXgyICAgICAgICAgICAgICAgICAgIFJOIDUKLXgzICAgICAgICAgICAgICAgICAgIFJOIDYKLQotQ291bnQgICAgICAgICAgICAgICAgUk4gMTQKLSAgICAgCi0gICAgICAgIAotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMl9DbGlwOCxyNgotICAgICAgIAotCi0gICAgICAgIE1PViAgICAgICAgICBDb3VudCwjOAotbG9vcAotCi0gICAgICAgIExETUlBICAgICAgICBwU3JjISx7eDAsIHgxfQotICAgICAgICBTVUJTICAgICAgICAgQ291bnQsQ291bnQsICMxICAgICAgICAgIDsvLyBjb3VudCBkb3duCi0gICAgICAgIExETUlBICAgICAgICBwU3JjISx7eDIsIHgzfQotICAgICAgICBVU0FUMTYgICAgICAgeDAsICM4LCB4MCAgICAgICAgICAgICAgICAgOy8vIGNsaXAgdHdvIHNhbXBsZXMgdG8gWzAsMjU1XQotICAgICAgICBVU0FUMTYgICAgICAgeDEsICM4LCB4MSAgICAgICAgICAgICAgICAgOy8vIGNsaXAgdHdvIHNhbXBsZXMgdG8gWzAsMjU1XQotICAgICAgICBTVFJCICAgICAgICAgeDAsIFtwRHN0XQotICAgICAgICBNT1YgICAgICAgICAgeDAsIHgwLCBMU1IgIzE2Ci0gICAgICAgIFNUUkIgICAgICAgICB4MCwgW3BEc3QsIzFdCi0gICAgICAgIFNUUkIgICAgICAgICB4MSwgW3BEc3QsIzJdCi0gICAgICAgIE1PViAgICAgICAgICB4MSwgeDEsIExTUiAjMTYKLSAgICAgICAgU1RSQiAgICAgICAgIHgxLCBbcERzdCwjM10KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgVVNBVDE2ICAgICAgIHgyLCAjOCwgeDIgICAgICAgICAgICAgICAgIDsvLyBjbGlwIHR3byBzYW1wbGVzIHRvIFswLDI1NV0KLSAgICAgICAgVVNBVDE2ICAgICAgIHgzLCAjOCwgeDMgICAgICAgICAgICAgICAgIDsvLyBjbGlwIHR3byBzYW1wbGVzIHRvIFswLDI1NV0KLSAgICAgICAgU1RSQiAgICAgICAgIHgyLCBbcERzdCwjNF0KLSAgICAgICAgTU9WICAgICAgICAgIHgyLCB4MiwgTFNSICMxNgotICAgICAgICBTVFJCICAgICAgICAgeDIsIFtwRHN0LCM1XQotICAgICAgICBTVFJCICAgICAgICAgeDMsIFtwRHN0LCM2XQotICAgICAgICBNT1YgICAgICAgICAgeDMsIHgzLCBMU1IgIzE2Ci0gICAgICAgIFNUUkIgICAgICAgICB4MywgW3BEc3QsIzddCi0gICAgICAgIEFERCAgICAgICAgICBwRHN0LHBEc3Qsc3RlcCAgICAgICAgICAgICA7Ly8gSW5jcmVtZW50IHBEc3QgYnkgc3RlcCB2YWx1ZQotICAgICAgICAgCi0gICAgICAgIEJHVCAgICAgICAgICBsb29wICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ29udGludWUgbG9vcCB1bnRpbCBDb3VudCByZWFjaGVzIDY0IAotCi0gICAgICAgIE1fRU5ECi0gICAgICAgIEVORElGCi0gICAgICAgIAotICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmVfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmY1YmVkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSw0MTIgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvKioKLTsgKiAKLTsgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZV9zLnMKLTsgKiBPcGVuTUFYIERMOiB2MS4wLjIKLTsgKiBSZXZpc2lvbjogICA5NjQxCi07ICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsgKiAKLTsgKiAKLTsgKiAKLTsgKgotOyAqIERlc2NyaXB0aW9uOiAKLTsgKiBDb250YWlucyBtb2R1bGVzIGZvciB6aWd6YWcgc2Nhbm5pbmcgYW5kIFZMQyBkZWNvZGluZwotOyAqIGZvciBpbnRlciwgaW50cmEgYmxvY2suCi07ICoKLTsgKgotOyAqCi07ICogRnVuY3Rpb246IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlCi07ICoKLTsgKiBEZXNjcmlwdGlvbjoKLTsgKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gCi07ICoKLTsgKiAKLTsgKgotOyAqIAotOyAqLwotCi0KLSAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICBJTkNMVURFIGFybUNPTU1fQml0RGVjX3MuaAotCi0KLSAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0KLSAgICAgCi0KLQotCi0gICAgIElGIEFSTTExMzZKUwotICAgICAKLSAgICAgICAgCi0KLQotCi07Ly9JbnB1dCBBcmd1bWVudHMKLQotcHBCaXRTdHJlYW0gICAgICAgICAgUk4gMAotcEJpdE9mZnNldCAgICAgICAgICAgUk4gMQotcERzdCAgICAgICAgICAgICAgICAgUk4gMgotc2hvcnRWaWRlb0hlYWRlciAgICAgUk4gMwotCi0KLTsvL0xvY2FsIFZhcmlhYmxlcwotCi1SZXR1cm4gICAgICAgICAgICAgICBSTiAwCi0KLXBWbGNUYWJsZUwwTDEgICAgICAgIFJOIDQKLXBMTUFYVGFibGVMMEwxICAgICAgIFJOIDQKLXBSTUFYVGFibGVMMEwxICAgICAgIFJOIDQKLXBaaWd6YWdUYWJsZSAgICAgICAgIFJOIDQKLQotZnR5cGUgICAgICAgICAgICAgICAgUk4gMAotdGVtcDMgICAgICAgICAgICAgICAgUk4gNAotdGVtcCAgICAgICAgICAgICAgICAgUk4gNQotQ291bnQgICAgICAgICAgICAgICAgUk4gNgotRXNjYXBlICAgICAgICAgICAgICAgUk4gNQotCi07Ly8gYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIKLXppZ3phZyAgICAgICAgICAgICAgIFJOIDAKLXN0b3JlTGV2ZWwgICAgICAgICAgIFJOIDEKLXRlbXAyICAgICAgICAgICAgICAgIFJOIDQKLXRlbXAxICAgICAgICAgICAgICAgIFJOIDUKLXNpZ24gICAgICAgICAgICAgICAgIFJOIDUKLUxhc3QgICAgICAgICAgICAgICAgIFJOIDcKLXN0b3JlUnVuICAgICAgICAgICAgIFJOIDE0Ci0KLQotcGFja1JldEluZGV4ICAgICAgICAgUk4gNQotCi0KLW1hcmtlcmJpdCAgICAgICAgICAgIFJOIDUKLQotOy8vIFNjcmF0Y2ggUmVnaXN0ZXJzCi0KLVJCaXRTdHJlYW0gICAgICAgICAgIFJOIDgKLVJCaXRCdWZmZXIgICAgICAgICAgIFJOIDkKLVJCaXRDb3VudCAgICAgICAgICAgIFJOIDEwCi0KLVQxICAgICAgICAgICAgICAgICAgIFJOIDExCi1UMiAgICAgICAgICAgICAgICAgICBSTiAxMgotTFIgICAgICAgICAgICAgICAgICAgUk4gMTQgICAgICAgIAotICAgICAgICAKLQotCi0gICAgICAgIE1fQUxMT0M0ICAgICAgICBwcHBCaXRTdHJlYW0sNAotICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBPZmZzZXQsNAotICAgICAgICBNX0FMTE9DNCAgICAgICAgcExpbmtSZWdpc3Rlciw0ICAgICAgIAotICAgICAgICAKLSAgICAgICAgTV9TVEFSVCBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZQotCi0gICAgICAgIDsvLyBnZXQgdGhlIHRhYmxlIGFkZHJlc3NlcyBmcm9tIHN0YWNrICAgICAgIAotICAgICAgICBNX0FSRyAgICAgICAgICAgcHBWbGNUYWJsZUwwTDEsNAotICAgICAgICBNX0FSRyAgICAgICAgICAgcHBMTUFYVGFibGVMMEwxLDQKLSAgICAgICAgTV9BUkcgICAgICAgICAgIHBwUk1BWFRhYmxlTDBMMSw0Ci0gICAgICAgIE1fQVJHICAgICAgICAgICBwcFppZ3phZ1RhYmxlLDQKLSAgICAgICAgCi0gICAgICAgIDsvLyBTdG9yZSBBTEwgemVyb3MgYXQgcERzdAotICAgICAgICAKLSAgICAgICAgTU9WICAgICAgICAgICAgIHRlbXAxLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJbml0aWFsaXplIENvdW50IHRvIHplcm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBNT1YgICAgICAgICAgICAgTGFzdCwjMAotICAgICAgICBNX1NUUiAgICAgICAgICAgTFIscExpbmtSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIExpbmsgUmVnaXN0ZXIgb24gU3RhY2sKLSAgICAgICAgTU9WICAgICAgICAgICAgIHRlbXAyLCMwCi0gICAgICAgIE1PViAgICAgICAgICAgICBMUiwjMCAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBJbml0aWFsaXplIHRoZSBNYWNybyBhbmQgU3RvcmUgYWxsIHplcm9zIHRvIHBEc3QgCi0gIAotICAgICAgICBTVE0gICAgICAgICAgICAgcERzdCEse3RlbXAyLHRlbXAxLExhc3QsTFJ9ICAgICAgICAgICAgICAgICAgIAotICAgICAgICBNX0JEX0lOSVQwICAgICAgcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIFJCaXRTdHJlYW0sIFJCaXRCdWZmZXIsIFJCaXRDb3VudCAgCi0gICAgICAgIFNUTSAgICAgICAgICAgICBwRHN0ISx7dGVtcDIsdGVtcDEsTGFzdCxMUn0KLSAgICAgICAgTV9CRF9JTklUMSAgICAgIFQxLCBUMiwgVDIKLSAgICAgICAgU1RNICAgICAgICAgICAgIHBEc3QhLHt0ZW1wMix0ZW1wMSxMYXN0LExSfQotICAgICAgICBNX0JEX0lOSVQyICAgICAgVDEsIFQyLCBUMgotICAgICAgICBTVE0gICAgICAgICAgICAgcERzdCEse3RlbXAyLHRlbXAxLExhc3QsTFJ9Ci0gICAgICAgIE1fU1RSICAgICAgICAgICBwcEJpdFN0cmVhbSxwcHBCaXRTdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgcHBCaXRzdHJlYW0gb24gc3RhY2sgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFNUTSAgICAgICAgICAgICBwRHN0ISx7dGVtcDIsdGVtcDEsTGFzdCxMUn0KLSAgICAgICAgTV9TVFIgICAgICAgICAgIHBCaXRPZmZzZXQscHBPZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBwQml0T2Zmc2V0IG9uIHN0YWNrCi0gICAgICAgIFNUTSAgICAgICAgICAgICBwRHN0ISx7dGVtcDIsdGVtcDEsTGFzdCxMUn0KLSAgICAgICAgCi0gICAgICAgIFNUTSAgICAgICAgICAgICBwRHN0ISx7dGVtcDIsdGVtcDEsTGFzdCxMUn0KLSAgICAgICAgU1RNICAgICAgICAgICAgIHBEc3QhLHt0ZW1wMix0ZW1wMSxMYXN0LExSfQotIAotICAgICAgICAKLSAgICAgICAgU1VCICAgICAgICAgICAgIHBEc3QscERzdCwjMTI4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBSZXN0b3JlIHBEc3QKLQotICAgICAgICA7Ly8gVGhlIGFybVZDTTRQMl9HZXRWTENCaXRzIGJlZ2lucwotCi1nZXRWTENiaXRzCi0gICAgICAgIAotICAgICAgICBNX0JEX0xPT0s4ICAgICAgRXNjYXBlLDcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgRXNjYXBlIFZhbHVlCi0gICAgICAgIExTUiAgICAgICAgICAgICBFc2NhcGUsRXNjYXBlLCMyNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIENNUCAgICAgICAgICAgICBFc2NhcGUsIzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY2hlY2sgZm9yIGVzY2FwZSBtb2RlCi0gICAgICAgIE1PVk5FICAgICAgICAgICBmdHlwZSwjMAotICAgICAgICBCTkUgICAgICAgICAgICAgbm90RXNjYXBlbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEJyYW5jaCBpZiBub3QgaW4gRXNjYXBlIG1vZGUgMwotCi0gICAgICAgIE1fQkRfVlNLSVA4ICAgICAjNyxUMQotICAgICAgICBDTVAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlciwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENoZWNrIHNob3J0VmlkZW9IZWFkZXIgZmxhZyB0byBrbm93IHRoZSB0eXBlIG9mIEVzY2FwZSBtb2RlCi0gICAgICAgIEJFUSAgICAgICAgICAgICBlbmRGaWxsVkxEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gRXNjYXBlIE1vZGUgNAotCi0gICAgICAgIE1fQkRfUkVBRDggICAgICBMYXN0LDEsVDEKLSAgICAgICAgTV9CRF9SRUFEOCAgICAgIHN0b3JlUnVuLDYsVDEKLSAgICAgICAgTV9CRF9SRUFEOCAgICAgIHN0b3JlTGV2ZWwsOCxUMQotCi0gICAgICAgICAgIAotICAgICAgICA7Ly8gQ2hlY2sgd2hldGhlciB0aGUgUmVzZXJ2ZWQgdmFsdWVzIGZvciBMZXZlbCBhcmUgdXNlZCBhbmQgRXhpdCB3aXRoIGFuIEVycm9yIE1lc3NhZ2UgaWYgaXQgaXMgc28KLQotICAgICAgICBURVEgICAgICAgICAgICAgc3RvcmVMZXZlbCwjMAotICAgICAgICBURVFORSAgICAgICAgICAgc3RvcmVMZXZlbCwjMTI4ICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgQkVRICAgICAgICAgICAgIEV4aXRFcnJvcgotCi0gICAgICAgIEFERCAgICAgICAgICAgICB0ZW1wMixzdG9yZVJ1bixDb3VudAotICAgICAgICBDTVAgICAgICAgICAgICAgdGVtcDIsIzY0Ci0gICAgICAgIEJHRSAgICAgICAgICAgICBFeGl0RXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gZXJyb3IgaWYgQ291bnQrc3RvcmVSdW4gPj0gNjQKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gTG9hZCBhZGRyZXNzIG9mIHppZ3phZ1RhYmxlCi0gICAgICAgIAotICAgICAgICBNX0xEUiAgICAgICAgICAgcFppZ3phZ1RhYmxlLHBwWmlnemFnVGFibGUgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWRpbmcgdGhlIEFkZHJlc3Mgb2YgWmlnemFnIHRhYmxlCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgOy8vIGFybVZDTTRQMl9GaWxsVkxEQnVmZmVyCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIFNYVEIgICAgICAgICAgICBzdG9yZUxldmVsLHN0b3JlTGV2ZWwgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2lnbiBFeHRlbmQgc3RvcmVMZXZlbCB0byAzMiBiaXRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBUbyBSZWZsZWN0IFJ1bmxlbmd0aAotCi0gICAgICAgIEFERCAgICAgICAgICAgICBDb3VudCxDb3VudCxzdG9yZVJ1bgotICAgICAgICBMRFJCICAgICAgICAgICAgemlnemFnLFtwWmlnemFnVGFibGUsQ291bnRdCi0gICAgICAgIEFERCAgICAgICAgICAgICBDb3VudCxDb3VudCwjMQotICAgICAgICBTVFJIICAgICAgICAgICAgc3RvcmVMZXZlbCxbcERzdCx6aWd6YWddICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIExldmVsCi0gICAgICAgICAgICAgIAotICAgICAgICBCICAgICAgICAgICAgICAgRXhpdE9rCi0gICAgICAgCi0gICAgICAgIAotCi1lbmRGaWxsVkxECi0gICAgICAgIAotICAgICAgICAgICAgICAgCi0gICAgICAgIDsvLyBMb2FkIEZ0eXBlKCBFc2NhcGUgTW9kZSkgdmFsdWUgYmFzZWQgb24gdGhlIHR3byBzdWNjZXNzaXZlIGJpdHMgaW4gdGhlIGJpdHN0cmVhbQotICAgICAKLSAgICAgICAgTV9CRF9SRUFEOCAgICAgIHRlbXAxLDEsVDEgICAgICAgICAgIAotICAgICAgICBDTVAgICAgICAgICAgICAgdGVtcDEsIzAgICAgCi0gICAgICAgIE1PVkVRICAgICAgICAgICBmdHlwZSwjMQotICAgICAgICBCRVEgICAgICAgICAgICAgbm90RXNjYXBlbW9kZQotICAgICAgICBNX0JEX1JFQUQ4ICAgICAgdGVtcDEsMSxUMQotICAgICAgICBDTVAgICAgICAgICAgICAgdGVtcDEsIzEKLSAgICAgICAgTU9WRVEgICAgICAgICAgIGZ0eXBlLCMzCi0gICAgICAgIE1PVk5FICAgICAgICAgICBmdHlwZSwjMgotICAgICAgICAKLQotbm90RXNjYXBlbW9kZQotCi0gICAgICAgIDsvLyBMb2FkIG9wdGltaXplZCBwYWNrZWQgVkxDIHRhYmxlIHdpdGggbGFzdD0wIGFuZCBMYXN0PTEKLSAgICAgICAgCi0gICAgICAgIE1fTERSICAgICAgICAgICBwVmxjVGFibGVMMEwxLHBwVmxjVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBDb21iaW5lZCBWTEMgVGFibGUKLSAgICAgICAgICAgICAgICAKLSAgICAgICAKLSAgICAgICAgQ01QICAgICAgICAgICAgIGZ0eXBlLCMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBmdHlwZSA+PTMgZ2V0IHBlcmZvcm0gRml4ZWQgTGVuZ3RoIERlY29kaW5nIChFc2NhcGUgTW9kZSAzKQotICAgICAgICBCR0UgICAgICAgICAgICAgRXNjYXBlTW9kZTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEVsc2UgY29udGludWUgbm9ybWFsIFZMQyBEZWNvZGluZwotICAgICAgICAKLSAgICAgICAgOy8vIFZhcmlhYmxlIGxlbmdoIGRlY29kaW5nLCAiYXJtVW5QYWNrVkxDMzIiIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIE1fQkRfVkxEICAgICAgICBwYWNrUmV0SW5kZXgsVDEsVDIscFZsY1RhYmxlTDBMMSw0LDIKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBMRFIgICAgICAgICAgICAgdGVtcDMsPTB4RkZGCi0gICAgICAgIAotICAgICAgICBDTVAgICAgICAgICAgICAgcGFja1JldEluZGV4LHRlbXAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENoZWNrIGZvciBpbnZhbGlkIHN5bWJvbAotICAgICAgICBCRVEgICAgICAgICAgICAgRXhpdEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGlmIGludmFsaWQgc3ltYm9sIG9jY3VycyBleGl0IHdpdGggYW4gZXJyb3IgbWVzc2FnZQotICAgICAgICAKLSAgICAgICAgQU5EICAgICAgICAgICAgIExhc3QscGFja1JldEluZGV4LCMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBHZXQgTGFzdCBmcm9tIHBhY2tlZCBJbmRleAotICAgICAgICAgICAgICAKLSAgICAgICAgIAotICAgICAgICAKLQotICAgICAgICBMU1IgICAgICAgICAgICAgc3RvcmVSdW4scGFja1JldEluZGV4LCM3ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEdldCBSdW4gVmFsdWUgZnJvbSBQYWNrZWQgaW5kZXgKLSAgICAgICAgQU5EICAgICAgICAgICAgIHN0b3JlTGV2ZWwscGFja1JldEluZGV4LCMweDdjICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZUxldmVsPXBhY2tSZXRJbmRleFsyLTZdLHN0b3JlTGV2ZWxbMC0xXT0wIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgIAotICAgICAgICBNX0xEUiAgICAgICAgICAgcExNQVhUYWJsZUwwTDEscHBMTUFYVGFibGVMMEwxICAgICAgICAgICAgICAgICAgOy8vIExvYWQgTE1BWCB0YWJsZQotICAgICAgICAgICAgICAKLSAgICAgICAKLSAgICAgICAgTFNSICAgICAgICAgICAgIHN0b3JlTGV2ZWwsc3RvcmVMZXZlbCwjMiAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMZXZlbCB2YWx1ZQotCi0gICAgICAgIENNUCAgICAgICAgICAgICBmdHlwZSwjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBCTkUgICAgICAgICAgICAgZnR5cGUyCi0gICAgICAgIAotICAgICAgICA7Ly8gZnR5cGU9PTE7IEVzY2FwZSBtb2RlID0xCi0gICAgICAgICAgCi0gICAgICAgIAotICAgICAgICBBREQgICAgICAgICAgICB0ZW1wMSwgcExNQVhUYWJsZUwwTDEsIExhc3QsIExTTCM0ICAgICAgICAgICAgICA7Ly8gSWYgdGhlIExhc3Q9MSBhZGQgMzIgdG8gdGFibGUgYWRkcmVzcwotICAgICAgICBMRFJCICAgICAgICAgICAgdGVtcDEsW3RlbXAxLHN0b3JlUnVuXQotCi0gICAgICAgCi0gICAgICAgIEFERCAgICAgICAgICAgICBzdG9yZUxldmVsLHRlbXAxLHN0b3JlTGV2ZWwgICAgICAgICAgICAgICAgICAgICAKLQotZnR5cGUyCi0KLSAgICAgICAgOy8vIGZ0eXBlID0yOyBFc2NhcGUgbW9kZSA9MgotICAgICAgICAKLSAgICAgICAgTV9MRFIgICAgICAgICAgIHBSTUFYVGFibGVMMEwxLHBwUk1BWFRhYmxlTDBMMSAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIFJNQVggVGFibGUgCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIENNUCAgICAgICAgICAgICBmdHlwZSwjMgotICAgICAgICBCTkUgICAgICAgICAgICAgRmlsbFZMREwxCi0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgQUREICAgICAgICAgICAgdGVtcDEsIHBSTUFYVGFibGVMMEwxLCBMYXN0LCBMU0wjNCAgICAgICAgICAgICAgIDsvLyBJZiBMYXN0PTEgYWRkIDMyIHRvIHRhYmxlIGFkZHJlc3MKLSAgICAgICAgU1VCICAgICAgICAgICAgIHRlbXAyLHN0b3JlTGV2ZWwsIzEKLSAgICAgICAgTERSQiAgICAgICAgICAgIHRlbXAxLFt0ZW1wMSx0ZW1wMl0KLQotICAgICAgIAotICAgICAgICBBREQgICAgICAgICAgICAgc3RvcmVSdW4sc3RvcmVSdW4sIzEKLSAgICAgICAgQUREICAgICAgICAgICAgIHN0b3JlUnVuLHRlbXAxCi0gICAgICAgIAotRmlsbFZMREwxICAgICAgICAKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotICAgICAgICA7Ly8gYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIKLQotICAgICAgICBNX0xEUiAgICAgICAgICAgcFppZ3phZ1RhYmxlLHBwWmlnemFnVGFibGUgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBhZGRyZXNzIG9mIHppZ3phZ1RhYmxlIAotICAgICAgICAgICAgICAgIAotICAgICAgICBNX0JEX1JFQUQ4ICAgICAgc2lnbiwxLFQxCi0KLSAgICAgICAgQ01QICAgICAgICAgICAgIHNpZ24sIzEKLSAgICAgICAgUlNCRVEgICAgICAgICAgIHN0b3JlTGV2ZWwsc3RvcmVMZXZlbCwjMAotIAotICAgICAgICBBREQgICAgICAgICAgICAgdGVtcDEsc3RvcmVSdW4sQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gRXhpdCB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaWYgUnVuICsgQ291bnQgZXhjZWVkcyA2MwotICAgICAgICBDTVAgICAgICAgICAgICAgdGVtcDEsIzY0Ci0gICAgICAgIEJHRSAgICAgICAgICAgICBFeGl0RXJyb3IKLQotICAgICAgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gVG8gUmVmbGVjdCBSdW5sZW5naHQKLQotICAgICAgICBBREQgICAgICAgICAgICAgQ291bnQsQ291bnQsc3RvcmVSdW4KLSAKLXN0b3JlTGV2ZWxMMQotICAgICAgICAKLSAgICAgICAgTERSQiAgICAgICAgICAgIHppZ3phZyxbcFppZ3phZ1RhYmxlLENvdW50XQotICAgICAgICBDTVAgICAgICAgICAgICAgTGFzdCwjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENoZWNrIGlmIHRoZSBMZXZlbCB2YWwgaXMgTGFzdCBub24gemVybyB2YWwKLSAgICAgICAgQUREICAgICAgICAgICAgIENvdW50LENvdW50LCMxCi0gICAgICAgIExTUiAgICAgICAgICAgICBMYXN0LExhc3QsIzEKLSAgICAgICAgU1RSSCAgICAgICAgICAgIHN0b3JlTGV2ZWwsW3BEc3QsemlnemFnXSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAKLSAgICAgICAgQk5FICAgICAgICAgICAgIGVuZAotICAgICAgICAKLSAgICAgICAgQiAgICAgICAgICAgICAgIEV4aXRPawotIAotCi0KLSAgICAgICAgOy8vIEZpeGVkIExlbmdoIERlY29kaW5nIEVzY2FwZSBNb2RlIDMKLQotRXNjYXBlTW9kZTMKLQotICAgICAgICBNX0JEX1JFQUQ4ICAgICAgTGFzdCwxLFQxCi0gICAgICAgIE1fQkRfUkVBRDggICAgICBzdG9yZVJ1biw2LFQxCi0gICAgICAgIAotICAgICAgICBBREQgICAgICAgICAgICAgdGVtcDIsc3RvcmVSdW4sQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEV4aXQgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGlmIFJ1biArIENvdW50IGV4Y2VlZHMgNjMKLSAgICAgICAgQ01QICAgICAgICAgICAgIHRlbXAyLCM2NAotICAgICAgICBCR0UgICAgICAgICAgICAgRXhpdEVycm9yCi0KLSAgICAgICAgTV9CRF9SRUFEOCAgICAgIG1hcmtlcmJpdCwxLFQxCi0gICAgICAgIFRFUSAgICAgICAgICAgICBtYXJrZXJiaXQsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gRXhpdCB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaWYgbWFya2VyIGJpdCBpcyB6ZXJvCi0gICAgICAgIEJFUSAgICAgICAgICAgICBFeGl0RXJyb3IKLSAgICAgICAgCi0gICAgICAgIE1fQkRfUkVBRDE2ICAgICBzdG9yZUxldmVsLDEyLFQxCi0KLSAgICAgICAgVFNUICAgICAgICAgICAgIHN0b3JlTGV2ZWwsIzB4ODAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZXN0IGlmIHRoZSBsZXZlbCBpcyBuZWdhdGl2ZQotICAgICAgICBTVUJORSAgICAgICAgICAgc3RvcmVMZXZlbCxzdG9yZUxldmVsLCM0MDk2Ci0gICAgICAgIENNUCAgICAgICAgICAgICBzdG9yZUxldmVsLCMwCi0gICAgICAgIENNUE5FICAgICAgICAgICBzdG9yZUxldmVsLCMtMjA0OAotICAgICAgICBCRVEgICAgICAgICAgICAgRXhpdEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEV4aXQgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGlmIExldmVsPT0wIG9yICAtMjA0OCAKLQotICAgICAgICBNX0xEUiAgICAgICAgICAgcFppZ3phZ1RhYmxlLHBwWmlnemFnVGFibGUgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgYWRkcmVzcyBvZiB6aWd6YWdUYWJsZQotICAgICAgICAgICAgICAKLSAgICAgICAgTV9CRF9SRUFEOCAgICAgIG1hcmtlcmJpdCwxLFQxCi0gICAgICAgICAgIAotCi0gICAgICAgIDsvLyBhcm1WQ000UDJfRmlsbFZMREJ1ZmZlciAoIFNpZ24gbm90IHVzZWQgYXMgc3RvcmVMZXZlbCBpcyBwcmVwcm9jZXNzZWQpCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIDsvLyBUbyBSZWZsZWN0IFJ1biBMZW5ndGgKLQotICAgICAgICBBREQgICAgICAgICAgICAgQ291bnQsQ291bnQsc3RvcmVSdW4KLQotCi0gCi1zdG9yZUxldmVsTGFzdAotICAgICAgICAKLSAgICAgICAgTERSQiAgICAgICAgICAgIHppZ3phZyxbcFppZ3phZ1RhYmxlLENvdW50XQotICAgICAgICBDTVAgICAgICAgICAgICAgTGFzdCwjMQotICAgICAgICBBREQgICAgICAgICAgICAgQ291bnQsQ291bnQsIzEKLSAgICAgICAgU1RSSCAgICAgICAgICAgIHN0b3JlTGV2ZWwsW3BEc3QsemlnemFnXSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIEJORSAgICAgICAgICAgICBlbmQgCi0gICAgICAKLSAgICAgICAgQiAgICAgICAgICAgICAgIEV4aXRPawotICAgICAgICAKLWVuZAotCi0gICAgICAgIENNUCAgICAgICAgICAgICBDb3VudCwjNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly9SdW4gdGhlIExvb3AgdW50aWxsIENvdW50IHJlYWNoZXMgNjQKLQotICAgICAgICBCTFQgICAgICAgICAgICAgZ2V0VkxDYml0cwotCi0gICAgICAgIAotRXhpdE9rCi0gICAgICAgIDsvLyBFeGl0IFdoZW4gVkxDIERlY29kaW5nIGlzIGRvbmUgU3VjY2Vzc2Z1bGx5IAotICAgCi0gICAgICAgIDsvLyBMb2FkaW5nIHBwQml0U3RyZWFtIGFuZCBwQml0T2Zmc2V0IGZyb20gc3RhY2sKLSAgICAgICAgCi0gICAgICAgIENNUCAgICAgICAgICAgICBMYXN0LCMxCi0gICAgICAgIE1fTERSICAgICAgICAgICBwcEJpdFN0cmVhbSxwcHBCaXRTdHJlYW0KLSAgICAgICAgTV9MRFIgICAgICAgICAgIHBCaXRPZmZzZXQscHBPZmZzZXQKLQotICAgICAgICA7Ly9FbmRpbmcgdGhlIG1hY3JvCi0KLSAgICAgICAgTV9CRF9GSU5JICAgICAgIHBwQml0U3RyZWFtLHBCaXRPZmZzZXQKLSAgICAgICAgICAgICAKLSAgICAgICAgTU9WRVEgICAgICAgICAgIFJldHVybiwjT01YX1N0c19Ob0VycgotICAgICAgICBNT1ZORSAgICAgICAgICAgUmV0dXJuLCNPTVhfU3RzX0VycgotICAgICAgICBNX0xEUiAgICAgICAgICAgTFIscExpbmtSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCB0aGUgTGluayBSZWdpc3RlciBCYWNrCi0gICAgICAgIEIgICAgICAgICAgICAgICBleGl0MgotCi1FeGl0RXJyb3IKLSAgICAgICAgOy8vIEV4aXQgV2hlbiBhbiBFcnJvciBvY2N1cnMgCi0KLSAgICAgICAgTV9MRFIgICAgICAgICAgIHBwQml0U3RyZWFtLHBwcEJpdFN0cmVhbQotICAgICAgICBNX0xEUiAgICAgICAgICAgcEJpdE9mZnNldCxwcE9mZnNldAotICAgICAgICA7Ly9FbmRpbmcgdGhlIG1hY3JvCi0KLSAgICAgICAgTV9CRF9GSU5JICAgICAgIHBwQml0U3RyZWFtLHBCaXRPZmZzZXQKLSAgICAgICAgTV9MRFIgICAgICAgICAgIExSLHBMaW5rUmVnaXN0ZXIKLSAgICAgICAgTU9WICAgICAgICAgICAgIFJldHVybiwjT01YX1N0c19FcnIKLQotZXhpdDIKLSAgICAgICAKLQotICAgICAgICBNX0VORAotICAgICAgICBFTkRJRgotICAgICAgICAKLSAgICAgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRkODZlZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLSAvKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRmlsZTogICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYwotICogRGVzY3JpcHRpb246IENvbnRhaW5zIGFsbCB0aGUgSHVmZm1hbiB0YWJsZXMgdXNlZCBpbiBNUEVHNCBjb2RlYwotICoKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLQotI2luY2x1ZGUgImFybUNPTU1fQml0c3RyZWFtLmgiCi0KLQotCi0KLS8vIENvbnRhaW5zIG9wdGltaXplZCBhbmQgUGFja2VkIFZMQyB0YWJsZXMgd2l0aCBMYXN0PTAgYW5kIExhc3Q9MQotCi0vLyAgICAgICAgICAgICAgb3B0aW1pemVkIFBhY2tlZCBWTEMgdGFibGUgRW50cnkgRm9ybWF0IAotLy8gICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gCi0vLyAgICAgICAgMTUgMTQgMTMgMTIgMTEgMTAgMDkgMDggMDcgMDYgMDUgMDQgMDMgMDIgMDEgMDAKLS8vICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0vLyAgICAgICB8ICBMZW4gICB8ICAgICAgIFJ1biAgICAgICB8ICAgICBMZXZlbCAgICB8TCB8IDEgfAotLy8gICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLS8vICAgICAgIHwgICAgICAgICAgICAgICAgT2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgIHwgMCB8Ci0vLyAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotLy8gSWYgdGhlIHRhYmxlIGVudHJ5IGlzIGEgbGVhZiBlbnRyeSB0aGVuIGJpdCAwIHNldDoKLS8vICAgIExlbiAgICA9IE51bWJlciBvZiBiaXRzIG92ZXJyZWFkICAoMCB0byA3KSAgMyBiaXRzCi0vLyAgICBSdW4gICAgPSBSdW5MZW5ndGggb2YgdGhlIFN5bWJvbCAgKDAgdG8gNjMpIDYgYml0cwotLy8gICAgTGV2ZWwgID0gTGV2ZWwgb2YgdGhlIFN5bWJvbCAgICAgICgwIHRvIDMxKSA1IGJpdHMKLS8vICAgIEwgICAgICA9IExhc3QgVmFsdWUgb2YgdGhlIFN5bWJvbCAoMCBvciAxKSAgMSBiaXQKLS8vCi0vLyBJZiB0aGUgdGFibGUgZW50cnkgaXMgYW4gaW50ZXJuYWwgbm9kZSB0aGVuIGJpdCAwIGlzIGNsZWFyOgotLy8gICAgT2Zmc2V0ID0gTnVtYmVyIG9mICgxNi1iaXQpIGhhbGYgd29yZHMgZnJvbSB0aGUgdGFibGUKLS8vICAgICAgICAgICAgIHN0YXJ0IHRvIHRoZSBuZXh0IHRhYmxlIG5vZGUKLS8vCi0vLyBUaGUgdGFibGUgaXMgYWNjZXNzZWQgYnkgc3VjY2Vzc2l2ZSBsb29rdXAgdXAgb24gdGhlCi0vLyBuZXh0IFN0ZXAgYml0cyBvZiB0aGUgaW5wdXQgYml0c3RyZWFtIHVudGlsIGEgbGVhZiBub2RlCi0vLyBpcyBvYnRhaW5lZC4gVGhlIFN0ZXAgc2l6ZXMgYXJlIHN1cHBsaWVkIHRvIHRoZSBWTEQgbWFjcm8uCi0KLS8vIFRoZSBWTEMgdGFibGVzIHVzZWQgZm9yIEludHJhIGFuZCBub24gaW50YSBjb2VmZmljaWVudHMgaW4gbm9uIEVzY2FwZSBtb2RlCi0vLyBjb250YWlucyBzeW1ib2xzIHdpdGggYm90aCBMYXN0PTAgYW5kIExhc3Q9MS4KLS8vIElmIGEgc3ltYm9sIGlzIG5vdCBmb3VuZCBpbiB0aGUgdGFibGUgaXQgd2lsbCBiZSBjb2RlZCBhcyAweEZGRgotIAotCi1jb25zdCBPTVhfVTE2IGFybVZDTTRQMl9JbnRlclZsY0wwTDFbMjAwXSA9IHsKLSAgICAweDAwMjAsIDB4MDEwOCwgMHgwMTQ4LCAweDAxNzAsIDB4MDE3OCwgMHgwMTgwLCAweDAxODgsIDB4MWIwOSwKLSAgICAweDQwMDksIDB4NDAwOSwgMHg0MDA5LCAweDQwMDksIDB4MjEwOSwgMHgyMTA5LCAweDAyMDksIDB4MDAxMSwKLSAgICAweDAwMjgsIDB4MDA2MCwgMHgwMGI4LCAweDAwZTAsIDB4MDAzMCwgMHgwMDQ4LCAweDAwNTAsIDB4MDA1OCwKLSAgICAweDNmZmYsIDB4M2ZmZiwgMHgwMDM4LCAweDAwNDAsIDB4MjExNSwgMHgyMTE1LCAweDIwMWQsIDB4MjAxZCwKLSAgICAweDIwNTksIDB4MjA1OSwgMHgyMDUxLCAweDIwNTEsIDB4MWMwZCwgMHgxYjBkLCAweDFhMGQsIDB4MTkwZCwKLSAgICAweDA5MTEsIDB4MDgxMSwgMHgwNzExLCAweDA2MTEsIDB4MDUxMSwgMHgwMzE5LCAweDAyMTksIDB4MDEyMSwKLSAgICAweDAwNjgsIDB4MDA5MCwgMHgzZmZmLCAweDNmZmYsIDB4MDA3MCwgMHgwMDc4LCAweDAwODAsIDB4MDA4OCwKLSAgICAweDIwNjEsIDB4MjA2MSwgMHgyMTI5LCAweDIxMjksIDB4MzcwOSwgMHgzNzA5LCAweDM4MDksIDB4MzgwOSwKLSAgICAweDNkMGQsIDB4M2QwZCwgMHgzZTBkLCAweDNlMGQsIDB4M2YwZCwgMHgzZjBkLCAweDIwMGQsIDB4MjAwZCwKLSAgICAweDAwOTgsIDB4MDBhMCwgMHgwMGE4LCAweDAwYjAsIDB4MDEzMSwgMHgwMjIxLCAweDA0MTksIDB4MDUxOSwKLSAgICAweDA2MTksIDB4MGExMSwgMHgxOTA5LCAweDFhMDksIDB4MjEwZCwgMHgyMjBkLCAweDIzMGQsIDB4MjQwZCwKLSAgICAweDI1MGQsIDB4MjYwZCwgMHgyNzBkLCAweDI4MGQsIDB4MDBjMCwgMHgwMGM4LCAweDAwZDAsIDB4MDBkOCwKLSAgICAweDAwNDksIDB4MDA0MSwgMHgzODBkLCAweDM4MGQsIDB4MzcwZCwgMHgzNzBkLCAweDM2MGQsIDB4MzYwZCwKLSAgICAweDM1MGQsIDB4MzUwZCwgMHgzNDBkLCAweDM0MGQsIDB4MzMwZCwgMHgzMzBkLCAweDMyMGQsIDB4MzIwZCwKLSAgICAweDAwZTgsIDB4MDBmMCwgMHgwMGY4LCAweDAxMDAsIDB4MzEwZCwgMHgzMTBkLCAweDIwMTUsIDB4MjAxNSwKLSAgICAweDM2MDksIDB4MzYwOSwgMHgzNTA5LCAweDM1MDksIDB4MzQwOSwgMHgzNDA5LCAweDMzMDksIDB4MzMwOSwKLSAgICAweDMyMDksIDB4MzIwOSwgMHgzMTA5LCAweDMxMDksIDB4MDExMCwgMHgwMTMwLCAweDAxMzgsIDB4MDE0MCwKLSAgICAweDAxMTgsIDB4MDEyMCwgMHgwMTI4LCAweDEwMGQsIDB4MzAwOSwgMHgzMDA5LCAweDJmMDksIDB4MmYwOSwKLSAgICAweDI0MTEsIDB4MjQxMSwgMHgyMzExLCAweDIzMTEsIDB4MjAzOSwgMHgyMDM5LCAweDIwMzEsIDB4MjAzMSwKLSAgICAweDBmMGQsIDB4MGUwZCwgMHgwZDBkLCAweDBjMGQsIDB4MGIwZCwgMHgwYTBkLCAweDA5MGQsIDB4MGUwOSwKLSAgICAweDBkMDksIDB4MDIxMSwgMHgwMTE5LCAweDAwMjksIDB4MDE1MCwgMHgwMTU4LCAweDAxNjAsIDB4MDE2OCwKLSAgICAweDI4MGQsIDB4MjgwZCwgMHgyNzBkLCAweDI3MGQsIDB4MjYwZCwgMHgyNjBkLCAweDI1MGQsIDB4MjUwZCwKLSAgICAweDJjMDksIDB4MmMwOSwgMHhiNzU5LCAweGI3NTksIDB4MmEwOSwgMHgyYTA5LCAweDIwMjEsIDB4MjAyMSwKLSAgICAweDA0MGQsIDB4MDMwZCwgMHgwYjM1LCAweDAxMGQsIDB4MDkwOSwgMHgwODA5LCAweDA3MDksIDB4MDYwOSwKLSAgICAweDAxMTEsIDB4MDAxOSwgMHgyNTA5LCAweDI1MDksIDB4MjQwOSwgMHgyNDA5LCAweDIzMDksIDB4MjMwOQotfTsKLQotCi1jb25zdCBPTVhfVTE2IGFybVZDTTRQMl9JbnRyYVZsY0wwTDFbMjAwXSA9IHsKLSAgICAweDAwMjAsIDB4MDEwOCwgMHgwMTQ4LCAweDAxNzAsIDB4MDE3OCwgMHgwMTgwLCAweDAxODgsIDB4MGYwOSwKLSAgICAweDQwMDksIDB4NDAwOSwgMHg0MDA5LCAweDQwMDksIDB4MjAxMSwgMHgyMDExLCAweDAxMDksIDB4MDAxOSwKLSAgICAweDAwMjgsIDB4MDA2MCwgMHgwMGI4LCAweDAwZTAsIDB4MDAzMCwgMHgwMDQ4LCAweDAwNTAsIDB4MDA1OCwKLSAgICAweDNmZmYsIDB4M2ZmZiwgMHgwMDM4LCAweDAwNDAsIDB4MjAzZCwgMHgyMDNkLCAweDIwMzUsIDB4MjAzNSwKLSAgICAweDIwYjEsIDB4MjBiMSwgMHgyMGE5LCAweDIwYTksIDB4MDIxNSwgMHgwMTFkLCAweDAwMmQsIDB4MGQwOSwKLSAgICAweDA1MTksIDB4MDgxMSwgMHgwNDE5LCAweDAzMjEsIDB4MDIyMSwgMHgwMTM5LCAweDAwYTEsIDB4MDA5OSwKLSAgICAweDAwNjgsIDB4MDA5MCwgMHgzZmZmLCAweDNmZmYsIDB4MDA3MCwgMHgwMDc4LCAweDAwODAsIDB4MDA4OCwKLSAgICAweDIwYjksIDB4MjBiOSwgMHgyMGMxLCAweDIwYzEsIDB4MjE0MSwgMHgyMTQxLCAweDI5MTEsIDB4MjkxMSwKLSAgICAweDIzMTUsIDB4MjMxNSwgMHgyNDE1LCAweDI0MTUsIDB4MmYwZCwgMHgyZjBkLCAweDMwMGQsIDB4MzAwZCwKLSAgICAweDAwOTgsIDB4MDBhMCwgMHgwMGE4LCAweDAwYjAsIDB4MDBjOSwgMHgwMGQxLCAweDAwZDksIDB4MDE0OSwKLSAgICAweDA2MTksIDB4MDE1MSwgMHgwMjI5LCAweDA3MTksIDB4MGUwOSwgMHgwMDQ1LCAweDA1MTUsIDB4MDYxNSwKLSAgICAweDExMGQsIDB4MTIwZCwgMHgxMzBkLCAweDE0MGQsIDB4MDBjMCwgMHgwMGM4LCAweDAwZDAsIDB4MDBkOCwKLSAgICAweDAwOTEsIDB4MDA4OSwgMHgyZTBkLCAweDJlMGQsIDB4MmQwZCwgMHgyZDBkLCAweDJjMGQsIDB4MmMwZCwKLSAgICAweDJiMGQsIDB4MmIwZCwgMHgyYTBkLCAweDJhMGQsIDB4MjExNSwgMHgyMTE1LCAweDIwMjUsIDB4MjAyNSwKLSAgICAweDAwZTgsIDB4MDBmMCwgMHgwMGY4LCAweDAxMDAsIDB4MmMwOSwgMHgyYzA5LCAweDJiMDksIDB4MmIwOSwKLSAgICAweDI3MTEsIDB4MjcxMSwgMHgyNjExLCAweDI2MTEsIDB4MjUxMSwgMHgyNTExLCAweDIzMTksIDB4MjMxOSwKLSAgICAweDIyMTksIDB4MjIxOSwgMHgyMTMxLCAweDIxMzEsIDB4MDExMCwgMHgwMTMwLCAweDAxMzgsIDB4MDE0MCwKLSAgICAweDAxMTgsIDB4MDEyMCwgMHgwMTI4LCAweDA4MGQsIDB4MjEyOSwgMHgyMTI5LCAweDIwODEsIDB4MjA4MSwKLSAgICAweDI0MTEsIDB4MjQxMSwgMHgyMDc5LCAweDIwNzksIDB4MjA3MSwgMHgyMDcxLCAweDIwNjksIDB4MjA2OSwKLSAgICAweDFiYjUsIDB4MDYwZCwgMHgwMDFkLCAweGQzZjksIDB4MDkwOSwgMHgwODA5LCAweDA5MGQsIDB4MDMxMSwKLSAgICAweDAxMjEsIDB4MDA2MSwgMHgwMDU5LCAweDAwNTEsIDB4MDE1MCwgMHgwMTU4LCAweDAxNjAsIDB4MDE2OCwKLSAgICAweDI0MGQsIDB4MjQwZCwgMHgyMzBkLCAweDIzMGQsIDB4MjYwOSwgMHgyNjA5LCAweDI1MGQsIDB4MjUwZCwKLSAgICAweDI3MDksIDB4MjcwOSwgMHgyMjExLCAweDIyMTEsIDB4MjExOSwgMHgyMTE5LCAweDIwNDksIDB4MjA0OSwKLSAgICAweDAwMTUsIDB4MDUwOSwgMHgwMjBkLCAweDAxMGQsIDB4MDQwOSwgMHgwMzA5LCAweDAwNDEsIDB4MDAzOSwKLSAgICAweDAxMTEsIDB4MDAzMSwgMHgyMjA5LCAweDIyMDksIDB4MjAyOSwgMHgyMDI5LCAweDIwMjEsIDB4MjAyMQotfTsKLQotY29uc3QgT01YX1UxNiBhcm1WQ000UDJfYUludHJhRENMdW1hQ2hyb21hSW5kZXhbNjRdID0gewotICAgIDB4MDAyMCwgMHgwMDBiLCAweDIwMDksIDB4MjAwOSwgMHgyMDA3LCAweDIwMDcsIDB4MjAwMSwgMHgyMDAxLAotICAgIDB4NDAwNSwgMHg0MDA1LCAweDQwMDUsIDB4NDAwNSwgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywgMHg0MDAzLAotICAgIDB4MDAyOCwgMHgwMDBmLCAweDIwMGQsIDB4MjAwZCwgMHgwMDMwLCAweDAwMTMsIDB4MjAxMSwgMHgyMDExLAotICAgIDB4MDAzOCwgMHgwMDE3LCAweDIwMTUsIDB4MjAxNSwgMHgzZmZmLCAweDNmZmYsIDB4MjAxOSwgMHgyMDE5LAotCi0JMHgwMDIwLCAweDAwMDksIDB4MjAwNywgMHgyMDA3LCAweDQwMDUsIDB4NDAwNSwgMHg0MDA1LCAweDQwMDUsCi0gICAgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywgMHg0MDAzLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEsCi0gICAgMHgwMDI4LCAweDAwMGQsIDB4MjAwYiwgMHgyMDBiLCAweDAwMzAsIDB4MDAxMSwgMHgyMDBmLCAweDIwMGYsCi0gICAgMHgwMDM4LCAweDAwMTUsIDB4MjAxMywgMHgyMDEzLCAweDFmZmYsIDB4MDAxOSwgMHgyMDE3LCAweDIwMTcKLX07Ci0KLQotY29uc3QgT01YX1UxNiBhcm1WQ000UDJfYVZsY01WRFsxMjRdID0gewotICAgIDB4MDAxMCwgMHgwMGYwLCAweDAwNDMsIDB4MDAzZiwgMHg0MDQxLCAweDQwNDEsIDB4NDA0MSwgMHg0MDQxLAotICAgIDB4MDAxOCwgMHgwMGQ4LCAweDAwNDcsIDB4MDAzYiwgMHgwMDIwLCAweDAwODAsIDB4MDBhOCwgMHgwMGQwLAotICAgIDB4MDAyOCwgMHgwMDQ4LCAweDAwNzAsIDB4MDA3OCwgMHgxZmZmLCAweDAwMzAsIDB4MDAzOCwgMHgwMDQwLAotICAgIDB4MDA4MSwgMHgwMDAxLCAweDAwN2YsIDB4MDAwMywgMHgyMDdkLCAweDIwN2QsIDB4MjAwNSwgMHgyMDA1LAotICAgIDB4MjA3YiwgMHgyMDdiLCAweDIwMDcsIDB4MjAwNywgMHgwMDUwLCAweDAwNTgsIDB4MDA2MCwgMHgwMDY4LAotICAgIDB4MjA3OSwgMHgyMDc5LCAweDIwMDksIDB4MjAwOSwgMHgyMDc3LCAweDIwNzcsIDB4MjAwYiwgMHgyMDBiLAotICAgIDB4MjA3NSwgMHgyMDc1LCAweDIwMGQsIDB4MjAwZCwgMHgyMDczLCAweDIwNzMsIDB4MjAwZiwgMHgyMDBmLAotICAgIDB4MDA3MSwgMHgwMDExLCAweDAwNmYsIDB4MDAxMywgMHgwMDZkLCAweDAwMTUsIDB4MDA2YiwgMHgwMDE3LAotICAgIDB4MDA4OCwgMHgwMDkwLCAweDAwOTgsIDB4MDBhMCwgMHgwMDY5LCAweDAwMTksIDB4MDA2NywgMHgwMDFiLAotICAgIDB4MDA2NSwgMHgwMDFkLCAweDAwNjMsIDB4MDAxZiwgMHgwMDYxLCAweDAwMjEsIDB4MDA1ZiwgMHgwMDIzLAotICAgIDB4MDA1ZCwgMHgwMDI1LCAweDAwNWIsIDB4MDAyNywgMHgwMGIwLCAweDAwYjgsIDB4MDBjMCwgMHgwMGM4LAotICAgIDB4MDA1OSwgMHgwMDI5LCAweDAwNTcsIDB4MDAyYiwgMHgyMDU1LCAweDIwNTUsIDB4MjAyZCwgMHgyMDJkLAotICAgIDB4MjA1MywgMHgyMDUzLCAweDIwMmYsIDB4MjAyZiwgMHgyMDUxLCAweDIwNTEsIDB4MjAzMSwgMHgyMDMxLAotICAgIDB4MjA0ZiwgMHgyMDRmLCAweDIwMzMsIDB4MjAzMywgMHgwMGUwLCAweDAwZTgsIDB4MDA0OSwgMHgwMDM5LAotICAgIDB4MjA0ZCwgMHgyMDRkLCAweDIwMzUsIDB4MjAzNSwgMHgyMDRiLCAweDIwNGIsIDB4MjAzNywgMHgyMDM3LAotICAgIDB4MjA0NSwgMHgyMDQ1LCAweDIwM2QsIDB4MjAzZAotfTsKLQotLyogTE1BWCB0YWJsZSBmb3Igbm9uIEludGVyIChMYXN0ID09IDAgYW5kIExhc3Q9MSkKLSAgIExldmVsIC0gMSBJbmRleGVkCi0gICBwYWRkZWQgYXJtVkNNNFAyX0ludGVyTDBMMUxNQVhbMjctMzFdIHdpdGggemVyb3MgdG8gYWNlc3MgZW50cmllcyBmb3IgTGFzdD0xIGVmZmVjdGl2ZWx5Ci0KLSovCi1jb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDBMMUxNQVhbNzNdID0gCi17Ci0gICAxMiwgIDYsICA0LCAgMywgIDMsICAzLCAgMywgIDIsIAotICAgIDIsICAyLCAgMiwgIDEsICAxLCAgMSwgIDEsICAxLAotICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAotICAgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLAotICAgIDMsICAyLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAKLQkxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKLQkxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKLQkxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKLQkxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKLQkxCi19OwotCi0vKiBSTUFYIHRhYmxlIGZvciBub24gSW50ZXIgKExhc3QgPT0gMCBhbmQgTGFzdD0xKQotICAgTGV2ZWwgLSAxIEluZGV4ZWQgCi0gcGFkZGVkIGFybVZDTTRQMl9JbnRlckwwTDFSTUFYWzEyLTMxXSB3aXRoIHplcm9zIHRvIGFjY2VzcyBlbnRyaWVzIGZvciBMYXN0PTEgdGFibGUgZWZmZWN0aXZlbHkgKi8KLQotCi1jb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDBMMVJNQVhbMzVdID0gCi17Ci0gICAyNiwgMTAsICA2LCAgMiwgIDEsICAxLCAgIAotICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKLQkwLAkwLAkwLAkwLAkwLAkwLAotCTAsCTAsCTAsCTAsCTAsCTAsCi0JMCwJMCwJMCwJMCwKLSAgICAwLCAgMCwgIDAsICAwLCAgNDAsICAxLCAgMAotfTsKLQotLyogTE1BWCB0YWJsZSBmb3Igbm9uIEludHJhIChMYXN0ID09IDAgYW5kIExhc3Q9MSkKLSAgIExldmVsIC0gMSBJbmRleGVkCi0gICBwYWRkZWQgYXJtVkNNNFAyX0ludHJhTDBMMUxNQVhbMTUtMzFdIHdpdGggemVyb3MgdG8gYWNlc3MgZW50cmllcyBmb3IgTGFzdD0xIGVmZmVjdGl2ZWx5Ci0KLSovCi1jb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDBMMUxNQVhbNTNdID0gCi17Ci0gICAyNywgMTAsICA1LCAgNCwgIDMsICAzLCAgMywgIAotICAgIDMsICAyLCAgMiwgIDEsICAxLCAgMSwgIDEsICAxLAkwLAotCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCi0JMCwJMCwJMCwJMCwJMCwJMCwJMCwJMCwKLQotCTgsICAzLCAgMiwgIDIsICAyLCAgMiwgIDIsICAxLCAKLQkxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKLQkxLCAgMSwgIDEsICAxLCAgMQotfTsKLQotCi0vKiBSTUFYIHRhYmxlIGZvciBub24gSW50ZXIgKExhc3QgPT0gMCBhbmQgTGFzdD0xKQotICAgTGV2ZWwgLSAxIEluZGV4ZWQgCi0gcGFkZGVkIGFybVZDTTRQMl9JbnRyYUwwTDFSTUFYWzI3LTMxXSB3aXRoIHplcm9zIHRvIGFjY2VzcyBlbnRyaWVzIGZvciBMYXN0PTEgdGFibGUgZWZmZWN0aXZlbHkgKi8KLQotCi1jb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDBMMVJNQVhbNDBdID0KLXsKLSAgIDE0LCAgOSwgIDcsICAzLCAgMiwgIDEsCTEsICAKLSAgICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsIAkwLCAgCi0gICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIAotICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCi0JMCwJMCwJMCwJMCwKLQkKLQkyMCwgIDYsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAKLQotfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfTG9va3VwX1RhYmxlcy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL2FybVZDTTRQMl9Mb29rdXBfVGFibGVzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NzM5YTUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL2FybVZDTTRQMl9Mb29rdXBfVGFibGVzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0gLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9Mb29rdXBfVGFibGVzLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBGaWxlOiAgICAgICAgYXJtVkNNNFAyX0xvb2t1cF9UYWJsZXMuYwotICogRGVzY3JpcHRpb246IENvbnRhaW5zIGFsbCB0aGUgTG9va3VwIHRhYmxlcyB1c2VkIGluIE1QRUc0IGNvZGVjCi0gKgotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotCi0gICAgLyogKiBUYWJsZSBFbnRyaWVzIGNvbnRhaW4gRGMgU2NhbGVyIHZhbHVlcwotICAgICAgICogYXJtVkNNNFAyX0RDU2NhbGVyW2ldPSA4ICAgICAgICAgICBmb3IgaT0xICB0byAgNCBhbmQgaT0zMyB0byAzNgotICAgICAgICogICAgICAgICAgICAgICAgICAgICAgPSAyKmkgICAgICAgICBmb3IgaT01ICB0byAgOAotICAgICAgICogICAgICAgICAgICAgICAgICAgICAgPSBpKzggICAgICAgICBmb3IgaT05ICB0byAgMjUKLSAgICAgICAqICAgICAgICAgICAgICAgICAgICAgID0gMippLTE2ICAgICAgZm9yIGk9MjYgdG8gIDMxCi0gICAgICAgKiAgICAgICAgICAgICAgICAgICAgICA9IChpLTMyKzEzKS8yIGZvciBpPTM3IHRvICA1OQotICAgICAgICogICAgICAgICAgICAgICAgICAgICAgPSBpLTYtMzIgICAgICBmb3IgaT02MCB0byAgNjMKLSAgICAgICAqICAgICAgICAgICAgICAgICAgICAgID0gMjU1ICAgICAgICAgZm9yIGk9MCBhbmQgaT0zMgotICAgICAgICovCi0gICAgICAgCi1jb25zdCBPTVhfVTggYXJtVkNNNFAyX0RDU2NhbGVyWzY0XT17Ci0JMHhmZiwgMHg4LCAgMHg4LCAgMHg4LCAgMHg4LCAgMHhhLCAgMHhjLCAgMHhlLCAgCi0gICAgMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgCi0gICAgMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwKLSAgICAweDIwLCAweDIyLCAweDI0LCAweDI2LCAweDI4LCAweDJhLCAweDJjLCAweDJlLAotICAgIDB4ZmYsIDB4OCwgIDB4OCwgIDB4OCwgIDB4OCwgIDB4OSwgIDB4OSwgIDB4YSwgIAotICAgIDB4YSwgIDB4YiwgIDB4YiwgIDB4YywgIDB4YywgIDB4ZCwgIDB4ZCwgIDB4ZSwgIAotICAgIDB4ZSwgIDB4ZiwgIDB4ZiwgIDB4MTAsIDB4MTAsIDB4MTEsIDB4MTEsIDB4MTIsIAotICAgIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIDB4MTgsIDB4MTksCi0KLX07Ci0KLSAgICAgICAgICAgICAgCi0gICAgIC8qICBUYWJsZSBFbnRyaWVzIENvbnRhaW4gcmVjaXByb2NhbCBvZiAxIHRvIDYzCi0gICAgICAqICBhcm1WQ000UDJfUmVjaXByb2NhbF9RUF9TMTZbaV09cm91bmQoMzI3NjcvaSkKLSAgICAgICogIGFybVZDTTRQMl9SZWNpcHJvY2FsX1FQX1MxNlswXT0gMAotICAgICAgKi8KLQotY29uc3QgT01YX1MxNiBhcm1WQ000UDJfUmVjaXByb2NhbF9RUF9TMTZbNjRdPXsKLQkweDAwMDAsMHg3ZmZmLDB4NDAwMCwweDJhYWEsMHgyMDAwLDB4MTk5OSwweDE1NTUsMHgxMjQ5LAotICAgIDB4MTAwMCwweDBlMzksMHgwY2NkLDB4MGJhMywweDBhYWIsMHgwOWQ5LDB4MDkyNSwweDA4ODgsCi0gICAgMHgwODAwLDB4MDc4NywweDA3MWMsMHgwNmJkLDB4MDY2NiwweDA2MTgsMHgwNWQxLDB4MDU5MSwKLSAgICAweDA1NTUsMHgwNTFmLDB4MDRlYywweDA0YmUsMHgwNDkyLDB4MDQ2YSwweDA0NDQsMHgwNDIxLAotICAgIDB4MDQwMCwweDAzZTEsMHgwM2M0LDB4MDNhOCwweDAzOGUsMHgwMzc2LDB4MDM1ZSwweDAzNDgsCi0gICAgMHgwMzMzLDB4MDMxZiwweDAzMGMsMHgwMmZhLDB4MDJlOSwweDAyZDgsMHgwMmM4LDB4MDJiOSwKLSAgICAweDAyYWIsMHgwMjlkLDB4MDI4ZiwweDAyODIsMHgwMjc2LDB4MDI2YSwweDAyNWYsMHgwMjU0LAotICAgIDB4MDI0OSwweDAyM2YsMHgwMjM1LDB4MDIyYiwweDAyMjIsMHgwMjE5LDB4MDIxMSwweDAyMDgKLQkgICAKLX07Ci0gICAgIAotICAgICAgLyogVGFibGUgRW50cmllcyBDb250YWluIHJlY2lwcm9jYWwgb2YgMSB0byA2MwotICAgICAgICogYXJtVkNNNFAyX1JlY2lwcm9jYWxfUVBfUzMyW2ldPXJvdW5kKDEzMTA3MS9pKQotICAgICAgICogYXJtVkNNNFAyX1JlY2lwcm9jYWxfUVBfUzMyWzBdPSAwCi0gICAgICAgKi8KLQotY29uc3QgT01YX1MzMiBhcm1WQ000UDJfUmVjaXByb2NhbF9RUF9TMzJbNjRdPXsKLQkweDAwMDAwMDAwLDB4MDAwMWZmZmYsMHgwMDAxMDAwMCwweDAwMDBhYWFhLCAweDAwMDA4MDAwLCAweDAwMDA2NjY2LCAweDAwMDA1NTU1LCAweDAwMDA0OTI0LAotICAgIDB4MDAwMDQwMDAsMHgwMDAwMzhlMywweDAwMDAzMzMzLDB4MDAwMDJlOGMsIDB4MDAwMDJhYWIsIDB4MDAwMDI3NjIsIDB4MDAwMDI0OTIsIDB4MDAwMDIyMjIsCi0gICAgMHgwMDAwMjAwMCwweDAwMDAxZTFlLDB4MDAwMDFjNzIsMHgwMDAwMWFmMiwgMHgwMDAwMTk5YSwgMHgwMDAwMTg2MSwgMHgwMDAwMTc0NiwgMHgwMDAwMTY0MywKLSAgICAweDAwMDAxNTU1LDB4MDAwMDE0N2IsMHgwMDAwMTNiMSwweDAwMDAxMmY2LCAweDAwMDAxMjQ5LCAweDAwMDAxMWE4LCAweDAwMDAxMTExLCAweDAwMDAxMDg0LAotICAgIDB4MDAwMDEwMDAsMHgwMDAwMGY4NCwweDAwMDAwZjBmLDB4MDAwMDBlYTEsIDB4MDAwMDBlMzksIDB4MDAwMDBkZDYsIDB4MDAwMDBkNzksIDB4MDAwMDBkMjEsCi0gICAgMHgwMDAwMGNjZCwweDAwMDAwYzdkLDB4MDAwMDBjMzEsMHgwMDAwMGJlOCwgMHgwMDAwMGJhMywgMHgwMDAwMGI2MSwgMHgwMDAwMGIyMSwgMHgwMDAwMGFlNSwKLSAgICAweDAwMDAwYWFiLDB4MDAwMDBhNzMsMHgwMDAwMGEzZCwweDAwMDAwYTBhLCAweDAwMDAwOWQ5LCAweDAwMDAwOWE5LCAweDAwMDAwOTdiLCAweDAwMDAwOTRmLAotICAgIDB4MDAwMDA5MjUsMHgwMDAwMDhmYiwweDAwMDAwOGQ0LDB4MDAwMDA4YWUsIDB4MDAwMDA4ODksIDB4MDAwMDA4NjUsIDB4MDAwMDA4NDIsIDB4MDAwMDA4MjAKLQkKLX07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1NldFByZWREaXJfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL2FybVZDTTRQMl9TZXRQcmVkRGlyX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBkMTNkMS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1NldFByZWREaXJfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDJfU2V0UHJlZERpcl9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICA5NjQxCi07Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi07ICoqCi07ICogRnVuY3Rpb246IGFybVZDTTRQMl9TZXRQcmVkRGlyCi07ICoKLTsgKiBEZXNjcmlwdGlvbjoKLTsgKiBQZXJmb3JtcyBkZXRlY3RpbmcgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uCi07ICoKLTsgKiBSZW1hcmtzOgotOyAqCi07ICogUGFyYW1ldGVyczoKLTsgKiBbaW5dIGJsb2NrSW5kZXggIGJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZAotOyAqICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiBhcyBkZWZpbmVkIGluIHN1YmNsYXVzZSA2LjEuMy44LCBvZiBJU08vSUVDCi07ICogICAgICAgICAgICAgICAgICAgICAgICAgIDE0NDk2LTIuIEZ1cnRoZXJtb3JlLCBpbmRleGVzIDYgdG8gOSBpbmRpY2F0ZSB0aGUKLTsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEgYmxvY2tzIHNwYXRpYWxseSBjb3JyZXNwb25kaW5nIHRvIGx1bWluYW5jZQotOyAqICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja3MgMCB0byAzIGluIHRoZSBzYW1lIG1hY3JvYmxvY2suCi07ICogW2luXSBwQ29lZkJ1ZlJvdyBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyCi07ICogW2luXSBwUXBCdWYgICAgICBwb2ludGVyIHRvIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGJ1ZmZlcgotOyAqIFtvdXRdcHJlZFFQICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgcHJlZGljdG9yIGJsb2NrCi07ICogW291dF1wcmVkRGlyICAgICBpbmRpY2F0ZXMgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uIHdoaWNoIHRha2VzIG9uZQotOyAqICAgICAgICAgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6Ci07ICogICAgICAgICAgICAgICAgICBPTVhfVkNfSE9SSVpPTlRBTCAgICBwcmVkaWN0IGhvcml6b250YWxseQotOyAqICAgICAgICAgICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMICAgICAgcHJlZGljdCB2ZXJ0aWNhbGx5Ci07ICoKLTsgKiBSZXR1cm4gVmFsdWU6Ci07ICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi07ICoKLTsgKi8KLQotICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgIElOQ0xVREUgb214VkNfcy5oCi0KLQotICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0KLQotICAgICAgIElGIEFSTTExMzZKUwotIAotOy8vIElucHV0IEFyZ3VtZW50cwotQmxvY2tJbmRleCAgICAgICAgIFJOIDAKLXBDb2VmQnVmUm93ICAgICAgICBSTiAxCi1wQ29lZkJ1ZkNvbCAgICAgICAgUk4gMgotcHJlZERpciAgICAgICAgICAgIFJOIDMKLXByZWRRUCAgICAgICAgICAgICBSTiA0Ci1wUXBCdWYgICAgICAgICAgICAgUk4gNQotCi07Ly8gTG9jYWwgVmFyaWFibGVzCi0KLVJldHVybiAgICAgICAgICAgICBSTiAwCi1ibG9ja0RDTGVmdCAgICAgICAgUk4gNiAgCi1ibG9ja0RDVG9wICAgICAgICAgUk4gNwotYmxvY2tEQ1RvcExlZnQgICAgIFJOIDgKLXRlbXAxICAgICAgICAgICAgICBSTiA5Ci10ZW1wMiAgICAgICAgICAgICAgUk4gMTQKLQotICAgICAgIE1fU1RBUlQgICAgYXJtVkNNNFAyX1NldFByZWREaXIscjkKLQotICAgICAgIE1fQVJHICAgICAgIHBwcmVkUVAsNAotICAgICAgIE1fQVJHICAgICAgIHBwUXBCdWYsNAotICAgIAotICAgICAgIExEUkggICAgICAgIGJsb2NrRENUb3BMZWZ0LFtwQ29lZkJ1ZlJvdywjLTE2XQotICAgICAgIExEUkggICAgICAgIGJsb2NrRENMZWZ0LFtwQ29lZkJ1ZkNvbF0KLSAgICAgICAKLSAgICAgICBURVEgICAgICAgICBCbG9ja0luZGV4LCMzCi0gICAgICAgTERSRVFIICAgICAgYmxvY2tEQ1RvcCxbcENvZWZCdWZDb2wsIy0xNl0KLSAgICAgICBMRFJORUggICAgICBibG9ja0RDVG9wLFtwQ29lZkJ1ZlJvd10KLSAgICAgICAgICAgICAKLSAgICAgICBTVUJTICAgICAgICB0ZW1wMSxibG9ja0RDTGVmdCxibG9ja0RDVG9wTGVmdAotICAgICAgIFJTQkxUICAgICAgIHRlbXAxLHRlbXAxLCMwCi0gICAgICAgU1VCUyAgICAgICAgdGVtcDIsYmxvY2tEQ1RvcExlZnQsYmxvY2tEQ1RvcAotICAgICAgIFJTQkxUICAgICAgIHRlbXAyLHRlbXAyLCMwCi0gICAgICAKLSAgICAgICBNX0xEUiAgICAgICBwUXBCdWYscHBRcEJ1ZgotICAgICAgIE1fTERSICAgICAgIHByZWRRUCxwcHJlZFFQCi0gICAgICAgQ01QICAgICAgICAgdGVtcDEsdGVtcDIKLSAgICAgICBNT1YgICAgICAgICB0ZW1wMiwjT01YX1ZDX1ZFUlRJQ0FMCi0gICAgICAgTERSTFRCICAgICAgdGVtcDEsW3BRcEJ1ZiwjMV0KLSAgICAgICBTVFJMVCAgICAgICB0ZW1wMixbcHJlZERpcl0KLSAgICAgICBTVFJMVCAgICAgICB0ZW1wMSxbcHJlZFFQXQotICAgICAgIE1PViAgICAgICAgIHRlbXAyLCNPTVhfVkNfSE9SSVpPTlRBTCAgICAgICAgICAgCi0gICAgICAgTERSR0VCICAgICAgdGVtcDEsW3BRcEJ1Zl0KLSAgICAgICBTVFJHRSAgICAgICB0ZW1wMixbcHJlZERpcl0KLSAgICAgICBNT1YgICAgICAgICBSZXR1cm4sI09NWF9TdHNfTm9FcnIKLSAgICAgICBTVFJHRSAgICAgICB0ZW1wMSxbcHJlZFFQXSAKLQotICAgICAgICAgCi0gICAgCi0gICAgICAgTV9FTkQKLSAKLSAgICAgICBFTkRJRgotCi0gICAgICAgRU5EICAgIAotICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL2FybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY0NzU1OS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfWmlnemFnX1RhYmxlcy5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRmlsZTogICAgICAgIGFybVZDTTRQMl9aaWdaYWdfVGFibGVzLmMKLSAqIERlc2NyaXB0aW9uOiBDb250YWlucyB0aGUgemlnemFnIHRhYmxlcwotICoKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLQotLyogQ29udGFpbnMgRG91YmxlIHRoZSB2YWx1ZXMgaW4gdGhlIHJlZmVyZW5jZSBaaWd6YWcgVGFibGUKLSAqIENvbnRhaW5zIENsYXNzaWNhbCxWZXRpY2FsIGFuZCBIb3Jpem9udGFsIFppZ3phZ3NjYW4gdGFibGVzIGluIG9uZSBhcnJheSAgCi0gKi8KLQotY29uc3QgT01YX1U4IGFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbiBbMTkyXSA9IAotewotICAgICAwLCAgMiwgIDE2LCAzMiwgIDE4LCAgNCwgIDYsIDIwLAotICAgIDM0LCA0OCwgNjQsIDUwLCAzNiwgMjIsICA4LCAgMTAsCi0gICAgMjQsIDM4LCA1MiwgNjYsIDgwLCA5NiwgODIsIDY4LAotICAgIDU0LCA0MCwgMjYsICAxMiwgIDE0LCAyOCwgNDIsIDU2LCAKLSAgICA3MCwgODQsIDk4LCAxMTIsIDExNCwgMTAwLCA4NiwgNzIsCi0gICAgNTgsIDQ0LCAzMCwgNDYsIDYwLCA3NCwgODgsIDEwMiwKLSAgICAxMTYsIDExOCwgMTA0LCA5MCwgNzYsIDYyLCA3OCwgOTIsCi0gICAgMTA2LCAxMjAsIDEyMiwgMTA0LCA5NCwgMTEwLCAxMjQsIDEyNiwKLQotCTAsICAxNiwgMzIsIDQ4LCAgMiwgIDE4LCAgNCwgMjAsCi0gICAgMzQsIDUwLCA2NCwgODAsIDk2LCAxMTIsIDExNCwgOTgsCi0gICAgODIsIDY2LCA1MiwgMzYsICA2LCAyMiwgIDgsIDI0LAotICAgIDM4LCA1NCwgNjgsIDg0LCAxMDAsIDExNiwgNzAsIDg2LAotICAgIDEwMiwgMTE4LCA0MCwgNTYsICAxMCwgMjYsICAxMiwgMjgsCi0gICAgNDIsIDU4LCA3MiwgODgsIDEwNCwgMTIwLCA3NCwgOTAsIAotICAgIDEwNiwgMTIyLCA0NCwgNjAsICAxNCwgMzAsIDQ2LCA2MiwKLSAgICA3NiwgOTIsIDEwOCwgMTI0LCA3OCwgOTQsIDExMCwgMTI2LAotCi0gICAgMCwgIDIsICA0LCAgNiwgIDE2LCAgMTgsIDMyLCAzNCwKLSAgICAyMCwgMjIsICA4LCAgMTAsICAxMiwgIDE0LCAzMCwgMjgsCi0gICAgMjYsIDI0LCAzOCwgMzYsIDQ4LCA1MCwgNjQsIDY2LAotICAgIDUyLCA1NCwgNDAsIDQyLCA0NCwgNDYsIDU2LCA1OCwKLSAgICA2MCwgNjIsIDY4LCA3MCwgODAsIDgyLCA5NiwgOTgsCi0gICAgODQsIDg2LCA3MiwgNzQsIDc2LCA3OCwgODgsIDkwLCAKLSAgICA5MiwgOTQsIDEwMCwgMTAyLCAxMTIsIDExNCwgMTE2LCAxMTgsCi0gICAgMTA0LCAxMDYsIDEwOCwgMTEwLCAxMjAsIDEyMiwgMTI0LCAxMjYKLQotCi19OwotCi0KLQotCi0KLS8qIEVuZCBvZiBmaWxlICovCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNzc3MmEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlci5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRGVzY3JpcHRpb246IAotICogQ29udGFpbnMgbW9kdWxlcyBmb3IgaW50ZXIgcmVjb25zdHJ1Y3Rpb24KLSAqIAotICovCi0gCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlcgotICoKLSAqIERlc2NyaXB0aW9uOgotICogRGVjb2RlcyB0aGUgSU5URVIgYmxvY2sgY29lZmZpY2llbnRzLiBJbnZlcnNlIHF1YW50aXphdGlvbiwgaW52ZXJzZWx5IHppZ3phZwotICogcG9zaXRpb25pbmcgYW5kIElEQ1QsIHdpdGggYXBwcm9wcmlhdGUgY2xpcHBpbmcgb24gZWFjaCBzdGVwLCBhcmUgcGVyZm9ybWVkCi0gKiBvbiB0aGUgY29lZmZpY2llbnRzLiBUaGUgcmVzdWx0cyAocmVzaWR1YWxzKSBhcmUgcGxhY2VkIGluIGEgY29udGlndW91cyBhcnJheQotICogb2YgNjQgZWxlbWVudHMuIEZvciBJTlRFUiBibG9jaywgdGhlIG91dHB1dCBidWZmZXIgaG9sZHMgdGhlIHJlc2lkdWFscyBmb3IKLSAqIGZ1cnRoZXIgcmVjb25zdHJ1Y3Rpb24uCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCi0gKgkJCQkJCQkJdGhlIGJpdCBzdHJlYW0gYnVmZmVyLiBUaGVyZSBpcyBubyBib3VuZGFyeQotICoJCQkJCQkJCWNoZWNrIGZvciB0aGUgYml0IHN0cmVhbSBidWZmZXIuCi0gKiBbaW5dCXBCaXRPZmZzZXQJCXBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCi0gKgkJCQkJCQkJdG8gYnkgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4KLSAqCQkJCQkJCQlbMC03XQotICogW2luXQlRUAkJCQlxdWFudGl6YXRpb24gcGFyYW1ldGVyCi0gKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgICAgYSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOwotICogICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xIGluZGljYXRlcyB1c2luZyBxdWFudGl6YXRpb24gbWV0aG9kIGRlZmluZWQgaW4gc2hvcnQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8gaGVhZGVyIG1vZGUsIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIGluZGljYXRlcyBub3JtYWlsIHF1YW50aXphdGlvbiBtZXRob2QuCi0gKiBbb3V0XSBwcEJpdFN0cmVhbSAJKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQsIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4KLSAqIFtvdXRdIHBCaXRPZmZzZXQJCSpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbQotICogW291dF0gcERzdAkJCXBvaW50ZXIgdG8gdGhlIGRlY29kZWQgcmVzaWR1YWwgYnVmZmVyIChhIGNvbnRpZ3VvdXMgYXJyYXkgb2YgNjQgZWxlbWVudHMgb2YKLSAqICAgICAgICAgICAgICAgICAgICAgIE9NWF9TMTYgZGF0YSB0eXBlKS4gTXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX1N0c19Ob0VyciAtIG5vIGVycm9yCi0gKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMKLSAqICAgLSBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOdWxsOiBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0ICwgcERzdAotICogICAtIEF0IGxlYXN0IG9uZSBvZiB0aGUgYmVsb3cgY2FzZToKLSAqICAgLSAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddLCBRUCA8PSAwOwotICoJIC0gcERzdCBub3QgMTYtYnl0ZSBhbGlnbmVkCi0gKiBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvcgotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIoCi0gICAgIGNvbnN0IE9NWF9VOCAqKiBwcEJpdFN0cmVhbSwKLSAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCi0gICAgIE9NWF9TMTYgKiBwRHN0LAotICAgICBPTVhfSU5UIFFQLAotICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSkKLXsKLSAgICAvKiA2NCBlbGVtZW50cyBhcmUgbmVlZGVkIGJ1dCB0byBhbGlnbiBpdCB0byAxNiBieXRlcyBuZWVkCi0gICAgMTUgbW9yZSBlbGVtZW50cyBvZiBwYWRkaW5nICovCi0gICAgT01YX1MxNiB0ZW1wQnVmWzc5XTsKLSAgICBPTVhfUzE2ICpwVGVtcEJ1ZjE7Ci0gICAgT01YUmVzdWx0IGVycm9yQ29kZTsKLSAgICAvKiBBbGlnbmluZyB0aGUgbG9jYWwgYnVmZmVycyAqLwotICAgIHBUZW1wQnVmMSA9IGFybUFsaWduVG8xNkJ5dGVzKHRlbXBCdWYpOwotICAgIAotICAgIAotICAgIC8qIFZMRCBhbmQgemlnemFnICovCi0gICAgZXJyb3JDb2RlID0gb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcihwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBCdWYxLHNob3J0VmlkZW9IZWFkZXIpOwotICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOwotICAgIAotICAgIC8qIERlcXVhbnRpemF0aW9uICovCi0gICAgZXJyb3JDb2RlID0gb214VkNNNFAyX1F1YW50SW52SW50ZXJfSSgKLSAgICAgcFRlbXBCdWYxLAotICAgICBRUCk7Ci0gICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7Ci0gICAgCi0gICAgLyogSW52ZXJzZSB0cmFuc2Zvcm0gKi8KLSAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfSURDVDh4OGJsayhwVGVtcEJ1ZjEsIHBEc3QpOwotICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOwotCSAgICAKLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotLyogRW5kIG9mIGZpbGUgKi8KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI0ZmMwNy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBEZXNjcmlwdGlvbjogCi0gKiBDb250YWlucyBtb2R1bGVzIGZvciBpbnRyYSByZWNvbnN0cnVjdGlvbgotICogCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBEZWNvZGVzIHRoZSBJTlRSQSBibG9jayBjb2VmZmljaWVudHMuIEludmVyc2UgcXVhbnRpemF0aW9uLCBpbnZlcnNlbHkgemlnemFnCi0gKiBwb3NpdGlvbmluZywgYW5kIElEQ1QsIHdpdGggYXBwcm9wcmlhdGUgY2xpcHBpbmcgb24gZWFjaCBzdGVwLCBhcmUgcGVyZm9ybWVkCi0gKiBvbiB0aGUgY29lZmZpY2llbnRzLiBUaGUgcmVzdWx0cyBhcmUgdGhlbiBwbGFjZWQgaW4gdGhlIG91dHB1dCBmcmFtZS9wbGFuZSBvbgotICogYSBwaXhlbCBiYXNpcy4gRm9yIElOVFJBIGJsb2NrLCB0aGUgb3V0cHV0IHZhbHVlcyBhcmUgY2xpcHBlZCB0byBbMCwgMjU1XSBhbmQKLSAqIHdyaXR0ZW4gdG8gY29ycmVzcG9uZGluZyBibG9jayBidWZmZXIgd2l0aGluIHRoZSBkZXN0aW5hdGlvbiBwbGFuZS4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KLSAqCQkJCQkJCQl0aGUgYml0IHN0cmVhbSBidWZmZXIuIFRoZXJlIGlzIG5vIGJvdW5kYXJ5Ci0gKgkJCQkJCQkJY2hlY2sgZm9yIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4KLSAqIFtpbl0JcEJpdE9mZnNldAkJcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKLSAqCQkJCQkJCQl0byBieSAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbgotICoJCQkJCQkJCVswLTddLgotICogW2luXQlzdGVwCQkJd2lkdGggb2YgdGhlIGRlc3RpbmF0aW9uIHBsYW5lCi0gKiBbaW4vb3V0XQlwQ29lZkJ1ZlJvdwkJW2luXSAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcgotICogICAgICAgICAgICAgICAgICAgICAgICBbb3V0XSB1cGRhdGVkIGNvZWZmaWNpZW50IHJ3byBidWZmZXIKLSAqIFtpbi9vdXRdCXBDb2VmQnVmQ29sCQlbaW5dICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIFtvdXRdIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcgotICogW2luXQljdXJRUAkJCXF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIG1hY3JvYmxvY2sgd2hpY2gKLSAqCQkJCQkJCQl0aGUgY3VycmVudCBibG9jayBiZWxvbmdzIHRvCi0gKiBbaW5dCXBRcEJ1ZgkJIFBvaW50ZXIgdG8gYSAyLWVsZW1lbnQgUVAgYXJyYXkuIHBRcEJ1ZlswXSBob2xkcyB0aGUgUVAgb2YgdGhlIDh4OCBibG9jayBsZWZ0IHRvCi0gKiAgICAgICAgICAgICAgICAgICB0aGUgY3VycmVudCBibG9jayhRUGEpLiBwUXBCdWZbMV0gaG9sZHMgdGhlIFFQIG9mIHRoZSA4eDggYmxvY2sganVzdCBhYm92ZSB0aGUKLSAqICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYmxvY2soUVBjKS4KLSAqICAgICAgICAgICAgICAgICAgIE5vdGUsIGluIGNhc2UgdGhlIGNvcnJlc3BvbmRpbmcgYmxvY2sgaXMgb3V0IG9mIFZPUCBib3VuZCwgdGhlIFFQIHZhbHVlIHdpbGwgaGF2ZQotICogICAgICAgICAgICAgICAgICAgbm8gZWZmZWN0IHRvIHRoZSBpbnRyYS1wcmVkaWN0aW9uIHByb2Nlc3MuIFJlZmVyIHRvIHN1YmNsYXVzZSAgIjcuNC4zLjMgQWRhcHRpdmUKLSAqICAgICAgICAgICAgICAgICAgIGFjIGNvZWZmaWNpZW50IHByZWRpY3Rpb24iIG9mIElTTy9JRUMgMTQ0OTYtMihNUEVHNCBQYXJ0MikgZm9yIGFjY3VyYXRlIGRlc2NyaXB0aW9uLgotICogW2luXQlibG9ja0luZGV4CQlibG9jayBpbmRleCBpbmRpY2F0aW5nIHRoZSBjb21wb25lbnQgdHlwZSBhbmQKLSAqCQkJCQkJCQlwb3NpdGlvbiBhcyBkZWZpbmVkIGluIHN1YmNsYXVzZSA2LjEuMy44LAotICoJCQkJCQkJCUZpZ3VyZSA2LTUgb2YgSVNPL0lFQyAxNDQ5Ni0yLiAKLSAqIFtpbl0JaW50cmFEQ1ZMQwkJYSBjb2RlIGRldGVybWluZWQgYnkgaW50cmFfZGNfdmxjX3RociBhbmQgUVAuCi0gKgkJCQkJCQkJVGhpcyBhbGxvd3MgYSBtZWNoYW5pc20gdG8gc3dpdGNoIGJldHdlZW4gdHdvIFZMQwotICoJCQkJCQkJCWZvciBjb2Rpbmcgb2YgSW50cmEgREMgY29lZmZpY2llbnRzIGFzIHBlciBUYWJsZQotICoJCQkJCQkJCTYtMjEgb2YgSVNPL0lFQyAxNDQ5Ni0yLiAKLSAqIFtpbl0JQUNQcmVkRmxhZwkJYSBmbGFnIGVxdWFsIHRvIGFjX3ByZWRfZmxhZyAob2YgbHVtaW5hbmNlKSBpbmRpY2F0aW5nCi0gKgkJCQkJCQkJaWYgdGhlIGFjIGNvZWZmaWNpZW50cyBvZiB0aGUgZmlyc3Qgcm93IG9yIGZpcnN0Ci0gKgkJCQkJCQkJY29sdW1uIGFyZSBkaWZmZXJlbnRpYWxseSBjb2RlZCBmb3IgaW50cmEgY29kZWQKLSAqCQkJCQkJCQltYWNyb2Jsb2NrLgotICogW2luXSBzaG9ydFZpZGVvSGVhZGVyICAgIGEgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyBtb2RlLAotICoJCQkJCQkJYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub25saW5lYXIgaW50cmEgREMgbW9kZS4KLSAqIFtvdXRdCXBwQml0U3RyZWFtCQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMKLSAqCQkJCQkJCQlkZWNvZGVkLCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlCi0gKgkJCQkJCQkJaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyCi0gKiBbb3V0XQlwQml0T2Zmc2V0CQkqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQotICoJCQkJCQkJCWN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKLSAqCQkJCQkJCQkqcHBCaXRTdHJlYW0KLSAqIFtvdXRdCXBEc3QJCQlwb2ludGVyIHRvIHRoZSBibG9jayBpbiB0aGUgZGVzdGluYXRpb24gcGxhbmUuCi0gKgkJCQkJCQkJcERzdCBzaG91bGQgYmUgMTYtYnl0ZSBhbGlnbmVkLgotICogW291dF0JcENvZWZCdWZSb3cJCXBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgcm93IGJ1ZmZlci4KLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IKLSAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cwotICogICAtCUF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb2VmQnVmUm93LCBwQ29lZkJ1ZkNvbCwgcFFQQnVmLCBwRHN0LgotICogICAgICBvcgotICogICAtICBBdCBsZWFzdCBvbmUgb2YgdGhlIGJlbG93IGNhc2U6ICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10sIGN1clFQIGV4Y2VlZHMgKDEsIDMxKSwKLSAqICAgICAgYmxvY2tJbmRleCBleGNlZWRzIFswLDldLCBzdGVwIGlzIG5vdCB0aGUgbXVsdGlwbGUgb2YgOCwgaW50cmFEQ1ZMQyBpcyB6ZXJvIHdoaWxlCi0gKiAgICAgIGJsb2NrSW5kZXggZ3JlYXRlciB0aGFuIDUuCi0gKiAgICAgIG9yCi0gKiAgIC0JcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkCi0gKiBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvcgotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYSgKLSAgICAgY29uc3QgT01YX1U4ICoqIHBwQml0U3RyZWFtLAotICAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgICBPTVhfVTggKnBEc3QsCi0gICAgIE9NWF9JTlQgc3RlcCwKLSAgICAgT01YX1MxNiAqcENvZWZCdWZSb3csCi0gICAgIE9NWF9TMTYgKnBDb2VmQnVmQ29sLAotICAgICBPTVhfVTggY3VyUVAsCi0gICAgIGNvbnN0IE9NWF9VOCAqcFFQQnVmLAotICAgICBPTVhfSU5UIGJsb2NrSW5kZXgsCi0gICAgIE9NWF9JTlQgaW50cmFEQ1ZMQywKLSAgICAgT01YX0lOVCBBQ1ByZWRGbGFnLAotCSBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSApCi17Ci0gICAgT01YX1MxNiB0ZW1wQnVmMVs3OV0sIHRlbXBCdWYyWzc5XTsKLSAgICBPTVhfUzE2ICpwVGVtcEJ1ZjEsICpwVGVtcEJ1ZjI7Ci0gICAgT01YX0lOVCBwcmVkRGlyLCBwcmVkQUNEaXI7Ci0gICAgT01YX0lOVCAgcHJlZFFQOwotICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50IHZpZGVvQ29tcDsKLSAgICBPTVhSZXN1bHQgZXJyb3JDb2RlOwotICAgIAotICAgIAotICAgIC8qIEFsaWduaW5nIHRoZSBsb2NhbCBidWZmZXJzICovCi0gICAgcFRlbXBCdWYxID0gYXJtQWxpZ25UbzE2Qnl0ZXModGVtcEJ1ZjEpOwotICAgIHBUZW1wQnVmMiA9IGFybUFsaWduVG8xNkJ5dGVzKHRlbXBCdWYyKTsKLSAgICAKLSAgICAvKiBTZXR0aW5nIHRoZSBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbiBhbmQgcHJlZGljdGlvbiBkaXJlY3Rpb24gKi8KLSAgICBhcm1WQ000UDJfU2V0UHJlZERpcigKLSAgICAgICAgYmxvY2tJbmRleCwKLSAgICAgICAgcENvZWZCdWZSb3csCi0gICAgICAgIHBDb2VmQnVmQ29sLAotICAgICAgICAmcHJlZERpciwKLSAgICAgICAgJnByZWRRUCwKLSAgICAgICAgcFFQQnVmKTsKLQotICAgIHByZWRBQ0RpciA9IHByZWREaXI7Ci0KLSAgICAKLSAgICBpZiAoQUNQcmVkRmxhZyA9PSAwKQotICAgIHsKLSAgICAgICAgcHJlZEFDRGlyID0gT01YX1ZDX05PTkU7Ci0gICAgfQotCi0gICAgLyogU2V0dGluZyB0aGUgdmlkZW9Db21wICovCi0gICAgaWYgKGJsb2NrSW5kZXggPD0gMykKLSAgICB7Ci0gICAgICAgIHZpZGVvQ29tcCA9IE9NWF9WQ19MVU1JTkFOQ0U7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHZpZGVvQ29tcCA9IE9NWF9WQ19DSFJPTUlOQU5DRTsKLSAgICB9Ci0gICAgCi0KLSAgICAvKiBWTEQgYW5kIHppZ3phZyAqLwotICAgIGlmIChpbnRyYURDVkxDID09IDEpCi0gICAgewotICAgICAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMoCi0gICAgICAgICAgICBwcEJpdFN0cmVhbSwKLSAgICAgICAgICAgIHBCaXRPZmZzZXQsCi0gICAgICAgICAgICBwVGVtcEJ1ZjEsCi0gICAgICAgICAgICBwcmVkQUNEaXIsCi0gICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyLAotICAgICAgICAgICAgdmlkZW9Db21wKTsKLSAgICAgICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQygKLSAgICAgICAgICAgIHBwQml0U3RyZWFtLAotICAgICAgICAgICAgcEJpdE9mZnNldCwKLSAgICAgICAgICAgIHBUZW1wQnVmMSwKLSAgICAgICAgICAgIHByZWRBQ0RpciwKLSAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXIpOwotICAgICAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKLSAgICB9Ci0KLSAgICAvKiBBQyBEQyBwcmVkaWN0aW9uICovCi0gICAgZXJyb3JDb2RlID0gb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYSgKLSAgICAgICAgcFRlbXBCdWYxLAotICAgICAgICBwQ29lZkJ1ZlJvdywKLSAgICAgICAgcENvZWZCdWZDb2wsCi0gICAgICAgIGN1clFQLAotICAgICAgICBwcmVkUVAsCi0gICAgICAgIHByZWREaXIsCi0gICAgICAgIEFDUHJlZEZsYWcsCi0gICAgICAgIHZpZGVvQ29tcCk7Ci0gICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7Ci0gICAgCi0gICAgLyogRGVxdWFudGl6YXRpb24gKi8KLSAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JKAotICAgICBwVGVtcEJ1ZjEsCi0gICAgIGN1clFQLAotICAgICB2aWRlb0NvbXAsCi0gICAgIHNob3J0VmlkZW9IZWFkZXIpOwotICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOwotICAgIAotICAgIC8qIEludmVyc2UgdHJhbnNmb3JtICovCi0gICAgZXJyb3JDb2RlID0gb214VkNNNFAyX0lEQ1Q4eDhibGsgKHBUZW1wQnVmMSwgcFRlbXBCdWYyKTsKLSAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKLSAgICAKLSAgICAvKiBQbGFjaW5nIHRoZSBsaW5lYXIgYXJyYXkgaW50byB0aGUgZGVzdGluYXRpb24gcGxhbmUgYW5kIGNsaXBwaW5nCi0gICAgICAgaXQgdG8gMCB0byAyNTUgKi8KLSAgICAKLQlhcm1WQ000UDJfQ2xpcDgocFRlbXBCdWYyLHBEc3Qsc3RlcCk7Ci0JCi0JCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qIEVuZCBvZiBmaWxlICovCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUF9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1YTAxZDcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QX3MucworKysgL2Rldi9udWxsCkBAIC0xLDM3OCArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOyAqKioqKioqKioqCi07ICogCi07ICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1Bfcy5zCi07ICogT3Blbk1BWCBETDogdjEuMC4yCi07ICogUmV2aXNpb246ICAgOTY0MQotOyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci07ICogCi07ICogCi07ICogCi07ICogCi07ICoqCi07ICogRnVuY3Rpb246IG9teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QCi07ICoKLTsgKiBEZXNjcmlwdGlvbjoKLTsgKiBEZWNvZGVzIGFuZCBwYWRzIGZvdXIgbW90aW9uIHZlY3RvcnMgb2YgdGhlIG5vbi1pbnRyYSBtYWNyb2Jsb2NrIGluIFAtVk9QLgotOyAqIFRoZSBtb3Rpb24gdmVjdG9yIHBhZGRpbmcgcHJvY2VzcyBpcyBzcGVjaWZpZWQgaW4gc3ViY2xhdXNlIDcuNi4xLjYgb2YKLTsgKiBJU08vSUVDIDE0NDk2LTIuCi07ICoKLTsgKiBSZW1hcmtzOgotOyAqCi07ICoKLTsgKiBQYXJhbWV0ZXJzOgotOyAqIFtpbl0gICAgcHBCaXRTdHJlYW0gICAgICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgotOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlcgotOyAqIFtpbl0gICAgcEJpdE9mZnNldCAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCi07ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYnkgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4KLTsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMC03XS4KLTsgKiBbaW5dICAgIHBTcmNNVkxlZnRNQiAgICAgICBwb2ludGVycyB0byB0aGUgbW90aW9uIHZlY3RvciBidWZmZXJzIG9mIHRoZQotOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9ja3Mgc3BlY2lhbGx5IGF0IHRoZSBsZWZ0IHNpZGUgb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jawotOyAqICAgICAgICAgICAgICAgICAgICAgcmVzcGVjdGl2ZWx5LgotOyAqIFtpbl0gICAgcFNyY01WVXBwZXJNQiAgICAgIHBvaW50ZXJzIHRvIHRoZSBtb3Rpb24gdmVjdG9yIGJ1ZmZlcnMgb2YgdGhlCi07ICogICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrcyBzcGVjaWFsbHkgYXQgdGhlIHVwcGVyIHNpZGUgb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jawotOyAqICAgICAgICAgICAgICAgICAgICAgcmVzcGVjdGl2ZWx5LgotOyAqIFtpbl0gICAgcFNyY01WVXBwZXJSaWdodE1CIHBvaW50ZXJzIHRvIHRoZSBtb3Rpb24gdmVjdG9yIGJ1ZmZlcnMgb2YgdGhlCi07ICogICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrcyBzcGVjaWFsbHkgYXQgdGhlIHVwcGVyLXJpZ2h0IHNpZGUgb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jawotOyAqICAgICAgICAgICAgICAgICAgICAgcmVzcGVjdGl2ZWx5LgotOyAqIFtpbl0gICAgZmNvZGVGb3J3YXJkICAgICAgIGEgY29kZSBlcXVhbCB0byB2b3BfZmNvZGVfZm9yd2FyZCBpbiBNUEVHLTQKLTsgKiAgICAgICAgICAgICAgICAgICAgIGJpdCBzdHJlYW0gc3ludGF4Ci07ICogW2luXSAgICBNQlR5cGUgICAgICAgICB0aGUgdHlwZSBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrLiBJZiBNQlR5cGUKLTsgKiAgICAgICAgICAgICAgICAgICAgIGlzIG5vdCBlcXVhbCB0byBPTVhfVkNfSU5URVI0ViwgdGhlIGRlc3RpbmF0aW9uCi07ICogICAgICAgICAgICAgICAgICAgICBtb3Rpb24gdmVjdG9yIGJ1ZmZlciBpcyBzdGlsbCBmaWxsZWQgd2l0aCB0aGUKLTsgKiAgICAgICAgICAgICAgICAgICAgIHNhbWUgZGVjb2RlZCB2ZWN0b3IuCi07ICogW291dF0gICBwcEJpdFN0cmVhbSAgICAgICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkLAotOyAqICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0Ci07ICogICAgICAgICAgICAgICAgICAgICBzdHJlYW0gYnVmZmVyCi07ICogW291dF0gICBwQml0T2Zmc2V0ICAgICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKLTsgKiAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKLTsgKiAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbQotOyAqIFtvdXRdICAgcERzdE1WQ3VyTUIgICAgICAgICBwb2ludGVyIHRvIHRoZSBtb3Rpb24gdmVjdG9yIGJ1ZmZlciBvZiB0aGUgY3VycmVudAotOyAqICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9jayB3aGljaCBjb250YWlucyBmb3VyIGRlY29kZWQgbW90aW9uIHZlY3RvcnMKLTsgKgotOyAqIFJldHVybiBWYWx1ZToKLTsgKiBPTVhfU3RzX05vRXJyIC1ubyBlcnJvcgotOyAqIAotOyAqICAgICAgICAgICAgICAgICAgICAgCi07ICogT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IKLTsgKgotOyAqCi0gICAgIAotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9CaXREZWNfcy5oCi0gICAgICAgIElOQ0xVREUgb214VkNfcy5oCi0gICAgICAgIAotICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0gICAgICAgCi0gICAgICAgICAgICAgICAgCi0KLQotICAgICAgICBJRiBBUk0xMTM2SlMKLQotOy8vSW5wdXQgQXJndW1lbnRzCi0KLXBwQml0U3RyZWFtICAgICAgICAgICBSTiAwCi1wQml0T2Zmc2V0ICAgICAgICAgICAgUk4gMQotcFNyY01WTGVmdE1CICAgICAgICAgIFJOIDIKLXBTcmNNVlVwcGVyTUIgICAgICAgICBSTiAzCi1wU3JjTVZVcHBlclJpZ2h0TUIgICAgUk4gNAotcERzdE1WQ3VyTUIgICAgICAgICAgIFJOIDUKLWZjb2RlRm9yd2FyZCAgICAgICAgICBSTiA2Ci1NQlR5cGUgICAgICAgICAgICAgICAgUk4gNwotCi07Ly9Mb2NhbCBWYXJpYWJsZXMKLQotemVybyAgICAgICAgICAgICAgICAgIFJOIDQKLW9uZSAgICAgICAgICAgICAgICAgICBSTiA0Ci1zY2FsZUZhY3RvciAgICAgICAgICAgUk4gMQotCi0KLVJldHVybiAgICAgICAgICAgICAgICBSTiAwCi0KLVZsY01WRCAgICAgICAgICAgICAgICBSTiAwCi1pbmRleCAgICAgICAgICAgICAgICAgUk4gNAotQ291bnQgICAgICAgICAgICAgICAgIFJOIDcKLQotbXZIb3JEYXRhICAgICAgICAgICAgIFJOIDQKLW12SG9yUmVzaWR1YWwgICAgICAgICBSTiAwCi0KLW12VmVyRGF0YSAgICAgICAgICAgICBSTiA0ICAgICAgICAgICAgIAotbXZWZXJSZXNpZHVhbCAgICAgICAgIFJOIDAKLQotdGVtcCAgICAgICAgICAgICAgICAgIFJOIDEKLQotdGVtcDEgICAgICAgICAgICAgICAgIFJOIDMKLUhpZ2ggICAgICAgICAgICAgICAgICBSTiA0Ci1Mb3cgICAgICAgICAgICAgICAgICAgUk4gMgotUmFuZ2UgICAgICAgICAgICAgICAgIFJOIDEKLQotQmxrQ291bnQgICAgICAgICAgICAgIFJOIDE0Ci0KLWRpZmZNVmR4ICAgICAgICAgICAgICBSTiAwCi1kaWZmTVZkeSAgICAgICAgICAgICAgUk4gMQotCi07Ly8gU2NyYXRjaCBSZWdpc3RlcnMKLQotUkJpdFN0cmVhbSAgICAgICAgICAgIFJOIDgKLVJCaXRDb3VudCAgICAgICAgICAgICBSTiA5Ci1SQml0QnVmZmVyICAgICAgICAgICAgUk4gMTAKLQotVDEgICAgICAgICAgICAgICAgICAgIFJOIDExCi1UMiAgICAgICAgICAgICAgICAgICAgUk4gMTIKLUxSICAgICAgICAgICAgICAgICAgICBSTiAxNAotCi0gICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9hVmxjTVZECi0gICAgICAgSU1QT1JUICAgICAgICAgIG9teFZDTTRQMl9GaW5kTVZwcmVkCi0KLSAgICAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5ICAgICAgICAKLSAgICAgICAKLSAgICAgICBNX0FMTE9DNCAgICAgICAgcHBEc3RNVkN1ck1CLDQKLSAgICAgICBNX0FMTE9DNCAgICAgICAgcERzdE1WUHJlZE1FLDQKLSAgICAgICBNX0FMTE9DNCAgICAgICAgcEJsa0NvdW50LDQKLSAgICAgICAKLSAgICAgICBNX0FMTE9DNCAgICAgICAgcHBwQml0U3RyZWFtLDQKLSAgICAgICBNX0FMTE9DNCAgICAgICAgcHBCaXRPZmZzZXQsNAotICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFNyY01WTGVmdE1CLDQKLSAgICAgICBNX0FMTE9DNCAgICAgICAgcHBTcmNNVlVwcGVyTUIsNAotICAgICAgIAotICAgICAgIE1fQUxMT0M0ICAgICAgICBwZGlmZk1WZHgsNAotICAgICAgIE1fQUxMT0M0ICAgICAgICBwZGlmZk1WZHksNAotICAgICAgIE1fQUxMT0M0ICAgICAgICBwSGlnaCw0Ci0gICAgICAgCi0gICAgICAgICAgICAgIAotCi0KLSAgICAgICBNX1NUQVJUICAgb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1AscjExCi0gICAgICAgCi0gICAgICAgTV9BUkcgICAgICAgICAgIHBTcmNNVlVwcGVyUmlnaHRNQm9uU3RhY2ssNCAgICAgICAgICAgOy8vIHBvaW50ZXIgdG8gIHBTcmNNVlVwcGVyUmlnaHRNQiBvbiBzdGFjawotICAgICAgIE1fQVJHICAgICAgICAgICBwRHN0TVZDdXJNQm9uU3RhY2ssNCAgICAgICAgICAgICAgICAgIDsvLyBwb2ludGVyIHRvIHBEc3RNVkN1ck1CIG9uIHN0YWNrCi0gICAgICAgTV9BUkcgICAgICAgICAgIGZjb2RlRm9yd2FyZG9uU3RhY2ssNCAgICAgICAgICAgICAgICAgOy8vIHBvaW50ZXIgdG8gZmNvZGVGb3J3YXJkIG9uIHN0YWNrIAotICAgICAgIE1fQVJHICAgICAgICAgICBNQlR5cGVvblN0YWNrLDQgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwb2ludGVyIHRvIE1CVHlwZSBvbiBzdGFjawotCi0gICAgICAKLSAgICAgICAKLSAgICAgICAKLSAgICAgICAKLSAgICAgICA7Ly8gSW5pdGlhbGl6aW5nIHRoZSBCaXRTdHJlYW0gTWFjcm8KLQotICAgICAgIE1fQkRfSU5JVDAgICAgICBwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgUkJpdFN0cmVhbSwgUkJpdEJ1ZmZlciwgUkJpdENvdW50Ci0gICAgICAgTV9MRFIgICAgICAgICAgIE1CVHlwZSxNQlR5cGVvblN0YWNrICAgICAgICAgICAgICAgICAgOy8vIExvYWQgTUJUeXBlIGZyb20gc3RhY2sKLSAgICAgICBNX0xEUiAgICAgICAgICAgcERzdE1WQ3VyTUIscERzdE1WQ3VyTUJvblN0YWNrICAgICAgICA7Ly8gTG9hZCBwRHN0TVZDdXJNQiBmcm9tIHN0YWNrCi0gICAgICAgTU9WICAgICAgICAgICAgIHplcm8sIzAKLQotICAgICAgIFRFUSAgICAgICAgICAgICBNQlR5cGUsI09NWF9WQ19JTlRSQSAgICAgICAgICAgICAgICAgIDsvLyBDaGVjayBpZiBNQlR5cGU9T01YX1ZDX0lOVFJBCi0gICAgICAgVEVRTkUgICAgICAgICAgIE1CVHlwZSwjT01YX1ZDX0lOVFJBX1EgICAgICAgICAgICAgICAgOy8vIGNoZWNrIGlmIE1CVHlwZT1PTVhfVkNfSU5UUkFfUQotICAgICAgIFNUUkVRICAgICAgICAgICB6ZXJvLFtwRHN0TVZDdXJNQl0KLSAgICAgICBNX0JEX0lOSVQxICAgICAgVDEsIFQyLCBUMgotICAgICAgIFNUUkVRICAgICAgICAgICB6ZXJvLFtwRHN0TVZDdXJNQiwjNF0KLSAgICAgICBNX0JEX0lOSVQyICAgICAgVDEsIFQyLCBUMgotICAgICAgIFNUUkVRICAgICAgICAgICB6ZXJvLFtwRHN0TVZDdXJNQiwjNF0KLSAgICAgICBNT1ZFUSAgICAgICAgICAgUmV0dXJuLCNPTVhfU3RzX05vRXJyCi0gICAgICAgTU9WICAgICAgICAgICAgIEJsa0NvdW50LCMwCi0gICAgICAgU1RSRVEgICAgICAgICAgIHplcm8sW3BEc3RNVkN1ck1CLCM0XQotICAgICAgIAotICAgICAgIEJFUSAgICAgICAgICAgICBFeGl0T0sKLQotICAgICAgIFRFUSAgICAgICAgICAgICBNQlR5cGUsI09NWF9WQ19JTlRFUjRWICAgICAgICAgICAgICAgIDsvLyBDaGVjayBpZiBNQlR5cGU9T01YX1ZDX0lOVEVSNFYKLSAgICAgICBURVFORSAgICAgICAgICAgTUJUeXBlLCNPTVhfVkNfSU5URVI0Vl9RICAgICAgICAgICAgICA7Ly8gQ2hlY2sgaWYgTUJUeXBlPU9NWF9WQ19JTlRFUjRWX1EKLSAgICAgICBNT1ZFUSAgICAgICAgICAgQ291bnQsIzQKLQotICAgICAgIFRFUSAgICAgICAgICAgICBNQlR5cGUsI09NWF9WQ19JTlRFUiAgICAgICAgICAgICAgICAgIDsvLyBDaGVjayBpZiBNQlR5cGU9T01YX1ZDX0lOVEVSCi0gICAgICAgVEVRTkUgICAgICAgICAgIE1CVHlwZSwjT01YX1ZDX0lOVEVSX1EgICAgICAgICAgICAgICAgOy8vIENoZWNrIGlmIE1CVHlwZT1PTVhfVkNfSU5URVJfUQotICAgICAgIE1PVkVRICAgICAgICAgICBDb3VudCwjMQotICAgICAgIAotICAgICAgIE1fTERSICAgICAgICAgICBmY29kZUZvcndhcmQsZmNvZGVGb3J3YXJkb25TdGFjayAgICAgIDsvLyBMb2FkIGZjb2RlRm9yd2FyZCAgZnJvbSBzdGFjawotCi0gICAgICAgOy8vIFN0b3JpbmcgdGhlIHZhbHVlcyB0ZW1wb3JhcmlseSBvbiBzdGFjawotCi0gICAgICAgTV9TVFIgICAgICAgICAgIHBwQml0U3RyZWFtLHBwcEJpdFN0cmVhbSAgICAgICAgICAgICAgCi0gICAgICAgTV9TVFIgICAgICAgICAgIHBCaXRPZmZzZXQscHBCaXRPZmZzZXQKLSAgICAgICAgICAgIAotCi0gICAgICAgU1VCICAgICAgICAgICAgIHRlbXAsZmNvZGVGb3J3YXJkLCMxICAgICAgICAgICAgICAgICAgOy8vIHRlbXA9ZmNvZGVGb3J3YXJkLTEKLSAgICAgICBNT1YgICAgICAgICAgICAgb25lLCMxCi0gICAgICAgTV9TVFIgICAgICAgICAgIHBTcmNNVkxlZnRNQixwcFNyY01WTGVmdE1CCi0gICAgICAgTFNMICAgICAgICAgICAgIHNjYWxlRmFjdG9yLG9uZSx0ZW1wICAgICAgICAgICAgICAgICAgOy8vIHNjYWxlRmFjdG9yPTE8PChmY29kZUZvcndhcmQtMSkKLSAgICAgICBNX1NUUiAgICAgICAgICAgcFNyY01WVXBwZXJNQixwcFNyY01WVXBwZXJNQgotICAgICAgIExTTCAgICAgICAgICAgICBzY2FsZUZhY3RvcixzY2FsZUZhY3RvciwjNSAgICAgICAgICAgIAotICAgICAgIE1fU1RSICAgICAgICAgICBzY2FsZUZhY3RvcixwSGlnaCAgICAgICAgICAgICAgICAgICAgIDsvLyBbcEhpZ2hdPTMyKnNjYWxlRmFjdG9yCi0gICAgICAgICAgICAgIAotICAgICAgIDsvLyBWTEQgRGVjb2RpbmcKLQotCi1Mb29wCi0KLSAgICAgICBMRFIgICAgICAgICAgICAgVmxjTVZELCA9YXJtVkNNNFAyX2FWbGNNVkQgICAgICAgIDsvLyBMb2FkIHRoZSBvcHRpbWl6ZWQgTVZEIFZMQyB0YWJsZQotCi0gICAgICAgOy8vIEhvcml6b250YWwgRGF0YSBhbmQgUmVzaWR1YWwgY2FsY3VsYXRpb24KLQotICAgICAgIExEUiAgICAgICAgICAgICB0ZW1wLD0weEZGRiAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgIE1fQkRfVkxEICAgICAgICBpbmRleCxUMSxUMixWbGNNVkQsMywyICAgICAgICAgICAgICAgIDsvLyB2YXJpYWJsZSBsZW5naHQgZGVjb2RpbmcgdXNpbmcgdGhlIG1hY3JvCi0gICAgICAKLSAgICAgICBURVEgICAgICAgICAgICAgaW5kZXgsdGVtcAotICAgICAgIEJFUSAgICAgICAgICAgICBFeGl0RXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBFeGl0IHdpdGggYW4gRXJyb3IgTWVzc2FnZSBpZiB0aGUgZGVjb2RlZCBzeW1ib2wgaXMgYW4gaW52YWxpZWQgc3ltYm9sIAotICAgICAgIAotICAgICAgIFNVQiAgICAgICAgICAgICBtdkhvckRhdGEsaW5kZXgsIzMyICAgICAgICAgICAgICAgICAgIDsvLyBtdkhvckRhdGE9aW5kZXgtMzIgICAgICAgICAgICAgCi0gICAgICAgTU9WICAgICAgICAgICAgIG12SG9yUmVzaWR1YWwsIzEgICAgICAgICAgICAgICAgICAgICAgOy8vIG12SG9yUmVzaWR1YWw9MQotICAgICAgIENNUCAgICAgICAgICAgICBmY29kZUZvcndhcmQsIzEKLSAgICAgICBURVFORSAgICAgICAgICAgbXZIb3JEYXRhLCMwCi0gICAgICAgTU9WRVEgICAgICAgICAgIGRpZmZNVmR4LG12SG9yRGF0YSAgICAgICAgICAgICAgICAgICAgOy8vIGlmIHNjYWxlRmFjdG9yPTEoZmNvZGVGb3J3YXJkPTEpIG9yIG12SG9yRGF0YT0wIGRpZmZNVmR4PW12SG9yRGF0YSAgICAgICAgIAotICAgICAgIEJFUSAgICAgICAgICAgICBWZXJ0aWNhbERhdGEKLSAgICAgICAKLSAgICAgICBTVUIgICAgICAgICAgICAgdGVtcCxmY29kZUZvcndhcmQsIzEKLSAgICAgICBNX0JEX1ZSRUFEOCAgICAgbXZIb3JSZXNpZHVhbCx0ZW1wLFQxLFQyICAgICAgICAgICAgICA7Ly8gZ2V0IG12SG9yUmVzaWR1YWwgZnJvbSBiaXRzdHJlYW0gaWYgZmNvZGVGb3J3YXJkPjEgYW5kIG12SG9yRGF0YSE9MCAgICAgICAgICAgICAgCi0gICAgICAgCi0gICAgICAgQ01QICAgICAgICAgICAgIG12SG9yRGF0YSwjMAotICAgICAgIFJTQkxUICAgICAgICAgICBtdkhvckRhdGEsbXZIb3JEYXRhLCMwICAgICAgICAgICAgICAgIDsvLyBtdkhvckRhdGE9YWJzKG12SG9yRGF0YSkKLSAgICAgICBTVUIgICAgICAgICAgICAgbXZIb3JSZXNpZHVhbCxtdkhvclJlc2lkdWFsLGZjb2RlRm9yd2FyZAotICAgICAgIFNNTEFCQiAgICAgICAgICBkaWZmTVZkeCxtdkhvckRhdGEsZmNvZGVGb3J3YXJkLG12SG9yUmVzaWR1YWwgOy8vIGRpZmZNVmR4PWFicyhtdkhvckRhdGEpKmZjb2RlRm9yd2FyZCttdkhvclJlc2lkdWFsLWZjb2RlRm9yd2FyZAotICAgICAgIEFERCAgICAgICAgICAgICBkaWZmTVZkeCxkaWZmTVZkeCwjMQotICAgICAgIFJTQkxUICAgICAgICAgICBkaWZmTVZkeCxkaWZmTVZkeCwjMAotICAgICAgIAotICAgICAgIDsvLyBWZXJ0aWNhbCBEYXRhIGFuZCBSZXNpZHVhbCBjYWxjdWxhdGlvbgotCi1WZXJ0aWNhbERhdGEKLQotICAgICAgIE1fU1RSICAgICAgICAgICBkaWZmTVZkeCxwZGlmZk1WZHggICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSB0aGUgZGlmZk1WZHggb24gc3RhY2sKLSAgICAgICBMRFIgICAgICAgICAgICAgVmxjTVZELCA9YXJtVkNNNFAyX2FWbGNNVkQgICAgICAgIDsvLyBMb2FkaW5nIHRoZSBhZGRyZXNzIG9mIG9wdGltaXplZCBWTEMgdGFibGVzCi0KLSAgICAgICBMRFIgICAgICAgICAgICAgdGVtcCw9MHhGRkYKLSAgICAgICBNX0JEX1ZMRCAgICAgICAgaW5kZXgsVDEsVDIsVmxjTVZELDMsMiAgICAgICAgICAgICAgICA7Ly8gVkxDIGRlY29kaW5nIHVzaW5nIHRoZSBtYWNybwotICAgICAgIAotICAgICAgIFRFUSAgICAgICAgICAgICBpbmRleCx0ZW1wCi0gICAgICAgQkVRICAgICAgICAgICAgIEV4aXRFcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEV4aXQgd2l0aCBhbiBFcnJvciBNZXNzYWdlIGlmIGFuIEludmFsaWVkIFN5bWJvbCBvY2N1cnMKLSAgICAgICAKLSAgICAgICBTVUIgICAgICAgICAgICAgbXZWZXJEYXRhLGluZGV4LCMzMiAgICAgICAgICAgICAgICAgICA7Ly8gbXZWZXJEYXRhPWluZGV4LTMyICAgICAgICAgICAgIAotICAgICAgIE1PViAgICAgICAgICAgICBtdlZlclJlc2lkdWFsLCMxICAgICAKLSAgICAgICBDTVAgICAgICAgICAgICAgZmNvZGVGb3J3YXJkLCMxCi0gICAgICAgVEVRTkUgICAgICAgICAgIG12VmVyRGF0YSwjMAotICAgICAgIE1PVkVRICAgICAgICAgICBkaWZmTVZkeSxtdlZlckRhdGEgICAgICAgICAgICAgICAgICAgIDsvLyBkaWZmTVZkeSA9IG12VmVyRGF0YSBpZiBzY2FsZUZhY3Rvcj0xKGZjb2RlRm9yd2FyZD0xKSBvciBtdlZlckRhdGE9MAotICAgICAgIEJFUSAgICAgICAgICAgICBGaW5kTVZQcmVkCi0KLSAgICAgICBTVUIgICAgICAgICAgICAgdGVtcCxmY29kZUZvcndhcmQsIzEKLSAgICAgICBNX0JEX1ZSRUFEOCAgICAgbXZWZXJSZXNpZHVhbCx0ZW1wLFQxLFQyICAgICAgICAgICAgICA7Ly8gR2V0IG12VmVyUmVzaWR1YWwgZnJvbSBiaXQgc3RyZWFtIGlmIGZjb2RlRm9yd2FyZD4xIGFuZCBtblZlckRhdGEhPTAKLSAgICAgICAgICAgICAKLQotICAgICAgIENNUCAgICAgICAgICAgICBtdlZlckRhdGEsIzAKLSAgICAgICBSU0JMVCAgICAgICAgICAgbXZWZXJEYXRhLG12VmVyRGF0YSwjMAotICAgICAgIFNVQiAgICAgICAgICAgICBtdlZlclJlc2lkdWFsLG12VmVyUmVzaWR1YWwsZmNvZGVGb3J3YXJkCi0gICAgICAgU01MQUJCICAgICAgICAgIGRpZmZNVmR5LG12VmVyRGF0YSxmY29kZUZvcndhcmQsbXZWZXJSZXNpZHVhbCA7Ly8gZGlmZk1WZHk9YWJzKG12VmVyRGF0YSkqZmNvZGVGb3J3YXJkK212VmVyUmVzaWR1YWwtZmNvZGVGb3J3YXJkCi0gICAgICAgQUREICAgICAgICAgICAgIGRpZmZNVmR5LGRpZmZNVmR5LCMxCi0gICAgICAgUlNCTFQgICAgICAgICAgIGRpZmZNVmR5LGRpZmZNVmR5LCMwCi0KLSAgICAgICA7Ly9DYWxsaW5nIHRoZSBGdW5jdGlvbiBvbXhWQ000UDJfRmluZE1WcHJlZAotICAgICAgICAKLUZpbmRNVlByZWQKLQotICAgICAgIE1fU1RSICAgICAgICAgICBkaWZmTVZkeSxwZGlmZk1WZHkKLSAgICAgICBBREQgICAgICAgICAgICAgdGVtcCxwRHN0TVZDdXJNQixCbGtDb3VudCxMU0wgIzIgICAgICA7Ly8gdGVtcD1wRHN0TVZDdXJNQltCbGtDb3VudF0KLSAgICAgICBNX1NUUiAgICAgICAgICAgdGVtcCxwcERzdE1WQ3VyTUIgICAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUgdGVtcCBvbiBzdGFjayBmb3IgcGFzc2luZyBhcyBhbiBhcmd1bWVudCB0byBGaW5kTVZQcmVkCi0gICAgICAgCi0gICAgICAgTU9WICAgICAgICAgICAgIHRlbXAsIzAKLSAgICAgICBNX1NUUiAgICAgICAgICAgdGVtcCxwRHN0TVZQcmVkTUUgICAgICAgICAgICAgICAgICAgICA7Ly8gUGFzcyBwRHN0TVZQcmVkTUU9TlVMTCBhcyBhbiBhcmd1bWVudCAgICAgICAgIAotICAgICAgIE1fU1RSICAgICAgICAgICBCbGtDb3VudCxwQmxrQ291bnQgICAgICAgICAgICAgICAgICAgIDsvLyBQYXNzcyBCbGtDb3VudCBhcyBBcmd1bWVudCB0aHJvdWdoIHN0YWNrCi0KLSAgICAgICBNT1YgICAgICAgICAgICAgdGVtcCxwU3JjTVZMZWZ0TUIgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcCAoUk4gMSk9cFNyY01WTGVmdE1CCi0gICAgICAgTV9MRFIgICAgICAgICAgIHBTcmNNVlVwcGVyUmlnaHRNQixwU3JjTVZVcHBlclJpZ2h0TUJvblN0YWNrCi0gICAgICAgTU9WICAgICAgICAgICAgIHBTcmNNVkxlZnRNQixwU3JjTVZVcHBlck1CICAgICAgICAgICAgOy8vIHBTcmNNVkxlZnRNQiAoIFJOIDIpID0gcFNyY01WVXBwZXJNQgotICAgICAgIE1PViAgICAgICAgICAgICBwcEJpdFN0cmVhbSxwRHN0TVZDdXJNQiAgICAgICAgICAgICAgIDsvLyBwcEJpdFN0cmVhbSAgKCBSTiAwKSA9IHBEc3RNVkN1ck1CCi0gICAgICAgTU9WICAgICAgICAgICAgIHBTcmNNVlVwcGVyTUIscFNyY01WVXBwZXJSaWdodE1CICAgICAgOy8vIHBTcmNNVlVwcGVyTUIoIFJOIDMpID0gcFNyY01WVXBwZXJSaWdodE1CICAgICAgCi0gICAgICAgQkwgICAgICAgICAgICAgIG9teFZDTTRQMl9GaW5kTVZwcmVkICAgICAgICAgICAgICA7Ly8gQnJhbmNoIHRvIHN1YnJvdXRpbmUgb214VkNNNFAyX0ZpbmRNVnByZWQKLQotICAgICAgIDsvLyBTdG9yZSBIb3Jpem9udGFsIE1vdGlvbiBWZWN0b3IKLSAgICAgCi0gICAgICAgTV9MRFIgICAgICAgICAgIEJsa0NvdW50LHBCbGtDb3VudCAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgQmxrQ291bnQgZnJvbSBzdGFjawotICAgICAgIE1fTERSICAgICAgICAgICBIaWdoLHBIaWdoICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBIaWdoPTMyKnNjYWxlRmFjdG9yCi0gICAgICAgTFNMICAgICAgICAgICAgIHRlbXAxLEJsa0NvdW50LCMyICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXA9QmxrQ291bnQqNAotICAgICAgIE1fTERSICAgICAgICAgICBkaWZmTVZkeCxwZGlmZk1WZHggICAgICAgICAgICAgICAgICAgIDsvLyBMYWFkIGRpZmZNVmR4Ci0gICAgICAgCi0gICAgICAgTERSU0ggICAgICAgICAgIHRlbXAsW3BEc3RNVkN1ck1CLHRlbXAxXSAgICAgICAgICAgICAgOy8vIHRlbXA9cERzdE1WQ3VyTUJbQmxrQ291bnRdCi0gICAgICAgCi0gICAgICAgCi0gICAgICAgUlNCICAgICAgICAgICAgIExvdyxIaWdoLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvdyA9IC0zMipzY2FsZUZhY3RvcgotICAgICAgIEFERCAgICAgICAgICAgICBkaWZmTVZkeCx0ZW1wLGRpZmZNVmR4ICAgICAgICAgICAgICAgIDsvLyBkaWZmTVZkeD1wRHN0TVZDdXJNQltCbGtDb3VudF0rZGlmZk1WZHgKLSAgICAgICBBREQgICAgICAgICAgICAgUmFuZ2UsSGlnaCxIaWdoICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUmFuZ2U9NjQqU2NhbGVGYWN0b3IKLSAgICAgICBTVUIgICAgICAgICAgICAgSGlnaCxIaWdoLCMxICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSGlnaD0gMzIqc2NhbGVGYWN0b3ItMQotCi0gICAgICAgQ01QICAgICAgICAgICAgIGRpZmZNVmR4LExvdyAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIGRpZmZNVmR4PExvdyAgICAgICAgICAKLSAgICAgICBBRERMVCAgICAgICAgICAgZGlmZk1WZHgsZGlmZk1WZHgsUmFuZ2UgICAgICAgICAgICAgICA7Ly8gZGlmZk1WZHgrPVJhbmdlCi0gICAgICAgIAotICAgICAgIENNUCAgICAgICAgICAgICBkaWZmTVZkeCxIaWdoICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgIFNVQkdUICAgICAgICAgICBkaWZmTVZkeCxkaWZmTVZkeCxSYW5nZSAgICAgICAgICAgICAgIDsvLyBJZiBkaWZmTVZkeCA+IEhpZ2ggZGlmZk1WZHgtPVJhbmdlCi0gICAgICAgU1RSSCAgICAgICAgICAgIGRpZmZNVmR4LFtwRHN0TVZDdXJNQix0ZW1wMV0KLQotICAgICAgIDsvLyBTdG9yZSBWZXJ0aWNhbAotCi0gICAgICAgQUREICAgICAgICAgICAgIHRlbXAxLHRlbXAxLCMyICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXAxPTQqQmxrQ291bnQrMgotICAgICAgIE1fTERSICAgICAgICAgICBkaWZmTVZkeCxwZGlmZk1WZHkgICAgICAgICAgICAgICAgICAgIDsvLyBMYWFkIGRpZmZNVmR5Ci0gICAgICAgTERSU0ggICAgICAgICAgIHRlbXAsW3BEc3RNVkN1ck1CLHRlbXAxXSAgICAgICAgICAgICAgOy8vIHRlbXA9cERzdE1WQ3VyTUJbQmxrQ291bnRdLmRpZmZNVmR5Ci0gICAgICAgQUREICAgICAgICAgICAgIEJsa0NvdW50LEJsa0NvdW50LCMxICAgICAgICAgICAgICAgICAgOy8vIEJsa0NvdW50PUJsa0NvdW50KzEKLSAgICAgICBBREQgICAgICAgICAgICAgZGlmZk1WZHgsdGVtcCxkaWZmTVZkeCAgICAgICAgICAgICAgICAKLSAgICAgICBDTVAgICAgICAgICAgICAgZGlmZk1WZHgsTG93Ci0gICAgICAgQURETFQgICAgICAgICAgIGRpZmZNVmR4LGRpZmZNVmR4LFJhbmdlICAgICAgICAgICAgICAgOy8vIElmIGRpZmZNVmR5PExvdyAgZGlmZk1WZHkrPVJhbmdlICAgICAgICAgICAgICAgIAotICAgICAgIENNUCAgICAgICAgICAgICBkaWZmTVZkeCxIaWdoCi0gICAgICAgU1VCR1QgICAgICAgICAgIGRpZmZNVmR4LGRpZmZNVmR4LFJhbmdlICAgICAgICAgICAgICAgOy8vIElmIGRpZmZNVmR5ID4gSGlnaCBkaWZmTVZkeS09UmFuZ2UKLSAgICAgICBTVFJIICAgICAgICAgICAgZGlmZk1WZHgsW3BEc3RNVkN1ck1CLHRlbXAxXSAgICAKLSAgICAgICAKLSAgICAgICBDTVAgICAgICAgICAgICAgQmxrQ291bnQsQ291bnQKLSAgICAgICBNX0xEUiAgICAgICAgICAgcFNyY01WTGVmdE1CLHBwU3JjTVZMZWZ0TUIKLSAgICAgICBNX0xEUiAgICAgICAgICAgcFNyY01WVXBwZXJNQixwcFNyY01WVXBwZXJNQgotCi0gICAgICAgQkxUICAgICAgICAgICAgIExvb3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIEJsa0NvdW50PENvdW50IENvbnRpbnVlIHRoZSBMb29wCi0KLQotICAgICAgIDsvLyBJZiBNQlR5cGU9T01YX1ZDX0lOVEVSIG9yIE1CdHlwZT1PTVhfVkNfSU5URVJfUSBjb3B5IHBEc3RNVkN1ck1CWzBdIHRvCi0gICAgICAgOy8vIHBEc3RNVkN1ck1CWzFdLCBwRHN0TVZDdXJNQlsyXSwgcERzdE1WQ3VyTUJbM10gCi0KLSAgICAgICBNX0xEUiAgICAgICAgICAgTUJUeXBlLE1CVHlwZW9uU3RhY2sKLQotICAgICAgIFRFUSAgICAgICAgICAgICBNQlR5cGUsI09NWF9WQ19JTlRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgIFRFUU5FICAgICAgICAgICBNQlR5cGUsI09NWF9WQ19JTlRFUl9RICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgIExEUkVRICAgICAgICAgICB0ZW1wLFtwRHN0TVZDdXJNQl0KLSAgICAgICBNX0xEUiAgICAgICAgICAgcHBCaXRTdHJlYW0scHBwQml0U3RyZWFtCi0gICAgICAgU1RSRVEgICAgICAgICAgIHRlbXAsW3BEc3RNVkN1ck1CLCM0XQotICAgICAgIAotICAgICAgIFNUUkVRICAgICAgICAgICB0ZW1wLFtwRHN0TVZDdXJNQiwjOF0KLSAgICAgICBTVFJFUSAgICAgICAgICAgdGVtcCxbcERzdE1WQ3VyTUIsIzEyXQotICAgICAgIAotICAgICAgIAotICAgICAgIE1fTERSICAgICAgICAgICBwQml0T2Zmc2V0LHBwQml0T2Zmc2V0Ci0gICAgICAgOy8vRW5kaW5nIHRoZSBtYWNybwotICAgICAgIE1fQkRfRklOSSAgICAgICBwcEJpdFN0cmVhbSxwQml0T2Zmc2V0ICAgICAgICAgICAgICAgICA7Ly8gRmluaXNoaW5nIHRoZSBNYWNybyAgICAgICAKLQotICAgICAgIAotICAgICAgIE1PViAgICAgICAgICAgICBSZXR1cm4sI09NWF9TdHNfTm9FcnIKLSAgICAgICBCICAgICAgICAgICAgICAgRXhpdE9LCi0gCi1FeGl0RXJyb3IKLQotICAgICAgIE1fTERSICAgICAgICAgICBwcEJpdFN0cmVhbSxwcHBCaXRTdHJlYW0KLSAgICAgICBNX0xEUiAgICAgICAgICAgcEJpdE9mZnNldCxwcEJpdE9mZnNldAotICAgICAgIDsvL0VuZGluZyB0aGUgbWFjcm8KLSAgICAgICBNX0JEX0ZJTkkgICAgICAgcHBCaXRTdHJlYW0scEJpdE9mZnNldAotICAgICAgIAotICAgICAgIE1PViAgICAgICAgICAgICBSZXR1cm4sI09NWF9TdHNfRXJyCi0KLUV4aXRPSyAgICAgICAgICAgICAKLQotICAgICAgIE1fRU5ECi0gICAgICAgRU5ESUYKLSAgICAgICBFTkQKLQotCi0gICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVlMzNkOC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcl9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvKioKLTsgKiAKLTsgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyX3MucwotOyAqIE9wZW5NQVggREw6IHYxLjAuMgotOyAqIFJldmlzaW9uOiAgIDk2NDEKLTsgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotOyAqIAotOyAqIAotOyAqIAotOyAqCi07ICogRGVzY3JpcHRpb246IAotOyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGRlY29kaW5nCi07ICogZm9yIGludGVyIGJsb2NrLgotOyAqCi07ICoKLTsgKgotOyAqIEZ1bmN0aW9uOiBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyCi07ICoKLTsgKiBEZXNjcmlwdGlvbjoKLTsgKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gZm9yIG9uZSBpbnRlciBjb2RlZCBibG9jay4KLTsgKgotOyAqIFJlbWFya3M6Ci07ICoKLTsgKiBQYXJhbWV0ZXJzOgotOyAqIFtpbl0gICAgcHBCaXRTdHJlYW0gICAgICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgotOyAqICAgICAgICAgICAgICAgICAgICB0aGUgYml0c3RyZWFtIGJ1ZmZlcgotOyAqIFtpbl0gICAgcEJpdE9mZnNldCAgICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKLTsgKiAgICAgICAgICAgICAgICAgICAgdG8gYnkgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4gICAgWzAtN10uCi07ICogW2luXSBzaG9ydFZpZGVvSGVhZGVyICAgICBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsKLTsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgc2hvcnRWaWRlb0hlYWRlcj09MCwKLTsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLgotOyAqIFtvdXRdICAgIHBwQml0U3RyZWFtICAgICAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMKLTsgKiAgICAgICAgICAgICAgICAgICAgZGVjb2RlZCwgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZQotOyAqICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIKLTsgKiBbb3V0XSAgICBwQml0T2Zmc2V0ICAgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQotOyAqICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Ci07ICogICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbQotOyAqIFtvdXRdICAgIHBEc3QgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudAotOyAqICAgICAgICAgICAgICAgICAgICBibG9jay4gTXVzdCBiZSAxNi1ieXRlIGFsaWduZWQKLTsgKgotOyAqIFJldHVybiBWYWx1ZToKLTsgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMKLTsgKiAgIC1BdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0LCBvcgotOyAqICAgLXBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCwgb3IKLTsgKiAgIC0qcEJpdE9mZnNldCBleGNlZWRzIFswLDddLgotOyAqIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yCi07ICogICAtQXQgbGVhc3Qgb25lIG1hcmsgYml0IGlzIGVxdWFsIHRvIHplcm8KLTsgKiAgIC1FbmNvdW50ZXJlZCBhbiBpbGxlZ2FsIHN0cmVhbSBjb2RlIHRoYXQgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBWTEMgdGFibGUKLTsgKiAgIC1FbmNvdW50ZXJlZCBhbmQgaWxsZWdhbCBjb2RlIGluIHRoZSBWTEMgRkxDIHRhYmxlCi07ICogICAtVGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgaXMgZ3JlYXRlciB0aGFuIDY0Ci07ICoKLTsgKi8KLQotCi0gICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgSU5DTFVERSBhcm1DT01NX0JpdERlY19zLmgKLQotCi0gICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotCi0gICAgIAotCi0KLQotICAgICBJRiBBUk0xMTM2SlMKLSAgICAgCi0gICAgICAgIDsvLyBJbXBvcnQgdmFyaW91cyB0YWJsZXMgbmVlZGVkIGZvciB0aGUgZnVuY3Rpb24KLQotICAgICAgICAKLSAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9JbnRlclZsY0wwTDEgICAgICAgICAgICAgOy8vIENvbnRhaW5zIG9wdGltaXplZCBhbmQgcGFja2VkIFZMQyBUYWJsZXMgZm9yIGJvdGggTGFzdCA9MSBhbmQgbGFzdD0wCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUGFja2VkIGluIFJ1bjpMZXZlbDpMYXN0IGZvcm1hdAotICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludGVyTDBMMUxNQVggICAgICAgICAgICA7Ly8gQ29udGFpbnMgTE1BWCB0YWJsZSBlbnRyaWVzIHdpdGggYm90aCBMYXN0PTAgYW5kIExhc3Q9MQotICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludGVyTDBMMVJNQVggICAgICAgICAgICA7Ly8gQ29udGFpbnMgUk1BWCB0YWJsZSBlbnRyaWVzIHdpdGggYm90aCBMYXN0PTAgYW5kIExhc3Q9MQotICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuICAgICA7Ly8gY29udGFpbnMgY2xhc3NpY2FsIFppZ3phZyB0YWJsZSBlbnRyaWVzIHdpdGggZG91YmxlIHRoZSBvcmlnaW5hbCB2YWx1ZXMKLSAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlCi0KLQotCi07Ly9JbnB1dCBBcmd1bWVudHMKLQotcHBCaXRTdHJlYW0gICAgICAgICAgUk4gMAotcEJpdE9mZnNldCAgICAgICAgICAgUk4gMQotcERzdCAgICAgICAgICAgICAgICAgUk4gMgotc2hvcnRWaWRlb0hlYWRlciAgICAgUk4gMwotCi07Ly9Mb2NhbCBWYXJpYWJsZXMKLQotUmV0dXJuICAgICAgICAgICAgICAgUk4gMAotCi1wVmxjVGFibGVMMEwxICAgICAgICBSTiA0Ci1wTE1BWFRhYmxlTDBMMSAgICAgICBSTiA0Ci1wUk1BWFRhYmxlTDBMMSAgICAgICBSTiA0Ci1wWmlnemFnVGFibGUgICAgICAgICBSTiA0Ci1Db3VudCAgICAgICAgICAgICAgICBSTiA2Ci0KLQotICAgICAgICAKLSAgICAgICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSB0byBzdG9yZSB0aGUgVkxDLFppZ3phZyxMTUFYIGFuZCBSTUFYIHRhYmxlcwotICAgICAKLSAgICAgICAgCi0gICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFZsY1RhYmxlTDBMMSw0Ci0gICAgICAgIE1fQUxMT0M0ICAgICAgICBwcExNQVhUYWJsZUwwTDEsNAotICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBSTUFYVGFibGVMMEwxLDQKLSAgICAgICAgTV9BTExPQzQgICAgICAgIHBwWmlnemFnVGFibGUsNAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIE1fU1RBUlQgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcixyMTIKLQotICAgICAgICAKLQotICAgICAgICAKLSAgICAgICAgTERSICAgICAgICAgICAgIHBaaWd6YWdUYWJsZSwgPWFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbiAgICAgICA7Ly8gTG9hZCB6aWd6YWcgdGFibGUKLSAgICAgICAgTV9TVFIgICAgICAgICAgIHBaaWd6YWdUYWJsZSxwcFppZ3phZ1RhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHppZ3phZyB0YWJsZSBvbiBzdGFjayB0byBwYXNzIGFzIGFyZ3VtZW50IHRvIHVuc2FmZSBmdW5jdGlvbgotICAgICAgICBMRFIgICAgICAgICAgICAgcFZsY1RhYmxlTDBMMSwgPWFybVZDTTRQMl9JbnRlclZsY0wwTDEgICAgICAgICAgICAgIDsvLyBMb2FkIG9wdGltaXplZCBWTEMgdGFibGUgd2l0aCBib3RoIEw9MCBhbmQgTD0xIGVudHJpZXMKLSAgICAgICAgTV9TVFIgICAgICAgICAgIHBWbGNUYWJsZUwwTDEscHBWbGNUYWJsZUwwTDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIG9wdGltaXplZCBWTEMgdGFibGUgYWRkcmVzcyBvbiBzdGFjawotICAgICAgICBMRFIgICAgICAgICAgICAgcExNQVhUYWJsZUwwTDEsID1hcm1WQ000UDJfSW50ZXJMMEwxTE1BWCAgICAgICAgICAgIDsvLyBMb2FkIEludGVybGVhdmVkIEw9MCBhbmQgTD0xIExNQVggVGFibGVzCi0gICAgICAgIE1fU1RSICAgICAgICAgICBwTE1BWFRhYmxlTDBMMSxwcExNQVhUYWJsZUwwTDEgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBMTUFYIHRhYmxlIGFkZHJlc3Mgb24gc3RhY2sKLSAgICAgICAgTERSICAgICAgICAgICAgIHBSTUFYVGFibGVMMEwxLCA9YXJtVkNNNFAyX0ludGVyTDBMMVJNQVggICAgICAgICAgICA7Ly8gTG9hZCBJbnRlcmxlYXZlZCBMPTAgYW5kIEw9MSBSTUFYIFRhYmxlcwotICAgICAgICBNT1YgICAgICAgICAgICAgQ291bnQsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gc2V0IHN0YXJ0PTAKLSAgICAgICAgTV9TVFIgICAgICAgICAgIHBSTUFYVGFibGVMMEwxLHBwUk1BWFRhYmxlTDBMMSAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIFJNQVggdGFibGUgYWRkcmVzcyBvbiBzdGFjawotICAgICAgICAgICAgICAgIAotCi0gICAgICAgIEJMICAgICAgICAgICAgICBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZSAgICAgICAgICAgICAgICAgOy8vIGNhbGwgVW5zYWZlIEZ1bmN0aW9uIGZvciBWTEMgWmlnemFnIERlY29kaW5nCi0gICAgICAgICAKLSAgICAgICAKLQotICAgICAgICBNX0VORAotICAgICAgICBFTkRJRgotICAgICAgICAKLSAgICAgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTENfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDU5NDBjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTENfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07LyoqCi07ICogCi07ICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDX3MucwotOyAqIE9wZW5NQVggREw6IHYxLjAuMgotOyAqIFJldmlzaW9uOiAgIDk2NDEKLTsgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotOyAqIAotOyAqIAotOyAqIAotOyAqCi07ICogRGVzY3JpcHRpb246IAotOyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGRlY29kaW5nCi07ICogZm9yIGludGVyIGJsb2NrLgotOyAqCi07ICoKLTsgKgotOyAqIEZ1bmN0aW9uOiBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyCi07ICoKLTsgKiBEZXNjcmlwdGlvbjoKLTsgKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gZm9yIG9uZSBpbnRyYSBjb2RlZCBibG9jay4KLTsgKgotOyAqIFJlbWFya3M6Ci07ICoKLTsgKiBQYXJhbWV0ZXJzOgotOyAqIFtpbl0gICAgcHBCaXRTdHJlYW0gICAgICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgotOyAqICAgICAgICAgICAgICAgICAgICB0aGUgYml0c3RyZWFtIGJ1ZmZlcgotOyAqIFtpbl0gICAgcEJpdE9mZnNldCAgICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKLTsgKiAgICAgICAgICAgICAgICAgICAgdG8gYnkgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4gICAgWzAtN10uCi07ICogW2luXSBzaG9ydFZpZGVvSGVhZGVyICAgICBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsKLTsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgc2hvcnRWaWRlb0hlYWRlcj09MCwKLTsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLgotOyAqIFtvdXRdICAgIHBwQml0U3RyZWFtICAgICAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMKLTsgKiAgICAgICAgICAgICAgICAgICAgZGVjb2RlZCwgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZQotOyAqICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIKLTsgKiBbb3V0XSAgICBwQml0T2Zmc2V0ICAgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQotOyAqICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Ci07ICogICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbQotOyAqIFtvdXRdICAgIHBEc3QgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudAotOyAqICAgICAgICAgICAgICAgICAgICBibG9jay4gTXVzdCBiZSAxNi1ieXRlIGFsaWduZWQKLTsgKgotOyAqIFJldHVybiBWYWx1ZToKLTsgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMKLTsgKiAgIC1BdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0LCBvcgotOyAqICAgLXBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCwgb3IKLTsgKiAgIC0qcEJpdE9mZnNldCBleGNlZWRzIFswLDddLgotOyAqIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yCi07ICogICAtQXQgbGVhc3Qgb25lIG1hcmsgYml0IGlzIGVxdWFsIHRvIHplcm8KLTsgKiAgIC1FbmNvdW50ZXJlZCBhbiBpbGxlZ2FsIHN0cmVhbSBjb2RlIHRoYXQgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBWTEMgdGFibGUKLTsgKiAgIC1FbmNvdW50ZXJlZCBhbmQgaWxsZWdhbCBjb2RlIGluIHRoZSBWTEMgRkxDIHRhYmxlCi07ICogICAtVGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgaXMgZ3JlYXRlciB0aGFuIDY0Ci07ICoKLTsgKi8KLQotCi0gICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgSU5DTFVERSBhcm1DT01NX0JpdERlY19zLmgKLQotCi0gICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotCi0gICAgIAotCi0KLQotICAgICBJRiBBUk0xMTM2SlMKLSAgICAgCi0gICAgICAgIDsvLyBJbXBvcnQgdmFyaW91cyB0YWJsZXMgbmVlZGVkIGZvciB0aGUgZnVuY3Rpb24KLQotICAgICAgICAKLSAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9JbnRyYVZsY0wwTDEgICAgICAgICAgICAgOy8vIENvbnRhaW5zIG9wdGltaXplZCBhbmQgcGFja2VkIFZMQyBUYWJsZXMgZm9yIGJvdGggTGFzdCA9MSBhbmQgbGFzdD0wCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUGFja2VkIGluIFJ1bjpMZXZlbDpMYXN0IGZvcm1hdAotICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludHJhTDBMMUxNQVggICAgICAgICAgICA7Ly8gQ29udGFpbnMgTE1BWCB0YWJsZSBlbnRyaWVzIHdpdGggYm90aCBMYXN0PTAgYW5kIExhc3Q9MQotICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludHJhTDBMMVJNQVggICAgICAgICAgICA7Ly8gQ29udGFpbnMgUk1BWCB0YWJsZSBlbnRyaWVzIHdpdGggYm90aCBMYXN0PTAgYW5kIExhc3Q9MQotICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuICAgICA7Ly8gY29udGFpbnMgY2xhc3NpY2FsIFppZ3phZyB0YWJsZSBlbnRyaWVzIHdpdGggZG91YmxlIHRoZSBvcmlnaW5hbCB2YWx1ZXMKLSAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlCi0KLTsvL0lucHV0IEFyZ3VtZW50cwotCi1wcEJpdFN0cmVhbSAgICAgICAgICBSTiAwCi1wQml0T2Zmc2V0ICAgICAgICAgICBSTiAxCi1wRHN0ICAgICAgICAgICAgICAgICBSTiAyCi1QcmVkRGlyICAgICAgICAgICAgICBSTiAzCi1zaG9ydFZpZGVvSGVhZGVyICAgICBSTiAzCi0KLTsvL0xvY2FsIFZhcmlhYmxlcwotCi1SZXR1cm4gICAgICAgICAgICAgICBSTiAwCi0KLXBWbGNUYWJsZUwwTDEgICAgICAgIFJOIDQKLXBMTUFYVGFibGVMMEwxICAgICAgIFJOIDQKLXBSTUFYVGFibGVMMEwxICAgICAgIFJOIDQKLXBaaWd6YWdUYWJsZSAgICAgICAgIFJOIDQKLUNvdW50ICAgICAgICAgICAgICAgIFJOIDYKLQotCi0gICAgICAgIAotICAgICAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IHRvIHN0b3JlIG9wdGltaXplZCBWTEMsWmlnemFnLCBSTUFYLCBMTUFYIFRhYmxlIEFkZHJlc3NlcyAKLSAgICAgCi0gICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFZsY1RhYmxlTDBMMSw0Ci0gICAgICAgIE1fQUxMT0M0ICAgICAgICBwcExNQVhUYWJsZUwwTDEsNAotICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBSTUFYVGFibGVMMEwxLDQKLSAgICAgICAgTV9BTExPQzQgICAgICAgIHBwWmlnemFnVGFibGUsNAotCi0gICAgICAgIAotICAgICAgICBNX1NUQVJUIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQyxyMTIKLQotICAgICAgICBNX0FSRyAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcm9uU3RhY2ssNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBvaW50ZXIgdG8gSW5wdXQgQXJndW1lbnQgb24gc3RhY2sgICAgICAgICAgIAotCi0gICAgICAgIExEUiAgICAgICAgICAgICBwWmlnemFnVGFibGUsID1hcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW4gICAgIDsvLyBMb2FkIEFkZHJlc3Mgb2YgdGhlIFppZ3phZyB0YWJsZSAgICAKLSAgICAgICAgQUREICAgICAgICAgICAgIHBaaWd6YWdUYWJsZSwgcFppZ3phZ1RhYmxlLCBQcmVkRGlyLCBMU0wgIzYgICAgICAgICAgIDsvLyBMb2FkaW5nIERpZmZlcmVudCB0eXBlIG9mIHppZ3phZyB0YWJsZXMgYmFzZWQgb24gUHJlZERpcgotICAgICAgIAotICAgICAgICBNX1NUUiAgICAgICAgICAgcFppZ3phZ1RhYmxlLHBwWmlnemFnVGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIFppZ3phZyB0YWJsZSBhZGRyZXNzIG9uIHN0YWNrCi0gICAgICAgIExEUiAgICAgICAgICAgICBwVmxjVGFibGVMMEwxLCA9YXJtVkNNNFAyX0ludHJhVmxjTDBMMSAgICAgICAgICAgIDsvLyBMb2FkIG9wdGltaXplZCBwYWNrZWQgVkxDIFRhYmxlIHdpdGggYm90aCBMPTAgYW5kIEw9MSBlbnRyaWVzCi0gICAgICAgIE1fU1RSICAgICAgICAgICBwVmxjVGFibGVMMEwxLHBwVmxjVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgVkxDIFRhYmxlIGFkZHJlc3Mgb24gc3RhY2sKLSAgICAgICAgTERSICAgICAgICAgICAgIHBMTUFYVGFibGVMMEwxLCA9YXJtVkNNNFAyX0ludHJhTDBMMUxNQVggICAgICAgICAgOy8vIExvYWQgTE1BWCBUYWJsZQotICAgICAgICBNX1NUUiAgICAgICAgICAgcExNQVhUYWJsZUwwTDEscHBMTUFYVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIExNQVggVGFibGUgYWRkcmVzcyBvbiBTdGFjawotICAgICAgICBMRFIgICAgICAgICAgICAgcFJNQVhUYWJsZUwwTDEsID1hcm1WQ000UDJfSW50cmFMMEwxUk1BWCAgICAgICAgICA7Ly8gTG9hZCBSTUFYIFRhYmxlCi0gICAgICAgIE1PViAgICAgICAgICAgICBDb3VudCwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2V0IFN0YXJ0PTAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgTV9TVFIgICAgICAgICAgIHBSTUFYVGFibGVMMEwxLHBwUk1BWFRhYmxlTDBMMSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBSTUFYIFRhYmxlIGFkZHJlc3Mgb24gc3RhY2sKLSAgICAgICAgICAgICAgCi0KLSAgICAgICAKLSAgICAgICAgTV9MRFIgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXIsc2hvcnRWaWRlb0hlYWRlcm9uU3RhY2sgICAgICAgICAgICAgIDsvLyBnZXQgdGhlIElucHV0IEFyZ3VtZW50IGZyb20gc3RhY2sKLQotICAgICAgICBCTCAgICAgICAgICAgICAgYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmUgICAgICAgICAgICAgICA7Ly8gQ2FsbCBVbnNhZmUgRnVuY3Rpb24KLQotCi0KLSAgICAgICAgCi0gICAgICAgIE1fRU5ECi0gICAgICAgIEVORElGCi0gICAgICAgIAotICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTENfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQ19zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2NmE2MmIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQ19zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvKioKLTsgKiAKLTsgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTENfcy5zCi07ICogT3Blbk1BWCBETDogdjEuMC4yCi07ICogUmV2aXNpb246ICAgOTY0MQotOyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci07ICogCi07ICogCi07ICogCi07ICoKLTsgKiBEZXNjcmlwdGlvbjogCi07ICogQ29udGFpbnMgbW9kdWxlcyBmb3IgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZGVjb2RpbmcKLTsgKiBmb3IgaW50ZXIgYmxvY2suCi07ICoKLTsgKgotOyAqCi07ICogRnVuY3Rpb246IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIKLTsgKgotOyAqIERlc2NyaXB0aW9uOgotOyAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBmb3Igb25lIGludHJhIGNvZGVkIGJsb2NrLgotOyAqCi07ICogUmVtYXJrczoKLTsgKgotOyAqIFBhcmFtZXRlcnM6Ci07ICogW2luXSAgICBwcEJpdFN0cmVhbSAgICAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCi07ICogICAgICAgICAgICAgICAgICAgIHRoZSBiaXRzdHJlYW0gYnVmZmVyCi07ICogW2luXSAgICBwQml0T2Zmc2V0ICAgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAotOyAqICAgICAgICAgICAgICAgICAgICB0byBieSAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbiAgICBbMC03XS4KLTsgKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgICAgIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOwotOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiBzaG9ydFZpZGVvSGVhZGVyPT0wLAotOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIHNob3J0VmlkZW9IZWFkZXI9PTEuCi07ICogW291dF0gICAgcHBCaXRTdHJlYW0gICAgICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcwotOyAqICAgICAgICAgICAgICAgICAgICBkZWNvZGVkLCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlCi07ICogICAgICAgICAgICAgICAgICAgIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlcgotOyAqIFtvdXRdICAgIHBCaXRPZmZzZXQgICAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCi07ICogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKLTsgKiAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtCi07ICogW291dF0gICAgcERzdCAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50Ci07ICogICAgICAgICAgICAgICAgICAgIGJsb2NrLiBNdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZAotOyAqCi07ICogUmV0dXJuIFZhbHVlOgotOyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cwotOyAqICAgLUF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBEc3QsIG9yCi07ICogICAtcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLCBvcgotOyAqICAgLSpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10uCi07ICogT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IKLTsgKiAgIC1BdCBsZWFzdCBvbmUgbWFyayBiaXQgaXMgZXF1YWwgdG8gemVybwotOyAqICAgLUVuY291bnRlcmVkIGFuIGlsbGVnYWwgc3RyZWFtIGNvZGUgdGhhdCBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIFZMQyB0YWJsZQotOyAqICAgLUVuY291bnRlcmVkIGFuZCBpbGxlZ2FsIGNvZGUgaW4gdGhlIFZMQyBGTEMgdGFibGUKLTsgKiAgIC1UaGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBpcyBncmVhdGVyIHRoYW4gNjQKLTsgKgotOyAqLwotCi0KLSAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICBJTkNMVURFIGFybUNPTU1fQml0RGVjX3MuaAotCi0KLSAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0KLSAgICAgCi0gICAgICAKLQotCi0gICAgICBJRiBBUk0xMTM2SlMgOkxPUjogQ29ydGV4QTgKLQotICAgICAKLSAgICAgICAgOy8vIEltcG9ydCB2YXJpb3VzIHRhYmxlcyBuZWVkZWQgZm9yIHRoZSBmdW5jdGlvbgotCi0gICAgICAgIAotICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludHJhVmxjTDBMMSAgICAgICAgICAgICA7Ly8gQ29udGFpbnMgb3B0aW1pemVkIGFuZCBwYWNrZWQgVkxDIFRhYmxlcyBmb3IgYm90aCBMYXN0ID0xIGFuZCBsYXN0PTAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBQYWNrZWQgaW4gUnVuOkxldmVsOkxhc3QgZm9ybWF0Ci0gICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfSW50cmFMMEwxTE1BWCAgICAgICAgICAgIDsvLyBDb250YWlucyBMTUFYIHRhYmxlIGVudHJpZXMgd2l0aCBib3RoIExhc3Q9MCBhbmQgTGFzdD0xCi0gICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfSW50cmFMMEwxUk1BWCAgICAgICAgICAgIDsvLyBDb250YWlucyBSTUFYIHRhYmxlIGVudHJpZXMgd2l0aCBib3RoIExhc3Q9MCBhbmQgTGFzdD0xCi0gICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW4gICAgIDsvLyBjb250YWlucyBDTGFzc2ljYWwsIEhvcml6b250YWwsIFZlcnRpY2FsIFppZ3phZyB0YWJsZSBlbnRyaWVzIHdpdGggZG91YmxlIHRoZSBvcmlnaW5hbCB2YWx1ZXMKLSAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9hSW50cmFEQ0x1bWFDaHJvbWFJbmRleCAgOy8vIENvbnRhaW5zIE9wdGltaXplZCBEQ0x1bWEgYW5kIERDQ2hyb21hIEluZGV4IHRhYmxlIEVudHJpZXMKLSAgICAgICAgCi0KLSAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlCi0KLTsvL0lucHV0IEFyZ3VtZW50cwotCi1wcEJpdFN0cmVhbSAgICAgICAgICBSTiAwCi1wQml0T2Zmc2V0ICAgICAgICAgICBSTiAxCi1wRHN0ICAgICAgICAgICAgICAgICBSTiAyCi1QcmVkRGlyICAgICAgICAgICAgICBSTiAzCi1zaG9ydFZpZGVvSGVhZGVyICAgICBSTiAzCi12aWRlb0NvbXAgICAgICAgICAgICBSTiA1Ci07Ly9Mb2NhbCBWYXJpYWJsZXMKLQotUmV0dXJuICAgICAgICAgICAgICAgUk4gMAotCi1wRENMdW1hQ2hyb21hSW5kZXggICBSTiA0Ci1wRENDaHJvbWFJbmRleCAgICAgICBSTiA3Ci1wVmxjVGFibGVMMEwxICAgICAgICBSTiA0Ci1wTE1BWFRhYmxlTDBMMSAgICAgICBSTiA0Ci1wUk1BWFRhYmxlTDBMMSAgICAgICBSTiA0Ci1wWmlnemFnVGFibGUgICAgICAgICBSTiA0Ci1Db3VudCAgICAgICAgICAgICAgICBSTiA2Ci1EQ1ZhbHVlU2l6ZSAgICAgICAgICBSTiA2Ci1wb3dPZlNpemUgICAgICAgICAgICBSTiA3Ci10ZW1wMSAgICAgICAgICAgICAgICBSTiA1Ci0KLQotOy8vIFNjcmF0Y2ggUmVnaXN0ZXJzCi0KLVJCaXRTdHJlYW0gICAgICAgICAgIFJOIDgKLVJCaXRCdWZmZXIgICAgICAgICAgIFJOIDkKLVJCaXRDb3VudCAgICAgICAgICAgIFJOIDEwCi0KLVQxICAgICAgICAgICAgICAgICAgIFJOIDExCi1UMiAgICAgICAgICAgICAgICAgICBSTiAxMgotRENWYWwgICAgICAgICAgICAgICAgUk4gMTQKLQotICAgICAgICAKLSAgICAgICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSB0byBzdG9yZSBvcHRpbWl6ZWQgVkxDLFppZ3phZywgUk1BWCwgTE1BWCBUYWJsZSBBZGRyZXNzZXMgCi0gICAgIAotICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBWbGNUYWJsZUwwTDEsNAotICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBMTUFYVGFibGVMMEwxLDQKLSAgICAgICAgTV9BTExPQzQgICAgICAgIHBwUk1BWFRhYmxlTDBMMSw0Ci0gICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFppZ3phZ1RhYmxlLDQKLSAgICAgICAgTV9BTExPQzQgICAgICAgIHBEQ0NvZWZmLDQKLSAgICAgICAgCi0KLSAgICAgICAgCi0gICAgICAgIE1fU1RBUlQgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLHIxMgotCi0gICAgICAgIE1fQVJHICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyb25TdGFjayw0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBQb2ludGVyIHRvIGFyZ3VtZW50IG9uIHN0YWNrICAKLSAgICAgICAgTV9BUkcgICAgICAgICAgIHZpZGVvQ29tcG9uc3RhY2ssNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFBvaW50ZXIgdG8gYXJndW1lbnQgb24gc3RhY2sKLQotICAgICAgICAKLSAgICAgICAgOy8vIERlY29kZSBEQyBDb2VmZmljaWVudAotCi0gICAgICAgIAotICAgICAgICBMRFIgICAgICAgICAgICAgcERDTHVtYUNocm9tYUluZGV4LCA9YXJtVkNNNFAyX2FJbnRyYURDTHVtYUNocm9tYUluZGV4IDsvLyBMb2FkIE9wdGltaXplZCBWTEMgVGFibGUgZm9yIEx1bWluYW5jZSBhbmQgQ2hyb21pbmFuY2UKLQotICAgICAgICA7Ly8gSW5pdGlhbGl6aW5nIHRoZSBCaXRzdHJlYW0gTWFjcm8KLQotICAgICAgICBNX0JEX0lOSVQwICAgICAgcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIFJCaXRTdHJlYW0sIFJCaXRCdWZmZXIsIFJCaXRDb3VudAotICAgICAgICBNX0xEUiAgICAgICAgICAgdmlkZW9Db21wLHZpZGVvQ29tcG9uc3RhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgTV9CRF9JTklUMSAgICAgIFQxLCBUMiwgVDIKLSAgICAgICAgQUREICAgICAgICAgICAgIHBEQ0x1bWFDaHJvbWFJbmRleCxwRENMdW1hQ2hyb21hSW5kZXgsdmlkZW9Db21wLCBMU0wgIzYgICAgICAgICAgICAgCi0gICAgICAgIE1fQkRfSU5JVDIgICAgICBUMSwgVDIsIFQyCi0gICAgCi0gICAgICAgIAotICAgICAgICBNX0JEX1ZMRCAgICAgICAgRENWYWx1ZVNpemUsVDEsVDIscERDTHVtYUNocm9tYUluZGV4LDQsMiAgICAgICAgICAgICAgICAgICAgOy8vIFZMQyBEZWNvZGUgdXNpbmcgb3B0aW1pemVkIEx1bWluYW5jZSBhbmQgQ2hyb21pbmFuY2UgVkxDIFRhYmxlCi0KLSAgICAKLSAgICAgICAKLQotRGVjb2RlREMKLSAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgQ01QICAgICAgICAgICAgIERDVmFsdWVTaXplLCMxMiAgICAgCi0gICAgICAgIEJHVCAgICAgICAgICAgICBFeGl0RXJyb3IKLSAgICAgICAgCi0gICAgICAgIENNUCAgICAgICAgICAgICBEQ1ZhbHVlU2l6ZSwjMAotICAgICAgICBNT1ZFUSAgICAgICAgICAgRENWYWwsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIERDVmFsdWVTaXplIGlzIHplcm8gdGhlbiBEQyBjb2VmZiA9MAotICAgICAgICBCRVEgICAgICAgICAgICAgQUNEZWNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEJyYW5jaCB0byBwZXJmb3JtIEFDIENvZWZmIERlY29kaW5nCi0gICAgICAgIAotICAgICAgICBNX0JEX1ZSRUFEMTYgICAgRENWYWwsRENWYWx1ZVNpemUsVDEsVDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEdldCBEQyBWYWx1ZSBGcm9tIEJpdCBzdHJlYW0KLSAgICAgICAgIAotCi0gICAgICAgIE1PViAgICAgICAgICAgICBwb3dPZlNpemUsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgTFNMICAgICAgICAgICAgIHBvd09mU2l6ZSxEQ1ZhbHVlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwb3dPZlNpemU9cG93KDIsRENWYWx1ZVNpemUpCi0gICAgICAgIENNUCAgICAgICAgICAgICBEQ1ZhbCxwb3dPZlNpemUsTFNSICMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ29tcGFyZSBEQ1ZhbCB3aXRoIHBvd09mU2l6ZS8yIAotICAgICAgICBBRERMVCAgICAgICAgICAgRENWYWwsRENWYWwsIzEKLSAgICAgICAgU1VCTFQgICAgICAgICAgIERDVmFsLERDVmFsLHBvd09mU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBMZXNzdGhhbiBwb3dPZlNpemUvMiBEQ1ZhbD1EQ1ZhbC1wb3dPZlNpemUrMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEVsc2UgRENWYWw9IGZldGNoYml0cyBmcm9tIGJpdCBzdHJlYW0KLQotQ2hlY2tEQ1ZhbHVlU2l6ZQotICAgICAgICAKLSAgICAgICAgQ01QICAgICAgICAgICAgIERDVmFsdWVTaXplLCM4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBEQ1ZhbHVlU2l6ZSBncmVhdGVyIHRoYW4gOCBjaGVjayBtYXJrZXIgYml0Ci0KLSAgICAgICAgQkxFICAgICAgICAgICAgIEFDRGVjb2RlCi0KLSAgICAgICAgTV9CRF9SRUFEOCAgICAgIHRlbXAxLDEsVDEKLSAgICAgICAgVEVRICAgICAgICAgICAgIHRlbXAxLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBNYXJrZXIgYml0IGlzIHplcm8gRXhpdCB3aXRoIGFuIEVycm9yIE1lc3NhZ2UKLSAgICAgICAgQkVRICAgICAgICAgICAgIEV4aXRFcnJvcgotCi0gICAgICAgIAotCi0gICAgICAgIDsvLyBEZWNvZGUgQUMgQ29lZmZpY2llbnQKLQotQUNEZWNvZGUKLQotICAgICAgICBNX1NUUiAgICAgICAgICAgRENWYWwscERDQ29lZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgRGVjb2RlZCBEQyBDb2VmZiBvbiBTdGFjawotICAgICAgICBNX0JEX0ZJTkkgICAgICAgcHBCaXRTdHJlYW0scEJpdE9mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVGVybWluYXRpbmcgdGhlIEJpdCBzdHJlYW0gTWFjcm8KLSAgICAgICAgIAotICAgICAgICBMRFIgICAgICAgICAgICAgcFppZ3phZ1RhYmxlLCA9YXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuICAgICAgICAgIDsvLyBMb2FkIFppZ3phZyB0YWxiZSBhZGRyZXNzICAgCi0gICAgICAgIEFERCAgICAgICAgICAgICBwWmlnemFnVGFibGUsIHBaaWd6YWdUYWJsZSwgUHJlZERpciwgTFNMICM2ICAgICAgICAgICAgICAgIDsvLyBNb2RpZnkgdGhlIFppZ3phZyB0YWJsZSBhZHJlc3MgYmFzZWQgb24gUHJlZERpciAgICAgICAgICAgICAgICAKLSAgICAgICAKLSAgICAgICAgTV9TVFIgICAgICAgICAgIHBaaWd6YWdUYWJsZSxwcFppZ3phZ1RhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHppZ3phZyB0YWJsZSBvbiBzdGFjawotICAgICAgICBMRFIgICAgICAgICAgICAgcFZsY1RhYmxlTDBMMSwgPWFybVZDTTRQMl9JbnRyYVZsY0wwTDEgICAgICAgICAgICAgICAgIDsvLyBMb2FkIE9wdGltaXplZCBWTEMgVGFibGUgV2l0aCBib3RoIExhc3Q9MCBhbmQgTGFzdD0xIEVudHJpZXMKLSAgICAgICAgTV9TVFIgICAgICAgICAgIHBWbGNUYWJsZUwwTDEscHBWbGNUYWJsZUwwTDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIE9wdGltaXplZCBWTEMgVGFibGUgb24gc3RhY2sKLSAgICAgICAgTERSICAgICAgICAgICAgIHBMTUFYVGFibGVMMEwxLCA9YXJtVkNNNFAyX0ludHJhTDBMMUxNQVggICAgICAgICAgICAgICA7Ly8gTG9hZCBMTUFYIFRhYmxlCi0gICAgICAgIE1fU1RSICAgICAgICAgICBwTE1BWFRhYmxlTDBMMSxwcExNQVhUYWJsZUwwTDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBMTUFYIHRhYmxlIG9uIHN0YWNrCi0gICAgICAgIExEUiAgICAgICAgICAgICBwUk1BWFRhYmxlTDBMMSwgPWFybVZDTTRQMl9JbnRyYUwwTDFSTUFYICAgICAgICAgICAgICAgOy8vIExvYWQgUk1BWCBUYWJsZQotICAgICAgICBNT1YgICAgICAgICAgICAgQ291bnQsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2V0IFN0YXJ0ID0xICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIE1fU1RSICAgICAgICAgICBwUk1BWFRhYmxlTDBMMSxwcFJNQVhUYWJsZUwwTDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBSTUFYIFRhYmxlIG9uIFN0YWNrCi0gICAgICAgIAotICAgICAgIAotICAgICAgICBNX0xEUiAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcixzaG9ydFZpZGVvSGVhZGVyb25TdGFjayAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCB0aGUgSW5wdXQgQXJndW1lbnQgRnJvbSBTdGFjawotICAgICAgICAKLSAgICAgICAgQkwgICAgICAgICAgICAgIGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlICAgICAgICAgICAgICAgICAgICA7Ly8gQ2FsbCB0aGUgVW5zYWZlIEZ1bmN0aW9uCi0KLSAgICAgICAgTV9MRFIgICAgICAgICAgIERDVmFsLHBEQ0NvZWZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEdldCB0aGUgRGVjb2RlZCBEQyBWYWx1ZSBGcm9tIFN0YWNrCi0gICAgICAgIFNUUkggICAgICAgICAgICBEQ1ZhbCxbcERzdF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSB0aGUgREMgVmFsdWUgCi0gICAgICAgIEIgICAgICAgICAgICAgICBFeGl0T0sKLSAgICAgICAgCi0gICAgICAgICAgICAgIAotCi1FeGl0RXJyb3IKLSAKLSAgICAgICAgTV9CRF9GSU5JICAgICAgIHBwQml0U3RyZWFtLHBCaXRPZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFRlcm1pbmF0aW5nIHRoZSBCaXQgU3RyZWFtIE1hY3JvIGluIGNhc2Ugb2YgYW4gRXJyb3IKLSAgICAgICAgTU9WICAgICAgICAgICAgIFJldHVybiwjT01YX1N0c19FcnIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEV4aXQgd2l0aCBhbiBFcnJvciBNZXNzYWdlIAotRXhpdE9LCi0gICAgICAKLSAgICAgICAgTV9FTkQKLSAgICAgICAgRU5ESUYKLSAgICAgICAgCi0gICAgICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9GaW5kTVZwcmVkX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRmluZE1WcHJlZF9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyYWNkNTEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9GaW5kTVZwcmVkX3MucworKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAyX0ZpbmRNVnByZWRfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgOTY0MQotOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotOy8vIEZ1bmN0aW9uOgotOy8vICAgICBvbXhWQ000UDJfRmluZE1WcHJlZAotOy8vCi0gICAgICAgIDsvLyBJbmNsdWRlIGhlYWRlcnMKLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgICBJTkNMVURFIGFybVZDQ09NTV9zLmgKLQotICAgICAgICA7Ly8gRGVmaW5lIGNwdSB2YXJpYW50cwotICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIElGIEFSTTExMzZKUwotICAgICAgICAKLSAgICAgICAgTV9UQUJMRSBhcm1WQ000UDJfcEJsa0luZGV4VGFibGUKLSAgICAgICAgRENEICBPTVhWQ0JsazAsIE9NWFZDQmxrMQotICAgICAgICBEQ0QgIE9NWFZDQmxrMiwgT01YVkNCbGszCi0KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIAotcFNyY01WQ3VyTUIgICAgICAgICAgICBSTiAwCi1wU3JjQ2FuZE1WMSAgICAgICAgICAgIFJOIDEKLXBTcmNDYW5kTVYyICAgICAgICAgICAgUk4gMgotcFNyY0NhbmRNVjMgICAgICAgICAgICBSTiAzCi1wRHN0TVZQcmVkICAgICAgICAgICAgIFJOIDQKLXBEc3RNVlByZWRNRSAgICAgICAgICAgUk4gNQotaUJsayAgICAgICAgICAgICAgICAgICBSTiA2Ci0KLXBUYWJsZSAgICAgICAgICAgICAgICAgUk4gNAotQ2FuZE1WICAgICAgICAgICAgICAgICBSTiAxMgotCi1wQ2FuZE1WMSAgICAgICAgICAgICAgIFJOIDcKLXBDYW5kTVYyICAgICAgICAgICAgICAgUk4gOAotcENhbmRNVjMgICAgICAgICAgICAgICBSTiA5Ci0KLUNhbmRNVjFkeCAgICAgICAgICAgICAgUk4gMCAKLUNhbmRNVjFkeSAgICAgICAgICAgICAgUk4gMSAKLUNhbmRNVjJkeCAgICAgICAgICAgICAgUk4gMgotQ2FuZE1WMmR5ICAgICAgICAgICAgICBSTiAzCi1DYW5kTVYzZHggICAgICAgICAgICAgIFJOIDEwCi1DYW5kTVYzZHkgICAgICAgICAgICAgIFJOIDExCi0KLXRlbXAgICAgICAgICAgICAgICAgICAgUk4gMTQKLQotemVybyAgICAgICAgICAgICAgICAgICBSTiAxNAotcmV0dXJuICAgICAgICAgICAgICAgICBSTiAwCi0gICAgICAgIAotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IE1haW4gcm91dGluZQotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAKLQotICAgICAgICBNX0FMTE9DNCBNViwgNAotICAgICAgICAKLSAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlciAKLSAgICAgICAgTV9TVEFSVCBvbXhWQ000UDJfRmluZE1WcHJlZCwgcjExCi0gICAgICAgIAotICAgICAgICA7Ly8gRGVmaW5lIHN0YWNrIGFyZ3VtZW50cwotICAgICAgICBNX0FSRyAgIHBwRHN0TVZQcmVkLCAgNAotICAgICAgICBNX0FSRyAgIHBwRHN0TVZQcmVkTUUsIDQKLSAgICAgICAgTV9BUkcgICBCbGssIDQKLSAgICAgICAgCi0gICAgICAgIE1fQURSIENhbmRNViwgTVYKLSAgICAgICAgTU9WICAgemVybywgIzAKLSAgICAgICAgTV9MRFIgaUJsaywgQmxrCi0gICAgICAgIAotICAgICAgICA7Ly8gU2V0IHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGVzZQotICAgICAgICA7Ly8gdG8gYmUgdXNlZCBpZiBwU3JjQ2FuZE1WWzF8MnwzXSA9PSBOVUxMCi0gICAgICAgIE1PViAgIHBDYW5kTVYxLCBDYW5kTVYKLSAgICAgICAgTU9WICAgcENhbmRNVjIsIENhbmRNVgotICAgICAgICBNT1YgICBwQ2FuZE1WMywgQ2FuZE1WCi0gICAgCi0gICAgICAgIFNUUiAgIHplcm8sIFtDYW5kTVZdCi0KLSAgICAgICAgOy8vIEJyYW5jaCB0byB0aGUgY2FzZSBiYXNlZCBvbiBibGsgbnVtYmVyCi0gICAgICAgIE1fU1dJVENIIGlCbGsKLSAgICAgICAgTV9DQVNFICAgT01YVkNCbGswICAgICAgOy8vIGlCbGs9MAotICAgICAgICBNX0NBU0UgICBPTVhWQ0JsazEgICAgICA7Ly8gaUJsaz0wCi0gICAgICAgIE1fQ0FTRSAgIE9NWFZDQmxrMiAgICAgIDsvLyBpQmxrPTAKLSAgICAgICAgTV9DQVNFICAgT01YVkNCbGszICAgICAgOy8vIGlCbGs9MAotICAgICAgICBNX0VORFNXSVRDSAotICAgICAgICAKLU9NWFZDQmxrMAotICAgICAgICBDTVAgICBwU3JjQ2FuZE1WMSwgIzAKLSAgICAgICAgQURETkUgcENhbmRNVjEsIHBTcmNDYW5kTVYxLCAjNAotICAgICAgICAKLSAgICAgICAgQ01QICAgcFNyY0NhbmRNVjIsICMwCi0gICAgICAgIEFERE5FIHBDYW5kTVYyLCBwU3JjQ2FuZE1WMiwgIzgKLQotICAgICAgICBDTVAgICBwU3JjQ2FuZE1WMywgIzAKLSAgICAgICAgQURETkUgcENhbmRNVjMsIHBTcmNDYW5kTVYzLCAjOAotICAgICAgICBDTVBFUSBwU3JjQ2FuZE1WMSwgIzAKLSAgICAKLSAgICAgICAgTU9WRVEgcENhbmRNVjMsIHBDYW5kTVYyCi0gICAgICAgIE1PVkVRIHBDYW5kTVYxLCBwQ2FuZE1WMgotICAgICAgICAgICAgICAgIAotICAgICAgICBDTVAgICBwU3JjQ2FuZE1WMSwgIzAKLSAgICAgICAgQ01QRVEgcFNyY0NhbmRNVjIsICMwCi0gICAgCi0gICAgICAgIE1PVkVRIHBDYW5kTVYxLCBwQ2FuZE1WMwotICAgICAgICBNT1ZFUSBwQ2FuZE1WMiwgcENhbmRNVjMKLSAgICAgICAgCi0gICAgICAgIENNUCAgIHBTcmNDYW5kTVYyLCAjMAotICAgICAgICBDTVBFUSBwU3JjQ2FuZE1WMywgIzAKLSAgICAKLSAgICAgICAgTU9WRVEgcENhbmRNVjIsIHBDYW5kTVYxCi0gICAgICAgIE1PVkVRIHBDYW5kTVYzLCBwQ2FuZE1WMQotICAgICAgICAKLSAgICAgICAgQiAgICAgQmxrRW5kCi0gICAgCi1PTVhWQ0JsazEKLSAgICAgICAgTU9WICAgcENhbmRNVjEsIHBTcmNNVkN1ck1CCi0gICAgICAgIENNUCAgIHBTcmNDYW5kTVYzLCAjMAotICAgICAgICBBRERORSBwQ2FuZE1WMywgcFNyY0NhbmRNVjMsICM4Ci0gICAgICAgIAotICAgICAgICBDTVAgICBwU3JjQ2FuZE1WMiwgIzAKLSAgICAgICAgQURETkUgcENhbmRNVjIsIHBTcmNDYW5kTVYyLCAjMTIKLSAgICAKLSAgICAgICAgQ01QRVEgcFNyY0NhbmRNVjMsICMwCi0gICAgCi0gICAgICAgIE1PVkVRIHBDYW5kTVYyLCBwQ2FuZE1WMQotICAgICAgICBNT1ZFUSBwQ2FuZE1WMywgcENhbmRNVjEKLSAgICAgICAgICAgIAotICAgICAgICBCICAgICBCbGtFbmQKLQotT01YVkNCbGsyCi0gICAgICAgIENNUCAgIHBTcmNDYW5kTVYxLCAjMAotICAgICAgICBNT1YgICBwQ2FuZE1WMiwgcFNyY01WQ3VyTUIKLSAgICAgICAgQUREICAgcENhbmRNVjMsIHBTcmNNVkN1ck1CLCAjNAotICAgICAgICBBRERORSBwQ2FuZE1WMSwgcFNyY0NhbmRNVjEsICMxMgotICAgICAgICBCICAgICBCbGtFbmQKLQotT01YVkNCbGszCi0gICAgICAgIEFERCAgIHBDYW5kTVYxLCBwU3JjTVZDdXJNQiwgIzgKLSAgICAgICAgTU9WICAgcENhbmRNVjIsIHBTcmNNVkN1ck1CCi0gICAgICAgIEFERCAgIHBDYW5kTVYzLCBwU3JjTVZDdXJNQiwgIzQKLSAgICAKLUJsa0VuZAotCi0gICAgICAgIDsvLyBVc2luZyB0aGUgdHJhbnNwZXJhbmN5IGluZm8sIHplcm8KLSAgICAgICAgOy8vIG91dCB0aGUgY2FuZGlkYXRlIE1WIGlmIG5lY2Nlc2FyeQotICAgICAgICBMRFJTSCBDYW5kTVYxZHgsIFtwQ2FuZE1WMV0sICMyCi0gICAgICAgIExEUlNIIENhbmRNVjJkeCwgW3BDYW5kTVYyXSwgIzIKLSAgICAgICAgTERSU0ggQ2FuZE1WM2R4LCBbcENhbmRNVjNdLCAjMgotICAgIAotICAgICAgICA7Ly8gTG9hZCBhcmd1bWVudCBmcm9tIHRoZSBzdGFjawotICAgICAgICBNX0xEUiBwRHN0TVZQcmVkTUUsIHBwRHN0TVZQcmVkTUUKLQotICAgICAgICBMRFJTSCBDYW5kTVYxZHksIFtwQ2FuZE1WMV0KLSAgICAgICAgTERSU0ggQ2FuZE1WMmR5LCBbcENhbmRNVjJdCi0gICAgICAgIExEUlNIIENhbmRNVjNkeSwgW3BDYW5kTVYzXQotCi0gICAgICAgIENNUCBwRHN0TVZQcmVkTUUsICMwICAgICAgICAKLQotICAgICAgICA7Ly8gU3RvcmUgdGhlIGNhbmRpZGF0ZSBNVidzIGludG8gdGhlIHBEc3RNVlByZWRNRSwgCi0gICAgICAgIDsvLyB0aGVzZSBjYW4gYmUgdXNlZCBpbiB0aGUgZmFzdCBhbGdvcml0aG0gaWYgaW1wbGVtZW50ZWQgCi0KLSAgICAgICAgU1RSSE5FIENhbmRNVjFkeCwgW3BEc3RNVlByZWRNRV0sICMyCi0gICAgICAgIFNUUkhORSBDYW5kTVYxZHksIFtwRHN0TVZQcmVkTUVdLCAjMiAgICAgICAgCi0gICAgICAgIFNUUkhORSBDYW5kTVYyZHgsIFtwRHN0TVZQcmVkTUVdLCAjMgotICAgICAgICBTVFJITkUgQ2FuZE1WMmR5LCBbcERzdE1WUHJlZE1FXSwgIzIKLSAgICAgICAgU1RSSE5FIENhbmRNVjNkeCwgW3BEc3RNVlByZWRNRV0sICMyCi0gICAgICAgIFNUUkhORSBDYW5kTVYzZHksIFtwRHN0TVZQcmVkTUVdCi0gICAgICAgICAgIAotICAgICAgICA7IEZpbmQgdGhlIG1lZGlhbiBvZiB0aGUgMyBjYW5kaWRhdGUgTVYncwotICAgICAgICBNX01FRElBTjMgQ2FuZE1WMWR4LCBDYW5kTVYyZHgsIENhbmRNVjNkeCwgdGVtcAotCi0gICAgICAgIDsvLyBMb2FkIGFyZ3VtZW50IGZyb20gdGhlIHN0YWNrCi0gICAgICAgIE1fTERSIHBEc3RNVlByZWQsIHBwRHN0TVZQcmVkCi0KLSAgICAgICAgTV9NRURJQU4zIENhbmRNVjFkeSwgQ2FuZE1WMmR5LCBDYW5kTVYzZHksIHRlbXAKLSAgICAKLSAgICAgICAgU1RSSCBDYW5kTVYzZHgsIFtwRHN0TVZQcmVkXSwgIzIKLSAgICAgICAgU1RSSCBDYW5kTVYzZHksIFtwRHN0TVZQcmVkXQotCi0gICAgICAgIE1PViByZXR1cm4sICNPTVhfU3RzX05vRXJyCi0gICAgCi0gICAgICAgIE1fRU5ECi0gICAgRU5ESUYgOy8vIEFSTTExMzZKUyA6TE9SOiBDb3J0ZXhBOAotICAgIAotICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9JRENUOHg4YmxrX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfSURDVDh4OGJsa19zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0ZjkxZmIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9JRENUOHg4YmxrX3MucworKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDJfSURDVDh4OGJsa19zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICA5NjQxCi07Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi07Ly8gRnVuY3Rpb246Ci07Ly8gICAgIG9teFZDTTRQMl9JRENUOHg4YmxrCi07Ly8KLSAgICAgICAgOy8vIEluY2x1ZGUgaGVhZGVycwotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0KLSAgICAgICAgOy8vIERlZmluZSBjcHUgdmFyaWFudHMKLSAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLQotICAgICAgICBJTkNMVURFIGFybUNPTU1fSURDVF9zLmggICAgICAgIAotICAgICAgICAKLSAgICAgICAgSU1QT1JUIGFybUNPTU1fSURDVFByZVNjYWxlCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gRnVuY3Rpb24gcHJvdG90eXBlCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gICAgIE9NWFJlc3VsdAotICAgICAgICA7Ly8gICAgIG9teFZDTTRQMl9JRENUOHg4YmxrKGNvbnN0IE9NWF9TMTYqIHBTcmMsCi0gICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TMTYqIHBEc3QpCi0gICAgICAgIDsvLyAgICAKLSAgICAgICAgCi0gICAgSUYgQVJNMTEzNkpTIDpMT1I6IENvcnRleEE4Ci0gICAgICAgIE1fQUxMT0M0ICBwcERlc3QsIDQKLSAgICAgICAgTV9BTExPQzQgIHBTdHJpZGUsIDQKLSAgICAgICAgTV9BTExPQzggIHBCbGssIDIqOCo4Ci0gICAgRU5ESUYKLSAgICAKLSAgICBJRiBBUk0xMTM2SlMKLSAgICAgICAgTV9TVEFSVCBvbXhWQ000UDJfSURDVDh4OGJsaywgcjExCi0gICAgRU5ESUYKLSAgICAKLSAgICAgICAgCi0gICAgSUYgQVJNMTEzNkpTIDpMT1I6IENvcnRleEE4Ci0gICAgICAgIAotOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCi1wU3JjICAgICAgICAgICAgUk4gMAotcERzdCAgICAgICAgICAgIFJOIDEKLQotOy8vIERlY2xhcmUgb3RoZXIgaW50ZXJtZWRpYXRlIHJlZ2lzdGVycwotUmVzdWx0ICAgICAgICAgIFJOIDAKLQotOy8vIFByb3RvdHlwZSBmb3IgbWFjcm8gTV9JRENUCi07Ly8gcFNyYyAgICAgICAgICAgIFJOIDAgIDsvLyBzb3VyY2UgZGF0YSBidWZmZXIKLTsvLyBTdHJpZGUgICAgICAgICAgUk4gMSAgOy8vIGRlc3RpbmF0aW9uIHN0cmlkZSBpbiBieXRlcwotOy8vIHBEZXN0ICAgICAgICAgICBSTiAyICA7Ly8gZGVzdGluYXRpb24gZGF0YSBidWZmZXIKLTsvLyBwU2NhbGUgICAgICAgICAgUk4gMyAgOy8vIHBvaW50ZXIgdG8gc2NhbGluZyB0YWJsZQotCi1wU3JjICAgIFJOIDAgICAgCi1TdHJpZGUgIFJOIDEgICAgCi1wRGVzdCAgIFJOIDIgICAgCi1wU2NhbGUgIFJOIDMgICAgCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIE1PViAgICAgICAgIHBEZXN0LCBwRHN0Ci0gICAgICAgIExEUiAgICAgICAgIHBTY2FsZSwgPWFybUNPTU1fSURDVFByZVNjYWxlICAgICAgICAKLSAgICAgICAgTV9JRENUICAgICAgczksIHMxNiwgMTYgICAgICAKLSAgICAgICAgTU9WICAgICAgICAgUmVzdWx0LCAjT01YX1N0c19Ob0VycgotICAgICAgICBNX0VORCAgICAgICAKLSAgICBFTkRJRiAgCi0gICAgICAgIDsvLyBBUk0xMTM2SlMgOkxPUjogQ29ydGV4QTgKLQotICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9NQ1JlY29uQmxvY2tfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9NQ1JlY29uQmxvY2tfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWM2ZmY5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUNSZWNvbkJsb2NrX3MucworKysgL2Rldi9udWxsCkBAIC0xLDcyNyArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAyX01DUmVjb25CbG9ja19zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICA5NjQxCi07Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotOy8vIERlc2NyaXB0aW9uOgotOy8vCi07Ly8KLQotOy8vIEluY2x1ZGUgc3RhbmRhcmQgaGVhZGVycwotICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgSU5DTFVERSBhcm1DT01NX3MuaAotCi07Ly8gSW1wb3J0IHN5bWJvbHMgcmVxdWlyZWQgZnJvbSBvdGhlciBmaWxlcwotCi0gICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLQotOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotOy8vIEFSTTExMzZKUyBpbXBsZW1lbnRhdGlvbgotOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgIElGICBBUk0xMTM2SlMKLSAgICAKLTsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLTsvLyBNQUNSTyBERUZJTklUSU9OUwotOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgIDsvLyBEZXNjcmlwdGlvbjoKLSAgICA7Ly8KLSAgICA7Ly8gICBkZXN0W2pdID0gKHhbal0gKyB5W2pdICsgcm91bmQpID4+IDEsICAgaj0wLi4zCi0gICAgOy8vCi0gICAgOy8vIFNpbWlsYXIgdG8gVUhBREQ4IGluc3RydWN0aW9uLCBidXQgd2l0aCBhIHJvdW5kaW5nIHZhbHVlIG9mIDEgYWRkZWQgdG8KLSAgICA7Ly8gZWFjaCBzdW0gYmVmb3JlIGRpdmlkaW5nIGJ5IHR3bywgaWYgcm91bmQgaXMgMQotICAgIDsvLwotICAgIDsvLyBTeW50YXg6Ci0gICAgOy8vIE1fVUhBREQ4UiAgICRkZXN0LCAkeCwgJHksICRyb3VuZCwgJG1hc2sKLSAgICA7Ly8KLSAgICA7Ly8gSW5wdXRzOgotICAgIDsvLyAkeCAgICAgICAgZm91ciBwYWNrZWQgYnl0ZXMsICAgeFszXSA6ICB4WzJdICA6ICB4WzFdICA6ICB4WzBdCi0gICAgOy8vICR5ICAgICAgICBmb3VyIHBhY2tlZCBieXRlcywgICB5WzNdIDogIHlbMl0gIDogIHlbMV0gIDogIHlbMF0KLSAgICA7Ly8gJHJvdW5kICAgIDAgaWYgbm8gcm91bmRpbmcgdG8gYmUgYWRkZWQsIDEgaWYgcm91bmRpbmcgdG8gYmUgZG9uZQotICAgIDsvLyAkbWFzayAgICAgc29tZSByZWdpc3RlciBzZXQgdG8gMHg4MDgwODA4MAotICAgIDsvLwotICAgIDsvLyBPdXRwdXRzOgotICAgIDsvLyAkZGVzdCAgICAgZm91ciBwYWNrZWQgYnl0ZXMsICAgelszXSA6ICB6WzJdICA6ICB6WzFdICA6ICB6WzBdCi0KLSAgICBNQUNSTwotICAgIE1fVUhBREQ4UiAgICRkZXN0LCAkeCwgJHksICRyb3VuZCwgJG1hc2sKLSAgICBJRiAkcm91bmQgPSAxCi0gICAgICAgIElGICAkZGVzdCAvPSAkeQotICAgICAgICAgICAgTVZOICAgICAgICAgJGRlc3QsICR4Ci0gICAgICAgICAgICBVSFNVQjggICAgICAkZGVzdCwgJHksICRkZXN0Ci0gICAgICAgICAgICBFT1IgICAgICAgICAkZGVzdCwgJGRlc3QsICRtYXNrCi0gICAgICAgIEVMU0UKLSAgICAgICAgICAgIE1WTiAgICAgICAgICRkZXN0LCAkeQotICAgICAgICAgICAgVUhTVUI4ICAgICAgJGRlc3QsICR4LCAkZGVzdAotICAgICAgICAgICAgRU9SICAgICAgICAgJGRlc3QsICRkZXN0LCAkbWFzawotICAgICAgICBFTkRJRgotICAgIEVMU0UKLSAgICAgICAgVUhBREQ4ICAgICAgJGRlc3QsICR4LCAkeQotICAgIEVORElGCi0gICAgTUVORAotOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgIDsvLyBEZXNjcmlwdGlvbjoKLSAgICA7Ly8gTG9hZCA4IGJ5dGVzIGZyb20gJHBTcmMgKGFsaWduZWQgb3IgdW5hbGlnbmVkIGxvY2F0aW9ucykKLSAgICA7Ly8KLSAgICA7Ly8gU3ludGF4OgotICAgIDsvLyBNX0xPQURfWCAgICAkcFNyYywgJHNyY1N0ZXAsICRvdXQwLCAkb3V0MSwgJHNjcmF0Y2gsICRvZmZzZXQKLSAgICA7Ly8gCi0gICAgOy8vIElucHV0czoKLSAgICA7Ly8gJHBTcmMgICAgICAgNCBieXRlIGFsaWduZWQgc291cmNlIHBvaW50ZXIgdG8gYW4gYWRkcmVzcyBqdXN0IGxlc3MgdGhhbiAKLSAgICA7Ly8gICAgICAgICAgICAgb3IgZXF1YWwgdG8gdGhlIGRhdGEgbG9jYXRpb24KLSAgICA7Ly8gJHNyY1N0ZXAgICAgVGhlIHN0cmlkZSBvbiBzb3VyY2UKLSAgICA7Ly8gJHNjcmF0Y2ggICAgQSBzY3JhdGNoIHJlZ2lzdGVyLCB1c2VkIGludGVybmFsbHkgZm9yIHRlbXAgY2FsY3VsYXRpb25zCi0gICAgOy8vICRvZmZzZXQgICAgIERpZmZlcmVuY2Ugb2Ygc291cmNlIGRhdGEgbG9jYXRpb24gdG8gdGhlIHNvdXJjZSBwb2ludGVyCi0gICAgOy8vICAgICAgICAgICAgIFVzZSB3aGVuICRvZmZzZXQgIT0gMCAodW5hbGlnbmVkIGxvYWQpCi0gICAgOy8vCi0gICAgOy8vIE91dHB1dHM6Ci0gICAgOy8vICRwU3JjICAgICAgIEluIGNhc2UgdGhlIG1hY3JvIGFjY2VwdHMgc3RyaWRlLCBpdCBpbmNyZW1lbnRzIHRoZSBwU3JjIGJ5IAotICAgIDsvLyAgICAgICAgICAgICB0aGF0IHZhbHVlLCBlbHNlIHVuY2hhbmdlZAotICAgIDsvLyAkb3V0MCAgICAgICBmb3VyIHBhY2tlZCBieXRlcywgICB6WzNdIDogIHpbMl0gIDogIHpbMV0gIDogIHpbMF0KLSAgICA7Ly8gJG91dDEgICAgICAgZm91ciBwYWNrZWQgYnl0ZXMsICAgels3XSA6ICB6WzZdICA6ICB6WzVdICA6ICB6WzRdCi0gICAgOy8vCi0gICAgOy8vIE5vdGU6IHskb3V0MCwgJG91dDEsICRzY3JhdGNofSBzaG91bGQgYmUgcmVnaXN0ZXJzIHdpdGggYXNjZW5kaW5nCi0gICAgOy8vIHJlZ2lzdGVyIG51bWJlcmluZy4gSW4gY2FzZSBvZmZzZXQgaXMgMCwgJHNjcmF0Y2ggaXMgbm90IG1vZGlmaWVkLgotCi0gICAgTUFDUk8KLSAgICBNX0xPQURfWCAgICAkcFNyYywgJHNyY1N0ZXAsICRvdXQwLCAkb3V0MSwgJHNjcmF0Y2gsICRvZmZzZXQKLSAgICAgICAgSUYgJG9mZnNldCA9IDAKLSAgICAgICAgICAgIExETSAgICAgICAgICRwU3JjLCB7JG91dDAsICRvdXQxfQotICAgICAgICAgICAgQUREICAgICAgICAgJHBTcmMsICRwU3JjLCAkc3JjU3RlcAotICAgICAgICBFTFNFCi0gICAgICAgICAgICBMRE0gICAgICAgICAkcFNyYywgeyRvdXQwLCAkb3V0MSwgJHNjcmF0Y2h9IAotICAgICAgICAgICAgQUREICAgICAgICAgJHBTcmMsICRwU3JjLCAkc3JjU3RlcAotICAgICAgICAgICAgCi0gICAgICAgICAgICBNT1YgICAgICAgICAkb3V0MCwgJG91dDAsIExTUiAjOCAqICRvZmZzZXQKLSAgICAgICAgICAgIE9SUiAgICAgICAgICRvdXQwLCAkb3V0MCwgJG91dDEsIExTTCAjKDMyIC0gOCAqICgkb2Zmc2V0KSkKLSAgICAgICAgICAgIE1PViAgICAgICAgICRvdXQxLCAkb3V0MSwgTFNSICM4ICogJG9mZnNldAotICAgICAgICAgICAgT1JSICAgICAgICAgJG91dDEsICRvdXQxLCAkc2NyYXRjaCwgTFNMICMoMzIgLSA4ICogKCRvZmZzZXQpKQotICAgICAgICBFTkRJRgotICAgIE1FTkQKLQotOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgIDsvLyBEZXNjcmlwdGlvbjoKLSAgICA7Ly8gTG9hZHMgdGhyZWUgd29yZHMgZm9yIFggaW50ZXJwb2xhdGlvbiwgdXBkYXRlIHBvaW50ZXIgdG8gbmV4dCByb3cuIEZvciAKLSAgICA7Ly8gWCBpbnRlcnBvbGF0aW9uLCBnaXZlbiBhIHRydW5jYXRlZC00Ynl0ZUFsaWduZWQgc291cmNlIHBvaW50ZXIsIAotICAgIDsvLyBpbnZhcmlhYmx5IHRocmVlIGNvbnRpbm91cyB3b3JkcyBhcmUgcmVxdWlyZWQgZnJvbSB0aGVyZSB0byBnZXQgdGhlCi0gICAgOy8vIG5pbmUgYnl0ZXMgZnJvbSB0aGUgc291cmNlIHBvaW50ZXIgZm9yIGZpbHRlcmluZy4gCi0gICAgOy8vCi0gICAgOy8vIFN5bnRheDoKLSAgICA7Ly8gTV9MT0FEX1hJTlQgJHBTcmMsICRzcmNTdGVwLCAkb2Zmc2V0LCAkd29yZDAsICR3b3JkMSwgJHdvcmQyLCAkd29yZDMKLSAgICA7Ly8gCi0gICAgOy8vIElucHV0czoKLSAgICA7Ly8gJHBTcmMgICAgICAgNCBieXRlIGFsaWduZWQgc291cmNlIHBvaW50ZXIgdG8gYW4gYWRkcmVzcyBqdXN0IGxlc3MgdGhhbiAKLSAgICA7Ly8gICAgICAgICAgICAgb3IgZXF1YWwgdG8gdGhlIGRhdGEgbG9jYXRpb24KLSAgICA7Ly8KLSAgICA7Ly8gJHNyY1N0ZXAgICAgVGhlIHN0cmlkZSBvbiBzb3VyY2UKLSAgICA7Ly8KLSAgICA7Ly8gJG9mZnNldCAgICAgRGlmZmVyZW5jZSBvZiBzb3VyY2UgZGF0YSBsb2NhdGlvbiB0byB0aGUgc291cmNlIHBvaW50ZXIKLSAgICA7Ly8gICAgICAgICAgICAgVXNlIHdoZW4gJG9mZnNldCAhPSAwICh1bmFsaWduZWQgbG9hZCkKLSAgICA7Ly8KLSAgICA7Ly8gT3V0cHV0czoKLSAgICA7Ly8gJHBTcmMgICAgICAgSW5jcmVtZW50ZWQgYnkgJHNyY1N0ZXAKLSAgICA7Ly8KLSAgICA7Ly8gJHdvcmQwLCAkd29yZDEsICR3b3JkMiwgJHdvcmQzCi0gICAgOy8vICAgICAgICAgICAgIFRocmVlIG9mIHRoZXNlIGFyZSBvdXRwdXRzIGJhc2VkIG9uIHRoZSAkb2Zmc2V0IHBhcmFtZXRlci4gCi0gICAgOy8vICAgICAgICAgICAgIFRoZSBvdXRwdXRzIGFyZSBzcGVjaWZpY2FsbHkgZ2VuZXJhdGVkIHRvIGJlIHByb2Nlc3NlZCBieSAKLSAgICA7Ly8gICAgICAgICAgICAgdGhlIE1fRVhUX1hJTlQgbWFjcm8uIEZvbGxvd2luZyBpcyB0aGUgaWxsdXN0cmF0aW9uIHRvIHNob3cgCi0gICAgOy8vICAgICAgICAgICAgIGhvdyB0aGUgbmluZSBieXRlcyBhcmUgc3Bhbm5lZCBmb3IgZGlmZmVyZW50IG9mZnNldHMgZnJvbSAKLSAgICA7Ly8gICAgICAgICAgICAgbm90VHJ1bmNhdGVkRm9yQWxpZ25tZW50U291cmNlUG9pbnRlci4KLSAgICA7Ly8KLSAgICA7Ly8gICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsvLyAgICAgICAgICAgICB8IE9mZnNldCB8IEFsaWduZWQgUHRyIHwgd29yZDAgfCB3b3JkMSB8IHdvcmQyIHwgd29yZDMgfAotICAgIDsvLyAgICAgICAgICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAotICAgIDsvLyAgICAgICAgICAgICB8ICAgIDAgICB8ICAgICAgIDAgICAgIHwgMDEyMyAgfCA0NTY3ICB8IDh4eHggIHwgICAgICAgfAotICAgIDsvLyAgICAgICAgICAgICB8ICAgIDEgICB8ICAgICAgLTEgICAgIHwgeDAxMiAgfCAzNDU2ICB8IDc4eHggIHwgICAgICAgfAotICAgIDsvLyAgICAgICAgICAgICB8ICAgIDIgICB8ICAgICAgLTIgICAgIHwgeHgwMSAgfCAyMzQ1ICB8IDY3OHggIHwgICAgICAgfAotICAgIDsvLyAgICAgICAgICAgICB8ICAgIDMgICB8ICAgICAgLTMgICAgIHwgeHh4MCAgfCAgICAgICB8IDEyMzQgIHwgNTY3OCAgfAotICAgIDsvLyAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOy8vIAotICAgIDsvLyAgICAgICAgICAgICB3aGVyZSB0aGUgbnVtYmVyaW5nICgwLTgpIGlzIHRvIGRlc2lnbmF0ZSB0aGUgOSBieXRlcyBmcm9tCi0gICAgOy8vICAgICAgICAgICAgIHN0YXJ0IG9mIGEgcGFydGljdWxhciByb3cuIFRoZSBpbGx1c3RyYXRpb24gZG9lc24ndCB0YWtlIGluIAotICAgIDsvLyAgICAgICAgICAgICBhY2NvdW50IHRoZSBwb3NpdGlvbmluZyBvZiBieXRlcyB3aXRoIGluIHRoZSB3b3JkIGFuZCB0aGUgCi0gICAgOy8vICAgICAgICAgICAgIG1hY3JvIGNvbWJpbmF0aW9uIHdpdGggTV9FWFRfWElOVCB3aWxsIHdvcmsgb25seSBpbiBsaXR0bGUgCi0gICAgOy8vICAgICAgICAgICAgIGVuZGlhbiBlbnZpcm9ucwotICAgIDsvLyAKLSAgICA7Ly8gTm90ZTogeyR3b3JkMCwgJHdvcmQxLCAkd29yZDIsICR3b3JkM30gc2hvdWxkIGJlIHJlZ2lzdGVycyB3aXRoIGFzY2VuZGluZwotICAgIDsvLyByZWdpc3RlciBudW1iZXJpbmcKLQotICAgIE1BQ1JPCi0gICAgTV9MT0FEX1hJTlQgJHBTcmMsICRzcmNTdGVwLCAkb2Zmc2V0LCAkd29yZDAsICR3b3JkMSwgJHdvcmQyLCAkd29yZDMKLSAgICAgICAgSUYgJG9mZnNldCAvPSAzCi0gICAgICAgICAgICBMRE0gICAgICAgICAkcFNyYywgeyR3b3JkMCwgJHdvcmQxLCAkd29yZDJ9Ci0gICAgICAgIEVMU0UKLSAgICAgICAgICAgIExETSAgICAgICAgICRwU3JjLCB7JHdvcmQwLCAkd29yZDIsICR3b3JkM30KLSAgICAgICAgRU5ESUYKLSAgICAgICAgQUREICAgICAgICAgJHBTcmMsICRwU3JjLCAkc3JjU3RlcAotICAgIE1FTkQKLQotOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgIDsvLyBEZXNjcmlwdGlvbjoKLSAgICA7Ly8gRXh0cmFjdCBmb3VyIHJlZ2lzdGVycyBvZiBmb3VyIHBpeGVscyBmb3IgWCBpbnRlcnBvbGF0aW9uIAotICAgIDsvLyAKLSAgICA7Ly8gU3ludGF4OgotICAgIDsvLyBNX0VYVF9YSU5UICRvZmZzZXQsICR3b3JkMCwgJHdvcmQxLCAkd29yZDIsICR3b3JkMwotICAgIDsvLyAKLSAgICA7Ly8gSW5wdXRzOgotICAgIDsvLyAkb2Zmc2V0ICAgICBEaWZmZXJlbmNlIG9mIHNvdXJjZSBkYXRhIGxvY2F0aW9uIHRvIHRoZSBzb3VyY2UgcG9pbnRlcgotICAgIDsvLyAgICAgICAgICAgICBVc2Ugd2hlbiAkb2Zmc2V0ICE9IDAgKHVuYWxpZ25lZCBsb2FkKQotICAgIDsvLyAKLSAgICA7Ly8gJHdvcmQwLCAkd29yZDEsICR3b3JkMiwgJHdvcmQzCi0gICAgOy8vICAgICAgICAgICAgIFRocmVlIG9mIHRoZXNlIGFyZSBpbnB1dHMgYmFzZWQgb24gdGhlICRvZmZzZXQgcGFyYW1ldGVyLiAKLSAgICA7Ly8gICAgICAgICAgICAgVGhlIGlucHV0cyBhcmUgc3BlY2lmaWNhbGx5IHNlbGVjdGVkIHRvIGJlIHByb2Nlc3NlZCBieSAKLSAgICA7Ly8gICAgICAgICAgICAgdGhlIE1fRVhUX1hJTlQgbWFjcm8uCi0gICAgOy8vCi0gICAgOy8vICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA7Ly8gICAgICAgICAgICAgfCBPZmZzZXQgfCBBbGlnbmVkIFB0ciB8IHdvcmQwIHwgd29yZDEgfCB3b3JkMiB8IHdvcmQzIHwKLSAgICA7Ly8gICAgICAgICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKLSAgICA7Ly8gICAgICAgICAgICAgfCAgICAwICAgfCAgICAgICAwICAgICB8IDAxMjMgIHwgNDU2NyAgfCA4eHh4ICB8IHl5eXkgIHwKLSAgICA7Ly8gICAgICAgICAgICAgfCAgICAxICAgfCAgICAgIC0xICAgICB8IHgwMTIgIHwgMzQ1NiAgfCA3OHh4ICB8IHl5eXkgIHwKLSAgICA7Ly8gICAgICAgICAgICAgfCAgICAyICAgfCAgICAgIC0yICAgICB8IHh4MDEgIHwgMjM0NSAgfCA2Nzh4ICB8IHl5eXkgIHwKLSAgICA7Ly8gICAgICAgICAgICAgfCAgICAzICAgfCAgICAgIC0zICAgICB8IHh4eDAgIHwgeXl5eSAgfCAxMjM0ICB8IDU2NzggIHwKLSAgICA7Ly8gICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsvLyAKLSAgICA7Ly8gT3V0cHV0czoKLSAgICA7Ly8gJHdvcmQwLCAkd29yZDEsICR3b3JkMiwgJHdvcmQzCi0gICAgOy8vICAgICAgICAgICAgIEJ5dGVzIGZyb20gdGhlIG9yaWdpbmFsIHNvdXJjZSBwb2ludGVyIChub3QgdHJ1bmNhdGVkIGZvcgotICAgIDsvLyAgICAgICAgICAgICA0IGJ5dGUgYWxpZ25tZW50KSBhcyBzaG93biBpbiB0aGUgdGFibGUuIAotICAgIDsvLyAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsvLyAgICAgICAgICAgICB8IHdvcmQwIHwgd29yZDEgfCB3b3JkMiB8IHdvcmQzIHwKLSAgICA7Ly8gICAgICAgICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Ci0gICAgOy8vICAgICAgICAgICAgIHwgMDEyMyAgfCA0NTY3ICB8IDEyMzQgIHwgNTY3OCAgfAotICAgIDsvLyAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsvLwotICAgIDsvLyBOb3RlOiB7JHdvcmQwLCAkd29yZDEsICR3b3JkMiwgJHdvcmQzfSBzaG91bGQgYmUgcmVnaXN0ZXJzIHdpdGggYXNjZW5kaW5nCi0gICAgOy8vIHJlZ2lzdGVyIG51bWJlcmluZwotCi0gICAgTUFDUk8KLSAgICBNX0VYVF9YSU5UICRvZmZzZXQsICR3b3JkMCwgJHdvcmQxLCAkd29yZDIsICR3b3JkMwotICAgICAgICBJRiAkb2Zmc2V0ID0gMAotICAgICAgICAgICAgOyAkd29yZDAgYW5kICR3b3JkMSBhcmUgb2sKLSAgICAgICAgICAgIDsgJHdvcmQyLCAkd29yZDMgYXJlIGp1c3QgOCBzaGlmdGVkIHZlcnNpb25zCi0gICAgICAgICAgICBNT1YgICAgICAgICAkd29yZDMsICR3b3JkMSwgTFNSICM4Ci0gICAgICAgICAgICBPUlIgICAgICAgICAkd29yZDMsICR3b3JkMywgJHdvcmQyLCBMU0wgIzI0Ci0gICAgICAgICAgICBNT1YgICAgICAgICAkd29yZDIsICR3b3JkMCwgTFNSICM4Ci0gICAgICAgICAgICBPUlIgICAgICAgICAkd29yZDIsICR3b3JkMiwgJHdvcmQxLCBMU0wgIzI0Ci0gICAgICAgIEVMSUYgJG9mZnNldCA9IDMKLSAgICAgICAgICAgIDsgJHdvcmQyIGFuZCAkd29yZDMgYXJlIG9rICh0YWtlbiBjYXJlIHdoaWxlIGxvYWRpbmcgaXRzZWxmKQotICAgICAgICAgICAgOyBzZXQgJHdvcmQwICYgJHdvcmQxCi0gICAgICAgICAgICBNT1YgICAgICAgICAkd29yZDAsICR3b3JkMCwgTFNSICMyNAotICAgICAgICAgICAgT1JSICAgICAgICAgJHdvcmQwLCAkd29yZDAsICR3b3JkMiwgTFNMICM4Ci0gICAgICAgICAgICBNT1YgICAgICAgICAkd29yZDEsICR3b3JkMiwgTFNSICMyNAotICAgICAgICAgICAgT1JSICAgICAgICAgJHdvcmQxLCAkd29yZDEsICR3b3JkMywgTFNMICM4Ci0gICAgICAgIEVMU0UKLSAgICAgICAgICAgIE1PViAgICAgICAgICR3b3JkMCwgJHdvcmQwLCBMU1IgIzggKiAkb2Zmc2V0Ci0gICAgICAgICAgICBPUlIgICAgICAgICAkd29yZDAsICR3b3JkMCwgJHdvcmQxLCBMU0wgIygzMiAtIDggKiAoJG9mZnNldCkpCi0gICAgICAgICAgICBNT1YgICAgICAgICAkd29yZDEsICR3b3JkMSwgTFNSICM4ICogJG9mZnNldAotICAgICAgICAgICAgT1JSICAgICAgICAgJHdvcmQxLCAkd29yZDEsICR3b3JkMiwgTFNMICMoMzIgLSA4ICogKCRvZmZzZXQpKQotCi0gICAgICAgICAgICBNT1YgICAgICAgICAkd29yZDMsICR3b3JkMSwgTFNSICM4Ci0gICAgICAgICAgICBPUlIgICAgICAgICAkd29yZDMsICR3b3JkMywgJHdvcmQyLCBMU0wgIygzMiAtIDggKiAoKCRvZmZzZXQpKzEpKQotICAgICAgICAgICAgTU9WICAgICAgICAgJHdvcmQyLCAkd29yZDAsIExTUiAjOAotICAgICAgICAgICAgT1JSICAgICAgICAgJHdvcmQyLCAkd29yZDIsICR3b3JkMSwgTFNMICMyNAotICAgICAgICBFTkRJRgotICAgIE1FTkQKLQotOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgIDsvLyBEZXNjcmlwdGlvbjoKLSAgICA7Ly8gQ29tcHV0ZXMgaGFsZi1zdW0gYW5kIHhvciBvZiB0d28gaW5wdXRzIGFuZCBwdXRzIHRoZW0gaW4gdGhlIGlucHV0IAotICAgIDsvLyByZWdpc3RlcnMgaW4gdGhhdCBvcmRlcgotICAgIDsvLwotICAgIDsvLyBTeW50YXg6Ci0gICAgOy8vIE1fSFNVTV9YT1IgICAgICAkdjAsICR2MSwgJHRtcAotICAgIDsvLyAKLSAgICA7Ly8gSW5wdXRzOgotICAgIDsvLyAkdjAgICAgICAgICBhLCBmaXJzdCBpbnB1dAotICAgIDsvLyAkdjEgICAgICAgICBiLCBzZWNvbmQgaW5wdXQKLSAgICA7Ly8gJHRtcCAgICAgICAgc2NyYXRjaCByZWdpc3RlcgotICAgIDsvLyAKLSAgICA7Ly8gT3V0cHV0czoKLSAgICA7Ly8gJHYwICAgICAgICAgKGEgKyBiKS8yCi0gICAgOy8vICR2MSAgICAgICAgIGEgXiBiCi0KLSAgICBNQUNSTwotICAgIE1fSFNVTV9YT1IgICAgICAkdjAsICR2MSwgJHRtcAotICAgICAgICBVSEFERDggICAgICAkdG1wLCAkdjAsICR2MSAgICAgOy8vIHMwID0gYSArIGIKLSAgICAgICAgRU9SICAgICAgICAgJHYxLCAkdjAsICR2MSAgICAgIDsvLyBsMCA9IGEgXiBiCi0gICAgICAgIE1PViAgICAgICAgICR2MCwgJHRtcCAgICAgICAgICA7Ly8gczAKLSAgICBNRU5ECi07Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgOy8vIERlc2NyaXB0aW9uOgotICAgIDsvLyBDYWxjdWxhdGVzIGF2ZXJhZ2Ugb2YgNCB2YWx1ZXMgKGEsYixjLGQpIGZvciBIYWxmUGl4ZWxYWSBwcmVkaWN0IHR5cGUgaW4gCi0gICAgOy8vIG1jUmVjb25CbG9jayBtb2R1bGUuIFZlcnkgc3BlY2lmaWMgdG8gdGhlIGltcGxlbWVudGF0aW9uIG9mIAotICAgIDsvLyBNX01DUkVDT05CTE9DS19IYWxmUGl4ZWxYWSBkb25lIGhlcmUuIFVzZXMgInRtcCIgYXMgc2NyYXRjaCByZWdpc3RlciBhbmQgCi0gICAgOy8vICJ5TWFzayIgZm9yIG1hc2sgdmFyaWFibGUgIjB4MTAxMDEwMXgiIHNldCBpbiBpdC4gSW4geU1hc2sgNCBsc2JzIGFyZSAKLSAgICA7Ly8gbm90IHNpZ25pZmljYW50IGFuZCBhcmUgdXNlZCBieSB0aGUgY2FsbGVlIGZvciByb3cgY291bnRlciAoeSkKLSAgICA7Ly8KLSAgICA7Ly8gU29tZSBwb2ludHMgdG8gbm90ZSBhcmU6Ci0gICAgOy8vIDEuIElucHV0IGlzIHBhaXIgb2YgcGFpci1hdmVyYWdlcyBhbmQgWG9ycwotICAgIDsvLyAyLiAkc3VtMSBhbmQgJGxzYjEgYXJlIG5vdCBtb2RpZmllZCBhbmQgaGVuY2UgY2FuIGJlIHJldXNlZCBpbiBhbm90aGVyIAotICAgIDsvLyAgICBydW5uaW5nIGF2ZXJhZ2UKLSAgICA7Ly8gMy4gT3V0cHV0IGlzIGluIHRoZSBmaXJzdCBhcmd1bWVudAotICAgIDsvLwotICAgIDsvLyBTeW50YXg6Ci0gICAgOy8vIE1fQVZHNCAgICAgICAgICRzdW0wLCAkbHNiMCwgJHN1bTEsICRsc2IxLCAkcm5kVmFsCi0gICAgOy8vIAotICAgIDsvLyBJbnB1dHM6Ci0gICAgOy8vICRzdW0wICAgICAgIChhICsgYikgPj4gMSwgd2hlcmUgYSBhbmQgYiBhcmUgMXN0IGFuZCAybmQgaW5wdXRzIHRvIGJlIGF2ZXJhZ2VkCi0gICAgOy8vICRsc2IwICAgICAgIChhIF4gYikKLSAgICA7Ly8gJHN1bTEgICAgICAgKGMgKyBkKSA+PiAxLiBOb3QgbW9kaWZpZWQKLSAgICA7Ly8gJGxzYjEgICAgICAgKGMgXiBkKSAgICAgICBOb3QgbW9kaWZpZWQKLSAgICA7Ly8gJHJuZFZhbCAgICAgQXNzZW1ibGVyIFZhcmlhYmxlLiAwIGZvciByb3VuZGluZywgMSBmb3Igbm8gcm91bmRpbmcKLSAgICA7Ly8gCi0gICAgOy8vIE91dHB1dHM6Ci0gICAgOy8vICRzdW0wICAgICAgIChhICsgYiArIGMgKyBkICsgMSkgLyA0IDogSWYgbm8gcm91bmRpbmcKLSAgICA7Ly8gICAgICAgICAgICAgKGEgKyBiICsgYyArIGQgKyAyKSAvIDQgOiBJZiByb3VuZGluZwotCi0gICAgTUFDUk8KLSAgICBNX0FWRzQgICAgICAgICAgJHN1bTAsICRsc2IwLCAkc3VtMSwgJGxzYjEsICRybmRWYWwKLSAgICAgICAgTENMUyBPUDEKLSAgICAgICAgTENMUyBPUDIKLSAgICAgICAgSUYgJHJuZFZhbCA9IDAgOy8vIHJvdW5kaW5nIGNhc2UKLU9QMSBTRVRTICJBTkQiCi1PUDIgU0VUUyAiT1JSIgotICAgICAgICBFTFNFICAgICAgICAgICA7Ly8gTm90IHJvdW5kaW5nIGNhc2UKLU9QMSBTRVRTICJPUlIiCi1PUDIgU0VUUyAiQU5EIgotICAgICAgICBFTkRJRgotICAgICAgICAKLSAgICAgICAgTENMUyBsc2IyCi0gICAgICAgIExDTFMgc3VtMgotICAgICAgICBMQ0xTIGRlc3QKLSAgICAKLWxzYjIgIFNFVFMgInRtcCIKLXN1bTIgIFNFVFMgIiRsc2IwIgotZGVzdCAgU0VUUyAiJHN1bTAiCi0KLSAgICAgICAgJE9QMSAgICAgICAgJGxzYjAsICRsc2IwLCAkbHNiMSAgICAgICAgICA7Ly8gZTAgPSBlMCAmIGUxCi0gICAgICAgIEVPUiAgICAgICAgICRsc2IyLCAkc3VtMCwgJHN1bTEgICAgICAgICAgOy8vIGUyID0gczAgXiBzMQotICAgICAgICAkT1AyICAgICAgICAkbHNiMiwgJGxzYjIsICRsc2IwICAgICAgICAgIDsvLyBlMiA9IGUyIHwgZTAKLSAgICAgICAgQU5EICAgICAgICAgJGxzYjIsICRsc2IyLCB5TWFzaywgTFNSICMgNCA7Ly8gZTIgPSBlMiAmIG1hc2sKLSAgICAgICAgVUhBREQ4ICAgICAgJHN1bTIsICRzdW0wLCAkc3VtMSAgICAgICAgICA7Ly8gczIgPSAoczAgKyBzMSkvMgotICAgICAgICBVQUREOCAgICAgICAkZGVzdCwgJHN1bTIsICRsc2IyICAgICAgICAgIDsvLyBkZXN0ID0gIHMyICsgZTIKLSAgICBNRU5ECi07Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi07Ly8gTW90aW9uIGNvbXBlbnNhdGlvbiBoYW5kbGVyIG1hY3JvcwotOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgIDsvLyBEZXNjcmlwdGlvbjoKLSAgICA7Ly8gSW1wbGVtZW50IG1vdGlvbiBjb21wZW5zYXRpb24gcm91dGluZXMgdXNpbmcgdGhlIG5hbWVkIHJlZ2lzdGVycyBpbiAKLSAgICA7Ly8gY2FsbGVlIGZ1bmN0aW9uLiBFYWNoIG9mIHRoZSBmb2xsb3dpbmcgNCBpbXBsZW1lbnQgdGhlIDQgcHJlZGljdCB0eXBlCi0gICAgOy8vIEVhY2ggaGFuZGxlcyA4IGNhc2VzIGVhY2ggaWUgYWxsIHRoZSBjb21iaW5hdGlvbnMgb2YgNCB0eXBlcyBvZiBzb3VyY2UgCi0gICAgOy8vIGFsaWdubWVudCBvZmZzZXRzIGFuZCAyIHR5cGVzIG9mIHJvdW5kaW5nIGZsYWcKLSAgICA7Ly8KLSAgICA7Ly8gU3ludGF4OgotICAgIDsvLyBNX01DUkVDT05CTE9DS19JbnRlZ2VyUGl4ZWwgJHJuZFZhbCwgJG9mZnNldAotICAgIDsvLyBNX01DUkVDT05CTE9DS19IYWxmUGl4ZWxYICAgJHJuZFZhbCwgJG9mZnNldAotICAgIDsvLyBNX01DUkVDT05CTE9DS19IYWxmUGl4ZWxZICAgJHJuZFZhbCwgJG9mZnNldAotICAgIDsvLyBNX01DUkVDT05CTE9DS19IYWxmUGl4ZWxYWSAgJHJuZFZhbCwgJG9mZnNldAotICAgIDsvLyAKLSAgICA7Ly8gSW5wdXRzOgotICAgIDsvLyAkcm5kVmFsICAgICBBc3NlbWJsZXIgVmFyaWFibGUuIDAgZm9yIHJvdW5kaW5nLCAxIGZvciBubyByb3VuZGluZwotICAgIDsvLyAkb2Zmc2V0ICAgICAkcFNyYyBNT0QgNCB2YWx1ZS4gT2Zmc2V0IGZyb20gNCBieXRlIGFsaWduZWQgbG9jYXRpb24uCi0gICAgOy8vIAotICAgIDsvLyBPdXRwdXRzOgotICAgIDsvLyBPdXRwdXRzIGNvbWUgaW4gdGhlIG5hbWVkIHJlZ2lzdGVycyBvZiB0aGUgY2FsbGVlIGZ1bmN0aW9ucwotICAgIDsvLyBUaGUgbWFjcm8gbG9hZHMgdGhlIGRhdGEgZnJvbSB0aGUgc291cmNlIHBvaW50ZXIsIHByb2Nlc3NlcyBpdCBhbmQgCi0gICAgOy8vIHN0b3JlcyBpbiB0aGUgZGVzdGluYXRpb24gcG9pbnRlci4gRG9lcyB0aGUgd2hvbGUgcHJlZGljdGlvbiBjeWNsZQotICAgIDsvLyBvZiBNb3Rpb24gQ29tcGVuc2F0aW9uIHJvdXRpbmUgZm9yIGEgcGFydGljdWxhciBwcmVkaWN0VHlwZQotICAgIDsvLyBBZnRlciB0aGlzIG9ubHkgcmVzaWR1ZSBhZGRpdGlvbiB0byB0aGUgcHJlZGljdGVkIHZhbHVlcyByZW1haW4KLQotICAgIE1BQ1JPCi0gICAgTV9NQ1JFQ09OQkxPQ0tfSW50ZWdlclBpeGVsICRybmRWYWwsICRvZmZzZXQKLSAgICA7Ly8gQWxnb3JpdGhtaWMgRGVzY3JpcHRpb246Ci0gICAgOy8vIFRoaXMgaGFuZGxlcyBtb3Rpb24gY29tcGVuc2F0aW9uIGZvciBJbnRlZ2VyUGl4ZWwgcHJlZGljdFR5cGUuIEJvdGgKLSAgICA7Ly8gcm91bmRpbmcgY2FzZXMgYXJlIGhhbmRsZWQgYnkgdGhlIHNhbWUgY29kZSBiYXNlLiBJdCBpcyBqdXN0IGEgY29weQotICAgIDsvLyBmcm9tIHNvdXJjZSB0byBkZXN0aW5hdGlvbi4gVHdvIGxpbmVzIGFyZSBkb25lIHBlciBsb29wIHRvIHJlZHVjZSAKLSAgICA7Ly8gc3RhbGxzLiBMb29wIGhhcyBiZWVuIHNvZnR3YXJlIHBpcGVsaW5lZCBhcyB3ZWxsIGZvciB0aGF0IHB1cnBvc2UuCi0gICAgOy8vIAotICAgIDsvLyBNX0xPQURfWCBsb2FkcyBhIHdob2xlIHJvdyBpbiB0d28gcmVnaXN0ZXJzIGFuZCB0aGVuIHRoZXkgYXJlIHN0b3JlZAotICAgIAotQ2FzZUludGVnZXJQaXhlbFJuZDBPZmZzZXQkb2Zmc2V0Ci1DYXNlSW50ZWdlclBpeGVsUm5kMU9mZnNldCRvZmZzZXQKLSAgICBNX0xPQURfWCAgICBwU3JjLCBzcmNTdGVwLCB0bXAxLCB0bXAyLCB0bXAzLCAkb2Zmc2V0Ci0gICAgTV9MT0FEX1ggICAgcFNyYywgc3JjU3RlcCwgdG1wMywgdG1wNCwgdG1wNSwgJG9mZnNldAotWWxvb3BJbnRlZ2VyUGl4ZWxPZmZzZXQkb2Zmc2V0Ci0gICAgU1VCUyAgICAgICAgeSwgeSwgIzIKLSAgICBTVFJEICAgICAgICB0bXAxLCB0bXAyLCBbcERzdF0sIGRzdFN0ZXAKLSAgICBTVFJEICAgICAgICB0bXAzLCB0bXA0LCBbcERzdF0sIGRzdFN0ZXAKLSAgICBNX0xPQURfWCAgICBwU3JjLCBzcmNTdGVwLCB0bXAxLCB0bXAyLCB0bXAzLCAkb2Zmc2V0Ci0gICAgTV9MT0FEX1ggICAgcFNyYywgc3JjU3RlcCwgdG1wMywgdG1wNCwgdG1wNSwgJG9mZnNldAotICAgIEJHVCAgICAgICAgIFlsb29wSW50ZWdlclBpeGVsT2Zmc2V0JG9mZnNldAotCi0gICAgQiAgICAgICAgICAgU3dpdGNoUHJlZGljdFR5cGVFbmQKLSAgICBNRU5ECi07Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgTUFDUk8KLSAgICBNX01DUkVDT05CTE9DS19IYWxmUGl4ZWxYICRybmRWYWwsICRvZmZzZXQKLSAgICA7Ly8gQWxnb3JpdGhtaWMgRGVzY3JpcHRpb246Ci0gICAgOy8vIFRoaXMgaGFuZGxlcyBtb3Rpb24gY29tcGVuc2F0aW9uIGZvciBIYWxmUGl4ZWxYIHByZWRpY3RUeXBlLiBUaGUgdHdvCi0gICAgOy8vIHJvdW5kaW5nIGNhc2VzIGFyZSBoYW5kbGVkIGJ5IHRoZSBkaWZmZXJlbnQgY29kZSBiYXNlIGFuZCBzcGFubmVkIGJ5IAotICAgIDsvLyBkaWZmZXJlbnQgbWFjcm8gY2FsbHMuIExvb3AgaGFzIGJlZW4gc29mdHdhcmUgcGlwZWxpbmVkIHRvIHJlZHVjZSAKLSAgICA7Ly8gc3RhbGxzLgotICAgIDsvLyAKLSAgICA7Ly8gRmlsdGVyaW5nIGludm9sdmVzIGF2ZXJhZ2luZyBhIHBpeGVsIHdpdGggdGhlIG5leHQgaG9yaXpvbnRhbCBwaXhlbC4KLSAgICA7Ly8gTV9MT0FEX1hJTlQgYW5kIE1fRVhUX1hJTlQgY29tYmluYXRpb24gZ2VuZXJhdGUgNCByZWdpc3RlcnMsIDIgd2l0aCAKLSAgICA7Ly8gYWxsIHBpeGVscyBpbiBhIHJvdyB3aXRoIDQgcGl4ZWwgaW4gZWFjaCByZWdpc3RlciBhbmQgYW5vdGhlciAyCi0gICAgOy8vIHJlZ2lzdGVycyB3aXRoIHBpeGVscyBjb3JyZXNwb25kaW5nIHRvIG9uZSBob3Jpem9udGFsbHkgc2hpZnRlZCBwaXhlbAotICAgIDsvLyBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbml0aWFsIHJvdyBwaXhlbHMuIFRoZXNlIGFyZSBzZXQgb2YgcGFja2VkIAotICAgIDsvLyByZWdpc3RlcnMgYXBwcm9wcmlhdGUgdG8gZG8gNCBsYW5lIFNJTUQuCi0gICAgOy8vIEFmdGVyIHRoYXQgTV9VSEFERDhSIG1hY3JvIGRvZXMgdGhlIGF2ZXJhZ2luZyB0YWtpbmcgY2FyZSBvZiB0aGUgCi0gICAgOy8vIHJvdW5kaW5nIGFzIHJlcXVpcmVkCi0gICAgCi1DYXNlSGFsZlBpeGVsWFJuZCRybmRWYWwuT2Zmc2V0JG9mZnNldAotICAgIElGICRybmRWYWwgPSAwCi0gICAgICAgIExEUiBtYXNrLCA9MHg4MDgwODA4MAotICAgIEVORElGCi0KLSAgICBNX0xPQURfWElOVCBwU3JjLCBzcmNTdGVwLCAkb2Zmc2V0LCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0Ci1ZbG9vcEhhbGZQaXhlbFhSbmQkcm5kVmFsLk9mZnNldCRvZmZzZXQKLSAgICBTVUJTICAgICAgICB5LCB5LCAjMQotICAgIE1fRVhUX1hJTlQgICRvZmZzZXQsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQKLSAgICBNX1VIQUREOFIgICB0bXA1LCB0bXAxLCB0bXAzLCAoMS0kcm5kVmFsKSwgbWFzawotICAgIE1fVUhBREQ4UiAgIHRtcDYsIHRtcDIsIHRtcDQsICgxLSRybmRWYWwpLCBtYXNrCi0gICAgU1RSRCAgICAgICAgdG1wNSwgdG1wNiwgW3BEc3RdLCBkc3RTdGVwCi0gICAgTV9MT0FEX1hJTlQgcFNyYywgc3JjU3RlcCwgJG9mZnNldCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNAotICAgIEJHVCAgICAgICAgIFlsb29wSGFsZlBpeGVsWFJuZCRybmRWYWwuT2Zmc2V0JG9mZnNldAotCi0gICAgQiAgICAgICAgICAgU3dpdGNoUHJlZGljdFR5cGVFbmQKLSAgICBNRU5ECi07Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgTUFDUk8KLSAgICBNX01DUkVDT05CTE9DS19IYWxmUGl4ZWxZICRybmRWYWwsICRvZmZzZXQKLSAgICA7Ly8gQWxnb3JpdGhtaWMgRGVzY3JpcHRpb246Ci0gICAgOy8vIFRoaXMgaGFuZGxlcyBtb3Rpb24gY29tcGVuc2F0aW9uIGZvciBIYWxmUGl4ZWxZIHByZWRpY3RUeXBlLiBUaGUgdHdvCi0gICAgOy8vIHJvdW5kaW5nIGNhc2VzIGFyZSBoYW5kbGVkIGJ5IHRoZSBkaWZmZXJlbnQgY29kZSBiYXNlIGFuZCBzcGFubmVkIGJ5IAotICAgIDsvLyBkaWZmZXJlbnQgbWFjcm8gY2FsbHMuIFByZUxvYWRpbmcgaXMgdXNlZCB0byBhdm9pZCByZWxvYWQgb2Ygc2FtZSBkYXRhLiAKLSAgICA7Ly8gCi0gICAgOy8vIEZpbHRlcmluZyBpbnZvbHZlcyBhdmVyYWdpbmcgYSBwaXhlbCB3aXRoIHRoZSBuZXh0IHZlcnRpY2FsIHBpeGVsLgotICAgIDsvLyBNX0xPQURfWCBnZW5lcmF0ZXMgMiByZWdpc3RlcnMgd2l0aCBhbGwgcGl4ZWxzIGluIGEgcm93IHdpdGggNCBwaXhlbCBpbiAKLSAgICA7Ly8gZWFjaCByZWdpc3Rlci4gVGhlc2UgYXJlIHNldCBvZiBwYWNrZWQgcmVnaXN0ZXJzIGFwcHJvcHJpYXRlIHRvIGRvIAotICAgIDsvLyA0IGxhbmUgU0lNRC4gQWZ0ZXIgdGhhdCBNX1VIQUREOFIgbWFjcm8gZG9lcyB0aGUgYXZlcmFnaW5nIHRha2luZyBjYXJlIAotICAgIDsvLyBvZiB0aGUgcm91bmRpbmcgYXMgcmVxdWlyZWQKLSAgICAKLUNhc2VIYWxmUGl4ZWxZUm5kJHJuZFZhbC5PZmZzZXQkb2Zmc2V0Ci0gICAgSUYgJHJuZFZhbCA9IDAKLSAgICAgICAgTERSIG1hc2ssID0weDgwODA4MDgwCi0gICAgRU5ESUYKLQotICAgIE1fTE9BRF9YICAgIHBTcmMsIHNyY1N0ZXAsIHRtcDEsIHRtcDIsIHRtcDUsICRvZmZzZXQgOy8vIFByZS1sb2FkCi1ZbG9vcEhhbGZQaXhlbFlSbmQkcm5kVmFsLk9mZnNldCRvZmZzZXQKLSAgICBTVUJTICAgICAgICB5LCB5LCAjMgotICAgIDsvLyBQcm9jZXNzaW5nIG9uZSBsaW5lCi0gICAgTV9MT0FEX1ggICAgcFNyYywgc3JjU3RlcCwgdG1wMywgdG1wNCwgdG1wNSwgJG9mZnNldAotICAgIE1fVUhBREQ4UiAgIHRtcDEsIHRtcDEsIHRtcDMsICgxLSRybmRWYWwpLCBtYXNrCi0gICAgTV9VSEFERDhSICAgdG1wMiwgdG1wMiwgdG1wNCwgKDEtJHJuZFZhbCksIG1hc2sKLSAgICBTVFJEICAgICAgICB0bXAxLCB0bXAyLCBbcERzdF0sIGRzdFN0ZXAKLSAgICA7Ly8gUHJvY2Vzc2luZyBhbm90aGVyIGxpbmUKLSAgICBNX0xPQURfWCAgICBwU3JjLCBzcmNTdGVwLCB0bXAxLCB0bXAyLCB0bXA1LCAkb2Zmc2V0Ci0gICAgTV9VSEFERDhSICAgdG1wMywgdG1wMywgdG1wMSwgKDEtJHJuZFZhbCksIG1hc2sKLSAgICBNX1VIQUREOFIgICB0bXA0LCB0bXA0LCB0bXAyLCAoMS0kcm5kVmFsKSwgbWFzawotICAgIFNUUkQgICAgICAgIHRtcDMsIHRtcDQsIFtwRHN0XSwgZHN0U3RlcAotCi0gICAgQkdUICAgICAgICAgWWxvb3BIYWxmUGl4ZWxZUm5kJHJuZFZhbC5PZmZzZXQkb2Zmc2V0Ci0KLSAgICBCICAgICAgICAgICBTd2l0Y2hQcmVkaWN0VHlwZUVuZAotICAgIE1FTkQKLTsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICBNQUNSTwotICAgIE1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFhZICRybmRWYWwsICRvZmZzZXQKLSAgICA7Ly8gQWxnb3JpdGhtaWMgRGVzY3JpcHRpb246Ci0gICAgOy8vIFRoaXMgaGFuZGxlcyBtb3Rpb24gY29tcGVuc2F0aW9uIGZvciBIYWxmUGl4ZWxYWSBwcmVkaWN0VHlwZS4gVGhlIHR3bwotICAgIDsvLyByb3VuZGluZyBjYXNlcyBhcmUgaGFuZGxlZCBieSB0aGUgZGlmZmVyZW50IGNvZGUgYmFzZSBhbmQgc3Bhbm5lZCBieSAKLSAgICA7Ly8gZGlmZmVyZW50IG1hY3JvIGNhbGxzLiBQcmVMb2FkaW5nIGlzIHVzZWQgdG8gYXZvaWQgcmVsb2FkIG9mIHNhbWUgZGF0YS4gCi0gICAgOy8vIAotICAgIDsvLyBGaWx0ZXJpbmcgaW52b2x2ZXMgYXZlcmFnaW5nIGEgcGl4ZWwgd2l0aCB0aGUgbmV4dCB2ZXJ0aWNhbCwgaG9yaXpvbnRhbCAKLSAgICA7Ly8gYW5kIHJpZ2h0LWRvd24gZGlhZ29uYWwgcGl4ZWxzLiBKdXN0IGFzIGluIEhhbGZQaXhlbFggY2FzZSwgTV9MT0FEX1hJTlQKLSAgICA7Ly8gYW5kIE1fRVhUX1hJTlQgY29tYmluYXRpb24gZ2VuZXJhdGVzIDQgcmVnaXN0ZXJzIHdpdGggYSByb3cgYW5kIGl0cwotICAgIDsvLyAxIHBpeGVsIHJpZ2h0IHNoaWZ0ZWQgdmVyc2lvbiwgd2l0aCA0IHBpeGVscyBpbiBvbmUgcmVnaXN0ZXIuIEFub3RoZXIgCi0gICAgOy8vIGNhbGwgb2YgdGhhdCBtYWNyby1jb21iaW5hdGlvbiBnZXRzIGFub3RoZXIgcm93LiBUaGVuIE1fSFNVTV9YT1IgaXMgCi0gICAgOy8vIGNhbGxlZCB0byBnZXQgbXV0dWFsIGhhbGYtc3VtIGFuZCB4b3IgY29tYmluYXRpb25zIG9mIGEgcm93IHdpdGggaXRzCi0gICAgOy8vIHNoaWZ0ZWQgdmVyc2lvbiBhcyB0aGV5IGFyZSBpbnB1dHMgdG8gdGhlIE1fQVZHNCBtYWNybyB3aGljaCBjb21wdXRlcwotICAgIDsvLyB0aGUgNCBlbGVtZW50IGF2ZXJhZ2Ugd2l0aCByb3VuZGluZy4gTm90ZSB0aGF0IGl0IGlzIHRoZSBoYWxmLXN1bS94b3IgCi0gICAgOy8vIHZhbHVlcyB0aGF0IGFyZSBwcmVzZXJ2ZWQgZm9yIG5leHQgcm93IGFzIHRoZXkgY2FuIGJlIHJlLXVzZWQgaW4gdGhlIAotICAgIDsvLyBuZXh0IGNhbGwgdG8gdGhlIE1fQVZHNCBhbmQgc2F2ZXMgcmVjb21wdXRhdGlvbi4KLSAgICA7Ly8gRHVlIHRvIGxhY2sgb2YgcmVnaXN0ZXIsIHRoZSByb3cgY291bnRlciBhbmQgYSBtYXNraW5nIHZhbHVlIHJlcXVpcmVkIAotICAgIDsvLyBpbiBNX0FWRzQgYXJlIHBhY2tlZCBpbnRvIGEgc2luZ2xlIHJlZ2lzdGVyIHlNYXNrIHdoZXJlIHRoZSBsYXN0IG5pYmJsZQotICAgIDsvLyBob2xkcyB0aGUgcm93IGNvdW50ZXIgdmFsdWVzIGFuZCByZXN0IGhvbGRzIHRoZSBtYXNraW5nIHZhcmlhYmxlIGxlZnQgCi0gICAgOy8vIHNoaWZ0ZWQgYnkgNAotICAgIAotQ2FzZUhhbGZQaXhlbFhZUm5kJHJuZFZhbC5PZmZzZXQkb2Zmc2V0Ci0gICAgTERSICAgICAgICAgeU1hc2ssID0oKDB4MDEwMTAxMDEgPDwgNCkgKyA4KQotCi0gICAgTV9MT0FEX1hJTlQgcFNyYywgc3JjU3RlcCwgJG9mZnNldCwgdDAwLCB0MDEsIHQxMCwgdDExIDsvLyBMb2FkIGEsIGEnLCBiLCBiJwotICAgIE1fRVhUX1hJTlQgICRvZmZzZXQsIHQwMCwgdDAxLCB0MTAsIHQxMQotICAgIE1fSFNVTV9YT1IgIHQwMCwgdDEwLCB0bXAgICAgICAgICAgICAgICA7Ly8gczAsIGwwCi0gICAgTV9IU1VNX1hPUiAgdDAxLCB0MTEsIHRtcCAgICAgICAgICAgICAgIDsvLyBzMCcsIGwwJwotCi1ZbG9vcEhhbGZQaXhlbFhZUm5kJHJuZFZhbC5PZmZzZXQkb2Zmc2V0Ci0gICAgOy8vIFByb2Nlc3NzaW5nIG9uZSBsaW5lCi0gICAgOy8vIHQwMCwgdDAxLCB0MTAsIHQxMSByZXF1aXJlZCBmcm9tIHByZXZpb3VzIGxvb3AKLSAgICBNX0xPQURfWElOVCBwU3JjLCBzcmNTdGVwLCAkb2Zmc2V0LCB0MjAsIHQyMSwgdDMwLCB0MzEgOy8vIExvYWQgYywgYycsIGQsIGQnCi0gICAgU1VCICAgICAgICAgeU1hc2ssIHlNYXNrLCAjMgotICAgIE1fRVhUX1hJTlQgICRvZmZzZXQsIHQyMCwgdDIxLCB0MzAsIHQzMQotICAgIE1fSFNVTV9YT1IgIHQyMCwgdDMwLCB0bXAgICAgICAgICAgICAgICA7Ly8gczEsIGwxCi0gICAgTV9IU1VNX1hPUiAgdDIxLCB0MzEsIHRtcCAgICAgICAgICAgICAgIDsvLyBzMScsIGwxJwotICAgIE1fQVZHNCAgICAgIHQwMCwgdDEwLCB0MjAsIHQzMCwgJHJuZFZhbCA7Ly8gczAsIGwwLCBzMSwgbDEKLSAgICBNX0FWRzQgICAgICB0MDEsIHQxMSwgdDIxLCB0MzEsICRybmRWYWwgOy8vIHMwJywgbDAnLCBzMScsIGwxJwotICAgIFNUUkQgICAgICAgIHQwMCwgdDAxLCBbcERzdF0sIGRzdFN0ZXAgICA7Ly8gc3RvcmUgdGhlIGF2ZXJhZ2UKLSAgICAKLSAgICA7Ly8gUHJvY2Vzc3NpbmcgYW5vdGhlciBsaW5lCi0gICAgOy8vIHQyMCwgdDIxLCB0MzAsIHQzMSByZXF1aXJlZCBmcm9tIGFib3ZlCi0gICAgTV9MT0FEX1hJTlQgcFNyYywgc3JjU3RlcCwgJG9mZnNldCwgdDAwLCB0MDEsIHQxMCwgdDExIDsvLyBMb2FkIGEsIGEnLCBiLCBiJwotICAgIFRTVCAgICAgICAgIHlNYXNrLCAjNwotICAgIE1fRVhUX1hJTlQgICRvZmZzZXQsIHQwMCwgdDAxLCB0MTAsIHQxMQotICAgIE1fSFNVTV9YT1IgIHQwMCwgdDEwLCB0bXAKLSAgICBNX0hTVU1fWE9SICB0MDEsIHQxMSwgdG1wCi0gICAgTV9BVkc0ICAgICAgdDIwLCB0MzAsIHQwMCwgdDEwLCAkcm5kVmFsCi0gICAgTV9BVkc0ICAgICAgdDIxLCB0MzEsIHQwMSwgdDExLCAkcm5kVmFsCi0gICAgU1RSRCAgICAgICAgdDIwLCB0MjEsIFtwRHN0XSwgZHN0U3RlcAotCi0gICAgQkdUICAgICAgICAgWWxvb3BIYWxmUGl4ZWxYWVJuZCRybmRWYWwuT2Zmc2V0JG9mZnNldAotCi0gICAgSUYgJG9mZnNldC89MyA6TE9SOiAkcm5kVmFsLz0xCi0gICAgICAgIEIgICAgICAgICAgIFN3aXRjaFByZWRpY3RUeXBlRW5kCi0gICAgRU5ESUYKLSAgICBNRU5ECi07Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi07Ly8gTW90aW9uIGNvbXBlbnNhdGlvbiBoYW5kbGVyIG1hY3JvcyBlbmQgaGVyZQotOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgIDsvLyBEZXNjcmlwdGlvbjoKLSAgICA7Ly8gUG9wdWxhdGVzIGFsbCA0IGtpbmRzIG9mIG9mZnNldHMgImNhc2VzIiBmb3IgZWFjaCBwcmVkaWN0VHlwZSBhbmQgcm5kVmFsCi0gICAgOy8vIGNvbWJpbmF0aW9uIGluIHRoZSAic3dpdGNoIiB0byBwcmVkaWN0aW9uIHByb2Nlc3NpbmcgY29kZSBzZWdtZW50Ci0gICAgOy8vCi0gICAgOy8vIFN5bnRheDoKLSAgICA7Ly8gTV9DQVNFX09GRlNFVCAkcm5kLCAkcHJlZGljdFR5cGUKLSAgICA7Ly8gCi0gICAgOy8vIElucHV0czoKLSAgICA7Ly8gJHJuZCAgICAgICAgICAgIDAgZm9yIHJvdW5kaW5nLCAxIGZvciBubyByb3VuZGluZwotICAgIDsvLyAkcHJlZGljdFR5cGUgICAgVGhlIHByZWRpY3Rpb24gbW9kZQotICAgIDsvLyAKLSAgICA7Ly8gT3V0cHV0czoKLSAgICA7Ly8gUG9wdWxhdGVkIGxpc3Qgb2YgIk1fQ0FTRSJzIGZvciB0aGUgIk1fU1dJVENIIiBtYWNybwotCi0gICAgTUFDUk8KLSAgICBNX0NBU0VfT0ZGU0VUICRybmQsICRwcmVkaWN0VHlwZQotICAgICAgICBNX0NBU0UgICAgICBDYXNlJHByZWRpY3RUeXBlLlJuZCRybmQuT2Zmc2V0MAotICAgICAgICBNX0NBU0UgICAgICBDYXNlJHByZWRpY3RUeXBlLlJuZCRybmQuT2Zmc2V0MQotICAgICAgICBNX0NBU0UgICAgICBDYXNlJHByZWRpY3RUeXBlLlJuZCRybmQuT2Zmc2V0MgotICAgICAgICBNX0NBU0UgICAgICBDYXNlJHByZWRpY3RUeXBlLlJuZCRybmQuT2Zmc2V0MwotICAgIE1FTkQKLTsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICA7Ly8gRGVzY3JpcHRpb246Ci0gICAgOy8vIFBvcHVsYXRlcyBhbGwgMiBraW5kcyBvZiByb3VuZGluZyAiY2FzZXMiIGZvciBlYWNoIHByZWRpY3RUeXBlIGluIHRoZSAKLSAgICA7Ly8gInN3aXRjaCIgdG8gcHJlZGljdGlvbiBwcm9jZXNzaW5nIGNvZGUgc2VnbWVudAotICAgIDsvLwotICAgIDsvLyBTeW50YXg6Ci0gICAgOy8vIE1fQ0FTRV9PRkZTRVQgJHByZWRpY3RUeXBlCi0gICAgOy8vIAotICAgIDsvLyBJbnB1dHM6Ci0gICAgOy8vICRwcmVkaWN0VHlwZSAgICBUaGUgcHJlZGljdGlvbiBtb2RlCi0gICAgOy8vIAotICAgIDsvLyBPdXRwdXRzOgotICAgIDsvLyBQb3B1bGF0ZWQgbGlzdCBvZiAiTV9DQVNFX09GRlNFVCIgbWFjcm9zCi0KLSAgICBNQUNSTwotICAgIE1fQ0FTRV9NQ1JFQ09OQkxPQ0sgJHByZWRpY3RUeXBlCi0gICAgICAgIE1fQ0FTRV9PRkZTRVQgIDAsICRwcmVkaWN0VHlwZSA7Ly8gMCBmb3Igcm91bmRpbmcKLSAgICAgICAgTV9DQVNFX09GRlNFVCAgMSwgJHByZWRpY3RUeXBlIDsvLyAxIGZvciBubyByb3VuZGluZwotICAgIE1FTkQKLTsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICA7Ly8gRGVzY3JpcHRpb246Ci0gICAgOy8vIFBvcHVsYXRlcyBhbGwgOCBraW5kcyBvZiByb3VuZGluZyBhbmQgb2Zmc2V0IGNvbWJpbmF0aW9ucyBoYW5kbGluZyBtYWNyb3MgCi0gICAgOy8vIGZvciB0aGUgc3BlY2lmaWVkIHByZWRpY3RUeXBlLiBJbiBjYXNlIG9mICJJbnRlZ2VyUGl4ZWwiIHByZWRpY3RUeXBlLCAKLSAgICA7Ly8gcm91bmRpbmcgaXMgbm90IHJlcXVpcmVkIHNvIHNhbWUgY29kZSBzZWdtZW50IGhhbmRsZXMgYm90aCBjYXNlcwotICAgIDsvLwotICAgIDsvLyBTeW50YXg6Ci0gICAgOy8vIE1fTUNSRUNPTkJMT0NLICAgICRwcmVkaWN0VHlwZQotICAgIDsvLyAKLSAgICA7Ly8gSW5wdXRzOgotICAgIDsvLyAkcHJlZGljdFR5cGUgICAgVGhlIHByZWRpY3Rpb24gbW9kZQotICAgIDsvLyAKLSAgICA7Ly8gT3V0cHV0czoKLSAgICA7Ly8gUG9wdWxhdGVkIGxpc3Qgb2YgIk1fTUNSRUNPTkJMT0NLXzxwcmVkaWN0VHlwZT4iIG1hY3JvcyBmb3Igc3BlY2lmaWVkIAotICAgIDsvLyBwcmVkaWN0VHlwZS4gRWFjaCAKLSAgICA7Ly8gICAgICAgICAgICAgICAgIE1fTUNSRUNPTkJMT0NLXzxwcmVkaWN0VHlwZT4gJHJuZCwgJG9mZnNldCAKLSAgICA7Ly8gaXMgYW4gY29kZSBzZWdtZW50IChzdGFydGluZyB3aXRoIGEgbGFiZWwgaW5kaWNhdGluZyB0aGUgcHJlZGljdFR5cGUsIAotICAgIDsvLyByb3VuZGluZyBhbmQgb2Zmc2V0IGNvbWJpbmF0aW9uKQotICAgIDsvLyBGb3VyIGNhbGxzIG9mIHRoaXMgbWFjcm8gd2l0aCB0aGUgNCBwcmVkaWN0aW9uIG1vZGVzIHBvcHVsYXRlIGFsbCB0aGUgMzIgCi0gICAgOy8vIGhhbmRsZXJzCi0KLSAgICBNQUNSTwotICAgIE1fTUNSRUNPTkJMT0NLICRwcmVkaWN0VHlwZQotICAgICAgICBNX01DUkVDT05CTE9DS18kcHJlZGljdFR5cGUgMCwgMAotICAgICAgICBNX01DUkVDT05CTE9DS18kcHJlZGljdFR5cGUgMCwgMQotICAgICAgICBNX01DUkVDT05CTE9DS18kcHJlZGljdFR5cGUgMCwgMgotICAgICAgICBNX01DUkVDT05CTE9DS18kcHJlZGljdFR5cGUgMCwgMwotICAgIElGICIkcHJlZGljdFR5cGUiIC89ICJJbnRlZ2VyUGl4ZWwiIDsvLyBJZiBub3QgSW50ZWdlclBpeGVsIHRoZW4gcm91bmRpbmcgbWFrZXMgYSBkaWZmZXJlbmNlCi0gICAgICAgIE1fTUNSRUNPTkJMT0NLXyRwcmVkaWN0VHlwZSAxLCAwCi0gICAgICAgIE1fTUNSRUNPTkJMT0NLXyRwcmVkaWN0VHlwZSAxLCAxCi0gICAgICAgIE1fTUNSRUNPTkJMT0NLXyRwcmVkaWN0VHlwZSAxLCAyCi0gICAgICAgIE1fTUNSRUNPTkJMT0NLXyRwcmVkaWN0VHlwZSAxLCAzCi0gICAgRU5ESUYKLSAgICBNRU5ECi07Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi07Ly8gSW5wdXQvT3V0cHV0IFJlZ2lzdGVycwotcFNyYyAgICAgICAgICAgICAgICAgIFJOIDAKLXNyY1N0ZXAgICAgICAgICAgICAgICBSTiAxCi1hcmdfcFNyY1Jlc2lkdWUgICAgICAgUk4gMgotcFNyY1Jlc2lkdWUgICAgICAgICAgIFJOIDEyCi1wRHN0ICAgICAgICAgICAgICAgICAgUk4gMwotZHN0U3RlcCAgICAgICAgICAgICAgIFJOIDIKLXByZWRpY3RUeXBlICAgICAgICAgICBSTiAxMAotcm5kVmFsICAgICAgICAgICAgICAgIFJOIDExCi1tYXNrICAgICAgICAgICAgICAgICAgUk4gMTEKLQotOy8vIExvY2FsIFNjcmF0Y2ggUmVnaXN0ZXJzCi16ZXJvICAgICAgICAgICAgICAgICAgUk4gMTIKLXkgICAgICAgICAgICAgICAgICAgICBSTiAxNAotCi10bXAxICAgICAgICAgICAgICAgICAgUk4gNAotdG1wMiAgICAgICAgICAgICAgICAgIFJOIDUKLXRtcDMgICAgICAgICAgICAgICAgICBSTiA2Ci10bXA0ICAgICAgICAgICAgICAgICAgUk4gNwotdG1wNSAgICAgICAgICAgICAgICAgIFJOIDgKLXRtcDYgICAgICAgICAgICAgICAgICBSTiA5Ci10bXA3ICAgICAgICAgICAgICAgICAgUk4gMTAKLXRtcDggICAgICAgICAgICAgICAgICBSTiAxMQotdG1wOSAgICAgICAgICAgICAgICAgIFJOIDEyCi0KLXQwMCAgICAgICAgICAgICAgICAgICBSTiA0Ci10MDEgICAgICAgICAgICAgICAgICAgUk4gNQotdDEwICAgICAgICAgICAgICAgICAgIFJOIDYKLXQxMSAgICAgICAgICAgICAgICAgICBSTiA3Ci10MjAgICAgICAgICAgICAgICAgICAgUk4gOAotdDIxICAgICAgICAgICAgICAgICAgIFJOIDkKLXQzMCAgICAgICAgICAgICAgICAgICBSTiAxMAotdDMxICAgICAgICAgICAgICAgICAgIFJOIDExCi10bXAgICAgICAgICAgICAgICAgICAgUk4gMTIKLQoteU1hc2sgICAgICAgICAgICAgICAgIFJOIDE0Ci0KLWRzdCAgICAgICAgICAgICAgICAgICBSTiAxCi1yZXR1cm4gICAgICAgICAgICAgICAgUk4gMAotCi0gICAgOy8vIEFsbG9jYXRlIG1lbW9yeSBvbiBzdGFjawotICAgIE1fQUxMT0M0ICAgIFN0a19wRHN0LCAgICAgICAgICAgNAotICAgIE1fQUxMT0M0ICAgIFN0a19wU3JjUmVzaWR1ZSwgICAgNAotICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKLSAgICBNX1NUQVJUICAgICBvbXhWQ000UDJfTUNSZWNvbkJsb2NrLCByMTEKLSAgICA7Ly8gRGVmaW5lIHN0YWNrIGFyZ3VtZW50cwotICAgIE1fQVJHICAgICAgIEFyZ19kc3RTdGVwLCAgICAgICAgNAotICAgIE1fQVJHICAgICAgIEFyZ19wcmVkaWN0VHlwZSwgICAgNAotICAgIE1fQVJHICAgICAgIEFyZ19ybmRWYWwsICAgICAgICAgNAotICAgIDsvLyBTYXZlIG9uIHN0YWNrCi0gICAgTV9TVFIgICAgICAgcERzdCwgU3RrX3BEc3QKLSAgICBNX1NUUiAgICAgICBhcmdfcFNyY1Jlc2lkdWUsIFN0a19wU3JjUmVzaWR1ZQotICAgIDsvLyBMb2FkIGFyZ3VtZW50IGZyb20gdGhlIHN0YWNrCi0gICAgTV9MRFIgICAgICAgZHN0U3RlcCwgQXJnX2RzdFN0ZXAKLSAgICBNX0xEUiAgICAgICBwcmVkaWN0VHlwZSwgQXJnX3ByZWRpY3RUeXBlCi0gICAgTV9MRFIgICAgICAgcm5kVmFsLCBBcmdfcm5kVmFsCi0gICAgCi0gICAgTU9WICAgICAgICAgeSwgIzgKLSAgICAKLSAgICBBTkQgICAgICAgICB0bXAxLCBwU3JjLCAjMwotICAgIE9SUiAgICAgICAgIHByZWRpY3RUeXBlLCB0bXAxLCBwcmVkaWN0VHlwZSwgTFNMICMzCi0gICAgT1JSICAgICAgICAgcHJlZGljdFR5cGUsIHByZWRpY3RUeXBlLCBybmRWYWwsIExTTCAjMgotICAgIDsvLyBUcnVuY2F0aW5nIHNvdXJjZSBwb2ludGVyIHRvIGFsaWduIHRvIDQgYnl0ZSBsb2NhdGlvbgotICAgIEJJQyAgICAgICAgIHBTcmMsIHBTcmMsICMzCi0KLSAgICA7Ly8gSW1wbGVtZW50YXRpb24gdGFrZXMgY2FyZSBvZiBhbGwgY29tYmluYXRpb25zIG9mIGRpZmZlcmVudCAKLSAgICA7Ly8gcHJlZGljdFR5cGVzLCByb3VuZGluZyBjYXNlcyBhbmQgc291cmNlIHBvaW50ZXIgb2Zmc2V0cyB0byBhbGlnbm1lbnQgCi0gICAgOy8vIG9mIDQgYnl0ZXMgaW4gZGlmZmVyZW50IGNvZGUgYmFzZXMgdW5sZXNzIG9uZSBvZiB0aGVzZSBwYXJhbWV0ZXIgd2Fzbid0IAotICAgIDsvLyBtYWtpbmcgYW55IGRpZmZlcmVuY2UgdG8gdGhlIGltcGxlbWVudGF0aW9uLiBCZWxvdyBNX0NBU0VfTUNSRUNPTkJMT0NLCi0gICAgOy8vIG1hY3JvcyBicmFuY2ggaW50byA4IE1fQ0FTRSBtYWNyb3MgZm9yIGFsbCBjb21iaW5hdGlvbnMgb2YgdGhlIDIgCi0gICAgOy8vIHJvdW5kaW5nIGNhc2VzIGFuZCA0IG9mZnNldHMgb2YgdGhlIHBTcmMgcG9pbnRlciB0byB0aGUgNCBieXRlIAotICAgIDsvLyBhbGlnbm1lbnQuIAotICAgIE1fU1dJVENIICAgIHByZWRpY3RUeXBlCi0gICAgICAgIE1fQ0FTRV9NQ1JFQ09OQkxPQ0sgSW50ZWdlclBpeGVsCi0gICAgICAgIE1fQ0FTRV9NQ1JFQ09OQkxPQ0sgSGFsZlBpeGVsWAotICAgICAgICBNX0NBU0VfTUNSRUNPTkJMT0NLIEhhbGZQaXhlbFkKLSAgICAgICAgTV9DQVNFX01DUkVDT05CTE9DSyBIYWxmUGl4ZWxYWQotICAgIE1fRU5EU1dJVENICi0KLSAgICA7Ly8gVGhlIE1fTUNSRUNPTkJMT0NLIG1hY3JvcyBwb3B1bGF0ZSB0aGUgY29kZSBiYXNlcyBieSBjYWxsaW5nIGFsbCA4IAotICAgIDsvLyBwYXJ0aWN1bGFyIG1hY3JvcyAoNCBpbiBjYXNlIG9mIEludGVnZXJQaXhlbCBhcyByb3VuZGluZyBtYWtlcyBubyAKLSAgICA7Ly8gZGlmZmVyZW5jZSB0aGVyZSkgdG8gZ2VuZXJhdGUgdGhlIGNvZGUgZm9yIGFsbCBjYXNlcyBvZiByb3VuZGluZyBhbmQgCi0gICAgOy8vIG9mZnNldHMuIExUT1JHIGlzIHVzZWQgdG8gc2VnbWVudCB0aGUgY29kZSBhcyBjb2RlIHNpemUgYmxvYXRlZCBiZXlvbmQgCi0gICAgOy8vIDRLQi4KLSAgICBNX01DUkVDT05CTE9DSyBJbnRlZ2VyUGl4ZWwKLSAgICBNX01DUkVDT05CTE9DSyBIYWxmUGl4ZWxYCi0gICAgTFRPUkcKLSAgICBNX01DUkVDT05CTE9DSyBIYWxmUGl4ZWxZCi0gICAgTV9NQ1JFQ09OQkxPQ0sgSGFsZlBpeGVsWFkKLVN3aXRjaFByZWRpY3RUeXBlRW5kCi0KLSAgICA7Ly8gUmVzaWR1ZSBBZGRpdGlvbgotICAgIDsvLyBUaGlzIGlzIGRvbmUgaW4gMiBsYW5lIFNJTUQgdGhvdWdoIGxvYWRzIGFyZSBmdXJ0aGVyIG9wdGltaXplZCBhbmQKLSAgICA7Ly8gNCBieXRlcyBhcmUgbG9hZGVkIGluIGNhc2Ugb2YgZGVzdGluYXRpb24gYnVmZmVyLiBBbGdvcml0aG1pYyAKLSAgICA7Ly8gZGV0YWlscyBhcmUgaW4gaW5saW5lZCBjb21tZW50cwotICAgIE1fTERSICAgICAgIHBTcmNSZXNpZHVlLCBTdGtfcFNyY1Jlc2lkdWUKLSAgICBDTVAgICAgICAgICBwU3JjUmVzaWR1ZSwgIzAKLSAgICBCRVEgICAgICAgICBwU3JjUmVzaWR1ZUNvbmRpdGlvbkVuZAotcFNyY1Jlc2lkdWVOb3ROdWxsICAgIAotICAgIE1fTERSICAgICAgIHBEc3QsIFN0a19wRHN0Ci0gICAgTU9WICAgICAgICAgeSwgIzgKLSAgICBTVUIgICAgICAgICBkc3RTdGVwLCBkc3RTdGVwLCAjNAotWWxvb3BfcFNyY1Jlc2lkdWVOb3ROdWxsCi0gICAgU1VCUyAgICAgICAgeSwgeSwgIzEKLSAgICBMRFIgICAgICAgICBkc3QsIFtwRHN0XSAgICAgICAgICAgICAgICA7Ly8gZHN0ID0gW2RjYmFdCi0gICAgTERNSUEgICAgICAgcFNyY1Jlc2lkdWUhLCB7dG1wMSwgdG1wMn0gOy8vIHRtcDE9W0RDXSB0bXAyPVtCQV0KLSAgICBQS0hCVCAgICAgICB0bXAzLCB0bXAxLCB0bXAyLCBMU0wgIzE2ICA7Ly8gRGVsdGF2YWwxID0gW0MgQV0KLSAgICBQS0hUQiAgICAgICB0bXA0LCB0bXAyLCB0bXAxLCBBU1IgIzE2ICA7Ly8gRGVsdGFWYWwyID0gW0QgQl0KLSAgICBVWFRCMTYgICAgICB0bXAxLCBkc3QgICAgICAgICAgICAgICAgICA7Ly8gdG1wMSA9IFswYzBhXQotICAgIFVYVEIxNiAgICAgIHRtcDIsIGRzdCwgUk9SICM4ICAgICAgICAgIDsvLyB0bXAyID0gWzBkMGJdCi0gICAgUUFERDE2ICAgICAgdG1wMSwgdG1wMSwgdG1wMyAgICAgICAgICAgOy8vIEFkZCBhbmQgc2F0dXJhdGUgdG8gMTYgYml0cwotICAgIFFBREQxNiAgICAgIHRtcDIsIHRtcDIsIHRtcDQKLSAgICBVU0FUMTYgICAgICB0bXAxLCAjOCwgdG1wMQotICAgIFVTQVQxNiAgICAgIHRtcDIsICM4LCB0bXAyICAgICAgICAgICAgIDsvLyBhcm1DbGlwKDAsIDI1NSwgdG1wMikKLSAgICBPUlIgICAgICAgICB0bXAxLCB0bXAxLCB0bXAyLCBMU0wgIzggICA7Ly8gdG1wMSA9IFtkY2JhXQotICAgIFNUUiAgICAgICAgIHRtcDEsIFtwRHN0XSwgIzQKLSAgICAKLSAgICBMRFIgICAgICAgICBkc3QsIFtwRHN0XQotICAgIExETUlBICAgICAgIHBTcmNSZXNpZHVlISwge3RtcDEsIHRtcDJ9Ci0gICAgUEtIQlQgICAgICAgdG1wMywgdG1wMSwgdG1wMiwgTFNMICMxNgotICAgIFBLSFRCICAgICAgIHRtcDQsIHRtcDIsIHRtcDEsIEFTUiAjMTYKLSAgICBVWFRCMTYgICAgICB0bXAxLCBkc3QKLSAgICBVWFRCMTYgICAgICB0bXAyLCBkc3QsIFJPUiAjOAotICAgIFFBREQxNiAgICAgIHRtcDEsIHRtcDEsIHRtcDMKLSAgICBRQUREMTYgICAgICB0bXAyLCB0bXAyLCB0bXA0Ci0gICAgVVNBVDE2ICAgICAgdG1wMSwgIzgsIHRtcDEKLSAgICBVU0FUMTYgICAgICB0bXAyLCAjOCwgdG1wMgotICAgIE9SUiAgICAgICAgIHRtcDEsIHRtcDEsIHRtcDIsIExTTCAjOAotICAgIFNUUiAgICAgICAgIHRtcDEsIFtwRHN0XSwgZHN0U3RlcAotICAgIAotICAgIEJHVCAgICAgICAgIFlsb29wX3BTcmNSZXNpZHVlTm90TnVsbAotcFNyY1Jlc2lkdWVDb25kaXRpb25FbmQKLQotICAgIE1PViAgICAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKLQotICAgIE1fRU5ECi0gICAgRU5ESUYgOy8vIEFSTTExMzZKUwotCi07Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi07Ly8gQ29ydGV4QTggaW1wbGVtZW50YXRpb24KLTsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICBFTkQKLTsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLTsvLyBvbXhWQ000UDJfTUNSZWNvbkJsb2NrIGVuZHMKLTsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE2YzgxZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyOTcgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsgKioqKioqKioqKgotOyAqIAotOyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmFfcy5zCi07ICogT3Blbk1BWCBETDogdjEuMC4yCi07ICogUmV2aXNpb246ICAgOTY0MQotOyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci07ICogCi07ICogCi07ICogCi07ICogCi07ICogRGVzY3JpcHRpb246Ci07ICogQ29udGFpbnMgbW9kdWxlIGZvciBEQy9BQyBjb2VmZmljaWVudCBwcmVkaWN0aW9uCi07ICoKLTsgKiAKLTsgKiBGdW5jdGlvbjogb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYQotOyAqCi07ICogRGVzY3JpcHRpb246Ci07ICogUGVyZm9ybXMgYWRhcHRpdmUgREMvQUMgY29lZmZpY2llbnQgcHJlZGljdGlvbiBmb3IgYW4gaW50cmEgYmxvY2suIFByaW9yCi07ICogdG8gdGhlIGZ1bmN0aW9uIGNhbGwsIHByZWRpY3Rpb24gZGlyZWN0aW9uIChwcmVkRGlyKSBzaG91bGQgYmUgc2VsZWN0ZWQKLTsgKiBhcyBzcGVjaWZpZWQgaW4gc3ViY2xhdXNlIDcuNC4zLjEgb2YgSVNPL0lFQyAxNDQ5Ni0yLgotOyAqCi07ICogUmVtYXJrczoKLTsgKgotOyAqIFBhcmFtZXRlcnM6Ci07ICogW2luXSAgcFNyY0RzdCAgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucyB0aGUgCi07ICogICAgICAgICAgICAgICAgICAgIHF1YW50aXplZCBjb2VmZmljaWVudCByZXNpZHVhbHMgKFBRRikgb2YgdGhlIGN1cnJlbnQgCi07ICogICAgICAgICAgICAgICAgICAgIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIFRoZSAKLTsgKiAgICAgICAgICAgICAgICAgICAgb3V0cHV0IGNvZWZmaWNpZW50cyBhcmUgc2F0dXJhdGVkIHRvIHRoZSByYW5nZSAKLTsgKiAgICAgICAgICAgICAgICAgICAgWy0yMDQ4LCAyMDQ3XS4KLTsgKiBbaW5dICBwUHJlZEJ1ZlJvdyAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkCi07ICogICAgICAgICAgICAgICAgICAgIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LgotOyAqIFtpbl0gIHBQcmVkQnVmQ29sICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyOyBtdXN0IGJlIAotOyAqICAgICAgICAgICAgICAgICAgICBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LgotOyAqIFtpbl0gIGN1clFQICAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBjdXJyZW50IGJsb2NrLiBjdXJRUCBtYXkgCi07ICogICAgICAgICAgICAgICAgICAgIGVxdWFsIHRvIHByZWRRUCBlc3BlY2lhbGx5IHdoZW4gdGhlIGN1cnJlbnQgYmxvY2sgYW5kIAotOyAqICAgICAgICAgICAgICAgICAgICB0aGUgcHJlZGljdG9yIGJsb2NrIGFyZSBpbiB0aGUgc2FtZSBtYWNyb2Jsb2NrLgotOyAqIFtpbl0gIHByZWRRUCAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBwcmVkaWN0b3IgYmxvY2sKLTsgKiBbaW5dICBwcmVkRGlyICAgICAgaW5kaWNhdGVzIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbiB3aGljaCB0YWtlcyBvbmUKLTsgKiAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6Ci07ICogICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19IT1JJWk9OVEFMICAgIHByZWRpY3QgaG9yaXpvbnRhbGx5Ci07ICogICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19WRVJUSUNBTCAgICAgICAgcHJlZGljdCB2ZXJ0aWNhbGx5Ci07ICogW2luXSAgQUNQcmVkRmxhZyAgIGEgZmxhZyBpbmRpY2F0aW5nIGlmIEFDIHByZWRpY3Rpb24gc2hvdWxkIGJlCi07ICogICAgICAgICAgICAgICAgICAgIHBlcmZvcm1lZC4gSXQgaXMgZXF1YWwgdG8gYWNfcHJlZF9mbGFnIGluIHRoZSBiaXQKLTsgKiAgICAgICAgICAgICAgICAgICAgc3RyZWFtIHN5bnRheCBvZiBNUEVHLTQKLTsgKiBbaW5dICB2aWRlb0NvbXAgICAgdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSwgY2hyb21pbmFuY2Ugb3IKLTsgKiAgICAgICAgICAgICAgICAgICAgYWxwaGEpIG9mIHRoZSBjdXJyZW50IGJsb2NrCi07ICogW291dF0gcFNyY0RzdCAgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucwotOyAqICAgICAgICAgICAgICAgICAgICB0aGUgcXVhbnRpemVkIGNvZWZmaWNpZW50cyAoUUYpIG9mIHRoZSBjdXJyZW50Ci07ICogICAgICAgICAgICAgICAgICAgIGJsb2NrCi07ICogW291dF0gcFByZWRCdWZSb3cgIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgcm93IGJ1ZmZlcgotOyAqIFtvdXRdIHBQcmVkQnVmQ29sICBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIKLTsgKiBSZXR1cm4gVmFsdWU6Ci07ICogT01YX1N0c19Ob0VyciAtIG5vIGVycm9yCi07ICogT01YX1N0c19CYWRBcmdFcnIgLSBCYWQgYXJndW1lbnRzIAotOyAqIC0gQXQgbGVhc3Qgb25lIG9mIHRoZSBwb2ludGVycyBpcyBOVUxMOiBwU3JjRHN0LCBwUHJlZEJ1ZlJvdywgb3IgcFByZWRCdWZDb2wuCi07ICogLSBBdCBsZWFzdCBvbmUgdGhlIGZvbGxvd2luZyBjYXNlczogY3VyUVAgPD0gMCwgcHJlZFFQIDw9IDAsIGN1clFQID4zMSwgCi07ICogICBwcmVkUVAgPiAzMSwgcHJlRGlyIGV4Y2VlZHMgWzEsMl0uCi07ICogLSBBdCBsZWFzdCBvbmUgb2YgdGhlIHBvaW50ZXJzIHBTcmNEc3QsIHBQcmVkQnVmUm93LCBvciBwUHJlZEJ1ZkNvbCBpcyBub3QgCi07ICogICA0LWJ5dGUgYWxpZ25lZC4KLTsgKgotOyAqKioqKioqKioKLSAgICAgCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgICAgCi0gICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLSAgICAgICAKLSAgICAgICAgICAgICAKLQotICAgICAgIElNUE9SVCAgICAgICAgYXJtVkNNNFAyX1JlY2lwcm9jYWxfUVBfUzMyCi0gICAgICAgSU1QT1JUICAgICAgICBhcm1WQ000UDJfUmVjaXByb2NhbF9RUF9TMTYKLSAgICAgICBJTVBPUlQgICAgICAgIGFybVZDTTRQMl9EQ1NjYWxlcgotICAgICAgIAotCi0KLSAgICAgICAgSUYgQVJNMTEzNkpTCi0KLQotOy8vIElucHV0IEFyZ3VtZW50cwotCi1wU3JjRHN0ICAgICAgICAgIFJOIDAKLXBQcmVkQnVmUm93ICAgICAgUk4gMQotcFByZWRCdWZDb2wgICAgICBSTiAyCi1jdXJRUCAgICAgICAgICAgIFJOIDMKLVFQICAgICAgICAgICAgICAgUk4gMwotcHJlZFFQICAgICAgICAgICBSTiA0Ci1wcmVkRGlyICAgICAgICAgIFJOIDUKLUFDUHJlZEZsYWcgICAgICAgUk4gNgotdmlkZW9Db21wICAgICAgICBSTiA3ICAKLQotOy8vIExvY2FsIFZhcmlhYmxlcwotCi10ZW1wMiAgICAgICAgICAgIFJOIDUKLW5lZ0N1clFQICAgICAgICAgUk4gNwotbmVnZGNTY2FsZXIgICAgICBSTiA3Ci10ZW1wUHJlZCAgICAgICAgIFJOIDgKLQotZGNTY2FsZXIgICAgICAgICBSTiA0Ci1Db2VmZlRhYmxlICAgICAgIFJOIDkKLWFic0NvZWZmREMgICAgICAgUk4gOQotdGVtcDMgICAgICAgICAgICBSTiA2Ci1hYnNDb2VmZkFDICAgICAgIFJOIDYKLQotc2hvcnRWaWRlb0hlYWRlciBSTiA5Ci1wcmVkQ29lZmZUYWJsZSAgIFJOIDEwCi1Db3VudCAgICAgICAgICAgIFJOIDEwCi10ZW1wMSAgICAgICAgICAgIFJOIDEyCi1pbmRleCAgICAgICAgICAgIFJOIDEyCi1SZW0gICAgICAgICAgICAgIFJOIDE0Ci10ZW1wICAgICAgICAgICAgIFJOIDExCi1SZXR1cm4gICAgICAgICAgIFJOIDAKLQotICAgICAgIAotCi0gICAgICAgTV9TVEFSVCAgIG9teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEscjEyCi0gICAgICAgCi0gICAgICAgOy8vIEFzc2lnbmluZyBwb2ludGVycyB0byBJbnB1dCBhcmd1bWVudHMgb24gU3RhY2sKLSAgICAKLSAgICAgICBNX0FSRyAgICAgICAgICAgcHJlZFFQb25TdGFjayw0ICAKLSAgICAgICBNX0FSRyAgICAgICAgICAgcHJlZERpcm9uU3RhY2ssNAotICAgICAgIE1fQVJHICAgICAgICAgICBBQ1ByZWRGbGFnb25TdGFjayw0Ci0gICAgICAgTV9BUkcgICAgICAgICAgIHZpZGVvQ29tcG9uU3RhY2ssNAotICAgICAgIAotICAgICAgIDsvLyBEQyBQcmVkaWN0aW9uCi0KLSAgICAgICBNX0xEUiAgICAgICAgICAgdmlkZW9Db21wLHZpZGVvQ29tcG9uU3RhY2sgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCB2aWRlb0NvbXAgRnJvbSBTdGFjayAgICAgICAgICAgICAgIAotICAgICAgIAotICAgICAgIE1fTERSICAgICAgICAgICBwcmVkRGlyLHByZWREaXJvblN0YWNrICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIFByZWRpY3Rpb24gZGlyZWN0aW9uCi0gICAgICAgCi0gICAgICAgOy8vIGRjU2NhbGVyIENhbGN1bGF0aW9uCi0KLSAgICAgICBMRFIgICAgICAgICAgICAgaW5kZXgsID1hcm1WQ000UDJfRENTY2FsZXIKLSAgICAgICBBREQgICAgICAgICAgICAgaW5kZXgsaW5kZXgsdmlkZW9Db21wLExTTCAjNQotICAgICAgIExEUkIgICAgICAgICAgICBkY1NjYWxlcixbaW5kZXgsUVBdCi0gICAgICAgICAgIAotICAgIAotY2FsRENWYWwKLSAgICAgIAotICAgICAgIAotICAgICAgIExEUiAgICAgICAgICAgICBwcmVkQ29lZmZUYWJsZSwgPWFybVZDTTRQMl9SZWNpcHJvY2FsX1FQX1MxNiAgIDsvLyBMb2FkaW5nIHRoZSB0YWJsZSB3aXRoIGVudHJpZXMgMzI3NjcvKDEgdG8gNjMpIAotICAgICAgCi0gICAgICAgQ01QICAgICAgICAgICAgIHByZWREaXIsIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENoZWNrIGlmIHRoZSBQcmVkaWN0aW9uIGRpcmVjdGlvbiBpcyB2ZXJ0aWNhbAotCi0gICAgICAgOy8vIENhdWx1Y2F0ZSB0ZW1wIHByZWQgYnkgcGVyZm9ybWluZyBEaXZpc2lvbgotICAgICAgICAgICAgCi0gICAgICAgTERSRVFTSCAgICAgICAgIGFic0NvZWZmREMsW3BQcmVkQnVmUm93XSAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIHZldGljYWwgbG9hZCB0aGUgY29lZmYgZnJvbSBSb3cgUHJlZGljdGlvbiBCdWZmZXIKLSAgICAgICBMRFJORVNIICAgICAgICAgYWJzQ29lZmZEQyxbcFByZWRCdWZDb2xdICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgaG9yaXpvbnRhbCBsb2FkIHRoZSBjb2VmZiBmcm9tIGNvbHVtbiBQcmVkaWN0aW9uIEJ1ZmZlcgotICAgICAgIAotICAgICAgIFJTQiAgICAgICAgICAgICBuZWdkY1NjYWxlcixkY1NjYWxlciwjMCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBuZWdkY1NjYWxlcj0tZGNTY2FsZXIgIAotICAgICAgIAotICAgICAgIE1PViAgICAgICAgICAgICB0ZW1wMSxhYnNDb2VmZkRDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wMT1wcmVkaWN0aW9uIGNvZWZmCi0gICAgICAgQ01QICAgICAgICAgICAgIHRlbXAxLCMwCi0gICAgICAgUlNCTFQgICAgICAgICAgIGFic0NvZWZmREMsdGVtcDEsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vYWJzQ29lZmZEQz1hYnModGVtcDEpCi0gICAgICAgCi0gICAgICAgQUREICAgICAgICAgICAgIHRlbXAsZGNTY2FsZXIsZGNTY2FsZXIKLSAgICAgICBMRFJIICAgICAgICAgICAgdGVtcCxbcHJlZENvZWZmVGFibGUsdGVtcF0gICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCB2YWx1ZSBmcm9tIGNvZWZmIHRhYmxlIGZvciBwZXJmb3JtaW5nIGRpdmlzaW9uIHVzaW5nIG11bHRpcGxpY2F0aW9uCi0gICAgICAgCi0gICAgICAgU01VTEJCICAgICAgICAgIHRlbXBQcmVkLHRlbXAsYWJzQ29lZmZEQyAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXBQcmVkPXBQcmVkQnVmUm93KENvbClbMF0qMzI3NjcvZGNTY2FsZXIKLSAgICAgICBBREQgICAgICAgICAgICAgdGVtcDMsZGNTY2FsZXIsIzEKLSAgICAgICBMU1IgICAgICAgICAgICAgdGVtcFByZWQsdGVtcFByZWQsIzE1ICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcFByZWQ9cFByZWRCdWZSb3coQ29sKVswXS9kY1NjYWxlciAgICAgICAgICAKLSAgICAgICBMU1IgICAgICAgICAgICAgdGVtcDMsdGVtcDMsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcDM9cm91bmQoZGNTY2FsZXIvMikKLSAgICAgICAKLSAgICAgICBNTEEgICAgICAgICAgICAgUmVtLG5lZ2RjU2NhbGVyLHRlbXBQcmVkLGFic0NvZWZmREMgICAgICAgICAgICA7Ly8gUmVtID0gcFByZWRCdWZSb3coQ29sKVswXS10ZW1wUHJlZCpkY1NjYWxlciAgICAgIAotICAgICAgIAotICAgICAgIAotICAgICAgIExEUkggICAgICAgICAgICB0ZW1wLFtwUHJlZEJ1ZkNvbF0KLSAgICAgICBDTVAgICAgICAgICAgICAgUmVtLHRlbXAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICBBRERHRSAgICAgICAgICAgdGVtcFByZWQsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgUmVtPj1yb3VuZChkY1NjYWxlci8yKTt0ZW1wUHJlZD10ZW1wUHJlZCsxCi0gICAgICAgQ01QICAgICAgICAgICAgIHRlbXAxLCMwCi0gICAgICAgUlNCTFQgICAgICAgICAgIHRlbXBQcmVkLHRlbXBQcmVkLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvIGlmIHBQcmVkQnVmUm93KENvbClbMF08MDsgdGVtcFByZWQ9LXRlbXBQcmVkCi0gICAgICAgICAgICAgCi0gICAgICAgCi0gICAgICAgU1RSSCAgICAgICAgICAgIHRlbXAsW3BQcmVkQnVmUm93LCMtMTZdICAgICAgCi0KLSAgICAgICBMRFJIICAgICAgICAgICAgdGVtcCxbcFNyY0RzdF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcD1wU3JjRHN0WzBdCi0gICAgICAgTV9MRFIgICAgICAgICAgIEFDUHJlZEZsYWcsQUNQcmVkRmxhZ29uU3RhY2sKLSAgICAgICBBREQgICAgICAgICAgICAgdGVtcCx0ZW1wLHRlbXBQcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcD1wU3JjRHN0WzBdK3RlbXBQcmVkCi0gICAgICAgU1NBVDE2ICAgICAgICAgIHRlbXAsIzEyLHRlbXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGNsaXAgdGVtcCB0byBbLTIwNDgsMjA0N10KLSAgICAgICAKLSAgICAgICBTTVVMQkIgICAgICAgICAgdGVtcDEsdGVtcCxkY1NjYWxlciAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcDE9Y2xpcHBlZChwU3JjRHN0WzBdKSpkY1NjYWxlciAgICAgICAgICAgCi0gICAgICAgTV9MRFIgICAgICAgICAgIHByZWRRUCxwcmVkUVBvblN0YWNrCi0gICAgICAgU1RSSCAgICAgICAgICAgIHRlbXAsW3BTcmNEc3RdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgQ01QICAgICAgICAgICAgIEFDUHJlZEZsYWcsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENoZWNrIGlmIHRoZSBBQyBwcmVkaWN0aW9uIGZsYWcgaXMgc2V0IG9yIG5vdAotICAgICAgIFNUUkggICAgICAgICAgICB0ZW1wMSxbcFByZWRCdWZDb2xdICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB0ZW1wMSB0byBwUHJlZEJ1ZkNvbAotIAotICAgICAgIDsvLyBBQyBQcmVkaWN0aW9uCi0KLSAgICAgICAgICAgICAgCi0gICAgICAgQk5FICAgICAgICAgICAgIEV4aXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIG5vdCBzZXQgRXhpdAotICAgICAgIAotICAgICAgIExEUiAgICAgICAgICAgICBwcmVkQ29lZmZUYWJsZSwgPWFybVZDTTRQMl9SZWNpcHJvY2FsX1FQX1MzMiAgIDsvLyBMb2FkaW5nIHRoZSB0YWJsZSB3aXRoIGVudHJpZXMgMHgxZmZmZi8oMSB0byA2MykKLSAgICAgICBNT1YgICAgICAgICAgICAgdGVtcDEsIzQKLSAgICAgICBNVUwgICAgICAgICAgICAgdGVtcDEsY3VyUVAsdGVtcDEKLSAgICAgICBDTVAgICAgICAgICAgICAgcHJlZERpciwjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ2hlY2sgdGhlIFByZWRpY3Rpb24gZGlyZWN0aW9uCi0gICAgICAgUlNCICAgICAgICAgICAgIG5lZ0N1clFQLGN1clFQLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgIExEUiAgICAgICAgICAgICBDb2VmZlRhYmxlLFtwcmVkQ29lZmZUYWJsZSx0ZW1wMV0gICAgICAgICAgICAgIDsvLyBDb2VmZlRhYmxlPTB4MWZmZmYvY3VyUVAKLSAgICAgICBBREQgICAgICAgICAgICAgY3VyUVAsY3VyUVAsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY3VyUVA9Y3VyUVArMQotICAgICAgIExTUiAgICAgICAgICAgICBjdXJRUCxjdXJRUCwjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBjdXJRUD1yb3VuZChjdXJRUC8yKSAgICAgICAgICAgICAgICAKLSAgICAgICBNT1YgICAgICAgICAgICAgQ291bnQsIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSW5pdGlhbGl6aW5nIHRoZSBMb29wIENvdW50Ci0gICAgICAgQk5FICAgICAgICAgICAgIEhvcml6b250YWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIHRoZSBQcmVkaWN0aW9uIGRpcmVjdGlvbiBpcyBob3Jpem9udGFsIGJyYW5jaCB0byBIb3Jpem9udGFsCi0KLSAgICAgICAKLQotbG9vcDEgICAgICAgCi0gICAgICAgOy8vIENhbGN1bGF0ZSB0ZW1wUHJlZAotICAgICAgIAotICAgICAgIExEUlNIICAgICAgICAgICBhYnNDb2VmZkFDLFtwUHJlZEJ1ZlJvdyxDb3VudF0gICAgICAgICAgICAgICAgIDsvLyBhYnNDb2VmZkFDPXBQcmVkQnVmUm93W2ldLCAxPTxpPD03Ci0gICAgICAgTU9WICAgICAgICAgICAgIHRlbXAxLGFic0NvZWZmQUMKLSAgICAgICBDTVAgICAgICAgICAgICAgdGVtcDEsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY29tcGFyZSBwUHJlZEJ1ZlJvd1tpXSB3aXRoIHplcm8sIDE9PGk8PTcKLSAgICAgICBSU0JMVCAgICAgICAgICAgYWJzQ29lZmZBQyx0ZW1wMSwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gYWJzQ29lZmZBQz0gYWJzKHBQcmVkQnVmUm93W2ldKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICBTTVVMQkIgICAgICAgICAgYWJzQ29lZmZBQyxhYnNDb2VmZkFDLHByZWRRUCAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcDE9cFByZWRCdWZSb3dbaV0qcHJlZFFQCi0gICAgICAgTVVMICAgICAgICAgICAgIHRlbXBQcmVkLGFic0NvZWZmQUMsQ29lZmZUYWJsZSAgICAgICAgICAgICAgICAgOy8vIHRlbXBQcmVkPXBQcmVkQnVmUm93W2ldKnByZWRRUCoweDFmZmZmL2N1clFQCi0gICAgICAgTFNSICAgICAgICAgICAgIHRlbXBQcmVkLHRlbXBQcmVkLCMxNyAgICAgICAgICAKLSAgICAgICAgICAgICAKLSAgICAgICBNTEEgICAgICAgICAgICAgUmVtLG5lZ0N1clFQLHRlbXBQcmVkLGFic0NvZWZmQUMgICAgICAgICAgICAgICA7Ly8gUmVtPWFicyhwUHJlZEJ1ZlJvd1tpXSktdGVtcFByZWQqY3VyUVAKLSAgICAgICBMRFJIICAgICAgICAgICAgdGVtcCxbcFNyY0RzdCxDb3VudF0gICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcD1wU3JjRHN0W2ldLDE8PWk8OAotICAgICAgIAotICAgICAgIENNUCAgICAgICAgICAgICBSZW0sY3VyUVAKLSAgICAgICBBRERHRSAgICAgICAgICAgdGVtcFByZWQsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gaWYgUmVtPj1yb3VuZChjdXJRUC8yKTsgdGVtcFByZWQ9dGVtcFByZWQrMQotICAgICAgIENNUCAgICAgICAgICAgICB0ZW1wMSwjMAotICAgICAgIFJTQkxUICAgICAgICAgICB0ZW1wUHJlZCx0ZW1wUHJlZCwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBpZiBwUHJlZEJ1ZlJvd1tpXTwwIDsgdGVtcFByZWQ9LXRlbXBQcmVkCi0gICAgICAgICAgICAgIAotICAgICAgIDsvLyBVcGRhdGUgc291cmNlIGFuZCBSb3cgUHJlZGljdGlvbiBidWZmZXJzCi0gICAgICAgCi0gICAgICAgQUREICAgICAgICAgICAgIHRlbXAsdGVtcCx0ZW1wUHJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXA9dGVtcFByZWQrcFNyY0RzdFtpXQotICAgICAgIFNTQVQxNiAgICAgICAgICB0ZW1wLCMxMix0ZW1wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDbGlwIHRlbXAgdG8gWy0yMDQ4LDIwNDddCi0gICAgICAgU1RSSCAgICAgICAgICAgIHRlbXAsW3BTcmNEc3QsQ291bnRdCi0gICAgICAgU1RSSCAgICAgICAgICAgIHRlbXAsW3BQcmVkQnVmUm93LENvdW50XSAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBQcmVkQnVmUm93W2ldPXRlbXAKLSAgICAgICBBREQgICAgICAgICAgICAgQ291bnQsQ291bnQsIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gaT1pKzEKLSAgICAgICBDTVAgICAgICAgICAgICAgQ291bnQsIzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY29tcGFyZSBpZiBpPTgKLSAgICAgICBCTFQgICAgICAgICAgICAgbG9vcDEKLSAgICAgICBCICAgICAgICAgICAgICAgRXhpdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQnJhbmNoIHRvIGV4aXQKLQotSG9yaXpvbnRhbAotCi0gICAgICAgTU9WICAgICAgICAgICAgIENvdW50LCMxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEluaXRpYWxpemluZyBpPTgKLQotbG9vcDIgIAotICAgICAKLSAgICAgICBMU1IgICAgICAgICAgICAgdGVtcDIsQ291bnQsIzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcDI9aT4+MwotICAgICAgIAotICAgICAgIDsvLyBDYWxjdWxhdGUgdGVtcFByZWQKLSAgICAgICAKLSAgICAgICBMRFJIICAgICAgICAgICAgYWJzQ29lZmZBQyxbcFByZWRCdWZDb2wsdGVtcDJdICAgICAgICAgICAgICAgICA7Ly8gYWJzQ29lZkFDPXBQcmVkQnVmQ29sW2k+PjNdICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICBNT1YgICAgICAgICAgICAgdGVtcDEsYWJzQ29lZmZBQwotICAgICAgIENNUCAgICAgICAgICAgICB0ZW1wMSwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBjb21wYXJlIHBQcmVkQnVmUm93W2ldIHdpdGggemVybywgMT08aTw9NwotICAgICAgIFJTQkxUICAgICAgICAgICBhYnNDb2VmZkFDLHRlbXAxLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBhYnNDb2VmZkFDPWFicyhwUHJlZEJ1ZkNvbFtpPj4zXSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgU01VTEJCICAgICAgICAgIGFic0NvZWZmQUMsYWJzQ29lZmZBQyxwcmVkUVAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXAxPXBQcmVkQnVmQ29sW2k+PjNdKnByZWRRUAotICAgICAgIE1VTCAgICAgICAgICAgICB0ZW1wUHJlZCxhYnNDb2VmZkFDLENvZWZmVGFibGUgICAgICAgICAgICAgICAgIDsvLyB0ZW1wUHJlZD1wUHJlZEJ1ZkNvbFtpPj4zXSpwcmVkUVAqMHgxZmZmZi9jdXJRUAotICAgICAgIExTUiAgICAgICAgICAgICB0ZW1wUHJlZCx0ZW1wUHJlZCwjMTcgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wUHJlZD1wUHJlZEJ1ZkNvbFtpPj4zXSpwcmVkUVAvY3VyUVAKLSAgICAgICAKLSAgICAgICBNTEEgICAgICAgICAgICAgUmVtLG5lZ0N1clFQLHRlbXBQcmVkLGFic0NvZWZmQUMKLSAgICAgICBMRFJIICAgICAgICAgICAgdGVtcCxbcFNyY0RzdCxDb3VudF0gICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcD1wU3JjRHN0W2ldCi0gICAgICAgCi0gICAgICAgQ01QICAgICAgICAgICAgIFJlbSxjdXJRUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENvbXBhcmUgUmVtIHdpdGggcm91bmQoY3VyUVAvMikKLSAgICAgICBBRERHRSAgICAgICAgICAgdGVtcFByZWQsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcFByZWQ9dGVtcFByZWQrMSBpZiBSZW0+PXJvdW5kKGN1clFQLzIpCi0gICAgICAgQ01QICAgICAgICAgICAgIHRlbXAxLCMwCi0gICAgICAgUlNCTFQgICAgICAgICAgIHRlbXBQcmVkLHRlbXBQcmVkLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGlmIHBQcmVkQnVmQ29sW2k+PjMgPDAgdGVtcFByZWQ9LXRlbXBQcmVkCi0gICAgICAgCi0gICAgICAgOy8vIFVwZGF0ZSBzb3VyY2UgYW5kIFJvdyBQcmVkaWN0aW9uIGJ1ZmZlcnMKLSAgICAgICAKLSAgICAgICBBREQgICAgICAgICAgICAgdGVtcCx0ZW1wLHRlbXBQcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcD1wU3JjRHN0W2ldK3RlbXBQcmVkCi0gICAgICAgU1NBVDE2ICAgICAgICAgIHRlbXAsIzEyLHRlbXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENsaXAgdGVtcCB0byBbLTIwNDgsMjA0N10KLSAgICAgICBTVFJIICAgICAgICAgICAgdGVtcCxbcFNyY0RzdCxDb3VudF0gICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFswXT0gY2xpcHBlZCB2YWx1ZQotICAgICAgIFNUUkggICAgICAgICAgICB0ZW1wLFtwUHJlZEJ1ZkNvbCx0ZW1wMl0gICAgICAgICAgICAgICAgICAgICAgIDsvLyBwUHJlZEJ1ZkNvbFtpPj4zXT10ZW1wCi0gICAgICAgQUREICAgICAgICAgICAgIENvdW50LENvdW50LCMxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGk9aSs4Ci0gICAgICAgQ01QICAgICAgICAgICAgIENvdW50LCMxMjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGNvbXBhcmUgaSB3aXRoIDY0Ci0gICAgICAgQkxUICAgICAgICAgICAgIGxvb3AyCi0KLSAgICAgICAgICAgICAKLUV4aXQKLSAgCi0gICAgICAgTU9WICAgICAgICAgICAgIFJldHVybiwjT01YX1N0c19Ob0VyciAKLQotICAgICAgIE1fRU5ECi0gICAgICAgRU5ESUYKLSAgICAgICBFTkQKLQotCi0gICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU3MTYwZi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50ZXJfSV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvKioKLTsgKiAKLTsgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JX3MucwotOyAqIE9wZW5NQVggREw6IHYxLjAuMgotOyAqIFJldmlzaW9uOiAgIDk2NDEKLTsgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotOyAqIAotOyAqIAotOyAqIAotOyAqCi07ICogRGVzY3JpcHRpb246IAotOyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIGludGVyIHJlY29uc3RydWN0aW9uCi07ICogCi07ICoKLTsgKgotOyAqCi07ICoKLTsgKiBGdW5jdGlvbjogb214VkNNNFAyX1F1YW50SW52SW50ZXJfSQotOyAqCi07ICogRGVzY3JpcHRpb246Ci07ICogUGVyZm9ybXMgaW52ZXJzZSBxdWFudGl6YXRpb24gb24gaW50cmEvaW50ZXIgY29kZWQgYmxvY2suCi07ICogVGhpcyBmdW5jdGlvbiBzdXBwb3J0cyBiaXRzX3Blcl9waXhlbCA9IDguIE1pc21hdGNoIGNvbnRyb2wKLTsgKiBpcyBwZXJmb3JtZWQgZm9yIHRoZSBmaXJzdCBNUEVHLTQgbW9kZSBpbnZlcnNlIHF1YW50aXphdGlvbiBtZXRob2QuCi07ICogVGhlIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIGNsaXBwZWQgdG8gdGhlIHJhbmdlOiBbLTIwNDgsIDIwNDddLgotOyAqIE1pc21hdGNoIGNvbnRyb2wgaXMgcGVyZm9ybWVkIGZvciB0aGUgZmlyc3QgaW52ZXJzZSBxdWFudGl6YXRpb24gbWV0aG9kLgotOyAqCi07ICogUmVtYXJrczoKLTsgKgotOyAqIFBhcmFtZXRlcnM6Ci07ICogW2luXSBwU3JjRHN0ICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGlucHV0IChxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrLiBNdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4KLTsgKiBbaW5dIFFQICAgICAgICAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIChxdWFudGlzZXJfc2NhbGUpCi07ICogW2luXSB2aWRlb0NvbXAgICAgICAoSW50cmEgdmVyc2lvbiBvbmx5LikgVmlkZW8gY29tcG9uZW50IHR5cGUgb2YgdGhlCi07ICogICAgICAgICAgICAgICAgICBjdXJyZW50IGJsb2NrLiBUYWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyBmbGFnczoKLTsgKiAgICAgICAgICAgICAgICAgIE9NWF9WQ19MVU1JTkFOQ0UsIE9NWF9WQ19DSFJPTUlOQU5DRSwKLTsgKiAgICAgICAgICAgICAgICAgIE9NWF9WQ19BTFBIQS4KLTsgKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgYSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOwotOyAqICAgICAgICAgICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIG1vZGUsCi07ICogICAgICAgICAgICAgICAgICBhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbmxpbmVhciBpbnRyYSBEQyBtb2RlLgotOyAqIFtvdXRdICAgIHBTcmNEc3QgICAgICBwb2ludGVyIHRvIHRoZSBvdXRwdXQgKGRlcXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jay4gIE11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLgotOyAqCi07ICogUmV0dXJuIFZhbHVlOgotOyAqIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvcgotOyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cwotOyAqICAgIC0gSWYgcFNyY0RzdCBpcyBOVUxMIG9yIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuCi07ICogICAgICBvcgotOyAqICAgIC0gSWYgUVAgPD0gMC4KLTsgKiAgICAgIG9yCi07ICogICAgLSB2aWRlb0NvbXAgaXMgbm9uZSBvZiBPTVhfVkNfTFVNSU5BTkNFLCBPTVhfVkNfQ0hST01JTkFOQ0UgYW5kIE9NWF9WQ19BTFBIQS4KLTsgKgotOyAqLwotCi0gICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgSU5DTFVERSBhcm1DT01NX3MuaAotCi0gICBNX1ZBUklBTlRTIEFSTTExMzZKUwotCi0gICAgICAgICAKLQotICAgICBJRiBBUk0xMTM2SlMKLQotOy8vSW5wdXQgQXJndW1lbnRzCi1wU3JjRHN0ICAgICAgICAgICAgUk4gMAotUVAgICAgICAgICAgICAgICAgIFJOIDEKLQotOy8vTG9jYWwgVmFyaWFibGVzCi1SZXR1cm4gICAgICAgICAgICAgUk4gMAotQ291bnQgICAgICAgICAgICAgIFJOIDQgICAgICAKLXRlbXBWYWwyMSAgICAgICAgICBSTiAyCi10ZW1wVmFsNDMgICAgICAgICAgUk4gMwotUVAxICAgICAgICAgICAgICAgIFJOIDUKLVgyICAgICAgICAgICAgICAgICBSTiA2Ci1YMyAgICAgICAgICAgICAgICAgUk4gMTQKLVJlc3VsdDEgICAgICAgICAgICBSTiA4Ci1SZXN1bHQyICAgICAgICAgICAgUk4gOQotdHdvICAgICAgICAgICAgICAgIFJOIDcKLQotICAgIE1fU1RBUlQgb214VkNNNFAyX1F1YW50SW52SW50ZXJfSSxyOQotICAgICAgIAotICAgICAgICBNT1YgICAgICBDb3VudCwjNjQKLSAgICAgICAgVFNUICAgICAgUVAsIzEKLSAgICAgICAgTERSRCAgICAgdGVtcFZhbDIxLFtwU3JjRHN0XSAgICAgIDsvLyBMb2FkcyBmaXJzdCB0d28gdmFsdWVzIG9mIHBTcmNEc3QgdG8gdGVtcFZhbDIxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIG5leHQgdHdvIHZhbHVlcyB0byB0ZW1wVmFsNDMKLSAgICAgICAgU1VCRVEgICAgUVAxLFFQLCMxICAgICAgICAgICAgICAgIDsvLyBRUDE9UVAgaWYgUVAgaXMgb2RkICwgUVAxPVFQLTEgaWYgUVAgaXMgZXZlbgotICAgICAgICBNT1ZORSAgICBRUDEsUVAKLSAgICAgICAgTU9WICAgICAgdHdvLCMyCi0gICAgICAgIAotICAgICAgICAKLQotTG9vcAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFNNVUxCQiAgIFgyLHRlbXBWYWwyMSx0d28gICAgICAgICA7Ly8gWDI9IGZpcnN0IHZhbChsb3dlciAxNiBiaXRzIG9mIHRhbXBWYWwyMSkqMgotICAgICAgICBDTVAgICAgICBYMiwjMAotICAgICAgICAKLSAgICAgICAgUlNCTFQgICAgWDIsWDIsIzAgICAgICAgICAgICAgICAgIDsvLyBYMj1hYnNvbHV0ZXZhbChmaXJzdCB2YWwpCi0gICAgICAgIFNNTEFCQk5FIFgyLFFQLFgyLFFQMSAgICAgICAgICAgICA7Ly8gWDI9MiphYnN2YWwoZmlyc3QgdmFsKSpRUCtRUCBpZiBRUCBpcyBvZGQgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gWDI9MiphYnN2YWwoZmlyc3QgdmFsKSpRUCtRUC0xIGlmIFFQIGlzIGV2ZW4gCi0gICAgICAgIFNNVUxUQiAgIFgzLHRlbXBWYWwyMSx0d28gICAgICAgICA7Ly8gWDM9IHNlY29uZCB2YWwodG9wIDE2IGJpdHMgb2YgdGFtcFZhbDIxKSoyCi0gICAgICAgIFJTQkxUICAgIFgyLFgyLCMwCi0gICAgICAgIAotICAgICAgICBDTVAgICAgICBYMywjMAotICAgICAgICAgICAgICAgCi0gICAgICAgIFJTQkxUICAgIFgzLFgzLCMwCi0gICAgICAgIFNNTEFCQk5FIFgzLFFQLFgzLFFQMQotICAgICAgICAKLSAgICAgICAgUlNCTFQgICAgWDMsWDMsIzAKLSAgICAgICAgUEtIQlQgICAgUmVzdWx0MSxYMixYMyxMU0wgIzE2ICAgIDsvLyBSZXN1bHQxWzAtMTVdPVgyWzAtMTVdLFJlc3VsdDFbMTYtMzFdPVgzWzE2LTMxXQotICAgICAgICBTTVVMQkIgICBYMix0ZW1wVmFsNDMsdHdvICAgICAgICAgOy8vIFgyPSBmaXJzdCB2YWwobG93ZXIgMTYgYml0cyBvZiB0YW1wVmFsNDMpKjIKLSAgICAgICAgU1NBVDE2ICAgUmVzdWx0MSwjMTIsUmVzdWx0MSAgICAgIDsvLyBjbGlwIHRvIHJhbmdlIFstMjA0OCwyMDQ3XQotICAgICAgICBDTVAgICAgICBYMiwjMAotICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgIAotICAgICAgICBSU0JMRSAgICBYMixYMiwjMAotICAgICAgICBTTUxBQkJORSBYMixRUCxYMixRUDEKLSAgICAgICAgU01VTFRCICAgWDMsdGVtcFZhbDQzLHR3byAgICAgICAgIDsvLyBYMj0gZmlyc3QgdmFsKHRvcCAxNiBiaXRzIG9mIHRhbXBWYWwyMSkqMgotICAgICAgICBSU0JMVCAgICBYMixYMiwjMAotICAgICAgICBDTVAgICAgICBYMywjMAotICAgICAgICAKLSAgICAgICAgTERSRCAgICAgdGVtcFZhbDIxLFtwU3JjRHN0LCM4XSAgIDsvLyBMb2FkIG5leHQgZm91ciBWYWx1ZXMgdG8gdGVtcFZhbDIxLHRlbXBWYWw0MwotICAgICAgICAgICAgICAgIAotICAgICAgICBSU0JMVCAgICBYMyxYMywjMAotICAgICAgICBTTUxBQkJORSBYMyxRUCxYMyxRUDEKLSAgICAgICAgUlNCTFQgICAgWDMsWDMsIzAKLSAgICAgICAgUEtIQlQgICAgUmVzdWx0MixYMixYMyxMU0wgIzE2ICAgIDsvLyBSZXN1bHQyWzAtMTVdPVgyWzAtMTVdLFJlc3VsdDJbMTYtMzFdPVgzWzAtMTVdCi0gICAgICAgIFNTQVQxNiAgIFJlc3VsdDIsIzEyLFJlc3VsdDIgICAgICA7Ly8gY2xpcCB0byByYW5nZSBbLTIwNDgsMjA0N10KLSAgICAgICAgCi0gICAgICAgIFNVQlMgICAgIENvdW50LENvdW50LCM0ICAgICAgICAgICA7Ly8gRGVjcmVtZW50IENvdW50IGJ5IDQgYW5kIGNvbnRpbnVlIGlmIGl0IGhhcyBub3QgcmVhY2hlZCAwICAgICAgICAgCi0gICAgICAgIFNUUkQgICAgIFJlc3VsdDEsW3BTcmNEc3RdLCM4ICAgICA7Ly8gU3RvcmUgRG91YmxlIHdvcmRzIGFuZCBpbmNyZW1lbnQgdGhlIHBvaW50ZXIgdG8gcG9pbnQgdGhlIG5leHQgc3RvcmUgYWRkcmVzcwotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAKLSAgICAgICAgQkdUICAgICAgTG9vcAotICAgICAgICAKLSAgICAgICAgTU9WICAgICAgUmV0dXJuLCNPTVhfU3RzX05vRXJyCi0gICAgICAgIAotICAgICAgICBNX0VORAotICAgICAgICBFTkRJRiAgICAgICAgCi0gICAgICAgIEVORAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50cmFfSV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50cmFfSV9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkODJkYTQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludHJhX0lfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07LyoqCi07ICogCi07ICogRmlsZSBOYW1lOiAgb214VkNNNFAyX1F1YW50SW52SW50cmFfSV9zLnMKLTsgKiBPcGVuTUFYIERMOiB2MS4wLjIKLTsgKiBSZXZpc2lvbjogICA5NjQxCi07ICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsgKiAKLTsgKiAKLTsgKiAKLTsgKgotOyAqIERlc2NyaXB0aW9uOiAKLTsgKiBDb250YWlucyBtb2R1bGVzIGZvciBpbnRlciByZWNvbnN0cnVjdGlvbgotOyAqIAotOyAqCi07ICoKLTsgKgotOyAqCi07ICogCi07ICogRnVuY3Rpb246IG9teFZDTTRQMl9RdWFudEludkludHJhX0kKLTsgKgotOyAqIERlc2NyaXB0aW9uOgotOyAqIFBlcmZvcm1zIGludmVyc2UgcXVhbnRpemF0aW9uIG9uIGludHJhL2ludGVyIGNvZGVkIGJsb2NrLgotOyAqIFRoaXMgZnVuY3Rpb24gc3VwcG9ydHMgYml0c19wZXJfcGl4ZWwgPSA4LiBNaXNtYXRjaCBjb250cm9sCi07ICogaXMgcGVyZm9ybWVkIGZvciB0aGUgZmlyc3QgTVBFRy00IG1vZGUgaW52ZXJzZSBxdWFudGl6YXRpb24gbWV0aG9kLgotOyAqIFRoZSBvdXRwdXQgY29lZmZpY2llbnRzIGFyZSBjbGlwcGVkIHRvIHRoZSByYW5nZTogWy0yMDQ4LCAyMDQ3XS4KLTsgKiBNaXNtYXRjaCBjb250cm9sIGlzIHBlcmZvcm1lZCBmb3IgdGhlIGZpcnN0IGludmVyc2UgcXVhbnRpemF0aW9uIG1ldGhvZC4KLTsgKgotOyAqIFJlbWFya3M6Ci07ICoKLTsgKiBQYXJhbWV0ZXJzOgotOyAqIFtpbl0gICAgcFNyY0RzdCAgICAgICAgcG9pbnRlciB0byB0aGUgaW5wdXQgKHF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2suIE11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLgotOyAqIFtpbl0gICAgUVAgICAgICAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIChxdWFudGlzZXJfc2NhbGUpCi07ICogW2luXSAgICB2aWRlb0NvbXAgICAgICAgICAgKEludHJhIHZlcnNpb24gb25seS4pIFZpZGVvIGNvbXBvbmVudCB0eXBlIG9mIHRoZQotOyAqICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJsb2NrLiBUYWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyBmbGFnczoKLTsgKiAgICAgICAgICAgICAgICAgICAgT01YX1ZDX0xVTUlOQU5DRSwgT01YX1ZDX0NIUk9NSU5BTkNFLAotOyAqICAgICAgICAgICAgICAgICAgICBPTVhfVkNfQUxQSEEuCi07ICogW2luXSAgICBzaG9ydFZpZGVvSGVhZGVyICBhIGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7Ci07ICogICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIG1vZGUsCi07ICogICAgICAgICAgICAgICAgICAgIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9ubGluZWFyIGludHJhIERDIG1vZGUuCi07ICogW291dF0gICAgcFNyY0RzdCAgICAgICAgcG9pbnRlciB0byB0aGUgb3V0cHV0IChkZXF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2suICBNdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4KLTsgKgotOyAqIFJldHVybiBWYWx1ZToKLTsgKiBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IKLTsgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMKLTsgKiAgICAtICAgIElmIHBTcmNEc3QgaXMgTlVMTCBvciBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLgotOyAqICAgICAgb3IKLTsgKiAgICAtIElmIFFQIDw9IDAuCi07ICogICAgICBvcgotOyAqICAgIC0gdmlkZW9Db21wIGlzIG5vbmUgb2YgT01YX1ZDX0xVTUlOQU5DRSwgT01YX1ZDX0NIUk9NSU5BTkNFIGFuZCBPTVhfVkNfQUxQSEEuCi07ICoKLSAKLQotICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgIAotICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLSAgIAotICAgCi0gICBJTVBPUlQgICAgICAgIGFybVZDTTRQMl9EQ1NjYWxlcgotIAotICAgICAgICAgCi0KLSAgICAgSUYgQVJNMTEzNkpTCi0KLTsvL0lucHV0IEFyZ3VtZW50cwotcFNyY0RzdCAgICAgICAgICAgIFJOIDAKLVFQICAgICAgICAgICAgICAgICBSTiAxCi12aWRlb0NvbXAgICAgICAgICAgUk4gMgotc2hvcnRWaWRlb0hlYWRlciAgIFJOIDMKLQotOy8vTG9jYWwgVmFyaWFibGVzCi1SZXR1cm4gICAgICAgICAgICAgUk4gMAotZGNTY2FsZXIgICAgICAgICAgIFJOIDQKLXRlbXAgICAgICAgICAgICAgICBSTiAxMgotaW5kZXggICAgICAgICAgICAgIFJOIDYKLSAgICAgIAotdGVtcFZhbDIxICAgICAgICAgIFJOIDQKLXRlbXBWYWw0MyAgICAgICAgICBSTiA1Ci1RUDEgICAgICAgICAgICAgICAgUk4gNgotWDIgICAgICAgICAgICAgICAgIFJOIDcKLVgzICAgICAgICAgICAgICAgICBSTiAxNAotUmVzdWx0MSAgICAgICAgICAgIFJOIDgKLVJlc3VsdDIgICAgICAgICAgICBSTiA5Ci10d28gICAgICAgICAgICAgICAgUk4gMTAKLUNvdW50ICAgICAgICAgICAgICBSTiAxMQotCi0KLQotICAgCi0gICAgTV9TVEFSVCBvbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JLHIxMQotCi0KLSAgICAgICAgCi0gICAgICAgIDsvLyBQZXJmb3JtIEludmVyc2UgUXVhbnRpemF0aW9uIGZvciBEQyBjb2VmZmljaWVudAotCi0gICAgICAgIFRFUSAgICAgICBzaG9ydFZpZGVvSGVhZGVyLCMwICAgICAgOy8vIFRlc3QgaWYgc2hvcnQgVmlkZW8gSGVhZGVyIGZsYWcgPTAgICAgICAgICAgICAgCi0gICAgICAgIE1PVk5FICAgICBkY1NjYWxlciwjOCAgICAgICAgICAgICAgOy8vIGlmIHNob3J0VmlkZW9IZWFkZXIgaXMgbm9uIHplcm8gZGNTY2FsZXI9OAotICAgICAgICBCTkUgICAgICAgY2FsRENWYWwKLSAgICAgICAgTERSICAgICAgIGluZGV4LCA9YXJtVkNNNFAyX0RDU2NhbGVyCi0gICAgICBBREQgICAgICAgaW5kZXgsaW5kZXgsdmlkZW9Db21wLExTTCAjNQotICAgICAgTERSQiAgICAgIGRjU2NhbGVyLFtpbmRleCxRUF0KLQotCi0gICAgICAgIDsvL01fQ2FsRENTY2FsYXIgIHNob3J0VmlkZW9IZWFkZXIsdmlkZW9Db21wLCBRUAotCi1jYWxEQ1ZhbAotCi0gICAgICAgIExEUkggICAgIHRlbXAsW3BTcmNEc3RdCi0gICAgICAgIFNNVUxCQiAgIHRlbXAsdGVtcCxkY1NjYWxlciAgICAgICA7Ly8gZGNDb2VmZiA9IGRjU2NhbGVyICogUXVhbnRpemVkIERDIGNvZWZmaWNpZW50KGZyb20gbWVtb3J5KQotICAgICAgICBTU0FUICAgICB0ZW1wLCMxMix0ZW1wICAgICAgICAgICAgOy8vIFNhdHVyYXRpbmcgdG8gMTIgYml0cwotICAgICAgICAKLQotICAgICAgICBNT1YgICAgICBDb3VudCwjNjQKLSAgICAgICAgVFNUICAgICAgUVAsIzEKLSAgICAgICAgTERSRCAgICAgdGVtcFZhbDIxLFtwU3JjRHN0XSAgICAgIDsvLyBMb2FkcyBmaXJzdCB0d28gdmFsdWVzIG9mIHBTcmNEc3QgdG8gdGVtcFZhbDIxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIG5leHQgdHdvIHZhbHVlcyB0byB0ZW1wVmFsNDMKLSAgICAgICAgU1VCRVEgICAgUVAxLFFQLCMxICAgICAgICAgICAgICAgIDsvLyBRUDE9UVAgaWYgUVAgaXMgb2RkICwgUVAxPVFQLTEgaWYgUVAgaXMgZXZlbgotICAgICAgICBNT1ZORSAgICBRUDEsUVAKLSAgICAgICAgTU9WICAgICAgdHdvLCMyCi0KLQotICAgICAgICAgICAgICAgIAotICAgICAgICAKLQotTG9vcAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFNNVUxCQiAgIFgyLHRlbXBWYWwyMSx0d28gICAgICAgICA7Ly8gWDI9IGZpcnN0IHZhbChsb3dlciAxNiBiaXRzIG9mIHRhbXBWYWwyMSkqMgotICAgICAgICBDTVAgICAgICBYMiwjMAotICAgICAgICAKLSAgICAgICAgUlNCTFQgICAgWDIsWDIsIzAgICAgICAgICAgICAgICAgIDsvLyBYMj1hYnNvbHV0ZXZhbChmaXJzdCB2YWwpCi0gICAgICAgIFNNTEFCQk5FIFgyLFFQLFgyLFFQMSAgICAgICAgICAgICA7Ly8gWDI9MiphYnN2YWwoZmlyc3QgdmFsKSpRUCtRUCBpZiBRUCBpcyBvZGQgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gWDI9MiphYnN2YWwoZmlyc3QgdmFsKSpRUCtRUC0xIGlmIFFQIGlzIGV2ZW4gCi0gICAgICAgIFNNVUxUQiAgIFgzLHRlbXBWYWwyMSx0d28gICAgICAgICA7Ly8gWDM9IHNlY29uZCB2YWwodG9wIDE2IGJpdHMgb2YgdGFtcFZhbDIxKSoyCi0gICAgICAgIFJTQkxUICAgIFgyLFgyLCMwCi0gICAgICAgIAotICAgICAgICBDTVAgICAgICBYMywjMAotICAgICAgICAgICAgICAgCi0gICAgICAgIFJTQkxUICAgIFgzLFgzLCMwCi0gICAgICAgIFNNTEFCQk5FIFgzLFFQLFgzLFFQMQotICAgICAgICAKLSAgICAgICAgUlNCTFQgICAgWDMsWDMsIzAKLSAgICAgICAgUEtIQlQgICAgUmVzdWx0MSxYMixYMyxMU0wgIzE2ICAgIDsvLyBSZXN1bHQxWzAtMTVdPVgyWzAtMTVdLFJlc3VsdDFbMTYtMzFdPVgzWzE2LTMxXQotICAgICAgICBTTVVMQkIgICBYMix0ZW1wVmFsNDMsdHdvICAgICAgICAgOy8vIFgyPSBmaXJzdCB2YWwobG93ZXIgMTYgYml0cyBvZiB0YW1wVmFsNDMpKjIKLSAgICAgICAgU1NBVDE2ICAgUmVzdWx0MSwjMTIsUmVzdWx0MSAgICAgIDsvLyBjbGlwIHRvIHJhbmdlIFstMjA0OCwyMDQ3XQotICAgICAgICBDTVAgICAgICBYMiwjMAotICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgIAotICAgICAgICBSU0JMRSAgICBYMixYMiwjMAotICAgICAgICBTTUxBQkJORSBYMixRUCxYMixRUDEKLSAgICAgICAgU01VTFRCICAgWDMsdGVtcFZhbDQzLHR3byAgICAgICAgIDsvLyBYMj0gZmlyc3QgdmFsKHRvcCAxNiBiaXRzIG9mIHRhbXBWYWwyMSkqMgotICAgICAgICBSU0JMVCAgICBYMixYMiwjMAotICAgICAgICBDTVAgICAgICBYMywjMAotICAgICAgICAKLSAgICAgICAgTERSRCAgICAgdGVtcFZhbDIxLFtwU3JjRHN0LCM4XSAgIDsvLyBMb2FkIG5leHQgZm91ciBWYWx1ZXMgdG8gdGVtcFZhbDIxLHRlbXBWYWw0MwotICAgICAgICAgICAgICAgIAotICAgICAgICBSU0JMVCAgICBYMyxYMywjMAotICAgICAgICBTTUxBQkJORSBYMyxRUCxYMyxRUDEKLSAgICAgICAgUlNCTFQgICAgWDMsWDMsIzAKLSAgICAgICAgUEtIQlQgICAgUmVzdWx0MixYMixYMyxMU0wgIzE2ICAgIDsvLyBSZXN1bHQyWzAtMTVdPVgyWzAtMTVdLFJlc3VsdDJbMTYtMzFdPVgzWzE2LTMxXQotICAgICAgICBTU0FUMTYgICBSZXN1bHQyLCMxMixSZXN1bHQyICAgICAgOy8vIGNsaXAgdG8gcmFuZ2UgWy0yMDQ4LDIwNDddCi0gICAgICAgIAotICAgICAgICBTVUJTICAgICBDb3VudCxDb3VudCwjNCAgICAgICAgICAgOy8vIERlY3JlbWVudCBDb3VudCBieSA0IGFuZCBjb250aW51ZSBpZiBpdCBoYXMgbm90IHJlYWNoZWQgMCAgICAgICAgIAotICAgICAgICBTVFJEICAgICBSZXN1bHQxLFtwU3JjRHN0XSwjOCAgICAgOy8vIFN0b3JlIERvdWJsZSB3b3JkcyBhbmQgaW5jcmVtZW50IHRoZSBwb2ludGVyIHRvIHBvaW50IHRoZSBuZXh0IHN0b3JlIGFkZHJlc3MKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgCi0gICAgICAgIEJHVCAgICAgIExvb3AKLQotICAgICAgICBTVUIgICAgICBwU3JjRHN0LHBTcmNEc3QsIzEyOAotICAgICAgICAKLSAgICAgICAgOy8vIFN0b3JpbmcgdGhlIEludmVyc2UgUXVhbnRpemVkIERDIGNvZWZmaWNpZW50Ci0KLSAgICAgICAgU1RSSCAgICAgdGVtcCxbcFNyY0RzdF0sIzIKLSAgICAgICAgCi0gIAotICAgICAgICAKLSAgICAgICAgTU9WICAgICAgUmV0dXJuLCNPTVhfU3RzX05vRXJyCi0gICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIE1fRU5ECi0gICAgICAgIEVORElGICAgICAgICAKLSAgICAgICAgRU5ECi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9zcmMvYXJtVkNfVmVyc2lvbi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL3NyYy9hcm1WQ19WZXJzaW9uLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkOTM2ODEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL3NyYy9hcm1WQ19WZXJzaW9uLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybUNPTU1fVmVyc2lvbi5oIgotCi0jaWZkZWYgQVJNX0lOQ0xVREVfVkVSU0lPTl9ERVNDUklQVElPTlMKLWNvbnN0IGNoYXIgKiBjb25zdCBvbXhWQ19WZXJzaW9uRGVzY3JpcHRpb24gPSAiQVJNIE9wZW5NQVggREwgdiIgQVJNX1ZFUlNJT05fU1RSSU5HICIgICBSZWw9IiBPTVhfQVJNX1JFTEVBU0VfVEFHICIgICBBcmNoPSIgT01YX0FSTV9CVUlMRF9BUkNISVRFQ1RVUkUgIiAgIFRvb2xzPSIgIE9NWF9BUk1fQlVJTERfVE9PTENIQUlOIDsKLSNlbmRpZiAvKiBBUk1fSU5DTFVERV9WRVJTSU9OX0RFU0NSSVBUSU9OUyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL0FSTV9ERUxJVkVSWS5UWFQgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vQVJNX0RFTElWRVJZLlRYVApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MyZDcwYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vQVJNX0RFTElWRVJZLlRYVAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLVRoZSBjb250ZW50cyBvZiB0aGlzIHRyYW5zYWN0aW9uIHdhcyBjcmVhdGVkIGJ5IEhlZGxleSBGcmFuY2lzCi1vZiBBUk0gb24gMTktRmViLTIwMDguCi0KLUl0IGNvbnRhaW5zIHRoZSBBUk0gZGF0YSB2ZXJzaW9ucyBsaXN0ZWQgYmVsb3cuCi0KLVRoaXMgZGF0YSwgdW5sZXNzIG90aGVyd2lzZSBzdGF0ZWQsIGlzIEFSTSBQcm9wcmlldGFyeSBhbmQgYWNjZXNzIHRvIGl0Ci1pcyBzdWJqZWN0IHRvIHRoZSBhZ3JlZW1lbnRzIGluZGljYXRlZCBiZWxvdy4KLQotSWYgeW91IGV4cGVyaWVuY2UgcHJvYmxlbXMgd2l0aCB0aGlzIGRhdGEsIHBsZWFzZSBjb250YWN0IEFSTSBzdXBwb3J0Ci1xdW90aW5nIHRyYW5zYWN0aW9uIHJlZmVyZW5jZSA8OTc0MTQ+LgotCi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCi0KLS0gT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEKLSAgVmlkZW8gY29kZWNzIC0gb3B0aW1pc2VkIGNvZGUKLSAgVjcgY29kZSByZWxlYXNlIGZvciBIYW50cm8gKFZlciAxLjAuMikKLSAgaW50ZXJuYWwgYWNjZXNzCi0KLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0KLQotVGhpcyB0cmFuc2FjdGlvbiBjb250YWlucyBkZWxpdmVyYWJsZXMgd2hpY2ggYXJlIGRlc2lnbmF0ZWQgYXMgYmVpbmcgb2YKLWJldGEgcmVsZWFzZSBzdGF0dXMgKEJFVCkuCi0KLUJldGEgcmVsZWFzZSBzdGF0dXMgaGFzIGEgcGFydGljdWxhciBtZWFuaW5nIHRvIEFSTSBvZiB3aGljaCB0aGUgcmVjaXBpZW50Ci1tdXN0IGJlIGF3YXJlLiBCZXRhIGlzIGEgcHJlLXJlbGVhc2Ugc3RhdHVzIGluZGljYXRpbmcgdGhhdCB0aGUgZGVsaXZlcmFibGUKLXNvIGRlc2NyaWJlZCBpcyBiZWxpZXZlZCB0byByb2J1c3RseSBkZW1vbnN0cmF0ZSBzcGVjaWZpZWQgYmVoYXZpb3VyLCB0byBiZQotY29uc2lzdGVudCBhY3Jvc3MgaXRzIGluY2x1ZGVkIGFzcGVjdHMgYW5kIGJlIHJlYWR5IGZvciBnZW5lcmFsIGRlcGxveW1lbnQuCi1CdXQgQmV0YSBhbHNvIGluZGljYXRlcyB0aGF0IHByZS1yZWxlYXNlIHJlbGlhYmlsaXR5IHRyaWFscyBhcmUgb25nb2luZyBhbmQKLXRoYXQgaXQgaXMgcG9zc2libGUgcmVzaWR1YWwgZGVmZWN0cyBvciBlcnJvcnMgaW4gb3BlcmF0aW9uLCBjb25zaXN0ZW5jeQotYW5kIGRvY3VtZW50YXRpb24gbWF5IHN0aWxsIGJlIGVuY291bnRlcmVkLiBUaGUgcmVjaXBpZW50IHNob3VsZCBjb25zaWRlcgotdGhpcyBwb3NpdGlvbiB3aGVuIHVzaW5nIHRoaXMgQmV0YSBtYXRlcmlhbCBzdXBwbGllZC4gQVJNIHdpbGwgbm9ybWFsbHkKLWF0dGVtcHQgdG8gcHJvdmlkZSBmaXhlcyBvciBhIHdvcmstYXJvdW5kIGZvciBkZWZlY3RzIGlkZW50aWZpZWQgYnkgdGhlCi1yZWNpcGllbnQsIGJ1dCB0aGUgcHJvdmlzaW9uIG9yIHRpbWVsaW5lc3Mgb2YgdGhpcyBzdXBwb3J0IGNhbm5vdCBiZQotZ3VhcmFudGVlZC4gQVJNIHNoYWxsIG5vdCBiZSByZXNwb25zaWJsZSBmb3IgZGlyZWN0IG9yIGNvbnNlcXVlbnRpYWwKLWRhbWFnZXMgYXMgYSByZXN1bHQgb2YgZW5jb3VudGVyaW5nIG9uZSBvciBtb3JlIG9mIHRoZXNlIHJlc2lkdWFsIGRlZmVjdHMuCi1CeSBhY2NlcHRpbmcgYSBCZXRhIHJlbGVhc2UsIHRoZSByZWNpcGllbnQgYWdyZWVzIHRvIHRoZXNlIGNvbnN0cmFpbnRzIGFuZAotdG8gcHJvdmlkaW5nIHJlYXNvbmFibGUgaW5mb3JtYXRpb24gdG8gQVJNIHRvIGVuYWJsZSB0aGUgcmVwbGljYXRpb24gb2YgdGhlCi1kZWZlY3RzIGlkZW50aWZpZWQgYnkgdGhlIHJlY2lwaWVudC4gVGhlIHNwZWNpZmljIEJldGEgdmVyc2lvbiBzdXBwbGllZAotd2lsbCBub3QgYmUgc3VwcG9ydGVkIGFmdGVyIHJlbGVhc2Ugb2YgYSBsYXRlciBvciBoaWdoZXIgc3RhdHVzIHZlcnNpb24uCi1JdCBzaG91bGQgYmUgbm90ZWQgdGhhdCBTdXBwb3J0IGZvciB0aGUgQmV0YSByZWxlYXNlIG9mIHRoZSBkZWxpdmVyYWJsZQotd2lsbCBvbmx5IGJlIHByb3ZpZGVkIGJ5IEFSTSB0byBhIHJlY2lwaWVudCB3aG8gaGFzIGEgY3VycmVudCBzdXBwb3J0IGFuZAotbWFpbnRlbmFuY2UgY29udHJhY3QgZm9yIHRoZSBkZWxpdmVyYWJsZS4KLQotCi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCi0KLUluIGFkZGl0aW9uIHRvIHRoZSBkYXRhIHZlcnNpb25zIGxpc3RlZCBhYm92ZSwgdGhpcyB0cmFuc2FjdGlvbiBjb250YWlucwotdHdvIGFkZGl0aW9uYWwgZmlsZXMgYXQgdGhlIHRvcCBsZXZlbC4KLQotVGhlIGZpcnN0IGlzIHRoaXMgZmlsZSwgQVJNX0RFTElWRVJZXzk3NDE0LlRYVCwgd2hpY2ggaXMgdGhlIGRlbGl2ZXJ5Ci1ub3RlLgotCi1UaGUgc2Vjb25kIGlzIEFSTV9NQU5JRkVTVF85NzQxNC5UWFQgd2hpY2ggY29udGFpbnMgYSBtYW5pZmVzdCBvZiBhbGwgdGhlCi1maWxlcyBpbmNsdWRlZCBpbiB0aGlzIHRyYW5zYWN0aW9uLCB0b2dldGhlciB3aXRoIHRoZWlyIGNoZWNrc3Vtcy4KLQotVGhlIGNoZWNrc3VtcyBwcm92aWRlZCBhcmUgY2FsY3VsYXRlZCB1c2luZyB0aGUgUlNBIERhdGEgU2VjdXJpdHksIEluYy4KLU1ENSBNZXNzYWdlLURpZ2VzdCBBbGdvcml0aG0uCi0KLVRoZSBjaGVja3N1bXMgY2FuIGJlIHVzZWQgdG8gdmVyaWZ5IHRoZSBpbnRlZ3JpdHkgb2YgdGhpcyBkYXRhIHVzaW5nIHRoZQotIm1kNXN1bSIgdG9vbCAod2hpY2ggaXMgcGFydCBvZiB0aGUgR05VICJ0ZXh0dXRpbHMiIHBhY2thZ2UpIGJ5IHJ1bm5pbmc6Ci0KLSAgJSBtZDVzdW0gLS1jaGVjayBBUk1fTUFOSUZFU1RfOTc0MTQuVFhUCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9BUk1fTUFOSUZFU1QuVFhUIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL0FSTV9NQU5JRkVTVC5UWFQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMTBmNjcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL0FSTV9NQU5JRkVTVC5UWFQKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0JCQkJICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS8KLQkJCQkgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS8KLWUwNDk3OTFjZmFiNjA2MGEwOGNiYWM3YjNhZDc2N2Q2ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvYXJtQ09NTV9zLmgKLWVkNzk4ZmFjZTI1NDk3YjI3MDNlZGU3MzZkNmQ1MmI2ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvb214dHlwZXNfcy5oCi00ZWViZDYzYWYwODczNzY4MTFkNjc0OWYwNjQ2Yjg2NCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybUNPTU1fQml0RGVjX3MuaAotNDNjZjQ2YzJjZjJmZTFmOTNjNjE1YjU3YmNiZTQ4MDkgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1DT01NLmgKLThmMjQ4Y2VhYWM4ZjYwMmUyNzdhNTIxYjY3OWRjYmJlICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvYXJtQ09NTV9JRENUVGFibGUuaAotOGFjNWZhODBlYTk4ZTM5MWY1NzMwYTM3NTI4MGI1YmQgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1DT01NX1ZlcnNpb24uaAotM2EyZjQyMGRkZjZhMWI5NTA0NzBiZDBmNWViZDVjNjIgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1DT01NX0lEQ1Rfcy5oCi01MTFjMGJiNTM0ZmUyMjM1OTllMmM4NGVmZjI0YzllZCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybUNPTU1fTWFza1RhYmxlLmgKLTg5NzE5MzJkNTZlZWQ2YjFhZDFiYTUwN2YwYmZmNWYwICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvYXJtQ09NTV9CaXRzdHJlYW0uaAotZjg3ZmVkZDljYTQzMmZlZmE3NTcwMDgxNzY4NjRlZjggIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1PTVguaAotOGU0OTg5OWE0Mjg4MjJjMzZlZjlkZDk0ZTBlMDVmMTggIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9vbXh0eXBlcy5oCi0zMjMwMDhiNzJlOWYwNDA5OWE4Y2I0MmU5OWExZmFjZSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvYnVpbGRfdmMucGwKLWU3MmQ5NmMwYTQxNTQ1OTc0OGRmOTgwN2YzZGFlNzJmICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS9maWxlbGlzdF92Yy50eHQKLQkJCQkgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3NyYy8KLTVlZWFlNjU5YTI5NDc3ZjVjNTIyOTZkMjRhZmZmZDNjICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS9zcmMvYXJtQ09NTV9JRENUVGFibGUuYwotZDY0Y2RjZjM4Zjc3NDlkYzdmNzc0NjVlNWI3ZDM1NmQgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3NyYy9hcm1DT01NX01hc2tUYWJsZS5jCi0JCQkJICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy8KLQkJCQkgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwLwotCQkJCSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjLwotZTdlMGMzMjA5Nzg1NjRhN2M5YjJjNzIzNzQ5YTk4ZDYgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmMKLTRhZGNkMGRmMDgxOTkwYmRmYzQ3MjkwNDFhMmE5MTUyICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jCi04NTJlMDQwNDE0Mjk2NWRjMWYzYWE3ZjAwZWU1MTI3YiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDRfcy5zCi03MDU0MTUxYzViZmVhNmI1ZTc0ZmVlZTg2YjJkN2IwMSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYwotNWY3MjEzYTRmMzc2MjdiM2M1OGY2Mjk0YmE0NzdlMzAgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5zCi0zMmZmNGI4YmU2MmUyZjBmM2U3NjRiODNjMWU1ZTJmZCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLmMKLWQwNjZlM2M4MWQ4MjYxNmYzN2VjMTgxMGVhNDllN2I3ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYV91bnNhZmVfcy5zCi1mZTYyOWEzZTlkNTUzOTVhNjA5OGJkZjI0MzFiNWYwMiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYV91bnNhZmVfcy5zCi01YjEzZmI5NTRiNzY3OWRlMjAwNzZiYjZhN2Y0ZWUxZCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX3MucwotMDFiYTYwZWZmNjZlYTQ5YTRmODMzY2U2Mjc5ZjhlMmYgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYwotZmExMDcyY2YxZDE3ZTk2NjZjOWYxZTIxNWZhMzAyYjEgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZV9zLnMKLWRiMzg3YjllNjZkMzI3ODdmNDdlZjljZjAzNDdkYTJhICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlX3MucwotZWE1MzdlNGUyYWQwM2ExOTQwOTgxMDU1ZmEzYWNlMDEgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZV9zLnMKLTI5YTQyODM4ODViOTQ3M2EzNTUwYTgxZWZmMjU1OWQyICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpcl9zLnMKLTJkZGNhZjYwYThlYTFlNmU2Yjc3NzM3Zjc2OGJmYjlkICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9RdWFudFRhYmxlc19zLnMKLWMzMDAyYWFkNTYwMGY4NzJiNzBhNWQ3ZmUzOTE1ODQ2ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQWxpZ25fdW5zYWZlX3MucwotYTI5MDBmMmM0N2YxYzYxZDIwYmQ2YzFlZGEzM2Q2ZDQgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5X3Vuc2FmZV9zLnMKLWM5MjFkZjczMzk3YTMyYzk0N2RjOTk2YmE2ODU4NTUzICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0X3MucwotMzc2OWUxNGYyZmMzZjUxNGQwMjVmZTZhYjczZmY2N2EgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcl9zLnMKLWMwMjlkMWNlYmVhMGEwOWUxZDIzNWEzN2UyMTU1MDAyICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSV9zLnMKLTA3NmEwMzNmODE2MTc1MGE2ODU3NTZmOWY1MWYwNGM5ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlX3MucwotYzViNWQyMjg0MjgyMmU2ZTVlMzEwOTQ4ODJjYmViNDYgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNl9zLnMKLWY2YmRmNmQ5MTRhNGExNDc5ZjUyNDk1MWEzNDA5ODQ2ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSV9zLnMKLWViZWIwNzEzYTliMmVhMjU5ODYzNjBlZjI2MjEzOGM0ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0lfcy5zCi03OGVkOWVhMjAwZmFhN2JlNjY1NDQ1YTcxMzg1OWFmMSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JX3MucwotYzJkOTk1Zjc4N2I2ZjQ0ZWYxMGM3NTFjMTJkMTkzNWYgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9EaWFnQ29weV91bnNhZmVfcy5zCi00MGJlZDY3OWE5ZjZlMGQzZWZlMjE2YjdkNGE5Y2Y0NSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OF9zLnMKLTRhNTJiM2U5ZTI2OGI4YThmMDc4MjliZjUwMGQwM2FmICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJfcy5zCi0xMTI0OWY4YTk4YzVkNGI4NGNiNTU3NWIwZTM3Y2E5YyAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQXZlcmFnZV80eF9BbGlnbl91bnNhZmVfcy5zCi0yNTEzYjYwNTU5YmE3MWFlNDk1YzYwNTNmYjc3OWZhOSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX3MucwotMmZiMWVlMTdjMzZlM2MxNDY5YzE3MGY2ZGFjMTFiZjEgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0X3MucwotY2M0YTZmMzJkYjBiNzJhOTFkM2YyNzhmNjg1NWRmNjkgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMuYwotCQkJCSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvYXBpLwotNmU1MzBkZGFhN2MyYjU3ZmZlODgxNjJjMDIwY2I2NjIgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL2FwaS9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmgKLQkJCQkgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvCi0JCQkJICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy8KLWJlYzZkZTM0OGIxMTM0Mzg0OTg4NjdiODY5MDAxNjIyICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQ2xpcDhfcy5zCi1kYmE5ODI0ZTk1OWIyMWQ0MDFjYWM5MjVlNjhhMTFhNiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcl9zLnMKLWRmYTdlNWI1ODAyN2JlMzU0MmRkYTA1OTNiNzdiMmQzICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JX3MucwotNGZiYTRjNDMxYTc4M2E3OGEyZWI2NDk3YTk0YWM5NjcgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMKLTM5OTkxOTYxMTc5Y2EwM2I2MzgxYjZlNjUzYjFmMTRiICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUNSZWNvbkJsb2NrX3MucwotMWIwYjI5OTBjMjY2OWRmYjg3Y2Y2YjgxMDYxMWMwMWIgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYwotMWM5Yjg3YWJmMzI4M2U5NTc4MTZiMzkzN2M2ODA3MDEgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QX3MucwotNGZlMWFmY2E2NTlhOTA1NWZjMTE3MmU1OGY3OGE1MDYgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEuYwotMmVhMDY3ZjA0MzZmOTFiYTEzNTFlZGFmNDExY2I0ZWEgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9Mb29rdXBfVGFibGVzLmMKLTZjZTM2M2FhZGM5ZDY1YzMwOGI0MGNjYTg5MDJlNGY2ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfSURDVDh4OGJsa19zLnMKLWJmMjEyZjc4Njc3MmFlZDJiYzcwNWQyMmZmNGU3NGY1ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRmluZE1WcHJlZF9zLnMKLTI5M2E0OGE2NDhhMzA4NTQ1NmU2NjY1YmI3MzY2ZmFkICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfU2V0UHJlZERpcl9zLnMKLTJiYjQ3ZWQ5YzllMjVjNTcwOWM2ZDliNGFkMzlhMzhhICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JX3MucwotNDM3ZGZhMjA0NTA4ODUwZDYxZDRiODcwOTE0NDZlOWYgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQ19zLnMKLWJjOTc3ODg5OGRkNDExMDFkYzBmYjAxMzllYWY4M2NjICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTENfcy5zCi1mYzE5MWVlYWU0M2Y4Y2U3MzVkYmQzMTFjYzdiY2I4ZCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYV9zLnMKLWEwZDg1ZjRmNTE3Yzk0NWE0YzkzMTdhYzAyMWYyZDA4ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZV9zLnMKLTM4NjAyMGRlZThiNzI1YzdmZTI1MjZmMWZjMjExZDdkICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLmMKLQkJCQkgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvYXBpLwotNDYyNGU3YzgzOGUxMGEyNDlhYmNjM2QzZjRmNDA3NDggIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvYXBpL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaAotNjVlMTA1N2QwNGUyY2I4NDQ1NTlkYzlmNmUwOTc5NWEgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvYXBpL2FybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgKLQkJCQkgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL3NyYy8KLWU2MjdiMzM0NmIwZGM5YWZmMTQ0NDYwMDVjZTBmYTQzICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9zcmMvYXJtVkNfVmVyc2lvbi5jCi0JCQkJICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9hcGkvCi03Y2E5NGIxYzMzYWMwMjExZTE3ZDM4YmFhZGQ3ZDFkZCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvYXBpL2FybVZDLmgKLTEyY2Y3NTk2ZWRiYmY2MDQ4YjYyNmQxNWU4ZDBlZDQ4ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9hcGkvb214VkMuaAotMTE3MjZlMjg2YTgxMjU3Y2I0NWY1NTQ3ZmI0ZDM3NGMgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2FwaS9vbXhWQ19zLmgKLWE1YjJhZjYwNWMzMTljZDI0OTEzMTllNDMwNzQxMzc3ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9hcGkvYXJtVkNDT01NX3MuaAotCQkJCSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS8KLQkJCQkgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2NvbW0vc3JjLwotMWY4MTE4N2I0ODQ4N2E4ZWE2ZGJjMzI3NjQ4ZTNlNGYgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5MTZ4MTZfcy5zCi05MzZkM2YyMDM4YTZmODYxM2VjMjVlNTBjYzYwMWZlOCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHk4eDhfcy5zCi04ZjY3MDhhMjQ5MTMwOTYyZTBiYzVjMDQ0YWM2ZGQ5MyAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvb214VkNDT01NX0V4cGFuZEZyYW1lX0lfcy5zCi1hYWI3NzEzNDE0NDI4ZTk1ZGUwYmE3OTlhMjY3OWIzNiAgQVJNX0RFTElWRVJZXzk3NDE0LlRYVApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk5Mjg4NS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU0uaAorKysgL2Rldi9udWxsCkBAIC0xLDgwMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtQ09NTS5oCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDEyMjkwCi0gKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLSAqIAotICogCi0gKiAKLSAqICAgCi0gKiBGaWxlOiBhcm1DT01NLmgKLSAqIEJyaWVmOiBEZWNsYXJlcyBDb21tb24gQVBJcy9EYXRhIFR5cGVzIHVzZWQgYWNyb3NzIE9wZW5NQVggQVBJJ3MKLSAqCi0gKi8KLSAKLSAgCi0jaWZuZGVmIF9hcm1Db21tb25fSF8KLSNkZWZpbmUgX2FybUNvbW1vbl9IXwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgT01YX0YzMiBSZTsgLyoqIFJlYWwgcGFydCAqLwotICBPTVhfRjMyIEltOyAvKiogSW1hZ2luYXJ5IHBhcnQgKi8JCi0gICAgICAgIAotfSBPTVhfRkMzMjsgLyoqIHNpbmdsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgY29tcGxleCBudW1iZXIgKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgT01YX0Y2NCBSZTsgLyoqIFJlYWwgcGFydCAqLwotICBPTVhfRjY0IEltOyAvKiogSW1hZ2luYXJ5IHBhcnQgKi8JCi0gICAgICAgIAotfSBPTVhfRkM2NDsgLyoqIGRvdWJsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgY29tcGxleCBudW1iZXIgKi8KLQotCi0vKiBVc2VkIGJ5IGJvdGggSVAgYW5kIElDIGRvbWFpbnMgZm9yIDh4OCBKUEVHIGJsb2Nrcy4gKi8KLXR5cGVkZWYgT01YX1MxNiBBUk1fQkxPQ0s4eDhbNjRdOwotCi0KLSNpbmNsdWRlICJhcm1PTVguaCIKLQotI2RlZmluZSAgYXJtUEkgKE9NWF9GNjQpKDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYyNjQzMzgzMjc5NSkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBDb21waWxlciBleHRlbnNpb25zICovCi0jaWZkZWYgQVJNX0RFQlVHCi0vKiBkZWJ1ZyB2ZXJzaW9uICovCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNkZWZpbmUgYXJtRXJyb3Ioc3RyKSB7cHJpbnRmKChzdHIpKTsgcHJpbnRmKCJcbiIpOyBleGl0KC0xKTt9Ci0jZGVmaW5lIGFybVdhcm4oc3RyKSB7cHJpbnRmKChzdHIpKTsgcHJpbnRmKCJcbiIpO30KLSNkZWZpbmUgYXJtSWdub3JlKGEpICgodm9pZClhKQotI2RlZmluZSBhcm1Bc3NlcnQoYSkgYXNzZXJ0KGEpCi0jZWxzZSAKLS8qIHJlbGVhc2UgdmVyc2lvbiAqLwotI2RlZmluZSBhcm1FcnJvcihzdHIpICgodm9pZCkgKHN0cikpCi0jZGVmaW5lIGFybVdhcm4oc3RyKSAgKCh2b2lkKSAoc3RyKSkKLSNkZWZpbmUgYXJtSWdub3JlKGEpICAoKHZvaWQpIChhKSkKLSNkZWZpbmUgYXJtQXNzZXJ0KGEpICAoKHZvaWQpIChhKSkKLSNlbmRpZiAvKiBBUk1fREVCVUcgKi8KLQotLyogQXJpdGhtZXRpYyBvcGVyYXRpb25zICovCi0KLSNkZWZpbmUgYXJtTWluKGEsYikgICAgICAgICAgICAgKCAoYSkgPiAoYikgPyAgKGIpOihhKSApCi0jZGVmaW5lIGFybU1heChhLGIpICAgICAgICAgICAgICggKGEpID4gKGIpID8gIChhKTooYikgKQotI2RlZmluZSBhcm1BYnMoYSkgICAgICAgICAgICAgICAoIChhKSA8ICAwICA/IC0oYSk6KGEpICkKLQotLyogQWxpZ25tZW50IG9wZXJhdGlvbiAqLwotCi0jZGVmaW5lIGFybUFsaWduVG9CeXRlcyhQdHIsTikgICAgICAoUHRyICsgKCAoKE4tKGludHB0cl90KVB0cikmKE4tMSkpIC8gc2l6ZW9mKCpQdHIpICkpCi0jZGVmaW5lIGFybUFsaWduVG8yQnl0ZXMoUHRyKSAgICAgICBhcm1BbGlnblRvQnl0ZXMoUHRyLDIpCi0jZGVmaW5lIGFybUFsaWduVG80Qnl0ZXMoUHRyKSAgICAgICBhcm1BbGlnblRvQnl0ZXMoUHRyLDQpCi0jZGVmaW5lIGFybUFsaWduVG84Qnl0ZXMoUHRyKSAgICAgICBhcm1BbGlnblRvQnl0ZXMoUHRyLDgpCi0jZGVmaW5lIGFybUFsaWduVG8xNkJ5dGVzKFB0cikgICAgICBhcm1BbGlnblRvQnl0ZXMoUHRyLDE2KQotCi0vKiBFcnJvciBhbmQgQWxpZ25tZW50IGNoZWNrICovCi0KLSNkZWZpbmUgYXJtUmV0QXJnRXJySWYoY29uZGl0aW9uLCBjb2RlKSAgaWYoY29uZGl0aW9uKSB7IHJldHVybiAoY29kZSk7IH0KLSNkZWZpbmUgYXJtUmV0RGF0YUVycklmKGNvbmRpdGlvbiwgY29kZSkgaWYoY29uZGl0aW9uKSB7IHJldHVybiAoY29kZSk7IH0KLQotI2lmbmRlZiBBTElHTk1FTlRfRE9FU05UX01BVFRFUgotI2RlZmluZSBhcm1Jc0J5dGVBbGlnbmVkKFB0cixOKSAgICAgKCgoKGludHB0cl90KShQdHIpKSAlIE4pPT0wKQotI2RlZmluZSBhcm1Ob3RCeXRlQWxpZ25lZChQdHIsTikgICAgKCgoKGludHB0cl90KShQdHIpKSAlIE4pIT0wKQotI2Vsc2UKLSNkZWZpbmUgYXJtSXNCeXRlQWxpZ25lZChQdHIsTikgICAgICgxKQotI2RlZmluZSBhcm1Ob3RCeXRlQWxpZ25lZChQdHIsTikgICAgKDApCi0jZW5kaWYKLQotI2RlZmluZSBhcm1JczJCeXRlQWxpZ25lZChQdHIpICAgICAgYXJtSXNCeXRlQWxpZ25lZChQdHIsMikKLSNkZWZpbmUgYXJtSXM0Qnl0ZUFsaWduZWQoUHRyKSAgICAgIGFybUlzQnl0ZUFsaWduZWQoUHRyLDQpCi0jZGVmaW5lIGFybUlzOEJ5dGVBbGlnbmVkKFB0cikgICAgICBhcm1Jc0J5dGVBbGlnbmVkKFB0ciw4KQotI2RlZmluZSBhcm1JczE2Qnl0ZUFsaWduZWQoUHRyKSAgICAgYXJtSXNCeXRlQWxpZ25lZChQdHIsMTYpCi0KLSNkZWZpbmUgYXJtTm90MkJ5dGVBbGlnbmVkKFB0cikgICAgIGFybU5vdEJ5dGVBbGlnbmVkKFB0ciwyKQotI2RlZmluZSBhcm1Ob3Q0Qnl0ZUFsaWduZWQoUHRyKSAgICAgYXJtTm90Qnl0ZUFsaWduZWQoUHRyLDQpCi0jZGVmaW5lIGFybU5vdDhCeXRlQWxpZ25lZChQdHIpICAgICBhcm1Ob3RCeXRlQWxpZ25lZChQdHIsOCkKLSNkZWZpbmUgYXJtTm90MTZCeXRlQWxpZ25lZChQdHIpICAgIGFybU5vdEJ5dGVBbGlnbmVkKFB0ciwxNikKLSNkZWZpbmUgYXJtTm90MzJCeXRlQWxpZ25lZChQdHIpICAgIGFybU5vdEJ5dGVBbGlnbmVkKFB0ciwzMikKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtUm91bmRGbG9hdFRvUzE2X3JlZi9hcm1Sb3VuZEZsb2F0VG9TMzJfcmVmL2FybVJvdW5kRmxvYXRUb1M2NAotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSBzaG9ydCBpbnQvaW50IGFmdGVyIHJvdW5kaW5nCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1MxNi9PTVhfUzMyIGZvcm1hdAotICoKLSAqLwotCi1PTVhfUzE2IGFybVJvdW5kRmxvYXRUb1MxNiAoT01YX0Y2NCBWYWx1ZSk7Ci1PTVhfUzMyIGFybVJvdW5kRmxvYXRUb1MzMiAoT01YX0Y2NCBWYWx1ZSk7Ci1PTVhfUzY0IGFybVJvdW5kRmxvYXRUb1M2NCAoT01YX0Y2NCBWYWx1ZSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVNhdFJvdW5kRmxvYXRUb1MxNl9yZWYvYXJtU2F0Um91bmRGbG9hdFRvUzMyCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIHNob3J0IGludC9pbnQgYWZ0ZXIgcm91bmRpbmcgYW5kIHNhdHVyYXRpb24KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfUzE2L09NWF9TMzIgZm9ybWF0Ci0gKgotICovCi0KLU9NWF9TMTYgYXJtU2F0Um91bmRGbG9hdFRvUzE2IChPTVhfRjY0IFZhbHVlKTsKLU9NWF9TMzIgYXJtU2F0Um91bmRGbG9hdFRvUzMyIChPTVhfRjY0IFZhbHVlKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtU2F0Um91bmRGbG9hdFRvVTE2X3JlZi9hcm1TYXRSb3VuZEZsb2F0VG9VMzIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgdW5zaWduZWQgc2hvcnQgaW50L2ludCBhZnRlciByb3VuZGluZyBhbmQgc2F0dXJhdGlvbgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9VMTYvT01YX1UzMiBmb3JtYXQKLSAqCi0gKi8KLQotT01YX1UxNiBhcm1TYXRSb3VuZEZsb2F0VG9VMTYgKE9NWF9GNjQgVmFsdWUpOwotT01YX1UzMiBhcm1TYXRSb3VuZEZsb2F0VG9VMzIgKE9NWF9GNjQgVmFsdWUpOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1TaWduQ2hlY2sKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENoZWNrcyB0aGUgc2lnbiBvZiBhIHZhcmlhYmxlOgotICogcmV0dXJucyAxIGlmIGl0IGlzIFBvc2l0aXZlCi0gKiByZXR1cm5zIDAgaWYgaXQgaXMgMAotICogcmV0dXJucyAtMSBpZiBpdCBpcyBOZWdhdGl2ZSAKLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCSAgICB2YXIgICAgIFZhcmlhYmxlIHRvIGJlIGNoZWNrZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfSU5UIC0tICAgcmV0dXJucyAxIGlmIGl0IGlzIFBvc2l0aXZlCi0gKiAgICAgICAgICAgICAgcmV0dXJucyAwIGlmIGl0IGlzIDAKLSAqICAgICAgICAgICAgICByZXR1cm5zIC0xIGlmIGl0IGlzIE5lZ2F0aXZlIAotICovIAotIAotT01YX0lOVCBhcm1TaWduQ2hlY2sgKE9NWF9TMTYgdmFyKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtQ2xpcAotICoKLSAqIERlc2NyaXB0aW9uOiBDbGlwcyB0aGUgaW5wdXQgYmV0d2VlbiBNQVggYW5kIE1JTiB2YWx1ZQotICogCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBNaW4gICAgIGxvd2VyIGJvdW5kCi0gKiBbaW5dIE1heCAgICAgdXBwZXIgYm91bmQKLSAqIFtpbl0gc3JjICAgICB2YXJpYWJsZSB0byB0aGUgY2xpcHBlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9TMzIgLS0gICByZXR1cm5zIGNsaXBwZWQgdmFsdWUKLSAqLyAKLSAKLU9NWF9TMzIgYXJtQ2xpcCAoCi0gICAgICAgIE9NWF9JTlQgbWluLAotICAgICAgICBPTVhfSU5UIG1heCwgCi0gICAgICAgIE9NWF9TMzIgc3JjCi0gICAgICAgICk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybUNsaXBfRjMyCi0gKgotICogRGVzY3JpcHRpb246IENsaXBzIHRoZSBpbnB1dCBiZXR3ZWVuIE1BWCBhbmQgTUlOIHZhbHVlCi0gKiAKLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIE1pbiAgICAgbG93ZXIgYm91bmQKLSAqIFtpbl0gTWF4ICAgICB1cHBlciBib3VuZAotICogW2luXSBzcmMgICAgIHZhcmlhYmxlIHRvIHRoZSBjbGlwcGVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX0YzMiAtLSAgIHJldHVybnMgY2xpcHBlZCB2YWx1ZQotICovIAotIAotT01YX0YzMiBhcm1DbGlwX0YzMiAoCi0gICAgICAgIE9NWF9GMzIgbWluLAotICAgICAgICBPTVhfRjMyIG1heCwgCi0gICAgICAgIE9NWF9GMzIgc3JjCi0gICAgICAgICk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVNoaWZ0U2F0X0YzMgotICoKLSAqIERlc2NyaXB0aW9uOiBEaXZpZGVzIGEgZmxvYXQgdmFsdWUgYnkgMl5zaGlmdCBhbmQgCi0gKiBzYXR1cmF0ZXMgaXQgZm9yIHVuc2lnbmVkIHZhbHVlIHJhbmdlIGZvciBzYXRCaXRzLgotICogU2Vjb25kIHBhcmFtZXRlciBpcyBsaWtlICJzaGlmdGluZyIgdGhlIGNvcnJlc3BvbmRpbmcgCi0gKiBpbnRlZ2VyIHZhbHVlLiBUYWtlcyBjYXJlIG9mIHJvdW5kaW5nIHdoaWxlIGNsaXBwaW5nIHRoZSBmaW5hbCAKLSAqIHZhbHVlLgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHYgICAgICAgICAgTnVtYmVyIHRvIGJlIG9wZXJhdGVkIHVwb24KLSAqIFtpbl0gc2hpZnQgICAgICBEaXZpZGVzIHRoZSBpbnB1dCAidiIgYnkgIjJec2hpZnQiCi0gKiBbaW5dIHNhdEJpdHMgICAgRmluYWwgcmFuZ2UgaXMgWzAsIDJec2F0Qml0cykKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfUzMyIC0tICAgcmV0dXJucyAic2hpZnRlZCIgc2F0dXJhdGVkIHZhbHVlCi0gKi8gCi0gCi1PTVhfVTMyIGFybVNoaWZ0U2F0X0YzMigKLSAgICAgICAgT01YX0YzMiB2LCAKLSAgICAgICAgT01YX0lOVCBzaGlmdCwgCi0gICAgICAgIE9NWF9JTlQgc2F0Qml0cwotICAgICAgICApOwotCi0vKioKLSAqIEZ1bmN0aW9uczogYXJtU3dhcEVsZW0KLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gc3dhcHMgdHdvIGVsZW1lbnRzIGF0IHRoZSBzcGVjaWZpZWQgcG9pbnRlciBsb2NhdGlvbnMuCi0gKiBUaGUgc2l6ZSBvZiBlYWNoIGVsZW1lbnQgY291bGQgYmUgYW55dGhpbmcgYXMgc3BlY2lmaWVkIGJ5IDxlbGVtU2l6ZT4KLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhSZXN1bHQgLS0gRXJyb3Igc3RhdHVzIGZyb20gdGhlIGZ1bmN0aW9uCi0gKi8KLU9NWFJlc3VsdCBhcm1Td2FwRWxlbShPTVhfVTggKnBCdWYxLCBPTVhfVTggKnBCdWYyLCBPTVhfSU5UIGVsZW1TaXplKTsKLQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1NZWRpYW5PZjMKLSAqCi0gKiBEZXNjcmlwdGlvbjogRmluZHMgdGhlIG1lZGlhbiBvZiB0aHJlZSBudW1iZXJzCi0gKiAKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gZkVudHJ5ICAgICBGaXJzdCBlbnRyeQotICogW2luXSBzRW50cnkgICAgIHNlY29uZCBlbnRyeQotICogW2luXSB0RW50cnkgICAgIFRoaXJkIGVudHJ5Ci0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX1MzMiAtLSAgIHJldHVybnMgdGhlIG1lZGlhbiB2YWx1ZQotICovIAotIAotT01YX1MzMiBhcm1NZWRpYW5PZjMgKAotICAgIE9NWF9TMzIgZkVudHJ5LAotICAgIE9NWF9TMzIgc0VudHJ5LCAKLSAgICBPTVhfUzMyIHRFbnRyeSAKLSAgICApOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1Mb2dTaXplCi0gKgotICogRGVzY3JpcHRpb246IEZpbmRzIHRoZSBzaXplIG9mIGEgcG9zaXRpdmUgdmFsdWUgYW5kIHJldHVybnMgdGhlIHNhbWUKLSAqIAotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSB2YWx1ZSAgICBQb3NpdGl2ZSB2YWx1ZQotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9VOCAtLSAgIHJldHVybnMgdGhlIHNpemUgb2YgdGhlIHBvc2l0aXZlIHZhbHVlCi0gKi8gCi0gCi1PTVhfVTggYXJtTG9nU2l6ZSAoCi0gICAgT01YX1UxNiB2YWx1ZSAKLSAgICApOyAgICAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgICAgIC8qIFNhdHVyYXRpbmcgQXJpdGhtZXRpYyBvcGVyYXRpb25zICovCi0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdEFkZF9TMzIoKQotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBhZGRpdGlvbiBvZiB0aGUgdHdvIGlucHV0cyBWYWx1ZTEsIFZhbHVlMgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKLSAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogCi0gKiAgICAKLSAqKi8KLQotT01YX1MzMiBhcm1TYXRBZGRfUzMyKAotICAgICAgICAgICAgICAgIE9NWF9TMzIgVmFsdWUxLAotICAgICAgICAgICAgICAgIE9NWF9TMzIgVmFsdWUyCi0gICAgICAgICAgICAgICAgKTsKLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0QWRkX1M2NCgpCi0gKgotICogRGVzY3JpcHRpb24gOgotICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIGFkZGl0aW9uIG9mIHRoZSB0d28gaW5wdXRzIFZhbHVlMSwgVmFsdWUyCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAotICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAKLSAqICAgIAotICoqLwotCi1PTVhfUzY0IGFybVNhdEFkZF9TNjQoCi0gICAgICAgICAgICAgICAgT01YX1M2NCBWYWx1ZTEsCi0gICAgICAgICAgICAgICAgT01YX1M2NCBWYWx1ZTIKLSAgICAgICAgICAgICAgICApOwotCi0vKiogRnVuY3Rpb24gOmFybVNhdFN1Yl9TMzIoKQotICogCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBzdWJzdHJhY3Rpb24gb2YgdGhlIHR3byBpbnB1dHMgVmFsdWUxLCBWYWx1ZTIKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCi0gKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqIAotICoqLwotCi1PTVhfUzMyIGFybVNhdFN1Yl9TMzIoCi0gICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgVmFsdWUxLAotICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIFZhbHVlMgotICAgICAgICAgICAgICAgICAgICApOwotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRNYWNfUzMyKCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIE11bHRpcGxpY2F0aW9uIG9mIFZhbHVlMSBhbmQgVmFsdWUyIGFuZCBzdWJlc3F1ZW50IHNhdHVyYXRlZAotICogICAgIGFjY3VtdWxhdGlvbiB3aXRoIE1hYwotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKLSAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCi0gKiBbaW5dIE1hYyAgICAgICAgICBBY2N1bXVsYXRvcgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqKi8KLQotT01YX1MzMiBhcm1TYXRNYWNfUzMyKAotICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIE1hYywKLSAgICAgICAgICAgICAgICAgICAgT01YX1MxNiBWYWx1ZTEsCi0gICAgICAgICAgICAgICAgICAgIE9NWF9TMTYgVmFsdWUyCi0gICAgICAgICAgICAgICAgICAgICk7Ci0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdE1hY19TMTZTMzJfUzMyCi0gKgotICogRGVzY3JpcHRpb24gOgotICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIE1BQyBvcGVyYXRpb24gb2YgdGhlIHRocmVlIGlucHV0cyBkZWxheUVsZW0sIGZpbFRhcCAsIG1hYwotICoKLSAqICAgbWFjID0gbWFjICsgU2F0dXJhdGVfaW5fMzJCaXRzKGRlbGF5RWxlbSAqIGZpbFRhcCkKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIGRlbGF5RWxlbSAgICBGaXJzdCAzMiBiaXQgT3BlcmFuZAotICogW2luXSBmaWxUYXAgICAgICAgU2Vjb25kIDE2IGJpdCBPcGVyYW5kCi0gKiBbaW5dIG1hYyAgICAgICAgICBSZXN1bHQgb2YgTUFDIG9wZXJhdGlvbgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICBtYWMgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqICAgIAotICoqLwotIAotT01YX1MzMiBhcm1TYXRNYWNfUzE2UzMyX1MzMigKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgbWFjLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgZGVsYXlFbGVtLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TMTYgZmlsVGFwICk7Ci0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdFJvdW5kUmlnaHRTaGlmdF9TMzJfUzE2Ci0gKgotICogRGVzY3JpcHRpb24gOgotICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygcm91bmRlZCByaWdodCBzaGlmdCBvcGVyYXRpb24gb2YgaW5wdXQgYnkgdGhlIHNjYWxlZmFjdG9yCi0gKgotICogICBvdXRwdXQgPSBTYXR1cmF0ZV9pbl8xNkJpdHMoICggUmlnaHRTaGlmdCggKFJvdW5kKGlucHV0KSAsIHNjYWxlRmFjdG9yICkgKQotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gaW5wdXQgICAgICAgVGhlIGlucHV0IHRvIGJlIG9wZXJhdGVkIG9uCi0gKiBbaW5dIHNjYWxlRmFjdG9yIFRoZSBzaGlmdCBudW1iZXIKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqICAgIAotICoqLwotCi0KLU9NWF9TMTYgYXJtU2F0Um91bmRSaWdodFNoaWZ0X1MzMl9TMTYoCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIGlucHV0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JTlQgc2NhbGVGYWN0b3IpOwotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRSb3VuZExlZnRTaGlmdF9TMzIoKQotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGluZyBsZWZ0LXNoaWZ0IG9wZXJhdGlvbiBvbiBpbnB1dAotICogICAgIE9yIHJvdW5kZWQgUmlnaHQgc2hpZnQgaWYgdGhlIGlucHV0IFNoaWZ0IGlzIG5lZ2F0aXZlLgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gVmFsdWUgICAgICAgIE9wZXJhbmQKLSAqIFtpbl0gc2hpZnQgICAgICAgIE9wZXJhbmQgZm9yIHNoaWZ0IG9wZXJhdGlvbgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqICAgIAotICoqLwotIAotT01YX1MzMiBhcm1TYXRSb3VuZExlZnRTaGlmdF9TMzIoCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgT01YX0lOVCBzaGlmdAotICAgICAgICAgICAgICAgICAgICAgICAgKTsKLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0Um91bmRMZWZ0U2hpZnRfUzY0KCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRpbmcgbGVmdC1zaGlmdCBvcGVyYXRpb24gb24gaW5wdXQKLSAqICAgICBPciByb3VuZGVkIFJpZ2h0IHNoaWZ0IGlmIHRoZSBpbnB1dCBTaGlmdCBpcyBuZWdhdGl2ZS4KLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIFZhbHVlICAgICAgICBPcGVyYW5kCi0gKiBbaW5dIHNoaWZ0ICAgICAgICBPcGVyYW5kIGZvciBzaGlmdCBvcGVyYXRpb24KLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAgICAKLSAqKi8KLSAKLU9NWF9TNjQgYXJtU2F0Um91bmRMZWZ0U2hpZnRfUzY0KAotICAgICAgICAgICAgICAgICAgICAgICAgT01YX1M2NCBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JTlQgc2hpZnQKLSAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdE11bFMxNlMzMl9TMzIoKQotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYSBTMTYgZGF0YSB0eXBlIG11bHRpcGxpZWQgd2l0aCBhbiBTMzIgZGF0YSB0eXBlCi0gKiAgICAgaW4gYSBTMzIgY29udGFpbmVyCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBpbnB1dDEgICAgICAgT3BlcmFuZCAxCi0gKiBbaW5dIGlucHV0MiAgICAgICBPcGVyYW5kIDIKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAgICAKLSAqKi8KLQotCi1PTVhfUzMyIGFybVNhdE11bFMxNlMzMl9TMzIoCi0gICAgICAgICAgICAgICAgICAgIE9NWF9TMTYgaW5wdXQxLAotICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIGlucHV0Mik7Ci0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdE11bFMzMlMzMl9TMzIoKQotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYSBTMzIgZGF0YSB0eXBlIG11bHRpcGxpZWQgd2l0aCBhbiBTMzIgZGF0YSB0eXBlCi0gKiAgICAgaW4gYSBTMzIgY29udGFpbmVyCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBpbnB1dDEgICAgICAgT3BlcmFuZCAxCi0gKiBbaW5dIGlucHV0MiAgICAgICBPcGVyYW5kIDIKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAgICAKLSAqKi8KLQotT01YX1MzMiBhcm1TYXRNdWxTMzJTMzJfUzMyKAotICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIGlucHV0MSwKLSAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBpbnB1dDIpOwotCi0KLS8qKgotICogRnVuY3Rpb24gOmFybUludERpdkF3YXlGcm9tWmVybygpCi0gKgotICogRGVzY3JpcHRpb24gOiBJbnRlZ2VyIGRpdmlzaW9uIHdpdGggcm91bmRpbmcgdG8gdGhlIG5lYXJlc3QgaW50ZWdlci4gCi0gKiAgICAgICAgICAgICAgIEhhbGYtaW50ZWdlciB2YWx1ZXMgYXJlIHJvdW5kZWQgYXdheSBmcm9tIHplcm8KLSAqICAgICAgICAgICAgICAgdW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQuIEZvciBleGFtcGxlIDMvLzIgaXMgcm91bmRlZCAKLSAqICAgICAgICAgICAgICAgdG8gMiwgYW5kIC0zLy8yIGlzIHJvdW5kZWQgdG8gLTIuCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBOdW0gICAgICAgIE9wZXJhbmQgMQotICogW2luXSBEZW5vICAgICAgIE9wZXJhbmQgMgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24gaW5wdXQxLy9pbnB1dDIKLSAqICAgIAotICoqLwotCi1PTVhfUzMyIGFybUludERpdkF3YXlGcm9tWmVybyAoT01YX1MzMiBOdW0sIE9NWF9TMzIgRGVubyk7Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIERlYnVnZ2luZyBtYWNyb3MKLSAqCi0gKi8KLQotCi0vKgotICogRGVmaW5pdGlvbiBvZiBvdXRwdXQgc3RyZWFtIC0gY2hhbmdlIHRvIHN0ZGVyciBpZiBuZWNlc3NhcnkKLSAqLwotI2RlZmluZSBERUJVR19TVFJFQU0gc3Rkb3V0Ci0KLS8qCi0gKiBEZWJ1ZyBwcmludGYgbWFjcm9zLCBvbmUgZm9yIGVhY2ggYXJndW1lbnQgY291bnQuCi0gKiBBZGQgbW9yZSBpZiBuZWVkZWQuCi0gKi8KLSNpZmRlZiBERUJVR19PTgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNkZWZpbmUgREVCVUdfUFJJTlRGXzAoYSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhKQotI2RlZmluZSBERUJVR19QUklOVEZfMShhLCBiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIpCi0jZGVmaW5lIERFQlVHX1BSSU5URl8yKGEsIGIsIGMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYykKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzMoYSwgYiwgYywgZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkKQotI2RlZmluZSBERUJVR19QUklOVEZfNChhLCBiLCBjLCBkLCBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUpCi0jZGVmaW5lIERFQlVHX1BSSU5URl81KGEsIGIsIGMsIGQsIGUsIGYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZikKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzYoYSwgYiwgYywgZCwgZSwgZiwgZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnKQotI2RlZmluZSBERUJVR19QUklOVEZfNyhhLCBiLCBjLCBkLCBlLCBmLCBnLCBoKSAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgpCi0jZGVmaW5lIERFQlVHX1BSSU5URl84KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGkpICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSkKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzkoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaikgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqKQotI2RlZmluZSBERUJVR19QUklOVEZfMTAoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaykgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGspCi0jZGVmaW5lIERFQlVHX1BSSU5URl8xMShhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsKSAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCkKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzEyKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0pICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtKQotI2RlZmluZSBERUJVR19QUklOVEZfMTMoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSwgbikgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0sIG4pCi0jZGVmaW5lIERFQlVHX1BSSU5URl8xNChhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtLCBuLCBvKSAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSwgbiwgbykKLSNlbHNlIC8qIERFQlVHX09OICovCi0jZGVmaW5lIERFQlVHX1BSSU5URl8wKGEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotI2RlZmluZSBERUJVR19QUklOVEZfMShhLCBiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzIoYSwgYiwgYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0jZGVmaW5lIERFQlVHX1BSSU5URl8zKGEsIGIsIGMsIGQpICAgICAgICAgICAgICAgICAgICAgICAgIAotI2RlZmluZSBERUJVR19QUklOVEZfNChhLCBiLCBjLCBkLCBlKSAgICAgICAgICAgICAgICAgICAgICAKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzUoYSwgYiwgYywgZCwgZSwgZikgICAgICAgICAgICAgICAgICAgCi0jZGVmaW5lIERFQlVHX1BSSU5URl82KGEsIGIsIGMsIGQsIGUsIGYsIGcpICAgICAgICAgICAgICAgIAotI2RlZmluZSBERUJVR19QUklOVEZfNyhhLCBiLCBjLCBkLCBlLCBmLCBnLCBoKSAgICAgICAgICAgICAKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzgoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSkgICAgICAgICAgCi0jZGVmaW5lIERFQlVHX1BSSU5URl85KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGopICAgICAgIAotI2RlZmluZSBERUJVR19QUklOVEZfMTAoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaykgICAgCi0jZGVmaW5lIERFQlVHX1BSSU5URl8xMShhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsKSAgICAgICAgICAgICAKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzEyKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0pICAgICAgICAgIAotI2RlZmluZSBERUJVR19QUklOVEZfMTMoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSwgbikgICAgICAKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzE0KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0sIG4sIG8pICAgCi0jZW5kaWYgLyogREVCVUdfT04gKi8KLQotCi0vKgotICogRG9tYWluIGFuZCBzdWIgZG9tYWluIGRlZmluaXRpb25zCi0gKgotICogSW4gb3JkZXIgdG8gdHVybiBvbiBkZWJ1ZyBmb3IgYW4gZW50aXJlIGRvbWFpbiBvciBzdWItZG9tYWluCi0gKiBhdCBjb21waWxlIHRpbWUsIG9uZSBvZiB0aGUgREVCVUdfRE9NQUlOXyogYmVsb3cgbWF5IGJlIGRlZmluZWQsCi0gKiB3aGljaCB3aWxsIGFjdGl2YXRlIGRlYnVnIGluIGFsbCBvZiB0aGUgZGVmaW5lcyBpdCBjb250YWlucy4KLSAqLwotCi0jaWZkZWYgREVCVUdfRE9NQUlOX0FDCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERUNIQU5QQUlSRUxUX01QRUc0Ci0jZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERUNIQU5QQUlSRUxUCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERURBVFNUUkVMVAotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVGSUxMRUxUCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERUlTU1RFUkVPX1MzMgotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVNU1BOU19TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFTVNTVEVSRU9fUzMyX0kKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFUFJHQ0ZHRUxUCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERVROU19TMzJfSQotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUlOVEVSTEVBVkVTUEVDVFJVTV9TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfRU5DT0RFVE5TX1MzMl9JCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX0xPTkdURVJNUFJFRElDVF9TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfTE9OR1RFUk1SRUNPTlNUUlVDVF9TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfTURDVEZXRF9TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfTURDVElOVl9TMzJfUzE2Ci0jZGVmaW5lIERFQlVHX09NWEFDQUFDX05PSVNFTEVTU0RFQ09ERQotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19RVUFOVElOVl9TMzJfSQotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19VTlBBQ0tBRElGSEVBREVSCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX1VOUEFDS0FEVFNGUkFNRUhFQURFUgotI2RlZmluZSBERUJVR19PTVhBQ01QM19IVUZGTUFOREVDT0RFU0ZCTUJQX1MzMgotI2RlZmluZSBERUJVR19PTVhBQ01QM19IVUZGTUFOREVDT0RFU0ZCX1MzMgotI2RlZmluZSBERUJVR19PTVhBQ01QM19IVUZGTUFOREVDT0RFX1MzMgotI2RlZmluZSBERUJVR19PTVhBQ01QM19NRENUSU5WX1MzMgotI2RlZmluZSBERUJVR19PTVhBQ01QM19SRVFVQU5USVpFU0ZCX1MzMl9JCi0jZGVmaW5lIERFQlVHX09NWEFDTVAzX1JFUVVBTlRJWkVfUzMyX0kKLSNkZWZpbmUgREVCVUdfT01YQUNNUDNfU1lOVEhQUU1GX1MzMl9TMTYKLSNkZWZpbmUgREVCVUdfT01YQUNNUDNfVU5QQUNLRlJBTUVIRUFERVIKLSNkZWZpbmUgREVCVUdfT01YQUNNUDNfVU5QQUNLU0NBTEVGQUNUT1JTX1M4Ci0jZGVmaW5lIERFQlVHX09NWEFDTVAzX1VOUEFDS1NJREVJTkZPCi0jZW5kaWYgLyogREVCVUdfRE9NQUlOX0FDICovCi0KLQotI2lmZGVmIERFQlVHX0RPTUFJTl9WQwotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0FWRVJBR0VfMTZYCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfQVZFUkFHRV80WAotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0FWRVJBR0VfOFgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9ERUJMT0NLQ0hST01BX1U4X0MxSVIKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9ERUJMT0NLTFVNQV9VOF9DMUlSCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfREVDT0RFQ0hST01BRENDT0VGRlNUT1BBSVJDQVZMQ19VOAotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0RFQ09ERUNPRUZGU1RPUEFJUkNBVkxDX1U4Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfREVRVUFOVFRSQU5TRk9STUFDRlJPTVBBSVJfVThfUzE2X0MxX0RMWAotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0VYUEFOREZSQU1FCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfRklMVEVSREVCTE9DS0lOR0NIUk9NQV9IT1JFREdFX1U4X0MxSVIKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9GSUxURVJERUJMT0NLSU5HQ0hST01BX1ZFUkVER0VfVThfQzFJUgotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0ZJTFRFUkRFQkxPQ0tJTkdMVU1BX0hPUkVER0VfVThfQzFJUgotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0ZJTFRFUkRFQkxPQ0tJTkdMVU1BX1ZFUkVER0VfVThfQzFJUgotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1BSRURJQ1RJTlRSQUNIUk9NQThYOF9VOF9DMVIKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9QUkVESUNUSU5UUkFfMTZYMTZfVThfQzFSCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfUFJFRElDVElOVFJBXzRYNF9VOF9DMVIKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9TQURRVUFSXzE2WAotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBRFFVQVJfNFgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9TQURRVUFSXzhYCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfU0FEXzE2WAotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBRF80WAotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBRF84WAotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBVERfNFg0Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfVFJBTlNGT1JNREVRVUFOVENIUk9NQURDRlJPTVBBSVJfVThfUzE2X0MxCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfVFJBTlNGT1JNREVRVUFOVExVTUFEQ0ZST01QQUlSX1U4X1MxNl9DMQotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1RSQU5TRk9STVFVQU5UX0NIUk9NQURDCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfVFJBTlNGT1JNUVVBTlRfTFVNQURDCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9CTE9DS01BVENIX0hBTEZfMTZYMTYKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0JMT0NLTUFUQ0hfSEFMRl84WDgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0JMT0NLTUFUQ0hfSU5URUdFUl8xNlgxNgotI2RlZmluZSBERUJVR19PTVhWQ000UDJfQkxPQ0tNQVRDSF9JTlRFR0VSXzhYOAotI2RlZmluZSBERUJVR19PTVhWQ000UDJfQ09NUFVURVRFWFRVUkVFUlJPUkJMT0NLX1NBRF9VOF9TMTYKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0NPTVBVVEVURVhUVVJFRVJST1JCTE9DS19VOF9TMTYKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0RDVDhYOEJMS0RMWAotI2RlZmluZSBERUJVR19PTVhWQ000UDJfREVDT0RFQkxPQ0tDT0VGX0lOVEVSX1MxNgotI2RlZmluZSBERUJVR19PTVhWQ000UDJfREVDT0RFUEFETVZfUFZPUAotI2RlZmluZSBERUJVR19PTVhWQ000UDJfREVDT0RFVkxDWklHWkFHX0lOVEVSX1MxNgotI2RlZmluZSBERUJVR19PTVhWQ000UDJfREVDT0RFVkxDWklHWkFHX0lOVFJBQUNWTENfUzE2Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9ERUNPREVWTENaSUdaQUdfSU5UUkFEQ1ZMQ19TMTYKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0VOQ09ERU1WX1U4X1MxNgotI2RlZmluZSBERUJVR19PTVhWQ000UDJfRU5DT0RFVkxDWklHWkFHX0lOVEVSX1MxNgotI2RlZmluZSBERUJVR19PTVhWQ000UDJfRU5DT0RFVkxDWklHWkFHX0lOVFJBQUNWTENfUzE2Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9FTkNPREVWTENaSUdaQUdfSU5UUkFEQ1ZMQ19TMTYKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0ZJTkRNVlBSRUQKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0lEQ1Q4WDhCTEtETFgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0xJTUlUTVZUT1JFQ1QKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX01PVElPTkVTVElNQVRJT05NQgotI2RlZmluZSBERUJVR19PTVhWQ000UDJfUEFETUJHUkFZX1U4Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9QQURNQkhPUklaT05UQUxfVTgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1BBRE1CVkVSVElDQUxfVTgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1BBRE1WCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9RVUFOVElOVEVSX1MxNl9JCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9RVUFOVElOVFJBX1MxNl9JCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9RVUFOVElOVklOVEVSX1MxNl9JCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9RVUFOVElOVklOVFJBX1MxNl9JCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9UUkFOU1JFQ0JMT0NLQ0VPRl9JTlRFUgotI2RlZmluZSBERUJVR19PTVhWQ000UDJfVFJBTlNSRUNCTE9DS0NFT0ZfSU5UUkEKLSNlbmRpZiAvKiBERUJVR19ET01BSU5fVkMgKi8KLQotCi0jaWZkZWYgREVCVUdfRE9NQUlOX0lDCi0vKiBUbyBiZSBmaWxsZWQgaW4gKi8KLSNlbmRpZiAvKiBERUJVR19ET01BSU5fSUMgKi8KLQotCi0jaWZkZWYgREVCVUdfRE9NQUlOX1NQCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRE9UUFJPRF9TMTYKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9CTE9DS0VYUF9TMTYKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9CTE9DS0VYUF9TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9DT1BZX1MxNgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0RPVFBST0RfUzE2Ci0jZGVmaW5lIERFQlVHX09NWEFDU1BfRE9UUFJPRF9TMTZfU0ZTCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZURldEX0NUT0NfU0MxNl9TRlMKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRGV0RfQ1RPQ19TQzMyX1NGUwotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEZXRF9SVE9DQ1NfUzE2UzMyX1NGUwotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEZXRF9SVE9DQ1NfUzMyX1NGUwotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEdFVEJVRlNJWkVfQ19TQzE2Ci0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUR0VUQlVGU0laRV9DX1NDMzIKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRHRVRCVUZTSVpFX1JfUzE2X1MzMgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEdFVEJVRlNJWkVfUl9TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTklUX0NfU0MxNgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOSVRfQ19TQzMyCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5JVF9SX1MxNl9TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTklUX1JfUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5WX0NDU1RPUl9TMzJTMTZfU0ZTCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5WX0NDU1RPUl9TMzJfU0ZTCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5WX0NUT0NfU0MxNl9TRlMKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTlZfQ1RPQ19TQzMyX1NGUwotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJTFRFUk1FRElBTl9TMzJfSQotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJTFRFUk1FRElBTl9TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJPTkVfRElSRUNUX1MxNl9JU0ZTCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRklST05FX0RJUkVDVF9TMTZfSQotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUk9ORV9ESVJFQ1RfUzE2Ci0jZGVmaW5lIERFQlVHX09NWEFDU1BfRklST05FX0RJUkVDVF9TMTZfU0ZTCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRklSX0RJUkVDVF9TMTZfSVNGUwotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUl9ESVJFQ1RfUzE2X0kKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJfRElSRUNUX1MxNgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUl9ESVJFQ1RfUzE2X1NGUwotI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUk9ORV9CSVFVQURESVJFQ1RfUzE2X0kKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJPTkVfQklRVUFERElSRUNUX1MxNgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUk9ORV9ESVJFQ1RfUzE2X0kKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJPTkVfRElSRUNUX1MxNgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUl9CSVFVQURESVJFQ1RfUzE2X0kKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJfQklRVUFERElSRUNUX1MxNgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUl9ESVJFQ1RfUzE2X0kKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJfRElSRUNUX1MxNgotI2VuZGlmIC8qIERFQlVHX0RPTUFJTl9TUCAqLwotCi0KLSNpZmRlZiBERUJVR19ET01BSU5fSVAKLSNkZWZpbmUgREVCVUdfT01YSVBCTV9BRERDX1U4X0MxUl9TRlMKLSNkZWZpbmUgREVCVUdfT01YSVBCTV9DT1BZX1U4X0MxUgotI2RlZmluZSBERUJVR19PTVhJUEJNX0NPUFlfVThfQzNSCi0jZGVmaW5lIERFQlVHX09NWElQQk1fTUlSUk9SX1U4X0MxUgotI2RlZmluZSBERUJVR19PTVhJUEJNX01VTENfVThfQzFSX1NGUwotI2RlZmluZSBERUJVR19PTVhJUENTX0NPTE9SVFdJU1RRMTRfVThfQzNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfUkdCNTY1VE9ZQ0JDUjQyMExTX01DVV9VMTZfUzE2X0MzUDNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfUkdCNTY1VE9ZQ0JDUjQyMkxTX01DVV9VMTZfUzE2X0MzUDNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfUkdCNTY1VE9ZQ0JDUjQ0NExTX01DVV9VMTZfUzE2X0MzUDNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfUkdCVE9ZQ0JDUjQyMExTX01DVV9VOF9TMTZfQzNQM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19SR0JUT1lDQkNSNDIyTFNfTUNVX1U4X1MxNl9DM1AzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1JHQlRPWUNCQ1I0NDRMU19NQ1VfVThfUzE2X0MzUDNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjBSU1pST1RfVThfUDNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjBUT1JHQjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjBUT1JHQjU2NV9VOF9VMTZfUDNDM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMFRPUkdCTFNfTUNVX1MxNl9VOF9QM0MzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyUlNaQ1NDUk9UUkdCX1U4X0MyUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyUlNaUk9UX1U4X1AzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyVE9SR0I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyVE9SR0I1NjVfVThfVTE2X0MyQzNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJUT1JHQkxTX01DVV9TMTZfVThfUDNDM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlRPUkdCX1U4X0MyQzNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJUT1lDQkNSNDIwUk9UQVRFX1U4X0MyUDNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJUT1lDQkNSNDIwUk9UQVRFX1U4X1AzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDQ0VE9SR0I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDQ0VE9SR0JMU19NQ1VfUzE2X1U4X1AzQzNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1JUT1JHQjU2NV9VOF9VMTZfQzNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1JUT1JHQjU2NV9VOF9VMTZfUDNDM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUlRPUkdCX1U4X0MzUgotI2RlZmluZSBERUJVR19PTVhJUFBQX0dFVENFTlRSQUxNT01FTlRfUzY0Ci0jZGVmaW5lIERFQlVHX09NWElQUFBfR0VUU1BBVElBTE1PTUVOVF9TNjQKLSNkZWZpbmUgREVCVUdfT01YSVBQUF9NT01FTlRHRVRTVEFURVNJWkVfUzY0Ci0jZGVmaW5lIERFQlVHX09NWElQUFBfTU9NRU5USU5JVF9TNjQKLSNkZWZpbmUgREVCVUdfT01YSVBQUF9NT01FTlRTNjRTX1U4X0MxUgotI2RlZmluZSBERUJVR19PTVhJUFBQX01PTUVOVFM2NFNfVThfQzNSCi0jZW5kaWYgLyogREVCVUdfRE9NQUlOX0lQICovCi0KLQotI2VuZGlmIC8qIF9hcm1Db21tb25fSF8gKi8KLQotLypFbmQgb2YgRmlsZSovCi0KLQotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9CaXREZWNfcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX0JpdERlY19zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2MzQ0ZTMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX0JpdERlY19zLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2ODQgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIGFybUNPTU1fQml0RGVjX3MuaAotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDEyMjkwCi07Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8gCi07Ly8gT3Blbk1BWCBvcHRpbWl6ZWQgYml0c3RyZWFtIGRlY29kZSBtb2R1bGUKLTsvLwotOy8vIFlvdSBtdXN0IGluY2x1ZGUgYXJtQ09NTV9zLmggYmVmb3JlIGluY2x1ZGluZyB0aGlzIGZpbGUKLTsvLwotOy8vIFRoaXMgbW9kdWxlIHByb3ZpZGVzIG1hY3JvcyB0byBwZXJmb3JtIGFzc2VtYmx5IG9wdGltaXplZCBmaXhlZCBhbmQKLTsvLyB2YXJpYWJsZSBsZW5ndGggZGVjb2RpbmcgZnJvbSBhIHJlYWQtb25seSBiaXRzdHJlYW0uIFRoZSB2YXJpYWJsZQotOy8vIGxlbmd0aCBkZWNvZGUgbW9kdWxlcyB0YWtlIGFzIGlucHV0IGEgcG9pbnRlciB0byBhIHRhYmxlIG9mIDE2LWJpdAotOy8vIGVudHJpZXMgb2YgdGhlIGZvbGxvd2luZyBmb3JtYXQuCi07Ly8KLTsvLyBWTEQgVGFibGUgRW50cnkgZm9ybWF0Ci07Ly8KLTsvLyAgICAgICAgMTUgMTQgMTMgMTIgMTEgMTAgMDkgMDggMDcgMDYgMDUgMDQgMDMgMDIgMDEgMDAKLTsvLyAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotOy8vICAgICAgIHwgIExlbiAgIHwgICAgICAgICAgICAgICBTeW1ib2wgICAgICAgICAgICAgIHwgMSB8Ci07Ly8gICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLTsvLyAgICAgICB8ICAgICAgICAgICAgICAgIE9mZnNldCAgICAgICAgICAgICAgICAgICAgICB8IDAgfAotOy8vICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi07Ly8KLTsvLyBJZiB0aGUgdGFibGUgZW50cnkgaXMgYSBsZWFmIGVudHJ5IHRoZW4gYml0IDAgc2V0OgotOy8vICAgIExlbiAgICA9IE51bWJlciBvZiBiaXRzIG92ZXJyZWFkICgwIHRvIDcpCi07Ly8gICAgU3ltYm9sID0gU3ltYm9sIHBheWxvYWQgKHVuc2lnbmVkIDEyIGJpdHMpCi07Ly8KLTsvLyBJZiB0aGUgdGFibGUgZW50cnkgaXMgYW4gaW50ZXJuYWwgbm9kZSB0aGVuIGJpdCAwIGlzIGNsZWFyOgotOy8vICAgIE9mZnNldCA9IE51bWJlciBvZiAoMTYtYml0KSBoYWxmIHdvcmRzIGZyb20gdGhlIHRhYmxlCi07Ly8gICAgICAgICAgICAgc3RhcnQgdG8gdGhlIG5leHQgdGFibGUgbm9kZQotOy8vCi07Ly8gVGhlIHRhYmxlIGlzIGFjY2Vzc2VkIGJ5IHN1Y2Nlc3NpdmUgbG9va3VwIHVwIG9uIHRoZQotOy8vIG5leHQgU3RlcCBiaXRzIG9mIHRoZSBpbnB1dCBiaXRzdHJlYW0gdW50aWwgYSBsZWFmIG5vZGUKLTsvLyBpcyBvYnRhaW5lZC4gVGhlIFN0ZXAgc2l6ZXMgYXJlIHN1cHBsaWVkIHRvIHRoZSBWTEQgbWFjcm8uCi07Ly8KLTsvLyBVU0FHRToKLTsvLwotOy8vIFRvIHVzZSBhbnkgb2YgdGhlIG1hY3JvcyBpbiB0aGlzIHBhY2thZ2UsIGZpcnN0IGNhbGw6Ci07Ly8KLTsvLyAgICBNX0JEX0lOSVQgcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBCaXRTdHJlYW0sIFJCaXRCdWZmZXIsIFJCaXRDb3VudCwgVG1wCi07Ly8KLTsvLyBUaGlzIGNhY2hlcyB0aGUgY3VycmVudCBiaXRzdHJlYW0gcG9zaXRpb24gYW5kIG5leHQgYXZhaWxhYmxlCi07Ly8gYml0cyBpbiByZWdpc3RlcnMgcEJpdFN0cmVhbSwgUkJpdEJ1ZmZlciwgUkJpdENvdW50LiBUaGVzZSByZWdpc3RlcnMKLTsvLyBhcmUgcmVzZXJ2ZWQgZm9yIHVzZSBieSB0aGUgYml0c3RyZWFtIGRlY29kZSBwYWNrYWdlIHVudGlsIHlvdQotOy8vIGNhbGwgTV9CRF9GSU5JLgotOy8vCi07Ly8gTmV4dCBjYWxsIHRoZSBmb2xsb3dpbmcgbWFjcm8ocykgYXMgbWFueSB0aW1lcyBhcyB5b3UgbmVlZDoKLTsvLwotOy8vICAgIE1fQkRfTE9PSzggICAgICAgLSBMb29rIGFoZWFkIGNvbnN0YW50IDE8PU48PTggIGJpdHMgaW50byB0aGUgYml0c3RyZWFtCi07Ly8gICAgTV9CRF9MT09LMTYgICAgICAtIExvb2sgYWhlYWQgY29uc3RhbnQgMTw9Tjw9MTYgYml0cyBpbnRvIHRoZSBiaXRzdHJlYW0KLTsvLyAgICBNX0JEX1JFQUQ4ICAgICAgIC0gUmVhZCBjb25zdGFudCAxPD1OPD04ICBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbQotOy8vICAgIE1fQkRfUkVBRDE2ICAgICAgLSBSZWFkIGNvbnN0YW50IDE8PU48PTE2IGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtCi07Ly8gICAgTV9CRF9WUkVBRDggICAgICAtIFJlYWQgdmFyaWFibGUgMTw9Tjw9OCAgYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0KLTsvLyAgICBNX0JEX1ZSRUFEMTYgICAgIC0gUmVhZCB2YXJpYWJsZSAxPD1OPD0xNiBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbQotOy8vICAgIE1fQkRfVkxEICAgICAgICAgLSBQZXJmb3JtIHZhcmlhYmxlIGxlbmd0aCBkZWNvZGUgdXNpbmcgbG9va3VwIHRhYmxlCi07Ly8KLTsvLyBGaW5hbGx5IGNhbGwgdGhlIG1hY3JvOgotOy8vCi07Ly8gICAgTV9CRF9GSU5JIHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0Ci07Ly8KLTsvLyBUaGlzIHdyaXRlcyB0aGUgYml0c3RyZWFtIHN0YXRlIGJhY2sgdG8gbWVtb3J5LgotOy8vCi07Ly8gVGhlIHRocmVlIGJpdHN0cmVhbSBjYWNoZSByZWdpc3RlciBuYW1lcyBhcmUgYXNzaWduZWQgdG8gdGhlIGZvbGxvd2luZyBnbG9iYWwKLTsvLyB2YXJpYWJsZXM6Ci07Ly8KLQotICAgICAgICBHQkxTICAgIHBCaXRTdHJlYW0gIDsvLyBSZWdpc3RlciBuYW1lIGZvciBwQml0U3RyZWFtCi0gICAgICAgIEdCTFMgICAgQml0QnVmZmVyICAgOy8vIFJlZ2lzdGVyIG5hbWUgZm9yIEJpdEJ1ZmZlcgotICAgICAgICBHQkxTICAgIEJpdENvdW50ICAgIDsvLyBSZWdpc3RlciBuYW1lIGZvciBCaXRDb3VudAotICAgCi07Ly8gICAgICAgIAotOy8vIFRoZXNlIHJlZ2lzdGVyIHZhcmlhYmxlcyBtdXN0IGhhdmUgYSBjZXJ0YWluIGRlZmluZWQgc3RhdGUgb24gZW50cnkgdG8gZXZlcnkgYml0c3RyZWFtCi07Ly8gbWFjcm8gKGV4Y2VwdCBNX0JEX0lOSVQpIGFuZCBvbiBleGl0IGZyb20gZXZlcnkgYml0c3RyZWFtIG1hY3JvIChleGNlcHQgTV9CRF9GSU5JKS4KLTsvLyBUaGUgc3RhdGUgbWF5IGRlcGVuZCBvbiBpbXBsZW1lbnRhdGlvbi4KLTsvLwotOy8vIEZvciB0aGUgZGVmYXVsdCAoQVJNMTEpIGltcGxlbWVudGF0aW9uIHRoZSBmb2xsb3dpbmcgaG9sZDoKLTsvLyAgICBwQml0U3RyZWFtIC0gcG9pbnRzIHRvIHRoZSBmaXJzdCBieXRlIG5vdCBoZWxkIGluIHRoZSBCaXRCdWZmZXIKLTsvLyAgICBCaXRCdWZmZXIgIC0gaXMgYSBjYWNoZSBvZiAoNCBieXRlcykgMzIgYml0cywgYml0IDMxIHRoZSBmaXJzdCBiaXQKLTsvLyAgICBCaXRDb3VudCAgIC0gaXMgb2Zmc2V0IChmcm9tIHRoZSB0b3AgYml0KSB0byB0aGUgbmV4dCB1bnVzZWQgYml0c3RyZWFtIGJpdAotOy8vICAgIDA8PUJpdENvdW50PD0xNSAoc28gQml0QnVmZmVyIGhvbGRzIGF0IGxlYXN0IDE3IHVudXNlZCBiaXRzKQotOy8vCi07Ly8KLQotICAgICAgICA7Ly8gQml0c3RyZWFtIERlY29kZSBpbml0aWFsaXNlCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW5pdGlhbGlzZXMgdGhlIGJpdHN0cmVhbSBkZWNvZGUgZ2xvYmFsIHJlZ2lzdGVycyBmcm9tCi0gICAgICAgIDsvLyBiaXRzdHJlYW0gcG9pbnRlcnMuIFRoaXMgbWFjcm8gaXMgc3BsaXQgaW50byAzIHBhcnRzIHRvIGVuYWJsZQotICAgICAgICA7Ly8gc2NoZWR1bGluZy4KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJHBwQml0U3RyZWFtICAgIC0gcG9pbnRlciB0byBwb2ludGVyIHRvIHRoZSBuZXh0IGJpdHN0cmVhbSBieXRlCi0gICAgICAgIDsvLyAkcEJpdE9mZnNldCAgICAgLSBwb2ludGVyIHRvIHRoZSBudW1iZXIgb2YgYml0cyB1c2VkIGluIHRoZSBjdXJyZW50IGJ5dGUgKDAuLjcpCi0gICAgICAgIDsvLyAkUkJpdFN0cmVhbSAgICAgLSByZWdpc3RlciB0byB1c2UgZm9yIHBCaXRTdHJlYW0gKGNhbiBiZSAkcHBCaXRTdHJlYW0pCi0gICAgICAgIDsvLyAkUkJpdEJ1ZmZlciAgICAgLSByZWdpc3RlciB0byB1c2UgZm9yIEJpdEJ1ZmZlcgotICAgICAgICA7Ly8gJFJCaXRDb3VudCAgICAgIC0gcmVnaXN0ZXIgdG8gdXNlIGZvciBCaXRDb3VudCAgIChjYW4gYmUgJHBCaXRPZmZzZXQpCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkVDEsJFQyLCRUMyAgICAgLSByZWdpc3RlcnMgdGhhdCBtdXN0IGJlIHByZXNlcnZlZCBiZXR3ZWVuIGNhbGxzIHRvCi0gICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICBNX0JEX0lOSVQxIGFuZCBNX0JEX0lOSVQyCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQkRfSU5JVDAgICRwcEJpdFN0cmVhbSwgJHBCaXRPZmZzZXQsICRSQml0U3RyZWFtLCAkUkJpdEJ1ZmZlciwgJFJCaXRDb3VudAotCi1wQml0U3RyZWFtICBTRVRTICIkUkJpdFN0cmVhbSIKLUJpdEJ1ZmZlciAgIFNFVFMgIiRSQml0QnVmZmVyIgotQml0Q291bnQgICAgU0VUUyAiJFJCaXRDb3VudCIgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIGxvYWQgaW5wdXRzCi0gICAgICAgIExEUiAgICAgJHBCaXRTdHJlYW0sIFskcHBCaXRTdHJlYW1dCi0gICAgICAgIExEUiAgICAgJEJpdENvdW50LCBbJHBCaXRPZmZzZXRdCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQkRfSU5JVDEgICRUMSwgJFQyLCAkVDMKLSAgICAgICAgTERSQiAgICAkVDIsIFskcEJpdFN0cmVhbSwgIzJdCi0gICAgICAgIExEUkIgICAgJFQxLCBbJHBCaXRTdHJlYW0sICMxXQotICAgICAgICBMRFJCICAgICRCaXRCdWZmZXIsICBbJHBCaXRTdHJlYW1dLCAjMwotICAgICAgICBBREQgICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBNX0JEX0lOSVQyICAkVDEsICRUMiwgJFQzCi0gICAgICAgIE9SUiAgICAgJFQyLCAkVDIsICRUMSwgTFNMICM4Ci0gICAgICAgIE9SUiAgICAgJEJpdEJ1ZmZlciwgJFQyLCAkQml0QnVmZmVyLCBMU0wgIzE2Ci0gICAgICAgIE1FTkQgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIExvb2sgYWhlYWQgZml4ZWQgMTw9Tjw9OCBiaXRzIHdpdGhvdXQgY29uc3VtaW5nIGFueSBiaXRzCi0gICAgICAgIDsvLyBUaGUgbmV4dCBiaXRzIHdpbGwgYmUgcGxhY2VkIGF0IGJpdCAzMS4uMjQgb2YgZGVzdGluYXRpb24gcmVnaXN0ZXIKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJE4gICAgICAgICAgICAgIC0gbnVtYmVyIG9mIGJpdHMgdG8gbG9vawotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLyAKLSAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJFN5bWJvbCAgICAgICAgIC0gdGhlIG5leHQgTiBiaXRzIG9mIHRoZSBiaXRzdHJlYW0KLSAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9CRF9MT09LOCAgJFN5bWJvbCwgJE4KLSAgICAgICAgQVNTRVJUICAoJE4+PTEpOkxBTkQ6KCROPD04KQotICAgICAgICBNT1YgICAgICRTeW1ib2wsICRCaXRCdWZmZXIsIExTTCAkQml0Q291bnQKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBMb29rIGFoZWFkIGZpeGVkIDE8PU48PTE2IGJpdHMgd2l0aG91dCBjb25zdW1pbmcgYW55IGJpdHMKLSAgICAgICAgOy8vIFRoZSBuZXh0IGJpdHMgd2lsbCBiZSBwbGFjZWQgYXQgYml0IDMxLi4xNiBvZiBkZXN0aW5hdGlvbiByZWdpc3RlcgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkTiAgICAgICAgICAgICAgLSBudW1iZXIgb2YgYml0cyB0byBsb29rCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vIAotICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkU3ltYm9sICAgICAgICAgLSB0aGUgbmV4dCBOIGJpdHMgb2YgdGhlIGJpdHN0cmVhbQotICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLwotICAgICAgICBNQUNSTwotICAgICAgICBNX0JEX0xPT0sxNiAgJFN5bWJvbCwgJE4sICRUMQotICAgICAgICBBU1NFUlQgICgkTiA+PSAxKTpMQU5EOigkTiA8PSAxNikKLSAgICAgICAgTU9WICAgICAkU3ltYm9sLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50Ci0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gU2tpcHMgZml4ZWQgMTw9Tjw9OCBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbSwgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlcgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkTiAgICAgICAgICAgICAgLSBudW1iZXIgb2YgYml0cwotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLyAKLSAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLwotICAgICAgICBNQUNSTwotICAgICAgICBNX0JEX1NLSVA4ICROLCAkVDEKLSAgICAgICAgQVNTRVJUICAoJE4+PTEpOkxBTkQ6KCROPD04KSAgICAgICAgCi0gICAgICAgIFNVQlMgICAgJEJpdENvdW50LCAkQml0Q291bnQsICMoOC0kTikKLSAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxICAgCi0gICAgICAgIEFERENDICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4Ci0gICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gUmVhZCBmaXhlZCAxPD1OPD04IGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtLCBhZHZhbmNpbmcgdGhlIGJpdHN0cmVhbSBwb2ludGVyCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICROICAgICAgICAgICAgICAtIG51bWJlciBvZiBiaXRzIHRvIHJlYWQKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8gCi0gICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRTeW1ib2wgICAgICAgICAtIHRoZSBuZXh0IE4gYml0cyBvZiB0aGUgYml0c3RyZWFtCi0gICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQkRfUkVBRDggJFN5bWJvbCwgJE4sICRUMQotICAgICAgICBBU1NFUlQgICgkTj49MSk6TEFORDooJE48PTgpICAgICAgICAgICAgICAgIAotICAgICAgICBNT1ZTICAgICRTeW1ib2wsICRCaXRCdWZmZXIsIExTTCAkQml0Q291bnQgICAgICAgIAotICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjKDgtJE4pCi0gICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMSAgIAotICAgICAgICBBRERDQyAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAotICAgICAgICBNT1YgICAgICRTeW1ib2wsICRTeW1ib2wsIExTUiAjKDMyLSROKQotICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4Ci0gICAgICAgIE1FTkQKLQotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIFJlYWQgZml4ZWQgMTw9Tjw9MTYgYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0sIGFkdmFuY2luZyB0aGUgYml0c3RyZWFtIHBvaW50ZXIKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJE4gICAgICAgICAgICAgIC0gbnVtYmVyIG9mIGJpdHMgdG8gcmVhZAotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLyAKLSAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJFN5bWJvbCAgICAgICAgIC0gdGhlIG5leHQgTiBiaXRzIG9mIHRoZSBiaXRzdHJlYW0KLSAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vICRUMiAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9CRF9SRUFEMTYgJFN5bWJvbCwgJE4sICRUMSwgJFQyCi0gICAgICAgIEFTU0VSVCAgKCROPj0xKTpMQU5EOigkTjw9MTYpCi0gICAgICAgIEFTU0VSVCAgJFN5bWJvbDw+JFQxCi0gICAgICAgIElGICgkTjw9OCkKLSAgICAgICAgICAgIE1fQkRfUkVBRDggICRTeW1ib2wsICROLCAkVDEKLSAgICAgICAgRUxTRSAgICAgICAgCi0gICAgICAgICAgICA7Ly8gTj44IHNvIHdlIHdpbGwgYmUgYWJsZSB0byByZWZpbGwgYXQgbGVhc3Qgb25lIGJ5dGUgICAgICAgICAgICAKLSAgICAgICAgICAgIExEUkIgICAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMSAgICAgICAgICAgIAotICAgICAgICAgICAgTU9WUyAgICAkU3ltYm9sLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50Ci0gICAgICAgICAgICBPUlIgICAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4ICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIFNVQlMgICAgJEJpdENvdW50LCAkQml0Q291bnQsICMoMTYtJE4pCi0gICAgICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEgICAgICAgICAgICAKLSAgICAgICAgICAgIE1PViAgICAgJFN5bWJvbCwgJFN5bWJvbCwgTFNSICMoMzItJE4pCi0gICAgICAgICAgICBBRERDQyAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAotICAgICAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAotICAgICAgICBFTkRJRgotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIFNraXAgdmFyaWFibGUgMTw9Tjw9OCBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbSwgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlci4KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJE4gICAgICAgICAgICAgIC0gbnVtYmVyIG9mIGJpdHMuIDE8PU48PTgKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8gCi0gICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vICRUMiAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9CRF9WU0tJUDggJE4sICRUMQotICAgICAgICBBREQgICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAkTgotICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAotICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEgICAgICAgIAotICAgICAgICBBRERDQyAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAotICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4Ci0gICAgICAgIE1FTkQgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBTa2lwIHZhcmlhYmxlIDE8PU48PTE2IGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtLCBhZHZhbmNpbmcgdGhlIGJpdHN0cmVhbSBwb2ludGVyLgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkTiAgICAgICAgICAgICAgLSBudW1iZXIgb2YgYml0cy4gMTw9Tjw9MTYKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8gCi0gICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vICRUMiAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9CRF9WU0tJUDE2ICROLCAkVDEsICRUMgotICAgICAgICBBREQgICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAkTgotICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAotICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEgICAgICAgIAotICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4Ci0gICAgICAgIFNVQkNTUyAgJEJpdENvdW50LCAkQml0Q291bnQsICM4ICAgICAgICAKLSAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxCi0gICAgICAgIEFERENDICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4Ci0gICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKLSAgICAgICAgTUVORCAgICAgICAgCi0KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBSZWFkIHZhcmlhYmxlIDE8PU48PTggYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0sIGFkdmFuY2luZyB0aGUgYml0c3RyZWFtIHBvaW50ZXIuCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICROICAgICAgICAgICAgICAtIG51bWJlciBvZiBiaXRzIHRvIHJlYWQuIDE8PU48PTgKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8gCi0gICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRTeW1ib2wgICAgICAgICAtIHRoZSBuZXh0IE4gYml0cyBvZiB0aGUgYml0c3RyZWFtCi0gICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyAkVDIgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQkRfVlJFQUQ4ICRTeW1ib2wsICROLCAkVDEsICRUMgotICAgICAgICBNT1YgICAgICRTeW1ib2wsICRCaXRCdWZmZXIsIExTTCAkQml0Q291bnQgICAgICAgIAotICAgICAgICBBREQgICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAkTgotICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAotICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEgICAgICAgIAotICAgICAgICBSU0IgICAgICRUMiwgJE4sICMzMiAgICAgICAgCi0gICAgICAgIEFERENDICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4Ci0gICAgICAgIE1PViAgICAgJFN5bWJvbCwgJFN5bWJvbCwgTFNSICRUMgotICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4Ci0gICAgICAgIE1FTkQKLQotCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gUmVhZCB2YXJpYWJsZSAxPD1OPD0xNiBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbSwgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlci4KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJE4gICAgICAgICAgICAgIC0gbnVtYmVyIG9mIGJpdHMgdG8gcmVhZC4gMTw9Tjw9MTYKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8gCi0gICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRTeW1ib2wgICAgICAgICAtIHRoZSBuZXh0IE4gYml0cyBvZiB0aGUgYml0c3RyZWFtCi0gICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyAkVDIgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQkRfVlJFQUQxNiAkU3ltYm9sLCAkTiwgJFQxLCAkVDIKLSAgICAgICAgTU9WICAgICAkU3ltYm9sLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50ICAgICAgICAKLSAgICAgICAgQUREICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgJE4KLSAgICAgICAgU1VCUyAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKLSAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxICAgICAgICAKLSAgICAgICAgUlNCICAgICAkVDIsICROLCAjMzIgICAgICAgIAotICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4Ci0gICAgICAgIFNVQkNTUyAgJEJpdENvdW50LCAkQml0Q291bnQsICM4ICAgICAgICAKLSAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxCi0gICAgICAgIEFERENDICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4Ci0gICAgICAgIE1PViAgICAgJFN5bWJvbCwgJFN5bWJvbCwgTFNSICRUMgotICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4Ci0gICAgICAgIE1FTkQKLQotCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gRGVjb2RlIGEgY29kZSBvZiB0aGUgZm9ybSAwMDAwLi4uMDAxIHdoZXJlIHRoZXJlCi0gICAgICAgIDsvLyBhcmUgTiB6ZXJvcyBiZWZvcmUgdGhlIDEgYW5kIE48PTE1IChjb2RlIGxlbmd0aDw9MTYpCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8gCi0gICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRTeW1ib2wgICAgICAgICAtIHRoZSBudW1iZXIgb2YgemVyb3MgYmVmb3JlIHRoZSBuZXh0IDEKLSAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgID49MTYgaXMgYW4gaWxsZWdhbCBjb2RlCi0gICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyAkVDIgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9CRF9DTFoxNiAkU3ltYm9sLCAkVDEsICRUMgotICAgICAgICBNT1ZTICAgICRTeW1ib2wsICRCaXRCdWZmZXIsIExTTCAkQml0Q291bnQKLSAgICAgICAgQ0xaICAgICAkU3ltYm9sLCAkU3ltYm9sICAgICAgICAgICAgICAgIAotICAgICAgICBBREQgICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAkU3ltYm9sCi0gICAgICAgIFNVQlMgICAgJEJpdENvdW50LCAkQml0Q291bnQsICM3ICAgICAgICA7Ly8gbGVuZ3RoIGlzIFN5bWJvbCsxCi0gICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMQotICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4Ci0gICAgICAgIFNVQkNTUyAgJEJpdENvdW50LCAkQml0Q291bnQsICM4ICAgICAgICAKLSAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxCi0gICAgICAgIEFERENDICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4Ci0gICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKLSAgICAgICAgTUVORCAgCi0KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBEZWNvZGUgYSBjb2RlIG9mIHRoZSBmb3JtIDExMTEuLi4xMTAgd2hlcmUgdGhlcmUKLSAgICAgICAgOy8vIGFyZSBOIG9uZXMgYmVmb3JlIHRoZSAwIGFuZCBOPD0xNSAoY29kZSBsZW5ndGg8PTE2KQotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vIAotICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkU3ltYm9sICAgICAgICAgLSB0aGUgbnVtYmVyIG9mIHplcm9zIGJlZm9yZSB0aGUgbmV4dCAxCi0gICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICA+PTE2IGlzIGFuIGlsbGVnYWwgY29kZQotICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8gJFQyICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLyAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQkRfQ0xPMTYgJFN5bWJvbCwgJFQxLCAkVDIKLSAgICAgICAgTU9WICAgICAkU3ltYm9sLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50Ci0gICAgICAgIE1WTiAgICAgJFN5bWJvbCwgJFN5bWJvbAotICAgICAgICBDTFogICAgICRTeW1ib2wsICRTeW1ib2wgICAgICAgICAgICAgICAgCi0gICAgICAgIEFERCAgICAgJEJpdENvdW50LCAkQml0Q291bnQsICRTeW1ib2wKLSAgICAgICAgU1VCUyAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzcgICAgICAgIDsvLyBsZW5ndGggaXMgU3ltYm9sKzEKLSAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxCi0gICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKLSAgICAgICAgU1VCQ1NTICAkQml0Q291bnQsICRCaXRDb3VudCwgIzggICAgICAgIAotICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEKLSAgICAgICAgQUREQ0MgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKLSAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAotICAgICAgICBNRU5EICAKLQotCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gVmFyaWFibGUgTGVuZ3RoIERlY29kZSBtb2R1bGUKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBEZWNvZGVzIG9uZSBWTEQgU3ltYm9sIGZyb20gYSBiaXRzdHJlYW0gYW5kIHJlZmlsbCB0aGUgYml0c3RyZWFtCi0gICAgICAgIDsvLyBidWZmZXIuCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRwVkxEVGFibGUgICAgICAtIHBvaW50ZXIgdG8gVkxEIGRlY29kZSB0YWJsZSBvZiAxNi1iaXQgZW50cmllcy4KLSAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgIFRoZSBmb3JtYXQgaXMgZGVzY3JpYmVkIGFib3ZlIGF0IHRoZSBzdGFydCBvZgotICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgdGhpcyBmaWxlLgotICAgICAgICA7Ly8gJFMwICAgICAgICAgICAgIC0gVGhlIG51bWJlciBvZiBiaXRzIHRvIGxvb2sgdXAgZm9yIHRoZSBmaXJzdCBzdGVwCi0gICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICAxPD0kUzA8PTgKLSAgICAgICAgOy8vICRTMSAgICAgICAgICAgICAtIFRoZSBudW1iZXIgb2YgYml0cyB0byBsb29rIHVwIGZvciBlYWNoIHN1YnNlcXVlbnQKLSAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgIHN0ZXAgMTw9JFMxPD0kUzAuCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLyAKLSAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJFN5bWJvbCAgICAgICAgIC0gZGVjb2RlZCBWTEQgc3ltYm9sIHZhbHVlCi0gICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyAkVDIgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQkRfVkxEICRTeW1ib2wsICRUMSwgJFQyLCAkcFZMRFRhYmxlLCAkUzAsICRTMQotICAgICAgICBBU1NFUlQgKDE8PSRTMCk6TEFORDooJFMwPD04KQotICAgICAgICBBU1NFUlQgKDE8PSRTMSk6TEFORDooJFMxPD0kUzApCi0gICAgICAgIAotICAgICAgICA7Ly8gTm90ZSAwPD1CaXRDb3VudDw9MTUgb24gZW50cnkgYW5kIGV4aXQKLSAgICAgICAgCi0gICAgICAgIE1PVlMgICAgJFQxLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50ICAgICAgIDsvLyBsZWZ0IGFsaWduIG5leHQgYml0cwotICAgICAgICBNT1ZTICAgICRTeW1ib2wsICMoMjw8JFMwKS0yICAgICAgICAgICAgICAgICA7Ly8gY3JlYXRlIG1hc2sKLSAgICAgICAgQU5EICAgICAkU3ltYm9sLCAkU3ltYm9sLCAkVDEsIExTUiAjKDMxLSRTMCkgOy8vIDIqKG5leHQgJFMwIGJpdHMpCi0gICAgICAgIFNVQlMgICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4ICAgICAgICAgICAgIDsvLyBDUyBpZiBidWZmZXIgY2FuIGJlIGZpbGxlZAotMDEKLSAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxICAgICAgICAgICAgICAgOy8vIGxvYWQgcmVmaWxsIGJ5dGUKLSAgICAgICAgTERSSCAgICAkU3ltYm9sLCBbJHBWTERUYWJsZSwgJFN5bWJvbF0gICAgICAgOy8vIGxvYWQgdGFibGUgZW50cnkKLSAgICAgICAgQUREQ0MgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzggICAgICAgICAgICAgOy8vIHJlZmlsbCBub3QgcG9zc2libGUKLSAgICAgICAgQUREICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIyRTMCAgICAgICAgICAgOy8vIGFzc3VtZSAkUzAgYml0cyB1c2VkCi0gICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzggIDsvLyBtZXJnZSBpbiByZWZpbGwgYnl0ZQotICAgICAgICBNT1ZTICAgICRUMSwgJFN5bWJvbCwgTFNSICMxICAgICAgICAgICAgICAgICA7Ly8gQ1M9bGVhZiBlbnRyeQotICAgICAgICBCQ1MgICAgICVGVDAyCi0gICAgICAgIAotICAgICAgICBNT1ZTICAgICRUMSwgJEJpdEJ1ZmZlciwgTFNMICRCaXRDb3VudCAgICAgICA7Ly8gbGVmdCBhbGlnbiBuZXh0IGJpdAotICAgICAgICBJRiAoMiokUzAtJFMxPD04KQotICAgICAgICAgICAgOy8vIENhbiBjb21iaW5lIHJlZmlsbCBjaGVjayBhbmQgLVMwK1MxIGFuZCBrZWVwICRCaXRDb3VudDw9MTUKLSAgICAgICAgICAgIFNVQlMgICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4KygkUzAtJFMxKQotICAgICAgICBFTFNFCi0gICAgICAgICAgICA7Ly8gU2VwYXJhdGUgcmVmaWxsIGNoZWNrIGFuZCAtUzArUzEgb2Zmc2V0Ci0gICAgICAgICAgICBTVUJTICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKLSAgICAgICAgICAgIFNVQiAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjKCRTMC0kUzEpCi0gICAgICAgIEVORElGCi0gICAgICAgIEFERCAgICAgJFN5bWJvbCwgJFN5bWJvbCwgJFQxLCBMU1IgIygzMS0kUzEpIDsvLyBhZGQgMioobmV4dCAkUzEgYml0cykgdG8KLSAgICAgICAgQklDICAgICAkU3ltYm9sLCAkU3ltYm9sLCAjMSAgICAgICAgICAgICAgICAgOy8vICAgdGFibGUgb2Zmc2V0Ci0gICAgICAgIEIgICAgICAgJUJUMDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBsb2FkIG5leHQgdGFibGUgZW50cnkKLTAyCi0gICAgICAgIDsvLyBCaXRDb3VudCByYW5nZSBub3cgZGVwZW5kIG9uIHRoZSByb3V0ZSBoZXJlCi0gICAgICAgIDsvLyBpZiAoZmlyc3Qgc3RlcCkgICAgICAgUzAgPD0gQml0Q291bnQgPD0gNytTMCAgICAgICAgPD0xNQotICAgICAgICA7Ly8gZWxzZSBpZiAoMipTMC1TMTw9OCkgIFMwIDw9IEJpdENvdW50IDw9IDcrKDIqUzAtUzEpIDw9MTUKLSAgICAgICAgOy8vIGVsc2UgICAgICAgICAgICAgICAgICBTMSA8PSBCaXRDb3VudCA8PSA3K1MxICAgICAgICA8PTE1Ci0gICAgICAgIAotICAgICAgICBTVUIgICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAkU3ltYm9sLCBMU1IjMTMKLSAgICAgICAgQklDICAgICAkU3ltYm9sLCAkVDEsICMweEYwMDAKLSAgICAgICAgTUVORAotICAgICAgICAKLQotICAgICAgICA7Ly8gQWRkIGFuIG9mZnNldCBudW1iZXIgb2YgYml0cwotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIE91dHB1dHMgZGVzdGluYXRpb24gYnl0ZSBhbmQgYml0IGluZGV4IHZhbHVlcyB3aGljaCBjb3JyZXNwb25kcyB0byBhbiBvZmZzZXQgbnVtYmVyIG9mIGJpdHMgCi0gICAgICAgIDsvLyBmcm9tIHRoZSBjdXJyZW50IGxvY2F0aW9uLiBUaGlzIGlzIHVzZWQgdG8gY29tcGFyZSBiaXRzdHJlYW0gcG9zaXRpb25zIHVzaW5nLiBNX0JEX0NNUC4KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJE9mZnNldCAgICAgICAgIC0gT2Zmc2V0IHRvIGJlIGFkZGVkIGluIGJpdHMuCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRCeXRlSW5kZXggICAgICAtIERlc3RpbmF0aW9uIHBCaXRTdHJlYW0gcG9pbnRlciBhZnRlciBhZGRpbmcgdGhlIE9mZnNldC4gCi0gICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICBUaGlzIHZhbHVlIHdpbGwgYmUgNCBieXRlIGFoZWFkIGFuZCBuZWVkcyB0byBzdWJ0cmFjdCBieSA0IHRvIGdldCBleGFjdCAKLSAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgKGFzIGluIE1fQkRfRklOSSkuIEJ1dCBmb3IgdXNpbmcgd2l0aCBNX0JEX0NNUCBzdWJ0cmFjdCBpcyBub3QgbmVlZGVkLgotICAgICAgICA7Ly8gJEJpdEluZGV4ICAgICAgIC0gRGVzdGluYXRpb24gQml0Q291bnQgYWZ0ZXIgdGhlIGFkZGl0aW9uIG9mIE9mZnNldCBudW1iZXIgb2YgYml0cwotICAgICAgICA7Ly8KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9CRF9BREQgICRCeXRlSW5kZXgsICRCaXRJbmRleCwgJE9mZnNldAotCi0gICAgICAgIDsvLyAoJEJ5dGVJbmRleCwkQml0SW5kZXgpID0gQ3VycmVudCBwb3NpdGlvbiArICRPZmZzZXQgYml0cwotICAgICAgICBBREQgICAgICRPZmZzZXQsICRPZmZzZXQsICRCaXRDb3VudAotICAgICAgICBBTkQgICAgICRCaXRJbmRleCwgJE9mZnNldCwgIzcKLSAgICAgICAgQUREICAgICAkQnl0ZUluZGV4LCAkcEJpdFN0cmVhbSwgJE9mZnNldCwgQVNSICMzICAgICAgICAKLSAgICAgICAgTUVORAotCi0gICAgICAgIDsvLyBNb3ZlIGJpdHN0cmVhbSBwb2ludGVycyB0byB0aGUgbG9jYXRpb24gZ2l2ZW4KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBPdXRwdXRzIGRlc3RpbmF0aW9uIGJ5dGUgYW5kIGJpdCBpbmRleCB2YWx1ZXMgd2hpY2ggY29ycmVzcG9uZHMgdG8gIAotICAgICAgICA7Ly8gdGhlIGN1cnJlbnQgbG9jYXRpb24gZ2l2ZW4gKGNhbGN1bGF0ZWQgdXNpbmcgTV9CRF9BREQpLiAKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLyAkQnl0ZUluZGV4ICAgICAgLSBEZXN0aW5hdGlvbiBwQml0U3RyZWFtIHBvaW50ZXIgYWZ0ZXIgbW92ZS4gCi0gICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICBUaGlzIHZhbHVlIHdpbGwgYmUgNCBieXRlIGFoZWFkIGFuZCBuZWVkcyB0byBzdWJ0cmFjdCBieSA0IHRvIGdldCBleGFjdCAKLSAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgKGFzIGluIE1fQkRfRklOSSkuCi0gICAgICAgIDsvLyAkQml0SW5kZXggICAgICAgLSBEZXN0aW5hdGlvbiBCaXRDb3VudCBhZnRlciB0aGUgbW92ZQotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAgICAgICAgICAgICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLiAgCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQkRfTU9WICAkQnl0ZUluZGV4LCAkQml0SW5kZXgKLQotICAgICAgICA7Ly8gKCRwQml0U3RyZWFtLCAkT2Zmc2V0KSA9ICgkQnl0ZUluZGV4LCRCaXRJbmRleCkKLSAgICAgICAgTU9WICAgICAkQml0Q291bnQsICRCaXRJbmRleAotICAgICAgICBNT1YgICAgICRwQml0U3RyZWFtLCAkQnl0ZUluZGV4Ci0gICAgICAgIE1FTkQKLQotICAgICAgICA7Ly8gQml0c3RyZWFtIENvbXBhcmUKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBDb21wYXJlcyBiaXRzdHJlYW0gcG9zaXRpb24gd2l0aCB0aGF0IG9mIGEgZGVzdGluYXRpb24gcG9zaXRpb24uIERlc3RpbmF0aW9uIHBvc2l0aW9uIAotICAgICAgICA7Ly8gaXMgaGVsZCBpbiB0d28gaW5wdXQgcmVnaXN0ZXJzIHdoaWNoIGFyZSBjYWxjdWxhdGVkIHVzaW5nIE1fQkRfQUREIG1hY3JvCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRCeXRlSW5kZXggICAgICAtIERlc3RpbmF0aW9uIHBCaXRTdHJlYW0gcG9pbnRlciwgKDQgYnl0ZSBhaGVhZCBhcyBkZXNjcmliZWQgaW4gTV9CRF9BREQpCi0gICAgICAgIDsvLyAkQml0SW5kZXggICAgICAgLSBEZXN0aW5hdGlvbiBCaXRDb3VudAotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBGTEFHUyAgICAgICAgICAgLSBHRSBpZiBkZXN0aW5hdGlvbiBpcyByZWFjaGVkLCBMVCA9IGlzIGRlc3RpbmF0aW9uIGlzIGFoZWFkCi0gICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLwotICAgICAgICBNQUNSTwotICAgICAgICBNX0JEX0NNUCAgJEJ5dGVJbmRleCwgJEJpdEluZGV4LCAkVDEKLSAgICAgICAgCi0gICAgICAgIDsvLyBSZXR1cm4gZmxhZ3Mgc2V0IGJ5IChjdXJyZW50IHBvc2l0b24pLSgkQnl0ZUluZGV4LCRCaXRJbmRleCkKLSAgICAgICAgOy8vIHNvIEdFIG1lYW5zIHRoYXQgd2UgaGF2ZSByZWFjaGVkIHRoZSBpbmRpY2F0ZWQgcG9zaXRpb24KLQotICAgICAgICBBREQgICAgICAgICAkVDEsICRwQml0U3RyZWFtLCAkQml0Q291bnQsIExTUiAjMwotICAgICAgICBDTVAgICAgICAgICAkVDEsICRCeXRlSW5kZXgKLSAgICAgICAgQU5EICAgICAgICAgJFQxLCAkQml0Q291bnQsICM3Ci0gICAgICAgIENNUEVRICAgICAgICRUMSwgJEJpdEluZGV4ICAgICAgICAKLSAgICAgICAgTUVORAotCi0gICAgICAgIAotICAgICAgICA7Ly8gQml0c3RyZWFtIERlY29kZSBmaW5hbGlzZQotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIFdyaXRlcyBiYWNrIHRoZSBiaXRzdHJlYW0gc3RhdGUgdG8gdGhlIGJpdHN0cmVhbSBwb2ludGVycwotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRwcEJpdFN0cmVhbSAgICAtIHBvaW50ZXIgdG8gcG9pbnRlciB0byB0aGUgbmV4dCBiaXRzdHJlYW0gYnl0ZQotICAgICAgICA7Ly8gJHBCaXRPZmZzZXQgICAgIC0gcG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIGJpdHMgdXNlZCBpbiB0aGUgY3VycmVudCBieXRlICgwLi43KQotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gdGhlc2UgcmVnaXN0ZXIgYXJlIGNvcnJ1cHRlZAotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLwotICAgICAgICBNQUNSTwotICAgICAgICBNX0JEX0ZJTkkgICRwcEJpdFN0cmVhbSwgJHBCaXRPZmZzZXQKLSAgICAgICAgCi0gICAgICAgIDsvLyBBZHZhbmNlIHBvaW50ZXIgYnkgdGhlIG51bWJlciBvZiBmcmVlIGJpdHMgaW4gdGhlIGJ1ZmZlcgotICAgICAgICBBREQgICAgICRwQml0U3RyZWFtLCAkcEJpdFN0cmVhbSwgJEJpdENvdW50LCBMU1IjMwotICAgICAgICBBTkQgICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjNwotICAgICAgICAKLSAgICAgICAgOy8vIE5vdyBtb3ZlIGJhY2sgMzIgYml0cyB0byByZWFjaCB0aGUgZmlyc3QgdXN1ZWQgYml0Ci0gICAgICAgIFNVQiAgICAgJHBCaXRTdHJlYW0sICRwQml0U3RyZWFtLCAjNAotICAgICAgICAKLSAgICAgICAgOy8vIFN0b3JlIG91dCBiaXRzdHJlYW0gc3RhdGUKLSAgICAgICAgU1RSICAgICAkQml0Q291bnQsIFskcEJpdE9mZnNldF0KLSAgICAgICAgU1RSICAgICAkcEJpdFN0cmVhbSwgWyRwcEJpdFN0cmVhbV0KLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgRU5ECi0gICAgICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX0JpdHN0cmVhbS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX0JpdHN0cmVhbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzBlZjM3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9CaXRzdHJlYW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDIyNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtQ09NTV9CaXRzdHJlYW0uaAotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICAxMjI5MAotICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRmlsZTogYXJtQ09NTV9CaXRzdHJlYW0uaAotICogQnJpZWY6IERlY2xhcmVzIGNvbW1vbiBBUEkncy9EYXRhIHR5cGVzIHVzZWQgYWNyb3NzIHRoZSBPcGVuTWF4IEVuY29kZXJzL0RlY29kZXJzLgotICoKLSAqLwotCi0jaWZuZGVmIF9hcm1Db2RlY19IXwotI2RlZmluZSBfYXJtQ29kZWNfSF8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBPTVhfVTggICBjb2RlTGVuOwotICAgIE9NWF9VMzIJIGNvZGVXb3JkOwotfSBBUk1fVkxDMzI7Ci0KLS8qIFRoZSBhYm92ZSBzaG91bGQgYmUgcmVuYW1lZCBhcyAiQVJNX1ZMQzMyIiAqLwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1Mb29rQWhlYWRCaXRzKCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIEdldCB0aGUgbmV4dCBOIGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtIHdpdGhvdXQgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlcgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICAgICAqKnBwQml0U3RyZWFtCi0gKiBbaW5dICAgICAqcE9mZnNldAotICogW2luXSAgICAgTj0xLi4uMzIKLSAqCi0gKiBSZXR1cm5zICBWYWx1ZQotICovCi0KLU9NWF9VMzIgYXJtTG9va0FoZWFkQml0cyhjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwgT01YX0lOVCAqcE9mZnNldCwgT01YX0lOVCBOKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtR2V0Qml0cygpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBSZWFkIE4gYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0KLSAqICAgIAotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQotICogW2luXSAgICAgKnBPZmZzZXQKLSAqIFtpbl0gICAgIE49MS4uMzIKLSAqCi0gKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KLSAqIFtvdXRdICAgICpwT2Zmc2V0Ci0gKiBSZXR1cm5zICBWYWx1ZQotICovCi0KLU9NWF9VMzIgYXJtR2V0Qml0cyhjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwgT01YX0lOVCAqcE9mZnNldCwgT01YX0lOVCBOKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtQnl0ZUFsaWduKCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIEFsaWduIHRoZSBwb2ludGVyICpwcEJpdFN0cmVhbSB0byB0aGUgbmV4dCBieXRlIGJvdW5kYXJ5Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQotICogW2luXSAgICAgKnBPZmZzZXQKLSAqCi0gKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KLSAqIFtvdXRdICAgICpwT2Zmc2V0Ci0gKgotICoqLwotIAotT01YVm9pZCBhcm1CeXRlQWxpZ24oY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sT01YX0lOVCAqcE9mZnNldCk7Ci0KLS8qKiAKLSAqIEZ1bmN0aW9uOiBhcm1Ta2lwQml0cygpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBTa2lwIE4gYml0cyBmcm9tIHRoZSB2YWx1ZSBhdCAqcHBCaXRTdHJlYW0KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgICAgKnBwQml0U3RyZWFtCi0gKiBbaW5dICAgICAqcE9mZnNldAotICogW2luXSAgICAgTgotICoKLSAqIFtvdXRdICAgICpwcEJpdFN0cmVhbQotICogW291dF0gICAgKnBPZmZzZXQKLSAqCi0gKiovCi0KLU9NWFZvaWQgYXJtU2tpcEJpdHMoY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sT01YX0lOVCAqcE9mZnNldCxPTVhfSU5UIE4pOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBWYXJpYWJsZSBiaXQgbGVuZ3RoIERlY29kZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVW5QYWNrVkxDMzIoKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVmFyaWFibGUgbGVuZ3RoIGRlY29kZSBvZiB2YXJpYWJsZSBsZW5ndGggc3ltYm9sIChtYXggc2l6ZSAzMiBiaXRzKSByZWFkIGZyb20KLSAqIHRoZSBiaXQgc3RyZWFtIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIGF0ICpwT2Zmc2V0IGJ5IHVzaW5nIHRoZSB0YWJsZQotICogcG9pbnRlZCBieSBwQ29kZUJvb2sKLSAqIAotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gICAgICoqcHBCaXRTdHJlYW0KLSAqIFtpbl0gICAgICpwT2Zmc2V0Ci0gKiBbaW5dICAgICBwQ29kZUJvb2sKLSAqIAotICogW291dF0gICAgKipwcEJpdFN0cmVhbQotICogW291dF0gICAgKnBPZmZzZXQKLSAqCi0gKiBSZXR1cm5zIDogQ29kZSBCb29rIEluZGV4IGlmIHN1Y2Nlc3NmdWxsLiAKLSAqICAgICAgICAgOiAiQVJNX05PX0NPREVCT09LX0lOREVYID0gMHhGRkZGIiBpZiBzZWFyY2ggZmFpbHMuCi0gKiovCi0KLSNkZWZpbmUgQVJNX05PX0NPREVCT09LX0lOREVYIChPTVhfVTE2KSgweEZGRkYpCi0KLU9NWF9VMTYgYXJtVW5QYWNrVkxDMzIoCi0gICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgT01YX0lOVCAqcE9mZnNldCwKLSAgICBjb25zdCBBUk1fVkxDMzIgKnBDb2RlQm9vawotKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRml4ZWQgYml0IGxlbmd0aCBFbmNvZGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogRnVuY3Rpb246IGFybVBhY2tCaXRzCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQYWNrIGEgVkxDIGNvZGUgd29yZCBpbnRvIHRoZSBiaXRzdHJlYW0KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbS4KLSAqIFtpbl0JcE9mZnNldAkgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSAKLSAqICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMAotICogICAgICAgICAgICAgICAgICAgICAgdG8gNy4KLSAqIFtpbl0JY29kZVdvcmQJCUNvZGUgd29yZCB0aGF0IG5lZWQgdG8gYmUgaW5zZXJ0ZWQgaW4gdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtCi0gKiBbaW5dCWNvZGVMZW5ndGgJCUxlbmd0aCBvZiB0aGUgY29kZSB3b3JkIHZhbGlkIHJhbmdlIDEuLi4zMgotICoKLSAqIFtvdXRdIHBwQml0U3RyZWFtCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLAotICoJICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0Ci0gKgkJCQkJCQlzdHJlYW0gYnVmZmVyLgotICogW291dF0gcEJpdE9mZnNldAkJKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKLSAqCQkJCQkJCWN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKLSAqCQkJCQkJCSpwcEJpdFN0cmVhbS4KLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhfUkVTVUxUIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0gCi1PTVhSZXN1bHQgYXJtUGFja0JpdHMgKAotICAgIE9NWF9VOCAgKipwcEJpdFN0cmVhbSwgCi0gICAgT01YX0lOVCAqcE9mZnNldCwKLSAgICBPTVhfVTMyIGNvZGVXb3JkLCAKLSAgICBPTVhfSU5UIGNvZGVMZW5ndGggCi0pOwotIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVmFyaWFibGUgYml0IGxlbmd0aCBFbmNvZGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogRnVuY3Rpb246IGFybVBhY2tWTEMzMgotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGFjayBhIFZMQyBjb2RlIHdvcmQgaW50byB0aGUgYml0c3RyZWFtCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIAotICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0uCi0gKiBbaW5dCXBCaXRPZmZzZXQJICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSAKLSAqICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMAotICogICAgICAgICAgICAgICAgICAgICAgdG8gNy4KLSAqIFtpbl0JIGNvZGUgICAgIAkJVkxDIGNvZGUgd29yZCB0aGF0IG5lZWQgdG8gYmUgaW5zZXJ0ZWQgaW4gdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICBiaXRzdHJlYW0KLSAqCi0gKiBbb3V0XSBwcEJpdFN0cmVhbQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwKLSAqCSAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0Ci0gKgkJCQkJCXN0cmVhbSBidWZmZXIuCi0gKiBbb3V0XSBwQml0T2Zmc2V0CQkqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQotICoJCQkJCQljdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Ci0gKgkJCQkJCSpwcEJpdFN0cmVhbS4KLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhfUkVTVUxUIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0gCi1PTVhSZXN1bHQgYXJtUGFja1ZMQzMyICgKLSAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwgCi0gICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICBBUk1fVkxDMzIgY29kZSAKLSk7Ci0KLSNlbmRpZiAgICAgIC8qX2FybUNvZGVjX0hfKi8KLQotLypFbmQgb2YgRmlsZSovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fSURDVFRhYmxlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fSURDVFRhYmxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3NjFmNjEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX0lEQ1RUYWJsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1DT01NX0lEQ1RUYWJsZS5oCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDEyMjkwCi0gKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBGaWxlICAgICAgICAgOiBhcm1DT01NX0lEQ1RUYWJsZS5oCi0gKiBEZXNjcmlwdGlvbiAgOiBDb250YWlucyBkZWNsYXJhdGlvbnMgb2YgdGFibGVzIGZvciBJRENUIGNhbGN1bGF0aW9uLgotICoKLSAqLwotICAKLSNpZm5kZWYgX2FybUNPTU1fSURDVFRhYmxlX0hfCi0jZGVmaW5lIF9hcm1DT01NX0lEQ1RUYWJsZV9IXwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLQotICAgICAvKiAgVGFibGUgb2Ygcyh1KSpBKHUpKkEodikvMTYgYXQgUTE1Ci0gICAgICAqICBzKHUpPTEuMCAwIDw9IHUgPD0gNQotICAgICAgKiAgcyg2KT0yLjAKLSAgICAgICogIHMoNyk9NC4wCi0gICAgICAqICBBKDApID0gMipzcXJ0KDIpCi0gICAgICAqICBBKHUpID0gNCpjb3ModSpwaS8xNikgIGZvciAodSE9MCkKLQkgICovCi1leHRlcm4gY29uc3QgT01YX1UxNiBhcm1DT01NX0lEQ1RQcmVTY2FsZSBbNjRdOwotZXh0ZXJuIGNvbnN0IE9NWF9VMTYgYXJtQ09NTV9JRENUQ29lZiBbNF07Ci0KLSNlbmRpZiAvKiBfYXJtQ09NTV9JRENUVGFibGVfSF8gKi8KLQotCi0vKiBFbmQgb2YgRmlsZSAqLwotCi0KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fSURDVF9zLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fSURDVF9zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMzAyMjMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX0lEQ1Rfcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1OSArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vCi07Ly8gSURDVF9zLnMKLTsvLwotOy8vIEludmVyc2UgRENUIG1vZHVsZQotOy8vCi07Ly8gCi07Ly8gQUxHT1JJVEhNIERFU0NSSVBUSU9OCi07Ly8KLTsvLyBUaGUgOHg4IDJEIElEQ1QgaXMgcGVyZm9ybWVkIGJ5IGNhbGN1bGF0aW5nIGEgMUQgSURDVCBmb3IgZWFjaAotOy8vIGNvbHVtbiBhbmQgdGhlbiBhIDFEIElEQ1QgZm9yIGVhY2ggcm93LgotOy8vCi07Ly8gVGhlIDgtcG9pbnQgMUQgSURDVCBpcyBkZWZpbmVkIGJ5Ci07Ly8gICBmKHgpID0gKEMoMCkqVCgwKSpjKDAseCkgKyAuLi4gKyBDKDcpKlQoNykqYyg3LHgpKS8yCi07Ly8KLTsvLyAgIEModSkgPSAxL3NxcnQoMikgaWYgdT0wIG9yIDEgaWYgdSE9MAotOy8vICAgYyh1LHgpID0gY29zKCAoMngrMSkqdSpwaS8xNiApCi07Ly8KLTsvLyBXZSBjb21wdXRlIHRoZSA4LXBvaW50IDFEIElEQ1QgdXNpbmcgdGhlIHJldmVyc2Ugb2YKLTsvLyB0aGUgQXJhaS1BZ3VpLU5ha2FqaW1hIGZsb3cgZ3JhcGggd2hpY2ggd2Ugc3BsaXQgaW50bwotOy8vIDUgc3RhZ2VzIG5hbWVkIGluIHJldmVyc2Ugb3JkZXIgdG8gaWRlbnRpZnkgd2l0aCB0aGUKLTsvLyBmb3J3YXJkIERDVC4gRGlyZWN0IGludmVyc2lvbiBvZiB0aGUgZm9yd2FyZCBmb3JtdWxhZQotOy8vIGluIGZpbGUgRkRDVF9zLnMgZ2l2ZXM6Ci07Ly8KLTsvLyBJU3RhZ2UgNTogICBqKHUpID0gVCh1KSpBKHUpICBbIEEodSk9NCpDKHUpKmModSwwKSBdCi07Ly8gICAgICAgICAgICAgWyBBKDApID0gMipzcXJ0KDIpCi07Ly8gICAgICAgICAgICAgICBBKHUpID0gNCpjb3ModSpwaS8xNikgIGZvciAodSE9MCkgXQotOy8vCi07Ly8gSVN0YWdlIDQ6ICAgaTAgPSBqMCAgICAgICAgICAgICBpMSA9IGo0Ci07Ly8gICAgICAgICAgICAgaTMgPSAoajIrajYpLzIgICAgICBpMiA9IChqMi1qNikvMgotOy8vICAgICAgICAgICAgIGk3ID0gKGo1K2ozKS8yICAgICAgaTQgPSAoajUtajMpLzIKLTsvLyAgICAgICAgICAgICBpNSA9IChqMStqNykvMiAgICAgIGk2ID0gKGoxLWo3KS8yCi07Ly8KLTsvLyBJU3RhZ2UgMzogICBoMCA9IChpMCtpMSkvMiAgICAgIGgxID0gKGkwLWkxKS8yCi07Ly8gICAgICAgICAgICAgaDIgPSAoaTIqc3FydDIpLWkzICBoMyA9IGkzCi07Ly8gICAgICAgICAgICAgaDQgPSAgY29zKHBpLzgpKmk0ICsgc2luKHBpLzgpKmk2Ci07Ly8gICAgICAgICAgICAgaDYgPSAtc2luKHBpLzgpKmk0ICsgY29zKHBpLzgpKmk2Ci07Ly8gICAgICAgICAgICAgWyBUaGUgYWJvdmUgdHdvIGxpbmVzIHJvdGF0ZSBieSAtKHBpLzgpIF0KLTsvLyAgICAgICAgICAgICBoNSA9IChpNS1pNykvc3FydDIgIGg3ID0gKGk1K2k3KS8yIAotOy8vICAgICAgICAgICAgIAotOy8vIElTdGFnZSAyOiAgIGcwID0gKGgwK2gzKS8yICAgICAgZzMgPSAoaDAtaDMpLzIKLTsvLyAgICAgICAgICAgICBnMSA9IChoMStoMikvMiAgICAgIGcyID0gKGgxLWgyKS8yCi07Ly8gICAgICAgICAgICAgZzcgPSBoNyAgICAgICAgICAgICBnNiA9IGg2IC0gaDcKLTsvLyAgICAgICAgICAgICBnNSA9IGg1IC0gZzYgICAgICAgIGc0ID0gaDQgLSBnNQotOy8vCi07Ly8gSVN0YWdlIDE6ICAgZjAgPSAoZzArZzcpLzIgICAgICBmNyA9IChnMC1nNykvMgotOy8vICAgICAgICAgICAgIGYxID0gKGcxK2c2KS8yICAgICAgZjYgPSAoZzEtZzYpLzIKLTsvLyAgICAgICAgICAgICBmMiA9IChnMitnNSkvMiAgICAgIGY1ID0gKGcyLWc1KS8yCi07Ly8gICAgICAgICAgICAgZjMgPSAoZzMrZzQpLzIgICAgICBmNCA9IChnMy1nNCkvMgotOy8vCi07Ly8gTm90ZSB0aGF0IG1vc3QgY29lZmZpY2llbnRzIGFyZSBoYWx2ZWQgMyB0aW1lcyBkdXJpbmcgdGhlCi07Ly8gYWJvdmUgY2FsY3VsYXRpb24uIFdlIGNhbiByZXNjYWxlIHRoZSBhbGdvcml0aG0gZGl2aWRpbmcKLTsvLyB0aGUgaW5wdXQgYnkgOCB0byByZW1vdmUgdGhlIGhhbHZpbmdzLgotOy8vCi07Ly8gSVN0YWdlIDU6ICAgaih1KSA9IFQodSkqQSh1KS84Ci07Ly8KLTsvLyBJU3RhZ2UgNDogICBpMCA9IGowICAgICAgICAgICAgIGkxID0gajQKLTsvLyAgICAgICAgICAgICBpMyA9IGoyICsgajYgICAgICAgIGkyID0gajIgLSBqNgotOy8vICAgICAgICAgICAgIGk3ID0gajUgKyBqMyAgICAgICAgaTQgPSBqNSAtIGozCi07Ly8gICAgICAgICAgICAgaTUgPSBqMSArIGo3ICAgICAgICBpNiA9IGoxIC0gajcKLTsvLwotOy8vIElTdGFnZSAzOiAgIGgwID0gaTAgKyBpMSAgICAgICAgaDEgPSBpMCAtIGkxCi07Ly8gICAgICAgICAgICAgaDIgPSAoaTIqc3FydDIpLWkzICBoMyA9IGkzCi07Ly8gICAgICAgICAgICAgaDQgPSAyKiggY29zKHBpLzgpKmk0ICsgc2luKHBpLzgpKmk2KQotOy8vICAgICAgICAgICAgIGg2ID0gMiooLXNpbihwaS84KSppNCArIGNvcyhwaS84KSppNikKLTsvLyAgICAgICAgICAgICBoNSA9IChpNS1pNykqc3FydDIgIGg3ID0gaTUgKyBpNyAKLTsvLyAgICAgICAgICAgICAKLTsvLyBJU3RhZ2UgMjogICBnMCA9IGgwICsgaDMgICAgICAgIGczID0gaDAgLSBoMwotOy8vICAgICAgICAgICAgIGcxID0gaDEgKyBoMiAgICAgICAgZzIgPSBoMSAtIGgyCi07Ly8gICAgICAgICAgICAgZzcgPSBoNyAgICAgICAgICAgICBnNiA9IGg2IC0gaDcKLTsvLyAgICAgICAgICAgICBnNSA9IGg1IC0gZzYgICAgICAgIGc0ID0gaDQgLSBnNQotOy8vCi07Ly8gSVN0YWdlIDE6ICAgZjAgPSBnMCArIGc3ICAgICAgICBmNyA9IGcwIC0gZzcKLTsvLyAgICAgICAgICAgICBmMSA9IGcxICsgZzYgICAgICAgIGY2ID0gZzEgLSBnNgotOy8vICAgICAgICAgICAgIGYyID0gZzIgKyBnNSAgICAgICAgZjUgPSBnMiAtIGc1Ci07Ly8gICAgICAgICAgICAgZjMgPSBnMyArIGc0ICAgICAgICBmNCA9IGczIC0gZzQKLTsvLwotOy8vIE5vdGU6Ci07Ly8gMS4gVGhlIHNjYWxpbmcgYnkgQSh1KS84IGNhbiBvZnRlbiBiZSBjb21iaW5lZCB3aXRoIGludmVyc2UKLTsvLyAgICBxdWFudGl6YXRpb24uIFRoZSBjb2x1bW4gYW5kIHJvdyBzY2FsaW5ncyBjYW4gYmUgY29tYmluZWQuCi07Ly8gMi4gVGhlIGZsb3dncmFwaCBpbiB0aGUgQUFOIHBhcGVyIGhhcyBoNCxnNiBuZWdhdGVkIGNvbXBhcmVkCi07Ly8gICAgdG8gdGhlIGFib3ZlIGNvZGUgYnV0IGlzIG90aGVyd2lzZSBpZGVudGljYWwuCi07Ly8gMy4gVGhlIHJvdGF0aW9uIGJ5IC1waS84IGNhbiBiZSBwZWZvcm1lZCB1c2luZyB0aHJlZSBtdWx0aXBsaWVzCi07Ly8gICAgRWcgIGMqaTQrcyppNiA9IChpNi1pNCkqcyArIChjK3MpKmk0Ci07Ly8gICAgICAgLXMqaTQrYyppNiA9IChpNi1pNCkqcyArIChjLXMpKmk2Ci07Ly8gNC4gSWYgfFQodSl8PD0xIHRoZW4gZnJvbSB0aGUgSURDVCBkZWZpbml0aW9uLAotOy8vICAgIHxmKHgpfCA8PSAoKDEvc3FydDIpICsgfGMoMSx4KXwgKyAuLiArIHxjKDcseCl8KS8yCi07Ly8gICAgICAgICAgICA9ICgoMS9zcXJ0MikgKyBjb3MocGkvMTYpICsgLi4uICsgY29zKDcqcGkvMTYpKS8yCi07Ly8gICAgICAgICAgICA9ICgoMS9zcXJ0MikgKyAoY290KHBpLzMyKS0xKS8yKS8yCi07Ly8gICAgICAgICAgICA9ICgxICsgY29zKHBpLzE2KSArIGNvcygycGkvMTYpICsgY29zKDNwaS8xNikpL3NxcnQoMikKLTsvLyAgICAgICAgICAgID0gKGFwcHJveCkyLjY0Ci07Ly8gICAgU28gdGhlIG1heCBnYWluIG9mIHRoZSAyRCBJRENUIGlzIH54Ny4wID0gMyBiaXRzLgotOy8vICAgIFRoZSB0YWJsZSBiZWxvdyBzaG93cyBpbnB1dCBwYXR0ZXJucyBnZW5lcmF0aW5nIHRoZSBtYXhpbXVtCi07Ly8gICAgdmFsdWUgb2YgfGYodSl8IGZvciBpbnB1dCBpbiB0aGUgcmFuZ2UgfFQoeCl8PD0xLiBNPS0xLCBQPSsxCi07Ly8gICAgSW5wdXRQYXR0ZXJuICAgICAgTWF4IHxmKHgpfAotOy8vICAgICAgUFBQUFBQUFAgICAgICAgIHxmMHwgPSAgMi42NAotOy8vICAgICAgUFBQTU1NTU0gICAgICAgIHxmMXwgPSAgMi42NAotOy8vICAgICAgUFBNTU1QUFAgICAgICAgIHxmMnwgPSAgMi42NAotOy8vICAgICAgUFBNTVBQTU0gICAgICAgIHxmM3wgPSAgMi42NAotOy8vICAgICAgUE1NUFBNTVAgICAgICAgIHxmNHwgPSAgMi42NAotOy8vICAgICAgUE1NUE1NUE0gICAgICAgIHxmNXwgPSAgMi42NAotOy8vICAgICAgUE1QUE1QTVAgICAgICAgIHxmNnwgPSAgMi42NAotOy8vICAgICAgUE1QTVBNUE0gICAgICAgIHxmN3wgPSAgMi42NAotOy8vICAgTm90ZSB0aGF0IHRoaXMgaW5wdXQgcGF0dGVybiBpcyB0aGUgdHJhbnNwb3NlIG9mIHRoZQotOy8vICAgY29ycmVzcG9uZGluZyBtYXggaW5wdXQgcGF0dGVyIGZvciB0aGUgRkRDVC4KLQotOy8vIEFyZ3VtZW50cwotCi1wU3JjICAgIFJOIDAgICAgOy8vIHNvdXJjZSBkYXRhIGJ1ZmZlcgotU3RyaWRlICBSTiAxICAgIDsvLyBkZXN0aW5hdGlvbiBzdHJpZGUgaW4gYnl0ZXMKLXBEZXN0ICAgUk4gMiAgICA7Ly8gZGVzdGluYXRpb24gZGF0YSBidWZmZXIKLXBTY2FsZSAgUk4gMyAgICA7Ly8gcG9pbnRlciB0byBzY2FsaW5nIHRhYmxlCi0KLQotICAgICAgICA7Ly8gRENUIEludmVyc2UgTWFjcm8KLSAgICAgICAgOy8vIFRoZSBEQ1QgY29kZSBzaG91bGQgYmUgcGFyYW1ldHJpemVkIGFjY29yZGluZwotICAgICAgICA7Ly8gdG8gdGhlIGZvbGxvd2luZyBpbnB1dHM6Ci0gICAgICAgIDsvLyAkb3V0c2l6ZSA9ICJ1OCIgIDogIDgtYml0IHVuc2lnbmVkIGRhdGEgc2F0dXJhdGVkICgwIHRvICsyNTUpCi0gICAgICAgIDsvLyAgICAgICAgICAgICJzOSIgIDogMTYtYml0IHNpZ25lZCBkYXRhIHNhdHVyYXRlZCB0byA5LWJpdCAoLTI1NiB0byArMjU1KQotICAgICAgICA7Ly8gICAgICAgICAgICAiczE2IiA6IDE2LWJpdCBzaWduZWQgZGF0YSBub3Qgc2F0dXJhdGVkIChtYXggc2l6ZSB+Ky8tMTQyNzMpCi0gICAgICAgIDsvLyAkaW5zY2FsZSA9ICJzMTYiIDogc2lnbmVkIDE2LWJpdCBhYW4tc2NhbGUgdGFibGUsIFExNSBmb3JtYXQsIHdpdGggNCBieXRlIGFsaWdubWVudAotICAgICAgICA7Ly8gICAgICAgICAgICAiczMyIiA6IHNpZ25lZCAzMi1iaXQgYWFuLXNjYWxlIHRhYmxlLCBRMjMgZm9ybWF0LCB3aXRoIDQgYnl0ZSBhbGlnbm1lbnQKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnB1dHM6Ci0gICAgICAgIDsvLyBwU3JjICAgPSByMCA9IFBvaW50ZXIgdG8gaW5wdXQgZGF0YQotICAgICAgICA7Ly8gICAgICAgICAgICAgICBSYW5nZSBpcyAtMjU2IHRvICsyNTUgKDktYml0KQotICAgICAgICA7Ly8gU3RyaWRlID0gcjEgPSBTdHJpZGUgYmV0d2VlbiBpbnB1dCBsaW5lcwotICAgICAgICA7Ly8gcERlc3QgID0gcjIgPSBQb2ludGVyIHRvIG91dHB1dCBkYXRhCi0gICAgICAgIDsvLyBwU2NhbGUgPSByMyA9IFBvaW50ZXIgdG8gYWFuLXNjYWxlIHRhYmxlIGluIHRoZSBmb3JtYXQgZGVmaW5lZCBieSAkaW5zY2FsZQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBNX0lEQ1QgICRvdXRzaXplLCAkaW5zY2FsZSwgJHN0cmlkZQotICAgICAgICBMQ0xBICAgIFNISUZUCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgSUYgQVJNMTEzNkpTCi0gICAgICAgIAotOy8vIFJFR0lTVEVSIEFMTE9DQVRJT04KLTsvLyBUaGlzIGlzIGhhcmQgc2luY2Ugd2UgaGF2ZSA4IHZhbHVlcywgOSBmcmVlIHJlZ2lzdGVycyBhbmQgZWFjaAotOy8vIGJ1dHRlcmZseSByZXF1aXJlcyBhIHRlbXBvcmFyeSByZWdpc3Rlci4gV2UgYWxzbyB3YW50IHRvIAotOy8vIG1haW50YWluIHJlZ2lzdGVyIG9yZGVyIHNvIHdlIGNhbiB1c2UgTERNL1NUTS4gVGhlIHRhYmxlIGJlbG93Ci07Ly8gc3VtbWFyaXNlcyB0aGUgcmVnaXN0ZXIgYWxsb2NhdGlvbiB0aGF0IG1lZXRzIGFsbCB0aGVzZSBjcml0ZXJpYS4KLTsvLyBhPTFzdGNvbCwgYj0ybmRjb2wsIGYsZyxoLGkgYXJlIGRhdGFmbG93IHBvaW50cyBkZXNjcmliZWQgYWJvdmUuCi07Ly8KLTsvLyByMSAgYTAxICAgICBnMCAgaDAKLTsvLyByNCAgYjAxIGYwICBnMSAgaDEgIGkwCi07Ly8gcjUgIGEyMyBmMSAgZzIgICAgICBpMQotOy8vIHI2ICBiMjMgZjIgIGczICBoMiAgaTIKLTsvLyByNyAgYTQ1IGYzICAgICAgaDMgIGkzCi07Ly8gcjggIGI0NSBmNCAgZzQgIGg0ICBpNAotOy8vIHI5ICBhNjcgZjUgIGc1ICBoNSAgaTUKLTsvLyByMTAgYjY3IGY2ICBnNiAgaDYgIGk2Ci07Ly8gcjExICAgICBmNyAgZzcgIGg3ICBpNwotOy8vCi1yYTAxICAgIFJOIDEKLXJiMDEgICAgUk4gNAotcmEyMyAgICBSTiA1Ci1yYjIzICAgIFJOIDYKLXJhNDUgICAgUk4gNwotcmI0NSAgICBSTiA4Ci1yYTY3ICAgIFJOIDkKLXJiNjcgICAgUk4gMTAKLXJ0bXAgICAgUk4gMTEKLWNzUGlCeTggUk4gMTIgICA7Ly8gWyAoU2luKHBpLzgpQFExNSksIChDb3MocGkvOClAUTE1KSBdCi1Mb29wUlIyIFJOIDE0ICAgOy8vIFsgTG9vcE51bWJlcjw8MTMgLCAoMS9TcXJ0KDIpKUBRMTUgXQotOy8vIFRyYW5zcG9zZSBhbGxvY2F0aW9uCi14ZnQgICAgIFJOIHJhMDEKLXhmMCAgICAgUk4gcmIwMQoteGYxICAgICBSTiByYTIzCi14ZjIgICAgIFJOIHJiMjMKLXhmMyAgICAgUk4gcmE0NQoteGY0ICAgICBSTiByYjQ1Ci14ZjUgICAgIFJOIHJhNjcKLXhmNiAgICAgUk4gcmI2NwoteGY3ICAgICBSTiBydG1wCi07Ly8gSVN0YWdlIDEgYWxsb2NhdGlvbgoteGcwICAgICBSTiB4ZnQKLXhnMSAgICAgUk4geGYwCi14ZzIgICAgIFJOIHhmMQoteGczICAgICBSTiB4ZjIKLXhndCAgICAgUk4geGYzCi14ZzQgICAgIFJOIHhmNAoteGc1ICAgICBSTiB4ZjUKLXhnNiAgICAgUk4geGY2Ci14ZzcgICAgIFJOIHhmNwotOy8vIElTdGFnZSAyIGFsbG9jYXRpb24KLXhoMCAgICAgUk4geGcwCi14aDEgICAgIFJOIHhnMQoteGh0ICAgICBSTiB4ZzIKLXhoMiAgICAgUk4geGczCi14aDMgICAgIFJOIHhndAoteGg0ICAgICBSTiB4ZzQKLXhoNSAgICAgUk4geGc1Ci14aDYgICAgIFJOIHhnNgoteGg3ICAgICBSTiB4ZzcKLTsvLyBJU3RhZ2UgMyw0IGFsbG9jYXRpb24KLXhpdCAgICAgUk4geGgwCi14aTAgICAgIFJOIHhoMQoteGkxICAgICBSTiB4aHQKLXhpMiAgICAgUk4geGgyCi14aTMgICAgIFJOIHhoMwoteGk0ICAgICBSTiB4aDQKLXhpNSAgICAgUk4geGg1Ci14aTYgICAgIFJOIHhoNgoteGk3ICAgICBSTiB4aDcKLSAgICAgICAgCi0gICAgICAgIE1fU1RSICAgcERlc3QsICBwcERlc3QKLSAgICAgICAgSUYgIiRzdHJpZGUiPSJzIgotICAgICAgICAgICAgTV9TVFIgICBTdHJpZGUsIHBTdHJpZGUKLSAgICAgICAgRU5ESUYKLSAgICAgICAgTV9BRFIgICBwRGVzdCwgIHBCbGsKLSAgICAgICAgTERSICAgICBjc1BpQnk4LCA9MHgzMGZjNzY0MgotICAgICAgICBMRFIgICAgIExvb3BSUjIsID0weDAwMDA1YTgyCi0gIAotdjZfaWRjdF9jb2wkX0YKLSAgICAgICAgOy8vIExvYWQgZXZlbiB2YWx1ZXMKLSAgICAgICAgTERSICAgICB4aTQsIFtwU3JjXSwgIzQgIDsvLyBqMAotICAgICAgICBMRFIgICAgIHhpNSwgW3BTcmMsICM0KjE2LTRdICA7Ly8gajQKLSAgICAgICAgTERSICAgICB4aTYsIFtwU3JjLCAjMioxNi00XSAgOy8vIGoyCi0gICAgICAgIExEUiAgICAgeGk3LCBbcFNyYywgIzYqMTYtNF0gIDsvLyBqNgotICAgICAgICAKLSAgICAgICAgOy8vIFNjYWxlIEV2ZW4gVmFsdWVzCi0gICAgICAgIElGICIkaW5zY2FsZSI9InMxNiIgOy8vIDE2eDE2IG11bAotU0hJRlQgICAgICAgU0VUQSAgICAxMgotICAgICAgICAgICAgTERSICAgICB4aTAsIFtwU2NhbGVdLCAjNAotICAgICAgICAgICAgTERSICAgICB4aTEsIFtwU2NhbGUsICM0KjE2LTRdICAgICAgICAKLSAgICAgICAgICAgIExEUiAgICAgeGkyLCBbcFNjYWxlLCAjMioxNi00XQotICAgICAgICAgICAgTU9WICAgICB4aXQsICMxPDwoU0hJRlQtMSkKLSAgICAgICAgICAgIFNNTEFCQiAgeGkzLCB4aTAsIHhpNCwgeGl0Ci0gICAgICAgICAgICBTTUxBVFQgIHhpNCwgeGkwLCB4aTQsIHhpdAotICAgICAgICAgICAgU01MQUJCICB4aTAsIHhpMSwgeGk1LCB4aXQKLSAgICAgICAgICAgIFNNTEFUVCAgeGk1LCB4aTEsIHhpNSwgeGl0Ci0gICAgICAgICAgICBNT1YgICAgIHhpMywgeGkzLCBBU1IgI1NISUZUCi0gICAgICAgICAgICBQS0hCVCAgIHhpNCwgeGkzLCB4aTQsIExTTCAjKDE2LVNISUZUKQotICAgICAgICAgICAgTERSICAgICB4aTMsIFtwU2NhbGUsICM2KjE2LTRdCi0gICAgICAgICAgICBTTUxBQkIgIHhpMSwgeGkyLCB4aTYsIHhpdAotICAgICAgICAgICAgU01MQVRUICB4aTYsIHhpMiwgeGk2LCB4aXQKLSAgICAgICAgICAgIE1PViAgICAgeGkwLCB4aTAsIEFTUiAjU0hJRlQKLSAgICAgICAgICAgIFBLSEJUICAgeGk1LCB4aTAsIHhpNSwgTFNMICMoMTYtU0hJRlQpCi0gICAgICAgICAgICBTTUxBQkIgIHhpMiwgeGkzLCB4aTcsIHhpdAotICAgICAgICAgICAgU01MQVRUICB4aTcsIHhpMywgeGk3LCB4aXQKLSAgICAgICAgICAgIE1PViAgICAgeGkxLCB4aTEsIEFTUiAjU0hJRlQKLSAgICAgICAgICAgIFBLSEJUICAgeGk2LCB4aTEsIHhpNiwgTFNMICMoMTYtU0hJRlQpCi0gICAgICAgICAgICBNT1YgICAgIHhpMiwgeGkyLCBBU1IgI1NISUZUCi0gICAgICAgICAgICBQS0hCVCAgIHhpNywgeGkyLCB4aTcsIExTTCAjKDE2LVNISUZUKQotICAgICAgICBFTkRJRgotICAgICAgICBJRiAiJGluc2NhbGUiPSJzMzIiIDsvLyAzMngxNiBtdWwKLVNISUZUICAgICAgIFNFVEEgICAgKDEyKzgtMTYpCi0gICAgICAgICAgICBNT1YgICAgIHhpdCwgIzE8PChTSElGVC0xKQotICAgICAgICAgICAgTERSICAgICB4aTAsIFtwU2NhbGVdLCAjOAotICAgICAgICAgICAgTERSICAgICB4aTEsIFtwU2NhbGUsICMwKjMyKzQtOF0KLSAgICAgICAgICAgIExEUiAgICAgeGkyLCBbcFNjYWxlLCAjNCozMi04XQotICAgICAgICAgICAgTERSICAgICB4aTMsIFtwU2NhbGUsICM0KjMyKzQtOF0gICAgICAgICAgICAKLSAgICAgICAgICAgIFNNTEFXQiAgeGkwLCB4aTAsIHhpNCwgeGl0Ci0gICAgICAgICAgICBTTUxBV1QgIHhpMSwgeGkxLCB4aTQsIHhpdAotICAgICAgICAgICAgU01MQVdCICB4aTIsIHhpMiwgeGk1LCB4aXQKLSAgICAgICAgICAgIFNNTEFXVCAgeGkzLCB4aTMsIHhpNSwgeGl0ICAgICAgICAgICAgCi0gICAgICAgICAgICBNT1YgICAgIHhpMCwgeGkwLCBBU1IgI1NISUZUCi0gICAgICAgICAgICBQS0hCVCAgIHhpNCwgeGkwLCB4aTEsIExTTCAjKDE2LVNISUZUKQotICAgICAgICAgICAgTU9WICAgICB4aTIsIHhpMiwgQVNSICNTSElGVCAgICAgICAgICAgIAotICAgICAgICAgICAgUEtIQlQgICB4aTUsIHhpMiwgeGkzLCBMU0wgIygxNi1TSElGVCkKLSAgICAgICAgICAgIExEUiAgICAgeGkwLCBbcFNjYWxlLCAjMiozMi04XQotICAgICAgICAgICAgTERSICAgICB4aTEsIFtwU2NhbGUsICMyKjMyKzQtOF0KLSAgICAgICAgICAgIExEUiAgICAgeGkyLCBbcFNjYWxlLCAjNiozMi04XQotICAgICAgICAgICAgTERSICAgICB4aTMsIFtwU2NhbGUsICM2KjMyKzQtOF0gICAgICAgICAgICAKLSAgICAgICAgICAgIFNNTEFXQiAgeGkwLCB4aTAsIHhpNiwgeGl0Ci0gICAgICAgICAgICBTTUxBV1QgIHhpMSwgeGkxLCB4aTYsIHhpdAotICAgICAgICAgICAgU01MQVdCICB4aTIsIHhpMiwgeGk3LCB4aXQKLSAgICAgICAgICAgIFNNTEFXVCAgeGkzLCB4aTMsIHhpNywgeGl0ICAgICAgICAgICAgCi0gICAgICAgICAgICBNT1YgICAgIHhpMCwgeGkwLCBBU1IgI1NISUZUCi0gICAgICAgICAgICBQS0hCVCAgIHhpNiwgeGkwLCB4aTEsIExTTCAjKDE2LVNISUZUKQotICAgICAgICAgICAgTU9WICAgICB4aTIsIHhpMiwgQVNSICNTSElGVCAgICAgICAgICAgIAotICAgICAgICAgICAgUEtIQlQgICB4aTcsIHhpMiwgeGkzLCBMU0wgIygxNi1TSElGVCkKLSAgICAgICAgRU5ESUYKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgOy8vIExvYWQgb2RkIHZhbHVlcwotICAgICAgICBMRFIgICAgIHhpMCwgW3BTcmMsICMxKjE2LTRdICAgICAgOy8vIGoxCi0gICAgICAgIExEUiAgICAgeGkxLCBbcFNyYywgIzcqMTYtNF0gICAgICA7Ly8gajcKLSAgICAgICAgTERSICAgICB4aTIsIFtwU3JjLCAjNSoxNi00XSAgICAgIDsvLyBqNQotICAgICAgICBMRFIgICAgIHhpMywgW3BTcmMsICMzKjE2LTRdICAgICAgOy8vIGozCi0gICAgICAgIAotICAgICAgICBJRiAge1RSVUV9Ci0gICAgICAgICAgICA7Ly8gc2hvcnRjdXQgaWYgb2RkIHZhbHVlcyAwCi0gICAgICAgICAgICBURVEgICAgIHhpMCwgIzAKLSAgICAgICAgICAgIFRFUUVRICAgeGkxLCAjMAotICAgICAgICAgICAgVEVRRVEgICB4aTIsICMwCi0gICAgICAgICAgICBURVFFUSAgIHhpMywgIzAKLSAgICAgICAgICAgIEJFUSAgICAgdjZPZGRaZXJvJF9GCi0gICAgICAgIEVORElGCi0gICAgICAgIAotICAgICAgICA7Ly8gU3RvcmUgc2NhbGVkIGV2ZW4gdmFsdWVzCi0gICAgICAgIFNUTUlBICAgcERlc3QsIHt4aTQsIHhpNSwgeGk2LCB4aTd9Ci0gICAgICAgIAotICAgICAgICA7Ly8gU2NhbGUgb2RkIHZhbHVlcwotICAgICAgICBJRiAiJGluc2NhbGUiPSJzMTYiCi0gICAgICAgICAgICA7Ly8gUGVyZm9ybSBBQU4gU2NhbGUKLSAgICAgICAgICAgIExEUiAgICAgeGk0LCBbcFNjYWxlLCAjMSoxNi00XQotICAgICAgICAgICAgTERSICAgICB4aTUsIFtwU2NhbGUsICM3KjE2LTRdICAgICAgICAKLSAgICAgICAgICAgIExEUiAgICAgeGk2LCBbcFNjYWxlLCAjNSoxNi00XQotICAgICAgICAgICAgU01MQUJCICB4aTcsIHhpMCwgeGk0LCB4aXQKLSAgICAgICAgICAgIFNNTEFUVCAgeGkwLCB4aTAsIHhpNCwgeGl0Ci0gICAgICAgICAgICBTTUxBQkIgIHhpNCwgeGkxLCB4aTUsIHhpdAotICAgICAgICAgICAgU01MQVRUICB4aTEsIHhpMSwgeGk1LCB4aXQKLSAgICAgICAgICAgIE1PViAgICAgeGk3LCB4aTcsIEFTUiAjU0hJRlQKLSAgICAgICAgICAgIFBLSEJUICAgeGkwLCB4aTcsIHhpMCwgTFNMICMoMTYtU0hJRlQpCi0gICAgICAgICAgICBMRFIgICAgIHhpNywgW3BTY2FsZSwgIzMqMTYtNF0KLSAgICAgICAgICAgIFNNTEFCQiAgeGk1LCB4aTIsIHhpNiwgeGl0Ci0gICAgICAgICAgICBTTUxBVFQgIHhpMiwgeGkyLCB4aTYsIHhpdAotICAgICAgICAgICAgTU9WICAgICB4aTQsIHhpNCwgQVNSICNTSElGVAotICAgICAgICAgICAgUEtIQlQgICB4aTEsIHhpNCwgeGkxLCBMU0wgIygxNi1TSElGVCkKLSAgICAgICAgICAgIFNNTEFCQiAgeGk2LCB4aTMsIHhpNywgeGl0Ci0gICAgICAgICAgICBTTUxBVFQgIHhpMywgeGkzLCB4aTcsIHhpdAotICAgICAgICAgICAgTU9WICAgICB4aTUsIHhpNSwgQVNSICNTSElGVAotICAgICAgICAgICAgUEtIQlQgICB4aTIsIHhpNSwgeGkyLCBMU0wgIygxNi1TSElGVCkKLSAgICAgICAgICAgIE1PViAgICAgeGk2LCB4aTYsIEFTUiAjU0hJRlQKLSAgICAgICAgICAgIFBLSEJUICAgeGkzLCB4aTYsIHhpMywgTFNMICMoMTYtU0hJRlQpCi0gICAgICAgIEVORElGCi0gICAgICAgIElGICIkaW5zY2FsZSI9InMzMiIgOy8vIDMyeDE2IG11bAotICAgICAgICAgICAgTERSICAgICB4aTQsIFtwU2NhbGUsICMxKjMyLThdCi0gICAgICAgICAgICBMRFIgICAgIHhpNSwgW3BTY2FsZSwgIzEqMzIrNC04XQotICAgICAgICAgICAgTERSICAgICB4aTYsIFtwU2NhbGUsICM3KjMyLThdCi0gICAgICAgICAgICBMRFIgICAgIHhpNywgW3BTY2FsZSwgIzcqMzIrNC04XSAgICAgICAgICAgIAotICAgICAgICAgICAgU01MQVdCICB4aTQsIHhpNCwgeGkwLCB4aXQKLSAgICAgICAgICAgIFNNTEFXVCAgeGk1LCB4aTUsIHhpMCwgeGl0Ci0gICAgICAgICAgICBTTUxBV0IgIHhpNiwgeGk2LCB4aTEsIHhpdAotICAgICAgICAgICAgU01MQVdUICB4aTcsIHhpNywgeGkxLCB4aXQgICAgICAgICAgICAKLSAgICAgICAgICAgIE1PViAgICAgeGk0LCB4aTQsIEFTUiAjU0hJRlQKLSAgICAgICAgICAgIFBLSEJUICAgeGkwLCB4aTQsIHhpNSwgTFNMICMoMTYtU0hJRlQpCi0gICAgICAgICAgICBNT1YgICAgIHhpNiwgeGk2LCBBU1IgI1NISUZUICAgICAgICAgICAgCi0gICAgICAgICAgICBQS0hCVCAgIHhpMSwgeGk2LCB4aTcsIExTTCAjKDE2LVNISUZUKQotICAgICAgICAgICAgTERSICAgICB4aTQsIFtwU2NhbGUsICM1KjMyLThdCi0gICAgICAgICAgICBMRFIgICAgIHhpNSwgW3BTY2FsZSwgIzUqMzIrNC04XQotICAgICAgICAgICAgTERSICAgICB4aTYsIFtwU2NhbGUsICMzKjMyLThdCi0gICAgICAgICAgICBMRFIgICAgIHhpNywgW3BTY2FsZSwgIzMqMzIrNC04XSAgICAgICAgICAgIAotICAgICAgICAgICAgU01MQVdCICB4aTQsIHhpNCwgeGkyLCB4aXQKLSAgICAgICAgICAgIFNNTEFXVCAgeGk1LCB4aTUsIHhpMiwgeGl0Ci0gICAgICAgICAgICBTTUxBV0IgIHhpNiwgeGk2LCB4aTMsIHhpdAotICAgICAgICAgICAgU01MQVdUICB4aTcsIHhpNywgeGkzLCB4aXQgICAgICAgICAgICAKLSAgICAgICAgICAgIE1PViAgICAgeGk0LCB4aTQsIEFTUiAjU0hJRlQKLSAgICAgICAgICAgIFBLSEJUICAgeGkyLCB4aTQsIHhpNSwgTFNMICMoMTYtU0hJRlQpCi0gICAgICAgICAgICBNT1YgICAgIHhpNiwgeGk2LCBBU1IgI1NISUZUICAgICAgICAgICAgCi0gICAgICAgICAgICBQS0hCVCAgIHhpMywgeGk2LCB4aTcsIExTTCAjKDE2LVNISUZUKQotICAgICAgICBFTkRJRgotICAgICAgICAKLSAgICAgICAgTERSICAgICB4aXQsID0weDAwMDEwMDAxICAgICAgICA7Ly8gcm91bmRpbmcgY29uc3RhbnQKLSAgICAgICAgU0FERDE2IHhpNSwgeGkwLCB4aTEgICAgICAgICAgIDsvLyAoajErajcpLzIKLSAgICAgICAgU0hBREQxNiB4aTUsIHhpNSwgeGl0Ci0gICAgICAgIAotICAgICAgICBTU1VCMTYgIHhpNiwgeGkwLCB4aTEgICAgICAgICAgIDsvLyBqMS1qNwotICAgICAgICBTQUREMTYgeGk3LCB4aTIsIHhpMyAgICAgICAgICAgOy8vIChqNStqMykvMgotICAgICAgICBTSEFERDE2IHhpNywgeGk3LCB4aXQKLSAgICAgICAgCi0gICAgICAgIFNTVUIxNiAgeGk0LCB4aTIsIHhpMyAgICAgICAgICAgOy8vIGo1LWozCi0gICAgICAgIAotICAgICAgICBTU1VCMTYgIHhpMywgeGk1LCB4aTcgICAgICAgICAgIDsvLyAoaTUtaTcpLzIKLSAgICAgICAgCi0gICAgICAgIFBLSEJUICAgeGkwLCB4aTYsIHhpNCwgTFNMIzE2ICAgOy8vIFtpNCxpNl0gcm93IGEKLSAgICAgICAgUEtIVEIgICB4aTEsIHhpNCwgeGk2LCBBU1IjMTYgICA7Ly8gW2k0LGk2XSByb3cgYgotICAgICAgICAKLSAgICAgICAgU01VQURYICB4aTIsIHhpMCwgY3NQaUJ5OCAgICAgICA7Ly8gcm93YSBieSBbYyxzXQotICAgICAgICBTTVVBRFggIHhpNCwgeGkxLCBjc1BpQnk4ICAgICAgIDsvLyByb3diIGJ5IFtjLHNdCi0gICAgICAgIFNNVVNEICAgeGkwLCB4aTAsIGNzUGlCeTggICAgICAgOy8vIHJvd2EgYnkgWy1zLGNdICAgCi0gICAgICAgIFNNVVNEICAgeGk2LCB4aTEsIGNzUGlCeTggICAgICAgOy8vIHJvd2IgYnkgWy1zLGNdCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIFNNVUxCQiAgeGkxLCB4aTMsIExvb3BSUjIKLSAgICAgICAgU01VTFRCICB4aTMsIHhpMywgTG9vcFJSMgotICAgICAgICAgICAgICAgIAotICAgICAgICBQS0hUQiAgIHhoNCwgeGk0LCB4aTIsIEFTUiMxNiAgIDsvLyBoNC80Ci0gICAgICAgIFBLSFRCICAgeGg2LCB4aTYsIHhpMCwgQVNSIzE2ICAgOy8vIGg2LzQKLSAgICAgICAgU0hBREQxNiB4aDcsIHhpNSwgeGk3ICAgICAgICAgICA7Ly8gKGk1K2k3KS80Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIDsvLyB4aTAseGkxLHhpMix4aTMgbm93IGZyZWUKLSAgICAgICAgOy8vIElTdGFnZSA0LDMsIHJvd3MgMnRvMyB4MS8yCi0gICAgICAgIAotICAgICAgICBNT1YgICAgIHhpMywgeGkzLCBMU0wgIzEKLSAgICAgICAgUEtIVEIgICB4aDUsIHhpMywgeGkxLCBBU1IjMTUgICA7Ly8gaDUvNAotICAgICAgICBMRFJEICAgIHhpMCwgW3BEZXN0LCAjOF0gICAgICAgIDsvLyBqMixqNiBzY2FsZWQKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgOy8vIElTdGFnZSAyLCByb3dzNHRvNwotICAgICAgICBTU1VCMTYgIHhnNiwgeGg2LCB4aDcKLSAgICAgICAgU1NVQjE2ICB4ZzUsIHhoNSwgeGc2ICAgICAgICAKLSAgICAgICAgU1NVQjE2ICB4ZzQsIHhoNCwgeGc1Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIFNTVUIxNiAgeGkyLCB4aTAsIHhpMSAgICAgICAgICAgOy8vIChqMi1qNikKLSAgICAgICAgCi0gICAgICAgIFNIQUREMTYgeGkzLCB4aTAsIHhpMSAgICAgICAgICAgOy8vIChqMitqNikvMgotICAgICAgICAKLSAgICAgICAgU01VTEJCICB4aTAsIHhpMiwgTG9vcFJSMgotICAgICAgICBTTVVMVEIgIHhpMiwgeGkyLCBMb29wUlIyCi0gICAgICAgIAotICAgICAgICBNT1YgICAgIHhpMiwgeGkyLCBMU0wgIzEKLSAgICAgICAgUEtIVEIgICB4aDIsIHhpMiwgeGkwLCBBU1IjMTUgICA7Ly8gaTIqc3FydCgyKS80Ci0gICAgICAgIAotICAgICAgICA7Ly8geGkwLCB4aTEgbm93IGZyZWUKLSAgICAgICAgOy8vIElTdGFnZSA0LDMgcm93cyAwdG8xIHggMS8yCi0gICAgICAgIExEUkQgICAgeGkwLCBbcERlc3RdICAgICAgICAgICAgOy8vIGowLCBqNCBzY2FsZWQKLSAgICAgICAgU1NVQjE2ICB4aDIsIHhoMiwgeGkzCi0gICAgICAgIEFERFMgICAgTG9vcFJSMiwgTG9vcFJSMiwgIzI8PDI5ICAgIDsvLyBkb25lIHR3byByb3dzCi0gICAgICAgIAotICAgICAgICBTSEFERDE2IHhoMCwgeGkwLCB4aTEKLSAgICAgICAgU0hTVUIxNiB4aDEsIHhpMCwgeGkxICAgICAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIElTdGFnZSAyIHJvd3MgMHRvMyB4IDEvMgotICAgICAgICBTSFNVQjE2IHhnMiwgeGgxLCB4aDIKLSAgICAgICAgU0hBREQxNiB4ZzEsIHhoMSwgeGgyCi0gICAgICAgIFNIU1VCMTYgeGczLCB4aDAsIHhoMwotICAgICAgICBTSEFERDE2IHhnMCwgeGgwLCB4aDMKLSAgICAgICAgCi0gICAgICAgIDsvLyBJU3RhZ2UgMSBhbGwgcm93cwotICAgICAgICBTQUREMTYgIHhmMywgeGczLCB4ZzQKLSAgICAgICAgU1NVQjE2ICB4ZjQsIHhnMywgeGc0Ci0gICAgICAgIFNBREQxNiAgeGYyLCB4ZzIsIHhnNQotICAgICAgICBTU1VCMTYgIHhmNSwgeGcyLCB4ZzUKLSAgICAgICAgU0FERDE2ICB4ZjEsIHhnMSwgeGc2Ci0gICAgICAgIFNTVUIxNiAgeGY2LCB4ZzEsIHhnNgotICAgICAgICBTQUREMTYgIHhmMCwgeGcwLCB4ZzcKLSAgICAgICAgU1NVQjE2ICB4ZjcsIHhnMCwgeGc3Ci0gICAgICAgIAotICAgICAgICA7Ly8gVHJhbnNwb3NlLCBzdG9yZSBhbmQgbG9vcAotICAgICAgICBQS0hCVCAgIHJhMDEsIHhmMCwgeGYxLCBMU0wgIzE2Ci0gICAgICAgIFBLSFRCICAgcmIwMSwgeGYxLCB4ZjAsIEFTUiAjMTYKLSAgICAgICAgCi0gICAgICAgIFBLSEJUICAgcmEyMywgeGYyLCB4ZjMsIExTTCAjMTYKLSAgICAgICAgUEtIVEIgICByYjIzLCB4ZjMsIHhmMiwgQVNSICMxNgotICAgICAgICAKLSAgICAgICAgUEtIQlQgICByYTQ1LCB4ZjQsIHhmNSwgTFNMICMxNgotICAgICAgICBQS0hUQiAgIHJiNDUsIHhmNSwgeGY0LCBBU1IgIzE2Ci0gICAgICAgIAotICAgICAgICBQS0hCVCAgIHJhNjcsIHhmNiwgeGY3LCBMU0wgIzE2Ci0gICAgICAgIFNUTUlBICAgcERlc3QhLCB7cmEwMSwgcmEyMywgcmE0NSwgcmE2N30gICAgICAKLSAgICAgICAgUEtIVEIgICByYjY3LCB4ZjcsIHhmNiwgQVNSICMxNgotICAgICAgICBTVE1JQSAgIHBEZXN0ISwge3JiMDEsIHJiMjMsIHJiNDUsIHJiNjd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIEJDQyAgICAgdjZfaWRjdF9jb2wkX0YKLSAgICAgICAgCi0gICAgICAgIFNVQiAgICAgcFNyYywgcERlc3QsICMoNjQqMikKLSAgICAgICAgTV9MRFIgICBwRGVzdCwgcHBEZXN0Ci0gICAgICAgIElGICIkc3RyaWRlIj0icyIKLSAgICAgICAgICAgIE1fTERSICAgcFNjYWxlLCBwU3RyaWRlIAotICAgICAgICBFTkRJRgotICAgICAgICBCICAgICAgIHY2X2lkY3Rfcm93JF9GCi0gICAgICAgIAotdjZPZGRaZXJvJF9GCi0gICAgICAgIFNTVUIxNiAgeGkyLCB4aTYsIHhpNyAgICAgICAgICAgOy8vIChqMi1qNikKLSAgICAgICAgU0hBREQxNiB4aTMsIHhpNiwgeGk3ICAgICAgICAgICA7Ly8gKGoyK2o2KS8yCi0gICAgICAgIAotICAgICAgICBTTVVMQkIgIHhpMCwgeGkyLCBMb29wUlIyCi0gICAgICAgIFNNVUxUQiAgeGkyLCB4aTIsIExvb3BSUjIKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgeGkyLCB4aTIsIExTTCAjMQotICAgICAgICBQS0hUQiAgIHhoMiwgeGkyLCB4aTAsIEFTUiMxNSAgIDsvLyBpMipzcXJ0KDIpLzQKLSAgICAgICAgU1NVQjE2ICB4aDIsIHhoMiwgeGkzCi0gICAgICAgIAotICAgICAgICA7Ly8geGkwLCB4aTEgbm93IGZyZWUKLSAgICAgICAgOy8vIElTdGFnZSA0LDMgcm93cyAwdG8xIHggMS8yCi0gICAgICAgIAotICAgICAgICBTSEFERDE2IHhoMCwgeGk0LCB4aTUKLSAgICAgICAgU0hTVUIxNiB4aDEsIHhpNCwgeGk1ICAgICAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIElTdGFnZSAyIHJvd3MgMHRvMyB4IDEvMgotICAgICAgICBTSFNVQjE2IHhnMiwgeGgxLCB4aDIKLSAgICAgICAgU0hBREQxNiB4ZzEsIHhoMSwgeGgyCi0gICAgICAgIFNIU1VCMTYgeGczLCB4aDAsIHhoMwotICAgICAgICBTSEFERDE2IHhnMCwgeGgwLCB4aDMKLSAgICAgICAgICAgICAgIAotICAgICAgICA7Ly8gSVN0YWdlIDEgYWxsIHJvd3MKLSAgICAgICAgTU9WICB4ZjMsIHhnMwotICAgICAgICBNT1YgIHhmNCwgeGczCi0gICAgICAgIE1PViAgeGYyLCB4ZzIKLSAgICAgICAgTU9WICB4ZjUsIHhnMgotICAgICAgICBNT1YgIHhmMSwgeGcxCi0gICAgICAgIE1PViAgeGY2LCB4ZzEKLSAgICAgICAgTU9WICB4ZjAsIHhnMAotICAgICAgICBNT1YgIHhmNywgeGcwCi0gICAgICAgIAotICAgICAgICA7Ly8gVHJhbnNwb3NlCi0gICAgICAgIFBLSEJUICAgcmEwMSwgeGYwLCB4ZjEsIExTTCAjMTYKLSAgICAgICAgUEtIVEIgICByYjAxLCB4ZjEsIHhmMCwgQVNSICMxNgotICAgICAgICAKLSAgICAgICAgUEtIQlQgICByYTIzLCB4ZjIsIHhmMywgTFNMICMxNgotICAgICAgICBQS0hUQiAgIHJiMjMsIHhmMywgeGYyLCBBU1IgIzE2Ci0gICAgICAgIAotICAgICAgICBQS0hCVCAgIHJhNDUsIHhmNCwgeGY1LCBMU0wgIzE2Ci0gICAgICAgIFBLSFRCICAgcmI0NSwgeGY1LCB4ZjQsIEFTUiAjMTYKLSAgICAgICAgCi0gICAgICAgIFBLSEJUICAgcmE2NywgeGY2LCB4ZjcsIExTTCAjMTYKLSAgICAgICAgUEtIVEIgICByYjY3LCB4ZjcsIHhmNiwgQVNSICMxNgotICAgICAgICAgICAgICAgIAotICAgICAgICBTVE1JQSAgIHBEZXN0ISwge3JhMDEsIHJhMjMsIHJhNDUsIHJhNjd9ICAgICAgCi0gICAgICAgIEFERFMgICAgTG9vcFJSMiwgTG9vcFJSMiwgIzI8PDI5ICAgIDsvLyBkb25lIHR3byByb3dzCi0gICAgICAgIFNUTUlBICAgcERlc3QhLCB7cmIwMSwgcmIyMywgcmI0NSwgcmI2N30gICAgICAKLSAgICAgICAgCi0gICAgICAgIEJDQyAgICAgdjZfaWRjdF9jb2wkX0YKLSAgICAgICAgU1VCICAgICBwU3JjLCBwRGVzdCwgIyg2NCoyKQotICAgICAgICBNX0xEUiAgIHBEZXN0LCBwcERlc3QKLSAgICAgICAgSUYgIiRzdHJpZGUiPSJzIgotICAgICAgICAgICAgTV9MRFIgICBwU2NhbGUsIHBTdHJpZGUgCi0gICAgICAgIEVORElGCi0gICAgICAgICAgICAgICAKLSAgICAgICAgCi12Nl9pZGN0X3JvdyRfRgotICAgICAgICA7Ly8gSVN0YWdlIDQsMywgcm93czR0bzcgeDEvNAotICAgICAgICBMRFIgICAgIHhpdCwgPTB4MDAwMTAwMDEgICAgICAgIDsvLyByb3VuZGluZyBjb25zdGFudAotICAgICAgICBMRFIgICAgIHhpMCwgW3BTcmMsICMxKjE2XSAgICAgIDsvLyBqMQotICAgICAgICBMRFIgICAgIHhpMSwgW3BTcmMsICM3KjE2XSAgICAgIDsvLyA0Kmo3Ci0gICAgICAgIExEUiAgICAgeGkyLCBbcFNyYywgIzUqMTZdICAgICAgOy8vIGo1Ci0gICAgICAgIExEUiAgICAgeGkzLCBbcFNyYywgIzMqMTZdICAgICAgOy8vIGozCi0gICAgICAgIAotICAgICAgICBTSEFERDE2IHhpMSwgeGkxLCB4aXQgICAgICAgICAgIDsvLyAyKmo3Ci0gICAgICAgIFNIQUREMTYgeGkxLCB4aTEsIHhpdCAgICAgICAgICAgOy8vIGo3ICAgICAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgU0hBREQxNiB4aTUsIHhpMCwgeGkxICAgICAgICAgICA7Ly8gKGoxK2o3KS8yCi0gICAgICAgIFNTVUIxNiAgeGk2LCB4aTAsIHhpMSAgICAgICAgICAgOy8vIGoxLWo3Ci0gICAgICAgIFNIQUREMTYgeGk3LCB4aTIsIHhpMyAgICAgICAgICAgOy8vIChqNStqMykvMgotICAgICAgICBTU1VCMTYgIHhpNCwgeGkyLCB4aTMgICAgICAgICAgIDsvLyBqNS1qMwotICAgICAgICAKLSAgICAgICAgU1NVQjE2ICB4aTMsIHhpNSwgeGk3ICAgICAgICAgICA7Ly8gKGk1LWk3KS8yCi0gICAgICAgIAotICAgICAgICBQS0hCVCAgIHhpMCwgeGk2LCB4aTQsIExTTCMxNiAgIDsvLyBbaTQsaTZdIHJvdyBhCi0gICAgICAgIFBLSFRCICAgeGkxLCB4aTQsIHhpNiwgQVNSIzE2ICAgOy8vIFtpNCxpNl0gcm93IGIKLSAgICAgICAgCi0gICAgICAgIFNNVUFEWCAgeGkyLCB4aTAsIGNzUGlCeTggICAgICAgOy8vIHJvd2EgYnkgW2Msc10KLSAgICAgICAgU01VQURYICB4aTQsIHhpMSwgY3NQaUJ5OCAgICAgICA7Ly8gcm93YiBieSBbYyxzXQotICAgICAgICBTTVVTRCAgIHhpMCwgeGkwLCBjc1BpQnk4ICAgICAgIDsvLyByb3dhIGJ5IFstcyxjXSAgIAotICAgICAgICBTTVVTRCAgIHhpNiwgeGkxLCBjc1BpQnk4ICAgICAgIDsvLyByb3diIGJ5IFstcyxjXQotICAgICAgICAgICAgICAgIAotICAgICAgICBTTVVMQkIgIHhpMSwgeGkzLCBMb29wUlIyCi0gICAgICAgIFNNVUxUQiAgeGkzLCB4aTMsIExvb3BSUjIKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgUEtIVEIgICB4aDQsIHhpNCwgeGkyLCBBU1IjMTYgICA7Ly8gaDQvNAotICAgICAgICBQS0hUQiAgIHhoNiwgeGk2LCB4aTAsIEFTUiMxNiAgIDsvLyBoNi80Ci0gICAgICAgIFNIQUREMTYgeGg3LCB4aTUsIHhpNyAgICAgICAgICAgOy8vIChpNStpNykvNAotICAgICAgICAKLSAgICAgICAgTU9WICAgICB4aTMsIHhpMywgTFNMICMxCi0gICAgICAgIFBLSFRCICAgeGg1LCB4aTMsIHhpMSwgQVNSIzE1ICAgOy8vIGg1LzQKLSAgICAgICAgICAgICAgIAotICAgICAgICA7Ly8geGkwLHhpMSx4aTIseGkzIG5vdyBmcmVlCi0gICAgICAgIDsvLyBJU3RhZ2UgNCwzLCByb3dzIDJ0bzMgeDEvMgotICAgICAgICAKLSAgICAgICAgTERSICAgICB4aTAsIFtwU3JjLCAjMioxNl0gICAgICA7Ly8gajIKLSAgICAgICAgTERSICAgICB4aTEsIFtwU3JjLCAjNioxNl0gICAgICA7Ly8gMipqNgotICAgICAgICAKLSAgICAgICAgOy8vIElTdGFnZSAyLCByb3dzNHRvNwotICAgICAgICBTU1VCMTYgIHhnNiwgeGg2LCB4aDcKLSAgICAgICAgU1NVQjE2ICB4ZzUsIHhoNSwgeGc2Ci0gICAgICAgIFNTVUIxNiAgeGc0LCB4aDQsIHhnNQotICAgICAgICAKLSAgICAgICAgU0hBREQxNiB4aTEsIHhpMSwgeGl0ICAgICAgICAgICA7Ly8gajYKLSAgICAgICAgU1NVQjE2ICB4aTIsIHhpMCwgeGkxICAgICAgICAgICA7Ly8gKGoyLWo2KSAgICAgICAgCi0gICAgICAgIFNIQUREMTYgeGkzLCB4aTAsIHhpMSAgICAgICAgICAgOy8vIChqMitqNikvMgotICAgICAgICAKLSAgICAgICAgU01VTEJCICB4aTAsIHhpMiwgTG9vcFJSMgotICAgICAgICBTTVVMVEIgIHhpMiwgeGkyLCBMb29wUlIyCi0gICAgICAgIAotICAgICAgICBNT1YgICAgIHhpMiwgeGkyLCBMU0wgIzEKLSAgICAgICAgCi0gICAgICAgIFBLSFRCICAgeGgyLCB4aTIsIHhpMCwgQVNSIzE1ICAgOy8vIGkyKnNxcnQoMikvNAotICAgICAgICAKLSAgICAgICAgOy8vIHhpMCwgeGkxIG5vdyBmcmVlCi0gICAgICAgIDsvLyBJU3RhZ2UgNCwzIHJvd3MgMHRvMSB4IDEvMgotICAgICAgICBMRFIgICAgIHhpMSwgW3BTcmMsICM0KjE2XSAgICAgIDsvLyBqNAotICAgICAgICBMRFIgICAgIHhpMCwgW3BTcmNdLCAjNCAgICAgICAgIDsvLyBqMAotCi0gICAgICAgIFNTVUIxNiAgeGgyLCB4aDIsIHhpMwotICAgICAgICBBRERTICAgIExvb3BSUjIsIExvb3BSUjIsICMyPDwyOSAgICA7Ly8gZG9uZSB0d28gcm93cwotICAgICAgICAKLSAgICAgICAgQUREICAgICB4aTAsIHhpMCwgeGl0LCBMU0wgIzIgICA7Ly8gZW5zdXJlIGNvcnJlY3Qgcm91bmQKLSAgICAgICAgU0hBREQxNiB4aDAsIHhpMCwgeGkxICAgICAgICAgICA7Ly8gb2YgREMgcmVzdWx0Ci0gICAgICAgIFNIU1VCMTYgeGgxLCB4aTAsIHhpMQotICAgICAgICAgICAgICAgIAotICAgICAgICA7Ly8gSVN0YWdlIDIgcm93cyAwdG8zIHggMS8yCi0gICAgICAgIFNIU1VCMTYgeGcyLCB4aDEsIHhoMgotICAgICAgICBTSEFERDE2IHhnMSwgeGgxLCB4aDIKLSAgICAgICAgU0hTVUIxNiB4ZzMsIHhoMCwgeGgzCi0gICAgICAgIFNIQUREMTYgeGcwLCB4aDAsIHhoMwotICAgICAgICAKLSAgICAgICAgOy8vIElTdGFnZSAxIGFsbCByb3dzCi0gICAgICAgIFNIQUREMTYgeGYzLCB4ZzMsIHhnNAotICAgICAgICBTSFNVQjE2IHhmNCwgeGczLCB4ZzQKLSAgICAgICAgU0hBREQxNiB4ZjIsIHhnMiwgeGc1Ci0gICAgICAgIFNIU1VCMTYgeGY1LCB4ZzIsIHhnNQotICAgICAgICBTSEFERDE2IHhmMSwgeGcxLCB4ZzYKLSAgICAgICAgU0hTVUIxNiB4ZjYsIHhnMSwgeGc2Ci0gICAgICAgIFNIQUREMTYgeGYwLCB4ZzAsIHhnNwotICAgICAgICBTSFNVQjE2IHhmNywgeGcwLCB4ZzcKLSAgICAgICAgCi0gICAgICAgIDsvLyBTYXR1cmF0ZQotICAgICAgICBJRiAoIiRvdXRzaXplIj0idTgiKQotICAgICAgICAgICAgVVNBVDE2ICB4ZjAsICM4LCB4ZjAKLSAgICAgICAgICAgIFVTQVQxNiAgeGYxLCAjOCwgeGYxCi0gICAgICAgICAgICBVU0FUMTYgIHhmMiwgIzgsIHhmMgotICAgICAgICAgICAgVVNBVDE2ICB4ZjMsICM4LCB4ZjMKLSAgICAgICAgICAgIFVTQVQxNiAgeGY0LCAjOCwgeGY0Ci0gICAgICAgICAgICBVU0FUMTYgIHhmNSwgIzgsIHhmNQotICAgICAgICAgICAgVVNBVDE2ICB4ZjYsICM4LCB4ZjYKLSAgICAgICAgICAgIFVTQVQxNiAgeGY3LCAjOCwgeGY3ICAgICAgICAKLSAgICAgICAgRU5ESUYKLSAgICAgICAgSUYgKCIkb3V0c2l6ZSI9InM5IikKLSAgICAgICAgICAgIFNTQVQxNiAgeGYwLCAjOSwgeGYwCi0gICAgICAgICAgICBTU0FUMTYgIHhmMSwgIzksIHhmMQotICAgICAgICAgICAgU1NBVDE2ICB4ZjIsICM5LCB4ZjIKLSAgICAgICAgICAgIFNTQVQxNiAgeGYzLCAjOSwgeGYzCi0gICAgICAgICAgICBTU0FUMTYgIHhmNCwgIzksIHhmNAotICAgICAgICAgICAgU1NBVDE2ICB4ZjUsICM5LCB4ZjUKLSAgICAgICAgICAgIFNTQVQxNiAgeGY2LCAjOSwgeGY2Ci0gICAgICAgICAgICBTU0FUMTYgIHhmNywgIzksIHhmNyAgICAgICAgCi0gICAgICAgIEVORElGCi0gICAgICAgIAotICAgICAgICA7Ly8gVHJhbnNwb3NlIHRvIFJvdywgUGFjayBhbmQgc3RvcmUKLSAgICAgICAgSUYgKCIkb3V0c2l6ZSI9InU4IikKLSAgICAgICAgICAgIE9SUiAgICAgeGYwLCB4ZjAsIHhmMSwgTFNMICM4IDsvLyBbIGIxIGIwIGExIGEwIF0KLSAgICAgICAgICAgIE9SUiAgICAgeGYyLCB4ZjIsIHhmMywgTFNMICM4IDsvLyBbIGIzIGIyIGEzIGEyIF0KLSAgICAgICAgICAgIE9SUiAgICAgeGY0LCB4ZjQsIHhmNSwgTFNMICM4IDsvLyBbIGI1IGI0IGE1IGE0IF0KLSAgICAgICAgICAgIE9SUiAgICAgeGY2LCB4ZjYsIHhmNywgTFNMICM4IDsvLyBbIGI3IGI2IGE3IGE2IF0KLSAgICAgICAgICAgIFBLSEJUICAgcmEwMSwgeGYwLCB4ZjIsIExTTCAjMTYKLSAgICAgICAgICAgIFBLSFRCICAgcmIwMSwgeGYyLCB4ZjAsIEFTUiAjMTYKLSAgICAgICAgICAgIFBLSEJUICAgcmEyMywgeGY0LCB4ZjYsIExTTCAjMTYKLSAgICAgICAgICAgIFBLSFRCICAgcmIyMywgeGY2LCB4ZjQsIEFTUiAjMTYKLSAgICAgICAgICAgIFNUTUlBICAgcERlc3QsIHtyYTAxLCByYTIzfQotICAgICAgICAgICAgSUYgIiRzdHJpZGUiPSJzIgotICAgICAgICAgICAgICAgIEFERCAgICAgcERlc3QsIHBEZXN0LCBwU2NhbGUKLSAgICAgICAgICAgICAgICBTVE1JQSAgIHBEZXN0LCB7cmIwMSwgcmIyM30KLSAgICAgICAgICAgICAgICBBREQgICAgIHBEZXN0LCBwRGVzdCwgcFNjYWxlCi0gICAgICAgICAgICBFTFNFICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIEFERCAgICAgcERlc3QsIHBEZXN0LCAjKCRzdHJpZGUpCi0gICAgICAgICAgICAgICAgU1RNSUEgICBwRGVzdCwge3JiMDEsIHJiMjN9Ci0gICAgICAgICAgICAgICAgQUREICAgICBwRGVzdCwgcERlc3QsICMoJHN0cmlkZSkKLSAgICAgICAgICAgIEVORElGCi0gICAgICAgIEVORElGCi0gICAgICAgIElGICgiJG91dHNpemUiPSJzOSIpOkxPUjooIiRvdXRzaXplIj0iczE2IikgICAgICAgIAotICAgICAgICAgICAgUEtIQlQgICByYTAxLCB4ZjAsIHhmMSwgTFNMICMxNgotICAgICAgICAgICAgUEtIVEIgICByYjAxLCB4ZjEsIHhmMCwgQVNSICMxNgotICAgICAgICAKLSAgICAgICAgICAgIFBLSEJUICAgcmEyMywgeGYyLCB4ZjMsIExTTCAjMTYKLSAgICAgICAgICAgIFBLSFRCICAgcmIyMywgeGYzLCB4ZjIsIEFTUiAjMTYKLSAgICAgICAgICAgIAotICAgICAgICAgICAgUEtIQlQgICByYTQ1LCB4ZjQsIHhmNSwgTFNMICMxNgotICAgICAgICAgICAgUEtIVEIgICByYjQ1LCB4ZjUsIHhmNCwgQVNSICMxNgotICAgICAgICAgICAgCi0gICAgICAgICAgICBQS0hCVCAgIHJhNjcsIHhmNiwgeGY3LCBMU0wgIzE2Ci0gICAgICAgICAgICBQS0hUQiAgIHJiNjcsIHhmNywgeGY2LCBBU1IgIzE2Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFNUTUlBICAgcERlc3QsIHtyYTAxLCByYTIzLCByYTQ1LCByYTY3fSAgICAgIAotICAgICAgICAgICAgSUYgIiRzdHJpZGUiPSJzIgotICAgICAgICAgICAgICAgIEFERCAgICAgcERlc3QsIHBEZXN0LCBwU2NhbGUKLSAgICAgICAgICAgICAgICBTVE1JQSAgIHBEZXN0LCB7cmIwMSwgcmIyMywgcmI0NSwgcmI2N30gICAgICAKLSAgICAgICAgICAgICAgICBBREQgICAgIHBEZXN0LCBwRGVzdCwgcFNjYWxlCi0gICAgICAgICAgICBFTFNFICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIEFERCAgICAgcERlc3QsIHBEZXN0LCAjKCRzdHJpZGUpCi0gICAgICAgICAgICAgICAgU1RNSUEgICBwRGVzdCwge3JiMDEsIHJiMjMsIHJiNDUsIHJiNjd9ICAgICAgCi0gICAgICAgICAgICAgICAgQUREICAgICBwRGVzdCwgcERlc3QsICMoJHN0cmlkZSkKLSAgICAgICAgICAgIEVORElGCi0gICAgICAgIEVORElGCi0gICAgICAgIAotICAgICAgICBCQ0MgICAgIHY2X2lkY3Rfcm93JF9GCi0gICAgICAgIEVORElGIDsvLyBBUk0xMTM2SlMKLQotCi0gICAgICAgIElGIENvcnRleEE4Ci0gICAgICAgIAotU3JjMCAgICAgICAgICAgIEVRVSAgNyAgICAgICAgICAgICAgCi1TcmMxICAgICAgICAgICAgRVFVICA4ICAgICAgICAgICAgICAKLVNyYzIgICAgICAgICAgICBFUVUgIDkgICAgICAgICAgICAgIAotU3JjMyAgICAgICAgICAgIEVRVSAgMTAgICAgICAgICAgICAgIAotU3JjNCAgICAgICAgICAgIEVRVSAgMTEgICAgICAgICAgICAgIAotU3JjNSAgICAgICAgICAgIEVRVSAgMTIgICAgICAgICAgICAgIAotU3JjNiAgICAgICAgICAgIEVRVSAgMTMKLVNyYzcgICAgICAgICAgICBFUVUgIDE0Ci1UbXAgICAgICAgICAgICAgRVFVICAxNQotCi1xWGowICAgICAgICAgICAgUU4gU3JjMC5TMTYgCi1xWGoxICAgICAgICAgICAgUU4gU3JjMS5TMTYKLXFYajIgICAgICAgICAgICBRTiBTcmMyLlMxNgotcVhqMyAgICAgICAgICAgIFFOIFNyYzMuUzE2Ci1xWGo0ICAgICAgICAgICAgUU4gU3JjNC5TMTYKLXFYajUgICAgICAgICAgICBRTiBTcmM1LlMxNgotcVhqNiAgICAgICAgICAgIFFOIFNyYzYuUzE2Ci1xWGo3ICAgICAgICAgICAgUU4gU3JjNy5TMTYKLXFYanQgICAgICAgICAgICBRTiBUbXAuUzE2Ci0KLWRYajBsbyAgICAgICAgICBETiAoU3JjMCoyKS5TMTYKLWRYajBoaSAgICAgICAgICBETiAoU3JjMCoyKzEpLlMxNgotZFhqMWxvICAgICAgICAgIEROIChTcmMxKjIpLlMxNgotZFhqMWhpICAgICAgICAgIEROIChTcmMxKjIrMSkuUzE2Ci1kWGoybG8gICAgICAgICAgRE4gKFNyYzIqMikuUzE2Ci1kWGoyaGkgICAgICAgICAgRE4gKFNyYzIqMisxKS5TMTYKLWRYajNsbyAgICAgICAgICBETiAoU3JjMyoyKS5TMTYKLWRYajNoaSAgICAgICAgICBETiAoU3JjMyoyKzEpLlMxNgotZFhqNGxvICAgICAgICAgIEROIChTcmM0KjIpLlMxNgotZFhqNGhpICAgICAgICAgIEROIChTcmM0KjIrMSkuUzE2Ci1kWGo1bG8gICAgICAgICAgRE4gKFNyYzUqMikuUzE2Ci1kWGo1aGkgICAgICAgICAgRE4gKFNyYzUqMisxKS5TMTYKLWRYajZsbyAgICAgICAgICBETiAoU3JjNioyKS5TMTYKLWRYajZoaSAgICAgICAgICBETiAoU3JjNioyKzEpLlMxNgotZFhqN2xvICAgICAgICAgIEROIChTcmM3KjIpLlMxNgotZFhqN2hpICAgICAgICAgIEROIChTcmM3KjIrMSkuUzE2Ci1kWGp0bG8gICAgICAgICAgRE4gKFRtcCoyKS5TMTYKLWRYanRoaSAgICAgICAgICBETiAoVG1wKjIrMSkuUzE2Ci0KLXFYaTAgICAgICAgICAgICBRTiBxWGowCi1xWGkxICAgICAgICAgICAgUU4gcVhqNAotcVhpMiAgICAgICAgICAgIFFOIHFYajIKLXFYaTMgICAgICAgICAgICBRTiBxWGo3Ci1xWGk0ICAgICAgICAgICAgUU4gcVhqNQotcVhpNSAgICAgICAgICAgIFFOIHFYanQKLXFYaTYgICAgICAgICAgICBRTiBxWGoxCi1xWGk3ICAgICAgICAgICAgUU4gcVhqNgotcVhpdCAgICAgICAgICAgIFFOIHFYajMKLQotZFhpMGxvICAgICAgICAgIEROIGRYajBsbwotZFhpMGhpICAgICAgICAgIEROIGRYajBoaQotZFhpMWxvICAgICAgICAgIEROIGRYajRsbwotZFhpMWhpICAgICAgICAgIEROIGRYajRoaQotZFhpMmxvICAgICAgICAgIEROIGRYajJsbwotZFhpMmhpICAgICAgICAgIEROIGRYajJoaQotZFhpM2xvICAgICAgICAgIEROIGRYajdsbwotZFhpM2hpICAgICAgICAgIEROIGRYajdoaQotZFhpNGxvICAgICAgICAgIEROIGRYajVsbwotZFhpNGhpICAgICAgICAgIEROIGRYajVoaQotZFhpNWxvICAgICAgICAgIEROIGRYanRsbwotZFhpNWhpICAgICAgICAgIEROIGRYanRoaQotZFhpNmxvICAgICAgICAgIEROIGRYajFsbwotZFhpNmhpICAgICAgICAgIEROIGRYajFoaQotZFhpN2xvICAgICAgICAgIEROIGRYajZsbwotZFhpN2hpICAgICAgICAgIEROIGRYajZoaQotZFhpdGxvICAgICAgICAgIEROIGRYajNsbwotZFhpdGhpICAgICAgICAgIEROIGRYajNoaQotCi1xWGgwICAgICAgICAgICAgUU4gcVhpdAotcVhoMSAgICAgICAgICAgIFFOIHFYaTAKLXFYaDIgICAgICAgICAgICBRTiBxWGkyCi1xWGgzICAgICAgICAgICAgUU4gcVhpMwotcVhoNCAgICAgICAgICAgIFFOIHFYaTcKLXFYaDUgICAgICAgICAgICBRTiBxWGk1Ci1xWGg2ICAgICAgICAgICAgUU4gcVhpNAotcVhoNyAgICAgICAgICAgIFFOIHFYaTEKLXFYaHQgICAgICAgICAgICBRTiBxWGk2Ci0KLWRYaDBsbyAgICAgICAgICBETiBkWGl0bG8KLWRYaDBoaSAgICAgICAgICBETiBkWGl0aGkKLWRYaDFsbyAgICAgICAgICBETiBkWGkwbG8KLWRYaDFoaSAgICAgICAgICBETiBkWGkwaGkKLWRYaDJsbyAgICAgICAgICBETiBkWGkybG8KLWRYaDJoaSAgICAgICAgICBETiBkWGkyaGkKLWRYaDNsbyAgICAgICAgICBETiBkWGkzbG8KLWRYaDNoaSAgICAgICAgICBETiBkWGkzaGkKLWRYaDRsbyAgICAgICAgICBETiBkWGk3bG8KLWRYaDRoaSAgICAgICAgICBETiBkWGk3aGkKLWRYaDVsbyAgICAgICAgICBETiBkWGk1bG8KLWRYaDVoaSAgICAgICAgICBETiBkWGk1aGkKLWRYaDZsbyAgICAgICAgICBETiBkWGk0bG8KLWRYaDZoaSAgICAgICAgICBETiBkWGk0aGkKLWRYaDdsbyAgICAgICAgICBETiBkWGkxbG8KLWRYaDdoaSAgICAgICAgICBETiBkWGkxaGkKLWRYaHRsbyAgICAgICAgICBETiBkWGk2bG8KLWRYaHRoaSAgICAgICAgICBETiBkWGk2aGkKLQotcVhnMCAgICAgICAgICAgIFFOIHFYaDIKLXFYZzEgICAgICAgICAgICBRTiBxWGh0Ci1xWGcyICAgICAgICAgICAgUU4gcVhoMQotcVhnMyAgICAgICAgICAgIFFOIHFYaDAKLXFYZzQgICAgICAgICAgICBRTiBxWGg0Ci1xWGc1ICAgICAgICAgICAgUU4gcVhoNQotcVhnNiAgICAgICAgICAgIFFOIHFYaDYKLXFYZzcgICAgICAgICAgICBRTiBxWGg3Ci1xWGd0ICAgICAgICAgICAgUU4gcVhoMwotCi1xWGYwICAgICAgICAgICAgUU4gcVhnNgotcVhmMSAgICAgICAgICAgIFFOIHFYZzUKLXFYZjIgICAgICAgICAgICBRTiBxWGc0Ci1xWGYzICAgICAgICAgICAgUU4gcVhndAotcVhmNCAgICAgICAgICAgIFFOIHFYZzMKLXFYZjUgICAgICAgICAgICBRTiBxWGcyCi1xWGY2ICAgICAgICAgICAgUU4gcVhnMQotcVhmNyAgICAgICAgICAgIFFOIHFYZzAKLXFYZnQgICAgICAgICAgICBRTiBxWGc3Ci0KLQotcVh0MCAgICAgICAgICAgIFFOIDEuUzMyCi1xWHQxICAgICAgICAgICAgUU4gMi5TMzIKLXFUMGxvICAgICAgICAgICBRTiAxLlMzMiAgICAgICAgIAotcVQwaGkgICAgICAgICAgIFFOIDIuUzMyICAgICAgICAgCi1xVDFsbyAgICAgICAgICAgUU4gMy5TMzIgICAgICAgICAKLXFUMWhpICAgICAgICAgICBRTiA0LlMzMiAgICAgICAgIAotcVNjYWxlbG8gICAgICAgIFFOIDUuUzMyICAgICAgICA7Ly8gdXNlZCB0byByZWFkIHBvc3Qgc2NhbGUgdmFsdWVzCi1xU2NhbGVoaSAgICAgICAgUU4gNi5TMzIKLXFUZW1wMCAgICAgICAgICBRTiA1LlMzMiAgICAgICAgIAotcVRlbXAxICAgICAgICAgIFFOIDYuUzMyICAgIAotCi0KLVNjYWxlMSAgICAgICAgICBFUVUgNgotU2NhbGUyICAgICAgICAgIEVRVSAxNQotcVNjYWxlMSAgICAgICAgIFFOIFNjYWxlMS5TMTYgICAgIAotcVNjYWxlMiAgICAgICAgIFFOIFNjYWxlMi5TMTYgICAgIAotZFNjYWxlMWxvICAgICAgIEROIChTY2FsZTEqMikuUzE2ICAgICAKLWRTY2FsZTFoaSAgICAgICBETiAoU2NhbGUxKjIrMSkuUzE2Ci1kU2NhbGUybG8gICAgICAgRE4gKFNjYWxlMioyKS5TMTYgICAgIAotZFNjYWxlMmhpICAgICAgIEROIChTY2FsZTIqMisxKS5TMTYKLQotZENvZWZzICAgICAgICAgIEROIDAuUzE2ICAgICAgICA7Ly8gU2NhbGUgY29lZmZpY2llbnRzIGluIGZvcm1hdCB7WzBdIFtDXSBbU10gW0ludlNxcnQyXX0KLUludlNxcnQyICAgICAgICBETiBkQ29lZnNbMF0gICAgOy8vIDEvc3FydCgyKSBpbiBRMTUKLVMgICAgICAgICAgICAgICBETiBkQ29lZnNbMV0gICAgOy8vIFNpbihQSS84KSBpbiBRMTUKLUMgICAgICAgICAgICAgICBETiBkQ29lZnNbMl0gICAgOy8vIENvcyhQSS84KSBpbiBRMTUKLQotcFRlbXAgICAgICAgICAgIFJOIDEyCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgSU1QT1JUICBhcm1DT01NX0lEQ1RDb2VmCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICBWTEQxICAgICAgICB7cVhqMCxxWGoxfSwgW3BTcmMgQDY0XSEKLSAgICAgICAgVkxEMSAgICAgICAge3FYajIscVhqM30sIFtwU3JjIEA2NF0hCi0gICAgICAgIFZMRDEgICAgICAgIHtxWGo0LHFYajV9LCBbcFNyYyBANjRdIQotICAgICAgICBWTEQxICAgICAgICB7cVhqNixxWGo3fSwgW3BTcmMgQDY0XSEKLSAgICAgICAgCi0gICAgICAgIDsvLyBMb2FkIFByZVNjYWxlIGFuZCBtdWx0aXBseSB3aXRoIFNyYwotICAgICAgICA7Ly8gSVN0YWdlIDQKLSAgICAgICAgCi0gICAgICAgIElGICIkaW5zY2FsZSI9InMxNiIgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIDE2WDE2IE11bAotICAgICAgICAgICAgTV9JRENUX1BSRVNDQUxFMTYKLSAgICAgICAgRU5ESUYKLSAgICAgICAgCi0gICAgICAgIElGICIkaW5zY2FsZSI9InMzMiIgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIDMyWDMyICx1bAotICAgICAgICAgICAgTV9JRENUX1BSRVNDQUxFMzIKLSAgICAgICAgRU5ESUYKLQotICAgICAgICA7Ly8gSVN0YWdlIDMKLSAgICAgICAgVlFETVVMSCAgICAgcVhpMiwgcVhpMiwgSW52U3FydDIgICAgICAgICAgICA7Ly8gaTIvc3FydCgyKQotICAgICAgICBWSEFERCAgICAgICBxWGgwLCBxWGkwLCBxWGkxICAgICAgICAgICAgICAgIDsvLyAoaTAraTEpLzIKLSAgICAgICAgVkhTVUIgICAgICAgcVhoMSwgcVhpMCwgcVhpMSAgICAgICAgICAgICAgICA7Ly8gKGkwLWkxKS8yCi0gICAgICAgIFZIQUREICAgICAgIHFYaDcsIHFYaTUsIHFYaTcgICAgICAgICAgICAgICAgOy8vIChpNStpNykvNAotICAgICAgICBWU1VCICAgICAgICBxWGg1LCBxWGk1LCBxWGk3ICAgICAgICAgICAgICAgIDsvLyAoaTUtaTcpLzIKLSAgICAgICAgVlFETVVMSCAgICAgcVhoNSwgcVhoNSwgSW52U3FydDIgICAgICAgICAgICA7Ly8gaDUvc3FydCgyKQotICAgICAgICBWU1VCICAgICAgICBxWGgyLCBxWGkyLCBxWGkzICAgICAgICAgICAgICAgIDsvLyBoMiwgaDMKLQotICAgICAgICBWTVVMTCAgICAgICBxWHQwLCBkWGk0bG8sIEMgICAgICAgICAgICAgICAgIDsvLyBjKmk0Ci0gICAgICAgIFZNTEFMICAgICAgIHFYdDAsIGRYaTZsbywgUyAgICAgICAgICAgICAgICAgOy8vIGMqaTQrcyppNgotICAgICAgICBWTVVMTCAgICAgICBxWHQxLCBkWGk0aGksIEMKLSAgICAgICAgVk1MQUwgICAgICAgcVh0MSwgZFhpNmhpLCBTCi0gICAgICAgIFZTSFJOICAgICAgIGRYaDRsbywgcVh0MCwgIzE2ICAgICAgICAgICAgICAgOy8vIGg0Ci0gICAgICAgIFZTSFJOICAgICAgIGRYaDRoaSwgcVh0MSwgIzE2Ci0gICAgICAgIAotICAgICAgICBWTVVMTCAgICAgICBxWHQwLCBkWGk2bG8sIEMgICAgICAgICAgICAgICAgIDsvLyBjKmk2Ci0gICAgICAgIFZNTFNMICAgICAgIHFYdDAsIGRYaTRsbywgUyAgICAgICAgICAgICAgICAgOy8vIC1zKmk0ICsgYypoNgotICAgICAgICBWTVVMTCAgICAgICBxWHQxLCBkWGk2aGksIEMKLSAgICAgICAgVk1MU0wgICAgICAgcVh0MSwgZFhpNGhpLCBTCi0gICAgICAgIFZTSFJOICAgICAgIGRYaDZsbywgcVh0MCwgIzE2ICAgICAgICAgICAgICAgOy8vIGg2Ci0gICAgICAgIFZTSFJOICAgICAgIGRYaDZoaSwgcVh0MSwgIzE2Ci0gICAgICAgIAotICAgICAgICA7Ly8gSVN0YWdlIDIKLSAgICAgICAgVlNVQiAgICAgICAgcVhnNiwgcVhoNiwgcVhoNwotICAgICAgICBWU1VCICAgICAgICBxWGc1LCBxWGg1LCBxWGc2Ci0gICAgICAgIFZTVUIgICAgICAgIHFYZzQsIHFYaDQsIHFYZzUKLSAgICAgICAgVkhBREQgICAgICAgcVhnMSwgcVhoMSwgcVhoMiAgICAgICAgOy8vIChoMStoMikvMgotICAgICAgICBWSFNVQiAgICAgICBxWGcyLCBxWGgxLCBxWGgyICAgICAgICA7Ly8gKGgxLWgyKS8yCi0gICAgICAgIFZIQUREICAgICAgIHFYZzAsIHFYaDAsIHFYaDMgICAgICAgIDsvLyAoaDAraDMpLzIKLSAgICAgICAgVkhTVUIgICAgICAgcVhnMywgcVhoMCwgcVhoMyAgICAgICAgOy8vIChoMC1oMykvMgotCi0gICAgICAgIDsvLyBJU3RhZ2UgMSBhbGwgcm93cwotICAgICAgICBWQUREICAgICAgICBxWGYzLCBxWGczLCBxWGc0ICAgICAgICAKLSAgICAgICAgVlNVQiAgICAgICAgcVhmNCwgcVhnMywgcVhnNCAgICAgICAgCi0gICAgICAgIFZBREQgICAgICAgIHFYZjIsIHFYZzIsIHFYZzUgICAgICAgIAotICAgICAgICBWU1VCICAgICAgICBxWGY1LCBxWGcyLCBxWGc1ICAgICAgICAKLSAgICAgICAgVkFERCAgICAgICAgcVhmMSwgcVhnMSwgcVhnNgotICAgICAgICBWU1VCICAgICAgICBxWGY2LCBxWGcxLCBxWGc2ICAgICAgICAKLSAgICAgICAgVkFERCAgICAgICAgcVhmMCwgcVhnMCwgcVhnNwotICAgICAgICBWU1VCICAgICAgICBxWGY3LCBxWGcwLCBxWGc3ICAgICAgCi0KLSAgICAgICAgOy8vIFRyYW5zcG9zZSwgc3RvcmUgYW5kIGxvb3AKLVhUUjAgICAgICAgICAgICBFUVUgU3JjNQotWFRSMSAgICAgICAgICAgIEVRVSBUbXAKLVhUUjIgICAgICAgICAgICBFUVUgU3JjNgotWFRSMyAgICAgICAgICAgIEVRVSBTcmM3Ci1YVFI0ICAgICAgICAgICAgRVFVIFNyYzMKLVhUUjUgICAgICAgICAgICBFUVUgU3JjMAotWFRSNiAgICAgICAgICAgIEVRVSBTcmMxCi1YVFI3ICAgICAgICAgICAgRVFVIFNyYzIKLVhUUnQgICAgICAgICAgICBFUVUgU3JjNAotICAgICAgICAgICAgICAgIAotcUEwICAgICAgICAgICAgIFFOICBYVFIwLlMzMiAgOy8vIGZvciBYVFJwb3NlCi1xQTEgICAgICAgICAgICAgUU4gIFhUUjEuUzMyCi1xQTIgICAgICAgICAgICAgUU4gIFhUUjIuUzMyCi1xQTMgICAgICAgICAgICAgUU4gIFhUUjMuUzMyCi1xQTQgICAgICAgICAgICAgUU4gIFhUUjQuUzMyCi1xQTUgICAgICAgICAgICAgUU4gIFhUUjUuUzMyCi1xQTYgICAgICAgICAgICAgUU4gIFhUUjYuUzMyCi1xQTcgICAgICAgICAgICAgUU4gIFhUUjcuUzMyCi0KLWRCMCAgICAgICAgICAgICBETiAgWFRSMCoyKzEgICAgICA7Ly8gZm9yIHVzaW5nIFZTV1AKLWRCMSAgICAgICAgICAgICBETiAgWFRSMSoyKzEKLWRCMiAgICAgICAgICAgICBETiAgWFRSMioyKzEKLWRCMyAgICAgICAgICAgICBETiAgWFRSMyoyKzEKLWRCNCAgICAgICAgICAgICBETiAgWFRSNCoyCi1kQjUgICAgICAgICAgICAgRE4gIFhUUjUqMgotZEI2ICAgICAgICAgICAgIEROICBYVFI2KjIKLWRCNyAgICAgICAgICAgICBETiAgWFRSNyoyCi0KLSAgICAgICAgICAKLSAgICAgICAgVlRSTiAgICAgICAgcVhmMCwgcVhmMQotICAgICAgICBWVFJOICAgICAgICBxWGYyLCBxWGYzCi0gICAgICAgIFZUUk4gICAgICAgIHFYZjQsIHFYZjUKLSAgICAgICAgVlRSTiAgICAgICAgcVhmNiwgcVhmNwotICAgICAgICBWVFJOICAgICAgICBxQTAsIHFBMgotICAgICAgICBWVFJOICAgICAgICBxQTEsIHFBMwotICAgICAgICBWVFJOICAgICAgICBxQTQsIHFBNgotICAgICAgICBWVFJOICAgICAgICBxQTUsIHFBNyAgICAgICAgCi0gICAgICAgIFZTV1AgICAgICAgIGRCMCwgZEI0Ci0gICAgICAgIFZTV1AgICAgICAgIGRCMSwgZEI1Ci0gICAgICAgIFZTV1AgICAgICAgIGRCMiwgZEI2Ci0gICAgICAgIFZTV1AgICAgICAgIGRCMywgZEI3Ci0gICAgICAgIAotCi1xWWowICAgICAgICAgICAgUU4gcVhmMAotcVlqMSAgICAgICAgICAgIFFOIHFYZjEKLXFZajIgICAgICAgICAgICBRTiBxWGYyCi1xWWozICAgICAgICAgICAgUU4gcVhmMwotcVlqNCAgICAgICAgICAgIFFOIHFYZjQKLXFZajUgICAgICAgICAgICBRTiBxWGY1Ci1xWWo2ICAgICAgICAgICAgUU4gcVhmNgotcVlqNyAgICAgICAgICAgIFFOIHFYZjcKLXFZanQgICAgICAgICAgICBRTiBxWGZ0Ci0KLWRZajBsbyAgICAgICAgICBETiAoWFRSMCoyKS5TMTYKLWRZajBoaSAgICAgICAgICBETiAoWFRSMCoyKzEpLlMxNgotZFlqMWxvICAgICAgICAgIEROIChYVFIxKjIpLlMxNgotZFlqMWhpICAgICAgICAgIEROIChYVFIxKjIrMSkuUzE2Ci1kWWoybG8gICAgICAgICAgRE4gKFhUUjIqMikuUzE2Ci1kWWoyaGkgICAgICAgICAgRE4gKFhUUjIqMisxKS5TMTYKLWRZajNsbyAgICAgICAgICBETiAoWFRSMyoyKS5TMTYKLWRZajNoaSAgICAgICAgICBETiAoWFRSMyoyKzEpLlMxNgotZFlqNGxvICAgICAgICAgIEROIChYVFI0KjIpLlMxNgotZFlqNGhpICAgICAgICAgIEROIChYVFI0KjIrMSkuUzE2Ci1kWWo1bG8gICAgICAgICAgRE4gKFhUUjUqMikuUzE2Ci1kWWo1aGkgICAgICAgICAgRE4gKFhUUjUqMisxKS5TMTYKLWRZajZsbyAgICAgICAgICBETiAoWFRSNioyKS5TMTYKLWRZajZoaSAgICAgICAgICBETiAoWFRSNioyKzEpLlMxNgotZFlqN2xvICAgICAgICAgIEROIChYVFI3KjIpLlMxNgotZFlqN2hpICAgICAgICAgIEROIChYVFI3KjIrMSkuUzE2Ci1kWWp0bG8gICAgICAgICAgRE4gKFhUUnQqMikuUzE2Ci1kWWp0aGkgICAgICAgICAgRE4gKFhUUnQqMisxKS5TMTYKLQotcVlpMCAgICAgICAgICAgIFFOIHFZajAKLXFZaTEgICAgICAgICAgICBRTiBxWWo0Ci1xWWkyICAgICAgICAgICAgUU4gcVlqMgotcVlpMyAgICAgICAgICAgIFFOIHFZajcKLXFZaTQgICAgICAgICAgICBRTiBxWWo1Ci1xWWk1ICAgICAgICAgICAgUU4gcVlqdAotcVlpNiAgICAgICAgICAgIFFOIHFZajEKLXFZaTcgICAgICAgICAgICBRTiBxWWo2Ci1xWWl0ICAgICAgICAgICAgUU4gcVlqMwotCi1kWWkwbG8gICAgICAgICAgRE4gZFlqMGxvCi1kWWkwaGkgICAgICAgICAgRE4gZFlqMGhpCi1kWWkxbG8gICAgICAgICAgRE4gZFlqNGxvCi1kWWkxaGkgICAgICAgICAgRE4gZFlqNGhpCi1kWWkybG8gICAgICAgICAgRE4gZFlqMmxvCi1kWWkyaGkgICAgICAgICAgRE4gZFlqMmhpCi1kWWkzbG8gICAgICAgICAgRE4gZFlqN2xvCi1kWWkzaGkgICAgICAgICAgRE4gZFlqN2hpCi1kWWk0bG8gICAgICAgICAgRE4gZFlqNWxvCi1kWWk0aGkgICAgICAgICAgRE4gZFlqNWhpCi1kWWk1bG8gICAgICAgICAgRE4gZFlqdGxvCi1kWWk1aGkgICAgICAgICAgRE4gZFlqdGhpCi1kWWk2bG8gICAgICAgICAgRE4gZFlqMWxvCi1kWWk2aGkgICAgICAgICAgRE4gZFlqMWhpCi1kWWk3bG8gICAgICAgICAgRE4gZFlqNmxvCi1kWWk3aGkgICAgICAgICAgRE4gZFlqNmhpCi1kWWl0bG8gICAgICAgICAgRE4gZFlqM2xvCi1kWWl0aGkgICAgICAgICAgRE4gZFlqM2hpCi0KLXFZaDAgICAgICAgICAgICBRTiBxWWl0Ci1xWWgxICAgICAgICAgICAgUU4gcVlpMAotcVloMiAgICAgICAgICAgIFFOIHFZaTIKLXFZaDMgICAgICAgICAgICBRTiBxWWkzCi1xWWg0ICAgICAgICAgICAgUU4gcVlpNwotcVloNSAgICAgICAgICAgIFFOIHFZaTUKLXFZaDYgICAgICAgICAgICBRTiBxWWk0Ci1xWWg3ICAgICAgICAgICAgUU4gcVlpMQotcVlodCAgICAgICAgICAgIFFOIHFZaTYKLQotZFloMGxvICAgICAgICAgIEROIGRZaXRsbwotZFloMGhpICAgICAgICAgIEROIGRZaXRoaQotZFloMWxvICAgICAgICAgIEROIGRZaTBsbwotZFloMWhpICAgICAgICAgIEROIGRZaTBoaQotZFloMmxvICAgICAgICAgIEROIGRZaTJsbwotZFloMmhpICAgICAgICAgIEROIGRZaTJoaQotZFloM2xvICAgICAgICAgIEROIGRZaTNsbwotZFloM2hpICAgICAgICAgIEROIGRZaTNoaQotZFloNGxvICAgICAgICAgIEROIGRZaTdsbwotZFloNGhpICAgICAgICAgIEROIGRZaTdoaQotZFloNWxvICAgICAgICAgIEROIGRZaTVsbwotZFloNWhpICAgICAgICAgIEROIGRZaTVoaQotZFloNmxvICAgICAgICAgIEROIGRZaTRsbwotZFloNmhpICAgICAgICAgIEROIGRZaTRoaQotZFloN2xvICAgICAgICAgIEROIGRZaTFsbwotZFloN2hpICAgICAgICAgIEROIGRZaTFoaQotZFlodGxvICAgICAgICAgIEROIGRZaTZsbwotZFlodGhpICAgICAgICAgIEROIGRZaTZoaQotCi1xWWcwICAgICAgICAgICAgUU4gcVloMgotcVlnMSAgICAgICAgICAgIFFOIHFZaHQKLXFZZzIgICAgICAgICAgICBRTiBxWWgxCi1xWWczICAgICAgICAgICAgUU4gcVloMAotcVlnNCAgICAgICAgICAgIFFOIHFZaDQKLXFZZzUgICAgICAgICAgICBRTiBxWWg1Ci1xWWc2ICAgICAgICAgICAgUU4gcVloNgotcVlnNyAgICAgICAgICAgIFFOIHFZaDcKLXFZZ3QgICAgICAgICAgICBRTiBxWWgzCi0KLXFZZjAgICAgICAgICAgICBRTiBxWWc2Ci1xWWYxICAgICAgICAgICAgUU4gcVlnNQotcVlmMiAgICAgICAgICAgIFFOIHFZZzQKLXFZZjMgICAgICAgICAgICBRTiBxWWd0Ci1xWWY0ICAgICAgICAgICAgUU4gcVlnMwotcVlmNSAgICAgICAgICAgIFFOIHFZZzIKLXFZZjYgICAgICAgICAgICBRTiBxWWcxCi1xWWY3ICAgICAgICAgICAgUU4gcVlnMAotcVlmdCAgICAgICAgICAgIFFOIHFZZzcKLQotICAgICAgICBWUlNIUiAgICAgICBxWWo3LCBxWWo3LCAjMgotICAgICAgICBWUlNIUiAgICAgICBxWWo2LCBxWWo2LCAjMQotICAgICAgICAKLSAgICAgICAgVkhBREQgICAgICAgcVlpNSwgcVlqMSwgcVlqNyAgICAgICAgOy8vIGk1ID0gKGoxK2o3KS8yCi0gICAgICAgIFZTVUIgICAgICAgIHFZaTYsIHFZajEsIHFZajcgICAgICAgIDsvLyBpNiA9IGoxLWo3Ci0gICAgICAgIFZIQUREICAgICAgIHFZaTMsIHFZajIsIHFZajYgICAgICAgIDsvLyBpMyA9IChqMitqNikvMgotICAgICAgICBWU1VCICAgICAgICBxWWkyLCBxWWoyLCBxWWo2ICAgICAgICA7Ly8gaTIgPSBqMi1qNgotICAgICAgICBWSEFERCAgICAgICBxWWk3LCBxWWo1LCBxWWozICAgICAgICA7Ly8gaTcgPSAoajUrajMpLzIKLSAgICAgICAgVlNVQiAgICAgICAgcVlpNCwgcVlqNSwgcVlqMyAgICAgICAgOy8vIGk0ID0gajUtajMKLQotICAgICAgICBWUURNVUxIICAgICBxWWkyLCBxWWkyLCBJbnZTcXJ0MiAgICA7Ly8gaTIvc3FydCgyKQotICAgICAgICA7Ly8gSVN0YWdlIDQsMyByb3dzIDB0bzEgeCAxLzIKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgICAgIHBUZW1wLCAjMHg0ICAgICAgICAgICAgIDsvLyBlbnN1cmUgY29ycmVjdCByb3VuZAotICAgICAgICBWRFVQICAgICAgICBxU2NhbGUxLCBwVGVtcCAgICAgICAgICAgOy8vIG9mIERDIHJlc3VsdAotICAgICAgICBWQUREICAgICAgICBxWWkwLCBxWWkwLCBxU2NhbGUxCi0gICAgICAgIAotICAgICAgICBWSEFERCAgICAgICBxWWgwLCBxWWkwLCBxWWkxICAgICAgICA7Ly8gKGkwK2kxKS8yCi0gICAgICAgIFZIU1VCICAgICAgIHFZaDEsIHFZaTAsIHFZaTEgICAgICAgIDsvLyAoaTAtaTEpLzIKLQotICAgICAgICBWSEFERCAgICAgICBxWWg3LCBxWWk1LCBxWWk3ICAgICAgICA7Ly8gKGk1K2k3KS80Ci0gICAgICAgIFZTVUIgICAgICAgIHFZaDUsIHFZaTUsIHFZaTcgICAgICAgIDsvLyAoaTUtaTcpLzIKLSAgICAgICAgVlNVQiAgICAgICAgcVloMiwgcVlpMiwgcVlpMyAgICAgICAgOy8vIGgyLCBoMwotICAgICAgICBWUURNVUxIICAgICBxWWg1LCBxWWg1LCBJbnZTcXJ0MiAgICA7Ly8gaDUvc3FydCgyKQotCi0gICAgICAgIFZNVUxMICAgICAgIHFYdDAsIGRZaTRsbywgQyAgICAgICAgIDsvLyBjKmk0Ci0gICAgICAgIFZNTEFMICAgICAgIHFYdDAsIGRZaTZsbywgUyAgICAgICAgIDsvLyBjKmk0K3MqaTYKLSAgICAgICAgVk1VTEwgICAgICAgcVh0MSwgZFlpNGhpLCBDCi0gICAgICAgIFZNTEFMICAgICAgIHFYdDEsIGRZaTZoaSwgUwotICAgICAgICBWU0hSTiAgICAgICBkWWg0bG8sIHFYdDAsICMxNiAgICAgICA7Ly8gaDQKLSAgICAgICAgVlNIUk4gICAgICAgZFloNGhpLCBxWHQxLCAjMTYKLSAgICAgICAgCi0gICAgICAgIFZNVUxMICAgICAgIHFYdDAsIGRZaTZsbywgQyAgICAgICAgIDsvLyBjKmk2Ci0gICAgICAgIFZNTFNMICAgICAgIHFYdDAsIGRZaTRsbywgUyAgICAgICAgIDsvLyAtcyppNCArIGMqaDYKLSAgICAgICAgVk1VTEwgICAgICAgcVh0MSwgZFlpNmhpLCBDCi0gICAgICAgIFZNTFNMICAgICAgIHFYdDEsIGRZaTRoaSwgUwotICAgICAgICBWU0hSTiAgICAgICBkWWg2bG8sIHFYdDAsICMxNiAgICAgICA7Ly8gaDYKLSAgICAgICAgVlNIUk4gICAgICAgZFloNmhpLCBxWHQxLCAjMTYKLSAgICAgICAgCi0gICAgICAgIFZTVUIgICAgICAgIHFZZzYsIHFZaDYsIHFZaDcKLSAgICAgICAgVlNVQiAgICAgICAgcVlnNSwgcVloNSwgcVlnNgotICAgICAgICBWU1VCICAgICAgICBxWWc0LCBxWWg0LCBxWWc1Ci0gICAgICAgIAotICAgICAgICA7Ly8gSVN0YWdlIDIgcm93cyAwdG8zIHggMS8yCi0gICAgICAgIFZIQUREICAgICAgIHFZZzEsIHFZaDEsIHFZaDIgICAgICAgIDsvLyAoaDEraDIpLzIKLSAgICAgICAgVkhTVUIgICAgICAgcVlnMiwgcVloMSwgcVloMiAgICAgICAgOy8vIChoMS1oMikvMgotICAgICAgICBWSEFERCAgICAgICBxWWcwLCBxWWgwLCBxWWgzICAgICAgICA7Ly8gKGgwK2gzKS8yCi0gICAgICAgIFZIU1VCICAgICAgIHFZZzMsIHFZaDAsIHFZaDMgICAgICAgIDsvLyAoaDAtaDMpLzIKLSAgICAgICAgCi0KLSAgICAgICAgOy8vIElTdGFnZSAxIGFsbCByb3dzCi0gICAgICAgIFZIQUREICAgICAgICBxWWYzLCBxWWczLCBxWWc0ICAgICAgICAKLSAgICAgICAgVkhTVUIgICAgICAgIHFZZjQsIHFZZzMsIHFZZzQgICAgICAgIAotICAgICAgICBWSEFERCAgICAgICAgcVlmMiwgcVlnMiwgcVlnNSAgICAgICAgCi0gICAgICAgIFZIU1VCICAgICAgICBxWWY1LCBxWWcyLCBxWWc1ICAgICAgICAKLSAgICAgICAgVkhBREQgICAgICAgIHFZZjEsIHFZZzEsIHFZZzYKLSAgICAgICAgVkhTVUIgICAgICAgIHFZZjYsIHFZZzEsIHFZZzYgICAgICAgIAotICAgICAgICBWSEFERCAgICAgICAgcVlmMCwgcVlnMCwgcVlnNwotICAgICAgICBWSFNVQiAgICAgICAgcVlmNywgcVlnMCwgcVlnNyAgICAgIAotCi1ZVFIwICAgICAgICAgICAgRVFVIFNyYzAKLVlUUjEgICAgICAgICAgICBFUVUgU3JjNAotWVRSMiAgICAgICAgICAgIEVRVSBTcmMxCi1ZVFIzICAgICAgICAgICAgRVFVIFNyYzIKLVlUUjQgICAgICAgICAgICBFUVUgU3JjNwotWVRSNSAgICAgICAgICAgIEVRVSBTcmM1Ci1ZVFI2ICAgICAgICAgICAgRVFVIFRtcAotWVRSNyAgICAgICAgICAgIEVRVSBTcmM2Ci1ZVFJ0ICAgICAgICAgICAgRVFVIFNyYzMKLQotcUMwICAgICAgICAgICAgIFFOICBZVFIwLlMzMiAgICAgICAgICAgICAgICA7Ly8gZm9yIFlUUnBvc2UKLXFDMSAgICAgICAgICAgICBRTiAgWVRSMS5TMzIKLXFDMiAgICAgICAgICAgICBRTiAgWVRSMi5TMzIKLXFDMyAgICAgICAgICAgICBRTiAgWVRSMy5TMzIKLXFDNCAgICAgICAgICAgICBRTiAgWVRSNC5TMzIKLXFDNSAgICAgICAgICAgICBRTiAgWVRSNS5TMzIKLXFDNiAgICAgICAgICAgICBRTiAgWVRSNi5TMzIKLXFDNyAgICAgICAgICAgICBRTiAgWVRSNy5TMzIKLQotZEQwICAgICAgICAgICAgIEROICBZVFIwKjIrMSAgICAgICAgICAgICAgICA7Ly8gZm9yIHVzaW5nIFZTV1AKLWREMSAgICAgICAgICAgICBETiAgWVRSMSoyKzEKLWREMiAgICAgICAgICAgICBETiAgWVRSMioyKzEKLWREMyAgICAgICAgICAgICBETiAgWVRSMyoyKzEKLWRENCAgICAgICAgICAgICBETiAgWVRSNCoyCi1kRDUgICAgICAgICAgICAgRE4gIFlUUjUqMgotZEQ2ICAgICAgICAgICAgIEROICBZVFI2KjIKLWRENyAgICAgICAgICAgICBETiAgWVRSNyoyCi0gICAgICAgICAgCi0gICAgICAgIFZUUk4gICAgICAgIHFZZjAsIHFZZjEKLSAgICAgICAgVlRSTiAgICAgICAgcVlmMiwgcVlmMwotICAgICAgICBWVFJOICAgICAgICBxWWY0LCBxWWY1Ci0gICAgICAgIFZUUk4gICAgICAgIHFZZjYsIHFZZjcKLSAgICAgICAgVlRSTiAgICAgICAgcUMwLCBxQzIKLSAgICAgICAgVlRSTiAgICAgICAgcUMxLCBxQzMKLSAgICAgICAgVlRSTiAgICAgICAgcUM0LCBxQzYKLSAgICAgICAgVlRSTiAgICAgICAgcUM1LCBxQzcgICAgICAgIAotICAgICAgICBWU1dQICAgICAgICBkRDAsIGRENAotICAgICAgICBWU1dQICAgICAgICBkRDEsIGRENQotICAgICAgICBWU1dQICAgICAgICBkRDIsIGRENgotICAgICAgICBWU1dQICAgICAgICBkRDMsIGRENwotCi0gICAgICAgIAotZFlmMFU4ICAgICAgICAgIEROIFlUUjAqMi5VOAotZFlmMVU4ICAgICAgICAgIEROIFlUUjEqMi5VOAotZFlmMlU4ICAgICAgICAgIEROIFlUUjIqMi5VOAotZFlmM1U4ICAgICAgICAgIEROIFlUUjMqMi5VOAotZFlmNFU4ICAgICAgICAgIEROIFlUUjQqMi5VOAotZFlmNVU4ICAgICAgICAgIEROIFlUUjUqMi5VOAotZFlmNlU4ICAgICAgICAgIEROIFlUUjYqMi5VOAotZFlmN1U4ICAgICAgICAgIEROIFlUUjcqMi5VOAotICAgICAgICAKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBEbyBzYXR1cmF0aW9uIGlmIG91dHNpemUgaXMgb3RoZXIgdGhhbiBTMTYKLSAgICAgICAgOy8vCi0gICAgICAgIAotICAgICAgICBJRiAoIiRvdXRzaXplIj0idTgiKQotICAgICAgICAgICAgOy8vIE91dHB1dCByYW5nZSBbMC0yNTVdCi0gICAgICAgICAgICBWUU1PVk4gICAgICAgICAgICBkWWYwVTgsIHFZZjAKLSAgICAgICAgICAgIFZRTU9WTiAgICAgICAgICAgIGRZZjFVOCwgcVlmMQotICAgICAgICAgICAgVlFNT1ZOICAgICAgICAgICAgZFlmMlU4LCBxWWYyCi0gICAgICAgICAgICBWUU1PVk4gICAgICAgICAgICBkWWYzVTgsIHFZZjMKLSAgICAgICAgICAgIFZRTU9WTiAgICAgICAgICAgIGRZZjRVOCwgcVlmNAotICAgICAgICAgICAgVlFNT1ZOICAgICAgICAgICAgZFlmNVU4LCBxWWY1Ci0gICAgICAgICAgICBWUU1PVk4gICAgICAgICAgICBkWWY2VTgsIHFZZjYKLSAgICAgICAgICAgIFZRTU9WTiAgICAgICAgICAgIGRZZjdVOCwgcVlmNwotICAgICAgICBFTkRJRgotICAgICAgICAKLSAgICAgICAgSUYgKCIkb3V0c2l6ZSI9InM5IikKLSAgICAgICAgICAgIDsvLyBPdXRwdXQgcmFuZ2UgWy0yNTYgdG8gKzI1NV0KLSAgICAgICAgICAgIFZRU0hMICAgICAgICAgICAgcVlmMCwgcVlmMCwgIzE2LTkKLSAgICAgICAgICAgIFZRU0hMICAgICAgICAgICAgcVlmMSwgcVlmMSwgIzE2LTkKLSAgICAgICAgICAgIFZRU0hMICAgICAgICAgICAgcVlmMiwgcVlmMiwgIzE2LTkKLSAgICAgICAgICAgIFZRU0hMICAgICAgICAgICAgcVlmMywgcVlmMywgIzE2LTkKLSAgICAgICAgICAgIFZRU0hMICAgICAgICAgICAgcVlmNCwgcVlmNCwgIzE2LTkKLSAgICAgICAgICAgIFZRU0hMICAgICAgICAgICAgcVlmNSwgcVlmNSwgIzE2LTkKLSAgICAgICAgICAgIFZRU0hMICAgICAgICAgICAgcVlmNiwgcVlmNiwgIzE2LTkKLSAgICAgICAgICAgIFZRU0hMICAgICAgICAgICAgcVlmNywgcVlmNywgIzE2LTkKLSAgICAgICAgICAgIAotICAgICAgICAgICAgVlNIUiAgICAgICAgICAgICBxWWYwLCBxWWYwLCAjMTYtOQotICAgICAgICAgICAgVlNIUiAgICAgICAgICAgICBxWWYxLCBxWWYxLCAjMTYtOQotICAgICAgICAgICAgVlNIUiAgICAgICAgICAgICBxWWYyLCBxWWYyLCAjMTYtOQotICAgICAgICAgICAgVlNIUiAgICAgICAgICAgICBxWWYzLCBxWWYzLCAjMTYtOQotICAgICAgICAgICAgVlNIUiAgICAgICAgICAgICBxWWY0LCBxWWY0LCAjMTYtOQotICAgICAgICAgICAgVlNIUiAgICAgICAgICAgICBxWWY1LCBxWWY1LCAjMTYtOQotICAgICAgICAgICAgVlNIUiAgICAgICAgICAgICBxWWY2LCBxWWY2LCAjMTYtOQotICAgICAgICAgICAgVlNIUiAgICAgICAgICAgICBxWWY3LCBxWWY3LCAjMTYtOQotICAgICAgICBFTkRJRgotCi0gICAgICAgIDsvLyBTdG9yZSBvdXRwdXQgZGVwZW5kaW5nIG9uIHRoZSBTdHJpZGUgc2l6ZQotICAgICAgICBJRiAiJHN0cmlkZSI9InMiCi0gICAgICAgICAgICBWU1QxICAgICAgICBxWWYwLCBbcERlc3QgQDY0XSwgU3RyaWRlCi0gICAgICAgICAgICBWU1QxICAgICAgICBxWWYxLCBbcERlc3QgQDY0XSwgU3RyaWRlCi0gICAgICAgICAgICBWU1QxICAgICAgICBxWWYyLCBbcERlc3QgQDY0XSwgU3RyaWRlCi0gICAgICAgICAgICBWU1QxICAgICAgICBxWWYzLCBbcERlc3QgQDY0XSwgU3RyaWRlCi0gICAgICAgICAgICBWU1QxICAgICAgICBxWWY0LCBbcERlc3QgQDY0XSwgU3RyaWRlCi0gICAgICAgICAgICBWU1QxICAgICAgICBxWWY1LCBbcERlc3QgQDY0XSwgU3RyaWRlCi0gICAgICAgICAgICBWU1QxICAgICAgICBxWWY2LCBbcERlc3QgQDY0XSwgU3RyaWRlCi0gICAgICAgICAgICBWU1QxICAgICAgICBxWWY3LCBbcERlc3QgQDY0XSAgICAgICAgICAgIAotICAgICAgICBFTFNFCi0gICAgICAgICAgICBJRiAoIiRvdXRzaXplIj0idTgiKQotICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIGRZZjBVOCwgW3BEZXN0IEA2NF0sICM4Ci0gICAgICAgICAgICAgICAgVlNUMSAgICAgICAgZFlmMVU4LCBbcERlc3QgQDY0XSwgIzgKLSAgICAgICAgICAgICAgICBWU1QxICAgICAgICBkWWYyVTgsIFtwRGVzdCBANjRdLCAjOAotICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIGRZZjNVOCwgW3BEZXN0IEA2NF0sICM4Ci0gICAgICAgICAgICAgICAgVlNUMSAgICAgICAgZFlmNFU4LCBbcERlc3QgQDY0XSwgIzgKLSAgICAgICAgICAgICAgICBWU1QxICAgICAgICBkWWY1VTgsIFtwRGVzdCBANjRdLCAjOAotICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIGRZZjZVOCwgW3BEZXN0IEA2NF0sICM4Ci0gICAgICAgICAgICAgICAgVlNUMSAgICAgICAgZFlmN1U4LCBbcERlc3QgQDY0XQotICAgICAgICAgICAgRUxTRQotICAgICAgICAgICAgICAgIDsvLyAoIiRvdXRzaXplIj0iczkiKSBvciAoIiRvdXRzaXplIj0iczE2IikKLSAgICAgICAgICAgICAgICBWU1QxICAgICAgICBxWWYwLCBbcERlc3QgQDY0XSwgIzE2Ci0gICAgICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmMSwgW3BEZXN0IEA2NF0sICMxNgotICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjIsIFtwRGVzdCBANjRdLCAjMTYKLSAgICAgICAgICAgICAgICBWU1QxICAgICAgICBxWWYzLCBbcERlc3QgQDY0XSwgIzE2Ci0gICAgICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmNCwgW3BEZXN0IEA2NF0sICMxNgotICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjUsIFtwRGVzdCBANjRdLCAjMTYKLSAgICAgICAgICAgICAgICBWU1QxICAgICAgICBxWWY2LCBbcERlc3QgQDY0XSwgIzE2Ci0gICAgICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmNywgW3BEZXN0IEA2NF0KLSAgICAgICAgICAgIEVORElGCi0gICAgICAgIAotICAgICAgICBFTkRJRgotCi0KLQotICAgICAgICBFTkRJRiA7Ly8gQ29ydGV4QTgKLQotCi0KLSAgICAgICAgTUVORCAgICAgICAgCi0KLSAgICAgICAgOy8vIFNjYWxlIFRXTyBpbnB1dCByb3dzIHdpdGggVFdPIHJvd3Mgb2YgMTYgYml0IHNjYWxlIHZhbHVlcwotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIFRoaXMgbWFjcm8gaXMgdXNlZCBieSBNX0lEQ1RfUFJFU0NBTEUxNiB0byBwcmUtc2NhbGUgb25lIHJvdwotICAgICAgICA7Ly8gaW5wdXQgKEVpZ2h0IGlucHV0IHZhbHVlcykgd2l0aCBvbmUgcm93IG9mIHNjYWxlIHZhbHVlcy4gQWxzbyAKLSAgICAgICAgOy8vIExvYWRzIG5leHQgc2NhbGUgdmFsdWVzIGZyb20gcFNjYWxlLCBpZiAkTGFzdFJvdyBmbGFnIGlzIG5vdCBzZXQuCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRkQWxvICAgICAgICAgICAtIElucHV0IEQgcmVnaXN0ZXIgd2l0aCBmaXJzdCBmb3VyIFMxNiB2YWx1ZXMgb2Ygcm93IG4KLSAgICAgICAgOy8vICRkQWhpICAgICAgICAgICAtIElucHV0IEQgcmVnaXN0ZXIgd2l0aCBuZXh0IGZvdXIgUzE2IHZhbHVlcyBvZiByb3cgbgotICAgICAgICA7Ly8gJGRCbG8gICAgICAgICAgIC0gSW5wdXQgRCByZWdpc3RlciB3aXRoIGZpcnN0IGZvdXIgUzE2IHZhbHVlcyBvZiByb3cgbisxCi0gICAgICAgIDsvLyAkZEJoaSAgICAgICAgICAgLSBJbnB1dCBEIHJlZ2lzdGVyIHdpdGggbmV4dCBmb3VyIFMxNiB2YWx1ZXMgb2Ygcm93IG4rMQotICAgICAgICA7Ly8gcFNjYWxlICAgICAgICAgIC0gUG9pbnRlciB0byBuZXh0IHJvdyBvZiBzY2FsZSB2YWx1ZXMKLSAgICAgICAgOy8vIHFUMGxvICAgICAgICAgICAtIFRlbXBvcmFyeSBzY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyBxVDBoaSAgICAgICAgICAgLSBUZW1wb3Jhcnkgc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8gcVQxbG8gICAgICAgICAgIC0gVGVtcG9yYXJ5IHNjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vIHFUMWhpICAgICAgICAgICAtIFRlbXBvcmFyeSBzY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyBkU2NhbGUxbG8gICAgICAgLSBTY2FsZSB2YWx1ZSBvZiByb3cgbgotICAgICAgICA7Ly8gZFNjYWxlMWhpICAgICAgIC0gU2NhbGUgdmFsdWUgb2Ygcm93IG4KLSAgICAgICAgOy8vIGRTY2FsZTJsbyAgICAgICAtIFNjYWxlIHZhbHVlIG9mIHJvdyBuKzEKLSAgICAgICAgOy8vIGRTY2FsZTJoaSAgICAgICAtIFNjYWxlIHZhbHVlIG9mIHJvdyBuKzEKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnB1dCBGbGFnCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJExhc3RSb3cgICAgICAgIC0gRmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIGN1cnJlbnQgcm93IGlzIGxhc3Qgcm93Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkZEFsbyAgICAgICAgICAgLSBTY2FsZWQgb3V0cHV0IHZhbHVlcyAoZmlyc3QgZm91ciBTMTYgb2Ygcm93IG4pCi0gICAgICAgIDsvLyAkZEFoaSAgICAgICAgICAgLSBTY2FsZWQgb3V0cHV0IHZhbHVlcyAobmV4dCBmb3VyIFMxNiBvZiByb3cgbikKLSAgICAgICAgOy8vICRkQmxvICAgICAgICAgICAtIFNjYWxlZCBvdXRwdXQgdmFsdWVzIChmaXJzdCBmb3VyIFMxNiBvZiByb3cgbisxKQotICAgICAgICA7Ly8gJGRCaGkgICAgICAgICAgIC0gU2NhbGVkIG91dHB1dCB2YWx1ZXMgKG5leHQgZm91ciBTMTYgb2Ygcm93IG4rMSkKLSAgICAgICAgOy8vIHFTY2FsZTEgICAgICAgICAtIFNjYWxlIHZhbHVlcyBmb3IgbmV4dCByb3cKLSAgICAgICAgOy8vIHFTY2FsZTIgICAgICAgICAtIFNjYWxlIHZhbHVlcyBmb3IgbmV4dCByb3crMQotICAgICAgICA7Ly8gcFNjYWxlICAgICAgICAgIC0gUG9pbnRlciB0byBuZXh0IHJvdyBvZiBzY2FsZSB2YWx1ZXMKLSAgICAgICAgOy8vCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fSURDVF9TQ0FMRTE2ICRkQWxvLCAkZEFoaSwgJGRCbG8sICRkQmhpLCAkTGFzdFJvdwotICAgICAgICBWTVVMTCAgICAgICBxVDBsbywgJGRBbG8sIGRTY2FsZTFsbwotICAgICAgICBWTVVMTCAgICAgICBxVDBoaSwgJGRBaGksIGRTY2FsZTFoaQotICAgICAgICBWTVVMTCAgICAgICBxVDFsbywgJGRCbG8sIGRTY2FsZTJsbwotICAgICAgICBWTVVMTCAgICAgICBxVDFoaSwgJGRCaGksIGRTY2FsZTJoaQotICAgICAgICBJRiAiJExhc3RSb3ciPSIwIgotICAgICAgICAgICAgVkxEMSAgICAgICAgcVNjYWxlMSwgW3BTY2FsZV0sICMxNiAgOy8vIExvYWQgc2NhbGUgZm9yIHJvdyBuKzEKLSAgICAgICAgICAgIFZMRDEgICAgICAgIHFTY2FsZTIsIFtwU2NhbGVdLCAjMTYgIDsvLyBMb2FkIHNjYWxlIGZvciByb3cgbisyCi0gICAgICAgIEVORElGCi0gICAgICAgIFZRUlNIUk4gICAgICAgJGRBbG8sIHFUMGxvLCAjMTIgICAgICAgIAotICAgICAgICBWUVJTSFJOICAgICAgICRkQWhpLCBxVDBoaSwgIzEyICAgICAgICAKLSAgICAgICAgVlFSU0hSTiAgICAgICAkZEJsbywgcVQxbG8sICMxMiAgICAgICAgCi0gICAgICAgIFZRUlNIUk4gICAgICAgJGRCaGksIHFUMWhpLCAjMTIgICAgICAgIAotICAgICAgICBNRU5ECi0KLSAgICAgICAgOy8vIFNjYWxlIDh4OCBibG9jayBpbnB1dCB2YWx1ZXMgd2l0aCAxNiBiaXQgc2NhbGUgdmFsdWVzCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gVGhpcyBtYWNybyBpcyB1c2VkIHRvIHByZS1zY2FsZSBibG9jayBvZiA4eDggaW5wdXQuCi0gICAgICAgIDsvLyBUaGlzIGFsc28gZG8gdGhlIElzdCBzdGFnZSB0cmFuc2Zvcm1hdGlvbnMgb2YgSURDVC4KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gZFhqbmxvICAgICAgICAgIC0gbiB0aCBpbnB1dCBEIHJlZ2lzdGVyIHdpdGggZmlyc3QgZm91ciBTMTYgdmFsdWVzCi0gICAgICAgIDsvLyBkWGpuaGkgICAgICAgICAgLSBuIHRoIGlucHV0IEQgcmVnaXN0ZXIgd2l0aCBuZXh0IGZvdXIgUzE2IHZhbHVlcwotICAgICAgICA7Ly8gcVhqbiAgICAgICAgICAgIC0gbiB0aCBpbnB1dCBRIHJlZ2lzdGVyIHdpdGggZWlnaHQgUzE2IHZhbHVlcwotICAgICAgICA7Ly8gcFNjYWxlICAgICAgICAgIC0gUG9pbnRlciB0byBzY2FsZSB2YWx1ZXMKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIHFYaW4gICAgICAgICAgICAtIG4gdGggb3V0cHV0IFEgcmVnaXN0ZXIgd2l0aCBlaWdodCBTMTYgb3V0cHV0IHZhbHVlcyBvZiAxc3Qgc3RhZ2UKLSAgICAgICAgOy8vCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fSURDVF9QUkVTQ0FMRTE2Ci0gICAgICAgIFZMRDEgICAgICAgIHFTY2FsZTEsIFtwU2NhbGVdLCAjMTYgICAgICA7Ly8gTG9hZCBQcmUgc2NhbGUgZm9yIHJvdyAwCi0gICAgICAgIFZMRDEgICAgICAgIHFTY2FsZTIsIFtwU2NhbGVdLCAjMTYgICAgICA7Ly8gTG9hZCBQcmUgc2NhbGUgZm9yIHJvdyAwCi0gICAgICAgIE1fSURDVF9TQ0FMRTE2IGRYajBsbywgZFhqMGhpLCBkWGoxbG8sIGRYajFoaSwgMCAgICAgICAgOy8vIFByZSBzY2FsZSByb3cgMCAmIDEKLSAgICAgICAgTV9JRENUX1NDQUxFMTYgZFhqMmxvLCBkWGoyaGksIGRYajNsbywgZFhqM2hpLCAwICAgICAgICAKLSAgICAgICAgTV9JRENUX1NDQUxFMTYgZFhqNGxvLCBkWGo0aGksIGRYajVsbywgZFhqNWhpLCAwICAgICAgICAKLSAgICAgICAgTV9JRENUX1NDQUxFMTYgZFhqNmxvLCBkWGo2aGksIGRYajdsbywgZFhqN2hpLCAxICAgICAgICAKLSAgICAgICAgVkhBREQgICAgICAgcVhpNSwgcVhqMSwgcVhqNyAgICAgICAgICAgIDsvLyAoajErajcpLzIKLSAgICAgICAgVlNVQiAgICAgICAgcVhpNiwgcVhqMSwgcVhqNyAgICAgICAgICAgIDsvLyBqMS1qNwotICAgICAgICBMRFIgICAgICAgICBwU3JjLCA9YXJtQ09NTV9JRENUQ29lZiA7Ly8gQWRkcmVzcyBvZiBEQ1QgaW52ZXJzZSBBQU4gY29uc3RhbnRzCi0gICAgICAgIFZIQUREICAgICAgIHFYaTMsIHFYajIsIHFYajYgICAgICAgICAgICA7Ly8gKGoyK2o2KS8yCi0gICAgICAgIFZTVUIgICAgICAgIHFYaTIsIHFYajIsIHFYajYgICAgICAgICAgICA7Ly8gajItajYKLSAgICAgICAgVkxEUiAgICAgICAgZENvZWZzLCBbcFNyY10gICAgICAgICAgICAgIDsvLyBMb2FkIERDVCBpbnZlcnNlIEFBTiBjb25zdGFudHMKLSAgICAgICAgVkhBREQgICAgICAgcVhpNywgcVhqNSwgcVhqMyAgICAgICAgICAgIDsvLyAoajUrajMpLzIKLSAgICAgICAgVlNVQiAgICAgICAgcVhpNCwgcVhqNSwgcVhqMyAgICAgICAgICAgIDsvLyBqNS1qMwotICAgICAgICBNRU5EICAgIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBTY2FsZSA4eDggYmxvY2sgaW5wdXQgdmFsdWVzIHdpdGggMzIgYml0IHNjYWxlIHZhbHVlcwotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIFRoaXMgbWFjcm8gaXMgdXNlZCB0byBwcmUtc2NhbGUgYmxvY2sgb2YgOHg4IGlucHV0LgotICAgICAgICA7Ly8gVGhpcyBhbHNvIGRvIHRoZSBJc3Qgc3RhZ2UgdHJhbnNmb3JtYXRpb25zIG9mIElEQ1QuCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIGRYam5sbyAgICAgICAgICAtIG4gdGggaW5wdXQgRCByZWdpc3RlciB3aXRoIGZpcnN0IGZvdXIgUzE2IHZhbHVlcwotICAgICAgICA7Ly8gZFhqbmhpICAgICAgICAgIC0gbiB0aCBpbnB1dCBEIHJlZ2lzdGVyIHdpdGggbmV4dCBmb3VyIFMxNiB2YWx1ZXMKLSAgICAgICAgOy8vIHFYam4gICAgICAgICAgICAtIG4gdGggaW5wdXQgUSByZWdpc3RlciB3aXRoIGVpZ2h0IFMxNiB2YWx1ZXMKLSAgICAgICAgOy8vIHBTY2FsZSAgICAgICAgICAtIFBvaW50ZXIgdG8gMzJiaXQgc2NhbGUgdmFsdWVzIGluIFEyMyBmb3JtYXQKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIGRYaW5sbyAgICAgICAgICAtIG4gdGggb3V0cHV0IEQgcmVnaXN0ZXIgd2l0aCBmaXJzdCBmb3VyIFMxNiBvdXRwdXQgdmFsdWVzIG9mIDFzdCBzdGFnZQotICAgICAgICA7Ly8gZFhpbmhpICAgICAgICAgIC0gbiB0aCBvdXRwdXQgRCByZWdpc3RlciB3aXRoIG5leHQgZm91ciBTMTYgb3V0cHV0IHZhbHVlcyBvZiAxc3Qgc3RhZ2UKLSAgICAgICAgOy8vCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fSURDVF9QUkVTQ0FMRTMyCi1xU2NhbGUwbG8gICAgICAgUU4gMC5TMzIKLXFTY2FsZTBoaSAgICAgICBRTiAxLlMzMgotcVNjYWxlMWxvICAgICAgIFFOIDIuUzMyCi1xU2NhbGUxaGkgICAgICAgUU4gMy5TMzIKLXFTY2FsZTJsbyAgICAgICBRTiBxU2NhbGUxbG8KLXFTY2FsZTJoaSAgICAgICBRTiBxU2NhbGUxaGkKLXFTY2FsZTNsbyAgICAgICBRTiBxU2NhbGUxbG8KLXFTY2FsZTNoaSAgICAgICBRTiBxU2NhbGUxaGkKLXFTY2FsZTRsbyAgICAgICBRTiBxU2NhbGUxbG8KLXFTY2FsZTRoaSAgICAgICBRTiBxU2NhbGUxaGkKLXFTY2FsZTVsbyAgICAgICBRTiBxU2NhbGUwbG8KLXFTY2FsZTVoaSAgICAgICBRTiBxU2NhbGUwaGkKLXFTY2FsZTZsbyAgICAgICBRTiBxU2NhbGUwbG8KLXFTY2FsZTZoaSAgICAgICBRTiBxU2NhbGUwaGkKLXFTY2FsZTdsbyAgICAgICBRTiBxU2NhbGUwbG8KLXFTY2FsZTdoaSAgICAgICBRTiBxU2NhbGUwaGkKLQotcVNyYzBsbyAgICAgICAgIFFOIDQuUzMyCi1xU3JjMGhpICAgICAgICAgUU4gNS5TMzIKLXFTcmMxbG8gICAgICAgICBRTiA2LlMzMgotcVNyYzFoaSAgICAgICAgIFFOIFNyYzQuUzMyCi1xU3JjMmxvICAgICAgICAgUU4gcVNyYzBsbwotcVNyYzJoaSAgICAgICAgIFFOIHFTcmMwaGkKLXFTcmMzbG8gICAgICAgICBRTiBxU3JjMGxvCi1xU3JjM2hpICAgICAgICAgUU4gcVNyYzBoaQotcVNyYzRsbyAgICAgICAgIFFOIHFTcmMwbG8KLXFTcmM0aGkgICAgICAgICBRTiBxU3JjMGhpCi1xU3JjNWxvICAgICAgICAgUU4gcVNyYzFsbwotcVNyYzVoaSAgICAgICAgIFFOIHFTcmMxaGkKLXFTcmM2bG8gICAgICAgICBRTiBxU3JjMWxvCi1xU3JjNmhpICAgICAgICAgUU4gcVNyYzFoaQotcVNyYzdsbyAgICAgICAgIFFOIHFTcmMwbG8KLXFTcmM3aGkgICAgICAgICBRTiBxU3JjMGhpCi0KLXFSZXMxN2xvICAgICAgICBRTiBxU2NhbGUwbG8KLXFSZXMxN2hpICAgICAgICBRTiBxU2NhbGUwaGkKLXFSZXMyNmxvICAgICAgICBRTiBxU2NhbGUwbG8KLXFSZXMyNmhpICAgICAgICBRTiBxU2NhbGUwaGkKLXFSZXM1M2xvICAgICAgICBRTiBxU2NhbGUwbG8KLXFSZXM1M2hpICAgICAgICBRTiBxU2NhbGUwaGkKLQotICAgICAgICAgICAgQUREICAgICAgICAgcFRlbXAsIHBTY2FsZSwgIzQqOCo3ICAgICAgICAgICA7Ly8gQWRkcmVzcyBvZiAgcFNjYWxlWzddCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIDsvLyBSb3cgMAotICAgICAgICAgICAgVkxEMSAgICAgICAge3FTY2FsZTBsbywgcVNjYWxlMGhpfSwgW3BTY2FsZV0hCi0gICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjMGxvLCBkWGowbG8sICMoMTItMSkKLSAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmMwaGksIGRYajBoaSwgIygxMi0xKSAgICAgICAgICAgIAotICAgICAgICAgICAgVkxEMSAgICAgICAge3FTY2FsZTFsbywgcVNjYWxlMWhpfSwgW3BTY2FsZV0hCi0gICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjMGxvLCBxU2NhbGUwbG8sIHFTcmMwbG8KLSAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmMwaGksIHFTY2FsZTBoaSwgcVNyYzBoaQotICAgICAgICAgICAgVkxEMSAgICAgICAge3FTY2FsZTdsbywgcVNjYWxlN2hpfSwgW3BUZW1wXSEKLSAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmMxbG8sIGRYajFsbywgIygxMi0xKQotICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzFoaSwgZFhqMWhpLCAjKDEyLTEpICAgICAgICAgICAgCi0gICAgICAgICAgICBWTU9WTiAgICAgICBkWGkwbG8sIHFTcmMwbG8gICAgICAgICAgICAgICAgIDsvLyBPdXRwdXQgaTAKLSAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTBoaSwgcVNyYzBoaQotICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzdsbywgZFhqN2xvLCAjKDEyLTEpCi0gICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjN2hpLCBkWGo3aGksICMoMTItMSkKLSAgICAgICAgICAgIFNVQiAgICAgICAgIHBUZW1wLCBwVGVtcCwgIygoMTYqMikrKDQqOCoxKSkKLSAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmMxbG8sIHFTY2FsZTFsbywgcVNyYzFsbwotICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzFoaSwgcVNjYWxlMWhpLCBxU3JjMWhpCi0gICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjN2xvLCBxU2NhbGU3bG8sIHFTcmM3bG8KLSAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmM3aGksIHFTY2FsZTdoaSwgcVNyYzdoaQotICAgICAgICAgICAgVkxEMSAgICAgICAge3FTY2FsZTJsbywgcVNjYWxlMmhpfSwgW3BTY2FsZV0hCi0KLSAgICAgICAgICAgIDsvLyBSb3cgMSAmIDcKLSAgICAgICAgICAgIFZIQUREICAgICAgIHFSZXMxN2xvLCBxU3JjMWxvLCBxU3JjN2xvICAgICAgOy8vIChqMStqNykvMgotICAgICAgICAgICAgVkhBREQgICAgICAgcVJlczE3aGksIHFTcmMxaGksIHFTcmM3aGkgICAgICA7Ly8gKGoxK2o3KS8yCi0gICAgICAgICAgICBWTU9WTiAgICAgICBkWGk1bG8sIHFSZXMxN2xvICAgICAgICAgICAgICAgIDsvLyBPdXRwdXQgaTUKLSAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTVoaSwgcVJlczE3aGkgICAgICAgICAgICAgIAotICAgICAgICAgICAgVlNVQiAgICAgICAgcVJlczE3bG8sIHFTcmMxbG8sIHFTcmM3bG8gICAgICA7Ly8gajEtajcKLSAgICAgICAgICAgIFZTVUIgICAgICAgIHFSZXMxN2hpLCBxU3JjMWhpLCBxU3JjN2hpICAgICAgOy8vIGoxLWo3Ci0gICAgICAgICAgICBWTU9WTiAgICAgICBkWGk2bG8sIHFSZXMxN2xvICAgICAgICAgICAgICAgIDsvLyBPdXRwdXQgaTYKLSAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTZoaSwgcVJlczE3aGkgICAgICAKLSAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmMybG8sIGRYajJsbywgIygxMi0xKQotICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzJoaSwgZFhqMmhpLCAjKDEyLTEpCi0gICAgICAgICAgICBWTEQxICAgICAgICB7cVNjYWxlNmxvLCBxU2NhbGU2aGl9LCBbcFRlbXBdIQotICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzZsbywgZFhqNmxvLCAjKDEyLTEpCi0gICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjNmhpLCBkWGo2aGksICMoMTItMSkKLSAgICAgICAgICAgIFNVQiAgICAgICAgIHBUZW1wLCBwVGVtcCwgIygoMTYqMikrKDQqOCoxKSkKLSAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmMybG8sIHFTY2FsZTJsbywgcVNyYzJsbwotICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzJoaSwgcVNjYWxlMmhpLCBxU3JjMmhpCi0gICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjNmxvLCBxU2NhbGU2bG8sIHFTcmM2bG8KLSAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmM2aGksIHFTY2FsZTZoaSwgcVNyYzZoaQotICAgICAgICAgICAgVkxEMSAgICAgICAge3FTY2FsZTNsbywgcVNjYWxlM2hpfSwgW3BTY2FsZV0hCi0KLSAgICAgICAgICAgIDsvLyBSb3cgMiAmIDYKLSAgICAgICAgICAgIFZIQUREICAgICAgIHFSZXMyNmxvLCBxU3JjMmxvLCBxU3JjNmxvICAgICAgOy8vIChqMitqNikvMgotICAgICAgICAgICAgVkhBREQgICAgICAgcVJlczI2aGksIHFTcmMyaGksIHFTcmM2aGkgICAgICA7Ly8gKGoyK2o2KS8yCi0gICAgICAgICAgICBWTU9WTiAgICAgICBkWGkzbG8sIHFSZXMyNmxvICAgICAgICAgICAgICAgIDsvLyBPdXRwdXQgaTMKLSAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTNoaSwgcVJlczI2aGkgICAgICAgICAgICAgIAotICAgICAgICAgICAgVlNVQiAgICAgICAgcVJlczI2bG8sIHFTcmMybG8sIHFTcmM2bG8gICAgICA7Ly8gajItajYKLSAgICAgICAgICAgIFZTVUIgICAgICAgIHFSZXMyNmhpLCBxU3JjMmhpLCBxU3JjNmhpICAgICAgOy8vIGoyLWo2Ci0gICAgICAgICAgICBWTU9WTiAgICAgICBkWGkybG8sIHFSZXMyNmxvICAgICAgICAgICAgICAgIDsvLyBPdXRwdXQgaTIKLSAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTJoaSwgcVJlczI2aGkgICAgICAKLSAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmMzbG8sIGRYajNsbywgIygxMi0xKQotICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzNoaSwgZFhqM2hpLCAjKDEyLTEpCi0gICAgICAgICAgICBWTEQxICAgICAgICB7cVNjYWxlNWxvLCBxU2NhbGU1aGl9LCBbcFRlbXBdIQotICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzVsbywgZFhqNWxvLCAjKDEyLTEpCi0gICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjNWhpLCBkWGo1aGksICMoMTItMSkKLSAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmMzbG8sIHFTY2FsZTNsbywgcVNyYzNsbwotICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzNoaSwgcVNjYWxlM2hpLCBxU3JjM2hpCi0gICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjNWxvLCBxU2NhbGU1bG8sIHFTcmM1bG8KLSAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmM1aGksIHFTY2FsZTVoaSwgcVNyYzVoaQotICAgICAgICAgICAgCi0gICAgICAgICAgICA7Ly8gUm93IDMgJiA1Ci0gICAgICAgICAgICBWSEFERCAgICAgICBxUmVzNTNsbywgcVNyYzVsbywgcVNyYzNsbyAgICAgIDsvLyAoajUrajMpLzIKLSAgICAgICAgICAgIFZIQUREICAgICAgIHFSZXM1M2hpLCBxU3JjNWhpLCBxU3JjM2hpICAgICAgOy8vIChqNStqMykvMgotICAgICAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgIzE2KjIqMgotICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpN2xvLCBxUmVzNTNsbyAgICAgICAgICAgICAgICA7Ly8gT3V0cHV0IGk3Ci0gICAgICAgICAgICBWTU9WTiAgICAgICBkWGk3aGksIHFSZXM1M2hpICAgICAgICAgICAgICAKLSAgICAgICAgICAgIFZTVUIgICAgICAgIHFSZXM1M2xvLCBxU3JjNWxvLCBxU3JjM2xvICAgICAgOy8vIGo1LWozCi0gICAgICAgICAgICBWU1VCICAgICAgICBxUmVzNTNoaSwgcVNyYzVoaSwgcVNyYzNoaSAgICAgIDsvLyBqNS1qMwotICAgICAgICAgICAgVkxEMSAgICAgICAgcVhqNCwgW3BTcmMgQDY0XQotICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpNGxvLCBxUmVzNTNsbyAgICAgICAgICAgICAgICA7Ly8gT3V0cHV0IGk0Ci0gICAgICAgICAgICBWTU9WTiAgICAgICBkWGk0aGksIHFSZXM1M2hpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjNGxvLCBkWGo0bG8sICMoMTItMSkKLSAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmM0aGksIGRYajRoaSwgIygxMi0xKQotICAgICAgICAgICAgVkxEMSAgICAgICAge3FTY2FsZTRsbywgcVNjYWxlNGhpfSwgW3BTY2FsZV0gICAgICAgICAgICAKLSAgICAgICAgICAgIExEUiAgICAgICAgIHBTcmMsID1hcm1DT01NX0lEQ1RDb2VmICAgICA7Ly8gQWRkcmVzcyBvZiBEQ1QgaW52ZXJzZSBBQU4gY29uc3RhbnRzCi0gICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjNGxvLCBxU2NhbGU0bG8sIHFTcmM0bG8KLSAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmM0aGksIHFTY2FsZTRoaSwgcVNyYzRoaQotICAgICAgICAgICAgVkxEUiAgICAgICAgZENvZWZzLCBbcFNyY10gICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBEQ1QgaW52ZXJzZSBBQU4gY29uc3RhbnRzCi0gICAgICAgICAgICA7Ly8gUm93IDQKLSAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTFsbywgcVNyYzRsbyAgICAgICAgICAgICAgICAgOy8vIE91dHB1dCBpMQotICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpMWhpLCBxU3JjNGhpICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIE1FTkQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9NYXNrVGFibGUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9NYXNrVGFibGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZmYzgzNS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fTWFza1RhYmxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtQ09NTV9NYXNrVGFibGUuaAotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICAxMjI5MAotICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogTWFzayBUYWJsZSB0byBtYXNrIHRoZSBlbmQgb2YgYXJyYXkKLSAqLwotIAotCi0KLSNpZm5kZWYgX0FSTUNPTU1fTUFTS1RBQkxFX0hfCi0jZGVmaW5lIF9BUk1DT01NX01BU0tUQUJMRV9IXwotCi0jZGVmaW5lIE1hc2tUYWJsZVNpemUgNzIKLSAgCi0vKiBNYXNrIHRhYmxlICovCi0KLWV4dGVybiBjb25zdCBPTVhfVTE2IGFybUNPTU1fcU1hc2tUYWJsZTE2W01hc2tUYWJsZVNpemVdOwotZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1DT01NX3FNYXNrVGFibGU4W01hc2tUYWJsZVNpemVdOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9WZXJzaW9uLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fVmVyc2lvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWIzZTFlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9WZXJzaW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKiBHdWFyZCB0aGUgaGVhZGVyIGFnYWluc3QgbXVsdGlwbGUgaW5jbHVzaW9uLiAqLwotI2lmbmRlZiBfX0FSTV9DT01NX1ZFUlNJT05fSF9fCi0jZGVmaW5lIF9fQVJNX0NPTU1fVkVSU0lPTl9IX18KLQotCi0vKiBUaGUgZm9sbG93aW5nIGxpbmUgc2hvdWxkIGJlIGluIG9teHR5cGVzLmggYnV0IGhhc24ndCBiZWVuIGFwcHJvdmVkIGJ5IE9wZW5NQVggeWV0ICovCi0jZGVmaW5lIE9NWF9WRVJTSU9OIDEwMgotCi0vKiBXZSBuZWVkIHRvIGRlZmluZSB0aGVzZSBtYWNyb3MgaW4gb3JkZXIgdG8gY29udmVydCBhICNkZWZpbmUgbnVtYmVyIGludG8gYSAjZGVmaW5lIHN0cmluZy4gKi8KLSNkZWZpbmUgQVJNX1FVT1RFKGEpICNhCi0jZGVmaW5lIEFSTV9JTkRJUkVDVChBKSBBUk1fUVVPVEUoQSkKLQotLyogQ29udmVydCB0aGUgT01YX1ZFUlNJT04gbnVtYmVyIGludG8gYSBzdHJpbmcgdGhhdCBjYW4gYmUgdXNlZCwgZm9yIGV4YW1wbGUsIHRvIHByaW50IGl0IG91dC4gKi8KLSNkZWZpbmUgQVJNX1ZFUlNJT05fU1RSSU5HIEFSTV9JTkRJUkVDVChPTVhfVkVSU0lPTikKLQotCi0vKiBEZWZpbmUgdGhpcyBpbiBvcmRlciB0byB0dXJuIG9uIEFSTSB2ZXJzaW9uL3JlbGVhc2UvYnVpbGQgc3RyaW5ncyBpbiBlYWNoIGRvbWFpbiAqLwotI2RlZmluZSBBUk1fSU5DTFVERV9WRVJTSU9OX0RFU0NSSVBUSU9OUwotCi0jaWZkZWYgQVJNX0lOQ0xVREVfVkVSU0lPTl9ERVNDUklQVElPTlMKLSAgZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb25zdCBvbXhBQ19WZXJzaW9uRGVzY3JpcHRpb247Ci0gIGV4dGVybiBjb25zdCBjaGFyICogY29uc3Qgb214SUNfVmVyc2lvbkRlc2NyaXB0aW9uOwotICBleHRlcm4gY29uc3QgY2hhciAqIGNvbnN0IG9teElQX1ZlcnNpb25EZXNjcmlwdGlvbjsKLSAgZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb25zdCBvbXhTUF9WZXJzaW9uRGVzY3JpcHRpb247Ci0gIGV4dGVybiBjb25zdCBjaGFyICogY29uc3Qgb214VkNfVmVyc2lvbkRlc2NyaXB0aW9uOwotI2VuZGlmIC8qIEFSTV9JTkNMVURFX1ZFUlNJT05fREVTQ1JJUFRJT05TICovCi0KLQotLyogVGhlIGZvbGxvd2luZyBlbnRyaWVzIHNob3VsZCBiZSBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgYnkgdGhlIHJlbGVhc2Ugc2NyaXB0ICovCi0vKiBUaGV5IGFyZSB1c2VkIGluIHRoZSBBUk0gdmVyc2lvbiBzdHJpbmdzIGRlZmluZWQgZm9yIGVhY2ggZG9tYWluLiAgICAgICAgICAgICAqLwotCi0vKiBUaGUgcmVsZWFzZSB0YWcgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVsZWFzZSBvZiB0aGUgbGlicmFyeS4gLSB1c2VkIGZvciBzb3VyY2UgYW5kIG9iamVjdCByZWxlYXNlcyAqLwotI2RlZmluZSBPTVhfQVJNX1JFTEVBU0VfVEFHICAicjFwMC0wMGJldDAiCi0KLS8qIFRoZSBBUk0gYXJjaGl0ZWN0dXJlIHVzZWQgdG8gYnVpbGQgYW55IG9iamVjdHMgb3IgZXhlY3V0YWJsZXMgaW4gdGhpcyByZWxlYXNlLiAqLwotI2RlZmluZSBPTVhfQVJNX0JVSUxEX0FSQ0hJVEVDVFVSRSAiQVJNIEFyY2hpdGVjdHVyZSBWNyB3aXRoIE5FT04iCi0KLS8qIFRoZSBBUk0gVG9vbGNoYWluIHVzZWQgdG8gYnVpbGQgYW55IG9iamVjdHMgb3IgZXhlY3V0YWJsZXMgaW4gdGhpcyByZWxlYXNlLiAqLwotI2RlZmluZSBPTVhfQVJNX0JVSUxEX1RPT0xDSEFJTiAgICAiQVJNIFJWQ1QgMy4xIgotCi0KLSNlbmRpZiAvKiBfX0FSTV9DT01NX1ZFUlNJT05fSF9fICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9zLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjFkMmQzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9zLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcxICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBhcm1DT01NX3MuaAotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDEyMjkwCi07Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLTsvLyBBUk0gb3B0aW1pemVkIE9wZW5NQVggY29tbW9uIGhlYWRlciBmaWxlCi07Ly8KLQotOy8vIFByb3RlY3QgYWdhaW5zdCBtdWx0aXBsZSBpbmNsdXNpb24KLSBJRiA6TE5PVDo6REVGOkFSTUNPTU1fU19ICi0gR0JMTCBBUk1DT01NX1NfSAotCi0gICAgICAgIFJFUVVJUkU4ICAgICAgICAgICAgOy8vIFJlcXVpcmVzIDgtYnl0ZSBzdGFjayBhbGlnbm1lbnQKLSAgICAgICAgUFJFU0VSVkU4ICAgICAgICAgICA7Ly8gUHJlc2VydmVzIDgtYnl0ZSBzdGFjayBhbGlnbm1lbnQKLSAgICAgICAgCi0gICAgICAgIEdCTEwgICAgQVJNX0VSUk9SQ0hFQ0sKLUFSTV9FUlJPUkNIRUNLICBTRVRMIHtGQUxTRX0KLQotOy8vIEdsb2JhbHMKLQotICAgICAgICBHQkxTICAgIF9SUmVnTGlzdCAgIDsvLyBSIHNhdmVkIHJlZ2lzdGVyIGxpc3QKLSAgICAgICAgR0JMUyAgICBfRFJlZ0xpc3QgICA7Ly8gRCBzYXZlZCByZWdpc3RlciBsaXN0Ci0gICAgICAgIEdCTFMgICAgX1ZhcmlhbnQgICAgOy8vIFNlbGVjdGVkIHByb2Nlc3NvciB2YXJpYW50Ci0gICAgICAgIEdCTFMgICAgX0NQVSAgICAgICAgOy8vIENQVSBuYW1lCi0gICAgICAgIEdCTFMgICAgX1N0cnVjdCAgICAgOy8vIFN0cnVjdHVyZSBuYW1lCi0gICAgICAgIAotICAgICAgICBHQkxMICAgIF9JbkZ1bmMgICAgIDsvLyBJbnNpZGUgZnVuY3Rpb24gYXNzZW1ibHkgZmxhZwotICAgICAgICBHQkxMICAgIF9Td0xvbmcgICAgIDsvLyBMb25nIHN3aXRjaCBmbGFnCi0gICAgICAgIAotICAgICAgICBHQkxBICAgIF9SQnl0ZXMgICAgIDsvLyBOdW1iZXIgb2YgcmVnaXN0ZXIgYnl0ZXMgb24gc3RhY2sKLSAgICAgICAgR0JMQSAgICBfU0J5dGVzICAgICA7Ly8gTnVtYmVyIG9mIHNjcmF0Y2ggYnl0ZXMgb24gc3RhY2sgCi0gICAgICAgIEdCTEEgICAgX0FCeXRlcyAgICAgOy8vIFN0YWNrIG9mZnNldCBvZiBuZXh0IGFyZ3VtZW50Ci0gICAgICAgIEdCTEEgICAgX1dvcmtzcGFjZSAgOy8vIFN0YWNrIG9mZnNldCBvZiBzY3JhdGNoIHdvcmtzcGFjZQotICAgICAgICBHQkxBICAgIF9GICAgICAgICAgIDsvLyBGdW5jdGlvbiBudW1iZXIKLSAgICAgICAgR0JMQSAgICBfU3RPZmYgICAgICA7Ly8gU3RydWN0IG9mZnNldAotICAgICAgICBHQkxBICAgIF9Td051bSAgICAgIDsvLyBTd2l0Y2ggbnVtYmVyCi0gICAgICAgIEdCTFMgICAgXzMyICAgICAgICAgOy8vIFN1ZmZpeCBmb3IgMzIgYnl0ZSBhbGlnbm1uZXQKLSAgICAgICAgR0JMUyAgICBfMTYgICAgICAgICA7Ly8gU3VmZml4IGZvciAxNiBieXRlIGFsaWdubW5ldAotICAgICAgICAKLV9JbkZ1bmMgICAgICAgICBTRVRMICAgIHtGQUxTRX0KLV9TQnl0ZXMgICAgICAgICBTRVRBICAgIDAKLV9GICAgICAgICAgICAgICBTRVRBICAgIDAKLV9Td051bSAgICAgICAgICBTRVRBICAgIDAKLV8zMiAgICAgICAgICAgICBTRVRTICAgICJBTElHTjMyIgotXzE2ICAgICAgICAgICAgIFNFVFMgICAgIkFMSUdOMTYiCi0KLTsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLTsvLyBPdmVycmlkZSB0aGUgdG9vbHMgc2V0dGluZ3Mgb2YgdGhlIENQVSBpZiB0aGUgI2RlZmluZQotOy8vIFVTRUNQVSBpcyBzZXQsIG90aGVyd2lzZSB1c2UgdGhlIENQVSBkZWZpbmVkIGJ5IHRoZQotOy8vIGFzc2VtYmxlciBzZXR0aW5ncy4KLTsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgICAgIElGIDpERUY6IE9WRVJSSURFQ1BVCi1fQ1BVICAgICAgIFNFVFMgIE9WRVJSSURFQ1BVCi0gICAgICAgRUxTRQotX0NQVSAgICAgICBTRVRTICAgIHtDUFV9ICAgICAgIAotICAgICAgIEVORElGCi0KLQotCi07Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi07Ly8gV29yayBvdXQgd2hpY2ggY29kZSB0byBidWlsZAotOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgICAgIElGIDpERUY6QVJNMTEzNkpTOkxPUjo6REVGOkNvcnRleEE4OkxPUjo6REVGOkFSTV9HRU5FUklDCi0gICAgICAgICAgICBJTkZPIDEsIlBsZWFzZSBzd2l0Y2ggdG8gdXNpbmcgTV9WQVJJQU5UUyIKLSAgICAgICAgRU5ESUYKLQotICAgICAgICA7Ly8gRGVmaW5lIGFuZCByZXNldCBhbGwgb2ZmaWNpYWxseSByZWNvbmduaXNlZCB2YXJpYW50cwotICAgICAgICBNQUNSTwotICAgICAgICBfTV9ERUZfVkFSSUFOVFMKLSAgICAgICAgX01fREVGX1ZBUklBTlQgQVJNOTI2RUpTCi0gICAgICAgIF9NX0RFRl9WQVJJQU5UIEFSTTExMzZKUwotICAgICAgICBfTV9ERUZfVkFSSUFOVCBBUk0xMTM2SlNfVQotICAgICAgICBfTV9ERUZfVkFSSUFOVCBDb3J0ZXhBOAotICAgICAgICBfTV9ERUZfVkFSSUFOVCBBUk03VERNSQotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBfTV9ERUZfVkFSSUFOVCAkdmFyCi0gICAgICAgIEdCTEwgJHZhcgotICAgICAgICBHQkxMIF9vayR2YXIKLSR2YXIgICAgU0VUTCB7RkFMU0V9Ci0gICAgICAgIE1FTkQgICAgICAgIAotICAgICAgICAKLQotICAgICAgICA7Ly8gVmFyaWFudCBkZWNsYXJhdGlvbgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIERlZmluZSBhIGxpc3Qgb2YgY29kZSB2YXJpYW50cyBzdXBwb3J0ZWQgYnkgdGhpcwotICAgICAgICA7Ly8gc291cmNlIGZpbGUuIFRoaXMgbWFjcm8gdGhlbiBjaG9vc2VzIHRoZSBtb3N0Ci0gICAgICAgIDsvLyBhcHByb3ByaWF0ZSB2YXJpYW50IHRvIGJ1aWxkIGZvciB0aGUgY3VycmVudGx5IGNvbmZpZ3VyZWQKLSAgICAgICAgOy8vIGNvcmUuCi0gICAgICAgIDsvLyAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fVkFSSUFOVFMgJHYwLCR2MSwkdjIsJHYzLCR2NCwkdjUsJHY2LCR2NyAgICAgICAgCi0gICAgICAgIDsvLyBTZXQgdG8gVFJVRSB2YXJpYW50cyB0aGF0IGFyZSBzdXBwb3J0ZWQKLSAgICAgICAgX01fREVGX1ZBUklBTlRTCi0gICAgICAgIF9NX1ZBUklBTlQgJHYwCi0gICAgICAgIF9NX1ZBUklBTlQgJHYxCi0gICAgICAgIF9NX1ZBUklBTlQgJHYyCi0gICAgICAgIF9NX1ZBUklBTlQgJHYzCi0gICAgICAgIF9NX1ZBUklBTlQgJHY0Ci0gICAgICAgIF9NX1ZBUklBTlQgJHY1Ci0gICAgICAgIF9NX1ZBUklBTlQgJHY2Ci0gICAgICAgIF9NX1ZBUklBTlQgJHY3Ci0gICAgICAgIAotICAgICAgICA7Ly8gTG9vayBmb3IgZmlyc3QgYXZhaWxhYmxlIHZhcmlhbnQgdG8gbWF0Y2ggYSBDUFUKLSAgICAgICAgOy8vIF9NX1RSWSBjcHUsIHZhcmlhbnQgZmFsbCBiYWNrIGxpc3QKLV9WYXJpYW50IFNFVFMgIiIgICAgICAgICAgICAgICAgCi0gICAgICAgIF9NX1RSWSBBUk05MjZFSi1TLCAgIEFSTTkyNkVKUwotICAgICAgICBfTV9UUlkgQVJNMTE3NkpaLVMsICBBUk0xMTM2SlMKLSAgICAgICAgX01fVFJZIEFSTTExNzZKWkYtUywgQVJNMTEzNkpTCi0gICAgICAgIF9NX1RSWSBBUk0xMTU2VDItUywgIEFSTTExMzZKUwotICAgICAgICBfTV9UUlkgQVJNMTE1NlQyRi1TLCBBUk0xMTM2SlMKLSAgICAgICAgX01fVFJZIEFSTTExMzZKLVMsICAgQVJNMTEzNkpTCi0gICAgICAgIF9NX1RSWSBBUk0xMTM2SkYtUywgIEFSTTExMzZKUwotICAgICAgICBfTV9UUlkgTVBDb3JlLCAgICAgICBBUk0xMTM2SlMKLSAgICAgICAgX01fVFJZIGZhbGNvbi12ZnAsIEFSTTExMzZKUwotICAgICAgICBfTV9UUlkgZmFsY29uLWZ1bGwtbmVvbiwgQ29ydGV4QTgKLSAgICAgICAgX01fVFJZIENvcnRleC1BOE5vTmVvbiwgQVJNMTEzNkpTCi0gICAgICAgIF9NX1RSWSBDb3J0ZXgtQTgsICAgIENvcnRleEE4LCBBUk0xMTM2SlMKLSAgICAgICAgX01fVFJZIENvcnRleC1SNCwgICAgQVJNMTEzNkpTCi0gICAgICAgIF9NX1RSWSBBUk03VERNSQotICAgICAgICAKLSAgICAgICAgOy8vIFNlbGVjdCB0aGUgY29ycmVjdCB2YXJpYW50Ci0gICAgICAgIF9NX0RFRl9WQVJJQU5UUwotICAgICAgICBJRiBfVmFyaWFudD0iIgotICAgICAgICAgICAgSU5GTyAxLCAiTm8gbWF0Y2ggZm91bmQgZm9yIENQVSAnJF9DUFUnIgotICAgICAgICBFTFNFCi0kX1ZhcmlhbnQgICBTRVRMIHtUUlVFfQotICAgICAgICBFTkRJRgotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8gUmVnaXN0ZXIgYSB2YXJpYW50IGFzIGF2YWlsYWJsZQotICAgICAgICBNQUNSTwotICAgICAgICBfTV9WQVJJQU5UICR2YXIKLSAgICAgICAgSUYgIiR2YXIiPSIiCi0gICAgICAgICAgICBNRVhJVAotICAgICAgICBFTkRJRgotICAgICAgICBJRiA6TE5PVDo6REVGOl9vayR2YXIKLSAgICAgICAgICAgIElORk8gMSwgIlVucmVjb2duaXplZCB2YXJpYW50ICckdmFyJyIKLSAgICAgICAgRU5ESUYKLSR2YXIgICAgU0VUTCB7VFJVRX0KLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vIEZvciBhIGdpdmVuIENQVSwgc2VlIGlmIGFueSBvZiB0aGUgdmFyaWFudHMgc3VwcG9ydGluZwotICAgICAgICA7Ly8gdGhpcyBDUFUgYXJlIGF2YWlsYWJsZS4gVGhlIGZpcnN0IGF2YWlsYWJsZSB2YXJpYW50IGlzCi0gICAgICAgIDsvLyBjaG9zZW4KLSAgICAgICAgTUFDUk8KLSAgICAgICAgX01fVFJZICRjcHUsICR2MCwkdjEsJHYyLCR2MywkdjQsJHY1LCR2NiwkdjcKLSAgICAgICAgSUYgIiRjcHUiPD5fQ1BVCi0gICAgICAgICAgICBNRVhJVAotICAgICAgICBFTkRJRgotICAgICAgICBfTV9UUlkxICR2MAotICAgICAgICBfTV9UUlkxICR2MQotICAgICAgICBfTV9UUlkxICR2MgotICAgICAgICBfTV9UUlkxICR2MwotICAgICAgICBfTV9UUlkxICR2NAotICAgICAgICBfTV9UUlkxICR2NQotICAgICAgICBfTV9UUlkxICR2NgotICAgICAgICBfTV9UUlkxICR2NwotICAgICAgICA7Ly8gQ2hlY2sgYSBtYXRjaCB3YXMgZm91bmQKLSAgICAgICAgSUYgX1ZhcmlhbnQ9IiIKLSAgICAgICAgICAgIElORk8gMSwgIk5vIHZhcmlhbnQgbWF0Y2ggZm91bmQgZm9yIENQVSAnJF9DUFUnIgotICAgICAgICBFTkRJRgotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBfTV9UUlkxICR2YXIKLSAgICAgICAgSUYgIiR2YXIiPSIiCi0gICAgICAgICAgICBNRVhJVAotICAgICAgICBFTkRJRgotICAgICAgICBJRiAoX1ZhcmlhbnQ9IiIpOkxBTkQ6JHZhcgotX1ZhcmlhbnQgU0VUUyAiJHZhciIKLSAgICAgICAgRU5ESUYKLSAgICAgICAgTUVORAotICAgICAgICAKLTsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotOy8vIFN0cnVjdHVyZSBkZWZpbml0aW9uCi07Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgICAgICA7Ly8gRGVjbGFyZSBhIHN0cnVjdHVyZSBvZiBnaXZlbiBuYW1lCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fU1RSVUNUICRzbmFtZQotX1N0cnVjdCBTRVRTICIkc25hbWUiCi1fU3RPZmYgIFNFVEEgMAotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8gRGVjbGFyZSBhIHN0cnVjdHVyZSBmaWVsZAotICAgICAgICA7Ly8gVGhlIGZpZWxkIGlzIGNhbGxlZCAkc25hbWVfJGZuYW1lCi0gICAgICAgIDsvLyAkc2l6ZSAgID0gdGhlIHNpemUgb2YgZWFjaCBlbnRyeSwgbXVzdCBiZSBwb3dlciBvZiAyIAotICAgICAgICA7Ly8gJG51bWJlciA9IChpZiBwcm92aWRlZCkgdGhlIG51bWJlciBvZiBlbnRyaWVzIGZvciBhbiBhcnJheQotICAgICAgICBNQUNSTwotICAgICAgICBNX0ZJRUxEICRmbmFtZSwgJHNpemUsICRudW1iZXIKLSAgICAgICAgSUYgKF9TdE9mZjpBTkQ6KCRzaXplLTEpKSE9MAotX1N0T2ZmICAgICAgU0VUQSBfU3RPZmYgKyAoJHNpemUgLSAoX1N0T2ZmOkFORDooJHNpemUtMSkpKQotICAgICAgICBFTkRJRgotJF9TdHJ1Y3QuXyRmbmFtZSBFUVUgX1N0T2ZmCi0gICAgICAgIElGICIkbnVtYmVyIjw+IiIKLV9TdE9mZiAgICAgIFNFVEEgX1N0T2ZmICsgJHNpemUqJG51bWJlcgotICAgICAgICBFTFNFCi1fU3RPZmYgICAgICBTRVRBIF9TdE9mZiArICRzaXplCi0gICAgICAgIEVORElGCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBNX0VORFNUUlVDVAotc2l6ZW9mXyRfU3RydWN0IEVRVSBfU3RPZmYKLV9TdHJ1Y3QgU0VUUyAiIgotICAgICAgICBNRU5ECi0KLTsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi07Ly8gU3dpdGNoIGFuZCB0YWJsZSBtYWNyb3MKLTsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICAgICAgOy8vIFN0YXJ0IGEgcmVsYXRpdmUgc3dpdGNoIHRhYmxlIHdpdGggcmVnaXN0ZXIgdG8gc3dpdGNoIG9uCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJHYgPSB0aGUgcmVnaXN0ZXIgdG8gc3dpdGNoIG9uCi0gICAgICAgIDsvLyAkcyA9IGlmIHNwZWNpZmllZCBtdXN0IGJlICJMIiB0byBpbmRpY2F0ZSBsb25nCi0gICAgICAgIDsvLyAgICAgIHRoaXMgYWxsb3dzIGEgZ3JlYXRlciByYW5nZSB0byB0aGUgY2FzZSBjb2RlCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fU1dJVENIICR2LCAkcwotICAgICAgICBBU1NFUlQgIiRzIj0iIjpMT1I6IiRzIj0iTCIKLV9Td0xvbmcgU0VUTCB7RkFMU0V9Ci0gICAgICAgIElGICIkcyI9IkwiCi1fU3dMb25nICAgICBTRVRMIHtUUlVFfQotICAgICAgICBFTkRJRgotX1N3TnVtICBTRVRBIF9Td051bSsxICAgICAgICAKLSAgICAgICAgSUYge0NPTkZJR309MTYKLSAgICAgICAgICAgIDsvLyBUaHVtYgotICAgICAgICAgICAgSUYgX1N3TG9uZwotICAgICAgICAgICAgICAgIFRCSCBbcGMsICR2LCBMU0wjMV0KLSAgICAgICAgICAgIEVMU0UKLSAgICAgICAgICAgICAgICBUQkIgW3BjLCAkdl0KLSAgICAgICAgICAgIEVORElGCi1fU3dpdGNoJF9Td051bQotICAgICAgICBFTFNFCi0gICAgICAgICAgICA7Ly8gQVJNCi0gICAgICAgICAgICBBREQgcGMsIHBjLCAkdiwgTFNMICMyCi0gICAgICAgICAgICBOT1AKLSAgICAgICAgRU5ESUYKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vIEFkZCBhIGNhc2UgdG8gdGhlIHN3aXRjaCBzdGF0ZW1lbnQKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9DQVNFICAkbGFiZWwKLSAgICAgICAgSUYge0NPTkZJR309MTYKLSAgICAgICAgICAgIDsvLyBUaHVtYgotICAgICAgICAgICAgSUYgX1N3TG9uZwotICAgICAgICAgICAgICAgIERDVyAoJGxhYmVsIC0gX1N3aXRjaCRfU3dOdW0pLzIKLSAgICAgICAgICAgIEVMU0UKLSAgICAgICAgICAgICAgICBEQ0IgKCRsYWJlbCAtIF9Td2l0Y2gkX1N3TnVtKS8yCi0gICAgICAgICAgICBFTkRJRgotICAgICAgICBFTFNFCi0gICAgICAgICAgICA7Ly8gQVJNCi0gICAgICAgICAgICBCICAgJGxhYmVsCi0gICAgICAgIEVORElGCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLyBFbmQgb2Ygc3dpdGNoIHN0YXRlbWVudAotICAgICAgICBNQUNSTwotICAgICAgICBNX0VORFNXSVRDSAotICAgICAgICBBTElHTiAyCi0gICAgICAgIE1FTkQgICAgICAgCi0KLQotOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi07Ly8gRGF0YSBhcmVhIGFsbG9jYXRpb24KLTsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgICAgIDsvLyBDb25zdGFudCB0YWJsZSBhbGxvY2F0b3IgbWFjcm8KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBDcmVhdGVzIGEgbmV3IHNlY3Rpb24gZm9yIGVhY2ggY29uc3RhbnQgdGFibGUKLSAgICAgICAgOy8vICRuYW1lIGlzIHN5bWJvbCB0aHJvdWdoIHdoaWNoIHRoZSB0YWJsZSBjYW4gYmUgYWNjZXNzZWQuCi0gICAgICAgIDsvLyAkYWxpZ24gaXMgdGhlIG9wdGlvbmFsIGFsaWdubWVudCBvZiB0aGUgdGFibGUsIGxvZzIgb2YgCi0gICAgICAgIDsvLyAgdGhlIGJ5dGUgYWxpZ25tZW50IC0gJGFsaWduPTQgaXMgMTYgYnl0ZSBhbGlnbmVkCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fVEFCTEUgICRuYW1lLCAkYWxpZ24KLSAgICAgICAgQVNTRVJUIDpMTk9UOl9JbkZ1bmMKLSAgICAgICAgSUYgIiRhbGlnbiI9IiIKLSAgICAgICAgICAgIEFSRUEgfC5jb25zdGRhdGF8LCBSRUFET05MWSwgREFUQQotICAgICAgICBFTFNFCi0gICAgICAgICAgICA7Ly8gQVJFQXMgaW5oZXJpdCB0aGUgYWxpZ25tZW50IG9mIHRoZSBmaXJzdCBkZWNsYXJhdGlvbi4KLSAgICAgICAgICAgIDsvLyBUaGVyZWZvcmUgZm9yIGVhY2ggYWxpZ25tZW50IHNpemUgd2UgbXVzdCBoYXZlIGFuIGFyZWEKLSAgICAgICAgICAgIDsvLyBvZiBhIGRpZmZlcmVudCBuYW1lLgotICAgICAgICAgICAgQVJFQSBjb25zdGRhdGFfYSRhbGlnbiwgUkVBRE9OTFksIERBVEEsIEFMSUdOPSRhbGlnbgotICAgICAgICAgICAgCi0gICAgICAgICAgICA7Ly8gV2UgYWxzbyBmb3JjZSBhbGlnbm1lbnQgaW5jYXNlIHdlIGFyZSB0YWdnaW5nIG9udG8KLSAgICAgICAgICAgIDsvLyBhbiBhbHJlYWR5IHN0YXJ0ZWQgYXJlYS4KLSAgICAgICAgICAgIEFMSUdOICgxPDwkYWxpZ24pCi0gICAgICAgIEVORElGCi0kbmFtZQotICAgICAgICBNRU5ECi0gICAgICAgIAotOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi07Ly8gTWFjcm9zIHRvIGFsbG9jYXRlIHNwYWNlIG9uIHRoZSBzdGFjawotOy8vCi07Ly8gVGhlc2UgYWxsIGFzc3VtZSB0aGF0IHRoZSBzdGFjayBpcyA4LWJ5dGUgYWxpZ25lZAotOy8vIGF0IGVudHJ5IHRvIHRoZSBmdW5jdGlvbiwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgCi07Ly8gMzItYnl0ZSBhbGlnbm1lbnQgbWFjcm8gbmVlZHMgdG8gd29yayBpbiBhCi07Ly8gYml0IG1vcmUgb2YgYSBzcGVjaWFsIHdheS4uLgotOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICAgICAgCi0KLQotICAgICAgICA7Ly8gQWxsb2NhdGUgMS1ieXRlIGFsaWduZWQgYXJlYSBvZiBuYW1lCi0gICAgICAgIDsvLyAkbmFtZSBzaXplICRzaXplIGJ5dGVzLgotICAgICAgICBNQUNSTwotICAgICAgICBNX0FMTE9DMSAgJG5hbWUsICRzaXplCi0gICAgICAgIEFTU0VSVCA6TE5PVDpfSW5GdW5jCi0kbmFtZSRfRiAgIEVRVSBfU0J5dGVzCi1fU0J5dGVzIFNFVEEgX1NCeXRlcyArICgkc2l6ZSkKLSAgICAgICAgTUVORAotICAgICAgICAgICAgCi0gICAgICAgIDsvLyBBbGxvY2F0ZSAyLWJ5dGUgYWxpZ25lZCBhcmVhIG9mIG5hbWUKLSAgICAgICAgOy8vICRuYW1lIHNpemUgJHNpemUgYnl0ZXMuCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQUxMT0MyICAkbmFtZSwgJHNpemUKLSAgICAgICAgQVNTRVJUIDpMTk9UOl9JbkZ1bmMKLSAgICAgICAgSUYgKF9TQnl0ZXM6QU5EOjEpIT0wCi1fU0J5dGVzICAgICBTRVRBIF9TQnl0ZXMgKyAoMiAtIChfU0J5dGVzOkFORDoxKSkKLSAgICAgICAgRU5ESUYKLSRuYW1lJF9GICAgRVFVIF9TQnl0ZXMKLV9TQnl0ZXMgU0VUQSBfU0J5dGVzICsgKCRzaXplKQotICAgICAgICBNRU5ECi0gICAgICAgICAgICAKLSAgICAgICAgOy8vIEFsbG9jYXRlIDQtYnl0ZSBhbGlnbmVkIGFyZWEgb2YgbmFtZQotICAgICAgICA7Ly8gJG5hbWUgc2l6ZSAkc2l6ZSBieXRlcy4KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9BTExPQzQgICRuYW1lLCAkc2l6ZQotICAgICAgICBBU1NFUlQgOkxOT1Q6X0luRnVuYwotICAgICAgICBJRiAoX1NCeXRlczpBTkQ6MykhPTAKLV9TQnl0ZXMgICAgIFNFVEEgX1NCeXRlcyArICg0IC0gKF9TQnl0ZXM6QU5EOjMpKQotICAgICAgICBFTkRJRgotJG5hbWUkX0YgICBFUVUgX1NCeXRlcwotX1NCeXRlcyBTRVRBIF9TQnl0ZXMgKyAoJHNpemUpCi0gICAgICAgIE1FTkQKLSAgICAgICAgICAgIAotICAgICAgICA7Ly8gQWxsb2NhdGUgOC1ieXRlIGFsaWduZWQgYXJlYSBvZiBuYW1lCi0gICAgICAgIDsvLyAkbmFtZSBzaXplICRzaXplIGJ5dGVzLgotICAgICAgICBNQUNSTwotICAgICAgICBNX0FMTE9DOCAgJG5hbWUsICRzaXplCi0gICAgICAgIEFTU0VSVCA6TE5PVDpfSW5GdW5jCi0gICAgICAgIElGIChfU0J5dGVzOkFORDo3KSE9MAotX1NCeXRlcyAgICAgU0VUQSBfU0J5dGVzICsgKDggLSAoX1NCeXRlczpBTkQ6NykpCi0gICAgICAgIEVORElGCi0kbmFtZSRfRiAgIEVRVSBfU0J5dGVzCi1fU0J5dGVzIFNFVEEgX1NCeXRlcyArICgkc2l6ZSkKLSAgICAgICAgTUVORCAgICAgICAgCi0KLSAgICAgICAgCi0gICAgICAgIDsvLyBBbGxvY2F0ZSA4LWJ5dGUgYWxpZ25lZCBhcmVhIG9mIG5hbWUKLSAgICAgICAgOy8vICRuYW1lIHNpemUgKCRzaXplKzE2KSBieXRlcy4KLSAgICAgICAgOy8vIFRoZSBleHRyYSAxNiBieXRlcyBhcmUgbGF0ZXIgdXNlZCB0byBhbGlnbiB0aGUgcG9pbnRlciB0byAxNiBieXRlcwotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9BTExPQzE2ICAkbmFtZSwgJHNpemUKLSAgICAgICAgQVNTRVJUIDpMTk9UOl9JbkZ1bmMKLSAgICAgICAgSUYgKF9TQnl0ZXM6QU5EOjcpIT0wCi1fU0J5dGVzICAgICBTRVRBIF9TQnl0ZXMgKyAoOCAtIChfU0J5dGVzOkFORDo3KSkKLSAgICAgICAgRU5ESUYKLSRuYW1lJF9GJF8xNiAgIEVRVSAoX1NCeXRlcyArIDgpCi1fU0J5dGVzIFNFVEEgX1NCeXRlcyArICgkc2l6ZSkgKyA4Ci0gICAgICAgIE1FTkQgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIEFsbG9jYXRlIDgtYnl0ZSBhbGlnbmVkIGFyZWEgb2YgbmFtZQotICAgICAgICA7Ly8gJG5hbWUgc2l6ZSAoJHNpemUrMzIpIGJ5dGVzLgotICAgICAgICA7Ly8gVGhlIGV4dHJhIDMyIGJ5dGVzIGFyZSBsYXRlciB1c2VkIHRvIGFsaWduIHRoZSBwb2ludGVyIHRvIDMyIGJ5dGVzCi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBNX0FMTE9DMzIgICRuYW1lLCAkc2l6ZQotICAgICAgICBBU1NFUlQgOkxOT1Q6X0luRnVuYwotICAgICAgICBJRiAoX1NCeXRlczpBTkQ6NykhPTAKLV9TQnl0ZXMgICAgIFNFVEEgX1NCeXRlcyArICg4IC0gKF9TQnl0ZXM6QU5EOjcpKQotICAgICAgICBFTkRJRgotJG5hbWUkX0YkXzMyICAgRVFVIChfU0J5dGVzICsgMjQpCi1fU0J5dGVzIFNFVEEgX1NCeXRlcyArICgkc2l6ZSkgKyAyNAotICAgICAgICBNRU5EICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBBcmd1bWVudCBEZWNsYXJhdGlvbiBNYWNybwotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIEFsbG9jYXRlIGFuIGFyZ3VtZW50IG5hbWUgJG5hbWUKLSAgICAgICAgOy8vIHNpemUgJHNpemUgYnl0ZXMKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9BUkcgICAgICRuYW1lLCAkc2l6ZQotICAgICAgICBBU1NFUlQgX0luRnVuYwotJG5hbWUkX0YgICAgRVFVIF9BQnl0ZXMKLV9BQnl0ZXMgU0VUQSBfQUJ5dGVzICsgKCRzaXplKQotICAgICAgICBNRU5EICAgICAgICAKLSAgICAgICAgCi07Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLTsvLyBNYWNyb3MgdG8gYWNjZXNzIHN0YWNrZWQgdmFyaWFibGVzCi07Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgICAgICA7Ly8gTWFjcm8gdG8gcGVyZm9ybSBhIGRhdGEgcHJvY2Vzc2luZyBvcGVyYXRpb24KLSAgICAgICAgOy8vIHdpdGggYSBjb25zdGFudCBzZWNvbmQgb3BlcmFuZAotICAgICAgICBNQUNSTwotICAgICAgICBfTV9PUEMgJG9wLCRyZCwkcm4sJGNvbnN0Ci0gICAgICAgIExDTEEgICAgX3NoCi0gICAgICAgIExDTEEgICAgX2NzdAotX3NoICAgICBTRVRBICAgIDAKLV9jc3QgICAgU0VUQSAgICAkY29uc3QKLSAgICAgICAgSUYgX2NzdD0wCi0gICAgICAgICRvcCAkcmQsICRybiwgI19jc3QKLSAgICAgICAgICAgIE1FWElUCi0gICAgICAgIEVORElGCi0gICAgICAgIFdISUxFIChfY3N0OkFORDozKT0wCi1fY3N0ICAgICAgICBTRVRBIF9jc3Q+PjIKLV9zaCAgICAgICAgIFNFVEEgX3NoKzIKLSAgICAgICAgV0VORAotICAgICAgICAkb3AgJHJkLCAkcm4sICMoX2NzdDpBTkQ6MHgwMDAwMDBGRik8PF9zaAotICAgICAgICBJRiBfY3N0Pj0yNTYKLSAgICAgICAgICAgICRvcCAkcmQsICRyZCwgIyhfY3N0OkFORDoweEZGRkZGRjAwKTw8X3NoCi0gICAgICAgIEVORElGCi0gICAgICAgIE1FTkQKLQotICAgICAgICA7Ly8gTWFjcm8gdG8gcGVyZm9ybSBhIGRhdGEgYWNjZXNzIG9wZXJhdGlvbgotICAgICAgICA7Ly8gU3VjaCBhcyBMRFIgb3IgU1RSCi0gICAgICAgIDsvLyBUaGUgYWRkcmVzc2luZyBtb2RlIGlzIG1vZGlmaWVkIHN1Y2ggdGhhdAotICAgICAgICA7Ly8gMS4gSWYgbm8gYWRkcmVzcyBpcyBnaXZlbiB0aGVuIHRoZSBuYW1lIGlzIHRha2VuCi0gICAgICAgIDsvLyAgICBhcyBhIHN0YWNrIG9mZnNldAotICAgICAgICA7Ly8gMi4gSWYgdGhlIGFkZHJlc3NpbmcgbW9kZSBpcyBub3QgYXZhaWxhYmxlIGZvciB0aGUKLSAgICAgICAgOy8vICAgIHN0YXRlIGJlaW5nIGFzc2VtYmxlZCBmb3IgKGVnIFRodW1iKSB0aGVuIGEgc3VpdGFibGUKLSAgICAgICAgOy8vICAgIGFkZHJlc3NpbmcgbW9kZSBpcyBzdWJzdGl0dXRlZC4KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBPbiBFbnRyeToKLSAgICAgICAgOy8vICRpID0gSW5zdHJ1Y3Rpb24gdG8gcGVyZm9ybSAoZWcgIkxEUkIiKQotICAgICAgICA7Ly8gJGEgPSBSZXF1aXJlZCBieXRlIGFsaWdubWVudAotICAgICAgICA7Ly8gJHIgPSBSZWdpc3RlcihzKSB0byB0cmFuc2ZlciAoZWcgInIxIikKLSAgICAgICAgOy8vICRhMCwkYTEsJGEyLiBBZGRyZXNzaW5nIG1vZGUgYW5kIGNvbmRpdGlvbi4gT25lIG9mOgotICAgICAgICA7Ly8gICAgIGxhYmVsIHssY2N9Ci0gICAgICAgIDsvLyAgICAgW2Jhc2VdICAgICAgICAgICAgICAgICAgICB7LCwsY2N9Ci0gICAgICAgIDsvLyAgICAgW2Jhc2UsIG9mZnNldF17IX0gICAgICAgICB7LCxjY30KLSAgICAgICAgOy8vICAgICBbYmFzZSwgb2Zmc2V0LCBzaGlmdF17IX0gIHssY2N9Ci0gICAgICAgIDsvLyAgICAgW2Jhc2VdLCBvZmZzZXQgICAgICAgICAgICB7LCxjY30KLSAgICAgICAgOy8vICAgICBbYmFzZV0sIG9mZnNldCwgc2hpZnQgICAgIHssY2N9Ci0gICAgICAgIE1BQ1JPCi0gICAgICAgIF9NX0RBVEEgJGksJGEsJHIsJGEwLCRhMSwkYTIsJGEzCi0gICAgICAgIElGICIkYTAiOkxFRlQ6MT0iWyIKLSAgICAgICAgICAgIElGICIkYTEiPSIiCi0gICAgICAgICAgICAgICAgJGkkYTMgICAkciwgJGEwCi0gICAgICAgICAgICBFTFNFCi0gICAgICAgICAgICAgICAgSUYgIiRhMCI6UklHSFQ6MT0iXSIKLSAgICAgICAgICAgICAgICAgICAgSUYgIiRhMiI9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgIF9NX1BPU1RJTkQgJGkkYTMsICIkciIsICRhMCwgJGExCi0gICAgICAgICAgICAgICAgICAgIEVMU0UKLSAgICAgICAgICAgICAgICAgICAgICAgIF9NX1BPU1RJTkQgJGkkYTMsICIkciIsICRhMCwgIiRhMSwkYTIiCi0gICAgICAgICAgICAgICAgICAgIEVORElGCi0gICAgICAgICAgICAgICAgRUxTRQotICAgICAgICAgICAgICAgICAgICBJRiAiJGEyIj0iIgotICAgICAgICAgICAgICAgICAgICAgICAgX01fUFJFSU5EICAkaSRhMywgIiRyIiwgJGEwLCAkYTEKLSAgICAgICAgICAgICAgICAgICAgRUxTRQotICAgICAgICAgICAgICAgICAgICAgICAgX01fUFJFSU5EICAkaSRhMywgIiRyIiwgJGEwLCAiJGExLCRhMiIKLSAgICAgICAgICAgICAgICAgICAgRU5ESUYKLSAgICAgICAgICAgICAgICBFTkRJRgotICAgICAgICAgICAgRU5ESUYKLSAgICAgICAgRUxTRQotICAgICAgICAgICAgTENMQSAgICBfT2Zmc2V0Ci1fT2Zmc2V0ICAgICBTRVRBICAgIF9Xb3Jrc3BhY2UgKyAkYTAkX0YKLSAgICAgICAgICAgIEFTU0VSVCAgKF9PZmZzZXQ6QU5EOigkYS0xKSk9MAotICAgICAgICAgICAgJGkkYTEgICAkciwgW3NwLCAjX09mZnNldF0KLSAgICAgICAgRU5ESUYKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vIEhhbmRsZSBwb3N0IGluZGV4ZWQgbG9hZC9zdG9yZXMKLSAgICAgICAgOy8vIG9wICByZWcsIFtiYXNlXSwgb2Zmc2V0Ci0gICAgICAgIE1BQ1JPCi0gICAgICAgIF9NX1BPU1RJTkQgJGksJHIsJGEwLCRhMQotICAgICAgICBMQ0xTIF9iYXNlCi0gICAgICAgIExDTFMgX29mZnNldAotICAgICAgICBJRiB7Q09ORklHfT0xNiA7Ly8gVGh1bWIKLV9iYXNlICAgICAgIFNFVFMgKCIkYTAiOkxFRlQ6KDpMRU46IiRhMCItMSkpOlJJR0hUOig6TEVOOiIkYTAiLTIpICAgOy8vIHJlbW92ZSBbXQotX29mZnNldCAgICAgU0VUUyAiJGExIgotICAgICAgICAgICAgSUYgX29mZnNldDpMRUZUOjE9IisiCi1fb2Zmc2V0ICAgICAgICAgU0VUUyBfb2Zmc2V0OlJJR0hUOig6TEVOOl9vZmZzZXQtMSkKLSAgICAgICAgICAgIEVORElGCi0gICAgICAgICAgICAkaSAgJHIsICRhMAotICAgICAgICAgICAgSUYgX29mZnNldDpMRUZUOjE9Ii0iCi1fb2Zmc2V0ICAgICAgICAgU0VUUyBfb2Zmc2V0OlJJR0hUOig6TEVOOl9vZmZzZXQtMSkKLSAgICAgICAgICAgICAgICBTVUIgJF9iYXNlLCAkX2Jhc2UsICRfb2Zmc2V0Ci0gICAgICAgICAgICBFTFNFICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIEFERCAkX2Jhc2UsICRfYmFzZSwgJF9vZmZzZXQKLSAgICAgICAgICAgIEVORElGCi0gICAgICAgIEVMU0UgOy8vIEFSTQotICAgICAgICAgICAgJGkgICRyLCAkYTAsICRhMQotICAgICAgICBFTkRJRgotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8gSGFuZGxlIHByZSBpbmRleGVkIGxvYWQvc3RvcmUKLSAgICAgICAgOy8vIG9wICByZWcsIFtiYXNlLCBvZmZzZXRdeyF9Ci0gICAgICAgIE1BQ1JPCi0gICAgICAgIF9NX1BSRUlORCAkaSwkciwkYTAsJGExCi0gICAgICAgIExDTFMgX2Jhc2UKLSAgICAgICAgTENMUyBfb2Zmc2V0Ci0gICAgICAgIElGICh7Q09ORklHfT0xNik6TEFORDooKCIkYTEiOlJJR0hUOjIpPSJdISIpCi1fYmFzZSAgICAgICBTRVRTICIkYTAiOlJJR0hUOig6TEVOOigiJGEwIiktMSkKLV9vZmZzZXQgICAgIFNFVFMgIiRhMSI6TEVGVDooOkxFTjooIiRhMSIpLTIpCi0gICAgICAgICAgICAkaSAkciwgWyRfYmFzZSwgJF9vZmZzZXRdCi0gICAgICAgICAgICBBREQgJF9iYXNlLCAkX2Jhc2UsICRfb2Zmc2V0Ci0gICAgICAgIEVMU0UKLSAgICAgICAgICAgICRpICAkciwgJGEwLCAkYTEKLSAgICAgICAgRU5ESUYKLSAgICAgICAgTUVORAotCi0gICAgICAgIDsvLyBMb2FkIHVuc2lnbmVkIGJ5dGUgZnJvbSBzdGFjawotICAgICAgICBNQUNSTwotICAgICAgICBNX0xEUkIgICRyLCRhMCwkYTEsJGEyLCRhMwotICAgICAgICBfTV9EQVRBICJMRFJCIiwxLCRyLCRhMCwkYTEsJGEyLCRhMwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8gTG9hZCBzaWduZWQgYnl0ZSBmcm9tIHN0YWNrCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fTERSU0IgJHIsJGEwLCRhMSwkYTIsJGEzCi0gICAgICAgIF9NX0RBVEEgIkxEUlNCIiwxLCRyLCRhMCwkYTEsJGEyLCRhMwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8gU3RvcmUgYnl0ZSB0byBzdGFjawotICAgICAgICBNQUNSTwotICAgICAgICBNX1NUUkIgICRyLCRhMCwkYTEsJGEyLCRhMwotICAgICAgICBfTV9EQVRBICJTVFJCIiwxLCRyLCRhMCwkYTEsJGEyLCRhMwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8gTG9hZCB1bnNpZ25lZCBoYWxmIHdvcmQgZnJvbSBzdGFjawotICAgICAgICBNQUNSTwotICAgICAgICBNX0xEUkggICRyLCRhMCwkYTEsJGEyLCRhMwotICAgICAgICBfTV9EQVRBICJMRFJIIiwyLCRyLCRhMCwkYTEsJGEyLCRhMwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8gTG9hZCBzaWduZWQgaGFsZiB3b3JkIGZyb20gc3RhY2sKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9MRFJTSCAkciwkYTAsJGExLCRhMiwkYTMKLSAgICAgICAgX01fREFUQSAiTERSU0giLDIsJHIsJGEwLCRhMSwkYTIsJGEzCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLyBTdG9yZSBoYWxmIHdvcmQgdG8gc3RhY2sKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9TVFJIICAkciwkYTAsJGExLCRhMiwkYTMKLSAgICAgICAgX01fREFUQSAiU1RSSCIsMiwkciwkYTAsJGExLCRhMiwkYTMKLSAgICAgICAgTUVORAotCi0gICAgICAgIDsvLyBMb2FkIHdvcmQgZnJvbSBzdGFjawotICAgICAgICBNQUNSTwotICAgICAgICBNX0xEUiAgICRyLCRhMCwkYTEsJGEyLCRhMwotICAgICAgICBfTV9EQVRBICJMRFIiLDQsJHIsJGEwLCRhMSwkYTIsJGEzCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLyBTdG9yZSB3b3JkIHRvIHN0YWNrCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fU1RSICAgJHIsJGEwLCRhMSwkYTIsJGEzCi0gICAgICAgIF9NX0RBVEEgIlNUUiIsNCwkciwkYTAsJGExLCRhMiwkYTMKLSAgICAgICAgTUVORAotCi0gICAgICAgIDsvLyBMb2FkIGRvdWJsZSB3b3JkIGZyb20gc3RhY2sKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9MRFJEICAkcjAsJHIxLCRhMCwkYTEsJGEyLCRhMwotICAgICAgICBfTV9EQVRBICJMRFJEIiw4LCIkcjAsJHIxIiwkYTAsJGExLCRhMiwkYTMKLSAgICAgICAgTUVORAotICAgICAgICAgICAgICAgIAotICAgICAgICA7Ly8gU3RvcmUgZG91YmxlIHdvcmQgdG8gc3RhY2sKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9TVFJEICAkcjAsJHIxLCRhMCwkYTEsJGEyLCRhMwotICAgICAgICBfTV9EQVRBICJTVFJEIiw4LCIkcjAsJHIxIiwkYTAsJGExLCRhMiwkYTMKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vIEdldCBhYnNvbHV0ZSBhZGRyZXNzIG9mIHN0YWNrIGFsbG9jYXRlZCBsb2NhdGlvbgotICAgICAgICBNQUNSTwotICAgICAgICBNX0FEUiAgICRhLCAkYiwgJGNjCi0gICAgICAgIF9NX09QQyAgQUREJGNjLCAkYSwgc3AsIChfV29ya3NwYWNlICsgJGIkX0YpCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLyBHZXQgYWJzb2x1dGUgYWRkcmVzcyBvZiBzdGFjayBhbGxvY2F0ZWQgbG9jYXRpb24gYW5kIGFsaWduIHRoZSBhZGRyZXNzIHRvIDE2IGJ5dGVzCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQURSMTYgJGEsICRiLCAkY2MKLSAgICAgICAgICAgIF9NX09QQyAgQUREJGNjLCAkYSwgc3AsIChfV29ya3NwYWNlICsgJGIkX0YkXzE2KQotICAgICAgICAKLSAgICAgICAgICAgIDsvLyBOb3cgYWxpZ24gJGEgdG8gMTYgYnl0ZXMKLSAgICAgICAgICAgIEJJQyRjYyAgJGEsJGEsIzB4MEYKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vIEdldCBhYnNvbHV0ZSBhZGRyZXNzIG9mIHN0YWNrIGFsbG9jYXRlZCBsb2NhdGlvbiBhbmQgYWxpZ24gdGhlIGFkZHJlc3MgdG8gMzIgYnl0ZXMKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9BRFIzMiAkYSwgJGIsICRjYwotICAgICAgICAgICAgX01fT1BDICBBREQkY2MsICRhLCBzcCwgKF9Xb3Jrc3BhY2UgKyAkYiRfRiRfMzIpCi0gICAgICAgIAotICAgICAgICAgICAgOy8vIE5vdyBhbGlnbiAkYSB0byAzMiBieXRlcwotICAgICAgICAgICAgQklDJGNjICAkYSwkYSwjMHgxRgotICAgICAgICBNRU5ECi0KLTsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi07Ly8gRnVuY3Rpb24gaGVhZGVyIGFuZCBmb290ZXIgbWFjcm9zCi07Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIEZ1bmN0aW9uIEhlYWRlciBNYWNybyAgICAKLSAgICAgICAgOy8vIEdlbmVyYXRlcyB0aGUgZnVuY3Rpb24gcHJvbG9ndWUKLSAgICAgICAgOy8vIE5vdGUgdGhhdCBmdW5jdGlvbnMgc2hvdWxkIGFsbCBiZSAic3RhY2stbW92ZXMtb25jZSIKLSAgICAgICAgOy8vIFRoZSBGTlNUQVJUIGFuZCBGTkVORCBtYWNyb3Mgc2hvdWxkIGJlIHRoZSBvbmx5IHBsYWNlcwotICAgICAgICA7Ly8gd2hlcmUgdGhlIHN0YWNrIG1vdmVzLgotICAgICAgICA7Ly8gICAgCi0gICAgICAgIDsvLyAkbmFtZSAgPSBmdW5jdGlvbiBuYW1lCi0gICAgICAgIDsvLyAkcnJlZyAgPSAiIiAgIGRvbid0IHN0YWNrIGFueSByZWdpc3RlcnMKLSAgICAgICAgOy8vICAgICAgICAgICJsciIgc3RhY2sgImxyIiBvbmx5Ci0gICAgICAgIDsvLyAgICAgICAgICAick4iIHN0YWNrIHJlZ2lzdGVycyAicjQtck4sbHIiCi0gICAgICAgIDsvLyAkZHJlZyAgPSAiIiAgIGRvbid0IHN0YWNrIGFueSBEIHJlZ2lzdGVycwotICAgICAgICA7Ly8gICAgICAgICAgImROIiBzdGFjayByZWdpc3RlcnMgImQ4LWROIgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIE5vdGU6IEFSTSBBcmNoaWN0dXJlIHByb2NlZHVyZSBjYWxsIHN0YW5kYXJkIEFBUENTCi0gICAgICAgIDsvLyBzdGF0ZXMgdGhhdCByNC1yMTEsIHNwLCBkOC1kMTUgbXVzdCBiZSBwcmVzZXJ2ZWQgYnkKLSAgICAgICAgOy8vIGEgY29tcGxpYW50IGZ1bmN0aW9uLgotICAgICAgICBNQUNSTwotICAgICAgICBNX1NUQVJUICRuYW1lLCAkcnJlZywgJGRyZWcKLSAgICAgICAgQVNTRVJUIDpMTk9UOl9JbkZ1bmMKLSAgICAgICAgQVNTRVJUICIkbmFtZSIhPSIiCi1fSW5GdW5jIFNFVEwge1RSVUV9Ci1fUkJ5dGVzIFNFVEEgMAotX1dvcmtzcGFjZSBTRVRBIDAKLQotICAgICAgICA7Ly8gQ3JlYXRlIGFuIGFyZWEgZm9yIHRoZSBmdW5jdGlvbiAgICAgICAgCi0gICAgICAgIEFSRUEgICAgfC50ZXh0fCwgQ09ERQotICAgICAgICBFWFBPUlQgICRuYW1lCi0kbmFtZSAgIEZVTkNUSU9OCi0gICAgICAgIAotICAgICAgICA7Ly8gU2F2ZSBSIHJlZ2lzdGVycwotICAgICAgICBfTV9HRVRSUkVHTElTVCAkcnJlZwotICAgICAgICBJRiBfUlJlZ0xpc3Q8PiIiCi0gICAgICAgICAgICBTVE1GRCAgIHNwISwgeyRfUlJlZ0xpc3QsIGxyfQotICAgICAgICBFTkRJRgotICAgICAgICAgICAgICAgIAotICAgICAgICA7Ly8gU2F2ZSBEIHJlZ2lzdGVycwotICAgICAgICBfTV9HRVREUkVHTElTVCAgJGRyZWcgICAgICAgIAotICAgICAgICBJRiBfRFJlZ0xpc3Q8PiIiCi0gICAgICAgICAgICBWU1RNRkQgIHNwISwgeyRfRFJlZ0xpc3R9Ci0gICAgICAgIEVORElGICAgICAgICAgICAgCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIDsvLyBFbnN1cmUgc2l6ZSBjbGFpbWVkIG9uIHN0YWNrIGlzIDgtYnl0ZSBhbGlnbmVkCi0gICAgICAgIElGICgoX1NCeXRlczpBTkQ6NykhPTApCi1fU0J5dGVzICAgICBTRVRBIF9TQnl0ZXMgKyAoOCAtIChfU0J5dGVzOkFORDo3KSkKLSAgICAgICAgRU5ESUYKLSAgICAgICAgCi0gICAgICAgIElGIChfU0J5dGVzIT0wKQotICAgICAgICAgICAgX01fT1BDIFNVQiwgc3AsIHNwLCBfU0J5dGVzCi0gICAgICAgIEVORElGCi0gICAgICAgIAotICAgICAgICAKLV9BQnl0ZXMgU0VUQSBfU0J5dGVzICsgX1JCeXRlcyAtIF9Xb3Jrc3BhY2UKLQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIDsvLyBQcmludCBmdW5jdGlvbiBuYW1lIGlmIGRlYnVnIGVuYWJsZWQKLSAgICAgICAgTV9QUklOVEYgIiRuYW1lXG4iLAotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8gV29yayBvdXQgYSBsaXN0IG9mIFIgc2F2ZWQgcmVnaXN0ZXJzCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIF9NX0dFVFJSRUdMSVNUICRycmVnCi0gICAgICAgIElGICIkcnJlZyI9IiIKLV9SUmVnTGlzdCAgIFNFVFMgIiIKLSAgICAgICAgICAgIE1FWElUCi0gICAgICAgIEVORElGICAgICAgICAKLSAgICAgICAgSUYgIiRycmVnIj0ibHIiOkxPUjoiJHJyZWciPSJyNCIKLV9SUmVnTGlzdCAgIFNFVFMgInI0IgotX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzgKLSAgICAgICAgICAgIE1FWElUCi0gICAgICAgIEVORElGCi0gICAgICAgIElGICIkcnJlZyI9InI1IjpMT1I6IiRycmVnIj0icjYiCi1fUlJlZ0xpc3QgICBTRVRTICJyNC1yNiIKLV9SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcysxNgotICAgICAgICAgICAgTUVYSVQKLSAgICAgICAgRU5ESUYKLSAgICAgICAgSUYgIiRycmVnIj0icjciOkxPUjoiJHJyZWciPSJyOCIKLV9SUmVnTGlzdCAgIFNFVFMgInI0LXI4IgotX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzI0Ci0gICAgICAgICAgICBNRVhJVAotICAgICAgICBFTkRJRgotICAgICAgICBJRiAiJHJyZWciPSJyOSI6TE9SOiIkcnJlZyI9InIxMCIKLV9SUmVnTGlzdCAgIFNFVFMgInI0LXIxMCIKLV9SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcyszMgotICAgICAgICAgICAgTUVYSVQKLSAgICAgICAgRU5ESUYKLSAgICAgICAgSUYgIiRycmVnIj0icjExIjpMT1I6IiRycmVnIj0icjEyIgotX1JSZWdMaXN0ICAgU0VUUyAicjQtcjEyIgotX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzQwCi0gICAgICAgICAgICBNRVhJVAotICAgICAgICBFTkRJRgotICAgICAgICBJTkZPIDEsICJVbnJlY29nbml6ZWQgc2F2ZWQgciByZWdpc3RlciBsaW1pdCAnJHJyZWcnIgotICAgICAgICBNRU5EICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBXb3JrIG91dCBhIGxpc3Qgb2YgRCBzYXZlZCByZWdpc3RlcnMKLSAgICAgICAgTUFDUk8KLSAgICAgICAgX01fR0VURFJFR0xJU1QgJGRyZWcKLSAgICAgICAgSUYgIiRkcmVnIj0iIgotX0RSZWdMaXN0ICAgU0VUUyAiIgotICAgICAgICAgICAgTUVYSVQKLSAgICAgICAgRU5ESUYgICAgICAgIAotICAgICAgICBJRiAiJGRyZWciPSJkOCIKLV9EUmVnTGlzdCAgIFNFVFMgImQ4IgotX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzgKLSAgICAgICAgICAgIE1FWElUCi0gICAgICAgIEVORElGCi0gICAgICAgIElGICIkZHJlZyI9ImQ5IgotX0RSZWdMaXN0ICAgU0VUUyAiZDgtZDkiCi1fUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrMTYKLSAgICAgICAgICAgIE1FWElUCi0gICAgICAgIEVORElGCi0gICAgICAgIElGICIkZHJlZyI9ImQxMCIKLV9EUmVnTGlzdCAgIFNFVFMgImQ4LWQxMCIKLV9SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcysyNAotICAgICAgICAgICAgTUVYSVQKLSAgICAgICAgRU5ESUYKLSAgICAgICAgSUYgIiRkcmVnIj0iZDExIgotX0RSZWdMaXN0ICAgU0VUUyAiZDgtZDExIgotX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzMyCi0gICAgICAgICAgICBNRVhJVAotICAgICAgICBFTkRJRgotICAgICAgICBJRiAiJGRyZWciPSJkMTIiCi1fRFJlZ0xpc3QgICBTRVRTICJkOC1kMTIiCi1fUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrNDAKLSAgICAgICAgICAgIE1FWElUCi0gICAgICAgIEVORElGCi0gICAgICAgIElGICIkZHJlZyI9ImQxMyIKLV9EUmVnTGlzdCAgIFNFVFMgImQ4LWQxMyIKLV9SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcys0OAotICAgICAgICAgICAgTUVYSVQKLSAgICAgICAgRU5ESUYKLSAgICAgICAgSUYgIiRkcmVnIj0iZDE0IgotX0RSZWdMaXN0ICAgU0VUUyAiZDgtZDE0IgotX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzU2Ci0gICAgICAgICAgICBNRVhJVAotICAgICAgICBFTkRJRgotICAgICAgICBJRiAiJGRyZWciPSJkMTUiCi1fRFJlZ0xpc3QgICBTRVRTICJkOC1kMTUiCi1fUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrNjQKLSAgICAgICAgICAgIE1FWElUCi0gICAgICAgIEVORElGCi0gICAgICAgIElORk8gMSwgIlVucmVjb2duaXplZCBzYXZlZCBkIHJlZ2lzdGVyIGxpbWl0ICckZHJlZyciCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLyBQcm9kdWNlIGZ1bmN0aW9uIHJldHVybiBpbnN0cnVjdGlvbnMKLSAgICAgICAgTUFDUk8KLSAgICAgICAgX01fUkVUICRjYwotICAgICAgICBJRiBfRFJlZ0xpc3Q8PiIiCi0gICAgICAgICAgICBWUE9QJGNjIHskX0RSZWdMaXN0fQotICAgICAgICBFTkRJRgotICAgICAgICBJRiBfUlJlZ0xpc3Q9IiIKLSAgICAgICAgICAgIEJYJGNjIGxyCi0gICAgICAgIEVMU0UKLSAgICAgICAgICAgIExETSRjYy5GRCBzcCEsIHskX1JSZWdMaXN0LCBwY30KLSAgICAgICAgRU5ESUYKLSAgICAgICAgTUVORCAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gRWFybHkgRnVuY3Rpb24gRXhpdCBNYWNybwotICAgICAgICA7Ly8gJGNjID0gY29uZGl0aW9uIHRvIGV4aXQgd2l0aAotICAgICAgICA7Ly8gKEV4YW1wbGU6IE1fRVhJVCBFUSkKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9FWElUICAkY2MKLSAgICAgICAgQVNTRVJUICBfSW5GdW5jCi0gICAgICAgIElGICBfU0J5dGVzIT0wCi0gICAgICAgICAgICA7Ly8gUmVzdG9yZSBzdGFjayBmcmFtZSBhbmQgZXhpdAotICAgICAgICAgICAgQiRjYyAgX0VuZCRfRgotICAgICAgICBFTFNFCi0gICAgICAgICAgICA7Ly8gQ2FuIHJldHVybiBkaXJlY3RseQotICAgICAgICAgICAgX01fUkVUICRjYwotICAgICAgICBFTkRJRiAgICAgICAgCi0gICAgICAgIE1FTkQgICAgICAgIAotCi0gICAgICAgIDsvLyBGdW5jdGlvbiBGb290ZXIgTWFjcm8gICAgICAgIAotICAgICAgICA7Ly8gR2VuZXJhdGVzIHRoZSBmdW5jdGlvbiBlcGlsb2d1ZQotICAgICAgICBNQUNSTwotICAgICAgICBNX0VORAotICAgICAgICBBU1NFUlQgX0luRnVuYwotX0luRnVuYyBTRVRMIHtGQUxTRX0KLV9FbmQkX0YKLQotICAgICAgICA7Ly8gUmVzdG9yZSB0aGUgc3RhY2sgcG9pbnRlciB0byBpdHMgb3JpZ2luYWwgdmFsdWUgb24gZnVuY3Rpb24gZW50cnkKLSAgICAgICAgSUYgX1NCeXRlcyE9MAotICAgICAgICAgICAgX01fT1BDIEFERCwgc3AsIHNwLCBfU0J5dGVzCi0gICAgICAgIEVORElGCi0gICAgICAgIF9NX1JFVAotICAgICAgICBFTkRGVU5DCi0KLSAgICAgICAgOy8vIFJlc2V0IHRoZSBnbG9iYWwgc3RhY2sgdHJhY2tpbmcgdmFyaWFibGVzIGJhY2sgdG8gdGhlaXIgCi0gICAgICAgIDsvLyBpbml0aWFsIHZhbHVlcywgYW5kIGluY3JlbWVudCB0aGUgZnVuY3Rpb24gY291bnQKLV9TQnl0ZXMgICAgICAgIFNFVEEgMAotX0YgICAgICAgICAgICAgU0VUQSBfRisxCi0gICAgICAgIE1FTkQKLQotICAgICAgICAgICAgICAgIAotOy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsvLyBEZWJ1ZyBNYWNyb3MKLTsvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICAgICAgR0JMTCAgICBERUJVR19PTgotREVCVUdfT04gU0VUTCAgIHtGQUxTRX0KLSAgICAgICAgR0JMTCAgICBERUJVR19TVEFMTFNfT04KLURFQlVHX1NUQUxMU19PTiBTRVRMIHtGQUxTRX0KLSAgICAgICAgCi0gICAgICAgIDsvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICAgIDsvLyBEZWJ1ZyBjYWxsIHRvIHByaW50ZgotICAgICAgICA7Ly8gIE1fUFJJTlRGICRmb3JtYXQsICR2YWwwLCAkdmFsMSwgJHZhbDIKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBFeGFtcGxlczoKLSAgICAgICAgOy8vICBNX1BSSU5URiAieD0lMDh4XG4iLCByMAotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIFRoaXMgbWFjcm8gcHJlc2VydmVzIHRoZSB2YWx1ZSBvZiBhbGwgcmVnaXN0ZXJzIGluY2x1ZGluZyB0aGUKLSAgICAgICAgOy8vIGZsYWdzLgotICAgICAgICA7Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fUFJJTlRGICAkZm9ybWF0LCAkdmFsMCwgJHZhbDEsICR2YWwyCi0gICAgICAgIElGIERFQlVHX09OCi0gICAgICAgIAotICAgICAgICBJTVBPUlQgIHByaW50ZgotICAgICAgICBMQ0xBICAgIG5BcmdzCi1uQXJncwlTRVRBICAgIDAKLSAgICAgICAgCi0gICAgICAgIDsvLyBzYXZlIHJlZ2lzdGVycyBzbyB3ZSBkb24ndCBjb3JydXB0IHRoZW0KLSAgICAgICAgU1RNRkQgICBzcCEsIHtyMC1yMTIsIGxyfQotICAgICAgICAKLSAgICAgICAgOy8vIERyb3Agc3RhY2sgdG8gZ2l2ZSB1cyBzb21lIHdvcmtzcGFjZQotICAgICAgICBTVUIgICAgIHNwLCBzcCwgIzE2Ci0gICAgICAgIAotICAgICAgICA7Ly8gU2F2ZSByZWdpc3RlcnMgd2UgbmVlZCB0byBwcmludCB0byB0aGUgc3RhY2sKLSAgICAgICAgSUYgIiR2YWwyIiA8PiAiIgotICAgICAgICAgICAgQVNTRVJUICIkdmFsMSIgPD4gIiIKLSAgICAgICAgICAgIFNUUiAgICAkdmFsMiwgW3NwLCAjOF0KLW5BcmdzICAgICAgIFNFVEEgICBuQXJncysxCi0gICAgICAgIEVORElGCi0gICAgICAgIElGICIkdmFsMSIgPD4gIiIKLSAgICAgICAgICAgIEFTU0VSVCAiJHZhbDAiIDw+ICIiCi0gICAgICAgICAgICBTVFIgICAgJHZhbDEsIFtzcCwgIzRdCi1uQXJncwkgICAgU0VUQSAgIG5BcmdzKzEKLSAgICAgICAgRU5ESUYKLSAgICAgICAgSUYgIiR2YWwwIjw+IiIKLSAgICAgICAgICAgIFNUUiAgICAkdmFsMCwgW3NwXQotbkFyZ3MJICAgIFNFVEEgICBuQXJncysxCi0gICAgICAgIEVORElGCi0gICAgICAgIAotICAgICAgICA7Ly8gTm93IHdlIGFyZSBzYWZlIHRvIGNvcnJ1cHQgcmVnaXN0ZXJzCi0gICAgICAgIEFEUiAgICAgcjAsICVGVDAwCi0gICAgICAgIElGIG5BcmdzPTEKLSAgICAgICAgICBMRFIgICByMSwgW3NwXQotICAgICAgICBFTkRJRgotICAgICAgICBJRiBuQXJncz0yCi0gICAgICAgICAgTERNSUEgc3AsIHtyMSxyMn0KLSAgICAgICAgRU5ESUYKLSAgICAgICAgSUYgbkFyZ3M9MwotICAgICAgICAgIExETUlBIHNwLCB7cjEscjIscjN9Ci0gICAgICAgIEVORElGCi0gICAgICAgIAotICAgICAgICA7Ly8gcHJpbnQgdGhlIHZhbHVlcwotICAgICAgICBNUlMgICAgIHI0LCBjcHNyICAgICAgICA7Ly8gcHJlc2VydmUgZmxhZ3MKLSAgICAgICAgQkwgICAgICBwcmludGYKLSAgICAgICAgTVNSICAgICBjcHNyX2YsIHI0ICAgICAgOy8vIHJlc3RvcmUgZmxhZ3MKLSAgICAgICAgQiAgICAgICAlRlQwMQotMDAgICAgICA7Ly8gc3RyaW5nIHRvIHByaW50Ci0gICAgICAgIERDQiAgICAgIiRmb3JtYXQiLCAwCi0gICAgICAgIEFMSUdOCi0wMSAgICAgIDsvLyBGaW5pc2hlZAotICAgICAgICBBREQgICAgIHNwLCBzcCwgIzE2Ci0gICAgICAgIDsvLyBSZXN0b3JlIHJlZ2lzdGVycwotICAgICAgICBMRE1GRAlzcCEsIHtyMC1yMTIsbHJ9Ci0KLSAgICAgICAgRU5ESUYgICA7Ly8gREVCVUdfT04KLSAgICAgICAgTUVORAotCi0KLSAgICAgICAgOy8vIFN0YWxsIFNpbXVsYXRpb24gTWFjcm8KLSAgICAgICAgOy8vIEluc2VydHMgYSBnaXZlbiBudW1iZXIgb2YgTk9QcyBmb3IgdGhlIGN1cnJlbnRseQotICAgICAgICA7Ly8gIGRlZmluZWQgcGxhdGZvcm0KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9TVEFMTCAkcGxhdDFzdGFsbCwgJHBsYXQyc3RhbGwsICRwbGF0M3N0YWxsLCAkcGxhdDRzdGFsbCwgJHBsYXQ1c3RhbGwsICRwbGF0NnN0YWxsCi0gICAgICAgIElGIERFQlVHX1NUQUxMU19PTgotICAgICAgICAgICAgX01fU1RBTExfU1VCICRwbGF0MXN0YWxsICAgIAotICAgICAgICAgICAgX01fU1RBTExfU1VCICRwbGF0MnN0YWxsICAgIAotICAgICAgICAgICAgX01fU1RBTExfU1VCICRwbGF0M3N0YWxsICAgIAotICAgICAgICAgICAgX01fU1RBTExfU1VCICRwbGF0NHN0YWxsICAgIAotICAgICAgICAgICAgX01fU1RBTExfU1VCICRwbGF0NXN0YWxsICAgIAotICAgICAgICAgICAgX01fU1RBTExfU1VCICRwbGF0NnN0YWxsICAgIAotICAgICAgICBFTkRJRgotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBfTV9TVEFMTF9TVUIgJHBsYXRzdGFsbAotICAgICAgICBJRiAiJHBsYXRzdGFsbCIhPSIiCi0gICAgICAgICAgICBMQ0xBIF9wbGxlbgotICAgICAgICAgICAgTENMUyBfcGwKLSAgICAgICAgICAgIExDTEwgX3BsbG9nCi1fcGxsZW4gICAgICBTRVRBIDpMRU46IiRwbGF0c3RhbGwiCi1fcGwgICAgICAgICBTRVRTICIkcGxhdHN0YWxsIjpMRUZUOihfcGxsZW4gLSAyKQotICAgICAgICAgICAgSUYgOkRFRjokX3BsCi0gICAgICAgICAgICAgICAgSUYgJF9wbAotICAgICAgICAgICAgICAgICAgICBMQ0xTIF9zdAotICAgICAgICAgICAgICAgICAgICBMQ0xBIF9zdG51bQotX3N0ICAgICAgICAgICAgICAgICBTRVRTICIkcGxhdHN0YWxsIjpSSUdIVDoxICAgICAgICAKLV9zdG51bSAgICAgICAgICAgICAgU0VUQSAkX3N0Ci0gICAgICAgICAgICAgICAgICAgIFdISUxFIF9zdG51bT4wCi0JCQlNT1Ygc3AsIHNwCi1fc3RudW0gICAgICAgICAgICAgICAgICBTRVRBIF9zdG51bSAtIDEKLSAgICAgICAgICAgICAgICAgICAgV0VORAotICAgICAgICAgICAgICAgIEVORElGCi0gICAgICAgICAgICBFTkRJRgotICAgICAgICBFTkRJRgotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgCi07Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOy8vIEVuZGlhbiBJbnZhcmllbmNlIE1hY3JvcwotOy8vIAotOy8vIFRoZSBpZGVhIGJlaGluZCB0aGVzZSBtYWNyb3MgaXMgdGhhdCBpZiBhbiBhcnJheSBpcwotOy8vIGxvYWRlZCBhcyB3b3JkcyB0aGVuIHRoZSBTTVVMMDAgbWFjcm8gd2lsbCBtdWx0aXBseQotOy8vIGFycmF5IGVsZW1lbnRzIDAgcmVnYXJkbGVzcyBvZiB0aGUgZW5kaWFuZXNzIG9mIHRoZQotOy8vIHN5c3RlbS4gRm9yIGxpdHRsZSBlbmRpYW4gU01VTDAwPVNNVUxCQiwgZm9yIGJpZwotOy8vIGVuZGlhbiBTTVVMMDA9U01VTFRUIGFuZCBzaW1pbGFybHkgZm9yIG90aGVyIHBhY2tlZCBvcGVyYXRpb25zLgotOy8vCi07Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIExJQkk0ICAgJGNvbWxpLCAkY29tYmksICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgSUYge0VORElBTn09ImJpZyIKLSAgICAgICAgJGNvbWJpLiRjYyAkYSwgJGIsICRjLCAkZAotICAgICAgICBFTFNFCi0gICAgICAgICRjb21saS4kY2MgJGEsICRiLCAkYywgJGQKLSAgICAgICAgRU5ESUYKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTElCSTMgICAkY29tbGksICRjb21iaSwgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIElGIHtFTkRJQU59PSJiaWciCi0gICAgICAgICRjb21iaS4kY2MgJGEsICRiLCAkYwotICAgICAgICBFTFNFCi0gICAgICAgICRjb21saS4kY2MgJGEsICRiLCAkYwotICAgICAgICBFTkRJRgotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8gU01MQXh5IG1hY3JvcwotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQTAwICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFCQiwgU01MQVRULCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEEwMSAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBQlQsIFNNTEFUQiwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBMEIgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQUJCLCBTTUxBVEIsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQTBUICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFCVCwgU01MQVRULCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEExMCAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBVEIsIFNNTEFCVCwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBMTEgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQVRULCBTTUxBQkIsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQTFCICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFUQiwgU01MQUJCLCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEExVCAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBVFQsIFNNTEFCVCwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBQjAgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQUJCLCBTTUxBQlQsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQUIxICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFCVCwgU01MQUJCLCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEFUMCAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBVEIsIFNNTEFUVCwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBVDEgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQVRULCBTTUxBVEIsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vIFNNVUx4eSBtYWNyb3MKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNVUwwMCAgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIExJQkkzIFNNVUxCQiwgU01VTFRULCAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01VTDAxICAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTElCSTMgU01VTEJULCBTTVVMVEIsICRhLCAkYiwgJGMsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTVVMMEIgICRhLCAkYiwgJGMsICRjYwotICAgICAgICBMSUJJMyBTTVVMQkIsIFNNVUxUQiwgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNVUwwVCAgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIExJQkkzIFNNVUxCVCwgU01VTFRULCAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01VTDEwICAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTElCSTMgU01VTFRCLCBTTVVMQlQsICRhLCAkYiwgJGMsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTVVMMTEgICRhLCAkYiwgJGMsICRjYwotICAgICAgICBMSUJJMyBTTVVMVFQsIFNNVUxCQiwgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNVUwxQiAgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIExJQkkzIFNNVUxUQiwgU01VTEJCLCAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01VTDFUICAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTElCSTMgU01VTFRULCBTTVVMQlQsICRhLCAkYiwgJGMsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTVVMQjAgICRhLCAkYiwgJGMsICRjYwotICAgICAgICBMSUJJMyBTTVVMQkIsIFNNVUxCVCwgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNVUxCMSAgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIExJQkkzIFNNVUxCVCwgU01VTEJCLCAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01VTFQwICAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTElCSTMgU01VTFRCLCBTTVVMVFQsICRhLCAkYiwgJGMsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTVVMVDEgICRhLCAkYiwgJGMsICRjYwotICAgICAgICBMSUJJMyBTTVVMVFQsIFNNVUxUQiwgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLyBTTUxBV3gsIFNNVUxXeCBtYWNyb3MKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEFXMCAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBV0IsIFNNTEFXVCwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBVzEgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQVdULCBTTUxBV0IsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01VTFcwICAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTElCSTMgU01VTFdCLCBTTVVMV1QsICRhLCAkYiwgJGMsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTVVMVzEgICRhLCAkYiwgJGMsICRjYwotICAgICAgICBMSUJJMyBTTVVMV1QsIFNNVUxXQiwgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIE1FTkQKLQotICAgICAgICA7Ly8gU01MQUx4eSBtYWNyb3MKLQotCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEFMMDAgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQUxCQiwgU01MQUxUVCwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBTDAxICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFMQlQsIFNNTEFMVEIsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQUwwQiAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBTEJCLCBTTUxBTFRCLCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEFMMFQgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQUxCVCwgU01MQUxUVCwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBTDEwICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFMVEIsIFNNTEFMQlQsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEFMMTEgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQUxUVCwgU01MQUxCQiwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBTDFCICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFMVEIsIFNNTEFMQkIsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQUwxVCAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBTFRULCBTTUxBTEJULCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEFMQjAgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQUxCQiwgU01MQUxCVCwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBTEIxICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFMQlQsIFNNTEFMQkIsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQUxUMCAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBTFRCLCBTTUxBTFRULCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEFMVDEgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQUxUVCwgU01MQUxUQiwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICBFTkRJRiA7Ly8gQVJNQ09NTV9TX0gKLSAgICAgICAgICAgIAotICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtT01YLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybU9NWC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDNhYmQ5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtT01YLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyODkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyogCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybU9NWF9SZWxlYXNlVmVyc2lvbi5oCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDEyMjkwCi0gKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBUaGlzIGZpbGUgYWxsb3dzIGEgdmVyc2lvbiBvZiB0aGUgT01YIERMIGxpYnJhcmllcyB0byBiZSBidWlsdCB3aGVyZSBzb21lIG9yCi0gKiBhbGwgb2YgdGhlIGZ1bmN0aW9uIG5hbWVzIGNhbiBiZSBnaXZlbiBhIHVzZXIgc3BlY2lmaWVkIHN1ZmZpeC4gCi0gKgotICogWW91IG1pZ2h0IHdhbnQgdG8gdXNlIGl0IHdoZXJlOgotICoKLSAqIC0geW91IHdhbnQgdG8gcmVuYW1lIGEgZnVuY3Rpb24gIm91dCBvZiB0aGUgd2F5IiBzbyB0aGF0IHlvdSBjb3VsZCByZXBsYWNlCi0gKiAgIGEgZnVuY3Rpb24gd2l0aCBhIGRpZmZlcmVudCB2ZXJzaW9uICh0aGUgb3JpZ2luYWwgdmVyc2lvbiB3b3VsZCBzdGlsbCBiZQotICogICBpbiB0aGUgbGlicmFyeSBqdXN0IHdpdGggYSBkaWZmZXJlbnQgbmFtZSAtIHNvIHlvdSBjb3VsZCBkZWJ1ZyB0aGUgbmV3Ci0gKiAgIHZlcnNpb24gYnkgY29tcGFyaW5nIGl0IHRvIHRoZSBvdXRwdXQgb2YgdGhlIG9sZCkKLSAqCi0gKiAtIHlvdSB3YW50IHRvIHJlbmFtZSBhbGwgdGhlIGZ1bmN0aW9ucyB0byB2ZXJzaW9ucyB3aXRoIGEgc3VmZml4IHNvIHRoYXQgCi0gKiAgIHlvdSBjYW4gaW5jbHVkZSB0d28gdmVyc2lvbnMgb2YgdGhlIGxpYnJhcnkgYW5kIGNob29zZSBiZXR3ZWVuIGZ1bmN0aW9ucwotICogICBhdCBydW50aW1lLgotICoKLSAqICAgICBlLmcuIG9teElQQk1fQ29weV9VOF9DMVIgY291bGQgYmUgcmVuYW1lZCBvbXhJUEJNX0NvcHlfVThfQzFSX0NvcnRleEE4Ci0gKiAKLSAqLwotCi0gIAotI2lmbmRlZiBfYXJtT01YX0hfCi0jZGVmaW5lIF9hcm1PTVhfSF8KLQotCi0vKiBXZSBuZWVkIHRvIGRlZmluZSB0aGVzZSB0d28gbWFjcm9zIGluIG9yZGVyIHRvIGV4cGFuZCBhbmQgY29uY2F0ZW5hdGUgdGhlIG5hbWVzICovCi0jZGVmaW5lIE9NWENBVDJCQVIoQSwgQikgb214ICMjIEEgIyMgQgotI2RlZmluZSBPTVhDQVRCQVIoQSwgQikgT01YQ0FUMkJBUihBLCBCKQotCi0vKiBEZWZpbmUgdGhlIHN1ZmZpeCB0byBhZGQgdG8gYWxsIGZ1bmN0aW9ucyAtIHRoZSBkZWZhdWx0IGlzIG5vIHN1ZmZpeCAqLwotI2RlZmluZSBCQVJFX1NVRkZJWCAKLQotCi0KLS8qIERlZmluZSB3aGF0IGhhcHBlbnMgdG8gdGhlIGJhcmUgc3VmZml4LWxlc3MgZnVuY3Rpb25zLCBkb3duIHRvIHRoZSBzdWItZG9tYWluIGFjY3VyYWN5ICovCi0jZGVmaW5lIE9NWEFDQUFDX1NVRkZJWCAgICBCQVJFX1NVRkZJWCAgIAotI2RlZmluZSBPTVhBQ01QM19TVUZGSVggICAgQkFSRV9TVUZGSVgKLSNkZWZpbmUgT01YSUNKUF9TVUZGSVggICAgIEJBUkVfU1VGRklYCi0jZGVmaW5lIE9NWElQQk1fU1VGRklYICAgICBCQVJFX1NVRkZJWAotI2RlZmluZSBPTVhJUENTX1NVRkZJWCAgICAgQkFSRV9TVUZGSVgKLSNkZWZpbmUgT01YSVBQUF9TVUZGSVggICAgIEJBUkVfU1VGRklYCi0jZGVmaW5lIE9NWFNQX1NVRkZJWCAgICAgICBCQVJFX1NVRkZJWAotI2RlZmluZSBPTVhWQ0NPTU1fU1VGRklYICAgQkFSRV9TVUZGSVgKLSNkZWZpbmUgT01YVkNNNFAxMF9TVUZGSVggIEJBUkVfU1VGRklYCi0jZGVmaW5lIE9NWFZDTTRQMl9TVUZGSVggICBCQVJFX1NVRkZJWAotCi0KLQotCi0vKiBEZWZpbmUgd2hhdCB0aGUgZWFjaCBiYXJlLCB1bi1zdWZmaXhlZCBPcGVuTUFYIEFQSSBmdW5jdGlvbiBuYW1lcyBpcyB0byBiZSByZW5hbWVkICovCi0jZGVmaW5lIG9teEFDQUFDX0RlY29kZUNoYW5QYWlyRWx0ICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZUNoYW5QYWlyRWx0LCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX0RlY29kZURhdFN0ckVsdCAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZURhdFN0ckVsdCwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVGaWxsRWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVGaWxsRWx0LCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX0RlY29kZUlzU3RlcmVvX1MzMiAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZUlzU3RlcmVvX1MzMiwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVNc1BOU19TMzJfSSAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVNc1BOU19TMzJfSSwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVNc1N0ZXJlb19TMzJfSSAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVNc1N0ZXJlb19TMzJfSSwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVQcmdDZmdFbHQgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVQcmdDZmdFbHQsIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfRGVjb2RlVE5TX1MzMl9JICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlVE5TX1MzMl9JLCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX0RlaW50ZXJsZWF2ZVNwZWN0cnVtX1MzMiAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlaW50ZXJsZWF2ZVNwZWN0cnVtX1MzMiwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19FbmNvZGVUTlNfUzMyX0kgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19FbmNvZGVUTlNfUzMyX0ksIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfTG9uZ1Rlcm1QcmVkaWN0X1MzMiAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfTG9uZ1Rlcm1QcmVkaWN0X1MzMiwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19Mb25nVGVybVJlY29uc3RydWN0X1MzMl9JICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19Mb25nVGVybVJlY29uc3RydWN0X1MzMl9JLCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX01EQ1RGd2RfUzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX01EQ1RGd2RfUzMyLCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX01EQ1RJbnZfUzMyX1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX01EQ1RJbnZfUzMyX1MxNiwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19Ob2lzZWxlc3NEZWNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19Ob2lzZWxlc3NEZWNvZGUsIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfUXVhbnRJbnZfUzMyX0kgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfUXVhbnRJbnZfUzMyX0ksIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfVW5wYWNrQURJRkhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfVW5wYWNrQURJRkhlYWRlciwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19VbnBhY2tBRFRTRnJhbWVIZWFkZXIgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19VbnBhY2tBRFRTRnJhbWVIZWFkZXIsIE9NWEFDQUFDX1NVRkZJWCkKLQotCi0jZGVmaW5lIG9teEFDTVAzX0h1ZmZtYW5EZWNvZGVfUzMyICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX0h1ZmZtYW5EZWNvZGVfUzMyLCBPTVhBQ01QM19TVUZGSVgpCi0jZGVmaW5lIG9teEFDTVAzX0h1ZmZtYW5EZWNvZGVTZmJfUzMyICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX0h1ZmZtYW5EZWNvZGVTZmJfUzMyLCBPTVhBQ01QM19TVUZGSVgpCi0jZGVmaW5lIG9teEFDTVAzX0h1ZmZtYW5EZWNvZGVTZmJNYnBfUzMyICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX0h1ZmZtYW5EZWNvZGVTZmJNYnBfUzMyLCBPTVhBQ01QM19TVUZGSVgpCi0jZGVmaW5lIG9teEFDTVAzX01EQ1RJbnZfUzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX01EQ1RJbnZfUzMyLCBPTVhBQ01QM19TVUZGSVgpCi0jZGVmaW5lIG9teEFDTVAzX1JlUXVhbnRpemVfUzMyX0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX1JlUXVhbnRpemVfUzMyX0ksIE9NWEFDTVAzX1NVRkZJWCkKLSNkZWZpbmUgb214QUNNUDNfUmVRdWFudGl6ZVNmYl9TMzJfSSAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfUmVRdWFudGl6ZVNmYl9TMzJfSSwgT01YQUNNUDNfU1VGRklYKQotI2RlZmluZSBvbXhBQ01QM19TeW50aFBRTUZfUzMyX1MxNiAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19TeW50aFBRTUZfUzMyX1MxNiwgT01YQUNNUDNfU1VGRklYKQotI2RlZmluZSBvbXhBQ01QM19VbnBhY2tGcmFtZUhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19VbnBhY2tGcmFtZUhlYWRlciwgT01YQUNNUDNfU1VGRklYKQotI2RlZmluZSBvbXhBQ01QM19VbnBhY2tTY2FsZUZhY3RvcnNfUzggICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19VbnBhY2tTY2FsZUZhY3RvcnNfUzgsIE9NWEFDTVAzX1NVRkZJWCkKLSNkZWZpbmUgb214QUNNUDNfVW5wYWNrU2lkZUluZm8gICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfVW5wYWNrU2lkZUluZm8sIE9NWEFDTVAzX1NVRkZJWCkKLQotI2RlZmluZSBvbXhJQ0pQX0NvcHlFeHBhbmRfVThfQzMgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0NvcHlFeHBhbmRfVThfQzMsIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RDVEZ3ZF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVEZ3ZF9TMTYsIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RDVEZ3ZF9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVEZ3ZF9TMTZfSSwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRENUSW52X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUSW52X1MxNiwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRENUSW52X1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUSW52X1MxNl9JLCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEZ3ZF9NdWx0aXBsZV9TMTYgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEZ3ZF9NdWx0aXBsZV9TMTYsIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50RndkX1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50RndkX1MxNiwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRENUUXVhbnRGd2RfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRGd2RfUzE2X0ksIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50RndkVGFibGVJbml0ICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50RndkVGFibGVJbml0LCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEludl9NdWx0aXBsZV9TMTYgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEludl9NdWx0aXBsZV9TMTYsIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50SW52X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50SW52X1MxNiwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRENUUXVhbnRJbnZfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRJbnZfUzE2X0ksIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50SW52VGFibGVJbml0ICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50SW52VGFibGVJbml0LCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9EZWNvZGVIdWZmbWFuOHg4X0RpcmVjdF9TMTZfQzEgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EZWNvZGVIdWZmbWFuOHg4X0RpcmVjdF9TMTZfQzEsIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RlY29kZUh1ZmZtYW5TcGVjR2V0QnVmU2l6ZV9VOCAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RlY29kZUh1ZmZtYW5TcGVjR2V0QnVmU2l6ZV9VOCwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRGVjb2RlSHVmZm1hblNwZWNJbml0X1U4ICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRGVjb2RlSHVmZm1hblNwZWNJbml0X1U4LCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9FbmNvZGVIdWZmbWFuOHg4X0RpcmVjdF9TMTZfVTFfQzEgICAgICAgICBPTVhDQVRCQVIoSUNKUF9FbmNvZGVIdWZmbWFuOHg4X0RpcmVjdF9TMTZfVTFfQzEsIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0VuY29kZUh1ZmZtYW5TcGVjR2V0QnVmU2l6ZV9VOCAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0VuY29kZUh1ZmZtYW5TcGVjR2V0QnVmU2l6ZV9VOCwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRW5jb2RlSHVmZm1hblNwZWNJbml0X1U4ICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRW5jb2RlSHVmZm1hblNwZWNJbml0X1U4LCBPTVhJQ0pQX1NVRkZJWCkKLQotI2RlZmluZSBvbXhJUEJNX0FkZENfVThfQzFSX1NmcyAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUEJNX0FkZENfVThfQzFSX1NmcywgT01YSVBCTV9TVUZGSVgpCi0jZGVmaW5lIG9teElQQk1fQ29weV9VOF9DMVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQk1fQ29weV9VOF9DMVIsIE9NWElQQk1fU1VGRklYKQotI2RlZmluZSBvbXhJUEJNX0NvcHlfVThfQzNSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUEJNX0NvcHlfVThfQzNSLCBPTVhJUEJNX1NVRkZJWCkKLSNkZWZpbmUgb214SVBCTV9NaXJyb3JfVThfQzFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBCTV9NaXJyb3JfVThfQzFSLCBPTVhJUEJNX1NVRkZJWCkKLSNkZWZpbmUgb214SVBCTV9NdWxDX1U4X0MxUl9TZnMgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBCTV9NdWxDX1U4X0MxUl9TZnMsIE9NWElQQk1fU1VGRklYKQotCi0jZGVmaW5lIG9teElQQ1NfQ29sb3JUd2lzdFExNF9VOF9DM1IgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfQ29sb3JUd2lzdFExNF9VOF9DM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX0JHUjU2NVRvWUNiQ3I0MjBMU19NQ1VfVTE2X1MxNl9DM1AzUiAgICAgIE9NWENBVEJBUihJUENTX0JHUjU2NVRvWUNiQ3I0MjBMU19NQ1VfVTE2X1MxNl9DM1AzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfQkdSNTY1VG9ZQ2JDcjQyMkxTX01DVV9VMTZfUzE2X0MzUDNSICAgICAgT01YQ0FUQkFSKElQQ1NfQkdSNTY1VG9ZQ2JDcjQyMkxTX01DVV9VMTZfUzE2X0MzUDNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19CR1I1NjVUb1lDYkNyNDQ0TFNfTUNVX1UxNl9TMTZfQzNQM1IgICAgICBPTVhDQVRCQVIoSVBDU19CR1I1NjVUb1lDYkNyNDQ0TFNfTUNVX1UxNl9TMTZfQzNQM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX0JHUjg4OFRvWUNiQ3I0MjBMU19NQ1VfVThfUzE2X0MzUDNSICAgICAgIE9NWENBVEJBUihJUENTX0JHUjg4OFRvWUNiQ3I0MjBMU19NQ1VfVThfUzE2X0MzUDNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19CR1I4ODhUb1lDYkNyNDIyTFNfTUNVX1U4X1MxNl9DM1AzUiAgICAgICBPTVhDQVRCQVIoSVBDU19CR1I4ODhUb1lDYkNyNDIyTFNfTUNVX1U4X1MxNl9DM1AzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfQkdSODg4VG9ZQ2JDcjQ0NExTX01DVV9VOF9TMTZfQzNQM1IgICAgICAgT01YQ0FUQkFSKElQQ1NfQkdSODg4VG9ZQ2JDcjQ0NExTX01DVV9VOF9TMTZfQzNQM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDIwUnN6Q3NjUm90QkdSX1U4X1AzQzNSICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIwUnN6Q3NjUm90QkdSX1U4X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMFJzelJvdF9VOF9QM1IgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMFJzelJvdF9VOF9QM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDIwVG9CR1I1NjVfVThfVTE2X1AzQzNSICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIwVG9CR1I1NjVfVThfVTE2X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMFRvQkdSNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMFRvQkdSNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDIwVG9CR1I4ODhMU19NQ1VfUzE2X1U4X1AzQzNSICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIwVG9CR1I4ODhMU19NQ1VfUzE2X1U4X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMlJzekNzY1JvdEJHUl9VOF9QM0MzUiAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMlJzekNzY1JvdEJHUl9VOF9QM0MzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfQ2JZQ3JZNDIyUnN6Q3NjUm90QkdSX1U4X1UxNl9DMlIgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfQ2JZQ3JZNDIyUnN6Q3NjUm90QkdSX1U4X1UxNl9DMlIsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDIyUnN6Um90X1U4X1AzUiAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIyUnN6Um90X1U4X1AzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiWUNyNDIyVG9CR1I1NjVfVThfVTE2X0MyQzNSICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiWUNyNDIyVG9CR1I1NjVfVThfVTE2X0MyQzNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMlRvQkdSNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMlRvQkdSNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYllDcjQyMlRvQkdSODg4X1U4X0MyQzNSICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYllDcjQyMlRvQkdSODg4X1U4X0MyQzNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMlRvQkdSODg4TFNfTUNVX1MxNl9VOF9QM0MzUiAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMlRvQkdSODg4TFNfTUNVX1MxNl9VOF9QM0MzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjJUb0JHUjg4OExTX01DVV9TMTZfVThfUDNDM1IgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjJUb0JHUjg4OExTX01DVV9TMTZfVThfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX0NiWUNyWTQyMlRvWUNiQ3I0MjBSb3RhdGVfVThfQzJQM1IgICAgICAgIE9NWENBVEJBUihJUENTX0NiWUNyWTQyMlRvWUNiQ3I0MjBSb3RhdGVfVThfQzJQM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDIyVG9ZQ2JDcjQyMFJvdGF0ZV9VOF9QM1IgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIyVG9ZQ2JDcjQyMFJvdGF0ZV9VOF9QM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDQ0VG9CR1I1NjVfVThfVTE2X0MzUiAgICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDQ0VG9CR1I1NjVfVThfVTE2X0MzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiQ3I0NDRUb0JHUjU2NV9VOF9VMTZfUDNDM1IgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0NDRUb0JHUjU2NV9VOF9VMTZfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDQ0VG9CR1I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUiAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDQ0VG9CR1I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiQ3I0NDRUb0JHUjg4OF9VOF9DM1IgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0NDRUb0JHUjg4OF9VOF9DM1IsIE9NWElQQ1NfU1VGRklYKQotCi0jZGVmaW5lIG9teElQUFBfRGVibG9ja19Ib3JFZGdlX1U4X0kgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfRGVibG9ja19Ib3JFZGdlX1U4X0ksIE9NWElQUFBfU1VGRklYKQotI2RlZmluZSBvbXhJUFBQX0RlYmxvY2tfVmVyRWRnZV9VOF9JICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX0RlYmxvY2tfVmVyRWRnZV9VOF9JLCBPTVhJUFBQX1NVRkZJWCkKLSNkZWZpbmUgb214SVBQUF9GaWx0ZXJGSVJfVThfQzFSICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9GaWx0ZXJGSVJfVThfQzFSLCBPTVhJUFBQX1NVRkZJWCkKLSNkZWZpbmUgb214SVBQUF9GaWx0ZXJNZWRpYW5fVThfQzFSICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9GaWx0ZXJNZWRpYW5fVThfQzFSLCBPTVhJUFBQX1NVRkZJWCkKLSNkZWZpbmUgb214SVBQUF9HZXRDZW50cmFsTW9tZW50X1M2NCAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9HZXRDZW50cmFsTW9tZW50X1M2NCwgT01YSVBQUF9TVUZGSVgpCi0jZGVmaW5lIG9teElQUFBfR2V0U3BhdGlhbE1vbWVudF9TNjQgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfR2V0U3BhdGlhbE1vbWVudF9TNjQsIE9NWElQUFBfU1VGRklYKQotI2RlZmluZSBvbXhJUFBQX01vbWVudEdldFN0YXRlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX01vbWVudEdldFN0YXRlU2l6ZSwgT01YSVBQUF9TVUZGSVgpCi0jZGVmaW5lIG9teElQUFBfTW9tZW50SW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfTW9tZW50SW5pdCwgT01YSVBQUF9TVUZGSVgpCi0jZGVmaW5lIG9teElQUFBfTW9tZW50c19VOF9DMVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfTW9tZW50c19VOF9DMVIsIE9NWElQUFBfU1VGRklYKQotI2RlZmluZSBvbXhJUFBQX01vbWVudHNfVThfQzNSICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX01vbWVudHNfVThfQzNSLCBPTVhJUFBQX1NVRkZJWCkKLQotI2RlZmluZSBvbXhTUF9CbG9ja0V4cF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9CbG9ja0V4cF9TMTYsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfQmxvY2tFeHBfUzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfQmxvY2tFeHBfUzMyLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0NvcHlfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0NvcHlfUzE2LCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0RvdFByb2RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0RvdFByb2RfUzE2LCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0RvdFByb2RfUzE2X1NmcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0RvdFByb2RfUzE2X1NmcywgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRGd2RfQ1RvQ19TQzE2X1NmcyAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRGd2RfQ1RvQ19TQzE2X1NmcywgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRGd2RfQ1RvQ19TQzMyX1NmcyAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRGd2RfQ1RvQ19TQzMyX1NmcywgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRGd2RfUlRvQ0NTX1MxNlMzMl9TZnMgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRGd2RfUlRvQ0NTX1MxNlMzMl9TZnMsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRkZURndkX1JUb0NDU19TMzJfU2ZzICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZURndkX1JUb0NDU19TMzJfU2ZzLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEdldEJ1ZlNpemVfQ19TQzE2ICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEdldEJ1ZlNpemVfQ19TQzE2LCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEdldEJ1ZlNpemVfQ19TQzMyICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEdldEJ1ZlNpemVfQ19TQzMyLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEdldEJ1ZlNpemVfUl9TMTZTMzIgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEdldEJ1ZlNpemVfUl9TMTZTMzIsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRkZUR2V0QnVmU2l6ZV9SX1MzMiAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUR2V0QnVmU2l6ZV9SX1MzMiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRJbml0X0NfU0MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbml0X0NfU0MxNiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRJbml0X0NfU0MzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbml0X0NfU0MzMiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRJbml0X1JfUzE2UzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbml0X1JfUzE2UzMyLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEluaXRfUl9TMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEluaXRfUl9TMzIsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRkZUSW52X0NDU1RvUl9TMzJfU2ZzICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUSW52X0NDU1RvUl9TMzJfU2ZzLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEludl9DQ1NUb1JfUzMyUzE2X1NmcyAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEludl9DQ1NUb1JfUzMyUzE2X1NmcywgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRJbnZfQ1RvQ19TQzE2X1NmcyAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbnZfQ1RvQ19TQzE2X1NmcywgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRJbnZfQ1RvQ19TQzMyX1NmcyAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbnZfQ1RvQ19TQzMyX1NmcywgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GaWx0ZXJNZWRpYW5fUzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GaWx0ZXJNZWRpYW5fUzMyLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZpbHRlck1lZGlhbl9TMzJfSSAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZpbHRlck1lZGlhbl9TMzJfSSwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GSVJfRGlyZWN0X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJfRGlyZWN0X1MxNiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GSVJfRGlyZWN0X1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJfRGlyZWN0X1MxNl9JLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZJUl9EaXJlY3RfUzE2X0lTZnMgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUl9EaXJlY3RfUzE2X0lTZnMsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRklSX0RpcmVjdF9TMTZfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklSX0RpcmVjdF9TMTZfU2ZzLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZJUk9uZV9EaXJlY3RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUk9uZV9EaXJlY3RfUzE2LCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZJUk9uZV9EaXJlY3RfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUk9uZV9EaXJlY3RfUzE2X0ksIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRklST25lX0RpcmVjdF9TMTZfSVNmcyAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklST25lX0RpcmVjdF9TMTZfSVNmcywgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GSVJPbmVfRGlyZWN0X1MxNl9TZnMgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJPbmVfRGlyZWN0X1MxNl9TZnMsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfSUlSX0JpUXVhZERpcmVjdF9TMTYgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlSX0JpUXVhZERpcmVjdF9TMTYsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfSUlSX0JpUXVhZERpcmVjdF9TMTZfSSAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlSX0JpUXVhZERpcmVjdF9TMTZfSSwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9JSVJfRGlyZWN0X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJfRGlyZWN0X1MxNiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9JSVJfRGlyZWN0X1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJfRGlyZWN0X1MxNl9JLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0lJUk9uZV9CaVF1YWREaXJlY3RfUzE2ICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUk9uZV9CaVF1YWREaXJlY3RfUzE2LCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0lJUk9uZV9CaVF1YWREaXJlY3RfUzE2X0kgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUk9uZV9CaVF1YWREaXJlY3RfUzE2X0ksIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfSUlST25lX0RpcmVjdF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlST25lX0RpcmVjdF9TMTYsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfSUlST25lX0RpcmVjdF9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlST25lX0RpcmVjdF9TMTZfSSwgT01YU1BfU1VGRklYKQotCi0jZGVmaW5lIG9teFZDQ09NTV9BdmVyYWdlXzE2eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9BdmVyYWdlXzE2eCwgT01YVkNDT01NX1NVRkZJWCkKLSNkZWZpbmUgb214VkNDT01NX0F2ZXJhZ2VfOHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0F2ZXJhZ2VfOHgsIE9NWFZDQ09NTV9TVUZGSVgpCi0jZGVmaW5lIG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2sgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2ssIE9NWFZDQ09NTV9TVUZGSVgpCi0jZGVmaW5lIG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2tfU0FEICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2tfU0FELCBPTVhWQ0NPTU1fU1VGRklYKQotI2RlZmluZSBvbXhWQ0NPTU1fQ29weTE2eDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fQ29weTE2eDE2LCBPTVhWQ0NPTU1fU1VGRklYKQotI2RlZmluZSBvbXhWQ0NPTU1fQ29weTh4OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fQ29weTh4OCwgT01YVkNDT01NX1NVRkZJWCkKLSNkZWZpbmUgb214VkNDT01NX0V4cGFuZEZyYW1lX0kgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0V4cGFuZEZyYW1lX0ksIE9NWFZDQ09NTV9TVUZGSVgpCi0jZGVmaW5lIG9teFZDQ09NTV9MaW1pdE1WVG9SZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9MaW1pdE1WVG9SZWN0LCBPTVhWQ0NPTU1fU1VGRklYKQotI2RlZmluZSBvbXhWQ0NPTU1fU0FEXzE2eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fU0FEXzE2eCwgT01YVkNDT01NX1NVRkZJWCkKLSNkZWZpbmUgb214VkNDT01NX1NBRF84eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX1NBRF84eCwgT01YVkNDT01NX1NVRkZJWCkKLQotI2RlZmluZSBvbXhWQ000UDEwX0F2ZXJhZ2VfNHggICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0F2ZXJhZ2VfNHgsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZiAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZiwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9CbG9ja01hdGNoX1F1YXJ0ZXIgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9CbG9ja01hdGNoX1F1YXJ0ZXIsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSSAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0RlYmxvY2tDaHJvbWFfSSwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfRGVibG9ja0x1bWFfSSAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRGVibG9ja0x1bWFfSSwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQyAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQywgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkIE9NWENBVEJBUihWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSSAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSSwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0kgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0ksIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSSAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSSwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9HZXRWTENJbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9HZXRWTENJbmZvLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYSAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYSwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfQ2hyb21hREMgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfQ2hyb21hREMsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfTHVtYURDICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfTHVtYURDLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1SZXNpZHVhbEFuZEFkZCAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9JbnZUcmFuc2Zvcm1SZXNpZHVhbEFuZEFkZCwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfTUVHZXRCdWZTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfTUVHZXRCdWZTaXplLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9NRUluaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9NRUluaXQsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQiAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQiwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2ICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2LCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0ICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0LCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4ICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfU0FEXzR4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfU0FEXzR4LCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9TQURRdWFyXzE2eCAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9TQURRdWFyXzE2eCwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfU0FEUXVhcl80eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfU0FEUXVhcl80eCwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfU0FEUXVhcl84eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfU0FEUXVhcl84eCwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfU0FURF80eDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfU0FURF80eDQsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX1N1YkFuZFRyYW5zZm9ybVFEUVJlc2lkdWFsICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1N1YkFuZFRyYW5zZm9ybVFEUVJlc2lkdWFsLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpciAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpciwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9DaHJvbWFEQyAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9DaHJvbWFEQywgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfTHVtYURDICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfTHVtYURDLCBPTVhWQ000UDEwX1NVRkZJWCkKLQotI2RlZmluZSBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2ICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2LCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OCAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OCwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl84eDggICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl84eDgsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9EQ1Q4eDhibGsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EQ1Q4eDhibGssIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQywgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX0VuY29kZU1WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0VuY29kZU1WLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhQUNWTEMgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhQUNWTEMsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQywgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX0ZpbmRNVnByZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0ZpbmRNVnByZWQsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9JRENUOHg4YmxrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9JRENUOHg4YmxrLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfTUNSZWNvbkJsb2NrICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfTUNSZWNvbkJsb2NrLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfTUVHZXRCdWZTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfTUVHZXRCdWZTaXplLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfTUVJbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfTUVJbml0LCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfTW90aW9uRXN0aW1hdGlvbk1CICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfTW90aW9uRXN0aW1hdGlvbk1CLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfUXVhbnRJbnRlcl9JICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfUXVhbnRJbnRlcl9JLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfUXVhbnRJbnRyYV9JICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfUXVhbnRJbnRyYV9JLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfUXVhbnRJbnZJbnRlcl9JLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfUXVhbnRJbnZJbnRyYV9JLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50ZXIgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50ZXIsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYSAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYSwgT01YVkNNNFAyX1NVRkZJWCkKLQotCi0jZW5kaWYgLyogX2FybU9NWF9oXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9vbXh0eXBlcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9vbXh0eXBlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTJjYjBkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvb214dHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKioKLSAqIEZpbGU6IG9teHR5cGVzLmgKLSAqIEJyaWVmOiBEZWZpbmVzIGJhc2ljIERhdGEgdHlwZXMgdXNlZCBpbiBPcGVuTUFYIHYxLjAuMiBoZWFkZXIgZmlsZXMuCi0gKgotICogQ29weXJpZ2h0IKkgMjAwNS0yMDA4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCi0gKgotICogVGhlc2UgbWF0ZXJpYWxzIGFyZSBwcm90ZWN0ZWQgYnkgY29weXJpZ2h0IGxhd3MgYW5kIGNvbnRhaW4gbWF0ZXJpYWwgCi0gKiBwcm9wcmlldGFyeSB0byB0aGUgS2hyb25vcyBHcm91cCwgSW5jLiAgWW91IG1heSB1c2UgdGhlc2UgbWF0ZXJpYWxzIAotICogZm9yIGltcGxlbWVudGluZyBLaHJvbm9zIHNwZWNpZmljYXRpb25zLCB3aXRob3V0IGFsdGVyaW5nIG9yIHJlbW92aW5nIAotICogYW55IHRyYWRlbWFyaywgY29weXJpZ2h0IG9yIG90aGVyIG5vdGljZSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uLgotICogCi0gKiBLaHJvbm9zIEdyb3VwIG1ha2VzIG5vLCBhbmQgZXhwcmVzc2x5IGRpc2NsYWltcyBhbnksIHJlcHJlc2VudGF0aW9ucyAKLSAqIG9yIHdhcnJhbnRpZXMsIGV4cHJlc3Mgb3IgaW1wbGllZCwgcmVnYXJkaW5nIHRoZXNlIG1hdGVyaWFscywgaW5jbHVkaW5nLCAKLSAqIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgb3IgZml0bmVzcyAKLSAqIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBvciBub24taW5mcmluZ2VtZW50IG9mIGFueSBpbnRlbGxlY3R1YWwgcHJvcGVydHkuIAotICogS2hyb25vcyBHcm91cCBtYWtlcyBubywgYW5kIGV4cHJlc3NseSBkaXNjbGFpbXMgYW55LCB3YXJyYW50aWVzLCBleHByZXNzIAotICogb3IgaW1wbGllZCwgcmVnYXJkaW5nIHRoZSBjb3JyZWN0bmVzcywgYWNjdXJhY3ksIGNvbXBsZXRlbmVzcywgdGltZWxpbmVzcywgCi0gKiBhbmQgcmVsaWFiaWxpdHkgb2YgdGhlc2UgbWF0ZXJpYWxzLiAKLSAqCi0gKiBVbmRlciBubyBjaXJjdW1zdGFuY2VzIHdpbGwgdGhlIEtocm9ub3MgR3JvdXAsIG9yIGFueSBvZiBpdHMgUHJvbW90ZXJzLCAKLSAqIENvbnRyaWJ1dG9ycyBvciBNZW1iZXJzIG9yIHRoZWlyIHJlc3BlY3RpdmUgcGFydG5lcnMsIG9mZmljZXJzLCBkaXJlY3RvcnMsIAotICogZW1wbG95ZWVzLCBhZ2VudHMgb3IgcmVwcmVzZW50YXRpdmVzIGJlIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMsIHdoZXRoZXIgCi0gKiBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBmb3IgbG9zdCByZXZlbnVlcywgCi0gKiBsb3N0IHByb2ZpdHMsIG9yIG90aGVyd2lzZSwgYXJpc2luZyBmcm9tIG9yIGluIGNvbm5lY3Rpb24gd2l0aCB0aGVzZSAKLSAqIG1hdGVyaWFscy4KLSAqIAotICogS2hyb25vcyBhbmQgT3Blbk1BWCBhcmUgdHJhZGVtYXJrcyBvZiB0aGUgS2hyb25vcyBHcm91cCBJbmMuIAotICoKLSAqLwotICAKLSNpZm5kZWYgX09NWFRZUEVTX0hfCi0jZGVmaW5lIF9PTVhUWVBFU19IXwotCi0jaW5jbHVkZSA8bGltaXRzLmg+IAotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jZGVmaW5lIE9NWF9JTgotI2RlZmluZSBPTVhfT1VUCi0jZGVmaW5lIE9NWF9JTk9VVAotCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgCi0gICAgLyogTWFuZGF0b3J5IHJldHVybiBjb2RlcyAtIHVzZSBjYXNlcyBhcmUgZXhwbGljaXRseSBkZXNjcmliZWQgZm9yIGVhY2ggZnVuY3Rpb24gKi8KLSAgICBPTVhfU3RzX05vRXJyICAgICAgICAgICAgICAgICAgICA9ICAwLCAgICAvKiBObyBlcnJvciwgdGhlIGZ1bmN0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgKi8KLSAgICBPTVhfU3RzX0VyciAgICAgICAgICAgICAgICAgICAgICA9IC0yLCAgICAvKiBVbmtub3duL3Vuc3BlY2lmaWVkIGVycm9yICovICAgIAotICAgIE9NWF9TdHNfSW52YWxpZEJpdHN0cmVhbVZhbEVyciAgID0gLTE4MiwgIC8qIEludmFsaWQgdmFsdWUgZGV0ZWN0ZWQgZHVyaW5nIGJpdHN0cmVhbSBwcm9jZXNzaW5nICovICAgIAotICAgIE9NWF9TdHNfTWVtQWxsb2NFcnIgICAgICAgICAgICAgID0gLTksICAgIC8qIE5vdCBlbm91Z2ggbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGhlIG9wZXJhdGlvbiAqLwotICAgIE9NWF9TdHNBQ0FBQ19HYWluQ3RyRXJyICAgIAkgICAgID0gLTE1OSwgIC8qIEFBQzogVW5zdXBwb3J0ZWQgZ2FpbiBjb250cm9sIGRhdGEgZGV0ZWN0ZWQgKi8KLSAgICBPTVhfU3RzQUNBQUNfUHJnTnVtRXJyICAgICAgICAgICA9IC0xNjcsICAvKiBBQUM6IEludmFsaWQgbnVtYmVyIG9mIGVsZW1lbnRzIGZvciBvbmUgcHJvZ3JhbSAgICovCi0gICAgT01YX1N0c0FDQUFDX0NvZWZWYWxFcnIgICAgICAgICAgPSAtMTYzLCAgLyogQUFDOiBJbnZhbGlkIHF1YW50aXplZCBjb2VmZmljaWVudCB2YWx1ZSAgICAgICAgICAqLyAgICAgCi0gICAgT01YX1N0c0FDQUFDX01heFNmYkVyciAgICAgICAgICAgPSAtMTYyLCAgLyogQUFDOiBJbnZhbGlkIG1heFNmYiB2YWx1ZSBpbiByZWxhdGlvbiB0byBudW1Td2IgKi8gICAgCi0JT01YX1N0c0FDQUFDX1Bsc0RhdGFFcnIJCSAgICAgPSAtMTYwLCAgLyogQUFDOiBwdWxzZSBlc2NhcGUgc2VxdWVuY2UgZGF0YSBlcnJvciAqLwotCi0gICAgLyogT3B0aW9uYWwgcmV0dXJuIGNvZGVzIC0gdXNlIGNhc2VzIGFyZSBleHBsaWNpdGx5IGRlc2NyaWJlZCBmb3IgZWFjaCBmdW5jdGlvbiovCi0gICAgT01YX1N0c19CYWRBcmdFcnIgICAgICAgICAgICAgICAgPSAtNSwgICAgLyogQmFkIEFyZ3VtZW50cyAqLwotCi0gICAgT01YX1N0c0FDQUFDX1Ruc051bUZpbHRFcnIgICAgICAgPSAtMTU3LCAgLyogQUFDOiBJbnZhbGlkIG51bWJlciBvZiBUTlMgZmlsdGVycyAgKi8KLSAgICBPTVhfU3RzQUNBQUNfVG5zTGVuRXJyICAgICAgICAgICA9IC0xNTYsICAvKiBBQUM6IEludmFsaWQgVE5TIHJlZ2lvbiBsZW5ndGggICovICAgCi0gICAgT01YX1N0c0FDQUFDX1Ruc09yZGVyRXJyICAgICAgICAgPSAtMTU1LCAgLyogQUFDOiBJbnZhbGlkIG9yZGVyIG9mIFROUyBmaWx0ZXIgICovICAgICAgICAgICAgICAgICAgCi0gICAgT01YX1N0c0FDQUFDX1Ruc0NvZWZSZXNFcnIgICAgICAgPSAtMTU0LCAgLyogQUFDOiBJbnZhbGlkIGJpdC1yZXNvbHV0aW9uIGZvciBUTlMgZmlsdGVyIGNvZWZmaWNpZW50cyAgKi8KLSAgICBPTVhfU3RzQUNBQUNfVG5zQ29lZkVyciAgICAgICAgICA9IC0xNTMsICAvKiBBQUM6IEludmFsaWQgVE5TIGZpbHRlciBjb2VmZmljaWVudHMgICovICAgICAgICAgICAgICAgICAgCi0gICAgT01YX1N0c0FDQUFDX1Ruc0RpcmVjdEVyciAgICAgICAgPSAtMTUyLCAgLyogQUFDOiBJbnZhbGlkIFROUyBmaWx0ZXIgZGlyZWN0aW9uICAqLyAgCi0KLSAgICBPTVhfU3RzSUNKUF9KUEVHTWFya2VyRXJyICAgICAgICA9IC0xODMsICAvKiBKUEVHIG1hcmtlciBlbmNvdW50ZXJlZCB3aXRoaW4gYW4gZW50cm9weS1jb2RlZCBibG9jazsgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBIdWZmbWFuIGRlY29kaW5nIG9wZXJhdGlvbiB0ZXJtaW5hdGVkIGVhcmx5LiAgICAgICAgICAgKi8KLSAgICBPTVhfU3RzSUNKUF9KUEVHTWFya2VyICAgICAgICAgICA9IC0xODEsICAvKiBKUEVHIG1hcmtlciBlbmNvdW50ZXJlZDsgSHVmZm1hbiBkZWNvZGluZyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9wZXJhdGlvbiB0ZXJtaW5hdGVkIGVhcmx5LiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIE9NWF9TdHNJUFBQX0NvbnRleHRNYXRjaEVyciAgICAgID0gLTE3LCAgIC8qIENvbnRleHQgcGFyYW1ldGVyIGRvZXNuJ3QgbWF0Y2ggdG8gdGhlIG9wZXJhdGlvbiAqLwotCi0gICAgT01YX1N0c1NQX0V2ZW5NZWRpYW5NYXNrU2l6ZUVyciAgPSAtMTgwLCAgLyogRXZlbiBzaXplIG9mIHRoZSBNZWRpYW4gRmlsdGVyIG1hc2sgd2FzIHJlcGxhY2VkIGJ5IHRoZSBvZGQgb25lICovCi0KLSAgICBPTVhfU3RzX01heGltdW1FbnVtZXJhdGlvbiAgICAgICA9IElOVF9NQVggIC8qUGxhY2Vob2xkZXIsIGZvcmNlcyBlbnVtIG9mIHNpemUgT01YX0lOVCovCi0gICAgCi0gfSBPTVhSZXN1bHQ7ICAgICAgICAgIC8qKiBSZXR1cm4gdmFsdWUgb3IgZXJyb3IgdmFsdWUgcmV0dXJuZWQgZnJvbSBhIGZ1bmN0aW9uLiBJZGVudGljYWwgdG8gT01YX0lOVCAqLwotCi0gCi0vKiBPTVhfVTggKi8KLXR5cGVkZWYgdWludDhfdCBPTVhfVTg7Ci0gCi0vKiBPTVhfUzggKi8KLXR5cGVkZWYgaW50OF90IE9NWF9TODsKLSAKLS8qIE9NWF9VMTYgKi8KLXR5cGVkZWYgdWludDE2X3QgT01YX1UxNjsKLQotLyogT01YX1MxNiAqLwotdHlwZWRlZiBpbnQxNl90IE9NWF9TMTY7Ci0KLS8qIE9NWF9VMzIgKi8KLXR5cGVkZWYgdWludDMyX3QgT01YX1UzMjsKLQotLyogT01YX1MzMiAqLwotdHlwZWRlZiBpbnQzMl90IE9NWF9TMzI7Ci0KLS8qIE9NWF9VNjQgJiBPTVhfUzY0ICovCi0jaWYgZGVmaW5lZCggX1dJTjMyICkgfHwgZGVmaW5lZCAoIF9XSU42NCApCi0gICAgdHlwZWRlZiBfX2ludDY0IE9NWF9TNjQ7IC8qKiBTaWduZWQgNjQtYml0IGludGVnZXIgKi8KLSAgICB0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgT01YX1U2NDsgLyoqIFVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyICovCi0gICAgI2RlZmluZSBPTVhfTUlOX1M2NAkJCSgweDgwMDAwMDAwMDAwMDAwMDBpNjQpCi0gICAgI2RlZmluZSBPTVhfTUlOX1U2NAkJCSgweDAwMDAwMDAwMDAwMDAwMDBpNjQpCi0gICAgI2RlZmluZSBPTVhfTUFYX1M2NAkJCSgweDdGRkZGRkZGRkZGRkZGRkZpNjQpCi0gICAgI2RlZmluZSBPTVhfTUFYX1U2NAkJCSgweEZGRkZGRkZGRkZGRkZGRkZpNjQpCi0jZWxzZQotICAgIHR5cGVkZWYgaW50NjRfdCBPTVhfUzY0OyAvKiogU2lnbmVkIDY0LWJpdCBpbnRlZ2VyICovCi0gICAgdHlwZWRlZiB1aW50NjRfdCBPTVhfVTY0OyAvKiogVW5zaWduZWQgNjQtYml0IGludGVnZXIgKi8KLSAgICAjZGVmaW5lIE9NWF9NSU5fUzY0CQkJKDB4ODAwMDAwMDAwMDAwMDAwMExMKQotICAgICNkZWZpbmUgT01YX01JTl9VNjQJCQkoMHgwMDAwMDAwMDAwMDAwMDAwTEwpCi0gICAgI2RlZmluZSBPTVhfTUFYX1M2NAkJCSgweDdGRkZGRkZGRkZGRkZGRkZMTCkKLSAgICAjZGVmaW5lIE9NWF9NQVhfVTY0CQkJKDB4RkZGRkZGRkZGRkZGRkZGRkxMKQotI2VuZGlmCi0KLS8qIE9NWF9TQzggKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIE9NWF9TOCBSZTsgLyoqIFJlYWwgcGFydCAqLwotICBPTVhfUzggSW07IC8qKiBJbWFnaW5hcnkgcGFydCAqLwkKLQkKLX0gT01YX1NDODsgLyoqIFNpZ25lZCA4LWJpdCBjb21wbGV4IG51bWJlciAqLwotCi0KLS8qIE9NWF9TQzE2ICovCi10eXBlZGVmIHN0cnVjdAotewotICBPTVhfUzE2IFJlOyAvKiogUmVhbCBwYXJ0ICovCi0gIE9NWF9TMTYgSW07IC8qKiBJbWFnaW5hcnkgcGFydCAqLwkKLQkKLX0gT01YX1NDMTY7IC8qKiBTaWduZWQgMTYtYml0IGNvbXBsZXggbnVtYmVyICovCi0KLQotLyogT01YX1NDMzIgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIE9NWF9TMzIgUmU7IC8qKiBSZWFsIHBhcnQgKi8KLSAgT01YX1MzMiBJbTsgLyoqIEltYWdpbmFyeSBwYXJ0ICovCQotCQotfSBPTVhfU0MzMjsgLyoqIFNpZ25lZCAzMi1iaXQgY29tcGxleCBudW1iZXIgKi8KLQotCi0vKiBPTVhfU0M2NCAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgT01YX1M2NCBSZTsgLyoqIFJlYWwgcGFydCAqLwotICBPTVhfUzY0IEltOyAvKiogSW1hZ2luYXJ5IHBhcnQgKi8JCi0JCi19IE9NWF9TQzY0OyAvKiogU2lnbmVkIDY0LWJpdCBjb21wbGV4IG51bWJlciAqLwotCi0KLS8qIE9NWF9GMzIgKi8KLXR5cGVkZWYgZmxvYXQgT01YX0YzMjsgLyoqIFNpbmdsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQsSUVFRSA3NTQgKi8KLQotCi0vKiBPTVhfRjY0ICovCi10eXBlZGVmIGRvdWJsZSBPTVhfRjY0OyAvKiogRG91YmxlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCxJRUVFIDc1NCAqLwotCi0KLS8qIE9NWF9JTlQgKi8KLXR5cGVkZWYgaW50IE9NWF9JTlQ7IC8qKiBzaWduZWQgaW50ZWdlciBjb3JyZXNwb25kaW5nIHRvIG1hY2hpbmUgd29yZCBsZW5ndGgsIGhhcyBtYXhpbXVtIHNpZ25lZCB2YWx1ZSBJTlRfTUFYKi8KLQotCi0jZGVmaW5lIE9NWF9NSU5fUzggIAkgICAJKC0xMjgpCi0jZGVmaW5lIE9NWF9NSU5fVTggIAkJMAotI2RlZmluZSBPTVhfTUlOX1MxNgkJIAkoLTMyNzY4KQotI2RlZmluZSBPTVhfTUlOX1UxNgkJCTAKLSNkZWZpbmUgT01YX01JTl9TMzIJCQkoLTIxNDc0ODM2NDctMSkKLSNkZWZpbmUgT01YX01JTl9VMzIJCQkwCi0KLSNkZWZpbmUgT01YX01BWF9TOAkJCSgxMjcpCi0jZGVmaW5lIE9NWF9NQVhfVTgJCQkoMjU1KQotI2RlZmluZSBPTVhfTUFYX1MxNgkJCSgzMjc2NykKLSNkZWZpbmUgT01YX01BWF9VMTYJCQkoMHhGRkZGKQotI2RlZmluZSBPTVhfTUFYX1MzMgkJCSgyMTQ3NDgzNjQ3KQotI2RlZmluZSBPTVhfTUFYX1UzMgkJCSgweEZGRkZGRkZGKQotCi10eXBlZGVmIHZvaWQgT01YVm9pZDsKLQotI2lmbmRlZiBOVUxMCi0jZGVmaW5lIE5VTEwgKCh2b2lkKikwKQotI2VuZGlmCi0KLS8qKiBEZWZpbmVzIHRoZSBnZW9tZXRyaWMgcG9zaXRpb24gYW5kIHNpemUgb2YgYSByZWN0YW5nbGUsIAotICAqIHdoZXJlIHgseSBkZWZpbmVzIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgdG9wIGxlZnQgY29ybmVyCi0gICogb2YgdGhlIHJlY3RhbmdsZSwgd2l0aCBkaW1lbnNpb25zIHdpZHRoIGluIHRoZSB4LWRpcmVjdGlvbiAKLSAgKiBhbmQgaGVpZ2h0IGluIHRoZSB5LWRpcmVjdGlvbiAqLwotdHlwZWRlZiBzdHJ1Y3QgewotCU9NWF9JTlQgeDsgICAgICAvKiogeC1jb29yZGluYXRlIG9mIHRvcCBsZWZ0IGNvcm5lciBvZiByZWN0YW5nbGUgKi8KLQlPTVhfSU5UIHk7ICAgICAgLyoqIHktY29vcmRpbmF0ZSBvZiB0b3AgbGVmdCBjb3JuZXIgb2YgcmVjdGFuZ2xlICovCi0JT01YX0lOVCB3aWR0aDsgIC8qKiBXaWR0aCBpbiB0aGUgeC1kaXJlY3Rpb24uICovCi0JT01YX0lOVCBoZWlnaHQ7IC8qKiBIZWlnaHQgaW4gdGhlIHktZGlyZWN0aW9uLiAqLwotfU9NWFJlY3Q7Ci0KLQotLyoqIERlZmluZXMgdGhlIGdlb21ldHJpYyBwb3NpdGlvbiBvZiBhIHBvaW50LCAqLwotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gT01YX0lOVCB4OyAvKiogeC1jb29yZGluYXRlICovCi0gT01YX0lOVCB5OwkvKiogeS1jb29yZGluYXRlICovCi0JCi19IE9NWFBvaW50OwotCi0KLS8qKiBEZWZpbmVzIHRoZSBkaW1lbnNpb25zIG9mIGEgcmVjdGFuZ2xlLCBvciByZWdpb24gb2YgaW50ZXJlc3QgaW4gYW4gaW1hZ2UgKi8KLXR5cGVkZWYgc3RydWN0IAotewotIE9NWF9JTlQgd2lkdGg7ICAvKiogV2lkdGggb2YgdGhlIHJlY3RhbmdsZSwgaW4gdGhlIHgtZGlyZWN0aW9uICovCi0gT01YX0lOVCBoZWlnaHQ7IC8qKiBIZWlnaHQgb2YgdGhlIHJlY3RhbmdsZSwgaW4gdGhlIHktZGlyZWN0aW9uICovCi0JCi19IE9NWFNpemU7Ci0KLSNlbmRpZiAvKiBfT01YVFlQRVNfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvb214dHlwZXNfcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9vbXh0eXBlc19zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlNzQyYzcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9vbXh0eXBlc19zLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgb214dHlwZXNfcy5oCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgMTIyOTAKLTsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi07Ly8gTWFuZGF0b3J5IHJldHVybiBjb2RlcyAtIHVzZSBjYXNlcyBhcmUgZXhwbGljaXRseSBkZXNjcmliZWQgZm9yIGVhY2ggZnVuY3Rpb24gCi1PTVhfU3RzX05vRXJyICAgICAgICAgICAgICAgICAgICBFUVUgIDAgICAgOy8vIE5vIGVycm9yIHRoZSBmdW5jdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IAotT01YX1N0c19FcnIgICAgICAgICAgICAgICAgICAgICAgRVFVIC0yICAgIDsvLyBVbmtub3duL3Vuc3BlY2lmaWVkIGVycm9yICAgICAKLU9NWF9TdHNfSW52YWxpZEJpdHN0cmVhbVZhbEVyciAgIEVRVSAtMTgyICA7Ly8gSW52YWxpZCB2YWx1ZSBkZXRlY3RlZCBkdXJpbmcgYml0c3RyZWFtIHByb2Nlc3NpbmcgICAgIAotT01YX1N0c19NZW1BbGxvY0VyciAgICAgICAgICAgICAgRVFVIC05ICAgIDsvLyBOb3QgZW5vdWdoIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRoZSBvcGVyYXRpb24gCi1PTVhfU3RzQUNBQUNfR2FpbkN0ckVyciAgICAJICAgICBFUVUgLTE1OSAgOy8vIEFBQzogVW5zdXBwb3J0ZWQgZ2FpbiBjb250cm9sIGRhdGEgZGV0ZWN0ZWQgCi1PTVhfU3RzQUNBQUNfUHJnTnVtRXJyICAgICAgICAgICBFUVUgLTE2NyAgOy8vIEFBQzogSW52YWxpZCBudW1iZXIgb2YgZWxlbWVudHMgZm9yIG9uZSBwcm9ncmFtICAgCi1PTVhfU3RzQUNBQUNfQ29lZlZhbEVyciAgICAgICAgICBFUVUgLTE2MyAgOy8vIEFBQzogSW52YWxpZCBxdWFudGl6ZWQgY29lZmZpY2llbnQgdmFsdWUgICAgICAgICAgICAgICAKLU9NWF9TdHNBQ0FBQ19NYXhTZmJFcnIgICAgICAgICAgIEVRVSAtMTYyICA7Ly8gQUFDOiBJbnZhbGlkIG1heFNmYiB2YWx1ZSBpbiByZWxhdGlvbiB0byBudW1Td2IgICAgIAotT01YX1N0c0FDQUFDX1Bsc0RhdGFFcnIJCSAgICAgRVFVIC0xNjAgIDsvLyBBQUM6IHB1bHNlIGVzY2FwZSBzZXF1ZW5jZSBkYXRhIGVycm9yIAotCi07Ly8gT3B0aW9uYWwgcmV0dXJuIGNvZGVzIC0gdXNlIGNhc2VzIGFyZSBleHBsaWNpdGx5IGRlc2NyaWJlZCBmb3IgZWFjaCBmdW5jdGlvbgotT01YX1N0c19CYWRBcmdFcnIgICAgICAgICAgICAgICAgRVFVIC01ICAgIDsvLyBCYWQgQXJndW1lbnRzIAotCi1PTVhfU3RzQUNBQUNfVG5zTnVtRmlsdEVyciAgICAgICBFUVUgLTE1NyAgOy8vIEFBQzogSW52YWxpZCBudW1iZXIgb2YgVE5TIGZpbHRlcnMgIAotT01YX1N0c0FDQUFDX1Ruc0xlbkVyciAgICAgICAgICAgRVFVIC0xNTYgIDsvLyBBQUM6IEludmFsaWQgVE5TIHJlZ2lvbiBsZW5ndGggICAgIAotT01YX1N0c0FDQUFDX1Ruc09yZGVyRXJyICAgICAgICAgRVFVIC0xNTUgIDsvLyBBQUM6IEludmFsaWQgb3JkZXIgb2YgVE5TIGZpbHRlciAgICAgICAgICAgICAgICAgICAgCi1PTVhfU3RzQUNBQUNfVG5zQ29lZlJlc0VyciAgICAgICBFUVUgLTE1NCAgOy8vIEFBQzogSW52YWxpZCBiaXQtcmVzb2x1dGlvbiBmb3IgVE5TIGZpbHRlciBjb2VmZmljaWVudHMgIAotT01YX1N0c0FDQUFDX1Ruc0NvZWZFcnIgICAgICAgICAgRVFVIC0xNTMgIDsvLyBBQUM6IEludmFsaWQgVE5TIGZpbHRlciBjb2VmZmljaWVudHMgICAgICAgICAgICAgICAgICAgIAotT01YX1N0c0FDQUFDX1Ruc0RpcmVjdEVyciAgICAgICAgRVFVIC0xNTIgIDsvLyBBQUM6IEludmFsaWQgVE5TIGZpbHRlciBkaXJlY3Rpb24gICAgCi0KLU9NWF9TdHNJQ0pQX0pQRUdNYXJrZXJFcnIgICAgICAgIEVRVSAtMTgzICA7Ly8gSlBFRyBtYXJrZXIgZW5jb3VudGVyZWQgd2l0aGluIGFuIGVudHJvcHktY29kZWQgYmxvY2s7IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSHVmZm1hbiBkZWNvZGluZyBvcGVyYXRpb24gdGVybWluYXRlZCBlYXJseS4gICAgICAgICAgIAotT01YX1N0c0lDSlBfSlBFR01hcmtlciAgICAgICAgICAgRVFVIC0xODEgIDsvLyBKUEVHIG1hcmtlciBlbmNvdW50ZXJlZDsgSHVmZm1hbiBkZWNvZGluZyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIG9wZXJhdGlvbiB0ZXJtaW5hdGVkIGVhcmx5LiAgICAgICAgICAgICAgICAgICAgICAgICAKLU9NWF9TdHNJUFBQX0NvbnRleHRNYXRjaEVyciAgICAgIEVRVSAtMTcgICA7Ly8gQ29udGV4dCBwYXJhbWV0ZXIgZG9lc24ndCBtYXRjaCB0byB0aGUgb3BlcmF0aW9uIAotCi1PTVhfU3RzU1BfRXZlbk1lZGlhbk1hc2tTaXplRXJyICBFUVUgLTE4MCAgOy8vIEV2ZW4gc2l6ZSBvZiB0aGUgTWVkaWFuIEZpbHRlciBtYXNrIHdhcyByZXBsYWNlZCBieSB0aGUgb2RkIG9uZSAKLQotT01YX1N0c19NYXhpbXVtRW51bWVyYXRpb24gICAgICAgRVFVIDB4N0ZGRkZGRkYKLQotCi0KLU9NWF9NSU5fUzggICAgICBFUVUgCSAgIAkoLTEyOCkKLU9NWF9NSU5fVTggIAlFUVUgICAgIAkwCi1PTVhfTUlOX1MxNgkJRVFVICAgICAgCSgtMzI3NjgpCi1PTVhfTUlOX1UxNgkJRVFVCSAgICAgICAgMAotCi0KLU9NWF9NSU5fUzMyCQlFUVUJKC0yMTQ3NDgzNjQ3LTEpCi1PTVhfTUlOX1UzMgkJRVFVCTAKLQotT01YX01BWF9TOAkJRVFVCSgxMjcpCi1PTVhfTUFYX1U4CQlFUVUJKDI1NSkKLU9NWF9NQVhfUzE2CQlFUVUJKDMyNzY3KQotT01YX01BWF9VMTYJCUVRVQkoMHhGRkZGKQotT01YX01BWF9TMzIJCUVRVQkoMjE0NzQ4MzY0NykKLU9NWF9NQVhfVTMyCQlFUVUJKDB4RkZGRkZGRkYpCi0KLU9NWF9WQ19VUFBFUiAgICBFUVUgMHgxICAgICAgICAgICAgICAgICA7Ly8gVXNlZCBieSB0aGUgUHJlZGljdEludHJhIGZ1bmN0aW9ucyAgIAotT01YX1ZDX0xFRlQgICAgIEVRVSAweDIgICAgICAgICAgICAgICAgIDsvLyBVc2VkIGJ5IHRoZSBQcmVkaWN0SW50cmEgZnVuY3Rpb25zIAotT01YX1ZDX1VQUEVSX1JJR0hUICAgIEVRVSAweDQwICAgICAgICAgIDsvLyBVc2VkIGJ5IHRoZSBQcmVkaWN0SW50cmEgZnVuY3Rpb25zICAgCi0KLU5VTEwgICAgRVFVIDAKLQotOy8vIFN0cnVjdHVyZXMKLQotICAgIElOQ0xVREUgICAgIGFybUNPTU1fcy5oCi0KLSAgICBNX1NUUlVDVCAgICBPTVhQb2ludAotICAgIE1fRklFTEQgICAgIHgsIDQKLSAgICBNX0ZJRUxEICAgICB5LCA0Ci0gICAgTV9FTkRTVFJVQ1QKLQotICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9idWlsZF92Yy5wbCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9idWlsZF92Yy5wbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmEyMDZjMC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYnVpbGRfdmMucGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotIyEvdXNyL2Jpbi9wZXJsCi0jCi0jIAotIyBGaWxlIE5hbWU6ICBidWlsZF92Yy5wbAotIyBPcGVuTUFYIERMOiB2MS4wLjIKLSMgUmV2aXNpb246ICAgMTIyOTAKLSMgRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci0jIAotIyAKLSMgCi0jCi0jIFRoaXMgZmlsZSBidWlsZHMgdGhlIE9wZW5NQVggREwgdmMgZG9tYWluIGxpYnJhcnkgb214VkMuby4KLSMKLQotdXNlIEZpbGU6OlNwZWM7Ci11c2Ugc3RyaWN0OwotCi1teSAoJENDLCAkQ0NfT1BUUywgJEFTLCAkQVNfT1BUUywgJExJQiwgJExJQl9PUFRTLCAkTElCX1RZUEUpOwotCi0kQ0MgICAgICAgPSAnYXJtY2MnOwotJENDX09QVFMgID0gJy0tbm9fdW5hbGlnbmVkX2FjY2VzcyAtLWNwdSBDb3J0ZXgtQTggLWMnOwotJEFTICAgICAgID0gJ2FybWFzbSc7Ci0kQVNfT1BUUyAgPSAnLS1ub191bmFsaWduZWRfYWNjZXNzIC0tY3B1IENvcnRleC1BOCc7Ci0jICRMSUIgICAgICA9ICdhcm1saW5rJzsKLSMgJExJQl9PUFRTID0gJy0tcGFydGlhbCAtbyc7Ci0jICRMSUJfVFlQRSA9ICcubyc7Ci0kTElCICAgICAgPSAnYXJtYXInOwotJExJQl9PUFRTID0gJy0tY3JlYXRlIC1yJzsKLSRMSUJfVFlQRSA9ICcuYSc7Ci0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotbXkgKEBoZWFkZXJsaXN0LCBAZmlsZWxpc3QsICRoZCwgJGZpbGUsICRvZmlsZSwgJGNvbW1hbmQsICRvYmpsaXN0LCAkbGliZmlsZSwgJGgpOwotCi0jIERlZmluZSB0aGUgbGlzdCBvZiBkaXJlY3RvcmllcyBjb250YWluaW5nIGluY2x1ZGVkIGhlYWRlciBmaWxlcy4KLUBoZWFkZXJsaXN0ID0gcXcoYXBpIHZjL2FwaSB2Yy9tNHAyL2FwaSB2Yy9tNHAxMC9hcGkpOwotCi0jIERlZmluZSB0aGUgbGlzdCBvZiBzb3VyY2UgZmlsZXMgdG8gY29tcGlsZS4KLW9wZW4oRklMRVMsICc8ZmlsZWxpc3RfdmMudHh0Jykgb3IgZGllKCJDYW4ndCBvcGVuIHNvdXJjZSBmaWxlIGxpc3RcbiIpOwotQGZpbGVsaXN0ID0gPEZJTEVTPjsKLWNsb3NlKEZJTEVTKTsKLQotIyBGaXggdGhlIGZpbGUgc2VwYXJhdG9ycyBpbiB0aGUgaGVhZGVyIHBhdGhzCi1mb3JlYWNoICRoIChAaGVhZGVybGlzdCkKLXsKLSAgICAgICAgJGggPSBGaWxlOjpTcGVjLT5jYW5vbnBhdGgoJGgpOwotfQotCi0jIENyZWF0ZSB0aGUgaW5jbHVkZSBwYXRoIHRvIGJlIHBhc3NlZCB0byB0aGUgY29tcGlsZXIKLSRoZCA9ICctSScgLiBqb2luKCcgLUknLCBAaGVhZGVybGlzdCk7Ci0KLSMgQ3JlYXRlIHRoZSBidWlsZCBkaXJlY3RvcmllcyAiL2xpYi8iIGFuZCAiL29iai8iIChpZiB0aGV5IGFyZSBub3QgdGhlcmUgYWxyZWFkeSkKLW1rZGlyICJvYmoiLCAwNzc3IGlmICghIC1kICJvYmoiKTsKLW1rZGlyICJsaWIiLCAwNzc3IGlmICghIC1kICJsaWIiKTsKLQotJG9iamxpc3QgPSAnJzsKLQotIyBDb21waWxlIGVhY2ggZmlsZQotZm9yZWFjaCAkZmlsZSAoQGZpbGVsaXN0KQotewotCW15ICRmOwotCW15ICRiYXNlOwotCW15ICRleHQ7Ci0JbXkgJG9iamZpbGU7Ci0KLQljaG9tcCgkZmlsZSk7Ci0JJGZpbGUgPSBGaWxlOjpTcGVjLT5jYW5vbnBhdGgoJGZpbGUpOwotCi0JKHVuZGVmLCB1bmRlZiwgJGYpID0gRmlsZTo6U3BlYy0+c3BsaXRwYXRoKCRmaWxlKTsKLSAgICAkZj1+cy9bXG5cZlxyXS8vZzsgIyBSZW1vdmUgYW55IGVuZC1vZi1saW5lIGNoYXJhY3RlcnMKLQotCWlmKCgkYmFzZSwgJGV4dCkgPSAkZiA9fiAvKC4rKVwuKFx3KSQvKQotCXsKLQkJJG9iamZpbGUgPSBGaWxlOjpTcGVjLT5jYXRmaWxlKCdvYmonLCAkYmFzZS4nLm8nKTsKLQotCQlpZigkZXh0IGVxICdjJykKLQkJewotCQkJJG9iamxpc3QgLj0gIiRvYmpmaWxlICI7Ci0JCQkkY29tbWFuZCA9ICRDQy4nICcuJENDX09QVFMuJyAnLiRoZC4nIC1vICcuJG9iamZpbGUuJyAnLiRmaWxlOwotCQkJcHJpbnQgIiRjb21tYW5kXG4iOwotCQkJc3lzdGVtKCRjb21tYW5kKTsKLQkJfQotCQllbHNpZigkZXh0IGVxICdzJykKLQkJewotCQkJJG9iamxpc3QgLj0gIiRvYmpmaWxlICI7Ci0JCQkkY29tbWFuZCA9ICRBUy4nICcuJEFTX09QVFMuJyAnLiRoZC4nIC1vICcuJG9iamZpbGUuJyAnLiRmaWxlOwotCQkJcHJpbnQgIiRjb21tYW5kXG4iOwotCQkJc3lzdGVtKCRjb21tYW5kKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXByaW50ICJJZ25vcmluZyBmaWxlOiAkZlxuIjsKLQkJfQotCX0KLQllbHNlCi0JewotCQlkaWUgIk5vIGZpbGUgZXh0ZW5zaW9uIGZvdW5kOiAkZlxuIjsKLQl9Ci19Ci0KLSMgRG8gdGhlIGZpbmFsIGxpbmsgc3RhZ2UgdG8gY3JlYXRlIHRoZSBsaWJyYXJpZXMuCi0kbGliZmlsZSA9IEZpbGU6OlNwZWMtPmNhdGZpbGUoJ2xpYicsICdvbXhWQycuJExJQl9UWVBFKTsKLSRjb21tYW5kID0gJExJQi4nICcuJExJQl9PUFRTLicgJy4kbGliZmlsZS4nICcuJG9iamxpc3Q7Ci1wcmludCAiJGNvbW1hbmRcbiI7Ci0oc3lzdGVtKCRjb21tYW5kKSA9PSAwKSBhbmQgcHJpbnQgIkJ1aWxkIHN1Y2Nlc3NmdWxcbiI7Ci0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9maWxlbGlzdF92Yy50eHQgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vZmlsZWxpc3RfdmMudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGI4ZWViLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9maWxlbGlzdF92Yy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0uL2FwaS9hcm1DT01NLmgKLS4vYXBpL2FybUNPTU1fQml0RGVjX3MuaAotLi9hcGkvYXJtQ09NTV9CaXRzdHJlYW0uaAotLi9hcGkvYXJtQ09NTV9JRENUX3MuaAotLi9hcGkvYXJtQ09NTV9JRENUVGFibGUuaAotLi9hcGkvYXJtQ09NTV9NYXNrVGFibGUuaAotLi9hcGkvYXJtQ09NTV9zLmgKLS4vYXBpL2FybUNPTU1fVmVyc2lvbi5oCi0uL2FwaS9hcm1PTVhfUmVsZWFzZVZlcnNpb24uaAotLi9hcGkvb214dHlwZXMuaAotLi9hcGkvb214dHlwZXNfcy5oCi0uL3NyYy9hcm1DT01NX0lEQ1RUYWJsZS5jCi0uL3NyYy9hcm1DT01NX01hc2tUYWJsZS5jCi0uL3ZjL2FwaS9hcm1WQy5oCi0uL3ZjL2FwaS9hcm1WQ0NPTU1fcy5oCi0uL3ZjL2FwaS9vbXhWQy5oCi0uL3ZjL2FwaS9vbXhWQ19zLmgKLS4vdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHkxNngxNl9zLnMKLS4vdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHk4eDhfcy5zCi0uL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9FeHBhbmRGcmFtZV9JX3MucwotLi92Yy9tNHAxMC9hcGkvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0F2ZXJhZ2VfNHhfQWxpZ25fdW5zYWZlX3MucwotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5jCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFfdW5zYWZlX3MucwotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYV91bnNhZmVfcy5zCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcl9zLnMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVxdWFudFRhYmxlc19zLnMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX3MucwotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQWxpZ25fdW5zYWZlX3MucwotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weV91bnNhZmVfcy5zCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9EaWFnQ29weV91bnNhZmVfcy5zCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmVfcy5zCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmVfcy5zCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZV9zLnMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlX3MucwotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9RdWFudFRhYmxlc19zLnMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDRfcy5zCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0X3MucwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kuYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JLmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQy5jCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGRfcy5zCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JX3MucwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSV9zLnMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JX3MucwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0lfcy5zCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX3MucwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTZfcy5zCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDRfcy5zCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDhfcy5zCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyX3MucwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXJfcy5zCi0uL3ZjL200cDIvYXBpL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaAotLi92Yy9tNHAyL2FwaS9hcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oCi0uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9DbGlwOF9zLnMKLS4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmVfcy5zCi0uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYwotLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfTG9va3VwX1RhYmxlcy5jCi0uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9TZXRQcmVkRGlyX3MucwotLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfWmlnemFnX1RhYmxlcy5jCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIuYwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhLmMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1Bfcy5zCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXJfcy5zCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQ19zLnMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDX3MucwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRmluZE1WcHJlZF9zLnMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0lEQ1Q4eDhibGtfcy5zCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9NQ1JlY29uQmxvY2tfcy5zCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmFfcy5zCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludGVyX0lfcy5zCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludHJhX0lfcy5zCi0uL3ZjL3NyYy9hcm1WQ19WZXJzaW9uLmMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vc3JjL2FybUNPTU0uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9zcmMvYXJtQ09NTS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGRiZjQxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9zcmMvYXJtQ09NTS5jCisrKyAvZGV2L251bGwKQEAgLTEsOTUxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1DT01NLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBEZWZpbmVzIENvbW1vbiBBUElzIHVzZWQgYWNyb3NzIE9wZW5NQVggQVBJJ3MKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgICAgICAvKiBNaXNjZWxsYW5lb3VzIEFyaXRobWV0aWMgb3BlcmF0aW9ucyAqLwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1Sb3VuZEZsb2F0VG9TMTYKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgc2hvcnQgaW50IGFmdGVyIHJvdW5kaW5nCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1MxNiBmb3JtYXQKLSAqCi0gKi8KLQotT01YX1MxNiBhcm1Sb3VuZEZsb2F0VG9TMTYgKE9NWF9GNjQgVmFsdWUpCi17Ci0gICAgaWYgKFZhbHVlID4gMCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoT01YX1MxNikoVmFsdWUgKyAuNSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJldHVybiAoT01YX1MxNikoVmFsdWUgLSAuNSk7Ci0gICAgfQotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1Sb3VuZEZsb2F0VG9TMzIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgaW50IGFmdGVyIHJvdW5kaW5nCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1MzMiBmb3JtYXQKLSAqCi0gKi8KLQotT01YX1MzMiBhcm1Sb3VuZEZsb2F0VG9TMzIgKE9NWF9GNjQgVmFsdWUpCi17Ci0gICAgaWYgKFZhbHVlID4gMCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoT01YX1MzMikoVmFsdWUgKyAuNSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJldHVybiAoT01YX1MzMikoVmFsdWUgLSAuNSk7Ci0gICAgfQotfQotLyoqCi0gKiBGdW5jdGlvbjogYXJtU2F0Um91bmRGbG9hdFRvUzE2Ci0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIHNob3J0IGludCBhZnRlciByb3VuZGluZyBhbmQgc2F0dXJhdGlvbgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9TMTYgZm9ybWF0Ci0gKgotICovCi0KLU9NWF9TMTYgYXJtU2F0Um91bmRGbG9hdFRvUzE2IChPTVhfRjY0IFZhbHVlKQotewotICAgIGlmIChWYWx1ZSA+IDApCi0gICAgewotICAgICAgICBWYWx1ZSArPSAwLjU7Ci0gICAgICAgIAotICAgICAgICBpZihWYWx1ZSA+IChPTVhfUzE2KU9NWF9NQVhfUzE2ICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChPTVhfUzE2KU9NWF9NQVhfUzE2OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChPTVhfUzE2KVZhbHVlOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIFZhbHVlIC09IDAuNTsKLQotICAgICAgICBpZihWYWx1ZSA8IChPTVhfUzE2KU9NWF9NSU5fUzE2ICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChPTVhfUzE2KU9NWF9NSU5fUzE2OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChPTVhfUzE2KVZhbHVlOwotICAgICAgICB9Ci0gICAgfQotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1TYXRSb3VuZEZsb2F0VG9TMzIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgaW50IGFmdGVyIHJvdW5kaW5nIGFuZCBzYXR1cmF0aW9uCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1MzMiBmb3JtYXQKLSAqCi0gKi8KLQotT01YX1MzMiBhcm1TYXRSb3VuZEZsb2F0VG9TMzIgKE9NWF9GNjQgVmFsdWUpCi17Ci0gICAgaWYgKFZhbHVlID4gMCkKLSAgICB7Ci0gICAgICAgIFZhbHVlICs9IDAuNTsKLSAgICAgICAgCi0gICAgICAgIGlmKFZhbHVlID4gKE9NWF9TMzIpT01YX01BWF9TMzIgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKE9NWF9TMzIpT01YX01BWF9TMzI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKE9NWF9TMzIpVmFsdWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgVmFsdWUgLT0gMC41OwotCi0gICAgICAgIGlmKFZhbHVlIDwgKE9NWF9TMzIpT01YX01JTl9TMzIgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKE9NWF9TMzIpT01YX01JTl9TMzI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKE9NWF9TMzIpVmFsdWU7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVNhdFJvdW5kRmxvYXRUb1UxNgotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSB1bnNpZ25lZCBzaG9ydCBpbnQgYWZ0ZXIgcm91bmRpbmcgYW5kIHNhdHVyYXRpb24KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfVTE2IGZvcm1hdAotICoKLSAqLwotCi1PTVhfVTE2IGFybVNhdFJvdW5kRmxvYXRUb1UxNiAoT01YX0Y2NCBWYWx1ZSkKLXsKLSAgICBWYWx1ZSArPSAwLjU7Ci0gICAgCi0gICAgaWYoVmFsdWUgPiAoT01YX1UxNilPTVhfTUFYX1UxNiApCi0gICAgewotICAgICAgICByZXR1cm4gKE9NWF9VMTYpT01YX01BWF9VMTY7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJldHVybiAoT01YX1UxNilWYWx1ZTsKLSAgICB9Ci19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVNhdFJvdW5kRmxvYXRUb1UzMgotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSB1bnNpZ25lZCBpbnQgYWZ0ZXIgcm91bmRpbmcgYW5kIHNhdHVyYXRpb24KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfVTMyIGZvcm1hdAotICoKLSAqLwotCi1PTVhfVTMyIGFybVNhdFJvdW5kRmxvYXRUb1UzMiAoT01YX0Y2NCBWYWx1ZSkKLXsKLSAgICBWYWx1ZSArPSAwLjU7Ci0gICAgCi0gICAgaWYoVmFsdWUgPiAoT01YX1UzMilPTVhfTUFYX1UzMiApCi0gICAgewotICAgICAgICByZXR1cm4gKE9NWF9VMzIpT01YX01BWF9VMzI7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJldHVybiAoT01YX1UzMilWYWx1ZTsKLSAgICB9Ci19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVJvdW5kRmxvYXRUb1M2NAotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSA2NCBiaXQgaW50IGFmdGVyIHJvdW5kaW5nCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1M2NCBmb3JtYXQKLSAqCi0gKi8KLQotT01YX1M2NCBhcm1Sb3VuZEZsb2F0VG9TNjQgKE9NWF9GNjQgVmFsdWUpCi17Ci0gICAgaWYgKFZhbHVlID4gMCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoT01YX1M2NCkoVmFsdWUgKyAuNSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJldHVybiAoT01YX1M2NCkoVmFsdWUgLSAuNSk7Ci0gICAgfQotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1TaWduQ2hlY2sKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENoZWNrcyB0aGUgc2lnbiBvZiBhIHZhcmlhYmxlOgotICogcmV0dXJucyAxIGlmIGl0IGlzIFBvc2l0aXZlCi0gKiByZXR1cm5zIDAgaWYgaXQgaXMgMAotICogcmV0dXJucyAtMSBpZiBpdCBpcyBOZWdhdGl2ZSAKLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCSAgICB2YXIgICAgIFZhcmlhYmxlIHRvIGJlIGNoZWNrZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfSU5UIC0tICAgcmV0dXJucyAxIGlmIGl0IGlzIFBvc2l0aXZlCi0gKiAgICAgICAgICAgICAgcmV0dXJucyAwIGlmIGl0IGlzIDAKLSAqICAgICAgICAgICAgICByZXR1cm5zIC0xIGlmIGl0IGlzIE5lZ2F0aXZlIAotICovIAotCi1PTVhfSU5UIGFybVNpZ25DaGVjayAoCi0gICAgT01YX1MxNiB2YXIKLSkKLQotewotICAgIE9NWF9JTlQgU2lnbjsKLSAgICAKLSAgICBpZiAodmFyIDwgMCkKLSAgICB7Ci0gICAgICAgIFNpZ24gPSAtMTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIHZhciA+IDApCi0gICAgewotICAgICAgICBTaWduID0gMTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgU2lnbiA9IDA7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBTaWduOwotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1DbGlwCi0gKgotICogRGVzY3JpcHRpb246IENsaXBzIHRoZSBpbnB1dCBiZXR3ZWVuIE1BWCBhbmQgTUlOIHZhbHVlCi0gKiAKLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIE1pbiAgICAgbG93ZXIgYm91bmQKLSAqIFtpbl0gTWF4ICAgICB1cHBlciBib3VuZAotICogW2luXSBzcmMgICAgIHZhcmlhYmxlIHRvIHRoZSBjbGlwcGVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX1MzMiAtLSAgIHJldHVybnMgY2xpcHBlZCB2YWx1ZQotICovIAotIAotT01YX1MzMiBhcm1DbGlwICgKLSAgICBPTVhfSU5UIG1pbiwKLSAgICBPTVhfSU5UIG1heCwgCi0gICAgT01YX1MzMiBzcmMgCi0pCi0gCi17Ci0gICAgaWYgKHNyYyA+IG1heCkKLSAgICB7Ci0gICAgICAgIHNyYyA9IG1heDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3JjIDwgbWluKQotICAgIHsKLSAgICAgICAgc3JjID0gbWluOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gc3JjOwotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1DbGlwX0YzMgotICoKLSAqIERlc2NyaXB0aW9uOiBDbGlwcyB0aGUgaW5wdXQgYmV0d2VlbiBNQVggYW5kIE1JTiB2YWx1ZQotICogCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBNaW4gICAgIGxvd2VyIGJvdW5kCi0gKiBbaW5dIE1heCAgICAgdXBwZXIgYm91bmQKLSAqIFtpbl0gc3JjICAgICB2YXJpYWJsZSB0byB0aGUgY2xpcHBlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9GMzIgLS0gICByZXR1cm5zIGNsaXBwZWQgdmFsdWUKLSAqLyAKLSAKLU9NWF9GMzIgYXJtQ2xpcF9GMzIgKAotICAgIE9NWF9GMzIgbWluLAotICAgIE9NWF9GMzIgbWF4LCAKLSAgICBPTVhfRjMyIHNyYyAKLSkKLSAKLXsKLSAgICBpZiAoc3JjID4gbWF4KQotICAgIHsKLSAgICAgICAgc3JjID0gbWF4OwotICAgIH0KLSAgICBlbHNlIGlmIChzcmMgPCBtaW4pCi0gICAgewotICAgICAgICBzcmMgPSBtaW47Ci0gICAgfQotICAgIAotICAgIHJldHVybiBzcmM7Ci19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVNoaWZ0U2F0X0YzMgotICoKLSAqIERlc2NyaXB0aW9uOiBEaXZpZGVzIGEgZmxvYXQgdmFsdWUgYnkgMl5zaGlmdCBhbmQgCi0gKiBzYXR1cmF0ZXMgaXQgZm9yIHVuc2lnbmVkIHZhbHVlIHJhbmdlIGZvciBzYXRCaXRzLgotICogU2Vjb25kIHBhcmFtZXRlciBpcyBsaWtlICJzaGlmdGluZyIgdGhlIGNvcnJlc3BvbmRpbmcgCi0gKiBpbnRlZ2VyIHZhbHVlLiBUYWtlcyBjYXJlIG9mIHJvdW5kaW5nIHdoaWxlIGNsaXBwaW5nIHRoZSBmaW5hbCAKLSAqIHZhbHVlLgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHYgICAgICAgICAgTnVtYmVyIHRvIGJlIG9wZXJhdGVkIHVwb24KLSAqIFtpbl0gc2hpZnQgICAgICBEaXZpZGVzIHRoZSBpbnB1dCAidiIgYnkgIjJec2hpZnQiCi0gKiBbaW5dIHNhdEJpdHMgICAgRmluYWwgcmFuZ2UgaXMgWzAsIDJec2F0Qml0cykKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfUzMyIC0tICAgcmV0dXJucyAic2hpZnRlZCIgc2F0dXJhdGVkIHZhbHVlCi0gKi8gCi0gCi1PTVhfVTMyIGFybVNoaWZ0U2F0X0YzMihPTVhfRjMyIHYsIE9NWF9JTlQgc2hpZnQsIE9NWF9JTlQgc2F0Qml0cykgCi17Ci0gICAgT01YX1UzMiBhbGxPbmVzID0gKE9NWF9VMzIpKC0xKTsKLSAgICBPTVhfVTMyIG1heFYgPSBhbGxPbmVzID4+ICgzMi1zYXRCaXRzKTsKLSAgICBPTVhfRjMyIHZTaGlmdGVkLCB2Um91bmRlZCwgc2hpZnREaXYgPSAoT01YX0YzMikoMSA8PCBzaGlmdCk7Ci0gICAgT01YX1UzMiB2SW50OwotICAgIE9NWF9VMzIgdkludFNhdDsKLSAgICAKLSAgICBpZih2IDw9IDApCi0gICAgICAgIHJldHVybiAwOwotICAgIAotICAgIHZTaGlmdGVkID0gdiAvIHNoaWZ0RGl2OwotICAgIHZSb3VuZGVkID0gKE9NWF9GMzIpKHZTaGlmdGVkICsgMC41KTsKLSAgICB2SW50ID0gKE9NWF9VMzIpdlJvdW5kZWQ7Ci0gICAgdkludFNhdCA9IHZJbnQ7Ci0gICAgaWYodkludFNhdCA+IG1heFYpIAotICAgICAgICB2SW50U2F0ID0gbWF4VjsKLSAgICByZXR1cm4gdkludFNhdDsKLX0KLQotLyoqCi0gKiBGdW5jdGlvbnM6IGFybVN3YXBFbGVtCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGVzZSBmdW5jdGlvbiBzd2FwcyB0d28gZWxlbWVudHMgYXQgdGhlIHNwZWNpZmllZCBwb2ludGVyIGxvY2F0aW9ucy4KLSAqIFRoZSBzaXplIG9mIGVhY2ggZWxlbWVudCBjb3VsZCBiZSBhbnl0aGluZyBhcyBzcGVjaWZpZWQgYnkgPGVsZW1TaXplPgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWFJlc3VsdCAtLSBFcnJvciBzdGF0dXMgZnJvbSB0aGUgZnVuY3Rpb24KLSAqLwotT01YUmVzdWx0IGFybVN3YXBFbGVtKAotICAgICAgICBPTVhfVTggKnBCdWYxLAotICAgICAgICBPTVhfVTggKnBCdWYyLAotICAgICAgICBPTVhfSU5UIGVsZW1TaXplCi0gICAgICAgKQotewotICAgIE9NWF9JTlQgaTsKLSAgICBPTVhfVTggdGVtcDsKLSAgICBhcm1SZXRBcmdFcnJJZighcEJ1ZjEgfHwgIXBCdWYyLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgCi0gICAgZm9yKGkgPSAwOyBpIDwgZWxlbVNpemU7IGkrKykKLSAgICB7Ci0gICAgICAgIHRlbXAgPSAqKHBCdWYxICsgaSk7Ci0gICAgICAgICoocEJ1ZjEgKyBpKSA9ICoocEJ1ZjIgKyBpKTsKLSAgICAgICAgKihwQnVmMiArIGkpID0gdGVtcDsKLSAgICB9Ci0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybU1lZGlhbk9mMwotICoKLSAqIERlc2NyaXB0aW9uOiBGaW5kcyB0aGUgbWVkaWFuIG9mIHRocmVlIG51bWJlcnMKLSAqIAotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBmRW50cnkgICAgIEZpcnN0IGVudHJ5Ci0gKiBbaW5dIHNFbnRyeSAgICAgc2Vjb25kIGVudHJ5Ci0gKiBbaW5dIHRFbnRyeSAgICAgVGhpcmQgZW50cnkKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfUzMyIC0tICAgcmV0dXJucyB0aGUgbWVkaWFuIHZhbHVlCi0gKi8gCi0gCi1PTVhfUzMyIGFybU1lZGlhbk9mMyAoCi0gICAgT01YX1MzMiBmRW50cnksCi0gICAgT01YX1MzMiBzRW50cnksIAotICAgIE9NWF9TMzIgdEVudHJ5IAotKQotewotICAgIE9NWF9TMzIgYSwgYiwgYzsKLSAgICAKLSAgICBhID0gYXJtTWluIChmRW50cnksIHNFbnRyeSk7Ci0gICAgYiA9IGFybU1heCAoZkVudHJ5LCBzRW50cnkpOwotICAgIGMgPSBhcm1NaW4gKGIsIHRFbnRyeSk7Ci0gICAgcmV0dXJuIChhcm1NYXggKGEsIGMpKTsKLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtTG9nU2l6ZQotICoKLSAqIERlc2NyaXB0aW9uOiBGaW5kcyB0aGUgc2l6ZSBvZiBhIHBvc2l0aXZlIHZhbHVlIGFuZCByZXR1cm5zIHRoZSBzYW1lCi0gKiAKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gdmFsdWUgICAgUG9zaXRpdmUgdmFsdWUKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfVTggLS0gICAgIFJldHVybnMgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGJpdHMgcmVxdWlyZWQgdG8gcmVwcmVzZW50IHRoZSBwb3NpdGl2ZSB2YWx1ZS4gCi0gICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIHNtYWxsZXN0IGs+PTAgc3VjaCB0aGF0IHRoYXQgdmFsdWUgaXMgbGVzcyB0aGFuICgxPDxrKS4KLSAqLyAKLSAKLU9NWF9VOCBhcm1Mb2dTaXplICgKLSAgICBPTVhfVTE2IHZhbHVlIAotKQotewotICAgIE9NWF9VOCBpOyAgICAKLSAgICBmb3IgKCBpID0gMDsgdmFsdWUgPiAwOyB2YWx1ZSA9IHZhbHVlID4+IDEpIAotICAgIHsKLSAgICAgICAgaSsrOwotICAgIH0KLSAgICByZXR1cm4gaTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgICAgIC8qIFNhdHVyYXRpbmcgQXJpdGhtZXRpYyBvcGVyYXRpb25zICovCi0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdEFkZF9TMzIoKQotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBhZGRpdGlvbiBvZiB0aGUgdHdvIGlucHV0cyBWYWx1ZTEsIFZhbHVlMgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKLSAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogCi0gKiAgICAKLSAqKi8KLSAKLU9NWF9TMzIgYXJtU2F0QWRkX1MzMihPTVhfUzMyIFZhbHVlMSxPTVhfUzMyIFZhbHVlMikKLXsKLSAgICBPTVhfUzMyIFJlc3VsdDsKLSAgICAKLSAgICBSZXN1bHQgPSBWYWx1ZTEgKyBWYWx1ZTI7Ci0KLSAgICBpZiggKFZhbHVlMV5WYWx1ZTIpID49IDApCi0gICAgewotICAgICAgICAvKlNhbWUgc2lnbiovCi0gICAgICAgIGlmKCAoUmVzdWx0XlZhbHVlMSkgPj0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgLypSZXN1bHQgaGFzIG5vdCBzYXR1cmF0ZWQqLwotICAgICAgICAgICAgcmV0dXJuIFJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKFZhbHVlMSA+PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBzYXR1cmF0ZWQgaW4gcG9zaXRpdmUgc2lkZSovCi0gICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9NQVhfUzMyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBzYXR1cmF0ZWQgaW4gbmVnYXRpdmUgc2lkZSovCi0gICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9NSU5fUzMyOwotICAgICAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgfQotICAgCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJldHVybiBSZXN1bHQ7Ci0gICAgfQotICAgIAotfQotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRBZGRfUzY0KCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgYWRkaXRpb24gb2YgdGhlIHR3byBpbnB1dHMgVmFsdWUxLCBWYWx1ZTIKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCi0gKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqIAotICogICAgCi0gKiovCi0gCi1PTVhfUzY0IGFybVNhdEFkZF9TNjQoT01YX1M2NCBWYWx1ZTEsT01YX1M2NCBWYWx1ZTIpCi17Ci0gICAgT01YX1M2NCBSZXN1bHQ7Ci0gICAgCi0gICAgUmVzdWx0ID0gVmFsdWUxICsgVmFsdWUyOwotCi0gICAgaWYoIChWYWx1ZTFeVmFsdWUyKSA+PSAwKQotICAgIHsKLSAgICAgICAgLypTYW1lIHNpZ24qLwotICAgICAgICBpZiggKFJlc3VsdF5WYWx1ZTEpID49IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBub3Qgc2F0dXJhdGVkKi8KLSAgICAgICAgICAgIHJldHVybiBSZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihWYWx1ZTEgPj0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKlJlc3VsdCBoYXMgc2F0dXJhdGVkIGluIHBvc2l0aXZlIHNpZGUqLwotICAgICAgICAgICAgICAgIFJlc3VsdCA9IE9NWF9NQVhfUzY0OwotICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLypSZXN1bHQgaGFzIHNhdHVyYXRlZCBpbiBuZWdhdGl2ZSBzaWRlKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gT01YX01JTl9TNjQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB9Ci0gICAKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmV0dXJuIFJlc3VsdDsKLSAgICB9Ci0gICAgCi19Ci0KLS8qKiBGdW5jdGlvbiA6YXJtU2F0U3ViX1MzMigpCi0gKiAKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIHN1YnN0cmFjdGlvbiBvZiB0aGUgdHdvIGlucHV0cyBWYWx1ZTEsIFZhbHVlMgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKLSAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogCi0gKiovCi0KLU9NWF9TMzIgYXJtU2F0U3ViX1MzMihPTVhfUzMyIFZhbHVlMSxPTVhfUzMyIFZhbHVlMikKLXsKLSAgICBPTVhfUzMyIFJlc3VsdDsKLSAgICAKLSAgICBSZXN1bHQgPSBWYWx1ZTEgLSBWYWx1ZTI7Ci0KLSAgICBpZiggKFZhbHVlMV5WYWx1ZTIpIDwgMCkKLSAgICB7Ci0gICAgICAgIC8qT3Bwb3NpdGUgc2lnbiovCi0gICAgICAgIGlmKCAoUmVzdWx0XlZhbHVlMSkgPj0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgLypSZXN1bHQgaGFzIG5vdCBzYXR1cmF0ZWQqLwotICAgICAgICAgICAgcmV0dXJuIFJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKFZhbHVlMSA+PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBzYXR1cmF0ZWQgaW4gcG9zaXRpdmUgc2lkZSovCi0gICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9NQVhfUzMyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBzYXR1cmF0ZWQgaW4gbmVnYXRpdmUgc2lkZSovCi0gICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9NSU5fUzMyOwotICAgICAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgfQotICAgCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJldHVybiBSZXN1bHQ7Ci0gICAgfQotICAgIAotfQotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRNYWNfUzMyKCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIE11bHRpcGxpY2F0aW9uIG9mIFZhbHVlMSBhbmQgVmFsdWUyIGFuZCBzdWJlc3F1ZW50IHNhdHVyYXRlZAotICogICAgIGFjY3VtdWxhdGlvbiB3aXRoIE1hYwotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKLSAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCi0gKiBbaW5dIE1hYyAgICAgICAgICBBY2N1bXVsYXRvcgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqKi8KLQotT01YX1MzMiBhcm1TYXRNYWNfUzMyKE9NWF9TMzIgTWFjLE9NWF9TMTYgVmFsdWUxLE9NWF9TMTYgVmFsdWUyKQotewotICAgIE9NWF9TMzIgUmVzdWx0OwotICAgIAotICAgIFJlc3VsdCA9IChPTVhfUzMyKShWYWx1ZTEqVmFsdWUyKTsKLSAgICBSZXN1bHQgPSBhcm1TYXRBZGRfUzMyKCBNYWMgLCBSZXN1bHQgKTsKLQotICAgIHJldHVybiBSZXN1bHQ7ICAgIAotfQotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRNYWNfUzE2UzMyX1MzMgotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBNQUMgb3BlcmF0aW9uIG9mIHRoZSB0aHJlZSBpbnB1dHMgZGVsYXlFbGVtLCBmaWxUYXAgLCBtYWMKLSAqCi0gKiAgIG1hYyA9IG1hYyArIFNhdHVyYXRlX2luXzMyQml0cyhkZWxheUVsZW0gKiBmaWxUYXApCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBkZWxheUVsZW0gICAgRmlyc3QgMzIgYml0IE9wZXJhbmQKLSAqIFtpbl0gZmlsVGFwICAgICAgIFNlY29uZCAxNiBiaXQgT3BlcmFuZAotICogW2luXSBtYWMgICAgICAgICAgUmVzdWx0IG9mIE1BQyBvcGVyYXRpb24KLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgbWFjICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAgICAKLSAqKi8KLSAKLU9NWF9TMzIgYXJtU2F0TWFjX1MxNlMzMl9TMzIoT01YX1MzMiBtYWMsIE9NWF9TMzIgZGVsYXlFbGVtLCBPTVhfUzE2IGZpbFRhcCApCi17Ci0gICAgCi0gICAgT01YX1MzMiByZXN1bHQ7Ci0KLSAgICByZXN1bHQgPSBhcm1TYXRNdWxTMTZTMzJfUzMyKGZpbFRhcCxkZWxheUVsZW0pOyAKLQotICAgIGlmICggcmVzdWx0ID4gT01YX01BWF9TMTYgKQotICAgIHsKLSAgICAgICAgcmVzdWx0ID0gT01YX01BWF9TMzI7Ci0gICAgfQotICAgIGVsc2UgaWYoIHJlc3VsdCA8IE9NWF9NSU5fUzE2ICkKLSAgICB7Ci0gICAgICAgIHJlc3VsdCA9IE9NWF9NSU5fUzMyOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXN1bHQgPSBkZWxheUVsZW0gKiBmaWxUYXA7Ci0gICAgfQotCi0gICAgbWFjID0gYXJtU2F0QWRkX1MzMihtYWMscmVzdWx0KTsKLSAgICAKLSAgICByZXR1cm4gbWFjOwotfQotCi0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdFJvdW5kUmlnaHRTaGlmdF9TMzJfUzE2Ci0gKgotICogRGVzY3JpcHRpb24gOgotICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygcm91bmRlZCByaWdodCBzaGlmdCBvcGVyYXRpb24gb2YgaW5wdXQgYnkgdGhlIHNjYWxlZmFjdG9yCi0gKgotICogICBvdXRwdXQgPSBTYXR1cmF0ZV9pbl8xNkJpdHMoICggUmlnaHQvTGVmdFNoaWZ0KCAoUm91bmQoaW5wdXQpICwgc2hpZnQgKSApCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBpbnB1dCAgICAgICBUaGUgaW5wdXQgdG8gYmUgb3BlcmF0ZWQgb24KLSAqIFtpbl0gc2hpZnQgVGhlIHNoaWZ0IG51bWJlcgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogICAgCi0gKiovCi0KLQotT01YX1MxNiBhcm1TYXRSb3VuZFJpZ2h0U2hpZnRfUzMyX1MxNihPTVhfUzMyIGlucHV0LCBPTVhfSU5UIHNoaWZ0KQotewotICAgIGlucHV0ID0gYXJtU2F0Um91bmRMZWZ0U2hpZnRfUzMyKGlucHV0LC1zaGlmdCk7Ci0KLSAgICBpZiAoIGlucHV0ID4gT01YX01BWF9TMTYgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChPTVhfUzE2KU9NWF9NQVhfUzE2OwotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dCA8IE9NWF9NSU5fUzE2KQotICAgIHsKLSAgICAgICAgcmV0dXJuIChPTVhfUzE2KU9NWF9NSU5fUzE2OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgIHJldHVybiAoT01YX1MxNilpbnB1dDsKLSAgICB9Ci0KLX0KLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0Um91bmRMZWZ0U2hpZnRfUzMyKCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRpbmcgbGVmdC1zaGlmdCBvcGVyYXRpb24gb24gaW5wdXQKLSAqICAgICBPciByb3VuZGVkIFJpZ2h0IHNoaWZ0IGlmIHRoZSBpbnB1dCBTaGlmdCBpcyBuZWdhdGl2ZS4KLSAqICAgICAKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gVmFsdWUgICAgICAgIE9wZXJhbmQKLSAqIFtpbl0gU2hpZnQgICAgICAgIE9wZXJhbmQgZm9yIHNoaWZ0IG9wZXJhdGlvbgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqICAgIAotICoqLwotCi1PTVhfUzMyIGFybVNhdFJvdW5kTGVmdFNoaWZ0X1MzMihPTVhfUzMyIFZhbHVlLCBPTVhfSU5UIFNoaWZ0KQotewotICAgIE9NWF9JTlQgaTsKLSAgICAKLSAgICBpZiAoU2hpZnQgPCAwKQotICAgIHsKLSAgICAgICAgU2hpZnQgPSAtU2hpZnQ7Ci0gICAgICAgIFZhbHVlID0gYXJtU2F0QWRkX1MzMihWYWx1ZSwgKDEgPDwgKFNoaWZ0IC0gMSkpKTsKLSAgICAgICAgVmFsdWUgPSBWYWx1ZSA+PiBTaGlmdDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IFNoaWZ0OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbHVlID0gYXJtU2F0QWRkX1MzMihWYWx1ZSwgVmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBWYWx1ZTsKLX0KLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0Um91bmRMZWZ0U2hpZnRfUzY0KCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRpbmcgbGVmdC1zaGlmdCBvcGVyYXRpb24gb24gaW5wdXQKLSAqICAgICBPciByb3VuZGVkIFJpZ2h0IHNoaWZ0IGlmIHRoZSBpbnB1dCBTaGlmdCBpcyBuZWdhdGl2ZS4KLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIFZhbHVlICAgICAgICBPcGVyYW5kCi0gKiBbaW5dIHNoaWZ0ICAgICAgICBPcGVyYW5kIGZvciBzaGlmdCBvcGVyYXRpb24KLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAgICAKLSAqKi8KLSAKLU9NWF9TNjQgYXJtU2F0Um91bmRMZWZ0U2hpZnRfUzY0KE9NWF9TNjQgVmFsdWUsIE9NWF9JTlQgU2hpZnQpCi17Ci0gICAgT01YX0lOVCBpOwotICAgIAotICAgIGlmIChTaGlmdCA8IDApCi0gICAgewotICAgICAgICBTaGlmdCA9IC1TaGlmdDsKLSAgICAgICAgVmFsdWUgPSBhcm1TYXRBZGRfUzY0KFZhbHVlLCAoKE9NWF9TNjQpMSA8PCAoU2hpZnQgLSAxKSkpOwotICAgICAgICBWYWx1ZSA9IFZhbHVlID4+IFNoaWZ0OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgU2hpZnQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgVmFsdWUgPSBhcm1TYXRBZGRfUzY0KFZhbHVlLCBWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIFZhbHVlOwotfQotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRNdWxTMTZTMzJfUzMyKCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGEgUzE2IGRhdGEgdHlwZSBtdWx0aXBsaWVkIHdpdGggYW4gUzMyIGRhdGEgdHlwZQotICogICAgIGluIGEgUzMyIGNvbnRhaW5lcgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gaW5wdXQxICAgICAgIE9wZXJhbmQgMQotICogW2luXSBpbnB1dDIgICAgICAgT3BlcmFuZCAyCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogICAgCi0gKiovCi0KLQotT01YX1MzMiBhcm1TYXRNdWxTMTZTMzJfUzMyKE9NWF9TMTYgaW5wdXQxLE9NWF9TMzIgaW5wdXQyKQotewotICAgIE9NWF9TMTYgaGkyLGxvMTsKLSAgICBPTVhfVTE2IGxvMjsKLSAgICAKLSAgICBPTVhfUzMyIHRlbXAxLHRlbXAyOwotICAgIE9NWF9TMzIgcmVzdWx0OwotICAgIAotICAgIGxvMSAgPSBpbnB1dDE7Ci0KLSAgICBoaTIgID0gKCBpbnB1dDIgPj4gIDE2ICk7Ci0gICAgbG8yICA9ICggKE9NWF9VMzIpKCBpbnB1dDIgPDwgMTYgKSA+PiAxNiApOwotICAgIAotICAgIHRlbXAxID0gaGkyICogbG8xOwotICAgIHRlbXAyID0gKCBsbzIqIGxvMSApID4+IDE2OwotCi0gICAgcmVzdWx0ID0gIGFybVNhdEFkZF9TMzIodGVtcDEsdGVtcDIpOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0TXVsUzMyUzMyX1MzMigpCi0gKgotICogRGVzY3JpcHRpb24gOgotICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBhIFMzMiBkYXRhIHR5cGUgbXVsdGlwbGllZCB3aXRoIGFuIFMzMiBkYXRhIHR5cGUKLSAqICAgICBpbiBhIFMzMiBjb250YWluZXIKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIGlucHV0MSAgICAgICBPcGVyYW5kIDEKLSAqIFtpbl0gaW5wdXQyICAgICAgIE9wZXJhbmQgMgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqICAgIAotICoqLwotCi1PTVhfUzMyIGFybVNhdE11bFMzMlMzMl9TMzIoT01YX1MzMiBpbnB1dDEsT01YX1MzMiBpbnB1dDIpCi17Ci0gICAgT01YX1MxNiBoaTEsaGkyOwotICAgIE9NWF9VMTYgbG8xLGxvMjsKLSAgICAKLSAgICBPTVhfUzMyIHRlbXAxLHRlbXAyLHRlbXAzOwotICAgIE9NWF9TMzIgcmVzdWx0OwotCi0gICAgaGkxICA9ICggaW5wdXQxID4+ICAxNiApOwotICAgIGxvMSAgPSAoIChPTVhfVTMyKSggaW5wdXQxIDw8IDE2ICkgPj4gMTYgKTsKLQotICAgIGhpMiAgPSAoIGlucHV0MiA+PiAgMTYgKTsKLSAgICBsbzIgID0gKCAoT01YX1UzMikoIGlucHV0MiA8PCAxNiApID4+IDE2ICk7Ci0gICAgCi0gICAgdGVtcDEgPSAgIGhpMSAqIGhpMjsKLSAgICB0ZW1wMiA9ICggaGkxKiBsbzIgKSA+PiAxNjsKLSAgICB0ZW1wMyA9ICggaGkyKiBsbzEgKSA+PiAxNjsKLQotICAgIHJlc3VsdCA9IGFybVNhdEFkZF9TMzIodGVtcDEsdGVtcDIpOwotICAgIHJlc3VsdCA9IGFybVNhdEFkZF9TMzIocmVzdWx0LHRlbXAzKTsKLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogRnVuY3Rpb24gOmFybUludERpdkF3YXlGcm9tWmVybygpCi0gKgotICogRGVzY3JpcHRpb24gOiBJbnRlZ2VyIGRpdmlzaW9uIHdpdGggcm91bmRpbmcgdG8gdGhlIG5lYXJlc3QgaW50ZWdlci4gCi0gKiAgICAgICAgICAgICAgIEhhbGYtaW50ZWdlciB2YWx1ZXMgYXJlIHJvdW5kZWQgYXdheSBmcm9tIHplcm8KLSAqICAgICAgICAgICAgICAgdW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQuIEZvciBleGFtcGxlIDMvLzIgaXMgcm91bmRlZCAKLSAqICAgICAgICAgICAgICAgdG8gMiwgYW5kIC0zLy8yIGlzIHJvdW5kZWQgdG8gLTIuCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBOdW0gICAgICAgIE9wZXJhbmQgMQotICogW2luXSBEZW5vICAgICAgIE9wZXJhbmQgMgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24gaW5wdXQxLy9pbnB1dDIKLSAqICAgIAotICoqLwotCi1PTVhfUzMyIGFybUludERpdkF3YXlGcm9tWmVybyAoT01YX1MzMiBOdW0sIE9NWF9TMzIgRGVubykKLXsKLSAgICBPTVhfRjY0IHJlc3VsdDsKLSAgICAKLSAgICByZXN1bHQgPSAoKE9NWF9GNjQpTnVtKS8oKE9NWF9GNjQpRGVubyk7Ci0gICAgCi0gICAgaWYgKHJlc3VsdCA+PSAwKQotICAgIHsKLSAgICAgICAgcmVzdWx0ICs9IDAuNTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmVzdWx0IC09IDAuNTsKLSAgICB9Ci0KLSAgICByZXR1cm4gKE9NWF9TMzIpKHJlc3VsdCk7Ci19Ci0KLQotLypFbmQgb2YgRmlsZSovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9zcmMvYXJtQ09NTV9CaXRzdHJlYW0uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9zcmMvYXJtQ09NTV9CaXRzdHJlYW0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTlmNTNjYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vc3JjL2FybUNPTU1fQml0c3RyZWFtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybUNPTU1fQml0c3RyZWFtLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBEZWZpbmVzIGJpdHN0cmVhbSBlbmNvZGUgYW5kIGRlY29kZSBmdW5jdGlvbnMgY29tbW9uIHRvIGFsbCBjb2RlY3MKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtQ09NTV9CaXRzdHJlYW0uaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRml4ZWQgYml0IGxlbmd0aCBEZWNvZGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogRnVuY3Rpb246IGFybUxvb2tBaGVhZEJpdHMoKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogR2V0IHRoZSBuZXh0IE4gYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0gd2l0aG91dCBhZHZhbmNpbmcgdGhlIGJpdHN0cmVhbSBwb2ludGVyCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gICAgICoqcHBCaXRTdHJlYW0KLSAqIFtpbl0gICAgICpwT2Zmc2V0Ci0gKiBbaW5dICAgICBOPTEuLi4zMgotICoKLSAqIFJldHVybnMgIFZhbHVlCi0gKi8KLQotT01YX1UzMiBhcm1Mb29rQWhlYWRCaXRzKGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLCBPTVhfSU5UICpwT2Zmc2V0LCBPTVhfSU5UIE4pCi17Ci0gICAgY29uc3QgT01YX1U4ICpwQml0U3RyZWFtID0gKnBwQml0U3RyZWFtOwotICAgIE9NWF9JTlQgT2Zmc2V0ID0gKnBPZmZzZXQ7Ci0gICAgT01YX1UzMiBWYWx1ZTsKLQotICAgIGFybUFzc2VydChPZmZzZXQ+PTAgJiYgT2Zmc2V0PD03KTsKLSAgICBhcm1Bc3NlcnQoTj49MSAmJiBOPD0zMik7Ci0KLSAgICAvKiBSZWFkIG5leHQgMzIgYml0cyBmcm9tIHN0cmVhbSAqLwotICAgIFZhbHVlID0gKHBCaXRTdHJlYW1bMF0gPDwgMjQgKSB8ICggcEJpdFN0cmVhbVsxXSA8PCAxNikgIHwgKHBCaXRTdHJlYW1bMl0gPDwgOCApIHwgKHBCaXRTdHJlYW1bM10pIDsKLSAgICBWYWx1ZSA9IChWYWx1ZSA8PCBPZmZzZXQgKSB8IChwQml0U3RyZWFtWzRdID4+ICg4LU9mZnNldCkpOwotCi0gICAgLyogUmV0dXJuIE4gYml0cyAqLwotICAgIHJldHVybiBWYWx1ZSA+PiAoMzItTik7Ci19Ci0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtR2V0Qml0cygpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBSZWFkIE4gYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0KLSAqICAgIAotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQotICogW2luXSAgICAgKnBPZmZzZXQKLSAqIFtpbl0gICAgIE49MS4uMzIKLSAqCi0gKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KLSAqIFtvdXRdICAgICpwT2Zmc2V0Ci0gKiBSZXR1cm5zICBWYWx1ZQotICovCi0KLQotT01YX1UzMiBhcm1HZXRCaXRzKGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLCBPTVhfSU5UICpwT2Zmc2V0LCBPTVhfSU5UIE4pCi17Ci0gICAgY29uc3QgT01YX1U4ICpwQml0U3RyZWFtID0gKnBwQml0U3RyZWFtOwotICAgIE9NWF9JTlQgT2Zmc2V0ID0gKnBPZmZzZXQ7Ci0gICAgT01YX1UzMiBWYWx1ZTsKLSAgICAKLSAgICBpZihOID09IDApCi0gICAgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgYXJtQXNzZXJ0KE9mZnNldD49MCAmJiBPZmZzZXQ8PTcpOwotICAgIGFybUFzc2VydChOPj0xICYmIE48PTMyKTsKLQotICAgIC8qIFJlYWQgbmV4dCAzMiBiaXRzIGZyb20gc3RyZWFtICovCi0gICAgVmFsdWUgPSAocEJpdFN0cmVhbVswXSA8PCAyNCApIHwgKCBwQml0U3RyZWFtWzFdIDw8IDE2KSAgfCAocEJpdFN0cmVhbVsyXSA8PCA4ICkgfCAocEJpdFN0cmVhbVszXSkgOwotICAgIFZhbHVlID0gKFZhbHVlIDw8IE9mZnNldCApIHwgKHBCaXRTdHJlYW1bNF0gPj4gKDgtT2Zmc2V0KSk7Ci0KLSAgICAvKiBBZHZhbmNlIGJpdHN0cmVhbSBwb2ludGVyIGJ5IE4gYml0cyAqLwotICAgIE9mZnNldCArPSBOOwotICAgICpwcEJpdFN0cmVhbSA9IHBCaXRTdHJlYW0gKyAoT2Zmc2V0Pj4zKTsKLSAgICAqcE9mZnNldCA9IE9mZnNldCAmIDc7Ci0KLSAgICAvKiBSZXR1cm4gTiBiaXRzICovCi0gICAgcmV0dXJuIFZhbHVlID4+ICgzMi1OKTsKLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtQnl0ZUFsaWduKCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIEFsaWduIHRoZSBwb2ludGVyICpwcEJpdFN0cmVhbSB0byB0aGUgbmV4dCBieXRlIGJvdW5kYXJ5Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQotICogW2luXSAgICAgKnBPZmZzZXQKLSAqCi0gKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KLSAqIFtvdXRdICAgICpwT2Zmc2V0Ci0gKgotICoqLwotIAotT01YVm9pZCBhcm1CeXRlQWxpZ24oY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sT01YX0lOVCAqcE9mZnNldCkKLXsKLSAgICBpZigqcE9mZnNldCA+IDApCi0gICAgewotICAgICAgICAqcHBCaXRTdHJlYW0gKz0gMTsKLSAgICAgICAgKnBPZmZzZXQgPSAwOwotICAgIH0gICAgCi19Ci0KLS8qKiAKLSAqIEZ1bmN0aW9uOiBhcm1Ta2lwQml0cygpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBTa2lwIE4gYml0cyBmcm9tIHRoZSB2YWx1ZSBhdCAqcHBCaXRTdHJlYW0KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgICAgKnBwQml0U3RyZWFtCi0gKiBbaW5dICAgICAqcE9mZnNldAotICogW2luXSAgICAgTgotICoKLSAqIFtvdXRdICAgICpwcEJpdFN0cmVhbQotICogW291dF0gICAgKnBPZmZzZXQKLSAqCi0gKiovCi0KLQotT01YVm9pZCBhcm1Ta2lwQml0cyhjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSxPTVhfSU5UICpwT2Zmc2V0LE9NWF9JTlQgTikKLXsKLSAgICBPTVhfSU5UIE9mZnNldCA9ICpwT2Zmc2V0OwotICAgIGNvbnN0IE9NWF9VOCAqcEJpdFN0cmVhbSA9ICpwcEJpdFN0cmVhbTsKLSAgIAotICAgIC8qIEFkdmFuY2UgYml0c3RyZWFtIHBvaW50ZXIgYnkgTiBiaXRzICovCi0gICAgT2Zmc2V0ICs9IE47Ci0gICAgKnBwQml0U3RyZWFtID0gcEJpdFN0cmVhbSArIChPZmZzZXQ+PjMpOwotICAgICpwT2Zmc2V0ID0gT2Zmc2V0ICYgNzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVmFyaWFibGUgYml0IGxlbmd0aCBEZWNvZGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogRnVuY3Rpb246IGFybVVuUGFja1ZMQzMyKCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFZhcmlhYmxlIGxlbmd0aCBkZWNvZGUgb2YgdmFyaWFibGUgbGVuZ3RoIHN5bWJvbCAobWF4IHNpemUgMzIgYml0cykgcmVhZCBmcm9tCi0gKiB0aGUgYml0IHN0cmVhbSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSBhdCAqcE9mZnNldCBieSB1c2luZyB0aGUgdGFibGUKLSAqIHBvaW50ZWQgYnkgcENvZGVCb29rCi0gKiAKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICAgICAqcEJpdFN0cmVhbQotICogW2luXSAgICAgKnBPZmZzZXQKLSAqIFtpbl0gICAgIHBDb2RlQm9vawotICogCi0gKiBbb3V0XSAgICAqcEJpdFN0cmVhbQotICogW291dF0gICAgKnBPZmZzZXQKLSAqCi0gKiBSZXR1cm5zIDogQ29kZSBCb29rIEluZGV4IGlmIHN1Y2Nlc3NmdWxsLiAKLSAqICAgICAgICAgOiBBUk1fTk9fQ09ERUJPT0tfSU5ERVggPSAtMSBpZiBzZWFyY2ggZmFpbHMuCi0gKiovCi0jaWZuZGVmIENfT1BUSU1JWkVEX0lNUExFTUVOVEFUSU9OIAotCi1PTVhfVTE2IGFybVVuUGFja1ZMQzMyKAotICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgIE9NWF9JTlQgKnBPZmZzZXQsCi0gICAgY29uc3QgQVJNX1ZMQzMyICpwQ29kZUJvb2sKLSkKLXsgICAgCi0gICAgY29uc3QgT01YX1U4ICpwQml0U3RyZWFtID0gKnBwQml0U3RyZWFtOwotICAgIE9NWF9JTlQgT2Zmc2V0ID0gKnBPZmZzZXQ7Ci0gICAgT01YX1UzMiBWYWx1ZTsKLSAgICBPTVhfSU5UIEluZGV4OwotICAgICAgICAKLSAgICBhcm1Bc3NlcnQoT2Zmc2V0Pj0wICYmIE9mZnNldDw9Nyk7Ci0KLSAgICAvKiBSZWFkIG5leHQgMzIgYml0cyBmcm9tIHN0cmVhbSAqLwotICAgIFZhbHVlID0gKHBCaXRTdHJlYW1bMF0gPDwgMjQgKSB8ICggcEJpdFN0cmVhbVsxXSA8PCAxNikgIHwgKHBCaXRTdHJlYW1bMl0gPDwgOCApIHwgKHBCaXRTdHJlYW1bM10pIDsKLSAgICBWYWx1ZSA9IChWYWx1ZSA8PCBPZmZzZXQgKSB8IChwQml0U3RyZWFtWzRdID4+ICg4LU9mZnNldCkpOwotCi0gICAgLyogU2VhcmNoIHRocm91Z2ggdGhlIGNvZGVib29rICovICAgIAotICAgIGZvciAoSW5kZXg9MDsgcENvZGVCb29rLT5jb2RlTGVuICE9IDA7IEluZGV4KyspCi0gICAgewotICAgICAgICBpZiAocENvZGVCb29rLT5jb2RlV29yZCA9PSAoVmFsdWUgPj4gKDMyIC0gcENvZGVCb29rLT5jb2RlTGVuKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9mZnNldCAgICAgICA9IE9mZnNldCArIHBDb2RlQm9vay0+Y29kZUxlbjsKLSAgICAgICAgICAgICpwcEJpdFN0cmVhbSA9IHBCaXRTdHJlYW0gKyAoT2Zmc2V0ID4+IDMpIDsKLSAgICAgICAgICAgICpwT2Zmc2V0ICAgICA9IE9mZnNldCAmIDc7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBJbmRleDsKLSAgICAgICAgfSAgICAgICAgCi0gICAgICAgIHBDb2RlQm9vaysrOwotICAgIH0KLQotICAgIC8qIE5vIGNvZGUgbWF0Y2ggZm91bmQgKi8KLSAgICByZXR1cm4gQVJNX05PX0NPREVCT09LX0lOREVYOwotfQotCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRml4ZWQgYml0IGxlbmd0aCBFbmNvZGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogRnVuY3Rpb246IGFybVBhY2tCaXRzCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQYWNrIGEgVkxDIGNvZGUgd29yZCBpbnRvIHRoZSBiaXRzdHJlYW0KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHBwQml0U3RyZWFtICAgICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbS4KLSAqIFtpbl0gcE9mZnNldCAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSAKLSAqICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMAotICogICAgICAgICAgICAgICAgICAgICAgdG8gNy4KLSAqIFtpbl0gY29kZVdvcmQgICAgICAgIENvZGUgd29yZCB0aGF0IG5lZWQgdG8gYmUgaW5zZXJ0ZWQgaW4gdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtCi0gKiBbaW5dIGNvZGVMZW5ndGggICAgICBMZW5ndGggb2YgdGhlIGNvZGUgd29yZCB2YWxpZCByYW5nZSAxLi4uMzIKLSAqCi0gKiBbb3V0XSBwcEJpdFN0cmVhbSAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gYnVmZmVyLgotICogW291dF0gcEJpdE9mZnNldCAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWF9SRVNVTFQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLSAKLU9NWFJlc3VsdCBhcm1QYWNrQml0cyAoCi0gICAgT01YX1U4ICAqKnBwQml0U3RyZWFtLCAKLSAgICBPTVhfSU5UICpwT2Zmc2V0LAotICAgIE9NWF9VMzIgY29kZVdvcmQsIAotICAgIE9NWF9JTlQgY29kZUxlbmd0aCAKLSkKLXsKLSAgICBPTVhfVTggICpwQml0U3RyZWFtID0gKnBwQml0U3RyZWFtOwotICAgIE9NWF9JTlQgT2Zmc2V0ID0gKnBPZmZzZXQ7Ci0gICAgT01YX1UzMiBWYWx1ZTsKLSAgICAgICAgCi0gICAgLyogY2hlY2tpbmcgYXJndW1lbnQgdmFsaWRpdHkgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihPZmZzZXQgPCAwLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoT2Zmc2V0ID4gNywgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGNvZGVMZW5ndGggPCAxLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoY29kZUxlbmd0aCA+IDMyLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0KLSAgICAvKiBQcmVwYXJlIHRoZSBmaXJzdCBieXRlICovCi0gICAgY29kZVdvcmQgPSBjb2RlV29yZCA8PCAoMzItY29kZUxlbmd0aCk7Ci0gICAgVmFsdWUgPSAocEJpdFN0cmVhbVswXSA+PiAoOC1PZmZzZXQpKSA8PCAoOC1PZmZzZXQpOwotICAgIFZhbHVlID0gVmFsdWUgfCAoY29kZVdvcmQgPj4gKDI0K09mZnNldCkpOwotCi0gICAgLyogV3JpdGUgb3V0IHdob2xlIGJ5dGVzICovCi0gICAgd2hpbGUgKDgtT2Zmc2V0IDw9IGNvZGVMZW5ndGgpCi0gICAgewotICAgICAgICAqcEJpdFN0cmVhbSsrID0gKE9NWF9VOClWYWx1ZTsKLSAgICAgICAgY29kZVdvcmQgICA9IGNvZGVXb3JkICA8PCAoOC1PZmZzZXQpOwotICAgICAgICBjb2RlTGVuZ3RoID0gY29kZUxlbmd0aCAtICg4LU9mZnNldCk7Ci0gICAgICAgIE9mZnNldCA9IDA7Ci0gICAgICAgIFZhbHVlID0gY29kZVdvcmQgPj4gMjQ7Ci0gICAgfQotCi0gICAgLyogV3JpdGUgb3V0IGZpbmFsIHBhcnRpYWwgYnl0ZSAqLwotICAgICpwQml0U3RyZWFtICA9IChPTVhfVTgpVmFsdWU7Ci0gICAgKnBwQml0U3RyZWFtID0gcEJpdFN0cmVhbTsKLSAgICAqcE9mZnNldCA9IE9mZnNldCArIGNvZGVMZW5ndGg7Ci0gICAgCi0gICAgcmV0dXJuICBPTVhfU3RzX05vRXJyOwotfQotIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVmFyaWFibGUgYml0IGxlbmd0aCBFbmNvZGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogRnVuY3Rpb246IGFybVBhY2tWTEMzMgotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGFjayBhIFZMQyBjb2RlIHdvcmQgaW50byB0aGUgYml0c3RyZWFtCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIAotICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0uCi0gKiBbaW5dCXBCaXRPZmZzZXQJICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSAKLSAqICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMAotICogICAgICAgICAgICAgICAgICAgICAgdG8gNy4KLSAqIFtpbl0JIGNvZGUgICAgIAkJVkxDIGNvZGUgd29yZCB0aGF0IG5lZWQgdG8gYmUgaW5zZXJ0ZWQgaW4gdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICBiaXRzdHJlYW0KLSAqCi0gKiBbb3V0XSBwcEJpdFN0cmVhbQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwKLSAqCSAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0Ci0gKgkJCQkJCXN0cmVhbSBidWZmZXIuCi0gKiBbb3V0XSBwQml0T2Zmc2V0CQkqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQotICoJCQkJCQljdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Ci0gKgkJCQkJCSpwcEJpdFN0cmVhbS4KLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhfUkVTVUxUIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0gCi1PTVhSZXN1bHQgYXJtUGFja1ZMQzMyICgKLSAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwgCi0gICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICBBUk1fVkxDMzIgY29kZSAKLSkKLXsKLSAgICByZXR1cm4gKGFybVBhY2tCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBjb2RlLmNvZGVXb3JkLCBjb2RlLmNvZGVMZW4pKTsKLX0KLQotLypFbmQgb2YgRmlsZSovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vc3JjL2FybUNPTU1fSURDVFRhYmxlLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vc3JjL2FybUNPTU1fSURDVFRhYmxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ZDRjNjcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3NyYy9hcm1DT01NX0lEQ1RUYWJsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybUNPTU1fSURDVFRhYmxlLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgMTIyOTAKLSAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotICogCi0gKiAKLSAqIAotICogICAKLSAqIEZpbGU6IGFybUNPTU1fSURDVFRhYmxlLmMKLSAqIEJyaWVmOiBEZWZpbmVzIFRhYmxlcyB1c2VkIGluIElEQ1QgY29tcHV0YXRpb24KLSAqCi0gKi8KLQotI2luY2x1ZGUgImFybUNPTU1fSURDVFRhYmxlLmgiCi0KLSAgICAgLyogIFRhYmxlIG9mIHModSkqQSh1KSpBKHYpLzE2IGF0IFExNQotICAgICAgKiAgcyh1KT0xLjAgMCA8PSB1IDw9IDUKLSAgICAgICogIHMoNik9Mi4wCi0gICAgICAqICBzKDcpPTQuMAotICAgICAgKiAgQSgwKSA9IDIqc3FydCgyKQotICAgICAgKiAgQSh1KSA9IDQqY29zKHUqcGkvMTYpICBmb3IgKHUhPTApCi0JICAqLwotCSAgCi1fX2FsaWduKDQpIGNvbnN0IE9NWF9VMTYgYXJtQ09NTV9JRENUUHJlU2NhbGUgWzY0XSA9Ci17Ci0gICAgMHg0MDAwLCAweDU4YzUsIDB4NTM5ZiwgMHg0YjQyLCAweDQwMDAsIDB4MzI0OSwgMHg0NTQ2LCAweDQ2YTEsCi0gICAgMHg1OGM1LCAweDdiMjEsIDB4NzNmYywgMHg2ODYyLCAweDU4YzUsIDB4NDViZiwgMHg2MDE2LCAweDYxZjgsCi0gICAgMHg1MzlmLCAweDczZmMsIDB4NmQ0MSwgMHg2MjU0LCAweDUzOWYsIDB4NDFiMywgMHg1YTgyLCAweDVjNDgsCi0gICAgMHg0YjQyLCAweDY4NjIsIDB4NjI1NCwgMHg1ODdlLCAweDRiNDIsIDB4M2IyMSwgMHg1MTc1LCAweDUzMGQsCi0gICAgMHg0MDAwLCAweDU4YzUsIDB4NTM5ZiwgMHg0YjQyLCAweDQwMDAsIDB4MzI0OSwgMHg0NTQ2LCAweDQ2YTEsCi0gICAgMHgzMjQ5LCAweDQ1YmYsIDB4NDFiMywgMHgzYjIxLCAweDMyNDksIDB4Mjc4MiwgMHgzNjZkLCAweDM3N2UsCi0gICAgMHgyMmEzLCAweDMwMGIsIDB4MmQ0MSwgMHgyOGJhLCAweDIyYTMsIDB4MWIzNywgMHgyNTdlLCAweDI2M2EsCi0gICAgMHgxMWE4LCAweDE4N2UsIDB4MTcxMiwgMHgxNGMzLCAweDExYTgsIDB4MGRlMCwgMHgxMzFkLCAweDEzN2QgICAgCi19OwotICAgIC8qIEFib3ZlIGFycmF5IGFybUNPTU1fSURDVFByZVNjYWxlLCAgaW4gUTIzIGZvcm1hdCAqLwotY29uc3QgT01YX1UzMiBhcm1DT01NX0lEQ1RQcmVTY2FsZVUzMiBbNjRdID0KLXsKLSAgICAweDQwMDAwMCwgMHg1OGM1NDMsIDB4NTM5ZWJhLCAweDRiNDE4YywgMHg0MDAwMDAsIDB4MzI0OGQ0LCAweDQ1NDVlYSwgMHg0NmExNTcsCi0gICAgMHg1OGM1NDMsIDB4N2IyMGQ4LCAweDczZmJmYywgMHg2ODYyMTQsIDB4NThjNTQzLCAweDQ1YmYxZiwgMHg2MDE1YTUsIDB4NjFmNzhiLAotICAgIDB4NTM5ZWJhLCAweDczZmJmYywgMHg2ZDQxM2QsIDB4NjI1M2E2LCAweDUzOWViYSwgMHg0MWIzMjgsIDB4NWE4MjdhLCAweDVjNDg2OSwKLSAgICAweDRiNDE4YywgMHg2ODYyMTQsIDB4NjI1M2E2LCAweDU4N2RlMywgMHg0YjQxOGMsIDB4M2IyMGQ4LCAweDUxNzRlMCwgMHg1MzBkNjksCi0gICAgMHg0MDAwMDAsIDB4NThjNTQzLCAweDUzOWViYSwgMHg0YjQxOGMsIDB4NDAwMDAwLCAweDMyNDhkNCwgMHg0NTQ1ZWEsIDB4NDZhMTU3LAotICAgIDB4MzI0OGQ0LCAweDQ1YmYxZiwgMHg0MWIzMjgsIDB4M2IyMGQ4LCAweDMyNDhkNCwgMHgyNzgyMWQsIDB4MzY2ZDcyLCAweDM3N2U2YiwKLSAgICAweDIyYTJmNSwgMHgzMDBhZDMsIDB4MmQ0MTNkLCAweDI4YmE3MCwgMHgyMmEyZjUsIDB4MWIzNmI5LCAweDI1N2Q4NiwgMHgyNjM5OGQsCi0gICAgMHgxMWE4NTYsIDB4MTg3ZGUzLCAweDE3MTIxYSwgMHgxNGMzNWEsIDB4MTFhODU2LCAweDBkZGY5YiwgMHgxMzFjYzcsIDB4MTM3Y2EyCi19OwotICAgCi1jb25zdCBPTVhfVTE2IGFybUNPTU1fSURDVENvZWYgWzRdID0KLXsKLSAgICAweDVhODIsIC8qIEludlNxcnQyICovCi0gICAgMHgzMGZjLCAvKiBTaW5QSUJ5OCAqLwotICAgIDB4NzY0MiwgLyogQ29zUElCeTggKi8KLSAgICAweDAwMDAgICAgCi19OwotCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3NyYy9hcm1DT01NX01hc2tUYWJsZS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3NyYy9hcm1DT01NX01hc2tUYWJsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTY5YTE2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9zcmMvYXJtQ09NTV9NYXNrVGFibGUuYworKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybUNPTU1fTWFza1RhYmxlLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgMTIyOTAKLSAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIE1hc2sgVGFibGUgdG8gbWFzayB0aGUgZW5kIG9mIGFycmF5LgotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotCi0jZGVmaW5lIE1hc2tUYWJsZVNpemUgNzIKLQotY29uc3QgT01YX1UxNiBhcm1DT01NX3FNYXNrVGFibGUxNltNYXNrVGFibGVTaXplXSA9IAotewotICAgICAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAgICAgMHhGRkZGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgICAgIDB4RkZGRiwgMHhGRkZGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgICAgICAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAgICAgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgICAgIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAKLSAgICAgICAgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHgwMDAwLCAweDAwMDAsIAotICAgICAgICAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4MDAwMCwKLSAgICAgICAgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYgICAgCi19OwotCi1jb25zdCBPTVhfVTggYXJtQ09NTV9xTWFza1RhYmxlOFtNYXNrVGFibGVTaXplXSA9IAotewotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAKLSAgICAgICAgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCi0gICAgICAgIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAotICAgICAgICAweEZGLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAKLSAgICAgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCi0gICAgICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsICAKLSAgICAgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgIAotICAgICAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDAwLCAKLSAgICAgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiAgICAKLX07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvYXBpL2FybVZDLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvYXBpL2FybVZDLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMzdhNWQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2FwaS9hcm1WQy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE2OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkMuaAotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICAxMjI5MAotICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRmlsZTogYXJtVmlkZW8uaAotICogQnJpZWY6IERlY2xhcmVzIEFQSSdzL0Jhc2ljIERhdGEgdHlwZXMgdXNlZCBhY3Jvc3MgdGhlIE9wZW5NQVggVmlkZW8gZG9tYWluCi0gKgotICovCi0KLQotI2lmbmRlZiBfYXJtVmlkZW9fSF8KLSNkZWZpbmUgX2FybVZpZGVvX0hfCi0KLSNpbmNsdWRlICJvbXhWQy5oIgotI2luY2x1ZGUgImFybUNPTU1fQml0c3RyZWFtLmgiCi0KLS8qKgotICogQVJNIHNwZWNpZmljIHN0YXRlIHN0cnVjdHVyZSB0byBob2xkIE1vdGlvbiBFc3RpbWF0aW9uIGluZm9ybWF0aW9uLgotICovCi0gCi1zdHJ1Y3QgbTRwMl9NRVNwZWMKLXsKLSAgICBPTVhWQ000UDJNRVBhcmFtcyBNRVBhcmFtczsKLSAgICBPTVhWQ000UDJNRU1vZGUgICBNRU1vZGU7Ci19OwotCi1zdHJ1Y3QgbTRwMTBfTUVTcGVjCi17Ci0gICAgT01YVkNNNFAxME1FUGFyYW1zIE1FUGFyYW1zOwotICAgIE9NWFZDTTRQMTBNRU1vZGUgICBNRU1vZGU7Ci19OwotCi10eXBlZGVmIHN0cnVjdCBtNHAyX01FU3BlYyAgQVJNVkNNNFAyX01FU3BlYzsKLXR5cGVkZWYgc3RydWN0IG00cDEwX01FU3BlYyBBUk1WQ000UDEwX01FU3BlYzsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX0NvbXBhcmVNVgotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgY29tcGFyaXNpb24gb2YgbW90aW9uIHZlY3RvcnMgYW5kIFNBRCdzIHRvIGRlY2lkZSB0aGUKLSAqIGJlc3QgTVYgYW5kIFNBRAotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gICAgIG12WCAgICAgeCBjb29yZGluYXRlIG9mIHRoZSBjYW5kaWRhdGUgbW90aW9uIHZlY3RvcgotICogW2luXSAgICAgbXZZICAgICB5IGNvb3JkaW5hdGUgb2YgdGhlIGNhbmRpZGF0ZSBtb3Rpb24gdmVjdG9yCi0gKiBbaW5dICAgICBjYW5kU0FEIENhbmRpZGF0ZSBTQUQKLSAqIFtpbl0gICAgIGJlc3RNVlggeCBjb29yZGluYXRlIG9mIHRoZSBiZXN0IG1vdGlvbiB2ZWN0b3IKLSAqIFtpbl0gICAgIGJlc3RNVlkgeSBjb29yZGluYXRlIG9mIHRoZSBiZXN0IG1vdGlvbiB2ZWN0b3IKLSAqIFtpbl0gICAgIGJlc3RTQUQgYmVzdCBTQUQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfSU5UIC0tIDEgdG8gaW5kaWNhdGUgdGhhdCB0aGUgY3VycmVudCBzYWQgaXMgdGhlIGJlc3QKLSAqICAgICAgICAgICAgMCB0byBpbmRpY2F0ZSB0aGF0IGl0IGlzIE5PVCB0aGUgYmVzdCBTQUQKLSAqLwotCi1PTVhfSU5UIGFybVZDTTRQMl9Db21wYXJlTVYgKAotICAgIE9NWF9TMTYgbXZYLAotICAgIE9NWF9TMTYgbXZZLAotICAgIE9NWF9JTlQgY2FuZFNBRCwKLSAgICBPTVhfUzE2IGJlc3RNVlgsCi0gICAgT01YX1MxNiBiZXN0TVZZLAotICAgIE9NWF9JTlQgYmVzdFNBRCk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9BQ0RDUHJlZGljdAotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgYWRhcHRpdmUgREMvQUMgY29lZmZpY2llbnQgcHJlZGljdGlvbiBmb3IgYW4gaW50cmEgYmxvY2suIFByaW9yCi0gKiB0byB0aGUgZnVuY3Rpb24gY2FsbCwgcHJlZGljdGlvbiBkaXJlY3Rpb24gKHByZWREaXIpIHNob3VsZCBiZSBzZWxlY3RlZAotICogYXMgc3BlY2lmaWVkIGluIHN1YmNsYXVzZSA3LjQuMy4xIG9mIElTTy9JRUMgMTQ0OTYtMi4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHBTcmNEc3QgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucwotICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBxdWFudGl6ZWQgY29lZmZpY2llbnQgcmVzaWR1YWxzIChQUUYpIG9mIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYmxvY2sKLSAqIFtpbl0gcFByZWRCdWZSb3cgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcgotICogW2luXSBwUHJlZEJ1ZkNvbCBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyCi0gKiBbaW5dIGN1clFQICAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIGN1cnJlbnQgYmxvY2suIGN1clFQCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF5IGVxdWFsIHRvIHByZWRRUCBlc3BlY2lhbGx5IHdoZW4gdGhlIGN1cnJlbnQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jayBhbmQgdGhlIHByZWRpY3RvciBibG9jayBhcmUgaW4gdGhlIHNhbWUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrLgotICogW2luXSBwcmVkUVAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBwcmVkaWN0b3IgYmxvY2sKLSAqIFtpbl0gcHJlZERpciAgICAgaW5kaWNhdGVzIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbiB3aGljaCB0YWtlcyBvbmUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fSE9SSVpPTlRBTCAgICBwcmVkaWN0IGhvcml6b250YWxseQotICogICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19WRVJUSUNBTCAgICAgIHByZWRpY3QgdmVydGljYWxseQotICogW2luXSBBQ1ByZWRGbGFnICBhIGZsYWcgaW5kaWNhdGluZyBpZiBBQyBwcmVkaWN0aW9uIHNob3VsZCBiZQotICogICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1lZC4gSXQgaXMgZXF1YWwgdG8gYWNfcHJlZF9mbGFnIGluIHRoZSBiaXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gc3ludGF4IG9mIE1QRUctNAotICogW2luXSB2aWRlb0NvbXAgICB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlLCBjaHJvbWluYW5jZSBvcgotICogICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhKSBvZiB0aGUgY3VycmVudCBibG9jawotICogW2luXSBmbGFnICAgICAgICBUaGlzIGZsYWcgZGVmaW5lcyB0aGUgaWYgb25lIHdhbnRzIHRvIHVzZSB0aGlzIGZ1bmN0aW9ucyB0bwotICogICAgICAgICAgICAgICAgICBjYWxjdWxhdGUgUFFGIChzZXQgMSwgcHJlZGljdGlvbikgb3IgUUYgKHNldCAwLCByZWNvbnN0cnVjdGlvbikKLSAqIFtvdXRdICAgIHBQcmVBQ1ByZWRpY3QgICBwb2ludGVyIHRvIHRoZSBwcmVkaWN0ZWQgY29lZmZpY2llbnRzIGJ1ZmZlci4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxsZWQgT05MWSBpZiBpdCBpcyBub3QgTlVMTAotICogW291dF0gICAgcFNyY0RzdCAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIHdoaWNoIGNvbnRhaW5zCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHF1YW50aXplZCBjb2VmZmljaWVudHMgKFFGKSBvZiB0aGUgY3VycmVudAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrCi0gKiBbb3V0XSAgICBwUHJlZEJ1ZlJvdyBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IHJvdyBidWZmZXIKLSAqIFtvdXRdICAgIHBQcmVkQnVmQ29sIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcgotICogW291dF0gICAgcFN1bUVyciAgICAgcG9pbnRlciB0byB0aGUgdXBkYXRlZCBzdW0gb2YgdGhlIGRpZmZlcmVuY2UKLSAqICAgICAgICAgICAgICAgICAgICAgIGJldHdlZW4gcHJlZGljdGVkIGFuZCB1bnByZWRpY3RlZCBjb2VmZmljaWVudHMKLSAqICAgICAgICAgICAgICAgICAgICAgIElmIHRoaXMgaXMgTlVMTCwgZG8gbm90IHVwZGF0ZQotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAyX0FDRENQcmVkaWN0KAotICAgICBPTVhfUzE2ICogcFNyY0RzdCwKLSAgICAgT01YX1MxNiAqIHBQcmVBQ1ByZWRpY3QsCi0gICAgIE9NWF9TMTYgKiBwUHJlZEJ1ZlJvdywKLSAgICAgT01YX1MxNiAqIHBQcmVkQnVmQ29sLAotICAgICBPTVhfSU5UIGN1clFQLAotICAgICBPTVhfSU5UIHByZWRRUCwKLSAgICAgT01YX0lOVCBwcmVkRGlyLAotICAgICBPTVhfSU5UIEFDUHJlZEZsYWcsCi0gICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50ICB2aWRlb0NvbXAsCi0gICAgIE9NWF9VOCBmbGFnLAotICAgICBPTVhfSU5UICpwU3VtRXJyCi0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfU2V0UHJlZERpcgotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgZGV0ZWN0aW5nIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gYmxvY2tJbmRleCAgYmxvY2sgaW5kZXggaW5kaWNhdGluZyB0aGUgY29tcG9uZW50IHR5cGUgYW5kCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gYXMgZGVmaW5lZCBpbiBzdWJjbGF1c2UgNi4xLjMuOCwgb2YgSVNPL0lFQwotICogICAgICAgICAgICAgICAgICAgICAgICAgIDE0NDk2LTIuIEZ1cnRoZXJtb3JlLCBpbmRleGVzIDYgdG8gOSBpbmRpY2F0ZSB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSBibG9ja3Mgc3BhdGlhbGx5IGNvcnJlc3BvbmRpbmcgdG8gbHVtaW5hbmNlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzIDAgdG8gMyBpbiB0aGUgc2FtZSBtYWNyb2Jsb2NrLgotICogW2luXSBwQ29lZkJ1ZlJvdyBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyCi0gKiBbaW5dIHBRcEJ1ZiAgICAgIHBvaW50ZXIgdG8gdGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYnVmZmVyCi0gKiBbb3V0XSAgICBwcmVkUVAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBwcmVkaWN0b3IgYmxvY2sKLSAqIFtvdXRdICAgIHByZWREaXIgICAgIGluZGljYXRlcyB0aGUgcHJlZGljdGlvbiBkaXJlY3Rpb24gd2hpY2ggdGFrZXMgb25lCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX0hPUklaT05UQUwgICAgcHJlZGljdCBob3Jpem9udGFsbHkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fVkVSVElDQUwgICAgICBwcmVkaWN0IHZlcnRpY2FsbHkKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMl9TZXRQcmVkRGlyKAotICAgICBPTVhfSU5UIGJsb2NrSW5kZXgsCi0gICAgIE9NWF9TMTYgKnBDb2VmQnVmUm93LAotICAgICBPTVhfUzE2ICpwQ29lZkJ1ZkNvbCwKLSAgICAgT01YX0lOVCAqcHJlZERpciwKLSAgICAgT01YX0lOVCAqcHJlZFFQLAotICAgICBjb25zdCBPTVhfVTggKnBRcEJ1ZgotKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZW5jb2RpbmcgZm9yIG9uZSBpbnRyYSBibG9jay4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHBwQml0U3RyZWFtICAgICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJpdCBzdHJlYW0KLSAqIFtpbl0gcEJpdE9mZnNldCAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNy4KLSAqIFtpbl0gcFFEY3RCbGtDb2VmICAgIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQKLSAqIFtpbl0gcHJlZERpciAgICAgICAgIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uLCB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgemlnemFnIHNjYW4gcGF0dGVybi4gVGhpcyB0YWtlcyBvbmUgb2YgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGxvd2luZyB2YWx1ZXM6Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19OT05FICAgICAgICAgIEFDIHByZWRpY3Rpb24gbm90IHVzZWQuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nhbi4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX0hPUklaT05UQUwgICAgSG9yaXpvbnRhbCBwcmVkaWN0aW9uLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtdmVydGljYWwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemlnemFnIHNjYW4uCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19WRVJUSUNBTCAgICAgIFZlcnRpY2FsIHByZWRpY3Rpb24uCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS1ob3Jpem9udGFsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppZ3phZyBzY2FuLgotICogW2luXSBwYXR0ZXJuICAgICAgICAgYmxvY2sgcGF0dGVybiB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgYmxvY2sgaXMgZW5jb2RlZAotICogW2luXSBzdGFydCAgICAgICAgICAgc3RhcnQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVuY29kaW5nIGJlZ2lucyB3aXRoIDB0aCBlbGVtZW50Ci0gKiAgICAgICAgICAgICAgICAgICAgICBvciAxc3QuCi0gKiBbb3V0XSAgICBwcEJpdFN0cmVhbSAgICAgKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gYnVmZmVyLgotICogW291dF0gICAgcEJpdE9mZnNldCAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYSgKLSAgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCi0gICAgIGNvbnN0IE9NWF9TMTYgKnBRRGN0QmxrQ29lZiwKLSAgICAgT01YX1U4IHByZWREaXIsCi0gICAgIE9NWF9VOCBwYXR0ZXJuLAotICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCi0gICAgIE9NWF9VOCBzdGFydAotKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIGZvciBvbmUgaW50cmEgY29kZWQgYmxvY2suCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBwcEJpdFN0cmVhbSAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiaXRzdHJlYW0gYnVmZmVyCi0gKiBbaW5dIHBCaXRPZmZzZXQgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBieSAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMC03XS4KLSAqIFtpbl0gcHJlZERpciAgICAgICAgIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB6aWd6YWcgc2NhbiBwYXR0ZXJuLiBJdCB0YWtlcyBvbmUgb2YgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGxvd2luZyB2YWx1ZXM6Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19OT05FICBBQyBwcmVkaWN0aW9uIG5vdCB1c2VkOwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybSBjbGFzc2ljYWwgemlnemFnIHNjYW47Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19IT1JJWk9OVEFMICAgIEhvcml6b250YWwgcHJlZGljdGlvbjsKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybSBhbHRlcm5hdGUtdmVydGljYWwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemlnemFnIHNjYW47Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19WRVJUSUNBTCAgICAgIFZlcnRpY2FsIHByZWRpY3Rpb247Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRodXMgcGVyZm9ybQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHRlcm5hdGUtaG9yaXpvbnRhbAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aWd6YWcgc2Nhbi4KLSAqIFtpbl0gdmlkZW9Db21wICAgICAgIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2UsIGNocm9taW5hbmNlIG9yCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhKSBvZiB0aGUgY3VycmVudCBibG9jawotICogW2luXSBzaG9ydFZpZGVvSGVhZGVyIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIHNob3J0VmlkZW9IZWFkZXI9PTAsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLgotICogW2luXSBzdGFydCAgICAgICAgICAgc3RhcnQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVuY29kaW5nIGJlZ2lucyB3aXRoIDB0aCBlbGVtZW50Ci0gKiAgICAgICAgICAgICAgICAgICAgICBvciAxc3QuCi0gKiBbb3V0XSAgICBwcEJpdFN0cmVhbSAgICAgKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWQsIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyCi0gKiBbb3V0XSAgICBwQml0T2Zmc2V0ICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0KLSAqIFtvdXRdICAgIHBEc3QgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jay4gU2hvdWxkIGJlIDMyLWJpdCBhbGlnbmVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhKAotICAgICBjb25zdCBPTVhfVTggKiogcHBCaXRTdHJlYW0sCi0gICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAotICAgICBPTVhfUzE2ICogcERzdCwKLSAgICAgT01YX1U4IHByZWREaXIsCi0gICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwgCi0gICAgIE9NWF9VOCAgc3RhcnQKLSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9GaWxsVkxEQnVmZmVyCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBmaWxsaW5nIG9mIHRoZSBjb2VmZmljaWVudCBidWZmZXIgYWNjb3JkaW5nIHRvIHRoZSBydW4sIGxldmVsCi0gKiBhbmQgc2lnbiwgYWxzbyB1cGRhdGVzIHRoZSBpbmRleAotICogCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgc3RvcmVSdW4gICAgICAgIFN0b3JlZCBSdW4gdmFsdWUgKGNvdW50IG9mIHplcm9zKSAgIAotICogW2luXSAgc3RvcmVMZXZlbCAgICAgIFN0b3JlZCBMZXZlbCB2YWx1ZSAobm9uLXplcm8gdmFsdWUpCi0gKiBbaW5dICBzaWduICAgICAgICAgICAgRmxhZyBpbmRpY2F0aW5nIHRoZSBzaWduIG9mIGxldmVsCi0gKiBbaW5dICBsYXN0ICAgICAgICAgICAgc3RhdHVzIG9mIHRoZSBsYXN0IGZsYWcKLSAqIFtpbl0gIHBJbmRleCAgICAgICAgICBwb2ludGVyIHRvIGNvZWZmaWNpZW50IGluZGV4IGluIDh4OCBtYXRyaXgKLSAqIFtvdXRdIHBJbmRleCAgICAgICAgICBwb2ludGVyIHRvIHVwZGF0ZWQgY29lZmZpY2llbnQgaW5kZXggaW4gOHg4IAotICogICAgICAgICAgICAgICAgICAgICAgIG1hdHJpeAotICogW2luXSAgcFppZ3phZ1RhYmxlICAgIHBvaW50ZXIgdG8gdGhlIHppZ3phZyB0YWJsZXMKLSAqIFtvdXRdIHBEc3QgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudAotICogICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLiBTaG91bGQgYmUgMzItYml0IGFsaWduZWQKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIoCi0gICAgT01YX1UzMiBzdG9yZVJ1biwKLSAgICBPTVhfUzE2ICogcERzdCwKLSAgICBPTVhfUzE2IHN0b3JlTGV2ZWwsCi0gICAgT01YX1U4ICBzaWduLAotICAgIE9NWF9VOCAgbGFzdCwKLSAgICBPTVhfVTggICogaW5kZXgsCi0gICAgY29uc3QgT01YX1U4ICogcFppZ3phZ1RhYmxlCi0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfR2V0VkxDQml0cwotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgZXNjYXBlIG1vZGUgZGVjaXNpb24gYmFzZWQgb24gdGhlIHJ1biwgcnVuKywgbGV2ZWwsIGxldmVsKyBhbmQgCi0gKiBsYXN0IGNvbWJpbmF0aW9ucy4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KLSAqCQkJCQkJCQl0aGUgYml0IHN0cmVhbQotICogW2luXQlwQml0T2Zmc2V0CQlwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAotICoJCQkJCQkJCWJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNwotICogW2luXSBzaG9ydFZpZGVvSGVhZGVyIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIHNob3J0VmlkZW9IZWFkZXI9PTAsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLgotICogW2luXSBzdGFydCAgICAgICAgICAgc3RhcnQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVuY29kaW5nIGJlZ2lucyB3aXRoIAotICogICAgICAgICAgICAgICAgICAgICAgMHRoIGVsZW1lbnQgb3IgMXN0LgotICogW2luL291dF0gcExhc3QgICAgICAgcG9pbnRlciB0byBsYXN0IHN0YXR1cyBmbGFnCi0gKiBbaW5dIHJ1bkJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDAgICAgICBUaGUgcnVuIHZhbHVlIGZyb20gd2hpY2ggbGV2ZWwgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGVxdWFsIHRvIDE6IGxhc3QgPT0gMAotICogW2luXSBJbmRleEJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDAgICAgQXJyYXkgaW5kZXggaW4gdGhlIFZMQyB0YWJsZSAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50aW5nIHRvIHRoZSAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5CZWdpblNpbmdsZUxldmVsRW50cmllc0wwIAotICogW2luXSBydW5CZWdpblNpbmdsZUxldmVsRW50cmllc0wxICAgICAgVGhlIHJ1biB2YWx1ZSBmcm9tIHdoaWNoIGxldmVsIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBlcXVhbCB0byAxOiBsYXN0ID09IDEKLSAqIFtpbl0gSW5kZXhCZWdpblNpbmdsZUxldmVsRW50cmllc0wxICAgIEFycmF5IGluZGV4IGluIHRoZSBWTEMgdGFibGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGluZyB0byB0aGUgIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMCAKLSAqIFtpbl0gcFJ1bkluZGV4VGFibGVMMCAgICBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAotICogW2luXSBwVmxjVGFibGVMMCAgICAgICAgIFZMQyB0YWJsZSBmb3IgbGFzdCA9PSAwCi0gKiBbaW5dIHBSdW5JbmRleFRhYmxlTDEgICAgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKLSAqIFtpbl0gcFZsY1RhYmxlTDEgICAgICAgICBWTEMgdGFibGUgZm9yIGxhc3QgPT0gMQotICogW2luXSBwTE1BWFRhYmxlTDAgICAgICAgIExldmVsIE1BWCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCi0gKiBbaW5dIHBMTUFYVGFibGVMMSAgICAgICAgTGV2ZWwgTUFYIHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKLSAqIFtpbl0gcFJNQVhUYWJsZUwwICAgICAgICBSdW4gTUFYIHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKLSAqIFtpbl0gcFJNQVhUYWJsZUwxICAgICAgICBSdW4gTUFYIHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKLSAqIFtvdXRdcERzdAkJCSAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudAotICoJCQkJCQkJYmxvY2suIFNob3VsZCBiZSAzMi1iaXQgYWxpZ25lZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAyX0dldFZMQ0JpdHMgKAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCi0JCQkgIE9NWF9TMTYgKiBwRHN0LAotCQkJICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCi0JCQkgIE9NWF9VOCAgICBzdGFydCwJCQkgIAotCQkJICBPTVhfVTggICogcExhc3QsCi0JCQkgIE9NWF9VOCAgICBydW5CZWdpblNpbmdsZUxldmVsRW50cmllc0wwLAotCQkJICBPTVhfVTggICAgbWF4SW5kZXhGb3JNdWx0aXBsZUVudHJpZXNMMCwKLQkJCSAgT01YX1U4ICAgIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wxLAotCQkJICBPTVhfVTggICAgbWF4SW5kZXhGb3JNdWx0aXBsZUVudHJpZXNMMSwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSdW5JbmRleFRhYmxlTDAsCi0gICAgICAgICAgICAgIGNvbnN0IEFSTV9WTEMzMiAqcFZsY1RhYmxlTDAsCi0JCQkgIGNvbnN0IE9NWF9VOCAgKiBwUnVuSW5kZXhUYWJsZUwxLAotICAgICAgICAgICAgICBjb25zdCBBUk1fVkxDMzIgKnBWbGNUYWJsZUwxLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcExNQVhUYWJsZUwwLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcExNQVhUYWJsZUwxLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJNQVhUYWJsZUwwLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJNQVhUYWJsZUwxLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFppZ3phZ1RhYmxlCi0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfUHV0VkxDQml0cwotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ2hlY2tzIHRoZSB0eXBlIG9mIEVzY2FwZSBNb2RlIGFuZCBwdXQgZW5jb2RlZCBiaXRzIGZvciAKLSAqIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnRzLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JIHBwQml0U3RyZWFtICAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCi0gKgkJCQkJCSAgdGhlIGJpdCBzdHJlYW0KLSAqIFtpbl0JIHBCaXRPZmZzZXQgICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3Ci0gKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgc2hvcnRWaWRlb0hlYWRlcj09MCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIHNob3J0VmlkZW9IZWFkZXI9PTEuCi0gKiBbaW5dICBzdGFydCAgICAgICAgICAgIHN0YXJ0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBlbmNvZGluZyBiZWdpbnMgd2l0aCAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgMHRoIGVsZW1lbnQgb3IgMXN0LgotICogW2luXSAgbWF4U3RvcmVSdW5MMCAgICBNYXggc3RvcmUgcG9zc2libGUgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhKQotICogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbGFzdCA9IDAKLSAqIFtpbl0gIG1heFN0b3JlUnVuTDEgICAgTWF4IHN0b3JlIHBvc3NpYmxlIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGxhc3QgPSAxCi0gKiBbaW5dICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMCAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHJ1biB2YWx1ZSBhZnRlciB3aGljaCBsZXZlbCAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBlcXVhbCB0byAxOiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhIHN0YXR1cykgZm9yIGxhc3QgPSAwCi0gKiBbaW5dICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMSAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHJ1biB2YWx1ZSBhZnRlciB3aGljaCBsZXZlbCAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBlcXVhbCB0byAxOiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhIHN0YXR1cykgZm9yIGxhc3QgPSAxCi0gKiBbaW5dICBwUnVuSW5kZXhUYWJsZUwwIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAotICogW2luXSAgcFZsY1RhYmxlTDAgICAgICBWTEMgdGFibGUgZm9yIGxhc3QgPT0gMAotICogW2luXSAgcFJ1bkluZGV4VGFibGVMMSBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKLSAqIFtpbl0gIHBWbGNUYWJsZUwxICAgICAgVkxDIHRhYmxlIGZvciBsYXN0ID09IDEKLSAqIFtpbl0gIHBMTUFYVGFibGVMMCAgICAgTGV2ZWwgTUFYIHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCi0gKiBbaW5dICBwTE1BWFRhYmxlTDEgICAgIExldmVsIE1BWCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMQotICogW2luXSAgcFJNQVhUYWJsZUwwICAgICBSdW4gTUFYIHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCi0gKiBbaW5dICBwUk1BWFRhYmxlTDEgICAgIFJ1biBNQVggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKLSAqIFtvdXRdIHBRRGN0QmxrQ29lZiAgICAgcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudAotICogW291dF0gcHBCaXRTdHJlYW0gICAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZAotICogICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4KLSAqIFtvdXRdIHBCaXRPZmZzZXQgICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQotICogICAgICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0uCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0KLQotT01YUmVzdWx0IGFybVZDTTRQMl9QdXRWTENCaXRzICgKLSAgICAgICAgICAgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgICAgICAgICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAotICAgICAgICAgICAgICBjb25zdCBPTVhfUzE2ICpwUURjdEJsa0NvZWYsCi0gICAgICAgICAgICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKLSAgICAgICAgICAgICAgT01YX1U4IHN0YXJ0LAotICAgICAgICAgICAgICBPTVhfVTggbWF4U3RvcmVSdW5MMCwKLSAgICAgICAgICAgICAgT01YX1U4IG1heFN0b3JlUnVuTDEsCi0gICAgICAgICAgICAgIE9NWF9VOCAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDAsCi0gICAgICAgICAgICAgIE9NWF9VOCAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDEsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUnVuSW5kZXhUYWJsZUwwLAotICAgICAgICAgICAgICBjb25zdCBBUk1fVkxDMzIgKnBWbGNUYWJsZUwwLAotCQkJICBjb25zdCBPTVhfVTggICogcFJ1bkluZGV4VGFibGVMMSwKLSAgICAgICAgICAgICAgY29uc3QgQVJNX1ZMQzMyICpwVmxjVGFibGVMMSwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBMTUFYVGFibGVMMCwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBMTUFYVGFibGVMMSwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSTUFYVGFibGVMMCwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSTUFYVGFibGVMMSwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBaaWd6YWdUYWJsZQotKTsKLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9GaWxsVkxDQnVmZmVyCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBjYWxjdWxhdGluZyB0aGUgVkxDIGJpdHMgZGVwZW5kaW5nIG9uIHRoZSBlc2NhcGUgdHlwZSBhbmQgaW5zZXJ0IAotICogdGhlIHNhbWUgaW4gdGhlIGJpdHN0cmVhbQotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JIHBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KLSAqCSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiaXQgc3RyZWFtCi0gKiBbaW5dCSBwQml0T2Zmc2V0ICAgICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcKLSAqIFtpbl0gIHJ1biAgICAgICAgICAgICAgICBSdW4gdmFsdWUgKGNvdW50IG9mIHplcm9zKSB0byBiZSBlbmNvZGVkICAKLSAqIFtpbl0gIGxldmVsICAgICAgICAgICAgICBMZXZlbCB2YWx1ZSAobm9uLXplcm8gdmFsdWUpIHRvIGJlIGVuY29kZWQKLSAqIFtpbl0gIHJ1blBsdXMgICAgICAgICAgICBDYWxjdWxhdGVkIGFzIHJ1blBsdXMgPSBydW4gLSAoUk1BWCArIDEpICAKLSAqIFtpbl0gIGxldmVsUGx1cyAgICAgICAgICBDYWxjdWxhdGVkIGFzIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsUGx1cyA9IHNpZ24obGV2ZWwpKlthYnMobGV2ZWwpIC0gTE1BWF0KLSAqIFtpbl0gIGZNb2RlICAgICAgICAgICAgICBGbGFnIGluZGljYXRpbmcgdGhlIGVzY2FwZSBtb2RlcwotICogW2luXSAgbGFzdCAgICAgICAgICAgICAgIHN0YXR1cyBvZiB0aGUgbGFzdCBmbGFnCi0gKiBbaW5dICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXMgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHJ1biB2YWx1ZSBhZnRlciB3aGljaCBsZXZlbCB3aWxsIGJlIGVxdWFsIHRvIDE6IAotICogICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSBzdGF0dXMpCi0gKiBbaW5dICBwUnVuSW5kZXhUYWJsZSAgICAgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl90YWJsZXNfVkxDLmgKLSAqIFtpbl0gIHBWbGNUYWJsZSAgICAgICAgICBWTEMgdGFibGUgZGVmaW5lZCBpbiBhcm1WQ000UDJfSHVmZl90YWJsZXNfVkxDLmgKLSAqIFtvdXRdIHBwQml0U3RyZWFtCQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuCi0gKiBbb3V0XSBwQml0T2Zmc2V0ICAgICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAyX0ZpbGxWTENCdWZmZXIgKAotICAgICAgICAgICAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCi0gICAgICAgICAgICAgIE9NWF9VMzIgcnVuLAotICAgICAgICAgICAgICBPTVhfUzE2IGxldmVsLCAKLQkJCSAgT01YX1UzMiBydW5QbHVzLAotICAgICAgICAgICAgICBPTVhfUzE2IGxldmVsUGx1cywgCi0gICAgICAgICAgICAgIE9NWF9VOCAgZk1vZGUsCi0JCQkgIE9NWF9VOCAgbGFzdCwKLSAgICAgICAgICAgICAgT01YX1U4ICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXMsIAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICpwUnVuSW5kZXhUYWJsZSwKLSAgICAgICAgICAgICAgY29uc3QgQVJNX1ZMQzMyICpwVmxjVGFibGUKLSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9DaGVja1ZMQ0VzY2FwZU1vZGUKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGVzY2FwZSBtb2RlIGRlY2lzaW9uIGJhc2VkIG9uIHRoZSBydW4sIHJ1bissIGxldmVsLCBsZXZlbCsgYW5kIAotICogbGFzdCBjb21iaW5hdGlvbnMuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBydW4gICAgICAgICAgICAgUnVuIHZhbHVlIChjb3VudCBvZiB6ZXJvcykgdG8gYmUgZW5jb2RlZCAgCi0gKiBbaW5dIGxldmVsICAgICAgICAgICBMZXZlbCB2YWx1ZSAobm9uLXplcm8gdmFsdWUpIHRvIGJlIGVuY29kZWQKLSAqIFtpbl0gcnVuUGx1cyAgICAgICAgIENhbGN1bGF0ZWQgYXMgcnVuUGx1cyA9IHJ1biAtIChSTUFYICsgMSkgIAotICogW2luXSBsZXZlbFBsdXMgICAgICAgQ2FsY3VsYXRlZCBhcyAKLSAqICAgICAgICAgICAgICAgICAgICAgIGxldmVsUGx1cyA9IHNpZ24obGV2ZWwpKlthYnMobGV2ZWwpIC0gTE1BWF0KLSAqIFtpbl0gbWF4U3RvcmVSdW4gICAgIE1heCBzdG9yZSBwb3NzaWJsZSAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEpCi0gKiBbaW5dIG1heFJ1bkZvck11bHRpcGxlRW50cmllcyAKLSAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBydW4gdmFsdWUgYWZ0ZXIgd2hpY2ggbGV2ZWwgCi0gKiAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGVxdWFsIHRvIDE6IAotICogICAgICAgICAgICAgICAgICAgICAgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhIHN0YXR1cykKLSAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiBzaG9ydFZpZGVvSGVhZGVyPT0wLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MS4KLSAqIFtpbl0gcFJ1bkluZGV4VGFibGUgIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jCi0gKiAgICAgICAgICAgICAgICAgICAgICAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEgc3RhdHVzKQotICoKLSAqICAgICAgICAgICAgICAgICAgICAgIAotICogUmV0dXJuIFZhbHVlOgotICogUmV0dXJucyBhbiBFc2NhcGUgbW9kZSB3aGljaCBjYW4gdGFrZSB2YWx1ZXMgZnJvbSAwIHRvIDMKLSAqIDAgLS0+IG5vIGVzY2FwZSBtb2RlLCAxIC0tPiBlc2NhcGUgdHlwZSAxLAotICogMSAtLT4gZXNjYXBlIHR5cGUgMiwgMyAtLT4gZXNjYXBlIHR5cGUgMywgY2hlY2sgc2VjdGlvbiA3LjQuMS4zCi0gKiBpbiB0aGUgTVBFRyBJU08gc3RhbmRhcmQuCi0gKgotICovCi0KLU9NWF9VOCBhcm1WQ000UDJfQ2hlY2tWTENFc2NhcGVNb2RlKAotICAgICBPTVhfVTMyIHJ1biwKLSAgICAgT01YX1UzMiBydW5QbHVzLAotICAgICBPTVhfUzE2IGxldmVsLAotICAgICBPTVhfUzE2IGxldmVsUGx1cywKLSAgICAgT01YX1U4ICBtYXhTdG9yZVJ1biwKLSAgICAgT01YX1U4ICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXMsCi0gICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKLSAgICAgY29uc3QgT01YX1U4ICAqcFJ1bkluZGV4VGFibGUKLSk7Ci0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcgotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgYSAxNngxNiBibG9jayBzZWFyY2g7IGVzdGltYXRlcyBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIG1pbmltdW0gU0FELiAgCi0gKiBCb3RoIHRoZSBpbnB1dCBhbmQgb3V0cHV0IG1vdGlvbiB2ZWN0b3JzIGFyZSByZXByZXNlbnRlZCB1c2luZyBoYWxmLXBpeGVsIHVuaXRzLCBhbmQgCi0gKiB0aGVyZWZvcmUgYSBzaGlmdCBsZWZ0IG9yIHJpZ2h0IGJ5IDEgYml0IG1heSBiZSByZXF1aXJlZCwgcmVzcGVjdGl2ZWx5LCB0byBtYXRjaCB0aGUgCi0gKiBpbnB1dCBvciBvdXRwdXQgTVZzIHdpdGggb3RoZXIgZnVuY3Rpb25zIHRoYXQgZWl0aGVyIGdlbmVyYXRlIG91dHB1dCBNVnMgb3IgZXhwZWN0IAotICogaW5wdXQgTVZzIHJlcHJlc2VudGVkIHVzaW5nIGludGVnZXIgcGl4ZWwgdW5pdHMuIAotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcFNyY1JlZkJ1ZgkJcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIE1CIHRoYXQgCi0gKiAgICAgICAgICAgICAgICAgICAgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgCi0gKiAgICAgICAgICAgICAgICAgICAgcGxhbmUuCi0gKiBbaW5dCXJlZldpZHRoCQkgIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUKLSAqIFtpbl0JcFJlZlJlY3QJCSAgcG9pbnRlciB0byB0aGUgdmFsaWQgcmVjdGFuZ3VsYXIgaW4gcmVmZXJlbmNlIHBsYW5lLiBSZWxhdGl2ZSB0byBpbWFnZSBvcmlnaW4uIAotICogICAgICAgICAgICAgICAgICAgIEl0J3Mgbm90IGxpbWl0ZWQgdG8gdGhlIGltYWdlIGJvdW5kYXJ5LCBidXQgZGVwZW5kZWQgb24gdGhlIHBhZGRpbmcuIEZvciBleGFtcGxlLCAKLSAqICAgICAgICAgICAgICAgICAgICBpZiB5b3UgcGFkIDQgcGl4ZWxzIG91dHNpZGUgdGhlIGltYWdlIGJvcmRlciwgdGhlbiB0aGUgdmFsdWUgZm9yIGxlZnQgYm9yZGVyIAotICogICAgICAgICAgICAgICAgICAgIGNhbiBiZSAtNAotICogW2luXQlwU3JjQ3VyckJ1ZgkJcG9pbnRlciB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGV4dHJhY3RlZCBmcm9tIG9yaWdpbmFsIHBsYW5lIChsaW5lYXIgYXJyYXksIAotICogICAgICAgICAgICAgICAgICAgIDI1NiBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4KLSAqIFtpbl0gcEN1cnJQb2ludFBvcwlwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lCi0gKiBbaW5dIHBTcmNQcmVNVgkJICBwb2ludGVyIHRvIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yOyBOVUxMIGluZGljYXRlcyBubyBwcmVkaWN0ZWQgTVYKLSAqIFtpbl0gcFNyY1ByZVNBRAkJcG9pbnRlciB0byBTQUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmVkaWN0ZWQgTVYgKHJlZmVyZW5jZWQgYnkgcFNyY1ByZU1WKQotICogW2luXSBzZWFyY2hSYW5nZQkJc2VhcmNoIHJhbmdlIGZvciAxNlgxNiBpbnRlZ2VyIGJsb2NrLHRoZSB1bml0cyBvZiBpdCBpcyBmdWxsIHBpeGVsLHRoZSBzZWFyY2ggcmFuZ2UgCi0gKiAgICAgICAgICAgICAgICAgICAgaXMgdGhlIHNhbWUgaW4gYWxsIGRpcmVjdGlvbnMuSXQgaXMgaW4gaW5jbHVzaXZlIG9mIHRoZSBib3VuZGFyeSBhbmQgc3BlY2lmaWVkIGluIAotICogICAgICAgICAgICAgICAgICAgIHRlcm1zIG9mIGludGVnZXIgcGl4ZWwgdW5pdHMuCi0gKiBbaW5dIHBNRVNwZWMJCQkgIHZlbmRvci1zcGVjaWZpYyBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZTsgbXVzdCBoYXZlIGJlZW4gYWxsb2NhdGVkIAotICogICAgICAgICAgICAgICAgICAgIGFuZCB0aGVuIGluaXRpYWxpemVkIHVzaW5nIG9teFZDTTRQMl9NRUluaXQgcHJpb3IgdG8gY2FsbGluZyB0aGUgYmxvY2sgbWF0Y2hpbmcgCi0gKiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24uCi0gKiBbaW5dIEJsb2NrU2l6ZSAgICAgTWFjcm9CbG9jayBTaXplIGkuZSBlaXRoZXIgMTZ4MTYgb3IgOHg4LgotICogW291dF0JcERzdE1WCQkJcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYKLSAqIFtvdXRdCXBEc3RTQUQJCQlwb2ludGVyIHRvIG1pbmltdW0gU0FECi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX1N0c19Ob0VyciCoQyBubyBlcnJvci4KLSAqIE9NWF9TdHNfQmFkQXJnRXJyIKhDIGJhZCBhcmd1bWVudHMKLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXIoCi0gICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKLSAgICAgT01YX0lOVCByZWZXaWR0aCwKLSAgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCi0gICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCi0gICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCi0gICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjUHJlTVYsCi0gICAgIGNvbnN0IE9NWF9JTlQgKnBTcmNQcmVTQUQsCi0gICAgIHZvaWQgKnBNRVNwZWMsCi0gICAgIE9NWFZDTW90aW9uVmVjdG9yICpwRHN0TVYsCi0gICAgIE9NWF9JTlQgKnBEc3RTQUQsCi0gICAgIE9NWF9VOCBCbG9ja1NpemUKLSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9CbG9ja01hdGNoX0hhbGYKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGEgMTZ4MTYgYmxvY2sgbWF0Y2ggd2l0aCBoYWxmLXBpeGVsIHJlc29sdXRpb24uICBSZXR1cm5zIHRoZSBlc3RpbWF0ZWQgCi0gKiBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIG1pbmltdW0gU0FELiAgVGhpcyBmdW5jdGlvbiBlc3RpbWF0ZXMgdGhlIGhhbGYtcGl4ZWwgCi0gKiBtb3Rpb24gdmVjdG9yIGJ5IGludGVycG9sYXRpbmcgdGhlIGludGVnZXIgcmVzb2x1dGlvbiBtb3Rpb24gdmVjdG9yIHJlZmVyZW5jZWQgCi0gKiBieSB0aGUgaW5wdXQgcGFyYW1ldGVyIHBTcmNEc3RNViwgaS5lLiwgdGhlIGluaXRpYWwgaW50ZWdlciBNViBpcyBnZW5lcmF0ZWQgCi0gKiBleHRlcm5hbGx5LiAgVGhlIGlucHV0IHBhcmFtZXRlcnMgcFNyY1JlZkJ1ZiBhbmQgcFNlYXJjaFBvaW50UmVmUG9zIHNob3VsZCBiZSAKLSAqIHNoaWZ0ZWQgYnkgdGhlIHdpbm5pbmcgTVYgb2YgMTZ4MTYgaW50ZWdlciBzZWFyY2ggcHJpb3IgdG8gY2FsbGluZyBCbG9ja01hdGNoX0hhbGZfMTZ4MTYuICAKLSAqIFRoZSBmdW5jdGlvbiBCbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYgbWF5IGJlIHVzZWQgZm9yIGludGVnZXIgbW90aW9uIGVzdGltYXRpb24uCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwU3JjUmVmQnVmCQlwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgTUIgCi0gKiAgICAgICAgICAgICAgICAgICAgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiAKLSAqICAgICAgICAgICAgICAgICAgICB0aGUJY3VycmVudCBwbGFuZS4KLSAqIFtpbl0JcmVmV2lkdGgJCSAgd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZQotICogW2luXQlwUmVmUmVjdAkJICByZWZlcmVuY2UgcGxhbmUgdmFsaWQgcmVnaW9uIHJlY3RhbmdsZQotICogW2luXQlwU3JjQ3VyckJ1ZgkJcG9pbnRlciB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGV4dHJhY3RlZCBmcm9tIG9yaWdpbmFsIHBsYW5lIAotICogICAgICAgICAgICAgICAgICAgIChsaW5lYXIgYXJyYXksIDI1NiBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiBbaW5dCXBTZWFyY2hQb2ludFJlZlBvcwlwb3NpdGlvbiBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIGhhbGYgcGl4ZWwgc2VhcmNoIChzcGVjaWZpZWQgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGVybXMgb2YgaW50ZWdlciBwaXhlbCB1bml0cykgaW4gdGhlIHJlZmVyZW5jZSBwbGFuZS4KLSAqIFtpbl0Jcm5kVmFsCQkJICByb3VuZGluZyBjb250cm9sIGJpdCBmb3IgaGFsZiBwaXhlbCBtb3Rpb24gZXN0aW1hdGlvbjsgCi0gKiAgICAgICAgICAgICAgICAgICAgMD1yb3VuZGluZyBjb250cm9sIGRpc2FibGVkOyAxPXJvdW5kaW5nIGNvbnRyb2wgZW5hYmxlZAotICogW2luXQlwU3JjRHN0TVYJCXBvaW50ZXIgdG8gdGhlIGluaXRpYWwgTVYgZXN0aW1hdGU7IHR5cGljYWxseSBnZW5lcmF0ZWQgZHVyaW5nIGEgcHJpb3IgCi0gKiAgICAgICAgICAgICAgICAgIDE2WDE2IGludGVnZXIgc2VhcmNoIGFuZCBpdHMgdW5pdCBpcyBoYWxmIHBpeGVsLgotICogW2luXSBCbG9ja1NpemUgICAgIE1hY3JvQmxvY2sgU2l6ZSBpLmUgZWl0aGVyIDE2eDE2IG9yIDh4OC4KLSAqIFtvdXRdcFNyY0RzdE1WCQlwb2ludGVyIHRvIGVzdGltYXRlZCBNVgotICogW291dF1wRHN0U0FECQkJcG9pbnRlciB0byBtaW5pbXVtIFNBRAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9TdHNfTm9FcnIgqEMgbm8gZXJyb3IKLSAqIE9NWF9TdHNfQmFkQXJnRXJyIKhDIGJhZCBhcmd1bWVudHMKLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMl9CbG9ja01hdGNoX0hhbGYoCi0gICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKLSAgICAgT01YX0lOVCByZWZXaWR0aCwKLSAgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCi0gICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCi0gICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBTZWFyY2hQb2ludFJlZlBvcywKLSAgICAgT01YX0lOVCBybmRWYWwsCi0gICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjRHN0TVYsCi0gICAgIE9NWF9JTlQgKnBEc3RTQUQsCi0gICAgIE9NWF9VOCBCbG9ja1NpemUKLSk7Ci0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfUGFkTVYKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIG1vdGlvbiB2ZWN0b3IgcGFkZGluZyBmb3IgYSBtYWNyb2Jsb2NrLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gcFNyY0RzdE1WICAgICAgIHBvaW50ZXIgdG8gbW90aW9uIHZlY3RvciBidWZmZXIgb2YgdGhlIGN1cnJlbnQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9jawotICogW2luXSBwVHJhbnNwICAgICAgICAgcG9pbnRlciB0byB0cmFuc3BhcmVudCBzdGF0dXMgYnVmZmVyIG9mIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IG1hY3JvYmxvY2sKLSAqIFtvdXRdICAgIHBTcmNEc3RNViAgICAgICBwb2ludGVyIHRvIG1vdGlvbiB2ZWN0b3IgYnVmZmVyIGluIHdoaWNoIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb24gdmVjdG9ycyBoYXZlIGJlZW4gcGFkZGVkCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMl9QYWRNVigKLSAgICAgT01YVkNNb3Rpb25WZWN0b3IgKiBwU3JjRHN0TVYsCi0gICAgIE9NWF9VOCAqIHBUcmFuc3AKLSk7Ci0KLS8qIAotICogSC4yNjQgU3BlY2lmaWMgRGVjbGFyYXRpb25zIAotICovCi0vKiBEZWZpbmVzICovCi0jZGVmaW5lIEFSTV9NNFAxMF9RX09GRlNFVCAgICAgICAgKDE1KQotCi0KLS8qIERlcXVhbnQgdGFibGVzICovCi0KLWV4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAxMF9Qb3NUb1ZDb2w0eDRbMTZdOwotZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1Bvc1RvVkNvbDJ4Mls0XTsKLWV4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAxMF9WTWF0cml4WzZdWzNdOwotZXh0ZXJuIGNvbnN0IE9NWF9VMzIgYXJtVkNNNFAxMF9NRk1hdHJpeFs2XVszXTsKLQotCi0vKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm0gdGhlIHdvcmsgcmVxdWlyZWQgYnkgdGhlIE9wZW5NQVgKLSAqIERlY29kZUNvZWZmc1RvUGFpciBmdW5jdGlvbiBhbmQgRGVjb2RlQ2hyb21hRENDb2VmZnNUb1BhaXIuCi0gKiBTaW5jZSBtb3N0IG9mIHRoZSBjb2RlIGlzIGNvbW1vbiB3ZSBzaGFyZSBpdCBoZXJlLgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBwQml0U3RyZWFtCQlEb3VibGUgcG9pbnRlciB0byBjdXJyZW50IGJ5dGUgaW4gYml0IHN0cmVhbSBidWZmZXIKLSAqIFtpbl0JcE9mZnNldAkJCVBvaW50ZXIgdG8gY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAotICoJCQkJCQkJCXRvIGJ5ICpwcEJpdFN0cmVhbQotICogW2luXQlzTWF4TnVtQ29lZmYJTWF4aW11bSBudW1iZXIgb2Ygbm9uLXplcm8gY29lZmZpY2llbnRzIGluIGN1cnJlbnQKLSAqCQkJCQkJCQlibG9jayAoNCwxNSBvciAxNikKLSAqIFtpbl0JblRhYmxlICAgICAgICAgIFRhYmxlIG51bWJlciAoMCB0byA0KSBhY2NvcmRpbmcgdG8gdGhlIGZpdmUgY29sdW1ucwotICogICAgICAgICAgICAgICAgICAgICAgb2YgVGFibGUgOS01IGluIHRoZSBILjI2NCBzcGVjCi0gKiBbb3V0XQlwcEJpdFN0cmVhbQkJKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkCi0gKiBbb3V0XQlwT2Zmc2V0CQkJKnBPZmZzZXQgaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQKLSAqIFtvdXRdCXBOdW1Db2VmZgkJUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIG5vbnplcm8gY29lZmZpY2llbnRzIGluCi0gKgkJCQkJCQkJdGhpcyBibG9jawotICogW291dF0JcHBQb3NDb2VmYnVmCURvdWJsZSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIHJlc2lkdWFsCi0gKgkJCQkJCQkJY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIG9teEVycm9yIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0KLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIoCi0gICAgIGNvbnN0IE9NWF9VOCoqIHBwQml0U3RyZWFtLAotICAgICBPTVhfUzMyKiBwT2Zmc2V0LAotICAgICBPTVhfVTgqIHBOdW1Db2VmZiwKLSAgICAgT01YX1U4KipwcFBvc0NvZWZidWYsCi0gICAgIE9NWF9JTlQgblRhYmxlLAotICAgICBPTVhfSU5UIHNNYXhOdW1Db2VmZiAgICAgICAgCi0gKTsKLQotLyoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybSBEQyBzdHlsZSBpbnRyYSBwcmVkaWN0aW9uLCBhdmVyYWdpbmcgdXBwZXIgYW5kIGxlZnQgYmxvY2sKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwU3JjTGVmdAkJUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDE2IGxlZnQgY29lZmZpY2llbnRzOgotICoJCQkJCQkJCXBbeCwgeV0gKHggPSAtMSwgeSA9IDAuLjMpCi0gKiBbaW5dCXBTcmNBYm92ZQkJUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDE2IGFib3ZlIGNvZWZmaWNpZW50czoKLSAqCQkJCQkJCQlwW3gseV0gKHggPSAwLi4zLCB5ID0gLTEpCi0gKiBbaW5dCWxlZnRTdGVwCQlTdGVwIG9mIGxlZnQgY29lZmZpY2llbnQgYnVmZmVyCi0gKiBbaW5dCWRzdFN0ZXAJCQlTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKLSAqIFtpbl0JYXZhaWxhYmlsaXR5CU5laWdoYm9yaW5nIDE2eDE2IE1CIGF2YWlsYWJpbGl0eSBmbGFnCi0gKiBbb3V0XQlwRHN0CQkJUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogTm9uZQotICovCi0KLXZvaWQgYXJtVkNNNFAxMF9QcmVkaWN0SW50cmFEQzR4NCgKLSAgICAgY29uc3QgT01YX1U4KiBwU3JjTGVmdCwKLSAgICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmUsCi0gICAgIE9NWF9VOCogcERzdCwKLSAgICAgT01YX0lOVCBsZWZ0U3RlcCwKLSAgICAgT01YX0lOVCBkc3RTdGVwLAotICAgICBPTVhfUzMyIGF2YWlsYWJpbGl0eSAgICAgICAgCi0pOwotCi0vKgotICogRGVzY3JpcHRpb24KLSAqIFVucGFjayBhIDR4NCBibG9jayBvZiBjb2VmZmljaWVudC1yZXNpZHVhbCBwYWlyIHZhbHVlcwotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBwU3JjCURvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIKLSAqCQkJCQkJYnVmZmVyIG91dHB1dCBieSBDQUxWQyBkZWNvZGluZwotICogW291dF0JcHBTcmMJKnBwU3JjIGlzIHVwZGF0ZWQgdG8gdGhlIHN0YXJ0IG9mIG5leHQgbm9uIGVtcHR5IGJsb2NrCi0gKiBbb3V0XQlwRHN0CVBvaW50ZXIgdG8gdW5wYWNrZWQgNHg0IGJsb2NrCi0gKi8KLQotdm9pZCBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0KAotICAgICBjb25zdCBPTVhfVTggKipwcFNyYywKLSAgICAgT01YX1MxNiogcERzdAotKTsKLQotLyoKLSAqIERlc2NyaXB0aW9uCi0gKiBVbnBhY2sgYSAyeDIgYmxvY2sgb2YgY29lZmZpY2llbnQtcmVzaWR1YWwgcGFpciB2YWx1ZXMKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwcFNyYwlEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyCi0gKgkJCQkJCWJ1ZmZlciBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcKLSAqIFtvdXRdCXBwU3JjCSpwcFNyYyBpcyB1cGRhdGVkIHRvIHRoZSBzdGFydCBvZiBuZXh0IG5vbiBlbXB0eSBibG9jawotICogW291dF0JcERzdAlQb2ludGVyIHRvIHVucGFja2VkIDR4NCBibG9jawotICovCi0KLXZvaWQgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazJ4MigKLSAgICAgY29uc3QgT01YX1U4ICoqcHBTcmMsCi0gICAgIE9NWF9TMTYqIHBEc3QKLSk7Ci0KLS8qCi0gKiBEZXNjcmlwdGlvbgotICogRGVibG9jayBvbmUgYm91bmRhcnkgcGl4ZWwKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwUTAgICAgICAgICBQb2ludGVyIHRvIHBpeGVsIHEwCi0gKiBbaW5dIFN0ZXAgICAgICAgIFN0ZXAgYmV0d2VlbiBwaXhlbHMgcTAgYW5kIHExCi0gKiBbaW5dIHRDMCAgICAgICAgIEVkZ2UgdGhyZXNob2xkIHZhbHVlCi0gKiBbaW5dIGFscGhhICAgICAgIGFscGhhIHRocmVzaG9sZCB2YWx1ZQotICogW2luXSBiZXRhICAgICAgICBiZXRhIHRocmVzaG9sZCB2YWx1ZQotICogW2luXSBiUyAgICAgICAgICBkZWJsb2NraW5nIHN0cmVuZ3RoCi0gKiBbaW5dIENocm9tYUZsYWcgIFRydWUgZm9yIGNocm9tYSBibG9ja3MKLSAqIFtvdXRdIHBRMCAgICAgICAgRGVibG9ja2VkIHBpeGVscwotICogCi0gKi8KLQotdm9pZCBhcm1WQ000UDEwX0RlQmxvY2tQaXhlbCgKLSAgICBPTVhfVTggKnBRMCwgICAgLyogcG9pbnRlciB0byB0aGUgcGl4ZWwgcTAgKi8KLSAgICBpbnQgU3RlcCwgICAgICAgLyogc3RlcCBiZXR3ZWVuIHBpeGVscyBxMCBhbmQgcTEgKi8KLSAgICBpbnQgdEMwLCAgICAgICAgLyogZWRnZSB0aHJlc2hvbGQgdmFsdWUgKi8KLSAgICBpbnQgYWxwaGEsICAgICAgLyogYWxwaGEgKi8KLSAgICBpbnQgYmV0YSwgICAgICAgLyogYmV0YSAqLwotICAgIGludCBiUywgICAgICAgICAvKiBkZWJsb2NraW5nIHN0cmVuZ3RoICovCi0gICAgaW50IENocm9tYUZsYWcKLSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgaG9yaXpvbnRhbCAxLzItcGVsIHBvc2l0aW9ucwotICoKLSAqIFJlbWFya3M6Ci0gKgotICoJW2luXQlwU3JjCQkJUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sgdXNlZCB0byBpbnRlcnBvbGF0ZSAKLSAJCQkJCQkJCQkJCQkJaW4gdGhlIHJlY29uc3RydWN0ZWQgZnJhbWUgcGxhbmUKLSAqCVtpbl0JaVNyY1N0ZXAJU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4KLSAqCVtpbl0JaURzdFN0ZXAJU3RlcCBvZiB0aGUgZGVzdGluYXRpb24oaW50ZXJwb2xhdGlvbikgYnVmZmVyLgotICoJW2luXQlpV2lkdGgJCVdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKglbaW5dCWlIZWlnaHQJCUhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jawotICoJW291dF0JcERzdAkgICAgUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIDEvMi1wZWwgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYSgKLSAgICAgICAgY29uc3QgT01YX1U4KgkJcFNyYywgCi0JCU9NWF9VMzIgCWlTcmNTdGVwLCAKLQkJT01YX1U4KiAJcERzdCwgCi0JCU9NWF9VMzIgCWlEc3RTdGVwLCAKLQkJT01YX1UzMiAJaVdpZHRoLCAKLQkJT01YX1UzMiAJaUhlaWdodAotKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYQotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgdmVydGljYWwgMS8yLXBlbCBwb3NpdGlvbnMgCi0gKiBhcm91bmQgYSBmdWxsLXBlbCBwb3NpdGlvbi4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqCVtpbl0JcFNyYwkJCVBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgCi0gKgkJCQkJCQkJCQkJCWluIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lCi0gKglbaW5dCWlTcmNTdGVwCVN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuCi0gKglbaW5dCWlEc3RTdGVwCVN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KLSAqCVtpbl0JaVdpZHRoCQlXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jawotICoJW2luXQlpSGVpZ2h0CQlIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqCVtvdXRdCXBEc3QgICAgCVBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSAxLzItcGVsCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYSgJCi0JIGNvbnN0IE9NWF9VOCogCXBTcmMsIAotCSBPTVhfVTMyIAlpU3JjU3RlcCwgCi0gCSBPTVhfVTgqIAlwRHN0LAotIAkgT01YX1UzMiAJaURzdFN0ZXAsIAotIAkgT01YX1UzMiAJaVdpZHRoLCAKLSAJIE9NWF9VMzIgCWlIZWlnaHQKLSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmRGlhZ19MdW1hCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciAoMS8yLCAxLzIpICBwb3NpdGlvbnMgCi0gKiBhcm91bmQgYSBmdWxsLXBlbCBwb3NpdGlvbi4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqICBbaW5dICAgIHBTcmMgICAgICAgIFBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZQotICogIFtpbl0gICAgaVNyY1N0ZXAgICAgU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4KLSAqICBbaW5dICAgIGlEc3RTdGVwICAgIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KLSAqICBbaW5dICAgIGlXaWR0aCAgICAgIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKiAgW2luXSAgICBpSGVpZ2h0ICAgICBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqICBbb3V0XSAgIHBEc3QgICAgICAgIFBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSAoMS8yLDEvMiktcGVsCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZEaWFnX0x1bWEoICAKLSAgICAgICAgY29uc3QgT01YX1U4KiAgICAgcFNyYywgCi0gICAgICAgIE9NWF9VMzIgICAgIGlTcmNTdGVwLCAKLSAgICAgICAgT01YX1U4KiAgICAgcERzdCwgCi0gICAgICAgIE9NWF9VMzIgICAgIGlEc3RTdGVwLAotICAgICAgICBPTVhfVTMyICAgICBpV2lkdGgsIAotICAgICAgICBPTVhfVTMyICAgICBpSGVpZ2h0Ci0pOwotCi0vKgotICogRGVzY3JpcHRpb246Ci0gKiBUcmFuc2Zvcm0gUmVzaWR1YWwgNHg0IENvZWZmaWNpZW50cwotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICBwU3JjCQlTb3VyY2UgNHg0IGJsb2NrCi0gKiBbb3V0XSBwRHN0CQlEZXN0aW5hdGlvbiA0eDQgYmxvY2sKLSAqCi0gKi8KLQotdm9pZCBhcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0KE9NWF9TMTYqIHBEc3QsIE9NWF9TMTYgKnBTcmMpOwotCi0vKgotICogRGVzY3JpcHRpb246Ci0gKiBGb3J3YXJkIFRyYW5zZm9ybSBSZXNpZHVhbCA0eDQgQ29lZmZpY2llbnRzCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gIHBTcmMJCVNvdXJjZSA0eDQgYmxvY2sKLSAqIFtvdXRdIHBEc3QJCURlc3RpbmF0aW9uIDR4NCBibG9jawotICoKLSAqLwotCi12b2lkIGFybVZDTTRQMTBfRndkVHJhbnNmb3JtUmVzaWR1YWw0eDQoT01YX1MxNiogcERzdCwgT01YX1MxNiAqcFNyYyk7Ci0KLU9NWF9JTlQgYXJtVkNNNFAxMF9Db21wYXJlTW90aW9uQ29zdFRvTVYgKAotICAgIE9NWF9TMTYgIG12WCwKLSAgICBPTVhfUzE2ICBtdlksCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgZGlmZk1WLCAKLSAgICBPTVhfSU5UIGNhbmRTQUQsIAotICAgIE9NWFZDTW90aW9uVmVjdG9yICpiZXN0TVYsIAotICAgIE9NWF9VMzIgbkxhbWRhLAotICAgIE9NWF9TMzIgKnBCZXN0Q29zdCk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDQ09NTV9TQUQKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlIHRoZSBTQUQgZm9yIE54TSBibG9ja3MuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBbaW5dCQlwU3JjT3JnCQlQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jawotICogW2luXQkJaVN0ZXBPcmcJU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyCi0gKiBbaW5dCQlwU3JjUmVmCQlQb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sKLSAqIFtpbl0JCWlTdGVwUmVmCVN0ZXAgb2YgdGhlIHJlZmVyZW5jZSBibG9jayBidWZmZXIKLSAqIFtpbl0JCWlIZWlnaHQJCUhlaWdodCBvZiB0aGUgYmxvY2sKLSAqIFtpbl0JCWlXaWR0aAkJV2lkdGggb2YgdGhlIGJsb2NrCi0gKiBbb3V0XQlwRHN0U0FECQlQb2ludGVyIG9mIHJlc3VsdCBTQUQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCi0gKgotICovCi1PTVhSZXN1bHQgYXJtVkNDT01NX1NBRCgJCi0JY29uc3QgT01YX1U4KiAJcFNyY09yZywKLQlPTVhfVTMyIAlpU3RlcE9yZywKLQljb25zdCBPTVhfVTgqIAlwU3JjUmVmLAotCU9NWF9VMzIgCWlTdGVwUmVmLAotCU9NWF9TMzIqCXBEc3RTQUQsCi0JT01YX1UzMgkJaUhlaWdodCwKLQlPTVhfVTMyCQlpV2lkdGgpOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ0NPTU1fQXZlcmFnZQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBhdmVyYWdlIG9mIHR3byBibG9ja3MgYW5kIHN0b3JlcyB0aGUgcmVzdWx0LgotICoKLSAqIFJlbWFya3M6Ci0gKgotICoJW2luXQlwUHJlZDAJCQlQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDAKLSAqCVtpbl0JcFByZWQxCQkJUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAxCi0gKglbaW5dCWlQcmVkU3RlcDAJICAgIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAKLSAqCVtpbl0JaVByZWRTdGVwMQkgICAgU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMQotICoJW2luXQlpRHN0U3RlcCAJCVN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgotICoJW2luXQlpV2lkdGgJCQlXaWR0aCBvZiB0aGUgYmxvY2tzCi0gKglbaW5dCWlIZWlnaHQJCQlIZWlnaHQgb2YgdGhlIGJsb2NrcwotICoJW291dF0JcERzdFByZWQJCVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KLSAqCi0gKi8KLSBPTVhSZXN1bHQgYXJtVkNDT01NX0F2ZXJhZ2UgKAotCSBjb25zdCBPTVhfVTgqIAkgICAgcFByZWQwLAotCSBjb25zdCBPTVhfVTgqIAkgICAgcFByZWQxLAkKLQkgT01YX1UzMgkJaVByZWRTdGVwMCwKLQkgT01YX1UzMgkJaVByZWRTdGVwMSwKLQkgT01YX1U4KgkJcERzdFByZWQsCi0JIE9NWF9VMzIJCWlEc3RTdGVwLCAKLQkgT01YX1UzMgkJaVdpZHRoLAotCSBPTVhfVTMyCQlpSGVpZ2h0Ci0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX1NBRFF1YXIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGJldHdlZW4gb25lIGJsb2NrIChwU3JjKSBhbmQgdGhlIAotICogYXZlcmFnZSBvZiB0aGUgb3RoZXIgdHdvIChwU3JjUmVmMCBhbmQgcFNyY1JlZjEpCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBbaW5dCQlwU3JjCQkJCVBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrCi0gKiBbaW5dCQlwU3JjUmVmMAkJUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMAotICogW2luXQkJcFNyY1JlZjEJCVBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDEKLSAqIFtpbl0JCWlTcmNTdGVwIAkJU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyCi0gKiBbaW5dCQlpUmVmU3RlcDAJCVN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiBbaW5dCQlpUmVmU3RlcDEgCVN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiBbaW5dCQlpSGVpZ2h0CQkJSGVpZ2h0IG9mIHRoZSBibG9jawotICogW2luXQkJaVdpZHRoCQkJV2lkdGggb2YgdGhlIGJsb2NrCi0gKiBbb3V0XQlwRHN0U0FECQkJUG9pbnRlciBvZiByZXN1bHQgU0FECi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgotICoKLSAqLwotT01YUmVzdWx0IGFybVZDTTRQMTBfU0FEUXVhcigKLQljb25zdCBPTVhfVTgqIAlwU3JjLAotICAgIGNvbnN0IE9NWF9VOCogCXBTcmNSZWYwLAotCWNvbnN0IE9NWF9VOCogCXBTcmNSZWYxLAkKLSAgICBPTVhfVTMyIAlpU3JjU3RlcCwKLSAgICBPTVhfVTMyCQlpUmVmU3RlcDAsCi0gICAgT01YX1UzMgkJaVJlZlN0ZXAxLAotICAgIE9NWF9VMzIqCXBEc3RTQUQsCi0gICAgT01YX1UzMiAgICAgaUhlaWdodCwKLSAgICBPTVhfVTMyICAgICBpV2lkdGgKLSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yIGNocm9tYSBjb21wb25lbnRzLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogIFtpbl0gICAgcFNyYyAgICAgICAgICAgIFBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnBvbGF0ZSBpbiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZQotICogIFtpbl0gICAgaVNyY1N0ZXAgICAgU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4KLSAqICBbaW5dICAgIGlEc3RTdGVwICAgIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KLSAqICBbaW5dICAgIGlXaWR0aCAgICAgIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKiAgW2luXSAgICBpSGVpZ2h0ICAgICBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqICBbaW5dICAgIGR4ICAgICAgICAgICAgICBGcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvOCBwaXhlbCB1bml0ICgwfjcpIAotICogIFtpbl0gICAgZHkgICAgICAgICAgICAgIEZyYWN0aW9uYWwgcGFydCBvZiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvOCBwaXhlbCB1bml0ICgwfjcpCi0gKiAgW291dF0gICBwRHN0ICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCi0gKgotICovCi0gT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hKAotICAgICAgICBPTVhfVTggICAgICAqcFNyYywKLSAgICAgICAgT01YX1UzMiAgICAgaVNyY1N0ZXAsCi0gICAgICAgIE9NWF9VOCAgICAgICpwRHN0LAotICAgICAgICBPTVhfVTMyICAgICBpRHN0U3RlcCwKLSAgICAgICAgT01YX1UzMiAgICAgaVdpZHRoLAotICAgICAgICBPTVhfVTMyICAgICBpSGVpZ2h0LAotICAgICAgICBPTVhfVTMyICAgICBkeCwKLSAgICAgICAgT01YX1UzMiAgICAgZHkKLSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfTHVtYQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciBsdW1hIGNvbXBvbmVudHMuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiAgW2luXSAgICBwU3JjICAgICAgICAgICAgUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sgdXNlZCB0byAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycG9sYXRlIGluIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lCi0gKiAgW2luXSAgICBpU3JjU3RlcCAgICBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLgotICogIFtpbl0gICAgaURzdFN0ZXAgICAgU3RlcCBvZiB0aGUgZGVzdGluYXRpb24oaW50ZXJwb2xhdGlvbikgYnVmZmVyLgotICogIFtpbl0gICAgaVdpZHRoICAgICAgV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqICBbaW5dICAgIGlIZWlnaHQgICAgIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jawotICogIFtpbl0gICAgZHggICAgICAgICAgICAgIEZyYWN0aW9uYWwgcGFydCBvZiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gMS80IHBpeGVsIHVuaXQgKDB+MykgCi0gKiAgW2luXSAgICBkeSAgICAgICAgICAgICAgRnJhY3Rpb25hbCBwYXJ0IG9mIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gMS80IHBpeGVsIHVuaXQgKDB+MykgCi0gKiAgW291dF0gICBwRHN0ICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCi0gKgotICovCi0KLSBPTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9MdW1hKAotICAgICBjb25zdCBPTVhfVTggICAgICpwU3JjLAotICAgICBPTVhfVTMyICAgIGlTcmNTdGVwLAotICAgICBPTVhfVTggICAgICpwRHN0LAotICAgICBPTVhfVTMyICAgIGlEc3RTdGVwLAotICAgICBPTVhfVTMyICAgIGlXaWR0aCwKLSAgICAgT01YX1UzMiAgICBpSGVpZ2h0LAotICAgICBPTVhfVTMyICAgIGR4LAotICAgICBPTVhfVTMyICAgIGR5Ci0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBvbXhWQ0gyNjRfRGVxdWFudFRyYW5zZm9ybUFDRnJvbVBhaXJfVThfUzE2X0MxX0RMeAotICoKLSAqIERlc2NyaXB0aW9uOgotICogUmVjb25zdHJ1Y3QgdGhlIDR4NCByZXNpZHVhbCBibG9jayBmcm9tIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyLAotICogcGVyZm9ybSBkZXF1YW50aXNhdGlvbiBhbmQgaW50ZWdlciBpbnZlcnNlIHRyYW5zZm9ybWF0aW9uIGZvciA0eDQgYmxvY2sgb2YKLSAqIHJlc2lkdWFscyBhbmQgdXBkYXRlIHRoZSBwYWlyIGJ1ZmZlciBwb2ludGVyIHRvIG5leHQgbm9uLWVtcHR5IGJsb2NrLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcHBTcmMJCURvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uCi0gKgkJCQkJCQlwYWlyIGJ1ZmZlciBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcKLSAqIFtpbl0JcERDCQkJUG9pbnRlciB0byB0aGUgREMgY29lZmZpY2llbnQgb2YgdGhpcyBibG9jaywgTlVMTAotICoJCQkJCQkJaWYgaXQgZG9lc24ndCBleGlzdAotICogW2luXQlRUAkJCVF1YW50aXphdGlvbiBwYXJhbWV0ZXIKLSAqIFtpbl0gQUMgICAgICAgICAgRmxhZyBpbmRpY2F0aW5nIGlmIGF0IGxlYXN0IG9uZSBub24temVybyBjb2VmZmljaWVudCBleGlzdHMKLSAqIFtvdXRdCXBEc3QJCXBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgNHg0IGJsb2NrIGRhdGEKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBvbXhFcnJvciByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtQUNGcm9tUGFpcl9VOF9TMTZfQzFfREx4KAotICAgICBPTVhfVTggKipwcFNyYywKLSAgICAgT01YX1MxNiAqcERzdCwKLSAgICAgT01YX0lOVCBRUCwKLSAgICAgT01YX1MxNiogcERDLAotICAgICBpbnQgQUMKLSk7Ci0KLSNlbmRpZiAgLypfYXJtVmlkZW9fSF8qLwotCi0vKkVuZCBvZiBGaWxlKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2FwaS9hcm1WQ0NPTU1fcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2FwaS9hcm1WQ0NPTU1fcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmMyYTNiLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9hcGkvYXJtVkNDT01NX3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBhcm1WQ0NPTU1fcy5oCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgMTIyOTAKLTsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotOy8vIEFSTSBvcHRpbWl6ZWQgT3Blbk1BWCBBQyBoZWFkZXIgZmlsZQotOy8vIAotOy8vIEZvcm11bGEgdXNlZDoKLTsvLyBNQUNSTyBmb3IgY2FsY3VsYXRpbmcgbWVkaWFuIGZvciB0aHJlZSB2YWx1ZXMuCi0KLQotCi0gICAgSUYgOkxOT1Q6OkRFRjpBUk1WQ0NPTU1fU19ICi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICBNX1ZBUklBTlRTICAgICAgQ29ydGV4QTgsIEFSTTExMzZKUwotICAgIAotICAgIElGIEFSTTExMzZKUyA6TE9SOiBDb3J0ZXhBOCAKLSAgICAgCi0gICAgIDsvLy8qCi0gICAgIDsvLyAqIE1hY3JvOiBNX01FRElBTjMKLSAgICAgOy8vICoKLSAgICAgOy8vICogRGVzY3JpcHRpb246IEZpbmRzIHRoZSBtZWRpYW4gb2YgdGhyZWUgbnVtYmVycwotICAgICA7Ly8gKiAKLSAgICAgOy8vICogUmVtYXJrczoKLSAgICAgOy8vICoKLSAgICAgOy8vICogUGFyYW1ldGVyczoKLSAgICAgOy8vICogW2luXSB4ICAgICBGaXJzdCBlbnRyeSBmb3IgdGhlIGxpc3Qgb2YgdGhyZWUgbnVtYmVycy4KLSAgICAgOy8vICogW2luXSB5ICAgICBTZWNvbmQgZW50cnkgZm9yIHRoZSBsaXN0IG9mIHRocmVlIG51bWJlcnMuCi0gICAgIDsvLyAqICAgICAgICAgICAgSW5wdXQgdmFsdWUgbWF5IGJlIGNvcnJ1cHRlZCBhdCB0aGUgZW5kIG9mCi0gICAgIDsvLyAqICAgICAgICAgICAgdGhlIGV4ZWN1dGlvbiBvZiB0aGlzIG1hY3JvLgotICAgICA7Ly8gKiBbaW5dIHogICAgIFRoaXJkIGVudHJ5IG9mIHRoZSBsaXN0IG9mIHRocmVlIG51bWJlcnMuCi0gICAgIDsvLyAqICAgICAgICAgICAgSW5wdXQgdmFsdWUgY29ycnVwdGVkIGF0IHRoZSBlbmQgb2YgdGhlIAotICAgICA7Ly8gKiAgICAgICAgICAgIGV4ZWN1dGlvbiBvZiB0aGlzIG1hY3JvLgotICAgICA7Ly8gKiBbaW5dIHQgICAgIFRlbXBvcmFyeSBzY3JhdGNoICByZWdpc3Rlci4KLSAgICAgOy8vICogW291dF16ICAgICBNZWRpYW4gb2YgdGhlIHRocmVlIG51bWJlcnMuICAgICAgIAotICAgICA7Ly8gKi8KLSAgICAgCi0gICAgIE1BQ1JPCi0KLSAgICAgTV9NRURJQU4zICR4LCAkeSwgJHosICR0IAotICAgICAKLSAgICAgU1VCUyAgJHQsICR5LCAkejsgLy8gaWYgKHkgPCB6KQotICAgICBBRERMVCAkeiwgJHosICR0OyAvLyAgc3dhcCB5IGFuZCB6Ci0gICAgIFNVQkxUICR5LCAkeSwgJHQ7Ci0KLSAgICAgOy8vIE5vdyB6JyA8PSB5Jywgc28gdGhlcmUgYXJlIHRocmVlIGNhc2VzIGZvciB0aGUKLSAgICAgOy8vIG1lZGlhbiB2YWx1ZSwgZGVwZW5kaW5nIG9uIHguCi0KLSAgICAgOy8vIDEpIHggPD0geicgICAgICA8PSB5JyAgICAgIDogbWVkaWFuIHZhbHVlIGlzIHonCi0gICAgIDsvLyAyKSAgICAgIHonIDw9IHggPD0geScgICAgICA6IG1lZGlhbiB2YWx1ZSBpcyB4Ci0gICAgIDsvLyAzKSAgICAgIHonICAgICAgPD0geScgPD0geCA6IG1lZGlhbiB2YWx1ZSBpcyB5JwotCi0gICAgIENNUCAgICR6LCAkeDsgICAgIC8vIGlmICggeCA+IG1pbih5LHopICkKLSAgICAgTU9WTFQgJHosICR4OyAgICAgLy8gYW5zID0geCAKLQotICAgICBDTVAgICAkeCwgJHk7ICAgICAvLyBpZiAoIHggPiBtYXgoeSx6KSApCi0gICAgIE1PVkdUICR6LCAkeTsgICAgIC8vIGFucyA9IG1heCh5LHopCi0gICAgIAotICAgICBNRU5ECi0gICAgRU5ESUYgICAgICAKLSAgICAKLSAgICAKLSAgICAgICAgCi0gICAgRU5ESUYgOy8vIEFSTUFDQ09NTV9TX0gKLQotIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2FwaS9vbXhWQy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2FwaS9vbXhWQy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjNjYzcyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9hcGkvb214VkMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQzODEgKzAsMCBAQAotLyoqCi0gKiBGaWxlOiBvbXhWQy5oCi0gKiBCcmllZjogT3Blbk1BWCBETCB2MS4wLjIgLSBWaWRlbyBDb2RpbmcgbGlicmFyeQotICoKLSAqIENvcHlyaWdodCCpIDIwMDUtMjAwOCBUaGUgS2hyb25vcyBHcm91cCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAotICoKLSAqIFRoZXNlIG1hdGVyaWFscyBhcmUgcHJvdGVjdGVkIGJ5IGNvcHlyaWdodCBsYXdzIGFuZCBjb250YWluIG1hdGVyaWFsIAotICogcHJvcHJpZXRhcnkgdG8gdGhlIEtocm9ub3MgR3JvdXAsIEluYy4gIFlvdSBtYXkgdXNlIHRoZXNlIG1hdGVyaWFscyAKLSAqIGZvciBpbXBsZW1lbnRpbmcgS2hyb25vcyBzcGVjaWZpY2F0aW9ucywgd2l0aG91dCBhbHRlcmluZyBvciByZW1vdmluZyAKLSAqIGFueSB0cmFkZW1hcmssIGNvcHlyaWdodCBvciBvdGhlciBub3RpY2UgZnJvbSB0aGUgc3BlY2lmaWNhdGlvbi4KLSAqIAotICogS2hyb25vcyBHcm91cCBtYWtlcyBubywgYW5kIGV4cHJlc3NseSBkaXNjbGFpbXMgYW55LCByZXByZXNlbnRhdGlvbnMgCi0gKiBvciB3YXJyYW50aWVzLCBleHByZXNzIG9yIGltcGxpZWQsIHJlZ2FyZGluZyB0aGVzZSBtYXRlcmlhbHMsIGluY2x1ZGluZywgCi0gKiB3aXRob3V0IGxpbWl0YXRpb24sIGFueSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IG9yIGZpdG5lc3MgCi0gKiBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2Ugb3Igbm9uLWluZnJpbmdlbWVudCBvZiBhbnkgaW50ZWxsZWN0dWFsIHByb3BlcnR5LiAKLSAqIEtocm9ub3MgR3JvdXAgbWFrZXMgbm8sIGFuZCBleHByZXNzbHkgZGlzY2xhaW1zIGFueSwgd2FycmFudGllcywgZXhwcmVzcyAKLSAqIG9yIGltcGxpZWQsIHJlZ2FyZGluZyB0aGUgY29ycmVjdG5lc3MsIGFjY3VyYWN5LCBjb21wbGV0ZW5lc3MsIHRpbWVsaW5lc3MsIAotICogYW5kIHJlbGlhYmlsaXR5IG9mIHRoZXNlIG1hdGVyaWFscy4gCi0gKgotICogVW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyB3aWxsIHRoZSBLaHJvbm9zIEdyb3VwLCBvciBhbnkgb2YgaXRzIFByb21vdGVycywgCi0gKiBDb250cmlidXRvcnMgb3IgTWVtYmVycyBvciB0aGVpciByZXNwZWN0aXZlIHBhcnRuZXJzLCBvZmZpY2VycywgZGlyZWN0b3JzLCAKLSAqIGVtcGxveWVlcywgYWdlbnRzIG9yIHJlcHJlc2VudGF0aXZlcyBiZSBsaWFibGUgZm9yIGFueSBkYW1hZ2VzLCB3aGV0aGVyIAotICogZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgZm9yIGxvc3QgcmV2ZW51ZXMsIAotICogbG9zdCBwcm9maXRzLCBvciBvdGhlcndpc2UsIGFyaXNpbmcgZnJvbSBvciBpbiBjb25uZWN0aW9uIHdpdGggdGhlc2UgCi0gKiBtYXRlcmlhbHMuCi0gKiAKLSAqIEtocm9ub3MgYW5kIE9wZW5NQVggYXJlIHRyYWRlbWFya3Mgb2YgdGhlIEtocm9ub3MgR3JvdXAgSW5jLiAKLSAqCi0gKi8KLQotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX09NWFZDX0hfCi0jZGVmaW5lIF9PTVhWQ19IXwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0KLS8qIDYuMS4xLjEgTW90aW9uIFZlY3RvcnMgICovCi0vKiBJbiBvbXhWQywgbW90aW9uIHZlY3RvcnMgYXJlIHJlcHJlc2VudGVkIGFzIGZvbGxvd3M6ICAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgT01YX1MxNiBkeDsKLSAgICBPTVhfUzE2IGR5OwotfSBPTVhWQ01vdGlvblZlY3RvcjsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQXZlcmFnZV84eCAgICg2LjEuMy4xLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGF2ZXJhZ2Ugb2YgdHdvIDh4NCwgOHg4LCBvciA4eDE2IGJsb2Nrcy4gIFRoZSAKLSAqIHJlc3VsdCBpcyByb3VuZGVkIGFjY29yZGluZyB0byAoYStiKzEpLzIuICBUaGUgYmxvY2sgYXZlcmFnZSBmdW5jdGlvbiBjYW4gCi0gKiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggaGFsZi1waXhlbCBpbnRlcnBvbGF0aW9uIHRvIG9idGFpbiBxdWFydGVyIAotICogcGl4ZWwgbW90aW9uIGVzdGltYXRlcywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0xMF0sIHN1YmNsYXVzZSA4LjQuMi4yLjEuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBQcmVkMCAgICAgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiAgIHBQcmVkMSAgICAgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiAgIGlQcmVkU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAotICogICBpUHJlZFN0ZXAxIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMSAKLSAqICAgaURzdFN0ZXAgICAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gCi0gKiAgIGlIZWlnaHQgICAgLSBIZWlnaHQgb2YgdGhlIGJsb2NrcyAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFByZWQgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuIDgtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCi0gKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwUHJlZDAsIHBQcmVkMSwgb3IgCi0gKiAgICAgICAgICAgICAgcERzdFByZWQuIAotICogICAgLSAgIHBEc3RQcmVkIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgICAtICAgaVByZWRTdGVwMCA8PSAwIG9yIGlQcmVkU3RlcDAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgICAtICAgaVByZWRTdGVwMSA8PSAwIG9yIGlQcmVkU3RlcDEgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgICAtICAgaURzdFN0ZXAgICA8PSAwIG9yIGlEc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICogICAgLSAgIGlIZWlnaHQgaXMgbm90IDQsIDgsIG9yIDE2LiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ0NPTU1fQXZlcmFnZV84eCAoCi0gICAgY29uc3QgT01YX1U4ICpwUHJlZDAsCi0gICAgY29uc3QgT01YX1U4ICpwUHJlZDEsCi0gICAgT01YX1UzMiBpUHJlZFN0ZXAwLAotICAgIE9NWF9VMzIgaVByZWRTdGVwMSwKLSAgICBPTVhfVTggKnBEc3RQcmVkLAotICAgIE9NWF9VMzIgaURzdFN0ZXAsCi0gICAgT01YX1UzMiBpSGVpZ2h0Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDQ09NTV9BdmVyYWdlXzE2eCAgICg2LjEuMy4xLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGF2ZXJhZ2Ugb2YgdHdvIDE2eDE2IG9yIDE2eDggYmxvY2tzLiAgVGhlIAotICogcmVzdWx0IGlzIHJvdW5kZWQgYWNjb3JkaW5nIHRvIChhK2IrMSkvMi4gIFRoZSBibG9jayBhdmVyYWdlIGZ1bmN0aW9uIGNhbiAKLSAqIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBoYWxmLXBpeGVsIGludGVycG9sYXRpb24gdG8gb2J0YWluIHF1YXJ0ZXIgCi0gKiBwaXhlbCBtb3Rpb24gZXN0aW1hdGVzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTEwXSwgc3ViY2xhdXNlIDguNC4yLjIuMS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFByZWQwIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAwIAotICogICBwUHJlZDEgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiAgIGlQcmVkU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAotICogICBpUHJlZFN0ZXAxIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMSAKLSAqICAgaURzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIgCi0gKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGJsb2NrcyAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFByZWQgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuIDE2LWJ5dGUgYWxpZ25lZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAotICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFByZWQwLCBwUHJlZDEsIG9yIAotICogICAgICAgICAgICAgIHBEc3RQcmVkLiAKLSAqICAgIC0gICBwRHN0UHJlZCBpcyBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICogICAgLSAgIGlQcmVkU3RlcDAgPD0gMCBvciBpUHJlZFN0ZXAwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgIC0gICBpUHJlZFN0ZXAxIDw9IDAgb3IgaVByZWRTdGVwMSBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgICAtICAgaURzdFN0ZXAgPD0gMCBvciBpRHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgICAtICAgaUhlaWdodCBpcyBub3QgOCBvciAxNi4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNDT01NX0F2ZXJhZ2VfMTZ4ICgKLSAgICBjb25zdCBPTVhfVTggKnBQcmVkMCwKLSAgICBjb25zdCBPTVhfVTggKnBQcmVkMSwKLSAgICBPTVhfVTMyIGlQcmVkU3RlcDAsCi0gICAgT01YX1UzMiBpUHJlZFN0ZXAxLAotICAgIE9NWF9VOCAqcERzdFByZWQsCi0gICAgT01YX1UzMiBpRHN0U3RlcCwKLSAgICBPTVhfVTMyIGlIZWlnaHQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0V4cGFuZEZyYW1lX0kgICAoNi4xLjMuMi4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBleHBhbmRzIGEgcmVjb25zdHJ1Y3RlZCBmcmFtZSBpbi1wbGFjZS4gIFRoZSB1bmV4cGFuZGVkIAotICogc291cmNlIGZyYW1lIHNob3VsZCBiZSBzdG9yZWQgaW4gYSBwbGFuZSBidWZmZXIgd2l0aCBzdWZmaWNpZW50IHNwYWNlIAotICogcHJlLWFsbG9jYXRlZCBmb3IgZWRnZSBleHBhbnNpb24sIGFuZCB0aGUgaW5wdXQgZnJhbWUgc2hvdWxkIGJlIGxvY2F0ZWQgaW4gCi0gKiB0aGUgcGxhbmUgYnVmZmVyIGNlbnRlci4gIFRoaXMgZnVuY3Rpb24gZXhlY3V0ZXMgdGhlIHBpeGVsIGV4cGFuc2lvbiBieSAKLSAqIHJlcGxpY2F0aW5nIHNvdXJjZSBmcmFtZSBlZGdlIHBpeGVsIGludGVuc2l0aWVzIGluIHRoZSBlbXB0eSBwaXhlbCAKLSAqIGxvY2F0aW9ucyAoZXhwYW5zaW9uIHJlZ2lvbikgYmV0d2VlbiB0aGUgc291cmNlIGZyYW1lIGVkZ2UgYW5kIHRoZSBwbGFuZSAKLSAqIGJ1ZmZlciBlZGdlLiAgVGhlIHdpZHRoL2hlaWdodCBvZiB0aGUgZXhwYW5zaW9uIHJlZ2lvbnMgb24gdGhlIAotICogaG9yaXpvbnRhbC92ZXJ0aWNhbCBlZGdlcyBpcyBjb250cm9sbGVkIGJ5IHRoZSBwYXJhbWV0ZXIgaUV4cGFuZFBlbHMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3RQbGFuZSAtIHBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgZnJhbWUgdG8gYmUgCi0gKiAgICAgICAgICAgIGV4cGFuZGVkOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgaUZyYW1lV2lkdGggLSBmcmFtZSB3aWR0aDsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBpRnJhbWVIZWlnaHQgLWZyYW1lIGhlaWdodDsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBpRXhwYW5kUGVscyAtIG51bWJlciBvZiBwaXhlbHMgdG8gYmUgZXhwYW5kZWQgaW4gdGhlIGhvcml6b250YWwgYW5kIAotICogICAgICAgICAgICB2ZXJ0aWNhbCBkaXJlY3Rpb25zOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIGlQbGFuZVN0ZXAgLSBkaXN0YW5jZSwgaW4gYnl0ZXMsIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGNvbnNlY3V0aXZlIGxpbmVzIAotICogICAgICAgICAgICBpbiB0aGUgcGxhbmUgYnVmZmVyOyBtdXN0IGJlIGxhcmdlciB0aGFuIG9yIGVxdWFsIHRvIAotICogICAgICAgICAgICAoaUZyYW1lV2lkdGggKyAyICogaUV4cGFuZFBlbHMpLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdFBsYW5lIC1Qb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGZyYW1lIChOT1QgdGhlIAotICogICAgICAgICAgICB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIHBsYW5lKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKLSAqICAgIC0gICAgcFNyY0RzdFBsYW5lIGlzIE5VTEwuIAotICogICAgLSAgICBwU3JjRHN0UGxhbmUgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgIC0gICAgb25lIG9mIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBpcyBlaXRoZXIgZXF1YWwgdG8gemVybyBvciBpcyBhIAotICogICAgICAgICAgICAgIG5vbi1tdWx0aXBsZSBvZiA4OiBpRnJhbWVIZWlnaHQsIGlGcmFtZVdpZHRoLCBpUGxhbmVTdGVwLCBvciAKLSAqICAgICAgICAgICAgICBpRXhwYW5kUGVscy4gCi0gKiAgICAtICAgIGlQbGFuZVN0ZXAgPCAoaUZyYW1lV2lkdGggKyAyICogaUV4cGFuZFBlbHMpLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSSAoCi0gICAgT01YX1U4ICpwU3JjRHN0UGxhbmUsCi0gICAgT01YX1UzMiBpRnJhbWVXaWR0aCwKLSAgICBPTVhfVTMyIGlGcmFtZUhlaWdodCwKLSAgICBPTVhfVTMyIGlFeHBhbmRQZWxzLAotICAgIE9NWF9VMzIgaVBsYW5lU3RlcAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQ29weTh4OCAgICg2LjEuMy4zLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb3BpZXMgdGhlIHJlZmVyZW5jZSA4eDggYmxvY2sgdG8gdGhlIGN1cnJlbnQgYmxvY2suIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sgaW4gdGhlIHNvdXJjZSBmcmFtZTsgbXVzdCBiZSAKLSAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICBzdGVwIC0gZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnRzIG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZSByZWZlcmVuY2UgCi0gKiAgICAgICAgICAgIGZyYW1lLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDggYW5kIG11c3QgYmUgbGFyZ2VyIHRoYW4gCi0gKiAgICAgICAgICAgIG9yIGVxdWFsIHRvIDguIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCi0gKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwRHN0IAotICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIAotICogICAgICAgICAgICAgIGJvdW5kYXJ5OiBwU3JjLCBwRHN0IAotICogICAgLSAgICBzdGVwIDw4IG9yIHN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNDT01NX0NvcHk4eDggKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKLSAgICBPTVhfVTggKnBEc3QsCi0gICAgT01YX0lOVCBzdGVwCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDQ09NTV9Db3B5MTZ4MTYgICAoNi4xLjMuMy4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29waWVzIHRoZSByZWZlcmVuY2UgMTZ4MTYgbWFjcm9ibG9jayB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIG1hY3JvYmxvY2sgaW4gdGhlIHNvdXJjZSBmcmFtZTsgbXVzdCBiZSAKLSAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICogICBzdGVwIC0gZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnRzIG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZSByZWZlcmVuY2UgCi0gKiAgICAgICAgICAgIGZyYW1lLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2IGFuZCBtdXN0IGJlIGxhcmdlciAKLSAqICAgICAgICAgICAgdGhhbiBvciBlcXVhbCB0byAxNi4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBtYWNyb2Jsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSAKLSAqICAgICAgICAgICAgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAotICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcERzdCAKLSAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKLSAqICAgICAgICAgICAgICBib3VuZGFyeTogcFNyYywgcERzdCAKLSAqICAgIC0gICAgc3RlcCA8MTYgb3Igc3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNDT01NX0NvcHkxNngxNiAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjLAotICAgIE9NWF9VOCAqcERzdCwKLSAgICBPTVhfSU5UIHN0ZXAKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9ja19TQUQgICAoNi4xLjQuMS4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29tcHV0ZXMgdGV4dHVyZSBlcnJvciBvZiB0aGUgYmxvY2s7IGFsc28gcmV0dXJucyBTQUQuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBzb3VyY2UgcGxhbmU7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqICAgc3JjU3RlcCAtIHN0ZXAgb2YgdGhlIHNvdXJjZSBwbGFuZSAKLSAqICAgcFNyY1JlZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBidWZmZXIsIGFuIDh4OCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIAotICogICAgICAgICAgICBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLCBhbiA4eDggYmxvY2s7IG11c3QgYmUgYWxpZ25lZCAKLSAqICAgICAgICAgICAgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gdGhlIFN1bSBvZiBBYnNvbHV0ZSBEaWZmZXJlbmNlcyAoU0FEKSB2YWx1ZSAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cyAKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBTcmNSZWYsIHBEc3QgYW5kIHBEc3RTQUQuIAotICogICAgLSAgICBwU3JjIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIFNyY1N0ZXAgPD0gMCBvciBzcmNTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICogICAgLSAgICBwU3JjUmVmIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIHBEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrX1NBRCAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjLAotICAgIE9NWF9JTlQgc3JjU3RlcCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYsCi0gICAgT01YX1MxNiAqcERzdCwKLSAgICBPTVhfSU5UICpwRHN0U0FECi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2sgICAoNi4xLjQuMS4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29tcHV0ZXMgdGhlIHRleHR1cmUgZXJyb3Igb2YgdGhlIGJsb2NrLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgc291cmNlIHBsYW5lLiBUaGlzIHNob3VsZCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICogICBzcmNTdGVwIC0gc3RlcCBvZiB0aGUgc291cmNlIHBsYW5lIAotICogICBwU3JjUmVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJ1ZmZlciwgYW4gOHg4IGJsb2NrLiBUaGlzIHNob3VsZCBiZSAKLSAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLCBhbiA4eDggYmxvY2suIFRoaXMgc2hvdWxkIGJlIAotICogICAgICAgICAgICBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6Ci0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwU3JjLCBwU3JjUmVmLCBwRHN0LiAKLSAqICAgIC0gICAgcFNyYyBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBTcmNTdGVwIDw9IDAgb3Igc3JjU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgIC0gICAgcFNyY1JlZiBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBwRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmMsCi0gICAgT01YX0lOVCBzcmNTdGVwLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZiwKLSAgICBPTVhfUzE2ICpwRHN0Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDQ09NTV9MaW1pdE1WVG9SZWN0ICAgKDYuMS40LjEuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIExpbWl0cyB0aGUgbW90aW9uIHZlY3RvciBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgYmxvY2svbWFjcm9ibG9jayB0byAKLSAqIHByZXZlbnQgdGhlIG1vdGlvbiBjb21wZW5zYXRlZCBibG9jay9tYWNyb2Jsb2NrIGZyb20gbW92aW5nIG91dHNpZGUgYSAKLSAqIGJvdW5kaW5nIHJlY3RhbmdsZSBhcyBzaG93biBpbiBGaWd1cmUgNi0xLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjTVYgLSBwb2ludGVyIHRvIHRoZSBtb3Rpb24gdmVjdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBibG9jayAKLSAqICAgICAgICAgICAgb3IgbWFjcm9ibG9jayAKLSAqICAgcFJlY3RWT1BSZWYgLSBwb2ludGVyIHRvIHRoZSBib3VuZGluZyByZWN0YW5nbGUgCi0gKiAgIFhjb29yZCwgWWNvb3JkICAtIGNvb3JkaW5hdGVzIG9mIHRoZSBjdXJyZW50IGJsb2NrIG9yIG1hY3JvYmxvY2sgCi0gKiAgIHNpemUgLSBzaXplIG9mIHRoZSBjdXJyZW50IGJsb2NrIG9yIG1hY3JvYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gOCBvciAKLSAqICAgICAgICAgICAgMTYuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0TVYgLSBwb2ludGVyIHRvIHRoZSBsaW1pdGVkIG1vdGlvbiB2ZWN0b3IgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb3IgbW9yZSBvZiB0aGUgCi0gKiAgICAgICAgICAgICAgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwU3JjTVYsIHBEc3RNViwgb3IgcFJlY3RWT1BSZWYuIAotICogICAgLSAgICBzaXplIGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgOCBvciAxNi4gCi0gKiAgICAtICAgIHRoZSB3aWR0aCBvciBoZWlnaHQgb2YgdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSBpcyBsZXNzIHRoYW4gCi0gKiAgICAgICAgIHR3aWNlIHRoZSBibG9jayBzaXplLgotICovCi1PTVhSZXN1bHQgb214VkNDT01NX0xpbWl0TVZUb1JlY3QgKAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjTVYsCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgKnBEc3RNViwKLSAgICBjb25zdCBPTVhSZWN0ICpwUmVjdFZPUFJlZiwKLSAgICBPTVhfSU5UIFhjb29yZCwKLSAgICBPTVhfSU5UIFljb29yZCwKLSAgICBPTVhfSU5UIHNpemUKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNDT01NX1NBRF8xNnggICAoNi4xLjQuMS40KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgZm9yIDE2eDE2IGFuZCAxNng4IGJsb2Nrcy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY09yZyAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIAotICogICAgICAgICAgICAgYm91bmRhcnkuIAotICogICBpU3RlcE9yZyAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlciAKLSAqICAgcFNyY1JlZiAgLSBQb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sgCi0gKiAgIGlTdGVwUmVmIC0gU3RlcCBvZiB0aGUgcmVmZXJlbmNlIGJsb2NrIGJ1ZmZlciAKLSAqICAgaUhlaWdodCAgLSBIZWlnaHQgb2YgdGhlIGJsb2NrIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0U0FEIC0gUG9pbnRlciBvZiByZXN1bHQgU0FEIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9yIG1vcmUgb2YgdGhlIAotICogICAgICAgICAgICAgIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcFNyY09yZywgcERzdFNBRCwgb3IgcFNyY1JlZiAKLSAqICAgIC0gICAgcFNyY09yZyBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgaVN0ZXBPcmcgIDw9IDAgb3IgaVN0ZXBPcmcgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYgCi0gKiAgICAtICAgIGlTdGVwUmVmIDw9IDAgb3IgaVN0ZXBSZWYgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYgCi0gKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IDggb3IgMTYgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNDT01NX1NBRF8xNnggKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY09yZywKLSAgICBPTVhfVTMyIGlTdGVwT3JnLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZiwKLSAgICBPTVhfVTMyIGlTdGVwUmVmLAotICAgIE9NWF9TMzIgKnBEc3RTQUQsCi0gICAgT01YX1UzMiBpSGVpZ2h0Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDQ09NTV9TQURfOHggICAoNi4xLjQuMS41KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgZm9yIDh4MTYsIDh4OCwgOHg0IGJsb2Nrcy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY09yZyAgLSBQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgOC1ieXRlIAotICogICAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqICAgaVN0ZXBPcmcgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXIgCi0gKiAgIHBTcmNSZWYgIC0gUG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrIAotICogICBpU3RlcFJlZiAtIFN0ZXAgb2YgdGhlIHJlZmVyZW5jZSBibG9jayBidWZmZXIgCi0gKiAgIGlIZWlnaHQgIC0gSGVpZ2h0IG9mIHRoZSBibG9jayAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFNBRCAtUG9pbnRlciBvZiByZXN1bHQgU0FEIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9yIG1vcmUgb2YgdGhlIAotICogICAgICAgICAgICAgIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcFNyY09yZywgcERzdFNBRCwgb3IgcFNyY1JlZiAKLSAqICAgIC0gICAgcFNyY09yZyBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBpU3RlcE9yZyAgPD0gMCBvciBpU3RlcE9yZyBpcyBub3QgYSBtdWx0aXBsZSBvZiA4IAotICogICAgLSAgICBpU3RlcFJlZiA8PSAwIG9yIGlTdGVwUmVmIGlzIG5vdCBhIG11bHRpcGxlIG9mIDggCi0gKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IDQsIDggb3IgMTYgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNDT01NX1NBRF84eCAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjT3JnLAotICAgIE9NWF9VMzIgaVN0ZXBPcmcsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAotICAgIE9NWF9VMzIgaVN0ZXBSZWYsCi0gICAgT01YX1MzMipwRHN0U0FELAotICAgIE9NWF9VMzIgaUhlaWdodAotKTsKLQotCi0KLS8qIDYuMi4xLjEgRGlyZWN0aW9uICAqLwotLyogVGhlIGRpcmVjdGlvbiBlbnVtZXJhdG9yIGlzIHVzZWQgd2l0aCBmdW5jdGlvbnMgdGhhdCBwZXJmb3JtIEFDL0RDIHByZWRpY3Rpb24gYW5kIHppZy16YWcgc2Nhbi4gICovCi0KLWVudW0gewotICAgIE9NWF9WQ19OT05FICAgICAgID0gMCwKLSAgICBPTVhfVkNfSE9SSVpPTlRBTCA9IDEsCi0gICAgT01YX1ZDX1ZFUlRJQ0FMICAgPSAyIAotfTsKLQotCi0KLS8qIDYuMi4xLjIgQmlsaW5lYXIgSW50ZXJwb2xhdGlvbiAgKi8KLS8qIFRoZSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIGVudW1lcmF0b3IgaXMgdXNlZCB3aXRoIG1vdGlvbiBlc3RpbWF0aW9uLCBtb3Rpb24gY29tcGVuc2F0aW9uLCBhbmQgcmVjb25zdHJ1Y3Rpb24gZnVuY3Rpb25zLiAgKi8KLQotZW51bSB7Ci0gICAgT01YX1ZDX0lOVEVHRVJfUElYRUwgPSAwLCAvKiBjYXNlIGEgKi8KLSAgICBPTVhfVkNfSEFMRl9QSVhFTF9YICA9IDEsIC8qIGNhc2UgYiAqLwotICAgIE9NWF9WQ19IQUxGX1BJWEVMX1kgID0gMiwgLyogY2FzZSBjICovCi0gICAgT01YX1ZDX0hBTEZfUElYRUxfWFkgPSAzICAvKiBjYXNlIGQgKi8gCi19OwotCi0KLQotLyogNi4yLjEuMyBOZWlnaGJvcmluZyBNYWNyb2Jsb2NrIEF2YWlsYWJpbGl0eSAgKi8KLS8qIE5laWdoYm9yaW5nIG1hY3JvYmxvY2sgYXZhaWxhYmlsaXR5IGlzIGluZGljYXRlZCB1c2luZyB0aGUgZm9sbG93aW5nIGZsYWdzOiAgICovCi0KLWVudW0gewotICAgIE9NWF9WQ19VUFBFUiA9IDEsICAgICAgICAvKiogYWJvdmUgbWFjcm9ibG9jayBpcyBhdmFpbGFibGUgKi8KLSAgICBPTVhfVkNfTEVGVCA9IDIsICAgICAgICAgLyoqIGxlZnQgbWFjcm9ibG9jayBpcyBhdmFpbGFibGUgKi8KLSAgICBPTVhfVkNfQ0VOVEVSID0gNCwKLSAgICBPTVhfVkNfUklHSFQgPSA4LAotICAgIE9NWF9WQ19MT1dFUiA9IDE2LAotICAgIE9NWF9WQ19VUFBFUl9MRUZUID0gMzIsICAvKiogYWJvdmUtbGVmdCBtYWNyb2Jsb2NrIGlzIGF2YWlsYWJsZSAqLwotICAgIE9NWF9WQ19VUFBFUl9SSUdIVCA9IDY0LCAvKiogYWJvdmUtcmlnaHQgbWFjcm9ibG9jayBpcyBhdmFpbGFibGUgKi8KLSAgICBPTVhfVkNfTE9XRVJfTEVGVCA9IDEyOCwKLSAgICBPTVhfVkNfTE9XRVJfUklHSFQgPSAyNTYgCi19OwotCi0KLQotLyogNi4yLjEuNCBWaWRlbyBDb21wb25lbnRzICAqLwotLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIHZpZGVvIGNvbXBvbmVudHMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgICBPTVhfVkNfTFVNSU5BTkNFLCAgICAvKiogTHVtaW5hbmNlIGNvbXBvbmVudCAqLwotICAgIE9NWF9WQ19DSFJPTUlOQU5DRSAgIC8qKiBjaHJvbWluYW5jZSBjb21wb25lbnQgKi8gCi19IE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50OwotCi0KLQotLyogNi4yLjEuNSBNYWNyb2Jsb2NrVHlwZXMgICovCi0vKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgbWFjcm9ibG9jayB0eXBlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLwotCi10eXBlZGVmIGVudW0gewotICAgIE9NWF9WQ19JTlRFUiAgICAgPSAwLCAvKiogUCBwaWN0dXJlIG9yIFAtVk9QICovCi0gICAgT01YX1ZDX0lOVEVSX1EgICA9IDEsIC8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKi8KLSAgICBPTVhfVkNfSU5URVI0ViAgID0gMiwgLyoqIFAgcGljdHVyZSBvciBQLVZPUCAqLwotICAgIE9NWF9WQ19JTlRSQSAgICAgPSAzLCAvKiogSSBhbmQgUCBwaWN0dXJlLCBJLSBhbmQgUC1WT1AgKi8KLSAgICBPTVhfVkNfSU5UUkFfUSAgID0gNCwgLyoqIEkgYW5kIFAgcGljdHVyZSwgSS0gYW5kIFAtVk9QICovCi0gICAgT01YX1ZDX0lOVEVSNFZfUSA9IDUgIC8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKEguMjYzKSovCi19IE9NWFZDTTRQMk1hY3JvYmxvY2tUeXBlOwotCi0KLQotLyogNi4yLjEuNiBDb29yZGluYXRlcyAgKi8KLS8qIENvb3JkaW5hdGVzIGFyZSByZXByZXNlbnRlZCBhcyBmb2xsb3dzOiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE9NWF9JTlQgeDsKLSAgICBPTVhfSU5UIHk7Ci19IE9NWFZDTTRQMkNvb3JkaW5hdGU7Ci0KLQotCi0vKiA2LjIuMS43IE1vdGlvbiBFc3RpbWF0aW9uIEFsZ29yaXRobXMgICovCi0vKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgbW90aW9uIGVzdGltYXRpb24gc2VhcmNoIG1ldGhvZHMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgICBPTVhfVkNfTTRQMl9GQVNUX1NFQVJDSCA9IDAsICAvKiogRmFzdCBtb3Rpb24gc2VhcmNoICovCi0gICAgT01YX1ZDX000UDJfRlVMTF9TRUFSQ0ggPSAxICAgLyoqIEZ1bGwgbW90aW9uIHNlYXJjaCAqLyAKLX0gT01YVkNNNFAyTUVNb2RlOwotCi0KLQotLyogNi4yLjEuOCBNb3Rpb24gRXN0aW1hdGlvbiBQYXJhbWV0ZXJzICAqLwotLyogQSBkYXRhIHN0cnVjdHVyZSBjb250YWluaW5nIGNvbnRyb2wgcGFyYW1ldGVycyBmb3IgCi0gKiBtb3Rpb24gZXN0aW1hdGlvbiBmdW5jdGlvbnMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE9NWF9JTlQgc2VhcmNoRW5hYmxlOHg4OyAgICAgLyoqIGVuYWJsZXMgOHg4IHNlYXJjaCAqLwotICAgIE9NWF9JTlQgaGFsZlBlbFNlYXJjaEVuYWJsZTsgLyoqIGVuYWJsZXMgaGFsZi1wZWwgcmVzb2x1dGlvbiAqLwotICAgIE9NWF9JTlQgc2VhcmNoUmFuZ2U7ICAgICAgICAgLyoqIHNlYXJjaCByYW5nZSAqLwotICAgIE9NWF9JTlQgcm5kVmFsOyAgICAgICAgICAgICAgLyoqIHJvdW5kaW5nIGNvbnRyb2w7IDAtZGlzYWJsZWQsIDEtZW5hYmxlZCovCi19IE9NWFZDTTRQMk1FUGFyYW1zOwotCi0KLQotLyogNi4yLjEuOSBNYWNyb2Jsb2NrIEluZm9ybWF0aW9uICAgKi8KLS8qIEEgZGF0YSBzdHJ1Y3R1cmUgY29udGFpbmluZyBtYWNyb2Jsb2NrIHBhcmFtZXRlcnMgZm9yIAotICogbW90aW9uIGVzdGltYXRpb24gZnVuY3Rpb25zIGlzIGRlZmluZWQgYXMgZm9sbG93czogIAotICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBPTVhfUzMyIHNsaWNlSWQ7ICAgICAgICAgICAgICAgICAvKiBzbGljZSBudW1iZXIgKi8KLSAgICBPTVhWQ000UDJNYWNyb2Jsb2NrVHlwZSBtYlR5cGU7ICAvKiBNQiB0eXBlOiBPTVhfVkNfSU5UUkEsIE9NWF9WQ19JTlRFUiwgb3IgT01YX1ZDX0lOVEVSNCAqLwotICAgIE9NWF9TMzIgcXA7ICAgICAgICAgICAgICAgICAgICAgIC8qIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIqLwotICAgIE9NWF9VMzIgY2JweTsgICAgICAgICAgICAgICAgICAgIC8qIENCUCBMdW1hICovCi0gICAgT01YX1UzMiBjYnBjOyAgICAgICAgICAgICAgICAgICAgLyogQ0JQIENocm9tYSAqLwotICAgIE9NWFZDTW90aW9uVmVjdG9yIHBNVjBbMl1bMl07ICAgIC8qIG1vdGlvbiB2ZWN0b3IsIHJlcHJlc2VudGVkIHVzaW5nIDEvMi1wZWwgdW5pdHMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBNVjBbYmxvY2t5XVtibG9ja3hdIChibG9ja3kgPSAwfjEsIGJsb2NreCA9MH4xKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBPTVhWQ01vdGlvblZlY3RvciBwTVZQcmVkWzJdWzJdOyAvKiBtb3Rpb24gdmVjdG9yIHByZWRpY3Rpb24sIHJlcHJlc2VudGVkIHVzaW5nIDEvMi1wZWwgdW5pdHMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBNVlByZWRbYmxvY2t5XVtibG9ja3hdIChibG9ja3kgPSAwfjEsIGJsb2NreCA9IDB+MSkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgT01YX1U4IHBQcmVkRGlyWzJdWzJdOyAgICAgICAgICAgLyogQUMgcHJlZGljdGlvbiBkaXJlY3Rpb246IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgT01YX1ZDX05PTkUsIE9NWF9WQ19WRVJUSUNBTCwgT01YX1ZDX0hPUklaT05UQUwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi19IE9NWFZDTTRQMk1CSW5mbywgKk9NWFZDTTRQMk1CSW5mb1B0cjsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRmluZE1WcHJlZCAgICg2LjIuMy4xLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQcmVkaWN0cyBhIG1vdGlvbiB2ZWN0b3IgZm9yIHRoZSBjdXJyZW50IGJsb2NrIHVzaW5nIHRoZSBwcm9jZWR1cmUgCi0gKiBzcGVjaWZpZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjUuICBUaGUgcmVzdWx0aW5nIHByZWRpY3RlZCBNViBpcyAKLSAqIHJldHVybmVkIGluIHBEc3RNVlByZWQuIElmIHRoZSBwYXJhbWV0ZXIgcERzdE1WUHJlZE1FIGlmIGlzIG5vdCBOVUxMIHRoZW4gCi0gKiB0aGUgc2V0IG9mIHRocmVlIE1WIGNhbmRpZGF0ZXMgdXNlZCBmb3IgcHJlZGljdGlvbiBpcyBhbHNvIHJldHVybmVkLCAKLSAqIG90aGVyd2lzZSBwRHN0TVZQcmVkTUVpcyBOVUxMIHVwb24gcmV0dXJuLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjTVZDdXJNQiAtIHBvaW50ZXIgdG8gdGhlIE1WIGJ1ZmZlciBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgWSAKLSAqICAgICAgICAgICAgbWFjcm9ibG9jazsgYSB2YWx1ZSBvZiBOVUxMIGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gCi0gKiAgIHBTcmNDYW5kTVYxIC0gcG9pbnRlciB0byB0aGUgTVYgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIDQgTVZzIGFzc29jaWF0ZWQgCi0gKiAgICAgICAgICAgIHdpdGggdGhlIE1CIGxvY2F0ZWQgdG8gdGhlIGxlZnQgb2YgdGhlIGN1cnJlbnQgTUI7IHNldCB0byBOVUxMIAotICogICAgICAgICAgICBpZiB0aGVyZSBpcyBubyBNQiB0byB0aGUgbGVmdC4gCi0gKiAgIHBTcmNDYW5kTVYyIC0gcG9pbnRlciB0byB0aGUgTVYgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIDQgTVZzIGFzc29jaWF0ZWQgCi0gKiAgICAgICAgICAgIHdpdGggdGhlIE1CIGxvY2F0ZWQgYWJvdmUgdGhlIGN1cnJlbnQgTUI7IHNldCB0byBOVUxMIGlmIHRoZXJlIAotICogICAgICAgICAgICBpcyBubyBNQiBsb2NhdGVkIGFib3ZlIHRoZSBjdXJyZW50IE1CLiAKLSAqICAgcFNyY0NhbmRNVjMgLSBwb2ludGVyIHRvIHRoZSBNViBidWZmZXIgY29udGFpbmluZyB0aGUgNCBNVnMgYXNzb2NpYXRlZCAKLSAqICAgICAgICAgICAgd2l0aCB0aGUgTUIgbG9jYXRlZCB0byB0aGUgcmlnaHQgYW5kIGFib3ZlIHRoZSBjdXJyZW50IE1COyBzZXQgCi0gKiAgICAgICAgICAgIHRvIE5VTEwgaWYgdGhlcmUgaXMgbm8gTUIgbG9jYXRlZCB0byB0aGUgYWJvdmUtcmlnaHQuIAotICogICBpQmxrIC0gdGhlIGluZGV4IG9mIGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCi0gKiAgIHBEc3RNVlByZWRNRSAtIE1WIGNhbmRpZGF0ZSByZXR1cm4gYnVmZmVyOyAgaWYgc2V0IHRvIE5VTEwgdGhlbiAKLSAqICAgICAgICAgICAgcHJlZGljdGlvbiBjYW5kaWRhdGUgTVZzIGFyZSBub3QgcmV0dXJuZWQgYW5kIHBEc3RNVlByZWRNRSB3aWxsIAotICogICAgICAgICAgICBiZSBOVUxMIHVwb24gZnVuY3Rpb24gcmV0dXJuOyBpZiBwRHN0TVZQcmVkTUUgaXMgbm9uLU5VTEwgdGhlbiBpdCAKLSAqICAgICAgICAgICAgbXVzdCBwb2ludCB0byBhIGJ1ZmZlciBjb250YWluaW5nIHN1ZmZpY2llbnQgc3BhY2UgZm9yIHRocmVlIAotICogICAgICAgICAgICByZXR1cm4gTVZzLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdE1WUHJlZCAtIHBvaW50ZXIgdG8gdGhlIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yIAotICogICBwRHN0TVZQcmVkTUUgLSBpZiBub24tTlVMTCB1cG9uIGlucHV0IHRoZW4gcERzdE1WUHJlZE1FICBwb2ludHMgdXBvbiAKLSAqICAgICAgICAgICAgcmV0dXJuIHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIHRocmVlIG1vdGlvbiB2ZWN0b3IgY2FuZGlkYXRlcyAKLSAqICAgICAgICAgICAgdXNlZCBmb3IgcHJlZGljdGlvbiBhcyBzcGVjaWZpZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgCi0gKiAgICAgICAgICAgIDcuNi41LCBvdGhlcndpc2UgaWYgTlVMTCB1cG9uIGlucHV0IHRoZW4gcERzdE1WUHJlZE1FIGlzIE5VTEwgCi0gKiAgICAgICAgICAgIHVwb24gb3V0cHV0LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCi0gKiAgICAtICAgIHRoZSBwb2ludGVyIHBEc3RNVlByZWQgaXMgTlVMTCAKLSAqICAgIC0gICAgdGhlIHBhcmFtZXRlciBpQmxrIGRvZXMgbm90IGZhbGwgaW50byB0aGUgcmFuZ2UgMCA8PSBpQmxrPD0zIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9GaW5kTVZwcmVkICgKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY01WQ3VyTUIsCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNDYW5kTVYxLAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjQ2FuZE1WMiwKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0NhbmRNVjMsCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgKnBEc3RNVlByZWQsCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgKnBEc3RNVlByZWRNRSwKLSAgICBPTVhfSU5UIGlCbGsKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0lEQ1Q4eDhibGsgICAoNi4yLjMuMi4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29tcHV0ZXMgYSAyRCBpbnZlcnNlIERDVCBmb3IgYSBzaW5nbGUgOHg4IGJsb2NrLCBhcyBkZWZpbmVkIGluIAotICogW0lTTzE0NDk2LTJdLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmVhcmx5IGFycmFuZ2VkIElEQ1QgaW5wdXQgYnVmZmVyOyAKLSAqICAgICAgICAgICAgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIEFjY29yZGluZyB0byAKLSAqICAgICAgICAgICAgW0lTTzE0NDk2LTJdLCB0aGUgaW5wdXQgY29lZmZpY2llbnQgdmFsdWVzIHNob3VsZCBsaWUgd2l0aGluIHRoZSAKLSAqICAgICAgICAgICAgcmFuZ2UgWy0yMDQ4LCAyMDQ3XS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZWFybHkgYXJyYW5nZWQgSURDVCBvdXRwdXQgYnVmZmVyOyAKLSAqICAgICAgICAgICAgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6Ci0gKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKLSAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9JRENUOHg4YmxrICgKLSAgICBjb25zdCBPTVhfUzE2ICpwU3JjLAotICAgIE9NWF9TMTYgKnBEc3QKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX01FR2V0QnVmU2l6ZSAgICg2LjIuNC4xLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb21wdXRlcyB0aGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3BlY2lmaWNhdGlvbiAKLSAqIHN0cnVjdHVyZSBmb3IgdGhlIGZvbGxvd2luZyBtb3Rpb24gZXN0aW1hdGlvbiBmdW5jdGlvbnM6IAotICogQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCwgQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2LCBhbmQgTW90aW9uRXN0aW1hdGlvbk1CLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBNRW1vZGUgLSBtb3Rpb24gZXN0aW1hdGlvbiBtb2RlOyBhdmFpbGFibGUgbW9kZXMgYXJlIGRlZmluZWQgYnkgdGhlIAotICogICAgICAgICAgICBlbnVtZXJhdGVkIHR5cGUgT01YVkNNNFAyTUVNb2RlIAotICogICBwTUVQYXJhbXMgLSBtb3Rpb24gZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU2l6ZSAtIHBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCBmb3IgdGhlIHNwZWNpZmljYXRpb24gCi0gKiAgICAgICAgICAgIHN0cnVjdHVyZSAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYW4gaW52YWxpZCB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciB0aGUgcGFyYW1ldGVyIE1FbW9kZSAKLSAqICAgIC0gICAgYSBuZWdhdGl2ZSBvciB6ZXJvIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSAKLSAqICAgICAgICAgcGFyYW1ldGVyIHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2UgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX01FR2V0QnVmU2l6ZSAoCi0gICAgT01YVkNNNFAyTUVNb2RlIE1FbW9kZSwKLSAgICBjb25zdCBPTVhWQ000UDJNRVBhcmFtcyAqcE1FUGFyYW1zLAotICAgIE9NWF9VMzIgKnBTaXplCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9NRUluaXQgICAoNi4yLjQuMS4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogSW5pdGlhbGl6ZXMgdGhlIHZlbmRvci1zcGVjaWZpYyBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSByZXF1aXJlZCBmb3IgdGhlIAotICogZm9sbG93aW5nIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9uczogIEJsb2NrTWF0Y2hfSW50ZWdlcl84eDgsIAotICogQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2LCBhbmQgTW90aW9uRXN0aW1hdGlvbk1CLiBNZW1vcnkgZm9yIHRoZSAKLSAqIHNwZWNpZmljYXRpb24gc3RydWN0dXJlICpwTUVTcGVjIG11c3QgYmUgYWxsb2NhdGVkIHByaW9yIHRvIGNhbGxpbmcgdGhlIAotICogZnVuY3Rpb24sIGFuZCBzaG91bGQgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIEZvbGxvd2luZyAKLSAqIGluaXRpYWxpemF0aW9uIGJ5IHRoaXMgZnVuY3Rpb24sIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3RydWN0dXJlICpwTUVTcGVjIAotICogc2hvdWxkIGNvbnRhaW4gYW4gaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgcmVwcmVzZW50YXRpb24gb2YgYWxsIG1vdGlvbiAKLSAqIGVzdGltYXRpb24gcGFyYW1ldGVycyByZWNlaXZlZCB2aWEgdGhlIHN0cnVjdHVyZSBwTUVQYXJhbXMsIGZvciBleGFtcGxlICAKLSAqIHJuZFZhbCwgc2VhcmNoUmFuZ2UsIGV0Yy4gIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZSAKLSAqIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIGNhbiBiZSBkZXRlcm1pbmVkIHVzaW5nIHRoZSBmdW5jdGlvbiAKLSAqIG9teFZDTTRQMl9NRUdldEJ1ZlNpemUuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIE1FbW9kZSAtIG1vdGlvbiBlc3RpbWF0aW9uIG1vZGU7IGF2YWlsYWJsZSBtb2RlcyBhcmUgZGVmaW5lZCBieSB0aGUgCi0gKiAgICAgICAgICAgIGVudW1lcmF0ZWQgdHlwZSBPTVhWQ000UDJNRU1vZGUgCi0gKiAgIHBNRVBhcmFtcyAtIG1vdGlvbiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgCi0gKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSB1bmluaXRpYWxpemVkIE1FIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgaW5pdGlhbGl6ZWQgTUUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGFuIGludmFsaWQgdmFsdWUgd2FzIHNwZWNpZmllZCBmb3IgdGhlIHBhcmFtZXRlciBNRW1vZGUgCi0gKiAgICAtICAgIGEgbmVnYXRpdmUgb3IgemVybyB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciB0aGUgCi0gKiAgICAgICAgIHBhcmFtZXRlciBwTUVQYXJhbXMtPnNlYXJjaFJhbmdlIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9NRUluaXQgKAotICAgIE9NWFZDTTRQMk1FTW9kZSBNRW1vZGUsCi0gICAgY29uc3QgT01YVkNNNFAyTUVQYXJhbXMqcE1FUGFyYW1zLAotICAgIHZvaWQgKnBNRVNwZWMKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiAgICg2LjIuNC4yLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBhIDE2eDE2IGJsb2NrIHNlYXJjaDsgZXN0aW1hdGVzIG1vdGlvbiB2ZWN0b3IgYW5kIGFzc29jaWF0ZWQgCi0gKiBtaW5pbXVtIFNBRC4gQm90aCB0aGUgaW5wdXQgYW5kIG91dHB1dCBtb3Rpb24gdmVjdG9ycyBhcmUgcmVwcmVzZW50ZWQgdXNpbmcgCi0gKiBoYWxmLXBpeGVsIHVuaXRzLCBhbmQgdGhlcmVmb3JlIGEgc2hpZnQgbGVmdCBvciByaWdodCBieSAxIGJpdCBtYXkgYmUgCi0gKiByZXF1aXJlZCwgcmVzcGVjdGl2ZWx5LCB0byBtYXRjaCB0aGUgaW5wdXQgb3Igb3V0cHV0IE1WcyB3aXRoIG90aGVyIAotICogZnVuY3Rpb25zIHRoYXQgZWl0aGVyIGdlbmVyYXRlIG91dHB1dCBNVnMgb3IgZXhwZWN0IGlucHV0IE1WcyByZXByZXNlbnRlZCAKLSAqIHVzaW5nIGludGVnZXIgcGl4ZWwgdW5pdHMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNSZWZCdWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgCi0gKiAgICAgICAgICAgIE1CIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gCi0gKiAgICAgICAgICAgIHRoZSBjdXJyZW50IHBsYW5lLiAKLSAqICAgcmVmV2lkdGggLSB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lIAotICogICBwUmVmUmVjdCAtIHBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlZmVyZW5jZSBwbGFuZSByZWN0YW5nbGU7IGNvb3JkaW5hdGVzIAotICogICAgICAgICAgICBhcmUgc3BlY2lmaWVkIHJlbGF0aXZlIHRvIHRoZSBpbWFnZSBvcmlnaW4uICBSZWN0YW5nbGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJpZXMgbWF5IGV4dGVuZCBiZXlvbmQgaW1hZ2UgYm91bmRhcmllcyBpZiB0aGUgaW1hZ2UgaGFzIAotICogICAgICAgICAgICBiZWVuIHBhZGRlZC4gIEZvciBleGFtcGxlLCBpZiBwYWRkaW5nIGV4dGVuZHMgNCBwaXhlbHMgYmV5b25kIAotICogICAgICAgICAgICBmcmFtZSBib3JkZXIsIHRoZW4gdGhlIHZhbHVlIGZvciB0aGUgbGVmdCBib3JkZXIgY291bGQgYmUgc2V0IHRvIAotICogICAgICAgICAgICAtNC4gCi0gKiAgIHBTcmNDdXJyQnVmIC0gcG9pbnRlciB0byB0aGUgY3VycmVudCBibG9jayBpbiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIAotICogICAgICAgICAgICBidWZmZXIgZXh0cmFjdGVkIGZyb20gdGhlIG9yaWdpbmFsIHBsYW5lIChsaW5lYXIgYXJyYXksIDI1NiAKLSAqICAgICAgICAgICAgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuICBUaGUgbnVtYmVyIG9mIAotICogICAgICAgICAgICBieXRlcyBiZXR3ZWVuIGxpbmVzIChzdGVwKSBpcyAxNi4gCi0gKiAgIHBDdXJyUG9pbnRQb3MgLSBwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lIAotICogICBwU3JjUHJlTVYgLSBwb2ludGVyIHRvIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yOyBOVUxMIGluZGljYXRlcyBubyAKLSAqICAgICAgICAgICAgcHJlZGljdGVkIE1WIAotICogICBwU3JjUHJlU0FEIC0gcG9pbnRlciB0byBTQUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmVkaWN0ZWQgTVYgKHJlZmVyZW5jZWQgCi0gKiAgICAgICAgICAgIGJ5IHBTcmNQcmVNVik7IG1heSBiZSBzZXQgdG8gTlVMTCBpZiB1bmF2YWlsYWJsZS4gCi0gKiAgIHBNRVNwZWMgLSB2ZW5kb3Itc3BlY2lmaWMgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmU7IAotICogICAgICAgICAgICBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgYW5kIHRoZW4gaW5pdGlhbGl6ZWQgdXNpbmcgCi0gKiAgICAgICAgICAgIG9teFZDTTRQMl9NRUluaXQgcHJpb3IgdG8gY2FsbGluZyB0aGUgYmxvY2sgbWF0Y2hpbmcgZnVuY3Rpb24uIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0TVYgLSBwb2ludGVyIHRvIGVzdGltYXRlZCBNViAKLSAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gbWluaW11bSBTQUQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjUmVmQnVmLCAKLSAqICAgICAgICAgICAgICBwUmVmUmVjdCwgcFNyY0N1cnJCdWZmLCBwQ3VyclBvaW50UG9zLCBwRHN0TVYsIHBEc3RTQUQgb3IgCi0gKiAgICAgICAgICAgICAgcE1FU3BlYywgb3IgCi0gKiAgICAtICAgIHBTcmNDdXJyQnVmIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAotICAgIE9NWF9JTlQgcmVmV2lkdGgsCi0gICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKLSAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yKnBTcmNQcmVNViwKLSAgICBjb25zdCBPTVhfSU5UICpwU3JjUHJlU0FELAotICAgIHZvaWQgKnBNRVNwZWMsCi0gICAgT01YVkNNb3Rpb25WZWN0b3IqcERzdE1WLAotICAgIE9NWF9JTlQgKnBEc3RTQUQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl84eDggICAoNi4yLjQuMi4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgYW4gOHg4IGJsb2NrIHNlYXJjaDsgZXN0aW1hdGVzIG1vdGlvbiB2ZWN0b3IgYW5kIGFzc29jaWF0ZWQgCi0gKiBtaW5pbXVtIFNBRC4gIEJvdGggdGhlIGlucHV0IGFuZCBvdXRwdXQgbW90aW9uIHZlY3RvcnMgYXJlIHJlcHJlc2VudGVkIAotICogdXNpbmcgaGFsZi1waXhlbCB1bml0cywgYW5kIHRoZXJlZm9yZSBhIHNoaWZ0IGxlZnQgb3IgcmlnaHQgYnkgMSBiaXQgbWF5IGJlIAotICogcmVxdWlyZWQsIHJlc3BlY3RpdmVseSwgdG8gbWF0Y2ggdGhlIGlucHV0IG9yIG91dHB1dCBNVnMgd2l0aCBvdGhlciAKLSAqIGZ1bmN0aW9ucyB0aGF0IGVpdGhlciBnZW5lcmF0ZSBvdXRwdXQgTVZzIG9yIGV4cGVjdCBpbnB1dCBNVnMgcmVwcmVzZW50ZWQgCi0gKiB1c2luZyBpbnRlZ2VyIHBpeGVsIHVuaXRzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjUmVmQnVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIAotICogICAgICAgICAgICBibG9jayB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCA4eDggYmxvY2sgCi0gKiAgICAgICAgICAgIGluIHRoZSBjdXJyZW50IHBsYW5lLiAKLSAqICAgcmVmV2lkdGggLSB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lIAotICogICBwUmVmUmVjdCAtIHBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlZmVyZW5jZSBwbGFuZSByZWN0YW5nbGU7IGNvb3JkaW5hdGVzIAotICogICAgICAgICAgICBhcmUgc3BlY2lmaWVkIHJlbGF0aXZlIHRvIHRoZSBpbWFnZSBvcmlnaW4uICBSZWN0YW5nbGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJpZXMgbWF5IGV4dGVuZCBiZXlvbmQgaW1hZ2UgYm91bmRhcmllcyBpZiB0aGUgaW1hZ2UgaGFzIAotICogICAgICAgICAgICBiZWVuIHBhZGRlZC4gCi0gKiAgIHBTcmNDdXJyQnVmIC0gcG9pbnRlciB0byB0aGUgY3VycmVudCBibG9jayBpbiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIAotICogICAgICAgICAgICBidWZmZXIgZXh0cmFjdGVkIGZyb20gdGhlIG9yaWdpbmFsIHBsYW5lIChsaW5lYXIgYXJyYXksIDEyOCAKLSAqICAgICAgICAgICAgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuICBUaGUgbnVtYmVyIG9mIAotICogICAgICAgICAgICBieXRlcyBiZXR3ZWVuIGxpbmVzIChzdGVwKSBpcyAxNiBieXRlcy4gCi0gKiAgIHBDdXJyUG9pbnRQb3MgLSBwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZSAKLSAqICAgcFNyY1ByZU1WIC0gcG9pbnRlciB0byBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvcjsgTlVMTCBpbmRpY2F0ZXMgbm8gCi0gKiAgICAgICAgICAgIHByZWRpY3RlZCBNViAKLSAqICAgcFNyY1ByZVNBRCAtIHBvaW50ZXIgdG8gU0FEIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJlZGljdGVkIE1WIChyZWZlcmVuY2VkIAotICogICAgICAgICAgICBieSBwU3JjUHJlTVYpOyBtYXkgYmUgc2V0IHRvIE5VTEwgaWYgdW5hdmFpbGFibGUuIAotICogICBwTUVTcGVjIC0gdmVuZG9yLXNwZWNpZmljIG1vdGlvbiBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gc3RydWN0dXJlOyAKLSAqICAgICAgICAgICAgbXVzdCBoYXZlIGJlZW4gYWxsb2NhdGVkIGFuZCB0aGVuIGluaXRpYWxpemVkIHVzaW5nIAotICogICAgICAgICAgICBvbXhWQ000UDJfTUVJbml0IHByaW9yIHRvIGNhbGxpbmcgdGhlIGJsb2NrIG1hdGNoaW5nIGZ1bmN0aW9uLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdE1WIC0gcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYgCi0gKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIG1pbmltdW0gU0FEIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY1JlZkJ1ZiwgCi0gKiAgICAgICAgICAgICAgcFJlZlJlY3QsIHBTcmNDdXJyQnVmZiwgcEN1cnJQb2ludFBvcywgcERzdE1WLCBwRHN0U0FEIG9yIAotICogICAgICAgICAgICAgIHBNRVNwZWMsIG9yIAotICogICAgLSAgICBwU3JjQ3VyckJ1ZiBpcyBub3QgOC1ieXRlIGFsaWduZWQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl84eDggKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKLSAgICBPTVhfSU5UIHJlZldpZHRoLAotICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCi0gICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY1ByZU1WLAotICAgIGNvbnN0IE9NWF9JTlQgKnBTcmNQcmVTQUQsCi0gICAgdm9pZCAqcE1FU3BlYywKLSAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WLAotICAgIE9NWF9JTlQgKnBEc3RTQUQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl8xNngxNiAgICg2LjIuNC4yLjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBhIDE2eDE2IGJsb2NrIG1hdGNoIHdpdGggaGFsZi1waXhlbCByZXNvbHV0aW9uLiAgUmV0dXJucyB0aGUgCi0gKiBlc3RpbWF0ZWQgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCBtaW5pbXVtIFNBRC4gIFRoaXMgZnVuY3Rpb24gCi0gKiBlc3RpbWF0ZXMgdGhlIGhhbGYtcGl4ZWwgbW90aW9uIHZlY3RvciBieSBpbnRlcnBvbGF0aW5nIHRoZSBpbnRlZ2VyIAotICogcmVzb2x1dGlvbiBtb3Rpb24gdmVjdG9yIHJlZmVyZW5jZWQgYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0TVYsIGkuZS4sIAotICogdGhlIGluaXRpYWwgaW50ZWdlciBNViBpcyBnZW5lcmF0ZWQgZXh0ZXJuYWxseS4gIFRoZSBpbnB1dCBwYXJhbWV0ZXJzIAotICogcFNyY1JlZkJ1ZiBhbmQgcFNlYXJjaFBvaW50UmVmUG9zIHNob3VsZCBiZSBzaGlmdGVkIGJ5IHRoZSB3aW5uaW5nIE1WIG9mIAotICogMTZ4MTYgaW50ZWdlciBzZWFyY2ggcHJpb3IgdG8gY2FsbGluZyBCbG9ja01hdGNoX0hhbGZfMTZ4MTYuIFRoZSBmdW5jdGlvbiAKLSAqIEJsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiBtYXkgYmUgdXNlZCBmb3IgaW50ZWdlciBtb3Rpb24gZXN0aW1hdGlvbi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY1JlZkJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSAKLSAqICAgICAgICAgICAgbWFjcm9ibG9jayB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCAKLSAqICAgICAgICAgICAgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZS4gCi0gKiAgIHJlZldpZHRoIC0gd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZSAKLSAqICAgcFJlZlJlY3QgLSByZWZlcmVuY2UgcGxhbmUgdmFsaWQgcmVnaW9uIHJlY3RhbmdsZSAKLSAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCi0gKiAgICAgICAgICAgIGJ1ZmZlciBleHRyYWN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgMjU2IAotICogICAgICAgICAgICBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIFRoZSBudW1iZXIgb2YgCi0gKiAgICAgICAgICAgIGJ5dGVzIGJldHdlZW4gbGluZXMgKHN0ZXApIGlzIDE2LiAKLSAqICAgcFNlYXJjaFBvaW50UmVmUG9zIC0gcG9zaXRpb24gb2YgdGhlIHN0YXJ0aW5nIHBvaW50IGZvciBoYWxmIHBpeGVsIAotICogICAgICAgICAgICBzZWFyY2ggKHNwZWNpZmllZCBpbiB0ZXJtcyBvZiBpbnRlZ2VyIHBpeGVsIHVuaXRzKSBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJlZmVyZW5jZSBwbGFuZSwgaS5lLiwgdGhlIHJlZmVyZW5jZSBwb3NpdGlvbiBwb2ludGVkIHRvIGJ5IHRoZSAKLSAqICAgICAgICAgICAgcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3IuIAotICogICBybmRWYWwgLSByb3VuZGluZyBjb250cm9sIHBhcmFtZXRlcjogMCAtIGRpc2FibGVkOyAxIC0gZW5hYmxlZC4gCi0gKiAgIHBTcmNEc3RNViAtIHBvaW50ZXIgdG8gdGhlIGluaXRpYWwgTVYgZXN0aW1hdGU7IHR5cGljYWxseSBnZW5lcmF0ZWQgCi0gKiAgICAgICAgICAgIGR1cmluZyBhIHByaW9yIDE2WDE2IGludGVnZXIgc2VhcmNoOyBzcGVjaWZpZWQgaW4gdGVybXMgb2YgCi0gKiAgICAgICAgICAgIGhhbGYtcGl4ZWwgdW5pdHMuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0TVYgLSBwb2ludGVyIHRvIGVzdGltYXRlZCBNViAKLSAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gbWluaW11bSBTQUQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjUmVmQnVmLCAKLSAqICAgICAgICAgcFJlZlJlY3QsIHBTcmNDdXJyQnVmZiwgcFNlYXJjaFBvaW50UmVmUG9zLCBwU3JjRHN0TVYuCi0gKiAgICAtICAgIHBTcmNDdXJyQnVmIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQsIG9yIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfMTZ4MTYgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKLSAgICBPTVhfSU5UIHJlZldpZHRoLAotICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCi0gICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcFNlYXJjaFBvaW50UmVmUG9zLAotICAgIE9NWF9JTlQgcm5kVmFsLAotICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjRHN0TVYsCi0gICAgT01YX0lOVCAqcERzdFNBRAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OCAgICg2LjIuNC4yLjQpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBhbiA4eDggYmxvY2sgbWF0Y2ggd2l0aCBoYWxmLXBpeGVsIHJlc29sdXRpb24uIFJldHVybnMgdGhlIAotICogZXN0aW1hdGVkIG1vdGlvbiB2ZWN0b3IgYW5kIGFzc29jaWF0ZWQgbWluaW11bSBTQUQuICBUaGlzIGZ1bmN0aW9uIAotICogZXN0aW1hdGVzIHRoZSBoYWxmLXBpeGVsIG1vdGlvbiB2ZWN0b3IgYnkgaW50ZXJwb2xhdGluZyB0aGUgaW50ZWdlciAKLSAqIHJlc29sdXRpb24gbW90aW9uIHZlY3RvciByZWZlcmVuY2VkIGJ5IHRoZSBpbnB1dCBwYXJhbWV0ZXIgcFNyY0RzdE1WLCBpLmUuLCAKLSAqIHRoZSBpbml0aWFsIGludGVnZXIgTVYgaXMgZ2VuZXJhdGVkIGV4dGVybmFsbHkuICBUaGUgaW5wdXQgcGFyYW1ldGVycyAKLSAqIHBTcmNSZWZCdWYgYW5kIHBTZWFyY2hQb2ludFJlZlBvcyBzaG91bGQgYmUgc2hpZnRlZCBieSB0aGUgd2lubmluZyBNViBvZiAKLSAqIDh4OCBpbnRlZ2VyIHNlYXJjaCBwcmlvciB0byBjYWxsaW5nIEJsb2NrTWF0Y2hfSGFsZl84eDguIFRoZSBmdW5jdGlvbiAKLSAqIEJsb2NrTWF0Y2hfSW50ZWdlcl84eDggbWF5IGJlIHVzZWQgZm9yIGludGVnZXIgbW90aW9uIGVzdGltYXRpb24uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNSZWZCdWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgCi0gKiAgICAgICAgICAgIGJsb2NrIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IDh4OCBibG9jayAKLSAqICAgICAgICAgICAgaW4gdGhlIGN1cnJlbnQgcGxhbmUuIAotICogICByZWZXaWR0aCAtIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUgCi0gKiAgIHBSZWZSZWN0IC0gcmVmZXJlbmNlIHBsYW5lIHZhbGlkIHJlZ2lvbiByZWN0YW5nbGUgCi0gKiAgIHBTcmNDdXJyQnVmIC0gcG9pbnRlciB0byB0aGUgY3VycmVudCBibG9jayBpbiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIAotICogICAgICAgICAgICBidWZmZXIgZXh0cmFjdGVkIGZyb20gdGhlIG9yaWdpbmFsIHBsYW5lIChsaW5lYXIgYXJyYXksIDEyOCAKLSAqICAgICAgICAgICAgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDgtYnl0ZSBib3VuZGFyeS4gIFRoZSBudW1iZXIgb2YgCi0gKiAgICAgICAgICAgIGJ5dGVzIGJldHdlZW4gbGluZXMgKHN0ZXApIGlzIDE2LiAKLSAqICAgcFNlYXJjaFBvaW50UmVmUG9zIC0gcG9zaXRpb24gb2YgdGhlIHN0YXJ0aW5nIHBvaW50IGZvciBoYWxmIHBpeGVsIAotICogICAgICAgICAgICBzZWFyY2ggKHNwZWNpZmllZCBpbiB0ZXJtcyBvZiBpbnRlZ2VyIHBpeGVsIHVuaXRzKSBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJlZmVyZW5jZSBwbGFuZS4gCi0gKiAgIHJuZFZhbCAtIHJvdW5kaW5nIGNvbnRyb2wgcGFyYW1ldGVyOiAwIC0gZGlzYWJsZWQ7IDEgLSBlbmFibGVkLiAKLSAqICAgcFNyY0RzdE1WIC0gcG9pbnRlciB0byB0aGUgaW5pdGlhbCBNViBlc3RpbWF0ZTsgdHlwaWNhbGx5IGdlbmVyYXRlZCAKLSAqICAgICAgICAgICAgZHVyaW5nIGEgcHJpb3IgOHg4IGludGVnZXIgc2VhcmNoLCBzcGVjaWZpZWQgaW4gdGVybXMgb2YgCi0gKiAgICAgICAgICAgIGhhbGYtcGl4ZWwgdW5pdHMuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0TVYgLSBwb2ludGVyIHRvIGVzdGltYXRlZCBNViAKLSAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gbWluaW11bSBTQUQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcFNyY1JlZkJ1ZiwgcFJlZlJlY3QsIHBTcmNDdXJyQnVmZiwgcFNlYXJjaFBvaW50UmVmUG9zLCBwU3JjRHN0TVYKLSAqICAgIC0gICAgcFNyY0N1cnJCdWYgaXMgbm90IDgtYnl0ZSBhbGlnbmVkIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfOHg4ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCi0gICAgT01YX0lOVCByZWZXaWR0aCwKLSAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAotICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBTZWFyY2hQb2ludFJlZlBvcywKLSAgICBPTVhfSU5UIHJuZFZhbCwKLSAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0RzdE1WLAotICAgIE9NWF9JTlQgKnBEc3RTQUQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX01vdGlvbkVzdGltYXRpb25NQiAgICg2LjIuNC4zLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBtb3Rpb24gc2VhcmNoIGZvciBhIDE2eDE2IG1hY3JvYmxvY2suICBTZWxlY3RzIGJlc3QgbW90aW9uIHNlYXJjaCAKLSAqIHN0cmF0ZWd5IGZyb20gYW1vbmcgaW50ZXItMU1WLCBpbnRlci00TVYsIGFuZCBpbnRyYSBtb2Rlcy4gIFN1cHBvcnRzIAotICogaW50ZWdlciBhbmQgaGFsZiBwaXhlbCByZXNvbHV0aW9uLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjQ3VyckJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY3VycmVudCBNQiBpbiB0aGUgCi0gKiAgICAgICAgICAgIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmU7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuICAKLSAqICAgICAgICAgICAgVGhlIGZ1bmN0aW9uIGRvZXMgbm90IGV4cGVjdCBzb3VyY2UgZGF0YSBvdXRzaWRlIHRoZSByZWdpb24gCi0gKiAgICAgICAgICAgIGJvdW5kZWQgYnkgdGhlIE1CIHRvIGJlIGF2YWlsYWJsZTsgZm9yIGV4YW1wbGUgaXQgaXMgbm90IAotICogICAgICAgICAgICBuZWNlc3NhcnkgZm9yIHRoZSBjYWxsZXIgdG8gZ3VhcmFudGVlIHRoZSBhdmFpbGFiaWxpdHkgb2YgCi0gKiAgICAgICAgICAgIHBTcmNDdXJyQnVmWy1TcmNDdXJyU3RlcF0sIGkuZS4sIHRoZSByb3cgb2YgcGl4ZWxzIGFib3ZlIHRoZSBNQiAKLSAqICAgICAgICAgICAgdG8gYmUgcHJvY2Vzc2VkLiAKLSAqICAgc3JjQ3VyclN0ZXAgLSB3aWR0aCBvZiB0aGUgb3JpZ2luYWwgcGljdHVyZSBwbGFuZSwgaW4gdGVybXMgb2YgZnVsbCAKLSAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAotICogICBwU3JjUmVmQnVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIAotICogICAgICAgICAgICBwbGFuZSBsb2NhdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCAKLSAqICAgICAgICAgICAgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICogICBzcmNSZWZTdGVwIC0gd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwaWN0dXJlIHBsYW5lLCBpbiB0ZXJtcyBvZiBmdWxsIAotICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgIHBSZWZSZWN0IC0gcmVmZXJlbmNlIHBsYW5lIHZhbGlkIHJlZ2lvbiByZWN0YW5nbGUsIHNwZWNpZmllZCByZWxhdGl2ZSB0byAKLSAqICAgICAgICAgICAgdGhlIGltYWdlIG9yaWdpbiAKLSAqICAgcEN1cnJQb2ludFBvcyAtIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUgCi0gKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSB2ZW5kb3Itc3BlY2lmaWMgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiAKLSAqICAgICAgICAgICAgc3RydWN0dXJlOyBtdXN0IGJlIGFsbG9jYXRlZCBhbmQgdGhlbiBpbml0aWFsaXplZCB1c2luZyAKLSAqICAgICAgICAgICAgb214VkNNNFAyX01FSW5pdCBwcmlvciB0byBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uIAotICogICBwTUJJbmZvIC0gYXJyYXksIG9mIGRpbWVuc2lvbiBmb3VyLCBjb250YWluaW5nIHBvaW50ZXJzIHRvIGluZm9ybWF0aW9uIAotICogICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggZm91ciBuZWFyYnkgTUJzOiAKLSAqICAgICAgICAgICAgLSAgIHBNQkluZm9bMF0gLSBwb2ludGVyIHRvIGxlZnQgTUIgaW5mb3JtYXRpb24gCi0gKiAgICAgICAgICAgIC0gICBwTUJJbmZvWzFdIC0gcG9pbnRlciB0byB0b3AgTUIgaW5mb3JtYXRpb24gCi0gKiAgICAgICAgICAgIC0gICBwTUJJbmZvWzJdIC0gcG9pbnRlciB0byB0b3AtbGVmdCBNQiBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgLSAgIHBNQkluZm9bM10gLSBwb2ludGVyIHRvIHRvcC1yaWdodCBNQiBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgQW55IHBvaW50ZXIgaW4gdGhlIGFycmF5IG1heSBiZSBzZXQgZXF1YWwgdG8gTlVMTCBpZiB0aGUgCi0gKiAgICAgICAgICAgIGNvcnJlc3BvbmRpbmcgTUIgZG9lc24ndCBleGlzdC4gIEZvciBlYWNoIE1CLCB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZSAKLSAqICAgICAgICAgICAgbWVtYmVycyBhcmUgdXNlZDogICAgCi0gKiAgICAgICAgICAgIC0gICBtYlR5cGUgLSBtYWNyb2Jsb2NrIHR5cGUsIGVpdGhlciBPTVhfVkNfSU5UUkEsIE9NWF9WQ19JTlRFUiwgb3IgCi0gKiAgICAgICAgICAgICAgICBPTVhfVkNfSU5URVI0ViAKLSAqICAgICAgICAgICAgLSAgIHBNVjBbMl1bMl0gLSBlc3RpbWF0ZWQgbW90aW9uIHZlY3RvcnM7IHJlcHJlc2VudGVkIAotICogICAgICAgICAgICAgICAgaW4gMS8yIHBpeGVsIHVuaXRzIAotICogICAgICAgICAgICAtICAgc2xpY2VJRCAtIG51bWJlciBvZiB0aGUgc2xpY2UgdG8gd2hpY2ggdGhlIE1CIGJlbG9uZ3MgCi0gKiAgIHBTcmNEc3RNQkN1cnIgLSBwb2ludGVyIHRvIGluZm9ybWF0aW9uIHN0cnVjdHVyZSBmb3IgdGhlIGN1cnJlbnQgTUIuICAKLSAqICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBlbnRyaWVzIHNob3VsZCBiZSBzZXQgcHJpb3IgdG8gY2FsbGluZyB0aGUgCi0gKiAgICAgICAgICAgIGZ1bmN0aW9uOiBzbGljZUlEIC0gdGhlIG51bWJlciBvZiB0aGUgc2xpY2UgdGhlIHRvIHdoaWNoIHRoZSAKLSAqICAgICAgICAgICAgY3VycmVudCBNQiBiZWxvbmdzLiAgVGhlIHN0cnVjdHVyZSBlbGVtZW50cyBjYnB5IGFuZCBjYnBjIGFyZSAKLSAqICAgICAgICAgICAgaWdub3JlZC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3RNQkN1cnIgLSBwb2ludGVyIHRvIHVwZGF0ZWQgaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciB0aGUgY3VycmVudCAKLSAqICAgICAgICAgICAgTUIgYWZ0ZXIgTUItbGV2ZWwgbW90aW9uIGVzdGltYXRpb24gaGFzIGJlZW4gY29tcGxldGVkLiAgVGhlIAotICogICAgICAgICAgICBmb2xsb3dpbmcgc3RydWN0dXJlIG1lbWJlcnMgYXJlIHVwZGF0ZWQgYnkgdGhlIE1FIGZ1bmN0aW9uOiAgIAotICogICAgICAgICAgICAgIC0gIG1iVHlwZSAtIG1hY3JvYmxvY2sgdHlwZTogT01YX1ZDX0lOVFJBLCBPTVhfVkNfSU5URVIsIG9yIAotICogICAgICAgICAgICAgICAgIE9NWF9WQ19JTlRFUjRWLiAKLSAqICAgICAgICAgICAgICAtICBwTVYwWzJdWzJdIC0gZXN0aW1hdGVkIG1vdGlvbiB2ZWN0b3JzOyByZXByZXNlbnRlZCBpbiAKLSAqICAgICAgICAgICAgICAgICB0ZXJtcyBvZiAxLzIgcGVsIHVuaXRzLiAKLSAqICAgICAgICAgICAgICAtICBwTVZQcmVkWzJdWzJdIC0gcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3JzOyByZXByZXNlbnRlZCAKLSAqICAgICAgICAgICAgICAgICBpbiB0ZXJtcyBvZiAxLzIgcGVsIHVuaXRzLiAKLSAqICAgICAgICAgICAgVGhlIHN0cnVjdHVyZSBtZW1iZXJzIGNicHkgYW5kIGNicGMgYXJlIG5vdCB1cGRhdGVkIGJ5IHRoZSBmdW5jdGlvbi4gCi0gKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIHRoZSBtaW5pbXVtIFNBRCBmb3IgSU5URVIxViwgb3Igc3VtIG9mIG1pbmltdW0gU0FEcyAKLSAqICAgICAgICAgICAgZm9yIElOVEVSNFYgCi0gKiAgIHBEc3RCbG9ja1NBRCAtIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgU0FEIHZhbHVlcyBmb3IgZWFjaCBvZiB0aGUgZm91ciAKLSAqICAgICAgICAgICAgOHg4IGx1bWEgYmxvY2tzIGluIHRoZSBNQi4gIFRoZSBibG9jayBTQURzIGFyZSBpbiBzY2FuIG9yZGVyIGZvciAKLSAqICAgICAgICAgICAgZWFjaCBNQi4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb3IgbW9yZSBvZiB0aGUgCi0gKiAgICAgICAgICAgICAgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNDdXJyQnVmLCAKLSAqICAgICAgICAgICAgICBwU3JjUmVmQnVmLCBwUmVmUmVjdCwgcEN1cnJQb2ludFBvcywgcE1CSW50ZXIsIHBNQkludHJhLCAKLSAqICAgICAgICAgICAgICBwU3JjRHN0TUJDdXJyLCBvciBwRHN0U0FELiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfTW90aW9uRXN0aW1hdGlvbk1CICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAotICAgIE9NWF9TMzIgc3JjQ3VyclN0ZXAsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAotICAgIE9NWF9TMzIgc3JjUmVmU3RlcCwKLSAgICBjb25zdCBPTVhSZWN0KnBSZWZSZWN0LAotICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCi0gICAgdm9pZCAqcE1FU3BlYywKLSAgICBjb25zdCBPTVhWQ000UDJNQkluZm9QdHIgKnBNQkluZm8sCi0gICAgT01YVkNNNFAyTUJJbmZvICpwU3JjRHN0TUJDdXJyLAotICAgIE9NWF9VMTYgKnBEc3RTQUQsCi0gICAgT01YX1UxNiAqcERzdEJsb2NrU0FECi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EQ1Q4eDhibGsgICAoNi4yLjQuNC4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29tcHV0ZXMgYSAyRCBmb3J3YXJkIERDVCBmb3IgYSBzaW5nbGUgOHg4IGJsb2NrLCBhcyBkZWZpbmVkIGluIAotICogW0lTTzE0NDk2LTJdLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmVhcmx5IGFycmFuZ2VkIGlucHV0IGJ1ZmZlcjsgbXVzdCAKLSAqICAgICAgICAgICAgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuICBJbnB1dCB2YWx1ZXMgKHBpeGVsIAotICogICAgICAgICAgICBpbnRlbnNpdGllcykgYXJlIHZhbGlkIGluIHRoZSByYW5nZSBbLTI1NSwyNTVdLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lYXJseSBhcnJhbmdlZCBvdXRwdXQgYnVmZmVyOyBtdXN0IAotICogICAgICAgICAgICBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMsIHJldHVybmVkIGlmOgotICogICAgLSAgICBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCi0gKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfRENUOHg4YmxrICgKLSAgICBjb25zdCBPTVhfUzE2ICpwU3JjLAotICAgIE9NWF9TMTYgKnBEc3QKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1F1YW50SW50cmFfSSAgICg2LjIuNC40LjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBxdWFudGl6YXRpb24gb24gaW50cmEgYmxvY2sgY29lZmZpY2llbnRzLiBUaGlzIGZ1bmN0aW9uIHN1cHBvcnRzIAotICogYml0c19wZXJfcGl4ZWwgPT0gOC4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IGludHJhIGJsb2NrIGNvZWZmaWNpZW50czsgbXVzdCBiZSBhbGlnbmVkIAotICogICAgICAgICAgICBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICogICBRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKHF1YW50aXplcl9zY2FsZSkuIAotICogICBibG9ja0luZGV4IC0gYmxvY2sgaW5kZXggaW5kaWNhdGluZyB0aGUgY29tcG9uZW50IHR5cGUgYW5kIHBvc2l0aW9uLCAKLSAqICAgICAgICAgICAgdmFsaWQgaW4gdGhlIHJhbmdlIDAgdG8gNSwgYXMgZGVmaW5lZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSAKLSAqICAgICAgICAgICAgNi4xLjMuOC4gCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAotICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgCi0gKiAgICAgICAgICAgIG1vZGUsIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIG91dHB1dCAocXVhbnRpemVkKSBpbnRlcmJsb2NrIGNvZWZmaWNpZW50cy4gIAotICogICAgICAgICAgICBXaGVuIHNob3J0VmlkZW9IZWFkZXI9PTEsIEFDIGNvZWZmaWNpZW50cyBhcmUgc2F0dXJhdGVkIG9uIHRoZSAKLSAqICAgICAgICAgICAgaW50ZXJ2YWwgWy0xMjcsIDEyN10sIGFuZCBEQyBjb2VmZmljaWVudHMgYXJlIHNhdHVyYXRlZCBvbiB0aGUgCi0gKiAgICAgICAgICAgIGludGVydmFsIFsxLCAyNTRdLiAgV2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0wLCBBQyBjb2VmZmljaWVudHMgCi0gKiAgICAgICAgICAgIGFyZSBzYXR1cmF0ZWQgb24gdGhlIGludGVydmFsIFstMjA0NywgMjA0N10uIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgotICogICAgLSAgICBwU3JjRHN0IGlzIE5VTEwuIAotICogICAgLSAgICBibG9ja0luZGV4IDwgMCBvciBibG9ja0luZGV4ID49IDEwIAotICogICAgLSAgICBRUCA8PSAwIG9yIFFQID49IDMyLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfUXVhbnRJbnRyYV9JICgKLSAgICBPTVhfUzE2ICpwU3JjRHN0LAotICAgIE9NWF9VOCBRUCwKLSAgICBPTVhfSU5UIGJsb2NrSW5kZXgsCi0gICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9RdWFudEludGVyX0kgICAoNi4yLjQuNC4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgcXVhbnRpemF0aW9uIG9uIGFuIGludGVyIGNvZWZmaWNpZW50IGJsb2NrOyBzdXBwb3J0cyAKLSAqIGJpdHNfcGVyX3BpeGVsID09IDguIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCBpbnRlciBibG9jayBjb2VmZmljaWVudHM7IG11c3QgYmUgYWxpZ25lZCAKLSAqICAgICAgICAgICAgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIChxdWFudGl6ZXJfc2NhbGUpIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7IAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIG1vZGUsIGFuZCAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBvdXRwdXQgKHF1YW50aXplZCkgaW50ZXJibG9jayBjb2VmZmljaWVudHMuICAKLSAqICAgICAgICAgICAgV2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLCBBQyBjb2VmZmljaWVudHMgYXJlIHNhdHVyYXRlZCBvbiB0aGUgCi0gKiAgICAgICAgICAgIGludGVydmFsIFstMTI3LCAxMjddLCBhbmQgREMgY29lZmZpY2llbnRzIGFyZSBzYXR1cmF0ZWQgb24gdGhlIAotICogICAgICAgICAgICBpbnRlcnZhbCBbMSwgMjU0XS4gIFdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MCwgQUMgY29lZmZpY2llbnRzIAotICogICAgICAgICAgICBhcmUgc2F0dXJhdGVkIG9uIHRoZSBpbnRlcnZhbCBbLTIwNDcsIDIwNDddLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKLSAqICAgIC0gICAgcFNyY0RzdCBpcyBOVUxMLiAKLSAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PSAzMi4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX1F1YW50SW50ZXJfSSAoCi0gICAgT01YX1MxNiAqcFNyY0RzdCwKLSAgICBPTVhfVTggUVAsCi0gICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYSAgICg2LjIuNC40LjQpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBRdWFudGl6ZXMgdGhlIERDVCBjb2VmZmljaWVudHMsIGltcGxlbWVudHMgaW50cmEgYmxvY2sgQUMvREMgY29lZmZpY2llbnQgCi0gKiBwcmVkaWN0aW9uLCBhbmQgcmVjb25zdHJ1Y3RzIHRoZSBjdXJyZW50IGludHJhIGJsb2NrIHRleHR1cmUgZm9yIHByZWRpY3Rpb24gCi0gKiBvbiB0aGUgbmV4dCBmcmFtZS4gIFF1YW50aXplZCByb3cgYW5kIGNvbHVtbiBjb2VmZmljaWVudHMgYXJlIHJldHVybmVkIGluIAotICogdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgYnVmZmVycy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHBpeGVscyBvZiBjdXJyZW50IGludHJhIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gCi0gKiAgICAgICAgICAgIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBQcmVkQnVmUm93IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlciBjb250YWluaW5nIAotICogICAgICAgICAgICAoKG51bV9tYl9wZXJfcm93ICogMiArIDEpICogOCkgZWxlbWVudHMgb2YgdHlwZSBPTVhfUzE2LiAKLSAqICAgICAgICAgICAgQ29lZmZpY2llbnRzIGFyZSBvcmdhbml6ZWQgaW50byBibG9ja3Mgb2YgZWlnaHQgYXMgZGVzY3JpYmVkIAotICogICAgICAgICAgICBiZWxvdyAoSW50ZXJuYWwgUHJlZGljdGlvbiBDb2VmZmljaWVudCBVcGRhdGUgUHJvY2VkdXJlcykuICBUaGUgCi0gKiAgICAgICAgICAgIERDIGNvZWZmaWNpZW50IGlzIGZpcnN0LCBhbmQgdGhlIHJlbWFpbmluZyBidWZmZXIgbG9jYXRpb25zIAotICogICAgICAgICAgICBjb250YWluIHRoZSBxdWFudGl6ZWQgQUMgY29lZmZpY2llbnRzLiBFYWNoIGdyb3VwIG9mIGVpZ2h0IHJvdyAKLSAqICAgICAgICAgICAgYnVmZmVyIGVsZW1lbnRzIGNvbWJpbmVkIHdpdGggb25lIGVsZW1lbnQgZWlnaHQgZWxlbWVudHMgYWhlYWQgCi0gKiAgICAgICAgICAgIGNvbnRhaW5zIHRoZSBjb2VmZmljaWVudCBwcmVkaWN0b3JzIG9mIHRoZSBuZWlnaGJvcmluZyBibG9jayAKLSAqICAgICAgICAgICAgdGhhdCBpcyBzcGF0aWFsbHkgYWJvdmUgb3IgdG8gdGhlIGxlZnQgb2YgdGhlIGJsb2NrIGN1cnJlbnRseSB0byAKLSAqICAgICAgICAgICAgYmUgZGVjb2RlZC4gQSBuZWdhdGl2ZS12YWx1ZWQgREMgY29lZmZpY2llbnQgaW5kaWNhdGVzIHRoYXQgdGhpcyAKLSAqICAgICAgICAgICAgbmVpZ2hib3JpbmcgYmxvY2sgaXMgbm90IElOVFJBLWNvZGVkIG9yIG91dCBvZiBib3VuZHMsIGFuZCAKLSAqICAgICAgICAgICAgdGhlcmVmb3JlIHRoZSBBQyBhbmQgREMgY29lZmZpY2llbnRzIGFyZSBpbnZhbGlkLiAgUG9pbnRlciBtdXN0IAotICogICAgICAgICAgICBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBQcmVkQnVmQ29sIC0gcG9pbnRlciB0byB0aGUgcHJlZGljdGlvbiBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyIAotICogICAgICAgICAgICBjb250YWluaW5nIDE2IGVsZW1lbnRzIG9mIHR5cGUgT01YX1MxNi4gQ29lZmZpY2llbnRzIGFyZSAKLSAqICAgICAgICAgICAgb3JnYW5pemVkIGFzIGRlc2NyaWJlZCBpbiBzZWN0aW9uIDYuMi4yLjUuICBQb2ludGVyIG11c3QgYmUgCi0gKiAgICAgICAgICAgIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcFN1bUVyciAtIHBvaW50ZXIgdG8gYSBmbGFnIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgQUMgcHJlZGljdGlvbiBpcyAKLSAqICAgICAgICAgICAgcmVxdWlyZWQ7IEFDIHByZWRpY3Rpb24gaXMgZW5hYmxlZCBpZiAqcFN1bUVyciA+PTAsIGJ1dCB0aGUgCi0gKiAgICAgICAgICAgIHZhbHVlIGlzIG5vdCB1c2VkIGZvciBjb2VmZmljaWVudCBwcmVkaWN0aW9uLCBpLmUuLCB0aGUgc3VtIG9mIAotICogICAgICAgICAgICBhYnNvbHV0ZSBkaWZmZXJlbmNlcyBzdGFydHMgZnJvbSAwIGZvciBlYWNoIGNhbGwgdG8gdGhpcyAKLSAqICAgICAgICAgICAgZnVuY3Rpb24uICBPdGhlcndpc2UgQUMgcHJlZGljdGlvbiBpcyBkaXNhYmxlZCBpZiAqcFN1bUVyciA8IDAgLiAKLSAqICAgYmxvY2tJbmRleCAtIGJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZCBwb3NpdGlvbiwgYXMgCi0gKiAgICAgICAgICAgIGRlZmluZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNi4xLjMuOC4gCi0gKiAgIGN1clFwIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgbWFjcm9ibG9jayB0byB3aGljaCB0aGUgY3VycmVudCAKLSAqICAgICAgICAgICAgYmxvY2sgYmVsb25ncyAKLSAqICAgcFFwQnVmIC0gcG9pbnRlciB0byBhIDItZWxlbWVudCBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGJ1ZmZlcjsgcFFwQnVmWzBdIAotICogICAgICAgICAgICBjb250YWlucyB0aGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBhc3NvY2lhdGVkIHdpdGggdGhlIDh4OCAKLSAqICAgICAgICAgICAgYmxvY2sgbGVmdCBvZiB0aGUgY3VycmVudCBibG9jayAoUVBhKSwgYW5kIHBRcEJ1ZlsxXSBjb250YWlucyAKLSAqICAgICAgICAgICAgdGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSA4eDggYmxvY2sgYWJvdmUgCi0gKiAgICAgICAgICAgIHRoZSBjdXJyZW50IGJsb2NrIChRUGMpLiAgSW4gdGhlIGV2ZW50IHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgCi0gKiAgICAgICAgICAgIGJsb2NrIGlzIG91dHNpZGUgb2YgdGhlIFZPUCBib3VuZCwgdGhlIFFwIHZhbHVlIHdpbGwgbm90IGFmZmVjdCAKLSAqICAgICAgICAgICAgdGhlIGludHJhIHByZWRpY3Rpb24gcHJvY2VzcywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgCi0gKiAgICAgICAgICAgIHN1Yi1jbGF1c2UgNy40LjMuMywgIEFkYXB0aXZlIEFDIENvZWZmaWNpZW50IFByZWRpY3Rpb24uICAKLSAqICAgc3JjU3RlcCAtIHdpZHRoIG9mIHRoZSBzb3VyY2UgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIGRzdFN0ZXAgLSB3aWR0aCBvZiB0aGUgcmVjb25zdHJ1Y3RlZCBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSAKLSAqICAgICAgICAgICAgbXVsdGlwbGUgb2YgMTYuIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKLSAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIAotICogICAgICAgICAgICBtb2RlLCBhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50IGJ1ZmZlcjsgcERzdFswXSBjb250YWlucyAKLSAqICAgICAgICAgICAgdGhlIHByZWRpY3RlZCBEQyBjb2VmZmljaWVudDsgdGhlIHJlbWFpbmluZyBlbnRyaWVzIGNvbnRhaW4gdGhlIAotICogICAgICAgICAgICBxdWFudGl6ZWQgQUMgY29lZmZpY2llbnRzICh3aXRob3V0IHByZWRpY3Rpb24pLiAgVGhlIHBvaW50ZXIgCi0gKiAgICAgICAgICAgIHBEc3RtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcFJlYyAtIHBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgdGV4dHVyZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIAotICogICAgICAgICAgICA4LWJ5dGUgYm91bmRhcnkuIAotICogICBwUHJlZEJ1ZlJvdyAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgcm93IGJ1ZmZlciAKLSAqICAgcFByZWRCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIgCi0gKiAgIHBQcmVBQ1ByZWRpY3QgLSBpZiBwcmVkaWN0aW9uIGlzIGVuYWJsZWQsIHRoZSBwYXJhbWV0ZXIgcG9pbnRzIHRvIHRoZSAKLSAqICAgICAgICAgICAgc3RhcnQgb2YgdGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBjb2VmZmljaWVudCBkaWZmZXJlbmNlcyBmb3IgCi0gKiAgICAgICAgICAgIFZMQyBlbmNvZGluZy4gVGhlIGVudHJ5IHBQcmVBQ1ByZWRpY3RbMF1pbmRpY2F0ZXMgcHJlZGljdGlvbiAKLSAqICAgICAgICAgICAgZGlyZWN0aW9uIGZvciB0aGUgY3VycmVudCBibG9jayBhbmQgdGFrZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgIHZhbHVlczogT01YX1ZDX05PTkUgKHByZWRpY3Rpb24gZGlzYWJsZWQpLCBPTVhfVkNfSE9SSVpPTlRBTCwgb3IgCi0gKiAgICAgICAgICAgIE9NWF9WQ19WRVJUSUNBTC4gIFRoZSBlbnRyaWVzIAotICogICAgICAgICAgICBwUHJlQUNQcmVkaWN0WzFdLXBQcmVBQ1ByZWRpY3RbN11jb250YWluIHByZWRpY3RlZCBBQyAKLSAqICAgICAgICAgICAgY29lZmZpY2llbnRzLiAgSWYgcHJlZGljdGlvbiBpcyBkaXNhYmxlZCAoKnBTdW1FcnI8MCkgdGhlbiB0aGUgCi0gKiAgICAgICAgICAgIGNvbnRlbnRzIG9mIHRoaXMgYnVmZmVyIGFyZSB1bmRlZmluZWQgdXBvbiByZXR1cm4gZnJvbSB0aGUgCi0gKiAgICAgICAgICAgIGZ1bmN0aW9uIAotICogICBwU3VtRXJyIC0gcG9pbnRlciB0byB0aGUgdmFsdWUgb2YgdGhlIGFjY3VtdWxhdGVkIEFDIGNvZWZmaWNpZW50IGVycm9ycywgCi0gKiAgICAgICAgICAgIGkuZS4sIHN1bSBvZiB0aGUgYWJzb2x1dGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBwcmVkaWN0ZWQgYW5kIAotICogICAgICAgICAgICB1bnByZWRpY3RlZCBBQyBjb2VmZmljaWVudHMgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIEJhZCBhcmd1bWVudHM6Ci0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBEc3QsIHBSZWMsIAotICogICAgICAgICBwQ29lZkJ1ZlJvdywgcENvZWZCdWZDb2wsIHBRcEJ1ZiwgcFByZUFDUHJlZGljdCwgcFN1bUVyci4gCi0gKiAgICAtICAgIGJsb2NrSW5kZXggPCAwIG9yIGJsb2NrSW5kZXggPj0gMTA7IAotICogICAgLSAgICBjdXJRUCA8PSAwIG9yIGN1clFQID49IDMyLiAKLSAqICAgIC0gICAgc3JjU3RlcCwgb3IgZHN0U3RlcCA8PSAwIG9yIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICogICAgLSAgICBwRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQ6IC4gCi0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZDogCi0gKiAgICAgICAgIHBTcmMsIHBSZWMuICAKLSAqCi0gKiAgTm90ZTogVGhlIGNvZWZmaWNpZW50IGJ1ZmZlcnMgbXVzdCBiZSB1cGRhdGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgCi0gKiAgICAgICAgdXBkYXRlIHByb2NlZHVyZXMgZGVmaW5lZCBpbiBzZWN0aW9uIGluIDYuMi4yLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50cmEgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKLSAgICBPTVhfUzE2ICpwRHN0LAotICAgIE9NWF9VOCAqcFJlYywKLSAgICBPTVhfUzE2ICpwUHJlZEJ1ZlJvdywKLSAgICBPTVhfUzE2ICpwUHJlZEJ1ZkNvbCwKLSAgICBPTVhfUzE2ICpwUHJlQUNQcmVkaWN0LAotICAgIE9NWF9JTlQgKnBTdW1FcnIsCi0gICAgT01YX0lOVCBibG9ja0luZGV4LAotICAgIE9NWF9VOCBjdXJRcCwKLSAgICBjb25zdCBPTVhfVTggKnBRcEJ1ZiwKLSAgICBPTVhfSU5UIHNyY1N0ZXAsCi0gICAgT01YX0lOVCBkc3RTdGVwLAotICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50ZXIgICAoNi4yLjQuNC41KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogSW1wbGVtZW50cyBEQ1QsIGFuZCBxdWFudGl6ZXMgdGhlIERDVCBjb2VmZmljaWVudHMgb2YgdGhlIGludGVyIGJsb2NrIAotICogd2hpbGUgcmVjb25zdHJ1Y3RpbmcgdGhlIHRleHR1cmUgcmVzaWR1YWwuIFRoZXJlIGlzIG5vIGJvdW5kYXJ5IGNoZWNrIGZvciAKLSAqIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtcG9pbnRlciB0byB0aGUgcmVzaWR1YWxzIHRvIGJlIGVuY29kZWQ7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiAKLSAqICAgICAgICAgICAgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlci4gCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsgCi0gKiAgICAgICAgICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIG1vZGUsIGFuZCAKLSAqICAgICAgICAgICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub24gbGluZWFyIGludHJhIERDIG1vZGUuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudHMgYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgCi0gKiAgICAgICAgICAgIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBSZWMgLSBwb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIHRleHR1cmUgcmVzaWR1YWxzOyBtdXN0IGJlIGFsaWduZWQgCi0gKiAgICAgICAgICAgIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6Ci0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIGVpdGhlciBOVUxMIG9yIAotICogICAgICAgICBub3QgMTYtYnl0ZSBhbGlnbmVkOiAKLSAqICAgICAgICAgICAgLSBwU3JjIAotICogICAgICAgICAgICAtIHBEc3QKLSAqICAgICAgICAgICAgLSBwUmVjCi0gKiAgICAtICAgIFFQIDw9IDAgb3IgUVAgPj0gMzIuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRlciAoCi0gICAgY29uc3QgT01YX1MxNiAqcFNyYywKLSAgICBPTVhfUzE2ICpwRHN0LAotICAgIE9NWF9TMTYgKnBSZWMsCi0gICAgT01YX1U4IFFQLAotICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhRENWTEMgICAoNi4yLjQuNS4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgemlnemFnIHNjYW4gYW5kIFZMQyBlbmNvZGluZyBvZiBBQyBhbmQgREMgY29lZmZpY2llbnRzIGZvciBvbmUgCi0gKiBpbnRyYSBibG9jay4gIFR3byB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb24gKERDVkxDIGFuZCBBQ1ZMQykgYXJlIHByb3ZpZGVkIAotICogaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGUgdHdvIGRpZmZlcmVudCBtZXRob2RzIG9mIHByb2Nlc3NpbmcgREMgCi0gKiBjb2VmZmljaWVudHMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjQuMS40LCAiSW50cmEgREMgCi0gKiBDb2VmZmljaWVudCBEZWNvZGluZyBmb3IgdGhlIENhc2Ugb2YgU3dpdGNoZWQgVkxDIEVuY29kaW5nIi4gIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gZG91YmxlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0c3RyZWFtIAotICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgCi0gKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNy4gCi0gKiAgIHBRRGN0QmxrQ29lZiAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQgCi0gKiAgIHByZWREaXIgLSBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbiwgd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgdGhlIHppZ3phZyAKLSAqICAgICAgICAgICAgc2NhbiBwYXR0ZXJuOyB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IAotICogICAgICAgICAgICAtICBPTVhfVkNfTk9ORSAtIEFDIHByZWRpY3Rpb24gbm90IHVzZWQuICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnIHNjYW4uIAotICogICAgICAgICAgICAtICBPTVhfVkNfSE9SSVpPTlRBTCAtIEhvcml6b250YWwgcHJlZGljdGlvbi4gIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS12ZXJ0aWNhbCB6aWd6YWcgc2Nhbi4gCi0gKiAgICAgICAgICAgIC0gIE9NWF9WQ19WRVJUSUNBTCAtIFZlcnRpY2FsIHByZWRpY3Rpb24uICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtaG9yaXpvbnRhbCB6aWd6YWcgc2Nhbi4gCi0gKiAgIHBhdHRlcm4gLSBibG9jayBwYXR0ZXJuIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgdGhpcyBibG9jayBpcyAKLSAqICAgICAgICAgICAgZW5jb2RlZCAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCi0gKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKLSAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSwgY2hyb21pbmFuY2UpIG9mIHRoZSBjdXJyZW50IAotICogICAgICAgICAgICBibG9jayAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwgc28gCi0gKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyLiAKLSAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAotICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIEJhZCBhcmd1bWVudHM6Ci0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAKLSAqICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBRRGN0QmxrQ29lZi4gCi0gKiAgICAtICAgKnBCaXRPZmZzZXQgPCAwLCBvciAqcEJpdE9mZnNldCA+Ny4gCi0gKiAgICAtICAgIFByZWREaXIgaXMgbm90IG9uZSBvZjogT01YX1ZDX05PTkUsIE9NWF9WQ19IT1JJWk9OVEFMLCBvciAKLSAqICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMLiAKLSAqICAgIC0gICAgVmlkZW9Db21wIGlzIG5vdCBvbmUgY29tcG9uZW50IG9mIGVudW0gT01YVkNNNFAyVmlkZW9Db21wb25lbnQuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyAoCi0gICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICBjb25zdCBPTVhfUzE2ICpwUURjdEJsa0NvZWYsCi0gICAgT01YX1U4IHByZWREaXIsCi0gICAgT01YX1U4IHBhdHRlcm4sCi0gICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAotICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50IHZpZGVvQ29tcAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhQUNWTEMgICAoNi4yLjQuNS4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgemlnemFnIHNjYW4gYW5kIFZMQyBlbmNvZGluZyBvZiBBQyBhbmQgREMgY29lZmZpY2llbnRzIGZvciBvbmUgCi0gKiBpbnRyYSBibG9jay4gIFR3byB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb24gKERDVkxDIGFuZCBBQ1ZMQykgYXJlIHByb3ZpZGVkIAotICogaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGUgdHdvIGRpZmZlcmVudCBtZXRob2RzIG9mIHByb2Nlc3NpbmcgREMgCi0gKiBjb2VmZmljaWVudHMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjQuMS40LCAgSW50cmEgREMgCi0gKiBDb2VmZmljaWVudCBEZWNvZGluZyBmb3IgdGhlIENhc2Ugb2YgU3dpdGNoZWQgVkxDIEVuY29kaW5nLiAgCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSBkb3VibGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXRzdHJlYW0gCi0gKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAKLSAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3LiAKLSAqICAgcFFEY3RCbGtDb2VmIC0gcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudCAKLSAqICAgcHJlZERpciAtIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uLCB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB0aGUgemlnemFnIAotICogICAgICAgICAgICBzY2FuIHBhdHRlcm47IHRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogCi0gKiAgICAgICAgICAgIC0gIE9NWF9WQ19OT05FIC0gQUMgcHJlZGljdGlvbiBub3QgdXNlZC4gIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcgc2Nhbi4gCi0gKiAgICAgICAgICAgIC0gIE9NWF9WQ19IT1JJWk9OVEFMIC0gSG9yaXpvbnRhbCBwcmVkaWN0aW9uLiAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLXZlcnRpY2FsIHppZ3phZyBzY2FuLiAKLSAqICAgICAgICAgICAgLSAgT01YX1ZDX1ZFUlRJQ0FMIC0gVmVydGljYWwgcHJlZGljdGlvbi4gIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS1ob3Jpem9udGFsIHppZ3phZyBzY2FuLiAKLSAqICAgcGF0dGVybiAtIGJsb2NrIHBhdHRlcm4gd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgd2hldGhlciB0aGlzIGJsb2NrIGlzIAotICogICAgICAgICAgICBlbmNvZGVkIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKLSAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLCBzbyAKLSAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIuIAotICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCi0gKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gQmFkIGFyZ3VtZW50czoKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sIAotICogICAgICAgICAgICAgICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcFFEY3RCbGtDb2VmLiAKLSAqICAgIC0gICAqcEJpdE9mZnNldCA8IDAsIG9yICpwQml0T2Zmc2V0ID43LiAKLSAqICAgIC0gICAgUHJlZERpciBpcyBub3Qgb25lIG9mOiBPTVhfVkNfTk9ORSwgT01YX1ZDX0hPUklaT05UQUwsIG9yIAotICogICAgICAgICBPTVhfVkNfVkVSVElDQUwuIAotICogICAgLSAgICBWaWRlb0NvbXAgaXMgbm90IG9uZSBjb21wb25lbnQgb2YgZW51bSBPTVhWQ000UDJWaWRlb0NvbXBvbmVudC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDICgKLSAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgIGNvbnN0IE9NWF9TMTYgKnBRRGN0QmxrQ29lZiwKLSAgICBPTVhfVTggcHJlZERpciwKLSAgICBPTVhfVTggcGF0dGVybiwKLSAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRlciAgICg2LjIuNC41LjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZW5jb2RpbmcgZm9yIG9uZSBpbnRlciBibG9jay4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCAKLSAqICAgICAgICAgICAgc3RyZWFtIAotICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgCi0gKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNyAKLSAqICAgcFFEY3RCbGtDb2VmIC0gcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudCAKLSAqICAgcGF0dGVybiAtIGJsb2NrIHBhdHRlcm4gd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgd2hldGhlciB0aGlzIGJsb2NrIGlzIAotICogICAgICAgICAgICBlbmNvZGVkIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKLSAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkIHNvIHRoYXQgCi0gKiAgICAgICAgICAgIGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4gCi0gKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKLSAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0uIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBCYWQgYXJndW1lbnRzIAotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIHBvaW50ZXJzOiBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCAKLSAqICAgICAgICAgICAgICBwQml0T2Zmc2V0LCBwUURjdEJsa0NvZWYgCi0gKiAgICAtICAgKnBCaXRPZmZzZXQgPCAwLCBvciAqcEJpdE9mZnNldCA+Ny4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRlciAoCi0gICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICBjb25zdCBPTVhfUzE2ICpwUURjdEJsa0NvZWYsCi0gICAgT01YX1U4IHBhdHRlcm4sCi0gICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9FbmNvZGVNViAgICg2LjIuNC41LjQpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQcmVkaWN0cyBhIG1vdGlvbiB2ZWN0b3IgZm9yIHRoZSBjdXJyZW50IG1hY3JvYmxvY2ssIGVuY29kZXMgdGhlIAotICogZGlmZmVyZW5jZSwgYW5kIHdyaXRlcyB0aGUgb3V0cHV0IHRvIHRoZSBzdHJlYW0gYnVmZmVyLiBUaGUgaW5wdXQgTVZzIAotICogcE1WQ3VyTUIsIHBTcmNNVkxlZnRNQiwgcFNyY01WVXBwZXJNQiwgYW5kIHBTcmNNVlVwcGVyUmlnaHRNQiBzaG91bGQgbGllIAotICogd2l0aGluIHRoZSByYW5nZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbnB1dCBwYXJhbWV0ZXIgZmNvZGVGb3J3YXJkLCBhcyAKLSAqIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuMy4gIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYSAKLSAqIHN1cGVyc2V0IG9mIHRoZSBmdW5jdGlvbmFsaXR5IGFzc29jaWF0ZWQgd2l0aCB0aGUgZnVuY3Rpb24gCi0gKiBvbXhWQ000UDJfRmluZE1WcHJlZC4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSBkb3VibGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXRzdHJlYW0gYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gaW5kZXggb2YgdGhlIGZpcnN0IGZyZWUgKG5leHQgYXZhaWxhYmxlKSBiaXQgaW4gdGhlIHN0cmVhbSAKLSAqICAgICAgICAgICAgYnVmZmVyIHJlZmVyZW5jZWQgYnkgKnBwQml0U3RyZWFtLCB2YWxpZCBpbiB0aGUgcmFuZ2UgMCB0byA3LiAKLSAqICAgcE1WQ3VyTUIgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgbW90aW9uIHZlY3RvcjsgYSB2YWx1ZSBvZiAKLSAqICAgICAgICAgICAgTlVMTCBpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuIAotICogICBwU3JjTVZMZWZ0TUIgLSBwb2ludGVyIHRvIHRoZSBzb3VyY2UgbGVmdCBtYWNyb2Jsb2NrIG1vdGlvbiB2ZWN0b3I7IGEgCi0gKiAgICAgICAgICAgIHZhbHVlIG9mICBOVUxMaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAKLSAqICAgcFNyY01WVXBwZXJNQiAtIHBvaW50ZXIgdG8gc291cmNlIHVwcGVyIG1hY3JvYmxvY2sgbW90aW9uIHZlY3RvcjsgYSAKLSAqICAgICAgICAgICAgdmFsdWUgb2YgTlVMTCBpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuIAotICogICBwU3JjTVZVcHBlclJpZ2h0TUIgLSBwb2ludGVyIHRvIHNvdXJjZSB1cHBlciByaWdodCBNQiBtb3Rpb24gdmVjdG9yOyBhIAotICogICAgICAgICAgICB2YWx1ZSBvZiBOVUxMIGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gCi0gKiAgIGZjb2RlRm9yd2FyZCAtIGFuIGludGVnZXIgd2l0aCB2YWx1ZXMgZnJvbSAxIHRvIDc7IHVzZWQgaW4gZW5jb2RpbmcgCi0gKiAgICAgICAgICAgIG1vdGlvbiB2ZWN0b3JzIHJlbGF0ZWQgdG8gc2VhcmNoIHJhbmdlLCBhcyBkZXNjcmliZWQgaW4gCi0gKiAgICAgICAgICAgIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi4zLiAKLSAqICAgTUJUeXBlIC0gbWFjcm8gYmxvY2sgdHlwZSwgdmFsaWQgaW4gdGhlIHJhbmdlIDAgdG8gNSAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSB1cGRhdGVkIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSAKLSAqICAgICAgICAgICAgYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gdXBkYXRlZCBpbmRleCBvZiB0aGUgbmV4dCBhdmFpbGFibGUgYml0IHBvc2l0aW9uIGluIHN0cmVhbSAKLSAqICAgICAgICAgICAgYnVmZmVyIHJlZmVyZW5jZWQgYnkgKnBwQml0U3RyZWFtIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzIAotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgCi0gKiAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwTVZDdXJNQiAKLSAqICAgIC0gICAgKnBCaXRPZmZzZXQgPCAwLCBvciAqcEJpdE9mZnNldCA+Ny4gCi0gKiAgICAtICAgIGZjb2RlRm9yd2FyZCA8PSAwLCBvciBmY29kZUZvcndhcmQgPiA3LCBvciBNQlR5cGUgPCAwLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfRW5jb2RlTVYgKAotICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBNVkN1ck1CLAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yKnBTcmNNVkxlZnRNQiwKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY01WVXBwZXJNQiwKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY01WVXBwZXJSaWdodE1CLAotICAgIE9NWF9JTlQgZmNvZGVGb3J3YXJkLAotICAgIE9NWFZDTTRQMk1hY3JvYmxvY2tUeXBlIE1CVHlwZQotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUCAgICg2LjIuNS4xLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBEZWNvZGVzIGFuZCBwYWRzIHRoZSBmb3VyIG1vdGlvbiB2ZWN0b3JzIGFzc29jaWF0ZWQgd2l0aCBhIG5vbi1pbnRyYSBQLVZPUCAKLSAqIG1hY3JvYmxvY2suICBGb3IgbWFjcm9ibG9ja3Mgb2YgdHlwZSBPTVhfVkNfSU5URVI0ViwgdGhlIG91dHB1dCBNViBpcyAKLSAqIHBhZGRlZCBhcyBzcGVjaWZpZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjEuNi4gT3RoZXJ3aXNlLCBmb3IgCi0gKiBtYWNyb2Jsb2NrcyBvZiB0eXBlcyBvdGhlciB0aGFuIE9NWF9WQ19JTlRFUjRWLCB0aGUgZGVjb2RlZCBNViBpcyBjb3BpZWQgdG8gCi0gKiBhbGwgZm91ciBvdXRwdXQgTVYgYnVmZmVyIGVudHJpZXMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgCi0gKiAgICAgICAgICAgIHN0cmVhbSBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCB0byBieSAKLSAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4gWzAtN10uIAotICogICBwU3JjTVZMZWZ0TUIsIHBTcmNNVlVwcGVyTUIsIGFuZCBwU3JjTVZVcHBlclJpZ2h0TUIgLSBwb2ludGVycyB0byB0aGUgCi0gKiAgICAgICAgICAgIG1vdGlvbiB2ZWN0b3IgYnVmZmVycyBvZiB0aGUgbWFjcm9ibG9ja3Mgc3BlY2lhbGx5IGF0IHRoZSBsZWZ0LCAKLSAqICAgICAgICAgICAgdXBwZXIsIGFuZCB1cHBlci1yaWdodCBzaWRlIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2ssIAotICogICAgICAgICAgICByZXNwZWN0aXZlbHk7IGEgdmFsdWUgb2YgTlVMTCBpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuICBOb3RlOiAKLSAqICAgICAgICAgICAgQW55IG5laWdoYm9yaG9vZCBtYWNyb2Jsb2NrIG91dHNpZGUgdGhlIGN1cnJlbnQgVk9QIG9yIHZpZGVvIAotICogICAgICAgICAgICBwYWNrZXQgb3Igb3V0c2lkZSB0aGUgY3VycmVudCBHT0IgKHdoZW4gc2hvcnRfdmlkZW9faGVhZGVyIGlzIAotICogICAgICAgICAgICAgMSApIGZvciB3aGljaCBnb2JfaGVhZGVyX2VtcHR5IGlzICAwICBpcyB0cmVhdGVkIGFzIAotICogICAgICAgICAgICB0cmFuc3BhcmVudCwgYWNjb3JkaW5nIHRvIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi41LiAKLSAqICAgZmNvZGVGb3J3YXJkIC0gYSBjb2RlIGVxdWFsIHRvIHZvcF9mY29kZV9mb3J3YXJkIGluIE1QRUctNCBiaXQgc3RyZWFtIAotICogICAgICAgICAgICBzeW50YXggCi0gKiAgIE1CVHlwZSAtIHRoZSB0eXBlIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2suIElmIE1CVHlwZSBpcyBub3QgZXF1YWwgdG8gCi0gKiAgICAgICAgICAgIE9NWF9WQ19JTlRFUjRWLCB0aGUgZGVzdGluYXRpb24gbW90aW9uIHZlY3RvciBidWZmZXIgaXMgc3RpbGwgCi0gKiAgICAgICAgICAgIGZpbGxlZCB3aXRoIHRoZSBzYW1lIGRlY29kZWQgdmVjdG9yLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCwgc28gCi0gKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCi0gKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAotICogICBwRHN0TVZDdXJNQiAtIHBvaW50ZXIgdG8gdGhlIG1vdGlvbiB2ZWN0b3IgYnVmZmVyIGZvciB0aGUgY3VycmVudCAKLSAqICAgICAgICAgICAgbWFjcm9ibG9jazsgY29udGFpbnMgZm91ciBkZWNvZGVkIG1vdGlvbiB2ZWN0b3JzIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcERzdE1WQ3VyTUIgCi0gKiAgICAtICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10KLSAqICAgIC0gICAgZmNvZGVGb3J3YXJkIGV4Y2VlZHMgKDAsN10KLSAqICAgIC0gICAgTUJUeXBlIGxlc3MgdGhhbiB6ZXJvCi0gKiAgICAtICAgIG1vdGlvbiB2ZWN0b3IgYnVmZmVyIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvciAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUCAoCi0gICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY01WTGVmdE1CLAotICAgIE9NWFZDTW90aW9uVmVjdG9yKnBTcmNNVlVwcGVyTUIsCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNNVlVwcGVyUmlnaHRNQiwKLSAgICBPTVhWQ01vdGlvblZlY3RvcipwRHN0TVZDdXJNQiwKLSAgICBPTVhfSU5UIGZjb2RlRm9yd2FyZCwKLSAgICBPTVhWQ000UDJNYWNyb2Jsb2NrVHlwZSBNQlR5cGUKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDICAgKDYuMi41LjIuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBvZiBBQyBhbmQgREMgY29lZmZpY2llbnRzIAotICogZm9yIG9uZSBpbnRyYSBibG9jay4gIFR3byB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb24gKERDVkxDIGFuZCBBQ1ZMQykgYXJlIAotICogcHJvdmlkZWQgaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGUgdHdvIGRpZmZlcmVudCBtZXRob2RzIG9mIHByb2Nlc3NpbmcgREMgCi0gKiBjb2VmZmljaWVudHMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjQuMS40LCAgSW50cmEgREMgCi0gKiBDb2VmZmljaWVudCBEZWNvZGluZyBmb3IgdGhlIENhc2Ugb2YgU3dpdGNoZWQgVkxDIEVuY29kaW5nLiAgCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIAotICogICAgICAgICAgICBiaXRzdHJlYW0gYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBjdXJyZW50IGJ5dGUgcmVmZXJlbmNlZCAKLSAqICAgICAgICAgICAgYnkgKnBwQml0U3RyZWFtLiAgVGhlIHBhcmFtZXRlciAqcEJpdE9mZnNldCBpcyB2YWxpZCBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJhbmdlIFswLTddLiAKLSAqICAgICAgICAgICAgQml0IFBvc2l0aW9uIGluIG9uZSBieXRlOiAgfE1vc3QgICAgICBMZWFzdHwgCi0gKiAgICAgICAgICAgICAgICAgICAgKnBCaXRPZmZzZXQgICAgICAgIHwwIDEgMiAzIDQgNSA2IDd8IAotICogICBwcmVkRGlyIC0gQUMgcHJlZGljdGlvbiBkaXJlY3Rpb247IHVzZWQgdG8gc2VsZWN0IHRoZSB6aWd6YWcgc2NhbiAKLSAqICAgICAgICAgICAgcGF0dGVybjsgdGFrZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiAKLSAqICAgICAgICAgICAgLSAgT01YX1ZDX05PTkUgLSBBQyBwcmVkaWN0aW9uIG5vdCB1c2VkOyAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnIHNjYW4uIAotICogICAgICAgICAgICAtICBPTVhfVkNfSE9SSVpPTlRBTCAtIEhvcml6b250YWwgcHJlZGljdGlvbjsgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybXMgYWx0ZXJuYXRlLXZlcnRpY2FsIHppZ3phZyBzY2FuOyAKLSAqICAgICAgICAgICAgLSAgT01YX1ZDX1ZFUlRJQ0FMIC0gVmVydGljYWwgcHJlZGljdGlvbjsgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybXMgYWx0ZXJuYXRlLWhvcml6b250YWwgemlnemFnIHNjYW4uIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKLSAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAotICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlIG9yIGNocm9taW5hbmNlKSBvZiB0aGUgCi0gKiAgICAgICAgICAgIGN1cnJlbnQgYmxvY2sgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQgc3VjaCAKLSAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHN1Y2ggdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgCi0gKiAgICAgICAgICAgIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIAotICogICAgICAgICAgICA0LWJ5dGUgYWxpZ25lZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMsIGlmOgotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcERzdAotICogICAgLSAgICAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddCi0gKiAgICAtICAgIHByZURpciBleGNlZWRzIFswLDJdCi0gKiAgICAtICAgIHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkIAotICogICAgT01YX1N0c19FcnIgLSBpZjoKLSAqICAgIC0gICAgSW4gRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMsIGRjX3NpemUgPiAxMiAKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIG1hcmsgYml0cyBlcXVhbHMgemVybyAKLSAqICAgIC0gICAgSWxsZWdhbCBzdHJlYW0gZW5jb3VudGVyZWQ7IGNvZGUgY2Fubm90IGJlIGxvY2F0ZWQgaW4gVkxDIHRhYmxlIAotICogICAgLSAgICBGb3JiaWRkZW4gY29kZSBlbmNvdW50ZXJlZCBpbiB0aGUgVkxDIEZMQyB0YWJsZS4gCi0gKiAgICAtICAgIFRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGlzIGdyZWF0ZXIgdGhhbiA2NCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMgKAotICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCi0gICAgT01YX1MxNiAqcERzdCwKLSAgICBPTVhfVTggcHJlZERpciwKLSAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCi0gICAgT01YVkNNNFAyVmlkZW9Db21wb25lbnQgdmlkZW9Db21wCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQyAgICg2LjIuNS4yLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gb2YgQUMgYW5kIERDIGNvZWZmaWNpZW50cyAKLSAqIGZvciBvbmUgaW50cmEgYmxvY2suICBUd28gdmVyc2lvbnMgb2YgdGhlIGZ1bmN0aW9uIChEQ1ZMQyBhbmQgQUNWTEMpIGFyZSAKLSAqIHByb3ZpZGVkIGluIG9yZGVyIHRvIHN1cHBvcnQgdGhlIHR3byBkaWZmZXJlbnQgbWV0aG9kcyBvZiBwcm9jZXNzaW5nIERDIAotICogY29lZmZpY2llbnRzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy40LjEuNCwgIEludHJhIERDIAotICogQ29lZmZpY2llbnQgRGVjb2RpbmcgZm9yIHRoZSBDYXNlIG9mIFN3aXRjaGVkIFZMQyBFbmNvZGluZy4gIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSAKLSAqICAgICAgICAgICAgYml0c3RyZWFtIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgY3VycmVudCBieXRlIHJlZmVyZW5jZWQgCi0gKiAgICAgICAgICAgIGJ5ICpwcEJpdFN0cmVhbS4gIFRoZSBwYXJhbWV0ZXIgKnBCaXRPZmZzZXQgaXMgdmFsaWQgaW4gdGhlIAotICogICAgICAgICAgICByYW5nZSBbMC03XS4gQml0IFBvc2l0aW9uIGluIG9uZSBieXRlOiAgfE1vc3QgTGVhc3R8ICpwQml0T2Zmc2V0IAotICogICAgICAgICAgICB8MCAxIDIgMyA0IDUgNiA3fCAKLSAqICAgcHJlZERpciAtIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uOyB1c2VkIHRvIHNlbGVjdCB0aGUgemlnemFnIHNjYW4gCi0gKiAgICAgICAgICAgIHBhdHRlcm47IHRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogT01YX1ZDX05PTkUgLSBBQyAKLSAqICAgICAgICAgICAgcHJlZGljdGlvbiBub3QgdXNlZDsgcGVyZm9ybXMgY2xhc3NpY2FsIHppZ3phZyBzY2FuLiAKLSAqICAgICAgICAgICAgT01YX1ZDX0hPUklaT05UQUwgLSBIb3Jpem9udGFsIHByZWRpY3Rpb247IHBlcmZvcm1zIAotICogICAgICAgICAgICBhbHRlcm5hdGUtdmVydGljYWwgemlnemFnIHNjYW47IE9NWF9WQ19WRVJUSUNBTCAtIFZlcnRpY2FsIAotICogICAgICAgICAgICBwcmVkaWN0aW9uOyBwZXJmb3JtcyBhbHRlcm5hdGUtaG9yaXpvbnRhbCB6aWd6YWcgc2Nhbi4gCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAotICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCi0gKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2Ugb3IgY2hyb21pbmFuY2UpIG9mIHRoZSAKLSAqICAgICAgICAgICAgY3VycmVudCBibG9jayAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCBzdWNoIAotICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc3VjaCB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCAKLSAqICAgICAgICAgICAgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgCi0gKiAgICAgICAgICAgIDQtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cyBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0LCAKLSAqICAgICAgICAgICAgICBvciBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgICAgICAgICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10sIHByZURpciBleGNlZWRzIFswLDJdLCBvciBwRHN0IGlzIAotICogICAgICAgICAgICAgIG5vdCA0LWJ5dGUgYWxpZ25lZCAKLSAqICAgIE9NWF9TdHNfRXJyIEluIERlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLCBkY19zaXplID4gMTIgQXQgbGVhc3Qgb25lIG9mIAotICogICAgICAgICAgICAgIG1hcmsgYml0cyBlcXVhbHMgemVybyBJbGxlZ2FsIHN0cmVhbSBlbmNvdW50ZXJlZDsgY29kZSBjYW5ub3QgCi0gKiAgICAgICAgICAgICAgYmUgbG9jYXRlZCBpbiBWTEMgdGFibGUgRm9yYmlkZGVuIGNvZGUgZW5jb3VudGVyZWQgaW4gdGhlIFZMQyAKLSAqICAgICAgICAgICAgICBGTEMgdGFibGUgVGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgaXMgZ3JlYXRlciB0aGFuIDY0IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQyAoCi0gICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICBPTVhfUzE2ICpwRHN0LAotICAgIE9NWF9VOCBwcmVkRGlyLAotICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyICAgKDYuMi41LjIuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBmb3Igb25lIGludGVyLWNvZGVkIGJsb2NrLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIGRvdWJsZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIHN0cmVhbSBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBuZXh0IGF2YWlsYWJsZSBiaXQgaW4gdGhlIGN1cnJlbnQgc3RyZWFtIAotICogICAgICAgICAgICBieXRlIHJlZmVyZW5jZWQgYnkgKnBwQml0U3RyZWFtLiBUaGUgcGFyYW1ldGVyICpwQml0T2Zmc2V0IGlzIAotICogICAgICAgICAgICB2YWxpZCB3aXRoaW4gdGhlIHJhbmdlIFswLTddLiAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCi0gKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCBzdWNoIAotICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBzdHJlYW0gYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBhZnRlciBkZWNvZGluZyBzdWNoIHRoYXQgaXQgcG9pbnRzIAotICogICAgICAgICAgICB0byB0aGUgbmV4dCBhdmFpbGFibGUgYml0IGluIHRoZSBzdHJlYW0gYnl0ZSByZWZlcmVuY2VkIGJ5IAotICogICAgICAgICAgICAqcHBCaXRTdHJlYW0gCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudCBibG9jazsgbXVzdCBiZSAKLSAqICAgICAgICAgICAgNC1ieXRlIGFsaWduZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcERzdAotICogICAgLSAgICBwRHN0IGlzIG5vdCA0LWJ5dGUgYWxpZ25lZAotICogICAgLSAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10KLSAqICAgIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yLCBpZjoKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG1hcmsgYml0IGlzIGVxdWFsIHRvIHplcm8gCi0gKiAgICAtICAgIEVuY291bnRlcmVkIGFuIGlsbGVnYWwgc3RyZWFtIGNvZGUgdGhhdCBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIFZMQyB0YWJsZSAKLSAqICAgIC0gICAgRW5jb3VudGVyZWQgYW4gaWxsZWdhbCBjb2RlIGluIHRoZSBWTEMgRkxDIHRhYmxlIAotICogICAgLSAgICBUaGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBpcyBncmVhdGVyIHRoYW4gNjQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlciAoCi0gICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICBPTVhfUzE2ICpwRHN0LAotICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JICAgKDYuMi41LjMuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIHRoZSBzZWNvbmQgaW52ZXJzZSBxdWFudGl6YXRpb24gbW9kZSBvbiBhbiBpbnRyYS9pbnRlciBjb2RlZCAKLSAqIGJsb2NrLiBTdXBwb3J0cyBiaXRzX3Blcl9waXhlbCA9IDguIFRoZSBvdXRwdXQgY29lZmZpY2llbnRzIGFyZSBjbGlwcGVkIHRvIAotICogdGhlIHJhbmdlIFstMjA0OCwgMjA0N10uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCAocXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jazsgbXVzdCBiZSAKLSAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICogICBRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKHF1YW50aXplcl9zY2FsZSkgCi0gKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIG9mIHRoZSBjdXJyZW50IGJsb2NrLiBUYWtlcyBvbmUgb2YgdGhlIAotICogICAgICAgICAgICBmb2xsb3dpbmcgZmxhZ3M6IE9NWF9WQ19MVU1JTkFOQ0UsIE9NWF9WQ19DSFJPTUlOQU5DRSAoaW50cmEgCi0gKiAgICAgICAgICAgIHZlcnNpb24gb25seSkuIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXIgCi0gKiAgICAgICAgICAgIChpbnRyYSB2ZXJzaW9uIG9ubHkpLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIG91dHB1dCAoZGVxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIGlzIAotICogICAgICAgICAgICAgIHRydWU6IAotICogICAgLSAgICBwU3JjRHN0IGlzIE5VTEwgCi0gKiAgICAtICAgIFFQIDw9IDAgb3IgUVAgPj0zMSAKLSAqICAgIC0gICAgdmlkZW9Db21wIGlzIG5laXRoZXIgT01YX1ZDX0xVTUlOQU5DRSBub3IgT01YX1ZDX0NIUk9NSU5BTkNFLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JICgKLSAgICBPTVhfUzE2ICpwU3JjRHN0LAotICAgIE9NWF9JTlQgUVAsCi0gICAgT01YVkNNNFAyVmlkZW9Db21wb25lbnQgdmlkZW9Db21wLAotICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JICAgKDYuMi41LjMuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIHRoZSBzZWNvbmQgaW52ZXJzZSBxdWFudGl6YXRpb24gbW9kZSBvbiBhbiBpbnRyYS9pbnRlciBjb2RlZCAKLSAqIGJsb2NrLiBTdXBwb3J0cyBiaXRzX3Blcl9waXhlbCA9IDguIFRoZSBvdXRwdXQgY29lZmZpY2llbnRzIGFyZSBjbGlwcGVkIHRvIAotICogdGhlIHJhbmdlIFstMjA0OCwgMjA0N10uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCAocXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jazsgbXVzdCBiZSAKLSAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICogICBRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKHF1YW50aXplcl9zY2FsZSkgCi0gKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIG9mIHRoZSBjdXJyZW50IGJsb2NrLiBUYWtlcyBvbmUgb2YgdGhlIAotICogICAgICAgICAgICBmb2xsb3dpbmcgZmxhZ3M6IE9NWF9WQ19MVU1JTkFOQ0UsIE9NWF9WQ19DSFJPTUlOQU5DRSAoaW50cmEgCi0gKiAgICAgICAgICAgIHZlcnNpb24gb25seSkuIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXIgCi0gKiAgICAgICAgICAgIChpbnRyYSB2ZXJzaW9uIG9ubHkpLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIG91dHB1dCAoZGVxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIGlzIAotICogICAgICAgICAgICAgIHRydWU6IAotICogICAgLSAgICBwU3JjRHN0IGlzIE5VTEwgCi0gKiAgICAtICAgIFFQIDw9IDAgb3IgUVAgPj0zMSAKLSAqICAgIC0gICAgdmlkZW9Db21wIGlzIG5laXRoZXIgT01YX1ZDX0xVTUlOQU5DRSBub3IgT01YX1ZDX0NIUk9NSU5BTkNFLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JICgKLSAgICBPTVhfUzE2ICpwU3JjRHN0LAotICAgIE9NWF9JTlQgUVAKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYSAgICg2LjIuNS40LjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBEZWNvZGVzIHRoZSBJTlRSQSBibG9jayBjb2VmZmljaWVudHMuIEludmVyc2UgcXVhbnRpemF0aW9uLCBpbnZlcnNlbHkgCi0gKiB6aWd6YWcgcG9zaXRpb25pbmcsIGFuZCBJRENULCB3aXRoIGFwcHJvcHJpYXRlIGNsaXBwaW5nIG9uIGVhY2ggc3RlcCwgYXJlIAotICogcGVyZm9ybWVkIG9uIHRoZSBjb2VmZmljaWVudHMuIFRoZSByZXN1bHRzIGFyZSB0aGVuIHBsYWNlZCBpbiB0aGUgb3V0cHV0IAotICogZnJhbWUvcGxhbmUgb24gYSBwaXhlbCBiYXNpcy4gIE5vdGU6IFRoaXMgZnVuY3Rpb24gd2lsbCBiZSB1c2VkIG9ubHkgd2hlbiAKLSAqIGF0IGxlYXN0IG9uZSBub24temVybyBBQyBjb2VmZmljaWVudCBvZiBjdXJyZW50IGJsb2NrIGV4aXN0cyBpbiB0aGUgYml0IAotICogc3RyZWFtLiBUaGUgREMgb25seSBjb25kaXRpb24gd2lsbCBiZSBoYW5kbGVkIGluIGFub3RoZXIgZnVuY3Rpb24uIAotICoKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IAotICogICAgICAgICAgICBzdHJlYW0gYnVmZmVyLiBUaGVyZSBpcyBubyBib3VuZGFyeSBjaGVjayBmb3IgdGhlIGJpdCBzdHJlYW0gCi0gKiAgICAgICAgICAgIGJ1ZmZlci4gCi0gKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCB0byBieSAKLSAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4gWzAtN10uIAotICogICBzdGVwIC0gd2lkdGggb2YgdGhlIGRlc3RpbmF0aW9uIHBsYW5lIAotICogICBwQ29lZkJ1ZlJvdyAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHJvdyBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCBvbiAKLSAqICAgICAgICAgICAgYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcENvZWZCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgCi0gKiAgICAgICAgICAgIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIGN1clFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgbWFjcm9ibG9jayB3aGljaCB0aGUgY3VycmVudCBibG9jayAKLSAqICAgICAgICAgICAgYmVsb25ncyB0byAKLSAqICAgcFFQQnVmIC0gcG9pbnRlciB0byB0aGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBidWZmZXIgCi0gKiAgIGJsb2NrSW5kZXggLSBibG9jayBpbmRleCBpbmRpY2F0aW5nIHRoZSBjb21wb25lbnQgdHlwZSBhbmQgcG9zaXRpb24gYXMgCi0gKiAgICAgICAgICAgIGRlZmluZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNi4xLjMuOCwgRmlndXJlIDYtNS4gCi0gKiAgIGludHJhRENWTEMgLSBhIGNvZGUgZGV0ZXJtaW5lZCBieSBpbnRyYV9kY192bGNfdGhyIGFuZCBRUC4gVGhpcyBhbGxvd3MgYSAKLSAqICAgICAgICAgICAgbWVjaGFuaXNtIHRvIHN3aXRjaCBiZXR3ZWVuIHR3byBWTEMgZm9yIGNvZGluZyBvZiBJbnRyYSBEQyAKLSAqICAgICAgICAgICAgY29lZmZpY2llbnRzIGFzIHBlciBbSVNPMTQ0OTYtMl0sIFRhYmxlIDYtMjEuIAotICogICBBQ1ByZWRGbGFnIC0gYSBmbGFnIGVxdWFsIHRvIGFjX3ByZWRfZmxhZyAob2YgbHVtaW5hbmNlKSBpbmRpY2F0aW5nIGlmIAotICogICAgICAgICAgICB0aGUgYWMgY29lZmZpY2llbnRzIG9mIHRoZSBmaXJzdCByb3cgb3IgZmlyc3QgY29sdW1uIGFyZSAKLSAqICAgICAgICAgICAgZGlmZmVyZW50aWFsbHkgY29kZWQgZm9yIGludHJhIGNvZGVkIG1hY3JvYmxvY2suIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKLSAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIAotICogICAgICAgICAgICBtb2RlLCBhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQsIHNvIAotICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAotICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGJsb2NrIGluIHRoZSBkZXN0aW5hdGlvbiBwbGFuZTsgbXVzdCBiZSBhbGlnbmVkIG9uIAotICogICAgICAgICAgICBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICBwQ29lZkJ1ZlJvdyAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgcm93IGJ1ZmZlci4gCi0gKiAgIHBDb2VmQnVmQ29sIC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyICBOb3RlOiAKLSAqICAgICAgICAgICAgVGhlIGNvZWZmaWNpZW50IGJ1ZmZlcnMgbXVzdCBiZSB1cGRhdGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgCi0gKiAgICAgICAgICAgIHVwZGF0ZSBwcm9jZWR1cmUgZGVmaW5lZCBpbiBzZWN0aW9uIDYuMi4yLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cywgaWY6Ci0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwQ29lZkJ1ZlJvdywgcENvZWZCdWZDb2wsIAotICogICAgICAgICBwUVBCdWYsIHBEc3QuIAotICogICAgLSAgICAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddIAotICogICAgLSAgICBjdXJRUCBleGNlZWRzICgxLCAzMSkKLSAqICAgIC0gICAgYmxvY2tJbmRleCBleGNlZWRzIFswLDVdCi0gKiAgICAtICAgIHN0ZXAgaXMgbm90IHRoZSBtdWx0aXBsZSBvZiA4Ci0gKiAgICAtICAgIGEgcG9pbnRlciBhbGlnbm1lbnQgcmVxdWlyZW1lbnQgd2FzIHZpb2xhdGVkLiAKLSAqICAgIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yLiBSZWZlciB0byBPTVhfU3RzX0VyciBvZiBEZWNvZGVWTENaaWd6YWdfSW50cmEuICAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhICgKLSAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgIE9NWF9VOCAqcERzdCwKLSAgICBPTVhfSU5UIHN0ZXAsCi0gICAgT01YX1MxNiAqcENvZWZCdWZSb3csCi0gICAgT01YX1MxNiAqcENvZWZCdWZDb2wsCi0gICAgT01YX1U4IGN1clFQLAotICAgIGNvbnN0IE9NWF9VOCAqcFFQQnVmLAotICAgIE9NWF9JTlQgYmxvY2tJbmRleCwKLSAgICBPTVhfSU5UIGludHJhRENWTEMsCi0gICAgT01YX0lOVCBBQ1ByZWRGbGFnLAotICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyICAgKDYuMi41LjQuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIERlY29kZXMgdGhlIElOVEVSIGJsb2NrIGNvZWZmaWNpZW50cy4gVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnZlcnNlIAotICogcXVhbnRpemF0aW9uLCBpbnZlcnNlIHppZ3phZyBwb3NpdGlvbmluZywgYW5kIElEQ1QgKHdpdGggYXBwcm9wcmlhdGUgCi0gKiBjbGlwcGluZyBvbiBlYWNoIHN0ZXApIG9uIHRoZSBjb2VmZmljaWVudHMuIFRoZSByZXN1bHRzIChyZXNpZHVhbHMpIGFyZSAKLSAqIHBsYWNlZCBpbiBhIGNvbnRpZ3VvdXMgYXJyYXkgb2YgNjQgZWxlbWVudHMuIEZvciBJTlRFUiBibG9jaywgdGhlIG91dHB1dCAKLSAqIGJ1ZmZlciBob2xkcyB0aGUgcmVzaWR1YWxzIGZvciBmdXJ0aGVyIHJlY29uc3RydWN0aW9uLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IAotICogICAgICAgICAgICBzdHJlYW0gYnVmZmVyLiBUaGVyZSBpcyBubyBib3VuZGFyeSBjaGVjayBmb3IgdGhlIGJpdCBzdHJlYW0gCi0gKiAgICAgICAgICAgIGJ1ZmZlci4gCi0gKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCB0byBieSAKLSAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4gWzAtN10gCi0gKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCi0gKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyAKLSAqICAgICAgICAgICAgbW9kZSwgYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub24gbGluZWFyIGludHJhIERDIG1vZGUuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkLCBzbyAKLSAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKLSAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZWNvZGVkIHJlc2lkdWFsIGJ1ZmZlciAoYSBjb250aWd1b3VzIGFycmF5IG9mIDY0IAotICogICAgICAgICAgICBlbGVtZW50cyBvZiBPTVhfUzE2IGRhdGEgdHlwZSk7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cywgaWY6Ci0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE51bGw6IAotICogICAgICAgICBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0ICwgcERzdCAKLSAqICAgIC0gICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XQotICogICAgLSAgICBRUCA8PSAwLiAKLSAqICAgIC0gICAgcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkIAotICogICAgT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IuIFJlZmVyIHRvIE9NWF9TdHNfRXJyIG9mIERlY29kZVZMQ1ppZ3phZ19JbnRlciAuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIgKAotICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCi0gICAgT01YX1MxNiAqcERzdCwKLSAgICBPTVhfSU5UIFFQLAotICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhICAgKDYuMi41LjQuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGFkYXB0aXZlIERDL0FDIGNvZWZmaWNpZW50IHByZWRpY3Rpb24gZm9yIGFuIGludHJhIGJsb2NrLiAgUHJpb3IgCi0gKiB0byB0aGUgZnVuY3Rpb24gY2FsbCwgcHJlZGljdGlvbiBkaXJlY3Rpb24gKHByZWREaXIpIHNob3VsZCBiZSBzZWxlY3RlZCBhcyAKLSAqIHNwZWNpZmllZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjQuMy4xLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIHdoaWNoIGNvbnRhaW5zIHRoZSBxdWFudGl6ZWQgCi0gKiAgICAgICAgICAgIGNvZWZmaWNpZW50IHJlc2lkdWFscyAoUFFGKSBvZiB0aGUgY3VycmVudCBibG9jazsgbXVzdCBiZSAKLSAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIFRoZSBvdXRwdXQgY29lZmZpY2llbnRzIGFyZSAKLSAqICAgICAgICAgICAgc2F0dXJhdGVkIHRvIHRoZSByYW5nZSBbLTIwNDgsIDIwNDddLiAKLSAqICAgcFByZWRCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgb24gCi0gKiAgICAgICAgICAgIGEgNC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcFByZWRCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgCi0gKiAgICAgICAgICAgIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgY3VyUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBjdXJyZW50IGJsb2NrLiBjdXJRUCBtYXkgZXF1YWwgdG8gCi0gKiAgICAgICAgICAgIHByZWRRUCBlc3BlY2lhbGx5IHdoZW4gdGhlIGN1cnJlbnQgYmxvY2sgYW5kIHRoZSBwcmVkaWN0b3IgYmxvY2sgCi0gKiAgICAgICAgICAgIGFyZSBpbiB0aGUgc2FtZSBtYWNyb2Jsb2NrLiAKLSAqICAgcHJlZFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgcHJlZGljdG9yIGJsb2NrIAotICogICBwcmVkRGlyIC0gaW5kaWNhdGVzIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbiB3aGljaCB0YWtlcyBvbmUgb2YgdGhlIAotICogICAgICAgICAgICBmb2xsb3dpbmcgdmFsdWVzOiBPTVhfVkNfSE9SSVpPTlRBTCAtIHByZWRpY3QgaG9yaXpvbnRhbGx5IAotICogICAgICAgICAgICBPTVhfVkNfVkVSVElDQUwgLSBwcmVkaWN0IHZlcnRpY2FsbHkgCi0gKiAgIEFDUHJlZEZsYWcgLSBhIGZsYWcgaW5kaWNhdGluZyBpZiBBQyBwcmVkaWN0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWQuIEl0IAotICogICAgICAgICAgICBpcyBlcXVhbCB0byBhY19wcmVkX2ZsYWcgaW4gdGhlIGJpdCBzdHJlYW0gc3ludGF4IG9mIE1QRUctNCAKLSAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSBvciBjaHJvbWluYW5jZSkgb2YgdGhlIAotICogICAgICAgICAgICBjdXJyZW50IGJsb2NrIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIHdoaWNoIGNvbnRhaW5zIHRoZSBxdWFudGl6ZWQgCi0gKiAgICAgICAgICAgIGNvZWZmaWNpZW50cyAoUUYpIG9mIHRoZSBjdXJyZW50IGJsb2NrIAotICogICBwUHJlZEJ1ZlJvdyAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgcm93IGJ1ZmZlciAKLSAqICAgcFByZWRCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIgIE5vdGU6IAotICogICAgICAgICAgICBCdWZmZXIgdXBkYXRlOiBVcGRhdGUgdGhlIEFDIHByZWRpY3Rpb24gYnVmZmVyIChib3RoIHJvdyBhbmQgCi0gKiAgICAgICAgICAgIGNvbHVtbiBidWZmZXIpLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cywgaWY6Ci0gKiAgICAgICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICAgICAgIHBTcmNEc3QsIHBQcmVkQnVmUm93LCBvciBwUHJlZEJ1ZkNvbC4gCi0gKiAgICAgICAgLSAgICBjdXJRUCA8PSAwLCAKLSAqICAgICAgICAtICAgIHByZWRRUCA8PSAwLCAKLSAqICAgICAgICAtICAgIGN1clFQID4zMSwgCi0gKiAgICAgICAgLSAgICBwcmVkUVAgPiAzMSwgCi0gKiAgICAgICAgLSAgICBwcmVEaXIgZXhjZWVkcyBbMSwyXQotICogICAgICAgIC0gICAgcFNyY0RzdCwgcFByZWRCdWZSb3csIG9yIHBQcmVkQnVmQ29sIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYSAoCi0gICAgT01YX1MxNiAqcFNyY0RzdCwKLSAgICBPTVhfUzE2ICpwUHJlZEJ1ZlJvdywKLSAgICBPTVhfUzE2ICpwUHJlZEJ1ZkNvbCwKLSAgICBPTVhfSU5UIGN1clFQLAotICAgIE9NWF9JTlQgcHJlZFFQLAotICAgIE9NWF9JTlQgcHJlZERpciwKLSAgICBPTVhfSU5UIEFDUHJlZEZsYWcsCi0gICAgT01YVkNNNFAyVmlkZW9Db21wb25lbnQgdmlkZW9Db21wCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9NQ1JlY29uQmxvY2sgICAoNi4yLjUuNS4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgbW90aW9uIGNvbXBlbnNhdGlvbiBwcmVkaWN0aW9uIGZvciBhbiA4eDggYmxvY2sgdXNpbmcgCi0gKiBpbnRlcnBvbGF0aW9uIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuMi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIGJsb2NrIGluIHRoZSByZWZlcmVuY2UgcGxhbmUuIAotICogICBzcmNTdGVwIC0gZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnQgb2YgY29uc2VjdXRpdmUgbGluZXMgaW4gdGhlIAotICogICAgICAgICAgICByZWZlcmVuY2UgcGxhbmUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIGRzdFN0ZXAgLSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydCBvZiBjb25zZWN1dGl2ZSBsaW5lcyBpbiB0aGUgCi0gKiAgICAgICAgICAgIGRlc3RpbmF0aW9uIHBsYW5lLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBwU3JjUmVzaWR1ZSAtIHBvaW50ZXIgdG8gYSBidWZmZXIgY29udGFpbmluZyB0aGUgMTYtYml0IHByZWRpY3Rpb24gCi0gKiAgICAgICAgICAgIHJlc2lkdWFsczsgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIElmIHRoZSBwb2ludGVyIGlzIE5VTEwsIHRoZW4gCi0gKiAgICAgICAgICAgIG5vIHByZWRpY3Rpb24gaXMgZG9uZSwgb25seSBtb3Rpb24gY29tcGVuc2F0aW9uLCBpLmUuLCB0aGUgYmxvY2sgCi0gKiAgICAgICAgICAgIGlzIG1vdmVkIHdpdGggaW50ZXJwb2xhdGlvbi4gCi0gKiAgIHByZWRpY3RUeXBlIC0gYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiB0eXBlLCBhcyBkZWZpbmVkIGluIHNlY3Rpb24gCi0gKiAgICAgICAgICAgIDYuMi4xLjIuIAotICogICBybmRWYWwgLSByb3VuZGluZyBjb250cm9sIHBhcmFtZXRlcjogMCAtIGRpc2FibGVkOyAxIC0gZW5hYmxlZC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgOC1ieXRlIGFsaWduZWQuICBJZiAKLSAqICAgICAgICAgICAgcHJlZGljdGlvbiByZXNpZHVhbHMgYXJlIGFkZGVkIHRoZW4gb3V0cHV0IGludGVuc2l0aWVzIGFyZSAKLSAqICAgICAgICAgICAgY2xpcHBlZCB0byB0aGUgcmFuZ2UgWzAsMjU1XS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAotICogICAgLSAgICBwRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIHBTcmNSZXNpZHVlIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMgb3IgcERzdC4gCi0gKiAgICAtICAgIGVpdGhlciBzcmNTdGVwIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgICAtICAgIGludmFsaWQgdHlwZSBzcGVjaWZpZWQgZm9yIHRoZSBwYXJhbWV0ZXIgcHJlZGljdFR5cGUuIAotICogICAgLSAgICB0aGUgcGFyYW1ldGVyIHJuZFZhbCBpcyBub3QgZXF1YWwgZWl0aGVyIHRvIDAgb3IgMS4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX01DUmVjb25CbG9jayAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjLAotICAgIE9NWF9JTlQgc3JjU3RlcCwKLSAgICBjb25zdCBPTVhfUzE2ICpwU3JjUmVzaWR1ZSwKLSAgICBPTVhfVTggKnBEc3QsCi0gICAgT01YX0lOVCBkc3RTdGVwLAotICAgIE9NWF9JTlQgcHJlZGljdFR5cGUsCi0gICAgT01YX0lOVCBybmRWYWwKLSk7Ci0KLQotCi0vKiA2LjMuMS4xIEludHJhIDE2eDE2IFByZWRpY3Rpb24gTW9kZXMgICovCi0vKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgaW50cmFfMTZ4MTYgbWFjcm9ibG9jayBwcmVkaWN0aW9uIG1vZGVzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgT01YX1ZDXzE2WDE2X1ZFUlQgPSAwLCAgLyoqIEludHJhXzE2eDE2X1ZlcnRpY2FsICovCi0gICAgT01YX1ZDXzE2WDE2X0hPUiA9IDEsICAgLyoqIEludHJhXzE2eDE2X0hvcml6b250YWwgKi8KLSAgICBPTVhfVkNfMTZYMTZfREMgPSAyLCAgICAvKiogSW50cmFfMTZ4MTZfREMgKi8KLSAgICBPTVhfVkNfMTZYMTZfUExBTkUgPSAzICAvKiogSW50cmFfMTZ4MTZfUGxhbmUgKi8gCi19IE9NWFZDTTRQMTBJbnRyYTE2eDE2UHJlZE1vZGU7Ci0KLQotCi0vKiA2LjMuMS4yIEludHJhIDR4NCBQcmVkaWN0aW9uIE1vZGVzICAqLwotLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIGludHJhXzR4NCBtYWNyb2Jsb2NrIHByZWRpY3Rpb24gbW9kZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgICBPTVhfVkNfNFg0X1ZFUlQgPSAwLCAgICAgLyoqIEludHJhXzR4NF9WZXJ0aWNhbCAqLwotICAgIE9NWF9WQ180WDRfSE9SID0gMSwgICAgICAvKiogSW50cmFfNHg0X0hvcml6b250YWwgKi8KLSAgICBPTVhfVkNfNFg0X0RDID0gMiwgICAgICAgLyoqIEludHJhXzR4NF9EQyAqLwotICAgIE9NWF9WQ180WDRfRElBR19ETCA9IDMsICAvKiogSW50cmFfNHg0X0RpYWdvbmFsX0Rvd25fTGVmdCAqLwotICAgIE9NWF9WQ180WDRfRElBR19EUiA9IDQsICAvKiogSW50cmFfNHg0X0RpYWdvbmFsX0Rvd25fUmlnaHQgKi8KLSAgICBPTVhfVkNfNFg0X1ZSID0gNSwgICAgICAgLyoqIEludHJhXzR4NF9WZXJ0aWNhbF9SaWdodCAqLwotICAgIE9NWF9WQ180WDRfSEQgPSA2LCAgICAgICAvKiogSW50cmFfNHg0X0hvcml6b250YWxfRG93biAqLwotICAgIE9NWF9WQ180WDRfVkwgPSA3LCAgICAgICAvKiogSW50cmFfNHg0X1ZlcnRpY2FsX0xlZnQgKi8KLSAgICBPTVhfVkNfNFg0X0hVID0gOCAgICAgICAgLyoqIEludHJhXzR4NF9Ib3Jpem9udGFsX1VwICovIAotfSBPTVhWQ000UDEwSW50cmE0eDRQcmVkTW9kZTsKLQotCi0KLS8qIDYuMy4xLjMgQ2hyb21hIFByZWRpY3Rpb24gTW9kZXMgICovCi0vKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgaW50cmEgY2hyb21hIHByZWRpY3Rpb24gbW9kZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgICBPTVhfVkNfQ0hST01BX0RDID0gMCwgICAgLyoqIEludHJhX0Nocm9tYV9EQyAqLwotICAgIE9NWF9WQ19DSFJPTUFfSE9SID0gMSwgICAvKiogSW50cmFfQ2hyb21hX0hvcml6b250YWwgKi8KLSAgICBPTVhfVkNfQ0hST01BX1ZFUlQgPSAyLCAgLyoqIEludHJhX0Nocm9tYV9WZXJ0aWNhbCAqLwotICAgIE9NWF9WQ19DSFJPTUFfUExBTkUgPSAzICAvKiogSW50cmFfQ2hyb21hX1BsYW5lICovIAotfSBPTVhWQ000UDEwSW50cmFDaHJvbWFQcmVkTW9kZTsKLQotCi0KLS8qIDYuMy4xLjQgTW90aW9uIEVzdGltYXRpb24gTW9kZXMgICovCi0vKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgSC4yNjQgbW90aW9uIGVzdGltYXRpb24gbW9kZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgICBPTVhfVkNfTTRQMTBfRkFTVF9TRUFSQ0ggPSAwLCAvKiogRmFzdCBtb3Rpb24gc2VhcmNoICovCi0gICAgT01YX1ZDX000UDEwX0ZVTExfU0VBUkNIID0gMSAgLyoqIEZ1bGwgbW90aW9uIHNlYXJjaCAqLyAKLX0gT01YVkNNNFAxME1FTW9kZTsKLQotCi0KLS8qIDYuMy4xLjUgTWFjcm9ibG9jayBUeXBlcyAgKi8KLS8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBILjI2NCBtYWNyb2Jsb2NrIHR5cGVzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgT01YX1ZDX1BfMTZ4MTYgID0gMCwgLyogZGVmaW5lZCBieSBbSVNPMTQ0OTYtMTBdICovCi0gICAgT01YX1ZDX1BfMTZ4OCAgPSAxLAotICAgIE9NWF9WQ19QXzh4MTYgID0gMiwKLSAgICBPTVhfVkNfUF84eDggID0gMywKLSAgICBPTVhfVkNfUFJFRjBfOHg4ICA9IDQsCi0gICAgT01YX1ZDX0lOVEVSX1NLSVAgID0gNSwKLSAgICBPTVhfVkNfSU5UUkFfNHg0ICA9IDgsCi0gICAgT01YX1ZDX0lOVFJBXzE2eDE2ICA9IDksCi0gICAgT01YX1ZDX0lOVFJBX1BDTSA9IDEwIAotfSBPTVhWQ000UDEwTWFjcm9ibG9ja1R5cGU7Ci0KLQotCi0vKiA2LjMuMS42IFN1Yi1NYWNyb2Jsb2NrIFR5cGVzICAqLwotLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIEguMjY0IHN1Yi1tYWNyb2Jsb2NrIHR5cGVzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgT01YX1ZDX1NVQl9QXzh4OCA9IDAsIC8qIGRlZmluZWQgYnkgW0lTTzE0NDk2LTEwXSAqLwotICAgIE9NWF9WQ19TVUJfUF84eDQgPSAxLAotICAgIE9NWF9WQ19TVUJfUF80eDggPSAyLAotICAgIE9NWF9WQ19TVUJfUF80eDQgPSAzIAotfSBPTVhWQ000UDEwU3ViTWFjcm9ibG9ja1R5cGU7Ci0KLQotCi0vKiA2LjMuMS43IFZhcmlhYmxlIExlbmd0aCBDb2RpbmcgKFZMQykgSW5mb3JtYXRpb24gICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBPTVhfVTggdVRyYWlsaW5nX09uZXM7ICAgICAgLyogVHJhaWxpbmcgb25lczsgMyBhdCBtb3N0ICovCi0gICAgT01YX1U4IHVUcmFpbGluZ19PbmVfU2lnbnM7IC8qIFRyYWlsaW5nIG9uZXMgc2lnbmFsICovCi0gICAgT01YX1U4IHVOdW1Db2VmZnM7ICAgICAgICAgIC8qIFRvdGFsIG51bWJlciBvZiBub24temVybyBjb2VmcywgaW5jbHVkaW5nIHRyYWlsaW5nIG9uZXMgKi8KLSAgICBPTVhfVTggdVRvdGFsWmVyb3M7ICAgICAgICAgLyogVG90YWwgbnVtYmVyIG9mIHplcm8gY29lZnMgKi8KLSAgICBPTVhfUzE2IGlMZXZlbHNbMTZdOyAgICAgICAgLyogTGV2ZWxzIG9mIG5vbi16ZXJvIGNvZWZzLCBpbiByZXZlcnNlIHppZy16YWcgb3JkZXIgKi8KLSAgICBPTVhfVTggdVJ1bnNbMTZdOyAgICAgICAgICAgLyogUnVucyBmb3IgbGV2ZWxzIGFuZCB0cmFpbGluZyBvbmVzLCBpbiByZXZlcnNlIHppZy16YWcgb3JkZXIgKi8KLX0gT01YVkNNNFAxMFZMQ0luZm87Ci0KLQotCi0vKiA2LjMuMS44IE1hY3JvYmxvY2sgSW5mb3JtYXRpb24gICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBPTVhfUzMyIHNsaWNlSWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzbGljZSBudW1iZXIgKi8KLSAgICBPTVhWQ000UDEwTWFjcm9ibG9ja1R5cGUgbWJUeXBlOyAgICAgICAgICAvKiBNQiB0eXBlICovCi0gICAgT01YVkNNNFAxMFN1Yk1hY3JvYmxvY2tUeXBlIHN1Yk1CVHlwZVs0XTsgLyogc3ViLWJsb2NrIHR5cGUgKi8KLSAgICBPTVhfUzMyIHFweTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBxcCBmb3IgbHVtYSAqLwotICAgIE9NWF9TMzIgcXBjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHFwIGZvciBjaHJvbWEgKi8KLSAgICBPTVhfVTMyIGNicHk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDQlAgTHVtYSAqLwotICAgIE9NWF9VMzIgY2JwYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENCUCBDaHJvbWEgKi8KLSAgICBPTVhWQ01vdGlvblZlY3RvciBwTVYwWzRdWzRdOyAvKiBtb3Rpb24gdmVjdG9yLCByZXByZXNlbnRlZCB1c2luZyAxLzQtcGVsIHVuaXRzLCBwTVYwW2Jsb2NreV1bYmxvY2t4XSAoYmxvY2t5ID0gMH4zLCBibG9ja3ggPTB+MykgKi8KLSAgICBPTVhWQ01vdGlvblZlY3RvciBwTVZQcmVkWzRdWzRdOyAvKiBtb3Rpb24gdmVjdG9yIHByZWRpY3Rpb24sIFJlcHJlc2VudGVkIHVzaW5nIDEvNC1wZWwgdW5pdHMsIHBNVlByZWRbYmxvY2t5XVtibG9ja3hdIChibG9ja3kgPSAwfjMsIGJsb2NreCA9IDB+MykgKi8KLSAgICBPTVhfVTggcFJlZkwwSWR4WzRdOyAgICAgICAgICAgICAgICAgICAgICAvKiByZWZlcmVuY2UgcGljdHVyZSBpbmRpY2VzICovCi0gICAgT01YVkNNNFAxMEludHJhMTZ4MTZQcmVkTW9kZSBJbnRyYTE2eDE2UHJlZE1vZGU7IC8qIGJlc3QgaW50cmEgMTZ4MTYgcHJlZGljdGlvbiBtb2RlICovCi0gICAgT01YVkNNNFAxMEludHJhNHg0UHJlZE1vZGUgcEludHJhNHg0UHJlZE1vZGVbMTZdOyAvKiBiZXN0IGludHJhIDR4NCBwcmVkaWN0aW9uIG1vZGUgZm9yIGVhY2ggYmxvY2ssIHBNVjAgaW5kZXhlZCBhcyBhYm92ZSAqLwotfSBPTVhWQ000UDEwTUJJbmZvLCAqT01YVkNNNFAxME1CSW5mb1B0cjsKLQotCi0KLS8qIDYuMy4xLjkgTW90aW9uIEVzdGltYXRpb24gUGFyYW1ldGVycyAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE9NWF9TMzIgYmxvY2tTcGxpdEVuYWJsZTh4ODsgLyogZW5hYmxlcyAxNng4LCA4eDE2LCA4eDggKi8KLSAgICBPTVhfUzMyIGJsb2NrU3BsaXRFbmFibGU0eDQ7IC8qIGVuYWJsZSBzcGxpdHRpbmcgb2YgOHg0LCA0eDgsIDR4NCBibG9ja3MgKi8KLSAgICBPTVhfUzMyIGhhbGZTZWFyY2hFbmFibGU7Ci0gICAgT01YX1MzMiBxdWFydGVyU2VhcmNoRW5hYmxlOwotICAgIE9NWF9TMzIgaW50cmFFbmFibGU0eDQ7ICAgICAgLyogMT1lbmFibGUsIDA9ZGlzYWJsZSAqLwotICAgIE9NWF9TMzIgc2VhcmNoUmFuZ2UxNngxNjsgICAgLyogaW50ZWdlciBwaXhlbCB1bml0cyAqLwotICAgIE9NWF9TMzIgc2VhcmNoUmFuZ2U4eDg7Ci0gICAgT01YX1MzMiBzZWFyY2hSYW5nZTR4NDsKLX0gT01YVkNNNFAxME1FUGFyYW1zOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NCAgICg2LjMuMy4xLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtIEludHJhXzR4NCBwcmVkaWN0aW9uIGZvciBsdW1hIHNhbXBsZXMuIElmIHRoZSB1cHBlci1yaWdodCBibG9jayBpcyAKLSAqIG5vdCBhdmFpbGFibGUsIHRoZW4gZHVwbGljYXRpb24gd29yayBzaG91bGQgYmUgaGFuZGxlZCBpbnNpZGUgdGhlIGZ1bmN0aW9uLiAKLSAqIFVzZXJzIG5lZWQgbm90IGRlZmluZSB0aGVtIG91dHNpZGUuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNMZWZ0IC0gIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiA0IGxlZnQgcGl4ZWxzOiAKLSAqICAgICAgICAgICAgICAgICAgcFt4LCB5XSAoeCA9IC0xLCB5ID0gMC4uMykgCi0gKiAgIHBTcmNBYm92ZSAtIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiA4IGFib3ZlIHBpeGVsczogCi0gKiAgICAgICAgICAgICAgICAgIHBbeCx5XSAoeCA9IDAuLjcsIHkgPS0xKTsgCi0gKiAgICAgICAgICAgICAgIG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBTcmNBYm92ZUxlZnQgLSBQb2ludGVyIHRvIHRoZSBhYm92ZSBsZWZ0IHBpeGVsczogcFt4LHldICh4ID0gLTEsIHkgPSAtMSkgCi0gKiAgIGxlZnRTdGVwIC0gU3RlcCBvZiBsZWZ0IHBpeGVsIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAotICogICBkc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgIHByZWRNb2RlIC0gSW50cmFfNHg0IHByZWRpY3Rpb24gbW9kZS4gCi0gKiAgIGF2YWlsYWJpbGl0eSAtIE5laWdoYm9yaW5nIDR4NCBibG9jayBhdmFpbGFiaWxpdHkgZmxhZywgcmVmZXIgdG8gCi0gKiAgICAgICAgICAgICAiTmVpZ2hib3JpbmcgTWFjcm9ibG9jayBBdmFpbGFiaWxpdHkiIC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCi0gKiAgICBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAotICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKLSAqICAgIHBEc3QgaXMgTlVMTC4gCi0gKiAgICBkc3RTdGVwIDwgNCwgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgIGxlZnRTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQuIAotICogICAgcHJlZE1vZGUgaXMgbm90IGluIHRoZSB2YWxpZCByYW5nZSBvZiBlbnVtZXJhdGlvbiAKLSAqICAgICAgICAgICAgICBPTVhWQ000UDEwSW50cmE0eDRQcmVkTW9kZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X1ZFUlQsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX1VQUEVSIAotICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFt4LC0xXSAoeCA9IDAuLjMpIGlzIG5vdCBhdmFpbGFibGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9IT1IsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX0xFRlQgCi0gKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwWy0xLHldICh5ID0gMC4uMykgaXMgbm90IGF2YWlsYWJsZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X0RJQUdfREwsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCi0gKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSIGluZGljYXRpbmcgcFt4LCAtMV0gKHggPSAwLi4zKSBpcyBub3QgYXZhaWxhYmxlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfRElBR19EUiwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKLSAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVJfTEVGVCBvciBPTVhfVkNfVVBQRVIgb3IgT01YX1ZDX0xFRlQgaW5kaWNhdGluZyAKLSAqICAgICAgICAgICAgICBwW3gsLTFdICh4ID0gMC4uMyksIG9yIHBbLTEseV0gKHkgPSAwLi4zKSBvciBwWy0xLC0xXSBpcyBub3QgCi0gKiAgICAgICAgICAgICAgYXZhaWxhYmxlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfVlIsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCi0gKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSX0xFRlQgb3IgT01YX1ZDX1VQUEVSIG9yIE9NWF9WQ19MRUZUIGluZGljYXRpbmcgCi0gKiAgICAgICAgICAgICAgcFt4LC0xXSAoeCA9IDAuLjMpLCBvciBwWy0xLHldICh5ID0gMC4uMykgb3IgcFstMSwtMV0gaXMgbm90IAotICogICAgICAgICAgICAgIGF2YWlsYWJsZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X0hELCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAotICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUl9MRUZUIG9yIE9NWF9WQ19VUFBFUiBvciBPTVhfVkNfTEVGVCBpbmRpY2F0aW5nIAotICogICAgICAgICAgICAgIHBbeCwtMV0gKHggPSAwLi4zKSwgb3IgcFstMSx5XSAoeSA9IDAuLjMpIG9yIHBbLTEsLTFdIGlzIG5vdCAKLSAqICAgICAgICAgICAgICBhdmFpbGFibGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9WTCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfVVBQRVIgCi0gKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwW3gsLTFdICh4ID0gMC4uMykgaXMgbm90IGF2YWlsYWJsZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X0hVLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19MRUZUIAotICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFstMSx5XSAoeSA9IDAuLjMpIGlzIG5vdCBhdmFpbGFibGUuIAotICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSLCBidXQgcFNyY0Fib3ZlIGlzIE5VTEwuIAotICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX0xFRlQsIGJ1dCBwU3JjTGVmdCBpcyBOVUxMLiAKLSAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUl9MRUZULCBidXQgcFNyY0Fib3ZlTGVmdCBpcyBOVUxMLiAKLSAqICAgIGVpdGhlciBwU3JjQWJvdmUgb3IgcERzdCBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIAotICoKLSAqIE5vdGU6IAotICogICAgIHBTcmNBYm92ZSwgcFNyY0Fib3ZlLCBwU3JjQWJvdmVMZWZ0IG1heSBiZSBpbnZhbGlkIHBvaW50ZXJzIGlmIAotICogICAgIHRoZXkgYXJlIG5vdCB1c2VkIGJ5IGludHJhIHByZWRpY3Rpb24gYXMgaW1wbGllZCBpbiBwcmVkTW9kZS4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNMZWZ0LAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlTGVmdCwKLSAgICBPTVhfVTggKnBEc3QsCi0gICAgT01YX0lOVCBsZWZ0U3RlcCwKLSAgICBPTVhfSU5UIGRzdFN0ZXAsCi0gICAgT01YVkNNNFAxMEludHJhNHg0UHJlZE1vZGUgcHJlZE1vZGUsCi0gICAgT01YX1MzMiBhdmFpbGFiaWxpdHkKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYgICAoNi4zLjMuMS4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybSBJbnRyYV8xNngxNiBwcmVkaWN0aW9uIGZvciBsdW1hIHNhbXBsZXMuIElmIHRoZSB1cHBlci1yaWdodCBibG9jayAKLSAqIGlzIG5vdCBhdmFpbGFibGUsIHRoZW4gZHVwbGljYXRpb24gd29yayBzaG91bGQgYmUgaGFuZGxlZCBpbnNpZGUgdGhlIAotICogZnVuY3Rpb24uIFVzZXJzIG5lZWQgbm90IGRlZmluZSB0aGVtIG91dHNpZGUuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNMZWZ0IC0gUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDE2IGxlZnQgcGl4ZWxzOiBwW3gsIHldICh4ID0gLTEsIHkgPSAKLSAqICAgICAgICAgICAgMC4uMTUpIAotICogICBwU3JjQWJvdmUgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgMTYgYWJvdmUgcGl4ZWxzOiBwW3gseV0gKHggPSAwLi4xNSwgCi0gKiAgICAgICAgICAgIHk9IC0xKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBTcmNBYm92ZUxlZnQgLSBQb2ludGVyIHRvIHRoZSBhYm92ZSBsZWZ0IHBpeGVsczogcFt4LHldICh4ID0gLTEsIHkgPSAtMSkgCi0gKiAgIGxlZnRTdGVwIC0gU3RlcCBvZiBsZWZ0IHBpeGVsIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgZHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgcHJlZE1vZGUgLSBJbnRyYV8xNngxNiBwcmVkaWN0aW9uIG1vZGUsIHBsZWFzZSByZWZlciB0byBzZWN0aW9uIDMuNC4xLiAKLSAqICAgYXZhaWxhYmlsaXR5IC0gTmVpZ2hib3JpbmcgMTZ4MTYgTUIgYXZhaWxhYmlsaXR5IGZsYWcuIFJlZmVyIHRvIAotICogICAgICAgICAgICAgICAgICBzZWN0aW9uIDMuNC40LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKLSAqICAgIElmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCi0gKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAotICogICAgcERzdCBpcyBOVUxMLiAKLSAqICAgIGRzdFN0ZXAgPCAxNi4gb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgICBsZWZ0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgICBwcmVkTW9kZSBpcyBub3QgaW4gdGhlIHZhbGlkIHJhbmdlIG9mIGVudW1lcmF0aW9uIAotICogICAgICAgICAgICAgIE9NWFZDTTRQMTBJbnRyYTE2eDE2UHJlZE1vZGUgCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfMTZYMTZfVkVSVCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKLSAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVIgaW5kaWNhdGluZyBwW3gsLTFdICh4ID0gMC4uMTUpIGlzIG5vdCBhdmFpbGFibGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzE2WDE2X0hPUiwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfTEVGVCAKLSAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbLTEseV0gKHkgPSAwLi4xNSkgaXMgbm90IGF2YWlsYWJsZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfMTZYMTZfUExBTkUsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCi0gKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSX0xFRlQgb3IgT01YX1ZDX1VQUEVSIG9yIE9NWF9WQ19MRUZUIGluZGljYXRpbmcgCi0gKiAgICAgICAgICAgICAgcFt4LC0xXSh4ID0gMC4uMTUpLCBvciBwWy0xLHldICh5ID0gMC4uMTUpLCBvciBwWy0xLC0xXSBpcyBub3QgCi0gKiAgICAgICAgICAgICAgYXZhaWxhYmxlLiAKLSAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUiwgYnV0IHBTcmNBYm92ZSBpcyBOVUxMLiAKLSAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19MRUZULCBidXQgcFNyY0xlZnQgaXMgTlVMTC4gCi0gKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVJfTEVGVCwgYnV0IHBTcmNBYm92ZUxlZnQgaXMgTlVMTC4gCi0gKiAgICBlaXRoZXIgcFNyY0Fib3ZlIG9yIHBEc3QgaXMgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgCi0gKgotICogTm90ZTogCi0gKiAgICAgcFNyY0Fib3ZlLCBwU3JjQWJvdmUsIHBTcmNBYm92ZUxlZnQgbWF5IGJlIGludmFsaWQgcG9pbnRlcnMgaWYgCi0gKiAgICAgdGhleSBhcmUgbm90IHVzZWQgYnkgaW50cmEgcHJlZGljdGlvbiBpbXBsaWVkIGluIHByZWRNb2RlLiAKLSAqIE5vdGU6IAotICogICAgIE9NWF9WQ19VUFBFUl9SSUdIVCBpcyBub3QgdXNlZCBpbiBpbnRyYV8xNngxNiBsdW1hIHByZWRpY3Rpb24uIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNMZWZ0LAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlTGVmdCwKLSAgICBPTVhfVTggKnBEc3QsCi0gICAgT01YX0lOVCBsZWZ0U3RlcCwKLSAgICBPTVhfSU5UIGRzdFN0ZXAsCi0gICAgT01YVkNNNFAxMEludHJhMTZ4MTZQcmVkTW9kZSBwcmVkTW9kZSwKLSAgICBPTVhfUzMyIGF2YWlsYWJpbGl0eQotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDggICAoNi4zLjMuMS4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgaW50cmEgcHJlZGljdGlvbiBmb3IgY2hyb21hIHNhbXBsZXMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNMZWZ0IC0gUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDggbGVmdCBwaXhlbHM6IHBbeCwgeV0gKHggPSAtMSwgeT0gCi0gKiAgICAgICAgICAgIDAuLjcpLiAKLSAqICAgcFNyY0Fib3ZlIC0gUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDggYWJvdmUgcGl4ZWxzOiBwW3gseV0gKHggPSAwLi43LCB5IAotICogICAgICAgICAgICA9IC0xKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBTcmNBYm92ZUxlZnQgLSBQb2ludGVyIHRvIHRoZSBhYm92ZSBsZWZ0IHBpeGVsczogcFt4LHldICh4ID0gLTEsIHkgPSAtMSkgCi0gKiAgIGxlZnRTdGVwIC0gU3RlcCBvZiBsZWZ0IHBpeGVsIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBkc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIHByZWRNb2RlIC0gSW50cmEgY2hyb21hIHByZWRpY3Rpb24gbW9kZSwgcGxlYXNlIHJlZmVyIHRvIHNlY3Rpb24gMy40LjMuIAotICogICBhdmFpbGFiaWxpdHkgLSBOZWlnaGJvcmluZyBjaHJvbWEgYmxvY2sgYXZhaWxhYmlsaXR5IGZsYWcsIHBsZWFzZSByZWZlciAKLSAqICAgICAgICAgICAgdG8gICJOZWlnaGJvcmluZyBNYWNyb2Jsb2NrIEF2YWlsYWJpbGl0eSIuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKLSAqICAgIElmIGFueSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCi0gKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAotICogICAgcERzdCBpcyBOVUxMLiAKLSAqICAgIGRzdFN0ZXAgPCA4IG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgICBsZWZ0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgIHByZWRNb2RlIGlzIG5vdCBpbiB0aGUgdmFsaWQgcmFuZ2Ugb2YgZW51bWVyYXRpb24gCi0gKiAgICAgICAgICAgICAgT01YVkNNNFAxMEludHJhQ2hyb21hUHJlZE1vZGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDX0NIUk9NQV9WRVJULCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAotICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUiBpbmRpY2F0aW5nIHBbeCwtMV0gKHggPSAwLi43KSBpcyBub3QgYXZhaWxhYmxlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ19DSFJPTUFfSE9SLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19MRUZUIAotICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFstMSx5XSAoeSA9IDAuLjcpIGlzIG5vdCBhdmFpbGFibGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDX0NIUk9NQV9QTEFORSwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKLSAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVJfTEVGVCBvciBPTVhfVkNfVVBQRVIgb3IgT01YX1ZDX0xFRlQgaW5kaWNhdGluZyAKLSAqICAgICAgICAgICAgICBwW3gsLTFdKHggPSAwLi43KSwgb3IgcFstMSx5XSAoeSA9IDAuLjcpLCBvciBwWy0xLC0xXSBpcyBub3QgCi0gKiAgICAgICAgICAgICAgYXZhaWxhYmxlLiAKLSAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUiwgYnV0IHBTcmNBYm92ZSBpcyBOVUxMLiAKLSAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19MRUZULCBidXQgcFNyY0xlZnQgaXMgTlVMTC4gCi0gKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVJfTEVGVCwgYnV0IHBTcmNBYm92ZUxlZnQgaXMgTlVMTC4gCi0gKiAgICBlaXRoZXIgcFNyY0Fib3ZlIG9yIHBEc3QgaXMgbm90IGFsaWduZWQgb24gYSA4LWJ5dGUgYm91bmRhcnkuICAKLSAqCi0gKiAgTm90ZTogcFNyY0Fib3ZlLCBwU3JjQWJvdmUsIHBTcmNBYm92ZUxlZnQgbWF5IGJlIGludmFsaWQgcG9pbnRlciBpZiAKLSAqICB0aGV5IGFyZSBub3QgdXNlZCBieSBpbnRyYSBwcmVkaWN0aW9uIGltcGxpZWQgaW4gcHJlZE1vZGUuIAotICoKLSAqICBOb3RlOiBPTVhfVkNfVVBQRVJfUklHSFQgaXMgbm90IHVzZWQgaW4gaW50cmEgY2hyb21hIHByZWRpY3Rpb24uIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjTGVmdCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZSwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZUxlZnQsCi0gICAgT01YX1U4ICpwRHN0LAotICAgIE9NWF9JTlQgbGVmdFN0ZXAsCi0gICAgT01YX0lOVCBkc3RTdGVwLAotICAgIE9NWFZDTTRQMTBJbnRyYUNocm9tYVByZWRNb2RlIHByZWRNb2RlLAotICAgIE9NWF9TMzIgYXZhaWxhYmlsaXR5Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hICAgKDYuMy4zLjIuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIHF1YXJ0ZXItcGl4ZWwgaW50ZXJwb2xhdGlvbiBmb3IgaW50ZXIgbHVtYSBNQi4gSXQgaXMgYXNzdW1lZCB0aGF0IAotICogdGhlIGZyYW1lIGlzIGFscmVhZHkgcGFkZGVkIHdoZW4gY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgc291cmNlIHJlZmVyZW5jZSBmcmFtZSBidWZmZXIgCi0gKiAgIHNyY1N0ZXAgLSByZWZlcmVuY2UgZnJhbWUgc3RlcCwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiByb2kud2lkdGggCi0gKiAgIGRzdFN0ZXAgLSBkZXN0aW5hdGlvbiBmcmFtZSBzdGVwLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIAotICogICAgICAgICAgICByb2kud2lkdGggCi0gKiAgIGR4IC0gRnJhY3Rpb25hbCBwYXJ0IG9mIGhvcml6b250YWwgbW90aW9uIHZlY3RvciBjb21wb25lbnQgaW4gMS80IHBpeGVsIAotICogICAgICAgICAgICB1bml0OyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsM10gCi0gKiAgIGR5IC0gRnJhY3Rpb25hbCBwYXJ0IG9mIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgeSBjb21wb25lbnQgaW4gMS80IHBpeGVsIAotICogICAgICAgICAgICB1bml0OyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsM10gCi0gKiAgIHJvaSAtIERpbWVuc2lvbiBvZiB0aGUgaW50ZXJwb2xhdGlvbiByZWdpb247IHRoZSBwYXJhbWV0ZXJzIHJvaS53aWR0aCBhbmQgCi0gKiAgICAgICAgICAgIHJvaS5oZWlnaHQgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gZnJhbWUgYnVmZmVyOiAKLSAqICAgICAgICAgIGlmIHJvaS53aWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCi0gKiAgICAgICAgICBpZiByb2kud2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAotICogICAgICAgICAgaWYgcm9pLndpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKLSAqICAgIElmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCi0gKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAotICogICAgcFNyYyBvciBwRHN0IGlzIE5VTEwuIAotICogICAgc3JjU3RlcCBvciBkc3RTdGVwIDwgcm9pLndpZHRoLiAKLSAqICAgIGR4IG9yIGR5IGlzIG91dCBvZiByYW5nZSBbMCwzXS4gCi0gKiAgICByb2kud2lkdGggb3Igcm9pLmhlaWdodCBpcyBvdXQgb2YgcmFuZ2UgezQsIDgsIDE2fS4gCi0gKiAgICByb2kud2lkdGggaXMgZXF1YWwgdG8gNCwgYnV0IHBEc3QgaXMgbm90IDQgYnl0ZSBhbGlnbmVkLiAKLSAqICAgIHJvaS53aWR0aCBpcyBlcXVhbCB0byA4IG9yIDE2LCBidXQgcERzdCBpcyBub3QgOCBieXRlIGFsaWduZWQuIAotICogICAgc3JjU3RlcCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmMsCi0gICAgT01YX1MzMiBzcmNTdGVwLAotICAgIE9NWF9VOCAqcERzdCwKLSAgICBPTVhfUzMyIGRzdFN0ZXAsCi0gICAgT01YX1MzMiBkeCwKLSAgICBPTVhfUzMyIGR5LAotICAgIE9NWFNpemUgcm9pCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEgICAoNi4zLjMuMi4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgMS84LXBpeGVsIGludGVycG9sYXRpb24gZm9yIGludGVyIGNocm9tYSBNQi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtUG9pbnRlciB0byB0aGUgc291cmNlIHJlZmVyZW5jZSBmcmFtZSBidWZmZXIgCi0gKiAgIHNyY1N0ZXAgLVJlZmVyZW5jZSBmcmFtZSBzdGVwIGluIGJ5dGVzIAotICogICBkc3RTdGVwIC1EZXN0aW5hdGlvbiBmcmFtZSBzdGVwIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgCi0gKiAgICAgICAgICAgIHJvaS53aWR0aC4gCi0gKiAgIGR4IC1GcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIGNvbXBvbmVudCBpbiAxLzggcGl4ZWwgCi0gKiAgICAgICAgICAgIHVuaXQ7IHZhbGlkIGluIHRoZSByYW5nZSBbMCw3XSAKLSAqICAgZHkgLUZyYWN0aW9uYWwgcGFydCBvZiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIGNvbXBvbmVudCBpbiAxLzggcGl4ZWwgCi0gKiAgICAgICAgICAgIHVuaXQ7IHZhbGlkIGluIHRoZSByYW5nZSBbMCw3XSAKLSAqICAgcm9pIC1EaW1lbnNpb24gb2YgdGhlIGludGVycG9sYXRpb24gcmVnaW9uOyB0aGUgcGFyYW1ldGVycyByb2kud2lkdGggYW5kIAotICogICAgICAgICAgICByb2kuaGVpZ2h0IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDIsIDQsIG9yIDguIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC1Qb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBmcmFtZSBidWZmZXI6Ci0gKiAgICAgICAgIGlmIHJvaS53aWR0aD09MiwgIDItYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCi0gKiAgICAgICAgIGlmIHJvaS53aWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCi0gKiAgICAgICAgIGlmIHJvaS53aWR0aD09OCwgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAotICogICAgSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKLSAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCi0gKiAgICBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCi0gKiAgICBzcmNTdGVwIG9yIGRzdFN0ZXAgPCA4LiAKLSAqICAgIGR4IG9yIGR5IGlzIG91dCBvZiByYW5nZSBbMC03XS4gCi0gKiAgICByb2kud2lkdGggb3Igcm9pLmhlaWdodCBpcyBvdXQgb2YgcmFuZ2UgezIsNCw4fS4gCi0gKiAgICByb2kud2lkdGggaXMgZXF1YWwgdG8gMiwgYnV0IHBEc3QgaXMgbm90IDItYnl0ZSBhbGlnbmVkLiAKLSAqICAgIHJvaS53aWR0aCBpcyBlcXVhbCB0byA0LCBidXQgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAotICogICAgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDgsIGJ1dCBwRHN0IGlzIG5vdCA4IGJ5dGUgYWxpZ25lZC4gCi0gKiAgICBzcmNTdGVwIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYSAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjLAotICAgIE9NWF9TMzIgc3JjU3RlcCwKLSAgICBPTVhfVTggKnBEc3QsCi0gICAgT01YX1MzMiBkc3RTdGVwLAotICAgIE9NWF9TMzIgZHgsCi0gICAgT01YX1MzMiBkeSwKLSAgICBPTVhTaXplIHJvaQotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSSAgICg2LjMuMy4zLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NrIGZpbHRlcmluZyBvbiBmb3VyIHZlcnRpY2FsIGVkZ2VzIG9mIHRoZSBsdW1hIAotICogbWFjcm9ibG9jayAoMTZ4MTYpLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIAotICogICBzcmNkc3RTdGVwIC1TdGVwIG9mIHRoZSBhcnJheXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgIHBBbHBoYSAtQXJyYXkgb2Ygc2l6ZSAyIG9mIGFscGhhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBhbHBoYSAKLSAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgYW5kIHRoZSBzZWNvbmQgaXRlbSBpcyAKLSAqICAgICAgICAgICAgZm9yIHRoZSBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlKTsgcGVyIFtJU08xNDQ5Ni0xMF0gYWxwaGEgdmFsdWVzIAotICogICAgICAgICAgICBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNTVdLiAKLSAqICAgcEJldGEgLUFycmF5IG9mIHNpemUgMiBvZiBiZXRhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBiZXRhIAotICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIAotICogICAgICAgICAgICBmb3IgdGhlIGludGVybmFsIHZlcnRpY2FsIGVkZ2UpOyBwZXIgW0lTTzE0NDk2LTEwXSBiZXRhIHZhbHVlcyAKLSAqICAgICAgICAgICAgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMThdLiAKLSAqICAgcFRocmVzaG9sZHMgLUFycmF5IG9mIHNpemUgMTYgb2YgVGhyZXNob2xkcyAoVEMwKSAodmFsdWVzIGZvciB0aGUgbGVmdCAKLSAqICAgICAgICAgICAgZWRnZSBvZiBlYWNoIDR4NCBibG9jaywgYXJyYW5nZWQgaW4gdmVydGljYWwgYmxvY2sgb3JkZXIpOyBtdXN0IAotICogICAgICAgICAgICBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5Li4gIFBlciBbSVNPMTQ0OTYtMTBdIHZhbHVlcyBtdXN0IAotICogICAgICAgICAgICBiZSBpbiB0aGUgcmFuZ2UgWzAsMjVdLiAKLSAqICAgcEJTIC1BcnJheSBvZiBzaXplIDE2IG9mIEJTIHBhcmFtZXRlcnMgKGFycmFuZ2VkIGluIHZlcnRpY2FsIGJsb2NrIAotICogICAgICAgICAgICBvcmRlcik7IHZhbGlkIGluIHRoZSByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIAotICogICAgICAgICAgICBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjNdPT0gNC4gIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC1Qb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAotICogICAgSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKLSAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCi0gKiAgICBFaXRoZXIgb2YgdGhlIHBvaW50ZXJzIGluIHBTcmNEc3QsIHBBbHBoYSwgcEJldGEsIHBUaHJlc2hvbGRzLCBvciBwQlMgCi0gKiAgICAgICAgICAgICAgaXMgTlVMTC4gCi0gKiAgICBFaXRoZXIgcFRocmVzaG9sZHMgb3IgcEJTIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgIHBTcmNEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgIHBBbHBoYVswXSBhbmQvb3IgcEFscGhhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDI1NV0uIAotICogICAgcEJldGFbMF0gYW5kL29yIHBCZXRhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDE4XS4gCi0gKiAgICBPbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwVGhyZXNob2xkc1swLi4xNV1pcyBvdXRzaWRlIG9mIHRoZSAKLSAqICAgICAgICAgICAgICByYW5nZSBbMCwyNV0uIAotICogICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgICAgICAgICAgICBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCBmb3IgaT49NCwgb3IgKHBCU1tpXT09NCAmJiAKLSAqICAgICAgICAgICAgICBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JICgKLSAgICBPTVhfVTggKnBTcmNEc3QsCi0gICAgT01YX1MzMiBzcmNkc3RTdGVwLAotICAgIGNvbnN0IE9NWF9VOCAqcEFscGhhLAotICAgIGNvbnN0IE9NWF9VOCAqcEJldGEsCi0gICAgY29uc3QgT01YX1U4ICpwVGhyZXNob2xkcywKLSAgICBjb25zdCBPTVhfVTggKnBCUwotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSSAgICg2LjMuMy4zLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NrIGZpbHRlcmluZyBvbiBmb3VyIGhvcml6b250YWwgZWRnZXMgb2YgdGhlIGx1bWEgCi0gKiBtYWNyb2Jsb2NrICgxNngxNikuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gCi0gKiAgIHNyY2RzdFN0ZXAgLSBzdGVwIG9mIHRoZSBhcnJheXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgIHBBbHBoYSAtIGFycmF5IG9mIHNpemUgMiBvZiBhbHBoYSB0aHJlc2hvbGRzICh0aGUgZmlyc3QgaXRlbSBpcyB0aGUgYWxwaGEgCi0gKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gaXMgCi0gKiAgICAgICAgICAgIGZvciB0aGUgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlKTsgcGVyIFtJU08xNDQ5Ni0xMF0gYWxwaGEgCi0gKiAgICAgICAgICAgIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNTVdLiAKLSAqICAgcEJldGEgLSBhcnJheSBvZiBzaXplIDIgb2YgYmV0YSB0aHJlc2hvbGRzICh0aGUgZmlyc3QgaXRlbSBpcyB0aGUgYmV0YSAKLSAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIAotICogICAgICAgICAgICBpcyBmb3IgdGhlIGludGVybmFsIGhvcml6b250YWwgZWRnZSkuIFBlciBbSVNPMTQ0OTYtMTBdIGJldGEgCi0gKiAgICAgICAgICAgIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAotICogICBwVGhyZXNob2xkcyAtIGFycmF5IG9mIHNpemUgMTYgY29udGFpbmluZyB0aHJlc2hvbGRzLCBUQzAsIGZvciB0aGUgdG9wIAotICogICAgICAgICAgICBob3Jpem9udGFsIGVkZ2Ugb2YgZWFjaCA0eDQgYmxvY2ssIGFycmFuZ2VkIGluIGhvcml6b250YWwgYmxvY2sgCi0gKiAgICAgICAgICAgIG9yZGVyOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBQZXIgW0lTTzE0NDk2IDEwXSAKLSAqICAgICAgICAgICAgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCi0gKiAgIHBCUyAtIGFycmF5IG9mIHNpemUgMTYgb2YgQlMgcGFyYW1ldGVycyAoYXJyYW5nZWQgaW4gaG9yaXpvbnRhbCBibG9jayAKLSAqICAgICAgICAgICAgb3JkZXIpOyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSAKLSAqICAgICAgICAgICAgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4zXT09IDQuICBNdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtUG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciwgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjRHN0LCBwQWxwaGEsIAotICogICAgICAgICAgICAgIHBCZXRhLCBwVGhyZXNob2xkcywgb3IgcEJTLiAKLSAqICAgIC0gICAgZWl0aGVyIHBUaHJlc2hvbGRzIG9yIHBCUyBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gCi0gKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAotICogICAgLSAgICBwQWxwaGFbMF0gYW5kL29yIHBBbHBoYVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwyNTVdLiAKLSAqICAgIC0gICAgcEJldGFbMF0gYW5kL29yIHBCZXRhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDE4XS4gCi0gKiAgICAtICAgIE9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjE1XSBpcyAKLSAqICAgICAgICAgb3V0c2lkZSBvZiB0aGUgcmFuZ2UgWzAsMjVdLiAKLSAqICAgIC0gICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgICAgICAgICAgICBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCBmb3IgaT49NCwgb3IgCi0gKiAgICAgICAgICAgICAgKHBCU1tpXT09NCAmJiBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JICgKLSAgICBPTVhfVTggKnBTcmNEc3QsCi0gICAgT01YX1MzMiBzcmNkc3RTdGVwLAotICAgIGNvbnN0IE9NWF9VOCAqcEFscGhhLAotICAgIGNvbnN0IE9NWF9VOCAqcEJldGEsCi0gICAgY29uc3QgT01YX1U4ICpwVGhyZXNob2xkcywKLSAgICBjb25zdCBPTVhfVTggKnBCUwotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JICAgKDYuMy4zLjMuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2sgZmlsdGVyaW5nIG9uIGZvdXIgdmVydGljYWwgZWRnZXMgb2YgdGhlIGNocm9tYSAKLSAqIG1hY3JvYmxvY2sgKDh4OCkuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBQb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgc3JjZHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGFycmF5czsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBwQWxwaGEgLSBBcnJheSBvZiBzaXplIDIgb2YgYWxwaGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgYWxwaGEgCi0gKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgYW5kIHRoZSBzZWNvbmQgaXRlbSBpcyBmb3IgCi0gKiAgICAgICAgICAgIGludGVybmFsIHZlcnRpY2FsIGVkZ2UpOyBwZXIgW0lTTzE0NDk2LTEwXSBhbHBoYSB2YWx1ZXMgbXVzdCBiZSAKLSAqICAgICAgICAgICAgaW4gdGhlIHJhbmdlIFswLDI1NV0uIAotICogICBwQmV0YSAtIEFycmF5IG9mIHNpemUgMiBvZiBiZXRhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBiZXRhIAotICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIAotICogICAgICAgICAgICBmb3IgdGhlIGludGVybmFsIHZlcnRpY2FsIGVkZ2UpOyBwZXIgW0lTTzE0NDk2LTEwXSBiZXRhIHZhbHVlcyAKLSAqICAgICAgICAgICAgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMThdLiAKLSAqICAgcFRocmVzaG9sZHMgLSBBcnJheSBvZiBzaXplIDggY29udGFpbmluZyB0aHJlc2hvbGRzLCBUQzAsIGZvciB0aGUgbGVmdCAKLSAqICAgICAgICAgICAgdmVydGljYWwgZWRnZSBvZiBlYWNoIDR4MiBjaHJvbWEgYmxvY2ssIGFycmFuZ2VkIGluIHZlcnRpY2FsIAotICogICAgICAgICAgICBibG9jayBvcmRlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgUGVyIAotICogICAgICAgICAgICBbSVNPMTQ0OTYtMTBdIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNV0uIAotICogICBwQlMgLSBBcnJheSBvZiBzaXplIDE2IG9mIEJTIHBhcmFtZXRlcnMgKHZhbHVlcyBmb3IgZWFjaCAyeDIgY2hyb21hIAotICogICAgICAgICAgICBibG9jaywgYXJyYW5nZWQgaW4gdmVydGljYWwgYmxvY2sgb3JkZXIpLiBUaGlzIHBhcmFtZXRlciBpcyB0aGUgCi0gKiAgICAgICAgICAgIHNhbWUgYXMgdGhlIHBCUyBwYXJhbWV0ZXIgcGFzc2VkIGludG8gRmlsdGVyRGVibG9ja0x1bWFfVmVyRWRnZTsgCi0gKiAgICAgICAgICAgIHZhbGlkIGluIHRoZSByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOiBpKSAKLSAqICAgICAgICAgICAgcEJTW2ldPT0gNCBtYXkgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIHBCU1tpXT09IDQgaWYgYW5kIAotICogICAgICAgICAgICBvbmx5IGlmIHBCU1tpXjNdPT0gNC4gIE11c3QgYmUgNCBieXRlIGFsaWduZWQuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC1Qb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjRHN0LCBwQWxwaGEsIAotICogICAgICAgICAgICAgIHBCZXRhLCBwVGhyZXNob2xkcywgb3IgcEJTLiAKLSAqICAgIC0gICAgcFNyY0RzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICogICAgLSAgICBwVGhyZXNob2xkcyBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBwQWxwaGFbMF0gYW5kL29yIHBBbHBoYVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwyNTVdLiAKLSAqICAgIC0gICAgcEJldGFbMF0gYW5kL29yIHBCZXRhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDE4XS4gCi0gKiAgICAtICAgIE9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjddIGlzIG91dHNpZGUgCi0gKiAgICAgICAgIG9mIHRoZSByYW5nZSBbMCwyNV0uIAotICogICAgLSAgICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgICAgICBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCBmb3IgaT49NCwgb3IgCi0gKiAgICAgICAgIChwQlNbaV09PTQgJiYgcEJTW2leM10hPTQpIGZvciAwPD1pPD0zLiAKLSAqICAgIC0gICAgcEJTIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSSAoCi0gICAgT01YX1U4ICpwU3JjRHN0LAotICAgIE9NWF9TMzIgc3JjZHN0U3RlcCwKLSAgICBjb25zdCBPTVhfVTggKnBBbHBoYSwKLSAgICBjb25zdCBPTVhfVTggKnBCZXRhLAotICAgIGNvbnN0IE9NWF9VOCAqcFRocmVzaG9sZHMsCi0gICAgY29uc3QgT01YX1U4ICpwQlMKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSSAgICg2LjMuMy4zLjQpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NrIGZpbHRlcmluZyBvbiB0aGUgaG9yaXpvbnRhbCBlZGdlcyBvZiB0aGUgY2hyb21hIAotICogbWFjcm9ibG9jayAoOHg4KS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgOC1ieXRlIGFsaWduZWQuIAotICogICBzcmNkc3RTdGVwIC0gYXJyYXkgc3RlcDsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBwQWxwaGEgLSBhcnJheSBvZiBzaXplIDIgY29udGFpbmluZyBhbHBoYSB0aHJlc2hvbGRzOyB0aGUgZmlyc3QgZWxlbWVudCAKLSAqICAgICAgICAgICAgY29udGFpbnMgdGhlIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIGhvcml6b250YWwgZWRnZSwgYW5kIHRoZSAKLSAqICAgICAgICAgICAgc2Vjb25kIGVsZW1lbnQgY29udGFpbnMgdGhlIHRocmVzaG9sZCBmb3IgaW50ZXJuYWwgaG9yaXpvbnRhbCAKLSAqICAgICAgICAgICAgZWRnZS4gIFBlciBbSVNPMTQ0OTYtMTBdIGFscGhhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSAKLSAqICAgICAgICAgICAgWzAsMjU1XS4gCi0gKiAgIHBCZXRhIC0gYXJyYXkgb2Ygc2l6ZSAyIGNvbnRhaW5pbmcgYmV0YSB0aHJlc2hvbGRzOyB0aGUgZmlyc3QgZWxlbWVudCAKLSAqICAgICAgICAgICAgY29udGFpbnMgdGhlIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIGhvcml6b250YWwgZWRnZSwgYW5kIHRoZSAKLSAqICAgICAgICAgICAgc2Vjb25kIGVsZW1lbnQgY29udGFpbnMgdGhlIHRocmVzaG9sZCBmb3IgdGhlIGludGVybmFsIAotICogICAgICAgICAgICBob3Jpem9udGFsIGVkZ2UuICBQZXIgW0lTTzE0NDk2LTEwXSBiZXRhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSAKLSAqICAgICAgICAgICAgcmFuZ2UgWzAsMThdLiAKLSAqICAgcFRocmVzaG9sZHMgLSBhcnJheSBvZiBzaXplIDggY29udGFpbmluZyB0aHJlc2hvbGRzLCBUQzAsIGZvciB0aGUgdG9wIAotICogICAgICAgICAgICBob3Jpem9udGFsIGVkZ2Ugb2YgZWFjaCAyeDQgY2hyb21hIGJsb2NrLCBhcnJhbmdlZCBpbiBob3Jpem9udGFsIAotICogICAgICAgICAgICBibG9jayBvcmRlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgUGVyIAotICogICAgICAgICAgICBbSVNPMTQ0OTYtMTBdIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNV0uIAotICogICBwQlMgLSBhcnJheSBvZiBzaXplIDE2IGNvbnRhaW5pbmcgQlMgcGFyYW1ldGVycyBmb3IgZWFjaCAyeDIgY2hyb21hIAotICogICAgICAgICAgICBibG9jaywgYXJyYW5nZWQgaW4gaG9yaXpvbnRhbCBibG9jayBvcmRlcjsgdmFsaWQgaW4gdGhlIHJhbmdlIAotICogICAgICAgICAgICBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSBvY2N1ciAKLSAqICAgICAgICAgICAgb25seSBmb3IgMDw9aTw9MywgaWkpIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leM109PSA0LiAKLSAqICAgICAgICAgICAgTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLVBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqIAotICogICAgT01YX1N0c19CYWRBcmdFcnIsIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIGFueSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwU3JjRHN0LCBwQWxwaGEsIHBCZXRhLCBwVGhyZXNob2xkcywgb3IgcEJTLiAKLSAqICAgIC0gICAgcFNyY0RzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICogICAgLSAgICBwVGhyZXNob2xkcyBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBwQWxwaGFbMF0gYW5kL29yIHBBbHBoYVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwyNTVdLiAKLSAqICAgIC0gICAgcEJldGFbMF0gYW5kL29yIHBCZXRhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDE4XS4gCi0gKiAgICAtICAgIE9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjddIGlzIG91dHNpZGUgCi0gKiAgICAgICAgIG9mIHRoZSByYW5nZSBbMCwyNV0uIAotICogICAgLSAgICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgICAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAKLSAqICAgICAgICAgICAgICAocEJTW2ldPT00ICYmIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4KLSAqICAgIC0gICAgcEJTIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSSAoCi0gICAgT01YX1U4ICpwU3JjRHN0LAotICAgIE9NWF9TMzIgc3JjZHN0U3RlcCwKLSAgICBjb25zdCBPTVhfVTggKnBBbHBoYSwKLSAgICBjb25zdCBPTVhfVTggKnBCZXRhLAotICAgIGNvbnN0IE9NWF9VOCAqcFRocmVzaG9sZHMsCi0gICAgY29uc3QgT01YX1U4ICpwQlMKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JICAgKDYuMy4zLjMuNSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW4tcGxhY2UgZGVibG9jayBmaWx0ZXJpbmcgdGhlIGhvcml6b250YWwgYW5kIAotICogdmVydGljYWwgZWRnZXMgb2YgYSBsdW1hIG1hY3JvYmxvY2sgKDE2eDE2KS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqICAgc3JjZHN0U3RlcCAtIGltYWdlIHdpZHRoOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAotICogICBwQWxwaGEgLSBwb2ludGVyIHRvIGEgMngyIHRhYmxlIG9mIGFscGhhIHRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyAKLSAqICAgICAgICAgICAgZm9sbG93czoge2V4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsIHZlcnRpY2FsIGVkZ2UsIAotICogICAgICAgICAgICBleHRlcm5hbCBob3Jpem9udGFsIGVkZ2UsIGludGVybmFsIGhvcml6b250YWwgZWRnZSB9LiAgUGVyIAotICogICAgICAgICAgICBbSVNPMTQ0OTYtMTBdIGFscGhhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNTVdLiAKLSAqICAgcEJldGEgLSBwb2ludGVyIHRvIGEgMngyIHRhYmxlIG9mIGJldGEgdGhyZXNob2xkcywgb3JnYW5pemVkIGFzIGZvbGxvd3M6IAotICogICAgICAgICAgICB7ZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgdmVydGljYWwgZWRnZSwgZXh0ZXJuYWwgCi0gKiAgICAgICAgICAgIGhvcml6b250YWwgZWRnZSwgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlIH0uICBQZXIgW0lTTzE0NDk2LTEwXSAKLSAqICAgICAgICAgICAgYmV0YSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMThdLiAKLSAqICAgcFRocmVzaG9sZHMgLSBwb2ludGVyIHRvIGEgMTZ4MiB0YWJsZSBvZiB0aHJlc2hvbGQgKFRDMCksIG9yZ2FuaXplZCBhcyAKLSAqICAgICAgICAgICAgZm9sbG93czoge3ZhbHVlcyBmb3IgdGhlIGxlZnQgb3IgYWJvdmUgZWRnZSBvZiBlYWNoIDR4NCBibG9jaywgCi0gKiAgICAgICAgICAgIGFycmFuZ2VkIGluIHZlcnRpY2FsIGJsb2NrIG9yZGVyIGFuZCB0aGVuIGluIGhvcml6b250YWwgYmxvY2sgCi0gKiAgICAgICAgICAgIG9yZGVyfTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgUGVyIFtJU08xNDQ5Ni0xMF0gCi0gKiAgICAgICAgICAgIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNV0uIAotICogICBwQlMgLSBwb2ludGVyIHRvIGEgMTZ4MiB0YWJsZSBvZiBCUyBwYXJhbWV0ZXJzIGFycmFuZ2VkIGluIHNjYW4gYmxvY2sgCi0gKiAgICAgICAgICAgIG9yZGVyIGZvciB2ZXJ0aWNhbCBlZGdlcyBhbmQgdGhlbiBob3Jpem9udGFsIGVkZ2VzOyB2YWxpZCBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IAotICogICAgICAgICAgICBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4zXT09IAotICogICAgICAgICAgICA0LiBNdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzIAotICogICAgLSAgICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjRHN0LCBwQWxwaGEsIAotICogICAgICAgICAgICAgIHBCZXRhLCBwVGhyZXNob2xkcyBvciBwQlMuIAotICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBlaXRoZXIgcFRocmVzaG9sZHMgb3IgcEJTIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgIC0gICAgb25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcEFscGhhWzAuLjNdIGlzIG91dHNpZGUgdGhlIHJhbmdlIAotICogICAgICAgICAgICAgIFswLDI1NV0uIAotICogICAgLSAgICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwQmV0YVswLi4zXSBpcyBvdXRzaWRlIHRoZSByYW5nZSAKLSAqICAgICAgICAgICAgICBbMCwxOF0uIAotICogICAgLSAgICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwVGhyZXNob2xkc1swLi4zMV1pcyBvdXRzaWRlIG9mIAotICogICAgICAgICAgICAgIHRoZSByYW5nZSBbMCwyNV0uIAotICogICAgLSAgICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgICAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAKLSAqICAgICAgICAgICAgIChwQlNbaV09PTQgJiYgcEJTW2leM10hPTQpIGZvciAwPD1pPD0zLiAKLSAqICAgIC0gICAgc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JICgKLSAgICBPTVhfVTggKnBTcmNEc3QsCi0gICAgT01YX1MzMiBzcmNkc3RTdGVwLAotICAgIGNvbnN0IE9NWF9VOCAqcEFscGhhLAotICAgIGNvbnN0IE9NWF9VOCAqcEJldGEsCi0gICAgY29uc3QgT01YX1U4ICpwVGhyZXNob2xkcywKLSAgICBjb25zdCBPTVhfVTggKnBCUwotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSSAgICg2LjMuMy4zLjYpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NraW5nIGZpbHRlcmluZyBvbiBhbGwgZWRnZXMgb2YgdGhlIGNocm9tYSAKLSAqIG1hY3JvYmxvY2sgKDE2eDE2KS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgOC1ieXRlIGFsaWduZWQuIAotICogICBzcmNkc3RTdGVwIC0gc3RlcCBvZiB0aGUgYXJyYXlzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIHBBbHBoYSAtIHBvaW50ZXIgdG8gYSAyeDIgYXJyYXkgb2YgYWxwaGEgdGhyZXNob2xkcywgb3JnYW5pemVkIGFzIAotICogICAgICAgICAgICBmb2xsb3dzOiB7ZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgdmVydGljYWwgZWRnZSwgCi0gKiAgICAgICAgICAgIGV4dGVybmFsIGhvcml6b250YWwgZWRnZSwgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlIH0uICBQZXIgCi0gKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gYWxwaGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1NV0uIAotICogICBwQmV0YSAtIHBvaW50ZXIgdG8gYSAyeDIgYXJyYXkgb2YgQmV0YSBUaHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgZm9sbG93czogCi0gKiAgICAgICAgICAgIHsgZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgdmVydGljYWwgZWRnZSwgZXh0ZXJuYWwgCi0gKiAgICAgICAgICAgIGhvcml6b250YWwgZWRnZSwgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlIH0uICBQZXIgW0lTTzE0NDk2LTEwXSAKLSAqICAgICAgICAgICAgYmV0YSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMThdLiAKLSAqICAgcFRocmVzaG9sZHMgLSBhcnJheSBvZiBzaXplIDh4MiBvZiBUaHJlc2hvbGRzIChUQzApICh2YWx1ZXMgZm9yIHRoZSBsZWZ0IAotICogICAgICAgICAgICBvciBhYm92ZSBlZGdlIG9mIGVhY2ggNHgyIG9yIDJ4NCBibG9jaywgYXJyYW5nZWQgaW4gdmVydGljYWwgCi0gKiAgICAgICAgICAgIGJsb2NrIG9yZGVyIGFuZCB0aGVuIGluIGhvcml6b250YWwgYmxvY2sgb3JkZXIpOyBtdXN0IGJlIGFsaWduZWQgCi0gKiAgICAgICAgICAgIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiBQZXIgW0lTTzE0NDk2LTEwXSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJhbmdlIFswLDI1XS4gCi0gKiAgIHBCUyAtIGFycmF5IG9mIHNpemUgMTZ4MiBvZiBCUyBwYXJhbWV0ZXJzIChhcnJhbmdlZCBpbiBzY2FuIGJsb2NrIG9yZGVyIAotICogICAgICAgICAgICBmb3IgdmVydGljYWwgZWRnZXMgYW5kIHRoZW4gaG9yaXpvbnRhbCBlZGdlcyk7IHZhbGlkIGluIHRoZSAKLSAqICAgICAgICAgICAgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgCi0gKiAgICAgICAgICAgIG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjNdPT0gCi0gKiAgICAgICAgICAgIDQuICBNdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzIAotICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0RzdCwgcEFscGhhLCAKLSAqICAgICAgICAgICAgICBwQmV0YSwgcFRocmVzaG9sZHMsIG9yIHBCUy4gCi0gKiAgICAtICAgcFNyY0RzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgIGVpdGhlciBwVGhyZXNob2xkcyBvciBwQlMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwQWxwaGFbMC4uM10gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgCi0gKiAgICAgICAgICAgICAgWzAsMjU1XS4gCi0gKiAgICAtICAgb25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcEJldGFbMC4uM10gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgCi0gKiAgICAgICAgICAgICAgWzAsMThdLiAKLSAqICAgIC0gICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwVGhyZXNob2xkc1swLi4xNV1pcyBvdXRzaWRlIG9mIAotICogICAgICAgICAgICAgIHRoZSByYW5nZSBbMCwyNV0uIAotICogICAgLSAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00ICBmb3IgaT49NCwgb3IgCi0gKiAgICAgICAgICAgIChwQlNbaV09PTQgJiYgcEJTW2leM10hPTQpIGZvciAwPD1pPD0zLiAKLSAqICAgIC0gICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JICgKLSAgICBPTVhfVTggKnBTcmNEc3QsCi0gICAgT01YX1MzMiBzcmNkc3RTdGVwLAotICAgIGNvbnN0IE9NWF9VOCAqcEFscGhhLAotICAgIGNvbnN0IE9NWF9VOCAqcEJldGEsCi0gICAgY29uc3QgT01YX1U4ICpwVGhyZXNob2xkcywKLSAgICBjb25zdCBPTVhfVTggKnBCUwotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMgICAoNi4zLjQuMS4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgQ0FWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgcmFzdGVyIHNjYW4gZm9yIGEgMngyIGJsb2NrIG9mIAotICogQ2hyb21hRENMZXZlbC4gIFRoZSBkZWNvZGVkIGNvZWZmaWNpZW50cyBpbiB0aGUgcGFja2VkIHBvc2l0aW9uLWNvZWZmaWNpZW50IAotICogYnVmZmVyIGFyZSBzdG9yZWQgaW4gcmV2ZXJzZSB6aWctemFnIG9yZGVyLCBpLmUuLCB0aGUgZmlyc3QgYnVmZmVyIGVsZW1lbnQgCi0gKiBjb250YWlucyB0aGUgbGFzdCBub24temVybyBwb3N0aW9uLWNvZWZmaWNpZW50IHBhaXIgb2YgdGhlIGJsb2NrLiBXaXRoaW4gCi0gKiBlYWNoIHBvc2l0aW9uLWNvZWZmaWNpZW50IHBhaXIsIHRoZSBwb3NpdGlvbiBlbnRyeSBpbmRpY2F0ZXMgdGhlIAotICogcmFzdGVyLXNjYW4gcG9zaXRpb24gb2YgdGhlIGNvZWZmaWNpZW50LCB3aGlsZSB0aGUgY29lZmZpY2llbnQgZW50cnkgCi0gKiBjb250YWlucyB0aGUgY29lZmZpY2llbnQgdmFsdWUuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gRG91YmxlIHBvaW50ZXIgdG8gY3VycmVudCBieXRlIGluIGJpdCBzdHJlYW0gYnVmZmVyIAotICogICBwT2Zmc2V0IC0gUG9pbnRlciB0byBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIHRvIGJ5IAotICogICAgICAgICAgICAqcHBCaXRTdHJlYW07IHZhbGlkIGluIHRoZSByYW5nZSBbMCw3XS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkIAotICogICBwT2Zmc2V0IC0gKnBPZmZzZXQgaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQgCi0gKiAgIHBOdW1Db2VmZiAtIFBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBub256ZXJvIGNvZWZmaWNpZW50cyBpbiB0aGlzIGJsb2NrIAotICogICBwcFBvc0NvZWZCdWYgLSBEb3VibGUgcG9pbnRlciB0byBkZXN0aW5hdGlvbiByZXNpZHVhbCAKLSAqICAgICAgICAgICAgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIuICBCdWZmZXIgcG9zaXRpb24gCi0gKiAgICAgICAgICAgICgqcHBQb3NDb2VmQnVmKSBpcyB1cGRhdGVkIHVwb24gcmV0dXJuLCB1bmxlc3MgdGhlcmUgYXJlIG9ubHkgCi0gKiAgICAgICAgICAgIHplcm8gY29lZmZpY2llbnRzIGluIHRoZSBjdXJyZW50bHkgZGVjb2RlZCBibG9jay4gIEluIHRoaXMgY2FzZSAKLSAqICAgICAgICAgICAgdGhlIGNhbGxlciBpcyBleHBlY3RlZCB0byBieXBhc3MgdGhlIHRyYW5zZm9ybS9kZXF1YW50aXphdGlvbiBvZiAKLSAqICAgICAgICAgICAgdGhlIGVtcHR5IGJsb2Nrcy4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICoKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgcHBCaXRTdHJlYW0gb3IgcE9mZnNldCBpcyBOVUxMLiAKLSAqICAgIC0gICAgcHBQb3NDb2VmQnVmIG9yIHBOdW1Db2VmZiBpcyBOVUxMLiAKLSAqICAgIE9NWF9TdHNfRXJyIC0gaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGFuIGlsbGVnYWwgY29kZSBpcyBlbmNvdW50ZXJlZCBpbiB0aGUgYml0c3RyZWFtIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQyAoCi0gICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgT01YX1MzMipwT2Zmc2V0LAotICAgIE9NWF9VOCAqcE51bUNvZWZmLAotICAgIE9NWF9VOCAqKnBwUG9zQ29lZmJ1ZgotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDICAgKDYuMy40LjEuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIENBVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIGZvciA0eDQgYmxvY2sgb2YgCi0gKiBJbnRyYTE2eDE2RENMZXZlbCwgSW50cmExNngxNkFDTGV2ZWwsIEx1bWFMZXZlbCwgYW5kIENocm9tYUFDTGV2ZWwuIEludmVyc2UgCi0gKiBmaWVsZCBzY2FuIGlzIG5vdCBzdXBwb3J0ZWQuIFRoZSBkZWNvZGVkIGNvZWZmaWNpZW50cyBpbiB0aGUgcGFja2VkIAotICogcG9zaXRpb24tY29lZmZpY2llbnQgYnVmZmVyIGFyZSBzdG9yZWQgaW4gcmV2ZXJzZSB6aWctemFnIG9yZGVyLCBpLmUuLCB0aGUgCi0gKiBmaXJzdCBidWZmZXIgZWxlbWVudCBjb250YWlucyB0aGUgbGFzdCBub24temVybyBwb3N0aW9uLWNvZWZmaWNpZW50IHBhaXIgb2YgCi0gKiB0aGUgYmxvY2suIFdpdGhpbiBlYWNoIHBvc2l0aW9uLWNvZWZmaWNpZW50IHBhaXIsIHRoZSBwb3NpdGlvbiBlbnRyeSAKLSAqIGluZGljYXRlcyB0aGUgcmFzdGVyLXNjYW4gcG9zaXRpb24gb2YgdGhlIGNvZWZmaWNpZW50LCB3aGlsZSB0aGUgCi0gKiBjb2VmZmljaWVudCBlbnRyeSBjb250YWlucyB0aGUgY29lZmZpY2llbnQgdmFsdWUuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC1Eb3VibGUgcG9pbnRlciB0byBjdXJyZW50IGJ5dGUgaW4gYml0IHN0cmVhbSBidWZmZXIgCi0gKiAgIHBPZmZzZXQgLSBQb2ludGVyIHRvIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgdG8gYnkgCi0gKiAgICAgICAgICAgICpwcEJpdFN0cmVhbTsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDddLiAKLSAqICAgc01heE51bUNvZWZmIC0gTWF4aW11bSB0aGUgbnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyBpbiBjdXJyZW50IAotICogICAgICAgICAgICBibG9jayAKLSAqICAgc1ZMQ1NlbGVjdCAtIFZMQyB0YWJsZSBzZWxlY3Rvciwgb2J0YWluZWQgZnJvbSB0aGUgbnVtYmVyIG9mIG5vbi16ZXJvIAotICogICAgICAgICAgICBjb2VmZmljaWVudHMgY29udGFpbmVkIGluIHRoZSBhYm92ZSBhbmQgbGVmdCA0eDQgYmxvY2tzLiAgSXQgaXMgCi0gKiAgICAgICAgICAgIGVxdWl2YWxlbnQgdG8gdGhlIHZhcmlhYmxlIG5DIGRlc2NyaWJlZCBpbiBILjI2NCBzdGFuZGFyZCB0YWJsZSAKLSAqICAgICAgICAgICAgOSA1LCBleGNlcHQgaXRzIHZhbHVlIGNhbiB0IGJlIGxlc3MgdGhhbiB6ZXJvLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQuICAKLSAqICAgICAgICAgICAgQnVmZmVyIHBvc2l0aW9uICgqcHBQb3NDb2VmQnVmKSBpcyB1cGRhdGVkIHVwb24gcmV0dXJuLCB1bmxlc3MgCi0gKiAgICAgICAgICAgIHRoZXJlIGFyZSBvbmx5IHplcm8gY29lZmZpY2llbnRzIGluIHRoZSBjdXJyZW50bHkgZGVjb2RlZCBibG9jay4gCi0gKiAgICAgICAgICAgICBJbiB0aGlzIGNhc2UgdGhlIGNhbGxlciBpcyBleHBlY3RlZCB0byBieXBhc3MgdGhlIAotICogICAgICAgICAgICB0cmFuc2Zvcm0vZGVxdWFudGl6YXRpb24gb2YgdGhlIGVtcHR5IGJsb2Nrcy4gCi0gKiAgIHBPZmZzZXQgLSAqcE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZCAKLSAqICAgcE51bUNvZWZmIC0gUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIG5vbnplcm8gY29lZmZpY2llbnRzIGluIHRoaXMgYmxvY2sgCi0gKiAgIHBwUG9zQ29lZkJ1ZiAtIERvdWJsZSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIHJlc2lkdWFsIAotICogICAgICAgICAgICBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIHBwQml0U3RyZWFtIG9yIHBPZmZzZXQgaXMgTlVMTC4gCi0gKiAgICAtICAgIHBwUG9zQ29lZkJ1ZiBvciBwTnVtQ29lZmYgaXMgTlVMTC4gCi0gKiAgICAtICAgIHNNYXhOdW1Db2VmZiBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDE1IG9yIDE2LiAKLSAqICAgIC0gICAgc1ZMQ1NlbGVjdCBpcyBsZXNzIHRoYW4gMC4gCi0gKgotICogICAgT01YX1N0c19FcnIgLSBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYW4gaWxsZWdhbCBjb2RlIGlzIGVuY291bnRlcmVkIGluIHRoZSBiaXRzdHJlYW0gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQyAoCi0gICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgT01YX1MzMiAqcE9mZnNldCwKLSAgICBPTVhfVTggKnBOdW1Db2VmZiwKLSAgICBPTVhfVTggKipwcFBvc0NvZWZidWYsCi0gICAgT01YX0lOVCBzVkxDU2VsZWN0LAotICAgIE9NWF9JTlQgc01heE51bUNvZWZmCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyICAgKDYuMy40LjIuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFJlY29uc3RydWN0cyB0aGUgNHg0IEx1bWFEQyBibG9jayBmcm9tIHRoZSBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIAotICogYnVmZmVyLCBwZXJmb3JtcyBpbnRlZ2VyIGludmVyc2UsIGFuZCBkZXF1YW50aXphdGlvbiBmb3IgNHg0IEx1bWFEQyAKLSAqIGNvZWZmaWNpZW50cywgYW5kIHVwZGF0ZXMgdGhlIHBhaXIgYnVmZmVyIHBvaW50ZXIgdG8gdGhlIG5leHQgbm9uLWVtcHR5IAotICogYmxvY2suIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwU3JjIC0gRG91YmxlIHBvaW50ZXIgdG8gcmVzaWR1YWwgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIgCi0gKiAgICAgICAgICAgIG91dHB1dCBieSBDQUxWQyBkZWNvZGluZyAKLSAqICAgUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyIFFwWSAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBTcmMgLSAqcHBTcmMgaXMgdXBkYXRlZCB0byB0aGUgc3RhcnQgb2YgbmV4dCBub24gZW1wdHkgYmxvY2sgCi0gKiAgIHBEc3QgLSBQb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIDR4NCBMdW1hREMgY29lZmZpY2llbnRzIGJ1ZmZlcjsgbXVzdCAKLSAqICAgICAgICAgICAgYmUgYWxpZ25lZCBvbiBhIDgtYnl0ZSBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgcHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKLSAqICAgIC0gICAgcERzdCBpcyBub3QgOCBieXRlIGFsaWduZWQuIAotICogICAgLSAgICBRUCBpcyBub3QgaW4gdGhlIHJhbmdlIG9mIFswLTUxXS4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIgKAotICAgIGNvbnN0IE9NWF9VOCAqKnBwU3JjLAotICAgIE9NWF9TMTYgKnBEc3QsCi0gICAgT01YX0lOVCBRUAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyICAgKDYuMy40LjIuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFJlY29uc3RydWN0IHRoZSAyeDIgQ2hyb21hREMgYmxvY2sgZnJvbSBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciwgCi0gKiBwZXJmb3JtIGludGVnZXIgaW52ZXJzZSB0cmFuc2Zvcm1hdGlvbiwgYW5kIGRlcXVhbnRpemF0aW9uIGZvciAyeDIgY2hyb21hIAotICogREMgY29lZmZpY2llbnRzLCBhbmQgdXBkYXRlIHRoZSBwYWlyIGJ1ZmZlciBwb2ludGVyIHRvIG5leHQgbm9uLWVtcHR5IAotICogYmxvY2suIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwU3JjIC0gRG91YmxlIHBvaW50ZXIgdG8gcmVzaWR1YWwgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIgCi0gKiAgICAgICAgICAgIG91dHB1dCBieSBDQUxWQyBkZWNvZGluZyAKLSAqICAgUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyIFFwQyAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBTcmMgLSAqcHBTcmMgaXMgdXBkYXRlZCB0byB0aGUgc3RhcnQgb2YgbmV4dCBub24gZW1wdHkgYmxvY2sgCi0gKiAgIHBEc3QgLSBQb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIDJ4MiBDaHJvbWFEQyBjb2VmZmljaWVudHMgYnVmZmVyOyAKLSAqICAgICAgICAgICAgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBwcFNyYyBvciBwRHN0IGlzIE5VTEwuIAotICogICAgLSAgICBwRHN0IGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIFFQIGlzIG5vdCBpbiB0aGUgcmFuZ2Ugb2YgWzAtNTFdLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyICgKLSAgICBjb25zdCBPTVhfVTggKipwcFNyYywKLSAgICBPTVhfUzE2ICpwRHN0LAotICAgIE9NWF9JTlQgUVAKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCAgICg2LjMuNC4yLjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBSZWNvbnN0cnVjdCB0aGUgNHg0IHJlc2lkdWFsIGJsb2NrIGZyb20gY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIsIAotICogcGVyZm9ybSBkZXF1YW50aXphdGlvbiBhbmQgaW50ZWdlciBpbnZlcnNlIHRyYW5zZm9ybWF0aW9uIGZvciA0eDQgYmxvY2sgb2YgCi0gKiByZXNpZHVhbHMgd2l0aCBwcmV2aW91cyBpbnRyYSBwcmVkaWN0aW9uIG9yIG1vdGlvbiBjb21wZW5zYXRpb24gZGF0YSwgYW5kIAotICogdXBkYXRlIHRoZSBwYWlyIGJ1ZmZlciBwb2ludGVyIHRvIG5leHQgbm9uLWVtcHR5IGJsb2NrLiBJZiBwREMgPT0gTlVMTCwgCi0gKiB0aGVyZSByZSAxNiBub24temVybyBBQyBjb2VmZmljaWVudHMgYXQgbW9zdCBpbiB0aGUgcGFja2VkIGJ1ZmZlciBzdGFydGluZyAKLSAqIGZyb20gNHg0IGJsb2NrIHBvc2l0aW9uIDA7IElmIHBEQyAhPSBOVUxMLCB0aGVyZSByZSAxNSBub24temVybyBBQyAKLSAqIGNvZWZmaWNpZW50cyBhdCBtb3N0IGluIHRoZSBwYWNrZXQgYnVmZmVyIHN0YXJ0aW5nIGZyb20gNHg0IGJsb2NrIHBvc2l0aW9uIAotICogMS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBTcmMgLSBEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciAKLSAqICAgICAgICAgICAgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nIAotICogICBwUHJlZCAtIFBvaW50ZXIgdG8gdGhlIHByZWRpY3RlZCA0eDQgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkgCi0gKiAgIHByZWRTdGVwIC0gUHJlZGljdGVkIGZyYW1lIHN0ZXAgc2l6ZSBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgCi0gKiAgIGRzdFN0ZXAgLSBEZXN0aW5hdGlvbiBmcmFtZSBzdGVwIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAKLSAqICAgcERDIC0gUG9pbnRlciB0byB0aGUgREMgY29lZmZpY2llbnQgb2YgdGhpcyBibG9jaywgTlVMTCBpZiBpdCBkb2Vzbid0IAotICogICAgICAgICAgICBleGlzdCAKLSAqICAgUVAgLSBRUCBRdWFudGl6YXRpb24gcGFyYW1ldGVyLiAgSXQgc2hvdWxkIGJlIFFwQyBpbiBjaHJvbWEgNHg0IGJsb2NrIAotICogICAgICAgICAgICBkZWNvZGluZywgb3RoZXJ3aXNlIGl0IHNob3VsZCBiZSBRcFkuIAotICogICBBQyAtIEZsYWcgaW5kaWNhdGluZyBpZiBhdCBsZWFzdCBvbmUgbm9uLXplcm8gQUMgY29lZmZpY2llbnQgZXhpc3RzIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCA0eDQgYmxvY2sgZGF0YTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgCi0gKiAgICAgICAgICAgIDQtYnl0ZSBib3VuZGFyeSAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBwUHJlZCBvciBwRHN0IGlzIE5VTEwuIAotICogICAgLSAgICBwUHJlZCBvciBwRHN0IGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIHByZWRTdGVwIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgICAtICAgIEFDICE9MCBhbmQgUXAgaXMgbm90IGluIHRoZSByYW5nZSBvZiBbMC01MV0gb3IgcHBTcmMgPT0gTlVMTC4gCi0gKiAgICAtICAgIEFDID09MCAmJiBwREMgPT1OVUxMLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkICgKLSAgICBjb25zdCBPTVhfVTggKipwcFNyYywKLSAgICBjb25zdCBPTVhfVTggKnBQcmVkLAotICAgIGNvbnN0IE9NWF9TMTYgKnBEQywKLSAgICBPTVhfVTggKnBEc3QsCi0gICAgT01YX0lOVCBwcmVkU3RlcCwKLSAgICBPTVhfSU5UIGRzdFN0ZXAsCi0gICAgT01YX0lOVCBRUCwKLSAgICBPTVhfSU5UIEFDCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfTUVHZXRCdWZTaXplICAgKDYuMy41LjEuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbXB1dGVzIHRoZSBzaXplLCBpbiBieXRlcywgb2YgdGhlIHZlbmRvci1zcGVjaWZpYyBzcGVjaWZpY2F0aW9uIAotICogc3RydWN0dXJlIGZvciB0aGUgb214VkNNNFAxMCBtb3Rpb24gZXN0aW1hdGlvbiBmdW5jdGlvbnMgQmxvY2tNYXRjaF9JbnRlZ2VyIAotICogYW5kIE1vdGlvbkVzdGltYXRpb25NQi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgTUVtb2RlIC0gbW90aW9uIGVzdGltYXRpb24gbW9kZTsgYXZhaWxhYmxlIG1vZGVzIGFyZSBkZWZpbmVkIGJ5IHRoZSAKLSAqICAgICAgICAgICAgZW51bWVyYXRlZCB0eXBlIE9NWFZDTTRQMTBNRU1vZGUgCi0gKiAgIHBNRVBhcmFtcyAtbW90aW9uIGVzdGltYXRpb24gcGFyYW1ldGVycyAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNpemUgLSBwb2ludGVyIHRvIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZSBtb3Rpb24gCi0gKiAgICAgICAgICAgIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgcE1FUGFyYW1zIG9yIHBTaXplIGlzIE5VTEwuIAotICogICAgLSAgICBhbiBpbnZhbGlkIE1FTW9kZSBpcyBzcGVjaWZpZWQuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfTUVHZXRCdWZTaXplICgKLSAgICBPTVhWQ000UDEwTUVNb2RlIE1FbW9kZSwKLSAgICBjb25zdCBPTVhWQ000UDEwTUVQYXJhbXMgKnBNRVBhcmFtcywKLSAgICBPTVhfVTMyICpwU2l6ZQotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX01FSW5pdCAgICg2LjMuNS4xLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBJbml0aWFsaXplcyB0aGUgdmVuZG9yLXNwZWNpZmljIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIHJlcXVpcmVkIGZvciB0aGUgCi0gKiBvbXhWQ000UDEwIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9uczogIEJsb2NrTWF0Y2hfSW50ZWdlciBhbmQgCi0gKiBNb3Rpb25Fc3RpbWF0aW9uTUIuIE1lbW9yeSBmb3IgdGhlIHNwZWNpZmljYXRpb24gc3RydWN0dXJlICpwTUVTcGVjIG11c3QgYmUgCi0gKiBhbGxvY2F0ZWQgcHJpb3IgdG8gY2FsbGluZyB0aGUgZnVuY3Rpb24sIGFuZCBzaG91bGQgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKLSAqIGJvdW5kYXJ5LiAgVGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCBmb3IgdGhlIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIGNhbiAKLSAqIGJlIGRldGVybWluZWQgdXNpbmcgdGhlIGZ1bmN0aW9uIG9teFZDTTRQMTBfTUVHZXRCdWZTaXplLiBGb2xsb3dpbmcgCi0gKiBpbml0aWFsaXphdGlvbiBieSB0aGlzIGZ1bmN0aW9uLCB0aGUgdmVuZG9yLXNwZWNpZmljIHN0cnVjdHVyZSAqcE1FU3BlYyAKLSAqIHNob3VsZCBjb250YWluIGFuIGltcGxlbWVudGF0aW9uLXNwZWNpZmljIHJlcHJlc2VudGF0aW9uIG9mIGFsbCBtb3Rpb24gCi0gKiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgcmVjZWl2ZWQgdmlhIHRoZSBzdHJ1Y3R1cmUgcE1FUGFyYW1zLCBmb3IgZXhhbXBsZSAgCi0gKiBzZWFyY2hSYW5nZTE2eDE2LCBzZWFyY2hSYW5nZTh4OCwgZXRjLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBNRW1vZGUgLSBtb3Rpb24gZXN0aW1hdGlvbiBtb2RlOyBhdmFpbGFibGUgbW9kZXMgYXJlIGRlZmluZWQgYnkgdGhlIAotICogICAgICAgICAgICBlbnVtZXJhdGVkIHR5cGUgT01YVkNNNFAxME1FTW9kZSAKLSAqICAgcE1FUGFyYW1zIC0gbW90aW9uIGVzdGltYXRpb24gcGFyYW1ldGVycyAKLSAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIHVuaW5pdGlhbGl6ZWQgTUUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSBpbml0aWFsaXplZCBNRSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBwTUVQYXJhbXMgb3IgcFNpemUgaXMgTlVMTC4gCi0gKiAgICAtICAgIGFuIGludmFsaWQgdmFsdWUgd2FzIHNwZWNpZmllZCBmb3IgdGhlIHBhcmFtZXRlciBNRW1vZGUgCi0gKiAgICAtICAgIGEgbmVnYXRpdmUgb3IgemVybyB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciBvbmUgb2YgdGhlIHNlYXJjaCByYW5nZXMgCi0gKiAgICAgICAgIChlLmcuLCAgcE1CUGFyYW1zID5zZWFyY2hSYW5nZTh4OCwgcE1FUGFyYW1zLT5zZWFyY2hSYW5nZTE2eDE2LCBldGMuKSAKLSAqICAgIC0gICAgZWl0aGVyIGluIGlzb2xhdGlvbiBvciBpbiBjb21iaW5hdGlvbiwgb25lIG9yIG1vcmUgb2YgdGhlIGVuYWJsZXMgb3IgCi0gKiAgICAgICAgIHNlYXJjaCByYW5nZXMgaW4gdGhlIHN0cnVjdHVyZSAqcE1FUGFyYW1zIHdlcmUgY29uZmlndXJlZCBzdWNoIAotICogICAgICAgICB0aGF0IHRoZSByZXF1ZXN0ZWQgYmVoYXZpb3IgZmFpbHMgdG8gY29tcGx5IHdpdGggW0lTTzE0NDk2LTEwXS4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9NRUluaXQgKAotICAgIE9NWFZDTTRQMTBNRU1vZGUgTUVtb2RlLAotICAgIGNvbnN0IE9NWFZDTTRQMTBNRVBhcmFtcyAqcE1FUGFyYW1zLAotICAgIHZvaWQgKnBNRVNwZWMKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIgICAoNi4zLjUuMi4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgaW50ZWdlciBibG9jayBtYXRjaC4gIFJldHVybnMgYmVzdCBNViBhbmQgYXNzb2NpYXRlZCBjb3N0LiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjT3JnWSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY3VycmVudCBibG9jazoKLSAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIHBTcmNSZWZZIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjby1sb2NhdGVkIGJsb2NrIGluIHRoZSAKLSAqICAgICAgICAgICAgcmVmZXJlbmNlIHBpY3R1cmU6IAotICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuICAKLSAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAgCi0gKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBuU3JjT3JnU3RlcCAtIFN0cmlkZSBvZiB0aGUgb3JpZ2luYWwgcGljdHVyZSBwbGFuZSwgZXhwcmVzc2VkIGluIHRlcm1zIAotICogICAgICAgICAgICBvZiBpbnRlZ2VyIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIGlCbG9ja1dpZHRoLiAKLSAqICAgblNyY1JlZlN0ZXAgLSBTdHJpZGUgb2YgdGhlIHJlZmVyZW5jZSBwaWN0dXJlIHBsYW5lLCBleHByZXNzZWQgaW4gdGVybXMgCi0gKiAgICAgICAgICAgIG9mIGludGVnZXIgcGl4ZWxzIAotICogICBwUmVmUmVjdCAtIHBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlZmVyZW5jZSByZWN0YW5nbGUgaW5zaWRlIHRoZSByZWZlcmVuY2UgCi0gKiAgICAgICAgICAgIHBpY3R1cmUgcGxhbmUgCi0gKiAgIG5DdXJyUG9pbnRQb3MgLSBwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZSAKLSAqICAgaUJsb2NrV2lkdGggLSBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jaywgZXhwcmVzc2VkIGluIHRlcm1zIG9mIGludGVnZXIgCi0gKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAotICogICBpQmxvY2tIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2ssIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiAKLSAqICAgICAgICAgICAgaW50ZWdlciBwaXhlbHM7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKLSAqICAgbkxhbWRhIC0gTGFtZGEgZmFjdG9yOyB1c2VkIHRvIGNvbXB1dGUgbW90aW9uIGNvc3QgCi0gKiAgIHBNVlByZWQgLSBQcmVkaWN0ZWQgTVY7IHVzZWQgdG8gY29tcHV0ZSBtb3Rpb24gY29zdCwgZXhwcmVzc2VkIGluIHRlcm1zIAotICogICAgICAgICAgICBvZiAxLzQtcGVsIHVuaXRzIAotICogICBwTVZDYW5kaWRhdGUgLSBDYW5kaWRhdGUgTVY7IHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgbW90aW9uIHNlYXJjaCwgCi0gKiAgICAgICAgICAgIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiBpbnRlZ2VyIHBpeGVscyAKLSAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIE1FIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0QmVzdE1WIC0gQmVzdCBNViByZXN1bHRpbmcgZnJvbSBpbnRlZ2VyIHNlYXJjaCwgZXhwcmVzc2VkIGluIHRlcm1zIAotICogICAgICAgICAgICBvZiAxLzQtcGVsIHVuaXRzIAotICogICBwQmVzdENvc3QgLSBNb3Rpb24gY29zdCBhc3NvY2lhdGVkIHdpdGggdGhlIGJlc3QgTVY7IGNvbXB1dGVkIGFzIAotICogICAgICAgICAgICBTQUQrTGFtZGEqQml0c1VzZWRCeU1WIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIGFueSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGFyZSBOVUxMOgotICogICAgICAgICBwU3JjT3JnWSwgcFNyY1JlZlksIHBSZWZSZWN0LCBwTVZQcmVkLCBwTVZDYW5kaWRhdGUsIG9yIHBNRVNwZWMuIAotICogICAgLSAgICBFaXRoZXIgaUJsb2NrV2lkdGggb3IgaUJsb2NrSGVpZ2h0IGFyZSB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNi4gCi0gKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSW50ZWdlciAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjT3JnWSwKLSAgICBPTVhfUzMyIG5TcmNPcmdTdGVwLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZlksCi0gICAgT01YX1MzMiBuU3JjUmVmU3RlcCwKLSAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKLSAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAotICAgIE9NWF9VOCBpQmxvY2tXaWR0aCwKLSAgICBPTVhfVTggaUJsb2NrSGVpZ2h0LAotICAgIE9NWF9VMzIgbkxhbWRhLAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwTVZQcmVkLAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwTVZDYW5kaWRhdGUsCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgKnBCZXN0TVYsCi0gICAgT01YX1MzMiAqcEJlc3RDb3N0LAotICAgIHZvaWQgKnBNRVNwZWMKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYgICAoNi4zLjUuMi4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgYSBoYWxmLXBlbCBibG9jayBtYXRjaCB1c2luZyByZXN1bHRzIGZyb20gYSBwcmlvciBpbnRlZ2VyIHNlYXJjaC4gCi0gKiAgUmV0dXJucyB0aGUgYmVzdCBNViBhbmQgYXNzb2NpYXRlZCBjb3N0LiAgVGhpcyBmdW5jdGlvbiBlc3RpbWF0ZXMgdGhlIAotICogaGFsZi1waXhlbCBtb3Rpb24gdmVjdG9yIGJ5IGludGVycG9sYXRpbmcgdGhlIGludGVnZXIgcmVzb2x1dGlvbiBtb3Rpb24gCi0gKiB2ZWN0b3IgcmVmZXJlbmNlZCBieSB0aGUgaW5wdXQgcGFyYW1ldGVyIHBTcmNEc3RCZXN0TVYsIGkuZS4sIHRoZSBpbml0aWFsIAotICogaW50ZWdlciBNViBpcyBnZW5lcmF0ZWQgZXh0ZXJuYWxseS4gIFRoZSBmdW5jdGlvbiAKLSAqIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyIG1heSBiZSB1c2VkIGZvciBpbnRlZ2VyIG1vdGlvbiBlc3RpbWF0aW9uLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjT3JnWSAtIFBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gb3JpZ2luYWwgcGljdHVyZSBwbGFuZToKLSAqICAgICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIHBTcmNSZWZZIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjby1sb2NhdGVkIGJsb2NrIGluIHRoZSAKLSAqICAgICAgICAgICAgcmVmZXJlbmNlIHBpY3R1cmU6ICAKLSAqICAgICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuICAKLSAqICAgICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuICAKLSAqICAgICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgblNyY09yZ1N0ZXAgLSBTdHJpZGUgb2YgdGhlIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKLSAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgaUJsb2NrV2lkdGguIAotICogICBuU3JjUmVmU3RlcCAtIFN0cmlkZSBvZiB0aGUgcmVmZXJlbmNlIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKLSAqICAgICAgICAgICAgcGl4ZWxzIAotICogICBpQmxvY2tXaWR0aCAtIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRlcm1zIG9mIGZ1bGwgcGl4ZWxzOyBtdXN0IAotICogICAgICAgICAgICBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAotICogICBpQmxvY2tIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGVybXMgb2YgZnVsbCBwaXhlbHM7IG11c3QgCi0gKiAgICAgICAgICAgIGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCi0gKiAgIG5MYW1kYSAtIExhbWRhIGZhY3RvciwgdXNlZCB0byBjb21wdXRlIG1vdGlvbiBjb3N0IAotICogICBwTVZQcmVkIC0gUHJlZGljdGVkIE1WLCByZXByZXNlbnRlZCBpbiB0ZXJtcyBvZiAxLzQtcGVsIHVuaXRzOyB1c2VkIHRvIAotICogICAgICAgICAgICBjb21wdXRlIG1vdGlvbiBjb3N0IAotICogICBwU3JjRHN0QmVzdE1WIC0gVGhlIGJlc3QgTVYgcmVzdWx0aW5nIGZyb20gYSBwcmlvciBpbnRlZ2VyIHNlYXJjaCwgCi0gKiAgICAgICAgICAgIHJlcHJlc2VudGVkIGluIHRlcm1zIG9mIDEvNC1wZWwgdW5pdHMgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3RCZXN0TVYgLSBCZXN0IE1WIHJlc3VsdGluZyBmcm9tIHRoZSBoYWxmLXBlbCBzZWFyY2gsIGV4cHJlc3NlZCBpbiAKLSAqICAgICAgICAgICAgdGVybXMgb2YgMS80LXBlbCB1bml0cyAKLSAqICAgcEJlc3RDb3N0IC0gTW90aW9uIGNvc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBiZXN0IE1WOyBjb21wdXRlZCBhcyAKLSAqICAgICAgICAgICAgU0FEK0xhbWRhKkJpdHNVc2VkQnlNViAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBhbnkgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjT3JnWSwgcFNyY1JlZlksIAotICogICAgICAgICAgICAgIHBTcmNEc3RCZXN0TVYsIHBNVlByZWQsIHBCZXN0Q29zdCAKLSAqICAgIC0gICAgaUJsb2NrV2lkdGggb3IgaUJsb2NrSGVpZ2h0IGFyZSBlcXVhbCB0byB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNi4gCi0gKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZiAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjT3JnWSwKLSAgICBPTVhfUzMyIG5TcmNPcmdTdGVwLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZlksCi0gICAgT01YX1MzMiBuU3JjUmVmU3RlcCwKLSAgICBPTVhfVTggaUJsb2NrV2lkdGgsCi0gICAgT01YX1U4IGlCbG9ja0hlaWdodCwKLSAgICBPTVhfVTMyIG5MYW1kYSwKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcE1WUHJlZCwKLSAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0RzdEJlc3RNViwKLSAgICBPTVhfUzMyICpwQmVzdENvc3QKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9CbG9ja01hdGNoX1F1YXJ0ZXIgICAoNi4zLjUuMi4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgYSBxdWFydGVyLXBlbCBibG9jayBtYXRjaCB1c2luZyByZXN1bHRzIGZyb20gYSBwcmlvciBoYWxmLXBlbCAKLSAqIHNlYXJjaC4gIFJldHVybnMgdGhlIGJlc3QgTVYgYW5kIGFzc29jaWF0ZWQgY29zdC4gIFRoaXMgZnVuY3Rpb24gZXN0aW1hdGVzIAotICogdGhlIHF1YXJ0ZXItcGl4ZWwgbW90aW9uIHZlY3RvciBieSBpbnRlcnBvbGF0aW5nIHRoZSBoYWxmLXBlbCByZXNvbHV0aW9uIAotICogbW90aW9uIHZlY3RvciByZWZlcmVuY2VkIGJ5IHRoZSBpbnB1dCBwYXJhbWV0ZXIgcFNyY0RzdEJlc3RNViwgaS5lLiwgdGhlIAotICogaW5pdGlhbCBoYWxmLXBlbCBNViBpcyBnZW5lcmF0ZWQgZXh0ZXJuYWxseS4gIFRoZSBmdW5jdGlvbiAKLSAqIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmIG1heSBiZSB1c2VkIGZvciBoYWxmLXBlbCBtb3Rpb24gZXN0aW1hdGlvbi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY09yZ1kgLSBQb2ludGVyIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmU6Ci0gKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBwU3JjUmVmWSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY28tbG9jYXRlZCBibG9jayBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJlZmVyZW5jZSBwaWN0dXJlOgotICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuICAKLSAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAgCi0gKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBuU3JjT3JnU3RlcCAtIFN0cmlkZSBvZiB0aGUgb3JpZ2luYWwgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAotICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiBpQmxvY2tXaWR0aC4gCi0gKiAgIG5TcmNSZWZTdGVwIC0gU3RyaWRlIG9mIHRoZSByZWZlcmVuY2UgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAotICogICAgICAgICAgICBwaXhlbHMgCi0gKiAgIGlCbG9ja1dpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGVybXMgb2YgZnVsbCBwaXhlbHM7IG11c3QgCi0gKiAgICAgICAgICAgIGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCi0gKiAgIGlCbG9ja0hlaWdodCAtIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0ZXJtcyBvZiBmdWxsIHBpeGVsczsgbXVzdCAKLSAqICAgICAgICAgICAgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKLSAqICAgbkxhbWRhIC0gTGFtZGEgZmFjdG9yLCB1c2VkIHRvIGNvbXB1dGUgbW90aW9uIGNvc3QgCi0gKiAgIHBNVlByZWQgLSBQcmVkaWN0ZWQgTVYsIHJlcHJlc2VudGVkIGluIHRlcm1zIG9mIDEvNC1wZWwgdW5pdHM7IHVzZWQgdG8gCi0gKiAgICAgICAgICAgIGNvbXB1dGUgbW90aW9uIGNvc3QgCi0gKiAgIHBTcmNEc3RCZXN0TVYgLSBUaGUgYmVzdCBNViByZXN1bHRpbmcgZnJvbSBhIHByaW9yIGhhbGYtcGVsIHNlYXJjaCwgCi0gKiAgICAgICAgICAgIHJlcHJlc2VudGVkIGluIHRlcm1zIG9mIDEvNCBwZWwgdW5pdHMgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3RCZXN0TVYgLSBCZXN0IE1WIHJlc3VsdGluZyBmcm9tIHRoZSBxdWFydGVyLXBlbCBzZWFyY2gsIGV4cHJlc3NlZCAKLSAqICAgICAgICAgICAgaW4gdGVybXMgb2YgMS80LXBlbCB1bml0cyAKLSAqICAgcEJlc3RDb3N0IC0gTW90aW9uIGNvc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBiZXN0IE1WOyBjb21wdXRlZCBhcyAKLSAqICAgICAgICAgICAgU0FEK0xhbWRhKkJpdHNVc2VkQnlNViAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBPbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwU3JjT3JnWSwgcFNyY1JlZlksIHBTcmNEc3RCZXN0TVYsIHBNVlByZWQsIHBCZXN0Q29zdCAKLSAqICAgIC0gICAgaUJsb2NrV2lkdGggb3IgaUJsb2NrSGVpZ2h0IGFyZSBlcXVhbCB0byB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNi4gCi0gKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfUXVhcnRlciAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjT3JnWSwKLSAgICBPTVhfUzMyIG5TcmNPcmdTdGVwLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZlksCi0gICAgT01YX1MzMiBuU3JjUmVmU3RlcCwKLSAgICBPTVhfVTggaUJsb2NrV2lkdGgsCi0gICAgT01YX1U4IGlCbG9ja0hlaWdodCwKLSAgICBPTVhfVTMyIG5MYW1kYSwKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcE1WUHJlZCwKLSAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0RzdEJlc3RNViwKLSAgICBPTVhfUzMyICpwQmVzdENvc3QKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9Nb3Rpb25Fc3RpbWF0aW9uTUIgICAoNi4zLjUuMy4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgTUItbGV2ZWwgbW90aW9uIGVzdGltYXRpb24gYW5kIHNlbGVjdHMgYmVzdCBtb3Rpb24gZXN0aW1hdGlvbiAKLSAqIHN0cmF0ZWd5IGZyb20gdGhlIHNldCBvZiBtb2RlcyBzdXBwb3J0ZWQgaW4gYmFzZWxpbmUgcHJvZmlsZSBbSVNPMTQ0OTYtMTBdLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjQ3VyckJ1ZiAtIFBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gb3JpZ2luYWwgcGljdHVyZSBwbGFuZTsgCi0gKiAgICAgICAgICAgIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAotICogICBwU3JjUmVmQnVmTGlzdCAtIFBvaW50ZXIgdG8gYW4gYXJyYXkgd2l0aCAxNiBlbnRyaWVzLiAgRWFjaCBlbnRyeSBwb2ludHMgCi0gKiAgICAgICAgICAgIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGNvLWxvY2F0ZWQgTUIgaW4gYSByZWZlcmVuY2UgCi0gKiAgICAgICAgICAgIHBpY3R1cmUuICBUaGUgYXJyYXkgaXMgZmlsbGVkIGZyb20gbG93LXRvLWhpZ2ggd2l0aCB2YWxpZCAKLSAqICAgICAgICAgICAgcmVmZXJlbmNlIGZyYW1lIHBvaW50ZXJzOyB0aGUgdW51c2VkIGhpZ2ggZW50cmllcyBzaG91bGQgYmUgc2V0IAotICogICAgICAgICAgICB0byBOVUxMLiAgT3JkZXJpbmcgb2YgdGhlIHJlZmVyZW5jZSBmcmFtZXMgc2hvdWxkIGZvbGxvdyAKLSAqICAgICAgICAgICAgW0lTTzE0NDk2LTEwXSBzdWJjbGF1c2UgOC4yLjQgIERlY29kaW5nIFByb2Nlc3MgZm9yIFJlZmVyZW5jZSAKLSAqICAgICAgICAgICAgUGljdHVyZSBMaXN0cy4gICBUaGUgZW50cmllcyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gCi0gKiAgIHBTcmNSZWNCdWYgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGNvLWxvY2F0ZWQgTUIgaW4gdGhlIAotICogICAgICAgICAgICByZWNvbnN0cnVjdGVkIHBpY3R1cmU7IG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqICAgU3JjQ3VyclN0ZXAgLSBXaWR0aCBvZiB0aGUgb3JpZ2luYWwgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAotICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgIFNyY1JlZlN0ZXAgLSBXaWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKLSAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAotICogICBTcmNSZWNTdGVwIC0gV2lkdGggb2YgdGhlIHJlY29uc3RydWN0ZWQgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAotICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgIHBSZWZSZWN0IC0gUG9pbnRlciB0byB0aGUgdmFsaWQgcmVmZXJlbmNlIHJlY3RhbmdsZTsgcmVsYXRpdmUgdG8gdGhlIAotICogICAgICAgICAgICBpbWFnZSBvcmlnaW4uIAotICogICBwQ3VyclBvaW50UG9zIC0gUG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZS4gCi0gKiAgIExhbWJkYSAtIExhZ3JhbmdlIGZhY3RvciBmb3IgY29tcHV0aW5nIHRoZSBjb3N0IGZ1bmN0aW9uIAotICogICBwTUVTcGVjIC0gUG9pbnRlciB0byB0aGUgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmU7IG11c3QgCi0gKiAgICAgICAgICAgIGhhdmUgYmVlbiBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkIHByaW9yIHRvIGNhbGxpbmcgdGhpcyAKLSAqICAgICAgICAgICAgZnVuY3Rpb24uIAotICogICBwTUJJbnRlciAtIEFycmF5LCBvZiBkaW1lbnNpb24gZm91ciwgY29udGFpbmluZyBwb2ludGVycyB0byBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIGZvdXIgYWRqYWNlbnQgdHlwZSBJTlRFUiBNQnMgKExlZnQsIFRvcCwgCi0gKiAgICAgICAgICAgIFRvcC1MZWZ0LCBUb3AtUmlnaHQpLiBBbnkgcG9pbnRlciBpbiB0aGUgYXJyYXkgbWF5IGJlIHNldCBlcXVhbCAKLSAqICAgICAgICAgICAgdG8gTlVMTCBpZiB0aGUgY29ycmVzcG9uZGluZyBNQiBkb2VzbiB0IGV4aXN0IG9yIGlzIG5vdCBvZiB0eXBlIAotICogICAgICAgICAgICBJTlRFUi4gCi0gKiAgICAgICAgICAgIC0gIHBNQkludGVyWzBdIC0gUG9pbnRlciB0byBsZWZ0IE1CIGluZm9ybWF0aW9uIAotICogICAgICAgICAgICAtICBwTUJJbnRlclsxXSAtIFBvaW50ZXIgdG8gdG9wIE1CIGluZm9ybWF0aW9uIAotICogICAgICAgICAgICAtICBwTUJJbnRlclsyXSAtIFBvaW50ZXIgdG8gdG9wLWxlZnQgTUIgaW5mb3JtYXRpb24gCi0gKiAgICAgICAgICAgIC0gIHBNQkludGVyWzNdIC0gUG9pbnRlciB0byB0b3AtcmlnaHQgTUIgaW5mb3JtYXRpb24gCi0gKiAgIHBNQkludHJhIC0gQXJyYXksIG9mIGRpbWVuc2lvbiBmb3VyLCBjb250YWluaW5nIHBvaW50ZXJzIHRvIGluZm9ybWF0aW9uIAotICogICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggZm91ciBhZGphY2VudCB0eXBlIElOVFJBIE1CcyAoTGVmdCwgVG9wLCAKLSAqICAgICAgICAgICAgVG9wLUxlZnQsIFRvcC1SaWdodCkuIEFueSBwb2ludGVyIGluIHRoZSBhcnJheSBtYXkgYmUgc2V0IGVxdWFsIAotICogICAgICAgICAgICB0byBOVUxMIGlmIHRoZSBjb3JyZXNwb25kaW5nIE1CIGRvZXNuIHQgZXhpc3Qgb3IgaXMgbm90IG9mIHR5cGUgCi0gKiAgICAgICAgICAgIElOVFJBLiAKLSAqICAgICAgICAgICAgLSAgcE1CSW50cmFbMF0gLSBQb2ludGVyIHRvIGxlZnQgTUIgaW5mb3JtYXRpb24gCi0gKiAgICAgICAgICAgIC0gIHBNQkludHJhWzFdIC0gUG9pbnRlciB0byB0b3AgTUIgaW5mb3JtYXRpb24gCi0gKiAgICAgICAgICAgIC0gIHBNQkludHJhWzJdIC0gUG9pbnRlciB0byB0b3AtbGVmdCBNQiBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgLSAgcE1CSW50cmFbM10gLSBQb2ludGVyIHRvIHRvcC1yaWdodCBNQiBpbmZvcm1hdGlvbiAKLSAqICAgcFNyY0RzdE1CQ3VyciAtIFBvaW50ZXIgdG8gaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciB0aGUgY3VycmVudCBNQi4gIAotICogICAgICAgICAgICBUaGUgZm9sbG93aW5nIGVudHJpZXMgc2hvdWxkIGJlIHNldCBwcmlvciB0byBjYWxsaW5nIHRoZSAKLSAqICAgICAgICAgICAgZnVuY3Rpb246ICBzbGljZUlEIC0gdGhlIG51bWJlciBvZiB0aGUgc2xpY2UgdGhlIHRvIHdoaWNoIHRoZSAKLSAqICAgICAgICAgICAgY3VycmVudCBNQiBiZWxvbmdzLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdENvc3QgLSBQb2ludGVyIHRvIHRoZSBtaW5pbXVtIG1vdGlvbiBjb3N0IGZvciB0aGUgY3VycmVudCBNQi4gCi0gKiAgIHBEc3RCbG9ja1NBRCAtIFBvaW50ZXIgdG8gdGhlIGFycmF5IG9mIFNBRHMgZm9yIGVhY2ggb2YgdGhlIHNpeHRlZW4gbHVtYSAKLSAqICAgICAgICAgICAgNHg0IGJsb2NrcyBpbiBlYWNoIE1CLiAgVGhlIGJsb2NrIFNBRHMgYXJlIGluIHNjYW4gb3JkZXIgZm9yIAotICogICAgICAgICAgICBlYWNoIE1CLiAgRm9yIGltcGxlbWVudGF0aW9ucyB0aGF0IGNhbm5vdCBjb21wdXRlIHRoZSBTQUQgdmFsdWVzIAotICogICAgICAgICAgICBpbmRpdmlkdWFsbHksIHRoZSBtYXhpbXVtIHBvc3NpYmxlIHZhbHVlICgweGZmZmYpIGlzIHJldHVybmVkIAotICogICAgICAgICAgICBmb3IgZWFjaCBvZiB0aGUgMTYgYmxvY2sgU0FEIGVudHJpZXMuIAotICogICBwU3JjRHN0TUJDdXJyIC0gUG9pbnRlciB0byB1cGRhdGVkIGluZm9ybWF0aW9uIHN0cnVjdHVyZSBmb3IgdGhlIGN1cnJlbnQgCi0gKiAgICAgICAgICAgIE1CIGFmdGVyIE1CLWxldmVsIG1vdGlvbiBlc3RpbWF0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZC4gIFRoZSAKLSAqICAgICAgICAgICAgZm9sbG93aW5nIGZpZWxkcyBhcmUgdXBkYXRlZCBieSB0aGUgTUUgZnVuY3Rpb24uICAgVGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgcGFyYW1ldGVyIHNldCBxdWFudGlmaWVzIHRoZSBNQi1sZXZlbCBNRSBzZWFyY2ggcmVzdWx0czogCi0gKiAgICAgICAgICAgIC0gIE1iVHlwZSAKLSAqICAgICAgICAgICAgLSAgc3ViTUJUeXBlWzRdIAotICogICAgICAgICAgICAtICBwTVYwWzRdWzRdIAotICogICAgICAgICAgICAtICBwTVZQcmVkWzRdWzRdIAotICogICAgICAgICAgICAtICBwUmVmTDBJZHhbNF0gCi0gKiAgICAgICAgICAgIC0gIEludHJhMTZ4MTZQcmVkTW9kZSAKLSAqICAgICAgICAgICAgLSAgcEludHJhNHg0UHJlZE1vZGVbNF1bNF0gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICBPbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNDdXJyQnVmLCAKLSAqICAgICAgICAgICBwU3JjUmVmQnVmTGlzdCwgcFNyY1JlY0J1ZiwgcFJlZlJlY3QsIHBDdXJyUG9pbnRQb3MsIHBNRVNwZWMsIAotICogICAgICAgICAgIHBNQkludGVyLCBwTUJJbnRyYSxwU3JjRHN0TUJDdXJyLCBwRHN0Q29zdCwgcFNyY1JlZkJ1Zkxpc3RbMF0gCi0gKiAgICAtICAgIFNyY1JlZlN0ZXAsIFNyY1JlY1N0ZXAgYXJlIG5vdCBtdWx0aXBsZXMgb2YgMTYgCi0gKiAgICAtICAgIGlCbG9ja1dpZHRoIG9yIGlCbG9ja0hlaWdodCBhcmUgdmFsdWVzIG90aGVyIHRoYW4gNCwgOCwgb3IgMTYuIAotICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9Nb3Rpb25Fc3RpbWF0aW9uTUIgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCi0gICAgT01YX1MzMiBTcmNDdXJyU3RlcCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWZMaXN0WzE1XSwKLSAgICBPTVhfUzMyIFNyY1JlZlN0ZXAsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVjQnVmLAotICAgIE9NWF9TMzIgU3JjUmVjU3RlcCwKLSAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKLSAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAotICAgIE9NWF9VMzIgTGFtYmRhLAotICAgIHZvaWQgKnBNRVNwZWMsCi0gICAgY29uc3QgT01YVkNNNFAxME1CSW5mb1B0ciAqcE1CSW50ZXIsCi0gICAgY29uc3QgT01YVkNNNFAxME1CSW5mb1B0ciAqcE1CSW50cmEsCi0gICAgT01YVkNNNFAxME1CSW5mb1B0ciBwU3JjRHN0TUJDdXJyLAotICAgIE9NWF9JTlQgKnBEc3RDb3N0LAotICAgIE9NWF9VMTYgKnBEc3RCbG9ja1NBRAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1NBRF80eCAgICg2LjMuNS40LjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBmb3IgNHg4IGFuZCA0eDQgYmxvY2tzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjT3JnIC1Qb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKiAgIGlTdGVwT3JnIC1TdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgcFNyY1JlZiAtUG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrIAotICogICBpU3RlcFJlZiAtU3RlcCBvZiB0aGUgcmVmZXJlbmNlIGJsb2NrIGJ1ZmZlciAKLSAqICAgaUhlaWdodCAtSGVpZ2h0IG9mIHRoZSBibG9jazsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCBvciA4LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFNBRCAtUG9pbnRlciBvZiByZXN1bHQgU0FEIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIE9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBTcmNPcmcsIHBTcmNSZWYsIG9yIHBEc3RTQUQgCi0gKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA0IG9yIDguIAotICogICAgLSAgICBpU3RlcE9yZyBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAotICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9TQURfNHggKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY09yZywKLSAgICBPTVhfVTMyIGlTdGVwT3JnLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZiwKLSAgICBPTVhfVTMyIGlTdGVwUmVmLAotICAgIE9NWF9TMzIgKnBEc3RTQUQsCi0gICAgT01YX1UzMiBpSGVpZ2h0Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU0FEUXVhcl80eCAgICg2LjMuNS40LjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBiZXR3ZWVuIG9uZSBibG9jayAocFNyYykgYW5kIHRoZSBhdmVyYWdlIAotICogb2YgdGhlIG90aGVyIHR3byAocFNyY1JlZjAgYW5kIHBTcmNSZWYxKSBmb3IgNHg4IG9yIDR4NCBibG9ja3MuICBSb3VuZGluZyAKLSAqIGlzIGFwcGxpZWQgYWNjb3JkaW5nIHRvIHRoZSBjb252ZW50aW9uIChhK2IrMSk+PjEuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKiAgIHBTcmNSZWYwIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMCAKLSAqICAgcFNyY1JlZjEgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAxIAotICogICBpU3JjU3RlcCAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAotICogICBpUmVmU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAotICogICBpUmVmU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAotICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBibG9jazsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCBvciA4LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFNBRCAtIFBvaW50ZXIgb2YgcmVzdWx0IFNBRCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgNCBvciA4LiAKLSAqICAgIC0gICAgT25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwU3JjUmVmMCwgCi0gKiAgICAgICAgICAgICAgcFNyY1JlZjEsIHBEc3RTQUQuIAotICogICAgLSAgICBpU3JjU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAotICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9TQURRdWFyXzR4ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmMsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmMCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYxLAotICAgIE9NWF9VMzIgaVNyY1N0ZXAsCi0gICAgT01YX1UzMiBpUmVmU3RlcDAsCi0gICAgT01YX1UzMiBpUmVmU3RlcDEsCi0gICAgT01YX1UzMiAqcERzdFNBRCwKLSAgICBPTVhfVTMyIGlIZWlnaHQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TQURRdWFyXzh4ICAgKDYuMy41LjQuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGJldHdlZW4gb25lIGJsb2NrIChwU3JjKSBhbmQgdGhlIGF2ZXJhZ2UgCi0gKiBvZiB0aGUgb3RoZXIgdHdvIChwU3JjUmVmMCBhbmQgcFNyY1JlZjEpIGZvciA4eDE2LCA4eDgsIG9yIDh4NCBibG9ja3MuICAKLSAqIFJvdW5kaW5nIGlzIGFwcGxpZWQgYWNjb3JkaW5nIHRvIHRoZSBjb252ZW50aW9uIChhK2IrMSk+PjEuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICogICBwU3JjUmVmMCAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiAgIHBTcmNSZWYxIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMSAKLSAqICAgaVNyY1N0ZXAgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgaVJlZlN0ZXAwIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMCAKLSAqICAgaVJlZlN0ZXAxIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMSAKLSAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgYmxvY2s7IG11c3QgYmUgZXF1YWwgZWl0aGVyIDQsIDgsIG9yIDE2LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFNBRCAtIFBvaW50ZXIgb2YgcmVzdWx0IFNBRCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAotICogICAgLSAgICBPbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBTcmNSZWYwLCAKLSAqICAgICAgICAgICAgICBwU3JjUmVmMSwgcERzdFNBRC4gCi0gKiAgICAtICAgIGlTcmNTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDggCi0gKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1NBRFF1YXJfOHggKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYwLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZjEsCi0gICAgT01YX1UzMiBpU3JjU3RlcCwKLSAgICBPTVhfVTMyIGlSZWZTdGVwMCwKLSAgICBPTVhfVTMyIGlSZWZTdGVwMSwKLSAgICBPTVhfVTMyICpwRHN0U0FELAotICAgIE9NWF9VMzIgaUhlaWdodAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1NBRFF1YXJfMTZ4ICAgKDYuMy41LjQuNCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGJldHdlZW4gb25lIGJsb2NrIChwU3JjKSBhbmQgdGhlIGF2ZXJhZ2UgCi0gKiBvZiB0aGUgb3RoZXIgdHdvIChwU3JjUmVmMCBhbmQgcFNyY1JlZjEpIGZvciAxNngxNiBvciAxNng4IGJsb2Nrcy4gIAotICogUm91bmRpbmcgaXMgYXBwbGllZCBhY2NvcmRpbmcgdG8gdGhlIGNvbnZlbnRpb24gKGErYisxKT4+MS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKiAgIHBTcmNSZWYwIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMCAKLSAqICAgcFNyY1JlZjEgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAxIAotICogICBpU3JjU3RlcCAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2IAotICogICBpUmVmU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAotICogICBpUmVmU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAotICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBibG9jazsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgOCBvciAxNiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFNBRCAtUG9pbnRlciBvZiByZXN1bHQgU0FEIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA4IG9yIDE2LiAKLSAqICAgIC0gICAgT25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwU3JjUmVmMCwgCi0gKiAgICAgICAgICAgICAgcFNyY1JlZjEsIHBEc3RTQUQuIAotICogICAgLSAgICBpU3JjU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiAKLSAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfU0FEUXVhcl8xNnggKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYwLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZjEsCi0gICAgT01YX1UzMiBpU3JjU3RlcCwKLSAgICBPTVhfVTMyIGlSZWZTdGVwMCwKLSAgICBPTVhfVTMyIGlSZWZTdGVwMSwKLSAgICBPTVhfVTMyICpwRHN0U0FELAotICAgIE9NWF9VMzIgaUhlaWdodAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1NBVERfNHg0ICAgKDYuMy41LjQuNSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgc3VtIG9mIGFic29sdXRlIHRyYW5zZm9ybSBkaWZmZXJlbmNlcyAoU0FURCkgCi0gKiBmb3IgYSA0eDQgYmxvY2sgYnkgYXBwbHlpbmcgYSBIYWRhbWFyZCB0cmFuc2Zvcm0gdG8gdGhlIGRpZmZlcmVuY2UgYmxvY2sgCi0gKiBhbmQgdGhlbiBjYWxjdWxhdGluZyB0aGUgc3VtIG9mIGFic29sdXRlIGNvZWZmaWNpZW50IHZhbHVlcy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY09yZyAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5IAotICogICBpU3RlcE9yZyAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgCi0gKiAgIHBTcmNSZWYgLSBQb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkgCi0gKiAgIGlTdGVwUmVmIC0gU3RlcCBvZiB0aGUgcmVmZXJlbmNlIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIHRoZSByZXN1bHRpbmcgU0FEIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBTcmNPcmcsIHBTcmNSZWYsIG9yIHBEc3RTQUQgZWl0aGVyIHBTcmNPcmcgCi0gKiAgICAtICAgIHBTcmNSZWYgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCi0gKiAgICAtICAgIGlTdGVwT3JnIDw9IDAgb3IgaVN0ZXBPcmcgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKLSAqICAgIC0gICAgaVN0ZXBSZWYgPD0gMCBvciBpU3RlcFJlZiBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfU0FURF80eDQgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY09yZywKLSAgICBPTVhfVTMyIGlTdGVwT3JnLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZiwKLSAgICBPTVhfVTMyIGlTdGVwUmVmLAotICAgIE9NWF9VMzIgKnBEc3RTQUQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYSAgICg2LjMuNS41LjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yIHR3byBob3Jpem9udGFsIDEvMi1wZWwgcG9zaXRpb25zIAotICogKC0xLzIsMCkgYW5kICgxLzIsIDApIC0gYXJvdW5kIGEgZnVsbC1wZWwgcG9zaXRpb24uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgaW4gCi0gKiAgICAgICAgICAgIHRoZSByZWNvbnN0cnVjdGlvbiBmcmFtZSBwbGFuZS4gCi0gKiAgIGlTcmNTdGVwIC0gU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4gCi0gKiAgIGlEc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24oaW50ZXJwb2xhdGlvbikgYnVmZmVyOyBtdXN0IGJlIGEgCi0gKiAgICAgICAgICAgIG11bHRpcGxlIG9mIGlXaWR0aC4gCi0gKiAgIGlXaWR0aCAtIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNiAKLSAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jazsgbXVzdCBiZSBlcXVhbCB0byA0LCA4LCBvciAxNiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdExlZnQgLVBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSBsZWZ0IC1wZWwgcG9zaXRpb24gCi0gKiAgICAgICAgICAgICgtMS8yLCAwKSAKLSAqICAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIHBEc3RSaWdodCAtUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIHJpZ2h0IC1wZWwgCi0gKiAgICAgICAgICAgIHBvc2l0aW9uICgxLzIsIDApIAotICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICAgICAgcFNyYywgcERzdExlZnQsIG9yIHBEc3RSaWdodCAKLSAqICAgIC0gICAgaVdpZHRoIG9yIGlIZWlnaHQgaGF2ZSB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNiAKLSAqICAgIC0gICAgaVdpZHRoPT00IGJ1dCBwRHN0TGVmdCBhbmQvb3IgcERzdFJpZ2h0IGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKLSAqICAgIC0gICAgaVdpZHRoPT04IGJ1dCBwRHN0TGVmdCBhbmQvb3IgcERzdFJpZ2h0IGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDgtYnl0ZSBib3VuZGFyeSAKLSAqICAgIC0gICAgaVdpZHRoPT0xNiBidXQgcERzdExlZnQgYW5kL29yIHBEc3RSaWdodCBpcy9hcmUgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5IAotICogICAgLSAgICBhbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYSAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjLAotICAgIE9NWF9VMzIgaVNyY1N0ZXAsCi0gICAgT01YX1U4ICpwRHN0TGVmdCwKLSAgICBPTVhfVTggKnBEc3RSaWdodCwKLSAgICBPTVhfVTMyIGlEc3RTdGVwLAotICAgIE9NWF9VMzIgaVdpZHRoLAotICAgIE9NWF9VMzIgaUhlaWdodAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hICAgKDYuMy41LjUuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgdHdvIHZlcnRpY2FsIDEvMi1wZWwgcG9zaXRpb25zIC0gCi0gKiAoMCwgLTEvMikgYW5kICgwLCAxLzIpIC0gYXJvdW5kIGEgZnVsbC1wZWwgcG9zaXRpb24uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIGludGVycG9sYXRlIGluIHRoZSAKLSAqICAgICAgICAgICAgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZSAKLSAqICAgaVNyY1N0ZXAgLSBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLiAKLSAqICAgaURzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiAoaW50ZXJwb2xhdGlvbikgYnVmZmVyOyBtdXN0IGJlIGEgCi0gKiAgICAgICAgICAgIG11bHRpcGxlIG9mIGlXaWR0aC4gCi0gKiAgIGlXaWR0aCAtIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNiAKLSAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jazsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RVcCAtUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIC1wZWwgcG9zaXRpb24gYWJvdmUgCi0gKiAgICAgICAgICAgIHRoZSBjdXJyZW50IGZ1bGwtcGVsIHBvc2l0aW9uICgwLCAtMS8yKSAKLSAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09NCwgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTgsIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBwRHN0RG93biAtUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIC1wZWwgcG9zaXRpb24gYmVsb3cgCi0gKiAgICAgICAgICAgIHRoZSBjdXJyZW50IGZ1bGwtcGVsIHBvc2l0aW9uICgwLCAxLzIpIAotICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT00LCA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09OCwgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgICAgcFNyYywgcERzdFVwLCBvciBwRHN0RG93biAKLSAqICAgIC0gICAgaVdpZHRoIG9yIGlIZWlnaHQgaGF2ZSB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNiAKLSAqICAgIC0gICAgaVdpZHRoPT00IGJ1dCBwRHN0VXAgYW5kL29yIHBEc3REb3duIGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKLSAqICAgIC0gICAgaVdpZHRoPT04IGJ1dCBwRHN0VXAgYW5kL29yIHBEc3REb3duIGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDgtYnl0ZSBib3VuZGFyeSAKLSAqICAgIC0gICAgaVdpZHRoPT0xNiBidXQgcERzdFVwIGFuZC9vciBwRHN0RG93biBpcy9hcmUgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKLSAgICBPTVhfVTMyIGlTcmNTdGVwLAotICAgIE9NWF9VOCAqcERzdFVwLAotICAgIE9NWF9VOCAqcERzdERvd24sCi0gICAgT01YX1UzMiBpRHN0U3RlcCwKLSAgICBPTVhfVTMyIGlXaWR0aCwKLSAgICBPTVhfVTMyIGlIZWlnaHQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9BdmVyYWdlXzR4ICAgKDYuMy41LjUuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgYXZlcmFnZSBvZiB0d28gNHg0LCA0eDggYmxvY2tzLiAgVGhlIHJlc3VsdCAKLSAqIGlzIHJvdW5kZWQgYWNjb3JkaW5nIHRvIChhK2IrMSkvMi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFByZWQwIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAwIAotICogICBwUHJlZDEgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiAgIGlQcmVkU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgIGlQcmVkU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgIGlEc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGJsb2NrczsgbXVzdCBiZSBlaXRoZXIgNCBvciA4LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFByZWQgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgICAgcFByZWQwLCBwUHJlZDEsIG9yIHBEc3RQcmVkIAotICogICAgLSAgICBwRHN0UHJlZCBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKLSAqICAgIC0gICAgaVByZWRTdGVwMCA8PSAwIG9yIGlQcmVkU3RlcDAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKLSAqICAgIC0gICAgaVByZWRTdGVwMSA8PSAwIG9yIGlQcmVkU3RlcDEgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKLSAqICAgIC0gICAgaURzdFN0ZXAgPD0gMCBvciBpRHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAotICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgNCBvciA4IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfQXZlcmFnZV80eCAoCi0gICAgY29uc3QgT01YX1U4ICpwUHJlZDAsCi0gICAgY29uc3QgT01YX1U4ICpwUHJlZDEsCi0gICAgT01YX1UzMiBpUHJlZFN0ZXAwLAotICAgIE9NWF9VMzIgaVByZWRTdGVwMSwKLSAgICBPTVhfVTggKnBEc3RQcmVkLAotICAgIE9NWF9VMzIgaURzdFN0ZXAsCi0gICAgT01YX1UzMiBpSGVpZ2h0Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfQ2hyb21hREMgICAoNi4zLjUuNi4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyAyeDIgSGFkYW1hcmQgdHJhbnNmb3JtIG9mIGNocm9tYSBEQyBjb2VmZmljaWVudHMgCi0gKiBhbmQgdGhlbiBxdWFudGl6ZXMgdGhlIGNvZWZmaWNpZW50cy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdGhlIDJ4MiBhcnJheSBvZiBjaHJvbWEgREMgY29lZmZpY2llbnRzLiAgOC1ieXRlIAotICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBpUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyOyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCw1MV0uIAotICogICBiSW50cmEgLSBJbmRpY2F0ZSB3aGV0aGVyIHRoaXMgaXMgYW4gSU5UUkEgYmxvY2suIDEtSU5UUkEsIDAtSU5URVIgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBQb2ludGVyIHRvIHRyYW5zZm9ybWVkIGFuZCBxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgOC1ieXRlIAotICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgICAgICBwU3JjRHN0IAotICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0Nocm9tYURDICgKLSAgICBPTVhfUzE2ICpwU3JjRHN0LAotICAgIE9NWF9VMzIgaVFQLAotICAgIE9NWF9VOCBiSW50cmEKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9MdW1hREMgICAoNi4zLjUuNi4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBhIDR4NCBIYWRhbWFyZCB0cmFuc2Zvcm0gb2YgbHVtYSBEQyBjb2VmZmljaWVudHMgCi0gKiBhbmQgdGhlbiBxdWFudGl6ZXMgdGhlIGNvZWZmaWNpZW50cy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdGhlIDR4NCBhcnJheSBvZiBsdW1hIERDIGNvZWZmaWNpZW50cy4gIDE2LWJ5dGUgCi0gKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIGlRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXI7IG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDUxXS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBQb2ludGVyIHRvIHRyYW5zZm9ybWVkIGFuZCBxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgMTYtYnl0ZSAKLSAqICAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjRHN0IAotICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGFuIDE2LWJ5dGUgYm91bmRhcnkgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9MdW1hREMgKAotICAgIE9NWF9TMTYgKnBTcmNEc3QsCi0gICAgT01YX1UzMiBpUVAKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0x1bWFEQyAgICg2LjMuNS42LjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludmVyc2UgNHg0IEhhZGFtYXJkIHRyYW5zZm9ybSBhbmQgdGhlbiBkZXF1YW50aXplcyAKLSAqIHRoZSBjb2VmZmljaWVudHMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSA0eDQgYXJyYXkgb2YgdGhlIDR4NCBIYWRhbWFyZC10cmFuc2Zvcm1lZCBhbmQgCi0gKiAgICAgICAgICAgIHF1YW50aXplZCBjb2VmZmljaWVudHMuICAxNiBieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIGlRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXI7IG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDUxXS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBQb2ludGVyIHRvIGludmVyc2UtdHJhbnNmb3JtZWQgYW5kIGRlcXVhbnRpemVkIGNvZWZmaWNpZW50cy4gIAotICogICAgICAgICAgICAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjIAotICogICAgLSAgICBwU3JjIG9yIHBEc3QgaXMgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9MdW1hREMgKAotICAgIGNvbnN0IE9NWF9TMTYgKnBTcmMsCi0gICAgT01YX1MxNiAqcERzdCwKLSAgICBPTVhfVTMyIGlRUAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfQ2hyb21hREMgICAoNi4zLjUuNi40KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnZlcnNlIDJ4MiBIYWRhbWFyZCB0cmFuc2Zvcm0gYW5kIHRoZW4gZGVxdWFudGl6ZXMgCi0gKiB0aGUgY29lZmZpY2llbnRzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgMngyIGFycmF5IG9mIHRoZSAyeDIgSGFkYW1hcmQtdHJhbnNmb3JtZWQgYW5kIAotICogICAgICAgICAgICBxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgOCBieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIGlRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXI7IG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDUxXS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBQb2ludGVyIHRvIGludmVyc2UtdHJhbnNmb3JtZWQgYW5kIGRlcXVhbnRpemVkIGNvZWZmaWNpZW50cy4gIAotICogICAgICAgICAgICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMgCi0gKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0Nocm9tYURDICgKLSAgICBjb25zdCBPTVhfUzE2ICpwU3JjLAotICAgIE9NWF9TMTYgKnBEc3QsCi0gICAgT01YX1UzMiBpUVAKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1SZXNpZHVhbEFuZEFkZCAgICg2LjMuNS43LjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludmVyc2UgYW4gNHg0IGludGVnZXIgdHJhbnNmb3JtYXRpb24gdG8gcHJvZHVjZSAKLSAqIHRoZSBkaWZmZXJlbmNlIHNpZ25hbCBhbmQgdGhlbiBhZGRzIHRoZSBkaWZmZXJlbmNlIHRvIHRoZSBwcmVkaWN0aW9uIHRvIGdldCAKLSAqIHRoZSByZWNvbnN0cnVjdGVkIHNpZ25hbC4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY1ByZWQgLSBQb2ludGVyIHRvIHByZWRpY3Rpb24gc2lnbmFsLiAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIHBEZXF1YW50Q29lZmYgLSBQb2ludGVyIHRvIHRoZSB0cmFuc2Zvcm1lZCBjb2VmZmljaWVudHMuICA4LWJ5dGUgCi0gKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIGlTcmNQcmVkU3RlcCAtIFN0ZXAgb2YgdGhlIHByZWRpY3Rpb24gYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgIGlEc3RSZWNvblN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiByZWNvbnN0cnVjdGlvbiBidWZmZXI7IG11c3QgYmUgYSAKLSAqICAgICAgICAgICAgbXVsdGlwbGUgb2YgNC4gCi0gKiAgIGJBQyAtIEluZGljYXRlIHdoZXRoZXIgdGhlcmUgaXMgQUMgY29lZmZpY2llbnRzIGluIHRoZSBjb2VmZmljaWVudHMgCi0gKiAgICAgICAgICAgIG1hdHJpeC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RSZWNvbiAtUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gcmVjb25zdHJ1Y3Rpb24gYnVmZmVyLiAgNC1ieXRlIAotICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgICAgIHBTcmNQcmVkLCBwRGVxdWFudENvZWZmLCBwRHN0UmVjb24gCi0gKiAgICAtICAgIHBTcmNQcmVkIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAotICogICAgLSAgICBpU3JjUHJlZFN0ZXAgb3IgaURzdFJlY29uU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgIC0gICAgcERlcXVhbnRDb2VmZiBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1SZXNpZHVhbEFuZEFkZCAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUHJlZCwKLSAgICBjb25zdCBPTVhfUzE2ICpwRGVxdWFudENvZWZmLAotICAgIE9NWF9VOCAqcERzdFJlY29uLAotICAgIE9NWF9VMzIgaVNyY1ByZWRTdGVwLAotICAgIE9NWF9VMzIgaURzdFJlY29uU3RlcCwKLSAgICBPTVhfVTggYkFDCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU3ViQW5kVHJhbnNmb3JtUURRUmVzaWR1YWwgICAoNi4zLjUuOC4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBzdWJ0cmFjdHMgdGhlIHByZWRpY3Rpb24gc2lnbmFsIGZyb20gdGhlIG9yaWdpbmFsIHNpZ25hbCB0byAKLSAqIHByb2R1Y2UgdGhlIGRpZmZlcmVuY2Ugc2lnbmFsIGFuZCB0aGVuIHBlcmZvcm1zIGEgNHg0IGludGVnZXIgdHJhbnNmb3JtIGFuZCAKLSAqIHF1YW50aXphdGlvbi4gVGhlIHF1YW50aXplZCB0cmFuc2Zvcm1lZCBjb2VmZmljaWVudHMgYXJlIHN0b3JlZCBhcyAKLSAqIHBEc3RRdWFudENvZWZmLiBUaGlzIGZ1bmN0aW9uIGNhbiBhbHNvIG91dHB1dCBkZXF1YW50aXplZCBjb2VmZmljaWVudHMgb3IgCi0gKiB1bnF1YW50aXplZCBEQyBjb2VmZmljaWVudHMgb3B0aW9uYWxseSBieSBzZXR0aW5nIHRoZSBwb2ludGVycyAKLSAqIHBEc3REZVF1YW50Q29lZmYsIHBEQ0NvZWZmLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjT3JnIC0gUG9pbnRlciB0byBvcmlnaW5hbCBzaWduYWwuIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBwU3JjUHJlZCAtIFBvaW50ZXIgdG8gcHJlZGljdGlvbiBzaWduYWwuIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBpU3JjT3JnU3RlcCAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIHNpZ25hbCBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAKLSAqICAgICAgICAgICAgNC4gCi0gKiAgIGlTcmNQcmVkU3RlcCAtIFN0ZXAgb2YgdGhlIHByZWRpY3Rpb24gc2lnbmFsIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIAotICogICAgICAgICAgICBvZiA0LiAKLSAqICAgcE51bUNvZWZmIC1OdW1iZXIgb2Ygbm9uLXplcm8gY29lZmZpY2llbnRzIGFmdGVyIHF1YW50aXphdGlvbi4gSWYgdGhpcyAKLSAqICAgICAgICAgICAgcGFyYW1ldGVyIGlzIG5vdCByZXF1aXJlZCwgaXQgaXMgc2V0IHRvIE5VTEwuIAotICogICBuVGhyZXNoU0FEIC0gWmVyby1ibG9jayBlYXJseSBkZXRlY3Rpb24gdGhyZXNob2xkLiBJZiB0aGlzIHBhcmFtZXRlciBpcyAKLSAqICAgICAgICAgICAgbm90IHJlcXVpcmVkLCBpdCBpcyBzZXQgdG8gMC4gCi0gKiAgIGlRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXI7IG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDUxXS4gCi0gKiAgIGJJbnRyYSAtIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgaXMgYW4gSU5UUkEgYmxvY2ssIGVpdGhlciAxLUlOVFJBIG9yIAotICogICAgICAgICAgICAwLUlOVEVSIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0UXVhbnRDb2VmZiAtIFBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCB0cmFuc2Zvcm1lZCBjb2VmZmljaWVudHMuICAKLSAqICAgICAgICAgICAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIHBEc3REZVF1YW50Q29lZmYgLSBQb2ludGVyIHRvIHRoZSBkZXF1YW50aXplZCB0cmFuc2Zvcm1lZCBjb2VmZmljaWVudHMgCi0gKiAgICAgICAgICAgIGlmIHRoaXMgcGFyYW1ldGVyIGlzIG5vdCBlcXVhbCB0byBOVUxMLiAgOC1ieXRlIGFsaWdubWVudCAKLSAqICAgICAgICAgICAgcmVxdWlyZWQuIAotICogICBwRENDb2VmZiAtIFBvaW50ZXIgdG8gdGhlIHVucXVhbnRpemVkIERDIGNvZWZmaWNpZW50IGlmIHRoaXMgcGFyYW1ldGVyIAotICogICAgICAgICAgICBpcyBub3QgZXF1YWwgdG8gTlVMTC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgICAgcFNyY09yZywgcFNyY1ByZWQsIHBOdW1Db2VmZiwgcERzdFF1YW50Q29lZmYsIAotICogICAgICAgICAgICBwRHN0RGVRdWFudENvZWZmLCBwRENDb2VmZiAKLSAqICAgIC0gICAgcFNyY09yZyBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKLSAqICAgIC0gICAgcFNyY1ByZWQgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCi0gKiAgICAtICAgIGlTcmNPcmdTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCi0gKiAgICAtICAgIGlTcmNQcmVkU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAotICogICAgLSAgICBwRHN0UXVhbnRDb2VmZiBvciBwRHN0RGVRdWFudENvZWZmIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1N1YkFuZFRyYW5zZm9ybVFEUVJlc2lkdWFsICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNPcmcsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUHJlZCwKLSAgICBPTVhfVTMyIGlTcmNPcmdTdGVwLAotICAgIE9NWF9VMzIgaVNyY1ByZWRTdGVwLAotICAgIE9NWF9TMTYgKnBEc3RRdWFudENvZWZmLAotICAgIE9NWF9TMTYgKnBEc3REZVF1YW50Q29lZmYsCi0gICAgT01YX1MxNiAqcERDQ29lZmYsCi0gICAgT01YX1M4ICpwTnVtQ29lZmYsCi0gICAgT01YX1UzMiBuVGhyZXNoU0FELAotICAgIE9NWF9VMzIgaVFQLAotICAgIE9NWF9VOCBiSW50cmEKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9HZXRWTENJbmZvICAgKDYuMy41LjkuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gZXh0cmFjdHMgcnVuLWxlbmd0aCBlbmNvZGluZyAoUkxFKSBpbmZvcm1hdGlvbiBmcm9tIHRoZSAKLSAqIGNvZWZmaWNpZW50IG1hdHJpeC4gIFRoZSByZXN1bHRzIGFyZSByZXR1cm5lZCBpbiBhbiBPTVhWQ000UDEwVkxDSW5mbyAKLSAqIHN0cnVjdHVyZS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0NvZWZmIC0gcG9pbnRlciB0byB0aGUgdHJhbnNmb3JtIGNvZWZmaWNpZW50IG1hdHJpeC4gIDgtYnl0ZSAKLSAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgcFNjYW5NYXRyaXggLSBwb2ludGVyIHRvIHRoZSBzY2FuIG9yZGVyIGRlZmluaXRpb24gbWF0cml4LiAgRm9yIGEgbHVtYSAKLSAqICAgICAgICAgICAgYmxvY2sgdGhlIHNjYW4gbWF0cml4IHNob3VsZCBmb2xsb3cgW0lTTzE0NDk2LTEwXSBzZWN0aW9uIDguNS40LCAKLSAqICAgICAgICAgICAgYW5kIHNob3VsZCBjb250YWluIHRoZSB2YWx1ZXMgMCwgMSwgNCwgOCwgNSwgMiwgMywgNiwgOSwgMTIsIDEzLCAKLSAqICAgICAgICAgICAgMTAsIDcsIDExLCAxNCwgMTUuICBGb3IgYSBjaHJvbWEgYmxvY2ssIHRoZSBzY2FuIG1hdHJpeCBzaG91bGQgCi0gKiAgICAgICAgICAgIGNvbnRhaW4gdGhlIHZhbHVlcyAwLCAxLCAyLCAzLiAKLSAqICAgYkFDIC0gaW5kaWNhdGVzIHByZXNlbmNlIG9mIGEgREMgY29lZmZpY2llbnQ7IDAgPSBEQyBjb2VmZmljaWVudCAKLSAqICAgICAgICAgICAgcHJlc2VudCwgMT0gREMgY29lZmZpY2llbnQgYWJzZW50LiAKLSAqICAgTWF4TnVtQ29lZiAtIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBjb250YWluZWQgaW4gdGhlIAotICogICAgICAgICAgICB0cmFuc2Zvcm0gY29lZmZpY2llbnQgbWF0cml4LCBwU3JjQ29lZmYuIFRoZSB2YWx1ZSBzaG91bGQgYmUgMTYgCi0gKiAgICAgICAgICAgIGZvciBibG9ja3Mgb2YgdHlwZSBMVU1BREMsIExVTUFBQywgTFVNQUxFVkVMLCBhbmQgQ0hST01BQUMuIFRoZSAKLSAqICAgICAgICAgICAgdmFsdWUgc2hvdWxkIGJlIDQgZm9yIGJsb2NrcyBvZiB0eXBlIENIUk9NQURDLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFZMQ0luZm8gLSBwb2ludGVyIHRvIHN0cnVjdHVyZSB0aGF0IHN0b3JlcyBpbmZvcm1hdGlvbiBmb3IgCi0gKiAgICAgICAgICAgIHJ1bi1sZW5ndGggY29kaW5nLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICAgICBwU3JjQ29lZmYsIHBTY2FuTWF0cml4LCBwRHN0VkxDSW5mbyAKLSAqICAgIC0gICAgcFNyY0NvZWZmIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0dldFZMQ0luZm8gKAotICAgIGNvbnN0IE9NWF9TMTYgKnBTcmNDb2VmZiwKLSAgICBjb25zdCBPTVhfVTggKnBTY2FuTWF0cml4LAotICAgIE9NWF9VOCBiQUMsCi0gICAgT01YX1UzMiBNYXhOdW1Db2VmLAotICAgIE9NWFZDTTRQMTBWTENJbmZvKnBEc3RWTENJbmZvCi0pOwotCi0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qKiBlbmQgb2YgI2RlZmluZSBfT01YVkNfSF8gKi8KLQotLyoqIEVPRiAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvYXBpL29teFZDX3MuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9hcGkvb214VkNfcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWYzMDQwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9hcGkvb214VkNfcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLTsvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi07Ly8gQ29weXJpZ2h0IChjKSAxOTk5LTIwMDUgVGhlIEtocm9ub3MgR3JvdXAgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkCi07Ly8KLTsvLwotOy8vCi07Ly8KLTsvLwotOy8vCi07Ly8KLTsvLwotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotOy8qKiA9PT09PT09PT09PT09PT0gU3RydWN0dXJlIERlZmluaXRpb24gZm9yIFNhbXBsZSBHZW5lcmF0aW9uID09PT09PT09PT09PT09ICovCi07LyoqIHRyYW5zcGFyZW50IHN0YXR1cyAqLwotCi07ZW51bSB7Ci1PTVhfVklERU9fVFJBTlNQQVJFTlQJRVFVIDA7CS8qKiBXaG9sbHkgdHJhbnNwYXJlbnQgKi8KLU9NWF9WSURFT19QQVJUSUFMCQlFUVUgMTsJLyoqIFBhcnRpYWxseSB0cmFuc3BhcmVudCAqLwotT01YX1ZJREVPX09QQVFVRQkJRVFVIDI7CS8qKiBPcGFxdWUgKi8KLTt9Ci0KLTsvKiogZGlyZWN0aW9uICovCi07ZW51bSB7Ci1PTVhfVklERU9fTk9ORQkJCUVRVSAwOwotT01YX1ZJREVPX0hPUklaT05UQUwJRVFVIDE7Ci1PTVhfVklERU9fVkVSVElDQUwJCUVRVSAyOwotO30KLQotOy8qKiBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIHR5cGUgKi8KLTtlbnVtIHsKLU9NWF9WSURFT19JTlRFR0VSX1BJWEVMIEVRVSAwOwkvKiogY2FzZSBhICovCi1PTVhfVklERU9fSEFMRl9QSVhFTF9YICBFUVUgMTsJLyoqIGNhc2UgYiAqLwotT01YX1ZJREVPX0hBTEZfUElYRUxfWSAgRVFVIDI7CS8qKiBjYXNlIGMgKi8KLU9NWF9WSURFT19IQUxGX1BJWEVMX1hZIEVRVSAzOwkvKiogY2FzZSBkICovCi07fQotCi07ZW51bSB7Ci1PTVhfVVBQRVIgIAkJCQlFUVUgMTsJCS8qKiBzZXQgaWYgdGhlIGFib3ZlIG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlICovCi1PTVhfTEVGVCAgIAkJCQlFUVUgMjsJCS8qKiBzZXQgaWYgdGhlIGxlZnQgbWFjcm9ibG9jayBpcyBhdmFpbGFibGUgKi8KLU9NWF9DRU5URVIgCQkJCUVRVSA0OwotT01YX1JJR0hUCQkJCUVRVSA4OwotT01YX0xPV0VSICAJCQkJRVFVCTE2OwotT01YX1VQUEVSX0xFRlQgIAkJRVFVIDMyOwkJLyoqIHNldCBpZiB0aGUgYWJvdmUtbGVmdCBtYWNyb2Jsb2NrIGlzIGF2YWlsYWJsZSAqLwotT01YX1VQUEVSX1JJR0hUIAkJRVFVIDY0OwkJLyoqIHNldCBpZiB0aGUgYWJvdmUtcmlnaHQgbWFjcm9ibG9jayBpcyBhdmFpbGFibGUgKi8KLU9NWF9MT1dFUl9MRUZUICAJCUVRVSAxMjg7Ci1PTVhfTE9XRVJfUklHSFQgCQlFUVUgMjU2Ci07fQotCi07ZW51bSB7Ci1PTVhfVklERU9fTFVNSU5BTkNFICAJRVFVIDA7CS8qKiBMdW1pbmFuY2UgY29tcG9uZW50ICovCi1PTVhfVklERU9fQ0hST01JTkFOQ0UgIAlFUVUgMTsJLyoqIGNocm9taW5hbmNlIGNvbXBvbmVudCAqLwotT01YX1ZJREVPX0FMUEhBICAJCUVRVSAyOwkvKiogQWxwaGEgY29tcG9uZW50ICovCi07fQotCi07ZW51bSB7Ci1PTVhfVklERU9fSU5URVIJCQlFUVUgMDsJLyoqIFAgcGljdHVyZSBvciBQLVZPUCAqLwotT01YX1ZJREVPX0lOVEVSX1EJCUVRVSAxOwkvKiogUCBwaWN0dXJlIG9yIFAtVk9QICovCi1PTVhfVklERU9fSU5URVI0VgkJRVFVIDI7CS8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKi8KLU9NWF9WSURFT19JTlRSQQkJCUVRVSAzOwkvKiogSSBhbmQgUCBwaWN0dXJlOyBJLSBhbmQgUC1WT1AgKi8KLU9NWF9WSURFT19JTlRSQV9RCQlFUVUgNDsJLyoqIEkgYW5kIFAgcGljdHVyZTsgSS0gYW5kIFAtVk9QICovCi1PTVhfVklERU9fSU5URVI0Vl9RCQlFUVUgNTsJLyoqIFAgcGljdHVyZSBvciBQLVZPUCAoSC4yNjMpKi8KLU9NWF9WSURFT19ESVJFQ1QJCUVRVSA2OwkvKiogQiBwaWN0dXJlIG9yIEItVk9QIChNUEVHLTQgb25seSkgKi8KLU9NWF9WSURFT19JTlRFUlBPTEFURQlFUVUgNzsJLyoqIEIgcGljdHVyZSBvciBCLVZPUCAqLwotT01YX1ZJREVPX0JBQ0tXQVJECQlFUVUgODsJLyoqIEIgcGljdHVyZSBvciBCLVZPUCAqLwotT01YX1ZJREVPX0ZPUldBUkQJCUVRVSA5OwkvKiogQiBwaWN0dXJlIG9yIEItVk9QICovCi1PTVhfVklERU9fTk9UQ09ERUQJCUVRVSAxMDsJLyoqIEIgcGljdHVyZSBvciBCLVZPUCAqLwotO30KLQotO2VudW0gewotT01YXzE2WDE2X1ZFUlQgCQkJRVFVIDA7CQkvKiogSW50cmFfMTZ4MTZfVmVydGljYWwgKHByZWRpY3Rpb24gbW9kZSkgKi8KLU9NWF8xNlgxNl9IT1IgCQkJRVFVIDE7CQkvKiogSW50cmFfMTZ4MTZfSG9yaXpvbnRhbCAocHJlZGljdGlvbiBtb2RlKSAqLwotT01YXzE2WDE2X0RDIAkJCUVRVSAyOwkJLyoqIEludHJhXzE2eDE2X0RDIChwcmVkaWN0aW9uIG1vZGUpICovCi1PTVhfMTZYMTZfUExBTkUgCQlFUVUgMzsJLyoqIEludHJhXzE2eDE2X1BsYW5lIChwcmVkaWN0aW9uIG1vZGUpICovCi07fQotCi07ZW51bSB7Ci1PTVhfNHg0X1ZFUlQgCQkJRVFVIDA7CQkvKiogSW50cmFfNHg0X1ZlcnRpY2FsIChwcmVkaWN0aW9uIG1vZGUpICovCi1PTVhfNHg0X0hPUiAgCQkJRVFVIDE7CQkvKiogSW50cmFfNHg0X0hvcml6b250YWwgKHByZWRpY3Rpb24gbW9kZSkgKi8KLU9NWF80eDRfREMgICAJCQlFUVUgMjsJCS8qKiBJbnRyYV80eDRfREMgKHByZWRpY3Rpb24gbW9kZSkgKi8KLU9NWF80eDRfRElBR19ETCAJCUVRVSAzOwkvKiogSW50cmFfNHg0X0RpYWdvbmFsX0Rvd25fTGVmdCAocHJlZGljdGlvbiBtb2RlKSAqLwotT01YXzR4NF9ESUFHX0RSIAkJRVFVIDQ7CS8qKiBJbnRyYV80eDRfRGlhZ29uYWxfRG93bl9SaWdodCAocHJlZGljdGlvbiBtb2RlKSAqLwotT01YXzR4NF9WUiAJCQkJRVFVIDU7CQkJLyoqIEludHJhXzR4NF9WZXJ0aWNhbF9SaWdodCAocHJlZGljdGlvbiBtb2RlKSAqLwotT01YXzR4NF9IRCAJCQkJRVFVIDY7CQkJLyoqIEludHJhXzR4NF9Ib3Jpem9udGFsX0Rvd24gKHByZWRpY3Rpb24gbW9kZSkgKi8KLU9NWF80eDRfVkwgCQkJCUVRVSA3OwkJCS8qKiBJbnRyYV80eDRfVmVydGljYWxfTGVmdCAocHJlZGljdGlvbiBtb2RlKSAqLwotT01YXzR4NF9IVSAJCQkJRVFVIDg7CQkJLyoqIEludHJhXzR4NF9Ib3Jpem9udGFsX1VwIChwcmVkaWN0aW9uIG1vZGUpICovCi07fQotCi07ZW51bSB7Ci1PTVhfQ0hST01BX0RDIAkJCUVRVSAwOwkJLyoqIEludHJhX0Nocm9tYV9EQyAocHJlZGljdGlvbiBtb2RlKSAqLwotT01YX0NIUk9NQV9IT1IgCQkJRVFVIDE7CQkvKiogSW50cmFfQ2hyb21hX0hvcml6b250YWwgKHByZWRpY3Rpb24gbW9kZSkgKi8KLU9NWF9DSFJPTUFfVkVSVCAJCUVRVSAyOwkvKiogSW50cmFfQ2hyb21hX1ZlcnRpY2FsIChwcmVkaWN0aW9uIG1vZGUpICovCi1PTVhfQ0hST01BX1BMQU5FIAkJRVFVIDM7CS8qKiBJbnRyYV9DaHJvbWFfUGxhbmUgKHByZWRpY3Rpb24gbW9kZSkgKi8KLTt9Ci0KLTt0eXBlZGVmCXN0cnVjdCB7CQoteAlFUVUJMDsKLXkJRVFVCTQ7Ci07fU9NWENvb3JkaW5hdGU7Ci0KLTt0eXBlZGVmIHN0cnVjdCB7Ci1keAlFUVUJMDsKLWR5CUVRVQkyOwotO31PTVhNb3Rpb25WZWN0b3I7Ci0KLTt0eXBlZGVmIHN0cnVjdCB7Ci14eAkJRVFVCTA7Ci15eQkJRVFVCTQ7Ci13aWR0aAlFUVUJODsKLWhlaWdodAlFUVUJMTI7Ci07fU9NWGlSZWN0OwotCi07dHlwZWRlZiBlbnVtIHsKLU9NWF9WQ19JTlRFUiAgICAgICAgIEVRVSAwOyAgICAgICAgLyoqIFAgcGljdHVyZSBvciBQLVZPUCAqLwotT01YX1ZDX0lOVEVSX1EgICAgICAgRVFVIDE7ICAgICAgIC8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKi8KLU9NWF9WQ19JTlRFUjRWICAgICAgIEVRVSAyOyAgICAgICAvKiogUCBwaWN0dXJlIG9yIFAtVk9QICovCi1PTVhfVkNfSU5UUkEgICAgICAgICBFUVUgMzsgICAgICAgIC8qKiBJIGFuZCBQIHBpY3R1cmUsIEktIGFuZCBQLVZPUCAqLwotT01YX1ZDX0lOVFJBX1EgICAgICAgRVFVIDQ7ICAgICAgIC8qKiBJIGFuZCBQIHBpY3R1cmUsIEktIGFuZCBQLVZPUCAqLwotT01YX1ZDX0lOVEVSNFZfUSAgICAgRVFVIDU7ICAgIC8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKEguMjYzKSovCi07fSBPTVhWQ000UDJNYWNyb2Jsb2NrVHlwZTsKLQotO2VudW0gewotT01YX1ZDX05PTkUgICAgICAgICAgRVFVIDAKLU9NWF9WQ19IT1JJWk9OVEFMICAgIEVRVSAxCi1PTVhfVkNfVkVSVElDQUwgICAgICBFUVUgMiAKLTt9OwotCi0KLQlFTkQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5MTZ4MTZfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5MTZ4MTZfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTZkNTlkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTE2eDE2X3MucworKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLSA7LyoqCi0gOyAqIEZ1bmN0aW9uOiBvbXhWQ0NPTU1fQ29weTE2eDE2Ci0gOyAqCi0gOyAqIERlc2NyaXB0aW9uOgotIDsgKiBDb3BpZXMgdGhlIHJlZmVyZW5jZSAxNngxNiBibG9jayB0byB0aGUgY3VycmVudCBibG9jay4KLSA7ICogUGFyYW1ldGVyczoKLSA7ICogW2luXSBwU3JjICAgICAgICAgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sgaW4gdGhlIHNvdXJjZSBmcmFtZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDE2LWJ5dGUgYm91bmRhcnkuCi0gOyAqIFtpbl0gc3RlcCAgICAgICAgIC0gZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnRzIG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZSByZWZlcmVuY2UgZnJhbWUsIGluIGJ5dGVzOwotIDsgKiAgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNiBhbmQgbXVzdCBiZSBsYXJnZXIgdGhhbiBvciBlcXVhbCB0byAxNi4KLSA7ICogW291dF0gcERzdCAgICAgICAgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4KLSA7ICogUmV0dXJuIFZhbHVlOgotIDsgKiBPTVhfU3RzX05vRXJyICAgICAtIG5vIGVycm9yCi0gOyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLSA7ICogICAgICAgICAgICAgICAgICAgLSBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6ICBwU3JjLCBwRHN0Ci0gOyAqICAgICAgICAgICAgICAgICAgIC0gb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBub3QgYWxpZ25lZCBvbiBhbiAxNi1ieXRlIGJvdW5kYXJ5OiAgcFNyYywgcERzdAotIDsgKiAgICAgICAgICAgICAgICAgICAtIHN0ZXAgPDE2IG9yIHN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuICAKLSA7ICovCi0KLSAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAKLSAgICAgCi0gICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKLSAgICAgCi0gICAgIElGIENvcnRleEE4Ci0gICAgIAotICAgICAKLSA7Ly9JbnB1dCBBcmd1bWVudHMKLXBTcmMgICAgUk4gMCAgICAgICAgCi1wRHN0ICAgIFJOIDEgICAgICAgIAotc3RlcCAgICBSTiAyCi0KLTsvL0xvY2FsIFZhcmlhYmxlcwotUmV0dXJuICBSTiAwCi07Ly8gTmVvbiBSZWdpc3RlcnMKLQotWDAgICAgICBETiBEMC5TOCAKLVgxICAgICAgRE4gRDEuUzggCi1YMiAgICAgIEROIEQyLlM4Ci1YMyAgICAgIEROIEQzLlM4Ci1YNCAgICAgIEROIEQ0LlM4Ci1YNSAgICAgIEROIEQ1LlM4Ci1YNiAgICAgIEROIEQ2LlM4Ci1YNyAgICAgIEROIEQ3LlM4IAotIAotICAgICBNX1NUQVJUIG9teFZDQ09NTV9Db3B5MTZ4MTYKLSAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgVkxEMSAge1gwLFgxfSxbcFNyY0AxMjhdLHN0ZXAgICAgICAgOy8vIExvYWQgMTYgYnl0ZXMgZnJvbSAxNiBieXRlIGFsaWduZWQgcFNyYyBhbmQgcFNyYz1wU3JjICsgc3RlcCBhZnRlciBsb2FkaW5nCi0gICAgICAgIFZMRDEgIHtYMixYM30sW3BTcmNAMTI4XSxzdGVwCi0gICAgICAgIFZMRDEgIHtYNCxYNX0sW3BTcmNAMTI4XSxzdGVwCi0gICAgICAgIFZMRDEgIHtYNixYN30sW3BTcmNAMTI4XSxzdGVwCi0gICAgICAgIAotICAgICAgICBWU1QxICB7WDAsWDEsWDIsWDN9LFtwRHN0QDEyOF0hICAgICA7Ly8gU3RvcmUgMzIgYnl0ZXMgdG8gMTYgYnl0ZSBhbGlnbmVkIHBEc3QgICAKLSAgICAgICAgVlNUMSAge1g0LFg1LFg2LFg3fSxbcERzdEAxMjhdISAgICAgICAgCi0gICAgICAgICAgICAgICAKLSAgICAgICAgIAotICAgICAgICBWTEQxICB7WDAsWDF9LFtwU3JjQDEyOF0sc3RlcAotICAgICAgICBWTEQxICB7WDIsWDN9LFtwU3JjQDEyOF0sc3RlcAotICAgICAgICBWTEQxICB7WDQsWDV9LFtwU3JjQDEyOF0sc3RlcAotICAgICAgICBWTEQxICB7WDYsWDd9LFtwU3JjQDEyOF0sc3RlcAotICAgICAgICAKLSAgICAgICAgVlNUMSAge1gwLFgxLFgyLFgzfSxbcERzdEAxMjhdIQotICAgICAgICBWU1QxICB7WDQsWDUsWDYsWDd9LFtwRHN0QDEyOF0hCi0gICAgICAgICAKLSAgICAgIAotICAgICAgICBWTEQxICB7WDAsWDF9LFtwU3JjQDEyOF0sc3RlcAotICAgICAgICBWTEQxICB7WDIsWDN9LFtwU3JjQDEyOF0sc3RlcAotICAgICAgICBWTEQxICB7WDQsWDV9LFtwU3JjQDEyOF0sc3RlcAotICAgICAgICBWTEQxICB7WDYsWDd9LFtwU3JjQDEyOF0sc3RlcAotICAgICAgICAKLSAgICAgICAgVlNUMSAge1gwLFgxLFgyLFgzfSxbcERzdEAxMjhdISAgICAgICAgICAgICAgCi0gICAgICAgIFZTVDEgIHtYNCxYNSxYNixYN30sW3BEc3RAMTI4XSEgICAgICAgIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFZMRDEgIHtYMCxYMX0sW3BTcmNAMTI4XSxzdGVwCi0gICAgICAgIFZMRDEgIHtYMixYM30sW3BTcmNAMTI4XSxzdGVwCi0gICAgICAgIFZMRDEgIHtYNCxYNX0sW3BTcmNAMTI4XSxzdGVwCi0gICAgICAgIFZMRDEgIHtYNixYN30sW3BTcmNAMTI4XSxzdGVwCi0gICAgICAgIAotICAgICAgICBWU1QxICB7WDAsWDEsWDIsWDN9LFtwRHN0QDEyOF0hCi0gICAgICAgIFZTVDEgIHtYNCxYNSxYNixYN30sW3BEc3RAMTI4XSEKLQotICAgICAgICAKLSAgICAgICAgTU9WICAgUmV0dXJuLCNPTVhfU3RzX05vRXJyCi0KLSAgICAgCi0gICAgICAgIAotICAgICAgICBNX0VORAotICAgICAgICBFTkRJRgotCi0KLQotICAgICAgICAKLSAgICAgICAgRU5ECi0gICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5OHg4X3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTh4OF9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiOWU1ZWYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5OHg4X3MucworKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLSA7LyoqCi0gOyAqIEZ1bmN0aW9uOiBvbXhWQ0NPTU1fQ29weTh4OAotIDsgKgotIDsgKiBEZXNjcmlwdGlvbjoKLSA7ICogQ29waWVzIHRoZSByZWZlcmVuY2UgOHg4IGJsb2NrIHRvIHRoZSBjdXJyZW50IGJsb2NrLgotIDsgKiBQYXJhbWV0ZXJzOgotIDsgKiBbaW5dIHBTcmMgICAgICAgICAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jayBpbiB0aGUgc291cmNlIGZyYW1lOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LgotIDsgKiBbaW5dIHN0ZXAgICAgICAgICAtIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0cyBvZiBjb25zZWN1dGl2ZSBsaW5lcyBpbiB0aGUgcmVmZXJlbmNlIGZyYW1lLCBpbiBieXRlczsKLSA7ICogICAgICAgICAgICAgICAgICAgICBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOCBhbmQgbXVzdCBiZSBsYXJnZXIgdGhhbiBvciBlcXVhbCB0byA4LgotIDsgKiBbb3V0XSBwRHN0ICAgICAgICAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LgotIDsgKiBSZXR1cm4gVmFsdWU6Ci0gOyAqIE9NWF9TdHNfTm9FcnIgICAgIC0gbm8gZXJyb3IKLSA7ICogT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotIDsgKiAgICAgICAgICAgICAgICAgICAtIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogIHBTcmMsIHBEc3QKLSA7ICogICAgICAgICAgICAgICAgICAgLSBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeTogIHBTcmMsIHBEc3QKLSA7ICogICAgICAgICAgICAgICAgICAgLSBzdGVwIDw4IG9yIHN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gIAotIDsgKi8KLQotICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgIAotICAgICAKLSAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAotICAgICAKLSAgICAgSUYgQ29ydGV4QTgKLSAgICAgCi0gICAgIAotIDsvL0lucHV0IEFyZ3VtZW50cwotcFNyYyAgICBSTiAwICAgICAgICAKLXBEc3QgICAgUk4gMSAgICAgICAgCi1zdGVwICAgIFJOIDIKLQotOy8vTG9jYWwgVmFyaWFibGVzCi1Db3VudCAgIFJOIDMKLVJldHVybiAgUk4gMAotOy8vIE5lb24gUmVnaXN0ZXJzCi0KLVgwICAgICAgRE4gRDAuUzggCi1YMSAgICAgIEROIEQxLlM4Ci1YMiAgICAgIEROIEQyLlM4Ci1YMyAgICAgIEROIEQzLlM4Ci0gICAgIE1fU1RBUlQgb214VkNDT01NX0NvcHk4eDgKLSAgICAgICAgCi0gICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFZMRDEgIHtYMH0sW3BTcmNdLHN0ZXAgICAgICAgICAgICA7Ly8gTG9hZCA4IGJ5dGVzIGZyb20gOCBieXRlIGFsaWduZWQgcFNyYywgcFNyYz1wU3JjK3N0ZXAgYWZ0ZXIgbG9hZAotICAgICAgICBWTEQxICB7WDF9LFtwU3JjXSxzdGVwCi0gICAgICAgIFZMRDEgIHtYMn0sW3BTcmNdLHN0ZXAKLSAgICAgICAgVkxEMSAge1gzfSxbcFNyY10sc3RlcAotICAgICAgICAKLSAgICAgICAgVlNUMSAge1gwLFgxfSxbcERzdF0hICAgICAgICAgICAgOy8vIFN0b3JlIDE2IGJ5dGVzIHRvIDggYnl0ZSBhbGlnbmVkIHBEc3QgIAotICAgICAgICBWU1QxICB7WDIsWDN9LFtwRHN0XSEgICAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgVkxEMSAge1gwfSxbcFNyY10sc3RlcAotICAgICAgICBWTEQxICB7WDF9LFtwU3JjXSxzdGVwCi0gICAgICAgIFZMRDEgIHtYMn0sW3BTcmNdLHN0ZXAKLSAgICAgICAgVkxEMSAge1gzfSxbcFNyY10sc3RlcAotICAgICAgICAKLSAgICAgICAgVlNUMSAge1gwLFgxfSxbcERzdF0hICAgICAgICAgICAgICAKLSAgICAgICAgVlNUMSAge1gyLFgzfSxbcERzdF0hICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotICAgICAgICBNT1YgICBSZXR1cm4sI09NWF9TdHNfTm9FcnIKLSAgICAgICAgICAgICAKLSAgICAgICAgTV9FTkQKLSAgICAgICAgRU5ESUYKLQotCi0KLSAgICAgICAgCi0gICAgICAgIEVORAotICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvY29tbS9zcmMvb214VkNDT01NX0V4cGFuZEZyYW1lX0lfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9FeHBhbmRGcmFtZV9JX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q2YjY2OS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvY29tbS9zcmMvb214VkNDT01NX0V4cGFuZEZyYW1lX0lfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjUwICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBvbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSV9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICAxMjI5MAotOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi07Ly8gRGVzY3JpcHRpb246Ci07Ly8gVGhpcyBmdW5jdGlvbiB3aWxsIEV4cGFuZCBGcmFtZSBib3VuZGFyeSBwaXhlbHMgaW50byBQbGFuZQotOy8vIAotOy8vIAotCi07Ly8gSW5jbHVkZSBzdGFuZGFyZCBoZWFkZXJzCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgICAKLSAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAotCi07Ly8gSW1wb3J0IHN5bWJvbHMgcmVxdWlyZWQgZnJvbSBvdGhlciBmaWxlcwotOy8vIChGb3IgZXhhbXBsZSB0YWJsZXMpCi0gICAgCi0gIAotOy8vIFNldCBkZWJ1Z2dpbmcgbGV2ZWwgICAgICAgIAotREVCVUdfT04gICAgU0VUTCB7RkFMU0V9Ci0KLQotICAgIAotICAgIElGIENvcnRleEE4Ci0gICAgCi0gICAgICAgIE1fU1RBUlQgb214VkNDT01NX0V4cGFuZEZyYW1lX0kscjExCi0KLTsvL0lucHV0IHJlZ2lzdGVycwotCi1wU3JjRHN0UGxhbmUgICAgUk4gIDAKLWlGcmFtZVdpZHRoICAgICBSTiAgMQotaUZyYW1lSGVpZ2h0ICAgIFJOICAyICAgIAotaUV4cGFuZFBlbHMgICAgIFJOICAzCi1pUGxhbmVTdGVwICAgICAgUk4gIDQKLXBUb3AgICAgICAgICAgICBSTiAgNQotcEJvdCAgICAgICAgICAgIFJOICA2Ci1wRHN0VG9wICAgICAgICAgUk4gIDcKLXBEc3RCb3QgICAgICAgICBSTiAgOAotcExlZnQgICAgICAgICAgIFJOICA1Ci1wUmlnaHQgICAgICAgICAgUk4gIDYKLXBEc3RMZWZ0ICAgICAgICBSTiAgOQotcERzdFJpZ2h0ICAgICAgIFJOICAxMAotT2Zmc2V0ICAgICAgICAgIFJOICAxMQotVGVtcCAgICAgICAgICAgIFJOICAxNAotQ291bnRlciAgICAgICAgIFJOICAxMgotVG1wICAgICAgICAgICAgIFJOICA3Ci07Ly9PdXRwdXQgcmVnaXN0ZXJzCi0KLXJlc3VsdCAgICAgICAgICBSTiAgMAotOy8vIE5lb24gcmVnaXN0ZXJzCi1xRGF0YTAgICAgICAgICAgUU4gIDAuVTgKLXFEYXRhMSAgICAgICAgICBRTiAgMS5VOAotZERhdGEwICAgICAgICAgIEROICAwLlU4Ci1kRGF0YTEgICAgICAgICAgRE4gIDEuVTgKLWREYXRhMiAgICAgICAgICBETiAgMi5VOAotZERhdGEzICAgICAgICAgIEROICAzLlU4Ci0KLSAgICAgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKLSAgICAgICAgTV9BUkcgICAgICAgcFBsYW5lU3RlcCwgNAotICAgICAgICAKLSAgICAgICAgOy8vIExvYWQgYXJndW1lbnQgZnJvbSB0aGUgc3RhY2sKLSAgICAgICAgTV9MRFIgICAgICAgaVBsYW5lU3RlcCwgcFBsYW5lU3RlcAotICAgICAgICAKLSAgICAgICAgU1VCICAgICAgICAgcFRvcCwgcFNyY0RzdFBsYW5lLCAjMCAgICAgICAgICAgICAgOy8vIFRvcCByb3cgcG9pbnRlciBvZiB0aGUgZnJhbWUKLSAgICAgICAgTVVMICAgICAgICAgT2Zmc2V0LCBpRXhwYW5kUGVscywgaVBsYW5lU3RlcCAgICAgOy8vIEUqU3RlcCAgICAgICAgCi0gICAgICAgIFNVQiAgICAgICAgIFRlbXAsIGlGcmFtZUhlaWdodCwgIzEgICAgICAgICAgICAgIDsvLyBILTEKLSAgICAgICAgTVVMICAgICAgICAgVGVtcCwgaVBsYW5lU3RlcCwgVGVtcCAgICAgICAgICAgICAgOy8vIChILTEpKlN0ZXAKLSAgICAgICAgQUREICAgICAgICAgcEJvdCwgVGVtcCwgcFNyY0RzdFBsYW5lICAgICAgICAgICAgOy8vIEJQdHIgPSBUUHRyICsgKEgtMSkqU3RlcAotICAgICAgICBNT1YgICAgICAgICBUZW1wLCBpRnJhbWVXaWR0aCAgICAgICAgICAgICAgICAgICA7Ly8gT3V0ZXIgbG9vcCBjb3VudGVyCi0gICAgICAgIAotICAgICAgICA7Ly8gQ2hlY2sgaWYgcFNyY0RzdFBsYW5lIGFuZCBpUGxhbmVTdGVwIGFyZSAxNiBieXRlIGFsaWduZWQKLSAgICAgICAgVFNUICAgICAgICAgcFNyY0RzdFBsYW5lLCAjMHhmCi0gICAgICAgIFRTVEVRICAgICAgIGlQbGFuZVN0ZXAsICMweGYgICAgICAgIAotICAgICAgICBCTkUgICAgICAgICBIb3I4TG9vcDAwCi0gICAgICAgIAotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIENvcHkgdG9wIGFuZCBib3R0b20gcmVnaW9uIG9mIHRoZSBwbGFuZSBhcyBmb2xsb3dzCi0gICAgICAgIDsvLyB0b3AgcmVnaW9uID0gdG9wIHJvdyBlbGVtZW50cyBmcm9tIHRoZSBmcmFtZQotICAgICAgICA7Ly8gYm90dG9tIHJlZ2lvbiA9IGxhc3Qgcm93IGVsZW1lbnRzIGZyb20gdGhlIGZyYW1lCi0gICAgICAgIDsvLwotCi0gICAgICAgIDsvLyBDYXNlIGZvciAxNiBieXRlIGFsaWdubWVudAotSG9yMTZMb29wMDAKLSAgICAgICAgU1VCICAgICAgICAgcERzdFRvcCwgcFRvcCwgT2Zmc2V0Ci0gICAgICAgIFZMRDEgICAgICAgIHFEYXRhMCwgW3BUb3AgQDEyOF0hCi0gICAgICAgIE1PViAgICAgICAgIENvdW50ZXIsIGlFeHBhbmRQZWxzICAgICAgICAgICAgICAgIDsvLyBJbm5lciBsb29wIGNvdW50ZXIKLSAgICAgICAgQUREICAgICAgICAgcERzdEJvdCwgcEJvdCwgaVBsYW5lU3RlcAotICAgICAgICBWTEQxICAgICAgICBxRGF0YTEsIFtwQm90IEAxMjhdIQotVmVyMTZMb29wMAotICAgICAgICBWU1QxICAgICAgICBxRGF0YTAsIFtwRHN0VG9wIEAxMjhdLCBpUGxhbmVTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIHFEYXRhMCwgW3BEc3RUb3AgQDEyOF0sIGlQbGFuZVN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgcURhdGEwLCBbcERzdFRvcCBAMTI4XSwgaVBsYW5lU3RlcAotICAgICAgICBWU1QxICAgICAgICBxRGF0YTAsIFtwRHN0VG9wIEAxMjhdLCBpUGxhbmVTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIHFEYXRhMCwgW3BEc3RUb3AgQDEyOF0sIGlQbGFuZVN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgcURhdGEwLCBbcERzdFRvcCBAMTI4XSwgaVBsYW5lU3RlcAotICAgICAgICBWU1QxICAgICAgICBxRGF0YTAsIFtwRHN0VG9wIEAxMjhdLCBpUGxhbmVTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIHFEYXRhMCwgW3BEc3RUb3AgQDEyOF0sIGlQbGFuZVN0ZXAKLSAgICAgICAgU1VCUyAgICAgICAgQ291bnRlciwgQ291bnRlciwgIzgKLSAgICAgICAgVlNUMSAgICAgICAgcURhdGExLCBbcERzdEJvdCBAMTI4XSwgaVBsYW5lU3RlcAotICAgICAgICBWU1QxICAgICAgICBxRGF0YTEsIFtwRHN0Qm90IEAxMjhdLCBpUGxhbmVTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIHFEYXRhMSwgW3BEc3RCb3QgQDEyOF0sIGlQbGFuZVN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgcURhdGExLCBbcERzdEJvdCBAMTI4XSwgaVBsYW5lU3RlcAotICAgICAgICBWU1QxICAgICAgICBxRGF0YTEsIFtwRHN0Qm90IEAxMjhdLCBpUGxhbmVTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIHFEYXRhMSwgW3BEc3RCb3QgQDEyOF0sIGlQbGFuZVN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgcURhdGExLCBbcERzdEJvdCBAMTI4XSwgaVBsYW5lU3RlcAotICAgICAgICBWU1QxICAgICAgICBxRGF0YTEsIFtwRHN0Qm90IEAxMjhdLCBpUGxhbmVTdGVwICAgICAgICAKLSAgICAgICAgQkdUICAgICAgICAgVmVyMTZMb29wMAotCi0gICAgICAgIFNVQlMgICAgICAgIFRlbXAsIFRlbXAsICMxNgotICAgICAgICBCR1QgICAgICAgICBIb3IxNkxvb3AwMAotICAgICAgICBCICAgICAgICAgICBFbmRBbGlnbmVkTG9vcAotICAgICAgICAKLSAgICAgICAgOy8vIENhc2UgZm9yIDggYnl0ZSBhbGlnbm1lbnQKLUhvcjhMb29wMDAKLSAgICAgICAgU1VCICAgICAgICAgcERzdFRvcCwgcFRvcCwgT2Zmc2V0Ci0gICAgICAgIFZMRDEgICAgICAgIHFEYXRhMCwgW3BUb3AgQDY0XSEKLSAgICAgICAgTU9WICAgICAgICAgQ291bnRlciwgaUV4cGFuZFBlbHMgICAgICAgICAgICAgICAgOy8vIElubmVyIGxvb3AgY291bnRlcgotICAgICAgICBBREQgICAgICAgICBwRHN0Qm90LCBwQm90LCBpUGxhbmVTdGVwCi0gICAgICAgIFZMRDEgICAgICAgIHFEYXRhMSwgW3BCb3QgQDY0XSEKLVZlcjhMb29wMAotICAgICAgICBWU1QxICAgICAgICBxRGF0YTAsIFtwRHN0VG9wIEA2NF0sIGlQbGFuZVN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgcURhdGEwLCBbcERzdFRvcCBANjRdLCBpUGxhbmVTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIHFEYXRhMCwgW3BEc3RUb3AgQDY0XSwgaVBsYW5lU3RlcAotICAgICAgICBWU1QxICAgICAgICBxRGF0YTAsIFtwRHN0VG9wIEA2NF0sIGlQbGFuZVN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgcURhdGEwLCBbcERzdFRvcCBANjRdLCBpUGxhbmVTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIHFEYXRhMCwgW3BEc3RUb3AgQDY0XSwgaVBsYW5lU3RlcAotICAgICAgICBWU1QxICAgICAgICBxRGF0YTAsIFtwRHN0VG9wIEA2NF0sIGlQbGFuZVN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgcURhdGEwLCBbcERzdFRvcCBANjRdLCBpUGxhbmVTdGVwCi0gICAgICAgIFNVQlMgICAgICAgIENvdW50ZXIsIENvdW50ZXIsICM4Ci0gICAgICAgIFZTVDEgICAgICAgIHFEYXRhMSwgW3BEc3RCb3QgQDY0XSwgaVBsYW5lU3RlcAotICAgICAgICBWU1QxICAgICAgICBxRGF0YTEsIFtwRHN0Qm90IEA2NF0sIGlQbGFuZVN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgcURhdGExLCBbcERzdEJvdCBANjRdLCBpUGxhbmVTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIHFEYXRhMSwgW3BEc3RCb3QgQDY0XSwgaVBsYW5lU3RlcAotICAgICAgICBWU1QxICAgICAgICBxRGF0YTEsIFtwRHN0Qm90IEA2NF0sIGlQbGFuZVN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgcURhdGExLCBbcERzdEJvdCBANjRdLCBpUGxhbmVTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIHFEYXRhMSwgW3BEc3RCb3QgQDY0XSwgaVBsYW5lU3RlcAotICAgICAgICBWU1QxICAgICAgICBxRGF0YTEsIFtwRHN0Qm90IEA2NF0sIGlQbGFuZVN0ZXAgICAgICAgIAotICAgICAgICBCR1QgICAgICAgICBWZXI4TG9vcDAKLQotICAgICAgICBTVUJTICAgICAgICBUZW1wLCBUZW1wLCAjMTYKLSAgICAgICAgQkdUICAgICAgICAgSG9yOExvb3AwMAotCi1FbmRBbGlnbmVkTG9vcAotICAgICAgICBBREQgICAgICAgICBUZW1wLCBwU3JjRHN0UGxhbmUsIGlGcmFtZVdpZHRoCi0gICAgICAgIFNVQiAgICAgICAgIHBEc3RSaWdodCwgVGVtcCwgT2Zmc2V0Ci0gICAgICAgIFNVQiAgICAgICAgIHBSaWdodCwgVGVtcCwgIzEKLSAgICAgICAgU1VCICAgICAgICAgcERzdExlZnQsIHBTcmNEc3RQbGFuZSwgT2Zmc2V0ICAgIAotICAgICAgICBTVUIgICAgICAgICBwRHN0TGVmdCwgcERzdExlZnQsIGlFeHBhbmRQZWxzICAgIAotICAgICAgICBBREQgICAgICAgICBwTGVmdCwgcFNyY0RzdFBsYW5lLCAjMAotICAgICAgICAKLSAgICAgICAgVkxEMSAgICAgICAge2REYXRhMCBbXX0sIFtwTGVmdF0sIGlQbGFuZVN0ZXAgICAgICAgIDsvLyBUb3AtTGVmdCBjb3JuZXIgcGl4ZWwgZnJvbSBmcmFtZSBkdXBsaWNhdGVkIGluIGREYXRhMAotICAgICAgICBTVUIgICAgICAgICBPZmZzZXQsIGlQbGFuZVN0ZXAsIGlFeHBhbmRQZWxzCi0gICAgICAgIFZMRDEgICAgICAgIHtkRGF0YTEgW119LCBbcFJpZ2h0XSwgaVBsYW5lU3RlcCAgICAgICA7Ly8gVG9wLVJpZ2h0IGNvcm5lciBwaXhlbCBmcm9tIGZyYW1lIGR1cGxpY2F0ZWQgaW4gZERhdGExCi0gICAgICAgIE1PViAgICAgICAgIFRlbXAsIGlFeHBhbmRQZWxzCi0KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBDb3B5IHRvcC1sZWZ0IGFuZCB0b3AtcmlnaHQgcmVnaW9uIG9mIHRoZSBwbGFuZSBhcyBmb2xsb3dzCi0gICAgICAgIDsvLyB0b3AtbGVmdCByZWdpb24gPSB0b3AtbGVmdCBjb3JuZXIgcGl4ZWwgZnJvbSB0aGUgZnJhbWUKLSAgICAgICAgOy8vIHRvcC1yaWdodCByZWdpb24gPSB0b3AtcmlnaHQgY29ybmVyIHBpeGVsIGZyb20gdGhlIGZyYW1lCi0gICAgICAgIDsvLwotSG9yTG9vcDExCi0gICAgICAgIE1PViAgICAgICAgIENvdW50ZXIsIGlFeHBhbmRQZWxzCi1WZXJMb29wMQotICAgICAgICBWU1QxICAgICAgICBkRGF0YTAsIFtwRHN0TGVmdF0sICM4Ci0gICAgICAgIFNVQlMgICAgICAgIENvdW50ZXIsIENvdW50ZXIsICM4Ci0gICAgICAgIFZTVDEgICAgICAgIGREYXRhMSwgW3BEc3RSaWdodF0sICM4ICAgICAgICAKLSAgICAgICAgQkdUICAgICAgICAgVmVyTG9vcDEKLQotICAgICAgICBTVUJTICAgICAgICBUZW1wLCBUZW1wLCAjMQotICAgICAgICBBREQgICAgICAgICBwRHN0TGVmdCwgcERzdExlZnQsIE9mZnNldAotICAgICAgICBBREQgICAgICAgICBwRHN0UmlnaHQsIHBEc3RSaWdodCwgT2Zmc2V0Ci0gICAgICAgIEJQTCAgICAgICAgIEhvckxvb3AxMQotCi0gICAgICAgIFNVQiAgICAgICAgIGlGcmFtZUhlaWdodCwgaUZyYW1lSGVpZ2h0LCAjMQotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIENvcHkgbGVmdCBhbmQgcmlnaHQgcmVnaW9uIG9mIHRoZSBwbGFuZSBhcyBmb2xsb3dzCi0gICAgICAgIDsvLyBMZWZ0IHJlZ2lvbiA9IGNvcHkgdGhlIHJvdyB3aXRoIGxlZnQgc3RhcnQgcGl4ZWwgZnJvbSB0aGUgZnJhbWUKLSAgICAgICAgOy8vIFJpZ2h0IHJlZ2lvbiA9IGNvcHkgdGhlIHJvdyB3aXRoIHJpZ2h0IGVuZCBwaXhlbCBmcm9tIHRoZSBmcmFtZQotICAgICAgICA7Ly8KLUhvckxvb3AyMgotICAgICAgICBWTEQxICAgICAgICB7ZERhdGEwIFtdfSwgW3BMZWZ0XSwgaVBsYW5lU3RlcAotICAgICAgICBNT1YgICAgICAgICBDb3VudGVyLCBpRXhwYW5kUGVscwotICAgICAgICBWTEQxICAgICAgICB7ZERhdGExIFtdfSwgW3BSaWdodF0sIGlQbGFuZVN0ZXAKLVZlckxvb3AyCi0gICAgICAgIFZTVDEgICAgICAgIGREYXRhMCwgW3BEc3RMZWZ0XSwgIzgKLSAgICAgICAgU1VCUyAgICAgICAgQ291bnRlciwgQ291bnRlciwgIzgKLSAgICAgICAgVlNUMSAgICAgICAgZERhdGExLCBbcERzdFJpZ2h0XSwgIzggICAgICAgIAotICAgICAgICBCR1QgICAgICAgICBWZXJMb29wMgotCi0gICAgICAgIFNVQlMgICAgICAgIGlGcmFtZUhlaWdodCwgaUZyYW1lSGVpZ2h0LCAjMQotICAgICAgICBBREQgICAgICAgICBwRHN0TGVmdCwgcERzdExlZnQsIE9mZnNldAotICAgICAgICBBREQgICAgICAgICBwRHN0UmlnaHQsIHBEc3RSaWdodCwgT2Zmc2V0Ci0gICAgICAgIEJHVCAgICAgICAgIEhvckxvb3AyMgotICAgICAgICAgICAgICAgIAotICAgICAgICBNT1YgICAgICAgICBUZW1wLCBpRXhwYW5kUGVscwotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIENvcHkgYm90dG9tLWxlZnQgYW5kIGJvdHRvbS1yaWdodCByZWdpb24gb2YgdGhlIHBsYW5lIGFzIGZvbGxvd3MKLSAgICAgICAgOy8vIGJvdHRvbS1sZWZ0IHJlZ2lvbiA9IGJvdHRvbS1sZWZ0IGNvcm5lciBwaXhlbCBmcm9tIHRoZSBmcmFtZQotICAgICAgICA7Ly8gYm90dG9tLXJpZ2h0IHJlZ2lvbiA9IGJvdHRvbS1yaWdodCBjb3JuZXIgcGl4ZWwgZnJvbSB0aGUgZnJhbWUKLSAgICAgICAgOy8vCi1Ib3JMb29wMzMKLSAgICAgICAgTU9WICAgICAgICAgQ291bnRlciwgaUV4cGFuZFBlbHMKLVZlckxvb3AzCi0gICAgICAgIFZTVDEgICAgICAgIGREYXRhMCwgW3BEc3RMZWZ0XSwgIzgKLSAgICAgICAgU1VCUyAgICAgICAgQ291bnRlciwgQ291bnRlciwgIzgKLSAgICAgICAgVlNUMSAgICAgICAgZERhdGExLCBbcERzdFJpZ2h0XSwgIzggICAgICAgIAotICAgICAgICBCR1QgICAgICAgICBWZXJMb29wMwotCi0gICAgICAgIFNVQlMgICAgICAgIFRlbXAsIFRlbXAsICMxCi0gICAgICAgIEFERCAgICAgICAgIHBEc3RMZWZ0LCBwRHN0TGVmdCwgT2Zmc2V0Ci0gICAgICAgIEFERCAgICAgICAgIHBEc3RSaWdodCwgcERzdFJpZ2h0LCBPZmZzZXQKLSAgICAgICAgQkdUICAgICAgICAgSG9yTG9vcDMzCi1FbmQKLSAgICAgICAgTU9WICAgICAgICAgcjAsICNPTVhfU3RzX05vRXJyCi0gICAgICAgIAotICAgICAgICBNX0VORCAgICAKLSAgICAKLSAgICBFTkRJRgotCi0KLQotICAgICAgICAKLTsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKLSAgICAKLSAKLSAgICAgICAgICAgIAotICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL2FwaS9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvYXBpL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RkZTlhNy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvYXBpL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIAotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0NBVkxDVGFibGVzLmgKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgMTIyOTAKLSAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotICogCi0gKiAKLSAqIAotICogCi0gKiBIZWFkZXIgZmlsZSBmb3Igb3B0aW1pemVkIEguMjY0IENBTFZDIHRhYmxlcwotICogCi0gKi8KLSAKLSNpZm5kZWYgQVJNVkNNNFAxMF9DQVZMQ1RBQkxFU19ICi0jZGVmaW5lIEFSTVZDTTRQMTBfQ0FWTENUQUJMRVNfSAotICAKLS8qIENBVkxDIHRhYmxlcyAqLwotCi1leHRlcm4gY29uc3QgT01YX1UxNiAqYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNbMThdOwotZXh0ZXJuIGNvbnN0IE9NWF9VMTYgKmFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNbMTVdOwotZXh0ZXJuIGNvbnN0IE9NWF9VMTYgKmFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzWzNdOwotZXh0ZXJuIGNvbnN0IE9NWF9VMTYgKmFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNbMTVdOwotZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1ppZ1phZ180eDRbMTZdOwotZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1ppZ1phZ18yeDJbNF07Ci1leHRlcm4gY29uc3QgT01YX1M4IGFybVZDTTRQMTBfU3VmZml4VG9MZXZlbFs3XTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQXZlcmFnZV80eF9BbGlnbl91bnNhZmVfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0F2ZXJhZ2VfNHhfQWxpZ25fdW5zYWZlX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYzZWI5Yi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQXZlcmFnZV80eF9BbGlnbl91bnNhZmVfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjM2ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0F2ZXJhZ2VfNHhfQWxpZ25fdW5zYWZlX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDEyMjkwCi07Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotCi07Ly8gRnVuY3Rpb25zOgotOy8vICAgICBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduPEFMSUdOTUVOVD5fdW5zYWZlICAKLTsvLwotOy8vIEltcGxlbWVudHMgQXZlcmFnZSBvZiA0eDQgd2l0aCBlcXVhdGlvbiBjID0gKGErYisxKT4+MS4KLTsvLyBGaXJzdCBvcGVyYW5kIHdpbGwgYmUgYXQgb2Zmc2V0IEFMSUdOTUVOVCBmcm9tIGFsaWduZWQgYWRkcmVzcwotOy8vIFNlY29uZCBvcGVyYW5kIHdpbGwgYmUgYXQgYWxpZ25lZCBsb2NhdGlvbiBhbmQgd2lsbCBiZSB1c2VkIGFzIG91dHB1dC4KLTsvLyBkZXN0aW5hdGlvbiBwb2ludGVkIGJ5IChwRHN0KSBmb3IgdmVydGljYWwgaW50ZXJwb2xhdGlvbi4KLTsvLyBUaGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGNvcHkgNCBieXRlcyBpbiBob3Jpem9udGFsIGRpcmVjdGlvbiAKLTsvLwotOy8vIFJlZ2lzdGVycyB1c2VkIGFzIGlucHV0IGZvciB0aGlzIGZ1bmN0aW9uCi07Ly8gcjAscjEscjIscjMgd2hlcmUgcjIgY29udGFpbmluZ3MgYWxpZ25lZCBtZW1vcnkgcG9pbnRlciBhbmQgcjMgc3RlcCBzaXplCi07Ly8KLTsvLyBSZWdpc3RlcnMgcHJlc2VydmVkIGZvciB0b3AgbGV2ZWwgZnVuY3Rpb24KLTsvLyByNCxyNSxyNixyOCxyOSxyMTQKLTsvLwotOy8vIFJlZ2lzdGVycyBtb2RpZmllZCBieSB0aGUgZnVuY3Rpb24KLTsvLyByNyxyMTAscjExLHIxMgotOy8vCi07Ly8gT3V0cHV0IHJlZ2lzdGVycwotOy8vIHIyIC0gcG9pbnRlciB0byB0aGUgYWxpZ25lZCBsb2NhdGlvbgotOy8vIHIzIC0gc3RlcCBzaXplIHRvIHRoaXMgYWxpZ25lZCBsb2NhdGlvbgotCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgICAgCi0gICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0KLSAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24wX3Vuc2FmZQotICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjJfdW5zYWZlCi0gICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduM191bnNhZmUKLQotREVCVUdfT04gICAgU0VUTCB7RkFMU0V9Ci0KLTsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycwotcFByZWQwICAgICAgICAgIFJOIDAKLWlQcmVkU3RlcDAgICAgICBSTiAxCi1wUHJlZDEgICAgICAgICAgUk4gMgotaVByZWRTdGVwMSAgICAgIFJOIDMKLXBEc3RQcmVkICAgICAgICBSTiAyCi1pRHN0U3RlcCAgICAgICAgUk4gMwotCi07Ly8gRGVjbGFyZSBvdGhlciBpbnRlcm1lZGlhdGUgcmVnaXN0ZXJzCi1pUHJlZEEwICAgICAgICAgUk4gMTAKLWlQcmVkQTEgICAgICAgICBSTiAxMQotaVByZWRCMCAgICAgICAgIFJOIDEyCi1pUHJlZEIxICAgICAgICAgUk4gMTQKLVRlbXAxICAgICAgICAgICBSTiA0Ci1UZW1wMiAgICAgICAgICAgUk4gNQotUmVzdWx0QSAgICAgICAgIFJOIDUKLVJlc3VsdEIgICAgICAgICBSTiA0Ci1yMHg4MDgwODA4MCAgICAgUk4gNwotCi0gICAgSUYgQVJNMTEzNkpTCi0gICAgICAgIAotICAgICAgICA7Ly8gVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIGF2ZXJhZ2Ugb2YgNHg0IGJsb2NrIAotICAgICAgICA7Ly8gcFByZWQwIGlzIGF0IGFsaWdubWVudCBvZmZzZXQgMCBhbmQgcFByZWQxIGlzIGFsaWdubWVudCA0Ci0KLSAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24wX3Vuc2FmZSwgcjYKLQotICAgICAgICA7Ly8gQ29kZSBzdGFydCAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgIHIweDgwODA4MDgwLCA9MHg4MDgwODA4MAotCi0gICAgICAgIDsvLyAxc3QgbG9hZAotICAgICAgICBNX0xEUiAgICAgICBpUHJlZEIwLCBbcFByZWQxXQotICAgICAgICBNX0xEUiAgICAgICBpUHJlZEEwLCBbcFByZWQwXSwgaVByZWRTdGVwMCAgICAgICAgCi0gICAgICAgIE1fTERSICAgICAgIGlQcmVkQjEsIFtwUHJlZDEsIGlQcmVkU3RlcDFdCi0gICAgICAgIE1fTERSICAgICAgIGlQcmVkQTEsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwCi0KLSAgICAgICAgOy8vIChhK2IrMSkvMiA9IChhKzI1Ni0oMjU1LWIpKS8yID0gKGEtKDI1NS1iKSkvMiArIDEyOAotICAgICAgICBNVk4gICAgICAgICBpUHJlZEIwLCBpUHJlZEIwCi0gICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjEsIGlQcmVkQjEKLSAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QSwgaVByZWRBMCwgaVByZWRCMAotICAgICAgICBVSFNVQjggICAgICBSZXN1bHRCLCBpUHJlZEExLCBpUHJlZEIxCi0gICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEEsIFJlc3VsdEEsIHIweDgwODA4MDgwCi0gICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEEsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAKLSAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QiwgUmVzdWx0QiwgcjB4ODA4MDgwODAKLSAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QiwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIDJuZCBsb2FkCi0gICAgICAgIE1fTERSICAgICAgIGlQcmVkQTAsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwICAgICAgICAKLSAgICAgICAgTV9MRFIgICAgICAgaVByZWRCMCwgW3BQcmVkMV0KLSAgICAgICAgTV9MRFIgICAgICAgaVByZWRBMSwgW3BQcmVkMF0sIGlQcmVkU3RlcDAKLSAgICAgICAgTV9MRFIgICAgICAgaVByZWRCMSwgW3BQcmVkMSwgaVByZWRTdGVwMV0KLQotICAgICAgICBNVk4gICAgICAgICBpUHJlZEIwLCBpUHJlZEIwCi0gICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEEsIGlQcmVkQTAsIGlQcmVkQjAKLSAgICAgICAgTVZOICAgICAgICAgaVByZWRCMSwgaVByZWRCMQotICAgICAgICBVSFNVQjggICAgICBSZXN1bHRCLCBpUHJlZEExLCBpUHJlZEIxCi0gICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEEsIFJlc3VsdEEsIHIweDgwODA4MDgwICAgICAgICAKLSAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QSwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgIAotICAgICAgICBFT1IgICAgICAgICBSZXN1bHRCLCBSZXN1bHRCLCByMHg4MDgwODA4MAotICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRCLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgICAgICAgICAKLUVuZDAKLSAgICAgICAgTV9FTkQKLQotICAgICAgICA7Ly8gVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIGF2ZXJhZ2Ugb2YgNHg0IGJsb2NrIAotICAgICAgICA7Ly8gcFByZWQwIGlzIGF0IGFsaWdubWVudCBvZmZzZXQgMiBhbmQgcFByZWQxIGlzIGFsaWdubWVudCA0Ci0KLSAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24yX3Vuc2FmZSwgcjYKLQotICAgICAgICA7Ly8gQ29kZSBzdGFydCAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgIHIweDgwODA4MDgwLCA9MHg4MDgwODA4MAotCi0gICAgICAgIDsvLyAxc3QgbG9hZAotICAgICAgICBMRFIgICAgICAgICBUZW1wMSwgW3BQcmVkMCwgIzRdCi0gICAgICAgIE1fTERSICAgICAgIGlQcmVkQTAsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwICAgICAgICAKLSAgICAgICAgTV9MRFIgICAgICAgaVByZWRCMCwgW3BQcmVkMV0KLSAgICAgICAgTV9MRFIgICAgICAgaVByZWRCMSwgW3BQcmVkMSwgaVByZWRTdGVwMV0KLSAgICAgICAgTV9MRFIgICAgICAgVGVtcDIsIFtwUHJlZDAsICM0XQotICAgICAgICBNX0xEUiAgICAgICBpUHJlZEExLCBbcFByZWQwXSwgaVByZWRTdGVwMAotICAgICAgICBNVk4gICAgICAgICBpUHJlZEIwLCBpUHJlZEIwCi0gICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjEsIGlQcmVkQjEgICAgICAgIAotICAgICAgICBNT1YgICAgICAgICBpUHJlZEEwLCBpUHJlZEEwLCBMU1IgIzE2Ci0gICAgICAgIE9SUiAgICAgICAgIGlQcmVkQTAsIGlQcmVkQTAsIFRlbXAxLCBMU0wgIzE2ICAgICAgICAKLSAgICAgICAgTU9WICAgICAgICAgaVByZWRBMSwgaVByZWRBMSwgTFNSICMxNgotICAgICAgICBPUlIgICAgICAgICBpUHJlZEExLCBpUHJlZEExLCBUZW1wMiwgTFNMICMxNgotCi0gICAgICAgIDsvLyAoYStiKzEpLzIgPSAoYSsyNTYtKDI1NS1iKSkvMiA9IChhLSgyNTUtYikpLzIgKyAxMjgKLSAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QSwgaVByZWRBMCwgaVByZWRCMAotICAgICAgICBVSFNVQjggICAgICBSZXN1bHRCLCBpUHJlZEExLCBpUHJlZEIxCi0gICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEEsIFJlc3VsdEEsIHIweDgwODA4MDgwCi0gICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEEsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAKLSAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QiwgUmVzdWx0QiwgcjB4ODA4MDgwODAKLSAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QiwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIDJuZCBsb2FkCi0gICAgICAgIExEUiAgICAgICAgIFRlbXAxLCBbcFByZWQwLCAjNF0KLSAgICAgICAgTV9MRFIgICAgICAgICBpUHJlZEEwLCBbcFByZWQwXSwgaVByZWRTdGVwMCAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgIGlQcmVkQjAsIFtwUHJlZDFdCi0gICAgICAgIExEUiAgICAgICAgIGlQcmVkQjEsIFtwUHJlZDEsIGlQcmVkU3RlcDFdCi0gICAgICAgIExEUiAgICAgICAgIFRlbXAyLCBbcFByZWQwLCAjNF0KLSAgICAgICAgTV9MRFIgICAgICAgICBpUHJlZEExLCBbcFByZWQwXSwgaVByZWRTdGVwMAotICAgICAgICBNVk4gICAgICAgICBpUHJlZEIwLCBpUHJlZEIwCi0gICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjEsIGlQcmVkQjEKLSAgICAgICAgTU9WICAgICAgICAgaVByZWRBMCwgaVByZWRBMCwgTFNSICMxNgotICAgICAgICBPUlIgICAgICAgICBpUHJlZEEwLCBpUHJlZEEwLCBUZW1wMSwgTFNMICMxNiAgICAgICAgCi0gICAgICAgIE1PViAgICAgICAgIGlQcmVkQTEsIGlQcmVkQTEsIExTUiAjMTYKLSAgICAgICAgT1JSICAgICAgICAgaVByZWRBMSwgaVByZWRBMSwgVGVtcDIsIExTTCAjMTYKLQotICAgICAgICBVSFNVQjggICAgICBSZXN1bHRBLCBpUHJlZEEwLCBpUHJlZEIwCi0gICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEIsIGlQcmVkQTEsIGlQcmVkQjEKLSAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QSwgUmVzdWx0QSwgcjB4ODA4MDgwODAgICAgICAgIAotICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRBLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgCi0gICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEIsIFJlc3VsdEIsIHIweDgwODA4MDgwCi0gICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEIsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAgICAgICAgIAotRW5kMgotICAgICAgICBNX0VORAotCi0KLSAgICAgICAgOy8vIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyBhdmVyYWdlIG9mIDR4NCBibG9jayAKLSAgICAgICAgOy8vIHBQcmVkMCBpcyBhdCBhbGlnbm1lbnQgb2Zmc2V0IDMgYW5kIHBQcmVkMSBpcyBhbGlnbm1lbnQgNAotCi0gICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduM191bnNhZmUsIHI2Ci0KLSAgICAgICAgOy8vIENvZGUgc3RhcnQgICAgICAgIAotICAgICAgICBMRFIgICAgICAgICByMHg4MDgwODA4MCwgPTB4ODA4MDgwODAKLQotICAgICAgICA7Ly8gMXN0IGxvYWQKLSAgICAgICAgTERSICAgICAgICAgVGVtcDEsIFtwUHJlZDAsICM0XQotICAgICAgICBNX0xEUiAgICAgICBpUHJlZEEwLCBbcFByZWQwXSwgaVByZWRTdGVwMCAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgIGlQcmVkQjAsIFtwUHJlZDFdCi0gICAgICAgIExEUiAgICAgICAgIGlQcmVkQjEsIFtwUHJlZDEsIGlQcmVkU3RlcDFdCi0gICAgICAgIExEUiAgICAgICAgIFRlbXAyLCBbcFByZWQwLCAjNF0KLSAgICAgICAgTV9MRFIgICAgICAgaVByZWRBMSwgW3BQcmVkMF0sIGlQcmVkU3RlcDAKLQotICAgICAgICBNVk4gICAgICAgICBpUHJlZEIwLCBpUHJlZEIwCi0gICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjEsIGlQcmVkQjEKLSAgICAgICAgTU9WICAgICAgICAgaVByZWRBMCwgaVByZWRBMCwgTFNSICMyNAotICAgICAgICBPUlIgICAgICAgICBpUHJlZEEwLCBpUHJlZEEwLCBUZW1wMSwgTFNMICM4ICAgICAgICAgICAgICAgIAotICAgICAgICBNT1YgICAgICAgICBpUHJlZEExLCBpUHJlZEExLCBMU1IgIzI0Ci0gICAgICAgIE9SUiAgICAgICAgIGlQcmVkQTEsIGlQcmVkQTEsIFRlbXAyLCBMU0wgIzgKLSAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QSwgaVByZWRBMCwgaVByZWRCMAotICAgICAgICBVSFNVQjggICAgICBSZXN1bHRCLCBpUHJlZEExLCBpUHJlZEIxCi0gICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEEsIFJlc3VsdEEsIHIweDgwODA4MDgwCi0gICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEEsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAKLSAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QiwgUmVzdWx0QiwgcjB4ODA4MDgwODAKLSAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QiwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIDJuZCBsb2FkCi0gICAgICAgIExEUiAgICAgICAgIFRlbXAxLCBbcFByZWQwLCAjNF0KLSAgICAgICAgTV9MRFIgICAgICAgaVByZWRBMCwgW3BQcmVkMF0sIGlQcmVkU3RlcDAgICAgICAgIAotICAgICAgICBMRFIgICAgICAgICBpUHJlZEIwLCBbcFByZWQxXQotICAgICAgICBMRFIgICAgICAgICBpUHJlZEIxLCBbcFByZWQxLCBpUHJlZFN0ZXAxXQotICAgICAgICBMRFIgICAgICAgICBUZW1wMiwgW3BQcmVkMCwgIzRdCi0gICAgICAgIE1fTERSICAgICAgIGlQcmVkQTEsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwCi0KLSAgICAgICAgTVZOICAgICAgICAgaVByZWRCMCwgaVByZWRCMAotICAgICAgICBNVk4gICAgICAgICBpUHJlZEIxLCBpUHJlZEIxCi0gICAgICAgIE1PViAgICAgICAgIGlQcmVkQTAsIGlQcmVkQTAsIExTUiAjMjQKLSAgICAgICAgT1JSICAgICAgICAgaVByZWRBMCwgaVByZWRBMCwgVGVtcDEsIExTTCAjOCAgICAgICAgCi0gICAgICAgIE1PViAgICAgICAgIGlQcmVkQTEsIGlQcmVkQTEsIExTUiAjMjQKLSAgICAgICAgT1JSICAgICAgICAgaVByZWRBMSwgaVByZWRBMSwgVGVtcDIsIExTTCAjOAotCi0gICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEEsIGlQcmVkQTAsIGlQcmVkQjAKLSAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QiwgaVByZWRBMSwgaVByZWRCMQotICAgICAgICBFT1IgICAgICAgICBSZXN1bHRBLCBSZXN1bHRBLCByMHg4MDgwODA4MCAgICAgICAgCi0gICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEEsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAKLSAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QiwgUmVzdWx0QiwgcjB4ODA4MDgwODAKLSAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QiwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgICAgICAgICAgCi1FbmQzCi0gICAgICAgIE1fRU5ECi0KLSAgICBFTkRJRgotICAgIAotICAgIEVORAotICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI0YmQ5ZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDM0MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0NBVkxDVGFibGVzLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgMTIyOTAKLSAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotICogCi0gKiAKLSAqIAotICogCi0gKiBPcHRpbWl6ZWQgQ0FWTEMgdGFibGVzIGZvciBILjI2NAotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotCi0jaW5jbHVkZSAiYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oIgotCi0vKiA0eDQgRGVaaWdaYWcgdGFibGUgKi8KLQotY29uc3QgT01YX1U4IGFybVZDTTRQMTBfWmlnWmFnXzR4NFsxNl0gPQotewotICAgIDAsIDEsIDQsIDgsIDUsIDIsIDMsIDYsIDksIDEyLCAxMywgMTAsIDcsIDExLCAxNCwgMTUKLX07Ci0KLS8qIDJ4MiBEZVppZ1phZyB0YWJsZSAqLwotCi1jb25zdCBPTVhfVTggYXJtVkNNNFAxMF9aaWdaYWdfMngyWzRdID0KLXsKLSAgICAwLCAxLCAyLCAzCi19OwotCi0KLS8qCi0gKiBTdWZmaXggVG8gTGV2ZWwgdGFibGUKLSAqIFdlIGluY3JlbWVudCB0aGUgc3VmZml4IGxlbmd0aCBpZiAKLSAqICgoTGV2ZWxDb2RlPj4xKSsxKT4oMzw8KFN1ZmZpeExlbmd0aC0xKSkgJiYgU3VmZml4TGVuZ3RoPDYKLSAqIChMZXZlbENvZGU+PjEpPj0oMzw8KFN1ZmZpeExlbmd0aC0xKSkgICAgJiYgU3VmZml4TGVuZ3RoPDYKLSAqICBMZXZlbENvZGUgICAgPj0gMzw8U3VmZml4TGVuZ3RoICAgICAgICAgJiYgU3VmZml4TGVuZ3RoPDYKLSAqIChMZXZlbENvZGUrMikgPj0gKDM8PFN1ZmZpeExlbmd0aCkrMiAgICAgJiYgU3VmZml4TGVuZ3RoPDYKLSAqLwotY29uc3QgT01YX1M4IGFybVZDTTRQMTBfU3VmZml4VG9MZXZlbFs3XSA9Ci17Ci0gICAgKDM8PDEpKzIsICAgICAgIC8qIFN1ZmZpeExlbmd0aD0xICovCi0gICAgKDM8PDEpKzIsICAgICAgIC8qIFN1ZmZpeExlbmd0aD0xICovCi0gICAgKDM8PDIpKzIsICAgICAgIC8qIFN1ZmZpeExlbmd0aD0yICovCi0gICAgKDM8PDMpKzIsICAgICAgIC8qIFN1ZmZpeExlbmd0aD0zICovCi0gICAgKDM8PDQpKzIsICAgICAgIC8qIFN1ZmZpeExlbmd0aD00ICovCi0gICAgKDM8PDUpKzIsICAgICAgIC8qIFN1ZmZpeExlbmd0aD01ICovCi0gICAgLTEgICAgICAgICAgICAgIC8qIFN1ZmZpeExlbmd0aD02IC0gbmV2ZXIgaW5jcmVtZW50ICovCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18wWzEzMl0gPSB7Ci0gICAgMHgwMDIwLCAweDAxMDAsIDB4MjAxNSwgMHgyMDE1LCAweDQwMGIsIDB4NDAwYiwgMHg0MDBiLCAweDQwMGIsCi0gICAgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsCi0gICAgMHgwMDI4LCAweDAwZjAsIDB4MDBmOCwgMHgwMDI3LCAweDAwMzAsIDB4MDBkOCwgMHgwMGUwLCAweDAwZTgsCi0gICAgMHgwMDM4LCAweDAwYTAsIDB4MDBjOCwgMHgwMGQwLCAweDAwNDAsIDB4MDA2OCwgMHgwMDkwLCAweDAwOTgsCi0gICAgMHgwMDQ4LCAweDAwNTAsIDB4MDA1OCwgMHgwMDYwLCAweDI3ZmYsIDB4MjdmZiwgMHgyMDZiLCAweDIwNmIsCi0gICAgMHgwMDgxLCAweDAwODUsIDB4MDA4MywgMHgwMDc5LCAweDAwODcsIDB4MDA3ZCwgMHgwMDdiLCAweDAwNzEsCi0gICAgMHgwMDdmLCAweDAwNzUsIDB4MDA3MywgMHgwMDY5LCAweDAwNzAsIDB4MDA3OCwgMHgwMDgwLCAweDAwODgsCi0gICAgMHgyMDc3LCAweDIwNzcsIDB4MjA2ZCwgMHgyMDZkLCAweDIwNjMsIDB4MjA2MywgMHgyMDYxLCAweDIwNjEsCi0gICAgMHgyMDZmLCAweDIwNmYsIDB4MjA2NSwgMHgyMDY1LCAweDIwNWIsIDB4MjA1YiwgMHgyMDU5LCAweDIwNTksCi0gICAgMHgwMDY3LCAweDAwNWQsIDB4MDA1MywgMHgwMDUxLCAweDAwNWYsIDB4MDA1NSwgMHgwMDRiLCAweDAwNDksCi0gICAgMHgwMGE4LCAweDAwYjAsIDB4MDBiOCwgMHgwMGMwLCAweDIwNDEsIDB4MjA0MSwgMHgyMDRkLCAweDIwNGQsCi0gICAgMHgyMDQzLCAweDIwNDMsIDB4MjAzOSwgMHgyMDM5LCAweDIwNTcsIDB4MjA1NywgMHgyMDQ1LCAweDIwNDUsCi0gICAgMHgyMDNiLCAweDIwM2IsIDB4MjAzMSwgMHgyMDMxLCAweDIwNGYsIDB4MjA0ZiwgMHgyMDNkLCAweDIwM2QsCi0gICAgMHgyMDMzLCAweDIwMzMsIDB4MjAyOSwgMHgyMDI5LCAweDAwNDcsIDB4MDAzNSwgMHgwMDJiLCAweDAwMjEsCi0gICAgMHgyMDNmLCAweDIwM2YsIDB4MjAyZCwgMHgyMDJkLCAweDIwMjMsIDB4MjAyMywgMHgyMDE5LCAweDIwMTksCi0gICAgMHgwMDM3LCAweDAwMjUsIDB4MDAxYiwgMHgwMDExLCAweDIwMmYsIDB4MjAyZiwgMHgyMDFkLCAweDIwMWQsCi0gICAgMHgwMDEzLCAweDAwMDksIDB4MjAxZiwgMHgyMDFmCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18xWzEyOF0gPSB7Ci0gICAgMHgwMDIwLCAweDAwZTgsIDB4MDBmMCwgMHgwMGY4LCAweDAwMjcsIDB4MDAxZiwgMHgyMDE1LCAweDIwMTUsCi0gICAgMHg0MDBiLCAweDQwMGIsIDB4NDAwYiwgMHg0MDBiLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEsCi0gICAgMHgwMDI4LCAweDAwZDAsIDB4MDBkOCwgMHgwMGUwLCAweDAwMzAsIDB4MDA5OCwgMHgwMGMwLCAweDAwYzgsCi0gICAgMHgwMDM4LCAweDAwNjAsIDB4MDA4OCwgMHgwMDkwLCAweDAwNDAsIDB4MDA0OCwgMHgwMDUwLCAweDAwNTgsCi0gICAgMHgyN2ZmLCAweDI3ZmYsIDB4MjA3ZiwgMHgyMDdmLCAweDAwODcsIDB4MDA4NSwgMHgwMDgzLCAweDAwODEsCi0gICAgMHgwMDdiLCAweDAwNzksIDB4MDA3ZCwgMHgwMDczLCAweDIwNzUsIDB4MjA3NSwgMHgyMDcxLCAweDIwNzEsCi0gICAgMHgwMDY4LCAweDAwNzAsIDB4MDA3OCwgMHgwMDgwLCAweDIwNzcsIDB4MjA3NywgMHgyMDZkLCAweDIwNmQsCi0gICAgMHgyMDZiLCAweDIwNmIsIDB4MjA2OSwgMHgyMDY5LCAweDIwNmYsIDB4MjA2ZiwgMHgyMDY1LCAweDIwNjUsCi0gICAgMHgyMDYzLCAweDIwNjMsIDB4MjA2MSwgMHgyMDYxLCAweDAwNTksIDB4MDA1ZCwgMHgwMDViLCAweDAwNTEsCi0gICAgMHgwMDY3LCAweDAwNTUsIDB4MDA1MywgMHgwMDQ5LCAweDAwYTAsIDB4MDBhOCwgMHgwMGIwLCAweDAwYjgsCi0gICAgMHgyMDVmLCAweDIwNWYsIDB4MjA0ZCwgMHgyMDRkLCAweDIwNGIsIDB4MjA0YiwgMHgyMDQxLCAweDIwNDEsCi0gICAgMHgyMDU3LCAweDIwNTcsIDB4MjA0NSwgMHgyMDQ1LCAweDIwNDMsIDB4MjA0MywgMHgyMDM5LCAweDIwMzksCi0gICAgMHgyMDRmLCAweDIwNGYsIDB4MjAzZCwgMHgyMDNkLCAweDIwM2IsIDB4MjAzYiwgMHgyMDMxLCAweDIwMzEsCi0gICAgMHgwMDI5LCAweDAwMzUsIDB4MDAzMywgMHgwMDIxLCAweDIwNDcsIDB4MjA0NywgMHgyMDJkLCAweDIwMmQsCi0gICAgMHgyMDJiLCAweDIwMmIsIDB4MjAxOSwgMHgyMDE5LCAweDAwM2YsIDB4MDAyNSwgMHgwMDIzLCAweDAwMTEsCi0gICAgMHgwMDM3LCAweDAwMWQsIDB4MDAxYiwgMHgwMDA5LCAweDIwMmYsIDB4MjAyZiwgMHgyMDEzLCAweDIwMTMKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzJbMTEyXSA9IHsKLSAgICAweDAwMjAsIDB4MDA4OCwgMHgwMGIwLCAweDAwYjgsIDB4MDBjMCwgMHgwMGM4LCAweDAwZDAsIDB4MDBkOCwKLSAgICAweDAwM2YsIDB4MDAzNywgMHgwMDJmLCAweDAwMjcsIDB4MDAxZiwgMHgwMDE1LCAweDAwMGIsIDB4MDAwMSwKLSAgICAweDAwMjgsIDB4MDA1MCwgMHgwMDc4LCAweDAwODAsIDB4MDAzMCwgMHgwMDM4LCAweDAwNDAsIDB4MDA0OCwKLSAgICAweDA3ZmYsIDB4MDA4MSwgMHgwMDg3LCAweDAwODUsIDB4MDA4MywgMHgwMDc5LCAweDAwN2YsIDB4MDA3ZCwKLSAgICAweDAwN2IsIDB4MDA3MSwgMHgwMDc3LCAweDAwNzUsIDB4MDA3MywgMHgwMDY5LCAweDIwNmIsIDB4MjA2YiwKLSAgICAweDAwNTgsIDB4MDA2MCwgMHgwMDY4LCAweDAwNzAsIDB4MjA2MSwgMHgyMDYxLCAweDIwNmQsIDB4MjA2ZCwKLSAgICAweDIwNjMsIDB4MjA2MywgMHgyMDU5LCAweDIwNTksIDB4MjA2ZiwgMHgyMDZmLCAweDIwNjUsIDB4MjA2NSwKLSAgICAweDIwNWIsIDB4MjA1YiwgMHgyMDUxLCAweDIwNTEsIDB4MDA2NywgMHgwMDVkLCAweDAwNTMsIDB4MDA0OSwKLSAgICAweDAwNWYsIDB4MDA1NSwgMHgwMDRiLCAweDAwNDEsIDB4MDA5MCwgMHgwMDk4LCAweDAwYTAsIDB4MDBhOCwKLSAgICAweDIwMzksIDB4MjAzOSwgMHgyMDMxLCAweDIwMzEsIDB4MjA0ZCwgMHgyMDRkLCAweDIwMjksIDB4MjAyOSwKLSAgICAweDIwNTcsIDB4MjA1NywgMHgyMDQ1LCAweDIwNDUsIDB4MjA0MywgMHgyMDQzLCAweDIwMjEsIDB4MjAyMSwKLSAgICAweDAwMTksIDB4MDAzZCwgMHgwMDNiLCAweDAwMTEsIDB4MDA0ZiwgMHgwMDM1LCAweDAwMzMsIDB4MDAwOSwKLSAgICAweDIwMmIsIDB4MjAyYiwgMHgyMDJkLCAweDIwMmQsIDB4MjAyMywgMHgyMDIzLCAweDIwMjUsIDB4MjAyNSwKLSAgICAweDIwMWIsIDB4MjAxYiwgMHgyMDQ3LCAweDIwNDcsIDB4MjAxZCwgMHgyMDFkLCAweDIwMTMsIDB4MjAxMwotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfM1s4MF0gPSB7Ci0gICAgMHgwMDIwLCAweDAwMjgsIDB4MDAzMCwgMHgwMDM4LCAweDAwNDAsIDB4MDA0OCwgMHgwMDUwLCAweDAwNTgsCi0gICAgMHgwMDYwLCAweDAwNjgsIDB4MDA3MCwgMHgwMDc4LCAweDAwODAsIDB4MDA4OCwgMHgwMDkwLCAweDAwOTgsCi0gICAgMHgwMDA5LCAweDAwMGIsIDB4MDdmZiwgMHgwMDAxLCAweDAwMTEsIDB4MDAxMywgMHgwMDE1LCAweDA3ZmYsCi0gICAgMHgwMDE5LCAweDAwMWIsIDB4MDAxZCwgMHgwMDFmLCAweDAwMjEsIDB4MDAyMywgMHgwMDI1LCAweDAwMjcsCi0gICAgMHgwMDI5LCAweDAwMmIsIDB4MDAyZCwgMHgwMDJmLCAweDAwMzEsIDB4MDAzMywgMHgwMDM1LCAweDAwMzcsCi0gICAgMHgwMDM5LCAweDAwM2IsIDB4MDAzZCwgMHgwMDNmLCAweDAwNDEsIDB4MDA0MywgMHgwMDQ1LCAweDAwNDcsCi0gICAgMHgwMDQ5LCAweDAwNGIsIDB4MDA0ZCwgMHgwMDRmLCAweDAwNTEsIDB4MDA1MywgMHgwMDU1LCAweDAwNTcsCi0gICAgMHgwMDU5LCAweDAwNWIsIDB4MDA1ZCwgMHgwMDVmLCAweDAwNjEsIDB4MDA2MywgMHgwMDY1LCAweDAwNjcsCi0gICAgMHgwMDY5LCAweDAwNmIsIDB4MDA2ZCwgMHgwMDZmLCAweDAwNzEsIDB4MDA3MywgMHgwMDc1LCAweDAwNzcsCi0gICAgMHgwMDc5LCAweDAwN2IsIDB4MDA3ZCwgMHgwMDdmLCAweDAwODEsIDB4MDA4MywgMHgwMDg1LCAweDAwODcKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzRbMzJdID0gewotICAgIDB4MDAyMCwgMHgwMDM4LCAweDIwMTUsIDB4MjAxNSwgMHg0MDAxLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxLAotICAgIDB4NjAwYiwgMHg2MDBiLCAweDYwMGIsIDB4NjAwYiwgMHg2MDBiLCAweDYwMGIsIDB4NjAwYiwgMHg2MDBiLAotICAgIDB4MDAyOCwgMHgwMDMwLCAweDAwMjEsIDB4MDAxOSwgMHgyMDI3LCAweDIwMjcsIDB4MDAyNSwgMHgwMDIzLAotICAgIDB4MjAxZCwgMHgyMDFkLCAweDIwMWIsIDB4MjAxYiwgMHgwMDExLCAweDAwMWYsIDB4MDAxMywgMHgwMDA5Ci19OwotCi1jb25zdCBPTVhfVTE2ICogYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNbMThdID0gewotICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzAsIC8qIG5DPTAgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18wLCAvKiBuQz0xICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMSwgLyogbkM9MiAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzEsIC8qIG5DPTMgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18yLCAvKiBuQz00ICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMiwgLyogbkM9NSAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzIsIC8qIG5DPTYgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18yLCAvKiBuQz03ICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMywgLyogbkM9OCAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzMsIC8qIG5DPTkgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18zLCAvKiBuQz0xMCAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzMsIC8qIG5DPTExICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMywgLyogbkM9MTIgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18zLCAvKiBuQz0xMyAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzMsIC8qIG5DPTE0ICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMywgLyogbkM9MTUgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18zLCAvKiBuQz0xNiAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzQgIC8qIG5DPS0xICovCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzBbNDBdID0gewotICAgIDB4MDAyMCwgMHgwMDQ4LCAweDAwMDksIDB4MDAwNywgMHgyMDA1LCAweDIwMDUsIDB4MjAwMywgMHgyMDAzLAotICAgIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLAotICAgIDB4MDAyOCwgMHgwMDQwLCAweDAwMTEsIDB4MDAwZiwgMHgwMDMwLCAweDAwMzgsIDB4MDAxOSwgMHgwMDE3LAotICAgIDB4MjdmZiwgMHgyN2ZmLCAweDIwMWYsIDB4MjAxZiwgMHgyMDFkLCAweDIwMWQsIDB4MjAxYiwgMHgyMDFiLAotICAgIDB4MjAxNSwgMHgyMDE1LCAweDIwMTMsIDB4MjAxMywgMHgyMDBkLCAweDIwMGQsIDB4MjAwYiwgMHgyMDBiCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzFbMjRdID0gewotICAgIDB4MDAyMCwgMHgwMDI4LCAweDAwMTEsIDB4MDAwZiwgMHgwMDBkLCAweDAwMGIsIDB4MjAwOSwgMHgyMDA5LAotICAgIDB4MjAwNywgMHgyMDA3LCAweDIwMDUsIDB4MjAwNSwgMHgyMDAzLCAweDIwMDMsIDB4MjAwMSwgMHgyMDAxLAotICAgIDB4MDAxZCwgMHgwMDFiLCAweDAwMTksIDB4MDAxNywgMHgyMDE1LCAweDIwMTUsIDB4MjAxMywgMHgyMDEzCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzJbMjRdID0gewotICAgIDB4MDAyMCwgMHgwMDI4LCAweDAwMTEsIDB4MDAwYiwgMHgwMDA5LCAweDAwMDEsIDB4MjAwZiwgMHgyMDBmLAotICAgIDB4MjAwZCwgMHgyMDBkLCAweDIwMDcsIDB4MjAwNywgMHgyMDA1LCAweDIwMDUsIDB4MjAwMywgMHgyMDAzLAotICAgIDB4MDAxYiwgMHgwMDE3LCAweDIwMTksIDB4MjAxOSwgMHgyMDE1LCAweDIwMTUsIDB4MjAxMywgMHgyMDEzCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzNbMjRdID0gewotICAgIDB4MDAyMCwgMHgwMDI4LCAweDAwMTMsIDB4MDAwZiwgMHgwMDA3LCAweDAwMDUsIDB4MjAxMSwgMHgyMDExLAotICAgIDB4MjAwZCwgMHgyMDBkLCAweDIwMGIsIDB4MjAwYiwgMHgyMDA5LCAweDIwMDksIDB4MjAwMywgMHgyMDAzLAotICAgIDB4MjAxOSwgMHgyMDE5LCAweDIwMTcsIDB4MjAxNywgMHgyMDE1LCAweDIwMTUsIDB4MjAwMSwgMHgyMDAxCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzRbMjBdID0gewotICAgIDB4MDAyMCwgMHgwMDE1LCAweDAwMTEsIDB4MDAwNSwgMHgwMDAzLCAweDAwMDEsIDB4MjAwZiwgMHgyMDBmLAotICAgIDB4MjAwZCwgMHgyMDBkLCAweDIwMGIsIDB4MjAwYiwgMHgyMDA5LCAweDIwMDksIDB4MjAwNywgMHgyMDA3LAotICAgIDB4MjAxNywgMHgyMDE3LCAweDIwMTMsIDB4MjAxMwotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc181WzIwXSA9IHsKLSAgICAweDAwMjAsIDB4MDAxMSwgMHgyMDEzLCAweDIwMTMsIDB4MjAwZiwgMHgyMDBmLCAweDIwMGQsIDB4MjAwZCwKLSAgICAweDIwMGIsIDB4MjAwYiwgMHgyMDA5LCAweDIwMDksIDB4MjAwNywgMHgyMDA3LCAweDIwMDUsIDB4MjAwNSwKLSAgICAweDAwMTUsIDB4MDAwMSwgMHgyMDAzLCAweDIwMDMKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfNlsyMF0gPSB7Ci0gICAgMHgwMDIwLCAweDAwMGYsIDB4MjAxMSwgMHgyMDExLCAweDIwMGQsIDB4MjAwZCwgMHgyMDA5LCAweDIwMDksCi0gICAgMHgyMDA3LCAweDIwMDcsIDB4MjAwNSwgMHgyMDA1LCAweDQwMGIsIDB4NDAwYiwgMHg0MDBiLCAweDQwMGIsCi0gICAgMHgwMDEzLCAweDAwMDEsIDB4MjAwMywgMHgyMDAzCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzdbMjBdID0gewotICAgIDB4MDAyMCwgMHgwMDAzLCAweDIwMGYsIDB4MjAwZiwgMHgyMDBkLCAweDIwMGQsIDB4MjAwNywgMHgyMDA3LAotICAgIDB4NDAwYiwgMHg0MDBiLCAweDQwMGIsIDB4NDAwYiwgMHg0MDA5LCAweDQwMDksIDB4NDAwOSwgMHg0MDA5LAotICAgIDB4MDAxMSwgMHgwMDAxLCAweDIwMDUsIDB4MjAwNQotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc184WzIwXSA9IHsKLSAgICAweDAwMjAsIDB4MDAwNSwgMHgyMDBiLCAweDIwMGIsIDB4NDAwZCwgMHg0MDBkLCAweDQwMGQsIDB4NDAwZCwKLSAgICAweDQwMDksIDB4NDAwOSwgMHg0MDA5LCAweDQwMDksIDB4NDAwNywgMHg0MDA3LCAweDQwMDcsIDB4NDAwNywKLSAgICAweDAwMDMsIDB4MDAwMSwgMHgyMDBmLCAweDIwMGYKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfOVsyMF0gPSB7Ci0gICAgMHgwMDIwLCAweDAwMGQsIDB4MjAwNSwgMHgyMDA1LCAweDQwMGIsIDB4NDAwYiwgMHg0MDBiLCAweDQwMGIsCi0gICAgMHg0MDA5LCAweDQwMDksIDB4NDAwOSwgMHg0MDA5LCAweDQwMDcsIDB4NDAwNywgMHg0MDA3LCAweDQwMDcsCi0gICAgMHgyMDAzLCAweDIwMDMsIDB4MjAwMSwgMHgyMDAxCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzEwWzE2XSA9IHsKLSAgICAweDAwMDEsIDB4MDAwMywgMHgyMDA1LCAweDIwMDUsIDB4MjAwNywgMHgyMDA3LCAweDIwMGIsIDB4MjAwYiwKLSAgICAweDYwMDksIDB4NjAwOSwgMHg2MDA5LCAweDYwMDksIDB4NjAwOSwgMHg2MDA5LCAweDYwMDksIDB4NjAwOQotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18xMVsxNl0gPSB7Ci0gICAgMHgwMDAxLCAweDAwMDMsIDB4MjAwOSwgMHgyMDA5LCAweDQwMDUsIDB4NDAwNSwgMHg0MDA1LCAweDQwMDUsCi0gICAgMHg2MDA3LCAweDYwMDcsIDB4NjAwNywgMHg2MDA3LCAweDYwMDcsIDB4NjAwNywgMHg2MDA3LCAweDYwMDcKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMTJbMTZdID0gewotICAgIDB4MjAwMSwgMHgyMDAxLCAweDIwMDMsIDB4MjAwMywgMHg0MDA3LCAweDQwMDcsIDB4NDAwNywgMHg0MDA3LAotICAgIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUsIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUsIDB4NjAwNSwgMHg2MDA1Ci19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzEzWzE2XSA9IHsKLSAgICAweDQwMDEsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEsIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywKLSAgICAweDYwMDUsIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUsIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUsIDB4NjAwNQotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18xNFsxNl0gPSB7Ci0gICAgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsCi0gICAgMHg2MDAzLCAweDYwMDMsIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsIDB4NjAwMywgMHg2MDAzLCAweDYwMDMKLX07Ci0KLWNvbnN0IE9NWF9VMTYgKiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzWzE1XSA9IHsKLSAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzAsCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18xLAotICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMiwKLSAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzMsCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc180LAotICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfNSwKLSAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzYsCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc183LAotICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfOCwKLSAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzksCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18xMCwKLSAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzExLAotICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMTIsCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18xMywKLSAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzE0Ci19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlc18wWzE2XSA9IHsKLSAgICAweDIwMDcsIDB4MjAwNywgMHgyMDA1LCAweDIwMDUsIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywKLSAgICAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMQotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXNfMVsxNl0gPSB7Ci0gICAgMHg0MDA1LCAweDQwMDUsIDB4NDAwNSwgMHg0MDA1LCAweDQwMDMsIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsCi0gICAgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzXzJbMTZdID0gewotICAgIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsIDB4NjAwMywgMHg2MDAzLAotICAgIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxCi19OwotCi1jb25zdCBPTVhfVTE2ICogYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXNbM10gPSB7Ci0gICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXNfMCwKLSAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlc18xLAotICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzXzIKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfMFs4XSA9IHsKLSAgICAweDQwMDMsIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEsIDB4NDAwMQotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc18xWzhdID0gewotICAgIDB4MjAwNSwgMHgyMDA1LCAweDIwMDMsIDB4MjAwMywgMHg0MDAxLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzJbOF0gPSB7Ci0gICAgMHgyMDA3LCAweDIwMDcsIDB4MjAwNSwgMHgyMDA1LCAweDIwMDMsIDB4MjAwMywgMHgyMDAxLCAweDIwMDEKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfM1s4XSA9IHsKLSAgICAweDAwMDksIDB4MDAwNywgMHgyMDA1LCAweDIwMDUsIDB4MjAwMywgMHgyMDAzLCAweDIwMDEsIDB4MjAwMQotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc180WzhdID0gewotICAgIDB4MDAwYiwgMHgwMDA5LCAweDAwMDcsIDB4MDAwNSwgMHgyMDAzLCAweDIwMDMsIDB4MjAwMSwgMHgyMDAxCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzVbOF0gPSB7Ci0gICAgMHgwMDAzLCAweDAwMDUsIDB4MDAwOSwgMHgwMDA3LCAweDAwMGQsIDB4MDAwYiwgMHgyMDAxLCAweDIwMDEKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNlsyNF0gPSB7Ci0gICAgMHgwMDEwLCAweDAwMGQsIDB4MDAwYiwgMHgwMDA5LCAweDAwMDcsIDB4MDAwNSwgMHgwMDAzLCAweDAwMDEsCi0gICAgMHgwMDE4LCAweDAwMTEsIDB4MjAwZiwgMHgyMDBmLCAweDAwMjAsIDB4MDAxNSwgMHgyMDEzLCAweDIwMTMsCi0gICAgMHgwMDI4LCAweDAwMTksIDB4MjAxNywgMHgyMDE3LCAweDA3ZmYsIDB4MDAxZCwgMHgyMDFiLCAweDIwMWIKLX07Ci0KLS8qIFRhYmxlcyA3IHRvIDE0IGFyZSBkdXBsaWNhdGVzIG9mIHRhYmxlIDYgKi8KLQotY29uc3QgT01YX1UxNiAqIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNbMTVdID0gewotICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfMCwgIC8qIFplcm9zTGVmdD0xICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc18xLAotICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfMiwKLSAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzMsCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc180LAotICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNSwgIC8qIFplcm9zTGVmdD02ICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc182LCAgLyogWmVyb3NMZWZ0PTcgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9OCAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNiwgIC8qIFplcm9zTGVmdD05ICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc182LCAgLyogWmVyb3NMZWZ0PTEwICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc182LCAgLyogWmVyb3NMZWZ0PTExICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc182LCAgLyogWmVyb3NMZWZ0PTEyICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc182LCAgLyogWmVyb3NMZWZ0PTEzICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc182LCAgLyogWmVyb3NMZWZ0PTE0ICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc182ICAgLyogWmVyb3NMZWZ0PTE1ICovCi19OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFfdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hX3Vuc2FmZV9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzODEzZDMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFfdW5zYWZlX3MucworKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hX3Vuc2FmZV9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICAxMjI5MAotOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgICAKLSAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAotCi0KLSAgICBJRiAgQ29ydGV4QTgKLSAgICAgICAgCi1wQWxwaGEgICAgICBSTiAyCi1wQmV0YSAgICAgICBSTiAzCi0KLXBUaHJlc2hvbGRzIFJOIDUKLXBCUyAgICAgICAgIFJOIDQKLWJTMzIxMCAgICAgIFJOIDYKLQotOy8vIFBpeGVscwotZFBfMCAgICAgICAgRE4gRDQuVTgKLWRQXzEgICAgICAgIEROIEQ1LlU4ICAKLWRQXzIgICAgICAgIEROIEQ2LlU4ICAKLWRQXzMgICAgICAgIEROIEQ3LlU4ICAKLWRRXzAgICAgICAgIEROIEQ4LlU4ICAKLWRRXzEgICAgICAgIEROIEQ5LlU4ICAKLWRRXzIgICAgICAgIEROIEQxMC5VOCAKLWRRXzMgICAgICAgIEROIEQxMS5VOCAKLQotCi07Ly8gRmlsdGVyaW5nIERlY2lzaW9uCi1kQWxwaGEgICAgICBETiBEMC5VOAotZEJldGEgICAgICAgRE4gRDIuVTgKLQotZEZpbHQgICAgICAgRE4gRDE2LlU4Ci1kQXFmbGcgICAgICBETiBEMTIuVTgKLWRBcGZsZyAgICAgIEROIEQxNy5VOCAKLQotZEFwMHEwICAgICAgRE4gRDEzLlU4Ci0KLTsvLyBiU0xUNAotZFRDMzIxMCAgICAgRE4gRDE4LlU4ICAgCi1kVENzICAgICAgICBETiBEMzEuUzgKLWRUQyAgICAgICAgIEROIEQzMS5VOAotCi1kTWFza18wICAgICBETiBEMTQuVTgKLWRNYXNrXzEgICAgIEROIEQxNS5VOCAgICAKLWRNYXNrXzQgICAgIEROIEQyNi5VMTYKLQotZFRlbXAgICAgICAgRE4gRDI4LlU4Ci1kRHVtbXkgICAgICBETiBEMTcuVTgKLQotOy8vIENvbXB1dGluZyBQMCxRMAotcURxMHAwICAgICAgUU4gUTEwLlMxNgotcURwMXExICAgICAgUU4gUTExLlMxNgotcURlbHRhICAgICAgUU4gUTEwLlMxNiAgOyByZXVzZSBxRHEwcDAKLWREZWx0YSAgICAgIEROIEQyMC5TOAotCi0KLTsvLyBDb21wdXRpbmcgUDEsUTEKLXFQXzBuICAgICAgIFFOIFExNC5TMTYKLXFRXzBuICAgICAgIFFOIFExMi5TMTYKLQotZFFfMG4gICAgICAgRE4gRDI0LlU4Ci1kUF8wbiAgICAgICBETiBEMjkuVTgKLQotOy8vIGJTR0U0Ci0KLWRIU3AwcTEgICAgIEROIEQxMy5VOAotZEhTcTBwMSAgICAgRE4gRDMxLlU4ICAgCi0KLWRCUzMyMTAgICAgIEROIEQyOC5VMTYKLQotZFBfMHQgICAgICAgRE4gRDEzLlU4ICAgO2RIU3AwcTEgICAgICAgIAotZFFfMHQgICAgICAgRE4gRDMxLlU4ICAgO1RlbXAxICAgICAgICAKLQotZFBfMG4gICAgICAgRE4gRDI5LlU4Ci1kUV8wbiAgICAgICBETiBEMjQuVTggICA7VGVtcDIgICAgICAgIAotCi07Ly8gUmVnaXN0ZXIgdXNhZ2UgZm9yIC0gYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTTFQ0X3Vuc2FmZQotOy8vCi07Ly8gSW5wdXRzIC0gUGl4ZWxzICAgICAgICAgICAgIC0gcDAtcDM6IEQ0LUQ3LCBxMC1xMzogRDgtRDExCi07Ly8gICAgICAgIC0gRmlsdGVyIG1hc2tzICAgICAgIC0gZmlsdDogRDE2LCBhcWZsZzogRDEyLCBhcGZsZzogRDE3Ci07Ly8gICAgICAgIC0gQWRkaXRpb25hbCBQYXJhbXMgIC0gcFRocmVzaG9sZHM6IHI1Ci07Ly8gICAgICAgICAKLTsvLyBPdXRwdXRzIC0gUGl4ZWxzICAgICAgICAgICAgLSBQMC1QMTogRDI5LUQzMCwgUTAtUTE6IEQyNC1EMjUKLTsvLyAgICAgICAgIC0gQWRkaXRpb25hbCBQYXJhbXMgLSBwVGhyZXNob2xkczogcjUKLQotOy8vIFJlZ2lzdGVycyBDb3JydXB0ZWQgICAgICAgICAtIEQxOC1EMzEKLQotCi0gICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hYlNMVDRfdW5zYWZlCi0KLSAgICAgICAgCi0gICAgICAgIDtkVEMzMjEwIC0xOAotICAgICAgICA7ZFRlbXAtMjgKLQotICAgICAgICBWTEQxICAgICAgICBkMTguVTMyWzBdLCBbcFRocmVzaG9sZHNdISA7aGVyZQotCi0gICAgICAgIDsvLyBkZWx0YSA9ICgoKHEwLXAwKTw8MikgKyAocDEtcTEpICsgNCkgPj4gMzsKLSAgICAgICAgOy8vIGREZWx0YSA9IChxRHAxcTEgPj4gMiArIHFEcTBwMCArIDEpPj4gMQotCi0gICAgICAgIDsvLyBxRHAxcTEtMTEKLSAgICAgICAgOy8vIHFEcTBwMC0xMAotICAgICAgICBWU1VCTCAgICAgICBxRHAxcTEsIGRQXzEsIGRRXzEgICAgICAKLSAgICAgICAgVk1PViAgICAgICAgZFRlbXAsIGRUQzMyMTAKLSAgICAgICAgVlNVQkwgICAgICAgcURxMHAwLCBkUV8wLCBkUF8wICAgICAgCi0gICAgICAgIFZTSFIgICAgICAgIHFEcDFxMSwgcURwMXExLCAjMiAgICAgIAotICAgICAgICBWWklQLjggICAgICBkVEMzMjEwLCBkVGVtcAotICAgIAotICAgICAgICA7Ly8gcURlbHRhLXFEcTBwMC0xMAotCi0gICAgICAgIDsvLyBkVEMgPSBkVEMwMSArIChkQXBsZyAmIDEpICsgKGRBcWZsZyAmIDEpCi0KLSAgICAgICAgOy8vIGRUQzMyMTAtMTgKLSAgICAgICAgOy8vIGRUZW1wLTI4Ci0gICAgICAgIDsvLyBkVEMtMzEKLSAgICAgICAgVkJJRiAgICAgICAgZFRDMzIxMCwgZE1hc2tfMCwgZEZpbHQKLSAgICAgICAgVlJIQUREICAgICAgcURlbHRhLCBxRHAxcTEsIHFEcTBwMCAgCi0gICAgICAgIFZBREQgICAgICAgIGRUQywgZFRDMzIxMCwgZE1hc2tfMQotICAgICAgICBWUU1PVk4gICAgICBkRGVsdGEsIHFEZWx0YQotICAgICAgICA7Ly8gZERlbHRhLWQyMAotCi0gICAgICAgIDsvLyBkRGVsdGEgPSAoT01YX1U4KWFybUNsaXAoMCwgMjU1LCBxMCAtIGRlbHRhKTsKLSAgICAgICAgVkxEMSAgICAgICAge2RBbHBoYVtdfSwgW3BBbHBoYV0KLSAgICAgICAgVk1JTiAgICAgICAgZERlbHRhLCBkRGVsdGEsIGRUQ3MKLSAgICAgICAgVk5FRyAgICAgICAgZFRDcywgZFRDcwotICAgICAgICBWTEQxICAgICAgICB7ZEJldGFbXX0sIFtwQmV0YV0KLSAgICAgICAgOzEKLSAgICAgICAgVk1BWCAgICAgICAgZERlbHRhLCBkRGVsdGEsIGRUQ3MKLQotICAgICAgICA7Ly8gZFBfMG4gLSAyOQotICAgICAgICA7Ly8gZFFfMG4gLSAyNAotCi0gICAgICAgIDsvLyBwUTBbLTEqU3RlcF0gPSAoT01YX1U4KWFybUNsaXAoMCwgMjU1LCBkUF8wIC0gZGVsdGEpOwotICAgICAgICA7Ly8gcFEwWzAqU3RlcF0gPSAoT01YX1U4KWFybUNsaXAoMCwgMjU1LCBkUV8wIC0gZGVsdGEpOwotCi0gICAgICAgIDsvLyBkUF8wbiA9IChPTVhfVTgpYXJtQ2xpcCgwLCAyNTUsIGRQXzAgLSBkRGVsdGEpOwotICAgICAgICA7Ly8gZFFfMG4gPSAoT01YX1U4KWFybUNsaXAoMCwgMjU1LCBkUF8wIC0gZERlbHRhKTsKLSAgICAgICAgCi0gICAgICAgIDsvLyBxUF8wbiAtIDE0Ci0gICAgICAgIDsvLyBxUV8wbiAtIDEyCi0gICAgICAgIAotICAgICAgICBWTU9WTCAgICAgICBxUF8wbiwgZFBfMAotICAgICAgICBWTU9WTCAgICAgICBxUV8wbiwgZFFfMAotCi0gICAgICAgIDsxCi0gICAgICAgIFZBRERXICAgICAgIHFQXzBuLCBxUF8wbiwgZERlbHRhCi0gICAgICAgIFZTVUJXICAgICAgIHFRXzBuLCBxUV8wbiwgZERlbHRhCi0gICAgICAgIAotICAgICAgICBWUU1PVlVOICAgICBkUF8wbiwgcVBfMG4KLSAgICAgICAgVlFNT1ZVTiAgICAgZFFfMG4sIHFRXzBuCi0KLSAgICAgICAgTV9FTkQKLQotOy8vIFJlZ2lzdGVyIHVzYWdlIGZvciAtIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0dFNF91bnNhZmUoKQotOy8vCi07Ly8gSW5wdXRzIC0gUGl4ZWxzICAgICAgICAgICAgIC0gcDAtcDM6IEQ0LUQ3LCBxMC1xMzogRDgtRDExCi07Ly8gICAgICAgIC0gRmlsdGVyIG1hc2tzICAgICAgIC0gZmlsdDogRDE2LCBhcWZsZzogRDEyLCBhcGZsZzogRDE3Ci07Ly8gICAgICAgIC0gQWRkaXRpb25hbCBQYXJhbXMgIC0gYWxwaGE6IEQwLCBkTWFza18xOiBEMTUKLTsvLyAgICAgICAgIAotOy8vIE91dHB1dHMgLSBQaXhlbHMgICAgICAgICAgICAtIFAwLVAyOiBEMjktRDMxLCBRMC1RMjogRDI0LEQyNSxEMjgKLQotOy8vIFJlZ2lzdGVycyBDb3JydXB0ZWQgICAgICAgICAtIEQxOC1EMzEKLQotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTR0U0X3Vuc2FmZQotICAgIAotICAgICAgICA7ZEhTcTBwMSAtIDMxCi0gICAgICAgIDtkSFNwMHExIC0gMTMKLSAgICAgICAgVkhBREQgICAgICAgZEhTcDBxMSwgZFBfMCwgZFFfMSAgICAgCi0gICAgICAgIFZIQUREICAgICAgIGRIU3EwcDEsIGRRXzAsIGRQXzEgICAgICAgICAKLQotICAgICAgICA7Ly8gUHJlcGFyZSB0aGUgYlMgbWFzawotCi0gICAgICAgIDsvLyBkSFNwMHExLTEzCi0gICAgICAgIDsvLyBkUF8wdC1kSFNwMHExLTEzCi0gICAgICAgIDsvLyBkSFNxMHAxLTMxCi0gICAgICAgIDsvLyBkUV8wdC1UZW1wMS0zMQotICAgICAgICBWTEQxICAgICAgICB7ZEFscGhhW119LCBbcEFscGhhXQotICAgICAgICBBREQgICAgICAgICBwVGhyZXNob2xkcywgcFRocmVzaG9sZHMsICM0Ci0gICAgICAgIFZMRDEgICAgICAgIHtkQmV0YVtdfSwgW3BCZXRhXQotCi0gICAgICAgIFZSSEFERCAgICAgIGRQXzB0LCBkSFNwMHExLCBkUF8xICAgIAotICAgICAgICBWUkhBREQgICAgICBkUV8wdCwgZEhTcTBwMSwgZFFfMQotICAgICAgICAKLSAgICAgICAgTV9FTkQKLSAgICAgICAgCi0gICAgICAgIEVORElGICAKLQotICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYV91bnNhZmVfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hX3Vuc2FmZV9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjYzAxZGQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hX3Vuc2FmZV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSw0MTAgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFfdW5zYWZlX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDEyMjkwCi07Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAgIAotICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4Ci0KLQotICAgIElGICBDb3J0ZXhBOAotICAgICAgICAKLXBUaHJlc2hvbGRzIFJOIDUKLQotOy8vIFBpeGVscwotZFBfMCAgICAgICAgRE4gRDQuVTgKLWRQXzEgICAgICAgIEROIEQ1LlU4ICAKLWRQXzIgICAgICAgIEROIEQ2LlU4ICAKLWRQXzMgICAgICAgIEROIEQ3LlU4ICAKLWRRXzAgICAgICAgIEROIEQ4LlU4ICAKLWRRXzEgICAgICAgIEROIEQ5LlU4ICAKLWRRXzIgICAgICAgIEROIEQxMC5VOCAKLWRRXzMgICAgICAgIEROIEQxMS5VOCAKLQotCi07Ly8gRmlsdGVyaW5nIERlY2lzaW9uCi1kQWxwaGEgICAgICBETiBEMC5VOAotCi1kRmlsdCAgICAgICBETiBEMTYuVTgKLWRBcWZsZyAgICAgIEROIEQxMi5VOAotZEFwZmxnICAgICAgRE4gRDE3LlU4IAotCi1kQXAwcTAgICAgICBETiBEMTMuVTgKLQotOy8vIGJTTFQ0Ci1kVEMwICAgICAgICBETiBEMTguVTggICAKLWRUQzEgICAgICAgIEROIEQxOS5VOCAgIAotZFRDMDEgICAgICAgRE4gRDE4LlU4ICAgCi0KLWRUQ3MgICAgICAgIEROIEQzMS5TOAotZFRDICAgICAgICAgRE4gRDMxLlU4Ci0KLWRNYXNrXzAgICAgIEROIEQxNC5VOAotZE1hc2tfMSAgICAgRE4gRDE1LlU4ICAgIAotCi1kVGVtcCAgICAgICBETiBEMTkuVTgKLQotOy8vIENvbXB1dGluZyBQMCxRMAotcURxMHAwICAgICAgUU4gUTEwLlMxNgotcURwMXExICAgICAgUU4gUTExLlMxNgotcURlbHRhICAgICAgUU4gUTEwLlMxNiAgOyByZXVzZSBxRHEwcDAKLWREZWx0YSAgICAgIEROIEQyMC5TOAotCi0KLTsvLyBDb21wdXRpbmcgUDEsUTEKLWRScDBxMCAgICAgIEROIEQyNC5VOAotCi1kTWF4UCAgICAgICBETiBEMjMuVTgKLWRNaW5QICAgICAgIEROIEQyMi5VOAotCi1kTWF4USAgICAgICBETiBEMTkuVTgKLWRNaW5RICAgICAgIEROIEQyMS5VOAotCi1kRGVsdGFQICAgICBETiBEMjYuVTgKLWREZWx0YVEgICAgIEROIEQyNy5VOAotCi1xUF8wbiAgICAgICBRTiBRMTQuUzE2Ci1xUV8wbiAgICAgICBRTiBRMTIuUzE2Ci0KLWRRXzBuICAgICAgIEROIEQyNC5VOAotZFFfMW4gICAgICAgRE4gRDI1LlU4Ci1kUF8wbiAgICAgICBETiBEMjkuVTgKLWRQXzFuICAgICAgIEROIEQzMC5VOAotCi07Ly8gYlNHRTQKLQotcVNwMHEwICAgICAgUU4gUTEwLlUxNgotCi1xU3AycTEgICAgICBRTiBRMTEuVTE2Ci1xU3AwcTBwMSAgICBRTiBRMTIuVTE2Ci1xU3AzcDIgICAgICBRTiBRMTMuVTE2Ci1kSFNwMHExICAgICBETiBEMjguVTgKLQotcVNxMnAxICAgICAgUU4gUTExLlUxNgotcVNwMHEwcTEgICAgUU4gUTEyLlUxNgotcVNxM3EyICAgICAgUU4gUTEzLlUxNiAgOyEhCi1kSFNxMHAxICAgICBETiBEMjguVTggICA7ISEKLQotcVRlbXAxICAgICAgUU4gUTExLlUxNiAgOyEhO3FTcDJxMSAKLXFUZW1wMiAgICAgIFFOIFExMi5VMTYgIDshITtxU3AwcTBwMSAgICAgICAgCi0KLWRQXzB0ICAgICAgIEROIEQyOC5VOCAgIDshITtkSFNwMHExICAgICAgICAKLWRRXzB0ICAgICAgIEROIEQyMi5VOCAgIDshITtUZW1wMSAgICAgICAgCi0KLWRQXzBuICAgICAgIEROIEQyOS5VOAotZFBfMW4gICAgICAgRE4gRDMwLlU4Ci1kUF8ybiAgICAgICBETiBEMzEuVTgKLQotZFFfMG4gICAgICAgRE4gRDI0LlU4ICAgOyEhO1RlbXAyICAgICAgICAKLWRRXzFuICAgICAgIEROIEQyNS5VOCAgIDshITtUZW1wMiAgICAgICAgCi1kUV8ybiAgICAgICBETiBEMjguVTggICA7ISE7ZFFfMHQgICAgICAgIAotCi07Ly8gUmVnaXN0ZXIgdXNhZ2UgZm9yIC0gYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTTFQ0X3Vuc2FmZQotOy8vCi07Ly8gSW5wdXRzIC0gUGl4ZWxzICAgICAgICAgICAgIC0gcDAtcDM6IEQ0LUQ3LCBxMC1xMzogRDgtRDExCi07Ly8gICAgICAgIC0gRmlsdGVyIG1hc2tzICAgICAgIC0gZmlsdDogRDE2LCBhcWZsZzogRDEyLCBhcGZsZzogRDE3Ci07Ly8gICAgICAgIC0gQWRkaXRpb25hbCBQYXJhbXMgIC0gcFRocmVzaG9sZHM6IHI1Ci07Ly8gICAgICAgICAKLTsvLyBPdXRwdXRzIC0gUGl4ZWxzICAgICAgICAgICAgLSBQMC1QMTogRDI5LUQzMCwgUTAtUTE6IEQyNC1EMjUKLTsvLyAgICAgICAgIC0gQWRkaXRpb25hbCBQYXJhbXMgLSBwVGhyZXNob2xkczogcjUKLQotOy8vIFJlZ2lzdGVycyBDb3JydXB0ZWQgICAgICAgICAtIEQxOC1EMzEKLQotCi0gICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTTFQ0X3Vuc2FmZQotCi0gICAgICAgIAotICAgICAgICA7Ly8gcURxMHAwLTEwCi0gICAgICAgIFZTVUJMICAgICAgIHFEcDFxMSwgZFBfMSwgZFFfMSAgICAgIAotICAgICAgICBWTEQxICAgICAgICB7ZFRDMFtdfSwgW3BUaHJlc2hvbGRzXSEKLSAgICAgICAgOy8vIHFEcDFxMS0xMQotICAgICAgICBWU1VCTCAgICAgICBxRHEwcDAsIGRRXzAsIGRQXzAgICAgICAKLSAgICAgICAgVkxEMSAgICAgICAge2RUQzFbXX0sIFtwVGhyZXNob2xkc10hCi0KLSAgICAgICAgOy8vIGRScDBxMC0yNAotICAgICAgICBWU0hSICAgICAgICBxRHAxcTEsIHFEcDFxMSwgIzIgICAgICAKLSAgICAKLSAgICAgICAgOy8vIGRUQzAxID0gKGRUQzEgPDwgNCkgfCBkVEMwCi0gICAgICAgIDsvLyBkVEMwMS0xOAotICAgICAgICBWRVhUICAgICAgICBkVEMwMSwgZFRDMCwgZFRDMSwgIzQKLSAgICAgICAgOy8vIGRUZW1wLTE5Ci0gICAgICAgIFZBTkQgICAgICAgIGRUZW1wLCBkQXBmbGcsIGRNYXNrXzEKLSAgICAgICAgCi0gICAgICAgIFZCSUYgICAgICAgIGRUQzAxLCBkTWFza18wLCBkRmlsdAotICAgIAotCi0gICAgICAgIDsvLyBkZWx0YSA9ICgoKHEwLXAwKTw8MikgKyAocDEtcTEpICsgNCkgPj4gMzsKLSAgICAgICAgOy8vIGREZWx0YSA9IChxRHAxcTEgPj4gMiArIHFEcTBwMCArIDEpPj4gMQotCi0gICAgICAgIDsvLyBxRGVsdGEtcURxMHAwLTEwCi0gICAgICAgIFZSSEFERCAgICAgIHFEZWx0YSwgcURwMXExLCBxRHEwcDAgIAotICAgICAgICBWUkhBREQgICAgICBkUnAwcTAsIGRQXzAsIGRRXzAgICAgICAKLSAgICAgICAgVkFERCAgICAgICAgZFRDLCBkVEMwMSwgZFRlbXAKLQotICAgICAgICA7Ly8gZFRDID0gZFRDMDEgKyAoZEFwbGcgJiAxKSArIChkQXFmbGcgJiAxKQotICAgICAgICAKLSAgICAgICAgVkFORCAgICAgICAgZFRlbXAsIGRBcWZsZywgZE1hc2tfMQotICAgICAgICBWUUFERCAgICAgICBkTWF4UCwgZFBfMSwgZFRDMDEgICAgICAKLSAgICAgICAgVlFNT1ZOICAgICAgZERlbHRhLCBxRGVsdGEKLSAgICAgICAgVkFERCAgICAgICAgZFRDLCBkVEMsIGRUZW1wCi0KLSAgICAgICAgOy8vIGRNYXhQID0gUUFERChkUF8xLCBkVEMwMSkKLSAgICAgICAgOy8vIGRNaW5QID0gUVNVQihkUF8xLCBkVEMwMSkKLSAKLSAgICAgICAgOy8vIGRNYXhQLWQyMwotICAgICAgICA7Ly8gZE1pblAtZDIyCi0gICAgICAgIFZRU1VCICAgICAgIGRNaW5QLCBkUF8xLCBkVEMwMSAgICAgIAotCi0gICAgICAgIDsvLyBkRGVsdGEtZDIwCi0KLSAgICAgICAgOy8vIGRNYXhRID0gUUFERChkUV8xLCBkVEMwMSkKLSAgICAgICAgOy8vIGRNaW5RID0gUVNVQihkUV8xLCBkVEMwMSkKLSAKLSAgICAgICAgOy8vIGRNYXhRLTE5Ci0gICAgICAgIDsvLyBkTWluUS0yMQotICAgICAgICBWUUFERCAgICAgICBkTWF4USwgZFFfMSwgZFRDMDEKLSAgICAgICAgVkhBREQgICAgICAgZERlbHRhUCwgZFJwMHEwLCBkUF8yICAgCi0gICAgICAgIFZNSU4gICAgICAgIGREZWx0YSwgZERlbHRhLCBkVENzCi0KLSAgICAgICAgOy8vIGREZWx0YSA9IChPTVhfVTgpYXJtQ2xpcCgwLCAyNTUsIHEwIC0gZGVsdGEpOwotICAgICAgICBWTkVHICAgICAgICBkVENzLCBkVENzCi0gICAgICAgIAotICAgICAgICBWUVNVQiAgICAgICBkTWluUSwgZFFfMSwgZFRDMDEKLQotICAgICAgICA7Ly8gZGVsdGEgPSAocDIgKyAoKHAwK3EwKzEpPj4xKSAtIChwMTw8MSkpPj4xOwotICAgICAgICA7Ly8gZGVsdGEgPSBhcm1DbGlwKC10QzAsIHRDMCwgZGVsdGEpOwotICAgICAgICA7Ly8gcFEwWy0yKlN0ZXBdID0gKE9NWF9VOCkocDEgKyBkZWx0YSk7Ci0KLSAgICAgICAgOy8vIGREZWx0YVAgPSAoZFBfMiArIGRScDBxMCk+PjE7Ci0gICAgICAgIDsvLyBkUF8xbiA9IGFybUNsaXAoZFBfMSAtIGRUQzAxLCBkUF8xICsgZFRDMDEsIGREZWx0YVApOwotICAgICAgICA7Ly8gZFBfMW4gPSBhcm1DbGlwKE1pblAsIE1heFAsIGREZWx0YVApOwotICAgICAgICAKLSAgICAgICAgOy8vIGRlbHRhID0gKHEyICsgKChwMCtxMCsxKT4+MSkgLSAocTE8PDEpKT4+MTsKLSAgICAgICAgOy8vIGRlbHRhID0gYXJtQ2xpcCgtdEMwLCB0QzAsIGRlbHRhKTsKLSAgICAgICAgOy8vIHBRMFsxKlN0ZXBdID0gKE9NWF9VOCkocTEgKyBkZWx0YSk7Ci0KLSAgICAgICAgOy8vIGREZWx0YVEgPSAoZFFfMiArIGRScDBxMCk+PjE7Ci0gICAgICAgIDsvLyBkUV8xbiA9IGFybUNsaXAoZFFfMSAtIGRUQzAxLCBkUV8xICsgZFRDMDEsIGREZWx0YVEpOwotICAgICAgICA7Ly8gZFFfMW4gPSBhcm1DbGlwKE1pblEsIE1heFEsIGREZWx0YVEpOwotICAgICAgICAKLSAgICAgICAgOy8vIGREZWx0YVAtMjYKLSAgICAgICAgVkhBREQgICAgICAgZERlbHRhUSwgZFJwMHEwLCBkUV8yICAgCi0KLSAgICAgICAgOy8vIGREZWx0YVEtMjcKLSAgICAgICAgCi0gICAgICAgIDsvLyBkUF8wbiAtIDI5Ci0gICAgICAgIDsvLyBkUF8xbiAtIDMwCi0gICAgICAgIDsvLyBkUV8wbiAtIDI0Ci0gICAgICAgIDsvLyBkUV8xbiAtIDI1Ci0gICAgICAgIAotICAgICAgICA7Ly8gZGVsdGEgPSAocTIgKyAoKHAwK3EwKzEpPj4xKSAtIChxMTw8MSkpPj4xOwotICAgICAgICA7Ly8gZERlbHRhUSA9IChkUV8yICsgZFJwMHEwKT4+MTsKLQotICAgICAgICBWTUFYICAgICAgICBkUF8xbiwgZERlbHRhUCwgZE1pblAgICAKLSAgICAgICAgVk1BWCAgICAgICAgZERlbHRhLCBkRGVsdGEsIGRUQ3MKLQotICAgICAgICA7Ly8gcFEwWy0xKlN0ZXBdID0gKE9NWF9VOClhcm1DbGlwKDAsIDI1NSwgZFBfMCAtIGRlbHRhKTsKLSAgICAgICAgOy8vIHBRMFswKlN0ZXBdID0gKE9NWF9VOClhcm1DbGlwKDAsIDI1NSwgZFFfMCAtIGRlbHRhKTsKLQotICAgICAgICA7Ly8gZFBfMG4gPSAoT01YX1U4KWFybUNsaXAoMCwgMjU1LCBkUF8wIC0gZERlbHRhKTsKLSAgICAgICAgOy8vIGRRXzBuID0gKE9NWF9VOClhcm1DbGlwKDAsIDI1NSwgZFBfMCAtIGREZWx0YSk7Ci0gICAgICAgIAotICAgICAgICA7Ly8gcVBfMG4gLSAxNAotICAgICAgICA7Ly8gcVFfMG4gLSAxMgotICAgICAgICAKLSAgICAgICAgVk1PVkwgICAgICAgcVBfMG4sIGRQXzAKLSAgICAgICAgVk1PVkwgICAgICAgcVFfMG4sIGRRXzAKLQotICAgICAgICBWQUREVyAgICAgICBxUF8wbiwgcVBfMG4sIGREZWx0YQotICAgICAgICBWU1VCVyAgICAgICBxUV8wbiwgcVFfMG4sIGREZWx0YQotICAgICAgICAKLSAgICAgICAgVlFNT1ZVTiAgICAgZFBfMG4sIHFQXzBuCi0gICAgICAgIFZRTU9WVU4gICAgIGRRXzBuLCBxUV8wbgotICAgICAgICAKLSAgICAgICAgVk1BWCAgICAgICAgZFFfMW4sIGREZWx0YVEsIGRNaW5RCi0KLSAgICAgICAgVk1JTiAgICAgICAgZFBfMW4sIGRQXzFuLCBkTWF4UAotICAgICAgICBWTUlOICAgICAgICBkUV8xbiwgZFFfMW4sIGRNYXhRCi0gICAgICAgIFZCSUYgICAgICAgIGRQXzBuLCBkUF8wLCBkRmlsdCAgICAgIAotCi0gICAgICAgIFZCSUYgICAgICAgIGRQXzFuLCBkUF8xLCBkQXBmbGcKLSAgICAgICAgVkJJRiAgICAgICAgZFFfMG4sIGRRXzAsIGRGaWx0ICAKLSAgICAgICAgVkJJRiAgICAgICAgZFFfMW4sIGRRXzEsIGRBcWZsZwotCi0gICAgICAgIE1fRU5ECi0KLTsvLyBSZWdpc3RlciB1c2FnZSBmb3IgLSBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNHRTRfdW5zYWZlKCkKLTsvLwotOy8vIElucHV0cyAtIFBpeGVscyAgICAgICAgICAgICAtIHAwLXAzOiBENC1ENywgcTAtcTM6IEQ4LUQxMQotOy8vICAgICAgICAtIEZpbHRlciBtYXNrcyAgICAgICAtIGZpbHQ6IEQxNiwgYXFmbGc6IEQxMiwgYXBmbGc6IEQxNwotOy8vICAgICAgICAtIEFkZGl0aW9uYWwgUGFyYW1zICAtIGFscGhhOiBEMCwgZE1hc2tfMTogRDE1Ci07Ly8gICAgICAgICAKLTsvLyBPdXRwdXRzIC0gUGl4ZWxzICAgICAgICAgICAgLSBQMC1QMjogRDI5LUQzMSwgUTAtUTI6IEQyNCxEMjUsRDI4Ci0KLTsvLyBSZWdpc3RlcnMgQ29ycnVwdGVkICAgICAgICAgLSBEMTgtRDMxCi0KLSAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNHRTRfdW5zYWZlCi0gICAgCi0KLSAgICAgICAgOy8vIGFwPGJldGEgJiYgYXJtQWJzKHAwLXEwKTwoKGFscGhhPj4yKSsyKSAgICAgICAgCi0gICAgICAgIDsvLyBhcTxiZXRhICYmIGFybUFicyhwMC1xMCk8KChhbHBoYT4+MikrMikgICAgICAgIAotCi0gICAgICAgIDsvLyAoIGRBcGZsZyAmIGRBcDBxMCA8IChkQWxwaGEgPj4gMiArIDIpICkKLSAgICAgICAgOy8vICggZEFxZmxnICYgZEFwMHEwIDwgKGRBbHBoYSA+PiAyICsgMikgKQotCi0gICAgICAgIDsvLyAoIGRBcGZsZyA9IGRBcGZsZyAmIGRBcDBxMCA8IChkVGVtcCArIGRNYXNrXzEgKyBkTWFza18xKSApCi0gICAgICAgIDsvLyAoIGRBcWZsZyA9IGRBcWZsZyAmIGRBcDBxMCA8IChkVGVtcCArIGRNYXNrXzEgKyBkTWFza18xKSApCi0KLSAgICAgICAgOy8vIFAgRmlsdGVyCi0KLSAgICAgICAgVlNIUiAgICAgICAgZFRlbXAsIGRBbHBoYSwgIzIKLSAgICAgICAgVkFERCAgICAgICAgZFRlbXAsIGRUZW1wLCBkTWFza18xCi0KLSAgICAgICAgOy8vIHFTcDBxMC0xMAotICAgICAgICBWQURETCAgICAgICBxU3AwcTAsIGRRXzAsIGRQXzAgICAgICAKLSAgICAgICAgVkFERCAgICAgICAgZFRlbXAsIGRUZW1wLCBkTWFza18xCi0KLSAgICAgICAgOy8vIHFTcDJxMS0xMQotICAgICAgICA7Ly8gcVNwMHEwcDEtMTIKLSAgICAgICAgVkFEREwgICAgICAgcVNwMnExLCBkUF8yLCBkUV8xICAgICAgCi0gICAgICAgIFZBRERXICAgICAgIHFTcDBxMHAxLCBxU3AwcTAsIGRQXzEgIAotCi0gICAgICAgIFZDR1QgICAgICAgIGRUZW1wLCBkVGVtcCwgZEFwMHEwCi0gICAgICAgIFZTSFIgICAgICAgIHFTcDJxMSwgIzEgICAgICAgICAgICAgIAotCi0gICAgICAgIDsvLyBwUTBbLTEqU3RlcF0gPSAoT01YX1U4KSgocDIgKyAyKnAxICsgMipwMCArIDIqcTAgKyBxMSArIDQpPj4zKTsKLSAgICAgICAgOy8vIHBRMFstMSpTdGVwXSA9ICggKCAocDAgKyBxMCArIHAxKSArIChwMiArIHExKT4+MSApID4+IDEgKyAxICkgPj4gMQotCi0gICAgICAgIDsvLyBkUF8wbiA9ICggKCAocVNwMHEwICsgZFBfMSkgKyBxU3AycTE+PjEgKSA+PiAxICsgMSApID4+IDEKLSAgICAgICAgOy8vIGRQXzBuID0gKCAoIHFTcDBxMHAxICsgcVNwMnExPj4xICkgPj4gMSArIDEgKSA+PiAxCi0gICAgICAgIDsvLyBkUF8wbiA9ICggcVRlbXAxICsgMSApID4+IDEKLSAgICAgICAgCi0gICAgICAgIDsvLyBwUTBbLTIqU3RlcF0gPSAoT01YX1U4KSgocDIgKyBwMSArIHAwICsgcTAgKyAyKT4+Mik7Ci0gICAgICAgIAotICAgICAgICA7Ly8gZFBfMW4gPSAoT01YX1U4KSgoZFBfMiArIHFTcDBxMHAxICsgMik+PjIpOwotICAgICAgICA7Ly8gZFBfMW4gPSAoT01YX1U4KSgocVRlbXAyICsgMik+PjIpOwotICAgICAgICAKLSAgICAgICAgOy8vIHBRMFstMypTdGVwXSA9IChPTVhfVTgpKCgyKnAzICsgMypwMiArIHAxICsgcDAgKyBxMCArIDQpPj4zKTsKLSAgICAgICAgOy8vIHBRMFstMypTdGVwXSA9IChPTVhfVTgpKCggKHAzICsgcDIpICsgKHAxICsgcDAgKyBxMCArIHAyKSA+PiAxICsgMik+PjIpOwotCi0gICAgICAgIDsvLyBkUF8ybiA9IChPTVhfVTgpKCggcVNwM3AyICsgKGRQXzIgKyBxU3AwcTBwMSkgPj4gMSArIDIpID4+IDIpOwotICAgICAgICA7Ly8gZFBfMm4gPSAoT01YX1U4KSgoIHFTcDNwMiArIHFUZW1wMiA+PiAxICsgMikgPj4gMik7Ci0KLSAgICAgICAgOy8vIHFUZW1wMS1xU3AycTEtMTEKLSAgICAgICAgOy8vIHFUZW1wMi1xU3AwcTBwMS0xMgotICAgICAgICBWSEFERCAgICAgICBxVGVtcDEsIHFTcDBxMHAxLCBxU3AycTEKLSAgICAgICAgVkFERFcgICAgICAgcVRlbXAyLCBxU3AwcTBwMSwgZFBfMiAgCi0gICAgICAgIAotICAgICAgICA7Ly8gcVNwM3AyLTEzCi0gICAgICAgIFZBRERMICAgICAgIHFTcDNwMiwgZFBfMywgZFBfMiAgICAgIAotCi0gICAgICAgIFZBTkQgICAgICAgIGRBcGZsZywgZEFwZmxnLCBkVGVtcAotICAgICAgICBWSEFERCAgICAgICBkSFNwMHExLCBkUF8wLCBkUV8xICAgICAKLSAgICAgICAgVlNSQSAgICAgICAgcVNwM3AyLCBxVGVtcDIsICMxICAgICAgCi0gICAgICAgIDsvLyBkSFNwMHExLTI4Ci0gICAgICAgIFZBTkQgICAgICAgIGRBcWZsZywgZEFxZmxnLCBkVGVtcAotCi0gICAgICAgIDsvLyBkUF8wbi0yOQotICAgICAgICA7Ly8gZFBfMHQtZEhTcDBxMS0yOAotICAgICAgICBWUVJTSFJOICAgICBkUF8wbiwgcVRlbXAxLCAjMQotICAgICAgICBWUkhBREQgICAgICBkUF8wdCwgZEhTcDBxMSwgZFBfMSAgICAKLQotICAgICAgICA7Ly8gZFBfMW4tMzAKLSAgICAgICAgVlFSU0hSTiAgICAgZFBfMW4sIHFUZW1wMiwgIzIKLSAgICAgICAgCi0gICAgICAgIFZBRERMICAgICAgIHFTcTJwMSwgZFFfMiwgZFBfMSAgICAgICAgICAKLSAgICAgICAgVkFERFcgICAgICAgcVNwMHEwcTEsIHFTcDBxMCwgZFFfMSAgICAgIAotICAgICAgICAKLSAgICAgICAgVkJJRiAgICAgICAgZFBfMG4sIGRQXzB0LCBkQXBmbGcgICAgCi0KLSAgICAgICAgOy8vIFEgRmlsdGVyCi0KLSAgICAgICAgOy8vIHBRMFswKlN0ZXBdID0gKE9NWF9VOCkoKHEyICsgMipxMSArIDIqcTAgKyAyKnAwICsgcDEgKyA0KT4+Myk7Ci0gICAgICAgIDsvLyBwUTBbMCpTdGVwXSA9ICggKCAocDAgKyBxMCArIHExKSArIChxMiArIHAxKT4+MSApID4+IDEgKyAxICkgPj4gMQotCi0gICAgICAgIDsvLyBkUV8wbiA9ICggKCAocVNwMHEwICsgZFFfMSkgKyBxU3EycDE+PjEgKSA+PiAxICsgMSApID4+IDEKLSAgICAgICAgOy8vIGRRXzBuID0gKCAoIHFTcDBxMHExICsgcVNxMnAxPj4xICkgPj4gMSArIDEgKSA+PiAxCi0gICAgICAgIDsvLyBkUV8wbiA9ICggcVRlbXAxICsgMSApID4+IDEKLSAgICAgICAgCi0gICAgICAgIDsvLyBwUTBbMSpTdGVwXSA9IChPTVhfVTgpKChxMiArIHExICsgcTAgKyBxMCArIDIpPj4yKTsKLSAgICAgICAgCi0gICAgICAgIDsvLyBkUV8xbiA9IChPTVhfVTgpKChkUV8yICsgcVNwMHEwcTEgKyAyKT4+Mik7Ci0gICAgICAgIDsvLyBkUV8xbiA9IChPTVhfVTgpKChxVGVtcDIgKyAyKT4+Mik7Ci0gICAgICAgIAotICAgICAgICA7Ly8gcFEwWzIqU3RlcF0gPSAoT01YX1U4KSgoMipxMyArIDMqcTIgKyBxMSArIHEwICsgcDAgKyA0KT4+Myk7Ci0gICAgICAgIDsvLyBwUTBbMipTdGVwXSA9IChPTVhfVTgpKCggKHEzICsgcTIpICsgKHExICsgcDAgKyBxMCArIHEyKSA+PiAxICsgMik+PjIpOwotCi0gICAgICAgIDsvLyBkUV8ybiA9IChPTVhfVTgpKCggcVNxM3EyICsgKGRRXzIgKyBxU3AwcTBxMSkgPj4gMSArIDIpID4+IDIpOwotICAgICAgICA7Ly8gZFFfMm4gPSAoT01YX1U4KSgoIHFTcTNxMiArIHFUZW1wMiA+PiAxICsgMikgPj4gMik7Ci0KLSAgICAgICAgOy8vIHFUZW1wMS1xU3AycTEtMTEKLSAgICAgICAgOy8vIHFUZW1wMi1xU3AwcTBwMS0xMgotICAgICAgICA7Ly8gcVNxMnAxLTExCi0gICAgICAgIDsvLyBxU3AwcTBxMS0xMgotCi0KLSAgICAgICAgOy8vIHFUZW1wMi1xU3AwcTBwMS0xMgotICAgICAgICA7Ly8gcVRlbXAxLXFTcTJwMS0xMQotICAgICAgICA7Ly8gcVNxM3EyLTEzCi0gICAgICAgIDsvLyBkUF8ybi0zMQotICAgICAgICAKLSAgICAgICAgVlFSU0hSTiAgICAgZFBfMm4sIHFTcDNwMiwgIzIKLSAgICAgICAgVkFEREwgICAgICAgcVNxM3EyLCBkUV8zLCBkUV8yICAgICAgICAgIAotCi0gICAgICAgIFZTSFIgICAgICAgIHFTcTJwMSwgIzEgICAgICAgICAgICAgICAgICAKLQotICAgICAgICBWSEFERCAgICAgICBxVGVtcDEsIHFTcDBxMHExLCBxU3EycDEKLSAgICAgICAgVkFERFcgICAgICAgcVRlbXAyLCBxU3AwcTBxMSwgZFFfMiAgICAgIAotCi0gICAgICAgIDsvLyBkSFNxMHAxLTI4Ci0gICAgICAgIFZIQUREICAgICAgIGRIU3EwcDEsIGRRXzAsIGRQXzEgICAgICAgICAKLQotICAgICAgICBWQklGICAgICAgICBkUF8wbiwgZFBfMCwgZEZpbHQKLSAgICAgICAgVkJJRiAgICAgICAgZFBfMW4sIGRQXzEsIGRBcGZsZwotCi0gICAgICAgIFZTUkEgICAgICAgIHFTcTNxMiwgcVRlbXAyLCAjMSAgICAgICAgICAKLQotICAgICAgICA7Ly8gZFFfMS1UZW1wMi0yNQotICAgICAgICA7Ly8gZFFfMC1UZW1wMi0yNAotICAgICAgICBWUVJTSFJOICAgICBkUV8xbiwgcVRlbXAyLCAjMgotICAgICAgICBWUVJTSFJOICAgICBkUV8wbiwgcVRlbXAxLCAjMQotCi0gICAgICAgIDsvLyBkUV8wdC1UZW1wMS0yMgotICAgICAgICBWUkhBREQgICAgICBkUV8wdCwgZEhTcTBwMSwgZFFfMQotICAgICAgICBWQklGICAgICAgICBkUV8xbiwgZFFfMSwgZEFxZmxnICAgICAgICAgCi0KLSAgICAgICAgVkJJRiAgICAgICAgZFBfMm4sIGRQXzIsIGRBcGZsZyAgICAgICAgCi0gICAgICAgIFZCSUYgICAgICAgIGRRXzBuLCBkUV8wdCwgZEFxZmxnICAgICAgICAKLSAgICAgICAgVlFSU0hSTiAgICAgZFFfMm4sIHFTcTNxMiwgIzIKLSAgICAgICAgVkJJRiAgICAgICAgZFFfMG4sIGRRXzAsIGRGaWx0Ci0gICAgICAgIFZCSUYgICAgICAgIGRRXzJuLCBkUV8yLCBkQXFmbGcgICAgICAgCi0KLSAgICAgICAgTV9FTkQKLSAgICAgICAgCi0gICAgRU5ESUYgIAotCi0KLSAgICAgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTNhMGQ1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMzM5ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcl9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICAxMjI5MAotOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fQml0RGVjX3MuaAotICAgICAgICAKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzCi0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzCi0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlcwotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlcwotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9TdWZmaXhUb0xldmVsCi0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1ppZ1phZ180eDQKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfWmlnWmFnXzJ4MgotICAgICAgICAKLSAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLSAgICAgICAgCi07Ly9ERUJVR19PTiAgICBTRVRMIHtUUlVFfQotICAgICAgICAKLUxBU1RfQ09FRkYgICAgICAgICAgICAgICBFUVUgMHgyMCAgICAgICAgOy8vIEVuZCBvZiBibG9jayBmbGFnCi1UV09fQllURV9DT0VGRiAgICAgICAgICAgRVFVIDB4MTAKLQotOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCi0KLXBwQml0U3RyZWFtICAgICBSTiAwCi1wT2Zmc2V0ICAgICAgICAgUk4gMQotcE51bUNvZWZmICAgICAgIFJOIDIKLXBwUG9zQ29lZmJ1ZiAgICBSTiAzCi1uQyAgICAgICAgICAgICAgUk4gNCA7Ly8gbnVtYmVyIG9mIGNvZWZmcyBvciAxNyBmb3IgY2hyb21hCi1zTWF4TnVtQ29lZmYgICAgUk4gNQotCi07Ly8gRGVjbGFyZSBpbm5lciBsb29wIHJlZ2lzdGVycwotCi07Ly8gTGV2ZWwgbG9vcAotQ291bnQgICAgICAgICAgIFJOIDAKLVRyYWlsaW5nT25lcyAgICBSTiAxCi1wTGV2ZWwgICAgICAgICAgUk4gMgotTGV2ZWxTdWZmaXggICAgIFJOIDMKLVN1ZmZpeExlbmd0aCAgICBSTiA0Ci1Ub3RhbENvZWZmICAgICAgUk4gNQotCi1wVkxEVGFibGUgICAgICAgUk4gNgotU3ltYm9sICAgICAgICAgIFJOIDcKLVQxICAgICAgICAgICAgICBSTiA4Ci1UMiAgICAgICAgICAgICAgUk4gOQotUkJpdFN0cmVhbSAgICAgIFJOIDEwCi1SQml0QnVmZmVyICAgICAgUk4gMTEKLVJCaXRDb3VudCAgICAgICBSTiAxMgotbHIgICAgICAgICAgICAgIFJOIDE0Ci0KLTsvLyBSdW4gbG9vcAotQ291bnQgICAgICAgICAgIFJOIDAKLVplcm9zTGVmdCAgICAgICBSTiAxCi1wTGV2ZWwgICAgICAgICAgUk4gMgotcHBSdW5UYWJsZSAgICAgIFJOIDMKLXBSdW4gICAgICAgICAgICBSTiA0Ci1Ub3RhbENvZWZmICAgICAgUk4gNQotCi1wVkxEVGFibGUgICAgICAgUk4gNgotU3ltYm9sICAgICAgICAgIFJOIDcKLVQxICAgICAgICAgICAgICBSTiA4Ci1UMiAgICAgICAgICAgICAgUk4gOQotUkJpdFN0cmVhbSAgICAgIFJOIDEwCi1SQml0QnVmZmVyICAgICAgUk4gMTEKLVJCaXRDb3VudCAgICAgICBSTiAxMgotbHIgICAgICAgICAgICAgIFJOIDE0Ci0KLTsvLyBGaWxsIGluIGNvZWZmaWNpZW50cyBsb29wCi1wUG9zQ29lZmJ1ZiAgICAgUk4gMAotdGVtcCAgICAgICAgICAgIFJOIDEKLXBMZXZlbCAgICAgICAgICBSTiAyCi1wcFBvc0NvZWZidWYgICAgUk4gMwotcFJ1biAgICAgICAgICAgIFJOIDQKLVRvdGFsQ29lZmYgICAgICBSTiA1Ci1wWmlnWmFnICAgICAgICAgUk4gNgotCi1UMSAgICAgICAgICAgICAgUk4gOAotVDIgICAgICAgICAgICAgIFJOIDkKLVJCaXRTdHJlYW0gICAgICBSTiAxMAotUkJpdEJ1ZmZlciAgICAgIFJOIDExCi1SQml0Q291bnQgICAgICAgUk4gMTIKLUNvZWZmTnVtICAgICAgICBSTiAxNAotCi0KLQotICAgIElGIEFSTTExMzZKUwotICAgICAgICAKLSAgICAgICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSByZXF1aXJlZCBieSB0aGUgZnVuY3Rpb24KLSAgICAgICAgTV9BTExPQzQgcHBwQml0U3RyZWFtLCA0Ci0gICAgICAgIE1fQUxMT0M0IHBwT2Zmc2V0LCA0Ci0gICAgICAgIE1fQUxMT0M0IHBwcFBvc0NvZWZidWYsIDQKLSAgICAgICAgTV9BTExPQzQgcHBMZXZlbCwgMTYqMgotICAgICAgICBNX0FMTE9DNCBwcFJ1biwgMTYKLSAgICAgICAgCi0gICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpciwgcjExCi0gICAgICAgIAotICAgICAgICA7Ly8gRGVmaW5lIHN0YWNrIGFyZ3VtZW50cwotICAgICAgICBNX0FSRyAgIHBOQywgNAotICAgICAgICBNX0FSRyAgIHBTTWF4TnVtQ29lZmYsNAotICAgICAgICAKLSAgICAgICAgOy8vIENvZGUgc3RhcnQgICAgICAgIAotICAgICAgICBNX0JEX0lOSVQwIHBwQml0U3RyZWFtLCBwT2Zmc2V0LCBSQml0U3RyZWFtLCBSQml0QnVmZmVyLCBSQml0Q291bnQKLSAgICAgICAgTERSICAgICAgICBwVkxEVGFibGUsID1hcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlcwotICAgICAgICBNX0xEUiAgICAgIG5DLCBwTkMKLSAgICAgICAgCi0gICAgICAgIE1fQkRfSU5JVDEgVDEsIFQyLCBscgotICAgICAgICBMRFIgICAgIHBWTERUYWJsZSwgW3BWTERUYWJsZSwgbkMsIExTTCAjMl0gIDsvLyBGaW5kIFZMRCB0YWJsZSAgICAKLSAgICAgICAgCi0gICAgICAgIE1fQkRfSU5JVDIgVDEsIFQyLCBscgotCi0gICAgICAgIDsvLyBEZWNvZGUgU3ltYm9sID0gVG90YWxDb2VmZio0ICsgVHJhaWxpbmdPbmVzCi0gICAgICAgIE1fQkRfVkxEICBTeW1ib2wsIFQxLCBUMiwgcFZMRFRhYmxlLCA0LCAyCi0gICAgCi0gICAgICAgIE1PVlMgICAgVG90YWxDb2VmZiwgU3ltYm9sLCBMU1IgIzIgICAgCi0gICAgICAgIFNUUkIgICAgVG90YWxDb2VmZiwgW3BOdW1Db2VmZl0gICAgCi0gICAgICAgIE1fUFJJTlRGICJUb3RhbENvZWZmPSVkXG4iLCBUb3RhbENvZWZmCi0gICAgICAgIEJFUS5XICAgRW5kTm9FcnJvciAgICAgICAgICAgICAgICAgIDsvLyBGaW5pc2hlZCBpZiBubyBjb2VmZmljaWVudHMKLQotICAgICAgICBDTVAgICAgIFN5bWJvbCwgIzE3KjQKLSAgICAgICAgQkdFLlcgICBFbmRCYWRTeW1ib2wgICAgICAgICAgICAgICAgOy8vIEVycm9yIGlmIGJhZCBzeW1ib2wKLSAgICAgICAgCi0gICAgICAgIDsvLyBTYXZlIGJpdHN0cmVhbSBwb2ludGVycwotICAgICAgICBNX1NUUiAgIHBwQml0U3RyZWFtLCAgcHBwQml0U3RyZWFtCi0gICAgICAgIE1fU1RSICAgcE9mZnNldCwgICAgICBwcE9mZnNldAotICAgICAgICBNX1NUUiAgIHBwUG9zQ29lZmJ1ZiwgcHBwUG9zQ29lZmJ1ZiAgICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBEZWNvZGUgVHJhaWxpbmcgT25lcwotICAgICAgICBBTkRTICAgIFRyYWlsaW5nT25lcywgU3ltYm9sLCAjMwotICAgICAgICBNX0FEUiAgIHBMZXZlbCwgcHBMZXZlbCAgICAgICAgICAgIAotICAgICAgICBNX1BSSU5URiAiVHJhaWxpbmdPbmVzPSVkXG4iLCBUcmFpbGluZ09uZXMKLSAgICAgICAgQkVRICAgICBUcmFpbGluZ09uZXNEb25lICAgIAotICAgICAgICBNT1YgICAgIENvdW50LCBUcmFpbGluZ09uZXMKLVRyYWlsaW5nT25lc0xvb3AgICAgCi0gICAgICAgIE1fQkRfUkVBRDggU3ltYm9sLCAxLCBUMQotICAgICAgICBTVUJTICAgIENvdW50LCBDb3VudCwgIzEKLSAgICAgICAgTU9WICAgICBUMSwgIzEKLSAgICAgICAgU1VCICAgICBUMSwgVDEsIFN5bWJvbCwgTFNMICMxCi0gICAgICAgIE1fUFJJTlRGICJMZXZlbD0lZFxuIiwgVDEKLSAgICAgICAgU1RSSCAgICBUMSwgW3BMZXZlbF0sICMyCi0gICAgICAgIEJHVCAgICAgVHJhaWxpbmdPbmVzTG9vcAotVHJhaWxpbmdPbmVzRG9uZSAgICAKLSAgICAKLSAgICAgICAgOy8vIERlY29kZSBsZXZlbCB2YWx1ZXMgICAgCi0gICAgICAgIFNVQlMgICAgQ291bnQsIFRvdGFsQ29lZmYsIFRyYWlsaW5nT25lcyAgICAgOy8vIE51bWJlciBvZiBsZXZlbHMgdG8gcmVhZAotICAgICAgICBCRVEgICAgIERlY29kZVJ1bnMgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBOb25lIGxlZnQKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgU3VmZml4TGVuZ3RoLCAjMQotICAgICAgICBDTVAgICAgIFRvdGFsQ29lZmYsICMxMAotICAgICAgICBNT1ZMRSAgIFN1ZmZpeExlbmd0aCwgIzAKLSAgICAgICAgQ01QICAgICBUcmFpbGluZ09uZXMsICMzICAgIDsvLyBpZiAoVHJhaWxpbmdPbmVzPDMpCi0gICAgICAgIE1PVkxUICAgVHJhaWxpbmdPbmVzLCAjNCAgICA7Ly8gdGhlbiBUcmFpbGluZ09uZXMgPSArNAotICAgICAgICBNT1ZHRSAgIFRyYWlsaW5nT25lcywgIzIgICAgOy8vIGVsc2UgVHJhaWxpbmdPbmVzID0gKzIKLSAgICAgICAgTU9WR0UgICBTdWZmaXhMZW5ndGgsICMwICAgIDsvLyAgICAgIFN1ZmZpeExlbmd0aCA9IDAKLSAgICAgICAgCi1MZXZlbExvb3AKLSAgICAgICAgTV9CRF9DTFoxNiBTeW1ib2wsIFQxLCBUMiAgIDsvLyBTeW1ib2w9TGV2ZWxQcmVmaXgKLSAgICAgICAgQ01QICAgICBTeW1ib2wsIzE2Ci0gICAgICAgIEJHRSAgICAgRW5kQmFkU3ltYm9sCi0gICAgICAgIAotICAgICAgICBNT1ZTICAgIGxyLCBTdWZmaXhMZW5ndGggICAgOy8vIGlmIExldmVsU3VmZml4U2l6ZT09MAotICAgICAgICBURVFFUSAgIFN5bWJvbCwgIzE0ICAgICAgICAgOy8vICAgYW5kICBMZXZlbFByZWZpeD09MTQKLSAgICAgICAgTU9WRVEgICBsciwgIzQgICAgICAgICAgICAgIDsvLyAgIHRoZW4gTGV2ZWxTdWZmaXhTaXplPTQKLSAgICAgICAgVEVRICAgICBTeW1ib2wsICMxNSAgICAgICAgIDsvLyBpZiBMZXZlbFN1ZmZpeFNpemU9PTE1Ci0gICAgICAgIE1PVkVRICAgbHIsICMxMiAgICAgICAgICAgICA7Ly8gICB0aGVuIExldmVsU3VmZml4U2l6ZT0xMgotICAgICAgICAKLSAgICAgICAgVEVRRVEgICBTdWZmaXhMZW5ndGgsIzAKLSAgICAgICAgQURERVEgICBTeW1ib2wsU3ltYm9sLCMxNQotICAgICAgICAKLSAgICAgICAgVEVRICAgICBsciwgIzAgICAgICAgICAgICAgIDsvLyBpZiBMZXZlbFN1ZmZpeFNpemU9PTAKLSAgICAgICAgQkVRICAgICBMZXZlbENvZGVSZWFkICAgICAgIDsvLyBMZXZlbENvZGUgPSBMZXZlbFByZWZpeAotICAgICAgICAKLSAgICAgICAgTV9CRF9WUkVBRDE2IExldmVsU3VmZml4LCBsciwgVDEsIFQyICA7Ly8gUmVhZCBMZXZlbCBTdWZmaXgKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgU3ltYm9sLCBTeW1ib2wsIExTTCBTdWZmaXhMZW5ndGgKLSAgICAgICAgQUREICAgICBTeW1ib2wsIExldmVsU3VmZml4LCBTeW1ib2wKLSAgICAgICAgICAgICAKLUxldmVsQ29kZVJlYWQgICAgICAgIAotICAgICAgICA7Ly8gU3ltYm9sID0gTGV2ZWxDb2RlCi0gICAgICAgIEFERCAgICAgU3ltYm9sLCBTeW1ib2wsIFRyYWlsaW5nT25lcyA7Ly8gKzQgaWYgbGV2ZWwgY2Fubm90IGJlICsvLTEsICsyIG8vdwotICAgICAgICBNT1YgICAgIFRyYWlsaW5nT25lcywgIzIKLSAgICAgICAgTU9WUyAgICBUMSwgU3ltYm9sLCBMU1IgIzEKLSAgICAgICAgUlNCQ1MgICBUMSwgVDEsICMwICAgICAgICAgICAgICAgICAgOy8vIElmIFN5bWJvbCBvZGQgdGhlbiBuZWdhdGUKLSAgICAgICAgTV9QUklOVEYgIkxldmVsPSVkXG4iLCBUMQotICAgICAgICBTVFJIICAgIFQxLCBbcExldmVsXSwgIzIgICAgICAgICAgICA7Ly8gU3RvcmUgbGV2ZWwuCi0gICAgICAgIAotICAgICAgICBMRFIgICAgIFQyLCA9YXJtVkNNNFAxMF9TdWZmaXhUb0xldmVsCi0gICAgICAgIExEUlNCICAgVDEsIFtUMiwgU3VmZml4TGVuZ3RoXSAgICAgIDsvLyBGaW5kIGluY3JlbWVudCBsZXZlbCAgICAgICAgCi0gICAgICAgIFRFUSAgICAgU3VmZml4TGVuZ3RoLCAjMAotICAgICAgICBNT1ZFUSAgIFN1ZmZpeExlbmd0aCwgIzEKLSAgICAgICAgQ01QICAgICBTeW1ib2wsIFQxCi0gICAgICAgIEFERENTICAgU3VmZml4TGVuZ3RoLCBTdWZmaXhMZW5ndGgsICMxICAgICAgICAKLSAgICAgICAgU1VCUyAgICBDb3VudCwgQ291bnQsICMxICAgICAgICAKLSAgICAgICAgQkdUICAgICBMZXZlbExvb3AKLSAgICAgICAgCi1EZWNvZGVSdW5zICAgICAgICAKLSAgICAgICAgOy8vIEZpbmQgbnVtYmVyIG9mIHplcm9zCi0gICAgICAgIE1fTERSICAgVDEsIHBTTWF4TnVtQ29lZmYgICAgICAgICAgIDsvLyBzTWF4TnVtQ29lZmYKLSAgICAgICAgU1VCICAgICBDb3VudCwgVG90YWxDb2VmZiwgIzEgICAgICAgOy8vIE51bWJlciBvZiBydW5zIGV4Y2x1ZGluZyBsYXN0Ci0gICAgICAgIFNVQlMgICAgWmVyb3NMZWZ0LCBUMSwgVG90YWxDb2VmZiAgIDsvLyBNYXhpbXVtIG51bWJlciBvZiB6ZXJvcyB0aGVyZSBjb3VsZCBiZQotICAgICAgICBNX0FEUiAgIHBSdW4sIHBwUnVuCi0gICAgICAgIE1PViAgICAgQ29lZmZOdW0sVG90YWxDb2VmZgotICAgICAgICBTVUIgICAgIENvZWZmTnVtLENvZWZmTnVtLCMxCi0gICAgICAgIEJFUSAgICAgTm9aZXJvc0xlZnQKLSAgICAgICAgCi0gICAgICAgIDsvLyBVbnBhY2sgbnVtYmVyIG9mIHplcm9zIGZyb20gYml0c3RyZWFtCi0gICAgICAgIFRFUSAgICAgVDEsICM0ICAgICAgICAKLSAgICAgICAgTERSRVEgICBwVkxEVGFibGUsID0oYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXMtNCkKLSAgICAgICAgTERSTkUgICBwVkxEVGFibGUsID0oYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlcy00KQotICAgICAgICBMRFIgICAgIHBWTERUYWJsZSwgW3BWTERUYWJsZSwgVG90YWxDb2VmZiwgTFNMICMyXQotICAgICAgICAKLSAgICAgICAgTV9CRF9WTEQgIFN5bWJvbCwgVDEsIFQyLCBwVkxEVGFibGUsIDQsIDIgOy8vIFN5bWJvbCA9IFplcm9zTGVmdAotICAgICAgICBDTVAgICAgIFN5bWJvbCwjMTYKLSAgICAgICAgQkdFICAgICBFbmRCYWRTeW1ib2wKLQotICAgICAgICBMRFIgICAgIHBwUnVuVGFibGUsID0oYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlcy00KQotICAgICAgICBNX0FEUiAgIHBSdW4sIHBwUnVuCi0gICAgICAgIE1PVlMgICAgWmVyb3NMZWZ0LCBTeW1ib2wKLQotICAgICAgICBBREQgICAgIENvZWZmTnVtLENvZWZmTnVtLFplcm9zTGVmdCAgICAgICAgCi0KLSAgICAgICAgQkVRICAgICBOb1plcm9zTGVmdAotICAgICAgICAKLSAgICAgICAgOy8vIERlY29kZSBydW5zIHdoaWxlIHplcm9zIGFyZSBsZWZ0IGFuZCBtb3JlIHRoYW4gb25lIGNvZWZmaWNpZW50Ci1SdW5Mb29wIAotICAgICAgICBTVUJTICAgIENvdW50LCBDb3VudCwgIzEKLSAgICAgICAgTERSICAgICBwVkxEVGFibGUsIFtwcFJ1blRhYmxlLCBaZXJvc0xlZnQsIExTTCMyXQotICAgICAgICBCTFQgICAgIExhc3RSdW4KLSAgICAgICAgTV9CRF9WTEQgIFN5bWJvbCwgVDEsIFQyLCBwVkxEVGFibGUsIDMsIDIgOy8vIFN5bWJvbCA9IFJ1bgotICAgICAgICBDTVAgICAgIFN5bWJvbCwjMTUgICAgICAgICAKLSAgICAgICAgQkdFICAgICBFbmRCYWRTeW1ib2wgICAgICAgIAotCi0gICAgICAgIFNVQlMgICAgWmVyb3NMZWZ0LCBaZXJvc0xlZnQsIFN5bWJvbAotICAgICAgICBNX1BSSU5URiAiUnVuPSVkXG4iLCBTeW1ib2wKLSAgICAgICAgU1RSQiAgICBTeW1ib2wsIFtwUnVuXSwgIzEKLSAgICAgICAgQkdUICAgICBSdW5Mb29wCi0gICAgICAgIAotICAgICAgICA7Ly8gRGVjb2RlIHJ1bnMgd2hpbGUgbm8gemVyb3MgYXJlIGxlZnQKLU5vWmVyb3NMZWZ0IAotICAgICAgICBTVUJTICAgIENvdW50LCBDb3VudCwgIzEKLSAgICAgICAgTV9QUklOVEYgIlJ1bj0lZFxuIiwgWmVyb3NMZWZ0Ci0gICAgICAgIFNUUkdFQiAgWmVyb3NMZWZ0LCBbcFJ1bl0sICMxCi0gICAgICAgIEJHVCAgICAgTm9aZXJvc0xlZnQKLQotTGFzdFJ1biAgICAgICAgCi0gICAgICAgIDsvLyBGaW5hbCBydW4gbGVuZ3RoIGlzIHJlbWFpbmluZyB6ZXJvcwotICAgICAgICBNX1BSSU5URiAiTGFzdFJ1bj0lZFxuIiwgWmVyb3NMZWZ0Ci0gICAgICAgIFNUUkIgICAgWmVyb3NMZWZ0LCBbcFJ1bl0sICMxICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBXcml0ZSBjb2VmZmljaWVudHMgdG8gb3V0cHV0IGFycmF5Ci0gICAgICAgIE1fTERSICAgVDEsIHBTTWF4TnVtQ29lZmYgICAgICAgICAgICAgICAgICAgIDsvLyBzTWF4TnVtQ29lZmYKLSAgICAgICAgVEVRICAgICBUMSwgIzE1Ci0gICAgICAgIEFEREVRICAgQ29lZmZOdW0sQ29lZmZOdW0sIzEKLSAgICAgICAgCi0KLSAgICAgICAgU1VCICAgICBwUnVuLHBSdW4sVG90YWxDb2VmZgotICAgICAgICBTVUIgICAgIHBMZXZlbCxwTGV2ZWwsVG90YWxDb2VmZiAgCi0gICAgICAgIFNVQiAgICAgcExldmVsLHBMZXZlbCxUb3RhbENvZWZmICAgCi0KLSAgICAgICAgTV9MRFIgICBwcFBvc0NvZWZidWYsIHBwcFBvc0NvZWZidWYKLSAgICAgICAgTERSICAgICBwUG9zQ29lZmJ1ZiwgW3BwUG9zQ29lZmJ1Zl0KLSAgICAgICAgVEVRICAgICBUMSwgIzQKLSAgICAgICAgTERSRVEgICBwWmlnWmFnLCA9YXJtVkNNNFAxMF9aaWdaYWdfMngyCi0gICAgICAgIExEUk5FICAgcFppZ1phZywgPWFybVZDTTRQMTBfWmlnWmFnXzR4NAotCi0gICAgICAgIAotICAgICAgICAKLU91dHB1dExvb3AKLSAgICAgICAgCi0gICAgICAgIExEUkIgICAgVDIsIFtwUnVuXSwjMQotICAgICAgICBMRFJCICAgIFQxLCBbcFppZ1phZywgQ29lZmZOdW1dCi0gICAgICAgIFNVQiAgICAgQ29lZmZOdW0sIENvZWZmTnVtLCAjMSAgICAgIDsvLyBTa2lwIE5vbiB6ZXJvCi0gICAgICAgIFNVQiAgICAgQ29lZmZOdW0sIENvZWZmTnVtLCBUMiAgICAgIDsvLyBTa2lwIFplcm8gcnVuCi0gICAgICAgIAotICAgICAgICBMRFJTSCAgIFQyLCBbcExldmVsXSwjMgotICAgICAgICAKLSAgICAgICAgU1VCUyAgICBUb3RhbENvZWZmLCBUb3RhbENvZWZmLCAjMSAgICAgICAKLSAgICAgICAgT1JSRVEgICBUMSwgVDEsICNMQVNUX0NPRUZGCi0gICAgICAgIAotICAgICAgICBBREQgICAgIHRlbXAsIFQyLCAjMTI4Ci0gICAgICAgIENNUCAgICAgdGVtcCwgIzI1NgotICAgICAgICBPUlJDUyAgIFQxLCBUMSwgI1RXT19CWVRFX0NPRUZGCi0KLSAgICAgICAgCi0gICAgICAgIFRFUSAgICAgVG90YWxDb2VmZiwgIzAgICAgICAgICAgICAgIDsvLyBQcmVzZXJ2ZXMgY2FycnkgICAgICAgIAotICAgICAgICAKLSAgICAgICAgTV9QUklOVEYgIk91dHB1dD0lMDJ4ICUwNHhcbiIsIFQxLCBUMgotICAgICAgICBTVFJCICAgIFQxLCBbcFBvc0NvZWZidWZdLCAjMQotICAgICAgICBTVFJCICAgIFQyLCBbcFBvc0NvZWZidWZdLCAjMQotICAgICAgICBNT1YgICAgIFQyLCBUMiwgTFNSICM4Ci0gICAgICAgIFNUUkNTQiAgVDIsIFtwUG9zQ29lZmJ1Zl0sICMxICAgICAgICAgICAgICAgIAotICAgICAgICBCTkUgICAgIE91dHB1dExvb3AKLSAgICAgICAgCi0gICAgICAgIDsvLyBGaW5pc2hlZAotICAgICAgICBTVFIgICAgIHBQb3NDb2VmYnVmLCBbcHBQb3NDb2VmYnVmXQotICAgICAgICBNX0xEUiAgIHBwQml0U3RyZWFtLCBwcHBCaXRTdHJlYW0KLSAgICAgICAgTV9MRFIgICBwT2Zmc2V0LCBwcE9mZnNldAotICAgICAgICBCICAgICAgIEVuZE5vRXJyb3IKLSAgICAgICAgICAgIAotRW5kQmFkU3ltYm9sCi0gICAgICAgIE1PViAgICAgcjAsICNPTVhfU3RzX0VycgotICAgICAgICBCICAgICAgIEVuZCAgICAKLSAgICAgICAgCi1FbmROb0Vycm9yCi0gICAgICAgIDsvLyBGaW5pc2hlZCByZWFkaW5nIGZyb20gdGhlIGJpdHN0cmVhbSAgICAgICAgICAgICAgICAKLSAgICAgICAgTV9CRF9GSU5JIHBwQml0U3RyZWFtLCBwT2Zmc2V0Ci0gICAgICAgIAotICAgICAgICA7Ly8gU2V0IHJldHVybiB2YWx1ZQotICAgICAgICBNT1YgICAgIHIwLCAjT01YX1N0c19Ob0VyciAgICAKLUVuZAotICAgICAgICBNX0VORAotICAgIAotICAgIEVORElGCi0gICAgCi0gICAgRU5ECi0gICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVxdWFudFRhYmxlc19zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVxdWFudFRhYmxlc19zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjZThjODkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgMTIyOTAKLTsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi0gICAgICAgIAotCi0gICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAKLSAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX1FQRGl2VGFibGUKLSAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlCi0gICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9Qb3NUb1ZDb2w0eDQKLSAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX1Bvc1RvVkNvbDJ4MgotICAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfVk1hdHJpeCAKLSAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX1FQTW9kdWxvVGFibGUKLSAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX1ZNYXRyaXhVMTYKLSAgICAgICAgIAotOy8vIERlZmluZSB0aGUgcHJvY2Vzc29yIHZhcmlhbnRzIHN1cHBvcnRlZCBieSB0aGlzIGZpbGUKLSAgICAgICAgIAotICAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAotICAgICAgICAgICAKLSAgICAgICAgIAotOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQotCi0gICAgCi0gICAgSUYgQ29ydGV4QTgKLSAgICAgICAgICAgCi0gCi0gICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfUG9zVG9WQ29sNHg0Ci0gICAgICAgICBEQ0IgIDAsIDIsIDAsIDIKLSAgICAgICAgIERDQiAgMiwgMSwgMiwgMQotICAgICAgICAgRENCICAwLCAyLCAwLCAyCi0gICAgICAgICBEQ0IgIDIsIDEsIDIsIDEKLQotCi0gICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfUG9zVG9WQ29sMngyCi0gICAgICAgICBEQ0IgIDAsIDIKLSAgICAgICAgIERDQiAgMiwgMQotCi0KLSAgICAgICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9WTWF0cml4Ci0gICAgICAgICBEQ0IgIDEwLCAxNiwgMTMKLSAgICAgICAgIERDQiAgMTEsIDE4LCAxNAotICAgICAgICAgRENCICAxMywgMjAsIDE2Ci0gICAgICAgICBEQ0IgIDE0LCAyMywgMTgKLSAgICAgICAgIERDQiAgMTYsIDI1LCAyMAotICAgICAgICAgRENCICAxOCwgMjksIDIzCi0KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBUaGlzIHRhYmxlIGV2YWx1YXRlcyB0aGUgZXhwcmVzc2lvbiBbKElOVCkoUVAvNildLAotOy8vIGZvciB2YWx1ZXMgb2YgUVAgZnJvbSAwIHRvIDUxIChpbmNsdXNpdmUpLiAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAgTV9UQUJMRSBhcm1WQ000UDEwX1FQRGl2VGFibGUKLSAgICAgICAgIERDQiAgMCwgIDAsICAwLCAgMCwgIDAsICAwCi0gICAgICAgICBEQ0IgIDEsICAxLCAgMSwgIDEsICAxLCAgMQotICAgICAgICAgRENCICAyLCAgMiwgIDIsICAyLCAgMiwgIDIKLSAgICAgICAgIERDQiAgMywgIDMsICAzLCAgMywgIDMsICAzCi0gICAgICAgICBEQ0IgIDQsICA0LCAgNCwgIDQsICA0LCAgNAotICAgICAgICAgRENCICA1LCAgNSwgIDUsICA1LCAgNSwgIDUKLSAgICAgICAgIERDQiAgNiwgIDYsICA2LCAgNiwgIDYsICA2Ci0gICAgICAgICBEQ0IgIDcsICA3LCAgNywgIDcsICA3LCAgNwotICAgICAgICAgRENCICA4LCAgOCwgIDgsICA4LCAgOCwgIDgKLSAgICAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBUaGlzIHRhYmxlIGNvbnRhaW5zIGFybVZDTTRQMTBfVk1hdHJpeFtRUCU2XVswXSBlbnRpcmVzLAotOy8vIGZvciB2YWx1ZXMgb2YgUVAgZnJvbSAwIHRvIDUxIChpbmNsdXNpdmUpLiAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAgTV9UQUJMRSBhcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlCi0gICAgICAgICBEQ0IgMTAsIDExLCAxMywgMTQsIDE2LCAxOAotICAgICAgICAgRENCIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKLSAgICAgICAgIERDQiAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4Ci0gICAgICAgICBEQ0IgMTAsIDExLCAxMywgMTQsIDE2LCAxOAotICAgICAgICAgRENCIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKLSAgICAgICAgIERDQiAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4Ci0gICAgICAgICBEQ0IgMTAsIDExLCAxMywgMTQsIDE2LCAxOAotICAgICAgICAgRENCIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKLSAgICAgICAgIERDQiAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4Ci0gICAgCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gVGhpcyB0YWJsZSBldmFsdWF0ZXMgdGhlIG1vZHVsdXMgZXhwcmVzc2lvbiBbUVAlNl0qNiwKLTsvLyBmb3IgdmFsdWVzIG9mIFFQIGZyb20gMCB0byA1MSAoaW5jbHVzaXZlKS4gCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9RUE1vZHVsb1RhYmxlCi0gICAgICAgICBEQ0IgMCwgNiwgMTIsIDE4LCAyNCwgMzAKLSAgICAgICAgIERDQiAwLCA2LCAxMiwgMTgsIDI0LCAzMAotICAgICAgICAgRENCIDAsIDYsIDEyLCAxOCwgMjQsIDMwCi0gICAgICAgICBEQ0IgMCwgNiwgMTIsIDE4LCAyNCwgMzAKLSAgICAgICAgIERDQiAwLCA2LCAxMiwgMTgsIDI0LCAzMAotICAgICAgICAgRENCIDAsIDYsIDEyLCAxOCwgMjQsIDMwCi0gICAgICAgICBEQ0IgMCwgNiwgMTIsIDE4LCAyNCwgMzAKLSAgICAgICAgIERDQiAwLCA2LCAxMiwgMTgsIDI0LCAzMAotICAgICAgICAgRENCIDAsIDYsIDEyLCAxOCwgMjQsIDMwCi0gICAgICAgIAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIFRoaXMgdGFibGUgY29udGFpbnMgdGhlIGludmlkdWFsIGJ5dGUgdmFsdWVzIHN0b3JlZCBhcwotOy8vIGhhbGZ3b3Jkcy4gVGhpcyBhdm9pZHMgdW5wYWNraW5nIGluc2lkZSB0aGUgZnVuY3Rpb24KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgCi0gICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfVk1hdHJpeFUxNgotICAgICAgICAgRENXIDEwLCAxNiwgMTMgCi0gICAgICAgICBEQ1cgMTEsIDE4LCAxNAotICAgICAgICAgRENXIDEzLCAyMCwgMTYKLSAgICAgICAgIERDVyAxNCwgMjMsIDE4Ci0gICAgICAgICBEQ1cgMTYsIDI1LCAyMAotICAgICAgICAgRENXIDE4LCAyOSwgMjMgCi0gICAgICAgICAKLSAgICBFTkRJRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vQVJNMTEzNkpTICAgICAgICAgICAgCi0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgCi0gICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQWxpZ25fdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQWxpZ25fdW5zYWZlX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBiM2UyMi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0FsaWduX3Vuc2FmZV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0FsaWduX3Vuc2FmZV9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICAxMjI5MAotOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgICAKLSAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLQotICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUKLSAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckFsaWduNHhfdW5zYWZlCi0KLURFQlVHX09OICAgIFNFVEwge0ZBTFNFfQotCi0gICAgSUYgQVJNMTEzNkpTIAotCi07Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKLXBTcmMgICAgICAgICAgICBSTiAwCi1zcmNTdGVwICAgICAgICAgUk4gMQotcERzdCAgICAgICAgICAgIFJOIDgKLWlIZWlnaHQgICAgICAgICBSTiA5Ci0KLTsvLyBEZWNsYXJlIGlubmVyIGxvb3AgcmVnaXN0ZXJzCi14ICAgICAgICAgICAgICAgUk4gNwoteDAgICAgICAgICAgICAgIFJOIDcKLXgxICAgICAgICAgICAgICBSTiAxMAoteDIgICAgICAgICAgICAgIFJOIDExCi1TY3JhdGNoICAgICAgICAgUk4gMTIKLQotOy8vIEZ1bmN0aW9uOiAKLTsvLyAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUKLTsvLwotOy8vIEltcGxlbWVudHMgY29weSBmcm9tIGFuIGFyYml0cmFyeSBhbGlnbmVkIHNvdXJjZSBtZW1vcnkgbG9jYXRpb24gKHBTcmMpIHRvIGEgNCBieXRlIGFsaWduZWQKLTsvLyBkZXN0aW5hdGlvbiBwb2ludGVkIGJ5IChwRHN0KSBmb3IgaG9yaXpvbnRhbCBpbnRlcnBvbGF0aW9uLgotOy8vIFRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gY29weSA5IGJ5dGVzIGluIGhvcml6b250YWwgZGlyZWN0aW9uLiAKLTsvLwotOy8vIFJlZ2lzdGVycyB1c2VkIGFzIGlucHV0IGZvciB0aGlzIGZ1bmN0aW9uCi07Ly8gcjAscjEscjgscjkgd2hlcmUgcjggY29udGFpbmluZ3MgYWxpZ25lZCBtZW1vcnkgcG9pbnRlciBhbmQgcjkgbm8gcm93cyB0byBjb3B5Ci07Ly8KLTsvLyBSZWdpc3RlcnMgcHJlc2VydmVkIGZvciB0b3AgbGV2ZWwgZnVuY3Rpb24KLTsvLyByMixyMyxyNCxyNSxyNgotOy8vCi07Ly8gUmVnaXN0ZXJzIG1vZGlmaWVkIGJ5IHRoZSBmdW5jdGlvbgotOy8vIHI3LHI4LHI5LHIxMCxyMTEscjEyCi07Ly8KLTsvLyBPdXRwdXQgcmVnaXN0ZXJzCi07Ly8gcjAgLSBwb2ludGVyIHRvIHRoZSBuZXcgYWxpZ25lZCBsb2NhdGlvbiB3aGljaCB3aWxsIGJlIHVzZWQgYXMgcFNyYwotOy8vIHIxIC0gc3RlcCBzaXplIHRvIHRoaXMgYWxpZ25lZCBsb2NhdGlvbgotCi0gICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZSAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gQ29weSBwRHN0IHRvIHNjcmF0Y2gKLSAgICAgICAgTU9WICAgICBTY3JhdGNoLCBwRHN0Ci0KLVN0YXJ0QWxpZ25lZFN0YWNrQ29weQotICAgICAgICBBTkQgICAgIHgsIHBTcmMsICMzCi0gICAgICAgIEJJQyAgICAgcFNyYywgcFNyYywgIzMKLSAgICAgICAgCi0gICAgICAgIE1fU1dJVENIIHgKLSAgICAgICAgTV9DQVNFICAgQ29weTB0b0FsaWduZWQKLSAgICAgICAgTV9DQVNFICAgQ29weTF0b0FsaWduZWQKLSAgICAgICAgTV9DQVNFICAgQ29weTJ0b0FsaWduZWQKLSAgICAgICAgTV9DQVNFICAgQ29weTN0b0FsaWduZWQKLSAgICAgICAgTV9FTkRTV0lUQ0gKLQotQ29weTB0b0FsaWduZWQgIAotICAgICAgICBMRE0gICAgIHBTcmMsIHt4MCwgeDEsIHgyfQotICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMxCi0gICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgc3JjU3RlcAotICAgICAgICAKLSAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAotCi0gICAgICAgIFNUTSAgICAgcERzdCEsIHt4MCwgeDEsIHgyfSAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBhbGlnbmVkIG91dHB1dCByb3cKLSAgICAgICAgQkdUICAgICBDb3B5MHRvQWxpZ25lZAotICAgICAgICBCICAgICAgIENvcHlFbmQgIAotICAgICAgCi1Db3B5MXRvQWxpZ25lZCAgICAgICAgCi0gICAgICAgIExETSAgICAgcFNyYywge3gwLCB4MSwgeDJ9Ci0gICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzEKLSAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwCi0gICAgICAgIAotICAgICAgICA7Ly8gT25lIGN5Y2xlIHN0YWxsCi0KLSAgICAgICAgTU9WICAgICB4MCwgeDAsIExTUiAjOAotICAgICAgICBPUlIgICAgIHgwLCB4MCwgeDEsIExTTCAjMjQKLSAgICAgICAgTU9WICAgICB4MSwgeDEsIExTUiAjOAotICAgICAgICBPUlIgICAgIHgxLCB4MSwgeDIsIExTTCAjMjQKLSAgICAgICAgTU9WICAgICB4MiwgeDIsIExTUiAjOAotICAgICAgICBTVE0gICAgIHBEc3QhLCB7eDAsIHgxLCB4Mn0gICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgYWxpZ25lZCBvdXRwdXQgcm93Ci0gICAgICAgIEJHVCAgICAgQ29weTF0b0FsaWduZWQKLSAgICAgICAgQiAgICAgICBDb3B5RW5kICAKLQotQ29weTJ0b0FsaWduZWQgICAgICAgIAotICAgICAgICBMRE0gICAgIHBTcmMsIHt4MCwgeDEsIHgyfQotICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMxCi0gICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgc3JjU3RlcAotICAgICAgICAKLSAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAotCi0gICAgICAgIE1PViAgICAgeDAsIHgwLCBMU1IgIzE2Ci0gICAgICAgIE9SUiAgICAgeDAsIHgwLCB4MSwgTFNMICMxNgotICAgICAgICBNT1YgICAgIHgxLCB4MSwgTFNSICMxNgotICAgICAgICBPUlIgICAgIHgxLCB4MSwgeDIsIExTTCAjMTYKLSAgICAgICAgTU9WICAgICB4MiwgeDIsIExTUiAjMTYKLSAgICAgICAgU1RNICAgICBwRHN0ISwge3gwLCB4MSwgeDJ9ICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIGFsaWduZWQgb3V0cHV0IHJvdwotICAgICAgICBCR1QgICAgIENvcHkydG9BbGlnbmVkCi0gICAgICAgIEIgICAgICAgQ29weUVuZCAgCi0KLUNvcHkzdG9BbGlnbmVkICAgICAgICAKLSAgICAgICAgTERNICAgICBwU3JjLCB7eDAsIHgxLCB4Mn0KLSAgICAgICAgU1VCUyAgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjMQotICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAKLSAgICAgICAgCi0gICAgICAgIDsvLyBPbmUgY3ljbGUgc3RhbGwKLQotICAgICAgICBNT1YgICAgIHgwLCB4MCwgTFNSICMyNAotICAgICAgICBPUlIgICAgIHgwLCB4MCwgeDEsIExTTCAjOAotICAgICAgICBNT1YgICAgIHgxLCB4MSwgTFNSICMyNAotICAgICAgICBPUlIgICAgIHgxLCB4MSwgeDIsIExTTCAjOAotICAgICAgICBNT1YgICAgIHgyLCB4MiwgTFNSICMyNAotICAgICAgICBTVE0gICAgIHBEc3QhLCB7eDAsIHgxLCB4Mn0gICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgYWxpZ25lZCBvdXRwdXQgcm93Ci0gICAgICAgIEJHVCAgICAgQ29weTN0b0FsaWduZWQKLQotQ29weUVuZCAgCi0gICAgICAgIAotICAgICAgICBNT1YgICAgIHBTcmMsIFNjcmF0Y2gKLSAgICAgICAgTU9WICAgICBzcmNTdGVwLCAjMTIKLQotICAgICAgICBNX0VORAotICAgIAotCi07Ly8gRnVuY3Rpb246Ci07Ly8gICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckFsaWduNHhfdW5zYWZlCi07Ly8KLTsvLyBJbXBsZW1lbnRzIGNvcHkgZnJvbSBhbiBhcmJpdHJhcnkgYWxpZ25lZCBzb3VyY2UgbWVtb3J5IGxvY2F0aW9uIChwU3JjKSB0byBhbiBhbGlnbmVkCi07Ly8gZGVzdGluYXRpb24gcG9pbnRlZCBieSAocERzdCkgZm9yIHZlcnRpY2FsIGludGVycG9sYXRpb24uCi07Ly8gVGhpcyBmdW5jdGlvbiBuZWVkcyB0byBjb3B5IDQgYnl0ZXMgaW4gaG9yaXpvbnRhbCBkaXJlY3Rpb24gCi07Ly8KLTsvLyBSZWdpc3RlcnMgdXNlZCBhcyBpbnB1dCBmb3IgdGhpcyBmdW5jdGlvbgotOy8vIHIwLHIxLHI4LHI5IHdoZXJlIHI4IGNvbnRhaW5pbmdzIGFsaWduZWQgbWVtb3J5IHBvaW50ZXIgYW5kIHI5IG5vIG9mIHJvd3MgdG8gY29weQotOy8vCi07Ly8gUmVnaXN0ZXJzIHByZXNlcnZlZCBmb3IgdG9wIGxldmVsIGZ1bmN0aW9uCi07Ly8gcjIscjMscjQscjUscjYKLTsvLwotOy8vIFJlZ2lzdGVycyBtb2RpZmllZCBieSB0aGUgZnVuY3Rpb24KLTsvLyByNyxyOCxyOSxyMTAscjExLHIxMgotOy8vCi07Ly8gT3V0cHV0IHJlZ2lzdGVycwotOy8vIHIwIC0gcG9pbnRlciB0byB0aGUgbmV3IGFsaWduZWQgbG9jYXRpb24gd2hpY2ggd2lsbCBiZSB1c2VkIGFzIHBTcmMKLTsvLyByMSAtIHN0ZXAgc2l6ZSB0byB0aGlzIGFsaWduZWQgbG9jYXRpb24KLQotICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyQWxpZ240eF91bnNhZmUgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIENvcHkgcFNyYyB0byBzdGFjawotU3RhcnRWQWxpZ25lZFN0YWNrQ29weQotICAgICAgICBBTkQgICAgIHgsIHBTcmMsICMzCi0gICAgICAgIEJJQyAgICAgcFNyYywgcFNyYywgIzMgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBNX1NXSVRDSCB4Ci0gICAgICAgIE1fQ0FTRSAgIENvcHkwdG9WQWxpZ25lZAotICAgICAgICBNX0NBU0UgICBDb3B5MXRvVkFsaWduZWQKLSAgICAgICAgTV9DQVNFICAgQ29weTJ0b1ZBbGlnbmVkCi0gICAgICAgIE1fQ0FTRSAgIENvcHkzdG9WQWxpZ25lZAotICAgICAgICBNX0VORFNXSVRDSAotICAgICAgICAKLUNvcHkwdG9WQWxpZ25lZCAgCi0gICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMxCi0gICAgICAgIAotICAgICAgICA7Ly8gT25lIGN5Y2xlIHN0YWxsCi0KLSAgICAgICAgU1RSICAgICB4MCwgW3BEc3RdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBhbGlnbmVkIG91dHB1dCByb3cKLSAgICAgICAgQkdUICAgICBDb3B5MHRvVkFsaWduZWQKLSAgICAgICAgQiAgICAgICBDb3B5VkVuZCAgCi0gICAgICAKLUNvcHkxdG9WQWxpZ25lZCAgICAgICAgCi0gICAgICAgIExEUiAgICAgeDEsIFtwU3JjLCAjNF0KLSAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCi0gICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzEgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAotCi0gICAgICAgIE1PViAgICAgeDEsIHgxLCBMU0wgIzI0Ci0gICAgICAgIE9SUiAgICAgeDAsIHgxLCB4MCwgTFNSICM4Ci0gICAgICAgIFNUUiAgICAgeDAsIFtwRHN0XSwgIzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgYWxpZ25lZCBvdXRwdXQgcm93Ci0gICAgICAgIEJHVCAgICAgQ29weTF0b1ZBbGlnbmVkCi0gICAgICAgIEIgICAgICAgQ29weVZFbmQgIAotCi1Db3B5MnRvVkFsaWduZWQgICAgICAgIAotICAgICAgICBMRFIgICAgIHgxLCBbcFNyYywgIzRdCi0gICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMxICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBPbmUgY3ljbGUgc3RhbGwKLQotICAgICAgICBNT1YgICAgIHgxLCB4MSwgTFNMICMxNgotICAgICAgICBPUlIgICAgIHgwLCB4MSwgeDAsIExTUiAjMTYKLSAgICAgICAgU1RSICAgICB4MCwgW3BEc3RdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBhbGlnbmVkIG91dHB1dCByb3cKLSAgICAgICAgQkdUICAgICBDb3B5MnRvVkFsaWduZWQKLSAgICAgICAgQiAgICAgICBDb3B5VkVuZCAgCi0KLUNvcHkzdG9WQWxpZ25lZCAgICAgICAgCi0gICAgICAgIExEUiAgICAgeDEsIFtwU3JjLCAjNF0KLSAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCi0gICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzEgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAotCi0gICAgICAgIE1PViAgICAgeDEsIHgxLCBMU0wgIzgKLSAgICAgICAgT1JSICAgICB4MCwgeDEsIHgwLCBMU1IgIzI0Ci0gICAgICAgIFNUUiAgICAgeDAsIFtwRHN0XSwgIzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgYWxpZ25lZCBvdXRwdXQgcm93Ci0gICAgICAgIEJHVCAgICAgQ29weTN0b1ZBbGlnbmVkCi0KLUNvcHlWRW5kICAKLQotICAgICAgICBTVUIgICAgIHBTcmMsIHBEc3QsICMyOAotICAgICAgICBNT1YgICAgIHNyY1N0ZXAsICM0Ci0KLSAgICAgICAgTV9FTkQKLQotCi0gICAgRU5ESUYKLQotICAgIEVORAotICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5X3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHlfdW5zYWZlX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQxNWJlYi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHlfdW5zYWZlX3MucworKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weV91bnNhZmVfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgMTIyOTAKLTsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi07Ly8gRnVuY3Rpb246Ci07Ly8gICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHk0eDRfdW5zYWZlIAotOy8vCi07Ly8gSW1wbGVtZW50cyBjb3B5IGZyb20gYW4gYXJiaXRyYXJ5IGFsaWduZWQgc291cmNlIG1lbW9yeSBsb2NhdGlvbiAocFNyYykgdG8gYW4gYWxpZ25lZAotOy8vIGRlc3RpbmF0aW9uIHBvaW50ZWQgYnkgKHBEc3QpCi07Ly8KLTsvLyBSZWdpc3RlcnMgcHJlc2VydmVkIGZvciB0b3AgbGV2ZWwgZnVuY3Rpb24KLTsvLyByMSxyMyxyNCxyNSxyNixyNyxyMTAscjExLHIxNAotOy8vCi07Ly8gUmVnaXN0ZXJzIG1vZGlmaWVkIGJ5IHRoZSBmdW5jdGlvbgotOy8vIHIwLHIyLHI4LHI5LHIxMgotCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgICAgCi0gICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0KLSAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHk0eDRfdW5zYWZlCi0gICAgICAgIAotOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCi1wU3JjICAgICAgICAgICAgUk4gMAotc3JjU3RlcCAgICAgICAgIFJOIDEKLXBEc3QgICAgICAgICAgICBSTiAyCi1kc3RTdGVwICAgICAgICAgUk4gMwotCi07Ly8gRGVjbGFyZSBvdGhlciBpbnRlcm1lZGlhdGUgcmVnaXN0ZXJzCi14MCAgICAgICAgICAgICAgUk4gNAoteDEgICAgICAgICAgICAgIFJOIDUKLXgyICAgICAgICAgICAgICBSTiA4Ci14MyAgICAgICAgICAgICAgUk4gOQotVGVtcCAgICAgICAgICAgIFJOIDEyCi0KLSAgICBJRiBBUk0xMTM2SlMKLQotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHk0eDRfdW5zYWZlLCByNgotCi1Db3B5NHg0U3RhcnQKLSAgICAgICAgOy8vIERvIENvcHkgYW5kIGJyYW5jaCB0byBFbmRPZkludGVycG9sYXRpb24KLSAgICAgICAgQU5EICAgICBUZW1wLCBwU3JjLCAjMwotICAgICAgICBCSUMgICAgIHBTcmMsIHBTcmMsICMzICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgTV9TV0lUQ0ggVGVtcAotICAgICAgICBNX0NBU0UgIENvcHk0eDRBbGlnbjAKLSAgICAgICAgTV9DQVNFICBDb3B5NHg0QWxpZ24xCi0gICAgICAgIE1fQ0FTRSAgQ29weTR4NEFsaWduMgotICAgICAgICBNX0NBU0UgIENvcHk0eDRBbGlnbjMKLSAgICAgICAgTV9FTkRTV0lUQ0gKLQotQ29weTR4NEFsaWduMAotICAgICAgICBNX0xEUiAgIHgwLCBbcFNyY10sIHNyY1N0ZXAKLSAgICAgICAgTV9MRFIgICB4MSwgW3BTcmNdLCBzcmNTdGVwCi0gICAgICAgIE1fU1RSICAgeDAsIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBNX0xEUiAgIHgyLCBbcFNyY10sIHNyY1N0ZXAKLSAgICAgICAgTV9TVFIgICB4MSwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIE1fTERSICAgeDMsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBNX1NUUiAgIHgyLCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgTV9TVFIgICB4MywgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIEIgICAgICAgQ29weTR4NEVuZCAgCi0KLUNvcHk0eDRBbGlnbjEKLSAgICAgICAgTERSICAgICB4MSwgW3BTcmMsICM0XQotICAgICAgICBNX0xEUiAgIHgwLCBbcFNyY10sIHNyY1N0ZXAKLSAgICAgICAgTERSICAgICB4MywgW3BTcmMsICM0XQotICAgICAgICBNX0xEUiAgIHgyLCBbcFNyY10sIHNyY1N0ZXAKLSAgICAgICAgTU9WICAgICB4MCwgeDAsIExTUiAjOAotICAgICAgICBPUlIgICAgIHgwLCB4MCwgeDEsIExTTCAjMjQKLSAgICAgICAgTV9TVFIgICB4MCwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIE1PViAgICAgeDIsIHgyLCBMU1IgIzgKLSAgICAgICAgT1JSICAgICB4MiwgeDIsIHgzLCBMU0wgIzI0Ci0gICAgICAgIExEUiAgICAgeDEsIFtwU3JjLCAjNF0KLSAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCi0gICAgICAgIE1fU1RSICAgeDIsIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBMRFIgICAgIHgzLCBbcFNyYywgIzRdCi0gICAgICAgIE1fTERSICAgeDIsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBNT1YgICAgIHgwLCB4MCwgTFNSICM4Ci0gICAgICAgIE9SUiAgICAgeDAsIHgwLCB4MSwgTFNMICMyNAotICAgICAgICBNX1NUUiAgIHgwLCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgTU9WICAgICB4MiwgeDIsIExTUiAjOAotICAgICAgICBPUlIgICAgIHgyLCB4MiwgeDMsIExTTCAjMjQKLSAgICAgICAgTV9TVFIgICB4MiwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIEIgICAgICAgQ29weTR4NEVuZCAgCi0gICAgICAKLUNvcHk0eDRBbGlnbjIKLSAgICAgICAgTERSICAgICB4MSwgW3BTcmMsICM0XQotICAgICAgICBNX0xEUiAgIHgwLCBbcFNyY10sIHNyY1N0ZXAKLSAgICAgICAgTERSICAgICB4MywgW3BTcmMsICM0XQotICAgICAgICBNX0xEUiAgIHgyLCBbcFNyY10sIHNyY1N0ZXAKLSAgICAgICAgTU9WICAgICB4MCwgeDAsIExTUiAjMTYKLSAgICAgICAgT1JSICAgICB4MCwgeDAsIHgxLCBMU0wgIzE2Ci0gICAgICAgIE1fU1RSICAgeDAsIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBNT1YgICAgIHgyLCB4MiwgTFNSICMxNgotICAgICAgICBPUlIgICAgIHgyLCB4MiwgeDMsIExTTCAjMTYKLSAgICAgICAgTV9TVFIgICB4MiwgW3BEc3RdLCBkc3RTdGVwICAgICAgICAKLQotICAgICAgICBMRFIgICAgIHgxLCBbcFNyYywgIzRdCi0gICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBMRFIgICAgIHgzLCBbcFNyYywgIzRdCi0gICAgICAgIE1fTERSICAgeDIsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBNT1YgICAgIHgwLCB4MCwgTFNSICMxNgotICAgICAgICBPUlIgICAgIHgwLCB4MCwgeDEsIExTTCAjMTYKLSAgICAgICAgTV9TVFIgICB4MCwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIE1PViAgICAgeDIsIHgyLCBMU1IgIzE2Ci0gICAgICAgIE9SUiAgICAgeDIsIHgyLCB4MywgTFNMICMxNgotICAgICAgICBNX1NUUiAgIHgyLCBbcERzdF0sIGRzdFN0ZXAgICAgICAgIAotICAgICAgICBCICAgICAgIENvcHk0eDRFbmQgIAotCi1Db3B5NHg0QWxpZ24zIAotICAgICAgICBMRFIgICAgIHgxLCBbcFNyYywgIzRdCi0gICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBMRFIgICAgIHgzLCBbcFNyYywgIzRdCi0gICAgICAgIE1fTERSICAgeDIsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBNT1YgICAgIHgwLCB4MCwgTFNSICMyNAotICAgICAgICBPUlIgICAgIHgwLCB4MCwgeDEsIExTTCAjOAotICAgICAgICBNX1NUUiAgIHgwLCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgTU9WICAgICB4MiwgeDIsIExTUiAjMjQKLSAgICAgICAgT1JSICAgICB4MiwgeDIsIHgzLCBMU0wgIzgKLSAgICAgICAgTV9TVFIgICB4MiwgW3BEc3RdLCBkc3RTdGVwCi0KLSAgICAgICAgTERSICAgICB4MSwgW3BTcmMsICM0XQotICAgICAgICBNX0xEUiAgIHgwLCBbcFNyY10sIHNyY1N0ZXAKLSAgICAgICAgTERSICAgICB4MywgW3BTcmMsICM0XQotICAgICAgICBNX0xEUiAgIHgyLCBbcFNyY10sIHNyY1N0ZXAKLSAgICAgICAgTU9WICAgICB4MCwgeDAsIExTUiAjMjQKLSAgICAgICAgT1JSICAgICB4MCwgeDAsIHgxLCBMU0wgIzgKLSAgICAgICAgTV9TVFIgICB4MCwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIE1PViAgICAgeDIsIHgyLCBMU1IgIzI0Ci0gICAgICAgIE9SUiAgICAgeDIsIHgyLCB4MywgTFNMICM4Ci0gICAgICAgIE1fU1RSICAgeDIsIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBCICAgICAgIENvcHk0eDRFbmQgIAotCi1Db3B5NHg0RW5kCi0gICAgICAgIE1fRU5ECi0KLSAgICBFTkRJRgotCi0gICAgRU5ECi0gICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0RpYWdDb3B5X3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0RpYWdDb3B5X3Vuc2FmZV9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1YTczMjYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9EaWFnQ29weV91bnNhZmVfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9EaWFnQ29weV91bnNhZmVfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgMTIyOTAKLTsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgICAgCi0gICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0KLSAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckRpYWdDb3B5X3Vuc2FmZQotICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyRGlhZ0NvcHlfdW5zYWZlCi0KLTsvLyBGdW5jdGlvbnM6IAotOy8vICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JEaWFnQ29weV91bnNhZmUgYW5kCi07Ly8gICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckRpYWdDb3B5X3Vuc2FmZSAKLTsvLwotOy8vIEltcGxlbWVudHMgcmUtYXJyYW5nZW1lbnQgb2YgZGF0YSBmcm9tIHRlbXBvcmFyeSBidWZmZXIgdG8gYSBidWZmZXIgcG9pbnRlZCBieSBwQnVmLgotOy8vIFRoaXMgd2lsbCBkbyB0aGUgY29udmVydGlvbiBvZiBkYXRhIGZyb20gMTYgYml0IHRvIDggYml0IGFuZCBpdCBhbHNvCi07Ly8gcmVtb3ZlIG9mZnNldCBhbmQgY2hlY2sgZm9yIHNhdHVyYXRpb24uCi07Ly8KLTsvLyBSZWdpc3RlcnMgdXNlZCBhcyBpbnB1dCBmb3IgdGhpcyBmdW5jdGlvbgotOy8vIHIwLHIxLHI3IHdoZXJlIHIwIGlzIGlucHV0IHBvaW50ZXIgYW5kIHIyIGl0cyBzdGVwIHNpemUsIHI3IGlzIG91dHB1dCBwb2ludGVyCi07Ly8KLTsvLyBSZWdpc3RlcnMgcHJlc2VydmVkIGZvciB0b3AgbGV2ZWwgZnVuY3Rpb24KLTsvLyByNCxyNSxyNixyOCxyOSxyMTQKLTsvLwotOy8vIFJlZ2lzdGVycyBtb2RpZmllZCBieSB0aGUgZnVuY3Rpb24KLTsvLyByNyxyMTAscjExLHIxMgotOy8vCi07Ly8gT3V0cHV0IHJlZ2lzdGVycwotOy8vIHIwIC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gbG9jYXRpb24KLTsvLyByMSAtIHN0ZXAgc2l6ZSB0byB0aGlzIGRlc3RpbmF0aW9uIGxvY2F0aW9uCi0KLQotREVCVUdfT04gICAgU0VUTCB7RkFMU0V9Ci0gICAgICAgIAotTUFTSyAgICAgICAgICAgIEVRVSAweDgwODA4MDgwICA7Ly8gTWFzayBpcyB1c2VkIHRvIGltcGxlbWVudCAoYStiKzEpLzIKLQotOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCi0KLXBTcmMwICAgICAgICAgICBSTiAwCi1zcmNTdGVwMCAgICAgICAgUk4gMQotCi07Ly8gRGVjbGFyZSBvdGhlciBpbnRlcm1lZGlhdGUgcmVnaXN0ZXJzCi1UZW1wMSAgICAgICAgICAgUk4gNAotVGVtcDIgICAgICAgICAgIFJOIDUKLVRlbXAzICAgICAgICAgICBSTiAxMAotVGVtcDQgICAgICAgICAgIFJOIDExCi1wQnVmICAgICAgICAgICAgUk4gNwotcjB4MGZlMDBmZTAgICAgIFJOIDYKLXIweDAwZmYwMGZmICAgICBSTiAxMgotQ291bnQgICAgICAgICAgIFJOIDE0Ci1WYWx1ZUEwICAgICAgICAgUk4gMTAKLVZhbHVlQTEgICAgICAgICBSTiAxMQotCi0gICAgSUYgQVJNMTEzNkpTCi0KLQotICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yRGlhZ0NvcHlfdW5zYWZlLCByNgotCi0gICAgICAgIDsvLyBDb2RlIHN0YXJ0ICAgICAKLSAgICAgICAgTU9WICAgICAgICAgQ291bnQsICM0ICAgCi0gICAgICAgIExEUiAgICAgICAgIHIweDBmZTAwZmUwLCA9MHgwZmUwMGZlMAotICAgICAgICBMRFIgICAgICAgICByMHgwMGZmMDBmZiwgPTB4MDBmZjAwZmYgICAgICAgIAotTG9vcFN0YXJ0MQotICAgICAgICBMRFIgICAgICAgICBUZW1wNCwgW3BTcmMwLCAjMTJdCi0gICAgICAgIExEUiAgICAgICAgIFRlbXAzLCBbcFNyYzAsICM4XSAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgIFRlbXAyLCBbcFNyYzAsICM0XQotICAgICAgICBNX0xEUiAgICAgICBUZW1wMSwgW3BTcmMwXSwgc3JjU3RlcDAgICAgICAgICAgICAgIAotICAgICAgICBVUVNVQjE2ICAgICBUZW1wNCwgVGVtcDQsIHIweDBmZTAwZmUwICAgICAgICAKLSAgICAgICAgVVFTVUIxNiAgICAgVGVtcDMsIFRlbXAzLCByMHgwZmUwMGZlMCAgICAgICAgICAgICAgICAgCi0gICAgICAgIFVRU1VCMTYgICAgIFRlbXAyLCBUZW1wMiwgcjB4MGZlMDBmZTAgICAgICAgIAotICAgICAgICBVUVNVQjE2ICAgICBUZW1wMSwgVGVtcDEsIHIweDBmZTAwZmUwICAgICAgICAgICAgICAgICAKLSAgICAgICAgVVNBVDE2ICAgICAgVGVtcDQsICMxMywgVGVtcDQKLSAgICAgICAgVVNBVDE2ICAgICAgVGVtcDMsICMxMywgVGVtcDMgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBVU0FUMTYgICAgICBUZW1wMiwgIzEzLCBUZW1wMgotICAgICAgICBVU0FUMTYgICAgICBUZW1wMSwgIzEzLCBUZW1wMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgQU5EICAgICAgICAgVGVtcDQsIHIweDAwZmYwMGZmLCBUZW1wNCwgTFNSICM1ICAgICAgICAgCi0gICAgICAgIEFORCAgICAgICAgIFRlbXAzLCByMHgwMGZmMDBmZiwgVGVtcDMsIExTUiAjNSAgICAgICAgIAotICAgICAgICBBTkQgICAgICAgICBUZW1wMiwgcjB4MDBmZjAwZmYsIFRlbXAyLCBMU1IgIzUgICAgICAgICAKLSAgICAgICAgQU5EICAgICAgICAgVGVtcDEsIHIweDAwZmYwMGZmLCBUZW1wMSwgTFNSICM1ICAgICAgICAgCi0gICAgICAgIE9SUiAgICAgICAgIFZhbHVlQTEsIFRlbXAzLCBUZW1wNCwgTFNMICM4ICAgICAgICAgICAgIAotICAgICAgICBPUlIgICAgICAgICBWYWx1ZUEwLCBUZW1wMSwgVGVtcDIsIExTTCAjOCAgICAgICAgICAgICAKLSAgICAgICAgU1VCUyAgICAgICAgQ291bnQsIENvdW50LCAjMSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgU1RSRCAgICAgICAgVmFsdWVBMCwgW3BCdWZdLCAjOCAKLSAgICAgICAgQkdUICAgICAgICAgTG9vcFN0YXJ0MQotRW5kMQotICAgICAgICBTVUIgICAgICAgIHBTcmMwLCBwQnVmLCAjMzIKLSAgICAgICAgTU9WICAgICAgICBzcmNTdGVwMCwgIzgKLQotICAgICAgICBNX0VORAotCi0KLSAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckRpYWdDb3B5X3Vuc2FmZSwgcjYKLSAgICAgICAgCi0gICAgICAgIDsvLyBDb2RlIHN0YXJ0ICAgICAgICAKLSAgICAgICAgTERSICAgICAgICAgcjB4MGZlMDBmZTAsID0weDBmZTAwZmUwCi0gICAgICAgIExEUiAgICAgICAgIHIweDAwZmYwMGZmLCA9MHgwMGZmMDBmZgotICAgICAgICBNT1YgICAgICAgICBDb3VudCwgIzIKLQotTG9vcFN0YXJ0ICAgIAotICAgICAgICBMRFIgICAgICAgICBUZW1wNCwgW3BTcmMwLCAjMTJdCi0gICAgICAgIExEUiAgICAgICAgIFRlbXAzLCBbcFNyYzAsICM4XSAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgIFRlbXAyLCBbcFNyYzAsICM0XQotICAgICAgICBNX0xEUiAgICAgICBUZW1wMSwgW3BTcmMwXSwgc3JjU3RlcDAKLSAgICAgICAgCi0gICAgICAgIFVRU1VCMTYgICAgIFRlbXA0LCBUZW1wNCwgcjB4MGZlMDBmZTAgICAgICAgIAotICAgICAgICBVUVNVQjE2ICAgICBUZW1wMywgVGVtcDMsIHIweDBmZTAwZmUwICAgICAgICAgICAgICAgICAKLSAgICAgICAgVVFTVUIxNiAgICAgVGVtcDIsIFRlbXAyLCByMHgwZmUwMGZlMCAgICAgICAgCi0gICAgICAgIFVRU1VCMTYgICAgIFRlbXAxLCBUZW1wMSwgcjB4MGZlMDBmZTAgICAgICAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgVVNBVDE2ICAgICAgVGVtcDQsICMxMywgVGVtcDQKLSAgICAgICAgVVNBVDE2ICAgICAgVGVtcDMsICMxMywgVGVtcDMgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBVU0FUMTYgICAgICBUZW1wMiwgIzEzLCBUZW1wMgotICAgICAgICBVU0FUMTYgICAgICBUZW1wMSwgIzEzLCBUZW1wMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBBTkQgICAgICAgICBUZW1wNCwgcjB4MDBmZjAwZmYsIFRlbXA0LCBMU1IgIzUgICAgICAgICAKLSAgICAgICAgQU5EICAgICAgICAgVGVtcDMsIHIweDAwZmYwMGZmLCBUZW1wMywgTFNSICM1ICAgICAgICAgCi0gICAgICAgIEFORCAgICAgICAgIFRlbXAyLCByMHgwMGZmMDBmZiwgVGVtcDIsIExTUiAjNSAgICAgICAgIAotICAgICAgICBBTkQgICAgICAgICBUZW1wMSwgcjB4MDBmZjAwZmYsIFRlbXAxLCBMU1IgIzUgICAgICAgICAKLSAgICAgICAgT1JSICAgICAgICAgVmFsdWVBMSwgVGVtcDMsIFRlbXA0LCBMU0wgIzggICAgICAgIDsvLyBbZDIgYzIgZDAgYzBdICAgICAgICAgICAgIAotICAgICAgICBPUlIgICAgICAgICBWYWx1ZUEwLCBUZW1wMSwgVGVtcDIsIExTTCAjOCAgICAgICAgOy8vIFtiMiBhMiBiMCBhMF0gICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFBLSEJUICAgICAgIFRlbXAxLCBWYWx1ZUEwLCBWYWx1ZUExLCBMU0wgIzE2ICAgICA7Ly8gW2QwIGMwIGIwIGEwXQotCi0gICAgICAgIFNUUiAgICAgICAgIFRlbXAxLCBbcEJ1Zl0sICM4IAotICAgICAgICBQS0hUQiAgICAgICBUZW1wMiwgVmFsdWVBMSwgVmFsdWVBMCwgQVNSICMxNiAgICAgOy8vIFtkMiBjMiBiMiBhMl0KLSAgICAgICAgU1RSICAgICAgICAgVGVtcDIsIFtwQnVmXSwgIy00ICAKLQotICAgICAgICBMRFIgICAgICAgICBUZW1wNCwgW3BTcmMwLCAjMTJdCi0gICAgICAgIExEUiAgICAgICAgIFRlbXAzLCBbcFNyYzAsICM4XSAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgIFRlbXAyLCBbcFNyYzAsICM0XQotICAgICAgICBNX0xEUiAgICAgICBUZW1wMSwgW3BTcmMwXSwgc3JjU3RlcDAKLSAgICAgICAgCi0gICAgICAgIFVRU1VCMTYgICAgIFRlbXA0LCBUZW1wNCwgcjB4MGZlMDBmZTAgICAgICAgIAotICAgICAgICBVUVNVQjE2ICAgICBUZW1wMywgVGVtcDMsIHIweDBmZTAwZmUwICAgICAgICAgICAgICAgICAKLSAgICAgICAgVVFTVUIxNiAgICAgVGVtcDIsIFRlbXAyLCByMHgwZmUwMGZlMCAgICAgICAgCi0gICAgICAgIFVRU1VCMTYgICAgIFRlbXAxLCBUZW1wMSwgcjB4MGZlMDBmZTAgICAgICAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgVVNBVDE2ICAgICAgVGVtcDQsICMxMywgVGVtcDQKLSAgICAgICAgVVNBVDE2ICAgICAgVGVtcDMsICMxMywgVGVtcDMgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBVU0FUMTYgICAgICBUZW1wMiwgIzEzLCBUZW1wMgotICAgICAgICBVU0FUMTYgICAgICBUZW1wMSwgIzEzLCBUZW1wMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBBTkQgICAgICAgICBUZW1wNCwgcjB4MDBmZjAwZmYsIFRlbXA0LCBMU1IgIzUgICAgICAgICAKLSAgICAgICAgQU5EICAgICAgICAgVGVtcDMsIHIweDAwZmYwMGZmLCBUZW1wMywgTFNSICM1ICAgICAgICAgCi0gICAgICAgIEFORCAgICAgICAgIFRlbXAyLCByMHgwMGZmMDBmZiwgVGVtcDIsIExTUiAjNSAgICAgICAgIAotICAgICAgICBBTkQgICAgICAgICBUZW1wMSwgcjB4MDBmZjAwZmYsIFRlbXAxLCBMU1IgIzUgICAgICAgICAKLSAgICAgICAgT1JSICAgICAgICAgVmFsdWVBMSwgVGVtcDMsIFRlbXA0LCBMU0wgIzggICAgICAgIDsvLyBbZDIgYzIgZDAgYzBdICAgICAgICAgICAgIAotICAgICAgICBPUlIgICAgICAgICBWYWx1ZUEwLCBUZW1wMSwgVGVtcDIsIExTTCAjOCAgICAgICAgOy8vIFtiMiBhMiBiMCBhMF0gICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFBLSEJUICAgICAgIFRlbXAxLCBWYWx1ZUEwLCBWYWx1ZUExLCBMU0wgIzE2ICAgICA7Ly8gW2QwIGMwIGIwIGEwXQotICAgICAgICBTVUJTICAgICAgICBDb3VudCwgQ291bnQsICMxCi0gICAgICAgIFNUUiAgICAgICAgIFRlbXAxLCBbcEJ1Zl0sICM4IAotICAgICAgICBQS0hUQiAgICAgICBUZW1wMiwgVmFsdWVBMSwgVmFsdWVBMCwgQVNSICMxNiAgICAgOy8vIFtkMiBjMiBiMiBhMl0KLSAgICAgICAgU1RSICAgICAgICAgVGVtcDIsIFtwQnVmXSwgIzQgIAotICAgICAgICAKLSAgICAgICAgQkdUICAgICAgICAgTG9vcFN0YXJ0Ci1FbmQyCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmMwLCBwQnVmLCAjMzItOAotICAgICAgICBNT1YgICAgICAgICBzcmNTdGVwMCwgIzQKLQotICAgICAgICBNX0VORAotCi0gICAgRU5ESUYKLSAgICAKLSAgICBFTkQKLSAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ4Njc4Mi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzMjcgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZV9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICAxMjI5MAotOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgICAKLSAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZQotCi0gICAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKLQotICAgIElGIENvcnRleEE4Ci0KLSAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmUsIHIxMQotCi07Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKLXBTcmMgICAgICAgICAgICBSTiAwCi1zcmNTdGVwICAgICAgICAgUk4gMQotcERzdCAgICAgICAgICAgIFJOIDIKLWRzdFN0ZXAgICAgICAgICBSTiAzCi0KLTsvLyBEZWNsYXJlIE5lb24gcmVnaXN0ZXJzCi1kQ29lZmY1ICAgICAgICAgRE4gMzAuUzE2Ci1kQ29lZmYyMCAgICAgICAgRE4gMzEuUzE2Ci1xQ29lZmY1ICAgICAgICAgUU4gMTQuUzMyCi1xQ29lZmYyMCAgICAgICAgUU4gMTUuUzMyCi0gICAgICAgIAotcVNyYzAxICAgICAgICAgIFFOIDAuVTgKLWRTcmMwICAgICAgICAgICBETiAwLlU4Ci1kU3JjMSAgICAgICAgICAgRE4gMS5VOCAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLWRTcmNiICAgICAgICAgICBETiA0LlU4Ci1kU3JjYyAgICAgICAgICAgRE4gMi5VOAotZFNyY2QgICAgICAgICAgIEROIDMuVTgKLWRTcmNlICAgICAgICAgICBETiA1LlU4Ci1kU3JjZiAgICAgICAgICAgRE4gMS5VOAotCi1xU3JjYiAgICAgICAgICAgUU4gMi5TMTYKLXFTcmNjICAgICAgICAgICBRTiAxLlMxNgotZFNyY0IgICAgICAgICAgIEROIDQuUzE2Ci1kU3JjQyAgICAgICAgICAgRE4gMi5TMTYKLQotcVJlczAgICAgICAgICAgIFFOIDUuUzE2Ci1xUmVzMSAgICAgICAgICAgUU4gNi5TMTYKLXFSZXMyICAgICAgICAgICBRTiA3LlMxNgotcVJlczMgICAgICAgICAgIFFOIDguUzE2Ci1xUmVzNCAgICAgICAgICAgUU4gOS5TMTYKLXFSZXM1ICAgICAgICAgICBRTiAxMC5TMTYKLXFSZXM2ICAgICAgICAgICBRTiAxMS5TMTYKLXFSZXM3ICAgICAgICAgICBRTiAxMi5TMTYKLXFSZXM4ICAgICAgICAgICBRTiAxMy5TMTYKLSAgICAKLWRSZXMwICAgICAgICAgICBETiAxMC5TMTYKLWRSZXMxICAgICAgICAgICBETiAxMi5TMTYKLWRSZXMyICAgICAgICAgICBETiAxNC5TMTYKLWRSZXMzICAgICAgICAgICBETiAxNi5TMTYKLWRSZXM0ICAgICAgICAgICBETiAxOC5TMTYKLWRSZXM1ICAgICAgICAgICBETiAyMC5TMTYKLWRSZXM2ICAgICAgICAgICBETiAyMi5TMTYKLWRSZXM3ICAgICAgICAgICBETiAyNC5TMTYKLWRSZXM4ICAgICAgICAgICBETiAyNi5TMTYKLSAgICAKLXFBY2MwMSAgICAgICAgICBRTiA1LlMzMgotcUFjYzIzICAgICAgICAgIFFOIDYuUzMyCi1xQWNjNDUgICAgICAgICAgUU4gMi5TMzIKLXFBY2M2NyAgICAgICAgICBRTiAzLlMzMgotcVN1bUJFICAgICAgICAgIFFOIDAuUzMyCi1xU3VtQ0QgICAgICAgICAgUU4gMS5TMzIKLQotZFRlbXBBY2MwICAgICAgIEROIDAuVTE2Ci1kVGVtcEFjYzEgICAgICAgRE4gMi5VMTYKLWRUZW1wQWNjMiAgICAgICBETiA0LlUxNgotZFRlbXBBY2MzICAgICAgIEROIDYuVTE2Ci0KLXFUQWNjMCAgICAgICAgICBRTiAwLlUxNgotcVRBY2MxICAgICAgICAgIFFOIDEuVTE2Ci1xVEFjYzIgICAgICAgICAgUU4gMi5VMTYKLXFUQWNjMyAgICAgICAgICBRTiAzLlUxNgotCi1kQWNjMCAgICAgICAgICAgRE4gMC5VOAotZEFjYzEgICAgICAgICAgIEROIDIuVTgKLWRBY2MyICAgICAgICAgICBETiA0LlU4Ci1kQWNjMyAgICAgICAgICAgRE4gNi5VOAotCi1kVG1wMCAgICAgICAgICAgRE4gOC5TMTYKLWRUbXAxICAgICAgICAgICBETiA5LlMxNgotcVRtcDAgICAgICAgICAgIFFOIDQuUzMyCi0KLSAgICAgICAgVkxEMSAgICAgICAgcVNyYzAxLCBbcFNyY10sIHNyY1N0ZXAgICAgIDsvLyBbYTAgYTEgYTIgYTMgLi5dCi0gICAgICAgIFZNT1YgICAgICAgIGRDb2VmZjIwLCAjMjAKLSAgICAgICAgVk1PViAgICAgICAgZENvZWZmNSwgIzUKLQotICAgICAgICA7Ly8gUm93MAotICAgICAgICBWRVhUICAgICAgICBkU3JjYiwgZFNyYzAsIGRTcmMxLCAjMSAgICAgOy8vIFtiMCBiMSBiMiBiMyAuLl0KLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2MsIGRTcmMwLCBkU3JjMSwgIzIKLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2QsIGRTcmMwLCBkU3JjMSwgIzMKLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2UsIGRTcmMwLCBkU3JjMSwgIzQKLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2YsIGRTcmMwLCBkU3JjMSwgIzUgICAgIDsvLyBbZjAgZjEgZjIgZjMgLi5dCi0gICAgICAgIFZBRERMICAgICAgIHFTcmNjLCBkU3JjYywgZFNyY2QgICAgICAgICA7Ly8gYytkICAgICAgICAgICAgICAgIAotICAgICAgICBWQURETCAgICAgICBxU3JjYiwgZFNyY2IsIGRTcmNlICAgICAgICAgOy8vIGIrZSAgICAgICAgCi0gICAgICAgIFZBRERMICAgICAgIHFSZXMwLCBkU3JjMCwgZFNyY2YgICAgICAgICA7Ly8gQWNjPWErZgotICAgICAgICBWTEQxICAgICAgICBxU3JjMDEsIFtwU3JjXSwgc3JjU3RlcCAgICAgOy8vIFthMCBhMSBhMiBhMyAuLl0KLSAgICAgICAgVk1MQSAgICAgICAgZFJlczAsIGRTcmNDLCBkQ29lZmYyMCAgICAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKLTsgICAgICAgIFZNTFMgICAgICAgIGRSZXMwLCBkU3JjQiwgZENvZWZmNSAgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKLSAgICAgICAgVk1VTCAgICAgICAgZFRtcDAsIGRTcmNCLCBkQ29lZmY1ICAgICAgIDsvLyBBY2MgLT0gNSooYitlKQotICAgICAgICAKLSAgICAgICAgOy8vIFJvdzEKLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2IsIGRTcmMwLCBkU3JjMSwgIzEgICAgIDsvLyBbYjAgYjEgYjIgYjMgLi5dCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmNjLCBkU3JjMCwgZFNyYzEsICMyCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmNkLCBkU3JjMCwgZFNyYzEsICMzCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmNlLCBkU3JjMCwgZFNyYzEsICM0Ci0gICAgICAgIFZFWFQgICAgICAgIGRTcmNmLCBkU3JjMCwgZFNyYzEsICM1ICAgICA7Ly8gW2YwIGYxIGYyIGYzIC4uXQotICAgICAgICBWQURETCAgICAgICBxU3JjYywgZFNyY2MsIGRTcmNkICAgICAgICAgOy8vIGMrZCAgICAgICAgICAgICAgICAKLSAgICAgICAgVkFEREwgICAgICAgcVNyY2IsIGRTcmNiLCBkU3JjZSAgICAgICAgIDsvLyBiK2UgICAgICAgIAotICAgICAgICBWQURETCAgICAgICBxUmVzMSwgZFNyYzAsIGRTcmNmICAgICAgICAgOy8vIEFjYz1hK2YKLSAgICAgICAgVkxEMSAgICAgICAgcVNyYzAxLCBbcFNyY10sIHNyY1N0ZXAgICAgIDsvLyBbYTAgYTEgYTIgYTMgLi5dCi0gICAgICAgIAotICAgICAgICBWU1VCICAgICAgICBkUmVzMCwgZFJlczAsIGRUbXAwIDsvLyBUZVJpCi0gICAgICAgIAotICAgICAgICBWTUxBICAgICAgICBkUmVzMSwgZFNyY0MsIGRDb2VmZjIwICAgICAgOy8vIEFjYyArPSAyMCooYytkKQotOyAgICAgICAgVk1MUyAgICAgICAgZFJlczEsIGRTcmNCLCBkQ29lZmY1ICAgICAgIDsvLyBBY2MgLT0gNSooYitlKQotICAgICAgICBWTVVMICAgICAgICBkVG1wMCwgZFNyY0IsIGRDb2VmZjUgICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCi0KLSAgICAgICAgOy8vIFJvdzIKLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2IsIGRTcmMwLCBkU3JjMSwgIzEgICAgIDsvLyBbYjAgYjEgYjIgYjMgLi5dCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmNjLCBkU3JjMCwgZFNyYzEsICMyCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmNkLCBkU3JjMCwgZFNyYzEsICMzCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmNlLCBkU3JjMCwgZFNyYzEsICM0Ci0gICAgICAgIFZFWFQgICAgICAgIGRTcmNmLCBkU3JjMCwgZFNyYzEsICM1ICAgICA7Ly8gW2YwIGYxIGYyIGYzIC4uXQotICAgICAgICBWQURETCAgICAgICBxU3JjYywgZFNyY2MsIGRTcmNkICAgICAgICAgOy8vIGMrZCAgICAgICAgICAgICAgICAKLSAgICAgICAgVkFEREwgICAgICAgcVNyY2IsIGRTcmNiLCBkU3JjZSAgICAgICAgIDsvLyBiK2UgICAgICAgIAotICAgICAgICBWQURETCAgICAgICBxUmVzMiwgZFNyYzAsIGRTcmNmICAgICAgICAgOy8vIEFjYz1hK2YKLSAgICAgICAgVkxEMSAgICAgICAgcVNyYzAxLCBbcFNyY10sIHNyY1N0ZXAgICAgIDsvLyBbYTAgYTEgYTIgYTMgLi5dCi0gICAgICAgIAotICAgICAgICBWU1VCICAgICAgICBkUmVzMSwgZFJlczEsIGRUbXAwCi0KLSAgICAgICAgVk1MQSAgICAgICAgZFJlczIsIGRTcmNDLCBkQ29lZmYyMCAgICAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKLTsgICAgICAgIFZNTFMgICAgICAgIGRSZXMyLCBkU3JjQiwgZENvZWZmNSAgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKLSAgICAgICAgVk1VTCAgICAgICAgZFRtcDAsIGRTcmNCLCBkQ29lZmY1ICAgICAgIDsvLyBBY2MgLT0gNSooYitlKQotCi0gICAgICAgIDsvLyBSb3czCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmNiLCBkU3JjMCwgZFNyYzEsICMxICAgICA7Ly8gW2IwIGIxIGIyIGIzIC4uXQotICAgICAgICBWRVhUICAgICAgICBkU3JjYywgZFNyYzAsIGRTcmMxLCAjMgotICAgICAgICBWRVhUICAgICAgICBkU3JjZCwgZFNyYzAsIGRTcmMxLCAjMwotICAgICAgICBWRVhUICAgICAgICBkU3JjZSwgZFNyYzAsIGRTcmMxLCAjNAotICAgICAgICBWRVhUICAgICAgICBkU3JjZiwgZFNyYzAsIGRTcmMxLCAjNSAgICAgOy8vIFtmMCBmMSBmMiBmMyAuLl0KLSAgICAgICAgVkFEREwgICAgICAgcVNyY2MsIGRTcmNjLCBkU3JjZCAgICAgICAgIDsvLyBjK2QgICAgICAgICAgICAgICAgCi0gICAgICAgIFZBRERMICAgICAgIHFTcmNiLCBkU3JjYiwgZFNyY2UgICAgICAgICA7Ly8gYitlICAgICAgICAKLSAgICAgICAgVkFEREwgICAgICAgcVJlczMsIGRTcmMwLCBkU3JjZiAgICAgICAgIDsvLyBBY2M9YStmCi0gICAgICAgIFZMRDEgICAgICAgIHFTcmMwMSwgW3BTcmNdLCBzcmNTdGVwICAgICA7Ly8gW2EwIGExIGEyIGEzIC4uXQotCi0gICAgICAgIFZTVUIgICAgICAgIGRSZXMyLCBkUmVzMiwgZFRtcDAKLQotICAgICAgICBWTUxBICAgICAgICBkUmVzMywgZFNyY0MsIGRDb2VmZjIwICAgICAgOy8vIEFjYyArPSAyMCooYytkKQotOyAgICAgICAgVk1MUyAgICAgICAgZFJlczMsIGRTcmNCLCBkQ29lZmY1ICAgICAgIDsvLyBBY2MgLT0gNSooYitlKQotICAgICAgICBWTVVMICAgICAgICBkVG1wMCwgZFNyY0IsIGRDb2VmZjUgICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCi0KLSAgICAgICAgOy8vIFJvdzQKLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2IsIGRTcmMwLCBkU3JjMSwgIzEgICAgIDsvLyBbYjAgYjEgYjIgYjMgLi5dCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmNjLCBkU3JjMCwgZFNyYzEsICMyCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmNkLCBkU3JjMCwgZFNyYzEsICMzCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmNlLCBkU3JjMCwgZFNyYzEsICM0Ci0gICAgICAgIFZFWFQgICAgICAgIGRTcmNmLCBkU3JjMCwgZFNyYzEsICM1ICAgICA7Ly8gW2YwIGYxIGYyIGYzIC4uXQotICAgICAgICBWQURETCAgICAgICBxU3JjYywgZFNyY2MsIGRTcmNkICAgICAgICAgOy8vIGMrZCAgICAgICAgICAgICAgICAKLSAgICAgICAgVkFEREwgICAgICAgcVNyY2IsIGRTcmNiLCBkU3JjZSAgICAgICAgIDsvLyBiK2UgICAgICAgIAotICAgICAgICBWQURETCAgICAgICBxUmVzNCwgZFNyYzAsIGRTcmNmICAgICAgICAgOy8vIEFjYz1hK2YKLSAgICAgICAgVkxEMSAgICAgICAgcVNyYzAxLCBbcFNyY10sIHNyY1N0ZXAgICAgIDsvLyBbYTAgYTEgYTIgYTMgLi5dCi0KLSAgICAgICAgVlNVQiAgICAgICAgZFJlczMsIGRSZXMzLCBkVG1wMAotCi0gICAgICAgIFZNTEEgICAgICAgIGRSZXM0LCBkU3JjQywgZENvZWZmMjAgICAgICA7Ly8gQWNjICs9IDIwKihjK2QpCi07ICAgICAgICBWTUxTICAgICAgICBkUmVzNCwgZFNyY0IsIGRDb2VmZjUgICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCi0gICAgICAgIFZNVUwgICAgICAgIGRUbXAwLCBkU3JjQiwgZENvZWZmNSAgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKLQotICAgICAgICA7Ly8gUm93NQotICAgICAgICBWRVhUICAgICAgICBkU3JjYiwgZFNyYzAsIGRTcmMxLCAjMSAgICAgOy8vIFtiMCBiMSBiMiBiMyAuLl0KLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2MsIGRTcmMwLCBkU3JjMSwgIzIKLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2QsIGRTcmMwLCBkU3JjMSwgIzMKLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2UsIGRTcmMwLCBkU3JjMSwgIzQKLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2YsIGRTcmMwLCBkU3JjMSwgIzUgICAgIDsvLyBbZjAgZjEgZjIgZjMgLi5dCi0gICAgICAgIFZBRERMICAgICAgIHFTcmNjLCBkU3JjYywgZFNyY2QgICAgICAgICA7Ly8gYytkICAgICAgICAgICAgICAgIAotICAgICAgICBWQURETCAgICAgICBxU3JjYiwgZFNyY2IsIGRTcmNlICAgICAgICAgOy8vIGIrZSAgICAgICAgCi0gICAgICAgIFZBRERMICAgICAgIHFSZXM1LCBkU3JjMCwgZFNyY2YgICAgICAgICA7Ly8gQWNjPWErZgotICAgICAgICBWTEQxICAgICAgICBxU3JjMDEsIFtwU3JjXSwgc3JjU3RlcCAgICAgOy8vIFthMCBhMSBhMiBhMyAuLl0KLQotICAgICAgICBWU1VCICAgICAgICBkUmVzNCwgZFJlczQsIGRUbXAwCi0KLSAgICAgICAgVk1MQSAgICAgICAgZFJlczUsIGRTcmNDLCBkQ29lZmYyMCAgICAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKLTsgICAgICAgIFZNTFMgICAgICAgIGRSZXM1LCBkU3JjQiwgZENvZWZmNSAgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKLSAgICAgICAgVk1VTCAgICAgICAgZFRtcDAsIGRTcmNCLCBkQ29lZmY1ICAgICAgIDsvLyBBY2MgLT0gNSooYitlKQotCi0gICAgICAgIDsvLyBSb3c2Ci0gICAgICAgIFZFWFQgICAgICAgIGRTcmNiLCBkU3JjMCwgZFNyYzEsICMxICAgICA7Ly8gW2IwIGIxIGIyIGIzIC4uXQotICAgICAgICBWRVhUICAgICAgICBkU3JjYywgZFNyYzAsIGRTcmMxLCAjMgotICAgICAgICBWRVhUICAgICAgICBkU3JjZCwgZFNyYzAsIGRTcmMxLCAjMwotICAgICAgICBWRVhUICAgICAgICBkU3JjZSwgZFNyYzAsIGRTcmMxLCAjNAotICAgICAgICBWRVhUICAgICAgICBkU3JjZiwgZFNyYzAsIGRTcmMxLCAjNSAgICAgOy8vIFtmMCBmMSBmMiBmMyAuLl0KLSAgICAgICAgVkFEREwgICAgICAgcVNyY2MsIGRTcmNjLCBkU3JjZCAgICAgICAgIDsvLyBjK2QgICAgICAgICAgICAgICAgCi0gICAgICAgIFZBRERMICAgICAgIHFTcmNiLCBkU3JjYiwgZFNyY2UgICAgICAgICA7Ly8gYitlICAgICAgICAKLSAgICAgICAgVkFEREwgICAgICAgcVJlczYsIGRTcmMwLCBkU3JjZiAgICAgICAgIDsvLyBBY2M9YStmCi0gICAgICAgIFZMRDEgICAgICAgIHFTcmMwMSwgW3BTcmNdLCBzcmNTdGVwICAgICA7Ly8gW2EwIGExIGEyIGEzIC4uXQotCi0gICAgICAgIFZTVUIgICAgICAgIGRSZXM1LCBkUmVzNSwgZFRtcDAKLQotICAgICAgICBWTUxBICAgICAgICBkUmVzNiwgZFNyY0MsIGRDb2VmZjIwICAgICAgOy8vIEFjYyArPSAyMCooYytkKQotOyAgICAgICAgVk1MUyAgICAgICAgZFJlczYsIGRTcmNCLCBkQ29lZmY1ICAgICAgIDsvLyBBY2MgLT0gNSooYitlKQotICAgICAgICBWTVVMICAgICAgICBkVG1wMCwgZFNyY0IsIGRDb2VmZjUgICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCi0KLSAgICAgICAgOy8vIFJvdzcKLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2IsIGRTcmMwLCBkU3JjMSwgIzEgICAgIDsvLyBbYjAgYjEgYjIgYjMgLi5dCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmNjLCBkU3JjMCwgZFNyYzEsICMyCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmNkLCBkU3JjMCwgZFNyYzEsICMzCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmNlLCBkU3JjMCwgZFNyYzEsICM0Ci0gICAgICAgIFZFWFQgICAgICAgIGRTcmNmLCBkU3JjMCwgZFNyYzEsICM1ICAgICA7Ly8gW2YwIGYxIGYyIGYzIC4uXQotICAgICAgICBWQURETCAgICAgICBxU3JjYywgZFNyY2MsIGRTcmNkICAgICAgICAgOy8vIGMrZCAgICAgICAgICAgICAgICAKLSAgICAgICAgVkFEREwgICAgICAgcVNyY2IsIGRTcmNiLCBkU3JjZSAgICAgICAgIDsvLyBiK2UgICAgICAgIAotICAgICAgICBWQURETCAgICAgICBxUmVzNywgZFNyYzAsIGRTcmNmICAgICAgICAgOy8vIEFjYz1hK2YKLSAgICAgICAgVkxEMSAgICAgICAgcVNyYzAxLCBbcFNyY10sIHNyY1N0ZXAgICAgIDsvLyBbYTAgYTEgYTIgYTMgLi5dCi0KLSAgICAgICAgVlNVQiAgICAgICAgZFJlczYsIGRSZXM2LCBkVG1wMAotCi0gICAgICAgIFZNTEEgICAgICAgIGRSZXM3LCBkU3JjQywgZENvZWZmMjAgICAgICA7Ly8gQWNjICs9IDIwKihjK2QpCi07ICAgICAgICBWTUxTICAgICAgICBkUmVzNywgZFNyY0IsIGRDb2VmZjUgICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCi0gICAgICAgIFZNVUwgICAgICAgIGRUbXAwLCBkU3JjQiwgZENvZWZmNSAgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKLQotICAgICAgICA7Ly8gUm93OAotICAgICAgICBWRVhUICAgICAgICBkU3JjYiwgZFNyYzAsIGRTcmMxLCAjMSAgICAgOy8vIFtiMCBiMSBiMiBiMyAuLl0KLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2MsIGRTcmMwLCBkU3JjMSwgIzIKLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2QsIGRTcmMwLCBkU3JjMSwgIzMKLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2UsIGRTcmMwLCBkU3JjMSwgIzQKLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2YsIGRTcmMwLCBkU3JjMSwgIzUgICAgIDsvLyBbZjAgZjEgZjIgZjMgLi5dCi0gICAgICAgIFZBRERMICAgICAgIHFTcmNjLCBkU3JjYywgZFNyY2QgICAgICAgICA7Ly8gYytkICAgICAgICAgICAgICAgIAotICAgICAgICBWQURETCAgICAgICBxU3JjYiwgZFNyY2IsIGRTcmNlICAgICAgICAgOy8vIGIrZSAgICAgICAgCi0gICAgICAgIFZBRERMICAgICAgIHFSZXM4LCBkU3JjMCwgZFNyY2YgICAgICAgICA7Ly8gQWNjPWErZgotCi0gICAgICAgIFZTVUIgICAgICAgIGRSZXM3LCBkUmVzNywgZFRtcDAKLQotICAgICAgICBWTUxBICAgICAgICBkUmVzOCwgZFNyY0MsIGRDb2VmZjIwICAgICAgOy8vIEFjYyArPSAyMCooYytkKQotOyAgICAgICAgVk1MUyAgICAgICAgZFJlczgsIGRTcmNCLCBkQ29lZmY1ICAgICAgIDsvLyBBY2MgLT0gNSooYitlKQotICAgICAgICBWTVVMICAgICAgICBkVG1wMCwgZFNyY0IsIGRDb2VmZjUgICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCi0KLSAgICAgICAgVk1PViAgICAgICAgcUNvZWZmMjAsICMyMAotICAgICAgICBWTU9WICAgICAgICBxQ29lZmY1LCAjNQotCi0gICAgICAgIDsvLyBDb2wwCi0gICAgICAgIFZBRERMICAgICAgIHFBY2MwMSwgZFJlczAsIGRSZXM1ICAgICAgICA7Ly8gQWNjID0gYStmCi0gICAgICAgIFZBRERMICAgICAgIHFTdW1DRCwgZFJlczIsIGRSZXMzICAgICAgICA7Ly8gYytkCi0gICAgICAgIFZBRERMICAgICAgIHFTdW1CRSwgZFJlczEsIGRSZXM0ICAgICAgICA7Ly8gYitlCi0KLSAgICAgICAgVlNVQiAgICAgICAgZFJlczgsIGRSZXM4LCBkVG1wMAotCi0gICAgICAgIFZNTEEgICAgICAgIHFBY2MwMSwgcVN1bUNELCBxQ29lZmYyMCAgICA7Ly8gQWNjICs9IDIwKihjK2QpCi07ICAgICAgICBWTUxTICAgICAgICBxQWNjMDEsIHFTdW1CRSwgcUNvZWZmNSAgICAgOy8vIEFjYyAtPSAyMCooYitlKSAgICAgICAgCi0gICAgICAgIFZNVUwgICAgICAgIHFUbXAwLCBxU3VtQkUsIHFDb2VmZjUgICAgIDsvLyBBY2MgLT0gMjAqKGIrZSkgICAgICAgIAotCi0gICAgICAgIDsvLyBDb2wxCi0gICAgICAgIFZBRERMICAgICAgIHFBY2MyMywgZFJlczEsIGRSZXM2ICAgICAgICA7Ly8gQWNjID0gYStmCi0gICAgICAgIFZBRERMICAgICAgIHFTdW1DRCwgZFJlczMsIGRSZXM0ICAgICAgICA7Ly8gYytkCi0gICAgICAgIFZBRERMICAgICAgIHFTdW1CRSwgZFJlczIsIGRSZXM1ICAgICAgICA7Ly8gYitlCi0gICAgICAgIFZNTEEgICAgICAgIHFBY2MyMywgcVN1bUNELCBxQ29lZmYyMCAgICA7Ly8gQWNjICs9IDIwKihjK2QpCi0KLSAgICAgICAgVlNVQiAgICAgICAgcUFjYzAxLCBxQWNjMDEsIHFUbXAwCi0KLTsgICAgICAgIFZNTFMgICAgICAgIHFBY2MyMywgcVN1bUJFLCBxQ29lZmY1ICAgICA7Ly8gQWNjIC09IDIwKihiK2UpICAgICAgICAKLSAgICAgICAgVk1VTCAgICAgICAgcVRtcDAsIHFTdW1CRSwgcUNvZWZmNSAgICAgOy8vIEFjYyAtPSAyMCooYitlKSAgICAgICAgCi0KLSAgICAgICAgOy8vIENvbDIKLSAgICAgICAgVkFEREwgICAgICAgcUFjYzQ1LCBkUmVzMiwgZFJlczcgICAgICAgIDsvLyBBY2MgPSBhK2YKLSAgICAgICAgVkFEREwgICAgICAgcVN1bUNELCBkUmVzNCwgZFJlczUgICAgICAgIDsvLyBjK2QKLSAgICAgICAgVkFEREwgICAgICAgcVN1bUJFLCBkUmVzMywgZFJlczYgICAgICAgIDsvLyBiK2UKLSAgICAgICAgVk1MQSAgICAgICAgcUFjYzQ1LCBxU3VtQ0QsIHFDb2VmZjIwICAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKLQotICAgICAgICBWU1VCICAgICAgICBxQWNjMjMsIHFBY2MyMywgcVRtcDAKLQotOyAgICAgICAgVk1MUyAgICAgICAgcUFjYzQ1LCBxU3VtQkUsIHFDb2VmZjUgICAgIDsvLyBBY2MgLT0gMjAqKGIrZSkgICAgICAgIAotICAgICAgICBWTVVMICAgICAgICBxVG1wMCwgcVN1bUJFLCBxQ29lZmY1ICAgICA7Ly8gQWNjIC09IDIwKihiK2UpICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBDb2wzCi0gICAgICAgIFZBRERMICAgICAgIHFBY2M2NywgZFJlczMsIGRSZXM4ICAgICAgICA7Ly8gQWNjID0gYStmCi0gICAgICAgIFZBRERMICAgICAgIHFTdW1DRCwgZFJlczUsIGRSZXM2ICAgICAgICA7Ly8gYytkCi0gICAgICAgIFZBRERMICAgICAgIHFTdW1CRSwgZFJlczQsIGRSZXM3ICAgICAgICA7Ly8gYitlCi0gICAgICAgIFZNTEEgICAgICAgIHFBY2M2NywgcVN1bUNELCBxQ29lZmYyMCAgICA7Ly8gQWNjICs9IDIwKihjK2QpCi0KLSAgICAgICAgVlNVQiAgICAgICAgcUFjYzQ1LCBxQWNjNDUsIHFUbXAwCi0KLSAgICAgICAgVk1MUyAgICAgICAgcUFjYzY3LCBxU3VtQkUsIHFDb2VmZjUgICAgIDsvLyBBY2MgLT0gMjAqKGIrZSkgICAgICAgIAotCi0gICAgICAgIFZRUlNIUlVOICAgIGRUZW1wQWNjMCwgcUFjYzAxLCAjMTAKLSAgICAgICAgVlFSU0hSVU4gICAgZFRlbXBBY2MxLCBxQWNjMjMsICMxMAotICAgICAgICBWUVJTSFJVTiAgICBkVGVtcEFjYzIsIHFBY2M0NSwgIzEwCi0gICAgICAgIFZRUlNIUlVOICAgIGRUZW1wQWNjMywgcUFjYzY3LCAjMTAKLSAgICAgICAgCi0gICAgICAgIFZRTU9WTiAgICAgIGRBY2MwLCBxVEFjYzAKLSAgICAgICAgVlFNT1ZOICAgICAgZEFjYzEsIHFUQWNjMQotICAgICAgICBWUU1PVk4gICAgICBkQWNjMiwgcVRBY2MyCi0gICAgICAgIFZRTU9WTiAgICAgIGRBY2MzLCBxVEFjYzMKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgTV9FTkQKLSAgICAKLSAgICBFTkRJRgotCi0KLSAgICAKLSAgICBFTkQKLSAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JjOTUzNC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyODAgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZV9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICAxMjI5MAotOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotCi0gICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmUKLQotICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4Ci0KLSAgICBJRiBDb3J0ZXhBOAotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZSwgcjExCi0KLTsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycwotcFNyYyAgICAgICAgICAgIFJOIDAKLXNyY1N0ZXAgICAgICAgICBSTiAxCi1wRHN0ICAgICAgICAgICAgUk4gMgotZHN0U3RlcCAgICAgICAgIFJOIDMKLQotOy8vIERlY2xhcmUgTmVvbiByZWdpc3RlcnMKLWRUQ29lZmY1ICAgICAgICBETiAzMC5VOAotZFRDb2VmZjIwICAgICAgIEROIDMxLlU4Ci1kQ29lZmY1ICAgICAgICAgRE4gMzAuUzE2Ci1kQ29lZmYyMCAgICAgICAgRE4gMzEuUzE2Ci0KLXFTcmNBMDEgICAgICAgICBRTiAwLlU4Ci1xU3JjQjIzICAgICAgICAgUU4gMS5VOAotcVNyY0M0NSAgICAgICAgIFFOIDIuVTgKLXFTcmNENjcgICAgICAgICBRTiAzLlU4Ci1xU3JjRTg5ICAgICAgICAgUU4gNC5VOAotcVNyY0YxMDExICAgICAgIFFOIDUuVTgKLXFTcmNHMTIxMyAgICAgICBRTiA2LlU4Ci1xU3JjSDE0MTUgICAgICAgUU4gNy5VOAotcVNyY0kxNjE3ICAgICAgIFFOIDguVTgKLQotZFNyY0EwICAgICAgICAgIEROIDAuVTgKLWRTcmNCMiAgICAgICAgICBETiAyLlU4Ci1kU3JjQzQgICAgICAgICAgRE4gNC5VOAotZFNyY0Q2ICAgICAgICAgIEROIDYuVTgKLWRTcmNFOCAgICAgICAgICBETiA4LlU4Ci1kU3JjRjEwICAgICAgICAgRE4gMTAuVTgKLWRTcmNHMTIgICAgICAgICBETiAxMi5VOAotZFNyY0gxNCAgICAgICAgIEROIDE0LlU4Ci1kU3JjSTE2ICAgICAgICAgRE4gMTYuVTgKLQotZFNyY0ExICAgICAgICAgIEROIDEuVTgKLWRTcmNCMyAgICAgICAgICBETiAzLlU4Ci1kU3JjQzUgICAgICAgICAgRE4gNS5VOAotZFNyY0Q3ICAgICAgICAgIEROIDcuVTgKLWRTcmNFOSAgICAgICAgICBETiA5LlU4Ci1kU3JjRjExICAgICAgICAgRE4gMTEuVTgKLWRTcmNHMTMgICAgICAgICBETiAxMy5VOAotZFNyY0gxNSAgICAgICAgIEROIDE1LlU4Ci1kU3JjSTE3ICAgICAgICAgRE4gMTcuVTgKLQotcVRlbXBQMDEgICAgICAgIFFOIDkuUzE2Ci1xVGVtcFEwMSAgICAgICAgUU4gMTAuUzE2Ci1xVGVtcFIwMSAgICAgICAgUU4gMTEuUzE2Ci1xVGVtcFMwMSAgICAgICAgUU4gMTIuUzE2Ci0KLXFUZW1wUDIzICAgICAgICBRTiAwLlMxNgotcVRlbXBRMjMgICAgICAgIFFOIDEuUzE2Ci1xVGVtcFIyMyAgICAgICAgUU4gMi5TMTYKLXFUZW1wUzIzICAgICAgICBRTiAzLlMxNgotCi1kVGVtcFAwICAgICAgICAgRE4gMTguUzE2Ci1kVGVtcFAxICAgICAgICAgRE4gMTkuUzE2Ci1kVGVtcFAyICAgICAgICAgRE4gMC5TMTYKLQotZFRlbXBRMCAgICAgICAgIEROIDIwLlMxNgotZFRlbXBRMSAgICAgICAgIEROIDIxLlMxNgotZFRlbXBRMiAgICAgICAgIEROIDIuUzE2Ci0KLWRUZW1wUjAgICAgICAgICBETiAyMi5TMTYKLWRUZW1wUjEgICAgICAgICBETiAyMy5TMTYKLWRUZW1wUjIgICAgICAgICBETiA0LlMxNgotCi1kVGVtcFMwICAgICAgICAgRE4gMjQuUzE2Ci1kVGVtcFMxICAgICAgICAgRE4gMjUuUzE2Ci1kVGVtcFMyICAgICAgICAgRE4gNi5TMTYKLSAKLWRUZW1wQjAgICAgICAgICBETiAyNi5TMTYKLWRUZW1wQzAgICAgICAgICBETiAyNy5TMTYKLWRUZW1wRDAgICAgICAgICBETiAyOC5TMTYKLWRUZW1wRjAgICAgICAgICBETiAyOS5TMTYKLQotZFRlbXBBY2MwICAgICAgIEROIDAuVTE2Ci1kVGVtcEFjYzEgICAgICAgRE4gMi5VMTYKLWRUZW1wQWNjMiAgICAgICBETiA0LlUxNgotZFRlbXBBY2MzICAgICAgIEROIDYuVTE2Ci0KLWRBY2MwICAgICAgICAgICBETiAwLlU4Ci1kQWNjMSAgICAgICAgICAgRE4gMi5VOAotZEFjYzIgICAgICAgICAgIEROIDQuVTgKLWRBY2MzICAgICAgICAgICBETiA2LlU4Ci0KLXFBY2MwICAgICAgICAgICBRTiAwLlMzMgotcUFjYzEgICAgICAgICAgIFFOIDEuUzMyCi1xQWNjMiAgICAgICAgICAgUU4gMi5TMzIKLXFBY2MzICAgICAgICAgICBRTiAzLlMzMgotCi1xVEFjYzAgICAgICAgICAgUU4gMC5VMTYKLXFUQWNjMSAgICAgICAgICBRTiAxLlUxNgotcVRBY2MyICAgICAgICAgIFFOIDIuVTE2Ci1xVEFjYzMgICAgICAgICAgUU4gMy5VMTYgICAgICAgICAgICAgICAgCi0KLXFUbXAgICAgICAgICAgICBRTiA0LlMxNgotZFRtcCAgICAgICAgICAgIEROIDguUzE2Ci0KLSAgICAgICAgVkxEMSAgICAgICAgcVNyY0EwMSwgW3BTcmNdLCBzcmNTdGVwICAgICAgICAgICAgICAgICA7Ly8gW2EwIGExIGEyIGEzIC4uIGExNV0gICAKLSAgICAgICAgQUREICAgICAgICAgcjEyLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzIKLSAgICAgICAgVk1PViAgICAgICAgZFRDb2VmZjUsICM1Ci0gICAgICAgIFZNT1YgICAgICAgIGRUQ29lZmYyMCwgIzIwCi0gICAgICAgIFZMRDEgICAgICAgIHFTcmNGMTAxMSwgW3IxMl0sIHNyY1N0ZXAKLSAgICAgICAgVkxEMSAgICAgICAgcVNyY0IyMywgW3BTcmNdLCBzcmNTdGVwICAgICAgICAgICAgICAgICA7Ly8gW2IwIGIxIGIyIGIzIC4uIGIxNV0KLSAgICAgICAgCi0gICAgICAgIFZMRDEgICAgICAgIHFTcmNHMTIxMywgW3IxMl0sIHNyY1N0ZXAKLSAgICAgICAgVkFEREwgICAgICAgcVRlbXBQMDEsIGRTcmNBMCwgZFNyY0YxMCAgICAgICAgICAgCi0gICAgICAgIFZMRDEgICAgICAgIHFTcmNDNDUsIFtwU3JjXSwgc3JjU3RlcCAgICAgICAgICAgICAgICAgOy8vIFtjMCBjMSBjMiBjMyAuLiBjMTVdCi0gICAgICAgIFZBRERMICAgICAgIHFUZW1wUDIzLCBkU3JjQTEsIGRTcmNGMTEgICAKLSAgICAgICAgVkxEMSAgICAgICAgcVNyY0Q2NywgW3BTcmNdLCBzcmNTdGVwCi0gICAgICAgIFZBRERMICAgICAgIHFUZW1wUTAxLCBkU3JjQjIsIGRTcmNHMTIgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFZMRDEgICAgICAgIHFTcmNFODksIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICAKLSAgICAgICAgOy8vdDAKLSAgICAgICAgVk1MQUwgICAgICAgcVRlbXBQMDEsIGRTcmNDNCwgZFRDb2VmZjIwCi0gICAgICAgIAotICAgICAgICBWTEQxICAgICAgICBxU3JjSDE0MTUsIFtyMTJdLCBzcmNTdGVwCi0KLSAgICAgICAgVk1MQUwgICAgICAgcVRlbXBQMjMsIGRTcmNDNSwgZFRDb2VmZjIwCi0gICAgICAgIAotICAgICAgICBWTEQxICAgICAgICBxU3JjSTE2MTcsIFtyMTJdLCBzcmNTdGVwICAgICAgICAgICAgICAgICA7Ly8gW2kwIGkxIGkyIGkzIC4uIF0KLSAgICAgICAgCi0gICAgICAgIFZNTEFMICAgICAgIHFUZW1wUDAxLCBkU3JjRDYsIGRUQ29lZmYyMAotICAgICAgICBWTUxBTCAgICAgICBxVGVtcFEwMSwgZFNyY0Q2LCBkVENvZWZmMjAKLSAgICAgICAgVk1MU0wgICAgICAgcVRlbXBQMjMsIGRTcmNCMywgZFRDb2VmZjUKLSAgICAgICAgCi0gICAgICAgIFZBRERMICAgICAgIHFUZW1wUjAxLCBkU3JjQzQsIGRTcmNIMTQgICAKLSAgICAgICAgCi0gICAgICAgIFZNTFNMICAgICAgIHFUZW1wUDAxLCBkU3JjQjIsIGRUQ29lZmY1Ci0KLSAgICAgICAgVkFEREwgICAgICAgcVRlbXBRMjMsIGRTcmNCMywgZFNyY0cxMyAgIAotCi0gICAgICAgIFZNTEFMICAgICAgIHFUZW1wUDIzLCBkU3JjRDcsIGRUQ29lZmYyMAotICAgICAgICBWTUxBTCAgICAgICBxVGVtcFEwMSwgZFNyY0U4LCBkVENvZWZmMjAKLQotICAgICAgICBWTUxTTCAgICAgICBxVGVtcFAwMSwgZFNyY0U4LCBkVENvZWZmNQotICAgICAgICBWTUxBTCAgICAgICBxVGVtcFEyMywgZFNyY0Q3LCBkVENvZWZmMjAKLQotICAgICAgICBWTUxTTCAgICAgICBxVGVtcFAyMywgZFNyY0U5LCBkVENvZWZmNQotCi0gICAgICAgIDsvL3QxCi0KLSAgICAgICAgVk1MQUwgICAgICAgcVRlbXBSMDEsIGRTcmNFOCwgZFRDb2VmZjIwCi0gICAgICAgIFZNTFNMICAgICAgIHFUZW1wUTAxLCBkU3JjQzQsIGRUQ29lZmY1Ci0gICAgICAgIFZNTFNMICAgICAgIHFUZW1wUTIzLCBkU3JjQzUsIGRUQ29lZmY1Ci0gICAgICAgIFZBRERMICAgICAgIHFUZW1wUjIzLCBkU3JjQzUsIGRTcmNIMTUgICAKLQotICAgICAgICBWTUxBTCAgICAgICBxVGVtcFIwMSwgZFNyY0YxMCwgZFRDb2VmZjIwCi0gICAgICAgIFZNTFNMICAgICAgIHFUZW1wUTAxLCBkU3JjRjEwLCBkVENvZWZmNQotICAgICAgICBWTUxBTCAgICAgICBxVGVtcFEyMywgZFNyY0U5LCBkVENvZWZmMjAKLSAgICAgICAgVk1MQUwgICAgICAgcVRlbXBSMjMsIGRTcmNFOSwgZFRDb2VmZjIwCi0gICAgICAgIFZBRERMICAgICAgIHFUZW1wUzAxLCBkU3JjRDYsIGRTcmNJMTYgICAKLQotCi0gICAgICAgIFZNTFNMICAgICAgIHFUZW1wUjAxLCBkU3JjRDYsIGRUQ29lZmY1Ci0gICAgICAgIFZNTFNMICAgICAgIHFUZW1wUTIzLCBkU3JjRjExLCBkVENvZWZmNQotICAgICAgICBWTUxTTCAgICAgICBxVGVtcFIyMywgZFNyY0Q3LCBkVENvZWZmNQotCi0gICAgICAgIDsvL3QyCi0gICAgICAgIFZBRERMICAgICAgIHFUZW1wUzIzLCBkU3JjRDcsIGRTcmNJMTcgICAKLSAgICAgICAgVk1MQUwgICAgICAgcVRlbXBTMDEsIGRTcmNGMTAsIGRUQ29lZmYyMAotICAgICAgICBWTUxTTCAgICAgICBxVGVtcFIwMSwgZFNyY0cxMiwgZFRDb2VmZjUKLSAgICAgICAgVk1MU0wgICAgICAgcVRlbXBSMjMsIGRTcmNHMTMsIGRUQ29lZmY1Ci0KLSAgICAgICAgVk1MQUwgICAgICAgcVRlbXBTMjMsIGRTcmNGMTEsIGRUQ29lZmYyMAotICAgICAgICBWTUxBTCAgICAgICBxVGVtcFMwMSwgZFNyY0cxMiwgZFRDb2VmZjIwCi0gICAgICAgIFZFWFQgICAgICAgIGRUZW1wQjAsIGRUZW1wUDAsIGRUZW1wUDEsICMxCi0gICAgICAgIFZNTEFMICAgICAgIHFUZW1wUjIzLCBkU3JjRjExLCBkVENvZWZmMjAKLQotCi0gICAgICAgIDsvL3QzCi0gICAgICAgIFZNTEFMICAgICAgIHFUZW1wUzIzLCBkU3JjRzEzLCBkVENvZWZmMjAKLSAgICAgICAgVk1MU0wgICAgICAgcVRlbXBTMDEsIGRTcmNFOCwgZFRDb2VmZjUKLSAgICAgICAgVkVYVCAgICAgICAgZFRlbXBDMCwgZFRlbXBQMCwgZFRlbXBQMSwgIzIKLSAgICAgICAgVk1PViAgICAgICAgZENvZWZmMjAsICMyMAotICAgICAgICBWTUxTTCAgICAgICBxVGVtcFMyMywgZFNyY0U5LCBkVENvZWZmNQotICAgICAgICBWTUxTTCAgICAgICBxVGVtcFMwMSwgZFNyY0gxNCwgZFRDb2VmZjUKLSAgICAgICAgVkVYVCAgICAgICAgZFRlbXBGMCwgZFRlbXBQMSwgZFRlbXBQMiwgIzEKLSAgICAgICAgVkVYVCAgICAgICAgZFRlbXBEMCwgZFRlbXBQMCwgZFRlbXBQMSwgIzMKLSAgICAgICAgVk1MU0wgICAgICAgcVRlbXBTMjMsIGRTcmNIMTUsIGRUQ29lZmY1Ci0gICAgICAgIAotICAgICAgICBWQURETCAgICAgICBxQWNjMCwgZFRlbXBQMCwgZFRlbXBGMAotICAgICAgICBWQUREICAgICAgICBkVGVtcEMwLCBkVGVtcEMwLCBkVGVtcEQwCi0gICAgICAgIDsvL2ggCi0gICAgICAgIFZNT1YgICAgICAgIGRDb2VmZjUsICM1Ci0gICAgICAgIAotICAgICAgICA7Ly8gcmVzMAotICAgICAgICBWQUREICAgICAgICBkVGVtcEIwLCBkVGVtcEIwLCBkVGVtcFAxCi0gICAgICAgIFZNTEFMICAgICAgIHFBY2MwLCBkVGVtcEMwLCBkQ29lZmYyMAotICAgICAgICBWRVhUICAgICAgICBkVGVtcEMwLCBkVGVtcFEwLCBkVGVtcFExLCAjMgotICAgICAgICBWRVhUICAgICAgICBkVGVtcEQwLCBkVGVtcFEwLCBkVGVtcFExLCAjMwotICAgICAgICBWRVhUICAgICAgICBkVGVtcEYwLCBkVGVtcFExLCBkVGVtcFEyLCAjMQotICAgICAgICBWTUxTTCAgICAgICBxQWNjMCwgZFRlbXBCMCwgZENvZWZmNQotCi0gICAgICAgIDsvLyByZXMxCi0gICAgICAgIFZFWFQgICAgICAgIGRUZW1wQjAsIGRUZW1wUTAsIGRUZW1wUTEsICMxCi0gICAgICAgIFZBRERMICAgICAgIHFBY2MxLCBkVGVtcFEwLCBkVGVtcEYwCi0gICAgICAgIFZBREQgICAgICAgIGRUZW1wQzAsIGRUZW1wQzAsIGRUZW1wRDAKLSAgICAgICAgVkFERCAgICAgICAgZFRlbXBCMCwgZFRlbXBCMCwgZFRlbXBRMQotICAgICAgICBWRVhUICAgICAgICBkVGVtcEQwLCBkVGVtcFIwLCBkVGVtcFIxLCAjMwotICAgICAgICBWTUxBTCAgICAgICBxQWNjMSwgZFRlbXBDMCwgZENvZWZmMjAKLSAgICAgICAgVkVYVCAgICAgICAgZFRlbXBGMCwgZFRlbXBSMSwgZFRlbXBSMiwgIzEKLSAgICAgICAgVkVYVCAgICAgICAgZFRlbXBDMCwgZFRlbXBSMCwgZFRlbXBSMSwgIzIKLSAgICAgICAgVkVYVCAgICAgICAgZFRtcCwgZFRlbXBSMCwgZFRlbXBSMSwgIzEKLSAgICAgICAgVkFEREwgICAgICAgcUFjYzIsIGRUZW1wUjAsIGRUZW1wRjAKLSAgICAgICAgVk1MU0wgICAgICAgcUFjYzEsIGRUZW1wQjAsIGRDb2VmZjUKLTsgICAgICAgIFZFWFQgICAgICAgIGRUZW1wQjAsIGRUZW1wUjAsIGRUZW1wUjEsICMxCi0gICAgICAgIFZBREQgICAgICAgIGRUZW1wQzAsIGRUZW1wQzAsIGRUZW1wRDAKLSAgICAgICAgCi0gICAgICAgIDsvLyByZXMyCi0gICAgICAgIFZBREQgICAgICAgIGRUZW1wQjAsIGRUbXAsIGRUZW1wUjEKLSAgICAgICAgVkVYVCAgICAgICAgZFRlbXBEMCwgZFRlbXBTMCwgZFRlbXBTMSwgIzMKLSAgICAgICAgVk1MQUwgICAgICAgcUFjYzIsIGRUZW1wQzAsIGRDb2VmZjIwCi07ICAgICAgICBWQUREICAgICAgICBkVGVtcEIwLCBkVGVtcEIwLCBkVGVtcFIxCi0gICAgICAgIAotICAgICAgICA7Ly8gcmVzMwotICAgICAgICBWRVhUICAgICAgICBkVGVtcEMwLCBkVGVtcFMwLCBkVGVtcFMxLCAjMgotICAgICAgICBWRVhUICAgICAgICBkVGVtcEYwLCBkVGVtcFMxLCBkVGVtcFMyLCAjMQotICAgICAgICBWQUREICAgICAgICBkVGVtcEMwLCBkVGVtcEMwLCBkVGVtcEQwCi0gICAgICAgIFZFWFQgICAgICAgIGRUbXAsIGRUZW1wUzAsIGRUZW1wUzEsICMxCi0gICAgICAgIFZBRERMICAgICAgIHFBY2MzLCBkVGVtcFMwLCBkVGVtcEYwCi0gICAgICAgIFZNTFNMICAgICAgIHFBY2MyLCBkVGVtcEIwLCBkQ29lZmY1Ci0gICAgICAgIFZNTEFMICAgICAgIHFBY2MzLCBkVGVtcEMwLCBkQ29lZmYyMAotICAgICAgICBWQUREICAgICAgICBkVG1wLCBkVG1wLCBkVGVtcFMxCi0gICAgICAgIFZNTFNMICAgICAgIHFBY2MzLCBkVG1wLCBkQ29lZmY1Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIFZRUlNIUlVOICAgIGRUZW1wQWNjMCwgcUFjYzAsICMxMAotICAgICAgICBWUVJTSFJVTiAgICBkVGVtcEFjYzEsIHFBY2MxLCAjMTAKLSAgICAgICAgVlFSU0hSVU4gICAgZFRlbXBBY2MyLCBxQWNjMiwgIzEwCi0gICAgICAgIFZRUlNIUlVOICAgIGRUZW1wQWNjMywgcUFjYzMsICMxMAotCi0gICAgICAgIFZRTU9WTiAgICAgIGRBY2MwLCBxVEFjYzAKLSAgICAgICAgVlFNT1ZOICAgICAgZEFjYzEsIHFUQWNjMQotICAgICAgICBWUU1PVk4gICAgICBkQWNjMiwgcVRBY2MyCi0gICAgICAgIFZRTU9WTiAgICAgIGRBY2MzLCBxVEFjYzMKLSAgICAgICAgCi0gICAgICAgIE1fRU5ECi0gICAgCi0gICAgRU5ESUYKLSAgICAKLSAgICAKLSAgICAKLQotICAgIAotICAgIEVORAotICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWExYzM0NS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlX3MucworKysgL2Rldi9udWxsCkBAIC0xLDI0MiArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmVfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgMTIyOTAKLTsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLQotICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4Ci0gICAgICAgIAotICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUKLQotREVCVUdfT04gICAgU0VUTCB7RkFMU0V9Ci0KLSAgICBJRiBDb3J0ZXhBOAotICAgICAgICAKLSAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZSwgcjExCi0KLTsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycwotcFNyYyAgICAgICAgICAgIFJOIDAKLXNyY1N0ZXAgICAgICAgICBSTiAxCi1wRHN0ICAgICAgICAgICAgUk4gMgotZHN0U3RlcCAgICAgICAgIFJOIDMKLQotOy8vIERlY2xhcmUgTmVvbiByZWdpc3RlcnMKLWRDb2VmZjUgICAgICAgICBETiAzMC5TMTYKLWRDb2VmZjIwICAgICAgICBETiAzMS5TMTYKLQotcVNyY0EwMSAgICAgICAgIFFOIDExLlU4Ci1xU3JjQjAxICAgICAgICAgUU4gMTIuVTgKLXFTcmNDMDEgICAgICAgICBRTiAxMy5VOAotcVNyY0QwMSAgICAgICAgIFFOIDE0LlU4Ci0KLWRTcmNBMCAgICAgICAgICBETiAyMi5VOAotZFNyY0ExICAgICAgICAgIEROIDIzLlU4Ci1kU3JjQjAgICAgICAgICAgRE4gMjQuVTgKLWRTcmNCMSAgICAgICAgICBETiAyNS5VOAotZFNyY0MwICAgICAgICAgIEROIDI2LlU4Ci1kU3JjQzEgICAgICAgICAgRE4gMjcuVTgKLWRTcmNEMCAgICAgICAgICBETiAyOC5VOAotZFNyY0QxICAgICAgICAgIEROIDI5LlU4Ci0KLWRTcmNiICAgICAgICAgICBETiAxMi5VOAotZFNyY2UgICAgICAgICAgIEROIDEzLlU4Ci1kU3JjZiAgICAgICAgICAgRE4gMTAuVTgKLQotZFNyYzBjICAgICAgICAgIEROIDE0LlU4Ci1kU3JjMWMgICAgICAgICAgRE4gMTYuVTgKLWRTcmMyYyAgICAgICAgICBETiAxOC5VOAotZFNyYzNjICAgICAgICAgIEROIDIwLlU4Ci0gICAgICAgICAgICAgICAgICAgCi1kU3JjMGQgICAgICAgICAgRE4gMTUuVTgKLWRTcmMxZCAgICAgICAgICBETiAxNy5VOAotZFNyYzJkICAgICAgICAgIEROIDE5LlU4Ci1kU3JjM2QgICAgICAgICAgRE4gMjEuVTgKLQotcVRlbXAwMSAgICAgICAgIFFOIDQuUzE2Ci1xVGVtcDIzICAgICAgICAgUU4gNi5TMTYKLWRUZW1wMCAgICAgICAgICBETiA4LlMxNgotZFRlbXAyICAgICAgICAgIEROIDEyLlMxNgotCi1xUmVzMDEgICAgICAgICAgUU4gMTEuUzE2Ci1xUmVzMjMgICAgICAgICAgUU4gMTIuUzE2Ci1xUmVzNDUgICAgICAgICAgUU4gMTMuUzE2Ci1xUmVzNjcgICAgICAgICAgUU4gMTQuUzE2Ci0KLWRSZXMwICAgICAgICAgICBETiAyMi5TMTYKLWRSZXMyICAgICAgICAgICBETiAyNC5TMTYKLWRSZXM0ICAgICAgICAgICBETiAyNi5TMTYKLWRSZXM2ICAgICAgICAgICBETiAyOC5TMTYKLQotZEFjYzAgICAgICAgICAgIEROIDIyLlU4Ci1kQWNjMiAgICAgICAgICAgRE4gMjQuVTgKLWRBY2M0ICAgICAgICAgICBETiAyNi5VOAotZEFjYzYgICAgICAgICAgIEROIDI4LlU4Ci0KLWRSZXN1bHQwICAgICAgICBETiAyMi5VMzIKLWRSZXN1bHQyICAgICAgICBETiAyNC5VMzIKLWRSZXN1bHQ0ICAgICAgICBETiAyNi5VMzIKLWRSZXN1bHQ2ICAgICAgICBETiAyOC5VMzIKLQotICAgICAgICBWTEQxICAgICAgICBxU3JjQTAxLCBbcFNyY10sIHNyY1N0ZXAgICAgOy8vIExvYWQgQSByZWdpc3RlciBbYTAgYTEgYTIgYTMgLi5dCi0gICAgICAgIDsvLyBPbmUgY3ljbGUgc3RhbGwKLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2YsIGRTcmNBMCwgZFNyY0ExLCAjNSAgIDsvLyBbZjAgZjEgZjIgZjMgLi5dCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmNiLCBkU3JjQTAsIGRTcmNBMSwgIzEgICA7Ly8gW2IwIGIxIGIyIGIzIC4uXQotOyAgICAgICAgVkxEMSAgICAgICAgcVNyY0IwMSwgW3BTcmNdLCBzcmNTdGVwICAgIDsvLyBMb2FkIEIgcmVnaXN0ZXIgW2EwIGExIGEyIGEzIC4uXQotICAgICAgICBWRVhUICAgICAgICBkU3JjMGMsIGRTcmNBMCwgZFNyY0ExLCAjMgotICAgICAgICBWRVhUICAgICAgICBkU3JjMGQsIGRTcmNBMCwgZFNyY0ExLCAjMwotICAgICAgICBWRVhUICAgICAgICBkU3JjZSwgZFNyY0EwLCBkU3JjQTEsICM0Ci0gICAgICAgIFZBRERMICAgICAgIHFSZXMwMSwgZFNyY0EwLCBkU3JjZiAgICAgICA7Ly8gQWNjPWErZgotICAgICAgICBWQURETCAgICAgICBxVGVtcDAxLCBkU3JjMGMsIGRTcmMwZCAgICAgOy8vIGMrZCAgICAgICAgICAgICAgICAKLSAgICAgICAgVkFEREwgICAgICAgcVRlbXAyMywgZFNyY2IsIGRTcmNlICAgICAgIDsvLyBiK2UKLSAgICAgICAgCi0gICAgICAgIFZMRDEgICAgICAgIHFTcmNCMDEsIFtwU3JjXSwgc3JjU3RlcCAgICA7Ly8gTG9hZCBCIHJlZ2lzdGVyIFthMCBhMSBhMiBhMyAuLl0KLTsgICAgICAgIFZMRDEgICAgICAgIHFTcmNDMDEsIFtwU3JjXSwgc3JjU3RlcCAgICA7Ly8gTG9hZCBDIHJlZ2lzdGVyIFthMCBhMSBhMiBhMyAuLl0gICAgICAgICAgIAotICAgICAgICBWTUxBICAgICAgICBkUmVzMCwgZFRlbXAwLCBkQ29lZmYyMCAgICAgOy8vIEFjYyArPSAyMCooYytkKQotOyAgICAgICAgVk1MUyAgICAgICAgZFJlczAsIGRUZW1wMiwgZENvZWZmNSAgICAgIDsvLyBBY2MgLT0gNSooYitlKQotICAgICAgICBWTVVMICAgICAgICBkVGVtcDAsIGRUZW1wMiwgZENvZWZmNSA7Ly8gVGVSaQotICAgICAgICAKLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2YsIGRTcmNCMCwgZFNyY0IxLCAjNSAgIDsvLyBbZjAgZjEgZjIgZjMgLi5dCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmNiLCBkU3JjQjAsIGRTcmNCMSwgIzEgICA7Ly8gW2IwIGIxIGIyIGIzIC4uXQotICAgICAgICBWRVhUICAgICAgICBkU3JjMWMsIGRTcmNCMCwgZFNyY0IxLCAjMgotICAgICAgICBWRVhUICAgICAgICBkU3JjMWQsIGRTcmNCMCwgZFNyY0IxLCAjMwotICAgICAgICBWRVhUICAgICAgICBkU3JjZSwgZFNyY0IwLCBkU3JjQjEsICM0Ci0gICAgICAgIFZBRERMICAgICAgIHFSZXMyMywgZFNyY0IwLCBkU3JjZiAgICAgICA7Ly8gQWNjPWErZgotCi0gICAgICAgIFZTVUIgICAgICAgIGRSZXMwLCBkUmVzMCwgZFRlbXAwICAgIDsvLyBUZVJpCi0KLSAgICAgICAgVkFEREwgICAgICAgcVRlbXAwMSwgZFNyYzFjLCBkU3JjMWQgICAgIDsvLyBjK2QgICAgICAgICAgICAgICAgCi0gICAgICAgIFZBRERMICAgICAgIHFUZW1wMjMsIGRTcmNiLCBkU3JjZSAgICAgICA7Ly8gYitlCi0gICAgICAgIAotICAgICAgICBWTEQxICAgICAgICBxU3JjQzAxLCBbcFNyY10sIHNyY1N0ZXAgICAgOy8vIExvYWQgQyByZWdpc3RlciBbYTAgYTEgYTIgYTMgLi5dICAgICAgICAgICAKLTsgICAgICAgIFZMRDEgICAgICAgIHFTcmNEMDEsIFtwU3JjXSwgc3JjU3RlcCAgICA7Ly8gTG9hZCBEIHJlZ2lzdGVyIFthMCBhMSBhMiBhMyAuLl0gIAotICAgICAgICAKLSAgICAgICAgVk1MQSAgICAgICAgZFJlczIsIGRUZW1wMCwgZENvZWZmMjAgICAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKLTsgICAgICAgIFZNTFMgICAgICAgIGRSZXMyLCBkVGVtcDIsIGRDb2VmZjUgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKLSAgICAgICAgVk1VTCAgICAgICAgZFRlbXAwLCBkVGVtcDIsIGRDb2VmZjUgOy8vIFRlUmkKLQotICAgICAgICBWRVhUICAgICAgICBkU3JjZiwgZFNyY0MwLCBkU3JjQzEsICM1ICAgOy8vIFtmMCBmMSBmMiBmMyAuLl0KLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2IsIGRTcmNDMCwgZFNyY0MxLCAjMSAgIDsvLyBbYjAgYjEgYjIgYjMgLi5dCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmMyYywgZFNyY0MwLCBkU3JjQzEsICMyCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmMyZCwgZFNyY0MwLCBkU3JjQzEsICMzCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmNlLCBkU3JjQzAsIGRTcmNDMSwgIzQKLSAgICAgICAgVkFEREwgICAgICAgcVJlczQ1LCBkU3JjQzAsIGRTcmNmICAgICAgIDsvLyBBY2M9YStmCi0gICAgICAgIAotICAgICAgICBWU1VCICAgICAgICBkUmVzMiwgZFJlczIsIGRUZW1wMCAgOy8vIFRlUmkKLSAgICAgICAgCi0gICAgICAgIFZBRERMICAgICAgIHFUZW1wMDEsIGRTcmMyYywgZFNyYzJkICAgICA7Ly8gYytkICAgICAgICAgICAgICAgIAotICAgICAgICBWQURETCAgICAgICBxVGVtcDIzLCBkU3JjYiwgZFNyY2UgICAgICAgOy8vIGIrZQotCi0gICAgICAgIFZMRDEgICAgICAgIHFTcmNEMDEsIFtwU3JjXSwgc3JjU3RlcCAgICA7Ly8gTG9hZCBEIHJlZ2lzdGVyIFthMCBhMSBhMiBhMyAuLl0gIAotCi0gICAgICAgIFZNTEEgICAgICAgIGRSZXM0LCBkVGVtcDAsIGRDb2VmZjIwICAgICA7Ly8gQWNjICs9IDIwKihjK2QpCi07ICAgICAgICBWTUxTICAgICAgICBkUmVzNCwgZFRlbXAyLCBkQ29lZmY1ICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCi0gICAgICAgIFZNVUwgICAgICAgIGRUZW1wMCwgZFRlbXAyLCBkQ29lZmY1ICAgICAgOy8vIEFjYyAtPSA1KihiK2UpIFRlUmkKLSAgICAgICAgCi0KLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2YsIGRTcmNEMCwgZFNyY0QxLCAjNSAgIDsvLyBbZjAgZjEgZjIgZjMgLi5dCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmNiLCBkU3JjRDAsIGRTcmNEMSwgIzEgICA7Ly8gW2IwIGIxIGIyIGIzIC4uXQotICAgICAgICBWRVhUICAgICAgICBkU3JjM2MsIGRTcmNEMCwgZFNyY0QxLCAjMgotICAgICAgICBWRVhUICAgICAgICBkU3JjM2QsIGRTcmNEMCwgZFNyY0QxLCAjMwotICAgICAgICBWRVhUICAgICAgICBkU3JjZSwgZFNyY0QwLCBkU3JjRDEsICM0Ci0gICAgICAgIFZBRERMICAgICAgIHFSZXM2NywgZFNyY0QwLCBkU3JjZiAgICAgICA7Ly8gQWNjPWErZgotCi0gICAgICAgIFZTVUIgICAgICAgIGRSZXM0LCBkUmVzNCwgZFRlbXAwIDsvLyBUZVJpCi0KLSAgICAgICAgVkFEREwgICAgICAgcVRlbXAwMSwgZFNyYzNjLCBkU3JjM2QgICAgIDsvLyBjK2QgICAgICAgICAgICAgICAgCi0gICAgICAgIFZBRERMICAgICAgIHFUZW1wMjMsIGRTcmNiLCBkU3JjZSAgICAgICA7Ly8gYitlCi0gICAgICAgIFZNTEEgICAgICAgIGRSZXM2LCBkVGVtcDAsIGRDb2VmZjIwICAgICA7Ly8gQWNjICs9IDIwKihjK2QpCi0gICAgICAgIFZNTFMgICAgICAgIGRSZXM2LCBkVGVtcDIsIGRDb2VmZjUgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKLQotICAgICAgICBWUVJTSFJVTiAgICBkQWNjMCwgcVJlczAxLCAjNSAgICAgICAgICAgOy8vIEFjYyA9IFNhdCAoKEFjYyArIDE2KSAvIDMyKQotICAgICAgICBWUVJTSFJVTiAgICBkQWNjMiwgcVJlczIzLCAjNSAgICAgICAgICAgOy8vIEFjYyA9IFNhdCAoKEFjYyArIDE2KSAvIDMyKQotICAgICAgICBWUVJTSFJVTiAgICBkQWNjNCwgcVJlczQ1LCAjNSAgICAgICAgICAgOy8vIEFjYyA9IFNhdCAoKEFjYyArIDE2KSAvIDMyKQotICAgICAgICBWUVJTSFJVTiAgICBkQWNjNiwgcVJlczY3LCAjNSAgICAgICAgICAgOy8vIEFjYyA9IFNhdCAoKEFjYyArIDE2KSAvIDMyKQotICAgICAgICAKLSAgICAgICAgTV9FTkQKLSAgICAKLSAgICBFTkRJRgotCi0KLSAgICBFTkQKLSAgICAKLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQxNGQ0Ny4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlX3MucworKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmVfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgMTIyOTAKLTsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgICAKLSAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAotICAgICAgIAotICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUKLQotICAgIElGIENvcnRleEE4Ci0gICAgICAgIAotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlLCByMTEKLQotOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCi1wU3JjICAgICAgICAgICAgUk4gMAotc3JjU3RlcCAgICAgICAgIFJOIDEKLXBEc3QgICAgICAgICAgICBSTiAyCi1kc3RTdGVwICAgICAgICAgUk4gMwotCi1UZW1wICAgICAgICAgICAgUk4gMTIKLQotOy8vIERlY2xhcmUgTmVvbiByZWdpc3RlcnMKLWRDb2VmZjUgICAgICAgICBETiAzMC5TMTYKLWRDb2VmZjIwICAgICAgICBETiAzMS5TMTYKLQotZFNyYzAgICAgICAgICAgIEROIDcuVTgKLWRTcmMxICAgICAgICAgICBETiA4LlU4Ci1kU3JjMiAgICAgICAgICAgRE4gOS5VOAotZFNyYzMgICAgICAgICAgIEROIDEwLlU4Ci1kU3JjNCAgICAgICAgICAgRE4gMTEuVTgKLWRTcmM1ICAgICAgICAgICBETiAxMi5VOAotZFNyYzYgICAgICAgICAgIEROIDEzLlU4Ci1kU3JjNyAgICAgICAgICAgRE4gMTQuVTgKLWRTcmM4ICAgICAgICAgICBETiAxNS5VOAotCi1xU3VtQkUwMSAgICAgICAgUU4gOC5TMTYKLXFTdW1DRDAxICAgICAgICBRTiA5LlMxNgotZFN1bUJFMCAgICAgICAgIEROIDE2LlMxNgotZFN1bUNEMCAgICAgICAgIEROIDE4LlMxNgotCi1xQWNjMDEgICAgICAgICAgUU4gMC5TMTYKLXFBY2MyMyAgICAgICAgICBRTiAxLlMxNgotcUFjYzQ1ICAgICAgICAgIFFOIDIuUzE2Ci1xQWNjNjcgICAgICAgICAgUU4gMy5TMTYKLQotZFJlczAgICAgICAgICAgIEROIDAuUzE2Ci1kUmVzMSAgICAgICAgICAgRE4gMi5TMTYKLWRSZXMyICAgICAgICAgICBETiA0LlMxNgotZFJlczMgICAgICAgICAgIEROIDYuUzE2Ci0KLWRBY2MwICAgICAgICAgICBETiAwLlU4Ci1kQWNjMSAgICAgICAgICAgRE4gMi5VOAotZEFjYzIgICAgICAgICAgIEROIDQuVTgKLWRBY2MzICAgICAgICAgICBETiA2LlU4ICAgICAgICAKLSAgICAgICAgCi0KLWRUbXAwICAgICAgICAgICBETiAyMC5TMTYKLWRUbXAxICAgICAgICAgICBETiAyMS5TMTYKLWRUbXAyICAgICAgICAgICBETiAyMi5TMTYKLWRUbXAzICAgICAgICAgICBETiAyMy5TMTYKLQotCi0gICAgICAgIFZMRDEgICAgICAgIGRTcmMwLCBbcFNyY10sIHNyY1N0ZXAgICAgIDsvLyBbYTAgYTEgYTIgYTMgLi4gXSAKLSAgICAgICAgQUREICAgICAgICAgVGVtcCwgcFNyYywgc3JjU3RlcCwgTFNMICMyCi0gICAgICAgIFZMRDEgICAgICAgIGRTcmMxLCBbcFNyY10sIHNyY1N0ZXAgICAgIDsvLyBbYjAgYjEgYjIgYjMgLi4gXQotICAgICAgICA7Ly8gT25lIGN5Y2xlIHN0YWxsCi0gICAgICAgIFZMRDEgICAgICAgIGRTcmM1LCBbVGVtcF0sIHNyY1N0ZXAgICAgICAgIAotICAgICAgICA7Ly8gT25lIGN5Y2xlIHN0YWxsCi0gICAgICAgIFZMRDEgICAgICAgIGRTcmMyLCBbcFNyY10sIHNyY1N0ZXAgICAgIDsvLyBbYzAgYzEgYzIgYzMgLi4gXQotICAgICAgICBWQURETCAgICAgICBxQWNjMDEsIGRTcmMwLCBkU3JjNSAgICAgICA7Ly8gQWNjID0gYStmCi0gICAgICAgIFZMRDEgICAgICAgIGRTcmMzLCBbcFNyY10sIHNyY1N0ZXAKLSAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAotICAgICAgICBWTEQxICAgICAgICBkU3JjNiwgW1RlbXBdLCBzcmNTdGVwIDsvLyBUZVJpCi0gICAgICAgIAotICAgICAgICBWTEQxICAgICAgICBkU3JjNCwgW3BTcmNdLCBzcmNTdGVwCi0gICAgICAgIFZMRDEgICAgICAgIGRTcmM3LCBbVGVtcF0sIHNyY1N0ZXAgOy8vIFRlUmkKLSAgICAgICAgVkFEREwgICAgICAgcVN1bUJFMDEsIGRTcmMxLCBkU3JjNCAgICAgOy8vIGIrZQotICAgICAgICBWQURETCAgICAgICBxU3VtQ0QwMSwgZFNyYzIsIGRTcmMzICAgICA7Ly8gYytkICAgICAgICAKLSAgICAgICAgVkxEMSAgICAgICAgZFNyYzgsIFtUZW1wXSwgc3JjU3RlcCA7Ly8gVGVSaQotICAgICAgICBWTUxTICAgICAgICBkUmVzMCwgZFN1bUJFMCwgZENvZWZmNSAgICA7Ly8gQWNjIC09IDIwKihiK2UpICAgICAgICAKLTsgICAgICAgIFZNTEEgICAgICAgIGRSZXMwLCBkU3VtQ0QwLCBkQ29lZmYyMCAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKLSAgICAgICAgVk1VTCAgICAgICAgZFRtcDAsIGRTdW1DRDAsIGRDb2VmZjIwICAgOy8vIEFjYyArPSAyMCooYytkKQotICAgICAgICAKLTsgICAgICAgIFZMRDEgICAgICAgIGRTcmM2LCBbVGVtcF0sIHNyY1N0ZXAKLSAgICAgICAgVkFEREwgICAgICAgcVN1bUJFMDEsIGRTcmMyLCBkU3JjNSAgICAgOy8vIGIrZQotICAgICAgICBWQURETCAgICAgICBxU3VtQ0QwMSwgZFNyYzMsIGRTcmM0ICAgICA7Ly8gYytkCi0gICAgICAgIFZBRERMICAgICAgIHFBY2MyMywgZFNyYzEsIGRTcmM2ICAgICAgIDsvLyBBY2MgPSBhK2YKLSAgICAgICAgVk1MUyAgICAgICAgZFJlczEsIGRTdW1CRTAsIGRDb2VmZjUgICAgOy8vIEFjYyAtPSAyMCooYitlKQotOyAgICAgICAgVk1MQSAgICAgICAgZFJlczEsIGRTdW1DRDAsIGRDb2VmZjIwICAgOy8vIEFjYyArPSAyMCooYytkKQotICAgICAgICBWTVVMICAgICAgICBkVG1wMSwgZFN1bUNEMCwgZENvZWZmMjAgICA7Ly8gQWNjICs9IDIwKihjK2QpCi0KLTsgICAgICAgIFZMRDEgICAgICAgIGRTcmM3LCBbVGVtcF0sIHNyY1N0ZXAKLSAgICAgICAgVkFEREwgICAgICAgcVN1bUJFMDEsIGRTcmMzLCBkU3JjNiAgICAgOy8vIGIrZQotICAgICAgICBWQURETCAgICAgICBxU3VtQ0QwMSwgZFNyYzQsIGRTcmM1ICAgICA7Ly8gYytkCi0gICAgICAgIFZBRERMICAgICAgIHFBY2M0NSwgZFNyYzIsIGRTcmM3ICAgICAgIDsvLyBBY2MgPSBhK2YKLSAgICAgICAgVk1MUyAgICAgICAgZFJlczIsIGRTdW1CRTAsIGRDb2VmZjUgICAgOy8vIEFjYyAtPSAyMCooYitlKSAgICAgICAgCi07ICAgICAgICBWTUxBICAgICAgICBkUmVzMiwgZFN1bUNEMCwgZENvZWZmMjAgICA7Ly8gQWNjICs9IDIwKihjK2QpCi0gICAgICAgIFZNVUwgICAgICAgIGRUbXAyLCBkU3VtQ0QwLCBkQ29lZmYyMCAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKLQotOyAgICAgICAgVkxEMSAgICAgICAgZFNyYzgsIFtUZW1wXSwgc3JjU3RlcCAgICAgOy8vIFtpMCBpMSBpMiBpMyAuLiBdICAgICAgICAKLSAgICAgICAgVkFEREwgICAgICAgcVN1bUJFMDEsIGRTcmM0LCBkU3JjNyAgICAgOy8vIGIrZQotICAgICAgICBWQURETCAgICAgICBxQWNjNjcsIGRTcmMzLCBkU3JjOCAgICAgICA7Ly8gQWNjID0gYStmCi0gICAgICAgIFZBRERMICAgICAgIHFTdW1DRDAxLCBkU3JjNSwgZFNyYzYgICAgIDsvLyBjK2QKLSAgICAgICAgVk1MUyAgICAgICAgZFJlczMsIGRTdW1CRTAsIGRDb2VmZjUgICAgOy8vIEFjYyAtPSAyMCooYitlKSAgICAgICAgCi0gICAgICAgIFZBREQgICAgICAgIGRSZXMwLCBkUmVzMCwgZFRtcDAKLSAgICAgICAgVkFERCAgICAgICAgZFJlczEsIGRSZXMxLCBkVG1wMQotICAgICAgICBWQUREICAgICAgICBkUmVzMiwgZFJlczIsIGRUbXAyCi0gICAgICAgIFZNTEEgICAgICAgIGRSZXMzLCBkU3VtQ0QwLCBkQ29lZmYyMCAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKLTsgICAgICAgIFZNVUwgICAgICAgIGRUbXAzLCBkU3VtQ0QwLCBkQ29lZmYyMCAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKLTsgICAgICAgIFZBREQgICAgICAgIGRSZXMzLCBkUmVzMywgZFRtcDMKLQotICAgICAgICBWUVJTSFJVTiAgICBkQWNjMCwgcUFjYzAxLCAjNSAgICAgICAgCi0gICAgICAgIFZRUlNIUlVOICAgIGRBY2MxLCBxQWNjMjMsICM1ICAgICAgICAKLSAgICAgICAgVlFSU0hSVU4gICAgZEFjYzIsIHFBY2M0NSwgIzUgICAgICAgIAotICAgICAgICBWUVJTSFJVTiAgICBkQWNjMywgcUFjYzY3LCAjNSAgICAgICAgCi0KLSAgICAgICAgTV9FTkQKLSAgICAKLSAgICBFTkRJRgotCi0gICAgCi0gICAgCi0gICAgRU5ECi0gICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWFfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmI5NTY1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWFfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMzMyICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYV9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICA5NjQxCi07Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgICAKLSAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAotICAgICAgICAKLQotICAgIElGIENvcnRleEE4Ci0KLSAgICBNX1RBQkxFIGFybVZDTTRQMTBfV2lkdGhCcmFuY2hUYWJsZU1WSXNOb3RaZXJvICAgICAgCi0gICAgCi0gICAgRENEICAgV2lkdGhJczJNVklzTm90WmVybywgV2lkdGhJczJNVklzTm90WmVybwotICAgIERDRCAgIFdpZHRoSXM0TVZJc05vdFplcm8sIFdpZHRoSXM0TVZJc05vdFplcm8KLSAgICBEQ0QgICBXaWR0aElzOE1WSXNOb3RaZXJvCi0gICAgCi0gICAgTV9UQUJMRSBhcm1WQ000UDEwX1dpZHRoQnJhbmNoVGFibGVNVklzWmVybyAgICAgIAotICAgIAotICAgIERDRCAgIFdpZHRoSXMyTVZJc1plcm8sIFdpZHRoSXMyTVZJc1plcm8KLSAgICBEQ0QgICBXaWR0aElzNE1WSXNaZXJvLCBXaWR0aElzNE1WSXNaZXJvCi0gICAgRENEICAgV2lkdGhJczhNVklzWmVybwotICAgIAotICAgIAotOy8vIGlucHV0IHJlZ2lzdGVycwotCi1wU3JjICAgICAgICAgICAgICAgICBSTiAwCi1pU3JjU3RlcCAgICAgICAgICAgICBSTiAxCi1wRHN0ICAgICAgICAgICAgICAgICBSTiAyCi1pRHN0U3RlcCAgICAgICAgICAgICBSTiAzCi1pV2lkdGggICAgICAgICAgICAgICBSTiA0Ci1pSGVpZ2h0ICAgICAgICAgICAgICBSTiA1Ci1keCAgICAgICAgICAgICAgICAgICBSTiA2Ci1keSAgICAgICAgICAgICAgICAgICBSTiA3Ci0KLTsvLyBsb2NhbCB2YXJpYWJsZSByZWdpc3RlcnMKLXBjICAgICAgICAgICAgICAgICAgIFJOIDE1Ci1yZXR1cm4gICAgICAgICAgICAgICBSTiAwCi1FaWdodE1pbnVzZHggICAgICAgICBSTiA4IAotRWlnaHRNaW51c2R5ICAgICAgICAgUk4gOQotCi1BQ29lZmYgICAgICAgICAgICAgICBSTiAxMgotQkNvZWZmICAgICAgICAgICAgICAgUk4gOQotQ0NvZWZmICAgICAgICAgICAgICAgUk4gOAotRENvZWZmICAgICAgICAgICAgICAgUk4gNgotCi1wVGFibGUgICAgICAgICAgICAgICBSTiAxMQotCi1TdGVwMSAgICAgICAgICAgICAgICBSTiAxMAotU3JjU3RlcE1pbnVzMSAgICAgICAgUk4gMTQKLQotZEFDb2VmZiAgICAgICAgICAgICAgRE4gRDEyLlU4Ci1kQkNvZWZmICAgICAgICAgICAgICBETiBEMTMuVTgKLWRDQ29lZmYgICAgICAgICAgICAgIEROIEQxNC5VOAotZERDb2VmZiAgICAgICAgICAgICAgRE4gRDE1LlU4Ci0KLWRSb3cwYSAgICAgICAgICAgICAgIEROIEQwLlU4Ci1kUm93MGIgICAgICAgICAgICAgICBETiBEMS5VOAotZFJvdzFhICAgICAgICAgICAgICAgRE4gRDIuVTgKLWRSb3cxYiAgICAgICAgICAgICAgIEROIEQzLlU4Ci0KLXFSb3cwYSAgICAgICAgICAgICAgIFFOIFEyLlMxNgotcVJvdzBiICAgICAgICAgICAgICAgUU4gUTMuUzE2Ci0KLTsvL2RJbmRleCAgICAgICAgICAgICAgIEROICAgIEQxNi5VOCAgICAgICAgICAgICAgICAgCi1xUm93MWEgICAgICAgICAgICAgICBRTiBRMTEuUzE2Ci1xUm93MWIgICAgICAgICAgICAgICBRTiBRMTIuUzE2Ci0KLWRSb3cyYSAgICAgICAgICAgICAgIEROIEQxNi5VOAotZFJvdzJiICAgICAgICAgICAgICAgRE4gRDE3LlU4Ci1kUm93M2EgICAgICAgICAgICAgICBETiBEMTguVTgKLWRSb3czYiAgICAgICAgICAgICAgIEROIEQxOS5VOAotCi1xT3V0Um93MiAgICAgICAgICAgICBRTiBRMTEuVTE2Ci1xT3V0Um93MyAgICAgICAgICAgICBRTiBRMTIuVTE2Ci1kT3V0Um93MiAgICAgICAgICAgICBETiBEMjAuVTgKLWRPdXRSb3czICAgICAgICAgICAgIEROIEQyMS5VOAotZE91dFJvdzJVNjQgICAgICAgICAgRE4gRDIwLlU2NAotZE91dFJvdzNVNjQgICAgICAgICAgRE4gRDIxLlU2NAotCi1xT3V0Um93MCAgICAgICAgICAgICBRTiBRMi5VMTYKLXFPdXRSb3cxICAgICAgICAgICAgIFFOIFEzLlUxNgotZE91dFJvdzAgICAgICAgICAgICAgRE4gRDguVTgKLWRPdXRSb3cxICAgICAgICAgICAgIEROIEQ5LlU4Ci0KLWRPdXRSb3cwVTY0ICAgICAgICAgIEROIEQ4LlU2NAotZE91dFJvdzFVNjQgICAgICAgICAgRE4gRDkuVTY0Ci0KLWRPdXRSb3cwVTMyICAgICAgICAgIEROIEQ4LlUzMgotZE91dFJvdzFVMzIgICAgICAgICAgRE4gRDkuVTMyCi0KLWRPdXRSb3cwVTE2ICAgICAgICAgIEROIEQ4LlUxNgotZE91dFJvdzFVMTYgICAgICAgICAgRE4gRDkuVTE2Ci0KLQotZE91dDBVNjQgICAgICAgICAgICAgRE4gRDAuVTY0Ci1kT3V0MVU2NCAgICAgICAgICAgICBETiBEMS5VNjQKLQotZE91dDAwVTMyICAgICAgICAgICAgRE4gRDAuVTMyCi1kT3V0MDFVMzIgICAgICAgICAgICBETiBEMS5VMzIKLWRPdXQxMFUzMiAgICAgICAgICAgIEROIEQyLlUzMgotZE91dDExVTMyICAgICAgICAgICAgRE4gRDMuVTMyCi0KLWRPdXQwVTE2ICAgICAgICAgICAgIEROIEQwLlUxNgotZE91dDFVMTYgICAgICAgICAgICAgRE4gRDEuVTE2Ci0KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWFfYXNtIHN0YXJ0cwotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgCi0gICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYSwgcjExLCBkMTUKLSAgICAgICAgCi0gICAgICAgIDsvLyBEZWZpbmUgc3RhY2sgYXJndW1lbnRzCi0gICAgICAgIE1fQVJHICAgV2lkdGgsICAgICAgNAotICAgICAgICBNX0FSRyAgIEhlaWdodCwgICAgIDQKLSAgICAgICAgTV9BUkcgICBEeCwgICAgICAgICA0Ci0gICAgICAgIE1fQVJHICAgRHksICAgICAgICAgNAotICAgICAgICAKLSAgICAgICAgOy8vIExvYWQgYXJndW1lbnQgZnJvbSB0aGUgc3RhY2sKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTQKLSAgICAgICAgCi0gICAgICAgIE1fTERSRCAgIGR4LCBkeSwgRHgKLSAgICAgICAgTV9MRFJEICAgaVdpZHRoLCBpSGVpZ2h0LCBXaWR0aAotICAgICAgICAKLSAgICAgICAgOy8vIEVpZ2h0TWludXNkeCA9IDggLSBkeAotICAgICAgICA7Ly8gRWlnaHRNaW51c2R5ID0gOCAtIGR5Ci0gICAgICAgIAotICAgICAgICA7Ly8gQUNvZWZmID0gRWlnaHRNaW51c2R4ICogRWlnaHRNaW51c2R5Ci0gICAgICAgIDsvLyBCQ29lZmYgPSBkeCAqIEVpZ2h0TWludXNkeQotICAgICAgICA7Ly8gQ0NvZWZmID0gRWlnaHRNaW51c2R4ICogZHkKLSAgICAgICAgOy8vIERDb2VmZiA9IGR4ICogZHkKLSAgICAgICAgCi0gICAgICAgIFJTQiAgICAgRWlnaHRNaW51c2R4LCBkeCwgIzggCi0gICAgICAgIFJTQiAgICAgRWlnaHRNaW51c2R5LCBkeSwgIzgKLSAgICAgICAgQ01OICAgICBkeCxkeQotICAgICAgICBNT1YgICAgIFN0ZXAxLCAjMQotICAgICAgICBMRFJFUSAgIHBUYWJsZSwgPWFybVZDTTRQMTBfV2lkdGhCcmFuY2hUYWJsZU1WSXNaZXJvCi0gICAgICAgIFNVQiAgICAgU3JjU3RlcE1pbnVzMSwgaVNyY1N0ZXAsIFN0ZXAxCi0gICAgICAgIExEUk5FICAgcFRhYmxlLCA9YXJtVkNNNFAxMF9XaWR0aEJyYW5jaFRhYmxlTVZJc05vdFplcm8KLSAgICAgICAgCi0gICAgICAgIFZMRDEgICAgZFJvdzBhLCBbcFNyY10sIFN0ZXAxICAgICAgICAgICAgICAgICAgIDsvLyAwYQotICAgICAgICAKLSAgICAgICAgU01VTEJCICBBQ29lZmYsIEVpZ2h0TWludXNkeCwgRWlnaHRNaW51c2R5Ci0gICAgICAgIFNNVUxCQiAgQkNvZWZmLCBkeCwgRWlnaHRNaW51c2R5Ci0gICAgICAgIFZMRDEgICAgZFJvdzBiLCBbcFNyY10sIFNyY1N0ZXBNaW51czEgICAgICAgICAgIDsvLyAwYgotICAgICAgICBTTVVMQkIgIENDb2VmZiwgRWlnaHRNaW51c2R4LCBkeQotICAgICAgICBTTVVMQkIgIERDb2VmZiwgZHgsIGR5Ci0gICAgICAgIAotICAgICAgICBWRFVQICAgIGRBQ29lZmYsIEFDb2VmZgotICAgICAgICBWRFVQICAgIGRCQ29lZmYsIEJDb2VmZgotICAgICAgICBWRFVQICAgIGRDQ29lZmYsIENDb2VmZgotICAgICAgICBWRFVQICAgIGREQ29lZmYsIERDb2VmZgotICAgICAgICAKLSAgICAgICAgTERSICAgICBwYywgW3BUYWJsZSwgaVdpZHRoLCBMU0wgIzFdICAgICAgOy8vIEJyYW5jaCB0byB0aGUgY2FzZSBiYXNlZCBvbiBpV2lkdGgKLSAgICAgICAgCi07Ly8gUGl4ZWwgbGF5b3V0OgotOy8vCi07Ly8gICB4MDAgeDAxIHgwMgotOy8vICAgeDEwIHgxMSB4MTIKLTsvLyAgIHgyMCB4MjEgeDIyCi0KLTsvLyBJZiBmcmFjdGlvbmwgbXYgaXMgbm90ICgwLCAwKQotV2lkdGhJczhNVklzTm90WmVybwotCi0gICAgICAgICAgICAgICAgVkxEMSAgIGRSb3cxYSwgW3BTcmNdLCBTdGVwMSAgICAgICAgICAgIDsvLyAxYQotICAgICAgICAgICAgICAgIFZNVUxMICBxUm93MGEsIGRSb3cwYSwgZEFDb2VmZgotICAgICAgICAgICAgICAgIFZMRDEgICBkUm93MWIsIFtwU3JjXSwgU3JjU3RlcE1pbnVzMSAgICA7Ly8gMWIKLSAgICAgICAgICAgICAgICBWTVVMTCAgcVJvdzBiLCBkUm93MWEsIGRBQ29lZmYKLSAgICAgICAgICAgICAgICBWTEQxICAgZFJvdzJhLCBbcFNyY10sIFN0ZXAxICAgICAgICAgICAgOy8vIDJhCi0gICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cwYSwgZFJvdzBiLCBkQkNvZWZmCi0gICAgICAgICAgICAgICAgVkxEMSAgIGRSb3cyYiwgW3BTcmNdLCBTcmNTdGVwTWludXMxICAgIDsvLyAyYgotICAgICAgICAgICAgICAgIFZNVUxMICBxUm93MWEsIGRSb3cyYSwgZEFDb2VmZgotICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MGIsIGRSb3cxYiwgZEJDb2VmZgotICAgICAgICAgICAgICAgIFZMRDEgICBkUm93M2EsIFtwU3JjXSwgU3RlcDEgICAgICAgICAgICA7Ly8gM2EKLSAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzBhLCBkUm93MWEsIGRDQ29lZmYKLSAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzFhLCBkUm93MmIsIGRCQ29lZmYKLSAgICAgICAgICAgICAgICBWTVVMTCAgcVJvdzFiLCBkUm93M2EsIGRBQ29lZmYKLSAgICAgICAgICAgICAgICBWTEQxICAgZFJvdzNiLCBbcFNyY10sIFNyY1N0ZXBNaW51czEgICAgOy8vIDNiCi0gICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cwYiwgZFJvdzJhLCBkQ0NvZWZmCi0gICAgICAgICAgICAgICAgVkxEMSAgIGRSb3cwYSwgW3BTcmNdLCBTdGVwMSAgICAgICAgICAgIDsvLyAwYQotICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MWIsIGRSb3czYiwgZEJDb2VmZgotICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MWEsIGRSb3czYSwgZENDb2VmZgotICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MGEsIGRSb3cxYiwgZERDb2VmZgotICAgICAgICAgICAgICAgIFZMRDEgICBkUm93MGIsIFtwU3JjXSwgU3JjU3RlcE1pbnVzMSAgICA7Ly8gMGIKLSAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzFiLCBkUm93MGEsIGRDQ29lZmYKLSAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzBiLCBkUm93MmIsIGREQ29lZmYKLSAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzFhLCBkUm93M2IsIGREQ29lZmYKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBTVUJTICAgaUhlaWdodCwgaUhlaWdodCwgIzQKLSAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzFiLCBkUm93MGIsIGREQ29lZmYKLQotICAgICAgICAgICAgICAgIFZRUlNIUk4gZE91dFJvdzAsIHFPdXRSb3cwLCAjNgotICAgICAgICAgICAgICAgIFZRUlNIUk4gZE91dFJvdzEsIHFPdXRSb3cxLCAjNgotICAgICAgICAgICAgICAgIFZRUlNIUk4gZE91dFJvdzIsIHFPdXRSb3cyLCAjNgotICAgICAgICAgICAgICAgIFZTVDEgICBkT3V0Um93MFU2NCwgW3BEc3RdLCBpRHN0U3RlcAotICAgICAgICAgICAgICAgIFZRUlNIUk4gZE91dFJvdzMsIHFPdXRSb3czLCAjNgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFZTVDEgICBkT3V0Um93MVU2NCwgW3BEc3RdLCBpRHN0U3RlcCAgCi0gICAgICAgICAgICAgICAgVlNUMSAgIGRPdXRSb3cyVTY0LCBbcERzdF0sIGlEc3RTdGVwCi0gICAgICAgICAgICAgICAgVlNUMSAgIGRPdXRSb3czVTY0LCBbcERzdF0sIGlEc3RTdGVwICAKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIEJHVCAgICAgV2lkdGhJczhNVklzTm90WmVybwotICAgICAgICAgICAgICAgIE1PViAgICAgcmV0dXJuLCAgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgICAgICAgICBNX0VYSVQKLQotV2lkdGhJczRNVklzTm90WmVybwotCi0gICAgICAgICAgICAgICAgVkxEMSAgIGRSb3cxYSwgW3BTcmNdLCBTdGVwMQotICAgICAgICAgICAgICAgIFZNVUxMICBxUm93MGEsIGRSb3cwYSwgZEFDb2VmZgotICAgICAgICAgICAgICAgIFZNVUxMICBxUm93MGIsIGRSb3cxYSwgZEFDb2VmZgotICAgICAgICAgICAgICAgIFZMRDEgICBkUm93MWIsIFtwU3JjXSwgU3JjU3RlcE1pbnVzMQotICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MGEsIGRSb3cwYiwgZEJDb2VmZgotICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MGIsIGRSb3cxYiwgZEJDb2VmZgotICAgICAgICAgICAgICAgIFZMRDEgICBkUm93MGEsIFtwU3JjXSwgU3RlcDEKLSAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzBhLCBkUm93MWEsIGRDQ29lZmYKLSAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzBiLCBkUm93MGEsIGRDQ29lZmYKLSAgICAgICAgICAgICAgICBWTEQxICAgZFJvdzBiLCBbcFNyY10sIFNyY1N0ZXBNaW51czEKLSAgICAgICAgICAgICAgICBTVUJTICAgaUhlaWdodCwgaUhlaWdodCwgIzIKLSAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzBiLCBkUm93MGIsIGREQ29lZmYKLSAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzBhLCBkUm93MWIsIGREQ29lZmYKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBWUVJTSFJOIGRPdXRSb3cxLCBxT3V0Um93MSwgIzYKLSAgICAgICAgICAgICAgICBWUVJTSFJOIGRPdXRSb3cwLCBxT3V0Um93MCwgIzYKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBWU1QxICAgZE91dFJvdzBVMzJbMF0sIFtwRHN0XSwgaURzdFN0ZXAKLSAgICAgICAgICAgICAgICBWU1QxICAgZE91dFJvdzFVMzJbMF0sIFtwRHN0XSwgaURzdFN0ZXAgIAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIEJHVCAgICAgV2lkdGhJczRNVklzTm90WmVybwotICAgICAgICAgICAgICAgIE1PViAgICAgcmV0dXJuLCAgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgICAgICAgICBNX0VYSVQKLQotV2lkdGhJczJNVklzTm90WmVybwotCi0gICAgICAgICAgICAgICAgVkxEMSAgIGRSb3cxYSwgW3BTcmNdLCBTdGVwMQotICAgICAgICAgICAgICAgIFZNVUxMICBxUm93MGEsIGRSb3cwYSwgZEFDb2VmZgotICAgICAgICAgICAgICAgIFZNVUxMICBxUm93MGIsIGRSb3cxYSwgZEFDb2VmZgotICAgICAgICAgICAgICAgIFZMRDEgICBkUm93MWIsIFtwU3JjXSwgU3JjU3RlcE1pbnVzMQotICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MGEsIGRSb3cwYiwgZEJDb2VmZgotICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MGIsIGRSb3cxYiwgZEJDb2VmZgotICAgICAgICAgICAgICAgIFZMRDEgICBkUm93MGEsIFtwU3JjXSwgU3RlcDEKLSAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzBhLCBkUm93MWEsIGRDQ29lZmYKLSAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzBiLCBkUm93MGEsIGRDQ29lZmYKLSAgICAgICAgICAgICAgICBWTEQxICAgZFJvdzBiLCBbcFNyY10sIFNyY1N0ZXBNaW51czEKLSAgICAgICAgICAgICAgICBTVUJTICAgaUhlaWdodCwgaUhlaWdodCwgIzIKLSAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzBiLCBkUm93MGIsIGREQ29lZmYKLSAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzBhLCBkUm93MWIsIGREQ29lZmYKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBWUVJTSFJOIGRPdXRSb3cxLCBxT3V0Um93MSwgIzYKLSAgICAgICAgICAgICAgICBWUVJTSFJOIGRPdXRSb3cwLCBxT3V0Um93MCwgIzYKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBWU1QxICAgZE91dFJvdzBVMTZbMF0sIFtwRHN0XSwgaURzdFN0ZXAKLSAgICAgICAgICAgICAgICBWU1QxICAgZE91dFJvdzFVMTZbMF0sIFtwRHN0XSwgaURzdFN0ZXAgIAotCi0gICAgICAgICAgICAgICAgQkdUICAgICBXaWR0aElzMk1WSXNOb3RaZXJvIAotICAgICAgICAgICAgICAgIE1PViAgICAgcmV0dXJuLCAgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgICAgICAgICBNX0VYSVQgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi07Ly8gSWYgZnJhY3Rpb25sIG12IGlzICgwLCAwKQotV2lkdGhJczhNVklzWmVybwotICAgICAgICAgICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgaVNyY1N0ZXAKLQotV2lkdGhJczhMb29wTVZJc1plcm8KLSAgICAgICAgICAgICAgICBWTEQxICAgIGRSb3cwYSwgW3BTcmNdLCBpU3JjU3RlcAotICAgICAgICAgICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzIKLSAgICAgICAgICAgICAgICBWTEQxICAgIGRSb3cwYiwgW3BTcmNdLCBpU3JjU3RlcAotICAgICAgICAgICAgICAgIFZTVDEgICAgZE91dDBVNjQsIFtwRHN0XSwgaURzdFN0ZXAKLSAgICAgICAgICAgICAgICBWU1QxICAgIGRPdXQxVTY0LCBbcERzdF0sIGlEc3RTdGVwCi0gICAgICAgICAgICAgICAgQkdUICAgICBXaWR0aElzOExvb3BNVklzWmVybwotCi0gICAgICAgICAgICAgICAgTU9WICAgICByZXR1cm4sICAjT01YX1N0c19Ob0VycgotICAgICAgICAgICAgICAgIE1fRVhJVAotCi1XaWR0aElzNE1WSXNaZXJvICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFZMRDEgICAgZFJvdzBiLCBbcFNyY10sIGlTcmNTdGVwCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgU1VCUyAgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjMgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFZTVDEgICAgZE91dDAwVTMyWzBdLCBbcERzdF0sIGlEc3RTdGVwCi0gICAgICAgICAgICAgICAgVkxEMSAgICBkUm93MGEsIFtwU3JjXSwgaVNyY1N0ZXAKLSAgICAgICAgICAgICAgICBWU1QxICAgIGRPdXQwMVUzMlswXSwgW3BEc3RdLCBpRHN0U3RlcAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIEJHVCAgICAgV2lkdGhJczRNVklzWmVybyAKLSAgICAgICAgICAgICAgICBNT1YgICAgIHJldHVybiwgICNPTVhfU3RzX05vRXJyCi0gICAgICAgICAgICAgICAgTV9FWElUCi0gICAgICAgICAgICAgICAgCi1XaWR0aElzMk1WSXNaZXJvICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFZMRDEgICAgZFJvdzBiLCBbcFNyY10sIGlTcmNTdGVwCi0gICAgICAgICAgICAgICAgU1VCUyAgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjMgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFZTVDEgICAgZE91dDBVMTZbMF0sIFtwRHN0XSwgaURzdFN0ZXAKLSAgICAgICAgICAgICAgICBWTEQxICAgIGRSb3cwYSwgW3BTcmNdLCBpU3JjU3RlcAotICAgICAgICAgICAgICAgIFZTVDEgICAgZE91dDFVMTZbMF0sIFtwRHN0XSwgaURzdFN0ZXAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBCR1QgICAgIFdpZHRoSXMyTVZJc1plcm8gCi0gICAgICAgICAgICAgICAgTU9WICAgICByZXR1cm4sICAjT01YX1N0c19Ob0VyciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgTV9FTkQKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIEVORElGIDsvLyBDb3J0ZXhBOAotICAgICAgICAKLSAgICAgICAgRU5ECi0KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWFfYXNtIGVuZHMKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9RdWFudFRhYmxlc19zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfUXVhbnRUYWJsZXNfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2QzM2E0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9RdWFudFRhYmxlc19zLnMKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9RdWFudFRhYmxlc19zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICAxMjI5MAotOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vIERlc2NyaXB0aW9uOgotOy8vIFRoaXMgZmlsZSBjb250YWlucyBxdWFudGl6YXRpb24gdGFibGVzCi07Ly8gCi07Ly8gCi0KLSAgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgIAotICAgICAgICAgCi0gICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9NRk1hdHJpeFFQTW9kVGFibGUKLSAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX1FQRGl2SW50cmFUYWJsZQotICAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfUVBEaXZQbHVzT25lVGFibGUgIAotICAgICAgICAgCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIFRoaXMgdGFibGUgY29udGFpbnMgYXJtVkNNNFAxMF9NRk1hdHJpeCBbaVFQICUgNl1bMF0gZW50aXJlcywKLTsvLyBmb3IgdmFsdWVzIG9mIGlRUCBmcm9tIDAgdG8gNTEgKGluY2x1c2l2ZSkuIAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAgTV9UQUJMRSBhcm1WQ000UDEwX01GTWF0cml4UVBNb2RUYWJsZQotICAgICAgICAgRENXIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKLSAgICAgICAgIERDVyAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCi0gICAgICAgICBEQ1cgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgotICAgICAgICAgRENXIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKLSAgICAgICAgIERDVyAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCi0gICAgICAgICBEQ1cgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgotICAgICAgICAgRENXIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKLSAgICAgICAgIERDVyAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCi0gICAgICAgICBEQ1cgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgotICAgICAgICAgCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBUaGlzIHRhYmxlIGNvbnRhaW5zIEFSTV9NNFAxMF9RX09GRlNFVCArIDEgKyAoaVFQIC8gNikgdmFsdWVzLAotOy8vIGZvciB2YWx1ZXMgb2YgaVFQIGZyb20gMCB0byA1MSAoaW5jbHVzaXZlKS4gCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAgTV9UQUJMRSBhcm1WQ000UDEwX1FQRGl2UGx1c09uZVRhYmxlCi0gICAgICAgICBEQ0IgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNgotICAgICAgICAgRENCIDE3LCAxNywgMTcsIDE3LCAxNywgMTcKLSAgICAgICAgIERDQiAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4Ci0gICAgICAgICBEQ0IgMTksIDE5LCAxOSwgMTksIDE5LCAxOQotICAgICAgICAgRENCIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAKLSAgICAgICAgIERDQiAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxCi0gICAgICAgICBEQ0IgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMgotICAgICAgICAgRENCIDIzLCAyMywgMjMsIDIzLCAyMywgMjMKLSAgICAgICAgIERDQiAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0Ci0KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIFRoaXMgdGFibGUgY29udGFpbnMgKDEgPDwgUWJpdHNQbHVzT25lKSAvIDMgVmFsdWVzIChJbnRyYSBjYXNlKSAsCi07Ly8gZm9yIHZhbHVlcyBvZiBpUVAgZnJvbSAwIHRvIDUxIChpbmNsdXNpdmUpLiAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIAotICAgICAgICAgTV9UQUJMRSBhcm1WQ000UDEwX1FQRGl2SW50cmFUYWJsZSwgMgotICAgICAgICAgRENEIDIxODQ1LCAyMTg0NSwgMjE4NDUsIDIxODQ1LCAyMTg0NSwgMjE4NDUKLSAgICAgICAgIERDRCA0MzY5MCwgNDM2OTAsIDQzNjkwLCA0MzY5MCwgNDM2OTAsIDQzNjkwCi0gICAgICAgICBEQ0QgODczODEsIDg3MzgxLCA4NzM4MSwgODczODEsIDg3MzgxLCA4NzM4MQotICAgICAgICAgRENEIDE3NDc2MiwgMTc0NzYyLCAxNzQ3NjIsIDE3NDc2MiwgMTc0NzYyLCAxNzQ3NjIKLSAgICAgICAgIERDRCAzNDk1MjUsIDM0OTUyNSwgMzQ5NTI1LCAzNDk1MjUsIDM0OTUyNSwgMzQ5NTI1Ci0gICAgICAgICBEQ0QgNjk5MDUwLCA2OTkwNTAsIDY5OTA1MCwgNjk5MDUwLCA2OTkwNTAsIDY5OTA1MAotICAgICAgICAgRENEIDEzOTgxMDEsIDEzOTgxMDEsIDEzOTgxMDEsIDEzOTgxMDEsIDEzOTgxMDEsIDEzOTgxMDEKLSAgICAgICAgIERDRCAyNzk2MjAyLCAyNzk2MjAyLCAyNzk2MjAyLCAyNzk2MjAyLCAyNzk2MjAyLCAyNzk2MjAyCi0gICAgICAgICBEQ0QgNTU5MjQwNSwgNTU5MjQwNSwgNTU5MjQwNSwgNTU5MjQwNSwgNTU5MjQwNSwgNTU5MjQwNSAgICAgICAgICAgICAgICAKLSAgICAgICAgIAotICAgICAgICAgCi0gICAgICAgICBFTkQKLSAgICAgICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0X3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NF9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllMTZlNDkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0X3MucworKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NF9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICAxMjI5MAotOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi07Ly8gRGVzY3JpcHRpb246Ci07Ly8gVHJhbnNmb3JtIFJlc2lkdWFsIDR4NCBDb2VmZmljaWVudHMKLTsvLyAKLTsvLyAKLQotICAgICAgICAKLTsvLyBJbmNsdWRlIHN0YW5kYXJkIGhlYWRlcnMKLQotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAgIAotICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4Ci0gICAgICAgIAotOy8vIEltcG9ydCBzeW1ib2xzIHJlcXVpcmVkIGZyb20gb3RoZXIgZmlsZXMKLTsvLyAoRm9yIGV4YW1wbGUgdGFibGVzKQotICAgIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIAotOy8vIFNldCBkZWJ1Z2dpbmcgbGV2ZWwgICAgICAgIAotOy8vREVCVUdfT04gICAgU0VUTCB7VFJVRX0KLQotCi0KLTsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKLSAgICAKLSAgICAKLSAgICAKLQotCi0KLQotCi07Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCi0gICAgCi0gICAgSUYgIENvcnRleEE4Ci0KLTsvLyBBUk0gUmVnaXN0ZXJzCi0gICAgCi07Ly9JbnB1dCBSZWdpc3RlcnMKLXBEc3QgICAgICAgICAgICAgICAgUk4gIDAKLXBTcmMgICAgICAgICAgICAgICAgUk4gIDEKLQotCi07Ly8gTmVvbiBSZWdpc3RlcnMKLSAgICAgIAotOy8vIFBhY2tlZCBJbnB1dCBwaXhlbHMKLWRJbjAgICAgICAgICAgICAgICAgRE4gIEQwLlMxNiAgICAgICAKLWRJbjEgICAgICAgICAgICAgICAgRE4gIEQxLlMxNiAgICAgICAKLWRJbjIgICAgICAgICAgICAgICAgRE4gIEQyLlMxNiAgICAgICAKLWRJbjMgICAgICAgICAgICAgICAgRE4gIEQzLlMxNgotCi07Ly8gSW50ZXJtZWRpYXRlIGNhbGN1bGF0aW9ucyAgICAgICAKLWRaZXJvICAgICAgICAgICAgICAgRE4gIEQ0LlMxNgotZGUwICAgICAgICAgICAgICAgICBETiAgRDUuUzE2Ci1kZTEgICAgICAgICAgICAgICAgIEROICBENi5TMTYKLWRlMiAgICAgICAgICAgICAgICAgRE4gIEQ3LlMxNgotZGUzICAgICAgICAgICAgICAgICBETiAgRDguUzE2Ci1kSW4xUlMgICAgICAgICAgICAgIEROICBENy5TMTYKLWRJbjNSUyAgICAgICAgICAgICAgRE4gIEQ4LlMxNgotZGYwICAgICAgICAgICAgICAgICBETiAgRDAuUzE2Ci1kZjEgICAgICAgICAgICAgICAgIEROICBEMS5TMTYKLWRmMiAgICAgICAgICAgICAgICAgRE4gIEQyLlMxNgotZGYzICAgICAgICAgICAgICAgICBETiAgRDMuUzE2Ci1xZjAxICAgICAgICAgICAgICAgIFFOICBRMC4zMgotcWYyMyAgICAgICAgICAgICAgICBRTiAgUTEuMzIKLWRnMCAgICAgICAgICAgICAgICAgRE4gIEQ1LlMxNgotZGcxICAgICAgICAgICAgICAgICBETiAgRDYuUzE2Ci1kZzIgICAgICAgICAgICAgICAgIEROICBENy5TMTYKLWRnMyAgICAgICAgICAgICAgICAgRE4gIEQ4LlMxNgotZGYxUlMgICAgICAgICAgICAgICBETiAgRDcuUzE2Ci1kZjNSUyAgICAgICAgICAgICAgIEROICBEOC5TMTYKLQotOy8vIE91dHB1dCBwaXhlbHMKLWRoMCAgICAgICAgICAgICAgICAgRE4gIEQwLlMxNgotZGgxICAgICAgICAgICAgICAgICBETiAgRDEuUzE2Ci1kaDIgICAgICAgICAgICAgICAgIEROICBEMi5TMTYKLWRoMyAgICAgICAgICAgICAgICAgRE4gIEQzLlMxNgotCi0gICAgICAgCi0gICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSByZXF1aXJlZCBieSB0aGUgZnVuY3Rpb24KLSAgICAgICAgCi0KLSAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NCwgLGQ4Ci0gICAgICAgIAotICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgIDsvLyBUaGUgc3RyYXRlZ3kgdXNlZCBpbiBpbXBsZW1lbnRpbmcgdGhlIHRyYW5zZm9ybSBpcyBhcyBmb2xsb3dzOioKLSAgICAgICAgOy8vIExvYWQgdGhlIDR4NCBibG9jayBpbnRvIDggcmVnaXN0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgCi0gICAgICAgIDsvLyBUcmFuc3Bvc2UgdGhlIDR4NCBtYXRyaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIAotICAgICAgICA7Ly8gUGVyZm9ybSB0aGUgcm93IG9wZXJhdGlvbnMgKG9uIGNvbHVtbnMpIHVzaW5nIFNJTUQgICAgICAgICAgICAqICAKLSAgICAgICAgOy8vIFRyYW5zcG9zZSB0aGUgNHg0IHJlc3VsdCBtYXRyaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgCi0gICAgICAgIDsvLyBQZXJmb3JtIHRoZSBjb2xvdW1uIG9wZXJhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgICAgOy8vIFN0b3JlIHRoZSA0eDQgYmxvY2sgYXQgb25lIGdvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgCi0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgICAgICA7Ly8gTG9hZCBhbGwgdGhlIDR4NCBwaXhlbHMgaW4gdHJhbnNwb3NlZCBmb3JtCi0gICAgICAgIAotICAgICAgICBWTEQ0ICAgIHtkSW4wLGRJbjEsZEluMixkSW4zfSxbcFNyY10KLSAgICAgICAgCi0gICAgICAgIFZNT1YgICAgZFplcm8sIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVXNlZCB0byByaWdodCBzaGlmdCBieSAxIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICAgICAgICA7Ly8gUm93IE9wZXJhdGlvbnMgKFBlcmZvcm1lZCBvbiBjb2x1bW5zKQotICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBWQUREICAgICAgICBkZTAsZEluMCxkSW4yICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGUwID0gZDAgKyBkMiAKLSAgICAgICAgVlNVQiAgICAgICAgZGUxLGRJbjAsZEluMiAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZTEgPSBkMCAtIGQyIAotICAgICAgICBWSEFERCAgICAgICBkSW4xUlMsZEluMSxkWmVybyAgICAgICAgICAgICAgICAgICA7Ly8gKGYxPj4xKSBjb25zdFplcm8gaXMgYSByZWdpc3RlciBob2xkaW5nIDAKLSAgICAgICAgVkhBREQgICAgICAgZEluM1JTLGRJbjMsZFplcm8KLSAgICAgICAgVlNVQiAgICAgICAgZGUyLGRJbjFSUyxkSW4zICAgICAgICAgICAgICAgICAgICAgOy8vICBlMiA9IChkMT4+MSkgLSBkMyAKLSAgICAgICAgVkFERCAgICAgICAgZGUzLGRJbjEsZEluM1JTICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBlMyA9IGQxICsgKGQzPj4xKSAKLSAgICAgICAgVkFERCAgICAgICAgZGYwLGRlMCxkZTMgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMCA9IGUwICsgZTMKLSAgICAgICAgVkFERCAgICAgICAgZGYxLGRlMSxkZTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMSA9IGUxICsgZTIKLSAgICAgICAgVlNVQiAgICAgICAgZGYyLGRlMSxkZTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMiA9IGUxIC0gZTIKLSAgICAgICAgVlNVQiAgICAgICAgZGYzLGRlMCxkZTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMyA9IGUwIC0gZTMKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgIDsvLyBUcmFuc3Bvc2UgdGhlIHJlc3VsdGFudCBtYXRyaXgKLSAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgIAotICAgICAgICBWVFJOICAgIGRmMCxkZjEKLSAgICAgICAgVlRSTiAgICBkZjIsZGYzCi0gICAgICAgIFZUUk4gICAgcWYwMSxxZjIzIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICAgICAgICA7Ly8gQ29sb3VtbiBPcGVyYXRpb25zIAotICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBWQUREICAgICAgICBkZzAsZGYwLGRmMiAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGUwID0gZDAgKyBkMiAKLSAgICAgICAgVlNVQiAgICAgICAgZGcxLGRmMCxkZjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBlMSA9IGQwIC0gZDIgCi0gICAgICAgIFZIQUREICAgICAgIGRmMVJTLGRmMSxkWmVybyAgICAgICAgICAgICAgICAgICAgIDsvLyAoZjE+PjEpIGNvbnN0WmVybyBpcyBhIHJlZ2lzdGVyIGhvbGRpbmcgMAotICAgICAgICBWSEFERCAgICAgICBkZjNSUyxkZjMsZFplcm8KLSAgICAgICAgVlNVQiAgICAgICAgZGcyLGRmMVJTLGRmMyAgICAgICAgICAgICAgICAgICAgICAgOy8vICBlMiA9IChkMT4+MSkgLSBkMyAKLSAgICAgICAgVkFERCAgICAgICAgZGczLGRmMSxkZjNSUyAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZTMgPSBkMSArIChkMz4+MSkgCi0gICAgICAgIFZBREQgICAgICAgIGRoMCxkZzAsZGczICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZjAgPSBlMCArIGUzCi0gICAgICAgIFZBREQgICAgICAgIGRoMSxkZzEsZGcyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZjEgPSBlMSArIGUyCi0gICAgICAgIFZTVUIgICAgICAgIGRoMixkZzEsZGcyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZjIgPSBlMSAtIGUyCi0gICAgICAgIFZTVUIgICAgICAgIGRoMyxkZzAsZGczICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZjMgPSBlMCAtIGUzCi0gICAgICAgIAotICAgICAgICAgICAgIAotICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgIDsvLyBDYWxjdWxhdGUgZmluYWwgdmFsdWUgKGNvbE9wW2ldW2pdICsgMzIpPj42Ci0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgCi0gICAgICAgIFZSU0hSICAgICAgIGRoMCwjNgotICAgICAgICBWUlNIUiAgICAgICBkaDEsIzYKLSAgICAgICAgVlJTSFIgICAgICAgZGgyLCM2Ci0gICAgICAgIFZSU0hSICAgICAgIGRoMywjNgotICAgICAgICAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICA7Ly8gU3RvcmUgYWxsIHRoZSA0eDQgcGl4ZWxzCi0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgCi0gICAgICAgIFZTVDEgICB7ZGgwLGRoMSxkaDIsZGgzfSxbcERzdF0KLSAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIFNldCByZXR1cm4gdmFsdWUKLSAgICAgICAgCi1FbmQgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgCi0gICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiB0YWlsCi0gICAgICAgIE1fRU5ECi0gICAgICAgIAotICAgIEVORElGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly9Db3J0ZXhBOCAgICAgICAgICAgIAotICAgICAgICAgICAgCi0gICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDRfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0X3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI0YzdkNS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDRfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0X3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDEyMjkwCi07Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotICAgICAgICAKLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgICAKLTsvLyBEZWZpbmUgdGhlIHByb2Nlc3NvciB2YXJpYW50cyBzdXBwb3J0ZWQgYnkgdGhpcyBmaWxlCi0KLSAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBJRiBBUk0xMTM2SlMKLSAgICAgICAgCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIElucHV0IEFyZ3VtZW50cyBhbmQgdGhlaXIgc2NvcGUvdXNhZ2UKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wcFNyYyAgICAgICAgICAgUk4gMCAgICA7Ly8gUGVyc2lzdGVudCB2YXJpYWJsZQotcERzdCAgICAgICAgICAgIFJOIDEgICAgOy8vIFBlcnNpc3RlbnQgdmFyaWFibGUKLQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBWYXJpYWJsZXMgYW5kIHRoZWlyIHNjb3BlL3VzYWdlCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcFNyYyAgICAgICAgICAgIFJOIDIgICAgOy8vIFBlcnNpc3RlbnQgdmFyaWFibGVzCi1GbGFnICAgICAgICAgICAgUk4gMyAgICAKLVZhbHVlICAgICAgICAgICBSTiA0ICAgIAotVmFsdWUyICAgICAgICAgIFJOIDUgICAgCi1zdHJPZmZzZXQgICAgICAgUk4gNiAgICAKLWNzdE9mZnNldCAgICAgICBSTiA3ICAgIAotCi0gICAgICAgIAotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQsIHI3Ci0gICAgICAgIAotICAgICAgICBMRFIgICAgIHBTcmMsIFtwcFNyY10gICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIHBTcmMKLSAgICAgICAgTU9WICAgICBjc3RPZmZzZXQsICMzMSAgICAgICAgICAgICAgICAgICAgICA7Ly8gVG8gYmUgdXNlZCBpbiB0aGUgbG9vcCwgdG8gY29tcHV0ZSBvZmZzZXQKLSAgICAgICAgCi0gICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIDsgRmlyc3RseSwgZmlsbCBhbGwgdGhlIGNvZWZmaWNpZW50IHZhbHVlcyBvbiB0aGUgPHBEc3Q+IGJ1ZmZlciBieSB6ZXJvCi0gICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIAotICAgICAgICBNT1YgICAgICBWYWx1ZSwgICMwICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJbml0aWFsaXplIHRoZSB6ZXJvIHZhbHVlCi0gICAgICAgIE1PViAgICAgIFZhbHVlMiwgIzAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEluaXRpYWxpemUgdGhlIHplcm8gdmFsdWUKLSAgICAgICAgTERSQiAgICAgRmxhZywgIFtwU3JjXSwgIzEgICAgICAgICAgICAgICAgICA7Ly8gUHJlbG9hZCA8RmxhZz4gYmVmb3JlIDx1bnBhY2tMb29wPgotICAgICAgICAKLSAgICAgICAgU1RSRCAgICAgVmFsdWUsIFtwRHN0LCAjMF0gICAgICAgICAgICAgICAgICA7Ly8gcERzdFswXSAgPSBwRHN0WzFdICA9IHBEc3RbMl0gID0gcERzdFszXSAgPSAwCi0gICAgICAgIFNUUkQgICAgIFZhbHVlLCBbcERzdCwgIzhdICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbNF0gID0gcERzdFs1XSAgPSBwRHN0WzZdICA9IHBEc3RbN10gID0gMAotICAgICAgICBTVFJEICAgICBWYWx1ZSwgW3BEc3QsICMxNl0gICAgICAgICAgICAgICAgIDsvLyBwRHN0WzhdICA9IHBEc3RbOV0gID0gcERzdFsxMF0gPSBwRHN0WzExXSA9IDAKLSAgICAgICAgU1RSRCAgICAgVmFsdWUsIFtwRHN0LCAjMjRdICAgICAgICAgICAgICAgICA7Ly8gcERzdFsxMl0gPSBwRHN0WzEzXSA9IHBEc3RbMTRdID0gcERzdFsxNV0gPSAwCi0gICAgICAgIAotICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIDsvLyBUaGUgbG9vcCBiZWxvdyBwYXJzZXMgYW5kIHVucGFja3MgdGhlIGlucHV0IHN0cmVhbS4gVGhlIEMtbW9kZWwgaGFzIAotICAgICAgICA7Ly8gYSBzb21ld2hhdCBjb21wbGljYXRlZCBsb2dpYyBmb3Igc2lnbiBleHRlbnNpb24uICBCdXQgaW4gdGhlIHY2IHZlcnNpb24sCi0gICAgICAgIDsvLyB0aGF0IGNhbiBiZSBlYXNpbHkgdGFrZW4gY2FyZSBieSBsb2FkaW5nIHRoZSBkYXRhIGZyb20gPHBTcmM+IHN0cmVhbSBhcyAKLSAgICAgICAgOy8vIFNJR05FRCBieXRlL2hhbGZ3b3JkLiBTbywgYmFzZWQgb24gdGhlIGZpcnN0IFRTVCBpbnN0cnVjdGlvbiwgOC1iaXRzIG9yIAotICAgICAgICA7Ly8gMTYtYml0cyBhcmUgcmVhZC4KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBOZXh0LCB0byBjb21wdXRlIHRoZSBvZmZzZXQsIHdoZXJlIHRoZSB1bnBhY2tlZCB2YWx1ZSBuZWVkcyB0byBiZSBzdG9yZWQsCi0gICAgICAgIDsvLyB3ZSBtb2RpZnkgdGhlIGNvbXB1dGF0aW9uIHRvIHBlcmZvcm0gWyhGbGFnICYgMTUpIDwgMV0gYXMgWyhGbGFnIDwgMSkgJiAzMV0KLSAgICAgICAgOy8vIFRoaXMgcmVzdWx0cyBpbiBhIHNhdmluZyBvZiBvbmUgY3ljbGUuCi0gICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgCi11bnBhY2tMb29wCi0gICAgICAgIFRTVCAgICAgIEZsYWcsICAjMHgxMCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDb21wdXRpbmcgKEZsYWcgJiAweDEwKQotICAgICAgICBMRFJTQk5FICBWYWx1ZTIsW3BTcmMsIzFdICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBieXRlIHdpc2UgdG8gYXZvaWQgdW5hbGlnbmVkIGFjY2VzcyAgIAotICAgICAgICBMRFJCTkUgICBWYWx1ZSwgW3BTcmNdLCAjMiAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgQU5EICAgICAgc3RyT2Zmc2V0LCBjc3RPZmZzZXQsIEZsYWcsIExTTCAjMSAgOy8vIHN0ck9mZnNldCA9IChGbGFnICYgMTUpIDwgMTsKLSAgICAgICAgTERSU0JFUSAgVmFsdWUsIFtwU3JjXSwgIzEgICAgICAgICAgICAgICAgICAgOy8vIFZhbHVlID0gKE9NWF9VOCkgICpwU3JjKysKLSAgICAgICAgT1JSTkUgICAgVmFsdWUsVmFsdWUsVmFsdWUyLCBMU0wgIzggICAgICAgICAgOy8vIFZhbHVlID0gKE9NWF9VMTYpICpwU3JjKysKLSAgICAgICAgCi0gICAgICAgIFRTVCAgICAgIEZsYWcsICAjMHgyMCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDb21wdXRpbmcgKEZsYWcgJiAweDIwKSB0byBjaGVjaywgaWYgd2UncmUgZG9uZQotICAgICAgICBMRFJCRVEgICBGbGFnLCAgW3BTcmNdLCAjMSAgICAgICAgICAgICAgICAgICA7Ly8gRmxhZyAgPSAoT01YX1U4KSAqcFNyYysrLCBmb3IgbmV4dCBpdGVyYXRpb24KLSAgICAgICAgU1RSSCAgICAgVmFsdWUsIFtwRHN0LCBzdHJPZmZzZXRdICAgICAgICAgICAgOy8vIFN0b3JlIDxWYWx1ZT4gYXQgb2Zmc2V0IDxzdHJPZmZzZXQ+Ci0gICAgICAgIEJFUSAgICAgIHVucGFja0xvb3AgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBCcmFuY2ggdG8gdGhlIGxvb3AgYmVnaW5uaW5nCi0gICAgICAgIAotICAgICAgICBTVFIgICAgICBwU3JjLCBbcHBTcmNdICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVXBkYXRlIHRoZSBiaXRzdHJlYW0gcG9pbnRlcgotICAgICAgICBNX0VORAotICAgIAotICAgIEVORElGCi0gICAgCi0gICAgCi0gICAgCi0gICAgRU5ECi0gICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhNjQ0OGQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgMTIyOTAKLSAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIEguMjY0IGludHJhIGNocm9tYSBkZWJsb2NrCi0gKiAKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiBvbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgZGVibG9ja2luZyBmaWx0ZXJpbmcgb24gYWxsIGVkZ2VzIG9mIHRoZSBjaHJvbWEgbWFjcm9ibG9jayAoMTZ4MTYpLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcFNyY0RzdCAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2suIE11c3QgYmUgOC1ieXRlIGFsaWduZWQuCi0gKiBbaW5dCXNyY2RzdFN0ZXAgICAgICBTdGVwIG9mIHRoZSBhcnJheXMKLSAqIFtpbl0JcEFscGhhICAgICAgICAgIHBvaW50ZXIgdG8gYSAyeDIgYXJyYXkgb2YgYWxwaGEgdGhyZXNob2xkcywgb3JnYW5pemVkIGFzIGZvbGxvd3M6IHsgZXh0ZXJuYWwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCAgdmVydGljYWwgZWRnZSwgZXh0ZXJuYWwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIGhvcml6b250YWwgZWRnZSwgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlIH0KLSAqIFtpbl0JcEJldGEJCQlwb2ludGVyIHRvIGEgMngyIGFycmF5IG9mIGJldGEgdGhyZXNob2xkcywgb3JnYW5pemVkIGFzIGZvbGxvd3M6IHsgZXh0ZXJuYWwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgdmVydGljYWwgZWRnZSwgZXh0ZXJuYWwgIGhvcml6b250YWwgZWRnZSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWwgIGhvcml6b250YWwgZWRnZSB9Ci0gKiBbaW5dCXBUaHJlc2hvbGRzCQlBQXJyYXkgb2Ygc2l6ZSAgOHgyIG9mIFRocmVzaG9sZHMgKFRDMCkgKHZhbHVlcyBmb3IgdGhlIGxlZnQgb3IKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3ZlIGVkZ2Ugb2YgZWFjaCA0eDIgb3IgMng0IGJsb2NrLCBhcnJhbmdlZCBpbiAgdmVydGljYWwgYmxvY2sgb3JkZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGVuIGluICBob3Jpem9udGFsIGJsb2NrIG9yZGVyKQotICogW2luXQlwQlMJCQkJYXJyYXkgb2Ygc2l6ZSAxNngyIG9mIEJTIHBhcmFtZXRlcnMgKGFycmFuZ2VkIGluIHNjYW4gYmxvY2sgb3JkZXIgZm9yIHZlcnRpY2FsIGVkZ2VzIGFuZCB0aGVuIGhvcml6b250YWwgZWRnZXMpOwotICogICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjFdPT0gNC4gIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuCi0gKiBbb3V0XQlwU3JjRHN0CQlwb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX1N0c19Ob0VyciAtIG5vIGVycm9yCi0gKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMKLSAqICAgLSBFaXRoZXIgb2YgdGhlIHBvaW50ZXJzIGluIHBTcmNEc3QsIHBBbHBoYSwgcEJldGEsIHBUcmVzaG9sZHMsIG9yIHBCUyBpcyBOVUxMLgotICogICAtIHBTcmNEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLgotICogICAtIGVpdGhlciBwVGhyZXNob2xkcyBvciBwQlMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLgotICogICAtIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIChwQlNbaV09PTQgJiYgcEJTW2leMV0hPTQpIGZvciAwPD1pPD0zLgotICogICAtIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4KLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSSgKLQlPTVhfVTgqIHBTcmNEc3QsIAotCU9NWF9TMzIgc3JjZHN0U3RlcCwgCi0JY29uc3QgT01YX1U4KiBwQWxwaGEsIAotCWNvbnN0IE9NWF9VOCogcEJldGEsIAotCWNvbnN0IE9NWF9VOCogcFRocmVzaG9sZHMsCi0gICAgY29uc3QgT01YX1U4ICpwQlMKLSkKLXsKLSAgICBPTVhSZXN1bHQgZXJyb3JDb2RlOwotICAgIAotICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3QgPT0gTlVMTCwgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q4Qnl0ZUFsaWduZWQocFNyY0RzdCksICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoc3JjZHN0U3RlcCAmIDcsICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBBbHBoYSA9PSBOVUxMLCAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwQmV0YSA9PSBOVUxMLCAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFRocmVzaG9sZHMgPT0gTlVMTCwgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwVGhyZXNob2xkcyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwQlMgPT0gTlVMTCwgICAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBCUyksICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotCi0gICAgZXJyb3JDb2RlID0gb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSSgKLSAgICAgICAgcFNyY0RzdCwgc3JjZHN0U3RlcCwgcEFscGhhLCBwQmV0YSwgcFRocmVzaG9sZHMsIHBCUyk7Ci0KLSAgICBhcm1SZXRBcmdFcnJJZihlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciwgZXJyb3JDb2RlKQotICAgIAotICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0koCi0gICAgICAgIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIHBBbHBoYSsyLCBwQmV0YSsyLCBwVGhyZXNob2xkcys4LCBwQlMrMTYpOwotCi0gICAgcmV0dXJuIGVycm9yQ29kZTsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Yjg5YmU3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgMTIyOTAKLSAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIEguMjY0IGx1bWEgZGVibG9jawotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSAKLQotLyoqCi0gKiBGdW5jdGlvbjogb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGRlYmxvY2sgZmlsdGVyaW5nIHRoZSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBlZGdlcyBvZiBhIGx1bWEgbWFjcm9ibG9jawotICooMTZ4MTYpLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcFNyY0RzdCAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2suIE11c3QgYmUgOC1ieXRlIGFsaWduZWQuCi0gKiBbaW5dCXNyY2RzdFN0ZXAgICAgICBpbWFnZSB3aWR0aAotICogW2luXQlwQWxwaGEgICAgICAgICAgcG9pbnRlciB0byBhIDJ4MiB0YWJsZSBvZiBhbHBoYSB0aHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgZm9sbG93czogeyBleHRlcm5hbAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsIHZlcnRpY2FsIGVkZ2UsIGV4dGVybmFsIGhvcml6b250YWwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfQotICogW2luXQlwQmV0YQkJCXBvaW50ZXIgdG8gYSAyeDIgdGFibGUgb2YgYmV0YSB0aHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgZm9sbG93czogeyBleHRlcm5hbAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBleHRlcm5hbCAgaG9yaXpvbnRhbCBlZGdlLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbCAgaG9yaXpvbnRhbCBlZGdlIH0KLSAqIFtpbl0JcFRocmVzaG9sZHMJCXBvaW50ZXIgdG8gYSAxNngyIHRhYmxlIG9mIHRocmVzaG9sZCAoVEMwKSwgb3JnYW5pemVkIGFzIGZvbGxvd3M6IHsgdmFsdWVzIGZvcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgIGxlZnQgb3IgYWJvdmUgZWRnZSBvZiBlYWNoIDR4NCBibG9jaywgYXJyYW5nZWQgaW4gIHZlcnRpY2FsIGJsb2NrIG9yZGVyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGVuIGluIGhvcml6b250YWwgYmxvY2sgb3JkZXIpCi0gKiBbaW5dCXBCUwkJCQkgcG9pbnRlciB0byBhIDE2eDIgdGFibGUgb2YgQlMgcGFyYW1ldGVycyBhcnJhbmdlZCBpbiBzY2FuIGJsb2NrIG9yZGVyIGZvciB2ZXJ0aWNhbCBlZGdlcyBhbmQgdGhlbiBob3Jpem9udGFsIGVkZ2VzOwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjFdPT0gNC4gIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuCi0gKiBbb3V0XQlwU3JjRHN0CQlwb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvcgotICogT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzCi0gKiAgICAtIEVpdGhlciBvZiB0aGUgcG9pbnRlcnMgaW4gcFNyY0RzdCwgcEFscGhhLCBwQmV0YSwgcFRyZXNob2xkcyBvciBwQlMgaXMgTlVMTC4KLSAqICAgIC0gcFNyY0RzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuCi0gKiAgICAtIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOAotICogICAgLSBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAocEJTW2ldPT00ICYmIHBCU1tpXjFdIT00KSBmb3IgMDw9aTw9My4KLS4KLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMTBfRGVibG9ja0x1bWFfSSgKLQlPTVhfVTgqIHBTcmNEc3QsIAotCU9NWF9TMzIgc3JjZHN0U3RlcCwgCi0JY29uc3QgT01YX1U4KiBwQWxwaGEsIAotCWNvbnN0IE9NWF9VOCogcEJldGEsIAotCWNvbnN0IE9NWF9VOCogcFRocmVzaG9sZHMsIAotCWNvbnN0IE9NWF9VOCAqcEJTCi0pCi17Ci0gICAgT01YUmVzdWx0IGVycm9yQ29kZTsKLSAgICAKLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0ID09IE5VTEwsICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q4Qnl0ZUFsaWduZWQocFNyY0RzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihzcmNkc3RTdGVwICYgNywgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsgICAgCi0gICAgYXJtUmV0QXJnRXJySWYocEFscGhhID09IE5VTEwsICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocEJldGEgPT0gTlVMTCwgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFRocmVzaG9sZHMgPT0gTlVMTCwgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBUaHJlc2hvbGRzKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBCUyA9PSBOVUxMLCAgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocEJTKSwgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0KLSAgICBlcnJvckNvZGUgPSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSSgKLSAgICAgICAgcFNyY0RzdCwgc3JjZHN0U3RlcCwgcEFscGhhLCBwQmV0YSwgcFRocmVzaG9sZHMsIHBCUyk7Ci0KLSAgICBhcm1SZXRBcmdFcnJJZihlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciwgZXJyb3JDb2RlKQotICAgIAotICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JKAotICAgICAgICBwU3JjRHN0LCBzcmNkc3RTdGVwLCBwQWxwaGErMiwgcEJldGErMiwgcFRocmVzaG9sZHMrMTYsIHBCUysxNik7Ci0KLSAgICByZXR1cm4gZXJyb3JDb2RlOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MGYzNDguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMuYworKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQy5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDEyMjkwCi0gKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBILjI2NCBkZWNvZGUgY29lZmZpY2llbnRzIG1vZHVsZQotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBDQVZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSByYXN0ZXIgc2NhbiBmb3IgMngyIGJsb2NrIG9mIAotICogQ2hyb21hRENMZXZlbC4gVGhlIGRlY29kZWQgY29lZmZpY2llbnRzIGluIHBhY2tlZCBwb3NpdGlvbi1jb2VmZmljaWVudCAKLSAqIGJ1ZmZlciBhcmUgc3RvcmVkIGluIGluY3JlYXNpbmcgcmFzdGVyIHNjYW4gb3JkZXIsIG5hbWVseSBwb3NpdGlvbiBvcmRlci4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBwQml0U3RyZWFtCQlEb3VibGUgcG9pbnRlciB0byBjdXJyZW50IGJ5dGUgaW4gYml0IHN0cmVhbQotICoJCQkJCQkJCWJ1ZmZlcgotICogW2luXQlwT2Zmc2V0CQkJUG9pbnRlciB0byBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSAKLSAqCQkJCQkJCQlwb2ludGVkIHRvIGJ5ICpwcEJpdFN0cmVhbQotICogW291dF0JcHBCaXRTdHJlYW0JCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZAotICogW291dF0JcE9mZnNldAkJCSpwT2Zmc2V0IGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkCi0gKiBbb3V0XQlwTnVtQ29lZmYJCVBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBub256ZXJvIGNvZWZmaWNpZW50cwotICoJCQkJCQkJCWluIHRoaXMgYmxvY2sKLSAqIFtvdXRdCXBwUG9zQ29lZmJ1ZglEb3VibGUgcG9pbnRlciB0byBkZXN0aW5hdGlvbiByZXNpZHVhbAotICoJCQkJCQkJCWNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgb214RXJyb3IgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQyAoCi0gICAgIGNvbnN0IE9NWF9VOCoqIHBwQml0U3RyZWFtLAotICAgICBPTVhfUzMyKiBwT2Zmc2V0LAotICAgICBPTVhfVTgqIHBOdW1Db2VmZiwKLSAgICAgT01YX1U4KiogcHBQb3NDb2VmYnVmICAgICAgICAKLSApCi0KLXsKLSAgICByZXR1cm4gYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIocHBCaXRTdHJlYW0sIHBPZmZzZXQsIHBOdW1Db2VmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHBQb3NDb2VmYnVmLCAxNywgNCk7Ci0KLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlNzhiNGMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgMTIyOTAKLSAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIEguMjY0IGRlY29kZSBjb2VmZmljaWVudHMgbW9kdWxlCi0gKiAKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBDQVZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBmb3IgNHg0IGJsb2NrIG9mIAotICogSW50cmExNngxNkRDTGV2ZWwsIEludHJhMTZ4MTZBQ0xldmVsLEx1bWFMZXZlbCwgYW5kIENocm9tYUFDTGV2ZWwuIAotICogSW52ZXJzZSBmaWVsZCBzY2FuIGlzIG5vdCBzdXBwb3J0ZWQuIFRoZSBkZWNvZGVkIGNvZWZmaWNpZW50cyBpbiBwYWNrZWQgCi0gKiBwb3NpdGlvbi1jb2VmZmljaWVudCBidWZmZXIgYXJlIHN0b3JlZCBpbiBpbmNyZWFzaW5nIHppZ3phZyBvcmRlciBpbnN0ZWFkIAotICogb2YgcG9zaXRpb24gb3JkZXIuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwcEJpdFN0cmVhbQkJRG91YmxlIHBvaW50ZXIgdG8gY3VycmVudCBieXRlIGluIGJpdCBzdHJlYW0gYnVmZmVyCi0gKiBbaW5dCXBPZmZzZXQJCQlQb2ludGVyIHRvIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKLSAqCQkJCQkJCQl0byBieSAqcHBCaXRTdHJlYW0KLSAqIFtpbl0Jc01heE51bUNvZWZmCU1heGltdW0gbnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyBpbiBjdXJyZW50Ci0gKgkJCQkJCQkJYmxvY2sKLSAqIFtpbl0Jc1ZMQ1NlbGVjdAkJVkxDIHRhYmxlIHNlbGVjdG9yLCBvYnRhaW5lZCBmcm9tIG51bWJlciBvZiBub24temVybwotICoJCQkJCQkJCUFDIGNvZWZmaWNpZW50cyBvZiBhYm92ZSBhbmQgbGVmdCA0eDQgYmxvY2tzLiBJdCBpcyAKLSAqCQkJCQkJCQllcXVpdmFsZW50IHRvIHRoZSB2YXJpYWJsZSBuQyBkZXNjcmliZWQgaW4gSC4yNjQgc3RhbmRhcmQgCi0gKgkJCQkJCQkJdGFibGUgOS01LCBleGNlcHQgaXRzIHZhbHVlIGNhbqGvdCBiZSBsZXNzIHRoYW4gemVyby4KLSAqIFtvdXRdCXBwQml0U3RyZWFtCQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQKLSAqIFtvdXRdCXBPZmZzZXQJCQkqcE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZAotICogW291dF0JcE51bUNvZWZmCQlQb2ludGVyIHRvIHRoZSBudW1iZXIgb2Ygbm9uemVybyBjb2VmZmljaWVudHMgaW4KLSAqCQkJCQkJCQl0aGlzIGJsb2NrCi0gKiBbb3V0XQlwcFBvc0NvZWZidWYJRG91YmxlIHBvaW50ZXIgdG8gZGVzdGluYXRpb24gcmVzaWR1YWwKLSAqCQkJCQkJCQljb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlcgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgb214RXJyb3IgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMoCi0gICAgIGNvbnN0IE9NWF9VOCoqIHBwQml0U3RyZWFtLAotICAgICBPTVhfUzMyKiBwT2Zmc2V0LAotICAgICBPTVhfVTgqIHBOdW1Db2VmZiwKLSAgICAgT01YX1U4KipwcFBvc0NvZWZidWYsCi0gICAgIE9NWF9JTlQgc1ZMQ1NlbGVjdCwKLSAgICAgT01YX0lOVCBzTWF4TnVtQ29lZmYgICAgICAgIAotICkKLXsKLSAgICByZXR1cm4gYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIocHBCaXRTdHJlYW0sIHBPZmZzZXQsIHBOdW1Db2VmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHBQb3NDb2VmYnVmLCBzVkxDU2VsZWN0LCBzTWF4TnVtQ29lZmYpOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZF9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ODc5ODIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkX3MucworKysgL2Rldi9udWxsCkBAIC0xLDQxMCArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZF9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICAxMjI5MAotOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi07Ly8gRGVzY3JpcHRpb246Ci07Ly8gSC4yNjQgaW52ZXJzZSBxdWFudGl6ZSBhbmQgdHJhbnNmb3JtIG1vZHVsZQotOy8vIAotOy8vIAotCi0gICAgICAgIAotCi07Ly8gSW5jbHVkZSBzdGFuZGFyZCBoZWFkZXJzCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgICAKLTsvLyBJbXBvcnQgc3ltYm9scyByZXF1aXJlZCBmcm9tIG90aGVyIGZpbGVzCi07Ly8gKEZvciBleGFtcGxlIHRhYmxlcykKLSAgICAKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfUVBEaXZUYWJsZQotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9WTWF0cml4VTE2Ci0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1FQTW9kdWxvVGFibGUgCi0gICAgICAgIAotICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4Ci0gICAgICAgIAotOy8vIFNldCBkZWJ1Z2dpbmcgbGV2ZWwgICAgICAgIAotOy8vREVCVUdfT04gICAgU0VUTCB7VFJVRX0KLQotCi07Ly8gU3RhdGljIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0RlcXVhbnRMdW1hQUM0eDQKLQotOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQotICAgIAotIAotCi07Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCi0gICAgCi0KLQotCi0KLQotOy8vIEZ1bmN0aW9uOiBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkICAgICAgICAgICAgCi0gICAgCi07Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCi0gICAgCi0gICAgCi0gICAgCi07Ly8gRnVuY3Rpb246IG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQgICAgICAgICAgICAKLSAgICAKLTsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKLSAgICAKLSAgICBJRiAgQ29ydGV4QTgKLSAgICAKLQotOy8vIEFSTSBSZWdpc3RlcnMKLQotOy8vSW5wdXQgUmVnaXN0ZXJzCi1wcFNyYyAgICAgICBSTiAgMAotcFByZWQgICAgICAgUk4gIDEKLXBEQyAgICAgICAgIFJOICAyCi1wRHN0ICAgICAgICBSTiAgMwotICAgCi0KLTsvL091dHB1dCBSZWdpc3RlcnMKLXJlc3VsdCAgICAgIFJOICAwCi0KLTsvL0xvY2FsIFNjcmF0Y2ggUmVnaXN0ZXJzCi0KLTsvL1JlZ2lzdGVycyB1c2VkIGluIGFybVZDTTRQMTBfRGVxdWFudEx1bWFBQzR4NAotcFFQZGl2ICAgICAgUk4gIDEwCi1wUVBtb2QgICAgICBSTiAgMTEKLXBWUm93ICAgICAgIFJOICAyCi1RUG1vZCAgICAgICBSTiAgMTIKLXNoaWZ0ICAgICAgIFJOICAxNAotaW5kZXgwICAgICAgUk4gIDEgCi1pbmRleDEgICAgICBSTiAgMTAgCi0KLTsvL1JlZ2lzdGVycyB1c2VkIGluIERlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkCi1wRGVsdGEgICAgICBSTiAgNAotcERlbHRhVG1wICAgUk4gIDYKLUFDICAgICAgICAgIFJOICA1ICAgICAgICAgICAgICAgICAgIDsvL0xvYWQgZnJvbSBzdGFjawotcFByZWRUZW1wICAgUk4gIDcKLXBEQ1RlbXAgICAgIFJOICA4Ci1wRHN0VGVtcCAgICBSTiAgOQotcERlbHRhQXJnMSAgUk4gIDEKLXBEZWx0YUFyZzAgIFJOICAwCi1RUCAgICAgICAgICBSTiAgMSAgICAgICAgICAgICAgICAgICA7Ly9Mb2FkIGZyb20gc3RhY2sKLURDdmFsICAgICAgIFJOICAxMCAgCi1wcmVkc3RlcCAgICBSTiAgMQotZHN0U3RlcCAgICAgUk4gIDEwCi1QcmVkVmFsMSAgICBSTiAgMwotUHJlZFZhbDIgICAgUk4gIDUKLQotCi0KLQotOy8vIE5lb24gUmVnaXN0ZXJzCi0KLTsvLyBSZWdpc3RlcnMgdXNlZCBpbiBhcm1WQ000UDEwX0RlcXVhbnRMdW1hQUM0eDQKLQotZFZtYXRyaXggICAgICAgICAgICBETiAgRDYuOCAgCi1kaW5kZXhSb3cwICAgICAgICAgIEROICBENy4zMiAKLWRpbmRleFJvdzEgICAgICAgICAgRE4gIEQ5LjMyIAotZEJ5dGVJbmRleFJvdzAgICAgICBETiAgRDcuOAotZEJ5dGVJbmRleFJvdzEgICAgICBETiAgRDkuOAotZFZSb3cwICAgICAgICAgICAgICBETiAgRDguOCAgCi1kVlJvdzEgICAgICAgICAgICAgIEROICBENC44Ci1kVlJvdzBVMTYgICAgICAgICAgIEROICBEOC5VMTYKLWRWUm93MVUxNiAgICAgICAgICAgRE4gIEQ0LlUxNgotZFZSb3cyVTE2ICAgICAgICAgICBETiAgRDguVTE2Ci1kVlJvdzNVMTYgICAgICAgICAgIEROICBENC5VMTYKLQotZFNoaWZ0ICAgICAgICAgICAgICBETiAgRDUuVTE2Ci1kU3JjUm93MCAgICAgICAgICAgIEROICBEMC5JMTYKLWRTcmNSb3cxICAgICAgICAgICAgRE4gIEQxLkkxNgotZFNyY1JvdzIgICAgICAgICAgICBETiAgRDIuSTE2ICAgIAotZFNyY1JvdzMgICAgICAgICAgICBETiAgRDMuSTE2Ci1kRHFudFJvdzAgICAgICAgICAgIEROICBEMC5JMTYgIAotZERxbnRSb3cxICAgICAgICAgICBETiAgRDEuSTE2IAotZERxbnRSb3cyICAgICAgICAgICBETiAgRDIuSTE2IAotZERxbnRSb3czICAgICAgICAgICBETiAgRDMuSTE2ICAKLQotOy8vIFJlZ2lzdGVycyB1c2VkIGluIFRyYW5zZm9ybVJlc2lkdWFsNHg0Ci0KLTsvLyBQYWNrZWQgSW5wdXQgcGl4ZWxzCi1kSW4wICAgICAgICAgICAgICAgIEROICBEMC5TMTYgICAgICAgCi1kSW4xICAgICAgICAgICAgICAgIEROICBEMS5TMTYgICAgICAgCi1kSW4yICAgICAgICAgICAgICAgIEROICBEMi5TMTYgICAgICAgCi1kSW4zICAgICAgICAgICAgICAgIEROICBEMy5TMTYKLXFJbjAxICAgICAgICAgICAgICAgUU4gIFEwLjMyCi1xSW4yMyAgICAgICAgICAgICAgIFFOICBRMS4zMgotCi07Ly8gSW50ZXJtZWRpYXRlIGNhbGN1bGF0aW9ucyAgICAgICAKLWRaZXJvICAgICAgICAgICAgICAgRE4gIEQ0LlMxNgotZGUwICAgICAgICAgICAgICAgICBETiAgRDUuUzE2Ci1kZTEgICAgICAgICAgICAgICAgIEROICBENi5TMTYKLWRlMiAgICAgICAgICAgICAgICAgRE4gIEQ3LlMxNgotZGUzICAgICAgICAgICAgICAgICBETiAgRDguUzE2Ci1kSW4xUlMgICAgICAgICAgICAgIEROICBENy5TMTYKLWRJbjNSUyAgICAgICAgICAgICAgRE4gIEQ4LlMxNgotZGYwICAgICAgICAgICAgICAgICBETiAgRDAuUzE2Ci1kZjEgICAgICAgICAgICAgICAgIEROICBEMS5TMTYKLWRmMiAgICAgICAgICAgICAgICAgRE4gIEQyLlMxNgotZGYzICAgICAgICAgICAgICAgICBETiAgRDMuUzE2Ci1xZjAxICAgICAgICAgICAgICAgIFFOICBRMC4zMgotcWYyMyAgICAgICAgICAgICAgICBRTiAgUTEuMzIKLWRnMCAgICAgICAgICAgICAgICAgRE4gIEQ1LlMxNgotZGcxICAgICAgICAgICAgICAgICBETiAgRDYuUzE2Ci1kZzIgICAgICAgICAgICAgICAgIEROICBENy5TMTYKLWRnMyAgICAgICAgICAgICAgICAgRE4gIEQ4LlMxNgotZGYxUlMgICAgICAgICAgICAgICBETiAgRDcuUzE2Ci1kZjNSUyAgICAgICAgICAgICAgIEROICBEOC5TMTYKLQotOy8vIE91dHB1dCBwaXhlbHMKLWRoMCAgICAgICAgICAgICAgICAgRE4gIEQwLlMxNgotZGgxICAgICAgICAgICAgICAgICBETiAgRDEuUzE2Ci1kaDIgICAgICAgICAgICAgICAgIEROICBEMi5TMTYKLWRoMyAgICAgICAgICAgICAgICAgRE4gIEQzLlMxNiAKLQotOy8vIFJlZ2lzdGVycyB1c2VkIGluIERlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkCi0KLWREZWx0YVJvdzAgICAgICAgICAgRE4gIEQwLlMxNgotZERlbHRhUm93MSAgICAgICAgICBETiAgRDEuUzE2Ci1kRGVsdGFSb3cyICAgICAgICAgIEROICBEMi5TMTYKLWREZWx0YVJvdzMgICAgICAgICAgRE4gIEQzLlMxNgotcURlbHRhUm93MDEgICAgICAgICBRTiAgUTAuUzE2Ci1xRGVsdGFSb3cyMyAgICAgICAgIFFOICBRMS5TMTYKLQotZFByZWRWYWxSb3cwMSAgICAgICBETiAgRDQuVTgKLWRQcmVkVmFsUm93MjMgICAgICAgRE4gIEQ1LlU4Ci0KLXFTdW1Sb3cwMSAgICAgICAgICAgUU4gIFEzLlMxNgotcVN1bVJvdzIzICAgICAgICAgICBRTiAgUTQuUzE2Ci1kRHN0Um93MDEgICAgICAgICAgIEROICBEMC5VOAotZERzdFJvdzIzICAgICAgICAgICBETiAgRDEuVTgKLWREc3RSb3cwICAgICAgICAgICAgRE4gIEQwLjMyWzBdCi1kRHN0Um93MSAgICAgICAgICAgIEROICBEMC4zMlsxXQotZERzdFJvdzIgICAgICAgICAgICBETiAgRDEuMzJbMF0KLWREc3RSb3czICAgICAgICAgICAgRE4gIEQxLjMyWzFdCi0gICAgCi0gICAgICAgICAgIAotICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgcmVxdWlyZWQgYnkgdGhlIGZ1bmN0aW9uCi0gICAgICAgIE1fQUxMT0M4IHBCdWZmZXIsIDMyCi0gICAgICAgICAgICAgICAKLQotICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkLHIxMSxkOQotICAgICAgICAKLSAgICAgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKLSAgICAgICAgTV9BUkcgICBwcmVkU3RlcE9uU3RhY2ssIDQKLSAgICAgICAgTV9BUkcgICBkc3RTdGVwT25TdGFjayw0Ci0gICAgICAgIE1fQVJHICAgUVBPblN0YWNrLCA0Ci0gICAgICAgIE1fQVJHICAgQUNPblN0YWNrLDQKLSAgCi0gICAgICAgIAotICAgICAgICBNX0FEUiAgIHBEZWx0YSxwQnVmZmVyIAotICAgICAgICBNX0xEUiAgIEFDLEFDT25TdGFjayAKLSAgICAgICAgCi0gICAgICAgICAKLSAgICAgICAgOy8vIFNhdmUgcmVnaXN0ZXJzIHIxLHIyLHIzIGJlZm9yZSBmdW5jdGlvbiBjYWxsICAgIAotICAgICAgICBNT1YgICAgIHBQcmVkVGVtcCxwUHJlZAotICAgICAgICBNT1YgICAgIHBEQ1RlbXAscERDCi0gICAgICAgIE1PViAgICAgcERzdFRlbXAscERzdAotICAgICAgICAKLSAgICAgICAgQ01QICAgICBBQywjMAotICAgICAgICBCRVEgICAgIERDY2FzZQotICAgICAgICBNT1YgICAgIHBEZWx0YUFyZzEscERlbHRhICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNldCB1cCByMSBmb3IgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NAotICAgIAotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQKLSAgICAKLSAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgOy8vIGFybVZDTTRQMTBfRGVxdWFudEx1bWFBQzR4NCA6IHN0YXRpYyBmdW5jdGlvbiBpbmxpbmVkCi0gICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIAotICAgICAgICA7Ly9CTCAgICAgIGFybVZDTTRQMTBfRGVxdWFudEx1bWFBQzR4NAotICAgICAgICBNX0xEUiAgIFFQLFFQT25TdGFjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNldCB1cCByMSBmb3IgYXJtVkNNNFAxMF9EZXF1YW50THVtYUFDNHg0Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIExEUiAgICBwUVBtb2QsPWFybVZDTTRQMTBfUVBNb2R1bG9UYWJsZQotICAgICAgICBMRFIgICAgcFFQZGl2LD1hcm1WQ000UDEwX1FQRGl2VGFibGUgICAgICAgIAotICAgICAgICBMRFIgICAgcFZSb3csPWFybVZDTTRQMTBfVk1hdHJpeFUxNgotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIExEUlNCICBRUG1vZCxbcFFQbW9kLFFQXSAgICAgICAgICAgICAgICAgICAgOy8vIChRUCU2KSAqIDYKLSAgICAgICAgTERSU0IgIHNoaWZ0LFtwUVBkaXYsUVBdICAgICAgICAgICAgICAgICAgICA7Ly8gU2hpZnQgPSBRUCAvIDYKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgTERSICAgIGluZGV4MSw9MHgwMzAyMDUwNCAKLSAgICAgICAgTERSICAgIGluZGV4MCw9MHgwNTA0MDEwMCAgICAgICAgICAgICAgICAgICA7Ly8gSW5kZXhlcyBpbnRvIGRWbWF0cml4Ci0gICAgICAgIEFERCAgICBwVlJvdyxwVlJvdyxRUG1vZAotICAgICAgICBWRFVQICAgZGluZGV4Um93MCxpbmRleDAgCi0gICAgICAgIFZEVVAgICBkaW5kZXhSb3cxLGluZGV4MQotICAgICAgICBWRFVQICAgZFNoaWZ0LHNoaWZ0IAotICAgICAgICAKLSAgICAgICAgOy8vIExvYWQgYWxsIDR4NCBwVlJvd1tdIHZhbHVlcwotICAgICAgICBWTEQxICAgZFZtYXRyaXgsW3BWUm93XSAgICAgICAgICAgICAgICAgICAgIDsvLyBkVm1hdHJpeCA9IFswZHwwY3wwYnwwYV0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBWVEJMICAgZFZSb3cwLGRWbWF0cml4LGRCeXRlSW5kZXhSb3cwICAgICAgIDsvLyByb3cwID0gcm93MiA9IFtwVlJvd1syXSB8IHBWUm93WzBdIHwgcFZSb3dbMl0gfCBwVlJvd1swXV0KLSAgICAgICAgVlRCTCAgIGRWUm93MSxkVm1hdHJpeCxkQnl0ZUluZGV4Um93MSAgICAgICA7Ly8gcm93MSA9IHJvdzMgPSBbcFZSb3dbMV0gfCBwVlJvd1syXSB8IHBWUm93WzFdIHwgcFZSb3dbMl1dCi0gICAgICAgIENNUCAgICAgcERDVGVtcCwjMAotICAgICAgICA7Ly8gTG9hZCBhbGwgdGhlIDR4NCAnc3JjJyB2YWx1ZXMgIAotICAgICAgICBWTEQxICAgeyBkU3JjUm93MCxkU3JjUm93MSxkU3JjUm93MixkU3JjUm93MyB9LFtwRGVsdGFdIAotICAgICAgICAKLSAgICAgICAgVlNITCAgIGRWUm93MFUxNixkVlJvdzBVMTYsZFNoaWZ0IAotICAgICAgICBWU0hMICAgZFZSb3cxVTE2LGRWUm93MVUxNixkU2hpZnQgCi0gICAgICAgIExEUlNITkUgREN2YWwsW3BEQ1RlbXBdCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIE11bHRpcGx5IHNyY1tdIHdpdGggcFZSb3dbXQotICAgICAgICBWTVVMICAgIGREcW50Um93MCxkU3JjUm93MCxkVlJvdzBVMTYKLSAgICAgICAgVk1VTCAgICBkRHFudFJvdzEsZFNyY1JvdzEsZFZSb3cxVTE2Ci0gICAgICAgIFZNVUwgICAgZERxbnRSb3cyLGRTcmNSb3cyLGRWUm93MlUxNgotICAgICAgICBWTVVMICAgIGREcW50Um93MyxkU3JjUm93MyxkVlJvdzNVMTYKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICA7Ly8gVHJhbnNmb3JtUmVzaWR1YWw0eDQgOiBJbmxpbmVkIHRvIGF2b2lkIExvYWQvU3RvcmVzCi0gICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly9CTCAgICAgIGFybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQKLSAgICAgICAgOy8vU1RSSE5FICBEQ3ZhbCxbcERlbHRhXQotICAgICAgICBWTU9WTkUgICAgZEluMFswXSxEQ3ZhbAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICA7Ly8gVHJhbnNwb3NlIHRoZSBpbnB1dCBwaXhlbHMgOiBwZXJmb3JtIFJvdyBvcHMgYXMgQ29sIG9wcwotICAgICAgICA7Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAKLSAgICAgICAgVlRSTiAgICBkSW4wLGRJbjEKLSAgICAgICAgVlRSTiAgICBkSW4yLGRJbjMKLSAgICAgICAgVlRSTiAgICBxSW4wMSxxSW4yMyAKLSAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgVk1PViAgICBkWmVybywjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBVc2VkIHRvIHJpZ2h0IHNoaWZ0IGJ5IDEgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAgICAgICAgOy8vIFJvdyBPcGVyYXRpb25zIChQZXJmb3JtZWQgb24gY29sdW1ucykKLSAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBWQUREICAgICAgICBkZTAsZEluMCxkSW4yICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGUwID0gZDAgKyBkMiAKLSAgICAgICAgVlNVQiAgICAgICAgZGUxLGRJbjAsZEluMiAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZTEgPSBkMCAtIGQyIAotICAgICAgICBWSEFERCAgICAgICBkSW4xUlMsZEluMSxkWmVybyAgICAgICAgICAgICAgICAgICA7Ly8gKGYxPj4xKSBjb25zdFplcm8gaXMgYSByZWdpc3RlciBob2xkaW5nIDAKLSAgICAgICAgVkhBREQgICAgICAgZEluM1JTLGRJbjMsZFplcm8KLSAgICAgICAgVlNVQiAgICAgICAgZGUyLGRJbjFSUyxkSW4zICAgICAgICAgICAgICAgICAgICAgOy8vICBlMiA9IChkMT4+MSkgLSBkMyAKLSAgICAgICAgVkFERCAgICAgICAgZGUzLGRJbjEsZEluM1JTICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBlMyA9IGQxICsgKGQzPj4xKSAKLSAgICAgICAgVkFERCAgICAgICAgZGYwLGRlMCxkZTMgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMCA9IGUwICsgZTMKLSAgICAgICAgVkFERCAgICAgICAgZGYxLGRlMSxkZTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMSA9IGUxICsgZTIKLSAgICAgICAgVlNVQiAgICAgICAgZGYyLGRlMSxkZTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMiA9IGUxIC0gZTIKLSAgICAgICAgVlNVQiAgICAgICAgZGYzLGRlMCxkZTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMyA9IGUwIC0gZTMKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgOy8vIFRyYW5zcG9zZSB0aGUgcmVzdWx0YW50IG1hdHJpeAotICAgICAgICA7Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAKLSAgICAgICAgVlRSTiAgICBkZjAsZGYxCi0gICAgICAgIFZUUk4gICAgZGYyLGRmMwotICAgICAgICBWVFJOICAgIHFmMDEscWYyMyAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICAgICAgICA7Ly8gQ29sb3VtbiBPcGVyYXRpb25zIAotICAgICAgICA7Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFZBREQgICAgICAgIGRnMCxkZjAsZGYyICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZTAgPSBkMCArIGQyIAotICAgICAgICBWU1VCICAgICAgICBkZzEsZGYwLGRmMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGUxID0gZDAgLSBkMiAKLSAgICAgICAgVkhBREQgICAgICAgZGYxUlMsZGYxLGRaZXJvICAgICAgICAgICAgICAgICAgICAgOy8vIChmMT4+MSkgY29uc3RaZXJvIGlzIGEgcmVnaXN0ZXIgaG9sZGluZyAwCi0gICAgICAgIFZIQUREICAgICAgIGRmM1JTLGRmMyxkWmVybwotICAgICAgICBWU1VCICAgICAgICBkZzIsZGYxUlMsZGYzICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGUyID0gKGQxPj4xKSAtIGQzIAotICAgICAgICBWQUREICAgICAgICBkZzMsZGYxLGRmM1JTICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBlMyA9IGQxICsgKGQzPj4xKSAKLSAgICAgICAgVkFERCAgICAgICAgZGgwLGRnMCxkZzMgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMCA9IGUwICsgZTMKLSAgICAgICAgVkFERCAgICAgICAgZGgxLGRnMSxkZzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMSA9IGUxICsgZTIKLSAgICAgICAgVlNVQiAgICAgICAgZGgyLGRnMSxkZzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMiA9IGUxIC0gZTIKLSAgICAgICAgVlNVQiAgICAgICAgZGgzLGRnMCxkZzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMyA9IGUwIC0gZTMKLSAgICAgICAgCi0gICAgICAgICAgICAgCi0gICAgICAgIDsvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICA7Ly8gQ2FsY3VsYXRlIGZpbmFsIHZhbHVlIChjb2xPcFtpXVtqXSArIDMyKT4+NgotICAgICAgICA7Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgCi0gICAgICAgIFZSU0hSICAgICAgIGRoMCwjNgotICAgICAgICBWUlNIUiAgICAgICBkaDEsIzYKLSAgICAgICAgVlJTSFIgICAgICAgZGgyLCM2Ci0gICAgICAgIFZSU0hSICAgICAgIGRoMywjNgotICAgICAgICAKLSAgICAgICAgICAgICAgIAotICAgICAgICBCICAgICAgIE91dERDY2FzZSAKLSAgICAgICAgCi0KLURDY2FzZQotICAgICAgICA7Ly8gQ2FsY3VsYXRlIHRoZSBUcmFuc2Zvcm1lZCBEQ3ZhbHVlIDogKERDdmFsKzMyKT4+NgotICAgICAgICBMRFJTSCAgIERDdmFsLFtwRENUZW1wXSAKLSAgICAgICAgQUREICAgICBEQ3ZhbCxEQ3ZhbCwjMzIgCi0gICAgICAgIEFTUiAgICAgREN2YWwsREN2YWwsIzYKLSAgICAgICAgCi0gICAgICAgIFZEVVAgICAgZERlbHRhUm93MCwgREN2YWwgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwRGVsdGFbMF0gID0gcERlbHRhWzFdICA9IHBEZWx0YVsyXSAgPSBwRGVsdGFbM10gPSBEQ3ZhbAotICAgICAgICBWRFVQICAgIGREZWx0YVJvdzEsIERDdmFsICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBEZWx0YVs0XSAgPSBwRGVsdGFbNV0gID0gcERlbHRhWzZdICA9IHBEZWx0YVs3XSA9IERDdmFsCi0gICAgICAgIFZEVVAgICAgZERlbHRhUm93MiwgREN2YWwgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcERlbHRhWzhdICA9IHBEZWx0YVs5XSAgPSBwRGVsdGFbMTBdID0gcERlbHRhWzExXSA9IERDdmFsCi0gICAgICAgIFZEVVAgICAgZERlbHRhUm93MywgREN2YWwKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotT3V0RENjYXNlICAgICAgCi0gICAgICAgIE1fTERSICAgcHJlZHN0ZXAscHJlZFN0ZXBPblN0YWNrCi0gICAgICAgIE1fTERSICAgZHN0U3RlcCxkc3RTdGVwT25TdGFjawotICAgICAgICAKLSAgICAgICAgTERSICAgICBQcmVkVmFsMSxbcFByZWRUZW1wXSxwcmVkc3RlcAotICAgICAgICBMRFIgICAgIFByZWRWYWwyLFtwUHJlZFRlbXBdLHByZWRzdGVwCi0gICAgICAgIFZNT1YgICAgZFByZWRWYWxSb3cwMSxQcmVkVmFsMSxQcmVkVmFsMgotICAgICAgICAKLSAgICAgICAgTERSICAgICBQcmVkVmFsMSxbcFByZWRUZW1wXSxwcmVkc3RlcAotICAgICAgICBMRFIgICAgIFByZWRWYWwyLFtwUHJlZFRlbXBdCi0gICAgICAgIFZNT1YgICAgZFByZWRWYWxSb3cyMyxQcmVkVmFsMSxQcmVkVmFsMgotIAotICAgICAgICAKLSAgICAgICAgVkFERFcgICBxU3VtUm93MDEscURlbHRhUm93MDEsZFByZWRWYWxSb3cwMQotICAgICAgICBWQUREVyAgIHFTdW1Sb3cyMyxxRGVsdGFSb3cyMyxkUHJlZFZhbFJvdzIzCi0gICAgICAgIFZRTU9WVU4gZERzdFJvdzAxLHFTdW1Sb3cwMQotICAgICAgICBWUU1PVlVOIGREc3RSb3cyMyxxU3VtUm93MjMKLSAgICAgICAgCi0gCi0gICAgICAgIFZTVDEgICAgZERzdFJvdzAsW3BEc3RUZW1wXSxkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgZERzdFJvdzEsW3BEc3RUZW1wXSxkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgZERzdFJvdzIsW3BEc3RUZW1wXSxkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgZERzdFJvdzMsW3BEc3RUZW1wXQotICAgICAgICAKLSAgICAgICAgOy8vIFNldCByZXR1cm4gdmFsdWUKLSAgICAgICAgTU9WICAgICByZXN1bHQsI09NWF9TdHNfTm9FcnIKLSAgICAgICAgCi1FbmQgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgCi0gICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiB0YWlsCi0gICAgICAgIAotICAgICAgICBNX0VORAotICAgICAgICAKLSAgICBFTkRJRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly9DT1JURVhBOCAgIAotICAgIAotICAgICAgICAgCi0gICAgICAgICAgICAKLSAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0lfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDk5ZGNiLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0lfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgMTIyOTAKLTsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotCi0gICAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKLQotICAgICAgICBJRiBDb3J0ZXhBOAotCi0gICAgICAgIElNUE9SVCAgYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hYlNHRTRfdW5zYWZlCi0gICAgICAgIElNUE9SVCAgYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hYlNMVDRfdW5zYWZlCi0gICAgICAgIAotTE9PUF9DT1VOVCAgRVFVIDB4NDAwMDAwMDAKLU1BU0tfMyAgICAgIEVRVSAweDAzMDMwMzAzCi1NQVNLXzQgICAgICBFUVUgMHgwNDA0MDQwNAotCi07Ly8gRnVuY3Rpb24gYXJndW1lbnRzCi0KLXBTcmNEc3QgICAgIFJOIDAKLXNyY2RzdFN0ZXAgIFJOIDEKLXBBbHBoYSAgICAgIFJOIDIKLXBCZXRhICAgICAgIFJOIDMKLQotcFRocmVzaG9sZHMgUk4gNQotcEJTICAgICAgICAgUk4gNAotYlMzMjEwICAgICAgUk4gNgotCi07Ly8gTG9vcCAKLQotWFkgICAgICAgICAgUk4gNwotCi07Ly8gUGl4ZWxzCi1kUF8wICAgICAgICBETiBENC5VOAotZFBfMSAgICAgICAgRE4gRDUuVTggIAotZFBfMiAgICAgICAgRE4gRDYuVTggIAotZFFfMCAgICAgICAgRE4gRDguVTggIAotZFFfMSAgICAgICAgRE4gRDkuVTggIAotZFFfMiAgICAgICAgRE4gRDEwLlU4IAotCi07Ly8gRmlsdGVyaW5nIERlY2lzaW9uCi1kQWxwaGEgICAgICBETiBEMC5VOAotZEJldGEgICAgICAgRE4gRDIuVTgKLQotZEZpbHQgICAgICAgRE4gRDE2LlU4Ci1kQXFmbGcgICAgICBETiBEMTIuVTgKLWRBcGZsZyAgICAgIEROIEQxNy5VOCAKLQotZEFwMHEwICAgICAgRE4gRDEzLlU4Ci1kQXAxcDAgICAgICBETiBEMTIuVTgKLWRBcTFxMCAgICAgIEROIEQxOC5VOAotZEFwMnAwICAgICAgRE4gRDE5LlU4Ci1kQXEycTAgICAgICBETiBEMTcuVTgKLQotcUJTMzIxMCAgICAgUU4gUTEzLlUxNgotZEJTMzIxMCAgICAgRE4gRDI2Ci1kTWFza19icyAgICBETiBEMjcKLWRGaWx0X2JzICAgIEROIEQyNi5VMTYKLQotOy8vIGJTTFQ0Ci1kTWFza18wICAgICBETiBEMTQuVTgKLWRNYXNrXzEgICAgIEROIEQxNS5VOCAgICAKLWRNYXNrXzQgICAgIEROIEQxLlUxNgotCi1NYXNrXzQgICAgICBSTiA4Ci1NYXNrXzMgICAgICBSTiA5Ci0KLWRUZW1wICAgICAgIEROIEQxOS5VOAotCi07Ly8gUmVzdWx0Ci1kUF8wdCAgICAgICBETiBEMTMuVTggICAKLWRRXzB0ICAgICAgIEROIEQzMS5VOCAgIAotCi1kUF8wbiAgICAgICBETiBEMjkuVTgKLWRRXzBuICAgICAgIEROIEQyNC5VOAotCi0gICAgICAgIAotICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIE1fU1RBUlQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSSwgcjksIGQxNQotICAgICAgICAKLSAgICAgICAgOy8vQXJndW1lbnRzIG9uIHRoZSBzdGFjawotICAgICAgICBNX0FSRyAgIHBwVGhyZXNob2xkcywgNAotICAgICAgICBNX0FSRyAgIHBwQlMsIDQKLSAgICAgICAgCi0gICAgICAgIDsvLyBkMC1kQWxwaGFfMAotICAgICAgICA7Ly8gZDItZEJldGFfMAotCi0gICAgICAgIDtsb2FkIGFscGhhMSxiZXRhMSBzb21ld2hlcmUgdG8gYXZvaWQgbW9yZSBsb2FkcwotICAgICAgICBWTEQxICAgICAgICB7ZEFscGhhW119LCBbcEFscGhhXSEKLSAgICAgICAgU1VCICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgc3JjZHN0U3RlcCwgTFNMICMxIDs/Ci0gICAgICAgIFNVQiAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsIHNyY2RzdFN0ZXAKLSAgICAgICAgVkxEMSAgICAgICAge2RCZXRhW119LCBbcEJldGFdISAKLSAgICAgICAgCi0gICAgICAgIE1fTERSICAgICAgIHBCUywgcHBCUwotICAgICAgICBNX0xEUiAgICAgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzIAotCi0gICAgICAgIExEUiAgICAgICAgIE1hc2tfMywgPU1BU0tfMwotICAgICAgICBMRFIgICAgICAgICBNYXNrXzQsID1NQVNLXzQKLQotICAgICAgICBWTU9WICAgICAgICBkTWFza18wLCAjMCAgICAgCi0gICAgICAgIFZNT1YgICAgICAgIGRNYXNrXzEsICMxICAgICAKLSAgICAgICAgVk1PViAgICAgICAgZE1hc2tfNCwgIzQgICAgIAotICAgICAgICAKLSAgICAgICAgTERSICAgICAgICAgWFksID1MT09QX0NPVU5UCi0KLSAgICAgICAgOy8vIHAwLXAzIC0gZDQtZDcKLSAgICAgICAgOy8vIHEwLXEzIC0gZDgtZDExCi1Mb29wWSAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgIGJTMzIxMCwgW3BCU10sICM4Ci0gICAgICAgIAotICAgICAgICBWTEQxICAgICAgICBkUF8yLCBbcFNyY0RzdF0sIHNyY2RzdFN0ZXAKLSAgICAgICAgOzEKLSAgICAgICAgVkxEMSAgICAgICAgZFBfMSwgW3BTcmNEc3RdLCBzcmNkc3RTdGVwCi0gICAgICAgIENNUCAgICAgICAgIGJTMzIxMCwgIzAKLSAgICAgICAgVkxEMSAgICAgICAgZFBfMCwgW3BTcmNEc3RdLCBzcmNkc3RTdGVwCi0gICAgICAgIDsxCi0gICAgICAgIFZMRDEgICAgICAgIGRRXzAsIFtwU3JjRHN0XSwgc3JjZHN0U3RlcAotICAgICAgICBWQUJEICAgICAgICBkQXAycDAsIGRQXzIsIGRQXzAKLSAgICAgICAgVkxEMSAgICAgICAgZFFfMSwgW3BTcmNEc3RdLCBzcmNkc3RTdGVwCi0gICAgICAgIFZBQkQgICAgICAgIGRBcDBxMCwgZFBfMCwgZFFfMAotICAgICAgICBWTEQxICAgICAgICBkUV8yLCBbcFNyY0RzdF0sIHNyY2RzdFN0ZXAKLSAgICAgICAgQkVRICAgICAgICAgTm9GaWx0ZXJCUzAKLQotICAgICAgICBWQUJEICAgICAgICBkQXAxcDAsIGRQXzEsIGRQXzAKLSAgICAgICAgVkFCRCAgICAgICAgZEFxMXEwLCBkUV8xLCBkUV8wCi0KLSAgICAgICAgVkNHVCAgICAgICAgZEZpbHQsIGRBbHBoYSwgZEFwMHEwCi0gICAgICAgIFZNT1YuVTMyICAgIGRCUzMyMTBbMF0sIGJTMzIxMAotICAgICAgICBWTUFYICAgICAgICBkQXAxcDAsIGRBcTFxMCwgZEFwMXAwCi0gICAgICAgIFZNT1ZMICAgICAgIHFCUzMyMTAsIGRCUzMyMTAuVTgKLSAgICAgICAgVkFCRCAgICAgICAgZEFxMnEwLCBkUV8yLCBkUV8wCi0gICAgICAgIFZDR1QgICAgICAgIGRNYXNrX2JzLlMxNiwgZEJTMzIxMC5TMTYsICMwCi0KLSAgICAgICAgVkNHVCAgICAgICAgZEFwMXAwLCBkQmV0YSwgZEFwMXAwIAotICAgICAgICBWQ0dUICAgICAgICBkQXAycDAsIGRCZXRhLCBkQXAycDAKLSAgICAgICAgCi0gICAgICAgIFZBTkQgICAgICAgIGRGaWx0LCBkTWFza19icy5VOAotCi0gICAgICAgIFRTVCAgICAgICAgIGJTMzIxMCwgTWFza18zCi0KLSAgICAgICAgVkNHVCAgICAgICAgZEFxMnEwLCBkQmV0YSwgZEFxMnEwCi0gICAgICAgIFZBTkQgICAgICAgIGRGaWx0LCBkRmlsdCwgZEFwMXAwCi0KLSAgICAgICAgVkFORCAgICAgICAgZEFxZmxnLCBkRmlsdCwgZEFxMnEwCi0gICAgICAgIFZBTkQgICAgICAgIGRBcGZsZywgZEZpbHQsIGRBcDJwMAotICAgICAgICAKLSAgICAgICAgOy8vIGJTIDwgNCBGaWx0ZXJpbmcKLSAgICAgICAgQkxORSAgICAgICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hYlNMVDRfdW5zYWZlCi0KLSAgICAgICAgVFNUICAgICAgICAgYlMzMjEwLCBNYXNrXzQgICAgICAgIAotCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIExTTCAjMgotICAgICAgICBWVFNUICAgICAgICBkRmlsdF9icywgZEZpbHRfYnMsIGRNYXNrXzQKLQotICAgICAgICA7Ly8gYlMgPT0gNCBGaWx0ZXJpbmcKLSAgICAgICAgQkxORSAgICAgICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hYlNHRTRfdW5zYWZlCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICBWQklUICAgICAgICBkUF8wbiwgZFBfMHQsIGRGaWx0X2JzCi0gICAgICAgIFZCSVQgICAgICAgIGRRXzBuLCBkUV8wdCwgZEZpbHRfYnMKLSAgICAgICAgCi0gICAgICAgIFZCSUYgICAgICAgIGRQXzBuLCBkUF8wLCBkRmlsdCAgICAgIAotICAgICAgICBWQklGICAgICAgICBkUV8wbiwgZFFfMCwgZEZpbHQgIAotCi0gICAgICAgIDsvLyBSZXN1bHQgU3RvcmFnZQotICAgICAgICBWU1QxICAgICAgICBkUF8wbiwgW3BTcmNEc3RdLCBzcmNkc3RTdGVwCi0gICAgICAgIEFERFMgICAgICAgIFhZLCBYWSwgWFkKLSAgICAgICAgVlNUMSAgICAgICAgZFFfMG4sIFtwU3JjRHN0XSwgc3JjZHN0U3RlcAotCi0gICAgICAgIEJORSAgICAgICAgIExvb3BZICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgICAgIHIwLCAjT01YX1N0c19Ob0VycgotCi0gICAgICAgIE1fRVhJVAotICAgICAgICAKLU5vRmlsdGVyQlMwCi0KLSAgICAgICAgVkxEMSAgICAgICAge2RBbHBoYVtdfSwgW3BBbHBoYV0KLSAgICAgICAgU1VCICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgc3JjZHN0U3RlcCwgTFNMICMxCi0gICAgICAgIEFERFMgICAgICAgIFhZLCBYWSwgWFkKLSAgICAgICAgVkxEMSAgICAgICAge2RCZXRhW119LCBbcEJldGFdCi0gICAgICAgIEFERCAgICAgICAgIHBUaHJlc2hvbGRzLCBwVGhyZXNob2xkcywgIzQKLSAgICAgICAgQk5FICAgICAgICAgTG9vcFkgICAgICAgIAotCi0gICAgICAgIE1PViAgICAgICAgIHIwLCAjT01YX1N0c19Ob0VycgotICAgICAgICBNX0VORAotICAgICAgICAKLSAgICAgICAgRU5ESUYKLSAgICAgICAgCi0KLSAgICAgICAgRU5ECi0gICAgICAgIAotICAgICAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0lfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjIxNTJjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyOTYgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0lfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgMTIyOTAKLTsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLQotICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4Ci0KLSAgICAgICAgSUYgQ29ydGV4QTgKLQotICAgICAgICBJTVBPUlQgIGFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTR0U0X3Vuc2FmZQotICAgICAgICBJTVBPUlQgIGFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTTFQ0X3Vuc2FmZQotICAgICAgICAKLUxPT1BfQ09VTlQgIEVRVSAweDQwMDAwMDAwCi1NQVNLXzMgICAgICBFUVUgMHgwMzAzMDMwMwotTUFTS180ICAgICAgRVFVIDB4MDQwNDA0MDQKLQotOy8vIEZ1bmN0aW9uIGFyZ3VtZW50cwotCi1wU3JjRHN0ICAgICBSTiAwCi1zcmNkc3RTdGVwICBSTiAxCi1wQWxwaGEgICAgICBSTiAyCi1wQmV0YSAgICAgICBSTiAzCi0KLXBUaHJlc2hvbGRzIFJOIDUKLXBCUyAgICAgICAgIFJOIDQKLWJTMzIxMCAgICAgIFJOIDYKLXBTcmNEc3RfUCAgIFJOIDEwCi1wU3JjRHN0X1EgICBSTiAxMgotCi1wVG1wICAgICAgICBSTiAxMAotcFRtcDIgICAgICAgUk4gMTIKLXN0ZXAgICAgICAgIFJOIDE0Ci0KLTsvLyBMb29wIAotCi1YWSAgICAgICAgICBSTiA3Ci0KLTsvLyBSb3dzIGlucHV0Ci1kUm93MCAgICAgICBETiBENy5VOAotZFJvdzEgICAgICAgRE4gRDguVTggIAotZFJvdzIgICAgICAgRE4gRDUuVTggIAotZFJvdzMgICAgICAgRE4gRDEwLlU4ICAKLWRSb3c0ICAgICAgIEROIEQ2LlU4ICAKLWRSb3c1ICAgICAgIEROIEQ5LlU4ICAKLWRSb3c2ICAgICAgIEROIEQ0LlU4IAotZFJvdzcgICAgICAgRE4gRDExLlU4IAotCi0KLTsvLyBQaXhlbHMKLWRQXzAgICAgICAgIEROIEQ0LlU4Ci1kUF8xICAgICAgICBETiBENS5VOCAgCi1kUF8yICAgICAgICBETiBENi5VOCAgCi1kUV8wICAgICAgICBETiBEOC5VOCAgCi1kUV8xICAgICAgICBETiBEOS5VOCAgCi1kUV8yICAgICAgICBETiBEMTAuVTggCi0KLTsvLyBGaWx0ZXJpbmcgRGVjaXNpb24KLWRBbHBoYSAgICAgIEROIEQwLlU4Ci1kQmV0YSAgICAgICBETiBEMi5VOAotCi1kRmlsdCAgICAgICBETiBEMTYuVTgKLWRBcWZsZyAgICAgIEROIEQxMi5VOAotZEFwZmxnICAgICAgRE4gRDE3LlU4IAotCi1kQXAwcTAgICAgICBETiBEMTMuVTgKLWRBcDFwMCAgICAgIEROIEQxMi5VOAotZEFxMXEwICAgICAgRE4gRDE4LlU4Ci1kQXAycDAgICAgICBETiBEMTkuVTgKLWRBcTJxMCAgICAgIEROIEQxNy5VOAotCi1xQlMzMjEwICAgICBRTiBRMTMuVTE2Ci1kQlMzMjEwICAgICBETiBEMjYKLWRNYXNrX2JzICAgIEROIEQyNwotZEZpbHRfYnMgICAgRE4gRDI2LlUxNgotCi07Ly8gYlNMVDQKLWRNYXNrXzAgICAgIEROIEQxNC5VOAotZE1hc2tfMSAgICAgRE4gRDE1LlU4ICAgIAotZE1hc2tfNCAgICAgRE4gRDEuVTE2Ci0KLU1hc2tfNCAgICAgIFJOIDgKLU1hc2tfMyAgICAgIFJOIDkKLQotZFRlbXAgICAgICAgRE4gRDE5LlU4Ci0KLTsvLyBSZXN1bHQKLWRQXzB0ICAgICAgIEROIEQxMy5VOCAgIAotZFFfMHQgICAgICAgRE4gRDMxLlU4ICAgCi0KLWRQXzBuICAgICAgIEROIEQyOS5VOAotZFFfMG4gICAgICAgRE4gRDI0LlU4Ci0KLSAgICAgICAgCi0gICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JLCByMTIsIGQxNQotICAgICAgICAKLSAgICAgICAgOy8vQXJndW1lbnRzIG9uIHRoZSBzdGFjawotICAgICAgICBNX0FSRyAgIHBwVGhyZXNob2xkcywgNAotICAgICAgICBNX0FSRyAgIHBwQlMsIDQKLSAgICAgICAgCi0gICAgICAgIDsvLyBkMC1kQWxwaGFfMAotICAgICAgICA7Ly8gZDItZEJldGFfMAotCi0gICAgICAgIDtsb2FkIGFscGhhMSxiZXRhMSBzb21ld2hlcmUgdG8gYXZvaWQgbW9yZSBsb2FkcwotICAgICAgICBWTEQxICAgICAgICB7ZEFscGhhW119LCBbcEFscGhhXSEKLSAgICAgICAgU1VCICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgIzQKLSAgICAgICAgVkxEMSAgICAgICAge2RCZXRhW119LCBbcEJldGFdISAKLSAgICAgICAgCi0gICAgICAgIE1fTERSICAgICAgIHBCUywgcHBCUwotICAgICAgICBNX0xEUiAgICAgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzIAotCi0gICAgICAgIExEUiAgICAgICAgIE1hc2tfNCwgPU1BU0tfNAotICAgICAgICBMRFIgICAgICAgICBNYXNrXzMsID1NQVNLXzMKLQotICAgICAgICA7ZE1hc2tfMC0xNAotICAgICAgICA7ZE1hc2tfMS0xNQotICAgICAgICA7ZE1hc2tfNC0xOQotCi0gICAgICAgIFZNT1YgICAgICAgIGRNYXNrXzAsICMwICAgICAKLSAgICAgICAgVk1PViAgICAgICAgZE1hc2tfMSwgIzEgICAgIAotICAgICAgICBWTU9WICAgICAgICBkTWFza180LCAjNCAgICAgCi0gICAgICAgIAotICAgICAgICBMRFIgICAgICAgICBYWSwgPUxPT1BfQ09VTlQKLQotICAgICAgICA7Ly8gcDAtcDMgLSBkNC1kNwotICAgICAgICA7Ly8gcTAtcTMgLSBkOC1kMTEKLQotCi1Mb29wWSAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgIGJTMzIxMCwgW3BCU10sICM4Ci0gICAgICAgIEFERCAgICAgICAgIHBUbXAsIHBTcmNEc3QsIHNyY2RzdFN0ZXAKLSAgICAgICAgQUREICAgICAgICAgc3RlcCwgc3JjZHN0U3RlcCwgc3JjZHN0U3RlcAotICAgICAgICAKLSAgICAgICAgOzEKLSAgICAgICAgVkxEMSAgICAgICAgZFJvdzAsIFtwU3JjRHN0XSwgc3RlcAotICAgICAgICA7MQotICAgICAgICBWTEQxICAgICAgICBkUm93MSwgW3BUbXBdLCBzdGVwCi0gICAgICAgIFZMRDEgICAgICAgIGRSb3cyLCBbcFNyY0RzdF0sIHN0ZXAKLSAgICAgICAgVkxEMSAgICAgICAgZFJvdzMsIFtwVG1wXSwgc3RlcAotICAgICAgICBWTEQxICAgICAgICBkUm93NCwgW3BTcmNEc3RdLCBzdGVwCi0gICAgICAgIFZMRDEgICAgICAgIGRSb3c1LCBbcFRtcF0sIHN0ZXAKLSAgICAgICAgVkxEMSAgICAgICAgZFJvdzYsIFtwU3JjRHN0XSwgc3RlcAotICAgICAgICBWTEQxICAgICAgICBkUm93NywgW3BUbXBdLCBzdGVwCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIGRSb3cwID0gW3EzcjAgcTJyMCBxMXIwIHEwcjAgcDByMCBwMXIwIHAycjAgcDNyMF0KLSAgICAgICAgOy8vIGRSb3cxID0gW3EzcjEgcTJyMSBxMXIxIHEwcjEgcDByMSBwMXIxIHAycjEgcDNyMV0KLSAgICAgICAgOy8vIGRSb3cyID0gW3EzcjIgcTJyMiBxMXIyIHEwcjIgcDByMiBwMXIyIHAycjIgcDNyMl0KLSAgICAgICAgOy8vIGRSb3czID0gW3EzcjMgcTJyMyBxMXIzIHEwcjMgcDByMyBwMXIzIHAycjMgcDNyM10KLSAgICAgICAgOy8vIGRSb3c0ID0gW3EzcjQgcTJyNCBxMXI0IHEwcjQgcDByNCBwMXI0IHAycjQgcDNyNF0KLSAgICAgICAgOy8vIGRSb3c1ID0gW3EzcjUgcTJyNSBxMXI1IHEwcjUgcDByNSBwMXI1IHAycjUgcDNyNV0KLSAgICAgICAgOy8vIGRSb3c2ID0gW3EzcjYgcTJyNiBxMXI2IHEwcjYgcDByNiBwMXI2IHAycjYgcDNyNl0KLSAgICAgICAgOy8vIGRSb3c3ID0gW3EzcjcgcTJyNyBxMXI3IHEwcjcgcDByNyBwMXI3IHAycjcgcDNyN10KLQotICAgICAgICA7Ly8gOHg4IFRyYW5zcG9zZQotICAgICAgICBWWklQLjggICAgICBkUm93MCwgZFJvdzEKLSAgICAgICAgVlpJUC44ICAgICAgZFJvdzIsIGRSb3czCi0gICAgICAgIFZaSVAuOCAgICAgIGRSb3c0LCBkUm93NQotICAgICAgICBWWklQLjggICAgICBkUm93NiwgZFJvdzcKLQotICAgICAgICBWWklQLjE2ICAgICBkUm93MCwgZFJvdzIKLSAgICAgICAgVlpJUC4xNiAgICAgZFJvdzEsIGRSb3czCi0gICAgICAgIFZaSVAuMTYgICAgIGRSb3c0LCBkUm93NgotICAgICAgICBWWklQLjE2ICAgICBkUm93NSwgZFJvdzcKLQotICAgICAgICBWWklQLjMyICAgICBkUm93MCwgZFJvdzQKLSAgICAgICAgVlpJUC4zMiAgICAgZFJvdzIsIGRSb3c2Ci0gICAgICAgIFZaSVAuMzIgICAgIGRSb3czLCBkUm93NwotICAgICAgICBWWklQLjMyICAgICBkUm93MSwgZFJvdzUKLQotCi0gICAgICAgIDtSZWFsaWduIHRoZSBwb2ludGVycwotCi0gICAgICAgIENNUCAgICAgICAgIGJTMzIxMCwgIzAKLSAgICAgICAgVkFCRCAgICAgICAgZEFwMnAwLCBkUF8yLCBkUF8wCi0gICAgICAgIFZBQkQgICAgICAgIGRBcDBxMCwgZFBfMCwgZFFfMAotICAgICAgICBCRVEgICAgICAgICBOb0ZpbHRlckJTMAotCi0gICAgICAgIFZBQkQgICAgICAgIGRBcDFwMCwgZFBfMSwgZFBfMAotICAgICAgICBWQUJEICAgICAgICBkQXExcTAsIGRRXzEsIGRRXzAKLQotICAgICAgICBWTU9WLlUzMiAgICBkQlMzMjEwWzBdLCBiUzMyMTAKLSAgICAgICAgVkNHVCAgICAgICAgZEZpbHQsIGRBbHBoYSwgZEFwMHEwCi0gICAgICAgIFZNQVggICAgICAgIGRBcDFwMCwgZEFxMXEwLCBkQXAxcDAKLSAgICAgICAgVk1PVkwgICAgICAgcUJTMzIxMCwgZEJTMzIxMC5VOAotICAgICAgICBWQUJEICAgICAgICBkQXEycTAsIGRRXzIsIGRRXzAKLSAgICAgICAgVkNHVCAgICAgICAgZE1hc2tfYnMuUzE2LCBkQlMzMjEwLlMxNiwgIzAKLQotICAgICAgICBWQ0dUICAgICAgICBkQXAxcDAsIGRCZXRhLCBkQXAxcDAKLSAgICAgICAgVkNHVCAgICAgICAgZEFwMnAwLCBkQmV0YSwgZEFwMnAwCi0gICAgICAgIFZBTkQgICAgICAgIGRGaWx0LCBkTWFza19icy5VOAotCi0gICAgICAgIFRTVCAgICAgICAgIGJTMzIxMCwgTWFza18zCi0KLSAgICAgICAgVkNHVCAgICAgICAgZEFxMnEwLCBkQmV0YSwgZEFxMnEwCi0gICAgICAgIFZBTkQgICAgICAgIGRGaWx0LCBkRmlsdCwgZEFwMXAwCi0KLSAgICAgICAgVkFORCAgICAgICAgZEFxZmxnLCBkRmlsdCwgZEFxMnEwCi0gICAgICAgIFZBTkQgICAgICAgIGRBcGZsZywgZEZpbHQsIGRBcDJwMAotCi0gICAgICAgIDsvLyBiUyA8IDQgRmlsdGVyaW5nCi0gICAgICAgIEJMTkUgICAgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTTFQ0X3Vuc2FmZQotCi0gICAgICAgIFRTVCAgICAgICAgIGJTMzIxMCwgTWFza180ICAgICAgICAKLQotICAgICAgICBTVUIgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCBzcmNkc3RTdGVwLCBMU0wgIzMKLSAgICAgICAgVlRTVCAgICAgICAgZEZpbHRfYnMsIGRGaWx0X2JzLCBkTWFza180Ci0KLSAgICAgICAgOy8vIGJTID09IDQgRmlsdGVyaW5nCi0gICAgICAgIEJMTkUgICAgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTR0U0X3Vuc2FmZQotCi0gICAgICAgIFZCSVQgICAgICAgIGRQXzBuLCBkUF8wdCwgZEZpbHRfYnMKLSAgICAgICAgVkJJVCAgICAgICAgZFFfMG4sIGRRXzB0LCBkRmlsdF9icwotCi0gICAgICAgIDsvLyBSZXN1bHQgU3RvcmFnZQotICAgICAgICBBREQgICAgICAgICBwU3JjRHN0X1AsIHBTcmNEc3QsICMzCi0gICAgICAgIFZCSUYgICAgICAgIGRQXzBuLCBkUF8wLCBkRmlsdCAgICAgIAotICAgICAgICAKLSAgICAgICAgQUREICAgICAgICAgcFRtcDIsIHBTcmNEc3RfUCwgc3JjZHN0U3RlcAotICAgICAgICBBREQgICAgICAgICBzdGVwLCBzcmNkc3RTdGVwLCBzcmNkc3RTdGVwCi0gICAgICAgIFZCSUYgICAgICAgIGRRXzBuLCBkUV8wLCBkRmlsdCAgCi0KLSAgICAgICAgQUREUyAgICAgICAgWFksIFhZLCBYWQotICAgICAgICAKLSAgICAgICAgVlNUMSAgICAgICAge2RQXzBuWzBdfSwgW3BTcmNEc3RfUF0sIHN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAge2RQXzBuWzFdfSwgW3BUbXAyXSwgc3RlcAotICAgICAgICBWU1QxICAgICAgICB7ZFBfMG5bMl19LCBbcFNyY0RzdF9QXSwgc3RlcAotICAgICAgICBWU1QxICAgICAgICB7ZFBfMG5bM119LCBbcFRtcDJdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgICAgIHtkUF8wbls0XX0sIFtwU3JjRHN0X1BdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgICAgIHtkUF8wbls1XX0sIFtwVG1wMl0sIHN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAge2RQXzBuWzZdfSwgW3BTcmNEc3RfUF0sIHN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAge2RQXzBuWzddfSwgW3BUbXAyXSwgc3RlcAotICAgICAgICAKLSAgICAgICAgQUREICAgICAgICAgcFNyY0RzdF9RLCBwU3JjRHN0LCAjNAotICAgICAgICBBREQgICAgICAgICBwVG1wLCBwU3JjRHN0X1EsIHNyY2RzdFN0ZXAKLSAgICAgICAgCi0gICAgICAgIFZTVDEgICAgICAgIHtkUV8wblswXX0sIFtwU3JjRHN0X1FdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgICAgIHtkUV8wblsxXX0sIFtwVG1wXSwgc3RlcAotICAgICAgICBWU1QxICAgICAgICB7ZFFfMG5bMl19LCBbcFNyY0RzdF9RXSwgc3RlcAotICAgICAgICBWU1QxICAgICAgICB7ZFFfMG5bM119LCBbcFRtcF0sIHN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAge2RRXzBuWzRdfSwgW3BTcmNEc3RfUV0sIHN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAge2RRXzBuWzVdfSwgW3BUbXBdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgICAgIHtkUV8wbls2XX0sIFtwU3JjRHN0X1FdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgICAgIHtkUV8wbls3XX0sIFtwVG1wXSwgc3RlcAotICAgICAgICAKLSAgICAgICAgQUREICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgIzQKLQotICAgICAgICBCTkUgICAgICAgICBMb29wWSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBNT1YgICAgICAgICByMCwgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgCi0gICAgICAgIE1fRVhJVAotICAgICAgICAKLU5vRmlsdGVyQlMwCi0gICAgICAgIFZMRDEgICAgICAgIHtkQWxwaGFbXX0sIFtwQWxwaGFdCi0gICAgICAgIEFERCAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsICM0Ci0gICAgICAgIFNVQiAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIExTTCAjMwotICAgICAgICBBRERTICAgICAgICBYWSwgWFksIFhZCi0gICAgICAgIFZMRDEgICAgICAgIHtkQmV0YVtdfSwgW3BCZXRhXQotICAgICAgICBBREQgICAgICAgICBwVGhyZXNob2xkcywgcFRocmVzaG9sZHMsICM0Ci0gICAgICAgIEJORSAgICAgICAgIExvb3BZICAgICAgICAKLQotICAgICAgICBNT1YgICAgICAgICByMCwgI09NWF9TdHNfTm9FcnIKLQotICAgICAgICBNX0VORAotICAgICAgICAKLSAgICAgICAgRU5ESUYKLQotCi0gICAgICAgIEVORAotICAgICAgICAKLSAgICAgICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0lfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Njc4NjcwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0lfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMzAyICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSV9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICAxMjI5MAotOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotCi0gICAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKLQotICAgICAgICBJTVBPUlQgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0xUNF91bnNhZmUKLSAgICAgICAgSU1QT1JUICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNHRTRfdW5zYWZlCi0KLSAgICAgICAgSUYgQ29ydGV4QTgKLQotTE9PUF9DT1VOVCAgRVFVIDB4NTUwMDAwMDAKLQotCi07Ly8gRnVuY3Rpb24gYXJndW1lbnRzCi0KLXBTcmNEc3QgICAgIFJOIDAKLXNyY2RzdFN0ZXAgIFJOIDEKLXBBbHBoYSAgICAgIFJOIDIKLXBCZXRhICAgICAgIFJOIDMKLQotcFRocmVzaG9sZHMgUk4gNQotcEJTICAgICAgICAgUk4gNAotYlMxMCAgICAgICAgUk4gMTIKLQotcEFscGhhXzAgICAgUk4gMgotcEJldGFfMCAgICAgUk4gMwotCi1wQWxwaGFfMSAgICBSTiA3Ci1wQmV0YV8xICAgICBSTiA4Ci0KLQotCi07Ly8gTG9vcCAKLQotWFkgICAgICAgICAgUk4gOQotCi1wVG1wICAgICAgICBSTiA2Ci1zdGVwICAgICAgICBSTiAxMAotCi07Ly8gUGl4ZWxzCi1kUF8wICAgICAgICBETiBENC5VOAotZFBfMSAgICAgICAgRE4gRDUuVTggIAotZFBfMiAgICAgICAgRE4gRDYuVTggIAotZFBfMyAgICAgICAgRE4gRDcuVTggIAotZFFfMCAgICAgICAgRE4gRDguVTggIAotZFFfMSAgICAgICAgRE4gRDkuVTggIAotZFFfMiAgICAgICAgRE4gRDEwLlU4IAotZFFfMyAgICAgICAgRE4gRDExLlU4IAotCi0KLTsvLyBGaWx0ZXJpbmcgRGVjaXNpb24KLWRBbHBoYSAgICAgIEROIEQwLlU4Ci1kQmV0YSAgICAgICBETiBEMi5VOAotCi1kRmlsdCAgICAgICBETiBEMTYuVTgKLWRBcWZsZyAgICAgIEROIEQxMi5VOAotZEFwZmxnICAgICAgRE4gRDE3LlU4IAotCi1kQXAwcTAgICAgICBETiBEMTMuVTgKLWRBcDFwMCAgICAgIEROIEQxMi5VOAotZEFxMXEwICAgICAgRE4gRDE4LlU4Ci1kQXAycDAgICAgICBETiBEMTkuVTgKLWRBcTJxMCAgICAgIEROIEQxNy5VOAotCi07Ly8gYlNMVDQKLWRUQzAgICAgICAgIEROIEQxOC5VOCAgIAotZFRDMSAgICAgICAgRE4gRDE5LlU4ICAgCi1kVEMwMSAgICAgICBETiBEMTguVTggICAKLQotZFRDcyAgICAgICAgRE4gRDMxLlM4Ci1kVEMgICAgICAgICBETiBEMzEuVTgKLQotZE1hc2tfMCAgICAgRE4gRDE0LlU4Ci1kTWFza18xICAgICBETiBEMTUuVTggICAgCi0KLU1hc2tfMCAgICAgIFJOIDExCi0KLWRUZW1wICAgICAgIEROIEQxOS5VOAotCi07Ly8gQ29tcHV0aW5nIFAwLFEwCi1xRHEwcDAgICAgICBRTiBRMTAuUzE2Ci1xRHAxcTEgICAgICBRTiBRMTEuUzE2Ci1xRGVsdGEgICAgICBRTiBRMTAuUzE2ICA7IHJldXNlIHFEcTBwMAotZERlbHRhICAgICAgRE4gRDIwLlM4Ci0KLQotOy8vIENvbXB1dGluZyBQMSxRMQotZFJwMHEwICAgICAgRE4gRDI0LlU4Ci0KLWRNYXhQICAgICAgIEROIEQyMy5VOAotZE1pblAgICAgICAgRE4gRDIyLlU4Ci0KLWRNYXhRICAgICAgIEROIEQxOS5VOAotZE1pblEgICAgICAgRE4gRDIxLlU4Ci0KLWREZWx0YVAgICAgIEROIEQyNi5VOAotZERlbHRhUSAgICAgRE4gRDI3LlU4Ci0KLXFQXzBuICAgICAgIFFOIFExNC5TMTYKLXFRXzBuICAgICAgIFFOIFExMi5TMTYKLQotZFFfMG4gICAgICAgRE4gRDI0LlU4Ci1kUV8xbiAgICAgICBETiBEMjUuVTgKLWRQXzBuICAgICAgIEROIEQyOS5VOAotZFBfMW4gICAgICAgRE4gRDMwLlU4Ci0KLTsvLyBiU0dFNAotCi1xU3AwcTAgICAgICBRTiBRMTAuVTE2Ci0KLXFTcDJxMSAgICAgIFFOIFExMS5VMTYKLXFTcDBxMHAxICAgIFFOIFExMi5VMTYKLXFTcDNwMiAgICAgIFFOIFExMy5VMTYKLWRIU3AwcTEgICAgIEROIEQyOC5VOAotCi1xU3EycDEgICAgICBRTiBRMTEuVTE2Ci1xU3AwcTBxMSAgICBRTiBRMTIuVTE2Ci1xU3EzcTIgICAgICBRTiBRMTMuVTE2ICA7ISEKLWRIU3EwcDEgICAgIEROIEQyOC5VOCAgIDshIQotCi1xVGVtcDEgICAgICBRTiBRMTEuVTE2ICA7ISE7cVNwMnExIAotcVRlbXAyICAgICAgUU4gUTEyLlUxNiAgOyEhO3FTcDBxMHAxICAgICAgICAKLQotZFBfMHQgICAgICAgRE4gRDI4LlU4ICAgOyEhO2RIU3AwcTEgICAgICAgIAotZFFfMHQgICAgICAgRE4gRDIyLlU4ICAgOyEhO1RlbXAxICAgICAgICAKLQotZFBfMG4gICAgICAgRE4gRDI5LlU4Ci1kUF8xbiAgICAgICBETiBEMzAuVTgKLWRQXzJuICAgICAgIEROIEQzMS5VOAotCi1kUV8wbiAgICAgICBETiBEMjQuVTggICA7ISE7VGVtcDIgICAgICAgIAotZFFfMW4gICAgICAgRE4gRDI1LlU4ICAgOyEhO1RlbXAyICAgICAgICAKLWRRXzJuICAgICAgIEROIEQyOC5VOCAgIDshITtkUV8wdCAgICAgICAgCi0KLSAgICAgICAgCi0gICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSSwgcjExLCBkMTUKLSAgICAgICAgCi0gICAgICAgIDsvL0FyZ3VtZW50cyBvbiB0aGUgc3RhY2sKLSAgICAgICAgTV9BUkcgICBwcFRocmVzaG9sZHMsIDQKLSAgICAgICAgTV9BUkcgICBwcEJTLCA0Ci0gICAgICAgIAotICAgICAgICA7Ly8gZDAtZEFscGhhXzAKLSAgICAgICAgOy8vIGQyLWRCZXRhXzAKLQotICAgICAgICBBREQgICAgICAgICBwQWxwaGFfMSwgcEFscGhhXzAsICMxCi0gICAgICAgIEFERCAgICAgICAgIHBCZXRhXzEsIHBCZXRhXzAsICMxCi0gICAgICAgIAotICAgICAgICBWTEQxICAgICAgICB7ZEFscGhhW119LCBbcEFscGhhXzBdCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIExTTCAjMgotICAgICAgICBWTEQxICAgICAgICB7ZEJldGFbXX0sIFtwQmV0YV8wXSAKLSAgICAgICAgCi0gICAgICAgIE1fTERSICAgICAgIHBCUywgcHBCUwotICAgICAgICBNX0xEUiAgICAgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzIAotCi0gICAgICAgIE1PViAgICAgICAgIE1hc2tfMCwjMAotCi0gICAgICAgIDtkTWFza18wLTE0Ci0gICAgICAgIDtkTWFza18xLTE1Ci0KLSAgICAgICAgVk1PViAgICAgICAgZE1hc2tfMCwgIzAgICAgIAotICAgICAgICBWTU9WICAgICAgICBkTWFza18xLCAjMSAgICAgCi0gICAgICAgIAotICAgICAgICBBREQgICAgICAgICBzdGVwLCBzcmNkc3RTdGVwLCBzcmNkc3RTdGVwCi0KLSAgICAgICAgTERSICAgICAgICAgWFksPUxPT1BfQ09VTlQKLQotICAgICAgICA7Ly8gcDAtcDMgLSBkNC1kNwotICAgICAgICA7Ly8gcTAtcTMgLSBkOC1kMTEKLUxvb3BZICAgICAgICAKLUxvb3BYICAgICAgICAKLSAgICAgICAgTERSSCAgICAgICAgYlMxMCwgW3BCU10sICMyCi0gICAgICAgIEFERCAgICAgICAgIHBUbXAsIHBTcmNEc3QsIHNyY2RzdFN0ZXAKLSAgICAgICAgQ01QICAgICAgICAgYlMxMCwgIzAKLSAgICAgICAgQkVRICAgICAgICAgTm9GaWx0ZXJCUzAKLQotICAgICAgICBWTEQxICAgICAgICBkUF8zLCBbcFNyY0RzdF0sIHN0ZXAKLSAgICAgICAgVkxEMSAgICAgICAgZFBfMiwgW3BUbXBdLCBzdGVwCi0gICAgICAgIFZMRDEgICAgICAgIGRQXzEsIFtwU3JjRHN0XSwgc3RlcAotICAgICAgICBWTEQxICAgICAgICBkUF8wLCBbcFRtcF0sIHN0ZXAKLSAgICAgICAgVkxEMSAgICAgICAgZFFfMCwgW3BTcmNEc3RdLCBzdGVwCi0gICAgICAgIFZBQkQgICAgICAgIGRBcDFwMCwgZFBfMCwgZFBfMQotICAgICAgICBWTEQxICAgICAgICBkUV8xLCBbcFRtcF0KLSAgICAgICAgVkFCRCAgICAgICAgZEFwMHEwLCBkUV8wLCBkUF8wCi0gICAgICAgIFZMRDEgICAgICAgIGRRXzIsIFtwU3JjRHN0XSwgc3JjZHN0U3RlcAotICAgICAgICAKLSAgICAgICAgVkFCRCAgICAgICAgZEFxMXEwLCBkUV8xLCBkUV8wCi0gICAgICAgIFZBQkQgICAgICAgIGRBcDJwMCwgZFBfMiwgZFBfMAotICAgICAgICBWQ0dUICAgICAgICBkRmlsdCwgZEFscGhhLCBkQXAwcTAKLQotICAgICAgICBUU1QgICAgICAgICBiUzEwLCAjMHhmZgotICAgICAgICBWTUFYICAgICAgICBkQXAxcDAsIGRBcTFxMCwgZEFwMXAwCi0gICAgICAgIFZBQkQgICAgICAgIGRBcTJxMCwgZFFfMiwgZFFfMAotCi0gICAgICAgIFZNT1ZFUS5VMzIgIGRGaWx0WzBdLCBNYXNrXzAKLSAgICAgICAgVFNUICAgICAgICAgYlMxMCwgIzB4ZmYwMAotCi0gICAgICAgIFZDR1QgICAgICAgIGRBcDJwMCwgZEJldGEsIGRBcDJwMAotICAgICAgICBWQ0dUICAgICAgICBkQXAxcDAsIGRCZXRhLCBkQXAxcDAKLQotICAgICAgICBWTU9WRVEuVTMyICBkRmlsdFsxXSwgTWFza18wCi0KLSAgICAgICAgVkNHVCAgICAgICAgZEFxMnEwLCBkQmV0YSwgZEFxMnEwCi0gICAgICAgIFZMRDEgICAgICAgIGRRXzMsIFtwU3JjRHN0XQotICAgICAgICBWQU5EICAgICAgICBkRmlsdCwgZEZpbHQsIGRBcDFwMAotICAgICAgICBUU1QgICAgICAgICBiUzEwLCAjNCAKLQotICAgICAgICBWQU5EICAgICAgICBkQXFmbGcsIGRGaWx0LCBkQXEycTAKLSAgICAgICAgVkFORCAgICAgICAgZEFwZmxnLCBkRmlsdCwgZEFwMnAwCi0gICAgCi0gICAgICAgIEJORSAgICAgICAgIGJTR0U0ICAgICAgICAKLWJTTFQ0Ci0gICAgICAgIDsvLyBiUyA8IDQgRmlsdGVyaW5nCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIExTTCAjMgotICAgICAgICBTVUIgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCBzcmNkc3RTdGVwCi0KLSAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTTFQ0X3Vuc2FmZQotCi0gICAgICAgIDsvLyBSZXN1bHQgU3RvcmFnZQotICAgICAgICBWU1QxICAgICAgICBkUF8xbiwgW3BTcmNEc3RdLCBzcmNkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGRQXzBuLCBbcFNyY0RzdF0sIHNyY2RzdFN0ZXAKLSAgICAgICAgU1VCICAgICAgICAgcFRtcCwgcFNyY0RzdCwgc3JjZHN0U3RlcCwgTFNMICMyCi0gICAgICAgIFZTVDEgICAgICAgIGRRXzBuLCBbcFNyY0RzdF0sIHNyY2RzdFN0ZXAKLSAgICAgICAgQUREUyAgICAgICAgWFksIFhZLCBYWQotICAgICAgICBWU1QxICAgICAgICBkUV8xbiwgW3BTcmNEc3RdCi0gICAgICAgIEFERCAgICAgICAgIHBTcmNEc3QsIHBUbXAsICM4Ci0KLSAgICAgICAgQkNDICAgICAgICAgTG9vcFgKLSAgICAgICAgQiAgICAgICAgICAgRXhpdExvb3BZICAgICAgICAKLQotTm9GaWx0ZXJCUzAKLSAgICAgICAgQUREICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgIzgKLSAgICAgICAgQUREUyAgICAgICAgWFksIFhZLCBYWQotICAgICAgICBBREQgICAgICAgICBwVGhyZXNob2xkcywgcFRocmVzaG9sZHMsICMyCi0gICAgICAgIEJDQyAgICAgICAgIExvb3BYCi0gICAgICAgIEIgICAgICAgICAgIEV4aXRMb29wWSAgICAgICAgCi1iU0dFNCAgICAgICAgCi0gICAgICAgIDsvLyBiUyA+PSA0IEZpbHRlcmluZwotICAgICAgICBTVUIgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCBzcmNkc3RTdGVwLCBMU0wgIzIKLSAgICAgICAgU1VCICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgc3JjZHN0U3RlcCwgTFNMICMxCi0gICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0dFNF91bnNhZmUKLQotICAgICAgICA7Ly8gUmVzdWx0IFN0b3JhZ2UKLSAgICAgICAgVlNUMSAgICAgICAgZFBfMm4sIFtwU3JjRHN0XSwgc3JjZHN0U3RlcAotICAgICAgICBWU1QxICAgICAgICBkUF8xbiwgW3BTcmNEc3RdLCBzcmNkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGRQXzBuLCBbcFNyY0RzdF0sIHNyY2RzdFN0ZXAKLSAgICAgICAgU1VCICAgICAgICAgcFRtcCwgcFNyY0RzdCwgc3JjZHN0U3RlcCwgTFNMICMyCi0gICAgICAgIFZTVDEgICAgICAgIGRRXzBuLCBbcFNyY0RzdF0sIHNyY2RzdFN0ZXAKLSAgICAgICAgQUREUyAgICAgICAgWFksWFksWFkKLSAgICAgICAgVlNUMSAgICAgICAgZFFfMW4sIFtwU3JjRHN0XSwgc3JjZHN0U3RlcAotICAgICAgICBBREQgICAgICAgICBwVGhyZXNob2xkcywgcFRocmVzaG9sZHMsICMyCi0gICAgICAgIFZTVDEgICAgICAgIGRRXzJuLCBbcFNyY0RzdF0KLSAgICAgICAgCi0gICAgICAgIEFERCAgICAgICAgIHBTcmNEc3QsIHBUbXAsICM4Ci0gICAgICAgIEJDQyAgICAgICAgIExvb3BYCi0KLUV4aXRMb29wWSAgICAgICAgCi0KLSAgICAgICAgU1VCICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgIzE2Ci0gICAgICAgIFZMRDEgICAgICAgIHtkQWxwaGFbXX0sIFtwQWxwaGFfMV0KLSAgICAgICAgQUREICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgc3JjZHN0U3RlcCwgTFNMICMyIAotICAgICAgICBWTEQxICAgICAgICB7ZEJldGFbXX0sIFtwQmV0YV8xXQotICAgICAgICBCTkUgICAgICAgICBMb29wWQotCi0gICAgICAgIE1PViAgICAgICAgIHIwLCAjT01YX1N0c19Ob0VycgotCi0gICAgICAgIE1fRU5ECi0gICAgICAgIAotICAgIEVORElGCi0gICAgCi0KLSAgICAgICAgCi0KLSAgICAgICAgRU5ECi0gICAgICAgIAotICAgICAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0lfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSV9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyYTEzNGUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSw0NTAgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDEyMjkwCi07Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0KLSAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAotCi0gICAgICAgIElNUE9SVCAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTTFQ0X3Vuc2FmZQotICAgICAgICBJTVBPUlQgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0dFNF91bnNhZmUKLSAgICAgICAgCi0gICAgICAgIElGIENvcnRleEE4Ci0KLUxPT1BfQ09VTlQgIEVRVSAweDExMDAwMDAwCi0KLQotOy8vIEZ1bmN0aW9uIGFyZ3VtZW50cwotCi1wU3JjRHN0ICAgICBSTiAwCi1zcmNkc3RTdGVwICBSTiAxCi1wQWxwaGEgICAgICBSTiAyCi1wQmV0YSAgICAgICBSTiAzCi0KLXBUaHJlc2hvbGRzIFJOIDUKLXBCUyAgICAgICAgIFJOIDQKLWJTMTAgICAgICAgIFJOIDEyCi0KLXBBbHBoYV8wICAgIFJOIDIKLXBCZXRhXzAgICAgIFJOIDMKLQotcEFscGhhXzEgICAgUk4gNwotcEJldGFfMSAgICAgUk4gOAotCi1wVG1wICAgICAgICBSTiAxMAotcFRtcFN0ZXAgICAgUk4gMTEKLQotOy8vIExvb3AgCi0KLVhZICAgICAgICAgIFJOIDkKLQotOy8vIFJvd3MgaW5wdXQKLWRSb3cwICAgICAgIEROIEQ3LlU4Ci1kUm93MSAgICAgICBETiBEOC5VOCAgCi1kUm93MiAgICAgICBETiBENS5VOCAgCi1kUm93MyAgICAgICBETiBEMTAuVTggIAotZFJvdzQgICAgICAgRE4gRDYuVTggIAotZFJvdzUgICAgICAgRE4gRDkuVTggIAotZFJvdzYgICAgICAgRE4gRDQuVTggCi1kUm93NyAgICAgICBETiBEMTEuVTggCi0KLTsvLyBkUm93MCAtIGRQXzMsIGRSb3cxIC0gZFFfMCwgZFJvdzIgLSBkUF8xLCBkUm93MyAtIGRRXzIKLTsvLyBkUm93NCAtIGRQXzIsIGRSb3c1IC0gZFFfMSwgZFJvdzYgLSBkUF8wLCBkUm93NyAtIGRRXzMKLQotOy8vIFJvd3Mgb3V0cHV0Ci1kUm93bjAgICAgICBETiBENy5VOAotZFJvd24xICAgICAgRE4gRDI0LlU4Ci1kUm93bjIgICAgICBETiBEMzAuVTgKLWRSb3duMyAgICAgIEROIEQxMC5VOAotZFJvd240ICAgICAgRE4gRDYuVTgKLWRSb3duNSAgICAgIEROIEQyNS5VOAotZFJvd242ICAgICAgRE4gRDI5LlU4Ci1kUm93bjcgICAgICBETiBEMTEuVTgKLQotOy8vIGRQXzBuICAgICAgIEROIEQyOS5VOAotOy8vIGRQXzFuICAgICAgIEROIEQzMC5VOAotOy8vIGRQXzJuICAgICAgIEROIEQzMS5VOAotOy8vIAotOy8vIGRRXzBuICAgICAgIEROIEQyNC5VOCAgIDshITtUZW1wMiAgICAgICAgCi07Ly8gZFFfMW4gICAgICAgRE4gRDI1LlU4ICAgOyEhO1RlbXAyICAgICAgICAKLTsvLyBkUV8ybiAgICAgICBETiBEMjguVTggICA7ISE7ZFFfMHQgICAgICAgIAotOy8vIAotOy8vIGRSb3duMCAtIGRQXzMsICBkUm93bjEgLSBkUV8wbgotOy8vIGRSb3duMiAtIGRQXzFuLCBkUm93bjMgLSBkUV8yCi07Ly8gZFJvd240IC0gZFBfMiwgIGRSb3duNSAtIGRRXzFuCi07Ly8gZFJvd242IC0gZFBfMG4sIGRSb3duNyAtIGRRXzMKLQotZFJvdzBuICAgICAgRE4gRDcuVTgKLWRSb3cxbiAgICAgIEROIEQyNC5VOAotZFJvdzJuICAgICAgRE4gRDMwLlU4Ci1kUm93M24gICAgICBETiBEMjguVTgKLWRSb3c0biAgICAgIEROIEQzMS5VOAotZFJvdzVuICAgICAgRE4gRDI1LlU4Ci1kUm93Nm4gICAgICBETiBEMjkuVTgKLWRSb3c3biAgICAgIEROIEQxMS5VOAotCi07Ly8gZFJvdzBuIC0gZFBfMywgZFJvdzFuIC0gZFFfMG4sIGRSb3cybiAtIGRQXzFuLCBkUm93M24gLSBkUV8ybgotOy8vIGRSb3c0biAtIGRQXzIsIGRSb3c1biAtIGRRXzFuLCBkUm93Nm4gLSBkUF8wbiwgZFJvdzduIC0gZFFfMwotCi07Ly8gUGl4ZWxzCi1kUF8wICAgICAgICBETiBENC5VOAotZFBfMSAgICAgICAgRE4gRDUuVTggIAotZFBfMiAgICAgICAgRE4gRDYuVTggIAotZFBfMyAgICAgICAgRE4gRDcuVTggIAotZFFfMCAgICAgICAgRE4gRDguVTggIAotZFFfMSAgICAgICAgRE4gRDkuVTggIAotZFFfMiAgICAgICAgRE4gRDEwLlU4IAotZFFfMyAgICAgICAgRE4gRDExLlU4IAotCi0KLTsvLyBGaWx0ZXJpbmcgRGVjaXNpb24KLWRBbHBoYSAgICAgIEROIEQwLlU4Ci1kQmV0YSAgICAgICBETiBEMi5VOAotCi1kRmlsdCAgICAgICBETiBEMTYuVTgKLWRBcWZsZyAgICAgIEROIEQxMi5VOAotZEFwZmxnICAgICAgRE4gRDE3LlU4IAotCi1kQXAwcTAgICAgICBETiBEMTMuVTgKLWRBcDFwMCAgICAgIEROIEQxMi5VOAotZEFxMXEwICAgICAgRE4gRDE4LlU4Ci1kQXAycDAgICAgICBETiBEMTkuVTgKLWRBcTJxMCAgICAgIEROIEQxNy5VOAotCi07Ly8gYlNMVDQKLWRUQzAgICAgICAgIEROIEQxOC5VOCAgIAotZFRDMSAgICAgICAgRE4gRDE5LlU4ICAgCi1kVEMwMSAgICAgICBETiBEMTguVTggICAKLQotZFRDcyAgICAgICAgRE4gRDMxLlM4Ci1kVEMgICAgICAgICBETiBEMzEuVTgKLQotZE1hc2tfMCAgICAgRE4gRDE0LlU4Ci1kTWFza18xICAgICBETiBEMTUuVTggICAgCi0KLU1hc2tfMCAgICAgIFJOIDYKLQotZFRlbXAgICAgICAgRE4gRDE5LlU4Ci0KLTsvLyBDb21wdXRpbmcgUDAsUTAKLXFEcTBwMCAgICAgIFFOIFExMC5TMTYKLXFEcDFxMSAgICAgIFFOIFExMS5TMTYKLXFEZWx0YSAgICAgIFFOIFExMC5TMTYgIDsgcmV1c2UgcURxMHAwCi1kRGVsdGEgICAgICBETiBEMjAuUzgKLQotCi07Ly8gQ29tcHV0aW5nIFAxLFExCi1kUnAwcTAgICAgICBETiBEMjQuVTgKLQotZE1heFAgICAgICAgRE4gRDIzLlU4Ci1kTWluUCAgICAgICBETiBEMjIuVTgKLQotZE1heFEgICAgICAgRE4gRDE5LlU4Ci1kTWluUSAgICAgICBETiBEMjEuVTgKLQotZERlbHRhUCAgICAgRE4gRDI2LlU4Ci1kRGVsdGFRICAgICBETiBEMjcuVTgKLQotcVBfMG4gICAgICAgUU4gUTE0LlMxNgotcVFfMG4gICAgICAgUU4gUTEyLlMxNgotCi1kUV8wbiAgICAgICBETiBEMjQuVTgKLWRRXzFuICAgICAgIEROIEQyNS5VOAotZFBfMG4gICAgICAgRE4gRDI5LlU4Ci1kUF8xbiAgICAgICBETiBEMzAuVTgKLQotOy8vIGJTR0U0Ci0KLXFTcDBxMCAgICAgIFFOIFExMC5VMTYKLQotcVNwMnExICAgICAgUU4gUTExLlUxNgotcVNwMHEwcDEgICAgUU4gUTEyLlUxNgotcVNwM3AyICAgICAgUU4gUTEzLlUxNgotZEhTcDBxMSAgICAgRE4gRDI4LlU4Ci0KLXFTcTJwMSAgICAgIFFOIFExMS5VMTYKLXFTcDBxMHExICAgIFFOIFExMi5VMTYKLXFTcTNxMiAgICAgIFFOIFExMy5VMTYgIDshIQotZEhTcTBwMSAgICAgRE4gRDI4LlU4ICAgOyEhCi0KLXFUZW1wMSAgICAgIFFOIFExMS5VMTYgIDshITtxU3AycTEgCi1xVGVtcDIgICAgICBRTiBRMTIuVTE2ICA7ISE7cVNwMHEwcDEgICAgICAgIAotCi1kUF8wdCAgICAgICBETiBEMjguVTggICA7ISE7ZEhTcDBxMSAgICAgICAgCi1kUV8wdCAgICAgICBETiBEMjIuVTggICA7ISE7VGVtcDEgICAgICAgIAotCi1kUF8wbiAgICAgICBETiBEMjkuVTgKLWRQXzFuICAgICAgIEROIEQzMC5VOAotZFBfMm4gICAgICAgRE4gRDMxLlU4Ci0KLWRRXzBuICAgICAgIEROIEQyNC5VOCAgIDshITtUZW1wMiAgICAgICAgCi1kUV8xbiAgICAgICBETiBEMjUuVTggICA7ISE7VGVtcDIgICAgICAgIAotZFFfMm4gICAgICAgRE4gRDI4LlU4ICAgOyEhO2RRXzB0ICAgICAgICAKLQotICAgICAgICAKLSAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgotICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JLCByMTEsIGQxNQotICAgICAgICAKLSAgICAgICAgOy8vQXJndW1lbnRzIG9uIHRoZSBzdGFjawotICAgICAgICBNX0FSRyAgIHBwVGhyZXNob2xkcywgNAotICAgICAgICBNX0FSRyAgIHBwQlMsIDQKLSAgICAgICAgCi0gICAgICAgIDsvLyBkMC1kQWxwaGFfMAotICAgICAgICA7Ly8gZDItZEJldGFfMAotCi0gICAgICAgIEFERCAgICAgICAgIHBBbHBoYV8xLCBwQWxwaGFfMCwgIzEKLSAgICAgICAgQUREICAgICAgICAgcEJldGFfMSwgcEJldGFfMCwgIzEKLSAgICAgICAgCi0gICAgICAgIFZMRDEgICAgICAgIHtkQWxwaGFbXX0sIFtwQWxwaGFfMF0KLSAgICAgICAgU1VCICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgIzQKLSAgICAgICAgVkxEMSAgICAgICAge2RCZXRhW119LCBbcEJldGFfMF0gCi0gICAgICAgIAotICAgICAgICBNX0xEUiAgICAgICBwQlMsIHBwQlMKLSAgICAgICAgTV9MRFIgICAgICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcyAKLQotICAgICAgICBNT1YgICAgICAgICBNYXNrXzAsIzAKLQotICAgICAgICA7ZE1hc2tfMC0xNAotICAgICAgICA7ZE1hc2tfMS0xNQotCi0gICAgICAgIFZNT1YgICAgICAgIGRNYXNrXzAsICMwICAgICAKLSAgICAgICAgVk1PViAgICAgICAgZE1hc2tfMSwgIzEgICAgIAotCi0gICAgICAgIExEUiAgICAgICAgIFhZLD1MT09QX0NPVU5UCi0gICAgCi0gICAgICAgIEFERCAgICAgICAgIHBUbXBTdGVwLCBzcmNkc3RTdGVwLCBzcmNkc3RTdGVwCi0KLSAgICAgICAgOy8vIHAwLXAzIC0gZDQtZDcKLSAgICAgICAgOy8vIHEwLXEzIC0gZDgtZDExCi1Mb29wWSAgICAgICAgCi1Mb29wWCAgICAgICAgCi0gICAgICAgIExEUkggICAgICAgIGJTMTAsIFtwQlNdLCAjNAotCi0gICAgICAgIENNUCAgICAgICAgIGJTMTAsICMwCi0gICAgICAgIEJFUSAgICAgICAgIE5vRmlsdGVyQlMwCi0KLSAgICAgICAgOy8vIExvYWQgOCByb3dzIG9mIGRhdGEKLSAgICAgICAgQUREICAgICAgICAgcFRtcCwgcFNyY0RzdCwgc3JjZHN0U3RlcAotICAgICAgICBWTEQxICAgICAgICBkUm93MCwgW3BTcmNEc3RdLCBwVG1wU3RlcAotICAgICAgICBWTEQxICAgICAgICBkUm93MSwgW3BUbXBdLCBwVG1wU3RlcAotICAgICAgICBWTEQxICAgICAgICBkUm93MiwgW3BTcmNEc3RdLCBwVG1wU3RlcAotICAgICAgICBWWklQLjggICAgICBkUm93MCwgZFJvdzEKLSAgICAgICAgVkxEMSAgICAgICAgZFJvdzMsIFtwVG1wXSwgcFRtcFN0ZXAKLSAgICAgICAgVkxEMSAgICAgICAgZFJvdzQsIFtwU3JjRHN0XSwgcFRtcFN0ZXAKLSAgICAgICAgVlpJUC44ICAgICAgZFJvdzIsIGRSb3czCi0gICAgICAgIFZMRDEgICAgICAgIGRSb3c1LCBbcFRtcF0sIHBUbXBTdGVwCi0gICAgICAgIFZMRDEgICAgICAgIGRSb3c2LCBbcFNyY0RzdF0sIHBUbXBTdGVwCi0gICAgICAgIFZMRDEgICAgICAgIGRSb3c3LCBbcFRtcF0sIHBUbXBTdGVwCi0gICAgICAgIFZaSVAuOCAgICAgIGRSb3c0LCBkUm93NQotICAgICAgICBWWklQLjE2ICAgICBkUm93MSwgZFJvdzMKLSAgICAKLQotICAgICAgICA7Ly8gZFJvdzAgPSBbcTNyMCBxMnIwIHExcjAgcTByMCBwMHIwIHAxcjAgcDJyMCBwM3IwXQotICAgICAgICA7Ly8gZFJvdzEgPSBbcTNyMSBxMnIxIHExcjEgcTByMSBwMHIxIHAxcjEgcDJyMSBwM3IxXQotICAgICAgICA7Ly8gZFJvdzIgPSBbcTNyMiBxMnIyIHExcjIgcTByMiBwMHIyIHAxcjIgcDJyMiBwM3IyXQotICAgICAgICA7Ly8gZFJvdzMgPSBbcTNyMyBxMnIzIHExcjMgcTByMyBwMHIzIHAxcjMgcDJyMyBwM3IzXQotICAgICAgICA7Ly8gZFJvdzQgPSBbcTNyNCBxMnI0IHExcjQgcTByNCBwMHI0IHAxcjQgcDJyNCBwM3I0XQotICAgICAgICA7Ly8gZFJvdzUgPSBbcTNyNSBxMnI1IHExcjUgcTByNSBwMHI1IHAxcjUgcDJyNSBwM3I1XQotICAgICAgICA7Ly8gZFJvdzYgPSBbcTNyNiBxMnI2IHExcjYgcTByNiBwMHI2IHAxcjYgcDJyNiBwM3I2XQotICAgICAgICA7Ly8gZFJvdzcgPSBbcTNyNyBxMnI3IHExcjcgcTByNyBwMHI3IHAxcjcgcDJyNyBwM3I3XQotCi0gICAgICAgIDsvLyA4eDggVHJhbnNwb3NlCi0KLSAgICAgICAgVlpJUC44ICAgICAgZFJvdzYsIGRSb3c3Ci0KLSAgICAgICAgU1VCICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgc3JjZHN0U3RlcCwgTFNMICMzCi0gICAgICAgIFZaSVAuMTYgICAgIGRSb3cwLCBkUm93MgotICAgICAgICBWWklQLjE2ICAgICBkUm93NSwgZFJvdzcKLSAgICAgICAgCi0KLSAgICAgICAgVlpJUC4xNiAgICAgZFJvdzQsIGRSb3c2Ci0gICAgICAgIFZaSVAuMzIgICAgIGRSb3cxLCBkUm93NQotICAgICAgICBWWklQLjMyICAgICBkUm93MiwgZFJvdzYKLSAgICAgICAgVlpJUC4zMiAgICAgZFJvdzMsIGRSb3c3Ci0gICAgICAgIFZaSVAuMzIgICAgIGRSb3cwLCBkUm93NAotICAgICAgICAKLQotICAgICAgICA7Ly8gZFJvdzAgLSBkUF8zLCBkUm93MSAtIGRRXzAsIGRSb3cyIC0gZFBfMSwgZFJvdzMgLSBkUV8yCi0gICAgICAgIDsvLyBkUm93NCAtIGRQXzIsIGRSb3c1IC0gZFFfMSwgZFJvdzYgLSBkUF8wLCBkUm93NyAtIGRRXzMKLQotICAgICAgICA7Ly8gZFFfMCA9IFtxMHI3IHEwcjYgcTByNSBxMHI0IHEwcjMgcTByMiBxMHIxIHEwcjBdCi0gICAgICAgIDsvLyBkUV8xID0gW3ExcjcgcTFyNiBxMXI1IHExcjQgcTFyMyBxMXIyIHExcjEgcTFyMF0KLSAgICAgICAgOy8vIGRRXzIgPSBbcTJyNyBxMnI2IHEycjUgcTJyNCBxMnIzIHEycjIgcTJyMSBxMnIwXQotICAgICAgICA7Ly8gZFFfMyA9IFtxM3I3IHEzcjYgcTNyNSBxM3I0IHEzcjMgcTNyMiBxM3IxIHEzcjBdCi0KLSAgICAgICAgOy8vIGRQXzAgPSBbcDByNyBwMHI2IHAwcjUgcDByNCBwMHIzIHAwcjIgcDByMSBwMHIwXQotICAgICAgICA7Ly8gZFBfMSA9IFtwMXI3IHAxcjYgcDFyNSBwMXI0IHAxcjMgcDFyMiBwMXIxIHAxcjBdCi0gICAgICAgIDsvLyBkUF8yID0gW3AycjcgcDJyNiBwMnI1IHAycjQgcDJyMyBwMnIyIHAycjEgcDJyMF0KLSAgICAgICAgOy8vIGRQXzMgPSBbcDNyNyBwM3I2IHAzcjUgcDNyNCBwM3IzIHAzcjIgcDNyMSBwM3IwXQotCi0gICAgICAgIFZBQkQgICAgICAgIGRBcDBxMCwgZFBfMCwgZFFfMAotICAgICAgICBWQUJEICAgICAgICBkQXAxcDAsIGRQXzEsIGRQXzAKLQotICAgICAgICBWQUJEICAgICAgICBkQXExcTAsIGRRXzEsIGRRXzAKLSAgICAgICAgVkFCRCAgICAgICAgZEFwMnAwLCBkUF8yLCBkUF8wCi0gICAgICAgIAotICAgICAgICBUU1QgICAgICAgICBiUzEwLCAjMHhmZgotICAgICAgICBWQ0dUICAgICAgICBkRmlsdCwgZEFscGhhLCBkQXAwcTAKLQotICAgICAgICBWTUFYICAgICAgICBkQXAxcDAsIGRBcTFxMCwgZEFwMXAwCi0gICAgICAgIFZBQkQgICAgICAgIGRBcTJxMCwgZFFfMiwgZFFfMAotCi0gICAgICAgIFZNT1ZFUS5VMzIgIGRGaWx0WzBdLCBNYXNrXzAKLSAgICAgICAgVFNUICAgICAgICAgYlMxMCwgIzB4ZmYwMAotCi0gICAgICAgIFZDR1QgICAgICAgIGRBcDJwMCwgZEJldGEsIGRBcDJwMAotICAgICAgICBWQ0dUICAgICAgICBkQXAxcDAsIGRCZXRhLCBkQXAxcDAKLQotICAgICAgICBWTU9WRVEuVTMyICBkRmlsdFsxXSwgTWFza18wCi0KLSAgICAgICAgVkNHVCAgICAgICAgZEFxMnEwLCBkQmV0YSwgZEFxMnEwCi0gICAgICAgIFZBTkQgICAgICAgIGRGaWx0LCBkRmlsdCwgZEFwMXAwCi0gICAgICAgIFRTVCAgICAgICAgIGJTMTAsICM0IAotCi0gICAgICAgIFZBTkQgICAgICAgIGRBcWZsZywgZEZpbHQsIGRBcTJxMAotICAgICAgICBWQU5EICAgICAgICBkQXBmbGcsIGRGaWx0LCBkQXAycDAKLSAgICAKLSAgICAgICAgQk5FICAgICAgICAgYlNHRTQgICAgICAgIAotYlNMVDQKLSAgICAgICAgOy8vIGJTIDwgNCBGaWx0ZXJpbmcKLQotICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNMVDRfdW5zYWZlCi0KLSAgICAgICAgOy8vIFRyYW5zcG9zZQotCi0gICAgICAgIFZaSVAuOCAgICAgIGRQXzMsICBkUF8yICAKLSAgICAgICAgVlpJUC44ICAgICAgZFBfMW4sIGRQXzBuCi0gICAgICAgIFZaSVAuOCAgICAgIGRRXzBuLCBkUV8xbgotICAgICAgICBWWklQLjggICAgICBkUV8yLCAgZFFfMwotCi0gICAgICAgIAotICAgICAgICBWWklQLjE2ICAgICBkUF8zLCAgZFBfMW4KLSAgICAgICAgQUREICAgICAgICAgcFRtcCwgcFNyY0RzdCwgc3JjZHN0U3RlcAotICAgICAgICBWWklQLjE2ICAgICBkUV8wbiwgZFFfMgotICAgICAgICBWWklQLjE2ICAgICBkUV8xbiwgZFFfMwotICAgICAgICBWWklQLjE2ICAgICBkUF8yLCAgZFBfMG4KLQotICAgICAgICBWWklQLjMyICAgICBkUF8zLCAgZFFfMG4KLSAgICAgICAgVlpJUC4zMiAgICAgZFBfMW4sIGRRXzIKLSAgICAgICAgVlpJUC4zMiAgICAgZFBfMiwgIGRRXzFuCi0gICAgICAgIFZaSVAuMzIgICAgIGRQXzBuLCBkUV8zCi0KLSAgICAgICAgOy8vIGRSb3duMCAtIGRQXzMsICBkUm93bjEgLSBkUV8wbgotICAgICAgICA7Ly8gZFJvd24yIC0gZFBfMW4sIGRSb3duMyAtIGRRXzIKLSAgICAgICAgOy8vIGRSb3duNCAtIGRQXzIsICBkUm93bjUgLSBkUV8xbgotICAgICAgICA7Ly8gZFJvd242IC0gZFBfMG4sIGRSb3duNyAtIGRRXzMKLQotICAgICAgICBWU1QxICAgICAgICBkUm93bjAsIFtwU3JjRHN0XSwgcFRtcFN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgZFJvd24xLCBbcFRtcF0sIHBUbXBTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGRSb3duMiwgW3BTcmNEc3RdLCBwVG1wU3RlcAotICAgICAgICBWU1QxICAgICAgICBkUm93bjMsIFtwVG1wXSwgcFRtcFN0ZXAKLSAgICAgICAgOzEKLSAgICAgICAgVlNUMSAgICAgICAgZFJvd240LCBbcFNyY0RzdF0sIHBUbXBTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGRSb3duNSwgW3BUbXBdLCBwVG1wU3RlcAotICAgICAgICBBRERTICAgICAgICBYWSwgWFksIFhZCi0gICAgICAgIFZTVDEgICAgICAgIGRSb3duNiwgW3BTcmNEc3RdLCBwVG1wU3RlcAotICAgICAgICBBREQgICAgICAgICBwVGhyZXNob2xkcywgcFRocmVzaG9sZHMsICMyCi0gICAgICAgIFZTVDEgICAgICAgIGRSb3duNywgW3BUbXBdLCBzcmNkc3RTdGVwCi0KLSAgICAgICAgU1VCICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgc3JjZHN0U3RlcCwgTFNMICMzCi0gICAgICAgIFZMRDEgICAgICAgIHtkQWxwaGFbXX0sIFtwQWxwaGFfMV0KLSAgICAgICAgQUREICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgIzQKLSAgICAgICAgVkxEMSAgICAgICAge2RCZXRhW119LCBbcEJldGFfMV0KLQotICAgICAgICBCQ0MgICAgICAgICBMb29wWAotICAgICAgICBCICAgICAgICAgICBFeGl0TG9vcFkgICAgICAgIAotCi1Ob0ZpbHRlckJTMAotICAgICAgICBBREQgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCAjNAotICAgICAgICBBRERTICAgICAgICBYWSwgWFksIFhZCi0gICAgICAgIFZMRDEgICAgICAgIHtkQWxwaGFbXX0sIFtwQWxwaGFfMV0KLSAgICAgICAgQUREICAgICAgICAgcFRocmVzaG9sZHMsIHBUaHJlc2hvbGRzLCAjNAotICAgICAgICBWTEQxICAgICAgICB7ZEJldGFbXX0sIFtwQmV0YV8xXQotICAgICAgICBCQ0MgICAgICAgICBMb29wWAotICAgICAgICBCICAgICAgICAgICBFeGl0TG9vcFkgICAgICAgIAotYlNHRTQgICAgICAgIAotICAgICAgICA7Ly8gYlMgPj0gNCBGaWx0ZXJpbmcKLSAgICAgICAgCi0gICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0dFNF91bnNhZmUKLQotICAgICAgICA7Ly8gVHJhbnNwb3NlCi0KLSAgICAgICAgVlpJUC44ICAgICAgZFBfMywgIGRQXzJuICAgCi0gICAgICAgIFZaSVAuOCAgICAgIGRQXzFuLCBkUF8wbgotICAgICAgICBWWklQLjggICAgICBkUV8wbiwgZFFfMW4KLSAgICAgICAgVlpJUC44ICAgICAgZFFfMm4sIGRRXzMKLQotICAgICAgICBWWklQLjE2ICAgICBkUF8zLCAgZFBfMW4KLSAgICAgICAgQUREICAgICAgICAgcFRtcCwgcFNyY0RzdCwgc3JjZHN0U3RlcAotICAgICAgICBWWklQLjE2ICAgICBkUV8wbiwgZFFfMm4KLSAgICAgICAgVlpJUC4xNiAgICAgZFFfMW4sIGRRXzMKLSAgICAgICAgVlpJUC4xNiAgICAgZFBfMm4sIGRQXzBuCi0KLSAgICAgICAgVlpJUC4zMiAgICAgZFBfMywgIGRRXzBuCi0gICAgICAgIFZaSVAuMzIgICAgIGRQXzFuLCBkUV8ybgotICAgICAgICBWWklQLjMyICAgICBkUF8ybiwgZFFfMW4KLSAgICAgICAgVlpJUC4zMiAgICAgZFBfMG4sIGRRXzMKLQotICAgICAgICA7Ly8gZFJvdzBuIC0gZFBfMywgZFJvdzFuIC0gZFFfMG4sIGRSb3cybiAtIGRQXzFuLCBkUm93M24gLSBkUV8ybgotICAgICAgICA7Ly8gZFJvdzRuIC0gZFBfMiwgZFJvdzVuIC0gZFFfMW4sIGRSb3c2biAtIGRQXzBuLCBkUm93N24gLSBkUV8zCi0gICAgICAgIAotICAgICAgICBWU1QxICAgICAgICBkUm93MG4sIFtwU3JjRHN0XSwgcFRtcFN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgZFJvdzFuLCBbcFRtcF0sIHBUbXBTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGRSb3cybiwgW3BTcmNEc3RdLCBwVG1wU3RlcAotICAgICAgICBWU1QxICAgICAgICBkUm93M24sIFtwVG1wXSwgcFRtcFN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgZFJvdzRuLCBbcFNyY0RzdF0sIHBUbXBTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGRSb3c1biwgW3BUbXBdLCBwVG1wU3RlcAotICAgICAgICBBRERTICAgICAgICBYWSxYWSxYWQotICAgICAgICBWU1QxICAgICAgICBkUm93Nm4sIFtwU3JjRHN0XSwgcFRtcFN0ZXAKLSAgICAgICAgQUREICAgICAgICAgcFRocmVzaG9sZHMsIHBUaHJlc2hvbGRzLCAjNAotICAgICAgICBWU1QxICAgICAgICBkUm93N24sIFtwVG1wXSwgcFRtcFN0ZXAKLQotICAgICAgICBTVUIgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCBzcmNkc3RTdGVwLCBMU0wgIzMKLSAgICAgICAgVkxEMSAgICAgICAge2RBbHBoYVtdfSwgW3BBbHBoYV8xXQotICAgICAgICBBREQgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCAjNAotICAgICAgICBWTEQxICAgICAgICB7ZEJldGFbXX0sIFtwQmV0YV8xXQotCi0gICAgICAgIEJDQyAgICAgICAgIExvb3BYCi0KLUV4aXRMb29wWSAgICAgICAgCi0gICAgICAgIFNVQiAgICAgICAgIHBCUywgcEJTLCAjMTQKLSAgICAgICAgU1VCICAgICAgICAgcFRocmVzaG9sZHMsIHBUaHJlc2hvbGRzLCAjMTQKLSAgICAgICAgU1VCICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgIzE2Ci0gICAgICAgIFZMRDEgICAgICAgIHtkQWxwaGFbXX0sIFtwQWxwaGFfMF0KLSAgICAgICAgQUREICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgc3JjZHN0U3RlcCwgTFNMICMzIAotICAgICAgICBWTEQxICAgICAgICB7ZEJldGFbXX0sIFtwQmV0YV8wXQotICAgICAgICBCTkUgICAgICAgICBMb29wWQotCi0gICAgICAgIE1PViAgICAgICAgIHIwLCAjT01YX1N0c19Ob0VycgotCi0gICAgICAgIE1fRU5ECi0gICAgICAgIAotICAgIEVORElGCi0gICAgCi0gICAgICAgIAotICAgICAgICBFTkQKLSAgICAgICAgCi0gICAgICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZiM2Y0MS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEuYworKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgMTIyOTAKLSAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIDEvOCBQaXhlbCBpbnRlcnBvbGF0aW9uIGZvciBDaHJvbWEgQmxvY2sKLSAqIAotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotCi0vKioKLSAqIEZ1bmN0aW9uOiBvbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLAotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgMS84LXBpeGVsIGludGVycG9sYXRpb24gZm9yIGludGVyIGNocm9tYSBNQi4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBTcmMJUG9pbnRlciB0byB0aGUgc291cmNlIHJlZmVyZW5jZSBmcmFtZSBidWZmZXIKLSAqIFtpbl0Jc3JjU3RlcCBSZWZlcmVuY2UgZnJhbWUgc3RlcCBpbiBieXRlCi0gKiBbaW5dCWRzdFN0ZXAgRGVzdGluYXRpb24gZnJhbWUgc3RlcCBpbiBieXRlLiBNdXN0IGJlIG11bHRpcGxlIG9mIHJvaS53aWR0aC4KLSAqIFtpbl0JZHgJCUZyYWN0aW9uYWwgcGFydCBvZiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgY29tcG9uZW50Ci0gKgkJCQkJCWluIDEvOCBwaXhlbCB1bml0O3ZhbGlkIGluIHRoZSByYW5nZSBbMCw3XQotICogW2luXQlkeQkJRnJhY3Rpb25hbCBwYXJ0IG9mIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgY29tcG9uZW50Ci0gKgkJCQkJCWluIDEvOCBwaXhlbCB1bml0O3ZhbGlkIGluIHRoZSByYW5nZSBbMCw3XQotICogW2luXQlyb2kJCURpbWVuc2lvbiBvZiB0aGUgaW50ZXJwb2xhdGlvbiByZWdpb247dGhlIHBhcmFtZXRlcnMgcm9pLndpZHRoIGFuZCByb2kuaGVpZ2h0IG11c3QKLSAqICAgICAgICAgICAgICAgICAgICAgIGJlIGVxdWFsIHRvIGVpdGhlciAyLCA0LCBvciA4LgotICogW291dF0JcERzdAlQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBmcmFtZSBidWZmZXIuCi0gKiAgICAgICAgICAgICAgICAgICBpZiByb2kud2lkdGg9PTIsICAyLWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkCi0gKiAgICAgICAgICAgICAgICAgICBpZiByb2kud2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkCi0gKiAgICAgICAgICAgICAgICAgICBpZiByb2kud2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLgotICogSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBPTVhfU3RzX0JhZEFyZ0VycjoKLSAqCXBTcmMgb3IgcERzdCBpcyBOVUxMLgotICoJc3JjU3RlcCBvciBkc3RTdGVwIDwgOC4KLSAqCWR4IG9yIGR5IGlzIG91dCBvZiByYW5nZSBbMC03XS4KLSAqCXJvaS53aWR0aCBvciByb2kuaGVpZ2h0IGlzIG91dCBvZiByYW5nZSB7Miw0LDh9LgotICoJcm9pLndpZHRoIGlzIGVxdWFsIHRvIDIsIGJ1dCBwRHN0IGlzIG5vdCAyLWJ5dGUgYWxpZ25lZC4KLSAqCXJvaS53aWR0aCBpcyBlcXVhbCB0byA0LCBidXQgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQuCi0gKglyb2kud2lkdGggaXMgZXF1YWwgdG8gOCwgYnV0IHBEc3QgaXMgbm90IDggYnl0ZSBhbGlnbmVkLgotICoJc3JjU3RlcCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hICgKLSAgICAgY29uc3QgT01YX1U4KiBwU3JjLAotICAgICBPTVhfUzMyIHNyY1N0ZXAsCi0gICAgIE9NWF9VOCogcERzdCwKLSAgICAgT01YX1MzMiBkc3RTdGVwLAotICAgICBPTVhfUzMyIGR4LAotICAgICBPTVhfUzMyIGR5LAotICAgICBPTVhTaXplIHJvaQotICkKLXsKLSAgICByZXR1cm4gYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEgCi0gICAgICAgICgoT01YX1U4KilwU3JjLCBzcmNTdGVwLCBwRHN0LCBkc3RTdGVwLCByb2kud2lkdGgsIHJvaS5oZWlnaHQsIGR4LCBkeSk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYV9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmOGY2OWUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1NjcgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDEyMjkwCi07Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotOy8vIEZ1bmN0aW9uOgotOy8vICAgICBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYQotOy8vCi07Ly8gVGhpcyBmdW5jdGlvbiBpbXBsZW1lbnRzIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hIGluIHY2IGFzc2VtYmx5LgotOy8vIFBlcmZvcm1zIHF1YXJ0ZXIgcGVsIGludGVycG9sYXRpb24gb2YgaW50ZXIgbHVtYSBNQi4KLTsvLyBJdCdzIGFzc3VtZWQgdGhhdCB0aGUgZnJhbWUgaXMgYWxyZWFkeSBwYWRkZWQgd2hlbiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCi07Ly8gUGFyYW1ldGVyczoKLTsvLyBbaW5dICAgIHBTcmMgICAgICAgIFBvaW50ZXIgdG8gdGhlIHNvdXJjZSByZWZlcmVuY2UgZnJhbWUgYnVmZmVyCi07Ly8gW2luXSAgICBzcmNTdGVwICAgICBSZWZlcmVuY2UgZnJhbWUgc3RlcCBpbiBieXRlCi07Ly8gW2luXSAgICBkc3RTdGVwICAgICBEZXN0aW5hdGlvbiBmcmFtZSBzdGVwIGluIGJ5dGUuIE11c3QgYmUgbXVsdGlwbGUgb2Ygcm9pLndpZHRoCi07Ly8gW2luXSAgICBkeCAgICAgICAgICBGcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yCi07Ly8gICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvNCBwaXhlbCB1bml0OyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsM10KLTsvLyBbaW5dICAgIGR5ICAgICAgICAgIEZyYWN0aW9uYWwgcGFydCBvZiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yCi07Ly8gICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvNCBwaXhlbCB1bml0OyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsM10KLTsvLyBbaW5dICAgIHJvaSAgICAgICAgIERpbWVuc2lvbiBvZiB0aGUgaW50ZXJwb2xhdGlvbiByZWdpb247dGhlIHBhcmFtZXRlcnMgcm9pLndpZHRoIGFuZCByb2kuaGVpZ2h0IG11c3QKLTsvLyAgICAgICAgICAgICAgICAgICAgICAgICBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuCi07Ly8gW291dF0gICBwRHN0ICAgICAgICBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBmcmFtZSBidWZmZXIuCi07Ly8gICAgICAgICAgICAgICAgICAgaWYgcm9pLndpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZAotOy8vICAgICAgICAgICAgICAgICAgIGlmIHJvaS53aWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQKLTsvLyAgICAgICAgICAgICAgICAgICBpZiByb2kud2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZAotOy8vCi07Ly8gUmV0dXJuIFZhbHVlOgotOy8vIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4KLTsvLyBJdCBpcyBhc3N1ZWQgdGhhdCBmb2xsb3dpbmcgY2FzZXMgYXJlIHNhdGlzZmllZCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uOgotOy8vICBwU3JjIG9yIHBEc3QgaXMgbm90IE5VTEwuCi07Ly8gIHNyY1N0ZXAgb3IgZHN0U3RlcCA+PSByb2kud2lkdGguCi07Ly8gICAgIGR4IG9yIGR5IGlzIGluIHRoZSByYW5nZSBbMC0zXS4KLTsvLyAgICAgcm9pLndpZHRoIG9yIHJvaS5oZWlnaHQgaXMgbm90IG91dCBvZiByYW5nZSB7NCwgOCwgMTZ9LgotOy8vICAgICBJZiByb2kud2lkdGggaXMgZXF1YWwgdG8gNCwgRHN0IGlzIDQgYnl0ZSBhbGlnbmVkLgotOy8vICAgICBJZiByb2kud2lkdGggaXMgZXF1YWwgdG8gOCwgcERzdCBpcyA4IGJ5dGUgYWxpZ25lZC4KLTsvLyAgICAgSWYgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDE2LCBwRHN0IGlzIDE2IGJ5dGUgYWxpZ25lZC4KLTsvLyAgICAgc3JjU3RlcCBhbmQgZHN0U3RlcCBpcyBtdWx0aXBsZSBvZiA4LgotOy8vCi07Ly8KLQotCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLQotICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4Ci0KLSAgICAgICAgRVhQT1JUIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hCi0gICAgICAgIAotCi0gICAgSUYgQ29ydGV4QTgKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCi0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZQotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlCi0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmUKLSAgICBFTkRJRgotICAgIAotICAgIAotCi07Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKLXBTcmMgICAgICAgICAgICBSTiAwCi1zcmNTdGVwICAgICAgICAgUk4gMQotcERzdCAgICAgICAgICAgIFJOIDIKLWRzdFN0ZXAgICAgICAgICBSTiAzCi1pSGVpZ2h0ICAgICAgICAgUk4gNAotaVdpZHRoICAgICAgICAgIFJOIDUKLQotOy8vIERlY2xhcmUgb3RoZXIgaW50ZXJtZWRpYXRlIHJlZ2lzdGVycwotaWR4ICAgICAgICAgICAgIFJOIDYKLWlkeSAgICAgICAgICAgICBSTiA3Ci1pbmRleCAgICAgICAgICAgUk4gNgotVGVtcCAgICAgICAgICAgIFJOIDEyCi1wQXJncyAgICAgICAgICAgUk4gMTEKLQotCi0gICAgSUYgQ29ydGV4QTgKLQotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIEludGVycG9sYXRpb24gb2YgbHVtYSBpcyBpbXBsZW1lbnRlZCBieSBwcm9jZXNzaW5nIGJsb2NrIG9mIHBpeGVscywgc2l6ZSA0eDQgYXQgYSB0aW1lLgotICAgICAgICA7Ly8KLSAgICAgICAgTV9BTExPQzQgICAgcHBBcmdzLCAxNgotICAgICAgICAKLSAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgotICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hLCByMTEsIGQxNQotCi1wU3JjQksgICAgICAgICAgUk4gOAotCi07Ly8gRGVjbGFyZSBOZW9uIHJlZ2lzdGVycwotZENvZWZmNSAgICAgICAgIEROIDMwLlMxNgotZENvZWZmMjAgICAgICAgIEROIDMxLlMxNgotCi07Ly8gUmVnaXN0ZXJzIHVzZWQgZm9yIGltcGxlbWVudGluZyBIb3Jpem9udGFsIGludGVycG9sYXRpb24KLWRTcmMwYyAgICAgICAgICBETiAxNC5VOAotZFNyYzFjICAgICAgICAgIEROIDE2LlU4Ci1kU3JjMmMgICAgICAgICAgRE4gMTguVTgKLWRTcmMzYyAgICAgICAgICBETiAyMC5VOCAgICAgICAgICAgICAgICAgICAKLWRTcmMwZCAgICAgICAgICBETiAxNS5VOAotZFNyYzFkICAgICAgICAgIEROIDE3LlU4Ci1kU3JjMmQgICAgICAgICAgRE4gMTkuVTgKLWRTcmMzZCAgICAgICAgICBETiAyMS5VOAotZEFjY0gwICAgICAgICAgIEROIDIyLlU4Ci1kQWNjSDEgICAgICAgICAgRE4gMjQuVTgKLWRBY2NIMiAgICAgICAgICBETiAyNi5VOAotZEFjY0gzICAgICAgICAgIEROIDI4LlU4Ci1kUmVzdWx0SDAgICAgICAgRE4gMjIuVTMyCi1kUmVzdWx0SDEgICAgICAgRE4gMjQuVTMyCi1kUmVzdWx0SDIgICAgICAgRE4gMjYuVTMyCi1kUmVzdWx0SDMgICAgICAgRE4gMjguVTMyCi0KLTsvLyBSZWdpc3RlcnMgdXNlZCBmb3IgaW1wbGVtZW50aW5nIFZlcnRpY2FsIGludGVycG9sYXRpb24KLWRTcmMwICAgICAgICAgICBETiA5LlU4Ci1kU3JjMSAgICAgICAgICAgRE4gMTAuVTgKLWRTcmMyICAgICAgICAgICBETiAxMS5VOAotZFNyYzMgICAgICAgICAgIEROIDEyLlU4Ci1kU3JjNCAgICAgICAgICAgRE4gMTMuVTgKLWRBY2NWMCAgICAgICAgICBETiAwLlU4Ci1kQWNjVjEgICAgICAgICAgRE4gMi5VOAotZEFjY1YyICAgICAgICAgIEROIDQuVTgKLWRBY2NWMyAgICAgICAgICBETiA2LlU4Ci1kUmVzdWx0VjAgICAgICAgRE4gMC5VMzIKLWRSZXN1bHRWMSAgICAgICBETiAyLlUzMgotZFJlc3VsdFYyICAgICAgIEROIDQuVTMyCi1kUmVzdWx0VjMgICAgICAgRE4gNi5VMzIKLSAgICAgICAgCi07Ly8gUmVnaXN0ZXJzIHVzZWQgZm9yIGltcGxlbWVudGluZyBEaWFnb25hbCBpbnRlcnBvbGF0aW9uCi1kVEFjYzAgICAgICAgICAgRE4gMC5VOAotZFRBY2MxICAgICAgICAgIEROIDIuVTgKLWRUQWNjMiAgICAgICAgICBETiA0LlU4Ci1kVEFjYzMgICAgICAgICAgRE4gNi5VOAotZFRSZXMwICAgICAgICAgIEROIDAuMzIKLWRUUmVzMSAgICAgICAgICBETiAyLjMyCi1kVFJlczIgICAgICAgICAgRE4gNC4zMgotZFRSZXMzICAgICAgICAgIEROIDYuMzIKLWRUUmVzdWx0MCAgICAgICBETiAxNC5VOAotZFRSZXN1bHQxICAgICAgIEROIDE2LlU4Ci1kVFJlc3VsdDIgICAgICAgRE4gMTguVTgKLWRUUmVzdWx0MyAgICAgICBETiAyMC5VOAotZFRlbXBQMCAgICAgICAgIEROIDE4LlMxNgotZFRlbXBQMSAgICAgICAgIEROIDE5LlMxNgotZFRlbXBRMCAgICAgICAgIEROIDIwLlMxNgotZFRlbXBRMSAgICAgICAgIEROIDIxLlMxNgotZFRlbXBSMCAgICAgICAgIEROIDIyLlMxNgotZFRlbXBSMSAgICAgICAgIEROIDIzLlMxNgotZFRlbXBTMCAgICAgICAgIEROIDI0LlMxNgotZFRlbXBTMSAgICAgICAgIEROIDI1LlMxNgotcVRlbXBQMDEgICAgICAgIFFOIDkuUzE2Ci1xVGVtcFEwMSAgICAgICAgUU4gMTAuUzE2Ci1xVGVtcFIwMSAgICAgICAgUU4gMTEuUzE2Ci1xVGVtcFMwMSAgICAgICAgUU4gMTIuUzE2Ci0KLTsvLyBJbnRlcm1lZGlhdGUgdmFsdWVzIGZvciBhdmVyYWdpbmcKLXFSZXMyICAgICAgICAgICBRTiA3LlMxNgotcVJlczMgICAgICAgICAgIFFOIDguUzE2Ci1xUmVzNCAgICAgICAgICAgUU4gOS5TMTYKLXFSZXM1ICAgICAgICAgICBRTiAxMC5TMTYKLXFSZXM2ICAgICAgICAgICBRTiAxMS5TMTYKLSAgICAgICAKLTsvLyBGb3IgaW1wbGVtZW50aW5nIGNvcHkKLWREc3QwICAgICAgICAgICAgRE4gOS4zMgotZERzdDEgICAgICAgICAgICBETiAxMC4zMgotZERzdDIgICAgICAgICAgICBETiAxMS4zMgotZERzdDMgICAgICAgICAgICBETiAxMi4zMgotCi0gICAgICAgIDsvLyBEZWZpbmUgc3RhY2sgYXJndW1lbnRzCi0gICAgICAgIE1fQVJHICAgICAgIHB0cmlkeCwgNAotICAgICAgICBNX0FSRyAgICAgICBwdHJpZHksIDQgICAgICAgIAotICAgICAgICBNX0FSRyAgICAgICBwdHJXaWR0aCwgNAotICAgICAgICBNX0FSRyAgICAgICBwdHJIZWlnaHQsIDQgICAgICAgIAotCi0gICAgICAgIDsvLyBMb2FkIHN0cnVjdHVyZSBlbGVtZW50cyBvZiByb2kgCi0gICAgICAgIE1fTERSICAgICAgIGlkeCwgcHRyaWR4Ci0gICAgICAgIE1fTERSICAgICAgIGlkeSwgcHRyaWR5Ci0gICAgICAgIE1fTERSICAgICAgIGlXaWR0aCwgcHRyV2lkdGgKLSAgICAgICAgTV9MRFIgICAgICAgaUhlaWdodCwgcHRySGVpZ2h0Ci0gICAgICAgIAotICAgICAgICBBREQgICAgICAgICBpbmRleCwgaWR4LCBpZHksIExTTCAjMiAgICAgICAgICAgICAgICAgOy8vICBbaW5kZXhdID0gW2lkeV1baWR4XQotICAgICAgICBNX0FEUiAgICAgICBwQXJncywgcHBBcmdzCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICA7Ly8gTW92ZSBjb2VmZmljaWVudHMgTmVvbiByZWdpc3RlcnMKLSAgICAgICAgVk1PViAgICAgICAgZENvZWZmMjAsICMyMAotICAgICAgICBWTU9WICAgICAgICBkQ29lZmY1LCAjNQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotQmxvY2s0eDRXaWR0aExvb3AKLUJsb2NrNHg0SGVpZ2h0TG9vcAotCi0gICAgICAgIFNUTSAgICAgICAgIHBBcmdzLCB7cFNyYyxzcmNTdGVwLHBEc3QsZHN0U3RlcH0gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgOy8vIHN3aXRjaCB0YWJsZSB1c2luZyBtb3Rpb24gdmVjdG9yIGFzIGluZGV4Ci0gICAgICAgIEFERCAgICAgICAgIHBjLCBwYywgaW5kZXgsIExTTCAjMgotICAgICAgICBCICAgICAgICAgICBDYXNlX2YKLSAgICAgICAgQiAgICAgICAgICAgQ2FzZV8wICAgICAgICAKLSAgICAgICAgQiAgICAgICAgICAgQ2FzZV8xICAgICAgICAKLSAgICAgICAgQiAgICAgICAgICAgQ2FzZV8yICAgICAgICAKLSAgICAgICAgQiAgICAgICAgICAgQ2FzZV8zICAgICAgICAKLSAgICAgICAgQiAgICAgICAgICAgQ2FzZV80ICAgICAgICAKLSAgICAgICAgQiAgICAgICAgICAgQ2FzZV81ICAgICAgICAKLSAgICAgICAgQiAgICAgICAgICAgQ2FzZV82ICAgICAgICAKLSAgICAgICAgQiAgICAgICAgICAgQ2FzZV83ICAgICAgICAKLSAgICAgICAgQiAgICAgICAgICAgQ2FzZV84ICAgICAgICAKLSAgICAgICAgQiAgICAgICAgICAgQ2FzZV85ICAgICAgICAKLSAgICAgICAgQiAgICAgICAgICAgQ2FzZV9hICAgICAgICAKLSAgICAgICAgQiAgICAgICAgICAgQ2FzZV9iICAgICAgICAKLSAgICAgICAgQiAgICAgICAgICAgQ2FzZV9jICAgICAgICAKLSAgICAgICAgQiAgICAgICAgICAgQ2FzZV9kCi0gICAgICAgIEIgICAgICAgICAgIENhc2VfZSAgICAgICAgCi0gICAgICAgIEIgICAgICAgICAgIENhc2VfZgotICAgICAgICAgICAgICAgICAgICAKLUNhc2VfMCAgICAgICAgICAgICAgICAKLSAgICAgICAgOy8vIENhc2UgRwotICAgICAgICBNX1BSSU5URiAiQ2FzZSAwIFxuIgotICAgICAgICAKLSAgICAgICAgOy8vIExvYWRzIGEgNHg0IGJsb2NrIG9mIC44IGFuZCBzdG9yZXMgYXMgLjMyCi0gICAgICAgIEFERCAgICAgICAgIFRlbXAsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMSAKLSAgICAgICAgVkxEMSAgICAgICAgZFNyYzAsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBWTEQxICAgICAgICBkU3JjMiwgW1RlbXBdLCBzcmNTdGVwCi0gICAgICAgIFZMRDEgICAgICAgIGRTcmMxLCBbcFNyY10KLSAgICAgICAgVkxEMSAgICAgICAgZFNyYzMsIFtUZW1wXQotICAgICAgICAKLSAgICAgICAgQUREICAgICAgICAgVGVtcCwgcERzdCwgZHN0U3RlcCwgTFNMICMxIAotICAgICAgICBWU1QxICAgICAgICBkRHN0MFswXSwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGREc3QyWzBdLCBbVGVtcF0sIGRzdFN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgZERzdDFbMF0sIFtwRHN0XQotICAgICAgICBWU1QxICAgICAgICBkRHN0M1swXSwgW1RlbXBdCi0gICAgICAgIE1fQURSICAgICAgIHBBcmdzLCBwcEFyZ3MKLSAgICAgICAgQiAgICAgICAgICAgQmxvY2s0eDRMb29wRW5kCi1DYXNlXzEKLSAgICAgICAgOy8vIENhc2UgYQotICAgICAgICBNX1BSSU5URiAiQ2FzZSAxIFxuIgotCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsICMyCi0gICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlICAgICAgICAKLSAgICAgICAgVlJIQUREICAgICAgZEFjY0gwLCBkQWNjSDAsIGRTcmMwYwotICAgICAgICBWUkhBREQgICAgICBkQWNjSDIsIGRBY2NIMiwgZFNyYzJjCi0gICAgICAgIFZSSEFERCAgICAgIGRBY2NIMSwgZEFjY0gxLCBkU3JjMWMKLSAgICAgICAgVlJIQUREICAgICAgZEFjY0gzLCBkQWNjSDMsIGRTcmMzYwotICAgICAgICBBREQgICAgICAgICBUZW1wLCBwRHN0LCBkc3RTdGVwLCBMU0wgIzEgCi0gICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIMFswXSwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIMlswXSwgW1RlbXBdLCBkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIMVswXSwgW3BEc3RdCi0gICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIM1swXSwgW1RlbXBdCi0gICAgICAgIE1fQURSICAgICAgIHBBcmdzLCBwcEFyZ3MKLSAgICAgICAgQiAgICAgICAgICAgQmxvY2s0eDRMb29wRW5kICAgICAgICAKLUNhc2VfMgotICAgICAgICA7Ly8gQ2FzZSBiCi0gICAgICAgIE1fUFJJTlRGICJDYXNlIDIgXG4iCi0KLSAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgIzIgICAgICAgIAotICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZQotICAgICAgICBBREQgICAgICAgICBUZW1wLCBwRHN0LCBkc3RTdGVwLCBMU0wgIzEgCi0gICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIMFswXSwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIMlswXSwgW1RlbXBdLCBkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIMVswXSwgW3BEc3RdCi0gICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIM1swXSwgW1RlbXBdCi0gICAgICAgIE1fQURSICAgICAgIHBBcmdzLCBwcEFyZ3MKLSAgICAgICAgQiAgICAgICAgICAgQmxvY2s0eDRMb29wRW5kICAgICAgICAKLUNhc2VfMwotICAgICAgICA7Ly8gQ2FzZSBjCi0gICAgICAgIE1fUFJJTlRGICJDYXNlIDMgXG4iCi0KLSAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgIzIKLSAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUgICAgICAgIAotICAgICAgICBWUkhBREQgICAgICBkQWNjSDAsIGRBY2NIMCwgZFNyYzBkCi0gICAgICAgIFZSSEFERCAgICAgIGRBY2NIMiwgZEFjY0gyLCBkU3JjMmQKLSAgICAgICAgVlJIQUREICAgICAgZEFjY0gxLCBkQWNjSDEsIGRTcmMxZAotICAgICAgICBWUkhBREQgICAgICBkQWNjSDMsIGRBY2NIMywgZFNyYzNkCi0gICAgICAgIEFERCAgICAgICAgIFRlbXAsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMSAKLSAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgwWzBdLCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgyWzBdLCBbVGVtcF0sIGRzdFN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgxWzBdLCBbcERzdF0KLSAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgzWzBdLCBbVGVtcF0KLSAgICAgICAgTV9BRFIgICAgICAgcEFyZ3MsIHBwQXJncwotICAgICAgICBCICAgICAgICAgICBCbG9jazR4NExvb3BFbmQgICAgICAgIAotQ2FzZV80Ci0gICAgICAgIDsvLyBDYXNlIGQKLSAgICAgICAgTV9QUklOVEYgIkNhc2UgNCBcbiIKLQotICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKLSAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUgICAgICAgIAotICAgICAgICBWUkhBREQgICAgICBkQWNjVjAsIGRBY2NWMCwgZFNyYzAKLSAgICAgICAgVlJIQUREICAgICAgZEFjY1YyLCBkQWNjVjIsIGRTcmMyCi0gICAgICAgIFZSSEFERCAgICAgIGRBY2NWMSwgZEFjY1YxLCBkU3JjMQotICAgICAgICBWUkhBREQgICAgICBkQWNjVjMsIGRBY2NWMywgZFNyYzMKLSAgICAgICAgQUREICAgICAgICAgVGVtcCwgcERzdCwgZHN0U3RlcCwgTFNMICMxIAotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0VjBbMF0sIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0VjJbMF0sIFtUZW1wXSwgZHN0U3RlcAotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0VjFbMF0sIFtwRHN0XQotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0VjNbMF0sIFtUZW1wXQotICAgICAgICBNX0FEUiAgICAgICBwQXJncywgcHBBcmdzCi0gICAgICAgIEIgICAgICAgICAgIEJsb2NrNHg0TG9vcEVuZCAgICAgICAgCi1DYXNlXzUKLSAgICAgICAgOy8vIENhc2UgZQotICAgICAgICBNX1BSSU5URiAiQ2FzZSA1IFxuIgotICAgICAgICAKLSAgICAgICAgTU9WICAgICAgICAgcFNyY0JLLCBwU3JjCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQotICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZSAgICAgICAgCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmNCSywgIzIKLSAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUgICAgICAgIAotICAgICAgICBWUkhBREQgICAgICBkQWNjSDAsIGRBY2NIMCwgZEFjY1YwCi0gICAgICAgIFZSSEFERCAgICAgIGRBY2NIMiwgZEFjY0gyLCBkQWNjVjIKLSAgICAgICAgVlJIQUREICAgICAgZEFjY0gxLCBkQWNjSDEsIGRBY2NWMQotICAgICAgICBWUkhBREQgICAgICBkQWNjSDMsIGRBY2NIMywgZEFjY1YzICAgICAgICAKLSAgICAgICAgQUREICAgICAgICAgVGVtcCwgcERzdCwgZHN0U3RlcCwgTFNMICMxIAotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDBbMF0sIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDJbMF0sIFtUZW1wXSwgZHN0U3RlcAotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDFbMF0sIFtwRHN0XQotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDNbMF0sIFtUZW1wXQotICAgICAgICAKLSAgICAgICAgTV9BRFIgICAgICAgcEFyZ3MsIHBwQXJncwotICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZCAgICAgICAgCi1DYXNlXzYKLSAgICAgICAgOy8vIENhc2UgZgotICAgICAgICBNX1BSSU5URiAiQ2FzZSA2IFxuIgotCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQotICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCAjMgotICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmUKLSAgICAgICAgVlFSU0hSVU4gICAgZFRSZXN1bHQwLCBxUmVzMiwgIzUgICAgICAgIAotICAgICAgICBWUVJTSFJVTiAgICBkVFJlc3VsdDEsIHFSZXMzLCAjNSAgICAgICAgCi0gICAgICAgIFZRUlNIUlVOICAgIGRUUmVzdWx0MiwgcVJlczQsICM1ICAgICAgICAKLSAgICAgICAgVlFSU0hSVU4gICAgZFRSZXN1bHQzLCBxUmVzNSwgIzUgICAgICAgIAotICAgICAgICBWUkhBREQgICAgICBkVEFjYzAsIGRUQWNjMCwgZFRSZXN1bHQwCi0gICAgICAgIFZSSEFERCAgICAgIGRUQWNjMiwgZFRBY2MyLCBkVFJlc3VsdDIKLSAgICAgICAgVlJIQUREICAgICAgZFRBY2MxLCBkVEFjYzEsIGRUUmVzdWx0MQotICAgICAgICBWUkhBREQgICAgICBkVEFjYzMsIGRUQWNjMywgZFRSZXN1bHQzCi0gICAgICAgIEFERCAgICAgICAgIFRlbXAsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMSAKLSAgICAgICAgVlNUMSAgICAgICAgZFRSZXMwWzBdLCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgZFRSZXMyWzBdLCBbVGVtcF0sIGRzdFN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgZFRSZXMxWzBdLCBbcERzdF0KLSAgICAgICAgVlNUMSAgICAgICAgZFRSZXMzWzBdLCBbVGVtcF0KLSAgICAgICAgCi0gICAgICAgIE1fQURSICAgICAgIHBBcmdzLCBwcEFyZ3MKLSAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQgICAgICAgIAotQ2FzZV83Ci0gICAgICAgIDsvLyBDYXNlIGcKLSAgICAgICAgTV9QUklOVEYgIkNhc2UgNyBcbiIKLSAgICAgICAgTU9WICAgICAgICAgcFNyY0JLLCBwU3JjCi0gICAgICAgIEFERCAgICAgICAgIHBTcmMsIHBTcmMsICMxCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQotICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZSAgICAgICAgCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmNCSywgIzIKLSAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUgICAgICAgIAotICAgICAgICBWUkhBREQgICAgICBkQWNjSDAsIGRBY2NIMCwgZEFjY1YwCi0gICAgICAgIFZSSEFERCAgICAgIGRBY2NIMiwgZEFjY0gyLCBkQWNjVjIKLSAgICAgICAgVlJIQUREICAgICAgZEFjY0gxLCBkQWNjSDEsIGRBY2NWMQotICAgICAgICBWUkhBREQgICAgICBkQWNjSDMsIGRBY2NIMywgZEFjY1YzICAgICAgICAKLSAgICAgICAgQUREICAgICAgICAgVGVtcCwgcERzdCwgZHN0U3RlcCwgTFNMICMxIAotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDBbMF0sIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDJbMF0sIFtUZW1wXSwgZHN0U3RlcAotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDFbMF0sIFtwRHN0XQotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDNbMF0sIFtUZW1wXQotICAgICAgICAKLSAgICAgICAgTV9BRFIgICAgICAgcEFyZ3MsIHBwQXJncwotICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAotQ2FzZV84Ci0gICAgICAgIDsvLyBDYXNlIGgKLSAgICAgICAgTV9QUklOVEYgIkNhc2UgOCBcbiIKLQotICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKLSAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUgICAgICAgIAotICAgICAgICBBREQgICAgICAgICBUZW1wLCBwRHN0LCBkc3RTdGVwLCBMU0wgIzEgCi0gICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRWMFswXSwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRWMlswXSwgW1RlbXBdLCBkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRWMVswXSwgW3BEc3RdCi0gICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRWM1swXSwgW1RlbXBdCi0gICAgICAgIE1fQURSICAgICAgIHBBcmdzLCBwcEFyZ3MKLSAgICAgICAgQiAgICAgICAgICAgQmxvY2s0eDRMb29wRW5kCi1DYXNlXzkKLSAgICAgICAgOy8vIENhc2UgaQotICAgICAgICBNX1BSSU5URiAiQ2FzZSA5IFxuIgotICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKLSAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgIzIKLSAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlCi0gICAgICAgIFZFWFQgICAgICAgIGRUZW1wUDAsIGRUZW1wUDAsIGRUZW1wUDEsICMyCi0gICAgICAgIFZFWFQgICAgICAgIGRUZW1wUTAsIGRUZW1wUTAsIGRUZW1wUTEsICMyCi0gICAgICAgIFZFWFQgICAgICAgIGRUZW1wUjAsIGRUZW1wUjAsIGRUZW1wUjEsICMyCi0gICAgICAgIFZFWFQgICAgICAgIGRUZW1wUzAsIGRUZW1wUzAsIGRUZW1wUzEsICMyCi0gICAgICAgIAotICAgICAgICBWUVJTSFJVTiAgICBkVFJlc3VsdDAsIHFUZW1wUDAxLCAjNSAgICAgICAgCi0gICAgICAgIFZRUlNIUlVOICAgIGRUUmVzdWx0MSwgcVRlbXBRMDEsICM1ICAgICAgICAKLSAgICAgICAgVlFSU0hSVU4gICAgZFRSZXN1bHQyLCBxVGVtcFIwMSwgIzUgICAgICAgIAotICAgICAgICBWUVJTSFJVTiAgICBkVFJlc3VsdDMsIHFUZW1wUzAxLCAjNSAgICAgICAgCi0KLSAgICAgICAgVlJIQUREICAgICAgZFRBY2MwLCBkVEFjYzAsIGRUUmVzdWx0MAotICAgICAgICBWUkhBREQgICAgICBkVEFjYzIsIGRUQWNjMiwgZFRSZXN1bHQyCi0gICAgICAgIFZSSEFERCAgICAgIGRUQWNjMSwgZFRBY2MxLCBkVFJlc3VsdDEKLSAgICAgICAgVlJIQUREICAgICAgZFRBY2MzLCBkVEFjYzMsIGRUUmVzdWx0MwotICAgICAgICBBREQgICAgICAgICBUZW1wLCBwRHN0LCBkc3RTdGVwLCBMU0wgIzEgCi0gICAgICAgIFZTVDEgICAgICAgIGRUUmVzMFswXSwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGRUUmVzMlswXSwgW1RlbXBdLCBkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGRUUmVzMVswXSwgW3BEc3RdCi0gICAgICAgIFZTVDEgICAgICAgIGRUUmVzM1swXSwgW1RlbXBdCi0gICAgICAgIE1fQURSICAgICAgIHBBcmdzLCBwcEFyZ3MKLSAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQKLUNhc2VfYQotICAgICAgICA7Ly8gQ2FzZSBqCi0gICAgICAgIE1fUFJJTlRGICJDYXNlIGEgXG4iCi0KLSAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsICMyCi0gICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZQotICAgICAgICBBREQgICAgICAgICBUZW1wLCBwRHN0LCBkc3RTdGVwLCBMU0wgIzEgCi0gICAgICAgIFZTVDEgICAgICAgIGRUUmVzMFswXSwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGRUUmVzMlswXSwgW1RlbXBdLCBkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGRUUmVzMVswXSwgW3BEc3RdCi0gICAgICAgIFZTVDEgICAgICAgIGRUUmVzM1swXSwgW1RlbXBdCi0gICAgICAgIE1fQURSICAgICAgIHBBcmdzLCBwcEFyZ3MKLSAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQKLUNhc2VfYgotICAgICAgICA7Ly8gQ2FzZSBrCi0gICAgICAgIE1fUFJJTlRGICJDYXNlIGIgXG4iCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQotICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCAjMgotICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmUKLSAgICAgICAgVkVYVCAgICAgICAgZFRlbXBQMCwgZFRlbXBQMCwgZFRlbXBQMSwgIzMKLSAgICAgICAgVkVYVCAgICAgICAgZFRlbXBRMCwgZFRlbXBRMCwgZFRlbXBRMSwgIzMKLSAgICAgICAgVkVYVCAgICAgICAgZFRlbXBSMCwgZFRlbXBSMCwgZFRlbXBSMSwgIzMKLSAgICAgICAgVkVYVCAgICAgICAgZFRlbXBTMCwgZFRlbXBTMCwgZFRlbXBTMSwgIzMKLSAgICAgICAgCi0gICAgICAgIFZRUlNIUlVOICAgIGRUUmVzdWx0MCwgcVRlbXBQMDEsICM1ICAgICAgICAKLSAgICAgICAgVlFSU0hSVU4gICAgZFRSZXN1bHQxLCBxVGVtcFEwMSwgIzUgICAgICAgIAotICAgICAgICBWUVJTSFJVTiAgICBkVFJlc3VsdDIsIHFUZW1wUjAxLCAjNSAgICAgICAgCi0gICAgICAgIFZRUlNIUlVOICAgIGRUUmVzdWx0MywgcVRlbXBTMDEsICM1ICAgICAgICAKLQotICAgICAgICBWUkhBREQgICAgICBkVEFjYzAsIGRUQWNjMCwgZFRSZXN1bHQwCi0gICAgICAgIFZSSEFERCAgICAgIGRUQWNjMiwgZFRBY2MyLCBkVFJlc3VsdDIKLSAgICAgICAgVlJIQUREICAgICAgZFRBY2MxLCBkVEFjYzEsIGRUUmVzdWx0MQotICAgICAgICBWUkhBREQgICAgICBkVEFjYzMsIGRUQWNjMywgZFRSZXN1bHQzCi0gICAgICAgIEFERCAgICAgICAgIFRlbXAsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMSAKLSAgICAgICAgVlNUMSAgICAgICAgZFRSZXMwWzBdLCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgZFRSZXMyWzBdLCBbVGVtcF0sIGRzdFN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgZFRSZXMxWzBdLCBbcERzdF0KLSAgICAgICAgVlNUMSAgICAgICAgZFRSZXMzWzBdLCBbVGVtcF0KLSAgICAgICAgTV9BRFIgICAgICAgcEFyZ3MsIHBwQXJncwotICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAotQ2FzZV9jCi0gICAgICAgIDsvLyBDYXNlIG4KLSAgICAgICAgTV9QUklOVEYgIkNhc2UgYyBcbiIKLQotICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKLSAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUgICAgICAgIAotICAgICAgICBWUkhBREQgICAgICBkQWNjVjAsIGRBY2NWMCwgZFNyYzEKLSAgICAgICAgVlJIQUREICAgICAgZEFjY1YyLCBkQWNjVjIsIGRTcmMzCi0gICAgICAgIFZSSEFERCAgICAgIGRBY2NWMSwgZEFjY1YxLCBkU3JjMgotICAgICAgICBWUkhBREQgICAgICBkQWNjVjMsIGRBY2NWMywgZFNyYzQKLSAgICAgICAgQUREICAgICAgICAgVGVtcCwgcERzdCwgZHN0U3RlcCwgTFNMICMxIAotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0VjBbMF0sIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0VjJbMF0sIFtUZW1wXSwgZHN0U3RlcAotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0VjFbMF0sIFtwRHN0XQotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0VjNbMF0sIFtUZW1wXQotICAgICAgICBNX0FEUiAgICAgICBwQXJncywgcHBBcmdzCi0gICAgICAgIEIgICAgICAgICAgIEJsb2NrNHg0TG9vcEVuZAotQ2FzZV9kCi0gICAgICAgIDsvLyBDYXNlIHAKLSAgICAgICAgTV9QUklOVEYgIkNhc2UgZCBcbiIKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgICAgIHBTcmNCSywgcFNyYwotICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKLSAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUgICAgICAgIAotICAgICAgICBBREQgICAgICAgICBwU3JjLCBwU3JjQkssIHNyY1N0ZXAKLSAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgIzIKLSAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUgICAgICAgIAotICAgICAgICBWUkhBREQgICAgICBkQWNjSDAsIGRBY2NIMCwgZEFjY1YwCi0gICAgICAgIFZSSEFERCAgICAgIGRBY2NIMiwgZEFjY0gyLCBkQWNjVjIKLSAgICAgICAgVlJIQUREICAgICAgZEFjY0gxLCBkQWNjSDEsIGRBY2NWMQotICAgICAgICBWUkhBREQgICAgICBkQWNjSDMsIGRBY2NIMywgZEFjY1YzICAgICAgICAKLSAgICAgICAgQUREICAgICAgICAgVGVtcCwgcERzdCwgZHN0U3RlcCwgTFNMICMxIAotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDBbMF0sIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDJbMF0sIFtUZW1wXSwgZHN0U3RlcAotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDFbMF0sIFtwRHN0XQotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDNbMF0sIFtUZW1wXQotICAgICAgICBNX0FEUiAgICAgICBwQXJncywgcHBBcmdzCi0gICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCi1DYXNlX2UKLSAgICAgICAgOy8vIENhc2UgcQotICAgICAgICBNX1BSSU5URiAiQ2FzZSBlIFxuIgotICAgICAgICAKLSAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsICMyCi0gICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZQotICAgICAgICBWUVJTSFJVTiAgICBkVFJlc3VsdDAsIHFSZXMzLCAjNSAgICAgICAgCi0gICAgICAgIFZRUlNIUlVOICAgIGRUUmVzdWx0MSwgcVJlczQsICM1ICAgICAgICAKLSAgICAgICAgVlFSU0hSVU4gICAgZFRSZXN1bHQyLCBxUmVzNSwgIzUgICAgICAgIAotICAgICAgICBWUVJTSFJVTiAgICBkVFJlc3VsdDMsIHFSZXM2LCAjNSAgICAgICAgCi0KLSAgICAgICAgVlJIQUREICAgICAgZFRBY2MwLCBkVEFjYzAsIGRUUmVzdWx0MAotICAgICAgICBWUkhBREQgICAgICBkVEFjYzIsIGRUQWNjMiwgZFRSZXN1bHQyCi0gICAgICAgIFZSSEFERCAgICAgIGRUQWNjMSwgZFRBY2MxLCBkVFJlc3VsdDEKLSAgICAgICAgVlJIQUREICAgICAgZFRBY2MzLCBkVEFjYzMsIGRUUmVzdWx0MwotICAgICAgICBBREQgICAgICAgICBUZW1wLCBwRHN0LCBkc3RTdGVwLCBMU0wgIzEgCi0gICAgICAgIFZTVDEgICAgICAgIGRUUmVzMFswXSwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGRUUmVzMlswXSwgW1RlbXBdLCBkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGRUUmVzMVswXSwgW3BEc3RdCi0gICAgICAgIFZTVDEgICAgICAgIGRUUmVzM1swXSwgW1RlbXBdCi0gICAgICAgIE1fQURSICAgICAgIHBBcmdzLCBwcEFyZ3MKLSAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQKLUNhc2VfZgotICAgICAgICA7Ly8gQ2FzZSByCi0gICAgICAgIE1fUFJJTlRGICJDYXNlIGYgXG4iCi0gICAgICAgIE1PViAgICAgICAgIHBTcmNCSywgcFNyYwotICAgICAgICBBREQgICAgICAgICBwU3JjLCBwU3JjLCAjMQotICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKLSAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUgICAgICAgIAotICAgICAgICBBREQgICAgICAgICBwU3JjLCBwU3JjQkssIHNyY1N0ZXAKLSAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgIzIKLSAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUgICAgICAgIAotICAgICAgICBWUkhBREQgICAgICBkQWNjSDAsIGRBY2NIMCwgZEFjY1YwCi0gICAgICAgIFZSSEFERCAgICAgIGRBY2NIMiwgZEFjY0gyLCBkQWNjVjIKLSAgICAgICAgVlJIQUREICAgICAgZEFjY0gxLCBkQWNjSDEsIGRBY2NWMQotICAgICAgICBWUkhBREQgICAgICBkQWNjSDMsIGRBY2NIMywgZEFjY1YzICAgICAgICAKLSAgICAgICAgQUREICAgICAgICAgVGVtcCwgcERzdCwgZHN0U3RlcCwgTFNMICMxIAotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDBbMF0sIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDJbMF0sIFtUZW1wXSwgZHN0U3RlcAotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDFbMF0sIFtwRHN0XQotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDNbMF0sIFtUZW1wXQotICAgICAgICBNX0FEUiAgICAgICBwQXJncywgcHBBcmdzCi0KLQotQmxvY2s0eDRMb29wRW5kCi0KLSAgICAgICAgOy8vIFdpZHRoIExvb3AKLSAgICAgICAgOy8vTV9BRFIgICAgICAgcEFyZ3MsIHBwQXJncwotICAgICAgICBMRE0gICAgICAgICBwQXJncywge3BTcmMsc3JjU3RlcCxwRHN0LGRzdFN0ZXB9ICA7Ly8gTG9hZCBhcmd1bWVudHMKLSAgICAgICAgU1VCUyAgICAgICAgaVdpZHRoLCBpV2lkdGgsICM0Ci0gICAgICAgIEFERCAgICAgICAgIHBTcmMsIHBTcmMsICM0ICAgICAgCi0gICAgICAgIEFERCAgICAgICAgIHBEc3QsIHBEc3QsICM0Ci0gICAgICAgIEJHVCAgICAgICAgIEJsb2NrNHg0V2lkdGhMb29wCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICA7Ly8gSGVpZ2h0IExvb3AKLSAgICAgICAgU1VCUyAgICAgICAgaUhlaWdodCwgaUhlaWdodCwgIzQKLSAgICAgICAgTV9MRFIgICAgICAgaVdpZHRoLCBwdHJXaWR0aAotICAgICAgICBNX0FEUiAgICAgICBwQXJncywgcHBBcmdzCi0gICAgICAgIEFERCAgICAgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMiAgICAgIAotICAgICAgICBBREQgICAgICAgICBwRHN0LCBwRHN0LCBkc3RTdGVwLCBMU0wgIzIKLSAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgaVdpZHRoCi0gICAgICAgIFNVQiAgICAgICAgIHBEc3QsIHBEc3QsIGlXaWR0aAotICAgICAgICBCR1QgICAgICAgICBCbG9jazR4NEhlaWdodExvb3AKLQotRW5kT2ZJbnRlcnBvbGF0aW9uCi0gICAgICAgIE1PViAgICAgICAgIHIwLCAjMAotICAgICAgICBNX0VORCAgICAgICAKLQotICAgIEVORElGICAKLSAgICAgICAgOy8vIEVuZCBvZiBDb3J0ZXhBOAotICAgICAgICAgICAgICAgICAgICAKLSAgICBFTkQKLSAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4X3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4X3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZmNDE4Zi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OF9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSw0NTAgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OF9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICAxMjI5MAotOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLSAgCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgICAgCi0gICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX3BJbmRleFRhYmxlOHg4Ci0gICAgICAgIAotOy8vIERlZmluZSB0aGUgcHJvY2Vzc29yIHZhcmlhbnRzIHN1cHBvcnRlZCBieSB0aGlzIGZpbGUKLSAgICAgICAgIAotICAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAotICAgICAKLSAgICAgQVJFQSB0YWJsZSwgREFUQSAgICAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBUaGlzIHRhYmxlIGZvciBpbXBsZW1lbnRpbmcgc3dpdGNoIGNhc2Ugb2YgQyBpbiBhc20gYnkKLTsvLyB0aGUgbWVodG9kIG9mIHR3byBsZXZlbHMgb2YgaW5kZXhpbmcuCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBNX1RBQkxFIGFybVZDTTRQMTBfcEluZGV4VGFibGU4eDgKLSAgICBEQ0QgIE9NWF9WQ19DSFJPTUFfREMsICAgICBPTVhfVkNfQ0hST01BX0hPUiAKLSAgICBEQ0QgIE9NWF9WQ19DSFJPTUFfVkVSVCwgICBPTVhfVkNfQ0hST01BX1BMQU5FICAKLSAgICAKLSAgICBNX1RBQkxFIGFybVZDTTRQMTBfTXVsdGlwbGllclRhYmxlQ2hyb21hOHg4LDEKLSAgICBEQ1cgICAzLCAyLCAxLDQgCi0gICAgRENXICAtMywtMiwtMSwwCi0gICAgRENXICAgMSwgMiwgMyw0Ci0gICAgCi0gICAgICAgIAotICAgICAgICAKLSAgICBJRiBDb3J0ZXhBOAotCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIFNjcmF0Y2ggdmFyaWFibGUKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gCi1wYyAgICAgICAgICAgICAgUk4gMTUgICAKLXJldHVybiAgICAgICAgICBSTiAwICAKLXBUYWJsZSAgICAgICAgICBSTiA4IAotICAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gSW5wdXQgQXJndW1lbnRzCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcFNyY0xlZnQgICAgICAgIFJOIDAgICAgOy8vIGlucHV0IHBvaW50ZXIKLXBTcmNBYm92ZSAgICAgICBSTiAxICAgIDsvLyBpbnB1dCBwb2ludGVyCi1wU3JjQWJvdmVMZWZ0ICAgUk4gMiAgICA7Ly8gaW5wdXQgcG9pbnRlcgotcERzdCAgICAgICAgICAgIFJOIDMgICAgOy8vIG91dHB1dCBwb2ludGVyCi1sZWZ0U3RlcCAgICAgICAgUk4gNCAgICA7Ly8gaW5wdXQgdmFyaWFibGUKLWRzdFN0ZXAgICAgICAgICBSTiA1ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQotcHJlZE1vZGUgICAgICAgIFJOIDYgICAgOy8vIGlucHV0IHZhcmlhYmxlCi1hdmFpbGFiaWxpdHkgICAgUk4gNyAgICA7Ly8gaW5wdXQgdmFyaWFibGUKLXBNdWx0aXBsaWVyVGFibGUgICAgUk4gIDIgICAgIAotCi1wVG1wICAgICAgICAgICAgUk4gOQotc3RlcCAgICAgICAgICAgIFJOIDEwCi0KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIE5lb24gUmVnaXN0ZXJzCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotOy8vIE9NWF9WQ19DSFJPTUFfSE9SCi0KLWRMZWZ0VmFsMCAgICAgICBETiAgRDAuOAotZExlZnRWYWwxICAgICAgIEROICBEMS44Ci1kTGVmdFZhbDIgICAgICAgRE4gIEQyLjgKLWRMZWZ0VmFsMyAgICAgICBETiAgRDMuOAotZExlZnRWYWw0ICAgICAgIEROICBENC44Ci1kTGVmdFZhbDUgICAgICAgRE4gIEQ1LjgKLWRMZWZ0VmFsNiAgICAgICBETiAgRDYuOAotZExlZnRWYWw3ICAgICAgIEROICBENy44Ci0KLTsvLyBPTVhfVkNfQ0hST01BX1ZFUlQKLQotZEFib3ZlVmFsICAgICAgIEROICBEMC5VOAotCi07Ly8gT01YX1ZDX0NIUk9NQV9EQwotCi1kTGVmdFZhbCAgICAgICAgRE4gIEQxLlU4Ci1kU3VtQWJvdmVWYWxVMTYgRE4gIEQyLlUxNgotZFN1bUFib3ZlVmFsVTMyIEROICBEMy5VMzIKLWRTdW1BYm92ZVZhbFU4ICBETiAgRDMuVTgKLWRTdW1MZWZ0VmFsVTE2ICBETiAgRDIuVTE2Ci1kU3VtTGVmdFZhbFUzMiAgRE4gIEQxLlUzMgotZFN1bUxlZnRWYWxVOCAgIEROICBEMS5VOAotZFN1bUFib3ZlTGVmdCAgIEROICBEMi5VMzIKLWRTdW1BYm92ZUxlZnRVOCBETiAgRDIuVTgKLWRJbmRleFJvdzBVOCAgICBETiAgRDUuVTgKLWRJbmRleFJvdzAgICAgICBETiAgRDUuVTY0Ci1kSW5kZXhSb3c0VTggICAgRE4gIEQ2LlU4Ci1kSW5kZXhSb3c0ICAgICAgRE4gIEQ2LlU2NAotZERzdFJvdzAgICAgICAgIEROICBEMC5VOAotZERzdFJvdzQgICAgICAgIEROICBENC5VOAotZENvbnN0MTI4VTggICAgIEROICBEMC5VOAotCi07Ly8gT01YX1ZDX0NIUk9NQV9QTEFORQotCi1kUmV2QWJvdmVWYWwgICAgRE4gIEQzLlU4ICAKLWRSZXZBYm92ZVZhbFU2NCBETiAgRDMuVTY0ICAKLWRBYm92ZUxlZnRWYWwgICBETiAgRDIuVTgKLXFBYm92ZTdtaW51czAgICBRTiAgUTMuUzE2IAotcUFib3ZlRGlmZiAgICAgIFFOICBRMi5TMTYgCi1kSW5kZXggICAgICAgICAgRE4gIEQ4LlU4ICAKLWREaWZmQWJvdmVVOCAgICBETiAgRDkuVTggIAotZERpZmZBYm92ZVMxNiAgIEROICBEOS5TMTYgCi1kQWJvdmVEaWZmMFU4ICAgRE4gIEQ0LlU4ICAKLWRBYm92ZURpZmYwVTY0ICBETiAgRDQuVTY0Ci1kQWJvdmU3bWludXMwVTggRE4gIEQ2LlU4ICAKLWRNdWx0aXBsaWVyICAgICBETiAgRDEwLlMxNiAKLWRIb3JQcmVkICAgICAgICBETiAgRDExLlMxNiAKLWRSZXZMZWZ0VmFsICAgICBETiAgRDMuVTgKLWRSZXZMZWZ0VmFsVTY0ICBETiAgRDMuVTY0Ci1xTGVmdDdtaW51czAgICAgUU4gIFE3LlMxNgotcUxlZnREaWZmICAgICAgIFFOICBRNi5TMTYKLWREaWZmTGVmdFU4ICAgICBETiAgRDE2LlU4Ci1kRGlmZkxlZnRTMTYgICAgRE4gIEQxNi5TMTYKLWRMZWZ0RGlmZjBVOCAgICBETiAgRDEyLlU4Ci1kTGVmdERpZmYwVTY0ICAgRE4gIEQxMi5VNjQKLWRMZWZ0N21pbnVzMFU4ICBETiAgRDE0LlU4Ci1kVmVyUHJlZCAgICAgICAgRE4gIEQzLlMxNiAKLWRIVlZhbFMxNiAgICAgICBETiAgRDMuUzE2Ci1kSFZWYWxTMzIgICAgICAgRE4gIEQzLlMzMgotZEhWVGVtcFMzMiAgICAgIEROICBEMi5TMzIKLXFBICAgICAgICAgICAgICBRTiAgUTAuUzE2Ci1xQiAgICAgICAgICAgICAgUU4gIFEyLlMxNgotcUMgICAgICAgICAgICAgIFFOICBRMy5TMTYKLXFNdWx0aXBsaWVyICAgICBRTiAgUTUuUzE2Ci1kTXVsdGlwbGllcjAgICAgRE4gIEQxMC5TMTYKLWRNdWx0aXBsaWVyMSAgICBETiAgRDExLlMxNgotcUMwICAgICAgICAgICAgIFFOICBRMC5TMTYKLXFDMSAgICAgICAgICAgICBRTiAgUTEuUzE2Ci1xQzIgICAgICAgICAgICAgUU4gIFE0LlMxNgotcUMzICAgICAgICAgICAgIFFOICBRNS5TMTYKLXFDNCAgICAgICAgICAgICBRTiAgUTYuUzE2Ci1xQzUgICAgICAgICAgICAgUU4gIFE3LlMxNgotcUM2ICAgICAgICAgICAgIFFOICBROC5TMTYKLXFDNyAgICAgICAgICAgICBRTiAgUTkuUzE2Ci1xU3VtMCAgICAgICAgICAgUU4gIFEwLlMxNgotcVN1bTEgICAgICAgICAgIFFOICBRMS5TMTYKLXFTdW0yICAgICAgICAgICBRTiAgUTQuUzE2Ci1xU3VtMyAgICAgICAgICAgUU4gIFE1LlMxNgotcVN1bTQgICAgICAgICAgIFFOICBRNi5TMTYKLXFTdW01ICAgICAgICAgICBRTiAgUTcuUzE2Ci1xU3VtNiAgICAgICAgICAgUU4gIFE4LlMxNgotcVN1bTcgICAgICAgICAgIFFOICBROS5TMTYKLWRTdW0wICAgICAgICAgICBETiAgRDAuVTgKLWRTdW0xICAgICAgICAgICBETiAgRDEuVTgKLWRTdW0yICAgICAgICAgICBETiAgRDIuVTgKLWRTdW0zICAgICAgICAgICBETiAgRDMuVTgKLWRTdW00ICAgICAgICAgICBETiAgRDQuVTgKLWRTdW01ICAgICAgICAgICBETiAgRDUuVTgKLWRTdW02ICAgICAgICAgICBETiAgRDYuVTgKLWRTdW03ICAgICAgICAgICBETiAgRDcuVTgKLQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDggc3RhcnRzCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAKLSAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgotICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCwgcjEwLCBkMTUKLSAgICAgICAgCi0gICAgICAgIDsvLyBEZWZpbmUgc3RhY2sgYXJndW1lbnRzCi0gICAgICAgIE1fQVJHICAgIExlZnRTdGVwLCAgICAgNAotICAgICAgICBNX0FSRyAgICBEc3RTdGVwLCAgICAgIDQKLSAgICAgICAgTV9BUkcgICAgUHJlZE1vZGUsICAgICA0Ci0gICAgICAgIE1fQVJHICAgIEF2YWlsYWJpbGl0eSwgNAotICAgICAgICAKLSAgICAgICAgTERSICAgICAgcFRhYmxlLD1hcm1WQ000UDEwX3BJbmRleFRhYmxlOHg4ICAgOy8vIExvYWQgaW5kZXggdGFibGUgZm9yIHN3aXRjaCBjYXNlCi0gICAgICAgIAotICAgICAgICA7Ly8gTG9hZCBhcmd1bWVudCBmcm9tIHRoZSBzdGFjawotICAgICAgICBNX0xEUiAgICBwcmVkTW9kZSwgUHJlZE1vZGUgICAgICAgICAgICAgICAgICA7Ly8gQXJnIHByZWRNb2RlIGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZyAKLSAgICAgICAgTV9MRFIgICAgbGVmdFN0ZXAsIExlZnRTdGVwICAgICAgICAgICAgICAgICAgOy8vIEFyZyBsZWZ0U3RlcCBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgCi0gICAgICAgIE1fTERSICAgIGRzdFN0ZXAsICBEc3RTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBBcmcgZHN0U3RlcCBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgICAgICAgICAKLSAgICAgICAgTV9MRFIgICAgYXZhaWxhYmlsaXR5LCBBdmFpbGFiaWxpdHkgICAgICAgICAgOy8vIEFyZyBhdmFpbGFiaWxpdHkgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgIHBjLCBbcFRhYmxlLCBwcmVkTW9kZSwgTFNMICMyXSAgICAgIDsvLyBCcmFuY2ggdG8gdGhlIGNhc2UgYmFzZWQgb24gcHJlTW9kZQotCi1PTVhfVkNfQ0hST01BX0RDCi0gICAgICAgIAotICAgICAgICBUU1QgICAgIGF2YWlsYWJpbGl0eSwgI09NWF9WQ19MRUZUCi0gICAgICAgIEJFUSAgICAgRENDaHJvbWE4eDhMZWZ0Tm90QXZhaWxhYmxlCi0KLSAgICAgICAgQUREICAgICBwVG1wLCBwU3JjTGVmdCwgbGVmdFN0ZXAKLSAgICAgICAgQUREICAgICBzdGVwLCBsZWZ0U3RlcCwgbGVmdFN0ZXAKLQotICAgICAgICA7Ly8gTG9hZCBMZWZ0IEVkZ2UKLSAgICAgICAgVkxEMSAgICB7ZExlZnRWYWxbMF19LFtwU3JjTGVmdF0sc3RlcCAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFswKmxlZnRTdGVwXQotICAgICAgICBWTEQxICAgIHtkTGVmdFZhbFsxXX0sW3BUbXBdLHN0ZXAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzEqbGVmdFN0ZXBdCi0gICAgICAgIFZMRDEgICAge2RMZWZ0VmFsWzJdfSxbcFNyY0xlZnRdLHN0ZXAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMipsZWZ0U3RlcF0KLSAgICAgICAgVkxEMSAgICB7ZExlZnRWYWxbM119LFtwVG1wXSxzdGVwICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFszKmxlZnRTdGVwXQotICAgICAgICBWTEQxICAgIHtkTGVmdFZhbFs0XX0sW3BTcmNMZWZ0XSxzdGVwICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzQqbGVmdFN0ZXBdCi0gICAgICAgIFZMRDEgICAge2RMZWZ0VmFsWzVdfSxbcFRtcF0sc3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNSpsZWZ0U3RlcF0KLSAgICAgICAgVkxEMSAgICB7ZExlZnRWYWxbNl19LFtwU3JjTGVmdF0sc3RlcCAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFs2KmxlZnRTdGVwXQotICAgICAgICBWTEQxICAgIHtkTGVmdFZhbFs3XX0sW3BUbXBdICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzcqbGVmdFN0ZXBdICAgICAgCi0gICAgICAgIAotICAgICAgICBUU1QgICAgIGF2YWlsYWJpbGl0eSwgI09NWF9WQ19VUFBFUgotICAgICAgICBCRVEgICAgIERDQ2hyb21hOHg4TGVmdE9ubHlBdmFpbGFibGUKLQotICAgICAgICA7Ly8gTG9hZCBVcHBlciBFZGdlIGFsc28KLSAgICAgICAgVkxEMSAgICAgZEFib3ZlVmFsLFtwU3JjQWJvdmVdICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMCB0byA3XSAgCi0gICAgICAgIAotICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyICAgICAgICAgICAgICAgICAgICAgOy8vIHJldHVybk5vRXJyb3IKLSAgICAgICAgCi0gICAgICAgIFZQQURETCAgIGRTdW1BYm92ZVZhbFUxNiwgZEFib3ZlVmFsICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWyA2KzcgfCA0KzUgfCAyKzMgfCAwKzEgXSAgICAgICAgICAgICAKLSAgICAgICAgVlBBRERMICAgZFN1bUFib3ZlVmFsVTMyLCBkU3VtQWJvdmVWYWxVMTYgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbIDQrNSs2KzcgfCAgMCsxKzIrMyBdIAotICAgICAgICAgICAgICAgIAotICAgICAgICBWUEFEREwgICBkU3VtTGVmdFZhbFUxNiwgZExlZnRWYWwgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WyA2KzcgfCA0KzUgfCAyKzMgfCAwKzEgXSAgICAgICAgICAgICAKLSAgICAgICAgVlBBRERMICAgZFN1bUxlZnRWYWxVMzIsIGRTdW1MZWZ0VmFsVTE2ICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsgNCs1KzYrNyB8ICAwKzErMiszIF0gICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICBWQUREICAgICBkU3VtQWJvdmVMZWZ0LGRTdW1BYm92ZVZhbFUzMixkU3VtTGVmdFZhbFUzMgotICAgICAgICBWUlNIUiAgICBkU3VtQWJvdmVMZWZ0LGRTdW1BYm92ZUxlZnQsIzMgICAgICAgICAgICAgOy8vIFN1bSA9IChTdW0gKyA0KSA+PiAzCi0gICAgICAgIFZSU0hSICAgIGRTdW1BYm92ZVZhbFUzMixkU3VtQWJvdmVWYWxVMzIsIzIgICAgICAgICA7Ly8gU3VtID0gKFN1bSArIDIpID4+IDIKLSAgICAgICAgVlJTSFIgICAgZFN1bUxlZnRWYWxVMzIsZFN1bUxlZnRWYWxVMzIsIzIgICAgICAgICAgIDsvLyBTdW0gPSAoU3VtICsgMikgPj4gMgotICAgICAgICAKLSAgICAgICAgVk1PViAgICAgZEluZGV4Um93MFU4LCMweDBjICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBWTU9WICAgICBkSW5kZXhSb3c0VTgsIzB4MDQKLSAgICAgICAgVlNITCAgICAgZEluZGV4Um93MCxkSW5kZXhSb3cwLCMzMiAgICAgICAgICAgICAgICAgIDsvLyBpbmRleDAgPSAweDBjMGMwYzBjMDAwMDAwMDAgCi0gICAgICAgIFZTSFIgICAgIGRJbmRleFJvdzQsZEluZGV4Um93NCwjMzIgICAgICAgICAgICAgICAgICA7Ly8gaW5kZXg0ID0gMHgwMDAwMDAwMDA0MDQwNDA0Ci0gICAgICAgIFZBREQgICAgIGRJbmRleFJvdzRVOCxkSW5kZXhSb3c0VTgsZEluZGV4Um93MFU4ICAgICA7Ly8gaW5kZXg0ID0gMHgwYzBjMGMwYzA0MDQwNDA0Ci0gICAgICAgIFZUQkwgICAgIGREc3RSb3cwLHtkU3VtQWJvdmVMZWZ0VTgsZFN1bUFib3ZlVmFsVTh9LGRJbmRleFJvdzBVOAotICAgICAgICBWVEJMICAgICBkRHN0Um93NCx7ZFN1bUxlZnRWYWxVOCxkU3VtQWJvdmVMZWZ0VTh9LGRJbmRleFJvdzRVOAotIAotRENDaHJvbWE4eDhMZWZ0U3RvcmUgICAgICAgCi0gICAgICAgIEFERCAgICAgcFRtcCwgcERzdCwgZHN0U3RlcAotICAgICAgICBBREQgICAgIHN0ZXAsIGRzdFN0ZXAsIGRzdFN0ZXAKLSAgICAgICAgCi0gICAgICAgIFZTVDEgICAgIGREc3RSb3cwLFtwRHN0XSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFswKmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKLSAgICAgICAgVlNUMSAgICAgZERzdFJvdzAsW3BUbXBdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzEqZHN0U3RlcCt4XSA6MDw9IHggPD0gNwotICAgICAgICBWU1QxICAgICBkRHN0Um93MCxbcERzdF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMipkc3RTdGVwK3hdIDowPD0geCA8PSA3Ci0gICAgICAgIFZTVDEgICAgIGREc3RSb3cwLFtwVG1wXSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFszKmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKLSAgICAgICAgVlNUMSAgICAgZERzdFJvdzQsW3BEc3RdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzQqZHN0U3RlcCt4XSA6MDw9IHggPD0gNwotICAgICAgICBWU1QxICAgICBkRHN0Um93NCxbcFRtcF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbNSpkc3RTdGVwK3hdIDowPD0geCA8PSA3Ci0gICAgICAgIFZTVDEgICAgIGREc3RSb3c0LFtwRHN0XSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFs2KmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKLSAgICAgICAgVlNUMSAgICAgZERzdFJvdzQsW3BUbXBdICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzcqZHN0U3RlcCt4XSA6MDw9IHggPD0gNwotCi0gICAgICAgIE1fRVhJVAotICAgICAgICAKLQotRENDaHJvbWE4eDhMZWZ0T25seUF2YWlsYWJsZQotCi0gICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgCi0gICAgICAgIFZQQURETCAgIGRTdW1MZWZ0VmFsVTE2LCBkTGVmdFZhbCAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbIDYrNyB8IDQrNSB8IDIrMyB8IDArMSBdICAgICAgICAgICAgIAotICAgICAgICBWUEFEREwgICBkU3VtTGVmdFZhbFUzMiwgZFN1bUxlZnRWYWxVMTYgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WyA0KzUrNis3IHwgIDArMSsyKzMgXSAgIAotICAgICAgICBWUlNIUiAgICBkU3VtTGVmdFZhbFUzMixkU3VtTGVmdFZhbFUzMiwjMiAgICAgICAgICAgOy8vIFN1bSA9IChTdW0gKyAyKSA+PiAyCi0gICAgICAgIAotICAgICAgICBWRFVQICAgICBkRHN0Um93MCxkU3VtTGVmdFZhbFU4WzBdCi0gICAgICAgIFZEVVAgICAgIGREc3RSb3c0LGRTdW1MZWZ0VmFsVThbNF0KLSAgICAgICAgCi0gICAgICAgIEIgICAgICAgIERDQ2hyb21hOHg4TGVmdFN0b3JlICAKLSAgICAgICAgCi0KLURDQ2hyb21hOHg4TGVmdE5vdEF2YWlsYWJsZQotICAgICAgICAgICAgICAgICAKLSAgICAgICAgVFNUICAgICBhdmFpbGFiaWxpdHksICNPTVhfVkNfVVBQRVIKLSAgICAgICAgQkVRICAgICBEQ0Nocm9tYTh4OE5vbmVBdmFpbGFibGUKLQotICAgICAgICA7Ly8gTG9hZCBVcHBlciBFZGdlIAotICAgICAgICBWTEQxICAgICBkQWJvdmVWYWwsW3BTcmNBYm92ZV0gICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVswIHRvIDddICAKLSAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VyciAgICAgICAgICAgICAgICAgICAgIDsvLyByZXR1cm5Ob0Vycm9yCi0gICAgICAgIAotICAgICAgICBWUEFEREwgICBkU3VtQWJvdmVWYWxVMTYsIGRBYm92ZVZhbCAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVsgNis3IHwgNCs1IHwgMiszIHwgMCsxIF0gICAgICAgICAgICAgCi0gICAgICAgIFZQQURETCAgIGRTdW1BYm92ZVZhbFUzMiwgZFN1bUFib3ZlVmFsVTE2ICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWyA0KzUrNis3IHwgIDArMSsyKzMgXSAKLSAgICAgICAgVlJTSFIgICAgZFN1bUFib3ZlVmFsVTMyLGRTdW1BYm92ZVZhbFUzMiwjMiAgICAgICAgIDsvLyBTdW0gPSAoU3VtICsgMikgPj4gMgotICAgICAgICBWTU9WICAgICBkSW5kZXhSb3cwVTgsIzB4MDQKLSAgICAgICAgVlNITCAgICAgZEluZGV4Um93MCxkSW5kZXhSb3cwLCMzMiAgICAgICAgICAgICAgICAgIDsvLyBpbmRleCA9IDB4MDQwNDA0MDQwMDAwMDAwMAotICAgICAgICBWVEJMICAgICBkRHN0Um93MCx7ZFN1bUFib3ZlVmFsVTh9LGRJbmRleFJvdzBVOCAKLSAgICAgICAgCi0gICAgICAgIEIgICAgICAgIERDQ2hyb21hOHg4VXBwZXJTdG9yZQotICAgICAgICAKLQotRENDaHJvbWE4eDhOb25lQXZhaWxhYmxlICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFZNT1YgICAgIGRDb25zdDEyOFU4LCMweDgwICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gMHg4MDgwODA4MDgwODA4MDgwIGlmKGNvdW50ID09IDApCi0gICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIgICAgICAgICAgICAgICAgICAgICA7Ly8gcmV0dXJuTm9FcnJvcgotCi1EQ0Nocm9tYTh4OFVwcGVyU3RvcmUgICAgICAgIAotICAgICAgICAKLSAgICAgICAgQUREICAgICBwVG1wLCBwRHN0LCBkc3RTdGVwCi0gICAgICAgIEFERCAgICAgc3RlcCwgZHN0U3RlcCwgZHN0U3RlcAotICAgICAgICAKLSAgICAgICAgVlNUMSAgICAgZERzdFJvdzAsW3BEc3RdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzAqZHN0U3RlcCt4XSA6MDw9IHggPD0gNwotICAgICAgICBWU1QxICAgICBkRHN0Um93MCxbcFRtcF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMSpkc3RTdGVwK3hdIDowPD0geCA8PSA3Ci0gICAgICAgIFZTVDEgICAgIGREc3RSb3cwLFtwRHN0XSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFsyKmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKLSAgICAgICAgVlNUMSAgICAgZERzdFJvdzAsW3BUbXBdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzMqZHN0U3RlcCt4XSA6MDw9IHggPD0gNwotICAgICAgICBWU1QxICAgICBkRHN0Um93MCxbcERzdF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbNCpkc3RTdGVwK3hdIDowPD0geCA8PSA3Ci0gICAgICAgIFZTVDEgICAgIGREc3RSb3cwLFtwVG1wXSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFs1KmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKLSAgICAgICAgVlNUMSAgICAgZERzdFJvdzAsW3BEc3RdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzYqZHN0U3RlcCt4XSA6MDw9IHggPD0gNwotICAgICAgICBWU1QxICAgICBkRHN0Um93MCxbcFRtcF0gICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbNypkc3RTdGVwK3hdIDowPD0geCA8PSA3Ci0gICAgICAgIAotICAgICAgICBNX0VYSVQKLQotCi1PTVhfVkNfQ0hST01BX1ZFUlQKLSAgICAgICAgCi0gICAgICAgIFZMRDEgICAgIGRBYm92ZVZhbCxbcFNyY0Fib3ZlXSAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlW3hdICAgICAgOjA8PSB4IDw9IDcgICAKLSAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgotICAgICAgICAKLSAgICAgICAgQiAgICAgICAgRENDaHJvbWE4eDhVcHBlclN0b3JlCi0gICAgICAgIAotCi1PTVhfVkNfQ0hST01BX0hPUgotICAgICAgICAKLSAgICAgICAgQUREICAgICBwVG1wLCBwU3JjTGVmdCwgbGVmdFN0ZXAKLSAgICAgICAgQUREICAgICBzdGVwLCBsZWZ0U3RlcCwgbGVmdFN0ZXAKLSAgICAgICAgCi0gICAgICAgIFZMRDEgICAge2RMZWZ0VmFsMFtdfSxbcFNyY0xlZnRdLHN0ZXAgICAgICAgICAgIDsvLyBwU3JjTGVmdFswKmxlZnRTdGVwXQotICAgICAgICBWTEQxICAgIHtkTGVmdFZhbDFbXX0sW3BUbXBdLHN0ZXAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMSpsZWZ0U3RlcF0KLSAgICAgICAgVkxEMSAgICB7ZExlZnRWYWwyW119LFtwU3JjTGVmdF0sc3RlcCAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzIqbGVmdFN0ZXBdCi0gICAgICAgIFZMRDEgICAge2RMZWZ0VmFsM1tdfSxbcFRtcF0sc3RlcCAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFszKmxlZnRTdGVwXQotICAgICAgICBWTEQxICAgIHtkTGVmdFZhbDRbXX0sW3BTcmNMZWZ0XSxzdGVwICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNCpsZWZ0U3RlcF0KLSAgICAgICAgVkxEMSAgICB7ZExlZnRWYWw1W119LFtwVG1wXSxzdGVwICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzUqbGVmdFN0ZXBdCi0gICAgICAgIFZMRDEgICAge2RMZWZ0VmFsNltdfSxbcFNyY0xlZnRdLHN0ZXAgICAgICAgICAgIDsvLyBwU3JjTGVmdFs2KmxlZnRTdGVwXQotICAgICAgICBWTEQxICAgIHtkTGVmdFZhbDdbXX0sW3BUbXBdICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNypsZWZ0U3RlcF0KLSAgICAgICAgCi0gICAgICAgIEIgICAgICAgIERDQ2hyb21hOHg4UGxhbmVTdG9yZQotICAgICAgICAKLSAgICAgICAgCi1PTVhfVkNfQ0hST01BX1BMQU5FCi0gICAgICAgIEFERCAgICAgcFRtcCwgcFNyY0xlZnQsIGxlZnRTdGVwCi0gICAgICAgIEFERCAgICAgc3RlcCwgbGVmdFN0ZXAsIGxlZnRTdGVwCi0gICAgICAgIAotICAgICAgICBWTEQxICAgIGRBYm92ZVZhbCxbcFNyY0Fib3ZlXSAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVt4XSAgICAgIDowPD0geCA8PSA3ICAgCi0gICAgICAgIFZMRDEgICAgZEFib3ZlTGVmdFZhbFswXSxbcFNyY0Fib3ZlTGVmdF0KLSAgICAgICAgCi0gICAgICAgIFZMRDEgICAge2RMZWZ0VmFsWzBdfSxbcFNyY0xlZnRdLHN0ZXAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMCpsZWZ0U3RlcF0KLSAgICAgICAgVkxEMSAgICB7ZExlZnRWYWxbMV19LFtwVG1wXSxzdGVwICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsxKmxlZnRTdGVwXQotICAgICAgICBWTEQxICAgIHtkTGVmdFZhbFsyXX0sW3BTcmNMZWZ0XSxzdGVwICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzIqbGVmdFN0ZXBdCi0gICAgICAgIFZMRDEgICAge2RMZWZ0VmFsWzNdfSxbcFRtcF0sc3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMypsZWZ0U3RlcF0KLSAgICAgICAgVkxEMSAgICB7ZExlZnRWYWxbNF19LFtwU3JjTGVmdF0sc3RlcCAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFs0KmxlZnRTdGVwXQotICAgICAgICBWTEQxICAgIHtkTGVmdFZhbFs1XX0sW3BUbXBdLHN0ZXAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzUqbGVmdFN0ZXBdCi0gICAgICAgIFZMRDEgICAge2RMZWZ0VmFsWzZdfSxbcFNyY0xlZnRdLHN0ZXAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNipsZWZ0U3RlcF0KLSAgICAgICAgVkxEMSAgICB7ZExlZnRWYWxbN119LFtwVG1wXSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFs3KmxlZnRTdGVwXSAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBWUkVWNjQgIGRSZXZBYm92ZVZhbCxkQWJvdmVWYWwgICAgICAgICAgICAgICAgICAgICAgOy8vIFJldmVyc2Ugb3JkZXIgb2YgYnl0ZXMgPSBwU3JjQWJvdmVbMDoxOjI6Mzo0OjU6Njo3XQotICAgICAgICBWU1VCTCAgIHFBYm92ZTdtaW51czAsZFJldkFib3ZlVmFsLGRBYm92ZUxlZnRWYWwgICAgOy8vIHFBYm92ZTdtaW51czBbMF0gPSBwU3JjQWJvdmVbN10gLSBwU3JjQWJvdmVMZWZ0WzBdCi0gICAgICAgIFZTSFIgICAgZFJldkFib3ZlVmFsVTY0LGRSZXZBYm92ZVZhbFU2NCwjOCAgICAgICAgICA7Ly8gcFNyY0Fib3ZlW1g6MDoxOjI6Mzo0OjU6Nl0KLSAgICAgICAgVlNVQkwgICBxQWJvdmVEaWZmLGRSZXZBYm92ZVZhbCxkQWJvdmVWYWwgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbNl0gLSBwU3JjQWJvdmVbMF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbNV0gLSBwU3JjQWJvdmVbMV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbNF0gLSBwU3JjQWJvdmVbMl0KLSAgICAgICAgCi0gICAgICAgIFZSRVY2NCAgZFJldkxlZnRWYWwsZExlZnRWYWwgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUmV2ZXJzZSBvcmRlciBvZiBieXRlcyA9IHBTcmNMZWZ0WzA6MToyOjM6NDo1OjY6N10KLSAgICAgICAgVlNVQkwgICBxTGVmdDdtaW51czAsZFJldkxlZnRWYWwsZEFib3ZlTGVmdFZhbCAgICAgIDsvLyBxQWJvdmU3bWludXMwWzBdID0gcFNyY0xlZnRbN10gLSBwU3JjQWJvdmVMZWZ0WzBdCi0gICAgICAgIFZTSFIgICAgZFJldkxlZnRWYWxVNjQsZFJldkxlZnRWYWxVNjQsIzggICAgICAgICAgICA7Ly8gcFNyY0xlZnRbWDowOjE6MjozOjQ6NTo2XQotICAgICAgICBWU1VCTCAgIHFMZWZ0RGlmZixkUmV2TGVmdFZhbCxkTGVmdFZhbCAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzZdIC0gcFNyY0xlZnRbMF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFs1XSAtIHBTcmNMZWZ0WzFdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNF0gLSBwU3JjTGVmdFsyXQotICAgICAgICAKLSAgICAgICAgTERSICAgICBwTXVsdGlwbGllclRhYmxlLD1hcm1WQ000UDEwX011bHRpcGxpZXJUYWJsZUNocm9tYTh4OCAgIDsvLyBVc2VkIHRvIGNhbGN1bGF0ZSBIdmFsICYgVnZhbCAgCi0gICAgICAgIFZTSEwgICAgZEFib3ZlRGlmZjBVNjQsZEFib3ZlRGlmZjBVNjQsIzE2ICAKLSAgICAgICAgVkVYVCAgICBkRGlmZkFib3ZlVTgsZEFib3ZlRGlmZjBVOCxkQWJvdmU3bWludXMwVTgsIzIgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbIDctMCB8IDQtMiB8IDUtMSB8IDYtMCBdCi0gICAgICAgIFZMRDEgICAgZE11bHRpcGxpZXIsW3BNdWx0aXBsaWVyVGFibGVdISAKLSAgICAgICAgVlNITCAgICBkTGVmdERpZmYwVTY0LGRMZWZ0RGlmZjBVNjQsIzE2ICAKLSAgICAgICAgVkVYVCAgICBkRGlmZkxlZnRVOCxkTGVmdERpZmYwVTgsZExlZnQ3bWludXMwVTgsIzIgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsgNy0wIHwgNC0yIHwgNS0xIHwgNi0wIF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICBWTVVMICAgIGRIb3JQcmVkLGREaWZmQWJvdmVTMTYsZE11bHRpcGxpZXIgICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVsgNCooNy0wKSB8IDEqKDQtMikgfCAyKig1LTEpIHwgMyooNi0wKSBdCi0gICAgICAgIFZNVUwgICAgZFZlclByZWQsZERpZmZMZWZ0UzE2LGRNdWx0aXBsaWVyCi0gICAgICAgIFZQQUREICAgZEhWVmFsUzE2LGRIb3JQcmVkLGRWZXJQcmVkCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgVlBBRERMICBkSFZWYWxTMzIsZEhWVmFsUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBbVnxIXSBpbiAzMiBiaXRzIGVhY2gKLSAgICAgICAgVlNITCAgICBkSFZUZW1wUzMyLGRIVlZhbFMzMiwjNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAxNypIID0gMTYqSCArIEggPSAoSDw8NCkrSAotICAgICAgICBWQUREICAgIGRIVlZhbFMzMixkSFZWYWxTMzIsZEhWVGVtcFMzMiAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFsgMTcqViAgfCAxNypIIF1pbiAzMiBiaXRzIGVhY2gKLSAgICAgICAgVkxEMSAgICB7ZE11bHRpcGxpZXIwLGRNdWx0aXBsaWVyMX0sW3BNdWx0aXBsaWVyVGFibGVdICAgICAgICAgIDsvLyBxTXVsdGlwbGllciA9IFsgNHwzfDJ8MXwwfC0xfC0yfC0zIF0gIAotICAgICAgICBWUlNIUiAgIGRIVlZhbFMzMixkSFZWYWxTMzIsIzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFtjfGJdIGluIDE2Yml0cyBlYWNoCi0gICAgICAgIFZBRERMICAgcUEsZEFib3ZlVmFsLGRMZWZ0VmFsCi0gICAgICAgIFZEVVAgICAgcUEscUFbN10KLSAgICAgICAgVlNITCAgICBxQSxxQSwjNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBbYXxhfGF8YXxhfGF8YXxhXQotICAgICAgICBWRFVQICAgIHFCLGRIVlZhbFMxNlswXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFtifGJ8YnxifGJ8YnxifGJdCi0gICAgICAgIFZEVVAgICAgcUMsZEhWVmFsUzE2WzJdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gW2N8Y3xjfGN8Y3xjfGN8Y10KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBWTVVMICAgIHFCLHFCLHFNdWx0aXBsaWVyCi0gICAgICAgIFZNVUwgICAgcUMscUMscU11bHRpcGxpZXIKLSAgICAgICAgVkFERCAgICBxQixxQixxQSAKLSAgICAgICAgCi0gICAgICAgIFZEVVAgICAgcUMwLHFDWzBdCi0gICAgICAgIFZEVVAgICAgcUMxLHFDWzFdCi0gICAgICAgIFZEVVAgICAgcUMyLHFDWzJdCi0gICAgICAgIFZEVVAgICAgcUMzLHFDWzNdCi0gICAgICAgIFZEVVAgICAgcUM0LHFDWzRdCi0gICAgICAgIFZEVVAgICAgcUM1LHFDWzVdCi0gICAgICAgIFZEVVAgICAgcUM2LHFDWzZdCi0gICAgICAgIFZEVVAgICAgcUM3LHFDWzddCi0gICAgICAgIAotICAgICAgICBWQUREICAgIHFTdW0wLHFCLHFDMAotICAgICAgICBWQUREICAgIHFTdW0xLHFCLHFDMQotICAgICAgICBWQUREICAgIHFTdW0yLHFCLHFDMgotICAgICAgICBWQUREICAgIHFTdW0zLHFCLHFDMwotICAgICAgICBWQUREICAgIHFTdW00LHFCLHFDNAotICAgICAgICBWQUREICAgIHFTdW01LHFCLHFDNQotICAgICAgICBWQUREICAgIHFTdW02LHFCLHFDNgotICAgICAgICBWQUREICAgIHFTdW03LHFCLHFDNwotICAgICAgICAKLSAgICAgICAgVlFSU0hSVU4gZFN1bTAscVN1bTAsIzUgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIChPTVhfVTgpYXJtQ2xpcCgwLDI1NSwoU3VtKzE2KT4+NSkKLSAgICAgICAgVlFSU0hSVU4gZFN1bTEscVN1bTEsIzUKLSAgICAgICAgVlFSU0hSVU4gZFN1bTIscVN1bTIsIzUKLSAgICAgICAgVlFSU0hSVU4gZFN1bTMscVN1bTMsIzUKLSAgICAgICAgVlFSU0hSVU4gZFN1bTQscVN1bTQsIzUKLSAgICAgICAgVlFSU0hSVU4gZFN1bTUscVN1bTUsIzUKLSAgICAgICAgVlFSU0hSVU4gZFN1bTYscVN1bTYsIzUKLSAgICAgICAgVlFSU0hSVU4gZFN1bTcscVN1bTcsIzUgICAgICAKLQotRENDaHJvbWE4eDhQbGFuZVN0b3JlICAgICAgICAKLSAgICAgICAgQUREICAgICBwVG1wLCBwRHN0LCBkc3RTdGVwCi0gICAgICAgIEFERCAgICAgc3RlcCwgZHN0U3RlcCwgZHN0U3RlcAotICAgICAgICAKLSAgICAgICAgVlNUMSAgICBkU3VtMCxbcERzdF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMCpkc3RTdGVwK3hdIDowPD0geCA8PSA3Ci0gICAgICAgIFZTVDEgICAgZFN1bTEsW3BUbXBdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzEqZHN0U3RlcCt4XSA6MDw9IHggPD0gNwotICAgICAgICBWU1QxICAgIGRTdW0yLFtwRHN0XSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFsyKmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKLSAgICAgICAgVlNUMSAgICBkU3VtMyxbcFRtcF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMypkc3RTdGVwK3hdIDowPD0geCA8PSA3Ci0gICAgICAgIFZTVDEgICAgZFN1bTQsW3BEc3RdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzQqZHN0U3RlcCt4XSA6MDw9IHggPD0gNwotICAgICAgICBWU1QxICAgIGRTdW01LFtwVG1wXSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFs1KmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKLSAgICAgICAgVlNUMSAgICBkU3VtNixbcERzdF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbNipkc3RTdGVwK3hdIDowPD0geCA8PSA3Ci0gICAgICAgIFZTVDEgICAgZFN1bTcsW3BUbXBdICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzcqZHN0U3RlcCt4XSA6MDw9IHggPD0gNyAgICAgICAKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgotICAgICAgICBNX0VORAotICAgICAgICAKLSAgICAgICAgRU5ESUYgOy8vIENvcnRleEE4Ci0gICAgICAgIAotICAgICAgICBFTkQKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4IGVuZHMKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2X3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTZfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTMzMWY0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTZfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsNDM4ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNl9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICAxMjI5MAotOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgICAKLSAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAotICAgICAKLSAgCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gVGhpcyB0YWJsZSBmb3IgaW1wbGVtZW50aW5nIHN3aXRjaCBjYXNlIG9mIEMgaW4gYXNtIGJ5Ci07Ly8gdGhlIG1laHRvZCBvZiB0d28gbGV2ZWxzIG9mIGluZGV4aW5nLgotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgTV9UQUJMRSBhcm1WQ000UDEwX3BJbmRleFRhYmxlMTZ4MTYKLSAgICBEQ0QgIE9NWF9WQ18xNlgxNl9WRVJULCBPTVhfVkNfMTZYMTZfSE9SIAotICAgIERDRCAgT01YX1ZDXzE2WDE2X0RDLCAgIE9NWF9WQ18xNlgxNl9QTEFORQotICAgIAotCi0gICAgSUYgQ29ydGV4QTgKLQotICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9NdWx0aXBsaWVyVGFibGUxNngxNiwxCi0gICAgRENXICAgNywgIDYsICA1LCAgNCwgIDMsICAyLCAgMSwgIDggCi0gICAgRENXICAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcKLSAgICBEQ1cgICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNQotICAgICAgICAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gQ29uc3RhbnRzIAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAotQkxLX1NJWkUgICAgICAgIEVRVSAweDEwCi1NVUxfQ09OU1QwICAgICAgRVFVIDB4MDEwMTAxMDEKLU1VTF9DT05TVDEgICAgICBFUVUgMHgwMDA2MDAwNAotTVVMX0NPTlNUMiAgICAgIEVRVSAweDAwMDcwMDA1Ci1NVUxfQ09OU1QzICAgICAgRVFVIDB4MDAwMzAwMDEKLU1BU0tfQ09OU1QgICAgICBFUVUgMHgwMEZGMDBGRgotCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIFNjcmF0Y2ggdmFyaWFibGUKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi15ICAgICAgICAgICAgICAgUk4gMTIgICAKLXBjICAgICAgICAgICAgICBSTiAxNSAgIAotCi1yZXR1cm4gICAgICAgICAgUk4gMCAgICAKLXBUYWJsZSAgICAgICAgICBSTiA5ICAgIAotY291bnQgICAgICAgICAgIFJOIDExICAgCi1wTXVsdFRhYmxlICAgICAgUk4gOQotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IE5lb24gcmVnaXN0ZXJzCi07IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXFBYm92ZSAgICAgICAgICBRTiBRMC5VOAotcUxlZnQgICAgICAgICAgIFFOIFExLlU4Ci1xU3VtOCAgICAgICAgICAgUU4gUTAuVTE2Ci1kU3VtODAgICAgICAgICAgRE4gRDAuVTE2Ci1kU3VtODEgICAgICAgICAgRE4gRDEuVTE2Ci1kU3VtNCAgICAgICAgICAgRE4gRDAuVTE2Ci1kU3VtMiAgICAgICAgICAgRE4gRDAuVTMyCi1kU3VtMSAgICAgICAgICAgRE4gRDAuVTY0Ci1xT3V0ICAgICAgICAgICAgUU4gUTMuVTgKLWRTdW1MZWZ0ICAgICAgICBETiBENi5VNjQKLWRTdW1BYm92ZSAgICAgICBETiBENy5VNjQKLWRTdW0gICAgICAgICAgICBETiBEOC5VNjQKLWRTdW0wICAgICAgICAgICBETiBEOC5VOFswXQotCi1xSCAgICAgICAgICAgICAgUU4gUTExLlMzMgotcVYgICAgICAgICAgICAgIFFOIFExMi5TMzIKLXFBICAgICAgICAgICAgICBRTiBRMTEuUzE2Ci1xQiAgICAgICAgICAgICAgUU4gUTYuUzE2Ci1xQyAgICAgICAgICAgICAgUU4gUTcuUzE2Ci0KLXFCMCAgICAgICAgICAgICBRTiBRNS5TMTYKLXFCMSAgICAgICAgICAgICBRTiBRNi5TMTYKLWRBMSAgICAgICAgICAgICBETiBEMjMuUzE2Ci0KLWRIMCAgICAgICAgICAgICBETiBEMjIuUzMyCi1kSDEgICAgICAgICAgICAgRE4gRDIzLlMzMgotZFYwICAgICAgICAgICAgIEROIEQyNC5TMzIKLWRWMSAgICAgICAgICAgICBETiBEMjUuUzMyCi0KLXFIViAgICAgICAgICAgICBRTiBRMTEuUzY0Ci1xSFYwICAgICAgICAgICAgUU4gUTExLlMzMgotcUhWMSAgICAgICAgICAgIFFOIFExMi5TNjQKLQotZEhWMDAgICAgICAgICAgIEROIEQyMi5TMzIKLWRIVjAxICAgICAgICAgICBETiBEMjMuUzMyCi0KLWRIVjAgICAgICAgICAgICBETiBEMjIuUzE2WzBdCi1kSFYxICAgICAgICAgICAgRE4gRDIzLlMxNlswXQotZEhWMTAgICAgICAgICAgIEROIEQyNC5TNjQKLWRIVjExICAgICAgICAgICBETiBEMjUuUzY0Ci0KLXFTdW0wICAgICAgICAgICBRTiBRMC5TMTYKLXFTdW0xICAgICAgICAgICBRTiBRMS5TMTYKLQotZE91dDAgICAgICAgICAgIEROIEQ2LlU4Ci1kT3V0MSAgICAgICAgICAgRE4gRDcuVTgKLQotZExlZnQwICAgICAgICAgIEROIEQyLlU4Ci1kTGVmdDEgICAgICAgICAgRE4gRDMuVTgKLXFDb25zdCAgICAgICAgICBRTiBRMTMuUzE2Ci0KLWRBYm92ZTAgICAgICAgICBETiBEMC5VOAotZEFib3ZlMSAgICAgICAgIEROIEQxLlU4Ci0KLWRSZXZMZWZ0NjQgICAgICBETiBEMTIuVTY0Ci1kUmV2TGVmdCAgICAgICAgRE4gRDEyLlU4Ci1kUmV2QWJvdmU2NCAgICAgRE4gRDUuVTY0Ci1kUmV2QWJvdmUgICAgICAgRE4gRDUuVTgKLXFMZWZ0RGlmZiAgICAgICBRTiBROC5TMTYKLWRMZWZ0RGlmZjEgICAgICBETiBEMTcuUzE2Ci1kTGVmdERpZmY2NCAgICAgRE4gRDE3LlM2NAotcURpZmZMZWZ0ICAgICAgIFFOIFE4LlMxNgotcURpZmZBYm92ZSAgICAgIFFOIFE0LlMxNgotZEFib3ZlRGlmZjEgICAgIEROIEQ5LlMxNgotZEFib3ZlRGlmZjY0ICAgIEROIEQ5LlM2NAotcUFib3ZlRGlmZiAgICAgIFFOIFE0LlMxNgotCi1kQWJvdmVMZWZ0ICAgICAgRE4gRDQuVTgKLQotZERpZmZMZWZ0MCAgICAgIEROIEQxNi5TMTYKLWREaWZmTGVmdDEgICAgICBETiBEMTcuUzE2Ci1kRGlmZkFib3ZlMCAgICAgRE4gRDguUzE2Ci1kRGlmZkFib3ZlMSAgICAgRE4gRDkuUzE2Ci0KLXFMZWZ0MTVtaW51czAgICBRTiBRNy5TMTYKLWRMZWZ0MTVtaW51czAgICBETiBEMTQuUzE2Ci1xQWJvdmUxNW1pbnVzMCAgUU4gUTMuUzE2Ci1kQWJvdmUxNW1pbnVzMCAgRE4gRDYuUzE2Ci0KLXFNdWx0aXBsaWVyICAgICBRTiBRMTAuUzE2Ci1xTXVsdGlwbGllcjAgICAgUU4gUTEwLlMxNgotcU11bHRpcGxpZXIxICAgIFFOIFExMi5TMTYKLWRNdWx0aXBsaWVyMCAgICBETiBEMjAuUzE2Ci1kTXVsdGlwbGllcjEgICAgRE4gRDIxLlMxNgotCi1kQlBsdXNDTXVsdDcgICAgRE4gRDEuUzY0Ci1kQlBsdXNDTXVsdDdTMTYgRE4gRDEuUzE2Ci0KLXFUbXAgICAgICAgICAgICBRTiBRMC5VOAotCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcFNyY0xlZnQgICAgICAgIFJOIDAgICAgOy8vIGlucHV0IHBvaW50ZXIKLXBTcmNBYm92ZSAgICAgICBSTiAxICAgIDsvLyBpbnB1dCBwb2ludGVyCi1wU3JjQWJvdmVMZWZ0ICAgUk4gMiAgICA7Ly8gaW5wdXQgcG9pbnRlcgotcERzdCAgICAgICAgICAgIFJOIDMgICAgOy8vIG91dHB1dCBwb2ludGVyCi1sZWZ0U3RlcCAgICAgICAgUk4gNCAgICA7Ly8gaW5wdXQgdmFyaWFibGUKLWRzdFN0ZXAgICAgICAgICBSTiA1ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQotcHJlZE1vZGUgICAgICAgIFJOIDYgICAgOy8vIGlucHV0IHZhcmlhYmxlCi1hdmFpbGFiaWxpdHkgICAgUk4gNyAgICA7Ly8gaW5wdXQgdmFyaWFibGUKLQotcFRtcCAgICAgICAgICAgIFJOIDgKLXN0ZXAgICAgICAgICAgICBSTiAxMAotcFRtcDIgICAgICAgICAgIFJOIDExCi0KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYgc3RhcnRzCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAKLSAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgotICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2LCByMTEsIGQxNQotICAgICAgICAKLSAgICAgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKLSAgICAgICAgTV9BUkcgICAgTGVmdFN0ZXAsICAgICA0Ci0gICAgICAgIE1fQVJHICAgIERzdFN0ZXAsICAgICAgNAotICAgICAgICBNX0FSRyAgICBQcmVkTW9kZSwgICAgIDQKLSAgICAgICAgTV9BUkcgICAgQXZhaWxhYmlsaXR5LCA0Ci0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9NAotICAgICAgICAKLSAgICAgICAgTERSICAgICAgcFRhYmxlLD1hcm1WQ000UDEwX3BJbmRleFRhYmxlMTZ4MTYgOy8vIExvYWQgaW5kZXggdGFibGUgZm9yIHN3aXRjaCBjYXNlCi0gICAgICAgIAotICAgICAgICA7Ly8gTG9hZCBhcmd1bWVudCBmcm9tIHRoZSBzdGFjawotICAgICAgICBNX0xEUiAgICBwcmVkTW9kZSwgUHJlZE1vZGUgICAgICAgICAgICAgICAgICA7Ly8gQXJnIHByZWRNb2RlIGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZyAKLSAgICAgICAgTV9MRFIgICAgbGVmdFN0ZXAsIExlZnRTdGVwICAgICAgICAgICAgICAgICAgOy8vIEFyZyBsZWZ0U3RlcCBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgCi0gICAgICAgIE1fTERSICAgIGRzdFN0ZXAsICBEc3RTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBBcmcgZHN0U3RlcCBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgICAgICAgICAKLSAgICAgICAgTV9MRFIgICAgYXZhaWxhYmlsaXR5LCBBdmFpbGFiaWxpdHkgICAgICAgICAgOy8vIEFyZyBhdmFpbGFiaWxpdHkgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnCi0gICAgICAgIAotICAgICAgICBNT1YgICAgICB5LCAjQkxLX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gT3V0ZXIgTG9vcCBDb3VudAotICAgICAgICBMRFIgICAgICBwYywgW3BUYWJsZSwgcHJlZE1vZGUsIExTTCAjMl0gICAgICA7Ly8gQnJhbmNoIHRvIHRoZSBjYXNlIGJhc2VkIG9uIHByZU1vZGUKLSAgICAgICAgCi1PTVhfVkNfMTZYMTZfVkVSVAotICAgICAgICBWTEQxICAgIHFBYm92ZSwgIFtwU3JjQWJvdmVdCi0gICAgICAgIEFERCAgICAgcFRtcCwgcERzdCwgZHN0U3RlcAotICAgICAgICBBREQgICAgIHN0ZXAsIGRzdFN0ZXAsIGRzdFN0ZXAKLSAgICAgICAgVlNUMSAgICBxQWJvdmUsIFtwRHN0XSwgc3RlcAotICAgICAgICBWU1QxICAgIHFBYm92ZSwgW3BUbXBdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgcUFib3ZlLCBbcERzdF0sIHN0ZXAKLSAgICAgICAgVlNUMSAgICBxQWJvdmUsIFtwVG1wXSwgc3RlcAotICAgICAgICBWU1QxICAgIHFBYm92ZSwgW3BEc3RdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgcUFib3ZlLCBbcFRtcF0sIHN0ZXAKLSAgICAgICAgVlNUMSAgICBxQWJvdmUsIFtwRHN0XSwgc3RlcAotICAgICAgICBWU1QxICAgIHFBYm92ZSwgW3BUbXBdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgcUFib3ZlLCBbcERzdF0sIHN0ZXAKLSAgICAgICAgVlNUMSAgICBxQWJvdmUsIFtwVG1wXSwgc3RlcAotICAgICAgICBWU1QxICAgIHFBYm92ZSwgW3BEc3RdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgcUFib3ZlLCBbcFRtcF0sIHN0ZXAKLSAgICAgICAgVlNUMSAgICBxQWJvdmUsIFtwRHN0XSwgc3RlcAotICAgICAgICBWU1QxICAgIHFBYm92ZSwgW3BUbXBdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgcUFib3ZlLCBbcERzdF0KLSAgICAgICAgVlNUMSAgICBxQWJvdmUsIFtwVG1wXQotICAgICAgICBNT1YgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIgICAgICAgICAgICAgICA7Ly8gcmV0dXJuTm9FcnJvcgotICAgICAgICBNX0VYSVQKLSAgICAgICAgCi1PTVhfVkNfMTZYMTZfSE9SCi0gICAgICAgIEFERCAgICAgcFRtcCwgcFNyY0xlZnQsIGxlZnRTdGVwCi0gICAgICAgIEFERCAgICAgbGVmdFN0ZXAsIGxlZnRTdGVwLCBsZWZ0U3RlcAotICAgICAgICBBREQgICAgIHBUbXAyLCBwRHN0LCBkc3RTdGVwCi0gICAgICAgIEFERCAgICAgZHN0U3RlcCwgZHN0U3RlcCwgZHN0U3RlcAotTG9vcEhvciAKLSAgICAgICAgVkxEMSAgICAge3FMZWZ0W119LCBbcFNyY0xlZnRdLCBsZWZ0U3RlcCAgICAgICAKLSAgICAgICAgVkxEMSAgICAge3FUbXBbXX0sIFtwVG1wXSwgbGVmdFN0ZXAgICAgICAgCi0gICAgICAgIFNVQlMgICAgIHksIHksICM4Ci0gICAgICAgIFZTVDEgICAgIHFMZWZ0LCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgVlNUMSAgICAgcVRtcCwgW3BUbXAyXSwgZHN0U3RlcAotICAgICAgICBWTEQxICAgICB7cUxlZnRbXX0sIFtwU3JjTGVmdF0sIGxlZnRTdGVwICAgICAgIAotICAgICAgICBWTEQxICAgICB7cVRtcFtdfSwgW3BUbXBdLCBsZWZ0U3RlcCAgICAgICAKLSAgICAgICAgVlNUMSAgICAgcUxlZnQsIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBWU1QxICAgICBxVG1wLCBbcFRtcDJdLCBkc3RTdGVwCi0gICAgICAgIFZMRDEgICAgIHtxTGVmdFtdfSwgW3BTcmNMZWZ0XSwgbGVmdFN0ZXAgICAgICAgCi0gICAgICAgIFZMRDEgICAgIHtxVG1wW119LCBbcFRtcF0sIGxlZnRTdGVwICAgICAgIAotICAgICAgICBWU1QxICAgICBxTGVmdCwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgIHFUbXAsIFtwVG1wMl0sIGRzdFN0ZXAKLSAgICAgICAgVkxEMSAgICAge3FMZWZ0W119LCBbcFNyY0xlZnRdLCBsZWZ0U3RlcCAgICAgICAKLSAgICAgICAgVkxEMSAgICAge3FUbXBbXX0sIFtwVG1wXSwgbGVmdFN0ZXAgICAgICAgCi0gICAgICAgIFZTVDEgICAgIHFMZWZ0LCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgVlNUMSAgICAgcVRtcCwgW3BUbXAyXSwgZHN0U3RlcAotICAgICAgICAKLSAgICAgICAgQk5FICAgICAgTG9vcEhvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9vcCBmb3IgMTYgdGltZXMKLSAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgotICAgICAgICBNX0VYSVQKLSAgICAgICAgCi1PTVhfVkNfMTZYMTZfREMKLSAgICAgICAgTU9WICAgICAgY291bnQsICMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGNvdW50ID0gMAotICAgICAgICBUU1QgICAgICBhdmFpbGFiaWxpdHksICNPTVhfVkNfTEVGVAotICAgICAgICBCRVEgICAgICBVcHBlck9yTm9uZUF2YWlsYWJsZSAgICAgICAgICAgICAgICAgICAgICA7Ly8gSnVtcCB0byBVcHBlciBpZiBub3QgbGVmdAotCi0gICAgICAgIEFERCAgICAgcFRtcCwgcFNyY0xlZnQsIGxlZnRTdGVwCi0gICAgICAgIEFERCAgICAgc3RlcCwgbGVmdFN0ZXAsIGxlZnRTdGVwCi0KLSAgICAgICAgVkxEMSAgICB7cUxlZnRbMF19LCBbcFNyY0xlZnRdLHN0ZXAgICAgCi0gICAgICAgIFZMRDEgICAge3FMZWZ0WzFdfSwgW3BUbXBdLHN0ZXAgICAKLSAgICAgICAgVkxEMSAgICB7cUxlZnRbMl19LCBbcFNyY0xlZnRdLHN0ZXAgICAKLSAgICAgICAgVkxEMSAgICB7cUxlZnRbM119LCBbcFRtcF0sc3RlcAotICAgICAgICBWTEQxICAgIHtxTGVmdFs0XX0sIFtwU3JjTGVmdF0sc3RlcCAgIAotICAgICAgICBWTEQxICAgIHtxTGVmdFs1XX0sIFtwVG1wXSxzdGVwICAgCi0gICAgICAgIFZMRDEgICAge3FMZWZ0WzZdfSwgW3BTcmNMZWZ0XSxzdGVwICAgIAotICAgICAgICBWTEQxICAgIHtxTGVmdFs3XX0sIFtwVG1wXSxzdGVwCi0gICAgICAgIFZMRDEgICAge3FMZWZ0WzhdfSwgW3BTcmNMZWZ0XSxzdGVwICAgIAotICAgICAgICBWTEQxICAgIHtxTGVmdFs5XX0sIFtwVG1wXSxzdGVwICAgCi0gICAgICAgIFZMRDEgICAge3FMZWZ0WzEwXX0sW3BTcmNMZWZ0XSxzdGVwICAgCi0gICAgICAgIFZMRDEgICAge3FMZWZ0WzExXX0sW3BUbXBdLHN0ZXAgICAgCi0gICAgICAgIFZMRDEgICAge3FMZWZ0WzEyXX0sW3BTcmNMZWZ0XSxzdGVwICAgCi0gICAgICAgIFZMRDEgICAge3FMZWZ0WzEzXX0sW3BUbXBdLHN0ZXAgICAKLSAgICAgICAgVkxEMSAgICB7cUxlZnRbMTRdfSxbcFNyY0xlZnRdLHN0ZXAgICAgCi0gICAgICAgIFZMRDEgICAge3FMZWZ0WzE1XX0sW3BUbXBdIAotICAgICAgICAKLSAgICAgICAgVlBBRERMICAgcVN1bTgsIHFMZWZ0Ci0gICAgICAgIEFERCAgICAgY291bnQsIGNvdW50LCAjMSAgICAKLSAgICAgICAgVlBBREQgICAgZFN1bTQsIGRTdW04MCwgZFN1bTgxCi0gICAgICAgIFZQQURETCAgIGRTdW0yLCBkU3VtNAotICAgICAgICBWUEFEREwgICBkU3VtTGVmdCwgZFN1bTIKLSAgICAgICAgVlJTSFIgICAgZFN1bSwgZFN1bUxlZnQsICM0Ci0gICAgICAgIAotVXBwZXJPck5vbmVBdmFpbGFibGUKLSAgICAgICAgVFNUICAgICAgYXZhaWxhYmlsaXR5LCAgI09NWF9WQ19VUFBFUiAgICAgICAgICAgICAgOy8vIGlmKGF2YWlsYWJpbGl0eSAmICNPTVhfVkNfVVBQRVIpCi0gICAgICAgIEJFUSAgICAgIEJvdGhPck5vbmVBdmFpbGFibGUgICAgICAgICAgICAgICAgICAgICAgIDsvLyBKdW1wIHRvIExlZnQgaWYgbm90IHVwcGVyCi0gICAgICAgIFZMRDEgICAgIHFBYm92ZSwgW3BTcmNBYm92ZV0KLSAgICAgICAgQUREICAgICAgY291bnQsIGNvdW50LCAjMSAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGlmIHVwcGVyIGluYyBjb3VudCBieSAxCi0gICAgICAgIFZQQURETCAgIHFTdW04LCBxQWJvdmUKLSAgICAgICAgVlBBREQgICAgZFN1bTQsIGRTdW04MCwgZFN1bTgxCi0gICAgICAgIFZQQURETCAgIGRTdW0yLCBkU3VtNAotICAgICAgICBWUEFEREwgICBkU3VtQWJvdmUsIGRTdW0yCi0gICAgICAgIFZSU0hSICAgIGRTdW0sIGRTdW1BYm92ZSwgIzQKLSAgICAgICAgCi1Cb3RoT3JOb25lQXZhaWxhYmxlCi0gICAgICAgIENNUCAgICAgIGNvdW50LCAjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY2hlY2sgaWYgYm90aCBhdmFpbGFibGUKLSAgICAgICAgQk5FICAgICAgTm9uZUF2YWlsYWJsZQotICAgICAgICBWQUREICAgICBkU3VtLCBkU3VtQWJvdmUsIGRTdW1MZWZ0Ci0gICAgICAgIFZSU0hSICAgIGRTdW0sIGRTdW0sICM1Ci0gICAgICAgIAotCi1Ob25lQXZhaWxhYmxlCi0gICAgICAgIFZEVVAgICAgIHFPdXQsIGRTdW0wICAgICAgICAKLSAgICAgICAgQ01QICAgICAgY291bnQsICMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBjaGVjayBpZiBub25lIGF2YWlsYWJsZQotICAgICAgICBBREQgICAgICBwVG1wLCBwRHN0LCBkc3RTdGVwCi0gICAgICAgIEFERCAgICAgIHN0ZXAsIGRzdFN0ZXAsIGRzdFN0ZXAKLSAgICAgICAgQk5FICAgICAgTG9vcERDCi0gICAgICAgIFZNT1YgICAgIHFPdXQsICMxMjgKLUxvb3BEQyAgICAgICAgCi0gICAgICAgIFZTVDEgICAgcU91dCwgW3BEc3RdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgcU91dCwgW3BUbXBdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgcU91dCwgW3BEc3RdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgcU91dCwgW3BUbXBdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgcU91dCwgW3BEc3RdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgcU91dCwgW3BUbXBdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgcU91dCwgW3BEc3RdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgcU91dCwgW3BUbXBdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgcU91dCwgW3BEc3RdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgcU91dCwgW3BUbXBdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgcU91dCwgW3BEc3RdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgcU91dCwgW3BUbXBdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgcU91dCwgW3BEc3RdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgcU91dCwgW3BUbXBdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgcU91dCwgW3BEc3RdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgcU91dCwgW3BUbXBdLCBzdGVwCi0gICAgICAgIE1PViAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgotICAgICAgICBNX0VYSVQKLQotT01YX1ZDXzE2WDE2X1BMQU5FCi0gICAgICAgIExEUiAgICAgcE11bHRUYWJsZSwgPWFybVZDTTRQMTBfTXVsdGlwbGllclRhYmxlMTZ4MTYKLSAgICAgICAgVkxEMSAgICBxQWJvdmUsIFtwU3JjQWJvdmVdICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbeF0gICAgICA6MDw9IHggPD0gNyAgICAKLSAgICAgICAgVkxEMSAgICBkQWJvdmVMZWZ0WzBdLFtwU3JjQWJvdmVMZWZ0XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIEFERCAgICAgcFRtcCwgcFNyY0xlZnQsIGxlZnRTdGVwCi0gICAgICAgIEFERCAgICAgc3RlcCwgbGVmdFN0ZXAsIGxlZnRTdGVwCi0gICAgICAgIFZMRDEgICAge3FMZWZ0WzBdfSwgIFtwU3JjTGVmdF0sc3RlcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBWTEQxICAgIHtxTGVmdFsxXX0sICBbcFRtcF0sc3RlcCAgICAgIAotICAgICAgICBWTEQxICAgIHtxTGVmdFsyXX0sICBbcFNyY0xlZnRdLHN0ZXAgIAotICAgICAgICBWTEQxICAgIHtxTGVmdFszXX0sICBbcFRtcF0sc3RlcCAgICAgICAKLSAgICAgICAgVkxEMSAgICB7cUxlZnRbNF19LCAgW3BTcmNMZWZ0XSxzdGVwICAKLSAgICAgICAgVkxEMSAgICB7cUxlZnRbNV19LCAgW3BUbXBdLHN0ZXAgICAgICAKLSAgICAgICAgVkxEMSAgICB7cUxlZnRbNl19LCAgW3BTcmNMZWZ0XSxzdGVwICAgCi0gICAgICAgIFZMRDEgICAge3FMZWZ0WzddfSwgIFtwVG1wXSxzdGVwCi0gICAgICAgIFZMRDEgICAge3FMZWZ0WzhdfSwgIFtwU3JjTGVmdF0sc3RlcCAgIAotICAgICAgICBWTEQxICAgIHtxTGVmdFs5XX0sICBbcFRtcF0sc3RlcCAgICAgIAotICAgICAgICBWTEQxICAgIHtxTGVmdFsxMF19LCBbcFNyY0xlZnRdLHN0ZXAgIAotICAgICAgICBWTEQxICAgIHtxTGVmdFsxMV19LCBbcFRtcF0sc3RlcCAgICAgICAKLSAgICAgICAgVkxEMSAgICB7cUxlZnRbMTJdfSwgW3BTcmNMZWZ0XSxzdGVwICAKLSAgICAgICAgVkxEMSAgICB7cUxlZnRbMTNdfSwgW3BUbXBdLHN0ZXAgICAgICAKLSAgICAgICAgVkxEMSAgICB7cUxlZnRbMTRdfSwgW3BTcmNMZWZ0XSxzdGVwICAgCi0gICAgICAgIFZMRDEgICAge3FMZWZ0WzE1XX0sIFtwVG1wXSAgIAotCi0gICAgICAgIFZSRVY2NCAgZFJldkFib3ZlLCBkQWJvdmUxICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzE1OjE0OjEzOjEyOjExOjEwOjk6OF0gCi0gICAgICAgIFZTVUJMICAgcUFib3ZlMTVtaW51czAsIGRSZXZBYm92ZSwgZEFib3ZlTGVmdCAgICAgICA7Ly8gcUFib3ZlN21pbnVzMFswXSA9IHBTcmNBYm92ZVsxNV0gLSBwU3JjQWJvdmVMZWZ0WzBdIAotICAgICAgICBWU0hSICAgIGRSZXZBYm92ZTY0LCBkUmV2QWJvdmU2NCwgIzggICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVsxNDoxMzoxMjoxMToxMDo5Ojg6WF0gCi0gICAgICAgIFZTVUJMICAgcUFib3ZlRGlmZiwgZFJldkFib3ZlLCBkQWJvdmUwICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFZTSEwgICAgZEFib3ZlRGlmZjY0LCBkQWJvdmVEaWZmNjQsICMxNiAKLSAgICAgICAgVkVYVCAgICBkRGlmZkFib3ZlMSwgZEFib3ZlRGlmZjEsIGRBYm92ZTE1bWludXMwLCAjMSAgCi0KLSAgICAgICAgVlJFVjY0ICBkUmV2TGVmdCxkTGVmdDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsxNToxNDoxMzoxMjoxMToxMDo5OjhdIAotICAgICAgICBWU1VCTCAgIHFMZWZ0MTVtaW51czAsZFJldkxlZnQsIGRBYm92ZUxlZnQgICAgICAgICAgOy8vIHFBYm92ZTdtaW51czBbMF0gPSBwU3JjTGVmdFs3XSAtIHBTcmNBYm92ZUxlZnRbMF0gCi0gICAgICAgIFZTSFIgICAgZFJldkxlZnQ2NCwgZFJldkxlZnQ2NCwgIzggICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMTQ6MTM6MTI6MTE6MTA6OTo4OlhdIAotICAgICAgICBWU1VCTCAgIHFMZWZ0RGlmZixkUmV2TGVmdCwgZExlZnQwICAgICAgICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gTXVsdGlwbGllciA9IFs4fDF8MnwuLi58Nnw3XQotICAgICAgICBWTEQxICAgIHFNdWx0aXBsaWVyLCBbcE11bHRUYWJsZV0hICAgICAgICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICBWU0hMICAgIGRMZWZ0RGlmZjY0LCBkTGVmdERpZmY2NCwgIzE2Ci0gICAgICAgIFZFWFQgICAgZERpZmZMZWZ0MSwgZExlZnREaWZmMSwgZExlZnQxNW1pbnVzMCwgIzEgICAgIAotICAgICAgICAKLSAgICAgICAgVk1VTEwgICBxSCxkRGlmZkFib3ZlMCwgZE11bHRpcGxpZXIwICAgICAgICAgICAgICAgIAotICAgICAgICBWTVVMTCAgIHFWLGREaWZmTGVmdDAsICBkTXVsdGlwbGllcjAgICAgICAgICAgICAgICAgCi0gICAgICAgIFZNTEFMICAgcUgsZERpZmZBYm92ZTEsIGRNdWx0aXBsaWVyMSAKLSAgICAgICAgVk1MQUwgICBxVixkRGlmZkxlZnQxLCAgZE11bHRpcGxpZXIxCi0gICAgICAgIAotICAgICAgICBWUEFERCAgIGRIVjAwLGRIMSxkSDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgVlBBREQgICBkSFYwMSxkVjEsZFYwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFZQQURETCAgcUhWLCBxSFYwCi0gICAgICAgIFZTSEwgICAgcUhWMSxxSFYsIzIKLSAgICAgICAgVkFERCAgICBxSFYscUhWLHFIVjEgCi0gICAgICAgIAotICAgICAgICA7Ly8gSFYgPSBbYyA9ICgoNSpWKzMyKT4+NikgfCBiID0gKCg1KkgrMzIpPj42KV0KLSAgICAgICAgVlJTSFIgICBxSFYscUhWLCM2Ci0gICAgICAgIAotICAgICAgICA7Ly8gSFYxID0gW2MqN3xiKjddCi0gICAgICAgIFZTSEwgICAgcUhWMSxxSFYsIzMKLSAgICAgICAgVlNVQiAgICBxSFYxLHFIVjEscUhWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBNdWx0aXBsaWVyMSA9IFswfDF8MnwuLi58N10KLSAgICAgICAgVkxEMSAgICBxTXVsdGlwbGllcjAsIFtwTXVsdFRhYmxlXSEgICAgCi0gICAgICAgIFZEVVAgICAgcUIsIGRIVjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFZEVVAgICAgcUMsIGRIVjEgCi0gICAgICAgIAotICAgICAgICBWQURETCAgIHFBLGRBYm92ZTEsZExlZnQxCi0gICAgICAgIFZTSEwgICAgcUEscUEsICM0Ci0gICAgICAgIFZEVVAgICAgcUEsZEExWzNdICAKLSAgICAgICAgVkFERCAgICBkQlBsdXNDTXVsdDcsIGRIVjEwLCBkSFYxMQotICAgICAgICAKLSAgICAgICAgOy8vIE11bHRpcGxpZXIxID0gWzh8OXwxMHwuLi58MTVdCi0gICAgICAgIFZMRDEgICAgcU11bHRpcGxpZXIxLCBbcE11bHRUYWJsZV0KLSAgICAgICAgOy8vIENvbnN0ID0gYSAtIDcqKGIrYykKLSAgICAgICAgVkRVUCAgICBxQ29uc3QsIGRCUGx1c0NNdWx0N1MxNlswXQotICAgICAgICBWU1VCICAgIHFDb25zdCwgcUEsIHFDb25zdAotICAgICAgICAKLSAgICAgICAgOy8vIEIwID0gWzAqYnwxKmJ8MipifDMqYnwuLi4uLi58NypiXQotICAgICAgICBWTVVMICAgIHFCMCxxQixxTXVsdGlwbGllcjAKLSAgICAgICAgCi0gICAgICAgIDsvLyBCMCA9IFs4KmJ8OSpifDEwKmJ8MTEqYnwuLi4ufDE1KmJdCi0gICAgICAgIFZNVUwgICAgcUIxLHFCLHFNdWx0aXBsaWVyMQotICAgICAgICAKLSAgICAgICAgVkFERCAgICBxU3VtMCwgcUIwLCBxQ29uc3QKLSAgICAgICAgVkFERCAgICBxU3VtMSwgcUIxLCBxQ29uc3QgIAotICAgICAgICAKLSAgICAgICAgOy8vIExvb3BzIGZvciAxNiB0aW1lcwotTG9vcFBsYW5lICAgICAgIAotICAgICAgICA7Ly8gKGIqeCArIGMqeSArIEMpPj41Ci0gICAgICAgIFZRUlNIUlVOIGRPdXQwLCBxU3VtMCwjNQotICAgICAgICBWUVJTSFJVTiBkT3V0MSwgcVN1bTEsIzUgICAgICAKLSAgICAgICAgU1VCUyAgICAgeSwgeSwgIzEKLSAgICAgICAgVlNUMSAgICAgcU91dCxbcERzdF0sZHN0U3RlcAotICAgICAgICBWQUREICAgICBxU3VtMCxxU3VtMCxxQyAKLSAgICAgICAgVkFERCAgICAgcVN1bTEscVN1bTEscUMgCi0gICAgICAgIEJORSAgICAgIExvb3BQbGFuZQotICAgICAgICAKLSAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgotCi0gICAgICAgIE1fRU5ECi0gICAgICAgIAotICAgICAgICBFTkRJRiA7Ly8gQ29ydGV4QTgKLSAgICAgICAgICAgIAotICAgICAgICBFTkQKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNiBlbmRzCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0X3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0X3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU3ODBlZi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NF9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1NDUgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NF9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICAxMjI5MAotOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLSAgICAgICAgCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgICAgCi07Ly8gRGVmaW5lIHRoZSBwcm9jZXNzb3IgdmFyaWFudHMgc3VwcG9ydGVkIGJ5IHRoaXMgZmlsZQotICAgICAgICAgCi0gICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4Ci0gICAgICAgIAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIFRoaXMgdGFibGUgZm9yIGltcGxlbWVudGluZyBzd2l0Y2ggY2FzZSBvZiBDIGluIGFzbSBieQotOy8vIHRoZSBtZWh0b2Qgb2YgdHdvIGxldmVscyBvZiBpbmRleGluZy4KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9wU3dpdGNoVGFibGU0eDQKLSAgICBEQ0QgIE9NWF9WQ180eDRfVkVSVCwgICAgIE9NWF9WQ180eDRfSE9SIAotICAgIERDRCAgT01YX1ZDXzR4NF9EQywgICAgICAgT01YX1ZDXzR4NF9ESUFHX0RMCi0gICAgRENEICBPTVhfVkNfNHg0X0RJQUdfRFIsICBPTVhfVkNfNHg0X1ZSCi0gICAgRENEICBPTVhfVkNfNHg0X0hELCAgICAgICBPTVhfVkNfNHg0X1ZMCi0gICAgRENEICBPTVhfVkNfNHg0X0hVICAgCi0gICAgCi0gICAgICAgIAotICAgICAgICBJRiBDb3J0ZXhBOAotICAgICAgICAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gU2NyYXRjaCB2YXJpYWJsZQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXJldHVybiAgICAgICAgICBSTiAwCi1wVGFibGUgICAgICAgICAgUk4gOAotcGMgICAgICAgICAgICAgIFJOIDE1Ci0KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wU3JjTGVmdCAgICAgICAgUk4gMCAgICA7Ly8gaW5wdXQgcG9pbnRlcgotcFNyY0Fib3ZlICAgICAgIFJOIDEgICAgOy8vIGlucHV0IHBvaW50ZXIKLXBTcmNBYm92ZUxlZnQgICBSTiAyICAgIDsvLyBpbnB1dCBwb2ludGVyCi1wRHN0ICAgICAgICAgICAgUk4gMyAgICA7Ly8gb3V0cHV0IHBvaW50ZXIKLWxlZnRTdGVwICAgICAgICBSTiA0ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQotZHN0U3RlcCAgICAgICAgIFJOIDUgICAgOy8vIGlucHV0IHZhcmlhYmxlCi1wcmVkTW9kZSAgICAgICAgUk4gNiAgICA7Ly8gaW5wdXQgdmFyaWFibGUKLWF2YWlsYWJpbGl0eSAgICBSTiA3ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQotcERzdDEgICAgICAgICAgIFJOIDEgCi1wRHN0MiAgICAgICAgICAgUk4gNCAKLXBEc3QzICAgICAgICAgICBSTiA2IAotCi1wU3JjVG1wICAgICAgICAgUk4gOQotc3JjU3RlcCAgICAgICAgIFJOIDEwCi1wRHN0VG1wICAgICAgICAgUk4gMTEKLWRzdGVwICAgICAgICAgICBSTiAxMgotCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gTmVvbiByZWdpc3RlcnMKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0KLQotOy8vIE9NWF9WQ19DSFJPTUFfVkVSVAotZEFib3ZlVTMyICAgICAgIEROICBEMC5VMzIKLQotOy8vIE9NWF9WQ19DSFJPTUFfSE9SCi1kTGVmdFZhbDAgICAgICAgRE4gIEQwLjgKLWRMZWZ0VmFsMSAgICAgICBETiAgRDEuOAotZExlZnRWYWwyICAgICAgIEROICBEMi44Ci1kTGVmdFZhbDMgICAgICAgRE4gIEQzLjgKLWRMZWZ0VmFsMFUzMiAgICBETiAgRDAuVTMyCi1kTGVmdFZhbDFVMzIgICAgRE4gIEQxLlUzMgotZExlZnRWYWwyVTMyICAgIEROICBEMi5VMzIKLWRMZWZ0VmFsM1UzMiAgICBETiAgRDMuVTMyCi0KLTsvLyBPTVhfVkNfNHg0X0RDCi1kTGVmdFZhbCAgICAgICAgRE4gIEQwLlU4Ci1kTGVmdFZhbFUzMiAgICAgRE4gIEQwLlUzMgotZFN1bUFib3ZlTGVmdFUxNiAgRE4gIEQxLlUxNgotZFN1bUFib3ZlTGVmdFUzMiAgRE4gIEQxLlUzMgotZFN1bUFib3ZlTGVmdFU2NCAgRE4gIEQxLlU2NAotZFN1bUFib3ZlTGVmdFU4IEROICBEMS5VOAotZFN1bSAgICAgICAgICAgIEROICBEMC5VOAotCi1kU3VtTGVmdFZhbFUxNiAgRE4gIEQxLlUxNgotZFN1bUxlZnRWYWxVMzIgIEROICBEMS5VMzIKLWRTdW1MZWZ0VmFsVTY0ICBETiAgRDEuVTY0Ci1kU3VtTGVmdFZhbFU4ICAgRE4gIEQxLlU4Ci0KLWRBYm92ZVZhbCAgICAgICBETiAgRDAuVTgKLWRTdW1BYm92ZVZhbFUxNiAgRE4gIEQxLlUxNgotZFN1bUFib3ZlVmFsVTMyICBETiAgRDEuVTMyCi1kU3VtQWJvdmVWYWxVNjQgIEROICBEMS5VNjQKLWRTdW1BYm92ZVZhbFU4ICAgRE4gIEQxLlU4Ci1kQ29uc3QxMjhVOCAgICAgRE4gIEQwLlU4Ci0KLQotOy8vT01YX1ZDXzR4NF9ESUFHX0RMCi0KLWRBYm92ZSAgICAgICAgICBETiAgRDAuVTgKLWRVNyAgICAgICAgICAgICBETiAgRDIuVTgKLWRVMyAgICAgICAgICAgICBETiAgRDIuVTgKLWRBYm92ZTAgICAgICAgICBETiAgRDMuVTgKLWRBYm92ZTEgICAgICAgICBETiAgRDQuVTgKLWRBYm92ZTIgICAgICAgICBETiAgRDUuVTgKLWRUbXAgICAgICAgICAgICBETiAgRDYuVTgKLWRUbXAwICAgICAgICAgICBETiAgRDcuVTgKLWRUbXAxICAgICAgICAgICBETiAgRDguVTgKLWRUbXAyICAgICAgICAgICAgRE4gIEQ5LlU4Ci1kVG1wMyAgICAgICAgICAgIEROICBEMTAuVTgKLWRUbXBVMzIgICAgICAgICBETiAgRDYuVTMyCi0KLQotOy8vT01YX1ZDXzR4NF9ESUFHX0RSCi1kTGVmdCAgICAgICAgICAgRE4gIEQxLlU4Ci1kVUwgICAgICAgICAgICAgRE4gIEQyLlU4Ci0KLTsvL09NWF9WQ180eDRfVlIKLWRMZWZ0MCAgICAgICAgICBETiAgRDEuVTgKLWRMZWZ0MSAgICAgICAgICBETiAgRDIuVTgKLWRFdmVuMCAgICAgICAgICBETiAgRDMuVTgKLWRFdmVuMSAgICAgICAgICBETiAgRDQuVTgKLWRFdmVuMiAgICAgICAgICBETiAgRDUuVTgKLWRPZGQwICAgICAgICAgICBETiAgRDYuVTgKLWRPZGQxICAgICAgICAgICBETiAgRDExLlU4Ci1kT2RkMiAgICAgICAgICAgRE4gIEQxMi5VOAotZFRtcDNVMzIgICAgICAgIEROICBEMTAuVTMyICAgIAotZFRtcDJVMzIgICAgICAgIEROICBEOS5VMzIKLQotCi07Ly9PTVhfVkNfNHg0X0hECi1kVG1wMVU2NCAgICAgICAgRE4gIEQ4LlU2NAotZFRtcDBVNjQgICAgICAgIEROICBENy5VNjQKLWRUbXBVNjQgICAgICAgICBETiAgRDYuVTY0Ci1kVG1wVTMyICAgICAgICAgRE4gIEQ2LlUzMgotZFRtcDFVMzIgICAgICAgIEROICBEOC5VMzIKLQotOy8vT01YX1ZDXzR4NF9IVQotZEwzICAgICAgICAgICAgIEROICBEMi5VOAotZExlZnRIVTAgICAgICAgIEROICBEMy5VOAotZExlZnRIVTEgICAgICAgIEROICBENC5VOAotZExlZnRIVTIgICAgICAgIEROICBENS5VOAotZFRtcDBVMzIgICAgICAgIEROICBENy5VMzIKLQotCi0KLQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQgc3RhcnRzCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAKLSAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgotICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NCwgcjEyLGQxMgotICAgICAgICAKLSAgICAgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKLSAgICAgICAgTV9BUkcgICAgTGVmdFN0ZXAsICAgICA0Ci0gICAgICAgIE1fQVJHICAgIERzdFN0ZXAsICAgICAgNAotICAgICAgICBNX0FSRyAgICBQcmVkTW9kZSwgICAgIDQKLSAgICAgICAgTV9BUkcgICAgQXZhaWxhYmlsaXR5LCA0Ci0gICAgICAgIAotICAgICAgICAgICAgICAgIAotICAgICAgICBMRFIgICAgICBwVGFibGUsPWFybVZDTTRQMTBfcFN3aXRjaFRhYmxlNHg0ICA7Ly8gTG9hZCBpbmRleCB0YWJsZSBmb3Igc3dpdGNoIGNhc2UKLSAgICAgICAgCi0gICAgICAgIDsvLyBMb2FkIGFyZ3VtZW50IGZyb20gdGhlIHN0YWNrCi0gICAgICAgIE1fTERSRCAgIHByZWRNb2RlLGF2YWlsYWJpbGl0eSxQcmVkTW9kZSAgICAgOy8vIEFyZyBwcmVkTW9kZSAmIGF2YWlsYWJpbGl0eSBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgCi0gICAgICAgIE1fTERSRCAgIGxlZnRTdGVwLGRzdFN0ZXAsTGVmdFN0ZXAgICAgICAgICAgOy8vIEFyZyBsZWZ0U3RlcCAmIGRzdFN0ZXAgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgIHBjLCBbcFRhYmxlLCBwcmVkTW9kZSwgTFNMICMyXSAgICAgIDsvLyBCcmFuY2ggdG8gdGhlIGNhc2UgYmFzZWQgb24gcHJlTW9kZQotCi0KLU9NWF9WQ180eDRfSE9SCi0gICAgICAgIAotICAgICAgICBBREQgICAgIHBTcmNUbXAsIHBTcmNMZWZ0LCBsZWZ0U3RlcAotICAgICAgICBBREQgICAgIHNyY1N0ZXAsIGxlZnRTdGVwLCBsZWZ0U3RlcAotICAgICAgICA7Ly8gTG9hZCBMZWZ0IEVkZ2UKLSAgICAgICAgVkxEMSAgICB7ZExlZnRWYWwwW119LFtwU3JjTGVmdF0sc3JjU3RlcCAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzAqbGVmdFN0ZXBdCi0gICAgICAgIFZMRDEgICAge2RMZWZ0VmFsMVtdfSxbcFNyY1RtcF0sc3JjU3RlcCAgICAgICAgICAgIDsvLyAgICBwU3JjTGVmdFsxKmxlZnRTdGVwXQotICAgICAgICBWTEQxICAgIHtkTGVmdFZhbDJbXX0sW3BTcmNMZWZ0XSAgICAgICAgICAgICAgICAgICA7Ly8gICAgcFNyY0xlZnRbMipsZWZ0U3RlcF0KLSAgICAgICAgVkxEMSAgICB7ZExlZnRWYWwzW119LFtwU3JjVG1wXSAgICAgICAgICAgICAgICAgICAgOy8vICAgIHBTcmNMZWZ0WzMqbGVmdFN0ZXBdCi0gICAgICAgIAotICAgICAgICBBREQgICAgIHBEc3RUbXAsIHBEc3QsIGRzdFN0ZXAKLSAgICAgICAgQUREICAgICBkc3RlcCwgZHN0U3RlcCwgZHN0U3RlcAotICAgICAgICAKLSAgICAgICAgVlNUMSAgICBkTGVmdFZhbDBVMzJbMF0sW3BEc3RdLGRzdGVwICAgICAgICAgICAgICAgIDsvLyBwRHN0WzAqZHN0U3RlcCt4XSA6MDw9IHggPD0gNwotICAgICAgICBWU1QxICAgIGRMZWZ0VmFsMVUzMlswXSxbcERzdFRtcF0sZHN0ZXAgICAgICAgICAgICAgOy8vIHBEc3RbMSpkc3RTdGVwK3hdIDowPD0geCA8PSA3Ci0gICAgICAgIFZTVDEgICAgZExlZnRWYWwyVTMyWzBdLFtwRHN0XSAgICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFsyKmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKLSAgICAgICAgVlNUMSAgICBkTGVmdFZhbDNVMzJbMF0sW3BEc3RUbXBdICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzMqZHN0U3RlcCt4XSA6MDw9IHggPD0gNwotICAgICAgICAKLSAgICAgICAgQiAgICAgICAgRXhpdFByZWRpY3Q0eDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBCcmFuY2ggdG8gZXhpdCBjb2RlCi0gICAgICAgIAotT01YX1ZDXzR4NF9WRVJUCi0gICAgICAgIAotICAgICAgICA7Ly8gTG9hZCBVcHBlciBFZGdlCi0gICAgICAgIFZMRDEgICAgIGRBYm92ZVUzMlswXSxbcFNyY0Fib3ZlXQotICAgICAgICBBREQgICAgIHBEc3RUbXAsIHBEc3QsIGRzdFN0ZXAKLSAgICAgICAgQUREICAgICBkc3RlcCwgZHN0U3RlcCwgZHN0U3RlcAotICAgICAgICAKLURDUHJlZGljdDR4NFZlcnRTdG9yZSAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgVlNUMSAgICAgZEFib3ZlVTMyWzBdLFtwRHN0XSxkc3RlcAotICAgICAgICBWU1QxICAgICBkQWJvdmVVMzJbMF0sW3BEc3RUbXBdLGRzdGVwCi0gICAgICAgIFZTVDEgICAgIGRBYm92ZVUzMlswXSxbcERzdF0KLSAgICAgICAgVlNUMSAgICAgZEFib3ZlVTMyWzBdLFtwRHN0VG1wXQotCi0gICAgICAgIEIgICAgICAgIEV4aXRQcmVkaWN0NHg0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQnJhbmNoIHRvIGV4aXQgY29kZQotCi1PTVhfVkNfNHg0X0RDCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgVFNUICAgICBhdmFpbGFiaWxpdHksICNPTVhfVkNfTEVGVAotICAgICAgICBCRVEgICAgIERDUHJlZGljdDR4NExlZnROb3RBdmFpbGFibGUKLQotICAgICAgICBBREQgICAgIHBTcmNUbXAsIHBTcmNMZWZ0LCBsZWZ0U3RlcAotICAgICAgICBBREQgICAgIHNyY1N0ZXAsIGxlZnRTdGVwLCBsZWZ0U3RlcAotICAgICAgICA7Ly8gTG9hZCBMZWZ0IEVkZ2UKLSAgICAgICAgVkxEMSAgICB7ZExlZnRWYWxbMF19LFtwU3JjTGVmdF0sc3JjU3RlcCAgICAgICAgICAgIDsvLyBwU3JjTGVmdFswKmxlZnRTdGVwXQotICAgICAgICBWTEQxICAgIHtkTGVmdFZhbFsxXX0sW3BTcmNUbXBdLHNyY1N0ZXAgICAgICAgICAgICAgOy8vICAgIHBTcmNMZWZ0WzEqbGVmdFN0ZXBdCi0gICAgICAgIFZMRDEgICAge2RMZWZ0VmFsWzJdfSxbcFNyY0xlZnRdICAgICAgICAgICAgICAgICAgICA7Ly8gICAgcFNyY0xlZnRbMipsZWZ0U3RlcF0KLSAgICAgICAgVkxEMSAgICB7ZExlZnRWYWxbM119LFtwU3JjVG1wXSAgICAgICAgICAgICAgICAgICAgIDsvLyAgICBwU3JjTGVmdFszKmxlZnRTdGVwXQotICAgICAgICAKLSAgICAgICAgVFNUICAgICBhdmFpbGFiaWxpdHksICNPTVhfVkNfVVBQRVIKLSAgICAgICAgQkVRICAgICBEQ1ByZWRpY3Q0eDRMZWZ0T25seUF2YWlsYWJsZQotCi0gICAgICAgIDsvLyBMb2FkIFVwcGVyIEVkZ2UgYWxzbwotICAgICAgICBWTEQxICAgICBkTGVmdFZhbFUzMlsxXSxbcFNyY0Fib3ZlXSAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVswIHRvIDNdCi0gICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgCi0gICAgICAgIFZQQURETCAgIGRTdW1BYm92ZUxlZnRVMTYsIGRMZWZ0VmFsICAgICAgICAgICAgICAgICA7Ly8gW3BTcmNBYm92ZVsyKzMgfCAwKzFdIHwgcFNyY0xlZnRbMiszIHwgMCsxXV0gICAgICAgICAgICAgCi0gICAgICAgIFZQQURETCAgIGRTdW1BYm92ZUxlZnRVMzIsIGRTdW1BYm92ZUxlZnRVMTYgICAgICAgICA7Ly8gW3BTcmNBYm92ZVsyKzMrMCsxXSB8IHBTcmNMZWZ0WzIrMyswKzFdXSAKLSAgICAgICAgVlBBRERMICAgZFN1bUFib3ZlTGVmdFU2NCwgZFN1bUFib3ZlTGVmdFUzMiAgICAgICAgIDsvLyBbcFNyY0Fib3ZlWzIrMyswKzFdICsgcFNyY0xlZnRbMiszKzArMV1dICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgVlJTSFIgICAgZFN1bUFib3ZlTGVmdFU2NCxkU3VtQWJvdmVMZWZ0VTY0LCMzICAgICAgIDsvLyBTdW0gPSAoU3VtICsgNCkgPj4gMwotICAgICAgICBBREQgICAgIHBEc3RUbXAsIHBEc3QsIGRzdFN0ZXAKLSAgICAgICAgQUREICAgICBkc3RlcCwgZHN0U3RlcCwgZHN0U3RlcAotICAgICAgICBWRFVQICAgICBkU3VtLGRTdW1BYm92ZUxlZnRVOFswXQotICAgICAgICAKLSAgICAgICAgQiAgICAgICAgRENQcmVkaWN0NHg0VmVydFN0b3JlICAKLSAgICAgICAgCi1EQ1ByZWRpY3Q0eDRMZWZ0T25seUF2YWlsYWJsZQotCi0gICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIgICAgICAgICAgICAgICAgICAgICA7Ly8gcmV0dXJuTm9FcnJvcgotICAgICAgICAKLSAgICAgICAgVlBBRERMICAgZFN1bUxlZnRWYWxVMTYsIGRMZWZ0VmFsICAgICAgICAgICAgICAgICAgIDsvLyBbIFhYIHwgcFNyY0xlZnRbMiszIHwgMCsxXV0gICAgICAgICAgICAgCi0gICAgICAgIFZQQURETCAgIGRTdW1MZWZ0VmFsVTMyLCBkU3VtTGVmdFZhbFUxNiAgICAgICAgICAgICA7Ly8gWyBYWFhYIHwgcFNyY0xlZnRbMiszKzArMV1dIAotICAgICAgICAKLSAgICAgICAgVlJTSFIgICAgZFN1bUxlZnRWYWxVMzIsZFN1bUxlZnRWYWxVMzIsIzIgICAgICAgICAgIDsvLyBTdW0gPSAoU3VtICsgMikgPj4gMgotICAgICAgICBBREQgICAgIHBEc3RUbXAsIHBEc3QsIGRzdFN0ZXAKLSAgICAgICAgQUREICAgICBkc3RlcCwgZHN0U3RlcCwgZHN0U3RlcAotICAgICAgICBWRFVQICAgICBkU3VtLGRTdW1MZWZ0VmFsVThbMF0KLSAgICAgICAgCi0gICAgICAgIEIgICAgICAgIERDUHJlZGljdDR4NFZlcnRTdG9yZSAgIAotICAgICAgICAKLURDUHJlZGljdDR4NExlZnROb3RBdmFpbGFibGUKLSAgICAgICAgICAgICAgICAgCi0gICAgICAgIFRTVCAgICAgYXZhaWxhYmlsaXR5LCAjT01YX1ZDX1VQUEVSCi0gICAgICAgIEJFUSAgICAgRENQcmVkaWN0NHg0Tm9uZUF2YWlsYWJsZQotCi0gICAgICAgIDsvLyBMb2FkIFVwcGVyIEVkZ2UgCi0gICAgICAgIFZMRDEgICAgIGRBYm92ZVUzMlswXSxbcFNyY0Fib3ZlXSAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzAgdG8gM10gIAotICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCi0gICAgICAgIAotICAgICAgICBWUEFEREwgICBkU3VtQWJvdmVWYWxVMTYsIGRBYm92ZVZhbCAgICAgICAgICAgICAgICAgOy8vIFsgWFggfCBwU3JjQWJvdmVbMiszIHwgMCsxXV0gICAgICAgICAgICAgCi0gICAgICAgIFZQQURETCAgIGRTdW1BYm92ZVZhbFUzMiwgZFN1bUFib3ZlVmFsVTE2ICAgICAgICAgICA7Ly8gWyBYWFhYIHwgcFNyY0Fib3ZlWzIrMyswKzFdXSAKLSAgICAgICAgCi0gICAgICAgIFZSU0hSICAgIGRTdW1BYm92ZVZhbFUzMixkU3VtQWJvdmVWYWxVMzIsIzIgICAgICAgICA7Ly8gU3VtID0gKFN1bSArIDIpID4+IDIKLSAgICAgICAgQUREICAgICBwRHN0VG1wLCBwRHN0LCBkc3RTdGVwCi0gICAgICAgIEFERCAgICAgZHN0ZXAsIGRzdFN0ZXAsIGRzdFN0ZXAKLSAgICAgICAgVkRVUCAgICAgZFN1bSxkU3VtQWJvdmVWYWxVOFswXQotICAgICAgICAKLSAgICAgICAgQiAgICAgICAgRENQcmVkaWN0NHg0VmVydFN0b3JlICAgCi0gICAgICAgIAotRENQcmVkaWN0NHg0Tm9uZUF2YWlsYWJsZSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBWTU9WICAgICBkQ29uc3QxMjhVOCwjMHg4MCAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIDB4ODA4MDgwODA4MDgwODA4MCBpZihjb3VudCA9PSAwKQotICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCi0gICAgICAgIAotICAgICAgICBBREQgICAgIHBEc3RUbXAsIHBEc3QsIGRzdFN0ZXAKLSAgICAgICAgQUREICAgICBkc3RlcCwgZHN0U3RlcCwgZHN0U3RlcAotICAgICAgICBCICAgICAgICBEQ1ByZWRpY3Q0eDRWZXJ0U3RvcmUgICAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAKLU9NWF9WQ180eDRfRElBR19ETAotICAgICAgICAKLSAgICAgICAgVFNUICAgICBhdmFpbGFiaWxpdHksICNPTVhfVkNfVVBQRVJfUklHSFQKLSAgICAgICAgQkVRICAgICBEaWFnRExVcHBlclJpZ2h0Tm90QXZhaWxhYmxlCi0gICAgICAgCi0gICAgICAgIFZMRDEgICAgZEFib3ZlMCxbcFNyY0Fib3ZlXSAgICAgICAgICAgICAgICAgICAgIDsvLyBbVTd8VTZ8VTV8VTR8VTN8VTJ8VTF8VTBdIAotICAgICAgICBWRFVQICAgIGRVNywgZEFib3ZlMFs3XSAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gW1U3fFU3fFU3fFU3fFU3fFU3fFU3fFU3XQotICAgICAgICBWRVhUICAgIGRBYm92ZTEsIGRBYm92ZTAsIGRVNywgIzEgICAgICAgICAgICAgICA7Ly8gW1U3fFU3fFU2fFU1fFU0fFUzfFUyfFUxXQotICAgICAgICBWRVhUICAgIGRBYm92ZTIsIGRBYm92ZTAsIGRVNywgIzIgICAgICAgICAgICAgICA7Ly8gW1U3fFU3fFU3fFU2fFU1fFU0fFUzfFUyXSAKLSAgICAgICAgQiAgICAgICBEaWFnRExQcmVkaWN0NHg0U3RvcmUgICAgICAgICAKLSAgICAgICAKLURpYWdETFVwcGVyUmlnaHROb3RBdmFpbGFibGUKLSAgICAgICAgVkxEMSAgICBkQWJvdmVVMzJbMV0sW3BTcmNBYm92ZV0gICAgICAgICAgICAgICAgOy8vIFtVM3xVMnxVMXxVMHwtfC18LXwtXSAKLSAgICAgICAgVkRVUCAgICBkVTMsIGRBYm92ZVs3XSAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFtVMyBVMyBVMyBVMyBVMyBVMyBVMyBVM10KLQotICAgICAgICBWRVhUICAgIGRBYm92ZTAsIGRBYm92ZSwgZFUzLCAjNCAgICAgICAgICAgICAgICA7Ly8gW1UzIFUzIFUzIFUzIFUzIFUyIFUxIFUwXQotICAgICAgICBWRVhUICAgIGRBYm92ZTEsIGRBYm92ZSwgZFUzLCAjNSAgICAgICAgICAgICAgICA7Ly8gW1UzIFUzIFUzIFUzIFUzIFUzIFUyIFUxXQotICAgICAgICBWRVhUICAgIGRBYm92ZTIsIGRBYm92ZSwgZFUzLCAjNiAgICAgICAgICAgICAgICA7Ly8gW1UzIFUzIFUzIFUzIFUzIFUzIFUzIFUyXQotICAgICAgIAotRGlhZ0RMUHJlZGljdDR4NFN0b3JlICAKLSAgICAgICAgCi0gICAgICAgIFZIQUREICAgZFRtcCwgZEFib3ZlMCwgZEFib3ZlMgotICAgICAgICBWUkhBREQgIGRUbXAsIGRUbXAsIGRBYm92ZTEgICAgICAgICAgICAgICAgICAgICA7Ly8gKGErMipiK2MrMik+PjIKLSAgICAgICAgCi0KLSAgICAgICAgVlNUMSAgICBkVG1wVTMyWzBdLFtwRHN0XSxkc3RTdGVwCi0gICAgICAgIFZFWFQgICAgZFRtcCxkVG1wLGRUbXAsIzEKLSAgICAgICAgVlNUMSAgICBkVG1wVTMyWzBdLFtwRHN0XSxkc3RTdGVwCi0gICAgICAgIFZFWFQgICAgZFRtcCxkVG1wLGRUbXAsIzEKLSAgICAgICAgVlNUMSAgICBkVG1wVTMyWzBdLFtwRHN0XSxkc3RTdGVwCi0gICAgICAgIFZFWFQgICAgZFRtcCxkVG1wLGRUbXAsIzEKLSAgICAgICAgVlNUMSAgICBkVG1wVTMyWzBdLFtwRHN0XQotICAgICAgICAKLSAgICAgICAgQiAgICAgICAgRXhpdFByZWRpY3Q0eDQgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEJyYW5jaCB0byBleGl0IGNvZGUKLSAgICAgICAgCi0KLU9NWF9WQ180eDRfRElBR19EUgotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBMb2FkIFUwLFUxLFUyLFUzCi0gICAgICAgIAotICAgICAgICBWTEQxICAgIGRBYm92ZVUzMlswXSxbcFNyY0Fib3ZlXSAgICAgICAgICAgICAgICA7Ly8gW1h8WHxYfFh8VTN8VTJ8VTF8VTBdCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIDsvLyBMb2FkIFVMLEwwLEwxLEwyLEwzICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBkTGVmdCA9IFtVTHxMMHxMMXxMMnxMM3xYfFh8WF0gICAgCi0gICAgICAgIFZMRDEgICAge2RMZWZ0WzddfSxbcFNyY0Fib3ZlTGVmdF0gICAgICAgICAgICAgIAotICAgICAgICBBREQgICAgIHBTcmNUbXAsIHBTcmNMZWZ0LCBsZWZ0U3RlcAotICAgICAgICBBREQgICAgIHNyY1N0ZXAsIGxlZnRTdGVwLCBsZWZ0U3RlcAotICAgICAgICBBREQgICAgIHBEc3QxLHBEc3QsZHN0U3RlcAotICAgICAgICAKLSAgICAgICAgVkxEMSAgICB7ZExlZnRbNl19LFtwU3JjTGVmdF0sc3JjU3RlcCAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzAqbGVmdFN0ZXBdCi0gICAgICAgIFZMRDEgICAge2RMZWZ0WzVdfSxbcFNyY1RtcF0sc3JjU3RlcCAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsxKmxlZnRTdGVwXQotICAgICAgICBWTEQxICAgIHtkTGVmdFs0XX0sW3BTcmNMZWZ0XSAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMipsZWZ0U3RlcF0KLSAgICAgICAgVkxEMSAgICB7ZExlZnRbM119LFtwU3JjVG1wXSAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzMqbGVmdFN0ZXBdCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgVkVYVCAgICBkQWJvdmUwLGRMZWZ0LGRBYm92ZSwjMyAgICAgICAgICAgICAgICAgOy8vIFtVMnxVMXxVMHxVTHxMMHxMMXxMMnxMM10gICAKLSAgICAgICAgQUREICAgICBwRHN0MixwRHN0MSxkc3RTdGVwCi0gICAgICAgIFZFWFQgICAgZEFib3ZlMSxkTGVmdCxkQWJvdmUsIzQgICAgICAgICAgICAgICAgIDsvLyBbVTN8VTJ8VTF8VTB8VUx8TDB8TDF8TDJdICAgCi0gICAgICAgIEFERCAgICAgcERzdDMscERzdDIsZHN0U3RlcAotICAgICAgICBWRVhUICAgIGRBYm92ZTIsZExlZnQsZEFib3ZlLCM1ICAgICAgICAgICAgICAgICA7Ly8gWyBYfFUzfFUyfFUxfFUwfFVMfEwwfEwxXSAgIAotICAgICAgICAKLSAgICAgICAgVkhBREQgICBkVG1wLCBkQWJvdmUwLCBkQWJvdmUyCi0gICAgICAgIFZSSEFERCAgZFRtcCwgZFRtcCwgZEFib3ZlMSAgICAgICAgICAgICAgICAgICAgIDsvLyAoYSsyKmIrYysyKT4+MgotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFZTVDEgICAgZFRtcFUzMlswXSxbcERzdDNdICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBwVG1wWzBdLFsxXSxbMl0sWzNdIEAgcERzdDMKLSAgICAgICAgVkVYVCAgICBkVG1wLGRUbXAsZFRtcCwjMQotICAgICAgICBWU1QxICAgIGRUbXBVMzJbMF0sW3BEc3QyXSAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgcFRtcFsxXSxbMl0sWzNdLFs0XSBAIHBEc3QyCi0gICAgICAgIFZFWFQgICAgZFRtcCxkVG1wLGRUbXAsIzEKLSAgICAgICAgVlNUMSAgICBkVG1wVTMyWzBdLFtwRHN0MV0gICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHBUbXBbMl0sWzNdLFs0XSxbNV0gQCBwRHN0MQotICAgICAgICBWRVhUICAgIGRUbXAsZFRtcCxkVG1wLCMxCi0gICAgICAgIFZTVDEgICAgZFRtcFUzMlswXSxbcERzdF0gICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBwVG1wWzNdLFs0XSxbNV0sWzZdIEAgcERzdAotICAgICAgICAKLSAgICAgICAgQiAgICAgICAgRXhpdFByZWRpY3Q0eDQgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEJyYW5jaCB0byBleGl0IGNvZGUKLQotT01YX1ZDXzR4NF9WUgotCi0gICAgICAgIAotICAgICAgICA7Ly8gTG9hZCBVTCxVMCxVMSxVMixVMwotICAgICAgICBWTEQxICAgIGRBYm92ZVUzMlswXSxbcFNyY0Fib3ZlXQotICAgICAgICBWTEQxICAgIGRBYm92ZVs3XSxbcFNyY0Fib3ZlTGVmdF0gICAgICAgICAgICAgICA7Ly8gW1VMfFh8WHxYfFUzfFUyfFUxfFUwXQotICAgICAgICAKLSAgICAgICAgOy8vIExvYWQgTDAsTDEsTDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGRMZWZ0MCA9IFtMMHxMMnxYfFh8WHxYfFh8WF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGRMZWZ0MSA9IFtMMXwgWHxYfFh8WHxYfFh8WF0gICAgCi0gICAgICAgIFZMRDEgICAge2RMZWZ0MFs3XX0sW3BTcmNMZWZ0XSxsZWZ0U3RlcCAgICAgICAgIDsvLyBwU3JjTGVmdFswKmxlZnRTdGVwXQotICAgICAgICBWTEQxICAgIHtkTGVmdDFbN119LFtwU3JjTGVmdF0sbGVmdFN0ZXAgICAgICAgICA7Ly8gcFNyY0xlZnRbMSpsZWZ0U3RlcF0KLSAgICAgICAgVkxEMSAgICB7ZExlZnQwWzZdfSxbcFNyY0xlZnRdICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzIqbGVmdFN0ZXBdCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgVkVYVCAgICBkT2RkMixkQWJvdmUsZEFib3ZlLCM3ICAgICAgICAgICAgICAgICAgOy8vIFsgeCB4IHggVTMgVTIgVTEgVTAgVUwgXQotICAgICAgICBWRVhUICAgIGRFdmVuMCxkTGVmdDAsZE9kZDIsIzYgICAgICAgICAgICAgICAgICA7Ly8gWyB4IHggeCBVMSBVMCBVTCBMMCBMMiBdCi0gICAgICAgIFZFWFQgICAgZEV2ZW4xLGRMZWZ0MSxkT2RkMiwjNyAgICAgICAgICAgICAgICAgIDsvLyBbIHggeCB4IFUyIFUxIFUwIFVMIEwxIF0KLSAgICAgICAgVkVYVCAgICBkRXZlbjIsZExlZnQwLGRBYm92ZSwjNyAgICAgICAgICAgICAgICAgOy8vIFsgeCB4IHggVTMgVTIgVTEgVTAgTDAgXQotICAgICAgICBWRVhUICAgIGRPZGQwLGRMZWZ0MSxkQWJvdmUsIzcgICAgICAgICAgICAgICAgICA7Ly8gWyB4IHggeCBVMyBVMiBVMSBVMCBMMSBdCi0gICAgICAgIFZFWFQgICAgZE9kZDEsZExlZnQwLGRPZGQyLCM3ICAgICAgICAgICAgICAgICAgIDsvLyBbIHggeCB4IFUyIFUxIFUwIFVMIEwwIF0KLSAgICAgICAgCi0gICAgICAgIFZIQUREICAgZFRtcDEsIGRPZGQwLCBkT2RkMgotICAgICAgICBWUkhBREQgIGRUbXAxLCBkVG1wMSwgZE9kZDEgICAgICAgICAgICAgICAgICAgICA7Ly8gVG1wWyB4IHggeCA5IDcgNSAzIDEgXQotICAgICAgICAKLSAgICAgICAgVkhBREQgICBkVG1wMCwgZEV2ZW4wLCBkRXZlbjIKLSAgICAgICAgVlJIQUREICBkVG1wMCwgZFRtcDAsIGRFdmVuMSAgICAgICAgICAgICAgICAgICAgOy8vIFRtcFsgeCB4IHggOCA2IDQgMiAwIF0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBWRVhUICAgIGRUbXAzLGRUbXAxLGRUbXAxLCMxICAgICAgICAgICAgICAgICAgICA7Ly8gVG1wWyB4IHggeCB4IDkgNyA1IDMgXSAKLSAgICAgICAgQUREICAgICBwRHN0VG1wLCBwRHN0LCBkc3RTdGVwCi0gICAgICAgIEFERCAgICAgZHN0ZXAsIGRzdFN0ZXAsIGRzdFN0ZXAKLSAgICAgICAgVkVYVCAgICBkVG1wMixkVG1wMCxkVG1wMCwjMSAgICAgICAgICAgICAgICAgICAgOy8vIFRtcFsgeCB4IHggeCA4IDYgNCAyIF0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBWU1QxICAgIGRUbXAzVTMyWzBdLFtwRHN0XSxkc3RlcCAgICAgICAgICAgICAgICA7Ly8gVG1wWzldLFs3XSxbNV0sWzNdCi0gICAgICAgIFZTVDEgICAgZFRtcDJVMzJbMF0sW3BEc3RUbXBdLGRzdGVwICAgICAgICAgICAgIDsvLyBUbXBbOF0sWzZdLFs0XSxbMl0KLSAgICAgICAgVlNUMSAgICBkVG1wMVUzMlswXSxbcERzdF0sZHN0ZXAgICAgICAgICAgICAgICAgOy8vIFRtcFs3XSxbNV0sWzNdLFsxXQotICAgICAgICBWU1QxICAgIGRUbXAwVTMyWzBdLFtwRHN0VG1wXSAgICAgICAgICAgICAgICAgICA7Ly8gVG1wWzZdLFs0XSxbMl0sWzBdCi0gICAgICAgIAotICAgICAgICBCICAgICAgICBFeGl0UHJlZGljdDR4NCAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQnJhbmNoIHRvIGV4aXQgY29kZQotICAgICAgICAKLU9NWF9WQ180eDRfSEQKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gTG9hZCBVMCxVMSxVMixVMwotICAgICAgICBWTEQxICAgIGRBYm92ZSxbcFNyY0Fib3ZlXSAgICAgICAgICAgICAgICAgICAgICA7Ly9kQWJvdmVMZWZ0VmFsID0gW1U3fFU2fFU1fFU0fFUzfFUyfFUxfFUwXQotICAgICAgICAKLSAgICAgICAgOy8vIExvYWQgVUwsTDAsTDEsTDIsTDMgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGRMZWZ0ID0gW1VMfEwwfEwxfEwyfEwzfFh8WHxYXSAKLSAgICAgICAgVkxEMSAgICB7ZExlZnRbN119LFtwU3JjQWJvdmVMZWZ0XSAgIAotICAgICAgICBBREQgICAgIHBTcmNUbXAsIHBTcmNMZWZ0LCBsZWZ0U3RlcAotICAgICAgICBBREQgICAgIHNyY1N0ZXAsIGxlZnRTdGVwLCBsZWZ0U3RlcAotICAgICAgICAKLSAgICAgICAgVkxEMSAgICB7ZExlZnRbNl19LFtwU3JjTGVmdF0sc3JjU3RlcCAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzAqbGVmdFN0ZXBdCi0gICAgICAgIFZMRDEgICAge2RMZWZ0WzVdfSxbcFNyY1RtcF0sc3JjU3RlcCAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsxKmxlZnRTdGVwXQotICAgICAgICBWTEQxICAgIHtkTGVmdFs0XX0sW3BTcmNMZWZ0XSAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMipsZWZ0U3RlcF0KLSAgICAgICAgVkxEMSAgICB7ZExlZnRbM119LFtwU3JjVG1wXSAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzMqbGVmdFN0ZXBdCi0gICAgICAgIAotICAgICAgICBWRVhUICAgIGRBYm92ZTAsZExlZnQsZEFib3ZlLCMzICAgICAgICAgICAgICAgICA7Ly8gWyBVMnxVMXxVMHxVTHxMMHxMMXxMMnxMMyBdICAKLSAgICAgICAgVkVYVCAgICBkQWJvdmUxLGRMZWZ0LGRBYm92ZSwjMiAgICAgICAgICAgICAgICAgOy8vIFsgVTF8VTB8VUx8TDB8TDF8TDJ8TDN8WCBdICAgCi0gICAgICAgIFZFWFQgICAgZEFib3ZlMixkTGVmdCxkQWJvdmUsIzEgICAgICAgICAgICAgICAgIDsvLyBbIFUwfFVMfEwwfEwxfEwyfEwzfFh8WCBdICAgICAKLSAgICAgICAgCi0gICAgICAgIFZIQUREICAgZFRtcDAsIGRBYm92ZTAsIGRBYm92ZTIKLSAgICAgICAgVlJIQUREICBkVG1wMCwgZFRtcDAsIGRBYm92ZTEgICAgICAgICAgICAgICAgICAgOy8vIFRtcFsgMCB8IDEgfCAyIHwgNCB8IDYgfCA4IHwgWCB8IFggXQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFZSSEFERCAgZFRtcDEsIGRBYm92ZTEsIGRBYm92ZTAgICAgICAgICAgICAgICAgIDsvLyAoYStiKzEpPj4xCi0gICAgICAgIFZTSEwgICAgZFRtcDFVNjQsZFRtcDFVNjQsIzI0ICAgICAgICAgICAgICAgICAgIDsvLyBUbXBbIDN8NXwgNyB8OSB8IFggfCBYIHwgWCB8IFggXQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFZTSEwgICAgZFRtcFU2NCxkVG1wMFU2NCwjMTYgICAgICAgICAgICAgICAgICAgIDsvLyBUbXBbIDJ8NHw2fDh8IFggfCBYIHwgWCB8IFggXQotICAgICAgICBWWklQICAgIGRUbXAxLGRUbXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gZFRtcCA9IFsgMiB8IDMgfCA0IHwgNSB8IDYgfCA3IHwgOCB8IDkgXQotICAgICAgICBWRVhUICAgIGRUbXAwLGRUbXAwLGRUbXAwLCM2ICAgICAgICAgICAgICAgICAgICA7Ly8gVG1wWyAgWHwgWHwgWHwgWHwgWHwgWHwgMCB8IDEgXQotICAgICAgICBWRVhUICAgIGRUbXAxLGRUbXAsZFRtcDAsIzIgICAgICAgICAgICAgICAgICAgICA7Ly8gVG1wWyAwIHwgMSB8IDIgfCAzIHwgNCB8IDUgfCA2IHw3IF0KLSAgICAgICAKLSAgICAgICAgQUREICAgICBwRHN0VG1wLCBwRHN0LCBkc3RTdGVwCi0gICAgICAgIEFERCAgICAgZHN0ZXAsIGRzdFN0ZXAsIGRzdFN0ZXAKLSAgICAgICAgCi0gICAgICAgIFZTVDEgICAgZFRtcDFVMzJbMV0sW3BEc3RdLGRzdGVwICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBwVG1wWzB8MXwyfDNdCi0gICAgICAgIFZTVDEgICAgZFRtcFUzMlsxXSxbcERzdFRtcF0sZHN0ZXAgICAgICAgICAgICAgIDsvLyBTdG9yZSBwVG1wWzJ8M3w0fDVdCi0gICAgICAgIFZTVDEgICAgZFRtcDFVMzJbMF0sW3BEc3RdICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBwVG1wWzR8NXw2fDddCi0gICAgICAgIFZTVDEgICAgZFRtcFUzMlswXSxbcERzdFRtcF0gICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBwVG1wWzZ8N3w4fDldCi0gICAgICAgIAotICAgICAgICBCICAgICAgICBFeGl0UHJlZGljdDR4NCAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQnJhbmNoIHRvIGV4aXQgY29kZQotICAgICAgICAKLU9NWF9WQ180eDRfVkwKLQotICAgICAgICAKLSAgICAgICAgVFNUICAgICBhdmFpbGFiaWxpdHksICNPTVhfVkNfVVBQRVJfUklHSFQKLSAgICAgICAgQkVRICAgICBEaWFnVkxVcHBlclJpZ2h0Tm90QXZhaWxhYmxlCi0gICAgICAgCi0gICAgICAgIFZMRDEgICAgZEFib3ZlMCxbcFNyY0Fib3ZlXSAgICAgICAgICAgICAgICAgICAgICA7Ly8gW1U3fFU2fFU1fFU0fFUzfFUyfFUxfFUwXSAKLSAgICAgICAgVkVYVCAgICBkQWJvdmUxLGRBYm92ZTAsZEFib3ZlMCwjMSAgICAgICAgICAgICAgIDsvLyBbIFh8VTd8VTZ8VTV8VTR8VTN8VTJ8VTFdCi0gICAgICAgIFZFWFQgICAgZEFib3ZlMixkQWJvdmUxLGRBYm92ZTEsIzEgICAgICAgICAgICAgICA7Ly8gWyBYfCBYfFU3fFU2fFU1fFU0fFUzfFUyXQotICAgICAgICAKLSAgICAgICAgQiAgICAgICBEaWFnVkxQcmVkaWN0NHg0U3RvcmUgICAgICAgICAKLSAgICAgICAKLURpYWdWTFVwcGVyUmlnaHROb3RBdmFpbGFibGUKLSAgICAgICAgVkxEMSAgICBkQWJvdmVVMzJbMV0sW3BTcmNBYm92ZV0gICAgICAgICAgICAgICAgIDsvLyBbVTN8VTJ8VTF8VTB8LXwtfC18LV0gCi0gICAgICAgIFZEVVAgICAgZFUzLCBkQWJvdmVbN10gICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gW1UzIFUzIFUzIFUzIFUzIFUzIFUzIFUzXQotCi0gICAgICAgIFZFWFQgICAgZEFib3ZlMCwgZEFib3ZlLCBkVTMsICM0ICAgICAgICAgICAgICAgICA7Ly8gW1UzIFUzIFUzIFUzIFUzIFUyIFUxIFUwXQotICAgICAgICBWRVhUICAgIGRBYm92ZTEsIGRBYm92ZSwgZFUzLCAjNSAgICAgICAgICAgICAgICAgOy8vIFtVMyBVMyBVMyBVMyBVMyBVMyBVMiBVMV0KLSAgICAgICAgVkVYVCAgICBkQWJvdmUyLCBkQWJvdmUsIGRVMywgIzYgICAgICAgICAgICAgICAgIDsvLyBbVTMgVTMgVTMgVTMgVTMgVTMgVTMgVTJdCi0gICAgICAgCi1EaWFnVkxQcmVkaWN0NHg0U3RvcmUgIAotICAgICAgICAKLSAgICAgICAgVlJIQUREICBkVG1wMCwgZEFib3ZlMSwgZEFib3ZlMCAgICAgICAgICAgICAgICAgOy8vIChhK2IrMSk+PjEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFRtcFsgWHwgWHwgWHwgOHwgNnwgNHwgMnwgMCBdCi0gICAgICAgIAotICAgICAgICBWSEFERCAgIGRUbXAzLCBkQWJvdmUwLCBkQWJvdmUyCi0gICAgICAgIFZSSEFERCAgZFRtcDMsIGRUbXAzLCBkQWJvdmUxICAgICAgICAgICAgICAgICAgIDsvLyAoYSsyKmIrYysyKT4+MgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVG1wWyBYfCBYfCBYfCA5fCA3fCA1fCAzfCAxIF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBWRVhUICAgIGRUbXAxLGRUbXAwLGRUbXAwLCMxICAgICAgICAgICAgICAgICAgICA7Ly8gVG1wWyBYfCBYfCBYfCBYfCA4fCA2fCA0fCAyIF0KLSAgICAgICAgQUREICAgICBwRHN0VG1wLCBwRHN0LCBkc3RTdGVwCi0gICAgICAgIEFERCAgICAgZHN0ZXAsIGRzdFN0ZXAsIGRzdFN0ZXAKLSAgICAgICAgVkVYVCAgICBkVG1wMixkVG1wMyxkVG1wMSwjMSAgICAgICAgICAgICAgICAgICAgOy8vIFRtcFsgWHwgWHwgWHwgWHwgOXwgN3wgNXwgMyBdCi0gICAgICAgIAotICAgICAgICBWU1QxICAgIGRUbXAwVTMyWzBdLFtwRHN0XSxkc3RlcCAgICAgICAgICAgICAgICA7Ly8gVG1wWzZdLFs0XSxbMl0sWzBdCi0gICAgICAgIFZTVDEgICAgZFRtcDNVMzJbMF0sW3BEc3RUbXBdLGRzdGVwICAgICAgICAgICAgIDsvLyBUbXBbN10sWzVdLFszXSxbMV0KLSAgICAgICAgVlNUMSAgICBkVG1wMVUzMlswXSxbcERzdF0gICAgICAgICAgICAgICAgICAgICAgOy8vIFRtcFs4XSxbNl0sWzRdLFsyXQotICAgICAgICBWU1QxICAgIGRUbXAyVTMyWzBdLFtwRHN0VG1wXSAgICAgICAgICAgICAgICAgICA7Ly8gVG1wWzldLFs3XSxbNV0sWzNdCi0gICAgICAgIAotICAgICAgICBCICAgICAgICBFeGl0UHJlZGljdDR4NCAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQnJhbmNoIHRvIGV4aXQgY29kZQotICAgICAgICAKLU9NWF9WQ180eDRfSFUKLSAgICAgICAgQUREICAgICBwU3JjVG1wLCBwU3JjTGVmdCwgbGVmdFN0ZXAKLSAgICAgICAgQUREICAgICBzcmNTdGVwLCBsZWZ0U3RlcCwgbGVmdFN0ZXAKLQotICAgICAgICA7Ly8gTG9hZCBMZWZ0IEVkZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gW0wzfEwyfEwxfEwwfFh8WHxYfFhdCi0gICAgICAgIFZMRDEgICAge2RMZWZ0WzRdfSxbcFNyY0xlZnRdLHNyY1N0ZXAgICAgICAgICAgIDsvLyBwU3JjTGVmdFswKmxlZnRTdGVwXQotICAgICAgICBWTEQxICAgIHtkTGVmdFs1XX0sW3BTcmNUbXBdLHNyY1N0ZXAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMSpsZWZ0U3RlcF0KLSAgICAgICAgVkxEMSAgICB7ZExlZnRbNl19LFtwU3JjTGVmdF0gICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzIqbGVmdFN0ZXBdCi0gICAgICAgIFZMRDEgICAge2RMZWZ0WzddfSxbcFNyY1RtcF0gICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFszKmxlZnRTdGVwXQotICAgICAgICAKLSAgICAgICAgVkRVUCAgICBkTDMsZExlZnRbN10gICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFtMM3xMM3xMM3xMM3xMM3xMM3xMM3xMM10KLSAgICAgICAgCi0gICAgICAgIFZFWFQgICAgZExlZnRIVTAsZExlZnQsZEwzLCM0ICAgICAgICAgICAgICAgICAgIDsvLyBbTDN8TDN8TDN8TDN8TDN8TDJ8TDF8TDBdCi0gICAgICAgIFZFWFQgICAgZExlZnRIVTEsZExlZnQsZEwzLCM1ICAgICAgICAgICAgICAgICAgIDsvLyBbTDN8TDN8TDN8TDN8TDN8TDN8TDJ8TDFdCi0gICAgICAgIFZFWFQgICAgZExlZnRIVTIsZExlZnQsZEwzLCM2ICAgICAgICAgICAgICAgICAgIDsvLyBbTDN8TDN8TDN8TDN8TDN8TDN8TDN8TDJdCi0gICAgICAgIAotICAgICAgICBWSEFERCAgIGRUbXAwLCBkTGVmdEhVMCwgZExlZnRIVTIKLSAgICAgICAgVlJIQUREICBkVG1wMCwgZFRtcDAsIGRMZWZ0SFUxICAgICAgICAgICAgICAgICAgOy8vIFRtcFsgTDMgfCBMMyB8IEwzIHwgTDMgfCBMMyB8IDUgfCAzIHwgMSBdCi0gICAgICAgIAotICAgICAgICBWUkhBREQgIGRUbXAxLCBkTGVmdEhVMSwgZExlZnRIVTAgICAgICAgICAgICAgICA7Ly8gKGErYisxKT4+MSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBUbXBbIEwzIHwgTDMgfCBMMyB8IEwzIHwgTDMgfCA0IHwgMiB8IDAgXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFZaSVAgICAgZFRtcDEsZFRtcDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBkVG1wMSA9IFRtcFs3fCA2fCA1fCA0fCAzfCAyfCAxfCAwXSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBkVG1wMCA9IFtMM3xMM3xMM3xMM3xMM3xMM3xMM3xMM10KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFZTVDEgICAgZFRtcDFVMzJbMF0sW3BEc3RdLGRzdFN0ZXAgICAgICAgICAgICAgIDsvLyBbM3wyfDF8MF0gCi0gICAgICAgIFZFWFQgICAgZFRtcDEsZFRtcDEsZFRtcDEsIzIKLSAgICAgICAgVlNUMSAgICBkVG1wMVUzMlswXSxbcERzdF0sZHN0U3RlcCAgICAgICAgICAgICAgOy8vIFs1fDR8M3wyXSAKLSAgICAgICAgVkVYVCAgICBkVG1wMSxkVG1wMSxkVG1wMSwjMgotICAgICAgICBWU1QxICAgIGRUbXAxVTMyWzBdLFtwRHN0XSxkc3RTdGVwICAgICAgICAgICAgICA7Ly8gWzd8Nnw1fDRdICAKLSAgICAgICAgVlNUMSAgICBkVG1wMFUzMlswXSxbcERzdF0gICAgICAgICAgICAgICAgICAgICAgOy8vIFs5fDh8N3w2XSAKLSAgICAgICAgCi0gICAgICAgIAotRXhpdFByZWRpY3Q0eDQKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgIHJldHVybiwgICNPTVhfU3RzX05vRXJyCi0gICAgICAgIE1fRU5ECi0KLSAgICAgICAgRU5ESUYgOy8vIENvcnRleEE4Ci0gICAgICAgIAotICAgICAgICBFTkQKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0IGVuZHMKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXJfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk4MTc5NS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXJfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDEyMjkwCi07Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotICAgICAgICAKLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgICAKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfUVBEaXZUYWJsZQotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9WTWF0cml4UVBNb2RUYWJsZQotICAgICAgICAgICAgCi0gICAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKLSAgICAKLQotICAgIAotICAgIAotICAgIElGIENvcnRleEE4Ci0KLTsvLyBBUk0gUmVnaXN0ZXJzCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcHBTcmMgICAgICAgUk4gMAotcERzdCAgICAgICAgUk4gMQotUVAgICAgICAgICAgUk4gMgotCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIFNjcmF0Y2ggdmFyaWFibGUgZm9yIFVucGFjazJ4MiAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wU3JjICAgICAgICBSTiA5Ci1WYWx1ZSAgICAgICBSTiA0Ci1WYWx1ZTIgICAgICBSTiA1Ci1GbGFnICAgICAgICBSTiA2Ci1zdHJPZmZzZXQgICBSTiA3Ci1jc3RPZmZzZXQgICBSTiA4Ci0KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gU2NyYXRjaCB2YXJpYWJsZQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXIwdzAgICAgICAgIFJOICAzCi1yMHcxICAgICAgICBSTiAgNAotCi1jMHcwICAgICAgICBSTiAgNQotYzF3MCAgICAgICAgUk4gIDYKLQotcmV0dXJuICAgICAgUk4gIDAKLXBRUERpdlRhYmxlIFJOICA1Ci1wUVBNb2RUYWJsZSAgICBSTiAgNgotU2hpZnQgICAgICAgIFJOICA5Ci1TY2FsZSAgICAgICAgUk4gIDIKLQotCi0KLTsvLyBOZW9uIFJlZ2lzdGVycwotCi1kWmVybyAgICAgICBETiAgRDAuVTE2Ci1kSW52VHJDb2VmZiBETiAgRDAuUzE2Ci1kU2NhbGUgICAgICBETiAgRDEuUzE2Ci1xRHFudENvZWZmICBRTiAgUTEuUzMyCi1kRHFudENvZWZmICBETiAgRDIuUzE2Ci0KLQotICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIE1fU1RBUlQgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpciwgcjkKLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgcFNyYywgW3BwU3JjXSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIHBTcmMKLSAgICAgICAgVk1PViAgICBkWmVybywgIzAKLSAgICAgICAgTU9WICAgICBjc3RPZmZzZXQsICMzMSAgICAgICAgICAgICAgICAgICAgICAgOy8vIFRvIGJlIHVzZWQgaW4gdGhlIGxvb3AsIHRvIGNvbXB1dGUgb2Zmc2V0Ci0gICAgICAgIAotICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICA7Ly8gRmlyc3RseSwgZmlsbCBhbGwgdGhlIGNvZWZmaWNpZW50IHZhbHVlcyBvbiB0aGUgPHBEc3Q+IGJ1ZmZlciBieSB6ZXJvCi0gICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIAotICAgICAgICBWU1QxICAgIGRaZXJvLFtwRHN0XSAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFswXSAgPSBwRHN0WzFdICA9IHBEc3RbMl0gID0gcERzdFszXSAgPSAwICAgCi0gICAgICAgIExEUkIgICAgIEZsYWcsICBbcFNyY10sICMxICAgICAgICAgICAgICAgICAgIDsvLyBQcmVsb2FkIDxGbGFnPiBiZWZvcmUgPHVucGFja0xvb3A+Ci0KLQotdW5wYWNrTG9vcAotICAgICAgICBUU1QgICAgICBGbGFnLCAgIzB4MTAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ29tcHV0aW5nIChGbGFnICYgMHgxMCkKLSAgICAgICAgTERSU0JORSAgVmFsdWUyLFtwU3JjLCMxXSAgICAgICAgICAgICAgICAgIAotICAgICAgICBMRFJCTkUgICBWYWx1ZSwgW3BTcmNdLCAjMiAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBieXRlIHdpc2UgdG8gYXZvaWQgdW5hbGlnbmVkIGFjY2VzcwotICAgICAgICBBTkQgICAgICBzdHJPZmZzZXQsIGNzdE9mZnNldCwgRmxhZywgTFNMICMxICA7Ly8gc3RyT2Zmc2V0ID0gKEZsYWcgJiAxNSkgPCAxOwotICAgICAgICBMRFJTQkVRICBWYWx1ZSwgW3BTcmNdLCAjMSAgICAgICAgICAgICAgICAgICA7Ly8gVmFsdWUgPSAoT01YX1U4KSAgKnBTcmMrKwotICAgICAgICBPUlJORSAgICBWYWx1ZSxWYWx1ZSxWYWx1ZTIsIExTTCAjOCAgICAgICAgICA7Ly8gVmFsdWUgPSAoT01YX1UxNikgKnBTcmMrKwotICAgICAgICAKLSAgICAgICAgVFNUICAgICAgRmxhZywgICMweDIwICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENvbXB1dGluZyAoRmxhZyAmIDB4MjApIHRvIGNoZWNrLCBpZiB3ZSdyZSBkb25lCi0gICAgICAgIExEUkJFUSAgIEZsYWcsICBbcFNyY10sICMxICAgICAgICAgICAgICAgICAgIDsvLyBGbGFnICA9IChPTVhfVTgpICpwU3JjKyssIGZvciBuZXh0IGl0ZXJhdGlvbgotICAgICAgICBTVFJIICAgICBWYWx1ZSwgW3BEc3QsIHN0ck9mZnNldF0gICAgICAgICAgICA7Ly8gU3RvcmUgPFZhbHVlPiBhdCBvZmZzZXQgPHN0ck9mZnNldD4KLSAgICAgICAgQkVRICAgICAgdW5wYWNrTG9vcCAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEJyYW5jaCB0byB0aGUgbG9vcCBiZWdpbm5pbmcKLSAgICAgICAgCi0gICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIDsvL0ludlRyYW5zZm9ybURDMngyOiBJbmxpbmVkIChJbXBsZW1lbnRlZCBpbiBBUk0gVjYpCi0gICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIAotICAgICAgICBMRE1JQSAgICBwRHN0LCB7cjB3MCwgcjB3MX0gICAgICAgICAgICAgICAgICA7Ly8gcjB3MCA9IHxjMXxjMHwgJiByMHcxID0gfGMzfGMyfAotCi0gICAgICAgIFNUUiAgICAgIHBTcmMsIFtwcFNyY10gICAgICAgICAgICAgICAgICAgICAgIDsvLyBVcGRhdGUgdGhlIGJpdHN0cmVhbSBwb2ludGVyCi0gICAgICAgIAotICAgICAgICBMRFIgICAgICBwUVBEaXZUYWJsZSwgPWFybVZDTTRQMTBfUVBEaXZUYWJsZSA7Ly8gUVAgRGl2aXNpb24gbG9vay11cC10YWJsZSBiYXNlIHBvaW50ZXIKLSAgICAgICAgTERSICAgICAgcFFQTW9kVGFibGUsID1hcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlIDsvLyBRUCBNb2R1bG8gbG9vay11cC10YWJsZSBiYXNlIHBvaW50ZXIKLSAgICAgICAgCi0gICAgICAgIFNBRERTVUJYIHIwdzAsIHIwdzAsICByMHcwICAgICAgICAgICAgICAgICAgIDsvLyBbIGMwMCtjMDEsIGMwMC1jMDEgXQotICAgICAgICBTQUREU1VCWCByMHcxLCByMHcxLCAgcjB3MSAgICAgICAgICAgICAgICAgICA7Ly8gWyBjMTArYzExLCBjMTAtYzExIF0KLSAgICAgICAgCi0gICAgICAgIExEUlNCICAgIFNoaWZ0LCBbcFFQRGl2VGFibGUsIFFQXSAgICAgICAgICAgIDsvLyBTaGlmdCA9IHBRUERpdlRhYmxlW1FQXQotICAgICAgICBMRFJTQiAgICBTY2FsZSwgW3BRUE1vZFRhYmxlLCBRUF0gICAgICAgICAgICA7Ly8gU2NhbGUgPSBwUVBNb2RUYWJsZVtRUF0KLSAgICAgICAgCi0gICAgICAgIFNBREQxNiAgIGMwdzAsIHIwdzAsIHIwdzEgICAgICAgICAgICAgICAgICAgIDsvLyBbIGQwMCtkMTAsIGQwMStkMTEgXQotICAgICAgICBTU1VCMTYgICBjMXcwLCByMHcwLCByMHcxICAgICAgICAgICAgICAgICAgICA7Ly8gWyBkMDAtZDEwLCBkMDEtZDExIF0KLSAgICAgICAgCi0gICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgOy8vRGVxdWFudENocm9tYURDMngyOiBJbmxpbmVkIChOZW9uIEltcGxlbWVudGF0aW9uKQotICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIAotICAgICAgICBMU0wgICAgICBTY2FsZSwgU2NhbGUsIFNoaWZ0ICAgICAgICAgICAgICAgICA7Ly8gU2NhbGUgPSBTY2FsZSA8PCBTaGlmdAotICAgICAgICBWTU9WICAgICBkSW52VHJDb2VmZiwgYzB3MCwgYzF3MCAgCi0gICAgICAgIFZSRVYzMiAgIGRJbnZUckNvZWZmLGRJbnZUckNvZWZmICAKLSAgICAgICAgVkRVUCAgICAgZFNjYWxlLFNjYWxlIAotICAgICAgICAKLSAgICAgICAgVk1VTEwgICAgcURxbnRDb2VmZixkSW52VHJDb2VmZixkU2NhbGUKLSAgICAgICAgVlNIUk4gICAgZERxbnRDb2VmZixxRHFudENvZWZmLCMxCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgVlNUMSAgICAgZERxbnRDb2VmZixbcERzdF0gICAgICAgICAgICAgICAgICAgOy8vIFN0b3JpbmcgYWxsIHRoZSBjb2VmZmljaWVudHMgYXQgb25jZQotICAgICAgICAKLSAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgotICAgICAgICBNX0VORAotICAgICAgICAKLSAgICBFTkRJRiA7Ly8gQ29ydGV4QTgKLSAgICAKLSAgICAKLSAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXJfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcl9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4YzI0MzEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcl9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzggKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDEyMjkwCi07Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLTsvLyBEZXNjcmlwdGlvbjoKLTsvLyBILjI2NCBpbnZlcnNlIHF1YW50aXplIGFuZCB0cmFuc2Zvcm0gbW9kdWxlCi07Ly8gCi07Ly8gCi0KLTsvLyBJbmNsdWRlIHN0YW5kYXJkIGhlYWRlcnMKLQotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAgIAotOy8vIEltcG9ydC9FeHBvcnQgc3ltYm9scyByZXF1aXJlZCBmcm9tL3RvIG90aGVyIGZpbGVzCi07Ly8gKEZvciBleGFtcGxlIHRhYmxlcykKLSAgICAgICAgCi0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0IAotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9RUERpdlRhYmxlCi0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlCi0gICAgICAgIAotICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4Ci0KLTsvLyBTZXQgZGVidWdnaW5nIGxldmVsICAgICAgICAKLTsvL0RFQlVHX09OICAgIFNFVEwge1RSVUV9Ci0KLQotOy8vIFN0YXRpYyBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50THVtYURDNHg0Ci0gICAgCi0KLTsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKLSAgICAKLSAgICAKLQotOy8vIFN0YXRpYyBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50THVtYURDNHg0Ci0KLTsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKLSAgICAKLSAgICBJRiAgQ29ydGV4QTgKLSAgICAKLTsvL0lucHV0IFJlZ2lzdGVycwotcERhdGEgICAgICAgICAgICAgICBSTiAgMAotUVAgICAgICAgICAgICAgICAgICBSTiAgMSAgICAKLQotCi07Ly9Mb2NhbCBTY3JhdGNoIFJlZ2lzdGVycwotCi07Ly8gQVJNIFJlZ2lzdGVycwotCi1wUVBEaXZUYWJsZSAgICAgICAgIFJOICAyCi1wUVBNb2RUYWJsZSAgICAgICAgIFJOICAzCi1TaGlmdCAgICAgICAgICAgICAgIFJOICA0Ci1TY2FsZSAgICAgICAgICAgICAgIFJOICA1Ci0KLTsvLyBORU9OIFJlZ2lzdGVycwotCi07Ly8gUGFja2VkIElucHV0IHBpeGVscwotZEluMCAgICAgICAgICAgICAgICBETiAgRDAuUzE2Ci1kSW4xICAgICAgICAgICAgICAgIEROICBEMS5TMTYKLWRJbjIgICAgICAgICAgICAgICAgRE4gIEQyLlMxNgotZEluMyAgICAgICAgICAgICAgICBETiAgRDMuUzE2ICAgCi0KLTsvLyBJbnRlcm1lZGlhdGUgY2FsY3VsYXRpb25zCi1kUm93U3VtMSAgICAgICAgICAgIEROICBENC5TMTYKLWRSb3dTdW0yICAgICAgICAgICAgRE4gIEQ1LlMxNgotZFJvd0RpZmYxICAgICAgICAgICBETiAgRDYuUzE2Ci1kUm93RGlmZjIgICAgICAgICAgIEROICBENy5TMTYKLQotOy8vIFJvdyBvcGVyYXRlZCBwaXhlbHMKLWRSb3dPcDAgICAgICAgICAgICAgRE4gIEQwLlMxNgotZFJvd09wMSAgICAgICAgICAgICAgICBETiAgRDEuUzE2Ci1kUm93T3AyICAgICAgICAgICAgICAgIEROICBEMi5TMTYKLWRSb3dPcDMgICAgICAgICAgICAgICAgRE4gIEQzLlMxNgotcVJvd09wMDEgICAgICAgICAgICBRTiAgUTAuMzIKLXFSb3dPcDIzICAgICAgICAgICAgUU4gIFExLjMyCi0KLTsvLyBJbnRlcm1lZGlhdGUgY2FsY3VsYXRpb25zCi1kQ29sU3VtMSAgICAgICAgICAgIEROICBENC5TMTYKLWRDb2xTdW0yICAgICAgICAgICAgRE4gIEQ1LlMxNgotZENvbERpZmYxICAgICAgICAgICBETiAgRDYuUzE2Ci1kQ29sRGlmZjIgICAgICAgICAgIEROICBENy5TMTYKLQotOy8vIENvbG91bW4gb3BlcmF0ZWQgcGl4ZWxzCi1kQ29sT3AwICAgICAgICAgICAgIEROICBEMC5TMTYKLWRDb2xPcDEgICAgICAgICAgICAgICAgRE4gIEQxLlMxNgotZENvbE9wMiAgICAgICAgICAgICAgICBETiAgRDIuUzE2Ci1kQ29sT3AzICAgICAgICAgICAgICAgIEROICBEMy5TMTYKLQotOy8vIFRlbXBvcmFyeSBzY3JhdGNoIHZhcmFpYmxlcwotCi1kU2NhbGUgICAgICAgICAgICAgIEROICBENS5TMTYKLXFSb3VuZDAgICAgICAgICAgICAgUU4gIFEzLlMzMgotcVJvdW5kMSAgICAgICAgICAgICBRTiAgUTQuUzMyCi1xUm91bmQyICAgICAgICAgICAgIFFOICBRNS5TMzIKLXFSb3VuZDMgICAgICAgICAgICAgUU4gIFE2LlMzMgotCi07Ly8gSW52VHJhbnNmb3JtZWQgYW5kIERlcXVhbnRpemVkIHBpeGVscwotZE91dDAgICAgICAgICAgICAgICBETiAgRDAuUzE2Ci1kT3V0MSAgICAgICAgICAgICAgICBETiAgRDEuUzE2Ci1kT3V0MiAgICAgICAgICAgICAgICBETiAgRDIuUzE2Ci1kT3V0MyAgICAgICAgICAgICAgICBETiAgRDMuUzE2Ci0KLSAgICAgICAKLSAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IHJlcXVpcmVkIGJ5IHRoZSBmdW5jdGlvbgotICAgICAgICAKLQotICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKLSAgICBNX1NUQVJUIGFybVZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudEx1bWFEQzR4NCxyNSxkMTMKLSAgICAKLSAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgOy8vIFRoZSBzdHJhdGVneSB1c2VkIGluIGltcGxlbWVudGluZyB0aGUgdHJhbnNmb3JtIGlzIGFzIGZvbGxvd3M6KgotICAgIDsvLyBMb2FkIHRoZSA0eDQgYmxvY2sgaW50byA0IEQtcmVnaXN0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICogIAotICAgIDsvLyBUcmFuc3Bvc2UgdGhlIDR4NCBtYXRyaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIAotICAgIDsvLyBQZXJmb3JtIHRoZSByb3cgb3BlcmF0aW9ucyAob24gY29sdW1ucykgdXNpbmcgU0lNRCAgICAgICAgICAgICogIAotICAgIDsvLyBUcmFuc3Bvc2UgdGhlIDR4NCByZXN1bHQgbWF0cml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIAotICAgIDsvLyBQZXJmb3JtIHRoZSBjb2xvdW1uIG9wZXJhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICAgICAgOy8vIExvYWQgYWxsIHRoZSA0eDQgcGl4ZWxzIGluIFRyYW5zcG9zZWQgZm9ybQotICAgICAgICAKLSAgICAgICAgVkxENCAgICB7ZEluMCxkSW4xLGRJbjIsZEluM30sW3BEYXRhXQotICAgICAgICBMRFIgICAgIHBRUERpdlRhYmxlLCA9YXJtVkNNNFAxMF9RUERpdlRhYmxlICAgICAgICA7Ly8gUVAgRGl2aXNpb24gbG9vay11cC10YWJsZSBiYXNlIHBvaW50ZXIKLSAgICAgICAgTERSICAgICBwUVBNb2RUYWJsZSwgPWFybVZDTTRQMTBfVk1hdHJpeFFQTW9kVGFibGUgOy8vIFFQIE1vZHVsbyBsb29rLXVwLXRhYmxlIGJhc2UgcG9pbnRlcgotICAgICAgICAKLSAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gICAgICAgIDsvLyBSb3cgT3BlcmF0aW9ucyAoUGVyZm9ybWVkIG9uIGNvbHVtbnMpCi0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICAgICAgICA7Ly8gU2NhbGUgZmFjdG9yIGNhbGN1bGF0aW9uIGlzIGRvbmUgdXNpbmcgQVJNIGluc3RydWN0aW9ucwotICAgICAgICA7Ly8gSW50ZXJsZWF2ZWQgd2l0aCBORU9OIGluc3RydWN0aW9ucyBpbm9yZGVyIHRvIER1YWwgaXNzdWUKLSAgICAgICAgCi0gICAgICAgIFZBREQgICAgZFJvd1N1bTEsZEluMCxkSW4xCi0gICAgICAgIFZBREQgICAgZFJvd1N1bTIsZEluMixkSW4zCi0gICAgICAgIFZTVUIgICAgZFJvd0RpZmYxLGRJbjAsZEluMQotICAgICAgICBMRFJTQiAgIFNoaWZ0LCBbcFFQRGl2VGFibGUsIFFQXSAgICAgICAgICAgICAgIDsvLyBBUk0gQ09ERTogU2hpZnQgPSBwUVBEaXZUYWJsZVtRUF0KLSAgICAgICAgVlNVQiAgICBkUm93RGlmZjIsZEluMixkSW4zCi0gICAgICAgIExEUlNCICAgU2NhbGUsIFtwUVBNb2RUYWJsZSwgUVBdICAgICAgICAgICAgICAgOy8vIEFSTSBDT0RFOiBTY2FsZSA9IHBRUE1vZFRhYmxlW1FQXSAKLSAgICAgICAgVkFERCAgICBkUm93T3AwLGRSb3dTdW0xLGRSb3dTdW0yCi0gICAgICAgIFZTVUIgICAgZFJvd09wMSxkUm93U3VtMSxkUm93U3VtMgotICAgICAgICBWU1VCICAgIGRSb3dPcDIsZFJvd0RpZmYxLGRSb3dEaWZmMgotICAgICAgICBMU0wgICAgIFNjYWxlLCBTY2FsZSwgU2hpZnQgICAgICAgICAgICAgICAgICAgIDsvLyBBUk0gQ09ERTogU2NhbGUgPSBTY2FsZSA8PCBTaGlmdAotICAgICAgICBWQUREICAgIGRSb3dPcDMsZFJvd0RpZmYxLGRSb3dEaWZmMgotICAgICAgICAKLSAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgOy8vIFRyYW5zcG9zZSB0aGUgcmVzdWx0YW50IG1hdHJpeAotICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAKLSAgICAgICAgVlRSTiAgICBkUm93T3AwLGRSb3dPcDEKLSAgICAgICAgVlRSTiAgICBkUm93T3AyLGRSb3dPcDMKLSAgICAgICAgVlRSTiAgICBxUm93T3AwMSxxUm93T3AyMyAKLSAgICAgICAgCi0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICAgICAgICA7Ly8gQ29sb3VtbiBPcGVyYXRpb25zIAotICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAgICAgICAgCi0gICAgICAgIFZBREQgICAgZENvbFN1bTEsZFJvd09wMCxkUm93T3AxCi0gICAgICAgIFZBREQgICAgZENvbFN1bTIsZFJvd09wMixkUm93T3AzCi0gICAgICAgIFZTVUIgICAgZENvbERpZmYxLGRSb3dPcDAsZFJvd09wMQotICAgICAgICBWU1VCICAgIGRDb2xEaWZmMixkUm93T3AyLGRSb3dPcDMKLSAgICAgICAgVkFERCAgICBkQ29sT3AwLGRDb2xTdW0xLGRDb2xTdW0yCi0gICAgICAgIFZTVUIgICAgZENvbE9wMSxkQ29sU3VtMSxkQ29sU3VtMgotICAgICAgICBWU1VCICAgIGRDb2xPcDIsZENvbERpZmYxLGRDb2xEaWZmMgotICAgICAgICBWQUREICAgIGRDb2xPcDMsZENvbERpZmYxLGRDb2xEaWZmMgotICAgICAgICAKLSAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIDxEZXF1YW50aXplPiBpbXByb3ZlcyBvbiB0aGUgYy1yZWZlcmVuY2UgY29kZQotICAgICAgICA7Ly8gQm90aCB0aGUgIGNhc2VzIGkuZS4sIFNoaWZ0Pj0wIGFuZCBTaGlmdDwwIGNhc2VzIGFyZSBjb3ZlcmVkIHRvZ2V0aGVyCi0gICAgICAgIDsvLyBXZSBkbyBub3Qgc3VidHJhY3QgMiBmcm9tIFNoaWZ0IGFzIGluIEMgcmVmZXJlbmNlLCBpbnN0ZWFkIHBlcmZvcm0gYQotICAgICAgICA7Ly8gU2NhbGUgPDwgU2hpZnQgb25jZSBpbiB0aGUgYmVnaW5uaW5nIGFuZCBkbyBhIHJpZ2h0IHNoaWZ0IGJ5IGEgCi0gICAgICAgIDsvLyBjb25zdGFudCAyIGFmdGVyIHRoZSBNdWx0aXBsaWNhdGlvbi4gVGhlIHZhbHVlIG9mIFJvdW5kIHdvdWxkIGJlIDIgCi0gICAgICAgIDsvLyAKLSAgICAgICAgOy8vIEJ5IGRvaW5nIHRoaXMgd2UgYXZpb2QgdGhlIEJyYW5jaGVzIHJlcXVpcmVkIGFuZCBhbHNvIAotICAgICAgICA7Ly8gcmVkdWNlIHRoZSBjb2RlIHNpemUgc3Vic3RhbnRpYWxseQotICAgICAgICA7Ly8gCi0gICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBWRFVQICAgIGRTY2FsZSwgU2NhbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEFSTSAtPiBORU9OICBjb3B5ICdzY2FsZScgdG8gdmVjdG9yCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgVk1PViAgICBxUm91bmQwLCMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTZXQgdGhlIFJvdW5kIFZhbHVlIAotICAgICAgICBWTU9WICAgIHFSb3VuZDEsIzIKLSAgICAgICAgVk1PViAgICBxUm91bmQyLCMyCi0gICAgICAgIFZNT1YgICAgcVJvdW5kMywjMgotICAgICAgICAKLSAgICAgICAgVk1MQUwgICBxUm91bmQwLGRDb2xPcDAsZFNjYWxlICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0W2ldICogU2NhbGUgKyBSb3VuZCAKLSAgICAgICAgVk1MQUwgICBxUm91bmQxLGRDb2xPcDEsZFNjYWxlCi0gICAgICAgIFZNTEFMICAgcVJvdW5kMixkQ29sT3AyLGRTY2FsZQotICAgICAgICBWTUxBTCAgIHFSb3VuZDMsZENvbE9wMyxkU2NhbGUKLSAgICAgICAgCi0gICAgICAgIFZTSFJOICAgZE91dDAscVJvdW5kMCwjMiAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFJpZ2h0IHNoaWZ0IGJ5IDIgJiAoT01YX1MxNilWYWx1ZQotICAgICAgICBWU0hSTiAgIGRPdXQxLHFSb3VuZDEsIzIKLSAgICAgICAgVlNIUk4gICBkT3V0MixxUm91bmQyLCMyCi0gICAgICAgIFZTSFJOICAgZE91dDMscVJvdW5kMywjMgotICAgICAgICAKLSAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICA7Ly8gU3RvcmUgYWxsIHRoZSA0eDQgcGl4ZWxzCi0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgCi0gICAgICAgIFZTVDEgIHtkT3V0MCxkT3V0MSxkT3V0MixkT3V0M30sIFtwRGF0YV0KLQotICAgICAgICAKLSAgICAgICAgOy8vIFNldCByZXR1cm4gdmFsdWUKLSAgICAgICAgCi0gICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiB0YWlsCi0gICAgICAgIE1fRU5EICAgICAgICAKLSAgICAgICAgCi0gICAgRU5ESUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvL0NPUlRFWEE4ICAgCi0gICAgICAgIAotCi0KLTsvLyBGdW5jdGlvbjogb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIKLSAgICAKLTsvL0lucHV0IFJlZ2lzdGVycwotcHBTcmMgICAgICAgICAgICAgICBSTiAgMAotcERzdCAgICAgICAgICAgICAgICBSTiAgMQotUVBSMiAgICAgICAgICAgICAgICBSTiAgMgotCi07Ly9PdXRwdXQgUmVnaXN0ZXJzCi1yZXN1bHQgICAgICAgICAgICAgIFJOICAwCi0KLTsvL0xvY2FsIFNjcmF0Y2ggUmVnaXN0ZXJzCi1wRHN0UjQgICAgICAgICAgICAgIFJOICA0Ci1wRHN0UjAgICAgICAgICAgICAgIFJOICAwCi1RUFIxICAgICAgICAgICAgICAgIFJOICAxCi1RUFI1ICAgICAgICAgICAgICAgIFJOICA1Ci0KLTsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKLSAgICAKLSAgICBJRiBDb3J0ZXhBOAotICAgICAgIAotICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgcmVxdWlyZWQgYnkgdGhlIGZ1bmN0aW9uCi0gICAgICAgIAotCi0gICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgotICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyLHI1Ci0gICAgICAgIAotICAgICAgICBNT1YgICAgIHBEc3RSNCxwRHN0ICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTYXZpbmcgcmVnaXN0ZXIgcjEKLSAgICAgICAgTU9WICAgICBRUFI1LFFQUjIgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2F2aW5nIHJlZ2lzdGVyIHIyCi0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NAotICAgICAgICAKLSAgICAgICAgTU9WICAgICBwRHN0UjAscERzdFI0ICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2V0dGluZyB1cCByZWdpc3RlciByMAotICAgICAgICBNT1YgICAgIFFQUjEsUVBSNSAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTZXR0aW5nIHVwIHJlZ2lzdGVyIHIxCi0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50THVtYURDNHg0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgCi0gICAgICAgIDsvLyBTZXQgcmV0dXJuIHZhbHVlCi0gICAgICAgIE1PViAgICAgcmVzdWx0LCNPTVhfU3RzX05vRXJyICAgICAgICAKLSAgICAgICAKLSAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIHRhaWwKLSAgICAgICAgTV9FTkQKLSAgICAgICAgCi0gICAgICAgICAgICAKLSAgICBFTkRJRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vQVJNMTEzNkpTICAKLSAgICAKLQotICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9BdmVyYWdlXzR4X0FsaWduX3Vuc2FmZV9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0F2ZXJhZ2VfNHhfQWxpZ25fdW5zYWZlX3MuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFmZmIwOS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0F2ZXJhZ2VfNHhfQWxpZ25fdW5zYWZlX3MuUworKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKgotICoKLSAqLwotCi0gICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCi0gICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCi0KLSAgICAuYXJtCi0gICAgLmZwdSBuZW9uCi0gICAgLnRleHQKLQotICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjBfdW5zYWZlCi1hcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMF91bnNhZmU6Ci0gICAgUFVTSCAgICAge3I0LXI2LGxyfQotICAgIExEUiAgICAgIHI3LCA9MHg4MDgwODA4MAotICAgIExEUiAgICAgIHIxMixbcjIsIzBdCi0gICAgTERSICAgICAgcjEwLFtyMF0scjEKLSAgICBMRFIgICAgICBscixbcjIscjNdCi0gICAgTERSICAgICAgcjExLFtyMF0scjEKLSAgICBNVk4gICAgICByMTIscjEyCi0gICAgTVZOICAgICAgbHIsbHIKLSAgICBVSFNVQjggICByNSxyMTAscjEyCi0gICAgVUhTVUI4ICAgcjQscjExLGxyCi0gICAgRU9SICAgICAgcjUscjUscjcKLSAgICBTVFIgICAgICByNSxbcjJdLHIzCi0gICAgRU9SICAgICAgcjQscjQscjcKLSAgICBTVFIgICAgICByNCxbcjJdLHIzCi0gICAgTERSICAgICAgcjEwLFtyMF0scjEKLSAgICBMRFIgICAgICByMTIsW3IyLCMwXQotICAgIExEUiAgICAgIHIxMSxbcjBdLHIxCi0gICAgTERSICAgICAgbHIsW3IyLHIzXQotICAgIE1WTiAgICAgIHIxMixyMTIKLSAgICBVSFNVQjggICByNSxyMTAscjEyCi0gICAgTVZOICAgICAgbHIsbHIKLSAgICBVSFNVQjggICByNCxyMTEsbHIKLSAgICBFT1IgICAgICByNSxyNSxyNwotICAgIFNUUiAgICAgIHI1LFtyMl0scjMKLSAgICBFT1IgICAgICByNCxyNCxyNwotICAgIFNUUiAgICAgIHI0LFtyMl0scjMKLSAgICBQT1AgICAgICB7cjQtcjYscGN9Ci0KLSAgICAuZ2xvYmFsIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24yX3Vuc2FmZQotYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjJfdW5zYWZlOgotICAgIFBVU0ggICAgIHtyNC1yNixscn0KLSAgICBMRFIgICAgICByNywgPTB4ODA4MDgwODAKLSAgICBMRFIgICAgICByNCxbcjAsIzRdCi0gICAgTERSICAgICAgcjEwLFtyMF0scjEKLSAgICBMRFIgICAgICByMTIsW3IyLCMwXQotICAgIExEUiAgICAgIGxyLFtyMixyM10KLSAgICBMRFIgICAgICByNSxbcjAsIzRdCi0gICAgTERSICAgICAgcjExLFtyMF0scjEKLSAgICBNVk4gICAgICByMTIscjEyCi0gICAgTVZOICAgICAgbHIsbHIKLSAgICBMU1IgICAgICByMTAscjEwLCMxNgotICAgIE9SUiAgICAgIHIxMCxyMTAscjQsTFNMICMxNgotICAgIExTUiAgICAgIHIxMSxyMTEsIzE2Ci0gICAgT1JSICAgICAgcjExLHIxMSxyNSxMU0wgIzE2Ci0gICAgVUhTVUI4ICAgcjUscjEwLHIxMgotICAgIFVIU1VCOCAgIHI0LHIxMSxscgotICAgIEVPUiAgICAgIHI1LHI1LHI3Ci0gICAgU1RSICAgICAgcjUsW3IyXSxyMwotICAgIEVPUiAgICAgIHI0LHI0LHI3Ci0gICAgU1RSICAgICAgcjQsW3IyXSxyMwotICAgIExEUiAgICAgIHI0LFtyMCwjNF0KLSAgICBMRFIgICAgICByMTAsW3IwXSxyMQotICAgIExEUiAgICAgIHIxMixbcjIsIzBdCi0gICAgTERSICAgICAgbHIsW3IyLHIzXQotICAgIExEUiAgICAgIHI1LFtyMCwjNF0KLSAgICBMRFIgICAgICByMTEsW3IwXSxyMQotICAgIE1WTiAgICAgIHIxMixyMTIKLSAgICBNVk4gICAgICBscixscgotICAgIExTUiAgICAgIHIxMCxyMTAsIzE2Ci0gICAgT1JSICAgICAgcjEwLHIxMCxyNCxMU0wgIzE2Ci0gICAgTFNSICAgICAgcjExLHIxMSwjMTYKLSAgICBPUlIgICAgICByMTEscjExLHI1LExTTCAjMTYKLSAgICBVSFNVQjggICByNSxyMTAscjEyCi0gICAgVUhTVUI4ICAgcjQscjExLGxyCi0gICAgRU9SICAgICAgcjUscjUscjcKLSAgICBTVFIgICAgICByNSxbcjJdLHIzCi0gICAgRU9SICAgICAgcjQscjQscjcKLSAgICBTVFIgICAgICByNCxbcjJdLHIzCi0gICAgUE9QICAgICAge3I0LXI2LHBjfQotCi0gICAgLmdsb2JhbCBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduM191bnNhZmUKLWFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24zX3Vuc2FmZToKLSAgICBQVVNIICAgICB7cjQtcjYsbHJ9Ci0gICAgTERSICAgICAgcjcsID0weDgwODA4MDgwCi0gICAgTERSICAgICAgcjQsW3IwLCM0XQotICAgIExEUiAgICAgIHIxMCxbcjBdLHIxCi0gICAgTERSICAgICAgcjEyLFtyMiwjMF0KLSAgICBMRFIgICAgICBscixbcjIscjNdCi0gICAgTERSICAgICAgcjUsW3IwLCM0XQotICAgIExEUiAgICAgIHIxMSxbcjBdLHIxCi0gICAgTVZOICAgICAgcjEyLHIxMgotICAgIE1WTiAgICAgIGxyLGxyCi0gICAgTFNSICAgICAgcjEwLHIxMCwjMjQKLSAgICBPUlIgICAgICByMTAscjEwLHI0LExTTCAjOAotICAgIExTUiAgICAgIHIxMSxyMTEsIzI0Ci0gICAgT1JSICAgICAgcjExLHIxMSxyNSxMU0wgIzgKLSAgICBVSFNVQjggICByNSxyMTAscjEyCi0gICAgVUhTVUI4ICAgcjQscjExLGxyCi0gICAgRU9SICAgICAgcjUscjUscjcKLSAgICBTVFIgICAgICByNSxbcjJdLHIzCi0gICAgRU9SICAgICAgcjQscjQscjcKLSAgICBTVFIgICAgICByNCxbcjJdLHIzCi0gICAgTERSICAgICAgcjQsW3IwLCM0XQotICAgIExEUiAgICAgIHIxMCxbcjBdLHIxCi0gICAgTERSICAgICAgcjEyLFtyMiwjMF0KLSAgICBMRFIgICAgICBscixbcjIscjNdCi0gICAgTERSICAgICAgcjUsW3IwLCM0XQotICAgIExEUiAgICAgIHIxMSxbcjBdLHIxCi0gICAgTVZOICAgICAgcjEyLHIxMgotICAgIE1WTiAgICAgIGxyLGxyCi0gICAgTFNSICAgICAgcjEwLHIxMCwjMjQKLSAgICBPUlIgICAgICByMTAscjEwLHI0LExTTCAjOAotICAgIExTUiAgICAgIHIxMSxyMTEsIzI0Ci0gICAgT1JSICAgICAgcjExLHIxMSxyNSxMU0wgIzgKLSAgICBVSFNVQjggICByNSxyMTAscjEyCi0gICAgVUhTVUI4ICAgcjQscjExLGxyCi0gICAgRU9SICAgICAgcjUscjUscjcKLSAgICBTVFIgICAgICByNSxbcjJdLHIzCi0gICAgRU9SICAgICAgcjQscjQscjcKLSAgICBTVFIgICAgICByNCxbcjJdLHIzCi0gICAgUE9QICAgICAge3I0LXI2LHBjfQotCi0gICAgLmVuZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFfdW5zYWZlX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYV91bnNhZmVfcy5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGVhNGE5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYV91bnNhZmVfcy5TCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoKLSAqCi0gKi8KLQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQotCi0gICAgLmFybQotICAgIC5mcHUgbmVvbgotICAgIC50ZXh0Ci0KLSAgICAuZ2xvYmFsIGFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTTFQ0X3Vuc2FmZQotYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hYlNMVDRfdW5zYWZlOgotICAgIFZMRDEuMzIgIHtkMThbMF19LFtyNV0hCi0gICAgVlNVQkwuVTggcTExLGQ1LGQ5Ci0gICAgVk1PViAgICAgZDI4LGQxOAotICAgIFZTVUJMLlU4IHExMCxkOCxkNAotICAgIFZTSFIuUzE2IHExMSxxMTEsIzIKLSAgICBWWklQLjggICBkMTgsZDI4Ci0gICAgVkJJRiAgICAgZDE4LGQxNCxkMTYKLSAgICBWUkhBREQuUzE2IHExMCxxMTEscTEwCi0gICAgVkFERC5JOCAgZDMxLGQxOCxkMTUKLSAgICBWUU1PVk4uUzE2IGQyMCxxMTAKLSAgICBWTEQxLjggICB7ZDBbXX0sW3IyXQotICAgIFZNSU4uUzggIGQyMCxkMjAsZDMxCi0gICAgVk5FRy5TOCAgZDMxLGQzMQotICAgIFZMRDEuOCAgIHtkMltdfSxbcjNdCi0gICAgVk1BWC5TOCAgZDIwLGQyMCxkMzEKLSAgICBWTU9WTC5VOCBxMTQsZDQKLSAgICBWTU9WTC5VOCBxMTIsZDgKLSAgICBWQUREVy5TOCBxMTQscTE0LGQyMAotICAgIFZTVUJXLlM4IHExMixxMTIsZDIwCi0gICAgVlFNT1ZVTi5TMTYgZDI5LHExNAotICAgIFZRTU9WVU4uUzE2IGQyNCxxMTIKLSAgICBCWCAgICAgICBscgotCi0gICAgLmdsb2JhbCBhcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFiU0dFNF91bnNhZmUKLWFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTR0U0X3Vuc2FmZToKLSAgICBWSEFERC5VOCBkMTMsZDQsZDkKLSAgICBWSEFERC5VOCBkMzEsZDgsZDUKLSAgICBWTEQxLjggICB7ZDBbXX0sW3IyXQotICAgIEFERCAgICAgIHI1LHI1LCM0Ci0gICAgVkxEMS44ICAge2QyW119LFtyM10KLSAgICBWUkhBREQuVTggZDEzLGQxMyxkNQotICAgIFZSSEFERC5VOCBkMzEsZDMxLGQ5Ci0gICAgQlggICAgICAgbHIKLQotICAgIC5lbmQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYV91bnNhZmVfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYV91bnNhZmVfcy5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWZiMmM1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFfdW5zYWZlX3MuUworKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKgotICoKLSAqLwotCi0gICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCi0gICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCi0KLSAgICAuYXJtCi0gICAgLmZwdSBuZW9uCi0gICAgLnRleHQKLQotICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTTFQ0X3Vuc2FmZQotYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTTFQ0X3Vuc2FmZToKLSAgICBWU1VCTC5VOCBxMTEsZDUsZDkKLSAgICBWTEQxLjggICB7ZDE4W119LFtyNV0hCi0gICAgVlNVQkwuVTggcTEwLGQ4LGQ0Ci0gICAgVkxEMS44ICAge2QxOVtdfSxbcjVdIQotICAgIFZTSFIuUzE2IHExMSxxMTEsIzIKLSAgICBWRVhULjggICBkMTgsZDE4LGQxOSwjNAotICAgIFZBTkQgICAgIGQxOSxkMTcsZDE1Ci0gICAgVkJJRiAgICAgZDE4LGQxNCxkMTYKLSAgICBWUkhBREQuUzE2IHExMCxxMTEscTEwCi0gICAgVlJIQURELlU4IGQyNCxkNCxkOAotICAgIFZBREQuSTggIGQzMSxkMTgsZDE5Ci0gICAgVkFORCAgICAgZDE5LGQxMixkMTUKLSAgICBWUUFERC5VOCBkMjMsZDUsZDE4Ci0gICAgVlFNT1ZOLlMxNiBkMjAscTEwCi0gICAgVkFERC5JOCAgZDMxLGQzMSxkMTkKLSAgICBWUVNVQi5VOCBkMjIsZDUsZDE4Ci0gICAgVlFBREQuVTggZDE5LGQ5LGQxOAotICAgIFZIQURELlU4IGQyNixkMjQsZDYKLSAgICBWTUlOLlM4ICBkMjAsZDIwLGQzMQotICAgIFZORUcuUzggIGQzMSxkMzEKLSAgICBWUVNVQi5VOCBkMjEsZDksZDE4Ci0gICAgVkhBREQuVTggZDI3LGQyNCxkMTAKLSAgICBWTUFYLlU4ICBkMzAsZDI2LGQyMgotICAgIFZNQVguUzggIGQyMCxkMjAsZDMxCi0gICAgVk1PVkwuVTggcTE0LGQ0Ci0gICAgVk1PVkwuVTggcTEyLGQ4Ci0gICAgVkFERFcuUzggcTE0LHExNCxkMjAKLSAgICBWU1VCVy5TOCBxMTIscTEyLGQyMAotICAgIFZRTU9WVU4uUzE2IGQyOSxxMTQKLSAgICBWUU1PVlVOLlMxNiBkMjQscTEyCi0gICAgVk1BWC5VOCAgZDI1LGQyNyxkMjEKLSAgICBWTUlOLlU4ICBkMzAsZDMwLGQyMwotICAgIFZNSU4uVTggIGQyNSxkMjUsZDE5Ci0gICAgVkJJRiAgICAgZDI5LGQ0LGQxNgotICAgIFZCSUYgICAgIGQzMCxkNSxkMTcKLSAgICBWQklGICAgICBkMjQsZDgsZDE2Ci0gICAgVkJJRiAgICAgZDI1LGQ5LGQxMgotICAgIEJYICAgICAgIGxyCi0KLSAgICAuZ2xvYmFsIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0dFNF91bnNhZmUKLWFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0dFNF91bnNhZmU6Ci0gICAgVlNIUi5VOCAgZDE5LGQwLCMyCi0gICAgVkFERC5JOCAgZDE5LGQxOSxkMTUKLSAgICBWQURETC5VOCBxMTAsZDgsZDQKLSAgICBWQURELkk4ICBkMTksZDE5LGQxNQotICAgIFZBRERMLlU4IHExMSxkNixkOQotICAgIFZBRERXLlU4IHExMixxMTAsZDUKLSAgICBWQ0dULlU4ICBkMTksZDE5LGQxMwotICAgIFZTSFIuVTE2IHExMSxxMTEsIzEKLSAgICBWSEFERC5VMTYgcTExLHExMixxMTEKLSAgICBWQUREVy5VOCBxMTIscTEyLGQ2Ci0gICAgVkFEREwuVTggcTEzLGQ3LGQ2Ci0gICAgVkFORCAgICAgZDE3LGQxNyxkMTkKLSAgICBWSEFERC5VOCBkMjgsZDQsZDkKLSAgICBWU1JBLlUxNiBxMTMscTEyLCMxCi0gICAgVkFORCAgICAgZDEyLGQxMixkMTkKLSAgICBWUVJTSFJOLlUxNiBkMjkscTExLCMxCi0gICAgVlJIQURELlU4IGQyOCxkMjgsZDUKLSAgICBWUVJTSFJOLlUxNiBkMzAscTEyLCMyCi0gICAgVkFEREwuVTggcTExLGQxMCxkNQotICAgIFZBRERXLlU4IHExMixxMTAsZDkKLSAgICBWQklGICAgICBkMjksZDI4LGQxNwotICAgIFZRUlNIUk4uVTE2IGQzMSxxMTMsIzIKLSAgICBWQURETC5VOCBxMTMsZDExLGQxMAotICAgIFZTSFIuVTE2IHExMSxxMTEsIzEKLSAgICBWSEFERC5VMTYgcTExLHExMixxMTEKLSAgICBWQUREVy5VOCBxMTIscTEyLGQxMAotICAgIFZIQURELlU4IGQyOCxkOCxkNQotICAgIFZCSUYgICAgIGQyOSxkNCxkMTYKLSAgICBWQklGICAgICBkMzAsZDUsZDE3Ci0gICAgVlNSQS5VMTYgcTEzLHExMiwjMQotICAgIFZRUlNIUk4uVTE2IGQyNSxxMTIsIzIKLSAgICBWUVJTSFJOLlUxNiBkMjQscTExLCMxCi0gICAgVlJIQURELlU4IGQyMixkMjgsZDkKLSAgICBWQklGICAgICBkMjUsZDksZDEyCi0gICAgVkJJRiAgICAgZDMxLGQ2LGQxNwotICAgIFZCSUYgICAgIGQyNCxkMjIsZDEyCi0gICAgVlFSU0hSTi5VMTYgZDI4LHExMywjMgotICAgIFZCSUYgICAgIGQyNCxkOCxkMTYKLSAgICBWQklGICAgICBkMjgsZDEwLGQxMgotICAgIEJYICAgICAgIGxyCi0KLSAgICAuZW5kCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyX3MuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdjMDQ1Mi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcl9zLlMKKysrIC9kZXYvbnVsbApAQCAtMSwzMjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoKLSAqCi0gKi8KLQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQotCi0gICAgLmFybQotICAgIC5mcHUgbmVvbgotICAgIC50ZXh0Ci0KLSAgICAuZXh0ZXJuICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXMKLSAgICAuZXh0ZXJuICAgYXJtVkNNNFAxMF9TdWZmaXhUb0xldmVsCi0gICAgLmV4dGVybiAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzCi0gICAgLmV4dGVybiAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXMKLSAgICAuZXh0ZXJuICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlcwotICAgIC5leHRlcm4gICBhcm1WQ000UDEwX1ppZ1phZ18yeDIKLSAgICAuZXh0ZXJuICAgYXJtVkNNNFAxMF9aaWdaYWdfNHg0Ci0KLSAgICAuaGlkZGVuICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXMKLSAgICAuaGlkZGVuICAgYXJtVkNNNFAxMF9TdWZmaXhUb0xldmVsCi0gICAgLmhpZGRlbiAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzCi0gICAgLmhpZGRlbiAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXMKLSAgICAuaGlkZGVuICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlcwotICAgIC5oaWRkZW4gICBhcm1WQ000UDEwX1ppZ1phZ18yeDIKLSAgICAuaGlkZGVuICAgYXJtVkNNNFAxMF9aaWdaYWdfNHg0Ci0KLSAgICAuZ2xvYmFsIGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyCi1hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcjoKLSAgICBQVVNIICAgICB7cjQtcjEyLGxyfQotICAgIFNVQiAgICAgIHNwLHNwLCMweDQwCi0gICAgTERSICAgICAgcjEwLFtyMCwjMF0KLSAgICBMRFIgICAgICByMTIsW3IxLCMwXQotICAgIExEUiAgICAgIHI2LCAuTGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzCi1QMDogQUREICAgICAgcjYsIHBjCi0gICAgTERSICAgICAgcjQsW3NwLCMweDY4XQotICAgIExEUkIgICAgIHI5LFtyMTAsIzJdCi0gICAgTERSQiAgICAgcjgsW3IxMCwjMV0KLSAgICBMRFJCICAgICByMTEsW3IxMF0sIzMKLSAgICBBREQgICAgICByMTIscjEyLCM4Ci0gICAgTERSICAgICAgcjYsW3I2LHI0LExTTCAjMl0KLSAgICBPUlIgICAgICByOSxyOSxyOCxMU0wgIzgKLSAgICBPUlIgICAgICByMTEscjkscjExLExTTCAjMTYKLSAgICBMU0xTICAgICByOCxyMTEscjEyCi0gICAgTU9WUyAgICAgcjcsIzB4MWUKLSAgICBBTkQgICAgICByNyxyNyxyOCxMU1IgIzI3Ci0gICAgU1VCUyAgICAgcjEyLHIxMiwjOAotTDB4NDQ6Ci0gICAgQkNDICAgICAgTDEKLSAgICBMRFJCICAgICByOCxbcjEwXSwjMQotTDE6Ci0gICAgTERSSCAgICAgcjcsW3I2LHI3XQotICAgIEFERENDICAgIHIxMixyMTIsIzgKLSAgICBBREQgICAgICByMTIscjEyLCM0Ci0gICAgT1JSQ1MgICAgcjExLHI4LHIxMSxMU0wgIzgKLSAgICBMU1JTICAgICByOCxyNywjMQotICAgIEJDUyAgICAgIEwweDc0Ci0gICAgTFNMUyAgICAgcjgscjExLHIxMgotICAgIFNVQlMgICAgIHIxMixyMTIsIzB4YQotICAgIEFERCAgICAgIHI3LHI3LHI4LExTUiAjMjkKLSAgICBCSUMgICAgICByNyxyNywjMQotICAgIEIgICAgICAgIEwweDQ0Ci1MMHg3NDoKLSAgICBTVUIgICAgICByMTIscjEyLHI3LExTUiAjMTMKLSAgICBCSUMgICAgICByNyxyOCwjMHhmMDAwCi0gICAgTFNSUyAgICAgcjUscjcsIzIKLSAgICBTVFJCICAgICByNSxbcjIsIzBdCi0gICAgQkVRICAgICAgTDB4MzQ0Ci0gICAgQ01QICAgICAgcjcsIzB4NDQKLSAgICBCR0UgICAgICBMMHgzM2MKLSAgICBTVFIgICAgICByMCxbc3AsIzBdCi0gICAgU1RSICAgICAgcjEsW3NwLCM0XQotICAgIFNUUiAgICAgIHIzLFtzcCwjOF0KLSAgICBBTkRTICAgICByMSxyNywjMwotICAgIEFERCAgICAgIHIyLHNwLCMweGMKLSAgICBCRVEgICAgICBMMHhkOAotICAgIE1PViAgICAgIHIwLHIxCi1MMHhhYzoKLSAgICBMU0xTICAgICByNyxyMTEscjEyCi0gICAgU1VCUyAgICAgcjEyLHIxMiwjNwotICAgIEJDQyAgICAgIEwyCi0gICAgTERSQiAgICAgcjgsW3IxMF0sIzEKLUwyOgotICAgIEFERENDICAgIHIxMixyMTIsIzgKLSAgICBMU1IgICAgICByNyxyNywjMzEKLSAgICBPUlJDUyAgICByMTEscjgscjExLExTTCAjOAotICAgIFNVQlMgICAgIHIwLHIwLCMxCi0gICAgTU9WICAgICAgcjgsIzEKLSAgICBTVUIgICAgICByOCxyOCxyNyxMU0wgIzEKLSAgICBTVFJIICAgICByOCxbcjJdLCMyCi0gICAgQkdUICAgICAgTDB4YWMKLUwweGQ4OgotICAgIFNVQlMgICAgIHIwLHI1LHIxCi0gICAgQkVRICAgICAgTDB4MWI4Ci0gICAgTU9WICAgICAgcjQsIzEKLSAgICBDTVAgICAgICByNSwjMHhhCi0gICAgTU9WTEUgICAgcjQsIzAKLSAgICBDTVAgICAgICByMSwjMwotICAgIE1PVkxUICAgIHIxLCM0Ci0gICAgTU9WR0UgICAgcjEsIzIKLSAgICBNT1ZHRSAgICByNCwjMAotTDB4ZmM6Ci0gICAgTFNMUyAgICAgcjcscjExLHIxMgotICAgIENMWiAgICAgIHI3LHI3Ci0gICAgQUREICAgICAgcjEyLHIxMixyNwotICAgIFNVQlMgICAgIHIxMixyMTIsIzcKLSAgICBCQ0MgICAgICBMMwotICAgIExEUkIgICAgIHI4LFtyMTBdLCMxCi0gICAgT1JSICAgICAgcjExLHI4LHIxMSxMU0wgIzgKLSAgICBTVUJTICAgICByMTIscjEyLCM4Ci0gICAgQkNDICAgICAgTDMKLSAgICBMRFJCICAgICByOCxbcjEwXSwjMQotTDM6Ci0gICAgQUREQ0MgICAgcjEyLHIxMiwjOAotICAgIE9SUkNTICAgIHIxMSxyOCxyMTEsTFNMICM4Ci0gICAgQ01QICAgICAgcjcsIzB4MTAKLSAgICBCR0UgICAgICBMMHgzM2MKLSAgICBNT1ZTICAgICBscixyNAotICAgIFRFUUVRICAgIHI3LCMweGUKLSAgICBNT1ZFUSAgICBsciwjNAotICAgIFRFUSAgICAgIHI3LCMweGYKLSAgICBNT1ZFUSAgICBsciwjMHhjCi0gICAgVEVRRVEgICAgcjQsIzAKLSAgICBBRERFUSAgICByNyxyNywjMHhmCi0gICAgVEVRICAgICAgbHIsIzAKLSAgICBCRVEgICAgICBMMHgxODQKLSAgICBMU0wgICAgICByMyxyMTEscjEyCi0gICAgQUREICAgICAgcjEyLHIxMixscgotICAgIFNVQlMgICAgIHIxMixyMTIsIzgKLSAgICBSU0IgICAgICByOSxsciwjMHgyMAotICAgIEJDQyAgICAgIEw0Ci0gICAgTERSQiAgICAgcjgsW3IxMF0sIzEKLSAgICBPUlIgICAgICByMTEscjgscjExLExTTCAjOAotICAgIFNVQlMgICAgIHIxMixyMTIsIzgKLSAgICBCQ0MgICAgICBMNAotICAgIExEUkIgICAgIHI4LFtyMTBdLCMxCi1MNDoKLSAgICBBRERDQyAgICByMTIscjEyLCM4Ci0gICAgTFNSICAgICAgcjMscjMscjkKLSAgICBPUlJDUyAgICByMTEscjgscjExLExTTCAjOAotICAgIExTTCAgICAgIHI3LHI3LHI0Ci0gICAgQUREICAgICAgcjcscjMscjcKLUwweDE4NDoKLSAgICBBREQgICAgICByNyxyNyxyMQotICAgIE1PViAgICAgIHIxLCMyCi0gICAgTFNSUyAgICAgcjgscjcsIzEKLSAgICBSU0JDUyAgICByOCxyOCwjMAotICAgIFNUUkggICAgIHI4LFtyMl0sIzIKLSAgICBMRFIgICAgICByOSwgLkxhcm1WQ000UDEwX1N1ZmZpeFRvTGV2ZWwKLVAxOiBBREQgICAgICByOSwgcGMKLSAgICBMRFJTQiAgICByOCxbcjkscjRdCi0gICAgVEVRICAgICAgcjQsIzAKLSAgICBNT1ZFUSAgICByNCwjMQotICAgIENNUCAgICAgIHI3LHI4Ci0gICAgQUREQ1MgICAgcjQscjQsIzEKLSAgICBTVUJTICAgICByMCxyMCwjMQotICAgIEJHVCAgICAgIEwweGZjCi1MMHgxYjg6Ci0gICAgTERSICAgICAgcjgsW3NwLCMweDZjXQotICAgIFNVQiAgICAgIHIwLHI1LCMxCi0gICAgU1VCUyAgICAgcjEscjgscjUKLSAgICBBREQgICAgICByNCxzcCwjMHgyYwotICAgIE1PViAgICAgIGxyLHI1Ci0gICAgU1VCICAgICAgbHIsbHIsIzEKLSAgICBCRVEgICAgICBMMHgyYjAKLSAgICBURVEgICAgICByOCwjNAotICAgIExEUkVRICAgIHI2LCAuTGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzCi0gICAgTERSTkUgICAgcjYsIC5MYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlcwotUDI6IEFERCAgICAgIHI2LCBwYwotICAgIExEUiAgICAgIHI2LFtyNixyNSxMU0wgIzJdCi0gICAgTFNMUyAgICAgcjgscjExLHIxMgotICAgIE1PVlMgICAgIHI3LCMweDFlCi0gICAgQU5EICAgICAgcjcscjcscjgsTFNSICMyNwotICAgIFNVQlMgICAgIHIxMixyMTIsIzgKLUwweDFmNDoKLSAgICBCQ0MgICAgICBMNQotICAgIExEUkIgICAgIHI4LFtyMTBdLCMxCi1MNToKLSAgICBMRFJIICAgICByNyxbcjYscjddCi0gICAgQUREQ0MgICAgcjEyLHIxMiwjOAotICAgIEFERCAgICAgIHIxMixyMTIsIzQKLSAgICBPUlJDUyAgICByMTEscjgscjExLExTTCAjOAotICAgIExTUlMgICAgIHI4LHI3LCMxCi0gICAgQkNTICAgICAgTDB4MjI0Ci0gICAgTFNMUyAgICAgcjgscjExLHIxMgotICAgIFNVQlMgICAgIHIxMixyMTIsIzB4YQotICAgIEFERCAgICAgIHI3LHI3LHI4LExTUiAjMjkKLSAgICBCSUMgICAgICByNyxyNywjMQotICAgIEIgICAgICAgIEwweDFmNAotTDB4MjI0OgotICAgIFNVQiAgICAgIHIxMixyMTIscjcsTFNSICMxMwotICAgIEJJQyAgICAgIHI3LHI4LCMweGYwMDAKLSAgICBDTVAgICAgICByNywjMHgxMAotICAgIEJHRSAgICAgIEwweDMzYwotICAgIExEUiAgICAgIHIzLCAuTGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXMKLVAzOiBBREQgICAgICByMywgcGMKLSAgICBBREQgICAgICByNCxzcCwjMHgyYwotICAgIE1PVlMgICAgIHIxLHI3Ci0gICAgQUREICAgICAgbHIsbHIscjEKLSAgICBCRVEgICAgICBMMHgyYjAKLUwweDI0ODoKLSAgICBTVUJTICAgICByMCxyMCwjMQotICAgIExEUiAgICAgIHI2LFtyMyxyMSxMU0wgIzJdCi0gICAgQkxUICAgICAgTDB4MmJjCi0gICAgTFNMUyAgICAgcjgscjExLHIxMgotICAgIE1PVlMgICAgIHI3LCMweGUKLSAgICBBTkQgICAgICByNyxyNyxyOCxMU1IgIzI4Ci0gICAgU1VCUyAgICAgcjEyLHIxMiwjOAotTDB4MjY0OgotICAgIEJDQyAgICAgIEw2Ci0gICAgTERSQiAgICAgcjgsW3IxMF0sIzEKLUw2OgotICAgIExEUkggICAgIHI3LFtyNixyN10KLSAgICBBRERDQyAgICByMTIscjEyLCM4Ci0gICAgQUREICAgICAgcjEyLHIxMiwjMwotICAgIE9SUkNTICAgIHIxMSxyOCxyMTEsTFNMICM4Ci0gICAgTFNSUyAgICAgcjgscjcsIzEKLSAgICBCQ1MgICAgICBMMHgyOTQKLSAgICBMU0xTICAgICByOCxyMTEscjEyCi0gICAgU1VCUyAgICAgcjEyLHIxMiwjOQotICAgIEFERCAgICAgIHI3LHI3LHI4LExTUiAjMjkKLSAgICBCSUMgICAgICByNyxyNywjMQotICAgIEIgICAgICAgIEwweDI2NAotTDB4Mjk0OgotICAgIFNVQiAgICAgIHIxMixyMTIscjcsTFNSICMxMwotICAgIEJJQyAgICAgIHI3LHI4LCMweGYwMDAKLSAgICBDTVAgICAgICByNywjMHhmCi0gICAgQkdFICAgICAgTDB4MzNjCi0gICAgU1VCUyAgICAgcjEscjEscjcKLSAgICBTVFJCICAgICByNyxbcjRdLCMxCi0gICAgQkdUICAgICAgTDB4MjQ4Ci1MMHgyYjA6Ci0gICAgU1VCUyAgICAgcjAscjAsIzEKLSAgICBCTFQgICAgICBMNwotICAgIFNUUkIgICAgIHIxLFtyNF0sIzEKLUw3OgotICAgIEJHVCAgICAgIEwweDJiMAotTDB4MmJjOgotICAgIFNUUkIgICAgIHIxLFtyNF0sIzEKLSAgICBMRFIgICAgICByOCxbc3AsIzB4NmNdCi0gICAgVEVRICAgICAgcjgsIzB4ZgotICAgIEFEREVRICAgIGxyLGxyLCMxCi0gICAgU1VCICAgICAgcjQscjQscjUKLSAgICBTVUIgICAgICByMixyMixyNQotICAgIFNVQiAgICAgIHIyLHIyLHI1Ci0gICAgTERSICAgICAgcjMsW3NwLCM4XQotICAgIExEUiAgICAgIHIwLFtyMywjMF0KLSAgICBURVEgICAgICByOCwjNAotICAgIExEUkVRICAgIHI2LCAuTGFybVZDTTRQMTBfWmlnWmFnXzJ4MgotICAgIExEUk5FICAgIHI2LCAuTGFybVZDTTRQMTBfWmlnWmFnXzR4NAotUDQ6IEFERCAgICAgIHI2LCBwYwotTDB4MmVjOgotICAgIExEUkIgICAgIHI5LFtyNF0sIzEKLSAgICBMRFJCICAgICByOCxbcjYsbHJdCi0gICAgU1VCICAgICAgbHIsbHIsIzEKLSAgICBTVUIgICAgICBscixscixyOQotICAgIExEUlNIICAgIHI5LFtyMl0sIzIKLSAgICBTVUJTICAgICByNSxyNSwjMQotICAgIE9SUkVRICAgIHI4LHI4LCMweDIwCi0gICAgQUREICAgICAgcjEscjksIzB4ODAKLSAgICBDTVAgICAgICByMSwjMHgxMDAKLSAgICBPUlJDUyAgICByOCxyOCwjMHgxMAotICAgIFRFUSAgICAgIHI1LCMwCi0gICAgU1RSQiAgICAgcjgsW3IwXSwjMQotICAgIFNUUkIgICAgIHI5LFtyMF0sIzEKLSAgICBMU1IgICAgICByOSxyOSwjOAotICAgIEJDQyAgICAgIEw4Ci0gICAgU1RSQiAgICAgcjksW3IwXSwjMQotTDg6Ci0gICAgQk5FICAgICAgTDB4MmVjCi0gICAgU1RSICAgICAgcjAsW3IzLCMwXQotICAgIExEUiAgICAgIHIwLFtzcCwjMF0KLSAgICBMRFIgICAgICByMSxbc3AsIzRdCi0gICAgQiAgICAgICAgTDB4MzQ0Ci1MMHgzM2M6Ci0gICAgTVZOICAgICAgcjAsIzEKLSAgICBCICAgICAgICBMMHgzNWMKLUwweDM0NDoKLSAgICBBREQgICAgICByMTAscjEwLHIxMixMU1IgIzMKLSAgICBBTkQgICAgICByMTIscjEyLCM3Ci0gICAgU1VCICAgICAgcjEwLHIxMCwjNAotICAgIFNUUiAgICAgIHIxMixbcjEsIzBdCi0gICAgU1RSICAgICAgcjEwLFtyMCwjMF0KLSAgICBNT1YgICAgICByMCwjMAotTDB4MzVjOgotICAgIEFERCAgICAgIHNwLHNwLCMweDQwCi0gICAgUE9QICAgICAge3I0LXIxMixwY30KLQotLkxhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlczoKLSAgICAud29yZCAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzLShQMCs4KQotLkxhcm1WQ000UDEwX1N1ZmZpeFRvTGV2ZWw6Ci0gICAgLndvcmQgICBhcm1WQ000UDEwX1N1ZmZpeFRvTGV2ZWwtKFAxKzgpCi0uTGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzOgotICAgIC53b3JkICAgKGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzIC0gNCktKFAyKzgpCi0uTGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXM6Ci0gICAgLndvcmQgICAoYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlcyAtIDQpLShQMis4KQotLkxhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzOgotICAgIC53b3JkICAgKGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXMgLSA0KS0oUDMrOCkKLS5MYXJtVkNNNFAxMF9aaWdaYWdfMngyOgotICAgIC53b3JkICAgYXJtVkNNNFAxMF9aaWdaYWdfMngyLShQNCs4KQotLkxhcm1WQ000UDEwX1ppZ1phZ180eDQ6Ci0gICAgLndvcmQgICBhcm1WQ000UDEwX1ppZ1phZ180eDQtKFA0KzgpCi0KLSAgICAuZW5kCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzX3MuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZlYmYyZi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5TCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi0vKgotICoKLSAqLwotCi0gICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCi0gICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCi0KLSAgICAuYXJtCi0gICAgLmZwdSBuZW9uCi0gICAgLnNlY3Rpb24gLnJvZGF0YQotICAgIC5hbGlnbiA0Ci0KLQotICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9RUERpdlRhYmxlCi0gICAgLmdsb2JhbCBhcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlCi0gICAgLmdsb2JhbCBhcm1WQ000UDEwX1Bvc1RvVkNvbDR4NAotICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9Qb3NUb1ZDb2wyeDIKLSAgICAuZ2xvYmFsIGFybVZDTTRQMTBfVk1hdHJpeAotICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9RUE1vZHVsb1RhYmxlCi0gICAgLmdsb2JhbCBhcm1WQ000UDEwX1ZNYXRyaXhVMTYKLQotICAgIC5oaWRkZW4gYXJtVkNNNFAxMF9RUERpdlRhYmxlCi0gICAgLmhpZGRlbiBhcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlCi0gICAgLmhpZGRlbiBhcm1WQ000UDEwX1Bvc1RvVkNvbDR4NAotICAgIC5oaWRkZW4gYXJtVkNNNFAxMF9Qb3NUb1ZDb2wyeDIKLSAgICAuaGlkZGVuIGFybVZDTTRQMTBfVk1hdHJpeAotICAgIC5oaWRkZW4gYXJtVkNNNFAxMF9RUE1vZHVsb1RhYmxlCi0gICAgLmhpZGRlbiBhcm1WQ000UDEwX1ZNYXRyaXhVMTYKLQotYXJtVkNNNFAxMF9Qb3NUb1ZDb2w0eDQ6Ci0gICAgLmJ5dGUgIDAsIDIsIDAsIDIKLSAgICAuYnl0ZSAgMiwgMSwgMiwgMQotICAgIC5ieXRlICAwLCAyLCAwLCAyCi0gICAgLmJ5dGUgIDIsIDEsIDIsIDEKLQotYXJtVkNNNFAxMF9Qb3NUb1ZDb2wyeDI6Ci0gICAgLmJ5dGUgIDAsIDIKLSAgICAuYnl0ZSAgMiwgMQotCi1hcm1WQ000UDEwX1ZNYXRyaXg6Ci0gICAgLmJ5dGUgIDEwLCAxNiwgMTMKLSAgICAuYnl0ZSAgMTEsIDE4LCAxNAotICAgIC5ieXRlICAxMywgMjAsIDE2Ci0gICAgLmJ5dGUgIDE0LCAyMywgMTgKLSAgICAuYnl0ZSAgMTYsIDI1LCAyMAotICAgIC5ieXRlICAxOCwgMjksIDIzCi0KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBUaGlzIHRhYmxlIGV2YWx1YXRlcyB0aGUgZXhwcmVzc2lvbiBbKElOVCkoUVAvNildLAotOy8vIGZvciB2YWx1ZXMgb2YgUVAgZnJvbSAwIHRvIDUxIChpbmNsdXNpdmUpLgotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1hcm1WQ000UDEwX1FQRGl2VGFibGU6Ci0gICAgLmJ5dGUgIDAsICAwLCAgMCwgIDAsICAwLCAgMAotICAgIC5ieXRlICAxLCAgMSwgIDEsICAxLCAgMSwgIDEKLSAgICAuYnl0ZSAgMiwgIDIsICAyLCAgMiwgIDIsICAyCi0gICAgLmJ5dGUgIDMsICAzLCAgMywgIDMsICAzLCAgMwotICAgIC5ieXRlICA0LCAgNCwgIDQsICA0LCAgNCwgIDQKLSAgICAuYnl0ZSAgNSwgIDUsICA1LCAgNSwgIDUsICA1Ci0gICAgLmJ5dGUgIDYsICA2LCAgNiwgIDYsICA2LCAgNgotICAgIC5ieXRlICA3LCAgNywgIDcsICA3LCAgNywgIDcKLSAgICAuYnl0ZSAgOCwgIDgsICA4LCAgOCwgIDgsICA4Ci0KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBUaGlzIHRhYmxlIGNvbnRhaW5zIGFybVZDTTRQMTBfVk1hdHJpeFtRUCU2XVswXSBlbnRpcmVzLAotOy8vIGZvciB2YWx1ZXMgb2YgUVAgZnJvbSAwIHRvIDUxIChpbmNsdXNpdmUpLgotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1hcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlOgotICAgIC5ieXRlIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKLSAgICAuYnl0ZSAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4Ci0gICAgLmJ5dGUgMTAsIDExLCAxMywgMTQsIDE2LCAxOAotICAgIC5ieXRlIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKLSAgICAuYnl0ZSAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4Ci0gICAgLmJ5dGUgMTAsIDExLCAxMywgMTQsIDE2LCAxOAotICAgIC5ieXRlIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKLSAgICAuYnl0ZSAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4Ci0gICAgLmJ5dGUgMTAsIDExLCAxMywgMTQsIDE2LCAxOAotCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gVGhpcyB0YWJsZSBldmFsdWF0ZXMgdGhlIG1vZHVsdXMgZXhwcmVzc2lvbiBbUVAlNl0qNiwKLTsvLyBmb3IgdmFsdWVzIG9mIFFQIGZyb20gMCB0byA1MSAoaW5jbHVzaXZlKS4KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotYXJtVkNNNFAxMF9RUE1vZHVsb1RhYmxlOgotICAgIC5ieXRlIDAsIDYsIDEyLCAxOCwgMjQsIDMwCi0gICAgLmJ5dGUgMCwgNiwgMTIsIDE4LCAyNCwgMzAKLSAgICAuYnl0ZSAwLCA2LCAxMiwgMTgsIDI0LCAzMAotICAgIC5ieXRlIDAsIDYsIDEyLCAxOCwgMjQsIDMwCi0gICAgLmJ5dGUgMCwgNiwgMTIsIDE4LCAyNCwgMzAKLSAgICAuYnl0ZSAwLCA2LCAxMiwgMTgsIDI0LCAzMAotICAgIC5ieXRlIDAsIDYsIDEyLCAxOCwgMjQsIDMwCi0gICAgLmJ5dGUgMCwgNiwgMTIsIDE4LCAyNCwgMzAKLSAgICAuYnl0ZSAwLCA2LCAxMiwgMTgsIDI0LCAzMAotCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gVGhpcyB0YWJsZSBjb250YWlucyB0aGUgaW52aWR1YWwgYnl0ZSB2YWx1ZXMgc3RvcmVkIGFzCi07Ly8gaGFsZndvcmRzLiBUaGlzIGF2b2lkcyB1bnBhY2tpbmcgaW5zaWRlIHRoZSBmdW5jdGlvbgotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1hcm1WQ000UDEwX1ZNYXRyaXhVMTY6Ci0gICAgLmh3b3JkIDEwLCAxNiwgMTMKLSAgICAuaHdvcmQgMTEsIDE4LCAxNAotICAgIC5od29yZCAxMywgMjAsIDE2Ci0gICAgLmh3b3JkIDE0LCAyMywgMTgKLSAgICAuaHdvcmQgMTYsIDI1LCAyMAotICAgIC5od29yZCAxOCwgMjksIDIzCi0KLSAgICAuZW5kCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0FsaWduX3Vuc2FmZV9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9BbGlnbl91bnNhZmVfcy5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGU5MDA0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0FsaWduX3Vuc2FmZV9zLlMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoKLSAqCi0gKi8KLQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQotCi0gICAgLmFybQotICAgIC5mcHUgbmVvbgotICAgIC50ZXh0Ci0KLSAgICAuZ2xvYmFsIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckFsaWduOXhfdW5zYWZlCi1hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZToKLSAgICBNT1YgICAgICByMTIscjgKLSAgICBBTkQgICAgICByNyxyMCwjMwotICAgIEJJQyAgICAgIHIwLHIwLCMzCi0gICAgQUREICAgICAgcGMscGMscjcsTFNMICMyCi0gICAgTk9QCi0gICAgQiAgICAgICAgQ29weTB0b0FsaWduZWQKLSAgICBCICAgICAgICBDb3B5MXRvQWxpZ25lZAotICAgIEIgICAgICAgIENvcHkydG9BbGlnbmVkCi0gICAgQiAgICAgICAgQ29weTN0b0FsaWduZWQKLUNvcHkwdG9BbGlnbmVkOgotICAgIExETSAgICAgIHIwLHtyNyxyMTAscjExfQotICAgIFNVQlMgICAgIHI5LHI5LCMxCi0gICAgQUREICAgICAgcjAscjAscjEKLSAgICBTVE0gICAgICByOCEse3I3LHIxMCxyMTF9Ci0gICAgQkdUICAgICAgQ29weTB0b0FsaWduZWQKLSAgICBCICAgICAgICBDb3B5RW5kCi1Db3B5MXRvQWxpZ25lZDoKLSAgICBMRE0gICAgICByMCx7cjcscjEwLHIxMX0KLSAgICBTVUJTICAgICByOSxyOSwjMQotICAgIEFERCAgICAgIHIwLHIwLHIxCi0gICAgTFNSICAgICAgcjcscjcsIzgKLSAgICBPUlIgICAgICByNyxyNyxyMTAsTFNMICMyNAotICAgIExTUiAgICAgIHIxMCxyMTAsIzgKLSAgICBPUlIgICAgICByMTAscjEwLHIxMSxMU0wgIzI0Ci0gICAgTFNSICAgICAgcjExLHIxMSwjOAotICAgIFNUTSAgICAgIHI4ISx7cjcscjEwLHIxMX0KLSAgICBCR1QgICAgICBDb3B5MXRvQWxpZ25lZAotICAgIEIgICAgICAgIENvcHlFbmQKLUNvcHkydG9BbGlnbmVkOgotICAgIExETSAgICAgIHIwLHtyNyxyMTAscjExfQotICAgIFNVQlMgICAgIHI5LHI5LCMxCi0gICAgQUREICAgICAgcjAscjAscjEKLSAgICBMU1IgICAgICByNyxyNywjMTYKLSAgICBPUlIgICAgICByNyxyNyxyMTAsTFNMICMxNgotICAgIExTUiAgICAgIHIxMCxyMTAsIzE2Ci0gICAgT1JSICAgICAgcjEwLHIxMCxyMTEsTFNMICMxNgotICAgIExTUiAgICAgIHIxMSxyMTEsIzE2Ci0gICAgU1RNICAgICAgcjghLHtyNyxyMTAscjExfQotICAgIEJHVCAgICAgIENvcHkydG9BbGlnbmVkCi0gICAgQiAgICAgICAgQ29weUVuZAotQ29weTN0b0FsaWduZWQ6Ci0gICAgTERNICAgICAgcjAse3I3LHIxMCxyMTF9Ci0gICAgU1VCUyAgICAgcjkscjksIzEKLSAgICBBREQgICAgICByMCxyMCxyMQotICAgIExTUiAgICAgIHI3LHI3LCMyNAotICAgIE9SUiAgICAgIHI3LHI3LHIxMCxMU0wgIzgKLSAgICBMU1IgICAgICByMTAscjEwLCMyNAotICAgIE9SUiAgICAgIHIxMCxyMTAscjExLExTTCAjOAotICAgIExTUiAgICAgIHIxMSxyMTEsIzI0Ci0gICAgU1RNICAgICAgcjghLHtyNyxyMTAscjExfQotICAgIEJHVCAgICAgIENvcHkzdG9BbGlnbmVkCi1Db3B5RW5kOgotICAgIE1PViAgICAgIHIwLHIxMgotICAgIE1PViAgICAgIHIxLCMweGMKLSAgICBCWCAgICAgICBscgotCi0gICAgLmdsb2JhbCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJBbGlnbjR4X3Vuc2FmZQotYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyQWxpZ240eF91bnNhZmU6Ci0gICAgQU5EICAgICAgcjcscjAsIzMKLSAgICBCSUMgICAgICByMCxyMCwjMwotICAgIEFERCAgICAgIHBjLHBjLHI3LExTTCAjMgotICAgIE5PUAotICAgIEIgICAgICAgIENvcHkwdG9WQWxpZ25lZAotICAgIEIgICAgICAgIENvcHkxdG9WQWxpZ25lZAotICAgIEIgICAgICAgIENvcHkydG9WQWxpZ25lZAotICAgIEIgICAgICAgIENvcHkzdG9WQWxpZ25lZAotQ29weTB0b1ZBbGlnbmVkOgotICAgIExEUiAgICAgIHI3LFtyMF0scjEKLSAgICBTVUJTICAgICByOSxyOSwjMQotICAgIFNUUiAgICAgIHI3LFtyOF0sIzQKLSAgICBCR1QgICAgICBDb3B5MHRvVkFsaWduZWQKLSAgICBCICAgICAgICBDb3B5VkVuZAotQ29weTF0b1ZBbGlnbmVkOgotICAgIExEUiAgICAgIHIxMCxbcjAsIzRdCi0gICAgTERSICAgICAgcjcsW3IwXSxyMQotICAgIFNVQlMgICAgIHI5LHI5LCMxCi0gICAgTFNMICAgICAgcjEwLHIxMCwjMjQKLSAgICBPUlIgICAgICByNyxyMTAscjcsTFNSICM4Ci0gICAgU1RSICAgICAgcjcsW3I4XSwjNAotICAgIEJHVCAgICAgIENvcHkxdG9WQWxpZ25lZAotICAgIEIgICAgICAgIENvcHlWRW5kCi1Db3B5MnRvVkFsaWduZWQ6Ci0gICAgTERSICAgICAgcjEwLFtyMCwjNF0KLSAgICBMRFIgICAgICByNyxbcjBdLHIxCi0gICAgU1VCUyAgICAgcjkscjksIzEKLSAgICBMU0wgICAgICByMTAscjEwLCMxNgotICAgIE9SUiAgICAgIHI3LHIxMCxyNyxMU1IgIzE2Ci0gICAgU1RSICAgICAgcjcsW3I4XSwjNAotICAgIEJHVCAgICAgIENvcHkydG9WQWxpZ25lZAotICAgIEIgICAgICAgIENvcHlWRW5kCi1Db3B5M3RvVkFsaWduZWQ6Ci0gICAgTERSICAgICAgcjEwLFtyMCwjNF0KLSAgICBMRFIgICAgICByNyxbcjBdLHIxCi0gICAgU1VCUyAgICAgcjkscjksIzEKLSAgICBMU0wgICAgICByMTAscjEwLCM4Ci0gICAgT1JSICAgICAgcjcscjEwLHI3LExTUiAjMjQKLSAgICBTVFIgICAgICByNyxbcjhdLCM0Ci0gICAgQkdUICAgICAgQ29weTN0b1ZBbGlnbmVkCi1Db3B5VkVuZDoKLSAgICBTVUIgICAgICByMCxyOCwjMHgxYwotICAgIE1PViAgICAgIHIxLCM0Ci0gICAgQlggICAgICAgbHIKLQotICAgIC5lbmQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weV91bnNhZmVfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weV91bnNhZmVfcy5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmEyODkwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHlfdW5zYWZlX3MuUworKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKgotICoKLSAqLwotCi0gICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCi0gICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCi0KLSAgICAuYXJtCi0gICAgLmZwdSBuZW9uCi0gICAgLnRleHQKLQotICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weTR4NF91bnNhZmUKLWFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHk0eDRfdW5zYWZlOgotICAgIFBVU0ggICAgIHtyNC1yNixscn0KLSAgICBBTkQgICAgICByMTIscjAsIzMKLSAgICBCSUMgICAgICByMCxyMCwjMwotICAgIEFERCAgICAgIHBjLHBjLHIxMixMU0wgIzIKLSAgICBOT1AKLSAgICBCICAgICAgICBDb3B5NHg0QWxpZ24wCi0gICAgQiAgICAgICAgQ29weTR4NEFsaWduMQotICAgIEIgICAgICAgIENvcHk0eDRBbGlnbjIKLSAgICBCICAgICAgICBDb3B5NHg0QWxpZ24zCi1Db3B5NHg0QWxpZ24wOgotICAgIExEUiAgICAgIHI0LFtyMF0scjEKLSAgICBMRFIgICAgICByNSxbcjBdLHIxCi0gICAgU1RSICAgICAgcjQsW3IyXSxyMwotICAgIExEUiAgICAgIHI4LFtyMF0scjEKLSAgICBTVFIgICAgICByNSxbcjJdLHIzCi0gICAgTERSICAgICAgcjksW3IwXSxyMQotICAgIFNUUiAgICAgIHI4LFtyMl0scjMKLSAgICBTVFIgICAgICByOSxbcjJdLHIzCi0gICAgQiAgICAgICAgQ29weTR4NEVuZAotQ29weTR4NEFsaWduMToKLSAgICBMRFIgICAgICByNSxbcjAsIzRdCi0gICAgTERSICAgICAgcjQsW3IwXSxyMQotICAgIExEUiAgICAgIHI5LFtyMCwjNF0KLSAgICBMRFIgICAgICByOCxbcjBdLHIxCi0gICAgTFNSICAgICAgcjQscjQsIzgKLSAgICBPUlIgICAgICByNCxyNCxyNSxMU0wgIzI0Ci0gICAgU1RSICAgICAgcjQsW3IyXSxyMwotICAgIExTUiAgICAgIHI4LHI4LCM4Ci0gICAgT1JSICAgICAgcjgscjgscjksTFNMICMyNAotICAgIExEUiAgICAgIHI1LFtyMCwjNF0KLSAgICBMRFIgICAgICByNCxbcjBdLHIxCi0gICAgU1RSICAgICAgcjgsW3IyXSxyMwotICAgIExEUiAgICAgIHI5LFtyMCwjNF0KLSAgICBMRFIgICAgICByOCxbcjBdLHIxCi0gICAgTFNSICAgICAgcjQscjQsIzgKLSAgICBPUlIgICAgICByNCxyNCxyNSxMU0wgIzI0Ci0gICAgU1RSICAgICAgcjQsW3IyXSxyMwotICAgIExTUiAgICAgIHI4LHI4LCM4Ci0gICAgT1JSICAgICAgcjgscjgscjksTFNMICMyNAotICAgIFNUUiAgICAgIHI4LFtyMl0scjMKLSAgICBCICAgICAgICBDb3B5NHg0RW5kCi1Db3B5NHg0QWxpZ24yOgotICAgIExEUiAgICAgIHI1LFtyMCwjNF0KLSAgICBMRFIgICAgICByNCxbcjBdLHIxCi0gICAgTERSICAgICAgcjksW3IwLCM0XQotICAgIExEUiAgICAgIHI4LFtyMF0scjEKLSAgICBMU1IgICAgICByNCxyNCwjMTYKLSAgICBPUlIgICAgICByNCxyNCxyNSxMU0wgIzE2Ci0gICAgU1RSICAgICAgcjQsW3IyXSxyMwotICAgIExTUiAgICAgIHI4LHI4LCMxNgotICAgIE9SUiAgICAgIHI4LHI4LHI5LExTTCAjMTYKLSAgICBTVFIgICAgICByOCxbcjJdLHIzCi0gICAgTERSICAgICAgcjUsW3IwLCM0XQotICAgIExEUiAgICAgIHI0LFtyMF0scjEKLSAgICBMRFIgICAgICByOSxbcjAsIzRdCi0gICAgTERSICAgICAgcjgsW3IwXSxyMQotICAgIExTUiAgICAgIHI0LHI0LCMxNgotICAgIE9SUiAgICAgIHI0LHI0LHI1LExTTCAjMTYKLSAgICBTVFIgICAgICByNCxbcjJdLHIzCi0gICAgTFNSICAgICAgcjgscjgsIzE2Ci0gICAgT1JSICAgICAgcjgscjgscjksTFNMICMxNgotICAgIFNUUiAgICAgIHI4LFtyMl0scjMKLSAgICBCICAgICAgICBDb3B5NHg0RW5kCi1Db3B5NHg0QWxpZ24zOgotICAgIExEUiAgICAgIHI1LFtyMCwjNF0KLSAgICBMRFIgICAgICByNCxbcjBdLHIxCi0gICAgTERSICAgICAgcjksW3IwLCM0XQotICAgIExEUiAgICAgIHI4LFtyMF0scjEKLSAgICBMU1IgICAgICByNCxyNCwjMjQKLSAgICBPUlIgICAgICByNCxyNCxyNSxMU0wgIzgKLSAgICBTVFIgICAgICByNCxbcjJdLHIzCi0gICAgTFNSICAgICAgcjgscjgsIzI0Ci0gICAgT1JSICAgICAgcjgscjgscjksTFNMICM4Ci0gICAgU1RSICAgICAgcjgsW3IyXSxyMwotICAgIExEUiAgICAgIHI1LFtyMCwjNF0KLSAgICBMRFIgICAgICByNCxbcjBdLHIxCi0gICAgTERSICAgICAgcjksW3IwLCM0XQotICAgIExEUiAgICAgIHI4LFtyMF0scjEKLSAgICBMU1IgICAgICByNCxyNCwjMjQKLSAgICBPUlIgICAgICByNCxyNCxyNSxMU0wgIzgKLSAgICBTVFIgICAgICByNCxbcjJdLHIzCi0gICAgTFNSICAgICAgcjgscjgsIzI0Ci0gICAgT1JSICAgICAgcjgscjgscjksTFNMICM4Ci0gICAgU1RSICAgICAgcjgsW3IyXSxyMwotQ29weTR4NEVuZDoKLSAgICBQT1AgICAgICB7cjQtcjYscGN9Ci0KLSAgICAuZW5kCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0RpYWdDb3B5X3Vuc2FmZV9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9EaWFnQ29weV91bnNhZmVfcy5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjJjNjc4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0RpYWdDb3B5X3Vuc2FmZV9zLlMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoKLSAqCi0gKi8KLQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQotCi0gICAgLmFybQotICAgIC5mcHUgbmVvbgotICAgIC50ZXh0Ci0KLSAgICAuZ2xvYmFsIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckRpYWdDb3B5X3Vuc2FmZQotYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yRGlhZ0NvcHlfdW5zYWZlOgotICAgIFBVU0ggICAgIHtyNC1yNixscn0KLSAgICBNT1YgICAgICBsciwjNAotICAgIExEUiAgICAgIHI2LCA9MHhmZTAwZmUwCi0gICAgTERSICAgICAgcjEyLCA9MHhmZjAwZmYKLUxvb3BTdGFydDE6Ci0gICAgTERSICAgICAgcjExLFtyMCwjMHhjXQotICAgIExEUiAgICAgIHIxMCxbcjAsIzhdCi0gICAgTERSICAgICAgcjUsW3IwLCM0XQotICAgIExEUiAgICAgIHI0LFtyMF0scjEKLSAgICBVUVNVQjE2ICByMTEscjExLHI2Ci0gICAgVVFTVUIxNiAgcjEwLHIxMCxyNgotICAgIFVRU1VCMTYgIHI1LHI1LHI2Ci0gICAgVVFTVUIxNiAgcjQscjQscjYKLSAgICBVU0FUMTYgICByMTEsIzEzLHIxMQotICAgIFVTQVQxNiAgIHIxMCwjMTMscjEwCi0gICAgVVNBVDE2ICAgcjUsIzEzLHI1Ci0gICAgVVNBVDE2ICAgcjQsIzEzLHI0Ci0gICAgQU5EICAgICAgcjExLHIxMixyMTEsTFNSICM1Ci0gICAgQU5EICAgICAgcjEwLHIxMixyMTAsTFNSICM1Ci0gICAgQU5EICAgICAgcjUscjEyLHI1LExTUiAjNQotICAgIEFORCAgICAgIHI0LHIxMixyNCxMU1IgIzUKLSAgICBPUlIgICAgICByMTEscjEwLHIxMSxMU0wgIzgKLSAgICBPUlIgICAgICByMTAscjQscjUsTFNMICM4Ci0gICAgU1VCUyAgICAgbHIsbHIsIzEKLSAgICBTVFJEICAgICByMTAscjExLFtyN10sIzgKLSAgICBCR1QgICAgICBMb29wU3RhcnQxCi0gICAgU1VCICAgICAgcjAscjcsIzB4MjAKLSAgICBNT1YgICAgICByMSwjOAotICAgIFBPUCAgICAgIHtyNC1yNixwY30KLQotICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyRGlhZ0NvcHlfdW5zYWZlCi1hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJEaWFnQ29weV91bnNhZmU6Ci0gICAgUFVTSCAgICAge3I0LXI2LGxyfQotICAgIExEUiAgICAgIHI2LCA9MHhmZTAwZmUwCi0gICAgTERSICAgICAgcjEyLCA9MHhmZjAwZmYKLSAgICBNT1YgICAgICBsciwjMgotTG9vcFN0YXJ0OgotICAgIExEUiAgICAgIHIxMSxbcjAsIzB4Y10KLSAgICBMRFIgICAgICByMTAsW3IwLCM4XQotICAgIExEUiAgICAgIHI1LFtyMCwjNF0KLSAgICBMRFIgICAgICByNCxbcjBdLHIxCi0gICAgVVFTVUIxNiAgcjExLHIxMSxyNgotICAgIFVRU1VCMTYgIHIxMCxyMTAscjYKLSAgICBVUVNVQjE2ICByNSxyNSxyNgotICAgIFVRU1VCMTYgIHI0LHI0LHI2Ci0gICAgVVNBVDE2ICAgcjExLCMxMyxyMTEKLSAgICBVU0FUMTYgICByMTAsIzEzLHIxMAotICAgIFVTQVQxNiAgIHI1LCMxMyxyNQotICAgIFVTQVQxNiAgIHI0LCMxMyxyNAotICAgIEFORCAgICAgIHIxMSxyMTIscjExLExTUiAjNQotICAgIEFORCAgICAgIHIxMCxyMTIscjEwLExTUiAjNQotICAgIEFORCAgICAgIHI1LHIxMixyNSxMU1IgIzUKLSAgICBBTkQgICAgICByNCxyMTIscjQsTFNSICM1Ci0gICAgT1JSICAgICAgcjExLHIxMCxyMTEsTFNMICM4Ci0gICAgT1JSICAgICAgcjEwLHI0LHI1LExTTCAjOAotICAgIFBLSEJUICAgIHI0LHIxMCxyMTEsTFNMICMxNgotICAgIFNUUiAgICAgIHI0LFtyN10sIzgKLSAgICBQS0hUQiAgICByNSxyMTEscjEwLEFTUiAjMTYKLSAgICBTVFIgICAgICByNSxbcjddLCMtNAotICAgIExEUiAgICAgIHIxMSxbcjAsIzB4Y10KLSAgICBMRFIgICAgICByMTAsW3IwLCM4XQotICAgIExEUiAgICAgIHI1LFtyMCwjNF0KLSAgICBMRFIgICAgICByNCxbcjBdLHIxCi0gICAgVVFTVUIxNiAgcjExLHIxMSxyNgotICAgIFVRU1VCMTYgIHIxMCxyMTAscjYKLSAgICBVUVNVQjE2ICByNSxyNSxyNgotICAgIFVRU1VCMTYgIHI0LHI0LHI2Ci0gICAgVVNBVDE2ICAgcjExLCMxMyxyMTEKLSAgICBVU0FUMTYgICByMTAsIzEzLHIxMAotICAgIFVTQVQxNiAgIHI1LCMxMyxyNQotICAgIFVTQVQxNiAgIHI0LCMxMyxyNAotICAgIEFORCAgICAgIHIxMSxyMTIscjExLExTUiAjNQotICAgIEFORCAgICAgIHIxMCxyMTIscjEwLExTUiAjNQotICAgIEFORCAgICAgIHI1LHIxMixyNSxMU1IgIzUKLSAgICBBTkQgICAgICByNCxyMTIscjQsTFNSICM1Ci0gICAgT1JSICAgICAgcjExLHIxMCxyMTEsTFNMICM4Ci0gICAgT1JSICAgICAgcjEwLHI0LHI1LExTTCAjOAotICAgIFBLSEJUICAgIHI0LHIxMCxyMTEsTFNMICMxNgotICAgIFNVQlMgICAgIGxyLGxyLCMxCi0gICAgU1RSICAgICAgcjQsW3I3XSwjOAotICAgIFBLSFRCICAgIHI1LHIxMSxyMTAsQVNSICMxNgotICAgIFNUUiAgICAgIHI1LFtyN10sIzQKLSAgICBCR1QgICAgICBMb29wU3RhcnQKLSAgICBTVUIgICAgICByMCxyNywjMHgxOAotICAgIE1PViAgICAgIHIxLCM0Ci0gICAgUE9QICAgICAge3I0LXI2LHBjfQotCi0gICAgLmVuZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmVfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlX3MuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdhYTkyNy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmVfcy5TCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qCi0gKgotICovCi0KLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKLQotICAgIC5hcm0KLSAgICAuZnB1IG5lb24KLSAgICAudGV4dAotCi0gICAgLmdsb2JhbCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmUKLWFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZToKLSAgICBQVVNIICAgICB7cjQtcjEyLGxyfQotICAgIFZMRDEuOCAgIHtkMCxkMX0sW3IwXSxyMQotICAgIFZNT1YuSTE2IGQzMSwjMHgxNAotICAgIFZNT1YuSTE2IGQzMCwjMHg1Ci0gICAgVkVYVC44ICAgZDQsZDAsZDEsIzEKLSAgICBWRVhULjggICBkMixkMCxkMSwjMgotICAgIFZFWFQuOCAgIGQzLGQwLGQxLCMzCi0gICAgVkVYVC44ICAgZDUsZDAsZDEsIzQKLSAgICBWRVhULjggICBkMSxkMCxkMSwjNQotICAgIFZBRERMLlU4IHExLGQyLGQzCi0gICAgVkFEREwuVTggcTIsZDQsZDUKLSAgICBWQURETC5VOCBxNSxkMCxkMQotICAgIFZMRDEuOCAgIHtkMCxkMX0sW3IwXSxyMQotICAgIFZNTEEuSTE2IGQxMCxkMixkMzEKLSAgICBWTVVMLkkxNiBkOCxkNCxkMzAKLSAgICBWRVhULjggICBkNCxkMCxkMSwjMQotICAgIFZFWFQuOCAgIGQyLGQwLGQxLCMyCi0gICAgVkVYVC44ICAgZDMsZDAsZDEsIzMKLSAgICBWRVhULjggICBkNSxkMCxkMSwjNAotICAgIFZFWFQuOCAgIGQxLGQwLGQxLCM1Ci0gICAgVkFEREwuVTggcTEsZDIsZDMKLSAgICBWQURETC5VOCBxMixkNCxkNQotICAgIFZBRERMLlU4IHE2LGQwLGQxCi0gICAgVkxEMS44ICAge2QwLGQxfSxbcjBdLHIxCi0gICAgVlNVQi5JMTYgZDEwLGQxMCxkOAotICAgIFZNTEEuSTE2IGQxMixkMixkMzEKLSAgICBWTVVMLkkxNiBkOCxkNCxkMzAKLSAgICBWRVhULjggICBkNCxkMCxkMSwjMQotICAgIFZFWFQuOCAgIGQyLGQwLGQxLCMyCi0gICAgVkVYVC44ICAgZDMsZDAsZDEsIzMKLSAgICBWRVhULjggICBkNSxkMCxkMSwjNAotICAgIFZFWFQuOCAgIGQxLGQwLGQxLCM1Ci0gICAgVkFEREwuVTggcTEsZDIsZDMKLSAgICBWQURETC5VOCBxMixkNCxkNQotICAgIFZBRERMLlU4IHE3LGQwLGQxCi0gICAgVkxEMS44ICAge2QwLGQxfSxbcjBdLHIxCi0gICAgVlNVQi5JMTYgZDEyLGQxMixkOAotICAgIFZNTEEuSTE2IGQxNCxkMixkMzEKLSAgICBWTVVMLkkxNiBkOCxkNCxkMzAKLSAgICBWRVhULjggICBkNCxkMCxkMSwjMQotICAgIFZFWFQuOCAgIGQyLGQwLGQxLCMyCi0gICAgVkVYVC44ICAgZDMsZDAsZDEsIzMKLSAgICBWRVhULjggICBkNSxkMCxkMSwjNAotICAgIFZFWFQuOCAgIGQxLGQwLGQxLCM1Ci0gICAgVkFEREwuVTggcTEsZDIsZDMKLSAgICBWQURETC5VOCBxMixkNCxkNQotICAgIFZBRERMLlU4IHE4LGQwLGQxCi0gICAgVkxEMS44ICAge2QwLGQxfSxbcjBdLHIxCi0gICAgVlNVQi5JMTYgZDE0LGQxNCxkOAotICAgIFZNTEEuSTE2IGQxNixkMixkMzEKLSAgICBWTVVMLkkxNiBkOCxkNCxkMzAKLSAgICBWRVhULjggICBkNCxkMCxkMSwjMQotICAgIFZFWFQuOCAgIGQyLGQwLGQxLCMyCi0gICAgVkVYVC44ICAgZDMsZDAsZDEsIzMKLSAgICBWRVhULjggICBkNSxkMCxkMSwjNAotICAgIFZFWFQuOCAgIGQxLGQwLGQxLCM1Ci0gICAgVkFEREwuVTggcTEsZDIsZDMKLSAgICBWQURETC5VOCBxMixkNCxkNQotICAgIFZBRERMLlU4IHE5LGQwLGQxCi0gICAgVkxEMS44ICAge2QwLGQxfSxbcjBdLHIxCi0gICAgVlNVQi5JMTYgZDE2LGQxNixkOAotICAgIFZNTEEuSTE2IGQxOCxkMixkMzEKLSAgICBWTVVMLkkxNiBkOCxkNCxkMzAKLSAgICBWRVhULjggICBkNCxkMCxkMSwjMQotICAgIFZFWFQuOCAgIGQyLGQwLGQxLCMyCi0gICAgVkVYVC44ICAgZDMsZDAsZDEsIzMKLSAgICBWRVhULjggICBkNSxkMCxkMSwjNAotICAgIFZFWFQuOCAgIGQxLGQwLGQxLCM1Ci0gICAgVkFEREwuVTggcTEsZDIsZDMKLSAgICBWQURETC5VOCBxMixkNCxkNQotICAgIFZBRERMLlU4IHExMCxkMCxkMQotICAgIFZMRDEuOCAgIHtkMCxkMX0sW3IwXSxyMQotICAgIFZTVUIuSTE2IGQxOCxkMTgsZDgKLSAgICBWTUxBLkkxNiBkMjAsZDIsZDMxCi0gICAgVk1VTC5JMTYgZDgsZDQsZDMwCi0gICAgVkVYVC44ICAgZDQsZDAsZDEsIzEKLSAgICBWRVhULjggICBkMixkMCxkMSwjMgotICAgIFZFWFQuOCAgIGQzLGQwLGQxLCMzCi0gICAgVkVYVC44ICAgZDUsZDAsZDEsIzQKLSAgICBWRVhULjggICBkMSxkMCxkMSwjNQotICAgIFZBRERMLlU4IHExLGQyLGQzCi0gICAgVkFEREwuVTggcTIsZDQsZDUKLSAgICBWQURETC5VOCBxMTEsZDAsZDEKLSAgICBWTEQxLjggICB7ZDAsZDF9LFtyMF0scjEKLSAgICBWU1VCLkkxNiBkMjAsZDIwLGQ4Ci0gICAgVk1MQS5JMTYgZDIyLGQyLGQzMQotICAgIFZNVUwuSTE2IGQ4LGQ0LGQzMAotICAgIFZFWFQuOCAgIGQ0LGQwLGQxLCMxCi0gICAgVkVYVC44ICAgZDIsZDAsZDEsIzIKLSAgICBWRVhULjggICBkMyxkMCxkMSwjMwotICAgIFZFWFQuOCAgIGQ1LGQwLGQxLCM0Ci0gICAgVkVYVC44ICAgZDEsZDAsZDEsIzUKLSAgICBWQURETC5VOCBxMSxkMixkMwotICAgIFZBRERMLlU4IHEyLGQ0LGQ1Ci0gICAgVkFEREwuVTggcTEyLGQwLGQxCi0gICAgVkxEMS44ICAge2QwLGQxfSxbcjBdLHIxCi0gICAgVlNVQi5JMTYgZDIyLGQyMixkOAotICAgIFZNTEEuSTE2IGQyNCxkMixkMzEKLSAgICBWTVVMLkkxNiBkOCxkNCxkMzAKLSAgICBWRVhULjggICBkNCxkMCxkMSwjMQotICAgIFZFWFQuOCAgIGQyLGQwLGQxLCMyCi0gICAgVkVYVC44ICAgZDMsZDAsZDEsIzMKLSAgICBWRVhULjggICBkNSxkMCxkMSwjNAotICAgIFZFWFQuOCAgIGQxLGQwLGQxLCM1Ci0gICAgVkFEREwuVTggcTEsZDIsZDMKLSAgICBWQURETC5VOCBxMixkNCxkNQotICAgIFZBRERMLlU4IHExMyxkMCxkMQotICAgIFZTVUIuSTE2IGQyNCxkMjQsZDgKLSAgICBWTUxBLkkxNiBkMjYsZDIsZDMxCi0gICAgVk1VTC5JMTYgZDgsZDQsZDMwCi0gICAgVk1PVi5JMzIgcTE1LCMweDE0Ci0gICAgVk1PVi5JMzIgcTE0LCMweDUKLSAgICBWQURETC5TMTYgcTUsZDEwLGQyMAotICAgIFZBRERMLlMxNiBxMSxkMTQsZDE2Ci0gICAgVkFEREwuUzE2IHEwLGQxMixkMTgKLSAgICBWU1VCLkkxNiBkMjYsZDI2LGQ4Ci0gICAgVk1MQS5JMzIgcTUscTEscTE1Ci0gICAgVk1VTC5JMzIgcTQscTAscTE0Ci0gICAgVkFEREwuUzE2IHE2LGQxMixkMjIKLSAgICBWQURETC5TMTYgcTEsZDE2LGQxOAotICAgIFZBRERMLlMxNiBxMCxkMTQsZDIwCi0gICAgVk1MQS5JMzIgcTYscTEscTE1Ci0gICAgVlNVQi5JMzIgcTUscTUscTQKLSAgICBWTVVMLkkzMiBxNCxxMCxxMTQKLSAgICBWQURETC5TMTYgcTIsZDE0LGQyNAotICAgIFZBRERMLlMxNiBxMSxkMTgsZDIwCi0gICAgVkFEREwuUzE2IHEwLGQxNixkMjIKLSAgICBWTUxBLkkzMiBxMixxMSxxMTUKLSAgICBWU1VCLkkzMiBxNixxNixxNAotICAgIFZNVUwuSTMyIHE0LHEwLHExNAotICAgIFZBRERMLlMxNiBxMyxkMTYsZDI2Ci0gICAgVkFEREwuUzE2IHExLGQyMCxkMjIKLSAgICBWQURETC5TMTYgcTAsZDE4LGQyNAotICAgIFZNTEEuSTMyIHEzLHExLHExNQotICAgIFZTVUIuSTMyIHEyLHEyLHE0Ci0gICAgVk1MUy5JMzIgcTMscTAscTE0Ci0gICAgVlFSU0hSVU4uUzMyIGQwLHE1LCMxMAotICAgIFZRUlNIUlVOLlMzMiBkMixxNiwjMTAKLSAgICBWUVJTSFJVTi5TMzIgZDQscTIsIzEwCi0gICAgVlFSU0hSVU4uUzMyIGQ2LHEzLCMxMAotICAgIFZRTU9WTi5VMTYgZDAscTAKLSAgICBWUU1PVk4uVTE2IGQyLHExCi0gICAgVlFNT1ZOLlUxNiBkNCxxMgotICAgIFZRTU9WTi5VMTYgZDYscTMKLSAgICBQT1AgICAgICB7cjQtcjEyLHBjfQotCi0gICAgLmVuZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmVfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlX3MuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVmN2YxYy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmVfcy5TCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qCi0gKgotICovCi0KLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKLQotICAgIC5hcm0KLSAgICAuZnB1IG5lb24KLSAgICAudGV4dAotCi0gICAgLmdsb2JhbCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmUKLWFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZToKLSAgICBQVVNIICAgICB7cjQtcjEyLGxyfQotICAgIFZMRDEuOCAgIHtkMCxkMX0sW3IwXSxyMQotICAgIEFERCAgICAgIHIxMixyMCxyMSxMU0wgIzIKLSAgICBWTU9WLkk4ICBkMzAsIzB4NQotICAgIFZNT1YuSTggIGQzMSwjMHgxNAotICAgIFZMRDEuOCAgIHtkMTAsZDExfSxbcjEyXSxyMQotICAgIFZMRDEuOCAgIHtkMixkM30sW3IwXSxyMQotICAgIFZMRDEuOCAgIHtkMTIsZDEzfSxbcjEyXSxyMQotICAgIFZBRERMLlU4IHE5LGQwLGQxMAotICAgIFZMRDEuOCAgIHtkNCxkNX0sW3IwXSxyMQotICAgIFZBRERMLlU4IHEwLGQxLGQxMQotICAgIFZMRDEuOCAgIHtkNixkN30sW3IwXSxyMQotICAgIFZBRERMLlU4IHExMCxkMixkMTIKLSAgICBWTEQxLjggICB7ZDgsZDl9LFtyMF0scjEKLSAgICBWTUxBTC5VOCBxOSxkNCxkMzEKLSAgICBWTEQxLjggICB7ZDE0LGQxNX0sW3IxMl0scjEKLSAgICBWTUxBTC5VOCBxMCxkNSxkMzEKLSAgICBWTEQxLjggICB7ZDE2LGQxN30sW3IxMl0scjEKLSAgICBWTUxBTC5VOCBxOSxkNixkMzEKLSAgICBWTUxBTC5VOCBxMTAsZDYsZDMxCi0gICAgVk1MU0wuVTggcTAsZDMsZDMwCi0gICAgVkFEREwuVTggcTExLGQ0LGQxNAotICAgIFZNTFNMLlU4IHE5LGQyLGQzMAotICAgIFZBRERMLlU4IHExLGQzLGQxMwotICAgIFZNTEFMLlU4IHEwLGQ3LGQzMQotICAgIFZNTEFMLlU4IHExMCxkOCxkMzEKLSAgICBWTUxTTC5VOCBxOSxkOCxkMzAKLSAgICBWTUxBTC5VOCBxMSxkNyxkMzEKLSAgICBWTUxTTC5VOCBxMCxkOSxkMzAKLSAgICBWTUxBTC5VOCBxMTEsZDgsZDMxCi0gICAgVk1MU0wuVTggcTEwLGQ0LGQzMAotICAgIFZNTFNMLlU4IHExLGQ1LGQzMAotICAgIFZBRERMLlU4IHEyLGQ1LGQxNQotICAgIFZNTEFMLlU4IHExMSxkMTAsZDMxCi0gICAgVk1MU0wuVTggcTEwLGQxMCxkMzAKLSAgICBWTUxBTC5VOCBxMSxkOSxkMzEKLSAgICBWTUxBTC5VOCBxMixkOSxkMzEKLSAgICBWQURETC5VOCBxMTIsZDYsZDE2Ci0gICAgVk1MU0wuVTggcTExLGQ2LGQzMAotICAgIFZNTFNMLlU4IHExLGQxMSxkMzAKLSAgICBWTUxTTC5VOCBxMixkNyxkMzAKLSAgICBWQURETC5VOCBxMyxkNyxkMTcKLSAgICBWTUxBTC5VOCBxMTIsZDEwLGQzMQotICAgIFZNTFNMLlU4IHExMSxkMTIsZDMwCi0gICAgVk1MU0wuVTggcTIsZDEzLGQzMAotICAgIFZNTEFMLlU4IHEzLGQxMSxkMzEKLSAgICBWTUxBTC5VOCBxMTIsZDEyLGQzMQotICAgIFZFWFQuOCAgIGQyNixkMTgsZDE5LCMyCi0gICAgVk1MQUwuVTggcTIsZDExLGQzMQotICAgIFZNTEFMLlU4IHEzLGQxMyxkMzEKLSAgICBWTUxTTC5VOCBxMTIsZDgsZDMwCi0gICAgVkVYVC44ICAgZDI3LGQxOCxkMTksIzQKLSAgICBWTU9WLkkxNiBkMzEsIzB4MTQKLSAgICBWTUxTTC5VOCBxMyxkOSxkMzAKLSAgICBWTUxTTC5VOCBxMTIsZDE0LGQzMAotICAgIFZFWFQuOCAgIGQyOSxkMTksZDAsIzIKLSAgICBWRVhULjggICBkMjgsZDE4LGQxOSwjNgotICAgIFZNTFNMLlU4IHEzLGQxNSxkMzAKLSAgICBWQURETC5TMTYgcTAsZDE4LGQyOQotICAgIFZBREQuSTE2IGQyNyxkMjcsZDI4Ci0gICAgVk1PVi5JMTYgZDMwLCMweDUKLSAgICBWQURELkkxNiBkMjYsZDI2LGQxOQotICAgIFZNTEFMLlMxNiBxMCxkMjcsZDMxCi0gICAgVkVYVC44ICAgZDI3LGQyMCxkMjEsIzQKLSAgICBWRVhULjggICBkMjgsZDIwLGQyMSwjNgotICAgIFZFWFQuOCAgIGQyOSxkMjEsZDIsIzIKLSAgICBWTUxTTC5TMTYgcTAsZDI2LGQzMAotICAgIFZFWFQuOCAgIGQyNixkMjAsZDIxLCMyCi0gICAgVkFEREwuUzE2IHExLGQyMCxkMjkKLSAgICBWQURELkkxNiBkMjcsZDI3LGQyOAotICAgIFZBREQuSTE2IGQyNixkMjYsZDIxCi0gICAgVkVYVC44ICAgZDI4LGQyMixkMjMsIzYKLSAgICBWTUxBTC5TMTYgcTEsZDI3LGQzMQotICAgIFZFWFQuOCAgIGQyOSxkMjMsZDQsIzIKLSAgICBWRVhULjggICBkMjcsZDIyLGQyMywjNAotICAgIFZFWFQuOCAgIGQ4LGQyMixkMjMsIzIKLSAgICBWQURETC5TMTYgcTIsZDIyLGQyOQotICAgIFZNTFNMLlMxNiBxMSxkMjYsZDMwCi0gICAgVkFERC5JMTYgZDI3LGQyNyxkMjgKLSAgICBWQURELkkxNiBkMjYsZDgsZDIzCi0gICAgVkVYVC44ICAgZDI4LGQyNCxkMjUsIzYKLSAgICBWTUxBTC5TMTYgcTIsZDI3LGQzMQotICAgIFZFWFQuOCAgIGQyNyxkMjQsZDI1LCM0Ci0gICAgVkVYVC44ICAgZDI5LGQyNSxkNiwjMgotICAgIFZBREQuSTE2IGQyNyxkMjcsZDI4Ci0gICAgVkVYVC44ICAgZDgsZDI0LGQyNSwjMgotICAgIFZBRERMLlMxNiBxMyxkMjQsZDI5Ci0gICAgVk1MU0wuUzE2IHEyLGQyNixkMzAKLSAgICBWTUxBTC5TMTYgcTMsZDI3LGQzMQotICAgIFZBREQuSTE2IGQ4LGQ4LGQyNQotICAgIFZNTFNMLlMxNiBxMyxkOCxkMzAKLSAgICBWUVJTSFJVTi5TMzIgZDAscTAsIzEwCi0gICAgVlFSU0hSVU4uUzMyIGQyLHExLCMxMAotICAgIFZRUlNIUlVOLlMzMiBkNCxxMiwjMTAKLSAgICBWUVJTSFJVTi5TMzIgZDYscTMsIzEwCi0gICAgVlFNT1ZOLlUxNiBkMCxxMAotICAgIFZRTU9WTi5VMTYgZDIscTEKLSAgICBWUU1PVk4uVTE2IGQ0LHEyCi0gICAgVlFNT1ZOLlUxNiBkNixxMwotICAgIFBPUCAgICAgIHtyNC1yMTIscGN9Ci0KLSAgICAuZW5kCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlX3MuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkzZDM4NS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZV9zLlMKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKgotICoKLSAqLwotCi0gICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCi0gICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCi0KLSAgICAuYXJtCi0gICAgLmZwdSBuZW9uCi0gICAgLnRleHQKLQotICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUKLWFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlOgotICAgIFBVU0ggICAgIHtyNC1yMTIsbHJ9Ci0gICAgVkxEMS44ICAge2QyMixkMjN9LFtyMF0scjEKLSAgICBWRVhULjggICBkMTAsZDIyLGQyMywjNQotICAgIFZFWFQuOCAgIGQxMixkMjIsZDIzLCMxCi0gICAgVkVYVC44ICAgZDE0LGQyMixkMjMsIzIKLSAgICBWRVhULjggICBkMTUsZDIyLGQyMywjMwotICAgIFZFWFQuOCAgIGQxMyxkMjIsZDIzLCM0Ci0gICAgVkFEREwuVTggcTExLGQyMixkMTAKLSAgICBWQURETC5VOCBxNCxkMTQsZDE1Ci0gICAgVkFEREwuVTggcTYsZDEyLGQxMwotICAgIFZMRDEuOCAgIHtkMjQsZDI1fSxbcjBdLHIxCi0gICAgVk1MQS5JMTYgZDIyLGQ4LGQzMQotICAgIFZNVUwuSTE2IGQ4LGQxMixkMzAKLSAgICBWRVhULjggICBkMTAsZDI0LGQyNSwjNQotICAgIFZFWFQuOCAgIGQxMixkMjQsZDI1LCMxCi0gICAgVkVYVC44ICAgZDE2LGQyNCxkMjUsIzIKLSAgICBWRVhULjggICBkMTcsZDI0LGQyNSwjMwotICAgIFZFWFQuOCAgIGQxMyxkMjQsZDI1LCM0Ci0gICAgVkFEREwuVTggcTEyLGQyNCxkMTAKLSAgICBWU1VCLkkxNiBkMjIsZDIyLGQ4Ci0gICAgVkFEREwuVTggcTQsZDE2LGQxNwotICAgIFZBRERMLlU4IHE2LGQxMixkMTMKLSAgICBWTEQxLjggICB7ZDI2LGQyN30sW3IwXSxyMQotICAgIFZNTEEuSTE2IGQyNCxkOCxkMzEKLSAgICBWTVVMLkkxNiBkOCxkMTIsZDMwCi0gICAgVkVYVC44ICAgZDEwLGQyNixkMjcsIzUKLSAgICBWRVhULjggICBkMTIsZDI2LGQyNywjMQotICAgIFZFWFQuOCAgIGQxOCxkMjYsZDI3LCMyCi0gICAgVkVYVC44ICAgZDE5LGQyNixkMjcsIzMKLSAgICBWRVhULjggICBkMTMsZDI2LGQyNywjNAotICAgIFZBRERMLlU4IHExMyxkMjYsZDEwCi0gICAgVlNVQi5JMTYgZDI0LGQyNCxkOAotICAgIFZBRERMLlU4IHE0LGQxOCxkMTkKLSAgICBWQURETC5VOCBxNixkMTIsZDEzCi0gICAgVkxEMS44ICAge2QyOCxkMjl9LFtyMF0scjEKLSAgICBWTUxBLkkxNiBkMjYsZDgsZDMxCi0gICAgVk1VTC5JMTYgZDgsZDEyLGQzMAotICAgIFZFWFQuOCAgIGQxMCxkMjgsZDI5LCM1Ci0gICAgVkVYVC44ICAgZDEyLGQyOCxkMjksIzEKLSAgICBWRVhULjggICBkMjAsZDI4LGQyOSwjMgotICAgIFZFWFQuOCAgIGQyMSxkMjgsZDI5LCMzCi0gICAgVkVYVC44ICAgZDEzLGQyOCxkMjksIzQKLSAgICBWQURETC5VOCBxMTQsZDI4LGQxMAotICAgIFZTVUIuSTE2IGQyNixkMjYsZDgKLSAgICBWQURETC5VOCBxNCxkMjAsZDIxCi0gICAgVkFEREwuVTggcTYsZDEyLGQxMwotICAgIFZNTEEuSTE2IGQyOCxkOCxkMzEKLSAgICBWTUxTLkkxNiBkMjgsZDEyLGQzMAotICAgIFZRUlNIUlVOLlMxNiBkMjIscTExLCM1Ci0gICAgVlFSU0hSVU4uUzE2IGQyNCxxMTIsIzUKLSAgICBWUVJTSFJVTi5TMTYgZDI2LHExMywjNQotICAgIFZRUlNIUlVOLlMxNiBkMjgscTE0LCM1Ci0gICAgUE9QICAgICAge3I0LXIxMixwY30KLQotICAgIC5lbmQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmVfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmVfcy5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OThlN2I1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlX3MuUworKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qCi0gKgotICovCi0KLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKLQotICAgIC5hcm0KLSAgICAuZnB1IG5lb24KLSAgICAudGV4dAotCi0gICAgLmdsb2JhbCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZQotYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmU6Ci0gICAgUFVTSCAgICAge3I0LXIxMixscn0KLSAgICBWTEQxLjggICB7ZDd9LFtyMF0scjEKLSAgICBBREQgICAgICByMTIscjAscjEsTFNMICMyCi0gICAgVkxEMS44ICAge2Q4fSxbcjBdLHIxCi0gICAgVkxEMS44ICAge2QxMn0sW3IxMl0scjEKLSAgICBWTEQxLjggICB7ZDl9LFtyMF0scjEKLSAgICBWQURETC5VOCBxMCxkNyxkMTIKLSAgICBWTEQxLjggICB7ZDEwfSxbcjBdLHIxCi0gICAgVkxEMS44ICAge2QxM30sW3IxMl0scjEKLSAgICBWTEQxLjggICB7ZDExfSxbcjBdLHIxCi0gICAgVkxEMS44ICAge2QxNH0sW3IxMl0scjEKLSAgICBWQURETC5VOCBxOCxkOCxkMTEKLSAgICBWQURETC5VOCBxOSxkOSxkMTAKLSAgICBWTEQxLjggICB7ZDE1fSxbcjEyXSxyMQotICAgIFZNTFMuSTE2IGQwLGQxNixkMzAKLSAgICBWTVVMLkkxNiBkMjAsZDE4LGQzMQotICAgIFZBRERMLlU4IHE4LGQ5LGQxMgotICAgIFZBRERMLlU4IHE5LGQxMCxkMTEKLSAgICBWQURETC5VOCBxMSxkOCxkMTMKLSAgICBWTUxTLkkxNiBkMixkMTYsZDMwCi0gICAgVk1VTC5JMTYgZDIxLGQxOCxkMzEKLSAgICBWQURETC5VOCBxOCxkMTAsZDEzCi0gICAgVkFEREwuVTggcTksZDExLGQxMgotICAgIFZBRERMLlU4IHEyLGQ5LGQxNAotICAgIFZNTFMuSTE2IGQ0LGQxNixkMzAKLSAgICBWTVVMLkkxNiBkMjIsZDE4LGQzMQotICAgIFZBRERMLlU4IHE4LGQxMSxkMTQKLSAgICBWQURETC5VOCBxMyxkMTAsZDE1Ci0gICAgVkFEREwuVTggcTksZDEyLGQxMwotICAgIFZNTFMuSTE2IGQ2LGQxNixkMzAKLSAgICBWQURELkkxNiBkMCxkMCxkMjAKLSAgICBWQURELkkxNiBkMixkMixkMjEKLSAgICBWQURELkkxNiBkNCxkNCxkMjIKLSAgICBWTUxBLkkxNiBkNixkMTgsZDMxCi0gICAgVlFSU0hSVU4uUzE2IGQwLHEwLCM1Ci0gICAgVlFSU0hSVU4uUzE2IGQyLHExLCM1Ci0gICAgVlFSU0hSVU4uUzE2IGQ0LHEyLCM1Ci0gICAgVlFSU0hSVU4uUzE2IGQ2LHEzLCM1Ci0gICAgUE9QICAgICAge3I0LXIxMixwY30KLQotICAgIC5lbmQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWFfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWFfcy5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDY5NTE2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX3MuUworKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKgotICoKLSAqLwotCi0gICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCi0gICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCi0KLSAgICAuYXJtCi0gICAgLmZwdSBuZW9uCi0KLSAgICAudGV4dAotICAgIC5hbGlnbiA0Ci0KLWFybVZDTTRQMTBfV2lkdGhCcmFuY2hUYWJsZU1WSXNOb3RaZXJvOgotICAgIC53b3JkICAgV2lkdGhJczJNVklzTm90WmVyby0oUDArOCksIFdpZHRoSXMyTVZJc05vdFplcm8tKFAwKzgpCi0gICAgLndvcmQgICBXaWR0aElzNE1WSXNOb3RaZXJvLShQMCs4KSwgV2lkdGhJczRNVklzTm90WmVyby0oUDArOCkKLSAgICAud29yZCAgIFdpZHRoSXM4TVZJc05vdFplcm8tKFAwKzgpCi0KLWFybVZDTTRQMTBfV2lkdGhCcmFuY2hUYWJsZU1WSXNaZXJvOgotICAgIC53b3JkICAgV2lkdGhJczJNVklzWmVyby0oUDArOCksIFdpZHRoSXMyTVZJc1plcm8tKFAwKzgpCi0gICAgLndvcmQgICBXaWR0aElzNE1WSXNaZXJvLShQMCs4KSwgV2lkdGhJczRNVklzWmVyby0oUDArOCkKLSAgICAud29yZCAgIFdpZHRoSXM4TVZJc1plcm8tKFAwKzgpCi0KLSAgICAuZ2xvYmFsIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hCi1hcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYToKLSAgICBQVVNIICAgICB7cjQtcjEyLGxyfQotICAgIFZQVVNIICAgIHtkOC1kMTV9Ci0gICAgTERSRCAgICAgcjYscjcsW3NwLCMweDcwXQotICAgIExEUkQgICAgIHI0LHI1LFtzcCwjMHg2OF0KLSAgICBSU0IgICAgICByOCxyNiwjOAotICAgIFJTQiAgICAgIHI5LHI3LCM4Ci0gICAgQ01OICAgICAgcjYscjcKLSAgICBNT1YgICAgICByMTAsIzEKLSAgICBBRFJFUSAgICByMTEsIGFybVZDTTRQMTBfV2lkdGhCcmFuY2hUYWJsZU1WSXNaZXJvCi0gICAgU1VCICAgICAgbHIscjEscjEwCi0gICAgQURSTkUgICAgcjExLCBhcm1WQ000UDEwX1dpZHRoQnJhbmNoVGFibGVNVklzTm90WmVybwotICAgIFZMRDEuOCAgIHtkMH0sW3IwXSxyMTAKLSAgICBTTVVMQkIgICByMTIscjgscjkKLSAgICBTTVVMQkIgICByOSxyNixyOQotICAgIFZMRDEuOCAgIHtkMX0sW3IwXSxscgotICAgIFNNVUxCQiAgIHI4LHI4LHI3Ci0gICAgU01VTEJCICAgcjYscjYscjcKLSAgICBWRFVQLjggICBkMTIscjEyCi0gICAgVkRVUC44ICAgZDEzLHI5Ci0gICAgVkRVUC44ICAgZDE0LHI4Ci0gICAgVkRVUC44ICAgZDE1LHI2Ci0gICAgTERSICAgICAgcjExLFtyMTEsIHI0LCBsc2wgIzFdCi1QMDogQUREICAgICAgcGMscjExCi0KLVdpZHRoSXM4TVZJc05vdFplcm86Ci0gICAgVkxEMS44ICAge2QyfSxbcjBdLHIxMAotICAgIFZNVUxMLlU4IHEyLGQwLGQxMgotICAgIFZMRDEuOCAgIHtkM30sW3IwXSxscgotICAgIFZNVUxMLlU4IHEzLGQyLGQxMgotICAgIFZMRDEuOCAgIHtkMTZ9LFtyMF0scjEwCi0gICAgVk1MQUwuVTggcTIsZDEsZDEzCi0gICAgVkxEMS44ICAge2QxN30sW3IwXSxscgotICAgIFZNVUxMLlU4IHExMSxkMTYsZDEyCi0gICAgVk1MQUwuVTggcTMsZDMsZDEzCi0gICAgVkxEMS44ICAge2QxOH0sW3IwXSxyMTAKLSAgICBWTUxBTC5VOCBxMixkMixkMTQKLSAgICBWTUxBTC5VOCBxMTEsZDE3LGQxMwotICAgIFZNVUxMLlU4IHExMixkMTgsZDEyCi0gICAgVkxEMS44ICAge2QxOX0sW3IwXSxscgotICAgIFZNTEFMLlU4IHEzLGQxNixkMTQKLSAgICBWTEQxLjggICB7ZDB9LFtyMF0scjEwCi0gICAgVk1MQUwuVTggcTEyLGQxOSxkMTMKLSAgICBWTUxBTC5VOCBxMTEsZDE4LGQxNAotICAgIFZNTEFMLlU4IHEyLGQzLGQxNQotICAgIFZMRDEuOCAgIHtkMX0sW3IwXSxscgotICAgIFZNTEFMLlU4IHExMixkMCxkMTQKLSAgICBWTUxBTC5VOCBxMyxkMTcsZDE1Ci0gICAgVk1MQUwuVTggcTExLGQxOSxkMTUKLSAgICBTVUJTICAgICByNSxyNSwjNAotICAgIFZNTEFMLlU4IHExMixkMSxkMTUKLSAgICBWUVJTSFJOLlUxNiBkOCxxMiwjNgotICAgIFZRUlNIUk4uVTE2IGQ5LHEzLCM2Ci0gICAgVlFSU0hSTi5VMTYgZDIwLHExMSwjNgotICAgIFZTVDEuNjQgIHtkOH0sW3IyXSxyMwotICAgIFZRUlNIUk4uVTE2IGQyMSxxMTIsIzYKLSAgICBWU1QxLjY0ICB7ZDl9LFtyMl0scjMKLSAgICBWU1QxLjY0ICB7ZDIwfSxbcjJdLHIzCi0gICAgVlNUMS42NCAge2QyMX0sW3IyXSxyMwotICAgIEJHVCAgICAgIFdpZHRoSXM4TVZJc05vdFplcm8KLSAgICBNT1YgICAgICByMCwjMAotICAgIFZQT1AgICAgIHtkOC1kMTV9Ci0gICAgUE9QICAgICAge3I0LXIxMixwY30KLQotV2lkdGhJczRNVklzTm90WmVybzoKLSAgICBWTEQxLjggICB7ZDJ9LFtyMF0scjEwCi0gICAgVk1VTEwuVTggcTIsZDAsZDEyCi0gICAgVk1VTEwuVTggcTMsZDIsZDEyCi0gICAgVkxEMS44ICAge2QzfSxbcjBdLGxyCi0gICAgVk1MQUwuVTggcTIsZDEsZDEzCi0gICAgVk1MQUwuVTggcTMsZDMsZDEzCi0gICAgVkxEMS44ICAge2QwfSxbcjBdLHIxMAotICAgIFZNTEFMLlU4IHEyLGQyLGQxNAotICAgIFZNTEFMLlU4IHEzLGQwLGQxNAotICAgIFZMRDEuOCAgIHtkMX0sW3IwXSxscgotICAgIFNVQlMgICAgIHI1LHI1LCMyCi0gICAgVk1MQUwuVTggcTMsZDEsZDE1Ci0gICAgVk1MQUwuVTggcTIsZDMsZDE1Ci0gICAgVlFSU0hSTi5VMTYgZDkscTMsIzYKLSAgICBWUVJTSFJOLlUxNiBkOCxxMiwjNgotICAgIFZTVDEuMzIgIHtkOFswXX0sW3IyXSxyMwotICAgIFZTVDEuMzIgIHtkOVswXX0sW3IyXSxyMwotICAgIEJHVCAgICAgIFdpZHRoSXM0TVZJc05vdFplcm8KLSAgICBNT1YgICAgICByMCwjMAotICAgIFZQT1AgICAgIHtkOC1kMTV9Ci0gICAgUE9QICAgICAge3I0LXIxMixwY30KLQotV2lkdGhJczJNVklzTm90WmVybzoKLSAgICBWTEQxLjggICB7ZDJ9LFtyMF0scjEwCi0gICAgVk1VTEwuVTggcTIsZDAsZDEyCi0gICAgVk1VTEwuVTggcTMsZDIsZDEyCi0gICAgVkxEMS44ICAge2QzfSxbcjBdLGxyCi0gICAgVk1MQUwuVTggcTIsZDEsZDEzCi0gICAgVk1MQUwuVTggcTMsZDMsZDEzCi0gICAgVkxEMS44ICAge2QwfSxbcjBdLHIxMAotICAgIFZNTEFMLlU4IHEyLGQyLGQxNAotICAgIFZNTEFMLlU4IHEzLGQwLGQxNAotICAgIFZMRDEuOCAgIHtkMX0sW3IwXSxscgotICAgIFNVQlMgICAgIHI1LHI1LCMyCi0gICAgVk1MQUwuVTggcTMsZDEsZDE1Ci0gICAgVk1MQUwuVTggcTIsZDMsZDE1Ci0gICAgVlFSU0hSTi5VMTYgZDkscTMsIzYKLSAgICBWUVJTSFJOLlUxNiBkOCxxMiwjNgotICAgIFZTVDEuMTYgIHtkOFswXX0sW3IyXSxyMwotICAgIFZTVDEuMTYgIHtkOVswXX0sW3IyXSxyMwotICAgIEJHVCAgICAgIFdpZHRoSXMyTVZJc05vdFplcm8KLSAgICBNT1YgICAgICByMCwjMAotICAgIFZQT1AgICAgIHtkOC1kMTV9Ci0gICAgUE9QICAgICAge3I0LXIxMixwY30KLQotV2lkdGhJczhNVklzWmVybzoKLSAgICBTVUIgICAgICByMCxyMCxyMQotV2lkdGhJczhMb29wTVZJc1plcm86Ci0gICAgVkxEMS44ICAge2QwfSxbcjBdLHIxCi0gICAgU1VCUyAgICAgcjUscjUsIzIKLSAgICBWTEQxLjggICB7ZDF9LFtyMF0scjEKLSAgICBWU1QxLjY0ICB7ZDB9LFtyMl0scjMKLSAgICBWU1QxLjY0ICB7ZDF9LFtyMl0scjMKLSAgICBCR1QgICAgICBXaWR0aElzOExvb3BNVklzWmVybwotICAgIE1PViAgICAgIHIwLCMwCi0gICAgVlBPUCAgICAge2Q4LWQxNX0KLSAgICBQT1AgICAgICB7cjQtcjEyLHBjfQotCi1XaWR0aElzNE1WSXNaZXJvOgotICAgIFZMRDEuOCAgIHtkMX0sW3IwXSxyMQotICAgIFNVQlMgICAgIHI1LHI1LCMyCi0gICAgVlNUMS4zMiAge2QwWzBdfSxbcjJdLHIzCi0gICAgVkxEMS44ICAge2QwfSxbcjBdLHIxCi0gICAgVlNUMS4zMiAge2QxWzBdfSxbcjJdLHIzCi0gICAgQkdUICAgICAgV2lkdGhJczRNVklzWmVybwotICAgIE1PViAgICAgIHIwLCMwCi0gICAgVlBPUCAgICAge2Q4LWQxNX0KLSAgICBQT1AgICAgICB7cjQtcjEyLHBjfQotCi1XaWR0aElzMk1WSXNaZXJvOgotICAgIFZMRDEuOCAgIHtkMX0sW3IwXSxyMQotICAgIFNVQlMgICAgIHI1LHI1LCMyCi0gICAgVlNUMS4xNiAge2QwWzBdfSxbcjJdLHIzCi0gICAgVkxEMS44ICAge2QwfSxbcjBdLHIxCi0gICAgVlNUMS4xNiAge2QxWzBdfSxbcjJdLHIzCi0gICAgQkdUICAgICAgV2lkdGhJczJNVklzWmVybwotICAgIE1PViAgICAgIHIwLCMwCi0gICAgVlBPUCAgICAge2Q4LWQxNX0KLSAgICBQT1AgICAgICB7cjQtcjEyLHBjfQotCi0gICAgLmVuZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX1F1YW50VGFibGVzX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfUXVhbnRUYWJsZXNfcy5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGU2MDEwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfUXVhbnRUYWJsZXNfcy5TCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLS8qCi0gKgotICovCi0KLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKLQotICAgIC5hcm0KLSAgICAuZnB1IG5lb24KLSAgICAuc2VjdGlvbiAucm9kYXRhCi0gICAgLmFsaWduIDQKLQotICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9NRk1hdHJpeFFQTW9kVGFibGUKLSAgICAuZ2xvYmFsIGFybVZDTTRQMTBfUVBEaXZJbnRyYVRhYmxlCi0gICAgLmdsb2JhbCBhcm1WQ000UDEwX1FQRGl2UGx1c09uZVRhYmxlCi0KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIFRoaXMgdGFibGUgY29udGFpbnMgKDEgPDwgUWJpdHNQbHVzT25lKSAvIDMgVmFsdWVzIChJbnRyYSBjYXNlKSAsCi07Ly8gZm9yIHZhbHVlcyBvZiBpUVAgZnJvbSAwIHRvIDUxIChpbmNsdXNpdmUpLgotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotYXJtVkNNNFAxMF9RUERpdkludHJhVGFibGU6Ci0gICAgLndvcmQgMjE4NDUsIDIxODQ1LCAyMTg0NSwgMjE4NDUsIDIxODQ1LCAyMTg0NQotICAgIC53b3JkIDQzNjkwLCA0MzY5MCwgNDM2OTAsIDQzNjkwLCA0MzY5MCwgNDM2OTAKLSAgICAud29yZCA4NzM4MSwgODczODEsIDg3MzgxLCA4NzM4MSwgODczODEsIDg3MzgxCi0gICAgLndvcmQgMTc0NzYyLCAxNzQ3NjIsIDE3NDc2MiwgMTc0NzYyLCAxNzQ3NjIsIDE3NDc2MgotICAgIC53b3JkIDM0OTUyNSwgMzQ5NTI1LCAzNDk1MjUsIDM0OTUyNSwgMzQ5NTI1LCAzNDk1MjUKLSAgICAud29yZCA2OTkwNTAsIDY5OTA1MCwgNjk5MDUwLCA2OTkwNTAsIDY5OTA1MCwgNjk5MDUwCi0gICAgLndvcmQgMTM5ODEwMSwgMTM5ODEwMSwgMTM5ODEwMSwgMTM5ODEwMSwgMTM5ODEwMSwgMTM5ODEwMQotICAgIC53b3JkIDI3OTYyMDIsIDI3OTYyMDIsIDI3OTYyMDIsIDI3OTYyMDIsIDI3OTYyMDIsIDI3OTYyMDIKLQotCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIFRoaXMgdGFibGUgY29udGFpbnMgYXJtVkNNNFAxMF9NRk1hdHJpeCBbaVFQICUgNl1bMF0gZW50aXJlcywKLTsvLyBmb3IgdmFsdWVzIG9mIGlRUCBmcm9tIDAgdG8gNTEgKGluY2x1c2l2ZSkuCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1hcm1WQ000UDEwX01GTWF0cml4UVBNb2RUYWJsZToKLSAgICAuaHdvcmQgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgotICAgIC5od29yZCAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCi0gICAgLmh3b3JkIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKLSAgICAuaHdvcmQgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgotICAgIC5od29yZCAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCi0gICAgLmh3b3JkIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKLSAgICAuaHdvcmQgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgotICAgIC5od29yZCAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCi0gICAgLmh3b3JkIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKLQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gVGhpcyB0YWJsZSBjb250YWlucyBBUk1fTTRQMTBfUV9PRkZTRVQgKyAxICsgKGlRUCAvIDYpIHZhbHVlcywKLTsvLyBmb3IgdmFsdWVzIG9mIGlRUCBmcm9tIDAgdG8gNTEgKGluY2x1c2l2ZSkuCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotYXJtVkNNNFAxMF9RUERpdlBsdXNPbmVUYWJsZToKLSAgICAuYnl0ZSAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2Ci0gICAgLmJ5dGUgMTcsIDE3LCAxNywgMTcsIDE3LCAxNwotICAgIC5ieXRlIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgKLSAgICAuYnl0ZSAxOSwgMTksIDE5LCAxOSwgMTksIDE5Ci0gICAgLmJ5dGUgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMAotICAgIC5ieXRlIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEKLSAgICAuYnl0ZSAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyCi0gICAgLmJ5dGUgMjMsIDIzLCAyMywgMjMsIDIzLCAyMwotICAgIC5ieXRlIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQKLQotICAgIC5lbmQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NF9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0X3MuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE4YmVjNy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0X3MuUworKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qCi0gKgotICovCi0KLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKLQotICAgIC5hcm0KLSAgICAuZnB1IG5lb24KLSAgICAudGV4dAotCi0gICAgLmdsb2JhbCBhcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0Ci1hcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0OgotICAgIFZQVVNIICAgIHtkOH0KLSAgICBWTEQ0LjE2ICB7ZDAsZDEsZDIsZDN9LFtyMV0KLSAgICBWTU9WLkkxNiBkNCwjMAotICAgIFZBREQuSTE2IGQ1LGQwLGQyCi0gICAgVlNVQi5JMTYgZDYsZDAsZDIKLSAgICBWSEFERC5TMTYgZDcsZDEsZDQKLSAgICBWSEFERC5TMTYgZDgsZDMsZDQKLSAgICBWU1VCLkkxNiBkNyxkNyxkMwotICAgIFZBREQuSTE2IGQ4LGQxLGQ4Ci0gICAgVkFERC5JMTYgZDAsZDUsZDgKLSAgICBWQURELkkxNiBkMSxkNixkNwotICAgIFZTVUIuSTE2IGQyLGQ2LGQ3Ci0gICAgVlNVQi5JMTYgZDMsZDUsZDgKLSAgICBWVFJOLjE2ICBkMCxkMQotICAgIFZUUk4uMTYgIGQyLGQzCi0gICAgVlRSTi4zMiAgcTAscTEKLSAgICBWQURELkkxNiBkNSxkMCxkMgotICAgIFZTVUIuSTE2IGQ2LGQwLGQyCi0gICAgVkhBREQuUzE2IGQ3LGQxLGQ0Ci0gICAgVkhBREQuUzE2IGQ4LGQzLGQ0Ci0gICAgVlNVQi5JMTYgZDcsZDcsZDMKLSAgICBWQURELkkxNiBkOCxkMSxkOAotICAgIFZBREQuSTE2IGQwLGQ1LGQ4Ci0gICAgVkFERC5JMTYgZDEsZDYsZDcKLSAgICBWU1VCLkkxNiBkMixkNixkNwotICAgIFZTVUIuSTE2IGQzLGQ1LGQ4Ci0gICAgVlJTSFIuUzE2IGQwLGQwLCM2Ci0gICAgVlJTSFIuUzE2IGQxLGQxLCM2Ci0gICAgVlJTSFIuUzE2IGQyLGQyLCM2Ci0gICAgVlJTSFIuUzE2IGQzLGQzLCM2Ci0gICAgVlNUMS4xNiAge2QwLGQxLGQyLGQzfSxbcjBdCi0gICAgVlBPUCAgICAge2Q4fQotICAgIEJYICAgICAgIGxyCi0KLSAgICAuZW5kCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDRfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NF9zLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5N2VmY2IuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NF9zLlMKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKgotICoKLSAqLwotCi0gICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCi0gICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCi0KLSAgICAuYXJtCi0gICAgLmZwdSBuZW9uCi0gICAgLnRleHQKLSAgICAuc3ludGF4IHVuaWZpZWQKLQotICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NAotYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NDoKLSAgICBQVVNIICAgICB7cjQtcjgsbHJ9Ci0gICAgTERSICAgICAgcjIsW3IwLCMwXQotICAgIE1PViAgICAgIHI3LCMweDFmCi0gICAgTU9WICAgICAgcjQsIzAKLSAgICBNT1YgICAgICByNSwjMAotICAgIExEUkIgICAgIHIzLFtyMl0sIzEKLSAgICBTVFJEICAgICByNCxyNSxbcjEsIzBdCi0gICAgU1RSRCAgICAgcjQscjUsW3IxLCM4XQotICAgIFNUUkQgICAgIHI0LHI1LFtyMSwjMHgxMF0KLSAgICBTVFJEICAgICByNCxyNSxbcjEsIzB4MThdCi11bnBhY2tMb29wOgotICAgIFRTVCAgICAgIHIzLCMweDEwCi0gICAgTERSU0JORSAgcjUsW3IyLCMxXQotICAgIExEUkJORSAgIHI0LFtyMl0sIzIKLSAgICBBTkQgICAgICByNixyNyxyMyxMU0wgIzEKLSAgICBMRFJTQkVRICByNCxbcjJdLCMxCi0gICAgT1JSTkUgICAgcjQscjQscjUsTFNMICM4Ci0gICAgVFNUICAgICAgcjMsIzB4MjAKLSAgICBMRFJCRVEgICByMyxbcjJdLCMxCi0gICAgU1RSSCAgICAgcjQsW3IxLHI2XQotICAgIEJFUSAgICAgIHVucGFja0xvb3AKLSAgICBTVFIgICAgICByMixbcjAsIzBdCi0gICAgUE9QICAgICAge3I0LXI4LHBjfQotICAgIC5lbmQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhOTliZGUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JLlMKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKgotICoKLSAqLwotCi0gICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCi0gICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCi0KLSAgICAuYXJtCi0gICAgLmZwdSBuZW9uCi0gICAgLnRleHQKLQotICAgIC5nbG9iYWwgb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JCi1vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0k6Ci0gICAgUFVTSCAgICAge3I0LXI5LGxyfQotICAgIE1PVlMgICAgIHI2LHIwCi0gICAgU1VCICAgICAgc3Asc3AsIzB4YwotICAgIE1PViAgICAgIHI5LHIxCi0gICAgTU9WICAgICAgcjcscjIKLSAgICBNT1YgICAgICByOCxyMwotICAgIExEUiAgICAgIHI0LFtzcCwjMHgyOF0KLSAgICBMRFIgICAgICByNSxbc3AsIzB4MmNdCi0gICAgQkVRICAgICAgTDB4NTgKLSAgICBUU1QgICAgICByNiwjNwotICAgIFRTVEVRICAgIHI5LCM3Ci0gICAgQk5FICAgICAgTDB4NTgKLSAgICBDTVAgICAgICByNywjMAotICAgIENNUE5FICAgIHI4LCMwCi0gICAgQ01QTkUgICAgcjQsIzAKLSAgICBCRVEgICAgICBMMHg1OAotICAgIFRTVCAgICAgIHI0LCMzCi0gICAgQk5FICAgICAgTDB4NTgKLSAgICBDTVAgICAgICByNSwjMAotICAgIEJFUSAgICAgIEwweDU4Ci0gICAgVFNUICAgICAgcjUsIzMKLSAgICBCRVEgICAgICBMMHg2NAotTDB4NTg6Ci0gICAgTVZOICAgICAgcjAsIzQKLUwweDVjOgotICAgIEFERCAgICAgIHNwLHNwLCMweGMKLSAgICBQT1AgICAgICB7cjQtcjkscGN9Ci1MMHg2NDoKLSAgICBTVFIgICAgICByNCxbc3AsIzBdCi0gICAgTU9WICAgICAgcjMscjgKLSAgICBTVFIgICAgICByNSxbc3AsIzRdCi0gICAgTU9WICAgICAgcjIscjcKLSAgICBNT1YgICAgICByMSxyOQotICAgIE1PViAgICAgIHIwLHI2Ci0gICAgQkwgICAgICAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0kKLSAgICBDTVAgICAgICByMCwjMAotICAgIEJORSAgICAgIEwweDVjCi0gICAgQUREICAgICAgcjMscjUsIzB4MTAKLSAgICBBREQgICAgICByMixyNCwjMHgxMAotICAgIFNUUiAgICAgIHIzLFtzcCwjNF0KLSAgICBTVFIgICAgICByMixbc3AsIzBdCi0gICAgQUREICAgICAgcjMscjgsIzIKLSAgICBBREQgICAgICByMixyNywjMgotICAgIE1PViAgICAgIHIxLHI5Ci0gICAgTU9WICAgICAgcjAscjYKLSAgICBCTCAgICAgICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSQotICAgIEFERCAgICAgIHNwLHNwLCMweGMKLSAgICBQT1AgICAgICB7cjQtcjkscGN9Ci0KLSAgICAuZW5kCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGRfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZF9zLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3YzVkOGIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZF9zLlMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoKLSAqCi0gKi8KLQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQotCi0gICAgLmFybQotICAgIC5mcHUgbmVvbgotICAgIC50ZXh0Ci0KLSAgICAuZ2xvYmFsIG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQKLW9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQ6Ci0gICAgUFVTSCAgICAge3I0LXIxMixscn0KLSAgICBWUFVTSCAgICB7ZDgtZDl9Ci0gICAgU1VCICAgICAgc3Asc3AsIzB4MjAKLSAgICBBREQgICAgICByNCxzcCwjMAotICAgIExEUiAgICAgIHI1LFtzcCwjMHg2NF0KLSAgICBNT1YgICAgICByNyxyMQotICAgIE1PViAgICAgIHI4LHIyCi0gICAgTU9WICAgICAgcjkscjMKLSAgICBDTVAgICAgICByNSwjMAotICAgIEJFUSAgICAgIEwweDExNAotICAgIE1PViAgICAgIHIxLHI0Ci0gICAgQkwgICAgICAgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NCAgOy8vCi0gICAgTERSICAgICAgcjEsW3NwLCMweDYwXQotICAgIExEUiAgICAgIHIxMSwgLkxhcm1WQ000UDEwX1FQTW9kdWxvVGFibGUKLVAwOiBBREQgICAgICByMTEsIHBjCi0gICAgTERSICAgICAgcjEwLCAuTGFybVZDTTRQMTBfUVBEaXZUYWJsZQotUDE6IEFERCAgICAgIHIxMCwgcGMKLSAgICBMRFIgICAgICByMiwgLkxhcm1WQ000UDEwX1ZNYXRyaXhVMTYKLVAyOiBBREQgICAgICByMiwgcGMKLSAgICBMRFJTQiAgICByMTIsW3IxMSxyMV0KLSAgICBMRFJTQiAgICBscixbcjEwLHIxXQotICAgIExEUiAgICAgIHIxMCwgPTB4MzAyMDUwNAotICAgIExEUiAgICAgIHIxLCA9MHg1MDQwMTAwCi0gICAgQUREICAgICAgcjIscjIscjEyCi0gICAgVkRVUC4zMiAgZDcscjEKLSAgICBWRFVQLjMyICBkOSxyMTAKLSAgICBWRFVQLjE2ICBkNSxscgotICAgIFZMRDEuOCAgIHtkNn0sW3IyXQotICAgIFZUQkwuOCAgIGQ4LHtkNn0sZDcKLSAgICBWVEJMLjggICBkNCx7ZDZ9LGQ5Ci0gICAgQ01QICAgICAgcjgsIzAKLSAgICBWTEQxLjE2ICB7ZDAsZDEsZDIsZDN9LFtyNF0KLSAgICBWU0hMLlUxNiBkOCxkOCxkNQotICAgIFZTSEwuVTE2IGQ0LGQ0LGQ1Ci0gICAgQkVRICAgICAgTDEKLSAgICBMRFJTSCAgICByMTAsW3I4LCMwXQotTDE6Ci0gICAgVk1VTC5JMTYgZDAsZDAsZDgKLSAgICBWTVVMLkkxNiBkMSxkMSxkNAotICAgIFZNVUwuSTE2IGQyLGQyLGQ4Ci0gICAgVk1VTC5JMTYgZDMsZDMsZDQKLSAgICBWTU9WTkUuMTYgZDBbMF0scjEwCi0gICAgVlRSTi4xNiAgZDAsZDEKLSAgICBWVFJOLjE2ICBkMixkMwotICAgIFZUUk4uMzIgIHEwLHExCi0gICAgVk1PVi5JMTYgZDQsIzAKLSAgICBWQURELkkxNiBkNSxkMCxkMgotICAgIFZTVUIuSTE2IGQ2LGQwLGQyCi0gICAgVkhBREQuUzE2IGQ3LGQxLGQ0Ci0gICAgVkhBREQuUzE2IGQ4LGQzLGQ0Ci0gICAgVlNVQi5JMTYgZDcsZDcsZDMKLSAgICBWQURELkkxNiBkOCxkMSxkOAotICAgIFZBREQuSTE2IGQwLGQ1LGQ4Ci0gICAgVkFERC5JMTYgZDEsZDYsZDcKLSAgICBWU1VCLkkxNiBkMixkNixkNwotICAgIFZTVUIuSTE2IGQzLGQ1LGQ4Ci0gICAgVlRSTi4xNiAgZDAsZDEKLSAgICBWVFJOLjE2ICBkMixkMwotICAgIFZUUk4uMzIgIHEwLHExCi0gICAgVkFERC5JMTYgZDUsZDAsZDIKLSAgICBWU1VCLkkxNiBkNixkMCxkMgotICAgIFZIQURELlMxNiBkNyxkMSxkNAotICAgIFZIQURELlMxNiBkOCxkMyxkNAotICAgIFZTVUIuSTE2IGQ3LGQ3LGQzCi0gICAgVkFERC5JMTYgZDgsZDEsZDgKLSAgICBWQURELkkxNiBkMCxkNSxkOAotICAgIFZBREQuSTE2IGQxLGQ2LGQ3Ci0gICAgVlNVQi5JMTYgZDIsZDYsZDcKLSAgICBWU1VCLkkxNiBkMyxkNSxkOAotICAgIFZSU0hSLlMxNiBkMCxkMCwjNgotICAgIFZSU0hSLlMxNiBkMSxkMSwjNgotICAgIFZSU0hSLlMxNiBkMixkMiwjNgotICAgIFZSU0hSLlMxNiBkMyxkMywjNgotICAgIEIgICAgICAgIEwweDEzMAotTDB4MTE0OgotICAgIExEUlNIICAgIHIxMCxbcjgsIzBdCi0gICAgQUREICAgICAgcjEwLHIxMCwjMHgyMAotICAgIEFTUiAgICAgIHIxMCxyMTAsIzYKLSAgICBWRFVQLjE2ICBkMCxyMTAKLSAgICBWRFVQLjE2ICBkMSxyMTAKLSAgICBWRFVQLjE2ICBkMixyMTAKLSAgICBWRFVQLjE2ICBkMyxyMTAKLUwweDEzMDoKLSAgICBMRFIgICAgICByMSxbc3AsIzB4NThdCi0gICAgTERSICAgICAgcjEwLFtzcCwjMHg1Y10KLSAgICBMRFIgICAgICByMyxbcjddLHIxCi0gICAgTERSICAgICAgcjUsW3I3XSxyMQotICAgIFZNT1YgICAgIGQ0LHIzLHI1Ci0gICAgTERSICAgICAgcjMsW3I3XSxyMQotICAgIExEUiAgICAgIHI1LFtyNywjMF0KLSAgICBWTU9WICAgICBkNSxyMyxyNQotICAgIFZBRERXLlU4IHEzLHEwLGQ0Ci0gICAgVkFERFcuVTggcTQscTEsZDUKLSAgICBWUU1PVlVOLlMxNiBkMCxxMwotICAgIFZRTU9WVU4uUzE2IGQxLHE0Ci0gICAgVlNUMS4zMiAge2QwWzBdfSxbcjldLHIxMAotICAgIFZTVDEuMzIgIHtkMFsxXX0sW3I5XSxyMTAKLSAgICBWU1QxLjMyICB7ZDFbMF19LFtyOV0scjEwCi0gICAgVlNUMS4zMiAge2QxWzFdfSxbcjldCi0gICAgTU9WICAgICAgcjAsIzAKLSAgICBBREQgICAgICBzcCxzcCwjMHgyMAotICAgIFZQT1AgICAgIHtkOC1kOX0KLSAgICBQT1AgICAgICB7cjQtcjEyLHBjfQotCi0uTGFybVZDTTRQMTBfUVBNb2R1bG9UYWJsZToKLSAgICAud29yZCAgIGFybVZDTTRQMTBfUVBNb2R1bG9UYWJsZS0oUDArOCkKLS5MYXJtVkNNNFAxMF9RUERpdlRhYmxlOgotICAgIC53b3JkICAgYXJtVkNNNFAxMF9RUERpdlRhYmxlLShQMSs4KQotLkxhcm1WQ000UDEwX1ZNYXRyaXhVMTY6Ci0gICAgLndvcmQgICBhcm1WQ000UDEwX1ZNYXRyaXhVMTYtKFAyKzgpCi0KLSAgICAuZW5kCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0lfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSV9zLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhODM1MTYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSV9zLlMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoKLSAqCi0gKi8KLQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQotCi0gICAgLmFybQotICAgIC5mcHUgbmVvbgotICAgIC50ZXh0Ci0KLSAgICAuZ2xvYmFsIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0kKLW9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0k6Ci0gICAgUFVTSCAgICAge3I0LXIxMCxscn0KLSAgICBWUFVTSCAgICB7ZDgtZDE1fQotICAgIFZMRDEuOCAgIHtkMFtdfSxbcjJdIQotICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMQotICAgIFNVQiAgICAgIHIwLHIwLHIxCi0gICAgVkxEMS44ICAge2QyW119LFtyM10hCi0gICAgTERSICAgICAgcjQsW3NwLCMweDY0XQotICAgIExEUiAgICAgIHI1LFtzcCwjMHg2MF0KLSAgICBMRFIgICAgICByOSwgPTB4MzAzMDMwMwotICAgIExEUiAgICAgIHI4LCA9MHg0MDQwNDA0Ci0gICAgVk1PVi5JOCAgZDE0LCMwCi0gICAgVk1PVi5JOCAgZDE1LCMweDEKLSAgICBWTU9WLkkxNiBkMSwjMHg0Ci0gICAgTU9WICAgICAgcjcsIzB4NDAwMDAwMDAKLUwweDM4OgotICAgIExEUiAgICAgIHI2LFtyNF0sIzgKLSAgICBWTEQxLjggICB7ZDZ9LFtyMF0scjEKLSAgICBWTEQxLjggICB7ZDV9LFtyMF0scjEKLSAgICBDTVAgICAgICByNiwjMAotICAgIFZMRDEuOCAgIHtkNH0sW3IwXSxyMQotICAgIFZMRDEuOCAgIHtkOH0sW3IwXSxyMQotICAgIFZBQkQuVTggIGQxOSxkNixkNAotICAgIFZMRDEuOCAgIHtkOX0sW3IwXSxyMQotICAgIFZBQkQuVTggIGQxMyxkNCxkOAotICAgIFZMRDEuOCAgIHtkMTB9LFtyMF0scjEKLSAgICBCRVEgICAgICBMMHhlNAotICAgIFZBQkQuVTggIGQxMixkNSxkNAotICAgIFZBQkQuVTggIGQxOCxkOSxkOAotICAgIFZDR1QuVTggIGQxNixkMCxkMTMKLSAgICBWTU9WLjMyICBkMjZbMF0scjYKLSAgICBWTUFYLlU4ICBkMTIsZDE4LGQxMgotICAgIFZNT1ZMLlU4IHExMyxkMjYKLSAgICBWQUJELlU4ICBkMTcsZDEwLGQ4Ci0gICAgVkNHVC5TMTYgZDI3LGQyNiwjMAotICAgIFZDR1QuVTggIGQxMixkMixkMTIKLSAgICBWQ0dULlU4ICBkMTksZDIsZDE5Ci0gICAgVkFORCAgICAgZDE2LGQxNixkMjcKLSAgICBUU1QgICAgICByNixyOQotICAgIFZDR1QuVTggIGQxNyxkMixkMTcKLSAgICBWQU5EICAgICBkMTYsZDE2LGQxMgotICAgIFZBTkQgICAgIGQxMixkMTYsZDE3Ci0gICAgVkFORCAgICAgZDE3LGQxNixkMTkKLSAgICBCTE5FICAgICBhcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFiU0xUNF91bnNhZmUKLSAgICBUU1QgICAgICByNixyOAotICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMgotICAgIFZUU1QuMTYgIGQyNixkMjYsZDEKLSAgICBCTE5FICAgICBhcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFiU0dFNF91bnNhZmUKLSAgICBWQklUICAgICBkMjksZDEzLGQyNgotICAgIFZCSVQgICAgIGQyNCxkMzEsZDI2Ci0gICAgVkJJRiAgICAgZDI5LGQ0LGQxNgotICAgIFZCSUYgICAgIGQyNCxkOCxkMTYKLSAgICBWU1QxLjggICB7ZDI5fSxbcjBdLHIxCi0gICAgQUREUyAgICAgcjcscjcscjcKLSAgICBWU1QxLjggICB7ZDI0fSxbcjBdLHIxCi0gICAgQk5FICAgICAgTDB4MzgKLSAgICBNT1YgICAgICByMCwjMAotICAgIFZQT1AgICAgIHtkOC1kMTV9Ci0gICAgUE9QICAgICAge3I0LXIxMCxwY30KLUwweGU0OgotICAgIFZMRDEuOCAgIHtkMFtdfSxbcjJdCi0gICAgU1VCICAgICAgcjAscjAscjEsTFNMICMxCi0gICAgQUREUyAgICAgcjcscjcscjcKLSAgICBWTEQxLjggICB7ZDJbXX0sW3IzXQotICAgIEFERCAgICAgIHI1LHI1LCM0Ci0gICAgQk5FICAgICAgTDB4MzgKLSAgICBNT1YgICAgICByMCwjMAotICAgIFZQT1AgICAgIHtkOC1kMTV9Ci0gICAgUE9QICAgICAge3I0LXIxMCxwY30KLQotICAgIC5lbmQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSV9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JX3MuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUxMDkzMS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JX3MuUworKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKgotICoKLSAqLwotCi0gICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCi0gICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCi0KLSAgICAuYXJtCi0gICAgLmZwdSBuZW9uCi0gICAgLnRleHQKLQotICAgIC5nbG9iYWwgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSQotb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSToKLSAgICBQVVNIICAgICB7cjQtcjEyLGxyfQotICAgIFZQVVNIICAgIHtkOC1kMTV9Ci0gICAgVkxEMS44ICAge2QwW119LFtyMl0hCi0gICAgU1VCICAgICAgcjAscjAsIzQKLSAgICBWTEQxLjggICB7ZDJbXX0sW3IzXSEKLSAgICBMRFIgICAgICByNCxbc3AsIzB4NmNdCi0gICAgTERSICAgICAgcjUsW3NwLCMweDY4XQotICAgIExEUiAgICAgIHI4LCA9MHg0MDQwNDA0Ci0gICAgTERSICAgICAgcjksID0weDMwMzAzMDMKLSAgICBWTU9WLkk4ICBkMTQsIzAKLSAgICBWTU9WLkk4ICBkMTUsIzB4MQotICAgIFZNT1YuSTE2IGQxLCMweDQKLSAgICBNT1YgICAgICByNywjMHg0MDAwMDAwMAotTDB4MzQ6Ci0gICAgTERSICAgICAgcjYsW3I0XSwjOAotICAgIEFERCAgICAgIHIxMCxyMCxyMQotICAgIEFERCAgICAgIGxyLHIxLHIxCi0gICAgVkxEMS44ICAge2Q3fSxbcjBdLGxyCi0gICAgVkxEMS44ICAge2Q4fSxbcjEwXSxscgotICAgIFZMRDEuOCAgIHtkNX0sW3IwXSxscgotICAgIFZMRDEuOCAgIHtkMTB9LFtyMTBdLGxyCi0gICAgVkxEMS44ICAge2Q2fSxbcjBdLGxyCi0gICAgVkxEMS44ICAge2Q5fSxbcjEwXSxscgotICAgIFZMRDEuOCAgIHtkNH0sW3IwXSxscgotICAgIFZMRDEuOCAgIHtkMTF9LFtyMTBdLGxyCi0gICAgVlpJUC44ICAgZDcsZDgKLSAgICBWWklQLjggICBkNSxkMTAKLSAgICBWWklQLjggICBkNixkOQotICAgIFZaSVAuOCAgIGQ0LGQxMQotICAgIFZaSVAuMTYgIGQ3LGQ1Ci0gICAgVlpJUC4xNiAgZDgsZDEwCi0gICAgVlpJUC4xNiAgZDYsZDQKLSAgICBWWklQLjE2ICBkOSxkMTEKLSAgICBWVFJOLjMyICBkNyxkNgotICAgIFZUUk4uMzIgIGQ1LGQ0Ci0gICAgVlRSTi4zMiAgZDEwLGQxMQotICAgIFZUUk4uMzIgIGQ4LGQ5Ci0gICAgQ01QICAgICAgcjYsIzAKLSAgICBWQUJELlU4ICBkMTksZDYsZDQKLSAgICBWQUJELlU4ICBkMTMsZDQsZDgKLSAgICBCRVEgICAgICBMMHgxNzAKLSAgICBWQUJELlU4ICBkMTIsZDUsZDQKLSAgICBWQUJELlU4ICBkMTgsZDksZDgKLSAgICBWTU9WLjMyICBkMjZbMF0scjYKLSAgICBWQ0dULlU4ICBkMTYsZDAsZDEzCi0gICAgVk1BWC5VOCAgZDEyLGQxOCxkMTIKLSAgICBWTU9WTC5VOCBxMTMsZDI2Ci0gICAgVkFCRC5VOCAgZDE3LGQxMCxkOAotICAgIFZDR1QuUzE2IGQyNyxkMjYsIzAKLSAgICBWQ0dULlU4ICBkMTIsZDIsZDEyCi0gICAgVkNHVC5VOCAgZDE5LGQyLGQxOQotICAgIFZBTkQgICAgIGQxNixkMTYsZDI3Ci0gICAgVFNUICAgICAgcjYscjkKLSAgICBWQ0dULlU4ICBkMTcsZDIsZDE3Ci0gICAgVkFORCAgICAgZDE2LGQxNixkMTIKLSAgICBWQU5EICAgICBkMTIsZDE2LGQxNwotICAgIFZBTkQgICAgIGQxNyxkMTYsZDE5Ci0gICAgQkxORSAgICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hYlNMVDRfdW5zYWZlCi0gICAgVFNUICAgICAgcjYscjgKLSAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzMKLSAgICBWVFNULjE2ICBkMjYsZDI2LGQxCi0gICAgQkxORSAgICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hYlNHRTRfdW5zYWZlCi0gICAgVkJJVCAgICAgZDI5LGQxMyxkMjYKLSAgICBWQklUICAgICBkMjQsZDMxLGQyNgotICAgIEFERCAgICAgIHIxMCxyMCwjMwotICAgIFZCSUYgICAgIGQyOSxkNCxkMTYKLSAgICBBREQgICAgICByMTIscjEwLHIxCi0gICAgQUREICAgICAgbHIscjEscjEKLSAgICBWQklGICAgICBkMjQsZDgsZDE2Ci0gICAgQUREUyAgICAgcjcscjcscjcKLSAgICBWU1QxLjggICB7ZDI5WzBdfSxbcjEwXSxscgotICAgIFZTVDEuOCAgIHtkMjlbMV19LFtyMTJdLGxyCi0gICAgVlNUMS44ICAge2QyOVsyXX0sW3IxMF0sbHIKLSAgICBWU1QxLjggICB7ZDI5WzNdfSxbcjEyXSxscgotICAgIFZTVDEuOCAgIHtkMjlbNF19LFtyMTBdLGxyCi0gICAgVlNUMS44ICAge2QyOVs1XX0sW3IxMl0sbHIKLSAgICBWU1QxLjggICB7ZDI5WzZdfSxbcjEwXSxscgotICAgIFZTVDEuOCAgIHtkMjlbN119LFtyMTJdLGxyCi0gICAgQUREICAgICAgcjEyLHIwLCM0Ci0gICAgQUREICAgICAgcjEwLHIxMixyMQotICAgIFZTVDEuOCAgIHtkMjRbMF19LFtyMTJdLGxyCi0gICAgVlNUMS44ICAge2QyNFsxXX0sW3IxMF0sbHIKLSAgICBWU1QxLjggICB7ZDI0WzJdfSxbcjEyXSxscgotICAgIFZTVDEuOCAgIHtkMjRbM119LFtyMTBdLGxyCi0gICAgVlNUMS44ICAge2QyNFs0XX0sW3IxMl0sbHIKLSAgICBWU1QxLjggICB7ZDI0WzVdfSxbcjEwXSxscgotICAgIFZTVDEuOCAgIHtkMjRbNl19LFtyMTJdLGxyCi0gICAgVlNUMS44ICAge2QyNFs3XX0sW3IxMF0sbHIKLSAgICBBREQgICAgICByMCxyMCwjNAotICAgIEJORSAgICAgIEwweDM0Ci0gICAgTU9WICAgICAgcjAsIzAKLSAgICBWUE9QICAgICB7ZDgtZDE1fQotICAgIFBPUCAgICAgIHtyNC1yMTIscGN9Ci1MMHgxNzA6Ci0gICAgVkxEMS44ICAge2QwW119LFtyMl0KLSAgICBBREQgICAgICByMCxyMCwjNAotICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMwotICAgIEFERFMgICAgIHI3LHI3LHI3Ci0gICAgVkxEMS44ICAge2QyW119LFtyM10KLSAgICBBREQgICAgICByNSxyNSwjNAotICAgIEJORSAgICAgIEwweDM0Ci0gICAgTU9WICAgICAgcjAsIzAKLSAgICBWUE9QICAgICB7ZDgtZDE1fQotICAgIFBPUCAgICAgIHtyNC1yMTIscGN9Ci0KLSAgICAuZW5kCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JX3MuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRmZmFkMi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSV9zLlMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoKLSAqCi0gKi8KLQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQotCi0gICAgLmFybQotICAgIC5mcHUgbmVvbgotICAgIC50ZXh0Ci0KLSAgICAuZ2xvYmFsIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JCi1vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSToKLSAgICBQVVNIICAgICB7cjQtcjEyLGxyfQotICAgIFZQVVNIICAgIHtkOC1kMTV9Ci0gICAgQUREICAgICAgcjcscjIsIzEKLSAgICBBREQgICAgICByOCxyMywjMQotICAgIFZMRDEuOCAgIHtkMFtdfSxbcjJdCi0gICAgU1VCICAgICAgcjAscjAscjEsTFNMICMyCi0gICAgVkxEMS44ICAge2QyW119LFtyM10KLSAgICBMRFIgICAgICByNCxbc3AsIzB4NmNdCi0gICAgTERSICAgICAgcjUsW3NwLCMweDY4XQotICAgIE1PViAgICAgIHIxMSwjMAotICAgIFZNT1YuSTggIGQxNCwjMAotICAgIFZNT1YuSTggIGQxNSwjMHgxCi0gICAgQUREICAgICAgcjEwLHIxLHIxCi0gICAgTU9WICAgICAgcjksIzB4NTUwMDAwMDAKLUwweDM4OgotICAgIExEUkggICAgIHIxMixbcjRdLCMyCi0gICAgQUREICAgICAgcjYscjAscjEKLSAgICBDTVAgICAgICByMTIsIzAKLSAgICBCRVEgICAgICBMMHhlNAotICAgIFZMRDEuOCAgIHtkN30sW3IwXSxyMTAKLSAgICBWTEQxLjggICB7ZDZ9LFtyNl0scjEwCi0gICAgVkxEMS44ICAge2Q1fSxbcjBdLHIxMAotICAgIFZMRDEuOCAgIHtkNH0sW3I2XSxyMTAKLSAgICBWTEQxLjggICB7ZDh9LFtyMF0scjEwCi0gICAgVkFCRC5VOCAgZDEyLGQ0LGQ1Ci0gICAgVkxEMS44ICAge2Q5fSxbcjZdCi0gICAgVkFCRC5VOCAgZDEzLGQ4LGQ0Ci0gICAgVkxEMS44ICAge2QxMH0sW3IwXSxyMQotICAgIFZBQkQuVTggIGQxOCxkOSxkOAotICAgIFZBQkQuVTggIGQxOSxkNixkNAotICAgIFZDR1QuVTggIGQxNixkMCxkMTMKLSAgICBUU1QgICAgICByMTIsIzB4ZmYKLSAgICBWTUFYLlU4ICBkMTIsZDE4LGQxMgotICAgIFZBQkQuVTggIGQxNyxkMTAsZDgKLSAgICBWTU9WRVEuMzIgZDE2WzBdLHIxMQotICAgIFRTVCAgICAgIHIxMiwjMHhmZjAwCi0gICAgVkNHVC5VOCAgZDE5LGQyLGQxOQotICAgIFZDR1QuVTggIGQxMixkMixkMTIKLSAgICBWTU9WRVEuMzIgZDE2WzFdLHIxMQotICAgIFZDR1QuVTggIGQxNyxkMixkMTcKLSAgICBWTEQxLjggICB7ZDExfSxbcjBdCi0gICAgVkFORCAgICAgZDE2LGQxNixkMTIKLSAgICBUU1QgICAgICByMTIsIzQKLSAgICBWQU5EICAgICBkMTIsZDE2LGQxNwotICAgIFZBTkQgICAgIGQxNyxkMTYsZDE5Ci0gICAgQk5FICAgICAgTDB4ZjgKLSAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzIKLSAgICBTVUIgICAgICByMCxyMCxyMQotICAgIEJMICAgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0xUNF91bnNhZmUKLSAgICBWU1QxLjggICB7ZDMwfSxbcjBdLHIxCi0gICAgVlNUMS44ICAge2QyOX0sW3IwXSxyMQotICAgIFNVQiAgICAgIHI2LHIwLHIxLExTTCAjMgotICAgIFZTVDEuOCAgIHtkMjR9LFtyMF0scjEKLSAgICBBRERTICAgICByOSxyOSxyOQotICAgIFZTVDEuOCAgIHtkMjV9LFtyMF0KLSAgICBBREQgICAgICByMCxyNiwjOAotICAgIEJDQyAgICAgIEwweDM4Ci0gICAgQiAgICAgICAgTDB4MTMwCi1MMHhlNDoKLSAgICBBREQgICAgICByMCxyMCwjOAotICAgIEFERFMgICAgIHI5LHI5LHI5Ci0gICAgQUREICAgICAgcjUscjUsIzIKLSAgICBCQ0MgICAgICBMMHgzOAotICAgIEIgICAgICAgIEwweDEzMAotTDB4Zjg6Ci0gICAgU1VCICAgICAgcjAscjAscjEsTFNMICMyCi0gICAgU1VCICAgICAgcjAscjAscjEsTFNMICMxCi0gICAgQkwgICAgICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTR0U0X3Vuc2FmZQotICAgIFZTVDEuOCAgIHtkMzF9LFtyMF0scjEKLSAgICBWU1QxLjggICB7ZDMwfSxbcjBdLHIxCi0gICAgVlNUMS44ICAge2QyOX0sW3IwXSxyMQotICAgIFNVQiAgICAgIHI2LHIwLHIxLExTTCAjMgotICAgIFZTVDEuOCAgIHtkMjR9LFtyMF0scjEKLSAgICBBRERTICAgICByOSxyOSxyOQotICAgIFZTVDEuOCAgIHtkMjV9LFtyMF0scjEKLSAgICBBREQgICAgICByNSxyNSwjMgotICAgIFZTVDEuOCAgIHtkMjh9LFtyMF0KLSAgICBBREQgICAgICByMCxyNiwjOAotICAgIEJDQyAgICAgIEwweDM4Ci1MMHgxMzA6Ci0gICAgU1VCICAgICAgcjAscjAsIzB4MTAKLSAgICBWTEQxLjggICB7ZDBbXX0sW3I3XQotICAgIEFERCAgICAgIHIwLHIwLHIxLExTTCAjMgotICAgIFZMRDEuOCAgIHtkMltdfSxbcjhdCi0gICAgQk5FICAgICAgTDB4MzgKLSAgICBNT1YgICAgICByMCwjMAotICAgIFZQT1AgICAgIHtkOC1kMTV9Ci0gICAgUE9QICAgICAge3I0LXIxMixwY30KLQotICAgIC5lbmQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0lfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0lfcy5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmEzNjgyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JX3MuUworKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKgotICoKLSAqLwotCi0gICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCi0gICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCi0KLSAgICAuYXJtCi0gICAgLmZwdSBuZW9uCi0gICAgLnRleHQKLQotICAgIC5nbG9iYWwgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0kKLW9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JOgotICAgIFBVU0ggICAgIHtyNC1yMTIsbHJ9Ci0gICAgVlBVU0ggICAge2Q4LWQxNX0KLSAgICBBREQgICAgICByNyxyMiwjMQotICAgIEFERCAgICAgIHI4LHIzLCMxCi0gICAgVkxEMS44ICAge2QwW119LFtyMl0KLSAgICBTVUIgICAgICByMCxyMCwjNAotICAgIFZMRDEuOCAgIHtkMltdfSxbcjNdCi0gICAgTERSICAgICAgcjQsW3NwLCMweDZjXQotICAgIExEUiAgICAgIHI1LFtzcCwjMHg2OF0KLSAgICBNT1YgICAgICByNiwjMAotICAgIFZNT1YuSTggIGQxNCwjMAotICAgIFZNT1YuSTggIGQxNSwjMHgxCi0gICAgTU9WICAgICAgcjksIzB4MTEwMDAwMDAKLSAgICBBREQgICAgICByMTEscjEscjEKLUwweDM4OgotICAgIExEUkggICAgIHIxMixbcjRdLCM0Ci0gICAgQ01QICAgICAgcjEyLCMwCi0gICAgQkVRICAgICAgTDB4MTYwCi0gICAgQUREICAgICAgcjEwLHIwLHIxCi0gICAgVkxEMS44ICAge2Q3fSxbcjBdLHIxMQotICAgIFZMRDEuOCAgIHtkOH0sW3IxMF0scjExCi0gICAgVkxEMS44ICAge2Q1fSxbcjBdLHIxMQotICAgIFZaSVAuOCAgIGQ3LGQ4Ci0gICAgVkxEMS44ICAge2QxMH0sW3IxMF0scjExCi0gICAgVkxEMS44ICAge2Q2fSxbcjBdLHIxMQotICAgIFZaSVAuOCAgIGQ1LGQxMAotICAgIFZMRDEuOCAgIHtkOX0sW3IxMF0scjExCi0gICAgVkxEMS44ICAge2Q0fSxbcjBdLHIxMQotICAgIFZMRDEuOCAgIHtkMTF9LFtyMTBdLHIxMQotICAgIFZaSVAuOCAgIGQ2LGQ5Ci0gICAgVlpJUC4xNiAgZDgsZDEwCi0gICAgVlpJUC44ICAgZDQsZDExCi0gICAgU1VCICAgICAgcjAscjAscjEsTFNMICMzCi0gICAgVlpJUC4xNiAgZDcsZDUKLSAgICBWWklQLjE2ICBkOSxkMTEKLSAgICBWWklQLjE2ICBkNixkNAotICAgIFZUUk4uMzIgIGQ4LGQ5Ci0gICAgVlRSTi4zMiAgZDUsZDQKLSAgICBWVFJOLjMyICBkMTAsZDExCi0gICAgVlRSTi4zMiAgZDcsZDYKLSAgICBWQUJELlU4ICBkMTMsZDQsZDgKLSAgICBWQUJELlU4ICBkMTIsZDUsZDQKLSAgICBWQUJELlU4ICBkMTgsZDksZDgKLSAgICBWQUJELlU4ICBkMTksZDYsZDQKLSAgICBUU1QgICAgICByMTIsIzB4ZmYKLSAgICBWQ0dULlU4ICBkMTYsZDAsZDEzCi0gICAgVk1BWC5VOCAgZDEyLGQxOCxkMTIKLSAgICBWQUJELlU4ICBkMTcsZDEwLGQ4Ci0gICAgVk1PVkVRLjMyIGQxNlswXSxyNgotICAgIFRTVCAgICAgIHIxMiwjMHhmZjAwCi0gICAgVkNHVC5VOCAgZDE5LGQyLGQxOQotICAgIFZDR1QuVTggIGQxMixkMixkMTIKLSAgICBWTU9WRVEuMzIgZDE2WzFdLHI2Ci0gICAgVkNHVC5VOCAgZDE3LGQyLGQxNwotICAgIFZBTkQgICAgIGQxNixkMTYsZDEyCi0gICAgVFNUICAgICAgcjEyLCM0Ci0gICAgVkFORCAgICAgZDEyLGQxNixkMTcKLSAgICBWQU5EICAgICBkMTcsZDE2LGQxOQotICAgIEJORSAgICAgIEwweDE3YwotICAgIEJMICAgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0xUNF91bnNhZmUKLSAgICBWWklQLjggICBkNyxkNgotICAgIFZaSVAuOCAgIGQzMCxkMjkKLSAgICBWWklQLjggICBkMjQsZDI1Ci0gICAgVlpJUC44ICAgZDEwLGQxMQotICAgIFZaSVAuMTYgIGQ3LGQzMAotICAgIEFERCAgICAgIHIxMCxyMCxyMQotICAgIFZaSVAuMTYgIGQyNCxkMTAKLSAgICBWWklQLjE2ICBkMjUsZDExCi0gICAgVlpJUC4xNiAgZDYsZDI5Ci0gICAgVlRSTi4zMiAgZDcsZDI0Ci0gICAgVlRSTi4zMiAgZDMwLGQxMAotICAgIFZUUk4uMzIgIGQ2LGQyNQotICAgIFZUUk4uMzIgIGQyOSxkMTEKLSAgICBWU1QxLjggICB7ZDd9LFtyMF0scjExCi0gICAgVlNUMS44ICAge2QyNH0sW3IxMF0scjExCi0gICAgVlNUMS44ICAge2QzMH0sW3IwXSxyMTEKLSAgICBWU1QxLjggICB7ZDEwfSxbcjEwXSxyMTEKLSAgICBWU1QxLjggICB7ZDZ9LFtyMF0scjExCi0gICAgVlNUMS44ICAge2QyNX0sW3IxMF0scjExCi0gICAgQUREUyAgICAgcjkscjkscjkKLSAgICBWU1QxLjggICB7ZDI5fSxbcjBdLHIxMQotICAgIEFERCAgICAgIHI1LHI1LCMyCi0gICAgVlNUMS44ICAge2QxMX0sW3IxMF0scjEKLSAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzMKLSAgICBWTEQxLjggICB7ZDBbXX0sW3I3XQotICAgIEFERCAgICAgIHIwLHIwLCM0Ci0gICAgVkxEMS44ICAge2QyW119LFtyOF0KLSAgICBCQ0MgICAgICBMMHgzOAotICAgIEIgICAgICAgIEwweDFmMAotTDB4MTYwOgotICAgIEFERCAgICAgIHIwLHIwLCM0Ci0gICAgQUREUyAgICAgcjkscjkscjkKLSAgICBWTEQxLjggICB7ZDBbXX0sW3I3XQotICAgIEFERCAgICAgIHI1LHI1LCM0Ci0gICAgVkxEMS44ICAge2QyW119LFtyOF0KLSAgICBCQ0MgICAgICBMMHgzOAotICAgIEIgICAgICAgIEwweDFmMAotTDB4MTdjOgotICAgIEJMICAgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0dFNF91bnNhZmUKLSAgICBWWklQLjggICBkNyxkMzEKLSAgICBWWklQLjggICBkMzAsZDI5Ci0gICAgVlpJUC44ICAgZDI0LGQyNQotICAgIFZaSVAuOCAgIGQyOCxkMTEKLSAgICBWWklQLjE2ICBkNyxkMzAKLSAgICBBREQgICAgICByMTAscjAscjEKLSAgICBWWklQLjE2ICBkMjQsZDI4Ci0gICAgVlpJUC4xNiAgZDI1LGQxMQotICAgIFZaSVAuMTYgIGQzMSxkMjkKLSAgICBWVFJOLjMyICBkNyxkMjQKLSAgICBWVFJOLjMyICBkMzAsZDI4Ci0gICAgVlRSTi4zMiAgZDMxLGQyNQotICAgIFZUUk4uMzIgIGQyOSxkMTEKLSAgICBWU1QxLjggICB7ZDd9LFtyMF0scjExCi0gICAgVlNUMS44ICAge2QyNH0sW3IxMF0scjExCi0gICAgVlNUMS44ICAge2QzMH0sW3IwXSxyMTEKLSAgICBWU1QxLjggICB7ZDI4fSxbcjEwXSxyMTEKLSAgICBWU1QxLjggICB7ZDMxfSxbcjBdLHIxMQotICAgIFZTVDEuOCAgIHtkMjV9LFtyMTBdLHIxMQotICAgIEFERFMgICAgIHI5LHI5LHI5Ci0gICAgVlNUMS44ICAge2QyOX0sW3IwXSxyMTEKLSAgICBBREQgICAgICByNSxyNSwjNAotICAgIFZTVDEuOCAgIHtkMTF9LFtyMTBdLHIxMQotICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMwotICAgIFZMRDEuOCAgIHtkMFtdfSxbcjddCi0gICAgQUREICAgICAgcjAscjAsIzQKLSAgICBWTEQxLjggICB7ZDJbXX0sW3I4XQotICAgIEJDQyAgICAgIEwweDM4Ci1MMHgxZjA6Ci0gICAgU1VCICAgICAgcjQscjQsIzB4ZQotICAgIFNVQiAgICAgIHI1LHI1LCMweGUKLSAgICBTVUIgICAgICByMCxyMCwjMHgxMAotICAgIFZMRDEuOCAgIHtkMFtdfSxbcjJdCi0gICAgQUREICAgICAgcjAscjAscjEsTFNMICMzCi0gICAgVkxEMS44ICAge2QyW119LFtyM10KLSAgICBCTkUgICAgICBMMHgzOAotICAgIE1PViAgICAgIHIwLCMwCi0gICAgVlBPUCAgICAge2Q4LWQxNX0KLSAgICBQT1AgICAgICB7cjQtcjEyLHBjfQotCi0gICAgLmVuZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYV9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYV9zLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNGVhYmQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfcy5TCisrKyAvZGV2L251bGwKQEAgLTEsMzM2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qCi0gKgotICovCi0KLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKLQotICAgIC5hcm0KLSAgICAuZnB1IG5lb24KLSAgICAudGV4dAotCi0gICAgLmdsb2JhbCBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYQotb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWE6Ci0gICAgUFVTSCAgICAge3I0LXIxMixscn0KLSAgICBWUFVTSCAgICB7ZDgtZDE1fQotICAgIFNVQiAgICAgIHNwLHNwLCMweDEwCi0gICAgTERSICAgICAgcjYsW3NwLCMweDc4XQotICAgIExEUiAgICAgIHI3LFtzcCwjMHg3Y10KLSAgICBMRFIgICAgICByNSxbc3AsIzB4ODBdCi0gICAgTERSICAgICAgcjQsW3NwLCMweDg0XQotICAgIEFERCAgICAgIHI2LHI2LHI3LExTTCAjMgotICAgIEFERCAgICAgIHIxMSxzcCwjMAotICAgIFZNT1YuSTE2IGQzMSwjMHgxNAotICAgIFZNT1YuSTE2IGQzMCwjMHg1Ci1MMHgyYzoKLSAgICBTVE0gICAgICByMTEse3IwLXIzfQotICAgIEFERCAgICAgIHBjLHBjLHI2LExTTCAjMgotICAgIEIgICAgICAgIEwweDNmMAotICAgIEIgICAgICAgIEwweDc4Ci0gICAgQiAgICAgICAgTDB4YTgKLSAgICBCICAgICAgICBMMHhkYwotICAgIEIgICAgICAgIEwweDEwMAotICAgIEIgICAgICAgIEwweDEzNAotICAgIEIgICAgICAgIEwweDE2OAotICAgIEIgICAgICAgIEwweDFhOAotICAgIEIgICAgICAgIEwweDFmMAotICAgIEIgICAgICAgIEwweDIzNAotICAgIEIgICAgICAgIEwweDI1OAotICAgIEIgICAgICAgIEwweDJiMAotICAgIEIgICAgICAgIEwweDJkOAotICAgIEIgICAgICAgIEwweDMzMAotICAgIEIgICAgICAgIEwweDM2NAotICAgIEIgICAgICAgIEwweDNhOAotICAgIEIgICAgICAgIEwweDNmMAotTDB4Nzg6Ci0gICAgQUREICAgICAgcjEyLHIwLHIxLExTTCAjMQotICAgIFZMRDEuOCAgIHtkOX0sW3IwXSxyMQotICAgIFZMRDEuOCAgIHtkMTF9LFtyMTJdLHIxCi0gICAgVkxEMS44ICAge2QxMH0sW3IwXQotICAgIFZMRDEuOCAgIHtkMTJ9LFtyMTJdCi0gICAgQUREICAgICAgcjEyLHIyLHIzLExTTCAjMQotICAgIFZTVDEuMzIgIHtkOVswXX0sW3IyXSxyMwotICAgIFZTVDEuMzIgIHtkMTFbMF19LFtyMTJdLHIzCi0gICAgVlNUMS4zMiAge2QxMFswXX0sW3IyXQotICAgIFZTVDEuMzIgIHtkMTJbMF19LFtyMTJdCi0gICAgQUREICAgICAgcjExLHNwLCMwCi0gICAgQiAgICAgICAgTDB4NDM0Ci1MMHhhODoKLSAgICBTVUIgICAgICByMCxyMCwjMgotICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCi0gICAgVlJIQURELlU4IGQyMixkMjIsZDE0Ci0gICAgVlJIQURELlU4IGQyNixkMjYsZDE4Ci0gICAgVlJIQURELlU4IGQyNCxkMjQsZDE2Ci0gICAgVlJIQURELlU4IGQyOCxkMjgsZDIwCi0gICAgQUREICAgICAgcjEyLHIyLHIzLExTTCAjMQotICAgIFZTVDEuMzIgIHtkMjJbMF19LFtyMl0scjMKLSAgICBWU1QxLjMyICB7ZDI2WzBdfSxbcjEyXSxyMwotICAgIFZTVDEuMzIgIHtkMjRbMF19LFtyMl0KLSAgICBWU1QxLjMyICB7ZDI4WzBdfSxbcjEyXQotICAgIEFERCAgICAgIHIxMSxzcCwjMAotICAgIEIgICAgICAgIEwweDQzNAotTDB4ZGM6Ci0gICAgU1VCICAgICAgcjAscjAsIzIKLSAgICBCTCAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZQotICAgIEFERCAgICAgIHIxMixyMixyMyxMU0wgIzEKLSAgICBWU1QxLjMyICB7ZDIyWzBdfSxbcjJdLHIzCi0gICAgVlNUMS4zMiAge2QyNlswXX0sW3IxMl0scjMKLSAgICBWU1QxLjMyICB7ZDI0WzBdfSxbcjJdCi0gICAgVlNUMS4zMiAge2QyOFswXX0sW3IxMl0KLSAgICBBREQgICAgICByMTEsc3AsIzAKLSAgICBCICAgICAgICBMMHg0MzQKLUwweDEwMDoKLSAgICBTVUIgICAgICByMCxyMCwjMgotICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCi0gICAgVlJIQURELlU4IGQyMixkMjIsZDE1Ci0gICAgVlJIQURELlU4IGQyNixkMjYsZDE5Ci0gICAgVlJIQURELlU4IGQyNCxkMjQsZDE3Ci0gICAgVlJIQURELlU4IGQyOCxkMjgsZDIxCi0gICAgQUREICAgICAgcjEyLHIyLHIzLExTTCAjMQotICAgIFZTVDEuMzIgIHtkMjJbMF19LFtyMl0scjMKLSAgICBWU1QxLjMyICB7ZDI2WzBdfSxbcjEyXSxyMwotICAgIFZTVDEuMzIgIHtkMjRbMF19LFtyMl0KLSAgICBWU1QxLjMyICB7ZDI4WzBdfSxbcjEyXQotICAgIEFERCAgICAgIHIxMSxzcCwjMAotICAgIEIgICAgICAgIEwweDQzNAotTDB4MTM0OgotICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMQotICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCi0gICAgVlJIQURELlU4IGQwLGQwLGQ5Ci0gICAgVlJIQURELlU4IGQ0LGQ0LGQxMQotICAgIFZSSEFERC5VOCBkMixkMixkMTAKLSAgICBWUkhBREQuVTggZDYsZDYsZDEyCi0gICAgQUREICAgICAgcjEyLHIyLHIzLExTTCAjMQotICAgIFZTVDEuMzIgIHtkMFswXX0sW3IyXSxyMwotICAgIFZTVDEuMzIgIHtkNFswXX0sW3IxMl0scjMKLSAgICBWU1QxLjMyICB7ZDJbMF19LFtyMl0KLSAgICBWU1QxLjMyICB7ZDZbMF19LFtyMTJdCi0gICAgQUREICAgICAgcjExLHNwLCMwCi0gICAgQiAgICAgICAgTDB4NDM0Ci1MMHgxNjg6Ci0gICAgTU9WICAgICAgcjgscjAKLSAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzEKLSAgICBCTCAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZQotICAgIFNVQiAgICAgIHIwLHI4LCMyCi0gICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUKLSAgICBWUkhBREQuVTggZDIyLGQyMixkMAotICAgIFZSSEFERC5VOCBkMjYsZDI2LGQ0Ci0gICAgVlJIQURELlU4IGQyNCxkMjQsZDIKLSAgICBWUkhBREQuVTggZDI4LGQyOCxkNgotICAgIEFERCAgICAgIHIxMixyMixyMyxMU0wgIzEKLSAgICBWU1QxLjMyICB7ZDIyWzBdfSxbcjJdLHIzCi0gICAgVlNUMS4zMiAge2QyNlswXX0sW3IxMl0scjMKLSAgICBWU1QxLjMyICB7ZDI0WzBdfSxbcjJdCi0gICAgVlNUMS4zMiAge2QyOFswXX0sW3IxMl0KLSAgICBBREQgICAgICByMTEsc3AsIzAKLSAgICBCICAgICAgICBMMHg0MzQKLUwweDFhODoKLSAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzEKLSAgICBTVUIgICAgICByMCxyMCwjMgotICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZQotICAgIFZRUlNIUlVOLlMxNiBkMTQscTcsIzUKLSAgICBWUVJTSFJVTi5TMTYgZDE2LHE4LCM1Ci0gICAgVlFSU0hSVU4uUzE2IGQxOCxxOSwjNQotICAgIFZRUlNIUlVOLlMxNiBkMjAscTEwLCM1Ci0gICAgVlJIQURELlU4IGQwLGQwLGQxNAotICAgIFZSSEFERC5VOCBkNCxkNCxkMTgKLSAgICBWUkhBREQuVTggZDIsZDIsZDE2Ci0gICAgVlJIQURELlU4IGQ2LGQ2LGQyMAotICAgIEFERCAgICAgIHIxMixyMixyMyxMU0wgIzEKLSAgICBWU1QxLjMyICB7ZDBbMF19LFtyMl0scjMKLSAgICBWU1QxLjMyICB7ZDRbMF19LFtyMTJdLHIzCi0gICAgVlNUMS4zMiAge2QyWzBdfSxbcjJdCi0gICAgVlNUMS4zMiAge2Q2WzBdfSxbcjEyXQotICAgIEFERCAgICAgIHIxMSxzcCwjMAotICAgIEIgICAgICAgIEwweDQzNAotTDB4MWYwOgotICAgIE1PViAgICAgIHI4LHIwCi0gICAgQUREICAgICAgcjAscjAsIzEKLSAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzEKLSAgICBCTCAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZQotICAgIFNVQiAgICAgIHIwLHI4LCMyCi0gICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUKLSAgICBWUkhBREQuVTggZDIyLGQyMixkMAotICAgIFZSSEFERC5VOCBkMjYsZDI2LGQ0Ci0gICAgVlJIQURELlU4IGQyNCxkMjQsZDIKLSAgICBWUkhBREQuVTggZDI4LGQyOCxkNgotICAgIEFERCAgICAgIHIxMixyMixyMyxMU0wgIzEKLSAgICBWU1QxLjMyICB7ZDIyWzBdfSxbcjJdLHIzCi0gICAgVlNUMS4zMiAge2QyNlswXX0sW3IxMl0scjMKLSAgICBWU1QxLjMyICB7ZDI0WzBdfSxbcjJdCi0gICAgVlNUMS4zMiAge2QyOFswXX0sW3IxMl0KLSAgICBBREQgICAgICByMTEsc3AsIzAKLSAgICBCICAgICAgICBMMHg0MzQKLUwweDIzNDoKLSAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzEKLSAgICBCTCAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZQotICAgIEFERCAgICAgIHIxMixyMixyMyxMU0wgIzEKLSAgICBWU1QxLjMyICB7ZDBbMF19LFtyMl0scjMKLSAgICBWU1QxLjMyICB7ZDRbMF19LFtyMTJdLHIzCi0gICAgVlNUMS4zMiAge2QyWzBdfSxbcjJdCi0gICAgVlNUMS4zMiAge2Q2WzBdfSxbcjEyXQotICAgIEFERCAgICAgIHIxMSxzcCwjMAotICAgIEIgICAgICAgIEwweDQzNAotTDB4MjU4OgotICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMQotICAgIFNVQiAgICAgIHIwLHIwLCMyCi0gICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlCi0gICAgVkVYVC44ICAgZDE4LGQxOCxkMTksIzQKLSAgICBWRVhULjggICBkMjAsZDIwLGQyMSwjNAotICAgIFZFWFQuOCAgIGQyMixkMjIsZDIzLCM0Ci0gICAgVkVYVC44ICAgZDI0LGQyNCxkMjUsIzQKLSAgICBWUVJTSFJVTi5TMTYgZDE0LHE5LCM1Ci0gICAgVlFSU0hSVU4uUzE2IGQxNixxMTAsIzUKLSAgICBWUVJTSFJVTi5TMTYgZDE4LHExMSwjNQotICAgIFZRUlNIUlVOLlMxNiBkMjAscTEyLCM1Ci0gICAgVlJIQURELlU4IGQwLGQwLGQxNAotICAgIFZSSEFERC5VOCBkNCxkNCxkMTgKLSAgICBWUkhBREQuVTggZDIsZDIsZDE2Ci0gICAgVlJIQURELlU4IGQ2LGQ2LGQyMAotICAgIEFERCAgICAgIHIxMixyMixyMyxMU0wgIzEKLSAgICBWU1QxLjMyICB7ZDBbMF19LFtyMl0scjMKLSAgICBWU1QxLjMyICB7ZDRbMF19LFtyMTJdLHIzCi0gICAgVlNUMS4zMiAge2QyWzBdfSxbcjJdCi0gICAgVlNUMS4zMiAge2Q2WzBdfSxbcjEyXQotICAgIEFERCAgICAgIHIxMSxzcCwjMAotICAgIEIgICAgICAgIEwweDQzNAotTDB4MmIwOgotICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMQotICAgIFNVQiAgICAgIHIwLHIwLCMyCi0gICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlCi0gICAgQUREICAgICAgcjEyLHIyLHIzLExTTCAjMQotICAgIFZTVDEuMzIgIHtkMFswXX0sW3IyXSxyMwotICAgIFZTVDEuMzIgIHtkNFswXX0sW3IxMl0scjMKLSAgICBWU1QxLjMyICB7ZDJbMF19LFtyMl0KLSAgICBWU1QxLjMyICB7ZDZbMF19LFtyMTJdCi0gICAgQUREICAgICAgcjExLHNwLCMwCi0gICAgQiAgICAgICAgTDB4NDM0Ci1MMHgyZDg6Ci0gICAgU1VCICAgICAgcjAscjAscjEsTFNMICMxCi0gICAgU1VCICAgICAgcjAscjAsIzIKLSAgICBCTCAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmUKLSAgICBWRVhULjggICBkMTgsZDE4LGQxOSwjNgotICAgIFZFWFQuOCAgIGQyMCxkMjAsZDIxLCM2Ci0gICAgVkVYVC44ICAgZDIyLGQyMixkMjMsIzYKLSAgICBWRVhULjggICBkMjQsZDI0LGQyNSwjNgotICAgIFZRUlNIUlVOLlMxNiBkMTQscTksIzUKLSAgICBWUVJTSFJVTi5TMTYgZDE2LHExMCwjNQotICAgIFZRUlNIUlVOLlMxNiBkMTgscTExLCM1Ci0gICAgVlFSU0hSVU4uUzE2IGQyMCxxMTIsIzUKLSAgICBWUkhBREQuVTggZDAsZDAsZDE0Ci0gICAgVlJIQURELlU4IGQ0LGQ0LGQxOAotICAgIFZSSEFERC5VOCBkMixkMixkMTYKLSAgICBWUkhBREQuVTggZDYsZDYsZDIwCi0gICAgQUREICAgICAgcjEyLHIyLHIzLExTTCAjMQotICAgIFZTVDEuMzIgIHtkMFswXX0sW3IyXSxyMwotICAgIFZTVDEuMzIgIHtkNFswXX0sW3IxMl0scjMKLSAgICBWU1QxLjMyICB7ZDJbMF19LFtyMl0KLSAgICBWU1QxLjMyICB7ZDZbMF19LFtyMTJdCi0gICAgQUREICAgICAgcjExLHNwLCMwCi0gICAgQiAgICAgICAgTDB4NDM0Ci1MMHgzMzA6Ci0gICAgU1VCICAgICAgcjAscjAscjEsTFNMICMxCi0gICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUKLSAgICBWUkhBREQuVTggZDAsZDAsZDEwCi0gICAgVlJIQURELlU4IGQ0LGQ0LGQxMgotICAgIFZSSEFERC5VOCBkMixkMixkMTEKLSAgICBWUkhBREQuVTggZDYsZDYsZDEzCi0gICAgQUREICAgICAgcjEyLHIyLHIzLExTTCAjMQotICAgIFZTVDEuMzIgIHtkMFswXX0sW3IyXSxyMwotICAgIFZTVDEuMzIgIHtkNFswXX0sW3IxMl0scjMKLSAgICBWU1QxLjMyICB7ZDJbMF19LFtyMl0KLSAgICBWU1QxLjMyICB7ZDZbMF19LFtyMTJdCi0gICAgQUREICAgICAgcjExLHNwLCMwCi0gICAgQiAgICAgICAgTDB4NDM0Ci1MMHgzNjQ6Ci0gICAgTU9WICAgICAgcjgscjAKLSAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzEKLSAgICBCTCAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZQotICAgIEFERCAgICAgIHIwLHI4LHIxCi0gICAgU1VCICAgICAgcjAscjAsIzIKLSAgICBCTCAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZQotICAgIFZSSEFERC5VOCBkMjIsZDIyLGQwCi0gICAgVlJIQURELlU4IGQyNixkMjYsZDQKLSAgICBWUkhBREQuVTggZDI0LGQyNCxkMgotICAgIFZSSEFERC5VOCBkMjgsZDI4LGQ2Ci0gICAgQUREICAgICAgcjEyLHIyLHIzLExTTCAjMQotICAgIFZTVDEuMzIgIHtkMjJbMF19LFtyMl0scjMKLSAgICBWU1QxLjMyICB7ZDI2WzBdfSxbcjEyXSxyMwotICAgIFZTVDEuMzIgIHtkMjRbMF19LFtyMl0KLSAgICBWU1QxLjMyICB7ZDI4WzBdfSxbcjEyXQotICAgIEFERCAgICAgIHIxMSxzcCwjMAotICAgIEIgICAgICAgIEwweDQzNAotTDB4M2E4OgotICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMQotICAgIFNVQiAgICAgIHIwLHIwLCMyCi0gICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlCi0gICAgVlFSU0hSVU4uUzE2IGQxNCxxOCwjNQotICAgIFZRUlNIUlVOLlMxNiBkMTYscTksIzUKLSAgICBWUVJTSFJVTi5TMTYgZDE4LHExMCwjNQotICAgIFZRUlNIUlVOLlMxNiBkMjAscTExLCM1Ci0gICAgVlJIQURELlU4IGQwLGQwLGQxNAotICAgIFZSSEFERC5VOCBkNCxkNCxkMTgKLSAgICBWUkhBREQuVTggZDIsZDIsZDE2Ci0gICAgVlJIQURELlU4IGQ2LGQ2LGQyMAotICAgIEFERCAgICAgIHIxMixyMixyMyxMU0wgIzEKLSAgICBWU1QxLjMyICB7ZDBbMF19LFtyMl0scjMKLSAgICBWU1QxLjMyICB7ZDRbMF19LFtyMTJdLHIzCi0gICAgVlNUMS4zMiAge2QyWzBdfSxbcjJdCi0gICAgVlNUMS4zMiAge2Q2WzBdfSxbcjEyXQotICAgIEFERCAgICAgIHIxMSxzcCwjMAotICAgIEIgICAgICAgIEwweDQzNAotTDB4M2YwOgotICAgIE1PViAgICAgIHI4LHIwCi0gICAgQUREICAgICAgcjAscjAsIzEKLSAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzEKLSAgICBCTCAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZQotICAgIEFERCAgICAgIHIwLHI4LHIxCi0gICAgU1VCICAgICAgcjAscjAsIzIKLSAgICBCTCAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZQotICAgIFZSSEFERC5VOCBkMjIsZDIyLGQwCi0gICAgVlJIQURELlU4IGQyNixkMjYsZDQKLSAgICBWUkhBREQuVTggZDI0LGQyNCxkMgotICAgIFZSSEFERC5VOCBkMjgsZDI4LGQ2Ci0gICAgQUREICAgICAgcjEyLHIyLHIzLExTTCAjMQotICAgIFZTVDEuMzIgIHtkMjJbMF19LFtyMl0scjMKLSAgICBWU1QxLjMyICB7ZDI2WzBdfSxbcjEyXSxyMwotICAgIFZTVDEuMzIgIHtkMjRbMF19LFtyMl0KLSAgICBWU1QxLjMyICB7ZDI4WzBdfSxbcjEyXQotICAgIEFERCAgICAgIHIxMSxzcCwjMAotTDB4NDM0OgotICAgIExETSAgICAgIHIxMSx7cjAtcjN9Ci0gICAgU1VCUyAgICAgcjUscjUsIzQKLSAgICBBREQgICAgICByMCxyMCwjNAotICAgIEFERCAgICAgIHIyLHIyLCM0Ci0gICAgQkdUICAgICAgTDB4MmMKLSAgICBTVUJTICAgICByNCxyNCwjNAotICAgIExEUiAgICAgIHI1LFtzcCwjMHg4MF0KLSAgICBBREQgICAgICByMTEsc3AsIzAKLSAgICBBREQgICAgICByMCxyMCxyMSxMU0wgIzIKLSAgICBBREQgICAgICByMixyMixyMyxMU0wgIzIKLSAgICBTVUIgICAgICByMCxyMCxyNQotICAgIFNVQiAgICAgIHIyLHIyLHI1Ci0gICAgQkdUICAgICAgTDB4MmMKLSAgICBNT1YgICAgICByMCwjMAotICAgIEFERCAgICAgIHNwLHNwLCMweDEwCi0gICAgVlBPUCAgICAge2Q4LWQxNX0KLSAgICBQT1AgICAgICB7cjQtcjEyLHBjfQotCi0gICAgLmVuZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDhfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4X3MuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBkMTM1MC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDhfcy5TCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qCi0gKgotICovCi0KLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKLQotICAgIC5hcm0KLSAgICAuZnB1IG5lb24KLSAgICAudGV4dAotICAgIC5hbGlnbiA0Ci0KLWFybVZDTTRQMTBfcEluZGV4VGFibGU4eDg6Ci0gICAgLndvcmQgIE9NWF9WQ19DSFJPTUFfREMtKFAwKzgpLCAgICBPTVhfVkNfQ0hST01BX0hPUi0oUDArOCkKLSAgICAud29yZCAgT01YX1ZDX0NIUk9NQV9WRVJULShQMCs4KSwgIE9NWF9WQ19DSFJPTUFfUExBTkUtKFAwKzgpCi0KLWFybVZDTTRQMTBfTXVsdGlwbGllclRhYmxlQ2hyb21hOHg4OgotICAgIC5od29yZCAgIDMsIDIsIDEsNAotICAgIC5od29yZCAgLTMsLTIsLTEsMAotICAgIC5od29yZCAgIDEsIDIsIDMsNAotCi0gICAgLmdsb2JhbCBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDgKLW9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4ODoKLSAgICBQVVNIICAgICB7cjQtcjEwLGxyfQotICAgIFZQVVNIICAgIHtkOC1kMTV9Ci0gICAgQURSICAgICAgcjgsIGFybVZDTTRQMTBfcEluZGV4VGFibGU4eDgKLSAgICBMRFIgICAgICByNixbc3AsIzB4NjhdCi0gICAgTERSICAgICAgcjQsW3NwLCMweDYwXQotICAgIExEUiAgICAgIHI1LFtzcCwjMHg2NF0KLSAgICBMRFIgICAgICByNyxbc3AsIzB4NmNdCi0gICAgTERSICAgICAgcjgsW3I4LHI2LExTTCAjMl0KLVAwOiBBREQgICAgICBwYyxyOAotCi1PTVhfVkNfQ0hST01BX0RDOgotICAgIFRTVCAgICAgIHI3LCMyCi0gICAgQkVRICAgICAgTDB4ZTgKLSAgICBBREQgICAgICByOSxyMCxyNAotICAgIEFERCAgICAgIHIxMCxyNCxyNAotICAgIFZMRDEuOCAgIHtkMVswXX0sW3IwXSxyMTAKLSAgICBWTEQxLjggICB7ZDFbMV19LFtyOV0scjEwCi0gICAgVkxEMS44ICAge2QxWzJdfSxbcjBdLHIxMAotICAgIFZMRDEuOCAgIHtkMVszXX0sW3I5XSxyMTAKLSAgICBWTEQxLjggICB7ZDFbNF19LFtyMF0scjEwCi0gICAgVkxEMS44ICAge2QxWzVdfSxbcjldLHIxMAotICAgIFZMRDEuOCAgIHtkMVs2XX0sW3IwXSxyMTAKLSAgICBWTEQxLjggICB7ZDFbN119LFtyOV0KLSAgICBUU1QgICAgICByNywjMQotICAgIEJFUSAgICAgIEwweGNjCi0gICAgVkxEMS44ICAge2QwfSxbcjFdCi0gICAgTU9WICAgICAgcjAsIzAKLSAgICBWUEFEREwuVTggZDIsZDAKLSAgICBWUEFEREwuVTE2IGQzLGQyCi0gICAgVlBBRERMLlU4IGQyLGQxCi0gICAgVlBBRERMLlUxNiBkMSxkMgotICAgIFZBREQuSTMyIGQyLGQzLGQxCi0gICAgVlJTSFIuVTMyIGQyLGQyLCMzCi0gICAgVlJTSFIuVTMyIGQzLGQzLCMyCi0gICAgVlJTSFIuVTMyIGQxLGQxLCMyCi0gICAgVk1PVi5JOCAgZDUsIzB4YwotICAgIFZNT1YuSTggIGQ2LCMweDQKLSAgICBWU0hMLkk2NCBkNSxkNSwjMzIKLSAgICBWU0hSLlU2NCBkNixkNiwjMzIKLSAgICBWQURELkk4ICBkNixkNixkNQotICAgIFZUQkwuOCAgIGQwLHtkMi1kM30sZDUKLSAgICBWVEJMLjggICBkNCx7ZDEtZDJ9LGQ2Ci1MMHg5YzoKLSAgICBBREQgICAgICByOSxyMyxyNQotICAgIEFERCAgICAgIHIxMCxyNSxyNQotICAgIFZTVDEuOCAgIHtkMH0sW3IzXSxyMTAKLSAgICBWU1QxLjggICB7ZDB9LFtyOV0scjEwCi0gICAgVlNUMS44ICAge2QwfSxbcjNdLHIxMAotICAgIFZTVDEuOCAgIHtkMH0sW3I5XSxyMTAKLSAgICBWU1QxLjggICB7ZDR9LFtyM10scjEwCi0gICAgVlNUMS44ICAge2Q0fSxbcjldLHIxMAotICAgIFZTVDEuOCAgIHtkNH0sW3IzXSxyMTAKLSAgICBWU1QxLjggICB7ZDR9LFtyOV0KLSAgICBWUE9QICAgICB7ZDgtZDE1fQotICAgIFBPUCAgICAgIHtyNC1yMTAscGN9Ci1MMHhjYzoKLSAgICBNT1YgICAgICByMCwjMAotICAgIFZQQURETC5VOCBkMixkMQotICAgIFZQQURETC5VMTYgZDEsZDIKLSAgICBWUlNIUi5VMzIgZDEsZDEsIzIKLSAgICBWRFVQLjggICBkMCxkMVswXQotICAgIFZEVVAuOCAgIGQ0LGQxWzRdCi0gICAgQiAgICAgICAgTDB4OWMKLUwweGU4OgotICAgIFRTVCAgICAgIHI3LCMxCi0gICAgQkVRICAgICAgTDB4MTE0Ci0gICAgVkxEMS44ICAge2QwfSxbcjFdCi0gICAgTU9WICAgICAgcjAsIzAKLSAgICBWUEFEREwuVTggZDIsZDAKLSAgICBWUEFEREwuVTE2IGQzLGQyCi0gICAgVlJTSFIuVTMyIGQzLGQzLCMyCi0gICAgVk1PVi5JOCAgZDUsIzB4NAotICAgIFZTSEwuSTY0IGQ1LGQ1LCMzMgotICAgIFZUQkwuOCAgIGQwLHtkM30sZDUKLSAgICBCICAgICAgICBMMHgxMWMKLUwweDExNDoKLSAgICBWTU9WLkk4ICBkMCwjMHg4MAotICAgIE1PViAgICAgIHIwLCMwCi1MMHgxMWM6Ci0gICAgQUREICAgICAgcjkscjMscjUKLSAgICBBREQgICAgICByMTAscjUscjUKLSAgICBWU1QxLjggICB7ZDB9LFtyM10scjEwCi0gICAgVlNUMS44ICAge2QwfSxbcjldLHIxMAotICAgIFZTVDEuOCAgIHtkMH0sW3IzXSxyMTAKLSAgICBWU1QxLjggICB7ZDB9LFtyOV0scjEwCi0gICAgVlNUMS44ICAge2QwfSxbcjNdLHIxMAotICAgIFZTVDEuOCAgIHtkMH0sW3I5XSxyMTAKLSAgICBWU1QxLjggICB7ZDB9LFtyM10scjEwCi0gICAgVlNUMS44ICAge2QwfSxbcjldCi0gICAgVlBPUCAgICAge2Q4LWQxNX0KLSAgICBQT1AgICAgICB7cjQtcjEwLHBjfQotT01YX1ZDX0NIUk9NQV9WRVJUOgotICAgIFZMRDEuOCAgIHtkMH0sW3IxXQotICAgIE1PViAgICAgIHIwLCMwCi0gICAgQiAgICAgICAgTDB4MTFjCi1PTVhfVkNfQ0hST01BX0hPUjoKLSAgICBBREQgICAgICByOSxyMCxyNAotICAgIEFERCAgICAgIHIxMCxyNCxyNAotICAgIFZMRDEuOCAgIHtkMFtdfSxbcjBdLHIxMAotICAgIFZMRDEuOCAgIHtkMVtdfSxbcjldLHIxMAotICAgIFZMRDEuOCAgIHtkMltdfSxbcjBdLHIxMAotICAgIFZMRDEuOCAgIHtkM1tdfSxbcjldLHIxMAotICAgIFZMRDEuOCAgIHtkNFtdfSxbcjBdLHIxMAotICAgIFZMRDEuOCAgIHtkNVtdfSxbcjldLHIxMAotICAgIFZMRDEuOCAgIHtkNltdfSxbcjBdLHIxMAotICAgIFZMRDEuOCAgIHtkN1tdfSxbcjldCi0gICAgQiAgICAgICAgTDB4MjhjCi1PTVhfVkNfQ0hST01BX1BMQU5FOgotICAgIEFERCAgICAgIHI5LHIwLHI0Ci0gICAgQUREICAgICAgcjEwLHI0LHI0Ci0gICAgVkxEMS44ICAge2QwfSxbcjFdCi0gICAgVkxEMS44ICAge2QyWzBdfSxbcjJdCi0gICAgVkxEMS44ICAge2QxWzBdfSxbcjBdLHIxMAotICAgIFZMRDEuOCAgIHtkMVsxXX0sW3I5XSxyMTAKLSAgICBWTEQxLjggICB7ZDFbMl19LFtyMF0scjEwCi0gICAgVkxEMS44ICAge2QxWzNdfSxbcjldLHIxMAotICAgIFZMRDEuOCAgIHtkMVs0XX0sW3IwXSxyMTAKLSAgICBWTEQxLjggICB7ZDFbNV19LFtyOV0scjEwCi0gICAgVkxEMS44ICAge2QxWzZdfSxbcjBdLHIxMAotICAgIFZMRDEuOCAgIHtkMVs3XX0sW3I5XQotICAgIFZSRVY2NC44IGQzLGQwCi0gICAgVlNVQkwuVTggcTMsZDMsZDIKLSAgICBWU0hSLlU2NCBkMyxkMywjOAotICAgIFZTVUJMLlU4IHEyLGQzLGQwCi0gICAgVlJFVjY0LjggZDMsZDEKLSAgICBWU1VCTC5VOCBxNyxkMyxkMgotICAgIFZTSFIuVTY0IGQzLGQzLCM4Ci0gICAgVlNVQkwuVTggcTYsZDMsZDEKLSAgICBBRFIgICAgICByMiwgYXJtVkNNNFAxMF9NdWx0aXBsaWVyVGFibGVDaHJvbWE4eDgKLSAgICBWU0hMLkk2NCBkNCxkNCwjMTYKLSAgICBWRVhULjggICBkOSxkNCxkNiwjMgotICAgIFZMRDEuMTYgIHtkMTB9LFtyMl0hCi0gICAgVlNITC5JNjQgZDEyLGQxMiwjMTYKLSAgICBWRVhULjggICBkMTYsZDEyLGQxNCwjMgotICAgIFZNVUwuSTE2IGQxMSxkOSxkMTAKLSAgICBWTVVMLkkxNiBkMyxkMTYsZDEwCi0gICAgVlBBREQuSTE2IGQzLGQxMSxkMwotICAgIFZQQURETC5TMTYgZDMsZDMKLSAgICBWU0hMLkkzMiBkMixkMywjNAotICAgIFZBREQuSTMyIGQzLGQzLGQyCi0gICAgVkxEMS4xNiAge2QxMCxkMTF9LFtyMl0KLSAgICBWUlNIUi5TMzIgZDMsZDMsIzUKLSAgICBWQURETC5VOCBxMCxkMCxkMQotICAgIFZEVVAuMTYgIHEwLGQxWzNdCi0gICAgVlNITC5JMTYgcTAscTAsIzQKLSAgICBWRFVQLjE2ICBxMixkM1swXQotICAgIFZEVVAuMTYgIHEzLGQzWzJdCi0gICAgVk1VTC5JMTYgcTIscTIscTUKLSAgICBWTVVMLkkxNiBxMyxxMyxxNQotICAgIFZBREQuSTE2IHEyLHEyLHEwCi0gICAgVkRVUC4xNiAgcTAsZDZbMF0KLSAgICBWRFVQLjE2ICBxMSxkNlsxXQotICAgIFZEVVAuMTYgIHE0LGQ2WzJdCi0gICAgVkRVUC4xNiAgcTUsZDZbM10KLSAgICBWRFVQLjE2ICBxNixkN1swXQotICAgIFZEVVAuMTYgIHE3LGQ3WzFdCi0gICAgVkRVUC4xNiAgcTgsZDdbMl0KLSAgICBWRFVQLjE2ICBxOSxkN1szXQotICAgIFZBREQuSTE2IHEwLHEyLHEwCi0gICAgVkFERC5JMTYgcTEscTIscTEKLSAgICBWQURELkkxNiBxNCxxMixxNAotICAgIFZBREQuSTE2IHE1LHEyLHE1Ci0gICAgVkFERC5JMTYgcTYscTIscTYKLSAgICBWQURELkkxNiBxNyxxMixxNwotICAgIFZBREQuSTE2IHE4LHEyLHE4Ci0gICAgVkFERC5JMTYgcTkscTIscTkKLSAgICBWUVJTSFJVTi5TMTYgZDAscTAsIzUKLSAgICBWUVJTSFJVTi5TMTYgZDEscTEsIzUKLSAgICBWUVJTSFJVTi5TMTYgZDIscTQsIzUKLSAgICBWUVJTSFJVTi5TMTYgZDMscTUsIzUKLSAgICBWUVJTSFJVTi5TMTYgZDQscTYsIzUKLSAgICBWUVJTSFJVTi5TMTYgZDUscTcsIzUKLSAgICBWUVJTSFJVTi5TMTYgZDYscTgsIzUKLSAgICBWUVJTSFJVTi5TMTYgZDcscTksIzUKLUwweDI4YzoKLSAgICBBREQgICAgICByOSxyMyxyNQotICAgIEFERCAgICAgIHIxMCxyNSxyNQotICAgIFZTVDEuOCAgIHtkMH0sW3IzXSxyMTAKLSAgICBWU1QxLjggICB7ZDF9LFtyOV0scjEwCi0gICAgVlNUMS44ICAge2QyfSxbcjNdLHIxMAotICAgIFZTVDEuOCAgIHtkM30sW3I5XSxyMTAKLSAgICBWU1QxLjggICB7ZDR9LFtyM10scjEwCi0gICAgVlNUMS44ICAge2Q1fSxbcjldLHIxMAotICAgIFZTVDEuOCAgIHtkNn0sW3IzXSxyMTAKLSAgICBWU1QxLjggICB7ZDd9LFtyOV0KLSAgICBNT1YgICAgICByMCwjMAotICAgIFZQT1AgICAgIHtkOC1kMTV9Ci0gICAgUE9QICAgICAge3I0LXIxMCxwY30KLQotICAgIC5lbmQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTZfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTZfcy5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDQ0NjM2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2X3MuUworKysgL2Rldi9udWxsCkBAIC0xLDI1MCArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotLyoKLSAqCi0gKi8KLQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQotCi0gICAgLmFybQotICAgIC5mcHUgbmVvbgotCi0gICAgLnRleHQKLSAgICAuYWxpZ24gNAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIFRoaXMgdGFibGUgZm9yIGltcGxlbWVudGluZyBzd2l0Y2ggY2FzZSBvZiBDIGluIGFzbSBieQotOy8vIHRoZSBtZWh0b2Qgb2YgdHdvIGxldmVscyBvZiBpbmRleGluZy4KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotYXJtVkNNNFAxMF9wSW5kZXhUYWJsZTE2eDE2OgotICAgIC53b3JkICBPTVhfVkNfMTZYMTZfVkVSVC0oUDArOCksIE9NWF9WQ18xNlgxNl9IT1ItKFAwKzgpCi0gICAgLndvcmQgIE9NWF9WQ18xNlgxNl9EQy0oUDArOCksICAgT01YX1ZDXzE2WDE2X1BMQU5FLShQMCs4KQotCi0KLWFybVZDTTRQMTBfTXVsdGlwbGllclRhYmxlMTZ4MTY6Ci0gICAgLmh3b3JkICAgNywgIDYsICA1LCAgNCwgIDMsICAyLCAgMSwgIDgKLSAgICAuaHdvcmQgICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNwotICAgIC5od29yZCAgIDgsICA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1Ci0KLQotICAgIC5nbG9iYWwgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYKLW9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2OgotICAgIFBVU0ggICAgIHtyNC1yMTIsbHJ9Ci0gICAgVlBVU0ggICAge2Q4LWQxNX0KLSAgICBBRFIgICAgICByOSwgYXJtVkNNNFAxMF9wSW5kZXhUYWJsZTE2eDE2Ci0gICAgTERSICAgICAgcjYsW3NwLCMweDcwXQotICAgIExEUiAgICAgIHI0LFtzcCwjMHg2OF0KLSAgICBMRFIgICAgICByNSxbc3AsIzB4NmNdCi0gICAgTERSICAgICAgcjcsW3NwLCMweDc0XQotICAgIE1PViAgICAgIHIxMiwjMHgxMAotICAgIExEUiAgICAgIHI5LFtyOSxyNixMU0wgIzJdCi1QMDogQUREICAgICAgcGMscjkKLU9NWF9WQ18xNlgxNl9WRVJUOgotICAgIFZMRDEuOCAgIHtkMCxkMX0sW3IxXQotICAgIEFERCAgICAgIHI4LHIzLHI1Ci0gICAgQUREICAgICAgcjEwLHI1LHI1Ci0gICAgVlNUMS44ICAge2QwLGQxfSxbcjNdLHIxMAotICAgIFZTVDEuOCAgIHtkMCxkMX0sW3I4XSxyMTAKLSAgICBWU1QxLjggICB7ZDAsZDF9LFtyM10scjEwCi0gICAgVlNUMS44ICAge2QwLGQxfSxbcjhdLHIxMAotICAgIFZTVDEuOCAgIHtkMCxkMX0sW3IzXSxyMTAKLSAgICBWU1QxLjggICB7ZDAsZDF9LFtyOF0scjEwCi0gICAgVlNUMS44ICAge2QwLGQxfSxbcjNdLHIxMAotICAgIFZTVDEuOCAgIHtkMCxkMX0sW3I4XSxyMTAKLSAgICBWU1QxLjggICB7ZDAsZDF9LFtyM10scjEwCi0gICAgVlNUMS44ICAge2QwLGQxfSxbcjhdLHIxMAotICAgIFZTVDEuOCAgIHtkMCxkMX0sW3IzXSxyMTAKLSAgICBWU1QxLjggICB7ZDAsZDF9LFtyOF0scjEwCi0gICAgVlNUMS44ICAge2QwLGQxfSxbcjNdLHIxMAotICAgIFZTVDEuOCAgIHtkMCxkMX0sW3I4XSxyMTAKLSAgICBWU1QxLjggICB7ZDAsZDF9LFtyM10KLSAgICBWU1QxLjggICB7ZDAsZDF9LFtyOF0KLSAgICBNT1YgICAgICByMCwjMAotICAgIFZQT1AgICAgIHtkOC1kMTV9Ci0gICAgUE9QICAgICAge3I0LXIxMixwY30KLU9NWF9WQ18xNlgxNl9IT1I6Ci0gICAgQUREICAgICAgcjgscjAscjQKLSAgICBBREQgICAgICByNCxyNCxyNAotICAgIEFERCAgICAgIHIxMSxyMyxyNQotICAgIEFERCAgICAgIHI1LHI1LHI1Ci1MMHg4YzoKLSAgICBWTEQxLjggICB7ZDJbXSxkM1tdfSxbcjBdLHI0Ci0gICAgVkxEMS44ICAge2QwW10sZDFbXX0sW3I4XSxyNAotICAgIFNVQlMgICAgIHIxMixyMTIsIzgKLSAgICBWU1QxLjggICB7ZDIsZDN9LFtyM10scjUKLSAgICBWU1QxLjggICB7ZDAsZDF9LFtyMTFdLHI1Ci0gICAgVkxEMS44ICAge2QyW10sZDNbXX0sW3IwXSxyNAotICAgIFZMRDEuOCAgIHtkMFtdLGQxW119LFtyOF0scjQKLSAgICBWU1QxLjggICB7ZDIsZDN9LFtyM10scjUKLSAgICBWU1QxLjggICB7ZDAsZDF9LFtyMTFdLHI1Ci0gICAgVkxEMS44ICAge2QyW10sZDNbXX0sW3IwXSxyNAotICAgIFZMRDEuOCAgIHtkMFtdLGQxW119LFtyOF0scjQKLSAgICBWU1QxLjggICB7ZDIsZDN9LFtyM10scjUKLSAgICBWU1QxLjggICB7ZDAsZDF9LFtyMTFdLHI1Ci0gICAgVkxEMS44ICAge2QyW10sZDNbXX0sW3IwXSxyNAotICAgIFZMRDEuOCAgIHtkMFtdLGQxW119LFtyOF0scjQKLSAgICBWU1QxLjggICB7ZDIsZDN9LFtyM10scjUKLSAgICBWU1QxLjggICB7ZDAsZDF9LFtyMTFdLHI1Ci0gICAgQk5FICAgICAgTDB4OGMKLSAgICBNT1YgICAgICByMCwjMAotICAgIFZQT1AgICAgIHtkOC1kMTV9Ci0gICAgUE9QICAgICAge3I0LXIxMixwY30KLU9NWF9WQ18xNlgxNl9EQzoKLSAgICBNT1YgICAgICByMTEsIzAKLSAgICBUU1QgICAgICByNywjMgotICAgIEJFUSAgICAgIEwweDE0YwotICAgIEFERCAgICAgIHI4LHIwLHI0Ci0gICAgQUREICAgICAgcjEwLHI0LHI0Ci0gICAgVkxEMS44ICAge2QyWzBdfSxbcjBdLHIxMAotICAgIFZMRDEuOCAgIHtkMlsxXX0sW3I4XSxyMTAKLSAgICBWTEQxLjggICB7ZDJbMl19LFtyMF0scjEwCi0gICAgVkxEMS44ICAge2QyWzNdfSxbcjhdLHIxMAotICAgIFZMRDEuOCAgIHtkMls0XX0sW3IwXSxyMTAKLSAgICBWTEQxLjggICB7ZDJbNV19LFtyOF0scjEwCi0gICAgVkxEMS44ICAge2QyWzZdfSxbcjBdLHIxMAotICAgIFZMRDEuOCAgIHtkMls3XX0sW3I4XSxyMTAKLSAgICBWTEQxLjggICB7ZDNbMF19LFtyMF0scjEwCi0gICAgVkxEMS44ICAge2QzWzFdfSxbcjhdLHIxMAotICAgIFZMRDEuOCAgIHtkM1syXX0sW3IwXSxyMTAKLSAgICBWTEQxLjggICB7ZDNbM119LFtyOF0scjEwCi0gICAgVkxEMS44ICAge2QzWzRdfSxbcjBdLHIxMAotICAgIFZMRDEuOCAgIHtkM1s1XX0sW3I4XSxyMTAKLSAgICBWTEQxLjggICB7ZDNbNl19LFtyMF0scjEwCi0gICAgVkxEMS44ICAge2QzWzddfSxbcjhdCi0gICAgVlBBRERMLlU4IHEwLHExCi0gICAgQUREICAgICAgcjExLHIxMSwjMQotICAgIFZQQURELkkxNiBkMCxkMCxkMQotICAgIFZQQURETC5VMTYgZDAsZDAKLSAgICBWUEFEREwuVTMyIGQ2LGQwCi0gICAgVlJTSFIuVTY0IGQ4LGQ2LCM0Ci1MMHgxNGM6Ci0gICAgVFNUICAgICAgcjcsIzEKLSAgICBCRVEgICAgICBMMHgxNzAKLSAgICBWTEQxLjggICB7ZDAsZDF9LFtyMV0KLSAgICBBREQgICAgICByMTEscjExLCMxCi0gICAgVlBBRERMLlU4IHEwLHEwCi0gICAgVlBBREQuSTE2IGQwLGQwLGQxCi0gICAgVlBBRERMLlUxNiBkMCxkMAotICAgIFZQQURETC5VMzIgZDcsZDAKLSAgICBWUlNIUi5VNjQgZDgsZDcsIzQKLUwweDE3MDoKLSAgICBDTVAgICAgICByMTEsIzIKLSAgICBCTkUgICAgICBMMHgxODAKLSAgICBWQURELkk2NCBkOCxkNyxkNgotICAgIFZSU0hSLlU2NCBkOCxkOCwjNQotTDB4MTgwOgotICAgIFZEVVAuOCAgIHEzLGQ4WzBdCi0gICAgQ01QICAgICAgcjExLCMwCi0gICAgQUREICAgICAgcjgscjMscjUKLSAgICBBREQgICAgICByMTAscjUscjUKLSAgICBCTkUgICAgICBMMHgxOTgKLSAgICBWTU9WLkk4ICBxMywjMHg4MAotTDB4MTk4OgotICAgIFZTVDEuOCAgIHtkNixkN30sW3IzXSxyMTAKLSAgICBWU1QxLjggICB7ZDYsZDd9LFtyOF0scjEwCi0gICAgVlNUMS44ICAge2Q2LGQ3fSxbcjNdLHIxMAotICAgIFZTVDEuOCAgIHtkNixkN30sW3I4XSxyMTAKLSAgICBWU1QxLjggICB7ZDYsZDd9LFtyM10scjEwCi0gICAgVlNUMS44ICAge2Q2LGQ3fSxbcjhdLHIxMAotICAgIFZTVDEuOCAgIHtkNixkN30sW3IzXSxyMTAKLSAgICBWU1QxLjggICB7ZDYsZDd9LFtyOF0scjEwCi0gICAgVlNUMS44ICAge2Q2LGQ3fSxbcjNdLHIxMAotICAgIFZTVDEuOCAgIHtkNixkN30sW3I4XSxyMTAKLSAgICBWU1QxLjggICB7ZDYsZDd9LFtyM10scjEwCi0gICAgVlNUMS44ICAge2Q2LGQ3fSxbcjhdLHIxMAotICAgIFZTVDEuOCAgIHtkNixkN30sW3IzXSxyMTAKLSAgICBWU1QxLjggICB7ZDYsZDd9LFtyOF0scjEwCi0gICAgVlNUMS44ICAge2Q2LGQ3fSxbcjNdLHIxMAotICAgIFZTVDEuOCAgIHtkNixkN30sW3I4XSxyMTAKLSAgICBNT1YgICAgICByMCwjMAotICAgIFZQT1AgICAgIHtkOC1kMTV9Ci0gICAgUE9QICAgICAge3I0LXIxMixwY30KLU9NWF9WQ18xNlgxNl9QTEFORToKLSAgICBBRFIgICAgICByOSwgYXJtVkNNNFAxMF9NdWx0aXBsaWVyVGFibGUxNngxNgotICAgIFZMRDEuOCAgIHtkMCxkMX0sW3IxXQotICAgIFZMRDEuOCAgIHtkNFswXX0sW3IyXQotICAgIEFERCAgICAgIHI4LHIwLHI0Ci0gICAgQUREICAgICAgcjEwLHI0LHI0Ci0gICAgVkxEMS44ICAge2QyWzBdfSxbcjBdLHIxMAotICAgIFZMRDEuOCAgIHtkMlsxXX0sW3I4XSxyMTAKLSAgICBWTEQxLjggICB7ZDJbMl19LFtyMF0scjEwCi0gICAgVkxEMS44ICAge2QyWzNdfSxbcjhdLHIxMAotICAgIFZMRDEuOCAgIHtkMls0XX0sW3IwXSxyMTAKLSAgICBWTEQxLjggICB7ZDJbNV19LFtyOF0scjEwCi0gICAgVkxEMS44ICAge2QyWzZdfSxbcjBdLHIxMAotICAgIFZMRDEuOCAgIHtkMls3XX0sW3I4XSxyMTAKLSAgICBWTEQxLjggICB7ZDNbMF19LFtyMF0scjEwCi0gICAgVkxEMS44ICAge2QzWzFdfSxbcjhdLHIxMAotICAgIFZMRDEuOCAgIHtkM1syXX0sW3IwXSxyMTAKLSAgICBWTEQxLjggICB7ZDNbM119LFtyOF0scjEwCi0gICAgVkxEMS44ICAge2QzWzRdfSxbcjBdLHIxMAotICAgIFZMRDEuOCAgIHtkM1s1XX0sW3I4XSxyMTAKLSAgICBWTEQxLjggICB7ZDNbNl19LFtyMF0scjEwCi0gICAgVkxEMS44ICAge2QzWzddfSxbcjhdCi0gICAgVlJFVjY0LjggZDUsZDEKLSAgICBWU1VCTC5VOCBxMyxkNSxkNAotICAgIFZTSFIuVTY0IGQ1LGQ1LCM4Ci0gICAgVlNVQkwuVTggcTQsZDUsZDAKLSAgICBWU0hMLkk2NCBkOSxkOSwjMTYKLSAgICBWRVhULjggICBkOSxkOSxkNiwjMgotICAgIFZSRVY2NC44IGQxMixkMwotICAgIFZTVUJMLlU4IHE3LGQxMixkNAotICAgIFZTSFIuVTY0IGQxMixkMTIsIzgKLSAgICBWU1VCTC5VOCBxOCxkMTIsZDIKLSAgICBWTEQxLjE2ICB7ZDIwLGQyMX0sW3I5XSEKLSAgICBWU0hMLkk2NCBkMTcsZDE3LCMxNgotICAgIFZFWFQuOCAgIGQxNyxkMTcsZDE0LCMyCi0gICAgVk1VTEwuUzE2IHExMSxkOCxkMjAKLSAgICBWTVVMTC5TMTYgcTEyLGQxNixkMjAKLSAgICBWTUxBTC5TMTYgcTExLGQ5LGQyMQotICAgIFZNTEFMLlMxNiBxMTIsZDE3LGQyMQotICAgIFZQQURELkkzMiBkMjIsZDIzLGQyMgotICAgIFZQQURELkkzMiBkMjMsZDI1LGQyNAotICAgIFZQQURETC5TMzIgcTExLHExMQotICAgIFZTSEwuSTY0IHExMixxMTEsIzIKLSAgICBWQURELkk2NCBxMTEscTExLHExMgotICAgIFZSU0hSLlM2NCBxMTEscTExLCM2Ci0gICAgVlNITC5JNjQgcTEyLHExMSwjMwotICAgIFZTVUIuSTY0IHExMixxMTIscTExCi0gICAgVkxEMS4xNiAge2QyMCxkMjF9LFtyOV0hCi0gICAgVkRVUC4xNiAgcTYsZDIyWzBdCi0gICAgVkRVUC4xNiAgcTcsZDIzWzBdCi0gICAgVkFEREwuVTggcTExLGQxLGQzCi0gICAgVlNITC5JMTYgcTExLHExMSwjNAotICAgIFZEVVAuMTYgIHExMSxkMjNbM10KLSAgICBWQURELkk2NCBkMSxkMjQsZDI1Ci0gICAgVkxEMS4xNiAge2QyNCxkMjV9LFtyOV0KLSAgICBWRFVQLjE2ICBxMTMsZDFbMF0KLSAgICBWU1VCLkkxNiBxMTMscTExLHExMwotICAgIFZNVUwuSTE2IHE1LHE2LHExMAotICAgIFZNVUwuSTE2IHE2LHE2LHExMgotICAgIFZBREQuSTE2IHEwLHE1LHExMwotICAgIFZBREQuSTE2IHExLHE2LHExMwotTDB4MmQ0OgotICAgIFZRUlNIUlVOLlMxNiBkNixxMCwjNQotICAgIFZRUlNIUlVOLlMxNiBkNyxxMSwjNQotICAgIFNVQlMgICAgIHIxMixyMTIsIzEKLSAgICBWU1QxLjggICB7ZDYsZDd9LFtyM10scjUKLSAgICBWQURELkkxNiBxMCxxMCxxNwotICAgIFZBREQuSTE2IHExLHExLHE3Ci0gICAgQk5FICAgICAgTDB4MmQ0Ci0gICAgTU9WICAgICAgcjAsIzAKLSAgICBWUE9QICAgICB7ZDgtZDE1fQotICAgIFBPUCAgICAgIHtyNC1yMTIscGN9Ci0KLSAgICAuZW5kCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NF9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDRfcy5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGM4NDg1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NF9zLlMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoKLSAqCi0gKi8KLQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQotCi0gICAgLmFybQotICAgIC5mcHUgbmVvbgotCi0gICAgLnRleHQKLSAgICAuYWxpZ24gNAotCi1hcm1WQ000UDEwX3BTd2l0Y2hUYWJsZTR4NDoKLSAgICAud29yZCBPTVhfVkNfNHg0X1ZFUlQtKFAwKzgpLCAgICAgT01YX1ZDXzR4NF9IT1ItKFAwKzgpCi0gICAgLndvcmQgT01YX1ZDXzR4NF9EQy0oUDArOCksICAgICAgIE9NWF9WQ180eDRfRElBR19ETC0oUDArOCkKLSAgICAud29yZCBPTVhfVkNfNHg0X0RJQUdfRFItKFAwKzgpLCAgT01YX1ZDXzR4NF9WUi0oUDArOCkKLSAgICAud29yZCBPTVhfVkNfNHg0X0hELShQMCs4KSwgICAgICAgT01YX1ZDXzR4NF9WTC0oUDArOCkKLSAgICAud29yZCBPTVhfVkNfNHg0X0hVLShQMCs4KQotCi0gICAgLmdsb2JhbCBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQKLW9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NDoKLSAgICBQVVNIICAgICB7cjQtcjEyLGxyfQotICAgIFZQVVNIICAgIHtkOC1kMTJ9Ci0gICAgQURSICAgICAgcjgsIGFybVZDTTRQMTBfcFN3aXRjaFRhYmxlNHg0Ci0gICAgTERSRCAgICAgcjYscjcsW3NwLCMweDU4XQotICAgIExEUkQgICAgIHI0LHI1LFtzcCwjMHg1MF0KLSAgICBMRFIgICAgICByOCxbcjgscjYsTFNMICMyXQotUDA6IEFERCAgICAgIHBjLCByOAotCi1PTVhfVkNfNHg0X0hPUjoKLSAgICBBREQgICAgICByOSxyMCxyNAotICAgIEFERCAgICAgIHIxMCxyNCxyNAotICAgIFZMRDEuOCAgIHtkMFtdfSxbcjBdLHIxMAotICAgIFZMRDEuOCAgIHtkMVtdfSxbcjldLHIxMAotICAgIFZMRDEuOCAgIHtkMltdfSxbcjBdCi0gICAgVkxEMS44ICAge2QzW119LFtyOV0KLSAgICBBREQgICAgICByMTEscjMscjUKLSAgICBBREQgICAgICByMTIscjUscjUKLSAgICBWU1QxLjMyICB7ZDBbMF19LFtyM10scjEyCi0gICAgVlNUMS4zMiAge2QxWzBdfSxbcjExXSxyMTIKLSAgICBWU1QxLjMyICB7ZDJbMF19LFtyM10KLSAgICBWU1QxLjMyICB7ZDNbMF19LFtyMTFdCi0gICAgQiAgICAgICAgTDB4MzQ4Ci1PTVhfVkNfNHg0X1ZFUlQ6Ci0gICAgVkxEMS4zMiAge2QwWzBdfSxbcjFdCi0gICAgQUREICAgICAgcjExLHIzLHI1Ci0gICAgQUREICAgICAgcjEyLHI1LHI1Ci1MMHg1ODoKLSAgICBWU1QxLjMyICB7ZDBbMF19LFtyM10scjEyCi0gICAgVlNUMS4zMiAge2QwWzBdfSxbcjExXSxyMTIKLSAgICBWU1QxLjMyICB7ZDBbMF19LFtyM10KLSAgICBWU1QxLjMyICB7ZDBbMF19LFtyMTFdCi0gICAgQiAgICAgICAgTDB4MzQ4Ci1PTVhfVkNfNHg0X0RDOgotICAgIFRTVCAgICAgIHI3LCMyCi0gICAgQkVRICAgICAgTDB4ZGMKLSAgICBBREQgICAgICByOSxyMCxyNAotICAgIEFERCAgICAgIHIxMCxyNCxyNAotICAgIFZMRDEuOCAgIHtkMFswXX0sW3IwXSxyMTAKLSAgICBWTEQxLjggICB7ZDBbMV19LFtyOV0scjEwCi0gICAgVkxEMS44ICAge2QwWzJdfSxbcjBdCi0gICAgVkxEMS44ICAge2QwWzNdfSxbcjldCi0gICAgVFNUICAgICAgcjcsIzEKLSAgICBCRVEgICAgICBMMHhiYwotICAgIFZMRDEuMzIgIHtkMFsxXX0sW3IxXQotICAgIE1PViAgICAgIHIwLCMwCi0gICAgVlBBRERMLlU4IGQxLGQwCi0gICAgVlBBRERMLlUxNiBkMSxkMQotICAgIFZQQURETC5VMzIgZDEsZDEKLSAgICBWUlNIUi5VNjQgZDEsZDEsIzMKLSAgICBBREQgICAgICByMTEscjMscjUKLSAgICBBREQgICAgICByMTIscjUscjUKLSAgICBWRFVQLjggICBkMCxkMVswXQotICAgIEIgICAgICAgIEwweDU4Ci1MMHhiYzoKLSAgICBNT1YgICAgICByMCwjMAotICAgIFZQQURETC5VOCBkMSxkMAotICAgIFZQQURETC5VMTYgZDEsZDEKLSAgICBWUlNIUi5VMzIgZDEsZDEsIzIKLSAgICBBREQgICAgICByMTEscjMscjUKLSAgICBBREQgICAgICByMTIscjUscjUKLSAgICBWRFVQLjggICBkMCxkMVswXQotICAgIEIgICAgICAgIEwweDU4Ci1MMHhkYzoKLSAgICBUU1QgICAgICByNywjMQotICAgIEJFUSAgICAgIEwweDEwOAotICAgIFZMRDEuMzIgIHtkMFswXX0sW3IxXQotICAgIE1PViAgICAgIHIwLCMwCi0gICAgVlBBRERMLlU4IGQxLGQwCi0gICAgVlBBRERMLlUxNiBkMSxkMQotICAgIFZSU0hSLlUzMiBkMSxkMSwjMgotICAgIEFERCAgICAgIHIxMSxyMyxyNQotICAgIEFERCAgICAgIHIxMixyNSxyNQotICAgIFZEVVAuOCAgIGQwLGQxWzBdCi0gICAgQiAgICAgICAgTDB4NTgKLUwweDEwODoKLSAgICBWTU9WLkk4ICBkMCwjMHg4MAotICAgIE1PViAgICAgIHIwLCMwCi0gICAgQUREICAgICAgcjExLHIzLHI1Ci0gICAgQUREICAgICAgcjEyLHI1LHI1Ci0gICAgQiAgICAgICAgTDB4NTgKLU9NWF9WQ180eDRfRElBR19ETDoKLSAgICBUU1QgICAgICByNywjMHg0MAotICAgIEJFUSAgICAgIEwweDEzOAotICAgIFZMRDEuOCAgIHtkM30sW3IxXQotICAgIFZEVVAuOCAgIGQyLGQzWzddCi0gICAgVkVYVC44ICAgZDQsZDMsZDIsIzEKLSAgICBWRVhULjggICBkNSxkMyxkMiwjMgotICAgIEIgICAgICAgIEwweDE0YwotTDB4MTM4OgotICAgIFZMRDEuMzIgIHtkMFsxXX0sW3IxXQotICAgIFZEVVAuOCAgIGQyLGQwWzddCi0gICAgVkVYVC44ICAgZDMsZDAsZDIsIzQKLSAgICBWRVhULjggICBkNCxkMCxkMiwjNQotICAgIFZFWFQuOCAgIGQ1LGQwLGQyLCM2Ci1MMHgxNGM6Ci0gICAgVkhBREQuVTggZDYsZDMsZDUKLSAgICBWUkhBREQuVTggZDYsZDYsZDQKLSAgICBWU1QxLjMyICB7ZDZbMF19LFtyM10scjUKLSAgICBWRVhULjggICBkNixkNixkNiwjMQotICAgIFZTVDEuMzIgIHtkNlswXX0sW3IzXSxyNQotICAgIFZFWFQuOCAgIGQ2LGQ2LGQ2LCMxCi0gICAgVlNUMS4zMiAge2Q2WzBdfSxbcjNdLHI1Ci0gICAgVkVYVC44ICAgZDYsZDYsZDYsIzEKLSAgICBWU1QxLjMyICB7ZDZbMF19LFtyM10KLSAgICBCICAgICAgICBMMHgzNDgKLU9NWF9WQ180eDRfRElBR19EUjoKLSAgICBWTEQxLjMyICB7ZDBbMF19LFtyMV0KLSAgICBWTEQxLjggICB7ZDFbN119LFtyMl0KLSAgICBBREQgICAgICByOSxyMCxyNAotICAgIEFERCAgICAgIHIxMCxyNCxyNAotICAgIEFERCAgICAgIHIxLHIzLHI1Ci0gICAgVkxEMS44ICAge2QxWzZdfSxbcjBdLHIxMAotICAgIFZMRDEuOCAgIHtkMVs1XX0sW3I5XSxyMTAKLSAgICBWTEQxLjggICB7ZDFbNF19LFtyMF0KLSAgICBWTEQxLjggICB7ZDFbM119LFtyOV0KLSAgICBWRVhULjggICBkMyxkMSxkMCwjMwotICAgIEFERCAgICAgIHI0LHIxLHI1Ci0gICAgVkVYVC44ICAgZDQsZDEsZDAsIzQKLSAgICBBREQgICAgICByNixyNCxyNQotICAgIFZFWFQuOCAgIGQ1LGQxLGQwLCM1Ci0gICAgVkhBREQuVTggZDYsZDMsZDUKLSAgICBWUkhBREQuVTggZDYsZDYsZDQKLSAgICBWU1QxLjMyICB7ZDZbMF19LFtyNl0KLSAgICBWRVhULjggICBkNixkNixkNiwjMQotICAgIFZTVDEuMzIgIHtkNlswXX0sW3I0XQotICAgIFZFWFQuOCAgIGQ2LGQ2LGQ2LCMxCi0gICAgVlNUMS4zMiAge2Q2WzBdfSxbcjFdCi0gICAgVkVYVC44ICAgZDYsZDYsZDYsIzEKLSAgICBWU1QxLjMyICB7ZDZbMF19LFtyM10KLSAgICBCICAgICAgICBMMHgzNDgKLU9NWF9WQ180eDRfVlI6Ci0gICAgVkxEMS4zMiAge2QwWzBdfSxbcjFdCi0gICAgVkxEMS44ICAge2QwWzddfSxbcjJdCi0gICAgVkxEMS44ICAge2QxWzddfSxbcjBdLHI0Ci0gICAgVkxEMS44ICAge2QyWzddfSxbcjBdLHI0Ci0gICAgVkxEMS44ICAge2QxWzZdfSxbcjBdCi0gICAgVkVYVC44ICAgZDEyLGQwLGQwLCM3Ci0gICAgVkVYVC44ICAgZDMsZDEsZDEyLCM2Ci0gICAgVkVYVC44ICAgZDQsZDIsZDEyLCM3Ci0gICAgVkVYVC44ICAgZDUsZDEsZDAsIzcKLSAgICBWRVhULjggICBkNixkMixkMCwjNwotICAgIFZFWFQuOCAgIGQxMSxkMSxkMTIsIzcKLSAgICBWSEFERC5VOCBkOCxkNixkMTIKLSAgICBWUkhBREQuVTggZDgsZDgsZDExCi0gICAgVkhBREQuVTggZDcsZDMsZDUKLSAgICBWUkhBREQuVTggZDcsZDcsZDQKLSAgICBWRVhULjggICBkMTAsZDgsZDgsIzEKLSAgICBBREQgICAgICByMTEscjMscjUKLSAgICBBREQgICAgICByMTIscjUscjUKLSAgICBWRVhULjggICBkOSxkNyxkNywjMQotICAgIFZTVDEuMzIgIHtkMTBbMF19LFtyM10scjEyCi0gICAgVlNUMS4zMiAge2Q5WzBdfSxbcjExXSxyMTIKLSAgICBWU1QxLjMyICB7ZDhbMF19LFtyM10scjEyCi0gICAgVlNUMS4zMiAge2Q3WzBdfSxbcjExXQotICAgIEIgICAgICAgIEwweDM0OAotT01YX1ZDXzR4NF9IRDoKLSAgICBWTEQxLjggICB7ZDB9LFtyMV0KLSAgICBWTEQxLjggICB7ZDFbN119LFtyMl0KLSAgICBBREQgICAgICByOSxyMCxyNAotICAgIEFERCAgICAgIHIxMCxyNCxyNAotICAgIFZMRDEuOCAgIHtkMVs2XX0sW3IwXSxyMTAKLSAgICBWTEQxLjggICB7ZDFbNV19LFtyOV0scjEwCi0gICAgVkxEMS44ICAge2QxWzRdfSxbcjBdCi0gICAgVkxEMS44ICAge2QxWzNdfSxbcjldCi0gICAgVkVYVC44ICAgZDMsZDEsZDAsIzMKLSAgICBWRVhULjggICBkNCxkMSxkMCwjMgotICAgIFZFWFQuOCAgIGQ1LGQxLGQwLCMxCi0gICAgVkhBREQuVTggZDcsZDMsZDUKLSAgICBWUkhBREQuVTggZDcsZDcsZDQKLSAgICBWUkhBREQuVTggZDgsZDQsZDMKLSAgICBWU0hMLkk2NCBkOCxkOCwjMjQKLSAgICBWU0hMLkk2NCBkNixkNywjMTYKLSAgICBWWklQLjggICBkOCxkNgotICAgIFZFWFQuOCAgIGQ3LGQ3LGQ3LCM2Ci0gICAgVkVYVC44ICAgZDgsZDYsZDcsIzIKLSAgICBBREQgICAgICByMTEscjMscjUKLSAgICBBREQgICAgICByMTIscjUscjUKLSAgICBWU1QxLjMyICB7ZDhbMV19LFtyM10scjEyCi0gICAgVlNUMS4zMiAge2Q2WzFdfSxbcjExXSxyMTIKLSAgICBWU1QxLjMyICB7ZDhbMF19LFtyM10KLSAgICBWU1QxLjMyICB7ZDZbMF19LFtyMTFdCi0gICAgQiAgICAgICAgTDB4MzQ4Ci1PTVhfVkNfNHg0X1ZMOgotICAgIFRTVCAgICAgIHI3LCMweDQwCi0gICAgQkVRICAgICAgTDB4MmI0Ci0gICAgVkxEMS44ICAge2QzfSxbcjFdCi0gICAgVkVYVC44ICAgZDQsZDMsZDMsIzEKLSAgICBWRVhULjggICBkNSxkNCxkNCwjMQotICAgIEIgICAgICAgIEwweDJjOAotTDB4MmI0OgotICAgIFZMRDEuMzIgIHtkMFsxXX0sW3IxXQotICAgIFZEVVAuOCAgIGQyLGQwWzddCi0gICAgVkVYVC44ICAgZDMsZDAsZDIsIzQKLSAgICBWRVhULjggICBkNCxkMCxkMiwjNQotICAgIFZFWFQuOCAgIGQ1LGQwLGQyLCM2Ci1MMHgyYzg6Ci0gICAgVlJIQURELlU4IGQ3LGQ0LGQzCi0gICAgVkhBREQuVTggZDEwLGQzLGQ1Ci0gICAgVlJIQURELlU4IGQxMCxkMTAsZDQKLSAgICBWRVhULjggICBkOCxkNyxkNywjMQotICAgIEFERCAgICAgIHIxMSxyMyxyNQotICAgIEFERCAgICAgIHIxMixyNSxyNQotICAgIFZFWFQuOCAgIGQ5LGQxMCxkOCwjMQotICAgIFZTVDEuMzIgIHtkN1swXX0sW3IzXSxyMTIKLSAgICBWU1QxLjMyICB7ZDEwWzBdfSxbcjExXSxyMTIKLSAgICBWU1QxLjMyICB7ZDhbMF19LFtyM10KLSAgICBWU1QxLjMyICB7ZDlbMF19LFtyMTFdCi0gICAgQiAgICAgICAgTDB4MzQ4Ci1PTVhfVkNfNHg0X0hVOgotICAgIEFERCAgICAgIHI5LHIwLHI0Ci0gICAgQUREICAgICAgcjEwLHI0LHI0Ci0gICAgVkxEMS44ICAge2QxWzRdfSxbcjBdLHIxMAotICAgIFZMRDEuOCAgIHtkMVs1XX0sW3I5XSxyMTAKLSAgICBWTEQxLjggICB7ZDFbNl19LFtyMF0KLSAgICBWTEQxLjggICB7ZDFbN119LFtyOV0KLSAgICBWRFVQLjggICBkMixkMVs3XQotICAgIFZFWFQuOCAgIGQzLGQxLGQyLCM0Ci0gICAgVkVYVC44ICAgZDQsZDEsZDIsIzUKLSAgICBWRVhULjggICBkNSxkMSxkMiwjNgotICAgIFZIQURELlU4IGQ3LGQzLGQ1Ci0gICAgVlJIQURELlU4IGQ3LGQ3LGQ0Ci0gICAgVlJIQURELlU4IGQ4LGQ0LGQzCi0gICAgVlpJUC44ICAgZDgsZDcKLSAgICBWU1QxLjMyICB7ZDhbMF19LFtyM10scjUKLSAgICBWRVhULjggICBkOCxkOCxkOCwjMgotICAgIFZTVDEuMzIgIHtkOFswXX0sW3IzXSxyNQotICAgIFZFWFQuOCAgIGQ4LGQ4LGQ4LCMyCi0gICAgVlNUMS4zMiAge2Q4WzBdfSxbcjNdLHI1Ci0gICAgVlNUMS4zMiAge2Q3WzBdfSxbcjNdCi1MMHgzNDg6Ci0gICAgTU9WICAgICAgcjAsIzAKLSAgICBWUE9QICAgICB7ZDgtZDEyfQotICAgIFBPUCAgICAgIHtyNC1yMTIscGN9Ci0KLSAgICAuZW5kCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXJfcy5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGY1MTAzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXJfcy5TCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoKLSAqCi0gKi8KLQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQotCi0gICAgLmFybQotICAgIC5mcHUgbmVvbgotICAgIC50ZXh0Ci0gICAgLnN5bnRheCB1bmlmaWVkCi0KLSAgICAuZ2xvYmFsIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIKLW9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXI6Ci0gICAgcHVzaCAgICB7cjQtcjEwLCBscn0KLSAgICBsZHIgICAgIHI5LCBbcjAsIzBdCi0gICAgdm1vdi5pMTYgICAgZDAsICMwCi0gICAgbW92ICAgICByOCwgIzB4MWYKLSAgICB2c3QxLjE2ICAgIHtkMH0sIFtyMV0KLSAgICBsZHJiICAgIHI2LCBbcjldLCAjMQotdW5wYWNrTG9vcDoKLSAgICB0c3QgICAgIHI2LCAjMHgxMAotICAgIGxkcnNibmUgcjUsIFtyOSwgIzFdCi0gICAgbGRyYm5lICByNCwgW3I5XSwgIzIKLSAgICBhbmQgICAgIHI3LCByOCwgcjYsIGxzbCAjMQotICAgIGxkcnNiZXEgcjQsIFtyOV0sICMxCi0gICAgb3JybmUgICByNCwgcjQsIHI1LCBsc2wgIzgKLSAgICB0c3QgICAgIHI2LCAjMHgyMAotICAgIGxkcmJlcSAgcjYsIFtyOV0sICMxCi0gICAgc3RyaCAgICByNCwgW3IxLCByN10KLSAgICBiZXEgICAgIHVucGFja0xvb3AKLSAgICBsZG1pYSAgIHIxLCB7cjMsIHI0fQotICAgIHN0ciAgICAgcjksIFtyMCwgIzBdCi0gICAgbGRyICAgICByNSwgLkxhcm1WQ000UDEwX1FQRGl2VGFibGUKLVAwOiBhZGQgICAgIHI1LCBwYwotICAgIGxkciAgICAgcjYsIC5MYXJtVkNNNFAxMF9WTWF0cml4UVBNb2RUYWJsZQotUDE6IGFkZCAgICAgcjYsIHBjCi0gICAgc2FkZHN1YnggICAgICAgIHIzLCByMywgcjMKLSAgICBzYWRkc3VieCAgICAgICAgcjQsIHI0LCByNAotICAgIGxkcnNiICAgcjksIFtyNSwgcjJdCi0gICAgbGRyc2IgICByMiwgW3I2LCByMl0KLSAgICBzYWRkMTYgIHI1LCByMywgcjQKLSAgICBzc3ViMTYgIHI2LCByMywgcjQKLSAgICBsc2wgICAgIHIyLCByMiwgcjkKLSAgICB2bW92ICAgIGQwLCByNSwgcjYKLSAgICB2cmV2MzIuMTYgIGQwLCBkMAotICAgIHZkdXAuMTYgICAgZDEsIHIyCi0gICAgdm11bGwuczE2ICAgcTEsIGQwLCBkMQotICAgIHZzaHJuLmkzMiAgIGQyLCBxMSwgIzEKLSAgICB2c3QxLjE2ICAgIHtkMn0sIFtyMV0KLSAgICBtb3YgICAgIHIwLCAjMAotICAgIHBvcCAgICAge3I0LXIxMCwgcGN9Ci0KLS5MYXJtVkNNNFAxMF9RUERpdlRhYmxlOgotICAgIC53b3JkIGFybVZDTTRQMTBfUVBEaXZUYWJsZS0oUDArOCkKLS5MYXJtVkNNNFAxMF9WTWF0cml4UVBNb2RUYWJsZToKLSAgICAud29yZCBhcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlLShQMSs4KQotCi0gICAgLmVuZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXJfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXJfcy5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDEwMzBhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyX3MuUworKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qCi0gKgotICovCi0KLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKLQotICAgIC5hcm0KLSAgICAuZnB1IG5lb24KLSAgICAudGV4dAotCi0gICAgLmdsb2JhbCBhcm1WQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRMdW1hREM0eDQKLWFybVZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudEx1bWFEQzR4NDoKLSAgICBQVVNIICAgICB7cjQtcjYsbHJ9Ci0gICAgVlBVU0ggICAge2Q4LWQxM30KLSAgICBWTEQ0LjE2ICB7ZDAsZDEsZDIsZDN9LFtyMF0KLSAgICBMRFIgICAgICByMiwgLkxhcm1WQ000UDEwX1FQRGl2VGFibGUKLVAwOiBBREQgICAgICByMiwgcGMKLSAgICBMRFIgICAgICByMywgLkxhcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlCi1QMTogQUREICAgICAgcjMsIHBjCi0gICAgVkFERC5JMTYgZDQsZDAsZDEKLSAgICBWQURELkkxNiBkNSxkMixkMwotICAgIFZTVUIuSTE2IGQ2LGQwLGQxCi0gICAgTERSU0IgICAgcjQsW3IyLHIxXQotICAgIFZTVUIuSTE2IGQ3LGQyLGQzCi0gICAgTERSU0IgICAgcjUsW3IzLHIxXQotICAgIFZBREQuSTE2IGQwLGQ0LGQ1Ci0gICAgVlNVQi5JMTYgZDEsZDQsZDUKLSAgICBWU1VCLkkxNiBkMixkNixkNwotICAgIExTTCAgICAgIHI1LHI1LHI0Ci0gICAgVkFERC5JMTYgZDMsZDYsZDcKLSAgICBWVFJOLjE2ICBkMCxkMQotICAgIFZUUk4uMTYgIGQyLGQzCi0gICAgVlRSTi4zMiAgcTAscTEKLSAgICBWQURELkkxNiBkNCxkMCxkMQotICAgIFZBREQuSTE2IGQ1LGQyLGQzCi0gICAgVlNVQi5JMTYgZDYsZDAsZDEKLSAgICBWU1VCLkkxNiBkNyxkMixkMwotICAgIFZBREQuSTE2IGQwLGQ0LGQ1Ci0gICAgVlNVQi5JMTYgZDEsZDQsZDUKLSAgICBWU1VCLkkxNiBkMixkNixkNwotICAgIFZBREQuSTE2IGQzLGQ2LGQ3Ci0gICAgVkRVUC4xNiAgZDUscjUKLSAgICBWTU9WLkkzMiBxMywjMHgyCi0gICAgVk1PVi5JMzIgcTQsIzB4MgotICAgIFZNT1YuSTMyIHE1LCMweDIKLSAgICBWTU9WLkkzMiBxNiwjMHgyCi0gICAgVk1MQUwuUzE2IHEzLGQwLGQ1Ci0gICAgVk1MQUwuUzE2IHE0LGQxLGQ1Ci0gICAgVk1MQUwuUzE2IHE1LGQyLGQ1Ci0gICAgVk1MQUwuUzE2IHE2LGQzLGQ1Ci0gICAgVlNIUk4uSTMyIGQwLHEzLCMyCi0gICAgVlNIUk4uSTMyIGQxLHE0LCMyCi0gICAgVlNIUk4uSTMyIGQyLHE1LCMyCi0gICAgVlNIUk4uSTMyIGQzLHE2LCMyCi0gICAgVlNUMS4xNiAge2QwLGQxLGQyLGQzfSxbcjBdCi0gICAgVlBPUCAgICAge2Q4LWQxM30KLSAgICBQT1AgICAgICB7cjQtcjYscGN9Ci0KLS5MYXJtVkNNNFAxMF9RUERpdlRhYmxlOgotICAgIC53b3JkIGFybVZDTTRQMTBfUVBEaXZUYWJsZS0oUDArOCkKLS5MYXJtVkNNNFAxMF9WTWF0cml4UVBNb2RUYWJsZToKLSAgICAud29yZCBhcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlLShQMSs4KQotCi0uZ2xvYmFsIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyCi1vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcjoKLSAgICBQVVNIICAgICB7cjQtcjYsbHJ9Ci0gICAgTU9WICAgICAgcjQscjEKLSAgICBNT1YgICAgICByNSxyMgotICAgIEJMICAgICAgIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQKLSAgICBNT1YgICAgICByMCxyNAotICAgIE1PViAgICAgIHIxLHI1Ci0gICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50THVtYURDNHg0Ci0gICAgTU9WICAgICAgcjAsIzAKLSAgICBQT1AgICAgICB7cjQtcjYscGN9Ci0KLSAgICAuZW5kCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL2FwaS9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2JjNWZmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL2FwaS9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDEyMjkwCi0gKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKgotICogRmlsZTogICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlcy5oCi0gKiBEZXNjcmlwdGlvbjogRGVjbGFyZXMgVGFibGVzIHVzZWQgZm9yIEh1ZmZmbWFuIGNvZGluZyBhbmQgZGVjb2RpbmcgCi0gKiAgICAgICAgICAgICAgaW4gTVA0UDIgY29kZWMuCi0gKgotICovCi0gCi0jaWZuZGVmIF9PTVhIVUZGVEFCX0hfCi0jZGVmaW5lIF9PTVhIVUZGVEFCX0hfCi0KLQotZXh0ZXJuIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAyX0ludHJhVmxjTDBMMVsyMDBdOwotCi0KLWV4dGVybiBjb25zdCBPTVhfVTE2IGFybVZDTTRQMl9JbnRlclZsY0wwTDFbMjAwXTsKLQotZXh0ZXJuIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAyX2FJbnRyYURDTHVtYUNocm9tYUluZGV4WzY0XTsKLS8vZXh0ZXJuIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAyX2FJbnRyYURDQ2hyb21hSW5kZXhbMzJdOwotZXh0ZXJuIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAyX2FWbGNNVkRbMTI0XTsKLQotZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50ZXJMMEwxTE1BWFs3M107Ci1leHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRlckwwTDFSTUFYWzM1XTsKLWV4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDBMMUxNQVhbNTNdOwotZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50cmFMMEwxUk1BWFs0MF0KLQotI2VuZGlmIC8qIF9PTVhIVUZGVEFCX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9hcGkvYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL2FwaS9hcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDY0YTY4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL2FwaS9hcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgMTIyOTAKLSAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqCi0gKiBGaWxlOiAgICAgICAgYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuaAotICogRGVzY3JpcHRpb246IERlY2xhcmVzIFRhYmxlcyB1c2VkIGZvciBaaWd6YWcgc2NhbiBpbiBNUDRQMiBjb2RlYy4KLSAqCi0gKi8KLSAKLSNpZm5kZWYgX09NWFpJR1pBR1RBQl9ICi0jZGVmaW5lIF9PTVhaSUdaQUdUQUJfSAotCi1leHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbiBbMTkyXTsKLS8vZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfYUhvcml6b250YWxaaWd6YWdTY2FuIFs2NF07Ci0vL2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX2FWZXJ0aWNhbFppZ3phZ1NjYW4gWzY0XTsKLQotI2VuZGlmIC8qIF9PTVhaSUdaQUdUQUJfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQ2xpcDhfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9DbGlwOF9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmODMwZmMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9DbGlwOF9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOyAvKioKLTsgKiAKLTsgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfQ2xpcDhfcy5zCi07ICogT3Blbk1BWCBETDogdjEuMC4yCi07ICogUmV2aXNpb246ICAgMTIyOTAKLTsgKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLTsgKiAKLTsgKiAKLTsgKiAKLTsgKgotOyAqIERlc2NyaXB0aW9uOiAKLTsgKiBDb250YWlucyBtb2R1bGUgZm9yIENsaXBwaW5nIDE2IGJpdCB2YWx1ZSB0byBbMCwyNTVdIFJhbmdlCi07ICovIAotCi0gICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgCi0KLSAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKLQotICAgICAgSUYgQ29ydGV4QTgKLTsvL0lucHV0IEFyZ3VtZW50cwotCi1wU3JjICAgICAgICAgICAgICAgICBSTiAwCi1wRHN0ICAgICAgICAgICAgICAgICBSTiAxCi1zdGVwICAgICAgICAgICAgICAgICBSTiAyCi0KLTsvLyBOZW9uIFJlZ2lzdGVycwotCi1xeDAgICAgICAgICAgICAgICAgICBRTiAgUTAuUzE2ICAgICAgICAgICAgICAgICAgCi1keDAwICAgICAgICAgICAgICAgICBETiAgRDAuUzE2Ci1keDAxICAgICAgICAgICAgICAgICBETiAgRDEuUzE2Ci1xeDEgICAgICAgICAgICAgICAgICBRTiAgUTEuUzE2Ci1keDEwICAgICAgICAgICAgICAgICBETiAgRDIuUzE2Ci1keDExICAgICAgICAgICAgICAgICBETiAgRDMuUzE2Ci0KLXF4MiAgICAgICAgICAgICAgICAgIFFOICBRMi5TMTYgICAgICAgICAgICAgICAgICAKLWR4MjAgICAgICAgICAgICAgICAgIEROICBENC5TMTYKLWR4MjEgICAgICAgICAgICAgICAgIEROICBENS5TMTYKLXF4MyAgICAgICAgICAgICAgICAgIFFOICBRMy5TMTYKLWR4MzAgICAgICAgICAgICAgICAgIEROICBENi5TMTYKLWR4MzEgICAgICAgICAgICAgICAgIEROICBENy5TMTYKLQotCi1kY2xpcDAgICAgICAgICAgICAgICBETiAgRDAuVTgKLWRjbGlwMSAgICAgICAgICAgICAgIEROICBEMi5VOCAKLWRjbGlwMiAgICAgICAgICAgICAgIEROICBENC5VOAotZGNsaXAzICAgICAgICAgICAgICAgRE4gIEQ2LlU4Ci0gCi0gICAgICAgTV9TVEFSVCBhcm1WQ000UDJfQ2xpcDgKLQotICAgICAgIFZMRDEgICAgICAgICAge2R4MDAsZHgwMSxkeDEwLGR4MTF9LFtwU3JjXSEgICAgICAgICAgOy8vIExvYWQgMTYgZW50cmllcyBmcm9tIHBTcmMKLSAgICAgICBWTEQxICAgICAgICAgIHtkeDIwLGR4MjEsZHgzMCxkeDMxfSxbcFNyY10hICAgICAgICAgIDsvLyBMb2FkIG5leHQgMTYgZW50cmllcyBmcm9tIHBTcmMgIAotICAgICAgIFZRU0hSVU4gICAgICAgZGNsaXAwLHF4MCwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGRjbGlwMFtpXT1jbGlwIHF4MFtpXSB0byBbMCwyNTVdCi0gICAgICAgVlFTSFJVTiAgICAgICBkY2xpcDEscXgxLCMwICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gZGNsaXAxW2ldPWNsaXAgcXgxW2ldIHRvIFswLDI1NV0KLSAgICAgICBWU1QxICAgICAgICAgIHtkY2xpcDB9LFtwRHN0XSxzdGVwICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSA4IGJ5dGVzIGFuZCBwRHN0PXBEc3Qrc3RlcAotICAgICAgIFZTVDEgICAgICAgICAge2RjbGlwMX0sW3BEc3RdLHN0ZXAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIDggYnl0ZXMgYW5kIHBEc3Q9cERzdCtzdGVwCi0gICAgICAgVlFTSFJVTiAgICAgICBkY2xpcDIscXgyLCMwCi0gICAgICAgVlFTSFJVTiAgICAgICBkY2xpcDMscXgzLCMwCi0gICAgICAgVlNUMSAgICAgICAgICB7ZGNsaXAyfSxbcERzdF0sc3RlcAotICAgICAgIFZTVDEgICAgICAgICAge2RjbGlwM30sW3BEc3RdLHN0ZXAKLSAgICAgICAKLSAgICAgICBWTEQxICAgICAgICAgIHtkeDAwLGR4MDEsZHgxMCxkeDExfSxbcFNyY10hICAgICAgICAgIDsvLyBMb2FkIDE2IGVudHJpZXMgZnJvbSBwU3JjCi0gICAgICAgVkxEMSAgICAgICAgICB7ZHgyMCxkeDIxLGR4MzAsZHgzMX0sW3BTcmNdISAgICAgICAgICA7Ly8gTG9hZCBuZXh0IDE2IGVudHJpZXMgZnJvbSBwU3JjICAKLSAgICAgICBWUVNIUlVOICAgICAgIGRjbGlwMCxxeDAsIzAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBkY2xpcDBbaV09Y2xpcCBxeDBbaV0gdG8gWzAsMjU1XQotICAgICAgIFZRU0hSVU4gICAgICAgZGNsaXAxLHF4MSwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGRjbGlwMVtpXT1jbGlwIHF4MVtpXSB0byBbMCwyNTVdCi0gICAgICAgVlNUMSAgICAgICAgICB7ZGNsaXAwfSxbcERzdF0sc3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUgOCBieXRlcyBhbmQgcERzdD1wRHN0K3N0ZXAKLSAgICAgICBWU1QxICAgICAgICAgIHtkY2xpcDF9LFtwRHN0XSxzdGVwICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSA4IGJ5dGVzIGFuZCBwRHN0PXBEc3Qrc3RlcAotICAgICAgIFZRU0hSVU4gICAgICAgZGNsaXAyLHF4MiwjMAotICAgICAgIFZRU0hSVU4gICAgICAgZGNsaXAzLHF4MywjMAotICAgICAgIFZTVDEgICAgICAgICAge2RjbGlwMn0sW3BEc3RdLHN0ZXAKLSAgICAgICBWU1QxICAgICAgICAgIHtkY2xpcDN9LFtwRHN0XSxzdGVwCi0KLQotICAgICAgIAotICAgICAgICBNX0VORAotICAgICAgICBFTkRJRgotICAgICAgICAKLSAgICAgCi0gICAgICAgIAotICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmVfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTZlNjViLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSw0MTIgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvKioKLTsgKiAKLTsgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZV9zLnMKLTsgKiBPcGVuTUFYIERMOiB2MS4wLjIKLTsgKiBSZXZpc2lvbjogICAxMjI5MAotOyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOyAqIAotOyAqIAotOyAqIAotOyAqCi07ICogRGVzY3JpcHRpb246IAotOyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGRlY29kaW5nCi07ICogZm9yIGludGVyLCBpbnRyYSBibG9jay4KLTsgKgotOyAqCi07ICoKLTsgKiBGdW5jdGlvbjogb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmUKLTsgKgotOyAqIERlc2NyaXB0aW9uOgotOyAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiAKLTsgKgotOyAqIAotOyAqCi07ICogCi07ICovCi0KLQotICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgIElOQ0xVREUgYXJtQ09NTV9CaXREZWNfcy5oCi0KLQotICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLQotICAgICAKLQotCi0KLSAgICAgSUYgQVJNMTEzNkpTCi0gICAgIAotICAgICAgICAKLQotCi0KLTsvL0lucHV0IEFyZ3VtZW50cwotCi1wcEJpdFN0cmVhbSAgICAgICAgICBSTiAwCi1wQml0T2Zmc2V0ICAgICAgICAgICBSTiAxCi1wRHN0ICAgICAgICAgICAgICAgICBSTiAyCi1zaG9ydFZpZGVvSGVhZGVyICAgICBSTiAzCi0KLQotOy8vTG9jYWwgVmFyaWFibGVzCi0KLVJldHVybiAgICAgICAgICAgICAgIFJOIDAKLQotcFZsY1RhYmxlTDBMMSAgICAgICAgUk4gNAotcExNQVhUYWJsZUwwTDEgICAgICAgUk4gNAotcFJNQVhUYWJsZUwwTDEgICAgICAgUk4gNAotcFppZ3phZ1RhYmxlICAgICAgICAgUk4gNAotCi1mdHlwZSAgICAgICAgICAgICAgICBSTiAwCi10ZW1wMyAgICAgICAgICAgICAgICBSTiA0Ci10ZW1wICAgICAgICAgICAgICAgICBSTiA1Ci1Db3VudCAgICAgICAgICAgICAgICBSTiA2Ci1Fc2NhcGUgICAgICAgICAgICAgICBSTiA1Ci0KLTsvLyBhcm1WQ000UDJfRmlsbFZMREJ1ZmZlcgotemlnemFnICAgICAgICAgICAgICAgUk4gMAotc3RvcmVMZXZlbCAgICAgICAgICAgUk4gMQotdGVtcDIgICAgICAgICAgICAgICAgUk4gNAotdGVtcDEgICAgICAgICAgICAgICAgUk4gNQotc2lnbiAgICAgICAgICAgICAgICAgUk4gNQotTGFzdCAgICAgICAgICAgICAgICAgUk4gNwotc3RvcmVSdW4gICAgICAgICAgICAgUk4gMTQKLQotCi1wYWNrUmV0SW5kZXggICAgICAgICBSTiA1Ci0KLQotbWFya2VyYml0ICAgICAgICAgICAgUk4gNQotCi07Ly8gU2NyYXRjaCBSZWdpc3RlcnMKLQotUkJpdFN0cmVhbSAgICAgICAgICAgUk4gOAotUkJpdEJ1ZmZlciAgICAgICAgICAgUk4gOQotUkJpdENvdW50ICAgICAgICAgICAgUk4gMTAKLQotVDEgICAgICAgICAgICAgICAgICAgUk4gMTEKLVQyICAgICAgICAgICAgICAgICAgIFJOIDEyCi1MUiAgICAgICAgICAgICAgICAgICBSTiAxNCAgICAgICAgCi0gICAgICAgIAotCi0KLSAgICAgICAgTV9BTExPQzQgICAgICAgIHBwcEJpdFN0cmVhbSw0Ci0gICAgICAgIE1fQUxMT0M0ICAgICAgICBwcE9mZnNldCw0Ci0gICAgICAgIE1fQUxMT0M0ICAgICAgICBwTGlua1JlZ2lzdGVyLDQgICAgICAgCi0gICAgICAgIAotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlCi0KLSAgICAgICAgOy8vIGdldCB0aGUgdGFibGUgYWRkcmVzc2VzIGZyb20gc3RhY2sgICAgICAgCi0gICAgICAgIE1fQVJHICAgICAgICAgICBwcFZsY1RhYmxlTDBMMSw0Ci0gICAgICAgIE1fQVJHICAgICAgICAgICBwcExNQVhUYWJsZUwwTDEsNAotICAgICAgICBNX0FSRyAgICAgICAgICAgcHBSTUFYVGFibGVMMEwxLDQKLSAgICAgICAgTV9BUkcgICAgICAgICAgIHBwWmlnemFnVGFibGUsNAotICAgICAgICAKLSAgICAgICAgOy8vIFN0b3JlIEFMTCB6ZXJvcyBhdCBwRHN0Ci0gICAgICAgIAotICAgICAgICBNT1YgICAgICAgICAgICAgdGVtcDEsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEluaXRpYWxpemUgQ291bnQgdG8gemVybyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIE1PViAgICAgICAgICAgICBMYXN0LCMwCi0gICAgICAgIE1fU1RSICAgICAgICAgICBMUixwTGlua1JlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgTGluayBSZWdpc3RlciBvbiBTdGFjawotICAgICAgICBNT1YgICAgICAgICAgICAgdGVtcDIsIzAKLSAgICAgICAgTU9WICAgICAgICAgICAgIExSLCMwICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIEluaXRpYWxpemUgdGhlIE1hY3JvIGFuZCBTdG9yZSBhbGwgemVyb3MgdG8gcERzdCAKLSAgCi0gICAgICAgIFNUTSAgICAgICAgICAgICBwRHN0ISx7dGVtcDIsdGVtcDEsTGFzdCxMUn0gICAgICAgICAgICAgICAgICAgCi0gICAgICAgIE1fQkRfSU5JVDAgICAgICBwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgUkJpdFN0cmVhbSwgUkJpdEJ1ZmZlciwgUkJpdENvdW50ICAKLSAgICAgICAgU1RNICAgICAgICAgICAgIHBEc3QhLHt0ZW1wMix0ZW1wMSxMYXN0LExSfQotICAgICAgICBNX0JEX0lOSVQxICAgICAgVDEsIFQyLCBUMgotICAgICAgICBTVE0gICAgICAgICAgICAgcERzdCEse3RlbXAyLHRlbXAxLExhc3QsTFJ9Ci0gICAgICAgIE1fQkRfSU5JVDIgICAgICBUMSwgVDIsIFQyCi0gICAgICAgIFNUTSAgICAgICAgICAgICBwRHN0ISx7dGVtcDIsdGVtcDEsTGFzdCxMUn0KLSAgICAgICAgTV9TVFIgICAgICAgICAgIHBwQml0U3RyZWFtLHBwcEJpdFN0cmVhbSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBwcEJpdHN0cmVhbSBvbiBzdGFjayAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgU1RNICAgICAgICAgICAgIHBEc3QhLHt0ZW1wMix0ZW1wMSxMYXN0LExSfQotICAgICAgICBNX1NUUiAgICAgICAgICAgcEJpdE9mZnNldCxwcE9mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHBCaXRPZmZzZXQgb24gc3RhY2sKLSAgICAgICAgU1RNICAgICAgICAgICAgIHBEc3QhLHt0ZW1wMix0ZW1wMSxMYXN0LExSfQotICAgICAgICAKLSAgICAgICAgU1RNICAgICAgICAgICAgIHBEc3QhLHt0ZW1wMix0ZW1wMSxMYXN0LExSfQotICAgICAgICBTVE0gICAgICAgICAgICAgcERzdCEse3RlbXAyLHRlbXAxLExhc3QsTFJ9Ci0gCi0gICAgICAgIAotICAgICAgICBTVUIgICAgICAgICAgICAgcERzdCxwRHN0LCMxMjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFJlc3RvcmUgcERzdAotCi0gICAgICAgIDsvLyBUaGUgYXJtVkNNNFAyX0dldFZMQ0JpdHMgYmVnaW5zCi0KLWdldFZMQ2JpdHMKLSAgICAgICAgCi0gICAgICAgIE1fQkRfTE9PSzggICAgICBFc2NhcGUsNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBFc2NhcGUgVmFsdWUKLSAgICAgICAgTFNSICAgICAgICAgICAgIEVzY2FwZSxFc2NhcGUsIzI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgQ01QICAgICAgICAgICAgIEVzY2FwZSwjMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBjaGVjayBmb3IgZXNjYXBlIG1vZGUKLSAgICAgICAgTU9WTkUgICAgICAgICAgIGZ0eXBlLCMwCi0gICAgICAgIEJORSAgICAgICAgICAgICBub3RFc2NhcGVtb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQnJhbmNoIGlmIG5vdCBpbiBFc2NhcGUgbW9kZSAzCi0KLSAgICAgICAgTV9CRF9WU0tJUDggICAgICM3LFQxCi0gICAgICAgIENNUCAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ2hlY2sgc2hvcnRWaWRlb0hlYWRlciBmbGFnIHRvIGtub3cgdGhlIHR5cGUgb2YgRXNjYXBlIG1vZGUKLSAgICAgICAgQkVRICAgICAgICAgICAgIGVuZEZpbGxWTEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBFc2NhcGUgTW9kZSA0Ci0KLSAgICAgICAgTV9CRF9SRUFEOCAgICAgIExhc3QsMSxUMQotICAgICAgICBNX0JEX1JFQUQ4ICAgICAgc3RvcmVSdW4sNixUMQotICAgICAgICBNX0JEX1JFQUQ4ICAgICAgc3RvcmVMZXZlbCw4LFQxCi0KLSAgICAgICAgICAgCi0gICAgICAgIDsvLyBDaGVjayB3aGV0aGVyIHRoZSBSZXNlcnZlZCB2YWx1ZXMgZm9yIExldmVsIGFyZSB1c2VkIGFuZCBFeGl0IHdpdGggYW4gRXJyb3IgTWVzc2FnZSBpZiBpdCBpcyBzbwotCi0gICAgICAgIFRFUSAgICAgICAgICAgICBzdG9yZUxldmVsLCMwCi0gICAgICAgIFRFUU5FICAgICAgICAgICBzdG9yZUxldmVsLCMxMjggICAgICAgICAgICAgICAgICAgIAotICAgICAgICBCRVEgICAgICAgICAgICAgRXhpdEVycm9yCi0KLSAgICAgICAgQUREICAgICAgICAgICAgIHRlbXAyLHN0b3JlUnVuLENvdW50Ci0gICAgICAgIENNUCAgICAgICAgICAgICB0ZW1wMiwjNjQKLSAgICAgICAgQkdFICAgICAgICAgICAgIEV4aXRFcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBlcnJvciBpZiBDb3VudCtzdG9yZVJ1biA+PSA2NAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBMb2FkIGFkZHJlc3Mgb2YgemlnemFnVGFibGUKLSAgICAgICAgCi0gICAgICAgIE1fTERSICAgICAgICAgICBwWmlnemFnVGFibGUscHBaaWd6YWdUYWJsZSAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZGluZyB0aGUgQWRkcmVzcyBvZiBaaWd6YWcgdGFibGUKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotICAgICAgICA7Ly8gYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgU1hUQiAgICAgICAgICAgIHN0b3JlTGV2ZWwsc3RvcmVMZXZlbCAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTaWduIEV4dGVuZCBzdG9yZUxldmVsIHRvIDMyIGJpdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIFRvIFJlZmxlY3QgUnVubGVuZ3RoCi0KLSAgICAgICAgQUREICAgICAgICAgICAgIENvdW50LENvdW50LHN0b3JlUnVuCi0gICAgICAgIExEUkIgICAgICAgICAgICB6aWd6YWcsW3BaaWd6YWdUYWJsZSxDb3VudF0KLSAgICAgICAgQUREICAgICAgICAgICAgIENvdW50LENvdW50LCMxCi0gICAgICAgIFNUUkggICAgICAgICAgICBzdG9yZUxldmVsLFtwRHN0LHppZ3phZ10gICAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUgTGV2ZWwKLSAgICAgICAgICAgICAgCi0gICAgICAgIEIgICAgICAgICAgICAgICBFeGl0T2sKLSAgICAgICAKLSAgICAgICAgCi0KLWVuZEZpbGxWTEQKLSAgICAgICAgCi0gICAgICAgICAgICAgICAKLSAgICAgICAgOy8vIExvYWQgRnR5cGUoIEVzY2FwZSBNb2RlKSB2YWx1ZSBiYXNlZCBvbiB0aGUgdHdvIHN1Y2Nlc3NpdmUgYml0cyBpbiB0aGUgYml0c3RyZWFtCi0gICAgIAotICAgICAgICBNX0JEX1JFQUQ4ICAgICAgdGVtcDEsMSxUMSAgICAgICAgICAgCi0gICAgICAgIENNUCAgICAgICAgICAgICB0ZW1wMSwjMCAgICAKLSAgICAgICAgTU9WRVEgICAgICAgICAgIGZ0eXBlLCMxCi0gICAgICAgIEJFUSAgICAgICAgICAgICBub3RFc2NhcGVtb2RlCi0gICAgICAgIE1fQkRfUkVBRDggICAgICB0ZW1wMSwxLFQxCi0gICAgICAgIENNUCAgICAgICAgICAgICB0ZW1wMSwjMQotICAgICAgICBNT1ZFUSAgICAgICAgICAgZnR5cGUsIzMKLSAgICAgICAgTU9WTkUgICAgICAgICAgIGZ0eXBlLCMyCi0gICAgICAgIAotCi1ub3RFc2NhcGVtb2RlCi0KLSAgICAgICAgOy8vIExvYWQgb3B0aW1pemVkIHBhY2tlZCBWTEMgdGFibGUgd2l0aCBsYXN0PTAgYW5kIExhc3Q9MQotICAgICAgICAKLSAgICAgICAgTV9MRFIgICAgICAgICAgIHBWbGNUYWJsZUwwTDEscHBWbGNUYWJsZUwwTDEgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIENvbWJpbmVkIFZMQyBUYWJsZQotICAgICAgICAgICAgICAgIAotICAgICAgIAotICAgICAgICBDTVAgICAgICAgICAgICAgZnR5cGUsIzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIGZ0eXBlID49MyBnZXQgcGVyZm9ybSBGaXhlZCBMZW5ndGggRGVjb2RpbmcgKEVzY2FwZSBNb2RlIDMpCi0gICAgICAgIEJHRSAgICAgICAgICAgICBFc2NhcGVNb2RlMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gRWxzZSBjb250aW51ZSBub3JtYWwgVkxDIERlY29kaW5nCi0gICAgICAgIAotICAgICAgICA7Ly8gVmFyaWFibGUgbGVuZ2ggZGVjb2RpbmcsICJhcm1VblBhY2tWTEMzMiIgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgTV9CRF9WTEQgICAgICAgIHBhY2tSZXRJbmRleCxUMSxUMixwVmxjVGFibGVMMEwxLDQsMgotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgICAgICB0ZW1wMyw9MHhGRkYKLSAgICAgICAgCi0gICAgICAgIENNUCAgICAgICAgICAgICBwYWNrUmV0SW5kZXgsdGVtcDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ2hlY2sgZm9yIGludmFsaWQgc3ltYm9sCi0gICAgICAgIEJFUSAgICAgICAgICAgICBFeGl0RXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gaWYgaW52YWxpZCBzeW1ib2wgb2NjdXJzIGV4aXQgd2l0aCBhbiBlcnJvciBtZXNzYWdlCi0gICAgICAgIAotICAgICAgICBBTkQgICAgICAgICAgICAgTGFzdCxwYWNrUmV0SW5kZXgsIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEdldCBMYXN0IGZyb20gcGFja2VkIEluZGV4Ci0gICAgICAgICAgICAgIAotICAgICAgICAgCi0gICAgICAgIAotCi0gICAgICAgIExTUiAgICAgICAgICAgICBzdG9yZVJ1bixwYWNrUmV0SW5kZXgsIzcgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gR2V0IFJ1biBWYWx1ZSBmcm9tIFBhY2tlZCBpbmRleAotICAgICAgICBBTkQgICAgICAgICAgICAgc3RvcmVMZXZlbCxwYWNrUmV0SW5kZXgsIzB4N2MgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlTGV2ZWw9cGFja1JldEluZGV4WzItNl0sc3RvcmVMZXZlbFswLTFdPTAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgCi0gICAgICAgIE1fTERSICAgICAgICAgICBwTE1BWFRhYmxlTDBMMSxwcExNQVhUYWJsZUwwTDEgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBMTUFYIHRhYmxlCi0gICAgICAgICAgICAgIAotICAgICAgIAotICAgICAgICBMU1IgICAgICAgICAgICAgc3RvcmVMZXZlbCxzdG9yZUxldmVsLCMyICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExldmVsIHZhbHVlCi0KLSAgICAgICAgQ01QICAgICAgICAgICAgIGZ0eXBlLCMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIEJORSAgICAgICAgICAgICBmdHlwZTIKLSAgICAgICAgCi0gICAgICAgIDsvLyBmdHlwZT09MTsgRXNjYXBlIG1vZGUgPTEKLSAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIEFERCAgICAgICAgICAgIHRlbXAxLCBwTE1BWFRhYmxlTDBMMSwgTGFzdCwgTFNMIzQgICAgICAgICAgICAgIDsvLyBJZiB0aGUgTGFzdD0xIGFkZCAzMiB0byB0YWJsZSBhZGRyZXNzCi0gICAgICAgIExEUkIgICAgICAgICAgICB0ZW1wMSxbdGVtcDEsc3RvcmVSdW5dCi0KLSAgICAgICAKLSAgICAgICAgQUREICAgICAgICAgICAgIHN0b3JlTGV2ZWwsdGVtcDEsc3RvcmVMZXZlbCAgICAgICAgICAgICAgICAgICAgIAotCi1mdHlwZTIKLQotICAgICAgICA7Ly8gZnR5cGUgPTI7IEVzY2FwZSBtb2RlID0yCi0gICAgICAgIAotICAgICAgICBNX0xEUiAgICAgICAgICAgcFJNQVhUYWJsZUwwTDEscHBSTUFYVGFibGVMMEwxICAgICAgICAgICAgICAgICAgOy8vIExvYWQgUk1BWCBUYWJsZSAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgQ01QICAgICAgICAgICAgIGZ0eXBlLCMyCi0gICAgICAgIEJORSAgICAgICAgICAgICBGaWxsVkxETDEKLSAgICAgICAgICAgICAgICAgIAotICAgICAgICBBREQgICAgICAgICAgICB0ZW1wMSwgcFJNQVhUYWJsZUwwTDEsIExhc3QsIExTTCM0ICAgICAgICAgICAgICAgOy8vIElmIExhc3Q9MSBhZGQgMzIgdG8gdGFibGUgYWRkcmVzcwotICAgICAgICBTVUIgICAgICAgICAgICAgdGVtcDIsc3RvcmVMZXZlbCwjMQotICAgICAgICBMRFJCICAgICAgICAgICAgdGVtcDEsW3RlbXAxLHRlbXAyXQotCi0gICAgICAgCi0gICAgICAgIEFERCAgICAgICAgICAgICBzdG9yZVJ1bixzdG9yZVJ1biwjMQotICAgICAgICBBREQgICAgICAgICAgICAgc3RvcmVSdW4sdGVtcDEKLSAgICAgICAgCi1GaWxsVkxETDEgICAgICAgIAotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIDsvLyBhcm1WQ000UDJfRmlsbFZMREJ1ZmZlcgotCi0gICAgICAgIE1fTERSICAgICAgICAgICBwWmlnemFnVGFibGUscHBaaWd6YWdUYWJsZSAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIGFkZHJlc3Mgb2YgemlnemFnVGFibGUgCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIE1fQkRfUkVBRDggICAgICBzaWduLDEsVDEKLQotICAgICAgICBDTVAgICAgICAgICAgICAgc2lnbiwjMQotICAgICAgICBSU0JFUSAgICAgICAgICAgc3RvcmVMZXZlbCxzdG9yZUxldmVsLCMwCi0gCi0gICAgICAgIEFERCAgICAgICAgICAgICB0ZW1wMSxzdG9yZVJ1bixDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBFeGl0IHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZiBSdW4gKyBDb3VudCBleGNlZWRzIDYzCi0gICAgICAgIENNUCAgICAgICAgICAgICB0ZW1wMSwjNjQKLSAgICAgICAgQkdFICAgICAgICAgICAgIEV4aXRFcnJvcgotCi0gICAgICAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBUbyBSZWZsZWN0IFJ1bmxlbmdodAotCi0gICAgICAgIEFERCAgICAgICAgICAgICBDb3VudCxDb3VudCxzdG9yZVJ1bgotIAotc3RvcmVMZXZlbEwxCi0gICAgICAgIAotICAgICAgICBMRFJCICAgICAgICAgICAgemlnemFnLFtwWmlnemFnVGFibGUsQ291bnRdCi0gICAgICAgIENNUCAgICAgICAgICAgICBMYXN0LCMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ2hlY2sgaWYgdGhlIExldmVsIHZhbCBpcyBMYXN0IG5vbiB6ZXJvIHZhbAotICAgICAgICBBREQgICAgICAgICAgICAgQ291bnQsQ291bnQsIzEKLSAgICAgICAgTFNSICAgICAgICAgICAgIExhc3QsTGFzdCwjMQotICAgICAgICBTVFJIICAgICAgICAgICAgc3RvcmVMZXZlbCxbcERzdCx6aWd6YWddICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgIAotICAgICAgICBCTkUgICAgICAgICAgICAgZW5kCi0gICAgICAgIAotICAgICAgICBCICAgICAgICAgICAgICAgRXhpdE9rCi0gCi0KLQotICAgICAgICA7Ly8gRml4ZWQgTGVuZ2ggRGVjb2RpbmcgRXNjYXBlIE1vZGUgMwotCi1Fc2NhcGVNb2RlMwotCi0gICAgICAgIE1fQkRfUkVBRDggICAgICBMYXN0LDEsVDEKLSAgICAgICAgTV9CRF9SRUFEOCAgICAgIHN0b3JlUnVuLDYsVDEKLSAgICAgICAgCi0gICAgICAgIEFERCAgICAgICAgICAgICB0ZW1wMixzdG9yZVJ1bixDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gRXhpdCB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaWYgUnVuICsgQ291bnQgZXhjZWVkcyA2MwotICAgICAgICBDTVAgICAgICAgICAgICAgdGVtcDIsIzY0Ci0gICAgICAgIEJHRSAgICAgICAgICAgICBFeGl0RXJyb3IKLQotICAgICAgICBNX0JEX1JFQUQ4ICAgICAgbWFya2VyYml0LDEsVDEKLSAgICAgICAgVEVRICAgICAgICAgICAgIG1hcmtlcmJpdCwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBFeGl0IHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZiBtYXJrZXIgYml0IGlzIHplcm8KLSAgICAgICAgQkVRICAgICAgICAgICAgIEV4aXRFcnJvcgotICAgICAgICAKLSAgICAgICAgTV9CRF9SRUFEMTYgICAgIHN0b3JlTGV2ZWwsMTIsVDEKLQotICAgICAgICBUU1QgICAgICAgICAgICAgc3RvcmVMZXZlbCwjMHg4MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlc3QgaWYgdGhlIGxldmVsIGlzIG5lZ2F0aXZlCi0gICAgICAgIFNVQk5FICAgICAgICAgICBzdG9yZUxldmVsLHN0b3JlTGV2ZWwsIzQwOTYKLSAgICAgICAgQ01QICAgICAgICAgICAgIHN0b3JlTGV2ZWwsIzAKLSAgICAgICAgQ01QTkUgICAgICAgICAgIHN0b3JlTGV2ZWwsIy0yMDQ4Ci0gICAgICAgIEJFUSAgICAgICAgICAgICBFeGl0RXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gRXhpdCB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaWYgTGV2ZWw9PTAgb3IgIC0yMDQ4IAotCi0gICAgICAgIE1fTERSICAgICAgICAgICBwWmlnemFnVGFibGUscHBaaWd6YWdUYWJsZSAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBhZGRyZXNzIG9mIHppZ3phZ1RhYmxlCi0gICAgICAgICAgICAgIAotICAgICAgICBNX0JEX1JFQUQ4ICAgICAgbWFya2VyYml0LDEsVDEKLSAgICAgICAgICAgCi0KLSAgICAgICAgOy8vIGFybVZDTTRQMl9GaWxsVkxEQnVmZmVyICggU2lnbiBub3QgdXNlZCBhcyBzdG9yZUxldmVsIGlzIHByZXByb2Nlc3NlZCkKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgOy8vIFRvIFJlZmxlY3QgUnVuIExlbmd0aAotCi0gICAgICAgIEFERCAgICAgICAgICAgICBDb3VudCxDb3VudCxzdG9yZVJ1bgotCi0KLSAKLXN0b3JlTGV2ZWxMYXN0Ci0gICAgICAgIAotICAgICAgICBMRFJCICAgICAgICAgICAgemlnemFnLFtwWmlnemFnVGFibGUsQ291bnRdCi0gICAgICAgIENNUCAgICAgICAgICAgICBMYXN0LCMxCi0gICAgICAgIEFERCAgICAgICAgICAgICBDb3VudCxDb3VudCwjMQotICAgICAgICBTVFJIICAgICAgICAgICAgc3RvcmVMZXZlbCxbcERzdCx6aWd6YWddICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgQk5FICAgICAgICAgICAgIGVuZCAKLSAgICAgIAotICAgICAgICBCICAgICAgICAgICAgICAgRXhpdE9rCi0gICAgICAgIAotZW5kCi0KLSAgICAgICAgQ01QICAgICAgICAgICAgIENvdW50LCM2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvL1J1biB0aGUgTG9vcCB1bnRpbGwgQ291bnQgcmVhY2hlcyA2NAotCi0gICAgICAgIEJMVCAgICAgICAgICAgICBnZXRWTENiaXRzCi0KLSAgICAgICAgCi1FeGl0T2sKLSAgICAgICAgOy8vIEV4aXQgV2hlbiBWTEMgRGVjb2RpbmcgaXMgZG9uZSBTdWNjZXNzZnVsbHkgCi0gICAKLSAgICAgICAgOy8vIExvYWRpbmcgcHBCaXRTdHJlYW0gYW5kIHBCaXRPZmZzZXQgZnJvbSBzdGFjawotICAgICAgICAKLSAgICAgICAgQ01QICAgICAgICAgICAgIExhc3QsIzEKLSAgICAgICAgTV9MRFIgICAgICAgICAgIHBwQml0U3RyZWFtLHBwcEJpdFN0cmVhbQotICAgICAgICBNX0xEUiAgICAgICAgICAgcEJpdE9mZnNldCxwcE9mZnNldAotCi0gICAgICAgIDsvL0VuZGluZyB0aGUgbWFjcm8KLQotICAgICAgICBNX0JEX0ZJTkkgICAgICAgcHBCaXRTdHJlYW0scEJpdE9mZnNldAotICAgICAgICAgICAgIAotICAgICAgICBNT1ZFUSAgICAgICAgICAgUmV0dXJuLCNPTVhfU3RzX05vRXJyCi0gICAgICAgIE1PVk5FICAgICAgICAgICBSZXR1cm4sI09NWF9TdHNfRXJyCi0gICAgICAgIE1fTERSICAgICAgICAgICBMUixwTGlua1JlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIHRoZSBMaW5rIFJlZ2lzdGVyIEJhY2sKLSAgICAgICAgQiAgICAgICAgICAgICAgIGV4aXQyCi0KLUV4aXRFcnJvcgotICAgICAgICA7Ly8gRXhpdCBXaGVuIGFuIEVycm9yIG9jY3VycyAKLQotICAgICAgICBNX0xEUiAgICAgICAgICAgcHBCaXRTdHJlYW0scHBwQml0U3RyZWFtCi0gICAgICAgIE1fTERSICAgICAgICAgICBwQml0T2Zmc2V0LHBwT2Zmc2V0Ci0gICAgICAgIDsvL0VuZGluZyB0aGUgbWFjcm8KLQotICAgICAgICBNX0JEX0ZJTkkgICAgICAgcHBCaXRTdHJlYW0scEJpdE9mZnNldAotICAgICAgICBNX0xEUiAgICAgICAgICAgTFIscExpbmtSZWdpc3RlcgotICAgICAgICBNT1YgICAgICAgICAgICAgUmV0dXJuLCNPTVhfU3RzX0VycgotCi1leGl0MgotICAgICAgIAotCi0gICAgICAgIE1fRU5ECi0gICAgICAgIEVORElGCi0gICAgICAgIAotICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTc3ODMyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotIC8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgMTIyOTAKLSAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIEZpbGU6ICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMKLSAqIERlc2NyaXB0aW9uOiBDb250YWlucyBhbGwgdGhlIEh1ZmZtYW4gdGFibGVzIHVzZWQgaW4gTVBFRzQgY29kZWMKLSAqCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgotCi0KLQotCi0vLyBDb250YWlucyBvcHRpbWl6ZWQgYW5kIFBhY2tlZCBWTEMgdGFibGVzIHdpdGggTGFzdD0wIGFuZCBMYXN0PTEKLQotLy8gICAgICAgICAgICAgIG9wdGltaXplZCBQYWNrZWQgVkxDIHRhYmxlIEVudHJ5IEZvcm1hdCAKLS8vICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIAotLy8gICAgICAgIDE1IDE0IDEzIDEyIDExIDEwIDA5IDA4IDA3IDA2IDA1IDA0IDAzIDAyIDAxIDAwCi0vLyAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotLy8gICAgICAgfCAgTGVuICAgfCAgICAgICBSdW4gICAgICAgfCAgICAgTGV2ZWwgICAgfEwgfCAxIHwKLS8vICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0vLyAgICAgICB8ICAgICAgICAgICAgICAgIE9mZnNldCAgICAgICAgICAgICAgICAgICAgICB8IDAgfAotLy8gICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLS8vIElmIHRoZSB0YWJsZSBlbnRyeSBpcyBhIGxlYWYgZW50cnkgdGhlbiBiaXQgMCBzZXQ6Ci0vLyAgICBMZW4gICAgPSBOdW1iZXIgb2YgYml0cyBvdmVycmVhZCAgKDAgdG8gNykgIDMgYml0cwotLy8gICAgUnVuICAgID0gUnVuTGVuZ3RoIG9mIHRoZSBTeW1ib2wgICgwIHRvIDYzKSA2IGJpdHMKLS8vICAgIExldmVsICA9IExldmVsIG9mIHRoZSBTeW1ib2wgICAgICAoMCB0byAzMSkgNSBiaXRzCi0vLyAgICBMICAgICAgPSBMYXN0IFZhbHVlIG9mIHRoZSBTeW1ib2wgKDAgb3IgMSkgIDEgYml0Ci0vLwotLy8gSWYgdGhlIHRhYmxlIGVudHJ5IGlzIGFuIGludGVybmFsIG5vZGUgdGhlbiBiaXQgMCBpcyBjbGVhcjoKLS8vICAgIE9mZnNldCA9IE51bWJlciBvZiAoMTYtYml0KSBoYWxmIHdvcmRzIGZyb20gdGhlIHRhYmxlCi0vLyAgICAgICAgICAgICBzdGFydCB0byB0aGUgbmV4dCB0YWJsZSBub2RlCi0vLwotLy8gVGhlIHRhYmxlIGlzIGFjY2Vzc2VkIGJ5IHN1Y2Nlc3NpdmUgbG9va3VwIHVwIG9uIHRoZQotLy8gbmV4dCBTdGVwIGJpdHMgb2YgdGhlIGlucHV0IGJpdHN0cmVhbSB1bnRpbCBhIGxlYWYgbm9kZQotLy8gaXMgb2J0YWluZWQuIFRoZSBTdGVwIHNpemVzIGFyZSBzdXBwbGllZCB0byB0aGUgVkxEIG1hY3JvLgotCi0vLyBUaGUgVkxDIHRhYmxlcyB1c2VkIGZvciBJbnRyYSBhbmQgbm9uIGludGEgY29lZmZpY2llbnRzIGluIG5vbiBFc2NhcGUgbW9kZQotLy8gY29udGFpbnMgc3ltYm9scyB3aXRoIGJvdGggTGFzdD0wIGFuZCBMYXN0PTEuCi0vLyBJZiBhIHN5bWJvbCBpcyBub3QgZm91bmQgaW4gdGhlIHRhYmxlIGl0IHdpbGwgYmUgY29kZWQgYXMgMHhGRkYKLSAKLQotY29uc3QgT01YX1UxNiBhcm1WQ000UDJfSW50ZXJWbGNMMEwxWzIwMF0gPSB7Ci0gICAgMHgwMDIwLCAweDAxMDgsIDB4MDE0OCwgMHgwMTcwLCAweDAxNzgsIDB4MDE4MCwgMHgwMTg4LCAweDFiMDksCi0gICAgMHg0MDA5LCAweDQwMDksIDB4NDAwOSwgMHg0MDA5LCAweDIxMDksIDB4MjEwOSwgMHgwMjA5LCAweDAwMTEsCi0gICAgMHgwMDI4LCAweDAwNjAsIDB4MDBiOCwgMHgwMGUwLCAweDAwMzAsIDB4MDA0OCwgMHgwMDUwLCAweDAwNTgsCi0gICAgMHgzZmZmLCAweDNmZmYsIDB4MDAzOCwgMHgwMDQwLCAweDIxMTUsIDB4MjExNSwgMHgyMDFkLCAweDIwMWQsCi0gICAgMHgyMDU5LCAweDIwNTksIDB4MjA1MSwgMHgyMDUxLCAweDFjMGQsIDB4MWIwZCwgMHgxYTBkLCAweDE5MGQsCi0gICAgMHgwOTExLCAweDA4MTEsIDB4MDcxMSwgMHgwNjExLCAweDA1MTEsIDB4MDMxOSwgMHgwMjE5LCAweDAxMjEsCi0gICAgMHgwMDY4LCAweDAwOTAsIDB4M2ZmZiwgMHgzZmZmLCAweDAwNzAsIDB4MDA3OCwgMHgwMDgwLCAweDAwODgsCi0gICAgMHgyMDYxLCAweDIwNjEsIDB4MjEyOSwgMHgyMTI5LCAweDM3MDksIDB4MzcwOSwgMHgzODA5LCAweDM4MDksCi0gICAgMHgzZDBkLCAweDNkMGQsIDB4M2UwZCwgMHgzZTBkLCAweDNmMGQsIDB4M2YwZCwgMHgyMDBkLCAweDIwMGQsCi0gICAgMHgwMDk4LCAweDAwYTAsIDB4MDBhOCwgMHgwMGIwLCAweDAxMzEsIDB4MDIyMSwgMHgwNDE5LCAweDA1MTksCi0gICAgMHgwNjE5LCAweDBhMTEsIDB4MTkwOSwgMHgxYTA5LCAweDIxMGQsIDB4MjIwZCwgMHgyMzBkLCAweDI0MGQsCi0gICAgMHgyNTBkLCAweDI2MGQsIDB4MjcwZCwgMHgyODBkLCAweDAwYzAsIDB4MDBjOCwgMHgwMGQwLCAweDAwZDgsCi0gICAgMHgwMDQ5LCAweDAwNDEsIDB4MzgwZCwgMHgzODBkLCAweDM3MGQsIDB4MzcwZCwgMHgzNjBkLCAweDM2MGQsCi0gICAgMHgzNTBkLCAweDM1MGQsIDB4MzQwZCwgMHgzNDBkLCAweDMzMGQsIDB4MzMwZCwgMHgzMjBkLCAweDMyMGQsCi0gICAgMHgwMGU4LCAweDAwZjAsIDB4MDBmOCwgMHgwMTAwLCAweDMxMGQsIDB4MzEwZCwgMHgyMDE1LCAweDIwMTUsCi0gICAgMHgzNjA5LCAweDM2MDksIDB4MzUwOSwgMHgzNTA5LCAweDM0MDksIDB4MzQwOSwgMHgzMzA5LCAweDMzMDksCi0gICAgMHgzMjA5LCAweDMyMDksIDB4MzEwOSwgMHgzMTA5LCAweDAxMTAsIDB4MDEzMCwgMHgwMTM4LCAweDAxNDAsCi0gICAgMHgwMTE4LCAweDAxMjAsIDB4MDEyOCwgMHgxMDBkLCAweDMwMDksIDB4MzAwOSwgMHgyZjA5LCAweDJmMDksCi0gICAgMHgyNDExLCAweDI0MTEsIDB4MjMxMSwgMHgyMzExLCAweDIwMzksIDB4MjAzOSwgMHgyMDMxLCAweDIwMzEsCi0gICAgMHgwZjBkLCAweDBlMGQsIDB4MGQwZCwgMHgwYzBkLCAweDBiMGQsIDB4MGEwZCwgMHgwOTBkLCAweDBlMDksCi0gICAgMHgwZDA5LCAweDAyMTEsIDB4MDExOSwgMHgwMDI5LCAweDAxNTAsIDB4MDE1OCwgMHgwMTYwLCAweDAxNjgsCi0gICAgMHgyODBkLCAweDI4MGQsIDB4MjcwZCwgMHgyNzBkLCAweDI2MGQsIDB4MjYwZCwgMHgyNTBkLCAweDI1MGQsCi0gICAgMHgyYzA5LCAweDJjMDksIDB4Yjc1OSwgMHhiNzU5LCAweDJhMDksIDB4MmEwOSwgMHgyMDIxLCAweDIwMjEsCi0gICAgMHgwNDBkLCAweDAzMGQsIDB4MGIzNSwgMHgwMTBkLCAweDA5MDksIDB4MDgwOSwgMHgwNzA5LCAweDA2MDksCi0gICAgMHgwMTExLCAweDAwMTksIDB4MjUwOSwgMHgyNTA5LCAweDI0MDksIDB4MjQwOSwgMHgyMzA5LCAweDIzMDkKLX07Ci0KLQotY29uc3QgT01YX1UxNiBhcm1WQ000UDJfSW50cmFWbGNMMEwxWzIwMF0gPSB7Ci0gICAgMHgwMDIwLCAweDAxMDgsIDB4MDE0OCwgMHgwMTcwLCAweDAxNzgsIDB4MDE4MCwgMHgwMTg4LCAweDBmMDksCi0gICAgMHg0MDA5LCAweDQwMDksIDB4NDAwOSwgMHg0MDA5LCAweDIwMTEsIDB4MjAxMSwgMHgwMTA5LCAweDAwMTksCi0gICAgMHgwMDI4LCAweDAwNjAsIDB4MDBiOCwgMHgwMGUwLCAweDAwMzAsIDB4MDA0OCwgMHgwMDUwLCAweDAwNTgsCi0gICAgMHgzZmZmLCAweDNmZmYsIDB4MDAzOCwgMHgwMDQwLCAweDIwM2QsIDB4MjAzZCwgMHgyMDM1LCAweDIwMzUsCi0gICAgMHgyMGIxLCAweDIwYjEsIDB4MjBhOSwgMHgyMGE5LCAweDAyMTUsIDB4MDExZCwgMHgwMDJkLCAweDBkMDksCi0gICAgMHgwNTE5LCAweDA4MTEsIDB4MDQxOSwgMHgwMzIxLCAweDAyMjEsIDB4MDEzOSwgMHgwMGExLCAweDAwOTksCi0gICAgMHgwMDY4LCAweDAwOTAsIDB4M2ZmZiwgMHgzZmZmLCAweDAwNzAsIDB4MDA3OCwgMHgwMDgwLCAweDAwODgsCi0gICAgMHgyMGI5LCAweDIwYjksIDB4MjBjMSwgMHgyMGMxLCAweDIxNDEsIDB4MjE0MSwgMHgyOTExLCAweDI5MTEsCi0gICAgMHgyMzE1LCAweDIzMTUsIDB4MjQxNSwgMHgyNDE1LCAweDJmMGQsIDB4MmYwZCwgMHgzMDBkLCAweDMwMGQsCi0gICAgMHgwMDk4LCAweDAwYTAsIDB4MDBhOCwgMHgwMGIwLCAweDAwYzksIDB4MDBkMSwgMHgwMGQ5LCAweDAxNDksCi0gICAgMHgwNjE5LCAweDAxNTEsIDB4MDIyOSwgMHgwNzE5LCAweDBlMDksIDB4MDA0NSwgMHgwNTE1LCAweDA2MTUsCi0gICAgMHgxMTBkLCAweDEyMGQsIDB4MTMwZCwgMHgxNDBkLCAweDAwYzAsIDB4MDBjOCwgMHgwMGQwLCAweDAwZDgsCi0gICAgMHgwMDkxLCAweDAwODksIDB4MmUwZCwgMHgyZTBkLCAweDJkMGQsIDB4MmQwZCwgMHgyYzBkLCAweDJjMGQsCi0gICAgMHgyYjBkLCAweDJiMGQsIDB4MmEwZCwgMHgyYTBkLCAweDIxMTUsIDB4MjExNSwgMHgyMDI1LCAweDIwMjUsCi0gICAgMHgwMGU4LCAweDAwZjAsIDB4MDBmOCwgMHgwMTAwLCAweDJjMDksIDB4MmMwOSwgMHgyYjA5LCAweDJiMDksCi0gICAgMHgyNzExLCAweDI3MTEsIDB4MjYxMSwgMHgyNjExLCAweDI1MTEsIDB4MjUxMSwgMHgyMzE5LCAweDIzMTksCi0gICAgMHgyMjE5LCAweDIyMTksIDB4MjEzMSwgMHgyMTMxLCAweDAxMTAsIDB4MDEzMCwgMHgwMTM4LCAweDAxNDAsCi0gICAgMHgwMTE4LCAweDAxMjAsIDB4MDEyOCwgMHgwODBkLCAweDIxMjksIDB4MjEyOSwgMHgyMDgxLCAweDIwODEsCi0gICAgMHgyNDExLCAweDI0MTEsIDB4MjA3OSwgMHgyMDc5LCAweDIwNzEsIDB4MjA3MSwgMHgyMDY5LCAweDIwNjksCi0gICAgMHgxYmI1LCAweDA2MGQsIDB4MDAxZCwgMHhkM2Y5LCAweDA5MDksIDB4MDgwOSwgMHgwOTBkLCAweDAzMTEsCi0gICAgMHgwMTIxLCAweDAwNjEsIDB4MDA1OSwgMHgwMDUxLCAweDAxNTAsIDB4MDE1OCwgMHgwMTYwLCAweDAxNjgsCi0gICAgMHgyNDBkLCAweDI0MGQsIDB4MjMwZCwgMHgyMzBkLCAweDI2MDksIDB4MjYwOSwgMHgyNTBkLCAweDI1MGQsCi0gICAgMHgyNzA5LCAweDI3MDksIDB4MjIxMSwgMHgyMjExLCAweDIxMTksIDB4MjExOSwgMHgyMDQ5LCAweDIwNDksCi0gICAgMHgwMDE1LCAweDA1MDksIDB4MDIwZCwgMHgwMTBkLCAweDA0MDksIDB4MDMwOSwgMHgwMDQxLCAweDAwMzksCi0gICAgMHgwMTExLCAweDAwMzEsIDB4MjIwOSwgMHgyMjA5LCAweDIwMjksIDB4MjAyOSwgMHgyMDIxLCAweDIwMjEKLX07Ci0KLWNvbnN0IE9NWF9VMTYgYXJtVkNNNFAyX2FJbnRyYURDTHVtYUNocm9tYUluZGV4WzY0XSA9IHsKLSAgICAweDAwMjAsIDB4MDAwYiwgMHgyMDA5LCAweDIwMDksIDB4MjAwNywgMHgyMDA3LCAweDIwMDEsIDB4MjAwMSwKLSAgICAweDQwMDUsIDB4NDAwNSwgMHg0MDA1LCAweDQwMDUsIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywKLSAgICAweDAwMjgsIDB4MDAwZiwgMHgyMDBkLCAweDIwMGQsIDB4MDAzMCwgMHgwMDEzLCAweDIwMTEsIDB4MjAxMSwKLSAgICAweDAwMzgsIDB4MDAxNywgMHgyMDE1LCAweDIwMTUsIDB4M2ZmZiwgMHgzZmZmLCAweDIwMTksIDB4MjAxOSwKLQotCTB4MDAyMCwgMHgwMDA5LCAweDIwMDcsIDB4MjAwNywgMHg0MDA1LCAweDQwMDUsIDB4NDAwNSwgMHg0MDA1LAotICAgIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywgMHg0MDAxLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxLAotICAgIDB4MDAyOCwgMHgwMDBkLCAweDIwMGIsIDB4MjAwYiwgMHgwMDMwLCAweDAwMTEsIDB4MjAwZiwgMHgyMDBmLAotICAgIDB4MDAzOCwgMHgwMDE1LCAweDIwMTMsIDB4MjAxMywgMHgxZmZmLCAweDAwMTksIDB4MjAxNywgMHgyMDE3Ci19OwotCi0KLWNvbnN0IE9NWF9VMTYgYXJtVkNNNFAyX2FWbGNNVkRbMTI0XSA9IHsKLSAgICAweDAwMTAsIDB4MDBmMCwgMHgwMDQzLCAweDAwM2YsIDB4NDA0MSwgMHg0MDQxLCAweDQwNDEsIDB4NDA0MSwKLSAgICAweDAwMTgsIDB4MDBkOCwgMHgwMDQ3LCAweDAwM2IsIDB4MDAyMCwgMHgwMDgwLCAweDAwYTgsIDB4MDBkMCwKLSAgICAweDAwMjgsIDB4MDA0OCwgMHgwMDcwLCAweDAwNzgsIDB4MWZmZiwgMHgwMDMwLCAweDAwMzgsIDB4MDA0MCwKLSAgICAweDAwODEsIDB4MDAwMSwgMHgwMDdmLCAweDAwMDMsIDB4MjA3ZCwgMHgyMDdkLCAweDIwMDUsIDB4MjAwNSwKLSAgICAweDIwN2IsIDB4MjA3YiwgMHgyMDA3LCAweDIwMDcsIDB4MDA1MCwgMHgwMDU4LCAweDAwNjAsIDB4MDA2OCwKLSAgICAweDIwNzksIDB4MjA3OSwgMHgyMDA5LCAweDIwMDksIDB4MjA3NywgMHgyMDc3LCAweDIwMGIsIDB4MjAwYiwKLSAgICAweDIwNzUsIDB4MjA3NSwgMHgyMDBkLCAweDIwMGQsIDB4MjA3MywgMHgyMDczLCAweDIwMGYsIDB4MjAwZiwKLSAgICAweDAwNzEsIDB4MDAxMSwgMHgwMDZmLCAweDAwMTMsIDB4MDA2ZCwgMHgwMDE1LCAweDAwNmIsIDB4MDAxNywKLSAgICAweDAwODgsIDB4MDA5MCwgMHgwMDk4LCAweDAwYTAsIDB4MDA2OSwgMHgwMDE5LCAweDAwNjcsIDB4MDAxYiwKLSAgICAweDAwNjUsIDB4MDAxZCwgMHgwMDYzLCAweDAwMWYsIDB4MDA2MSwgMHgwMDIxLCAweDAwNWYsIDB4MDAyMywKLSAgICAweDAwNWQsIDB4MDAyNSwgMHgwMDViLCAweDAwMjcsIDB4MDBiMCwgMHgwMGI4LCAweDAwYzAsIDB4MDBjOCwKLSAgICAweDAwNTksIDB4MDAyOSwgMHgwMDU3LCAweDAwMmIsIDB4MjA1NSwgMHgyMDU1LCAweDIwMmQsIDB4MjAyZCwKLSAgICAweDIwNTMsIDB4MjA1MywgMHgyMDJmLCAweDIwMmYsIDB4MjA1MSwgMHgyMDUxLCAweDIwMzEsIDB4MjAzMSwKLSAgICAweDIwNGYsIDB4MjA0ZiwgMHgyMDMzLCAweDIwMzMsIDB4MDBlMCwgMHgwMGU4LCAweDAwNDksIDB4MDAzOSwKLSAgICAweDIwNGQsIDB4MjA0ZCwgMHgyMDM1LCAweDIwMzUsIDB4MjA0YiwgMHgyMDRiLCAweDIwMzcsIDB4MjAzNywKLSAgICAweDIwNDUsIDB4MjA0NSwgMHgyMDNkLCAweDIwM2QKLX07Ci0KLS8qIExNQVggdGFibGUgZm9yIG5vbiBJbnRlciAoTGFzdCA9PSAwIGFuZCBMYXN0PTEpCi0gICBMZXZlbCAtIDEgSW5kZXhlZAotICAgcGFkZGVkIGFybVZDTTRQMl9JbnRlckwwTDFMTUFYWzI3LTMxXSB3aXRoIHplcm9zIHRvIGFjZXNzIGVudHJpZXMgZm9yIExhc3Q9MSBlZmZlY3RpdmVseQotCi0qLwotY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRlckwwTDFMTUFYWzczXSA9IAotewotICAgMTIsICA2LCAgNCwgIDMsICAzLCAgMywgIDMsICAyLCAKLSAgICAyLCAgMiwgIDIsICAxLCAgMSwgIDEsICAxLCAgMSwKLSAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKLSAgICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwKLSAgICAzLCAgMiwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgCi0JMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCi0JMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCi0JMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCi0JMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCi0JMQotfTsKLQotLyogUk1BWCB0YWJsZSBmb3Igbm9uIEludGVyIChMYXN0ID09IDAgYW5kIExhc3Q9MSkKLSAgIExldmVsIC0gMSBJbmRleGVkIAotIHBhZGRlZCBhcm1WQ000UDJfSW50ZXJMMEwxUk1BWFsxMi0zMV0gd2l0aCB6ZXJvcyB0byBhY2Nlc3MgZW50cmllcyBmb3IgTGFzdD0xIHRhYmxlIGVmZmVjdGl2ZWx5ICovCi0KLQotY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRlckwwTDFSTUFYWzM1XSA9IAotewotICAgMjYsIDEwLCAgNiwgIDIsICAxLCAgMSwgICAKLSAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCi0JMCwJMCwJMCwJMCwJMCwJMCwKLQkwLAkwLAkwLAkwLAkwLAkwLAotCTAsCTAsCTAsCTAsCi0gICAgMCwgIDAsICAwLCAgMCwgIDQwLCAgMSwgIDAKLX07Ci0KLS8qIExNQVggdGFibGUgZm9yIG5vbiBJbnRyYSAoTGFzdCA9PSAwIGFuZCBMYXN0PTEpCi0gICBMZXZlbCAtIDEgSW5kZXhlZAotICAgcGFkZGVkIGFybVZDTTRQMl9JbnRyYUwwTDFMTUFYWzE1LTMxXSB3aXRoIHplcm9zIHRvIGFjZXNzIGVudHJpZXMgZm9yIExhc3Q9MSBlZmZlY3RpdmVseQotCi0qLwotY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRyYUwwTDFMTUFYWzUzXSA9IAotewotICAgMjcsIDEwLCAgNSwgIDQsICAzLCAgMywgIDMsICAKLSAgICAzLCAgMiwgIDIsICAxLCAgMSwgIDEsICAxLCAgMSwJMCwKLQkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAotCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCi0KLQk4LCAgMywgIDIsICAyLCAgMiwgIDIsICAyLCAgMSwgCi0JMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCi0JMSwgIDEsICAxLCAgMSwgIDEKLX07Ci0KLQotLyogUk1BWCB0YWJsZSBmb3Igbm9uIEludGVyIChMYXN0ID09IDAgYW5kIExhc3Q9MSkKLSAgIExldmVsIC0gMSBJbmRleGVkIAotIHBhZGRlZCBhcm1WQ000UDJfSW50cmFMMEwxUk1BWFsyNy0zMV0gd2l0aCB6ZXJvcyB0byBhY2Nlc3MgZW50cmllcyBmb3IgTGFzdD0xIHRhYmxlIGVmZmVjdGl2ZWx5ICovCi0KLQotY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRyYUwwTDFSTUFYWzQwXSA9Ci17Ci0gICAxNCwgIDksICA3LCAgMywgIDIsICAxLAkxLCAgCi0gICAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAJMCwgIAotICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAKLSAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAotCTAsCTAsCTAsCTAsCi0JCi0JMjAsICA2LCAgMSwgIDAsICAwLCAgMCwgIDAsICAwCi0KLX07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0xvb2t1cF9UYWJsZXMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfTG9va3VwX1RhYmxlcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTE1ZDNjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfTG9va3VwX1RhYmxlcy5jCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotIC8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfTG9va3VwX1RhYmxlcy5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDEyMjkwCi0gKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBGaWxlOiAgICAgICAgYXJtVkNNNFAyX0xvb2t1cF9UYWJsZXMuYwotICogRGVzY3JpcHRpb246IENvbnRhaW5zIGFsbCB0aGUgTG9va3VwIHRhYmxlcyB1c2VkIGluIE1QRUc0IGNvZGVjCi0gKgotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotCi0gICAgLyogKiBUYWJsZSBFbnRyaWVzIGNvbnRhaW4gRGMgU2NhbGVyIHZhbHVlcwotICAgICAgICogYXJtVkNNNFAyX0RDU2NhbGVyW2ldPSA4ICAgICAgICAgICBmb3IgaT0xICB0byAgNCBhbmQgaT0zMyB0byAzNgotICAgICAgICogICAgICAgICAgICAgICAgICAgICAgPSAyKmkgICAgICAgICBmb3IgaT01ICB0byAgOAotICAgICAgICogICAgICAgICAgICAgICAgICAgICAgPSBpKzggICAgICAgICBmb3IgaT05ICB0byAgMjUKLSAgICAgICAqICAgICAgICAgICAgICAgICAgICAgID0gMippLTE2ICAgICAgZm9yIGk9MjYgdG8gIDMxCi0gICAgICAgKiAgICAgICAgICAgICAgICAgICAgICA9IChpLTMyKzEzKS8yIGZvciBpPTM3IHRvICA1OQotICAgICAgICogICAgICAgICAgICAgICAgICAgICAgPSBpLTYtMzIgICAgICBmb3IgaT02MCB0byAgNjMKLSAgICAgICAqICAgICAgICAgICAgICAgICAgICAgID0gMjU1ICAgICAgICAgZm9yIGk9MCBhbmQgaT0zMgotICAgICAgICovCi0gICAgICAgCi1jb25zdCBPTVhfVTggYXJtVkNNNFAyX0RDU2NhbGVyWzY0XT17Ci0JMHhmZiwgMHg4LCAgMHg4LCAgMHg4LCAgMHg4LCAgMHhhLCAgMHhjLCAgMHhlLCAgCi0gICAgMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgCi0gICAgMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwKLSAgICAweDIwLCAweDIyLCAweDI0LCAweDI2LCAweDI4LCAweDJhLCAweDJjLCAweDJlLAotICAgIDB4ZmYsIDB4OCwgIDB4OCwgIDB4OCwgIDB4OCwgIDB4OSwgIDB4OSwgIDB4YSwgIAotICAgIDB4YSwgIDB4YiwgIDB4YiwgIDB4YywgIDB4YywgIDB4ZCwgIDB4ZCwgIDB4ZSwgIAotICAgIDB4ZSwgIDB4ZiwgIDB4ZiwgIDB4MTAsIDB4MTAsIDB4MTEsIDB4MTEsIDB4MTIsIAotICAgIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIDB4MTgsIDB4MTksCi0KLX07Ci0KLSAgICAgICAgICAgICAgCi0gICAgIC8qICBUYWJsZSBFbnRyaWVzIENvbnRhaW4gcmVjaXByb2NhbCBvZiAxIHRvIDYzCi0gICAgICAqICBhcm1WQ000UDJfUmVjaXByb2NhbF9RUF9TMTZbaV09cm91bmQoMzI3NjcvaSkKLSAgICAgICogIGFybVZDTTRQMl9SZWNpcHJvY2FsX1FQX1MxNlswXT0gMAotICAgICAgKi8KLQotY29uc3QgT01YX1MxNiBhcm1WQ000UDJfUmVjaXByb2NhbF9RUF9TMTZbNjRdPXsKLQkweDAwMDAsMHg3ZmZmLDB4NDAwMCwweDJhYWEsMHgyMDAwLDB4MTk5OSwweDE1NTUsMHgxMjQ5LAotICAgIDB4MTAwMCwweDBlMzksMHgwY2NkLDB4MGJhMywweDBhYWIsMHgwOWQ5LDB4MDkyNSwweDA4ODgsCi0gICAgMHgwODAwLDB4MDc4NywweDA3MWMsMHgwNmJkLDB4MDY2NiwweDA2MTgsMHgwNWQxLDB4MDU5MSwKLSAgICAweDA1NTUsMHgwNTFmLDB4MDRlYywweDA0YmUsMHgwNDkyLDB4MDQ2YSwweDA0NDQsMHgwNDIxLAotICAgIDB4MDQwMCwweDAzZTEsMHgwM2M0LDB4MDNhOCwweDAzOGUsMHgwMzc2LDB4MDM1ZSwweDAzNDgsCi0gICAgMHgwMzMzLDB4MDMxZiwweDAzMGMsMHgwMmZhLDB4MDJlOSwweDAyZDgsMHgwMmM4LDB4MDJiOSwKLSAgICAweDAyYWIsMHgwMjlkLDB4MDI4ZiwweDAyODIsMHgwMjc2LDB4MDI2YSwweDAyNWYsMHgwMjU0LAotICAgIDB4MDI0OSwweDAyM2YsMHgwMjM1LDB4MDIyYiwweDAyMjIsMHgwMjE5LDB4MDIxMSwweDAyMDgKLQkgICAKLX07Ci0gICAgIAotICAgICAgLyogVGFibGUgRW50cmllcyBDb250YWluIHJlY2lwcm9jYWwgb2YgMSB0byA2MwotICAgICAgICogYXJtVkNNNFAyX1JlY2lwcm9jYWxfUVBfUzMyW2ldPXJvdW5kKDEzMTA3MS9pKQotICAgICAgICogYXJtVkNNNFAyX1JlY2lwcm9jYWxfUVBfUzMyWzBdPSAwCi0gICAgICAgKi8KLQotY29uc3QgT01YX1MzMiBhcm1WQ000UDJfUmVjaXByb2NhbF9RUF9TMzJbNjRdPXsKLQkweDAwMDAwMDAwLDB4MDAwMWZmZmYsMHgwMDAxMDAwMCwweDAwMDBhYWFhLCAweDAwMDA4MDAwLCAweDAwMDA2NjY2LCAweDAwMDA1NTU1LCAweDAwMDA0OTI0LAotICAgIDB4MDAwMDQwMDAsMHgwMDAwMzhlMywweDAwMDAzMzMzLDB4MDAwMDJlOGMsIDB4MDAwMDJhYWIsIDB4MDAwMDI3NjIsIDB4MDAwMDI0OTIsIDB4MDAwMDIyMjIsCi0gICAgMHgwMDAwMjAwMCwweDAwMDAxZTFlLDB4MDAwMDFjNzIsMHgwMDAwMWFmMiwgMHgwMDAwMTk5YSwgMHgwMDAwMTg2MSwgMHgwMDAwMTc0NiwgMHgwMDAwMTY0MywKLSAgICAweDAwMDAxNTU1LDB4MDAwMDE0N2IsMHgwMDAwMTNiMSwweDAwMDAxMmY2LCAweDAwMDAxMjQ5LCAweDAwMDAxMWE4LCAweDAwMDAxMTExLCAweDAwMDAxMDg0LAotICAgIDB4MDAwMDEwMDAsMHgwMDAwMGY4NCwweDAwMDAwZjBmLDB4MDAwMDBlYTEsIDB4MDAwMDBlMzksIDB4MDAwMDBkZDYsIDB4MDAwMDBkNzksIDB4MDAwMDBkMjEsCi0gICAgMHgwMDAwMGNjZCwweDAwMDAwYzdkLDB4MDAwMDBjMzEsMHgwMDAwMGJlOCwgMHgwMDAwMGJhMywgMHgwMDAwMGI2MSwgMHgwMDAwMGIyMSwgMHgwMDAwMGFlNSwKLSAgICAweDAwMDAwYWFiLDB4MDAwMDBhNzMsMHgwMDAwMGEzZCwweDAwMDAwYTBhLCAweDAwMDAwOWQ5LCAweDAwMDAwOWE5LCAweDAwMDAwOTdiLCAweDAwMDAwOTRmLAotICAgIDB4MDAwMDA5MjUsMHgwMDAwMDhmYiwweDAwMDAwOGQ0LDB4MDAwMDA4YWUsIDB4MDAwMDA4ODksIDB4MDAwMDA4NjUsIDB4MDAwMDA4NDIsIDB4MDAwMDA4MjAKLQkKLX07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1NldFByZWREaXJfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9TZXRQcmVkRGlyX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYzZjM2My4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1NldFByZWREaXJfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDJfU2V0UHJlZERpcl9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICAxMjI5MAotOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLTsgKioKLTsgKiBGdW5jdGlvbjogYXJtVkNNNFAyX1NldFByZWREaXIKLTsgKgotOyAqIERlc2NyaXB0aW9uOgotOyAqIFBlcmZvcm1zIGRldGVjdGluZyB0aGUgcHJlZGljdGlvbiBkaXJlY3Rpb24KLTsgKgotOyAqIFJlbWFya3M6Ci07ICoKLTsgKiBQYXJhbWV0ZXJzOgotOyAqIFtpbl0gYmxvY2tJbmRleCAgYmxvY2sgaW5kZXggaW5kaWNhdGluZyB0aGUgY29tcG9uZW50IHR5cGUgYW5kCi07ICogICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uIGFzIGRlZmluZWQgaW4gc3ViY2xhdXNlIDYuMS4zLjgsIG9mIElTTy9JRUMKLTsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgMTQ0OTYtMi4gRnVydGhlcm1vcmUsIGluZGV4ZXMgNiB0byA5IGluZGljYXRlIHRoZQotOyAqICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSBibG9ja3Mgc3BhdGlhbGx5IGNvcnJlc3BvbmRpbmcgdG8gbHVtaW5hbmNlCi07ICogICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrcyAwIHRvIDMgaW4gdGhlIHNhbWUgbWFjcm9ibG9jay4KLTsgKiBbaW5dIHBDb2VmQnVmUm93IHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHJvdyBidWZmZXIKLTsgKiBbaW5dIHBRcEJ1ZiAgICAgIHBvaW50ZXIgdG8gdGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYnVmZmVyCi07ICogW291dF1wcmVkUVAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBwcmVkaWN0b3IgYmxvY2sKLTsgKiBbb3V0XXByZWREaXIgICAgIGluZGljYXRlcyB0aGUgcHJlZGljdGlvbiBkaXJlY3Rpb24gd2hpY2ggdGFrZXMgb25lCi07ICogICAgICAgICAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKLTsgKiAgICAgICAgICAgICAgICAgIE9NWF9WQ19IT1JJWk9OVEFMICAgIHByZWRpY3QgaG9yaXpvbnRhbGx5Ci07ICogICAgICAgICAgICAgICAgICBPTVhfVkNfVkVSVElDQUwgICAgICBwcmVkaWN0IHZlcnRpY2FsbHkKLTsgKgotOyAqIFJldHVybiBWYWx1ZToKLTsgKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLTsgKgotOyAqLwotCi0gICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAgSU5DTFVERSBvbXhWQ19zLmgKLQotCi0gICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLQotCi0gICAgICAgSUYgQVJNMTEzNkpTCi0gCi07Ly8gSW5wdXQgQXJndW1lbnRzCi1CbG9ja0luZGV4ICAgICAgICAgUk4gMAotcENvZWZCdWZSb3cgICAgICAgIFJOIDEKLXBDb2VmQnVmQ29sICAgICAgICBSTiAyCi1wcmVkRGlyICAgICAgICAgICAgUk4gMwotcHJlZFFQICAgICAgICAgICAgIFJOIDQKLXBRcEJ1ZiAgICAgICAgICAgICBSTiA1Ci0KLTsvLyBMb2NhbCBWYXJpYWJsZXMKLQotUmV0dXJuICAgICAgICAgICAgIFJOIDAKLWJsb2NrRENMZWZ0ICAgICAgICBSTiA2ICAKLWJsb2NrRENUb3AgICAgICAgICBSTiA3Ci1ibG9ja0RDVG9wTGVmdCAgICAgUk4gOAotdGVtcDEgICAgICAgICAgICAgIFJOIDkKLXRlbXAyICAgICAgICAgICAgICBSTiAxNAotCi0gICAgICAgTV9TVEFSVCAgICBhcm1WQ000UDJfU2V0UHJlZERpcixyOQotCi0gICAgICAgTV9BUkcgICAgICAgcHByZWRRUCw0Ci0gICAgICAgTV9BUkcgICAgICAgcHBRcEJ1Ziw0Ci0gICAgCi0gICAgICAgTERSSCAgICAgICAgYmxvY2tEQ1RvcExlZnQsW3BDb2VmQnVmUm93LCMtMTZdCi0gICAgICAgTERSSCAgICAgICAgYmxvY2tEQ0xlZnQsW3BDb2VmQnVmQ29sXQotICAgICAgIAotICAgICAgIFRFUSAgICAgICAgIEJsb2NrSW5kZXgsIzMKLSAgICAgICBMRFJFUUggICAgICBibG9ja0RDVG9wLFtwQ29lZkJ1ZkNvbCwjLTE2XQotICAgICAgIExEUk5FSCAgICAgIGJsb2NrRENUb3AsW3BDb2VmQnVmUm93XQotICAgICAgICAgICAgIAotICAgICAgIFNVQlMgICAgICAgIHRlbXAxLGJsb2NrRENMZWZ0LGJsb2NrRENUb3BMZWZ0Ci0gICAgICAgUlNCTFQgICAgICAgdGVtcDEsdGVtcDEsIzAKLSAgICAgICBTVUJTICAgICAgICB0ZW1wMixibG9ja0RDVG9wTGVmdCxibG9ja0RDVG9wCi0gICAgICAgUlNCTFQgICAgICAgdGVtcDIsdGVtcDIsIzAKLSAgICAgIAotICAgICAgIE1fTERSICAgICAgIHBRcEJ1ZixwcFFwQnVmCi0gICAgICAgTV9MRFIgICAgICAgcHJlZFFQLHBwcmVkUVAKLSAgICAgICBDTVAgICAgICAgICB0ZW1wMSx0ZW1wMgotICAgICAgIE1PViAgICAgICAgIHRlbXAyLCNPTVhfVkNfVkVSVElDQUwKLSAgICAgICBMRFJMVEIgICAgICB0ZW1wMSxbcFFwQnVmLCMxXQotICAgICAgIFNUUkxUICAgICAgIHRlbXAyLFtwcmVkRGlyXQotICAgICAgIFNUUkxUICAgICAgIHRlbXAxLFtwcmVkUVBdCi0gICAgICAgTU9WICAgICAgICAgdGVtcDIsI09NWF9WQ19IT1JJWk9OVEFMICAgICAgICAgICAKLSAgICAgICBMRFJHRUIgICAgICB0ZW1wMSxbcFFwQnVmXQotICAgICAgIFNUUkdFICAgICAgIHRlbXAyLFtwcmVkRGlyXQotICAgICAgIE1PViAgICAgICAgIFJldHVybiwjT01YX1N0c19Ob0VycgotICAgICAgIFNUUkdFICAgICAgIHRlbXAxLFtwcmVkUVBdIAotCi0gICAgICAgICAKLSAgICAKLSAgICAgICBNX0VORAotIAotICAgICAgIEVORElGCi0KLSAgICAgICBFTkQgICAgCi0gICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfWmlnemFnX1RhYmxlcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTliNDM0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfWmlnemFnX1RhYmxlcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgMTIyOTAKLSAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIEZpbGU6ICAgICAgICBhcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5jCi0gKiBEZXNjcmlwdGlvbjogQ29udGFpbnMgdGhlIHppZ3phZyB0YWJsZXMKLSAqCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0KLS8qIENvbnRhaW5zIERvdWJsZSB0aGUgdmFsdWVzIGluIHRoZSByZWZlcmVuY2UgWmlnemFnIFRhYmxlCi0gKiBDb250YWlucyBDbGFzc2ljYWwsVmV0aWNhbCBhbmQgSG9yaXpvbnRhbCBaaWd6YWdzY2FuIHRhYmxlcyBpbiBvbmUgYXJyYXkgIAotICovCi0KLWNvbnN0IE9NWF9VOCBhcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW4gWzE5Ml0gPSAKLXsKLSAgICAgMCwgIDIsICAxNiwgMzIsICAxOCwgIDQsICA2LCAyMCwKLSAgICAzNCwgNDgsIDY0LCA1MCwgMzYsIDIyLCAgOCwgIDEwLAotICAgIDI0LCAzOCwgNTIsIDY2LCA4MCwgOTYsIDgyLCA2OCwKLSAgICA1NCwgNDAsIDI2LCAgMTIsICAxNCwgMjgsIDQyLCA1NiwgCi0gICAgNzAsIDg0LCA5OCwgMTEyLCAxMTQsIDEwMCwgODYsIDcyLAotICAgIDU4LCA0NCwgMzAsIDQ2LCA2MCwgNzQsIDg4LCAxMDIsCi0gICAgMTE2LCAxMTgsIDEwNCwgOTAsIDc2LCA2MiwgNzgsIDkyLAotICAgIDEwNiwgMTIwLCAxMjIsIDEwNCwgOTQsIDExMCwgMTI0LCAxMjYsCi0KLQkwLCAgMTYsIDMyLCA0OCwgIDIsICAxOCwgIDQsIDIwLAotICAgIDM0LCA1MCwgNjQsIDgwLCA5NiwgMTEyLCAxMTQsIDk4LAotICAgIDgyLCA2NiwgNTIsIDM2LCAgNiwgMjIsICA4LCAyNCwKLSAgICAzOCwgNTQsIDY4LCA4NCwgMTAwLCAxMTYsIDcwLCA4NiwKLSAgICAxMDIsIDExOCwgNDAsIDU2LCAgMTAsIDI2LCAgMTIsIDI4LAotICAgIDQyLCA1OCwgNzIsIDg4LCAxMDQsIDEyMCwgNzQsIDkwLCAKLSAgICAxMDYsIDEyMiwgNDQsIDYwLCAgMTQsIDMwLCA0NiwgNjIsCi0gICAgNzYsIDkyLCAxMDgsIDEyNCwgNzgsIDk0LCAxMTAsIDEyNiwKLQotICAgIDAsICAyLCAgNCwgIDYsICAxNiwgIDE4LCAzMiwgMzQsCi0gICAgMjAsIDIyLCAgOCwgIDEwLCAgMTIsICAxNCwgMzAsIDI4LAotICAgIDI2LCAyNCwgMzgsIDM2LCA0OCwgNTAsIDY0LCA2NiwKLSAgICA1MiwgNTQsIDQwLCA0MiwgNDQsIDQ2LCA1NiwgNTgsCi0gICAgNjAsIDYyLCA2OCwgNzAsIDgwLCA4MiwgOTYsIDk4LAotICAgIDg0LCA4NiwgNzIsIDc0LCA3NiwgNzgsIDg4LCA5MCwgCi0gICAgOTIsIDk0LCAxMDAsIDEwMiwgMTEyLCAxMTQsIDExNiwgMTE4LAotICAgIDEwNCwgMTA2LCAxMDgsIDExMCwgMTIwLCAxMjIsIDEyNCwgMTI2Ci0KLQotfTsKLQotCi0KLQotCi0vKiBFbmQgb2YgZmlsZSAqLwotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTM0NmFkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICAxMjI5MAotICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRGVzY3JpcHRpb246IAotICogQ29udGFpbnMgbW9kdWxlcyBmb3IgaW50ZXIgcmVjb25zdHJ1Y3Rpb24KLSAqIAotICovCi0gCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlcgotICoKLSAqIERlc2NyaXB0aW9uOgotICogRGVjb2RlcyB0aGUgSU5URVIgYmxvY2sgY29lZmZpY2llbnRzLiBJbnZlcnNlIHF1YW50aXphdGlvbiwgaW52ZXJzZWx5IHppZ3phZwotICogcG9zaXRpb25pbmcgYW5kIElEQ1QsIHdpdGggYXBwcm9wcmlhdGUgY2xpcHBpbmcgb24gZWFjaCBzdGVwLCBhcmUgcGVyZm9ybWVkCi0gKiBvbiB0aGUgY29lZmZpY2llbnRzLiBUaGUgcmVzdWx0cyAocmVzaWR1YWxzKSBhcmUgcGxhY2VkIGluIGEgY29udGlndW91cyBhcnJheQotICogb2YgNjQgZWxlbWVudHMuIEZvciBJTlRFUiBibG9jaywgdGhlIG91dHB1dCBidWZmZXIgaG9sZHMgdGhlIHJlc2lkdWFscyBmb3IKLSAqIGZ1cnRoZXIgcmVjb25zdHJ1Y3Rpb24uCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCi0gKgkJCQkJCQkJdGhlIGJpdCBzdHJlYW0gYnVmZmVyLiBUaGVyZSBpcyBubyBib3VuZGFyeQotICoJCQkJCQkJCWNoZWNrIGZvciB0aGUgYml0IHN0cmVhbSBidWZmZXIuCi0gKiBbaW5dCXBCaXRPZmZzZXQJCXBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCi0gKgkJCQkJCQkJdG8gYnkgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4KLSAqCQkJCQkJCQlbMC03XQotICogW2luXQlRUAkJCQlxdWFudGl6YXRpb24gcGFyYW1ldGVyCi0gKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgICAgYSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOwotICogICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xIGluZGljYXRlcyB1c2luZyBxdWFudGl6YXRpb24gbWV0aG9kIGRlZmluZWQgaW4gc2hvcnQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8gaGVhZGVyIG1vZGUsIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIGluZGljYXRlcyBub3JtYWlsIHF1YW50aXphdGlvbiBtZXRob2QuCi0gKiBbb3V0XSBwcEJpdFN0cmVhbSAJKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQsIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4KLSAqIFtvdXRdIHBCaXRPZmZzZXQJCSpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbQotICogW291dF0gcERzdAkJCXBvaW50ZXIgdG8gdGhlIGRlY29kZWQgcmVzaWR1YWwgYnVmZmVyIChhIGNvbnRpZ3VvdXMgYXJyYXkgb2YgNjQgZWxlbWVudHMgb2YKLSAqICAgICAgICAgICAgICAgICAgICAgIE9NWF9TMTYgZGF0YSB0eXBlKS4gTXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX1N0c19Ob0VyciAtIG5vIGVycm9yCi0gKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMKLSAqICAgLSBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOdWxsOiBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0ICwgcERzdAotICogICAtIEF0IGxlYXN0IG9uZSBvZiB0aGUgYmVsb3cgY2FzZToKLSAqICAgLSAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddLCBRUCA8PSAwOwotICoJIC0gcERzdCBub3QgMTYtYnl0ZSBhbGlnbmVkCi0gKiBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvcgotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIoCi0gICAgIGNvbnN0IE9NWF9VOCAqKiBwcEJpdFN0cmVhbSwKLSAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCi0gICAgIE9NWF9TMTYgKiBwRHN0LAotICAgICBPTVhfSU5UIFFQLAotICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSkKLXsKLSAgICAvKiA2NCBlbGVtZW50cyBhcmUgbmVlZGVkIGJ1dCB0byBhbGlnbiBpdCB0byAxNiBieXRlcyBuZWVkCi0gICAgMTUgbW9yZSBlbGVtZW50cyBvZiBwYWRkaW5nICovCi0gICAgT01YX1MxNiB0ZW1wQnVmWzc5XTsKLSAgICBPTVhfUzE2ICpwVGVtcEJ1ZjE7Ci0gICAgT01YUmVzdWx0IGVycm9yQ29kZTsKLSAgICAvKiBBbGlnbmluZyB0aGUgbG9jYWwgYnVmZmVycyAqLwotICAgIHBUZW1wQnVmMSA9IGFybUFsaWduVG8xNkJ5dGVzKHRlbXBCdWYpOwotICAgIAotICAgIAotICAgIC8qIFZMRCBhbmQgemlnemFnICovCi0gICAgZXJyb3JDb2RlID0gb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcihwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBCdWYxLHNob3J0VmlkZW9IZWFkZXIpOwotICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOwotICAgIAotICAgIC8qIERlcXVhbnRpemF0aW9uICovCi0gICAgZXJyb3JDb2RlID0gb214VkNNNFAyX1F1YW50SW52SW50ZXJfSSgKLSAgICAgcFRlbXBCdWYxLAotICAgICBRUCk7Ci0gICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7Ci0gICAgCi0gICAgLyogSW52ZXJzZSB0cmFuc2Zvcm0gKi8KLSAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfSURDVDh4OGJsayhwVGVtcEJ1ZjEsIHBEc3QpOwotICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOwotCSAgICAKLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotLyogRW5kIG9mIGZpbGUgKi8KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFlYzVkMi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgMTIyOTAKLSAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIERlc2NyaXB0aW9uOiAKLSAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIGludHJhIHJlY29uc3RydWN0aW9uCi0gKiAKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0KLS8qIEZ1bmN0aW9uIGZvciBzYXR1cmF0aW5nIDE2IGJpdCB2YWx1ZXMgdG8gdGhlIFswLDI1NV0gcmFuZ2UgYW5kICAqLwotLyogd3JpdGluZyBvdXQgYXMgOCBiaXQgdmFsdWVzLiAgRG9lcyA2NCBlbnRyaWVzICAgICAgICAgICAgICAgICAgICovCi12b2lkIGFybVZDTTRQMl9DbGlwOChPTVhfUzE2ICpwU3JjLCBPTVhfVTggKnBEc3QsIE9NWF9JTlQgZHN0U3RlcCApOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYQotICoKLSAqIERlc2NyaXB0aW9uOgotICogRGVjb2RlcyB0aGUgSU5UUkEgYmxvY2sgY29lZmZpY2llbnRzLiBJbnZlcnNlIHF1YW50aXphdGlvbiwgaW52ZXJzZWx5IHppZ3phZwotICogcG9zaXRpb25pbmcsIGFuZCBJRENULCB3aXRoIGFwcHJvcHJpYXRlIGNsaXBwaW5nIG9uIGVhY2ggc3RlcCwgYXJlIHBlcmZvcm1lZAotICogb24gdGhlIGNvZWZmaWNpZW50cy4gVGhlIHJlc3VsdHMgYXJlIHRoZW4gcGxhY2VkIGluIHRoZSBvdXRwdXQgZnJhbWUvcGxhbmUgb24KLSAqIGEgcGl4ZWwgYmFzaXMuIEZvciBJTlRSQSBibG9jaywgdGhlIG91dHB1dCB2YWx1ZXMgYXJlIGNsaXBwZWQgdG8gWzAsIDI1NV0gYW5kCi0gKiB3cml0dGVuIHRvIGNvcnJlc3BvbmRpbmcgYmxvY2sgYnVmZmVyIHdpdGhpbiB0aGUgZGVzdGluYXRpb24gcGxhbmUuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCi0gKgkJCQkJCQkJdGhlIGJpdCBzdHJlYW0gYnVmZmVyLiBUaGVyZSBpcyBubyBib3VuZGFyeQotICoJCQkJCQkJCWNoZWNrIGZvciB0aGUgYml0IHN0cmVhbSBidWZmZXIuCi0gKiBbaW5dCXBCaXRPZmZzZXQJCXBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCi0gKgkJCQkJCQkJdG8gYnkgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4KLSAqCQkJCQkJCQlbMC03XS4KLSAqIFtpbl0Jc3RlcAkJCXdpZHRoIG9mIHRoZSBkZXN0aW5hdGlvbiBwbGFuZQotICogW2luL291dF0JcENvZWZCdWZSb3cJCVtpbl0gIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHJvdyBidWZmZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgW291dF0gdXBkYXRlZCBjb2VmZmljaWVudCByd28gYnVmZmVyCi0gKiBbaW4vb3V0XQlwQ29lZkJ1ZkNvbAkJW2luXSAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcgotICogICAgICAgICAgICAgICAgICAgICAgICBbb3V0XSB1cGRhdGVkIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIKLSAqIFtpbl0JY3VyUVAJCQlxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBtYWNyb2Jsb2NrIHdoaWNoCi0gKgkJCQkJCQkJdGhlIGN1cnJlbnQgYmxvY2sgYmVsb25ncyB0bwotICogW2luXQlwUXBCdWYJCSBQb2ludGVyIHRvIGEgMi1lbGVtZW50IFFQIGFycmF5LiBwUXBCdWZbMF0gaG9sZHMgdGhlIFFQIG9mIHRoZSA4eDggYmxvY2sgbGVmdCB0bwotICogICAgICAgICAgICAgICAgICAgdGhlIGN1cnJlbnQgYmxvY2soUVBhKS4gcFFwQnVmWzFdIGhvbGRzIHRoZSBRUCBvZiB0aGUgOHg4IGJsb2NrIGp1c3QgYWJvdmUgdGhlCi0gKiAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJsb2NrKFFQYykuCi0gKiAgICAgICAgICAgICAgICAgICBOb3RlLCBpbiBjYXNlIHRoZSBjb3JyZXNwb25kaW5nIGJsb2NrIGlzIG91dCBvZiBWT1AgYm91bmQsIHRoZSBRUCB2YWx1ZSB3aWxsIGhhdmUKLSAqICAgICAgICAgICAgICAgICAgIG5vIGVmZmVjdCB0byB0aGUgaW50cmEtcHJlZGljdGlvbiBwcm9jZXNzLiBSZWZlciB0byBzdWJjbGF1c2UgICI3LjQuMy4zIEFkYXB0aXZlCi0gKiAgICAgICAgICAgICAgICAgICBhYyBjb2VmZmljaWVudCBwcmVkaWN0aW9uIiBvZiBJU08vSUVDIDE0NDk2LTIoTVBFRzQgUGFydDIpIGZvciBhY2N1cmF0ZSBkZXNjcmlwdGlvbi4KLSAqIFtpbl0JYmxvY2tJbmRleAkJYmxvY2sgaW5kZXggaW5kaWNhdGluZyB0aGUgY29tcG9uZW50IHR5cGUgYW5kCi0gKgkJCQkJCQkJcG9zaXRpb24gYXMgZGVmaW5lZCBpbiBzdWJjbGF1c2UgNi4xLjMuOCwKLSAqCQkJCQkJCQlGaWd1cmUgNi01IG9mIElTTy9JRUMgMTQ0OTYtMi4gCi0gKiBbaW5dCWludHJhRENWTEMJCWEgY29kZSBkZXRlcm1pbmVkIGJ5IGludHJhX2RjX3ZsY190aHIgYW5kIFFQLgotICoJCQkJCQkJCVRoaXMgYWxsb3dzIGEgbWVjaGFuaXNtIHRvIHN3aXRjaCBiZXR3ZWVuIHR3byBWTEMKLSAqCQkJCQkJCQlmb3IgY29kaW5nIG9mIEludHJhIERDIGNvZWZmaWNpZW50cyBhcyBwZXIgVGFibGUKLSAqCQkJCQkJCQk2LTIxIG9mIElTTy9JRUMgMTQ0OTYtMi4gCi0gKiBbaW5dCUFDUHJlZEZsYWcJCWEgZmxhZyBlcXVhbCB0byBhY19wcmVkX2ZsYWcgKG9mIGx1bWluYW5jZSkgaW5kaWNhdGluZwotICoJCQkJCQkJCWlmIHRoZSBhYyBjb2VmZmljaWVudHMgb2YgdGhlIGZpcnN0IHJvdyBvciBmaXJzdAotICoJCQkJCQkJCWNvbHVtbiBhcmUgZGlmZmVyZW50aWFsbHkgY29kZWQgZm9yIGludHJhIGNvZGVkCi0gKgkJCQkJCQkJbWFjcm9ibG9jay4KLSAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciAgICBhIGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgbW9kZSwKLSAqCQkJCQkJCWFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9ubGluZWFyIGludHJhIERDIG1vZGUuCi0gKiBbb3V0XQlwcEJpdFN0cmVhbQkJKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzCi0gKgkJCQkJCQkJZGVjb2RlZCwgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZQotICoJCQkJCQkJCWluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlcgotICogW291dF0JcEJpdE9mZnNldAkJKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKLSAqCQkJCQkJCQljdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Ci0gKgkJCQkJCQkJKnBwQml0U3RyZWFtCi0gKiBbb3V0XQlwRHN0CQkJcG9pbnRlciB0byB0aGUgYmxvY2sgaW4gdGhlIGRlc3RpbmF0aW9uIHBsYW5lLgotICoJCQkJCQkJCXBEc3Qgc2hvdWxkIGJlIDE2LWJ5dGUgYWxpZ25lZC4KLSAqIFtvdXRdCXBDb2VmQnVmUm93CQlwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IHJvdyBidWZmZXIuCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX1N0c19Ob0VyciAtIG5vIGVycm9yCi0gKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMKLSAqICAgLQlBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29lZkJ1ZlJvdywgcENvZWZCdWZDb2wsIHBRUEJ1ZiwgcERzdC4KLSAqICAgICAgb3IKLSAqICAgLSAgQXQgbGVhc3Qgb25lIG9mIHRoZSBiZWxvdyBjYXNlOiAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddLCBjdXJRUCBleGNlZWRzICgxLCAzMSksCi0gKiAgICAgIGJsb2NrSW5kZXggZXhjZWVkcyBbMCw5XSwgc3RlcCBpcyBub3QgdGhlIG11bHRpcGxlIG9mIDgsIGludHJhRENWTEMgaXMgemVybyB3aGlsZQotICogICAgICBibG9ja0luZGV4IGdyZWF0ZXIgdGhhbiA1LgotICogICAgICBvcgotICogICAtCXBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZAotICogT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEoCi0gICAgIGNvbnN0IE9NWF9VOCAqKiBwcEJpdFN0cmVhbSwKLSAgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICAgT01YX1U4ICpwRHN0LAotICAgICBPTVhfSU5UIHN0ZXAsCi0gICAgIE9NWF9TMTYgKnBDb2VmQnVmUm93LAotICAgICBPTVhfUzE2ICpwQ29lZkJ1ZkNvbCwKLSAgICAgT01YX1U4IGN1clFQLAotICAgICBjb25zdCBPTVhfVTggKnBRUEJ1ZiwKLSAgICAgT01YX0lOVCBibG9ja0luZGV4LAotICAgICBPTVhfSU5UIGludHJhRENWTEMsCi0gICAgIE9NWF9JTlQgQUNQcmVkRmxhZywKLQkgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0gKQotewotICAgIE9NWF9TMTYgdGVtcEJ1ZjFbNzldLCB0ZW1wQnVmMls3OV07Ci0gICAgT01YX1MxNiAqcFRlbXBCdWYxLCAqcFRlbXBCdWYyOwotICAgIE9NWF9JTlQgcHJlZERpciwgcHJlZEFDRGlyOwotICAgIE9NWF9JTlQgIHByZWRRUDsKLSAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCB2aWRlb0NvbXA7Ci0gICAgT01YUmVzdWx0IGVycm9yQ29kZTsKLSAgICAKLSAgICAKLSAgICAvKiBBbGlnbmluZyB0aGUgbG9jYWwgYnVmZmVycyAqLwotICAgIHBUZW1wQnVmMSA9IGFybUFsaWduVG8xNkJ5dGVzKHRlbXBCdWYxKTsKLSAgICBwVGVtcEJ1ZjIgPSBhcm1BbGlnblRvMTZCeXRlcyh0ZW1wQnVmMik7Ci0gICAgCi0gICAgLyogU2V0dGluZyB0aGUgQUMgcHJlZGljdGlvbiBkaXJlY3Rpb24gYW5kIHByZWRpY3Rpb24gZGlyZWN0aW9uICovCi0gICAgYXJtVkNNNFAyX1NldFByZWREaXIoCi0gICAgICAgIGJsb2NrSW5kZXgsCi0gICAgICAgIHBDb2VmQnVmUm93LAotICAgICAgICBwQ29lZkJ1ZkNvbCwKLSAgICAgICAgJnByZWREaXIsCi0gICAgICAgICZwcmVkUVAsCi0gICAgICAgIHBRUEJ1Zik7Ci0KLSAgICBwcmVkQUNEaXIgPSBwcmVkRGlyOwotCi0gICAgCi0gICAgaWYgKEFDUHJlZEZsYWcgPT0gMCkKLSAgICB7Ci0gICAgICAgIHByZWRBQ0RpciA9IE9NWF9WQ19OT05FOwotICAgIH0KLQotICAgIC8qIFNldHRpbmcgdGhlIHZpZGVvQ29tcCAqLwotICAgIGlmIChibG9ja0luZGV4IDw9IDMpCi0gICAgewotICAgICAgICB2aWRlb0NvbXAgPSBPTVhfVkNfTFVNSU5BTkNFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB2aWRlb0NvbXAgPSBPTVhfVkNfQ0hST01JTkFOQ0U7Ci0gICAgfQotICAgIAotCi0gICAgLyogVkxEIGFuZCB6aWd6YWcgKi8KLSAgICBpZiAoaW50cmFEQ1ZMQyA9PSAxKQotICAgIHsKLSAgICAgICAgZXJyb3JDb2RlID0gb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDKAotICAgICAgICAgICAgcHBCaXRTdHJlYW0sCi0gICAgICAgICAgICBwQml0T2Zmc2V0LAotICAgICAgICAgICAgcFRlbXBCdWYxLAotICAgICAgICAgICAgcHJlZEFDRGlyLAotICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlciwKLSAgICAgICAgICAgIHZpZGVvQ29tcCk7Ci0gICAgICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMoCi0gICAgICAgICAgICBwcEJpdFN0cmVhbSwKLSAgICAgICAgICAgIHBCaXRPZmZzZXQsCi0gICAgICAgICAgICBwVGVtcEJ1ZjEsCi0gICAgICAgICAgICBwcmVkQUNEaXIsCi0gICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyKTsKLSAgICAgICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7Ci0gICAgfQotCi0gICAgLyogQUMgREMgcHJlZGljdGlvbiAqLwotICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEoCi0gICAgICAgIHBUZW1wQnVmMSwKLSAgICAgICAgcENvZWZCdWZSb3csCi0gICAgICAgIHBDb2VmQnVmQ29sLAotICAgICAgICBjdXJRUCwKLSAgICAgICAgcHJlZFFQLAotICAgICAgICBwcmVkRGlyLAotICAgICAgICBBQ1ByZWRGbGFnLAotICAgICAgICB2aWRlb0NvbXApOwotICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOwotICAgIAotICAgIC8qIERlcXVhbnRpemF0aW9uICovCi0gICAgZXJyb3JDb2RlID0gb214VkNNNFAyX1F1YW50SW52SW50cmFfSSgKLSAgICAgcFRlbXBCdWYxLAotICAgICBjdXJRUCwKLSAgICAgdmlkZW9Db21wLAotICAgICBzaG9ydFZpZGVvSGVhZGVyKTsKLSAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKLSAgICAKLSAgICAvKiBJbnZlcnNlIHRyYW5zZm9ybSAqLwotICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9JRENUOHg4YmxrIChwVGVtcEJ1ZjEsIHBUZW1wQnVmMik7Ci0gICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7Ci0gICAgCi0gICAgLyogUGxhY2luZyB0aGUgbGluZWFyIGFycmF5IGludG8gdGhlIGRlc3RpbmF0aW9uIHBsYW5lIGFuZCBjbGlwcGluZwotICAgICAgIGl0IHRvIDAgdG8gMjU1ICovCi0gICAgCi0JYXJtVkNNNFAyX0NsaXA4KHBUZW1wQnVmMixwRHN0LHN0ZXApOwotCQotCQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUF9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1Bfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGU5NTM4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUF9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzNzggKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsgKioqKioqKioqKgotOyAqIAotOyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QX3MucwotOyAqIE9wZW5NQVggREw6IHYxLjAuMgotOyAqIFJldmlzaW9uOiAgIDEyMjkwCi07ICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci07ICogCi07ICogCi07ICogCi07ICogCi07ICoqCi07ICogRnVuY3Rpb246IG9teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QCi07ICoKLTsgKiBEZXNjcmlwdGlvbjoKLTsgKiBEZWNvZGVzIGFuZCBwYWRzIGZvdXIgbW90aW9uIHZlY3RvcnMgb2YgdGhlIG5vbi1pbnRyYSBtYWNyb2Jsb2NrIGluIFAtVk9QLgotOyAqIFRoZSBtb3Rpb24gdmVjdG9yIHBhZGRpbmcgcHJvY2VzcyBpcyBzcGVjaWZpZWQgaW4gc3ViY2xhdXNlIDcuNi4xLjYgb2YKLTsgKiBJU08vSUVDIDE0NDk2LTIuCi07ICoKLTsgKiBSZW1hcmtzOgotOyAqCi07ICoKLTsgKiBQYXJhbWV0ZXJzOgotOyAqIFtpbl0gICAgcHBCaXRTdHJlYW0gICAgICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgotOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlcgotOyAqIFtpbl0gICAgcEJpdE9mZnNldCAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCi07ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYnkgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4KLTsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMC03XS4KLTsgKiBbaW5dICAgIHBTcmNNVkxlZnRNQiAgICAgICBwb2ludGVycyB0byB0aGUgbW90aW9uIHZlY3RvciBidWZmZXJzIG9mIHRoZQotOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9ja3Mgc3BlY2lhbGx5IGF0IHRoZSBsZWZ0IHNpZGUgb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jawotOyAqICAgICAgICAgICAgICAgICAgICAgcmVzcGVjdGl2ZWx5LgotOyAqIFtpbl0gICAgcFNyY01WVXBwZXJNQiAgICAgIHBvaW50ZXJzIHRvIHRoZSBtb3Rpb24gdmVjdG9yIGJ1ZmZlcnMgb2YgdGhlCi07ICogICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrcyBzcGVjaWFsbHkgYXQgdGhlIHVwcGVyIHNpZGUgb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jawotOyAqICAgICAgICAgICAgICAgICAgICAgcmVzcGVjdGl2ZWx5LgotOyAqIFtpbl0gICAgcFNyY01WVXBwZXJSaWdodE1CIHBvaW50ZXJzIHRvIHRoZSBtb3Rpb24gdmVjdG9yIGJ1ZmZlcnMgb2YgdGhlCi07ICogICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrcyBzcGVjaWFsbHkgYXQgdGhlIHVwcGVyLXJpZ2h0IHNpZGUgb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jawotOyAqICAgICAgICAgICAgICAgICAgICAgcmVzcGVjdGl2ZWx5LgotOyAqIFtpbl0gICAgZmNvZGVGb3J3YXJkICAgICAgIGEgY29kZSBlcXVhbCB0byB2b3BfZmNvZGVfZm9yd2FyZCBpbiBNUEVHLTQKLTsgKiAgICAgICAgICAgICAgICAgICAgIGJpdCBzdHJlYW0gc3ludGF4Ci07ICogW2luXSAgICBNQlR5cGUgICAgICAgICB0aGUgdHlwZSBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrLiBJZiBNQlR5cGUKLTsgKiAgICAgICAgICAgICAgICAgICAgIGlzIG5vdCBlcXVhbCB0byBPTVhfVkNfSU5URVI0ViwgdGhlIGRlc3RpbmF0aW9uCi07ICogICAgICAgICAgICAgICAgICAgICBtb3Rpb24gdmVjdG9yIGJ1ZmZlciBpcyBzdGlsbCBmaWxsZWQgd2l0aCB0aGUKLTsgKiAgICAgICAgICAgICAgICAgICAgIHNhbWUgZGVjb2RlZCB2ZWN0b3IuCi07ICogW291dF0gICBwcEJpdFN0cmVhbSAgICAgICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkLAotOyAqICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0Ci07ICogICAgICAgICAgICAgICAgICAgICBzdHJlYW0gYnVmZmVyCi07ICogW291dF0gICBwQml0T2Zmc2V0ICAgICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKLTsgKiAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKLTsgKiAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbQotOyAqIFtvdXRdICAgcERzdE1WQ3VyTUIgICAgICAgICBwb2ludGVyIHRvIHRoZSBtb3Rpb24gdmVjdG9yIGJ1ZmZlciBvZiB0aGUgY3VycmVudAotOyAqICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9jayB3aGljaCBjb250YWlucyBmb3VyIGRlY29kZWQgbW90aW9uIHZlY3RvcnMKLTsgKgotOyAqIFJldHVybiBWYWx1ZToKLTsgKiBPTVhfU3RzX05vRXJyIC1ubyBlcnJvcgotOyAqIAotOyAqICAgICAgICAgICAgICAgICAgICAgCi07ICogT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IKLTsgKgotOyAqCi0gICAgIAotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9CaXREZWNfcy5oCi0gICAgICAgIElOQ0xVREUgb214VkNfcy5oCi0gICAgICAgIAotICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0gICAgICAgCi0gICAgICAgICAgICAgICAgCi0KLQotICAgICAgICBJRiBBUk0xMTM2SlMKLQotOy8vSW5wdXQgQXJndW1lbnRzCi0KLXBwQml0U3RyZWFtICAgICAgICAgICBSTiAwCi1wQml0T2Zmc2V0ICAgICAgICAgICAgUk4gMQotcFNyY01WTGVmdE1CICAgICAgICAgIFJOIDIKLXBTcmNNVlVwcGVyTUIgICAgICAgICBSTiAzCi1wU3JjTVZVcHBlclJpZ2h0TUIgICAgUk4gNAotcERzdE1WQ3VyTUIgICAgICAgICAgIFJOIDUKLWZjb2RlRm9yd2FyZCAgICAgICAgICBSTiA2Ci1NQlR5cGUgICAgICAgICAgICAgICAgUk4gNwotCi07Ly9Mb2NhbCBWYXJpYWJsZXMKLQotemVybyAgICAgICAgICAgICAgICAgIFJOIDQKLW9uZSAgICAgICAgICAgICAgICAgICBSTiA0Ci1zY2FsZUZhY3RvciAgICAgICAgICAgUk4gMQotCi0KLVJldHVybiAgICAgICAgICAgICAgICBSTiAwCi0KLVZsY01WRCAgICAgICAgICAgICAgICBSTiAwCi1pbmRleCAgICAgICAgICAgICAgICAgUk4gNAotQ291bnQgICAgICAgICAgICAgICAgIFJOIDcKLQotbXZIb3JEYXRhICAgICAgICAgICAgIFJOIDQKLW12SG9yUmVzaWR1YWwgICAgICAgICBSTiAwCi0KLW12VmVyRGF0YSAgICAgICAgICAgICBSTiA0ICAgICAgICAgICAgIAotbXZWZXJSZXNpZHVhbCAgICAgICAgIFJOIDAKLQotdGVtcCAgICAgICAgICAgICAgICAgIFJOIDEKLQotdGVtcDEgICAgICAgICAgICAgICAgIFJOIDMKLUhpZ2ggICAgICAgICAgICAgICAgICBSTiA0Ci1Mb3cgICAgICAgICAgICAgICAgICAgUk4gMgotUmFuZ2UgICAgICAgICAgICAgICAgIFJOIDEKLQotQmxrQ291bnQgICAgICAgICAgICAgIFJOIDE0Ci0KLWRpZmZNVmR4ICAgICAgICAgICAgICBSTiAwCi1kaWZmTVZkeSAgICAgICAgICAgICAgUk4gMQotCi07Ly8gU2NyYXRjaCBSZWdpc3RlcnMKLQotUkJpdFN0cmVhbSAgICAgICAgICAgIFJOIDgKLVJCaXRDb3VudCAgICAgICAgICAgICBSTiA5Ci1SQml0QnVmZmVyICAgICAgICAgICAgUk4gMTAKLQotVDEgICAgICAgICAgICAgICAgICAgIFJOIDExCi1UMiAgICAgICAgICAgICAgICAgICAgUk4gMTIKLUxSICAgICAgICAgICAgICAgICAgICBSTiAxNAotCi0gICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9hVmxjTVZECi0gICAgICAgSU1QT1JUICAgICAgICAgIG9teFZDTTRQMl9GaW5kTVZwcmVkCi0KLSAgICAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5ICAgICAgICAKLSAgICAgICAKLSAgICAgICBNX0FMTE9DNCAgICAgICAgcHBEc3RNVkN1ck1CLDQKLSAgICAgICBNX0FMTE9DNCAgICAgICAgcERzdE1WUHJlZE1FLDQKLSAgICAgICBNX0FMTE9DNCAgICAgICAgcEJsa0NvdW50LDQKLSAgICAgICAKLSAgICAgICBNX0FMTE9DNCAgICAgICAgcHBwQml0U3RyZWFtLDQKLSAgICAgICBNX0FMTE9DNCAgICAgICAgcHBCaXRPZmZzZXQsNAotICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFNyY01WTGVmdE1CLDQKLSAgICAgICBNX0FMTE9DNCAgICAgICAgcHBTcmNNVlVwcGVyTUIsNAotICAgICAgIAotICAgICAgIE1fQUxMT0M0ICAgICAgICBwZGlmZk1WZHgsNAotICAgICAgIE1fQUxMT0M0ICAgICAgICBwZGlmZk1WZHksNAotICAgICAgIE1fQUxMT0M0ICAgICAgICBwSGlnaCw0Ci0gICAgICAgCi0gICAgICAgICAgICAgIAotCi0KLSAgICAgICBNX1NUQVJUICAgb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1AscjExCi0gICAgICAgCi0gICAgICAgTV9BUkcgICAgICAgICAgIHBTcmNNVlVwcGVyUmlnaHRNQm9uU3RhY2ssNCAgICAgICAgICAgOy8vIHBvaW50ZXIgdG8gIHBTcmNNVlVwcGVyUmlnaHRNQiBvbiBzdGFjawotICAgICAgIE1fQVJHICAgICAgICAgICBwRHN0TVZDdXJNQm9uU3RhY2ssNCAgICAgICAgICAgICAgICAgIDsvLyBwb2ludGVyIHRvIHBEc3RNVkN1ck1CIG9uIHN0YWNrCi0gICAgICAgTV9BUkcgICAgICAgICAgIGZjb2RlRm9yd2FyZG9uU3RhY2ssNCAgICAgICAgICAgICAgICAgOy8vIHBvaW50ZXIgdG8gZmNvZGVGb3J3YXJkIG9uIHN0YWNrIAotICAgICAgIE1fQVJHICAgICAgICAgICBNQlR5cGVvblN0YWNrLDQgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwb2ludGVyIHRvIE1CVHlwZSBvbiBzdGFjawotCi0gICAgICAKLSAgICAgICAKLSAgICAgICAKLSAgICAgICAKLSAgICAgICA7Ly8gSW5pdGlhbGl6aW5nIHRoZSBCaXRTdHJlYW0gTWFjcm8KLQotICAgICAgIE1fQkRfSU5JVDAgICAgICBwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgUkJpdFN0cmVhbSwgUkJpdEJ1ZmZlciwgUkJpdENvdW50Ci0gICAgICAgTV9MRFIgICAgICAgICAgIE1CVHlwZSxNQlR5cGVvblN0YWNrICAgICAgICAgICAgICAgICAgOy8vIExvYWQgTUJUeXBlIGZyb20gc3RhY2sKLSAgICAgICBNX0xEUiAgICAgICAgICAgcERzdE1WQ3VyTUIscERzdE1WQ3VyTUJvblN0YWNrICAgICAgICA7Ly8gTG9hZCBwRHN0TVZDdXJNQiBmcm9tIHN0YWNrCi0gICAgICAgTU9WICAgICAgICAgICAgIHplcm8sIzAKLQotICAgICAgIFRFUSAgICAgICAgICAgICBNQlR5cGUsI09NWF9WQ19JTlRSQSAgICAgICAgICAgICAgICAgIDsvLyBDaGVjayBpZiBNQlR5cGU9T01YX1ZDX0lOVFJBCi0gICAgICAgVEVRTkUgICAgICAgICAgIE1CVHlwZSwjT01YX1ZDX0lOVFJBX1EgICAgICAgICAgICAgICAgOy8vIGNoZWNrIGlmIE1CVHlwZT1PTVhfVkNfSU5UUkFfUQotICAgICAgIFNUUkVRICAgICAgICAgICB6ZXJvLFtwRHN0TVZDdXJNQl0KLSAgICAgICBNX0JEX0lOSVQxICAgICAgVDEsIFQyLCBUMgotICAgICAgIFNUUkVRICAgICAgICAgICB6ZXJvLFtwRHN0TVZDdXJNQiwjNF0KLSAgICAgICBNX0JEX0lOSVQyICAgICAgVDEsIFQyLCBUMgotICAgICAgIFNUUkVRICAgICAgICAgICB6ZXJvLFtwRHN0TVZDdXJNQiwjNF0KLSAgICAgICBNT1ZFUSAgICAgICAgICAgUmV0dXJuLCNPTVhfU3RzX05vRXJyCi0gICAgICAgTU9WICAgICAgICAgICAgIEJsa0NvdW50LCMwCi0gICAgICAgU1RSRVEgICAgICAgICAgIHplcm8sW3BEc3RNVkN1ck1CLCM0XQotICAgICAgIAotICAgICAgIEJFUSAgICAgICAgICAgICBFeGl0T0sKLQotICAgICAgIFRFUSAgICAgICAgICAgICBNQlR5cGUsI09NWF9WQ19JTlRFUjRWICAgICAgICAgICAgICAgIDsvLyBDaGVjayBpZiBNQlR5cGU9T01YX1ZDX0lOVEVSNFYKLSAgICAgICBURVFORSAgICAgICAgICAgTUJUeXBlLCNPTVhfVkNfSU5URVI0Vl9RICAgICAgICAgICAgICA7Ly8gQ2hlY2sgaWYgTUJUeXBlPU9NWF9WQ19JTlRFUjRWX1EKLSAgICAgICBNT1ZFUSAgICAgICAgICAgQ291bnQsIzQKLQotICAgICAgIFRFUSAgICAgICAgICAgICBNQlR5cGUsI09NWF9WQ19JTlRFUiAgICAgICAgICAgICAgICAgIDsvLyBDaGVjayBpZiBNQlR5cGU9T01YX1ZDX0lOVEVSCi0gICAgICAgVEVRTkUgICAgICAgICAgIE1CVHlwZSwjT01YX1ZDX0lOVEVSX1EgICAgICAgICAgICAgICAgOy8vIENoZWNrIGlmIE1CVHlwZT1PTVhfVkNfSU5URVJfUQotICAgICAgIE1PVkVRICAgICAgICAgICBDb3VudCwjMQotICAgICAgIAotICAgICAgIE1fTERSICAgICAgICAgICBmY29kZUZvcndhcmQsZmNvZGVGb3J3YXJkb25TdGFjayAgICAgIDsvLyBMb2FkIGZjb2RlRm9yd2FyZCAgZnJvbSBzdGFjawotCi0gICAgICAgOy8vIFN0b3JpbmcgdGhlIHZhbHVlcyB0ZW1wb3JhcmlseSBvbiBzdGFjawotCi0gICAgICAgTV9TVFIgICAgICAgICAgIHBwQml0U3RyZWFtLHBwcEJpdFN0cmVhbSAgICAgICAgICAgICAgCi0gICAgICAgTV9TVFIgICAgICAgICAgIHBCaXRPZmZzZXQscHBCaXRPZmZzZXQKLSAgICAgICAgICAgIAotCi0gICAgICAgU1VCICAgICAgICAgICAgIHRlbXAsZmNvZGVGb3J3YXJkLCMxICAgICAgICAgICAgICAgICAgOy8vIHRlbXA9ZmNvZGVGb3J3YXJkLTEKLSAgICAgICBNT1YgICAgICAgICAgICAgb25lLCMxCi0gICAgICAgTV9TVFIgICAgICAgICAgIHBTcmNNVkxlZnRNQixwcFNyY01WTGVmdE1CCi0gICAgICAgTFNMICAgICAgICAgICAgIHNjYWxlRmFjdG9yLG9uZSx0ZW1wICAgICAgICAgICAgICAgICAgOy8vIHNjYWxlRmFjdG9yPTE8PChmY29kZUZvcndhcmQtMSkKLSAgICAgICBNX1NUUiAgICAgICAgICAgcFNyY01WVXBwZXJNQixwcFNyY01WVXBwZXJNQgotICAgICAgIExTTCAgICAgICAgICAgICBzY2FsZUZhY3RvcixzY2FsZUZhY3RvciwjNSAgICAgICAgICAgIAotICAgICAgIE1fU1RSICAgICAgICAgICBzY2FsZUZhY3RvcixwSGlnaCAgICAgICAgICAgICAgICAgICAgIDsvLyBbcEhpZ2hdPTMyKnNjYWxlRmFjdG9yCi0gICAgICAgICAgICAgIAotICAgICAgIDsvLyBWTEQgRGVjb2RpbmcKLQotCi1Mb29wCi0KLSAgICAgICBMRFIgICAgICAgICAgICAgVmxjTVZELCA9YXJtVkNNNFAyX2FWbGNNVkQgICAgICAgIDsvLyBMb2FkIHRoZSBvcHRpbWl6ZWQgTVZEIFZMQyB0YWJsZQotCi0gICAgICAgOy8vIEhvcml6b250YWwgRGF0YSBhbmQgUmVzaWR1YWwgY2FsY3VsYXRpb24KLQotICAgICAgIExEUiAgICAgICAgICAgICB0ZW1wLD0weEZGRiAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgIE1fQkRfVkxEICAgICAgICBpbmRleCxUMSxUMixWbGNNVkQsMywyICAgICAgICAgICAgICAgIDsvLyB2YXJpYWJsZSBsZW5naHQgZGVjb2RpbmcgdXNpbmcgdGhlIG1hY3JvCi0gICAgICAKLSAgICAgICBURVEgICAgICAgICAgICAgaW5kZXgsdGVtcAotICAgICAgIEJFUSAgICAgICAgICAgICBFeGl0RXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBFeGl0IHdpdGggYW4gRXJyb3IgTWVzc2FnZSBpZiB0aGUgZGVjb2RlZCBzeW1ib2wgaXMgYW4gaW52YWxpZWQgc3ltYm9sIAotICAgICAgIAotICAgICAgIFNVQiAgICAgICAgICAgICBtdkhvckRhdGEsaW5kZXgsIzMyICAgICAgICAgICAgICAgICAgIDsvLyBtdkhvckRhdGE9aW5kZXgtMzIgICAgICAgICAgICAgCi0gICAgICAgTU9WICAgICAgICAgICAgIG12SG9yUmVzaWR1YWwsIzEgICAgICAgICAgICAgICAgICAgICAgOy8vIG12SG9yUmVzaWR1YWw9MQotICAgICAgIENNUCAgICAgICAgICAgICBmY29kZUZvcndhcmQsIzEKLSAgICAgICBURVFORSAgICAgICAgICAgbXZIb3JEYXRhLCMwCi0gICAgICAgTU9WRVEgICAgICAgICAgIGRpZmZNVmR4LG12SG9yRGF0YSAgICAgICAgICAgICAgICAgICAgOy8vIGlmIHNjYWxlRmFjdG9yPTEoZmNvZGVGb3J3YXJkPTEpIG9yIG12SG9yRGF0YT0wIGRpZmZNVmR4PW12SG9yRGF0YSAgICAgICAgIAotICAgICAgIEJFUSAgICAgICAgICAgICBWZXJ0aWNhbERhdGEKLSAgICAgICAKLSAgICAgICBTVUIgICAgICAgICAgICAgdGVtcCxmY29kZUZvcndhcmQsIzEKLSAgICAgICBNX0JEX1ZSRUFEOCAgICAgbXZIb3JSZXNpZHVhbCx0ZW1wLFQxLFQyICAgICAgICAgICAgICA7Ly8gZ2V0IG12SG9yUmVzaWR1YWwgZnJvbSBiaXRzdHJlYW0gaWYgZmNvZGVGb3J3YXJkPjEgYW5kIG12SG9yRGF0YSE9MCAgICAgICAgICAgICAgCi0gICAgICAgCi0gICAgICAgQ01QICAgICAgICAgICAgIG12SG9yRGF0YSwjMAotICAgICAgIFJTQkxUICAgICAgICAgICBtdkhvckRhdGEsbXZIb3JEYXRhLCMwICAgICAgICAgICAgICAgIDsvLyBtdkhvckRhdGE9YWJzKG12SG9yRGF0YSkKLSAgICAgICBTVUIgICAgICAgICAgICAgbXZIb3JSZXNpZHVhbCxtdkhvclJlc2lkdWFsLGZjb2RlRm9yd2FyZAotICAgICAgIFNNTEFCQiAgICAgICAgICBkaWZmTVZkeCxtdkhvckRhdGEsZmNvZGVGb3J3YXJkLG12SG9yUmVzaWR1YWwgOy8vIGRpZmZNVmR4PWFicyhtdkhvckRhdGEpKmZjb2RlRm9yd2FyZCttdkhvclJlc2lkdWFsLWZjb2RlRm9yd2FyZAotICAgICAgIEFERCAgICAgICAgICAgICBkaWZmTVZkeCxkaWZmTVZkeCwjMQotICAgICAgIFJTQkxUICAgICAgICAgICBkaWZmTVZkeCxkaWZmTVZkeCwjMAotICAgICAgIAotICAgICAgIDsvLyBWZXJ0aWNhbCBEYXRhIGFuZCBSZXNpZHVhbCBjYWxjdWxhdGlvbgotCi1WZXJ0aWNhbERhdGEKLQotICAgICAgIE1fU1RSICAgICAgICAgICBkaWZmTVZkeCxwZGlmZk1WZHggICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSB0aGUgZGlmZk1WZHggb24gc3RhY2sKLSAgICAgICBMRFIgICAgICAgICAgICAgVmxjTVZELCA9YXJtVkNNNFAyX2FWbGNNVkQgICAgICAgIDsvLyBMb2FkaW5nIHRoZSBhZGRyZXNzIG9mIG9wdGltaXplZCBWTEMgdGFibGVzCi0KLSAgICAgICBMRFIgICAgICAgICAgICAgdGVtcCw9MHhGRkYKLSAgICAgICBNX0JEX1ZMRCAgICAgICAgaW5kZXgsVDEsVDIsVmxjTVZELDMsMiAgICAgICAgICAgICAgICA7Ly8gVkxDIGRlY29kaW5nIHVzaW5nIHRoZSBtYWNybwotICAgICAgIAotICAgICAgIFRFUSAgICAgICAgICAgICBpbmRleCx0ZW1wCi0gICAgICAgQkVRICAgICAgICAgICAgIEV4aXRFcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEV4aXQgd2l0aCBhbiBFcnJvciBNZXNzYWdlIGlmIGFuIEludmFsaWVkIFN5bWJvbCBvY2N1cnMKLSAgICAgICAKLSAgICAgICBTVUIgICAgICAgICAgICAgbXZWZXJEYXRhLGluZGV4LCMzMiAgICAgICAgICAgICAgICAgICA7Ly8gbXZWZXJEYXRhPWluZGV4LTMyICAgICAgICAgICAgIAotICAgICAgIE1PViAgICAgICAgICAgICBtdlZlclJlc2lkdWFsLCMxICAgICAKLSAgICAgICBDTVAgICAgICAgICAgICAgZmNvZGVGb3J3YXJkLCMxCi0gICAgICAgVEVRTkUgICAgICAgICAgIG12VmVyRGF0YSwjMAotICAgICAgIE1PVkVRICAgICAgICAgICBkaWZmTVZkeSxtdlZlckRhdGEgICAgICAgICAgICAgICAgICAgIDsvLyBkaWZmTVZkeSA9IG12VmVyRGF0YSBpZiBzY2FsZUZhY3Rvcj0xKGZjb2RlRm9yd2FyZD0xKSBvciBtdlZlckRhdGE9MAotICAgICAgIEJFUSAgICAgICAgICAgICBGaW5kTVZQcmVkCi0KLSAgICAgICBTVUIgICAgICAgICAgICAgdGVtcCxmY29kZUZvcndhcmQsIzEKLSAgICAgICBNX0JEX1ZSRUFEOCAgICAgbXZWZXJSZXNpZHVhbCx0ZW1wLFQxLFQyICAgICAgICAgICAgICA7Ly8gR2V0IG12VmVyUmVzaWR1YWwgZnJvbSBiaXQgc3RyZWFtIGlmIGZjb2RlRm9yd2FyZD4xIGFuZCBtblZlckRhdGEhPTAKLSAgICAgICAgICAgICAKLQotICAgICAgIENNUCAgICAgICAgICAgICBtdlZlckRhdGEsIzAKLSAgICAgICBSU0JMVCAgICAgICAgICAgbXZWZXJEYXRhLG12VmVyRGF0YSwjMAotICAgICAgIFNVQiAgICAgICAgICAgICBtdlZlclJlc2lkdWFsLG12VmVyUmVzaWR1YWwsZmNvZGVGb3J3YXJkCi0gICAgICAgU01MQUJCICAgICAgICAgIGRpZmZNVmR5LG12VmVyRGF0YSxmY29kZUZvcndhcmQsbXZWZXJSZXNpZHVhbCA7Ly8gZGlmZk1WZHk9YWJzKG12VmVyRGF0YSkqZmNvZGVGb3J3YXJkK212VmVyUmVzaWR1YWwtZmNvZGVGb3J3YXJkCi0gICAgICAgQUREICAgICAgICAgICAgIGRpZmZNVmR5LGRpZmZNVmR5LCMxCi0gICAgICAgUlNCTFQgICAgICAgICAgIGRpZmZNVmR5LGRpZmZNVmR5LCMwCi0KLSAgICAgICA7Ly9DYWxsaW5nIHRoZSBGdW5jdGlvbiBvbXhWQ000UDJfRmluZE1WcHJlZAotICAgICAgICAKLUZpbmRNVlByZWQKLQotICAgICAgIE1fU1RSICAgICAgICAgICBkaWZmTVZkeSxwZGlmZk1WZHkKLSAgICAgICBBREQgICAgICAgICAgICAgdGVtcCxwRHN0TVZDdXJNQixCbGtDb3VudCxMU0wgIzIgICAgICA7Ly8gdGVtcD1wRHN0TVZDdXJNQltCbGtDb3VudF0KLSAgICAgICBNX1NUUiAgICAgICAgICAgdGVtcCxwcERzdE1WQ3VyTUIgICAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUgdGVtcCBvbiBzdGFjayBmb3IgcGFzc2luZyBhcyBhbiBhcmd1bWVudCB0byBGaW5kTVZQcmVkCi0gICAgICAgCi0gICAgICAgTU9WICAgICAgICAgICAgIHRlbXAsIzAKLSAgICAgICBNX1NUUiAgICAgICAgICAgdGVtcCxwRHN0TVZQcmVkTUUgICAgICAgICAgICAgICAgICAgICA7Ly8gUGFzcyBwRHN0TVZQcmVkTUU9TlVMTCBhcyBhbiBhcmd1bWVudCAgICAgICAgIAotICAgICAgIE1fU1RSICAgICAgICAgICBCbGtDb3VudCxwQmxrQ291bnQgICAgICAgICAgICAgICAgICAgIDsvLyBQYXNzcyBCbGtDb3VudCBhcyBBcmd1bWVudCB0aHJvdWdoIHN0YWNrCi0KLSAgICAgICBNT1YgICAgICAgICAgICAgdGVtcCxwU3JjTVZMZWZ0TUIgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcCAoUk4gMSk9cFNyY01WTGVmdE1CCi0gICAgICAgTV9MRFIgICAgICAgICAgIHBTcmNNVlVwcGVyUmlnaHRNQixwU3JjTVZVcHBlclJpZ2h0TUJvblN0YWNrCi0gICAgICAgTU9WICAgICAgICAgICAgIHBTcmNNVkxlZnRNQixwU3JjTVZVcHBlck1CICAgICAgICAgICAgOy8vIHBTcmNNVkxlZnRNQiAoIFJOIDIpID0gcFNyY01WVXBwZXJNQgotICAgICAgIE1PViAgICAgICAgICAgICBwcEJpdFN0cmVhbSxwRHN0TVZDdXJNQiAgICAgICAgICAgICAgIDsvLyBwcEJpdFN0cmVhbSAgKCBSTiAwKSA9IHBEc3RNVkN1ck1CCi0gICAgICAgTU9WICAgICAgICAgICAgIHBTcmNNVlVwcGVyTUIscFNyY01WVXBwZXJSaWdodE1CICAgICAgOy8vIHBTcmNNVlVwcGVyTUIoIFJOIDMpID0gcFNyY01WVXBwZXJSaWdodE1CICAgICAgCi0gICAgICAgQkwgICAgICAgICAgICAgIG9teFZDTTRQMl9GaW5kTVZwcmVkICAgICAgICAgICAgICA7Ly8gQnJhbmNoIHRvIHN1YnJvdXRpbmUgb214VkNNNFAyX0ZpbmRNVnByZWQKLQotICAgICAgIDsvLyBTdG9yZSBIb3Jpem9udGFsIE1vdGlvbiBWZWN0b3IKLSAgICAgCi0gICAgICAgTV9MRFIgICAgICAgICAgIEJsa0NvdW50LHBCbGtDb3VudCAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgQmxrQ291bnQgZnJvbSBzdGFjawotICAgICAgIE1fTERSICAgICAgICAgICBIaWdoLHBIaWdoICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBIaWdoPTMyKnNjYWxlRmFjdG9yCi0gICAgICAgTFNMICAgICAgICAgICAgIHRlbXAxLEJsa0NvdW50LCMyICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXA9QmxrQ291bnQqNAotICAgICAgIE1fTERSICAgICAgICAgICBkaWZmTVZkeCxwZGlmZk1WZHggICAgICAgICAgICAgICAgICAgIDsvLyBMYWFkIGRpZmZNVmR4Ci0gICAgICAgCi0gICAgICAgTERSU0ggICAgICAgICAgIHRlbXAsW3BEc3RNVkN1ck1CLHRlbXAxXSAgICAgICAgICAgICAgOy8vIHRlbXA9cERzdE1WQ3VyTUJbQmxrQ291bnRdCi0gICAgICAgCi0gICAgICAgCi0gICAgICAgUlNCICAgICAgICAgICAgIExvdyxIaWdoLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvdyA9IC0zMipzY2FsZUZhY3RvcgotICAgICAgIEFERCAgICAgICAgICAgICBkaWZmTVZkeCx0ZW1wLGRpZmZNVmR4ICAgICAgICAgICAgICAgIDsvLyBkaWZmTVZkeD1wRHN0TVZDdXJNQltCbGtDb3VudF0rZGlmZk1WZHgKLSAgICAgICBBREQgICAgICAgICAgICAgUmFuZ2UsSGlnaCxIaWdoICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUmFuZ2U9NjQqU2NhbGVGYWN0b3IKLSAgICAgICBTVUIgICAgICAgICAgICAgSGlnaCxIaWdoLCMxICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSGlnaD0gMzIqc2NhbGVGYWN0b3ItMQotCi0gICAgICAgQ01QICAgICAgICAgICAgIGRpZmZNVmR4LExvdyAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIGRpZmZNVmR4PExvdyAgICAgICAgICAKLSAgICAgICBBRERMVCAgICAgICAgICAgZGlmZk1WZHgsZGlmZk1WZHgsUmFuZ2UgICAgICAgICAgICAgICA7Ly8gZGlmZk1WZHgrPVJhbmdlCi0gICAgICAgIAotICAgICAgIENNUCAgICAgICAgICAgICBkaWZmTVZkeCxIaWdoICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgIFNVQkdUICAgICAgICAgICBkaWZmTVZkeCxkaWZmTVZkeCxSYW5nZSAgICAgICAgICAgICAgIDsvLyBJZiBkaWZmTVZkeCA+IEhpZ2ggZGlmZk1WZHgtPVJhbmdlCi0gICAgICAgU1RSSCAgICAgICAgICAgIGRpZmZNVmR4LFtwRHN0TVZDdXJNQix0ZW1wMV0KLQotICAgICAgIDsvLyBTdG9yZSBWZXJ0aWNhbAotCi0gICAgICAgQUREICAgICAgICAgICAgIHRlbXAxLHRlbXAxLCMyICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXAxPTQqQmxrQ291bnQrMgotICAgICAgIE1fTERSICAgICAgICAgICBkaWZmTVZkeCxwZGlmZk1WZHkgICAgICAgICAgICAgICAgICAgIDsvLyBMYWFkIGRpZmZNVmR5Ci0gICAgICAgTERSU0ggICAgICAgICAgIHRlbXAsW3BEc3RNVkN1ck1CLHRlbXAxXSAgICAgICAgICAgICAgOy8vIHRlbXA9cERzdE1WQ3VyTUJbQmxrQ291bnRdLmRpZmZNVmR5Ci0gICAgICAgQUREICAgICAgICAgICAgIEJsa0NvdW50LEJsa0NvdW50LCMxICAgICAgICAgICAgICAgICAgOy8vIEJsa0NvdW50PUJsa0NvdW50KzEKLSAgICAgICBBREQgICAgICAgICAgICAgZGlmZk1WZHgsdGVtcCxkaWZmTVZkeCAgICAgICAgICAgICAgICAKLSAgICAgICBDTVAgICAgICAgICAgICAgZGlmZk1WZHgsTG93Ci0gICAgICAgQURETFQgICAgICAgICAgIGRpZmZNVmR4LGRpZmZNVmR4LFJhbmdlICAgICAgICAgICAgICAgOy8vIElmIGRpZmZNVmR5PExvdyAgZGlmZk1WZHkrPVJhbmdlICAgICAgICAgICAgICAgIAotICAgICAgIENNUCAgICAgICAgICAgICBkaWZmTVZkeCxIaWdoCi0gICAgICAgU1VCR1QgICAgICAgICAgIGRpZmZNVmR4LGRpZmZNVmR4LFJhbmdlICAgICAgICAgICAgICAgOy8vIElmIGRpZmZNVmR5ID4gSGlnaCBkaWZmTVZkeS09UmFuZ2UKLSAgICAgICBTVFJIICAgICAgICAgICAgZGlmZk1WZHgsW3BEc3RNVkN1ck1CLHRlbXAxXSAgICAKLSAgICAgICAKLSAgICAgICBDTVAgICAgICAgICAgICAgQmxrQ291bnQsQ291bnQKLSAgICAgICBNX0xEUiAgICAgICAgICAgcFNyY01WTGVmdE1CLHBwU3JjTVZMZWZ0TUIKLSAgICAgICBNX0xEUiAgICAgICAgICAgcFNyY01WVXBwZXJNQixwcFNyY01WVXBwZXJNQgotCi0gICAgICAgQkxUICAgICAgICAgICAgIExvb3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIEJsa0NvdW50PENvdW50IENvbnRpbnVlIHRoZSBMb29wCi0KLQotICAgICAgIDsvLyBJZiBNQlR5cGU9T01YX1ZDX0lOVEVSIG9yIE1CdHlwZT1PTVhfVkNfSU5URVJfUSBjb3B5IHBEc3RNVkN1ck1CWzBdIHRvCi0gICAgICAgOy8vIHBEc3RNVkN1ck1CWzFdLCBwRHN0TVZDdXJNQlsyXSwgcERzdE1WQ3VyTUJbM10gCi0KLSAgICAgICBNX0xEUiAgICAgICAgICAgTUJUeXBlLE1CVHlwZW9uU3RhY2sKLQotICAgICAgIFRFUSAgICAgICAgICAgICBNQlR5cGUsI09NWF9WQ19JTlRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgIFRFUU5FICAgICAgICAgICBNQlR5cGUsI09NWF9WQ19JTlRFUl9RICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgIExEUkVRICAgICAgICAgICB0ZW1wLFtwRHN0TVZDdXJNQl0KLSAgICAgICBNX0xEUiAgICAgICAgICAgcHBCaXRTdHJlYW0scHBwQml0U3RyZWFtCi0gICAgICAgU1RSRVEgICAgICAgICAgIHRlbXAsW3BEc3RNVkN1ck1CLCM0XQotICAgICAgIAotICAgICAgIFNUUkVRICAgICAgICAgICB0ZW1wLFtwRHN0TVZDdXJNQiwjOF0KLSAgICAgICBTVFJFUSAgICAgICAgICAgdGVtcCxbcERzdE1WQ3VyTUIsIzEyXQotICAgICAgIAotICAgICAgIAotICAgICAgIE1fTERSICAgICAgICAgICBwQml0T2Zmc2V0LHBwQml0T2Zmc2V0Ci0gICAgICAgOy8vRW5kaW5nIHRoZSBtYWNybwotICAgICAgIE1fQkRfRklOSSAgICAgICBwcEJpdFN0cmVhbSxwQml0T2Zmc2V0ICAgICAgICAgICAgICAgICA7Ly8gRmluaXNoaW5nIHRoZSBNYWNybyAgICAgICAKLQotICAgICAgIAotICAgICAgIE1PViAgICAgICAgICAgICBSZXR1cm4sI09NWF9TdHNfTm9FcnIKLSAgICAgICBCICAgICAgICAgICAgICAgRXhpdE9LCi0gCi1FeGl0RXJyb3IKLQotICAgICAgIE1fTERSICAgICAgICAgICBwcEJpdFN0cmVhbSxwcHBCaXRTdHJlYW0KLSAgICAgICBNX0xEUiAgICAgICAgICAgcEJpdE9mZnNldCxwcEJpdE9mZnNldAotICAgICAgIDsvL0VuZGluZyB0aGUgbWFjcm8KLSAgICAgICBNX0JEX0ZJTkkgICAgICAgcHBCaXRTdHJlYW0scEJpdE9mZnNldAotICAgICAgIAotICAgICAgIE1PViAgICAgICAgICAgICBSZXR1cm4sI09NWF9TdHNfRXJyCi0KLUV4aXRPSyAgICAgICAgICAgICAKLQotICAgICAgIE1fRU5ECi0gICAgICAgRU5ESUYKLSAgICAgICBFTkQKLQotCi0gICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM2ZGZlNC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcl9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvKioKLTsgKiAKLTsgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyX3MucwotOyAqIE9wZW5NQVggREw6IHYxLjAuMgotOyAqIFJldmlzaW9uOiAgIDEyMjkwCi07ICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci07ICogCi07ICogCi07ICogCi07ICoKLTsgKiBEZXNjcmlwdGlvbjogCi07ICogQ29udGFpbnMgbW9kdWxlcyBmb3IgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZGVjb2RpbmcKLTsgKiBmb3IgaW50ZXIgYmxvY2suCi07ICoKLTsgKgotOyAqCi07ICogRnVuY3Rpb246IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIKLTsgKgotOyAqIERlc2NyaXB0aW9uOgotOyAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBmb3Igb25lIGludGVyIGNvZGVkIGJsb2NrLgotOyAqCi07ICogUmVtYXJrczoKLTsgKgotOyAqIFBhcmFtZXRlcnM6Ci07ICogW2luXSAgICBwcEJpdFN0cmVhbSAgICAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCi07ICogICAgICAgICAgICAgICAgICAgIHRoZSBiaXRzdHJlYW0gYnVmZmVyCi07ICogW2luXSAgICBwQml0T2Zmc2V0ICAgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAotOyAqICAgICAgICAgICAgICAgICAgICB0byBieSAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbiAgICBbMC03XS4KLTsgKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgICAgIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOwotOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiBzaG9ydFZpZGVvSGVhZGVyPT0wLAotOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIHNob3J0VmlkZW9IZWFkZXI9PTEuCi07ICogW291dF0gICAgcHBCaXRTdHJlYW0gICAgICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcwotOyAqICAgICAgICAgICAgICAgICAgICBkZWNvZGVkLCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlCi07ICogICAgICAgICAgICAgICAgICAgIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlcgotOyAqIFtvdXRdICAgIHBCaXRPZmZzZXQgICAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCi07ICogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKLTsgKiAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtCi07ICogW291dF0gICAgcERzdCAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50Ci07ICogICAgICAgICAgICAgICAgICAgIGJsb2NrLiBNdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZAotOyAqCi07ICogUmV0dXJuIFZhbHVlOgotOyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cwotOyAqICAgLUF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBEc3QsIG9yCi07ICogICAtcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLCBvcgotOyAqICAgLSpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10uCi07ICogT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IKLTsgKiAgIC1BdCBsZWFzdCBvbmUgbWFyayBiaXQgaXMgZXF1YWwgdG8gemVybwotOyAqICAgLUVuY291bnRlcmVkIGFuIGlsbGVnYWwgc3RyZWFtIGNvZGUgdGhhdCBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIFZMQyB0YWJsZQotOyAqICAgLUVuY291bnRlcmVkIGFuZCBpbGxlZ2FsIGNvZGUgaW4gdGhlIFZMQyBGTEMgdGFibGUKLTsgKiAgIC1UaGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBpcyBncmVhdGVyIHRoYW4gNjQKLTsgKgotOyAqLwotCi0KLSAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICBJTkNMVURFIGFybUNPTU1fQml0RGVjX3MuaAotCi0KLSAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0KLSAgICAgCi0KLQotCi0gICAgIElGIEFSTTExMzZKUwotICAgICAKLSAgICAgICAgOy8vIEltcG9ydCB2YXJpb3VzIHRhYmxlcyBuZWVkZWQgZm9yIHRoZSBmdW5jdGlvbgotCi0gICAgICAgIAotICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludGVyVmxjTDBMMSAgICAgICAgICAgICA7Ly8gQ29udGFpbnMgb3B0aW1pemVkIGFuZCBwYWNrZWQgVkxDIFRhYmxlcyBmb3IgYm90aCBMYXN0ID0xIGFuZCBsYXN0PTAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBQYWNrZWQgaW4gUnVuOkxldmVsOkxhc3QgZm9ybWF0Ci0gICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfSW50ZXJMMEwxTE1BWCAgICAgICAgICAgIDsvLyBDb250YWlucyBMTUFYIHRhYmxlIGVudHJpZXMgd2l0aCBib3RoIExhc3Q9MCBhbmQgTGFzdD0xCi0gICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfSW50ZXJMMEwxUk1BWCAgICAgICAgICAgIDsvLyBDb250YWlucyBSTUFYIHRhYmxlIGVudHJpZXMgd2l0aCBib3RoIExhc3Q9MCBhbmQgTGFzdD0xCi0gICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW4gICAgIDsvLyBjb250YWlucyBjbGFzc2ljYWwgWmlnemFnIHRhYmxlIGVudHJpZXMgd2l0aCBkb3VibGUgdGhlIG9yaWdpbmFsIHZhbHVlcwotICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmUKLQotCi0KLTsvL0lucHV0IEFyZ3VtZW50cwotCi1wcEJpdFN0cmVhbSAgICAgICAgICBSTiAwCi1wQml0T2Zmc2V0ICAgICAgICAgICBSTiAxCi1wRHN0ICAgICAgICAgICAgICAgICBSTiAyCi1zaG9ydFZpZGVvSGVhZGVyICAgICBSTiAzCi0KLTsvL0xvY2FsIFZhcmlhYmxlcwotCi1SZXR1cm4gICAgICAgICAgICAgICBSTiAwCi0KLXBWbGNUYWJsZUwwTDEgICAgICAgIFJOIDQKLXBMTUFYVGFibGVMMEwxICAgICAgIFJOIDQKLXBSTUFYVGFibGVMMEwxICAgICAgIFJOIDQKLXBaaWd6YWdUYWJsZSAgICAgICAgIFJOIDQKLUNvdW50ICAgICAgICAgICAgICAgIFJOIDYKLQotCi0gICAgICAgIAotICAgICAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IHRvIHN0b3JlIHRoZSBWTEMsWmlnemFnLExNQVggYW5kIFJNQVggdGFibGVzCi0gICAgIAotICAgICAgICAKLSAgICAgICAgTV9BTExPQzQgICAgICAgIHBwVmxjVGFibGVMMEwxLDQKLSAgICAgICAgTV9BTExPQzQgICAgICAgIHBwTE1BWFRhYmxlTDBMMSw0Ci0gICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFJNQVhUYWJsZUwwTDEsNAotICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBaaWd6YWdUYWJsZSw0Ci0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgTV9TVEFSVCBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyLHIxMgotCi0gICAgICAgIAotCi0gICAgICAgIAotICAgICAgICBMRFIgICAgICAgICAgICAgcFppZ3phZ1RhYmxlLCA9YXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuICAgICAgIDsvLyBMb2FkIHppZ3phZyB0YWJsZQotICAgICAgICBNX1NUUiAgICAgICAgICAgcFppZ3phZ1RhYmxlLHBwWmlnemFnVGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgemlnemFnIHRhYmxlIG9uIHN0YWNrIHRvIHBhc3MgYXMgYXJndW1lbnQgdG8gdW5zYWZlIGZ1bmN0aW9uCi0gICAgICAgIExEUiAgICAgICAgICAgICBwVmxjVGFibGVMMEwxLCA9YXJtVkNNNFAyX0ludGVyVmxjTDBMMSAgICAgICAgICAgICAgOy8vIExvYWQgb3B0aW1pemVkIFZMQyB0YWJsZSB3aXRoIGJvdGggTD0wIGFuZCBMPTEgZW50cmllcwotICAgICAgICBNX1NUUiAgICAgICAgICAgcFZsY1RhYmxlTDBMMSxwcFZsY1RhYmxlTDBMMSAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgb3B0aW1pemVkIFZMQyB0YWJsZSBhZGRyZXNzIG9uIHN0YWNrCi0gICAgICAgIExEUiAgICAgICAgICAgICBwTE1BWFRhYmxlTDBMMSwgPWFybVZDTTRQMl9JbnRlckwwTDFMTUFYICAgICAgICAgICAgOy8vIExvYWQgSW50ZXJsZWF2ZWQgTD0wIGFuZCBMPTEgTE1BWCBUYWJsZXMKLSAgICAgICAgTV9TVFIgICAgICAgICAgIHBMTUFYVGFibGVMMEwxLHBwTE1BWFRhYmxlTDBMMSAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIExNQVggdGFibGUgYWRkcmVzcyBvbiBzdGFjawotICAgICAgICBMRFIgICAgICAgICAgICAgcFJNQVhUYWJsZUwwTDEsID1hcm1WQ000UDJfSW50ZXJMMEwxUk1BWCAgICAgICAgICAgIDsvLyBMb2FkIEludGVybGVhdmVkIEw9MCBhbmQgTD0xIFJNQVggVGFibGVzCi0gICAgICAgIE1PViAgICAgICAgICAgICBDb3VudCwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBzZXQgc3RhcnQ9MAotICAgICAgICBNX1NUUiAgICAgICAgICAgcFJNQVhUYWJsZUwwTDEscHBSTUFYVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUgUk1BWCB0YWJsZSBhZGRyZXNzIG9uIHN0YWNrCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgQkwgICAgICAgICAgICAgIGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlICAgICAgICAgICAgICAgICA7Ly8gY2FsbCBVbnNhZmUgRnVuY3Rpb24gZm9yIFZMQyBaaWd6YWcgRGVjb2RpbmcKLSAgICAgICAgIAotICAgICAgIAotCi0gICAgICAgIE1fRU5ECi0gICAgICAgIEVORElGCi0gICAgICAgIAotICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTENfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQ19zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1Y2M1YjQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQ19zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvKioKLTsgKiAKLTsgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTENfcy5zCi07ICogT3Blbk1BWCBETDogdjEuMC4yCi07ICogUmV2aXNpb246ICAgMTIyOTAKLTsgKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLTsgKiAKLTsgKiAKLTsgKiAKLTsgKgotOyAqIERlc2NyaXB0aW9uOiAKLTsgKiBDb250YWlucyBtb2R1bGVzIGZvciB6aWd6YWcgc2Nhbm5pbmcgYW5kIFZMQyBkZWNvZGluZwotOyAqIGZvciBpbnRlciBibG9jay4KLTsgKgotOyAqCi07ICoKLTsgKiBGdW5jdGlvbjogb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcgotOyAqCi07ICogRGVzY3JpcHRpb246Ci07ICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIGZvciBvbmUgaW50cmEgY29kZWQgYmxvY2suCi07ICoKLTsgKiBSZW1hcmtzOgotOyAqCi07ICogUGFyYW1ldGVyczoKLTsgKiBbaW5dICAgIHBwQml0U3RyZWFtICAgICAgICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KLTsgKiAgICAgICAgICAgICAgICAgICAgdGhlIGJpdHN0cmVhbSBidWZmZXIKLTsgKiBbaW5dICAgIHBCaXRPZmZzZXQgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCi07ICogICAgICAgICAgICAgICAgICAgIHRvIGJ5ICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluICAgIFswLTddLgotOyAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciAgICAgYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7Ci07ICogICAgICAgICAgICAgICAgICAgICAgICAgICBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIHNob3J0VmlkZW9IZWFkZXI9PTAsCi07ICogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MS4KLTsgKiBbb3V0XSAgICBwcEJpdFN0cmVhbSAgICAgICAgKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzCi07ICogICAgICAgICAgICAgICAgICAgIGRlY29kZWQsIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUKLTsgKiAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyCi07ICogW291dF0gICAgcEJpdE9mZnNldCAgICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKLTsgKiAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQotOyAqICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0KLTsgKiBbb3V0XSAgICBwRHN0ICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQKLTsgKiAgICAgICAgICAgICAgICAgICAgYmxvY2suIE11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkCi07ICoKLTsgKiBSZXR1cm4gVmFsdWU6Ci07ICogT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzCi07ICogICAtQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcERzdCwgb3IKLTsgKiAgIC1wRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQsIG9yCi07ICogICAtKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XS4KLTsgKiBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvcgotOyAqICAgLUF0IGxlYXN0IG9uZSBtYXJrIGJpdCBpcyBlcXVhbCB0byB6ZXJvCi07ICogICAtRW5jb3VudGVyZWQgYW4gaWxsZWdhbCBzdHJlYW0gY29kZSB0aGF0IGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgVkxDIHRhYmxlCi07ICogICAtRW5jb3VudGVyZWQgYW5kIGlsbGVnYWwgY29kZSBpbiB0aGUgVkxDIEZMQyB0YWJsZQotOyAqICAgLVRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGlzIGdyZWF0ZXIgdGhhbiA2NAotOyAqCi07ICovCi0KLQotICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgIElOQ0xVREUgYXJtQ09NTV9CaXREZWNfcy5oCi0KLQotICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLQotICAgICAKLQotCi0KLSAgICAgSUYgQVJNMTEzNkpTCi0gICAgIAotICAgICAgICA7Ly8gSW1wb3J0IHZhcmlvdXMgdGFibGVzIG5lZWRlZCBmb3IgdGhlIGZ1bmN0aW9uCi0KLSAgICAgICAgCi0gICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfSW50cmFWbGNMMEwxICAgICAgICAgICAgIDsvLyBDb250YWlucyBvcHRpbWl6ZWQgYW5kIHBhY2tlZCBWTEMgVGFibGVzIGZvciBib3RoIExhc3QgPTEgYW5kIGxhc3Q9MAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFBhY2tlZCBpbiBSdW46TGV2ZWw6TGFzdCBmb3JtYXQKLSAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9JbnRyYUwwTDFMTUFYICAgICAgICAgICAgOy8vIENvbnRhaW5zIExNQVggdGFibGUgZW50cmllcyB3aXRoIGJvdGggTGFzdD0wIGFuZCBMYXN0PTEKLSAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9JbnRyYUwwTDFSTUFYICAgICAgICAgICAgOy8vIENvbnRhaW5zIFJNQVggdGFibGUgZW50cmllcyB3aXRoIGJvdGggTGFzdD0wIGFuZCBMYXN0PTEKLSAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbiAgICAgOy8vIGNvbnRhaW5zIGNsYXNzaWNhbCBaaWd6YWcgdGFibGUgZW50cmllcyB3aXRoIGRvdWJsZSB0aGUgb3JpZ2luYWwgdmFsdWVzCi0gICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZQotCi07Ly9JbnB1dCBBcmd1bWVudHMKLQotcHBCaXRTdHJlYW0gICAgICAgICAgUk4gMAotcEJpdE9mZnNldCAgICAgICAgICAgUk4gMQotcERzdCAgICAgICAgICAgICAgICAgUk4gMgotUHJlZERpciAgICAgICAgICAgICAgUk4gMwotc2hvcnRWaWRlb0hlYWRlciAgICAgUk4gMwotCi07Ly9Mb2NhbCBWYXJpYWJsZXMKLQotUmV0dXJuICAgICAgICAgICAgICAgUk4gMAotCi1wVmxjVGFibGVMMEwxICAgICAgICBSTiA0Ci1wTE1BWFRhYmxlTDBMMSAgICAgICBSTiA0Ci1wUk1BWFRhYmxlTDBMMSAgICAgICBSTiA0Ci1wWmlnemFnVGFibGUgICAgICAgICBSTiA0Ci1Db3VudCAgICAgICAgICAgICAgICBSTiA2Ci0KLQotICAgICAgICAKLSAgICAgICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSB0byBzdG9yZSBvcHRpbWl6ZWQgVkxDLFppZ3phZywgUk1BWCwgTE1BWCBUYWJsZSBBZGRyZXNzZXMgCi0gICAgIAotICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBWbGNUYWJsZUwwTDEsNAotICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBMTUFYVGFibGVMMEwxLDQKLSAgICAgICAgTV9BTExPQzQgICAgICAgIHBwUk1BWFRhYmxlTDBMMSw0Ci0gICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFppZ3phZ1RhYmxlLDQKLQotICAgICAgICAKLSAgICAgICAgTV9TVEFSVCBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMscjEyCi0KLSAgICAgICAgTV9BUkcgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXJvblN0YWNrLDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwb2ludGVyIHRvIElucHV0IEFyZ3VtZW50IG9uIHN0YWNrICAgICAgICAgICAKLQotICAgICAgICBMRFIgICAgICAgICAgICAgcFppZ3phZ1RhYmxlLCA9YXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuICAgICA7Ly8gTG9hZCBBZGRyZXNzIG9mIHRoZSBaaWd6YWcgdGFibGUgICAgCi0gICAgICAgIEFERCAgICAgICAgICAgICBwWmlnemFnVGFibGUsIHBaaWd6YWdUYWJsZSwgUHJlZERpciwgTFNMICM2ICAgICAgICAgICA7Ly8gTG9hZGluZyBEaWZmZXJlbnQgdHlwZSBvZiB6aWd6YWcgdGFibGVzIGJhc2VkIG9uIFByZWREaXIKLSAgICAgICAKLSAgICAgICAgTV9TVFIgICAgICAgICAgIHBaaWd6YWdUYWJsZSxwcFppZ3phZ1RhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBaaWd6YWcgdGFibGUgYWRkcmVzcyBvbiBzdGFjawotICAgICAgICBMRFIgICAgICAgICAgICAgcFZsY1RhYmxlTDBMMSwgPWFybVZDTTRQMl9JbnRyYVZsY0wwTDEgICAgICAgICAgICA7Ly8gTG9hZCBvcHRpbWl6ZWQgcGFja2VkIFZMQyBUYWJsZSB3aXRoIGJvdGggTD0wIGFuZCBMPTEgZW50cmllcwotICAgICAgICBNX1NUUiAgICAgICAgICAgcFZsY1RhYmxlTDBMMSxwcFZsY1RhYmxlTDBMMSAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIFZMQyBUYWJsZSBhZGRyZXNzIG9uIHN0YWNrCi0gICAgICAgIExEUiAgICAgICAgICAgICBwTE1BWFRhYmxlTDBMMSwgPWFybVZDTTRQMl9JbnRyYUwwTDFMTUFYICAgICAgICAgIDsvLyBMb2FkIExNQVggVGFibGUKLSAgICAgICAgTV9TVFIgICAgICAgICAgIHBMTUFYVGFibGVMMEwxLHBwTE1BWFRhYmxlTDBMMSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBMTUFYIFRhYmxlIGFkZHJlc3Mgb24gU3RhY2sKLSAgICAgICAgTERSICAgICAgICAgICAgIHBSTUFYVGFibGVMMEwxLCA9YXJtVkNNNFAyX0ludHJhTDBMMVJNQVggICAgICAgICAgOy8vIExvYWQgUk1BWCBUYWJsZQotICAgICAgICBNT1YgICAgICAgICAgICAgQ291bnQsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNldCBTdGFydD0wICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIE1fU1RSICAgICAgICAgICBwUk1BWFRhYmxlTDBMMSxwcFJNQVhUYWJsZUwwTDEgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgUk1BWCBUYWJsZSBhZGRyZXNzIG9uIHN0YWNrCi0gICAgICAgICAgICAgIAotCi0gICAgICAgCi0gICAgICAgIE1fTERSICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyLHNob3J0VmlkZW9IZWFkZXJvblN0YWNrICAgICAgICAgICAgICA7Ly8gZ2V0IHRoZSBJbnB1dCBBcmd1bWVudCBmcm9tIHN0YWNrCi0KLSAgICAgICAgQkwgICAgICAgICAgICAgIGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlICAgICAgICAgICAgICAgOy8vIENhbGwgVW5zYWZlIEZ1bmN0aW9uCi0KLQotCi0gICAgICAgIAotICAgICAgICBNX0VORAotICAgICAgICBFTkRJRgotICAgICAgICAKLSAgICAgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTENfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWZlZDgwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTENfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjM4ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07LyoqCi07ICogCi07ICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDX3MucwotOyAqIE9wZW5NQVggREw6IHYxLjAuMgotOyAqIFJldmlzaW9uOiAgIDEyMjkwCi07ICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci07ICogCi07ICogCi07ICogCi07ICoKLTsgKiBEZXNjcmlwdGlvbjogCi07ICogQ29udGFpbnMgbW9kdWxlcyBmb3IgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZGVjb2RpbmcKLTsgKiBmb3IgaW50ZXIgYmxvY2suCi07ICoKLTsgKgotOyAqCi07ICogRnVuY3Rpb246IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIKLTsgKgotOyAqIERlc2NyaXB0aW9uOgotOyAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBmb3Igb25lIGludHJhIGNvZGVkIGJsb2NrLgotOyAqCi07ICogUmVtYXJrczoKLTsgKgotOyAqIFBhcmFtZXRlcnM6Ci07ICogW2luXSAgICBwcEJpdFN0cmVhbSAgICAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCi07ICogICAgICAgICAgICAgICAgICAgIHRoZSBiaXRzdHJlYW0gYnVmZmVyCi07ICogW2luXSAgICBwQml0T2Zmc2V0ICAgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAotOyAqICAgICAgICAgICAgICAgICAgICB0byBieSAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbiAgICBbMC03XS4KLTsgKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgICAgIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOwotOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiBzaG9ydFZpZGVvSGVhZGVyPT0wLAotOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIHNob3J0VmlkZW9IZWFkZXI9PTEuCi07ICogW291dF0gICAgcHBCaXRTdHJlYW0gICAgICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcwotOyAqICAgICAgICAgICAgICAgICAgICBkZWNvZGVkLCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlCi07ICogICAgICAgICAgICAgICAgICAgIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlcgotOyAqIFtvdXRdICAgIHBCaXRPZmZzZXQgICAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCi07ICogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKLTsgKiAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtCi07ICogW291dF0gICAgcERzdCAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50Ci07ICogICAgICAgICAgICAgICAgICAgIGJsb2NrLiBNdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZAotOyAqCi07ICogUmV0dXJuIFZhbHVlOgotOyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cwotOyAqICAgLUF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBEc3QsIG9yCi07ICogICAtcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLCBvcgotOyAqICAgLSpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10uCi07ICogT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IKLTsgKiAgIC1BdCBsZWFzdCBvbmUgbWFyayBiaXQgaXMgZXF1YWwgdG8gemVybwotOyAqICAgLUVuY291bnRlcmVkIGFuIGlsbGVnYWwgc3RyZWFtIGNvZGUgdGhhdCBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIFZMQyB0YWJsZQotOyAqICAgLUVuY291bnRlcmVkIGFuZCBpbGxlZ2FsIGNvZGUgaW4gdGhlIFZMQyBGTEMgdGFibGUKLTsgKiAgIC1UaGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBpcyBncmVhdGVyIHRoYW4gNjQKLTsgKgotOyAqLwotCi0KLSAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICBJTkNMVURFIGFybUNPTU1fQml0RGVjX3MuaAotCi0KLSAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKLQotICAgICAKLSAgICAgIAotCi0KLSAgICAgIElGIENvcnRleEE4Ci0KLSAgICAgCi0gICAgICAgIDsvLyBJbXBvcnQgdmFyaW91cyB0YWJsZXMgbmVlZGVkIGZvciB0aGUgZnVuY3Rpb24KLQotICAgICAgICAKLSAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9JbnRyYVZsY0wwTDEgICAgICAgICAgICAgOy8vIENvbnRhaW5zIG9wdGltaXplZCBhbmQgcGFja2VkIFZMQyBUYWJsZXMgZm9yIGJvdGggTGFzdCA9MSBhbmQgbGFzdD0wCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUGFja2VkIGluIFJ1bjpMZXZlbDpMYXN0IGZvcm1hdAotICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludHJhTDBMMUxNQVggICAgICAgICAgICA7Ly8gQ29udGFpbnMgTE1BWCB0YWJsZSBlbnRyaWVzIHdpdGggYm90aCBMYXN0PTAgYW5kIExhc3Q9MQotICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludHJhTDBMMVJNQVggICAgICAgICAgICA7Ly8gQ29udGFpbnMgUk1BWCB0YWJsZSBlbnRyaWVzIHdpdGggYm90aCBMYXN0PTAgYW5kIExhc3Q9MQotICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuICAgICA7Ly8gY29udGFpbnMgQ0xhc3NpY2FsLCBIb3Jpem9udGFsLCBWZXJ0aWNhbCBaaWd6YWcgdGFibGUgZW50cmllcyB3aXRoIGRvdWJsZSB0aGUgb3JpZ2luYWwgdmFsdWVzCi0gICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfYUludHJhRENMdW1hQ2hyb21hSW5kZXggIDsvLyBDb250YWlucyBPcHRpbWl6ZWQgRENMdW1hIGFuZCBEQ0Nocm9tYSBJbmRleCB0YWJsZSBFbnRyaWVzCi0gICAgICAgIAotCi0gICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZQotCi07Ly9JbnB1dCBBcmd1bWVudHMKLQotcHBCaXRTdHJlYW0gICAgICAgICAgUk4gMAotcEJpdE9mZnNldCAgICAgICAgICAgUk4gMQotcERzdCAgICAgICAgICAgICAgICAgUk4gMgotUHJlZERpciAgICAgICAgICAgICAgUk4gMwotc2hvcnRWaWRlb0hlYWRlciAgICAgUk4gMwotdmlkZW9Db21wICAgICAgICAgICAgUk4gNQotOy8vTG9jYWwgVmFyaWFibGVzCi0KLVJldHVybiAgICAgICAgICAgICAgIFJOIDAKLQotcERDTHVtYUNocm9tYUluZGV4ICAgUk4gNAotcERDQ2hyb21hSW5kZXggICAgICAgUk4gNwotcFZsY1RhYmxlTDBMMSAgICAgICAgUk4gNAotcExNQVhUYWJsZUwwTDEgICAgICAgUk4gNAotcFJNQVhUYWJsZUwwTDEgICAgICAgUk4gNAotcFppZ3phZ1RhYmxlICAgICAgICAgUk4gNAotQ291bnQgICAgICAgICAgICAgICAgUk4gNgotRENWYWx1ZVNpemUgICAgICAgICAgUk4gNgotcG93T2ZTaXplICAgICAgICAgICAgUk4gNwotdGVtcDEgICAgICAgICAgICAgICAgUk4gNQotCi0KLTsvLyBTY3JhdGNoIFJlZ2lzdGVycwotCi1SQml0U3RyZWFtICAgICAgICAgICBSTiA4Ci1SQml0QnVmZmVyICAgICAgICAgICBSTiA5Ci1SQml0Q291bnQgICAgICAgICAgICBSTiAxMAotCi1UMSAgICAgICAgICAgICAgICAgICBSTiAxMQotVDIgICAgICAgICAgICAgICAgICAgUk4gMTIKLURDVmFsICAgICAgICAgICAgICAgIFJOIDE0Ci0KLSAgICAgICAgCi0gICAgICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgdG8gc3RvcmUgb3B0aW1pemVkIFZMQyxaaWd6YWcsIFJNQVgsIExNQVggVGFibGUgQWRkcmVzc2VzIAotICAgICAKLSAgICAgICAgTV9BTExPQzQgICAgICAgIHBwVmxjVGFibGVMMEwxLDQKLSAgICAgICAgTV9BTExPQzQgICAgICAgIHBwTE1BWFRhYmxlTDBMMSw0Ci0gICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFJNQVhUYWJsZUwwTDEsNAotICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBaaWd6YWdUYWJsZSw0Ci0gICAgICAgIE1fQUxMT0M0ICAgICAgICBwRENDb2VmZiw0Ci0gICAgICAgIAotCi0gICAgICAgIAotICAgICAgICBNX1NUQVJUIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyxyMTIKLQotICAgICAgICBNX0FSRyAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcm9uU3RhY2ssNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUG9pbnRlciB0byBhcmd1bWVudCBvbiBzdGFjayAgCi0gICAgICAgIE1fQVJHICAgICAgICAgICB2aWRlb0NvbXBvbnN0YWNrLDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBQb2ludGVyIHRvIGFyZ3VtZW50IG9uIHN0YWNrCi0KLSAgICAgICAgCi0gICAgICAgIDsvLyBEZWNvZGUgREMgQ29lZmZpY2llbnQKLQotICAgICAgICAKLSAgICAgICAgTERSICAgICAgICAgICAgIHBEQ0x1bWFDaHJvbWFJbmRleCwgPWFybVZDTTRQMl9hSW50cmFEQ0x1bWFDaHJvbWFJbmRleCA7Ly8gTG9hZCBPcHRpbWl6ZWQgVkxDIFRhYmxlIGZvciBMdW1pbmFuY2UgYW5kIENocm9taW5hbmNlCi0KLSAgICAgICAgOy8vIEluaXRpYWxpemluZyB0aGUgQml0c3RyZWFtIE1hY3JvCi0KLSAgICAgICAgTV9CRF9JTklUMCAgICAgIHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBSQml0U3RyZWFtLCBSQml0QnVmZmVyLCBSQml0Q291bnQKLSAgICAgICAgTV9MRFIgICAgICAgICAgIHZpZGVvQ29tcCx2aWRlb0NvbXBvbnN0YWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIE1fQkRfSU5JVDEgICAgICBUMSwgVDIsIFQyCi0gICAgICAgIEFERCAgICAgICAgICAgICBwRENMdW1hQ2hyb21hSW5kZXgscERDTHVtYUNocm9tYUluZGV4LHZpZGVvQ29tcCwgTFNMICM2ICAgICAgICAgICAgIAotICAgICAgICBNX0JEX0lOSVQyICAgICAgVDEsIFQyLCBUMgotICAgIAotICAgICAgICAKLSAgICAgICAgTV9CRF9WTEQgICAgICAgIERDVmFsdWVTaXplLFQxLFQyLHBEQ0x1bWFDaHJvbWFJbmRleCw0LDIgICAgICAgICAgICAgICAgICAgIDsvLyBWTEMgRGVjb2RlIHVzaW5nIG9wdGltaXplZCBMdW1pbmFuY2UgYW5kIENocm9taW5hbmNlIFZMQyBUYWJsZQotCi0gICAgCi0gICAgICAgCi0KLURlY29kZURDCi0gICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIENNUCAgICAgICAgICAgICBEQ1ZhbHVlU2l6ZSwjMTIgICAgIAotICAgICAgICBCR1QgICAgICAgICAgICAgRXhpdEVycm9yCi0gICAgICAgIAotICAgICAgICBDTVAgICAgICAgICAgICAgRENWYWx1ZVNpemUsIzAKLSAgICAgICAgTU9WRVEgICAgICAgICAgIERDVmFsLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBEQ1ZhbHVlU2l6ZSBpcyB6ZXJvIHRoZW4gREMgY29lZmYgPTAKLSAgICAgICAgQkVRICAgICAgICAgICAgIEFDRGVjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBCcmFuY2ggdG8gcGVyZm9ybSBBQyBDb2VmZiBEZWNvZGluZwotICAgICAgICAKLSAgICAgICAgTV9CRF9WUkVBRDE2ICAgIERDVmFsLERDVmFsdWVTaXplLFQxLFQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBHZXQgREMgVmFsdWUgRnJvbSBCaXQgc3RyZWFtCi0gICAgICAgICAKLQotICAgICAgICBNT1YgICAgICAgICAgICAgcG93T2ZTaXplLCMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIExTTCAgICAgICAgICAgICBwb3dPZlNpemUsRENWYWx1ZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcG93T2ZTaXplPXBvdygyLERDVmFsdWVTaXplKQotICAgICAgICBDTVAgICAgICAgICAgICAgRENWYWwscG93T2ZTaXplLExTUiAjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENvbXBhcmUgRENWYWwgd2l0aCBwb3dPZlNpemUvMiAKLSAgICAgICAgQURETFQgICAgICAgICAgIERDVmFsLERDVmFsLCMxCi0gICAgICAgIFNVQkxUICAgICAgICAgICBEQ1ZhbCxEQ1ZhbCxwb3dPZlNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgTGVzc3RoYW4gcG93T2ZTaXplLzIgRENWYWw9RENWYWwtcG93T2ZTaXplKzEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBFbHNlIERDVmFsPSBmZXRjaGJpdHMgZnJvbSBiaXQgc3RyZWFtCi0KLUNoZWNrRENWYWx1ZVNpemUKLSAgICAgICAgCi0gICAgICAgIENNUCAgICAgICAgICAgICBEQ1ZhbHVlU2l6ZSwjOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgRENWYWx1ZVNpemUgZ3JlYXRlciB0aGFuIDggY2hlY2sgbWFya2VyIGJpdAotCi0gICAgICAgIEJMRSAgICAgICAgICAgICBBQ0RlY29kZQotCi0gICAgICAgIE1fQkRfUkVBRDggICAgICB0ZW1wMSwxLFQxCi0gICAgICAgIFRFUSAgICAgICAgICAgICB0ZW1wMSwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgTWFya2VyIGJpdCBpcyB6ZXJvIEV4aXQgd2l0aCBhbiBFcnJvciBNZXNzYWdlCi0gICAgICAgIEJFUSAgICAgICAgICAgICBFeGl0RXJyb3IKLQotICAgICAgICAKLQotICAgICAgICA7Ly8gRGVjb2RlIEFDIENvZWZmaWNpZW50Ci0KLUFDRGVjb2RlCi0KLSAgICAgICAgTV9TVFIgICAgICAgICAgIERDVmFsLHBEQ0NvZWZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIERlY29kZWQgREMgQ29lZmYgb24gU3RhY2sKLSAgICAgICAgTV9CRF9GSU5JICAgICAgIHBwQml0U3RyZWFtLHBCaXRPZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFRlcm1pbmF0aW5nIHRoZSBCaXQgc3RyZWFtIE1hY3JvCi0gICAgICAgICAKLSAgICAgICAgTERSICAgICAgICAgICAgIHBaaWd6YWdUYWJsZSwgPWFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbiAgICAgICAgICA7Ly8gTG9hZCBaaWd6YWcgdGFsYmUgYWRkcmVzcyAgIAotICAgICAgICBBREQgICAgICAgICAgICAgcFppZ3phZ1RhYmxlLCBwWmlnemFnVGFibGUsIFByZWREaXIsIExTTCAjNiAgICAgICAgICAgICAgICA7Ly8gTW9kaWZ5IHRoZSBaaWd6YWcgdGFibGUgYWRyZXNzIGJhc2VkIG9uIFByZWREaXIgICAgICAgICAgICAgICAgCi0gICAgICAgCi0gICAgICAgIE1fU1RSICAgICAgICAgICBwWmlnemFnVGFibGUscHBaaWd6YWdUYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSB6aWd6YWcgdGFibGUgb24gc3RhY2sKLSAgICAgICAgTERSICAgICAgICAgICAgIHBWbGNUYWJsZUwwTDEsID1hcm1WQ000UDJfSW50cmFWbGNMMEwxICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBPcHRpbWl6ZWQgVkxDIFRhYmxlIFdpdGggYm90aCBMYXN0PTAgYW5kIExhc3Q9MSBFbnRyaWVzCi0gICAgICAgIE1fU1RSICAgICAgICAgICBwVmxjVGFibGVMMEwxLHBwVmxjVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBPcHRpbWl6ZWQgVkxDIFRhYmxlIG9uIHN0YWNrCi0gICAgICAgIExEUiAgICAgICAgICAgICBwTE1BWFRhYmxlTDBMMSwgPWFybVZDTTRQMl9JbnRyYUwwTDFMTUFYICAgICAgICAgICAgICAgOy8vIExvYWQgTE1BWCBUYWJsZQotICAgICAgICBNX1NUUiAgICAgICAgICAgcExNQVhUYWJsZUwwTDEscHBMTUFYVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgTE1BWCB0YWJsZSBvbiBzdGFjawotICAgICAgICBMRFIgICAgICAgICAgICAgcFJNQVhUYWJsZUwwTDEsID1hcm1WQ000UDJfSW50cmFMMEwxUk1BWCAgICAgICAgICAgICAgIDsvLyBMb2FkIFJNQVggVGFibGUKLSAgICAgICAgTU9WICAgICAgICAgICAgIENvdW50LCMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNldCBTdGFydCA9MSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBNX1NUUiAgICAgICAgICAgcFJNQVhUYWJsZUwwTDEscHBSTUFYVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgUk1BWCBUYWJsZSBvbiBTdGFjawotICAgICAgICAKLSAgICAgICAKLSAgICAgICAgTV9MRFIgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXIsc2hvcnRWaWRlb0hlYWRlcm9uU3RhY2sgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgdGhlIElucHV0IEFyZ3VtZW50IEZyb20gU3RhY2sKLSAgICAgICAgCi0gICAgICAgIEJMICAgICAgICAgICAgICBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZSAgICAgICAgICAgICAgICAgICAgOy8vIENhbGwgdGhlIFVuc2FmZSBGdW5jdGlvbgotCi0gICAgICAgIE1fTERSICAgICAgICAgICBEQ1ZhbCxwRENDb2VmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBHZXQgdGhlIERlY29kZWQgREMgVmFsdWUgRnJvbSBTdGFjawotICAgICAgICBTVFJIICAgICAgICAgICAgRENWYWwsW3BEc3RdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgdGhlIERDIFZhbHVlIAotICAgICAgICBCICAgICAgICAgICAgICAgRXhpdE9LCi0gICAgICAgIAotICAgICAgICAgICAgICAKLQotRXhpdEVycm9yCi0gCi0gICAgICAgIE1fQkRfRklOSSAgICAgICBwcEJpdFN0cmVhbSxwQml0T2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBUZXJtaW5hdGluZyB0aGUgQml0IFN0cmVhbSBNYWNybyBpbiBjYXNlIG9mIGFuIEVycm9yCi0gICAgICAgIE1PViAgICAgICAgICAgICBSZXR1cm4sI09NWF9TdHNfRXJyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBFeGl0IHdpdGggYW4gRXJyb3IgTWVzc2FnZSAKLUV4aXRPSwotICAgICAgCi0gICAgICAgIE1fRU5ECi0gICAgICAgIEVORElGCi0gICAgICAgIAotICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRmluZE1WcHJlZF9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX0ZpbmRNVnByZWRfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzQ0MTIwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRmluZE1WcHJlZF9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMl9GaW5kTVZwcmVkX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDEyMjkwCi07Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotOy8vIEZ1bmN0aW9uOgotOy8vICAgICBvbXhWQ000UDJfRmluZE1WcHJlZAotOy8vCi0gICAgICAgIDsvLyBJbmNsdWRlIGhlYWRlcnMKLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgICBJTkNMVURFIGFybVZDQ09NTV9zLmgKLQotICAgICAgICA7Ly8gRGVmaW5lIGNwdSB2YXJpYW50cwotICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4Ci0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgSUYgQ29ydGV4QTgKLSAgICAgICAgCi0gICAgICAgIE1fVEFCTEUgYXJtVkNNNFAyX3BCbGtJbmRleFRhYmxlCi0gICAgICAgIERDRCAgT01YVkNCbGswLCBPTVhWQ0JsazEKLSAgICAgICAgRENEICBPTVhWQ0JsazIsIE9NWFZDQmxrMwotCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAKLXBTcmNNVkN1ck1CICAgICAgICAgICAgUk4gMAotcFNyY0NhbmRNVjEgICAgICAgICAgICBSTiAxCi1wU3JjQ2FuZE1WMiAgICAgICAgICAgIFJOIDIKLXBTcmNDYW5kTVYzICAgICAgICAgICAgUk4gMwotcERzdE1WUHJlZCAgICAgICAgICAgICBSTiA0Ci1wRHN0TVZQcmVkTUUgICAgICAgICAgIFJOIDUKLWlCbGsgICAgICAgICAgICAgICAgICAgUk4gNgotCi1wVGFibGUgICAgICAgICAgICAgICAgIFJOIDQKLUNhbmRNViAgICAgICAgICAgICAgICAgUk4gMTIKLQotcENhbmRNVjEgICAgICAgICAgICAgICBSTiA3Ci1wQ2FuZE1WMiAgICAgICAgICAgICAgIFJOIDgKLXBDYW5kTVYzICAgICAgICAgICAgICAgUk4gOQotCi1DYW5kTVYxZHggICAgICAgICAgICAgIFJOIDAgCi1DYW5kTVYxZHkgICAgICAgICAgICAgIFJOIDEgCi1DYW5kTVYyZHggICAgICAgICAgICAgIFJOIDIKLUNhbmRNVjJkeSAgICAgICAgICAgICAgUk4gMwotQ2FuZE1WM2R4ICAgICAgICAgICAgICBSTiAxMAotQ2FuZE1WM2R5ICAgICAgICAgICAgICBSTiAxMQotCi10ZW1wICAgICAgICAgICAgICAgICAgIFJOIDE0Ci0KLXplcm8gICAgICAgICAgICAgICAgICAgUk4gMTQKLXJldHVybiAgICAgICAgICAgICAgICAgUk4gMAotICAgICAgICAKLTsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBNYWluIHJvdXRpbmUKLTsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgCi0KLSAgICAgICAgTV9BTExPQzQgTVYsIDQKLSAgICAgICAgCi0gICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIgCi0gICAgICAgIE1fU1RBUlQgb214VkNNNFAyX0ZpbmRNVnByZWQsIHIxMQotICAgICAgICAKLSAgICAgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKLSAgICAgICAgTV9BUkcgICBwcERzdE1WUHJlZCwgIDQKLSAgICAgICAgTV9BUkcgICBwcERzdE1WUHJlZE1FLCA0Ci0gICAgICAgIE1fQVJHICAgQmxrLCA0Ci0gICAgICAgIAotICAgICAgICBNX0FEUiBDYW5kTVYsIE1WCi0gICAgICAgIE1PViAgIHplcm8sICMwCi0gICAgICAgIE1fTERSIGlCbGssIEJsawotICAgICAgICAKLSAgICAgICAgOy8vIFNldCB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlc2UKLSAgICAgICAgOy8vIHRvIGJlIHVzZWQgaWYgcFNyY0NhbmRNVlsxfDJ8M10gPT0gTlVMTAotICAgICAgICBNT1YgICBwQ2FuZE1WMSwgQ2FuZE1WCi0gICAgICAgIE1PViAgIHBDYW5kTVYyLCBDYW5kTVYKLSAgICAgICAgTU9WICAgcENhbmRNVjMsIENhbmRNVgotICAgIAotICAgICAgICBTVFIgICB6ZXJvLCBbQ2FuZE1WXQotCi0gICAgICAgIDsvLyBCcmFuY2ggdG8gdGhlIGNhc2UgYmFzZWQgb24gYmxrIG51bWJlcgotICAgICAgICBNX1NXSVRDSCBpQmxrCi0gICAgICAgIE1fQ0FTRSAgIE9NWFZDQmxrMCAgICAgIDsvLyBpQmxrPTAKLSAgICAgICAgTV9DQVNFICAgT01YVkNCbGsxICAgICAgOy8vIGlCbGs9MAotICAgICAgICBNX0NBU0UgICBPTVhWQ0JsazIgICAgICA7Ly8gaUJsaz0wCi0gICAgICAgIE1fQ0FTRSAgIE9NWFZDQmxrMyAgICAgIDsvLyBpQmxrPTAKLSAgICAgICAgTV9FTkRTV0lUQ0gKLSAgICAgICAgCi1PTVhWQ0JsazAKLSAgICAgICAgQ01QICAgcFNyY0NhbmRNVjEsICMwCi0gICAgICAgIEFERE5FIHBDYW5kTVYxLCBwU3JjQ2FuZE1WMSwgIzQKLSAgICAgICAgCi0gICAgICAgIENNUCAgIHBTcmNDYW5kTVYyLCAjMAotICAgICAgICBBRERORSBwQ2FuZE1WMiwgcFNyY0NhbmRNVjIsICM4Ci0KLSAgICAgICAgQ01QICAgcFNyY0NhbmRNVjMsICMwCi0gICAgICAgIEFERE5FIHBDYW5kTVYzLCBwU3JjQ2FuZE1WMywgIzgKLSAgICAgICAgQ01QRVEgcFNyY0NhbmRNVjEsICMwCi0gICAgCi0gICAgICAgIE1PVkVRIHBDYW5kTVYzLCBwQ2FuZE1WMgotICAgICAgICBNT1ZFUSBwQ2FuZE1WMSwgcENhbmRNVjIKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgQ01QICAgcFNyY0NhbmRNVjEsICMwCi0gICAgICAgIENNUEVRIHBTcmNDYW5kTVYyLCAjMAotICAgIAotICAgICAgICBNT1ZFUSBwQ2FuZE1WMSwgcENhbmRNVjMKLSAgICAgICAgTU9WRVEgcENhbmRNVjIsIHBDYW5kTVYzCi0gICAgICAgIAotICAgICAgICBDTVAgICBwU3JjQ2FuZE1WMiwgIzAKLSAgICAgICAgQ01QRVEgcFNyY0NhbmRNVjMsICMwCi0gICAgCi0gICAgICAgIE1PVkVRIHBDYW5kTVYyLCBwQ2FuZE1WMQotICAgICAgICBNT1ZFUSBwQ2FuZE1WMywgcENhbmRNVjEKLSAgICAgICAgCi0gICAgICAgIEIgICAgIEJsa0VuZAotICAgIAotT01YVkNCbGsxCi0gICAgICAgIE1PViAgIHBDYW5kTVYxLCBwU3JjTVZDdXJNQgotICAgICAgICBDTVAgICBwU3JjQ2FuZE1WMywgIzAKLSAgICAgICAgQURETkUgcENhbmRNVjMsIHBTcmNDYW5kTVYzLCAjOAotICAgICAgICAKLSAgICAgICAgQ01QICAgcFNyY0NhbmRNVjIsICMwCi0gICAgICAgIEFERE5FIHBDYW5kTVYyLCBwU3JjQ2FuZE1WMiwgIzEyCi0gICAgCi0gICAgICAgIENNUEVRIHBTcmNDYW5kTVYzLCAjMAotICAgIAotICAgICAgICBNT1ZFUSBwQ2FuZE1WMiwgcENhbmRNVjEKLSAgICAgICAgTU9WRVEgcENhbmRNVjMsIHBDYW5kTVYxCi0gICAgICAgICAgICAKLSAgICAgICAgQiAgICAgQmxrRW5kCi0KLU9NWFZDQmxrMgotICAgICAgICBDTVAgICBwU3JjQ2FuZE1WMSwgIzAKLSAgICAgICAgTU9WICAgcENhbmRNVjIsIHBTcmNNVkN1ck1CCi0gICAgICAgIEFERCAgIHBDYW5kTVYzLCBwU3JjTVZDdXJNQiwgIzQKLSAgICAgICAgQURETkUgcENhbmRNVjEsIHBTcmNDYW5kTVYxLCAjMTIKLSAgICAgICAgQiAgICAgQmxrRW5kCi0KLU9NWFZDQmxrMwotICAgICAgICBBREQgICBwQ2FuZE1WMSwgcFNyY01WQ3VyTUIsICM4Ci0gICAgICAgIE1PViAgIHBDYW5kTVYyLCBwU3JjTVZDdXJNQgotICAgICAgICBBREQgICBwQ2FuZE1WMywgcFNyY01WQ3VyTUIsICM0Ci0gICAgCi1CbGtFbmQKLQotICAgICAgICA7Ly8gVXNpbmcgdGhlIHRyYW5zcGVyYW5jeSBpbmZvLCB6ZXJvCi0gICAgICAgIDsvLyBvdXQgdGhlIGNhbmRpZGF0ZSBNViBpZiBuZWNjZXNhcnkKLSAgICAgICAgTERSU0ggQ2FuZE1WMWR4LCBbcENhbmRNVjFdLCAjMgotICAgICAgICBMRFJTSCBDYW5kTVYyZHgsIFtwQ2FuZE1WMl0sICMyCi0gICAgICAgIExEUlNIIENhbmRNVjNkeCwgW3BDYW5kTVYzXSwgIzIKLSAgICAKLSAgICAgICAgOy8vIExvYWQgYXJndW1lbnQgZnJvbSB0aGUgc3RhY2sKLSAgICAgICAgTV9MRFIgcERzdE1WUHJlZE1FLCBwcERzdE1WUHJlZE1FCi0KLSAgICAgICAgTERSU0ggQ2FuZE1WMWR5LCBbcENhbmRNVjFdCi0gICAgICAgIExEUlNIIENhbmRNVjJkeSwgW3BDYW5kTVYyXQotICAgICAgICBMRFJTSCBDYW5kTVYzZHksIFtwQ2FuZE1WM10KLQotICAgICAgICBDTVAgcERzdE1WUHJlZE1FLCAjMCAgICAgICAgCi0KLSAgICAgICAgOy8vIFN0b3JlIHRoZSBjYW5kaWRhdGUgTVYncyBpbnRvIHRoZSBwRHN0TVZQcmVkTUUsIAotICAgICAgICA7Ly8gdGhlc2UgY2FuIGJlIHVzZWQgaW4gdGhlIGZhc3QgYWxnb3JpdGhtIGlmIGltcGxlbWVudGVkIAotCi0gICAgICAgIFNUUkhORSBDYW5kTVYxZHgsIFtwRHN0TVZQcmVkTUVdLCAjMgotICAgICAgICBTVFJITkUgQ2FuZE1WMWR5LCBbcERzdE1WUHJlZE1FXSwgIzIgICAgICAgIAotICAgICAgICBTVFJITkUgQ2FuZE1WMmR4LCBbcERzdE1WUHJlZE1FXSwgIzIKLSAgICAgICAgU1RSSE5FIENhbmRNVjJkeSwgW3BEc3RNVlByZWRNRV0sICMyCi0gICAgICAgIFNUUkhORSBDYW5kTVYzZHgsIFtwRHN0TVZQcmVkTUVdLCAjMgotICAgICAgICBTVFJITkUgQ2FuZE1WM2R5LCBbcERzdE1WUHJlZE1FXQotICAgICAgICAgICAKLSAgICAgICAgOyBGaW5kIHRoZSBtZWRpYW4gb2YgdGhlIDMgY2FuZGlkYXRlIE1WJ3MKLSAgICAgICAgTV9NRURJQU4zIENhbmRNVjFkeCwgQ2FuZE1WMmR4LCBDYW5kTVYzZHgsIHRlbXAKLQotICAgICAgICA7Ly8gTG9hZCBhcmd1bWVudCBmcm9tIHRoZSBzdGFjawotICAgICAgICBNX0xEUiBwRHN0TVZQcmVkLCBwcERzdE1WUHJlZAotCi0gICAgICAgIE1fTUVESUFOMyBDYW5kTVYxZHksIENhbmRNVjJkeSwgQ2FuZE1WM2R5LCB0ZW1wCi0gICAgCi0gICAgICAgIFNUUkggQ2FuZE1WM2R4LCBbcERzdE1WUHJlZF0sICMyCi0gICAgICAgIFNUUkggQ2FuZE1WM2R5LCBbcERzdE1WUHJlZF0KLQotICAgICAgICBNT1YgcmV0dXJuLCAjT01YX1N0c19Ob0VycgotICAgIAotICAgICAgICBNX0VORAotICAgIEVORElGIDsvLyBBUk0xMTM2SlMgOkxPUjogQ29ydGV4QTgKLSAgICAKLSAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfSURDVDh4OGJsa19zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX0lEQ1Q4eDhibGtfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWI5MjVlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfSURDVDh4OGJsa19zLnMKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAyX0lEQ1Q4eDhibGtfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgMTIyOTAKLTsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi07Ly8gRnVuY3Rpb246Ci07Ly8gICAgIG9teFZDTTRQMl9JRENUOHg4YmxrCi07Ly8KLSAgICAgICAgOy8vIEluY2x1ZGUgaGVhZGVycwotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0KLSAgICAgICAgOy8vIERlZmluZSBjcHUgdmFyaWFudHMKLSAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAotCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9JRENUX3MuaCAgICAgICAgCi0gICAgICAgIAotICAgICAgICBJTVBPUlQgYXJtQ09NTV9JRENUUHJlU2NhbGUKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBGdW5jdGlvbiBwcm90b3R5cGUKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAgICAgT01YUmVzdWx0Ci0gICAgICAgIDsvLyAgICAgb214VkNNNFAyX0lEQ1Q4eDhibGsoY29uc3QgT01YX1MxNiogcFNyYywKLSAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1MxNiogcERzdCkKLSAgICAgICAgOy8vICAgIAotICAgICAgICAKLSAgICBJRiBDb3J0ZXhBOAotICAgICAgICBNX0FMTE9DNCAgcHBEZXN0LCA0Ci0gICAgICAgIE1fQUxMT0M0ICBwU3RyaWRlLCA0Ci0gICAgICAgIE1fQUxMT0M4ICBwQmxrLCAyKjgqOAotICAgIEVORElGCi0gICAgCi0gICAgCi0gICAgSUYgQ29ydGV4QTgKLSAgICAgICAgTV9TVEFSVCBvbXhWQ000UDJfSURDVDh4OGJsaywgcjExLCBkMTUKLSAgICBFTkRJRgotICAgICAgICAKLSAgICBJRiBDb3J0ZXhBOAotICAgICAgICAKLTsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycwotcFNyYyAgICAgICAgICAgIFJOIDAKLXBEc3QgICAgICAgICAgICBSTiAxCi0KLTsvLyBEZWNsYXJlIG90aGVyIGludGVybWVkaWF0ZSByZWdpc3RlcnMKLVJlc3VsdCAgICAgICAgICBSTiAwCi0KLTsvLyBQcm90b3R5cGUgZm9yIG1hY3JvIE1fSURDVAotOy8vIHBTcmMgICAgICAgICAgICBSTiAwICA7Ly8gc291cmNlIGRhdGEgYnVmZmVyCi07Ly8gU3RyaWRlICAgICAgICAgIFJOIDEgIDsvLyBkZXN0aW5hdGlvbiBzdHJpZGUgaW4gYnl0ZXMKLTsvLyBwRGVzdCAgICAgICAgICAgUk4gMiAgOy8vIGRlc3RpbmF0aW9uIGRhdGEgYnVmZmVyCi07Ly8gcFNjYWxlICAgICAgICAgIFJOIDMgIDsvLyBwb2ludGVyIHRvIHNjYWxpbmcgdGFibGUKLQotcFNyYyAgICBSTiAwICAgIAotU3RyaWRlICBSTiAxICAgIAotcERlc3QgICBSTiAyICAgIAotcFNjYWxlICBSTiAzICAgIAotICAgICAgICAgICAgICAgIAotICAgICAgICBNT1YgICAgICAgICBwRGVzdCwgcERzdAotICAgICAgICBMRFIgICAgICAgICBwU2NhbGUsID1hcm1DT01NX0lEQ1RQcmVTY2FsZSAgICAgICAgCi0gICAgICAgIE1fSURDVCAgICAgIHM5LCBzMTYsIDE2ICAgICAgCi0gICAgICAgIE1PViAgICAgICAgIFJlc3VsdCwgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgTV9FTkQgICAgICAgCi0gICAgRU5ESUYgIAotICAgICAgICA7Ly8gQVJNMTEzNkpTIDpMT1I6IENvcnRleEE4Ci0KLSAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUNSZWNvbkJsb2NrX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUNSZWNvbkJsb2NrX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MxYWVjMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX01DUmVjb25CbG9ja19zLnMKKysrIC9kZXYvbnVsbApAQCAtMSw0NTggKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMl9NQ1JlY29uQmxvY2tfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgMTIyOTAKLTsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotOy8vIERlc2NyaXB0aW9uOgotOy8vCi07Ly8KLQotOy8vIEluY2x1ZGUgc3RhbmRhcmQgaGVhZGVycwotICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgSU5DTFVERSBhcm1DT01NX3MuaAotCi07Ly8gSW1wb3J0IHN5bWJvbHMgcmVxdWlyZWQgZnJvbSBvdGhlciBmaWxlcwotCi0gICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAotCi07Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi07Ly8gQVJNMTEzNkpTIGltcGxlbWVudGF0aW9uCi07Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLTsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLTsvLyBDb3J0ZXhBOCBpbXBsZW1lbnRhdGlvbgotOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgIElGICBDb3J0ZXhBOAotOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotOy8vIE1BQ1JPIERFRklOSVRJT05TCi07Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgOy8vIERlc2NyaXB0aW9uOgotICAgIDsvLyBEb2VzIGludGVycG9sYXRpb24gZm9yIHRoZSBjYXNlIG9mICJJbnRlZ2VyUGl4ZWwiIHByZWRpY3RUeXBlLiBCb3RoIAotICAgIDsvLyByb3VuZGluZyBjYXNlcyBhcmUgaGFuZGxlZC4gSnVzdCBjb3BpZXMgYSBibG9jayBmcm9tIHBTcmMgdG8gcERzdAotICAgIDsvLwotICAgIDsvLyBTeW50YXg6Ci0gICAgOy8vIE1fTUNSRUNPTkJMT0NLX0ludGVnZXJQaXhlbAotICAgIDsvLyAKLSAgICA7Ly8gSW5wdXRzOiBOb25lCi0gICAgOy8vIE91dHB1dHM6IE5vbmUKLQotICAgIE1BQ1JPIAotICAgIE1fTUNSRUNPTkJMT0NLX0ludGVnZXJQaXhlbAotQ2FzZUludGVnZXJQaXhlbF9SbmQwCi1DYXNlSW50ZWdlclBpeGVsX1JuZDEKLQotICAgIFZMRDEgICAgICAgIGRSb3cwLCBbcFNyY10sIHNyY1N0ZXAKLSAgICBWTEQxICAgICAgICBkUm93MSwgW3BTcmNdLCBzcmNTdGVwCi0gICAgVkxEMSAgICAgICAgZFJvdzIsIFtwU3JjXSwgc3JjU3RlcAotICAgIFZMRDEgICAgICAgIGRSb3czLCBbcFNyY10sIHNyY1N0ZXAKLSAgICBWTEQxICAgICAgICBkUm93NCwgW3BTcmNdLCBzcmNTdGVwCi0gICAgVkxEMSAgICAgICAgZFJvdzUsIFtwU3JjXSwgc3JjU3RlcAotICAgIFZMRDEgICAgICAgIGRSb3c2LCBbcFNyY10sIHNyY1N0ZXAKLSAgICBWTEQxICAgICAgICBkUm93NywgW3BTcmNdLCBzcmNTdGVwCi0KLSAgICBWU1QxICAgICAgICBkUm93MCwgW3BEc3RANjRdLCBkc3RTdGVwCi0gICAgVlNUMSAgICAgICAgZFJvdzEsIFtwRHN0QDY0XSwgZHN0U3RlcAotICAgIFZTVDEgICAgICAgIGRSb3cyLCBbcERzdEA2NF0sIGRzdFN0ZXAKLSAgICBWU1QxICAgICAgICBkUm93MywgW3BEc3RANjRdLCBkc3RTdGVwCi0gICAgVlNUMSAgICAgICAgZFJvdzQsIFtwRHN0QDY0XSwgZHN0U3RlcAotICAgIFZTVDEgICAgICAgIGRSb3c1LCBbcERzdEA2NF0sIGRzdFN0ZXAKLSAgICBWU1QxICAgICAgICBkUm93NiwgW3BEc3RANjRdLCBkc3RTdGVwCi0gICAgVlNUMSAgICAgICAgZFJvdzcsIFtwRHN0QDY0XSwgZHN0U3RlcAotCi0gICAgQiAgICAgICAgICAgU3dpdGNoUHJlZGljdFR5cGVFbmQKLSAgICBNRU5ECi07Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgOy8vIERlc2NyaXB0aW9uOgotICAgIDsvLyBEb2VzIGludGVycG9sYXRpb24gZm9yIHRoZSBjYXNlIG9mICJIYWxmUGl4ZWxYIiBwcmVkaWN0VHlwZS4gVGhlIHR3byAKLSAgICA7Ly8gcm91bmRpbmcgY2FzZXMgYXJlIGhhbmRsZWQgYnkgdGhlIHBhcmFtZXRlciAiJHJuZFZhbCIuIEF2ZXJhZ2VzIGJldHdlZW4KLSAgICA7Ly8gYSBwaXhlbCBhbmQgcGl4ZWwgcmlnaHQgdG8gaXQsIHJvdW5kaW5nIGl0IGJhc2VkIG9uICRybmRWYWwuIFRoZSAKLSAgICA7Ly8gcm91bmRpbmcgaXMgaW1wbGVtZW50ZWQgYnkgdXNpbmcgb3BDb2RlIHN3aXRjaGluZyBiZXR3ZWVuICJWUkhBREQiIGFuZCAKLSAgICA7Ly8gIlZIQUREIiBpbnN0cnVjdGlvbnMuCi0gICAgOy8vCi0gICAgOy8vIFN5bnRheDoKLSAgICA7Ly8gTV9NQ1JFQ09OQkxPQ0tfSGFsZlBpeGVsWCAkcm5kVmFsCi0gICAgOy8vIAotICAgIDsvLyBJbnB1dHM6IAotICAgIDsvLyAgICAgJHJuZFZhbDogMCBmb3Igcm91bmRpbmcgYW5kIDEgZm9yIG5vIHJvdW5kaW5nCi0gICAgOy8vIE91dHB1dHM6IE5vbmUKLQotICAgIE1BQ1JPIAotICAgIE1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFggJHJuZFZhbAotCi0gICAgTENMUyBNX1ZIQUREUgotICAgIElGICRybmRWYWwgPSAwCi1NX1ZIQUREUiBTRVRTICJWUkhBREQiCi0gICAgRUxTRQotTV9WSEFERFIgU0VUUyAiVkhBREQiCi0gICAgRU5ESUYKLQotQ2FzZUhhbGZQaXhlbFhfUm5kJHJuZFZhbAotCi0gICAgVkxEMSAgICAgICAge2RSb3cwLCBkUm93MFNoZnR9LCBbcFNyY10sIHNyY1N0ZXAKLSAgICBWRVhUICAgICAgICBkUm93MFNoZnQsIGRSb3cwLCBkUm93MFNoZnQsICMxCi0gICAgVkxEMSAgICAgICAge2RSb3cxLCBkUm93MVNoZnR9LCBbcFNyY10sIHNyY1N0ZXAKLSAgICBWRVhUICAgICAgICBkUm93MVNoZnQsIGRSb3cxLCBkUm93MVNoZnQsICMxCi0gICAgVkxEMSAgICAgICAge2RSb3cyLCBkUm93MlNoZnR9LCBbcFNyY10sIHNyY1N0ZXAKLSAgICBWRVhUICAgICAgICBkUm93MlNoZnQsIGRSb3cyLCBkUm93MlNoZnQsICMxCi0gICAgVkxEMSAgICAgICAge2RSb3czLCBkUm93M1NoZnR9LCBbcFNyY10sIHNyY1N0ZXAKLSAgICBWRVhUICAgICAgICBkUm93M1NoZnQsIGRSb3czLCBkUm93M1NoZnQsICMxCi0gICAgVkxEMSAgICAgICAge2RSb3c0LCBkUm93NFNoZnR9LCBbcFNyY10sIHNyY1N0ZXAKLSAgICBWRVhUICAgICAgICBkUm93NFNoZnQsIGRSb3c0LCBkUm93NFNoZnQsICMxCi0gICAgVkxEMSAgICAgICAge2RSb3c1LCBkUm93NVNoZnR9LCBbcFNyY10sIHNyY1N0ZXAKLSAgICBWRVhUICAgICAgICBkUm93NVNoZnQsIGRSb3c1LCBkUm93NVNoZnQsICMxCi0gICAgVkxEMSAgICAgICAge2RSb3c2LCBkUm93NlNoZnR9LCBbcFNyY10sIHNyY1N0ZXAKLSAgICBWRVhUICAgICAgICBkUm93NlNoZnQsIGRSb3c2LCBkUm93NlNoZnQsICMxCi0gICAgVkxEMSAgICAgICAge2RSb3c3LCBkUm93N1NoZnR9LCBbcFNyY10sIHNyY1N0ZXAKLSAgICBWRVhUICAgICAgICBkUm93N1NoZnQsIGRSb3c3LCBkUm93N1NoZnQsICMxCi0gICAgJE1fVkhBRERSICAgZFJvdzAsIGRSb3cwLCBkUm93MFNoZnQKLSAgICAkTV9WSEFERFIgICBkUm93MSwgZFJvdzEsIGRSb3cxU2hmdAotICAgIFZTVDEgICAgICAgIGRSb3cwLCBbcERzdEA2NF0sIGRzdFN0ZXAKLSAgICAkTV9WSEFERFIgICBkUm93MiwgZFJvdzIsIGRSb3cyU2hmdAotICAgIFZTVDEgICAgICAgIGRSb3cxLCBbcERzdEA2NF0sIGRzdFN0ZXAKLSAgICAkTV9WSEFERFIgICBkUm93MywgZFJvdzMsIGRSb3czU2hmdAotICAgIFZTVDEgICAgICAgIGRSb3cyLCBbcERzdEA2NF0sIGRzdFN0ZXAKLSAgICAkTV9WSEFERFIgICBkUm93NCwgZFJvdzQsIGRSb3c0U2hmdAotICAgIFZTVDEgICAgICAgIGRSb3czLCBbcERzdEA2NF0sIGRzdFN0ZXAKLSAgICAkTV9WSEFERFIgICBkUm93NSwgZFJvdzUsIGRSb3c1U2hmdAotICAgIFZTVDEgICAgICAgIGRSb3c0LCBbcERzdEA2NF0sIGRzdFN0ZXAKLSAgICAkTV9WSEFERFIgICBkUm93NiwgZFJvdzYsIGRSb3c2U2hmdAotICAgIFZTVDEgICAgICAgIGRSb3c1LCBbcERzdEA2NF0sIGRzdFN0ZXAKLSAgICAkTV9WSEFERFIgICBkUm93NywgZFJvdzcsIGRSb3c3U2hmdAotICAgIFZTVDEgICAgICAgIGRSb3c2LCBbcERzdEA2NF0sIGRzdFN0ZXAKLSAgICBWU1QxICAgICAgICBkUm93NywgW3BEc3RANjRdLCBkc3RTdGVwCi0gICAgCi0gICAgQiAgICAgICAgICAgU3dpdGNoUHJlZGljdFR5cGVFbmQKLSAgICBNRU5ECi07Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgOy8vIERlc2NyaXB0aW9uOgotICAgIDsvLyBEb2VzIGludGVycG9sYXRpb24gZm9yIHRoZSBjYXNlIG9mICJIYWxmUGl4ZWxZIiBwcmVkaWN0VHlwZS4gVGhlIHR3byAKLSAgICA7Ly8gcm91bmRpbmcgY2FzZXMgYXJlIGhhbmRsZWQgYnkgdGhlIHBhcmFtZXRlciAiJHJuZFZhbCIuIEF2ZXJhZ2VzIGJldHdlZW4KLSAgICA7Ly8gYSBwaXhlbCBhbmQgcGl4ZWwgYmVsb3cgaXQsIHJvdW5kaW5nIGl0IGJhc2VkIG9uICRybmRWYWwuIFRoZSAKLSAgICA7Ly8gcm91bmRpbmcgaXMgaW1wbGVtZW50ZWQgYnkgdXNpbmcgb3BDb2RlIHN3aXRjaGluZyBiZXR3ZWVuICJWUkhBREQiIGFuZCAKLSAgICA7Ly8gIlZIQUREIiBpbnN0cnVjdGlvbnMuCi0gICAgOy8vCi0gICAgOy8vIFN5bnRheDoKLSAgICA7Ly8gTV9NQ1JFQ09OQkxPQ0tfSGFsZlBpeGVsWSAkcm5kVmFsCi0gICAgOy8vIAotICAgIDsvLyBJbnB1dHM6IAotICAgIDsvLyAgICAgJHJuZFZhbDogMCBmb3Igcm91bmRpbmcgYW5kIDEgZm9yIG5vIHJvdW5kaW5nCi0gICAgOy8vIE91dHB1dHM6IE5vbmUKLQotICAgIE1BQ1JPIAotICAgIE1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFkgJHJuZFZhbAotCi0gICAgTENMUyBNX1ZIQUREUgotICAgIElGICRybmRWYWwgPSAwCi1NX1ZIQUREUiBTRVRTICJWUkhBREQiCi0gICAgRUxTRQotTV9WSEFERFIgU0VUUyAiVkhBREQiCi0gICAgRU5ESUYKLQotQ2FzZUhhbGZQaXhlbFlfUm5kJHJuZFZhbAotICAgIFZMRDEgICAgICAgIGRSb3cwLCBbcFNyY10sIHNyY1N0ZXAKLSAgICBWTEQxICAgICAgICBkUm93MSwgW3BTcmNdLCBzcmNTdGVwCi0gICAgVkxEMSAgICAgICAgZFJvdzIsIFtwU3JjXSwgc3JjU3RlcAotICAgIFZMRDEgICAgICAgIGRSb3czLCBbcFNyY10sIHNyY1N0ZXAKLSAgICBWTEQxICAgICAgICBkUm93NCwgW3BTcmNdLCBzcmNTdGVwCi0gICAgVkxEMSAgICAgICAgZFJvdzUsIFtwU3JjXSwgc3JjU3RlcAotICAgIFZMRDEgICAgICAgIGRSb3c2LCBbcFNyY10sIHNyY1N0ZXAKLSAgICBWTEQxICAgICAgICBkUm93NywgW3BTcmNdLCBzcmNTdGVwCi0gICAgJE1fVkhBRERSICAgZFJvdzAsIGRSb3cwLCBkUm93MQotICAgIFZMRDEgICAgICAgIGRSb3c4LCBbcFNyY10sIHNyY1N0ZXAKLSAgICAkTV9WSEFERFIgICBkUm93MSwgZFJvdzEsIGRSb3cyCi0gICAgVlNUMSAgICAgICAgZFJvdzAsIFtwRHN0QDY0XSwgZHN0U3RlcAotICAgICRNX1ZIQUREUiAgIGRSb3cyLCBkUm93MiwgZFJvdzMKLSAgICBWU1QxICAgICAgICBkUm93MSwgW3BEc3RANjRdLCBkc3RTdGVwCi0gICAgJE1fVkhBRERSICAgZFJvdzMsIGRSb3czLCBkUm93NAotICAgIFZTVDEgICAgICAgIGRSb3cyLCBbcERzdEA2NF0sIGRzdFN0ZXAKLSAgICAkTV9WSEFERFIgICBkUm93NCwgZFJvdzQsIGRSb3c1Ci0gICAgVlNUMSAgICAgICAgZFJvdzMsIFtwRHN0QDY0XSwgZHN0U3RlcAotICAgICRNX1ZIQUREUiAgIGRSb3c1LCBkUm93NSwgZFJvdzYKLSAgICBWU1QxICAgICAgICBkUm93NCwgW3BEc3RANjRdLCBkc3RTdGVwCi0gICAgJE1fVkhBRERSICAgZFJvdzYsIGRSb3c2LCBkUm93NwotICAgIFZTVDEgICAgICAgIGRSb3c1LCBbcERzdEA2NF0sIGRzdFN0ZXAKLSAgICAkTV9WSEFERFIgICBkUm93NywgZFJvdzcsIGRSb3c4Ci0gICAgVlNUMSAgICAgICAgZFJvdzYsIFtwRHN0QDY0XSwgZHN0U3RlcAotICAgIFZTVDEgICAgICAgIGRSb3c3LCBbcERzdEA2NF0sIGRzdFN0ZXAKLQotICAgIEIgICAgICAgICAgIFN3aXRjaFByZWRpY3RUeXBlRW5kCi0gICAgTUVORAotOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgIDsvLyBEZXNjcmlwdGlvbjoKLSAgICA7Ly8gRG9lcyBpbnRlcnBvbGF0aW9uIGZvciB0aGUgY2FzZSBvZiAiSW50ZWdlclBpeGVsIiBwcmVkaWN0VHlwZS4gQm90aCAKLSAgICA7Ly8gcm91bmRpbmcgY2FzZXMgYXJlIGhhbmRsZWQuIAotICAgIDsvLyBUeXBpY2FsIGNvbXB1dGF0aW9uIGZvciBhIHJvdyBnb2VzIGxpa2UgdGhpcwotICAgIDsvLyAgICAgMS4gVkxEMSAgICAgICAge2RSb3cwLCBkUm93MFNoZnR9LCBbcFNyY10sIHNyY1N0ZXAgOy8vIExvYWQgdGhlIHJvdyBhbmQgbmV4dCA4IGJ5dGVzCi0gICAgOy8vICAgICAyLiBWRVhUICAgICAgICBkUm93MFNoZnQsIGRSb3cwLCBkUm93MFNoZnQsICMxICAgICA7Ly8gR2VuZXJhdGUgdGhlIHNoaWZ0ZWQgcm93Ci0gICAgOy8vICAgICAzLiBWQURETCAgICAgICBxU3VtMCwgZFJvdzAsIGRSb3cwU2hmdCAgICAgICAgICAgICA7Ly8gR2VuZXJhdGUgdGhlIHN1bSBvZiByb3cgYW5kIHNoaWZ0ZWQgcm93Ci0gICAgOy8vICAgICA1LiBWQUREICAgICAgICBxU3VtMCwgcVN1bTAsIHFTdW0xICAgICAgICAgICAgICAgICA7Ly8gQWRkIHRvIHRoZSBzdW0gb2YgbmV4dCByb3cgKG9kZCByb3cgc3VtIGhhcyByb3VuZGluZyB2YWx1ZSBhZGRlZCB0byBpdCkKLSAgICA7Ly8gICAgIDYuIFZTSFJOICAgICAgIGRSb3cwLCBxU3VtMCwgIzIgICAgICAgICAgICAgICAgICAgIDsvLyBEaXZpZGUgYnkgNAotICAgIDsvLyAgICAgNy4gVlNUMSAgICAgICAgZFJvdzAsIFtwRHN0QDY0XSwgZHN0U3RlcCAgICAgICAgICAgOy8vIFN0b3JlCi0gICAgOy8vIE9kZCByb3dzIHVuZGVyZ28gZm9sbG93aW5nIGNvbXB1dGF0aW9uIGFmdGVyIHN0ZXAgMwotICAgIDsvLyAgICAgNC4gVkFERCAgICAgICAgcVN1bTEsIHFTdW0xLCBxUm91bmQKLSAgICA7Ly8gVGhpcyBzYXZlcyBmb3IgYWRkaW5nIHJvdW5kaW5nIHZhbHVlIHRvIGVhY2ggZmluYWwgc3VtIChvdmVyYWxsIHNhdmVzIDQgCi0gICAgOy8vIGluc3RydWN0aW9ucykuCi0gICAgOy8vIFRoZXJlIGlzIHJldXNlIG9mIHJlZ2lzdGVycyBmb3IgcVN1bTYsIHFTdW03ICYgcVN1bTguIE92ZXJhbGwgc2NoZWR1bGluZyB0YWtlcyAKLSAgICA7Ly8gY2FyZSBvZiB0aGlzIGFuZCBhbHNvIG1pbmltaXplcyBzdGFsbHMuIFJvdW5kaW5nIHZhbHVlIHdhcyBtb2RpZmllZCBpbiAKLSAgICA7Ly8gQVJNIHJlZ2lzdGVyIHJuZFZhbCAob3JpZ2luYWxseSB1c2VkIGZvciByb3VuZGluZyBmbGFnKSBiZWZvcmUgdGhlIHN3aXRjaC4KLSAgICA7Ly8gSXQgaXMgdGhlbiBwb3B1bGF0ZWQgaW50byBhbGwgbGFuZXMgaW4gdGhpcyBtYWNyby4gTm8gYnJhbmNoaW5nIG91dCB0byAKLSAgICA7Ly8gbGFiZWwgIlN3aXRjaFByZWRpY3RUeXBlRW5kIiBpcyByZXF1aXJlZCBpbiB0aGUgZW5kIG9mIHRoZSBtYWNybyBhcyB0aGVzZSAKLSAgICA7Ly8gYXJlIHRoZSBsYXN0IG9mIHN3aXRjaCBjYXNlcy4KLSAgICA7Ly8gCi0gICAgOy8vIFN5bnRheDoKLSAgICA7Ly8gTV9NQ1JFQ09OQkxPQ0tfSGFsZlBpeGVsWFkKLSAgICA7Ly8gCi0gICAgOy8vIElucHV0czogTm9uZQotICAgIDsvLyBPdXRwdXRzOiBOb25lCi0KLSAgICBNQUNSTyAKLSAgICBNX01DUkVDT05CTE9DS19IYWxmUGl4ZWxYWQotCi1DYXNlSGFsZlBpeGVsWFlfUm5kMAotQ2FzZUhhbGZQaXhlbFhZX1JuZDEKLSAgICBWTEQxICAgICAgICB7ZFJvdzAsIGRSb3cwU2hmdH0sIFtwU3JjXSwgc3JjU3RlcAotICAgIFZEVVAgICAgICAgIHFSb3VuZCwgcm5kVmFsCi0gICAgVkxEMSAgICAgICAge2RSb3cxLCBkUm93MVNoZnR9LCBbcFNyY10sIHNyY1N0ZXAKLSAgICBWRVhUICAgICAgICBkUm93MFNoZnQsIGRSb3cwLCBkUm93MFNoZnQsICMxCi0gICAgVkxEMSAgICAgICAge2RSb3cyLCBkUm93MlNoZnR9LCBbcFNyY10sIHNyY1N0ZXAKLSAgICBWRVhUICAgICAgICBkUm93MVNoZnQsIGRSb3cxLCBkUm93MVNoZnQsICMxCi0gICAgVkxEMSAgICAgICAge2RSb3czLCBkUm93M1NoZnR9LCBbcFNyY10sIHNyY1N0ZXAKLSAgICBWRVhUICAgICAgICBkUm93MlNoZnQsIGRSb3cyLCBkUm93MlNoZnQsICMxCi0gICAgVkxEMSAgICAgICAge2RSb3c0LCBkUm93NFNoZnR9LCBbcFNyY10sIHNyY1N0ZXAKLSAgICBWQURETCAgICAgICBxU3VtMCwgZFJvdzAsIGRSb3cwU2hmdAotICAgIFZMRDEgICAgICAgIHtkUm93NSwgZFJvdzVTaGZ0fSwgW3BTcmNdLCBzcmNTdGVwCi0gICAgVkFEREwgICAgICAgcVN1bTEsIGRSb3cxLCBkUm93MVNoZnQKLSAgICBWTEQxICAgICAgICB7ZFJvdzYsIGRSb3c2U2hmdH0sIFtwU3JjXSwgc3JjU3RlcAotICAgIFZFWFQgICAgICAgIGRSb3czU2hmdCwgZFJvdzMsIGRSb3czU2hmdCwgIzEKLSAgICBWTEQxICAgICAgICB7ZFJvdzcsIGRSb3c3U2hmdH0sIFtwU3JjXSwgc3JjU3RlcAotICAgIFZFWFQgICAgICAgIGRSb3c0U2hmdCwgZFJvdzQsIGRSb3c0U2hmdCwgIzEKLSAgICBWTEQxICAgICAgICB7ZFJvdzgsIGRSb3c4U2hmdH0sIFtwU3JjXSwgc3JjU3RlcAotICAgIFZBREQgICAgICAgIHFTdW0xLCBxU3VtMSwgcVJvdW5kCi0gICAgVkFEREwgICAgICAgcVN1bTIsIGRSb3cyLCBkUm93MlNoZnQKLSAgICBWRVhUICAgICAgICBkUm93NVNoZnQsIGRSb3c1LCBkUm93NVNoZnQsICMxCi0gICAgVkFERCAgICAgICAgcVN1bTAsIHFTdW0wLCBxU3VtMQotICAgIFZBRERMICAgICAgIHFTdW0zLCBkUm93MywgZFJvdzNTaGZ0Ci0gICAgVkVYVCAgICAgICAgZFJvdzZTaGZ0LCBkUm93NiwgZFJvdzZTaGZ0LCAjMQotICAgIFZBREQgICAgICAgIHFTdW0xLCBxU3VtMSwgcVN1bTIKLSAgICBWU0hSTiAgICAgICBkUm93MCwgcVN1bTAsICMyCi0gICAgVkFEREwgICAgICAgcVN1bTQsIGRSb3c0LCBkUm93NFNoZnQKLSAgICBWU0hSTiAgICAgICBkUm93MSwgcVN1bTEsICMyCi0gICAgVkFERCAgICAgICAgcVN1bTMsIHFTdW0zLCBxUm91bmQKLSAgICBWQURETCAgICAgICBxU3VtNSwgZFJvdzUsIGRSb3c1U2hmdAotICAgIFZTVDEgICAgICAgIGRSb3cwLCBbcERzdEA2NF0sIGRzdFN0ZXAKLSAgICBWRVhUICAgICAgICBkUm93N1NoZnQsIGRSb3c3LCBkUm93N1NoZnQsICMxCi0gICAgVlNUMSAgICAgICAgZFJvdzEsIFtwRHN0QDY0XSwgZHN0U3RlcAotICAgIFZFWFQgICAgICAgIGRSb3c4U2hmdCwgZFJvdzgsIGRSb3c4U2hmdCwgIzEKLSAgICBWQUREICAgICAgICBxU3VtNSwgcVN1bTUsIHFSb3VuZAotICAgIFZBREQgICAgICAgIHFTdW0yLCBxU3VtMiwgcVN1bTMKLSAgICBWQUREICAgICAgICBxU3VtMywgcVN1bTMsIHFTdW00Ci0gICAgVkFERCAgICAgICAgcVN1bTQsIHFTdW00LCBxU3VtNQotICAgIFZTSFJOICAgICAgIGRSb3cyLCBxU3VtMiwgIzIKLSAgICBWU0hSTiAgICAgICBkUm93MywgcVN1bTMsICMyCi0gICAgVlNIUk4gICAgICAgZFJvdzQsIHFTdW00LCAjMgotICAgIFZBRERMICAgICAgIHFTdW02LCBkUm93NiwgZFJvdzZTaGZ0Ci0gICAgVkFEREwgICAgICAgcVN1bTcsIGRSb3c3LCBkUm93N1NoZnQKLSAgICBWU1QxICAgICAgICBkUm93MiwgW3BEc3RANjRdLCBkc3RTdGVwCi0gICAgVkFEREwgICAgICAgcVN1bTgsIGRSb3c4LCBkUm93OFNoZnQKLSAgICBWQUREICAgICAgICBxU3VtNywgcVN1bTcsIHFSb3VuZAotICAgIFZTVDEgICAgICAgIGRSb3czLCBbcERzdEA2NF0sIGRzdFN0ZXAKLSAgICBWU1QxICAgICAgICBkUm93NCwgW3BEc3RANjRdLCBkc3RTdGVwCi0gICAgVkFERCAgICAgICAgcVN1bTUsIHFTdW01LCBxU3VtNgotICAgIFZBREQgICAgICAgIHFTdW02LCBxU3VtNiwgcVN1bTcKLSAgICBWQUREICAgICAgICBxU3VtNywgcVN1bTcsIHFTdW04Ci0gICAgVlNIUk4gICAgICAgZFJvdzUsIHFTdW01LCAjMgotICAgIFZTSFJOICAgICAgIGRSb3c2LCBxU3VtNiwgIzIKLSAgICBWU0hSTiAgICAgICBkUm93NywgcVN1bTcsICMyCi0gICAgVlNUMSAgICAgICAgZFJvdzUsIFtwRHN0QDY0XSwgZHN0U3RlcAotICAgIFZTVDEgICAgICAgIGRSb3c2LCBbcERzdEA2NF0sIGRzdFN0ZXAKLSAgICBWU1QxICAgICAgICBkUm93NywgW3BEc3RANjRdLCBkc3RTdGVwCi0KLSAgICBNRU5ECi07Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLTsvLyBJbnB1dC9PdXRwdXQgUmVnaXN0ZXJzCi1wU3JjICAgICAgICAgICAgICAgICAgUk4gMAotc3JjU3RlcCAgICAgICAgICAgICAgIFJOIDEKLXBTcmNSZXNpZHVlICAgICAgICAgICBSTiAyCi1wRHN0ICAgICAgICAgICAgICAgICAgUk4gMwotZHN0U3RlcCAgICAgICAgICAgICAgIFJOIDQKLXByZWRpY3RUeXBlICAgICAgICAgICBSTiA1Ci1ybmRWYWwgICAgICAgICAgICAgICAgUk4gNgotCi07Ly8gTG9jYWwgU2NyYXRjaCBSZWdpc3RlcnMKLXBEc3RDb3B5ICAgICAgICAgICAgICBSTiAwCi1yZXR1cm4gICAgICAgICAgICAgICAgUk4gMAotCi07Ly8gTmVvbiBSZWdpc3RlcnMKLWRSb3cwICAgICAgICAgICAgICAgICBETiBEMC5VOAotZFJvdzBTaGZ0ICAgICAgICAgICAgIEROIEQxLlU4Ci1kUm93MSAgICAgICAgICAgICAgICAgRE4gRDIuVTgKLWRSb3cxU2hmdCAgICAgICAgICAgICBETiBEMy5VOAotZFJvdzIgICAgICAgICAgICAgICAgIEROIEQ0LlU4Ci1kUm93MlNoZnQgICAgICAgICAgICAgRE4gRDUuVTgKLWRSb3czICAgICAgICAgICAgICAgICBETiBENi5VOAotZFJvdzNTaGZ0ICAgICAgICAgICAgIEROIEQ3LlU4Ci1kUm93NCAgICAgICAgICAgICAgICAgRE4gRDguVTgKLWRSb3c0U2hmdCAgICAgICAgICAgICBETiBEOS5VOAotZFJvdzUgICAgICAgICAgICAgICAgIEROIEQxMC5VOAotZFJvdzVTaGZ0ICAgICAgICAgICAgIEROIEQxMS5VOAotZFJvdzYgICAgICAgICAgICAgICAgIEROIEQxMi5VOAotZFJvdzZTaGZ0ICAgICAgICAgICAgIEROIEQxMy5VOAotZFJvdzcgICAgICAgICAgICAgICAgIEROIEQxNC5VOAotZFJvdzdTaGZ0ICAgICAgICAgICAgIEROIEQxNS5VOAotZFJvdzggICAgICAgICAgICAgICAgIEROIEQxNi5VOAotZFJvdzhTaGZ0ICAgICAgICAgICAgIEROIEQxNy5VOAotCi0KLXFTdW0wICAgICAgICAgICAgICAgICBRTiBROS5VMTYKLXFTdW0xICAgICAgICAgICAgICAgICBRTiBRMTAuVTE2Ci1xU3VtMiAgICAgICAgICAgICAgICAgUU4gUTExLlUxNgotcVN1bTMgICAgICAgICAgICAgICAgIFFOIFExMi5VMTYKLXFTdW00ICAgICAgICAgICAgICAgICBRTiBRMTMuVTE2Ci1xU3VtNSAgICAgICAgICAgICAgICAgUU4gUTE0LlUxNgotcVN1bTYgICAgICAgICAgICAgICAgIFFOIFEwLlUxNgotcVN1bTcgICAgICAgICAgICAgICAgIFFOIFExLlUxNgotcVN1bTggICAgICAgICAgICAgICAgIFFOIFEyLlUxNgotCi1xUm91bmQgICAgICAgICAgICAgICAgUU4gUTE1LlUxNgotCi1kRHN0MCAgICAgICAgICAgICAgICAgRE4gRDAuVTgKLWREc3QxICAgICAgICAgICAgICAgICBETiBEMS5VOAotZERzdDIgICAgICAgICAgICAgICAgIEROIEQyLlU4Ci1kRHN0MyAgICAgICAgICAgICAgICAgRE4gRDMuVTgKLWREc3Q0ICAgICAgICAgICAgICAgICBETiBENC5VOAotZERzdDUgICAgICAgICAgICAgICAgIEROIEQ1LlU4Ci1kRHN0NiAgICAgICAgICAgICAgICAgRE4gRDYuVTgKLWREc3Q3ICAgICAgICAgICAgICAgICBETiBENy5VOAotCi1xUmVzMCAgICAgICAgICAgICAgICAgUU4gUTQuUzE2Ci1xUmVzMSAgICAgICAgICAgICAgICAgUU4gUTUuUzE2Ci1xUmVzMiAgICAgICAgICAgICAgICAgUU4gUTYuUzE2Ci1xUmVzMyAgICAgICAgICAgICAgICAgUU4gUTcuUzE2Ci1xUmVzNCAgICAgICAgICAgICAgICAgUU4gUTguUzE2Ci1xUmVzNSAgICAgICAgICAgICAgICAgUU4gUTkuUzE2Ci1xUmVzNiAgICAgICAgICAgICAgICAgUU4gUTEwLlMxNgotcVJlczcgICAgICAgICAgICAgICAgIFFOIFExMS5TMTYKLQotICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKLSAgICBNX1NUQVJUICAgICBvbXhWQ000UDJfTUNSZWNvbkJsb2NrLCByNiwgZDE1Ci0gICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKLSAgICBNX0FSRyAgICAgICBBcmdfZHN0U3RlcCwgICAgICAgIDQKLSAgICBNX0FSRyAgICAgICBBcmdfcHJlZGljdFR5cGUsICAgIDQKLSAgICBNX0FSRyAgICAgICBBcmdfcm5kVmFsLCAgICAgICAgIDQKLSAgICA7Ly8gTG9hZCBhcmd1bWVudCBmcm9tIHRoZSBzdGFjawotICAgIE1fTERSICAgICAgIGRzdFN0ZXAsIEFyZ19kc3RTdGVwCi0gICAgTV9MRFIgICAgICAgcHJlZGljdFR5cGUsIEFyZ19wcmVkaWN0VHlwZQotICAgIE1fTERSICAgICAgIHJuZFZhbCwgQXJnX3JuZFZhbAotICAgIEFERCAgICAgICAgIHByZWRpY3RUeXBlLCBybmRWYWwsIHByZWRpY3RUeXBlLCBMU0wgIzEKLSAgICBSU0IgICAgICAgICBybmRWYWwsIHJuZFZhbCwgIzIgICAgICAgICAgICAgIDsvLyBwcmVwYXJpbmcgcm5kVmFsIGZvciBIYWxmUGl4ZWxYWQotICAgIAotICAgIDsvLyBUaGUgZm9sbG93aW5nIGlzIGltcGxlbWVudGF0aW9uIG9mIHN3aXRjaGluZyB0byBkaWZmZXJlbnQgY29kZSBzZWdtZW50cwotICAgIDsvLyBiYXNlZCBvbiBkaWZmZXJlbnQgcHJlZGljdFR5cGUgYW5kIHJuZFZhbCBmbGFncy4gVGhlIGNvcnJlc3BvbmRpbmcgCi0gICAgOy8vIGxhYmVscyAoZS5nLiBDYXNlSW50ZWdlclBpeGVsX1JuZDApIGFyZSBlbWJlZGRlZCBpbiB0aGUgbWFjcm9zIGZvbGxvd2luZwotICAgIDsvLyBNX0VORFNXSVRDSCAoZS5nLiBNX01DUkVDT05CTE9DS19JbnRlZ2VyUGl4ZWwpLiBXaGlsZSAiTV9NQ1JFQ09OQkxPQ0tfSW50ZWdlclBpeGVsIiAKLSAgICA7Ly8gYW5kICJNX01DUkVDT05CTE9DS19IYWxmUGl4ZWxYWSIgaGFuZGxlIGZvciBib3RoIHJvdW5kaW5nIGNhc2VzOyAKLSAgICA7Ly8gIk1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFgiIGFuZCAiTV9NQ1JFQ09OQkxPQ0tfSGFsZlBpeGVsWSIgbWFjcm9zIGhhbmRsZSAKLSAgICA7Ly8gdGhlIHR3byByb3VuZGluZyBjYXNlcyBpbiBzZXBhcmF0ZSBjb2RlIGJhc2VzLgotICAgIDsvLyBBbGwgdGhlc2UgdG9nZXRoZXIgaW1wbGVtZW50IHRoZSBpbnRlcnBvbGF0aW9uIGZ1bmN0aW9uYWxpdHkKLSAgICAKLSAgICBNX1NXSVRDSCAgICBwcmVkaWN0VHlwZQotICAgICAgICBNX0NBU0UgICAgICBDYXNlSW50ZWdlclBpeGVsX1JuZDAKLSAgICAgICAgTV9DQVNFICAgICAgQ2FzZUludGVnZXJQaXhlbF9SbmQxCi0gICAgICAgIE1fQ0FTRSAgICAgIENhc2VIYWxmUGl4ZWxYX1JuZDAKLSAgICAgICAgTV9DQVNFICAgICAgQ2FzZUhhbGZQaXhlbFhfUm5kMQotICAgICAgICBNX0NBU0UgICAgICBDYXNlSGFsZlBpeGVsWV9SbmQwCi0gICAgICAgIE1fQ0FTRSAgICAgIENhc2VIYWxmUGl4ZWxZX1JuZDEKLSAgICAgICAgTV9DQVNFICAgICAgQ2FzZUhhbGZQaXhlbFhZX1JuZDAKLSAgICAgICAgTV9DQVNFICAgICAgQ2FzZUhhbGZQaXhlbFhZX1JuZDEKLSAgICBNX0VORFNXSVRDSAotCi0gICAgTV9NQ1JFQ09OQkxPQ0tfSW50ZWdlclBpeGVsCi0gICAgTV9NQ1JFQ09OQkxPQ0tfSGFsZlBpeGVsWCAwCi0gICAgTV9NQ1JFQ09OQkxPQ0tfSGFsZlBpeGVsWCAxCi0gICAgTV9NQ1JFQ09OQkxPQ0tfSGFsZlBpeGVsWSAwCi0gICAgTV9NQ1JFQ09OQkxPQ0tfSGFsZlBpeGVsWSAxCi0gICAgTV9NQ1JFQ09OQkxPQ0tfSGFsZlBpeGVsWFkKLVN3aXRjaFByZWRpY3RUeXBlRW5kCi0KLSAgICA7Ly8gQWZ0ZXIgaW50ZXJwb2xhdGlvbiBpcyBkb25lLCByZXNpZHVlIG5lZWRzIHRvIGJlIGFkZGVkLiBUaGlzIGlzIGRvbmUgCi0gICAgOy8vIG9ubHkgaW4gY2FzZSAicFNyY1Jlc2lkdWUiIHBhcmFtZXRlciB0byB0aGUgZnVuY3Rpb24gaXMgbm90IE5VTEwuCi0gICAgOy8vIEZvbGxvd2luZyBpcyBhIGNvbXBsZXRlbHkgdW5yb2xsZWQgY29kZSB0byBkbyBzby4gRWFjaCByb3cgYW5kIAotICAgIDsvLyBjb3JyZXNwb25kaW5nIHJlc2lkdWUgaXMgbG9hZGVkIGFuZCByZXNpZHVlIGlzIGFkZGVkIGFuZCB2YWx1ZSAKLSAgICA7Ly8gc3RvcmVkCi0gICAgCi0gICAgQ01QICAgICAgICAgcFNyY1Jlc2lkdWUsICMwCi0gICAgU1VCTkUgICAgICAgcERzdCwgcERzdCwgZHN0U3RlcCwgTFNMICMzICAgICA7Ly8gUmVzdG9yaW5nIHBEc3QKLSAgICBNT1ZORSAgICAgICBwRHN0Q29weSwgcERzdAotICAgIEJFUSAgICAgICAgIHBTcmNSZXNpZHVlQ29uZGl0aW9uRW5kCi1wU3JjUmVzaWR1ZU5vdE51bGwgICAgCi0gICAgVkxEMSAgICAgICAgZERzdDAsIFtwRHN0QDY0XSwgZHN0U3RlcAotICAgIFZMRDEgICAgICAgIHFSZXMwLCBbcFNyY1Jlc2lkdWVAMTI4XSEKLSAgICBWTEQxICAgICAgICBkRHN0MSwgW3BEc3RANjRdLCBkc3RTdGVwCi0gICAgVkxEMSAgICAgICAgcVJlczEsIFtwU3JjUmVzaWR1ZUAxMjhdIQotICAgIFZMRDEgICAgICAgIGREc3QyLCBbcERzdEA2NF0sIGRzdFN0ZXAKLSAgICBWTEQxICAgICAgICBxUmVzMiwgW3BTcmNSZXNpZHVlQDEyOF0hCi0gICAgVkFERFcgICAgICAgcVJlczAsIHFSZXMwLCBkRHN0MAotICAgIFZMRDEgICAgICAgIGREc3QzLCBbcERzdEA2NF0sIGRzdFN0ZXAKLSAgICBWQUREVyAgICAgICBxUmVzMSwgcVJlczEsIGREc3QxCi0gICAgVkxEMSAgICAgICAgcVJlczMsIFtwU3JjUmVzaWR1ZUAxMjhdIQotICAgIFZBRERXICAgICAgIHFSZXMyLCBxUmVzMiwgZERzdDIKLSAgICBWTEQxICAgICAgICBkRHN0NCwgW3BEc3RANjRdLCBkc3RTdGVwCi0gICAgVlFNT1ZVTiAgICAgZERzdDAsIHFSZXMwCi0gICAgVkxEMSAgICAgICAgcVJlczQsIFtwU3JjUmVzaWR1ZUAxMjhdIQotICAgIFZBRERXICAgICAgIHFSZXMzLCBxUmVzMywgZERzdDMKLSAgICBWTEQxICAgICAgICBkRHN0NSwgW3BEc3RANjRdLCBkc3RTdGVwCi0gICAgVlFNT1ZVTiAgICAgZERzdDEsIHFSZXMxCi0gICAgVkxEMSAgICAgICAgcVJlczUsIFtwU3JjUmVzaWR1ZUAxMjhdIQotICAgIFZBRERXICAgICAgIHFSZXM0LCBxUmVzNCwgZERzdDQKLSAgICBWTEQxICAgICAgICBkRHN0NiwgW3BEc3RANjRdLCBkc3RTdGVwCi0gICAgVlFNT1ZVTiAgICAgZERzdDIsIHFSZXMyCi0gICAgVkxEMSAgICAgICAgcVJlczYsIFtwU3JjUmVzaWR1ZUAxMjhdIQotICAgIFZBRERXICAgICAgIHFSZXM1LCBxUmVzNSwgZERzdDUKLSAgICBWTEQxICAgICAgICBkRHN0NywgW3BEc3RANjRdLCBkc3RTdGVwCi0gICAgVlFNT1ZVTiAgICAgZERzdDMsIHFSZXMzCi0gICAgVkxEMSAgICAgICAgcVJlczcsIFtwU3JjUmVzaWR1ZUAxMjhdIQotICAgIFZBRERXICAgICAgIHFSZXM2LCBxUmVzNiwgZERzdDYKLSAgICBWU1QxICAgICAgICBkRHN0MCwgW3BEc3RDb3B5QDY0XSwgZHN0U3RlcAotICAgIFZRTU9WVU4gICAgIGREc3Q0LCBxUmVzNAotICAgIFZTVDEgICAgICAgIGREc3QxLCBbcERzdENvcHlANjRdLCBkc3RTdGVwCi0gICAgVkFERFcgICAgICAgcVJlczcsIHFSZXM3LCBkRHN0NwotICAgIFZTVDEgICAgICAgIGREc3QyLCBbcERzdENvcHlANjRdLCBkc3RTdGVwCi0gICAgVlFNT1ZVTiAgICAgZERzdDUsIHFSZXM1Ci0gICAgVlNUMSAgICAgICAgZERzdDMsIFtwRHN0Q29weUA2NF0sIGRzdFN0ZXAKLSAgICBWUU1PVlVOICAgICBkRHN0NiwgcVJlczYKLSAgICBWU1QxICAgICAgICBkRHN0NCwgW3BEc3RDb3B5QDY0XSwgZHN0U3RlcAotICAgIFZRTU9WVU4gICAgIGREc3Q3LCBxUmVzNwotICAgIFZTVDEgICAgICAgIGREc3Q1LCBbcERzdENvcHlANjRdLCBkc3RTdGVwCi0gICAgVlNUMSAgICAgICAgZERzdDYsIFtwRHN0Q29weUA2NF0sIGRzdFN0ZXAKLSAgICBWU1QxICAgICAgICBkRHN0NywgW3BEc3RDb3B5QDY0XSwgZHN0U3RlcAotICAgIAotcFNyY1Jlc2lkdWVDb25kaXRpb25FbmQKLSAgICBNT1YgICAgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCi0KLSAgICBNX0VORAotICAgIEVORElGIDsvLyBDb3J0ZXhBOAotICAgIEVORAotOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotOy8vIG9teFZDTTRQMl9NQ1JlY29uQmxvY2sgZW5kcwotOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmFfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmFfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjRlYjI4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhX3MucworKysgL2Rldi9udWxsCkBAIC0xLDMzNCArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOyAqKioqKioqKioqCi07ICogCi07ICogRmlsZSBOYW1lOiAgb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYV9zLnMKLTsgKiBPcGVuTUFYIERMOiB2MS4wLjIKLTsgKiBSZXZpc2lvbjogICAxMjI5MAotOyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOyAqIAotOyAqIAotOyAqIAotOyAqIAotOyAqIERlc2NyaXB0aW9uOgotOyAqIENvbnRhaW5zIG1vZHVsZSBmb3IgREMvQUMgY29lZmZpY2llbnQgcHJlZGljdGlvbgotOyAqCi07ICogCi07ICogRnVuY3Rpb246IG9teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEKLTsgKgotOyAqIERlc2NyaXB0aW9uOgotOyAqIFBlcmZvcm1zIGFkYXB0aXZlIERDL0FDIGNvZWZmaWNpZW50IHByZWRpY3Rpb24gZm9yIGFuIGludHJhIGJsb2NrLiBQcmlvcgotOyAqIHRvIHRoZSBmdW5jdGlvbiBjYWxsLCBwcmVkaWN0aW9uIGRpcmVjdGlvbiAocHJlZERpcikgc2hvdWxkIGJlIHNlbGVjdGVkCi07ICogYXMgc3BlY2lmaWVkIGluIHN1YmNsYXVzZSA3LjQuMy4xIG9mIElTTy9JRUMgMTQ0OTYtMi4KLTsgKgotOyAqIFJlbWFya3M6Ci07ICoKLTsgKiBQYXJhbWV0ZXJzOgotOyAqIFtpbl0gIHBTcmNEc3QgICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgd2hpY2ggY29udGFpbnMgdGhlIAotOyAqICAgICAgICAgICAgICAgICAgICBxdWFudGl6ZWQgY29lZmZpY2llbnQgcmVzaWR1YWxzIChQUUYpIG9mIHRoZSBjdXJyZW50IAotOyAqICAgICAgICAgICAgICAgICAgICBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiBUaGUgCi07ICogICAgICAgICAgICAgICAgICAgIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIHNhdHVyYXRlZCB0byB0aGUgcmFuZ2UgCi07ICogICAgICAgICAgICAgICAgICAgIFstMjA0OCwgMjA0N10uCi07ICogW2luXSAgcFByZWRCdWZSb3cgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHJvdyBidWZmZXI7IG11c3QgYmUgYWxpZ25lZAotOyAqICAgICAgICAgICAgICAgICAgICBvbiBhIDQtYnl0ZSBib3VuZGFyeS4KLTsgKiBbaW5dICBwUHJlZEJ1ZkNvbCAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcjsgbXVzdCBiZSAKLTsgKiAgICAgICAgICAgICAgICAgICAgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4KLTsgKiBbaW5dICBjdXJRUCAgICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgY3VycmVudCBibG9jay4gY3VyUVAgbWF5IAotOyAqICAgICAgICAgICAgICAgICAgICBlcXVhbCB0byBwcmVkUVAgZXNwZWNpYWxseSB3aGVuIHRoZSBjdXJyZW50IGJsb2NrIGFuZCAKLTsgKiAgICAgICAgICAgICAgICAgICAgdGhlIHByZWRpY3RvciBibG9jayBhcmUgaW4gdGhlIHNhbWUgbWFjcm9ibG9jay4KLTsgKiBbaW5dICBwcmVkUVAgICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgcHJlZGljdG9yIGJsb2NrCi07ICogW2luXSAgcHJlZERpciAgICAgIGluZGljYXRlcyB0aGUgcHJlZGljdGlvbiBkaXJlY3Rpb24gd2hpY2ggdGFrZXMgb25lCi07ICogICAgICAgICAgICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgotOyAqICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fSE9SSVpPTlRBTCAgICBwcmVkaWN0IGhvcml6b250YWxseQotOyAqICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fVkVSVElDQUwgICAgICAgIHByZWRpY3QgdmVydGljYWxseQotOyAqIFtpbl0gIEFDUHJlZEZsYWcgICBhIGZsYWcgaW5kaWNhdGluZyBpZiBBQyBwcmVkaWN0aW9uIHNob3VsZCBiZQotOyAqICAgICAgICAgICAgICAgICAgICBwZXJmb3JtZWQuIEl0IGlzIGVxdWFsIHRvIGFjX3ByZWRfZmxhZyBpbiB0aGUgYml0Ci07ICogICAgICAgICAgICAgICAgICAgIHN0cmVhbSBzeW50YXggb2YgTVBFRy00Ci07ICogW2luXSAgdmlkZW9Db21wICAgIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2UsIGNocm9taW5hbmNlIG9yCi07ICogICAgICAgICAgICAgICAgICAgIGFscGhhKSBvZiB0aGUgY3VycmVudCBibG9jawotOyAqIFtvdXRdIHBTcmNEc3QgICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgd2hpY2ggY29udGFpbnMKLTsgKiAgICAgICAgICAgICAgICAgICAgdGhlIHF1YW50aXplZCBjb2VmZmljaWVudHMgKFFGKSBvZiB0aGUgY3VycmVudAotOyAqICAgICAgICAgICAgICAgICAgICBibG9jawotOyAqIFtvdXRdIHBQcmVkQnVmUm93ICBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IHJvdyBidWZmZXIKLTsgKiBbb3V0XSBwUHJlZEJ1ZkNvbCAgcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyCi07ICogUmV0dXJuIFZhbHVlOgotOyAqIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvcgotOyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gQmFkIGFyZ3VtZW50cyAKLTsgKiAtIEF0IGxlYXN0IG9uZSBvZiB0aGUgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0RzdCwgcFByZWRCdWZSb3csIG9yIHBQcmVkQnVmQ29sLgotOyAqIC0gQXQgbGVhc3Qgb25lIHRoZSBmb2xsb3dpbmcgY2FzZXM6IGN1clFQIDw9IDAsIHByZWRRUCA8PSAwLCBjdXJRUCA+MzEsIAotOyAqICAgcHJlZFFQID4gMzEsIHByZURpciBleGNlZWRzIFsxLDJdLgotOyAqIC0gQXQgbGVhc3Qgb25lIG9mIHRoZSBwb2ludGVycyBwU3JjRHN0LCBwUHJlZEJ1ZlJvdywgb3IgcFByZWRCdWZDb2wgaXMgbm90IAotOyAqICAgNC1ieXRlIGFsaWduZWQuCi07ICoKLTsgKioqKioqKioqCi0gICAgIAotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAgIAotICAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKLSAgICAgICAKLSAgICAgICAgICAgICAKLQotICAgICAgIElNUE9SVCAgICAgICAgYXJtVkNNNFAyX1JlY2lwcm9jYWxfUVBfUzMyCi0gICAgICAgSU1QT1JUICAgICAgICBhcm1WQ000UDJfUmVjaXByb2NhbF9RUF9TMTYKLSAgICAgICBJTVBPUlQgICAgICAgIGFybVZDTTRQMl9EQ1NjYWxlcgotICAgICAgIAotICAgICAgICBJRiBDb3J0ZXhBOAotOy8vIElucHV0IEFyZ3VtZW50cwotCi1wU3JjRHN0ICAgICAgICAgIFJOIDAKLXBQcmVkQnVmUm93ICAgICAgUk4gMQotcFByZWRCdWZDb2wgICAgICBSTiAyCi1jdXJRUCAgICAgICAgICAgIFJOIDMKLVFQICAgICAgICAgICAgICAgUk4gMwotcHJlZFFQICAgICAgICAgICBSTiA0Ci1wcmVkRGlyICAgICAgICAgIFJOIDUKLUFDUHJlZEZsYWcgICAgICAgUk4gNgotdmlkZW9Db21wICAgICAgICBSTiA3Ci0KLTsvLyBMb2NhbCBWYXJpYWJsZXMKLQotc2hvcnRWaWRlb0hlYWRlciBSTiA0Ci1kY1NjYWxlciAgICAgICAgIFJOIDQKLWluZGV4ICAgICAgICAgICAgUk4gNgotcHJlZENvZWZmVGFibGUgICBSTiA3Ci10ZW1wMSAgICAgICAgICAgIFJOIDYKLXRlbXAyICAgICAgICAgICAgUk4gOQotdGVtcCAgICAgICAgICAgICBSTiAxNAotQ29uc3QgICAgICAgICAgICBSTiA4Ci10ZW1wcFByZWRDb2xCdWYgIFJOIDgKLXRlbXBQcmVkICAgICAgICAgUk4gOQotCi1hYnNDb2VmZkRDICAgICAgIFJOIDgKLW5lZ2RjU2NhbGVyICAgICAgUk4gMTAKLVJlbSAgICAgICAgICAgICAgUk4gMTEKLXRlbXAzICAgICAgICAgICAgUk4gMTIKLQotZGNSb3didWZDb2VmZiAgICBSTiAxMAotZGNDb2xCdWZmQ29lZmYgICBSTiAxMQotUmV0dXJuICAgICAgICAgICBSTiAwCi0KLTsvL05FT04gUmVnaXN0ZXJzCi0KLXFQcmVkUm93QnVmICAgICAgIFFOIFEwLlMxNgotZFByZWRSb3dCdWYwICAgICAgRE4gRDAuUzE2Ci1kUHJlZFJvd0J1ZjEgICAgICBETiBEMS5TMTYKLQotCi0KLQotcUNvZWZmVGFiICAgICAgICAgUU4gUTEuUzMyCi0KLXFQcmVkUVAgICAgICAgICAgIFFOIFEyLlMxNgotZFByZWRRUDAgICAgICAgICAgRE4gRDQuUzE2Ci1kUHJlZFFQMSAgICAgICAgICBETiBENS5TMTYKLQotCi1xdGVtcDEgICAgICAgICAgICBRTiBRMy5TMzIKLXF0ZW1wICAgICAgICAgICAgIFFOIFEzLlMxNgotCi1kdGVtcDAgICAgICAgICAgICBETiBENi5TMTYKLWR0ZW1wMSAgICAgICAgICAgIEROIEQ3LlMxNgotCi1kdGVtcDIgICAgICAgICAgICBETiBEOC5TMTYKLWR0ZW1wMyAgICAgICAgICAgIEROIEQ5LlMxNgotCi1kdGVtcDQgICAgICAgICAgICBETiBEMi5TMTYKLWR0ZW1wNSAgICAgICAgICAgIEROIEQzLlMxNgotZHRlbXA2ICAgICAgICAgICAgRE4gRDQuUzE2Ci1kdGVtcDcgICAgICAgICAgICBETiBENS5TMTYKLSAKLXF0ZW1wUHJlZDEgICAgICAgIFFOIFE1LlMzMgotcXRlbXBQcmVkICAgICAgICAgUU4gUTUuUzE2Ci0KLWR0ZW1wUHJlZDAgICAgICAgIEROIEQxMC5TMTYKLWR0ZW1wUHJlZDEgICAgICAgIEROIEQxMS5TMTYKLSAKLSAgCi0KLSAgICAgIE1fU1RBUlQgICBvbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhLHIxMSxkMTEKLQotICAgICAgOy8vIEFzc2lnbmluZyBwb2ludGVycyB0byBJbnB1dCBhcmd1bWVudHMgb24gU3RhY2sKLSAgICAKLSAgICAgIE1fQVJHICAgICAgICAgICBwcmVkUVBvblN0YWNrLDQgIAotICAgICAgTV9BUkcgICAgICAgICAgIHByZWREaXJvblN0YWNrLDQKLSAgICAgIE1fQVJHICAgICAgICAgICBBQ1ByZWRGbGFnb25TdGFjayw0Ci0gICAgICBNX0FSRyAgICAgICAgICAgdmlkZW9Db21wb25TdGFjayw0Ci0gICAgICAKLSAgICAgIDsvLyBEQyBQcmVkaWN0aW9uCi0KLSAgICAgIE1fTERSICAgICAgICAgICB2aWRlb0NvbXAsdmlkZW9Db21wb25TdGFjayAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIHZpZGVvQ29tcCBGcm9tIFN0YWNrICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAKLSAgICAgIE1fTERSICAgICAgICAgICBwcmVkRGlyLHByZWREaXJvblN0YWNrICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIFByZWRpY3Rpb24gZGlyZWN0aW9uCi0gICAgICA7Ly8gREMgU2NhbGVyIGNhbGN1bGF0aW9uICAgCi0gICAgICBMRFIgICAgICAgICAgICAgaW5kZXgsID1hcm1WQ000UDJfRENTY2FsZXIKLSAgICAgIEFERCAgICAgICAgICAgICBpbmRleCxpbmRleCx2aWRlb0NvbXAsTFNMICM1Ci0gICAgICBMRFJCICAgICAgICAgICAgZGNTY2FsZXIsW2luZGV4LFFQXQotCi0gICAgICAgCi0gICAgICBMRFIgICAgICAgICAgICAgcHJlZENvZWZmVGFibGUsID1hcm1WQ000UDJfUmVjaXByb2NhbF9RUF9TMTYgICA7Ly8gTG9hZGluZyB0aGUgdGFibGUgd2l0aCBlbnRyaWVzIDMyNzY3LygxIHRvIDYzKSAKLSAgICAgIENNUCAgICAgICAgICAgICBwcmVkRGlyLCMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDaGVjayBpZiB0aGUgUHJlZGljdGlvbiBkaXJlY3Rpb24gaXMgdmVydGljYWwKLQotICAgICAgOy8vIENhdWx1Y2F0ZSB0ZW1wUHJlZAotICAgICAgICAgICAgCi0gICAgICBMRFJFUVNIICAgICAgICAgYWJzQ29lZmZEQyxbcFByZWRCdWZSb3ddICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgdmV0aWNhbCBsb2FkIHRoZSBjb2VmZiBmcm9tIFJvdyBQcmVkaWN0aW9uIEJ1ZmZlcgotICAgICAgTERSTkVTSCAgICAgICAgIGFic0NvZWZmREMsW3BQcmVkQnVmQ29sXSAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIGhvcml6b250YWwgbG9hZCB0aGUgY29lZmYgZnJvbSBjb2x1bW4gUHJlZGljdGlvbiBCdWZmZXIKLSAgICAgIAotICAgICAgUlNCICAgICAgICAgICAgIG5lZ2RjU2NhbGVyLGRjU2NhbGVyLCMwICAgICAgICAgICAgICAgICAgICAgICAgOy8vIG5lZ2RjU2NhbGVyPS1kY1NjYWxlciAgIAotICAgICAgTU9WICAgICAgICAgICAgIHRlbXAxLGFic0NvZWZmREMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgdGhlIFByZWRpY3Rpb24gY29lZmYgdG8gdGVtcCBmb3IgY29tcGFyaXNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBDTVAgICAgICAgICAgICAgdGVtcDEsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIFJTQkxUICAgICAgICAgICBhYnNDb2VmZkRDLHRlbXAxLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBjYWxjdWxhdGUgYWJzb2x1dGUgdmFsIG9mIHByZWRpY3Rpb24gY29lZmYKLSAgICAgIAotICAgICAgQUREICAgICAgICAgICAgIHRlbXAsZGNTY2FsZXIsZGNTY2FsZXIKLSAgICAgIExEUkggICAgICAgICAgICB0ZW1wLFtwcmVkQ29lZmZUYWJsZSx0ZW1wXSAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIHZhbHVlIGZyb20gY29lZmYgdGFibGUgZm9yIHBlcmZvcm1pbmcgZGl2aXNpb24gdXNpbmcgbXVsdGlwbGljYXRpb24KLSAgICAgIFNNVUxCQiAgICAgICAgICB0ZW1wUHJlZCx0ZW1wLGFic0NvZWZmREMgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wcGVkPXBQcmVkQnVmUm93KENvbClbMF0qMzI3NjcvZGNTY2FsZXIKLSAgICAgIEFERCAgICAgICAgICAgICB0ZW1wMyxkY1NjYWxlciwjMQotICAgICAgTFNSICAgICAgICAgICAgIHRlbXBQcmVkLHRlbXBQcmVkLCMxNSAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXBwZWQ9cFByZWRCdWZSb3coQ29sKVswXS9kY1NjYWxlciAgICAgICAgICAgICAgICAgIAotICAgICAgTFNSICAgICAgICAgICAgIHRlbXAzLHRlbXAzLCMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXAzPXJvdW5kKGRjU2NhbGVyLzIpICAgICAgICAgICAKLSAgICAgIE1MQSAgICAgICAgICAgICBSZW0sbmVnZGNTY2FsZXIsdGVtcFByZWQsYWJzQ29lZmZEQyAgICAgICAgICAgIDsvLyBSZW1haW5kZXIgUmVtPWFicyhwUHJlZEJ1ZlJvdyhDb2wpWzBdKS10ZW1wUHJlZCpkY1NjYWxlcgotICAgICAgCi0gICAgICBMRFJIICAgICAgICAgICAgZGNSb3didWZDb2VmZixbcFByZWRCdWZDb2xdICAgICAgICAgICAgCi0gICAgICAKLSAgICAgIENNUCAgICAgICAgICAgICBSZW0sdGVtcDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBjb21wYXJlIFJlbSB3aXRoIChkY1NjYWxlci8yKQotICAgICAgQURER0UgICAgICAgICAgIHRlbXBQcmVkLCMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXBQcmVkPXRlbXBQcmVkKzEgaWYgUmVtPj0oZGNTY2FsZXIvMikKLSAgICAgIENNUCAgICAgICAgICAgICB0ZW1wMSwjMAotICAgICAgUlNCTFQgICAgICAgICAgIHRlbXBQcmVkLHRlbXBQcmVkLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXBQcmVkPS10ZW1wUHJlZCBpZiAKLSAgICAgICAKLSAgICAgIFNUUkggICAgICAgICAgICBkY1Jvd2J1ZkNvZWZmLFtwUHJlZEJ1ZlJvdywjLTE2XSAgICAgIAotICAgICAgIAotCi0gICAgICBMRFJIICAgICAgICAgICAgdGVtcCxbcFNyY0RzdF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcD1wU3JjRHN0WzBdCi0gICAgICBBREQgICAgICAgICAgICAgdGVtcCx0ZW1wLHRlbXBQcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcD1wU3JjRHN0WzBdK3RlbXBQcmVkCi0gICAgICBTU0FUMTYgICAgICAgICAgdGVtcCwjMTIsdGVtcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY2xpcCB0ZW1wIHRvIFstMjA0OCwyMDQ3XQotICAgICAgU01VTEJCICAgICAgICAgIGRjQ29sQnVmZkNvZWZmLHRlbXAsZGNTY2FsZXIgICAgICAgICAgICAgICAgICAgOy8vIHRlbXAxPWNsaXBwZWQocFNyY0RzdFswXSkqZGNTY2FsZXIgICAgICAgICAgIAotICAgICAgTV9MRFIgICAgICAgICAgIEFDUHJlZEZsYWcsQUNQcmVkRmxhZ29uU3RhY2sKLSAgICAgIFNUUkggICAgICAgICAgICBkY0NvbEJ1ZmZDb2VmZixbcFByZWRCdWZDb2xdICAgICAgCi0gICAgICAKLQotICAgICAgIDsvLyBBQyBQcmVkaWN0aW9uCi0gICAgICAKLSAgICAgIE1fTERSICAgICAgICAgICBwcmVkUVAscHJlZFFQb25TdGFjawotICAgICAgCi0gICAgICBDTVAgICAgICAgICAgICAgQUNQcmVkRmxhZywjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ2hlY2sgaWYgdGhlIEFDIHByZWRpY3Rpb24gZmxhZyBpcyBzZXQgb3Igbm90Ci0gICAgICBCTkUgICAgICAgICAgICAgRXhpdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgbm90IHNldCBFeGl0Ci0gICAgICBDTVAgICAgICAgICAgICAgcHJlZERpciwjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ2hlY2sgdGhlIFByZWRpY3Rpb24gZGlyZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIExEUiAgICAgICAgICAgICBwcmVkQ29lZmZUYWJsZSwgPWFybVZDTTRQMl9SZWNpcHJvY2FsX1FQX1MzMiAgIDsvLyBMb2FkaW5nIHRoZSB0YWJsZSB3aXRoIGVudHJpZXMgMHgxZmZmZi8oMSB0byA2MykgCi0gICAgICBNT1YgICAgICAgICAgICAgQ29uc3QsIzQKLSAgICAgIE1VTCAgICAgICAgICAgICBjdXJRUCxjdXJRUCxDb25zdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBjdXJRUD00KmN1clFQCi0gICAgICBWRFVQICAgICAgICAgICAgZFByZWRRUDAscHJlZFFQCi0gICAgICBMRFIgICAgICAgICAgICAgdGVtcDIsW3ByZWRDb2VmZlRhYmxlLGN1clFQXSAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcD0weDFmZmZmL2N1clFQCi0gICAgICBWRFVQICAgICAgICAgICAgcUNvZWZmVGFiLHRlbXAyCi0gICAgICBCTkUgICAgICAgICAgICAgSG9yaXpvbnRhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgdGhlIFByZWRpY3Rpb24gZGlyZWN0aW9uIGlzIGhvcml6b250YWwgYnJhbmNoIHRvIEhvcml6b250YWwKLSAgICAgIAotICAgICAKLSAgICAgIAotICAgICAgOy8vIFZlcnRpY2FsCi0gICAgICA7Ly9DYWxjdWxhdGluZyB0ZW1wUHJlZAotCi0gICAgICBWTEQxICAgICAgICAgICAge2RQcmVkUm93QnVmMCxkUHJlZFJvd0J1ZjF9LFtwUHJlZEJ1ZlJvd10gICAgICA7Ly8gTG9hZGluZyBwUHJlZEJ1ZlJvd1tpXTppPTAgdDAgNwotICAgICAgCi0gICAgICBWTVVMTCAgICAgICAgICAgcXRlbXAxLGRQcmVkUm93QnVmMCxkUHJlZFFQMCAgICAgICAgICAgICAgICAgICA7Ly9xdGVtcDFbaV09cFByZWRCdWZSb3dbaV0qZFByZWRRUFtpXTogaT0wIHQwIDMKLSAgICAgIFZNVUwgICAgICAgICAgICBxdGVtcFByZWQxLHF0ZW1wMSxxQ29lZmZUYWIgICAgICAgICAgICAgICAgICAgIDsvL3F0ZW1wUHJlZDFbaV09cFByZWRCdWZSb3dbaV0qZFByZWRRUFtpXSoweDFmZmZmL2N1clFQIDogaT0wIHQwIDMKLSAgICAgIAotICAgICAgVk1VTEwgICAgICAgICAgIHF0ZW1wMSxkUHJlZFJvd0J1ZjEsZFByZWRRUDAgICAgICAgICAgICAgICAgICAgOy8vcXRlbXAxW2ldPXBQcmVkQnVmUm93W2ldKmRQcmVkUVBbaV0gOiBpPTQgdDAgNyAgICAgIAotCi0gICAgICBWUlNIUiAgICAgICAgICAgcXRlbXBQcmVkMSxxdGVtcFByZWQxLCMxNyAgICAgICAgICAgICAgICAgICAgICA7Ly9xdGVtcFByZWQxW2ldPXJvdW5kKHBQcmVkQnVmUm93W2ldKmRQcmVkUVBbaV0vY3VyUVApIDogaT0wIHQwIDMKLSAgICAgIFZTSFJOICAgICAgICAgICBkUHJlZFFQMSxxdGVtcFByZWQxLCMwICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBuYXJyb3cgcXRlbXBQcmVkMVtpXSB0byAxNiBiaXRzCi0gICAgICAKLSAgICAgIAotICAgICAgVk1VTCAgICAgICAgICAgIHF0ZW1wUHJlZDEscXRlbXAxLHFDb2VmZlRhYiAgICAgICAgICAgICAgICAgICAgOy8vcXRlbXBQcmVkMVtpXT1wUHJlZEJ1ZlJvd1tpXSpkUHJlZFFQW2ldKjB4MWZmZmYvY3VyUVAgOiBpPTQgdDAgNwotICAgICAgVlJTSFIgICAgICAgICAgIHF0ZW1wUHJlZDEscXRlbXBQcmVkMSwjMTcgICAgICAgICAgICAgICAgICAgICAgOy8vcXRlbXBQcmVkMVtpXT1yb3VuZChwUHJlZEJ1ZlJvd1tpXSpkUHJlZFFQW2ldL2N1clFQKSAgOiBpPTQgdDAgNwotICAgICAgVkxEMSAgICAgICAgICAgIHtkdGVtcDAsZHRlbXAxfSxbcFNyY0RzdF0gICAgICAgICAgICAgICAgICAgICAgOy8vTG9hZGluZyBwU3JjRHN0W2ldIDogaT0wIHRvIDcKLSAgICAgIFZTSFJOICAgICAgICAgICBkdGVtcFByZWQxLHF0ZW1wUHJlZDEsIzAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBuYXJyb3cgcXRlbXBQcmVkMVtpXSB0byAxNiBiaXRzCi0gICAgICBWTU9WICAgICAgICAgICAgZHRlbXBQcmVkMCxkUHJlZFFQMQotICAgICAgCi0gICAgICA7Ly91cGRhdGluZyBzb3VyY2UgYW5kIHJvdyBwcmVkaWN0aW9uIGJ1ZmZlciBjb250ZW50cyAgICAgIAotICAgICAgVkFERCAgICAgICAgICAgIHF0ZW1wLHF0ZW1wLHF0ZW1wUHJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vcFNyY0RzdFtpXT1wU3JjRHN0W2ldK3F0ZW1wUHJlZFtpXTogaT0wIHRvIDcgCi0gICAgICBWUVNITCAgICAgICAgICAgcXRlbXAscXRlbXAsIzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly9DbGlwIHRvIFstMjA0OCwyMDQ3XQotICAgICAgTERSSCAgICAgICAgICAgIGRjUm93YnVmQ29lZmYsW3BQcmVkQnVmUm93XSAgICAgICAgICAgICAgICAgICAgOy8vTG9hZGluZyBEYyBWYWx1ZSBvZiBSb3cgUHJlZGljdGlvbiBidWZmZXIKLSAgICAgIFZTSFIgICAgICAgICAgICBxdGVtcCxxdGVtcCwjNAotICAgICAgCi0gICAgICBWU1QxICAgICAgICAgICAge2R0ZW1wMCxkdGVtcDF9LFtwU3JjRHN0XSAgICAgICAgICAgICAgICAgICAgICA7Ly9zdG9yaW5nIGJhY2sgdGhlIHVwZGF0ZWQgdmFsdWVzIAotICAgICAgVlNUMSAgICAgICAgICAgIHtkdGVtcDAsZHRlbXAxfSxbcFByZWRCdWZSb3ddICAgICAgICAgICAgICAgICAgOy8vc3RvcmluZyBiYWNrIHRoZSB1cGRhdGVkIHJvdyBwcmVkaWN0aW9uIHZhbHVlcyAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIFNUUkggICAgICAgICAgICBkY1Jvd2J1ZkNvZWZmLFtwUHJlZEJ1ZlJvd10gICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yaW5nIHRoZSB1cGRhdGVkIERDIFJvdyBQcmVkaWN0aW9uIGNvZWZmCi0gICAgICAKLSAgICAgIEIgICAgICAgICAgICAgICBFeGl0Ci0KLUhvcml6b250YWwKLQotICAgICAgOy8vIENhbGN1bGF0aW5nIFRlbXBwcmVkCi0KLSAgICAgICAgICAgIAotCi0gICAgICBWTEQxICAgICAgICAgICAge2RQcmVkUm93QnVmMCxkUHJlZFJvd0J1ZjF9LFtwUHJlZEJ1ZkNvbF0gICAgICA7Ly8gTG9hZGluZyBwUHJlZEJ1ZkNvbFtpXTppPTAgdDAgNwotICAgICAgVk1VTEwgICAgICAgICAgIHF0ZW1wMSxkUHJlZFJvd0J1ZjAsZFByZWRRUDAgICAgICAgICAgICAgICAgICAgOy8vcXRlbXAxW2ldPXBQcmVkQnVmQ29sW2ldKmRQcmVkUVBbaV06IGk9MCB0MCAzCi0gICAgICBWTVVMICAgICAgICAgICAgcXRlbXBQcmVkMSxxdGVtcDEscUNvZWZmVGFiICAgICAgICAgICAgICAgICAgICA7Ly9xdGVtcFByZWQxW2ldPXBQcmVkQnVmQ29sW2ldKmRQcmVkUVBbaV0qMHgxZmZmZi9jdXJRUCA6IGk9MCB0MCAzCi0gICAgICAKLSAgICAgIFZNVUxMICAgICAgICAgICBxdGVtcDEsZFByZWRSb3dCdWYxLGRQcmVkUVAwICAgICAgICAgICAgICAgICAgIDsvL3F0ZW1wMVtpXT1wUHJlZEJ1ZkNvbFtpXSpkUHJlZFFQW2ldIDogaT00IHQwIDcgICAgICAKLQotICAgICAgVlJTSFIgICAgICAgICAgIHF0ZW1wUHJlZDEscXRlbXBQcmVkMSwjMTcgICAgICAgICAgICAgICAgICAgICAgOy8vcXRlbXBQcmVkMVtpXT1yb3VuZChwUHJlZEJ1ZkNvbFtpXSpkUHJlZFFQW2ldL2N1clFQKSA6IGk9MCB0MCAzCi0gICAgICBWU0hSTiAgICAgICAgICAgZFByZWRRUDEscXRlbXBQcmVkMSwjMCAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gbmFycm93IHF0ZW1wUHJlZDFbaV0gdG8gMTYgYml0cwotICAgICAgCi0gICAgICAKLSAgICAgIFZNVUwgICAgICAgICAgICBxdGVtcFByZWQxLHF0ZW1wMSxxQ29lZmZUYWIgICAgICAgICAgICAgICAgICAgIDsvL3F0ZW1wUHJlZDFbaV09cFByZWRCdWZDb2xbaV0qZFByZWRRUFtpXSoweDFmZmZmL2N1clFQIDogaT00IHQwIDcKLSAgICAgIAotICAgICAgTU9WICAgICAgICAgICAgIHRlbXBwUHJlZENvbEJ1ZixwUHJlZEJ1ZkNvbAotICAgICAgVlJTSFIgICAgICAgICAgIHF0ZW1wUHJlZDEscXRlbXBQcmVkMSwjMTcgICAgICAgICAgICAgICAgICAgICAgOy8vcXRlbXBQcmVkMVtpXT1yb3VuZChwUHJlZEJ1ZkNvbFtpXSpkUHJlZFFQW2ldL2N1clFQKSAgOiBpPTQgdDAgNwotICAgICAgVkxENCAgICAgICAgICAgIHtkdGVtcDAsZHRlbXAxLGR0ZW1wMixkdGVtcDN9LFtwU3JjRHN0XSAgICAgICAgOy8vIExvYWRpbmcgY29lZmZpY2llbnRzIEludGVybGVhdmluZyBieSA0Ci0gICAgICBWU0hSTiAgICAgICAgICAgZHRlbXBQcmVkMSxxdGVtcFByZWQxLCMwICAgICAgICAgICAgICAgICAgICAgICA7Ly8gbmFycm93IHF0ZW1wUHJlZDFbaV0gdG8gMTYgYml0cwotICAgICAgVk1PViAgICAgICAgICAgIGR0ZW1wUHJlZDAsZFByZWRRUDEKLSAgICAgIAotICAgICAgOy8vIFVwZGF0aW5nIHNvdXJjZSBhbmQgY29sdW1uIHByZWRpY3Rpb24gYnVmZmVyIGNvbnRlbnRzICAgICAKLSAgICAgIEFERCAgICAgICAgICAgICB0ZW1wMixwU3JjRHN0LCMzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIFZMRDQgICAgICAgICAgICB7ZHRlbXA0LGR0ZW1wNSxkdGVtcDYsZHRlbXA3fSxbdGVtcDJdICAgICAgICAgIDsvLyBMb2FkaW5nIG5leHQgMTYgY29lZmZpY2llbnRzIEludGVybGVhdmluZyBieSA0Ci0gICAgICBWVVpQICAgICAgICAgICAgZHRlbXAwLGR0ZW1wNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSW50ZXJsZWF2aW5nIGJ5IDgKLSAgICAgIFZBREQgICAgICAgICAgICBkdGVtcDAsZHRlbXAwLGR0ZW1wUHJlZDAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBBZGRpbmcgdGVtcFByZWQgdG8gY29lZmZzCi0gICAgICBWUVNITCAgICAgICAgICAgZHRlbXAwLGR0ZW1wMCwjNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ2xpcCB0byBbLTIwNDgsMjA0N10KLSAgICAgIFZTSFIgICAgICAgICAgICBkdGVtcDAsZHRlbXAwLCM0Ci0gICAgICBWU1QxICAgICAgICAgICAge2R0ZW1wMH0sW3BQcmVkQnVmQ29sXSEgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVXBkYXRpbmcgUHJpZGljdGlvbiBjb2x1bW4gYnVmZmVyCi0gICAgICBWWklQICAgICAgICAgICAgZHRlbXAwLGR0ZW1wNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gZGVpbnRlcmxlYXZpbmcKLSAgICAgIFZTVDQgICAgICAgICAgICB7ZHRlbXAwLGR0ZW1wMSxkdGVtcDIsZHRlbXAzfSxbcFNyY0RzdF0gICAgICAgIDsvLyBVcGRhdGluZyBzb3VyY2UgY29lZmZzICAgICAgICAgCi0gICAgICBWU1Q0ICAgICAgICAgICAge2R0ZW1wNCxkdGVtcDUsZHRlbXA2LGR0ZW1wN30sW3RlbXAyXSEKLSAgICAgIAotICAgICAgTU9WICAgICAgICAgICAgIHRlbXAxLHRlbXAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgVkxENCAgICAgICAgICAgIHtkdGVtcDAsZHRlbXAxLGR0ZW1wMixkdGVtcDN9LFt0ZW1wMl0hICAgICAgICAgOy8vIExvYWRpbmcgIGNvZWZmaWNpZW50cyBJbnRlcmxlYXZpbmcgYnkgNAotICAgICAgCi0gICAgICBWTEQ0ICAgICAgICAgICAge2R0ZW1wNCxkdGVtcDUsZHRlbXA2LGR0ZW1wN30sW3RlbXAyXQotICAgICAgVlVaUCAgICAgICAgICAgIGR0ZW1wMCxkdGVtcDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEludGVybGVhdmluZyBieSA4Ci0gICAgICBWQUREICAgICAgICAgICAgZHRlbXAwLGR0ZW1wMCxkdGVtcFByZWQxCi0gICAgICBWUVNITCAgICAgICAgICAgZHRlbXAwLGR0ZW1wMCwjNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ2xpcCB0byBbLTIwNDgsMjA0N10KLSAgICAgIFZTSFIgICAgICAgICAgICBkdGVtcDAsZHRlbXAwLCM0Ci0gICAgICBWU1QxICAgICAgICAgICAge2R0ZW1wMH0sW3BQcmVkQnVmQ29sXSEKLSAgICAgIFZaSVAgICAgICAgICAgICBkdGVtcDAsZHRlbXA0Ci0gICAgICBWU1Q0ICAgICAgICAgICAge2R0ZW1wMCxkdGVtcDEsZHRlbXAyLGR0ZW1wM30sW3RlbXAxXQotICAgICAgU1RSSCAgICAgICAgICAgIGRjQ29sQnVmZkNvZWZmLFt0ZW1wcFByZWRDb2xCdWZdIAotICAgICAgVlNUNCAgICAgICAgICAgIHtkdGVtcDQsZHRlbXA1LGR0ZW1wNixkdGVtcDd9LFt0ZW1wMl0KLSAgICAgIAotRXhpdAotCi0gICAgICBTVFJIICAgICAgICAgICAgdGVtcCxbcFNyY0RzdF0KLSAgICAgICAgICAKLSAKLSAgICAgIE1PViAgICAgICAgICAgICBSZXR1cm4sI09NWF9TdHNfTm9FcnIgCi0gCi0gICAgICBNX0VORAotICAgICAgRU5ESUYKLQotCi0gICAgICAgRU5ECi0KLQotICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50ZXJfSV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50ZXJfSV9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NDU3MWYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludGVyX0lfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07LyoqCi07ICogCi07ICogRmlsZSBOYW1lOiAgb214VkNNNFAyX1F1YW50SW52SW50ZXJfSV9zLnMKLTsgKiBPcGVuTUFYIERMOiB2MS4wLjIKLTsgKiBSZXZpc2lvbjogICAxMjI5MAotOyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOyAqIAotOyAqIAotOyAqIAotOyAqCi07ICogRGVzY3JpcHRpb246IAotOyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIGludGVyIHJlY29uc3RydWN0aW9uCi07ICogCi07ICoKLTsgKgotOyAqCi07ICoKLTsgKiBGdW5jdGlvbjogb214VkNNNFAyX1F1YW50SW52SW50ZXJfSQotOyAqCi07ICogRGVzY3JpcHRpb246Ci07ICogUGVyZm9ybXMgaW52ZXJzZSBxdWFudGl6YXRpb24gb24gaW50cmEvaW50ZXIgY29kZWQgYmxvY2suCi07ICogVGhpcyBmdW5jdGlvbiBzdXBwb3J0cyBiaXRzX3Blcl9waXhlbCA9IDguIE1pc21hdGNoIGNvbnRyb2wKLTsgKiBpcyBwZXJmb3JtZWQgZm9yIHRoZSBmaXJzdCBNUEVHLTQgbW9kZSBpbnZlcnNlIHF1YW50aXphdGlvbiBtZXRob2QuCi07ICogVGhlIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIGNsaXBwZWQgdG8gdGhlIHJhbmdlOiBbLTIwNDgsIDIwNDddLgotOyAqIE1pc21hdGNoIGNvbnRyb2wgaXMgcGVyZm9ybWVkIGZvciB0aGUgZmlyc3QgaW52ZXJzZSBxdWFudGl6YXRpb24gbWV0aG9kLgotOyAqCi07ICogUmVtYXJrczoKLTsgKgotOyAqIFBhcmFtZXRlcnM6Ci07ICogW2luXSBwU3JjRHN0ICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGlucHV0IChxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrLiBNdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4KLTsgKiBbaW5dIFFQICAgICAgICAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIChxdWFudGlzZXJfc2NhbGUpCi07ICogW2luXSB2aWRlb0NvbXAgICAgICAoSW50cmEgdmVyc2lvbiBvbmx5LikgVmlkZW8gY29tcG9uZW50IHR5cGUgb2YgdGhlCi07ICogICAgICAgICAgICAgICAgICBjdXJyZW50IGJsb2NrLiBUYWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyBmbGFnczoKLTsgKiAgICAgICAgICAgICAgICAgIE9NWF9WQ19MVU1JTkFOQ0UsIE9NWF9WQ19DSFJPTUlOQU5DRSwKLTsgKiAgICAgICAgICAgICAgICAgIE9NWF9WQ19BTFBIQS4KLTsgKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgYSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOwotOyAqICAgICAgICAgICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIG1vZGUsCi07ICogICAgICAgICAgICAgICAgICBhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbmxpbmVhciBpbnRyYSBEQyBtb2RlLgotOyAqIFtvdXRdICAgIHBTcmNEc3QgICAgICBwb2ludGVyIHRvIHRoZSBvdXRwdXQgKGRlcXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jay4gIE11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLgotOyAqCi07ICogUmV0dXJuIFZhbHVlOgotOyAqIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvcgotOyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cwotOyAqICAgIC0gSWYgcFNyY0RzdCBpcyBOVUxMIG9yIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuCi07ICogICAgICBvcgotOyAqICAgIC0gSWYgUVAgPD0gMC4KLTsgKiAgICAgIG9yCi07ICogICAgLSB2aWRlb0NvbXAgaXMgbm9uZSBvZiBPTVhfVkNfTFVNSU5BTkNFLCBPTVhfVkNfQ0hST01JTkFOQ0UgYW5kIE9NWF9WQ19BTFBIQS4KLTsgKgotOyAqLwotCi0gICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgSU5DTFVERSBhcm1DT01NX3MuaAotCi0gICBNX1ZBUklBTlRTIENvcnRleEE4Ci0KLSAgICAgSUYgQ29ydGV4QTgKLSAgICAgCi0gICAgIAotOy8vSW5wdXQgQXJndW1lbnRzCi1wU3JjRHN0ICAgICAgICAgICAgUk4gMAotUVAgICAgICAgICAgICAgICAgIFJOIDEKLSAgICAgCi0KLTsvL0xvY2FsIFZhcmlhYmxlcwotQ291bnQgICAgICAgICAgICAgIFJOIDMKLWRvdWJsZVFQICAgICAgICAgICBSTiA0Ci1SZXR1cm4gICAgICAgICAgICAgUk4gMAotOy8vIE5lb24gcmVnaXN0ZXJzCi0KLQotZFFQMTAgICAgICAgICAgICAgIEROIEQwLlMzMlswXQotcVFQMSAgICAgICAgICAgICAgIFFOIFEwLlMzMgotCi1kUVAxICAgICAgICAgICAgICAgRE4gRDAuUzE2Ci1kTWludXNRUDEgICAgICAgICAgRE4gRDEuUzE2Ci0KLWRDb2VmZjAgICAgICAgICAgICBETiBEMi5TMTYKLWRDb2VmZjEgICAgICAgICAgICBETiBEMy5TMTYgICAKLQotcVJlc3VsdDAgICAgICAgICAgIFFOIFEzLlMzMgotZFJlc3VsdDAgICAgICAgICAgIEROIEQ3LlMxNgotcVNpZ24wICAgICAgICAgICAgIFFOIFEzLlMzMgotZFNpZ24wICAgICAgICAgICAgIEROIEQ2LlMxNgotCi1xUmVzdWx0MSAgICAgICAgICAgUU4gUTQuUzMyCi1kUmVzdWx0MSAgICAgICAgICAgRE4gRDguUzE2Ci1xU2lnbjEgICAgICAgICAgICAgUU4gUTQuUzMyCi1kU2lnbjEgICAgICAgICAgICAgRE4gRDguUzE2Ci0KLWQyUVAwICAgICAgICAgICAgICBETiBEMTAuUzMyWzBdCi1xMlFQMCAgICAgICAgICAgICAgUU4gUTUuUzMyCi1kMlFQICAgICAgICAgICAgICAgRE4gRDEwLlMxNgotCi1kWmVybzAgICAgICAgICAgICAgRE4gRDExLlMxNgotZFplcm8xICAgICAgICAgICAgIEROIEQxMi5TMTYKLWRDb25zdDAgICAgICAgICAgICBETiBEMTMuUzE2Ci0KLSAgICAKLSAgICAgTV9TVEFSVCBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JLHI0LGQxMwotICAgICAKLSAgICAgICAgIAotICAgICAgICAgCi0gICAgICAgICBBREQgICAgICBkb3VibGVRUCxRUCxRUCAgICAgICAgICAgICAgICAgICA7Ly8gZG91YmxlUVA9IDIqUVAKLSAgICAgICAgIFZNT1YgICAgIGQyUVAwLGRvdWJsZVFQCi0gICAgICAgICBWRFVQICAgICBxMlFQMCxkMlFQMCAgICAgICAgICAgICAgICAgICAgICA7Ly8gTW92ZSBkb3VibGVRUCBpbiB0byBhIHNjYWxhcgotICAgICAgICAgVFNUICAgICAgUVAsIzEgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICBWTEQxICAgICB7ZENvZWZmMCxkQ29lZmYxfSxbcFNyY0RzdF0gICAgICA7Ly8gTG9hZCBmaXJzdCA4IHZhbHVlcyB0byBDb2VmZjAsQ29lZmYxCi0gICAgICAgICBTVUJFUSAgICBRUCxRUCwjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgIFZNT1YgICAgIGRRUDEwLFFQICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBRUCBpcyBldmVuIHRoZW4gUVAxPVFQLTEgZWxzZSBRUDE9UVAgICAgIAotICAgICAgICAgTU9WICAgICAgQ291bnQsIzY0Ci0gICAgICAgICBWRFVQICAgICBxUVAxLGRRUDEwICAgICAgICAgICAgICAgICAgICAgICA7Ly8gRHVwbGljYXRlIHRlbXBSZXN1bHQgd2l0aCBRUDEKLSAgICAgICAgIFZTSFJOICAgIGQyUVAscTJRUDAsIzAKLSAgICAgICAgIFZFT1IgICAgIGRDb25zdDAsZENvbnN0MCxkQ29uc3QwCi0gICAgICAgICBWU0hSTiAgICBkUVAxLHFRUDEsIzAgICAgICAgICAgICAgICAgICAgICA7Ly8gUVAxIHRydW5jYXRlZCB0byAxNiBiaXRzCi0gICAgICAgICBWU1VCICAgICBkTWludXNRUDEsZENvbnN0MCxkUVAxICAgICAgICAgICA7Ly8gZE1pbnVzUVAxPS1RUDEKLQotTG9vcCAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAKLSAgICAgICAgOy8vUGVyZm9ybWluZyBJbnZlcnNlIFF1YW50aXphdGlvbgotICAgICAgICAgCi0gICAgICAgICBWQ0xUICAgICBkU2lnbjAsZENvZWZmMCwgIzAgICAgICAgICAgICAgICA7Ly8gQ29tcGFyZSBDb2VmZmljaWVudCAwIGFnYWluc3QgMAotICAgICAgICAgVkNMVCAgICAgZFNpZ24xLGRDb2VmZjEsICMwICAgICAgICAgICAgICAgOy8vIENvbXBhcmUgQ29lZmZpY2llbnQgMSBhZ2FpbnN0IDAKLSAgICAgICAgIFZDRVEgICAgIGRaZXJvMCxkQ29lZmYwLCMwICAgICAgICAgICAgICAgIDsvLyBDb21wYXJlIENvZWZmaWNpZW50IDAgYWdhaW5zdCB6ZXJvCi0gICAgICAgICBWQlNMICAgICBkU2lnbjAsZE1pbnVzUVAxLGRRUDEgICAgICAgICAgICA7Ly8gZFNpZ24wID0gLVFQMSBpZiBDb2VmZjA8IDAgZWxzZSBRUDEKLSAgICAgICAgIFZDRVEgICAgIGRaZXJvMSxkQ29lZmYxLCMwICAgICAgICAgICAgICAgIDsvLyBDb21wYXJlIENvZWZmaWNpZW50IDEgYWdhaW5zdCB6ZXJvCi0gICAgICAgICBWQlNMICAgICBkU2lnbjEsZE1pbnVzUVAxLGRRUDEgICAgICAgICAgICA7Ly8gZFNpZ24xID0gLVFQMSBpZiBDb2VmZjE8IDAgZWxzZSBRUDEKLSAgICAgICAgIFZNT1ZMICAgIHFTaWduMCxkU2lnbjAgICAgICAgICAgICAgICAgICAgIDsvLyBTaWduIGV4dGVuZCBxU2lnbjAgdG8gMzIgYml0cwotICAgICAgICAgVk1PVkwgICAgcVNpZ24xLGRTaWduMQotICAgICAgICAgVk1MQUwgICAgcVJlc3VsdDAsZENvZWZmMCxkMlFQICAgICAgICAgICAgOy8vIHFSZXN1bHQwW2ldPSBxQ29lZmYwW2ldK3FDb2VmZjBbaV0qKC0yKSBpZiBDb2VmZiA8MCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBxUmVzdWx0MFtpXT0gcUNvZWZmMFtpXSAgICAgICAgICAgICAgICAgaWYgQ29lZmYgPj0wIAotICAgICAgICAgVk1MQUwgICAgcVJlc3VsdDEsZENvZWZmMSxkMlFQICAgICAgICAgICAgOy8vIHFSZXN1bHQxW2ldPSBxQ29lZmYxW2ldK3FDb2VmZjFbaV0qKC0yKSBpZiBDb2VmZiA8MCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBxUmVzdWx0MVtpXT0gcUNvZWZmMVtpXSAgICAgICAgICAgICAgICAgaWYgQ29lZmYgPj0wIAotICAgICAgICAgOy8vIENsaXAgUmVzdWx0IHRvIFstMjA0OCwyMDQ3XSAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgCi0gICAgICAgICBWUVNITCAgICBxUmVzdWx0MCxxUmVzdWx0MCwjMjAgICAgICAgICAgICA7Ly8gY2xpcCB0byBbLTIwNDgsMjA0N10KLSAgICAgICAgIFZRU0hMICAgIHFSZXN1bHQxLHFSZXN1bHQxLCMyMAotICAgICAgICAgICAgICAgICAKLSAgICAgICAgIFZTSFIgICAgIHFSZXN1bHQwLHFSZXN1bHQwLCM0ICAKLSAgICAgICAgIFZTSFIgICAgIHFSZXN1bHQxLHFSZXN1bHQxLCM0Ci0gICAgICAgICBWU0hSTiAgICBkUmVzdWx0MCxxUmVzdWx0MCwjMTYgICAgICAgICAgICA7Ly8gTmFycm93IHRoZSBjbGlwcGVkIFZhbHVlIHRvIEhhbGZ3b3JkCi0gICAgICAgICBWU0hSTiAgICBkUmVzdWx0MSxxUmVzdWx0MSwjMTYgCi0gICAgICAgICBWQklUICAgICBkUmVzdWx0MCxkQ29uc3QwLGRaZXJvMCAgCi0gICAgICAgICBWQklUICAgICBkUmVzdWx0MSxkQ29uc3QwLGRaZXJvMSAgICAgCi0gICAgICAgICAKLSAgICAgICAgIFZTVDEgICAgIHtkUmVzdWx0MCxkUmVzdWx0MX0sW3BTcmNEc3RdISAgIDsvLyBTdG9yZSB0aGUgcmVzdWx0Ci0gICAgICAgICBTVUJTICAgICBDb3VudCxDb3VudCwjOAotICAgICAgICAgVkxEMSAgICAge2RDb2VmZjAsZENvZWZmMX0sW3BTcmNEc3RdCi0gICAgICAgICAKLSAgICAgICAgIAotICAgICAgICAgQkdUICAgICAgTG9vcAotCi0gICAgICAgICBNT1YgICAgICBSZXR1cm4sI09NWF9TdHNfTm9FcnIKLQotCi0gICAgICAgICBNX0VORAotICAgICAgICAgRU5ESUYKLSAgICAgICAgIAotCi0gICAgICAgIEVORAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50cmFfSV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50cmFfSV9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxYTdmZDQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludHJhX0lfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjI0ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07LyoqCi07ICogCi07ICogRmlsZSBOYW1lOiAgb214VkNNNFAyX1F1YW50SW52SW50cmFfSV9zLnMKLTsgKiBPcGVuTUFYIERMOiB2MS4wLjIKLTsgKiBSZXZpc2lvbjogICAxMjI5MAotOyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOyAqIAotOyAqIAotOyAqIAotOyAqCi07ICogRGVzY3JpcHRpb246IAotOyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIGludGVyIHJlY29uc3RydWN0aW9uCi07ICogCi07ICoKLTsgKgotOyAqCi07ICoKLTsgKiAKLTsgKiBGdW5jdGlvbjogb214VkNNNFAyX1F1YW50SW52SW50cmFfSQotOyAqCi07ICogRGVzY3JpcHRpb246Ci07ICogUGVyZm9ybXMgaW52ZXJzZSBxdWFudGl6YXRpb24gb24gaW50cmEvaW50ZXIgY29kZWQgYmxvY2suCi07ICogVGhpcyBmdW5jdGlvbiBzdXBwb3J0cyBiaXRzX3Blcl9waXhlbCA9IDguIE1pc21hdGNoIGNvbnRyb2wKLTsgKiBpcyBwZXJmb3JtZWQgZm9yIHRoZSBmaXJzdCBNUEVHLTQgbW9kZSBpbnZlcnNlIHF1YW50aXphdGlvbiBtZXRob2QuCi07ICogVGhlIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIGNsaXBwZWQgdG8gdGhlIHJhbmdlOiBbLTIwNDgsIDIwNDddLgotOyAqIE1pc21hdGNoIGNvbnRyb2wgaXMgcGVyZm9ybWVkIGZvciB0aGUgZmlyc3QgaW52ZXJzZSBxdWFudGl6YXRpb24gbWV0aG9kLgotOyAqCi07ICogUmVtYXJrczoKLTsgKgotOyAqIFBhcmFtZXRlcnM6Ci07ICogW2luXSAgICBwU3JjRHN0ICAgICAgICBwb2ludGVyIHRvIHRoZSBpbnB1dCAocXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jay4gTXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuCi07ICogW2luXSAgICBRUCAgICAgICAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKHF1YW50aXNlcl9zY2FsZSkKLTsgKiBbaW5dICAgIHZpZGVvQ29tcCAgICAgICAgICAoSW50cmEgdmVyc2lvbiBvbmx5LikgVmlkZW8gY29tcG9uZW50IHR5cGUgb2YgdGhlCi07ICogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYmxvY2suIFRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIGZsYWdzOgotOyAqICAgICAgICAgICAgICAgICAgICBPTVhfVkNfTFVNSU5BTkNFLCBPTVhfVkNfQ0hST01JTkFOQ0UsCi07ICogICAgICAgICAgICAgICAgICAgIE9NWF9WQ19BTFBIQS4KLTsgKiBbaW5dICAgIHNob3J0VmlkZW9IZWFkZXIgIGEgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsKLTsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgbW9kZSwKLTsgKiAgICAgICAgICAgICAgICAgICAgYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub25saW5lYXIgaW50cmEgREMgbW9kZS4KLTsgKiBbb3V0XSAgICBwU3JjRHN0ICAgICAgICBwb2ludGVyIHRvIHRoZSBvdXRwdXQgKGRlcXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jay4gIE11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLgotOyAqCi07ICogUmV0dXJuIFZhbHVlOgotOyAqIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvcgotOyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cwotOyAqICAgIC0gICAgSWYgcFNyY0RzdCBpcyBOVUxMIG9yIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuCi07ICogICAgICBvcgotOyAqICAgIC0gSWYgUVAgPD0gMC4KLTsgKiAgICAgIG9yCi07ICogICAgLSB2aWRlb0NvbXAgaXMgbm9uZSBvZiBPTVhfVkNfTFVNSU5BTkNFLCBPTVhfVkNfQ0hST01JTkFOQ0UgYW5kIE9NWF9WQ19BTFBIQS4KLTsgKgotIAotCi0gICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgCi0gICBNX1ZBUklBTlRTIENvcnRleEE4Ci0gICAKLSAgIAotICAgSU1QT1JUICAgICAgICBhcm1WQ000UDJfRENTY2FsZXIKLSAKLSAgICAgSUYgQ29ydGV4QTgKLSAgICAgCi0gICAgIAotOy8vSW5wdXQgQXJndW1lbnRzCi1wU3JjRHN0ICAgICAgICAgICAgUk4gMAotUVAgICAgICAgICAgICAgICAgIFJOIDEKLXZpZGVvQ29tcCAgICAgICAgICBSTiAyCi1zaG9ydFZpZGVvSGVhZGVyICAgUk4gMwotICAgICAKLQotOy8vTG9jYWwgVmFyaWFibGVzCi0KLWRjU2NhbGVyICAgICAgICAgICBSTiA0Ci10ZW1wICAgICAgICAgICAgICAgUk4gMTQKLWluZGV4ICAgICAgICAgICAgICBSTiA1Ci0KLQotQ291bnQgICAgICAgICAgICAgIFJOIDUKLWRvdWJsZVFQICAgICAgICAgICBSTiA0Ci1SZXR1cm4gICAgICAgICAgICAgUk4gMAotCi0KLTsvLyBOZW9uIHJlZ2lzdGVycwotCi0KLWRRUDEwICAgICAgICAgICAgICBETiBEMC5TMzJbMF0KLXFRUDEgICAgICAgICAgICAgICBRTiBRMC5TMzIKLQotZFFQMSAgICAgICAgICAgICAgIEROIEQwLlMxNgotZE1pbnVzUVAxICAgICAgICAgIEROIEQxLlMxNgotCi1kQ29lZmYwICAgICAgICAgICAgRE4gRDIuUzE2Ci1kQ29lZmYxICAgICAgICAgICAgRE4gRDMuUzE2ICAgCi0KLXFSZXN1bHQwICAgICAgICAgICBRTiBRMy5TMzIKLWRSZXN1bHQwICAgICAgICAgICBETiBENy5TMTYKLXFTaWduMCAgICAgICAgICAgICBRTiBRMy5TMzIKLWRTaWduMCAgICAgICAgICAgICBETiBENi5TMTYKLQotcVJlc3VsdDEgICAgICAgICAgIFFOIFE0LlMzMgotZFJlc3VsdDEgICAgICAgICAgIEROIEQ4LlMxNgotcVNpZ24xICAgICAgICAgICAgIFFOIFE0LlMzMgotZFNpZ24xICAgICAgICAgICAgIEROIEQ4LlMxNgotCi1kMlFQMCAgICAgICAgICAgICAgRE4gRDEwLlMzMlswXQotcTJRUDAgICAgICAgICAgICAgIFFOIFE1LlMzMgotZDJRUCAgICAgICAgICAgICAgIEROIEQxMC5TMTYKLQotZFplcm8wICAgICAgICAgICAgIEROIEQxMS5TMTYKLWRaZXJvMSAgICAgICAgICAgICBETiBENC5TMTYKLWRDb25zdDAgICAgICAgICAgICBETiBENS5TMTYKLQotCi0KLQotICAgICAKLSAgICAgCi0gICAgIE1fU1RBUlQgb214VkNNNFAyX1F1YW50SW52SW50cmFfSSxyNSxkMTEKLQotCi0gICAgICAgIDsvLyBQZXJmb3JtIEludmVyc2UgUXVhbnRpemF0aW9uIGZvciBEQyBjb2VmZmljaWVudAotCi0gICAgICAgIFRFUSAgICAgICBzaG9ydFZpZGVvSGVhZGVyLCMwICAgICAgOy8vIFRlc3QgaWYgc2hvcnQgVmlkZW8gSGVhZGVyIGZsYWcgPTAgICAgICAgICAgICAgCi0gICAgICAgIE1PVk5FICAgICBkY1NjYWxlciwjOCAgICAgICAgICAgICAgOy8vIGlmIHNob3J0VmlkZW9IZWFkZXIgaXMgbm9uIHplcm8gZGNTY2FsZXI9OAotICAgICAgICBCTkUgICAgICAgY2FsRENWYWwKLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgICBpbmRleCwgPWFybVZDTTRQMl9EQ1NjYWxlcgotICAgICAgQUREICAgICAgIGluZGV4LGluZGV4LHZpZGVvQ29tcCxMU0wgIzUKLSAgICAgIExEUkIgICAgICBkY1NjYWxlcixbaW5kZXgsUVBdCi0KLSAgICAgICAgOy8vTV9DYWxEQ1NjYWxhciAgc2hvcnRWaWRlb0hlYWRlcix2aWRlb0NvbXAsIFFQCi0KLWNhbERDVmFsCi0KLSAgICAgICAgTERSSCAgICAgdGVtcCxbcFNyY0RzdF0KLSAgICAgICAgU01VTEJCICAgdGVtcCx0ZW1wLGRjU2NhbGVyICAgICAgIDsvLyBkY0NvZWZmID0gZGNTY2FsZXIgKiBRdWFudGl6ZWQgREMgY29lZmZpY2llbnQoZnJvbSBtZW1vcnkpCi0gICAgICAgIFNTQVQgICAgIHRlbXAsIzEyLHRlbXAgICAgICAgICAgICA7Ly8gU2F0dXJhdGluZyB0byAxMiBiaXRzCi0gICAgICAKLQotCi0gICAgICAgIDsvLyBQZXJmb3JtIEludmVyc2UgUXVhbnRpemF0aW9uIGZvciBBYyBDb2VmZmljaWVudHMKLSAgICAgCi0gICAgICAgICAKLSAgICAgICAgIAotICAgICAgICAgQUREICAgICAgZG91YmxlUVAsUVAsUVAgICAgICAgICAgICAgICAgICAgOy8vIGRvdWJsZVFQPSAyKlFQCi0gICAgICAgICBWTU9WICAgICBkMlFQMCxkb3VibGVRUAotICAgICAgICAgVkRVUCAgICAgcTJRUDAsZDJRUDAgICAgICAgICAgICAgICAgICAgICAgOy8vIE1vdmUgZG91YmxlUVAgaW4gdG8gYSBzY2FsYXIKLSAgICAgICAgIFRTVCAgICAgIFFQLCMxICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgVkxEMSAgICAge2RDb2VmZjAsZENvZWZmMX0sW3BTcmNEc3RdICAgICAgOy8vIExvYWQgZmlyc3QgOCB2YWx1ZXMgdG8gQ29lZmYwLENvZWZmMQotICAgICAgICAgU1VCRVEgICAgUVAsUVAsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICBWTU9WICAgICBkUVAxMCxRUCAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgUVAgaXMgZXZlbiB0aGVuIFFQMT1RUC0xIGVsc2UgUVAxPVFQICAgICAKLSAgICAgICAgIE1PViAgICAgIENvdW50LCM2NAotICAgICAgICAgVkRVUCAgICAgcVFQMSxkUVAxMCAgICAgICAgICAgICAgICAgICAgICAgOy8vIER1cGxpY2F0ZSB0ZW1wUmVzdWx0IHdpdGggUVAxCi0gICAgICAgICBWU0hSTiAgICBkMlFQLHEyUVAwLCMwCi0gICAgICAgICBWRU9SICAgICBkQ29uc3QwLGRDb25zdDAsZENvbnN0MAotICAgICAgICAgVlNIUk4gICAgZFFQMSxxUVAxLCMwICAgICAgICAgICAgICAgICAgICAgOy8vIFFQMSB0cnVuY2F0ZWQgdG8gMTYgYml0cwotICAgICAgICAgVlNVQiAgICAgZE1pbnVzUVAxLGRDb25zdDAsZFFQMSAgICAgICAgICAgOy8vIGRNaW51c1FQMT0tUVAxCi0KLUxvb3AgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgCi0gICAgICAgIDsvL1BlcmZvcm1pbmcgSW52ZXJzZSBRdWFudGl6YXRpb24KLSAgICAgICAgIAotICAgICAgICAgVkNMVCAgICAgZFNpZ24wLGRDb2VmZjAsICMwICAgICAgICAgICAgICAgOy8vIENvbXBhcmUgQ29lZmZpY2llbnQgMCBhZ2FpbnN0IDAKLSAgICAgICAgIFZDTFQgICAgIGRTaWduMSxkQ29lZmYxLCAjMCAgICAgICAgICAgICAgIDsvLyBDb21wYXJlIENvZWZmaWNpZW50IDEgYWdhaW5zdCAwCi0gICAgICAgICBWQ0VRICAgICBkWmVybzAsZENvZWZmMCwjMCAgICAgICAgICAgICAgICA7Ly8gQ29tcGFyZSBDb2VmZmljaWVudCAwIGFnYWluc3QgemVybwotICAgICAgICAgVkJTTCAgICAgZFNpZ24wLGRNaW51c1FQMSxkUVAxICAgICAgICAgICAgOy8vIGRTaWduMCA9IC1RUDEgaWYgQ29lZmYwPCAwIGVsc2UgUVAxCi0gICAgICAgICBWQ0VRICAgICBkWmVybzEsZENvZWZmMSwjMCAgICAgICAgICAgICAgICA7Ly8gQ29tcGFyZSBDb2VmZmljaWVudCAxIGFnYWluc3QgemVybwotICAgICAgICAgVkJTTCAgICAgZFNpZ24xLGRNaW51c1FQMSxkUVAxICAgICAgICAgICAgOy8vIGRTaWduMSA9IC1RUDEgaWYgQ29lZmYxPCAwIGVsc2UgUVAxCi0gICAgICAgICBWTU9WTCAgICBxU2lnbjAsZFNpZ24wICAgICAgICAgICAgICAgICAgICA7Ly8gU2lnbiBleHRlbmQgcVNpZ24wIHRvIDMyIGJpdHMKLSAgICAgICAgIFZNT1ZMICAgIHFTaWduMSxkU2lnbjEKLSAgICAgICAgIFZNTEFMICAgIHFSZXN1bHQwLGRDb2VmZjAsZDJRUCAgICAgICAgICAgIDsvLyBxUmVzdWx0MFtpXT0gcUNvZWZmMFtpXStxQ29lZmYwW2ldKigtMikgaWYgQ29lZmYgPDAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcVJlc3VsdDBbaV09IHFDb2VmZjBbaV0gICAgICAgICAgICAgICAgIGlmIENvZWZmID49MCAKLSAgICAgICAgIFZNTEFMICAgIHFSZXN1bHQxLGRDb2VmZjEsZDJRUCAgICAgICAgICAgIDsvLyBxUmVzdWx0MVtpXT0gcUNvZWZmMVtpXStxQ29lZmYxW2ldKigtMikgaWYgQ29lZmYgPDAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcVJlc3VsdDFbaV09IHFDb2VmZjFbaV0gICAgICAgICAgICAgICAgIGlmIENvZWZmID49MCAKLSAgICAgICAgIDsvLyBDbGlwIFJlc3VsdCB0byBbLTIwNDgsMjA0N10gICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgIAotICAgICAgICAgVlFTSEwgICAgcVJlc3VsdDAscVJlc3VsdDAsIzIwICAgICAgICAgICAgOy8vIGNsaXAgdG8gWy0yMDQ4LDIwNDddCi0gICAgICAgICBWUVNITCAgICBxUmVzdWx0MSxxUmVzdWx0MSwjMjAKLSAgICAgICAgICAgICAgICAgCi0gICAgICAgICBWU0hSICAgICBxUmVzdWx0MCxxUmVzdWx0MCwjNCAgCi0gICAgICAgICBWU0hSICAgICBxUmVzdWx0MSxxUmVzdWx0MSwjNAotICAgICAgICAgVlNIUk4gICAgZFJlc3VsdDAscVJlc3VsdDAsIzE2ICAgICAgICAgICAgOy8vIE5hcnJvdyB0aGUgY2xpcHBlZCBWYWx1ZSB0byBIYWxmd29yZAotICAgICAgICAgVlNIUk4gICAgZFJlc3VsdDEscVJlc3VsdDEsIzE2IAotICAgICAgICAgVkJJVCAgICAgZFJlc3VsdDAsZENvbnN0MCxkWmVybzAgIAotICAgICAgICAgVkJJVCAgICAgZFJlc3VsdDEsZENvbnN0MCxkWmVybzEgICAgIAotICAgICAgICAgCi0gICAgICAgICBWU1QxICAgICB7ZFJlc3VsdDAsZFJlc3VsdDF9LFtwU3JjRHN0XSEgICA7Ly8gU3RvcmUgdGhlIHJlc3VsdAotICAgICAgICAgU1VCUyAgICAgQ291bnQsQ291bnQsIzgKLSAgICAgICAgIFZMRDEgICAgIHtkQ29lZmYwLGRDb2VmZjF9LFtwU3JjRHN0XQotICAgICAgICAgCi0gICAgICAgICAKLSAgICAgICAgIEJHVCAgICAgIExvb3AKLSAgICAgICAgIAotICAgICAgICAgU1VCICAgICAgcFNyY0RzdCxwU3JjRHN0LCMxMjgKLSAgICAgICAgIAotICAgICAgICAgOy8vIFN0b3JlIHRoZSBJbnZlcnNlIHF1YW50aXplZCBEYyBjb2VmZmljaWVudAotICAgICAgICAgCi0gICAgICAgICBTVFJIICAgICB0ZW1wLFtwU3JjRHN0XSwjMgotICAgICAgICAKLSAgICAgICAgIE1PViAgICAgIFJldHVybiwjT01YX1N0c19Ob0VycgotICAgICAgICAgCi0KLQotICAgICAgICAgTV9FTkQKLSAgICAgICAgIEVORElGCi0gICAgICAgICAKLQotICAgICAgICBFTkQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL3NyYy9hcm1WQ19WZXJzaW9uLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvc3JjL2FybVZDX1ZlcnNpb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ5MzY4MS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvc3JjL2FybVZDX1ZlcnNpb24uYworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtQ09NTV9WZXJzaW9uLmgiCi0KLSNpZmRlZiBBUk1fSU5DTFVERV9WRVJTSU9OX0RFU0NSSVBUSU9OUwotY29uc3QgY2hhciAqIGNvbnN0IG9teFZDX1ZlcnNpb25EZXNjcmlwdGlvbiA9ICJBUk0gT3Blbk1BWCBETCB2IiBBUk1fVkVSU0lPTl9TVFJJTkcgIiAgIFJlbD0iIE9NWF9BUk1fUkVMRUFTRV9UQUcgIiAgIEFyY2g9IiBPTVhfQVJNX0JVSUxEX0FSQ0hJVEVDVFVSRSAiICAgVG9vbHM9IiAgT01YX0FSTV9CVUlMRF9UT09MQ0hBSU4gOwotI2VuZGlmIC8qIEFSTV9JTkNMVURFX1ZFUlNJT05fREVTQ1JJUFRJT05TICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL0FSTV9ERUxJVkVSWS5UWFQgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL0FSTV9ERUxJVkVSWS5UWFQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MDFmM2QuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9BUk1fREVMSVZFUlkuVFhUCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotVGhlIGNvbnRlbnRzIG9mIHRoaXMgdHJhbnNhY3Rpb24gd2FzIGNyZWF0ZWQgYnkgSGVkbGV5IEZyYW5jaXMKLW9mIEFSTSBvbiAxOS1GZWItMjAwOC4KLQotSXQgY29udGFpbnMgdGhlIEFSTSBkYXRhIHZlcnNpb25zIGxpc3RlZCBiZWxvdy4KLQotVGhpcyBkYXRhLCB1bmxlc3Mgb3RoZXJ3aXNlIHN0YXRlZCwgaXMgQVJNIFByb3ByaWV0YXJ5IGFuZCBhY2Nlc3MgdG8gaXQKLWlzIHN1YmplY3QgdG8gdGhlIGFncmVlbWVudHMgaW5kaWNhdGVkIGJlbG93LgotCi1JZiB5b3UgZXhwZXJpZW5jZSBwcm9ibGVtcyB3aXRoIHRoaXMgZGF0YSwgcGxlYXNlIGNvbnRhY3QgQVJNIHN1cHBvcnQKLXF1b3RpbmcgdHJhbnNhY3Rpb24gcmVmZXJlbmNlIDw5NzQxMj4uCi0KLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0KLQotLSBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MQotICBWaWRlbyBjb2RlY3MgLSBzYW1wbGUgY29kZQotICBTYW1wbGUgY29kZSByZWxlYXNlIGZvciBIYW50cm8gKFZlciAxLjAuMikKLSAgaW50ZXJuYWwgYWNjZXNzCi0KLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0KLQotVGhpcyB0cmFuc2FjdGlvbiBjb250YWlucyBkZWxpdmVyYWJsZXMgd2hpY2ggYXJlIGRlc2lnbmF0ZWQgYXMgYmVpbmcgb2YKLWJldGEgcmVsZWFzZSBzdGF0dXMgKEJFVCkuCi0KLUJldGEgcmVsZWFzZSBzdGF0dXMgaGFzIGEgcGFydGljdWxhciBtZWFuaW5nIHRvIEFSTSBvZiB3aGljaCB0aGUgcmVjaXBpZW50Ci1tdXN0IGJlIGF3YXJlLiBCZXRhIGlzIGEgcHJlLXJlbGVhc2Ugc3RhdHVzIGluZGljYXRpbmcgdGhhdCB0aGUgZGVsaXZlcmFibGUKLXNvIGRlc2NyaWJlZCBpcyBiZWxpZXZlZCB0byByb2J1c3RseSBkZW1vbnN0cmF0ZSBzcGVjaWZpZWQgYmVoYXZpb3VyLCB0byBiZQotY29uc2lzdGVudCBhY3Jvc3MgaXRzIGluY2x1ZGVkIGFzcGVjdHMgYW5kIGJlIHJlYWR5IGZvciBnZW5lcmFsIGRlcGxveW1lbnQuCi1CdXQgQmV0YSBhbHNvIGluZGljYXRlcyB0aGF0IHByZS1yZWxlYXNlIHJlbGlhYmlsaXR5IHRyaWFscyBhcmUgb25nb2luZyBhbmQKLXRoYXQgaXQgaXMgcG9zc2libGUgcmVzaWR1YWwgZGVmZWN0cyBvciBlcnJvcnMgaW4gb3BlcmF0aW9uLCBjb25zaXN0ZW5jeQotYW5kIGRvY3VtZW50YXRpb24gbWF5IHN0aWxsIGJlIGVuY291bnRlcmVkLiBUaGUgcmVjaXBpZW50IHNob3VsZCBjb25zaWRlcgotdGhpcyBwb3NpdGlvbiB3aGVuIHVzaW5nIHRoaXMgQmV0YSBtYXRlcmlhbCBzdXBwbGllZC4gQVJNIHdpbGwgbm9ybWFsbHkKLWF0dGVtcHQgdG8gcHJvdmlkZSBmaXhlcyBvciBhIHdvcmstYXJvdW5kIGZvciBkZWZlY3RzIGlkZW50aWZpZWQgYnkgdGhlCi1yZWNpcGllbnQsIGJ1dCB0aGUgcHJvdmlzaW9uIG9yIHRpbWVsaW5lc3Mgb2YgdGhpcyBzdXBwb3J0IGNhbm5vdCBiZQotZ3VhcmFudGVlZC4gQVJNIHNoYWxsIG5vdCBiZSByZXNwb25zaWJsZSBmb3IgZGlyZWN0IG9yIGNvbnNlcXVlbnRpYWwKLWRhbWFnZXMgYXMgYSByZXN1bHQgb2YgZW5jb3VudGVyaW5nIG9uZSBvciBtb3JlIG9mIHRoZXNlIHJlc2lkdWFsIGRlZmVjdHMuCi1CeSBhY2NlcHRpbmcgYSBCZXRhIHJlbGVhc2UsIHRoZSByZWNpcGllbnQgYWdyZWVzIHRvIHRoZXNlIGNvbnN0cmFpbnRzIGFuZAotdG8gcHJvdmlkaW5nIHJlYXNvbmFibGUgaW5mb3JtYXRpb24gdG8gQVJNIHRvIGVuYWJsZSB0aGUgcmVwbGljYXRpb24gb2YgdGhlCi1kZWZlY3RzIGlkZW50aWZpZWQgYnkgdGhlIHJlY2lwaWVudC4gVGhlIHNwZWNpZmljIEJldGEgdmVyc2lvbiBzdXBwbGllZAotd2lsbCBub3QgYmUgc3VwcG9ydGVkIGFmdGVyIHJlbGVhc2Ugb2YgYSBsYXRlciBvciBoaWdoZXIgc3RhdHVzIHZlcnNpb24uCi1JdCBzaG91bGQgYmUgbm90ZWQgdGhhdCBTdXBwb3J0IGZvciB0aGUgQmV0YSByZWxlYXNlIG9mIHRoZSBkZWxpdmVyYWJsZQotd2lsbCBvbmx5IGJlIHByb3ZpZGVkIGJ5IEFSTSB0byBhIHJlY2lwaWVudCB3aG8gaGFzIGEgY3VycmVudCBzdXBwb3J0IGFuZAotbWFpbnRlbmFuY2UgY29udHJhY3QgZm9yIHRoZSBkZWxpdmVyYWJsZS4KLQotCi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCi0KLUluIGFkZGl0aW9uIHRvIHRoZSBkYXRhIHZlcnNpb25zIGxpc3RlZCBhYm92ZSwgdGhpcyB0cmFuc2FjdGlvbiBjb250YWlucwotdHdvIGFkZGl0aW9uYWwgZmlsZXMgYXQgdGhlIHRvcCBsZXZlbC4KLQotVGhlIGZpcnN0IGlzIHRoaXMgZmlsZSwgQVJNX0RFTElWRVJZXzk3NDEyLlRYVCwgd2hpY2ggaXMgdGhlIGRlbGl2ZXJ5Ci1ub3RlLgotCi1UaGUgc2Vjb25kIGlzIEFSTV9NQU5JRkVTVF85NzQxMi5UWFQgd2hpY2ggY29udGFpbnMgYSBtYW5pZmVzdCBvZiBhbGwgdGhlCi1maWxlcyBpbmNsdWRlZCBpbiB0aGlzIHRyYW5zYWN0aW9uLCB0b2dldGhlciB3aXRoIHRoZWlyIGNoZWNrc3Vtcy4KLQotVGhlIGNoZWNrc3VtcyBwcm92aWRlZCBhcmUgY2FsY3VsYXRlZCB1c2luZyB0aGUgUlNBIERhdGEgU2VjdXJpdHksIEluYy4KLU1ENSBNZXNzYWdlLURpZ2VzdCBBbGdvcml0aG0uCi0KLVRoZSBjaGVja3N1bXMgY2FuIGJlIHVzZWQgdG8gdmVyaWZ5IHRoZSBpbnRlZ3JpdHkgb2YgdGhpcyBkYXRhIHVzaW5nIHRoZQotIm1kNXN1bSIgdG9vbCAod2hpY2ggaXMgcGFydCBvZiB0aGUgR05VICJ0ZXh0dXRpbHMiIHBhY2thZ2UpIGJ5IHJ1bm5pbmc6Ci0KLSAgJSBtZDVzdW0gLS1jaGVjayBBUk1fTUFOSUZFU1RfOTc0MTIuVFhUCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvQVJNX01BTklGRVNULlRYVCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvQVJNX01BTklGRVNULlRYVApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUwMWIxZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL0FSTV9NQU5JRkVTVC5UWFQKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotCQkJCSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvCi0JCQkJICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvCi04OTcxOTMyZDU2ZWVkNmIxYWQxYmE1MDdmMGJmZjVmMCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybUNPTU1fQml0c3RyZWFtLmgKLWU4OGVjODRlMTIyNTM0MDkyYjkwYzY3ODQxNTQ5ZDZmICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvYXJtQ09NTV9WZXJzaW9uLmgKLTQzY2Y0NmMyY2YyZmUxZjkzYzYxNWI1N2JjYmU0ODA5ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvYXJtQ09NTS5oCi1mODdmZWRkOWNhNDMyZmVmYTc1NzAwODE3Njg2NGVmOCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybU9NWC5oCi04ZTQ5ODk5YTQyODgyMmMzNmVmOWRkOTRlMGUwNWYxOCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL29teHR5cGVzLmgKLWEwNjk4M2FiYjM5YzQ3NmIwODFlODdlYTI3MTM2MWE1ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS9idWlsZF92Yy5wbAotYzAxZjhiOTNhYjczZDhjMDBkZGYyNDk5ZjAxZGE1ZmYgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2ZpbGVsaXN0X3ZjLnR4dAotCQkJCSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvc3JjLwotMjZlMmZmM2Y2MzM3NjRlYjcyMGRlYjM0MDk3OGRjMmQgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3NyYy9hcm1DT01NX0JpdHN0cmVhbS5jCi03OWFhMjNkOTgxN2VmZDExZDBjNGMyYmUzNmVjMWU1YyAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvc3JjL2FybUNPTU0uYwotCQkJCSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvCi0JCQkJICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC8KLQkJCQkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy8KLWU0NTI5NzcwNGQ3MjMwMmQ0YTk0N2QwNzk4YzY2NmZiICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5jCi0yMDVkZmFmZTFmZTdiYjE2MGJmMzZkMjYwMGUxMTAwYSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5jCi1iZjkyNjQxZTg1NDg1NzdiNzdlMDRlMDNlYzA0YzM1OCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfTUVHZXRCdWZTaXplLmMKLWY1ZWU2ZjdiZTgyMmQ4NzQ3MWNlZjNiMTgwMWRiZmMyICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSS5jCi0yODExMGIzYTEzY2VjZjRmMjE2ZDEwYmNjNzYxYzQwMSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hLmMKLTlhMWEyNTI0NWM5NzVkNjQxZTFjNjM3ODgzNGFlYTRkICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYS5jCi0zYTY0M2VhYWFlYjEyZThkMjc0ZGM1OWE3MzU3YTU4NiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JLmMKLTRjNGRlNTk3M2E2Yjc0MjUwY2U5MWFjMGIzMTdhNjE3ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0x1bWFEQy5jCi00ZWNkYmU5MTkzYWFiYTFmOWJiMGUyNGM5MzhiMzRmOSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2syeDIuYwotNjZlOTEyZjhjODhmNjAxOWNiYTNlZGUyNzE1MGE0MDcgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYS5jCi0yNjZkYTQyZjRlMzAxNWU2N2IyY2JiNTgxNjlkNDM3ZiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmRGlhZ19MdW1hLmMKLWQ5MDUyNDdlZWFhNTJkNGUyY2Y1ZjZiYzNmNjFiMzQ4ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIuYwotNWIyOTQ0OGRiMDQ5NWNkMTcxN2E0YjkyNWYxMzM3N2MgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNi5jCi1mNjQ1MWRmMjdmNmRjYzk5MDM2YjRiMTI1M2MyM2JiNiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0kuYwotODkyNzg3ZDg1MGVlZjA5ZGMyMTQ4ZDQ1YjQxNmIwNjIgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0Nocm9tYURDLmMKLTMzZGExYzAxYTMxZjQ3YzBmM2FlYTlhN2E1ZWFhOWJlICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9CbG9ja01hdGNoX1F1YXJ0ZXIuYwotZTlmYjExYjA2Njc3NTI4M2RjZmVhZThkMTJhNmM5N2EgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hLmMKLWFkZDk3YmVjMDhlNWUxYTUzOGFhODYwNzE2OGU2MWJhICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4LmMKLWI2OTVlY2ZjOTE3YjM5NDcwZDFmNDA3NzNiOTIzOTcyICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9QcmVkaWN0SW50cmFEQzR4NC5jCi01MWJjNTk2ZmQyZmY2MWFkNTQ1MGQ3MTM4NDYxZjRhMSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfTUVJbml0LmMKLWRjNmJhYTBhMzg4ZGM1ZWE4ZmY2NWMyNGIxNzllNjcwICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9HZXRWTENJbmZvLmMKLWE1NDk5OTAyOTk2NTc2ZjY3MTI4NDlkYjM0ZDVhZDY1ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0kuYwotMGMzYjc2NzQ1ZDUzZTc0YThlNjRlODBkZWYzMWZhYmEgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQuYwotNGYyNzQyYmE1YTNjMjIwOGY1M2JjMGY2YTQ0M2JlMTQgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBRFF1YXJfNHguYwotYjRhZTJkYzk0OGU4Y2E2NDgzMWZlM2JiZmJkODk1MjMgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLmMKLWUxNTExOGNiZTM3MmRiN2NhZGJhMjI1Yzk0NTZmMTg5ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9TQURRdWFyLmMKLTYyM2NmMzM2Y2ZjZTdkMDE3NGY0ZTU0MDcyNDU2ZjMzICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1SZXNpZHVhbEFuZEFkZC5jCi04OWU0NTJjODBlMzAzNTdjYWRmYjA0YzA1YjZmZTAwYyAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEuYwotM2E1NTUxY2M1NGU4NWJiZTM0ZmM5NjZjN2RjMDBmMWMgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSW50ZWdlci5jCi0xMTQwMzBmYTBkOGYwMGFmNmQzMjg5ZjQ3YTVlODViZiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYwotOWUzNzNhYjI5NmZiODViYjQ1NTY1YTZjMzg0ZjZlZDggIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXMuYwotMmQyMDBmN2NjMjMwZjMwMmRhNDhjNTg5ZGE0MmMwMmYgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0LmMKLWVhM2YxZDFkMTUwN2I1NTYxMGIxMzQ5YzdiNTk0NmU4ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpci5jCi1iZDJiZjE3NDNhZWYyYTkzOTY1NDVlZDAyNTM2MmJlMiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfQXZlcmFnZV80eC5jCi1jYTY4ZTgwOTU2N2JmODkwNDQ2MzFiNjdkMjI4YzdjZSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLmMKLTc3Y2FmMmI1Y2JlZTk2ZDM2MGE5MTlmMjdlMWYxNGY0ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9RdWFudFRhYmxlcy5jCi0yNjA4MWUzODRlYzYyN2ZlZGFkNDc0YTBlN2RhZDg3NyAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FEUXVhcl84eC5jCi0xYzgzYWU5MjA3YTU0OTQ0OTM2ZjRhNjNjNjY1YmQ5OSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfTW90aW9uRXN0aW1hdGlvbk1CLmMKLTRjMzZlMDRkYjIwMjAwZjRlYzcyZTVhYmE1NzQ0NmZkICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQVREXzR4NC5jCi1mNzViN2M1YTgwZDhiZjMzZTMxNTM4MGU0ZWYwYWI4YSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEuYwotNDg4OTI1YmI3YWVlYWUwY2NmOTNlYzQ0YWY5ZmNlMzUgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBRFF1YXJfMTZ4LmMKLWM5MWE1MzQ1YjVmODc3YjM4MzFlZDFhYmNjNjBkNTc5ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYuYwotMzU1MTVhMTE1YTMyZmNhYzg0NzkwNzJhOWE1YjBkYjkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0x1bWEuYwotZmRjZjQ2MjJiYzVmMGFlNzViZGIwYTUxZGNkMDMzOTcgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0x1bWFEQy5jCi03NGM5Mjc4MTc3NDAwYTFmN2NjNmQ3OTlhOGM4YWIzNCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FEXzR4LmMKLTU2YWEyZDUwNmQwY2ZkYjRlYmQzNjZjMDdhZGIyZDg1ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZUJsb2NrUGl4ZWwuYwotMzZiMjE2NWZkNGQyYTdmM2YzZTFmOGRhZmY0Zjk0ZTUgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1N1YkFuZFRyYW5zZm9ybVFEUVJlc2lkdWFsLmMKLTRiNmIxYjkzM2ZjN2JjOGYxNGExODRjMDJjMDI4MDg1ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NC5jCi1jZjBmZjA5M2E5YjM3MmRkMzI3MWUzZTVjMjg5ODRkNCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyLmMKLTljY2FkOWY4OTRmYmQzMjE5NGY1YjUzZGEyMTcwNzJhICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0Nocm9tYURDLmMKLTQ5NDNhN2EyZGY3ZTlkNzAwNjc1ZjhjMWRlYmY0ZDkwICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9Db21wYXJlTW90aW9uQ29zdFRvTVYuYwotMjllNGE3ZjM4ZjhjMmU4MjQ2ZWQ3NTZkYjAzYzAxMmUgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0Z3ZFRyYW5zZm9ybVJlc2lkdWFsNHg0LmMKLTI3YmM2NGU3YzE4ZGEwYWFiOWM5ODdhMzg4ZjYxNjA4ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLmMKLTg1OTE4NTYxNGJiOWQwMDEzODYxZTQ1NGQ3YjkxOGYyICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZC5jCi0JCQkJICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9hcGkvCi02M2UzYjY0Yjk2Y2M0MmEyMzVjMDRmM2EwZjk5MTMxNiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvYXBpL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuaAotCQkJCSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi8KLQkJCQkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjLwotMGFhZTRmNjgzZDg5MDNjYmE5OTU2ZDMzMDFlZDlmZmUgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9BQ0RDUHJlZGljdC5jCi04ZDZjMWI0NDkxNTMyOTE2NWRmNjQzMDgxY2MxMWE5NyAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX01DUmVjb25CbG9jay5jCi0wNDM1ZWNhOTMwZWFjZGEwZjJhNTllODQzZDQwNWVmZiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX01vdGlvbkVzdGltYXRpb25NQi5jCi05YTgyZGQwYjFmMDVmNzk4NTY3NDM2YTAwOWQwMjk2OSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1AuYwotZTFlMjQ2NDZjNGJkMDNmNWRmNzgyOTU0NTJkZDRlYjIgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfOHg4LmMKLTc0NmU2YjMzNGU0YTI2ZDRhOWJmYWU2ZDczNTgyNmY2ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRENUOHg4YmxrLmMKLThiMWQ4N2I3NGQ4MGZmMTNhMTYyMTViNjFkNWU1MmJhICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfSURDVDh4OGJsay5jCi0zMDkzNThkMzU3YmFhZmMzOGQyYjM3YmYxZTk3NjhhOSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50ZXJfSS5jCi1jYzc3YzcyNDJiNTNjMTUzZjhkMDk1Mjc1ODNmMjc3MSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0ZpbmRNVnByZWQuYwotN2NkOGU3Nzk2MDE3ZTNkZDAwYjQ5NGQzNGY2MjlmM2YgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9NRUdldEJ1ZlNpemUuYwotYTQ5MDVjYjVmOGQ0YjI0NDQ1NGVlNGY2MGQxODM1OGIgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9QdXRWTENCaXRzLmMKLTU1OTZiMzFlNDMzMjIyYzFlNDg2MGRlZWJmYTk4ZWYyICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRENUX1RhYmxlLmMKLTM2NWQwNzJiZTZlYWIyMDFmNmUwNDAwNThhM2JhY2ZjICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyLmMKLTc4ZWQyMjEyNTg1YjBjY2E3NTkxM2E0NzNiMmVjNDMwICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhQUNWTEMuYwotNTBiMmQ4ZGE4ZjIwZjZiMWQzOWI4ZDNkZjM4YWY1NWQgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9FbmNvZGVNVi5jCi00YTg1MWEyYWQ2ZDM1N2NkYzIzM2Q5YzBiZjQ3NWUwMiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZi5jCi0wZDZkNjM4NzhmMjgyN2UwMGU1Zjg1YjFlOGUyNjAxNyAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuYwotNDhiODY1YTk4M2ZlNWJmMzA3NWVkZGY2NTI5NTA3MjIgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEuYwotNWY0OGZhNzk0MTgzNWM0NmFjNzY3ZTYzZmMyOTQwM2IgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQy5jCi1iYmFmNDU0YjY0YjMyYjJjNDJhNzZhN2VjMzkzZDk3NyAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0NvbXBhcmVNVi5jCi1lZWJmZjc3MmY4N2E0MTQ0MzZjNWM1Mjg2ZjJjZDIxMyAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX01FSW5pdC5jCi02NWFlMjQyZWI4Y2I2ZDEwMjc2NzdjOGVmOGY3N2NhMCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0ZpbGxWTENCdWZmZXIuYwotMTI1NjQyYjFlYTBjMTI1NmQ3OWFmMWUwZGRlY2FlOTMgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludGVyX0kuYwotY2UyNGJhM2Q4M2RhNGNiNzkxNDg1ZDMxMjgyNjhiZjYgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYS5jCi0wOWJjMDlhMmU2ZmQ5NjJlNzE5OTQ0NTgyZTM4YThmZCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYS5jCi02YjBlZTdhMTE2NDcxYTRkYWRiZTViYzhkYmY0MjViMCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIuYwotMjEzMjJkY2EwMjdjMjgzNTNlM2U3ZWI4ZjM2MjAwNjIgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9DaGVja1ZMQ0VzY2FwZU1vZGUuYwotZWYzNTNkODMyNDQyODhkOGMzN2UwZjcwMjQ5MTc3Y2MgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9HZXRWTENCaXRzLmMKLTU0MWRlODI0ZjhhZWJlNGE1Y2FjNmYxNWRhOTQzZWZhICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OC5jCi0wYjQwYjE1NGI1OTFjN2Y4ODQyY2ZmZTQwNDJkMTdjNSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jCi0yZmZjZWM4OGQzZmNiMzcyNTQzYThmNDUwOGVhMWFjNiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW50cmFfSS5jCi1lMDZkODVjYTAwMGFmY2JiNTA1ODBmOThmMDIwM2FjOCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDLmMKLWFlODJiNmZjZmNmNzMxYTYxZDcwZTFhYTQyZTYyNzdhICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2LmMKLTFkMDQzOTVlMjMxYjU5NzU2MjI1N2U5OGNkYTZjZmIwICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLmMKLTcyYzBhMzYzMjdiNmI5YjQzNmQzYmNlN2M4OTZjNTIwICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMuYwotMWI2NWFhN2YzMTExMjRlYTZmYjQ3ZTM4NGVjMDZhNTAgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludHJhX0kuYwotNzE0OTU3MTA0YTZlZjcxMzQxZmJlNmE5ZWM2NWMxMzYgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9TZXRQcmVkRGlyLmMKLTg2NDkzZjBlZTg1M2Y2NTMzNTRhNzM4OWYxNzI3ZjczICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50ZXIuYwotNWRlOGFmY2ZiMzA1Mjk2ODc5NDc4MmE3YzNhMGI0MWEgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50ZXIuYwotNTBiY2MyMjhjYzY2MGRiZGEwMzc3MjUzMDlkZTNmOGIgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9FbmNvZGVWTENaaWd6YWdfaW50cmEuYwotNGY1Y2ZhMWVjYzY2ODkxM2RkZTk0ZTNjYWY5N2EyZTEgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfaW50cmEuYwotYzJlYzgwNGRkZjY0ZWU4NDExNDZlMzljM2E3ODM0NTEgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfMTZ4MTYuYwotNDA4N2Y2YTgyNzkxMmVlNWI0NWVkNDIxN2YxYTZkNzcgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIuYwotCQkJCSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9hcGkvCi01YzcxMTcwMmRkZGNlYzg1Mjk4MDAzODYwZDc2MGNlYyAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0RDVF9UYWJsZS5oCi0xYjkyYzk0Yjc4NWMwM2VjNzZkNGZhZTJmMmJiZGI4YSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaAotYWQ5YzY5ODZkMmEzMjAwZGQ1ZTFmNjEwM2E1NGE5OWIgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvYXBpL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaAotCQkJCSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvc3JjLwotZTYyN2IzMzQ2YjBkYzlhZmYxNDQ0NjAwNWNlMGZhNDMgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL3NyYy9hcm1WQ19WZXJzaW9uLmMKLQkJCQkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2FwaS8KLTdjYTk0YjFjMzNhYzAyMTFlMTdkMzhiYWFkZDdkMWRkICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9hcGkvYXJtVkMuaAotMTJjZjc1OTZlZGJiZjYwNDhiNjI2ZDE1ZThkMGVkNDggIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2FwaS9vbXhWQy5oCi0JCQkJICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9jb21tLwotCQkJCSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvCi0zYTZkZjAwODU3MzZjYmNiZTJlM2Y0NWQwOGFmNDIyMSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvYXJtVkNDT01NX0F2ZXJhZ2UuYwotMGJmM2NiNTI4NjNjODI5YjI4YzAzNTI4MzUxNzAyMTEgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5OHg4LmMKLTUzOGI2MmY1MTBiNWE4YmRjZWQ0YTM5ZmExMmQ5YTIzICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrX1NBRC5jCi02Njk5M2VkZDlkNDQxYmYzYjViNmM5MTJmNjQwMGI2ZSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvb214VkNDT01NX0V4cGFuZEZyYW1lX0kuYwotOGU1MjZhOTAwN2ViMGQ0M2ViZjM2MmM0OThiMzc0MTUgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9MaW1pdE1WVG9SZWN0LmMKLTg3ZjhmMjZlNmU5MTc4ZGYwYWI3NDE5MzM0ZDVhM2RiICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fU0FEXzE2eC5jCi0xYTg1Nzc2NDYxMzJhZDliNjNhMTQ3N2ZkYWVjMjQ2NCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvb214VkNDT01NX0F2ZXJhZ2VfMTZ4LmMKLTQ4NTI5YzRmNzBjN2U5NTRlODMyZWVjZTFhZWU1N2JkICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fU0FEXzh4LmMKLTI1Mjk3Nzc2NGQ0ZjM4MjgyYjZhNTZjNTljY2Y0ZjA5ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9jb21tL3NyYy9hcm1WQ0NPTU1fU0FELmMKLWNjNzhjZmFlZDk1MDJjMmUwMjgyYzkxZmI5NWVlYWM0ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQXZlcmFnZV84eC5jCi1lNDY4NzUxYzE1YTU4MWViZDIyZGEwMzFlMjIxMTdkMSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHkxNngxNi5jCi0zZjQ0OGQxOTFlYWViODJlY2I3ZTI3ZWY4YmEyNzg3NSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9jay5jCi1iMTI5MWMzMDc4MDg2MzFmYTgzMzY4NGFiYjljMzRjZSAgQVJNX0RFTElWRVJZXzk3NDEyLlRYVApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9hcGkvYXJtQ09NTS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9hcGkvYXJtQ09NTS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzA0ODYzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvYXBpL2FybUNPTU0uaAorKysgL2Rldi9udWxsCkBAIC0xLDgwMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtQ09NTS5oCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiAgIAotICogRmlsZTogYXJtQ09NTS5oCi0gKiBCcmllZjogRGVjbGFyZXMgQ29tbW9uIEFQSXMvRGF0YSBUeXBlcyB1c2VkIGFjcm9zcyBPcGVuTUFYIEFQSSdzCi0gKgotICovCi0gCi0gIAotI2lmbmRlZiBfYXJtQ29tbW9uX0hfCi0jZGVmaW5lIF9hcm1Db21tb25fSF8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIE9NWF9GMzIgUmU7IC8qKiBSZWFsIHBhcnQgKi8KLSAgT01YX0YzMiBJbTsgLyoqIEltYWdpbmFyeSBwYXJ0ICovCQotICAgICAgICAKLX0gT01YX0ZDMzI7IC8qKiBzaW5nbGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IGNvbXBsZXggbnVtYmVyICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIE9NWF9GNjQgUmU7IC8qKiBSZWFsIHBhcnQgKi8KLSAgT01YX0Y2NCBJbTsgLyoqIEltYWdpbmFyeSBwYXJ0ICovCQotICAgICAgICAKLX0gT01YX0ZDNjQ7IC8qKiBkb3VibGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IGNvbXBsZXggbnVtYmVyICovCi0KLQotLyogVXNlZCBieSBib3RoIElQIGFuZCBJQyBkb21haW5zIGZvciA4eDggSlBFRyBibG9ja3MuICovCi10eXBlZGVmIE9NWF9TMTYgQVJNX0JMT0NLOHg4WzY0XTsKLQotCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0KLSNkZWZpbmUgIGFybVBJIChPTVhfRjY0KSgzLjE0MTU5MjY1MzU4OTc5MzIzODQ2MjY0MzM4MzI3OTUpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogQ29tcGlsZXIgZXh0ZW5zaW9ucyAqLwotI2lmZGVmIEFSTV9ERUJVRwotLyogZGVidWcgdmVyc2lvbiAqLwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jZGVmaW5lIGFybUVycm9yKHN0cikge3ByaW50Zigoc3RyKSk7IHByaW50ZigiXG4iKTsgZXhpdCgtMSk7fQotI2RlZmluZSBhcm1XYXJuKHN0cikge3ByaW50Zigoc3RyKSk7IHByaW50ZigiXG4iKTt9Ci0jZGVmaW5lIGFybUlnbm9yZShhKSAoKHZvaWQpYSkKLSNkZWZpbmUgYXJtQXNzZXJ0KGEpIGFzc2VydChhKQotI2Vsc2UgCi0vKiByZWxlYXNlIHZlcnNpb24gKi8KLSNkZWZpbmUgYXJtRXJyb3Ioc3RyKSAoKHZvaWQpIChzdHIpKQotI2RlZmluZSBhcm1XYXJuKHN0cikgICgodm9pZCkgKHN0cikpCi0jZGVmaW5lIGFybUlnbm9yZShhKSAgKCh2b2lkKSAoYSkpCi0jZGVmaW5lIGFybUFzc2VydChhKSAgKCh2b2lkKSAoYSkpCi0jZW5kaWYgLyogQVJNX0RFQlVHICovCi0KLS8qIEFyaXRobWV0aWMgb3BlcmF0aW9ucyAqLwotCi0jZGVmaW5lIGFybU1pbihhLGIpICAgICAgICAgICAgICggKGEpID4gKGIpID8gIChiKTooYSkgKQotI2RlZmluZSBhcm1NYXgoYSxiKSAgICAgICAgICAgICAoIChhKSA+IChiKSA/ICAoYSk6KGIpICkKLSNkZWZpbmUgYXJtQWJzKGEpICAgICAgICAgICAgICAgKCAoYSkgPCAgMCAgPyAtKGEpOihhKSApCi0KLS8qIEFsaWdubWVudCBvcGVyYXRpb24gKi8KLQotI2RlZmluZSBhcm1BbGlnblRvQnl0ZXMoUHRyLE4pICAgICAgKFB0ciArICggKChOLShpbnRwdHJfdClQdHIpJihOLTEpKSAvIHNpemVvZigqUHRyKSApKQotI2RlZmluZSBhcm1BbGlnblRvMkJ5dGVzKFB0cikgICAgICAgYXJtQWxpZ25Ub0J5dGVzKFB0ciwyKQotI2RlZmluZSBhcm1BbGlnblRvNEJ5dGVzKFB0cikgICAgICAgYXJtQWxpZ25Ub0J5dGVzKFB0ciw0KQotI2RlZmluZSBhcm1BbGlnblRvOEJ5dGVzKFB0cikgICAgICAgYXJtQWxpZ25Ub0J5dGVzKFB0ciw4KQotI2RlZmluZSBhcm1BbGlnblRvMTZCeXRlcyhQdHIpICAgICAgYXJtQWxpZ25Ub0J5dGVzKFB0ciwxNikKLQotLyogRXJyb3IgYW5kIEFsaWdubWVudCBjaGVjayAqLwotCi0jZGVmaW5lIGFybVJldEFyZ0VycklmKGNvbmRpdGlvbiwgY29kZSkgIGlmKGNvbmRpdGlvbikgeyByZXR1cm4gKGNvZGUpOyB9Ci0jZGVmaW5lIGFybVJldERhdGFFcnJJZihjb25kaXRpb24sIGNvZGUpIGlmKGNvbmRpdGlvbikgeyByZXR1cm4gKGNvZGUpOyB9Ci0KLSNpZm5kZWYgQUxJR05NRU5UX0RPRVNOVF9NQVRURVIKLSNkZWZpbmUgYXJtSXNCeXRlQWxpZ25lZChQdHIsTikgICAgICgoKChpbnRwdHJfdCkoUHRyKSkgJSBOKT09MCkKLSNkZWZpbmUgYXJtTm90Qnl0ZUFsaWduZWQoUHRyLE4pICAgICgoKChpbnRwdHJfdCkoUHRyKSkgJSBOKSE9MCkKLSNlbHNlCi0jZGVmaW5lIGFybUlzQnl0ZUFsaWduZWQoUHRyLE4pICAgICAoMSkKLSNkZWZpbmUgYXJtTm90Qnl0ZUFsaWduZWQoUHRyLE4pICAgICgwKQotI2VuZGlmCi0KLSNkZWZpbmUgYXJtSXMyQnl0ZUFsaWduZWQoUHRyKSAgICAgIGFybUlzQnl0ZUFsaWduZWQoUHRyLDIpCi0jZGVmaW5lIGFybUlzNEJ5dGVBbGlnbmVkKFB0cikgICAgICBhcm1Jc0J5dGVBbGlnbmVkKFB0ciw0KQotI2RlZmluZSBhcm1JczhCeXRlQWxpZ25lZChQdHIpICAgICAgYXJtSXNCeXRlQWxpZ25lZChQdHIsOCkKLSNkZWZpbmUgYXJtSXMxNkJ5dGVBbGlnbmVkKFB0cikgICAgIGFybUlzQnl0ZUFsaWduZWQoUHRyLDE2KQotCi0jZGVmaW5lIGFybU5vdDJCeXRlQWxpZ25lZChQdHIpICAgICBhcm1Ob3RCeXRlQWxpZ25lZChQdHIsMikKLSNkZWZpbmUgYXJtTm90NEJ5dGVBbGlnbmVkKFB0cikgICAgIGFybU5vdEJ5dGVBbGlnbmVkKFB0ciw0KQotI2RlZmluZSBhcm1Ob3Q4Qnl0ZUFsaWduZWQoUHRyKSAgICAgYXJtTm90Qnl0ZUFsaWduZWQoUHRyLDgpCi0jZGVmaW5lIGFybU5vdDE2Qnl0ZUFsaWduZWQoUHRyKSAgICBhcm1Ob3RCeXRlQWxpZ25lZChQdHIsMTYpCi0jZGVmaW5lIGFybU5vdDMyQnl0ZUFsaWduZWQoUHRyKSAgICBhcm1Ob3RCeXRlQWxpZ25lZChQdHIsMzIpCi0KLS8qKgotICogRnVuY3Rpb246IGFybVJvdW5kRmxvYXRUb1MxNl9yZWYvYXJtUm91bmRGbG9hdFRvUzMyX3JlZi9hcm1Sb3VuZEZsb2F0VG9TNjQKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgc2hvcnQgaW50L2ludCBhZnRlciByb3VuZGluZwotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9TMTYvT01YX1MzMiBmb3JtYXQKLSAqCi0gKi8KLQotT01YX1MxNiBhcm1Sb3VuZEZsb2F0VG9TMTYgKE9NWF9GNjQgVmFsdWUpOwotT01YX1MzMiBhcm1Sb3VuZEZsb2F0VG9TMzIgKE9NWF9GNjQgVmFsdWUpOwotT01YX1M2NCBhcm1Sb3VuZEZsb2F0VG9TNjQgKE9NWF9GNjQgVmFsdWUpOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1TYXRSb3VuZEZsb2F0VG9TMTZfcmVmL2FybVNhdFJvdW5kRmxvYXRUb1MzMgotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSBzaG9ydCBpbnQvaW50IGFmdGVyIHJvdW5kaW5nIGFuZCBzYXR1cmF0aW9uCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1MxNi9PTVhfUzMyIGZvcm1hdAotICoKLSAqLwotCi1PTVhfUzE2IGFybVNhdFJvdW5kRmxvYXRUb1MxNiAoT01YX0Y2NCBWYWx1ZSk7Ci1PTVhfUzMyIGFybVNhdFJvdW5kRmxvYXRUb1MzMiAoT01YX0Y2NCBWYWx1ZSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVNhdFJvdW5kRmxvYXRUb1UxNl9yZWYvYXJtU2F0Um91bmRGbG9hdFRvVTMyCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIHVuc2lnbmVkIHNob3J0IGludC9pbnQgYWZ0ZXIgcm91bmRpbmcgYW5kIHNhdHVyYXRpb24KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfVTE2L09NWF9VMzIgZm9ybWF0Ci0gKgotICovCi0KLU9NWF9VMTYgYXJtU2F0Um91bmRGbG9hdFRvVTE2IChPTVhfRjY0IFZhbHVlKTsKLU9NWF9VMzIgYXJtU2F0Um91bmRGbG9hdFRvVTMyIChPTVhfRjY0IFZhbHVlKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtU2lnbkNoZWNrCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDaGVja3MgdGhlIHNpZ24gb2YgYSB2YXJpYWJsZToKLSAqIHJldHVybnMgMSBpZiBpdCBpcyBQb3NpdGl2ZQotICogcmV0dXJucyAwIGlmIGl0IGlzIDAKLSAqIHJldHVybnMgLTEgaWYgaXQgaXMgTmVnYXRpdmUgCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQkgICAgdmFyICAgICBWYXJpYWJsZSB0byBiZSBjaGVja2VkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX0lOVCAtLSAgIHJldHVybnMgMSBpZiBpdCBpcyBQb3NpdGl2ZQotICogICAgICAgICAgICAgIHJldHVybnMgMCBpZiBpdCBpcyAwCi0gKiAgICAgICAgICAgICAgcmV0dXJucyAtMSBpZiBpdCBpcyBOZWdhdGl2ZSAKLSAqLyAKLSAKLU9NWF9JTlQgYXJtU2lnbkNoZWNrIChPTVhfUzE2IHZhcik7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybUNsaXAKLSAqCi0gKiBEZXNjcmlwdGlvbjogQ2xpcHMgdGhlIGlucHV0IGJldHdlZW4gTUFYIGFuZCBNSU4gdmFsdWUKLSAqIAotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gTWluICAgICBsb3dlciBib3VuZAotICogW2luXSBNYXggICAgIHVwcGVyIGJvdW5kCi0gKiBbaW5dIHNyYyAgICAgdmFyaWFibGUgdG8gdGhlIGNsaXBwZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfUzMyIC0tICAgcmV0dXJucyBjbGlwcGVkIHZhbHVlCi0gKi8gCi0gCi1PTVhfUzMyIGFybUNsaXAgKAotICAgICAgICBPTVhfSU5UIG1pbiwKLSAgICAgICAgT01YX0lOVCBtYXgsIAotICAgICAgICBPTVhfUzMyIHNyYwotICAgICAgICApOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1DbGlwX0YzMgotICoKLSAqIERlc2NyaXB0aW9uOiBDbGlwcyB0aGUgaW5wdXQgYmV0d2VlbiBNQVggYW5kIE1JTiB2YWx1ZQotICogCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBNaW4gICAgIGxvd2VyIGJvdW5kCi0gKiBbaW5dIE1heCAgICAgdXBwZXIgYm91bmQKLSAqIFtpbl0gc3JjICAgICB2YXJpYWJsZSB0byB0aGUgY2xpcHBlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9GMzIgLS0gICByZXR1cm5zIGNsaXBwZWQgdmFsdWUKLSAqLyAKLSAKLU9NWF9GMzIgYXJtQ2xpcF9GMzIgKAotICAgICAgICBPTVhfRjMyIG1pbiwKLSAgICAgICAgT01YX0YzMiBtYXgsIAotICAgICAgICBPTVhfRjMyIHNyYwotICAgICAgICApOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1TaGlmdFNhdF9GMzIKLSAqCi0gKiBEZXNjcmlwdGlvbjogRGl2aWRlcyBhIGZsb2F0IHZhbHVlIGJ5IDJec2hpZnQgYW5kIAotICogc2F0dXJhdGVzIGl0IGZvciB1bnNpZ25lZCB2YWx1ZSByYW5nZSBmb3Igc2F0Qml0cy4KLSAqIFNlY29uZCBwYXJhbWV0ZXIgaXMgbGlrZSAic2hpZnRpbmciIHRoZSBjb3JyZXNwb25kaW5nIAotICogaW50ZWdlciB2YWx1ZS4gVGFrZXMgY2FyZSBvZiByb3VuZGluZyB3aGlsZSBjbGlwcGluZyB0aGUgZmluYWwgCi0gKiB2YWx1ZS4KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSB2ICAgICAgICAgIE51bWJlciB0byBiZSBvcGVyYXRlZCB1cG9uCi0gKiBbaW5dIHNoaWZ0ICAgICAgRGl2aWRlcyB0aGUgaW5wdXQgInYiIGJ5ICIyXnNoaWZ0IgotICogW2luXSBzYXRCaXRzICAgIEZpbmFsIHJhbmdlIGlzIFswLCAyXnNhdEJpdHMpCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX1MzMiAtLSAgIHJldHVybnMgInNoaWZ0ZWQiIHNhdHVyYXRlZCB2YWx1ZQotICovIAotIAotT01YX1UzMiBhcm1TaGlmdFNhdF9GMzIoCi0gICAgICAgIE9NWF9GMzIgdiwgCi0gICAgICAgIE9NWF9JTlQgc2hpZnQsIAotICAgICAgICBPTVhfSU5UIHNhdEJpdHMKLSAgICAgICAgKTsKLQotLyoqCi0gKiBGdW5jdGlvbnM6IGFybVN3YXBFbGVtCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHN3YXBzIHR3byBlbGVtZW50cyBhdCB0aGUgc3BlY2lmaWVkIHBvaW50ZXIgbG9jYXRpb25zLgotICogVGhlIHNpemUgb2YgZWFjaCBlbGVtZW50IGNvdWxkIGJlIGFueXRoaW5nIGFzIHNwZWNpZmllZCBieSA8ZWxlbVNpemU+Ci0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YUmVzdWx0IC0tIEVycm9yIHN0YXR1cyBmcm9tIHRoZSBmdW5jdGlvbgotICovCi1PTVhSZXN1bHQgYXJtU3dhcEVsZW0oT01YX1U4ICpwQnVmMSwgT01YX1U4ICpwQnVmMiwgT01YX0lOVCBlbGVtU2l6ZSk7Ci0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtTWVkaWFuT2YzCi0gKgotICogRGVzY3JpcHRpb246IEZpbmRzIHRoZSBtZWRpYW4gb2YgdGhyZWUgbnVtYmVycwotICogCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIGZFbnRyeSAgICAgRmlyc3QgZW50cnkKLSAqIFtpbl0gc0VudHJ5ICAgICBzZWNvbmQgZW50cnkKLSAqIFtpbl0gdEVudHJ5ICAgICBUaGlyZCBlbnRyeQotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9TMzIgLS0gICByZXR1cm5zIHRoZSBtZWRpYW4gdmFsdWUKLSAqLyAKLSAKLU9NWF9TMzIgYXJtTWVkaWFuT2YzICgKLSAgICBPTVhfUzMyIGZFbnRyeSwKLSAgICBPTVhfUzMyIHNFbnRyeSwgCi0gICAgT01YX1MzMiB0RW50cnkgCi0gICAgKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtTG9nU2l6ZQotICoKLSAqIERlc2NyaXB0aW9uOiBGaW5kcyB0aGUgc2l6ZSBvZiBhIHBvc2l0aXZlIHZhbHVlIGFuZCByZXR1cm5zIHRoZSBzYW1lCi0gKiAKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gdmFsdWUgICAgUG9zaXRpdmUgdmFsdWUKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfVTggLS0gICByZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBwb3NpdGl2ZSB2YWx1ZQotICovIAotIAotT01YX1U4IGFybUxvZ1NpemUgKAotICAgIE9NWF9VMTYgdmFsdWUgCi0gICAgKTsgICAgCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgICAgICAvKiBTYXR1cmF0aW5nIEFyaXRobWV0aWMgb3BlcmF0aW9ucyAqLwotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRBZGRfUzMyKCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgYWRkaXRpb24gb2YgdGhlIHR3byBpbnB1dHMgVmFsdWUxLCBWYWx1ZTIKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCi0gKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqIAotICogICAgCi0gKiovCi0KLU9NWF9TMzIgYXJtU2F0QWRkX1MzMigKLSAgICAgICAgICAgICAgICBPTVhfUzMyIFZhbHVlMSwKLSAgICAgICAgICAgICAgICBPTVhfUzMyIFZhbHVlMgotICAgICAgICAgICAgICAgICk7Ci0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdEFkZF9TNjQoKQotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBhZGRpdGlvbiBvZiB0aGUgdHdvIGlucHV0cyBWYWx1ZTEsIFZhbHVlMgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKLSAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogCi0gKiAgICAKLSAqKi8KLQotT01YX1M2NCBhcm1TYXRBZGRfUzY0KAotICAgICAgICAgICAgICAgIE9NWF9TNjQgVmFsdWUxLAotICAgICAgICAgICAgICAgIE9NWF9TNjQgVmFsdWUyCi0gICAgICAgICAgICAgICAgKTsKLQotLyoqIEZ1bmN0aW9uIDphcm1TYXRTdWJfUzMyKCkKLSAqIAotICogRGVzY3JpcHRpb24gOgotICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgc3Vic3RyYWN0aW9uIG9mIHRoZSB0d28gaW5wdXRzIFZhbHVlMSwgVmFsdWUyCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAotICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAKLSAqKi8KLQotT01YX1MzMiBhcm1TYXRTdWJfUzMyKAotICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIFZhbHVlMSwKLSAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBWYWx1ZTIKLSAgICAgICAgICAgICAgICAgICAgKTsKLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0TWFjX1MzMigpCi0gKgotICogRGVzY3JpcHRpb24gOgotICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBNdWx0aXBsaWNhdGlvbiBvZiBWYWx1ZTEgYW5kIFZhbHVlMiBhbmQgc3ViZXNxdWVudCBzYXR1cmF0ZWQKLSAqICAgICBhY2N1bXVsYXRpb24gd2l0aCBNYWMKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCi0gKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAotICogW2luXSBNYWMgICAgICAgICAgQWNjdW11bGF0b3IKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiovCi0KLU9NWF9TMzIgYXJtU2F0TWFjX1MzMigKLSAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBNYWMsCi0gICAgICAgICAgICAgICAgICAgIE9NWF9TMTYgVmFsdWUxLAotICAgICAgICAgICAgICAgICAgICBPTVhfUzE2IFZhbHVlMgotICAgICAgICAgICAgICAgICAgICApOwotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRNYWNfUzE2UzMyX1MzMgotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBNQUMgb3BlcmF0aW9uIG9mIHRoZSB0aHJlZSBpbnB1dHMgZGVsYXlFbGVtLCBmaWxUYXAgLCBtYWMKLSAqCi0gKiAgIG1hYyA9IG1hYyArIFNhdHVyYXRlX2luXzMyQml0cyhkZWxheUVsZW0gKiBmaWxUYXApCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBkZWxheUVsZW0gICAgRmlyc3QgMzIgYml0IE9wZXJhbmQKLSAqIFtpbl0gZmlsVGFwICAgICAgIFNlY29uZCAxNiBiaXQgT3BlcmFuZAotICogW2luXSBtYWMgICAgICAgICAgUmVzdWx0IG9mIE1BQyBvcGVyYXRpb24KLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgbWFjICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAgICAKLSAqKi8KLSAKLU9NWF9TMzIgYXJtU2F0TWFjX1MxNlMzMl9TMzIoCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIG1hYywgCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIGRlbGF5RWxlbSwgCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfUzE2IGZpbFRhcCApOwotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRSb3VuZFJpZ2h0U2hpZnRfUzMyX1MxNgotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHJvdW5kZWQgcmlnaHQgc2hpZnQgb3BlcmF0aW9uIG9mIGlucHV0IGJ5IHRoZSBzY2FsZWZhY3RvcgotICoKLSAqICAgb3V0cHV0ID0gU2F0dXJhdGVfaW5fMTZCaXRzKCAoIFJpZ2h0U2hpZnQoIChSb3VuZChpbnB1dCkgLCBzY2FsZUZhY3RvciApICkKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIGlucHV0ICAgICAgIFRoZSBpbnB1dCB0byBiZSBvcGVyYXRlZCBvbgotICogW2luXSBzY2FsZUZhY3RvciBUaGUgc2hpZnQgbnVtYmVyCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAgICAKLSAqKi8KLQotCi1PTVhfUzE2IGFybVNhdFJvdW5kUmlnaHRTaGlmdF9TMzJfUzE2KAotICAgICAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBpbnB1dCwgCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfSU5UIHNjYWxlRmFjdG9yKTsKLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0Um91bmRMZWZ0U2hpZnRfUzMyKCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRpbmcgbGVmdC1zaGlmdCBvcGVyYXRpb24gb24gaW5wdXQKLSAqICAgICBPciByb3VuZGVkIFJpZ2h0IHNoaWZ0IGlmIHRoZSBpbnB1dCBTaGlmdCBpcyBuZWdhdGl2ZS4KLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIFZhbHVlICAgICAgICBPcGVyYW5kCi0gKiBbaW5dIHNoaWZ0ICAgICAgICBPcGVyYW5kIGZvciBzaGlmdCBvcGVyYXRpb24KLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAgICAKLSAqKi8KLSAKLU9NWF9TMzIgYXJtU2F0Um91bmRMZWZ0U2hpZnRfUzMyKAotICAgICAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JTlQgc2hpZnQKLSAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdFJvdW5kTGVmdFNoaWZ0X1M2NCgpCi0gKgotICogRGVzY3JpcHRpb24gOgotICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0aW5nIGxlZnQtc2hpZnQgb3BlcmF0aW9uIG9uIGlucHV0Ci0gKiAgICAgT3Igcm91bmRlZCBSaWdodCBzaGlmdCBpZiB0aGUgaW5wdXQgU2hpZnQgaXMgbmVnYXRpdmUuCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBWYWx1ZSAgICAgICAgT3BlcmFuZAotICogW2luXSBzaGlmdCAgICAgICAgT3BlcmFuZCBmb3Igc2hpZnQgb3BlcmF0aW9uCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogICAgCi0gKiovCi0gCi1PTVhfUzY0IGFybVNhdFJvdW5kTGVmdFNoaWZ0X1M2NCgKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TNjQgVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfSU5UIHNoaWZ0Ci0gICAgICAgICAgICAgICAgICAgICAgICApOwotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRNdWxTMTZTMzJfUzMyKCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGEgUzE2IGRhdGEgdHlwZSBtdWx0aXBsaWVkIHdpdGggYW4gUzMyIGRhdGEgdHlwZQotICogICAgIGluIGEgUzMyIGNvbnRhaW5lcgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gaW5wdXQxICAgICAgIE9wZXJhbmQgMQotICogW2luXSBpbnB1dDIgICAgICAgT3BlcmFuZCAyCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogICAgCi0gKiovCi0KLQotT01YX1MzMiBhcm1TYXRNdWxTMTZTMzJfUzMyKAotICAgICAgICAgICAgICAgICAgICBPTVhfUzE2IGlucHV0MSwKLSAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBpbnB1dDIpOwotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRNdWxTMzJTMzJfUzMyKCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGEgUzMyIGRhdGEgdHlwZSBtdWx0aXBsaWVkIHdpdGggYW4gUzMyIGRhdGEgdHlwZQotICogICAgIGluIGEgUzMyIGNvbnRhaW5lcgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gaW5wdXQxICAgICAgIE9wZXJhbmQgMQotICogW2luXSBpbnB1dDIgICAgICAgT3BlcmFuZCAyCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogICAgCi0gKiovCi0KLU9NWF9TMzIgYXJtU2F0TXVsUzMyUzMyX1MzMigKLSAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBpbnB1dDEsCi0gICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgaW5wdXQyKTsKLQotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1JbnREaXZBd2F5RnJvbVplcm8oKQotICoKLSAqIERlc2NyaXB0aW9uIDogSW50ZWdlciBkaXZpc2lvbiB3aXRoIHJvdW5kaW5nIHRvIHRoZSBuZWFyZXN0IGludGVnZXIuIAotICogICAgICAgICAgICAgICBIYWxmLWludGVnZXIgdmFsdWVzIGFyZSByb3VuZGVkIGF3YXkgZnJvbSB6ZXJvCi0gKiAgICAgICAgICAgICAgIHVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkLiBGb3IgZXhhbXBsZSAzLy8yIGlzIHJvdW5kZWQgCi0gKiAgICAgICAgICAgICAgIHRvIDIsIGFuZCAtMy8vMiBpcyByb3VuZGVkIHRvIC0yLgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gTnVtICAgICAgICBPcGVyYW5kIDEKLSAqIFtpbl0gRGVubyAgICAgICBPcGVyYW5kIDIKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uIGlucHV0MS8vaW5wdXQyCi0gKiAgICAKLSAqKi8KLQotT01YX1MzMiBhcm1JbnREaXZBd2F5RnJvbVplcm8gKE9NWF9TMzIgTnVtLCBPTVhfUzMyIERlbm8pOwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBEZWJ1Z2dpbmcgbWFjcm9zCi0gKgotICovCi0KLQotLyoKLSAqIERlZmluaXRpb24gb2Ygb3V0cHV0IHN0cmVhbSAtIGNoYW5nZSB0byBzdGRlcnIgaWYgbmVjZXNzYXJ5Ci0gKi8KLSNkZWZpbmUgREVCVUdfU1RSRUFNIHN0ZG91dAotCi0vKgotICogRGVidWcgcHJpbnRmIG1hY3Jvcywgb25lIGZvciBlYWNoIGFyZ3VtZW50IGNvdW50LgotICogQWRkIG1vcmUgaWYgbmVlZGVkLgotICovCi0jaWZkZWYgREVCVUdfT04KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jZGVmaW5lIERFQlVHX1BSSU5URl8wKGEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSkKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzEoYSwgYikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiKQotI2RlZmluZSBERUJVR19QUklOVEZfMihhLCBiLCBjKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMpCi0jZGVmaW5lIERFQlVHX1BSSU5URl8zKGEsIGIsIGMsIGQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCkKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzQoYSwgYiwgYywgZCwgZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlKQotI2RlZmluZSBERUJVR19QUklOVEZfNShhLCBiLCBjLCBkLCBlLCBmKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYpCi0jZGVmaW5lIERFQlVHX1BSSU5URl82KGEsIGIsIGMsIGQsIGUsIGYsIGcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZykKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzcoYSwgYiwgYywgZCwgZSwgZiwgZywgaCkgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoKQotI2RlZmluZSBERUJVR19QUklOVEZfOChhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpKSAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGkpCi0jZGVmaW5lIERFQlVHX1BSSU5URl85KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGopICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaikKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzEwKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGspICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrKQotI2RlZmluZSBERUJVR19QUklOVEZfMTEoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCkgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwpCi0jZGVmaW5lIERFQlVHX1BSSU5URl8xMihhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtKSAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSkKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzEzKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0sIG4pICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtLCBuKQotI2RlZmluZSBERUJVR19QUklOVEZfMTQoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSwgbiwgbykgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0sIG4sIG8pCi0jZWxzZSAvKiBERUJVR19PTiAqLwotI2RlZmluZSBERUJVR19QUklOVEZfMChhKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzEoYSwgYikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0jZGVmaW5lIERFQlVHX1BSSU5URl8yKGEsIGIsIGMpICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotI2RlZmluZSBERUJVR19QUklOVEZfMyhhLCBiLCBjLCBkKSAgICAgICAgICAgICAgICAgICAgICAgICAKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzQoYSwgYiwgYywgZCwgZSkgICAgICAgICAgICAgICAgICAgICAgCi0jZGVmaW5lIERFQlVHX1BSSU5URl81KGEsIGIsIGMsIGQsIGUsIGYpICAgICAgICAgICAgICAgICAgIAotI2RlZmluZSBERUJVR19QUklOVEZfNihhLCBiLCBjLCBkLCBlLCBmLCBnKSAgICAgICAgICAgICAgICAKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzcoYSwgYiwgYywgZCwgZSwgZiwgZywgaCkgICAgICAgICAgICAgCi0jZGVmaW5lIERFQlVHX1BSSU5URl84KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGkpICAgICAgICAgIAotI2RlZmluZSBERUJVR19QUklOVEZfOShhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqKSAgICAgICAKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzEwKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGspICAgIAotI2RlZmluZSBERUJVR19QUklOVEZfMTEoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCkgICAgICAgICAgICAgCi0jZGVmaW5lIERFQlVHX1BSSU5URl8xMihhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtKSAgICAgICAgICAKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzEzKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0sIG4pICAgICAgCi0jZGVmaW5lIERFQlVHX1BSSU5URl8xNChhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtLCBuLCBvKSAgIAotI2VuZGlmIC8qIERFQlVHX09OICovCi0KLQotLyoKLSAqIERvbWFpbiBhbmQgc3ViIGRvbWFpbiBkZWZpbml0aW9ucwotICoKLSAqIEluIG9yZGVyIHRvIHR1cm4gb24gZGVidWcgZm9yIGFuIGVudGlyZSBkb21haW4gb3Igc3ViLWRvbWFpbgotICogYXQgY29tcGlsZSB0aW1lLCBvbmUgb2YgdGhlIERFQlVHX0RPTUFJTl8qIGJlbG93IG1heSBiZSBkZWZpbmVkLAotICogd2hpY2ggd2lsbCBhY3RpdmF0ZSBkZWJ1ZyBpbiBhbGwgb2YgdGhlIGRlZmluZXMgaXQgY29udGFpbnMuCi0gKi8KLQotI2lmZGVmIERFQlVHX0RPTUFJTl9BQwotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVDSEFOUEFJUkVMVF9NUEVHNAotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVDSEFOUEFJUkVMVAotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVEQVRTVFJFTFQKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFRklMTEVMVAotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVJU1NURVJFT19TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFTVNQTlNfUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERU1TU1RFUkVPX1MzMl9JCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERVBSR0NGR0VMVAotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVUTlNfUzMyX0kKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVJTlRFUkxFQVZFU1BFQ1RSVU1fUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX0VOQ09ERVROU19TMzJfSQotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19MT05HVEVSTVBSRURJQ1RfUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX0xPTkdURVJNUkVDT05TVFJVQ1RfUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX01EQ1RGV0RfUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX01EQ1RJTlZfUzMyX1MxNgotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19OT0lTRUxFU1NERUNPREUKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfUVVBTlRJTlZfUzMyX0kKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfVU5QQUNLQURJRkhFQURFUgotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19VTlBBQ0tBRFRTRlJBTUVIRUFERVIKLSNkZWZpbmUgREVCVUdfT01YQUNNUDNfSFVGRk1BTkRFQ09ERVNGQk1CUF9TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNNUDNfSFVGRk1BTkRFQ09ERVNGQl9TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNNUDNfSFVGRk1BTkRFQ09ERV9TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNNUDNfTURDVElOVl9TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNNUDNfUkVRVUFOVElaRVNGQl9TMzJfSQotI2RlZmluZSBERUJVR19PTVhBQ01QM19SRVFVQU5USVpFX1MzMl9JCi0jZGVmaW5lIERFQlVHX09NWEFDTVAzX1NZTlRIUFFNRl9TMzJfUzE2Ci0jZGVmaW5lIERFQlVHX09NWEFDTVAzX1VOUEFDS0ZSQU1FSEVBREVSCi0jZGVmaW5lIERFQlVHX09NWEFDTVAzX1VOUEFDS1NDQUxFRkFDVE9SU19TOAotI2RlZmluZSBERUJVR19PTVhBQ01QM19VTlBBQ0tTSURFSU5GTwotI2VuZGlmIC8qIERFQlVHX0RPTUFJTl9BQyAqLwotCi0KLSNpZmRlZiBERUJVR19ET01BSU5fVkMKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9BVkVSQUdFXzE2WAotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0FWRVJBR0VfNFgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9BVkVSQUdFXzhYCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfREVCTE9DS0NIUk9NQV9VOF9DMUlSCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfREVCTE9DS0xVTUFfVThfQzFJUgotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0RFQ09ERUNIUk9NQURDQ09FRkZTVE9QQUlSQ0FWTENfVTgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9ERUNPREVDT0VGRlNUT1BBSVJDQVZMQ19VOAotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0RFUVVBTlRUUkFOU0ZPUk1BQ0ZST01QQUlSX1U4X1MxNl9DMV9ETFgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9FWFBBTkRGUkFNRQotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0ZJTFRFUkRFQkxPQ0tJTkdDSFJPTUFfSE9SRURHRV9VOF9DMUlSCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfRklMVEVSREVCTE9DS0lOR0NIUk9NQV9WRVJFREdFX1U4X0MxSVIKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9GSUxURVJERUJMT0NLSU5HTFVNQV9IT1JFREdFX1U4X0MxSVIKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9GSUxURVJERUJMT0NLSU5HTFVNQV9WRVJFREdFX1U4X0MxSVIKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9QUkVESUNUSU5UUkFDSFJPTUE4WDhfVThfQzFSCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfUFJFRElDVElOVFJBXzE2WDE2X1U4X0MxUgotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1BSRURJQ1RJTlRSQV80WDRfVThfQzFSCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfU0FEUVVBUl8xNlgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9TQURRVUFSXzRYCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfU0FEUVVBUl84WAotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBRF8xNlgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9TQURfNFgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9TQURfOFgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9TQVREXzRYNAotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1RSQU5TRk9STURFUVVBTlRDSFJPTUFEQ0ZST01QQUlSX1U4X1MxNl9DMQotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1RSQU5TRk9STURFUVVBTlRMVU1BRENGUk9NUEFJUl9VOF9TMTZfQzEKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9UUkFOU0ZPUk1RVUFOVF9DSFJPTUFEQwotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1RSQU5TRk9STVFVQU5UX0xVTUFEQwotI2RlZmluZSBERUJVR19PTVhWQ000UDJfQkxPQ0tNQVRDSF9IQUxGXzE2WDE2Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9CTE9DS01BVENIX0hBTEZfOFg4Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9CTE9DS01BVENIX0lOVEVHRVJfMTZYMTYKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0JMT0NLTUFUQ0hfSU5URUdFUl84WDgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0NPTVBVVEVURVhUVVJFRVJST1JCTE9DS19TQURfVThfUzE2Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9DT01QVVRFVEVYVFVSRUVSUk9SQkxPQ0tfVThfUzE2Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9EQ1Q4WDhCTEtETFgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0RFQ09ERUJMT0NLQ09FRl9JTlRFUl9TMTYKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0RFQ09ERVBBRE1WX1BWT1AKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0RFQ09ERVZMQ1pJR1pBR19JTlRFUl9TMTYKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0RFQ09ERVZMQ1pJR1pBR19JTlRSQUFDVkxDX1MxNgotI2RlZmluZSBERUJVR19PTVhWQ000UDJfREVDT0RFVkxDWklHWkFHX0lOVFJBRENWTENfUzE2Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9FTkNPREVNVl9VOF9TMTYKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0VOQ09ERVZMQ1pJR1pBR19JTlRFUl9TMTYKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0VOQ09ERVZMQ1pJR1pBR19JTlRSQUFDVkxDX1MxNgotI2RlZmluZSBERUJVR19PTVhWQ000UDJfRU5DT0RFVkxDWklHWkFHX0lOVFJBRENWTENfUzE2Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9GSU5ETVZQUkVECi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9JRENUOFg4QkxLRExYCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9MSU1JVE1WVE9SRUNUCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9NT1RJT05FU1RJTUFUSU9OTUIKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1BBRE1CR1JBWV9VOAotI2RlZmluZSBERUJVR19PTVhWQ000UDJfUEFETUJIT1JJWk9OVEFMX1U4Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9QQURNQlZFUlRJQ0FMX1U4Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9QQURNVgotI2RlZmluZSBERUJVR19PTVhWQ000UDJfUVVBTlRJTlRFUl9TMTZfSQotI2RlZmluZSBERUJVR19PTVhWQ000UDJfUVVBTlRJTlRSQV9TMTZfSQotI2RlZmluZSBERUJVR19PTVhWQ000UDJfUVVBTlRJTlZJTlRFUl9TMTZfSQotI2RlZmluZSBERUJVR19PTVhWQ000UDJfUVVBTlRJTlZJTlRSQV9TMTZfSQotI2RlZmluZSBERUJVR19PTVhWQ000UDJfVFJBTlNSRUNCTE9DS0NFT0ZfSU5URVIKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1RSQU5TUkVDQkxPQ0tDRU9GX0lOVFJBCi0jZW5kaWYgLyogREVCVUdfRE9NQUlOX1ZDICovCi0KLQotI2lmZGVmIERFQlVHX0RPTUFJTl9JQwotLyogVG8gYmUgZmlsbGVkIGluICovCi0jZW5kaWYgLyogREVCVUdfRE9NQUlOX0lDICovCi0KLQotI2lmZGVmIERFQlVHX0RPTUFJTl9TUAotI2RlZmluZSBERUJVR19PTVhBQ1NQX0RPVFBST0RfUzE2Ci0jZGVmaW5lIERFQlVHX09NWEFDU1BfQkxPQ0tFWFBfUzE2Ci0jZGVmaW5lIERFQlVHX09NWEFDU1BfQkxPQ0tFWFBfUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfQ09QWV9TMTYKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9ET1RQUk9EX1MxNgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0RPVFBST0RfUzE2X1NGUwotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEZXRF9DVE9DX1NDMTZfU0ZTCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZURldEX0NUT0NfU0MzMl9TRlMKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRGV0RfUlRPQ0NTX1MxNlMzMl9TRlMKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRGV0RfUlRPQ0NTX1MzMl9TRlMKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRHRVRCVUZTSVpFX0NfU0MxNgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEdFVEJVRlNJWkVfQ19TQzMyCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUR0VUQlVGU0laRV9SX1MxNl9TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRHRVRCVUZTSVpFX1JfUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5JVF9DX1NDMTYKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTklUX0NfU0MzMgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOSVRfUl9TMTZfUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5JVF9SX1MzMgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOVl9DQ1NUT1JfUzMyUzE2X1NGUwotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOVl9DQ1NUT1JfUzMyX1NGUwotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOVl9DVE9DX1NDMTZfU0ZTCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5WX0NUT0NfU0MzMl9TRlMKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GSUxURVJNRURJQU5fUzMyX0kKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GSUxURVJNRURJQU5fUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRklST05FX0RJUkVDVF9TMTZfSVNGUwotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUk9ORV9ESVJFQ1RfUzE2X0kKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJPTkVfRElSRUNUX1MxNgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUk9ORV9ESVJFQ1RfUzE2X1NGUwotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUl9ESVJFQ1RfUzE2X0lTRlMKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJfRElSRUNUX1MxNl9JCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRklSX0RJUkVDVF9TMTYKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJfRElSRUNUX1MxNl9TRlMKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJPTkVfQklRVUFERElSRUNUX1MxNl9JCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfSUlST05FX0JJUVVBRERJUkVDVF9TMTYKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJPTkVfRElSRUNUX1MxNl9JCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfSUlST05FX0RJUkVDVF9TMTYKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJfQklRVUFERElSRUNUX1MxNl9JCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfSUlSX0JJUVVBRERJUkVDVF9TMTYKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJfRElSRUNUX1MxNl9JCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfSUlSX0RJUkVDVF9TMTYKLSNlbmRpZiAvKiBERUJVR19ET01BSU5fU1AgKi8KLQotCi0jaWZkZWYgREVCVUdfRE9NQUlOX0lQCi0jZGVmaW5lIERFQlVHX09NWElQQk1fQUREQ19VOF9DMVJfU0ZTCi0jZGVmaW5lIERFQlVHX09NWElQQk1fQ09QWV9VOF9DMVIKLSNkZWZpbmUgREVCVUdfT01YSVBCTV9DT1BZX1U4X0MzUgotI2RlZmluZSBERUJVR19PTVhJUEJNX01JUlJPUl9VOF9DMVIKLSNkZWZpbmUgREVCVUdfT01YSVBCTV9NVUxDX1U4X0MxUl9TRlMKLSNkZWZpbmUgREVCVUdfT01YSVBDU19DT0xPUlRXSVNUUTE0X1U4X0MzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1JHQjU2NVRPWUNCQ1I0MjBMU19NQ1VfVTE2X1MxNl9DM1AzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1JHQjU2NVRPWUNCQ1I0MjJMU19NQ1VfVTE2X1MxNl9DM1AzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1JHQjU2NVRPWUNCQ1I0NDRMU19NQ1VfVTE2X1MxNl9DM1AzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1JHQlRPWUNCQ1I0MjBMU19NQ1VfVThfUzE2X0MzUDNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfUkdCVE9ZQ0JDUjQyMkxTX01DVV9VOF9TMTZfQzNQM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19SR0JUT1lDQkNSNDQ0TFNfTUNVX1U4X1MxNl9DM1AzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIwUlNaUk9UX1U4X1AzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIwVE9SR0I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIwVE9SR0I1NjVfVThfVTE2X1AzQzNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjBUT1JHQkxTX01DVV9TMTZfVThfUDNDM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlJTWkNTQ1JPVFJHQl9VOF9DMlIKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlJTWlJPVF9VOF9QM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlRPUkdCNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlRPUkdCNTY1X1U4X1UxNl9DMkMzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyVE9SR0JMU19NQ1VfUzE2X1U4X1AzQzNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJUT1JHQl9VOF9DMkMzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyVE9ZQ0JDUjQyMFJPVEFURV9VOF9DMlAzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyVE9ZQ0JDUjQyMFJPVEFURV9VOF9QM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQ0NFRPUkdCNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQ0NFRPUkdCTFNfTUNVX1MxNl9VOF9QM0MzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSVE9SR0I1NjVfVThfVTE2X0MzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSVE9SR0I1NjVfVThfVTE2X1AzQzNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1JUT1JHQl9VOF9DM1IKLSNkZWZpbmUgREVCVUdfT01YSVBQUF9HRVRDRU5UUkFMTU9NRU5UX1M2NAotI2RlZmluZSBERUJVR19PTVhJUFBQX0dFVFNQQVRJQUxNT01FTlRfUzY0Ci0jZGVmaW5lIERFQlVHX09NWElQUFBfTU9NRU5UR0VUU1RBVEVTSVpFX1M2NAotI2RlZmluZSBERUJVR19PTVhJUFBQX01PTUVOVElOSVRfUzY0Ci0jZGVmaW5lIERFQlVHX09NWElQUFBfTU9NRU5UUzY0U19VOF9DMVIKLSNkZWZpbmUgREVCVUdfT01YSVBQUF9NT01FTlRTNjRTX1U4X0MzUgotI2VuZGlmIC8qIERFQlVHX0RPTUFJTl9JUCAqLwotCi0KLSNlbmRpZiAvKiBfYXJtQ29tbW9uX0hfICovCi0KLS8qRW5kIG9mIEZpbGUqLwotCi0KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2FwaS9hcm1DT01NX0JpdHN0cmVhbS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9hcGkvYXJtQ09NTV9CaXRzdHJlYW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc2YjY2ZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2FwaS9hcm1DT01NX0JpdHN0cmVhbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1DT01NX0JpdHN0cmVhbS5oCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRmlsZTogYXJtQ09NTV9CaXRzdHJlYW0uaAotICogQnJpZWY6IERlY2xhcmVzIGNvbW1vbiBBUEkncy9EYXRhIHR5cGVzIHVzZWQgYWNyb3NzIHRoZSBPcGVuTWF4IEVuY29kZXJzL0RlY29kZXJzLgotICoKLSAqLwotCi0jaWZuZGVmIF9hcm1Db2RlY19IXwotI2RlZmluZSBfYXJtQ29kZWNfSF8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBPTVhfVTggICBjb2RlTGVuOwotICAgIE9NWF9VMzIJIGNvZGVXb3JkOwotfSBBUk1fVkxDMzI7Ci0KLS8qIFRoZSBhYm92ZSBzaG91bGQgYmUgcmVuYW1lZCBhcyAiQVJNX1ZMQzMyIiAqLwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1Mb29rQWhlYWRCaXRzKCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIEdldCB0aGUgbmV4dCBOIGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtIHdpdGhvdXQgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlcgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICAgICAqKnBwQml0U3RyZWFtCi0gKiBbaW5dICAgICAqcE9mZnNldAotICogW2luXSAgICAgTj0xLi4uMzIKLSAqCi0gKiBSZXR1cm5zICBWYWx1ZQotICovCi0KLU9NWF9VMzIgYXJtTG9va0FoZWFkQml0cyhjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwgT01YX0lOVCAqcE9mZnNldCwgT01YX0lOVCBOKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtR2V0Qml0cygpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBSZWFkIE4gYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0KLSAqICAgIAotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQotICogW2luXSAgICAgKnBPZmZzZXQKLSAqIFtpbl0gICAgIE49MS4uMzIKLSAqCi0gKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KLSAqIFtvdXRdICAgICpwT2Zmc2V0Ci0gKiBSZXR1cm5zICBWYWx1ZQotICovCi0KLU9NWF9VMzIgYXJtR2V0Qml0cyhjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwgT01YX0lOVCAqcE9mZnNldCwgT01YX0lOVCBOKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtQnl0ZUFsaWduKCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIEFsaWduIHRoZSBwb2ludGVyICpwcEJpdFN0cmVhbSB0byB0aGUgbmV4dCBieXRlIGJvdW5kYXJ5Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQotICogW2luXSAgICAgKnBPZmZzZXQKLSAqCi0gKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KLSAqIFtvdXRdICAgICpwT2Zmc2V0Ci0gKgotICoqLwotIAotT01YVm9pZCBhcm1CeXRlQWxpZ24oY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sT01YX0lOVCAqcE9mZnNldCk7Ci0KLS8qKiAKLSAqIEZ1bmN0aW9uOiBhcm1Ta2lwQml0cygpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBTa2lwIE4gYml0cyBmcm9tIHRoZSB2YWx1ZSBhdCAqcHBCaXRTdHJlYW0KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgICAgKnBwQml0U3RyZWFtCi0gKiBbaW5dICAgICAqcE9mZnNldAotICogW2luXSAgICAgTgotICoKLSAqIFtvdXRdICAgICpwcEJpdFN0cmVhbQotICogW291dF0gICAgKnBPZmZzZXQKLSAqCi0gKiovCi0KLU9NWFZvaWQgYXJtU2tpcEJpdHMoY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sT01YX0lOVCAqcE9mZnNldCxPTVhfSU5UIE4pOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBWYXJpYWJsZSBiaXQgbGVuZ3RoIERlY29kZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVW5QYWNrVkxDMzIoKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVmFyaWFibGUgbGVuZ3RoIGRlY29kZSBvZiB2YXJpYWJsZSBsZW5ndGggc3ltYm9sIChtYXggc2l6ZSAzMiBiaXRzKSByZWFkIGZyb20KLSAqIHRoZSBiaXQgc3RyZWFtIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIGF0ICpwT2Zmc2V0IGJ5IHVzaW5nIHRoZSB0YWJsZQotICogcG9pbnRlZCBieSBwQ29kZUJvb2sKLSAqIAotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gICAgICoqcHBCaXRTdHJlYW0KLSAqIFtpbl0gICAgICpwT2Zmc2V0Ci0gKiBbaW5dICAgICBwQ29kZUJvb2sKLSAqIAotICogW291dF0gICAgKipwcEJpdFN0cmVhbQotICogW291dF0gICAgKnBPZmZzZXQKLSAqCi0gKiBSZXR1cm5zIDogQ29kZSBCb29rIEluZGV4IGlmIHN1Y2Nlc3NmdWxsLiAKLSAqICAgICAgICAgOiAiQVJNX05PX0NPREVCT09LX0lOREVYID0gMHhGRkZGIiBpZiBzZWFyY2ggZmFpbHMuCi0gKiovCi0KLSNkZWZpbmUgQVJNX05PX0NPREVCT09LX0lOREVYIChPTVhfVTE2KSgweEZGRkYpCi0KLU9NWF9VMTYgYXJtVW5QYWNrVkxDMzIoCi0gICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgT01YX0lOVCAqcE9mZnNldCwKLSAgICBjb25zdCBBUk1fVkxDMzIgKnBDb2RlQm9vawotKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRml4ZWQgYml0IGxlbmd0aCBFbmNvZGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogRnVuY3Rpb246IGFybVBhY2tCaXRzCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQYWNrIGEgVkxDIGNvZGUgd29yZCBpbnRvIHRoZSBiaXRzdHJlYW0KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbS4KLSAqIFtpbl0JcE9mZnNldAkgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSAKLSAqICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMAotICogICAgICAgICAgICAgICAgICAgICAgdG8gNy4KLSAqIFtpbl0JY29kZVdvcmQJCUNvZGUgd29yZCB0aGF0IG5lZWQgdG8gYmUgaW5zZXJ0ZWQgaW4gdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtCi0gKiBbaW5dCWNvZGVMZW5ndGgJCUxlbmd0aCBvZiB0aGUgY29kZSB3b3JkIHZhbGlkIHJhbmdlIDEuLi4zMgotICoKLSAqIFtvdXRdIHBwQml0U3RyZWFtCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLAotICoJICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0Ci0gKgkJCQkJCQlzdHJlYW0gYnVmZmVyLgotICogW291dF0gcEJpdE9mZnNldAkJKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKLSAqCQkJCQkJCWN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKLSAqCQkJCQkJCSpwcEJpdFN0cmVhbS4KLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhfUkVTVUxUIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0gCi1PTVhSZXN1bHQgYXJtUGFja0JpdHMgKAotICAgIE9NWF9VOCAgKipwcEJpdFN0cmVhbSwgCi0gICAgT01YX0lOVCAqcE9mZnNldCwKLSAgICBPTVhfVTMyIGNvZGVXb3JkLCAKLSAgICBPTVhfSU5UIGNvZGVMZW5ndGggCi0pOwotIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVmFyaWFibGUgYml0IGxlbmd0aCBFbmNvZGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogRnVuY3Rpb246IGFybVBhY2tWTEMzMgotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGFjayBhIFZMQyBjb2RlIHdvcmQgaW50byB0aGUgYml0c3RyZWFtCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIAotICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0uCi0gKiBbaW5dCXBCaXRPZmZzZXQJICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSAKLSAqICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMAotICogICAgICAgICAgICAgICAgICAgICAgdG8gNy4KLSAqIFtpbl0JIGNvZGUgICAgIAkJVkxDIGNvZGUgd29yZCB0aGF0IG5lZWQgdG8gYmUgaW5zZXJ0ZWQgaW4gdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICBiaXRzdHJlYW0KLSAqCi0gKiBbb3V0XSBwcEJpdFN0cmVhbQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwKLSAqCSAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0Ci0gKgkJCQkJCXN0cmVhbSBidWZmZXIuCi0gKiBbb3V0XSBwQml0T2Zmc2V0CQkqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQotICoJCQkJCQljdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Ci0gKgkJCQkJCSpwcEJpdFN0cmVhbS4KLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhfUkVTVUxUIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0gCi1PTVhSZXN1bHQgYXJtUGFja1ZMQzMyICgKLSAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwgCi0gICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICBBUk1fVkxDMzIgY29kZSAKLSk7Ci0KLSNlbmRpZiAgICAgIC8qX2FybUNvZGVjX0hfKi8KLQotLypFbmQgb2YgRmlsZSovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2FwaS9hcm1DT01NX1ZlcnNpb24uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvYXBpL2FybUNPTU1fVmVyc2lvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTlhNDUwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvYXBpL2FybUNPTU1fVmVyc2lvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyogR3VhcmQgdGhlIGhlYWRlciBhZ2FpbnN0IG11bHRpcGxlIGluY2x1c2lvbi4gKi8KLSNpZm5kZWYgX19BUk1fQ09NTV9WRVJTSU9OX0hfXwotI2RlZmluZSBfX0FSTV9DT01NX1ZFUlNJT05fSF9fCi0KLQotLyogVGhlIGZvbGxvd2luZyBsaW5lIHNob3VsZCBiZSBpbiBvbXh0eXBlcy5oIGJ1dCBoYXNuJ3QgYmVlbiBhcHByb3ZlZCBieSBPcGVuTUFYIHlldCAqLwotI2RlZmluZSBPTVhfVkVSU0lPTiAxMDIKLQotLyogV2UgbmVlZCB0byBkZWZpbmUgdGhlc2UgbWFjcm9zIGluIG9yZGVyIHRvIGNvbnZlcnQgYSAjZGVmaW5lIG51bWJlciBpbnRvIGEgI2RlZmluZSBzdHJpbmcuICovCi0jZGVmaW5lIEFSTV9RVU9URShhKSAjYQotI2RlZmluZSBBUk1fSU5ESVJFQ1QoQSkgQVJNX1FVT1RFKEEpCi0KLS8qIENvbnZlcnQgdGhlIE9NWF9WRVJTSU9OIG51bWJlciBpbnRvIGEgc3RyaW5nIHRoYXQgY2FuIGJlIHVzZWQsIGZvciBleGFtcGxlLCB0byBwcmludCBpdCBvdXQuICovCi0jZGVmaW5lIEFSTV9WRVJTSU9OX1NUUklORyBBUk1fSU5ESVJFQ1QoT01YX1ZFUlNJT04pCi0KLQotLyogRGVmaW5lIHRoaXMgaW4gb3JkZXIgdG8gdHVybiBvbiBBUk0gdmVyc2lvbi9yZWxlYXNlL2J1aWxkIHN0cmluZ3MgaW4gZWFjaCBkb21haW4gKi8KLSNkZWZpbmUgQVJNX0lOQ0xVREVfVkVSU0lPTl9ERVNDUklQVElPTlMKLQotI2lmZGVmIEFSTV9JTkNMVURFX1ZFUlNJT05fREVTQ1JJUFRJT05TCi0gIGV4dGVybiBjb25zdCBjaGFyICogY29uc3Qgb214QUNfVmVyc2lvbkRlc2NyaXB0aW9uOwotICBleHRlcm4gY29uc3QgY2hhciAqIGNvbnN0IG9teElDX1ZlcnNpb25EZXNjcmlwdGlvbjsKLSAgZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb25zdCBvbXhJUF9WZXJzaW9uRGVzY3JpcHRpb247Ci0gIGV4dGVybiBjb25zdCBjaGFyICogY29uc3Qgb214U1BfVmVyc2lvbkRlc2NyaXB0aW9uOwotICBleHRlcm4gY29uc3QgY2hhciAqIGNvbnN0IG9teFZDX1ZlcnNpb25EZXNjcmlwdGlvbjsKLSNlbmRpZiAvKiBBUk1fSU5DTFVERV9WRVJTSU9OX0RFU0NSSVBUSU9OUyAqLwotCi0KLS8qIFRoZSBmb2xsb3dpbmcgZW50cmllcyBzaG91bGQgYmUgYXV0b21hdGljYWxseSB1cGRhdGVkIGJ5IHRoZSByZWxlYXNlIHNjcmlwdCAqLwotLyogVGhleSBhcmUgdXNlZCBpbiB0aGUgQVJNIHZlcnNpb24gc3RyaW5ncyBkZWZpbmVkIGZvciBlYWNoIGRvbWFpbi4gICAgICAgICAgICAgKi8KLQotLyogVGhlIHJlbGVhc2UgdGFnIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlbGVhc2Ugb2YgdGhlIGxpYnJhcnkuIC0gdXNlZCBmb3Igc291cmNlIGFuZCBvYmplY3QgcmVsZWFzZXMgKi8KLSNkZWZpbmUgT01YX0FSTV9SRUxFQVNFX1RBRyAgInIwcDAtMDBiZXQxIgotCi0vKiBUaGUgQVJNIGFyY2hpdGVjdHVyZSB1c2VkIHRvIGJ1aWxkIGFueSBvYmplY3RzIG9yIGV4ZWN1dGFibGVzIGluIHRoaXMgcmVsZWFzZS4gKi8KLSNkZWZpbmUgT01YX0FSTV9CVUlMRF9BUkNISVRFQ1RVUkUgIkFOU0kgQyIKLQotLyogVGhlIEFSTSBUb29sY2hhaW4gdXNlZCB0byBidWlsZCBhbnkgb2JqZWN0cyBvciBleGVjdXRhYmxlcyBpbiB0aGlzIHJlbGVhc2UuICovCi0jZGVmaW5lIE9NWF9BUk1fQlVJTERfVE9PTENIQUlOICAgICJBUk0gUlZDVCAzLjEiCi0KLQotI2VuZGlmIC8qIF9fQVJNX0NPTU1fVkVSU0lPTl9IX18gKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9hcGkvYXJtT01YLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2FwaS9hcm1PTVguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdjMGMyNi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2FwaS9hcm1PTVguaAorKysgL2Rldi9udWxsCkBAIC0xLDI4OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtT01YX1JlbGVhc2VWZXJzaW9uLmgKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBUaGlzIGZpbGUgYWxsb3dzIGEgdmVyc2lvbiBvZiB0aGUgT01YIERMIGxpYnJhcmllcyB0byBiZSBidWlsdCB3aGVyZSBzb21lIG9yCi0gKiBhbGwgb2YgdGhlIGZ1bmN0aW9uIG5hbWVzIGNhbiBiZSBnaXZlbiBhIHVzZXIgc3BlY2lmaWVkIHN1ZmZpeC4gCi0gKgotICogWW91IG1pZ2h0IHdhbnQgdG8gdXNlIGl0IHdoZXJlOgotICoKLSAqIC0geW91IHdhbnQgdG8gcmVuYW1lIGEgZnVuY3Rpb24gIm91dCBvZiB0aGUgd2F5IiBzbyB0aGF0IHlvdSBjb3VsZCByZXBsYWNlCi0gKiAgIGEgZnVuY3Rpb24gd2l0aCBhIGRpZmZlcmVudCB2ZXJzaW9uICh0aGUgb3JpZ2luYWwgdmVyc2lvbiB3b3VsZCBzdGlsbCBiZQotICogICBpbiB0aGUgbGlicmFyeSBqdXN0IHdpdGggYSBkaWZmZXJlbnQgbmFtZSAtIHNvIHlvdSBjb3VsZCBkZWJ1ZyB0aGUgbmV3Ci0gKiAgIHZlcnNpb24gYnkgY29tcGFyaW5nIGl0IHRvIHRoZSBvdXRwdXQgb2YgdGhlIG9sZCkKLSAqCi0gKiAtIHlvdSB3YW50IHRvIHJlbmFtZSBhbGwgdGhlIGZ1bmN0aW9ucyB0byB2ZXJzaW9ucyB3aXRoIGEgc3VmZml4IHNvIHRoYXQgCi0gKiAgIHlvdSBjYW4gaW5jbHVkZSB0d28gdmVyc2lvbnMgb2YgdGhlIGxpYnJhcnkgYW5kIGNob29zZSBiZXR3ZWVuIGZ1bmN0aW9ucwotICogICBhdCBydW50aW1lLgotICoKLSAqICAgICBlLmcuIG9teElQQk1fQ29weV9VOF9DMVIgY291bGQgYmUgcmVuYW1lZCBvbXhJUEJNX0NvcHlfVThfQzFSX0NvcnRleEE4Ci0gKiAKLSAqLwotCi0gIAotI2lmbmRlZiBfYXJtT01YX0hfCi0jZGVmaW5lIF9hcm1PTVhfSF8KLQotCi0vKiBXZSBuZWVkIHRvIGRlZmluZSB0aGVzZSB0d28gbWFjcm9zIGluIG9yZGVyIHRvIGV4cGFuZCBhbmQgY29uY2F0ZW5hdGUgdGhlIG5hbWVzICovCi0jZGVmaW5lIE9NWENBVDJCQVIoQSwgQikgb214ICMjIEEgIyMgQgotI2RlZmluZSBPTVhDQVRCQVIoQSwgQikgT01YQ0FUMkJBUihBLCBCKQotCi0vKiBEZWZpbmUgdGhlIHN1ZmZpeCB0byBhZGQgdG8gYWxsIGZ1bmN0aW9ucyAtIHRoZSBkZWZhdWx0IGlzIG5vIHN1ZmZpeCAqLwotI2RlZmluZSBCQVJFX1NVRkZJWCAKLQotCi0KLS8qIERlZmluZSB3aGF0IGhhcHBlbnMgdG8gdGhlIGJhcmUgc3VmZml4LWxlc3MgZnVuY3Rpb25zLCBkb3duIHRvIHRoZSBzdWItZG9tYWluIGFjY3VyYWN5ICovCi0jZGVmaW5lIE9NWEFDQUFDX1NVRkZJWCAgICBCQVJFX1NVRkZJWCAgIAotI2RlZmluZSBPTVhBQ01QM19TVUZGSVggICAgQkFSRV9TVUZGSVgKLSNkZWZpbmUgT01YSUNKUF9TVUZGSVggICAgIEJBUkVfU1VGRklYCi0jZGVmaW5lIE9NWElQQk1fU1VGRklYICAgICBCQVJFX1NVRkZJWAotI2RlZmluZSBPTVhJUENTX1NVRkZJWCAgICAgQkFSRV9TVUZGSVgKLSNkZWZpbmUgT01YSVBQUF9TVUZGSVggICAgIEJBUkVfU1VGRklYCi0jZGVmaW5lIE9NWFNQX1NVRkZJWCAgICAgICBCQVJFX1NVRkZJWAotI2RlZmluZSBPTVhWQ0NPTU1fU1VGRklYICAgQkFSRV9TVUZGSVgKLSNkZWZpbmUgT01YVkNNNFAxMF9TVUZGSVggIEJBUkVfU1VGRklYCi0jZGVmaW5lIE9NWFZDTTRQMl9TVUZGSVggICBCQVJFX1NVRkZJWAotCi0KLQotCi0vKiBEZWZpbmUgd2hhdCB0aGUgZWFjaCBiYXJlLCB1bi1zdWZmaXhlZCBPcGVuTUFYIEFQSSBmdW5jdGlvbiBuYW1lcyBpcyB0byBiZSByZW5hbWVkICovCi0jZGVmaW5lIG9teEFDQUFDX0RlY29kZUNoYW5QYWlyRWx0ICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZUNoYW5QYWlyRWx0LCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX0RlY29kZURhdFN0ckVsdCAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZURhdFN0ckVsdCwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVGaWxsRWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVGaWxsRWx0LCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX0RlY29kZUlzU3RlcmVvX1MzMiAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZUlzU3RlcmVvX1MzMiwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVNc1BOU19TMzJfSSAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVNc1BOU19TMzJfSSwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVNc1N0ZXJlb19TMzJfSSAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVNc1N0ZXJlb19TMzJfSSwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVQcmdDZmdFbHQgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVQcmdDZmdFbHQsIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfRGVjb2RlVE5TX1MzMl9JICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlVE5TX1MzMl9JLCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX0RlaW50ZXJsZWF2ZVNwZWN0cnVtX1MzMiAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlaW50ZXJsZWF2ZVNwZWN0cnVtX1MzMiwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19FbmNvZGVUTlNfUzMyX0kgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19FbmNvZGVUTlNfUzMyX0ksIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfTG9uZ1Rlcm1QcmVkaWN0X1MzMiAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfTG9uZ1Rlcm1QcmVkaWN0X1MzMiwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19Mb25nVGVybVJlY29uc3RydWN0X1MzMl9JICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19Mb25nVGVybVJlY29uc3RydWN0X1MzMl9JLCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX01EQ1RGd2RfUzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX01EQ1RGd2RfUzMyLCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX01EQ1RJbnZfUzMyX1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX01EQ1RJbnZfUzMyX1MxNiwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19Ob2lzZWxlc3NEZWNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19Ob2lzZWxlc3NEZWNvZGUsIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfUXVhbnRJbnZfUzMyX0kgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfUXVhbnRJbnZfUzMyX0ksIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfVW5wYWNrQURJRkhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfVW5wYWNrQURJRkhlYWRlciwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19VbnBhY2tBRFRTRnJhbWVIZWFkZXIgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19VbnBhY2tBRFRTRnJhbWVIZWFkZXIsIE9NWEFDQUFDX1NVRkZJWCkKLQotCi0jZGVmaW5lIG9teEFDTVAzX0h1ZmZtYW5EZWNvZGVfUzMyICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX0h1ZmZtYW5EZWNvZGVfUzMyLCBPTVhBQ01QM19TVUZGSVgpCi0jZGVmaW5lIG9teEFDTVAzX0h1ZmZtYW5EZWNvZGVTZmJfUzMyICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX0h1ZmZtYW5EZWNvZGVTZmJfUzMyLCBPTVhBQ01QM19TVUZGSVgpCi0jZGVmaW5lIG9teEFDTVAzX0h1ZmZtYW5EZWNvZGVTZmJNYnBfUzMyICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX0h1ZmZtYW5EZWNvZGVTZmJNYnBfUzMyLCBPTVhBQ01QM19TVUZGSVgpCi0jZGVmaW5lIG9teEFDTVAzX01EQ1RJbnZfUzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX01EQ1RJbnZfUzMyLCBPTVhBQ01QM19TVUZGSVgpCi0jZGVmaW5lIG9teEFDTVAzX1JlUXVhbnRpemVfUzMyX0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX1JlUXVhbnRpemVfUzMyX0ksIE9NWEFDTVAzX1NVRkZJWCkKLSNkZWZpbmUgb214QUNNUDNfUmVRdWFudGl6ZVNmYl9TMzJfSSAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfUmVRdWFudGl6ZVNmYl9TMzJfSSwgT01YQUNNUDNfU1VGRklYKQotI2RlZmluZSBvbXhBQ01QM19TeW50aFBRTUZfUzMyX1MxNiAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19TeW50aFBRTUZfUzMyX1MxNiwgT01YQUNNUDNfU1VGRklYKQotI2RlZmluZSBvbXhBQ01QM19VbnBhY2tGcmFtZUhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19VbnBhY2tGcmFtZUhlYWRlciwgT01YQUNNUDNfU1VGRklYKQotI2RlZmluZSBvbXhBQ01QM19VbnBhY2tTY2FsZUZhY3RvcnNfUzggICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19VbnBhY2tTY2FsZUZhY3RvcnNfUzgsIE9NWEFDTVAzX1NVRkZJWCkKLSNkZWZpbmUgb214QUNNUDNfVW5wYWNrU2lkZUluZm8gICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfVW5wYWNrU2lkZUluZm8sIE9NWEFDTVAzX1NVRkZJWCkKLQotI2RlZmluZSBvbXhJQ0pQX0NvcHlFeHBhbmRfVThfQzMgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0NvcHlFeHBhbmRfVThfQzMsIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RDVEZ3ZF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVEZ3ZF9TMTYsIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RDVEZ3ZF9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVEZ3ZF9TMTZfSSwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRENUSW52X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUSW52X1MxNiwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRENUSW52X1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUSW52X1MxNl9JLCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEZ3ZF9NdWx0aXBsZV9TMTYgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEZ3ZF9NdWx0aXBsZV9TMTYsIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50RndkX1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50RndkX1MxNiwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRENUUXVhbnRGd2RfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRGd2RfUzE2X0ksIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50RndkVGFibGVJbml0ICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50RndkVGFibGVJbml0LCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEludl9NdWx0aXBsZV9TMTYgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEludl9NdWx0aXBsZV9TMTYsIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50SW52X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50SW52X1MxNiwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRENUUXVhbnRJbnZfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRJbnZfUzE2X0ksIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50SW52VGFibGVJbml0ICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50SW52VGFibGVJbml0LCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9EZWNvZGVIdWZmbWFuOHg4X0RpcmVjdF9TMTZfQzEgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EZWNvZGVIdWZmbWFuOHg4X0RpcmVjdF9TMTZfQzEsIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RlY29kZUh1ZmZtYW5TcGVjR2V0QnVmU2l6ZV9VOCAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RlY29kZUh1ZmZtYW5TcGVjR2V0QnVmU2l6ZV9VOCwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRGVjb2RlSHVmZm1hblNwZWNJbml0X1U4ICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRGVjb2RlSHVmZm1hblNwZWNJbml0X1U4LCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9FbmNvZGVIdWZmbWFuOHg4X0RpcmVjdF9TMTZfVTFfQzEgICAgICAgICBPTVhDQVRCQVIoSUNKUF9FbmNvZGVIdWZmbWFuOHg4X0RpcmVjdF9TMTZfVTFfQzEsIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0VuY29kZUh1ZmZtYW5TcGVjR2V0QnVmU2l6ZV9VOCAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0VuY29kZUh1ZmZtYW5TcGVjR2V0QnVmU2l6ZV9VOCwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRW5jb2RlSHVmZm1hblNwZWNJbml0X1U4ICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRW5jb2RlSHVmZm1hblNwZWNJbml0X1U4LCBPTVhJQ0pQX1NVRkZJWCkKLQotI2RlZmluZSBvbXhJUEJNX0FkZENfVThfQzFSX1NmcyAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUEJNX0FkZENfVThfQzFSX1NmcywgT01YSVBCTV9TVUZGSVgpCi0jZGVmaW5lIG9teElQQk1fQ29weV9VOF9DMVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQk1fQ29weV9VOF9DMVIsIE9NWElQQk1fU1VGRklYKQotI2RlZmluZSBvbXhJUEJNX0NvcHlfVThfQzNSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUEJNX0NvcHlfVThfQzNSLCBPTVhJUEJNX1NVRkZJWCkKLSNkZWZpbmUgb214SVBCTV9NaXJyb3JfVThfQzFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBCTV9NaXJyb3JfVThfQzFSLCBPTVhJUEJNX1NVRkZJWCkKLSNkZWZpbmUgb214SVBCTV9NdWxDX1U4X0MxUl9TZnMgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBCTV9NdWxDX1U4X0MxUl9TZnMsIE9NWElQQk1fU1VGRklYKQotCi0jZGVmaW5lIG9teElQQ1NfQ29sb3JUd2lzdFExNF9VOF9DM1IgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfQ29sb3JUd2lzdFExNF9VOF9DM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX0JHUjU2NVRvWUNiQ3I0MjBMU19NQ1VfVTE2X1MxNl9DM1AzUiAgICAgIE9NWENBVEJBUihJUENTX0JHUjU2NVRvWUNiQ3I0MjBMU19NQ1VfVTE2X1MxNl9DM1AzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfQkdSNTY1VG9ZQ2JDcjQyMkxTX01DVV9VMTZfUzE2X0MzUDNSICAgICAgT01YQ0FUQkFSKElQQ1NfQkdSNTY1VG9ZQ2JDcjQyMkxTX01DVV9VMTZfUzE2X0MzUDNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19CR1I1NjVUb1lDYkNyNDQ0TFNfTUNVX1UxNl9TMTZfQzNQM1IgICAgICBPTVhDQVRCQVIoSVBDU19CR1I1NjVUb1lDYkNyNDQ0TFNfTUNVX1UxNl9TMTZfQzNQM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX0JHUjg4OFRvWUNiQ3I0MjBMU19NQ1VfVThfUzE2X0MzUDNSICAgICAgIE9NWENBVEJBUihJUENTX0JHUjg4OFRvWUNiQ3I0MjBMU19NQ1VfVThfUzE2X0MzUDNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19CR1I4ODhUb1lDYkNyNDIyTFNfTUNVX1U4X1MxNl9DM1AzUiAgICAgICBPTVhDQVRCQVIoSVBDU19CR1I4ODhUb1lDYkNyNDIyTFNfTUNVX1U4X1MxNl9DM1AzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfQkdSODg4VG9ZQ2JDcjQ0NExTX01DVV9VOF9TMTZfQzNQM1IgICAgICAgT01YQ0FUQkFSKElQQ1NfQkdSODg4VG9ZQ2JDcjQ0NExTX01DVV9VOF9TMTZfQzNQM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDIwUnN6Q3NjUm90QkdSX1U4X1AzQzNSICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIwUnN6Q3NjUm90QkdSX1U4X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMFJzelJvdF9VOF9QM1IgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMFJzelJvdF9VOF9QM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDIwVG9CR1I1NjVfVThfVTE2X1AzQzNSICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIwVG9CR1I1NjVfVThfVTE2X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMFRvQkdSNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMFRvQkdSNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDIwVG9CR1I4ODhMU19NQ1VfUzE2X1U4X1AzQzNSICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIwVG9CR1I4ODhMU19NQ1VfUzE2X1U4X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMlJzekNzY1JvdEJHUl9VOF9QM0MzUiAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMlJzekNzY1JvdEJHUl9VOF9QM0MzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfQ2JZQ3JZNDIyUnN6Q3NjUm90QkdSX1U4X1UxNl9DMlIgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfQ2JZQ3JZNDIyUnN6Q3NjUm90QkdSX1U4X1UxNl9DMlIsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDIyUnN6Um90X1U4X1AzUiAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIyUnN6Um90X1U4X1AzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiWUNyNDIyVG9CR1I1NjVfVThfVTE2X0MyQzNSICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiWUNyNDIyVG9CR1I1NjVfVThfVTE2X0MyQzNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMlRvQkdSNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMlRvQkdSNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYllDcjQyMlRvQkdSODg4X1U4X0MyQzNSICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYllDcjQyMlRvQkdSODg4X1U4X0MyQzNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMlRvQkdSODg4TFNfTUNVX1MxNl9VOF9QM0MzUiAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMlRvQkdSODg4TFNfTUNVX1MxNl9VOF9QM0MzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjJUb0JHUjg4OExTX01DVV9TMTZfVThfUDNDM1IgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjJUb0JHUjg4OExTX01DVV9TMTZfVThfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX0NiWUNyWTQyMlRvWUNiQ3I0MjBSb3RhdGVfVThfQzJQM1IgICAgICAgIE9NWENBVEJBUihJUENTX0NiWUNyWTQyMlRvWUNiQ3I0MjBSb3RhdGVfVThfQzJQM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDIyVG9ZQ2JDcjQyMFJvdGF0ZV9VOF9QM1IgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIyVG9ZQ2JDcjQyMFJvdGF0ZV9VOF9QM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDQ0VG9CR1I1NjVfVThfVTE2X0MzUiAgICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDQ0VG9CR1I1NjVfVThfVTE2X0MzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiQ3I0NDRUb0JHUjU2NV9VOF9VMTZfUDNDM1IgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0NDRUb0JHUjU2NV9VOF9VMTZfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDQ0VG9CR1I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUiAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDQ0VG9CR1I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiQ3I0NDRUb0JHUjg4OF9VOF9DM1IgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0NDRUb0JHUjg4OF9VOF9DM1IsIE9NWElQQ1NfU1VGRklYKQotCi0jZGVmaW5lIG9teElQUFBfRGVibG9ja19Ib3JFZGdlX1U4X0kgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfRGVibG9ja19Ib3JFZGdlX1U4X0ksIE9NWElQUFBfU1VGRklYKQotI2RlZmluZSBvbXhJUFBQX0RlYmxvY2tfVmVyRWRnZV9VOF9JICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX0RlYmxvY2tfVmVyRWRnZV9VOF9JLCBPTVhJUFBQX1NVRkZJWCkKLSNkZWZpbmUgb214SVBQUF9GaWx0ZXJGSVJfVThfQzFSICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9GaWx0ZXJGSVJfVThfQzFSLCBPTVhJUFBQX1NVRkZJWCkKLSNkZWZpbmUgb214SVBQUF9GaWx0ZXJNZWRpYW5fVThfQzFSICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9GaWx0ZXJNZWRpYW5fVThfQzFSLCBPTVhJUFBQX1NVRkZJWCkKLSNkZWZpbmUgb214SVBQUF9HZXRDZW50cmFsTW9tZW50X1M2NCAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9HZXRDZW50cmFsTW9tZW50X1M2NCwgT01YSVBQUF9TVUZGSVgpCi0jZGVmaW5lIG9teElQUFBfR2V0U3BhdGlhbE1vbWVudF9TNjQgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfR2V0U3BhdGlhbE1vbWVudF9TNjQsIE9NWElQUFBfU1VGRklYKQotI2RlZmluZSBvbXhJUFBQX01vbWVudEdldFN0YXRlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX01vbWVudEdldFN0YXRlU2l6ZSwgT01YSVBQUF9TVUZGSVgpCi0jZGVmaW5lIG9teElQUFBfTW9tZW50SW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfTW9tZW50SW5pdCwgT01YSVBQUF9TVUZGSVgpCi0jZGVmaW5lIG9teElQUFBfTW9tZW50c19VOF9DMVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfTW9tZW50c19VOF9DMVIsIE9NWElQUFBfU1VGRklYKQotI2RlZmluZSBvbXhJUFBQX01vbWVudHNfVThfQzNSICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX01vbWVudHNfVThfQzNSLCBPTVhJUFBQX1NVRkZJWCkKLQotI2RlZmluZSBvbXhTUF9CbG9ja0V4cF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9CbG9ja0V4cF9TMTYsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfQmxvY2tFeHBfUzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfQmxvY2tFeHBfUzMyLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0NvcHlfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0NvcHlfUzE2LCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0RvdFByb2RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0RvdFByb2RfUzE2LCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0RvdFByb2RfUzE2X1NmcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0RvdFByb2RfUzE2X1NmcywgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRGd2RfQ1RvQ19TQzE2X1NmcyAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRGd2RfQ1RvQ19TQzE2X1NmcywgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRGd2RfQ1RvQ19TQzMyX1NmcyAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRGd2RfQ1RvQ19TQzMyX1NmcywgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRGd2RfUlRvQ0NTX1MxNlMzMl9TZnMgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRGd2RfUlRvQ0NTX1MxNlMzMl9TZnMsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRkZURndkX1JUb0NDU19TMzJfU2ZzICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZURndkX1JUb0NDU19TMzJfU2ZzLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEdldEJ1ZlNpemVfQ19TQzE2ICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEdldEJ1ZlNpemVfQ19TQzE2LCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEdldEJ1ZlNpemVfQ19TQzMyICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEdldEJ1ZlNpemVfQ19TQzMyLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEdldEJ1ZlNpemVfUl9TMTZTMzIgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEdldEJ1ZlNpemVfUl9TMTZTMzIsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRkZUR2V0QnVmU2l6ZV9SX1MzMiAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUR2V0QnVmU2l6ZV9SX1MzMiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRJbml0X0NfU0MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbml0X0NfU0MxNiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRJbml0X0NfU0MzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbml0X0NfU0MzMiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRJbml0X1JfUzE2UzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbml0X1JfUzE2UzMyLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEluaXRfUl9TMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEluaXRfUl9TMzIsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRkZUSW52X0NDU1RvUl9TMzJfU2ZzICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUSW52X0NDU1RvUl9TMzJfU2ZzLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEludl9DQ1NUb1JfUzMyUzE2X1NmcyAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEludl9DQ1NUb1JfUzMyUzE2X1NmcywgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRJbnZfQ1RvQ19TQzE2X1NmcyAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbnZfQ1RvQ19TQzE2X1NmcywgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRJbnZfQ1RvQ19TQzMyX1NmcyAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbnZfQ1RvQ19TQzMyX1NmcywgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GaWx0ZXJNZWRpYW5fUzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GaWx0ZXJNZWRpYW5fUzMyLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZpbHRlck1lZGlhbl9TMzJfSSAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZpbHRlck1lZGlhbl9TMzJfSSwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GSVJfRGlyZWN0X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJfRGlyZWN0X1MxNiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GSVJfRGlyZWN0X1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJfRGlyZWN0X1MxNl9JLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZJUl9EaXJlY3RfUzE2X0lTZnMgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUl9EaXJlY3RfUzE2X0lTZnMsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRklSX0RpcmVjdF9TMTZfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklSX0RpcmVjdF9TMTZfU2ZzLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZJUk9uZV9EaXJlY3RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUk9uZV9EaXJlY3RfUzE2LCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZJUk9uZV9EaXJlY3RfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUk9uZV9EaXJlY3RfUzE2X0ksIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRklST25lX0RpcmVjdF9TMTZfSVNmcyAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklST25lX0RpcmVjdF9TMTZfSVNmcywgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GSVJPbmVfRGlyZWN0X1MxNl9TZnMgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJPbmVfRGlyZWN0X1MxNl9TZnMsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfSUlSX0JpUXVhZERpcmVjdF9TMTYgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlSX0JpUXVhZERpcmVjdF9TMTYsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfSUlSX0JpUXVhZERpcmVjdF9TMTZfSSAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlSX0JpUXVhZERpcmVjdF9TMTZfSSwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9JSVJfRGlyZWN0X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJfRGlyZWN0X1MxNiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9JSVJfRGlyZWN0X1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJfRGlyZWN0X1MxNl9JLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0lJUk9uZV9CaVF1YWREaXJlY3RfUzE2ICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUk9uZV9CaVF1YWREaXJlY3RfUzE2LCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0lJUk9uZV9CaVF1YWREaXJlY3RfUzE2X0kgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUk9uZV9CaVF1YWREaXJlY3RfUzE2X0ksIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfSUlST25lX0RpcmVjdF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlST25lX0RpcmVjdF9TMTYsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfSUlST25lX0RpcmVjdF9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlST25lX0RpcmVjdF9TMTZfSSwgT01YU1BfU1VGRklYKQotCi0jZGVmaW5lIG9teFZDQ09NTV9BdmVyYWdlXzE2eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9BdmVyYWdlXzE2eCwgT01YVkNDT01NX1NVRkZJWCkKLSNkZWZpbmUgb214VkNDT01NX0F2ZXJhZ2VfOHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0F2ZXJhZ2VfOHgsIE9NWFZDQ09NTV9TVUZGSVgpCi0jZGVmaW5lIG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2sgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2ssIE9NWFZDQ09NTV9TVUZGSVgpCi0jZGVmaW5lIG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2tfU0FEICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2tfU0FELCBPTVhWQ0NPTU1fU1VGRklYKQotI2RlZmluZSBvbXhWQ0NPTU1fQ29weTE2eDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fQ29weTE2eDE2LCBPTVhWQ0NPTU1fU1VGRklYKQotI2RlZmluZSBvbXhWQ0NPTU1fQ29weTh4OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fQ29weTh4OCwgT01YVkNDT01NX1NVRkZJWCkKLSNkZWZpbmUgb214VkNDT01NX0V4cGFuZEZyYW1lX0kgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0V4cGFuZEZyYW1lX0ksIE9NWFZDQ09NTV9TVUZGSVgpCi0jZGVmaW5lIG9teFZDQ09NTV9MaW1pdE1WVG9SZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9MaW1pdE1WVG9SZWN0LCBPTVhWQ0NPTU1fU1VGRklYKQotI2RlZmluZSBvbXhWQ0NPTU1fU0FEXzE2eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fU0FEXzE2eCwgT01YVkNDT01NX1NVRkZJWCkKLSNkZWZpbmUgb214VkNDT01NX1NBRF84eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX1NBRF84eCwgT01YVkNDT01NX1NVRkZJWCkKLQotI2RlZmluZSBvbXhWQ000UDEwX0F2ZXJhZ2VfNHggICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0F2ZXJhZ2VfNHgsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZiAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZiwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9CbG9ja01hdGNoX1F1YXJ0ZXIgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9CbG9ja01hdGNoX1F1YXJ0ZXIsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSSAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0RlYmxvY2tDaHJvbWFfSSwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfRGVibG9ja0x1bWFfSSAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRGVibG9ja0x1bWFfSSwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQyAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQywgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkIE9NWENBVEJBUihWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSSAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSSwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0kgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0ksIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSSAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSSwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9HZXRWTENJbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9HZXRWTENJbmZvLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYSAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYSwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfQ2hyb21hREMgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfQ2hyb21hREMsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfTHVtYURDICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfTHVtYURDLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1SZXNpZHVhbEFuZEFkZCAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9JbnZUcmFuc2Zvcm1SZXNpZHVhbEFuZEFkZCwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfTUVHZXRCdWZTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfTUVHZXRCdWZTaXplLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9NRUluaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9NRUluaXQsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQiAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQiwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2ICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2LCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0ICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0LCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4ICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfU0FEXzR4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfU0FEXzR4LCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9TQURRdWFyXzE2eCAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9TQURRdWFyXzE2eCwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfU0FEUXVhcl80eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfU0FEUXVhcl80eCwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfU0FEUXVhcl84eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfU0FEUXVhcl84eCwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfU0FURF80eDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfU0FURF80eDQsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX1N1YkFuZFRyYW5zZm9ybVFEUVJlc2lkdWFsICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1N1YkFuZFRyYW5zZm9ybVFEUVJlc2lkdWFsLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpciAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpciwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9DaHJvbWFEQyAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9DaHJvbWFEQywgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfTHVtYURDICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfTHVtYURDLCBPTVhWQ000UDEwX1NVRkZJWCkKLQotI2RlZmluZSBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2ICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2LCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OCAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OCwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl84eDggICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl84eDgsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9EQ1Q4eDhibGsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EQ1Q4eDhibGssIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQywgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX0VuY29kZU1WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0VuY29kZU1WLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhQUNWTEMgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhQUNWTEMsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQywgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX0ZpbmRNVnByZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0ZpbmRNVnByZWQsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9JRENUOHg4YmxrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9JRENUOHg4YmxrLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfTUNSZWNvbkJsb2NrICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfTUNSZWNvbkJsb2NrLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfTUVHZXRCdWZTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfTUVHZXRCdWZTaXplLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfTUVJbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfTUVJbml0LCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfTW90aW9uRXN0aW1hdGlvbk1CICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfTW90aW9uRXN0aW1hdGlvbk1CLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfUXVhbnRJbnRlcl9JICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfUXVhbnRJbnRlcl9JLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfUXVhbnRJbnRyYV9JICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfUXVhbnRJbnRyYV9JLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfUXVhbnRJbnZJbnRlcl9JLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfUXVhbnRJbnZJbnRyYV9JLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50ZXIgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50ZXIsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYSAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYSwgT01YVkNNNFAyX1NVRkZJWCkKLQotCi0jZW5kaWYgLyogX2FybU9NWF9oXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9hcGkvb214dHlwZXMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvYXBpL29teHR5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMmNiMGQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9hcGkvb214dHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKioKLSAqIEZpbGU6IG9teHR5cGVzLmgKLSAqIEJyaWVmOiBEZWZpbmVzIGJhc2ljIERhdGEgdHlwZXMgdXNlZCBpbiBPcGVuTUFYIHYxLjAuMiBoZWFkZXIgZmlsZXMuCi0gKgotICogQ29weXJpZ2h0IKkgMjAwNS0yMDA4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCi0gKgotICogVGhlc2UgbWF0ZXJpYWxzIGFyZSBwcm90ZWN0ZWQgYnkgY29weXJpZ2h0IGxhd3MgYW5kIGNvbnRhaW4gbWF0ZXJpYWwgCi0gKiBwcm9wcmlldGFyeSB0byB0aGUgS2hyb25vcyBHcm91cCwgSW5jLiAgWW91IG1heSB1c2UgdGhlc2UgbWF0ZXJpYWxzIAotICogZm9yIGltcGxlbWVudGluZyBLaHJvbm9zIHNwZWNpZmljYXRpb25zLCB3aXRob3V0IGFsdGVyaW5nIG9yIHJlbW92aW5nIAotICogYW55IHRyYWRlbWFyaywgY29weXJpZ2h0IG9yIG90aGVyIG5vdGljZSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uLgotICogCi0gKiBLaHJvbm9zIEdyb3VwIG1ha2VzIG5vLCBhbmQgZXhwcmVzc2x5IGRpc2NsYWltcyBhbnksIHJlcHJlc2VudGF0aW9ucyAKLSAqIG9yIHdhcnJhbnRpZXMsIGV4cHJlc3Mgb3IgaW1wbGllZCwgcmVnYXJkaW5nIHRoZXNlIG1hdGVyaWFscywgaW5jbHVkaW5nLCAKLSAqIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgb3IgZml0bmVzcyAKLSAqIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBvciBub24taW5mcmluZ2VtZW50IG9mIGFueSBpbnRlbGxlY3R1YWwgcHJvcGVydHkuIAotICogS2hyb25vcyBHcm91cCBtYWtlcyBubywgYW5kIGV4cHJlc3NseSBkaXNjbGFpbXMgYW55LCB3YXJyYW50aWVzLCBleHByZXNzIAotICogb3IgaW1wbGllZCwgcmVnYXJkaW5nIHRoZSBjb3JyZWN0bmVzcywgYWNjdXJhY3ksIGNvbXBsZXRlbmVzcywgdGltZWxpbmVzcywgCi0gKiBhbmQgcmVsaWFiaWxpdHkgb2YgdGhlc2UgbWF0ZXJpYWxzLiAKLSAqCi0gKiBVbmRlciBubyBjaXJjdW1zdGFuY2VzIHdpbGwgdGhlIEtocm9ub3MgR3JvdXAsIG9yIGFueSBvZiBpdHMgUHJvbW90ZXJzLCAKLSAqIENvbnRyaWJ1dG9ycyBvciBNZW1iZXJzIG9yIHRoZWlyIHJlc3BlY3RpdmUgcGFydG5lcnMsIG9mZmljZXJzLCBkaXJlY3RvcnMsIAotICogZW1wbG95ZWVzLCBhZ2VudHMgb3IgcmVwcmVzZW50YXRpdmVzIGJlIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMsIHdoZXRoZXIgCi0gKiBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBmb3IgbG9zdCByZXZlbnVlcywgCi0gKiBsb3N0IHByb2ZpdHMsIG9yIG90aGVyd2lzZSwgYXJpc2luZyBmcm9tIG9yIGluIGNvbm5lY3Rpb24gd2l0aCB0aGVzZSAKLSAqIG1hdGVyaWFscy4KLSAqIAotICogS2hyb25vcyBhbmQgT3Blbk1BWCBhcmUgdHJhZGVtYXJrcyBvZiB0aGUgS2hyb25vcyBHcm91cCBJbmMuIAotICoKLSAqLwotICAKLSNpZm5kZWYgX09NWFRZUEVTX0hfCi0jZGVmaW5lIF9PTVhUWVBFU19IXwotCi0jaW5jbHVkZSA8bGltaXRzLmg+IAotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jZGVmaW5lIE9NWF9JTgotI2RlZmluZSBPTVhfT1VUCi0jZGVmaW5lIE9NWF9JTk9VVAotCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgCi0gICAgLyogTWFuZGF0b3J5IHJldHVybiBjb2RlcyAtIHVzZSBjYXNlcyBhcmUgZXhwbGljaXRseSBkZXNjcmliZWQgZm9yIGVhY2ggZnVuY3Rpb24gKi8KLSAgICBPTVhfU3RzX05vRXJyICAgICAgICAgICAgICAgICAgICA9ICAwLCAgICAvKiBObyBlcnJvciwgdGhlIGZ1bmN0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgKi8KLSAgICBPTVhfU3RzX0VyciAgICAgICAgICAgICAgICAgICAgICA9IC0yLCAgICAvKiBVbmtub3duL3Vuc3BlY2lmaWVkIGVycm9yICovICAgIAotICAgIE9NWF9TdHNfSW52YWxpZEJpdHN0cmVhbVZhbEVyciAgID0gLTE4MiwgIC8qIEludmFsaWQgdmFsdWUgZGV0ZWN0ZWQgZHVyaW5nIGJpdHN0cmVhbSBwcm9jZXNzaW5nICovICAgIAotICAgIE9NWF9TdHNfTWVtQWxsb2NFcnIgICAgICAgICAgICAgID0gLTksICAgIC8qIE5vdCBlbm91Z2ggbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGhlIG9wZXJhdGlvbiAqLwotICAgIE9NWF9TdHNBQ0FBQ19HYWluQ3RyRXJyICAgIAkgICAgID0gLTE1OSwgIC8qIEFBQzogVW5zdXBwb3J0ZWQgZ2FpbiBjb250cm9sIGRhdGEgZGV0ZWN0ZWQgKi8KLSAgICBPTVhfU3RzQUNBQUNfUHJnTnVtRXJyICAgICAgICAgICA9IC0xNjcsICAvKiBBQUM6IEludmFsaWQgbnVtYmVyIG9mIGVsZW1lbnRzIGZvciBvbmUgcHJvZ3JhbSAgICovCi0gICAgT01YX1N0c0FDQUFDX0NvZWZWYWxFcnIgICAgICAgICAgPSAtMTYzLCAgLyogQUFDOiBJbnZhbGlkIHF1YW50aXplZCBjb2VmZmljaWVudCB2YWx1ZSAgICAgICAgICAqLyAgICAgCi0gICAgT01YX1N0c0FDQUFDX01heFNmYkVyciAgICAgICAgICAgPSAtMTYyLCAgLyogQUFDOiBJbnZhbGlkIG1heFNmYiB2YWx1ZSBpbiByZWxhdGlvbiB0byBudW1Td2IgKi8gICAgCi0JT01YX1N0c0FDQUFDX1Bsc0RhdGFFcnIJCSAgICAgPSAtMTYwLCAgLyogQUFDOiBwdWxzZSBlc2NhcGUgc2VxdWVuY2UgZGF0YSBlcnJvciAqLwotCi0gICAgLyogT3B0aW9uYWwgcmV0dXJuIGNvZGVzIC0gdXNlIGNhc2VzIGFyZSBleHBsaWNpdGx5IGRlc2NyaWJlZCBmb3IgZWFjaCBmdW5jdGlvbiovCi0gICAgT01YX1N0c19CYWRBcmdFcnIgICAgICAgICAgICAgICAgPSAtNSwgICAgLyogQmFkIEFyZ3VtZW50cyAqLwotCi0gICAgT01YX1N0c0FDQUFDX1Ruc051bUZpbHRFcnIgICAgICAgPSAtMTU3LCAgLyogQUFDOiBJbnZhbGlkIG51bWJlciBvZiBUTlMgZmlsdGVycyAgKi8KLSAgICBPTVhfU3RzQUNBQUNfVG5zTGVuRXJyICAgICAgICAgICA9IC0xNTYsICAvKiBBQUM6IEludmFsaWQgVE5TIHJlZ2lvbiBsZW5ndGggICovICAgCi0gICAgT01YX1N0c0FDQUFDX1Ruc09yZGVyRXJyICAgICAgICAgPSAtMTU1LCAgLyogQUFDOiBJbnZhbGlkIG9yZGVyIG9mIFROUyBmaWx0ZXIgICovICAgICAgICAgICAgICAgICAgCi0gICAgT01YX1N0c0FDQUFDX1Ruc0NvZWZSZXNFcnIgICAgICAgPSAtMTU0LCAgLyogQUFDOiBJbnZhbGlkIGJpdC1yZXNvbHV0aW9uIGZvciBUTlMgZmlsdGVyIGNvZWZmaWNpZW50cyAgKi8KLSAgICBPTVhfU3RzQUNBQUNfVG5zQ29lZkVyciAgICAgICAgICA9IC0xNTMsICAvKiBBQUM6IEludmFsaWQgVE5TIGZpbHRlciBjb2VmZmljaWVudHMgICovICAgICAgICAgICAgICAgICAgCi0gICAgT01YX1N0c0FDQUFDX1Ruc0RpcmVjdEVyciAgICAgICAgPSAtMTUyLCAgLyogQUFDOiBJbnZhbGlkIFROUyBmaWx0ZXIgZGlyZWN0aW9uICAqLyAgCi0KLSAgICBPTVhfU3RzSUNKUF9KUEVHTWFya2VyRXJyICAgICAgICA9IC0xODMsICAvKiBKUEVHIG1hcmtlciBlbmNvdW50ZXJlZCB3aXRoaW4gYW4gZW50cm9weS1jb2RlZCBibG9jazsgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBIdWZmbWFuIGRlY29kaW5nIG9wZXJhdGlvbiB0ZXJtaW5hdGVkIGVhcmx5LiAgICAgICAgICAgKi8KLSAgICBPTVhfU3RzSUNKUF9KUEVHTWFya2VyICAgICAgICAgICA9IC0xODEsICAvKiBKUEVHIG1hcmtlciBlbmNvdW50ZXJlZDsgSHVmZm1hbiBkZWNvZGluZyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9wZXJhdGlvbiB0ZXJtaW5hdGVkIGVhcmx5LiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIE9NWF9TdHNJUFBQX0NvbnRleHRNYXRjaEVyciAgICAgID0gLTE3LCAgIC8qIENvbnRleHQgcGFyYW1ldGVyIGRvZXNuJ3QgbWF0Y2ggdG8gdGhlIG9wZXJhdGlvbiAqLwotCi0gICAgT01YX1N0c1NQX0V2ZW5NZWRpYW5NYXNrU2l6ZUVyciAgPSAtMTgwLCAgLyogRXZlbiBzaXplIG9mIHRoZSBNZWRpYW4gRmlsdGVyIG1hc2sgd2FzIHJlcGxhY2VkIGJ5IHRoZSBvZGQgb25lICovCi0KLSAgICBPTVhfU3RzX01heGltdW1FbnVtZXJhdGlvbiAgICAgICA9IElOVF9NQVggIC8qUGxhY2Vob2xkZXIsIGZvcmNlcyBlbnVtIG9mIHNpemUgT01YX0lOVCovCi0gICAgCi0gfSBPTVhSZXN1bHQ7ICAgICAgICAgIC8qKiBSZXR1cm4gdmFsdWUgb3IgZXJyb3IgdmFsdWUgcmV0dXJuZWQgZnJvbSBhIGZ1bmN0aW9uLiBJZGVudGljYWwgdG8gT01YX0lOVCAqLwotCi0gCi0vKiBPTVhfVTggKi8KLXR5cGVkZWYgdWludDhfdCBPTVhfVTg7Ci0gCi0vKiBPTVhfUzggKi8KLXR5cGVkZWYgaW50OF90IE9NWF9TODsKLSAKLS8qIE9NWF9VMTYgKi8KLXR5cGVkZWYgdWludDE2X3QgT01YX1UxNjsKLQotLyogT01YX1MxNiAqLwotdHlwZWRlZiBpbnQxNl90IE9NWF9TMTY7Ci0KLS8qIE9NWF9VMzIgKi8KLXR5cGVkZWYgdWludDMyX3QgT01YX1UzMjsKLQotLyogT01YX1MzMiAqLwotdHlwZWRlZiBpbnQzMl90IE9NWF9TMzI7Ci0KLS8qIE9NWF9VNjQgJiBPTVhfUzY0ICovCi0jaWYgZGVmaW5lZCggX1dJTjMyICkgfHwgZGVmaW5lZCAoIF9XSU42NCApCi0gICAgdHlwZWRlZiBfX2ludDY0IE9NWF9TNjQ7IC8qKiBTaWduZWQgNjQtYml0IGludGVnZXIgKi8KLSAgICB0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgT01YX1U2NDsgLyoqIFVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyICovCi0gICAgI2RlZmluZSBPTVhfTUlOX1M2NAkJCSgweDgwMDAwMDAwMDAwMDAwMDBpNjQpCi0gICAgI2RlZmluZSBPTVhfTUlOX1U2NAkJCSgweDAwMDAwMDAwMDAwMDAwMDBpNjQpCi0gICAgI2RlZmluZSBPTVhfTUFYX1M2NAkJCSgweDdGRkZGRkZGRkZGRkZGRkZpNjQpCi0gICAgI2RlZmluZSBPTVhfTUFYX1U2NAkJCSgweEZGRkZGRkZGRkZGRkZGRkZpNjQpCi0jZWxzZQotICAgIHR5cGVkZWYgaW50NjRfdCBPTVhfUzY0OyAvKiogU2lnbmVkIDY0LWJpdCBpbnRlZ2VyICovCi0gICAgdHlwZWRlZiB1aW50NjRfdCBPTVhfVTY0OyAvKiogVW5zaWduZWQgNjQtYml0IGludGVnZXIgKi8KLSAgICAjZGVmaW5lIE9NWF9NSU5fUzY0CQkJKDB4ODAwMDAwMDAwMDAwMDAwMExMKQotICAgICNkZWZpbmUgT01YX01JTl9VNjQJCQkoMHgwMDAwMDAwMDAwMDAwMDAwTEwpCi0gICAgI2RlZmluZSBPTVhfTUFYX1M2NAkJCSgweDdGRkZGRkZGRkZGRkZGRkZMTCkKLSAgICAjZGVmaW5lIE9NWF9NQVhfVTY0CQkJKDB4RkZGRkZGRkZGRkZGRkZGRkxMKQotI2VuZGlmCi0KLS8qIE9NWF9TQzggKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIE9NWF9TOCBSZTsgLyoqIFJlYWwgcGFydCAqLwotICBPTVhfUzggSW07IC8qKiBJbWFnaW5hcnkgcGFydCAqLwkKLQkKLX0gT01YX1NDODsgLyoqIFNpZ25lZCA4LWJpdCBjb21wbGV4IG51bWJlciAqLwotCi0KLS8qIE9NWF9TQzE2ICovCi10eXBlZGVmIHN0cnVjdAotewotICBPTVhfUzE2IFJlOyAvKiogUmVhbCBwYXJ0ICovCi0gIE9NWF9TMTYgSW07IC8qKiBJbWFnaW5hcnkgcGFydCAqLwkKLQkKLX0gT01YX1NDMTY7IC8qKiBTaWduZWQgMTYtYml0IGNvbXBsZXggbnVtYmVyICovCi0KLQotLyogT01YX1NDMzIgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIE9NWF9TMzIgUmU7IC8qKiBSZWFsIHBhcnQgKi8KLSAgT01YX1MzMiBJbTsgLyoqIEltYWdpbmFyeSBwYXJ0ICovCQotCQotfSBPTVhfU0MzMjsgLyoqIFNpZ25lZCAzMi1iaXQgY29tcGxleCBudW1iZXIgKi8KLQotCi0vKiBPTVhfU0M2NCAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgT01YX1M2NCBSZTsgLyoqIFJlYWwgcGFydCAqLwotICBPTVhfUzY0IEltOyAvKiogSW1hZ2luYXJ5IHBhcnQgKi8JCi0JCi19IE9NWF9TQzY0OyAvKiogU2lnbmVkIDY0LWJpdCBjb21wbGV4IG51bWJlciAqLwotCi0KLS8qIE9NWF9GMzIgKi8KLXR5cGVkZWYgZmxvYXQgT01YX0YzMjsgLyoqIFNpbmdsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQsSUVFRSA3NTQgKi8KLQotCi0vKiBPTVhfRjY0ICovCi10eXBlZGVmIGRvdWJsZSBPTVhfRjY0OyAvKiogRG91YmxlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCxJRUVFIDc1NCAqLwotCi0KLS8qIE9NWF9JTlQgKi8KLXR5cGVkZWYgaW50IE9NWF9JTlQ7IC8qKiBzaWduZWQgaW50ZWdlciBjb3JyZXNwb25kaW5nIHRvIG1hY2hpbmUgd29yZCBsZW5ndGgsIGhhcyBtYXhpbXVtIHNpZ25lZCB2YWx1ZSBJTlRfTUFYKi8KLQotCi0jZGVmaW5lIE9NWF9NSU5fUzggIAkgICAJKC0xMjgpCi0jZGVmaW5lIE9NWF9NSU5fVTggIAkJMAotI2RlZmluZSBPTVhfTUlOX1MxNgkJIAkoLTMyNzY4KQotI2RlZmluZSBPTVhfTUlOX1UxNgkJCTAKLSNkZWZpbmUgT01YX01JTl9TMzIJCQkoLTIxNDc0ODM2NDctMSkKLSNkZWZpbmUgT01YX01JTl9VMzIJCQkwCi0KLSNkZWZpbmUgT01YX01BWF9TOAkJCSgxMjcpCi0jZGVmaW5lIE9NWF9NQVhfVTgJCQkoMjU1KQotI2RlZmluZSBPTVhfTUFYX1MxNgkJCSgzMjc2NykKLSNkZWZpbmUgT01YX01BWF9VMTYJCQkoMHhGRkZGKQotI2RlZmluZSBPTVhfTUFYX1MzMgkJCSgyMTQ3NDgzNjQ3KQotI2RlZmluZSBPTVhfTUFYX1UzMgkJCSgweEZGRkZGRkZGKQotCi10eXBlZGVmIHZvaWQgT01YVm9pZDsKLQotI2lmbmRlZiBOVUxMCi0jZGVmaW5lIE5VTEwgKCh2b2lkKikwKQotI2VuZGlmCi0KLS8qKiBEZWZpbmVzIHRoZSBnZW9tZXRyaWMgcG9zaXRpb24gYW5kIHNpemUgb2YgYSByZWN0YW5nbGUsIAotICAqIHdoZXJlIHgseSBkZWZpbmVzIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgdG9wIGxlZnQgY29ybmVyCi0gICogb2YgdGhlIHJlY3RhbmdsZSwgd2l0aCBkaW1lbnNpb25zIHdpZHRoIGluIHRoZSB4LWRpcmVjdGlvbiAKLSAgKiBhbmQgaGVpZ2h0IGluIHRoZSB5LWRpcmVjdGlvbiAqLwotdHlwZWRlZiBzdHJ1Y3QgewotCU9NWF9JTlQgeDsgICAgICAvKiogeC1jb29yZGluYXRlIG9mIHRvcCBsZWZ0IGNvcm5lciBvZiByZWN0YW5nbGUgKi8KLQlPTVhfSU5UIHk7ICAgICAgLyoqIHktY29vcmRpbmF0ZSBvZiB0b3AgbGVmdCBjb3JuZXIgb2YgcmVjdGFuZ2xlICovCi0JT01YX0lOVCB3aWR0aDsgIC8qKiBXaWR0aCBpbiB0aGUgeC1kaXJlY3Rpb24uICovCi0JT01YX0lOVCBoZWlnaHQ7IC8qKiBIZWlnaHQgaW4gdGhlIHktZGlyZWN0aW9uLiAqLwotfU9NWFJlY3Q7Ci0KLQotLyoqIERlZmluZXMgdGhlIGdlb21ldHJpYyBwb3NpdGlvbiBvZiBhIHBvaW50LCAqLwotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gT01YX0lOVCB4OyAvKiogeC1jb29yZGluYXRlICovCi0gT01YX0lOVCB5OwkvKiogeS1jb29yZGluYXRlICovCi0JCi19IE9NWFBvaW50OwotCi0KLS8qKiBEZWZpbmVzIHRoZSBkaW1lbnNpb25zIG9mIGEgcmVjdGFuZ2xlLCBvciByZWdpb24gb2YgaW50ZXJlc3QgaW4gYW4gaW1hZ2UgKi8KLXR5cGVkZWYgc3RydWN0IAotewotIE9NWF9JTlQgd2lkdGg7ICAvKiogV2lkdGggb2YgdGhlIHJlY3RhbmdsZSwgaW4gdGhlIHgtZGlyZWN0aW9uICovCi0gT01YX0lOVCBoZWlnaHQ7IC8qKiBIZWlnaHQgb2YgdGhlIHJlY3RhbmdsZSwgaW4gdGhlIHktZGlyZWN0aW9uICovCi0JCi19IE9NWFNpemU7Ci0KLSNlbmRpZiAvKiBfT01YVFlQRVNfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvYnVpbGRfdmMucGwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2J1aWxkX3ZjLnBsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNTljZGVkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvYnVpbGRfdmMucGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotIyEvdXNyL2Jpbi9wZXJsCi0jCi0jIAotIyBGaWxlIE5hbWU6ICBidWlsZF92Yy5wbAotIyBPcGVuTUFYIERMOiB2MS4wLjIKLSMgUmV2aXNpb246ICAgOTY0MQotIyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotIyAKLSMgCi0jIAotIwotIyBUaGlzIGZpbGUgYnVpbGRzIHRoZSBPcGVuTUFYIERMIHZjIGRvbWFpbiBsaWJyYXJ5IG9teFZDLm8uCi0jCi0KLXVzZSBGaWxlOjpTcGVjOwotdXNlIHN0cmljdDsKLQotbXkgKCRDQywgJENDX09QVFMsICRBUywgJEFTX09QVFMsICRMSUIsICRMSUJfT1BUUywgJExJQl9UWVBFKTsKLQotJENDICAgICAgID0gJ2FybWNjJzsKLSRDQ19PUFRTICA9ICctLW5vX3VuYWxpZ25lZF9hY2Nlc3MgLS1jcHUgQVJNN1RETUkgLWMnOwotJEFTICAgICAgID0gJ2FybWFzbSc7Ci0kQVNfT1BUUyAgPSAnLS1ub191bmFsaWduZWRfYWNjZXNzIC0tY3B1IEFSTTdURE1JJzsKLSMgJExJQiAgICAgID0gJ2FybWxpbmsnOwotIyAkTElCX09QVFMgPSAnLS1wYXJ0aWFsIC1vJzsKLSMgJExJQl9UWVBFID0gJy5vJzsKLSRMSUIgICAgICA9ICdhcm1hcic7Ci0kTElCX09QVFMgPSAnLS1jcmVhdGUgLXInOwotJExJQl9UWVBFID0gJy5hJzsKLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1teSAoQGhlYWRlcmxpc3QsIEBmaWxlbGlzdCwgJGhkLCAkZmlsZSwgJG9maWxlLCAkY29tbWFuZCwgJG9iamxpc3QsICRsaWJmaWxlLCAkaCk7Ci0KLSMgRGVmaW5lIHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgaW5jbHVkZWQgaGVhZGVyIGZpbGVzLgotQGhlYWRlcmxpc3QgPSBxdyhhcGkgdmMvYXBpIHZjL200cDIvYXBpIHZjL200cDEwL2FwaSk7Ci0KLSMgRGVmaW5lIHRoZSBsaXN0IG9mIHNvdXJjZSBmaWxlcyB0byBjb21waWxlLgotb3BlbihGSUxFUywgJzxmaWxlbGlzdF92Yy50eHQnKSBvciBkaWUoIkNhbid0IG9wZW4gc291cmNlIGZpbGUgbGlzdFxuIik7Ci1AZmlsZWxpc3QgPSA8RklMRVM+OwotY2xvc2UoRklMRVMpOwotCi0jIEZpeCB0aGUgZmlsZSBzZXBhcmF0b3JzIGluIHRoZSBoZWFkZXIgcGF0aHMKLWZvcmVhY2ggJGggKEBoZWFkZXJsaXN0KQotewotICAgICAgICAkaCA9IEZpbGU6OlNwZWMtPmNhbm9ucGF0aCgkaCk7Ci19Ci0KLSMgQ3JlYXRlIHRoZSBpbmNsdWRlIHBhdGggdG8gYmUgcGFzc2VkIHRvIHRoZSBjb21waWxlcgotJGhkID0gJy1JJyAuIGpvaW4oJyAtSScsIEBoZWFkZXJsaXN0KTsKLQotIyBDcmVhdGUgdGhlIGJ1aWxkIGRpcmVjdG9yaWVzICIvbGliLyIgYW5kICIvb2JqLyIgKGlmIHRoZXkgYXJlIG5vdCB0aGVyZSBhbHJlYWR5KQotbWtkaXIgIm9iaiIsIDA3NzcgaWYgKCEgLWQgIm9iaiIpOwotbWtkaXIgImxpYiIsIDA3NzcgaWYgKCEgLWQgImxpYiIpOwotCi0kb2JqbGlzdCA9ICcnOwotCi0jIENvbXBpbGUgZWFjaCBmaWxlCi1mb3JlYWNoICRmaWxlIChAZmlsZWxpc3QpCi17Ci0JbXkgJGY7Ci0JbXkgJGJhc2U7Ci0JbXkgJGV4dDsKLQlteSAkb2JqZmlsZTsKLQotCWNob21wKCRmaWxlKTsKLQkkZmlsZSA9IEZpbGU6OlNwZWMtPmNhbm9ucGF0aCgkZmlsZSk7Ci0KLQkodW5kZWYsIHVuZGVmLCAkZikgPSBGaWxlOjpTcGVjLT5zcGxpdHBhdGgoJGZpbGUpOwotCWlmKCgkYmFzZSwgJGV4dCkgPSAkZiA9fiAvKC4rKVwuKFx3KSQvKQotCXsKLQkJJG9iamZpbGUgPSBGaWxlOjpTcGVjLT5jYXRmaWxlKCdvYmonLCAkYmFzZS4nLm8nKTsKLQotCQlpZigkZXh0IGVxICdjJykKLQkJewotCQkJJG9iamxpc3QgLj0gIiRvYmpmaWxlICI7Ci0JCQkkY29tbWFuZCA9ICRDQy4nICcuJENDX09QVFMuJyAnLiRoZC4nIC1vICcuJG9iamZpbGUuJyAnLiRmaWxlOwotCQkJcHJpbnQgIiRjb21tYW5kXG4iOwotCQkJc3lzdGVtKCRjb21tYW5kKTsKLQkJfQotCQllbHNpZigkZXh0IGVxICdzJykKLQkJewotCQkJJG9iamxpc3QgLj0gIiRvYmpmaWxlICI7Ci0JCQkkY29tbWFuZCA9ICRBUy4nICcuJEFTX09QVFMuJyAnLiRoZC4nIC1vICcuJG9iamZpbGUuJyAnLiRmaWxlOwotCQkJcHJpbnQgIiRjb21tYW5kXG4iOwotCQkJc3lzdGVtKCRjb21tYW5kKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXByaW50ICJJZ25vcmluZyBmaWxlOiAkZlxuIjsKLQkJfQotCX0KLQllbHNlCi0JewotCQlkaWUgIk5vIGZpbGUgZXh0ZW5zaW9uIGZvdW5kOiAkZlxuIjsKLQl9Ci19Ci0KLSMgRG8gdGhlIGZpbmFsIGxpbmsgc3RhZ2UgdG8gY3JlYXRlIHRoZSBsaWJyYXJpZXMuCi0kbGliZmlsZSA9IEZpbGU6OlNwZWMtPmNhdGZpbGUoJ2xpYicsICdvbXhWQycuJExJQl9UWVBFKTsKLSRjb21tYW5kID0gJExJQi4nICcuJExJQl9PUFRTLicgJy4kbGliZmlsZS4nICcuJG9iamxpc3Q7Ci1wcmludCAiJGNvbW1hbmRcbiI7Ci0oc3lzdGVtKCRjb21tYW5kKSA9PSAwKSBhbmQgcHJpbnQgIkJ1aWxkIHN1Y2Nlc3NmdWxcbiI7Ci0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvZmlsZWxpc3RfdmMudHh0IGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9maWxlbGlzdF92Yy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ZjM0YWMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9maWxlbGlzdF92Yy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLi9hcGkvYXJtQ09NTS5oCi0uL2FwaS9hcm1DT01NX0JpdHN0cmVhbS5oCi0uL2FwaS9hcm1DT01NX1ZlcnNpb24uaAotLi9hcGkvYXJtT01YX1JlbGVhc2VWZXJzaW9uLmgKLS4vYXBpL29teHR5cGVzLmgKLS4vc3JjL2FybUNPTU0uYwotLi9zcmMvYXJtQ09NTV9CaXRzdHJlYW0uYwotLi92Yy9hcGkvYXJtVkMuaAotLi92Yy9hcGkvb214VkMuaAotLi92Yy9jb21tL3NyYy9hcm1WQ0NPTU1fQXZlcmFnZS5jCi0uL3ZjL2NvbW0vc3JjL2FybVZDQ09NTV9TQUQuYwotLi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQXZlcmFnZV8xNnguYwotLi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQXZlcmFnZV84eC5jCi0uL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2suYwotLi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrX1NBRC5jCi0uL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5MTZ4MTYuYwotLi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTh4OC5jCi0uL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9FeHBhbmRGcmFtZV9JLmMKLS4vdmMvY29tbS9zcmMvb214VkNDT01NX0xpbWl0TVZUb1JlY3QuYwotLi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fU0FEXzE2eC5jCi0uL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9TQURfOHguYwotLi92Yy9tNHAxMC9hcGkvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ29tcGFyZU1vdGlvbkNvc3RUb01WLmMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVCbG9ja1BpeGVsLmMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyLmMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVxdWFudFRhYmxlcy5jCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0Z3ZFRyYW5zZm9ybVJlc2lkdWFsNHg0LmMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hLmMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfTHVtYS5jCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkRpYWdfTHVtYS5jCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hLmMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEuYwotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9QcmVkaWN0SW50cmFEQzR4NC5jCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1F1YW50VGFibGVzLmMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfU0FEUXVhci5jCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0LmMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2syeDIuYwotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NC5jCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0F2ZXJhZ2VfNHguYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYuYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIuYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9CbG9ja01hdGNoX1F1YXJ0ZXIuYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kuYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JLmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQy5jCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQuYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSS5jCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JLmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JLmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JLmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfR2V0VkxDSW5mby5jCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEuYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYS5jCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYS5jCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfQ2hyb21hREMuYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0x1bWFEQy5jCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludlRyYW5zZm9ybVJlc2lkdWFsQW5kQWRkLmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfTUVHZXRCdWZTaXplLmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfTUVJbml0LmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfTW90aW9uRXN0aW1hdGlvbk1CLmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2LmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NC5jCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDguYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQURfNHguYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQURRdWFyXzE2eC5jCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBRFF1YXJfNHguYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQURRdWFyXzh4LmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FURF80eDQuYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TdWJBbmRUcmFuc2Zvcm1RRFFSZXNpZHVhbC5jCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyLmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyLmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfQ2hyb21hREMuYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9MdW1hREMuYwotLi92Yy9tNHAyL2FwaS9hcm1WQ000UDJfRENUX1RhYmxlLmgKLS4vdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oCi0uL3ZjL200cDIvYXBpL2FybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgKLS4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0FDRENQcmVkaWN0LmMKLS4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZi5jCi0uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXIuYwotLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQ2hlY2tWTENFc2NhcGVNb2RlLmMKLS4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0NvbXBhcmVNVi5jCi0uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9EQ1RfVGFibGUuYwotLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX2ludHJhLmMKLS4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19pbnRyYS5jCi0uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9GaWxsVkxDQnVmZmVyLmMKLS4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIuYwotLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfR2V0VkxDQml0cy5jCi0uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYwotLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfUHV0VkxDQml0cy5jCi0uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9TZXRQcmVkRGlyLmMKLS4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuYwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2LmMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl84eDguYwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2LmMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl84eDguYwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRENUOHg4YmxrLmMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlci5jCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEuYwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUC5jCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIuYwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMuYwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMuYwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRW5jb2RlTVYuYwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyLmMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDLmMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLmMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0ZpbmRNVnByZWQuYwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfSURDVDh4OGJsay5jCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9NQ1JlY29uQmxvY2suYwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUVHZXRCdWZTaXplLmMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX01FSW5pdC5jCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9Nb3Rpb25Fc3RpbWF0aW9uTUIuYwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhLmMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW50ZXJfSS5jCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludHJhX0kuYwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JLmMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50cmFfSS5jCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRlci5jCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYS5jCi0uL3ZjL3NyYy9hcm1WQ19WZXJzaW9uLmMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3NyYy9hcm1DT01NLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3NyYy9hcm1DT01NLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ZGJmNDEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9zcmMvYXJtQ09NTS5jCisrKyAvZGV2L251bGwKQEAgLTEsOTUxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1DT01NLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBEZWZpbmVzIENvbW1vbiBBUElzIHVzZWQgYWNyb3NzIE9wZW5NQVggQVBJJ3MKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgICAgICAvKiBNaXNjZWxsYW5lb3VzIEFyaXRobWV0aWMgb3BlcmF0aW9ucyAqLwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1Sb3VuZEZsb2F0VG9TMTYKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgc2hvcnQgaW50IGFmdGVyIHJvdW5kaW5nCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1MxNiBmb3JtYXQKLSAqCi0gKi8KLQotT01YX1MxNiBhcm1Sb3VuZEZsb2F0VG9TMTYgKE9NWF9GNjQgVmFsdWUpCi17Ci0gICAgaWYgKFZhbHVlID4gMCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoT01YX1MxNikoVmFsdWUgKyAuNSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJldHVybiAoT01YX1MxNikoVmFsdWUgLSAuNSk7Ci0gICAgfQotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1Sb3VuZEZsb2F0VG9TMzIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgaW50IGFmdGVyIHJvdW5kaW5nCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1MzMiBmb3JtYXQKLSAqCi0gKi8KLQotT01YX1MzMiBhcm1Sb3VuZEZsb2F0VG9TMzIgKE9NWF9GNjQgVmFsdWUpCi17Ci0gICAgaWYgKFZhbHVlID4gMCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoT01YX1MzMikoVmFsdWUgKyAuNSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJldHVybiAoT01YX1MzMikoVmFsdWUgLSAuNSk7Ci0gICAgfQotfQotLyoqCi0gKiBGdW5jdGlvbjogYXJtU2F0Um91bmRGbG9hdFRvUzE2Ci0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIHNob3J0IGludCBhZnRlciByb3VuZGluZyBhbmQgc2F0dXJhdGlvbgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9TMTYgZm9ybWF0Ci0gKgotICovCi0KLU9NWF9TMTYgYXJtU2F0Um91bmRGbG9hdFRvUzE2IChPTVhfRjY0IFZhbHVlKQotewotICAgIGlmIChWYWx1ZSA+IDApCi0gICAgewotICAgICAgICBWYWx1ZSArPSAwLjU7Ci0gICAgICAgIAotICAgICAgICBpZihWYWx1ZSA+IChPTVhfUzE2KU9NWF9NQVhfUzE2ICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChPTVhfUzE2KU9NWF9NQVhfUzE2OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChPTVhfUzE2KVZhbHVlOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIFZhbHVlIC09IDAuNTsKLQotICAgICAgICBpZihWYWx1ZSA8IChPTVhfUzE2KU9NWF9NSU5fUzE2ICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChPTVhfUzE2KU9NWF9NSU5fUzE2OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChPTVhfUzE2KVZhbHVlOwotICAgICAgICB9Ci0gICAgfQotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1TYXRSb3VuZEZsb2F0VG9TMzIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgaW50IGFmdGVyIHJvdW5kaW5nIGFuZCBzYXR1cmF0aW9uCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1MzMiBmb3JtYXQKLSAqCi0gKi8KLQotT01YX1MzMiBhcm1TYXRSb3VuZEZsb2F0VG9TMzIgKE9NWF9GNjQgVmFsdWUpCi17Ci0gICAgaWYgKFZhbHVlID4gMCkKLSAgICB7Ci0gICAgICAgIFZhbHVlICs9IDAuNTsKLSAgICAgICAgCi0gICAgICAgIGlmKFZhbHVlID4gKE9NWF9TMzIpT01YX01BWF9TMzIgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKE9NWF9TMzIpT01YX01BWF9TMzI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKE9NWF9TMzIpVmFsdWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgVmFsdWUgLT0gMC41OwotCi0gICAgICAgIGlmKFZhbHVlIDwgKE9NWF9TMzIpT01YX01JTl9TMzIgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKE9NWF9TMzIpT01YX01JTl9TMzI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKE9NWF9TMzIpVmFsdWU7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVNhdFJvdW5kRmxvYXRUb1UxNgotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSB1bnNpZ25lZCBzaG9ydCBpbnQgYWZ0ZXIgcm91bmRpbmcgYW5kIHNhdHVyYXRpb24KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfVTE2IGZvcm1hdAotICoKLSAqLwotCi1PTVhfVTE2IGFybVNhdFJvdW5kRmxvYXRUb1UxNiAoT01YX0Y2NCBWYWx1ZSkKLXsKLSAgICBWYWx1ZSArPSAwLjU7Ci0gICAgCi0gICAgaWYoVmFsdWUgPiAoT01YX1UxNilPTVhfTUFYX1UxNiApCi0gICAgewotICAgICAgICByZXR1cm4gKE9NWF9VMTYpT01YX01BWF9VMTY7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJldHVybiAoT01YX1UxNilWYWx1ZTsKLSAgICB9Ci19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVNhdFJvdW5kRmxvYXRUb1UzMgotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSB1bnNpZ25lZCBpbnQgYWZ0ZXIgcm91bmRpbmcgYW5kIHNhdHVyYXRpb24KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfVTMyIGZvcm1hdAotICoKLSAqLwotCi1PTVhfVTMyIGFybVNhdFJvdW5kRmxvYXRUb1UzMiAoT01YX0Y2NCBWYWx1ZSkKLXsKLSAgICBWYWx1ZSArPSAwLjU7Ci0gICAgCi0gICAgaWYoVmFsdWUgPiAoT01YX1UzMilPTVhfTUFYX1UzMiApCi0gICAgewotICAgICAgICByZXR1cm4gKE9NWF9VMzIpT01YX01BWF9VMzI7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJldHVybiAoT01YX1UzMilWYWx1ZTsKLSAgICB9Ci19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVJvdW5kRmxvYXRUb1M2NAotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSA2NCBiaXQgaW50IGFmdGVyIHJvdW5kaW5nCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1M2NCBmb3JtYXQKLSAqCi0gKi8KLQotT01YX1M2NCBhcm1Sb3VuZEZsb2F0VG9TNjQgKE9NWF9GNjQgVmFsdWUpCi17Ci0gICAgaWYgKFZhbHVlID4gMCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoT01YX1M2NCkoVmFsdWUgKyAuNSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJldHVybiAoT01YX1M2NCkoVmFsdWUgLSAuNSk7Ci0gICAgfQotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1TaWduQ2hlY2sKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENoZWNrcyB0aGUgc2lnbiBvZiBhIHZhcmlhYmxlOgotICogcmV0dXJucyAxIGlmIGl0IGlzIFBvc2l0aXZlCi0gKiByZXR1cm5zIDAgaWYgaXQgaXMgMAotICogcmV0dXJucyAtMSBpZiBpdCBpcyBOZWdhdGl2ZSAKLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCSAgICB2YXIgICAgIFZhcmlhYmxlIHRvIGJlIGNoZWNrZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfSU5UIC0tICAgcmV0dXJucyAxIGlmIGl0IGlzIFBvc2l0aXZlCi0gKiAgICAgICAgICAgICAgcmV0dXJucyAwIGlmIGl0IGlzIDAKLSAqICAgICAgICAgICAgICByZXR1cm5zIC0xIGlmIGl0IGlzIE5lZ2F0aXZlIAotICovIAotCi1PTVhfSU5UIGFybVNpZ25DaGVjayAoCi0gICAgT01YX1MxNiB2YXIKLSkKLQotewotICAgIE9NWF9JTlQgU2lnbjsKLSAgICAKLSAgICBpZiAodmFyIDwgMCkKLSAgICB7Ci0gICAgICAgIFNpZ24gPSAtMTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIHZhciA+IDApCi0gICAgewotICAgICAgICBTaWduID0gMTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgU2lnbiA9IDA7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBTaWduOwotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1DbGlwCi0gKgotICogRGVzY3JpcHRpb246IENsaXBzIHRoZSBpbnB1dCBiZXR3ZWVuIE1BWCBhbmQgTUlOIHZhbHVlCi0gKiAKLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIE1pbiAgICAgbG93ZXIgYm91bmQKLSAqIFtpbl0gTWF4ICAgICB1cHBlciBib3VuZAotICogW2luXSBzcmMgICAgIHZhcmlhYmxlIHRvIHRoZSBjbGlwcGVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX1MzMiAtLSAgIHJldHVybnMgY2xpcHBlZCB2YWx1ZQotICovIAotIAotT01YX1MzMiBhcm1DbGlwICgKLSAgICBPTVhfSU5UIG1pbiwKLSAgICBPTVhfSU5UIG1heCwgCi0gICAgT01YX1MzMiBzcmMgCi0pCi0gCi17Ci0gICAgaWYgKHNyYyA+IG1heCkKLSAgICB7Ci0gICAgICAgIHNyYyA9IG1heDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3JjIDwgbWluKQotICAgIHsKLSAgICAgICAgc3JjID0gbWluOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gc3JjOwotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1DbGlwX0YzMgotICoKLSAqIERlc2NyaXB0aW9uOiBDbGlwcyB0aGUgaW5wdXQgYmV0d2VlbiBNQVggYW5kIE1JTiB2YWx1ZQotICogCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBNaW4gICAgIGxvd2VyIGJvdW5kCi0gKiBbaW5dIE1heCAgICAgdXBwZXIgYm91bmQKLSAqIFtpbl0gc3JjICAgICB2YXJpYWJsZSB0byB0aGUgY2xpcHBlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9GMzIgLS0gICByZXR1cm5zIGNsaXBwZWQgdmFsdWUKLSAqLyAKLSAKLU9NWF9GMzIgYXJtQ2xpcF9GMzIgKAotICAgIE9NWF9GMzIgbWluLAotICAgIE9NWF9GMzIgbWF4LCAKLSAgICBPTVhfRjMyIHNyYyAKLSkKLSAKLXsKLSAgICBpZiAoc3JjID4gbWF4KQotICAgIHsKLSAgICAgICAgc3JjID0gbWF4OwotICAgIH0KLSAgICBlbHNlIGlmIChzcmMgPCBtaW4pCi0gICAgewotICAgICAgICBzcmMgPSBtaW47Ci0gICAgfQotICAgIAotICAgIHJldHVybiBzcmM7Ci19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVNoaWZ0U2F0X0YzMgotICoKLSAqIERlc2NyaXB0aW9uOiBEaXZpZGVzIGEgZmxvYXQgdmFsdWUgYnkgMl5zaGlmdCBhbmQgCi0gKiBzYXR1cmF0ZXMgaXQgZm9yIHVuc2lnbmVkIHZhbHVlIHJhbmdlIGZvciBzYXRCaXRzLgotICogU2Vjb25kIHBhcmFtZXRlciBpcyBsaWtlICJzaGlmdGluZyIgdGhlIGNvcnJlc3BvbmRpbmcgCi0gKiBpbnRlZ2VyIHZhbHVlLiBUYWtlcyBjYXJlIG9mIHJvdW5kaW5nIHdoaWxlIGNsaXBwaW5nIHRoZSBmaW5hbCAKLSAqIHZhbHVlLgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHYgICAgICAgICAgTnVtYmVyIHRvIGJlIG9wZXJhdGVkIHVwb24KLSAqIFtpbl0gc2hpZnQgICAgICBEaXZpZGVzIHRoZSBpbnB1dCAidiIgYnkgIjJec2hpZnQiCi0gKiBbaW5dIHNhdEJpdHMgICAgRmluYWwgcmFuZ2UgaXMgWzAsIDJec2F0Qml0cykKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfUzMyIC0tICAgcmV0dXJucyAic2hpZnRlZCIgc2F0dXJhdGVkIHZhbHVlCi0gKi8gCi0gCi1PTVhfVTMyIGFybVNoaWZ0U2F0X0YzMihPTVhfRjMyIHYsIE9NWF9JTlQgc2hpZnQsIE9NWF9JTlQgc2F0Qml0cykgCi17Ci0gICAgT01YX1UzMiBhbGxPbmVzID0gKE9NWF9VMzIpKC0xKTsKLSAgICBPTVhfVTMyIG1heFYgPSBhbGxPbmVzID4+ICgzMi1zYXRCaXRzKTsKLSAgICBPTVhfRjMyIHZTaGlmdGVkLCB2Um91bmRlZCwgc2hpZnREaXYgPSAoT01YX0YzMikoMSA8PCBzaGlmdCk7Ci0gICAgT01YX1UzMiB2SW50OwotICAgIE9NWF9VMzIgdkludFNhdDsKLSAgICAKLSAgICBpZih2IDw9IDApCi0gICAgICAgIHJldHVybiAwOwotICAgIAotICAgIHZTaGlmdGVkID0gdiAvIHNoaWZ0RGl2OwotICAgIHZSb3VuZGVkID0gKE9NWF9GMzIpKHZTaGlmdGVkICsgMC41KTsKLSAgICB2SW50ID0gKE9NWF9VMzIpdlJvdW5kZWQ7Ci0gICAgdkludFNhdCA9IHZJbnQ7Ci0gICAgaWYodkludFNhdCA+IG1heFYpIAotICAgICAgICB2SW50U2F0ID0gbWF4VjsKLSAgICByZXR1cm4gdkludFNhdDsKLX0KLQotLyoqCi0gKiBGdW5jdGlvbnM6IGFybVN3YXBFbGVtCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGVzZSBmdW5jdGlvbiBzd2FwcyB0d28gZWxlbWVudHMgYXQgdGhlIHNwZWNpZmllZCBwb2ludGVyIGxvY2F0aW9ucy4KLSAqIFRoZSBzaXplIG9mIGVhY2ggZWxlbWVudCBjb3VsZCBiZSBhbnl0aGluZyBhcyBzcGVjaWZpZWQgYnkgPGVsZW1TaXplPgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWFJlc3VsdCAtLSBFcnJvciBzdGF0dXMgZnJvbSB0aGUgZnVuY3Rpb24KLSAqLwotT01YUmVzdWx0IGFybVN3YXBFbGVtKAotICAgICAgICBPTVhfVTggKnBCdWYxLAotICAgICAgICBPTVhfVTggKnBCdWYyLAotICAgICAgICBPTVhfSU5UIGVsZW1TaXplCi0gICAgICAgKQotewotICAgIE9NWF9JTlQgaTsKLSAgICBPTVhfVTggdGVtcDsKLSAgICBhcm1SZXRBcmdFcnJJZighcEJ1ZjEgfHwgIXBCdWYyLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgCi0gICAgZm9yKGkgPSAwOyBpIDwgZWxlbVNpemU7IGkrKykKLSAgICB7Ci0gICAgICAgIHRlbXAgPSAqKHBCdWYxICsgaSk7Ci0gICAgICAgICoocEJ1ZjEgKyBpKSA9ICoocEJ1ZjIgKyBpKTsKLSAgICAgICAgKihwQnVmMiArIGkpID0gdGVtcDsKLSAgICB9Ci0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybU1lZGlhbk9mMwotICoKLSAqIERlc2NyaXB0aW9uOiBGaW5kcyB0aGUgbWVkaWFuIG9mIHRocmVlIG51bWJlcnMKLSAqIAotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBmRW50cnkgICAgIEZpcnN0IGVudHJ5Ci0gKiBbaW5dIHNFbnRyeSAgICAgc2Vjb25kIGVudHJ5Ci0gKiBbaW5dIHRFbnRyeSAgICAgVGhpcmQgZW50cnkKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfUzMyIC0tICAgcmV0dXJucyB0aGUgbWVkaWFuIHZhbHVlCi0gKi8gCi0gCi1PTVhfUzMyIGFybU1lZGlhbk9mMyAoCi0gICAgT01YX1MzMiBmRW50cnksCi0gICAgT01YX1MzMiBzRW50cnksIAotICAgIE9NWF9TMzIgdEVudHJ5IAotKQotewotICAgIE9NWF9TMzIgYSwgYiwgYzsKLSAgICAKLSAgICBhID0gYXJtTWluIChmRW50cnksIHNFbnRyeSk7Ci0gICAgYiA9IGFybU1heCAoZkVudHJ5LCBzRW50cnkpOwotICAgIGMgPSBhcm1NaW4gKGIsIHRFbnRyeSk7Ci0gICAgcmV0dXJuIChhcm1NYXggKGEsIGMpKTsKLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtTG9nU2l6ZQotICoKLSAqIERlc2NyaXB0aW9uOiBGaW5kcyB0aGUgc2l6ZSBvZiBhIHBvc2l0aXZlIHZhbHVlIGFuZCByZXR1cm5zIHRoZSBzYW1lCi0gKiAKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gdmFsdWUgICAgUG9zaXRpdmUgdmFsdWUKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfVTggLS0gICAgIFJldHVybnMgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGJpdHMgcmVxdWlyZWQgdG8gcmVwcmVzZW50IHRoZSBwb3NpdGl2ZSB2YWx1ZS4gCi0gICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIHNtYWxsZXN0IGs+PTAgc3VjaCB0aGF0IHRoYXQgdmFsdWUgaXMgbGVzcyB0aGFuICgxPDxrKS4KLSAqLyAKLSAKLU9NWF9VOCBhcm1Mb2dTaXplICgKLSAgICBPTVhfVTE2IHZhbHVlIAotKQotewotICAgIE9NWF9VOCBpOyAgICAKLSAgICBmb3IgKCBpID0gMDsgdmFsdWUgPiAwOyB2YWx1ZSA9IHZhbHVlID4+IDEpIAotICAgIHsKLSAgICAgICAgaSsrOwotICAgIH0KLSAgICByZXR1cm4gaTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgICAgIC8qIFNhdHVyYXRpbmcgQXJpdGhtZXRpYyBvcGVyYXRpb25zICovCi0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdEFkZF9TMzIoKQotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBhZGRpdGlvbiBvZiB0aGUgdHdvIGlucHV0cyBWYWx1ZTEsIFZhbHVlMgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKLSAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogCi0gKiAgICAKLSAqKi8KLSAKLU9NWF9TMzIgYXJtU2F0QWRkX1MzMihPTVhfUzMyIFZhbHVlMSxPTVhfUzMyIFZhbHVlMikKLXsKLSAgICBPTVhfUzMyIFJlc3VsdDsKLSAgICAKLSAgICBSZXN1bHQgPSBWYWx1ZTEgKyBWYWx1ZTI7Ci0KLSAgICBpZiggKFZhbHVlMV5WYWx1ZTIpID49IDApCi0gICAgewotICAgICAgICAvKlNhbWUgc2lnbiovCi0gICAgICAgIGlmKCAoUmVzdWx0XlZhbHVlMSkgPj0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgLypSZXN1bHQgaGFzIG5vdCBzYXR1cmF0ZWQqLwotICAgICAgICAgICAgcmV0dXJuIFJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKFZhbHVlMSA+PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBzYXR1cmF0ZWQgaW4gcG9zaXRpdmUgc2lkZSovCi0gICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9NQVhfUzMyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBzYXR1cmF0ZWQgaW4gbmVnYXRpdmUgc2lkZSovCi0gICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9NSU5fUzMyOwotICAgICAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgfQotICAgCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJldHVybiBSZXN1bHQ7Ci0gICAgfQotICAgIAotfQotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRBZGRfUzY0KCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgYWRkaXRpb24gb2YgdGhlIHR3byBpbnB1dHMgVmFsdWUxLCBWYWx1ZTIKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCi0gKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqIAotICogICAgCi0gKiovCi0gCi1PTVhfUzY0IGFybVNhdEFkZF9TNjQoT01YX1M2NCBWYWx1ZTEsT01YX1M2NCBWYWx1ZTIpCi17Ci0gICAgT01YX1M2NCBSZXN1bHQ7Ci0gICAgCi0gICAgUmVzdWx0ID0gVmFsdWUxICsgVmFsdWUyOwotCi0gICAgaWYoIChWYWx1ZTFeVmFsdWUyKSA+PSAwKQotICAgIHsKLSAgICAgICAgLypTYW1lIHNpZ24qLwotICAgICAgICBpZiggKFJlc3VsdF5WYWx1ZTEpID49IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBub3Qgc2F0dXJhdGVkKi8KLSAgICAgICAgICAgIHJldHVybiBSZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihWYWx1ZTEgPj0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKlJlc3VsdCBoYXMgc2F0dXJhdGVkIGluIHBvc2l0aXZlIHNpZGUqLwotICAgICAgICAgICAgICAgIFJlc3VsdCA9IE9NWF9NQVhfUzY0OwotICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLypSZXN1bHQgaGFzIHNhdHVyYXRlZCBpbiBuZWdhdGl2ZSBzaWRlKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gT01YX01JTl9TNjQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB9Ci0gICAKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmV0dXJuIFJlc3VsdDsKLSAgICB9Ci0gICAgCi19Ci0KLS8qKiBGdW5jdGlvbiA6YXJtU2F0U3ViX1MzMigpCi0gKiAKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIHN1YnN0cmFjdGlvbiBvZiB0aGUgdHdvIGlucHV0cyBWYWx1ZTEsIFZhbHVlMgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKLSAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogCi0gKiovCi0KLU9NWF9TMzIgYXJtU2F0U3ViX1MzMihPTVhfUzMyIFZhbHVlMSxPTVhfUzMyIFZhbHVlMikKLXsKLSAgICBPTVhfUzMyIFJlc3VsdDsKLSAgICAKLSAgICBSZXN1bHQgPSBWYWx1ZTEgLSBWYWx1ZTI7Ci0KLSAgICBpZiggKFZhbHVlMV5WYWx1ZTIpIDwgMCkKLSAgICB7Ci0gICAgICAgIC8qT3Bwb3NpdGUgc2lnbiovCi0gICAgICAgIGlmKCAoUmVzdWx0XlZhbHVlMSkgPj0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgLypSZXN1bHQgaGFzIG5vdCBzYXR1cmF0ZWQqLwotICAgICAgICAgICAgcmV0dXJuIFJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKFZhbHVlMSA+PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBzYXR1cmF0ZWQgaW4gcG9zaXRpdmUgc2lkZSovCi0gICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9NQVhfUzMyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBzYXR1cmF0ZWQgaW4gbmVnYXRpdmUgc2lkZSovCi0gICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9NSU5fUzMyOwotICAgICAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgfQotICAgCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJldHVybiBSZXN1bHQ7Ci0gICAgfQotICAgIAotfQotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRNYWNfUzMyKCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIE11bHRpcGxpY2F0aW9uIG9mIFZhbHVlMSBhbmQgVmFsdWUyIGFuZCBzdWJlc3F1ZW50IHNhdHVyYXRlZAotICogICAgIGFjY3VtdWxhdGlvbiB3aXRoIE1hYwotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKLSAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCi0gKiBbaW5dIE1hYyAgICAgICAgICBBY2N1bXVsYXRvcgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqKi8KLQotT01YX1MzMiBhcm1TYXRNYWNfUzMyKE9NWF9TMzIgTWFjLE9NWF9TMTYgVmFsdWUxLE9NWF9TMTYgVmFsdWUyKQotewotICAgIE9NWF9TMzIgUmVzdWx0OwotICAgIAotICAgIFJlc3VsdCA9IChPTVhfUzMyKShWYWx1ZTEqVmFsdWUyKTsKLSAgICBSZXN1bHQgPSBhcm1TYXRBZGRfUzMyKCBNYWMgLCBSZXN1bHQgKTsKLQotICAgIHJldHVybiBSZXN1bHQ7ICAgIAotfQotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRNYWNfUzE2UzMyX1MzMgotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBNQUMgb3BlcmF0aW9uIG9mIHRoZSB0aHJlZSBpbnB1dHMgZGVsYXlFbGVtLCBmaWxUYXAgLCBtYWMKLSAqCi0gKiAgIG1hYyA9IG1hYyArIFNhdHVyYXRlX2luXzMyQml0cyhkZWxheUVsZW0gKiBmaWxUYXApCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBkZWxheUVsZW0gICAgRmlyc3QgMzIgYml0IE9wZXJhbmQKLSAqIFtpbl0gZmlsVGFwICAgICAgIFNlY29uZCAxNiBiaXQgT3BlcmFuZAotICogW2luXSBtYWMgICAgICAgICAgUmVzdWx0IG9mIE1BQyBvcGVyYXRpb24KLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgbWFjICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAgICAKLSAqKi8KLSAKLU9NWF9TMzIgYXJtU2F0TWFjX1MxNlMzMl9TMzIoT01YX1MzMiBtYWMsIE9NWF9TMzIgZGVsYXlFbGVtLCBPTVhfUzE2IGZpbFRhcCApCi17Ci0gICAgCi0gICAgT01YX1MzMiByZXN1bHQ7Ci0KLSAgICByZXN1bHQgPSBhcm1TYXRNdWxTMTZTMzJfUzMyKGZpbFRhcCxkZWxheUVsZW0pOyAKLQotICAgIGlmICggcmVzdWx0ID4gT01YX01BWF9TMTYgKQotICAgIHsKLSAgICAgICAgcmVzdWx0ID0gT01YX01BWF9TMzI7Ci0gICAgfQotICAgIGVsc2UgaWYoIHJlc3VsdCA8IE9NWF9NSU5fUzE2ICkKLSAgICB7Ci0gICAgICAgIHJlc3VsdCA9IE9NWF9NSU5fUzMyOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXN1bHQgPSBkZWxheUVsZW0gKiBmaWxUYXA7Ci0gICAgfQotCi0gICAgbWFjID0gYXJtU2F0QWRkX1MzMihtYWMscmVzdWx0KTsKLSAgICAKLSAgICByZXR1cm4gbWFjOwotfQotCi0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdFJvdW5kUmlnaHRTaGlmdF9TMzJfUzE2Ci0gKgotICogRGVzY3JpcHRpb24gOgotICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygcm91bmRlZCByaWdodCBzaGlmdCBvcGVyYXRpb24gb2YgaW5wdXQgYnkgdGhlIHNjYWxlZmFjdG9yCi0gKgotICogICBvdXRwdXQgPSBTYXR1cmF0ZV9pbl8xNkJpdHMoICggUmlnaHQvTGVmdFNoaWZ0KCAoUm91bmQoaW5wdXQpICwgc2hpZnQgKSApCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBpbnB1dCAgICAgICBUaGUgaW5wdXQgdG8gYmUgb3BlcmF0ZWQgb24KLSAqIFtpbl0gc2hpZnQgVGhlIHNoaWZ0IG51bWJlcgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogICAgCi0gKiovCi0KLQotT01YX1MxNiBhcm1TYXRSb3VuZFJpZ2h0U2hpZnRfUzMyX1MxNihPTVhfUzMyIGlucHV0LCBPTVhfSU5UIHNoaWZ0KQotewotICAgIGlucHV0ID0gYXJtU2F0Um91bmRMZWZ0U2hpZnRfUzMyKGlucHV0LC1zaGlmdCk7Ci0KLSAgICBpZiAoIGlucHV0ID4gT01YX01BWF9TMTYgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChPTVhfUzE2KU9NWF9NQVhfUzE2OwotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dCA8IE9NWF9NSU5fUzE2KQotICAgIHsKLSAgICAgICAgcmV0dXJuIChPTVhfUzE2KU9NWF9NSU5fUzE2OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgIHJldHVybiAoT01YX1MxNilpbnB1dDsKLSAgICB9Ci0KLX0KLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0Um91bmRMZWZ0U2hpZnRfUzMyKCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRpbmcgbGVmdC1zaGlmdCBvcGVyYXRpb24gb24gaW5wdXQKLSAqICAgICBPciByb3VuZGVkIFJpZ2h0IHNoaWZ0IGlmIHRoZSBpbnB1dCBTaGlmdCBpcyBuZWdhdGl2ZS4KLSAqICAgICAKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gVmFsdWUgICAgICAgIE9wZXJhbmQKLSAqIFtpbl0gU2hpZnQgICAgICAgIE9wZXJhbmQgZm9yIHNoaWZ0IG9wZXJhdGlvbgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqICAgIAotICoqLwotCi1PTVhfUzMyIGFybVNhdFJvdW5kTGVmdFNoaWZ0X1MzMihPTVhfUzMyIFZhbHVlLCBPTVhfSU5UIFNoaWZ0KQotewotICAgIE9NWF9JTlQgaTsKLSAgICAKLSAgICBpZiAoU2hpZnQgPCAwKQotICAgIHsKLSAgICAgICAgU2hpZnQgPSAtU2hpZnQ7Ci0gICAgICAgIFZhbHVlID0gYXJtU2F0QWRkX1MzMihWYWx1ZSwgKDEgPDwgKFNoaWZ0IC0gMSkpKTsKLSAgICAgICAgVmFsdWUgPSBWYWx1ZSA+PiBTaGlmdDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IFNoaWZ0OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbHVlID0gYXJtU2F0QWRkX1MzMihWYWx1ZSwgVmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBWYWx1ZTsKLX0KLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0Um91bmRMZWZ0U2hpZnRfUzY0KCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRpbmcgbGVmdC1zaGlmdCBvcGVyYXRpb24gb24gaW5wdXQKLSAqICAgICBPciByb3VuZGVkIFJpZ2h0IHNoaWZ0IGlmIHRoZSBpbnB1dCBTaGlmdCBpcyBuZWdhdGl2ZS4KLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIFZhbHVlICAgICAgICBPcGVyYW5kCi0gKiBbaW5dIHNoaWZ0ICAgICAgICBPcGVyYW5kIGZvciBzaGlmdCBvcGVyYXRpb24KLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAgICAKLSAqKi8KLSAKLU9NWF9TNjQgYXJtU2F0Um91bmRMZWZ0U2hpZnRfUzY0KE9NWF9TNjQgVmFsdWUsIE9NWF9JTlQgU2hpZnQpCi17Ci0gICAgT01YX0lOVCBpOwotICAgIAotICAgIGlmIChTaGlmdCA8IDApCi0gICAgewotICAgICAgICBTaGlmdCA9IC1TaGlmdDsKLSAgICAgICAgVmFsdWUgPSBhcm1TYXRBZGRfUzY0KFZhbHVlLCAoKE9NWF9TNjQpMSA8PCAoU2hpZnQgLSAxKSkpOwotICAgICAgICBWYWx1ZSA9IFZhbHVlID4+IFNoaWZ0OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgU2hpZnQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgVmFsdWUgPSBhcm1TYXRBZGRfUzY0KFZhbHVlLCBWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIFZhbHVlOwotfQotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRNdWxTMTZTMzJfUzMyKCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGEgUzE2IGRhdGEgdHlwZSBtdWx0aXBsaWVkIHdpdGggYW4gUzMyIGRhdGEgdHlwZQotICogICAgIGluIGEgUzMyIGNvbnRhaW5lcgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gaW5wdXQxICAgICAgIE9wZXJhbmQgMQotICogW2luXSBpbnB1dDIgICAgICAgT3BlcmFuZCAyCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogICAgCi0gKiovCi0KLQotT01YX1MzMiBhcm1TYXRNdWxTMTZTMzJfUzMyKE9NWF9TMTYgaW5wdXQxLE9NWF9TMzIgaW5wdXQyKQotewotICAgIE9NWF9TMTYgaGkyLGxvMTsKLSAgICBPTVhfVTE2IGxvMjsKLSAgICAKLSAgICBPTVhfUzMyIHRlbXAxLHRlbXAyOwotICAgIE9NWF9TMzIgcmVzdWx0OwotICAgIAotICAgIGxvMSAgPSBpbnB1dDE7Ci0KLSAgICBoaTIgID0gKCBpbnB1dDIgPj4gIDE2ICk7Ci0gICAgbG8yICA9ICggKE9NWF9VMzIpKCBpbnB1dDIgPDwgMTYgKSA+PiAxNiApOwotICAgIAotICAgIHRlbXAxID0gaGkyICogbG8xOwotICAgIHRlbXAyID0gKCBsbzIqIGxvMSApID4+IDE2OwotCi0gICAgcmVzdWx0ID0gIGFybVNhdEFkZF9TMzIodGVtcDEsdGVtcDIpOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0TXVsUzMyUzMyX1MzMigpCi0gKgotICogRGVzY3JpcHRpb24gOgotICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBhIFMzMiBkYXRhIHR5cGUgbXVsdGlwbGllZCB3aXRoIGFuIFMzMiBkYXRhIHR5cGUKLSAqICAgICBpbiBhIFMzMiBjb250YWluZXIKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIGlucHV0MSAgICAgICBPcGVyYW5kIDEKLSAqIFtpbl0gaW5wdXQyICAgICAgIE9wZXJhbmQgMgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqICAgIAotICoqLwotCi1PTVhfUzMyIGFybVNhdE11bFMzMlMzMl9TMzIoT01YX1MzMiBpbnB1dDEsT01YX1MzMiBpbnB1dDIpCi17Ci0gICAgT01YX1MxNiBoaTEsaGkyOwotICAgIE9NWF9VMTYgbG8xLGxvMjsKLSAgICAKLSAgICBPTVhfUzMyIHRlbXAxLHRlbXAyLHRlbXAzOwotICAgIE9NWF9TMzIgcmVzdWx0OwotCi0gICAgaGkxICA9ICggaW5wdXQxID4+ICAxNiApOwotICAgIGxvMSAgPSAoIChPTVhfVTMyKSggaW5wdXQxIDw8IDE2ICkgPj4gMTYgKTsKLQotICAgIGhpMiAgPSAoIGlucHV0MiA+PiAgMTYgKTsKLSAgICBsbzIgID0gKCAoT01YX1UzMikoIGlucHV0MiA8PCAxNiApID4+IDE2ICk7Ci0gICAgCi0gICAgdGVtcDEgPSAgIGhpMSAqIGhpMjsKLSAgICB0ZW1wMiA9ICggaGkxKiBsbzIgKSA+PiAxNjsKLSAgICB0ZW1wMyA9ICggaGkyKiBsbzEgKSA+PiAxNjsKLQotICAgIHJlc3VsdCA9IGFybVNhdEFkZF9TMzIodGVtcDEsdGVtcDIpOwotICAgIHJlc3VsdCA9IGFybVNhdEFkZF9TMzIocmVzdWx0LHRlbXAzKTsKLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogRnVuY3Rpb24gOmFybUludERpdkF3YXlGcm9tWmVybygpCi0gKgotICogRGVzY3JpcHRpb24gOiBJbnRlZ2VyIGRpdmlzaW9uIHdpdGggcm91bmRpbmcgdG8gdGhlIG5lYXJlc3QgaW50ZWdlci4gCi0gKiAgICAgICAgICAgICAgIEhhbGYtaW50ZWdlciB2YWx1ZXMgYXJlIHJvdW5kZWQgYXdheSBmcm9tIHplcm8KLSAqICAgICAgICAgICAgICAgdW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQuIEZvciBleGFtcGxlIDMvLzIgaXMgcm91bmRlZCAKLSAqICAgICAgICAgICAgICAgdG8gMiwgYW5kIC0zLy8yIGlzIHJvdW5kZWQgdG8gLTIuCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBOdW0gICAgICAgIE9wZXJhbmQgMQotICogW2luXSBEZW5vICAgICAgIE9wZXJhbmQgMgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24gaW5wdXQxLy9pbnB1dDIKLSAqICAgIAotICoqLwotCi1PTVhfUzMyIGFybUludERpdkF3YXlGcm9tWmVybyAoT01YX1MzMiBOdW0sIE9NWF9TMzIgRGVubykKLXsKLSAgICBPTVhfRjY0IHJlc3VsdDsKLSAgICAKLSAgICByZXN1bHQgPSAoKE9NWF9GNjQpTnVtKS8oKE9NWF9GNjQpRGVubyk7Ci0gICAgCi0gICAgaWYgKHJlc3VsdCA+PSAwKQotICAgIHsKLSAgICAgICAgcmVzdWx0ICs9IDAuNTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmVzdWx0IC09IDAuNTsKLSAgICB9Ci0KLSAgICByZXR1cm4gKE9NWF9TMzIpKHJlc3VsdCk7Ci19Ci0KLQotLypFbmQgb2YgRmlsZSovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2Uvc3JjL2FybUNPTU1fQml0c3RyZWFtLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3NyYy9hcm1DT01NX0JpdHN0cmVhbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWY1M2NhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2Uvc3JjL2FybUNPTU1fQml0c3RyZWFtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybUNPTU1fQml0c3RyZWFtLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBEZWZpbmVzIGJpdHN0cmVhbSBlbmNvZGUgYW5kIGRlY29kZSBmdW5jdGlvbnMgY29tbW9uIHRvIGFsbCBjb2RlY3MKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtQ09NTV9CaXRzdHJlYW0uaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRml4ZWQgYml0IGxlbmd0aCBEZWNvZGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogRnVuY3Rpb246IGFybUxvb2tBaGVhZEJpdHMoKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogR2V0IHRoZSBuZXh0IE4gYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0gd2l0aG91dCBhZHZhbmNpbmcgdGhlIGJpdHN0cmVhbSBwb2ludGVyCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gICAgICoqcHBCaXRTdHJlYW0KLSAqIFtpbl0gICAgICpwT2Zmc2V0Ci0gKiBbaW5dICAgICBOPTEuLi4zMgotICoKLSAqIFJldHVybnMgIFZhbHVlCi0gKi8KLQotT01YX1UzMiBhcm1Mb29rQWhlYWRCaXRzKGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLCBPTVhfSU5UICpwT2Zmc2V0LCBPTVhfSU5UIE4pCi17Ci0gICAgY29uc3QgT01YX1U4ICpwQml0U3RyZWFtID0gKnBwQml0U3RyZWFtOwotICAgIE9NWF9JTlQgT2Zmc2V0ID0gKnBPZmZzZXQ7Ci0gICAgT01YX1UzMiBWYWx1ZTsKLQotICAgIGFybUFzc2VydChPZmZzZXQ+PTAgJiYgT2Zmc2V0PD03KTsKLSAgICBhcm1Bc3NlcnQoTj49MSAmJiBOPD0zMik7Ci0KLSAgICAvKiBSZWFkIG5leHQgMzIgYml0cyBmcm9tIHN0cmVhbSAqLwotICAgIFZhbHVlID0gKHBCaXRTdHJlYW1bMF0gPDwgMjQgKSB8ICggcEJpdFN0cmVhbVsxXSA8PCAxNikgIHwgKHBCaXRTdHJlYW1bMl0gPDwgOCApIHwgKHBCaXRTdHJlYW1bM10pIDsKLSAgICBWYWx1ZSA9IChWYWx1ZSA8PCBPZmZzZXQgKSB8IChwQml0U3RyZWFtWzRdID4+ICg4LU9mZnNldCkpOwotCi0gICAgLyogUmV0dXJuIE4gYml0cyAqLwotICAgIHJldHVybiBWYWx1ZSA+PiAoMzItTik7Ci19Ci0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtR2V0Qml0cygpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBSZWFkIE4gYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0KLSAqICAgIAotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQotICogW2luXSAgICAgKnBPZmZzZXQKLSAqIFtpbl0gICAgIE49MS4uMzIKLSAqCi0gKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KLSAqIFtvdXRdICAgICpwT2Zmc2V0Ci0gKiBSZXR1cm5zICBWYWx1ZQotICovCi0KLQotT01YX1UzMiBhcm1HZXRCaXRzKGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLCBPTVhfSU5UICpwT2Zmc2V0LCBPTVhfSU5UIE4pCi17Ci0gICAgY29uc3QgT01YX1U4ICpwQml0U3RyZWFtID0gKnBwQml0U3RyZWFtOwotICAgIE9NWF9JTlQgT2Zmc2V0ID0gKnBPZmZzZXQ7Ci0gICAgT01YX1UzMiBWYWx1ZTsKLSAgICAKLSAgICBpZihOID09IDApCi0gICAgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgYXJtQXNzZXJ0KE9mZnNldD49MCAmJiBPZmZzZXQ8PTcpOwotICAgIGFybUFzc2VydChOPj0xICYmIE48PTMyKTsKLQotICAgIC8qIFJlYWQgbmV4dCAzMiBiaXRzIGZyb20gc3RyZWFtICovCi0gICAgVmFsdWUgPSAocEJpdFN0cmVhbVswXSA8PCAyNCApIHwgKCBwQml0U3RyZWFtWzFdIDw8IDE2KSAgfCAocEJpdFN0cmVhbVsyXSA8PCA4ICkgfCAocEJpdFN0cmVhbVszXSkgOwotICAgIFZhbHVlID0gKFZhbHVlIDw8IE9mZnNldCApIHwgKHBCaXRTdHJlYW1bNF0gPj4gKDgtT2Zmc2V0KSk7Ci0KLSAgICAvKiBBZHZhbmNlIGJpdHN0cmVhbSBwb2ludGVyIGJ5IE4gYml0cyAqLwotICAgIE9mZnNldCArPSBOOwotICAgICpwcEJpdFN0cmVhbSA9IHBCaXRTdHJlYW0gKyAoT2Zmc2V0Pj4zKTsKLSAgICAqcE9mZnNldCA9IE9mZnNldCAmIDc7Ci0KLSAgICAvKiBSZXR1cm4gTiBiaXRzICovCi0gICAgcmV0dXJuIFZhbHVlID4+ICgzMi1OKTsKLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtQnl0ZUFsaWduKCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIEFsaWduIHRoZSBwb2ludGVyICpwcEJpdFN0cmVhbSB0byB0aGUgbmV4dCBieXRlIGJvdW5kYXJ5Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQotICogW2luXSAgICAgKnBPZmZzZXQKLSAqCi0gKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KLSAqIFtvdXRdICAgICpwT2Zmc2V0Ci0gKgotICoqLwotIAotT01YVm9pZCBhcm1CeXRlQWxpZ24oY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sT01YX0lOVCAqcE9mZnNldCkKLXsKLSAgICBpZigqcE9mZnNldCA+IDApCi0gICAgewotICAgICAgICAqcHBCaXRTdHJlYW0gKz0gMTsKLSAgICAgICAgKnBPZmZzZXQgPSAwOwotICAgIH0gICAgCi19Ci0KLS8qKiAKLSAqIEZ1bmN0aW9uOiBhcm1Ta2lwQml0cygpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBTa2lwIE4gYml0cyBmcm9tIHRoZSB2YWx1ZSBhdCAqcHBCaXRTdHJlYW0KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgICAgKnBwQml0U3RyZWFtCi0gKiBbaW5dICAgICAqcE9mZnNldAotICogW2luXSAgICAgTgotICoKLSAqIFtvdXRdICAgICpwcEJpdFN0cmVhbQotICogW291dF0gICAgKnBPZmZzZXQKLSAqCi0gKiovCi0KLQotT01YVm9pZCBhcm1Ta2lwQml0cyhjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSxPTVhfSU5UICpwT2Zmc2V0LE9NWF9JTlQgTikKLXsKLSAgICBPTVhfSU5UIE9mZnNldCA9ICpwT2Zmc2V0OwotICAgIGNvbnN0IE9NWF9VOCAqcEJpdFN0cmVhbSA9ICpwcEJpdFN0cmVhbTsKLSAgIAotICAgIC8qIEFkdmFuY2UgYml0c3RyZWFtIHBvaW50ZXIgYnkgTiBiaXRzICovCi0gICAgT2Zmc2V0ICs9IE47Ci0gICAgKnBwQml0U3RyZWFtID0gcEJpdFN0cmVhbSArIChPZmZzZXQ+PjMpOwotICAgICpwT2Zmc2V0ID0gT2Zmc2V0ICYgNzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVmFyaWFibGUgYml0IGxlbmd0aCBEZWNvZGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogRnVuY3Rpb246IGFybVVuUGFja1ZMQzMyKCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFZhcmlhYmxlIGxlbmd0aCBkZWNvZGUgb2YgdmFyaWFibGUgbGVuZ3RoIHN5bWJvbCAobWF4IHNpemUgMzIgYml0cykgcmVhZCBmcm9tCi0gKiB0aGUgYml0IHN0cmVhbSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSBhdCAqcE9mZnNldCBieSB1c2luZyB0aGUgdGFibGUKLSAqIHBvaW50ZWQgYnkgcENvZGVCb29rCi0gKiAKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICAgICAqcEJpdFN0cmVhbQotICogW2luXSAgICAgKnBPZmZzZXQKLSAqIFtpbl0gICAgIHBDb2RlQm9vawotICogCi0gKiBbb3V0XSAgICAqcEJpdFN0cmVhbQotICogW291dF0gICAgKnBPZmZzZXQKLSAqCi0gKiBSZXR1cm5zIDogQ29kZSBCb29rIEluZGV4IGlmIHN1Y2Nlc3NmdWxsLiAKLSAqICAgICAgICAgOiBBUk1fTk9fQ09ERUJPT0tfSU5ERVggPSAtMSBpZiBzZWFyY2ggZmFpbHMuCi0gKiovCi0jaWZuZGVmIENfT1BUSU1JWkVEX0lNUExFTUVOVEFUSU9OIAotCi1PTVhfVTE2IGFybVVuUGFja1ZMQzMyKAotICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgIE9NWF9JTlQgKnBPZmZzZXQsCi0gICAgY29uc3QgQVJNX1ZMQzMyICpwQ29kZUJvb2sKLSkKLXsgICAgCi0gICAgY29uc3QgT01YX1U4ICpwQml0U3RyZWFtID0gKnBwQml0U3RyZWFtOwotICAgIE9NWF9JTlQgT2Zmc2V0ID0gKnBPZmZzZXQ7Ci0gICAgT01YX1UzMiBWYWx1ZTsKLSAgICBPTVhfSU5UIEluZGV4OwotICAgICAgICAKLSAgICBhcm1Bc3NlcnQoT2Zmc2V0Pj0wICYmIE9mZnNldDw9Nyk7Ci0KLSAgICAvKiBSZWFkIG5leHQgMzIgYml0cyBmcm9tIHN0cmVhbSAqLwotICAgIFZhbHVlID0gKHBCaXRTdHJlYW1bMF0gPDwgMjQgKSB8ICggcEJpdFN0cmVhbVsxXSA8PCAxNikgIHwgKHBCaXRTdHJlYW1bMl0gPDwgOCApIHwgKHBCaXRTdHJlYW1bM10pIDsKLSAgICBWYWx1ZSA9IChWYWx1ZSA8PCBPZmZzZXQgKSB8IChwQml0U3RyZWFtWzRdID4+ICg4LU9mZnNldCkpOwotCi0gICAgLyogU2VhcmNoIHRocm91Z2ggdGhlIGNvZGVib29rICovICAgIAotICAgIGZvciAoSW5kZXg9MDsgcENvZGVCb29rLT5jb2RlTGVuICE9IDA7IEluZGV4KyspCi0gICAgewotICAgICAgICBpZiAocENvZGVCb29rLT5jb2RlV29yZCA9PSAoVmFsdWUgPj4gKDMyIC0gcENvZGVCb29rLT5jb2RlTGVuKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9mZnNldCAgICAgICA9IE9mZnNldCArIHBDb2RlQm9vay0+Y29kZUxlbjsKLSAgICAgICAgICAgICpwcEJpdFN0cmVhbSA9IHBCaXRTdHJlYW0gKyAoT2Zmc2V0ID4+IDMpIDsKLSAgICAgICAgICAgICpwT2Zmc2V0ICAgICA9IE9mZnNldCAmIDc7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBJbmRleDsKLSAgICAgICAgfSAgICAgICAgCi0gICAgICAgIHBDb2RlQm9vaysrOwotICAgIH0KLQotICAgIC8qIE5vIGNvZGUgbWF0Y2ggZm91bmQgKi8KLSAgICByZXR1cm4gQVJNX05PX0NPREVCT09LX0lOREVYOwotfQotCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRml4ZWQgYml0IGxlbmd0aCBFbmNvZGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogRnVuY3Rpb246IGFybVBhY2tCaXRzCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQYWNrIGEgVkxDIGNvZGUgd29yZCBpbnRvIHRoZSBiaXRzdHJlYW0KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHBwQml0U3RyZWFtICAgICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbS4KLSAqIFtpbl0gcE9mZnNldCAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSAKLSAqICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMAotICogICAgICAgICAgICAgICAgICAgICAgdG8gNy4KLSAqIFtpbl0gY29kZVdvcmQgICAgICAgIENvZGUgd29yZCB0aGF0IG5lZWQgdG8gYmUgaW5zZXJ0ZWQgaW4gdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtCi0gKiBbaW5dIGNvZGVMZW5ndGggICAgICBMZW5ndGggb2YgdGhlIGNvZGUgd29yZCB2YWxpZCByYW5nZSAxLi4uMzIKLSAqCi0gKiBbb3V0XSBwcEJpdFN0cmVhbSAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gYnVmZmVyLgotICogW291dF0gcEJpdE9mZnNldCAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWF9SRVNVTFQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLSAKLU9NWFJlc3VsdCBhcm1QYWNrQml0cyAoCi0gICAgT01YX1U4ICAqKnBwQml0U3RyZWFtLCAKLSAgICBPTVhfSU5UICpwT2Zmc2V0LAotICAgIE9NWF9VMzIgY29kZVdvcmQsIAotICAgIE9NWF9JTlQgY29kZUxlbmd0aCAKLSkKLXsKLSAgICBPTVhfVTggICpwQml0U3RyZWFtID0gKnBwQml0U3RyZWFtOwotICAgIE9NWF9JTlQgT2Zmc2V0ID0gKnBPZmZzZXQ7Ci0gICAgT01YX1UzMiBWYWx1ZTsKLSAgICAgICAgCi0gICAgLyogY2hlY2tpbmcgYXJndW1lbnQgdmFsaWRpdHkgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihPZmZzZXQgPCAwLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoT2Zmc2V0ID4gNywgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGNvZGVMZW5ndGggPCAxLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoY29kZUxlbmd0aCA+IDMyLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0KLSAgICAvKiBQcmVwYXJlIHRoZSBmaXJzdCBieXRlICovCi0gICAgY29kZVdvcmQgPSBjb2RlV29yZCA8PCAoMzItY29kZUxlbmd0aCk7Ci0gICAgVmFsdWUgPSAocEJpdFN0cmVhbVswXSA+PiAoOC1PZmZzZXQpKSA8PCAoOC1PZmZzZXQpOwotICAgIFZhbHVlID0gVmFsdWUgfCAoY29kZVdvcmQgPj4gKDI0K09mZnNldCkpOwotCi0gICAgLyogV3JpdGUgb3V0IHdob2xlIGJ5dGVzICovCi0gICAgd2hpbGUgKDgtT2Zmc2V0IDw9IGNvZGVMZW5ndGgpCi0gICAgewotICAgICAgICAqcEJpdFN0cmVhbSsrID0gKE9NWF9VOClWYWx1ZTsKLSAgICAgICAgY29kZVdvcmQgICA9IGNvZGVXb3JkICA8PCAoOC1PZmZzZXQpOwotICAgICAgICBjb2RlTGVuZ3RoID0gY29kZUxlbmd0aCAtICg4LU9mZnNldCk7Ci0gICAgICAgIE9mZnNldCA9IDA7Ci0gICAgICAgIFZhbHVlID0gY29kZVdvcmQgPj4gMjQ7Ci0gICAgfQotCi0gICAgLyogV3JpdGUgb3V0IGZpbmFsIHBhcnRpYWwgYnl0ZSAqLwotICAgICpwQml0U3RyZWFtICA9IChPTVhfVTgpVmFsdWU7Ci0gICAgKnBwQml0U3RyZWFtID0gcEJpdFN0cmVhbTsKLSAgICAqcE9mZnNldCA9IE9mZnNldCArIGNvZGVMZW5ndGg7Ci0gICAgCi0gICAgcmV0dXJuICBPTVhfU3RzX05vRXJyOwotfQotIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVmFyaWFibGUgYml0IGxlbmd0aCBFbmNvZGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogRnVuY3Rpb246IGFybVBhY2tWTEMzMgotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGFjayBhIFZMQyBjb2RlIHdvcmQgaW50byB0aGUgYml0c3RyZWFtCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIAotICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0uCi0gKiBbaW5dCXBCaXRPZmZzZXQJICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSAKLSAqICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMAotICogICAgICAgICAgICAgICAgICAgICAgdG8gNy4KLSAqIFtpbl0JIGNvZGUgICAgIAkJVkxDIGNvZGUgd29yZCB0aGF0IG5lZWQgdG8gYmUgaW5zZXJ0ZWQgaW4gdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICBiaXRzdHJlYW0KLSAqCi0gKiBbb3V0XSBwcEJpdFN0cmVhbQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwKLSAqCSAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0Ci0gKgkJCQkJCXN0cmVhbSBidWZmZXIuCi0gKiBbb3V0XSBwQml0T2Zmc2V0CQkqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQotICoJCQkJCQljdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Ci0gKgkJCQkJCSpwcEJpdFN0cmVhbS4KLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhfUkVTVUxUIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0gCi1PTVhSZXN1bHQgYXJtUGFja1ZMQzMyICgKLSAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwgCi0gICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICBBUk1fVkxDMzIgY29kZSAKLSkKLXsKLSAgICByZXR1cm4gKGFybVBhY2tCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBjb2RlLmNvZGVXb3JkLCBjb2RlLmNvZGVMZW4pKTsKLX0KLQotLypFbmQgb2YgRmlsZSovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2FwaS9hcm1WQy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9hcGkvYXJtVkMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRiZThiNi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2FwaS9hcm1WQy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE2OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkMuaAotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIEZpbGU6IGFybVZpZGVvLmgKLSAqIEJyaWVmOiBEZWNsYXJlcyBBUEkncy9CYXNpYyBEYXRhIHR5cGVzIHVzZWQgYWNyb3NzIHRoZSBPcGVuTUFYIFZpZGVvIGRvbWFpbgotICoKLSAqLwotCi0KLSNpZm5kZWYgX2FybVZpZGVvX0hfCi0jZGVmaW5lIF9hcm1WaWRlb19IXwotCi0jaW5jbHVkZSAib214VkMuaCIKLSNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgotCi0vKioKLSAqIEFSTSBzcGVjaWZpYyBzdGF0ZSBzdHJ1Y3R1cmUgdG8gaG9sZCBNb3Rpb24gRXN0aW1hdGlvbiBpbmZvcm1hdGlvbi4KLSAqLwotIAotc3RydWN0IG00cDJfTUVTcGVjCi17Ci0gICAgT01YVkNNNFAyTUVQYXJhbXMgTUVQYXJhbXM7Ci0gICAgT01YVkNNNFAyTUVNb2RlICAgTUVNb2RlOwotfTsKLQotc3RydWN0IG00cDEwX01FU3BlYwotewotICAgIE9NWFZDTTRQMTBNRVBhcmFtcyBNRVBhcmFtczsKLSAgICBPTVhWQ000UDEwTUVNb2RlICAgTUVNb2RlOwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgbTRwMl9NRVNwZWMgIEFSTVZDTTRQMl9NRVNwZWM7Ci10eXBlZGVmIHN0cnVjdCBtNHAxMF9NRVNwZWMgQVJNVkNNNFAxMF9NRVNwZWM7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9Db21wYXJlTVYKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGNvbXBhcmlzaW9uIG9mIG1vdGlvbiB2ZWN0b3JzIGFuZCBTQUQncyB0byBkZWNpZGUgdGhlCi0gKiBiZXN0IE1WIGFuZCBTQUQKLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICAgICBtdlggICAgIHggY29vcmRpbmF0ZSBvZiB0aGUgY2FuZGlkYXRlIG1vdGlvbiB2ZWN0b3IKLSAqIFtpbl0gICAgIG12WSAgICAgeSBjb29yZGluYXRlIG9mIHRoZSBjYW5kaWRhdGUgbW90aW9uIHZlY3RvcgotICogW2luXSAgICAgY2FuZFNBRCBDYW5kaWRhdGUgU0FECi0gKiBbaW5dICAgICBiZXN0TVZYIHggY29vcmRpbmF0ZSBvZiB0aGUgYmVzdCBtb3Rpb24gdmVjdG9yCi0gKiBbaW5dICAgICBiZXN0TVZZIHkgY29vcmRpbmF0ZSBvZiB0aGUgYmVzdCBtb3Rpb24gdmVjdG9yCi0gKiBbaW5dICAgICBiZXN0U0FEIGJlc3QgU0FECi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX0lOVCAtLSAxIHRvIGluZGljYXRlIHRoYXQgdGhlIGN1cnJlbnQgc2FkIGlzIHRoZSBiZXN0Ci0gKiAgICAgICAgICAgIDAgdG8gaW5kaWNhdGUgdGhhdCBpdCBpcyBOT1QgdGhlIGJlc3QgU0FECi0gKi8KLQotT01YX0lOVCBhcm1WQ000UDJfQ29tcGFyZU1WICgKLSAgICBPTVhfUzE2IG12WCwKLSAgICBPTVhfUzE2IG12WSwKLSAgICBPTVhfSU5UIGNhbmRTQUQsCi0gICAgT01YX1MxNiBiZXN0TVZYLAotICAgIE9NWF9TMTYgYmVzdE1WWSwKLSAgICBPTVhfSU5UIGJlc3RTQUQpOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfQUNEQ1ByZWRpY3QKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGFkYXB0aXZlIERDL0FDIGNvZWZmaWNpZW50IHByZWRpY3Rpb24gZm9yIGFuIGludHJhIGJsb2NrLiBQcmlvcgotICogdG8gdGhlIGZ1bmN0aW9uIGNhbGwsIHByZWRpY3Rpb24gZGlyZWN0aW9uIChwcmVkRGlyKSBzaG91bGQgYmUgc2VsZWN0ZWQKLSAqIGFzIHNwZWNpZmllZCBpbiBzdWJjbGF1c2UgNy40LjMuMSBvZiBJU08vSUVDIDE0NDk2LTIuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBwU3JjRHN0ICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgd2hpY2ggY29udGFpbnMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcXVhbnRpemVkIGNvZWZmaWNpZW50IHJlc2lkdWFscyAoUFFGKSBvZiB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJsb2NrCi0gKiBbaW5dIHBQcmVkQnVmUm93IHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHJvdyBidWZmZXIKLSAqIFtpbl0gcFByZWRCdWZDb2wgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcgotICogW2luXSBjdXJRUCAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBjdXJyZW50IGJsb2NrLiBjdXJRUAotICogICAgICAgICAgICAgICAgICAgICAgICAgIG1heSBlcXVhbCB0byBwcmVkUVAgZXNwZWNpYWxseSB3aGVuIHRoZSBjdXJyZW50Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sgYW5kIHRoZSBwcmVkaWN0b3IgYmxvY2sgYXJlIGluIHRoZSBzYW1lCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9jay4KLSAqIFtpbl0gcHJlZFFQICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgcHJlZGljdG9yIGJsb2NrCi0gKiBbaW5dIHByZWREaXIgICAgIGluZGljYXRlcyB0aGUgcHJlZGljdGlvbiBkaXJlY3Rpb24gd2hpY2ggdGFrZXMgb25lCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX0hPUklaT05UQUwgICAgcHJlZGljdCBob3Jpem9udGFsbHkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fVkVSVElDQUwgICAgICBwcmVkaWN0IHZlcnRpY2FsbHkKLSAqIFtpbl0gQUNQcmVkRmxhZyAgYSBmbGFnIGluZGljYXRpbmcgaWYgQUMgcHJlZGljdGlvbiBzaG91bGQgYmUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtZWQuIEl0IGlzIGVxdWFsIHRvIGFjX3ByZWRfZmxhZyBpbiB0aGUgYml0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIHN5bnRheCBvZiBNUEVHLTQKLSAqIFtpbl0gdmlkZW9Db21wICAgdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSwgY2hyb21pbmFuY2Ugb3IKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSkgb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqIFtpbl0gZmxhZyAgICAgICAgVGhpcyBmbGFnIGRlZmluZXMgdGhlIGlmIG9uZSB3YW50cyB0byB1c2UgdGhpcyBmdW5jdGlvbnMgdG8KLSAqICAgICAgICAgICAgICAgICAgY2FsY3VsYXRlIFBRRiAoc2V0IDEsIHByZWRpY3Rpb24pIG9yIFFGIChzZXQgMCwgcmVjb25zdHJ1Y3Rpb24pCi0gKiBbb3V0XSAgICBwUHJlQUNQcmVkaWN0ICAgcG9pbnRlciB0byB0aGUgcHJlZGljdGVkIGNvZWZmaWNpZW50cyBidWZmZXIuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsbGVkIE9OTFkgaWYgaXQgaXMgbm90IE5VTEwKLSAqIFtvdXRdICAgIHBTcmNEc3QgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucwotICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBxdWFudGl6ZWQgY29lZmZpY2llbnRzIChRRikgb2YgdGhlIGN1cnJlbnQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jawotICogW291dF0gICAgcFByZWRCdWZSb3cgcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyCi0gKiBbb3V0XSAgICBwUHJlZEJ1ZkNvbCBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIKLSAqIFtvdXRdICAgIHBTdW1FcnIgICAgIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgc3VtIG9mIHRoZSBkaWZmZXJlbmNlCi0gKiAgICAgICAgICAgICAgICAgICAgICBiZXR3ZWVuIHByZWRpY3RlZCBhbmQgdW5wcmVkaWN0ZWQgY29lZmZpY2llbnRzCi0gKiAgICAgICAgICAgICAgICAgICAgICBJZiB0aGlzIGlzIE5VTEwsIGRvIG5vdCB1cGRhdGUKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMl9BQ0RDUHJlZGljdCgKLSAgICAgT01YX1MxNiAqIHBTcmNEc3QsCi0gICAgIE9NWF9TMTYgKiBwUHJlQUNQcmVkaWN0LAotICAgICBPTVhfUzE2ICogcFByZWRCdWZSb3csCi0gICAgIE9NWF9TMTYgKiBwUHJlZEJ1ZkNvbCwKLSAgICAgT01YX0lOVCBjdXJRUCwKLSAgICAgT01YX0lOVCBwcmVkUVAsCi0gICAgIE9NWF9JTlQgcHJlZERpciwKLSAgICAgT01YX0lOVCBBQ1ByZWRGbGFnLAotICAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCAgdmlkZW9Db21wLAotICAgICBPTVhfVTggZmxhZywKLSAgICAgT01YX0lOVCAqcFN1bUVycgotKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX1NldFByZWREaXIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGRldGVjdGluZyB0aGUgcHJlZGljdGlvbiBkaXJlY3Rpb24KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIGJsb2NrSW5kZXggIGJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uIGFzIGRlZmluZWQgaW4gc3ViY2xhdXNlIDYuMS4zLjgsIG9mIElTTy9JRUMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAxNDQ5Ni0yLiBGdXJ0aGVybW9yZSwgaW5kZXhlcyA2IHRvIDkgaW5kaWNhdGUgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEgYmxvY2tzIHNwYXRpYWxseSBjb3JyZXNwb25kaW5nIHRvIGx1bWluYW5jZQotICogICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrcyAwIHRvIDMgaW4gdGhlIHNhbWUgbWFjcm9ibG9jay4KLSAqIFtpbl0gcENvZWZCdWZSb3cgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcgotICogW2luXSBwUXBCdWYgICAgICBwb2ludGVyIHRvIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGJ1ZmZlcgotICogW291dF0gICAgcHJlZFFQICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgcHJlZGljdG9yIGJsb2NrCi0gKiBbb3V0XSAgICBwcmVkRGlyICAgICBpbmRpY2F0ZXMgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uIHdoaWNoIHRha2VzIG9uZQotICogICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgotICogICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19IT1JJWk9OVEFMICAgIHByZWRpY3QgaG9yaXpvbnRhbGx5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX1ZFUlRJQ0FMICAgICAgcHJlZGljdCB2ZXJ0aWNhbGx5Ci0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDJfU2V0UHJlZERpcigKLSAgICAgT01YX0lOVCBibG9ja0luZGV4LAotICAgICBPTVhfUzE2ICpwQ29lZkJ1ZlJvdywKLSAgICAgT01YX1MxNiAqcENvZWZCdWZDb2wsCi0gICAgIE9NWF9JTlQgKnByZWREaXIsCi0gICAgIE9NWF9JTlQgKnByZWRRUCwKLSAgICAgY29uc3QgT01YX1U4ICpwUXBCdWYKLSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmEKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGVuY29kaW5nIGZvciBvbmUgaW50cmEgYmxvY2suCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBwcEJpdFN0cmVhbSAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiaXQgc3RyZWFtCi0gKiBbaW5dIHBCaXRPZmZzZXQgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcuCi0gKiBbaW5dIHBRRGN0QmxrQ29lZiAgICBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50Ci0gKiBbaW5dIHByZWREaXIgICAgICAgICBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbiwgd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHppZ3phZyBzY2FuIHBhdHRlcm4uIFRoaXMgdGFrZXMgb25lIG9mIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xsb3dpbmcgdmFsdWVzOgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fTk9ORSAgICAgICAgICBBQyBwcmVkaWN0aW9uIG5vdCB1c2VkLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW4uCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19IT1JJWk9OVEFMICAgIEhvcml6b250YWwgcHJlZGljdGlvbi4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLXZlcnRpY2FsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppZ3phZyBzY2FuLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fVkVSVElDQUwgICAgICBWZXJ0aWNhbCBwcmVkaWN0aW9uLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtaG9yaXpvbnRhbAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aWd6YWcgc2Nhbi4KLSAqIFtpbl0gcGF0dGVybiAgICAgICAgIGJsb2NrIHBhdHRlcm4gd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgd2hldGhlcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGJsb2NrIGlzIGVuY29kZWQKLSAqIFtpbl0gc3RhcnQgICAgICAgICAgIHN0YXJ0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBlbmNvZGluZyBiZWdpbnMgd2l0aCAwdGggZWxlbWVudAotICogICAgICAgICAgICAgICAgICAgICAgb3IgMXN0LgotICogW291dF0gICAgcHBCaXRTdHJlYW0gICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4KLSAqIFtvdXRdICAgIHBCaXRPZmZzZXQgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbS4KLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmEoCi0gICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgICBjb25zdCBPTVhfUzE2ICpwUURjdEJsa0NvZWYsCi0gICAgIE9NWF9VOCBwcmVkRGlyLAotICAgICBPTVhfVTggcGF0dGVybiwKLSAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAotICAgICBPTVhfVTggc3RhcnQKLSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmEKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBmb3Igb25lIGludHJhIGNvZGVkIGJsb2NrLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gcHBCaXRTdHJlYW0gICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYml0c3RyZWFtIGJ1ZmZlcgotICogW2luXSBwQml0T2Zmc2V0ICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYnkgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAtN10uCi0gKiBbaW5dIHByZWREaXIgICAgICAgICBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbiB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgemlnemFnIHNjYW4gcGF0dGVybi4gSXQgdGFrZXMgb25lIG9mIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xsb3dpbmcgdmFsdWVzOgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fTk9ORSAgQUMgcHJlZGljdGlvbiBub3QgdXNlZDsKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm0gY2xhc3NpY2FsIHppZ3phZyBzY2FuOwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fSE9SSVpPTlRBTCAgICBIb3Jpem9udGFsIHByZWRpY3Rpb247Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm0gYWx0ZXJuYXRlLXZlcnRpY2FsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppZ3phZyBzY2FuOwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fVkVSVElDQUwgICAgICBWZXJ0aWNhbCBwcmVkaWN0aW9uOwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHVzIHBlcmZvcm0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0ZXJuYXRlLWhvcml6b250YWwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemlnemFnIHNjYW4uCi0gKiBbaW5dIHZpZGVvQ29tcCAgICAgICB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlLCBjaHJvbWluYW5jZSBvcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSkgb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiBzaG9ydFZpZGVvSGVhZGVyPT0wLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MS4KLSAqIFtpbl0gc3RhcnQgICAgICAgICAgIHN0YXJ0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBlbmNvZGluZyBiZWdpbnMgd2l0aCAwdGggZWxlbWVudAotICogICAgICAgICAgICAgICAgICAgICAgb3IgMXN0LgotICogW291dF0gICAgcHBCaXRTdHJlYW0gICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkLCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlcgotICogW291dF0gICAgcEJpdE9mZnNldCAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtCi0gKiBbb3V0XSAgICBwRHN0ICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2suIFNob3VsZCBiZSAzMi1iaXQgYWxpZ25lZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYSgKLSAgICAgY29uc3QgT01YX1U4ICoqIHBwQml0U3RyZWFtLAotICAgICBPTVhfSU5UICogcEJpdE9mZnNldCwKLSAgICAgT01YX1MxNiAqIHBEc3QsCi0gICAgIE9NWF9VOCBwcmVkRGlyLAotICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsIAotICAgICBPTVhfVTggIHN0YXJ0Ci0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfRmlsbFZMREJ1ZmZlcgotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgZmlsbGluZyBvZiB0aGUgY29lZmZpY2llbnQgYnVmZmVyIGFjY29yZGluZyB0byB0aGUgcnVuLCBsZXZlbAotICogYW5kIHNpZ24sIGFsc28gdXBkYXRlcyB0aGUgaW5kZXgKLSAqIAotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gIHN0b3JlUnVuICAgICAgICBTdG9yZWQgUnVuIHZhbHVlIChjb3VudCBvZiB6ZXJvcykgICAKLSAqIFtpbl0gIHN0b3JlTGV2ZWwgICAgICBTdG9yZWQgTGV2ZWwgdmFsdWUgKG5vbi16ZXJvIHZhbHVlKQotICogW2luXSAgc2lnbiAgICAgICAgICAgIEZsYWcgaW5kaWNhdGluZyB0aGUgc2lnbiBvZiBsZXZlbAotICogW2luXSAgbGFzdCAgICAgICAgICAgIHN0YXR1cyBvZiB0aGUgbGFzdCBmbGFnCi0gKiBbaW5dICBwSW5kZXggICAgICAgICAgcG9pbnRlciB0byBjb2VmZmljaWVudCBpbmRleCBpbiA4eDggbWF0cml4Ci0gKiBbb3V0XSBwSW5kZXggICAgICAgICAgcG9pbnRlciB0byB1cGRhdGVkIGNvZWZmaWNpZW50IGluZGV4IGluIDh4OCAKLSAqICAgICAgICAgICAgICAgICAgICAgICBtYXRyaXgKLSAqIFtpbl0gIHBaaWd6YWdUYWJsZSAgICBwb2ludGVyIHRvIHRoZSB6aWd6YWcgdGFibGVzCi0gKiBbb3V0XSBwRHN0ICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQKLSAqICAgICAgICAgICAgICAgICAgICAgICBibG9jay4gU2hvdWxkIGJlIDMyLWJpdCBhbGlnbmVkCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMl9GaWxsVkxEQnVmZmVyKAotICAgIE9NWF9VMzIgc3RvcmVSdW4sCi0gICAgT01YX1MxNiAqIHBEc3QsCi0gICAgT01YX1MxNiBzdG9yZUxldmVsLAotICAgIE9NWF9VOCAgc2lnbiwKLSAgICBPTVhfVTggIGxhc3QsCi0gICAgT01YX1U4ICAqIGluZGV4LAotICAgIGNvbnN0IE9NWF9VOCAqIHBaaWd6YWdUYWJsZQotKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX0dldFZMQ0JpdHMKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGVzY2FwZSBtb2RlIGRlY2lzaW9uIGJhc2VkIG9uIHRoZSBydW4sIHJ1bissIGxldmVsLCBsZXZlbCsgYW5kIAotICogbGFzdCBjb21iaW5hdGlvbnMuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCi0gKgkJCQkJCQkJdGhlIGJpdCBzdHJlYW0KLSAqIFtpbl0JcEJpdE9mZnNldAkJcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKLSAqCQkJCQkJCQlieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcKLSAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiBzaG9ydFZpZGVvSGVhZGVyPT0wLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MS4KLSAqIFtpbl0gc3RhcnQgICAgICAgICAgIHN0YXJ0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBlbmNvZGluZyBiZWdpbnMgd2l0aCAKLSAqICAgICAgICAgICAgICAgICAgICAgIDB0aCBlbGVtZW50IG9yIDFzdC4KLSAqIFtpbi9vdXRdIHBMYXN0ICAgICAgIHBvaW50ZXIgdG8gbGFzdCBzdGF0dXMgZmxhZwotICogW2luXSBydW5CZWdpblNpbmdsZUxldmVsRW50cmllc0wwICAgICAgVGhlIHJ1biB2YWx1ZSBmcm9tIHdoaWNoIGxldmVsIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBlcXVhbCB0byAxOiBsYXN0ID09IDAKLSAqIFtpbl0gSW5kZXhCZWdpblNpbmdsZUxldmVsRW50cmllc0wwICAgIEFycmF5IGluZGV4IGluIHRoZSBWTEMgdGFibGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGluZyB0byB0aGUgIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMCAKLSAqIFtpbl0gcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMSAgICAgIFRoZSBydW4gdmFsdWUgZnJvbSB3aGljaCBsZXZlbCAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZXF1YWwgdG8gMTogbGFzdCA9PSAxCi0gKiBbaW5dIEluZGV4QmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMSAgICBBcnJheSBpbmRleCBpbiB0aGUgVkxDIHRhYmxlIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRpbmcgdG8gdGhlICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDAgCi0gKiBbaW5dIHBSdW5JbmRleFRhYmxlTDAgICAgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKLSAqIFtpbl0gcFZsY1RhYmxlTDAgICAgICAgICBWTEMgdGFibGUgZm9yIGxhc3QgPT0gMAotICogW2luXSBwUnVuSW5kZXhUYWJsZUwxICAgIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCi0gKiBbaW5dIHBWbGNUYWJsZUwxICAgICAgICAgVkxDIHRhYmxlIGZvciBsYXN0ID09IDEKLSAqIFtpbl0gcExNQVhUYWJsZUwwICAgICAgICBMZXZlbCBNQVggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAotICogW2luXSBwTE1BWFRhYmxlTDEgICAgICAgIExldmVsIE1BWCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCi0gKiBbaW5dIHBSTUFYVGFibGVMMCAgICAgICAgUnVuIE1BWCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCi0gKiBbaW5dIHBSTUFYVGFibGVMMSAgICAgICAgUnVuIE1BWCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCi0gKiBbb3V0XXBEc3QJCQkgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQKLSAqCQkJCQkJCWJsb2NrLiBTaG91bGQgYmUgMzItYml0IGFsaWduZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMl9HZXRWTENCaXRzICgKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgICAgICAgICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAotCQkJICBPTVhfUzE2ICogcERzdCwKLQkJCSAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAotCQkJICBPTVhfVTggICAgc3RhcnQsCQkJICAKLQkJCSAgT01YX1U4ICAqIHBMYXN0LAotCQkJICBPTVhfVTggICAgcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMCwKLQkJCSAgT01YX1U4ICAgIG1heEluZGV4Rm9yTXVsdGlwbGVFbnRyaWVzTDAsCi0JCQkgIE9NWF9VOCAgICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMSwKLQkJCSAgT01YX1U4ICAgIG1heEluZGV4Rm9yTXVsdGlwbGVFbnRyaWVzTDEsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUnVuSW5kZXhUYWJsZUwwLAotICAgICAgICAgICAgICBjb25zdCBBUk1fVkxDMzIgKnBWbGNUYWJsZUwwLAotCQkJICBjb25zdCBPTVhfVTggICogcFJ1bkluZGV4VGFibGVMMSwKLSAgICAgICAgICAgICAgY29uc3QgQVJNX1ZMQzMyICpwVmxjVGFibGVMMSwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBMTUFYVGFibGVMMCwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBMTUFYVGFibGVMMSwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSTUFYVGFibGVMMCwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSTUFYVGFibGVMMSwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBaaWd6YWdUYWJsZQotKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX1B1dFZMQ0JpdHMKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENoZWNrcyB0aGUgdHlwZSBvZiBFc2NhcGUgTW9kZSBhbmQgcHV0IGVuY29kZWQgYml0cyBmb3IgCi0gKiBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50cy4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCSBwcEJpdFN0cmVhbSAgICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgotICoJCQkJCQkgIHRoZSBiaXQgc3RyZWFtCi0gKiBbaW5dCSBwQml0T2Zmc2V0ICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNwotICogW2luXSBzaG9ydFZpZGVvSGVhZGVyIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIHNob3J0VmlkZW9IZWFkZXI9PTAsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLgotICogW2luXSAgc3RhcnQgICAgICAgICAgICBzdGFydCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZW5jb2RpbmcgYmVnaW5zIHdpdGggCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIDB0aCBlbGVtZW50IG9yIDFzdC4KLSAqIFtpbl0gIG1heFN0b3JlUnVuTDAgICAgTWF4IHN0b3JlIHBvc3NpYmxlIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGxhc3QgPSAwCi0gKiBbaW5dICBtYXhTdG9yZVJ1bkwxICAgIE1heCBzdG9yZSBwb3NzaWJsZSAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBsYXN0ID0gMQotICogW2luXSAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBydW4gdmFsdWUgYWZ0ZXIgd2hpY2ggbGV2ZWwgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZXF1YWwgdG8gMTogCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSBzdGF0dXMpIGZvciBsYXN0ID0gMAotICogW2luXSAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDEgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBydW4gdmFsdWUgYWZ0ZXIgd2hpY2ggbGV2ZWwgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZXF1YWwgdG8gMTogCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSBzdGF0dXMpIGZvciBsYXN0ID0gMQotICogW2luXSAgcFJ1bkluZGV4VGFibGVMMCBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKLSAqIFtpbl0gIHBWbGNUYWJsZUwwICAgICAgVkxDIHRhYmxlIGZvciBsYXN0ID09IDAKLSAqIFtpbl0gIHBSdW5JbmRleFRhYmxlTDEgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCi0gKiBbaW5dICBwVmxjVGFibGVMMSAgICAgIFZMQyB0YWJsZSBmb3IgbGFzdCA9PSAxCi0gKiBbaW5dICBwTE1BWFRhYmxlTDAgICAgIExldmVsIE1BWCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAotICogW2luXSAgcExNQVhUYWJsZUwxICAgICBMZXZlbCBNQVggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKLSAqIFtpbl0gIHBSTUFYVGFibGVMMCAgICAgUnVuIE1BWCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAotICogW2luXSAgcFJNQVhUYWJsZUwxICAgICBSdW4gTUFYIHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCi0gKiBbb3V0XSBwUURjdEJsa0NvZWYgICAgIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQKLSAqIFtvdXRdIHBwQml0U3RyZWFtICAgICAgKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuCi0gKiBbb3V0XSBwQml0T2Zmc2V0ICAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotCi0KLU9NWFJlc3VsdCBhcm1WQ000UDJfUHV0VkxDQml0cyAoCi0gICAgICAgICAgICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgICAgICAgICAgICBPTVhfSU5UICogcEJpdE9mZnNldCwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1MxNiAqcFFEY3RCbGtDb2VmLAotICAgICAgICAgICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCi0gICAgICAgICAgICAgIE9NWF9VOCBzdGFydCwKLSAgICAgICAgICAgICAgT01YX1U4IG1heFN0b3JlUnVuTDAsCi0gICAgICAgICAgICAgIE9NWF9VOCBtYXhTdG9yZVJ1bkwxLAotICAgICAgICAgICAgICBPTVhfVTggIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wwLAotICAgICAgICAgICAgICBPTVhfVTggIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wxLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJ1bkluZGV4VGFibGVMMCwKLSAgICAgICAgICAgICAgY29uc3QgQVJNX1ZMQzMyICpwVmxjVGFibGVMMCwKLQkJCSAgY29uc3QgT01YX1U4ICAqIHBSdW5JbmRleFRhYmxlTDEsCi0gICAgICAgICAgICAgIGNvbnN0IEFSTV9WTEMzMiAqcFZsY1RhYmxlTDEsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwTE1BWFRhYmxlTDAsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwTE1BWFRhYmxlTDEsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUk1BWFRhYmxlTDAsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUk1BWFRhYmxlTDEsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwWmlnemFnVGFibGUKLSk7Ci0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfRmlsbFZMQ0J1ZmZlcgotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgY2FsY3VsYXRpbmcgdGhlIFZMQyBiaXRzIGRlcGVuZGluZyBvbiB0aGUgZXNjYXBlIHR5cGUgYW5kIGluc2VydCAKLSAqIHRoZSBzYW1lIGluIHRoZSBiaXRzdHJlYW0KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCSBwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCi0gKgkgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYml0IHN0cmVhbQotICogW2luXQkgcEJpdE9mZnNldCAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3Ci0gKiBbaW5dICBydW4gICAgICAgICAgICAgICAgUnVuIHZhbHVlIChjb3VudCBvZiB6ZXJvcykgdG8gYmUgZW5jb2RlZCAgCi0gKiBbaW5dICBsZXZlbCAgICAgICAgICAgICAgTGV2ZWwgdmFsdWUgKG5vbi16ZXJvIHZhbHVlKSB0byBiZSBlbmNvZGVkCi0gKiBbaW5dICBydW5QbHVzICAgICAgICAgICAgQ2FsY3VsYXRlZCBhcyBydW5QbHVzID0gcnVuIC0gKFJNQVggKyAxKSAgCi0gKiBbaW5dICBsZXZlbFBsdXMgICAgICAgICAgQ2FsY3VsYXRlZCBhcyAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFBsdXMgPSBzaWduKGxldmVsKSpbYWJzKGxldmVsKSAtIExNQVhdCi0gKiBbaW5dICBmTW9kZSAgICAgICAgICAgICAgRmxhZyBpbmRpY2F0aW5nIHRoZSBlc2NhcGUgbW9kZXMKLSAqIFtpbl0gIGxhc3QgICAgICAgICAgICAgICBzdGF0dXMgb2YgdGhlIGxhc3QgZmxhZwotICogW2luXSAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBydW4gdmFsdWUgYWZ0ZXIgd2hpY2ggbGV2ZWwgd2lsbCBiZSBlcXVhbCB0byAxOiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEgc3RhdHVzKQotICogW2luXSAgcFJ1bkluZGV4VGFibGUgICAgIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfdGFibGVzX1ZMQy5oCi0gKiBbaW5dICBwVmxjVGFibGUgICAgICAgICAgVkxDIHRhYmxlIGRlZmluZWQgaW4gYXJtVkNNNFAyX0h1ZmZfdGFibGVzX1ZMQy5oCi0gKiBbb3V0XSBwcEJpdFN0cmVhbQkJKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gYnVmZmVyLgotICogW291dF0gcEJpdE9mZnNldCAgICAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQotICogICAgICAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbS4KLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMl9GaWxsVkxDQnVmZmVyICgKLSAgICAgICAgICAgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgICAgICAgICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAotICAgICAgICAgICAgICBPTVhfVTMyIHJ1biwKLSAgICAgICAgICAgICAgT01YX1MxNiBsZXZlbCwgCi0JCQkgIE9NWF9VMzIgcnVuUGx1cywKLSAgICAgICAgICAgICAgT01YX1MxNiBsZXZlbFBsdXMsIAotICAgICAgICAgICAgICBPTVhfVTggIGZNb2RlLAotCQkJICBPTVhfVTggIGxhc3QsCi0gICAgICAgICAgICAgIE9NWF9VOCAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzLCAKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqcFJ1bkluZGV4VGFibGUsCi0gICAgICAgICAgICAgIGNvbnN0IEFSTV9WTEMzMiAqcFZsY1RhYmxlCi0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfQ2hlY2tWTENFc2NhcGVNb2RlCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBlc2NhcGUgbW9kZSBkZWNpc2lvbiBiYXNlZCBvbiB0aGUgcnVuLCBydW4rLCBsZXZlbCwgbGV2ZWwrIGFuZCAKLSAqIGxhc3QgY29tYmluYXRpb25zLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gcnVuICAgICAgICAgICAgIFJ1biB2YWx1ZSAoY291bnQgb2YgemVyb3MpIHRvIGJlIGVuY29kZWQgIAotICogW2luXSBsZXZlbCAgICAgICAgICAgTGV2ZWwgdmFsdWUgKG5vbi16ZXJvIHZhbHVlKSB0byBiZSBlbmNvZGVkCi0gKiBbaW5dIHJ1blBsdXMgICAgICAgICBDYWxjdWxhdGVkIGFzIHJ1blBsdXMgPSBydW4gLSAoUk1BWCArIDEpICAKLSAqIFtpbl0gbGV2ZWxQbHVzICAgICAgIENhbGN1bGF0ZWQgYXMgCi0gKiAgICAgICAgICAgICAgICAgICAgICBsZXZlbFBsdXMgPSBzaWduKGxldmVsKSpbYWJzKGxldmVsKSAtIExNQVhdCi0gKiBbaW5dIG1heFN0b3JlUnVuICAgICBNYXggc3RvcmUgcG9zc2libGUgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhKQotICogW2luXSBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXMgCi0gKiAgICAgICAgICAgICAgICAgICAgICBUaGUgcnVuIHZhbHVlIGFmdGVyIHdoaWNoIGxldmVsIAotICogICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBlcXVhbCB0byAxOiAKLSAqICAgICAgICAgICAgICAgICAgICAgIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSBzdGF0dXMpCi0gKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgc2hvcnRWaWRlb0hlYWRlcj09MCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIHNob3J0VmlkZW9IZWFkZXI9PTEuCi0gKiBbaW5dIHBSdW5JbmRleFRhYmxlICBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYwotICogICAgICAgICAgICAgICAgICAgICAgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhIHN0YXR1cykKLSAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAKLSAqIFJldHVybiBWYWx1ZToKLSAqIFJldHVybnMgYW4gRXNjYXBlIG1vZGUgd2hpY2ggY2FuIHRha2UgdmFsdWVzIGZyb20gMCB0byAzCi0gKiAwIC0tPiBubyBlc2NhcGUgbW9kZSwgMSAtLT4gZXNjYXBlIHR5cGUgMSwKLSAqIDEgLS0+IGVzY2FwZSB0eXBlIDIsIDMgLS0+IGVzY2FwZSB0eXBlIDMsIGNoZWNrIHNlY3Rpb24gNy40LjEuMwotICogaW4gdGhlIE1QRUcgSVNPIHN0YW5kYXJkLgotICoKLSAqLwotCi1PTVhfVTggYXJtVkNNNFAyX0NoZWNrVkxDRXNjYXBlTW9kZSgKLSAgICAgT01YX1UzMiBydW4sCi0gICAgIE9NWF9VMzIgcnVuUGx1cywKLSAgICAgT01YX1MxNiBsZXZlbCwKLSAgICAgT01YX1MxNiBsZXZlbFBsdXMsCi0gICAgIE9NWF9VOCAgbWF4U3RvcmVSdW4sCi0gICAgIE9NWF9VOCAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzLAotICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCi0gICAgIGNvbnN0IE9NWF9VOCAgKnBSdW5JbmRleFRhYmxlCi0pOwotCi0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGEgMTZ4MTYgYmxvY2sgc2VhcmNoOyBlc3RpbWF0ZXMgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCBtaW5pbXVtIFNBRC4gIAotICogQm90aCB0aGUgaW5wdXQgYW5kIG91dHB1dCBtb3Rpb24gdmVjdG9ycyBhcmUgcmVwcmVzZW50ZWQgdXNpbmcgaGFsZi1waXhlbCB1bml0cywgYW5kIAotICogdGhlcmVmb3JlIGEgc2hpZnQgbGVmdCBvciByaWdodCBieSAxIGJpdCBtYXkgYmUgcmVxdWlyZWQsIHJlc3BlY3RpdmVseSwgdG8gbWF0Y2ggdGhlIAotICogaW5wdXQgb3Igb3V0cHV0IE1WcyB3aXRoIG90aGVyIGZ1bmN0aW9ucyB0aGF0IGVpdGhlciBnZW5lcmF0ZSBvdXRwdXQgTVZzIG9yIGV4cGVjdCAKLSAqIGlucHV0IE1WcyByZXByZXNlbnRlZCB1c2luZyBpbnRlZ2VyIHBpeGVsIHVuaXRzLiAKLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBTcmNSZWZCdWYJCXBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSBNQiB0aGF0IAotICogICAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IAotICogICAgICAgICAgICAgICAgICAgIHBsYW5lLgotICogW2luXQlyZWZXaWR0aAkJICB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lCi0gKiBbaW5dCXBSZWZSZWN0CQkgIHBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlY3Rhbmd1bGFyIGluIHJlZmVyZW5jZSBwbGFuZS4gUmVsYXRpdmUgdG8gaW1hZ2Ugb3JpZ2luLiAKLSAqICAgICAgICAgICAgICAgICAgICBJdCdzIG5vdCBsaW1pdGVkIHRvIHRoZSBpbWFnZSBib3VuZGFyeSwgYnV0IGRlcGVuZGVkIG9uIHRoZSBwYWRkaW5nLiBGb3IgZXhhbXBsZSwgCi0gKiAgICAgICAgICAgICAgICAgICAgaWYgeW91IHBhZCA0IHBpeGVscyBvdXRzaWRlIHRoZSBpbWFnZSBib3JkZXIsIHRoZW4gdGhlIHZhbHVlIGZvciBsZWZ0IGJvcmRlciAKLSAqICAgICAgICAgICAgICAgICAgICBjYW4gYmUgLTQKLSAqIFtpbl0JcFNyY0N1cnJCdWYJCXBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBleHRyYWN0ZWQgZnJvbSBvcmlnaW5hbCBwbGFuZSAobGluZWFyIGFycmF5LCAKLSAqICAgICAgICAgICAgICAgICAgICAyNTYgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuCi0gKiBbaW5dIHBDdXJyUG9pbnRQb3MJcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZQotICogW2luXSBwU3JjUHJlTVYJCSAgcG9pbnRlciB0byBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvcjsgTlVMTCBpbmRpY2F0ZXMgbm8gcHJlZGljdGVkIE1WCi0gKiBbaW5dIHBTcmNQcmVTQUQJCXBvaW50ZXIgdG8gU0FEIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJlZGljdGVkIE1WIChyZWZlcmVuY2VkIGJ5IHBTcmNQcmVNVikKLSAqIFtpbl0gc2VhcmNoUmFuZ2UJCXNlYXJjaCByYW5nZSBmb3IgMTZYMTYgaW50ZWdlciBibG9jayx0aGUgdW5pdHMgb2YgaXQgaXMgZnVsbCBwaXhlbCx0aGUgc2VhcmNoIHJhbmdlIAotICogICAgICAgICAgICAgICAgICAgIGlzIHRoZSBzYW1lIGluIGFsbCBkaXJlY3Rpb25zLkl0IGlzIGluIGluY2x1c2l2ZSBvZiB0aGUgYm91bmRhcnkgYW5kIHNwZWNpZmllZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICB0ZXJtcyBvZiBpbnRlZ2VyIHBpeGVsIHVuaXRzLgotICogW2luXSBwTUVTcGVjCQkJICB2ZW5kb3Itc3BlY2lmaWMgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmU7IG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKLSAqICAgICAgICAgICAgICAgICAgICBhbmQgdGhlbiBpbml0aWFsaXplZCB1c2luZyBvbXhWQ000UDJfTUVJbml0IHByaW9yIHRvIGNhbGxpbmcgdGhlIGJsb2NrIG1hdGNoaW5nIAotICogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLgotICogW2luXSBCbG9ja1NpemUgICAgIE1hY3JvQmxvY2sgU2l6ZSBpLmUgZWl0aGVyIDE2eDE2IG9yIDh4OC4KLSAqIFtvdXRdCXBEc3RNVgkJCXBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WCi0gKiBbb3V0XQlwRHN0U0FECQkJcG9pbnRlciB0byBtaW5pbXVtIFNBRAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9TdHNfTm9FcnIgqEMgbm8gZXJyb3IuCi0gKiBPTVhfU3RzX0JhZEFyZ0VyciCoQyBiYWQgYXJndW1lbnRzCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyKAotICAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCi0gICAgIE9NWF9JTlQgcmVmV2lkdGgsCi0gICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAotICAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAotICAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAotICAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY1ByZU1WLAotICAgICBjb25zdCBPTVhfSU5UICpwU3JjUHJlU0FELAotICAgICB2b2lkICpwTUVTcGVjLAotICAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WLAotICAgICBPTVhfSU5UICpwRHN0U0FELAotICAgICBPTVhfVTggQmxvY2tTaXplCi0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfQmxvY2tNYXRjaF9IYWxmCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBhIDE2eDE2IGJsb2NrIG1hdGNoIHdpdGggaGFsZi1waXhlbCByZXNvbHV0aW9uLiAgUmV0dXJucyB0aGUgZXN0aW1hdGVkIAotICogbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCBtaW5pbXVtIFNBRC4gIFRoaXMgZnVuY3Rpb24gZXN0aW1hdGVzIHRoZSBoYWxmLXBpeGVsIAotICogbW90aW9uIHZlY3RvciBieSBpbnRlcnBvbGF0aW5nIHRoZSBpbnRlZ2VyIHJlc29sdXRpb24gbW90aW9uIHZlY3RvciByZWZlcmVuY2VkIAotICogYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0TVYsIGkuZS4sIHRoZSBpbml0aWFsIGludGVnZXIgTVYgaXMgZ2VuZXJhdGVkIAotICogZXh0ZXJuYWxseS4gIFRoZSBpbnB1dCBwYXJhbWV0ZXJzIHBTcmNSZWZCdWYgYW5kIHBTZWFyY2hQb2ludFJlZlBvcyBzaG91bGQgYmUgCi0gKiBzaGlmdGVkIGJ5IHRoZSB3aW5uaW5nIE1WIG9mIDE2eDE2IGludGVnZXIgc2VhcmNoIHByaW9yIHRvIGNhbGxpbmcgQmxvY2tNYXRjaF9IYWxmXzE2eDE2LiAgCi0gKiBUaGUgZnVuY3Rpb24gQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2IG1heSBiZSB1c2VkIGZvciBpbnRlZ2VyIG1vdGlvbiBlc3RpbWF0aW9uLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcFNyY1JlZkJ1ZgkJcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIE1CIAotICogICAgICAgICAgICAgICAgICAgIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgdGhlCWN1cnJlbnQgcGxhbmUuCi0gKiBbaW5dCXJlZldpZHRoCQkgIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUKLSAqIFtpbl0JcFJlZlJlY3QJCSAgcmVmZXJlbmNlIHBsYW5lIHZhbGlkIHJlZ2lvbiByZWN0YW5nbGUKLSAqIFtpbl0JcFNyY0N1cnJCdWYJCXBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBleHRyYWN0ZWQgZnJvbSBvcmlnaW5hbCBwbGFuZSAKLSAqICAgICAgICAgICAgICAgICAgICAobGluZWFyIGFycmF5LCAyNTYgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogW2luXQlwU2VhcmNoUG9pbnRSZWZQb3MJcG9zaXRpb24gb2YgdGhlIHN0YXJ0aW5nIHBvaW50IGZvciBoYWxmIHBpeGVsIHNlYXJjaCAoc3BlY2lmaWVkIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRlcm1zIG9mIGludGVnZXIgcGl4ZWwgdW5pdHMpIGluIHRoZSByZWZlcmVuY2UgcGxhbmUuCi0gKiBbaW5dCXJuZFZhbAkJCSAgcm91bmRpbmcgY29udHJvbCBiaXQgZm9yIGhhbGYgcGl4ZWwgbW90aW9uIGVzdGltYXRpb247IAotICogICAgICAgICAgICAgICAgICAgIDA9cm91bmRpbmcgY29udHJvbCBkaXNhYmxlZDsgMT1yb3VuZGluZyBjb250cm9sIGVuYWJsZWQKLSAqIFtpbl0JcFNyY0RzdE1WCQlwb2ludGVyIHRvIHRoZSBpbml0aWFsIE1WIGVzdGltYXRlOyB0eXBpY2FsbHkgZ2VuZXJhdGVkIGR1cmluZyBhIHByaW9yIAotICogICAgICAgICAgICAgICAgICAxNlgxNiBpbnRlZ2VyIHNlYXJjaCBhbmQgaXRzIHVuaXQgaXMgaGFsZiBwaXhlbC4KLSAqIFtpbl0gQmxvY2tTaXplICAgICBNYWNyb0Jsb2NrIFNpemUgaS5lIGVpdGhlciAxNngxNiBvciA4eDguCi0gKiBbb3V0XXBTcmNEc3RNVgkJcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYKLSAqIFtvdXRdcERzdFNBRAkJCXBvaW50ZXIgdG8gbWluaW11bSBTQUQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfU3RzX05vRXJyIKhDIG5vIGVycm9yCi0gKiBPTVhfU3RzX0JhZEFyZ0VyciCoQyBiYWQgYXJndW1lbnRzCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDJfQmxvY2tNYXRjaF9IYWxmKAotICAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCi0gICAgIE9NWF9JTlQgcmVmV2lkdGgsCi0gICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAotICAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAotICAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwU2VhcmNoUG9pbnRSZWZQb3MsCi0gICAgIE9NWF9JTlQgcm5kVmFsLAotICAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0RzdE1WLAotICAgICBPTVhfSU5UICpwRHN0U0FELAotICAgICBPTVhfVTggQmxvY2tTaXplCi0pOwotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX1BhZE1WCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBtb3Rpb24gdmVjdG9yIHBhZGRpbmcgZm9yIGEgbWFjcm9ibG9jay4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHBTcmNEc3RNViAgICAgICBwb2ludGVyIHRvIG1vdGlvbiB2ZWN0b3IgYnVmZmVyIG9mIHRoZSBjdXJyZW50Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2sKLSAqIFtpbl0gcFRyYW5zcCAgICAgICAgIHBvaW50ZXIgdG8gdHJhbnNwYXJlbnQgc3RhdHVzIGJ1ZmZlciBvZiB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBtYWNyb2Jsb2NrCi0gKiBbb3V0XSAgICBwU3JjRHN0TVYgICAgICAgcG9pbnRlciB0byBtb3Rpb24gdmVjdG9yIGJ1ZmZlciBpbiB3aGljaCB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW90aW9uIHZlY3RvcnMgaGF2ZSBiZWVuIHBhZGRlZAotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDJfUGFkTVYoCi0gICAgIE9NWFZDTW90aW9uVmVjdG9yICogcFNyY0RzdE1WLAotICAgICBPTVhfVTggKiBwVHJhbnNwCi0pOwotCi0vKiAKLSAqIEguMjY0IFNwZWNpZmljIERlY2xhcmF0aW9ucyAKLSAqLwotLyogRGVmaW5lcyAqLwotI2RlZmluZSBBUk1fTTRQMTBfUV9PRkZTRVQgICAgICAgICgxNSkKLQotCi0vKiBEZXF1YW50IHRhYmxlcyAqLwotCi1leHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMTBfUG9zVG9WQ29sNHg0WzE2XTsKLWV4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAxMF9Qb3NUb1ZDb2wyeDJbNF07Ci1leHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMTBfVk1hdHJpeFs2XVszXTsKLWV4dGVybiBjb25zdCBPTVhfVTMyIGFybVZDTTRQMTBfTUZNYXRyaXhbNl1bM107Ci0KLQotLyoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtIHRoZSB3b3JrIHJlcXVpcmVkIGJ5IHRoZSBPcGVuTUFYCi0gKiBEZWNvZGVDb2VmZnNUb1BhaXIgZnVuY3Rpb24gYW5kIERlY29kZUNocm9tYURDQ29lZmZzVG9QYWlyLgotICogU2luY2UgbW9zdCBvZiB0aGUgY29kZSBpcyBjb21tb24gd2Ugc2hhcmUgaXQgaGVyZS4KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwcEJpdFN0cmVhbQkJRG91YmxlIHBvaW50ZXIgdG8gY3VycmVudCBieXRlIGluIGJpdCBzdHJlYW0gYnVmZmVyCi0gKiBbaW5dCXBPZmZzZXQJCQlQb2ludGVyIHRvIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKLSAqCQkJCQkJCQl0byBieSAqcHBCaXRTdHJlYW0KLSAqIFtpbl0Jc01heE51bUNvZWZmCU1heGltdW0gbnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyBpbiBjdXJyZW50Ci0gKgkJCQkJCQkJYmxvY2sgKDQsMTUgb3IgMTYpCi0gKiBbaW5dCW5UYWJsZSAgICAgICAgICBUYWJsZSBudW1iZXIgKDAgdG8gNCkgYWNjb3JkaW5nIHRvIHRoZSBmaXZlIGNvbHVtbnMKLSAqICAgICAgICAgICAgICAgICAgICAgIG9mIFRhYmxlIDktNSBpbiB0aGUgSC4yNjQgc3BlYwotICogW291dF0JcHBCaXRTdHJlYW0JCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZAotICogW291dF0JcE9mZnNldAkJCSpwT2Zmc2V0IGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkCi0gKiBbb3V0XQlwTnVtQ29lZmYJCVBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBub256ZXJvIGNvZWZmaWNpZW50cyBpbgotICoJCQkJCQkJCXRoaXMgYmxvY2sKLSAqIFtvdXRdCXBwUG9zQ29lZmJ1ZglEb3VibGUgcG9pbnRlciB0byBkZXN0aW5hdGlvbiByZXNpZHVhbAotICoJCQkJCQkJCWNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBvbXhFcnJvciByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyKAotICAgICBjb25zdCBPTVhfVTgqKiBwcEJpdFN0cmVhbSwKLSAgICAgT01YX1MzMiogcE9mZnNldCwKLSAgICAgT01YX1U4KiBwTnVtQ29lZmYsCi0gICAgIE9NWF9VOCoqcHBQb3NDb2VmYnVmLAotICAgICBPTVhfSU5UIG5UYWJsZSwKLSAgICAgT01YX0lOVCBzTWF4TnVtQ29lZmYgICAgICAgIAotICk7Ci0KLS8qCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm0gREMgc3R5bGUgaW50cmEgcHJlZGljdGlvbiwgYXZlcmFnaW5nIHVwcGVyIGFuZCBsZWZ0IGJsb2NrCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcFNyY0xlZnQJCVBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiAxNiBsZWZ0IGNvZWZmaWNpZW50czoKLSAqCQkJCQkJCQlwW3gsIHldICh4ID0gLTEsIHkgPSAwLi4zKQotICogW2luXQlwU3JjQWJvdmUJCVBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiAxNiBhYm92ZSBjb2VmZmljaWVudHM6Ci0gKgkJCQkJCQkJcFt4LHldICh4ID0gMC4uMywgeSA9IC0xKQotICogW2luXQlsZWZ0U3RlcAkJU3RlcCBvZiBsZWZ0IGNvZWZmaWNpZW50IGJ1ZmZlcgotICogW2luXQlkc3RTdGVwCQkJU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyCi0gKiBbaW5dCWF2YWlsYWJpbGl0eQlOZWlnaGJvcmluZyAxNngxNiBNQiBhdmFpbGFiaWxpdHkgZmxhZwotICogW291dF0JcERzdAkJCVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE5vbmUKLSAqLwotCi12b2lkIGFybVZDTTRQMTBfUHJlZGljdEludHJhREM0eDQoCi0gICAgIGNvbnN0IE9NWF9VOCogcFNyY0xlZnQsCi0gICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlLAotICAgICBPTVhfVTgqIHBEc3QsCi0gICAgIE9NWF9JTlQgbGVmdFN0ZXAsCi0gICAgIE9NWF9JTlQgZHN0U3RlcCwKLSAgICAgT01YX1MzMiBhdmFpbGFiaWxpdHkgICAgICAgIAotKTsKLQotLyoKLSAqIERlc2NyaXB0aW9uCi0gKiBVbnBhY2sgYSA0eDQgYmxvY2sgb2YgY29lZmZpY2llbnQtcmVzaWR1YWwgcGFpciB2YWx1ZXMKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwcFNyYwlEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyCi0gKgkJCQkJCWJ1ZmZlciBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcKLSAqIFtvdXRdCXBwU3JjCSpwcFNyYyBpcyB1cGRhdGVkIHRvIHRoZSBzdGFydCBvZiBuZXh0IG5vbiBlbXB0eSBibG9jawotICogW291dF0JcERzdAlQb2ludGVyIHRvIHVucGFja2VkIDR4NCBibG9jawotICovCi0KLXZvaWQgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NCgKLSAgICAgY29uc3QgT01YX1U4ICoqcHBTcmMsCi0gICAgIE9NWF9TMTYqIHBEc3QKLSk7Ci0KLS8qCi0gKiBEZXNjcmlwdGlvbgotICogVW5wYWNrIGEgMngyIGJsb2NrIG9mIGNvZWZmaWNpZW50LXJlc2lkdWFsIHBhaXIgdmFsdWVzCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcHBTcmMJRG91YmxlIHBvaW50ZXIgdG8gcmVzaWR1YWwgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpcgotICoJCQkJCQlidWZmZXIgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nCi0gKiBbb3V0XQlwcFNyYwkqcHBTcmMgaXMgdXBkYXRlZCB0byB0aGUgc3RhcnQgb2YgbmV4dCBub24gZW1wdHkgYmxvY2sKLSAqIFtvdXRdCXBEc3QJUG9pbnRlciB0byB1bnBhY2tlZCA0eDQgYmxvY2sKLSAqLwotCi12b2lkIGFybVZDTTRQMTBfVW5wYWNrQmxvY2syeDIoCi0gICAgIGNvbnN0IE9NWF9VOCAqKnBwU3JjLAotICAgICBPTVhfUzE2KiBwRHN0Ci0pOwotCi0vKgotICogRGVzY3JpcHRpb24KLSAqIERlYmxvY2sgb25lIGJvdW5kYXJ5IHBpeGVsCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcFEwICAgICAgICAgUG9pbnRlciB0byBwaXhlbCBxMAotICogW2luXSBTdGVwICAgICAgICBTdGVwIGJldHdlZW4gcGl4ZWxzIHEwIGFuZCBxMQotICogW2luXSB0QzAgICAgICAgICBFZGdlIHRocmVzaG9sZCB2YWx1ZQotICogW2luXSBhbHBoYSAgICAgICBhbHBoYSB0aHJlc2hvbGQgdmFsdWUKLSAqIFtpbl0gYmV0YSAgICAgICAgYmV0YSB0aHJlc2hvbGQgdmFsdWUKLSAqIFtpbl0gYlMgICAgICAgICAgZGVibG9ja2luZyBzdHJlbmd0aAotICogW2luXSBDaHJvbWFGbGFnICBUcnVlIGZvciBjaHJvbWEgYmxvY2tzCi0gKiBbb3V0XSBwUTAgICAgICAgIERlYmxvY2tlZCBwaXhlbHMKLSAqIAotICovCi0KLXZvaWQgYXJtVkNNNFAxMF9EZUJsb2NrUGl4ZWwoCi0gICAgT01YX1U4ICpwUTAsICAgIC8qIHBvaW50ZXIgdG8gdGhlIHBpeGVsIHEwICovCi0gICAgaW50IFN0ZXAsICAgICAgIC8qIHN0ZXAgYmV0d2VlbiBwaXhlbHMgcTAgYW5kIHExICovCi0gICAgaW50IHRDMCwgICAgICAgIC8qIGVkZ2UgdGhyZXNob2xkIHZhbHVlICovCi0gICAgaW50IGFscGhhLCAgICAgIC8qIGFscGhhICovCi0gICAgaW50IGJldGEsICAgICAgIC8qIGJldGEgKi8KLSAgICBpbnQgYlMsICAgICAgICAgLyogZGVibG9ja2luZyBzdHJlbmd0aCAqLwotICAgIGludCBDaHJvbWFGbGFnCi0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yIGhvcml6b250YWwgMS8yLXBlbCBwb3NpdGlvbnMKLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqCVtpbl0JcFNyYwkJCVBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgCi0gCQkJCQkJCQkJCQkJCWluIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lCi0gKglbaW5dCWlTcmNTdGVwCVN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuCi0gKglbaW5dCWlEc3RTdGVwCVN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KLSAqCVtpbl0JaVdpZHRoCQlXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jawotICoJW2luXQlpSGVpZ2h0CQlIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqCVtvdXRdCXBEc3QJICAgIFBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSAxLzItcGVsIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEoCi0gICAgICAgIGNvbnN0IE9NWF9VOCoJCXBTcmMsIAotCQlPTVhfVTMyIAlpU3JjU3RlcCwgCi0JCU9NWF9VOCogCXBEc3QsIAotCQlPTVhfVTMyIAlpRHN0U3RlcCwgCi0JCU9NWF9VMzIgCWlXaWR0aCwgCi0JCU9NWF9VMzIgCWlIZWlnaHQKLSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yIHZlcnRpY2FsIDEvMi1wZWwgcG9zaXRpb25zIAotICogYXJvdW5kIGEgZnVsbC1wZWwgcG9zaXRpb24uCi0gKgotICogUmVtYXJrczoKLSAqCi0gKglbaW5dCXBTcmMJCQlQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIGludGVycG9sYXRlIAotICoJCQkJCQkJCQkJCQlpbiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZQotICoJW2luXQlpU3JjU3RlcAlTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLgotICoJW2luXQlpRHN0U3RlcAlTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXIuCi0gKglbaW5dCWlXaWR0aAkJV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqCVtpbl0JaUhlaWdodAkJSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKglbb3V0XQlwRHN0ICAgIAlQb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgMS8yLXBlbAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEoCQotCSBjb25zdCBPTVhfVTgqIAlwU3JjLCAKLQkgT01YX1UzMiAJaVNyY1N0ZXAsIAotIAkgT01YX1U4KiAJcERzdCwKLSAJIE9NWF9VMzIgCWlEc3RTdGVwLCAKLSAJIE9NWF9VMzIgCWlXaWR0aCwgCi0gCSBPTVhfVTMyIAlpSGVpZ2h0Ci0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkRpYWdfTHVtYQotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgKDEvMiwgMS8yKSAgcG9zaXRpb25zIAotICogYXJvdW5kIGEgZnVsbC1wZWwgcG9zaXRpb24uCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiAgW2luXSAgICBwU3JjICAgICAgICBQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIGludGVycG9sYXRlIAotICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHJlY29uc3RydWN0ZWQgZnJhbWUgcGxhbmUKLSAqICBbaW5dICAgIGlTcmNTdGVwICAgIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuCi0gKiAgW2luXSAgICBpRHN0U3RlcCAgICBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXIuCi0gKiAgW2luXSAgICBpV2lkdGggICAgICBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jawotICogIFtpbl0gICAgaUhlaWdodCAgICAgSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKiAgW291dF0gICBwRHN0ICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgKDEvMiwxLzIpLXBlbAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmRGlhZ19MdW1hKCAgCi0gICAgICAgIGNvbnN0IE9NWF9VOCogICAgIHBTcmMsIAotICAgICAgICBPTVhfVTMyICAgICBpU3JjU3RlcCwgCi0gICAgICAgIE9NWF9VOCogICAgIHBEc3QsIAotICAgICAgICBPTVhfVTMyICAgICBpRHN0U3RlcCwKLSAgICAgICAgT01YX1UzMiAgICAgaVdpZHRoLCAKLSAgICAgICAgT01YX1UzMiAgICAgaUhlaWdodAotKTsKLQotLyoKLSAqIERlc2NyaXB0aW9uOgotICogVHJhbnNmb3JtIFJlc2lkdWFsIDR4NCBDb2VmZmljaWVudHMKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgcFNyYwkJU291cmNlIDR4NCBibG9jawotICogW291dF0gcERzdAkJRGVzdGluYXRpb24gNHg0IGJsb2NrCi0gKgotICovCi0KLXZvaWQgYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NChPTVhfUzE2KiBwRHN0LCBPTVhfUzE2ICpwU3JjKTsKLQotLyoKLSAqIERlc2NyaXB0aW9uOgotICogRm9yd2FyZCBUcmFuc2Zvcm0gUmVzaWR1YWwgNHg0IENvZWZmaWNpZW50cwotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICBwU3JjCQlTb3VyY2UgNHg0IGJsb2NrCi0gKiBbb3V0XSBwRHN0CQlEZXN0aW5hdGlvbiA0eDQgYmxvY2sKLSAqCi0gKi8KLQotdm9pZCBhcm1WQ000UDEwX0Z3ZFRyYW5zZm9ybVJlc2lkdWFsNHg0KE9NWF9TMTYqIHBEc3QsIE9NWF9TMTYgKnBTcmMpOwotCi1PTVhfSU5UIGFybVZDTTRQMTBfQ29tcGFyZU1vdGlvbkNvc3RUb01WICgKLSAgICBPTVhfUzE2ICBtdlgsCi0gICAgT01YX1MxNiAgbXZZLAotICAgIE9NWFZDTW90aW9uVmVjdG9yIGRpZmZNViwgCi0gICAgT01YX0lOVCBjYW5kU0FELCAKLSAgICBPTVhWQ01vdGlvblZlY3RvciAqYmVzdE1WLCAKLSAgICBPTVhfVTMyIG5MYW1kYSwKLSAgICBPTVhfUzMyICpwQmVzdENvc3QpOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ0NPTU1fU0FECi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZSB0aGUgU0FEIGZvciBOeE0gYmxvY2tzLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogW2luXQkJcFNyY09yZwkJUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2sKLSAqIFtpbl0JCWlTdGVwT3JnCVN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcgotICogW2luXQkJcFNyY1JlZgkJUG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrCi0gKiBbaW5dCQlpU3RlcFJlZglTdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyCi0gKiBbaW5dCQlpSGVpZ2h0CQlIZWlnaHQgb2YgdGhlIGJsb2NrCi0gKiBbaW5dCQlpV2lkdGgJCVdpZHRoIG9mIHRoZSBibG9jawotICogW291dF0JcERzdFNBRAkJUG9pbnRlciBvZiByZXN1bHQgU0FECi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgotICoKLSAqLwotT01YUmVzdWx0IGFybVZDQ09NTV9TQUQoCQotCWNvbnN0IE9NWF9VOCogCXBTcmNPcmcsCi0JT01YX1UzMiAJaVN0ZXBPcmcsCi0JY29uc3QgT01YX1U4KiAJcFNyY1JlZiwKLQlPTVhfVTMyIAlpU3RlcFJlZiwKLQlPTVhfUzMyKglwRHN0U0FELAotCU9NWF9VMzIJCWlIZWlnaHQsCi0JT01YX1UzMgkJaVdpZHRoKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNDT01NX0F2ZXJhZ2UKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgYXZlcmFnZSBvZiB0d28gYmxvY2tzIGFuZCBzdG9yZXMgdGhlIHJlc3VsdC4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqCVtpbl0JcFByZWQwCQkJUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAwCi0gKglbaW5dCXBQcmVkMQkJCVBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMQotICoJW2luXQlpUHJlZFN0ZXAwCSAgICBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwCi0gKglbaW5dCWlQcmVkU3RlcDEJICAgIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEKLSAqCVtpbl0JaURzdFN0ZXAgCQlTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKLSAqCVtpbl0JaVdpZHRoCQkJV2lkdGggb2YgdGhlIGJsb2NrcwotICoJW2luXQlpSGVpZ2h0CQkJSGVpZ2h0IG9mIHRoZSBibG9ja3MKLSAqCVtvdXRdCXBEc3RQcmVkCQlQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCi0gKgotICovCi0gT01YUmVzdWx0IGFybVZDQ09NTV9BdmVyYWdlICgKLQkgY29uc3QgT01YX1U4KiAJICAgIHBQcmVkMCwKLQkgY29uc3QgT01YX1U4KiAJICAgIHBQcmVkMSwJCi0JIE9NWF9VMzIJCWlQcmVkU3RlcDAsCi0JIE9NWF9VMzIJCWlQcmVkU3RlcDEsCi0JIE9NWF9VOCoJCXBEc3RQcmVkLAotCSBPTVhfVTMyCQlpRHN0U3RlcCwgCi0JIE9NWF9VMzIJCWlXaWR0aCwKLQkgT01YX1UzMgkJaUhlaWdodAotKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9TQURRdWFyCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBiZXR3ZWVuIG9uZSBibG9jayAocFNyYykgYW5kIHRoZSAKLSAqIGF2ZXJhZ2Ugb2YgdGhlIG90aGVyIHR3byAocFNyY1JlZjAgYW5kIHBTcmNSZWYxKQotICoKLSAqIFJlbWFya3M6Ci0gKgotICogW2luXQkJcFNyYwkJCQlQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jawotICogW2luXQkJcFNyY1JlZjAJCVBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDAKLSAqIFtpbl0JCXBTcmNSZWYxCQlQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAxCi0gKiBbaW5dCQlpU3JjU3RlcCAJCVN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcgotICogW2luXQkJaVJlZlN0ZXAwCQlTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAotICogW2luXQkJaVJlZlN0ZXAxIAlTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAotICogW2luXQkJaUhlaWdodAkJCUhlaWdodCBvZiB0aGUgYmxvY2sKLSAqIFtpbl0JCWlXaWR0aAkJCVdpZHRoIG9mIHRoZSBibG9jawotICogW291dF0JcERzdFNBRAkJCVBvaW50ZXIgb2YgcmVzdWx0IFNBRAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KLSAqCi0gKi8KLU9NWFJlc3VsdCBhcm1WQ000UDEwX1NBRFF1YXIoCi0JY29uc3QgT01YX1U4KiAJcFNyYywKLSAgICBjb25zdCBPTVhfVTgqIAlwU3JjUmVmMCwKLQljb25zdCBPTVhfVTgqIAlwU3JjUmVmMSwJCi0gICAgT01YX1UzMiAJaVNyY1N0ZXAsCi0gICAgT01YX1UzMgkJaVJlZlN0ZXAwLAotICAgIE9NWF9VMzIJCWlSZWZTdGVwMSwKLSAgICBPTVhfVTMyKglwRHN0U0FELAotICAgIE9NWF9VMzIgICAgIGlIZWlnaHQsCi0gICAgT01YX1UzMiAgICAgaVdpZHRoCi0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciBjaHJvbWEgY29tcG9uZW50cy4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqICBbaW5dICAgIHBTcmMgICAgICAgICAgICBQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJwb2xhdGUgaW4gdGhlIHJlY29uc3RydWN0ZWQgZnJhbWUgcGxhbmUKLSAqICBbaW5dICAgIGlTcmNTdGVwICAgIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuCi0gKiAgW2luXSAgICBpRHN0U3RlcCAgICBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXIuCi0gKiAgW2luXSAgICBpV2lkdGggICAgICBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jawotICogIFtpbl0gICAgaUhlaWdodCAgICAgSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKiAgW2luXSAgICBkeCAgICAgICAgICAgICAgRnJhY3Rpb25hbCBwYXJ0IG9mIGhvcml6b250YWwgbW90aW9uIHZlY3RvciAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCBpbiAxLzggcGl4ZWwgdW5pdCAoMH43KSAKLSAqICBbaW5dICAgIGR5ICAgICAgICAgICAgICBGcmFjdGlvbmFsIHBhcnQgb2YgdmVydGljYWwgbW90aW9uIHZlY3RvciAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCBpbiAxLzggcGl4ZWwgdW5pdCAoMH43KQotICogIFtvdXRdICAgcERzdCAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgotICoKLSAqLwotIE9NWFJlc3VsdCBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYSgKLSAgICAgICAgT01YX1U4ICAgICAgKnBTcmMsCi0gICAgICAgIE9NWF9VMzIgICAgIGlTcmNTdGVwLAotICAgICAgICBPTVhfVTggICAgICAqcERzdCwKLSAgICAgICAgT01YX1UzMiAgICAgaURzdFN0ZXAsCi0gICAgICAgIE9NWF9VMzIgICAgIGlXaWR0aCwKLSAgICAgICAgT01YX1UzMiAgICAgaUhlaWdodCwKLSAgICAgICAgT01YX1UzMiAgICAgZHgsCi0gICAgICAgIE9NWF9VMzIgICAgIGR5Ci0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVycG9sYXRlX0x1bWEKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgbHVtYSBjb21wb25lbnRzLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogIFtpbl0gICAgcFNyYyAgICAgICAgICAgIFBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnBvbGF0ZSBpbiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZQotICogIFtpbl0gICAgaVNyY1N0ZXAgICAgU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4KLSAqICBbaW5dICAgIGlEc3RTdGVwICAgIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KLSAqICBbaW5dICAgIGlXaWR0aCAgICAgIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKiAgW2luXSAgICBpSGVpZ2h0ICAgICBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqICBbaW5dICAgIGR4ICAgICAgICAgICAgICBGcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvNCBwaXhlbCB1bml0ICgwfjMpIAotICogIFtpbl0gICAgZHkgICAgICAgICAgICAgIEZyYWN0aW9uYWwgcGFydCBvZiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvNCBwaXhlbCB1bml0ICgwfjMpIAotICogIFtvdXRdICAgcERzdCAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgotICoKLSAqLwotCi0gT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfTHVtYSgKLSAgICAgY29uc3QgT01YX1U4ICAgICAqcFNyYywKLSAgICAgT01YX1UzMiAgICBpU3JjU3RlcCwKLSAgICAgT01YX1U4ICAgICAqcERzdCwKLSAgICAgT01YX1UzMiAgICBpRHN0U3RlcCwKLSAgICAgT01YX1UzMiAgICBpV2lkdGgsCi0gICAgIE9NWF9VMzIgICAgaUhlaWdodCwKLSAgICAgT01YX1UzMiAgICBkeCwKLSAgICAgT01YX1UzMiAgICBkeQotKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogb214VkNIMjY0X0RlcXVhbnRUcmFuc2Zvcm1BQ0Zyb21QYWlyX1U4X1MxNl9DMV9ETHgKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFJlY29uc3RydWN0IHRoZSA0eDQgcmVzaWR1YWwgYmxvY2sgZnJvbSBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciwKLSAqIHBlcmZvcm0gZGVxdWFudGlzYXRpb24gYW5kIGludGVnZXIgaW52ZXJzZSB0cmFuc2Zvcm1hdGlvbiBmb3IgNHg0IGJsb2NrIG9mCi0gKiByZXNpZHVhbHMgYW5kIHVwZGF0ZSB0aGUgcGFpciBidWZmZXIgcG9pbnRlciB0byBuZXh0IG5vbi1lbXB0eSBibG9jay4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBwU3JjCQlEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbgotICoJCQkJCQkJcGFpciBidWZmZXIgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nCi0gKiBbaW5dCXBEQwkJCVBvaW50ZXIgdG8gdGhlIERDIGNvZWZmaWNpZW50IG9mIHRoaXMgYmxvY2ssIE5VTEwKLSAqCQkJCQkJCWlmIGl0IGRvZXNuJ3QgZXhpc3QKLSAqIFtpbl0JUVAJCQlRdWFudGl6YXRpb24gcGFyYW1ldGVyCi0gKiBbaW5dIEFDICAgICAgICAgIEZsYWcgaW5kaWNhdGluZyBpZiBhdCBsZWFzdCBvbmUgbm9uLXplcm8gY29lZmZpY2llbnQgZXhpc3RzCi0gKiBbb3V0XQlwRHN0CQlwb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIDR4NCBibG9jayBkYXRhCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgb214RXJyb3IgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybUFDRnJvbVBhaXJfVThfUzE2X0MxX0RMeCgKLSAgICAgT01YX1U4ICoqcHBTcmMsCi0gICAgIE9NWF9TMTYgKnBEc3QsCi0gICAgIE9NWF9JTlQgUVAsCi0gICAgIE9NWF9TMTYqIHBEQywKLSAgICAgaW50IEFDCi0pOwotCi0jZW5kaWYgIC8qX2FybVZpZGVvX0hfKi8KLQotLypFbmQgb2YgRmlsZSovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvYXBpL29teFZDLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2FwaS9vbXhWQy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjNjYzcyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvYXBpL29teFZDLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MzgxICswLDAgQEAKLS8qKgotICogRmlsZTogb214VkMuaAotICogQnJpZWY6IE9wZW5NQVggREwgdjEuMC4yIC0gVmlkZW8gQ29kaW5nIGxpYnJhcnkKLSAqCi0gKiBDb3B5cmlnaHQgqSAyMDA1LTIwMDggVGhlIEtocm9ub3MgR3JvdXAgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLiAKLSAqCi0gKiBUaGVzZSBtYXRlcmlhbHMgYXJlIHByb3RlY3RlZCBieSBjb3B5cmlnaHQgbGF3cyBhbmQgY29udGFpbiBtYXRlcmlhbCAKLSAqIHByb3ByaWV0YXJ5IHRvIHRoZSBLaHJvbm9zIEdyb3VwLCBJbmMuICBZb3UgbWF5IHVzZSB0aGVzZSBtYXRlcmlhbHMgCi0gKiBmb3IgaW1wbGVtZW50aW5nIEtocm9ub3Mgc3BlY2lmaWNhdGlvbnMsIHdpdGhvdXQgYWx0ZXJpbmcgb3IgcmVtb3ZpbmcgCi0gKiBhbnkgdHJhZGVtYXJrLCBjb3B5cmlnaHQgb3Igb3RoZXIgbm90aWNlIGZyb20gdGhlIHNwZWNpZmljYXRpb24uCi0gKiAKLSAqIEtocm9ub3MgR3JvdXAgbWFrZXMgbm8sIGFuZCBleHByZXNzbHkgZGlzY2xhaW1zIGFueSwgcmVwcmVzZW50YXRpb25zIAotICogb3Igd2FycmFudGllcywgZXhwcmVzcyBvciBpbXBsaWVkLCByZWdhcmRpbmcgdGhlc2UgbWF0ZXJpYWxzLCBpbmNsdWRpbmcsIAotICogd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBvciBmaXRuZXNzIAotICogZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIG9yIG5vbi1pbmZyaW5nZW1lbnQgb2YgYW55IGludGVsbGVjdHVhbCBwcm9wZXJ0eS4gCi0gKiBLaHJvbm9zIEdyb3VwIG1ha2VzIG5vLCBhbmQgZXhwcmVzc2x5IGRpc2NsYWltcyBhbnksIHdhcnJhbnRpZXMsIGV4cHJlc3MgCi0gKiBvciBpbXBsaWVkLCByZWdhcmRpbmcgdGhlIGNvcnJlY3RuZXNzLCBhY2N1cmFjeSwgY29tcGxldGVuZXNzLCB0aW1lbGluZXNzLCAKLSAqIGFuZCByZWxpYWJpbGl0eSBvZiB0aGVzZSBtYXRlcmlhbHMuIAotICoKLSAqIFVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgd2lsbCB0aGUgS2hyb25vcyBHcm91cCwgb3IgYW55IG9mIGl0cyBQcm9tb3RlcnMsIAotICogQ29udHJpYnV0b3JzIG9yIE1lbWJlcnMgb3IgdGhlaXIgcmVzcGVjdGl2ZSBwYXJ0bmVycywgb2ZmaWNlcnMsIGRpcmVjdG9ycywgCi0gKiBlbXBsb3llZXMsIGFnZW50cyBvciByZXByZXNlbnRhdGl2ZXMgYmUgbGlhYmxlIGZvciBhbnkgZGFtYWdlcywgd2hldGhlciAKLSAqIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIGZvciBsb3N0IHJldmVudWVzLCAKLSAqIGxvc3QgcHJvZml0cywgb3Igb3RoZXJ3aXNlLCBhcmlzaW5nIGZyb20gb3IgaW4gY29ubmVjdGlvbiB3aXRoIHRoZXNlIAotICogbWF0ZXJpYWxzLgotICogCi0gKiBLaHJvbm9zIGFuZCBPcGVuTUFYIGFyZSB0cmFkZW1hcmtzIG9mIHRoZSBLaHJvbm9zIEdyb3VwIEluYy4gCi0gKgotICovCi0KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9PTVhWQ19IXwotI2RlZmluZSBfT01YVkNfSF8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotCi0vKiA2LjEuMS4xIE1vdGlvbiBWZWN0b3JzICAqLwotLyogSW4gb214VkMsIG1vdGlvbiB2ZWN0b3JzIGFyZSByZXByZXNlbnRlZCBhcyBmb2xsb3dzOiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE9NWF9TMTYgZHg7Ci0gICAgT01YX1MxNiBkeTsKLX0gT01YVkNNb3Rpb25WZWN0b3I7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0F2ZXJhZ2VfOHggICAoNi4xLjMuMS4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBhdmVyYWdlIG9mIHR3byA4eDQsIDh4OCwgb3IgOHgxNiBibG9ja3MuICBUaGUgCi0gKiByZXN1bHQgaXMgcm91bmRlZCBhY2NvcmRpbmcgdG8gKGErYisxKS8yLiAgVGhlIGJsb2NrIGF2ZXJhZ2UgZnVuY3Rpb24gY2FuIAotICogYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGhhbGYtcGl4ZWwgaW50ZXJwb2xhdGlvbiB0byBvYnRhaW4gcXVhcnRlciAKLSAqIHBpeGVsIG1vdGlvbiBlc3RpbWF0ZXMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMTBdLCBzdWJjbGF1c2UgOC40LjIuMi4xLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwUHJlZDAgICAgIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAwIAotICogICBwUHJlZDEgICAgIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAxIAotICogICBpUHJlZFN0ZXAwIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMCAKLSAqICAgaVByZWRTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiAgIGlEc3RTdGVwICAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuIAotICogICBpSGVpZ2h0ICAgIC0gSGVpZ2h0IG9mIHRoZSBibG9ja3MgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RQcmVkIC0gUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiA4LWJ5dGUgYWxpZ25lZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAotICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFByZWQwLCBwUHJlZDEsIG9yIAotICogICAgICAgICAgICAgIHBEc3RQcmVkLiAKLSAqICAgIC0gICBwRHN0UHJlZCBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICAgLSAgIGlQcmVkU3RlcDAgPD0gMCBvciBpUHJlZFN0ZXAwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICogICAgLSAgIGlQcmVkU3RlcDEgPD0gMCBvciBpUHJlZFN0ZXAxIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICogICAgLSAgIGlEc3RTdGVwICAgPD0gMCBvciBpRHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgIC0gICBpSGVpZ2h0IGlzIG5vdCA0LCA4LCBvciAxNi4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNDT01NX0F2ZXJhZ2VfOHggKAotICAgIGNvbnN0IE9NWF9VOCAqcFByZWQwLAotICAgIGNvbnN0IE9NWF9VOCAqcFByZWQxLAotICAgIE9NWF9VMzIgaVByZWRTdGVwMCwKLSAgICBPTVhfVTMyIGlQcmVkU3RlcDEsCi0gICAgT01YX1U4ICpwRHN0UHJlZCwKLSAgICBPTVhfVTMyIGlEc3RTdGVwLAotICAgIE9NWF9VMzIgaUhlaWdodAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQXZlcmFnZV8xNnggICAoNi4xLjMuMS4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBhdmVyYWdlIG9mIHR3byAxNngxNiBvciAxNng4IGJsb2Nrcy4gIFRoZSAKLSAqIHJlc3VsdCBpcyByb3VuZGVkIGFjY29yZGluZyB0byAoYStiKzEpLzIuICBUaGUgYmxvY2sgYXZlcmFnZSBmdW5jdGlvbiBjYW4gCi0gKiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggaGFsZi1waXhlbCBpbnRlcnBvbGF0aW9uIHRvIG9idGFpbiBxdWFydGVyIAotICogcGl4ZWwgbW90aW9uIGVzdGltYXRlcywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0xMF0sIHN1YmNsYXVzZSA4LjQuMi4yLjEuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBQcmVkMCAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMCAKLSAqICAgcFByZWQxIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAxIAotICogICBpUHJlZFN0ZXAwIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMCAKLSAqICAgaVByZWRTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiAgIGlEc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyIAotICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBibG9ja3MgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RQcmVkIC0gUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiAxNi1ieXRlIGFsaWduZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKLSAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBQcmVkMCwgcFByZWQxLCBvciAKLSAqICAgICAgICAgICAgICBwRHN0UHJlZC4gCi0gKiAgICAtICAgcERzdFByZWQgaXMgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgIC0gICBpUHJlZFN0ZXAwIDw9IDAgb3IgaVByZWRTdGVwMCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgICAtICAgaVByZWRTdGVwMSA8PSAwIG9yIGlQcmVkU3RlcDEgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAotICogICAgLSAgIGlEc3RTdGVwIDw9IDAgb3IgaURzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAotICogICAgLSAgIGlIZWlnaHQgaXMgbm90IDggb3IgMTYuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDQ09NTV9BdmVyYWdlXzE2eCAoCi0gICAgY29uc3QgT01YX1U4ICpwUHJlZDAsCi0gICAgY29uc3QgT01YX1U4ICpwUHJlZDEsCi0gICAgT01YX1UzMiBpUHJlZFN0ZXAwLAotICAgIE9NWF9VMzIgaVByZWRTdGVwMSwKLSAgICBPTVhfVTggKnBEc3RQcmVkLAotICAgIE9NWF9VMzIgaURzdFN0ZXAsCi0gICAgT01YX1UzMiBpSGVpZ2h0Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDQ09NTV9FeHBhbmRGcmFtZV9JICAgKDYuMS4zLjIuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gZXhwYW5kcyBhIHJlY29uc3RydWN0ZWQgZnJhbWUgaW4tcGxhY2UuICBUaGUgdW5leHBhbmRlZCAKLSAqIHNvdXJjZSBmcmFtZSBzaG91bGQgYmUgc3RvcmVkIGluIGEgcGxhbmUgYnVmZmVyIHdpdGggc3VmZmljaWVudCBzcGFjZSAKLSAqIHByZS1hbGxvY2F0ZWQgZm9yIGVkZ2UgZXhwYW5zaW9uLCBhbmQgdGhlIGlucHV0IGZyYW1lIHNob3VsZCBiZSBsb2NhdGVkIGluIAotICogdGhlIHBsYW5lIGJ1ZmZlciBjZW50ZXIuICBUaGlzIGZ1bmN0aW9uIGV4ZWN1dGVzIHRoZSBwaXhlbCBleHBhbnNpb24gYnkgCi0gKiByZXBsaWNhdGluZyBzb3VyY2UgZnJhbWUgZWRnZSBwaXhlbCBpbnRlbnNpdGllcyBpbiB0aGUgZW1wdHkgcGl4ZWwgCi0gKiBsb2NhdGlvbnMgKGV4cGFuc2lvbiByZWdpb24pIGJldHdlZW4gdGhlIHNvdXJjZSBmcmFtZSBlZGdlIGFuZCB0aGUgcGxhbmUgCi0gKiBidWZmZXIgZWRnZS4gIFRoZSB3aWR0aC9oZWlnaHQgb2YgdGhlIGV4cGFuc2lvbiByZWdpb25zIG9uIHRoZSAKLSAqIGhvcml6b250YWwvdmVydGljYWwgZWRnZXMgaXMgY29udHJvbGxlZCBieSB0aGUgcGFyYW1ldGVyIGlFeHBhbmRQZWxzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0UGxhbmUgLSBwb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGZyYW1lIHRvIGJlIAotICogICAgICAgICAgICBleHBhbmRlZDsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIGlGcmFtZVdpZHRoIC0gZnJhbWUgd2lkdGg7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgaUZyYW1lSGVpZ2h0IC1mcmFtZSBoZWlnaHQ7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgaUV4cGFuZFBlbHMgLSBudW1iZXIgb2YgcGl4ZWxzIHRvIGJlIGV4cGFuZGVkIGluIHRoZSBob3Jpem9udGFsIGFuZCAKLSAqICAgICAgICAgICAgdmVydGljYWwgZGlyZWN0aW9uczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBpUGxhbmVTdGVwIC0gZGlzdGFuY2UsIGluIGJ5dGVzLCBiZXR3ZWVuIHRoZSBzdGFydCBvZiBjb25zZWN1dGl2ZSBsaW5lcyAKLSAqICAgICAgICAgICAgaW4gdGhlIHBsYW5lIGJ1ZmZlcjsgbXVzdCBiZSBsYXJnZXIgdGhhbiBvciBlcXVhbCB0byAKLSAqICAgICAgICAgICAgKGlGcmFtZVdpZHRoICsgMiAqIGlFeHBhbmRQZWxzKS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3RQbGFuZSAtUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBmcmFtZSAoTk9UIHRoZSAKLSAqICAgICAgICAgICAgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBwbGFuZSk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCi0gKiAgICAtICAgIHBTcmNEc3RQbGFuZSBpcyBOVUxMLiAKLSAqICAgIC0gICAgcFNyY0RzdFBsYW5lIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgICAtICAgIG9uZSBvZiB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgaXMgZWl0aGVyIGVxdWFsIHRvIHplcm8gb3IgaXMgYSAKLSAqICAgICAgICAgICAgICBub24tbXVsdGlwbGUgb2YgODogaUZyYW1lSGVpZ2h0LCBpRnJhbWVXaWR0aCwgaVBsYW5lU3RlcCwgb3IgCi0gKiAgICAgICAgICAgICAgaUV4cGFuZFBlbHMuIAotICogICAgLSAgICBpUGxhbmVTdGVwIDwgKGlGcmFtZVdpZHRoICsgMiAqIGlFeHBhbmRQZWxzKS4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNDT01NX0V4cGFuZEZyYW1lX0kgKAotICAgIE9NWF9VOCAqcFNyY0RzdFBsYW5lLAotICAgIE9NWF9VMzIgaUZyYW1lV2lkdGgsCi0gICAgT01YX1UzMiBpRnJhbWVIZWlnaHQsCi0gICAgT01YX1UzMiBpRXhwYW5kUGVscywKLSAgICBPTVhfVTMyIGlQbGFuZVN0ZXAKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0NvcHk4eDggICAoNi4xLjMuMy4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29waWVzIHRoZSByZWZlcmVuY2UgOHg4IGJsb2NrIHRvIHRoZSBjdXJyZW50IGJsb2NrLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrIGluIHRoZSBzb3VyY2UgZnJhbWU7IG11c3QgYmUgCi0gKiAgICAgICAgICAgIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgc3RlcCAtIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0cyBvZiBjb25zZWN1dGl2ZSBsaW5lcyBpbiB0aGUgcmVmZXJlbmNlIAotICogICAgICAgICAgICBmcmFtZSwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4IGFuZCBtdXN0IGJlIGxhcmdlciB0aGFuIAotICogICAgICAgICAgICBvciBlcXVhbCB0byA4LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAotICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcERzdCAKLSAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKLSAqICAgICAgICAgICAgICBib3VuZGFyeTogcFNyYywgcERzdCAKLSAqICAgIC0gICAgc3RlcCA8OCBvciBzdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDQ09NTV9Db3B5OHg4ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmMsCi0gICAgT01YX1U4ICpwRHN0LAotICAgIE9NWF9JTlQgc3RlcAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQ29weTE2eDE2ICAgKDYuMS4zLjMuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvcGllcyB0aGUgcmVmZXJlbmNlIDE2eDE2IG1hY3JvYmxvY2sgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jay4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBtYWNyb2Jsb2NrIGluIHRoZSBzb3VyY2UgZnJhbWU7IG11c3QgYmUgCi0gKiAgICAgICAgICAgIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgc3RlcCAtIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0cyBvZiBjb25zZWN1dGl2ZSBsaW5lcyBpbiB0aGUgcmVmZXJlbmNlIAotICogICAgICAgICAgICBmcmFtZSwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNiBhbmQgbXVzdCBiZSBsYXJnZXIgCi0gKiAgICAgICAgICAgIHRoYW4gb3IgZXF1YWwgdG8gMTYuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gbWFjcm9ibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgCi0gKiAgICAgICAgICAgIDE2LWJ5dGUgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKLSAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBEc3QgCi0gKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCi0gKiAgICAgICAgICAgICAgYm91bmRhcnk6IHBTcmMsIHBEc3QgCi0gKiAgICAtICAgIHN0ZXAgPDE2IG9yIHN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDQ09NTV9Db3B5MTZ4MTYgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKLSAgICBPTVhfVTggKnBEc3QsCi0gICAgT01YX0lOVCBzdGVwCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2tfU0FEICAgKDYuMS40LjEuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbXB1dGVzIHRleHR1cmUgZXJyb3Igb2YgdGhlIGJsb2NrOyBhbHNvIHJldHVybnMgU0FELiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgc291cmNlIHBsYW5lOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKiAgIHNyY1N0ZXAgLSBzdGVwIG9mIHRoZSBzb3VyY2UgcGxhbmUgCi0gKiAgIHBTcmNSZWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYnVmZmVyLCBhbiA4eDggYmxvY2s7IG11c3QgYmUgYWxpZ25lZCAKLSAqICAgICAgICAgICAgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciwgYW4gOHg4IGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgCi0gKiAgICAgICAgICAgIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIHRoZSBTdW0gb2YgQWJzb2x1dGUgRGlmZmVyZW5jZXMgKFNBRCkgdmFsdWUgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMgCi0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwU3JjUmVmLCBwRHN0IGFuZCBwRHN0U0FELiAKLSAqICAgIC0gICAgcFNyYyBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBTcmNTdGVwIDw9IDAgb3Igc3JjU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgIC0gICAgcFNyY1JlZiBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBwRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9ja19TQUQgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKLSAgICBPTVhfSU5UIHNyY1N0ZXAsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAotICAgIE9NWF9TMTYgKnBEc3QsCi0gICAgT01YX0lOVCAqcERzdFNBRAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrICAgKDYuMS40LjEuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbXB1dGVzIHRoZSB0ZXh0dXJlIGVycm9yIG9mIHRoZSBibG9jay4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBwbGFuZS4gVGhpcyBzaG91bGQgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqICAgc3JjU3RlcCAtIHN0ZXAgb2YgdGhlIHNvdXJjZSBwbGFuZSAKLSAqICAgcFNyY1JlZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBidWZmZXIsIGFuIDh4OCBibG9jay4gVGhpcyBzaG91bGQgYmUgCi0gKiAgICAgICAgICAgIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciwgYW4gOHg4IGJsb2NrLiBUaGlzIHNob3VsZCBiZSAKLSAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcFNyYywgcFNyY1JlZiwgcERzdC4gCi0gKiAgICAtICAgIHBTcmMgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgU3JjU3RlcCA8PSAwIG9yIHNyY1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgICAtICAgIHBTcmNSZWYgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgcERzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9jayAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjLAotICAgIE9NWF9JTlQgc3JjU3RlcCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYsCi0gICAgT01YX1MxNiAqcERzdAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fTGltaXRNVlRvUmVjdCAgICg2LjEuNC4xLjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBMaW1pdHMgdGhlIG1vdGlvbiB2ZWN0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IGJsb2NrL21hY3JvYmxvY2sgdG8gCi0gKiBwcmV2ZW50IHRoZSBtb3Rpb24gY29tcGVuc2F0ZWQgYmxvY2svbWFjcm9ibG9jayBmcm9tIG1vdmluZyBvdXRzaWRlIGEgCi0gKiBib3VuZGluZyByZWN0YW5nbGUgYXMgc2hvd24gaW4gRmlndXJlIDYtMS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY01WIC0gcG9pbnRlciB0byB0aGUgbW90aW9uIHZlY3RvciBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgYmxvY2sgCi0gKiAgICAgICAgICAgIG9yIG1hY3JvYmxvY2sgCi0gKiAgIHBSZWN0Vk9QUmVmIC0gcG9pbnRlciB0byB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlIAotICogICBYY29vcmQsIFljb29yZCAgLSBjb29yZGluYXRlcyBvZiB0aGUgY3VycmVudCBibG9jayBvciBtYWNyb2Jsb2NrIAotICogICBzaXplIC0gc2l6ZSBvZiB0aGUgY3VycmVudCBibG9jayBvciBtYWNyb2Jsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIDggb3IgCi0gKiAgICAgICAgICAgIDE2LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdE1WIC0gcG9pbnRlciB0byB0aGUgbGltaXRlZCBtb3Rpb24gdmVjdG9yIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9yIG1vcmUgb2YgdGhlIAotICogICAgICAgICAgICAgIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcFNyY01WLCBwRHN0TVYsIG9yIHBSZWN0Vk9QUmVmLiAKLSAqICAgIC0gICAgc2l6ZSBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDggb3IgMTYuIAotICogICAgLSAgICB0aGUgd2lkdGggb3IgaGVpZ2h0IG9mIHRoZSBib3VuZGluZyByZWN0YW5nbGUgaXMgbGVzcyB0aGFuIAotICogICAgICAgICB0d2ljZSB0aGUgYmxvY2sgc2l6ZS4KLSAqLwotT01YUmVzdWx0IG9teFZDQ09NTV9MaW1pdE1WVG9SZWN0ICgKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY01WLAotICAgIE9NWFZDTW90aW9uVmVjdG9yICpwRHN0TVYsCi0gICAgY29uc3QgT01YUmVjdCAqcFJlY3RWT1BSZWYsCi0gICAgT01YX0lOVCBYY29vcmQsCi0gICAgT01YX0lOVCBZY29vcmQsCi0gICAgT01YX0lOVCBzaXplCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDQ09NTV9TQURfMTZ4ICAgKDYuMS40LjEuNCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGZvciAxNngxNiBhbmQgMTZ4OCBibG9ja3MuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNPcmcgLSBQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKLSAqICAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqICAgaVN0ZXBPcmcgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXIgCi0gKiAgIHBTcmNSZWYgIC0gUG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrIAotICogICBpU3RlcFJlZiAtIFN0ZXAgb2YgdGhlIHJlZmVyZW5jZSBibG9jayBidWZmZXIgCi0gKiAgIGlIZWlnaHQgIC0gSGVpZ2h0IG9mIHRoZSBibG9jayAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFNBRCAtIFBvaW50ZXIgb2YgcmVzdWx0IFNBRCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvciBtb3JlIG9mIHRoZSAKLSAqICAgICAgICAgICAgICBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBTcmNPcmcsIHBEc3RTQUQsIG9yIHBTcmNSZWYgCi0gKiAgICAtICAgIHBTcmNPcmcgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIGlTdGVwT3JnICA8PSAwIG9yIGlTdGVwT3JnIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2IAotICogICAgLSAgICBpU3RlcFJlZiA8PSAwIG9yIGlTdGVwUmVmIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2IAotICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCA4IG9yIDE2IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDQ09NTV9TQURfMTZ4ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNPcmcsCi0gICAgT01YX1UzMiBpU3RlcE9yZywKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYsCi0gICAgT01YX1UzMiBpU3RlcFJlZiwKLSAgICBPTVhfUzMyICpwRHN0U0FELAotICAgIE9NWF9VMzIgaUhlaWdodAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fU0FEXzh4ICAgKDYuMS40LjEuNSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGZvciA4eDE2LCA4eDgsIDh4NCBibG9ja3MuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNPcmcgIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDgtYnl0ZSAKLSAqICAgICAgICAgICAgICBib3VuZGFyeS4gCi0gKiAgIGlTdGVwT3JnIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyIAotICogICBwU3JjUmVmICAtIFBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jayAKLSAqICAgaVN0ZXBSZWYgLSBTdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyIAotICogICBpSGVpZ2h0ICAtIEhlaWdodCBvZiB0aGUgYmxvY2sgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RTQUQgLVBvaW50ZXIgb2YgcmVzdWx0IFNBRCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvciBtb3JlIG9mIHRoZSAKLSAqICAgICAgICAgICAgICBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBTcmNPcmcsIHBEc3RTQUQsIG9yIHBTcmNSZWYgCi0gKiAgICAtICAgIHBTcmNPcmcgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgaVN0ZXBPcmcgIDw9IDAgb3IgaVN0ZXBPcmcgaXMgbm90IGEgbXVsdGlwbGUgb2YgOCAKLSAqICAgIC0gICAgaVN0ZXBSZWYgPD0gMCBvciBpU3RlcFJlZiBpcyBub3QgYSBtdWx0aXBsZSBvZiA4IAotICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCA0LCA4IG9yIDE2IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDQ09NTV9TQURfOHggKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY09yZywKLSAgICBPTVhfVTMyIGlTdGVwT3JnLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZiwKLSAgICBPTVhfVTMyIGlTdGVwUmVmLAotICAgIE9NWF9TMzIqcERzdFNBRCwKLSAgICBPTVhfVTMyIGlIZWlnaHQKLSk7Ci0KLQotCi0vKiA2LjIuMS4xIERpcmVjdGlvbiAgKi8KLS8qIFRoZSBkaXJlY3Rpb24gZW51bWVyYXRvciBpcyB1c2VkIHdpdGggZnVuY3Rpb25zIHRoYXQgcGVyZm9ybSBBQy9EQyBwcmVkaWN0aW9uIGFuZCB6aWctemFnIHNjYW4uICAqLwotCi1lbnVtIHsKLSAgICBPTVhfVkNfTk9ORSAgICAgICA9IDAsCi0gICAgT01YX1ZDX0hPUklaT05UQUwgPSAxLAotICAgIE9NWF9WQ19WRVJUSUNBTCAgID0gMiAKLX07Ci0KLQotCi0vKiA2LjIuMS4yIEJpbGluZWFyIEludGVycG9sYXRpb24gICovCi0vKiBUaGUgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBlbnVtZXJhdG9yIGlzIHVzZWQgd2l0aCBtb3Rpb24gZXN0aW1hdGlvbiwgbW90aW9uIGNvbXBlbnNhdGlvbiwgYW5kIHJlY29uc3RydWN0aW9uIGZ1bmN0aW9ucy4gICovCi0KLWVudW0gewotICAgIE9NWF9WQ19JTlRFR0VSX1BJWEVMID0gMCwgLyogY2FzZSBhICovCi0gICAgT01YX1ZDX0hBTEZfUElYRUxfWCAgPSAxLCAvKiBjYXNlIGIgKi8KLSAgICBPTVhfVkNfSEFMRl9QSVhFTF9ZICA9IDIsIC8qIGNhc2UgYyAqLwotICAgIE9NWF9WQ19IQUxGX1BJWEVMX1hZID0gMyAgLyogY2FzZSBkICovIAotfTsKLQotCi0KLS8qIDYuMi4xLjMgTmVpZ2hib3JpbmcgTWFjcm9ibG9jayBBdmFpbGFiaWxpdHkgICovCi0vKiBOZWlnaGJvcmluZyBtYWNyb2Jsb2NrIGF2YWlsYWJpbGl0eSBpcyBpbmRpY2F0ZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBmbGFnczogICAqLwotCi1lbnVtIHsKLSAgICBPTVhfVkNfVVBQRVIgPSAxLCAgICAgICAgLyoqIGFib3ZlIG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlICovCi0gICAgT01YX1ZDX0xFRlQgPSAyLCAgICAgICAgIC8qKiBsZWZ0IG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlICovCi0gICAgT01YX1ZDX0NFTlRFUiA9IDQsCi0gICAgT01YX1ZDX1JJR0hUID0gOCwKLSAgICBPTVhfVkNfTE9XRVIgPSAxNiwKLSAgICBPTVhfVkNfVVBQRVJfTEVGVCA9IDMyLCAgLyoqIGFib3ZlLWxlZnQgbWFjcm9ibG9jayBpcyBhdmFpbGFibGUgKi8KLSAgICBPTVhfVkNfVVBQRVJfUklHSFQgPSA2NCwgLyoqIGFib3ZlLXJpZ2h0IG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlICovCi0gICAgT01YX1ZDX0xPV0VSX0xFRlQgPSAxMjgsCi0gICAgT01YX1ZDX0xPV0VSX1JJR0hUID0gMjU2IAotfTsKLQotCi0KLS8qIDYuMi4xLjQgVmlkZW8gQ29tcG9uZW50cyAgKi8KLS8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyB2aWRlbyBjb21wb25lbnRzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgT01YX1ZDX0xVTUlOQU5DRSwgICAgLyoqIEx1bWluYW5jZSBjb21wb25lbnQgKi8KLSAgICBPTVhfVkNfQ0hST01JTkFOQ0UgICAvKiogY2hyb21pbmFuY2UgY29tcG9uZW50ICovIAotfSBPTVhWQ000UDJWaWRlb0NvbXBvbmVudDsKLQotCi0KLS8qIDYuMi4xLjUgTWFjcm9ibG9ja1R5cGVzICAqLwotLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIG1hY3JvYmxvY2sgdHlwZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgICBPTVhfVkNfSU5URVIgICAgID0gMCwgLyoqIFAgcGljdHVyZSBvciBQLVZPUCAqLwotICAgIE9NWF9WQ19JTlRFUl9RICAgPSAxLCAvKiogUCBwaWN0dXJlIG9yIFAtVk9QICovCi0gICAgT01YX1ZDX0lOVEVSNFYgICA9IDIsIC8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKi8KLSAgICBPTVhfVkNfSU5UUkEgICAgID0gMywgLyoqIEkgYW5kIFAgcGljdHVyZSwgSS0gYW5kIFAtVk9QICovCi0gICAgT01YX1ZDX0lOVFJBX1EgICA9IDQsIC8qKiBJIGFuZCBQIHBpY3R1cmUsIEktIGFuZCBQLVZPUCAqLwotICAgIE9NWF9WQ19JTlRFUjRWX1EgPSA1ICAvKiogUCBwaWN0dXJlIG9yIFAtVk9QIChILjI2MykqLwotfSBPTVhWQ000UDJNYWNyb2Jsb2NrVHlwZTsKLQotCi0KLS8qIDYuMi4xLjYgQ29vcmRpbmF0ZXMgICovCi0vKiBDb29yZGluYXRlcyBhcmUgcmVwcmVzZW50ZWQgYXMgZm9sbG93czogICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBPTVhfSU5UIHg7Ci0gICAgT01YX0lOVCB5OwotfSBPTVhWQ000UDJDb29yZGluYXRlOwotCi0KLQotLyogNi4yLjEuNyBNb3Rpb24gRXN0aW1hdGlvbiBBbGdvcml0aG1zICAqLwotLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIG1vdGlvbiBlc3RpbWF0aW9uIHNlYXJjaCBtZXRob2RzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgT01YX1ZDX000UDJfRkFTVF9TRUFSQ0ggPSAwLCAgLyoqIEZhc3QgbW90aW9uIHNlYXJjaCAqLwotICAgIE9NWF9WQ19NNFAyX0ZVTExfU0VBUkNIID0gMSAgIC8qKiBGdWxsIG1vdGlvbiBzZWFyY2ggKi8gCi19IE9NWFZDTTRQMk1FTW9kZTsKLQotCi0KLS8qIDYuMi4xLjggTW90aW9uIEVzdGltYXRpb24gUGFyYW1ldGVycyAgKi8KLS8qIEEgZGF0YSBzdHJ1Y3R1cmUgY29udGFpbmluZyBjb250cm9sIHBhcmFtZXRlcnMgZm9yIAotICogbW90aW9uIGVzdGltYXRpb24gZnVuY3Rpb25zIGlzIGRlZmluZWQgYXMgZm9sbG93czogIAotICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBPTVhfSU5UIHNlYXJjaEVuYWJsZTh4ODsgICAgIC8qKiBlbmFibGVzIDh4OCBzZWFyY2ggKi8KLSAgICBPTVhfSU5UIGhhbGZQZWxTZWFyY2hFbmFibGU7IC8qKiBlbmFibGVzIGhhbGYtcGVsIHJlc29sdXRpb24gKi8KLSAgICBPTVhfSU5UIHNlYXJjaFJhbmdlOyAgICAgICAgIC8qKiBzZWFyY2ggcmFuZ2UgKi8KLSAgICBPTVhfSU5UIHJuZFZhbDsgICAgICAgICAgICAgIC8qKiByb3VuZGluZyBjb250cm9sOyAwLWRpc2FibGVkLCAxLWVuYWJsZWQqLwotfSBPTVhWQ000UDJNRVBhcmFtczsKLQotCi0KLS8qIDYuMi4xLjkgTWFjcm9ibG9jayBJbmZvcm1hdGlvbiAgICovCi0vKiBBIGRhdGEgc3RydWN0dXJlIGNvbnRhaW5pbmcgbWFjcm9ibG9jayBwYXJhbWV0ZXJzIGZvciAKLSAqIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9ucyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAKLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgT01YX1MzMiBzbGljZUlkOyAgICAgICAgICAgICAgICAgLyogc2xpY2UgbnVtYmVyICovCi0gICAgT01YVkNNNFAyTWFjcm9ibG9ja1R5cGUgbWJUeXBlOyAgLyogTUIgdHlwZTogT01YX1ZDX0lOVFJBLCBPTVhfVkNfSU5URVIsIG9yIE9NWF9WQ19JTlRFUjQgKi8KLSAgICBPTVhfUzMyIHFwOyAgICAgICAgICAgICAgICAgICAgICAvKiBxdWFudGl6YXRpb24gcGFyYW1ldGVyKi8KLSAgICBPTVhfVTMyIGNicHk7ICAgICAgICAgICAgICAgICAgICAvKiBDQlAgTHVtYSAqLwotICAgIE9NWF9VMzIgY2JwYzsgICAgICAgICAgICAgICAgICAgIC8qIENCUCBDaHJvbWEgKi8KLSAgICBPTVhWQ01vdGlvblZlY3RvciBwTVYwWzJdWzJdOyAgICAvKiBtb3Rpb24gdmVjdG9yLCByZXByZXNlbnRlZCB1c2luZyAxLzItcGVsIHVuaXRzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwTVYwW2Jsb2NreV1bYmxvY2t4XSAoYmxvY2t5ID0gMH4xLCBibG9ja3ggPTB+MSkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgcE1WUHJlZFsyXVsyXTsgLyogbW90aW9uIHZlY3RvciBwcmVkaWN0aW9uLCByZXByZXNlbnRlZCB1c2luZyAxLzItcGVsIHVuaXRzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwTVZQcmVkW2Jsb2NreV1bYmxvY2t4XSAoYmxvY2t5ID0gMH4xLCBibG9ja3ggPSAwfjEpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIE9NWF9VOCBwUHJlZERpclsyXVsyXTsgICAgICAgICAgIC8qIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uOiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIE9NWF9WQ19OT05FLCBPTVhfVkNfVkVSVElDQUwsIE9NWF9WQ19IT1JJWk9OVEFMIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotfSBPTVhWQ000UDJNQkluZm8sICpPTVhWQ000UDJNQkluZm9QdHI7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0ZpbmRNVnByZWQgICAoNi4yLjMuMS4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUHJlZGljdHMgYSBtb3Rpb24gdmVjdG9yIGZvciB0aGUgY3VycmVudCBibG9jayB1c2luZyB0aGUgcHJvY2VkdXJlIAotICogc3BlY2lmaWVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi41LiAgVGhlIHJlc3VsdGluZyBwcmVkaWN0ZWQgTVYgaXMgCi0gKiByZXR1cm5lZCBpbiBwRHN0TVZQcmVkLiBJZiB0aGUgcGFyYW1ldGVyIHBEc3RNVlByZWRNRSBpZiBpcyBub3QgTlVMTCB0aGVuIAotICogdGhlIHNldCBvZiB0aHJlZSBNViBjYW5kaWRhdGVzIHVzZWQgZm9yIHByZWRpY3Rpb24gaXMgYWxzbyByZXR1cm5lZCwgCi0gKiBvdGhlcndpc2UgcERzdE1WUHJlZE1FaXMgTlVMTCB1cG9uIHJldHVybi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY01WQ3VyTUIgLSBwb2ludGVyIHRvIHRoZSBNViBidWZmZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IFkgCi0gKiAgICAgICAgICAgIG1hY3JvYmxvY2s7IGEgdmFsdWUgb2YgTlVMTCBpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuIAotICogICBwU3JjQ2FuZE1WMSAtIHBvaW50ZXIgdG8gdGhlIE1WIGJ1ZmZlciBjb250YWluaW5nIHRoZSA0IE1WcyBhc3NvY2lhdGVkIAotICogICAgICAgICAgICB3aXRoIHRoZSBNQiBsb2NhdGVkIHRvIHRoZSBsZWZ0IG9mIHRoZSBjdXJyZW50IE1COyBzZXQgdG8gTlVMTCAKLSAqICAgICAgICAgICAgaWYgdGhlcmUgaXMgbm8gTUIgdG8gdGhlIGxlZnQuIAotICogICBwU3JjQ2FuZE1WMiAtIHBvaW50ZXIgdG8gdGhlIE1WIGJ1ZmZlciBjb250YWluaW5nIHRoZSA0IE1WcyBhc3NvY2lhdGVkIAotICogICAgICAgICAgICB3aXRoIHRoZSBNQiBsb2NhdGVkIGFib3ZlIHRoZSBjdXJyZW50IE1COyBzZXQgdG8gTlVMTCBpZiB0aGVyZSAKLSAqICAgICAgICAgICAgaXMgbm8gTUIgbG9jYXRlZCBhYm92ZSB0aGUgY3VycmVudCBNQi4gCi0gKiAgIHBTcmNDYW5kTVYzIC0gcG9pbnRlciB0byB0aGUgTVYgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIDQgTVZzIGFzc29jaWF0ZWQgCi0gKiAgICAgICAgICAgIHdpdGggdGhlIE1CIGxvY2F0ZWQgdG8gdGhlIHJpZ2h0IGFuZCBhYm92ZSB0aGUgY3VycmVudCBNQjsgc2V0IAotICogICAgICAgICAgICB0byBOVUxMIGlmIHRoZXJlIGlzIG5vIE1CIGxvY2F0ZWQgdG8gdGhlIGFib3ZlLXJpZ2h0LiAKLSAqICAgaUJsayAtIHRoZSBpbmRleCBvZiBibG9jayBpbiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIAotICogICBwRHN0TVZQcmVkTUUgLSBNViBjYW5kaWRhdGUgcmV0dXJuIGJ1ZmZlcjsgIGlmIHNldCB0byBOVUxMIHRoZW4gCi0gKiAgICAgICAgICAgIHByZWRpY3Rpb24gY2FuZGlkYXRlIE1WcyBhcmUgbm90IHJldHVybmVkIGFuZCBwRHN0TVZQcmVkTUUgd2lsbCAKLSAqICAgICAgICAgICAgYmUgTlVMTCB1cG9uIGZ1bmN0aW9uIHJldHVybjsgaWYgcERzdE1WUHJlZE1FIGlzIG5vbi1OVUxMIHRoZW4gaXQgCi0gKiAgICAgICAgICAgIG11c3QgcG9pbnQgdG8gYSBidWZmZXIgY29udGFpbmluZyBzdWZmaWNpZW50IHNwYWNlIGZvciB0aHJlZSAKLSAqICAgICAgICAgICAgcmV0dXJuIE1Wcy4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RNVlByZWQgLSBwb2ludGVyIHRvIHRoZSBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvciAKLSAqICAgcERzdE1WUHJlZE1FIC0gaWYgbm9uLU5VTEwgdXBvbiBpbnB1dCB0aGVuIHBEc3RNVlByZWRNRSAgcG9pbnRzIHVwb24gCi0gKiAgICAgICAgICAgIHJldHVybiB0byBhIGJ1ZmZlciBjb250YWluaW5nIHRoZSB0aHJlZSBtb3Rpb24gdmVjdG9yIGNhbmRpZGF0ZXMgCi0gKiAgICAgICAgICAgIHVzZWQgZm9yIHByZWRpY3Rpb24gYXMgc3BlY2lmaWVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIAotICogICAgICAgICAgICA3LjYuNSwgb3RoZXJ3aXNlIGlmIE5VTEwgdXBvbiBpbnB1dCB0aGVuIHBEc3RNVlByZWRNRSBpcyBOVUxMIAotICogICAgICAgICAgICB1cG9uIG91dHB1dC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAotICogICAgLSAgICB0aGUgcG9pbnRlciBwRHN0TVZQcmVkIGlzIE5VTEwgCi0gKiAgICAtICAgIHRoZSBwYXJhbWV0ZXIgaUJsayBkb2VzIG5vdCBmYWxsIGludG8gdGhlIHJhbmdlIDAgPD0gaUJsazw9MyAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfRmluZE1WcHJlZCAoCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNNVkN1ck1CLAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjQ2FuZE1WMSwKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0NhbmRNVjIsCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNDYW5kTVYzLAotICAgIE9NWFZDTW90aW9uVmVjdG9yICpwRHN0TVZQcmVkLAotICAgIE9NWFZDTW90aW9uVmVjdG9yICpwRHN0TVZQcmVkTUUsCi0gICAgT01YX0lOVCBpQmxrCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9JRENUOHg4YmxrICAgKDYuMi4zLjIuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbXB1dGVzIGEgMkQgaW52ZXJzZSBEQ1QgZm9yIGEgc2luZ2xlIDh4OCBibG9jaywgYXMgZGVmaW5lZCBpbiAKLSAqIFtJU08xNDQ5Ni0yXS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lYXJseSBhcnJhbmdlZCBJRENUIGlucHV0IGJ1ZmZlcjsgCi0gKiAgICAgICAgICAgIG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuICBBY2NvcmRpbmcgdG8gCi0gKiAgICAgICAgICAgIFtJU08xNDQ5Ni0yXSwgdGhlIGlucHV0IGNvZWZmaWNpZW50IHZhbHVlcyBzaG91bGQgbGllIHdpdGhpbiB0aGUgCi0gKiAgICAgICAgICAgIHJhbmdlIFstMjA0OCwgMjA0N10uIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmVhcmx5IGFycmFuZ2VkIElEQ1Qgb3V0cHV0IGJ1ZmZlcjsgCi0gKiAgICAgICAgICAgIG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgotICogICAgLSAgICBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCi0gKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfSURDVDh4OGJsayAoCi0gICAgY29uc3QgT01YX1MxNiAqcFNyYywKLSAgICBPTVhfUzE2ICpwRHN0Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9NRUdldEJ1ZlNpemUgICAoNi4yLjQuMS4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29tcHV0ZXMgdGhlIHNpemUsIGluIGJ5dGVzLCBvZiB0aGUgdmVuZG9yLXNwZWNpZmljIHNwZWNpZmljYXRpb24gCi0gKiBzdHJ1Y3R1cmUgZm9yIHRoZSBmb2xsb3dpbmcgbW90aW9uIGVzdGltYXRpb24gZnVuY3Rpb25zOiAKLSAqIEJsb2NrTWF0Y2hfSW50ZWdlcl84eDgsIEJsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiwgYW5kIE1vdGlvbkVzdGltYXRpb25NQi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgTUVtb2RlIC0gbW90aW9uIGVzdGltYXRpb24gbW9kZTsgYXZhaWxhYmxlIG1vZGVzIGFyZSBkZWZpbmVkIGJ5IHRoZSAKLSAqICAgICAgICAgICAgZW51bWVyYXRlZCB0eXBlIE9NWFZDTTRQMk1FTW9kZSAKLSAqICAgcE1FUGFyYW1zIC0gbW90aW9uIGVzdGltYXRpb24gcGFyYW1ldGVycyAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNpemUgLSBwb2ludGVyIHRvIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZSBzcGVjaWZpY2F0aW9uIAotICogICAgICAgICAgICBzdHJ1Y3R1cmUgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGFuIGludmFsaWQgdmFsdWUgd2FzIHNwZWNpZmllZCBmb3IgdGhlIHBhcmFtZXRlciBNRW1vZGUgCi0gKiAgICAtICAgIGEgbmVnYXRpdmUgb3IgemVybyB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciB0aGUgCi0gKiAgICAgICAgIHBhcmFtZXRlciBwTUVQYXJhbXMtPnNlYXJjaFJhbmdlIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9NRUdldEJ1ZlNpemUgKAotICAgIE9NWFZDTTRQMk1FTW9kZSBNRW1vZGUsCi0gICAgY29uc3QgT01YVkNNNFAyTUVQYXJhbXMgKnBNRVBhcmFtcywKLSAgICBPTVhfVTMyICpwU2l6ZQotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfTUVJbml0ICAgKDYuMi40LjEuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIEluaXRpYWxpemVzIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgcmVxdWlyZWQgZm9yIHRoZSAKLSAqIGZvbGxvd2luZyBtb3Rpb24gZXN0aW1hdGlvbiBmdW5jdGlvbnM6ICBCbG9ja01hdGNoX0ludGVnZXJfOHg4LCAKLSAqIEJsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiwgYW5kIE1vdGlvbkVzdGltYXRpb25NQi4gTWVtb3J5IGZvciB0aGUgCi0gKiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAqcE1FU3BlYyBtdXN0IGJlIGFsbG9jYXRlZCBwcmlvciB0byBjYWxsaW5nIHRoZSAKLSAqIGZ1bmN0aW9uLCBhbmQgc2hvdWxkIGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBGb2xsb3dpbmcgCi0gKiBpbml0aWFsaXphdGlvbiBieSB0aGlzIGZ1bmN0aW9uLCB0aGUgdmVuZG9yLXNwZWNpZmljIHN0cnVjdHVyZSAqcE1FU3BlYyAKLSAqIHNob3VsZCBjb250YWluIGFuIGltcGxlbWVudGF0aW9uLXNwZWNpZmljIHJlcHJlc2VudGF0aW9uIG9mIGFsbCBtb3Rpb24gCi0gKiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgcmVjZWl2ZWQgdmlhIHRoZSBzdHJ1Y3R1cmUgcE1FUGFyYW1zLCBmb3IgZXhhbXBsZSAgCi0gKiBybmRWYWwsIHNlYXJjaFJhbmdlLCBldGMuICBUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgCi0gKiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSBjYW4gYmUgZGV0ZXJtaW5lZCB1c2luZyB0aGUgZnVuY3Rpb24gCi0gKiBvbXhWQ000UDJfTUVHZXRCdWZTaXplLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBNRW1vZGUgLSBtb3Rpb24gZXN0aW1hdGlvbiBtb2RlOyBhdmFpbGFibGUgbW9kZXMgYXJlIGRlZmluZWQgYnkgdGhlIAotICogICAgICAgICAgICBlbnVtZXJhdGVkIHR5cGUgT01YVkNNNFAyTUVNb2RlIAotICogICBwTUVQYXJhbXMgLSBtb3Rpb24gZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIAotICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgdW5pbml0aWFsaXplZCBNRSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIGluaXRpYWxpemVkIE1FIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6IAotICogICAgLSAgICBhbiBpbnZhbGlkIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSBwYXJhbWV0ZXIgTUVtb2RlIAotICogICAgLSAgICBhIG5lZ2F0aXZlIG9yIHplcm8gdmFsdWUgd2FzIHNwZWNpZmllZCBmb3IgdGhlIAotICogICAgICAgICBwYXJhbWV0ZXIgcE1FUGFyYW1zLT5zZWFyY2hSYW5nZSAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfTUVJbml0ICgKLSAgICBPTVhWQ000UDJNRU1vZGUgTUVtb2RlLAotICAgIGNvbnN0IE9NWFZDTTRQMk1FUGFyYW1zKnBNRVBhcmFtcywKLSAgICB2b2lkICpwTUVTcGVjCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYgICAoNi4yLjQuMi4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgYSAxNngxNiBibG9jayBzZWFyY2g7IGVzdGltYXRlcyBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIAotICogbWluaW11bSBTQUQuIEJvdGggdGhlIGlucHV0IGFuZCBvdXRwdXQgbW90aW9uIHZlY3RvcnMgYXJlIHJlcHJlc2VudGVkIHVzaW5nIAotICogaGFsZi1waXhlbCB1bml0cywgYW5kIHRoZXJlZm9yZSBhIHNoaWZ0IGxlZnQgb3IgcmlnaHQgYnkgMSBiaXQgbWF5IGJlIAotICogcmVxdWlyZWQsIHJlc3BlY3RpdmVseSwgdG8gbWF0Y2ggdGhlIGlucHV0IG9yIG91dHB1dCBNVnMgd2l0aCBvdGhlciAKLSAqIGZ1bmN0aW9ucyB0aGF0IGVpdGhlciBnZW5lcmF0ZSBvdXRwdXQgTVZzIG9yIGV4cGVjdCBpbnB1dCBNVnMgcmVwcmVzZW50ZWQgCi0gKiB1c2luZyBpbnRlZ2VyIHBpeGVsIHVuaXRzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjUmVmQnVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIAotICogICAgICAgICAgICBNQiB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIAotICogICAgICAgICAgICB0aGUgY3VycmVudCBwbGFuZS4gCi0gKiAgIHJlZldpZHRoIC0gd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZSAKLSAqICAgcFJlZlJlY3QgLSBwb2ludGVyIHRvIHRoZSB2YWxpZCByZWZlcmVuY2UgcGxhbmUgcmVjdGFuZ2xlOyBjb29yZGluYXRlcyAKLSAqICAgICAgICAgICAgYXJlIHNwZWNpZmllZCByZWxhdGl2ZSB0byB0aGUgaW1hZ2Ugb3JpZ2luLiAgUmVjdGFuZ2xlIAotICogICAgICAgICAgICBib3VuZGFyaWVzIG1heSBleHRlbmQgYmV5b25kIGltYWdlIGJvdW5kYXJpZXMgaWYgdGhlIGltYWdlIGhhcyAKLSAqICAgICAgICAgICAgYmVlbiBwYWRkZWQuICBGb3IgZXhhbXBsZSwgaWYgcGFkZGluZyBleHRlbmRzIDQgcGl4ZWxzIGJleW9uZCAKLSAqICAgICAgICAgICAgZnJhbWUgYm9yZGVyLCB0aGVuIHRoZSB2YWx1ZSBmb3IgdGhlIGxlZnQgYm9yZGVyIGNvdWxkIGJlIHNldCB0byAKLSAqICAgICAgICAgICAgLTQuIAotICogICBwU3JjQ3VyckJ1ZiAtIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayAKLSAqICAgICAgICAgICAgYnVmZmVyIGV4dHJhY3RlZCBmcm9tIHRoZSBvcmlnaW5hbCBwbGFuZSAobGluZWFyIGFycmF5LCAyNTYgCi0gKiAgICAgICAgICAgIGVudHJpZXMpOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgVGhlIG51bWJlciBvZiAKLSAqICAgICAgICAgICAgYnl0ZXMgYmV0d2VlbiBsaW5lcyAoc3RlcCkgaXMgMTYuIAotICogICBwQ3VyclBvaW50UG9zIC0gcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZSAKLSAqICAgcFNyY1ByZU1WIC0gcG9pbnRlciB0byBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvcjsgTlVMTCBpbmRpY2F0ZXMgbm8gCi0gKiAgICAgICAgICAgIHByZWRpY3RlZCBNViAKLSAqICAgcFNyY1ByZVNBRCAtIHBvaW50ZXIgdG8gU0FEIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJlZGljdGVkIE1WIChyZWZlcmVuY2VkIAotICogICAgICAgICAgICBieSBwU3JjUHJlTVYpOyBtYXkgYmUgc2V0IHRvIE5VTEwgaWYgdW5hdmFpbGFibGUuIAotICogICBwTUVTcGVjIC0gdmVuZG9yLXNwZWNpZmljIG1vdGlvbiBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gc3RydWN0dXJlOyAKLSAqICAgICAgICAgICAgbXVzdCBoYXZlIGJlZW4gYWxsb2NhdGVkIGFuZCB0aGVuIGluaXRpYWxpemVkIHVzaW5nIAotICogICAgICAgICAgICBvbXhWQ000UDJfTUVJbml0IHByaW9yIHRvIGNhbGxpbmcgdGhlIGJsb2NrIG1hdGNoaW5nIGZ1bmN0aW9uLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdE1WIC0gcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYgCi0gKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIG1pbmltdW0gU0FEIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY1JlZkJ1ZiwgCi0gKiAgICAgICAgICAgICAgcFJlZlJlY3QsIHBTcmNDdXJyQnVmZiwgcEN1cnJQb2ludFBvcywgcERzdE1WLCBwRHN0U0FEIG9yIAotICogICAgICAgICAgICAgIHBNRVNwZWMsIG9yIAotICogICAgLSAgICBwU3JjQ3VyckJ1ZiBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKLSAgICBPTVhfSU5UIHJlZldpZHRoLAotICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCi0gICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvcipwU3JjUHJlTVYsCi0gICAgY29uc3QgT01YX0lOVCAqcFNyY1ByZVNBRCwKLSAgICB2b2lkICpwTUVTcGVjLAotICAgIE9NWFZDTW90aW9uVmVjdG9yKnBEc3RNViwKLSAgICBPTVhfSU5UICpwRHN0U0FECi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfOHg4ICAgKDYuMi40LjIuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGFuIDh4OCBibG9jayBzZWFyY2g7IGVzdGltYXRlcyBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIAotICogbWluaW11bSBTQUQuICBCb3RoIHRoZSBpbnB1dCBhbmQgb3V0cHV0IG1vdGlvbiB2ZWN0b3JzIGFyZSByZXByZXNlbnRlZCAKLSAqIHVzaW5nIGhhbGYtcGl4ZWwgdW5pdHMsIGFuZCB0aGVyZWZvcmUgYSBzaGlmdCBsZWZ0IG9yIHJpZ2h0IGJ5IDEgYml0IG1heSBiZSAKLSAqIHJlcXVpcmVkLCByZXNwZWN0aXZlbHksIHRvIG1hdGNoIHRoZSBpbnB1dCBvciBvdXRwdXQgTVZzIHdpdGggb3RoZXIgCi0gKiBmdW5jdGlvbnMgdGhhdCBlaXRoZXIgZ2VuZXJhdGUgb3V0cHV0IE1WcyBvciBleHBlY3QgaW5wdXQgTVZzIHJlcHJlc2VudGVkIAotICogdXNpbmcgaW50ZWdlciBwaXhlbCB1bml0cy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY1JlZkJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSAKLSAqICAgICAgICAgICAgYmxvY2sgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgOHg4IGJsb2NrIAotICogICAgICAgICAgICBpbiB0aGUgY3VycmVudCBwbGFuZS4gCi0gKiAgIHJlZldpZHRoIC0gd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZSAKLSAqICAgcFJlZlJlY3QgLSBwb2ludGVyIHRvIHRoZSB2YWxpZCByZWZlcmVuY2UgcGxhbmUgcmVjdGFuZ2xlOyBjb29yZGluYXRlcyAKLSAqICAgICAgICAgICAgYXJlIHNwZWNpZmllZCByZWxhdGl2ZSB0byB0aGUgaW1hZ2Ugb3JpZ2luLiAgUmVjdGFuZ2xlIAotICogICAgICAgICAgICBib3VuZGFyaWVzIG1heSBleHRlbmQgYmV5b25kIGltYWdlIGJvdW5kYXJpZXMgaWYgdGhlIGltYWdlIGhhcyAKLSAqICAgICAgICAgICAgYmVlbiBwYWRkZWQuIAotICogICBwU3JjQ3VyckJ1ZiAtIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayAKLSAqICAgICAgICAgICAgYnVmZmVyIGV4dHJhY3RlZCBmcm9tIHRoZSBvcmlnaW5hbCBwbGFuZSAobGluZWFyIGFycmF5LCAxMjggCi0gKiAgICAgICAgICAgIGVudHJpZXMpOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAgVGhlIG51bWJlciBvZiAKLSAqICAgICAgICAgICAgYnl0ZXMgYmV0d2VlbiBsaW5lcyAoc3RlcCkgaXMgMTYgYnl0ZXMuIAotICogICBwQ3VyclBvaW50UG9zIC0gcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUgCi0gKiAgIHBTcmNQcmVNViAtIHBvaW50ZXIgdG8gcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3I7IE5VTEwgaW5kaWNhdGVzIG5vIAotICogICAgICAgICAgICBwcmVkaWN0ZWQgTVYgCi0gKiAgIHBTcmNQcmVTQUQgLSBwb2ludGVyIHRvIFNBRCBhc3NvY2lhdGVkIHdpdGggdGhlIHByZWRpY3RlZCBNViAocmVmZXJlbmNlZCAKLSAqICAgICAgICAgICAgYnkgcFNyY1ByZU1WKTsgbWF5IGJlIHNldCB0byBOVUxMIGlmIHVuYXZhaWxhYmxlLiAKLSAqICAgcE1FU3BlYyAtIHZlbmRvci1zcGVjaWZpYyBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZTsgCi0gKiAgICAgICAgICAgIG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCBhbmQgdGhlbiBpbml0aWFsaXplZCB1c2luZyAKLSAqICAgICAgICAgICAgb214VkNNNFAyX01FSW5pdCBwcmlvciB0byBjYWxsaW5nIHRoZSBibG9jayBtYXRjaGluZyBmdW5jdGlvbi4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RNViAtIHBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WIAotICogICBwRHN0U0FEIC0gcG9pbnRlciB0byBtaW5pbXVtIFNBRCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNSZWZCdWYsIAotICogICAgICAgICAgICAgIHBSZWZSZWN0LCBwU3JjQ3VyckJ1ZmYsIHBDdXJyUG9pbnRQb3MsIHBEc3RNViwgcERzdFNBRCBvciAKLSAqICAgICAgICAgICAgICBwTUVTcGVjLCBvciAKLSAqICAgIC0gICAgcFNyY0N1cnJCdWYgaXMgbm90IDgtYnl0ZSBhbGlnbmVkIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfOHg4ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCi0gICAgT01YX0lOVCByZWZXaWR0aCwKLSAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAotICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNQcmVNViwKLSAgICBjb25zdCBPTVhfSU5UICpwU3JjUHJlU0FELAotICAgIHZvaWQgKnBNRVNwZWMsCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgKnBEc3RNViwKLSAgICBPTVhfSU5UICpwRHN0U0FECi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfMTZ4MTYgICAoNi4yLjQuMi4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgYSAxNngxNiBibG9jayBtYXRjaCB3aXRoIGhhbGYtcGl4ZWwgcmVzb2x1dGlvbi4gIFJldHVybnMgdGhlIAotICogZXN0aW1hdGVkIG1vdGlvbiB2ZWN0b3IgYW5kIGFzc29jaWF0ZWQgbWluaW11bSBTQUQuICBUaGlzIGZ1bmN0aW9uIAotICogZXN0aW1hdGVzIHRoZSBoYWxmLXBpeGVsIG1vdGlvbiB2ZWN0b3IgYnkgaW50ZXJwb2xhdGluZyB0aGUgaW50ZWdlciAKLSAqIHJlc29sdXRpb24gbW90aW9uIHZlY3RvciByZWZlcmVuY2VkIGJ5IHRoZSBpbnB1dCBwYXJhbWV0ZXIgcFNyY0RzdE1WLCBpLmUuLCAKLSAqIHRoZSBpbml0aWFsIGludGVnZXIgTVYgaXMgZ2VuZXJhdGVkIGV4dGVybmFsbHkuICBUaGUgaW5wdXQgcGFyYW1ldGVycyAKLSAqIHBTcmNSZWZCdWYgYW5kIHBTZWFyY2hQb2ludFJlZlBvcyBzaG91bGQgYmUgc2hpZnRlZCBieSB0aGUgd2lubmluZyBNViBvZiAKLSAqIDE2eDE2IGludGVnZXIgc2VhcmNoIHByaW9yIHRvIGNhbGxpbmcgQmxvY2tNYXRjaF9IYWxmXzE2eDE2LiBUaGUgZnVuY3Rpb24gCi0gKiBCbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYgbWF5IGJlIHVzZWQgZm9yIGludGVnZXIgbW90aW9uIGVzdGltYXRpb24uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNSZWZCdWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgCi0gKiAgICAgICAgICAgIG1hY3JvYmxvY2sgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgCi0gKiAgICAgICAgICAgIG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUuIAotICogICByZWZXaWR0aCAtIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUgCi0gKiAgIHBSZWZSZWN0IC0gcmVmZXJlbmNlIHBsYW5lIHZhbGlkIHJlZ2lvbiByZWN0YW5nbGUgCi0gKiAgIHBTcmNDdXJyQnVmIC0gcG9pbnRlciB0byB0aGUgY3VycmVudCBibG9jayBpbiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIAotICogICAgICAgICAgICBidWZmZXIgZXh0cmFjdGVkIGZyb20gdGhlIG9yaWdpbmFsIHBsYW5lIChsaW5lYXIgYXJyYXksIDI1NiAKLSAqICAgICAgICAgICAgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuICBUaGUgbnVtYmVyIG9mIAotICogICAgICAgICAgICBieXRlcyBiZXR3ZWVuIGxpbmVzIChzdGVwKSBpcyAxNi4gCi0gKiAgIHBTZWFyY2hQb2ludFJlZlBvcyAtIHBvc2l0aW9uIG9mIHRoZSBzdGFydGluZyBwb2ludCBmb3IgaGFsZiBwaXhlbCAKLSAqICAgICAgICAgICAgc2VhcmNoIChzcGVjaWZpZWQgaW4gdGVybXMgb2YgaW50ZWdlciBwaXhlbCB1bml0cykgaW4gdGhlIAotICogICAgICAgICAgICByZWZlcmVuY2UgcGxhbmUsIGkuZS4sIHRoZSByZWZlcmVuY2UgcG9zaXRpb24gcG9pbnRlZCB0byBieSB0aGUgCi0gKiAgICAgICAgICAgIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yLiAKLSAqICAgcm5kVmFsIC0gcm91bmRpbmcgY29udHJvbCBwYXJhbWV0ZXI6IDAgLSBkaXNhYmxlZDsgMSAtIGVuYWJsZWQuIAotICogICBwU3JjRHN0TVYgLSBwb2ludGVyIHRvIHRoZSBpbml0aWFsIE1WIGVzdGltYXRlOyB0eXBpY2FsbHkgZ2VuZXJhdGVkIAotICogICAgICAgICAgICBkdXJpbmcgYSBwcmlvciAxNlgxNiBpbnRlZ2VyIHNlYXJjaDsgc3BlY2lmaWVkIGluIHRlcm1zIG9mIAotICogICAgICAgICAgICBoYWxmLXBpeGVsIHVuaXRzLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdE1WIC0gcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYgCi0gKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIG1pbmltdW0gU0FEIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY1JlZkJ1ZiwgCi0gKiAgICAgICAgIHBSZWZSZWN0LCBwU3JjQ3VyckJ1ZmYsIHBTZWFyY2hQb2ludFJlZlBvcywgcFNyY0RzdE1WLgotICogICAgLSAgICBwU3JjQ3VyckJ1ZiBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLCBvciAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCi0gICAgT01YX0lOVCByZWZXaWR0aCwKLSAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAotICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBTZWFyY2hQb2ludFJlZlBvcywKLSAgICBPTVhfSU5UIHJuZFZhbCwKLSAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0RzdE1WLAotICAgIE9NWF9JTlQgKnBEc3RTQUQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl84eDggICAoNi4yLjQuMi40KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgYW4gOHg4IGJsb2NrIG1hdGNoIHdpdGggaGFsZi1waXhlbCByZXNvbHV0aW9uLiBSZXR1cm5zIHRoZSAKLSAqIGVzdGltYXRlZCBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIG1pbmltdW0gU0FELiAgVGhpcyBmdW5jdGlvbiAKLSAqIGVzdGltYXRlcyB0aGUgaGFsZi1waXhlbCBtb3Rpb24gdmVjdG9yIGJ5IGludGVycG9sYXRpbmcgdGhlIGludGVnZXIgCi0gKiByZXNvbHV0aW9uIG1vdGlvbiB2ZWN0b3IgcmVmZXJlbmNlZCBieSB0aGUgaW5wdXQgcGFyYW1ldGVyIHBTcmNEc3RNViwgaS5lLiwgCi0gKiB0aGUgaW5pdGlhbCBpbnRlZ2VyIE1WIGlzIGdlbmVyYXRlZCBleHRlcm5hbGx5LiAgVGhlIGlucHV0IHBhcmFtZXRlcnMgCi0gKiBwU3JjUmVmQnVmIGFuZCBwU2VhcmNoUG9pbnRSZWZQb3Mgc2hvdWxkIGJlIHNoaWZ0ZWQgYnkgdGhlIHdpbm5pbmcgTVYgb2YgCi0gKiA4eDggaW50ZWdlciBzZWFyY2ggcHJpb3IgdG8gY2FsbGluZyBCbG9ja01hdGNoX0hhbGZfOHg4LiBUaGUgZnVuY3Rpb24gCi0gKiBCbG9ja01hdGNoX0ludGVnZXJfOHg4IG1heSBiZSB1c2VkIGZvciBpbnRlZ2VyIG1vdGlvbiBlc3RpbWF0aW9uLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjUmVmQnVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIAotICogICAgICAgICAgICBibG9jayB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCA4eDggYmxvY2sgCi0gKiAgICAgICAgICAgIGluIHRoZSBjdXJyZW50IHBsYW5lLiAKLSAqICAgcmVmV2lkdGggLSB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lIAotICogICBwUmVmUmVjdCAtIHJlZmVyZW5jZSBwbGFuZSB2YWxpZCByZWdpb24gcmVjdGFuZ2xlIAotICogICBwU3JjQ3VyckJ1ZiAtIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayAKLSAqICAgICAgICAgICAgYnVmZmVyIGV4dHJhY3RlZCBmcm9tIHRoZSBvcmlnaW5hbCBwbGFuZSAobGluZWFyIGFycmF5LCAxMjggCi0gKiAgICAgICAgICAgIGVudHJpZXMpOyBtdXN0IGJlIGFsaWduZWQgb24gYSA4LWJ5dGUgYm91bmRhcnkuICBUaGUgbnVtYmVyIG9mIAotICogICAgICAgICAgICBieXRlcyBiZXR3ZWVuIGxpbmVzIChzdGVwKSBpcyAxNi4gCi0gKiAgIHBTZWFyY2hQb2ludFJlZlBvcyAtIHBvc2l0aW9uIG9mIHRoZSBzdGFydGluZyBwb2ludCBmb3IgaGFsZiBwaXhlbCAKLSAqICAgICAgICAgICAgc2VhcmNoIChzcGVjaWZpZWQgaW4gdGVybXMgb2YgaW50ZWdlciBwaXhlbCB1bml0cykgaW4gdGhlIAotICogICAgICAgICAgICByZWZlcmVuY2UgcGxhbmUuIAotICogICBybmRWYWwgLSByb3VuZGluZyBjb250cm9sIHBhcmFtZXRlcjogMCAtIGRpc2FibGVkOyAxIC0gZW5hYmxlZC4gCi0gKiAgIHBTcmNEc3RNViAtIHBvaW50ZXIgdG8gdGhlIGluaXRpYWwgTVYgZXN0aW1hdGU7IHR5cGljYWxseSBnZW5lcmF0ZWQgCi0gKiAgICAgICAgICAgIGR1cmluZyBhIHByaW9yIDh4OCBpbnRlZ2VyIHNlYXJjaCwgc3BlY2lmaWVkIGluIHRlcm1zIG9mIAotICogICAgICAgICAgICBoYWxmLXBpeGVsIHVuaXRzLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdE1WIC0gcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYgCi0gKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIG1pbmltdW0gU0FEIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBTcmNSZWZCdWYsIHBSZWZSZWN0LCBwU3JjQ3VyckJ1ZmYsIHBTZWFyY2hQb2ludFJlZlBvcywgcFNyY0RzdE1WCi0gKiAgICAtICAgIHBTcmNDdXJyQnVmIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OCAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAotICAgIE9NWF9JTlQgcmVmV2lkdGgsCi0gICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKLSAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwU2VhcmNoUG9pbnRSZWZQb3MsCi0gICAgT01YX0lOVCBybmRWYWwsCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNEc3RNViwKLSAgICBPTVhfSU5UICpwRHN0U0FECi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9Nb3Rpb25Fc3RpbWF0aW9uTUIgICAoNi4yLjQuMy4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgbW90aW9uIHNlYXJjaCBmb3IgYSAxNngxNiBtYWNyb2Jsb2NrLiAgU2VsZWN0cyBiZXN0IG1vdGlvbiBzZWFyY2ggCi0gKiBzdHJhdGVneSBmcm9tIGFtb25nIGludGVyLTFNViwgaW50ZXItNE1WLCBhbmQgaW50cmEgbW9kZXMuICBTdXBwb3J0cyAKLSAqIGludGVnZXIgYW5kIGhhbGYgcGl4ZWwgcmVzb2x1dGlvbi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGN1cnJlbnQgTUIgaW4gdGhlIAotICogICAgICAgICAgICBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgCi0gKiAgICAgICAgICAgIFRoZSBmdW5jdGlvbiBkb2VzIG5vdCBleHBlY3Qgc291cmNlIGRhdGEgb3V0c2lkZSB0aGUgcmVnaW9uIAotICogICAgICAgICAgICBib3VuZGVkIGJ5IHRoZSBNQiB0byBiZSBhdmFpbGFibGU7IGZvciBleGFtcGxlIGl0IGlzIG5vdCAKLSAqICAgICAgICAgICAgbmVjZXNzYXJ5IGZvciB0aGUgY2FsbGVyIHRvIGd1YXJhbnRlZSB0aGUgYXZhaWxhYmlsaXR5IG9mIAotICogICAgICAgICAgICBwU3JjQ3VyckJ1ZlstU3JjQ3VyclN0ZXBdLCBpLmUuLCB0aGUgcm93IG9mIHBpeGVscyBhYm92ZSB0aGUgTUIgCi0gKiAgICAgICAgICAgIHRvIGJlIHByb2Nlc3NlZC4gCi0gKiAgIHNyY0N1cnJTdGVwIC0gd2lkdGggb2YgdGhlIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmUsIGluIHRlcm1zIG9mIGZ1bGwgCi0gKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgcFNyY1JlZkJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSAKLSAqICAgICAgICAgICAgcGxhbmUgbG9jYXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgCi0gKiAgICAgICAgICAgIG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmU7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqICAgc3JjUmVmU3RlcCAtIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGljdHVyZSBwbGFuZSwgaW4gdGVybXMgb2YgZnVsbCAKLSAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAotICogICBwUmVmUmVjdCAtIHJlZmVyZW5jZSBwbGFuZSB2YWxpZCByZWdpb24gcmVjdGFuZ2xlLCBzcGVjaWZpZWQgcmVsYXRpdmUgdG8gCi0gKiAgICAgICAgICAgIHRoZSBpbWFnZSBvcmlnaW4gCi0gKiAgIHBDdXJyUG9pbnRQb3MgLSBwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lIAotICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgdmVuZG9yLXNwZWNpZmljIG1vdGlvbiBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gCi0gKiAgICAgICAgICAgIHN0cnVjdHVyZTsgbXVzdCBiZSBhbGxvY2F0ZWQgYW5kIHRoZW4gaW5pdGlhbGl6ZWQgdXNpbmcgCi0gKiAgICAgICAgICAgIG9teFZDTTRQMl9NRUluaXQgcHJpb3IgdG8gY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiAKLSAqICAgcE1CSW5mbyAtIGFycmF5LCBvZiBkaW1lbnNpb24gZm91ciwgY29udGFpbmluZyBwb2ludGVycyB0byBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIGZvdXIgbmVhcmJ5IE1CczogCi0gKiAgICAgICAgICAgIC0gICBwTUJJbmZvWzBdIC0gcG9pbnRlciB0byBsZWZ0IE1CIGluZm9ybWF0aW9uIAotICogICAgICAgICAgICAtICAgcE1CSW5mb1sxXSAtIHBvaW50ZXIgdG8gdG9wIE1CIGluZm9ybWF0aW9uIAotICogICAgICAgICAgICAtICAgcE1CSW5mb1syXSAtIHBvaW50ZXIgdG8gdG9wLWxlZnQgTUIgaW5mb3JtYXRpb24gCi0gKiAgICAgICAgICAgIC0gICBwTUJJbmZvWzNdIC0gcG9pbnRlciB0byB0b3AtcmlnaHQgTUIgaW5mb3JtYXRpb24gCi0gKiAgICAgICAgICAgIEFueSBwb2ludGVyIGluIHRoZSBhcnJheSBtYXkgYmUgc2V0IGVxdWFsIHRvIE5VTEwgaWYgdGhlIAotICogICAgICAgICAgICBjb3JyZXNwb25kaW5nIE1CIGRvZXNuJ3QgZXhpc3QuICBGb3IgZWFjaCBNQiwgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgCi0gKiAgICAgICAgICAgIG1lbWJlcnMgYXJlIHVzZWQ6ICAgIAotICogICAgICAgICAgICAtICAgbWJUeXBlIC0gbWFjcm9ibG9jayB0eXBlLCBlaXRoZXIgT01YX1ZDX0lOVFJBLCBPTVhfVkNfSU5URVIsIG9yIAotICogICAgICAgICAgICAgICAgT01YX1ZDX0lOVEVSNFYgCi0gKiAgICAgICAgICAgIC0gICBwTVYwWzJdWzJdIC0gZXN0aW1hdGVkIG1vdGlvbiB2ZWN0b3JzOyByZXByZXNlbnRlZCAKLSAqICAgICAgICAgICAgICAgIGluIDEvMiBwaXhlbCB1bml0cyAKLSAqICAgICAgICAgICAgLSAgIHNsaWNlSUQgLSBudW1iZXIgb2YgdGhlIHNsaWNlIHRvIHdoaWNoIHRoZSBNQiBiZWxvbmdzIAotICogICBwU3JjRHN0TUJDdXJyIC0gcG9pbnRlciB0byBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBjdXJyZW50IE1CLiAgCi0gKiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgZW50cmllcyBzaG91bGQgYmUgc2V0IHByaW9yIHRvIGNhbGxpbmcgdGhlIAotICogICAgICAgICAgICBmdW5jdGlvbjogc2xpY2VJRCAtIHRoZSBudW1iZXIgb2YgdGhlIHNsaWNlIHRoZSB0byB3aGljaCB0aGUgCi0gKiAgICAgICAgICAgIGN1cnJlbnQgTUIgYmVsb25ncy4gIFRoZSBzdHJ1Y3R1cmUgZWxlbWVudHMgY2JweSBhbmQgY2JwYyBhcmUgCi0gKiAgICAgICAgICAgIGlnbm9yZWQuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0TUJDdXJyIC0gcG9pbnRlciB0byB1cGRhdGVkIGluZm9ybWF0aW9uIHN0cnVjdHVyZSBmb3IgdGhlIGN1cnJlbnQgCi0gKiAgICAgICAgICAgIE1CIGFmdGVyIE1CLWxldmVsIG1vdGlvbiBlc3RpbWF0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZC4gIFRoZSAKLSAqICAgICAgICAgICAgZm9sbG93aW5nIHN0cnVjdHVyZSBtZW1iZXJzIGFyZSB1cGRhdGVkIGJ5IHRoZSBNRSBmdW5jdGlvbjogICAKLSAqICAgICAgICAgICAgICAtICBtYlR5cGUgLSBtYWNyb2Jsb2NrIHR5cGU6IE9NWF9WQ19JTlRSQSwgT01YX1ZDX0lOVEVSLCBvciAKLSAqICAgICAgICAgICAgICAgICBPTVhfVkNfSU5URVI0Vi4gCi0gKiAgICAgICAgICAgICAgLSAgcE1WMFsyXVsyXSAtIGVzdGltYXRlZCBtb3Rpb24gdmVjdG9yczsgcmVwcmVzZW50ZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgdGVybXMgb2YgMS8yIHBlbCB1bml0cy4gCi0gKiAgICAgICAgICAgICAgLSAgcE1WUHJlZFsyXVsyXSAtIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yczsgcmVwcmVzZW50ZWQgCi0gKiAgICAgICAgICAgICAgICAgaW4gdGVybXMgb2YgMS8yIHBlbCB1bml0cy4gCi0gKiAgICAgICAgICAgIFRoZSBzdHJ1Y3R1cmUgbWVtYmVycyBjYnB5IGFuZCBjYnBjIGFyZSBub3QgdXBkYXRlZCBieSB0aGUgZnVuY3Rpb24uIAotICogICBwRHN0U0FEIC0gcG9pbnRlciB0byB0aGUgbWluaW11bSBTQUQgZm9yIElOVEVSMVYsIG9yIHN1bSBvZiBtaW5pbXVtIFNBRHMgCi0gKiAgICAgICAgICAgIGZvciBJTlRFUjRWIAotICogICBwRHN0QmxvY2tTQUQgLSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIFNBRCB2YWx1ZXMgZm9yIGVhY2ggb2YgdGhlIGZvdXIgCi0gKiAgICAgICAgICAgIDh4OCBsdW1hIGJsb2NrcyBpbiB0aGUgTUIuICBUaGUgYmxvY2sgU0FEcyBhcmUgaW4gc2NhbiBvcmRlciBmb3IgCi0gKiAgICAgICAgICAgIGVhY2ggTUIuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9yIG1vcmUgb2YgdGhlIAotICogICAgICAgICAgICAgIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjQ3VyckJ1ZiwgCi0gKiAgICAgICAgICAgICAgcFNyY1JlZkJ1ZiwgcFJlZlJlY3QsIHBDdXJyUG9pbnRQb3MsIHBNQkludGVyLCBwTUJJbnRyYSwgCi0gKiAgICAgICAgICAgICAgcFNyY0RzdE1CQ3Vyciwgb3IgcERzdFNBRC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX01vdGlvbkVzdGltYXRpb25NQiAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKLSAgICBPTVhfUzMyIHNyY0N1cnJTdGVwLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKLSAgICBPTVhfUzMyIHNyY1JlZlN0ZXAsCi0gICAgY29uc3QgT01YUmVjdCpwUmVmUmVjdCwKLSAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAotICAgIHZvaWQgKnBNRVNwZWMsCi0gICAgY29uc3QgT01YVkNNNFAyTUJJbmZvUHRyICpwTUJJbmZvLAotICAgIE9NWFZDTTRQMk1CSW5mbyAqcFNyY0RzdE1CQ3VyciwKLSAgICBPTVhfVTE2ICpwRHN0U0FELAotICAgIE9NWF9VMTYgKnBEc3RCbG9ja1NBRAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRENUOHg4YmxrICAgKDYuMi40LjQuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbXB1dGVzIGEgMkQgZm9yd2FyZCBEQ1QgZm9yIGEgc2luZ2xlIDh4OCBibG9jaywgYXMgZGVmaW5lZCBpbiAKLSAqIFtJU08xNDQ5Ni0yXS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lYXJseSBhcnJhbmdlZCBpbnB1dCBidWZmZXI7IG11c3QgCi0gKiAgICAgICAgICAgIGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgSW5wdXQgdmFsdWVzIChwaXhlbCAKLSAqICAgICAgICAgICAgaW50ZW5zaXRpZXMpIGFyZSB2YWxpZCBpbiB0aGUgcmFuZ2UgWy0yNTUsMjU1XS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZWFybHkgYXJyYW5nZWQgb3V0cHV0IGJ1ZmZlcjsgbXVzdCAKLSAqICAgICAgICAgICAgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLCByZXR1cm5lZCBpZjoKLSAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIE5VTEwuIAotICogICAgLSAgICBwU3JjIG9yIHBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0RDVDh4OGJsayAoCi0gICAgY29uc3QgT01YX1MxNiAqcFNyYywKLSAgICBPTVhfUzE2ICpwRHN0Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9RdWFudEludHJhX0kgICAoNi4yLjQuNC4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgcXVhbnRpemF0aW9uIG9uIGludHJhIGJsb2NrIGNvZWZmaWNpZW50cy4gVGhpcyBmdW5jdGlvbiBzdXBwb3J0cyAKLSAqIGJpdHNfcGVyX3BpeGVsID09IDguIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCBpbnRyYSBibG9jayBjb2VmZmljaWVudHM7IG11c3QgYmUgYWxpZ25lZCAKLSAqICAgICAgICAgICAgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIChxdWFudGl6ZXJfc2NhbGUpLiAKLSAqICAgYmxvY2tJbmRleCAtIGJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZCBwb3NpdGlvbiwgCi0gKiAgICAgICAgICAgIHZhbGlkIGluIHRoZSByYW5nZSAwIHRvIDUsIGFzIGRlZmluZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgCi0gKiAgICAgICAgICAgIDYuMS4zLjguIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKLSAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIAotICogICAgICAgICAgICBtb2RlLCBhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBvdXRwdXQgKHF1YW50aXplZCkgaW50ZXJibG9jayBjb2VmZmljaWVudHMuICAKLSAqICAgICAgICAgICAgV2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLCBBQyBjb2VmZmljaWVudHMgYXJlIHNhdHVyYXRlZCBvbiB0aGUgCi0gKiAgICAgICAgICAgIGludGVydmFsIFstMTI3LCAxMjddLCBhbmQgREMgY29lZmZpY2llbnRzIGFyZSBzYXR1cmF0ZWQgb24gdGhlIAotICogICAgICAgICAgICBpbnRlcnZhbCBbMSwgMjU0XS4gIFdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MCwgQUMgY29lZmZpY2llbnRzIAotICogICAgICAgICAgICBhcmUgc2F0dXJhdGVkIG9uIHRoZSBpbnRlcnZhbCBbLTIwNDcsIDIwNDddLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKLSAqICAgIC0gICAgcFNyY0RzdCBpcyBOVUxMLiAKLSAqICAgIC0gICAgYmxvY2tJbmRleCA8IDAgb3IgYmxvY2tJbmRleCA+PSAxMCAKLSAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PSAzMi4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX1F1YW50SW50cmFfSSAoCi0gICAgT01YX1MxNiAqcFNyY0RzdCwKLSAgICBPTVhfVTggUVAsCi0gICAgT01YX0lOVCBibG9ja0luZGV4LAotICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfUXVhbnRJbnRlcl9JICAgKDYuMi40LjQuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIHF1YW50aXphdGlvbiBvbiBhbiBpbnRlciBjb2VmZmljaWVudCBibG9jazsgc3VwcG9ydHMgCi0gKiBiaXRzX3Blcl9waXhlbCA9PSA4LiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgaW50ZXIgYmxvY2sgY29lZmZpY2llbnRzOyBtdXN0IGJlIGFsaWduZWQgCi0gKiAgICAgICAgICAgIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpemVyX3NjYWxlKSAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyBtb2RlLCBhbmQgCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub24gbGluZWFyIGludHJhIERDIG1vZGUuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgb3V0cHV0IChxdWFudGl6ZWQpIGludGVyYmxvY2sgY29lZmZpY2llbnRzLiAgCi0gKiAgICAgICAgICAgIFdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MSwgQUMgY29lZmZpY2llbnRzIGFyZSBzYXR1cmF0ZWQgb24gdGhlIAotICogICAgICAgICAgICBpbnRlcnZhbCBbLTEyNywgMTI3XSwgYW5kIERDIGNvZWZmaWNpZW50cyBhcmUgc2F0dXJhdGVkIG9uIHRoZSAKLSAqICAgICAgICAgICAgaW50ZXJ2YWwgWzEsIDI1NF0uICBXaGVuIHNob3J0VmlkZW9IZWFkZXI9PTAsIEFDIGNvZWZmaWNpZW50cyAKLSAqICAgICAgICAgICAgYXJlIHNhdHVyYXRlZCBvbiB0aGUgaW50ZXJ2YWwgWy0yMDQ3LCAyMDQ3XS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6Ci0gKiAgICAtICAgIHBTcmNEc3QgaXMgTlVMTC4gCi0gKiAgICAtICAgIFFQIDw9IDAgb3IgUVAgPj0gMzIuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9RdWFudEludGVyX0kgKAotICAgIE9NWF9TMTYgKnBTcmNEc3QsCi0gICAgT01YX1U4IFFQLAotICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50cmEgICAoNi4yLjQuNC40KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUXVhbnRpemVzIHRoZSBEQ1QgY29lZmZpY2llbnRzLCBpbXBsZW1lbnRzIGludHJhIGJsb2NrIEFDL0RDIGNvZWZmaWNpZW50IAotICogcHJlZGljdGlvbiwgYW5kIHJlY29uc3RydWN0cyB0aGUgY3VycmVudCBpbnRyYSBibG9jayB0ZXh0dXJlIGZvciBwcmVkaWN0aW9uIAotICogb24gdGhlIG5leHQgZnJhbWUuICBRdWFudGl6ZWQgcm93IGFuZCBjb2x1bW4gY29lZmZpY2llbnRzIGFyZSByZXR1cm5lZCBpbiAKLSAqIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGJ1ZmZlcnMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBwaXhlbHMgb2YgY3VycmVudCBpbnRyYSBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIAotICogICAgICAgICAgICBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICBwUHJlZEJ1ZlJvdyAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHJvdyBidWZmZXIgY29udGFpbmluZyAKLSAqICAgICAgICAgICAgKChudW1fbWJfcGVyX3JvdyAqIDIgKyAxKSAqIDgpIGVsZW1lbnRzIG9mIHR5cGUgT01YX1MxNi4gCi0gKiAgICAgICAgICAgIENvZWZmaWNpZW50cyBhcmUgb3JnYW5pemVkIGludG8gYmxvY2tzIG9mIGVpZ2h0IGFzIGRlc2NyaWJlZCAKLSAqICAgICAgICAgICAgYmVsb3cgKEludGVybmFsIFByZWRpY3Rpb24gQ29lZmZpY2llbnQgVXBkYXRlIFByb2NlZHVyZXMpLiAgVGhlIAotICogICAgICAgICAgICBEQyBjb2VmZmljaWVudCBpcyBmaXJzdCwgYW5kIHRoZSByZW1haW5pbmcgYnVmZmVyIGxvY2F0aW9ucyAKLSAqICAgICAgICAgICAgY29udGFpbiB0aGUgcXVhbnRpemVkIEFDIGNvZWZmaWNpZW50cy4gRWFjaCBncm91cCBvZiBlaWdodCByb3cgCi0gKiAgICAgICAgICAgIGJ1ZmZlciBlbGVtZW50cyBjb21iaW5lZCB3aXRoIG9uZSBlbGVtZW50IGVpZ2h0IGVsZW1lbnRzIGFoZWFkIAotICogICAgICAgICAgICBjb250YWlucyB0aGUgY29lZmZpY2llbnQgcHJlZGljdG9ycyBvZiB0aGUgbmVpZ2hib3JpbmcgYmxvY2sgCi0gKiAgICAgICAgICAgIHRoYXQgaXMgc3BhdGlhbGx5IGFib3ZlIG9yIHRvIHRoZSBsZWZ0IG9mIHRoZSBibG9jayBjdXJyZW50bHkgdG8gCi0gKiAgICAgICAgICAgIGJlIGRlY29kZWQuIEEgbmVnYXRpdmUtdmFsdWVkIERDIGNvZWZmaWNpZW50IGluZGljYXRlcyB0aGF0IHRoaXMgCi0gKiAgICAgICAgICAgIG5laWdoYm9yaW5nIGJsb2NrIGlzIG5vdCBJTlRSQS1jb2RlZCBvciBvdXQgb2YgYm91bmRzLCBhbmQgCi0gKiAgICAgICAgICAgIHRoZXJlZm9yZSB0aGUgQUMgYW5kIERDIGNvZWZmaWNpZW50cyBhcmUgaW52YWxpZC4gIFBvaW50ZXIgbXVzdCAKLSAqICAgICAgICAgICAgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICBwUHJlZEJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIHByZWRpY3Rpb24gY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlciAKLSAqICAgICAgICAgICAgY29udGFpbmluZyAxNiBlbGVtZW50cyBvZiB0eXBlIE9NWF9TMTYuIENvZWZmaWNpZW50cyBhcmUgCi0gKiAgICAgICAgICAgIG9yZ2FuaXplZCBhcyBkZXNjcmliZWQgaW4gc2VjdGlvbiA2LjIuMi41LiAgUG9pbnRlciBtdXN0IGJlIAotICogICAgICAgICAgICBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBTdW1FcnIgLSBwb2ludGVyIHRvIGEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IEFDIHByZWRpY3Rpb24gaXMgCi0gKiAgICAgICAgICAgIHJlcXVpcmVkOyBBQyBwcmVkaWN0aW9uIGlzIGVuYWJsZWQgaWYgKnBTdW1FcnIgPj0wLCBidXQgdGhlIAotICogICAgICAgICAgICB2YWx1ZSBpcyBub3QgdXNlZCBmb3IgY29lZmZpY2llbnQgcHJlZGljdGlvbiwgaS5lLiwgdGhlIHN1bSBvZiAKLSAqICAgICAgICAgICAgYWJzb2x1dGUgZGlmZmVyZW5jZXMgc3RhcnRzIGZyb20gMCBmb3IgZWFjaCBjYWxsIHRvIHRoaXMgCi0gKiAgICAgICAgICAgIGZ1bmN0aW9uLiAgT3RoZXJ3aXNlIEFDIHByZWRpY3Rpb24gaXMgZGlzYWJsZWQgaWYgKnBTdW1FcnIgPCAwIC4gCi0gKiAgIGJsb2NrSW5kZXggLSBibG9jayBpbmRleCBpbmRpY2F0aW5nIHRoZSBjb21wb25lbnQgdHlwZSBhbmQgcG9zaXRpb24sIGFzIAotICogICAgICAgICAgICBkZWZpbmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDYuMS4zLjguIAotICogICBjdXJRcCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIG1hY3JvYmxvY2sgdG8gd2hpY2ggdGhlIGN1cnJlbnQgCi0gKiAgICAgICAgICAgIGJsb2NrIGJlbG9uZ3MgCi0gKiAgIHBRcEJ1ZiAtIHBvaW50ZXIgdG8gYSAyLWVsZW1lbnQgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBidWZmZXI7IHBRcEJ1ZlswXSAKLSAqICAgICAgICAgICAgY29udGFpbnMgdGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSA4eDggCi0gKiAgICAgICAgICAgIGJsb2NrIGxlZnQgb2YgdGhlIGN1cnJlbnQgYmxvY2sgKFFQYSksIGFuZCBwUXBCdWZbMV0gY29udGFpbnMgCi0gKiAgICAgICAgICAgIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgOHg4IGJsb2NrIGFib3ZlIAotICogICAgICAgICAgICB0aGUgY3VycmVudCBibG9jayAoUVBjKS4gIEluIHRoZSBldmVudCB0aGF0IHRoZSBjb3JyZXNwb25kaW5nIAotICogICAgICAgICAgICBibG9jayBpcyBvdXRzaWRlIG9mIHRoZSBWT1AgYm91bmQsIHRoZSBRcCB2YWx1ZSB3aWxsIG5vdCBhZmZlY3QgCi0gKiAgICAgICAgICAgIHRoZSBpbnRyYSBwcmVkaWN0aW9uIHByb2Nlc3MsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIAotICogICAgICAgICAgICBzdWItY2xhdXNlIDcuNC4zLjMsICBBZGFwdGl2ZSBBQyBDb2VmZmljaWVudCBQcmVkaWN0aW9uLiAgCi0gKiAgIHNyY1N0ZXAgLSB3aWR0aCBvZiB0aGUgc291cmNlIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBkc3RTdGVwIC0gd2lkdGggb2YgdGhlIHJlY29uc3RydWN0ZWQgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGEgCi0gKiAgICAgICAgICAgIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCi0gKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyAKLSAqICAgICAgICAgICAgbW9kZSwgYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub24gbGluZWFyIGludHJhIERDIG1vZGUuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudCBidWZmZXI7IHBEc3RbMF0gY29udGFpbnMgCi0gKiAgICAgICAgICAgIHRoZSBwcmVkaWN0ZWQgREMgY29lZmZpY2llbnQ7IHRoZSByZW1haW5pbmcgZW50cmllcyBjb250YWluIHRoZSAKLSAqICAgICAgICAgICAgcXVhbnRpemVkIEFDIGNvZWZmaWNpZW50cyAod2l0aG91dCBwcmVkaWN0aW9uKS4gIFRoZSBwb2ludGVyIAotICogICAgICAgICAgICBwRHN0bXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBSZWMgLSBwb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIHRleHR1cmU7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiAKLSAqICAgICAgICAgICAgOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcFByZWRCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IHJvdyBidWZmZXIgCi0gKiAgIHBQcmVkQnVmQ29sIC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyIAotICogICBwUHJlQUNQcmVkaWN0IC0gaWYgcHJlZGljdGlvbiBpcyBlbmFibGVkLCB0aGUgcGFyYW1ldGVyIHBvaW50cyB0byB0aGUgCi0gKiAgICAgICAgICAgIHN0YXJ0IG9mIHRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgY29lZmZpY2llbnQgZGlmZmVyZW5jZXMgZm9yIAotICogICAgICAgICAgICBWTEMgZW5jb2RpbmcuIFRoZSBlbnRyeSBwUHJlQUNQcmVkaWN0WzBdaW5kaWNhdGVzIHByZWRpY3Rpb24gCi0gKiAgICAgICAgICAgIGRpcmVjdGlvbiBmb3IgdGhlIGN1cnJlbnQgYmxvY2sgYW5kIHRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICB2YWx1ZXM6IE9NWF9WQ19OT05FIChwcmVkaWN0aW9uIGRpc2FibGVkKSwgT01YX1ZDX0hPUklaT05UQUwsIG9yIAotICogICAgICAgICAgICBPTVhfVkNfVkVSVElDQUwuICBUaGUgZW50cmllcyAKLSAqICAgICAgICAgICAgcFByZUFDUHJlZGljdFsxXS1wUHJlQUNQcmVkaWN0WzddY29udGFpbiBwcmVkaWN0ZWQgQUMgCi0gKiAgICAgICAgICAgIGNvZWZmaWNpZW50cy4gIElmIHByZWRpY3Rpb24gaXMgZGlzYWJsZWQgKCpwU3VtRXJyPDApIHRoZW4gdGhlIAotICogICAgICAgICAgICBjb250ZW50cyBvZiB0aGlzIGJ1ZmZlciBhcmUgdW5kZWZpbmVkIHVwb24gcmV0dXJuIGZyb20gdGhlIAotICogICAgICAgICAgICBmdW5jdGlvbiAKLSAqICAgcFN1bUVyciAtIHBvaW50ZXIgdG8gdGhlIHZhbHVlIG9mIHRoZSBhY2N1bXVsYXRlZCBBQyBjb2VmZmljaWVudCBlcnJvcnMsIAotICogICAgICAgICAgICBpLmUuLCBzdW0gb2YgdGhlIGFic29sdXRlIGRpZmZlcmVuY2VzIGJldHdlZW4gcHJlZGljdGVkIGFuZCAKLSAqICAgICAgICAgICAgdW5wcmVkaWN0ZWQgQUMgY29lZmZpY2llbnRzIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBCYWQgYXJndW1lbnRzOgotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwRHN0LCBwUmVjLCAKLSAqICAgICAgICAgcENvZWZCdWZSb3csIHBDb2VmQnVmQ29sLCBwUXBCdWYsIHBQcmVBQ1ByZWRpY3QsIHBTdW1FcnIuIAotICogICAgLSAgICBibG9ja0luZGV4IDwgMCBvciBibG9ja0luZGV4ID49IDEwOyAKLSAqICAgIC0gICAgY3VyUVAgPD0gMCBvciBjdXJRUCA+PSAzMi4gCi0gKiAgICAtICAgIHNyY1N0ZXAsIG9yIGRzdFN0ZXAgPD0gMCBvciBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgIC0gICAgcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkOiAuIAotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBub3QgOC1ieXRlIGFsaWduZWQ6IAotICogICAgICAgICBwU3JjLCBwUmVjLiAgCi0gKgotICogIE5vdGU6IFRoZSBjb2VmZmljaWVudCBidWZmZXJzIG11c3QgYmUgdXBkYXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIAotICogICAgICAgIHVwZGF0ZSBwcm9jZWR1cmVzIGRlZmluZWQgaW4gc2VjdGlvbiBpbiA2LjIuMi4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludHJhICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmMsCi0gICAgT01YX1MxNiAqcERzdCwKLSAgICBPTVhfVTggKnBSZWMsCi0gICAgT01YX1MxNiAqcFByZWRCdWZSb3csCi0gICAgT01YX1MxNiAqcFByZWRCdWZDb2wsCi0gICAgT01YX1MxNiAqcFByZUFDUHJlZGljdCwKLSAgICBPTVhfSU5UICpwU3VtRXJyLAotICAgIE9NWF9JTlQgYmxvY2tJbmRleCwKLSAgICBPTVhfVTggY3VyUXAsCi0gICAgY29uc3QgT01YX1U4ICpwUXBCdWYsCi0gICAgT01YX0lOVCBzcmNTdGVwLAotICAgIE9NWF9JTlQgZHN0U3RlcCwKLSAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludGVyICAgKDYuMi40LjQuNSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIEltcGxlbWVudHMgRENULCBhbmQgcXVhbnRpemVzIHRoZSBEQ1QgY29lZmZpY2llbnRzIG9mIHRoZSBpbnRlciBibG9jayAKLSAqIHdoaWxlIHJlY29uc3RydWN0aW5nIHRoZSB0ZXh0dXJlIHJlc2lkdWFsLiBUaGVyZSBpcyBubyBib3VuZGFyeSBjaGVjayBmb3IgCi0gKiB0aGUgYml0IHN0cmVhbSBidWZmZXIuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLXBvaW50ZXIgdG8gdGhlIHJlc2lkdWFscyB0byBiZSBlbmNvZGVkOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gCi0gKiAgICAgICAgICAgIDE2LWJ5dGUgYm91bmRhcnkuIAotICogICBRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIuIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7IAotICogICAgICAgICAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyBtb2RlLCBhbmQgCi0gKiAgICAgICAgICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnRzIGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIAotICogICAgICAgICAgICBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICogICBwUmVjIC0gcG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCB0ZXh0dXJlIHJlc2lkdWFsczsgbXVzdCBiZSBhbGlnbmVkIAotICogICAgICAgICAgICBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBlaXRoZXIgTlVMTCBvciAKLSAqICAgICAgICAgbm90IDE2LWJ5dGUgYWxpZ25lZDogCi0gKiAgICAgICAgICAgIC0gcFNyYyAKLSAqICAgICAgICAgICAgLSBwRHN0Ci0gKiAgICAgICAgICAgIC0gcFJlYwotICogICAgLSAgICBRUCA8PSAwIG9yIFFQID49IDMyLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50ZXIgKAotICAgIGNvbnN0IE9NWF9TMTYgKnBTcmMsCi0gICAgT01YX1MxNiAqcERzdCwKLSAgICBPTVhfUzE2ICpwUmVjLAotICAgIE9NWF9VOCBRUCwKLSAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDICAgKDYuMi40LjUuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIHppZ3phZyBzY2FuIGFuZCBWTEMgZW5jb2Rpbmcgb2YgQUMgYW5kIERDIGNvZWZmaWNpZW50cyBmb3Igb25lIAotICogaW50cmEgYmxvY2suICBUd28gdmVyc2lvbnMgb2YgdGhlIGZ1bmN0aW9uIChEQ1ZMQyBhbmQgQUNWTEMpIGFyZSBwcm92aWRlZCAKLSAqIGluIG9yZGVyIHRvIHN1cHBvcnQgdGhlIHR3byBkaWZmZXJlbnQgbWV0aG9kcyBvZiBwcm9jZXNzaW5nIERDIAotICogY29lZmZpY2llbnRzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy40LjEuNCwgIkludHJhIERDIAotICogQ29lZmZpY2llbnQgRGVjb2RpbmcgZm9yIHRoZSBDYXNlIG9mIFN3aXRjaGVkIFZMQyBFbmNvZGluZyIuICAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIGRvdWJsZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdHN0cmVhbSAKLSAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5IAotICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcuIAotICogICBwUURjdEJsa0NvZWYgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50IAotICogICBwcmVkRGlyIC0gQUMgcHJlZGljdGlvbiBkaXJlY3Rpb24sIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHRoZSB6aWd6YWcgCi0gKiAgICAgICAgICAgIHNjYW4gcGF0dGVybjsgdGFrZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiAKLSAqICAgICAgICAgICAgLSAgT01YX1ZDX05PTkUgLSBBQyBwcmVkaWN0aW9uIG5vdCB1c2VkLiAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgY2xhc3NpY2FsIHppZ3phZyBzY2FuLiAKLSAqICAgICAgICAgICAgLSAgT01YX1ZDX0hPUklaT05UQUwgLSBIb3Jpem9udGFsIHByZWRpY3Rpb24uICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtdmVydGljYWwgemlnemFnIHNjYW4uIAotICogICAgICAgICAgICAtICBPTVhfVkNfVkVSVElDQUwgLSBWZXJ0aWNhbCBwcmVkaWN0aW9uLiAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLWhvcml6b250YWwgemlnemFnIHNjYW4uIAotICogICBwYXR0ZXJuIC0gYmxvY2sgcGF0dGVybiB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyIHRoaXMgYmxvY2sgaXMgCi0gKiAgICAgICAgICAgIGVuY29kZWQgCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAotICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCi0gKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2UsIGNocm9taW5hbmNlKSBvZiB0aGUgY3VycmVudCAKLSAqICAgICAgICAgICAgYmxvY2sgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQsIHNvIAotICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4gCi0gKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKLSAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0uIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBCYWQgYXJndW1lbnRzOgotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgCi0gKiAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwUURjdEJsa0NvZWYuIAotICogICAgLSAgICpwQml0T2Zmc2V0IDwgMCwgb3IgKnBCaXRPZmZzZXQgPjcuIAotICogICAgLSAgICBQcmVkRGlyIGlzIG5vdCBvbmUgb2Y6IE9NWF9WQ19OT05FLCBPTVhfVkNfSE9SSVpPTlRBTCwgb3IgCi0gKiAgICAgICAgIE9NWF9WQ19WRVJUSUNBTC4gCi0gKiAgICAtICAgIFZpZGVvQ29tcCBpcyBub3Qgb25lIGNvbXBvbmVudCBvZiBlbnVtIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50LiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhRENWTEMgKAotICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCi0gICAgY29uc3QgT01YX1MxNiAqcFFEY3RCbGtDb2VmLAotICAgIE9NWF9VOCBwcmVkRGlyLAotICAgIE9NWF9VOCBwYXR0ZXJuLAotICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKLSAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCB2aWRlb0NvbXAKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDICAgKDYuMi40LjUuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIHppZ3phZyBzY2FuIGFuZCBWTEMgZW5jb2Rpbmcgb2YgQUMgYW5kIERDIGNvZWZmaWNpZW50cyBmb3Igb25lIAotICogaW50cmEgYmxvY2suICBUd28gdmVyc2lvbnMgb2YgdGhlIGZ1bmN0aW9uIChEQ1ZMQyBhbmQgQUNWTEMpIGFyZSBwcm92aWRlZCAKLSAqIGluIG9yZGVyIHRvIHN1cHBvcnQgdGhlIHR3byBkaWZmZXJlbnQgbWV0aG9kcyBvZiBwcm9jZXNzaW5nIERDIAotICogY29lZmZpY2llbnRzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy40LjEuNCwgIEludHJhIERDIAotICogQ29lZmZpY2llbnQgRGVjb2RpbmcgZm9yIHRoZSBDYXNlIG9mIFN3aXRjaGVkIFZMQyBFbmNvZGluZy4gIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gZG91YmxlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0c3RyZWFtIAotICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgCi0gKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNy4gCi0gKiAgIHBRRGN0QmxrQ29lZiAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQgCi0gKiAgIHByZWREaXIgLSBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbiwgd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgdGhlIHppZ3phZyAKLSAqICAgICAgICAgICAgc2NhbiBwYXR0ZXJuOyB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IAotICogICAgICAgICAgICAtICBPTVhfVkNfTk9ORSAtIEFDIHByZWRpY3Rpb24gbm90IHVzZWQuICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnIHNjYW4uIAotICogICAgICAgICAgICAtICBPTVhfVkNfSE9SSVpPTlRBTCAtIEhvcml6b250YWwgcHJlZGljdGlvbi4gIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS12ZXJ0aWNhbCB6aWd6YWcgc2Nhbi4gCi0gKiAgICAgICAgICAgIC0gIE9NWF9WQ19WRVJUSUNBTCAtIFZlcnRpY2FsIHByZWRpY3Rpb24uICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtaG9yaXpvbnRhbCB6aWd6YWcgc2Nhbi4gCi0gKiAgIHBhdHRlcm4gLSBibG9jayBwYXR0ZXJuIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgdGhpcyBibG9jayBpcyAKLSAqICAgICAgICAgICAgZW5jb2RlZCAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCi0gKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwgc28gCi0gKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyLiAKLSAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAotICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIEJhZCBhcmd1bWVudHM6Ci0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAKLSAqICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBRRGN0QmxrQ29lZi4gCi0gKiAgICAtICAgKnBCaXRPZmZzZXQgPCAwLCBvciAqcEJpdE9mZnNldCA+Ny4gCi0gKiAgICAtICAgIFByZWREaXIgaXMgbm90IG9uZSBvZjogT01YX1ZDX05PTkUsIE9NWF9WQ19IT1JJWk9OVEFMLCBvciAKLSAqICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMLiAKLSAqICAgIC0gICAgVmlkZW9Db21wIGlzIG5vdCBvbmUgY29tcG9uZW50IG9mIGVudW0gT01YVkNNNFAyVmlkZW9Db21wb25lbnQuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQyAoCi0gICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICBjb25zdCBPTVhfUzE2ICpwUURjdEJsa0NvZWYsCi0gICAgT01YX1U4IHByZWREaXIsCi0gICAgT01YX1U4IHBhdHRlcm4sCi0gICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50ZXIgICAoNi4yLjQuNS4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgY2xhc3NpY2FsIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGVuY29kaW5nIGZvciBvbmUgaW50ZXIgYmxvY2suIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgCi0gKiAgICAgICAgICAgIHN0cmVhbSAKLSAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5IAotICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcgCi0gKiAgIHBRRGN0QmxrQ29lZiAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQgCi0gKiAgIHBhdHRlcm4gLSBibG9jayBwYXR0ZXJuIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgdGhpcyBibG9jayBpcyAKLSAqICAgICAgICAgICAgZW5jb2RlZCAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCi0gKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCBzbyB0aGF0IAotICogICAgICAgICAgICBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIuIAotICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCi0gKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gQmFkIGFyZ3VtZW50cyAKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBwb2ludGVyczogaXMgTlVMTDogcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgCi0gKiAgICAgICAgICAgICAgcEJpdE9mZnNldCwgcFFEY3RCbGtDb2VmIAotICogICAgLSAgICpwQml0T2Zmc2V0IDwgMCwgb3IgKnBCaXRPZmZzZXQgPjcuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50ZXIgKAotICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCi0gICAgY29uc3QgT01YX1MxNiAqcFFEY3RCbGtDb2VmLAotICAgIE9NWF9VOCBwYXR0ZXJuLAotICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRW5jb2RlTVYgICAoNi4yLjQuNS40KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUHJlZGljdHMgYSBtb3Rpb24gdmVjdG9yIGZvciB0aGUgY3VycmVudCBtYWNyb2Jsb2NrLCBlbmNvZGVzIHRoZSAKLSAqIGRpZmZlcmVuY2UsIGFuZCB3cml0ZXMgdGhlIG91dHB1dCB0byB0aGUgc3RyZWFtIGJ1ZmZlci4gVGhlIGlucHV0IE1WcyAKLSAqIHBNVkN1ck1CLCBwU3JjTVZMZWZ0TUIsIHBTcmNNVlVwcGVyTUIsIGFuZCBwU3JjTVZVcHBlclJpZ2h0TUIgc2hvdWxkIGxpZSAKLSAqIHdpdGhpbiB0aGUgcmFuZ2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5wdXQgcGFyYW1ldGVyIGZjb2RlRm9yd2FyZCwgYXMgCi0gKiBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjMuICBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGEgCi0gKiBzdXBlcnNldCBvZiB0aGUgZnVuY3Rpb25hbGl0eSBhc3NvY2lhdGVkIHdpdGggdGhlIGZ1bmN0aW9uIAotICogb214VkNNNFAyX0ZpbmRNVnByZWQuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gZG91YmxlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0c3RyZWFtIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtIGluZGV4IG9mIHRoZSBmaXJzdCBmcmVlIChuZXh0IGF2YWlsYWJsZSkgYml0IGluIHRoZSBzdHJlYW0gCi0gKiAgICAgICAgICAgIGJ1ZmZlciByZWZlcmVuY2VkIGJ5ICpwcEJpdFN0cmVhbSwgdmFsaWQgaW4gdGhlIHJhbmdlIDAgdG8gNy4gCi0gKiAgIHBNVkN1ck1CIC0gcG9pbnRlciB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIG1vdGlvbiB2ZWN0b3I7IGEgdmFsdWUgb2YgCi0gKiAgICAgICAgICAgIE5VTEwgaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAKLSAqICAgcFNyY01WTGVmdE1CIC0gcG9pbnRlciB0byB0aGUgc291cmNlIGxlZnQgbWFjcm9ibG9jayBtb3Rpb24gdmVjdG9yOyBhIAotICogICAgICAgICAgICB2YWx1ZSBvZiAgTlVMTGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gCi0gKiAgIHBTcmNNVlVwcGVyTUIgLSBwb2ludGVyIHRvIHNvdXJjZSB1cHBlciBtYWNyb2Jsb2NrIG1vdGlvbiB2ZWN0b3I7IGEgCi0gKiAgICAgICAgICAgIHZhbHVlIG9mIE5VTEwgaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAKLSAqICAgcFNyY01WVXBwZXJSaWdodE1CIC0gcG9pbnRlciB0byBzb3VyY2UgdXBwZXIgcmlnaHQgTUIgbW90aW9uIHZlY3RvcjsgYSAKLSAqICAgICAgICAgICAgdmFsdWUgb2YgTlVMTCBpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuIAotICogICBmY29kZUZvcndhcmQgLSBhbiBpbnRlZ2VyIHdpdGggdmFsdWVzIGZyb20gMSB0byA3OyB1c2VkIGluIGVuY29kaW5nIAotICogICAgICAgICAgICBtb3Rpb24gdmVjdG9ycyByZWxhdGVkIHRvIHNlYXJjaCByYW5nZSwgYXMgZGVzY3JpYmVkIGluIAotICogICAgICAgICAgICBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuMy4gCi0gKiAgIE1CVHlwZSAtIG1hY3JvIGJsb2NrIHR5cGUsIHZhbGlkIGluIHRoZSByYW5nZSAwIHRvIDUgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gdXBkYXRlZCBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gCi0gKiAgICAgICAgICAgIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtIHVwZGF0ZWQgaW5kZXggb2YgdGhlIG5leHQgYXZhaWxhYmxlIGJpdCBwb3NpdGlvbiBpbiBzdHJlYW0gCi0gKiAgICAgICAgICAgIGJ1ZmZlciByZWZlcmVuY2VkIGJ5ICpwcEJpdFN0cmVhbSAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cyAKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sIAotICogICAgICAgICAgICAgICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcE1WQ3VyTUIgCi0gKiAgICAtICAgICpwQml0T2Zmc2V0IDwgMCwgb3IgKnBCaXRPZmZzZXQgPjcuIAotICogICAgLSAgICBmY29kZUZvcndhcmQgPD0gMCwgb3IgZmNvZGVGb3J3YXJkID4gNywgb3IgTUJUeXBlIDwgMC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0VuY29kZU1WICgKLSAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwTVZDdXJNQiwKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvcipwU3JjTVZMZWZ0TUIsCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNNVlVwcGVyTUIsCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNNVlVwcGVyUmlnaHRNQiwKLSAgICBPTVhfSU5UIGZjb2RlRm9yd2FyZCwKLSAgICBPTVhWQ000UDJNYWNyb2Jsb2NrVHlwZSBNQlR5cGUKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1AgICAoNi4yLjUuMS4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogRGVjb2RlcyBhbmQgcGFkcyB0aGUgZm91ciBtb3Rpb24gdmVjdG9ycyBhc3NvY2lhdGVkIHdpdGggYSBub24taW50cmEgUC1WT1AgCi0gKiBtYWNyb2Jsb2NrLiAgRm9yIG1hY3JvYmxvY2tzIG9mIHR5cGUgT01YX1ZDX0lOVEVSNFYsIHRoZSBvdXRwdXQgTVYgaXMgCi0gKiBwYWRkZWQgYXMgc3BlY2lmaWVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi4xLjYuIE90aGVyd2lzZSwgZm9yIAotICogbWFjcm9ibG9ja3Mgb2YgdHlwZXMgb3RoZXIgdGhhbiBPTVhfVkNfSU5URVI0ViwgdGhlIGRlY29kZWQgTVYgaXMgY29waWVkIHRvIAotICogYWxsIGZvdXIgb3V0cHV0IE1WIGJ1ZmZlciBlbnRyaWVzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IAotICogICAgICAgICAgICBzdHJlYW0gYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgdG8gYnkgCi0gKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluIFswLTddLiAKLSAqICAgcFNyY01WTGVmdE1CLCBwU3JjTVZVcHBlck1CLCBhbmQgcFNyY01WVXBwZXJSaWdodE1CIC0gcG9pbnRlcnMgdG8gdGhlIAotICogICAgICAgICAgICBtb3Rpb24gdmVjdG9yIGJ1ZmZlcnMgb2YgdGhlIG1hY3JvYmxvY2tzIHNwZWNpYWxseSBhdCB0aGUgbGVmdCwgCi0gKiAgICAgICAgICAgIHVwcGVyLCBhbmQgdXBwZXItcmlnaHQgc2lkZSBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrLCAKLSAqICAgICAgICAgICAgcmVzcGVjdGl2ZWx5OyBhIHZhbHVlIG9mIE5VTEwgaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAgTm90ZTogCi0gKiAgICAgICAgICAgIEFueSBuZWlnaGJvcmhvb2QgbWFjcm9ibG9jayBvdXRzaWRlIHRoZSBjdXJyZW50IFZPUCBvciB2aWRlbyAKLSAqICAgICAgICAgICAgcGFja2V0IG9yIG91dHNpZGUgdGhlIGN1cnJlbnQgR09CICh3aGVuIHNob3J0X3ZpZGVvX2hlYWRlciBpcyAKLSAqICAgICAgICAgICAgIDEgKSBmb3Igd2hpY2ggZ29iX2hlYWRlcl9lbXB0eSBpcyAgMCAgaXMgdHJlYXRlZCBhcyAKLSAqICAgICAgICAgICAgdHJhbnNwYXJlbnQsIGFjY29yZGluZyB0byBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuNS4gCi0gKiAgIGZjb2RlRm9yd2FyZCAtIGEgY29kZSBlcXVhbCB0byB2b3BfZmNvZGVfZm9yd2FyZCBpbiBNUEVHLTQgYml0IHN0cmVhbSAKLSAqICAgICAgICAgICAgc3ludGF4IAotICogICBNQlR5cGUgLSB0aGUgdHlwZSBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrLiBJZiBNQlR5cGUgaXMgbm90IGVxdWFsIHRvIAotICogICAgICAgICAgICBPTVhfVkNfSU5URVI0ViwgdGhlIGRlc3RpbmF0aW9uIG1vdGlvbiB2ZWN0b3IgYnVmZmVyIGlzIHN0aWxsIAotICogICAgICAgICAgICBmaWxsZWQgd2l0aCB0aGUgc2FtZSBkZWNvZGVkIHZlY3Rvci4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQsIHNvIAotICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAotICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSAKLSAqICAgcERzdE1WQ3VyTUIgLSBwb2ludGVyIHRvIHRoZSBtb3Rpb24gdmVjdG9yIGJ1ZmZlciBmb3IgdGhlIGN1cnJlbnQgCi0gKiAgICAgICAgICAgIG1hY3JvYmxvY2s7IGNvbnRhaW5zIGZvdXIgZGVjb2RlZCBtb3Rpb24gdmVjdG9ycyAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBEc3RNVkN1ck1CIAotICogICAgLSAgICAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddCi0gKiAgICAtICAgIGZjb2RlRm9yd2FyZCBleGNlZWRzICgwLDddCi0gKiAgICAtICAgIE1CVHlwZSBsZXNzIHRoYW4gemVybwotICogICAgLSAgICBtb3Rpb24gdmVjdG9yIGJ1ZmZlciBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAotICogICAgT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1AgKAotICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNNVkxlZnRNQiwKLSAgICBPTVhWQ01vdGlvblZlY3RvcipwU3JjTVZVcHBlck1CLAotICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjTVZVcHBlclJpZ2h0TUIsCi0gICAgT01YVkNNb3Rpb25WZWN0b3IqcERzdE1WQ3VyTUIsCi0gICAgT01YX0lOVCBmY29kZUZvcndhcmQsCi0gICAgT01YVkNNNFAyTWFjcm9ibG9ja1R5cGUgTUJUeXBlCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyAgICg2LjIuNS4yLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gb2YgQUMgYW5kIERDIGNvZWZmaWNpZW50cyAKLSAqIGZvciBvbmUgaW50cmEgYmxvY2suICBUd28gdmVyc2lvbnMgb2YgdGhlIGZ1bmN0aW9uIChEQ1ZMQyBhbmQgQUNWTEMpIGFyZSAKLSAqIHByb3ZpZGVkIGluIG9yZGVyIHRvIHN1cHBvcnQgdGhlIHR3byBkaWZmZXJlbnQgbWV0aG9kcyBvZiBwcm9jZXNzaW5nIERDIAotICogY29lZmZpY2llbnRzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy40LjEuNCwgIEludHJhIERDIAotICogQ29lZmZpY2llbnQgRGVjb2RpbmcgZm9yIHRoZSBDYXNlIG9mIFN3aXRjaGVkIFZMQyBFbmNvZGluZy4gIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSAKLSAqICAgICAgICAgICAgYml0c3RyZWFtIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgY3VycmVudCBieXRlIHJlZmVyZW5jZWQgCi0gKiAgICAgICAgICAgIGJ5ICpwcEJpdFN0cmVhbS4gIFRoZSBwYXJhbWV0ZXIgKnBCaXRPZmZzZXQgaXMgdmFsaWQgaW4gdGhlIAotICogICAgICAgICAgICByYW5nZSBbMC03XS4gCi0gKiAgICAgICAgICAgIEJpdCBQb3NpdGlvbiBpbiBvbmUgYnl0ZTogIHxNb3N0ICAgICAgTGVhc3R8IAotICogICAgICAgICAgICAgICAgICAgICpwQml0T2Zmc2V0ICAgICAgICB8MCAxIDIgMyA0IDUgNiA3fCAKLSAqICAgcHJlZERpciAtIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uOyB1c2VkIHRvIHNlbGVjdCB0aGUgemlnemFnIHNjYW4gCi0gKiAgICAgICAgICAgIHBhdHRlcm47IHRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogCi0gKiAgICAgICAgICAgIC0gIE9NWF9WQ19OT05FIC0gQUMgcHJlZGljdGlvbiBub3QgdXNlZDsgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybXMgY2xhc3NpY2FsIHppZ3phZyBzY2FuLiAKLSAqICAgICAgICAgICAgLSAgT01YX1ZDX0hPUklaT05UQUwgLSBIb3Jpem9udGFsIHByZWRpY3Rpb247IAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1zIGFsdGVybmF0ZS12ZXJ0aWNhbCB6aWd6YWcgc2NhbjsgCi0gKiAgICAgICAgICAgIC0gIE9NWF9WQ19WRVJUSUNBTCAtIFZlcnRpY2FsIHByZWRpY3Rpb247IAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1zIGFsdGVybmF0ZS1ob3Jpem9udGFsIHppZ3phZyBzY2FuLiAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCi0gKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKLSAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSBvciBjaHJvbWluYW5jZSkgb2YgdGhlIAotICogICAgICAgICAgICBjdXJyZW50IGJsb2NrIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkIHN1Y2ggCi0gKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzdWNoIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IAotICogICAgICAgICAgICBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudCBibG9jazsgbXVzdCBiZSAKLSAqICAgICAgICAgICAgNC1ieXRlIGFsaWduZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLCBpZjoKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBEc3QKLSAqICAgIC0gICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XQotICogICAgLSAgICBwcmVEaXIgZXhjZWVkcyBbMCwyXQotICogICAgLSAgICBwRHN0IGlzIG5vdCA0LWJ5dGUgYWxpZ25lZCAKLSAqICAgIE9NWF9TdHNfRXJyIC0gaWY6Ci0gKiAgICAtICAgIEluIERlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLCBkY19zaXplID4gMTIgCi0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiBtYXJrIGJpdHMgZXF1YWxzIHplcm8gCi0gKiAgICAtICAgIElsbGVnYWwgc3RyZWFtIGVuY291bnRlcmVkOyBjb2RlIGNhbm5vdCBiZSBsb2NhdGVkIGluIFZMQyB0YWJsZSAKLSAqICAgIC0gICAgRm9yYmlkZGVuIGNvZGUgZW5jb3VudGVyZWQgaW4gdGhlIFZMQyBGTEMgdGFibGUuIAotICogICAgLSAgICBUaGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBpcyBncmVhdGVyIHRoYW4gNjQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDICgKLSAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgIE9NWF9TMTYgKnBEc3QsCi0gICAgT01YX1U4IHByZWREaXIsCi0gICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAotICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50IHZpZGVvQ29tcAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMgICAoNi4yLjUuMi4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIG9mIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgCi0gKiBmb3Igb25lIGludHJhIGJsb2NrLiAgVHdvIHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbiAoRENWTEMgYW5kIEFDVkxDKSBhcmUgCi0gKiBwcm92aWRlZCBpbiBvcmRlciB0byBzdXBwb3J0IHRoZSB0d28gZGlmZmVyZW50IG1ldGhvZHMgb2YgcHJvY2Vzc2luZyBEQyAKLSAqIGNvZWZmaWNpZW50cywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4xLjQsICBJbnRyYSBEQyAKLSAqIENvZWZmaWNpZW50IERlY29kaW5nIGZvciB0aGUgQ2FzZSBvZiBTd2l0Y2hlZCBWTEMgRW5jb2RpbmcuICAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgCi0gKiAgICAgICAgICAgIGJpdHN0cmVhbSBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGN1cnJlbnQgYnl0ZSByZWZlcmVuY2VkIAotICogICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uICBUaGUgcGFyYW1ldGVyICpwQml0T2Zmc2V0IGlzIHZhbGlkIGluIHRoZSAKLSAqICAgICAgICAgICAgcmFuZ2UgWzAtN10uIEJpdCBQb3NpdGlvbiBpbiBvbmUgYnl0ZTogIHxNb3N0IExlYXN0fCAqcEJpdE9mZnNldCAKLSAqICAgICAgICAgICAgfDAgMSAyIDMgNCA1IDYgN3wgCi0gKiAgIHByZWREaXIgLSBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbjsgdXNlZCB0byBzZWxlY3QgdGhlIHppZ3phZyBzY2FuIAotICogICAgICAgICAgICBwYXR0ZXJuOyB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IE9NWF9WQ19OT05FIC0gQUMgCi0gKiAgICAgICAgICAgIHByZWRpY3Rpb24gbm90IHVzZWQ7IHBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcgc2Nhbi4gCi0gKiAgICAgICAgICAgIE9NWF9WQ19IT1JJWk9OVEFMIC0gSG9yaXpvbnRhbCBwcmVkaWN0aW9uOyBwZXJmb3JtcyAKLSAqICAgICAgICAgICAgYWx0ZXJuYXRlLXZlcnRpY2FsIHppZ3phZyBzY2FuOyBPTVhfVkNfVkVSVElDQUwgLSBWZXJ0aWNhbCAKLSAqICAgICAgICAgICAgcHJlZGljdGlvbjsgcGVyZm9ybXMgYWx0ZXJuYXRlLWhvcml6b250YWwgemlnemFnIHNjYW4uIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKLSAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAotICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlIG9yIGNocm9taW5hbmNlKSBvZiB0aGUgCi0gKiAgICAgICAgICAgIGN1cnJlbnQgYmxvY2sgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQgc3VjaCAKLSAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHN1Y2ggdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgCi0gKiAgICAgICAgICAgIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIAotICogICAgICAgICAgICA0LWJ5dGUgYWxpZ25lZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcERzdCwgCi0gKiAgICAgICAgICAgICAgb3IgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgICAgICAgICAgICAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddLCBwcmVEaXIgZXhjZWVkcyBbMCwyXSwgb3IgcERzdCBpcyAKLSAqICAgICAgICAgICAgICBub3QgNC1ieXRlIGFsaWduZWQgCi0gKiAgICBPTVhfU3RzX0VyciBJbiBEZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQywgZGNfc2l6ZSA+IDEyIEF0IGxlYXN0IG9uZSBvZiAKLSAqICAgICAgICAgICAgICBtYXJrIGJpdHMgZXF1YWxzIHplcm8gSWxsZWdhbCBzdHJlYW0gZW5jb3VudGVyZWQ7IGNvZGUgY2Fubm90IAotICogICAgICAgICAgICAgIGJlIGxvY2F0ZWQgaW4gVkxDIHRhYmxlIEZvcmJpZGRlbiBjb2RlIGVuY291bnRlcmVkIGluIHRoZSBWTEMgCi0gKiAgICAgICAgICAgICAgRkxDIHRhYmxlIFRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGlzIGdyZWF0ZXIgdGhhbiA2NCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMgKAotICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCi0gICAgT01YX1MxNiAqcERzdCwKLSAgICBPTVhfVTggcHJlZERpciwKLSAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlciAgICg2LjIuNS4yLjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gZm9yIG9uZSBpbnRlci1jb2RlZCBibG9jay4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSBkb3VibGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBzdHJlYW0gYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgbmV4dCBhdmFpbGFibGUgYml0IGluIHRoZSBjdXJyZW50IHN0cmVhbSAKLSAqICAgICAgICAgICAgYnl0ZSByZWZlcmVuY2VkIGJ5ICpwcEJpdFN0cmVhbS4gVGhlIHBhcmFtZXRlciAqcEJpdE9mZnNldCBpcyAKLSAqICAgICAgICAgICAgdmFsaWQgd2l0aGluIHRoZSByYW5nZSBbMC03XS4gCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAotICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQgc3VjaCAKLSAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgc3RyZWFtIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgYWZ0ZXIgZGVjb2Rpbmcgc3VjaCB0aGF0IGl0IHBvaW50cyAKLSAqICAgICAgICAgICAgdG8gdGhlIG5leHQgYXZhaWxhYmxlIGJpdCBpbiB0aGUgc3RyZWFtIGJ5dGUgcmVmZXJlbmNlZCBieSAKLSAqICAgICAgICAgICAgKnBwQml0U3RyZWFtIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgCi0gKiAgICAgICAgICAgIDQtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBEc3QKLSAqICAgIC0gICAgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQKLSAqICAgIC0gICAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddCi0gKiAgICBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvciwgaWY6Ci0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBtYXJrIGJpdCBpcyBlcXVhbCB0byB6ZXJvIAotICogICAgLSAgICBFbmNvdW50ZXJlZCBhbiBpbGxlZ2FsIHN0cmVhbSBjb2RlIHRoYXQgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBWTEMgdGFibGUgCi0gKiAgICAtICAgIEVuY291bnRlcmVkIGFuIGlsbGVnYWwgY29kZSBpbiB0aGUgVkxDIEZMQyB0YWJsZSAKLSAqICAgIC0gICAgVGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgaXMgZ3JlYXRlciB0aGFuIDY0IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIgKAotICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCi0gICAgT01YX1MxNiAqcERzdCwKLSAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1F1YW50SW52SW50cmFfSSAgICg2LjIuNS4zLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyB0aGUgc2Vjb25kIGludmVyc2UgcXVhbnRpemF0aW9uIG1vZGUgb24gYW4gaW50cmEvaW50ZXIgY29kZWQgCi0gKiBibG9jay4gU3VwcG9ydHMgYml0c19wZXJfcGl4ZWwgPSA4LiBUaGUgb3V0cHV0IGNvZWZmaWNpZW50cyBhcmUgY2xpcHBlZCB0byAKLSAqIHRoZSByYW5nZSBbLTIwNDgsIDIwNDddLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgKHF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2s7IG11c3QgYmUgCi0gKiAgICAgICAgICAgIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIChxdWFudGl6ZXJfc2NhbGUpIAotICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSBvZiB0aGUgY3VycmVudCBibG9jay4gVGFrZXMgb25lIG9mIHRoZSAKLSAqICAgICAgICAgICAgZm9sbG93aW5nIGZsYWdzOiBPTVhfVkNfTFVNSU5BTkNFLCBPTVhfVkNfQ0hST01JTkFOQ0UgKGludHJhIAotICogICAgICAgICAgICB2ZXJzaW9uIG9ubHkpLiAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyIAotICogICAgICAgICAgICAoaW50cmEgdmVyc2lvbiBvbmx5KS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBvdXRwdXQgKGRlcXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jayAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBpcyAKLSAqICAgICAgICAgICAgICB0cnVlOiAKLSAqICAgIC0gICAgcFNyY0RzdCBpcyBOVUxMIAotICogICAgLSAgICBRUCA8PSAwIG9yIFFQID49MzEgCi0gKiAgICAtICAgIHZpZGVvQ29tcCBpcyBuZWl0aGVyIE9NWF9WQ19MVU1JTkFOQ0Ugbm9yIE9NWF9WQ19DSFJPTUlOQU5DRS4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX1F1YW50SW52SW50cmFfSSAoCi0gICAgT01YX1MxNiAqcFNyY0RzdCwKLSAgICBPTVhfSU5UIFFQLAotICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50IHZpZGVvQ29tcCwKLSAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1F1YW50SW52SW50ZXJfSSAgICg2LjIuNS4zLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyB0aGUgc2Vjb25kIGludmVyc2UgcXVhbnRpemF0aW9uIG1vZGUgb24gYW4gaW50cmEvaW50ZXIgY29kZWQgCi0gKiBibG9jay4gU3VwcG9ydHMgYml0c19wZXJfcGl4ZWwgPSA4LiBUaGUgb3V0cHV0IGNvZWZmaWNpZW50cyBhcmUgY2xpcHBlZCB0byAKLSAqIHRoZSByYW5nZSBbLTIwNDgsIDIwNDddLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgKHF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2s7IG11c3QgYmUgCi0gKiAgICAgICAgICAgIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIChxdWFudGl6ZXJfc2NhbGUpIAotICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSBvZiB0aGUgY3VycmVudCBibG9jay4gVGFrZXMgb25lIG9mIHRoZSAKLSAqICAgICAgICAgICAgZm9sbG93aW5nIGZsYWdzOiBPTVhfVkNfTFVNSU5BTkNFLCBPTVhfVkNfQ0hST01JTkFOQ0UgKGludHJhIAotICogICAgICAgICAgICB2ZXJzaW9uIG9ubHkpLiAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyIAotICogICAgICAgICAgICAoaW50cmEgdmVyc2lvbiBvbmx5KS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBvdXRwdXQgKGRlcXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jayAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBpcyAKLSAqICAgICAgICAgICAgICB0cnVlOiAKLSAqICAgIC0gICAgcFNyY0RzdCBpcyBOVUxMIAotICogICAgLSAgICBRUCA8PSAwIG9yIFFQID49MzEgCi0gKiAgICAtICAgIHZpZGVvQ29tcCBpcyBuZWl0aGVyIE9NWF9WQ19MVU1JTkFOQ0Ugbm9yIE9NWF9WQ19DSFJPTUlOQU5DRS4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX1F1YW50SW52SW50ZXJfSSAoCi0gICAgT01YX1MxNiAqcFNyY0RzdCwKLSAgICBPTVhfSU5UIFFQCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEgICAoNi4yLjUuNC4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogRGVjb2RlcyB0aGUgSU5UUkEgYmxvY2sgY29lZmZpY2llbnRzLiBJbnZlcnNlIHF1YW50aXphdGlvbiwgaW52ZXJzZWx5IAotICogemlnemFnIHBvc2l0aW9uaW5nLCBhbmQgSURDVCwgd2l0aCBhcHByb3ByaWF0ZSBjbGlwcGluZyBvbiBlYWNoIHN0ZXAsIGFyZSAKLSAqIHBlcmZvcm1lZCBvbiB0aGUgY29lZmZpY2llbnRzLiBUaGUgcmVzdWx0cyBhcmUgdGhlbiBwbGFjZWQgaW4gdGhlIG91dHB1dCAKLSAqIGZyYW1lL3BsYW5lIG9uIGEgcGl4ZWwgYmFzaXMuICBOb3RlOiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgdXNlZCBvbmx5IHdoZW4gCi0gKiBhdCBsZWFzdCBvbmUgbm9uLXplcm8gQUMgY29lZmZpY2llbnQgb2YgY3VycmVudCBibG9jayBleGlzdHMgaW4gdGhlIGJpdCAKLSAqIHN0cmVhbS4gVGhlIERDIG9ubHkgY29uZGl0aW9uIHdpbGwgYmUgaGFuZGxlZCBpbiBhbm90aGVyIGZ1bmN0aW9uLiAKLSAqCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCAKLSAqICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4gVGhlcmUgaXMgbm8gYm91bmRhcnkgY2hlY2sgZm9yIHRoZSBiaXQgc3RyZWFtIAotICogICAgICAgICAgICBidWZmZXIuIAotICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgdG8gYnkgCi0gKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluIFswLTddLiAKLSAqICAgc3RlcCAtIHdpZHRoIG9mIHRoZSBkZXN0aW5hdGlvbiBwbGFuZSAKLSAqICAgcENvZWZCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgb24gCi0gKiAgICAgICAgICAgIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBDb2VmQnVmQ29sIC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIAotICogICAgICAgICAgICBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICBjdXJRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIG1hY3JvYmxvY2sgd2hpY2ggdGhlIGN1cnJlbnQgYmxvY2sgCi0gKiAgICAgICAgICAgIGJlbG9uZ3MgdG8gCi0gKiAgIHBRUEJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYnVmZmVyIAotICogICBibG9ja0luZGV4IC0gYmxvY2sgaW5kZXggaW5kaWNhdGluZyB0aGUgY29tcG9uZW50IHR5cGUgYW5kIHBvc2l0aW9uIGFzIAotICogICAgICAgICAgICBkZWZpbmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDYuMS4zLjgsIEZpZ3VyZSA2LTUuIAotICogICBpbnRyYURDVkxDIC0gYSBjb2RlIGRldGVybWluZWQgYnkgaW50cmFfZGNfdmxjX3RociBhbmQgUVAuIFRoaXMgYWxsb3dzIGEgCi0gKiAgICAgICAgICAgIG1lY2hhbmlzbSB0byBzd2l0Y2ggYmV0d2VlbiB0d28gVkxDIGZvciBjb2Rpbmcgb2YgSW50cmEgREMgCi0gKiAgICAgICAgICAgIGNvZWZmaWNpZW50cyBhcyBwZXIgW0lTTzE0NDk2LTJdLCBUYWJsZSA2LTIxLiAKLSAqICAgQUNQcmVkRmxhZyAtIGEgZmxhZyBlcXVhbCB0byBhY19wcmVkX2ZsYWcgKG9mIGx1bWluYW5jZSkgaW5kaWNhdGluZyBpZiAKLSAqICAgICAgICAgICAgdGhlIGFjIGNvZWZmaWNpZW50cyBvZiB0aGUgZmlyc3Qgcm93IG9yIGZpcnN0IGNvbHVtbiBhcmUgCi0gKiAgICAgICAgICAgIGRpZmZlcmVudGlhbGx5IGNvZGVkIGZvciBpbnRyYSBjb2RlZCBtYWNyb2Jsb2NrLiAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCi0gKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyAKLSAqICAgICAgICAgICAgbW9kZSwgYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub24gbGluZWFyIGludHJhIERDIG1vZGUuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkLCBzbyAKLSAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKLSAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBibG9jayBpbiB0aGUgZGVzdGluYXRpb24gcGxhbmU7IG11c3QgYmUgYWxpZ25lZCBvbiAKLSAqICAgICAgICAgICAgYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcENvZWZCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IHJvdyBidWZmZXIuIAotICogICBwQ29lZkJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlciAgTm90ZTogCi0gKiAgICAgICAgICAgIFRoZSBjb2VmZmljaWVudCBidWZmZXJzIG11c3QgYmUgdXBkYXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIAotICogICAgICAgICAgICB1cGRhdGUgcHJvY2VkdXJlIGRlZmluZWQgaW4gc2VjdGlvbiA2LjIuMi4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMsIGlmOgotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcENvZWZCdWZSb3csIHBDb2VmQnVmQ29sLCAKLSAqICAgICAgICAgcFFQQnVmLCBwRHN0LiAKLSAqICAgIC0gICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XSAKLSAqICAgIC0gICAgY3VyUVAgZXhjZWVkcyAoMSwgMzEpCi0gKiAgICAtICAgIGJsb2NrSW5kZXggZXhjZWVkcyBbMCw1XQotICogICAgLSAgICBzdGVwIGlzIG5vdCB0aGUgbXVsdGlwbGUgb2YgOAotICogICAgLSAgICBhIHBvaW50ZXIgYWxpZ25tZW50IHJlcXVpcmVtZW50IHdhcyB2aW9sYXRlZC4gCi0gKiAgICBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvci4gUmVmZXIgdG8gT01YX1N0c19FcnIgb2YgRGVjb2RlVkxDWmlnemFnX0ludHJhLiAgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYSAoCi0gICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICBPTVhfVTggKnBEc3QsCi0gICAgT01YX0lOVCBzdGVwLAotICAgIE9NWF9TMTYgKnBDb2VmQnVmUm93LAotICAgIE9NWF9TMTYgKnBDb2VmQnVmQ29sLAotICAgIE9NWF9VOCBjdXJRUCwKLSAgICBjb25zdCBPTVhfVTggKnBRUEJ1ZiwKLSAgICBPTVhfSU5UIGJsb2NrSW5kZXgsCi0gICAgT01YX0lOVCBpbnRyYURDVkxDLAotICAgIE9NWF9JTlQgQUNQcmVkRmxhZywKLSAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlciAgICg2LjIuNS40LjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBEZWNvZGVzIHRoZSBJTlRFUiBibG9jayBjb2VmZmljaWVudHMuIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW52ZXJzZSAKLSAqIHF1YW50aXphdGlvbiwgaW52ZXJzZSB6aWd6YWcgcG9zaXRpb25pbmcsIGFuZCBJRENUICh3aXRoIGFwcHJvcHJpYXRlIAotICogY2xpcHBpbmcgb24gZWFjaCBzdGVwKSBvbiB0aGUgY29lZmZpY2llbnRzLiBUaGUgcmVzdWx0cyAocmVzaWR1YWxzKSBhcmUgCi0gKiBwbGFjZWQgaW4gYSBjb250aWd1b3VzIGFycmF5IG9mIDY0IGVsZW1lbnRzLiBGb3IgSU5URVIgYmxvY2ssIHRoZSBvdXRwdXQgCi0gKiBidWZmZXIgaG9sZHMgdGhlIHJlc2lkdWFscyBmb3IgZnVydGhlciByZWNvbnN0cnVjdGlvbi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCAKLSAqICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4gVGhlcmUgaXMgbm8gYm91bmRhcnkgY2hlY2sgZm9yIHRoZSBiaXQgc3RyZWFtIAotICogICAgICAgICAgICBidWZmZXIuIAotICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgdG8gYnkgCi0gKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluIFswLTddIAotICogICBRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAotICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgCi0gKiAgICAgICAgICAgIG1vZGUsIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCwgc28gCi0gKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCi0gKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgZGVjb2RlZCByZXNpZHVhbCBidWZmZXIgKGEgY29udGlndW91cyBhcnJheSBvZiA2NCAKLSAqICAgICAgICAgICAgZWxlbWVudHMgb2YgT01YX1MxNiBkYXRhIHR5cGUpOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMsIGlmOgotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOdWxsOiAKLSAqICAgICAgICAgcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCAsIHBEc3QgCi0gKiAgICAtICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10KLSAqICAgIC0gICAgUVAgPD0gMC4gCi0gKiAgICAtICAgIHBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCAKLSAqICAgIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yLiBSZWZlciB0byBPTVhfU3RzX0VyciBvZiBEZWNvZGVWTENaaWd6YWdfSW50ZXIgLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyICgKLSAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgIE9NWF9TMTYgKnBEc3QsCi0gICAgT01YX0lOVCBRUCwKLSAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYSAgICg2LjIuNS40LjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBhZGFwdGl2ZSBEQy9BQyBjb2VmZmljaWVudCBwcmVkaWN0aW9uIGZvciBhbiBpbnRyYSBibG9jay4gIFByaW9yIAotICogdG8gdGhlIGZ1bmN0aW9uIGNhbGwsIHByZWRpY3Rpb24gZGlyZWN0aW9uIChwcmVkRGlyKSBzaG91bGQgYmUgc2VsZWN0ZWQgYXMgCi0gKiBzcGVjaWZpZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy40LjMuMS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucyB0aGUgcXVhbnRpemVkIAotICogICAgICAgICAgICBjb2VmZmljaWVudCByZXNpZHVhbHMgKFBRRikgb2YgdGhlIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgCi0gKiAgICAgICAgICAgIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBUaGUgb3V0cHV0IGNvZWZmaWNpZW50cyBhcmUgCi0gKiAgICAgICAgICAgIHNhdHVyYXRlZCB0byB0aGUgcmFuZ2UgWy0yMDQ4LCAyMDQ3XS4gCi0gKiAgIHBQcmVkQnVmUm93IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIAotICogICAgICAgICAgICBhIDQtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBQcmVkQnVmQ29sIC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIAotICogICAgICAgICAgICBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIGN1clFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgY3VycmVudCBibG9jay4gY3VyUVAgbWF5IGVxdWFsIHRvIAotICogICAgICAgICAgICBwcmVkUVAgZXNwZWNpYWxseSB3aGVuIHRoZSBjdXJyZW50IGJsb2NrIGFuZCB0aGUgcHJlZGljdG9yIGJsb2NrIAotICogICAgICAgICAgICBhcmUgaW4gdGhlIHNhbWUgbWFjcm9ibG9jay4gCi0gKiAgIHByZWRRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIHByZWRpY3RvciBibG9jayAKLSAqICAgcHJlZERpciAtIGluZGljYXRlcyB0aGUgcHJlZGljdGlvbiBkaXJlY3Rpb24gd2hpY2ggdGFrZXMgb25lIG9mIHRoZSAKLSAqICAgICAgICAgICAgZm9sbG93aW5nIHZhbHVlczogT01YX1ZDX0hPUklaT05UQUwgLSBwcmVkaWN0IGhvcml6b250YWxseSAKLSAqICAgICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMIC0gcHJlZGljdCB2ZXJ0aWNhbGx5IAotICogICBBQ1ByZWRGbGFnIC0gYSBmbGFnIGluZGljYXRpbmcgaWYgQUMgcHJlZGljdGlvbiBzaG91bGQgYmUgcGVyZm9ybWVkLiBJdCAKLSAqICAgICAgICAgICAgaXMgZXF1YWwgdG8gYWNfcHJlZF9mbGFnIGluIHRoZSBiaXQgc3RyZWFtIHN5bnRheCBvZiBNUEVHLTQgCi0gKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2Ugb3IgY2hyb21pbmFuY2UpIG9mIHRoZSAKLSAqICAgICAgICAgICAgY3VycmVudCBibG9jayAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucyB0aGUgcXVhbnRpemVkIAotICogICAgICAgICAgICBjb2VmZmljaWVudHMgKFFGKSBvZiB0aGUgY3VycmVudCBibG9jayAKLSAqICAgcFByZWRCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IHJvdyBidWZmZXIgCi0gKiAgIHBQcmVkQnVmQ29sIC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyICBOb3RlOiAKLSAqICAgICAgICAgICAgQnVmZmVyIHVwZGF0ZTogVXBkYXRlIHRoZSBBQyBwcmVkaWN0aW9uIGJ1ZmZlciAoYm90aCByb3cgYW5kIAotICogICAgICAgICAgICBjb2x1bW4gYnVmZmVyKS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMsIGlmOgotICogICAgICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgICAgICBwU3JjRHN0LCBwUHJlZEJ1ZlJvdywgb3IgcFByZWRCdWZDb2wuIAotICogICAgICAgIC0gICAgY3VyUVAgPD0gMCwgCi0gKiAgICAgICAgLSAgICBwcmVkUVAgPD0gMCwgCi0gKiAgICAgICAgLSAgICBjdXJRUCA+MzEsIAotICogICAgICAgIC0gICAgcHJlZFFQID4gMzEsIAotICogICAgICAgIC0gICAgcHJlRGlyIGV4Y2VlZHMgWzEsMl0KLSAqICAgICAgICAtICAgIHBTcmNEc3QsIHBQcmVkQnVmUm93LCBvciBwUHJlZEJ1ZkNvbCBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEgKAotICAgIE9NWF9TMTYgKnBTcmNEc3QsCi0gICAgT01YX1MxNiAqcFByZWRCdWZSb3csCi0gICAgT01YX1MxNiAqcFByZWRCdWZDb2wsCi0gICAgT01YX0lOVCBjdXJRUCwKLSAgICBPTVhfSU5UIHByZWRRUCwKLSAgICBPTVhfSU5UIHByZWREaXIsCi0gICAgT01YX0lOVCBBQ1ByZWRGbGFnLAotICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50IHZpZGVvQ29tcAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfTUNSZWNvbkJsb2NrICAgKDYuMi41LjUuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIG1vdGlvbiBjb21wZW5zYXRpb24gcHJlZGljdGlvbiBmb3IgYW4gOHg4IGJsb2NrIHVzaW5nIAotICogaW50ZXJwb2xhdGlvbiBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjIuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBibG9jayBpbiB0aGUgcmVmZXJlbmNlIHBsYW5lLiAKLSAqICAgc3JjU3RlcCAtIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZSAKLSAqICAgICAgICAgICAgcmVmZXJlbmNlIHBsYW5lLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBkc3RTdGVwIC0gZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnQgb2YgY29uc2VjdXRpdmUgbGluZXMgaW4gdGhlIAotICogICAgICAgICAgICBkZXN0aW5hdGlvbiBwbGFuZSwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgcFNyY1Jlc2lkdWUgLSBwb2ludGVyIHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIDE2LWJpdCBwcmVkaWN0aW9uIAotICogICAgICAgICAgICByZXNpZHVhbHM7IG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiBJZiB0aGUgcG9pbnRlciBpcyBOVUxMLCB0aGVuIAotICogICAgICAgICAgICBubyBwcmVkaWN0aW9uIGlzIGRvbmUsIG9ubHkgbW90aW9uIGNvbXBlbnNhdGlvbiwgaS5lLiwgdGhlIGJsb2NrIAotICogICAgICAgICAgICBpcyBtb3ZlZCB3aXRoIGludGVycG9sYXRpb24uIAotICogICBwcmVkaWN0VHlwZSAtIGJpbGluZWFyIGludGVycG9sYXRpb24gdHlwZSwgYXMgZGVmaW5lZCBpbiBzZWN0aW9uIAotICogICAgICAgICAgICA2LjIuMS4yLiAKLSAqICAgcm5kVmFsIC0gcm91bmRpbmcgY29udHJvbCBwYXJhbWV0ZXI6IDAgLSBkaXNhYmxlZDsgMSAtIGVuYWJsZWQuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIDgtYnl0ZSBhbGlnbmVkLiAgSWYgCi0gKiAgICAgICAgICAgIHByZWRpY3Rpb24gcmVzaWR1YWxzIGFyZSBhZGRlZCB0aGVuIG91dHB1dCBpbnRlbnNpdGllcyBhcmUgCi0gKiAgICAgICAgICAgIGNsaXBwZWQgdG8gdGhlIHJhbmdlIFswLDI1NV0uIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKLSAqICAgIC0gICAgcERzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBwU3JjUmVzaWR1ZSBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjIG9yIHBEc3QuIAotICogICAgLSAgICBlaXRoZXIgc3JjU3RlcCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICogICAgLSAgICBpbnZhbGlkIHR5cGUgc3BlY2lmaWVkIGZvciB0aGUgcGFyYW1ldGVyIHByZWRpY3RUeXBlLiAKLSAqICAgIC0gICAgdGhlIHBhcmFtZXRlciBybmRWYWwgaXMgbm90IGVxdWFsIGVpdGhlciB0byAwIG9yIDEuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9NQ1JlY29uQmxvY2sgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKLSAgICBPTVhfSU5UIHNyY1N0ZXAsCi0gICAgY29uc3QgT01YX1MxNiAqcFNyY1Jlc2lkdWUsCi0gICAgT01YX1U4ICpwRHN0LAotICAgIE9NWF9JTlQgZHN0U3RlcCwKLSAgICBPTVhfSU5UIHByZWRpY3RUeXBlLAotICAgIE9NWF9JTlQgcm5kVmFsCi0pOwotCi0KLQotLyogNi4zLjEuMSBJbnRyYSAxNngxNiBQcmVkaWN0aW9uIE1vZGVzICAqLwotLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIGludHJhXzE2eDE2IG1hY3JvYmxvY2sgcHJlZGljdGlvbiBtb2RlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLwotCi10eXBlZGVmIGVudW0gewotICAgIE9NWF9WQ18xNlgxNl9WRVJUID0gMCwgIC8qKiBJbnRyYV8xNngxNl9WZXJ0aWNhbCAqLwotICAgIE9NWF9WQ18xNlgxNl9IT1IgPSAxLCAgIC8qKiBJbnRyYV8xNngxNl9Ib3Jpem9udGFsICovCi0gICAgT01YX1ZDXzE2WDE2X0RDID0gMiwgICAgLyoqIEludHJhXzE2eDE2X0RDICovCi0gICAgT01YX1ZDXzE2WDE2X1BMQU5FID0gMyAgLyoqIEludHJhXzE2eDE2X1BsYW5lICovIAotfSBPTVhWQ000UDEwSW50cmExNngxNlByZWRNb2RlOwotCi0KLQotLyogNi4zLjEuMiBJbnRyYSA0eDQgUHJlZGljdGlvbiBNb2RlcyAgKi8KLS8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBpbnRyYV80eDQgbWFjcm9ibG9jayBwcmVkaWN0aW9uIG1vZGVzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgT01YX1ZDXzRYNF9WRVJUID0gMCwgICAgIC8qKiBJbnRyYV80eDRfVmVydGljYWwgKi8KLSAgICBPTVhfVkNfNFg0X0hPUiA9IDEsICAgICAgLyoqIEludHJhXzR4NF9Ib3Jpem9udGFsICovCi0gICAgT01YX1ZDXzRYNF9EQyA9IDIsICAgICAgIC8qKiBJbnRyYV80eDRfREMgKi8KLSAgICBPTVhfVkNfNFg0X0RJQUdfREwgPSAzLCAgLyoqIEludHJhXzR4NF9EaWFnb25hbF9Eb3duX0xlZnQgKi8KLSAgICBPTVhfVkNfNFg0X0RJQUdfRFIgPSA0LCAgLyoqIEludHJhXzR4NF9EaWFnb25hbF9Eb3duX1JpZ2h0ICovCi0gICAgT01YX1ZDXzRYNF9WUiA9IDUsICAgICAgIC8qKiBJbnRyYV80eDRfVmVydGljYWxfUmlnaHQgKi8KLSAgICBPTVhfVkNfNFg0X0hEID0gNiwgICAgICAgLyoqIEludHJhXzR4NF9Ib3Jpem9udGFsX0Rvd24gKi8KLSAgICBPTVhfVkNfNFg0X1ZMID0gNywgICAgICAgLyoqIEludHJhXzR4NF9WZXJ0aWNhbF9MZWZ0ICovCi0gICAgT01YX1ZDXzRYNF9IVSA9IDggICAgICAgIC8qKiBJbnRyYV80eDRfSG9yaXpvbnRhbF9VcCAqLyAKLX0gT01YVkNNNFAxMEludHJhNHg0UHJlZE1vZGU7Ci0KLQotCi0vKiA2LjMuMS4zIENocm9tYSBQcmVkaWN0aW9uIE1vZGVzICAqLwotLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIGludHJhIGNocm9tYSBwcmVkaWN0aW9uIG1vZGVzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgT01YX1ZDX0NIUk9NQV9EQyA9IDAsICAgIC8qKiBJbnRyYV9DaHJvbWFfREMgKi8KLSAgICBPTVhfVkNfQ0hST01BX0hPUiA9IDEsICAgLyoqIEludHJhX0Nocm9tYV9Ib3Jpem9udGFsICovCi0gICAgT01YX1ZDX0NIUk9NQV9WRVJUID0gMiwgIC8qKiBJbnRyYV9DaHJvbWFfVmVydGljYWwgKi8KLSAgICBPTVhfVkNfQ0hST01BX1BMQU5FID0gMyAgLyoqIEludHJhX0Nocm9tYV9QbGFuZSAqLyAKLX0gT01YVkNNNFAxMEludHJhQ2hyb21hUHJlZE1vZGU7Ci0KLQotCi0vKiA2LjMuMS40IE1vdGlvbiBFc3RpbWF0aW9uIE1vZGVzICAqLwotLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIEguMjY0IG1vdGlvbiBlc3RpbWF0aW9uIG1vZGVzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgT01YX1ZDX000UDEwX0ZBU1RfU0VBUkNIID0gMCwgLyoqIEZhc3QgbW90aW9uIHNlYXJjaCAqLwotICAgIE9NWF9WQ19NNFAxMF9GVUxMX1NFQVJDSCA9IDEgIC8qKiBGdWxsIG1vdGlvbiBzZWFyY2ggKi8gCi19IE9NWFZDTTRQMTBNRU1vZGU7Ci0KLQotCi0vKiA2LjMuMS41IE1hY3JvYmxvY2sgVHlwZXMgICovCi0vKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgSC4yNjQgbWFjcm9ibG9jayB0eXBlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLwotCi10eXBlZGVmIGVudW0gewotICAgIE9NWF9WQ19QXzE2eDE2ICA9IDAsIC8qIGRlZmluZWQgYnkgW0lTTzE0NDk2LTEwXSAqLwotICAgIE9NWF9WQ19QXzE2eDggID0gMSwKLSAgICBPTVhfVkNfUF84eDE2ICA9IDIsCi0gICAgT01YX1ZDX1BfOHg4ICA9IDMsCi0gICAgT01YX1ZDX1BSRUYwXzh4OCAgPSA0LAotICAgIE9NWF9WQ19JTlRFUl9TS0lQICA9IDUsCi0gICAgT01YX1ZDX0lOVFJBXzR4NCAgPSA4LAotICAgIE9NWF9WQ19JTlRSQV8xNngxNiAgPSA5LAotICAgIE9NWF9WQ19JTlRSQV9QQ00gPSAxMCAKLX0gT01YVkNNNFAxME1hY3JvYmxvY2tUeXBlOwotCi0KLQotLyogNi4zLjEuNiBTdWItTWFjcm9ibG9jayBUeXBlcyAgKi8KLS8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBILjI2NCBzdWItbWFjcm9ibG9jayB0eXBlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLwotCi10eXBlZGVmIGVudW0gewotICAgIE9NWF9WQ19TVUJfUF84eDggPSAwLCAvKiBkZWZpbmVkIGJ5IFtJU08xNDQ5Ni0xMF0gKi8KLSAgICBPTVhfVkNfU1VCX1BfOHg0ID0gMSwKLSAgICBPTVhfVkNfU1VCX1BfNHg4ID0gMiwKLSAgICBPTVhfVkNfU1VCX1BfNHg0ID0gMyAKLX0gT01YVkNNNFAxMFN1Yk1hY3JvYmxvY2tUeXBlOwotCi0KLQotLyogNi4zLjEuNyBWYXJpYWJsZSBMZW5ndGggQ29kaW5nIChWTEMpIEluZm9ybWF0aW9uICAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgT01YX1U4IHVUcmFpbGluZ19PbmVzOyAgICAgIC8qIFRyYWlsaW5nIG9uZXM7IDMgYXQgbW9zdCAqLwotICAgIE9NWF9VOCB1VHJhaWxpbmdfT25lX1NpZ25zOyAvKiBUcmFpbGluZyBvbmVzIHNpZ25hbCAqLwotICAgIE9NWF9VOCB1TnVtQ29lZmZzOyAgICAgICAgICAvKiBUb3RhbCBudW1iZXIgb2Ygbm9uLXplcm8gY29lZnMsIGluY2x1ZGluZyB0cmFpbGluZyBvbmVzICovCi0gICAgT01YX1U4IHVUb3RhbFplcm9zOyAgICAgICAgIC8qIFRvdGFsIG51bWJlciBvZiB6ZXJvIGNvZWZzICovCi0gICAgT01YX1MxNiBpTGV2ZWxzWzE2XTsgICAgICAgIC8qIExldmVscyBvZiBub24temVybyBjb2VmcywgaW4gcmV2ZXJzZSB6aWctemFnIG9yZGVyICovCi0gICAgT01YX1U4IHVSdW5zWzE2XTsgICAgICAgICAgIC8qIFJ1bnMgZm9yIGxldmVscyBhbmQgdHJhaWxpbmcgb25lcywgaW4gcmV2ZXJzZSB6aWctemFnIG9yZGVyICovCi19IE9NWFZDTTRQMTBWTENJbmZvOwotCi0KLQotLyogNi4zLjEuOCBNYWNyb2Jsb2NrIEluZm9ybWF0aW9uICAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgT01YX1MzMiBzbGljZUlkOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2xpY2UgbnVtYmVyICovCi0gICAgT01YVkNNNFAxME1hY3JvYmxvY2tUeXBlIG1iVHlwZTsgICAgICAgICAgLyogTUIgdHlwZSAqLwotICAgIE9NWFZDTTRQMTBTdWJNYWNyb2Jsb2NrVHlwZSBzdWJNQlR5cGVbNF07IC8qIHN1Yi1ibG9jayB0eXBlICovCi0gICAgT01YX1MzMiBxcHk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcXAgZm9yIGx1bWEgKi8KLSAgICBPTVhfUzMyIHFwYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBxcCBmb3IgY2hyb21hICovCi0gICAgT01YX1UzMiBjYnB5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ0JQIEx1bWEgKi8KLSAgICBPTVhfVTMyIGNicGM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDQlAgQ2hyb21hICovCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgcE1WMFs0XVs0XTsgLyogbW90aW9uIHZlY3RvciwgcmVwcmVzZW50ZWQgdXNpbmcgMS80LXBlbCB1bml0cywgcE1WMFtibG9ja3ldW2Jsb2NreF0gKGJsb2NreSA9IDB+MywgYmxvY2t4ID0wfjMpICovCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgcE1WUHJlZFs0XVs0XTsgLyogbW90aW9uIHZlY3RvciBwcmVkaWN0aW9uLCBSZXByZXNlbnRlZCB1c2luZyAxLzQtcGVsIHVuaXRzLCBwTVZQcmVkW2Jsb2NreV1bYmxvY2t4XSAoYmxvY2t5ID0gMH4zLCBibG9ja3ggPSAwfjMpICovCi0gICAgT01YX1U4IHBSZWZMMElkeFs0XTsgICAgICAgICAgICAgICAgICAgICAgLyogcmVmZXJlbmNlIHBpY3R1cmUgaW5kaWNlcyAqLwotICAgIE9NWFZDTTRQMTBJbnRyYTE2eDE2UHJlZE1vZGUgSW50cmExNngxNlByZWRNb2RlOyAvKiBiZXN0IGludHJhIDE2eDE2IHByZWRpY3Rpb24gbW9kZSAqLwotICAgIE9NWFZDTTRQMTBJbnRyYTR4NFByZWRNb2RlIHBJbnRyYTR4NFByZWRNb2RlWzE2XTsgLyogYmVzdCBpbnRyYSA0eDQgcHJlZGljdGlvbiBtb2RlIGZvciBlYWNoIGJsb2NrLCBwTVYwIGluZGV4ZWQgYXMgYWJvdmUgKi8KLX0gT01YVkNNNFAxME1CSW5mbywgKk9NWFZDTTRQMTBNQkluZm9QdHI7Ci0KLQotCi0vKiA2LjMuMS45IE1vdGlvbiBFc3RpbWF0aW9uIFBhcmFtZXRlcnMgICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBPTVhfUzMyIGJsb2NrU3BsaXRFbmFibGU4eDg7IC8qIGVuYWJsZXMgMTZ4OCwgOHgxNiwgOHg4ICovCi0gICAgT01YX1MzMiBibG9ja1NwbGl0RW5hYmxlNHg0OyAvKiBlbmFibGUgc3BsaXR0aW5nIG9mIDh4NCwgNHg4LCA0eDQgYmxvY2tzICovCi0gICAgT01YX1MzMiBoYWxmU2VhcmNoRW5hYmxlOwotICAgIE9NWF9TMzIgcXVhcnRlclNlYXJjaEVuYWJsZTsKLSAgICBPTVhfUzMyIGludHJhRW5hYmxlNHg0OyAgICAgIC8qIDE9ZW5hYmxlLCAwPWRpc2FibGUgKi8KLSAgICBPTVhfUzMyIHNlYXJjaFJhbmdlMTZ4MTY7ICAgIC8qIGludGVnZXIgcGl4ZWwgdW5pdHMgKi8KLSAgICBPTVhfUzMyIHNlYXJjaFJhbmdlOHg4OwotICAgIE9NWF9TMzIgc2VhcmNoUmFuZ2U0eDQ7Ci19IE9NWFZDTTRQMTBNRVBhcmFtczsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQgICAoNi4zLjMuMS4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybSBJbnRyYV80eDQgcHJlZGljdGlvbiBmb3IgbHVtYSBzYW1wbGVzLiBJZiB0aGUgdXBwZXItcmlnaHQgYmxvY2sgaXMgCi0gKiBub3QgYXZhaWxhYmxlLCB0aGVuIGR1cGxpY2F0aW9uIHdvcmsgc2hvdWxkIGJlIGhhbmRsZWQgaW5zaWRlIHRoZSBmdW5jdGlvbi4gCi0gKiBVc2VycyBuZWVkIG5vdCBkZWZpbmUgdGhlbSBvdXRzaWRlLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjTGVmdCAtICBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgNCBsZWZ0IHBpeGVsczogCi0gKiAgICAgICAgICAgICAgICAgIHBbeCwgeV0gKHggPSAtMSwgeSA9IDAuLjMpIAotICogICBwU3JjQWJvdmUgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgOCBhYm92ZSBwaXhlbHM6IAotICogICAgICAgICAgICAgICAgICBwW3gseV0gKHggPSAwLi43LCB5ID0tMSk7IAotICogICAgICAgICAgICAgICBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAotICogICBwU3JjQWJvdmVMZWZ0IC0gUG9pbnRlciB0byB0aGUgYWJvdmUgbGVmdCBwaXhlbHM6IHBbeCx5XSAoeCA9IC0xLCB5ID0gLTEpIAotICogICBsZWZ0U3RlcCAtIFN0ZXAgb2YgbGVmdCBwaXhlbCBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgZHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAotICogICBwcmVkTW9kZSAtIEludHJhXzR4NCBwcmVkaWN0aW9uIG1vZGUuIAotICogICBhdmFpbGFiaWxpdHkgLSBOZWlnaGJvcmluZyA0eDQgYmxvY2sgYXZhaWxhYmlsaXR5IGZsYWcsIHJlZmVyIHRvIAotICogICAgICAgICAgICAgIk5laWdoYm9yaW5nIE1hY3JvYmxvY2sgQXZhaWxhYmlsaXR5IiAuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAotICogICAgSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKLSAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCi0gKiAgICBwRHN0IGlzIE5VTEwuIAotICogICAgZHN0U3RlcCA8IDQsIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgICBsZWZ0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgIHByZWRNb2RlIGlzIG5vdCBpbiB0aGUgdmFsaWQgcmFuZ2Ugb2YgZW51bWVyYXRpb24gCi0gKiAgICAgICAgICAgICAgT01YVkNNNFAxMEludHJhNHg0UHJlZE1vZGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9WRVJULCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19VUFBFUiAKLSAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbeCwtMV0gKHggPSAwLi4zKSBpcyBub3QgYXZhaWxhYmxlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfSE9SLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19MRUZUIAotICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFstMSx5XSAoeSA9IDAuLjMpIGlzIG5vdCBhdmFpbGFibGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9ESUFHX0RMLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAotICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUiBpbmRpY2F0aW5nIHBbeCwgLTFdICh4ID0gMC4uMykgaXMgbm90IGF2YWlsYWJsZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X0RJQUdfRFIsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCi0gKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSX0xFRlQgb3IgT01YX1ZDX1VQUEVSIG9yIE9NWF9WQ19MRUZUIGluZGljYXRpbmcgCi0gKiAgICAgICAgICAgICAgcFt4LC0xXSAoeCA9IDAuLjMpLCBvciBwWy0xLHldICh5ID0gMC4uMykgb3IgcFstMSwtMV0gaXMgbm90IAotICogICAgICAgICAgICAgIGF2YWlsYWJsZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X1ZSLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAotICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUl9MRUZUIG9yIE9NWF9WQ19VUFBFUiBvciBPTVhfVkNfTEVGVCBpbmRpY2F0aW5nIAotICogICAgICAgICAgICAgIHBbeCwtMV0gKHggPSAwLi4zKSwgb3IgcFstMSx5XSAoeSA9IDAuLjMpIG9yIHBbLTEsLTFdIGlzIG5vdCAKLSAqICAgICAgICAgICAgICBhdmFpbGFibGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9IRCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKLSAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVJfTEVGVCBvciBPTVhfVkNfVVBQRVIgb3IgT01YX1ZDX0xFRlQgaW5kaWNhdGluZyAKLSAqICAgICAgICAgICAgICBwW3gsLTFdICh4ID0gMC4uMyksIG9yIHBbLTEseV0gKHkgPSAwLi4zKSBvciBwWy0xLC0xXSBpcyBub3QgCi0gKiAgICAgICAgICAgICAgYXZhaWxhYmxlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfVkwsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX1VQUEVSIAotICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFt4LC0xXSAoeCA9IDAuLjMpIGlzIG5vdCBhdmFpbGFibGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9IVSwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfTEVGVCAKLSAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbLTEseV0gKHkgPSAwLi4zKSBpcyBub3QgYXZhaWxhYmxlLiAKLSAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUiwgYnV0IHBTcmNBYm92ZSBpcyBOVUxMLiAKLSAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19MRUZULCBidXQgcFNyY0xlZnQgaXMgTlVMTC4gCi0gKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVJfTEVGVCwgYnV0IHBTcmNBYm92ZUxlZnQgaXMgTlVMTC4gCi0gKiAgICBlaXRoZXIgcFNyY0Fib3ZlIG9yIHBEc3QgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICAKLSAqCi0gKiBOb3RlOiAKLSAqICAgICBwU3JjQWJvdmUsIHBTcmNBYm92ZSwgcFNyY0Fib3ZlTGVmdCBtYXkgYmUgaW52YWxpZCBwb2ludGVycyBpZiAKLSAqICAgICB0aGV5IGFyZSBub3QgdXNlZCBieSBpbnRyYSBwcmVkaWN0aW9uIGFzIGltcGxpZWQgaW4gcHJlZE1vZGUuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NCAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjTGVmdCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZSwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZUxlZnQsCi0gICAgT01YX1U4ICpwRHN0LAotICAgIE9NWF9JTlQgbGVmdFN0ZXAsCi0gICAgT01YX0lOVCBkc3RTdGVwLAotICAgIE9NWFZDTTRQMTBJbnRyYTR4NFByZWRNb2RlIHByZWRNb2RlLAotICAgIE9NWF9TMzIgYXZhaWxhYmlsaXR5Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2ICAgKDYuMy4zLjEuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm0gSW50cmFfMTZ4MTYgcHJlZGljdGlvbiBmb3IgbHVtYSBzYW1wbGVzLiBJZiB0aGUgdXBwZXItcmlnaHQgYmxvY2sgCi0gKiBpcyBub3QgYXZhaWxhYmxlLCB0aGVuIGR1cGxpY2F0aW9uIHdvcmsgc2hvdWxkIGJlIGhhbmRsZWQgaW5zaWRlIHRoZSAKLSAqIGZ1bmN0aW9uLiBVc2VycyBuZWVkIG5vdCBkZWZpbmUgdGhlbSBvdXRzaWRlLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjTGVmdCAtIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiAxNiBsZWZ0IHBpeGVsczogcFt4LCB5XSAoeCA9IC0xLCB5ID0gCi0gKiAgICAgICAgICAgIDAuLjE1KSAKLSAqICAgcFNyY0Fib3ZlIC0gUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDE2IGFib3ZlIHBpeGVsczogcFt4LHldICh4ID0gMC4uMTUsIAotICogICAgICAgICAgICB5PSAtMSk7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICogICBwU3JjQWJvdmVMZWZ0IC0gUG9pbnRlciB0byB0aGUgYWJvdmUgbGVmdCBwaXhlbHM6IHBbeCx5XSAoeCA9IC0xLCB5ID0gLTEpIAotICogICBsZWZ0U3RlcCAtIFN0ZXAgb2YgbGVmdCBwaXhlbCBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgIGRzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgIHByZWRNb2RlIC0gSW50cmFfMTZ4MTYgcHJlZGljdGlvbiBtb2RlLCBwbGVhc2UgcmVmZXIgdG8gc2VjdGlvbiAzLjQuMS4gCi0gKiAgIGF2YWlsYWJpbGl0eSAtIE5laWdoYm9yaW5nIDE2eDE2IE1CIGF2YWlsYWJpbGl0eSBmbGFnLiBSZWZlciB0byAKLSAqICAgICAgICAgICAgICAgICAgc2VjdGlvbiAzLjQuNC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCi0gKiAgICBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAotICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKLSAqICAgIHBEc3QgaXMgTlVMTC4gCi0gKiAgICBkc3RTdGVwIDwgMTYuIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAotICogICAgbGVmdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAotICogICAgcHJlZE1vZGUgaXMgbm90IGluIHRoZSB2YWxpZCByYW5nZSBvZiBlbnVtZXJhdGlvbiAKLSAqICAgICAgICAgICAgICBPTVhWQ000UDEwSW50cmExNngxNlByZWRNb2RlIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzE2WDE2X1ZFUlQsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCi0gKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSIGluZGljYXRpbmcgcFt4LC0xXSAoeCA9IDAuLjE1KSBpcyBub3QgYXZhaWxhYmxlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ18xNlgxNl9IT1IsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX0xFRlQgCi0gKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwWy0xLHldICh5ID0gMC4uMTUpIGlzIG5vdCBhdmFpbGFibGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzE2WDE2X1BMQU5FLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAotICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUl9MRUZUIG9yIE9NWF9WQ19VUFBFUiBvciBPTVhfVkNfTEVGVCBpbmRpY2F0aW5nIAotICogICAgICAgICAgICAgIHBbeCwtMV0oeCA9IDAuLjE1KSwgb3IgcFstMSx5XSAoeSA9IDAuLjE1KSwgb3IgcFstMSwtMV0gaXMgbm90IAotICogICAgICAgICAgICAgIGF2YWlsYWJsZS4gCi0gKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVIsIGJ1dCBwU3JjQWJvdmUgaXMgTlVMTC4gCi0gKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfTEVGVCwgYnV0IHBTcmNMZWZ0IGlzIE5VTEwuIAotICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSX0xFRlQsIGJ1dCBwU3JjQWJvdmVMZWZ0IGlzIE5VTEwuIAotICogICAgZWl0aGVyIHBTcmNBYm92ZSBvciBwRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIAotICoKLSAqIE5vdGU6IAotICogICAgIHBTcmNBYm92ZSwgcFNyY0Fib3ZlLCBwU3JjQWJvdmVMZWZ0IG1heSBiZSBpbnZhbGlkIHBvaW50ZXJzIGlmIAotICogICAgIHRoZXkgYXJlIG5vdCB1c2VkIGJ5IGludHJhIHByZWRpY3Rpb24gaW1wbGllZCBpbiBwcmVkTW9kZS4gCi0gKiBOb3RlOiAKLSAqICAgICBPTVhfVkNfVVBQRVJfUklHSFQgaXMgbm90IHVzZWQgaW4gaW50cmFfMTZ4MTYgbHVtYSBwcmVkaWN0aW9uLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNiAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjTGVmdCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZSwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZUxlZnQsCi0gICAgT01YX1U4ICpwRHN0LAotICAgIE9NWF9JTlQgbGVmdFN0ZXAsCi0gICAgT01YX0lOVCBkc3RTdGVwLAotICAgIE9NWFZDTTRQMTBJbnRyYTE2eDE2UHJlZE1vZGUgcHJlZE1vZGUsCi0gICAgT01YX1MzMiBhdmFpbGFiaWxpdHkKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4ICAgKDYuMy4zLjEuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGludHJhIHByZWRpY3Rpb24gZm9yIGNocm9tYSBzYW1wbGVzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjTGVmdCAtIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiA4IGxlZnQgcGl4ZWxzOiBwW3gsIHldICh4ID0gLTEsIHk9IAotICogICAgICAgICAgICAwLi43KS4gCi0gKiAgIHBTcmNBYm92ZSAtIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiA4IGFib3ZlIHBpeGVsczogcFt4LHldICh4ID0gMC4uNywgeSAKLSAqICAgICAgICAgICAgPSAtMSk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICBwU3JjQWJvdmVMZWZ0IC0gUG9pbnRlciB0byB0aGUgYWJvdmUgbGVmdCBwaXhlbHM6IHBbeCx5XSAoeCA9IC0xLCB5ID0gLTEpIAotICogICBsZWZ0U3RlcCAtIFN0ZXAgb2YgbGVmdCBwaXhlbCBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgZHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBwcmVkTW9kZSAtIEludHJhIGNocm9tYSBwcmVkaWN0aW9uIG1vZGUsIHBsZWFzZSByZWZlciB0byBzZWN0aW9uIDMuNC4zLiAKLSAqICAgYXZhaWxhYmlsaXR5IC0gTmVpZ2hib3JpbmcgY2hyb21hIGJsb2NrIGF2YWlsYWJpbGl0eSBmbGFnLCBwbGVhc2UgcmVmZXIgCi0gKiAgICAgICAgICAgIHRvICAiTmVpZ2hib3JpbmcgTWFjcm9ibG9jayBBdmFpbGFiaWxpdHkiLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCi0gKiAgICBJZiBhbnkgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAotICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKLSAqICAgIHBEc3QgaXMgTlVMTC4gCi0gKiAgICBkc3RTdGVwIDwgOCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICogICAgbGVmdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgICBwcmVkTW9kZSBpcyBub3QgaW4gdGhlIHZhbGlkIHJhbmdlIG9mIGVudW1lcmF0aW9uIAotICogICAgICAgICAgICAgIE9NWFZDTTRQMTBJbnRyYUNocm9tYVByZWRNb2RlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ19DSFJPTUFfVkVSVCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKLSAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVIgaW5kaWNhdGluZyBwW3gsLTFdICh4ID0gMC4uNykgaXMgbm90IGF2YWlsYWJsZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfQ0hST01BX0hPUiwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfTEVGVCAKLSAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbLTEseV0gKHkgPSAwLi43KSBpcyBub3QgYXZhaWxhYmxlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ19DSFJPTUFfUExBTkUsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCi0gKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSX0xFRlQgb3IgT01YX1ZDX1VQUEVSIG9yIE9NWF9WQ19MRUZUIGluZGljYXRpbmcgCi0gKiAgICAgICAgICAgICAgcFt4LC0xXSh4ID0gMC4uNyksIG9yIHBbLTEseV0gKHkgPSAwLi43KSwgb3IgcFstMSwtMV0gaXMgbm90IAotICogICAgICAgICAgICAgIGF2YWlsYWJsZS4gCi0gKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVIsIGJ1dCBwU3JjQWJvdmUgaXMgTlVMTC4gCi0gKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfTEVGVCwgYnV0IHBTcmNMZWZ0IGlzIE5VTEwuIAotICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSX0xFRlQsIGJ1dCBwU3JjQWJvdmVMZWZ0IGlzIE5VTEwuIAotICogICAgZWl0aGVyIHBTcmNBYm92ZSBvciBwRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5LiAgCi0gKgotICogIE5vdGU6IHBTcmNBYm92ZSwgcFNyY0Fib3ZlLCBwU3JjQWJvdmVMZWZ0IG1heSBiZSBpbnZhbGlkIHBvaW50ZXIgaWYgCi0gKiAgdGhleSBhcmUgbm90IHVzZWQgYnkgaW50cmEgcHJlZGljdGlvbiBpbXBsaWVkIGluIHByZWRNb2RlLiAKLSAqCi0gKiAgTm90ZTogT01YX1ZDX1VQUEVSX1JJR0hUIGlzIG5vdCB1c2VkIGluIGludHJhIGNocm9tYSBwcmVkaWN0aW9uLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDggKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0xlZnQsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmUsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmVMZWZ0LAotICAgIE9NWF9VOCAqcERzdCwKLSAgICBPTVhfSU5UIGxlZnRTdGVwLAotICAgIE9NWF9JTlQgZHN0U3RlcCwKLSAgICBPTVhWQ000UDEwSW50cmFDaHJvbWFQcmVkTW9kZSBwcmVkTW9kZSwKLSAgICBPTVhfUzMyIGF2YWlsYWJpbGl0eQotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYSAgICg2LjMuMy4yLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBxdWFydGVyLXBpeGVsIGludGVycG9sYXRpb24gZm9yIGludGVyIGx1bWEgTUIuIEl0IGlzIGFzc3VtZWQgdGhhdCAKLSAqIHRoZSBmcmFtZSBpcyBhbHJlYWR5IHBhZGRlZCB3aGVuIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIHNvdXJjZSByZWZlcmVuY2UgZnJhbWUgYnVmZmVyIAotICogICBzcmNTdGVwIC0gcmVmZXJlbmNlIGZyYW1lIHN0ZXAsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2Ygcm9pLndpZHRoIAotICogICBkc3RTdGVwIC0gZGVzdGluYXRpb24gZnJhbWUgc3RlcCwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAKLSAqICAgICAgICAgICAgcm9pLndpZHRoIAotICogICBkeCAtIEZyYWN0aW9uYWwgcGFydCBvZiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgY29tcG9uZW50IGluIDEvNCBwaXhlbCAKLSAqICAgICAgICAgICAgdW5pdDsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDNdIAotICogICBkeSAtIEZyYWN0aW9uYWwgcGFydCBvZiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIHkgY29tcG9uZW50IGluIDEvNCBwaXhlbCAKLSAqICAgICAgICAgICAgdW5pdDsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDNdIAotICogICByb2kgLSBEaW1lbnNpb24gb2YgdGhlIGludGVycG9sYXRpb24gcmVnaW9uOyB0aGUgcGFyYW1ldGVycyByb2kud2lkdGggYW5kIAotICogICAgICAgICAgICByb2kuaGVpZ2h0IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGZyYW1lIGJ1ZmZlcjogCi0gKiAgICAgICAgICBpZiByb2kud2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAotICogICAgICAgICAgaWYgcm9pLndpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKLSAqICAgICAgICAgIGlmIHJvaS53aWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCi0gKiAgICBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAotICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKLSAqICAgIHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKLSAqICAgIHNyY1N0ZXAgb3IgZHN0U3RlcCA8IHJvaS53aWR0aC4gCi0gKiAgICBkeCBvciBkeSBpcyBvdXQgb2YgcmFuZ2UgWzAsM10uIAotICogICAgcm9pLndpZHRoIG9yIHJvaS5oZWlnaHQgaXMgb3V0IG9mIHJhbmdlIHs0LCA4LCAxNn0uIAotICogICAgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDQsIGJ1dCBwRHN0IGlzIG5vdCA0IGJ5dGUgYWxpZ25lZC4gCi0gKiAgICByb2kud2lkdGggaXMgZXF1YWwgdG8gOCBvciAxNiwgYnV0IHBEc3QgaXMgbm90IDggYnl0ZSBhbGlnbmVkLiAKLSAqICAgIHNyY1N0ZXAgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYSAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjLAotICAgIE9NWF9TMzIgc3JjU3RlcCwKLSAgICBPTVhfVTggKnBEc3QsCi0gICAgT01YX1MzMiBkc3RTdGVwLAotICAgIE9NWF9TMzIgZHgsCi0gICAgT01YX1MzMiBkeSwKLSAgICBPTVhTaXplIHJvaQotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hICAgKDYuMy4zLjIuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIDEvOC1waXhlbCBpbnRlcnBvbGF0aW9uIGZvciBpbnRlciBjaHJvbWEgTUIuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLVBvaW50ZXIgdG8gdGhlIHNvdXJjZSByZWZlcmVuY2UgZnJhbWUgYnVmZmVyIAotICogICBzcmNTdGVwIC1SZWZlcmVuY2UgZnJhbWUgc3RlcCBpbiBieXRlcyAKLSAqICAgZHN0U3RlcCAtRGVzdGluYXRpb24gZnJhbWUgc3RlcCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIAotICogICAgICAgICAgICByb2kud2lkdGguIAotICogICBkeCAtRnJhY3Rpb25hbCBwYXJ0IG9mIGhvcml6b250YWwgbW90aW9uIHZlY3RvciBjb21wb25lbnQgaW4gMS84IHBpeGVsIAotICogICAgICAgICAgICB1bml0OyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsN10gCi0gKiAgIGR5IC1GcmFjdGlvbmFsIHBhcnQgb2YgdmVydGljYWwgbW90aW9uIHZlY3RvciBjb21wb25lbnQgaW4gMS84IHBpeGVsIAotICogICAgICAgICAgICB1bml0OyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsN10gCi0gKiAgIHJvaSAtRGltZW5zaW9uIG9mIHRoZSBpbnRlcnBvbGF0aW9uIHJlZ2lvbjsgdGhlIHBhcmFtZXRlcnMgcm9pLndpZHRoIGFuZCAKLSAqICAgICAgICAgICAgcm9pLmhlaWdodCBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciAyLCA0LCBvciA4LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gZnJhbWUgYnVmZmVyOgotICogICAgICAgICBpZiByb2kud2lkdGg9PTIsICAyLWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAotICogICAgICAgICBpZiByb2kud2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAotICogICAgICAgICBpZiByb2kud2lkdGg9PTgsIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKLSAqICAgIElmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCi0gKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAotICogICAgcFNyYyBvciBwRHN0IGlzIE5VTEwuIAotICogICAgc3JjU3RlcCBvciBkc3RTdGVwIDwgOC4gCi0gKiAgICBkeCBvciBkeSBpcyBvdXQgb2YgcmFuZ2UgWzAtN10uIAotICogICAgcm9pLndpZHRoIG9yIHJvaS5oZWlnaHQgaXMgb3V0IG9mIHJhbmdlIHsyLDQsOH0uIAotICogICAgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDIsIGJ1dCBwRHN0IGlzIG5vdCAyLWJ5dGUgYWxpZ25lZC4gCi0gKiAgICByb2kud2lkdGggaXMgZXF1YWwgdG8gNCwgYnV0IHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIHJvaS53aWR0aCBpcyBlcXVhbCB0byA4LCBidXQgcERzdCBpcyBub3QgOCBieXRlIGFsaWduZWQuIAotICogICAgc3JjU3RlcCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKLSAgICBPTVhfUzMyIHNyY1N0ZXAsCi0gICAgT01YX1U4ICpwRHN0LAotICAgIE9NWF9TMzIgZHN0U3RlcCwKLSAgICBPTVhfUzMyIGR4LAotICAgIE9NWF9TMzIgZHksCi0gICAgT01YU2l6ZSByb2kKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0kgICAoNi4zLjMuMy4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgaW4tcGxhY2UgZGVibG9jayBmaWx0ZXJpbmcgb24gZm91ciB2ZXJ0aWNhbCBlZGdlcyBvZiB0aGUgbHVtYSAKLSAqIG1hY3JvYmxvY2sgKDE2eDE2KS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqICAgc3JjZHN0U3RlcCAtU3RlcCBvZiB0aGUgYXJyYXlzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAotICogICBwQWxwaGEgLUFycmF5IG9mIHNpemUgMiBvZiBhbHBoYSB0aHJlc2hvbGRzICh0aGUgZmlyc3QgaXRlbSBpcyB0aGUgYWxwaGEgCi0gKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gaXMgCi0gKiAgICAgICAgICAgIGZvciB0aGUgaW50ZXJuYWwgdmVydGljYWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGFscGhhIHZhbHVlcyAKLSAqICAgICAgICAgICAgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjU1XS4gCi0gKiAgIHBCZXRhIC1BcnJheSBvZiBzaXplIDIgb2YgYmV0YSB0aHJlc2hvbGRzICh0aGUgZmlyc3QgaXRlbSBpcyB0aGUgYmV0YSAKLSAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgYW5kIHRoZSBzZWNvbmQgaXRlbSBpcyAKLSAqICAgICAgICAgICAgZm9yIHRoZSBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlKTsgcGVyIFtJU08xNDQ5Ni0xMF0gYmV0YSB2YWx1ZXMgCi0gKiAgICAgICAgICAgIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDE4XS4gCi0gKiAgIHBUaHJlc2hvbGRzIC1BcnJheSBvZiBzaXplIDE2IG9mIFRocmVzaG9sZHMgKFRDMCkgKHZhbHVlcyBmb3IgdGhlIGxlZnQgCi0gKiAgICAgICAgICAgIGVkZ2Ugb2YgZWFjaCA0eDQgYmxvY2ssIGFycmFuZ2VkIGluIHZlcnRpY2FsIGJsb2NrIG9yZGVyKTsgbXVzdCAKLSAqICAgICAgICAgICAgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4uICBQZXIgW0lTTzE0NDk2LTEwXSB2YWx1ZXMgbXVzdCAKLSAqICAgICAgICAgICAgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCi0gKiAgIHBCUyAtQXJyYXkgb2Ygc2l6ZSAxNiBvZiBCUyBwYXJhbWV0ZXJzIChhcnJhbmdlZCBpbiB2ZXJ0aWNhbCBibG9jayAKLSAqICAgICAgICAgICAgb3JkZXIpOyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSAKLSAqICAgICAgICAgICAgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4zXT09IDQuICBNdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtUG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKLSAqICAgIElmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCi0gKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAotICogICAgRWl0aGVyIG9mIHRoZSBwb2ludGVycyBpbiBwU3JjRHN0LCBwQWxwaGEsIHBCZXRhLCBwVGhyZXNob2xkcywgb3IgcEJTIAotICogICAgICAgICAgICAgIGlzIE5VTEwuIAotICogICAgRWl0aGVyIHBUaHJlc2hvbGRzIG9yIHBCUyBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gCi0gKiAgICBwU3JjRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAotICogICAgc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgICBwQWxwaGFbMF0gYW5kL29yIHBBbHBoYVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwyNTVdLiAKLSAqICAgIHBCZXRhWzBdIGFuZC9vciBwQmV0YVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwxOF0uIAotICogICAgT25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uMTVdaXMgb3V0c2lkZSBvZiB0aGUgCi0gKiAgICAgICAgICAgICAgcmFuZ2UgWzAsMjVdLiAKLSAqICAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAgICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIChwQlNbaV09PTQgJiYgCi0gKiAgICAgICAgICAgICAgcEJTW2leM10hPTQpIGZvciAwPD1pPD0zLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSSAoCi0gICAgT01YX1U4ICpwU3JjRHN0LAotICAgIE9NWF9TMzIgc3JjZHN0U3RlcCwKLSAgICBjb25zdCBPTVhfVTggKnBBbHBoYSwKLSAgICBjb25zdCBPTVhfVTggKnBCZXRhLAotICAgIGNvbnN0IE9NWF9VOCAqcFRocmVzaG9sZHMsCi0gICAgY29uc3QgT01YX1U4ICpwQlMKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0kgICAoNi4zLjMuMy4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgaW4tcGxhY2UgZGVibG9jayBmaWx0ZXJpbmcgb24gZm91ciBob3Jpem9udGFsIGVkZ2VzIG9mIHRoZSBsdW1hIAotICogbWFjcm9ibG9jayAoMTZ4MTYpLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIAotICogICBzcmNkc3RTdGVwIC0gc3RlcCBvZiB0aGUgYXJyYXlzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAotICogICBwQWxwaGEgLSBhcnJheSBvZiBzaXplIDIgb2YgYWxwaGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGFscGhhIAotICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIAotICogICAgICAgICAgICBmb3IgdGhlIGludGVybmFsIGhvcml6b250YWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGFscGhhIAotICogICAgICAgICAgICB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjU1XS4gCi0gKiAgIHBCZXRhIC0gYXJyYXkgb2Ygc2l6ZSAyIG9mIGJldGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGJldGEgCi0gKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIGhvcml6b250YWwgZWRnZSwgYW5kIHRoZSBzZWNvbmQgaXRlbSAKLSAqICAgICAgICAgICAgaXMgZm9yIHRoZSBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UpLiBQZXIgW0lTTzE0NDk2LTEwXSBiZXRhIAotICogICAgICAgICAgICB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMThdLiAKLSAqICAgcFRocmVzaG9sZHMgLSBhcnJheSBvZiBzaXplIDE2IGNvbnRhaW5pbmcgdGhyZXNob2xkcywgVEMwLCBmb3IgdGhlIHRvcCAKLSAqICAgICAgICAgICAgaG9yaXpvbnRhbCBlZGdlIG9mIGVhY2ggNHg0IGJsb2NrLCBhcnJhbmdlZCBpbiBob3Jpem9udGFsIGJsb2NrIAotICogICAgICAgICAgICBvcmRlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgUGVyIFtJU08xNDQ5NiAxMF0gCi0gKiAgICAgICAgICAgIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNV0uIAotICogICBwQlMgLSBhcnJheSBvZiBzaXplIDE2IG9mIEJTIHBhcmFtZXRlcnMgKGFycmFuZ2VkIGluIGhvcml6b250YWwgYmxvY2sgCi0gKiAgICAgICAgICAgIG9yZGVyKTsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgCi0gKiAgICAgICAgICAgIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leM109PSA0LiAgTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLVBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqIAotICogICAgT01YX1N0c19CYWRBcmdFcnIsIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0RzdCwgcEFscGhhLCAKLSAqICAgICAgICAgICAgICBwQmV0YSwgcFRocmVzaG9sZHMsIG9yIHBCUy4gCi0gKiAgICAtICAgIGVpdGhlciBwVGhyZXNob2xkcyBvciBwQlMgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAotICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgIC0gICAgcEFscGhhWzBdIGFuZC9vciBwQWxwaGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMjU1XS4gCi0gKiAgICAtICAgIHBCZXRhWzBdIGFuZC9vciBwQmV0YVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwxOF0uIAotICogICAgLSAgICBPbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwVGhyZXNob2xkc1swLi4xNV0gaXMgCi0gKiAgICAgICAgIG91dHNpZGUgb2YgdGhlIHJhbmdlIFswLDI1XS4gCi0gKiAgICAtICAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAgICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIAotICogICAgICAgICAgICAgIChwQlNbaV09PTQgJiYgcEJTW2leM10hPTQpIGZvciAwPD1pPD0zLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSSAoCi0gICAgT01YX1U4ICpwU3JjRHN0LAotICAgIE9NWF9TMzIgc3JjZHN0U3RlcCwKLSAgICBjb25zdCBPTVhfVTggKnBBbHBoYSwKLSAgICBjb25zdCBPTVhfVTggKnBCZXRhLAotICAgIGNvbnN0IE9NWF9VOCAqcFRocmVzaG9sZHMsCi0gICAgY29uc3QgT01YX1U4ICpwQlMKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSSAgICg2LjMuMy4zLjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NrIGZpbHRlcmluZyBvbiBmb3VyIHZlcnRpY2FsIGVkZ2VzIG9mIHRoZSBjaHJvbWEgCi0gKiBtYWNyb2Jsb2NrICg4eDgpLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4gCi0gKiAgIHNyY2RzdFN0ZXAgLSBTdGVwIG9mIHRoZSBhcnJheXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgcEFscGhhIC0gQXJyYXkgb2Ygc2l6ZSAyIG9mIGFscGhhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIGFscGhhIAotICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gaXMgZm9yIAotICogICAgICAgICAgICBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlKTsgcGVyIFtJU08xNDQ5Ni0xMF0gYWxwaGEgdmFsdWVzIG11c3QgYmUgCi0gKiAgICAgICAgICAgIGluIHRoZSByYW5nZSBbMCwyNTVdLiAKLSAqICAgcEJldGEgLSBBcnJheSBvZiBzaXplIDIgb2YgYmV0YSB0aHJlc2hvbGRzICh0aGUgZmlyc3QgaXRlbSBpcyB0aGUgYmV0YSAKLSAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgYW5kIHRoZSBzZWNvbmQgaXRlbSBpcyAKLSAqICAgICAgICAgICAgZm9yIHRoZSBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlKTsgcGVyIFtJU08xNDQ5Ni0xMF0gYmV0YSB2YWx1ZXMgCi0gKiAgICAgICAgICAgIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDE4XS4gCi0gKiAgIHBUaHJlc2hvbGRzIC0gQXJyYXkgb2Ygc2l6ZSA4IGNvbnRhaW5pbmcgdGhyZXNob2xkcywgVEMwLCBmb3IgdGhlIGxlZnQgCi0gKiAgICAgICAgICAgIHZlcnRpY2FsIGVkZ2Ugb2YgZWFjaCA0eDIgY2hyb21hIGJsb2NrLCBhcnJhbmdlZCBpbiB2ZXJ0aWNhbCAKLSAqICAgICAgICAgICAgYmxvY2sgb3JkZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIFBlciAKLSAqICAgICAgICAgICAgW0lTTzE0NDk2LTEwXSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjVdLiAKLSAqICAgcEJTIC0gQXJyYXkgb2Ygc2l6ZSAxNiBvZiBCUyBwYXJhbWV0ZXJzICh2YWx1ZXMgZm9yIGVhY2ggMngyIGNocm9tYSAKLSAqICAgICAgICAgICAgYmxvY2ssIGFycmFuZ2VkIGluIHZlcnRpY2FsIGJsb2NrIG9yZGVyKS4gVGhpcyBwYXJhbWV0ZXIgaXMgdGhlIAotICogICAgICAgICAgICBzYW1lIGFzIHRoZSBwQlMgcGFyYW1ldGVyIHBhc3NlZCBpbnRvIEZpbHRlckRlYmxvY2tMdW1hX1ZlckVkZ2U7IAotICogICAgICAgICAgICB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczogaSkgCi0gKiAgICAgICAgICAgIHBCU1tpXT09IDQgbWF5IG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSBwQlNbaV09PSA0IGlmIGFuZCAKLSAqICAgICAgICAgICAgb25seSBpZiBwQlNbaV4zXT09IDQuICBNdXN0IGJlIDQgYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtUG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0RzdCwgcEFscGhhLCAKLSAqICAgICAgICAgICAgICBwQmV0YSwgcFRocmVzaG9sZHMsIG9yIHBCUy4gCi0gKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgIC0gICAgcFRocmVzaG9sZHMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgcEFscGhhWzBdIGFuZC9vciBwQWxwaGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMjU1XS4gCi0gKiAgICAtICAgIHBCZXRhWzBdIGFuZC9vciBwQmV0YVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwxOF0uIAotICogICAgLSAgICBPbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwVGhyZXNob2xkc1swLi43XSBpcyBvdXRzaWRlIAotICogICAgICAgICBvZiB0aGUgcmFuZ2UgWzAsMjVdLiAKLSAqICAgIC0gICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIAotICogICAgICAgICAocEJTW2ldPT00ICYmIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4gCi0gKiAgICAtICAgIHBCUyBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0kgKAotICAgIE9NWF9VOCAqcFNyY0RzdCwKLSAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCi0gICAgY29uc3QgT01YX1U4ICpwQWxwaGEsCi0gICAgY29uc3QgT01YX1U4ICpwQmV0YSwKLSAgICBjb25zdCBPTVhfVTggKnBUaHJlc2hvbGRzLAotICAgIGNvbnN0IE9NWF9VOCAqcEJTCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0kgICAoNi4zLjMuMy40KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgaW4tcGxhY2UgZGVibG9jayBmaWx0ZXJpbmcgb24gdGhlIGhvcml6b250YWwgZWRnZXMgb2YgdGhlIGNocm9tYSAKLSAqIG1hY3JvYmxvY2sgKDh4OCkuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgc3JjZHN0U3RlcCAtIGFycmF5IHN0ZXA7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgcEFscGhhIC0gYXJyYXkgb2Ygc2l6ZSAyIGNvbnRhaW5pbmcgYWxwaGEgdGhyZXNob2xkczsgdGhlIGZpcnN0IGVsZW1lbnQgCi0gKiAgICAgICAgICAgIGNvbnRhaW5zIHRoZSB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCBob3Jpem9udGFsIGVkZ2UsIGFuZCB0aGUgCi0gKiAgICAgICAgICAgIHNlY29uZCBlbGVtZW50IGNvbnRhaW5zIHRoZSB0aHJlc2hvbGQgZm9yIGludGVybmFsIGhvcml6b250YWwgCi0gKiAgICAgICAgICAgIGVkZ2UuICBQZXIgW0lTTzE0NDk2LTEwXSBhbHBoYSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgCi0gKiAgICAgICAgICAgIFswLDI1NV0uIAotICogICBwQmV0YSAtIGFycmF5IG9mIHNpemUgMiBjb250YWluaW5nIGJldGEgdGhyZXNob2xkczsgdGhlIGZpcnN0IGVsZW1lbnQgCi0gKiAgICAgICAgICAgIGNvbnRhaW5zIHRoZSB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCBob3Jpem9udGFsIGVkZ2UsIGFuZCB0aGUgCi0gKiAgICAgICAgICAgIHNlY29uZCBlbGVtZW50IGNvbnRhaW5zIHRoZSB0aHJlc2hvbGQgZm9yIHRoZSBpbnRlcm5hbCAKLSAqICAgICAgICAgICAgaG9yaXpvbnRhbCBlZGdlLiAgUGVyIFtJU08xNDQ5Ni0xMF0gYmV0YSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJhbmdlIFswLDE4XS4gCi0gKiAgIHBUaHJlc2hvbGRzIC0gYXJyYXkgb2Ygc2l6ZSA4IGNvbnRhaW5pbmcgdGhyZXNob2xkcywgVEMwLCBmb3IgdGhlIHRvcCAKLSAqICAgICAgICAgICAgaG9yaXpvbnRhbCBlZGdlIG9mIGVhY2ggMng0IGNocm9tYSBibG9jaywgYXJyYW5nZWQgaW4gaG9yaXpvbnRhbCAKLSAqICAgICAgICAgICAgYmxvY2sgb3JkZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIFBlciAKLSAqICAgICAgICAgICAgW0lTTzE0NDk2LTEwXSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjVdLiAKLSAqICAgcEJTIC0gYXJyYXkgb2Ygc2l6ZSAxNiBjb250YWluaW5nIEJTIHBhcmFtZXRlcnMgZm9yIGVhY2ggMngyIGNocm9tYSAKLSAqICAgICAgICAgICAgYmxvY2ssIGFycmFuZ2VkIGluIGhvcml6b250YWwgYmxvY2sgb3JkZXI7IHZhbGlkIGluIHRoZSByYW5nZSAKLSAqICAgICAgICAgICAgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgb2NjdXIgCi0gKiAgICAgICAgICAgIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjNdPT0gNC4gCi0gKiAgICAgICAgICAgIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC1Qb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyLCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBhbnkgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcFNyY0RzdCwgcEFscGhhLCBwQmV0YSwgcFRocmVzaG9sZHMsIG9yIHBCUy4gCi0gKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgIC0gICAgcFRocmVzaG9sZHMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgcEFscGhhWzBdIGFuZC9vciBwQWxwaGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMjU1XS4gCi0gKiAgICAtICAgIHBCZXRhWzBdIGFuZC9vciBwQmV0YVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwxOF0uIAotICogICAgLSAgICBPbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwVGhyZXNob2xkc1swLi43XSBpcyBvdXRzaWRlIAotICogICAgICAgICBvZiB0aGUgcmFuZ2UgWzAsMjVdLiAKLSAqICAgIC0gICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgICAgICAgICAgICBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCBmb3IgaT49NCwgb3IgCi0gKiAgICAgICAgICAgICAgKHBCU1tpXT09NCAmJiBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuCi0gKiAgICAtICAgIHBCUyBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0kgKAotICAgIE9NWF9VOCAqcFNyY0RzdCwKLSAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCi0gICAgY29uc3QgT01YX1U4ICpwQWxwaGEsCi0gICAgY29uc3QgT01YX1U4ICpwQmV0YSwKLSAgICBjb25zdCBPTVhfVTggKnBUaHJlc2hvbGRzLAotICAgIGNvbnN0IE9NWF9VOCAqcEJTCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRGVibG9ja0x1bWFfSSAgICg2LjMuMy4zLjUpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2sgZmlsdGVyaW5nIHRoZSBob3Jpem9udGFsIGFuZCAKLSAqIHZlcnRpY2FsIGVkZ2VzIG9mIGEgbHVtYSBtYWNyb2Jsb2NrICgxNngxNikuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gCi0gKiAgIHNyY2RzdFN0ZXAgLSBpbWFnZSB3aWR0aDsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgcEFscGhhIC0gcG9pbnRlciB0byBhIDJ4MiB0YWJsZSBvZiBhbHBoYSB0aHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgCi0gKiAgICAgICAgICAgIGZvbGxvd3M6IHtleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCAKLSAqICAgICAgICAgICAgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfS4gIFBlciAKLSAqICAgICAgICAgICAgW0lTTzE0NDk2LTEwXSBhbHBoYSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjU1XS4gCi0gKiAgIHBCZXRhIC0gcG9pbnRlciB0byBhIDJ4MiB0YWJsZSBvZiBiZXRhIHRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyBmb2xsb3dzOiAKLSAqICAgICAgICAgICAge2V4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsIHZlcnRpY2FsIGVkZ2UsIGV4dGVybmFsIAotICogICAgICAgICAgICBob3Jpem9udGFsIGVkZ2UsIGludGVybmFsIGhvcml6b250YWwgZWRnZSB9LiAgUGVyIFtJU08xNDQ5Ni0xMF0gCi0gKiAgICAgICAgICAgIGJldGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDE4XS4gCi0gKiAgIHBUaHJlc2hvbGRzIC0gcG9pbnRlciB0byBhIDE2eDIgdGFibGUgb2YgdGhyZXNob2xkIChUQzApLCBvcmdhbml6ZWQgYXMgCi0gKiAgICAgICAgICAgIGZvbGxvd3M6IHt2YWx1ZXMgZm9yIHRoZSBsZWZ0IG9yIGFib3ZlIGVkZ2Ugb2YgZWFjaCA0eDQgYmxvY2ssIAotICogICAgICAgICAgICBhcnJhbmdlZCBpbiB2ZXJ0aWNhbCBibG9jayBvcmRlciBhbmQgdGhlbiBpbiBob3Jpem9udGFsIGJsb2NrIAotICogICAgICAgICAgICBvcmRlcn07IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIFBlciBbSVNPMTQ0OTYtMTBdIAotICogICAgICAgICAgICB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjVdLiAKLSAqICAgcEJTIC0gcG9pbnRlciB0byBhIDE2eDIgdGFibGUgb2YgQlMgcGFyYW1ldGVycyBhcnJhbmdlZCBpbiBzY2FuIGJsb2NrIAotICogICAgICAgICAgICBvcmRlciBmb3IgdmVydGljYWwgZWRnZXMgYW5kIHRoZW4gaG9yaXpvbnRhbCBlZGdlczsgdmFsaWQgaW4gdGhlIAotICogICAgICAgICAgICByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSAKLSAqICAgICAgICAgICAgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leM109PSAKLSAqICAgICAgICAgICAgNC4gTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cyAKLSAqICAgIC0gICAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0RzdCwgcEFscGhhLCAKLSAqICAgICAgICAgICAgICBwQmV0YSwgcFRocmVzaG9sZHMgb3IgcEJTLiAKLSAqICAgIC0gICAgcFNyY0RzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgZWl0aGVyIHBUaHJlc2hvbGRzIG9yIHBCUyBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gCi0gKiAgICAtICAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBBbHBoYVswLi4zXSBpcyBvdXRzaWRlIHRoZSByYW5nZSAKLSAqICAgICAgICAgICAgICBbMCwyNTVdLiAKLSAqICAgIC0gICAgb25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcEJldGFbMC4uM10gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgCi0gKiAgICAgICAgICAgICAgWzAsMThdLiAKLSAqICAgIC0gICAgb25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uMzFdaXMgb3V0c2lkZSBvZiAKLSAqICAgICAgICAgICAgICB0aGUgcmFuZ2UgWzAsMjVdLiAKLSAqICAgIC0gICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgICAgICAgICAgICBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCBmb3IgaT49NCwgb3IgCi0gKiAgICAgICAgICAgICAocEJTW2ldPT00ICYmIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4gCi0gKiAgICAtICAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfRGVibG9ja0x1bWFfSSAoCi0gICAgT01YX1U4ICpwU3JjRHN0LAotICAgIE9NWF9TMzIgc3JjZHN0U3RlcCwKLSAgICBjb25zdCBPTVhfVTggKnBBbHBoYSwKLSAgICBjb25zdCBPTVhfVTggKnBCZXRhLAotICAgIGNvbnN0IE9NWF9VOCAqcFRocmVzaG9sZHMsCi0gICAgY29uc3QgT01YX1U4ICpwQlMKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kgICAoNi4zLjMuMy42KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgaW4tcGxhY2UgZGVibG9ja2luZyBmaWx0ZXJpbmcgb24gYWxsIGVkZ2VzIG9mIHRoZSBjaHJvbWEgCi0gKiBtYWNyb2Jsb2NrICgxNngxNikuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgc3JjZHN0U3RlcCAtIHN0ZXAgb2YgdGhlIGFycmF5czsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBwQWxwaGEgLSBwb2ludGVyIHRvIGEgMngyIGFycmF5IG9mIGFscGhhIHRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyAKLSAqICAgICAgICAgICAgZm9sbG93czoge2V4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsIHZlcnRpY2FsIGVkZ2UsIAotICogICAgICAgICAgICBleHRlcm5hbCBob3Jpem9udGFsIGVkZ2UsIGludGVybmFsIGhvcml6b250YWwgZWRnZSB9LiAgUGVyIAotICogICAgICAgICAgICBbSVNPMTQ0OTYtMTBdIGFscGhhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNTVdLiAKLSAqICAgcEJldGEgLSBwb2ludGVyIHRvIGEgMngyIGFycmF5IG9mIEJldGEgVGhyZXNob2xkcywgb3JnYW5pemVkIGFzIGZvbGxvd3M6IAotICogICAgICAgICAgICB7IGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsIHZlcnRpY2FsIGVkZ2UsIGV4dGVybmFsIAotICogICAgICAgICAgICBob3Jpem9udGFsIGVkZ2UsIGludGVybmFsIGhvcml6b250YWwgZWRnZSB9LiAgUGVyIFtJU08xNDQ5Ni0xMF0gCi0gKiAgICAgICAgICAgIGJldGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDE4XS4gCi0gKiAgIHBUaHJlc2hvbGRzIC0gYXJyYXkgb2Ygc2l6ZSA4eDIgb2YgVGhyZXNob2xkcyAoVEMwKSAodmFsdWVzIGZvciB0aGUgbGVmdCAKLSAqICAgICAgICAgICAgb3IgYWJvdmUgZWRnZSBvZiBlYWNoIDR4MiBvciAyeDQgYmxvY2ssIGFycmFuZ2VkIGluIHZlcnRpY2FsIAotICogICAgICAgICAgICBibG9jayBvcmRlciBhbmQgdGhlbiBpbiBob3Jpem9udGFsIGJsb2NrIG9yZGVyKTsgbXVzdCBiZSBhbGlnbmVkIAotICogICAgICAgICAgICBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gUGVyIFtJU08xNDQ5Ni0xMF0gdmFsdWVzIG11c3QgYmUgaW4gdGhlIAotICogICAgICAgICAgICByYW5nZSBbMCwyNV0uIAotICogICBwQlMgLSBhcnJheSBvZiBzaXplIDE2eDIgb2YgQlMgcGFyYW1ldGVycyAoYXJyYW5nZWQgaW4gc2NhbiBibG9jayBvcmRlciAKLSAqICAgICAgICAgICAgZm9yIHZlcnRpY2FsIGVkZ2VzIGFuZCB0aGVuIGhvcml6b250YWwgZWRnZXMpOyB2YWxpZCBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IAotICogICAgICAgICAgICBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4zXT09IAotICogICAgICAgICAgICA0LiAgTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cyAKLSAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QsIHBBbHBoYSwgCi0gKiAgICAgICAgICAgICAgcEJldGEsIHBUaHJlc2hvbGRzLCBvciBwQlMuIAotICogICAgLSAgIHBTcmNEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICBlaXRoZXIgcFRocmVzaG9sZHMgb3IgcEJTIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgb25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcEFscGhhWzAuLjNdIGlzIG91dHNpZGUgdGhlIHJhbmdlIAotICogICAgICAgICAgICAgIFswLDI1NV0uIAotICogICAgLSAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBCZXRhWzAuLjNdIGlzIG91dHNpZGUgdGhlIHJhbmdlIAotICogICAgICAgICAgICAgIFswLDE4XS4gCi0gKiAgICAtICAgb25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uMTVdaXMgb3V0c2lkZSBvZiAKLSAqICAgICAgICAgICAgICB0aGUgcmFuZ2UgWzAsMjVdLiAKLSAqICAgIC0gICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgICAgICAgICBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCAgZm9yIGk+PTQsIG9yIAotICogICAgICAgICAgICAocEJTW2ldPT00ICYmIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4gCi0gKiAgICAtICAgc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSSAoCi0gICAgT01YX1U4ICpwU3JjRHN0LAotICAgIE9NWF9TMzIgc3JjZHN0U3RlcCwKLSAgICBjb25zdCBPTVhfVTggKnBBbHBoYSwKLSAgICBjb25zdCBPTVhfVTggKnBCZXRhLAotICAgIGNvbnN0IE9NWF9VOCAqcFRocmVzaG9sZHMsCi0gICAgY29uc3QgT01YX1U4ICpwQlMKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDICAgKDYuMy40LjEuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIENBVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHJhc3RlciBzY2FuIGZvciBhIDJ4MiBibG9jayBvZiAKLSAqIENocm9tYURDTGV2ZWwuICBUaGUgZGVjb2RlZCBjb2VmZmljaWVudHMgaW4gdGhlIHBhY2tlZCBwb3NpdGlvbi1jb2VmZmljaWVudCAKLSAqIGJ1ZmZlciBhcmUgc3RvcmVkIGluIHJldmVyc2UgemlnLXphZyBvcmRlciwgaS5lLiwgdGhlIGZpcnN0IGJ1ZmZlciBlbGVtZW50IAotICogY29udGFpbnMgdGhlIGxhc3Qgbm9uLXplcm8gcG9zdGlvbi1jb2VmZmljaWVudCBwYWlyIG9mIHRoZSBibG9jay4gV2l0aGluIAotICogZWFjaCBwb3NpdGlvbi1jb2VmZmljaWVudCBwYWlyLCB0aGUgcG9zaXRpb24gZW50cnkgaW5kaWNhdGVzIHRoZSAKLSAqIHJhc3Rlci1zY2FuIHBvc2l0aW9uIG9mIHRoZSBjb2VmZmljaWVudCwgd2hpbGUgdGhlIGNvZWZmaWNpZW50IGVudHJ5IAotICogY29udGFpbnMgdGhlIGNvZWZmaWNpZW50IHZhbHVlLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIERvdWJsZSBwb2ludGVyIHRvIGN1cnJlbnQgYnl0ZSBpbiBiaXQgc3RyZWFtIGJ1ZmZlciAKLSAqICAgcE9mZnNldCAtIFBvaW50ZXIgdG8gY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCB0byBieSAKLSAqICAgICAgICAgICAgKnBwQml0U3RyZWFtOyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsN10uIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZCAKLSAqICAgcE9mZnNldCAtICpwT2Zmc2V0IGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkIAotICogICBwTnVtQ29lZmYgLSBQb2ludGVyIHRvIHRoZSBudW1iZXIgb2Ygbm9uemVybyBjb2VmZmljaWVudHMgaW4gdGhpcyBibG9jayAKLSAqICAgcHBQb3NDb2VmQnVmIC0gRG91YmxlIHBvaW50ZXIgdG8gZGVzdGluYXRpb24gcmVzaWR1YWwgCi0gKiAgICAgICAgICAgIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyLiAgQnVmZmVyIHBvc2l0aW9uIAotICogICAgICAgICAgICAoKnBwUG9zQ29lZkJ1ZikgaXMgdXBkYXRlZCB1cG9uIHJldHVybiwgdW5sZXNzIHRoZXJlIGFyZSBvbmx5IAotICogICAgICAgICAgICB6ZXJvIGNvZWZmaWNpZW50cyBpbiB0aGUgY3VycmVudGx5IGRlY29kZWQgYmxvY2suICBJbiB0aGlzIGNhc2UgCi0gKiAgICAgICAgICAgIHRoZSBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8gYnlwYXNzIHRoZSB0cmFuc2Zvcm0vZGVxdWFudGl6YXRpb24gb2YgCi0gKiAgICAgICAgICAgIHRoZSBlbXB0eSBibG9ja3MuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqCi0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIHBwQml0U3RyZWFtIG9yIHBPZmZzZXQgaXMgTlVMTC4gCi0gKiAgICAtICAgIHBwUG9zQ29lZkJ1ZiBvciBwTnVtQ29lZmYgaXMgTlVMTC4gCi0gKiAgICBPTVhfU3RzX0VyciAtIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6IAotICogICAgLSAgICBhbiBpbGxlZ2FsIGNvZGUgaXMgZW5jb3VudGVyZWQgaW4gdGhlIGJpdHN0cmVhbSAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMgKAotICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgIE9NWF9TMzIqcE9mZnNldCwKLSAgICBPTVhfVTggKnBOdW1Db2VmZiwKLSAgICBPTVhfVTggKipwcFBvc0NvZWZidWYKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQyAgICg2LjMuNC4xLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBDQVZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBmb3IgNHg0IGJsb2NrIG9mIAotICogSW50cmExNngxNkRDTGV2ZWwsIEludHJhMTZ4MTZBQ0xldmVsLCBMdW1hTGV2ZWwsIGFuZCBDaHJvbWFBQ0xldmVsLiBJbnZlcnNlIAotICogZmllbGQgc2NhbiBpcyBub3Qgc3VwcG9ydGVkLiBUaGUgZGVjb2RlZCBjb2VmZmljaWVudHMgaW4gdGhlIHBhY2tlZCAKLSAqIHBvc2l0aW9uLWNvZWZmaWNpZW50IGJ1ZmZlciBhcmUgc3RvcmVkIGluIHJldmVyc2UgemlnLXphZyBvcmRlciwgaS5lLiwgdGhlIAotICogZmlyc3QgYnVmZmVyIGVsZW1lbnQgY29udGFpbnMgdGhlIGxhc3Qgbm9uLXplcm8gcG9zdGlvbi1jb2VmZmljaWVudCBwYWlyIG9mIAotICogdGhlIGJsb2NrLiBXaXRoaW4gZWFjaCBwb3NpdGlvbi1jb2VmZmljaWVudCBwYWlyLCB0aGUgcG9zaXRpb24gZW50cnkgCi0gKiBpbmRpY2F0ZXMgdGhlIHJhc3Rlci1zY2FuIHBvc2l0aW9uIG9mIHRoZSBjb2VmZmljaWVudCwgd2hpbGUgdGhlIAotICogY29lZmZpY2llbnQgZW50cnkgY29udGFpbnMgdGhlIGNvZWZmaWNpZW50IHZhbHVlLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtRG91YmxlIHBvaW50ZXIgdG8gY3VycmVudCBieXRlIGluIGJpdCBzdHJlYW0gYnVmZmVyIAotICogICBwT2Zmc2V0IC0gUG9pbnRlciB0byBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIHRvIGJ5IAotICogICAgICAgICAgICAqcHBCaXRTdHJlYW07IHZhbGlkIGluIHRoZSByYW5nZSBbMCw3XS4gCi0gKiAgIHNNYXhOdW1Db2VmZiAtIE1heGltdW0gdGhlIG51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMgaW4gY3VycmVudCAKLSAqICAgICAgICAgICAgYmxvY2sgCi0gKiAgIHNWTENTZWxlY3QgLSBWTEMgdGFibGUgc2VsZWN0b3IsIG9idGFpbmVkIGZyb20gdGhlIG51bWJlciBvZiBub24temVybyAKLSAqICAgICAgICAgICAgY29lZmZpY2llbnRzIGNvbnRhaW5lZCBpbiB0aGUgYWJvdmUgYW5kIGxlZnQgNHg0IGJsb2Nrcy4gIEl0IGlzIAotICogICAgICAgICAgICBlcXVpdmFsZW50IHRvIHRoZSB2YXJpYWJsZSBuQyBkZXNjcmliZWQgaW4gSC4yNjQgc3RhbmRhcmQgdGFibGUgCi0gKiAgICAgICAgICAgIDkgNSwgZXhjZXB0IGl0cyB2YWx1ZSBjYW4gdCBiZSBsZXNzIHRoYW4gemVyby4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkLiAgCi0gKiAgICAgICAgICAgIEJ1ZmZlciBwb3NpdGlvbiAoKnBwUG9zQ29lZkJ1ZikgaXMgdXBkYXRlZCB1cG9uIHJldHVybiwgdW5sZXNzIAotICogICAgICAgICAgICB0aGVyZSBhcmUgb25seSB6ZXJvIGNvZWZmaWNpZW50cyBpbiB0aGUgY3VycmVudGx5IGRlY29kZWQgYmxvY2suIAotICogICAgICAgICAgICAgSW4gdGhpcyBjYXNlIHRoZSBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8gYnlwYXNzIHRoZSAKLSAqICAgICAgICAgICAgdHJhbnNmb3JtL2RlcXVhbnRpemF0aW9uIG9mIHRoZSBlbXB0eSBibG9ja3MuIAotICogICBwT2Zmc2V0IC0gKnBPZmZzZXQgaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQgCi0gKiAgIHBOdW1Db2VmZiAtIFBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBub256ZXJvIGNvZWZmaWNpZW50cyBpbiB0aGlzIGJsb2NrIAotICogICBwcFBvc0NvZWZCdWYgLSBEb3VibGUgcG9pbnRlciB0byBkZXN0aW5hdGlvbiByZXNpZHVhbCAKLSAqICAgICAgICAgICAgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBwcEJpdFN0cmVhbSBvciBwT2Zmc2V0IGlzIE5VTEwuIAotICogICAgLSAgICBwcFBvc0NvZWZCdWYgb3IgcE51bUNvZWZmIGlzIE5VTEwuIAotICogICAgLSAgICBzTWF4TnVtQ29lZmYgaXMgbm90IGVxdWFsIHRvIGVpdGhlciAxNSBvciAxNi4gCi0gKiAgICAtICAgIHNWTENTZWxlY3QgaXMgbGVzcyB0aGFuIDAuIAotICoKLSAqICAgIE9NWF9TdHNfRXJyIC0gaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGFuIGlsbGVnYWwgY29kZSBpcyBlbmNvdW50ZXJlZCBpbiB0aGUgYml0c3RyZWFtIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMgKAotICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgIE9NWF9TMzIgKnBPZmZzZXQsCi0gICAgT01YX1U4ICpwTnVtQ29lZmYsCi0gICAgT01YX1U4ICoqcHBQb3NDb2VmYnVmLAotICAgIE9NWF9JTlQgc1ZMQ1NlbGVjdCwKLSAgICBPTVhfSU5UIHNNYXhOdW1Db2VmZgotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpciAgICg2LjMuNC4yLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBSZWNvbnN0cnVjdHMgdGhlIDR4NCBMdW1hREMgYmxvY2sgZnJvbSB0aGUgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciAKLSAqIGJ1ZmZlciwgcGVyZm9ybXMgaW50ZWdlciBpbnZlcnNlLCBhbmQgZGVxdWFudGl6YXRpb24gZm9yIDR4NCBMdW1hREMgCi0gKiBjb2VmZmljaWVudHMsIGFuZCB1cGRhdGVzIHRoZSBwYWlyIGJ1ZmZlciBwb2ludGVyIHRvIHRoZSBuZXh0IG5vbi1lbXB0eSAKLSAqIGJsb2NrLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcFNyYyAtIERvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyIAotICogICAgICAgICAgICBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcgCi0gKiAgIFFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlciBRcFkgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwU3JjIC0gKnBwU3JjIGlzIHVwZGF0ZWQgdG8gdGhlIHN0YXJ0IG9mIG5leHQgbm9uIGVtcHR5IGJsb2NrIAotICogICBwRHN0IC0gUG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCA0eDQgTHVtYURDIGNvZWZmaWNpZW50cyBidWZmZXI7IG11c3QgCi0gKiAgICAgICAgICAgIGJlIGFsaWduZWQgb24gYSA4LWJ5dGUgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIHBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCi0gKiAgICAtICAgIHBEc3QgaXMgbm90IDggYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgUVAgaXMgbm90IGluIHRoZSByYW5nZSBvZiBbMC01MV0uIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyICgKLSAgICBjb25zdCBPTVhfVTggKipwcFNyYywKLSAgICBPTVhfUzE2ICpwRHN0LAotICAgIE9NWF9JTlQgUVAKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpciAgICg2LjMuNC4yLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBSZWNvbnN0cnVjdCB0aGUgMngyIENocm9tYURDIGJsb2NrIGZyb20gY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIsIAotICogcGVyZm9ybSBpbnRlZ2VyIGludmVyc2UgdHJhbnNmb3JtYXRpb24sIGFuZCBkZXF1YW50aXphdGlvbiBmb3IgMngyIGNocm9tYSAKLSAqIERDIGNvZWZmaWNpZW50cywgYW5kIHVwZGF0ZSB0aGUgcGFpciBidWZmZXIgcG9pbnRlciB0byBuZXh0IG5vbi1lbXB0eSAKLSAqIGJsb2NrLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcFNyYyAtIERvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyIAotICogICAgICAgICAgICBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcgCi0gKiAgIFFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlciBRcEMgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwU3JjIC0gKnBwU3JjIGlzIHVwZGF0ZWQgdG8gdGhlIHN0YXJ0IG9mIG5leHQgbm9uIGVtcHR5IGJsb2NrIAotICogICBwRHN0IC0gUG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCAyeDIgQ2hyb21hREMgY29lZmZpY2llbnRzIGJ1ZmZlcjsgCi0gKiAgICAgICAgICAgIG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgcHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKLSAqICAgIC0gICAgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBRUCBpcyBub3QgaW4gdGhlIHJhbmdlIG9mIFswLTUxXS4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpciAoCi0gICAgY29uc3QgT01YX1U4ICoqcHBTcmMsCi0gICAgT01YX1MxNiAqcERzdCwKLSAgICBPTVhfSU5UIFFQCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQgICAoNi4zLjQuMi4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUmVjb25zdHJ1Y3QgdGhlIDR4NCByZXNpZHVhbCBibG9jayBmcm9tIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyLCAKLSAqIHBlcmZvcm0gZGVxdWFudGl6YXRpb24gYW5kIGludGVnZXIgaW52ZXJzZSB0cmFuc2Zvcm1hdGlvbiBmb3IgNHg0IGJsb2NrIG9mIAotICogcmVzaWR1YWxzIHdpdGggcHJldmlvdXMgaW50cmEgcHJlZGljdGlvbiBvciBtb3Rpb24gY29tcGVuc2F0aW9uIGRhdGEsIGFuZCAKLSAqIHVwZGF0ZSB0aGUgcGFpciBidWZmZXIgcG9pbnRlciB0byBuZXh0IG5vbi1lbXB0eSBibG9jay4gSWYgcERDID09IE5VTEwsIAotICogdGhlcmUgcmUgMTYgbm9uLXplcm8gQUMgY29lZmZpY2llbnRzIGF0IG1vc3QgaW4gdGhlIHBhY2tlZCBidWZmZXIgc3RhcnRpbmcgCi0gKiBmcm9tIDR4NCBibG9jayBwb3NpdGlvbiAwOyBJZiBwREMgIT0gTlVMTCwgdGhlcmUgcmUgMTUgbm9uLXplcm8gQUMgCi0gKiBjb2VmZmljaWVudHMgYXQgbW9zdCBpbiB0aGUgcGFja2V0IGJ1ZmZlciBzdGFydGluZyBmcm9tIDR4NCBibG9jayBwb3NpdGlvbiAKLSAqIDEuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwU3JjIC0gRG91YmxlIHBvaW50ZXIgdG8gcmVzaWR1YWwgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIgCi0gKiAgICAgICAgICAgIG91dHB1dCBieSBDQUxWQyBkZWNvZGluZyAKLSAqICAgcFByZWQgLSBQb2ludGVyIHRvIHRoZSBwcmVkaWN0ZWQgNHg0IGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5IAotICogICBwcmVkU3RlcCAtIFByZWRpY3RlZCBmcmFtZSBzdGVwIHNpemUgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IAotICogICBkc3RTdGVwIC0gRGVzdGluYXRpb24gZnJhbWUgc3RlcCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgCi0gKiAgIHBEQyAtIFBvaW50ZXIgdG8gdGhlIERDIGNvZWZmaWNpZW50IG9mIHRoaXMgYmxvY2ssIE5VTEwgaWYgaXQgZG9lc24ndCAKLSAqICAgICAgICAgICAgZXhpc3QgCi0gKiAgIFFQIC0gUVAgUXVhbnRpemF0aW9uIHBhcmFtZXRlci4gIEl0IHNob3VsZCBiZSBRcEMgaW4gY2hyb21hIDR4NCBibG9jayAKLSAqICAgICAgICAgICAgZGVjb2RpbmcsIG90aGVyd2lzZSBpdCBzaG91bGQgYmUgUXBZLiAKLSAqICAgQUMgLSBGbGFnIGluZGljYXRpbmcgaWYgYXQgbGVhc3Qgb25lIG5vbi16ZXJvIEFDIGNvZWZmaWNpZW50IGV4aXN0cyAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgNHg0IGJsb2NrIGRhdGE7IG11c3QgYmUgYWxpZ25lZCBvbiBhIAotICogICAgICAgICAgICA0LWJ5dGUgYm91bmRhcnkgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgcFByZWQgb3IgcERzdCBpcyBOVUxMLiAKLSAqICAgIC0gICAgcFByZWQgb3IgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBwcmVkU3RlcCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQuIAotICogICAgLSAgICBBQyAhPTAgYW5kIFFwIGlzIG5vdCBpbiB0aGUgcmFuZ2Ugb2YgWzAtNTFdIG9yIHBwU3JjID09IE5VTEwuIAotICogICAgLSAgICBBQyA9PTAgJiYgcERDID09TlVMTC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCAoCi0gICAgY29uc3QgT01YX1U4ICoqcHBTcmMsCi0gICAgY29uc3QgT01YX1U4ICpwUHJlZCwKLSAgICBjb25zdCBPTVhfUzE2ICpwREMsCi0gICAgT01YX1U4ICpwRHN0LAotICAgIE9NWF9JTlQgcHJlZFN0ZXAsCi0gICAgT01YX0lOVCBkc3RTdGVwLAotICAgIE9NWF9JTlQgUVAsCi0gICAgT01YX0lOVCBBQwotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX01FR2V0QnVmU2l6ZSAgICg2LjMuNS4xLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb21wdXRlcyB0aGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3BlY2lmaWNhdGlvbiAKLSAqIHN0cnVjdHVyZSBmb3IgdGhlIG9teFZDTTRQMTAgbW90aW9uIGVzdGltYXRpb24gZnVuY3Rpb25zIEJsb2NrTWF0Y2hfSW50ZWdlciAKLSAqIGFuZCBNb3Rpb25Fc3RpbWF0aW9uTUIuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIE1FbW9kZSAtIG1vdGlvbiBlc3RpbWF0aW9uIG1vZGU7IGF2YWlsYWJsZSBtb2RlcyBhcmUgZGVmaW5lZCBieSB0aGUgCi0gKiAgICAgICAgICAgIGVudW1lcmF0ZWQgdHlwZSBPTVhWQ000UDEwTUVNb2RlIAotICogICBwTUVQYXJhbXMgLW1vdGlvbiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTaXplIC0gcG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgbW90aW9uIAotICogICAgICAgICAgICBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIHBNRVBhcmFtcyBvciBwU2l6ZSBpcyBOVUxMLiAKLSAqICAgIC0gICAgYW4gaW52YWxpZCBNRU1vZGUgaXMgc3BlY2lmaWVkLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX01FR2V0QnVmU2l6ZSAoCi0gICAgT01YVkNNNFAxME1FTW9kZSBNRW1vZGUsCi0gICAgY29uc3QgT01YVkNNNFAxME1FUGFyYW1zICpwTUVQYXJhbXMsCi0gICAgT01YX1UzMiAqcFNpemUKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9NRUluaXQgICAoNi4zLjUuMS4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogSW5pdGlhbGl6ZXMgdGhlIHZlbmRvci1zcGVjaWZpYyBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSByZXF1aXJlZCBmb3IgdGhlIAotICogb214VkNNNFAxMCBtb3Rpb24gZXN0aW1hdGlvbiBmdW5jdGlvbnM6ICBCbG9ja01hdGNoX0ludGVnZXIgYW5kIAotICogTW90aW9uRXN0aW1hdGlvbk1CLiBNZW1vcnkgZm9yIHRoZSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAqcE1FU3BlYyBtdXN0IGJlIAotICogYWxsb2NhdGVkIHByaW9yIHRvIGNhbGxpbmcgdGhlIGZ1bmN0aW9uLCBhbmQgc2hvdWxkIGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCi0gKiBib3VuZGFyeS4gIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSBjYW4gCi0gKiBiZSBkZXRlcm1pbmVkIHVzaW5nIHRoZSBmdW5jdGlvbiBvbXhWQ000UDEwX01FR2V0QnVmU2l6ZS4gRm9sbG93aW5nIAotICogaW5pdGlhbGl6YXRpb24gYnkgdGhpcyBmdW5jdGlvbiwgdGhlIHZlbmRvci1zcGVjaWZpYyBzdHJ1Y3R1cmUgKnBNRVNwZWMgCi0gKiBzaG91bGQgY29udGFpbiBhbiBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyByZXByZXNlbnRhdGlvbiBvZiBhbGwgbW90aW9uIAotICogZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIHJlY2VpdmVkIHZpYSB0aGUgc3RydWN0dXJlIHBNRVBhcmFtcywgZm9yIGV4YW1wbGUgIAotICogc2VhcmNoUmFuZ2UxNngxNiwgc2VhcmNoUmFuZ2U4eDgsIGV0Yy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgTUVtb2RlIC0gbW90aW9uIGVzdGltYXRpb24gbW9kZTsgYXZhaWxhYmxlIG1vZGVzIGFyZSBkZWZpbmVkIGJ5IHRoZSAKLSAqICAgICAgICAgICAgZW51bWVyYXRlZCB0eXBlIE9NWFZDTTRQMTBNRU1vZGUgCi0gKiAgIHBNRVBhcmFtcyAtIG1vdGlvbiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgCi0gKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSB1bmluaXRpYWxpemVkIE1FIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgaW5pdGlhbGl6ZWQgTUUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgcE1FUGFyYW1zIG9yIHBTaXplIGlzIE5VTEwuIAotICogICAgLSAgICBhbiBpbnZhbGlkIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSBwYXJhbWV0ZXIgTUVtb2RlIAotICogICAgLSAgICBhIG5lZ2F0aXZlIG9yIHplcm8gdmFsdWUgd2FzIHNwZWNpZmllZCBmb3Igb25lIG9mIHRoZSBzZWFyY2ggcmFuZ2VzIAotICogICAgICAgICAoZS5nLiwgIHBNQlBhcmFtcyA+c2VhcmNoUmFuZ2U4eDgsIHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2UxNngxNiwgZXRjLikgCi0gKiAgICAtICAgIGVpdGhlciBpbiBpc29sYXRpb24gb3IgaW4gY29tYmluYXRpb24sIG9uZSBvciBtb3JlIG9mIHRoZSBlbmFibGVzIG9yIAotICogICAgICAgICBzZWFyY2ggcmFuZ2VzIGluIHRoZSBzdHJ1Y3R1cmUgKnBNRVBhcmFtcyB3ZXJlIGNvbmZpZ3VyZWQgc3VjaCAKLSAqICAgICAgICAgdGhhdCB0aGUgcmVxdWVzdGVkIGJlaGF2aW9yIGZhaWxzIHRvIGNvbXBseSB3aXRoIFtJU08xNDQ5Ni0xMF0uIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfTUVJbml0ICgKLSAgICBPTVhWQ000UDEwTUVNb2RlIE1FbW9kZSwKLSAgICBjb25zdCBPTVhWQ000UDEwTUVQYXJhbXMgKnBNRVBhcmFtcywKLSAgICB2b2lkICpwTUVTcGVjCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyICAgKDYuMy41LjIuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGludGVnZXIgYmxvY2sgbWF0Y2guICBSZXR1cm5zIGJlc3QgTVYgYW5kIGFzc29jaWF0ZWQgY29zdC4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY09yZ1kgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGN1cnJlbnQgYmxvY2s6Ci0gKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBwU3JjUmVmWSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY28tbG9jYXRlZCBibG9jayBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJlZmVyZW5jZSBwaWN0dXJlOiAKLSAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAgCi0gKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIAotICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgblNyY09yZ1N0ZXAgLSBTdHJpZGUgb2YgdGhlIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmUsIGV4cHJlc3NlZCBpbiB0ZXJtcyAKLSAqICAgICAgICAgICAgb2YgaW50ZWdlciBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiBpQmxvY2tXaWR0aC4gCi0gKiAgIG5TcmNSZWZTdGVwIC0gU3RyaWRlIG9mIHRoZSByZWZlcmVuY2UgcGljdHVyZSBwbGFuZSwgZXhwcmVzc2VkIGluIHRlcm1zIAotICogICAgICAgICAgICBvZiBpbnRlZ2VyIHBpeGVscyAKLSAqICAgcFJlZlJlY3QgLSBwb2ludGVyIHRvIHRoZSB2YWxpZCByZWZlcmVuY2UgcmVjdGFuZ2xlIGluc2lkZSB0aGUgcmVmZXJlbmNlIAotICogICAgICAgICAgICBwaWN0dXJlIHBsYW5lIAotICogICBuQ3VyclBvaW50UG9zIC0gcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUgCi0gKiAgIGlCbG9ja1dpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2ssIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiBpbnRlZ2VyIAotICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKLSAqICAgaUJsb2NrSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrLCBleHByZXNzZWQgaW4gdGVybXMgb2YgCi0gKiAgICAgICAgICAgIGludGVnZXIgcGl4ZWxzOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCi0gKiAgIG5MYW1kYSAtIExhbWRhIGZhY3RvcjsgdXNlZCB0byBjb21wdXRlIG1vdGlvbiBjb3N0IAotICogICBwTVZQcmVkIC0gUHJlZGljdGVkIE1WOyB1c2VkIHRvIGNvbXB1dGUgbW90aW9uIGNvc3QsIGV4cHJlc3NlZCBpbiB0ZXJtcyAKLSAqICAgICAgICAgICAgb2YgMS80LXBlbCB1bml0cyAKLSAqICAgcE1WQ2FuZGlkYXRlIC0gQ2FuZGlkYXRlIE1WOyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIG1vdGlvbiBzZWFyY2gsIAotICogICAgICAgICAgICBleHByZXNzZWQgaW4gdGVybXMgb2YgaW50ZWdlciBwaXhlbHMgCi0gKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSBNRSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdEJlc3RNViAtIEJlc3QgTVYgcmVzdWx0aW5nIGZyb20gaW50ZWdlciBzZWFyY2gsIGV4cHJlc3NlZCBpbiB0ZXJtcyAKLSAqICAgICAgICAgICAgb2YgMS80LXBlbCB1bml0cyAKLSAqICAgcEJlc3RDb3N0IC0gTW90aW9uIGNvc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBiZXN0IE1WOyBjb21wdXRlZCBhcyAKLSAqICAgICAgICAgICAgU0FEK0xhbWRhKkJpdHNVc2VkQnlNViAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBhbnkgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBhcmUgTlVMTDoKLSAqICAgICAgICAgcFNyY09yZ1ksIHBTcmNSZWZZLCBwUmVmUmVjdCwgcE1WUHJlZCwgcE1WQ2FuZGlkYXRlLCBvciBwTUVTcGVjLiAKLSAqICAgIC0gICAgRWl0aGVyIGlCbG9ja1dpZHRoIG9yIGlCbG9ja0hlaWdodCBhcmUgdmFsdWVzIG90aGVyIHRoYW4gNCwgOCwgb3IgMTYuIAotICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY09yZ1ksCi0gICAgT01YX1MzMiBuU3JjT3JnU3RlcCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZZLAotICAgIE9NWF9TMzIgblNyY1JlZlN0ZXAsCi0gICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCi0gICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKLSAgICBPTVhfVTggaUJsb2NrV2lkdGgsCi0gICAgT01YX1U4IGlCbG9ja0hlaWdodCwKLSAgICBPTVhfVTMyIG5MYW1kYSwKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcE1WUHJlZCwKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcE1WQ2FuZGlkYXRlLAotICAgIE9NWFZDTW90aW9uVmVjdG9yICpwQmVzdE1WLAotICAgIE9NWF9TMzIgKnBCZXN0Q29zdCwKLSAgICB2b2lkICpwTUVTcGVjCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmICAgKDYuMy41LjIuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGEgaGFsZi1wZWwgYmxvY2sgbWF0Y2ggdXNpbmcgcmVzdWx0cyBmcm9tIGEgcHJpb3IgaW50ZWdlciBzZWFyY2guIAotICogIFJldHVybnMgdGhlIGJlc3QgTVYgYW5kIGFzc29jaWF0ZWQgY29zdC4gIFRoaXMgZnVuY3Rpb24gZXN0aW1hdGVzIHRoZSAKLSAqIGhhbGYtcGl4ZWwgbW90aW9uIHZlY3RvciBieSBpbnRlcnBvbGF0aW5nIHRoZSBpbnRlZ2VyIHJlc29sdXRpb24gbW90aW9uIAotICogdmVjdG9yIHJlZmVyZW5jZWQgYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0QmVzdE1WLCBpLmUuLCB0aGUgaW5pdGlhbCAKLSAqIGludGVnZXIgTVYgaXMgZ2VuZXJhdGVkIGV4dGVybmFsbHkuICBUaGUgZnVuY3Rpb24gCi0gKiBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSW50ZWdlciBtYXkgYmUgdXNlZCBmb3IgaW50ZWdlciBtb3Rpb24gZXN0aW1hdGlvbi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY09yZ1kgLSBQb2ludGVyIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmU6Ci0gKiAgICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBwU3JjUmVmWSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY28tbG9jYXRlZCBibG9jayBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJlZmVyZW5jZSBwaWN0dXJlOiAgCi0gKiAgICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAgCi0gKiAgICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAgCi0gKiAgICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIG5TcmNPcmdTdGVwIC0gU3RyaWRlIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCi0gKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIGlCbG9ja1dpZHRoLiAKLSAqICAgblNyY1JlZlN0ZXAgLSBTdHJpZGUgb2YgdGhlIHJlZmVyZW5jZSBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCi0gKiAgICAgICAgICAgIHBpeGVscyAKLSAqICAgaUJsb2NrV2lkdGggLSBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0ZXJtcyBvZiBmdWxsIHBpeGVsczsgbXVzdCAKLSAqICAgICAgICAgICAgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKLSAqICAgaUJsb2NrSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRlcm1zIG9mIGZ1bGwgcGl4ZWxzOyBtdXN0IAotICogICAgICAgICAgICBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAotICogICBuTGFtZGEgLSBMYW1kYSBmYWN0b3IsIHVzZWQgdG8gY29tcHV0ZSBtb3Rpb24gY29zdCAKLSAqICAgcE1WUHJlZCAtIFByZWRpY3RlZCBNViwgcmVwcmVzZW50ZWQgaW4gdGVybXMgb2YgMS80LXBlbCB1bml0czsgdXNlZCB0byAKLSAqICAgICAgICAgICAgY29tcHV0ZSBtb3Rpb24gY29zdCAKLSAqICAgcFNyY0RzdEJlc3RNViAtIFRoZSBiZXN0IE1WIHJlc3VsdGluZyBmcm9tIGEgcHJpb3IgaW50ZWdlciBzZWFyY2gsIAotICogICAgICAgICAgICByZXByZXNlbnRlZCBpbiB0ZXJtcyBvZiAxLzQtcGVsIHVuaXRzIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0QmVzdE1WIC0gQmVzdCBNViByZXN1bHRpbmcgZnJvbSB0aGUgaGFsZi1wZWwgc2VhcmNoLCBleHByZXNzZWQgaW4gCi0gKiAgICAgICAgICAgIHRlcm1zIG9mIDEvNC1wZWwgdW5pdHMgCi0gKiAgIHBCZXN0Q29zdCAtIE1vdGlvbiBjb3N0IGFzc29jaWF0ZWQgd2l0aCB0aGUgYmVzdCBNVjsgY29tcHV0ZWQgYXMgCi0gKiAgICAgICAgICAgIFNBRCtMYW1kYSpCaXRzVXNlZEJ5TVYgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgYW55IG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY09yZ1ksIHBTcmNSZWZZLCAKLSAqICAgICAgICAgICAgICBwU3JjRHN0QmVzdE1WLCBwTVZQcmVkLCBwQmVzdENvc3QgCi0gKiAgICAtICAgIGlCbG9ja1dpZHRoIG9yIGlCbG9ja0hlaWdodCBhcmUgZXF1YWwgdG8gdmFsdWVzIG90aGVyIHRoYW4gNCwgOCwgb3IgMTYuIAotICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY09yZ1ksCi0gICAgT01YX1MzMiBuU3JjT3JnU3RlcCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZZLAotICAgIE9NWF9TMzIgblNyY1JlZlN0ZXAsCi0gICAgT01YX1U4IGlCbG9ja1dpZHRoLAotICAgIE9NWF9VOCBpQmxvY2tIZWlnaHQsCi0gICAgT01YX1UzMiBuTGFtZGEsCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBNVlByZWQsCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNEc3RCZXN0TVYsCi0gICAgT01YX1MzMiAqcEJlc3RDb3N0Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9RdWFydGVyICAgKDYuMy41LjIuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGEgcXVhcnRlci1wZWwgYmxvY2sgbWF0Y2ggdXNpbmcgcmVzdWx0cyBmcm9tIGEgcHJpb3IgaGFsZi1wZWwgCi0gKiBzZWFyY2guICBSZXR1cm5zIHRoZSBiZXN0IE1WIGFuZCBhc3NvY2lhdGVkIGNvc3QuICBUaGlzIGZ1bmN0aW9uIGVzdGltYXRlcyAKLSAqIHRoZSBxdWFydGVyLXBpeGVsIG1vdGlvbiB2ZWN0b3IgYnkgaW50ZXJwb2xhdGluZyB0aGUgaGFsZi1wZWwgcmVzb2x1dGlvbiAKLSAqIG1vdGlvbiB2ZWN0b3IgcmVmZXJlbmNlZCBieSB0aGUgaW5wdXQgcGFyYW1ldGVyIHBTcmNEc3RCZXN0TVYsIGkuZS4sIHRoZSAKLSAqIGluaXRpYWwgaGFsZi1wZWwgTVYgaXMgZ2VuZXJhdGVkIGV4dGVybmFsbHkuICBUaGUgZnVuY3Rpb24gCi0gKiBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZiBtYXkgYmUgdXNlZCBmb3IgaGFsZi1wZWwgbW90aW9uIGVzdGltYXRpb24uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNPcmdZIC0gUG9pbnRlciB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lOgotICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgcFNyY1JlZlkgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGNvLWxvY2F0ZWQgYmxvY2sgaW4gdGhlIAotICogICAgICAgICAgICByZWZlcmVuY2UgcGljdHVyZToKLSAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAgCi0gKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIAotICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgblNyY09yZ1N0ZXAgLSBTdHJpZGUgb2YgdGhlIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKLSAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgaUJsb2NrV2lkdGguIAotICogICBuU3JjUmVmU3RlcCAtIFN0cmlkZSBvZiB0aGUgcmVmZXJlbmNlIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKLSAqICAgICAgICAgICAgcGl4ZWxzIAotICogICBpQmxvY2tXaWR0aCAtIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRlcm1zIG9mIGZ1bGwgcGl4ZWxzOyBtdXN0IAotICogICAgICAgICAgICBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAotICogICBpQmxvY2tIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGVybXMgb2YgZnVsbCBwaXhlbHM7IG11c3QgCi0gKiAgICAgICAgICAgIGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCi0gKiAgIG5MYW1kYSAtIExhbWRhIGZhY3RvciwgdXNlZCB0byBjb21wdXRlIG1vdGlvbiBjb3N0IAotICogICBwTVZQcmVkIC0gUHJlZGljdGVkIE1WLCByZXByZXNlbnRlZCBpbiB0ZXJtcyBvZiAxLzQtcGVsIHVuaXRzOyB1c2VkIHRvIAotICogICAgICAgICAgICBjb21wdXRlIG1vdGlvbiBjb3N0IAotICogICBwU3JjRHN0QmVzdE1WIC0gVGhlIGJlc3QgTVYgcmVzdWx0aW5nIGZyb20gYSBwcmlvciBoYWxmLXBlbCBzZWFyY2gsIAotICogICAgICAgICAgICByZXByZXNlbnRlZCBpbiB0ZXJtcyBvZiAxLzQgcGVsIHVuaXRzIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0QmVzdE1WIC0gQmVzdCBNViByZXN1bHRpbmcgZnJvbSB0aGUgcXVhcnRlci1wZWwgc2VhcmNoLCBleHByZXNzZWQgCi0gKiAgICAgICAgICAgIGluIHRlcm1zIG9mIDEvNC1wZWwgdW5pdHMgCi0gKiAgIHBCZXN0Q29zdCAtIE1vdGlvbiBjb3N0IGFzc29jaWF0ZWQgd2l0aCB0aGUgYmVzdCBNVjsgY29tcHV0ZWQgYXMgCi0gKiAgICAgICAgICAgIFNBRCtMYW1kYSpCaXRzVXNlZEJ5TVYgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgT25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcFNyY09yZ1ksIHBTcmNSZWZZLCBwU3JjRHN0QmVzdE1WLCBwTVZQcmVkLCBwQmVzdENvc3QgCi0gKiAgICAtICAgIGlCbG9ja1dpZHRoIG9yIGlCbG9ja0hlaWdodCBhcmUgZXF1YWwgdG8gdmFsdWVzIG90aGVyIHRoYW4gNCwgOCwgb3IgMTYuIAotICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9CbG9ja01hdGNoX1F1YXJ0ZXIgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY09yZ1ksCi0gICAgT01YX1MzMiBuU3JjT3JnU3RlcCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZZLAotICAgIE9NWF9TMzIgblNyY1JlZlN0ZXAsCi0gICAgT01YX1U4IGlCbG9ja1dpZHRoLAotICAgIE9NWF9VOCBpQmxvY2tIZWlnaHQsCi0gICAgT01YX1UzMiBuTGFtZGEsCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBNVlByZWQsCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNEc3RCZXN0TVYsCi0gICAgT01YX1MzMiAqcEJlc3RDb3N0Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfTW90aW9uRXN0aW1hdGlvbk1CICAgKDYuMy41LjMuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIE1CLWxldmVsIG1vdGlvbiBlc3RpbWF0aW9uIGFuZCBzZWxlY3RzIGJlc3QgbW90aW9uIGVzdGltYXRpb24gCi0gKiBzdHJhdGVneSBmcm9tIHRoZSBzZXQgb2YgbW9kZXMgc3VwcG9ydGVkIGluIGJhc2VsaW5lIHByb2ZpbGUgW0lTTzE0NDk2LTEwXS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0N1cnJCdWYgLSBQb2ludGVyIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmU7IAotICogICAgICAgICAgICAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKLSAqICAgcFNyY1JlZkJ1Zkxpc3QgLSBQb2ludGVyIHRvIGFuIGFycmF5IHdpdGggMTYgZW50cmllcy4gIEVhY2ggZW50cnkgcG9pbnRzIAotICogICAgICAgICAgICB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjby1sb2NhdGVkIE1CIGluIGEgcmVmZXJlbmNlIAotICogICAgICAgICAgICBwaWN0dXJlLiAgVGhlIGFycmF5IGlzIGZpbGxlZCBmcm9tIGxvdy10by1oaWdoIHdpdGggdmFsaWQgCi0gKiAgICAgICAgICAgIHJlZmVyZW5jZSBmcmFtZSBwb2ludGVyczsgdGhlIHVudXNlZCBoaWdoIGVudHJpZXMgc2hvdWxkIGJlIHNldCAKLSAqICAgICAgICAgICAgdG8gTlVMTC4gIE9yZGVyaW5nIG9mIHRoZSByZWZlcmVuY2UgZnJhbWVzIHNob3VsZCBmb2xsb3cgCi0gKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gc3ViY2xhdXNlIDguMi40ICBEZWNvZGluZyBQcm9jZXNzIGZvciBSZWZlcmVuY2UgCi0gKiAgICAgICAgICAgIFBpY3R1cmUgTGlzdHMuICAgVGhlIGVudHJpZXMgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIAotICogICBwU3JjUmVjQnVmIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjby1sb2NhdGVkIE1CIGluIHRoZSAKLSAqICAgICAgICAgICAgcmVjb25zdHJ1Y3RlZCBwaWN0dXJlOyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gCi0gKiAgIFNyY0N1cnJTdGVwIC0gV2lkdGggb2YgdGhlIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKLSAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAotICogICBTcmNSZWZTdGVwIC0gV2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCi0gKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgU3JjUmVjU3RlcCAtIFdpZHRoIG9mIHRoZSByZWNvbnN0cnVjdGVkIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKLSAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAotICogICBwUmVmUmVjdCAtIFBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlZmVyZW5jZSByZWN0YW5nbGU7IHJlbGF0aXZlIHRvIHRoZSAKLSAqICAgICAgICAgICAgaW1hZ2Ugb3JpZ2luLiAKLSAqICAgcEN1cnJQb2ludFBvcyAtIFBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUuIAotICogICBMYW1iZGEgLSBMYWdyYW5nZSBmYWN0b3IgZm9yIGNvbXB1dGluZyB0aGUgY29zdCBmdW5jdGlvbiAKLSAqICAgcE1FU3BlYyAtIFBvaW50ZXIgdG8gdGhlIG1vdGlvbiBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gc3RydWN0dXJlOyBtdXN0IAotICogICAgICAgICAgICBoYXZlIGJlZW4gYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZCBwcmlvciB0byBjYWxsaW5nIHRoaXMgCi0gKiAgICAgICAgICAgIGZ1bmN0aW9uLiAKLSAqICAgcE1CSW50ZXIgLSBBcnJheSwgb2YgZGltZW5zaW9uIGZvdXIsIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gaW5mb3JtYXRpb24gCi0gKiAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCBmb3VyIGFkamFjZW50IHR5cGUgSU5URVIgTUJzIChMZWZ0LCBUb3AsIAotICogICAgICAgICAgICBUb3AtTGVmdCwgVG9wLVJpZ2h0KS4gQW55IHBvaW50ZXIgaW4gdGhlIGFycmF5IG1heSBiZSBzZXQgZXF1YWwgCi0gKiAgICAgICAgICAgIHRvIE5VTEwgaWYgdGhlIGNvcnJlc3BvbmRpbmcgTUIgZG9lc24gdCBleGlzdCBvciBpcyBub3Qgb2YgdHlwZSAKLSAqICAgICAgICAgICAgSU5URVIuIAotICogICAgICAgICAgICAtICBwTUJJbnRlclswXSAtIFBvaW50ZXIgdG8gbGVmdCBNQiBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgLSAgcE1CSW50ZXJbMV0gLSBQb2ludGVyIHRvIHRvcCBNQiBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgLSAgcE1CSW50ZXJbMl0gLSBQb2ludGVyIHRvIHRvcC1sZWZ0IE1CIGluZm9ybWF0aW9uIAotICogICAgICAgICAgICAtICBwTUJJbnRlclszXSAtIFBvaW50ZXIgdG8gdG9wLXJpZ2h0IE1CIGluZm9ybWF0aW9uIAotICogICBwTUJJbnRyYSAtIEFycmF5LCBvZiBkaW1lbnNpb24gZm91ciwgY29udGFpbmluZyBwb2ludGVycyB0byBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIGZvdXIgYWRqYWNlbnQgdHlwZSBJTlRSQSBNQnMgKExlZnQsIFRvcCwgCi0gKiAgICAgICAgICAgIFRvcC1MZWZ0LCBUb3AtUmlnaHQpLiBBbnkgcG9pbnRlciBpbiB0aGUgYXJyYXkgbWF5IGJlIHNldCBlcXVhbCAKLSAqICAgICAgICAgICAgdG8gTlVMTCBpZiB0aGUgY29ycmVzcG9uZGluZyBNQiBkb2VzbiB0IGV4aXN0IG9yIGlzIG5vdCBvZiB0eXBlIAotICogICAgICAgICAgICBJTlRSQS4gCi0gKiAgICAgICAgICAgIC0gIHBNQkludHJhWzBdIC0gUG9pbnRlciB0byBsZWZ0IE1CIGluZm9ybWF0aW9uIAotICogICAgICAgICAgICAtICBwTUJJbnRyYVsxXSAtIFBvaW50ZXIgdG8gdG9wIE1CIGluZm9ybWF0aW9uIAotICogICAgICAgICAgICAtICBwTUJJbnRyYVsyXSAtIFBvaW50ZXIgdG8gdG9wLWxlZnQgTUIgaW5mb3JtYXRpb24gCi0gKiAgICAgICAgICAgIC0gIHBNQkludHJhWzNdIC0gUG9pbnRlciB0byB0b3AtcmlnaHQgTUIgaW5mb3JtYXRpb24gCi0gKiAgIHBTcmNEc3RNQkN1cnIgLSBQb2ludGVyIHRvIGluZm9ybWF0aW9uIHN0cnVjdHVyZSBmb3IgdGhlIGN1cnJlbnQgTUIuICAKLSAqICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBlbnRyaWVzIHNob3VsZCBiZSBzZXQgcHJpb3IgdG8gY2FsbGluZyB0aGUgCi0gKiAgICAgICAgICAgIGZ1bmN0aW9uOiAgc2xpY2VJRCAtIHRoZSBudW1iZXIgb2YgdGhlIHNsaWNlIHRoZSB0byB3aGljaCB0aGUgCi0gKiAgICAgICAgICAgIGN1cnJlbnQgTUIgYmVsb25ncy4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RDb3N0IC0gUG9pbnRlciB0byB0aGUgbWluaW11bSBtb3Rpb24gY29zdCBmb3IgdGhlIGN1cnJlbnQgTUIuIAotICogICBwRHN0QmxvY2tTQUQgLSBQb2ludGVyIHRvIHRoZSBhcnJheSBvZiBTQURzIGZvciBlYWNoIG9mIHRoZSBzaXh0ZWVuIGx1bWEgCi0gKiAgICAgICAgICAgIDR4NCBibG9ja3MgaW4gZWFjaCBNQi4gIFRoZSBibG9jayBTQURzIGFyZSBpbiBzY2FuIG9yZGVyIGZvciAKLSAqICAgICAgICAgICAgZWFjaCBNQi4gIEZvciBpbXBsZW1lbnRhdGlvbnMgdGhhdCBjYW5ub3QgY29tcHV0ZSB0aGUgU0FEIHZhbHVlcyAKLSAqICAgICAgICAgICAgaW5kaXZpZHVhbGx5LCB0aGUgbWF4aW11bSBwb3NzaWJsZSB2YWx1ZSAoMHhmZmZmKSBpcyByZXR1cm5lZCAKLSAqICAgICAgICAgICAgZm9yIGVhY2ggb2YgdGhlIDE2IGJsb2NrIFNBRCBlbnRyaWVzLiAKLSAqICAgcFNyY0RzdE1CQ3VyciAtIFBvaW50ZXIgdG8gdXBkYXRlZCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBjdXJyZW50IAotICogICAgICAgICAgICBNQiBhZnRlciBNQi1sZXZlbCBtb3Rpb24gZXN0aW1hdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQuICBUaGUgCi0gKiAgICAgICAgICAgIGZvbGxvd2luZyBmaWVsZHMgYXJlIHVwZGF0ZWQgYnkgdGhlIE1FIGZ1bmN0aW9uLiAgIFRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgIHBhcmFtZXRlciBzZXQgcXVhbnRpZmllcyB0aGUgTUItbGV2ZWwgTUUgc2VhcmNoIHJlc3VsdHM6IAotICogICAgICAgICAgICAtICBNYlR5cGUgCi0gKiAgICAgICAgICAgIC0gIHN1Yk1CVHlwZVs0XSAKLSAqICAgICAgICAgICAgLSAgcE1WMFs0XVs0XSAKLSAqICAgICAgICAgICAgLSAgcE1WUHJlZFs0XVs0XSAKLSAqICAgICAgICAgICAgLSAgcFJlZkwwSWR4WzRdIAotICogICAgICAgICAgICAtICBJbnRyYTE2eDE2UHJlZE1vZGUgCi0gKiAgICAgICAgICAgIC0gIHBJbnRyYTR4NFByZWRNb2RlWzRdWzRdIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgT25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjQ3VyckJ1ZiwgCi0gKiAgICAgICAgICAgcFNyY1JlZkJ1Zkxpc3QsIHBTcmNSZWNCdWYsIHBSZWZSZWN0LCBwQ3VyclBvaW50UG9zLCBwTUVTcGVjLCAKLSAqICAgICAgICAgICBwTUJJbnRlciwgcE1CSW50cmEscFNyY0RzdE1CQ3VyciwgcERzdENvc3QsIHBTcmNSZWZCdWZMaXN0WzBdIAotICogICAgLSAgICBTcmNSZWZTdGVwLCBTcmNSZWNTdGVwIGFyZSBub3QgbXVsdGlwbGVzIG9mIDE2IAotICogICAgLSAgICBpQmxvY2tXaWR0aCBvciBpQmxvY2tIZWlnaHQgYXJlIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2LiAKLSAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfTW90aW9uRXN0aW1hdGlvbk1CICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAotICAgIE9NWF9TMzIgU3JjQ3VyclN0ZXAsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmTGlzdFsxNV0sCi0gICAgT01YX1MzMiBTcmNSZWZTdGVwLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlY0J1ZiwKLSAgICBPTVhfUzMyIFNyY1JlY1N0ZXAsCi0gICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCi0gICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKLSAgICBPTVhfVTMyIExhbWJkYSwKLSAgICB2b2lkICpwTUVTcGVjLAotICAgIGNvbnN0IE9NWFZDTTRQMTBNQkluZm9QdHIgKnBNQkludGVyLAotICAgIGNvbnN0IE9NWFZDTTRQMTBNQkluZm9QdHIgKnBNQkludHJhLAotICAgIE9NWFZDTTRQMTBNQkluZm9QdHIgcFNyY0RzdE1CQ3VyciwKLSAgICBPTVhfSU5UICpwRHN0Q29zdCwKLSAgICBPTVhfVTE2ICpwRHN0QmxvY2tTQUQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TQURfNHggICAoNi4zLjUuNC4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgZm9yIDR4OCBhbmQgNHg0IGJsb2Nrcy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY09yZyAtUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICogICBpU3RlcE9yZyAtU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgIHBTcmNSZWYgLVBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jayAKLSAqICAgaVN0ZXBSZWYgLVN0ZXAgb2YgdGhlIHJlZmVyZW5jZSBibG9jayBidWZmZXIgCi0gKiAgIGlIZWlnaHQgLUhlaWdodCBvZiB0aGUgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQgb3IgOC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RTQUQgLVBvaW50ZXIgb2YgcmVzdWx0IFNBRCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBPbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwU3JjT3JnLCBwU3JjUmVmLCBvciBwRHN0U0FEIAotICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgNCBvciA4LiAKLSAqICAgIC0gICAgaVN0ZXBPcmcgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKLSAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfU0FEXzR4ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNPcmcsCi0gICAgT01YX1UzMiBpU3RlcE9yZywKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYsCi0gICAgT01YX1UzMiBpU3RlcFJlZiwKLSAgICBPTVhfUzMyICpwRHN0U0FELAotICAgIE9NWF9VMzIgaUhlaWdodAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1NBRFF1YXJfNHggICAoNi4zLjUuNC4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgYmV0d2VlbiBvbmUgYmxvY2sgKHBTcmMpIGFuZCB0aGUgYXZlcmFnZSAKLSAqIG9mIHRoZSBvdGhlciB0d28gKHBTcmNSZWYwIGFuZCBwU3JjUmVmMSkgZm9yIDR4OCBvciA0eDQgYmxvY2tzLiAgUm91bmRpbmcgCi0gKiBpcyBhcHBsaWVkIGFjY29yZGluZyB0byB0aGUgY29udmVudGlvbiAoYStiKzEpPj4xLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICogICBwU3JjUmVmMCAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiAgIHBTcmNSZWYxIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMSAKLSAqICAgaVNyY1N0ZXAgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgaVJlZlN0ZXAwIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMCAKLSAqICAgaVJlZlN0ZXAxIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMSAKLSAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQgb3IgOC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RTQUQgLSBQb2ludGVyIG9mIHJlc3VsdCBTQUQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDQgb3IgOC4gCi0gKiAgICAtICAgIE9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcFNyY1JlZjAsIAotICogICAgICAgICAgICAgIHBTcmNSZWYxLCBwRHN0U0FELiAKLSAqICAgIC0gICAgaVNyY1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKLSAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfU0FEUXVhcl80eCAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZjAsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmMSwKLSAgICBPTVhfVTMyIGlTcmNTdGVwLAotICAgIE9NWF9VMzIgaVJlZlN0ZXAwLAotICAgIE9NWF9VMzIgaVJlZlN0ZXAxLAotICAgIE9NWF9VMzIgKnBEc3RTQUQsCi0gICAgT01YX1UzMiBpSGVpZ2h0Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU0FEUXVhcl84eCAgICg2LjMuNS40LjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBiZXR3ZWVuIG9uZSBibG9jayAocFNyYykgYW5kIHRoZSBhdmVyYWdlIAotICogb2YgdGhlIG90aGVyIHR3byAocFNyY1JlZjAgYW5kIHBTcmNSZWYxKSBmb3IgOHgxNiwgOHg4LCBvciA4eDQgYmxvY2tzLiAgCi0gKiBSb3VuZGluZyBpcyBhcHBsaWVkIGFjY29yZGluZyB0byB0aGUgY29udmVudGlvbiAoYStiKzEpPj4xLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqICAgcFNyY1JlZjAgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAwIAotICogICBwU3JjUmVmMSAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiAgIGlTcmNTdGVwIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIGlSZWZTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiAgIGlSZWZTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGJsb2NrOyBtdXN0IGJlIGVxdWFsIGVpdGhlciA0LCA4LCBvciAxNi4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RTQUQgLSBQb2ludGVyIG9mIHJlc3VsdCBTQUQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKLSAqICAgIC0gICAgT25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwU3JjUmVmMCwgCi0gKiAgICAgICAgICAgICAgcFNyY1JlZjEsIHBEc3RTQUQuIAotICogICAgLSAgICBpU3JjU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4IAotICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9TQURRdWFyXzh4ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmMsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmMCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYxLAotICAgIE9NWF9VMzIgaVNyY1N0ZXAsCi0gICAgT01YX1UzMiBpUmVmU3RlcDAsCi0gICAgT01YX1UzMiBpUmVmU3RlcDEsCi0gICAgT01YX1UzMiAqcERzdFNBRCwKLSAgICBPTVhfVTMyIGlIZWlnaHQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TQURRdWFyXzE2eCAgICg2LjMuNS40LjQpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBiZXR3ZWVuIG9uZSBibG9jayAocFNyYykgYW5kIHRoZSBhdmVyYWdlIAotICogb2YgdGhlIG90aGVyIHR3byAocFNyY1JlZjAgYW5kIHBTcmNSZWYxKSBmb3IgMTZ4MTYgb3IgMTZ4OCBibG9ja3MuICAKLSAqIFJvdW5kaW5nIGlzIGFwcGxpZWQgYWNjb3JkaW5nIHRvIHRoZSBjb252ZW50aW9uIChhK2IrMSk+PjEuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICogICBwU3JjUmVmMCAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiAgIHBTcmNSZWYxIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMSAKLSAqICAgaVNyY1N0ZXAgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNiAKLSAqICAgaVJlZlN0ZXAwIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMCAKLSAqICAgaVJlZlN0ZXAxIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMSAKLSAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDggb3IgMTYgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RTQUQgLVBvaW50ZXIgb2YgcmVzdWx0IFNBRCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgOCBvciAxNi4gCi0gKiAgICAtICAgIE9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcFNyY1JlZjAsIAotICogICAgICAgICAgICAgIHBTcmNSZWYxLCBwRHN0U0FELiAKLSAqICAgIC0gICAgaVNyY1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYgCi0gKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1NBRFF1YXJfMTZ4ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmMsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmMCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYxLAotICAgIE9NWF9VMzIgaVNyY1N0ZXAsCi0gICAgT01YX1UzMiBpUmVmU3RlcDAsCi0gICAgT01YX1UzMiBpUmVmU3RlcDEsCi0gICAgT01YX1UzMiAqcERzdFNBRCwKLSAgICBPTVhfVTMyIGlIZWlnaHQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TQVREXzR4NCAgICg2LjMuNS40LjUpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIHN1bSBvZiBhYnNvbHV0ZSB0cmFuc2Zvcm0gZGlmZmVyZW5jZXMgKFNBVEQpIAotICogZm9yIGEgNHg0IGJsb2NrIGJ5IGFwcGx5aW5nIGEgSGFkYW1hcmQgdHJhbnNmb3JtIHRvIHRoZSBkaWZmZXJlbmNlIGJsb2NrIAotICogYW5kIHRoZW4gY2FsY3VsYXRpbmcgdGhlIHN1bSBvZiBhYnNvbHV0ZSBjb2VmZmljaWVudCB2YWx1ZXMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNPcmcgLSBQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeSAKLSAqICAgaVN0ZXBPcmcgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IAotICogICBwU3JjUmVmIC0gUG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5IAotICogICBpU3RlcFJlZiAtIFN0ZXAgb2YgdGhlIHJlZmVyZW5jZSBibG9jayBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0U0FEIC0gcG9pbnRlciB0byB0aGUgcmVzdWx0aW5nIFNBRCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwU3JjT3JnLCBwU3JjUmVmLCBvciBwRHN0U0FEIGVpdGhlciBwU3JjT3JnIAotICogICAgLSAgICBwU3JjUmVmIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAotICogICAgLSAgICBpU3RlcE9yZyA8PSAwIG9yIGlTdGVwT3JnIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCi0gKiAgICAtICAgIGlTdGVwUmVmIDw9IDAgb3IgaVN0ZXBSZWYgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1NBVERfNHg0ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNPcmcsCi0gICAgT01YX1UzMiBpU3RlcE9yZywKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYsCi0gICAgT01YX1UzMiBpU3RlcFJlZiwKLSAgICBPTVhfVTMyICpwRHN0U0FECi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEgICAoNi4zLjUuNS4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciB0d28gaG9yaXpvbnRhbCAxLzItcGVsIHBvc2l0aW9ucyAKLSAqICgtMS8yLDApIGFuZCAoMS8yLCAwKSAtIGFyb3VuZCBhIGZ1bGwtcGVsIHBvc2l0aW9uLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBibG9jayB1c2VkIHRvIGludGVycG9sYXRlIGluIAotICogICAgICAgICAgICB0aGUgcmVjb25zdHJ1Y3Rpb24gZnJhbWUgcGxhbmUuIAotICogICBpU3JjU3RlcCAtIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuIAotICogICBpRHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlcjsgbXVzdCBiZSBhIAotICogICAgICAgICAgICBtdWx0aXBsZSBvZiBpV2lkdGguIAotICogICBpV2lkdGggLSBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jazsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYgCi0gKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gNCwgOCwgb3IgMTYgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RMZWZ0IC1Qb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgbGVmdCAtcGVsIHBvc2l0aW9uIAotICogICAgICAgICAgICAoLTEvMiwgMCkgCi0gKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBwRHN0UmlnaHQgLVBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSByaWdodCAtcGVsIAotICogICAgICAgICAgICBwb3NpdGlvbiAoMS8yLCAwKSAKLSAqICAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgICAgIHBTcmMsIHBEc3RMZWZ0LCBvciBwRHN0UmlnaHQgCi0gKiAgICAtICAgIGlXaWR0aCBvciBpSGVpZ2h0IGhhdmUgdmFsdWVzIG90aGVyIHRoYW4gNCwgOCwgb3IgMTYgCi0gKiAgICAtICAgIGlXaWR0aD09NCBidXQgcERzdExlZnQgYW5kL29yIHBEc3RSaWdodCBpcy9hcmUgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCi0gKiAgICAtICAgIGlXaWR0aD09OCBidXQgcERzdExlZnQgYW5kL29yIHBEc3RSaWdodCBpcy9hcmUgbm90IGFsaWduZWQgb24gYSA4LWJ5dGUgYm91bmRhcnkgCi0gKiAgICAtICAgIGlXaWR0aD09MTYgYnV0IHBEc3RMZWZ0IGFuZC9vciBwRHN0UmlnaHQgaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeSAKLSAqICAgIC0gICAgYW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKLSAgICBPTVhfVTMyIGlTcmNTdGVwLAotICAgIE9NWF9VOCAqcERzdExlZnQsCi0gICAgT01YX1U4ICpwRHN0UmlnaHQsCi0gICAgT01YX1UzMiBpRHN0U3RlcCwKLSAgICBPTVhfVTMyIGlXaWR0aCwKLSAgICBPTVhfVTMyIGlIZWlnaHQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYSAgICg2LjMuNS41LjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yIHR3byB2ZXJ0aWNhbCAxLzItcGVsIHBvc2l0aW9ucyAtIAotICogKDAsIC0xLzIpIGFuZCAoMCwgMS8yKSAtIGFyb3VuZCBhIGZ1bGwtcGVsIHBvc2l0aW9uLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sgdXNlZCB0byBpbnRlcnBvbGF0ZSBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJlY29uc3RydWN0ZWQgZnJhbWUgcGxhbmUgCi0gKiAgIGlTcmNTdGVwIC0gU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4gCi0gKiAgIGlEc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gKGludGVycG9sYXRpb24pIGJ1ZmZlcjsgbXVzdCBiZSBhIAotICogICAgICAgICAgICBtdWx0aXBsZSBvZiBpV2lkdGguIAotICogICBpV2lkdGggLSBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jazsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYgCi0gKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2IAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0VXAgLVBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSAtcGVsIHBvc2l0aW9uIGFib3ZlIAotICogICAgICAgICAgICB0aGUgY3VycmVudCBmdWxsLXBlbCBwb3NpdGlvbiAoMCwgLTEvMikgCi0gKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTQsIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT04LCA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgcERzdERvd24gLVBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSAtcGVsIHBvc2l0aW9uIGJlbG93IAotICogICAgICAgICAgICB0aGUgY3VycmVudCBmdWxsLXBlbCBwb3NpdGlvbiAoMCwgMS8yKSAKLSAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09NCwgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTgsIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgICAgIHBTcmMsIHBEc3RVcCwgb3IgcERzdERvd24gCi0gKiAgICAtICAgIGlXaWR0aCBvciBpSGVpZ2h0IGhhdmUgdmFsdWVzIG90aGVyIHRoYW4gNCwgOCwgb3IgMTYgCi0gKiAgICAtICAgIGlXaWR0aD09NCBidXQgcERzdFVwIGFuZC9vciBwRHN0RG93biBpcy9hcmUgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCi0gKiAgICAtICAgIGlXaWR0aD09OCBidXQgcERzdFVwIGFuZC9vciBwRHN0RG93biBpcy9hcmUgbm90IGFsaWduZWQgb24gYSA4LWJ5dGUgYm91bmRhcnkgCi0gKiAgICAtICAgIGlXaWR0aD09MTYgYnV0IHBEc3RVcCBhbmQvb3IgcERzdERvd24gaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeSAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmMsCi0gICAgT01YX1UzMiBpU3JjU3RlcCwKLSAgICBPTVhfVTggKnBEc3RVcCwKLSAgICBPTVhfVTggKnBEc3REb3duLAotICAgIE9NWF9VMzIgaURzdFN0ZXAsCi0gICAgT01YX1UzMiBpV2lkdGgsCi0gICAgT01YX1UzMiBpSGVpZ2h0Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfQXZlcmFnZV80eCAgICg2LjMuNS41LjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGF2ZXJhZ2Ugb2YgdHdvIDR4NCwgNHg4IGJsb2Nrcy4gIFRoZSByZXN1bHQgCi0gKiBpcyByb3VuZGVkIGFjY29yZGluZyB0byAoYStiKzEpLzIuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBQcmVkMCAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMCAKLSAqICAgcFByZWQxIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAxIAotICogICBpUHJlZFN0ZXAwIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMDsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAotICogICBpUHJlZFN0ZXAxIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMTsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAotICogICBpRHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAotICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBibG9ja3M7IG11c3QgYmUgZWl0aGVyIDQgb3IgOC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RQcmVkIC0gUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICAgIHBQcmVkMCwgcFByZWQxLCBvciBwRHN0UHJlZCAKLSAqICAgIC0gICAgcERzdFByZWQgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCi0gKiAgICAtICAgIGlQcmVkU3RlcDAgPD0gMCBvciBpUHJlZFN0ZXAwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCi0gKiAgICAtICAgIGlQcmVkU3RlcDEgPD0gMCBvciBpUHJlZFN0ZXAxIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCi0gKiAgICAtICAgIGlEc3RTdGVwIDw9IDAgb3IgaURzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKLSAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDQgb3IgOCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0F2ZXJhZ2VfNHggKAotICAgIGNvbnN0IE9NWF9VOCAqcFByZWQwLAotICAgIGNvbnN0IE9NWF9VOCAqcFByZWQxLAotICAgIE9NWF9VMzIgaVByZWRTdGVwMCwKLSAgICBPTVhfVTMyIGlQcmVkU3RlcDEsCi0gICAgT01YX1U4ICpwRHN0UHJlZCwKLSAgICBPTVhfVTMyIGlEc3RTdGVwLAotICAgIE9NWF9VMzIgaUhlaWdodAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0Nocm9tYURDICAgKDYuMy41LjYuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgMngyIEhhZGFtYXJkIHRyYW5zZm9ybSBvZiBjaHJvbWEgREMgY29lZmZpY2llbnRzIAotICogYW5kIHRoZW4gcXVhbnRpemVzIHRoZSBjb2VmZmljaWVudHMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBQb2ludGVyIHRvIHRoZSAyeDIgYXJyYXkgb2YgY2hyb21hIERDIGNvZWZmaWNpZW50cy4gIDgtYnl0ZSAKLSAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKLSAqICAgYkludHJhIC0gSW5kaWNhdGUgd2hldGhlciB0aGlzIGlzIGFuIElOVFJBIGJsb2NrLiAxLUlOVFJBLCAwLUlOVEVSIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0cmFuc2Zvcm1lZCBhbmQgcXVhbnRpemVkIGNvZWZmaWNpZW50cy4gIDgtYnl0ZSAKLSAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICAgICAgcFNyY0RzdCAKLSAqICAgIC0gICAgcFNyY0RzdCBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9DaHJvbWFEQyAoCi0gICAgT01YX1MxNiAqcFNyY0RzdCwKLSAgICBPTVhfVTMyIGlRUCwKLSAgICBPTVhfVTggYkludHJhCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfTHVtYURDICAgKDYuMy41LjYuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgYSA0eDQgSGFkYW1hcmQgdHJhbnNmb3JtIG9mIGx1bWEgREMgY29lZmZpY2llbnRzIAotICogYW5kIHRoZW4gcXVhbnRpemVzIHRoZSBjb2VmZmljaWVudHMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBQb2ludGVyIHRvIHRoZSA0eDQgYXJyYXkgb2YgbHVtYSBEQyBjb2VmZmljaWVudHMuICAxNi1ieXRlIAotICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBpUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyOyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCw1MV0uIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0cmFuc2Zvcm1lZCBhbmQgcXVhbnRpemVkIGNvZWZmaWNpZW50cy4gIDE2LWJ5dGUgCi0gKiAgICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0RzdCAKLSAqICAgIC0gICAgcFNyY0RzdCBpcyBub3QgYWxpZ25lZCBvbiBhbiAxNi1ieXRlIGJvdW5kYXJ5IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfTHVtYURDICgKLSAgICBPTVhfUzE2ICpwU3JjRHN0LAotICAgIE9NWF9VMzIgaVFQCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9MdW1hREMgICAoNi4zLjUuNi4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnZlcnNlIDR4NCBIYWRhbWFyZCB0cmFuc2Zvcm0gYW5kIHRoZW4gZGVxdWFudGl6ZXMgCi0gKiB0aGUgY29lZmZpY2llbnRzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgNHg0IGFycmF5IG9mIHRoZSA0eDQgSGFkYW1hcmQtdHJhbnNmb3JtZWQgYW5kIAotICogICAgICAgICAgICBxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgMTYgYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBpUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyOyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCw1MV0uIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gUG9pbnRlciB0byBpbnZlcnNlLXRyYW5zZm9ybWVkIGFuZCBkZXF1YW50aXplZCBjb2VmZmljaWVudHMuICAKLSAqICAgICAgICAgICAgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYyAKLSAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeSAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfTHVtYURDICgKLSAgICBjb25zdCBPTVhfUzE2ICpwU3JjLAotICAgIE9NWF9TMTYgKnBEc3QsCi0gICAgT01YX1UzMiBpUVAKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0Nocm9tYURDICAgKDYuMy41LjYuNCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW52ZXJzZSAyeDIgSGFkYW1hcmQgdHJhbnNmb3JtIGFuZCB0aGVuIGRlcXVhbnRpemVzIAotICogdGhlIGNvZWZmaWNpZW50cy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIDJ4MiBhcnJheSBvZiB0aGUgMngyIEhhZGFtYXJkLXRyYW5zZm9ybWVkIGFuZCAKLSAqICAgICAgICAgICAgcXVhbnRpemVkIGNvZWZmaWNpZW50cy4gIDggYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBpUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyOyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCw1MV0uIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gUG9pbnRlciB0byBpbnZlcnNlLXRyYW5zZm9ybWVkIGFuZCBkZXF1YW50aXplZCBjb2VmZmljaWVudHMuICAKLSAqICAgICAgICAgICAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjIAotICogICAgLSAgICBwU3JjIG9yIHBEc3QgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9DaHJvbWFEQyAoCi0gICAgY29uc3QgT01YX1MxNiAqcFNyYywKLSAgICBPTVhfUzE2ICpwRHN0LAotICAgIE9NWF9VMzIgaVFQCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtUmVzaWR1YWxBbmRBZGQgICAoNi4zLjUuNy4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnZlcnNlIGFuIDR4NCBpbnRlZ2VyIHRyYW5zZm9ybWF0aW9uIHRvIHByb2R1Y2UgCi0gKiB0aGUgZGlmZmVyZW5jZSBzaWduYWwgYW5kIHRoZW4gYWRkcyB0aGUgZGlmZmVyZW5jZSB0byB0aGUgcHJlZGljdGlvbiB0byBnZXQgCi0gKiB0aGUgcmVjb25zdHJ1Y3RlZCBzaWduYWwuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNQcmVkIC0gUG9pbnRlciB0byBwcmVkaWN0aW9uIHNpZ25hbC4gIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBwRGVxdWFudENvZWZmIC0gUG9pbnRlciB0byB0aGUgdHJhbnNmb3JtZWQgY29lZmZpY2llbnRzLiAgOC1ieXRlIAotICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBpU3JjUHJlZFN0ZXAgLSBTdGVwIG9mIHRoZSBwcmVkaWN0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAotICogICBpRHN0UmVjb25TdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gcmVjb25zdHJ1Y3Rpb24gYnVmZmVyOyBtdXN0IGJlIGEgCi0gKiAgICAgICAgICAgIG11bHRpcGxlIG9mIDQuIAotICogICBiQUMgLSBJbmRpY2F0ZSB3aGV0aGVyIHRoZXJlIGlzIEFDIGNvZWZmaWNpZW50cyBpbiB0aGUgY29lZmZpY2llbnRzIAotICogICAgICAgICAgICBtYXRyaXguIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0UmVjb24gLVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIHJlY29uc3RydWN0aW9uIGJ1ZmZlci4gIDQtYnl0ZSAKLSAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICAgICBwU3JjUHJlZCwgcERlcXVhbnRDb2VmZiwgcERzdFJlY29uIAotICogICAgLSAgICBwU3JjUHJlZCBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKLSAqICAgIC0gICAgaVNyY1ByZWRTdGVwIG9yIGlEc3RSZWNvblN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgICAtICAgIHBEZXF1YW50Q29lZmYgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfSW52VHJhbnNmb3JtUmVzaWR1YWxBbmRBZGQgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1ByZWQsCi0gICAgY29uc3QgT01YX1MxNiAqcERlcXVhbnRDb2VmZiwKLSAgICBPTVhfVTggKnBEc3RSZWNvbiwKLSAgICBPTVhfVTMyIGlTcmNQcmVkU3RlcCwKLSAgICBPTVhfVTMyIGlEc3RSZWNvblN0ZXAsCi0gICAgT01YX1U4IGJBQwotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1N1YkFuZFRyYW5zZm9ybVFEUVJlc2lkdWFsICAgKDYuMy41LjguMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gc3VidHJhY3RzIHRoZSBwcmVkaWN0aW9uIHNpZ25hbCBmcm9tIHRoZSBvcmlnaW5hbCBzaWduYWwgdG8gCi0gKiBwcm9kdWNlIHRoZSBkaWZmZXJlbmNlIHNpZ25hbCBhbmQgdGhlbiBwZXJmb3JtcyBhIDR4NCBpbnRlZ2VyIHRyYW5zZm9ybSBhbmQgCi0gKiBxdWFudGl6YXRpb24uIFRoZSBxdWFudGl6ZWQgdHJhbnNmb3JtZWQgY29lZmZpY2llbnRzIGFyZSBzdG9yZWQgYXMgCi0gKiBwRHN0UXVhbnRDb2VmZi4gVGhpcyBmdW5jdGlvbiBjYW4gYWxzbyBvdXRwdXQgZGVxdWFudGl6ZWQgY29lZmZpY2llbnRzIG9yIAotICogdW5xdWFudGl6ZWQgREMgY29lZmZpY2llbnRzIG9wdGlvbmFsbHkgYnkgc2V0dGluZyB0aGUgcG9pbnRlcnMgCi0gKiBwRHN0RGVRdWFudENvZWZmLCBwRENDb2VmZi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY09yZyAtIFBvaW50ZXIgdG8gb3JpZ2luYWwgc2lnbmFsLiA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgcFNyY1ByZWQgLSBQb2ludGVyIHRvIHByZWRpY3Rpb24gc2lnbmFsLiA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgaVNyY09yZ1N0ZXAgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBzaWduYWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgCi0gKiAgICAgICAgICAgIDQuIAotICogICBpU3JjUHJlZFN0ZXAgLSBTdGVwIG9mIHRoZSBwcmVkaWN0aW9uIHNpZ25hbCBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSAKLSAqICAgICAgICAgICAgb2YgNC4gCi0gKiAgIHBOdW1Db2VmZiAtTnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyBhZnRlciBxdWFudGl6YXRpb24uIElmIHRoaXMgCi0gKiAgICAgICAgICAgIHBhcmFtZXRlciBpcyBub3QgcmVxdWlyZWQsIGl0IGlzIHNldCB0byBOVUxMLiAKLSAqICAgblRocmVzaFNBRCAtIFplcm8tYmxvY2sgZWFybHkgZGV0ZWN0aW9uIHRocmVzaG9sZC4gSWYgdGhpcyBwYXJhbWV0ZXIgaXMgCi0gKiAgICAgICAgICAgIG5vdCByZXF1aXJlZCwgaXQgaXMgc2V0IHRvIDAuIAotICogICBpUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyOyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCw1MV0uIAotICogICBiSW50cmEgLSBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIGlzIGFuIElOVFJBIGJsb2NrLCBlaXRoZXIgMS1JTlRSQSBvciAKLSAqICAgICAgICAgICAgMC1JTlRFUiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFF1YW50Q29lZmYgLSBQb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgdHJhbnNmb3JtZWQgY29lZmZpY2llbnRzLiAgCi0gKiAgICAgICAgICAgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBwRHN0RGVRdWFudENvZWZmIC0gUG9pbnRlciB0byB0aGUgZGVxdWFudGl6ZWQgdHJhbnNmb3JtZWQgY29lZmZpY2llbnRzIAotICogICAgICAgICAgICBpZiB0aGlzIHBhcmFtZXRlciBpcyBub3QgZXF1YWwgdG8gTlVMTC4gIDgtYnl0ZSBhbGlnbm1lbnQgCi0gKiAgICAgICAgICAgIHJlcXVpcmVkLiAKLSAqICAgcERDQ29lZmYgLSBQb2ludGVyIHRvIHRoZSB1bnF1YW50aXplZCBEQyBjb2VmZmljaWVudCBpZiB0aGlzIHBhcmFtZXRlciAKLSAqICAgICAgICAgICAgaXMgbm90IGVxdWFsIHRvIE5VTEwuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgICAgIHBTcmNPcmcsIHBTcmNQcmVkLCBwTnVtQ29lZmYsIHBEc3RRdWFudENvZWZmLCAKLSAqICAgICAgICAgICAgcERzdERlUXVhbnRDb2VmZiwgcERDQ29lZmYgCi0gKiAgICAtICAgIHBTcmNPcmcgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCi0gKiAgICAtICAgIHBTcmNQcmVkIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAotICogICAgLSAgICBpU3JjT3JnU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAotICogICAgLSAgICBpU3JjUHJlZFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKLSAqICAgIC0gICAgcERzdFF1YW50Q29lZmYgb3IgcERzdERlUXVhbnRDb2VmZiBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9TdWJBbmRUcmFuc2Zvcm1RRFFSZXNpZHVhbCAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjT3JnLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1ByZWQsCi0gICAgT01YX1UzMiBpU3JjT3JnU3RlcCwKLSAgICBPTVhfVTMyIGlTcmNQcmVkU3RlcCwKLSAgICBPTVhfUzE2ICpwRHN0UXVhbnRDb2VmZiwKLSAgICBPTVhfUzE2ICpwRHN0RGVRdWFudENvZWZmLAotICAgIE9NWF9TMTYgKnBEQ0NvZWZmLAotICAgIE9NWF9TOCAqcE51bUNvZWZmLAotICAgIE9NWF9VMzIgblRocmVzaFNBRCwKLSAgICBPTVhfVTMyIGlRUCwKLSAgICBPTVhfVTggYkludHJhCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfR2V0VkxDSW5mbyAgICg2LjMuNS45LjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGV4dHJhY3RzIHJ1bi1sZW5ndGggZW5jb2RpbmcgKFJMRSkgaW5mb3JtYXRpb24gZnJvbSB0aGUgCi0gKiBjb2VmZmljaWVudCBtYXRyaXguICBUaGUgcmVzdWx0cyBhcmUgcmV0dXJuZWQgaW4gYW4gT01YVkNNNFAxMFZMQ0luZm8gCi0gKiBzdHJ1Y3R1cmUuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNDb2VmZiAtIHBvaW50ZXIgdG8gdGhlIHRyYW5zZm9ybSBjb2VmZmljaWVudCBtYXRyaXguICA4LWJ5dGUgCi0gKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIHBTY2FuTWF0cml4IC0gcG9pbnRlciB0byB0aGUgc2NhbiBvcmRlciBkZWZpbml0aW9uIG1hdHJpeC4gIEZvciBhIGx1bWEgCi0gKiAgICAgICAgICAgIGJsb2NrIHRoZSBzY2FuIG1hdHJpeCBzaG91bGQgZm9sbG93IFtJU08xNDQ5Ni0xMF0gc2VjdGlvbiA4LjUuNCwgCi0gKiAgICAgICAgICAgIGFuZCBzaG91bGQgY29udGFpbiB0aGUgdmFsdWVzIDAsIDEsIDQsIDgsIDUsIDIsIDMsIDYsIDksIDEyLCAxMywgCi0gKiAgICAgICAgICAgIDEwLCA3LCAxMSwgMTQsIDE1LiAgRm9yIGEgY2hyb21hIGJsb2NrLCB0aGUgc2NhbiBtYXRyaXggc2hvdWxkIAotICogICAgICAgICAgICBjb250YWluIHRoZSB2YWx1ZXMgMCwgMSwgMiwgMy4gCi0gKiAgIGJBQyAtIGluZGljYXRlcyBwcmVzZW5jZSBvZiBhIERDIGNvZWZmaWNpZW50OyAwID0gREMgY29lZmZpY2llbnQgCi0gKiAgICAgICAgICAgIHByZXNlbnQsIDE9IERDIGNvZWZmaWNpZW50IGFic2VudC4gCi0gKiAgIE1heE51bUNvZWYgLSBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgY29udGFpbmVkIGluIHRoZSAKLSAqICAgICAgICAgICAgdHJhbnNmb3JtIGNvZWZmaWNpZW50IG1hdHJpeCwgcFNyY0NvZWZmLiBUaGUgdmFsdWUgc2hvdWxkIGJlIDE2IAotICogICAgICAgICAgICBmb3IgYmxvY2tzIG9mIHR5cGUgTFVNQURDLCBMVU1BQUMsIExVTUFMRVZFTCwgYW5kIENIUk9NQUFDLiBUaGUgCi0gKiAgICAgICAgICAgIHZhbHVlIHNob3VsZCBiZSA0IGZvciBibG9ja3Mgb2YgdHlwZSBDSFJPTUFEQy4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RWTENJbmZvIC0gcG9pbnRlciB0byBzdHJ1Y3R1cmUgdGhhdCBzdG9yZXMgaW5mb3JtYXRpb24gZm9yIAotICogICAgICAgICAgICBydW4tbGVuZ3RoIGNvZGluZy4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgICAgcFNyY0NvZWZmLCBwU2Nhbk1hdHJpeCwgcERzdFZMQ0luZm8gCi0gKiAgICAtICAgIHBTcmNDb2VmZiBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9HZXRWTENJbmZvICgKLSAgICBjb25zdCBPTVhfUzE2ICpwU3JjQ29lZmYsCi0gICAgY29uc3QgT01YX1U4ICpwU2Nhbk1hdHJpeCwKLSAgICBPTVhfVTggYkFDLAotICAgIE9NWF9VMzIgTWF4TnVtQ29lZiwKLSAgICBPTVhWQ000UDEwVkxDSW5mbypwRHN0VkxDSW5mbwotKTsKLQotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiogZW5kIG9mICNkZWZpbmUgX09NWFZDX0hfICovCi0KLS8qKiBFT0YgKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9hcm1WQ0NPTU1fQXZlcmFnZS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9hcm1WQ0NPTU1fQXZlcmFnZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2IzN2JmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvYXJtVkNDT01NX0F2ZXJhZ2UuYworKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ0NPTU1fQXZlcmFnZS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgQXZlcmFnZSBvZiB0d28gYmxvY2tzIGlmIHNpemUgaVdpZHRoIFggaUhlaWdodAotICogCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ0NPTU1fQXZlcmFnZQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBhdmVyYWdlIG9mIHR3byBibG9ja3MgYW5kIHN0b3JlcyB0aGUgcmVzdWx0LgotICoKLSAqIFJlbWFya3M6Ci0gKgotICoJW2luXQlwUHJlZDAJCQlQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDAKLSAqCVtpbl0JcFByZWQxCQkJUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAxCi0gKglbaW5dCWlQcmVkU3RlcDAJICAgIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAKLSAqCVtpbl0JaVByZWRTdGVwMQkgICAgU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMQotICoJW2luXQlpRHN0U3RlcCAJCVN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgotICoJW2luXQlpV2lkdGgJCQlXaWR0aCBvZiB0aGUgYmxvY2tzCi0gKglbaW5dCWlIZWlnaHQJCQlIZWlnaHQgb2YgdGhlIGJsb2NrcwotICoJW291dF0JcERzdFByZWQJCVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KLSAqCi0gKi8KLSBPTVhSZXN1bHQgYXJtVkNDT01NX0F2ZXJhZ2UgKAotCSBjb25zdCBPTVhfVTgqIAkgICAgcFByZWQwLAotCSBjb25zdCBPTVhfVTgqIAkgICAgcFByZWQxLAkKLQkgT01YX1UzMgkJaVByZWRTdGVwMCwKLQkgT01YX1UzMgkJaVByZWRTdGVwMSwKLQkgT01YX1U4KgkJcERzdFByZWQsCi0JIE9NWF9VMzIJCWlEc3RTdGVwLCAKLQkgT01YX1UzMgkJaVdpZHRoLAotCSBPTVhfVTMyCQlpSGVpZ2h0Ci0pCi17Ci0gICAgT01YX1UzMiAgICAgeCwgeTsKLQotICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLwotICAgIGFybVJldEFyZ0VycklmKHBQcmVkMCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwUHJlZDEgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocERzdFByZWQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0KLSAgICBmb3IgKHkgPSAwOyB5IDwgaUhlaWdodDsgeSsrKQotICAgIHsKLSAgICAgICAgZm9yICh4ID0gMDsgeCA8IGlXaWR0aDsgeCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBwRHN0UHJlZCBbeSAqIGlEc3RTdGVwICsgeF0gPSAKLSAgICAgICAgICAgICAgICAoT01YX1U4KSgoKE9NWF9VMzIpcFByZWQwIFt5ICogaVByZWRTdGVwMCArIHhdICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByZWQxIFt5ICogaVByZWRTdGVwMSArIHhdICsgMSkgPj4gMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvYXJtVkNDT01NX1NBRC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9hcm1WQ0NPTU1fU0FELmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1Yjk2ZGMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9hcm1WQ0NPTU1fU0FELmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNDT01NX1NBRC5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgU0FEIGZvciBOeE0gYmxvY2tzCi0gKiAKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ0NPTU1fU0FECi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZSB0aGUgU0FEIGZvciBOeE0gYmxvY2tzLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogW2luXQkJcFNyY09yZwkJUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2sKLSAqIFtpbl0JCWlTdGVwT3JnCVN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcgotICogW2luXQkJcFNyY1JlZgkJUG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrCi0gKiBbaW5dCQlpU3RlcFJlZglTdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyCi0gKiBbaW5dCQlpSGVpZ2h0CQlIZWlnaHQgb2YgdGhlIGJsb2NrCi0gKiBbaW5dCQlpV2lkdGgJCVdpZHRoIG9mIHRoZSBibG9jawotICogW291dF0JcERzdFNBRAkJUG9pbnRlciBvZiByZXN1bHQgU0FECi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgotICoKLSAqLwotT01YUmVzdWx0IGFybVZDQ09NTV9TQUQoCQotCWNvbnN0IE9NWF9VOCogCXBTcmNPcmcsCi0JT01YX1UzMiAJaVN0ZXBPcmcsCi0JY29uc3QgT01YX1U4KiAJcFNyY1JlZiwKLQlPTVhfVTMyIAlpU3RlcFJlZiwKLQlPTVhfUzMyKglwRHN0U0FELAotCU9NWF9VMzIJCWlIZWlnaHQsCi0JT01YX1UzMgkJaVdpZHRoCi0pCi17Ci0gICAgT01YX0lOVCAgICAgeCwgeTsKLSAgICAKLSAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjT3JnID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocERzdFNBRCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICAKLSAgICAqcERzdFNBRCA9IDA7Ci0gICAgZm9yICh5ID0gMDsgeSA8IGlIZWlnaHQ7IHkrKykKLSAgICB7Ci0gICAgICAgIGZvciAoeCA9IDA7IHggPCBpV2lkdGg7IHgrKykKLSAgICAgICAgewotICAgICAgICAgICAgKnBEc3RTQUQgKz0gYXJtQWJzKHBTcmNPcmcgWyh5ICogaVN0ZXBPcmcpICsgeF0gLSAKLSAgICAgICAgICAgICAgICAgICAgICAgcFNyY1JlZiBbKHkgKiBpU3RlcFJlZikgKyB4XSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9BdmVyYWdlXzE2eC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQXZlcmFnZV8xNnguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc1YmNhOC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9BdmVyYWdlXzE2eC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ0NPTU1fQXZlcmFnZV8xNnguYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIEF2ZXJhZ2Ugb2YgdHdvIDE2eDE2IG9yIDE2eDggYmxvY2tzCi0gKiAKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQXZlcmFnZV8xNnggICAoNi4xLjMuMS4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBhdmVyYWdlIG9mIHR3byAxNngxNiBvciAxNng4IGJsb2Nrcy4gIFRoZSAKLSAqIHJlc3VsdCBpcyByb3VuZGVkIGFjY29yZGluZyB0byAoYStiKzEpLzIuICBUaGUgYmxvY2sgYXZlcmFnZSBmdW5jdGlvbiBjYW4gCi0gKiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggaGFsZi1waXhlbCBpbnRlcnBvbGF0aW9uIHRvIG9idGFpbiBxdWFydGVyIAotICogcGl4ZWwgbW90aW9uIGVzdGltYXRlcywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0xMF0sIHN1YmNsYXVzZSA4LjQuMi4yLjEuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBQcmVkMCAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMCAKLSAqICAgcFByZWQxIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAxIAotICogICBpUHJlZFN0ZXAwIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMCAKLSAqICAgaVByZWRTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiAgIGlEc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyIAotICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBibG9ja3MgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RQcmVkIC0gUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiAxNi1ieXRlIGFsaWduZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKLSAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBQcmVkMCwgcFByZWQxLCBvciAKLSAqICAgICAgICAgICAgICBwRHN0UHJlZC4gCi0gKiAgICAtICAgcERzdFByZWQgaXMgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgIC0gICBpUHJlZFN0ZXAwIDw9IDAgb3IgaVByZWRTdGVwMCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgICAtICAgaVByZWRTdGVwMSA8PSAwIG9yIGlQcmVkU3RlcDEgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAotICogICAgLSAgIGlEc3RTdGVwIDw9IDAgb3IgaURzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAotICogICAgLSAgIGlIZWlnaHQgaXMgbm90IDggb3IgMTYuIAotICoKLSAqLwotIE9NWFJlc3VsdCBvbXhWQ0NPTU1fQXZlcmFnZV8xNnggKAotCSBjb25zdCBPTVhfVTgqIAkgICAgcFByZWQwLAotCSBjb25zdCBPTVhfVTgqIAkgICAgcFByZWQxLAkKLQkgT01YX1UzMgkJaVByZWRTdGVwMCwKLQkgT01YX1UzMgkJaVByZWRTdGVwMSwKLQkgT01YX1U4KgkJcERzdFByZWQsCi0JIE9NWF9VMzIJCWlEc3RTdGVwLCAKLQkgT01YX1UzMgkJaUhlaWdodAotKQotewotICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLwotICAgIGFybVJldEFyZ0VycklmKHBQcmVkMCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwUHJlZDEgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocERzdFByZWQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKGlIZWlnaHQgIT0gOCkgJiYgKGlIZWlnaHQgIT0gMTYpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3QxNkJ5dGVBbGlnbmVkKHBEc3RQcmVkKSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKGlQcmVkU3RlcDAgPT0gMCkgfHwgKGlQcmVkU3RlcDAgJiAxNSksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKChpUHJlZFN0ZXAxID09IDApIHx8IChpUHJlZFN0ZXAxICYgMTUpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZigoaURzdFN0ZXAgPT0gMCkgfHwgKGlEc3RTdGVwICYgMTUpLCBPTVhfU3RzX0JhZEFyZ0VycikKLQotICAgIHJldHVybiBhcm1WQ0NPTU1fQXZlcmFnZSAKLSAgICAgICAgKHBQcmVkMCwgcFByZWQxLCBpUHJlZFN0ZXAwLCBpUHJlZFN0ZXAxLCBwRHN0UHJlZCwgaURzdFN0ZXAsIDE2LCBpSGVpZ2h0KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0F2ZXJhZ2VfOHguYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0F2ZXJhZ2VfOHguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMxNGY0My4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9BdmVyYWdlXzh4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDQ09NTV9BdmVyYWdlXzh4LmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSBBdmVyYWdlIG9mIHR3byA4eDQgb3IgOHg4IG9yIDh4MTYgYmxvY2tzCi0gKiAKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQXZlcmFnZV84eCAgICg2LjEuMy4xLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGF2ZXJhZ2Ugb2YgdHdvIDh4NCwgOHg4LCBvciA4eDE2IGJsb2Nrcy4gIFRoZSAKLSAqIHJlc3VsdCBpcyByb3VuZGVkIGFjY29yZGluZyB0byAoYStiKzEpLzIuICBUaGUgYmxvY2sgYXZlcmFnZSBmdW5jdGlvbiBjYW4gCi0gKiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggaGFsZi1waXhlbCBpbnRlcnBvbGF0aW9uIHRvIG9idGFpbiBxdWFydGVyIAotICogcGl4ZWwgbW90aW9uIGVzdGltYXRlcywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0xMF0sIHN1YmNsYXVzZSA4LjQuMi4yLjEuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBQcmVkMCAgICAgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiAgIHBQcmVkMSAgICAgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiAgIGlQcmVkU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAotICogICBpUHJlZFN0ZXAxIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMSAKLSAqICAgaURzdFN0ZXAgICAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gCi0gKiAgIGlIZWlnaHQgICAgLSBIZWlnaHQgb2YgdGhlIGJsb2NrcyAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFByZWQgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuIDgtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCi0gKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwUHJlZDAsIHBQcmVkMSwgb3IgCi0gKiAgICAgICAgICAgICAgcERzdFByZWQuIAotICogICAgLSAgIHBEc3RQcmVkIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgICAtICAgaVByZWRTdGVwMCA8PSAwIG9yIGlQcmVkU3RlcDAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgICAtICAgaVByZWRTdGVwMSA8PSAwIG9yIGlQcmVkU3RlcDEgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgICAtICAgaURzdFN0ZXAgICA8PSAwIG9yIGlEc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICogICAgLSAgIGlIZWlnaHQgaXMgbm90IDQsIDgsIG9yIDE2LiAKLSAqCi0gKi8KLSBPTVhSZXN1bHQgb214VkNDT01NX0F2ZXJhZ2VfOHggKAkKLQkgY29uc3QgT01YX1U4KiAJICAgIHBQcmVkMCwKLQkgY29uc3QgT01YX1U4KiAJICAgIHBQcmVkMSwJCi0gICAgIE9NWF9VMzIJCWlQcmVkU3RlcDAsCi0gICAgIE9NWF9VMzIJCWlQcmVkU3RlcDEsCi0JIE9NWF9VOCoJCXBEc3RQcmVkLAotICAgICBPTVhfVTMyCQlpRHN0U3RlcCwgCi0JIE9NWF9VMzIJCWlIZWlnaHQKLSkKLXsKLSAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwUHJlZDAgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocFByZWQxID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBEc3RQcmVkID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKChpUHJlZFN0ZXAwID09IDApIHx8IChpUHJlZFN0ZXAwICYgNyksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKChpUHJlZFN0ZXAxID09IDApIHx8IChpUHJlZFN0ZXAxICYgNyksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKChpRHN0U3RlcCA9PSAwKSB8fCAoaURzdFN0ZXAgJiA3KSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKGlIZWlnaHQgIT0gNCkgJiYgKGlIZWlnaHQgIT0gOCkgJiYgKGlIZWlnaHQgIT0gMTYpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q4Qnl0ZUFsaWduZWQocERzdFByZWQpLCBPTVhfU3RzX0JhZEFyZ0VycikKLQotICAgIHJldHVybiBhcm1WQ0NPTU1fQXZlcmFnZSAKLSAgICAgICAgKHBQcmVkMCwgcFByZWQxLCBpUHJlZFN0ZXAwLCBpUHJlZFN0ZXAxLCBwRHN0UHJlZCwgaURzdFN0ZXAsIDgsIGlIZWlnaHQpOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2suYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9jay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWY1MjQwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9jay5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnRhaW5zIG1vZHVsZSBjb21wdXRpbmcgdGhlIGVycm9yIGZvciBhIE1CIG9mIHNpemUgOHg4Ci0gKiAKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2sgICAoNi4xLjQuMS4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29tcHV0ZXMgdGhlIHRleHR1cmUgZXJyb3Igb2YgdGhlIGJsb2NrLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgc291cmNlIHBsYW5lLiBUaGlzIHNob3VsZCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICogICBzcmNTdGVwIC0gc3RlcCBvZiB0aGUgc291cmNlIHBsYW5lIAotICogICBwU3JjUmVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJ1ZmZlciwgYW4gOHg4IGJsb2NrLiBUaGlzIHNob3VsZCBiZSAKLSAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLCBhbiA4eDggYmxvY2suIFRoaXMgc2hvdWxkIGJlIAotICogICAgICAgICAgICBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6Ci0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwU3JjLCBwU3JjUmVmLCBwRHN0LiAKLSAqICAgIC0gICAgcFNyYyBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBTcmNTdGVwIDw9IDAgb3Igc3JjU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgIC0gICAgcFNyY1JlZiBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBwRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZCAKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2soCi0gICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKLSAgICAgT01YX0lOVCBzcmNTdGVwLAotICAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYsCi0gICAgIE9NWF9TMTYgKiBwRHN0Ci0pCi17Ci0KLSAgICBPTVhfSU5UICAgICB4LCB5LCBjb3VudDsKLQotICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLwotICAgIGFybVJldEFyZ0VycklmKHBTcmMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCFhcm1JczhCeXRlQWxpZ25lZChwU3JjKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCFhcm1JczhCeXRlQWxpZ25lZChwU3JjUmVmKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCFhcm1JczhCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChzcmNTdGVwIDw9IDApIHx8IChzcmNTdGVwICYgNyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQotICAgIC8qIENhbGN1bGF0ZSB0aGUgZXJyb3IgYmxvY2sgKi8KLSAgICBmb3IgKHkgPSAwLCBjb3VudCA9IDA7Ci0gICAgICAgICB5IDwgODsKLSAgICAgICAgIHkrKywgcFNyYyArPSBzcmNTdGVwKQotICAgIHsKLSAgICAgICAgZm9yICh4ID0gMDsgeCA8IDg7IHgrKywgY291bnQrKykKLSAgICAgICAgewotICAgICAgICAgICAgcERzdFtjb3VudF0gPSBwU3JjW3hdIC0gcFNyY1JlZltjb3VudF07Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLQotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrX1NBRC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrX1NBRC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2Y0OGM5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9ja19TQUQuYworKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9ja19TQUQuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udGFpbnMgbW9kdWxlIGNvbXB1dGluZyB0aGUgZXJyb3IgZm9yIGEgTUIgb2Ygc2l6ZSA4eDgKLSAqIAotICovCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrX1NBRCAgICg2LjEuNC4xLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb21wdXRlcyB0ZXh0dXJlIGVycm9yIG9mIHRoZSBibG9jazsgYWxzbyByZXR1cm5zIFNBRC4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBwbGFuZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICogICBzcmNTdGVwIC0gc3RlcCBvZiB0aGUgc291cmNlIHBsYW5lIAotICogICBwU3JjUmVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJ1ZmZlciwgYW4gOHg4IGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgCi0gKiAgICAgICAgICAgIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIsIGFuIDh4OCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIAotICogICAgICAgICAgICBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICBwRHN0U0FEIC0gcG9pbnRlciB0byB0aGUgU3VtIG9mIEFic29sdXRlIERpZmZlcmVuY2VzIChTQUQpIHZhbHVlIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzIAotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcFNyY1JlZiwgcERzdCBhbmQgcERzdFNBRC4gCi0gKiAgICAtICAgIHBTcmMgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgU3JjU3RlcCA8PSAwIG9yIHNyY1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgICAtICAgIHBTcmNSZWYgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgcERzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9ja19TQUQoCi0gICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKLSAgICAgT01YX0lOVCBzcmNTdGVwLAotICAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYsCi0gICAgIE9NWF9TMTYgKiBwRHN0LAotICAgICBPTVhfSU5UICpwRHN0U0FECi0pCi17Ci0KLSAgICBPTVhfSU5UICAgICB4LCB5LCBjb3VudDsKLQotICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLwotICAgIGFybVJldEFyZ0VycklmKHBTcmMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBEc3RTQUQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCFhcm1JczhCeXRlQWxpZ25lZChwU3JjKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCFhcm1JczhCeXRlQWxpZ25lZChwU3JjUmVmKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCFhcm1JczhCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChzcmNTdGVwIDw9IDApIHx8IChzcmNTdGVwICYgNyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQotICAgIC8qIENhbGN1bGF0ZSB0aGUgZXJyb3IgYmxvY2sgKi8KLSAgICBmb3IgKHkgPSAwLCBjb3VudCA9IDAsICpwRHN0U0FEID0gMDsKLSAgICAgICAgIHkgPCA4OwotICAgICAgICAgeSsrLCBwU3JjICs9IHNyY1N0ZXApCi0gICAgewotICAgICAgICBmb3IgKHggPSAwOyB4IDwgODsgeCsrLCBjb3VudCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBwRHN0W2NvdW50XSA9IHBTcmNbeF0gLSBwU3JjUmVmW2NvdW50XTsKLSAgICAgICAgICAgICpwRHN0U0FEICs9IGFybUFicyhwRHN0W2NvdW50XSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLQotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTE2eDE2LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5MTZ4MTYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU0NjdhNC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5MTZ4MTYuYworKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ0NPTU1fQ29weTE2eDE2LmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogTVBFRzQgMTZ4MTYgQ29weSBtb2R1bGUKLSAqIAotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0NvcHkxNngxNiAgICg2LjEuMy4zLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb3BpZXMgdGhlIHJlZmVyZW5jZSAxNngxNiBtYWNyb2Jsb2NrIHRvIHRoZSBjdXJyZW50IG1hY3JvYmxvY2suIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgbWFjcm9ibG9jayBpbiB0aGUgc291cmNlIGZyYW1lOyBtdXN0IGJlIAotICogICAgICAgICAgICBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHN0ZXAgLSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydHMgb2YgY29uc2VjdXRpdmUgbGluZXMgaW4gdGhlIHJlZmVyZW5jZSAKLSAqICAgICAgICAgICAgZnJhbWUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYgYW5kIG11c3QgYmUgbGFyZ2VyIAotICogICAgICAgICAgICB0aGFuIG9yIGVxdWFsIHRvIDE2LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIG1hY3JvYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIAotICogICAgICAgICAgICAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCi0gKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwRHN0IAotICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIAotICogICAgICAgICAgICAgIGJvdW5kYXJ5OiBwU3JjLCBwRHN0IAotICogICAgLSAgICBzdGVwIDwxNiBvciBzdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDQ09NTV9Db3B5MTZ4MTYoCi0JCWNvbnN0IE9NWF9VOCAqcFNyYywgCi0JCU9NWF9VOCAqcERzdCwgCi0JCU9NWF9JTlQgc3RlcCkKLSB7Ci0gICAgLyogRGVmaW5pdGlvbnMgYW5kIEluaXRpYWxpemF0aW9ucyovCi0KLSAgICBPTVhfSU5UIGNvdW50LGluZGV4LCB4LCB5OwotICAgIAotICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLwotICAgIGFybVJldEFyZ0VycklmKHBTcmMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCFhcm1JczE2Qnl0ZUFsaWduZWQocFNyYyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZighYXJtSXMxNkJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKChzdGVwIDwgMTYpIHx8IChzdGVwICUgMTYpKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIAotICAgIAotICAgIC8qIENvcHlpbmcgdGhlIHJlZiAxNngxNiBibGsgdG8gdGhlIGN1cnIgYmxrICovCi0gICAgZm9yICh5ID0gMCwgY291bnQgPSAwLCBpbmRleCA9IDA7IHkgPCAxNjsgeSsrLCBjb3VudCA9IGNvdW50ICsgc3RlcCAtIDE2KQotICAgIHsKLSAgICAgICAgZm9yICh4ID0gMDsgeCA8IDE2OyB4KyssIGNvdW50KyssIGluZGV4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBEc3RbaW5kZXhdID0gcFNyY1tjb3VudF07Ci0gICAgICAgIH0gICAgICAgCi0gICAgfQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHk4eDguYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHk4eDguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y1OTY5Yi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5OHg4LmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNDT01NX0NvcHk4eDguYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBNUEVHNCA4eDggQ29weSBtb2R1bGUKLSAqIAotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0NvcHk4eDggICAoNi4xLjMuMy4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29waWVzIHRoZSByZWZlcmVuY2UgOHg4IGJsb2NrIHRvIHRoZSBjdXJyZW50IGJsb2NrLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrIGluIHRoZSBzb3VyY2UgZnJhbWU7IG11c3QgYmUgCi0gKiAgICAgICAgICAgIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgc3RlcCAtIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0cyBvZiBjb25zZWN1dGl2ZSBsaW5lcyBpbiB0aGUgcmVmZXJlbmNlIAotICogICAgICAgICAgICBmcmFtZSwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4IGFuZCBtdXN0IGJlIGxhcmdlciB0aGFuIAotICogICAgICAgICAgICBvciBlcXVhbCB0byA4LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAotICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcERzdCAKLSAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKLSAqICAgICAgICAgICAgICBib3VuZGFyeTogcFNyYywgcERzdCAKLSAqICAgIC0gICAgc3RlcCA8OCBvciBzdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNDT01NX0NvcHk4eDgoCi0JCWNvbnN0IE9NWF9VOCAqcFNyYywgCi0JCU9NWF9VOCAqcERzdCwgCi0JCU9NWF9JTlQgc3RlcCkKLSB7Ci0gICAgLyogRGVmaW5pdGlvbnMgYW5kIEluaXRpYWxpemF0aW9ucyovCi0KLSAgICBPTVhfSU5UIGNvdW50LGluZGV4LCB4LCB5OwotICAgIAotICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLwotICAgIGFybVJldEFyZ0VycklmKHBTcmMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCFhcm1JczhCeXRlQWxpZ25lZChwU3JjKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCFhcm1JczhCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCgoc3RlcCA8IDgpIHx8IChzdGVwICUgOCkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgCi0gICAgCi0gICAgLyogQ29weWluZyB0aGUgcmVmIDh4OCBibGsgdG8gdGhlIGN1cnIgYmxrICovCi0gICAgZm9yICh5ID0gMCwgY291bnQgPSAwLCBpbmRleCA9IDA7IHkgPCA4OyB5KyssIGNvdW50ID0gY291bnQgKyBzdGVwIC0gOCkKLSAgICB7Ci0gICAgICAgIGZvciAoeCA9IDA7IHggPCA4OyB4KyssIGNvdW50KyssIGluZGV4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBEc3RbaW5kZXhdID0gcFNyY1tjb3VudF07Ci0gICAgICAgIH0gICAgICAgCi0gICAgfQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0V4cGFuZEZyYW1lX0kuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0V4cGFuZEZyYW1lX0kuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM3OWZkMC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9FeHBhbmRGcmFtZV9JLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDQ09NTV9FeHBhbmRGcmFtZV9JLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiB3aWxsIEV4cGFuZCBGcmFtZSBib3VuZGFyeSBwaXhlbHMgaW50byBQbGFuZQotICogCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDQ09NTV9FeHBhbmRGcmFtZV9JICAgKDYuMS4zLjIuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gZXhwYW5kcyBhIHJlY29uc3RydWN0ZWQgZnJhbWUgaW4tcGxhY2UuICBUaGUgdW5leHBhbmRlZCAKLSAqIHNvdXJjZSBmcmFtZSBzaG91bGQgYmUgc3RvcmVkIGluIGEgcGxhbmUgYnVmZmVyIHdpdGggc3VmZmljaWVudCBzcGFjZSAKLSAqIHByZS1hbGxvY2F0ZWQgZm9yIGVkZ2UgZXhwYW5zaW9uLCBhbmQgdGhlIGlucHV0IGZyYW1lIHNob3VsZCBiZSBsb2NhdGVkIGluIAotICogdGhlIHBsYW5lIGJ1ZmZlciBjZW50ZXIuICBUaGlzIGZ1bmN0aW9uIGV4ZWN1dGVzIHRoZSBwaXhlbCBleHBhbnNpb24gYnkgCi0gKiByZXBsaWNhdGluZyBzb3VyY2UgZnJhbWUgZWRnZSBwaXhlbCBpbnRlbnNpdGllcyBpbiB0aGUgZW1wdHkgcGl4ZWwgCi0gKiBsb2NhdGlvbnMgKGV4cGFuc2lvbiByZWdpb24pIGJldHdlZW4gdGhlIHNvdXJjZSBmcmFtZSBlZGdlIGFuZCB0aGUgcGxhbmUgCi0gKiBidWZmZXIgZWRnZS4gIFRoZSB3aWR0aC9oZWlnaHQgb2YgdGhlIGV4cGFuc2lvbiByZWdpb25zIG9uIHRoZSAKLSAqIGhvcml6b250YWwvdmVydGljYWwgZWRnZXMgaXMgY29udHJvbGxlZCBieSB0aGUgcGFyYW1ldGVyIGlFeHBhbmRQZWxzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0UGxhbmUgLSBwb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGZyYW1lIHRvIGJlIAotICogICAgICAgICAgICBleHBhbmRlZDsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIGlGcmFtZVdpZHRoIC0gZnJhbWUgd2lkdGg7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgaUZyYW1lSGVpZ2h0IC1mcmFtZSBoZWlnaHQ7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgaUV4cGFuZFBlbHMgLSBudW1iZXIgb2YgcGl4ZWxzIHRvIGJlIGV4cGFuZGVkIGluIHRoZSBob3Jpem9udGFsIGFuZCAKLSAqICAgICAgICAgICAgdmVydGljYWwgZGlyZWN0aW9uczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBpUGxhbmVTdGVwIC0gZGlzdGFuY2UsIGluIGJ5dGVzLCBiZXR3ZWVuIHRoZSBzdGFydCBvZiBjb25zZWN1dGl2ZSBsaW5lcyAKLSAqICAgICAgICAgICAgaW4gdGhlIHBsYW5lIGJ1ZmZlcjsgbXVzdCBiZSBsYXJnZXIgdGhhbiBvciBlcXVhbCB0byAKLSAqICAgICAgICAgICAgKGlGcmFtZVdpZHRoICsgMiAqIGlFeHBhbmRQZWxzKS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3RQbGFuZSAtUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBmcmFtZSAoTk9UIHRoZSAKLSAqICAgICAgICAgICAgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBwbGFuZSk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCi0gKiAgICAtICAgIHBTcmNEc3RQbGFuZSBpcyBOVUxMLiAKLSAqICAgIC0gICAgcFNyY0RzdFBsYW5lIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgICAtICAgIG9uZSBvZiB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgaXMgZWl0aGVyIGVxdWFsIHRvIHplcm8gb3IgaXMgYSAKLSAqICAgICAgICAgICAgICBub24tbXVsdGlwbGUgb2YgODogaUZyYW1lSGVpZ2h0LCBpRnJhbWVXaWR0aCwgaVBsYW5lU3RlcCwgb3IgCi0gKiAgICAgICAgICAgICAgaUV4cGFuZFBlbHMuIAotICogICAgLSAgICBpUGxhbmVTdGVwIDwgKGlGcmFtZVdpZHRoICsgMiAqIGlFeHBhbmRQZWxzKS4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNDT01NX0V4cGFuZEZyYW1lX0koCi0JT01YX1U4KglwU3JjRHN0UGxhbmUsIAotCU9NWF9VMzIJaUZyYW1lV2lkdGgsIAotCU9NWF9VMzIJaUZyYW1lSGVpZ2h0LCAKLQlPTVhfVTMyCWlFeHBhbmRQZWxzLCAKLQlPTVhfVTMyCWlQbGFuZVN0ZXAKLSkKLXsKLSAgICBPTVhfSU5UICAgICB4LCB5OwotICAgIE9NWF9VOCogICAgIHBMZWZ0OwotICAgIE9NWF9VOCogICAgIHBSaWdodDsKLSAgICBPTVhfVTgqICAgICBwVG9wOwotICAgIE9NWF9VOCogICAgIHBCb3R0b207Ci0KLSAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0UGxhbmUgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90OEJ5dGVBbGlnbmVkKHBTcmNEc3RQbGFuZSksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGlGcmFtZVdpZHRoID09IDAgfHwgaUZyYW1lV2lkdGggJiA3LCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihpRnJhbWVIZWlnaHQ9PSAwIHx8IGlGcmFtZUhlaWdodCAmIDcsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGlFeHBhbmRQZWxzID09IDAgfHwgaUV4cGFuZFBlbHMgJiA3LCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihpUGxhbmVTdGVwID09IDAgfHwgaVBsYW5lU3RlcCAmIDcsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGlQbGFuZVN0ZXAgPCAoaUZyYW1lV2lkdGggKyAyICogaUV4cGFuZFBlbHMpLCAKLSAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycikKLQotICAgIC8qIFRvcCBhbmQgQm90dG9tICovCi0gICAgcFRvcCA9IHBTcmNEc3RQbGFuZSAtIChpRXhwYW5kUGVscyAqIGlQbGFuZVN0ZXApOwotICAgIHBCb3R0b20gPSBwU3JjRHN0UGxhbmUgKyAoaUZyYW1lSGVpZ2h0ICogaVBsYW5lU3RlcCk7Ci0KLSAgICBmb3IgKHkgPSAwOyB5IDwgKE9NWF9JTlQpaUV4cGFuZFBlbHM7IHkrKykKLSAgICB7Ci0gICAgICAgIGZvciAoeCA9IDA7IHggPCAoT01YX0lOVClpRnJhbWVXaWR0aDsgeCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBwVG9wIFt5ICogaVBsYW5lU3RlcCArIHhdID0gCi0gICAgICAgICAgICAgICAgcFNyY0RzdFBsYW5lIFt4XTsKLSAgICAgICAgICAgIHBCb3R0b20gW3kgKiBpUGxhbmVTdGVwICsgeF0gPSAKLSAgICAgICAgICAgICAgICBwU3JjRHN0UGxhbmUgWyhpRnJhbWVIZWlnaHQgLSAxKSAqIGlQbGFuZVN0ZXAgKyB4XTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIExlZnQsIFJpZ2h0IGFuZCBDb3JuZXJzICovCi0gICAgcExlZnQgPSBwU3JjRHN0UGxhbmUgLSBpRXhwYW5kUGVsczsKLSAgICBwUmlnaHQgPSBwU3JjRHN0UGxhbmUgKyBpRnJhbWVXaWR0aDsKLQotICAgIGZvciAoeSA9IC0oT01YX0lOVClpRXhwYW5kUGVsczsgeSA8IChPTVhfSU5UKShpRnJhbWVIZWlnaHQgKyBpRXhwYW5kUGVscyk7IHkrKykKLSAgICB7Ci0gICAgICAgIGZvciAoeCA9IDA7IHggPCAoT01YX0lOVClpRXhwYW5kUGVsczsgeCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBwTGVmdCBbeSAqIGlQbGFuZVN0ZXAgKyB4XSA9IAotICAgICAgICAgICAgICAgIHBTcmNEc3RQbGFuZSBbeSAqIGlQbGFuZVN0ZXAgKyAwXTsKLSAgICAgICAgICAgIHBSaWdodCBbeSAqIGlQbGFuZVN0ZXAgKyB4XSA9IAotICAgICAgICAgICAgICAgIHBTcmNEc3RQbGFuZSBbeSAqIGlQbGFuZVN0ZXAgKyAoaUZyYW1lV2lkdGggLSAxKV07Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0xpbWl0TVZUb1JlY3QuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0xpbWl0TVZUb1JlY3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJhOTA5My4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9MaW1pdE1WVG9SZWN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNDT01NX0xpbWl0TVZUb1JlY3QuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udGFpbnMgbW9kdWxlIGZvciBsaW1pdGluZyB0aGUgTVYKLSAqIAotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0xpbWl0TVZUb1JlY3QgICAoNi4xLjQuMS4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogTGltaXRzIHRoZSBtb3Rpb24gdmVjdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBibG9jay9tYWNyb2Jsb2NrIHRvIAotICogcHJldmVudCB0aGUgbW90aW9uIGNvbXBlbnNhdGVkIGJsb2NrL21hY3JvYmxvY2sgZnJvbSBtb3Zpbmcgb3V0c2lkZSBhIAotICogYm91bmRpbmcgcmVjdGFuZ2xlIGFzIHNob3duIGluIEZpZ3VyZSA2LTEuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNNViAtIHBvaW50ZXIgdG8gdGhlIG1vdGlvbiB2ZWN0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IGJsb2NrIAotICogICAgICAgICAgICBvciBtYWNyb2Jsb2NrIAotICogICBwUmVjdFZPUFJlZiAtIHBvaW50ZXIgdG8gdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSAKLSAqICAgWGNvb3JkLCBZY29vcmQgIC0gY29vcmRpbmF0ZXMgb2YgdGhlIGN1cnJlbnQgYmxvY2sgb3IgbWFjcm9ibG9jayAKLSAqICAgc2l6ZSAtIHNpemUgb2YgdGhlIGN1cnJlbnQgYmxvY2sgb3IgbWFjcm9ibG9jazsgbXVzdCBiZSBlcXVhbCB0byA4IG9yIAotICogICAgICAgICAgICAxNi4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RNViAtIHBvaW50ZXIgdG8gdGhlIGxpbWl0ZWQgbW90aW9uIHZlY3RvciAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvciBtb3JlIG9mIHRoZSAKLSAqICAgICAgICAgICAgICBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBTcmNNViwgcERzdE1WLCBvciBwUmVjdFZPUFJlZi4gCi0gKiAgICAtICAgIHNpemUgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA4IG9yIDE2LiAKLSAqICAgIC0gICAgdGhlIHdpZHRoIG9yIGhlaWdodCBvZiB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlIGlzIGxlc3MgdGhhbiAKLSAqICAgICAgICAgdHdpY2UgdGhlIGJsb2NrIHNpemUuCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ0NPTU1fTGltaXRNVlRvUmVjdCgKLSAgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKiBwU3JjTVYsCi0gICAgIE9NWFZDTW90aW9uVmVjdG9yICpwRHN0TVYsCi0gICAgIGNvbnN0IE9NWFJlY3QgKiBwUmVjdFZPUFJlZiwKLSAgICAgT01YX0lOVCBYY29vcmQsCi0gICAgIE9NWF9JTlQgWWNvb3JkLAotICAgICBPTVhfSU5UIHNpemUKLSkKLXsKLSAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjTVYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBEc3RNViA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFJlY3RWT1BSZWYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChzaXplICE9IDgpICYmIChzaXplICE9IDE2KSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChwUmVjdFZPUFJlZi0+d2lkdGggPCAoMiogc2l6ZSkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKHBSZWN0Vk9QUmVmLT5oZWlnaHQgPCAoMiogc2l6ZSkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgCi0gICAgcERzdE1WLT5keCA9IGFybU1pbiAoYXJtTWF4IChwU3JjTVYtPmR4LCAyKnBSZWN0Vk9QUmVmLT54IC0gWGNvb3JkKSwKLSAgICAgICAgICAgICAgICAgICAgKDIqcFJlY3RWT1BSZWYtPnggKyBwUmVjdFZPUFJlZi0+d2lkdGggLSBYY29vcmQgLSBzaXplKSk7Ci0gICAgcERzdE1WLT5keSA9IGFybU1pbiAoYXJtTWF4IChwU3JjTVYtPmR5LCAyKnBSZWN0Vk9QUmVmLT55IC0gWWNvb3JkKSwKLSAgICAgICAgICAgICAgICAgICAgKDIqcFJlY3RWT1BSZWYtPnkgKyBwUmVjdFZPUFJlZi0+aGVpZ2h0IC0gWWNvb3JkIC0gc2l6ZSkpOwotCi0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX1NBRF8xNnguYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX1NBRF8xNnguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNkYmJkMC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9TQURfMTZ4LmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNDT01NX1NBRF8xNnguYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIFNBRCBmb3IgMTZ4MTYgYW5kIDE2eDggYmxvY2tzCi0gKiAKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fU0FEXzE2eCAgICg2LjEuNC4xLjQpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBmb3IgMTZ4MTYgYW5kIDE2eDggYmxvY2tzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjT3JnIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCi0gKiAgICAgICAgICAgICBib3VuZGFyeS4gCi0gKiAgIGlTdGVwT3JnIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyIAotICogICBwU3JjUmVmICAtIFBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jayAKLSAqICAgaVN0ZXBSZWYgLSBTdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyIAotICogICBpSGVpZ2h0ICAtIEhlaWdodCBvZiB0aGUgYmxvY2sgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RTQUQgLSBQb2ludGVyIG9mIHJlc3VsdCBTQUQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb3IgbW9yZSBvZiB0aGUgCi0gKiAgICAgICAgICAgICAgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwU3JjT3JnLCBwRHN0U0FELCBvciBwU3JjUmVmIAotICogICAgLSAgICBwU3JjT3JnIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBpU3RlcE9yZyAgPD0gMCBvciBpU3RlcE9yZyBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiAKLSAqICAgIC0gICAgaVN0ZXBSZWYgPD0gMCBvciBpU3RlcFJlZiBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiAKLSAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgOCBvciAxNiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ0NPTU1fU0FEXzE2eCgKLQkJCWNvbnN0IE9NWF9VOCogCXBTcmNPcmcsCi0JCQlPTVhfVTMyIAlpU3RlcE9yZywKLQkJCWNvbnN0IE9NWF9VOCogCXBTcmNSZWYsCi0JCQlPTVhfVTMyIAlpU3RlcFJlZiwKLQkJCU9NWF9TMzIqCXBEc3RTQUQsCi0JCQlPTVhfVTMyCQlpSGVpZ2h0Ci0pCi17Ci0gICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY09yZyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBEc3RTQUQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKGlIZWlnaHQgIT0gMTYpICYmIChpSGVpZ2h0ICE9IDgpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3QxNkJ5dGVBbGlnbmVkKHBTcmNPcmcpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZigoaVN0ZXBPcmcgPT0gMCkgfHwgKGlTdGVwT3JnICYgMTUpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZigoaVN0ZXBSZWYgPT0gMCkgfHwgKGlTdGVwUmVmICYgMTUpLCBPTVhfU3RzX0JhZEFyZ0VycikKLQotICAgIHJldHVybiBhcm1WQ0NPTU1fU0FEIAotICAgICAgICAocFNyY09yZywgaVN0ZXBPcmcsIHBTcmNSZWYsIGlTdGVwUmVmLCBwRHN0U0FELCBpSGVpZ2h0LCAxNik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9TQURfOHguYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX1NBRF84eC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmZkMWVjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX1NBRF84eC5jCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDQ09NTV9TQURfOHguYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIFNBRCBmb3IgOHgxNiwgOHg4LCA4eDQgYmxvY2tzCi0gKiAKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fU0FEXzh4ICAgKDYuMS40LjEuNSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGZvciA4eDE2LCA4eDgsIDh4NCBibG9ja3MuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNPcmcgIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDgtYnl0ZSAKLSAqICAgICAgICAgICAgICBib3VuZGFyeS4gCi0gKiAgIGlTdGVwT3JnIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyIAotICogICBwU3JjUmVmICAtIFBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jayAKLSAqICAgaVN0ZXBSZWYgLSBTdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyIAotICogICBpSGVpZ2h0ICAtIEhlaWdodCBvZiB0aGUgYmxvY2sgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RTQUQgLVBvaW50ZXIgb2YgcmVzdWx0IFNBRCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvciBtb3JlIG9mIHRoZSAKLSAqICAgICAgICAgICAgICBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBTcmNPcmcsIHBEc3RTQUQsIG9yIHBTcmNSZWYgCi0gKiAgICAtICAgIHBTcmNPcmcgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgaVN0ZXBPcmcgIDw9IDAgb3IgaVN0ZXBPcmcgaXMgbm90IGEgbXVsdGlwbGUgb2YgOCAKLSAqICAgIC0gICAgaVN0ZXBSZWYgPD0gMCBvciBpU3RlcFJlZiBpcyBub3QgYSBtdWx0aXBsZSBvZiA4IAotICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCA0LCA4IG9yIDE2IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDQ09NTV9TQURfOHgoCQotCWNvbnN0IE9NWF9VOCogCXBTcmNPcmcsCi0JT01YX1UzMiAJaVN0ZXBPcmcsCi0JY29uc3QgT01YX1U4KiAJcFNyY1JlZiwKLQlPTVhfVTMyIAlpU3RlcFJlZiwKLQlPTVhfUzMyKglwRHN0U0FELAotCU9NWF9VMzIJCWlIZWlnaHQKLSkKLXsKLSAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjT3JnID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocERzdFNBRCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZigoaUhlaWdodCAhPSAxNikgJiYgKGlIZWlnaHQgIT0gOCkgJiYgKGlIZWlnaHQgIT0gNCksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDhCeXRlQWxpZ25lZChwU3JjT3JnKSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKGlTdGVwT3JnID09IDApIHx8IChpU3RlcE9yZyAmIDcpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZigoaVN0ZXBSZWYgPT0gMCkgfHwgKGlTdGVwUmVmICYgNyksIE9NWF9TdHNfQmFkQXJnRXJyKQotCi0gICAgcmV0dXJuIGFybVZDQ09NTV9TQUQgCi0gICAgICAgIChwU3JjT3JnLCBpU3RlcE9yZywgcFNyY1JlZiwgaVN0ZXBSZWYsIHBEc3RTQUQsIGlIZWlnaHQsIDgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9hcGkvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9hcGkvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzI0MWNhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvYXBpL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIAotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0NBVkxDVGFibGVzLmgKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBGaWxlOiAgICAgYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAKLSAqIEhlYWRlciBmaWxlIGZvciBBUk0gaW1wbGVtZW50YXRpb24gb2YgT3Blbk1BWCBWQ000UDEwCi0gKiAKLSAqLwotIAotI2lmbmRlZiBBUk1WQ000UDEwX0NBVkxDVEFCTEVTX0gKLSNkZWZpbmUgQVJNVkNNNFAxMF9DQVZMQ1RBQkxFU19ICi0gIAotLyogQ0FWTEMgdGFibGVzICovCi0KLWV4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAxMF9DQVZMQ1RyYWlsaW5nT25lc1s2Ml07Ci1leHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMTBfQ0FWTENUb3RhbENvZWZmWzYyXTsKLWV4dGVybiBjb25zdCBBUk1fVkxDMzIgKmFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzWzVdOwotZXh0ZXJuIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDTGV2ZWxQcmVmaXhbMTddOwotZXh0ZXJuIGNvbnN0IEFSTV9WTEMzMiAqYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc1sxNV07Ci1leHRlcm4gY29uc3QgQVJNX1ZMQzMyICphcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlc1szXTsKLWV4dGVybiBjb25zdCBBUk1fVkxDMzIgKmFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNbN107Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGEzMDc0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDcxOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0NBVkxDVGFibGVzLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIAotICogQ0FWTEMgdGFibGVzIGZvciBILjI2NAotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0jaW5jbHVkZSAiYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oIgotCi0vKiBUYWJsZXMgbWFwcGluZyBhIGNvZGUgdG8gVHJhaWxpbmdPbmVzIGFuZCBUb3RhbENvZWZmICovCi0KLWNvbnN0IE9NWF9VOCBhcm1WQ000UDEwX0NBVkxDVHJhaWxpbmdPbmVzWzYyXSA9IHsKLSAwLAotIDAsIDEsCi0gMCwgMSwgMiwKLSAwLCAxLCAyLCAzLAotIDAsIDEsIDIsIDMsCi0gMCwgMSwgMiwgMywKLSAwLCAxLCAyLCAzLAotIDAsIDEsIDIsIDMsCi0gMCwgMSwgMiwgMywKLSAwLCAxLCAyLCAzLAotIDAsIDEsIDIsIDMsCi0gMCwgMSwgMiwgMywKLSAwLCAxLCAyLCAzLAotIDAsIDEsIDIsIDMsCi0gMCwgMSwgMiwgMywKLSAwLCAxLCAyLCAzLAotIDAsIDEsIDIsIDMKLX07Ci0KLWNvbnN0IE9NWF9VOCBhcm1WQ000UDEwX0NBVkxDVG90YWxDb2VmZls2Ml0gPSB7Ci0gMCwKLSAxLCAxLAotIDIsIDIsIDIsCi0gMywgMywgMywgMywKLSA0LCA0LCA0LCA0LAotIDUsIDUsIDUsIDUsCi0gNiwgNiwgNiwgNiwKLSA3LCA3LCA3LCA3LAotIDgsIDgsIDgsIDgsCi0gOSwgOSwgOSwgOSwKLSAxMCwgMTAsIDEwLCAxMCwKLSAxMSwgMTEsIDExLCAxMSwKLSAxMiwgMTIsIDEyLCAxMiwKLSAxMywgMTMsIDEzLCAxMywKLSAxNCwgMTQsIDE0LCAxNCwKLSAxNSwgMTUsIDE1LCAxNSwKLSAxNiwgMTYsIDE2LCAxNgotfTsKLQotc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlbjBbNjNdID0gewotICAgIHsgIDEsIDB4MDAwMSB9LAotICAgIHsgIDYsIDB4MDAwNSB9LAotICAgIHsgIDIsIDB4MDAwMSB9LAotICAgIHsgIDgsIDB4MDAwNyB9LAotICAgIHsgIDYsIDB4MDAwNCB9LAotICAgIHsgIDMsIDB4MDAwMSB9LAotICAgIHsgIDksIDB4MDAwNyB9LAotICAgIHsgIDgsIDB4MDAwNiB9LAotICAgIHsgIDcsIDB4MDAwNSB9LAotICAgIHsgIDUsIDB4MDAwMyB9LAotICAgIHsgMTAsIDB4MDAwNyB9LAotICAgIHsgIDksIDB4MDAwNiB9LAotICAgIHsgIDgsIDB4MDAwNSB9LAotICAgIHsgIDYsIDB4MDAwMyB9LAotICAgIHsgMTEsIDB4MDAwNyB9LAotICAgIHsgMTAsIDB4MDAwNiB9LAotICAgIHsgIDksIDB4MDAwNSB9LAotICAgIHsgIDcsIDB4MDAwNCB9LAotICAgIHsgMTMsIDB4MDAwZiB9LAotICAgIHsgMTEsIDB4MDAwNiB9LAotICAgIHsgMTAsIDB4MDAwNSB9LAotICAgIHsgIDgsIDB4MDAwNCB9LAotICAgIHsgMTMsIDB4MDAwYiB9LAotICAgIHsgMTMsIDB4MDAwZSB9LAotICAgIHsgMTEsIDB4MDAwNSB9LAotICAgIHsgIDksIDB4MDAwNCB9LAotICAgIHsgMTMsIDB4MDAwOCB9LAotICAgIHsgMTMsIDB4MDAwYSB9LAotICAgIHsgMTMsIDB4MDAwZCB9LAotICAgIHsgMTAsIDB4MDAwNCB9LAotICAgIHsgMTQsIDB4MDAwZiB9LAotICAgIHsgMTQsIDB4MDAwZSB9LAotICAgIHsgMTMsIDB4MDAwOSB9LAotICAgIHsgMTEsIDB4MDAwNCB9LAotICAgIHsgMTQsIDB4MDAwYiB9LAotICAgIHsgMTQsIDB4MDAwYSB9LAotICAgIHsgMTQsIDB4MDAwZCB9LAotICAgIHsgMTMsIDB4MDAwYyB9LAotICAgIHsgMTUsIDB4MDAwZiB9LAotICAgIHsgMTUsIDB4MDAwZSB9LAotICAgIHsgMTQsIDB4MDAwOSB9LAotICAgIHsgMTQsIDB4MDAwYyB9LAotICAgIHsgMTUsIDB4MDAwYiB9LAotICAgIHsgMTUsIDB4MDAwYSB9LAotICAgIHsgMTUsIDB4MDAwZCB9LAotICAgIHsgMTQsIDB4MDAwOCB9LAotICAgIHsgMTYsIDB4MDAwZiB9LAotICAgIHsgMTUsIDB4MDAwMSB9LAotICAgIHsgMTUsIDB4MDAwOSB9LAotICAgIHsgMTUsIDB4MDAwYyB9LAotICAgIHsgMTYsIDB4MDAwYiB9LAotICAgIHsgMTYsIDB4MDAwZSB9LAotICAgIHsgMTYsIDB4MDAwZCB9LAotICAgIHsgMTUsIDB4MDAwOCB9LAotICAgIHsgMTYsIDB4MDAwNyB9LAotICAgIHsgMTYsIDB4MDAwYSB9LAotICAgIHsgMTYsIDB4MDAwOSB9LAotICAgIHsgMTYsIDB4MDAwYyB9LAotICAgIHsgMTYsIDB4MDAwNCB9LAotICAgIHsgMTYsIDB4MDAwNiB9LAotICAgIHsgMTYsIDB4MDAwNSB9LAotICAgIHsgMTYsIDB4MDAwOCB9LAotICAgIHsgIDAsIDB4MDAwMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuMVs2M10gPSB7Ci0gICAgeyAgMiwgMHgwMDAzIH0sCi0gICAgeyAgNiwgMHgwMDBiIH0sCi0gICAgeyAgMiwgMHgwMDAyIH0sCi0gICAgeyAgNiwgMHgwMDA3IH0sCi0gICAgeyAgNSwgMHgwMDA3IH0sCi0gICAgeyAgMywgMHgwMDAzIH0sCi0gICAgeyAgNywgMHgwMDA3IH0sCi0gICAgeyAgNiwgMHgwMDBhIH0sCi0gICAgeyAgNiwgMHgwMDA5IH0sCi0gICAgeyAgNCwgMHgwMDA1IH0sCi0gICAgeyAgOCwgMHgwMDA3IH0sCi0gICAgeyAgNiwgMHgwMDA2IH0sCi0gICAgeyAgNiwgMHgwMDA1IH0sCi0gICAgeyAgNCwgMHgwMDA0IH0sCi0gICAgeyAgOCwgMHgwMDA0IH0sCi0gICAgeyAgNywgMHgwMDA2IH0sCi0gICAgeyAgNywgMHgwMDA1IH0sCi0gICAgeyAgNSwgMHgwMDA2IH0sCi0gICAgeyAgOSwgMHgwMDA3IH0sCi0gICAgeyAgOCwgMHgwMDA2IH0sCi0gICAgeyAgOCwgMHgwMDA1IH0sCi0gICAgeyAgNiwgMHgwMDA4IH0sCi0gICAgeyAxMSwgMHgwMDBmIH0sCi0gICAgeyAgOSwgMHgwMDA2IH0sCi0gICAgeyAgOSwgMHgwMDA1IH0sCi0gICAgeyAgNiwgMHgwMDA0IH0sCi0gICAgeyAxMSwgMHgwMDBiIH0sCi0gICAgeyAxMSwgMHgwMDBlIH0sCi0gICAgeyAxMSwgMHgwMDBkIH0sCi0gICAgeyAgNywgMHgwMDA0IH0sCi0gICAgeyAxMiwgMHgwMDBmIH0sCi0gICAgeyAxMSwgMHgwMDBhIH0sCi0gICAgeyAxMSwgMHgwMDA5IH0sCi0gICAgeyAgOSwgMHgwMDA0IH0sCi0gICAgeyAxMiwgMHgwMDBiIH0sCi0gICAgeyAxMiwgMHgwMDBlIH0sCi0gICAgeyAxMiwgMHgwMDBkIH0sCi0gICAgeyAxMSwgMHgwMDBjIH0sCi0gICAgeyAxMiwgMHgwMDA4IH0sCi0gICAgeyAxMiwgMHgwMDBhIH0sCi0gICAgeyAxMiwgMHgwMDA5IH0sCi0gICAgeyAxMSwgMHgwMDA4IH0sCi0gICAgeyAxMywgMHgwMDBmIH0sCi0gICAgeyAxMywgMHgwMDBlIH0sCi0gICAgeyAxMywgMHgwMDBkIH0sCi0gICAgeyAxMiwgMHgwMDBjIH0sCi0gICAgeyAxMywgMHgwMDBiIH0sCi0gICAgeyAxMywgMHgwMDBhIH0sCi0gICAgeyAxMywgMHgwMDA5IH0sCi0gICAgeyAxMywgMHgwMDBjIH0sCi0gICAgeyAxMywgMHgwMDA3IH0sCi0gICAgeyAxNCwgMHgwMDBiIH0sCi0gICAgeyAxMywgMHgwMDA2IH0sCi0gICAgeyAxMywgMHgwMDA4IH0sCi0gICAgeyAxNCwgMHgwMDA5IH0sCi0gICAgeyAxNCwgMHgwMDA4IH0sCi0gICAgeyAxNCwgMHgwMDBhIH0sCi0gICAgeyAxMywgMHgwMDAxIH0sCi0gICAgeyAxNCwgMHgwMDA3IH0sCi0gICAgeyAxNCwgMHgwMDA2IH0sCi0gICAgeyAxNCwgMHgwMDA1IH0sCi0gICAgeyAxNCwgMHgwMDA0IH0sCi0gICAgeyAgMCwgMHgwMDAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW4yWzYzXSA9IHsKLSAgICB7ICA0LCAweDAwMGYgfSwKLSAgICB7ICA2LCAweDAwMGYgfSwKLSAgICB7ICA0LCAweDAwMGUgfSwKLSAgICB7ICA2LCAweDAwMGIgfSwKLSAgICB7ICA1LCAweDAwMGYgfSwKLSAgICB7ICA0LCAweDAwMGQgfSwKLSAgICB7ICA2LCAweDAwMDggfSwKLSAgICB7ICA1LCAweDAwMGMgfSwKLSAgICB7ICA1LCAweDAwMGUgfSwKLSAgICB7ICA0LCAweDAwMGMgfSwKLSAgICB7ICA3LCAweDAwMGYgfSwKLSAgICB7ICA1LCAweDAwMGEgfSwKLSAgICB7ICA1LCAweDAwMGIgfSwKLSAgICB7ICA0LCAweDAwMGIgfSwKLSAgICB7ICA3LCAweDAwMGIgfSwKLSAgICB7ICA1LCAweDAwMDggfSwKLSAgICB7ICA1LCAweDAwMDkgfSwKLSAgICB7ICA0LCAweDAwMGEgfSwKLSAgICB7ICA3LCAweDAwMDkgfSwKLSAgICB7ICA2LCAweDAwMGUgfSwKLSAgICB7ICA2LCAweDAwMGQgfSwKLSAgICB7ICA0LCAweDAwMDkgfSwKLSAgICB7ICA3LCAweDAwMDggfSwKLSAgICB7ICA2LCAweDAwMGEgfSwKLSAgICB7ICA2LCAweDAwMDkgfSwKLSAgICB7ICA0LCAweDAwMDggfSwKLSAgICB7ICA4LCAweDAwMGYgfSwKLSAgICB7ICA3LCAweDAwMGUgfSwKLSAgICB7ICA3LCAweDAwMGQgfSwKLSAgICB7ICA1LCAweDAwMGQgfSwKLSAgICB7ICA4LCAweDAwMGIgfSwKLSAgICB7ICA4LCAweDAwMGUgfSwKLSAgICB7ICA3LCAweDAwMGEgfSwKLSAgICB7ICA2LCAweDAwMGMgfSwKLSAgICB7ICA5LCAweDAwMGYgfSwKLSAgICB7ICA4LCAweDAwMGEgfSwKLSAgICB7ICA4LCAweDAwMGQgfSwKLSAgICB7ICA3LCAweDAwMGMgfSwKLSAgICB7ICA5LCAweDAwMGIgfSwKLSAgICB7ICA5LCAweDAwMGUgfSwKLSAgICB7ICA4LCAweDAwMDkgfSwKLSAgICB7ICA4LCAweDAwMGMgfSwKLSAgICB7ICA5LCAweDAwMDggfSwKLSAgICB7ICA5LCAweDAwMGEgfSwKLSAgICB7ICA5LCAweDAwMGQgfSwKLSAgICB7ICA4LCAweDAwMDggfSwKLSAgICB7IDEwLCAweDAwMGQgfSwKLSAgICB7ICA5LCAweDAwMDcgfSwKLSAgICB7ICA5LCAweDAwMDkgfSwKLSAgICB7ICA5LCAweDAwMGMgfSwKLSAgICB7IDEwLCAweDAwMDkgfSwKLSAgICB7IDEwLCAweDAwMGMgfSwKLSAgICB7IDEwLCAweDAwMGIgfSwKLSAgICB7IDEwLCAweDAwMGEgfSwKLSAgICB7IDEwLCAweDAwMDUgfSwKLSAgICB7IDEwLCAweDAwMDggfSwKLSAgICB7IDEwLCAweDAwMDcgfSwKLSAgICB7IDEwLCAweDAwMDYgfSwKLSAgICB7IDEwLCAweDAwMDEgfSwKLSAgICB7IDEwLCAweDAwMDQgfSwKLSAgICB7IDEwLCAweDAwMDMgfSwKLSAgICB7IDEwLCAweDAwMDIgfSwKLSAgICB7ICAwLCAweDAwMDAgfQotfTsKLQotc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlbjNbNjNdID0gewotICAgIHsgIDYsIDB4MDAwMyB9LAotICAgIHsgIDYsIDB4MDAwMCB9LAotICAgIHsgIDYsIDB4MDAwMSB9LAotICAgIHsgIDYsIDB4MDAwNCB9LAotICAgIHsgIDYsIDB4MDAwNSB9LAotICAgIHsgIDYsIDB4MDAwNiB9LAotICAgIHsgIDYsIDB4MDAwOCB9LAotICAgIHsgIDYsIDB4MDAwOSB9LAotICAgIHsgIDYsIDB4MDAwYSB9LAotICAgIHsgIDYsIDB4MDAwYiB9LAotICAgIHsgIDYsIDB4MDAwYyB9LAotICAgIHsgIDYsIDB4MDAwZCB9LAotICAgIHsgIDYsIDB4MDAwZSB9LAotICAgIHsgIDYsIDB4MDAwZiB9LAotICAgIHsgIDYsIDB4MDAxMCB9LAotICAgIHsgIDYsIDB4MDAxMSB9LAotICAgIHsgIDYsIDB4MDAxMiB9LAotICAgIHsgIDYsIDB4MDAxMyB9LAotICAgIHsgIDYsIDB4MDAxNCB9LAotICAgIHsgIDYsIDB4MDAxNSB9LAotICAgIHsgIDYsIDB4MDAxNiB9LAotICAgIHsgIDYsIDB4MDAxNyB9LAotICAgIHsgIDYsIDB4MDAxOCB9LAotICAgIHsgIDYsIDB4MDAxOSB9LAotICAgIHsgIDYsIDB4MDAxYSB9LAotICAgIHsgIDYsIDB4MDAxYiB9LAotICAgIHsgIDYsIDB4MDAxYyB9LAotICAgIHsgIDYsIDB4MDAxZCB9LAotICAgIHsgIDYsIDB4MDAxZSB9LAotICAgIHsgIDYsIDB4MDAxZiB9LAotICAgIHsgIDYsIDB4MDAyMCB9LAotICAgIHsgIDYsIDB4MDAyMSB9LAotICAgIHsgIDYsIDB4MDAyMiB9LAotICAgIHsgIDYsIDB4MDAyMyB9LAotICAgIHsgIDYsIDB4MDAyNCB9LAotICAgIHsgIDYsIDB4MDAyNSB9LAotICAgIHsgIDYsIDB4MDAyNiB9LAotICAgIHsgIDYsIDB4MDAyNyB9LAotICAgIHsgIDYsIDB4MDAyOCB9LAotICAgIHsgIDYsIDB4MDAyOSB9LAotICAgIHsgIDYsIDB4MDAyYSB9LAotICAgIHsgIDYsIDB4MDAyYiB9LAotICAgIHsgIDYsIDB4MDAyYyB9LAotICAgIHsgIDYsIDB4MDAyZCB9LAotICAgIHsgIDYsIDB4MDAyZSB9LAotICAgIHsgIDYsIDB4MDAyZiB9LAotICAgIHsgIDYsIDB4MDAzMCB9LAotICAgIHsgIDYsIDB4MDAzMSB9LAotICAgIHsgIDYsIDB4MDAzMiB9LAotICAgIHsgIDYsIDB4MDAzMyB9LAotICAgIHsgIDYsIDB4MDAzNCB9LAotICAgIHsgIDYsIDB4MDAzNSB9LAotICAgIHsgIDYsIDB4MDAzNiB9LAotICAgIHsgIDYsIDB4MDAzNyB9LAotICAgIHsgIDYsIDB4MDAzOCB9LAotICAgIHsgIDYsIDB4MDAzOSB9LAotICAgIHsgIDYsIDB4MDAzYSB9LAotICAgIHsgIDYsIDB4MDAzYiB9LAotICAgIHsgIDYsIDB4MDAzYyB9LAotICAgIHsgIDYsIDB4MDAzZCB9LAotICAgIHsgIDYsIDB4MDAzZSB9LAotICAgIHsgIDYsIDB4MDAzZiB9LAotICAgIHsgIDAsIDB4MDAwMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuNFsxNV0gPSB7Ci0gICAgeyAgMiwgMHgwMDAxIH0sCi0gICAgeyAgNiwgMHgwMDA3IH0sCi0gICAgeyAgMSwgMHgwMDAxIH0sCi0gICAgeyAgNiwgMHgwMDA0IH0sCi0gICAgeyAgNiwgMHgwMDA2IH0sCi0gICAgeyAgMywgMHgwMDAxIH0sCi0gICAgeyAgNiwgMHgwMDAzIH0sCi0gICAgeyAgNywgMHgwMDAzIH0sCi0gICAgeyAgNywgMHgwMDAyIH0sCi0gICAgeyAgNiwgMHgwMDA1IH0sCi0gICAgeyAgNiwgMHgwMDAyIH0sCi0gICAgeyAgOCwgMHgwMDAzIH0sCi0gICAgeyAgOCwgMHgwMDAyIH0sCi0gICAgeyAgNywgMHgwMDAwIH0sCi0gICAgeyAgMCwgMHgwMDAwIH0KLX07Ci0KLQotY29uc3QgQVJNX1ZMQzMyICphcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc1s1XSA9IHsKLSAgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW4wLCAKLSAgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW4xLAotICAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlbjIsIAotICAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlbjMsIAotICAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlbjQKLX07Ci0KLS8qIFRhYmxlIGZvciBsZXZlbF9wcmVmaXggKi8KLQotY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENMZXZlbFByZWZpeFsxN10gPSB7Ci0gICAgeyAgMSwgMX0sCi0gICAgeyAgMiwgMX0sCi0gICAgeyAgMywgMX0sCi0gICAgeyAgNCwgMX0sCi0gICAgeyAgNSwgMX0sCi0gICAgeyAgNiwgMX0sCi0gICAgeyAgNywgMX0sCi0gICAgeyAgOCwgMX0sCi0gICAgeyAgOSwgMX0sCi0gICAgeyAxMCwgMX0sCi0gICAgeyAxMSwgMX0sCi0gICAgeyAxMiwgMX0sCi0gICAgeyAxMywgMX0sCi0gICAgeyAxNCwgMX0sCi0gICAgeyAxNSwgMX0sCi0gICAgeyAxNiwgMX0sCi0gICAgeyAgMCwgMH0KLX07Ci0KLS8qIFRhYmxlcyBmb3IgdG90YWxfemVyb3MgKi8KLQotc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczFbMTddID0gewotICAgIHsgIDEsIDB4MDAwMSB9LAotICAgIHsgIDMsIDB4MDAwMyB9LAotICAgIHsgIDMsIDB4MDAwMiB9LAotICAgIHsgIDQsIDB4MDAwMyB9LAotICAgIHsgIDQsIDB4MDAwMiB9LAotICAgIHsgIDUsIDB4MDAwMyB9LAotICAgIHsgIDUsIDB4MDAwMiB9LAotICAgIHsgIDYsIDB4MDAwMyB9LAotICAgIHsgIDYsIDB4MDAwMiB9LAotICAgIHsgIDcsIDB4MDAwMyB9LAotICAgIHsgIDcsIDB4MDAwMiB9LAotICAgIHsgIDgsIDB4MDAwMyB9LAotICAgIHsgIDgsIDB4MDAwMiB9LAotICAgIHsgIDksIDB4MDAwMyB9LAotICAgIHsgIDksIDB4MDAwMiB9LAotICAgIHsgIDksIDB4MDAwMSB9LAotICAgIHsgIDAsIDB4MDAwMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMlsxNl0gPSB7Ci0gICAgeyAgMywgMHgwMDA3IH0sCi0gICAgeyAgMywgMHgwMDA2IH0sCi0gICAgeyAgMywgMHgwMDA1IH0sCi0gICAgeyAgMywgMHgwMDA0IH0sCi0gICAgeyAgMywgMHgwMDAzIH0sCi0gICAgeyAgNCwgMHgwMDA1IH0sCi0gICAgeyAgNCwgMHgwMDA0IH0sCi0gICAgeyAgNCwgMHgwMDAzIH0sCi0gICAgeyAgNCwgMHgwMDAyIH0sCi0gICAgeyAgNSwgMHgwMDAzIH0sCi0gICAgeyAgNSwgMHgwMDAyIH0sCi0gICAgeyAgNiwgMHgwMDAzIH0sCi0gICAgeyAgNiwgMHgwMDAyIH0sCi0gICAgeyAgNiwgMHgwMDAxIH0sCi0gICAgeyAgNiwgMHgwMDAwIH0sCi0gICAgeyAgMCwgMHgwMDAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MzWzE1XSA9IHsKLSAgICB7ICA0LCAweDAwMDUgfSwKLSAgICB7ICAzLCAweDAwMDcgfSwKLSAgICB7ICAzLCAweDAwMDYgfSwKLSAgICB7ICAzLCAweDAwMDUgfSwKLSAgICB7ICA0LCAweDAwMDQgfSwKLSAgICB7ICA0LCAweDAwMDMgfSwKLSAgICB7ICAzLCAweDAwMDQgfSwKLSAgICB7ICAzLCAweDAwMDMgfSwKLSAgICB7ICA0LCAweDAwMDIgfSwKLSAgICB7ICA1LCAweDAwMDMgfSwKLSAgICB7ICA1LCAweDAwMDIgfSwKLSAgICB7ICA2LCAweDAwMDEgfSwKLSAgICB7ICA1LCAweDAwMDEgfSwKLSAgICB7ICA2LCAweDAwMDAgfSwKLSAgICB7ICAwLCAweDAwMDAgfQotfTsKLQotc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczRbMTRdID0gewotICAgIHsgIDUsIDB4MDAwMyB9LAotICAgIHsgIDMsIDB4MDAwNyB9LAotICAgIHsgIDQsIDB4MDAwNSB9LAotICAgIHsgIDQsIDB4MDAwNCB9LAotICAgIHsgIDMsIDB4MDAwNiB9LAotICAgIHsgIDMsIDB4MDAwNSB9LAotICAgIHsgIDMsIDB4MDAwNCB9LAotICAgIHsgIDQsIDB4MDAwMyB9LAotICAgIHsgIDMsIDB4MDAwMyB9LAotICAgIHsgIDQsIDB4MDAwMiB9LAotICAgIHsgIDUsIDB4MDAwMiB9LAotICAgIHsgIDUsIDB4MDAwMSB9LAotICAgIHsgIDUsIDB4MDAwMCB9LAotICAgIHsgIDAsIDB4MDAwMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zNVsxM10gPSB7Ci0gICAgeyAgNCwgMHgwMDA1IH0sCi0gICAgeyAgNCwgMHgwMDA0IH0sCi0gICAgeyAgNCwgMHgwMDAzIH0sCi0gICAgeyAgMywgMHgwMDA3IH0sCi0gICAgeyAgMywgMHgwMDA2IH0sCi0gICAgeyAgMywgMHgwMDA1IH0sCi0gICAgeyAgMywgMHgwMDA0IH0sCi0gICAgeyAgMywgMHgwMDAzIH0sCi0gICAgeyAgNCwgMHgwMDAyIH0sCi0gICAgeyAgNSwgMHgwMDAxIH0sCi0gICAgeyAgNCwgMHgwMDAxIH0sCi0gICAgeyAgNSwgMHgwMDAwIH0sCi0gICAgeyAgMCwgMHgwMDAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3M2WzEyXSA9IHsKLSAgICB7ICA2LCAweDAwMDEgfSwKLSAgICB7ICA1LCAweDAwMDEgfSwKLSAgICB7ICAzLCAweDAwMDcgfSwKLSAgICB7ICAzLCAweDAwMDYgfSwKLSAgICB7ICAzLCAweDAwMDUgfSwKLSAgICB7ICAzLCAweDAwMDQgfSwKLSAgICB7ICAzLCAweDAwMDMgfSwKLSAgICB7ICAzLCAweDAwMDIgfSwKLSAgICB7ICA0LCAweDAwMDEgfSwKLSAgICB7ICAzLCAweDAwMDEgfSwKLSAgICB7ICA2LCAweDAwMDAgfSwKLSAgICB7ICAwLCAweDAwMDAgfQotfTsKLQotc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczdbMTFdID0gewotICAgIHsgIDYsIDB4MDAwMSB9LAotICAgIHsgIDUsIDB4MDAwMSB9LAotICAgIHsgIDMsIDB4MDAwNSB9LAotICAgIHsgIDMsIDB4MDAwNCB9LAotICAgIHsgIDMsIDB4MDAwMyB9LAotICAgIHsgIDIsIDB4MDAwMyB9LAotICAgIHsgIDMsIDB4MDAwMiB9LAotICAgIHsgIDQsIDB4MDAwMSB9LAotICAgIHsgIDMsIDB4MDAwMSB9LAotICAgIHsgIDYsIDB4MDAwMCB9LAotICAgIHsgIDAsIDB4MDAwMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zOFsxMF0gPSB7Ci0gICAgeyAgNiwgMHgwMDAxIH0sCi0gICAgeyAgNCwgMHgwMDAxIH0sCi0gICAgeyAgNSwgMHgwMDAxIH0sCi0gICAgeyAgMywgMHgwMDAzIH0sCi0gICAgeyAgMiwgMHgwMDAzIH0sCi0gICAgeyAgMiwgMHgwMDAyIH0sCi0gICAgeyAgMywgMHgwMDAyIH0sCi0gICAgeyAgMywgMHgwMDAxIH0sCi0gICAgeyAgNiwgMHgwMDAwIH0sCi0gICAgeyAgMCwgMHgwMDAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3M5WzldID0gewotICAgIHsgIDYsIDB4MDAwMSB9LAotICAgIHsgIDYsIDB4MDAwMCB9LAotICAgIHsgIDQsIDB4MDAwMSB9LAotICAgIHsgIDIsIDB4MDAwMyB9LAotICAgIHsgIDIsIDB4MDAwMiB9LAotICAgIHsgIDMsIDB4MDAwMSB9LAotICAgIHsgIDIsIDB4MDAwMSB9LAotICAgIHsgIDUsIDB4MDAwMSB9LAotICAgIHsgIDAsIDB4MDAwMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMTBbOF0gPSB7Ci0gICAgeyAgNSwgMHgwMDAxIH0sCi0gICAgeyAgNSwgMHgwMDAwIH0sCi0gICAgeyAgMywgMHgwMDAxIH0sCi0gICAgeyAgMiwgMHgwMDAzIH0sCi0gICAgeyAgMiwgMHgwMDAyIH0sCi0gICAgeyAgMiwgMHgwMDAxIH0sCi0gICAgeyAgNCwgMHgwMDAxIH0sCi0gICAgeyAgMCwgMHgwMDAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MxMVs3XSA9IHsKLSAgICB7ICA0LCAweDAwMDAgfSwKLSAgICB7ICA0LCAweDAwMDEgfSwKLSAgICB7ICAzLCAweDAwMDEgfSwKLSAgICB7ICAzLCAweDAwMDIgfSwKLSAgICB7ICAxLCAweDAwMDEgfSwKLSAgICB7ICAzLCAweDAwMDMgfSwKLSAgICB7ICAwLCAweDAwMDAgfQotfTsKLQotc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczEyWzZdID0gewotICAgIHsgIDQsIDB4MDAwMCB9LAotICAgIHsgIDQsIDB4MDAwMSB9LAotICAgIHsgIDIsIDB4MDAwMSB9LAotICAgIHsgIDEsIDB4MDAwMSB9LAotICAgIHsgIDMsIDB4MDAwMSB9LAotICAgIHsgIDAsIDB4MDAwMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMTNbNV0gPSB7Ci0gICAgeyAgMywgMHgwMDAwIH0sCi0gICAgeyAgMywgMHgwMDAxIH0sCi0gICAgeyAgMSwgMHgwMDAxIH0sCi0gICAgeyAgMiwgMHgwMDAxIH0sCi0gICAgeyAgMCwgMHgwMDAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MxNFs0XSA9IHsKLSAgICB7ICAyLCAweDAwMDAgfSwKLSAgICB7ICAyLCAweDAwMDEgfSwKLSAgICB7ICAxLCAweDAwMDEgfSwKLSAgICB7ICAwLCAweDAwMDAgfQotfTsKLQotc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczE1WzNdID0gewotICAgIHsgIDEsIDB4MDAwMCB9LAotICAgIHsgIDEsIDB4MDAwMSB9LAotICAgIHsgIDAsIDB4MDAwMCB9Ci19OwotCi1jb25zdCBBUk1fVkxDMzIgKmFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNbMTVdID0gewotICAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczEsIAotICAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczIsCi0gICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMywgCi0gICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zNCwgCi0gICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zNSwgCi0gICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zNiwgCi0gICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zNywgCi0gICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zOCwgCi0gICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zOSwgCi0gICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMTAsIAotICAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczExLCAKLSAgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MxMiwgCi0gICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMTMsIAotICAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczE0LCAKLSAgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MxNSAKLX07Ci0KLXN0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJfMVs1XSA9IHsKLSAgICB7ICAxLCAxIH0sCi0gICAgeyAgMiwgMSB9LAotICAgIHsgIDMsIDEgfSwKLSAgICB7ICAzLCAwIH0sCi0gICAgeyAgMCwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyXzJbNF0gPSB7Ci0gICAgeyAgMSwgMSB9LAotICAgIHsgIDIsIDEgfSwKLSAgICB7ICAyLCAwIH0sCi0gICAgeyAgMCwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyXzNbM10gPSB7Ci0gICAgeyAgMSwgMSB9LAotICAgIHsgIDEsIDAgfSwKLSAgICB7ICAwLCAwIH0KLX07Ci0KLWNvbnN0IEFSTV9WTEMzMiAqYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXNbM10gPSB7Ci0gICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyXzEsIAotICAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4Ml8yLCAKLSAgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJfMwotfTsKLQotCi0vKiBUYWJsZXMgZm9yIHJ1bl9iZWZvcmUgKi8KLQotc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlMVszXSA9IHsKLSAgICB7ICAxLCAweDAwMDEgfSwKLSAgICB7ICAxLCAweDAwMDAgfSwKLSAgICB7ICAwLCAweDAwMDAgfQotfTsKLQotc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlMls0XSA9IHsKLSAgICB7ICAxLCAweDAwMDEgfSwKLSAgICB7ICAyLCAweDAwMDEgfSwKLSAgICB7ICAyLCAweDAwMDAgfSwKLSAgICB7ICAwLCAweDAwMDAgfQotfTsKLQotc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlM1s1XSA9IHsKLSAgICB7ICAyLCAweDAwMDMgfSwKLSAgICB7ICAyLCAweDAwMDIgfSwKLSAgICB7ICAyLCAweDAwMDEgfSwKLSAgICB7ICAyLCAweDAwMDAgfSwKLSAgICB7ICAwLCAweDAwMDAgfQotfTsKLQotc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlNFs2XSA9IHsKLSAgICB7ICAyLCAweDAwMDMgfSwKLSAgICB7ICAyLCAweDAwMDIgfSwKLSAgICB7ICAyLCAweDAwMDEgfSwKLSAgICB7ICAzLCAweDAwMDEgfSwKLSAgICB7ICAzLCAweDAwMDAgfSwKLSAgICB7ICAwLCAweDAwMDAgfQotfTsKLQotc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlNVs3XSA9IHsKLSAgICB7ICAyLCAweDAwMDMgfSwKLSAgICB7ICAyLCAweDAwMDIgfSwKLSAgICB7ICAzLCAweDAwMDMgfSwKLSAgICB7ICAzLCAweDAwMDIgfSwKLSAgICB7ICAzLCAweDAwMDEgfSwKLSAgICB7ICAzLCAweDAwMDAgfSwKLSAgICB7ICAwLCAweDAwMDAgfQotfTsKLQotc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlNls4XSA9IHsKLSAgICB7ICAyLCAweDAwMDMgfSwKLSAgICB7ICAzLCAweDAwMDAgfSwKLSAgICB7ICAzLCAweDAwMDEgfSwKLSAgICB7ICAzLCAweDAwMDMgfSwKLSAgICB7ICAzLCAweDAwMDIgfSwKLSAgICB7ICAzLCAweDAwMDUgfSwKLSAgICB7ICAzLCAweDAwMDQgfSwKLSAgICB7ICAwLCAweDAwMDAgfQotfTsKLQotc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlN1sxNl0gPSB7Ci0gICAgeyAgMywgMHgwMDA3IH0sCi0gICAgeyAgMywgMHgwMDA2IH0sCi0gICAgeyAgMywgMHgwMDA1IH0sCi0gICAgeyAgMywgMHgwMDA0IH0sCi0gICAgeyAgMywgMHgwMDAzIH0sCi0gICAgeyAgMywgMHgwMDAyIH0sCi0gICAgeyAgMywgMHgwMDAxIH0sCi0gICAgeyAgNCwgMHgwMDAxIH0sCi0gICAgeyAgNSwgMHgwMDAxIH0sCi0gICAgeyAgNiwgMHgwMDAxIH0sCi0gICAgeyAgNywgMHgwMDAxIH0sCi0gICAgeyAgOCwgMHgwMDAxIH0sCi0gICAgeyAgOSwgMHgwMDAxIH0sCi0gICAgeyAxMCwgMHgwMDAxIH0sCi0gICAgeyAxMSwgMHgwMDAxIH0sCi0gICAgeyAgMCwgMHgwMDAwIH0KLX07Ci0KLWNvbnN0IEFSTV9WTEMzMiAqYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc1s3XSA9IHsKLSAgICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZTEsIAotICAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlMiwgCi0gICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmUzLCAKLSAgICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZTQsIAotICAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlNSwgCi0gICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmU2LCAKLSAgICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZTcKLX07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NvbXBhcmVNb3Rpb25Db3N0VG9NVi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9Db21wYXJlTW90aW9uQ29zdFRvTVYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYxMWEzNy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NvbXBhcmVNb3Rpb25Db3N0VG9NVi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0NvbXBhcmVNb3Rpb25Db3N0VG9NVi5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogQ29udGFpbnMgbW9kdWxlIGZvciBjb21wYXJpbmcgbW90aW9uIHZlY3RvcnMgYW5kIFNBRCdzIHRvIGRlY2lkZSAKLSAqIHRoZSBiZXN0IE1WIGFuZCBTQUQKLSAqCi0gKi8KLSAgCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLQotI2luY2x1ZGUgImFybVZDLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0V4cEdvbEJpdHNVc2VkCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBjYWxjdWxhdGluZyBFeHAtR29sb21iIGNvZGUgbGVuZ3RoIGZvciBhIGdpdmVuIHZhbHVlcwotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JICAgICAgICAgdmFsCVNpZ25lZCBudW1iZXIgZm9yIHdoaWNoIEV4cC1Hb2xvbWIgY29kZSBsZW5ndGggaGFzCi0gKiAgICAgICAgICAgICAgICAgICAgICB0byBiZSBjYWxjdWxhdGVkCi0gKgotICogUmV0dXJuIFZhbHVlOiAKLSAqICAgICAgICAgICAgIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgRXhwLUdvbG9tYiBjb2RlIGZvciB2YWwKLSAqLwotCi1zdGF0aWMgT01YX1UxNiBhcm1WQ000UDEwX0V4cEdvbEJpdHNVc2VkIChPTVhfUzE2IHZhbCkKLXsKLSAgICBPTVhfVTE2IHNpemVDb2RlTnVtLCBjb2RlTnVtOwotICAgIAotICAgIC8qIE1hcHBpbmcgdmFsIHRvIGNvZGVOdW0gKi8KLSAgICBjb2RlTnVtID0gYXJtQWJzICh2YWwpOwotICAgIGlmICh2YWwgPiAwKQotICAgIHsKLSAgICAgICAgY29kZU51bSA9ICgyICogY29kZU51bSkgLSAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBjb2RlTnVtID0gMiAqIGNvZGVOdW07Ci0gICAgfQotICAgIAotICAgIC8qIFNpemUgb2YgdGhlIGV4cC1nb2xvbWIgY29kZSAqLwotICAgIHNpemVDb2RlTnVtID0gKDIgKiBhcm1Mb2dTaXplIChjb2RlTnVtICsgMSkpIC0gMTsKLSAgICAKLSAgICByZXR1cm4gc2l6ZUNvZGVOdW07Ci19Ci0gICAgICAgICAgICAgICAgCi0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMTBfQ29tcGFyZU1vdGlvbkNvc3RUb01WCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBjb21wYXJpc2lvbiBvZiBtb3Rpb24gdmVjdG9ycyBhbmQgTW90aW9uIGNvc3QgdG8gZGVjaWRlIHRoZSAKLSAqIGJlc3QgTVYgYW5kIGJlc3QgTUMKLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCSAgICAgICAgIG12WAl4IGNvb3JkaW5hdGUgb2YgdGhlIGNhbmRpZGF0ZSBtb3Rpb24gdmVjdG9yIGluIDEvNCBwZWwgdW5pdHMKLSAqIFtpbl0JICAgICAgICAgbXZZCXkgY29vcmRpbmF0ZSBvZiB0aGUgY2FuZGlkYXRlIG1vdGlvbiB2ZWN0b3IgaW4gMS80IHBlbCB1bml0cwotICogW2luXQkgICAgICBkaWZmTVYJZGlmZmVyZW50aWFsIE1WCi0gKiBbaW5dCSAgICAgY2FuZFNBRAlDYW5kaWRhdGUgU0FECi0gKiBbaW5dCSAgICAgIGJlc3RNVglCZXN0IE1WLCBjb250YWlucyBiZXN0IE1WIHRpbGwgdGhlIHByZXZpb3VzIGludGVyYXRpb24uCi0gKiBbaW5dICAgICAgIG5MYW1kYSAgICBMYW1kYSBmYWN0b3I7IHVzZWQgdG8gY29tcHV0ZSBtb3Rpb24gY29zdCAKLSAqIFtpbl0gICAqcEJlc3RDb3N0ICAgIENvbnRhaW5zIHRoZSBjdXJyZW50IGJlc3QgbW90aW9uIGNvc3QuCi0gKiBbb3V0XSAgKnBCZXN0Q29zdCAgICBwQmVzdENvc3QgTW90aW9uIGNvc3Qgd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIGJlc3QgTVYgCi0gKiAgICAgICAgICAgICAgICAgICAgICBhZnRlciBqdWRnZW1lbnQ7IAotICogICAgICAgICAgICAgICAgICAgICAgY29tcHV0ZWQgYXMgU0FEK0xhbWRhKkJpdHNVc2VkQnlNViwgaWYgdGhlIGNhbmRDb3N0IGlzIGxlc3MgCi0gKiAgICAgICAgICAgICAgICAgICAgICB0aGFuIHRoZSBiZXN0IGNvc3QgcGFzc2VkIHRoZW4gdGhlICpwQmVzdENvc3Qgd2lsbCBiZSBlcXVhbCB0byBjYW5kQ29zdAotICogW291dF0JICBiZXN0TVYJRmluYWxseSB3aWxsIGhhdmUgdGhlIGJlc3QgTVYgYWZ0ZXIgdGhlIGp1ZGdlbWVudC4KLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfSU5UIC0tIDEgdG8gaW5kaWNhdGUgdGhhdCB0aGUgY3VycmVudCBtb3Rpb24gY29zdCBpcyB0aGUgYmVzdCAKLSAqICAgICAgICAgICAgMCB0byBpbmRpY2F0ZSB0aGF0IGl0IGlzIE5PVCB0aGUgYmVzdCBtb3Rpb24gY29zdAotICovCi0KLU9NWF9JTlQgYXJtVkNNNFAxMF9Db21wYXJlTW90aW9uQ29zdFRvTVYgKAotICAgIE9NWF9TMTYgIG12WCwKLSAgICBPTVhfUzE2ICBtdlksCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgZGlmZk1WLCAKLSAgICBPTVhfSU5UIGNhbmRTQUQsIAotICAgIE9NWFZDTW90aW9uVmVjdG9yICpiZXN0TVYsIAotICAgIE9NWF9VMzIgbkxhbWRhLAotICAgIE9NWF9TMzIgKnBCZXN0Q29zdAotKSAKLXsKLSAgICBPTVhfUzMyIGNhbmRDb3N0OwotICAgIE9NWF9VMTYgc2l6ZUNvZGVOdW07Ci0gICAgCi0gICAgc2l6ZUNvZGVOdW0gPSBhcm1WQ000UDEwX0V4cEdvbEJpdHNVc2VkIChkaWZmTVYuZHgpOwotICAgIHNpemVDb2RlTnVtICs9IGFybVZDTTRQMTBfRXhwR29sQml0c1VzZWQgKGRpZmZNVi5keSk7Ci0gICAgCi0gICAgLyogTW90aW9uIGNvc3QgPSBTQUQgKyAgbGFtZGEgKiAoKGJpdHN1c2VkKGRpZmZNVngpICsgKGJpdHN1c2VkKGRpZmZNVnkpKSovCi0gICAgY2FuZENvc3QgPSBjYW5kU0FEICsgKG5MYW1kYSAqIHNpemVDb2RlTnVtKTsKLSAgICAgICAgCi0gICAgLyogQ2FsY3VsYXRlIGNhbmRDb3N0ICovCi0gICAgaWYgKGNhbmRDb3N0IDwgKnBCZXN0Q29zdCkKLSAgICB7Ci0gICAgICAgICpwQmVzdENvc3QgPSBjYW5kQ29zdDsKLSAgICAgICAgYmVzdE1WLT5keCA9IG12WDsKLSAgICAgICAgYmVzdE1WLT5keSA9IG12WTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIGlmIChjYW5kQ29zdCA+ICpwQmVzdENvc3QpCi0gICAgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgLyogc2hvcnRlciBtb3Rpb24gdmVjdG9yICovCi0gICAgaWYgKCAobXZYICogbXZYICsgbXZZICogbXZZKSA8ICgoYmVzdE1WLT5keCAqIGJlc3RNVi0+ZHgpICsgKGJlc3RNVi0+ZHkgKiBiZXN0TVYtPmR5KSkgKQotICAgIHsKLSAgICAgICAgKnBCZXN0Q29zdCA9IGNhbmRDb3N0OwotICAgICAgICBiZXN0TVYtPmR4ID0gbXZYOwotICAgICAgICBiZXN0TVYtPmR5ID0gbXZZOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qRW5kIG9mIEZpbGUqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZUJsb2NrUGl4ZWwuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVCbG9ja1BpeGVsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2ZGE4YWIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZUJsb2NrUGl4ZWwuYworKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0RlQmxvY2tQaXhlbC5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiAKLSAqIEguMjY0IGx1bWEgZGVibG9jayBtb2R1bGUKLSAqIAotICovCi0KLSNpZmRlZiBERUJVR19BUk1WQ000UDEwX0RFQkxPQ0tQSVhFTAotI3VuZGVmIERFQlVHX09OCi0jZGVmaW5lIERFQlVHX09OCi0jZW5kaWYgLyogREVCVUdfQVJNVkNNNFAxMF9ERUJMT0NLUElYRUwgKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0vKgotICogRGVzY3JpcHRpb24KLSAqIERlYmxvY2sgb25lIGJvdW5kYXJ5IHBpeGVsCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcFEwICAgICAgICAgUG9pbnRlciB0byBwaXhlbCBxMAotICogW2luXSBTdGVwICAgICAgICBTdGVwIGJldHdlZW4gcGl4ZWxzIHEwIGFuZCBxMQotICogW2luXSB0QzAgICAgICAgICBFZGdlIHRocmVzaG9sZCB2YWx1ZQotICogW2luXSBhbHBoYSAgICAgICBhbHBoYSB0aHJlc2hvbGQgdmFsdWUKLSAqIFtpbl0gYmV0YSAgICAgICAgYmV0YSB0aHJlc2hvbGQgdmFsdWUKLSAqIFtpbl0gYlMgICAgICAgICAgZGVibG9ja2luZyBzdHJlbmd0aAotICogW2luXSBDaHJvbWFGbGFnICBUcnVlIGZvciBjaHJvbWEgYmxvY2tzCi0gKiBbb3V0XSBwUTAgICAgICAgIERlYmxvY2tlZCBwaXhlbHMKLSAqIAotICovCi0KLXZvaWQgYXJtVkNNNFAxMF9EZUJsb2NrUGl4ZWwoCi0gICAgT01YX1U4ICpwUTAsICAgIC8qIHBvaW50ZXIgdG8gdGhlIHBpeGVsIHEwICovCi0gICAgaW50IFN0ZXAsICAgICAgIC8qIHN0ZXAgYmV0d2VlbiBwaXhlbHMgcTAgYW5kIHExICovCi0gICAgaW50IHRDMCwgICAgICAgIC8qIGVkZ2UgdGhyZXNob2xkIHZhbHVlICovCi0gICAgaW50IGFscGhhLCAgICAgIC8qIGFscGhhICovCi0gICAgaW50IGJldGEsICAgICAgIC8qIGJldGEgKi8KLSAgICBpbnQgYlMsICAgICAgICAgLyogZGVibG9ja2luZyBzdHJlbmd0aCAqLwotICAgIGludCBDaHJvbWFGbGFnCi0pCi17Ci0gICAgaW50IHAzLCBwMiwgcDEsIHAwLCBxMCwgcTEsIHEyLCBxMzsKLSAgICBpbnQgYXAsIGFxLCBkZWx0YTsKLQotICAgIGlmIChiUz09MCkKLSAgICB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBwMyA9IHBRMFstNCpTdGVwXTsKLSAgICBwMiA9IHBRMFstMypTdGVwXTsKLSAgICBwMSA9IHBRMFstMipTdGVwXTsKLSAgICBwMCA9IHBRMFstMSpTdGVwXTsKLSAgICBxMCA9IHBRMFsgMCpTdGVwXTsKLSAgICBxMSA9IHBRMFsgMSpTdGVwXTsKLSAgICBxMiA9IHBRMFsgMipTdGVwXTsKLSAgICBxMyA9IHBRMFsgMypTdGVwXTsKLQotICAgIGlmIChhcm1BYnMocDAtcTApPj1hbHBoYSB8fCBhcm1BYnMocDEtcDApPj1iZXRhIHx8IGFybUFicyhxMS1xMCk+PWJldGEpCi0gICAgewotICAgICAgICBERUJVR19QUklOVEZfMTAoIkRlQmxvY2tQaXhlbDogJTAyeCAlMDJ4ICUwMnggJTAyeCB8ICUwMnggJTAyeCAlMDJ4ICUwMnggYWxwaGE9JWQgYmV0YT0lZFxuIiwKLSAgICAgICAgICAgIHAzLCBwMiwgcDEsIHAwLCBxMCwgcTEsIHEyLCBxMywgYWxwaGEsIGJldGEpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgYXAgPSBhcm1BYnMocDIgLSBwMCk7Ci0gICAgYXEgPSBhcm1BYnMocTIgLSBxMCk7Ci0KLSAgICBpZiAoYlMgPCA0KQotICAgIHsKLSAgICAgICAgaW50IHRDID0gdEMwOwotCi0gICAgICAgIGlmIChDaHJvbWFGbGFnKQotICAgICAgICB7Ci0gICAgICAgICAgICB0QysrOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGFwIDwgYmV0YSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0QysrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGFxIDwgYmV0YSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0QysrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgCi0gICAgICAgIGRlbHRhID0gKCgocTAtcDApPDwyKSArIChwMS1xMSkgKyA0KSA+PiAzOwotICAgICAgICBkZWx0YSA9IGFybUNsaXAoLXRDLCB0QywgZGVsdGEpOwotCi0gICAgICAgIHBRMFstMSpTdGVwXSA9IChPTVhfVTgpYXJtQ2xpcCgwLCAyNTUsIHAwICsgZGVsdGEpOwotICAgICAgICBwUTBbIDAqU3RlcF0gPSAoT01YX1U4KWFybUNsaXAoMCwgMjU1LCBxMCAtIGRlbHRhKTsKLQotICAgICAgICBpZiAoQ2hyb21hRmxhZz09MCAmJiBhcDxiZXRhKQotICAgICAgICB7Ci0gICAgICAgICAgICBkZWx0YSA9IChwMiArICgocDArcTArMSk+PjEpIC0gKHAxPDwxKSk+PjE7Ci0gICAgICAgICAgICBkZWx0YSA9IGFybUNsaXAoLXRDMCwgdEMwLCBkZWx0YSk7Ci0gICAgICAgICAgICBwUTBbLTIqU3RlcF0gPSAoT01YX1U4KShwMSArIGRlbHRhKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChDaHJvbWFGbGFnPT0wICYmIGFxPGJldGEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRlbHRhID0gKHEyICsgKChwMCtxMCsxKT4+MSkgLSAocTE8PDEpKT4+MTsKLSAgICAgICAgICAgIGRlbHRhID0gYXJtQ2xpcCgtdEMwLCB0QzAsIGRlbHRhKTsKLSAgICAgICAgICAgIHBRMFsgMSpTdGVwXSA9IChPTVhfVTgpKHExICsgZGVsdGEpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgLyogYlM9PTQgKi8KLSAgICB7Ci0gICAgICAgIGlmIChDaHJvbWFGbGFnPT0wICYmIGFwPGJldGEgJiYgYXJtQWJzKHAwLXEwKTwoKGFscGhhPj4yKSsyKSkKLSAgICAgICAgewotICAgICAgICAgICAgcFEwWy0xKlN0ZXBdID0gKE9NWF9VOCkoKHAyICsgMipwMSArIDIqcDAgKyAyKnEwICsgcTEgKyA0KT4+Myk7Ci0gICAgICAgICAgICBwUTBbLTIqU3RlcF0gPSAoT01YX1U4KSgocDIgKyBwMSArIHAwICsgcTAgKyAyKT4+Mik7Ci0gICAgICAgICAgICBwUTBbLTMqU3RlcF0gPSAoT01YX1U4KSgoMipwMyArIDMqcDIgKyBwMSArIHAwICsgcTAgKyA0KT4+Myk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwUTBbLTEqU3RlcF0gPSAoT01YX1U4KSgoMipwMSArIHAwICsgcTEgKyAyKT4+Mik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoQ2hyb21hRmxhZz09MCAmJiBhcTxiZXRhICYmIGFybUFicyhwMC1xMCk8KChhbHBoYT4+MikrMikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBRMFsgMCpTdGVwXSA9IChPTVhfVTgpKChxMiArIDIqcTEgKyAyKnEwICsgMipwMCArIHAxICsgNCk+PjMpOwotICAgICAgICAgICAgcFEwWyAxKlN0ZXBdID0gKE9NWF9VOCkoKHEyICsgcTEgKyBwMCArIHEwICsgMik+PjIpOwotICAgICAgICAgICAgcFEwWyAyKlN0ZXBdID0gKE9NWF9VOCkoKDIqcTMgKyAzKnEyICsgcTEgKyBxMCArIHAwICsgNCk+PjMpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcFEwWyAwKlN0ZXBdID0gKE9NWF9VOCkoKDIqcTEgKyBxMCArIHAxICsgMik+PjIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgREVCVUdfUFJJTlRGXzEzKCJEZUJsb2NrUGl4ZWw6ICUwMnggJTAyeCAlMDJ4ICUwMnggfCAlMDJ4ICUwMnggJTAyeCAlMDJ4IGJTPSVkIC0+ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCi0gICAgICAgIHAzLCBwMiwgcDEsIHAwLCBxMCwgcTEsIHEyLCBxMywgYlMsCi0gICAgICAgIHBRMFstMipTdGVwXSwgcFEwWy0xKlN0ZXBdLHBRMFswKlN0ZXBdLHBRMFsxKlN0ZXBdKTsKLQotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMWQ1M2IuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIuYworKysgL2Rldi9udWxsCkBAIC0xLDI4MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpci5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiAKLSAqIEguMjY0IGRlY29kZSBjb2VmZmljaWVudHMgbW9kdWxlCi0gKiAKLSAqLwotIAotI2lmZGVmIERFQlVHX0FSTVZDTTRQMTBfREVDT0RFQ09FRkZTVE9QQUlSCi0jdW5kZWYgREVCVUdfT04KLSNkZWZpbmUgREVCVUdfT04KLSNlbmRpZgotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgotI2luY2x1ZGUgImFybVZDTTRQMTBfQ0FWTENUYWJsZXMuaCIKLQotLyogNHg0IERlWmlnWmFnIHRhYmxlICovCi0KLXN0YXRpYyBjb25zdCBPTVhfVTggYXJtVkNNNFAxMF9aaWdaYWdbMTZdID0KLXsKLSAgICAwLCAxLCA0LCA4LCA1LCAyLCAzLCA2LCA5LCAxMiwgMTMsIDEwLCA3LCAxMSwgMTQsIDE1Ci19OwotCi0vKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm0gdGhlIHdvcmsgcmVxdWlyZWQgYnkgdGhlIE9wZW5NQVgKLSAqIERlY29kZUNvZWZmc1RvUGFpciBmdW5jdGlvbiBhbmQgRGVjb2RlQ2hyb21hRENDb2VmZnNUb1BhaXIuCi0gKiBTaW5jZSBtb3N0IG9mIHRoZSBjb2RlIGlzIGNvbW1vbiB3ZSBzaGFyZSBpdCBoZXJlLgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBwQml0U3RyZWFtCQlEb3VibGUgcG9pbnRlciB0byBjdXJyZW50IGJ5dGUgaW4gYml0IHN0cmVhbSBidWZmZXIKLSAqIFtpbl0JcE9mZnNldAkJCVBvaW50ZXIgdG8gY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAotICoJCQkJCQkJCXRvIGJ5ICpwcEJpdFN0cmVhbQotICogW2luXQlzTWF4TnVtQ29lZmYJTWF4aW11bSBudW1iZXIgb2Ygbm9uLXplcm8gY29lZmZpY2llbnRzIGluIGN1cnJlbnQKLSAqCQkJCQkJCQlibG9jayAoNCwxNSBvciAxNikKLSAqIFtpbl0JblRhYmxlICAgICAgICAgIFRhYmxlIG51bWJlciAoMCB0byA0KSBhY2NvcmRpbmcgdG8gdGhlIGZpdmUgY29sdW1ucwotICogICAgICAgICAgICAgICAgICAgICAgb2YgVGFibGUgOS01IGluIHRoZSBILjI2NCBzcGVjCi0gKiBbb3V0XQlwcEJpdFN0cmVhbQkJKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkCi0gKiBbb3V0XQlwT2Zmc2V0CQkJKnBPZmZzZXQgaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQKLSAqIFtvdXRdCXBOdW1Db2VmZgkJUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIG5vbnplcm8gY29lZmZpY2llbnRzIGluCi0gKgkJCQkJCQkJdGhpcyBibG9jawotICogW291dF0JcHBQb3NDb2VmYnVmCURvdWJsZSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIHJlc2lkdWFsCi0gKgkJCQkJCQkJY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIG9teEVycm9yIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0KLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIoCi0gICAgIGNvbnN0IE9NWF9VOCoqIHBwQml0U3RyZWFtLAotICAgICBPTVhfUzMyKiBwT2Zmc2V0LAotICAgICBPTVhfVTgqIHBOdW1Db2VmZiwKLSAgICAgT01YX1U4ICAqKnBwUG9zQ29lZmJ1ZiwKLSAgICAgT01YX0lOVCBuVGFibGUsCi0gICAgIE9NWF9JTlQgc01heE51bUNvZWZmICAgICAgICAKLSApCi17Ci0gICAgaW50IENvZWZmVG9rZW4sIFRvdGFsQ29lZmYsIFRyYWlsaW5nT25lczsKLSAgICBpbnQgTGV2ZWwsIExldmVsQ29kZSwgTGV2ZWxQcmVmaXgsIExldmVsU3VmZml4LCBMZXZlbFN1ZmZpeFNpemU7Ci0gICAgaW50IFN1ZmZpeExlbmd0aCwgUnVuLCBaZXJvc0xlZnQsQ29lZmZOdW07Ci0gICAgaW50IGksIEZsYWdzOwotICAgIE9NWF9VOCAqcFBvc0NvZWZidWYgPSAqcHBQb3NDb2VmYnVmOwotICAgIE9NWF9TMTYgcExldmVsWzE2XTsKLSAgICBPTVhfVTggIHBSdW5bMTZdOwotCi0gICAgQ29lZmZUb2tlbiA9IGFybVVuUGFja1ZMQzMyKHBwQml0U3RyZWFtLCBwT2Zmc2V0LCBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc1tuVGFibGVdKTsKLSAgICBhcm1SZXREYXRhRXJySWYoQ29lZmZUb2tlbiA9PSBBUk1fTk9fQ09ERUJPT0tfSU5ERVgsIE9NWF9TdHNfRXJyKTsKLQotICAgIFRyYWlsaW5nT25lcyA9IGFybVZDTTRQMTBfQ0FWTENUcmFpbGluZ09uZXNbQ29lZmZUb2tlbl07Ci0gICAgVG90YWxDb2VmZiAgID0gYXJtVkNNNFAxMF9DQVZMQ1RvdGFsQ29lZmZbQ29lZmZUb2tlbl07Ci0gICAgKnBOdW1Db2VmZiAgID0gKE9NWF9VOClUb3RhbENvZWZmOwotCi0gICAgREVCVUdfUFJJTlRGXzIoIlRvdGFsQ29lZmYgPSAlZCwgVHJhaWxpbmdPbmVzID0gJWRcbiIsIFRvdGFsQ29lZmYsIFRyYWlsaW5nT25lcyk7Ci0KLSAgICBpZiAoVG90YWxDb2VmZiA9PSAwKQotICAgIHsKLSAgICAgICAgLyogTm90aGluZyB0byBkbyAqLwotICAgICAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLSAgICB9Ci0KLSAgICAvKiBEZWNvZGUgdHJhaWxpbmcgb25lcyAqLwotICAgIGZvciAoaT1Ub3RhbENvZWZmLTE7IGk+PVRvdGFsQ29lZmYtVHJhaWxpbmdPbmVzOyBpLS0pCi0gICAgewotICAgICAgICBpZiAoYXJtR2V0Qml0cyhwcEJpdFN0cmVhbSwgcE9mZnNldCwgMSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIExldmVsID0gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBMZXZlbCA9ICsxOwotICAgICAgICB9Ci0gICAgICAgIHBMZXZlbFtpXSA9IChPTVhfUzE2KUxldmVsOwotCi0gICAgICAgIERFQlVHX1BSSU5URl8yKCJMZXZlbFslZF0gPSAlZFxuIiwgaSwgcExldmVsW2ldKTsKLSAgICB9Ci0KLSAgICAvKiBEZWNvZGUgKG5vbiB6ZXJvKSBsZXZlbCB2YWx1ZXMgKi8KLSAgICBTdWZmaXhMZW5ndGggPSAwOwotICAgIGlmIChUb3RhbENvZWZmPjEwICYmIFRyYWlsaW5nT25lczwzKQotICAgIHsKLSAgICAgICAgU3VmZml4TGVuZ3RoPTE7Ci0gICAgfQotICAgIGZvciAoIDsgaT49MDsgaS0tKQotICAgIHsKLSAgICAgICAgTGV2ZWxQcmVmaXggPSBhcm1VblBhY2tWTEMzMihwcEJpdFN0cmVhbSwgcE9mZnNldCwgYXJtVkNNNFAxMF9DQVZMQ0xldmVsUHJlZml4KTsKLSAgICAgICAgYXJtUmV0RGF0YUVycklmKExldmVsUHJlZml4ID09IEFSTV9OT19DT0RFQk9PS19JTkRFWCwgT01YX1N0c19FcnIpOwotCi0gICAgICAgIExldmVsU3VmZml4U2l6ZSA9IFN1ZmZpeExlbmd0aDsKLSAgICAgICAgaWYgKExldmVsUHJlZml4PT0xNCAmJiBTdWZmaXhMZW5ndGg9PTApCi0gICAgICAgIHsKLSAgICAgICAgICAgIExldmVsU3VmZml4U2l6ZSA9IDQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKExldmVsUHJlZml4PT0xNSkKLSAgICAgICAgewotICAgICAgICAgICAgTGV2ZWxTdWZmaXhTaXplID0gMTI7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIExldmVsU3VmZml4ID0gMDsKLSAgICAgICAgaWYgKExldmVsU3VmZml4U2l6ZSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIExldmVsU3VmZml4ID0gYXJtR2V0Qml0cyhwcEJpdFN0cmVhbSwgcE9mZnNldCwgTGV2ZWxTdWZmaXhTaXplKTsKLSAgICAgICAgfQotCi0gICAgICAgIExldmVsQ29kZSA9IChMZXZlbFByZWZpeCA8PCBTdWZmaXhMZW5ndGgpICsgTGV2ZWxTdWZmaXg7Ci0KLQotICAgICAgICBpZiAoTGV2ZWxQcmVmaXg9PTE1ICYmIFN1ZmZpeExlbmd0aD09MCkKLSAgICAgICAgewotICAgICAgICAgICAgTGV2ZWxDb2RlICs9IDE1OwotICAgICAgICB9Ci0KLSAgICAgICAgLyogTGV2ZWxDb2RlID0gMioobWFnbml0dWRlLTEpICsgc2lnbiAqLwotCi0gICAgICAgIGlmIChpPT1Ub3RhbENvZWZmLTEtVHJhaWxpbmdPbmVzICYmIFRyYWlsaW5nT25lczwzKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBMZXZlbCBtYWduaXR1ZGUgY2FuJ3QgYmUgMSAqLwotICAgICAgICAgICAgTGV2ZWxDb2RlICs9IDI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKExldmVsQ29kZSAmIDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIDJhKzEgbWFwcyB0byAtYS0xICovCi0gICAgICAgICAgICBMZXZlbCA9ICgtTGV2ZWxDb2RlLTEpPj4xOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyogMmErMCBtYXBzIHRvICthKzEgKi8KLSAgICAgICAgICAgIExldmVsID0gKExldmVsQ29kZSsyKT4+MTsKLSAgICAgICAgfQotICAgICAgICBwTGV2ZWxbaV0gPSAoT01YX1MxNilMZXZlbDsKLQotICAgICAgICBERUJVR19QUklOVEZfMigiTGV2ZWxbJWRdID0gJWRcbiIsIGksIHBMZXZlbFtpXSk7Ci0KLSAgICAgICAgaWYgKFN1ZmZpeExlbmd0aD09MCkKLSAgICAgICAgewotICAgICAgICAgICAgU3VmZml4TGVuZ3RoPTE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCAoKExldmVsQ29kZT4+MSkrMSk+KDM8PChTdWZmaXhMZW5ndGgtMSkpICYmIFN1ZmZpeExlbmd0aDw2ICkKLSAgICAgICAgewotICAgICAgICAgICAgU3VmZml4TGVuZ3RoKys7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBEZWNvZGUgcnVuIHZhbHVlcyAqLwotICAgIFplcm9zTGVmdCA9IDA7Ci0gICAgaWYgKFRvdGFsQ29lZmYgPCBzTWF4TnVtQ29lZmYpCi0gICAgewotICAgICAgICAvKiBEZWNvZGUgVG90YWxaZXJvcyBWTEMgKi8KLSAgICAgICAgaWYgKHNNYXhOdW1Db2VmZj09NCkKLSAgICAgICAgewotICAgICAgICAgICAgWmVyb3NMZWZ0ID0gYXJtVW5QYWNrVkxDMzIocHBCaXRTdHJlYW0sIHBPZmZzZXQsIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzW1RvdGFsQ29lZmYtMV0pOwotICAgICAgICAgICAgYXJtUmV0RGF0YUVycklmKFplcm9zTGVmdCA9PUFSTV9OT19DT0RFQk9PS19JTkRFWCAsIE9NWF9TdHNfRXJyKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIFplcm9zTGVmdCA9IGFybVVuUGFja1ZMQzMyKHBwQml0U3RyZWFtLCBwT2Zmc2V0LCBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzW1RvdGFsQ29lZmYtMV0pOwotICAgICAgICAgICAgIGFybVJldERhdGFFcnJJZihaZXJvc0xlZnQgPT1BUk1fTk9fQ09ERUJPT0tfSU5ERVggLCBPTVhfU3RzX0Vycik7Ci0JICAgIH0KLSAgICB9Ci0KLSAgICBERUJVR19QUklOVEZfMSgiVG90YWxaZXJvcyA9ICVkXG4iLCBaZXJvc0xlZnQpOwotCi0JQ29lZmZOdW09WmVyb3NMZWZ0K1RvdGFsQ29lZmYtMTsKLQotICAgIGZvciAoaT1Ub3RhbENvZWZmLTE7IGk+MDsgaS0tKQotICAgIHsKLSAgICAgICAgUnVuID0gMDsKLSAgICAgICAgaWYgKFplcm9zTGVmdCA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBUYWJsZSA9IFplcm9zTGVmdDsKLSAgICAgICAgICAgIGlmIChUYWJsZSA+IDYpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVGFibGUgPSA3OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgUnVuID0gYXJtVW5QYWNrVkxDMzIocHBCaXRTdHJlYW0sIHBPZmZzZXQsIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNbVGFibGUtMV0pOwotICAgICAgICAgICAgYXJtUmV0RGF0YUVycklmKFJ1biA9PSBBUk1fTk9fQ09ERUJPT0tfSU5ERVgsIE9NWF9TdHNfRXJyKTsKLSAgICAgICAgfQotICAgICAgICBwUnVuW2ldID0gKE9NWF9VOClSdW47Ci0KLSAgICAgICAgREVCVUdfUFJJTlRGXzIoIlJ1blslZF0gPSAlZFxuIiwgaSwgcFJ1bltpXSk7Ci0KLSAgICAgICAgWmVyb3NMZWZ0IC09IFJ1bjsKLSAgICB9Ci0gICAgcFJ1blswXSA9IChPTVhfVTgpWmVyb3NMZWZ0OwotCi0gICAgREVCVUdfUFJJTlRGXzEoIlJ1blswXSA9ICVkXG4iLCBwUnVuW2ldKTsKLQotCi0gICAgLyogRmlsbCBpbiBjb2VmZmljaWVudHMgKi8KLQkgICAgCi0gICAgaWYgKHNNYXhOdW1Db2VmZj09MTUpCi0gICAgewotICAgICAgICBDb2VmZk51bSsrOyAvKiBTa2lwIHRoZSBEQyBwb3NpdGlvbiAqLwotICAgIH0KLQkKLQkvKmZvciAoaT0wO2k8VG90YWxDb2VmZjtpKyspCi0JCUNvZWZmTnVtICs9IHBSdW5baV0rMTsqLwotICAgIAotCWZvciAoaT0oVG90YWxDb2VmZi0xKTsgaT49MDsgaS0tKQotICAgIHsKLSAgICAgICAgLypDb2VmZk51bSArPSBwUnVuW2ldKzE7Ki8KLSAgICAgICAgTGV2ZWwgICAgID0gcExldmVsW2ldOwotCi0gICAgICAgIERFQlVHX1BSSU5URl8yKCJDb2VmWyVkXSA9ICVkXG4iLCBDb2VmZk51bSwgTGV2ZWwpOwotCi0gICAgICAgIEZsYWdzID0gQ29lZmZOdW07Ci0JCUNvZWZmTnVtIC09IChwUnVuW2ldKzEpOwotICAgICAgICBpZiAoc01heE51bUNvZWZmPjQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFBlcmZvcm0gNHg0IERlWmlnWmFnICovCi0gICAgICAgICAgICBGbGFncyA9IGFybVZDTTRQMTBfWmlnWmFnW0ZsYWdzXTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaT09MCkKLSAgICAgICAgeyAgIAotICAgICAgICAgICAgLyogRW5kIG9mIGJsb2NrIGZsYWcgKi8KLSAgICAgICAgICAgIEZsYWdzICs9IDB4MjA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKExldmVsPC0xMjggfHwgTGV2ZWw+MTI3KQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBPdmVyZmxvdyBmbGFnICovCi0gICAgICAgICAgICBGbGFncyArPSAweDEwOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAqcFBvc0NvZWZidWYrKyA9IChPTVhfVTgpKEZsYWdzKTsKLSAgICAgICAgKnBQb3NDb2VmYnVmKysgPSAoT01YX1U4KShMZXZlbCAmIDB4RkYpOwotICAgICAgICBpZiAoRmxhZ3MgJiAweDEwKQotICAgICAgICB7Ci0gICAgICAgICAgICAqcFBvc0NvZWZidWYrKyA9IChPTVhfVTgpKExldmVsPj44KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgICpwcFBvc0NvZWZidWYgPSBwUG9zQ29lZmJ1ZjsKLQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ2Y2VmMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfRGVxdWFudFRhYmxlcy5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogSC4yNjQgaW52ZXJzZSBxdWFudGl6ZSB0YWJsZXMKLSAqIAotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0KLQotY29uc3QgT01YX1U4IGFybVZDTTRQMTBfUG9zVG9WQ29sNHg0WzE2XSA9IAotewotICAgIDAsIDIsIDAsIDIsCi0gICAgMiwgMSwgMiwgMSwKLSAgICAwLCAyLCAwLCAyLAotICAgIDIsIDEsIDIsIDEKLX07Ci0KLWNvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1Bvc1RvVkNvbDJ4Mls0XSA9IAotewotICAgIDAsIDIsCi0gICAgMiwgMQotfTsKLQotY29uc3QgT01YX1U4IGFybVZDTTRQMTBfVk1hdHJpeFs2XVszXSA9Ci17Ci0gICAgeyAxMCwgMTYsIDEzIH0sCi0gICAgeyAxMSwgMTgsIDE0IH0sCi0gICAgeyAxMywgMjAsIDE2IH0sCi0gICAgeyAxNCwgMjMsIDE4IH0sCi0gICAgeyAxNiwgMjUsIDIwIH0sCi0gICAgeyAxOCwgMjksIDIzIH0KLX07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0Z3ZFRyYW5zZm9ybVJlc2lkdWFsNHg0LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0Z3ZFRyYW5zZm9ybVJlc2lkdWFsNHg0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3ZDZjMGYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9Gd2RUcmFuc2Zvcm1SZXNpZHVhbDR4NC5jCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9Gd2RUcmFuc2Zvcm1SZXNpZHVhbDR4NC5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogSC4yNjQgdHJhbnNmb3JtIG1vZHVsZQotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSAKLS8qCi0gKiBEZXNjcmlwdGlvbjoKLSAqIEZvcndhcmQgVHJhbnNmb3JtIFJlc2lkdWFsIDR4NCBDb2VmZmljaWVudHMKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgcFNyYwkJU291cmNlIDR4NCBibG9jawotICogW291dF0gcERzdAkJRGVzdGluYXRpb24gNHg0IGJsb2NrCi0gKgotICovCi12b2lkIGFybVZDTTRQMTBfRndkVHJhbnNmb3JtUmVzaWR1YWw0eDQoT01YX1MxNiogcERzdCwgT01YX1MxNiAqcFNyYykKLXsKLSAgICBpbnQgaTsKLQotICAgIC8qIFRyYW5zZm9ybSByb3dzICovCi0gICAgZm9yIChpPTA7IGk8MTY7IGkrPTQpCi0gICAgewotICAgICAgICBpbnQgZDAgPSBwU3JjW2krMF07Ci0gICAgICAgIGludCBkMSA9IHBTcmNbaSsxXTsKLSAgICAgICAgaW50IGQyID0gcFNyY1tpKzJdOwotICAgICAgICBpbnQgZDMgPSBwU3JjW2krM107Ci0gICAgICAgIGludCBlMCA9IGQwICsgZDM7Ci0gICAgICAgIGludCBlMSA9IGQwIC0gZDM7Ci0gICAgICAgIGludCBlMiA9IGQxICsgZDI7Ci0gICAgICAgIGludCBlMyA9IGQxIC0gZDI7Ci0gICAgICAgIGludCBmMCA9IGUwICsgZTI7Ci0gICAgICAgIGludCBmMSA9IChlMSA8PCAxKSArIGUzOwotICAgICAgICBpbnQgZjIgPSBlMCAtIGUyOwotICAgICAgICBpbnQgZjMgPSBlMSAtIChlMyA8PCAxKTsKLSAgICAgICAgcERzdFtpKzBdID0gKE9NWF9TMTYpZjA7Ci0gICAgICAgIHBEc3RbaSsxXSA9IChPTVhfUzE2KWYxOwotICAgICAgICBwRHN0W2krMl0gPSAoT01YX1MxNilmMjsKLSAgICAgICAgcERzdFtpKzNdID0gKE9NWF9TMTYpZjM7Ci0gICAgfQotCi0gICAgLyogVHJhbnNmb3JtIGNvbHVtbnMgKi8KLSAgICBmb3IgKGk9MDsgaTw0OyBpKyspCi0gICAgewotICAgICAgICBpbnQgZjAgPSBwRHN0W2krMF07Ci0gICAgICAgIGludCBmMSA9IHBEc3RbaSs0XTsKLSAgICAgICAgaW50IGYyID0gcERzdFtpKzhdOwotICAgICAgICBpbnQgZjMgPSBwRHN0W2krMTJdOwotICAgICAgICBpbnQgZzAgPSBmMCArIGYzOwotICAgICAgICBpbnQgZzEgPSBmMCAtIGYzOwotICAgICAgICBpbnQgZzIgPSBmMSArIGYyOwotICAgICAgICBpbnQgZzMgPSBmMSAtIGYyOwotICAgICAgICBpbnQgaDAgPSBnMCArIGcyOwotICAgICAgICBpbnQgaDEgPSAoZzEgPDwgMSkgKyBnMzsKLSAgICAgICAgaW50IGgyID0gZzAgLSBnMjsKLSAgICAgICAgaW50IGgzID0gZzEgLSAoZzMgPDwgMSk7Ci0gICAgICAgIHBEc3RbaSswXSA9IChPTVhfUzE2KSBoMDsKLSAgICAgICAgcERzdFtpKzRdID0gKE9NWF9TMTYpIGgxOwotICAgICAgICBwRHN0W2krOF0gPSAoT01YX1MxNikgaDI7Ci0gICAgICAgIHBEc3RbaSsxMl0gPSAoT01YX1MxNikgaDM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZEaWFnX0x1bWEuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmRGlhZ19MdW1hLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlOWRmNDkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZEaWFnX0x1bWEuYworKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZEaWFnX0x1bWEuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9ucyB3aWxsIGhlbHAgdG8gY2FsY3VsYXRlIEhhbGYgUGVsIGx1bWEgaW50ZXJwb2xhdGlvbgotICogCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmRGlhZ19MdW1hCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciAoMS8yLCAxLzIpICBwb3NpdGlvbnMgCi0gKiBhcm91bmQgYSBmdWxsLXBlbCBwb3NpdGlvbi4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqICBbaW5dICAgIHBTcmMgICAgICAgIFBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZQotICogIFtpbl0gICAgaVNyY1N0ZXAgICAgU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4KLSAqICBbaW5dICAgIGlEc3RTdGVwICAgIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KLSAqICBbaW5dICAgIGlXaWR0aCAgICAgIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKiAgW2luXSAgICBpSGVpZ2h0ICAgICBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqICBbb3V0XSAgIHBEc3QgICAgICAgIFBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSAoMS8yLDEvMiktcGVsCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZEaWFnX0x1bWEoICAKLSAgICAgICAgY29uc3QgT01YX1U4KiAgICAgcFNyYywgCi0gICAgICAgIE9NWF9VMzIgICAgIGlTcmNTdGVwLCAKLSAgICAgICAgT01YX1U4KiAgICAgcERzdCwgCi0gICAgICAgIE9NWF9VMzIgICAgIGlEc3RTdGVwLAotICAgICAgICBPTVhfVTMyICAgICBpV2lkdGgsIAotICAgICAgICBPTVhfVTMyICAgICBpSGVpZ2h0Ci0pCi17Ci0gICAgT01YX1MzMiAgICAgSGFsZkNvZWZmLCBwb3M7Ci0gICAgT01YX1MxNiAgICAgQnVmIFsyMSAqIDE2XTsgIC8qIDIxIHJvd3MgYnkgMTYgcGl4ZWxzIHBlciByb3cgKi8KLSAgICBPTVhfVTMyICAgICB5LCB4OwotCi0gICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotCi0gICAgLyoKLSAgICAgKiBJbnRlcm1lZGlhdGUgdmFsdWVzIHdpbGwgYmUgMS8yIHBlbCBhdCBIb3Jpem9udGFsIGRpcmVjdGlvbgotICAgICAqIFN0YXJ0aW5nIGF0ICgwLjUsIC0yKSBhdCB0b3AgZXh0ZW5kaW5nIHRvICgwLjUsIGhlaWdodCArIDMpIGF0IGJvdHRvbQotICAgICAqIEJ1ZiBjb250YWlucyBhIDJEIGFycmF5IG9mIHNpemUgKGlXaWR0aClYKGlIZWlnaHQgKyA1KQotICAgICAqLwotICAgIGZvciAoeSA9IDA7IHkgPCBpSGVpZ2h0ICsgNTsgeSsrKQotICAgIHsKLSAgICAgICAgZm9yICh4ID0gMDsgeCA8IGlXaWR0aDsgeCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBwb3MgPSAoeS0yKSAqIGlTcmNTdGVwICsgeDsKLSAgICAgICAgICAgIEhhbGZDb2VmZiA9IAotICAgICAgICAgICAgICAgIHBTcmMgW3BvcyAtIDJdIC0gCi0gICAgICAgICAgICAgICAgNSAqIHBTcmMgW3BvcyAtIDFdICsgCi0gICAgICAgICAgICAgICAgMjAgKiBwU3JjIFtwb3NdICsgCi0gICAgICAgICAgICAgICAgMjAgKiBwU3JjIFtwb3MgKyAxXSAtIAotICAgICAgICAgICAgICAgIDUgKiBwU3JjIFtwb3MgKyAyXSArIAotICAgICAgICAgICAgICAgIHBTcmMgW3BvcyArIDNdOwotICAgICAgICAgICAgQnVmIFt5ICogaVdpZHRoICsgeF0gPSAoT01YX1MxNilIYWxmQ29lZmY7Ci0gICAgICAgIH0gLyogeCAqLwotICAgIH0gLyogeSAqLwotCi0gICAgLyogVmVydGljYWwgaW50ZXJwb2xhdGUgKi8KLSAgICBmb3IgKHkgPSAwOyB5IDwgaUhlaWdodDsgeSsrKQotICAgIHsKLSAgICAgICAgZm9yICh4ID0gMDsgeCA8IGlXaWR0aDsgeCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBwb3MgPSB5ICogaVdpZHRoICsgeDsKLSAgICAgICAgICAgIEhhbGZDb2VmZiA9IAotICAgICAgICAgICAgICAgIEJ1ZiBbcG9zXSAtIAotICAgICAgICAgICAgICAgIDUgKiBCdWYgW3BvcyArIDEgKiBpV2lkdGhdICsgCi0gICAgICAgICAgICAgICAgMjAgKiBCdWYgW3BvcyArIDIgKiBpV2lkdGhdICsgCi0gICAgICAgICAgICAgICAgMjAgKiBCdWYgW3BvcyArIDMgKiBpV2lkdGhdIC0gCi0gICAgICAgICAgICAgICAgNSAqIEJ1ZiBbcG9zICsgNCAqIGlXaWR0aF0gKyAKLSAgICAgICAgICAgICAgICBCdWYgW3BvcyArIDUgKiBpV2lkdGhdOwotCi0gICAgICAgICAgICBIYWxmQ29lZmYgPSAoSGFsZkNvZWZmICsgNTEyKSA+PiAxMDsKLSAgICAgICAgICAgIEhhbGZDb2VmZiA9IGFybUNsaXAoMCwgMjU1LCBIYWxmQ29lZmYpOwotCi0gICAgICAgICAgICBwRHN0IFt5ICogaURzdFN0ZXAgKyB4XSA9IChPTVhfVTgpIEhhbGZDb2VmZjsKLSAgICAgICAgfQotICAgIH0KLSAgICAgICAgCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NDYyYjIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYS5jCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9ucyB3aWxsIGhlbHAgdG8gY2FsY3VsYXRlIEhhbGYgUGVsIGx1bWEgaW50ZXJwb2xhdGlvbgotICogCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yIGhvcml6b250YWwgMS8yLXBlbCBwb3NpdGlvbnMKLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqICBbaW5dICAgIHBTcmMgICAgICAgIFBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZQotICogIFtpbl0gICAgaVNyY1N0ZXAgICAgU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4KLSAqICBbaW5dICAgIGlEc3RTdGVwICAgIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KLSAqICBbaW5dICAgIGlXaWR0aCAgICAgIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKiAgW2luXSAgICBpSGVpZ2h0ICAgICBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqICBbb3V0XSAgIHBEc3QgICAgICAgIFBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSAxLzItcGVsIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEoCi0gICAgICAgIGNvbnN0IE9NWF9VOCogICAgIHBTcmMsIAotICAgICAgICBPTVhfVTMyICAgICBpU3JjU3RlcCwgCi0gICAgICAgIE9NWF9VOCogICAgIHBEc3QsIAotICAgICAgICBPTVhfVTMyICAgICBpRHN0U3RlcCwgCi0gICAgICAgIE9NWF9VMzIgICAgIGlXaWR0aCwgCi0gICAgICAgIE9NWF9VMzIgICAgIGlIZWlnaHQKLSkKLXsKLSAgICBPTVhfSU5UICAgICB4LCB5OwotICAgIE9NWF9TMzIgICAgIEhhbGZDb2VmZiwgcG9zOwotCi0gICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotCi0gICAgZm9yICh5ID0gMDsgeSA8IGlIZWlnaHQ7IHkrKykKLSAgICB7Ci0gICAgICAgIGZvciAoeCA9IDA7IHggPCBpV2lkdGg7IHgrKykKLSAgICAgICAgewotICAgICAgICAgICAgcG9zID0geSAqIGlTcmNTdGVwICsgeDsKLSAgICAgICAgICAgIEhhbGZDb2VmZiA9IAotICAgICAgICAgICAgICAgIHBTcmMgW3BvcyAtIDJdIC0gCi0gICAgICAgICAgICAgICAgNSAqIHBTcmMgW3BvcyAtIDFdICsgCi0gICAgICAgICAgICAgICAgMjAgKiBwU3JjIFtwb3NdICsgCi0gICAgICAgICAgICAgICAgMjAgKiBwU3JjIFtwb3MgKyAxXSAtIAotICAgICAgICAgICAgICAgIDUgKiBwU3JjIFtwb3MgKyAyXSArIAotICAgICAgICAgICAgICAgIHBTcmMgW3BvcyArIDNdOwotCi0gICAgICAgICAgICBIYWxmQ29lZmYgPSAoSGFsZkNvZWZmICsgMTYpID4+IDU7Ci0gICAgICAgICAgICBIYWxmQ29lZmYgPSBhcm1DbGlwKDAsIDI1NSwgSGFsZkNvZWZmKTsKLQotICAgICAgICAgICAgcERzdCBbeSAqIGlEc3RTdGVwICsgeF0gPSBIYWxmQ29lZmY7Ci0gICAgICAgIH0gLyogeCAqLwotICAgIH0gLyogeSAqLwotCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThhZGY0NS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb25zIHdpbGwgaGVscCB0byBjYWxjdWxhdGUgSGFsZiBQZWwgbHVtYSBpbnRlcnBvbGF0aW9uCi0gKiAKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yIHZlcnRpY2FsIDEvMi1wZWwgcG9zaXRpb25zIAotICogYXJvdW5kIGEgZnVsbC1wZWwgcG9zaXRpb24uCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiAgW2luXSAgICBwU3JjICAgICAgICBQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIGludGVycG9sYXRlIAotICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHJlY29uc3RydWN0ZWQgZnJhbWUgcGxhbmUKLSAqICBbaW5dICAgIGlTcmNTdGVwICAgIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuCi0gKiAgW2luXSAgICBpRHN0U3RlcCAgICBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXIuCi0gKiAgW2luXSAgICBpV2lkdGggICAgICBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jawotICogIFtpbl0gICAgaUhlaWdodCAgICAgSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKiAgW291dF0gICBwRHN0ICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgMS8yLXBlbAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEoICAgCi0gICAgIGNvbnN0IE9NWF9VOCogICAgcFNyYywgCi0gICAgIE9NWF9VMzIgICAgaVNyY1N0ZXAsIAotICAgICBPTVhfVTgqICAgIHBEc3QsCi0gICAgIE9NWF9VMzIgICAgaURzdFN0ZXAsIAotICAgICBPTVhfVTMyICAgIGlXaWR0aCwgCi0gICAgIE9NWF9VMzIgICAgaUhlaWdodAotKQotewotICAgIE9NWF9TMzIgICAgIEhhbGZDb2VmZiwgcG9zOwotICAgIE9NWF9JTlQgICAgIHksIHg7Ci0KLSAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0KLQotICAgIGZvciAoeSA9IDA7IHkgPCBpSGVpZ2h0OyB5KyspCi0gICAgewotICAgICAgICBmb3IgKHggPSAwOyB4IDwgaVdpZHRoOyB4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBvcyA9IHkgKiBpU3JjU3RlcCArIHg7Ci0gICAgICAgICAgICBIYWxmQ29lZmYgPSAKLSAgICAgICAgICAgICAgICBwU3JjIFtwb3MgLSAyICogaVNyY1N0ZXBdIC0gCi0gICAgICAgICAgICAgICAgNSAqIHBTcmMgW3BvcyAtIDEgKiBpU3JjU3RlcF0gKyAKLSAgICAgICAgICAgICAgICAyMCAqIHBTcmMgW3Bvc10gKyAKLSAgICAgICAgICAgICAgICAyMCAqIHBTcmMgW3BvcyArIDEgKiBpU3JjU3RlcF0gLSAKLSAgICAgICAgICAgICAgICA1ICogcFNyYyBbcG9zICsgMiAqIGlTcmNTdGVwXSArIAotICAgICAgICAgICAgICAgIHBTcmMgW3BvcyArIDMgKiBpU3JjU3RlcF07Ci0KLSAgICAgICAgICAgIEhhbGZDb2VmZiA9IChIYWxmQ29lZmYgKyAxNikgPj4gNTsKLSAgICAgICAgICAgIEhhbGZDb2VmZiA9IGFybUNsaXAoMCwgMjU1LCBIYWxmQ29lZmYpOwotCi0gICAgICAgICAgICBwRHN0IFt5ICogaURzdFN0ZXAgKyB4XSA9IChPTVhfVTgpIEhhbGZDb2VmZjsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2NzMwZjguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEuYworKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIGludGVycG9sYXRpb24gZm9yIGNocm9tYSBjb21wb25lbnRzCi0gKiAKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgY2hyb21hIGNvbXBvbmVudHMuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiAgW2luXSAgICBwU3JjICAgICAgICAgICAgUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sgdXNlZCB0byAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycG9sYXRlIGluIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lCi0gKiAgW2luXSAgICBpU3JjU3RlcCAgICBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLgotICogIFtpbl0gICAgaURzdFN0ZXAgICAgU3RlcCBvZiB0aGUgZGVzdGluYXRpb24oaW50ZXJwb2xhdGlvbikgYnVmZmVyLgotICogIFtpbl0gICAgaVdpZHRoICAgICAgV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqICBbaW5dICAgIGlIZWlnaHQgICAgIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jawotICogIFtpbl0gICAgZHggICAgICAgICAgICAgIEZyYWN0aW9uYWwgcGFydCBvZiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gMS84IHBpeGVsIHVuaXQgKDB+NykgCi0gKiAgW2luXSAgICBkeSAgICAgICAgICAgICAgRnJhY3Rpb25hbCBwYXJ0IG9mIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gMS84IHBpeGVsIHVuaXQgKDB+NykKLSAqICBbb3V0XSAgIHBEc3QgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlcgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KLSAqCi0gKi8KLSBPTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEoCi0gICAgICAgIE9NWF9VOCAgICAgICpwU3JjLAotICAgICAgICBPTVhfVTMyICAgICBpU3JjU3RlcCwKLSAgICAgICAgT01YX1U4ICAgICAgKnBEc3QsCi0gICAgICAgIE9NWF9VMzIgICAgIGlEc3RTdGVwLAotICAgICAgICBPTVhfVTMyICAgICBpV2lkdGgsCi0gICAgICAgIE9NWF9VMzIgICAgIGlIZWlnaHQsCi0gICAgICAgIE9NWF9VMzIgICAgIGR4LAotICAgICAgICBPTVhfVTMyICAgICBkeQotKQotewotICAgIE9NWF9VMzIgICAgIEVpZ2h0TWludXNkeCA9IDggLSBkeDsKLSAgICBPTVhfVTMyICAgICBFaWdodE1pbnVzZHkgPSA4IC0gZHk7Ci0gICAgT01YX1UzMiAgICAgQUNvZWZmLCBCQ29lZmYsIENDb2VmZiwgRENvZWZmOwotICAgIE9NWF9VMzIgICAgIHgsIHk7Ci0KLSAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoZHggPiA3LCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihkeSA+IDcsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGlTcmNTdGVwID09IDAsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGlEc3RTdGVwID09IDAsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGlXaWR0aCA9PSAwLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihpSGVpZ2h0ID09IDAsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIAotICAgIC8qIGlmIGZyYWN0aW9ubCBtdiBpcyBub3QgKDAsIDApICovCi0gICAgaWYgKGR4ICE9IDAgfHwgZHkgIT0gMCkKLSAgICB7Ci0gICAgICAgIEFDb2VmZiA9IEVpZ2h0TWludXNkeCAqIEVpZ2h0TWludXNkeTsKLSAgICAgICAgQkNvZWZmID0gZHggKiBFaWdodE1pbnVzZHk7Ci0gICAgICAgIENDb2VmZiA9IEVpZ2h0TWludXNkeCAqIGR5OwotICAgICAgICBEQ29lZmYgPSBkeCAqIGR5OwotCi0gICAgICAgIGZvciAoeSA9IDA7IHkgPCBpSGVpZ2h0OyB5KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBpV2lkdGg7IHgrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwRHN0IFt5ICogaURzdFN0ZXAgKyB4XSA9ICgKLSAgICAgICAgICAgICAgICAgICAgQUNvZWZmICogcFNyYyBbeSAqIGlTcmNTdGVwICsgeF0gKwotICAgICAgICAgICAgICAgICAgICBCQ29lZmYgKiBwU3JjIFt5ICogaVNyY1N0ZXAgKyB4ICsgMV0gKwotICAgICAgICAgICAgICAgICAgICBDQ29lZmYgKiBwU3JjIFsoeSArIDEpICogaVNyY1N0ZXAgKyB4XSArCi0gICAgICAgICAgICAgICAgICAgIERDb2VmZiAqIHBTcmMgWyh5ICsgMSkgKiBpU3JjU3RlcCArIHggKyAxXSArCi0gICAgICAgICAgICAgICAgICAgIDMyKSA+PiA2OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGZvciAoeSA9IDA7IHkgPCBpSGVpZ2h0OyB5KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBpV2lkdGg7IHgrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwRHN0IFt5ICogaURzdFN0ZXAgKyB4XSA9IHBTcmMgW3kgKiBpU3JjU3RlcCArIHhdOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0x1bWEuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfTHVtYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzhkNjJlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfTHVtYS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0ludGVycG9sYXRlX0x1bWEuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIGludGVycG9sYXRpb24gZm9yIGx1bWEgY29tcG9uZW50cwotICogCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1NNFAxMF9Db3B5Ci0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGNvcHkgYSBibG9jayBvZiBkYXRhIGZyb20gc291cmNlIHRvIGRlc3RpbmF0aW9uCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiAgW2luXSAgICBwU3JjICAgICAgICAgICAgUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sKLSAqICBbaW5dICAgIGlTcmNTdGVwICAgIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuCi0gKiAgW2luXSAgICBpRHN0U3RlcCAgICBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiAgYnVmZmVyLgotICogIFtpbl0gICAgaVdpZHRoICAgICAgV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqICBbaW5dICAgIGlIZWlnaHQgICAgIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jawotICogIFtvdXRdICAgcERzdCAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgotICoKLSAqLwotc3RhdGljIE9NWFJlc3VsdCBhcm1NNFAxMF9Db3B5KCAgCi0gICAgY29uc3QgT01YX1U4KiAgICAgcFNyYywKLSAgICBPTVhfVTMyICAgICBpU3JjU3RlcCwKLSAgICBPTVhfVTgqICAgICBwRHN0LAotICAgIE9NWF9VMzIgICAgIGlEc3RTdGVwLCAKLSAgICBPTVhfVTMyICAgICBpV2lkdGgsCi0gICAgT01YX1UzMiAgICAgaUhlaWdodAotKQotewotICAgIE9NWF9VMzIgICAgIHgsIHk7Ci0KLSAgICBmb3IgKHkgPSAwOyB5IDwgaUhlaWdodDsgeSsrKQotICAgIHsKLSAgICAgICAgZm9yICh4ID0gMDsgeCA8IGlXaWR0aDsgeCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBwRHN0IFt5ICogaURzdFN0ZXAgKyB4XSA9IHBTcmMgW3kgKiBpU3JjU3RlcCArIHhdOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfTHVtYQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciBsdW1hIGNvbXBvbmVudHMuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiAgW2luXSAgICBwU3JjICAgICAgICAgICAgUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sgdXNlZCB0byAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycG9sYXRlIGluIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lCi0gKiAgW2luXSAgICBpU3JjU3RlcCAgICBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLgotICogIFtpbl0gICAgaURzdFN0ZXAgICAgU3RlcCBvZiB0aGUgZGVzdGluYXRpb24oaW50ZXJwb2xhdGlvbikgYnVmZmVyLgotICogIFtpbl0gICAgaVdpZHRoICAgICAgV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqICBbaW5dICAgIGlIZWlnaHQgICAgIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jawotICogIFtpbl0gICAgZHggICAgICAgICAgICAgIEZyYWN0aW9uYWwgcGFydCBvZiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gMS80IHBpeGVsIHVuaXQgKDB+MykgCi0gKiAgW2luXSAgICBkeSAgICAgICAgICAgICAgRnJhY3Rpb25hbCBwYXJ0IG9mIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gMS80IHBpeGVsIHVuaXQgKDB+MykgCi0gKiAgW291dF0gICBwRHN0ICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCi0gKgotICovCi0KLSBPTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9MdW1hKAotICAgICBjb25zdCBPTVhfVTggICAgICpwU3JjLAotICAgICBPTVhfVTMyICAgIGlTcmNTdGVwLAotICAgICBPTVhfVTggICAgICpwRHN0LAotICAgICBPTVhfVTMyICAgIGlEc3RTdGVwLAotICAgICBPTVhfVTMyICAgIGlXaWR0aCwKLSAgICAgT01YX1UzMiAgICBpSGVpZ2h0LAotICAgICBPTVhfVTMyICAgIGR4LAotICAgICBPTVhfVTMyICAgIGR5Ci0pCi17Ci0gICAgT01YX1U4ICAgICAgcEJ1ZjEgWzE2KjE2XTsKLSAgICBjb25zdCBPTVhfVTggICAgICAqcFNyY0hhbGZIb3IgPSBwU3JjOwotICAgIGNvbnN0IE9NWF9VOCAgICAgICpwU3JjSGFsZlZlciA9IHBTcmM7Ci0KLSAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoZHggPiAzLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihkeSA+IDMsIE9NWF9TdHNfQmFkQXJnRXJyKQotCi0gICAgLyogV29yayBvdXQgcG9zaXRpb25zIGZvciBoYWxmIHBpeGVsIGludGVycG9sYXRpb24gKi8KLSAgICBpZiAoZHggPT0gMykKLSAgICB7Ci0gICAgICAgIHBTcmNIYWxmVmVyICs9IDE7Ci0gICAgfQotICAgIGlmIChkeSA9PSAzKQotICAgIHsKLSAgICAgICAgcFNyY0hhbGZIb3IgKz0gaVNyY1N0ZXA7Ci0gICAgfQotCi0gICAgLyogU3dpdGNoIG9uIHR5cGUgb2YgcGl4ZWwKLSAgICAgKiBQaXhlbHMgYXJlIG5hbWVkICdhJyB0byAncycgYXMgaW4gdGhlIEguMjY0IHN0YW5kYXJkCi0gICAgICovCi0gICAgaWYgKGR4ID09IDAgJiYgZHkgPT0gMCkKLSAgICB7Ci0gICAgICAgIC8qIEcgKi8KLSAgICAgICAgYXJtTTRQMTBfQ29weShwU3JjLCBpU3JjU3RlcCwgcERzdCwgaURzdFN0ZXAsIGlXaWR0aCwgaUhlaWdodCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGR5ID09IDApCi0gICAgewotICAgICAgICAvKiBhLCBiLCBjICovCi0gICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEKLSAgICAgICAgICAgIChwU3JjSGFsZkhvciwgaVNyY1N0ZXAsIHBEc3QsIGlEc3RTdGVwLCBpV2lkdGgsIGlIZWlnaHQpOyAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgaWYgKGR4ID09IDEgfHwgZHggPT0gMykKLSAgICAgICAgewotICAgICAgICAgICAgYXJtVkNDT01NX0F2ZXJhZ2UgCi0gICAgICAgICAgICAgICAgKHBEc3QsIHBTcmNIYWxmVmVyLCBpRHN0U3RlcCwgaVNyY1N0ZXAsIHBEc3QsIGlEc3RTdGVwLCBpV2lkdGgsIGlIZWlnaHQpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGR4ID09IDApCi0gICAgewotICAgICAgICAvKiBkLCBoLCBuICovCi0gICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEKLSAgICAgICAgICAgIChwU3JjSGFsZlZlciwgaVNyY1N0ZXAsIHBEc3QsIGlEc3RTdGVwLCBpV2lkdGgsIGlIZWlnaHQpOwotCi0gICAgICAgIGlmIChkeSA9PSAxIHx8IGR5ID09IDMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFybVZDQ09NTV9BdmVyYWdlIAotICAgICAgICAgICAgICAgIChwRHN0LCBwU3JjSGFsZkhvciwgaURzdFN0ZXAsIGlTcmNTdGVwLCBwRHN0LCBpRHN0U3RlcCwgaVdpZHRoLCBpSGVpZ2h0KTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChkeCA9PSAyIHx8IGR5ID09IDIpCi0gICAgewotICAgICAgICAvKiBqICovCi0gICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmRGlhZ19MdW1hCi0gICAgICAgICAgICAocFNyYywgaVNyY1N0ZXAsIHBEc3QsIGlEc3RTdGVwLCBpV2lkdGgsIGlIZWlnaHQpOwotCi0gICAgICAgIGlmIChkeCA9PSAxIHx8IGR4ID09IDMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIGksIGsgKi8KLSAgICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEKLSAgICAgICAgICAgICAgICAocFNyY0hhbGZWZXIsIGlTcmNTdGVwLCBwQnVmMSwgaVdpZHRoLCBpV2lkdGgsIGlIZWlnaHQpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgYXJtVkNDT01NX0F2ZXJhZ2UgCi0gICAgICAgICAgICAgICAgKHBEc3QsIHBCdWYxLCBpRHN0U3RlcCwgaVdpZHRoLCBwRHN0LCBpRHN0U3RlcCwgaVdpZHRoLCBpSGVpZ2h0KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZHkgPT0gMSB8fCBkeSA9PSAzKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBmLHEgKi8KLSAgICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEKLSAgICAgICAgICAgICAgICAocFNyY0hhbGZIb3IsIGlTcmNTdGVwLCBwQnVmMSwgaVdpZHRoLCBpV2lkdGgsIGlIZWlnaHQpOwotCi0gICAgICAgICAgICBhcm1WQ0NPTU1fQXZlcmFnZSAKLSAgICAgICAgICAgICAgICAocERzdCwgcEJ1ZjEsIGlEc3RTdGVwLCBpV2lkdGgsIHBEc3QsIGlEc3RTdGVwLCBpV2lkdGgsIGlIZWlnaHQpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgLyogZHg9MSwzIGFuZCBkeT0xLDMgKi8KLSAgICB7Ci0gICAgICAgIC8qIGUsIGcsIHAsIHIgKi8KLSAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYQotICAgICAgICAgICAgKHBTcmNIYWxmSG9yLCBpU3JjU3RlcCwgcEJ1ZjEsIGlXaWR0aCwgaVdpZHRoLCBpSGVpZ2h0KTsKLQotICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hCi0gICAgICAgICAgICAocFNyY0hhbGZWZXIsIGlTcmNTdGVwLCBwRHN0LCBpRHN0U3RlcCwgaVdpZHRoLCBpSGVpZ2h0KTsKLQotICAgICAgICBhcm1WQ0NPTU1fQXZlcmFnZSAKLSAgICAgICAgICAgIChwQnVmMSwgcERzdCwgaVdpZHRoLCBpRHN0U3RlcCwgcERzdCwgaURzdFN0ZXAsIGlXaWR0aCwgaUhlaWdodCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9QcmVkaWN0SW50cmFEQzR4NC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9QcmVkaWN0SW50cmFEQzR4NC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjAwZDU1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfUHJlZGljdEludHJhREM0eDQuYworKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX1ByZWRpY3RJbnRyYURDNHg0LmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBILjI2NCA0eDQgaW50cmEgcHJlZGljdGlvbiBtb2R1bGUKLSAqIAotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0KLS8qCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm0gREMgc3R5bGUgaW50cmEgcHJlZGljdGlvbiwgYXZlcmFnaW5nIHVwcGVyIGFuZCBsZWZ0IGJsb2NrCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcFNyY0xlZnQJCVBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiAxNiBsZWZ0IGNvZWZmaWNpZW50czoKLSAqCQkJCQkJCQlwW3gsIHldICh4ID0gLTEsIHkgPSAwLi4zKQotICogW2luXQlwU3JjQWJvdmUJCVBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiAxNiBhYm92ZSBjb2VmZmljaWVudHM6Ci0gKgkJCQkJCQkJcFt4LHldICh4ID0gMC4uMywgeSA9IC0xKQotICogW2luXQlsZWZ0U3RlcAkJU3RlcCBvZiBsZWZ0IGNvZWZmaWNpZW50IGJ1ZmZlcgotICogW2luXQlkc3RTdGVwCQkJU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyCi0gKiBbaW5dCWF2YWlsYWJpbGl0eQlOZWlnaGJvcmluZyAxNngxNiBNQiBhdmFpbGFiaWxpdHkgZmxhZwotICogW291dF0JcERzdAkJCVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE5vbmUKLSAqLwotCi12b2lkIGFybVZDTTRQMTBfUHJlZGljdEludHJhREM0eDQoCi0gICAgIGNvbnN0IE9NWF9VOCogcFNyY0xlZnQsCi0gICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlLAotICAgICBPTVhfVTgqIHBEc3QsCi0gICAgIE9NWF9JTlQgbGVmdFN0ZXAsCi0gICAgIE9NWF9JTlQgZHN0U3RlcCwKLSAgICAgT01YX1MzMiBhdmFpbGFiaWxpdHkgICAgICAgIAotKQotewotICAgIGludCB4LCB5LCBTdW09MCwgQ291bnQgPSAwOwotCi0gICAgaWYgKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19MRUZUKQotICAgIHsKLSAgICAgICAgZm9yICh5PTA7IHk8NDsgeSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdW0gKz0gcFNyY0xlZnRbeSpsZWZ0U3RlcF07Ci0gICAgICAgIH0KLSAgICAgICAgQ291bnQrKzsKLSAgICB9Ci0gICAgaWYgKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUikKLSAgICB7Ci0gICAgICAgIGZvciAoeD0wOyB4PDQ7IHgrKykKLSAgICAgICAgewotICAgICAgICAgICAgU3VtICs9IHBTcmNBYm92ZVt4XTsKLSAgICAgICAgfQotICAgICAgICBDb3VudCsrOwotICAgIH0KLSAgICBpZiAoQ291bnQ9PTApCi0gICAgewotICAgICAgICBTdW0gPSAxMjg7Ci0gICAgfQotICAgIGVsc2UgaWYgKENvdW50PT0xKQotICAgIHsKLSAgICAgICAgU3VtID0gKFN1bSArIDIpID4+IDI7Ci0gICAgfQotICAgIGVsc2UgLyogQ291bnQgPSAyICovCi0gICAgewotICAgICAgICBTdW0gPSAoU3VtICsgNCkgPj4gMzsKLSAgICB9Ci0gICAgZm9yICh5PTA7IHk8NDsgeSsrKQotICAgIHsKLSAgICAgICAgZm9yICh4PTA7IHg8NDsgeCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBwRHN0W3kqZHN0U3RlcCt4XSA9IChPTVhfVTgpU3VtOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9RdWFudFRhYmxlcy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9RdWFudFRhYmxlcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDFkNGY2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfUXVhbnRUYWJsZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfUXVhbnRUYWJsZXMuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIEguMjY0IGludmVyc2UgcXVhbnRpemUgdGFibGVzCi0gKiAKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybVZDLmgiCi0KLWNvbnN0IE9NWF9VMzIgYXJtVkNNNFAxMF9NRk1hdHJpeFs2XVszXSA9Ci17Ci0gICAgezEzMTA3LCA1MjQzLCA4MDY2fSwKLSAgICB7MTE5MTYsIDQ2NjAsIDc0OTB9LAotICAgIHsxMDA4MiwgNDE5NCwgNjU1NH0sCi0gICAgeyA5MzYyLCAzNjQ3LCA1ODI1fSwKLSAgICB7IDgxOTIsIDMzNTUsIDUyNDN9LAotICAgIHsgNzI4MiwgMjg5MywgNDU1OX0KLX07IApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9TQURRdWFyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1NBRFF1YXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVmOGFmNS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1NBRFF1YXIuYworKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX1NBRFF1YXIuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIFNBRCBvZiBwU3JjIHdpdGggYXZlcmFnZSBvZiB0d28gUmVmIGJsb2NrcwotICogCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9TQURRdWFyCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBiZXR3ZWVuIG9uZSBibG9jayAocFNyYykgYW5kIHRoZSAKLSAqIGF2ZXJhZ2Ugb2YgdGhlIG90aGVyIHR3byAocFNyY1JlZjAgYW5kIHBTcmNSZWYxKQotICoKLSAqIFJlbWFya3M6Ci0gKgotICogW2luXQkJcFNyYwkJCQlQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jawotICogW2luXQkJcFNyY1JlZjAJCVBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDAKLSAqIFtpbl0JCXBTcmNSZWYxCQlQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAxCi0gKiBbaW5dCQlpU3JjU3RlcCAJCVN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcgotICogW2luXQkJaVJlZlN0ZXAwCQlTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAotICogW2luXQkJaVJlZlN0ZXAxIAlTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAotICogW2luXQkJaUhlaWdodAkJCUhlaWdodCBvZiB0aGUgYmxvY2sKLSAqIFtpbl0JCWlXaWR0aAkJCVdpZHRoIG9mIHRoZSBibG9jawotICogW291dF0JcERzdFNBRAkJCVBvaW50ZXIgb2YgcmVzdWx0IFNBRAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KLSAqCi0gKi8KLU9NWFJlc3VsdCBhcm1WQ000UDEwX1NBRFF1YXIoCi0JY29uc3QgT01YX1U4KiAJcFNyYywKLSAgICBjb25zdCBPTVhfVTgqIAlwU3JjUmVmMCwKLQljb25zdCBPTVhfVTgqIAlwU3JjUmVmMSwJCi0gICAgT01YX1UzMiAJaVNyY1N0ZXAsCi0gICAgT01YX1UzMgkJaVJlZlN0ZXAwLAotICAgIE9NWF9VMzIJCWlSZWZTdGVwMSwKLSAgICBPTVhfVTMyKglwRHN0U0FELAotICAgIE9NWF9VMzIgICAgIGlIZWlnaHQsCi0gICAgT01YX1UzMiAgICAgaVdpZHRoCi0pCi17Ci0gICAgT01YX0lOVCAgICAgeCwgeTsKLSAgICBPTVhfUzMyICAgICBTQUQgPSAwOwotCi0gICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmMCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmMSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0U0FEID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotCi0gICAgZm9yICh5ID0gMDsgeSA8IGlIZWlnaHQ7IHkrKykKLSAgICB7Ci0gICAgICAgIGZvciAoeCA9IDA7IHggPCBpV2lkdGg7IHgrKykKLSAgICAgICAgewotICAgICAgICAgICAgU0FEICs9IGFybUFicyhwU3JjIFt5ICogaVNyY1N0ZXAgKyB4XSAtICgoCi0gICAgICAgICAgICAgICAgICAgIHBTcmNSZWYwIFt5ICogaVJlZlN0ZXAwICsgeF0gKyAKLSAgICAgICAgICAgICAgICAgICAgcFNyY1JlZjEgW3kgKiBpUmVmU3RlcDEgKyB4XSArIDEpID4+IDEpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAgICAgCi0gICAgKnBEc3RTQUQgPSBTQUQ7Ci0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM1MzczMS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0LmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBILjI2NCB0cmFuc2Zvcm0gbW9kdWxlCi0gKiAKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotIAotLyoKLSAqIERlc2NyaXB0aW9uOgotICogVHJhbnNmb3JtIFJlc2lkdWFsIDR4NCBDb2VmZmljaWVudHMKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgcFNyYwkJU291cmNlIDR4NCBibG9jawotICogW291dF0gcERzdAkJRGVzdGluYXRpb24gNHg0IGJsb2NrCi0gKgotICovCi0KLXZvaWQgYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NChPTVhfUzE2KiBwRHN0LCBPTVhfUzE2ICpwU3JjKQotewotICAgIGludCBpOwotCi0gICAgLyogVHJhbnNmb3JtIHJvd3MgKi8KLSAgICBmb3IgKGk9MDsgaTwxNjsgaSs9NCkKLSAgICB7Ci0gICAgICAgIGludCBkMCA9IHBTcmNbaSswXTsKLSAgICAgICAgaW50IGQxID0gcFNyY1tpKzFdOwotICAgICAgICBpbnQgZDIgPSBwU3JjW2krMl07Ci0gICAgICAgIGludCBkMyA9IHBTcmNbaSszXTsKLSAgICAgICAgaW50IGUwID0gZDAgKyBkMjsKLSAgICAgICAgaW50IGUxID0gZDAgLSBkMjsKLSAgICAgICAgaW50IGUyID0gKGQxPj4xKSAtIGQzOwotICAgICAgICBpbnQgZTMgPSBkMSArIChkMz4+MSk7Ci0gICAgICAgIGludCBmMCA9IGUwICsgZTM7Ci0gICAgICAgIGludCBmMSA9IGUxICsgZTI7Ci0gICAgICAgIGludCBmMiA9IGUxIC0gZTI7Ci0gICAgICAgIGludCBmMyA9IGUwIC0gZTM7Ci0gICAgICAgIHBEc3RbaSswXSA9IChPTVhfUzE2KWYwOwotICAgICAgICBwRHN0W2krMV0gPSAoT01YX1MxNilmMTsKLSAgICAgICAgcERzdFtpKzJdID0gKE9NWF9TMTYpZjI7Ci0gICAgICAgIHBEc3RbaSszXSA9IChPTVhfUzE2KWYzOwotICAgIH0KLQotICAgIC8qIFRyYW5zZm9ybSBjb2x1bW5zICovCi0gICAgZm9yIChpPTA7IGk8NDsgaSsrKQotICAgIHsKLSAgICAgICAgaW50IGYwID0gcERzdFtpKzBdOwotICAgICAgICBpbnQgZjEgPSBwRHN0W2krNF07Ci0gICAgICAgIGludCBmMiA9IHBEc3RbaSs4XTsKLSAgICAgICAgaW50IGYzID0gcERzdFtpKzEyXTsKLSAgICAgICAgaW50IGcwID0gZjAgKyBmMjsKLSAgICAgICAgaW50IGcxID0gZjAgLSBmMjsKLSAgICAgICAgaW50IGcyID0gKGYxPj4xKSAtIGYzOwotICAgICAgICBpbnQgZzMgPSBmMSArIChmMz4+MSk7Ci0gICAgICAgIGludCBoMCA9IGcwICsgZzM7Ci0gICAgICAgIGludCBoMSA9IGcxICsgZzI7Ci0gICAgICAgIGludCBoMiA9IGcxIC0gZzI7Ci0gICAgICAgIGludCBoMyA9IGcwIC0gZzM7Ci0gICAgICAgIHBEc3RbaSswXSA9IChPTVhfUzE2KSgoaDArMzIpPj42KTsKLSAgICAgICAgcERzdFtpKzRdID0gKE9NWF9TMTYpKChoMSszMik+PjYpOwotICAgICAgICBwRHN0W2krOF0gPSAoT01YX1MxNikoKGgyKzMyKT4+Nik7Ci0gICAgICAgIHBEc3RbaSsxMl0gPSAoT01YX1MxNikoKGgzKzMyKT4+Nik7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrMngyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrMngyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMDA0ZTUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazJ4Mi5jCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfVW5wYWNrQmxvY2syeDIuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIEguMjY0IGludmVyc2UgcXVhbnRpemUgYW5kIHRyYW5zZm9ybSBoZWxwZXIgbW9kdWxlCi0gKiAKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybVZDLmgiCi0KLS8qCi0gKiBEZXNjcmlwdGlvbgotICogVW5wYWNrIGEgMngyIGJsb2NrIG9mIGNvZWZmaWNpZW50LXJlc2lkdWFsIHBhaXIgdmFsdWVzCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcHBTcmMJRG91YmxlIHBvaW50ZXIgdG8gcmVzaWR1YWwgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpcgotICoJCQkJCQlidWZmZXIgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nCi0gKiBbb3V0XQlwcFNyYwkqcHBTcmMgaXMgdXBkYXRlZCB0byB0aGUgc3RhcnQgb2YgbmV4dCBub24gZW1wdHkgYmxvY2sKLSAqIFtvdXRdCXBEc3QJUG9pbnRlciB0byB1bnBhY2tlZCA0eDQgYmxvY2sKLSAqLwotCi12b2lkIGFybVZDTTRQMTBfVW5wYWNrQmxvY2syeDIoCi0gICAgIGNvbnN0IE9NWF9VOCAqKnBwU3JjLAotICAgICBPTVhfUzE2KiBwRHN0Ci0pCi17Ci0gICAgY29uc3QgT01YX1U4ICpwU3JjID0gKnBwU3JjOwotICAgIGludCBpOwotICAgIGludCBGbGFnLCBWYWx1ZTsKLQotICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKLSAgICB7Ci0gICAgICAgIHBEc3RbaV0gPSAwOwotICAgIH0KLQotICAgIGRvCi0gICAgewotICAgICAgICBGbGFnICA9ICpwU3JjKys7Ci0gICAgICAgIGlmIChGbGFnICYgMHgxMCkKLSAgICAgICAgewotICAgICAgICAgICAgLyogMTYgYml0ICovCi0gICAgICAgICAgICBWYWx1ZSA9ICpwU3JjKys7Ci0gICAgICAgICAgICBWYWx1ZSA9IFZhbHVlIHwgKCgqcFNyYysrKTw8OCk7Ci0gICAgICAgICAgICBpZiAoVmFsdWUgJiAweDgwMDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVmFsdWUgLT0gMHgxMDAwMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIDggYml0ICovCi0gICAgICAgICAgICBWYWx1ZSA9ICpwU3JjKys7Ci0gICAgICAgICAgICBpZiAoVmFsdWUgJiAweDgwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFZhbHVlIC09IDB4MTAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGkgPSBGbGFnICYgMTU7Ci0gICAgICAgIHBEc3RbaV0gPSAoT01YX1MxNilWYWx1ZTsKLSAgICB9Ci0gICAgd2hpbGUgKChGbGFnICYgMHgyMCk9PTApOwotCi0gICAgKnBwU3JjID0gcFNyYzsKLX0KLQotLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQwYzkzMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0LmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBILjI2NCBpbnZlcnNlIHF1YW50aXplIGFuZCB0cmFuc2Zvcm0gaGVscGVyIG1vZHVsZQotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotCi0vKgotICogRGVzY3JpcHRpb24KLSAqIFVucGFjayBhIDR4NCBibG9jayBvZiBjb2VmZmljaWVudC1yZXNpZHVhbCBwYWlyIHZhbHVlcwotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBwU3JjCURvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIKLSAqCQkJCQkJYnVmZmVyIG91dHB1dCBieSBDQUxWQyBkZWNvZGluZwotICogW291dF0JcHBTcmMJKnBwU3JjIGlzIHVwZGF0ZWQgdG8gdGhlIHN0YXJ0IG9mIG5leHQgbm9uIGVtcHR5IGJsb2NrCi0gKiBbb3V0XQlwRHN0CVBvaW50ZXIgdG8gdW5wYWNrZWQgNHg0IGJsb2NrCi0gKi8KLQotdm9pZCBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0KAotICAgICBjb25zdCBPTVhfVTggKipwcFNyYywKLSAgICAgT01YX1MxNiogcERzdAotKQotewotICAgIGNvbnN0IE9NWF9VOCAqcFNyYyA9ICpwcFNyYzsKLSAgICBpbnQgaTsKLSAgICBpbnQgRmxhZywgVmFsdWU7Ci0KLSAgICBmb3IgKGk9MDsgaTwxNjsgaSsrKQotICAgIHsKLSAgICAgICAgcERzdFtpXSA9IDA7Ci0gICAgfQotCi0gICAgZG8KLSAgICB7Ci0gICAgICAgIEZsYWcgID0gKnBTcmMrKzsKLSAgICAgICAgaWYgKEZsYWcgJiAweDEwKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiAxNiBiaXQgKi8KLSAgICAgICAgICAgIFZhbHVlID0gKnBTcmMrKzsKLSAgICAgICAgICAgIFZhbHVlID0gVmFsdWUgfCAoKCpwU3JjKyspPDw4KTsKLSAgICAgICAgICAgIGlmIChWYWx1ZSAmIDB4ODAwMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBWYWx1ZSAtPSAweDEwMDAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyogOCBiaXQgKi8KLSAgICAgICAgICAgIFZhbHVlID0gKnBTcmMrKzsKLSAgICAgICAgICAgIGlmIChWYWx1ZSAmIDB4ODApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVmFsdWUgLT0gMHgxMDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaSA9IEZsYWcgJiAxNTsKLSAgICAgICAgcERzdFtpXSA9IChPTVhfUzE2KVZhbHVlOwotICAgIH0KLSAgICB3aGlsZSAoKEZsYWcgJiAweDIwKT09MCk7Ci0KLSAgICAqcHBTcmMgPSBwU3JjOwotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9BdmVyYWdlXzR4LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0F2ZXJhZ2VfNHguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM4NjA1ZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0F2ZXJhZ2VfNHguYworKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0F2ZXJhZ2VfNHguYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIEF2ZXJhZ2Ugb2YgdHdvIDR4NCBvciA0eDggYmxvY2tzCi0gKiAKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0F2ZXJhZ2VfNHggICAoNi4zLjUuNS4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBhdmVyYWdlIG9mIHR3byA0eDQsIDR4OCBibG9ja3MuICBUaGUgcmVzdWx0IAotICogaXMgcm91bmRlZCBhY2NvcmRpbmcgdG8gKGErYisxKS8yLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwUHJlZDAgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiAgIHBQcmVkMSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMSAKLSAqICAgaVByZWRTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDA7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgaVByZWRTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDE7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgaURzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgYmxvY2tzOyBtdXN0IGJlIGVpdGhlciA0IG9yIDguIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0UHJlZCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgICBwUHJlZDAsIHBQcmVkMSwgb3IgcERzdFByZWQgCi0gKiAgICAtICAgIHBEc3RQcmVkIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAotICogICAgLSAgICBpUHJlZFN0ZXAwIDw9IDAgb3IgaVByZWRTdGVwMCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAotICogICAgLSAgICBpUHJlZFN0ZXAxIDw9IDAgb3IgaVByZWRTdGVwMSBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAotICogICAgLSAgICBpRHN0U3RlcCA8PSAwIG9yIGlEc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCi0gKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA0IG9yIDggCi0gKgotICovCi0gT01YUmVzdWx0IG9teFZDTTRQMTBfQXZlcmFnZV80eCAoCi0JIGNvbnN0IE9NWF9VOCogCSAgICBwUHJlZDAsCi0JIGNvbnN0IE9NWF9VOCogCSAgICBwUHJlZDEsCQotCSBPTVhfVTMyCQlpUHJlZFN0ZXAwLAotCSBPTVhfVTMyCQlpUHJlZFN0ZXAxLAotCSBPTVhfVTgqCQlwRHN0UHJlZCwKLQkgT01YX1UzMgkJaURzdFN0ZXAsIAotCSBPTVhfVTMyCQlpSGVpZ2h0Ci0pCi17Ci0gICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCi0gICAgYXJtUmV0QXJnRXJySWYocFByZWQwID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBQcmVkMSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0UHJlZCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZigoaUhlaWdodCAhPSA0KSAmJiAoaUhlaWdodCAhPSA4KSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKGlQcmVkU3RlcDAgPT0gMCkgfHwgKGlQcmVkU3RlcDAgJiAzKSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKGlQcmVkU3RlcDEgPT0gMCkgfHwgKGlQcmVkU3RlcDEgJiAzKSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKGlEc3RTdGVwID09IDApIHx8IChpRHN0U3RlcCAmIDMpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocERzdFByZWQpLCBPTVhfU3RzX0JhZEFyZ0VycikKLQotICAgIHJldHVybiBhcm1WQ0NPTU1fQXZlcmFnZSAKLSAgICAgICAgKHBQcmVkMCwgcFByZWQxLCBpUHJlZFN0ZXAwLCBpUHJlZFN0ZXAxLCBwRHN0UHJlZCwgaURzdFN0ZXAsIDQsIGlIZWlnaHQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjZmRiNjQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYuYworKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udGFpbnMgbW9kdWxlcyBmb3IgaGFsZiBwZWwgQmxvY2sgbWF0Y2hpbmcsIAotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotICAgIAotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmICAgKDYuMy41LjIuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGEgaGFsZi1wZWwgYmxvY2sgbWF0Y2ggdXNpbmcgcmVzdWx0cyBmcm9tIGEgcHJpb3IgaW50ZWdlciBzZWFyY2guIAotICogIFJldHVybnMgdGhlIGJlc3QgTVYgYW5kIGFzc29jaWF0ZWQgY29zdC4gIFRoaXMgZnVuY3Rpb24gZXN0aW1hdGVzIHRoZSAKLSAqIGhhbGYtcGl4ZWwgbW90aW9uIHZlY3RvciBieSBpbnRlcnBvbGF0aW5nIHRoZSBpbnRlZ2VyIHJlc29sdXRpb24gbW90aW9uIAotICogdmVjdG9yIHJlZmVyZW5jZWQgYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0QmVzdE1WLCBpLmUuLCB0aGUgaW5pdGlhbCAKLSAqIGludGVnZXIgTVYgaXMgZ2VuZXJhdGVkIGV4dGVybmFsbHkuICBUaGUgZnVuY3Rpb24gCi0gKiBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSW50ZWdlciBtYXkgYmUgdXNlZCBmb3IgaW50ZWdlciBtb3Rpb24gZXN0aW1hdGlvbi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY09yZ1kgLSBQb2ludGVyIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmUuIElmIAotICogICAgICAgICAgICBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIElmIGlCbG9ja1dpZHRoPT04LCAgCi0gKiAgICAgICAgICAgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIElmIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgCi0gKiAgICAgICAgICAgIHJlcXVpcmVkLiAKLSAqICAgcFNyY1JlZlkgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGNvLWxvY2F0ZWQgYmxvY2sgaW4gdGhlIAotICogICAgICAgICAgICByZWZlcmVuY2UgcGljdHVyZSAgSWYgaUJsb2NrV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IAotICogICAgICAgICAgICByZXF1aXJlZC4gIElmIGlCbG9ja1dpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIElmIAotICogICAgICAgICAgICBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgblNyY09yZ1N0ZXAgLSBTdHJpZGUgb2YgdGhlIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKLSAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgaUJsb2NrV2lkdGguIAotICogICBuU3JjUmVmU3RlcCAtIFN0cmlkZSBvZiB0aGUgcmVmZXJlbmNlIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKLSAqICAgICAgICAgICAgcGl4ZWxzIAotICogICBpQmxvY2tXaWR0aCAtIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRlcm1zIG9mIGZ1bGwgcGl4ZWxzOyBtdXN0IAotICogICAgICAgICAgICBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAotICogICBpQmxvY2tIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGVybXMgb2YgZnVsbCBwaXhlbHM7IG11c3QgCi0gKiAgICAgICAgICAgIGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCi0gKiAgIG5MYW1kYSAtIExhbWRhIGZhY3RvciwgdXNlZCB0byBjb21wdXRlIG1vdGlvbiBjb3N0IAotICogICBwTVZQcmVkIC0gUHJlZGljdGVkIE1WLCByZXByZXNlbnRlZCBpbiB0ZXJtcyBvZiAxLzQtcGVsIHVuaXRzOyB1c2VkIHRvIAotICogICAgICAgICAgICBjb21wdXRlIG1vdGlvbiBjb3N0IAotICogICBwU3JjRHN0QmVzdE1WIC0gVGhlIGJlc3QgTVYgcmVzdWx0aW5nIGZyb20gYSBwcmlvciBpbnRlZ2VyIHNlYXJjaCwgCi0gKiAgICAgICAgICAgIHJlcHJlc2VudGVkIGluIHRlcm1zIG9mIDEvNC1wZWwgdW5pdHMgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3RCZXN0TVYgLSBCZXN0IE1WIHJlc3VsdGluZyBmcm9tIHRoZSBoYWxmLXBlbCBzZWFyY2gsIGV4cHJlc3NlZCBpbiAKLSAqICAgICAgICAgICAgdGVybXMgb2YgMS80LXBlbCB1bml0cyAKLSAqICAgcEJlc3RDb3N0IC0gTW90aW9uIGNvc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBiZXN0IE1WOyBjb21wdXRlZCBhcyAKLSAqICAgICAgICAgICAgU0FEK0xhbWRhKkJpdHNVc2VkQnlNViAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBhbnkgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjT3JnWSwgcFNyY1JlZlksIAotICogICAgICAgICAgICAgIHBTcmNEc3RCZXN0TVYsIHBNVlByZWQsIHBCZXN0Q29zdCAKLSAqICAgIC0gICAgaUJsb2NrV2lkdGggb3IgaUJsb2NrSGVpZ2h0IGFyZSBlcXVhbCB0byB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNi4gCi0gKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKLSAqCi0gKi8KLSAKLU9NWFJlc3VsdCBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZigKLSAgICBjb25zdCBPTVhfVTgqIHBTcmNPcmdZLCAKLSAgICBPTVhfUzMyIG5TcmNPcmdTdGVwLCAKLSAgICBjb25zdCBPTVhfVTgqIHBTcmNSZWZZLCAKLSAgICBPTVhfUzMyIG5TcmNSZWZTdGVwLCAKLSAgICBPTVhfVTggaUJsb2NrV2lkdGgsIAotICAgIE9NWF9VOCBpQmxvY2tIZWlnaHQsIAotICAgIE9NWF9VMzIgbkxhbWRhLCAKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciogcE1WUHJlZCwgCi0gICAgT01YVkNNb3Rpb25WZWN0b3IqIHBTcmNEc3RCZXN0TVYsIAotICAgIE9NWF9TMzIqIHBCZXN0Q29zdAotKQotewotICAgIC8qIERlZmluaXRpb25zIGFuZCBJbml0aWFsaXphdGlvbnMqLwotICAgIE9NWF9JTlQgICAgIGNhbmRTQUQ7Ci0gICAgT01YX0lOVCAgICAgZnJvbVgsIHRvWCwgZnJvbVksIHRvWTsKLSAgICAvKiBPZmZzZXQgdG8gdGhlIHJlZmVyZW5jZSBhdCB0aGUgYmVnaW5pbmcgb2YgdGhlIGJvdW5kaW5nIGJveCAqLwotICAgIGNvbnN0IE9NWF9VOCAgICAgICpwVGVtcFNyY1JlZlksICpwVGVtcFNyY09yZ1k7Ci0gICAgT01YX1MxNiAgICAgeCwgeTsKLSAgICBPTVhWQ01vdGlvblZlY3RvciBkaWZmTVYsIGNhbmRNViwgaW50ZWdlck1WOwotICAgIE9NWF9VOCAgICAgIGludGVycG9sWVsyNTZdOwotCi0gICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCi0gICAgYXJtUmV0QXJnRXJySWYoKGlCbG9ja1dpZHRoID09ICA0KSAmJiAoIWFybUlzNEJ5dGVBbGlnbmVkKHBTcmNPcmdZKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoaUJsb2NrV2lkdGggPT0gIDgpICYmICghYXJtSXM4Qnl0ZUFsaWduZWQocFNyY09yZ1kpKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChpQmxvY2tXaWR0aCA9PSAxNikgJiYgKCFhcm1JczE2Qnl0ZUFsaWduZWQocFNyY09yZ1kpKSwgT01YX1N0c19CYWRBcmdFcnIpOwotCWFybVJldEFyZ0VycklmKChpQmxvY2tXaWR0aCA9PSAgNCkgJiYgKCFhcm1JczRCeXRlQWxpZ25lZChwU3JjUmVmWSkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKGlCbG9ja1dpZHRoID09ICA4KSAmJiAoIWFybUlzOEJ5dGVBbGlnbmVkKHBTcmNSZWZZKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoaUJsb2NrV2lkdGggPT0gMTYpICYmICghYXJtSXMxNkJ5dGVBbGlnbmVkKHBTcmNSZWZZKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoblNyY09yZ1N0ZXAgJSBpQmxvY2tXaWR0aCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjT3JnWSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFNyY1JlZlkgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBNVlByZWQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3RCZXN0TVYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBCZXN0Q29zdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0JYXJtUmV0QXJnRXJySWYoKChpQmxvY2tXaWR0aCE9NCkmJihpQmxvY2tXaWR0aCE9OCkmJihpQmxvY2tXaWR0aCE9MTYpKSAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQlhcm1SZXRBcmdFcnJJZigoKGlCbG9ja0hlaWdodCE9NCkmJihpQmxvY2tIZWlnaHQhPTgpJiYoaUJsb2NrSGVpZ2h0IT0xNikpICwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgICAgICAKLSAgICAgICAgICAgIAotICAgIC8qIENoZWNrIGZvciB2YWxpZCByZWdpb24gKi8gCi0gICAgZnJvbVggPSAxOwotICAgIHRvWCAgID0gMTsKLSAgICBmcm9tWSA9IDE7Ci0gICAgdG9ZICAgPSAxOwotICAgIAotICAgIC8qIEluaXRpYWxpemUgdG8gbWF4IHZhbHVlIGFzIGEgc3RhcnQgcG9pbnQgKi8KLSAgICAqcEJlc3RDb3N0ID0gMHg3ZmZmZmZmZjsKLSAgICAKLSAgICBpbnRlZ2VyTVYuZHggPSBwU3JjRHN0QmVzdE1WLT5keDsKLSAgICBpbnRlZ2VyTVYuZHkgPSBwU3JjRHN0QmVzdE1WLT5keTsKLSAgICAKLSAgICAvKiBMb29waW5nIG9uIHktIGF4aXMgKi8KLSAgICBmb3IgKHkgPSAtZnJvbVk7IHkgPD0gdG9ZOyB5KyspCi0gICAgewotICAgICAgICAvKiBMb29waW5nIG9uIHgtIGF4aXMgKi8KLSAgICAgICAgZm9yICh4ID0gLWZyb21YOyB4IDw9IHRvWDsgeCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBQb3NpdGlvbmluZyB0aGUgcG9pbnRlciAqLwotICAgICAgICAgICAgcFRlbXBTcmNSZWZZID0gcFNyY1JlZlkgKyAoblNyY1JlZlN0ZXAgKiAoaW50ZWdlck1WLmR5LzQpKSArIChpbnRlZ2VyTVYuZHgvNCk7Ci0gICAgICAgICAgICBpZiAoeCA8IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFRlbXBTcmNSZWZZID0gcFRlbXBTcmNSZWZZICsgeDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh5IDwgMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwVGVtcFNyY1JlZlkgPSBwVGVtcFNyY1JlZlkgKyAoeSAqIG5TcmNSZWZTdGVwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBUZW1wU3JjT3JnWSA9IHBTcmNPcmdZOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKiBQcmVwYXJlIGNhbmQgTVYgKi8KLSAgICAgICAgICAgIGNhbmRNVi5keCA9IGludGVnZXJNVi5keCArIHggKiAyOwotICAgICAgICAgICAgY2FuZE1WLmR5ID0gaW50ZWdlck1WLmR5ICsgeSAqIDI7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qIEludGVycG9sYXRlIGhhbGYgcGVsIGZvciB0aGUgY3VycmVudCBwb3NpdGlvbiovCi0gICAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlX0x1bWEoCi0gICAgICAgICAgICAgICAgICAgICAgICBwVGVtcFNyY1JlZlksCi0gICAgICAgICAgICAgICAgICAgICAgICBuU3JjUmVmU3RlcCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludGVycG9sWSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGlCbG9ja1dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgaUJsb2NrV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBpQmxvY2tIZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBhcm1BYnMoeCkgKiAyLAotICAgICAgICAgICAgICAgICAgICAgICAgYXJtQWJzKHkpICogMik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qIENhbGN1bGF0ZSB0aGUgU0FEICovCi0gICAgICAgICAgICBhcm1WQ0NPTU1fU0FEKAkKLSAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wU3JjT3JnWSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5TcmNPcmdTdGVwLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJwb2xZLAotICAgICAgICAgICAgICAgICAgICAgICAgaUJsb2NrV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAmY2FuZFNBRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGlCbG9ja0hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGlCbG9ja1dpZHRoKTsKLSAKLSAgICAgICAgICAgIGRpZmZNVi5keCA9IGNhbmRNVi5keCAtIHBNVlByZWQtPmR4OwotICAgICAgICAgICAgZGlmZk1WLmR5ID0gY2FuZE1WLmR5IC0gcE1WUHJlZC0+ZHk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qIFJlc3VsdCBjYWxjdWxhdGlvbnMgKi8KLSAgICAgICAgICAgIGFybVZDTTRQMTBfQ29tcGFyZU1vdGlvbkNvc3RUb01WICgKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbmRNVi5keCwgCi0gICAgICAgICAgICAgICAgICAgICAgICBjYW5kTVYuZHksIAotICAgICAgICAgICAgICAgICAgICAgICAgZGlmZk1WLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbmRTQUQsIAotICAgICAgICAgICAgICAgICAgICAgICAgcFNyY0RzdEJlc3RNViwgCi0gICAgICAgICAgICAgICAgICAgICAgICBuTGFtZGEsIAotICAgICAgICAgICAgICAgICAgICAgICAgcEJlc3RDb3N0KTsKLQotICAgICAgICB9IC8qIEVuZCBvZiB4LSBheGlzICovCi0gICAgfSAvKiBFbmQgb2YgeS1heGlzICovCi0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLQotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MDIwMGYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udGFpbnMgbW9kdWxlcyBmb3IgQmxvY2sgbWF0Y2hpbmcsIGEgZnVsbCBzZWFyY2ggYWxnb3JpdGhtCi0gKiBpcyBpbXBsZW1lbnRlZAotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyICAgKDYuMy41LjIuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGludGVnZXIgYmxvY2sgbWF0Y2guICBSZXR1cm5zIGJlc3QgTVYgYW5kIGFzc29jaWF0ZWQgY29zdC4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY09yZ1kgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGN1cnJlbnQgYmxvY2suIElmIAotICogICAgICAgICAgICBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIElmIGlCbG9ja1dpZHRoPT04LCAgCi0gKiAgICAgICAgICAgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIElmIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgCi0gKiAgICAgICAgICAgIHJlcXVpcmVkLiAKLSAqICAgcFNyY1JlZlkgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGNvLWxvY2F0ZWQgYmxvY2sgaW4gdGhlIAotICogICAgICAgICAgICByZWZlcmVuY2UgcGljdHVyZS4gSWYgaUJsb2NrV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IAotICogICAgICAgICAgICByZXF1aXJlZC4gIElmIGlCbG9ja1dpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIElmIAotICogICAgICAgICAgICBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgblNyY09yZ1N0ZXAgLSBTdHJpZGUgb2YgdGhlIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmUsIGV4cHJlc3NlZCBpbiB0ZXJtcyAKLSAqICAgICAgICAgICAgb2YgaW50ZWdlciBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiBpQmxvY2tXaWR0aC4gCi0gKiAgIG5TcmNSZWZTdGVwIC0gU3RyaWRlIG9mIHRoZSByZWZlcmVuY2UgcGljdHVyZSBwbGFuZSwgZXhwcmVzc2VkIGluIHRlcm1zIAotICogICAgICAgICAgICBvZiBpbnRlZ2VyIHBpeGVscyAKLSAqICAgcFJlZlJlY3QgLSBwb2ludGVyIHRvIHRoZSB2YWxpZCByZWZlcmVuY2UgcmVjdGFuZ2xlIGluc2lkZSB0aGUgcmVmZXJlbmNlIAotICogICAgICAgICAgICBwaWN0dXJlIHBsYW5lIAotICogICBuQ3VyclBvaW50UG9zIC0gcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUgCi0gKiAgIGlCbG9ja1dpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2ssIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiBpbnRlZ2VyIAotICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKLSAqICAgaUJsb2NrSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrLCBleHByZXNzZWQgaW4gdGVybXMgb2YgCi0gKiAgICAgICAgICAgIGludGVnZXIgcGl4ZWxzOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCi0gKiAgIG5MYW1kYSAtIExhbWRhIGZhY3RvcjsgdXNlZCB0byBjb21wdXRlIG1vdGlvbiBjb3N0IAotICogICBwTVZQcmVkIC0gUHJlZGljdGVkIE1WOyB1c2VkIHRvIGNvbXB1dGUgbW90aW9uIGNvc3QsIGV4cHJlc3NlZCBpbiB0ZXJtcyAKLSAqICAgICAgICAgICAgb2YgMS80LXBlbCB1bml0cyAKLSAqICAgcE1WQ2FuZGlkYXRlIC0gQ2FuZGlkYXRlIE1WOyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIG1vdGlvbiBzZWFyY2gsIAotICogICAgICAgICAgICBleHByZXNzZWQgaW4gdGVybXMgb2YgaW50ZWdlciBwaXhlbHMgCi0gKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSBNRSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdEJlc3RNViAtIEJlc3QgTVYgcmVzdWx0aW5nIGZyb20gaW50ZWdlciBzZWFyY2gsIGV4cHJlc3NlZCBpbiB0ZXJtcyAKLSAqICAgICAgICAgICAgb2YgMS80LXBlbCB1bml0cyAKLSAqICAgcEJlc3RDb3N0IC0gTW90aW9uIGNvc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBiZXN0IE1WOyBjb21wdXRlZCBhcyAKLSAqICAgICAgICAgICAgU0FEK0xhbWRhKkJpdHNVc2VkQnlNViAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBhbnkgb2YgdGhlIGZvbGxvd2luZyBwb2l0bmVycyBhcmUgTlVMTDoKLSAqICAgICAgICAgcFNyY09yZ1ksIHBTcmNSZWZZLCBwUmVmUmVjdCwgcE1WUHJlZCwgcE1WQ2FuZGlkYXRlLCBvciBwTUVTcGVjLiAKLSAqICAgIC0gICAgRWl0aGVyIGlCbG9ja1dpZHRoIG9yIGlCbG9ja0hlaWdodCBhcmUgdmFsdWVzIG90aGVyIHRoYW4gNCwgOCwgb3IgMTYuIAotICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCi0gKgotICovCi0gCi0gT01YUmVzdWx0IG9teFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyICgKLSAgICAgY29uc3QgT01YX1U4ICpwU3JjT3JnWSwKLSAgICAgT01YX1MzMiBuU3JjT3JnU3RlcCwKLSAgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmWSwKLSAgICAgT01YX1MzMiBuU3JjUmVmU3RlcCwKLQkgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCi0JIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCi0gICAgIE9NWF9VOCBpQmxvY2tXaWR0aCwKLSAgICAgT01YX1U4IGlCbG9ja0hlaWdodCwKLSAgICAgT01YX1UzMiBuTGFtZGEsCi0gICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwTVZQcmVkLAotICAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcE1WQ2FuZGlkYXRlLAotICAgICBPTVhWQ01vdGlvblZlY3RvciAqcEJlc3RNViwKLSAgICAgT01YX1MzMiAqcEJlc3RDb3N0LAotICAgICB2b2lkICpwTUVTcGVjCi0pCi17Ci0gICAgLyogRGVmaW5pdGlvbnMgYW5kIEluaXRpYWxpemF0aW9ucyovCi0gICAgT01YX0lOVCBjYW5kU0FEOwotICAgIE9NWF9JTlQgZnJvbVgsIHRvWCwgZnJvbVksIHRvWTsKLSAgICAvKiBPZmZzZXQgdG8gdGhlIHJlZmVyZW5jZSBhdCB0aGUgYmVnaW5pbmcgb2YgdGhlIGJvdW5kaW5nIGJveCAqLwotICAgIGNvbnN0IE9NWF9VOCAqcFRlbXBTcmNSZWZZLCAqcFRlbXBTcmNPcmdZOwotICAgIE9NWF9TMTYgeCwgeTsKLSAgICBPTVhWQ01vdGlvblZlY3RvciBkaWZmTVY7Ci0gICAgT01YX1MzMiBuU2VhcmNoUmFuZ2U7Ci0gICAgQVJNVkNNNFAxMF9NRVNwZWMgKmFybU1FU3BlYyA9IChBUk1WQ000UDEwX01FU3BlYyAqKSBwTUVTcGVjOwotCi0gICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCi0gICAgYXJtUmV0QXJnRXJySWYoKGlCbG9ja1dpZHRoID09ICA0KSAmJiAoIWFybUlzNEJ5dGVBbGlnbmVkKHBTcmNPcmdZKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoaUJsb2NrV2lkdGggPT0gIDgpICYmICghYXJtSXM4Qnl0ZUFsaWduZWQocFNyY09yZ1kpKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChpQmxvY2tXaWR0aCA9PSAxNikgJiYgKCFhcm1JczE2Qnl0ZUFsaWduZWQocFNyY09yZ1kpKSwgT01YX1N0c19CYWRBcmdFcnIpOwotCWFybVJldEFyZ0VycklmKChpQmxvY2tXaWR0aCA9PSAgNCkgJiYgKCFhcm1JczRCeXRlQWxpZ25lZChwU3JjUmVmWSkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKGlCbG9ja1dpZHRoID09ICA4KSAmJiAoIWFybUlzOEJ5dGVBbGlnbmVkKHBTcmNSZWZZKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoaUJsb2NrV2lkdGggPT0gMTYpICYmICghYXJtSXMxNkJ5dGVBbGlnbmVkKHBTcmNSZWZZKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjT3JnWSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFNyY1JlZlkgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBNVlByZWQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBNVkNhbmRpZGF0ZSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocEJlc3RNViA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocEJlc3RDb3N0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQlhcm1SZXRBcmdFcnJJZigoKGlCbG9ja1dpZHRoIT00KSYmKGlCbG9ja1dpZHRoIT04KSYmKGlCbG9ja1dpZHRoIT0xNikpICwgT01YX1N0c19CYWRBcmdFcnIpOwotCWFybVJldEFyZ0VycklmKCgoaUJsb2NrSGVpZ2h0IT00KSYmKGlCbG9ja0hlaWdodCE9OCkmJihpQmxvY2tIZWlnaHQhPTE2KSkgLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtSWdub3JlIChwTUVTcGVjKTsKLQotICAgIGlmKGlCbG9ja1dpZHRoID09IDQpCi0gICAgewotICAgICAgICBuU2VhcmNoUmFuZ2UgPSBhcm1NRVNwZWMtPk1FUGFyYW1zLnNlYXJjaFJhbmdlNHg0OwotICAgIH0KLSAgICBlbHNlIGlmKGlCbG9ja1dpZHRoID09IDgpCi0gICAgewotICAgICAgICBuU2VhcmNoUmFuZ2UgPSBhcm1NRVNwZWMtPk1FUGFyYW1zLnNlYXJjaFJhbmdlOHg4OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBuU2VhcmNoUmFuZ2UgPSBhcm1NRVNwZWMtPk1FUGFyYW1zLnNlYXJjaFJhbmdlMTZ4MTY7Ci0gICAgfQotICAgIC8qIENoZWNrIGZvciB2YWxpZCByZWdpb24gKi8gCi0gICAgZnJvbVggPSBuU2VhcmNoUmFuZ2U7Ci0gICAgdG9YICAgPSBuU2VhcmNoUmFuZ2U7Ci0gICAgZnJvbVkgPSBuU2VhcmNoUmFuZ2U7Ci0gICAgdG9ZICAgPSBuU2VhcmNoUmFuZ2U7Ci0gICAgCi0gICAgaWYgKChwQ3VyclBvaW50UG9zLT54IC0gblNlYXJjaFJhbmdlKSA8IHBSZWZSZWN0LT54KQotICAgIHsKLSAgICAgICAgZnJvbVggPSAgcEN1cnJQb2ludFBvcy0+eCAtIHBSZWZSZWN0LT54OwotICAgIH0KLQotICAgIGlmICgocEN1cnJQb2ludFBvcy0+eCArIGlCbG9ja1dpZHRoICsgblNlYXJjaFJhbmdlKSA+IChwUmVmUmVjdC0+eCArIHBSZWZSZWN0LT53aWR0aCkpCi0gICAgewotICAgICAgICB0b1ggICA9IHBSZWZSZWN0LT53aWR0aCAtIChwQ3VyclBvaW50UG9zLT54IC0gcFJlZlJlY3QtPngpIC0gaUJsb2NrV2lkdGg7Ci0gICAgfQotCi0gICAgaWYgKChwQ3VyclBvaW50UG9zLT55IC0gblNlYXJjaFJhbmdlKSA8IHBSZWZSZWN0LT55KQotICAgIHsKLSAgICAgICAgZnJvbVkgPSBwQ3VyclBvaW50UG9zLT55IC0gcFJlZlJlY3QtPnk7Ci0gICAgfQotCi0gICAgaWYgKChwQ3VyclBvaW50UG9zLT55ICsgaUJsb2NrV2lkdGggKyBuU2VhcmNoUmFuZ2UpID4gKHBSZWZSZWN0LT55ICsgcFJlZlJlY3QtPmhlaWdodCkpCi0gICAgewotICAgICAgICB0b1kgICA9IHBSZWZSZWN0LT53aWR0aCAtIChwQ3VyclBvaW50UG9zLT55IC0gcFJlZlJlY3QtPnkpIC0gaUJsb2NrV2lkdGg7Ci0gICAgfQotICAgIAotICAgIHBCZXN0TVYtPmR4ID0gLWZyb21YICogNDsKLSAgICBwQmVzdE1WLT5keSA9IC1mcm9tWSAqIDQ7Ci0gICAgLyogSW5pdGlhbGl6ZSB0byBtYXggdmFsdWUgYXMgYSBzdGFydCBwb2ludCAqLwotICAgICpwQmVzdENvc3QgPSAweDdmZmZmZmZmOwotICAgIAotICAgIC8qIExvb3Bpbmcgb24geS0gYXhpcyAqLwotICAgIGZvciAoeSA9IC1mcm9tWTsgeSA8PSB0b1k7IHkrKykKLSAgICB7Ci0gICAgICAgIC8qIExvb3Bpbmcgb24geC0gYXhpcyAqLwotICAgICAgICBmb3IgKHggPSAtZnJvbVg7IHggPD0gdG9YOyB4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFBvc2l0aW9uaW5nIHRoZSBwb2ludGVyICovCi0gICAgICAgICAgICBwVGVtcFNyY1JlZlkgPSBwU3JjUmVmWSArIChuU3JjUmVmU3RlcCAqIHkpICsgeDsKLSAgICAgICAgICAgIHBUZW1wU3JjT3JnWSA9IHBTcmNPcmdZOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKiBDYWxjdWxhdGUgdGhlIFNBRCAqLwotICAgICAgICAgICAgYXJtVkNDT01NX1NBRCgJCi0gICAgCSAgICAgICAgcFRlbXBTcmNPcmdZLAotICAgIAkgICAgICAgIG5TcmNPcmdTdGVwLAotICAgIAkgICAgICAgIHBUZW1wU3JjUmVmWSwKLSAgICAJICAgICAgICBuU3JjUmVmU3RlcCwKLSAgICAJICAgICAgICAmY2FuZFNBRCwKLSAgICAJICAgICAgICBpQmxvY2tIZWlnaHQsCi0gICAgCSAgICAgICAgaUJsb2NrV2lkdGgpOwotICAgIAkgICAgCi0gICAgICAgICAgICBkaWZmTVYuZHggPSAoeCAqIDQpIC0gcE1WUHJlZC0+ZHg7Ci0gICAgICAgICAgICBkaWZmTVYuZHkgPSAoeSAqIDQpIC0gcE1WUHJlZC0+ZHk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qIFJlc3VsdCBjYWxjdWxhdGlvbnMgKi8KLSAgICAgICAgICAgIGFybVZDTTRQMTBfQ29tcGFyZU1vdGlvbkNvc3RUb01WICgoeCAqIDQpLCAoeSAqIDQpLCBkaWZmTVYsIGNhbmRTQUQsIHBCZXN0TVYsIG5MYW1kYSwgcEJlc3RDb3N0KTsKLQotICAgICAgICB9IC8qIEVuZCBvZiB4LSBheGlzICovCi0gICAgfSAvKiBFbmQgb2YgeS1heGlzICovCi0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLQotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9CbG9ja01hdGNoX1F1YXJ0ZXIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfQmxvY2tNYXRjaF9RdWFydGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NTBkMmMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9CbG9ja01hdGNoX1F1YXJ0ZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9CbG9ja01hdGNoX1F1YXJ0ZXIuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udGFpbnMgbW9kdWxlcyBmb3IgcXVhdGVyIHBlbCBCbG9jayBtYXRjaGluZywgCi0gKiAKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybVZDLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotIAotICAgIAotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9RdWFydGVyICAgKDYuMy41LjIuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGEgcXVhcnRlci1wZWwgYmxvY2sgbWF0Y2ggdXNpbmcgcmVzdWx0cyBmcm9tIGEgcHJpb3IgaGFsZi1wZWwgCi0gKiBzZWFyY2guICBSZXR1cm5zIHRoZSBiZXN0IE1WIGFuZCBhc3NvY2lhdGVkIGNvc3QuICBUaGlzIGZ1bmN0aW9uIGVzdGltYXRlcyAKLSAqIHRoZSBxdWFydGVyLXBpeGVsIG1vdGlvbiB2ZWN0b3IgYnkgaW50ZXJwb2xhdGluZyB0aGUgaGFsZi1wZWwgcmVzb2x1dGlvbiAKLSAqIG1vdGlvbiB2ZWN0b3IgcmVmZXJlbmNlZCBieSB0aGUgaW5wdXQgcGFyYW1ldGVyIHBTcmNEc3RCZXN0TVYsIGkuZS4sIHRoZSAKLSAqIGluaXRpYWwgaGFsZi1wZWwgTVYgaXMgZ2VuZXJhdGVkIGV4dGVybmFsbHkuICBUaGUgZnVuY3Rpb24gCi0gKiBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZiBtYXkgYmUgdXNlZCBmb3IgaGFsZi1wZWwgbW90aW9uIGVzdGltYXRpb24uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNPcmdZIC0gUG9pbnRlciB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lLiBJZiAKLSAqICAgICAgICAgICAgaUJsb2NrV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiBJZiBpQmxvY2tXaWR0aD09OCwgIAotICogICAgICAgICAgICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiBJZiBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IAotICogICAgICAgICAgICByZXF1aXJlZC4gCi0gKiAgIHBTcmNSZWZZIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjby1sb2NhdGVkIGJsb2NrIGluIHRoZSAKLSAqICAgICAgICAgICAgcmVmZXJlbmNlIHBpY3R1cmUgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCAKLSAqICAgICAgICAgICAgcmVxdWlyZWQuICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuICBJZiAKLSAqICAgICAgICAgICAgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIG5TcmNPcmdTdGVwIC0gU3RyaWRlIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCi0gKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIGlCbG9ja1dpZHRoLiAKLSAqICAgblNyY1JlZlN0ZXAgLSBTdHJpZGUgb2YgdGhlIHJlZmVyZW5jZSBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCi0gKiAgICAgICAgICAgIHBpeGVscyAKLSAqICAgaUJsb2NrV2lkdGggLSBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0ZXJtcyBvZiBmdWxsIHBpeGVsczsgbXVzdCAKLSAqICAgICAgICAgICAgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKLSAqICAgaUJsb2NrSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRlcm1zIG9mIGZ1bGwgcGl4ZWxzOyBtdXN0IAotICogICAgICAgICAgICBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAotICogICBuTGFtZGEgLSBMYW1kYSBmYWN0b3IsIHVzZWQgdG8gY29tcHV0ZSBtb3Rpb24gY29zdCAKLSAqICAgcE1WUHJlZCAtIFByZWRpY3RlZCBNViwgcmVwcmVzZW50ZWQgaW4gdGVybXMgb2YgMS80LXBlbCB1bml0czsgdXNlZCB0byAKLSAqICAgICAgICAgICAgY29tcHV0ZSBtb3Rpb24gY29zdCAKLSAqICAgcFNyY0RzdEJlc3RNViAtIFRoZSBiZXN0IE1WIHJlc3VsdGluZyBmcm9tIGEgcHJpb3IgaGFsZi1wZWwgc2VhcmNoLCAKLSAqICAgICAgICAgICAgcmVwcmVzZW50ZWQgaW4gdGVybXMgb2YgMS80IHBlbCB1bml0cyAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdEJlc3RNViAtIEJlc3QgTVYgcmVzdWx0aW5nIGZyb20gdGhlIHF1YXJ0ZXItcGVsIHNlYXJjaCwgZXhwcmVzc2VkIAotICogICAgICAgICAgICBpbiB0ZXJtcyBvZiAxLzQtcGVsIHVuaXRzIAotICogICBwQmVzdENvc3QgLSBNb3Rpb24gY29zdCBhc3NvY2lhdGVkIHdpdGggdGhlIGJlc3QgTVY7IGNvbXB1dGVkIGFzIAotICogICAgICAgICAgICBTQUQrTGFtZGEqQml0c1VzZWRCeU1WIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIE9uZSBvZiBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBTcmNPcmdZLCBwU3JjUmVmWSwgcFNyY0RzdEJlc3RNViwgcE1WUHJlZCwgcEJlc3RDb3N0IAotICogICAgLSAgICBpQmxvY2tXaWR0aCBvciBpQmxvY2tIZWlnaHQgYXJlIGVxdWFsIHRvIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2LiAKLSAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAotICoKLSAqLwotIAotT01YUmVzdWx0IG9teFZDTTRQMTBfQmxvY2tNYXRjaF9RdWFydGVyKAotICAgIGNvbnN0IE9NWF9VOCogcFNyY09yZ1ksIAotICAgIE9NWF9TMzIgblNyY09yZ1N0ZXAsIAotICAgIGNvbnN0IE9NWF9VOCogcFNyY1JlZlksIAotICAgIE9NWF9TMzIgblNyY1JlZlN0ZXAsIAotICAgIE9NWF9VOCBpQmxvY2tXaWR0aCwgCi0gICAgT01YX1U4IGlCbG9ja0hlaWdodCwgCi0gICAgT01YX1UzMiBuTGFtZGEsIAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yKiBwTVZQcmVkLCAKLSAgICBPTVhWQ01vdGlvblZlY3RvciogcFNyY0RzdEJlc3RNViwgCi0gICAgT01YX1MzMiogcEJlc3RDb3N0Ci0pCi17Ci0gICAgLyogRGVmaW5pdGlvbnMgYW5kIEluaXRpYWxpemF0aW9ucyovCi0gICAgT01YX0lOVCAgICAgY2FuZFNBRDsKLSAgICBPTVhfSU5UICAgICBmcm9tWCwgdG9YLCBmcm9tWSwgdG9ZOwotICAgIC8qIE9mZnNldCB0byB0aGUgcmVmZXJlbmNlIGF0IHRoZSBiZWdpbmluZyBvZiB0aGUgYm91bmRpbmcgYm94ICovCi0gICAgY29uc3QgT01YX1U4ICAgICAgKnBUZW1wU3JjUmVmWSwgKnBUZW1wU3JjT3JnWTsKLSAgICBPTVhfUzE2ICAgICB4LCB5OwotICAgIE9NWFZDTW90aW9uVmVjdG9yIGRpZmZNViwgY2FuZE1WLCBpbml0aWFsTVY7Ci0gICAgT01YX1U4ICAgICAgaW50ZXJwb2xZWzI1Nl07Ci0gICAgT01YX1MzMiAgICAgcGVsUG9zWCwgcGVsUG9zWTsKLQotICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLwotICAgIGFybVJldEFyZ0VycklmKChpQmxvY2tXaWR0aCA9PSAgNCkgJiYgKCFhcm1JczRCeXRlQWxpZ25lZChwU3JjT3JnWSkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKGlCbG9ja1dpZHRoID09ICA4KSAmJiAoIWFybUlzOEJ5dGVBbGlnbmVkKHBTcmNPcmdZKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoaUJsb2NrV2lkdGggPT0gMTYpICYmICghYXJtSXMxNkJ5dGVBbGlnbmVkKHBTcmNPcmdZKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQlhcm1SZXRBcmdFcnJJZigoaUJsb2NrV2lkdGggPT0gIDQpICYmICghYXJtSXM0Qnl0ZUFsaWduZWQocFNyY1JlZlkpKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChpQmxvY2tXaWR0aCA9PSAgOCkgJiYgKCFhcm1JczhCeXRlQWxpZ25lZChwU3JjUmVmWSkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKGlCbG9ja1dpZHRoID09IDE2KSAmJiAoIWFybUlzMTZCeXRlQWxpZ25lZChwU3JjUmVmWSkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKG5TcmNPcmdTdGVwICUgaUJsb2NrV2lkdGgpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFNyY09yZ1kgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWZZID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwTVZQcmVkID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0QmVzdE1WID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwQmVzdENvc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotCWFybVJldEFyZ0VycklmKCgoaUJsb2NrV2lkdGghPTQpJiYoaUJsb2NrV2lkdGghPTgpJiYoaUJsb2NrV2lkdGghPTE2KSkgLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0JYXJtUmV0QXJnRXJySWYoKChpQmxvY2tIZWlnaHQhPTQpJiYoaUJsb2NrSGVpZ2h0IT04KSYmKGlCbG9ja0hlaWdodCE9MTYpKSAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICAgICAgCi0gICAgICAgICAgICAKLSAgICAvKiBDaGVjayBmb3IgdmFsaWQgcmVnaW9uICovIAotICAgIGZyb21YID0gMTsKLSAgICB0b1ggICA9IDE7Ci0gICAgZnJvbVkgPSAxOwotICAgIHRvWSAgID0gMTsKLSAgICAKLSAgICAvKiBJbml0aWFsaXplIHRvIG1heCB2YWx1ZSBhcyBhIHN0YXJ0IHBvaW50ICovCi0gICAgKnBCZXN0Q29zdCA9IDB4N2ZmZmZmZmY7Ci0gICAgCi0gICAgaW5pdGlhbE1WLmR4ID0gcFNyY0RzdEJlc3RNVi0+ZHg7Ci0gICAgaW5pdGlhbE1WLmR5ID0gcFNyY0RzdEJlc3RNVi0+ZHk7Ci0gICAgCi0gICAgLyogTG9vcGluZyBvbiB5LSBheGlzICovCi0gICAgZm9yICh5ID0gLWZyb21ZOyB5IDw9IHRvWTsgeSsrKQotICAgIHsKLSAgICAgICAgLyogTG9vcGluZyBvbiB4LSBheGlzICovCi0gICAgICAgIGZvciAoeCA9IC1mcm9tWDsgeCA8PSB0b1g7IHgrKykKLSAgICAgICAgewotICAgICAgICAgICAgLyogUG9zaXRpb25pbmcgdGhlIHBvaW50ZXIgKi8KLSAgICAgICAgICAgIHBUZW1wU3JjUmVmWSA9IHBTcmNSZWZZICsgKG5TcmNSZWZTdGVwICogKGluaXRpYWxNVi5keS80KSkgKyAoaW5pdGlhbE1WLmR4LzQpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKiBDYWxjdWxhdGluZyB0aGUgZnJhY3QgcGVsIHBvc2l0aW9uICovCi0gICAgICAgICAgICBwZWxQb3NYID0gKGluaXRpYWxNVi5keCAlIDQpICsgeDsKLSAgICAgICAgICAgIGlmIChwZWxQb3NYIDwgMCkgCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFRlbXBTcmNSZWZZID0gcFRlbXBTcmNSZWZZIC0gMTsKLSAgICAgICAgICAgICAgICBwZWxQb3NYICs9IDQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwZWxQb3NZID0gKGluaXRpYWxNVi5keSAlIDQpICsgeTsKLSAgICAgICAgICAgIGlmIChwZWxQb3NZIDwgMCkgCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFRlbXBTcmNSZWZZID0gcFRlbXBTcmNSZWZZIC0gKDEgKiBuU3JjUmVmU3RlcCk7Ci0gICAgICAgICAgICAgICAgcGVsUG9zWSArPSA0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBwVGVtcFNyY09yZ1kgPSBwU3JjT3JnWTsgCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qIFByZXBhcmUgY2FuZCBNViAqLwotICAgICAgICAgICAgY2FuZE1WLmR4ID0gaW5pdGlhbE1WLmR4ICsgeDsKLSAgICAgICAgICAgIGNhbmRNVi5keSA9IGluaXRpYWxNVi5keSArIHk7Ci0gICAgICAgICAgICAgCi0gICAgICAgICAgICAvKiBJbnRlcnBvbGF0ZSBRdWF0ZXIgcGVsIGZvciB0aGUgY3VycmVudCBwb3NpdGlvbiovCi0gICAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlX0x1bWEoCi0gICAgICAgICAgICAgICAgICAgICAgICBwVGVtcFNyY1JlZlksCi0gICAgICAgICAgICAgICAgICAgICAgICBuU3JjUmVmU3RlcCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludGVycG9sWSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGlCbG9ja1dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgaUJsb2NrV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBpQmxvY2tIZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBwZWxQb3NYLAotICAgICAgICAgICAgICAgICAgICAgICAgcGVsUG9zWSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qIENhbGN1bGF0ZSB0aGUgU0FEICovCi0gICAgICAgICAgICBhcm1WQ0NPTU1fU0FEKAkKLSAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wU3JjT3JnWSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5TcmNPcmdTdGVwLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJwb2xZLAotICAgICAgICAgICAgICAgICAgICAgICAgaUJsb2NrV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAmY2FuZFNBRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGlCbG9ja0hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGlCbG9ja1dpZHRoKTsKLSAKLSAgICAgICAgICAgIGRpZmZNVi5keCA9IGNhbmRNVi5keCAtIHBNVlByZWQtPmR4OwotICAgICAgICAgICAgZGlmZk1WLmR5ID0gY2FuZE1WLmR5IC0gcE1WUHJlZC0+ZHk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qIFJlc3VsdCBjYWxjdWxhdGlvbnMgKi8KLSAgICAgICAgICAgIGFybVZDTTRQMTBfQ29tcGFyZU1vdGlvbkNvc3RUb01WICgKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbmRNVi5keCwgCi0gICAgICAgICAgICAgICAgICAgICAgICBjYW5kTVYuZHksIAotICAgICAgICAgICAgICAgICAgICAgICAgZGlmZk1WLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbmRTQUQsIAotICAgICAgICAgICAgICAgICAgICAgICAgcFNyY0RzdEJlc3RNViwgCi0gICAgICAgICAgICAgICAgICAgICAgICBuTGFtZGEsIAotICAgICAgICAgICAgICAgICAgICAgICAgcEJlc3RDb3N0KTsKLQotICAgICAgICB9IC8qIEVuZCBvZiB4LSBheGlzICovCi0gICAgfSAvKiBFbmQgb2YgeS1heGlzICovCi0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLQotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhZWNmM2YuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kuYworKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogSC4yNjQgaW50cmEgY2hyb21hIGRlYmxvY2sKLSAqIAotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSSAgICg2LjMuMy4zLjYpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NraW5nIGZpbHRlcmluZyBvbiBhbGwgZWRnZXMgb2YgdGhlIGNocm9tYSAKLSAqIG1hY3JvYmxvY2sgKDE2eDE2KS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgOC1ieXRlIGFsaWduZWQuIAotICogICBzcmNkc3RTdGVwIC0gc3RlcCBvZiB0aGUgYXJyYXlzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIHBBbHBoYSAtIHBvaW50ZXIgdG8gYSAyeDIgYXJyYXkgb2YgYWxwaGEgdGhyZXNob2xkcywgb3JnYW5pemVkIGFzIAotICogICAgICAgICAgICBmb2xsb3dzOiB7ZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgdmVydGljYWwgZWRnZSwgCi0gKiAgICAgICAgICAgIGV4dGVybmFsIGhvcml6b250YWwgZWRnZSwgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlIH0uICBQZXIgCi0gKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gYWxwaGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1NV0uIAotICogICBwQmV0YSAtIHBvaW50ZXIgdG8gYSAyeDIgYXJyYXkgb2YgQmV0YSBUaHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgZm9sbG93czogCi0gKiAgICAgICAgICAgIHsgZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgdmVydGljYWwgZWRnZSwgZXh0ZXJuYWwgCi0gKiAgICAgICAgICAgIGhvcml6b250YWwgZWRnZSwgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlIH0uICBQZXIgW0lTTzE0NDk2LTEwXSAKLSAqICAgICAgICAgICAgYmV0YSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMThdLiAKLSAqICAgcFRocmVzaG9sZHMgLSBhcnJheSBvZiBzaXplIDh4MiBvZiBUaHJlc2hvbGRzIChUQzApICh2YWx1ZXMgZm9yIHRoZSBsZWZ0IAotICogICAgICAgICAgICBvciBhYm92ZSBlZGdlIG9mIGVhY2ggNHgyIG9yIDJ4NCBibG9jaywgYXJyYW5nZWQgaW4gdmVydGljYWwgCi0gKiAgICAgICAgICAgIGJsb2NrIG9yZGVyIGFuZCB0aGVuIGluIGhvcml6b250YWwgYmxvY2sgb3JkZXIpOyBtdXN0IGJlIGFsaWduZWQgCi0gKiAgICAgICAgICAgIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiBQZXIgW0lTTzE0NDk2LTEwXSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJhbmdlIFswLDI1XS4gCi0gKiAgIHBCUyAtIGFycmF5IG9mIHNpemUgMTZ4MiBvZiBCUyBwYXJhbWV0ZXJzIChhcnJhbmdlZCBpbiBzY2FuIGJsb2NrIG9yZGVyIAotICogICAgICAgICAgICBmb3IgdmVydGljYWwgZWRnZXMgYW5kIHRoZW4gaG9yaXpvbnRhbCBlZGdlcyk7IHZhbGlkIGluIHRoZSAKLSAqICAgICAgICAgICAgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgCi0gKiAgICAgICAgICAgIG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjNdPT0gCi0gKiAgICAgICAgICAgIDQuICBNdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzIAotICogICAgLSAgICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QsIHBBbHBoYSwgCi0gKiAgICAgICAgICAgICAgcEJldGEsIHBUaHJlc2hvbGRzLCBvciBwQlMuIHBTcmNEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgICAgICAgICAgICBlaXRoZXIgcFRocmVzaG9sZHMgb3IgcEJTIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgb25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcEFscGhhWzAuLjNdIGlzIG91dHNpZGUgdGhlIHJhbmdlIAotICogICAgICAgICAgICAgIFswLDI1NV0uIAotICogICAgLSAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBCZXRhWzAuLjNdIGlzIG91dHNpZGUgdGhlIHJhbmdlIAotICogICAgICAgICAgICAgIFswLDE4XS4gCi0gKiAgICAtICAgb25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uMTVdaXMgb3V0c2lkZSBvZiAKLSAqICAgICAgICAgICAgICB0aGUgcmFuZ2UgWzAsMjVdLiAKLSAqICAgIC0gICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgICAgICAgICBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCAgZm9yIGk+PTQsIG9yIAotICogICAgICAgICAgICAocEJTW2ldPT00ICYmIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4gCi0gKiAgICAtICAgc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSSgKLQlPTVhfVTgqIHBTcmNEc3QsIAotCU9NWF9TMzIgc3JjZHN0U3RlcCwgCi0JY29uc3QgT01YX1U4KiBwQWxwaGEsIAotCWNvbnN0IE9NWF9VOCogcEJldGEsIAotCWNvbnN0IE9NWF9VOCogcFRocmVzaG9sZHMsCi0gICAgY29uc3QgT01YX1U4ICpwQlMKLSkKLXsKLSAgICBPTVhSZXN1bHQgZXJyb3JDb2RlOwotICAgIAotICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3QgPT0gTlVMTCwgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q4Qnl0ZUFsaWduZWQocFNyY0RzdCksICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoc3JjZHN0U3RlcCAmIDcsICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBBbHBoYSA9PSBOVUxMLCAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwQmV0YSA9PSBOVUxMLCAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFRocmVzaG9sZHMgPT0gTlVMTCwgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwVGhyZXNob2xkcyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwQlMgPT0gTlVMTCwgICAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBCUyksICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotCi0gICAgZXJyb3JDb2RlID0gb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSSgKLSAgICAgICAgcFNyY0RzdCwgc3JjZHN0U3RlcCwgcEFscGhhLCBwQmV0YSwgcFRocmVzaG9sZHMsIHBCUyk7Ci0KLSAgICBhcm1SZXRBcmdFcnJJZihlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciwgZXJyb3JDb2RlKQotICAgIAotICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0koCi0gICAgICAgIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIHBBbHBoYSsyLCBwQmV0YSsyLCBwVGhyZXNob2xkcys4LCBwQlMrMTYpOwotCi0gICAgcmV0dXJuIGVycm9yQ29kZTsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNTk2MzEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBILjI2NCBsdW1hIGRlYmxvY2sKLSAqIAotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0gCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kgICAoNi4zLjMuMy41KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NrIGZpbHRlcmluZyB0aGUgaG9yaXpvbnRhbCBhbmQgCi0gKiB2ZXJ0aWNhbCBlZGdlcyBvZiBhIGx1bWEgbWFjcm9ibG9jayAoMTZ4MTYpLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIAotICogICBzcmNkc3RTdGVwIC0gaW1hZ2Ugd2lkdGg7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgIHBBbHBoYSAtIHBvaW50ZXIgdG8gYSAyeDIgdGFibGUgb2YgYWxwaGEgdGhyZXNob2xkcywgb3JnYW5pemVkIGFzIAotICogICAgICAgICAgICBmb2xsb3dzOiB7ZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgdmVydGljYWwgZWRnZSwgCi0gKiAgICAgICAgICAgIGV4dGVybmFsIGhvcml6b250YWwgZWRnZSwgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlIH0uICBQZXIgCi0gKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gYWxwaGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1NV0uIAotICogICBwQmV0YSAtIHBvaW50ZXIgdG8gYSAyeDIgdGFibGUgb2YgYmV0YSB0aHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgZm9sbG93czogCi0gKiAgICAgICAgICAgIHtleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBleHRlcm5hbCAKLSAqICAgICAgICAgICAgaG9yaXpvbnRhbCBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfS4gIFBlciBbSVNPMTQ0OTYtMTBdIAotICogICAgICAgICAgICBiZXRhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAotICogICBwVGhyZXNob2xkcyAtIHBvaW50ZXIgdG8gYSAxNngyIHRhYmxlIG9mIHRocmVzaG9sZCAoVEMwKSwgb3JnYW5pemVkIGFzIAotICogICAgICAgICAgICBmb2xsb3dzOiB7dmFsdWVzIGZvciB0aGUgbGVmdCBvciBhYm92ZSBlZGdlIG9mIGVhY2ggNHg0IGJsb2NrLCAKLSAqICAgICAgICAgICAgYXJyYW5nZWQgaW4gdmVydGljYWwgYmxvY2sgb3JkZXIgYW5kIHRoZW4gaW4gaG9yaXpvbnRhbCBibG9jayAKLSAqICAgICAgICAgICAgb3JkZXJ9OyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBQZXIgW0lTTzE0NDk2LTEwXSAKLSAqICAgICAgICAgICAgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCi0gKiAgIHBCUyAtIHBvaW50ZXIgdG8gYSAxNngyIHRhYmxlIG9mIEJTIHBhcmFtZXRlcnMgYXJyYW5nZWQgaW4gc2NhbiBibG9jayAKLSAqICAgICAgICAgICAgb3JkZXIgZm9yIHZlcnRpY2FsIGVkZ2VzIGFuZCB0aGVuIGhvcml6b250YWwgZWRnZXM7IHZhbGlkIGluIHRoZSAKLSAqICAgICAgICAgICAgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgCi0gKiAgICAgICAgICAgIG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjNdPT0gCi0gKiAgICAgICAgICAgIDQuIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMgCi0gKiAgICAtICAgICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QsIHBBbHBoYSwgCi0gKiAgICAgICAgICAgICAgcEJldGEsIHBUaHJlc2hvbGRzIG9yIHBCUy4gcFNyY0RzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqICAgICAgICAgICAgICBlaXRoZXIgcFRocmVzaG9sZHMgb3IgcEJTIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgIC0gICAgb25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcEFscGhhWzAuLjNdIGlzIG91dHNpZGUgdGhlIHJhbmdlIAotICogICAgICAgICAgICAgIFswLDI1NV0uIAotICogICAgLSAgICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwQmV0YVswLi4zXSBpcyBvdXRzaWRlIHRoZSByYW5nZSAKLSAqICAgICAgICAgICAgICBbMCwxOF0uIAotICogICAgLSAgICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwVGhyZXNob2xkc1swLi4zMV1pcyBvdXRzaWRlIG9mIAotICogICAgICAgICAgICAgIHRoZSByYW5nZSBbMCwyNV0uIAotICogICAgLSAgICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgICAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAKLSAqICAgICAgICAgICAgIChwQlNbaV09PTQgJiYgcEJTW2leM10hPTQpIGZvciAwPD1pPD0zLiAKLSAqICAgIC0gICAgc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0koCi0JT01YX1U4KiBwU3JjRHN0LCAKLQlPTVhfUzMyIHNyY2RzdFN0ZXAsIAotCWNvbnN0IE9NWF9VOCogcEFscGhhLCAKLQljb25zdCBPTVhfVTgqIHBCZXRhLCAKLQljb25zdCBPTVhfVTgqIHBUaHJlc2hvbGRzLCAKLQljb25zdCBPTVhfVTggKnBCUwotKQotewotICAgIE9NWFJlc3VsdCBlcnJvckNvZGU7Ci0gICAgCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdCA9PSBOVUxMLCAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90MTZCeXRlQWxpZ25lZChwU3JjRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHNyY2RzdFN0ZXAgJiAxNSwgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsgICAgCi0gICAgYXJtUmV0QXJnRXJySWYocEFscGhhID09IE5VTEwsICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocEJldGEgPT0gTlVMTCwgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFRocmVzaG9sZHMgPT0gTlVMTCwgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBUaHJlc2hvbGRzKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBCUyA9PSBOVUxMLCAgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocEJTKSwgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0KLSAgICBlcnJvckNvZGUgPSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSSgKLSAgICAgICAgcFNyY0RzdCwgc3JjZHN0U3RlcCwgcEFscGhhLCBwQmV0YSwgcFRocmVzaG9sZHMsIHBCUyk7Ci0KLSAgICBhcm1SZXRBcmdFcnJJZihlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciwgZXJyb3JDb2RlKQotICAgIAotICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JKAotICAgICAgICBwU3JjRHN0LCBzcmNkc3RTdGVwLCBwQWxwaGErMiwgcEJldGErMiwgcFRocmVzaG9sZHMrMTYsIHBCUysxNik7Ci0KLSAgICByZXR1cm4gZXJyb3JDb2RlOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkzMWVlYi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMuYworKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIEguMjY0IGRlY29kZSBjb2VmZmljaWVudHMgbW9kdWxlCi0gKiAKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDICAgKDYuMy40LjEuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIENBVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHJhc3RlciBzY2FuIGZvciBhIDJ4MiBibG9jayBvZiAKLSAqIENocm9tYURDTGV2ZWwuICBUaGUgZGVjb2RlZCBjb2VmZmljaWVudHMgaW4gdGhlIHBhY2tlZCBwb3NpdGlvbi1jb2VmZmljaWVudCAKLSAqIGJ1ZmZlciBhcmUgc3RvcmVkIGluIHJldmVyc2UgemlnLXphZyBvcmRlciwgaS5lLiwgdGhlIGZpcnN0IGJ1ZmZlciBlbGVtZW50IAotICogY29udGFpbnMgdGhlIGxhc3Qgbm9uLXplcm8gcG9zdGlvbi1jb2VmZmljaWVudCBwYWlyIG9mIHRoZSBibG9jay4gV2l0aGluIAotICogZWFjaCBwb3NpdGlvbi1jb2VmZmljaWVudCBwYWlyLCB0aGUgcG9zaXRpb24gZW50cnkgaW5kaWNhdGVzIHRoZSAKLSAqIHJhc3Rlci1zY2FuIHBvc2l0aW9uIG9mIHRoZSBjb2VmZmljaWVudCwgd2hpbGUgdGhlIGNvZWZmaWNpZW50IGVudHJ5IAotICogY29udGFpbnMgdGhlIGNvZWZmaWNpZW50IHZhbHVlLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIERvdWJsZSBwb2ludGVyIHRvIGN1cnJlbnQgYnl0ZSBpbiBiaXQgc3RyZWFtIGJ1ZmZlciAKLSAqICAgcE9mZnNldCAtIFBvaW50ZXIgdG8gY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCB0byBieSAKLSAqICAgICAgICAgICAgKnBwQml0U3RyZWFtOyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsN10uIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZCAKLSAqICAgcE9mZnNldCAtICpwT2Zmc2V0IGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkIAotICogICBwTnVtQ29lZmYgLSBQb2ludGVyIHRvIHRoZSBudW1iZXIgb2Ygbm9uemVybyBjb2VmZmljaWVudHMgaW4gdGhpcyBibG9jayAKLSAqICAgcHBQb3NDb2VmQnVmIC0gRG91YmxlIHBvaW50ZXIgdG8gZGVzdGluYXRpb24gcmVzaWR1YWwgCi0gKiAgICAgICAgICAgIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyLiAgQnVmZmVyIHBvc2l0aW9uIAotICogICAgICAgICAgICAoKnBwUG9zQ29lZkJ1ZikgaXMgdXBkYXRlZCB1cG9uIHJldHVybiwgdW5sZXNzIHRoZXJlIGFyZSBvbmx5IAotICogICAgICAgICAgICB6ZXJvIGNvZWZmaWNpZW50cyBpbiB0aGUgY3VycmVudGx5IGRlY29kZWQgYmxvY2suICBJbiB0aGlzIGNhc2UgCi0gKiAgICAgICAgICAgIHRoZSBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8gYnlwYXNzIHRoZSB0cmFuc2Zvcm0vZGVxdWFudGl6YXRpb24gb2YgCi0gKiAgICAgICAgICAgIHRoZSBlbXB0eSBibG9ja3MuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqCi0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIHBwQml0U3RyZWFtIG9yIHBPZmZzZXQgaXMgTlVMTC4gCi0gKiAgICAtICAgIHBwUG9zQ29lZkJ1ZiBvciBwTnVtQ29lZmYgaXMgTlVMTC4gCi0gKiAgICBPTVhfU3RzX0VyciAtIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6IAotICogICAgLSAgICBhbiBpbGxlZ2FsIGNvZGUgaXMgZW5jb3VudGVyZWQgaW4gdGhlIGJpdHN0cmVhbSAKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQyAoCi0gICAgIGNvbnN0IE9NWF9VOCoqIHBwQml0U3RyZWFtLAotICAgICBPTVhfUzMyKiBwT2Zmc2V0LAotICAgICBPTVhfVTgqIHBOdW1Db2VmZiwKLSAgICAgT01YX1U4KiogcHBQb3NDb2VmYnVmICAgICAgICAKLSApCi0KLXsKLSAgICBhcm1SZXRBcmdFcnJJZihwcEJpdFN0cmVhbT09TlVMTCAgICwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCpwcEJpdFN0cmVhbT09TlVMTCAgLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocE9mZnNldD09TlVMTCAgICAgICAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigqcE9mZnNldDwwICAgICAgICAgICwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCpwT2Zmc2V0PjcgICAgICAgICAgLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocE51bUNvZWZmPT1OVUxMICAgICAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwcFBvc0NvZWZidWY9PU5VTEwgICwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCpwcFBvc0NvZWZidWY9PU5VTEwgLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0KLSAgICByZXR1cm4gYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIocHBCaXRTdHJlYW0sIHBPZmZzZXQsIHBOdW1Db2VmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHBQb3NDb2VmYnVmLCA0LCA0KTsKLQotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGFiODE5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYworKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBILjI2NCBkZWNvZGUgY29lZmZpY2llbnRzIG1vZHVsZQotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDICAgKDYuMy40LjEuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIENBVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIGZvciA0eDQgYmxvY2sgb2YgCi0gKiBJbnRyYTE2eDE2RENMZXZlbCwgSW50cmExNngxNkFDTGV2ZWwsIEx1bWFMZXZlbCwgYW5kIENocm9tYUFDTGV2ZWwuIEludmVyc2UgCi0gKiBmaWVsZCBzY2FuIGlzIG5vdCBzdXBwb3J0ZWQuIFRoZSBkZWNvZGVkIGNvZWZmaWNpZW50cyBpbiB0aGUgcGFja2VkIAotICogcG9zaXRpb24tY29lZmZpY2llbnQgYnVmZmVyIGFyZSBzdG9yZWQgaW4gcmV2ZXJzZSB6aWctemFnIG9yZGVyLCBpLmUuLCB0aGUgCi0gKiBmaXJzdCBidWZmZXIgZWxlbWVudCBjb250YWlucyB0aGUgbGFzdCBub24temVybyBwb3N0aW9uLWNvZWZmaWNpZW50IHBhaXIgb2YgCi0gKiB0aGUgYmxvY2suIFdpdGhpbiBlYWNoIHBvc2l0aW9uLWNvZWZmaWNpZW50IHBhaXIsIHRoZSBwb3NpdGlvbiBlbnRyeSAKLSAqIGluZGljYXRlcyB0aGUgcmFzdGVyLXNjYW4gcG9zaXRpb24gb2YgdGhlIGNvZWZmaWNpZW50LCB3aGlsZSB0aGUgCi0gKiBjb2VmZmljaWVudCBlbnRyeSBjb250YWlucyB0aGUgY29lZmZpY2llbnQgdmFsdWUuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC1Eb3VibGUgcG9pbnRlciB0byBjdXJyZW50IGJ5dGUgaW4gYml0IHN0cmVhbSBidWZmZXIgCi0gKiAgIHBPZmZzZXQgLSBQb2ludGVyIHRvIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgdG8gYnkgCi0gKiAgICAgICAgICAgICpwcEJpdFN0cmVhbTsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDddLiAKLSAqICAgc01heE51bUNvZWZmIC0gTWF4aW11bSB0aGUgbnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyBpbiBjdXJyZW50IAotICogICAgICAgICAgICBibG9jayAKLSAqICAgc1ZMQ1NlbGVjdCAtIFZMQyB0YWJsZSBzZWxlY3Rvciwgb2J0YWluZWQgZnJvbSB0aGUgbnVtYmVyIG9mIG5vbi16ZXJvIAotICogICAgICAgICAgICBjb2VmZmljaWVudHMgY29udGFpbmVkIGluIHRoZSBhYm92ZSBhbmQgbGVmdCA0eDQgYmxvY2tzLiAgSXQgaXMgCi0gKiAgICAgICAgICAgIGVxdWl2YWxlbnQgdG8gdGhlIHZhcmlhYmxlIG5DIGRlc2NyaWJlZCBpbiBILjI2NCBzdGFuZGFyZCB0YWJsZSAKLSAqICAgICAgICAgICAgOSA1LCBleGNlcHQgaXRzIHZhbHVlIGNhbiB0IGJlIGxlc3MgdGhhbiB6ZXJvLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQuICAKLSAqICAgICAgICAgICAgQnVmZmVyIHBvc2l0aW9uICgqcHBQb3NDb2VmQnVmKSBpcyB1cGRhdGVkIHVwb24gcmV0dXJuLCB1bmxlc3MgCi0gKiAgICAgICAgICAgIHRoZXJlIGFyZSBvbmx5IHplcm8gY29lZmZpY2llbnRzIGluIHRoZSBjdXJyZW50bHkgZGVjb2RlZCBibG9jay4gCi0gKiAgICAgICAgICAgICBJbiB0aGlzIGNhc2UgdGhlIGNhbGxlciBpcyBleHBlY3RlZCB0byBieXBhc3MgdGhlIAotICogICAgICAgICAgICB0cmFuc2Zvcm0vZGVxdWFudGl6YXRpb24gb2YgdGhlIGVtcHR5IGJsb2Nrcy4gCi0gKiAgIHBPZmZzZXQgLSAqcE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZCAKLSAqICAgcE51bUNvZWZmIC0gUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIG5vbnplcm8gY29lZmZpY2llbnRzIGluIHRoaXMgYmxvY2sgCi0gKiAgIHBwUG9zQ29lZkJ1ZiAtIERvdWJsZSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIHJlc2lkdWFsIAotICogICAgICAgICAgICBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIHBwQml0U3RyZWFtIG9yIHBPZmZzZXQgaXMgTlVMTC4gCi0gKiAgICAtICAgIHBwUG9zQ29lZkJ1ZiBvciBwTnVtQ29lZmYgaXMgTlVMTC4gCi0gKiAgICAtICAgIHNNYXhOdW1Db2VmZiBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDE1IG9yIDE2LiAKLSAqICAgIC0gICAgc1ZMQ1NlbGVjdCBpcyBsZXNzIHRoYW4gMC4gCi0gKgotICogICAgT01YX1N0c19FcnIgLSBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYW4gaWxsZWdhbCBjb2RlIGlzIGVuY291bnRlcmVkIGluIHRoZSBiaXRzdHJlYW0gCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDKAotICAgICBjb25zdCBPTVhfVTgqKiBwcEJpdFN0cmVhbSwKLSAgICAgT01YX1MzMiogcE9mZnNldCwKLSAgICAgT01YX1U4KiBwTnVtQ29lZmYsCi0gICAgIE9NWF9VOCoqcHBQb3NDb2VmYnVmLAotICAgICBPTVhfSU5UIHNWTENTZWxlY3QsCi0gICAgIE9NWF9JTlQgc01heE51bUNvZWZmICAgICAgICAKLSApCi17Ci0gICAgaW50IG5UYWJsZTsKLQotICAgIGFybVJldEFyZ0VycklmKHBwQml0U3RyZWFtPT1OVUxMICAgLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKnBwQml0U3RyZWFtPT1OVUxMICAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwT2Zmc2V0PT1OVUxMICAgICAgICwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCpwT2Zmc2V0PDAgICAgICAgICAgLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKnBPZmZzZXQ+NyAgICAgICAgICAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwTnVtQ29lZmY9PU5VTEwgICAgICwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBwUG9zQ29lZmJ1Zj09TlVMTCAgLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKnBwUG9zQ29lZmJ1Zj09TlVMTCAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihzVkxDU2VsZWN0PDAgICAgICAgICwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHNNYXhOdW1Db2VmZjwxNSAgICAgLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoc01heE51bUNvZWZmPjE2ICAgICAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICAKLSAgICAvKiBGaW5kIFZMQyB0YWJsZSBudW1iZXIgKi8KLSAgICBpZiAoc1ZMQ1NlbGVjdDwyKQotICAgIHsKLSAgICAgICAgblRhYmxlID0gMDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc1ZMQ1NlbGVjdDw0KQotICAgIHsKLSAgICAgICAgblRhYmxlID0gMTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc1ZMQ1NlbGVjdDw4KQotICAgIHsKLSAgICAgICAgblRhYmxlID0gMjsKLSAgICB9Ci0gICAgZWxzZSAvKiBzVkxDU2VsZWN0ID49IDggKi8KLSAgICB7Ci0gICAgICAgIG5UYWJsZSA9IDM7Ci0gICAgfQotCi0gICAgcmV0dXJuIGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyKHBwQml0U3RyZWFtLCBwT2Zmc2V0LCBwTnVtQ29lZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwUG9zQ29lZmJ1ZiwgblRhYmxlLCBzTWF4TnVtQ29lZmYpOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTAyMmJhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQuYworKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBILjI2NCBpbnZlcnNlIHF1YW50aXplIGFuZCB0cmFuc2Zvcm0gbW9kdWxlCi0gKiAKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0vKgotICogRGVzY3JpcHRpb246Ci0gKiBEZXF1YW50aXplIEx1bWEgQUMgYmxvY2sKLSAqLwotCi1zdGF0aWMgdm9pZCBEZXF1YW50THVtYUFDNHg0KAotICAgICBPTVhfUzE2KiBwU3JjRHN0LAotICAgICBPTVhfSU5UIFFQICAgICAgICAKLSkKLXsKLSAgICBjb25zdCBPTVhfVTggKnBWUm93ID0gJmFybVZDTTRQMTBfVk1hdHJpeFtRUCU2XVswXTsKLSAgICBpbnQgU2hpZnQgPSBRUCAvIDY7Ci0gICAgaW50IGk7Ci0gICAgT01YX1MzMiBWYWx1ZTsKLQotICAgIGZvciAoaT0wOyBpPDE2OyBpKyspCi0gICAgewotCi0gICAgICAgIFZhbHVlID0gKHBTcmNEc3RbaV0gKiBwVlJvd1thcm1WQ000UDEwX1Bvc1RvVkNvbDR4NFtpXV0pIDw8IFNoaWZ0OwotICAgICAgICBwU3JjRHN0W2ldID0gKE9NWF9TMTYpVmFsdWU7Ci0gICAgfQotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCAgICg2LjMuNC4yLjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBSZWNvbnN0cnVjdCB0aGUgNHg0IHJlc2lkdWFsIGJsb2NrIGZyb20gY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIsIAotICogcGVyZm9ybSBkZXF1YW50aXphdGlvbiBhbmQgaW50ZWdlciBpbnZlcnNlIHRyYW5zZm9ybWF0aW9uIGZvciA0eDQgYmxvY2sgb2YgCi0gKiByZXNpZHVhbHMgd2l0aCBwcmV2aW91cyBpbnRyYSBwcmVkaWN0aW9uIG9yIG1vdGlvbiBjb21wZW5zYXRpb24gZGF0YSwgYW5kIAotICogdXBkYXRlIHRoZSBwYWlyIGJ1ZmZlciBwb2ludGVyIHRvIG5leHQgbm9uLWVtcHR5IGJsb2NrLiBJZiBwREMgPT0gTlVMTCwgCi0gKiB0aGVyZSByZSAxNiBub24temVybyBBQyBjb2VmZmljaWVudHMgYXQgbW9zdCBpbiB0aGUgcGFja2VkIGJ1ZmZlciBzdGFydGluZyAKLSAqIGZyb20gNHg0IGJsb2NrIHBvc2l0aW9uIDA7IElmIHBEQyAhPSBOVUxMLCB0aGVyZSByZSAxNSBub24temVybyBBQyAKLSAqIGNvZWZmaWNpZW50cyBhdCBtb3N0IGluIHRoZSBwYWNrZXQgYnVmZmVyIHN0YXJ0aW5nIGZyb20gNHg0IGJsb2NrIHBvc2l0aW9uIAotICogMS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBTcmMgLSBEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciAKLSAqICAgICAgICAgICAgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nIAotICogICBwUHJlZCAtIFBvaW50ZXIgdG8gdGhlIHByZWRpY3RlZCA0eDQgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkgCi0gKiAgIHByZWRTdGVwIC0gUHJlZGljdGVkIGZyYW1lIHN0ZXAgc2l6ZSBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgCi0gKiAgIGRzdFN0ZXAgLSBEZXN0aW5hdGlvbiBmcmFtZSBzdGVwIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAKLSAqICAgcERDIC0gUG9pbnRlciB0byB0aGUgREMgY29lZmZpY2llbnQgb2YgdGhpcyBibG9jaywgTlVMTCBpZiBpdCBkb2Vzbid0IAotICogICAgICAgICAgICBleGlzdCAKLSAqICAgUVAgLSBRUCBRdWFudGl6YXRpb24gcGFyYW1ldGVyLiAgSXQgc2hvdWxkIGJlIFFwQyBpbiBjaHJvbWEgNHg0IGJsb2NrIAotICogICAgICAgICAgICBkZWNvZGluZywgb3RoZXJ3aXNlIGl0IHNob3VsZCBiZSBRcFkuIAotICogICBBQyAtIEZsYWcgaW5kaWNhdGluZyBpZiBhdCBsZWFzdCBvbmUgbm9uLXplcm8gQUMgY29lZmZpY2llbnQgZXhpc3RzIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCA0eDQgYmxvY2sgZGF0YTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgCi0gKiAgICAgICAgICAgIDQtYnl0ZSBib3VuZGFyeSAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBwUHJlZCBvciBwRHN0IGlzIE5VTEwuIAotICogICAgLSAgICBwUHJlZCBvciBwRHN0IGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIHByZWRTdGVwIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgICAtICAgIEFDICE9MCBhbmQgUXAgaXMgbm90IGluIHRoZSByYW5nZSBvZiBbMC01MV0gb3IgcHBTcmMgPT0gTlVMTC4gCi0gKiAgICAtICAgIEFDID09MCAmJiBwREMgPT1OVUxMLiAKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQoCi0gICAgIGNvbnN0IE9NWF9VOCAqKnBwU3JjLAotICAgICBjb25zdCBPTVhfVTggKnBQcmVkLAotICAgICBjb25zdCBPTVhfUzE2ICpwREMsCi0gICAgIE9NWF9VOCAqcERzdCwKLSAgICAgT01YX0lOVCBwcmVkU3RlcCwKLSAgICAgT01YX0lOVCBkc3RTdGVwLAotICAgICBPTVhfSU5UIFFQLAotICAgICBPTVhfSU5UIEFDICAgICAgICAKLSkKLXsKLSAgICBPTVhfUzE2IHBCdWZmZXJbMTYrNF07Ci0gICAgT01YX1MxNiAqcERlbHRhOwotICAgIGludCBpLHgseTsKLSAgICAKLSAgICBhcm1SZXRBcmdFcnJJZihwUHJlZCA9PSBOVUxMLCAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocFByZWQpLE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0ICAgPT0gTlVMTCwgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwcmVkU3RlcCAmIDMsICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihkc3RTdGVwICYgMywgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihBQyE9MCAmJiAoUVA8MCksICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihBQyE9MCAmJiAoUVA+NTEpLCAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihBQyE9MCAmJiBwcFNyYz09TlVMTCwgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihBQyE9MCAmJiAqcHBTcmM9PU5VTEwsICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihBQz09MCAmJiBwREM9PU5VTEwsICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICAKLSAgICBwRGVsdGEgPSBhcm1BbGlnblRvOEJ5dGVzKHBCdWZmZXIpOyAgICAKLQotICAgIGZvciAoaT0wOyBpPDE2OyBpKyspCi0gICAgewotICAgICAgICBwRGVsdGFbaV0gPSAwOwotICAgIH0KLSAgICBpZiAoQUMpCi0gICAgewotICAgICAgICBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0KHBwU3JjLCBwRGVsdGEpOwotICAgICAgICBEZXF1YW50THVtYUFDNHg0KHBEZWx0YSwgUVApOwotICAgIH0KLSAgICBpZiAocERDKQotICAgIHsKLSAgICAgICAgcERlbHRhWzBdID0gcERDWzBdOwotICAgIH0KLSAgICBhcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0KHBEZWx0YSxwRGVsdGEpOwotCi0gICAgZm9yICh5PTA7IHk8NDsgeSsrKQotICAgIHsKLSAgICAgICAgZm9yICh4PTA7IHg8NDsgeCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBwRHN0W3kqZHN0U3RlcCt4XSA9IChPTVhfVTgpYXJtQ2xpcCgwLDI1NSxwUHJlZFt5KnByZWRTdGVwK3hdICsgcERlbHRhWzQqeSt4XSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0kuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0kuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYzNGE5Ni4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogSC4yNjQgY2hyb21hIGRlYmxvY2sgbW9kdWxlCi0gKiAKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSSAgICg2LjMuMy4zLjQpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NrIGZpbHRlcmluZyBvbiB0aGUgaG9yaXpvbnRhbCBlZGdlcyBvZiB0aGUgY2hyb21hIAotICogbWFjcm9ibG9jayAoOHg4KS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgOC1ieXRlIGFsaWduZWQuIAotICogICBzcmNkc3RTdGVwIC0gYXJyYXkgc3RlcDsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBwQWxwaGEgLSBhcnJheSBvZiBzaXplIDIgY29udGFpbmluZyBhbHBoYSB0aHJlc2hvbGRzOyB0aGUgZmlyc3QgZWxlbWVudCAKLSAqICAgICAgICAgICAgY29udGFpbnMgdGhlIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIGhvcml6b250YWwgZWRnZSwgYW5kIHRoZSAKLSAqICAgICAgICAgICAgc2Vjb25kIGVsZW1lbnQgY29udGFpbnMgdGhlIHRocmVzaG9sZCBmb3IgaW50ZXJuYWwgaG9yaXpvbnRhbCAKLSAqICAgICAgICAgICAgZWRnZS4gIFBlciBbSVNPMTQ0OTYtMTBdIGFscGhhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSAKLSAqICAgICAgICAgICAgWzAsMjU1XS4gCi0gKiAgIHBCZXRhIC0gYXJyYXkgb2Ygc2l6ZSAyIGNvbnRhaW5pbmcgYmV0YSB0aHJlc2hvbGRzOyB0aGUgZmlyc3QgZWxlbWVudCAKLSAqICAgICAgICAgICAgY29udGFpbnMgdGhlIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIGhvcml6b250YWwgZWRnZSwgYW5kIHRoZSAKLSAqICAgICAgICAgICAgc2Vjb25kIGVsZW1lbnQgY29udGFpbnMgdGhlIHRocmVzaG9sZCBmb3IgdGhlIGludGVybmFsIAotICogICAgICAgICAgICBob3Jpem9udGFsIGVkZ2UuICBQZXIgW0lTTzE0NDk2LTEwXSBiZXRhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSAKLSAqICAgICAgICAgICAgcmFuZ2UgWzAsMThdLiAKLSAqICAgcFRocmVzaG9sZHMgLSBhcnJheSBvZiBzaXplIDggY29udGFpbmluZyB0aHJlc2hvbGRzLCBUQzAsIGZvciB0aGUgdG9wIAotICogICAgICAgICAgICBob3Jpem9udGFsIGVkZ2Ugb2YgZWFjaCAyeDQgY2hyb21hIGJsb2NrLCBhcnJhbmdlZCBpbiBob3Jpem9udGFsIAotICogICAgICAgICAgICBibG9jayBvcmRlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgUGVyIAotICogICAgICAgICAgICBbSVNPMTQ0OTYtMTBdIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNV0uIAotICogICBwQlMgLSBhcnJheSBvZiBzaXplIDE2IGNvbnRhaW5pbmcgQlMgcGFyYW1ldGVycyBmb3IgZWFjaCAyeDIgY2hyb21hIAotICogICAgICAgICAgICBibG9jaywgYXJyYW5nZWQgaW4gaG9yaXpvbnRhbCBibG9jayBvcmRlcjsgdmFsaWQgaW4gdGhlIHJhbmdlIAotICogICAgICAgICAgICBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSBvY2N1ciAKLSAqICAgICAgICAgICAgb25seSBmb3IgMDw9aTw9MywgaWkpIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leM109PSA0LiAKLSAqICAgICAgICAgICAgTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLVBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqIAotICogICAgT01YX1N0c19CYWRBcmdFcnIsIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIGFueSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwU3JjRHN0LCBwQWxwaGEsIHBCZXRhLCBwVGhyZXNob2xkcywgb3IgcEJTLiAKLSAqICAgIC0gICAgcFNyY0RzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICogICAgLSAgICBwVGhyZXNob2xkcyBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBwQWxwaGFbMF0gYW5kL29yIHBBbHBoYVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwyNTVdLiAKLSAqICAgIC0gICAgcEJldGFbMF0gYW5kL29yIHBCZXRhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDE4XS4gCi0gKiAgICAtICAgIE9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjddIGlzIG91dHNpZGUgCi0gKiAgICAgICAgIG9mIHRoZSByYW5nZSBbMCwyNV0uIAotICogICAgLSAgICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgICAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAKLSAqICAgICAgICAgICAgICAocEJTW2ldPT00ICYmIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4KLSAqICAgIC0gICAgcEJTIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JKAotICAgICBPTVhfVTgqIHBTcmNEc3QsCi0gICAgIE9NWF9TMzIgc3JjZHN0U3RlcCwKLSAgICAgY29uc3QgT01YX1U4KiBwQWxwaGEsCi0gICAgIGNvbnN0IE9NWF9VOCogcEJldGEsCi0gICAgIGNvbnN0IE9NWF9VOCogcFRocmVzaG9sZHMsCi0gICAgIGNvbnN0IE9NWF9VOCAqcEJTICAgICAgICAKLSApCi17Ci0gICAgaW50IEksIFgsIFksIEludGVybmFsPTA7Ci0KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0ID09IE5VTEwsICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90OEJ5dGVBbGlnbmVkKHBTcmNEc3QpLCAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHNyY2RzdFN0ZXAgJiA3LCAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwQWxwaGEgPT0gTlVMTCwgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocEJldGEgPT0gTlVMTCwgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBUaHJlc2hvbGRzID09IE5VTEwsICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocFRocmVzaG9sZHMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocEJTID09IE5VTEwsICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwQlMpLCAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQotICAgIGZvciAoWT0wOyBZPDg7IFkrPTQsIEludGVybmFsPTEpCi0gICAgewotICAgICAgICBmb3IgKFg9MDsgWDw4OyBYKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIEkgPSAoWD4+MSkrNCooWT4+MSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGFybVJldEFyZ0VycklmKHBCU1tJXSA+IDQsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgICAgICAgICAgCi0gICAgICAgICAgICBhcm1SZXRBcmdFcnJJZiggKEkgPiAzKSAmJiAocEJTW0ldID09IDQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgICAgICAgICAgCi0gICAgICAgICAgICBhcm1SZXRBcmdFcnJJZiggKEkgPCA0KSAgICAgICAmJiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKCAocEJTW0ldID09IDQpICYmIChwQlNbSV4xXSAhPSA0KSApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qIEZpbHRlciBob3Jpem9udGFsIGVkZ2Ugd2l0aCBxMCBhdCAoWCxZKSAqLwotICAgICAgICAgICAgYXJtVkNNNFAxMF9EZUJsb2NrUGl4ZWwoCi0gICAgICAgICAgICAgICAgcFNyY0RzdCArIFkqc3JjZHN0U3RlcCArIFgsCi0gICAgICAgICAgICAgICAgc3JjZHN0U3RlcCwKLSAgICAgICAgICAgICAgICBwVGhyZXNob2xkc1soWD4+MSkrNCooWT4+MildLAotICAgICAgICAgICAgICAgIHBBbHBoYVtJbnRlcm5hbF0sCi0gICAgICAgICAgICAgICAgcEJldGFbSW50ZXJuYWxdLAotICAgICAgICAgICAgICAgIHBCU1tJXSwKLSAgICAgICAgICAgICAgICAxKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGIwZTg3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0kuYworKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBILjI2NCBkZWJsb2NraW5nIG1vZHVsZQotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0kgICAoNi4zLjMuMy4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgaW4tcGxhY2UgZGVibG9jayBmaWx0ZXJpbmcgb24gZm91ciB2ZXJ0aWNhbCBlZGdlcyBvZiB0aGUgY2hyb21hIAotICogbWFjcm9ibG9jayAoOHg4KS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgOC1ieXRlIGFsaWduZWQuIAotICogICBzcmNkc3RTdGVwIC0gU3RlcCBvZiB0aGUgYXJyYXlzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIHBBbHBoYSAtIEFycmF5IG9mIHNpemUgMiBvZiBhbHBoYSB0aHJlc2hvbGRzICh0aGUgZmlyc3QgaXRlbSBpcyBhbHBoYSAKLSAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIGZvciAKLSAqICAgICAgICAgICAgaW50ZXJuYWwgdmVydGljYWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGFscGhhIHZhbHVlcyBtdXN0IGJlIAotICogICAgICAgICAgICBpbiB0aGUgcmFuZ2UgWzAsMjU1XS4gCi0gKiAgIHBCZXRhIC0gQXJyYXkgb2Ygc2l6ZSAyIG9mIGJldGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGJldGEgCi0gKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gaXMgCi0gKiAgICAgICAgICAgIGZvciB0aGUgaW50ZXJuYWwgdmVydGljYWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGJldGEgdmFsdWVzIAotICogICAgICAgICAgICBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAotICogICBwVGhyZXNob2xkcyAtIEFycmF5IG9mIHNpemUgOCBjb250YWluaW5nIHRocmVzaG9sZHMsIFRDMCwgZm9yIHRoZSBsZWZ0IAotICogICAgICAgICAgICB2ZXJ0aWNhbCBlZGdlIG9mIGVhY2ggNHgyIGNocm9tYSBibG9jaywgYXJyYW5nZWQgaW4gdmVydGljYWwgCi0gKiAgICAgICAgICAgIGJsb2NrIG9yZGVyOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBQZXIgCi0gKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCi0gKiAgIHBCUyAtIEFycmF5IG9mIHNpemUgMTYgb2YgQlMgcGFyYW1ldGVycyAodmFsdWVzIGZvciBlYWNoIDJ4MiBjaHJvbWEgCi0gKiAgICAgICAgICAgIGJsb2NrLCBhcnJhbmdlZCBpbiB2ZXJ0aWNhbCBibG9jayBvcmRlcikuIFRoaXMgcGFyYW1ldGVyIGlzIHRoZSAKLSAqICAgICAgICAgICAgc2FtZSBhcyB0aGUgcEJTcGFyYW1ldGVyIHBhc3NlZCBpbnRvIEZpbHRlckRlYmxvY2tMdW1hX1ZlckVkZ2U7IAotICogICAgICAgICAgICB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczogaSkgCi0gKiAgICAgICAgICAgIHBCU1tpXT09IDQgbWF5IG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSBwQlNbaV09PSA0IGlmIGFuZCAKLSAqICAgICAgICAgICAgb25seSBpZiBwQlNbaV4zXT09IDQuICBNdXN0IGJlIDQgYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtUG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0RzdCwgcEFscGhhLCAKLSAqICAgICAgICAgICAgICBwQmV0YSwgcFRocmVzaG9sZHMsIG9yIHBCUy4gCi0gKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgIC0gICAgcFRocmVzaG9sZHMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgcEFscGhhWzBdIGFuZC9vciBwQWxwaGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMjU1XS4gCi0gKiAgICAtICAgIHBCZXRhWzBdIGFuZC9vciBwQmV0YVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwxOF0uIAotICogICAgLSAgICBPbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwVGhyZXNob2xkc1swLi43XSBpcyBvdXRzaWRlIAotICogICAgICAgICBvZiB0aGUgcmFuZ2UgWzAsMjVdLiAKLSAqICAgIC0gICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIAotICogICAgICAgICAocEJTW2ldPT00ICYmIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4gCi0gKiAgICAtICAgIHBCUyBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSSgKLSAgICAgT01YX1U4KiBwU3JjRHN0LAotICAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCi0gICAgIGNvbnN0IE9NWF9VOCogcEFscGhhLAotICAgICBjb25zdCBPTVhfVTgqIHBCZXRhLAotICAgICBjb25zdCBPTVhfVTgqIHBUaHJlc2hvbGRzLAotICAgICBjb25zdCBPTVhfVTggKnBCUyAgICAgICAgCi0gKQotewotICAgIGludCBJLCBYLCBZLCBJbnRlcm5hbD0wOwotCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdCA9PSBOVUxMLCAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDhCeXRlQWxpZ25lZChwU3JjRHN0KSwgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihzcmNkc3RTdGVwICYgNywgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocEFscGhhID09IE5VTEwsICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBCZXRhID09IE5VTEwsICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwVGhyZXNob2xkcyA9PSBOVUxMLCAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBUaHJlc2hvbGRzKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBCUyA9PSBOVUxMLCAgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocEJTKSwgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocEJldGFbMF0gPiAxOCwgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwQmV0YVsxXSA+IDE4LCAgT01YX1N0c19CYWRBcmdFcnIpOwotCi0gICAgZm9yIChYPTA7IFg8ODsgWCs9NCwgSW50ZXJuYWw9MSkKLSAgICB7Ci0gICAgICAgIGZvciAoWT0wOyBZPDg7IFkrKykKLSAgICAgICAgewotICAgICAgICAgICAgSSA9IChZPj4xKSs0KihYPj4xKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgYXJtUmV0QXJnRXJySWYocEJTW0ldID4gNCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBhcm1SZXRBcmdFcnJJZiggKEkgPiAzKSAmJiAocEJTW0ldID09IDQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgYXJtUmV0QXJnRXJySWYoICggKHBCU1tJXSA9PSA0KSAmJiAocEJTW0leM10gIT0gNCkgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgICAgICAgICBhcm1SZXRBcmdFcnJJZihwVGhyZXNob2xkc1tZXSA+IDI1LCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyogRmlsdGVyIHZlcnRpY2FsIGVkZ2Ugd2l0aCBxMCBhdCAoWCxZKSAqLwotICAgICAgICAgICAgYXJtVkNNNFAxMF9EZUJsb2NrUGl4ZWwoCi0gICAgICAgICAgICAgICAgcFNyY0RzdCArIFkqc3JjZHN0U3RlcCArIFgsCi0gICAgICAgICAgICAgICAgMSwKLSAgICAgICAgICAgICAgICBwVGhyZXNob2xkc1soWT4+MSkrNCooWD4+MildLAotICAgICAgICAgICAgICAgIHBBbHBoYVtJbnRlcm5hbF0sCi0gICAgICAgICAgICAgICAgcEJldGFbSW50ZXJuYWxdLAotICAgICAgICAgICAgICAgIHBCU1tJXSwKLSAgICAgICAgICAgICAgICAxKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0kuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5Mjk0ZjguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0kuYworKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogSC4yNjQgbHVtYSBkZWJsb2NrIG1vZHVsZQotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JICAgKDYuMy4zLjMuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2sgZmlsdGVyaW5nIG9uIGZvdXIgaG9yaXpvbnRhbCBlZGdlcyBvZiB0aGUgbHVtYSAKLSAqIG1hY3JvYmxvY2sgKDE2eDE2KS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqICAgc3JjZHN0U3RlcCAtcyB0ZXAgb2YgdGhlIGFycmF5czsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgcEFscGhhIC0gYXJyYXkgb2Ygc2l6ZSAyIG9mIGFscGhhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBhbHBoYSAKLSAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgYW5kIHRoZSBzZWNvbmQgaXRlbSBpcyAKLSAqICAgICAgICAgICAgZm9yIHRoZSBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UpOyBwZXIgW0lTTzE0NDk2LTEwXSBhbHBoYSAKLSAqICAgICAgICAgICAgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1NV0uIAotICogICBwQmV0YSAtIGFycmF5IG9mIHNpemUgMiBvZiBiZXRhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBiZXRhIAotICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCBob3Jpem9udGFsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gCi0gKiAgICAgICAgICAgIGlzIGZvciB0aGUgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlKS4gUGVyIFtJU08xNDQ5Ni0xMF0gYmV0YSAKLSAqICAgICAgICAgICAgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDE4XS4gCi0gKiAgIHBUaHJlc2hvbGRzIC0gYXJyYXkgb2Ygc2l6ZSAxNiBjb250YWluaW5nIHRocmVzaG9sZHMsIFRDMCwgZm9yIHRoZSB0b3AgCi0gKiAgICAgICAgICAgIGhvcml6b250YWwgZWRnZSBvZiBlYWNoIDR4NCBibG9jaywgYXJyYW5nZWQgaW4gaG9yaXpvbnRhbCBibG9jayAKLSAqICAgICAgICAgICAgb3JkZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIFBlciBbSVNPMTQ0OTYgMTBdIAotICogICAgICAgICAgICB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjVdLiAKLSAqICAgcEJTIC0gYXJyYXkgb2Ygc2l6ZSAxNiBvZiBCUyBwYXJhbWV0ZXJzIChhcnJhbmdlZCBpbiBob3Jpem9udGFsIGJsb2NrIAotICogICAgICAgICAgICBvcmRlcik7IHZhbGlkIGluIHRoZSByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIAotICogICAgICAgICAgICBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjNdPT0gNC4gIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC1Qb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyLCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QsIHBBbHBoYSwgCi0gKiAgICAgICAgICAgICAgcEJldGEsIHBUaHJlc2hvbGRzLCBvciBwQlMuIAotICogICAgLSAgICBlaXRoZXIgcFRocmVzaG9sZHMgb3IgcEJTIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgIC0gICAgcFNyY0RzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgICAtICAgIHBBbHBoYVswXSBhbmQvb3IgcEFscGhhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDI1NV0uIAotICogICAgLSAgICBwQmV0YVswXSBhbmQvb3IgcEJldGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMThdLiAKLSAqICAgIC0gICAgT25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uMTVdIGlzIAotICogICAgICAgICBvdXRzaWRlIG9mIHRoZSByYW5nZSBbMCwyNV0uIAotICogICAgLSAgICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgICAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAKLSAqICAgICAgICAgICAgICAocEJTW2ldPT00ICYmIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4gCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSSgKLSAgICAgT01YX1U4KiBwU3JjRHN0LAotICAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCi0gICAgIGNvbnN0IE9NWF9VOCogcEFscGhhLAotICAgICBjb25zdCBPTVhfVTgqIHBCZXRhLAotICAgICBjb25zdCBPTVhfVTgqIHBUaHJlc2hvbGRzLAotICAgICBjb25zdCBPTVhfVTggKnBCUyAgICAgICAgCi0gKQotewotICAgIGludCBJLCBYLCBZLCBJbnRlcm5hbD0wOwotCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdCA9PSBOVUxMLCAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90OEJ5dGVBbGlnbmVkKHBTcmNEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoc3JjZHN0U3RlcCAmIDcsICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7ICAgIAotICAgIGFybVJldEFyZ0VycklmKHBBbHBoYSA9PSBOVUxMLCAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBCZXRhID09IE5VTEwsICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBUaHJlc2hvbGRzID09IE5VTEwsICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwVGhyZXNob2xkcyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwQlMgPT0gTlVMTCwgICAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBCUyksICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIAotICAgIGZvciAoWT0wOyBZPDE2OyBZKz00LCBJbnRlcm5hbD0xKQotICAgIHsKLSAgICAgICAgZm9yIChYPTA7IFg8MTY7IFgrKykKLSAgICAgICAgewotICAgICAgICAgICAgSSA9IChYPj4yKSs0KihZPj4yKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgYXJtUmV0QXJnRXJySWYocEJTW0ldID4gNCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGFybVJldEFyZ0VycklmKCAoSSA+IDMpICYmIChwQlNbSV0gPT0gNCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGFybVJldEFyZ0VycklmKCAoSSA8IDQpICAgICAgICYmIAotICAgICAgICAgICAgICAgICAgICAgICAgICAoIChwQlNbSV0gPT0gNCkgJiYgKHBCU1tJXjFdICE9IDQpICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qIEZpbHRlciBob3Jpem9udGFsIGVkZ2Ugd2l0aCBxMCBhdCAoWCxZKSAqLwotICAgICAgICAgICAgYXJtVkNNNFAxMF9EZUJsb2NrUGl4ZWwoCi0gICAgICAgICAgICAgICAgcFNyY0RzdCArIFkqc3JjZHN0U3RlcCArIFgsCi0gICAgICAgICAgICAgICAgc3JjZHN0U3RlcCwKLSAgICAgICAgICAgICAgICBwVGhyZXNob2xkc1tJXSwKLSAgICAgICAgICAgICAgICBwQWxwaGFbSW50ZXJuYWxdLAotICAgICAgICAgICAgICAgIHBCZXRhW0ludGVybmFsXSwKLSAgICAgICAgICAgICAgICBwQlNbSV0sCi0gICAgICAgICAgICAgICAgMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2UyMzJhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0kuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIEguMjY0IGx1bWEgZGVibG9jayBtb2R1bGUKLSAqIAotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSSAgICg2LjMuMy4zLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NrIGZpbHRlcmluZyBvbiBmb3VyIHZlcnRpY2FsIGVkZ2VzIG9mIHRoZSBsdW1hIAotICogbWFjcm9ibG9jayAoMTZ4MTYpLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIAotICogICBzcmNkc3RTdGVwIC1TdGVwIG9mIHRoZSBhcnJheXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgIHBBbHBoYSAtQXJyYXkgb2Ygc2l6ZSAyIG9mIGFscGhhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBhbHBoYSAKLSAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgYW5kIHRoZSBzZWNvbmQgaXRlbSBpcyAKLSAqICAgICAgICAgICAgZm9yIHRoZSBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlKTsgcGVyIFtJU08xNDQ5Ni0xMF0gYWxwaGEgdmFsdWVzIAotICogICAgICAgICAgICBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNTVdLiAKLSAqICAgcEJldGEgLUFycmF5IG9mIHNpemUgMiBvZiBiZXRhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBiZXRhIAotICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIAotICogICAgICAgICAgICBmb3IgdGhlIGludGVybmFsIHZlcnRpY2FsIGVkZ2UpOyBwZXIgW0lTTzE0NDk2LTEwXSBiZXRhIHZhbHVlcyAKLSAqICAgICAgICAgICAgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMThdLiAKLSAqICAgcFRocmVzaG9sZHMgLUFycmF5IG9mIHNpemUgMTYgb2YgVGhyZXNob2xkcyAoVEMwKSAodmFsdWVzIGZvciB0aGUgbGVmdCAKLSAqICAgICAgICAgICAgZWRnZSBvZiBlYWNoIDR4NCBibG9jaywgYXJyYW5nZWQgaW4gdmVydGljYWwgYmxvY2sgb3JkZXIpOyBtdXN0IAotICogICAgICAgICAgICBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5Li4gIFBlciBbSVNPMTQ0OTYtMTBdIHZhbHVlcyBtdXN0IAotICogICAgICAgICAgICBiZSBpbiB0aGUgcmFuZ2UgWzAsMjVdLiAKLSAqICAgcEJTIC1BcnJheSBvZiBzaXplIDE2IG9mIEJTIHBhcmFtZXRlcnMgKGFycmFuZ2VkIGluIHZlcnRpY2FsIGJsb2NrIAotICogICAgICAgICAgICBvcmRlcik7IHZhbGlkIGluIHRoZSByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIAotICogICAgICAgICAgICBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjNdPT0gNC4gIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC1Qb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAotICogICAgSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKLSAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCi0gKiAgICBFaXRoZXIgb2YgdGhlIHBvaW50ZXJzIGluIHBTcmNEc3QsIHBBbHBoYSwgcEJldGEsIHBUaHJlc2hvbGRzLCBvciBwQlMgCi0gKiAgICAgICAgICAgICAgaXMgTlVMTC4gCi0gKiAgICBFaXRoZXIgcFRocmVzaG9sZHMgb3IgcEJTIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgIHBTcmNEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgIHBBbHBoYVswXSBhbmQvb3IgcEFscGhhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDI1NV0uIAotICogICAgcEJldGFbMF0gYW5kL29yIHBCZXRhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDE4XS4gCi0gKiAgICBPbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwVGhyZXNob2xkc1swLi4xNV1pcyBvdXRzaWRlIG9mIHRoZSAKLSAqICAgICAgICAgICAgICByYW5nZSBbMCwyNV0uIAotICogICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgICAgICAgICAgICBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCBmb3IgaT49NCwgb3IgKHBCU1tpXT09NCAmJiAKLSAqICAgICAgICAgICAgICBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0koCi0gICAgIE9NWF9VOCogcFNyY0RzdCwKLSAgICAgT01YX1MzMiBzcmNkc3RTdGVwLAotICAgICBjb25zdCBPTVhfVTgqIHBBbHBoYSwKLSAgICAgY29uc3QgT01YX1U4KiBwQmV0YSwKLSAgICAgY29uc3QgT01YX1U4KiBwVGhyZXNob2xkcywKLSAgICAgY29uc3QgT01YX1U4ICpwQlMgICAgICAgIAotICkKLXsKLSAgICBpbnQgWCwgWSwgSSwgSW50ZXJuYWw9MDsKLQotICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3QgPT0gTlVMTCwgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDE2Qnl0ZUFsaWduZWQocFNyY0RzdCksT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHNyY2RzdFN0ZXAgJiAxNSwgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOyAgICAKLSAgICBhcm1SZXRBcmdFcnJJZihwQWxwaGEgPT0gTlVMTCwgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwQmV0YSA9PSBOVUxMLCAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwVGhyZXNob2xkcyA9PSBOVUxMLCAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocFRocmVzaG9sZHMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocEJTID09IE5VTEwsICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwQlMpLCAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwQmV0YVswXSA+IDE4LCAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBCZXRhWzFdID4gMTgsICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgCi0KLSAgICBmb3IgKFg9MDsgWDwxNjsgWCs9NCwgSW50ZXJuYWw9MSkKLSAgICB7Ci0gICAgICAgIGZvciAoWT0wOyBZPDE2OyBZKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIEkgPSAoWT4+MikrNCooWD4+Mik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGFybVJldEFyZ0VycklmKHBCU1tZXSA+IDQsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgYXJtUmV0QXJnRXJySWYoKHBCU1tZXSA9PSA0KSAmJiAoWSA+IDMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgYXJtUmV0QXJnRXJySWYoKCAocEJTW1ldID09IDQpICYmIChwQlNbWV4zXSAhPSA0KSApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGFybVJldEFyZ0VycklmKHBUaHJlc2hvbGRzW1ldID4gMjUsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyogRmlsdGVyIHZlcnRpY2FsIGVkZ2Ugd2l0aCBxMCBhdCAoWCxZKSAqLwotICAgICAgICAgICAgYXJtVkNNNFAxMF9EZUJsb2NrUGl4ZWwoCi0gICAgICAgICAgICAgICAgcFNyY0RzdCArIFkqc3JjZHN0U3RlcCArIFgsCi0gICAgICAgICAgICAgICAgMSwKLSAgICAgICAgICAgICAgICBwVGhyZXNob2xkc1tJXSwKLSAgICAgICAgICAgICAgICBwQWxwaGFbSW50ZXJuYWxdLAotICAgICAgICAgICAgICAgIHBCZXRhW0ludGVybmFsXSwKLSAgICAgICAgICAgICAgICBwQlNbSV0sCi0gICAgICAgICAgICAgICAgMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfR2V0VkxDSW5mby5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9HZXRWTENJbmZvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MDU1MmEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9HZXRWTENJbmZvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfR2V0VkxDSW5mby5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIAotICogVGhpcyBmdW5jdGlvbiBleHRyYWN0cyBydW4tbGVuZ3RoIGVuY29kaW5nIChSTEUpIGluZm9ybWF0aW9uCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9HZXRWTENJbmZvICAgKDYuMy41LjkuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gZXh0cmFjdHMgcnVuLWxlbmd0aCBlbmNvZGluZyAoUkxFKSBpbmZvcm1hdGlvbiBmcm9tIHRoZSAKLSAqIGNvZWZmaWNpZW50IG1hdHJpeC4gIFRoZSByZXN1bHRzIGFyZSByZXR1cm5lZCBpbiBhbiBPTVhWQ000UDEwVkxDSW5mbyAKLSAqIHN0cnVjdHVyZS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0NvZWZmIC0gcG9pbnRlciB0byB0aGUgdHJhbnNmb3JtIGNvZWZmaWNpZW50IG1hdHJpeC4gIDgtYnl0ZSAKLSAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgcFNjYW5NYXRyaXggLSBwb2ludGVyIHRvIHRoZSBzY2FuIG9yZGVyIGRlZmluaXRpb24gbWF0cml4LiAgRm9yIGEgbHVtYSAKLSAqICAgICAgICAgICAgYmxvY2sgdGhlIHNjYW4gbWF0cml4IHNob3VsZCBmb2xsb3cgW0lTTzE0NDk2LTEwXSBzZWN0aW9uIDguNS40LCAKLSAqICAgICAgICAgICAgYW5kIHNob3VsZCBjb250YWluIHRoZSB2YWx1ZXMgMCwgMSwgNCwgOCwgNSwgMiwgMywgNiwgOSwgMTIsIDEzLCAKLSAqICAgICAgICAgICAgMTAsIDcsIDExLCAxNCwgMTUuICBGb3IgYSBjaHJvbWEgYmxvY2ssIHRoZSBzY2FuIG1hdHJpeCBzaG91bGQgCi0gKiAgICAgICAgICAgIGNvbnRhaW4gdGhlIHZhbHVlcyAwLCAxLCAyLCAzLiAKLSAqICAgYkFDIC0gaW5kaWNhdGVzIHByZXNlbmNlIG9mIGEgREMgY29lZmZpY2llbnQ7IDAgPSBEQyBjb2VmZmljaWVudCAKLSAqICAgICAgICAgICAgcHJlc2VudCwgMT0gREMgY29lZmZpY2llbnQgYWJzZW50LiAKLSAqICAgTWF4TnVtQ29lZiAtIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBjb250YWluZWQgaW4gdGhlIAotICogICAgICAgICAgICB0cmFuc2Zvcm0gY29lZmZpY2llbnQgbWF0cml4LCBwU3JjQ29lZmYuIFRoZSB2YWx1ZSBzaG91bGQgYmUgMTYgCi0gKiAgICAgICAgICAgIGZvciBibG9ja3Mgb2YgdHlwZSBMVU1BREMsIExVTUFBQywgTFVNQUxFVkVMLCBhbmQgQ0hST01BQUMuIFRoZSAKLSAqICAgICAgICAgICAgdmFsdWUgc2hvdWxkIGJlIDQgZm9yIGJsb2NrcyBvZiB0eXBlIENIUk9NQURDLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFZMQ0luZm8gLSBwb2ludGVyIHRvIHN0cnVjdHVyZSB0aGF0IHN0b3JlcyBpbmZvcm1hdGlvbiBmb3IgCi0gKiAgICAgICAgICAgIHJ1bi1sZW5ndGggY29kaW5nLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICAgICBwU3JjQ29lZmYsIHBTY2FuTWF0cml4LCBwRHN0VkxDSW5mbyAKLSAqICAgIC0gICAgcFNyY0NvZWZmIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0dldFZMQ0luZm8gKAotCWNvbnN0IE9NWF9TMTYqCQkgICAgcFNyY0NvZWZmLAotCWNvbnN0IE9NWF9VOCoJCQkgICAgcFNjYW5NYXRyaXgsCi0JT01YX1U4CQkJICAgIGJBQywKLQlPTVhfVTMyCQkJICAgIE1heE51bUNvZWYsCi0JT01YVkNNNFAxMFZMQ0luZm8qCXBEc3RWTENJbmZvCi0pCi17Ci0gICAgT01YX0lOVCAgICAgaSwgTWluSW5kZXg7Ci0gICAgT01YX1MzMiAgICAgVmFsdWU7Ci0gICAgT01YX1UzMiAgICAgTWFzayA9IDQsIFJ1bkJlZm9yZTsKLSAgICBPTVhfUzE2ICAgICAqcExldmVsOwotICAgIE9NWF9VOCAgICAgICpwUnVuOwotICAgIE9NWF9TMTYgICAgIEJ1ZiBbMTZdOwotCi0gICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY0NvZWZmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDhCeXRlQWxpZ25lZChwU3JjQ29lZmYpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwU2Nhbk1hdHJpeCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0VkxDSW5mbyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihiQUMgPiAxLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihNYXhOdW1Db2VmID4gMTYsIE9NWF9TdHNfQmFkQXJnRXJyKQotCi0gICAgLyogSW5pdGlhbGl6ZSBSTEUgSW5mbyBzdHJ1Y3R1cmUgKi8KLSAgICBwRHN0VkxDSW5mby0+dVRyYWlsaW5nX09uZXMgPSAwOwotICAgIHBEc3RWTENJbmZvLT51VHJhaWxpbmdfT25lX1NpZ25zID0gMDsKLSAgICBwRHN0VkxDSW5mby0+dU51bUNvZWZmcyA9IDA7Ci0gICAgcERzdFZMQ0luZm8tPnVUb3RhbFplcm9zID0gMDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotICAgIHsKLSAgICAgICAgcERzdFZMQ0luZm8tPmlMZXZlbHMgW2ldID0gMDsKLSAgICAgICAgcERzdFZMQ0luZm8tPnVSdW5zIFtpXSA9IDA7Ci0gICAgfQotICAgIAotICAgIE1pbkluZGV4ID0gKGJBQyA9PSAwICYmIE1heE51bUNvZWYgPT0gMTUpID8gMSA6IDA7Ci0gICAgZm9yIChpID0gTWluSW5kZXg7IGkgPCAoTWF4TnVtQ29lZiArIE1pbkluZGV4KTsgaSsrKQotICAgIHsgICAgICAgIAotICAgICAgICAvKiBTY2FuICovCi0gICAgICAgIEJ1ZiBbaSAtIE1pbkluZGV4XSA9IHBTcmNDb2VmZiBbcFNjYW5NYXRyaXggW2ldXTsKLSAgICB9Ci0KLSAgICAvKiBza2lwIHplcm9zIGF0IHRoZSBlbmQgKi8KLSAgICBpID0gTWF4TnVtQ29lZiAtIDE7Ci0gICAgd2hpbGUgKCFCdWYgW2ldICYmIGkgPj0gMCkKLSAgICB7Ci0gICAgICAgIGktLTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGkgPCAwKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci0gICAgfQotCi0gICAgLyogRmlsbCBSTEUgSW5mbyBzdHJ1Y3R1cmUgKi8KLSAgICBwTGV2ZWwgPSBwRHN0VkxDSW5mby0+aUxldmVsczsKLSAgICBwUnVuID0gcERzdFZMQ0luZm8tPnVSdW5zOwotICAgIFJ1bkJlZm9yZSA9IDA7Ci0KLSAgICAvKiBIYW5kbGUgZmlyc3Qgbm9uIHplcm8gc2VwYXJhdGUgKi8KLSAgICBwRHN0VkxDSW5mby0+dU51bUNvZWZmcysrOwotICAgIFZhbHVlID0gQnVmIFtpXTsKLSAgICBpZiAoVmFsdWUgPT0gMSB8fCBWYWx1ZSA9PSAtMSkKLSAgICB7Ci0gICAgICAgIHBEc3RWTENJbmZvLT51VHJhaWxpbmdfT25lcysrOwotICAgICAgICAKLSAgICAgICAgcERzdFZMQ0luZm8tPnVUcmFpbGluZ19PbmVfU2lnbnMgfD0gCi0gICAgICAgICAgICBWYWx1ZSA9PSAtMSA/IE1hc2sgOiAwOwotICAgICAgICBNYXNrID4+PSAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBWYWx1ZSAtPSAoVmFsdWUgPiAwID8gMSA6IC0xKTsKLSAgICAgICAgKnBMZXZlbCsrID0gVmFsdWU7Ci0gICAgICAgIE1hc2sgPSAwOwotICAgIH0KLQotICAgIC8qIFJlbWFpbmluZyBub24gemVybyAqLwotICAgIHdoaWxlICgtLWkgPj0gMCkKLSAgICB7Ci0gICAgICAgIFZhbHVlID0gQnVmIFtpXTsKLSAgICAgICAgaWYgKFZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBwRHN0VkxDSW5mby0+dU51bUNvZWZmcysrOwotCi0gICAgICAgICAgICAvKiBNYXNrIGJlY29tZXMgemVybyBhZnRlciBlbnRlcmluZyAqLwotICAgICAgICAgICAgaWYgKE1hc2sgJiYKLSAgICAgICAgICAgICAgICAoVmFsdWUgPT0gMSB8fCAKLSAgICAgICAgICAgICAgICAgVmFsdWUgPT0gLTEpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBEc3RWTENJbmZvLT51VHJhaWxpbmdfT25lcysrOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBEc3RWTENJbmZvLT51VHJhaWxpbmdfT25lX1NpZ25zIHw9IAotICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PSAtMSA/IE1hc2sgOiAwOwotICAgICAgICAgICAgICAgIE1hc2sgPj49IDE7Ci0gICAgICAgICAgICAgICAgKnBSdW4rKyA9IFJ1bkJlZm9yZTsKLSAgICAgICAgICAgICAgICBSdW5CZWZvcmUgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIElmIDMgdHJhaWxpbmcgb25lcyBhcmUgbm90IGNvbXBsZXRlZCAqLwotICAgICAgICAgICAgICAgIGlmIChNYXNrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTWFzayA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIFZhbHVlIC09IChWYWx1ZSA+IDAgPyAxIDogLTEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAqcExldmVsKysgPSBWYWx1ZTsKLSAgICAgICAgICAgICAgICAqcFJ1bisrID0gUnVuQmVmb3JlOwotICAgICAgICAgICAgICAgIFJ1bkJlZm9yZSA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwRHN0VkxDSW5mby0+dVRvdGFsWmVyb3MrKzsKLSAgICAgICAgICAgIFJ1bkJlZm9yZSsrOwotICAgICAgICB9ICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgLyogVXBkYXRlIGxhc3QgcnVuICovCi0gICAgaWYgKFJ1bkJlZm9yZSkKLSAgICB7Ci0gICAgICAgICpwUnVuKysgPSBSdW5CZWZvcmU7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4ODI0ZDguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSAxLzggUGl4ZWwgaW50ZXJwb2xhdGlvbiBmb3IgQ2hyb21hIEJsb2NrCi0gKiAKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEgICAoNi4zLjMuMi4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgMS84LXBpeGVsIGludGVycG9sYXRpb24gZm9yIGludGVyIGNocm9tYSBNQi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtUG9pbnRlciB0byB0aGUgc291cmNlIHJlZmVyZW5jZSBmcmFtZSBidWZmZXIgCi0gKiAgIHNyY1N0ZXAgLVJlZmVyZW5jZSBmcmFtZSBzdGVwIGluIGJ5dGVzIAotICogICBkc3RTdGVwIC1EZXN0aW5hdGlvbiBmcmFtZSBzdGVwIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgCi0gKiAgICAgICAgICAgIHJvaS53aWR0aC4gCi0gKiAgIGR4IC1GcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIGNvbXBvbmVudCBpbiAxLzggcGl4ZWwgCi0gKiAgICAgICAgICAgIHVuaXQ7IHZhbGlkIGluIHRoZSByYW5nZSBbMCw3XSAKLSAqICAgZHkgLUZyYWN0aW9uYWwgcGFydCBvZiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIGNvbXBvbmVudCBpbiAxLzggcGl4ZWwgCi0gKiAgICAgICAgICAgIHVuaXQ7IHZhbGlkIGluIHRoZSByYW5nZSBbMCw3XSAKLSAqICAgcm9pIC1EaW1lbnNpb24gb2YgdGhlIGludGVycG9sYXRpb24gcmVnaW9uOyB0aGUgcGFyYW1ldGVycyByb2kud2lkdGggYW5kIAotICogICAgICAgICAgICByb2kuaGVpZ2h0IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDIsIDQsIG9yIDguIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC1Qb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBmcmFtZSBidWZmZXIgaWYgcm9pLndpZHRoPT0yLCAgMi1ieXRlIAotICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQgaWYgcm9pLndpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKLSAqICAgICAgICAgICAgaWYgcm9pLndpZHRoPT04LCA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCi0gKiAgICBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAotICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKLSAqICAgIHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKLSAqICAgIHNyY1N0ZXAgb3IgZHN0U3RlcCA8IDguIAotICogICAgZHggb3IgZHkgaXMgb3V0IG9mIHJhbmdlIFswLTddLiAKLSAqICAgIHJvaS53aWR0aCBvciByb2kuaGVpZ2h0IGlzIG91dCBvZiByYW5nZSB7Miw0LDh9LiAKLSAqICAgIHJvaS53aWR0aCBpcyBlcXVhbCB0byAyLCBidXQgcERzdCBpcyBub3QgMi1ieXRlIGFsaWduZWQuIAotICogICAgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDQsIGJ1dCBwRHN0IGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICByb2kud2lkdGggaXMgZXF1YWwgdG8gOCwgYnV0IHBEc3QgaXMgbm90IDggYnl0ZSBhbGlnbmVkLiAKLSAqICAgIHNyY1N0ZXAgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEgKAotICAgICBjb25zdCBPTVhfVTgqIHBTcmMsCi0gICAgIE9NWF9TMzIgc3JjU3RlcCwKLSAgICAgT01YX1U4KiBwRHN0LAotICAgICBPTVhfUzMyIGRzdFN0ZXAsCi0gICAgIE9NWF9TMzIgZHgsCi0gICAgIE9NWF9TMzIgZHksCi0gICAgIE9NWFNpemUgcm9pCi0gKQotewotICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLwotICAgIGFybVJldEFyZ0VycklmKHBTcmMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihzcmNTdGVwIDwgOCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoZHN0U3RlcCA8IDgsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGR4IDwgMCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoZHggPiA3LCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihkeSA8IDAsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGR5ID4gNywgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKHJvaS53aWR0aCAhPSAyKSAmJiAocm9pLndpZHRoICE9IDQpICYmIChyb2kud2lkdGggIT0gOCksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKChyb2kuaGVpZ2h0ICE9IDIpICYmIChyb2kuaGVpZ2h0ICE9IDQpICYmIChyb2kuaGVpZ2h0ICE9IDgpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZigocm9pLndpZHRoID09IDIpICYmIGFybU5vdDJCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKHJvaS53aWR0aCA9PSA0KSAmJiBhcm1Ob3Q0Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKChyb2kud2lkdGggPT0gOCkgJiYgYXJtTm90OEJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihzcmNTdGVwICYgNywgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoZHN0U3RlcCAmIDcsIE9NWF9TdHNfQmFkQXJnRXJyKQotCi0gICAgcmV0dXJuIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hIAotICAgICAgICAoKE9NWF9VOCopcFNyYywgc3JjU3RlcCwgcERzdCwgZHN0U3RlcCwgcm9pLndpZHRoLCByb2kuaGVpZ2h0LCBkeCwgZHkpOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2YzgyMDguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSBIYWxmIGhvcml6b250YWwgbHVtYSBpbnRlcnBvbGF0aW9uCi0gKiAKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hICAgKDYuMy41LjUuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgdHdvIGhvcml6b250YWwgMS8yLXBlbCBwb3NpdGlvbnMgCi0gKiAoLTEvMiwwKSBhbmQgKDEvMiwgMCkgLSBhcm91bmQgYSBmdWxsLXBlbCBwb3NpdGlvbi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgYmxvY2sgdXNlZCB0byBpbnRlcnBvbGF0ZSBpbiAKLSAqICAgICAgICAgICAgdGhlIHJlY29uc3RydWN0aW9uIGZyYW1lIHBsYW5lLiAKLSAqICAgaVNyY1N0ZXAgLSBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLiAKLSAqICAgaURzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXI7IG11c3QgYmUgYSAKLSAqICAgICAgICAgICAgbXVsdGlwbGUgb2YgaVdpZHRoLiAKLSAqICAgaVdpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2IAotICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIDQsIDgsIG9yIDE2IAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0TGVmdCAtUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIGxlZnQgLXBlbCBwb3NpdGlvbiAKLSAqICAgICAgICAgICAgKC0xLzIsIDApIAotICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgcERzdFJpZ2h0IC1Qb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgcmlnaHQgLXBlbCAKLSAqICAgICAgICAgICAgcG9zaXRpb24gKDEvMiwgMCkgCi0gKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgICAgICBwU3JjLCBwRHN0TGVmdCwgb3IgcERzdFJpZ2h0IAotICogICAgLSAgICBpV2lkdGggb3IgaUhlaWdodCBoYXZlIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2IAotICogICAgLSAgICBpV2lkdGg9PTQgYnV0IHBEc3RMZWZ0IGFuZC9vciBwRHN0UmlnaHQgaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAotICogICAgLSAgICBpV2lkdGg9PTggYnV0IHBEc3RMZWZ0IGFuZC9vciBwRHN0UmlnaHQgaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5IAotICogICAgLSAgICBpV2lkdGg9PTE2IGJ1dCBwRHN0TGVmdCBhbmQvb3IgcERzdFJpZ2h0IGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkgCi0gKiAgICAtICAgIGFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEoCi0gICAgICAgIGNvbnN0IE9NWF9VOCogICAgIHBTcmMsIAotICAgICAgICBPTVhfVTMyICAgICBpU3JjU3RlcCwgCi0gICAgICAgIE9NWF9VOCogICAgIHBEc3RMZWZ0LCAKLSAgICAgICAgT01YX1U4KiAgICAgcERzdFJpZ2h0LCAKLSAgICAgICAgT01YX1UzMiAgICAgaURzdFN0ZXAsIAotICAgICAgICBPTVhfVTMyICAgICBpV2lkdGgsIAotICAgICAgICBPTVhfVTMyICAgICBpSGVpZ2h0Ci0pCi17Ci0gICAgT01YUmVzdWx0ICAgUmV0VmFsdWU7ICAgIAotCi0gICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0TGVmdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0UmlnaHQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKGlXaWR0aCA9PSA0KSAmJiAKLSAgICAgICAgICAgICAgICAgICBhcm1Ob3Q0Qnl0ZUFsaWduZWQocERzdExlZnQpICYmCi0gICAgICAgICAgICAgICAgICAgYXJtTm90NEJ5dGVBbGlnbmVkKHBEc3RSaWdodCksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKChpV2lkdGggPT0gOCkgJiYgCi0gICAgICAgICAgICAgICAgICAgYXJtTm90OEJ5dGVBbGlnbmVkKHBEc3RMZWZ0KSAmJgotICAgICAgICAgICAgICAgICAgIGFybU5vdDhCeXRlQWxpZ25lZChwRHN0UmlnaHQpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZigoaVdpZHRoID09IDE2KSAmJiAKLSAgICAgICAgICAgICAgICAgICBhcm1Ob3QxNkJ5dGVBbGlnbmVkKHBEc3RMZWZ0KSAmJgotICAgICAgICAgICAgICAgICAgIGFybU5vdDE2Qnl0ZUFsaWduZWQocERzdFJpZ2h0KSwgT01YX1N0c19CYWRBcmdFcnIpCi0KLSAgICBhcm1SZXRBcmdFcnJJZigoaUhlaWdodCAhPSAxNikgJiYgKGlIZWlnaHQgIT0gOCkmJiAoaUhlaWdodCAhPSA0KSwgT01YX1N0c19CYWRBcmdFcnIpCi0JYXJtUmV0QXJnRXJySWYoKGlXaWR0aCAhPSAxNikgJiYgKGlXaWR0aCAhPSA4KSYmIChpV2lkdGggIT0gNCksIE9NWF9TdHNfQmFkQXJnRXJyKQotCi0gICAgUmV0VmFsdWUgPSBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hICgKLSAgICAgICAgcFNyYyAtIDEsICAgICAKLSAgICAgICAgaVNyY1N0ZXAsIAotICAgICAgICBwRHN0TGVmdCwgICAgIAotICAgICAgICBpRHN0U3RlcCwgCi0gICAgICAgIGlXaWR0aCwgICAKLSAgICAgICAgaUhlaWdodCk7Ci0KLSAgICBpZiAoUmV0VmFsdWUgIT0gT01YX1N0c19Ob0VycikKLSAgICB7Ci0gICAgICAgIHJldHVybiBSZXRWYWx1ZTsKLSAgICB9Ci0KLSAgICBSZXRWYWx1ZSA9IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEgKAotICAgICAgICBwU3JjLCAgICAgCi0gICAgICAgIGlTcmNTdGVwLCAKLSAgICAgICAgcERzdFJpZ2h0LCAgICAgCi0gICAgICAgIGlEc3RTdGVwLCAKLSAgICAgICAgaVdpZHRoLCAgIAotICAgICAgICBpSGVpZ2h0KTsKLQotICAgIHJldHVybiBSZXRWYWx1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZjMTg2Yi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIFNBRCBmb3IgNHg0IGJsb2NrcwotICogCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hICAgKDYuMy41LjUuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgdHdvIHZlcnRpY2FsIDEvMi1wZWwgcG9zaXRpb25zIC0gCi0gKiAoMCwgLTEvMikgYW5kICgwLCAxLzIpIC0gYXJvdW5kIGEgZnVsbC1wZWwgcG9zaXRpb24uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIGludGVycG9sYXRlIGluIHRoZSAKLSAqICAgICAgICAgICAgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZSAKLSAqICAgaVNyY1N0ZXAgLSBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLiAKLSAqICAgaURzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiAoaW50ZXJwb2xhdGlvbikgYnVmZmVyOyBtdXN0IGJlIGEgCi0gKiAgICAgICAgICAgIG11bHRpcGxlIG9mIGlXaWR0aC4gCi0gKiAgIGlXaWR0aCAtIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNiAKLSAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jazsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RVcCAtUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIC1wZWwgcG9zaXRpb24gYWJvdmUgCi0gKiAgICAgICAgICAgIHRoZSBjdXJyZW50IGZ1bGwtcGVsIHBvc2l0aW9uICgwLCAtMS8yKSAKLSAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09NCwgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTgsIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBwRHN0RG93biAtUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIC1wZWwgcG9zaXRpb24gYmVsb3cgCi0gKiAgICAgICAgICAgIHRoZSBjdXJyZW50IGZ1bGwtcGVsIHBvc2l0aW9uICgwLCAxLzIpIAotICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT00LCA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09OCwgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgICAgcFNyYywgcERzdFVwLCBvciBwRHN0RG93biAKLSAqICAgIC0gICAgaVdpZHRoIG9yIGlIZWlnaHQgaGF2ZSB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNiAKLSAqICAgIC0gICAgaVdpZHRoPT00IGJ1dCBwRHN0VXAgYW5kL29yIHBEc3REb3duIGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKLSAqICAgIC0gICAgaVdpZHRoPT04IGJ1dCBwRHN0VXAgYW5kL29yIHBEc3REb3duIGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDgtYnl0ZSBib3VuZGFyeSAKLSAqICAgIC0gICAgaVdpZHRoPT0xNiBidXQgcERzdFVwIGFuZC9vciBwRHN0RG93biBpcy9hcmUgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5IAotICoKLSAqLwotIE9NWFJlc3VsdCBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hKCAgCi0gICAgIGNvbnN0IE9NWF9VOCogICAgcFNyYywgCi0gICAgIE9NWF9VMzIgICAgaVNyY1N0ZXAsIAotICAgICBPTVhfVTgqICAgIHBEc3RVcCwgCi0gICAgIE9NWF9VOCogICAgcERzdERvd24sIAotICAgICBPTVhfVTMyICAgIGlEc3RTdGVwLCAKLSAgICAgT01YX1UzMiAgICBpV2lkdGgsIAotICAgICBPTVhfVTMyICAgIGlIZWlnaHQKLSkKLXsKLSAgICBPTVhSZXN1bHQgICBSZXRWYWx1ZTsKLQotICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLwotICAgIGFybVJldEFyZ0VycklmKHBTcmMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocERzdFVwID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBEc3REb3duID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKChpV2lkdGggPT0gNCkgJiYgCi0gICAgICAgICAgICAgICAgICAgYXJtTm90NEJ5dGVBbGlnbmVkKHBEc3RVcCkgJiYKLSAgICAgICAgICAgICAgICAgICBhcm1Ob3Q0Qnl0ZUFsaWduZWQocERzdERvd24pLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZigoaVdpZHRoID09IDgpICYmIAotICAgICAgICAgICAgICAgICAgIGFybU5vdDhCeXRlQWxpZ25lZChwRHN0VXApICYmCi0gICAgICAgICAgICAgICAgICAgYXJtTm90OEJ5dGVBbGlnbmVkKHBEc3REb3duKSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKGlXaWR0aCA9PSAxNikgJiYgCi0gICAgICAgICAgICAgICAgICAgYXJtTm90MTZCeXRlQWxpZ25lZChwRHN0VXApICYmCi0gICAgICAgICAgICAgICAgICAgYXJtTm90MTZCeXRlQWxpZ25lZChwRHN0RG93biksIE9NWF9TdHNfQmFkQXJnRXJyKQotCi0gICAgYXJtUmV0QXJnRXJySWYoKGlIZWlnaHQgIT0gMTYpICYmIChpSGVpZ2h0ICE9IDgpJiYgKGlIZWlnaHQgIT0gNCksIE9NWF9TdHNfQmFkQXJnRXJyKQotCWFybVJldEFyZ0VycklmKChpV2lkdGggIT0gMTYpICYmIChpV2lkdGggIT0gOCkmJiAoaVdpZHRoICE9IDQpLCBPTVhfU3RzX0JhZEFyZ0VycikKLQotICAgIFJldFZhbHVlID0gYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYSggIAotICAgICAgICBwU3JjIC0gaVNyY1N0ZXAsIAotICAgICAgICBpU3JjU3RlcCwgCi0gICAgICAgIHBEc3RVcCwKLSAgICAgICAgaURzdFN0ZXAsIAotICAgICAgICBpV2lkdGgsIAotICAgICAgICBpSGVpZ2h0KTsKLSAgICAKLSAgICBpZiAoUmV0VmFsdWUgIT0gT01YX1N0c19Ob0VycikKLSAgICB7Ci0gICAgICAgIHJldHVybiBSZXRWYWx1ZTsKLSAgICB9Ci0KLSAgICBSZXRWYWx1ZSA9IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEoICAKLSAgICAgICAgcFNyYywgCi0gICAgICAgIGlTcmNTdGVwLCAKLSAgICAgICAgcERzdERvd24sCi0gICAgICAgIGlEc3RTdGVwLCAKLSAgICAgICAgaVdpZHRoLCAKLSAgICAgICAgaUhlaWdodCk7Ci0gICAgCi0gICAgcmV0dXJuIFJldFZhbHVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyYTgxNjMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEuYworKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIFBlcmZvcm1zIHF1YXJ0ZXItcGl4ZWwgaW50ZXJwb2xhdGlvbiAKLSAqIAotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hICAgKDYuMy4zLjIuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIHF1YXJ0ZXItcGl4ZWwgaW50ZXJwb2xhdGlvbiBmb3IgaW50ZXIgbHVtYSBNQi4gSXQgaXMgYXNzdW1lZCB0aGF0IAotICogdGhlIGZyYW1lIGlzIGFscmVhZHkgcGFkZGVkIHdoZW4gY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC1Qb2ludGVyIHRvIHRoZSBzb3VyY2UgcmVmZXJlbmNlIGZyYW1lIGJ1ZmZlciAKLSAqICAgc3JjU3RlcCAtcmVmZXJlbmNlIGZyYW1lIHN0ZXAsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2Ygcm9pLndpZHRoIAotICogICBkc3RTdGVwIC1kZXN0aW5hdGlvbiBmcmFtZSBzdGVwLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIAotICogICAgICAgICAgICByb2kud2lkdGggCi0gKiAgIGR4IC1GcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIGNvbXBvbmVudCBpbiAxLzQgcGl4ZWwgCi0gKiAgICAgICAgICAgIHVuaXQ7IHZhbGlkIGluIHRoZSByYW5nZSBbMCwzXSAKLSAqICAgZHkgLUZyYWN0aW9uYWwgcGFydCBvZiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIHkgY29tcG9uZW50IGluIDEvNCBwaXhlbCAKLSAqICAgICAgICAgICAgdW5pdDsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDNdIAotICogICByb2kgLURpbWVuc2lvbiBvZiB0aGUgaW50ZXJwb2xhdGlvbiByZWdpb247IHRoZSBwYXJhbWV0ZXJzIHJvaS53aWR0aCBhbmQgCi0gKiAgICAgICAgICAgIHJvaS5oZWlnaHQgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC1Qb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBmcmFtZSBidWZmZXIgaWYgcm9pLndpZHRoPT00LCAgNC1ieXRlIAotICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQgaWYgcm9pLndpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKLSAqICAgICAgICAgICAgaWYgcm9pLndpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKLSAqICAgIElmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCi0gKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAotICogICAgcFNyYyBvciBwRHN0IGlzIE5VTEwuIAotICogICAgc3JjU3RlcCBvciBkc3RTdGVwIDwgcm9pLndpZHRoLiAKLSAqICAgIGR4IG9yIGR5IGlzIG91dCBvZiByYW5nZSBbMCwzXS4gCi0gKiAgICByb2kud2lkdGggb3Igcm9pLmhlaWdodCBpcyBvdXQgb2YgcmFuZ2UgezQsIDgsIDE2fS4gCi0gKiAgICByb2kud2lkdGggaXMgZXF1YWwgdG8gNCwgYnV0IHBEc3QgaXMgbm90IDQgYnl0ZSBhbGlnbmVkLiAKLSAqICAgIHJvaS53aWR0aCBpcyBlcXVhbCB0byA4IG9yIDE2LCBidXQgcERzdCBpcyBub3QgOCBieXRlIGFsaWduZWQuIAotICogICAgc3JjU3RlcCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEgKAotICAgICBjb25zdCBPTVhfVTgqIHBTcmMsCi0gICAgIE9NWF9TMzIgc3JjU3RlcCwKLSAgICAgT01YX1U4KiBwRHN0LAotICAgICBPTVhfUzMyIGRzdFN0ZXAsCi0gICAgIE9NWF9TMzIgZHgsCi0gICAgIE9NWF9TMzIgZHksCi0gICAgIE9NWFNpemUgcm9pICAgICAgICAKLSApCi17Ci0gICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHNyY1N0ZXAgPCByb2kud2lkdGgsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGRzdFN0ZXAgPCByb2kud2lkdGgsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGR4IDwgMCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoZHggPiAzLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihkeSA8IDAsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGR5ID4gMywgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKHJvaS53aWR0aCAhPSA0KSAmJiAocm9pLndpZHRoICE9IDgpICYmIChyb2kud2lkdGggIT0gMTYpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZigocm9pLmhlaWdodCAhPSA0KSAmJiAocm9pLmhlaWdodCAhPSA4KSAmJiAocm9pLmhlaWdodCAhPSAxNiksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKChyb2kud2lkdGggPT0gNCkgJiYgYXJtTm90NEJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZigocm9pLndpZHRoID09IDgpICYmIGFybU5vdDhCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKHJvaS53aWR0aCA9PSAxNikgJiYgYXJtTm90MTZCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoc3JjU3RlcCAmIDcsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGRzdFN0ZXAgJiA3LCBPTVhfU3RzX0JhZEFyZ0VycikgCi0KLSAgICByZXR1cm4gYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9MdW1hIAotICAgICAgICAocFNyYywgc3JjU3RlcCwgcERzdCwgZHN0U3RlcCwgcm9pLndpZHRoLCByb2kuaGVpZ2h0LCBkeCwgZHkpOwotCi19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9DaHJvbWFEQy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0Nocm9tYURDLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2OWU3NjguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0Nocm9tYURDLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9DaHJvbWFEQy5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgNHg0IGhhZGFtYXJkIHRyYW5zZm9ybSBvZiBjaHJvbWEgREMgIAotICogY29lZmZpY2llbnRzIGFuZCBxdWFudGl6YXRpb24KLSAqIAotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9DaHJvbWFEQyAgICg2LjMuNS42LjQpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludmVyc2UgMngyIEhhZGFtYXJkIHRyYW5zZm9ybSBhbmQgdGhlbiBkZXF1YW50aXplcyAKLSAqIHRoZSBjb2VmZmljaWVudHMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSAyeDIgYXJyYXkgb2YgdGhlIDJ4MiBIYWRhbWFyZC10cmFuc2Zvcm1lZCBhbmQgCi0gKiAgICAgICAgICAgIHF1YW50aXplZCBjb2VmZmljaWVudHMuICA4IGJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIFBvaW50ZXIgdG8gaW52ZXJzZS10cmFuc2Zvcm1lZCBhbmQgZGVxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgCi0gKiAgICAgICAgICAgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYyAKLSAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfQ2hyb21hREMoCi0JY29uc3QgT01YX1MxNiogCXBTcmMsCi0JT01YX1MxNioJcERzdCwKLQlPTVhfVTMyCQlpUVAKLSkKLXsKLSAgICBPTVhfSU5UICAgICBpLCBqOwotICAgIE9NWF9TMzIgICAgIG1bMl1bMl07Ci0gICAgT01YX1MzMiAgICAgUVBlciwgVjAwLCBWYWx1ZTsKLQotICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLwotICAgIGFybVJldEFyZ0VycklmKHBTcmMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90OEJ5dGVBbGlnbmVkKHBTcmMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q4Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihpUVAgPiA1MSwgT01YX1N0c19CYWRBcmdFcnIpCi0KLSAgICAvKiBJbnYgSGFkYW1hcmQgVHJhbnNmb3JtIGZvciAyeDIgYmxvY2sgKi8KLSAgICBtWzBdWzBdID0gcFNyY1swXSArIHBTcmNbMV0gKyAgcFNyY1syXSArIHBTcmNbM107Ci0gICAgbVswXVsxXSA9IHBTcmNbMF0gLSBwU3JjWzFdICsgIHBTcmNbMl0gLSBwU3JjWzNdOwotICAgIG1bMV1bMF0gPSBwU3JjWzBdICsgcFNyY1sxXSAtICBwU3JjWzJdIC0gcFNyY1szXTsKLSAgICBtWzFdWzFdID0gcFNyY1swXSAtIHBTcmNbMV0gLSAgcFNyY1syXSArIHBTcmNbM107Ci0KLSAgICAvKiBRdWFudGl6YXRpb24gKi8KLSAgICAvKiBTY2FsaW5nICovCi0gICAgUVBlciA9IGlRUCAvIDY7Ci0gICAgVjAwID0gYXJtVkNNNFAxMF9WTWF0cml4IFtpUVAgJSA2XVswXTsKLQotICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspCi0gICAgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoUVBlciA8IDEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVmFsdWUgPSAobVtqXVtpXSAqIFYwMCkgPj4gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBWYWx1ZSA9IChtW2pdW2ldICogVjAwKSA8PCAoUVBlciAtIDEpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwRHN0W2ogKiAyICsgaV0gPSAoT01YX1MxNikgVmFsdWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9MdW1hREMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9MdW1hREMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVmMTVjZi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfTHVtYURDLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9MdW1hREMuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIDR4NCBoYWRhbWFyZCB0cmFuc2Zvcm0gb2YgbHVtYSBEQyBjb2VmZmljaWVudHMgCi0gKiBhbmQgcXVhbnRpemF0aW9uCi0gKiAKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfTHVtYURDICAgKDYuMy41LjYuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW52ZXJzZSA0eDQgSGFkYW1hcmQgdHJhbnNmb3JtIGFuZCB0aGVuIGRlcXVhbnRpemVzIAotICogdGhlIGNvZWZmaWNpZW50cy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIDR4NCBhcnJheSBvZiB0aGUgNHg0IEhhZGFtYXJkLXRyYW5zZm9ybWVkIGFuZCAKLSAqICAgICAgICAgICAgcXVhbnRpemVkIGNvZWZmaWNpZW50cy4gIDE2IGJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIFBvaW50ZXIgdG8gaW52ZXJzZS10cmFuc2Zvcm1lZCBhbmQgZGVxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgCi0gKiAgICAgICAgICAgIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMgCi0gKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0x1bWFEQygJCi0JY29uc3QgT01YX1MxNiogCXBTcmMsCi0JT01YX1MxNioJcERzdCwKLQlPTVhfVTMyCQlpUVAKLSkKLXsKLSAgICBPTVhfSU5UICAgICBpLCBqOwotICAgIE9NWF9TMzIgICAgIG0xWzRdWzRdLCBtMls0XVs0XSwgVmFsdWU7Ci0gICAgT01YX1MzMiAgICAgUVBlciwgVjsKLQotICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLwotICAgIGFybVJldEFyZ0VycklmKHBTcmMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihpUVAgPiA1MSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90MTZCeXRlQWxpZ25lZChwU3JjKSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90MTZCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpCi0KLSAgICAvKiBJbnYgSGFkYW1hcmQgVHJhbnNmb3JtIGZvciBEQyBMdW1hIDR4NCBibG9jayAqLwotICAgIC8qIEhvcml6b250YWwgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgIHsKLSAgICAgICAgaiA9IGkgKiA0OwotICAgICAgICAKLSAgICAgICAgbTFbaV1bMF0gPSBwU3JjW2ogKyAwXSArIHBTcmNbaiArIDJdOyAvKiBhK2MgKi8KLSAgICAgICAgbTFbaV1bMV0gPSBwU3JjW2ogKyAxXSArIHBTcmNbaiArIDNdOyAvKiBiK2QgKi8KLSAgICAgICAgbTFbaV1bMl0gPSBwU3JjW2ogKyAwXSAtIHBTcmNbaiArIDJdOyAvKiBhLWMgKi8KLSAgICAgICAgbTFbaV1bM10gPSBwU3JjW2ogKyAxXSAtIHBTcmNbaiArIDNdOyAvKiBiLWQgKi8KLQotICAgICAgICBtMltpXVswXSA9IG0xW2ldWzBdICsgbTFbaV1bMV07IC8qIGErYitjK2QgKi8KLSAgICAgICAgbTJbaV1bMV0gPSBtMVtpXVsyXSArIG0xW2ldWzNdOyAvKiBhK2ItYy1kICovCi0gICAgICAgIG0yW2ldWzJdID0gbTFbaV1bMl0gLSBtMVtpXVszXTsgLyogYS1iLWMrZCAqLwotICAgICAgICBtMltpXVszXSA9IG0xW2ldWzBdIC0gbTFbaV1bMV07IC8qIGEtYitjLWQgKi8KLQotICAgIH0KLQotICAgIC8qIFZlcnRpY2FsICovCi0gICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICB7Ci0gICAgICAgIG0xWzBdW2ldID0gbTJbMF1baV0gKyBtMlsyXVtpXTsKLSAgICAgICAgbTFbMV1baV0gPSBtMlsxXVtpXSArIG0yWzNdW2ldOwotICAgICAgICBtMVsyXVtpXSA9IG0yWzBdW2ldIC0gbTJbMl1baV07Ci0gICAgICAgIG0xWzNdW2ldID0gbTJbMV1baV0gLSBtMlszXVtpXTsKLQotICAgICAgICBtMlswXVtpXSA9IG0xWzBdW2ldICsgbTFbMV1baV07Ci0gICAgICAgIG0yWzFdW2ldID0gbTFbMl1baV0gKyBtMVszXVtpXTsKLSAgICAgICAgbTJbMl1baV0gPSBtMVsyXVtpXSAtIG0xWzNdW2ldOwotICAgICAgICBtMlszXVtpXSA9IG0xWzBdW2ldIC0gbTFbMV1baV07Ci0gICAgfQotCi0gICAgCi0gICAgLyogU2NhbGluZyAqLwotICAgIFFQZXIgPSBpUVAgLyA2OwotICAgIFYgPSBhcm1WQ000UDEwX1ZNYXRyaXggW2lRUCAlIDZdWzBdOwotCi0gICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykKLSAgICB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChRUGVyIDwgMikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBWYWx1ZSA9IChtMltqXVtpXSAqIFYgKyAoMSA8PCAoMSAtIFFQZXIpKSkgPj4gKDIgLSBRUGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBWYWx1ZSA9IG0yW2pdW2ldICogViAqICgxIDw8IChRUGVyIC0gMikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBwRHN0W2ogKiA0ICsgaV0gPSAoT01YX1MxNikgVmFsdWU7Ci0gICAgICAgICAgICAKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW52VHJhbnNmb3JtUmVzaWR1YWxBbmRBZGQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW52VHJhbnNmb3JtUmVzaWR1YWxBbmRBZGQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNlNDUxOS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludlRyYW5zZm9ybVJlc2lkdWFsQW5kQWRkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtUmVzaWR1YWxBbmRBZGQuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgaW52ZXJzZSBpbnRlZ2VyIDR4NCB0cmFuc2Zvcm0KLSAqIAotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtUmVzaWR1YWxBbmRBZGQgICAoNi4zLjUuNy4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnZlcnNlIGFuIDR4NCBpbnRlZ2VyIHRyYW5zZm9ybWF0aW9uIHRvIHByb2R1Y2UgCi0gKiB0aGUgZGlmZmVyZW5jZSBzaWduYWwgYW5kIHRoZW4gYWRkcyB0aGUgZGlmZmVyZW5jZSB0byB0aGUgcHJlZGljdGlvbiB0byBnZXQgCi0gKiB0aGUgcmVjb25zdHJ1Y3RlZCBzaWduYWwuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNQcmVkIC0gUG9pbnRlciB0byBwcmVkaWN0aW9uIHNpZ25hbC4gIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBwRGVxdWFudENvZWZmIC0gUG9pbnRlciB0byB0aGUgdHJhbnNmb3JtZWQgY29lZmZpY2llbnRzLiAgOC1ieXRlIAotICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBpU3JjUHJlZFN0ZXAgLSBTdGVwIG9mIHRoZSBwcmVkaWN0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAotICogICBpRHN0UmVjb25TdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gcmVjb25zdHJ1Y3Rpb24gYnVmZmVyOyBtdXN0IGJlIGEgCi0gKiAgICAgICAgICAgIG11bHRpcGxlIG9mIDQuIAotICogICBiQUMgLSBJbmRpY2F0ZSB3aGV0aGVyIHRoZXJlIGlzIEFDIGNvZWZmaWNpZW50cyBpbiB0aGUgY29lZmZpY2llbnRzIAotICogICAgICAgICAgICBtYXRyaXguIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0UmVjb24gLVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIHJlY29uc3RydWN0aW9uIGJ1ZmZlci4gIDQtYnl0ZSAKLSAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICAgICBwU3JjUHJlZCwgcERlcXVhbnRDb2VmZiwgcERzdFJlY29uIAotICogICAgLSAgICBwU3JjUHJlZCBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKLSAqICAgIC0gICAgaVNyY1ByZWRTdGVwIG9yIGlEc3RSZWNvblN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgICAtICAgIHBEZXF1YW50Q29lZmYgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfSW52VHJhbnNmb3JtUmVzaWR1YWxBbmRBZGQoCi0JY29uc3QgT01YX1U4KiAJcFNyY1ByZWQsIAotCWNvbnN0IE9NWF9TMTYqIAlwRGVxdWFudENvZWZmLCAKLQlPTVhfVTgqIAlwRHN0UmVjb24sCi0JT01YX1UzMiAJaVNyY1ByZWRTdGVwLCAKLQlPTVhfVTMyCQlpRHN0UmVjb25TdGVwLCAKLQlPTVhfVTgJCWJBQwotKQotewotICAgIE9NWF9JTlQgICAgIGksIGo7Ci0gICAgT01YX1MxNiAgICAgSW5bMTZdLCBPdXRbMTZdOwotICAgIE9NWF9TMzIgICAgIFZhbHVlOwotCi0gICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY1ByZWQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBTcmNQcmVkKSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocERlcXVhbnRDb2VmZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q4Qnl0ZUFsaWduZWQocERlcXVhbnRDb2VmZiksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBEc3RSZWNvbiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocERzdFJlY29uKSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoYkFDID4gMSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoaVNyY1ByZWRTdGVwID09IDAgfHwgaVNyY1ByZWRTdGVwICYgMywgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoaURzdFJlY29uU3RlcCA9PSAwIHx8IGlEc3RSZWNvblN0ZXAgJiAzLCBPTVhfU3RzX0JhZEFyZ0VycikKLQotICAgIGlmIChiQUMpCi0gICAgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgSW5baV0gPSBwRGVxdWFudENvZWZmIFtpXTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBDb3B5IERDICovCi0gICAgICAgIEluWzBdID0gcERlcXVhbnRDb2VmZiBbMF07Ci0gICAgCi0gICAgICAgIGZvciAoaSA9IDE7IGkgPCAxNjsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBJbltpXSA9IDA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBSZXNpZHVhbCBUcmFuc2Zvcm0gKi8KLSAgICBhcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0IChPdXQsIEluKTsgICAgCi0gICAgCi0gICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykKLSAgICB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIEFkZCBwcmVkaXRpb24gKi8KLSAgICAgICAgICAgIFZhbHVlID0gKE9NWF9TMzIpIE91dCBbaiAqIDQgKyBpXSArIHBTcmNQcmVkIFtqICogaVNyY1ByZWRTdGVwICsgaV07Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qIFNhdHVyYXRlIFZhbHVlIHRvIE9NWF9VOCAqLwotICAgICAgICAgICAgVmFsdWUgPSBhcm1DbGlwICgwLCAyNTUsIFZhbHVlKTsKLQotICAgICAgICAgICAgcERzdFJlY29uW2ogKiBpRHN0UmVjb25TdGVwICsgaV0gPSAoT01YX1U4KSBWYWx1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9NRUdldEJ1ZlNpemUuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfTUVHZXRCdWZTaXplLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMjQ1ZTEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9NRUdldEJ1ZlNpemUuYworKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX01FR2V0QnVmU2l6ZS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBJbml0aWFsaXphdGlvbiBtb2R1bGVzIGZvciB0aGUgdmVuZG9yIHNwZWNpZmljIE1vdGlvbiBFc3RpbWF0aW9uIHN0cnVjdHVyZS4KLSAqIAotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfTUVHZXRCdWZTaXplICAgKDYuMy41LjEuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbXB1dGVzIHRoZSBzaXplLCBpbiBieXRlcywgb2YgdGhlIHZlbmRvci1zcGVjaWZpYyBzcGVjaWZpY2F0aW9uIAotICogc3RydWN0dXJlIGZvciB0aGUgb214VkNNNFAxMCBtb3Rpb24gZXN0aW1hdGlvbiBmdW5jdGlvbnMgQmxvY2tNYXRjaF9JbnRlZ2VyIAotICogYW5kIE1vdGlvbkVzdGltYXRpb25NQi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgTUVtb2RlIC0gbW90aW9uIGVzdGltYXRpb24gbW9kZTsgYXZhaWxhYmxlIG1vZGVzIGFyZSBkZWZpbmVkIGJ5IHRoZSAKLSAqICAgICAgICAgICAgZW51bWVyYXRlZCB0eXBlIE9NWFZDTTRQMTBNRU1vZGUgCi0gKiAgIHBNRVBhcmFtcyAtbW90aW9uIGVzdGltYXRpb24gcGFyYW1ldGVycyAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNpemUgLSBwb2ludGVyIHRvIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZSBtb3Rpb24gCi0gKiAgICAgICAgICAgIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgcE1FUGFyYW1zIG9yIHBTaXplIGlzIE5VTEwuIAotICogICAgLSAgICBhbiBpbnZhbGlkIE1FTW9kZSBpcyBzcGVjaWZpZWQuIAotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNNNFAxMF9NRUdldEJ1ZlNpemUoCi0gICAgT01YVkNNNFAxME1FTW9kZSBNRU1vZGUsCi0gICAgY29uc3QgT01YVkNNNFAxME1FUGFyYW1zICpwTUVQYXJhbXMsCi0gICAgT01YX1UzMiAqcFNpemUKLSAgICApCi17Ci0gICAgYXJtUmV0QXJnRXJySWYoIXBNRVBhcmFtcywgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCFwU2l6ZSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChNRU1vZGUgIT0gT01YX1ZDX000UDEwX0ZBU1RfU0VBUkNIKSAmJiAKLSAgICAgICAgICAgICAgICAgICAoTUVNb2RlICE9IE9NWF9WQ19NNFAxMF9GVUxMX1NFQVJDSCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigocE1FUGFyYW1zLT5zZWFyY2hSYW5nZTE2eDE2IDw9IDApIHx8IAotICAgICAgICAgICAgICAgICAgIChwTUVQYXJhbXMtPnNlYXJjaFJhbmdlOHg4IDw9IDApIHx8IAotICAgICAgICAgICAgICAgICAgIChwTUVQYXJhbXMtPnNlYXJjaFJhbmdlNHg0IDw9IDApLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgICAgICAgICAgICAgICAgCi0gICAgKnBTaXplID0gKE9NWF9JTlQpIHNpemVvZihBUk1WQ000UDEwX01FU3BlYyk7Ci0gICAgCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX01FSW5pdC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9NRUluaXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ2MzM1My4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX01FSW5pdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX01FSW5pdC5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBJbml0aWFsaXphdGlvbiBtb2R1bGVzIGZvciB0aGUgdmVuZG9yIHNwZWNpZmljIE1vdGlvbiBFc3RpbWF0aW9uIHN0cnVjdHVyZS4KLSAqIAotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX01FSW5pdCAgICg2LjMuNS4xLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBJbml0aWFsaXplcyB0aGUgdmVuZG9yLXNwZWNpZmljIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIHJlcXVpcmVkIGZvciB0aGUgCi0gKiBvbXhWQ000UDEwIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9uczogIEJsb2NrTWF0Y2hfSW50ZWdlciBhbmQgCi0gKiBNb3Rpb25Fc3RpbWF0aW9uTUIuIE1lbW9yeSBmb3IgdGhlIHNwZWNpZmljYXRpb24gc3RydWN0dXJlICpwTUVTcGVjIG11c3QgYmUgCi0gKiBhbGxvY2F0ZWQgcHJpb3IgdG8gY2FsbGluZyB0aGUgZnVuY3Rpb24sIGFuZCBzaG91bGQgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKLSAqIGJvdW5kYXJ5LiAgVGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCBmb3IgdGhlIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIGNhbiAKLSAqIGJlIGRldGVybWluZWQgdXNpbmcgdGhlIGZ1bmN0aW9uIG9teFZDTTRQMTBfTUVHZXRCdWZTaXplLiBGb2xsb3dpbmcgCi0gKiBpbml0aWFsaXphdGlvbiBieSB0aGlzIGZ1bmN0aW9uLCB0aGUgdmVuZG9yLXNwZWNpZmljIHN0cnVjdHVyZSAqcE1FU3BlYyAKLSAqIHNob3VsZCBjb250YWluIGFuIGltcGxlbWVudGF0aW9uLXNwZWNpZmljIHJlcHJlc2VudGF0aW9uIG9mIGFsbCBtb3Rpb24gCi0gKiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgcmVjZWl2ZWQgdmlhIHRoZSBzdHJ1Y3R1cmUgcE1FUGFyYW1zLCBmb3IgZXhhbXBsZSAgCi0gKiBzZWFyY2hSYW5nZTE2eDE2LCBzZWFyY2hSYW5nZTh4OCwgZXRjLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBNRW1vZGUgLSBtb3Rpb24gZXN0aW1hdGlvbiBtb2RlOyBhdmFpbGFibGUgbW9kZXMgYXJlIGRlZmluZWQgYnkgdGhlIAotICogICAgICAgICAgICBlbnVtZXJhdGVkIHR5cGUgT01YVkNNNFAxME1FTW9kZSAKLSAqICAgcE1FUGFyYW1zIC0gbW90aW9uIGVzdGltYXRpb24gcGFyYW1ldGVycyAKLSAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIHVuaW5pdGlhbGl6ZWQgTUUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSBpbml0aWFsaXplZCBNRSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBwTUVQYXJhbXMgb3IgcFNpemUgaXMgTlVMTC4gCi0gKiAgICAtICAgIGFuIGludmFsaWQgdmFsdWUgd2FzIHNwZWNpZmllZCBmb3IgdGhlIHBhcmFtZXRlciBNRW1vZGUgCi0gKiAgICAtICAgIGEgbmVnYXRpdmUgb3IgemVybyB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciBvbmUgb2YgdGhlIHNlYXJjaCByYW5nZXMgCi0gKiAgICAgICAgIChlLmcuLCAgcE1CUGFyYW1zID5zZWFyY2hSYW5nZTh4OCwgcE1FUGFyYW1zLT5zZWFyY2hSYW5nZTE2eDE2LCBldGMuKSAKLSAqICAgIC0gICAgZWl0aGVyIGluIGlzb2xhdGlvbiBvciBpbiBjb21iaW5hdGlvbiwgb25lIG9yIG1vcmUgb2YgdGhlIGVuYWJsZXMgb3IgCi0gKiAgICAgICAgIHNlYXJjaCByYW5nZXMgaW4gdGhlIHN0cnVjdHVyZSAqcE1FUGFyYW1zIHdlcmUgY29uZmlndXJlZCBzdWNoIAotICogICAgICAgICB0aGF0IHRoZSByZXF1ZXN0ZWQgYmVoYXZpb3IgZmFpbHMgdG8gY29tcGx5IHdpdGggW0lTTzE0NDk2LTEwXS4gCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDEwX01FSW5pdCgKLSAgICAgICAgT01YVkNNNFAxME1FTW9kZSBNRU1vZGUsCi0gICAgICAgIGNvbnN0IE9NWFZDTTRQMTBNRVBhcmFtcyAqcE1FUGFyYW1zLAotICAgICAgICB2b2lkICpwTUVTcGVjCi0gICAgICAgKQotewotICAgIEFSTVZDTTRQMTBfTUVTcGVjICphcm1NRVNwZWMgPSAoQVJNVkNNNFAxMF9NRVNwZWMgKikgcE1FU3BlYzsKLSAgICAKLSAgICBhcm1SZXRBcmdFcnJJZighcE1FUGFyYW1zLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoIXBNRVNwZWMsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoTUVNb2RlICE9IE9NWF9WQ19NNFAxMF9GQVNUX1NFQVJDSCkgJiYgCi0gICAgICAgICAgICAgICAgICAgKE1FTW9kZSAhPSBPTVhfVkNfTTRQMTBfRlVMTF9TRUFSQ0gpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2UxNngxNiA8PSAwKSB8fCAKLSAgICAgICAgICAgICAgICAgICAocE1FUGFyYW1zLT5zZWFyY2hSYW5nZTh4OCA8PSAwKSB8fCAKLSAgICAgICAgICAgICAgICAgICAocE1FUGFyYW1zLT5zZWFyY2hSYW5nZTR4NCA8PSAwKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIAotICAgIGFybU1FU3BlYy0+TUVQYXJhbXMuYmxvY2tTcGxpdEVuYWJsZTh4OCA9IHBNRVBhcmFtcy0+YmxvY2tTcGxpdEVuYWJsZTh4ODsKLSAgICBhcm1NRVNwZWMtPk1FUGFyYW1zLmJsb2NrU3BsaXRFbmFibGU0eDQgPSBwTUVQYXJhbXMtPmJsb2NrU3BsaXRFbmFibGU0eDQ7Ci0gICAgYXJtTUVTcGVjLT5NRVBhcmFtcy5oYWxmU2VhcmNoRW5hYmxlICAgID0gcE1FUGFyYW1zLT5oYWxmU2VhcmNoRW5hYmxlOwotICAgIGFybU1FU3BlYy0+TUVQYXJhbXMucXVhcnRlclNlYXJjaEVuYWJsZSA9IHBNRVBhcmFtcy0+cXVhcnRlclNlYXJjaEVuYWJsZTsKLSAgICBhcm1NRVNwZWMtPk1FUGFyYW1zLmludHJhRW5hYmxlNHg0ICAgICAgPSBwTUVQYXJhbXMtPmludHJhRW5hYmxlNHg0OyAgICAgCi0gICAgYXJtTUVTcGVjLT5NRVBhcmFtcy5zZWFyY2hSYW5nZTE2eDE2ICAgID0gcE1FUGFyYW1zLT5zZWFyY2hSYW5nZTE2eDE2OyAgIAotICAgIGFybU1FU3BlYy0+TUVQYXJhbXMuc2VhcmNoUmFuZ2U4eDggICAgICA9IHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2U4eDg7Ci0gICAgYXJtTUVTcGVjLT5NRVBhcmFtcy5zZWFyY2hSYW5nZTR4NCAgICAgID0gcE1FUGFyYW1zLT5zZWFyY2hSYW5nZTR4NDsKLSAgICBhcm1NRVNwZWMtPk1FTW9kZSAgICAgICAgICAgICAgICAgICAgICAgPSBNRU1vZGU7Ci0gICAgCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9Nb3Rpb25Fc3RpbWF0aW9uTUIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI2NDM5NC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTkwNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeAotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQi5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybSBNQiBsZXZlbCBtb3Rpb24gZXN0aW1hdGlvbgotICogCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0jZGVmaW5lICBBUk1fVkNNNFAxMF9NQVhfRlJBTUVTICAgICAoMTUpCi0jZGVmaW5lICBBUk1fVkNNNFAxMF9NQVhfNHg0X1NBRAkJKDB4ZmZmZikKLSNkZWZpbmUgIEFSTV9WQ000UDEwX01BWF9NT0RFX1ZBTFVFICAgICAoMHhmZmZmZmZmZikKLSNkZWZpbmUgIEFSTV9WQ000UDEwX01BWF9NT0RFUyAgICAgICAgICAoMTYpCi0jZGVmaW5lICBBUk1fVkNNNFAxMF9NQl9CTE9DS19TSVpFICAgICAgKDE2KQotI2RlZmluZSAgQVJNX1ZDTTRQMTBfTUVESUFOKGEsYixjKSAgICAgIChhPmI/YT5jP2I+Yz9iOmM6YTpiPmM/YT5jP2E6YzpiKQotI2RlZmluZSAgQVJNX1ZDTTRQMTBfU0hJRlRfUVAgICAgICAgICAgICgxMikKLQotI2RlZmluZSAgQVJNX1ZDTTRQMTBfTVZQUkVEX01FRElBTiAgICAgICgwKQotI2RlZmluZSAgQVJNX1ZDTTRQMTBfTVZQUkVEX0wgICAgICAgICAgICgxKQotI2RlZmluZSAgQVJNX1ZDTTRQMTBfTVZQUkVEX1UgICAgICAgICAgICgyKQotI2RlZmluZSAgQVJNX1ZDTTRQMTBfTVZQUkVEX1VSICAgICAgICAgICgzKQotCi0jZGVmaW5lIEFSTV9WQ000UDEwX01CX0JMT0NLX1NJWkUgICAgICAgKDE2KQotI2RlZmluZSBBUk1fVkNNNFAxMF9CTE9DS19TSVpFICAgICAgICAgICg0KQotI2RlZmluZSBBUk1fVkNNNFAxMF9NQVhfQ09TVCAgICAgICAgICAgICgxIDw8IDMwKQotI2RlZmluZSAgQVJNX1ZDTTRQMTBfSU5WQUxJRF9CTE9DSyAgICAgICgtMikKLQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0NhbGN1bGF0ZUJsb2NrU0FECi0gKgotICogRGVzY3JpcHRpb246Ci0gKiAgICBDYWxjdWxhdGUgU0FEIHZhbHVlIGZvciB0aGUgc2VsZWN0ZWQgTUIgZW5jb2RpbmcgbW9kZSBhbmQgdXBkYXRlIAotICogcERzdEJsb2NrU0FEIHBhcmFtZXRlci4gVGhlc2UgU0FEIHZhbHVlcyBhcmUgY2FsY3VsYXRlZCA0eDQgYmxvY2tzIGF0Ci0gKiBhIHRpbWUgYW5kIGluIHRoZSBzY2FuIG9yZGVyLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gcFNyY01CSW5mbyAgICAtIAotICogW2luXSBwU3JjQ3VyckJ1ZiAgIC0gCi0gKiBbaW5dIFNyY0N1cnJTdGVwICAgLSAKLSAqIFtpbl0gcFNyY1JlZkJ1Zkxpc3QtIAotICogW2luXSBTcmNSZWZTdGVwICAgIC0gCi0gKiBbaW5dIHBTcmNSZWNCdWYgICAgLSAKLSAqIFtpbl0gU3JjUmVjU3RlcCAgICAtIAotICogW2luXSBwUmVmUmVjdCAgICAgIC0gCi0gKiBbaW5dIHBDdXJyUG9pbnRQb3MgLSAKLSAqIFtpbl0gTGFtYmRhICAgICAgICAtIAotICogW2luXSBwTUVTcGVjICAgICAgIC0gCi0gKiBbaW5dIHBNQkludGVyICAgICAgLSAKLSAqIFtpbl0gcE1CSW50cmEgICAgICAtIAotICogW291dF0gcERzdEJsb2NrU0FEIC0gcG9pbnRlciB0byAxNiBlbGVtZW50IGFycmF5IGZvciBTQUQgY29ycmVzcG9uZGluZyB0byA0eDQgYmxvY2tzCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBOb25lCi0gKgotICovCi0KLXN0YXRpYyBPTVhSZXN1bHQgYXJtVkNNNFAxMF9DYWxjdWxhdGVCbG9ja1NBRCgKLQlPTVhWQ000UDEwTUJJbmZvICpwU3JjTUJJbmZvLCAKLSAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQlPTVhfUzMyIFNyY0N1cnJTdGVwLCAKLQljb25zdCBPTVhfVTggKnBTcmNSZWZCdWZMaXN0W0FSTV9WQ000UDEwX01BWF9GUkFNRVNdLAotCU9NWF9TMzIgU3JjUmVmU3RlcCwKLQljb25zdCBPTVhfVTggKnBTcmNSZWNCdWYsIAotCU9NWF9TMzIgU3JjUmVjU3RlcCwKLQljb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKLQljb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAotCWNvbnN0IE9NWFZDTTRQMTBNQkluZm9QdHIgKnBNQkludGVyLCAKLQljb25zdCBPTVhWQ000UDEwTUJJbmZvUHRyICpwTUJJbnRyYSwKLQlPTVhfVTE2ICpwRHN0QmxvY2tTQUQpCi17Ci0JT01YX0lOVAkJSW52YWxpZFNBRCA9IDA7Ci0JT01YX0lOVAkJaTsKLQotCU9NWF9VOAkJQnVmZmVyIFsxNioxNiArIDE1XTsKLQlPTVhfVTgJCSpwVGVtcERzdEJ1ZjsKLQlPTVhfUzMyCQlUZW1wRHN0U3RlcDsKLQlPTVhfVTgJCSpwVGVtcFJlZkJ1ZjsKLQlPTVhfUzMyCQlUZW1wUmVmU3RlcDsgCi0KLQkvKiBUZW1wb3JhcnkgYnVmZmVyIHRvIHN0b3JlIHRoZSBwcmVkaWN0ZWQgbWIgY29lZmZpY2llbnRzICovCi0JcFRlbXBEc3RCdWYgPSBhcm1BbGlnblRvMTZCeXRlcyhCdWZmZXIpOwotCVRlbXBEc3RTdGVwID0gMTY7Ci0KLQkvKiBVcGRhdGUgcERzdEJsb2NrU0FEIGlmIE1CIGlzIGEgdmFsaWQgdHlwZSAqLwotCWlmIChwU3JjTUJJbmZvKQotCXsKLQkgICAgT01YX1UzMiAgICAgV2lkdGg9MCwgSGVpZ2h0PTAsIE1heFhQYXJ0LCBNYXhZUGFydCxNYXhTdWJYUGFydCxNYXhTdWJZUGFydDsKLQkgICAgCi0JCS8qIERlcGVuZGluZyBvbiB0eXBlIG9mIE1CLCBkbyBwcmVkaWN0aW9uIGFuZCBmaWxsIHRlbXAgYnVmZmVyICovCi0JCXN3aXRjaCAocFNyY01CSW5mby0+bWJUeXBlKQotCQl7Ci0JCWNhc2UgT01YX1ZDX1BfMTZ4MTY6Ci0JCQkJV2lkdGggPSAxNjsKLQkJCQlIZWlnaHQgPSAxNjsKLQkJCQlicmVhazsKLQkJY2FzZSBPTVhfVkNfUF8xNng4OgotCQkJCVdpZHRoID0gMTY7Ci0JCQkJSGVpZ2h0ID0gODsKLQkJCQlicmVhazsKLQkJY2FzZSBPTVhfVkNfUF84eDE2OgotCQkJCVdpZHRoID0gODsKLQkJCQlIZWlnaHQgPSAxNjsKLQkJCQlicmVhazsKLQkJY2FzZSBPTVhfVkNfUF84eDg6Ci0JCQkJV2lkdGggPSA4OwotCQkJCUhlaWdodCA9IDg7Ci0JCQkJYnJlYWs7Ci0JCWNhc2UgT01YX1ZDX0lOVFJBXzR4NDoKLQkJCXsKLQkJCQkvKiBDcmVhdGUgcHJlZGljdGVkIE1CIEludHJhNHg0IG1vZGUgKi8KLQkJCQlPTVhfUzMyICAgICBQcmVkSW50cmE0eDRNb2RlIFs1XVs5XTsKLQkJCQlPTVhfUzMyCQl4LCB5LCBCbG9jazh4OCwgQmxvY2s0eDQsIEJsb2NrWCwgQmxvY2tZOwotCQkJCU9NWF9VOCAgICAgIHBTcmNZQnVmZiBbKDE2KjMpKigxNioyKV07Ci0JCQkJT01YX1U4CQkqcFNyY1k7Ci0JCQkJT01YX1MzMiAgICAgU3RlcFNyY1k7Ci0JCQkJT01YX1MzMgkJYXZhaWxhYmlsaXR5OwotCi0JCQkJZm9yICh5ID0gMDsgeSA8IDU7IHkrKykKLQkJCQl7Ci0JCQkJCWZvciAoeCA9IDA7IHggPCA5OyB4KyspCi0JCQkJCXsKLQkJCQkJCS8qIAotCQkJCQkJICogSW5pdGlhbGl6ZSB3aXRoIHZhbHVlIG9mIEFSTV9WQ000UDEwX0lOVkFMSURfQkxPQ0ssIHRvIG1lYW4gdGhpcyAKLQkJCQkJCSAqIDR4NCBibG9jayBpcyBub3QgYXZhaWxhYmxlIAotCQkJCQkJICovCi0JCQkJCQlQcmVkSW50cmE0eDRNb2RlIFt5XVt4XSA9IEFSTV9WQ000UDEwX0lOVkFMSURfQkxPQ0s7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvKiBSZXBsYWNlIEFSTV9WQ000UDEwX0lOVkFMSURfQkxPQ0sgdmFsdWUgd2l0aCBhdmFpbGFibGUgTUJzIHZhbHVlcyovCi0JCQkJZm9yICh4ID0gMDsgeCA8IDQ7IHgrKykKLQkJCQl7Ci0JCQkJCS8qIFN0b3JlIHZhbHVlcyBvZiBiMCwgYjEsIGIyLCBiMyAqLwotCQkJCQlpZiAocE1CSW50cmFbMV0gIT0gTlVMTCkKLQkJCQkJewotCQkJCQkJUHJlZEludHJhNHg0TW9kZSBbMF1beCArIDFdID0gCi0JCQkJCQkJcE1CSW50cmFbMV0tPnBJbnRyYTR4NFByZWRNb2RlWzMqNCArIHhdOyAgICAgICAgICAgIAotCQkJCQl9Ci0JCQkgICAgICAgIAotCQkJCQkvKiBTdG9yZSB2YWx1ZXMgb2YgZDAsIGQxLCBkMiwgZDMgKi8KLQkJCQkJaWYgKHBNQkludHJhWzNdICE9IE5VTEwpCi0JCQkJCXsKLQkJCQkJCVByZWRJbnRyYTR4NE1vZGUgWzBdW3ggKyA1XSA9IAotCQkJCQkJCXBNQkludHJhWzNdLT5wSW50cmE0eDRQcmVkTW9kZVszKjQgKyB4XTsKLQkJCQkJfQotCQkJCX0KLQkJICAgIAotCQkJCS8qIFN0b3JlIHZhbHVlcyBvZiBjMyAqLwotCQkJCWlmIChwTUJJbnRyYVsyXSAhPSBOVUxMKQotCQkJCXsKLQkJCQkJUHJlZEludHJhNHg0TW9kZSBbMF1bMF0gPSBwTUJJbnRyYVsyXS0+cEludHJhNHg0UHJlZE1vZGVbMTVdOwotCQkJCX0KLQkJICAgIAotCQkJCWZvciAoeSA9IDA7IHkgPCA0OyB5KyspCi0JCQkJewotCQkJCQkvKiBTdG9yZSB2YWx1ZXMgb2YgYTAsIGExLCBhMiwgYTMgKi8KLQkJCQkJaWYgKHBNQkludHJhWzBdICE9IE5VTEwpCi0JCQkJCXsKLQkJCQkJCVByZWRJbnRyYTR4NE1vZGUgW3kgKyAxXVswXSA9IAotCQkJCQkJCXBNQkludHJhWzBdLT5wSW50cmE0eDRQcmVkTW9kZVt5KjQgKyAzXTsKLQkJCQkJfQotCQkJCX0KLQkJICAgICAgICAKLQkJCQkvKgotCQkJCSAqIFVwZGF0ZSBuZWlnaGJvdXJpbmcgUHJlZCBtb2RlIGFycmF5IHdoaWNoIHdpbGwgYmUgdXNlZCBmb3IKLQkJCQkgKiBwcmVkaWN0aW9uIG9mIEludHJhNHg0IG1vZGVzLgotCQkJCSAqLwotCQkJICAgIAotCQkJCXBTcmNZID0gcFNyY1lCdWZmOwotCQkJCVN0ZXBTcmNZID0gMTYgKiAzOwotCQkJCWZvciAoeSA9IDA7IHkgPCAoMTYgKiAyKTsgeSsrKQotCQkJCXsKLQkJCQkJZm9yICh4ID0gMDsgeCA8ICgxNiAqIDMpOyB4KyspCi0JCQkJCXsKLQkJCQkJCXBTcmNZIFtTdGVwU3JjWSAqIHkgKyB4XSA9IAotCQkJCQkJCXBTcmNSZWNCdWYgW1NyY1JlY1N0ZXAgKiAoeSAtIDE2KSArIHggLSAxNl07Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJICAgIAotCQkJCS8qIGZvciBlYWNoIDh4OCBibG9jayAqLwotCQkJCWZvciAoQmxvY2s4eDggPSAwOyBCbG9jazh4OCA8IDQ7IEJsb2NrOHg4KyspCi0JCQkJewotCQkJCQkvKiBmb3IgZWFjaCA0eDQgYmxvY2sgaW5zaWRlIDh4OCBibG9jayAqLwotCQkJCQlmb3IgKEJsb2NrNHg0ID0gMDsgQmxvY2s0eDQgPCA0OyBCbG9jazR4NCsrKQotCQkJCQl7Ci0JCQkJCQkvKiBHZXQgYmxvY2sgY29yZGluYXRlcyBmcm9tIDh4OCBibG9jayBpbmRleCBhbmQgNHg0IGJsb2NrIGluZGV4ICovCi0JCQkJCQlCbG9ja1ggPSAoKEJsb2NrOHg4ICYgMSkgPDwgMSkgKyAoQmxvY2s0eDQgJiAxKTsKLQkJCQkJCUJsb2NrWSA9ICgoQmxvY2s4eDggPj4gMSkgPDwgMSkgKyAoQmxvY2s0eDQgPj4gMSk7Ci0JCQkJCSAgICAKLQkJCQkJCS8qIEFkZCBvZmZzZXQgdG8gcG9pbnQgdG8gc3RhcnQgb2YgY3VycmVudCBNQiBpbiB0aGUgYXJyYXkgcEludHJhNHg0UHJlZE1vZGUgKi8KLQkJCQkJCXggPSBCbG9ja1ggKyAxOwotCQkJCQkJeSA9IEJsb2NrWSArIDE7Ci0KLQkJCQkJCWF2YWlsYWJpbGl0eSA9IDA7Ci0KLQkJCQkJCS8qIENoZWNrIGZvciBhdmFpbGFiaWxpdHkgb2YgTEVGVCBCbG9jayAqLwotCQkJCQkJaWYgKFByZWRJbnRyYTR4NE1vZGUgW3ldW3ggLSAxXSAhPSBBUk1fVkNNNFAxMF9JTlZBTElEX0JMT0NLKQotCQkJCQkJewotCQkJCQkJCWF2YWlsYWJpbGl0eSB8PSBPTVhfVkNfTEVGVDsgICAgICAgIAotCQkJCQkJfQotCi0JCQkJCQkvKiBDaGVjayBmb3IgYXZhaWxhYmlsaXR5IG9mIFVQUEVSIEJsb2NrICovCi0JCQkJCQlpZiAoUHJlZEludHJhNHg0TW9kZSBbeSAtIDFdW3hdICE9IEFSTV9WQ000UDEwX0lOVkFMSURfQkxPQ0spCi0JCQkJCQl7Ci0JCQkJCQkJYXZhaWxhYmlsaXR5IHw9IE9NWF9WQ19VUFBFUjsgICAgICAgIAotCQkJCQkJfQotCi0JCQkJCQkvKiBDaGVjayBmb3IgYXZhaWxhYmlsaXR5IG9mIFVQUEVSIExFRlQgQmxvY2sgKi8KLQkJCQkJCWlmIChQcmVkSW50cmE0eDRNb2RlIFt5IC0gMV1beCAtIDFdICE9IEFSTV9WQ000UDEwX0lOVkFMSURfQkxPQ0spCi0JCQkJCQl7Ci0JCQkJCQkJYXZhaWxhYmlsaXR5IHw9IE9NWF9WQ19VUFBFUl9MRUZUOyAgICAgICAgCi0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCVByZWRJbnRyYTR4NE1vZGUgW3ldW3hdID0gcFNyY01CSW5mby0+cEludHJhNHg0UHJlZE1vZGVbQmxvY2tZKjQrQmxvY2tYXTsKLQkJCQkJCXggPSBCbG9ja1ggKiA0OwotCQkJCQkJeSA9IEJsb2NrWSAqIDQ7Ci0KLQkJCQkJCXBTcmNZID0gcFNyY1lCdWZmICsgMTYgKiBTdGVwU3JjWSArIDE2ICsgeSAqIFN0ZXBTcmNZICsgeDsKLQotCQkJCQkJb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0KAotCQkJCQkJCSBwU3JjWSAtIDEsCi0JCQkJCQkJIHBTcmNZIC0gU3RlcFNyY1ksCi0JCQkJCQkJIHBTcmNZIC0gU3RlcFNyY1kgLSAxLAotCQkJCQkJCSBwVGVtcERzdEJ1ZiArIHggKyB5ICogVGVtcERzdFN0ZXAsCi0JCQkJCQkJIFN0ZXBTcmNZLAotCQkJCQkJCSBUZW1wRHN0U3RlcCwKLQkJCQkJCQkgcFNyY01CSW5mby0+cEludHJhNHg0UHJlZE1vZGVbQmxvY2tZKjQrQmxvY2tYXSwKLQkJCQkJCQkgYXZhaWxhYmlsaXR5KTsKLQotCQkJCQkJZm9yIChCbG9ja1k9MDtCbG9ja1k8NDtCbG9ja1krKykKLQkJCQkJCXsKLQkJCQkJCQlmb3IoQmxvY2tYPTA7QmxvY2tYPDQ7QmxvY2tYKyspCi0JCQkJCQkJewotCQkJCQkJCQlwU3JjWSBbQmxvY2tZICogU3RlcFNyY1kgKyBCbG9ja1hdID0gCi0JCQkJCQkJCQkoT01YX1U4KSgqKHBUZW1wRHN0QnVmICsgeCArIHkgKiBUZW1wRHN0U3RlcCArIEJsb2NrWSAqIFRlbXBEc3RTdGVwICsgQmxvY2tYKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCX0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCWNhc2UgT01YX1ZDX0lOVFJBXzE2eDE2OgotCQkJewotCQkJCU9NWF9VMzIgICAgIE1CUG9zWCA9IHBDdXJyUG9pbnRQb3MtPnggPj4gNDsgICAgICAgIAotCQkJCU9NWF9VMzIgICAgIE1CUG9zWSA9IHBDdXJyUG9pbnRQb3MtPnkgPj4gNDsgICAgICAgIAotCQkJCU9NWF9VMzIJCWF2YWlsYWJpbGl0eSA9IDA7Ci0KLQkJCQkvKiBDaGVjayBmb3IgYXZhaWxhYmlsaXR5IG9mIExFRlQgTUIgKi8KLQkJCQlpZiAoKE1CUG9zWCAhPSAwKSAmJiAocE1CSW50cmEgWzBdICE9IDAgfHwgcE1CSW50ZXIgWzBdICE9IDApKQotCQkJCXsKLQkJCQkJYXZhaWxhYmlsaXR5IHw9IE9NWF9WQ19MRUZUOyAgICAgICAgCi0JCQkJfQotCi0JCQkJLyogQ2hlY2sgZm9yIGF2YWlsYWJpbGl0eSBvZiBVUCBNQiAqLwotCQkJCWlmICgoTUJQb3NZICE9IDApICYmIChwTUJJbnRyYSBbMV0gIT0gMCB8fCBwTUJJbnRlciBbMV0gIT0gMCkpCi0JCQkJewotCQkJCQlhdmFpbGFiaWxpdHkgfD0gT01YX1ZDX1VQUEVSOyAgICAgICAgCi0JCQkJfQotCi0JCQkJLyogQ2hlY2sgZm9yIGF2YWlsYWJpbGl0eSBvZiBVUC1MRUZUIE1CICovCi0JCQkJaWYgKChNQlBvc1ggPiAwKSAmJiAoTUJQb3NZID4gMCkgJiYgCi0JCQkJCShwTUJJbnRyYSBbMl0gIT0gMCB8fCBwTUJJbnRlciBbMl0gIT0gMCkpCi0JCQkJewotCQkJCQlhdmFpbGFiaWxpdHkgfD0gT01YX1ZDX1VQUEVSX0xFRlQ7ICAgICAgICAKLQkJCQl9Ci0KLQkJCQlvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNigKLQkJCQkJCXBTcmNSZWNCdWYgLSAxLCAKLQkJCQkJCXBTcmNSZWNCdWYgLSBTcmNSZWNTdGVwLCAKLQkJCQkJCXBTcmNSZWNCdWYgLSBTcmNSZWNTdGVwIC0gMSwgCi0JCQkJCQlwVGVtcERzdEJ1ZiwgCi0JCQkJCQlTcmNSZWNTdGVwLCAKLQkJCQkJCVRlbXBEc3RTdGVwLCAKLQkJCQkJCXBTcmNNQkluZm8tPkludHJhMTZ4MTZQcmVkTW9kZSwgCi0JCQkJCQlhdmFpbGFiaWxpdHkpOwotCQkJCQotCQkJCWJyZWFrOwotCQkJfQotCi0JCWNhc2UgT01YX1ZDX0lOVEVSX1NLSVA6Ci0JCWNhc2UgT01YX1ZDX1BSRUYwXzh4ODoKLQkJY2FzZSBPTVhfVkNfSU5UUkFfUENNOgotCQlkZWZhdWx0OgotCQkJLyogVGhlc2UgY2FzZXMgd2lsbCB1cGRhdGUgcERzdEJsb2NrU0FEIHdpdGggTUFYIHZhbHVlICovCi0JCQlJbnZhbGlkU0FEID0gMTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyogSU5URVIgTUIgKi8KLQkJaWYgKChwU3JjTUJJbmZvLT5tYlR5cGUgPT0gT01YX1ZDX1BfMTZ4MTYpIHx8Ci0JCQkocFNyY01CSW5mby0+bWJUeXBlID09IE9NWF9WQ19QXzh4MTYpIHx8Ci0JCQkocFNyY01CSW5mby0+bWJUeXBlID09IE9NWF9WQ19QXzE2eDgpIHx8Ci0JCQkocFNyY01CSW5mby0+bWJUeXBlID09IE9NWF9WQ19QXzh4OCkpCi0JCXsKLSAgICAgICAgCWNvbnN0IE9NWF9VOAkJKnBUZW1wU3JjQnVmOwotICAgICAgICAJT01YX1MzMgkJVGVtcFNyY1N0ZXA7Ci0gICAgICAgIAlPTVhfUzMyCQltdngsbXZ5OwotICAgICAgICAJT01YX1UzMgkJUGFydFgsIFBhcnRZLCBTdWJQYXJ0WCwgU3ViUGFydFk7Ci0gICAgICAgIAkKLQkJCVRlbXBTcmNTdGVwID0gU3JjUmVmU3RlcDsKLQotCQkJTWF4WFBhcnQgPSAxNi9XaWR0aDsKLQkJCU1heFlQYXJ0ID0gMTYvSGVpZ2h0OwotCi0KLQkJCWZvciAoUGFydFkgPSAwOyBQYXJ0WSA8IE1heFlQYXJ0OyBQYXJ0WSsrKQotCQkJewotCQkJCWZvciAoUGFydFggPSAwOyBQYXJ0WCA8IE1heFhQYXJ0OyBQYXJ0WCsrKQotCQkJCXsKLQotCQkJCQlwVGVtcFNyY0J1ZiA9IHBTcmNSZWZCdWZMaXN0W3BTcmNNQkluZm8tPnBSZWZMMElkeFtQYXJ0WSAqIDIgKyBQYXJ0WF1dOwotCi0JCQkJCWlmIChNYXhYUGFydCA9PSAyICYmIE1heFlQYXJ0ID09IDIpCi0JCQkJCXsKLSAgICAgICAgCQkJCXN3aXRjaCAocFNyY01CSW5mby0+c3ViTUJUeXBlW1BhcnRZKjIrUGFydFhdKQotICAgICAgICAJCQkJewotICAgICAgICAJCQkJICAgIGNhc2UgT01YX1ZDX1NVQl9QXzh4ODoKLQkJCQkJCQkJV2lkdGggPSA4OwotCQkJCQkJCQlIZWlnaHQgPSA4OwotICAgICAgICAgICAgCQkJCSAgICBicmVhazsKLSAgICAgICAgCQkJCSAgICBjYXNlIE9NWF9WQ19TVUJfUF84eDQ6Ci0JCQkJCQkJCVdpZHRoID0gODsKLQkJCQkJCQkJSGVpZ2h0ID0gNDsKLSAgICAgICAgICAgIAkJCQkgICAgYnJlYWs7Ci0gICAgICAgIAkJCQkgICAgY2FzZSBPTVhfVkNfU1VCX1BfNHg4OgotCQkJCQkJCQlXaWR0aCA9IDQ7Ci0JCQkJCQkJCUhlaWdodCA9IDg7Ci0gICAgICAgICAgICAJCQkJICAgIGJyZWFrOwotICAgICAgICAJCQkJICAgIGNhc2UgT01YX1ZDX1NVQl9QXzR4NDoKLQkJCQkJCQkJV2lkdGggPSA0OwotCQkJCQkJCQlIZWlnaHQgPSA0OwotICAgICAgICAgICAgCQkJCSAgICBicmVhazsKLSAgICAgICAgCQkJCSAgICBkZWZhdWx0OgotCQkJCQkJCQkvKiBEZWZhdWx0ICovCi0JCQkJCQkJCVdpZHRoID0gNDsKLQkJCQkJCQkJSGVpZ2h0ID0gNDsKLSAgICAgICAgCQkJCSAgICBicmVhazsKLSAgICAgICAgCQkJCX0KLQkJCQkJCi0gICAgCQkJCSAgICBNYXhTdWJYUGFydCA9IDgvV2lkdGg7Ci0gICAgCQkJCSAgICBNYXhTdWJZUGFydCA9IDgvSGVpZ2h0OwotCi0JCQkJCQlmb3IgKFN1YlBhcnRZID0gMDsgU3ViUGFydFkgPCBNYXhTdWJZUGFydDsgU3ViUGFydFkrKykKLQkJCQkJCXsKLQkJCQkJCQlmb3IgKFN1YlBhcnRYID0gMDsgU3ViUGFydFggPCBNYXhTdWJYUGFydDsgU3ViUGFydFgrKykKLQkJCQkJCQl7Ci0JCQkJCQkJCW12eCA9IHBTcmNNQkluZm8tPnBNVjAgWzIqUGFydFkgKyBTdWJQYXJ0WV1bMipQYXJ0WCArIFN1YlBhcnRYXS5keDsKLQkJCQkJCQkJbXZ5ID0gcFNyY01CSW5mby0+cE1WMCBbMipQYXJ0WSArIFN1YlBhcnRZXVsyKlBhcnRYICsgU3ViUGFydFhdLmR5OwotCQkJCQkJCQlhcm1WQ000UDEwX0ludGVycG9sYXRlX0x1bWEoCi0JCQkJCQkJCQlwVGVtcFNyY0J1ZiArICg4KlBhcnRYICsgNCpTdWJQYXJ0WCArIChtdngvNCkpICsgKDgqUGFydFkgKyA0KlN1YlBhcnRZICsgKG12eS80KSkgKiBUZW1wU3JjU3RlcCwKLQkJCQkJCQkJCVRlbXBTcmNTdGVwLAotCQkJCQkJCQkJcFRlbXBEc3RCdWYgKyAoOCpQYXJ0WCArIDQqU3ViUGFydFgpICsgKDgqUGFydFkgKyA0KlN1YlBhcnRZKSAqIFRlbXBEc3RTdGVwLAotCQkJCQkJCQkJVGVtcERzdFN0ZXAsCi0JCQkJCQkJCQlXaWR0aCwKLQkJCQkJCQkJCUhlaWdodCwKLQkJCQkJCQkJCW12eCAmIDMsCi0JCQkJCQkJCQltdnkgJiAzCi0JCQkJCQkJCQkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQotCQkJCQkJbXZ4ID0gcFNyY01CSW5mby0+cE1WMCBbMipQYXJ0WV1bMipQYXJ0WF0uZHg7Ci0JCQkJCQltdnkgPSBwU3JjTUJJbmZvLT5wTVYwIFsyKlBhcnRZXVsyKlBhcnRYXS5keTsKLQkJCQkJCWFybVZDTTRQMTBfSW50ZXJwb2xhdGVfTHVtYSgKLQkJCQkJCQlwVGVtcFNyY0J1ZiArICg4KlBhcnRYICsgKG12eC80KSkgKyAoOCpQYXJ0WSArIChtdnkvNCkpICogVGVtcFNyY1N0ZXAsCi0JCQkJCQkJVGVtcFNyY1N0ZXAsCi0JCQkJCQkJcFRlbXBEc3RCdWYgKyAoOCpQYXJ0WCkgKyAoOCpQYXJ0WSkgKiBUZW1wRHN0U3RlcCwKLQkJCQkJCQlUZW1wRHN0U3RlcCwKLQkJCQkJCQlXaWR0aCwKLQkJCQkJCQlIZWlnaHQsCi0JCQkJCQkJbXZ4ICYgMywKLQkJCQkJCQltdnkgJiAzCi0JCQkJCQkJKTsKLQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCUludmFsaWRTQUQgPSAxOwotCX0KLQotCS8qIENhbGN1bGF0ZSBTQUQgZnJvbSBwcmVkaWN0ZWQgYnVmZmVyICovCi0JaWYgKCFJbnZhbGlkU0FEKQotCXsKLQkgICAgT01YX1UzMiAgICAgeDh4OCwgeTh4OCwgeDR4NCwgeTR4NCwgQmxvY2s4eDgsIEJsb2NrNHg0OwotCSAgICBPTVhfUzMyICAgICBTQUQ7Ci0JICAgIAotCQlwVGVtcFJlZkJ1ZiA9IHBUZW1wRHN0QnVmOwotCQlUZW1wUmVmU3RlcCA9IDE2OwotCi0JCS8qIFNBRCBmb3IgZWFjaCA0eDQgYmxvY2sgaW4gc2NhbiBvcmRlciAqLwotCQlmb3IgKEJsb2NrOHg4ID0gMDsgQmxvY2s4eDggPCA0OyBCbG9jazh4OCsrKQotCQl7Ci0JCQl4OHg4ID0gOCooQmxvY2s4eDggJiAxKTsKLQkJCXk4eDggPSA4KihCbG9jazh4OCA+PiAxKTsKLQkJCWZvciAoQmxvY2s0eDQgPSAwOyBCbG9jazR4NCA8IDQ7IEJsb2NrNHg0KyspCi0JCQl7Ci0JCQkJeDR4NCA9IDQqKEJsb2NrNHg0ICYgMSk7Ci0JCQkJeTR4NCA9IDQqKEJsb2NrNHg0ID4+IDEpOwotCi0JCQkJYXJtVkNDT01NX1NBRCgJCi0JCQkJCXBTcmNDdXJyQnVmICsgKHg4eDggKyB4NHg0KSArICh5OHg4ICsgeTR4NCkgKiBTcmNDdXJyU3RlcCwgCi0JCQkJCVNyY0N1cnJTdGVwLAotCQkJCQlwVGVtcFJlZkJ1ZiArICh4OHg4ICsgeDR4NCkgKyAoeTh4OCArIHk0eDQpICogVGVtcFJlZlN0ZXAsCi0JCQkJCVRlbXBSZWZTdGVwLAotICAgIAkJCQkmU0FELAotICAgIAkJCQk0LCAvKiBIZWlnaHQgKi8KLSAgICAJCQkJNCk7IC8qIFdpZHRoICovCi0gICAgICAgICAgICAgICAgKihwRHN0QmxvY2tTQUQgKyA0ICogQmxvY2s4eDggKyBCbG9jazR4NCkgPSAoU0FEIDwgMHg3ZmZmKSA/IChPTVhfVTE2KSBTQUQgOiBBUk1fVkNNNFAxMF9NQVhfTU9ERV9WQUxVRTsgICAJCQkgICAgCi0gCQkJfQotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCS8qIEZpbGwgU0FEcyB3aXRoIG1heCB2YWx1ZXMgYW5kIHJldHVybiovCi0JCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotCQl7Ci0JCQlwRHN0QmxvY2tTQUQgW2ldID0gQVJNX1ZDTTRQMTBfTUFYXzR4NF9TQUQ7Ci0JCX0KLQl9Ci0JcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX01vZGU0eDREZWNpc2lvbgotICoKLSAqIERlc2NyaXB0aW9uOgotICogICAgSW50cmEgNHg0IE1vZGUgZGVjaXNpb24gYnkgY2FsY3VsYXRpbmcgY29zdCBmb3IgYWxsIHBvc3NpYmxlIG1vZGVzIGFuZAotICogY2hvb3NpbmcgdGhlIGJlc3QgbW9kZQotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gcFNyY0N1cnJCdWYgICAgLSBQb2ludGVyIHRvIHRoZSBzdGFydCBvZiBjdXJyZW50IE1hY3JvYmxvY2sKLSAqIFtpbl0gU3JjQ3VyclN0ZXAgLSBTdGVwIHNpemUgb2YgdGhlIHBvaW50ZXIgcFNyY0N1cnJCdWYKLSAqIFtpbi9vdXRdIHBTcmNEc3RNQkN1cnIgLSBQb2ludGVyIHRvIHRoZSBPTVhWQ000UDEwTUJJbmZvIHdoaWNoIHdpbGwgYmUgdXBkYXRlZCBmb3IKLSAqICAgICAgICAgICAgICAgICAgICBmaWVsZCBwSW50cmE0eDRQcmVkTW9kZSBvZiB0aGUgY3VycmVudCBibG9jay4KLSAqIFtpbl0gQmxvY2s4eDggICAgLSBJbmRleCA4eDggYmxvY2sgaW4gd2hpY2ggY3VycmVudCA0eDQgYmxvY2sgYmVsb25ncwotICogW2luXSBCbG9jazR4NCAgICAtIEluZGV4IG9mIGN1cnJlbnQgNHg0IGJsb2NrCi0gKiBbaW4vb3V0XSBwUHJlZEludHJhNHg0U3JjWSAtIFBvaW50ZXIgdG8gY3VycmVudCBibG9jayBsb2NhdGlvbiBpbiBidWZmZXIgCi0gKiAgICAgICAgICAgICAgICAgICAgd2l0aCByZWNvbnN0cnVjdGVkIHZhbHVlcy4gVGhpcyB3aWxsIGJlIG1vZGlmaWVkIGJ5IHRoaXMKLSAqICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB3aXRoIGJlc3QgbW9kZSBwcmVkaWN0ZWQgdmFsdWVzIAotICogW2luXSBTdGVwUHJlZEludHJhNHg0U3JjWSAgLSBTdGVwIHNpemUgb2YgdGhlIHBvaW50ZXIgcFByZWRJbnRyYTR4NFNyY1kKLSAqIFtpbl0gcEludHJhNHg0UHJlZE1vZGUgICAgIC0gQXJyYXkgb2YgSW50cmEgNHg0IHByZWRpY3Rpb24gbW9kZSBmb3IgdGhlIE1CLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJyZW50IE1CIG1vZGVzIHN0YXJ0cyBhdCBbMSwxXS4KLSAqIFtpbl0gcEJlc3RDb3N0ICAgLSBDb3N0IGZvciB0aGUgQmVzdCBJbnRyYSA0eDQgbW9kZQotICogUmV0dXJuIFZhbHVlOgotICogTm9uZQotICoKLSAqLwotc3RhdGljIE9NWFZvaWQgYXJtVkNNNFAxMF9Nb2RlNHg0RGVjaXNpb24gKAotICAgIGNvbnN0IE9NWF9VOCogcFNyY0N1cnJCdWYsICAgCi0gICAgT01YX1MzMiBTcmNDdXJyU3RlcCwKLSAgICBPTVhWQ000UDEwTUJJbmZvICpwU3JjRHN0TUJDdXJyLAotICAgIE9NWF9TMzIgQmxvY2s4eDgsCi0gICAgT01YX1MzMiBCbG9jazR4NCwKLSAgICBPTVhfVTggICpwUHJlZEludHJhNHg0U3JjWSwKLSAgICBPTVhfUzMyIFN0ZXBQcmVkSW50cmE0eDRTcmNZLAotICAgIE9NWF9TMzIgcEludHJhNHg0UHJlZE1vZGUgW11bOV0sCi0gICAgT01YX1MzMiAqcEJlc3RDb3N0Ci0pCi17Ci0gICAgT01YX1MzMiAgICAgaSwgaiwgeCwgeSwgQmxvY2tYLCBCbG9ja1ksIG1vZGU7Ci0gICAgT01YX1MzMiAgICAgQ29zdCwgQmVzdENvc3Q7Ci0gICAgT01YX1U4ICAgICAgKnBTcmNZOwotICAgIE9NWF9TMzIgICAgIFN0ZXBTcmNZOwotICAgIE9NWF9TMzIgICAgIGF2YWlsYWJpbGl0eSA9IDA7Ci0gICAgT01YX1U4ICAgICAgcFByZWRCbG9jayBbNCo0XTsKLSAgICBPTVhSZXN1bHQgICBSZXQgPSBPTVhfU3RzX0VycjsKLQotICAgIC8qIEdldCBibG9jayBjb3JkaW5hdGVzIGZyb20gOHg4IGJsb2NrIGluZGV4IGFuZCA0eDQgYmxvY2sgaW5kZXggKi8KLSAgICBCbG9ja1ggPSAoKEJsb2NrOHg4ICYgMSkgPDwgMSkgKyAoQmxvY2s0eDQgJiAxKTsKLSAgICBCbG9ja1kgPSAoKEJsb2NrOHg4ID4+IDEpIDw8IDEpICsgKEJsb2NrNHg0ID4+IDEpOwotICAgIAotICAgIC8qIEFkZCBvZmZzZXQgdG8gcG9pbnQgdG8gc3RhcnQgb2YgY3VycmVudCBNQiBpbiB0aGUgYXJyYXkgcEludHJhNHg0UHJlZE1vZGUgKi8KLSAgICB4ID0gQmxvY2tYICsgMTsKLSAgICB5ID0gQmxvY2tZICsgMTsKLQotICAgIC8qIENoZWNrIGZvciBhdmFpbGFiaWxpdHkgb2YgTEVGVCBCbG9jayAqLwotICAgIGlmIChwSW50cmE0eDRQcmVkTW9kZSBbeV1beCAtIDFdICE9IEFSTV9WQ000UDEwX0lOVkFMSURfQkxPQ0spCi0gICAgewotICAgICAgICBhdmFpbGFiaWxpdHkgfD0gT01YX1ZDX0xFRlQ7ICAgICAgICAKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBmb3IgYXZhaWxhYmlsaXR5IG9mIFVQUEVSIEJsb2NrICovCi0gICAgaWYgKHBJbnRyYTR4NFByZWRNb2RlIFt5IC0gMV1beF0gIT0gQVJNX1ZDTTRQMTBfSU5WQUxJRF9CTE9DSykKLSAgICB7Ci0gICAgICAgIGF2YWlsYWJpbGl0eSB8PSBPTVhfVkNfVVBQRVI7ICAgICAgICAKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBmb3IgYXZhaWxhYmlsaXR5IG9mIFVQUEVSIExFRlQgQmxvY2sgKi8KLSAgICBpZiAocEludHJhNHg0UHJlZE1vZGUgW3kgLSAxXVt4IC0gMV0gIT0gQVJNX1ZDTTRQMTBfSU5WQUxJRF9CTE9DSykKLSAgICB7Ci0gICAgICAgIGF2YWlsYWJpbGl0eSB8PSBPTVhfVkNfVVBQRVJfTEVGVDsgICAgICAgIAotICAgIH0KLQotICAgIHBTcmNZID0gcFByZWRJbnRyYTR4NFNyY1kgKyAKLSAgICAgICAgICAgIFN0ZXBQcmVkSW50cmE0eDRTcmNZICogKEJsb2NrWSA8PCAyKSArIAotICAgICAgICAgICAgKEJsb2NrWCA8PCAyKTsKLSAgICAgICAgICAgIAotICAgIFN0ZXBTcmNZID0gU3RlcFByZWRJbnRyYTR4NFNyY1k7Ci0gICAgICAgICAgICAgIAotICAgIHggPSBCbG9ja1ggKiA0OwotICAgIHkgPSBCbG9ja1kgKiA0OwotCi0gICAgQ29zdCA9IEJlc3RDb3N0ID0gQVJNX1ZDTTRQMTBfTUFYX0NPU1Q7Ci0gICAgCi0gICAgLyogR28gdGhyb3VnaCBlYWNoIG1vZGUgZm9yIG1pbmltIGNvc3QgKi8KLSAgICBmb3IgKG1vZGUgPSAwOyBtb2RlIDwgOTsgbW9kZSsrKQotICAgIHsKLSAgICAgICAgUmV0ID0gb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0KAotICAgICAgICAgICAgIHBTcmNZIC0gMSwKLSAgICAgICAgICAgICBwU3JjWSAtIFN0ZXBTcmNZLAotICAgICAgICAgICAgIHBTcmNZIC0gU3RlcFNyY1kgLSAxLAotICAgICAgICAgICAgIHBQcmVkQmxvY2ssCi0gICAgICAgICAgICAgU3RlcFNyY1ksCi0gICAgICAgICAgICAgNCwKLSAgICAgICAgICAgICAoT01YVkNNNFAxMEludHJhNHg0UHJlZE1vZGUpIG1vZGUsCi0gICAgICAgICAgICAgYXZhaWxhYmlsaXR5KTsKLSAgICAgICAgICAgICAKLSAgICAgICAgaWYgKFJldCA9PSBPTVhfU3RzX05vRXJyKQotICAgICAgICB7ICAgICAgICAgICAgCi0gICAgICAgICAgICBhcm1WQ0NPTU1fU0FEKCAgICAKLSAgICAgICAgICAgICAgICBwU3JjQ3VyckJ1ZiArICh5ICogU3JjQ3VyclN0ZXApICsgeCwKLSAgICAgICAgICAgICAgICBTcmNDdXJyU3RlcCwKLSAgICAgICAgICAgICAgICBwUHJlZEJsb2NrLAotICAgICAgICAgICAgICAgIDQsCi0gICAgICAgICAgICAgICAgJkNvc3QsCi0gICAgICAgICAgICAgICAgNCwKLSAgICAgICAgICAgICAgICA0KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKENvc3QgPCBCZXN0Q29zdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBCZXN0Q29zdCA9IENvc3Q7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcEludHJhNHg0UHJlZE1vZGUgW0Jsb2NrWSArIDFdW0Jsb2NrWCArIDFdID0gCi0gICAgICAgICAgICAgICAgICAgIChPTVhWQ000UDEwSW50cmE0eDRQcmVkTW9kZSkgbW9kZTsgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcFNyY0RzdE1CQ3Vyci0+cEludHJhNHg0UHJlZE1vZGUgW0Jsb2NrWSAqIDQgKyBCbG9ja1hdID0gCi0gICAgICAgICAgICAgICAgICAgIChPTVhWQ000UDEwSW50cmE0eDRQcmVkTW9kZSkgbW9kZTsKLQotICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwU3JjWSBbU3RlcFNyY1kgKiBqICsgaV0gPSBwUHJlZEJsb2NrIFs0ICogaiArIGldOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgKnBCZXN0Q29zdCA9IEJlc3RDb3N0OwotICAgIHJldHVybjsKLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9TZXRNb3Rpb25WZWN0b3JQcmVkaWN0b3IKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqICAgIFRoaXMgZnVuY3Rpb24gd2lsbCBkbyB0aGUgTVYgUHJlZGljdGlvbiBmb3IgSW50ZXIgTUJzCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gQmxvY2tTdGFydFggLSBTdGFydCBYIGluZGV4IGluIGludGVnZXIgcGVscyBpbiBjdXJyZW50IEJsb2NrCi0gKiBbaW5dIEJsb2NrU3RhcnRZIC0gU3RhcnQgWSBpbmRleCBpbiBpbnRlZ2VyIHBlbHMgaW4gY3VycmVudCBCbG9jawotICogW2luXSBCbG9ja1NpemVYICAtIFdpZHRoIG9mIGN1cnJlbnQgYmxvY2sKLSAqIFtpbl0gQmxvY2tTaXplWSAgLSBIZWlnaHQgb2YgY3VycmVudCBibG9jawotICogW2luXSBSZWZGcmFtZSAgICAtIEluZGV4IG9mIHRoZSByZWZlcmVuY2UgZnJhbWUgZm9yIHByZWRpY3Rpb24KLSAqIFtpbl0gcFJlZkZyQXJyICAgLSBQb2ludGVyIHRvIFJlZiBhcnJheSBzdG9yaW5nIG5laWdoYm91cmluZyBNVnMgZm9yIE1WIHByZWRpY3Rpb24KLSAqIFtpbl0gcE1WQXJyICAgICAgLSBQb2ludGVyIHRvIE1WIGFycmF5IHN0b3JpbmcgbmVpZ2hib3VyaW5nIE1WcyBmb3IgTVYgcHJlZGljdGlvbgotICogW291dF0gcE1WUHJlZCAgICAtIFBvaW50ZXIgdG8gcHJlZGljdGVkIE1WcwotICogUmVtYXJrczoKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBOb25lCi0gKgotICovCi1zdGF0aWMgT01YVm9pZCBhcm1WQ000UDEwX1NldE1vdGlvblZlY3RvclByZWRpY3RvcigKLSAgICBPTVhfVTMyIEJsb2NrU3RhcnRYLCAKLSAgICBPTVhfVTMyIEJsb2NrU3RhcnRZLAotICAgIE9NWF9VMzIgQmxvY2tTaXpleCwKLSAgICBPTVhfVTMyIEJsb2NrU2l6ZXksCi0gICAgT01YX1MzMiBSZWZGcmFtZSwKLSAgICBPTVhfUzMyIHBSZWZGckFycltdWzZdLCAKLSAgICBPTVhWQ01vdGlvblZlY3RvciBwTVZBcnJbXVsxMl0sCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgKnBNVlByZWQKLSkKLXsKLSAgICBPTVhfUzMyICAgICBSRnJhbWVMOyAgICAgICAvKiBMZWZ0ICovCi0gICAgT01YX1MzMiAgICAgUkZyYW1lVTsgICAgICAgLyogVXAgKi8KLSAgICBPTVhfUzMyICAgICBSRnJhbWVVUjsgICAgICAvKiBVcC1SaWdodCAqLwotCi0gICAgT01YX1MzMiAgICAgQmxvY2tYLCBCbG9ja1ksIEJsb2NrWEZyLCBCbG9ja1lGciwgTVZQcmVkVHlwZTsKLSAgICBPTVhfUzMyICAgICBCbG9ja1hQbHVzT2ZmLCBCbG9ja1hQbHVzT2ZmRnIsIEJsb2NrWE1pbjFGciwgQmxvY2tZTWluMUZyOwotICAgIAotICAgIEJsb2NrWCA9IDQgKyAoQmxvY2tTdGFydFggPj4gMik7Ci0gICAgQmxvY2tZID0gNCArIChCbG9ja1N0YXJ0WSA+PiAyKTsgCi0gICAgQmxvY2tYUGx1c09mZiA9IEJsb2NrWCArIChCbG9ja1NpemV4ID4+IDIpOwotICAgIAotICAgIEJsb2NrWEZyID0gQmxvY2tYID4+IDE7ICAKLSAgICBCbG9ja1lGciA9IEJsb2NrWSA+PiAxOyAgCi0gICAgQmxvY2tYTWluMUZyID0gKEJsb2NrWCAtIDEpID4+IDE7ICAKLSAgICBCbG9ja1lNaW4xRnIgPSAoQmxvY2tZIC0gMSkgPj4gMTsgIAotICAgIEJsb2NrWFBsdXNPZmZGciA9IEJsb2NrWFBsdXNPZmYgPj4gMTsKLSAgICAKLSAgICBNVlByZWRUeXBlID0gQVJNX1ZDTTRQMTBfTVZQUkVEX01FRElBTjsKLQotICAgIFJGcmFtZUwgPSBwUmVmRnJBcnIgW0Jsb2NrWUZyXVtCbG9ja1hNaW4xRnJdOwotICAgIFJGcmFtZVUgPSBwUmVmRnJBcnIgW0Jsb2NrWU1pbjFGcl1bQmxvY2tYRnJdOwotICAgIFJGcmFtZVVSID0gcFJlZkZyQXJyIFtCbG9ja1lNaW4xRnJdW0Jsb2NrWFBsdXNPZmZGcl07Ci0KLSAgICBpZiAoUkZyYW1lVVIgPT0gQVJNX1ZDTTRQMTBfSU5WQUxJRF9CTE9DSykKLSAgICB7Ci0gICAgICAgIFJGcmFtZVVSID0gcFJlZkZyQXJyIFtCbG9ja1lNaW4xRnJdW0Jsb2NrWE1pbjFGcl07Ci0gICAgfQotCi0gICAgLyogCi0gICAgICogUHJlZGljdGlvbiBpZiBvbmx5IG9uZSBvZiB0aGUgbmVpZ2hib3JzIHVzZXMgdGhlIHJlZmVyZW5jZSBmcmFtZQotICAgICAqIHdlIGFyZSBjaGVja2luZwotICAgICAqLwotICAKLSAgICBpZiAoUkZyYW1lTCA9PSBSZWZGcmFtZSAmJiBSRnJhbWVVICE9IFJlZkZyYW1lICYmIFJGcmFtZVVSICE9IFJlZkZyYW1lKQotICAgIHsKLSAgICAgICAgTVZQcmVkVHlwZSA9IEFSTV9WQ000UDEwX01WUFJFRF9MOwotICAgIH0KLSAgICBlbHNlIGlmKFJGcmFtZUwgIT0gUmVmRnJhbWUgJiYgUkZyYW1lVSA9PSBSZWZGcmFtZSAmJiBSRnJhbWVVUiAhPSBSZWZGcmFtZSkKLSAgICB7Ci0gICAgICAgIE1WUHJlZFR5cGUgPSBBUk1fVkNNNFAxMF9NVlBSRURfVTsKLSAgICB9Ci0gICAgZWxzZSBpZihSRnJhbWVMICE9IFJlZkZyYW1lICYmIFJGcmFtZVUgIT0gUmVmRnJhbWUgJiYgUkZyYW1lVVIgPT0gUmVmRnJhbWUpCi0gICAgewotICAgICAgICBNVlByZWRUeXBlID0gQVJNX1ZDTTRQMTBfTVZQUkVEX1VSOwotICAgIH0KLQotICAgIC8qIERpcmVjdGlvbmFsIHByZWRpY3Rpb25zICAqLwotICAgIGVsc2UgaWYoQmxvY2tTaXpleCA9PSA4ICYmIEJsb2NrU2l6ZXkgPT0gMTYpCi0gICAgewotICAgICAgICBpZihCbG9ja1N0YXJ0WCA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihSRnJhbWVMID09IFJlZkZyYW1lKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE1WUHJlZFR5cGUgPSBBUk1fVkNNNFAxMF9NVlBSRURfTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChSRnJhbWVVUiA9PSBSZWZGcmFtZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNVlByZWRUeXBlID0gQVJNX1ZDTTRQMTBfTVZQUkVEX1VSOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYoQmxvY2tTaXpleCA9PSAxNiAmJiBCbG9ja1NpemV5ID09IDgpCi0gICAgewotICAgICAgICBpZihCbG9ja1N0YXJ0WSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihSRnJhbWVVID09IFJlZkZyYW1lKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE1WUHJlZFR5cGUgPSBBUk1fVkNNNFAxMF9NVlBSRURfVTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKFJGcmFtZUwgPT0gUmVmRnJhbWUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTVZQcmVkVHlwZSA9IEFSTV9WQ000UDEwX01WUFJFRF9MOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3dpdGNoIChNVlByZWRUeXBlKQotICAgIHsKLSAgICBjYXNlIEFSTV9WQ000UDEwX01WUFJFRF9NRURJQU46Ci0gICAgICAgIGlmICghKHBSZWZGckFyciBbQmxvY2tZTWluMUZyXVtCbG9ja1hNaW4xRnJdID09IEFSTV9WQ000UDEwX0lOVkFMSURfQkxPQ0sgfHwgCi0gICAgICAgICAgICAgIHBSZWZGckFyciBbQmxvY2tZTWluMUZyXVtCbG9ja1hGcl0gPT0gQVJNX1ZDTTRQMTBfSU5WQUxJRF9CTE9DSyB8fCAKLSAgICAgICAgICAgICAgcFJlZkZyQXJyIFtCbG9ja1lNaW4xRnJdW0Jsb2NrWFBsdXNPZmZGcl0gPT0gQVJNX1ZDTTRQMTBfSU5WQUxJRF9CTE9DSykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBNVlByZWQtPmR4ID0gcE1WQXJyIFtCbG9ja1ldW0Jsb2NrWCAtIDFdLmR4OwotICAgICAgICAgICAgcE1WUHJlZC0+ZHkgPSBwTVZBcnIgW0Jsb2NrWV1bQmxvY2tYIC0gMV0uZHk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwTVZQcmVkLT5keCA9IAotICAgICAgICAgICAgICAgIEFSTV9WQ000UDEwX01FRElBTihwTVZBcnIgW0Jsb2NrWV1bQmxvY2tYIC0gMV0uZHgsIAotICAgICAgICAgICAgICAgIHBNVkFyciBbQmxvY2tZIC0gMV1bQmxvY2tYXS5keCwgCi0gICAgICAgICAgICAgICAgcE1WQXJyIFtCbG9ja1kgLSAxXVtCbG9ja1hQbHVzT2ZmXS5keCk7Ci0gICAgICAgICAgICBwTVZQcmVkLT5keSA9IAotICAgICAgICAgICAgICAgIEFSTV9WQ000UDEwX01FRElBTihwTVZBcnIgW0Jsb2NrWV1bQmxvY2tYIC0gMV0uZHksIAotICAgICAgICAgICAgICAgIHBNVkFyciBbQmxvY2tZIC0gMV1bQmxvY2tYXS5keSwgCi0gICAgICAgICAgICAgICAgcE1WQXJyIFtCbG9ja1kgLSAxXVtCbG9ja1hQbHVzT2ZmXS5keSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIEFSTV9WQ000UDEwX01WUFJFRF9MOgotICAgICAgICBwTVZQcmVkLT5keCA9IHBNVkFyciBbQmxvY2tZXVtCbG9ja1ggLSAxXS5keDsKLSAgICAgICAgcE1WUHJlZC0+ZHkgPSBwTVZBcnIgW0Jsb2NrWV1bQmxvY2tYIC0gMV0uZHk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQVJNX1ZDTTRQMTBfTVZQUkVEX1U6Ci0gICAgICAgIHBNVlByZWQtPmR4ID0gcE1WQXJyIFtCbG9ja1kgLSAxXVtCbG9ja1hdLmR4OwotICAgICAgICBwTVZQcmVkLT5keSA9IHBNVkFyciBbQmxvY2tZIC0gMV1bQmxvY2tYXS5keTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBUk1fVkNNNFAxMF9NVlBSRURfVVI6Ci0gICAgICAgIGlmIChwUmVmRnJBcnIgW0Jsb2NrWU1pbjFGcl1bQmxvY2tYUGx1c09mZkZyXSAhPSBBUk1fVkNNNFAxMF9JTlZBTElEX0JMT0NLKQotICAgICAgICB7Ci0gICAgICAgICAgICBwTVZQcmVkLT5keCA9IHBNVkFyciBbQmxvY2tZIC0gMV1bQmxvY2tYUGx1c09mZl0uZHg7Ci0gICAgICAgICAgICBwTVZQcmVkLT5keSA9IHBNVkFyciBbQmxvY2tZIC0gMV1bQmxvY2tYUGx1c09mZl0uZHk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwTVZQcmVkLT5keCA9IHBNVkFyciBbQmxvY2tZIC0gMV1bQmxvY2tYIC0gMV0uZHg7Ci0gICAgICAgICAgICBwTVZQcmVkLT5keSA9IHBNVkFyciBbQmxvY2tZIC0gMV1bQmxvY2tYIC0gMV0uZHk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIAotICAgIHJldHVybjsKLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9CbG9ja01vdGlvblNlYXJjaAotICoKLSAqIERlc2NyaXB0aW9uOgotICogICAgR2V0cyBiZXN0IE1WIGZvciB0aGUgY3VycmVudCBibG9jawotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHBTcmNDdXJyQnVmICAgIC0gUG9pbnRlciB0byB0aGUgc3RhcnQgb2YgbHVtYSBjb21wb25lbnQgb2YgY3VycmVudCBNYWNyb2Jsb2NrIAotICogW2luXSBTcmNDdXJyU3RlcCAtIFN0ZXAgc2l6ZSBmb3IgdGhlIHBvaW50ZXIgcFNyY0N1cnJCdWYgCi0gKiBbaW5dIHBTcmNSZWZZICAgIC0gUG9pbnRlciB0byB0aGUgc3RhcnQgb2YgbHVtYSBjb21wb25lbnQgb2YgY28tbG9jYXRlZCByZWZlcmVuY2UgTUIKLSAqIFtpbl0gblNyY1JlZlN0ZXAgLSBTdGVwIHNpemUgZm9yIHRoZSBwb2ludGVyIHBTcmNSZWZZIAotICogW2luXSBwUmVmUmVjdCAgIFBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlZmVyZW5jZSByZWN0YW5nbGU7IHJlbGF0aXZlIHRvIHRoZSBpbWFnZSBvcmlnaW4uCi0gKiBbaW5dIHBDdXJyUG9pbnRQb3MgICBQb3NpdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lLgotICogW2luXSBwTUVTcGVjICAgICAtIE1vdGlvbiBlc3RpbWF0aW9uIHN0cnVjdHVyZQotICogW2luXSBwTUJJbnRlciAgICAtIEFycmF5LCBvZiBkaW1lbnNpb24gZm91ciwgY29udGFpbmluZyBwb2ludGVycyB0byBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggZm91cgotICogICAgICAgICAgICAgICAgICAgIGFkamFjZW50IHR5cGUgSU5URVIgTUJzIChMZWZ0LCBUb3AsIFRvcC1MZWZ0LCBUb3AtUmlnaHQpLiAKLSAqIFtpbl0gbkxhbWRhICAgICAgLSBGb3IgY2FsY3VsYXRpbmcgdGhlIGNvc3QKLSAqIFtvdXRdIHBCZXN0Q29zdCAgLSBNaW5pbXVtIGNvc3QgZm9yIGVuY29kaW5nIGN1cnJlbnQgYmxvY2sgCi0gKiBbb3V0XSBwQmVzdE1WICAgIC0gTVYgY29ycmVzcG9uZGluZyB0byBiZXN0IGNvc3QKLSAqIFtpbl0gQmxvY2tTdGFydFggLSBCbG9jayBzdGFydCBYIGluZGV4IGluIGludGVnZXIgcGVscwotICogW2luXSBCbG9ja1N0YXJ0WSAtIEJsb2NrIHN0YXJ0IFkgaW5kZXggaW4gaW50ZWdlciBwZWxzCi0gKiBbaW5dIEJsb2NrU2l6ZVggIC0gV2lkdGggb2YgY3VycmVudCBibG9jawotICogW2luXSBCbG9ja1NpemVZICAtIEhlaWdodCBvZiBjdXJyZW50IGJsb2NrCi0gKiBbaW5dIFJlZkZyYW1lICAgIC0gSW5kZXggb2YgdGhlIHJlZmVyZW5jZSBmcmFtZSBmb3IgcHJlZGljdGlvbgotICogW2luXSBwUmVmRnJBcnIgICAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGZyYW1lIGFycmF5IHN0b3JpbmcgbmVpZ2hib3VyaW5nIE1WcyBmb3IgcHJlZGljdGlvbgotICogW2luXSBwTVZBcnIgICAgICAtIFBvaW50ZXIgdG8gTVYgYXJyYXkgc3RvcmluZyBuZWlnaGJvdXJpbmcgTVZzIGZvciBNViBwcmVkaWN0aW9uCi0gKiBbaW5dIHBNVlByZWQgICAgIC0gUG9pbnRlciB0byBNViBwcmVkaWN0ZWQgZnJvbSBuZWlnaGJvdXIgTVZzCi0gKiBSZW1hcmtzOgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWFJlc3VsdAotICoKLSAqLwotc3RhdGljIE9NWFJlc3VsdCBhcm1WQ000UDEwX0Jsb2NrTW90aW9uU2VhcmNoKAotICAgIGNvbnN0IE9NWF9VOCogcFNyY0N1cnJCdWYsIAotICAgIE9NWF9TMzIgU3JjQ3VyclN0ZXAsIAotICAgIGNvbnN0IE9NWF9VOCogcFNyY1JlZlksIAotICAgIE9NWF9TMzIgblNyY1JlZlN0ZXAsIAotCWNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAotCWNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCi0gICAgdm9pZCogcE1FU3BlYywgCi0KLSAgICBPTVhfUzMyIG5MYW1kYSwKLSAgICBPTVhfUzMyKiBwQmVzdENvc3QsIAotICAgIE9NWFZDTW90aW9uVmVjdG9yICpwQmVzdE1WLAotICAgIAotICAgIE9NWF9VMzIgQmxvY2tTdGFydFgsIAotICAgIE9NWF9VMzIgQmxvY2tTdGFydFksCi0gICAgT01YX1UzMiBCbG9ja1NpemVYLAotICAgIE9NWF9VMzIgQmxvY2tTaXplWSwKLSAgICBPTVhfUzMyIFJlZkZyYW1lLAotICAgIE9NWF9TMzIgcFJlZkZyQXJyIFtdWzZdLCAKLSAgICBPTVhWQ01vdGlvblZlY3RvciBwTVZBcnIgW11bMTJdLAotICAgIE9NWFZDTW90aW9uVmVjdG9yICpwTVZQcmVkCi0gICApCi17Ci0KLSAgICBPTVhWQ01vdGlvblZlY3RvciAgIE1WQ2FsY3VsYXRlZCwgTVZDYW5kaWRhdGU7Ci0gICAgT01YX1MzMiAgICAgICAgICAgICBDb3N0OwotICAgIE9NWFJlc3VsdCAgICAgICAgICAgUmV0VmFsdWU7Ci0gICAgT01YVkNNNFAxME1FUGFyYW1zICAqcE1FUGFyYW1zOyAgICAKLQlPTVhWQ000UDJDb29yZGluYXRlIEN1cnJCbG9ja1BvczsKLQotICAgIC8qIEdldCBQcmVkaWN0ZWQgTW90aW9uIFZlY3RvcnMgKi8KLSAgICBhcm1WQ000UDEwX1NldE1vdGlvblZlY3RvclByZWRpY3RvciAoCi0gICAgICAgIEJsb2NrU3RhcnRYLCAKLSAgICAgICAgQmxvY2tTdGFydFksCi0gICAgICAgIEJsb2NrU2l6ZVgsIAotICAgICAgICBCbG9ja1NpemVZLAotICAgICAgICBSZWZGcmFtZSwKLSAgICAgICAgcFJlZkZyQXJyLCAgIAotICAgICAgICBwTVZBcnIsICAgICAgCi0gICAgICAgIHBNVlByZWQpOwotCi0gICAgLyogSW5pdGlhbGl6ZSBjYW5kaWRhdGUgTVYgKi8KLSAgICBNVkNhbmRpZGF0ZS5keCA9IDA7Ci0gICAgTVZDYW5kaWRhdGUuZHkgPSAwOwotICAgIAotICAgIEN1cnJCbG9ja1Bvcy54ID0gcEN1cnJQb2ludFBvcy0+eCArIEJsb2NrU3RhcnRYOwotICAgIEN1cnJCbG9ja1Bvcy55ID0gcEN1cnJQb2ludFBvcy0+eSArIEJsb2NrU3RhcnRZOwotCi0gICAgLyogQmxvY2sgTWF0Y2ggSW50ZWdlciAqLwotICAgIFJldFZhbHVlID0gb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIgKAotICAgICAgICBwU3JjQ3VyckJ1ZiwgCi0gICAgICAgIFNyY0N1cnJTdGVwLCAKLSAgICAgICAgcFNyY1JlZlksIAotICAgICAgICBuU3JjUmVmU3RlcCwgCi0gICAgICAgIHBSZWZSZWN0LCAKLSAgICAgICAgJkN1cnJCbG9ja1BvcywgCi0gICAgICAgIEJsb2NrU2l6ZVgsIAotICAgICAgICBCbG9ja1NpemVZLCAKLSAgICAgICAgbkxhbWRhLCAKLSAgICAgICAgcE1WUHJlZCwgCi0gICAgICAgICZNVkNhbmRpZGF0ZSwgCi0gICAgICAgICZNVkNhbGN1bGF0ZWQsIAotICAgICAgICAmQ29zdCwgCi0gICAgICAgIHBNRVNwZWMpOwotICAgIAotICAgIC8qIHVwZGF0ZWQgQmVzdE1WKi8KLSAgICAvKipwQmVzdENvc3QgPSBDb3N0OwotICAgIHBCZXN0TVYtPmR4ID0gTVZDYWxjdWxhdGVkLmR4OwotICAgIHBCZXN0TVYtPmR5ID0gTVZDYWxjdWxhdGVkLmR5OyovCi0KLSAgICBwTUVQYXJhbXMgPSAoT01YVkNNNFAxME1FUGFyYW1zICopIHBNRVNwZWM7Ci0gICAgCi0gICAgLyogQmxvY2sgTWF0Y2ggSGFsZiBwZWwgKi8KLSAgICBpZiAocE1FUGFyYW1zLT5oYWxmU2VhcmNoRW5hYmxlKQotICAgIHsKLSAgICAgICAgUmV0VmFsdWUgPSBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZigKLSAgICAgICAgICAgIHBTcmNDdXJyQnVmLCAKLSAgICAgICAgICAgIFNyY0N1cnJTdGVwLCAKLSAgICAgICAgICAgIHBTcmNSZWZZLCAKLSAgICAgICAgICAgIG5TcmNSZWZTdGVwLCAKLSAgICAgICAgICAgIEJsb2NrU2l6ZVgsIAotICAgICAgICAgICAgQmxvY2tTaXplWSwgCi0gICAgICAgICAgICBuTGFtZGEsIAotICAgICAgICAgICAgcE1WUHJlZCwgCi0gICAgICAgICAgICAmTVZDYWxjdWxhdGVkLCAgICAgICAgLyogaW5wdXQvb3V0cHV0Ki8KLSAgICAgICAgICAgICZDb3N0KTsKLSAgICB9Ci0KLSAgICAvKiBCbG9jayBNYXRjaCBRdWFydGVyIHBlbCAqLwotICAgIGlmIChwTUVQYXJhbXMtPnF1YXJ0ZXJTZWFyY2hFbmFibGUpCi0gICAgewotICAgICAgICBSZXRWYWx1ZSA9IG9teFZDTTRQMTBfQmxvY2tNYXRjaF9RdWFydGVyKAotICAgICAgICAgICAgcFNyY0N1cnJCdWYsIAotICAgICAgICAgICAgU3JjQ3VyclN0ZXAsIAotICAgICAgICAgICAgcFNyY1JlZlksIAotICAgICAgICAgICAgblNyY1JlZlN0ZXAsIAotICAgICAgICAgICAgQmxvY2tTaXplWCwgCi0gICAgICAgICAgICBCbG9ja1NpemVZLCAKLSAgICAgICAgICAgIG5MYW1kYSwgCi0gICAgICAgICAgICBwTVZQcmVkLCAKLSAgICAgICAgICAgICZNVkNhbGN1bGF0ZWQsIAotICAgICAgICAgICAgJkNvc3QpOwotICAgIH0KLQotICAgIC8qIHVwZGF0ZWQgQmVzdCBDb3N0IGFuZCBCZXN0IE1WICovCi0gICAgKnBCZXN0Q29zdCA9IENvc3Q7Ci0gICAgcEJlc3RNVi0+ZHggPSBNVkNhbGN1bGF0ZWQuZHg7Ci0gICAgcEJlc3RNVi0+ZHkgPSBNVkNhbGN1bGF0ZWQuZHk7Ci0KLSAgICAvKgotICAgICAqIFNraXAgTUIgY29zdCBjYWxjdWxhdGlvbnMgb2YgMTZ4MTYgaW50ZXIgbW9kZQotICAgICAqLwotICAgIHJldHVybiBSZXRWYWx1ZTsKLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9QYXJ0aXRpb25NRQotICoKLSAqIERlc2NyaXB0aW9uOgotICogICAgR2V0cyBiZXN0IGNvc3QgZm9yIHRoZSBjdXJyZW50IHBhcnRpdGlvbgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHBTcmNDdXJyQnVmICAgIC0gUG9pbnRlciB0byB0aGUgc3RhcnQgb2YgbHVtYSBjb21wb25lbnQgb2YgY3VycmVudCBNYWNyb2Jsb2NrIAotICogW2luXSBTcmNDdXJyU3RlcCAtIFN0ZXAgc2l6ZSBmb3IgdGhlIHBvaW50ZXIgcFNyY0N1cnJCdWYgCi0gKiBbaW5dIHBTcmNSZWZCdWZMaXN0ICAgIC0gUG9pbnRlciB0byBMaXN0IG9mIHJlZiBidWZmZXIgb2YgY28tbG9jYXRlZCByZWZlcmVuY2UgTUIKLSAqIFtpbl0gblNyY1JlZlN0ZXAgLSBTdGVwIHNpemUgZm9yIHRoZSBwb2ludGVyIHBTcmNSZWZZIAotICogW2luXSBwUmVmUmVjdCAgIFBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlZmVyZW5jZSByZWN0YW5nbGU7IHJlbGF0aXZlIHRvIHRoZSBpbWFnZSBvcmlnaW4uCi0gKiBbaW5dIHBDdXJyUG9pbnRQb3MgICBQb3NpdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lLgotICogW2luXSBwTUVTcGVjICAgICAtIE1vdGlvbiBlc3RpbWF0aW9uIHN0cnVjdHVyZQotICogW2luXSBQYXJ0V2lkdGggICAtIFdpZHRoIG9mIGN1cnJlbnQgcGFydGl0aW9uCi0gKiBbaW5dIFBhcnRIZWlnaHQgIC0gSGVpZ2h0IG9mIGN1cnJlbnQgcGFydGl0aW9uCi0gKiBbaW5dIEJsb2NrV2lkdGggIC0gV2lkdGggb2YgY3VycmVudCBibG9jawotICogW2luXSBCbG9ja0hlaWdodCAtIEhlaWdodCBvZiBjdXJyZW50IGJsb2NrCi0gKiBbaW5dIFBhcnRTdGFydFggIC0gUGFydGl0aW9uIHN0YXJ0IFggaW5kZXggaW4gaW50ZWdlciBwZWxzCi0gKiBbaW5dIFBhcnRTdGFydFkgIC0gUGFydGl0aW9uIHN0YXJ0IFkgaW5kZXggaW4gaW50ZWdlciBwZWxzCi0gKiBbaW5dIHBNVkFyciAgICAgIC0gUG9pbnRlciB0byBNViBhcnJheSBzdG9yaW5nIG5laWdoYm91cmluZyBNVnMgZm9yIE1WIHByZWRpY3Rpb24KLSAqIFtpbl0gcFJlZkZyQXJyICAgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBmcmFtZSBhcnJheSBzdG9yaW5nIG5laWdoYm91cmluZyBNVnMgZm9yIHByZWRpY3Rpb24KLSAqIFtpbl0gTGFtYmRhICAgICAgLSBGb3IgY2FsY3VsYXRpbmcgdGhlIGNvc3QKLSAqIFtvdXRdIHBDb3N0ICAgICAgLSBQb2ludGVyIHRvIGNvc3QgZm9yIEludGVyIE1CCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YUmVzdWx0Ci0gKgotICovCi1zdGF0aWMgT01YUmVzdWx0IGFybVZDTTRQMTBfUGFydGl0aW9uTUUgKAotICAgIGNvbnN0IE9NWF9VOCogcFNyY0N1cnJCdWYsICAgCi0gICAgT01YX1MzMiBTcmNDdXJyU3RlcCwKLQljb25zdCBPTVhfVTggKnBTcmNSZWZCdWZMaXN0W0FSTV9WQ000UDEwX01BWF9GUkFNRVNdLAotCU9NWF9TMzIgU3JjUmVmU3RlcCwKLQljb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKLQljb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAotICAgIHZvaWQqIHBNRVNwZWMsIAotCi0gICAgT01YX1MzMiBQYXJ0V2lkdGgsCi0gICAgT01YX1MzMiBQYXJ0SGVpZ2h0LAotICAgIE9NWF9TMzIgQmxvY2tXaWR0aCwKLSAgICBPTVhfUzMyIEJsb2NrSGVpZ2h0LAotICAgIE9NWF9TMzIgUGFydFN0YXJ0WCwgCi0gICAgT01YX1MzMiBQYXJ0U3RhcnRZLAotCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgcE1WQXJyIFtdWzEyXSwKLSAgICBPTVhfUzMyIHBSZWZGckFyciBbXVs2XSwKLSAgICBPTVhWQ01vdGlvblZlY3RvciBwTVZQcmVkQXJyIFtdWzRdLAotCi0gICAgT01YX1MzMiBMYW1iZGEsCi0gICAgT01YX1MzMiAqcENvc3QKLSkKLXsKLSAgICBPTVhfVTMyICAgICB4LCB5LCBpLCBqLCByZWYsIE9mZlgsIE9mZlksIE9mZlNyYywgT2ZmUmVmOwotICAgIE9NWF9TMzIgICAgIEJsb2NrQ29zdCwgUGFydGl0aW9uQ29zdCwgQmVzdENvc3Q7Ci0gICAgT01YX1MzMiAgICAgQmVzdFJlZkZyYW1lPTA7Ci0gICAgT01YVkNNb3Rpb25WZWN0b3IgICBCZXN0TVYgWzRdWzRdOwotICAgIE9NWFZDTW90aW9uVmVjdG9yICAgQmVzdE1WUHJlZCBbNF1bNF07Ci0gICAgT01YVkNNb3Rpb25WZWN0b3IgICBNVlByZWQ7Ci0gICAgT01YVkNNb3Rpb25WZWN0b3IgICBEc3RNVjsKLQotICAgIEJlc3RDb3N0ID0gQVJNX1ZDTTRQMTBfTUFYX0NPU1Q7Ci0gICAgCi0gICAgZm9yIChyZWYgPSAwOyByZWYgPCBBUk1fVkNNNFAxMF9NQVhfRlJBTUVTOyByZWYrKykKLSAgICB7Ci0gICAgICAgIGlmIChwU3JjUmVmQnVmTGlzdCBbcmVmXSA9PSBOVUxMKQotICAgICAgICB7Ci0gICAgICAgIAkvKiBObyByZWZlcmVuY2UgZnJhbWUsIGNvbnRpbnVlICovCi0gICAgICAgIAljb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIFBhcnRpdGlvbkNvc3QgPSAwOwotICAgICAgICAKLSAgICAgICAgZm9yICh5ID0gMDsgeSA8IFBhcnRIZWlnaHQ7IHkgKz0gQmxvY2tIZWlnaHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBQYXJ0V2lkdGg7IHggKz0gQmxvY2tXaWR0aCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIAlPZmZTcmMgPSBTcmNDdXJyU3RlcCAqIChQYXJ0U3RhcnRZICsgeSkgKyBQYXJ0U3RhcnRYICsgeDsKLSAgICAgICAgICAgIAlPZmZSZWYgPSBTcmNSZWZTdGVwICogKFBhcnRTdGFydFkgKyB5KSArIFBhcnRTdGFydFggKyB4OwotICAgICAgICAgICAgICAgIGFybVZDTTRQMTBfQmxvY2tNb3Rpb25TZWFyY2ggKAotICAgICAgICAgICAgICAgICAgICBwU3JjQ3VyckJ1ZiArIE9mZlNyYywgCi0gICAgICAgICAgICAgICAgICAgIFNyY0N1cnJTdGVwLCAKLSAgICAgICAgICAgICAgICAgICAgcFNyY1JlZkJ1Zkxpc3QgW3JlZl0gKyBPZmZSZWYsIAotICAgICAgICAgICAgICAgICAgICBTcmNSZWZTdGVwLCAKLSAgICAgICAgICAgICAgICAgICAgcFJlZlJlY3QsCi0gICAgICAgICAgICAgICAgICAgIHBDdXJyUG9pbnRQb3MsCi0gICAgICAgICAgICAgICAgICAgIHBNRVNwZWMsIAotCi0gICAgICAgICAgICAgICAgICAgIExhbWJkYSwKLSAgICAgICAgICAgICAgICAgICAgJkJsb2NrQ29zdCwgCi0gICAgICAgICAgICAgICAgICAgICZEc3RNViwKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHggKyBQYXJ0U3RhcnRYLCAKLSAgICAgICAgICAgICAgICAgICAgeSArIFBhcnRTdGFydFksCi0gICAgICAgICAgICAgICAgICAgIEJsb2NrV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgIEJsb2NrSGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICByZWYsCi0gICAgICAgICAgICAgICAgICAgIHBSZWZGckFyciwgCi0gICAgICAgICAgICAgICAgICAgIHBNVkFyciwKLSAgICAgICAgICAgICAgICAgICAgJk1WUHJlZCk7Ci0KLSAgICAgICAgICAgICAgICBQYXJ0aXRpb25Db3N0ICs9IEJsb2NrQ29zdDsKLQkJCQkKLQkJCQlPZmZYID0gKFBhcnRTdGFydFggKyB4KSA+PiAyOwotCQkJCU9mZlkgPSAoUGFydFN0YXJ0WSArIHkpID4+IDI7Ci0JCQkJCi0JICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IChCbG9ja0hlaWdodCA+PiAyKTsgaisrKQotCSAgICAgICAgICAgIHsKLQkgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IChCbG9ja1dpZHRoID4+IDIpOyBpKyspCi0JICAgICAgICAgICAgICAgIHsKLQkgICAgICAgICAgICAgICAgICAgIHBNVkFyciBbNCArIE9mZlkgKyBqXVs0ICsgT2ZmWCArIGldLmR4ID0gRHN0TVYuZHg7Ci0JICAgICAgICAgICAgICAgICAgICBwTVZBcnIgWzQgKyBPZmZZICsgal1bNCArIE9mZlggKyBpXS5keSA9IERzdE1WLmR5OwotCSAgICAgICAgICAgICAgICAgICAgcE1WUHJlZEFyciBbT2ZmWSArIGpdW09mZlggKyBpXS5keCA9IE1WUHJlZC5keDsKLQkgICAgICAgICAgICAgICAgICAgIHBNVlByZWRBcnIgW09mZlkgKyBqXVtPZmZYICsgaV0uZHkgPSBNVlByZWQuZHk7Ci0JICAgICAgICAgICAgICAgIH0KLQkgICAgICAgICAgICB9Ci0KLQkJCQlwUmVmRnJBcnIgWzIgKyAoT2ZmWSA+PiAxKV1bMiArIChPZmZYID4+IDEpXSA9IHJlZjsKLQkgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgKEJsb2NrSGVpZ2h0ID4+IDMpOyBqKyspCi0JICAgICAgICAgICAgewotCSAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKEJsb2NrV2lkdGggPj4gMyk7IGkrKykKLQkgICAgICAgICAgICAgICAgewotCQkJICAgICAgICAgICAgcFJlZkZyQXJyIFsyICsgKE9mZlkgPj4gMSkgKyBqXVsyICsgKE9mZlggPj4gMSkgKyBpXSA9IHJlZjsKLQkgICAgICAgICAgICAgICAgfQotCSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLQkJLyoKLQkJICogSWYgUGFydGl0aW9uQ29zdCBpcyBsZXNzIGZvciB0aGlzIHJlZmVyZW5jZSBmcmFtZSwgbW90aW9uIHZlY3RvcnMgbmVlZHMgdG8gYmUgYmFja2VkdXAKLQkJICovCi0gICAgICAgIGlmIChQYXJ0aXRpb25Db3N0IDw9IEJlc3RDb3N0KQotICAgICAgICB7Ci0gICAgICAgICAgICBCZXN0Q29zdCA9IFBhcnRpdGlvbkNvc3Q7ICAgICAgICAgICAgCi0gICAgICAgICAgICBCZXN0UmVmRnJhbWUgPSByZWY7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCAoUGFydEhlaWdodC9CbG9ja0hlaWdodCk7IHkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgKFBhcnRXaWR0aC9CbG9ja1dpZHRoKTsgeCsrKQotICAgICAgICAgICAgICAgIHsKLQkJCQkJT2ZmWCA9IChQYXJ0U3RhcnRYICsgeCAqIEJsb2NrV2lkdGgpID4+IDI7Ci0JCQkJCU9mZlkgPSAoUGFydFN0YXJ0WSArIHkgKiBCbG9ja0hlaWdodCkgPj4gMjsKLQkJCQkKLSAgICAgICAgICAgICAgICAgICAgQmVzdE1WW3ldW3hdLmR4ID0gcE1WQXJyIFs0ICsgT2ZmWV1bNCArIE9mZlhdLmR4OwotICAgICAgICAgICAgICAgICAgICBCZXN0TVZbeV1beF0uZHkgPSBwTVZBcnIgWzQgKyBPZmZZXVs0ICsgT2ZmWF0uZHk7Ci0gICAgICAgICAgICAgICAgICAgIEJlc3RNVlByZWRbeV1beF0uZHggPSBwTVZQcmVkQXJyIFtPZmZZXVtPZmZYXS5keDsKLSAgICAgICAgICAgICAgICAgICAgQmVzdE1WUHJlZFt5XVt4XS5keSA9IHBNVlByZWRBcnIgW09mZlldW09mZlhdLmR5OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi0JLyoKLQkgKiBDb3B5IGJhY2sgYmVzdCByZWZlcmVuY2UgZnJhbWUsIG1vdGlvbiB2ZWN0b3JzIGFuZCBjb3N0LgotCSAqLwotICAgIGZvciAoeSA9IDA7IHkgPCAoUGFydEhlaWdodC9CbG9ja0hlaWdodCk7IHkrKykKLSAgICB7Ci0gICAgICAgIGZvciAoeCA9IDA7IHggPCAoUGFydFdpZHRoL0Jsb2NrV2lkdGgpOyB4KyspCi0gICAgICAgIHsKLQkJCU9mZlggPSAoUGFydFN0YXJ0WCArIHggKiBCbG9ja1dpZHRoKSA+PiAyOwotCQkJT2ZmWSA9IChQYXJ0U3RhcnRZICsgeSAqIEJsb2NrSGVpZ2h0KSA+PiAyOyAgICAgICAgICAgIAotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgKEJsb2NrSGVpZ2h0ID4+IDIpOyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IChCbG9ja1dpZHRoID4+IDIpOyBpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwTVZBcnIgWzQgKyBPZmZZICsgal1bNCArIE9mZlggKyBpXS5keCA9IEJlc3RNVlt5XVt4XS5keDsKLSAgICAgICAgICAgICAgICAgICAgcE1WQXJyIFs0ICsgT2ZmWSArIGpdWzQgKyBPZmZYICsgaV0uZHkgPSBCZXN0TVZbeV1beF0uZHk7Ci0gICAgICAgICAgICAgICAgICAgIHBNVlByZWRBcnIgW09mZlkgKyBqXVtPZmZYICsgaV0uZHggPSBCZXN0TVZQcmVkW3ldW3hdLmR4OwotICAgICAgICAgICAgICAgICAgICBwTVZQcmVkQXJyIFtPZmZZICsgal1bT2ZmWCArIGldLmR5ID0gQmVzdE1WUHJlZFt5XVt4XS5keTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAoQmxvY2tIZWlnaHQgPj4gMyk7IGorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKEJsb2NrV2lkdGggPj4gMyk7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0JCSAgICAgICAgICAgIHBSZWZGckFyciBbMiArIChPZmZZID4+IDEpICsgal1bMiArIChPZmZYID4+IDEpICsgaV0gPSBCZXN0UmVmRnJhbWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0JKnBDb3N0ID0gQmVzdENvc3Q7Ci0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci0KLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnRyYTE2eDE2RXN0aW1hdGlvbgotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgTUItbGV2ZWwgbW90aW9uIGVzdGltYXRpb24gZm9yIElOVEVSIE1CIHR5cGUgYW5kIHNlbGVjdHMgYmVzdCBtb3Rpb24gZXN0aW1hdGlvbiBzdHJhdGVneSBmcm9tIAotICogdGhlIHNldCBvZiBtb2RlcyBzdXBwb3J0ZWQgaW4gYmFzZWxpbmUgcHJvZmlsZSBJU08vSUVDIDE0NDk2LTEwLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gcFNyY0N1cnJCdWYgICAgLSBQb2ludGVyIHRvIHRoZSBzdGFydCBvZiBsdW1hIGNvbXBvbmVudCBvZiBjdXJyZW50IE1hY3JvYmxvY2sgCi0gKiBbaW5dIFNyY0N1cnJTdGVwIC0gU3RlcCBzaXplIGZvciB0aGUgcG9pbnRlciBwU3JjQ3VyckJ1ZiAKLSAqIFtpbl0gcFNyY1JlY0J1ZiAgICAtIFBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIGx1bWEgY29tcG9uZW50IG9mIGNvLWxvY2F0ZWQgcmVjb25zdHJ1Y3RlZCBNQiAKLSAqIFtpbl0gU3JjUmVjU3RlcCAtIFN0ZXAgc2l6ZSBmb3IgdGhlIHBvaW50ZXIgcFNyY1JlY0J1ZiAKLSAqIFtpbl0gbk1CUG9zWCAgICAgLSBQb3NpdGlvbiBvZiBNQiBpbiB0aGUgZnJhbWUgdy5yLnQgWCBheGlzCi0gKiBbaW5dIG5NQlBvc1kgICAgIC0gUG9zaXRpb24gb2YgTUIgaW4gdGhlIGZyYW1lIHcuci50IFkgYXhpcwotICogW2luXSBwTUJJbnRlciAgICAtIEFycmF5LCBvZiBkaW1lbnNpb24gZm91ciwgY29udGFpbmluZyBwb2ludGVycyB0byBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggZm91cgotICogICAgICAgICAgICAgICAgICAgIGFkamFjZW50IHR5cGUgSU5URVIgTUJzIChMZWZ0LCBUb3AsIFRvcC1MZWZ0LCBUb3AtUmlnaHQpLiAKLSAqIFtpbl0gcE1CSW50cmEgICAgLSBBcnJheSwgb2YgZGltZW5zaW9uIGZvdXIsIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGZvdXIKLSAqICAgICAgICAgICAgICAgICAgICBhZGphY2VudCB0eXBlIElOVFJBIE1CcyAoTGVmdCwgVG9wLCBUb3AtTGVmdCwgVG9wLVJpZ2h0KS4gCi0gKiBbaW4vb3V0XSBwU3JjRHN0TUJDdXJyIC0gUG9pbnRlciB0byBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBjdXJyZW50IE1CLiAgRm9sbG93aW5nIG1lbWJlciBzaG91bGQgYmUgc2V0IAotICogICAgICAgICAgICAgICAgICAgIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24KLSAqIFtpbl0gTGFtYmRhICAgICAgLSBGb3IgY2FsY3VsYXRpbmcgdGhlIGNvc3QKLSAqIFtvdXRdIHBDb3N0ICAgICAgLSBQb2ludGVyIHRvIGNvc3QgZm9yIEludHJhMTZ4MTYKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9TdHNfTm9FcnIgLSBObyBFcnJvcgotICogT01YX1N0c19CYWRBcmdFcnIgLSBCYWQgYXJndW1lbnRzOgotICoKLSAqLwotCi1zdGF0aWMgT01YUmVzdWx0IGFybVZDTTRQMTBfSW50cmExNngxNkVzdGltYXRpb24oCi0gICAgY29uc3QgT01YX1U4KiBwU3JjQ3VyckJ1ZiwgICAKLSAgICBPTVhfUzMyIFNyY0N1cnJTdGVwLAotICAgIGNvbnN0IE9NWF9VOCogcFNyY1JlY0J1ZiwgICAKLSAgICBPTVhfUzMyIFNyY1JlY1N0ZXAsCi0JY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKLSAgICBjb25zdCBPTVhWQ000UDEwTUJJbmZvUHRyICpwTUJJbnRlciwKLSAgICBjb25zdCBPTVhWQ000UDEwTUJJbmZvUHRyICpwTUJJbnRyYSwKLSAgICBPTVhWQ000UDEwTUJJbmZvICpwU3JjRHN0TUJDdXJyLAotICAgIE9NWF9VMzIgKnBDb3N0KQotewotICAgIE9NWF9VOCAgICAgIFByZWRCdWYgWzE2KjE2ICsgMTZdOwotICAgIE9NWF9VOCAgICAgICpwUHJlZDsKLSAgICBPTVhfUzMyICAgICBtb2RlOwotICAgIE9NWF9TMzIgICAgIENvc3Q7Ci0gICAgT01YX1MzMiAgICAgYXZhaWxhYmlsaXR5ID0gMDsKLSAgICBPTVhSZXN1bHQgICBSZXQ7Ci0gICAgT01YVkNNNFAxMEludHJhMTZ4MTZQcmVkTW9kZSAgICBJbnRyYU1vZGUxNngxNiBbNF0gPSAKLSAgICAgICAge09NWF9WQ18xNlgxNl9WRVJULCBPTVhfVkNfMTZYMTZfSE9SLCAKLSAgICAgICAgT01YX1ZDXzE2WDE2X0RDLCBPTVhfVkNfMTZYMTZfUExBTkV9OyAgICAgICAgCi0gICAgT01YX1UzMiAgICAgTUJQb3NYID0gcEN1cnJQb2ludFBvcy0+eCA+PiA0OyAgICAgICAgCi0gICAgT01YX1UzMiAgICAgTUJQb3NZID0gcEN1cnJQb2ludFBvcy0+eSA+PiA0OyAgICAgICAgCi0KLQlwUHJlZCA9IGFybUFsaWduVG8xNkJ5dGVzKFByZWRCdWYpOwotICAgIAotCS8qIENoZWNrIGZvciBhdmFpbGFiaWxpdHkgb2YgTEVGVCBNQiAqLwotICAgIGlmICgoTUJQb3NYICE9IDApICYmIChwTUJJbnRyYSBbMF0gIT0gMCB8fCBwTUJJbnRlciBbMF0gIT0gMCkpCi0gICAgewotICAgICAgICBhdmFpbGFiaWxpdHkgfD0gT01YX1ZDX0xFRlQ7ICAgICAgICAKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBmb3IgYXZhaWxhYmlsaXR5IG9mIFVQIE1CICovCi0gICAgaWYgKChNQlBvc1kgIT0gMCkgJiYgKHBNQkludHJhIFsxXSAhPSAwIHx8IHBNQkludGVyIFsxXSAhPSAwKSkKLSAgICB7Ci0gICAgICAgIGF2YWlsYWJpbGl0eSB8PSBPTVhfVkNfVVBQRVI7ICAgICAgICAKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBmb3IgYXZhaWxhYmlsaXR5IG9mIFVQLUxFRlQgTUIgKi8KLSAgICBpZiAoKE1CUG9zWCA+IDApICYmIChNQlBvc1kgPiAwKSAmJiAKLSAgICAgICAgKHBNQkludHJhIFsyXSAhPSAwIHx8IHBNQkludGVyIFsyXSAhPSAwKSkKLSAgICB7Ci0gICAgICAgIGF2YWlsYWJpbGl0eSB8PSBPTVhfVkNfVVBQRVJfTEVGVDsgICAgICAgIAotICAgIH0KLQotICAgICpwQ29zdCA9IEFSTV9WQ000UDEwX01BWF9DT1NUOwotICAgIGZvciAobW9kZSA9IDA7IG1vZGUgPCA0OyBtb2RlKyspCi0gICAgewotICAgICAgICBSZXQgPSBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNigKLSAgICAgICAgICAgICAgICBwU3JjUmVjQnVmIC0gMSwgCi0gICAgICAgICAgICAgICAgcFNyY1JlY0J1ZiAtIFNyY1JlY1N0ZXAsIAotICAgICAgICAgICAgICAgIHBTcmNSZWNCdWYgLSBTcmNSZWNTdGVwIC0gMSwgCi0gICAgICAgICAgICAgICAgcFByZWQsIAotICAgICAgICAgICAgICAgIFNyY1JlY1N0ZXAsIAotICAgICAgICAgICAgICAgIDE2LCAKLSAgICAgICAgICAgICAgICBJbnRyYU1vZGUxNngxNiBbbW9kZV0sIAotICAgICAgICAgICAgICAgIGF2YWlsYWJpbGl0eSk7Ci0gICAgICAgIGlmIChSZXQgPT0gT01YX1N0c19Ob0VycikgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFybVZDQ09NTV9TQUQoICAgIAotICAgICAgICAgICAgICAgIHBTcmNDdXJyQnVmLAotICAgICAgICAgICAgICAgIFNyY0N1cnJTdGVwLAotICAgICAgICAgICAgICAgIHBQcmVkLAotICAgICAgICAgICAgICAgIDE2LAotICAgICAgICAgICAgICAgICZDb3N0LAotICAgICAgICAgICAgICAgIDE2LAotICAgICAgICAgICAgICAgIDE2KTsKLSAgICAgICAgICAgIGlmIChDb3N0IDwgKnBDb3N0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpwQ29zdCA9IENvc3Q7Ci0gICAgICAgICAgICAgICAgcFNyY0RzdE1CQ3Vyci0+SW50cmExNngxNlByZWRNb2RlID0gSW50cmFNb2RlMTZ4MTYgW21vZGVdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgfQotCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50cmE0eDRFc3RpbWF0aW9uCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBNQi1sZXZlbCBtb3Rpb24gZXN0aW1hdGlvbiBmb3IgSW50cmEgNHg0IE1CIHR5cGUgYW5kIHNlbGVjdHMKLSAqIHRoZSBiZXN0IHNldCBvZiBtb2RlcyBzdXBwb3J0ZWQgaW4gYmFzZWxpbmUgcHJvZmlsZS4KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBwU3JjQ3VyckJ1ZiAgICAtIFBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIGx1bWEgY29tcG9uZW50IG9mIGN1cnJlbnQgTWFjcm9ibG9jayAKLSAqIFtpbl0gU3JjQ3VyclN0ZXAgLSBTdGVwIHNpemUgZm9yIHRoZSBwb2ludGVyIHBTcmNDdXJyQnVmIAotICogW2luXSBwU3JjUmVjQnVmICAgIC0gUG9pbnRlciB0byB0aGUgc3RhcnQgb2YgbHVtYSBjb21wb25lbnQgb2YgY28tbG9jYXRlZCByZWNvbnN0cnVjdGVkIE1CIAotICogW2luXSBTcmNSZWNTdGVwIC0gU3RlcCBzaXplIGZvciB0aGUgcG9pbnRlciBwU3JjUmVjQnVmIAotICogW2luXSBuTUJQb3NYICAgICAtIFBvc2l0aW9uIG9mIE1CIGluIHRoZSBmcmFtZSB3LnIudCBYIGF4aXMKLSAqIFtpbl0gbk1CUG9zWSAgICAgLSBQb3NpdGlvbiBvZiBNQiBpbiB0aGUgZnJhbWUgdy5yLnQgWSBheGlzCi0gKiBbaW5dIHBNQkludHJhICAgIC0gQXJyYXksIG9mIGRpbWVuc2lvbiBmb3VyLCBjb250YWluaW5nIHBvaW50ZXJzIHRvIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBmb3VyCi0gKiAgICAgICAgICAgICAgICAgICAgYWRqYWNlbnQgdHlwZSBJTlRSQSBNQnMgKExlZnQsIFRvcCwgVG9wLUxlZnQsIFRvcC1SaWdodCkuIAotICogW2luL291dF0gcFNyY0RzdE1CQ3VyciAtIFBvaW50ZXIgdG8gaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciB0aGUgY3VycmVudCBNQi4gIEZvbGxvd2luZyBtZW1iZXIgc2hvdWxkIGJlIHNldCAKLSAqICAgICAgICAgICAgICAgICAgICBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uCi0gKiBbaW5dIExhbWJkYSAgICAgIC0gRm9yIGNhbGN1bGF0aW5nIHRoZSBjb3N0Ci0gKiBbb3V0XSBwQ29zdCAgICAgIC0gUG9pbnRlciB0byBjb3N0IGZvciBJbnRyYTR4NAotICogUmV0dXJuIFZhbHVlOgotICogT01YX1N0c19Ob0VyciAtIE5vIEVycm9yCi0gKiBPTVhfU3RzX0JhZEFyZ0VyciAtIEJhZCBhcmd1bWVudHM6Ci0gKgotICovCi0KLXN0YXRpYyBPTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRyYTR4NEVzdGltYXRpb24oCi0gICAgY29uc3QgT01YX1U4KiBwU3JjQ3VyckJ1ZiwgICAKLSAgICBPTVhfUzMyIFNyY0N1cnJTdGVwLAotICAgIGNvbnN0IE9NWF9VOCogcFNyY1JlY0J1ZiwgICAKLSAgICBPTVhfUzMyIFNyY1JlY1N0ZXAsCi0gICAgY29uc3QgT01YVkNNNFAxME1CSW5mb1B0ciAqcE1CSW50cmEsCi0gICAgT01YVkNNNFAxME1CSW5mbyAqcFNyY0RzdE1CQ3VyciwKLSAgICBPTVhfVTMyICpwQ29zdCkKLXsKLSAgICBPTVhfUzMyICAgICB4LCB5LCBCbG9jazR4NCwgQmxvY2s4eDg7Ci0gICAgT01YX1MzMiAgICAgQ29zdDsKLQotICAgIC8qCi0gICAgICogUHJlZEludHJhNHg0TW9kZSB3aWxsIHN0b3JlIHByZWRpY3Rpb24gbW9kZXMgb2YgNHg0IGJsb2Nrcy4gCi0gICAgICogTW9kZXMgZm9yIGN1cnJlbnQgTUIgc3RhcnRzIGF0IGluZGV4IFsxXVsxXS4gICAKLSAgICAgKiBNb2RlcyBvZiBuaWdoYm91cmluZyBNQidzIHdpbGwgYmUgYXMgc2hvd24gYmVsb3cKLSAgICAgKiBBIHZhbHVlIG9mIEFSTV9WQ000UDEwX0lOVkFMSURfQkxPQ0sgZm9yIGFueSBibG9jayBpbiB0aGlzIGFycmF5IG1lYW5zIAotICAgICAqIHRoYXQgYmxvY2sgaXMgbm90IGF2YWlsYWJsZSBmb3IgcHJlZGljdGlvbi4KLSAgICAgKgotICAgICAqIGMzIGIwIGIxIGIyIGIzIGQwIGQxIGQyIGQzCi0gICAgICogYTAgeHggeHggeHggeHggLSAgLSAgLSAgLQotICAgICAqIGExIHh4IHh4IHh4IHh4IC0gIC0gIC0gIC0KLSAgICAgKiBhMiB4eCB4eCB4eCB4eCAtICAtICAtICAtCi0gICAgICogYTMgeHggeHggeHggeHggLSAgLSAgLSAgLQotICAgICAqCi0gICAgICovCi0gICAgT01YX1MzMiAgICAgUHJlZEludHJhNHg0TW9kZSBbNV1bOV07Ci0KLSAgICAvKgotICAgICAqIHBTcmNZIHN0b3JlcyByZS1jb25zdHJ1c3RlZCBzb3VyY2UgYXJyYXkgb2Ygc2l6ZSAzTUIgWCAyTUIgYXMgYmVsb3cKLSAgICAgKgotICAgICAqIE1CMTEgTUIxMiBNQjEzIAotICAgICAqIE1CMjEgTUIyMiBNQjIzCi0gICAgICoKLSAgICAgKiBUaGlzIGFycmF5IHdpbGwgYmUgdXNlZCBmb3IgbG9jYWwgcmVjb25zdHJ1Y3Rpb24gb2YgNHg0IGJsb2NrcyAKLSAgICAgKiB3aXRoIGJlc3QgcHJlZGljdGlvbiBtb2RlIHdpdGhpbiBhbiBNQgotICAgICAqLyAgICAKLSAgICBPTVhfVTggICAgICBwU3JjWSBbKDE2KjMpKigxNioyKV07Ci0gICAgT01YX1MzMiAgICAgU3RlcFNyY1k7Ci0gICAgCi0gICAgLyogaW5pdCAqLwotICAgICpwQ29zdCA9IDA7Ci0KLSAgICBmb3IgKHkgPSAwOyB5IDwgNTsgeSsrKQotICAgIHsKLSAgICAgICAgZm9yICh4ID0gMDsgeCA8IDk7IHgrKykKLSAgICAgICAgewotICAgICAgICAgICAgLyogCi0gICAgICAgICAgICAgKiBJbml0aWFsaXplIHdpdGggdmFsdWUgb2YgQVJNX1ZDTTRQMTBfSU5WQUxJRF9CTE9DSywgdG8gbWVhbiB0aGlzIAotICAgICAgICAgICAgICogNHg0IGJsb2NrIGlzIG5vdCBhdmFpbGFibGUgCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFByZWRJbnRyYTR4NE1vZGUgW3ldW3hdID0gQVJNX1ZDTTRQMTBfSU5WQUxJRF9CTE9DSzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIFJlcGxhY2UgQVJNX1ZDTTRQMTBfSU5WQUxJRF9CTE9DSyB2YWx1ZSB3aXRoIGF2YWlsYWJsZSBNQnMgdmFsdWVzKi8KLSAgICBmb3IgKHggPSAwOyB4IDwgNDsgeCsrKQotICAgIHsKLSAgICAgICAgLyogU3RvcmUgdmFsdWVzIG9mIGIwLCBiMSwgYjIsIGIzICovCi0gICAgICAgIGlmIChwTUJJbnRyYVsxXSAhPSBOVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBQcmVkSW50cmE0eDRNb2RlIFswXVt4ICsgMV0gPSAKLSAgICAgICAgICAgICAgICBwTUJJbnRyYVsxXS0+cEludHJhNHg0UHJlZE1vZGVbMyo0ICsgeF07ICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8qIFN0b3JlIHZhbHVlcyBvZiBkMCwgZDEsIGQyLCBkMyAqLwotICAgICAgICBpZiAocE1CSW50cmFbM10gIT0gTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgUHJlZEludHJhNHg0TW9kZSBbMF1beCArIDVdID0gCi0gICAgICAgICAgICAgICAgcE1CSW50cmFbM10tPnBJbnRyYTR4NFByZWRNb2RlWzMqNCArIHhdOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qIFN0b3JlIHZhbHVlcyBvZiBjMyAqLwotICAgIGlmIChwTUJJbnRyYVsyXSAhPSBOVUxMKQotICAgIHsKLSAgICAgICAgUHJlZEludHJhNHg0TW9kZSBbMF1bMF0gPSBwTUJJbnRyYVsyXS0+cEludHJhNHg0UHJlZE1vZGVbMTVdOwotICAgIH0KLSAgICAKLSAgICBmb3IgKHkgPSAwOyB5IDwgNDsgeSsrKQotICAgIHsKLSAgICAgICAgLyogU3RvcmUgdmFsdWVzIG9mIGEwLCBhMSwgYTIsIGEzICovCi0gICAgICAgIGlmIChwTUJJbnRyYVswXSAhPSBOVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBQcmVkSW50cmE0eDRNb2RlIFt5ICsgMV1bMF0gPSAKLSAgICAgICAgICAgICAgICBwTUJJbnRyYVswXS0+cEludHJhNHg0UHJlZE1vZGVbeSo0ICsgM107Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgICAgIAotICAgIC8qCi0gICAgICogVXBkYXRlIG5laWdoYm91cmluZyBQcmVkIG1vZGUgYXJyYXkgd2hpY2ggd2lsbCBiZSB1c2VkIGZvcgotICAgICAqIHByZWRpY3Rpb24gb2YgSW50cmE0eDQgbW9kZXMuCi0gICAgICovCi0gICAgCi0gICAgU3RlcFNyY1kgPSAxNiAqIDM7Ci0gICAgZm9yICh5ID0gMDsgeSA8ICgxNiAqIDIpOyB5KyspCi0gICAgewotICAgICAgICBmb3IgKHggPSAwOyB4IDwgKDE2ICogMyk7IHgrKykKLSAgICAgICAgewotICAgICAgICAgICAgcFNyY1kgW1N0ZXBTcmNZICogeSArIHhdID0gCi0gICAgICAgICAgICAgICAgcFNyY1JlY0J1ZiBbU3JjUmVjU3RlcCAqICh5IC0gMTYpICsgeCAtIDE2XTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKiBmb3IgZWFjaCA4eDggYmxvY2sgKi8KLSAgICBmb3IgKEJsb2NrOHg4ID0gMDsgQmxvY2s4eDggPCA0OyBCbG9jazh4OCsrKQotICAgIHsKLSAgICAgICAgLyogZm9yIGVhY2ggNHg0IGJsb2NrIGluc2lkZSA4eDggYmxvY2sgKi8KLSAgICAgICAgZm9yIChCbG9jazR4NCA9IDA7IEJsb2NrNHg0IDwgNDsgQmxvY2s0eDQrKykKLSAgICAgICAgewotICAgICAgICAgICAgYXJtVkNNNFAxMF9Nb2RlNHg0RGVjaXNpb24gKAotICAgICAgICAgICAgICAgIHBTcmNDdXJyQnVmLCAgIAotICAgICAgICAgICAgICAgIFNyY0N1cnJTdGVwLAotICAgICAgICAgICAgICAgIHBTcmNEc3RNQkN1cnIsCi0gICAgICAgICAgICAgICAgQmxvY2s4eDgsIAotICAgICAgICAgICAgICAgIEJsb2NrNHg0LAotICAgICAgICAgICAgICAgIHBTcmNZICsgMTYgKiBTdGVwU3JjWSArIDE2LAotICAgICAgICAgICAgICAgIFN0ZXBTcmNZLAotICAgICAgICAgICAgICAgIFByZWRJbnRyYTR4NE1vZGUsIAotICAgICAgICAgICAgICAgICZDb3N0KTsKLQotICAgICAgICAgICAgKnBDb3N0ICs9IENvc3Q7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50ZXJNRU1CCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBNQi1sZXZlbCBtb3Rpb24gZXN0aW1hdGlvbiBmb3IgSU5URVIgTUIgdHlwZSBhbmQgc2VsZWN0cyBiZXN0IG1vdGlvbiBlc3RpbWF0aW9uIHN0cmF0ZWd5IGZyb20gCi0gKiB0aGUgc2V0IG9mIG1vZGVzIHN1cHBvcnRlZCBpbiBiYXNlbGluZSBwcm9maWxlIElTTy9JRUMgMTQ0OTYtMTAuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBwU3JjQ3VyckJ1ZiAgICAtIFBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIGx1bWEgY29tcG9uZW50IG9mIGN1cnJlbnQgTWFjcm9ibG9jayAKLSAqIFtpbl0gU3JjQ3VyclN0ZXAgLSBTdGVwIHNpemUgZm9yIHRoZSBwb2ludGVyIHBTcmNDdXJyQnVmIAotICogW2luXSBwU3JjUmVmQnVmTGlzdCAgICAtIFBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIGx1bWEgY29tcG9uZW50IG9mIGNvLWxvY2F0ZWQgcmVmZXJlbmNlIE1CCi0gKiBbaW5dIFNyY1JlZlN0ZXAgLSBTdGVwIHNpemUgZm9yIHRoZSBwb2ludGVyIHBTcmNSZWZZIAotICogW2luXSBwUmVmUmVjdCAgIFBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlZmVyZW5jZSByZWN0YW5nbGU7IHJlbGF0aXZlIHRvIHRoZSBpbWFnZSBvcmlnaW4uCi0gKiBbaW5dIHBDdXJyUG9pbnRQb3MgICBQb3NpdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lLgotICogW2luXSBwTUVTcGVjICAgICAtIE1vdGlvbiBlc3RpbWF0aW9uIHN0cnVjdHVyZQotICogW2luXSBwTUJJbnRlciAgICAtIEFycmF5LCBvZiBkaW1lbnNpb24gZm91ciwgY29udGFpbmluZyBwb2ludGVycyB0byBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggZm91cgotICogICAgICAgICAgICAgICAgICAgIGFkamFjZW50IHR5cGUgSU5URVIgTUJzIChMZWZ0LCBUb3AsIFRvcC1MZWZ0LCBUb3AtUmlnaHQpLiAKLSAqIFtpbi9vdXRdIHBTcmNEc3RNQkN1cnIgLSBQb2ludGVyIHRvIGluZm9ybWF0aW9uIHN0cnVjdHVyZSBmb3IgdGhlIGN1cnJlbnQgTUIuICBGb2xsb3dpbmcgbWVtYmVyIHNob3VsZCBiZSBzZXQgCi0gKiAgICAgICAgICAgICAgICAgICAgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbgotICogW2luXSBMYW1iZGEgICAgICAtIEZvciBjYWxjdWxhdGluZyB0aGUgY29zdAotICogW291dF0gcERzdENvc3QgICAgICAtIFBvaW50ZXIgdG8gY29zdCBmb3IgSW50ZXIgTUIKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9TdHNfTm9FcnIgLSBObyBFcnJvcgotICogT01YX1N0c19CYWRBcmdFcnIgLSBCYWQgYXJndW1lbnRzOgotICoKLSAqLwotCi1zdGF0aWMgT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJNRU1CKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsIAotCU9NWF9TMzIgU3JjQ3VyclN0ZXAsIAotCWNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1Zkxpc3RbQVJNX1ZDTTRQMTBfTUFYX0ZSQU1FU10sCi0JT01YX1MzMiBTcmNSZWZTdGVwLAotCWNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAotCWNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCi0JT01YX1UzMiBMYW1iZGEsCi0Jdm9pZCAqcE1FU3BlYywKLQljb25zdCBPTVhWQ000UDEwTUJJbmZvUHRyICpwTUJJbnRlciwgCi0gICAgT01YVkNNNFAxME1CSW5mb1B0ciBwU3JjRHN0TUJDdXJyLAotCU9NWF9VMzIgKnBEc3RDb3N0KQotewotICAgIE9NWF9TMzIgICAgIGksIGosIHgsIHksIG1vZGU7Ci0gICAgT01YX1UzMiAgICAgQmxvY2s4eDgsIFhQZXJNQiwgWVBlck1CLCBCbG9jazJ4LCBCbG9jazJ5OwotICAgIE9NWF9TMzIgICAgIFBhcnRTdGFydFggPSAwLCBQYXJ0U3RhcnRZID0gMDsKLSAgICBPTVhfUzMyICAgICBQYXJ0V2lkdGggPSA4LCBQYXJ0SGVpZ2h0ID0gOCwgQmxvY2tXaWR0aCA9IDQsIEJsb2NrSGVpZ2h0ID0gNDsKLSAgICBjb25zdCBPTVhfVTMyICAgICBCbGtTeiBbNF1bMl0gPSB7ezQsNH0sIHs0LDh9LCB7OCw0fX07Ci0gICAgY29uc3QgT01YX1UzMiAgICAgUGFydFN6IFs0XVsyXSA9IHt7OCw4fSwgezgsMTZ9LCB7MTYsOH0sIHsxNiwxNn19OwotICAgIGNvbnN0IE9NWFZDTTRQMTBTdWJNYWNyb2Jsb2NrVHlwZSAgICAgCi0gICAgICAgICAgICAgICAgTW9kZVN1Yk1CVHlwZTR4NCBbXSA9IHtPTVhfVkNfU1VCX1BfNHg0LCBPTVhfVkNfU1VCX1BfNHg4LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WQ19TVUJfUF84eDQsIE9NWF9WQ19TVUJfUF84eDh9OwotICAgIGNvbnN0IE9NWFZDTTRQMTBNYWNyb2Jsb2NrVHlwZQotICAgICAgICAgICAgICAgIE1vZGVNQlR5cGUgW10gPSB7T01YX1ZDX1BfOHg4LCBPTVhfVkNfUF84eDE2LCBPTVhfVkNfUF8xNng4LCBPTVhfVkNfUF8xNngxNn07Ci0gICAgCi0gICAgT01YVkNNNFAxME1FUGFyYW1zICAqcE1CT3B0aW9uczsKLSAgICAvKgotICAgICAqIFJlZkZyQXJyIGFuZCAgTVZBcnIgd2lsbCBiZSB1c2VkIGZvciB0ZW1wb3Jhcnkgc3RvcmFnZSBvZiBSZWZlcmVuY2UgZnJhbWUgaW5kZXggYW5kIE1WcwotICAgICAqIEl0IHdpbGwgc3RvcmUgUmVmSW5kZXggYW5kIE1WcyBvZiA2IE1CcyBhcyBzaG93biBiZWxvdwotICAgICAqIAotICAgICAqICAgICB8LS0tLS0tfC0tLS0tLXwtLS0tLS18Ci0gICAgICogICAgIHxUcC1MdCB8VG9wICAgfFRwLVIgIHwKLSAgICAgKiAgICAgfCBNQiAgIHwgTUIgICB8IE1CICAgfAotICAgICAqICAgICB8LS0tLS0tfC0tLS0tLXwtLS0tLS18Ci0gICAgICogICAgIHxMZWZ0ICB8IEN1cnIgfCAgICAgIHwKLSAgICAgKiAgICAgfCBNQiAgIHwgTUIgICB8ICAgICAgfAotICAgICAqICAgICB8LS0tLS0tfC0tLS0tLXwtLS0tLS18Ci0gICAgICovCi0gICAgT01YX1MzMiAgICAgUmVmRnJBcnIgWzRdWzZdOyAKLSAgICBPTVhWQ01vdGlvblZlY3RvciBNVkFyciBbOF1bMTJdOwotICAgIE9NWFZDTW90aW9uVmVjdG9yIE1WUHJlZEFyciBbNF1bNF07Ci0gICAgCi0gICAgLyoKLSAgICAgKiBJbmRleFRvTG9jIHdpbGwgdHJhbnNsYXRlIHBNQkludGVyIGluZGV4IGludG8gc3BhY2lhbCBhcnJhbmdlbWVudCBvZiBNQnMKLSAgICAgKi8KLSAgICBPTVhfUzMyICAgICBJbmRleFRvTG9jIFtdID0gezIsMSwzLDB9OwotICAgIE9NWF9VMzIgICAgIHBhcnQsIE1heFBhcnQ7Ci0gICAgT01YX1MzMiAgICAgQ29zdCwgTW90aW9uQ29zdDh4OCBbNF0sIE1CQ29zdCwgQmVzdENvc3Q7Ci0KLSAgICAvKgotICAgICAqIFVwZGF0ZSBuZWlnaGJvdXJpbmcgTVYgYXJyYXkgYW5kIFJlZiBmcmFtZSBhcnJheSB3aGljaCB3aWxsIGJlIHVzZWQgZm9yCi0gICAgICogcHJlZGljdGlvbiBvZiBNVnMgYW5kIFJlZiBmcmFtZXMuCi0gICAgICovCi0KLSAgICAvKiBTZXQgY29zdCB0byBhIGhpZ2ggdmFsdWUgKi8KLSAgICBDb3N0ID0gQmVzdENvc3QgPSBBUk1fVkNNNFAxMF9NQVhfQ09TVDsKLSAgICAKLSAgICBmb3IgKHkgPSAwOyB5IDwgODsgeSsrKQotICAgIHsKLSAgICAgICAgZm9yICh4ID0gMDsgeCA8IDEyOyB4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGkgPSAzICogKHkgPj4gMikgKyAoeCA+PiAyKTsKLSAgICAgICAgICAgIGlmICgoeSA8IDQgfHwgeCA8IDQpICYmIChwTUJJbnRlcltJbmRleFRvTG9jW2ldXSAhPSBOVUxMKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNVkFyciBbeV1beF0uZHggPSAKLSAgICAgICAgICAgICAgICAgICAgcE1CSW50ZXJbSW5kZXhUb0xvY1tpXV0tPnBNVjBbeSAlIDRdW3ggJSA0XS5keDsKLSAgICAgICAgICAgICAgICBNVkFyciBbeV1beF0uZHkgPSAKLSAgICAgICAgICAgICAgICAgICAgcE1CSW50ZXJbSW5kZXhUb0xvY1tpXV0tPnBNVjBbeSAlIDRdW3ggJSA0XS5keTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNVkFyciBbeV1beF0uZHggPSAwOwotICAgICAgICAgICAgICAgIE1WQXJyIFt5XVt4XS5keSA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9ICAgIAotCi0gICAgZm9yICh5ID0gMDsgeSA8IDQ7IHkrKykKLSAgICB7Ci0gICAgICAgIGZvciAoeCA9IDA7IHggPCA2OyB4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGkgPSAzICogKHkgPj4gMSkgKyAoeCA+PiAxKTsKLSAgICAgICAgICAgIGlmICgoeSA8IDIgfHwgeCA8IDIpICYmIChwTUJJbnRlcltJbmRleFRvTG9jW2ldXSAhPSBOVUxMKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBSZWZGckFyciBbeV1beF0gPSAKLSAgICAgICAgICAgICAgICAgICAgcE1CSW50ZXJbSW5kZXhUb0xvY1tpXV0tPnBSZWZMMElkeCBbKHkgJSAyKSAqIDIgKyAoeCAlIDIpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBSZWZGckFyciBbeV1beF0gPSBBUk1fVkNNNFAxMF9JTlZBTElEX0JMT0NLOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSAgICAKLQotICAgIGZvciAoeSA9IDA7IHkgPCA0OyB5KyspCi0gICAgewotICAgICAgICBmb3IgKHggPSAwOyB4IDwgNDsgeCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBNVlByZWRBcnIgW3ldW3hdLmR4ID0gMDsKLSAgICAgICAgICAgIE1WUHJlZEFyciBbeV1beF0uZHkgPSAwOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qCi0gICAgICogTW90aW9uIEVzdGltYXRpb24gZm9yIDh4OCBNQiBQYXJ0aXRpb24gCi0gICAgICovCi0KLSAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgIHsKLSAgICAgICAgTW90aW9uQ29zdDh4OCBbaV0gPSAwOwotICAgIH0gICAgICAgIAotICAgIAotICAgIHBNQk9wdGlvbnMgPSAoT01YVkNNNFAxME1FUGFyYW1zICopIHBNRVNwZWM7Ci0gICAgCi0gICAgaWYgKHBNQk9wdGlvbnMtPmJsb2NrU3BsaXRFbmFibGU4eDggPT0gMSAmJiAKLSAgICAgICAgcE1CT3B0aW9ucy0+YmxvY2tTcGxpdEVuYWJsZTR4NCA9PSAxKQotICAgIHsKLSAgICAgICAgcFNyY0RzdE1CQ3Vyci0+bWJUeXBlID0gT01YX1ZDX1BfOHg4OwotCi0gICAgICAgIFBhcnRXaWR0aCA9IFBhcnRTeiBbMF1bMF07Ci0gICAgICAgIFBhcnRIZWlnaHQgPSBQYXJ0U3ogWzBdWzFdOwotICAgICAgICAKLSAgICAgICAgLyogRm9yIGVhY2ggOHg4IHBhcnRpdGlvbnMgKi8KLSAgICAgICAgZm9yIChCbG9jazh4OCA9IDA7IEJsb2NrOHg4IDwgNDsgQmxvY2s4eDgrKykKLSAgICAgICAgewotICAgICAgICAgICAgUGFydFN0YXJ0WCA9IChCbG9jazh4OCAlIDIpIDw8IDM7Ci0gICAgICAgICAgICBQYXJ0U3RhcnRZID0gKEJsb2NrOHg4IC8gMikgPDwgMzsKLQotICAgICAgICAgICAgQmxvY2syeCA9IChCbG9jazh4OCAmIDEpIDw8IDE7Ci0gICAgICAgICAgICBCbG9jazJ5ID0gKEJsb2NrOHg4ID4+IDEpIDw8IDE7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIEJlc3RDb3N0ID0gQVJNX1ZDTTRQMTBfTUFYX0NPU1Q7Ci0gICAgICAgICAgICBmb3IgKG1vZGUgPSAwOyBtb2RlIDwgMzsgbW9kZSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEJsb2NrV2lkdGggPSBCbGtTeiBbbW9kZV1bMF07Ci0gICAgICAgICAgICAgICAgQmxvY2tIZWlnaHQgPSBCbGtTeiBbbW9kZV1bMV07Ci0KLSAgICAgICAgICAgICAgICBhcm1WQ000UDEwX1BhcnRpdGlvbk1FICgKLSAgICAgICAgICAgICAgICAgICAgcFNyY0N1cnJCdWYsICAgCi0gICAgICAgICAgICAgICAgICAgIFNyY0N1cnJTdGVwLAotICAgICAgICAgICAgICAgICAgICBwU3JjUmVmQnVmTGlzdCwgICAKLSAgICAgICAgICAgICAgICAgICAgU3JjUmVmU3RlcCwKLSAgICAgICAgICAgICAgICAgICAgcFJlZlJlY3QsCi0gICAgICAgICAgICAgICAgICAgIHBDdXJyUG9pbnRQb3MsCi0gICAgICAgICAgICAgICAgICAgIHBNRVNwZWMsCi0KLSAgICAgICAgICAgICAgICAgICAgUGFydFdpZHRoLAotICAgICAgICAgICAgICAgICAgICBQYXJ0SGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICBCbG9ja1dpZHRoLAotICAgICAgICAgICAgICAgICAgICBCbG9ja0hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgUGFydFN0YXJ0WCwKLSAgICAgICAgICAgICAgICAgICAgUGFydFN0YXJ0WSwKLQotICAgICAgICAgICAgICAgICAgICBNVkFyciwKLSAgICAgICAgICAgICAgICAgICAgUmVmRnJBcnIsCi0gICAgICAgICAgICAgICAgICAgIE1WUHJlZEFyciwKLQotICAgICAgICAgICAgICAgICAgICBMYW1iZGEsCi0gICAgICAgICAgICAgICAgICAgICZDb3N0KTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKENvc3QgPD0gQmVzdENvc3QpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgY29zdCAqLwotICAgICAgICAgICAgICAgICAgICBCZXN0Q29zdCA9IENvc3Q7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgTUJDdXJyIHN0cnVjdCAqLwotICAgICAgICAgICAgICAgICAgICBwU3JjRHN0TUJDdXJyLT5zdWJNQlR5cGUgW0Jsb2NrOHg4XSA9IE1vZGVTdWJNQlR5cGU0eDQgW21vZGVdOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgcFNyY0RzdE1CQ3Vyci0+cFJlZkwwSWR4IFtCbG9jazh4OF0gPSBSZWZGckFyciBbMiArIChQYXJ0U3RhcnRZID4+IDMpXVsyICsgKFBhcnRTdGFydFggPj4gMyldOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBwTVYwIGFuZCBwTVZQcmVkIG9mIE1CQ3VyciBzdHJ1Y3QgKi8KLSAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjRHN0TUJDdXJyLT5wTVYwIFtCbG9jazJ5ICsgal1bQmxvY2syeCArIGldLmR4ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZBcnIgWzQgKyBCbG9jazJ5ICsgal1bNCArIEJsb2NrMnggKyBpXS5keDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjRHN0TUJDdXJyLT5wTVYwIFtCbG9jazJ5ICsgal1bQmxvY2syeCArIGldLmR5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZBcnIgWzQgKyBCbG9jazJ5ICsgal1bNCArIEJsb2NrMnggKyBpXS5keTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjRHN0TUJDdXJyLT5wTVZQcmVkIFtCbG9jazJ5ICsgal1bQmxvY2syeCArIGldLmR4ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZQcmVkQXJyIFtCbG9jazJ5ICsgal1bQmxvY2syeCArIGldLmR4OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcmNEc3RNQkN1cnItPnBNVlByZWQgW0Jsb2NrMnkgKyBqXVtCbG9jazJ4ICsgaV0uZHkgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVlByZWRBcnIgW0Jsb2NrMnkgKyBqXVtCbG9jazJ4ICsgaV0uZHk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qIFVwZGF0ZSBjb3N0ICovCi0gICAgICAgICAgICBNb3Rpb25Db3N0OHg4IFtCbG9jazh4OF0gPSBCZXN0Q29zdDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLyogQ29zdCBmb3IgbWJUeXBlIE9NWF9WQ19QXzh4OCAqLwotICAgICAgICBCZXN0Q29zdCA9IDA7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIEJlc3RDb3N0ICs9IE1vdGlvbkNvc3Q4eDggW2ldOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIFNldCBzdWIgTUIgdHlwZSB0byA4eDggKi8KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgcFNyY0RzdE1CQ3Vyci0+c3ViTUJUeXBlIFtpXSA9IE9NWF9WQ19TVUJfUF84eDg7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIE1vdGlvbiBFc3RpbWF0aW9uIGZvciA4eDgsIDh4MTYsIDE2eDggYW5kIDE2eDE2IE1CIFBhcnRpdGlvbgotICAgICAqIElmIHBNQk9wdGlvbnMtPmI4eDhCbG9ja1NwbGl0RW5hYmxlIGlzIDAsIGRvIG9ubHkgMTZ4MTYgTUUgKG1vZGUgMykKLSAgICAgKi8KLSAgICBmb3IgKG1vZGUgPSAocE1CT3B0aW9ucy0+YmxvY2tTcGxpdEVuYWJsZTh4OCA9PSAxID8gMCA6IDMpOyBtb2RlIDwgNDsgbW9kZSsrKQotICAgIHsKLSAgICAgICAgQmxvY2tXaWR0aCA9IFBhcnRXaWR0aCA9IFBhcnRTeiBbbW9kZV1bMF07Ci0gICAgICAgIEJsb2NrSGVpZ2h0ID0gUGFydEhlaWdodCA9IFBhcnRTeiBbbW9kZV1bMV07Ci0gICAgICAgIAotICAgICAgICBYUGVyTUIgPSAxNiAvIFBhcnRXaWR0aDsKLSAgICAgICAgWVBlck1CID0gMTYgLyBQYXJ0SGVpZ2h0OwotICAgICAgICBNYXhQYXJ0ID0gWFBlck1CICogWVBlck1COwotICAgICAgICAKLSAgICAgICAgTUJDb3N0ID0gMDsKLSAgICAgICAgCi0gICAgICAgIC8qIHBhcnQgc2l6ZSA0LCAyLCAyIGFuZCAxIGNvcnJlc3BvbmRpbmcgdG8gOHg4LCA4eDE2LCAxNng4IGFuZCAxNngxNiBNQiAqLwotICAgICAgICBmb3IgKHBhcnQgPSAwOyBwYXJ0IDwgTWF4UGFydDsgcGFydCsrKQotICAgICAgICB7Ci0gICAgICAgIAlQYXJ0U3RhcnRYID0gKHBhcnQgJSBYUGVyTUIpICogUGFydFdpZHRoOwotICAgICAgICAJUGFydFN0YXJ0WSA9IChwYXJ0IC8gWFBlck1CKSAqIFBhcnRIZWlnaHQ7Ci0gICAgICAgIAkKLSAgICAgICAgICAgIGFybVZDTTRQMTBfUGFydGl0aW9uTUUgKAotICAgICAgICAgICAgICAgIHBTcmNDdXJyQnVmLAotICAgICAgICAgICAgICAgIFNyY0N1cnJTdGVwLAotICAgICAgICAgICAgICAgIHBTcmNSZWZCdWZMaXN0LCAgIAotICAgICAgICAgICAgICAgIFNyY1JlZlN0ZXAsCi0gICAgICAgICAgICAgICAgcFJlZlJlY3QsCi0gICAgICAgICAgICAgICAgcEN1cnJQb2ludFBvcywKLSAgICAgICAgICAgICAgICBwTUVTcGVjLAotCi0gICAgICAgICAgICAgICAgUGFydFdpZHRoLAotICAgICAgICAgICAgICAgIFBhcnRIZWlnaHQsCi0gICAgICAgICAgICAgICAgQmxvY2tXaWR0aCwKLSAgICAgICAgICAgICAgICBCbG9ja0hlaWdodCwKLSAgICAgICAgICAgICAgICBQYXJ0U3RhcnRYLAotICAgICAgICAgICAgICAgIFBhcnRTdGFydFksCi0KLSAgICAgICAgICAgICAgICBNVkFyciwKLSAgICAgICAgICAgICAgICBSZWZGckFyciwKLSAgICAgICAgICAgICAgICBNVlByZWRBcnIsCi0KLSAgICAgICAgICAgICAgICBMYW1iZGEsCi0gICAgICAgICAgICAgICAgJkNvc3QpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIE1CQ29zdCArPSBDb3N0OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKE1CQ29zdCA8PSBCZXN0Q29zdCkKLSAgICAgICAgewotICAgICAgICAgICAgLyogVXBkYXRlIGNvc3QgKi8KLSAgICAgICAgICAgIEJlc3RDb3N0ID0gTUJDb3N0OwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKiBVcGRhdGUgbWJUeXBlIG9mIE1CQ3VyciBzdHJ1Y3QgKi8KLSAgICAgICAgICAgIHBTcmNEc3RNQkN1cnItPm1iVHlwZSA9IE1vZGVNQlR5cGUgW21vZGVdOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKiBVcGRhdGUgcE1WMCBhbmQgcE1WUHJlZCBvZiBNQkN1cnIgc3RydWN0ICovCi0gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwU3JjRHN0TUJDdXJyLT5wTVYwIFtqXVtpXS5keCA9IE1WQXJyIFs0K2pdWzQraV0uZHg7Ci0gICAgICAgICAgICAgICAgICAgIHBTcmNEc3RNQkN1cnItPnBNVjAgW2pdW2ldLmR5ID0gTVZBcnIgWzQral1bNCtpXS5keTsKLSAgICAgICAgICAgICAgICAgICAgcFNyY0RzdE1CQ3Vyci0+cE1WUHJlZCBbal1baV0uZHggPSBNVlByZWRBcnIgW2pdW2ldLmR4OwotICAgICAgICAgICAgICAgICAgICBwU3JjRHN0TUJDdXJyLT5wTVZQcmVkIFtqXVtpXS5keSA9IE1WUHJlZEFyciBbal1baV0uZHk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcFNyY0RzdE1CQ3Vyci0+cFJlZkwwSWR4IFtqKjIraV0gPSBSZWZGckFyciBbMitqXVsyK2ldOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyogVXBkYXRlIEJlc3QgQ29zdCAqLwotICAgICpwRHN0Q29zdCA9IEJlc3RDb3N0OwotICAgIAotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9Nb3Rpb25Fc3RpbWF0aW9uTUIgICAoNi4zLjUuMy4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgTUItbGV2ZWwgbW90aW9uIGVzdGltYXRpb24gYW5kIHNlbGVjdHMgYmVzdCBtb3Rpb24gZXN0aW1hdGlvbiAKLSAqIHN0cmF0ZWd5IGZyb20gdGhlIHNldCBvZiBtb2RlcyBzdXBwb3J0ZWQgaW4gYmFzZWxpbmUgcHJvZmlsZSBbSVNPMTQ0OTYtMTBdLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjQ3VyckJ1ZiAtIFBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gb3JpZ2luYWwgcGljdHVyZSBwbGFuZTsgCi0gKiAgICAgICAgICAgIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAotICogICBwU3JjUmVmQnVmTGlzdCAtIFBvaW50ZXIgdG8gYW4gYXJyYXkgd2l0aCAxNiBlbnRyaWVzLiAgRWFjaCBlbnRyeSBwb2ludHMgCi0gKiAgICAgICAgICAgIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGNvLWxvY2F0ZWQgTUIgaW4gYSByZWZlcmVuY2UgCi0gKiAgICAgICAgICAgIHBpY3R1cmUuICBUaGUgYXJyYXkgaXMgZmlsbGVkIGZyb20gbG93LXRvLWhpZ2ggd2l0aCB2YWxpZCAKLSAqICAgICAgICAgICAgcmVmZXJlbmNlIGZyYW1lIHBvaW50ZXJzOyB0aGUgdW51c2VkIGhpZ2ggZW50cmllcyBzaG91bGQgYmUgc2V0IAotICogICAgICAgICAgICB0byBOVUxMLiAgT3JkZXJpbmcgb2YgdGhlIHJlZmVyZW5jZSBmcmFtZXMgc2hvdWxkIGZvbGxvdyAKLSAqICAgICAgICAgICAgW0lTTzE0NDk2LTEwXSBzdWJjbGF1c2UgOC4yLjQgIERlY29kaW5nIFByb2Nlc3MgZm9yIFJlZmVyZW5jZSAKLSAqICAgICAgICAgICAgUGljdHVyZSBMaXN0cy4gICBUaGUgZW50cmllcyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gCi0gKiAgIHBTcmNSZWNCdWYgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGNvLWxvY2F0ZWQgTUIgaW4gdGhlIAotICogICAgICAgICAgICByZWNvbnN0cnVjdGVkIHBpY3R1cmU7IG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqICAgU3JjQ3VyclN0ZXAgLSBXaWR0aCBvZiB0aGUgb3JpZ2luYWwgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAotICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgIFNyY1JlZlN0ZXAgLSBXaWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKLSAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAotICogICBTcmNSZWNTdGVwIC0gV2lkdGggb2YgdGhlIHJlY29uc3RydWN0ZWQgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAotICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgIHBSZWZSZWN0IC0gUG9pbnRlciB0byB0aGUgdmFsaWQgcmVmZXJlbmNlIHJlY3RhbmdsZTsgcmVsYXRpdmUgdG8gdGhlIAotICogICAgICAgICAgICBpbWFnZSBvcmlnaW4uIAotICogICBwQ3VyclBvaW50UG9zIC0gUG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZS4gCi0gKiAgIExhbWJkYSAtIExhZ3JhbmdlIGZhY3RvciBmb3IgY29tcHV0aW5nIHRoZSBjb3N0IGZ1bmN0aW9uIAotICogICBwTUVTcGVjIC0gUG9pbnRlciB0byB0aGUgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmU7IG11c3QgCi0gKiAgICAgICAgICAgIGhhdmUgYmVlbiBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkIHByaW9yIHRvIGNhbGxpbmcgdGhpcyAKLSAqICAgICAgICAgICAgZnVuY3Rpb24uIAotICogICBwTUJJbnRlciAtIEFycmF5LCBvZiBkaW1lbnNpb24gZm91ciwgY29udGFpbmluZyBwb2ludGVycyB0byBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIGZvdXIgYWRqYWNlbnQgdHlwZSBJTlRFUiBNQnMgKExlZnQsIFRvcCwgCi0gKiAgICAgICAgICAgIFRvcC1MZWZ0LCBUb3AtUmlnaHQpLiBBbnkgcG9pbnRlciBpbiB0aGUgYXJyYXkgbWF5IGJlIHNldCBlcXVhbCAKLSAqICAgICAgICAgICAgdG8gTlVMTCBpZiB0aGUgY29ycmVzcG9uZGluZyBNQiBkb2VzbiB0IGV4aXN0IG9yIGlzIG5vdCBvZiB0eXBlIAotICogICAgICAgICAgICBJTlRFUi4gcE1CSW50ZXJbMF0gLSBQb2ludGVyIHRvIGxlZnQgTUIgaW5mb3JtYXRpb24gcE1CSW50ZXJbMV0gCi0gKiAgICAgICAgICAgIC0gUG9pbnRlciB0byB0b3AgTUIgaW5mb3JtYXRpb24gcE1CSW50ZXJbMl0gLSBQb2ludGVyIHRvIAotICogICAgICAgICAgICB0b3AtbGVmdCBNQiBpbmZvcm1hdGlvbiBwTUJJbnRlclszXSAtIFBvaW50ZXIgdG8gdG9wLXJpZ2h0IE1CIAotICogICAgICAgICAgICBpbmZvcm1hdGlvbiAKLSAqICAgcE1CSW50cmEgLSBBcnJheSwgb2YgZGltZW5zaW9uIGZvdXIsIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gaW5mb3JtYXRpb24gCi0gKiAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCBmb3VyIGFkamFjZW50IHR5cGUgSU5UUkEgTUJzIChMZWZ0LCBUb3AsIAotICogICAgICAgICAgICBUb3AtTGVmdCwgVG9wLVJpZ2h0KS4gQW55IHBvaW50ZXIgaW4gdGhlIGFycmF5IG1heSBiZSBzZXQgZXF1YWwgCi0gKiAgICAgICAgICAgIHRvIE5VTEwgaWYgdGhlIGNvcnJlc3BvbmRpbmcgTUIgZG9lc24gdCBleGlzdCBvciBpcyBub3Qgb2YgdHlwZSAKLSAqICAgICAgICAgICAgSU5UUkEuIHBNQkludHJhWzBdIC0gUG9pbnRlciB0byBsZWZ0IE1CIGluZm9ybWF0aW9uIHBNQkludHJhWzFdIAotICogICAgICAgICAgICAtIFBvaW50ZXIgdG8gdG9wIE1CIGluZm9ybWF0aW9uIHBNQkludHJhWzJdIC0gUG9pbnRlciB0byAKLSAqICAgICAgICAgICAgdG9wLWxlZnQgTUIgaW5mb3JtYXRpb24gcE1CSW50cmFbM10gLSBQb2ludGVyIHRvIHRvcC1yaWdodCBNQiAKLSAqICAgICAgICAgICAgaW5mb3JtYXRpb24gCi0gKiAgIHBTcmNEc3RNQkN1cnIgLSBQb2ludGVyIHRvIGluZm9ybWF0aW9uIHN0cnVjdHVyZSBmb3IgdGhlIGN1cnJlbnQgTUIuICAKLSAqICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBlbnRyaWVzIHNob3VsZCBiZSBzZXQgcHJpb3IgdG8gY2FsbGluZyB0aGUgCi0gKiAgICAgICAgICAgIGZ1bmN0aW9uOiAgc2xpY2VJRCAtIHRoZSBudW1iZXIgb2YgdGhlIHNsaWNlIHRoZSB0byB3aGljaCB0aGUgCi0gKiAgICAgICAgICAgIGN1cnJlbnQgTUIgYmVsb25ncy4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RDb3N0IC0gUG9pbnRlciB0byB0aGUgbWluaW11bSBtb3Rpb24gY29zdCBmb3IgdGhlIGN1cnJlbnQgTUIuIAotICogICBwRHN0QmxvY2tTQUQgLSBQb2ludGVyIHRvIHRoZSBhcnJheSBvZiBTQURzIGZvciBlYWNoIG9mIHRoZSBzaXh0ZWVuIGx1bWEgCi0gKiAgICAgICAgICAgIDR4NCBibG9ja3MgaW4gZWFjaCBNQi4gIFRoZSBibG9jayBTQURzIGFyZSBpbiBzY2FuIG9yZGVyIGZvciAKLSAqICAgICAgICAgICAgZWFjaCBNQi4gIEZvciBpbXBsZW1lbnRhdGlvbnMgdGhhdCBjYW5ub3QgY29tcHV0ZSB0aGUgU0FEIHZhbHVlcyAKLSAqICAgICAgICAgICAgaW5kaXZpZHVhbGx5LCB0aGUgbWF4aW11bSBwb3NzaWJsZSB2YWx1ZSAoMHhmZmZmKSBpcyByZXR1cm5lZCAKLSAqICAgICAgICAgICAgZm9yIGVhY2ggb2YgdGhlIDE2IGJsb2NrIFNBRCBlbnRyaWVzLiAKLSAqICAgcFNyY0RzdE1CQ3VyciAtIFBvaW50ZXIgdG8gdXBkYXRlZCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBjdXJyZW50IAotICogICAgICAgICAgICBNQiBhZnRlciBNQi1sZXZlbCBtb3Rpb24gZXN0aW1hdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQuICBUaGUgCi0gKiAgICAgICAgICAgIGZvbGxvd2luZyBmaWVsZHMgYXJlIHVwZGF0ZWQgYnkgdGhlIE1FIGZ1bmN0aW9uLiAgIFRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgIHBhcmFtZXRlciBzZXQgcXVhbnRpZmllcyB0aGUgTUItbGV2ZWwgTUUgc2VhcmNoIHJlc3VsdHM6IE1iVHlwZSAKLSAqICAgICAgICAgICAgc3ViTUJUeXBlWzRdIHBNVjBbNF1bNF0gcE1WUHJlZFs0XVs0XSBwUmVmTDBJZHhbNF0gCi0gKiAgICAgICAgICAgIEludHJhMTZ4MTZQcmVkTW9kZSBwSW50cmE0eDRQcmVkTW9kZVs0XVs0XSAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgIE9uZSBvZiBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0N1cnJCdWYsIAotICogICAgICAgICAgIHBTcmNSZWZCdWZMaXN0LCBwU3JjUmVjQnVmLCBwUmVmUmVjdCwgcEN1cnJQb2ludFBvcywgcE1FU3BlYywgCi0gKiAgICAgICAgICAgcE1CSW50ZXIsIHBNQkludHJhLHBTcmNEc3RNQkN1cnIsIHBEc3RDb3N0LCBwU3JjUmVmQnVmTGlzdFswXSAKLSAqICAgIC0gICAgU3JjUmVmU3RlcCwgU3JjUmVjU3RlcCBhcmUgbm90IG11bHRpcGxlcyBvZiAxNiAKLSAqICAgIC0gICAgaUJsb2NrV2lkdGggb3IgaUJsb2NrSGVpZ2h0IGFyZSB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNi4gCi0gKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKLSAqCi0gKi8KLSAKLU9NWFJlc3VsdCBvbXhWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQiggICAgICAgICAgICAgICAgICAgIAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCU9NWF9TMzIgU3JjQ3VyclN0ZXAsIAotCWNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1Zkxpc3RbQVJNX1ZDTTRQMTBfTUFYX0ZSQU1FU10sCi0JT01YX1MzMiBTcmNSZWZTdGVwLAotCWNvbnN0IE9NWF9VOCAqcFNyY1JlY0J1ZiwgCi0JT01YX1MzMiBTcmNSZWNTdGVwLAotCWNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAotCWNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCi0JT01YX1UzMiBMYW1iZGEsCi0Jdm9pZCAqcE1FU3BlYywKLQljb25zdCBPTVhWQ000UDEwTUJJbmZvUHRyICpwTUJJbnRlciwgCi0JY29uc3QgT01YVkNNNFAxME1CSW5mb1B0ciAqcE1CSW50cmEsCi0gICAgT01YVkNNNFAxME1CSW5mbyAqcFNyY0RzdE1CQ3VyciwKLQlPTVhfSU5UICpwRHN0Q29zdCwKLSAgICBPTVhfVTE2ICpwRHN0QmxvY2tTQUQpCi17Ci0gICAgT01YX1UzMiAgICAgQ29zdCwgaSwgSW50cmFGbGFnID0gMTsKLSAgICBPTVhWQ000UDEwTUVQYXJhbXMgICpwTUVQYXJhbXM7IAotCi0gICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY0N1cnJCdWYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY1JlZkJ1Zkxpc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY1JlY0J1ZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwUmVmUmVjdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwQ3VyclBvaW50UG9zID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBNRVNwZWMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocE1CSW50ZXIgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocE1CSW50cmEgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdE1CQ3VyciA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0Q29zdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihTcmNSZWZTdGVwIDw9IDAgfHwgU3JjUmVmU3RlcCAmIDE1LCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihTcmNSZWNTdGVwIDw9IDAgfHwgU3JjUmVjU3RlcCAmIDE1LCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihTcmNDdXJyU3RlcCA8PSAwIHx8IFNyY0N1cnJTdGVwICYgMTUsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIAotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDE2Qnl0ZUFsaWduZWQocFNyY0N1cnJCdWYpLCBPTVhfU3RzX0JhZEFyZ0VycikgICAgCi0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90MTZCeXRlQWxpZ25lZChwU3JjUmVjQnVmKSwgT01YX1N0c19CYWRBcmdFcnIpCi0KLSAgICBmb3IgKGkgPSAwOyBpIDwgQVJNX1ZDTTRQMTBfTUFYX0ZSQU1FUzsgaSsrKQotICAgIHsKLSAgICAgICAgYXJtUmV0QXJnRXJySWYocFNyY1JlZkJ1Zkxpc3QgW2ldICE9IE5VTEwgJiYKLSAgICAgICAgICAgIGFybU5vdDE2Qnl0ZUFsaWduZWQocFNyY1JlZkJ1Zkxpc3QgW2ldKSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgICAgICAgICAKLSAgICAgICAgLyogQ2hlY2sgaWYgY3VycmVudCBNQiBuZWVkcyBJTlRFUiBjb3N0IGNhbGN1bGF0aW9ucyAqLwotICAgICAgICBpZiAocFNyY1JlZkJ1Zkxpc3QgW2ldICE9IE5VTEwgJiYgSW50cmFGbGFnID09IDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEludHJhRmxhZyA9IDA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAqcERzdENvc3QgPSBBUk1fVkNNNFAxMF9NQVhfQ09TVDsKLSAgICAvKgotICAgICAqIEludGVyIGNvc3QgY2FsY3VsYXRpb25zIAotICAgICAqLwotCi0gICAgIC8qIGNoZWNrIHRoaXMgTUIgY2FuIGJlIEludGVyICovCi0gICAgaWYgKEludHJhRmxhZyAhPSAxKQotICAgIHsKLSAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJNRU1CKAotICAgICAgICAgICAgIHBTcmNDdXJyQnVmLCAgIAotICAgICAgICAgICAgIFNyY0N1cnJTdGVwLAotICAgICAgICAgICAgIHBTcmNSZWZCdWZMaXN0LCAgIAotICAgICAgICAgICAgIFNyY1JlZlN0ZXAsCi0gICAgICAgICAgICAgcFJlZlJlY3QsICAgIAotICAgICAgICAgICAgIHBDdXJyUG9pbnRQb3MsCi0gICAgICAgICAgICAgTGFtYmRhLAotICAgICAgICAgICAgIHBNRVNwZWMsCi0gICAgICAgICAgICAgcE1CSW50ZXIsCi0gICAgICAgICAgICAgcFNyY0RzdE1CQ3VyciwKLSAgICAgICAgICAgICAmQ29zdAotICAgICAgICAgICAgICk7Ci0gICAgICAgIAotICAgICAgICAqcERzdENvc3QgPSBDb3N0OwotICAgIH0gICAgIAotCi0gICAgcE1FUGFyYW1zID0gKE9NWFZDTTRQMTBNRVBhcmFtcyAqKXBNRVNwZWM7Ci0gICAgCi0gICAgaWYgKHBNRVBhcmFtcy0+aW50cmFFbmFibGU0eDQgPT0gMSkKLSAgICB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIEludHJhIDR4NCBjb3N0IGNhbGN1bGF0aW9ucwotICAgICAgICAgKi8KLSAgICAgICAgYXJtVkNNNFAxMF9JbnRyYTR4NEVzdGltYXRpb24oCi0gICAgICAgICAgICBwU3JjQ3VyckJ1ZiwgICAKLSAgICAgICAgICAgIFNyY0N1cnJTdGVwLAotICAgICAgICAgICAgcFNyY1JlY0J1ZiwgICAKLSAgICAgICAgICAgIFNyY1JlY1N0ZXAsCi0gICAgICAgICAgICBwTUJJbnRyYSwKLSAgICAgICAgICAgIHBTcmNEc3RNQkN1cnIsCi0gICAgICAgICAgICAmQ29zdAotICAgICAgICAgICAgKTsKLQotICAgICAgICBpZiAoQ29zdCA8PSAqcERzdENvc3QpCi0gICAgICAgIHsKLSAgICAgICAgICAgICpwRHN0Q29zdCA9IENvc3Q7Ci0gICAgICAgICAgICBwU3JjRHN0TUJDdXJyLT5tYlR5cGUgPSBPTVhfVkNfSU5UUkFfNHg0OwotCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgfQotCi0gICAgLyoKLSAgICAgKiBDb3N0IGZvciBJbnRyYSAxNngxNiBtb2RlCi0gICAgICovCi0KLSAgICBhcm1WQ000UDEwX0ludHJhMTZ4MTZFc3RpbWF0aW9uKAotICAgICAgICBwU3JjQ3VyckJ1ZiwgICAKLSAgICAgICAgU3JjQ3VyclN0ZXAsCi0gICAgICAgIHBTcmNSZWNCdWYsICAgCi0gICAgICAgIFNyY1JlY1N0ZXAsCi0gICAgICAgIHBDdXJyUG9pbnRQb3MsCi0gICAgICAgIHBNQkludGVyLAotICAgICAgICBwTUJJbnRyYSwKLSAgICAgICAgcFNyY0RzdE1CQ3VyciwKLSAgICAgICAgJkNvc3QKLSAgICAgICAgKTsKLQotICAgIGlmIChDb3N0IDw9ICpwRHN0Q29zdCkKLSAgICB7Ci0gICAgICAgICpwRHN0Q29zdCA9IENvc3Q7Ci0gICAgICAgIHBTcmNEc3RNQkN1cnItPm1iVHlwZSA9IE9NWF9WQ19JTlRSQV8xNngxNjsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFVwZGF0ZSBwRHN0QmxvY2tTQUQgdG8gbWF4IHZhbHVlCi0gICAgICovCi0JYXJtVkNNNFAxMF9DYWxjdWxhdGVCbG9ja1NBRCgJcFNyY0RzdE1CQ3VyciwgCi0gICAgICAgIHBTcmNDdXJyQnVmLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAJU3JjQ3VyclN0ZXAsIAotICAgIAlwU3JjUmVmQnVmTGlzdCwKLSAgICAJU3JjUmVmU3RlcCwKLSAgICAJcFNyY1JlY0J1ZiwgCi0gICAgCVNyY1JlY1N0ZXAsCi0gICAgCXBSZWZSZWN0LAotICAgIAlwQ3VyclBvaW50UG9zLAotICAgIAlwTUJJbnRlciwgCi0gICAgCXBNQkludHJhLAotICAgIAlwRHN0QmxvY2tTQUQpOwotCi0KLQlyZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NTA3NzEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4LmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBILjI2NCBDaHJvbWEgOHg4IGludHJhIHByZWRpY3Rpb24gbW9kdWxlCi0gKiAKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0vKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtIERDIHN0eWxlIGludHJhIHByZWRpY3Rpb24sIHVwcGVyIGJsb2NrIGhhcyBwcmlvcml0eQotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBTcmNMZWZ0CQlQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgMTYgbGVmdCBjb2VmZmljaWVudHM6Ci0gKgkJCQkJCQkJcFt4LCB5XSAoeCA9IC0xLCB5ID0gMC4uMykKLSAqIFtpbl0JcFNyY0Fib3ZlCQlQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgMTYgYWJvdmUgY29lZmZpY2llbnRzOgotICoJCQkJCQkJCXBbeCx5XSAoeCA9IDAuLjMsIHkgPSAtMSkKLSAqIFtpbl0JbGVmdFN0ZXAJCVN0ZXAgb2YgbGVmdCBjb2VmZmljaWVudCBidWZmZXIKLSAqIFtpbl0JZHN0U3RlcAkJCVN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgotICogW2luXQlhdmFpbGFiaWxpdHkJTmVpZ2hib3JpbmcgMTZ4MTYgTUIgYXZhaWxhYmlsaXR5IGZsYWcKLSAqIFtvdXRdCXBEc3QJCQlQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBOb25lCi0gKi8KLQotc3RhdGljIHZvaWQgYXJtVkNNNFAxMF9QcmVkaWN0SW50cmFEQ1VwNHg0KAotICAgICBjb25zdCBPTVhfVTgqIHBTcmNMZWZ0LAotICAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZSwKLSAgICAgT01YX1U4KiBwRHN0LAotICAgICBPTVhfSU5UIGxlZnRTdGVwLAotICAgICBPTVhfSU5UIGRzdFN0ZXAsCi0gICAgIE9NWF9TMzIgYXZhaWxhYmlsaXR5ICAgICAgICAKLSkKLXsKLSAgICBpbnQgeCwgeSwgU3VtPTAsIENvdW50ID0gMDsKLQotICAgIGlmIChhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVIpCi0gICAgewotICAgICAgICBmb3IgKHg9MDsgeDw0OyB4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN1bSArPSBwU3JjQWJvdmVbeF07Ci0gICAgICAgIH0KLSAgICAgICAgQ291bnQrKzsKLSAgICB9Ci0gICAgZWxzZSBpZiAoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX0xFRlQpCi0gICAgewotICAgICAgICBmb3IgKHk9MDsgeTw0OyB5KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN1bSArPSBwU3JjTGVmdFt5KmxlZnRTdGVwXTsKLSAgICAgICAgfQotICAgICAgICBDb3VudCsrOwotICAgIH0KLSAgICBpZiAoQ291bnQ9PTApCi0gICAgewotICAgICAgICBTdW0gPSAxMjg7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIFN1bSA9IChTdW0gKyAyKSA+PiAyOwotICAgIH0KLSAgICBmb3IgKHk9MDsgeTw0OyB5KyspCi0gICAgewotICAgICAgICBmb3IgKHg9MDsgeDw0OyB4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBEc3RbeSpkc3RTdGVwK3hdID0gKE9NWF9VOClTdW07Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8qCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm0gREMgc3R5bGUgaW50cmEgcHJlZGljdGlvbiwgbGVmdCBibG9jayBoYXMgcHJpb3JpdHkKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwU3JjTGVmdAkJUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDE2IGxlZnQgY29lZmZpY2llbnRzOgotICoJCQkJCQkJCXBbeCwgeV0gKHggPSAtMSwgeSA9IDAuLjMpCi0gKiBbaW5dCXBTcmNBYm92ZQkJUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDE2IGFib3ZlIGNvZWZmaWNpZW50czoKLSAqCQkJCQkJCQlwW3gseV0gKHggPSAwLi4zLCB5ID0gLTEpCi0gKiBbaW5dCWxlZnRTdGVwCQlTdGVwIG9mIGxlZnQgY29lZmZpY2llbnQgYnVmZmVyCi0gKiBbaW5dCWRzdFN0ZXAJCQlTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKLSAqIFtpbl0JYXZhaWxhYmlsaXR5CU5laWdoYm9yaW5nIDE2eDE2IE1CIGF2YWlsYWJpbGl0eSBmbGFnCi0gKiBbb3V0XQlwRHN0CQkJUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogTm9uZQotICovCi0KLXN0YXRpYyB2b2lkIGFybVZDTTRQMTBfUHJlZGljdEludHJhRENMZWZ0NHg0KAotICAgICBjb25zdCBPTVhfVTgqIHBTcmNMZWZ0LAotICAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZSwKLSAgICAgT01YX1U4KiBwRHN0LAotICAgICBPTVhfSU5UIGxlZnRTdGVwLAotICAgICBPTVhfSU5UIGRzdFN0ZXAsCi0gICAgIE9NWF9TMzIgYXZhaWxhYmlsaXR5ICAgICAgICAKLSkKLXsKLSAgICBpbnQgeCwgeSwgU3VtPTAsIENvdW50ID0gMDsKLQotICAgIGlmIChhdmFpbGFiaWxpdHkgJiBPTVhfVkNfTEVGVCkKLSAgICB7Ci0gICAgICAgIGZvciAoeT0wOyB5PDQ7IHkrKykKLSAgICAgICAgewotICAgICAgICAgICAgU3VtICs9IHBTcmNMZWZ0W3kqbGVmdFN0ZXBdOwotICAgICAgICB9Ci0gICAgICAgIENvdW50Kys7Ci0gICAgfQotICAgIGVsc2UgaWYgKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUikKLSAgICB7Ci0gICAgICAgIGZvciAoeD0wOyB4PDQ7IHgrKykKLSAgICAgICAgewotICAgICAgICAgICAgU3VtICs9IHBTcmNBYm92ZVt4XTsKLSAgICAgICAgfQotICAgICAgICBDb3VudCsrOwotICAgIH0KLSAgICBpZiAoQ291bnQ9PTApCi0gICAgewotICAgICAgICBTdW0gPSAxMjg7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIFN1bSA9IChTdW0gKyAyKSA+PiAyOwotICAgIH0KLSAgICBmb3IgKHk9MDsgeTw0OyB5KyspCi0gICAgewotICAgICAgICBmb3IgKHg9MDsgeDw0OyB4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBEc3RbeSpkc3RTdGVwK3hdID0gKE9NWF9VOClTdW07Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDggICAoNi4zLjMuMS4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgaW50cmEgcHJlZGljdGlvbiBmb3IgY2hyb21hIHNhbXBsZXMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNMZWZ0IC0gUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDggbGVmdCBwaXhlbHM6IHBbeCwgeV0gKHggPSAtMSwgeT0gCi0gKiAgICAgICAgICAgIDAuLjcpLiAKLSAqICAgcFNyY0Fib3ZlIC0gUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDggYWJvdmUgcGl4ZWxzOiBwW3gseV0gKHggPSAwLi43LCB5IAotICogICAgICAgICAgICA9IC0xKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBTcmNBYm92ZUxlZnQgLSBQb2ludGVyIHRvIHRoZSBhYm92ZSBsZWZ0IHBpeGVsczogcFt4LHldICh4ID0gLTEsIHkgPSAtMSkgCi0gKiAgIGxlZnRTdGVwIC0gU3RlcCBvZiBsZWZ0IHBpeGVsIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBkc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIHByZWRNb2RlIC0gSW50cmEgY2hyb21hIHByZWRpY3Rpb24gbW9kZSwgcGxlYXNlIHJlZmVyIHRvIHNlY3Rpb24gMy40LjMuIAotICogICBhdmFpbGFiaWxpdHkgLSBOZWlnaGJvcmluZyBjaHJvbWEgYmxvY2sgYXZhaWxhYmlsaXR5IGZsYWcsIHBsZWFzZSByZWZlciAKLSAqICAgICAgICAgICAgdG8gICJOZWlnaGJvcmluZyBNYWNyb2Jsb2NrIEF2YWlsYWJpbGl0eSIuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKLSAqICAgIElmIGFueSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCi0gKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAotICogICAgcERzdCBpcyBOVUxMLiAKLSAqICAgIGRzdFN0ZXAgPCA4IG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgICBsZWZ0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgIHByZWRNb2RlIGlzIG5vdCBpbiB0aGUgdmFsaWQgcmFuZ2Ugb2YgZW51bWVyYXRpb24gCi0gKiAgICAgICAgICAgICAgT01YVkNNNFAxMEludHJhQ2hyb21hUHJlZE1vZGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDX0NIUk9NQV9WRVJULCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAotICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUiBpbmRpY2F0aW5nIHBbeCwtMV0gKHggPSAwLi43KSBpcyBub3QgYXZhaWxhYmxlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ19DSFJPTUFfSE9SLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19MRUZUIAotICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFstMSx5XSAoeSA9IDAuLjcpIGlzIG5vdCBhdmFpbGFibGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDX0NIUk9NQV9QTEFORSwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKLSAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVJfTEVGVCBvciBPTVhfVkNfVVBQRVIgb3IgT01YX1ZDX0xFRlQgaW5kaWNhdGluZyAKLSAqICAgICAgICAgICAgICBwW3gsLTFdKHggPSAwLi43KSwgb3IgcFstMSx5XSAoeSA9IDAuLjcpLCBvciBwWy0xLC0xXSBpcyBub3QgCi0gKiAgICAgICAgICAgICAgYXZhaWxhYmxlLiAKLSAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUiwgYnV0IHBTcmNBYm92ZSBpcyBOVUxMLiAKLSAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19MRUZULCBidXQgcFNyY0xlZnQgaXMgTlVMTC4gCi0gKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVJfTEVGVCwgYnV0IHBTcmNBYm92ZUxlZnQgaXMgTlVMTC4gCi0gKiAgICBlaXRoZXIgcFNyY0Fib3ZlIG9yIHBEc3QgaXMgbm90IGFsaWduZWQgb24gYSA4LWJ5dGUgYm91bmRhcnkuICBOb3RlOiAKLSAqICAgICAgICAgICAgICBwU3JjQWJvdmUsIHBTcmNBYm92ZSwgcFNyY0Fib3ZlTGVmdCBtYXkgYmUgaW52YWxpZCBwb2ludGVyIGlmIAotICogICAgICAgICAgICAgIHRoZXkgYXJlIG5vdCB1c2VkIGJ5IGludHJhIHByZWRpY3Rpb24gaW1wbGllZCBpbiBwcmVkTW9kZS4gCi0gKiAgICAgICAgICAgICAgIE5vdGU6IE9NWF9WQ19VUFBFUl9SSUdIVCBpcyBub3QgdXNlZCBpbiBpbnRyYSBjaHJvbWEgCi0gKiAgICAgICAgICAgICAgcHJlZGljdGlvbi4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4KAotICAgICBjb25zdCBPTVhfVTgqIHBTcmNMZWZ0LAotICAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZSwKLSAgICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmVMZWZ0LAotICAgICBPTVhfVTgqIHBEc3QsCi0gICAgIE9NWF9JTlQgbGVmdFN0ZXAsCi0gICAgIE9NWF9JTlQgZHN0U3RlcCwKLSAgICAgT01YVkNNNFAxMEludHJhQ2hyb21hUHJlZE1vZGUgcHJlZE1vZGUsCi0gICAgIE9NWF9TMzIgYXZhaWxhYmlsaXR5ICAgICAgICAKLSApCi17Ci0gICAgaW50IHgsIHksIFN1bTsKLSAgICBpbnQgSCwgViwgYSwgYiwgYzsKLQotICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGRzdFN0ZXAgPCA4LCAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChkc3RTdGVwICUgOCkgIT0gMCwgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigobGVmdFN0ZXAgJSA4KSAhPSAwLCAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDhCeXRlQWxpZ25lZChwU3JjQWJvdmUpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90OEJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUikgICAgICAmJiBwU3JjQWJvdmUgICAgID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX0xFRlQgKSAgICAgICYmIHBTcmNMZWZ0ICAgICAgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVJfTEVGVCkgJiYgcFNyY0Fib3ZlTGVmdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ19DSFJPTUFfVkVSVCAgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVIpLCAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDX0NIUk9NQV9IT1IgICAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19MRUZUKSwgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfQ0hST01BX1BMQU5FICYmICEoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX1VQUEVSKSwgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ19DSFJPTUFfUExBTkUgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVJfTEVGVCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDX0NIUk9NQV9QTEFORSAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19MRUZUKSwgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCh1bnNpZ25lZClwcmVkTW9kZSA+IE9NWF9WQ19DSFJPTUFfUExBTkUsICAgT01YX1N0c19CYWRBcmdFcnIpOyAgICAKLQotICAgIHN3aXRjaCAocHJlZE1vZGUpCi0gICAgewotICAgIGNhc2UgT01YX1ZDX0NIUk9NQV9EQzoKLSAgICAgICAgYXJtVkNNNFAxMF9QcmVkaWN0SW50cmFEQzR4NCggICAgICAgcFNyY0xlZnQsICAgICAgICAgICAgcFNyY0Fib3ZlLCAgIHBEc3QsICAgICAgICAgICAgIGxlZnRTdGVwLCBkc3RTdGVwLCBhdmFpbGFiaWxpdHkpOwotICAgICAgICBhcm1WQ000UDEwX1ByZWRpY3RJbnRyYURDVXA0eDQoICAgICBwU3JjTGVmdCwgICAgICAgICAgICBwU3JjQWJvdmUrNCwgcERzdCs0LCAgICAgICAgICAgbGVmdFN0ZXAsIGRzdFN0ZXAsIGF2YWlsYWJpbGl0eSk7Ci0gICAgICAgIGFybVZDTTRQMTBfUHJlZGljdEludHJhRENMZWZ0NHg0KCAgIHBTcmNMZWZ0KzQqbGVmdFN0ZXAsIHBTcmNBYm92ZSwgICBwRHN0KzQqZHN0U3RlcCwgICBsZWZ0U3RlcCwgZHN0U3RlcCwgYXZhaWxhYmlsaXR5KTsKLSAgICAgICAgYXJtVkNNNFAxMF9QcmVkaWN0SW50cmFEQzR4NCggICAgICAgcFNyY0xlZnQrNCpsZWZ0U3RlcCwgcFNyY0Fib3ZlKzQsIHBEc3QrNCs0KmRzdFN0ZXAsIGxlZnRTdGVwLCBkc3RTdGVwLCBhdmFpbGFiaWxpdHkpOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgT01YX1ZDX0NIUk9NQV9IT1I6Ci0gICAgICAgIGZvciAoeT0wOyB5PDg7IHkrKykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yICh4PTA7IHg8ODsgeCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBEc3RbeSpkc3RTdGVwK3hdID0gcFNyY0xlZnRbeSpsZWZ0U3RlcF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9NWF9WQ19DSFJPTUFfVkVSVDoKLSAgICAgICAgZm9yICh5PTA7IHk8ODsgeSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKHg9MDsgeDw4OyB4KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcERzdFt5KmRzdFN0ZXAreF0gPSBwU3JjQWJvdmVbeF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9NWF9WQ19DSFJPTUFfUExBTkU6Ci0gICAgICAgIEggPSA0KihwU3JjQWJvdmVbN10gLSBwU3JjQWJvdmVMZWZ0WzBdKTsKLSAgICAgICAgZm9yICh4PTI7IHg+PTA7IHgtLSkKLSAgICAgICAgewotICAgICAgICAgICAgSCArPSAoeCsxKSoocFNyY0Fib3ZlWzQreF0gLSBwU3JjQWJvdmVbMi14XSk7Ci0gICAgICAgIH0KLSAgICAgICAgViA9IDQqKHBTcmNMZWZ0WzcqbGVmdFN0ZXBdIC0gcFNyY0Fib3ZlTGVmdFswXSk7Ci0gICAgICAgIGZvciAoeT0yOyB5Pj0wOyB5LS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIFYgKz0gKHkrMSkqKHBTcmNMZWZ0Wyg0K3kpKmxlZnRTdGVwXSAtIHBTcmNMZWZ0WygyLXkpKmxlZnRTdGVwXSk7Ci0gICAgICAgIH0KLSAgICAgICAgYSA9IDE2KihwU3JjQWJvdmVbN10gKyBwU3JjTGVmdFs3KmxlZnRTdGVwXSk7Ci0gICAgICAgIGIgPSAoMTcqSCsxNik+PjU7Ci0gICAgICAgIGMgPSAoMTcqVisxNik+PjU7Ci0gICAgICAgIGZvciAoeT0wOyB5PDg7IHkrKykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yICh4PTA7IHg8ODsgeCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN1bSA9IChhICsgYiooeC0zKSArIGMqKHktMykgKyAxNik+PjU7Ci0gICAgICAgICAgICAgICAgcERzdFt5KmRzdFN0ZXAreF0gPSAoT01YX1U4KWFybUNsaXAoMCwyNTUsU3VtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzQ0NTI2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIEguMjY0IDE2eDE2IGludHJhIHByZWRpY3Rpb24gbW9kdWxlCi0gKiAKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYgICAoNi4zLjMuMS4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybSBJbnRyYV8xNngxNiBwcmVkaWN0aW9uIGZvciBsdW1hIHNhbXBsZXMuIElmIHRoZSB1cHBlci1yaWdodCBibG9jayAKLSAqIGlzIG5vdCBhdmFpbGFibGUsIHRoZW4gZHVwbGljYXRpb24gd29yayBzaG91bGQgYmUgaGFuZGxlZCBpbnNpZGUgdGhlIAotICogZnVuY3Rpb24uIFVzZXJzIG5lZWQgbm90IGRlZmluZSB0aGVtIG91dHNpZGUuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNMZWZ0IC0gUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDE2IGxlZnQgcGl4ZWxzOiBwW3gsIHldICh4ID0gLTEsIHkgPSAKLSAqICAgICAgICAgICAgMC4uMTUpIAotICogICBwU3JjQWJvdmUgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgMTYgYWJvdmUgcGl4ZWxzOiBwW3gseV0gKHggPSAwLi4xNSwgCi0gKiAgICAgICAgICAgIHk9IC0xKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBTcmNBYm92ZUxlZnQgLSBQb2ludGVyIHRvIHRoZSBhYm92ZSBsZWZ0IHBpeGVsczogcFt4LHldICh4ID0gLTEsIHkgPSAtMSkgCi0gKiAgIGxlZnRTdGVwIC0gU3RlcCBvZiBsZWZ0IHBpeGVsIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgZHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgcHJlZE1vZGUgLSBJbnRyYV8xNngxNiBwcmVkaWN0aW9uIG1vZGUsIHBsZWFzZSByZWZlciB0byBzZWN0aW9uIDMuNC4xLiAKLSAqICAgYXZhaWxhYmlsaXR5IC0gTmVpZ2hib3JpbmcgMTZ4MTYgTUIgYXZhaWxhYmlsaXR5IGZsYWcuIFJlZmVyIHRvIAotICogICAgICAgICAgICAgICAgICBzZWN0aW9uIDMuNC40LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKLSAqICAgIElmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCi0gKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAotICogICAgcERzdCBpcyBOVUxMLiAKLSAqICAgIGRzdFN0ZXAgPCAxNi4gb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgICBsZWZ0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgICBwcmVkTW9kZSBpcyBub3QgaW4gdGhlIHZhbGlkIHJhbmdlIG9mIGVudW1lcmF0aW9uIAotICogICAgICAgICAgICAgIE9NWFZDTTRQMTBJbnRyYTE2eDE2UHJlZE1vZGUgCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfMTZYMTZfVkVSVCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKLSAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVIgaW5kaWNhdGluZyBwW3gsLTFdICh4ID0gMC4uMTUpIGlzIG5vdCBhdmFpbGFibGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzE2WDE2X0hPUiwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfTEVGVCAKLSAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbLTEseV0gKHkgPSAwLi4xNSkgaXMgbm90IGF2YWlsYWJsZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfMTZYMTZfUExBTkUsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCi0gKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSX0xFRlQgb3IgT01YX1ZDX1VQUEVSIG9yIE9NWF9WQ19MRUZUIGluZGljYXRpbmcgCi0gKiAgICAgICAgICAgICAgcFt4LC0xXSh4ID0gMC4uMTUpLCBvciBwWy0xLHldICh5ID0gMC4uMTUpLCBvciBwWy0xLC0xXSBpcyBub3QgCi0gKiAgICAgICAgICAgICAgYXZhaWxhYmxlLiAKLSAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUiwgYnV0IHBTcmNBYm92ZSBpcyBOVUxMLiAKLSAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19MRUZULCBidXQgcFNyY0xlZnQgaXMgTlVMTC4gCi0gKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVJfTEVGVCwgYnV0IHBTcmNBYm92ZUxlZnQgaXMgTlVMTC4gCi0gKiAgICBlaXRoZXIgcFNyY0Fib3ZlIG9yIHBEc3QgaXMgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgCi0gKgotICogTm90ZTogCi0gKiAgICAgcFNyY0Fib3ZlLCBwU3JjQWJvdmUsIHBTcmNBYm92ZUxlZnQgbWF5IGJlIGludmFsaWQgcG9pbnRlcnMgaWYgCi0gKiAgICAgdGhleSBhcmUgbm90IHVzZWQgYnkgaW50cmEgcHJlZGljdGlvbiBpbXBsaWVkIGluIHByZWRNb2RlLiAKLSAqIE5vdGU6IAotICogICAgIE9NWF9WQ19VUFBFUl9SSUdIVCBpcyBub3QgdXNlZCBpbiBpbnRyYV8xNngxNiBsdW1hIHByZWRpY3Rpb24uIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2KAotICAgIGNvbnN0IE9NWF9VOCogcFNyY0xlZnQsIAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlLCAKLSAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZUxlZnQsIAotICAgIE9NWF9VOCogcERzdCwgCi0gICAgT01YX0lOVCBsZWZ0U3RlcCwgCi0gICAgT01YX0lOVCBkc3RTdGVwLCAKLSAgICBPTVhWQ000UDEwSW50cmExNngxNlByZWRNb2RlIHByZWRNb2RlLCAKLSAgICBPTVhfUzMyIGF2YWlsYWJpbGl0eSkKLXsKLSAgICBpbnQgeCx5LFN1bSxDb3VudDsKLSAgICBpbnQgSCxWLGEsYixjOwotCi0gICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoZHN0U3RlcCA8IDE2LCAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChkc3RTdGVwICUgMTYpICE9IDAsICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKGxlZnRTdGVwICUgMTYpICE9IDAsICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90MTZCeXRlQWxpZ25lZChwU3JjQWJvdmUpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90MTZCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOyAgICAgICAgCi0gICAgYXJtUmV0QXJnRXJySWYoKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUikgICAgICAmJiBwU3JjQWJvdmUgICAgID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX0xFRlQgKSAgICAgICYmIHBTcmNMZWZ0ICAgICAgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVJfTEVGVCkgJiYgcFNyY0Fib3ZlTGVmdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ18xNlgxNl9WRVJUICAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUiksICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfMTZYMTZfSE9SICAgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfTEVGVCksICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDXzE2WDE2X1BMQU5FICYmICEoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX1VQUEVSKSwgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ18xNlgxNl9QTEFORSAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUl9MRUZUKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfMTZYMTZfUExBTkUgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfTEVGVCksICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigodW5zaWduZWQpcHJlZE1vZGUgPiBPTVhfVkNfMTZYMTZfUExBTkUsICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0KLSAgICBzd2l0Y2ggKHByZWRNb2RlKQotICAgIHsKLSAgICBjYXNlIE9NWF9WQ18xNlgxNl9WRVJUOgotICAgICAgICBmb3IgKHk9MDsgeTwxNjsgeSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKHg9MDsgeDwxNjsgeCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBEc3RbeSpkc3RTdGVwK3hdID0gcFNyY0Fib3ZlW3hdOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPTVhfVkNfMTZYMTZfSE9SOgotICAgICAgICBmb3IgKHk9MDsgeTwxNjsgeSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKHg9MDsgeDwxNjsgeCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBEc3RbeSpkc3RTdGVwK3hdID0gcFNyY0xlZnRbeSpsZWZ0U3RlcF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9NWF9WQ18xNlgxNl9EQzoKLSAgICAgICAgLyogVGhpcyBjYW4gYWx3YXlzIGJlIHVzZWQgZXZlbiBpZiBubyBibG9ja3MgYXZhaWxhYmxlICovCi0gICAgICAgIFN1bSA9IDA7Ci0gICAgICAgIENvdW50ID0gMDsKLSAgICAgICAgaWYgKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19MRUZUKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKHk9MDsgeTwxNjsgeSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN1bSArPSBwU3JjTGVmdFt5KmxlZnRTdGVwXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENvdW50Kys7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUikKLSAgICAgICAgewotICAgICAgICAgICAgZm9yICh4PTA7IHg8MTY7IHgrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdW0gKz0gcFNyY0Fib3ZlW3hdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ291bnQrKzsKLSAgICAgICAgfQotICAgICAgICBpZiAoQ291bnQ9PTApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN1bSA9IDEyODsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChDb3VudD09MSkKLSAgICAgICAgewotICAgICAgICAgICAgU3VtID0gKFN1bSArIDgpID4+IDQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSAvKiBDb3VudCA9IDIgKi8KLSAgICAgICAgewotICAgICAgICAgICAgU3VtID0gKFN1bSArIDE2KSA+PiA1OwotICAgICAgICB9Ci0gICAgICAgIGZvciAoeT0wOyB5PDE2OyB5KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoeD0wOyB4PDE2OyB4KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcERzdFt5KmRzdFN0ZXAreF0gPSAoT01YX1U4KVN1bTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgT01YX1ZDXzE2WDE2X1BMQU5FOgotICAgICAgICBIID0gOCoocFNyY0Fib3ZlWzE1XSAtIHBTcmNBYm92ZUxlZnRbMF0pOwotICAgICAgICBmb3IgKHg9NjsgeD49MDsgeC0tKQotICAgICAgICB7Ci0gICAgICAgICAgICBIICs9ICh4KzEpKihwU3JjQWJvdmVbOCt4XSAtIHBTcmNBYm92ZVs2LXhdKTsKLSAgICAgICAgfQotICAgICAgICBWID0gOCoocFNyY0xlZnRbMTUqbGVmdFN0ZXBdIC0gcFNyY0Fib3ZlTGVmdFswXSk7Ci0gICAgICAgIGZvciAoeT02OyB5Pj0wOyB5LS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIFYgKz0gKHkrMSkqKHBTcmNMZWZ0Wyg4K3kpKmxlZnRTdGVwXSAtIHBTcmNMZWZ0Wyg2LXkpKmxlZnRTdGVwXSk7Ci0gICAgICAgIH0KLSAgICAgICAgYSA9IDE2KihwU3JjQWJvdmVbMTVdICsgcFNyY0xlZnRbMTUqbGVmdFN0ZXBdKTsKLSAgICAgICAgYiA9ICg1KkgrMzIpPj42OwotICAgICAgICBjID0gKDUqViszMik+PjY7Ci0gICAgICAgIGZvciAoeT0wOyB5PDE2OyB5KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoeD0wOyB4PDE2OyB4KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3VtID0gKGEgKyBiKih4LTcpICsgYyooeS03KSArIDE2KT4+NTsKLSAgICAgICAgICAgICAgICBwRHN0W3kqZHN0U3RlcCt4XSA9IChPTVhfVTgpYXJtQ2xpcCgwLDI1NSxTdW0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGMyNWY2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzUzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NC5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogSC4yNjQgNHg0IGludHJhIHByZWRpY3Rpb24gbW9kdWxlCi0gKiAKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0ICAgKDYuMy4zLjEuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm0gSW50cmFfNHg0IHByZWRpY3Rpb24gZm9yIGx1bWEgc2FtcGxlcy4gSWYgdGhlIHVwcGVyLXJpZ2h0IGJsb2NrIGlzIAotICogbm90IGF2YWlsYWJsZSwgdGhlbiBkdXBsaWNhdGlvbiB3b3JrIHNob3VsZCBiZSBoYW5kbGVkIGluc2lkZSB0aGUgZnVuY3Rpb24uIAotICogVXNlcnMgbmVlZCBub3QgZGVmaW5lIHRoZW0gb3V0c2lkZS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0xlZnQgLSAgUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDQgbGVmdCBwaXhlbHM6IAotICogICAgICAgICAgICAgICAgICBwW3gsIHldICh4ID0gLTEsIHkgPSAwLi4zKSAKLSAqICAgcFNyY0Fib3ZlIC0gUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDggYWJvdmUgcGl4ZWxzOiAKLSAqICAgICAgICAgICAgICAgICAgcFt4LHldICh4ID0gMC4uNywgeSA9LTEpOyAKLSAqICAgICAgICAgICAgICAgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcFNyY0Fib3ZlTGVmdCAtIFBvaW50ZXIgdG8gdGhlIGFib3ZlIGxlZnQgcGl4ZWxzOiBwW3gseV0gKHggPSAtMSwgeSA9IC0xKSAKLSAqICAgbGVmdFN0ZXAgLSBTdGVwIG9mIGxlZnQgcGl4ZWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgIGRzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgcHJlZE1vZGUgLSBJbnRyYV80eDQgcHJlZGljdGlvbiBtb2RlLiAKLSAqICAgYXZhaWxhYmlsaXR5IC0gTmVpZ2hib3JpbmcgNHg0IGJsb2NrIGF2YWlsYWJpbGl0eSBmbGFnLCByZWZlciB0byAKLSAqICAgICAgICAgICAgICJOZWlnaGJvcmluZyBNYWNyb2Jsb2NrIEF2YWlsYWJpbGl0eSIgLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKLSAqICAgIElmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCi0gKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAotICogICAgcERzdCBpcyBOVUxMLiAKLSAqICAgIGRzdFN0ZXAgPCA0LCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQuIAotICogICAgbGVmdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgICBwcmVkTW9kZSBpcyBub3QgaW4gdGhlIHZhbGlkIHJhbmdlIG9mIGVudW1lcmF0aW9uIAotICogICAgICAgICAgICAgIE9NWFZDTTRQMTBJbnRyYTR4NFByZWRNb2RlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfVkVSVCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfVVBQRVIgCi0gKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwW3gsLTFdICh4ID0gMC4uMykgaXMgbm90IGF2YWlsYWJsZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X0hPUiwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfTEVGVCAKLSAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbLTEseV0gKHkgPSAwLi4zKSBpcyBub3QgYXZhaWxhYmxlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfRElBR19ETCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKLSAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVIgaW5kaWNhdGluZyBwW3gsIDFdICh4ID0gMC4uMykgaXMgbm90IGF2YWlsYWJsZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X0RJQUdfRFIsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCi0gKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSX0xFRlQgb3IgT01YX1ZDX1VQUEVSIG9yIE9NWF9WQ19MRUZUIGluZGljYXRpbmcgCi0gKiAgICAgICAgICAgICAgcFt4LC0xXSAoeCA9IDAuLjMpLCBvciBwWy0xLHldICh5ID0gMC4uMykgb3IgcFstMSwtMV0gaXMgbm90IAotICogICAgICAgICAgICAgIGF2YWlsYWJsZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X1ZSLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAotICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUl9MRUZUIG9yIE9NWF9WQ19VUFBFUiBvciBPTVhfVkNfTEVGVCBpbmRpY2F0aW5nIAotICogICAgICAgICAgICAgIHBbeCwtMV0gKHggPSAwLi4zKSwgb3IgcFstMSx5XSAoeSA9IDAuLjMpIG9yIHBbLTEsLTFdIGlzIG5vdCAKLSAqICAgICAgICAgICAgICBhdmFpbGFibGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9IRCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKLSAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVJfTEVGVCBvciBPTVhfVkNfVVBQRVIgb3IgT01YX1ZDX0xFRlQgaW5kaWNhdGluZyAKLSAqICAgICAgICAgICAgICBwW3gsLTFdICh4ID0gMC4uMyksIG9yIHBbLTEseV0gKHkgPSAwLi4zKSBvciBwWy0xLC0xXSBpcyBub3QgCi0gKiAgICAgICAgICAgICAgYXZhaWxhYmxlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfVkwsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX1VQUEVSIAotICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFt4LC0xXSAoeCA9IDAuLjMpIGlzIG5vdCBhdmFpbGFibGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9IVSwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfTEVGVCAKLSAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbLTEseV0gKHkgPSAwLi4zKSBpcyBub3QgYXZhaWxhYmxlLiAKLSAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUiwgYnV0IHBTcmNBYm92ZSBpcyBOVUxMLiAKLSAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19MRUZULCBidXQgcFNyY0xlZnQgaXMgTlVMTC4gCi0gKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVJfTEVGVCwgYnV0IHBTcmNBYm92ZUxlZnQgaXMgTlVMTC4gCi0gKiAgICBlaXRoZXIgcFNyY0Fib3ZlIG9yIHBEc3QgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICAKLSAqCi0gKiBOb3RlOiAKLSAqICAgICBwU3JjQWJvdmUsIHBTcmNBYm92ZSwgcFNyY0Fib3ZlTGVmdCBtYXkgYmUgaW52YWxpZCBwb2ludGVycyBpZiAKLSAqICAgICB0aGV5IGFyZSBub3QgdXNlZCBieSBpbnRyYSBwcmVkaWN0aW9uIGFzIGltcGxpZWQgaW4gcHJlZE1vZGUuIAotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0KAotICAgICBjb25zdCBPTVhfVTgqIHBTcmNMZWZ0LAotICAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZSwKLSAgICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmVMZWZ0LAotICAgICBPTVhfVTgqIHBEc3QsCi0gICAgIE9NWF9JTlQgbGVmdFN0ZXAsCi0gICAgIE9NWF9JTlQgZHN0U3RlcCwKLSAgICAgT01YVkNNNFAxMEludHJhNHg0UHJlZE1vZGUgcHJlZE1vZGUsCi0gICAgIE9NWF9TMzIgYXZhaWxhYmlsaXR5ICAgICAgICAKLSApCi17Ci0gICAgaW50IHgsIHk7Ci0gICAgT01YX1U4IHBUbXBbMTBdOwotCi0gICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKGxlZnRTdGVwICUgNCkgIT0gMCwgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoZHN0U3RlcCAlIDQpICE9IDAsICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKGRzdFN0ZXAgPCA0KSwgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocFNyY0Fib3ZlKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOyAgICAKLSAgICBhcm1SZXRBcmdFcnJJZigoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX1VQUEVSKSAgICAgICYmIHBTcmNBYm92ZSAgICAgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChhdmFpbGFiaWxpdHkgJiBPTVhfVkNfTEVGVCApICAgICAgJiYgcFNyY0xlZnQgICAgICA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUl9MRUZUKSAmJiBwU3JjQWJvdmVMZWZ0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDXzRYNF9WRVJUICAgICYmICEoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX1VQUEVSKSwgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ180WDRfSE9SICAgICAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19MRUZUKSwgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfNFg0X0RJQUdfREwgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVIpLCAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDXzRYNF9ESUFHX0RSICYmICEoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX1VQUEVSKSwgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ180WDRfRElBR19EUiAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUl9MRUZUKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfNFg0X0RJQUdfRFIgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfTEVGVCksICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDXzRYNF9WUiAgICAgICYmICEoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX1VQUEVSKSwgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ180WDRfVlIgICAgICAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUl9MRUZUKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfNFg0X1ZSICAgICAgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfTEVGVCksICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDXzRYNF9IRCAgICAgICYmICEoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX1VQUEVSKSwgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ180WDRfSEQgICAgICAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUl9MRUZUKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfNFg0X0hEICAgICAgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfTEVGVCksICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDXzRYNF9WTCAgICAgICYmICEoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX1VQUEVSKSwgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ180WDRfSFUgICAgICAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19MRUZUKSwgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCh1bnNpZ25lZClwcmVkTW9kZSA+IE9NWF9WQ180WDRfSFUsICAgT01YX1N0c19CYWRBcmdFcnIpOyAgICAKLSAgICAKLSAgICAvKiBOb3RlOiBUaGlzIGNvZGUgbXVzdCBub3QgcmVhZCB0aGUgcFNyYyBhcnJheXMgdW5sZXNzIHRoZSBjb3JyZXNwb25kaW5nCi0gICAgICogYmxvY2sgaXMgbWFya2VkIGFzIGF2YWlsYWJsZS4gSWYgdGhlIGJsb2NrIGlzIG5vdCBhdmFpYmFibGUgdGhlbiBwU3JjCi0gICAgICogbWF5IG5vdCBiZSBhIHZhbGlkIHBvaW50ZXIuCi0gICAgICoKLSAgICAgKiBOb3RlOiBUbyBtYWtlIHRoZSBjb2RlIG1vcmUgcmVhZGFibGUgd2UgcmVmZXIgdG8gdGhlIG5laWdoYm91cmluZyBwaXhlbHMKLSAgICAgKiBpbiB2YXJpYWJsZXMgbmFtZWQgYXMgYmVsb3c6Ci0gICAgICoKLSAgICAgKiAgICBVTCBVMCBVMSBVMiBVMyBVNCBVNSBVNiBVNwotICAgICAqICAgIEwwIHh4IHh4IHh4IHh4Ci0gICAgICogICAgTDEgeHggeHggeHggeHgKLSAgICAgKiAgICBMMiB4eCB4eCB4eCB4eAotICAgICAqICAgIEwzIHh4IHh4IHh4IHh4Ci0gICAgICovCi0gICAgIAotI2RlZmluZSBVTCBwU3JjQWJvdmVMZWZ0WzBdCi0jZGVmaW5lIFUwIHBTcmNBYm92ZVswXQotI2RlZmluZSBVMSBwU3JjQWJvdmVbMV0KLSNkZWZpbmUgVTIgcFNyY0Fib3ZlWzJdCi0jZGVmaW5lIFUzIHBTcmNBYm92ZVszXQotI2RlZmluZSBVNCBwU3JjQWJvdmVbNF0KLSNkZWZpbmUgVTUgcFNyY0Fib3ZlWzVdCi0jZGVmaW5lIFU2IHBTcmNBYm92ZVs2XQotI2RlZmluZSBVNyBwU3JjQWJvdmVbN10KLSNkZWZpbmUgTDAgcFNyY0xlZnRbMCpsZWZ0U3RlcF0KLSNkZWZpbmUgTDEgcFNyY0xlZnRbMSpsZWZ0U3RlcF0KLSNkZWZpbmUgTDIgcFNyY0xlZnRbMipsZWZ0U3RlcF0KLSNkZWZpbmUgTDMgcFNyY0xlZnRbMypsZWZ0U3RlcF0KLQotICAgIHN3aXRjaCAocHJlZE1vZGUpCi0gICAgewotICAgIGNhc2UgT01YX1ZDXzRYNF9WRVJUOgotICAgICAgICBmb3IgKHk9MDsgeTw0OyB5KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBEc3RbeSpkc3RTdGVwKzBdID0gVTA7Ci0gICAgICAgICAgICBwRHN0W3kqZHN0U3RlcCsxXSA9IFUxOwotICAgICAgICAgICAgcERzdFt5KmRzdFN0ZXArMl0gPSBVMjsKLSAgICAgICAgICAgIHBEc3RbeSpkc3RTdGVwKzNdID0gVTM7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9NWF9WQ180WDRfSE9SOgotICAgICAgICBmb3IgKHg9MDsgeDw0OyB4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBEc3RbMCpkc3RTdGVwK3hdID0gTDA7Ci0gICAgICAgICAgICBwRHN0WzEqZHN0U3RlcCt4XSA9IEwxOwotICAgICAgICAgICAgcERzdFsyKmRzdFN0ZXAreF0gPSBMMjsKLSAgICAgICAgICAgIHBEc3RbMypkc3RTdGVwK3hdID0gTDM7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgCi0gICAgY2FzZSBPTVhfVkNfNFg0X0RDOgotICAgICAgICAvKiBUaGlzIGNhbiBhbHdheXMgYmUgdXNlZCBldmVuIGlmIG5vIGJsb2NrcyBhdmFpbGFibGUgKi8KLSAgICAgICAgYXJtVkNNNFAxMF9QcmVkaWN0SW50cmFEQzR4NChwU3JjTGVmdCwgcFNyY0Fib3ZlLCBwRHN0LCBsZWZ0U3RlcCwgZHN0U3RlcCwgYXZhaWxhYmlsaXR5KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICAgIAotICAgIGNhc2UgT01YX1ZDXzRYNF9ESUFHX0RMOgotICAgICAgICBwVG1wWzBdID0gKE9NWF9VOCkoKFUwICsgMipVMSArIFUyICsgMik+PjIpOwotICAgICAgICBwVG1wWzFdID0gKE9NWF9VOCkoKFUxICsgMipVMiArIFUzICsgMik+PjIpOwotICAgICAgICBpZiAoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX1VQUEVSX1JJR0hUKQotICAgICAgICB7Ci0gICAgICAgICAgICBwVG1wWzJdID0gKE9NWF9VOCkoKFUyICsgMipVMyArIFU0ICsgMik+PjIpOwotICAgICAgICAgICAgcFRtcFszXSA9IChPTVhfVTgpKChVMyArIDIqVTQgKyBVNSArIDIpPj4yKTsKLSAgICAgICAgICAgIHBUbXBbNF0gPSAoT01YX1U4KSgoVTQgKyAyKlU1ICsgVTYgKyAyKT4+Mik7Ci0gICAgICAgICAgICBwVG1wWzVdID0gKE9NWF9VOCkoKFU1ICsgMipVNiArIFU3ICsgMik+PjIpOwotICAgICAgICAgICAgcFRtcFs2XSA9IChPTVhfVTgpKChVNiArIDMqVTcgICAgICArIDIpPj4yKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBUbXBbMl0gPSAoT01YX1U4KSgoVTIgKyAzKlUzICAgICAgKyAyKT4+Mik7Ci0gICAgICAgICAgICBwVG1wWzNdID0gVTM7Ci0gICAgICAgICAgICBwVG1wWzRdID0gVTM7Ci0gICAgICAgICAgICBwVG1wWzVdID0gVTM7Ci0gICAgICAgICAgICBwVG1wWzZdID0gVTM7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yICh5PTA7IHk8NDsgeSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKHg9MDsgeDw0OyB4KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcERzdFt5KmRzdFN0ZXAreF0gPSBwVG1wW3greV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9NWF9WQ180WDRfRElBR19EUjogICAgICAgIAotICAgICAgICAvKiB4LXkgPSAtMywgLTIsIC0xLCAwLCAxLCAyLCAzICovCi0gICAgICAgIHBUbXBbMF0gPSAoT01YX1U4KSgoTDEgKyAyKkwyICsgTDMgKyAyKT4+Mik7Ci0gICAgICAgIHBUbXBbMV0gPSAoT01YX1U4KSgoTDAgKyAyKkwxICsgTDIgKyAyKT4+Mik7Ci0gICAgICAgIHBUbXBbMl0gPSAoT01YX1U4KSgoVUwgKyAyKkwwICsgTDEgKyAyKT4+Mik7Ci0gICAgICAgIHBUbXBbM10gPSAoT01YX1U4KSgoVTAgKyAyKlVMICsgTDAgKyAyKT4+Mik7Ci0gICAgICAgIHBUbXBbNF0gPSAoT01YX1U4KSgoVTEgKyAyKlUwICsgVUwgKyAyKT4+Mik7Ci0gICAgICAgIHBUbXBbNV0gPSAoT01YX1U4KSgoVTIgKyAyKlUxICsgVTAgKyAyKT4+Mik7Ci0gICAgICAgIHBUbXBbNl0gPSAoT01YX1U4KSgoVTMgKyAyKlUyICsgVTEgKyAyKT4+Mik7Ci0gICAgICAgIGZvciAoeT0wOyB5PDQ7IHkrKykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yICh4PTA7IHg8NDsgeCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBEc3RbeSpkc3RTdGVwK3hdID0gcFRtcFszK3gteV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9NWF9WQ180WDRfVlI6Ci0gICAgICAgIC8qIHpWUj0yeC15ID0gLTMsIC0yLCAtMSwgMCwgMSwgMiwgMywgNCwgNSwgNgotICAgICAgICAgKiB4LSh5Pj4xKSA9IC0xLCAtMSwgIDAsIDAsIDEsIDEsIDIsIDIsIDMsIDMKLSAgICAgICAgICogeSAgICAgICAgPSAgMywgIDIsICA/LCA/LCA/LCA/LCA/LCA/LCAxLCAwCi0gICAgICAgICAqLwotICAgICAgICBwVG1wWzBdID0gKE9NWF9VOCkoKEwyICsgMipMMSArIEwwICsgMik+PjIpOwotICAgICAgICBwVG1wWzFdID0gKE9NWF9VOCkoKEwxICsgMipMMCArIFVMICsgMik+PjIpOwotICAgICAgICBwVG1wWzJdID0gKE9NWF9VOCkoKEwwICsgMipVTCArIFUwICsgMik+PjIpOwotICAgICAgICBwVG1wWzNdID0gKE9NWF9VOCkoKFVMICsgVTAgKyAxKT4+MSk7Ci0gICAgICAgIHBUbXBbNF0gPSAoT01YX1U4KSgoVUwgKyAyKlUwICsgVTEgKyAyKT4+Mik7Ci0gICAgICAgIHBUbXBbNV0gPSAoT01YX1U4KSgoVTAgKyBVMSArIDEpPj4xKTsKLSAgICAgICAgcFRtcFs2XSA9IChPTVhfVTgpKChVMCArIDIqVTEgKyBVMiArIDIpPj4yKTsKLSAgICAgICAgcFRtcFs3XSA9IChPTVhfVTgpKChVMSArIFUyICsgMSk+PjEpOwotICAgICAgICBwVG1wWzhdID0gKE9NWF9VOCkoKFUxICsgMipVMiArIFUzICsgMik+PjIpOwotICAgICAgICBwVG1wWzldID0gKE9NWF9VOCkoKFUyICsgVTMgKyAxKT4+MSk7Ci0gICAgICAgIGZvciAoeT0wOyB5PDQ7IHkrKykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yICh4PTA7IHg8NDsgeCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBEc3RbeSpkc3RTdGVwK3hdID0gcFRtcFszKzIqeC15XTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgT01YX1ZDXzRYNF9IRDoKLSAgICAgICAgLyogekhEPTJ5LXggPSAtMyAtMiAtMSAgMCAgMSAgMiAgMyAgNCAgNSAgNgotICAgICAgICAgKiB5LSh4Pj4xKSA9IC0xIC0xICAwICAwICAxICAxICAyICAyICAzICAzCi0gICAgICAgICAqIHggICAgICAgID0gIDMgIDIgICAgICAgICAgICAgICAgICAgIDEgIDAKLSAgICAgICAgICovCi0gICAgICAgIHBUbXBbMF0gPSAoT01YX1U4KSgoVTIgKyAyKlUxICsgVTAgKyAyKT4+Mik7Ci0gICAgICAgIHBUbXBbMV0gPSAoT01YX1U4KSgoVTEgKyAyKlUwICsgVUwgKyAyKT4+Mik7Ci0gICAgICAgIHBUbXBbMl0gPSAoT01YX1U4KSgoVTAgKyAyKlVMICsgTDAgKyAyKT4+Mik7Ci0gICAgICAgIHBUbXBbM10gPSAoT01YX1U4KSgoVUwgKyBMMCArIDEpPj4xKTsKLSAgICAgICAgcFRtcFs0XSA9IChPTVhfVTgpKChVTCArIDIqTDAgKyBMMSArIDIpPj4yKTsKLSAgICAgICAgcFRtcFs1XSA9IChPTVhfVTgpKChMMCArIEwxICsgMSk+PjEpOwotICAgICAgICBwVG1wWzZdID0gKE9NWF9VOCkoKEwwICsgMipMMSArIEwyICsgMik+PjIpOwotICAgICAgICBwVG1wWzddID0gKE9NWF9VOCkoKEwxICsgTDIgKyAxKT4+MSk7Ci0gICAgICAgIHBUbXBbOF0gPSAoT01YX1U4KSgoTDEgKyAyKkwyICsgTDMgKyAyKT4+Mik7Ci0gICAgICAgIHBUbXBbOV0gPSAoT01YX1U4KSgoTDIgKyBMMyArIDEpPj4xKTsKLSAgICAgICAgZm9yICh5PTA7IHk8NDsgeSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKHg9MDsgeDw0OyB4KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcERzdFt5KmRzdFN0ZXAreF0gPSBwVG1wWzMrMip5LXhdOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPTVhfVkNfNFg0X1ZMOgotICAgICAgICAvKiBOb3RlOiB4Kyh5Pj4xKSA9ICgyKngreSk+PjEKLSAgICAgICAgICogMngreSA9IDAgMSAyIDMgNCA1IDYgNyA4IDkKLSAgICAgICAgICovCi0gICAgICAgIHBUbXBbMF0gPSAoT01YX1U4KSgoVTAgKyBVMSArIDEpPj4xKTsKLSAgICAgICAgcFRtcFsxXSA9IChPTVhfVTgpKChVMCArIDIqVTEgKyBVMiArIDIpPj4yKTsKLSAgICAgICAgcFRtcFsyXSA9IChPTVhfVTgpKChVMSArIFUyICsgMSk+PjEpOwotICAgICAgICBwVG1wWzNdID0gKE9NWF9VOCkoKFUxICsgMipVMiArIFUzICsgMik+PjIpOwotICAgICAgICBwVG1wWzRdID0gKE9NWF9VOCkoKFUyICsgVTMgKyAxKT4+MSk7Ci0gICAgICAgIGlmIChhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVJfUklHSFQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBUbXBbNV0gPSAoT01YX1U4KSgoVTIgKyAyKlUzICsgVTQgKyAyKT4+Mik7Ci0gICAgICAgICAgICBwVG1wWzZdID0gKE9NWF9VOCkoKFUzICsgVTQgKyAxKT4+MSk7Ci0gICAgICAgICAgICBwVG1wWzddID0gKE9NWF9VOCkoKFUzICsgMipVNCArIFU1ICsgMik+PjIpOwotICAgICAgICAgICAgcFRtcFs4XSA9IChPTVhfVTgpKChVNCArIFU1ICsgMSk+PjEpOwotICAgICAgICAgICAgcFRtcFs5XSA9IChPTVhfVTgpKChVNCArIDIqVTUgKyBVNiArIDIpPj4yKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBUbXBbNV0gPSAoT01YX1U4KSgoVTIgKyAzKlUzICsgMik+PjIpOwotICAgICAgICAgICAgcFRtcFs2XSA9IFUzOwotICAgICAgICAgICAgcFRtcFs3XSA9IFUzOwotICAgICAgICAgICAgcFRtcFs4XSA9IFUzOwotICAgICAgICAgICAgcFRtcFs5XSA9IFUzOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoeT0wOyB5PDQ7IHkrKykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yICh4PTA7IHg8NDsgeCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBEc3RbeSpkc3RTdGVwK3hdID0gcFRtcFsyKngreV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9NWF9WQ180WDRfSFU6Ci0gICAgICAgIC8qIHpIVSA9IHgrMip5ICovCi0gICAgICAgIHBUbXBbMF0gPSAoT01YX1U4KSgoTDAgKyBMMSArIDEpPj4xKTsKLSAgICAgICAgcFRtcFsxXSA9IChPTVhfVTgpKChMMCArIDIqTDEgKyBMMiArIDIpPj4yKTsKLSAgICAgICAgcFRtcFsyXSA9IChPTVhfVTgpKChMMSArIEwyICsgMSk+PjEpOwotICAgICAgICBwVG1wWzNdID0gKE9NWF9VOCkoKEwxICsgMipMMiArIEwzICsgMik+PjIpOwotICAgICAgICBwVG1wWzRdID0gKE9NWF9VOCkoKEwyICsgTDMgKyAxKT4+MSk7Ci0gICAgICAgIHBUbXBbNV0gPSAoT01YX1U4KSgoTDIgKyAzKkwzICsgMik+PjIpOwotICAgICAgICBwVG1wWzZdID0gTDM7Ci0gICAgICAgIHBUbXBbN10gPSBMMzsKLSAgICAgICAgcFRtcFs4XSA9IEwzOwotICAgICAgICBwVG1wWzldID0gTDM7Ci0gICAgICAgIGZvciAoeT0wOyB5PDQ7IHkrKykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yICh4PTA7IHg8NDsgeCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBEc3RbeSpkc3RTdGVwK3hdID0gcFRtcFt4KzIqeV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBRFF1YXJfMTZ4LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBRFF1YXJfMTZ4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MGE3ODUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQURRdWFyXzE2eC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX1NBRFF1YXJfMTZ4LmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSBTQUQgb2YgcFNyYyB3aXRoIGF2ZXJhZ2Ugb2YgdHdvIFJlZiBibG9ja3MKLSAqIG9mIDE2eDE2IG9yIDE2eDgKLSAqIAotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU0FEUXVhcl8xNnggICAoNi4zLjUuNC40KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgYmV0d2VlbiBvbmUgYmxvY2sgKHBTcmMpIGFuZCB0aGUgYXZlcmFnZSAKLSAqIG9mIHRoZSBvdGhlciB0d28gKHBTcmNSZWYwIGFuZCBwU3JjUmVmMSkgZm9yIDE2eDE2IG9yIDE2eDggYmxvY2tzLiAgCi0gKiBSb3VuZGluZyBpcyBhcHBsaWVkIGFjY29yZGluZyB0byB0aGUgY29udmVudGlvbiAoYStiKzEpPj4xLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqICAgcFNyY1JlZjAgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAwIAotICogICBwU3JjUmVmMSAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiAgIGlTcmNTdGVwIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYgCi0gKiAgIGlSZWZTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiAgIGlSZWZTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA4IG9yIDE2IAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0U0FEIC1Qb2ludGVyIG9mIHJlc3VsdCBTQUQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDggb3IgMTYuIAotICogICAgLSAgICBPbmUgb2YgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBTcmNSZWYwLCAKLSAqICAgICAgICAgICAgICBwU3JjUmVmMSwgcERzdFNBRC4gCi0gKiAgICAtICAgIGlTcmNTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2IAotICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9TQURRdWFyXzE2eCgKLQljb25zdCBPTVhfVTgqIAlwU3JjLAotICAgIGNvbnN0IE9NWF9VOCogCXBTcmNSZWYwLAotCWNvbnN0IE9NWF9VOCogCXBTcmNSZWYxLAkKLSAgICBPTVhfVTMyIAlpU3JjU3RlcCwKLSAgICBPTVhfVTMyCQlpUmVmU3RlcDAsCi0gICAgT01YX1UzMgkJaVJlZlN0ZXAxLAotICAgIE9NWF9VMzIqCXBEc3RTQUQsCi0gICAgT01YX1UzMiAgICAgaUhlaWdodAotKQotewotICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLwotICAgIGFybVJldEFyZ0VycklmKHBTcmMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY1JlZjAgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY1JlZjEgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocERzdFNBRCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZigoaUhlaWdodCAhPSAxNikgJiYgKGlIZWlnaHQgIT0gOCksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDE2Qnl0ZUFsaWduZWQocFNyYyksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKChpU3JjU3RlcCA9PSAwKSB8fCAoaVNyY1N0ZXAgJiAxNSksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIAotCi0gICAgcmV0dXJuIGFybVZDTTRQMTBfU0FEUXVhcgotICAgICAgICAocFNyYywgcFNyY1JlZjAsIHBTcmNSZWYxLCBpU3JjU3RlcCwgCi0gICAgICAgIGlSZWZTdGVwMCwgaVJlZlN0ZXAxLCBwRHN0U0FELCBpSGVpZ2h0LCAxNik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBRFF1YXJfNHguYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FEUXVhcl80eC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjYwZDM0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FEUXVhcl80eC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX1NBRFF1YXJfNHguYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIFNBRCBvZiBwU3JjIHdpdGggYXZlcmFnZSBvZiB0d28gUmVmIGJsb2NrcwotICogb2YgNHg4IG9yIDR4NCBibG9ja3MKLSAqIAotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU0FEUXVhcl80eCAgICg2LjMuNS40LjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBiZXR3ZWVuIG9uZSBibG9jayAocFNyYykgYW5kIHRoZSBhdmVyYWdlIAotICogb2YgdGhlIG90aGVyIHR3byAocFNyY1JlZjAgYW5kIHBTcmNSZWYxKSBmb3IgNHg4IG9yIDR4NCBibG9ja3MuICBSb3VuZGluZyAKLSAqIGlzIGFwcGxpZWQgYWNjb3JkaW5nIHRvIHRoZSBjb252ZW50aW9uIChhK2IrMSk+PjEuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKiAgIHBTcmNSZWYwIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMCAKLSAqICAgcFNyY1JlZjEgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAxIAotICogICBpU3JjU3RlcCAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAotICogICBpUmVmU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAotICogICBpUmVmU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAotICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBibG9jazsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCBvciA4LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFNBRCAtIFBvaW50ZXIgb2YgcmVzdWx0IFNBRCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgNCBvciA4LiAKLSAqICAgIC0gICAgT25lIG9mIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwU3JjUmVmMCwgCi0gKiAgICAgICAgICAgICAgcFNyY1JlZjEsIHBEc3RTQUQuIAotICogICAgLSAgICBpU3JjU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAotICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9TQURRdWFyXzR4KCAKLQkgIGNvbnN0IE9NWF9VOCogCXBTcmMsCi0gICAgICBjb25zdCBPTVhfVTgqIAlwU3JjUmVmMCwKLQkgIGNvbnN0IE9NWF9VOCogCXBTcmNSZWYxLAkKLSAgICAgIE9NWF9VMzIgCWlTcmNTdGVwLAotICAgICAgT01YX1UzMglpUmVmU3RlcDAsCi0gICAgICBPTVhfVTMyCWlSZWZTdGVwMSwKLSAgICAgIE9NWF9VMzIqCXBEc3RTQUQsCi0gICAgICBPTVhfVTMyICAgaUhlaWdodAotKQotewotICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLwotICAgIGFybVJldEFyZ0VycklmKHBTcmMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWYwID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmMSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocERzdFNBRCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKGlIZWlnaHQgIT0gOCkgJiYgKGlIZWlnaHQgIT0gNCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocFNyYyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoaVNyY1N0ZXAgPT0gMCkgfHwgKGlTcmNTdGVwICYgMyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICAKLSAgICByZXR1cm4gYXJtVkNNNFAxMF9TQURRdWFyCi0gICAgICAgIChwU3JjLCBwU3JjUmVmMCwgcFNyY1JlZjEsIGlTcmNTdGVwLCAKLSAgICAgICAgaVJlZlN0ZXAwLCBpUmVmU3RlcDEsIHBEc3RTQUQsIGlIZWlnaHQsIDQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQURRdWFyXzh4LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBRFF1YXJfOHguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM4Y2RmMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBRFF1YXJfOHguYworKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9TQURRdWFyXzh4LmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSBTQUQgb2YgcFNyYyB3aXRoIGF2ZXJhZ2Ugb2YgdHdvIFJlZiBibG9ja3MKLSAqIG9mIDh4MTYgb3IgOHg4IG9yIDh4NAotICogCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybVZDLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TQURRdWFyXzh4ICAgKDYuMy41LjQuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGJldHdlZW4gb25lIGJsb2NrIChwU3JjKSBhbmQgdGhlIGF2ZXJhZ2UgCi0gKiBvZiB0aGUgb3RoZXIgdHdvIChwU3JjUmVmMCBhbmQgcFNyY1JlZjEpIGZvciA4eDE2LCA4eDgsIG9yIDh4NCBibG9ja3MuICAKLSAqIFJvdW5kaW5nIGlzIGFwcGxpZWQgYWNjb3JkaW5nIHRvIHRoZSBjb252ZW50aW9uIChhK2IrMSk+PjEuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICogICBwU3JjUmVmMCAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiAgIHBTcmNSZWYxIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMSAKLSAqICAgaVNyY1N0ZXAgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgaVJlZlN0ZXAwIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMCAKLSAqICAgaVJlZlN0ZXAxIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMSAKLSAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgYmxvY2s7IG11c3QgYmUgZXF1YWwgZWl0aGVyIDQsIDgsIG9yIDE2LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFNBRCAtIFBvaW50ZXIgb2YgcmVzdWx0IFNBRCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAotICogICAgLSAgICBPbmUgb2YgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBTcmNSZWYwLCAKLSAqICAgICAgICAgICAgICBwU3JjUmVmMSwgcERzdFNBRC4gCi0gKiAgICAtICAgIGlTcmNTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDggCi0gKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1NBRFF1YXJfOHgoIAotCWNvbnN0IE9NWF9VOCogCXBTcmMsCi0gICAgY29uc3QgT01YX1U4KiAJcFNyY1JlZjAsCi0JY29uc3QgT01YX1U4KiAJcFNyY1JlZjEsCQotICAgIE9NWF9VMzIgCWlTcmNTdGVwLAotICAgIE9NWF9VMzIJCWlSZWZTdGVwMCwKLSAgICBPTVhfVTMyCQlpUmVmU3RlcDEsCi0gICAgT01YX1UzMioJcERzdFNBRCwKLSAgICBPTVhfVTMyICAgICBpSGVpZ2h0Ci0pCi17Ci0gICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmMCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmMSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0U0FEID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKChpSGVpZ2h0ICE9IDE2KSAmJiAoaUhlaWdodCAhPSA4KSAmJiAKLSAgICAgICAgKGlIZWlnaHQgIT0gNCksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDhCeXRlQWxpZ25lZChwU3JjKSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKGlTcmNTdGVwID09IDApIHx8IChpU3JjU3RlcCAmIDcpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICAKLQotICAgIHJldHVybiBhcm1WQ000UDEwX1NBRFF1YXIKLSAgICAgICAgKHBTcmMsIHBTcmNSZWYwLCBwU3JjUmVmMSwgaVNyY1N0ZXAsIAotICAgICAgICBpUmVmU3RlcDAsIGlSZWZTdGVwMSwgcERzdFNBRCwgaUhlaWdodCwgOCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBRF80eC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQURfNHguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIyZDhkZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBRF80eC5jCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfU0FEXzR4LmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSBTQUQgZm9yIDR4OCBhbmQgNHg0IGJsb2NrcwotICogCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybVZDLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TQURfNHggICAoNi4zLjUuNC4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgZm9yIDR4OCBhbmQgNHg0IGJsb2Nrcy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY09yZyAtUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICogICBpU3RlcE9yZyAtU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgIHBTcmNSZWYgLVBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jayAKLSAqICAgaVN0ZXBSZWYgLVN0ZXAgb2YgdGhlIHJlZmVyZW5jZSBibG9jayBidWZmZXIgCi0gKiAgIGlIZWlnaHQgLUhlaWdodCBvZiB0aGUgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQgb3IgOC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RTQUQgLVBvaW50ZXIgb2YgcmVzdWx0IFNBRCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBPbmUgb2YgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwU3JjT3JnLCBwU3JjUmVmLCBvciBwRHN0U0FEIAotICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgNCBvciA4LiAKLSAqICAgIC0gICAgaVN0ZXBPcmcgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKLSAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfU0FEXzR4KAkKLQljb25zdCBPTVhfVTgqIAlwU3JjT3JnLAotCU9NWF9VMzIgCWlTdGVwT3JnLAotCWNvbnN0IE9NWF9VOCogCXBTcmNSZWYsCi0JT01YX1UzMiAJaVN0ZXBSZWYsCi0JT01YX1MzMioJcERzdFNBRCwKLQlPTVhfVTMyCQlpSGVpZ2h0Ci0pCi17Ci0gICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY09yZyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBEc3RTQUQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKGlIZWlnaHQgIT0gOCkgJiYgKGlIZWlnaHQgIT0gNCksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwU3JjT3JnKSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKGlTdGVwT3JnID09IDApIHx8IChpU3RlcE9yZyAmIDMpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZigoaVN0ZXBSZWYgPT0gMCkgfHwgKGlTdGVwUmVmICYgMyksIE9NWF9TdHNfQmFkQXJnRXJyKQotCi0gICAgcmV0dXJuIGFybVZDQ09NTV9TQUQgCi0gICAgICAgIChwU3JjT3JnLCBpU3RlcE9yZywgcFNyY1JlZiwgaVN0ZXBSZWYsIHBEc3RTQUQsIGlIZWlnaHQsIDQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQVREXzR4NC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQVREXzR4NC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Zjc0NDk5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FURF80eDQuYworKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9TQVREXzR4NC5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgU0FEIGZvciA0eDQgYmxvY2tzCi0gKiAKLSAqLwotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU0FURF80eDQgICAoNi4zLjUuNC41KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBzdW0gb2YgYWJzb2x1dGUgdHJhbnNmb3JtIGRpZmZlcmVuY2VzIChTQVREKSAKLSAqIGZvciBhIDR4NCBibG9jayBieSBhcHBseWluZyBhIEhhZGFtYXJkIHRyYW5zZm9ybSB0byB0aGUgZGlmZmVyZW5jZSBibG9jayAKLSAqIGFuZCB0aGVuIGNhbGN1bGF0aW5nIHRoZSBzdW0gb2YgYWJzb2x1dGUgY29lZmZpY2llbnQgdmFsdWVzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjT3JnIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkgCi0gKiAgIGlTdGVwT3JnIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAKLSAqICAgcFNyY1JlZiAtIFBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeSAKLSAqICAgaVN0ZXBSZWYgLSBTdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gdGhlIHJlc3VsdGluZyBTQUQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcFNyY09yZywgcFNyY1JlZiwgb3IgcERzdFNBRCBlaXRoZXIgcFNyY09yZyAKLSAqICAgIC0gICAgcFNyY1JlZiBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKLSAqICAgIC0gICAgaVN0ZXBPcmcgPD0gMCBvciBpU3RlcE9yZyBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAotICogICAgLSAgICBpU3RlcFJlZiA8PSAwIG9yIGlTdGVwUmVmIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9TQVREXzR4NCggCi0JY29uc3QgT01YX1U4KgkJcFNyY09yZywKLQlPTVhfVTMyICAgICBpU3RlcE9yZywgICAgICAgICAgICAgICAgICAgICAgICAgCi0JY29uc3QgT01YX1U4KgkJcFNyY1JlZiwKLQlPTVhfVTMyCQlpU3RlcFJlZiwKLQlPTVhfVTMyKiAgICBwRHN0U0FECi0pCi17Ci0gICAgT01YX0lOVCAgICAgaSwgajsKLSAgICBPTVhfUzMyICAgICBTQVREID0gMDsKLSAgICBPTVhfUzMyICAgICBkIFs0XVs0XSwgbTFbNF1bNF0sIG0yWzRdWzRdOwotCi0gICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY09yZyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBEc3RTQUQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKGlTdGVwT3JnID09IDApIHx8IChpU3RlcE9yZyAmIDMpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZigoaVN0ZXBSZWYgPT0gMCkgfHwgKGlTdGVwUmVmICYgMyksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwU3JjT3JnKSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBTcmNSZWYpLCBPTVhfU3RzX0JhZEFyZ0VycikKLQotICAgIC8qIENhbGN1bGF0ZSB0aGUgZGlmZmVyZW5jZSAqLwotICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCi0gICAgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBkIFtqXVtpXSA9IHBTcmNPcmcgW2ogKiBpU3RlcE9yZyArIGldIC0gcFNyY1JlZiBbaiAqIGlTdGVwUmVmICsgaV07Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBIYWRhbWFyZCBUcmFuc2ZvciBmb3IgNHg0IGJsb2NrICovCi0KLSAgICAvKiBIb3Jpem9udGFsICovCi0gICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICB7Ci0gICAgICAgIG0xW2ldWzBdID0gZFtpXVswXSArIGRbaV1bMl07IC8qIGErYyAqLwotICAgICAgICBtMVtpXVsxXSA9IGRbaV1bMV0gKyBkW2ldWzNdOyAvKiBiK2QgKi8KLSAgICAgICAgbTFbaV1bMl0gPSBkW2ldWzBdIC0gZFtpXVsyXTsgLyogYS1jICovCi0gICAgICAgIG0xW2ldWzNdID0gZFtpXVsxXSAtIGRbaV1bM107IC8qIGItZCAqLwotCi0gICAgICAgIG0yW2ldWzBdID0gbTFbaV1bMF0gKyBtMVtpXVsxXTsgLyogYStiK2MrZCAqLwotICAgICAgICBtMltpXVsxXSA9IG0xW2ldWzJdICsgbTFbaV1bM107IC8qIGErYi1jLWQgKi8KLSAgICAgICAgbTJbaV1bMl0gPSBtMVtpXVsyXSAtIG0xW2ldWzNdOyAvKiBhLWItYytkICovCi0gICAgICAgIG0yW2ldWzNdID0gbTFbaV1bMF0gLSBtMVtpXVsxXTsgLyogYS1iK2MtZCAqLwotCi0gICAgfQotCi0gICAgLyogVmVydGljYWwgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgIHsKLSAgICAgICAgbTFbMF1baV0gPSBtMlswXVtpXSArIG0yWzJdW2ldOwotICAgICAgICBtMVsxXVtpXSA9IG0yWzFdW2ldICsgbTJbM11baV07Ci0gICAgICAgIG0xWzJdW2ldID0gbTJbMF1baV0gLSBtMlsyXVtpXTsKLSAgICAgICAgbTFbM11baV0gPSBtMlsxXVtpXSAtIG0yWzNdW2ldOwotCi0gICAgICAgIG0yWzBdW2ldID0gbTFbMF1baV0gKyBtMVsxXVtpXTsKLSAgICAgICAgbTJbMV1baV0gPSBtMVsyXVtpXSArIG0xWzNdW2ldOwotICAgICAgICBtMlsyXVtpXSA9IG0xWzJdW2ldIC0gbTFbM11baV07Ci0gICAgICAgIG0yWzNdW2ldID0gbTFbMF1baV0gLSBtMVsxXVtpXTsKLSAgICB9Ci0gICAgCi0gICAgLyogY2FsY3VsYXRlIFNBRCBmb3IgVHJhbnNmb3JtZWQgY29lZmZpY2llbnRzICovCi0gICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykKLSAgICB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNBVEQgKz0gYXJtQWJzKG0yIFtqXVtpXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgICAgIAotICAgICpwRHN0U0FEID0gKFNBVEQgKyAxKSAvIDI7Ci0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU3ViQW5kVHJhbnNmb3JtUURRUmVzaWR1YWwuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU3ViQW5kVHJhbnNmb3JtUURRUmVzaWR1YWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE4NGQ3Yy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1N1YkFuZFRyYW5zZm9ybVFEUVJlc2lkdWFsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfU3ViQW5kVHJhbnNmb3JtUURRUmVzaWR1YWwuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIFNBRCBmb3IgNHg0IGJsb2NrcwotICogCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TdWJBbmRUcmFuc2Zvcm1RRFFSZXNpZHVhbCAgICg2LjMuNS44LjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHN1YnRyYWN0cyB0aGUgcHJlZGljdGlvbiBzaWduYWwgZnJvbSB0aGUgb3JpZ2luYWwgc2lnbmFsIHRvIAotICogcHJvZHVjZSB0aGUgZGlmZmVyZW5jZSBzaWduYWwgYW5kIHRoZW4gcGVyZm9ybXMgYSA0eDQgaW50ZWdlciB0cmFuc2Zvcm0gYW5kIAotICogcXVhbnRpemF0aW9uLiBUaGUgcXVhbnRpemVkIHRyYW5zZm9ybWVkIGNvZWZmaWNpZW50cyBhcmUgc3RvcmVkIGFzIAotICogcERzdFF1YW50Q29lZmYuIFRoaXMgZnVuY3Rpb24gY2FuIGFsc28gb3V0cHV0IGRlcXVhbnRpemVkIGNvZWZmaWNpZW50cyBvciAKLSAqIHVucXVhbnRpemVkIERDIGNvZWZmaWNpZW50cyBvcHRpb25hbGx5IGJ5IHNldHRpbmcgdGhlIHBvaW50ZXJzIAotICogcERzdERlUXVhbnRDb2VmZiwgcERDQ29lZmYuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNPcmcgLSBQb2ludGVyIHRvIG9yaWdpbmFsIHNpZ25hbC4gNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIHBTcmNQcmVkIC0gUG9pbnRlciB0byBwcmVkaWN0aW9uIHNpZ25hbC4gNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIGlTcmNPcmdTdGVwIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgc2lnbmFsIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIAotICogICAgICAgICAgICA0LiAKLSAqICAgaVNyY1ByZWRTdGVwIC0gU3RlcCBvZiB0aGUgcHJlZGljdGlvbiBzaWduYWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgCi0gKiAgICAgICAgICAgIG9mIDQuIAotICogICBwTnVtQ29lZmYgLU51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMgYWZ0ZXIgcXVhbnRpemF0aW9uLiBJZiB0aGlzIAotICogICAgICAgICAgICBwYXJhbWV0ZXIgaXMgbm90IHJlcXVpcmVkLCBpdCBpcyBzZXQgdG8gTlVMTC4gCi0gKiAgIG5UaHJlc2hTQUQgLSBaZXJvLWJsb2NrIGVhcmx5IGRldGVjdGlvbiB0aHJlc2hvbGQuIElmIHRoaXMgcGFyYW1ldGVyIGlzIAotICogICAgICAgICAgICBub3QgcmVxdWlyZWQsIGl0IGlzIHNldCB0byAwLiAKLSAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKLSAqICAgYkludHJhIC0gSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBpcyBhbiBJTlRSQSBibG9jaywgZWl0aGVyIDEtSU5UUkEgb3IgCi0gKiAgICAgICAgICAgIDAtSU5URVIgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RRdWFudENvZWZmIC0gUG9pbnRlciB0byB0aGUgcXVhbnRpemVkIHRyYW5zZm9ybWVkIGNvZWZmaWNpZW50cy4gIAotICogICAgICAgICAgICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgcERzdERlUXVhbnRDb2VmZiAtIFBvaW50ZXIgdG8gdGhlIGRlcXVhbnRpemVkIHRyYW5zZm9ybWVkIGNvZWZmaWNpZW50cyAKLSAqICAgICAgICAgICAgaWYgdGhpcyBwYXJhbWV0ZXIgaXMgbm90IGVxdWFsIHRvIE5VTEwuICA4LWJ5dGUgYWxpZ25tZW50IAotICogICAgICAgICAgICByZXF1aXJlZC4gCi0gKiAgIHBEQ0NvZWZmIC0gUG9pbnRlciB0byB0aGUgdW5xdWFudGl6ZWQgREMgY29lZmZpY2llbnQgaWYgdGhpcyBwYXJhbWV0ZXIgCi0gKiAgICAgICAgICAgIGlzIG5vdCBlcXVhbCB0byBOVUxMLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICAgICBwU3JjT3JnLCBwU3JjUHJlZCwgcE51bUNvZWZmLCBwRHN0UXVhbnRDb2VmZiwgCi0gKiAgICAgICAgICAgIHBEc3REZVF1YW50Q29lZmYsIHBEQ0NvZWZmIAotICogICAgLSAgICBwU3JjT3JnIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAotICogICAgLSAgICBwU3JjUHJlZCBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKLSAqICAgIC0gICAgaVNyY09yZ1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKLSAqICAgIC0gICAgaVNyY1ByZWRTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCi0gKiAgICAtICAgIHBEc3RRdWFudENvZWZmIG9yIHBEc3REZVF1YW50Q29lZmYgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IAotICoKLSAqLwotIE9NWFJlc3VsdCBvbXhWQ000UDEwX1N1YkFuZFRyYW5zZm9ybVFEUVJlc2lkdWFsICgKLQkgY29uc3QgT01YX1U4KgkJcFNyY09yZywKLQkgY29uc3QgT01YX1U4KgkJcFNyY1ByZWQsCi0JIE9NWF9VMzIJCWlTcmNPcmdTdGVwLAotCSBPTVhfVTMyCQlpU3JjUHJlZFN0ZXAsCi0JIE9NWF9TMTYqCSAgICBwRHN0UXVhbnRDb2VmZiwKLQkgT01YX1MxNiogCSAgICBwRHN0RGVRdWFudENvZWZmLAotCSBPTVhfUzE2KgkgICAgcERDQ29lZmYsCi0JIE9NWF9TOCoJCXBOdW1Db2VmZiwKLQkgT01YX1UzMgkJblRocmVzaFNBRCwKLQkgT01YX1UzMgkJaVFQLAotCSBPTVhfVTgJCSAgICBiSW50cmEKLSkKLXsKLSAgICBPTVhfSU5UICAgICBpLCBqOwotICAgIE9NWF9TOCAgICAgIE51bUNvZWZmID0gMDsKLSAgICBPTVhfUzE2ICAgICBCdWZbMTZdLCBtWzE2XTsKLSAgICBPTVhfVTMyICAgICBRQml0cywgUVBwZXIsIFFQbW9kLCBmOwotICAgIE9NWF9TMzIgICAgIFZhbHVlLCBNRiwgVGhyZXNoREM7Ci0KLSAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjT3JnID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotCWFybVJldEFyZ0VycklmKHBEc3REZVF1YW50Q29lZmYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0JYXJtUmV0QXJnRXJySWYocE51bUNvZWZmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotCWFybVJldEFyZ0VycklmKHBEQ0NvZWZmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwU3JjT3JnKSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY1ByZWQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBTcmNQcmVkKSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocERzdFF1YW50Q29lZmYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90OEJ5dGVBbGlnbmVkKHBEc3RRdWFudENvZWZmKSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKHBEc3REZVF1YW50Q29lZmYgIT0gTlVMTCkgJiYgCi0JCQlhcm1Ob3Q4Qnl0ZUFsaWduZWQocERzdERlUXVhbnRDb2VmZiksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKChiSW50cmEgIT0gMCkgJiYgKGJJbnRyYSAhPSAxKSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoaVFQID4gNTEsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGlTcmNPcmdTdGVwID09IDAsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGlTcmNQcmVkU3RlcCA9PSAwLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihpU3JjT3JnU3RlcCAmIDMsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGlTcmNQcmVkU3RlcCAmIDMsIE9NWF9TdHNfQmFkQXJnRXJyKQotCi0gICAgLyogCi0gICAgICogWmVyby1CbG9jayBFYXJseSBkZXRlY3Rpb24gdXNpbmcgblRocmVzaFNBRCBwYXJhbSAKLSAgICAgKi8KLQotICAgIFFQcGVyID0gaVFQIC8gNjsKLSAgICBRUG1vZCA9IGlRUCAlIDY7ICAgIAotICAgIFFCaXRzID0gMTUgKyBRUHBlcjsKLSAgICAKLSAgICBmID0gKDEgPDwgUUJpdHMpIC8gKGJJbnRyYSA/IDMgOiA2KTsKLSAgICAKLSAgICAvKiBEbyBaZXJvLUJsb2NrIEVhcmx5IGRldGVjdGlvbiBpZiBlbmFibGVkICovCi0gICAgaWYgKG5UaHJlc2hTQUQpCi0gICAgewotICAgICAgICBUaHJlc2hEQyA9ICgoMSA8PCBRQml0cykgLSBmKSAvIGFybVZDTTRQMTBfTUZNYXRyaXhbUVBtb2RdWzBdOwotICAgICAgICBpZiAoblRocmVzaFNBRCA8IFRocmVzaERDKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBTZXQgYmxvY2sgdG8gemVybyAqLwotICAgICAgICAgICAgaWYgKHBEQ0NvZWZmICE9IE5VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBEQ0NvZWZmID0gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcERzdFF1YW50Q29lZmYgWzQgKiBqICsgaV0gPSAwOwotICAgICAgICAgICAgICAgICAgICBpZiAocERzdERlUXVhbnRDb2VmZiAhPSBOVUxMKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwRHN0RGVRdWFudENvZWZmIFs0ICogaiArIGldID0gMDsgICAgCi0gICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHBOdW1Db2VmZiAhPSBOVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpwTnVtQ29lZmYgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgLyogQ2FsY3VsYXRlIGRpZmZlcmVuY2UgKi8KLSAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKQotICAgIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgQnVmIFtqICogNCArIGldID0gCi0gICAgICAgICAgICAgICAgcFNyY09yZyBbaiAqIGlTcmNPcmdTdGVwICsgaV0gLSBwU3JjUHJlZCBbaiAqIGlTcmNQcmVkU3RlcCArIGldOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogUmVzaWR1YWwgVHJhbnNmb3JtICovCi0gICAgYXJtVkNNNFAxMF9Gd2RUcmFuc2Zvcm1SZXNpZHVhbDR4NCAobSwgQnVmKTsKLQotICAgIGlmIChwRENDb2VmZiAhPSBOVUxMKQotICAgIHsKLSAgICAgICAgLyogQ29weSB1bnF1YW50aXplZCBEQyB2YWx1ZSBpbnRvIHBvaW50ZXIgKi8KLSAgICAgICAgKnBEQ0NvZWZmID0gbVswXTsKLSAgICB9Ci0KLSAgICAvKiBRdWFudGl6YXRpb24gKi8KLSAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKQotICAgIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgTUYgPSBhcm1WQ000UDEwX01GTWF0cml4W1FQbW9kXVthcm1WQ000UDEwX1Bvc1RvVkNvbDR4NFtqICogNCArIGldXTsKLSAgICAgICAgICAgIFZhbHVlID0gYXJtQWJzKG1baiAqIDQgKyBpXSkgKiBNRiArIGY7Ci0gICAgICAgICAgICBWYWx1ZSA+Pj0gUUJpdHM7Ci0gICAgICAgICAgICBWYWx1ZSA9IG1baiAqIDQgKyBpXSA8IDAgPyAtVmFsdWUgOiBWYWx1ZTsKLSAgICAgICAgICAgIEJ1Zls0ICogaiArIGldID0gcERzdFF1YW50Q29lZmYgWzQgKiBqICsgaV0gPSAoT01YX1MxNilWYWx1ZTsKLSAgICAgICAgICAgIGlmICgocE51bUNvZWZmICE9IE5VTEwpICYmIFZhbHVlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE51bUNvZWZmKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBPdXRwdXQgbnVtYmVyIG9mIG5vbi16ZXJvIENvZWZmcyAqLwotICAgIGlmIChwTnVtQ29lZmYgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAgICpwTnVtQ29lZmYgPSBOdW1Db2VmZjsKLSAgICB9Ci0gICAgCi0gICAgLyogUmVzaWR1YWwgSW52IFRyYW5zZm9ybSAqLwotICAgIGlmIChwRHN0RGVRdWFudENvZWZmICE9IE5VTEwpCi0gICAgeyAgICAKLSAgICAgICAgLyogUmUgU2NhbGUgKi8KLSAgICAgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtIFtqICogNCArIGldICA9IEJ1ZiBbaiAqIDQgKyBpXSAqICgxIDw8IFFQcGVyKSAqCi0gICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMTBfVk1hdHJpeFtRUG1vZF1bYXJtVkNNNFAxMF9Qb3NUb1ZDb2w0eDRbaiAqIDQgKyBpXV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NCAocERzdERlUXVhbnRDb2VmZiwgbSk7ICAgICAgICAKLSAgICB9Ci0gICAgICAgIAotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDlmNWE3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIuYworKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBILjI2NCBpbnZlcnNlIHF1YW50aXplIGFuZCB0cmFuc2Zvcm0gbW9kdWxlCi0gKiAKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0vKgotICogRGVzY3JpcHRpb246Ci0gKiBEZXF1YW50aXplIENocm9tYSAyeDIgREMgYmxvY2sKLSAqLwotCi1zdGF0aWMgdm9pZCBEZXF1YW50Q2hyb21hREMyeDIoCi0gICAgIE9NWF9TMTYqIHBEc3QsCi0gICAgIE9NWF9JTlQgUVAgICAgICAgIAotKQotewotICAgIGludCBTaGlmdCA9IChRUC82KS0xIDsKLSAgICBpbnQgU2NhbGUgPSBhcm1WQ000UDEwX1ZNYXRyaXhbUVAlNl1bMF07Ci0gICAgaW50IGksIFZhbHVlOwotCi0gICAgaWYgKFNoaWZ0ID49IDApCi0gICAgewotICAgICAgICBmb3IgKGk9MDsgaTw0OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbHVlID0gKHBEc3RbaV0gKiBTY2FsZSkgPDwgU2hpZnQ7Ci0gICAgICAgICAgICBwRHN0W2ldID0gKE9NWF9TMTYpVmFsdWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgZm9yIChpPTA7IGk8NDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWx1ZSA9IChwRHN0W2ldICogU2NhbGUpID4+IDE7Ci0gICAgICAgICAgICBwRHN0W2ldID0gKE9NWF9TMTYpVmFsdWU7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0gCi0KLS8qCi0gKiBEZXNjcmlwdGlvbjoKLSAqIEludmVyc2UgVHJhbnNmb3JtIERDIDJ4MiBDb2VmZmljaWVudHMKLSAqLwotCi1zdGF0aWMgdm9pZCBJbnZUcmFuc2Zvcm1EQzJ4MihPTVhfUzE2KiBwRGF0YSkKLXsKLSAgICBpbnQgYzAwID0gcERhdGFbMF07Ci0gICAgaW50IGMwMSA9IHBEYXRhWzFdOwotICAgIGludCBjMTAgPSBwRGF0YVsyXTsKLSAgICBpbnQgYzExID0gcERhdGFbM107Ci0KLSAgICBpbnQgZDAwID0gYzAwICsgYzAxOwotICAgIGludCBkMDEgPSBjMDAgLSBjMDE7Ci0gICAgaW50IGQxMCA9IGMxMCArIGMxMTsKLSAgICBpbnQgZDExID0gYzEwIC0gYzExOwotCi0gICAgcERhdGFbMF0gPSAoT01YX1MxNikoZDAwICsgZDEwKTsKLSAgICBwRGF0YVsxXSA9IChPTVhfUzE2KShkMDEgKyBkMTEpOwotICAgIHBEYXRhWzJdID0gKE9NWF9TMTYpKGQwMCAtIGQxMCk7Ci0gICAgcERhdGFbM10gPSAoT01YX1MxNikoZDAxIC0gZDExKTsKLX0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpciAgICg2LjMuNC4yLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBSZWNvbnN0cnVjdCB0aGUgMngyIENocm9tYURDIGJsb2NrIGZyb20gY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIsIAotICogcGVyZm9ybSBpbnRlZ2VyIGludmVyc2UgdHJhbnNmb3JtYXRpb24sIGFuZCBkZXF1YW50aXphdGlvbiBmb3IgMngyIGNocm9tYSAKLSAqIERDIGNvZWZmaWNpZW50cywgYW5kIHVwZGF0ZSB0aGUgcGFpciBidWZmZXIgcG9pbnRlciB0byBuZXh0IG5vbi1lbXB0eSAKLSAqIGJsb2NrLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcFNyYyAtIERvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyIAotICogICAgICAgICAgICBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcgCi0gKiAgIFFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlciBRcEMgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwU3JjIC0gKnBwU3JjIGlzIHVwZGF0ZWQgdG8gdGhlIHN0YXJ0IG9mIG5leHQgbm9uIGVtcHR5IGJsb2NrIAotICogICBwRHN0IC0gUG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCAyeDIgQ2hyb21hREMgY29lZmZpY2llbnRzIGJ1ZmZlcjsgCi0gKiAgICAgICAgICAgIG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgcHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKLSAqICAgIC0gICAgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBRUCBpcyBub3QgaW4gdGhlIHJhbmdlIG9mIFswLTUxXS4gCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyKAotICAgICBjb25zdCBPTVhfVTggKipwcFNyYywKLSAgICAgT01YX1MxNiogcERzdCwKLSAgICAgT01YX0lOVCBRUCAgICAgICAgCi0gKQotewotICAgIGFybVJldEFyZ0VycklmKHBwU3JjICA9PSBOVUxMLCAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCpwcFNyYyA9PSBOVUxMLCAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBEc3QgICA9PSBOVUxMLCAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKFFQPDAsICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKFFQPjUxLCAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotCi0gICAgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazJ4MihwcFNyYywgcERzdCk7Ci0gICAgSW52VHJhbnNmb3JtREMyeDIocERzdCk7Ci0gICAgRGVxdWFudENocm9tYURDMngyKHBEc3QsIFFQKTsKLQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzMzNkNDkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIuYworKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpci5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogSC4yNjQgaW52ZXJzZSBxdWFudGl6ZSBhbmQgdHJhbnNmb3JtIG1vZHVsZQotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLQotLyoKLSAqIERlc2NyaXB0aW9uOgotICogRGVxdWFudGl6ZSBMdW1hIERDIGJsb2NrCi0gKi8KLQotc3RhdGljIHZvaWQgRGVxdWFudEx1bWFEQzR4NCgKLSAgICAgT01YX1MxNiogcERzdCwKLSAgICAgT01YX0lOVCBRUCAgICAgICAgCi0pCi17Ci0gICAgaW50IFNoaWZ0ID0gKFFQLzYpLTIgOwotICAgIGludCBTY2FsZSA9IGFybVZDTTRQMTBfVk1hdHJpeFtRUCU2XVswXTsKLSAgICBpbnQgaSwgUm91bmQsIFZhbHVlOwotCi0gICAgaWYgKFNoaWZ0ID49IDApCi0gICAgewotICAgICAgICBmb3IgKGk9MDsgaTwxNjsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWx1ZSA9IChwRHN0W2ldICogU2NhbGUpIDw8IFNoaWZ0OwotICAgICAgICAgICAgcERzdFtpXSA9IChPTVhfUzE2KVZhbHVlOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIFNoaWZ0ID0gLVNoaWZ0OzsKLSAgICAgICAgUm91bmQgPSAxPDwoU2hpZnQtMSk7Ci0KLSAgICAgICAgZm9yIChpPTA7IGk8MTY7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgVmFsdWUgPSAocERzdFtpXSAqIFNjYWxlICsgUm91bmQpID4+IFNoaWZ0OwotICAgICAgICAgICAgcERzdFtpXSA9IChPTVhfUzE2KVZhbHVlOwotICAgICAgICB9Ci0gICAgfQotfQotCi0gCi0KLS8qCi0gKiBEZXNjcmlwdGlvbjoKLSAqIEludmVyc2UgVHJhbnNmb3JtIERDIDR4NCBDb2VmZmljaWVudHMKLSAqLwotc3RhdGljIHZvaWQgSW52VHJhbnNmb3JtREM0eDQoT01YX1MxNiogcERhdGEpCi17Ci0gICAgaW50IGk7Ci0KLSAgICAvKiBUcmFuc2Zvcm0gcm93cyAqLwotICAgIGZvciAoaT0wOyBpPDE2OyBpKz00KQotICAgIHsKLSAgICAgICAgaW50IGMwID0gcERhdGFbaSswXTsKLSAgICAgICAgaW50IGMxID0gcERhdGFbaSsxXTsKLSAgICAgICAgaW50IGMyID0gcERhdGFbaSsyXTsKLSAgICAgICAgaW50IGMzID0gcERhdGFbaSszXTsKLSAgICAgICAgcERhdGFbaSswXSA9IChPTVhfUzE2KShjMCtjMStjMitjMyk7Ci0gICAgICAgIHBEYXRhW2krMV0gPSAoT01YX1MxNikoYzArYzEtYzItYzMpOwotICAgICAgICBwRGF0YVtpKzJdID0gKE9NWF9TMTYpKGMwLWMxLWMyK2MzKTsKLSAgICAgICAgcERhdGFbaSszXSA9IChPTVhfUzE2KShjMC1jMStjMi1jMyk7Ci0gICAgfQotCi0gICAgLyogVHJhbnNmb3JtIGNvbHVtbnMgKi8KLSAgICBmb3IgKGk9MDsgaTw0OyBpKyspCi0gICAgewotICAgICAgICBpbnQgYzAgPSBwRGF0YVtpKzBdOwotICAgICAgICBpbnQgYzEgPSBwRGF0YVtpKzRdOwotICAgICAgICBpbnQgYzIgPSBwRGF0YVtpKzhdOwotICAgICAgICBpbnQgYzMgPSBwRGF0YVtpKzEyXTsKLSAgICAgICAgcERhdGFbaSswXSA9IChPTVhfUzE2KShjMCtjMStjMitjMyk7Ci0gICAgICAgIHBEYXRhW2krNF0gPSAoT01YX1MxNikoYzArYzEtYzItYzMpOwotICAgICAgICBwRGF0YVtpKzhdID0gKE9NWF9TMTYpKGMwLWMxLWMyK2MzKTsKLSAgICAgICAgcERhdGFbaSsxMl0gPSAoT01YX1MxNikoYzAtYzErYzItYzMpOwotICAgIH0KLX0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIgICAoNi4zLjQuMi4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUmVjb25zdHJ1Y3RzIHRoZSA0eDQgTHVtYURDIGJsb2NrIGZyb20gdGhlIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgCi0gKiBidWZmZXIsIHBlcmZvcm1zIGludGVnZXIgaW52ZXJzZSwgYW5kIGRlcXVhbnRpemF0aW9uIGZvciA0eDQgTHVtYURDIAotICogY29lZmZpY2llbnRzLCBhbmQgdXBkYXRlcyB0aGUgcGFpciBidWZmZXIgcG9pbnRlciB0byB0aGUgbmV4dCBub24tZW1wdHkgCi0gKiBibG9jay4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBTcmMgLSBEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciAKLSAqICAgICAgICAgICAgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nIAotICogICBRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXIgUXBZIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcFNyYyAtICpwcFNyYyBpcyB1cGRhdGVkIHRvIHRoZSBzdGFydCBvZiBuZXh0IG5vbiBlbXB0eSBibG9jayAKLSAqICAgcERzdCAtIFBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgNHg0IEx1bWFEQyBjb2VmZmljaWVudHMgYnVmZmVyOyBtdXN0IAotICogICAgICAgICAgICBiZSBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBwcFNyYyBvciBwRHN0IGlzIE5VTEwuIAotICogICAgLSAgICBwRHN0IGlzIG5vdCA4IGJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIFFQIGlzIG5vdCBpbiB0aGUgcmFuZ2Ugb2YgWzAtNTFdLiAKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyKAotICAgICBjb25zdCBPTVhfVTggKipwcFNyYywKLSAgICAgT01YX1MxNiogcERzdCwKLSAgICAgT01YX0lOVCBRUCAgICAgICAgCi0gKQotewotICAgIGFybVJldEFyZ0VycklmKHBwU3JjICA9PSBOVUxMLCAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCpwcFNyYyA9PSBOVUxMLCAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBEc3QgICA9PSBOVUxMLCAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDhCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKFFQPDAsICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKFFQPjUxLCAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotCi0gICAgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NChwcFNyYywgcERzdCk7Ci0gICAgLypJbnZUcmFuc2Zvcm1EZXF1YW50THVtYURDNHg0KHBEc3QsIFFQKTsqLwotICAgIEludlRyYW5zZm9ybURDNHg0KHBEc3QpOwotICAgIERlcXVhbnRMdW1hREM0eDQocERzdCwgUVApOwotCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0Nocm9tYURDLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0Nocm9tYURDLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNmEzZDAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9DaHJvbWFEQy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0Nocm9tYURDLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSA0eDQgaGFkYW1hcmQgdHJhbnNmb3JtIG9mIGNocm9tYSBEQyAgCi0gKiBjb2VmZmljaWVudHMgYW5kIHF1YW50aXphdGlvbgotICogCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybVZDLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9DaHJvbWFEQyAgICg2LjMuNS42LjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIDJ4MiBIYWRhbWFyZCB0cmFuc2Zvcm0gb2YgY2hyb21hIERDIGNvZWZmaWNpZW50cyAKLSAqIGFuZCB0aGVuIHF1YW50aXplcyB0aGUgY29lZmZpY2llbnRzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0aGUgMngyIGFycmF5IG9mIGNocm9tYSBEQyBjb2VmZmljaWVudHMuICA4LWJ5dGUgCi0gKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIGlRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXI7IG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDUxXS4gCi0gKiAgIGJJbnRyYSAtIEluZGljYXRlIHdoZXRoZXIgdGhpcyBpcyBhbiBJTlRSQSBibG9jay4gMS1JTlRSQSwgMC1JTlRFUiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdHJhbnNmb3JtZWQgYW5kIHF1YW50aXplZCBjb2VmZmljaWVudHMuICA4LWJ5dGUgCi0gKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgICAgIHBTcmNEc3QgCi0gKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfQ2hyb21hREMoCi0JT01YX1MxNiogCXBTcmNEc3QsCi0JT01YX1UzMgkJaVFQLAotCU9NWF9VOAkJYkludHJhCi0pCi17Ci0gICAgT01YX0lOVCAgICAgaSwgajsKLSAgICBPTVhfUzMyICAgICBtWzJdWzJdOwotICAgIE9NWF9TMzIgICAgIFZhbHVlOwotICAgIE9NWF9TMzIgICAgIFFiaXRzUGx1c09uZSwgVHdvX2YsIE1GMDA7Ci0KLSAgICAvKiBDaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q4Qnl0ZUFsaWduZWQocFNyY0RzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihpUVAgPiA1MSwgT01YX1N0c19CYWRBcmdFcnIpOwotCi0gICAgLyogSGFkYW1hcmQgVHJhbnNmb3JtIGZvciAyeDIgYmxvY2sgKi8KLSAgICBtWzBdWzBdID0gcFNyY0RzdFswXSArIHBTcmNEc3RbMV0gKyAgcFNyY0RzdFsyXSArIHBTcmNEc3RbM107Ci0gICAgbVswXVsxXSA9IHBTcmNEc3RbMF0gLSBwU3JjRHN0WzFdICsgIHBTcmNEc3RbMl0gLSBwU3JjRHN0WzNdOwotICAgIG1bMV1bMF0gPSBwU3JjRHN0WzBdICsgcFNyY0RzdFsxXSAtICBwU3JjRHN0WzJdIC0gcFNyY0RzdFszXTsKLSAgICBtWzFdWzFdID0gcFNyY0RzdFswXSAtIHBTcmNEc3RbMV0gLSAgcFNyY0RzdFsyXSArIHBTcmNEc3RbM107Ci0KLSAgICAvKiBRdWFudGl6YXRpb24gKi8KLSAgICBRYml0c1BsdXNPbmUgPSBBUk1fTTRQMTBfUV9PRkZTRVQgKyAxICsgKGlRUCAvIDYpOyAvKmZsb29yIChRUC82KSovCi0gICAgTUYwMCA9IGFybVZDTTRQMTBfTUZNYXRyaXggW2lRUCAlIDZdWzBdOwotCi0gICAgVHdvX2YgPSAoMSA8PCBRYml0c1BsdXNPbmUpIC8gKGJJbnRyYSA/IDMgOiA2KTsgLyogMy0+SU5UUkEsIDYtPklOVEVSICovCi0KLSAgICAvKiBTY2FsaW5nICovCi0gICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykKLSAgICB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbHVlID0gKGFybUFicyhtW2pdW2ldKSAqIE1GMDAgKyBUd29fZikgPj4gUWJpdHNQbHVzT25lOwotICAgICAgICAgICAgcFNyY0RzdFtqICogMiArIGldID0gKE9NWF9TMTYpKChtW2pdW2ldIDwgMCkgPyAtVmFsdWUgOiBWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfTHVtYURDLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0x1bWFEQy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTk5YTJkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfTHVtYURDLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfTHVtYURDLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSA0eDQgaGFkYW1hcmQgdHJhbnNmb3JtIG9mIGx1bWEgREMgY29lZmZpY2llbnRzIAotICogYW5kIHF1YW50aXphdGlvbgotICogCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9MdW1hREMgICAoNi4zLjUuNi4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBhIDR4NCBIYWRhbWFyZCB0cmFuc2Zvcm0gb2YgbHVtYSBEQyBjb2VmZmljaWVudHMgCi0gKiBhbmQgdGhlbiBxdWFudGl6ZXMgdGhlIGNvZWZmaWNpZW50cy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdGhlIDR4NCBhcnJheSBvZiBsdW1hIERDIGNvZWZmaWNpZW50cy4gIDE2LWJ5dGUgCi0gKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIGlRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXI7IG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDUxXS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBQb2ludGVyIHRvIHRyYW5zZm9ybWVkIGFuZCBxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgMTYtYnl0ZSAKLSAqICAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjRHN0IAotICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGFuIDE2LWJ5dGUgYm91bmRhcnkgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9MdW1hREMoCi0JT01YX1MxNiogCXBTcmNEc3QsCi0JT01YX1UzMgkJaVFQCi0pCi17Ci0gICAgT01YX0lOVCAgICAgaSwgajsKLSAgICBPTVhfUzMyICAgICBtMVs0XVs0XSwgbTJbNF1bNF07Ci0gICAgT01YX1MzMiAgICAgVmFsdWU7Ci0gICAgT01YX1UzMiAgICAgUWJpdHNQbHVzT25lLCBUd29fZiwgTUY7Ci0KLSAgICAvKiBDaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3QxNkJ5dGVBbGlnbmVkKHBTcmNEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoaVFQID4gNTEsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQotICAgIC8qIEhhZGFtYXJkIFRyYW5zZm9ybSBmb3IgNHg0IGJsb2NrICovCi0gICAgLyogSG9yaXpvbnRhbCBIYWRhbWFyZCAqLwotICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgewotICAgICAgICBqID0gaSAqIDQ7Ci0gICAgICAgIAotICAgICAgICBtMVtpXVswXSA9IHBTcmNEc3RbaiArIDBdICsgcFNyY0RzdFtqICsgMl07IC8qIGErYyAqLwotICAgICAgICBtMVtpXVsxXSA9IHBTcmNEc3RbaiArIDFdICsgcFNyY0RzdFtqICsgM107IC8qIGIrZCAqLwotICAgICAgICBtMVtpXVsyXSA9IHBTcmNEc3RbaiArIDBdIC0gcFNyY0RzdFtqICsgMl07IC8qIGEtYyAqLwotICAgICAgICBtMVtpXVszXSA9IHBTcmNEc3RbaiArIDFdIC0gcFNyY0RzdFtqICsgM107IC8qIGItZCAqLwotCi0gICAgICAgIG0yW2ldWzBdID0gbTFbaV1bMF0gKyBtMVtpXVsxXTsgLyogYStiK2MrZCAqLwotICAgICAgICBtMltpXVsxXSA9IG0xW2ldWzJdICsgbTFbaV1bM107IC8qIGErYi1jLWQgKi8KLSAgICAgICAgbTJbaV1bMl0gPSBtMVtpXVsyXSAtIG0xW2ldWzNdOyAvKiBhLWItYytkICovCi0gICAgICAgIG0yW2ldWzNdID0gbTFbaV1bMF0gLSBtMVtpXVsxXTsgLyogYS1iK2MtZCAqLwotCi0gICAgfQotCi0gICAgLyogVmVydGljYWwgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgIHsKLSAgICAgICAgbTFbMF1baV0gPSBtMlswXVtpXSArIG0yWzJdW2ldOwotICAgICAgICBtMVsxXVtpXSA9IG0yWzFdW2ldICsgbTJbM11baV07Ci0gICAgICAgIG0xWzJdW2ldID0gbTJbMF1baV0gLSBtMlsyXVtpXTsKLSAgICAgICAgbTFbM11baV0gPSBtMlsxXVtpXSAtIG0yWzNdW2ldOwotCi0gICAgICAgIG0yWzBdW2ldID0gbTFbMF1baV0gKyBtMVsxXVtpXTsKLSAgICAgICAgbTJbMV1baV0gPSBtMVsyXVtpXSArIG0xWzNdW2ldOwotICAgICAgICBtMlsyXVtpXSA9IG0xWzJdW2ldIC0gbTFbM11baV07Ci0gICAgICAgIG0yWzNdW2ldID0gbTFbMF1baV0gLSBtMVsxXVtpXTsKLSAgICB9Ci0KLSAgICAKLSAgICAvKiBRdWFudGl6YXRpb24gKi8KLSAgICBRYml0c1BsdXNPbmUgPSBBUk1fTTRQMTBfUV9PRkZTRVQgKyAxICsgKGlRUCAvIDYpOyAvKmZsb29yIChRUC82KSovCi0gICAgVHdvX2YgPSAoMSA8PCBRYml0c1BsdXNPbmUpIC8gMzsgLyogMy0+SU5UUkEsIDYtPklOVEVSICovCi0gICAgTUYgPSBhcm1WQ000UDEwX01GTWF0cml4IFtpUVAgJSA2XVswXTsKLQotICAgIC8qIFNjYWxpbmcgKi8KLSAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKQotICAgIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgVmFsdWUgPSAoYXJtQWJzKChtMltqXVtpXS8qICsgMSovKSAvIDIpICogTUYgKyBUd29fZikgPj4gUWJpdHNQbHVzT25lOwotICAgICAgICAgICAgcFNyY0RzdFtqICogNCArIGldID0gKE9NWF9TMTYpKChtMltqXVtpXSA8IDApID8gLVZhbHVlIDogVmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL2FwaS9hcm1WQ000UDJfRENUX1RhYmxlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvYXBpL2FybVZDTTRQMl9EQ1RfVGFibGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTcyZGExMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvYXBpL2FybVZDTTRQMl9EQ1RfVGFibGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfRENUX1RhYmxlLmgKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKgotICogRmlsZTogICAgICAgIGFybVZDTTRQMl9EQ1RfVGFibGUuaAotICogRGVzY3JpcHRpb246IERlY2xhcmVzIFRhYmxlcyB1c2VkIGZvciBEQ1QvSURDVCBtb2R1bGUKLSAqICAgICAgICAgICAgICBpbiBNUDRQMiBjb2RlYy4KLSAqCi0gKi8KLSAKLSNpZm5kZWYgX09NWERDVFRBQl9IXwotI2RlZmluZSBfT01YRENUVEFCX0hfCi0KLWV4dGVybiBjb25zdCBPTVhfRjY0IGFybVZDTTRQMl9wcmVDYWxjRENUQ29zWzhdWzhdOwotCi0jZW5kaWYgLyogX09NWERDVFRBQl9IXyAqLwotCi0KLS8qIEVuZCBvZiBmaWxlICovCi0KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvYXBpL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODhiZGJjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaAotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqCi0gKiBGaWxlOiAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzLmgKLSAqIERlc2NyaXB0aW9uOiBEZWNsYXJlcyBUYWJsZXMgdXNlZCBmb3IgSHVmZmZtYW4gY29kaW5nIGFuZCBkZWNvZGluZyAKLSAqICAgICAgICAgICAgICBpbiBNUDRQMiBjb2RlYy4KLSAqCi0gKi8KLSAKLSNpZm5kZWYgX09NWEhVRkZUQUJfSF8KLSNkZWZpbmUgX09NWEhVRkZUQUJfSF8KLQotZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50cmFMMFJ1bklkeFsxMV07Ci1leHRlcm4gY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMl9JbnRyYVZsY0wwWzY4XTsKLWV4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDFSdW5JZHhbN107Ci1leHRlcm4gY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMl9JbnRyYVZsY0wxWzM2XTsKLWV4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDBMTUFYWzE1XTsKLWV4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDFMTUFYWzIxXTsKLWV4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDBSTUFYWzI3XTsKLWV4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDFSTUFYWzhdOwotZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50ZXJMMFJ1bklkeFsxMl07Ci1leHRlcm4gY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMl9JbnRlclZsY0wwWzU5XTsKLWV4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDFSdW5JZHhbM107Ci1leHRlcm4gY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMl9JbnRlclZsY0wxWzQ1XTsKLWV4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDBMTUFYWzI3XTsKLWV4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDFMTUFYWzQxXTsKLWV4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDBSTUFYWzEyXTsKLWV4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDFSTUFYWzNdOwotZXh0ZXJuIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDJfYUludHJhRENMdW1hSW5kZXhbMTRdOwotZXh0ZXJuIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDJfYUludHJhRENDaHJvbWFJbmRleFsxNF07Ci1leHRlcm4gY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMl9hVmxjTVZEWzY2XTsKLQotI2VuZGlmIC8qIF9PTVhIVUZGVEFCX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvYXBpL2FybVZDTTRQMl9aaWdaYWdfVGFibGVzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvYXBpL2FybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwYzE2M2YuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL2FwaS9hcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKgotICogRmlsZTogICAgICAgIGFybVZDTTRQMl9aaWd6YWdfVGFibGVzLmgKLSAqIERlc2NyaXB0aW9uOiBEZWNsYXJlcyBUYWJsZXMgdXNlZCBmb3IgWmlnemFnIHNjYW4gaW4gTVA0UDIgY29kZWMuCi0gKgotICovCi0gCi0jaWZuZGVmIF9PTVhaSUdaQUdUQUJfSF8KLSNkZWZpbmUgX09NWFpJR1pBR1RBQl9IXwotCi1leHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbiBbNjRdOwotZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfYUhvcml6b250YWxaaWd6YWdTY2FuIFs2NF07Ci1leHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9hVmVydGljYWxaaWd6YWdTY2FuIFs2NF07Ci0KLSNlbmRpZiAvKiBfT01YWklHWkFHVEFCX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9BQ0RDUHJlZGljdC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQUNEQ1ByZWRpY3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk5M2Y3My4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9BQ0RDUHJlZGljdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjY4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfQUNEQ1ByZWRpY3QuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnRhaW5zIG1vZHVsZSBmb3IgREMvQUMgY29lZmZpY2llbnQgcHJlZGljdGlvbgotICoKLSAqLyAKLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9BQ0RDUHJlZGljdAotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgYWRhcHRpdmUgREMvQUMgY29lZmZpY2llbnQgcHJlZGljdGlvbiBmb3IgYW4gaW50cmEgYmxvY2suIFByaW9yCi0gKiB0byB0aGUgZnVuY3Rpb24gY2FsbCwgcHJlZGljdGlvbiBkaXJlY3Rpb24gKHByZWREaXIpIHNob3VsZCBiZSBzZWxlY3RlZAotICogYXMgc3BlY2lmaWVkIGluIHN1YmNsYXVzZSA3LjQuMy4xIG9mIElTTy9JRUMgMTQ0OTYtMi4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHBTcmNEc3QgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucwotICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBxdWFudGl6ZWQgY29lZmZpY2llbnQgcmVzaWR1YWxzIChQUUYpIG9mIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYmxvY2sKLSAqIFtpbl0gcFByZWRCdWZSb3cgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcgotICogW2luXSBwUHJlZEJ1ZkNvbCBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyCi0gKiBbaW5dIGN1clFQICAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIGN1cnJlbnQgYmxvY2suIGN1clFQCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF5IGVxdWFsIHRvIHByZWRRUCBlc3BlY2lhbGx5IHdoZW4gdGhlIGN1cnJlbnQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jayBhbmQgdGhlIHByZWRpY3RvciBibG9jayBhcmUgaW4gdGhlIHNhbWUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrLgotICogW2luXSBwcmVkUVAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBwcmVkaWN0b3IgYmxvY2sKLSAqIFtpbl0gcHJlZERpciAgICAgaW5kaWNhdGVzIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbiB3aGljaCB0YWtlcyBvbmUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVkNfSE9SSVpPTlRBTCAgICBwcmVkaWN0IGhvcml6b250YWxseQotICogICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WQ19WRVJUSUNBTCAgICAgIHByZWRpY3QgdmVydGljYWxseQotICogW2luXSBBQ1ByZWRGbGFnICBhIGZsYWcgaW5kaWNhdGluZyBpZiBBQyBwcmVkaWN0aW9uIHNob3VsZCBiZQotICogICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1lZC4gSXQgaXMgZXF1YWwgdG8gYWNfcHJlZF9mbGFnIGluIHRoZSBiaXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gc3ludGF4IG9mIE1QRUctNAotICogW2luXSB2aWRlb0NvbXAgICB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlLCBjaHJvbWluYW5jZSBvcgotICogICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhKSBvZiB0aGUgY3VycmVudCBibG9jawotICogW2luXSBmbGFnICAgICAgICBUaGlzIGZsYWcgZGVmaW5lcyB0aGUgaWYgb25lIHdhbnRzIHRvIHVzZSB0aGlzIGZ1bmN0aW9ucyB0bwotICogICAgICAgICAgICAgICAgICBjYWxjdWxhdGUgUFFGIChzZXQgMSwgcHJlZGljdGlvbikgb3IgUUYgKHNldCAwLCByZWNvbnN0cnVjdGlvbikKLSAqIFtvdXRdICAgIHBQcmVBQ1ByZWRpY3QgICBwb2ludGVyIHRvIHRoZSBwcmVkaWN0ZWQgY29lZmZpY2llbnRzIGJ1ZmZlci4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxsZWQgT05MWSBpZiBpdCBpcyBub3QgTlVMTAotICogW291dF0gICAgcFNyY0RzdCAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIHdoaWNoIGNvbnRhaW5zCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHF1YW50aXplZCBjb2VmZmljaWVudHMgKFFGKSBvZiB0aGUgY3VycmVudAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrCi0gKiBbb3V0XSAgICBwUHJlZEJ1ZlJvdyBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IHJvdyBidWZmZXIKLSAqIFtvdXRdICAgIHBQcmVkQnVmQ29sIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcgotICogW291dF0gICAgcFN1bUVyciAgICAgcG9pbnRlciB0byB0aGUgdXBkYXRlZCBzdW0gb2YgdGhlIGRpZmZlcmVuY2UKLSAqICAgICAgICAgICAgICAgICAgICAgIGJldHdlZW4gcHJlZGljdGVkIGFuZCB1bnByZWRpY3RlZCBjb2VmZmljaWVudHMKLSAqICAgICAgICAgICAgICAgICAgICAgIElmIHRoaXMgaXMgTlVMTCwgZG8gbm90IHVwZGF0ZQotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAyX0FDRENQcmVkaWN0KAotICAgICBPTVhfUzE2ICogcFNyY0RzdCwKLSAgICAgT01YX1MxNiAqIHBQcmVBQ1ByZWRpY3QsCi0gICAgIE9NWF9TMTYgKiBwUHJlZEJ1ZlJvdywKLSAgICAgT01YX1MxNiAqIHBQcmVkQnVmQ29sLAotICAgICBPTVhfSU5UIGN1clFQLAotICAgICBPTVhfSU5UIHByZWRRUCwKLSAgICAgT01YX0lOVCBwcmVkRGlyLAotICAgICBPTVhfSU5UIEFDUHJlZEZsYWcsCi0gICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50IHZpZGVvQ29tcCwKLSAgICAgT01YX1U4IGZsYWcsCi0gICAgIE9NWF9JTlQgKnBTdW1FcnIKLSkKLXsKLSAgICBPTVhfSU5UIGRjU2NhbGVyLCBpOwotICAgIE9NWF9TMTYgdGVtcFByZWQ7Ci0KLSAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwUHJlZEJ1ZlJvdyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFByZWRCdWZDb2wgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGN1clFQIDw9IDAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwcmVkUVAgPD0gMCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChwcmVkRGlyICE9IDEpICYmIChwcmVkRGlyICE9IDIpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoIWFybUlzNEJ5dGVBbGlnbmVkKHBTcmNEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoIWFybUlzNEJ5dGVBbGlnbmVkKHBQcmVkQnVmUm93KSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCFhcm1JczRCeXRlQWxpZ25lZChwUHJlZEJ1ZkNvbCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQotICAgIAotICAgIC8qIFNldCBEQyBzY2FsZXIgdmFsdWUgdG8gYXZvaWQgc29tZSBjb21waWxlcnMgZ2l2aW5nIGEgd2FybmluZy4gKi8KLSAgICBkY1NjYWxlcj0wOwotICAgIAotICAgIC8qIENhbGN1bGF0ZSB0aGUgREMgc2NhbGVyIHZhbHVlICovCi0gICAgaWYgKHZpZGVvQ29tcCA9PSBPTVhfVkNfTFVNSU5BTkNFKQotICAgIHsKLSAgICAgICAgaWYgKGN1clFQID49IDEgJiYgY3VyUVAgPD0gNCkKLSAgICAgICAgewotICAgICAgICAgICAgZGNTY2FsZXIgPSA4OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGN1clFQID49IDUgJiYgY3VyUVAgPD0gOCkKLSAgICAgICAgewotICAgICAgICAgICAgZGNTY2FsZXIgPSAyICogY3VyUVA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoY3VyUVAgPj0gOSAmJiBjdXJRUCA8PSAyNCkKLSAgICAgICAgewotICAgICAgICAgICAgZGNTY2FsZXIgPSBjdXJRUCArIDg7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBkY1NjYWxlciA9ICgyICogY3VyUVApIC0gMTY7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAodmlkZW9Db21wID09IE9NWF9WQ19DSFJPTUlOQU5DRSkKLSAgICB7Ci0gICAgICAgIGlmIChjdXJRUCA+PSAxICYmIGN1clFQIDw9IDQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRjU2NhbGVyID0gODsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChjdXJRUCA+PSA1ICYmIGN1clFQIDw9IDI0KQotICAgICAgICB7Ci0gICAgICAgICAgICBkY1NjYWxlciA9IChjdXJRUCArIDEzKS8yOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZGNTY2FsZXIgPSBjdXJRUCAtIDY7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAocFByZUFDUHJlZGljdCAhPSBOVUxMKQotICAgIHsKLSAgICAgICAgcFByZUFDUHJlZGljdFswXSA9IHByZWREaXI7Ci0gICAgfQotCi0gICAgaWYgKHByZWREaXIgPT0gT01YX1ZDX1ZFUlRJQ0FMKQotICAgIHsKLSAgICAgICAgLyogRlswXVswXS8vZGNfc2NhbGVyICovCi0gICAgICAgIHRlbXBQcmVkID0gYXJtSW50RGl2QXdheUZyb21aZXJvKHBQcmVkQnVmUm93WzBdLCBkY1NjYWxlcik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIEZbMF1bMF0vL2RjX3NjYWxlciAqLwotICAgICAgICB0ZW1wUHJlZCA9IGFybUludERpdkF3YXlGcm9tWmVybyhwUHJlZEJ1ZkNvbFswXSwgZGNTY2FsZXIpOwotICAgIH0KLQotICAgIC8qIFVwZGF0aW5nIHRoZSBEQyB2YWx1ZSB0byB0aGUgcm93IGFuZCBjb2wgYnVmZmVyICovCi0gICAgKihwUHJlZEJ1ZlJvdyAtIDgpID0gKnBQcmVkQnVmQ29sOwotCi0gICAgaWYgKGZsYWcpCi0gICAgewotICAgICAgICAvKiBDYWwgYW5kIHN0b3JlIEZbMF1bMF0gaW50byB0aGUgY29sIGJ1ZmZlciAqLwotICAgICAgICAqcFByZWRCdWZDb2wgPSBwU3JjRHN0WzBdICogZGNTY2FsZXI7Ci0KLSAgICAgICAgLyogUFFGID0gUUYgLSBGWzBdWzBdLy9kY19zY2FsZXIgKi8KLSAgICAgICAgcFNyY0RzdFswXSAtPSB0ZW1wUHJlZDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogUUYgPSBQUUYgKyBGWzBdWzBdLy9kY19zY2FsZXIgKi8KLSAgICAgICAgcFNyY0RzdFswXSArPSB0ZW1wUHJlZDsKLSAgICAgICAgCi0gICAgICAgIC8qIFNhdHVyYXRlICovCi0gICAgICAgIHBTcmNEc3RbMF0gPSBhcm1DbGlwICgtMjA0OCwgMjA0NywgcFNyY0RzdFswXSk7Ci0KLSAgICAgICAgLyogQ2FsIGFuZCBzdG9yZSBGWzBdWzBdIGludG8gdGhlIGNvbCBidWZmZXIgKi8KLSAgICAgICAgKnBQcmVkQnVmQ29sID0gcFNyY0RzdFswXSAqIGRjU2NhbGVyOwotICAgIH0KLQotCi0gICAgaWYgKEFDUHJlZEZsYWcgPT0gMSkKLSAgICB7Ci0gICAgICAgIGlmIChwcmVkRGlyID09IE9NWF9WQ19WRVJUSUNBTCkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IDg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0ZW1wUHJlZCA9IGFybUludERpdkF3YXlGcm9tWmVybyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocFByZWRCdWZSb3dbaV0gKiBwcmVkUVAsIGN1clFQKTsKLSAgICAgICAgICAgICAgICBpZiAoZmxhZykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0aW5nIFFGIHRvIHRoZSByb3cgYnVmZiAqLwotICAgICAgICAgICAgICAgICAgICBwUHJlZEJ1ZlJvd1tpXSA9IHBTcmNEc3RbaV07Ci0gICAgICAgICAgICAgICAgICAgIC8qUFFGWFt2XVswXSA9IFFGWFt2XVswXSAtIChRRkFbdl1bMF0gKiBRUEEpIC8vIFFQWCAqLwotICAgICAgICAgICAgICAgICAgICBwU3JjRHN0W2ldIC09IHRlbXBQcmVkOwotICAgICAgICAgICAgICAgICAgICAvKiBTdW0gb2YgYWJzb2x1dGUgdmFsdWVzIG9mIEFDIHByZWRpY3Rpb24gZXJyb3IsIHRoaXMgY2FuCi0gICAgICAgICAgICAgICAgICAgIGJlIHVzZWQgYXMgYSByZWZlcmVuY2UgdG8gY2hvb3NlIHdoZXRoZXIgdG8gdXNlCi0gICAgICAgICAgICAgICAgICAgIEFDIHByZWRpY3Rpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgKnBTdW1FcnIgKz0gYXJtQWJzKHBTcmNEc3RbaV0pOwotICAgICAgICAgICAgICAgICAgICAvKiBwUHJlQUNQcmVkaWN0WzF+N10gc3RvcmUgdGhlIGVycm9yIHNpZ25hbAotICAgICAgICAgICAgICAgICAgICBhZnRlciBBQyBwcmVkaWN0aW9uICovCi0gICAgICAgICAgICAgICAgICAgIHBQcmVBQ1ByZWRpY3RbaV0gPSBwU3JjRHN0W2ldOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKlFGWFt2XVswXSA9IFBRRlhbdl1bMF0gKyAoUUZBW3ZdWzBdICogUVBBKSAvLyBRUFggKi8KLSAgICAgICAgICAgICAgICAgICAgcFNyY0RzdFtpXSArPSB0ZW1wUHJlZDsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIC8qIFNhdHVyYXRlICovCi0gICAgICAgICAgICAgICAgICAgIHBTcmNEc3RbaV0gPSBhcm1DbGlwICgtMjA0OCwgMjA0NywgcFNyY0RzdFtpXSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGluZyBRRiB0byB0aGUgcm93IGJ1ZmYgKi8KLSAgICAgICAgICAgICAgICAgICAgcFByZWRCdWZSb3dbaV0gPSBwU3JjRHN0W2ldOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaSA9IDg7IGkgPCA2NDsgaSArPSA4KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRlbXBQcmVkID0gYXJtSW50RGl2QXdheUZyb21aZXJvIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwUHJlZEJ1ZkNvbFtpPj4zXSAqIHByZWRRUCwgY3VyUVApOwotICAgICAgICAgICAgICAgIGlmIChmbGFnKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRpbmcgUUYgdG8gY29sIGJ1ZmYgKi8KLSAgICAgICAgICAgICAgICAgICAgcFByZWRCdWZDb2xbaT4+M10gPSBwU3JjRHN0W2ldOwotICAgICAgICAgICAgICAgICAgICAvKlBRRlhbMF1bdV0gPSBRRlhbMF1bdV0gLSAoUUZBWzBdW3VdICogUVBBKSAvLyBRUFggKi8KLSAgICAgICAgICAgICAgICAgICAgcFNyY0RzdFtpXSAtPSB0ZW1wUHJlZDsKLSAgICAgICAgICAgICAgICAgICAgLyogU3VtIG9mIGFic29sdXRlIHZhbHVlcyBvZiBBQyBwcmVkaWN0aW9uIGVycm9yLCB0aGlzIGNhbgotICAgICAgICAgICAgICAgICAgICBiZSB1c2VkIGFzIGEgcmVmZXJlbmNlIHRvIGNob29zZSB3aGV0aGVyIHRvIHVzZSBBQwotICAgICAgICAgICAgICAgICAgICBwcmVkaWN0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICpwU3VtRXJyICs9IGFybUFicyhwU3JjRHN0W2ldKTsKLSAgICAgICAgICAgICAgICAgICAgLyogcFByZUFDUHJlZGljdFsxfjddIHN0b3JlIHRoZSBlcnJvciBzaWduYWwKLSAgICAgICAgICAgICAgICAgICAgYWZ0ZXIgQUMgcHJlZGljdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICBwUHJlQUNQcmVkaWN0W2k+PjNdID0gcFNyY0RzdFtpXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypRRlhbMF1bdV0gPSBQUUZYWzBdW3VdICsgKFFGQVswXVt1XSAqIFFQQSkgLy8gUVBYICovCi0gICAgICAgICAgICAgICAgICAgIHBTcmNEc3RbaV0gKz0gdGVtcFByZWQ7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAvKiBTYXR1cmF0ZSAqLwotICAgICAgICAgICAgICAgICAgICBwU3JjRHN0W2ldID0gYXJtQ2xpcCAoLTIwNDgsIDIwNDcsIHBTcmNEc3RbaV0pOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRpbmcgUUYgdG8gY29sIGJ1ZmYgKi8KLSAgICAgICAgICAgICAgICAgICAgcFByZWRCdWZDb2xbaT4+M10gPSBwU3JjRHN0W2ldOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0vKkVuZCBvZiBGaWxlKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQmxvY2tNYXRjaF9IYWxmLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9CbG9ja01hdGNoX0hhbGYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZmZGExMC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9CbG9ja01hdGNoX0hhbGYuYworKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZi5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogQ29udGFpbnMgbW9kdWxlcyBmb3IgQmxvY2sgbWF0Y2hpbmcsIGEgZnVsbCBzZWFyY2ggYWxnb3JpdGhtCi0gKiBpcyBpbXBsZW1lbnRlZAotICoKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9CbG9ja01hdGNoX0hhbGYKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGEgMTZ4MTYgYmxvY2sgbWF0Y2ggd2l0aCBoYWxmLXBpeGVsIHJlc29sdXRpb24uICBSZXR1cm5zIHRoZSBlc3RpbWF0ZWQgCi0gKiBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIG1pbmltdW0gU0FELiAgVGhpcyBmdW5jdGlvbiBlc3RpbWF0ZXMgdGhlIGhhbGYtcGl4ZWwgCi0gKiBtb3Rpb24gdmVjdG9yIGJ5IGludGVycG9sYXRpbmcgdGhlIGludGVnZXIgcmVzb2x1dGlvbiBtb3Rpb24gdmVjdG9yIHJlZmVyZW5jZWQgCi0gKiBieSB0aGUgaW5wdXQgcGFyYW1ldGVyIHBTcmNEc3RNViwgaS5lLiwgdGhlIGluaXRpYWwgaW50ZWdlciBNViBpcyBnZW5lcmF0ZWQgCi0gKiBleHRlcm5hbGx5LiAgVGhlIGlucHV0IHBhcmFtZXRlcnMgcFNyY1JlZkJ1ZiBhbmQgcFNlYXJjaFBvaW50UmVmUG9zIHNob3VsZCBiZSAKLSAqIHNoaWZ0ZWQgYnkgdGhlIHdpbm5pbmcgTVYgb2YgMTZ4MTYgaW50ZWdlciBzZWFyY2ggcHJpb3IgdG8gY2FsbGluZyBCbG9ja01hdGNoX0hhbGZfMTZ4MTYuICAKLSAqIFRoZSBmdW5jdGlvbiBCbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYgbWF5IGJlIHVzZWQgZm9yIGludGVnZXIgbW90aW9uIGVzdGltYXRpb24uCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwU3JjUmVmQnVmCQlwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgTUIgCi0gKiAgICAgICAgICAgICAgICAgICAgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiAKLSAqICAgICAgICAgICAgICAgICAgICB0aGUJY3VycmVudCBwbGFuZS4KLSAqIFtpbl0JcmVmV2lkdGgJCSAgd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZQotICogW2luXQlwUmVmUmVjdAkJICByZWZlcmVuY2UgcGxhbmUgdmFsaWQgcmVnaW9uIHJlY3RhbmdsZQotICogW2luXQlwU3JjQ3VyckJ1ZgkJcG9pbnRlciB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGV4dHJhY3RlZCBmcm9tIG9yaWdpbmFsIHBsYW5lIAotICogICAgICAgICAgICAgICAgICAgIChsaW5lYXIgYXJyYXksIDI1NiBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiBbaW5dCXBTZWFyY2hQb2ludFJlZlBvcwlwb3NpdGlvbiBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIGhhbGYgcGl4ZWwgc2VhcmNoIChzcGVjaWZpZWQgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGVybXMgb2YgaW50ZWdlciBwaXhlbCB1bml0cykgaW4gdGhlIHJlZmVyZW5jZSBwbGFuZS4KLSAqIFtpbl0Jcm5kVmFsCQkJICByb3VuZGluZyBjb250cm9sIGJpdCBmb3IgaGFsZiBwaXhlbCBtb3Rpb24gZXN0aW1hdGlvbjsgCi0gKiAgICAgICAgICAgICAgICAgICAgMD1yb3VuZGluZyBjb250cm9sIGRpc2FibGVkOyAxPXJvdW5kaW5nIGNvbnRyb2wgZW5hYmxlZAotICogW2luXQlwU3JjRHN0TVYJCXBvaW50ZXIgdG8gdGhlIGluaXRpYWwgTVYgZXN0aW1hdGU7IHR5cGljYWxseSBnZW5lcmF0ZWQgZHVyaW5nIGEgcHJpb3IgCi0gKiAgICAgICAgICAgICAgICAgIDE2WDE2IGludGVnZXIgc2VhcmNoIGFuZCBpdHMgdW5pdCBpcyBoYWxmIHBpeGVsLgotICogW2luXSBCbG9ja1NpemUgICAgIE1hY3JvQmxvY2sgU2l6ZSBpLmUgZWl0aGVyIDE2eDE2IG9yIDh4OC4KLSAqIFtvdXRdcFNyY0RzdE1WCQlwb2ludGVyIHRvIGVzdGltYXRlZCBNVgotICogW291dF1wRHN0U0FECQkJcG9pbnRlciB0byBtaW5pbXVtIFNBRAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9TdHNfTm9FcnIgqEMgbm8gZXJyb3IKLSAqIE9NWF9TdHNfQmFkQXJnRXJyIKhDIGJhZCBhcmd1bWVudHMKLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMl9CbG9ja01hdGNoX0hhbGYoCi0gICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKLSAgICAgT01YX0lOVCByZWZXaWR0aCwKLSAgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCi0gICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCi0gICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBTZWFyY2hQb2ludFJlZlBvcywKLSAgICAgT01YX0lOVCBybmRWYWwsCi0gICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjRHN0TVYsCi0gICAgIE9NWF9JTlQgKnBEc3RTQUQsCi0gICAgIE9NWF9VOCBCbG9ja1NpemUKLSkKLXsKLSAgICBPTVhfSU5UICAgICBvdXRlciwgaW5uZXIsIGNvdW50LCBpbmRleDsKLSAgICBPTVhfUzE2ICAgICBoYWxmUGVsWCA9IDAsIGhhbGZQZWxZID0gMCwgeCwgeTsKLSAgICBPTVhfSU5UICAgICBjYW5kU0FELCByZWZTQUQgPSAwOwotICAgIE9NWF9JTlQgICAgIG1pblNBRCwgZnJvbVgsIHRvWCwgZnJvbVksIHRvWTsKLSAgICAvKiBPZmZzZXQgdG8gdGhlIHJlZmVyZW5jZSBhdCB0aGUgYmVnaW5pbmcgb2YgdGhlIGJvdW5kaW5nIGJveCAqLwotICAgIGNvbnN0IE9NWF9VOCAgICAgICpwVGVtcFNyY1JlZkJ1ZjsKLSAgICBPTVhfVTggdGVtcFBlbDsKLSAgICAgICAgCi0gICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY1JlZkJ1ZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFJlZlJlY3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBTcmNDdXJyQnVmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwU2VhcmNoUG9pbnRSZWZQb3MgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3RNViA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocERzdFNBRCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0KLSAgICAvKiBQb3NpdGlvbmluZyB0aGUgcG9pbnRlciAqLwotICAgIHBUZW1wU3JjUmVmQnVmID0gcFNyY1JlZkJ1ZiArIChyZWZXaWR0aCAqIChwU3JjRHN0TVYtPmR5LzIpKSArIChwU3JjRHN0TVYtPmR4LzIpOwotCi0gICAgLyogQ29weSB0aGUgY2FuZGlkYXRlIHRvIHRoZSB0ZW1wb3JhcnkgbGluZWFyIGFycmF5ICovCi0gICAgZm9yIChvdXRlciA9IDAsIGNvdW50ID0gMCxpbmRleCA9IDA7Ci0gICAgICAgICBvdXRlciA8IEJsb2NrU2l6ZTsKLSAgICAgICAgIG91dGVyKyssIGluZGV4ICs9IHJlZldpZHRoIC0gQmxvY2tTaXplKQotICAgIHsKLSAgICAgICAgZm9yIChpbm5lciA9IDA7IGlubmVyIDwgQmxvY2tTaXplOyBpbm5lcisrLCBjb3VudCsrLCBpbmRleCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICByZWZTQUQgKz0gYXJtQWJzIChwVGVtcFNyY1JlZkJ1ZltpbmRleF0gLSBwU3JjQ3VyckJ1Zltjb3VudF0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogU2V0IHRoZSBtaW5TYWQgYXMgcmVmZXJlbmNlIFNBRCAqLwotICAgIG1pblNBRCA9IHJlZlNBRDsKLSAgICAqcERzdFNBRCA9IHJlZlNBRDsKLQotICAgIC8qIENoZWNrIGZvciB2YWxpZCByZWdpb24gKi8KLSAgICBmcm9tWCA9IDE7Ci0gICAgdG9YICAgPSAxOwotICAgIGZyb21ZID0gMTsKLSAgICB0b1kgICA9IDE7Ci0gICAgaWYgKChwU2VhcmNoUG9pbnRSZWZQb3MtPnggLSAxKSA8IHBSZWZSZWN0LT54KQotICAgIHsKLSAgICAgICAgZnJvbVggPSAwOwotICAgIH0KLQotICAgIGlmICgocFNlYXJjaFBvaW50UmVmUG9zLT54ICsgQmxvY2tTaXplICsgMSkgPiAocFJlZlJlY3QtPnggKyBwUmVmUmVjdC0+d2lkdGgpKQotICAgIHsKLSAgICAgICAgdG9YICAgPSAwOwotICAgIH0KLQotICAgIGlmICgocFNlYXJjaFBvaW50UmVmUG9zLT55IC0gMSkgPCBwUmVmUmVjdC0+eSkKLSAgICB7Ci0gICAgICAgIGZyb21ZID0gMDsKLSAgICB9Ci0KLSAgICBpZiAoKHBTZWFyY2hQb2ludFJlZlBvcy0+eSArIEJsb2NrU2l6ZSArIDEpID4gKHBSZWZSZWN0LT55ICsgcFJlZlJlY3QtPmhlaWdodCkpCi0gICAgewotICAgICAgICB0b1kgICA9IDA7Ci0gICAgfQotCi0gICAgLyogTG9vcGluZyBvbiB5LSBheGlzICovCi0gICAgZm9yICh5ID0gLWZyb21ZOyB5IDw9IHRvWTsgeSsrKQotICAgIHsKLSAgICAgICAgLyogTG9vcGluZyBvbiB4LSBheGlzICovCi0gICAgICAgIGZvciAoeCA9IC1mcm9tWDsgeCA8PSB0b1g7IHgrKykKLSAgICAgICAgewotICAgICAgICAgICAgLyogY2hlY2sgZm9yIGludGVnZXIgcG9zaXRpb24gKi8KLSAgICAgICAgICAgIGlmICggeCA9PSAwICYmIHkgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIFBvc2l0aW9uaW5nIHRoZSBwb2ludGVyICovCi0gICAgICAgICAgICBwVGVtcFNyY1JlZkJ1ZiA9IHBTcmNSZWZCdWYgKyAocmVmV2lkdGggKiAocFNyY0RzdE1WLT5keS8yKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAocFNyY0RzdE1WLT5keC8yKTsKLQotICAgICAgICAgICAgLyogSW50ZXJwb2xhdGUgdGhlIHBpeGVsIGFuZCBjYWxjdWxhdGUgdGhlIFNBRCovCi0gICAgICAgICAgICBmb3IgKG91dGVyID0gMCwgY291bnQgPSAwLCBjYW5kU0FEID0gMCxpbmRleCA9IDA7Ci0gICAgICAgICAgICAgICAgIG91dGVyIDwgQmxvY2tTaXplOwotICAgICAgICAgICAgICAgICBvdXRlcisrLCBpbmRleCArPSByZWZXaWR0aCAtIEJsb2NrU2l6ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IgKGlubmVyID0gMDsgaW5uZXIgPCBCbG9ja1NpemU7IGlubmVyKyssIGNvdW50KyssaW5kZXgrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBQZWwgPSAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wU3JjUmVmQnVmW2luZGV4XQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHBUZW1wU3JjUmVmQnVmW2luZGV4ICsgeF0gKiBhcm1BYnMoeCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwVGVtcFNyY1JlZkJ1ZltpbmRleCArIHJlZldpZHRoICogeV0gKiBhcm1BYnMoeSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwVGVtcFNyY1JlZkJ1ZltpbmRleCArIHJlZldpZHRoICogeSArIHhdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhcm1BYnMoeCp5KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGFybUFicyAoeCkgKyBhcm1BYnMgKHkpIC0gcm5kVmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIC8gKDIgKiAoYXJtQWJzICh4KSArIGFybUFicyAoeSkpKTsKLSAgICAgICAgICAgICAgICAgICAgY2FuZFNBRCArPSBhcm1BYnMgKHRlbXBQZWwgLSBwU3JjQ3VyckJ1Zltjb3VudF0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogUmVzdWx0IGNhbGN1bGF0aW9ucyAqLwotICAgICAgICAgICAgaWYgKGFybVZDTTRQMl9Db21wYXJlTVYgKHgsIHksIGNhbmRTQUQsIGhhbGZQZWxYLCBoYWxmUGVsWSwgbWluU0FEKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAqcERzdFNBRCA9IGNhbmRTQUQ7Ci0gICAgICAgICAgICAgICAgbWluU0FEICAgPSBjYW5kU0FEOwotICAgICAgICAgICAgICAgIGhhbGZQZWxYID0geDsKLSAgICAgICAgICAgICAgICBoYWxmUGVsWSA9IHk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSAvKiBFbmQgb2YgeC0gYXhpcyAqLwotICAgIH0gLyogRW5kIG9mIHktYXhpcyAqLwotCi0gICAgcFNyY0RzdE1WLT5keCArPSBoYWxmUGVsWDsKLSAgICBwU3JjRHN0TVYtPmR5ICs9IGhhbGZQZWxZOwotCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci0KLX0KLQotLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMDU2NjAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXIuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udGFpbnMgbW9kdWxlcyBmb3IgQmxvY2sgbWF0Y2hpbmcsIGEgZnVsbCBzZWFyY2ggYWxnb3JpdGhtCi0gKiBpcyBpbXBsZW1lbnRlZAotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcgotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgYSAxNngxNiBibG9jayBzZWFyY2g7IGVzdGltYXRlcyBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIG1pbmltdW0gU0FELiAgCi0gKiBCb3RoIHRoZSBpbnB1dCBhbmQgb3V0cHV0IG1vdGlvbiB2ZWN0b3JzIGFyZSByZXByZXNlbnRlZCB1c2luZyBoYWxmLXBpeGVsIHVuaXRzLCBhbmQgCi0gKiB0aGVyZWZvcmUgYSBzaGlmdCBsZWZ0IG9yIHJpZ2h0IGJ5IDEgYml0IG1heSBiZSByZXF1aXJlZCwgcmVzcGVjdGl2ZWx5LCB0byBtYXRjaCB0aGUgCi0gKiBpbnB1dCBvciBvdXRwdXQgTVZzIHdpdGggb3RoZXIgZnVuY3Rpb25zIHRoYXQgZWl0aGVyIGdlbmVyYXRlIG91dHB1dCBNVnMgb3IgZXhwZWN0IAotICogaW5wdXQgTVZzIHJlcHJlc2VudGVkIHVzaW5nIGludGVnZXIgcGl4ZWwgdW5pdHMuIAotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcFNyY1JlZkJ1ZgkJcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIE1CIHRoYXQgCi0gKiAgICAgICAgICAgICAgICAgICAgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgCi0gKiAgICAgICAgICAgICAgICAgICAgcGxhbmUuCi0gKiBbaW5dCXJlZldpZHRoCQkgIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUKLSAqIFtpbl0JcFJlZlJlY3QJCSAgcG9pbnRlciB0byB0aGUgdmFsaWQgcmVjdGFuZ3VsYXIgaW4gcmVmZXJlbmNlIHBsYW5lLiBSZWxhdGl2ZSB0byBpbWFnZSBvcmlnaW4uIAotICogICAgICAgICAgICAgICAgICAgIEl0J3Mgbm90IGxpbWl0ZWQgdG8gdGhlIGltYWdlIGJvdW5kYXJ5LCBidXQgZGVwZW5kZWQgb24gdGhlIHBhZGRpbmcuIEZvciBleGFtcGxlLCAKLSAqICAgICAgICAgICAgICAgICAgICBpZiB5b3UgcGFkIDQgcGl4ZWxzIG91dHNpZGUgdGhlIGltYWdlIGJvcmRlciwgdGhlbiB0aGUgdmFsdWUgZm9yIGxlZnQgYm9yZGVyIAotICogICAgICAgICAgICAgICAgICAgIGNhbiBiZSAtNAotICogW2luXQlwU3JjQ3VyckJ1ZgkJcG9pbnRlciB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGV4dHJhY3RlZCBmcm9tIG9yaWdpbmFsIHBsYW5lIChsaW5lYXIgYXJyYXksIAotICogICAgICAgICAgICAgICAgICAgIDI1NiBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4KLSAqIFtpbl0gcEN1cnJQb2ludFBvcwlwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lCi0gKiBbaW5dIHBTcmNQcmVNVgkJICBwb2ludGVyIHRvIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yOyBOVUxMIGluZGljYXRlcyBubyBwcmVkaWN0ZWQgTVYKLSAqIFtpbl0gcFNyY1ByZVNBRAkJcG9pbnRlciB0byBTQUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmVkaWN0ZWQgTVYgKHJlZmVyZW5jZWQgYnkgcFNyY1ByZU1WKQotICogW2luXSBzZWFyY2hSYW5nZQkJc2VhcmNoIHJhbmdlIGZvciAxNlgxNiBpbnRlZ2VyIGJsb2NrLHRoZSB1bml0cyBvZiBpdCBpcyBmdWxsIHBpeGVsLHRoZSBzZWFyY2ggcmFuZ2UgCi0gKiAgICAgICAgICAgICAgICAgICAgaXMgdGhlIHNhbWUgaW4gYWxsIGRpcmVjdGlvbnMuSXQgaXMgaW4gaW5jbHVzaXZlIG9mIHRoZSBib3VuZGFyeSBhbmQgc3BlY2lmaWVkIGluIAotICogICAgICAgICAgICAgICAgICAgIHRlcm1zIG9mIGludGVnZXIgcGl4ZWwgdW5pdHMuCi0gKiBbaW5dIHBNRVNwZWMJCQkgIHZlbmRvci1zcGVjaWZpYyBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZTsgbXVzdCBoYXZlIGJlZW4gYWxsb2NhdGVkIAotICogICAgICAgICAgICAgICAgICAgIGFuZCB0aGVuIGluaXRpYWxpemVkIHVzaW5nIG9teFZDTTRQMl9NRUluaXQgcHJpb3IgdG8gY2FsbGluZyB0aGUgYmxvY2sgbWF0Y2hpbmcgCi0gKiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24uCi0gKiBbb3V0XQlwRHN0TVYJCQlwb2ludGVyIHRvIGVzdGltYXRlZCBNVgotICogW291dF0JcERzdFNBRAkJCXBvaW50ZXIgdG8gbWluaW11bSBTQUQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfU3RzX05vRXJyIKhDIG5vIGVycm9yLgotICogT01YX1N0c19CYWRBcmdFcnIgqEMgYmFkIGFyZ3VtZW50cwotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcigKLSAgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAotICAgICBPTVhfSU5UIHJlZldpZHRoLAotICAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKLSAgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKLSAgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKLSAgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNQcmVNViwKLSAgICAgY29uc3QgT01YX0lOVCAqcFNyY1ByZVNBRCwKLSAgICAgdm9pZCAqcE1FU3BlYywKLSAgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBEc3RNViwKLSAgICAgT01YX0lOVCAqcERzdFNBRCwKLSAgICAgT01YX1U4IEJsb2NrU2l6ZQotKQotewotCi0gICAgLyogRGVmaW5pdGlvbnMgYW5kIEluaXRpYWxpemF0aW9ucyovCi0KLSAgICBPTVhfSU5UICAgICBvdXRlciwgaW5uZXIsIGNvdW50LGluZGV4OwotICAgIE9NWF9JTlQgICAgIGNhbmRTQUQ7Ci0gICAgLyooMjU2KjI1NiArMSkgdGhpcyBpcyB0byBtYWtlIHRoZSBTQUQgbWF4IGluaXRpYWxseSovCi0gICAgT01YX0lOVCAgICAgbWluU0FEID0gMHgxMDAwMSwgZnJvbVgsIHRvWCwgZnJvbVksIHRvWTsKLSAgICAvKiBPZmZzZXQgdG8gdGhlIHJlZmVyZW5jZSBhdCB0aGUgYmVnaW5pbmcgb2YgdGhlIGJvdW5kaW5nIGJveCAqLwotICAgIGNvbnN0IE9NWF9VOCAgICAgICpwVGVtcFNyY1JlZkJ1ZjsKLSAgICBPTVhfUzE2ICAgICB4LCB5OwotICAgIE9NWF9JTlQgc2VhcmNoUmFuZ2U7Ci0gICAKLSAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmQnVmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwUmVmUmVjdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFNyY0N1cnJCdWYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBDdXJyUG9pbnRQb3MgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBNRVNwZWMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBEc3RNViA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocERzdFNBRCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgICAgIAotICAgIHNlYXJjaFJhbmdlID0gKChPTVhWQ000UDJNRVBhcmFtcyAqKXBNRVNwZWMpLT5zZWFyY2hSYW5nZTsKLSAgICAvKiBDaGVjayBmb3IgdmFsaWQgcmVnaW9uICovCi0gICAgZnJvbVggPSBzZWFyY2hSYW5nZTsKLSAgICB0b1ggICA9IHNlYXJjaFJhbmdlOwotICAgIGZyb21ZID0gc2VhcmNoUmFuZ2U7Ci0gICAgdG9ZICAgPSBzZWFyY2hSYW5nZTsKLQotICAgIGlmICgocEN1cnJQb2ludFBvcy0+eCAtIHNlYXJjaFJhbmdlKSA8IHBSZWZSZWN0LT54KQotICAgIHsKLSAgICAgICAgZnJvbVggPSAgcEN1cnJQb2ludFBvcy0+eCAtIHBSZWZSZWN0LT54OwotICAgIH0KLQotICAgIGlmICgocEN1cnJQb2ludFBvcy0+eCArIEJsb2NrU2l6ZSArIHNlYXJjaFJhbmdlKSA+IChwUmVmUmVjdC0+eCArIHBSZWZSZWN0LT53aWR0aCkpCi0gICAgewotICAgICAgICB0b1ggICA9IHBSZWZSZWN0LT53aWR0aCAtIChwQ3VyclBvaW50UG9zLT54IC0gcFJlZlJlY3QtPngpIC0gQmxvY2tTaXplOwotICAgIH0KLQotICAgIGlmICgocEN1cnJQb2ludFBvcy0+eSAtIHNlYXJjaFJhbmdlKSA8IHBSZWZSZWN0LT55KQotICAgIHsKLSAgICAgICAgZnJvbVkgPSBwQ3VyclBvaW50UG9zLT55IC0gcFJlZlJlY3QtPnk7Ci0gICAgfQotCi0gICAgaWYgKChwQ3VyclBvaW50UG9zLT55ICsgQmxvY2tTaXplICsgc2VhcmNoUmFuZ2UpID4gKHBSZWZSZWN0LT55ICsgcFJlZlJlY3QtPmhlaWdodCkpCi0gICAgewotICAgICAgICB0b1kgICA9IHBSZWZSZWN0LT53aWR0aCAtIChwQ3VyclBvaW50UG9zLT55IC0gcFJlZlJlY3QtPnkpIC0gQmxvY2tTaXplOwotICAgIH0KLQotICAgIHBEc3RNVi0+ZHggPSAtZnJvbVg7Ci0gICAgcERzdE1WLT5keSA9IC1mcm9tWTsKLSAgICAvKiBMb29waW5nIG9uIHktIGF4aXMgKi8KLSAgICBmb3IgKHkgPSAtZnJvbVk7IHkgPD0gdG9ZOyB5KyspCi0gICAgewotCi0gICAgICAgIC8qIExvb3Bpbmcgb24geC0gYXhpcyAqLwotICAgICAgICBmb3IgKHggPSAtZnJvbVg7IHggPD0gdG9YOyB4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFBvc2l0aW9uaW5nIHRoZSBwb2ludGVyICovCi0gICAgICAgICAgICBwVGVtcFNyY1JlZkJ1ZiA9IHBTcmNSZWZCdWYgKyAocmVmV2lkdGggKiB5KSArIHg7Ci0KLSAgICAgICAgICAgIC8qIENhbGN1bGF0ZSB0aGUgU0FEICovCi0gICAgICAgICAgICBmb3IgKG91dGVyID0gMCwgY291bnQgPSAwLCBpbmRleCA9IDAsIGNhbmRTQUQgPSAwOwotICAgICAgICAgICAgICAgICBvdXRlciA8IEJsb2NrU2l6ZTsKLSAgICAgICAgICAgICAgICAgb3V0ZXIrKywgaW5kZXggKz0gcmVmV2lkdGggLSBCbG9ja1NpemUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbm5lciA9IDA7IGlubmVyIDwgQmxvY2tTaXplOyBpbm5lcisrLCBjb3VudCsrLCBpbmRleCsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2FuZFNBRCArPSBhcm1BYnMgKHBUZW1wU3JjUmVmQnVmW2luZGV4XSAtIHBTcmNDdXJyQnVmW2NvdW50XSk7ICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIFJlc3VsdCBjYWxjdWxhdGlvbnMgKi8KLSAgICAgICAgICAgIGlmIChhcm1WQ000UDJfQ29tcGFyZU1WICh4LCB5LCBjYW5kU0FELCBwRHN0TVYtPmR4LzIsIHBEc3RNVi0+ZHkvMiwgbWluU0FEKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAqcERzdFNBRCA9IGNhbmRTQUQ7Ci0gICAgICAgICAgICAgICAgbWluU0FEICAgPSBjYW5kU0FEOwotICAgICAgICAgICAgICAgIHBEc3RNVi0+ZHggPSB4KjI7Ci0gICAgICAgICAgICAgICAgcERzdE1WLT5keSA9IHkqMjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IC8qIEVuZCBvZiB4LSBheGlzICovCi0gICAgfSAvKiBFbmQgb2YgeS1heGlzICovCi0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLQotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQ2hlY2tWTENFc2NhcGVNb2RlLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9DaGVja1ZMQ0VzY2FwZU1vZGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU1MTBlNy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9DaGVja1ZMQ0VzY2FwZU1vZGUuYworKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0NoZWNrVkxDRXNjYXBlTW9kZS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogQ29udGFpbnMgbW9kdWxlIGZvciBWTEMgZXNjYXBlIG1vZGUgY2hlY2sgCi0gKgotICovIAotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX0NoZWNrVkxDRXNjYXBlTW9kZQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgZXNjYXBlIG1vZGUgZGVjaXNpb24gYmFzZWQgb24gdGhlIHJ1biwgcnVuKywgbGV2ZWwsIGxldmVsKyBhbmQgCi0gKiBsYXN0IGNvbWJpbmF0aW9ucy4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHJ1biAgICAgICAgICAgICBSdW4gdmFsdWUgKGNvdW50IG9mIHplcm9zKSB0byBiZSBlbmNvZGVkICAKLSAqIFtpbl0gbGV2ZWwgICAgICAgICAgIExldmVsIHZhbHVlIChub24temVybyB2YWx1ZSkgdG8gYmUgZW5jb2RlZAotICogW2luXSBydW5QbHVzICAgICAgICAgQ2FsY3VsYXRlZCBhcyBydW5QbHVzID0gcnVuIC0gKFJNQVggKyAxKSAgCi0gKiBbaW5dIGxldmVsUGx1cyAgICAgICBDYWxjdWxhdGVkIGFzIAotICogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxQbHVzID0gc2lnbihsZXZlbCkqW2FicyhsZXZlbCkgLSBMTUFYXQotICogW2luXSBtYXhTdG9yZVJ1biAgICAgTWF4IHN0b3JlIHBvc3NpYmxlIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSkKLSAqIFtpbl0gbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzIAotICogICAgICAgICAgICAgICAgICAgICAgVGhlIHJ1biB2YWx1ZSBhZnRlciB3aGljaCBsZXZlbCAKLSAqICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZXF1YWwgdG8gMTogCi0gKiAgICAgICAgICAgICAgICAgICAgICAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEgc3RhdHVzKQotICogW2luXSBwUnVuSW5kZXhUYWJsZSAgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMKLSAqICAgICAgICAgICAgICAgICAgICAgIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSBzdGF0dXMpCi0gKgotICogICAgICAgICAgICAgICAgICAgICAgCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBSZXR1cm5zIGFuIEVzY2FwZSBtb2RlIHdoaWNoIGNhbiB0YWtlIHZhbHVlcyBmcm9tIDAgdG8gMwotICogMCAtLT4gbm8gZXNjYXBlIG1vZGUsIDEgLS0+IGVzY2FwZSB0eXBlIDEsCi0gKiAxIC0tPiBlc2NhcGUgdHlwZSAyLCAzIC0tPiBlc2NhcGUgdHlwZSAzLCBjaGVjayBzZWN0aW9uIDcuNC4xLjMKLSAqIGluIHRoZSBNUEVHIElTTyBzdGFuZGFyZC4KLSAqCi0gKi8KLQotT01YX1U4IGFybVZDTTRQMl9DaGVja1ZMQ0VzY2FwZU1vZGUoCi0gICAgIE9NWF9VMzIgcnVuLAotICAgICBPTVhfVTMyIHJ1blBsdXMsCi0gICAgIE9NWF9TMTYgbGV2ZWwsCi0gICAgIE9NWF9TMTYgbGV2ZWxQbHVzLAotICAgICBPTVhfVTggIG1heFN0b3JlUnVuLAotICAgICBPTVhfVTggIG1heFJ1bkZvck11bHRpcGxlRW50cmllcywKLSAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAotICAgICBjb25zdCBPTVhfVTggICpwUnVuSW5kZXhUYWJsZQotKQotewotICAgIE9NWF9VOCBlc2NhcGUgPSAwLCBmTW9kZSA9IDAsIGVudHJpZXM7Ci0gICAgCi0gICAgbGV2ZWwgPSBhcm1BYnMgKGxldmVsKTsKLSAgICBsZXZlbFBsdXMgPSBhcm1BYnMgKGxldmVsUGx1cyk7Ci0gICAgCi0gICAgLyogQ2hlY2sgZm9yIGEgdmFsaWQgZW50cnkgd2l0aCBydW4sIGxldmVsIGFuZCBMYXN0IGNvbWJpbmF0aW9uIAotICAgICAgIE1vZGUgMCBjaGVjayAqLwotICAgIGlmIChydW4gPD0gbWF4U3RvcmVSdW4pCi0gICAgewotICAgICAgICBlbnRyaWVzID0gcFJ1bkluZGV4VGFibGVbcnVuICsgMV0KLSAgICAgICAgICAgICAgICAgIC0gcFJ1bkluZGV4VGFibGVbcnVuXTsKLSAgICAgICAgaWYgKHJ1biA+IG1heFJ1bkZvck11bHRpcGxlRW50cmllcykKLSAgICAgICAgewotICAgICAgICAgICAgZW50cmllcyA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxldmVsID4gZW50cmllcykKLSAgICAgICAgewotICAgICAgICAgICAgZXNjYXBlID0gMTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBlc2NhcGUgPSAxOwotICAgIH0KLSAgICBpZihlc2NhcGUgJiYgc2hvcnRWaWRlb0hlYWRlcikKLSAgICB7Ci0gICAgICAgIGVzY2FwZSA9IDA7Ci0gICAgICAgIGZNb2RlID0gNDsKLSAgICB9Ci0gICAgLyogQ2hlY2sgZm9yIGEgdmFsaWQgZW50cnkgd2l0aCBydW4sIGxldmVsUGx1cyBhbmQgTGFzdCBjb21iaW5hdGlvbiAKLSAgICAgICBNb2RlIDEgY2hlY2sgKi8gICAgCi0gICAgaWYgKGVzY2FwZSkKLSAgICB7Ci0gICAgICAgIGVzY2FwZSA9IDA7Ci0gICAgICAgIGZNb2RlID0gMTsKLSAgICAgICAgaWYgKHJ1biA8PSBtYXhTdG9yZVJ1bikKLSAgICAgICAgewotICAgICAgICAgICAgZW50cmllcyA9IHBSdW5JbmRleFRhYmxlW3J1biArIDFdCi0gICAgICAgICAgICAgICAgICAgICAgLSBwUnVuSW5kZXhUYWJsZVtydW5dOwotICAgICAgICAgICAgaWYgKHJ1biA+IG1heFJ1bkZvck11bHRpcGxlRW50cmllcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbnRyaWVzID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChsZXZlbFBsdXMgPiBlbnRyaWVzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVzY2FwZSA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBlc2NhcGUgPSAxOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qIENoZWNrIGZvciBhIHZhbGlkIGVudHJ5IHdpdGggcnVuUGx1cywgbGV2ZWwgYW5kIExhc3QgY29tYmluYXRpb24gCi0gICAgICAgTW9kZSAyIGNoZWNrICovICAgIAotICAgIGlmIChlc2NhcGUpCi0gICAgewotICAgICAgICBlc2NhcGUgPSAwOwotICAgICAgICBmTW9kZSA9IDI7Ci0gICAgICAgIGlmIChydW5QbHVzIDw9IG1heFN0b3JlUnVuKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbnRyaWVzID0gcFJ1bkluZGV4VGFibGVbcnVuUGx1cyArIDFdCi0gICAgICAgICAgICAgICAgICAgICAgLSBwUnVuSW5kZXhUYWJsZVtydW5QbHVzXTsKLSAgICAgICAgICAgIGlmIChydW5QbHVzID4gbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVudHJpZXMgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGxldmVsID4gZW50cmllcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlc2NhcGUgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZXNjYXBlID0gMTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKiBzZWxlY3QgbW9kZSAzIC0tPiBGTEMgKi8KLSAgICBpZiAoZXNjYXBlKQotICAgIHsKLSAgICAgICAgZk1vZGUgPSAzOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gZk1vZGU7Ci19Ci0KLS8qRW5kIG9mIEZpbGUqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9Db21wYXJlTVYuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0NvbXBhcmVNVi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjYyMWEzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0NvbXBhcmVNVi5jCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9Db21wYXJlTVYuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnRhaW5zIG1vZHVsZSBmb3IgY29tcGFyaW5nIG1vdGlvbiB2ZWN0b3JzIGFuZCBTQUQncyB0byBkZWNpZGUgCi0gKiB0aGUgYmVzdCBNViBhbmQgU0FECi0gKgotICovCi0gIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX0NvbXBhcmVNVgotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgY29tcGFyaXNpb24gb2YgbW90aW9uIHZlY3RvcnMgYW5kIFNBRCdzIHRvIGRlY2lkZSB0aGUgCi0gKiBiZXN0IE1WIGFuZCBTQUQKLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCSAgICBtdlgJCXggY29vcmRpbmF0ZSBvZiB0aGUgY2FuZGlkYXRlIG1vdGlvbiB2ZWN0b3IKLSAqIFtpbl0JICAgIG12WQkJeSBjb29yZGluYXRlIG9mIHRoZSBjYW5kaWRhdGUgbW90aW9uIHZlY3RvcgotICogW2luXQkgICAgY2FuZFNBRAlDYW5kaWRhdGUgU0FECi0gKiBbaW5dCSAgICBiZXN0TVZYCXggY29vcmRpbmF0ZSBvZiB0aGUgYmVzdCBtb3Rpb24gdmVjdG9yCi0gKiBbaW5dCSAgICBiZXN0TVZZCXkgY29vcmRpbmF0ZSBvZiB0aGUgYmVzdCBtb3Rpb24gdmVjdG9yCi0gKiBbaW5dCSAgICBiZXN0U0FECWJlc3QgU0FECi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX0lOVCAtLSAxIHRvIGluZGljYXRlIHRoYXQgdGhlIGN1cnJlbnQgc2FkIGlzIHRoZSBiZXN0IAotICogICAgICAgICAgICAwIHRvIGluZGljYXRlIHRoYXQgaXQgaXMgTk9UIHRoZSBiZXN0IFNBRAotICovCi0KLU9NWF9JTlQgYXJtVkNNNFAyX0NvbXBhcmVNViAoCi0gICAgT01YX1MxNiBtdlgsIAotICAgIE9NWF9TMTYgbXZZLCAKLSAgICBPTVhfSU5UIGNhbmRTQUQsIAotICAgIE9NWF9TMTYgYmVzdE1WWCwgCi0gICAgT01YX1MxNiBiZXN0TVZZLCAKLSAgICBPTVhfSU5UIGJlc3RTQUQKLSkgCi17Ci0gICAgaWYgKGNhbmRTQUQgPCBiZXN0U0FEKQotICAgIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIGlmIChjYW5kU0FEID4gYmVzdFNBRCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICAvKiBzaG9ydGVyIG1vdGlvbiB2ZWN0b3IgKi8KLSAgICBpZiAoIChtdlggKiBtdlggKyBtdlkgKiBtdlkpIDwgKGJlc3RNVlgqYmVzdE1WWCtiZXN0TVZZKmJlc3RNVlkpICkKLSAgICB7Ci0gICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qRW5kIG9mIEZpbGUqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRENUX1RhYmxlLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9EQ1RfVGFibGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QwNTVkOS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9EQ1RfVGFibGUuYworKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0gLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9EQ1RfVGFibGUuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIEZpbGU6ICAgICAgICBhcm1WQ000UDJfRENUX1RhYmxlLmMKLSAqIERlc2NyaXB0aW9uOiBDb250YWlucyB0aGUgRENUL0lEQ1QgY29lZmZpY2VudCBtYXRyaXgKLSAqCi0gKi8KLQotI2lmbmRlZiBfT01YRENUQ09TVEFCX0NfCi0jZGVmaW5lIF9PTVhEQ1RDT1NUQUJfQ18KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0KLWNvbnN0IE9NWF9GNjQgYXJtVkNNNFAyX3ByZUNhbGNEQ1RDb3NbOF1bOF0gPQotewotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgMC4zNTM1NTMzOTA1OTMyNzM3MzAsIAotICAgICAgICAgICAgICAgIDAuNDkwMzkyNjQwMjAxNjE1MjIwLCAKLSAgICAgICAgICAgICAgICAwLjQ2MTkzOTc2NjI1NTY0MzM3MCwgCi0gICAgICAgICAgICAgICAgMC40MTU3MzQ4MDYxNTEyNzI2MjAsIAotICAgICAgICAgICAgICAgIDAuMzUzNTUzMzkwNTkzMjczNzkwLCAKLSAgICAgICAgICAgICAgICAwLjI3Nzc4NTExNjUwOTgwMTE0MCwgCi0gICAgICAgICAgICAgICAgMC4xOTEzNDE3MTYxODI1NDQ5MjAsIAotICAgICAgICAgICAgICAgIDAuMDk3NTQ1MTYxMDA4MDY0MTUyIAotICAgICAgICB9LAotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgMC4zNTM1NTMzOTA1OTMyNzM3MzAsIAotICAgICAgICAgICAgICAgIDAuNDE1NzM0ODA2MTUxMjcyNjIwLCAKLSAgICAgICAgICAgICAgICAwLjE5MTM0MTcxNjE4MjU0NDkyMCwgCi0gICAgICAgICAgICAgICAgLTAuMDk3NTQ1MTYxMDA4MDY0MDk2LCAKLSAgICAgICAgICAgICAgICAtMC4zNTM1NTMzOTA1OTMyNzM3MzAsIAotICAgICAgICAgICAgICAgIC0wLjQ5MDM5MjY0MDIwMTYxNTIyMCwgCi0gICAgICAgICAgICAgICAgLTAuNDYxOTM5NzY2MjU1NjQzNDIwLCAKLSAgICAgICAgICAgICAgICAtMC4yNzc3ODUxMTY1MDk4MDEwOTAKLSAgICAgICAgfSwKLSAgICAgICAgewotICAgICAgICAgICAgICAgIDAuMzUzNTUzMzkwNTkzMjczNzMwLCAKLSAgICAgICAgICAgICAgICAwLjI3Nzc4NTExNjUwOTgwMTE0MCwgCi0gICAgICAgICAgICAgICAgLTAuMTkxMzQxNzE2MTgyNTQ0ODYwLCAKLSAgICAgICAgICAgICAgICAtMC40OTAzOTI2NDAyMDE2MTUyMjAsIAotICAgICAgICAgICAgICAgIC0wLjM1MzU1MzM5MDU5MzI3Mzg0MCwgCi0gICAgICAgICAgICAgICAgMC4wOTc1NDUxNjEwMDgwNjQxMzgsIAotICAgICAgICAgICAgICAgIDAuNDYxOTM5NzY2MjU1NjQzMjYwLCAKLSAgICAgICAgICAgICAgICAwLjQxNTczNDgwNjE1MTI3MjczMCAKLSAgICAgICAgfSwKLSAgICAgICAgewotICAgICAgICAgICAgICAgIDAuMzUzNTUzMzkwNTkzMjczNzMwLCAKLSAgICAgICAgICAgICAgICAwLjA5NzU0NTE2MTAwODA2NDE1MiwgCi0gICAgICAgICAgICAgICAgLTAuNDYxOTM5NzY2MjU1NjQzMzcwLCAKLSAgICAgICAgICAgICAgICAtMC4yNzc3ODUxMTY1MDk4MDEwOTAsIAotICAgICAgICAgICAgICAgIDAuMzUzNTUzMzkwNTkzMjczNjgwLCAKLSAgICAgICAgICAgICAgICAwLjQxNTczNDgwNjE1MTI3MjczMCwgCi0gICAgICAgICAgICAgICAgLTAuMTkxMzQxNzE2MTgyNTQ0OTIwLCAKLSAgICAgICAgICAgICAgICAtMC40OTAzOTI2NDAyMDE2MTUzMzAKLSAgICAgICAgfSwKLSAgICAgICAgewotICAgICAgICAgICAgICAgIDAuMzUzNTUzMzkwNTkzMjczNzMwLCAKLSAgICAgICAgICAgICAgICAtMC4wOTc1NDUxNjEwMDgwNjQwOTYsIAotICAgICAgICAgICAgICAgIC0wLjQ2MTkzOTc2NjI1NTY0MzQyMCwgCi0gICAgICAgICAgICAgICAgMC4yNzc3ODUxMTY1MDk4MDA5MjAsIAotICAgICAgICAgICAgICAgIDAuMzUzNTUzMzkwNTkzMjczODQwLCAKLSAgICAgICAgICAgICAgICAtMC40MTU3MzQ4MDYxNTEyNzI2MjAsIAotICAgICAgICAgICAgICAgIC0wLjE5MTM0MTcxNjE4MjU0NTI4MCwgCi0gICAgICAgICAgICAgICAgMC40OTAzOTI2NDAyMDE2MTUyMjAgCi0gICAgICAgIH0sCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICAwLjM1MzU1MzM5MDU5MzI3MzczMCwgCi0gICAgICAgICAgICAgICAgLTAuMjc3Nzg1MTE2NTA5ODAwOTgwLCAKLSAgICAgICAgICAgICAgICAtMC4xOTEzNDE3MTYxODI1NDUxNzAsIAotICAgICAgICAgICAgICAgIDAuNDkwMzkyNjQwMjAxNjE1MjIwLCAKLSAgICAgICAgICAgICAgICAtMC4zNTM1NTMzOTA1OTMyNzMzNDAsIAotICAgICAgICAgICAgICAgIC0wLjA5NzU0NTE2MTAwODA2NDAxMywgCi0gICAgICAgICAgICAgICAgMC40NjE5Mzk3NjYyNTU2NDMzNzAsIAotICAgICAgICAgICAgICAgIC0wLjQxNTczNDgwNjE1MTI3MjUxMAotICAgICAgICB9LAotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgMC4zNTM1NTMzOTA1OTMyNzM3MzAsIAotICAgICAgICAgICAgICAgIC0wLjQxNTczNDgwNjE1MTI3MjY3MCwgCi0gICAgICAgICAgICAgICAgMC4xOTEzNDE3MTYxODI1NDUwMDAsIAotICAgICAgICAgICAgICAgIDAuMDk3NTQ1MTYxMDA4MDY0Mzg4LCAKLSAgICAgICAgICAgICAgICAtMC4zNTM1NTMzOTA1OTMyNzM2MjAsIAotICAgICAgICAgICAgICAgIDAuNDkwMzkyNjQwMjAxNjE1MzMwLCAKLSAgICAgICAgICAgICAgICAtMC40NjE5Mzk3NjYyNTU2NDMyMDAsIAotICAgICAgICAgICAgICAgIDAuMjc3Nzg1MTE2NTA5ODAwNzYwIAotICAgICAgICB9LAotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgMC4zNTM1NTMzOTA1OTMyNzM3MzAsIAotICAgICAgICAgICAgICAgIC0wLjQ5MDM5MjY0MDIwMTYxNTIyMCwgCi0gICAgICAgICAgICAgICAgMC40NjE5Mzk3NjYyNTU2NDMyNjAsIAotICAgICAgICAgICAgICAgIC0wLjQxNTczNDgwNjE1MTI3MjYyMCwgCi0gICAgICAgICAgICAgICAgMC4zNTM1NTMzOTA1OTMyNzMyOTAsIAotICAgICAgICAgICAgICAgIC0wLjI3Nzc4NTExNjUwOTgwMDc2MCwgCi0gICAgICAgICAgICAgICAgMC4xOTEzNDE3MTYxODI1NDQ3ODAsIAotICAgICAgICAgICAgICAgIC0wLjA5NzU0NTE2MTAwODA2NDI3NwotICAgICAgICB9Ci19OwotCi0jZW5kaWYgLypfT01YRENUQ09TVEFCX0NfKi8KLQotCi0vKiBFbmQgb2YgZmlsZSAqLwotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19pbnRyYS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX2ludHJhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1YWExOTguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX2ludHJhLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfaW50cmEuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIGZpbGxpbmcgb2YgdGhlIGNvZWZmaWNpZW50IGJ1ZmZlcgotICoKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybVZDLmgiCi0jaW5jbHVkZSAiYXJtQ09NTV9CaXRzdHJlYW0uaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oIgotI2luY2x1ZGUgImFybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgiCi0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gZm9yIG9uZSBpbnRyYSBjb2RlZCBibG9jay4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHBwQml0U3RyZWFtICAgICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJpdHN0cmVhbSBidWZmZXIKLSAqIFtpbl0gcEJpdE9mZnNldCAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJ5ICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFswLTddLgotICogW2luXSBwcmVkRGlyICAgICAgICAgQUMgcHJlZGljdGlvbiBkaXJlY3Rpb24gd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHppZ3phZyBzY2FuIHBhdHRlcm4uIEl0IHRha2VzIG9uZSBvZiB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9sbG93aW5nIHZhbHVlczoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZDX05PTkUgIEFDIHByZWRpY3Rpb24gbm90IHVzZWQ7Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtIGNsYXNzaWNhbCB6aWd6YWcgc2NhbjsKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZDX0hPUklaT05UQUwgICAgSG9yaXpvbnRhbCBwcmVkaWN0aW9uOwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtIGFsdGVybmF0ZS12ZXJ0aWNhbAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aWd6YWcgc2NhbjsKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMICAgICAgVmVydGljYWwgcHJlZGljdGlvbjsKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGh1cyBwZXJmb3JtCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdGVybmF0ZS1ob3Jpem9udGFsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppZ3phZyBzY2FuLgotICogW2luXSBzdGFydCAgICAgICAgICAgc3RhcnQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVuY29kaW5nIGJlZ2lucyB3aXRoIDB0aCBlbGVtZW50Ci0gKiAgICAgICAgICAgICAgICAgICAgICBvciAxc3QuCi0gKiBbb3V0XSAgICBwcEJpdFN0cmVhbSAgICAgKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWQsIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyCi0gKiBbb3V0XSAgICBwQml0T2Zmc2V0ICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0KLSAqIFtvdXRdICAgIHBEc3QgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jay4gU2hvdWxkIGJlIDMyLWJpdCBhbGlnbmVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhKAotICAgICBjb25zdCBPTVhfVTggKiogcHBCaXRTdHJlYW0sCi0gICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAotICAgICBPTVhfUzE2ICogcERzdCwKLSAgICAgT01YX1U4IHByZWREaXIsCi0gICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKLSAgICAgT01YX1U4ICBzdGFydAotKQotewotICAgIE9NWF9VOCAgbGFzdCA9IDA7Ci0gICAgY29uc3QgT01YX1U4ICAqcFppZ3phZ1RhYmxlID0gYXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuOwotICAgIE9NWFJlc3VsdCBlcnJvckNvZGU7Ci0gICAgCi0gICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCi0gICAgYXJtUmV0QXJnRXJySWYocHBCaXRTdHJlYW0gPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCpwcEJpdFN0cmVhbSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocEJpdE9mZnNldCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoIWFybUlzNEJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKCpwQml0T2Zmc2V0IDwgMCkgfHwgKCpwQml0T2Zmc2V0ID43KSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChwcmVkRGlyID4gMiksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQotICAgIHN3aXRjaCAocHJlZERpcikKLSAgICB7Ci0gICAgICAgIGNhc2UgT01YX1ZDX05PTkU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHBaaWd6YWdUYWJsZSA9IGFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBPTVhfVkNfSE9SSVpPTlRBTDoKLSAgICAgICAgewotICAgICAgICAgICAgcFppZ3phZ1RhYmxlID0gYXJtVkNNNFAyX2FWZXJ0aWNhbFppZ3phZ1NjYW47Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgT01YX1ZDX1ZFUlRJQ0FMOgotICAgICAgICB7Ci0gICAgICAgICAgICBwWmlnemFnVGFibGUgPSBhcm1WQ000UDJfYUhvcml6b250YWxaaWd6YWdTY2FuOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgZXJyb3JDb2RlID0gYXJtVkNNNFAyX0dldFZMQ0JpdHMgKAotICAgICAgICAgICAgICBwcEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgcEJpdE9mZnNldCwKLQkJCSAgcERzdCwKLQkJCSAgc2hvcnRWaWRlb0hlYWRlciwKLQkJCSAgc3RhcnQsCi0JCQkgICZsYXN0LAotCQkJICAxMCwKLQkJCSAgNjIsCi0JCQkgICA3LAotCQkJICAyMSwKLSAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludHJhTDBSdW5JZHgsCi0gICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRyYVZsY0wwLAotCQkJICBhcm1WQ000UDJfSW50cmFMMVJ1bklkeCwKLSAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludHJhVmxjTDEsCi0gICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRyYUwwTE1BWCwKLSAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludHJhTDFMTUFYLAotICAgICAgICAgICAgICBhcm1WQ000UDJfSW50cmFMMFJNQVgsCi0gICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRyYUwxUk1BWCwKLSAgICAgICAgICAgICAgcFppZ3phZ1RhYmxlICk7Ci0gICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7Ci0gICAgCi0gICAgaWYgKGxhc3QgPT0gMCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBPTVhfU3RzX0VycjsKLSAgICB9Ci0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qIEVuZCBvZiBmaWxlICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19pbnRyYS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRW5jb2RlVkxDWmlnemFnX2ludHJhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2MWM1NDcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRW5jb2RlVkxDWmlnemFnX2ludHJhLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9FbmNvZGVWTENaaWd6YWdfaW50cmEuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGVuY29kaW5nCi0gKiBmb3IgaW50cmEgYmxvY2suCi0gKgotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgiCi0jaW5jbHVkZSAiYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaCIKLQotCi0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmEKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGVuY29kaW5nIGZvciBvbmUgaW50cmEgYmxvY2suCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBwcEJpdFN0cmVhbSAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiaXQgc3RyZWFtCi0gKiBbaW5dIHBCaXRPZmZzZXQgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcuCi0gKiBbaW5dIHBRRGN0QmxrQ29lZiAgICBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50Ci0gKiBbaW5dIHByZWREaXIgICAgICAgICBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbiwgd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHppZ3phZyBzY2FuIHBhdHRlcm4uIFRoaXMgdGFrZXMgb25lIG9mIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xsb3dpbmcgdmFsdWVzOgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVkNfTk9ORSAgICAgICAgICBBQyBwcmVkaWN0aW9uIG5vdCB1c2VkLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW4uCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WQ19IT1JJWk9OVEFMICAgIEhvcml6b250YWwgcHJlZGljdGlvbi4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLXZlcnRpY2FsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppZ3phZyBzY2FuLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVkNfVkVSVElDQUwgICAgICBWZXJ0aWNhbCBwcmVkaWN0aW9uLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtaG9yaXpvbnRhbAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aWd6YWcgc2Nhbi4KLSAqIFtpbl0gcGF0dGVybiAgICAgICAgIGJsb2NrIHBhdHRlcm4gd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgd2hldGhlcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGJsb2NrIGlzIGVuY29kZWQKLSAqIFtpbl0gc3RhcnQgICAgICAgICAgIHN0YXJ0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBlbmNvZGluZyBiZWdpbnMgd2l0aCAwdGggZWxlbWVudAotICogICAgICAgICAgICAgICAgICAgICAgb3IgMXN0LgotICogW291dF0gICAgcHBCaXRTdHJlYW0gICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4KLSAqIFtvdXRdICAgIHBCaXRPZmZzZXQgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbS4KLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmEoCi0gICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgICBjb25zdCBPTVhfUzE2ICpwUURjdEJsa0NvZWYsCi0gICAgIE9NWF9VOCBwcmVkRGlyLAotICAgICBPTVhfVTggcGF0dGVybiwKLSAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAotICAgICBPTVhfVTggc3RhcnQKLSkKLXsKLSAgICBjb25zdCBPTVhfVTggICpwWmlnemFnVGFibGUgPSBhcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW47Ci0gICAgT01YUmVzdWx0IGVycm9yQ29kZTsKLSAgICAKLSAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwcEJpdFN0cmVhbSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKnBwQml0U3RyZWFtID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwQml0T2Zmc2V0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwUURjdEJsa0NvZWYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCgqcEJpdE9mZnNldCA8IDApIHx8ICgqcEJpdE9mZnNldCA+NyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihzdGFydCA+IDEsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwcmVkRGlyID4gMiwgT01YX1N0c19CYWRBcmdFcnIpOwotCi0gICAgaWYgKHBhdHRlcm4pCi0gICAgewotICAgICAgICBzd2l0Y2ggKHByZWREaXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgT01YX1ZDX05PTkU6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFppZ3phZ1RhYmxlID0gYXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIE9NWF9WQ19IT1JJWk9OVEFMOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBaaWd6YWdUYWJsZSA9IGFybVZDTTRQMl9hVmVydGljYWxaaWd6YWdTY2FuOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIE9NWF9WQ19WRVJUSUNBTDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwWmlnemFnVGFibGUgPSBhcm1WQ000UDJfYUhvcml6b250YWxaaWd6YWdTY2FuOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBlcnJvckNvZGUgPSBhcm1WQ000UDJfUHV0VkxDQml0cyAoCi0gICAgICAgICAgICAgIHBwQml0U3RyZWFtLAotICAgICAgICAgICAgICBwQml0T2Zmc2V0LAotICAgICAgICAgICAgICBwUURjdEJsa0NvZWYsCi0gICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXIsCi0gICAgICAgICAgICAgIHN0YXJ0LAotICAgICAgICAgICAgICAxNCwKLSAgICAgICAgICAgICAgMjAsCi0gICAgICAgICAgICAgIDksCi0gICAgICAgICAgICAgIDYsCi0gICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRyYUwwUnVuSWR4LAotICAgICAgICAgICAgICBhcm1WQ000UDJfSW50cmFWbGNMMCwKLQkJCSAgYXJtVkNNNFAyX0ludHJhTDFSdW5JZHgsCi0gICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRyYVZsY0wxLAotICAgICAgICAgICAgICBhcm1WQ000UDJfSW50cmFMMExNQVgsCi0gICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRyYUwxTE1BWCwKLSAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludHJhTDBSTUFYLAotICAgICAgICAgICAgICBhcm1WQ000UDJfSW50cmFMMVJNQVgsCi0gICAgICAgICAgICAgIHBaaWd6YWdUYWJsZQotICAgICAgICApOwotICAgICAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKLSAgICAgICAgCi0gICAgfSAvKiBQYXR0ZXJuIGNoZWNrIGVuZHMqLwotCi0gICAgcmV0dXJuIChPTVhfU3RzX05vRXJyKTsKLQotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRmlsbFZMQ0J1ZmZlci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRmlsbFZMQ0J1ZmZlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWI3NzE0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0ZpbGxWTENCdWZmZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0ZpbGxWTENCdWZmZXIuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnRhaW5zIG1vZHVsZSBmb3IgcHV0dGluZyBWTEMgYml0cwotICoKLSAqLyAKLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtQ09NTV9CaXRzdHJlYW0uaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX0ZpbGxWTENCdWZmZXIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGNhbGN1bGF0aW5nIHRoZSBWTEMgYml0cyBkZXBlbmRpbmcgb24gdGhlIGVzY2FwZSB0eXBlIGFuZCBpbnNlcnQgCi0gKiB0aGUgc2FtZSBpbiB0aGUgYml0c3RyZWFtCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQkgcHBCaXRTdHJlYW0JCXBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgotICoJICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJpdCBzdHJlYW0KLSAqIFtpbl0JIHBCaXRPZmZzZXQgICAgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNwotICogW2luXSAgcnVuICAgICAgICAgICAgICAgIFJ1biB2YWx1ZSAoY291bnQgb2YgemVyb3MpIHRvIGJlIGVuY29kZWQgIAotICogW2luXSAgbGV2ZWwgICAgICAgICAgICAgIExldmVsIHZhbHVlIChub24temVybyB2YWx1ZSkgdG8gYmUgZW5jb2RlZAotICogW2luXSAgcnVuUGx1cyAgICAgICAgICAgIENhbGN1bGF0ZWQgYXMgcnVuUGx1cyA9IHJ1biAtIChSTUFYICsgMSkgIAotICogW2luXSAgbGV2ZWxQbHVzICAgICAgICAgIENhbGN1bGF0ZWQgYXMgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxQbHVzID0gc2lnbihsZXZlbCkqW2FicyhsZXZlbCkgLSBMTUFYXQotICogW2luXSAgZk1vZGUgICAgICAgICAgICAgIEZsYWcgaW5kaWNhdGluZyB0aGUgZXNjYXBlIG1vZGVzCi0gKiBbaW5dICBsYXN0ICAgICAgICAgICAgICAgc3RhdHVzIG9mIHRoZSBsYXN0IGZsYWcKLSAqIFtpbl0gIG1heFJ1bkZvck11bHRpcGxlRW50cmllcyAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgcnVuIHZhbHVlIGFmdGVyIHdoaWNoIGxldmVsIHdpbGwgYmUgZXF1YWwgdG8gMTogCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhIHN0YXR1cykKLSAqIFtpbl0gIHBSdW5JbmRleFRhYmxlICAgICBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbgotICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaAotICogW2luXSAgcFZsY1RhYmxlICAgICAgICAgIFZMQyB0YWJsZSBkZWZpbmVkIGluIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaAotICogW291dF0gcHBCaXRTdHJlYW0JCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4KLSAqIFtvdXRdIHBCaXRPZmZzZXQgICAgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0uCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDJfRmlsbFZMQ0J1ZmZlciAoCi0gICAgICAgICAgICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgICAgICAgICAgICBPTVhfSU5UICogcEJpdE9mZnNldCwKLSAgICAgICAgICAgICAgT01YX1UzMiBydW4sCi0gICAgICAgICAgICAgIE9NWF9TMTYgbGV2ZWwsIAotCQkJICBPTVhfVTMyIHJ1blBsdXMsCi0gICAgICAgICAgICAgIE9NWF9TMTYgbGV2ZWxQbHVzLCAKLSAgICAgICAgICAgICAgT01YX1U4ICBmTW9kZSwKLQkJCSAgT01YX1U4ICBsYXN0LAotICAgICAgICAgICAgICBPTVhfVTggIG1heFJ1bkZvck11bHRpcGxlRW50cmllcywgCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKnBSdW5JbmRleFRhYmxlLAotICAgICAgICAgICAgICBjb25zdCBBUk1fVkxDMzIgKnBWbGNUYWJsZQotKQotewotICAgIE9NWF9JTlQgdGVtcEluZGV4OwotCU9NWF9VMzIgdGVtcFJ1biA9IHJ1biwgc2lnbiA9IDA7Ci0gICAgT01YX1MxNiB0ZW1wTGV2ZWwgPSBsZXZlbDsgCi0gICAgCi0gICAgLyogRXNjYXBlIHNlcXVlbmNlIGFkZGl0aW9uICovCi0gICAgaWYgKGZNb2RlID09IDEpCi0gICAgewotICAgICAgICBhcm1QYWNrQml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgMywgNyk7Ci0gICAgICAgIGFybVBhY2tCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAwLCAxKTsKLQkJdGVtcExldmVsID0gbGV2ZWxQbHVzOwotCi0gICAgfQotICAgIGVsc2UgaWYoZk1vZGUgPT0gMikKLSAgICB7Ci0gICAgICAgIGFybVBhY2tCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAzLCA3KTsKLSAgICAgICAgYXJtUGFja0JpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDIsIDIpOwotCQl0ZW1wUnVuID0gcnVuUGx1czsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZk1vZGUgPT0gMykKLSAgICB7Ci0gICAgICAgIGFybVBhY2tCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAzLCA3KTsKLSAgICAgICAgYXJtUGFja0JpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDMsIDIpOwotICAgIH0KLSAgICBlbHNlIGlmIChmTW9kZSA9PSA0KQotICAgIHsKLSAgICAgICAgYXJtUGFja0JpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDMsIDcpOwotICAgICAgICBhcm1QYWNrQml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgKE9NWF9VMzIpbGFzdCwgMSk7Ci0JCWFybVBhY2tCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCB0ZW1wUnVuLCA2KTsKLQkJaWYoKHRlbXBMZXZlbCAhPSAwKSAmJiAodGVtcExldmVsICE9IC0xMjgpKQotCQl7Ci0JCSAgICBhcm1QYWNrQml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwKLQkJCSAgIChPTVhfVTMyKSB0ZW1wTGV2ZWwsIDgpOwotCQl9Ci0JCXJldHVybiBPTVhfU3RzX05vRXJyOwkJCi0gICAgfQotICAgIAotICAgIGlmICh0ZW1wTGV2ZWwgPCAwKQotICAgIHsKLSAgICAgICAgc2lnbiA9IDE7Ci0gICAgICAgIHRlbXBMZXZlbCA9IGFybUFicyh0ZW1wTGV2ZWwpOwotICAgIH0KLSAgICAvKiBQdXR0aW5nIFZMQyBiaXRzIGluIHRoZSBzdHJlYW0gKi8KLQlpZiAoZk1vZGUgPCAzKQotCXsKLQkJaWYgKHRlbXBSdW4gPiBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXMpCi0JCXsKLQkJCXRlbXBJbmRleCA9IHBSdW5JbmRleFRhYmxlIFttYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXMgKyAxXSArIAotCQkJCQkJKHRlbXBSdW4gLSBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXMgLSAxKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXRlbXBJbmRleCA9IHBSdW5JbmRleFRhYmxlIFt0ZW1wUnVuXSArICh0ZW1wTGV2ZWwgLTEpOwotCQl9Ci0gICAgCi0JCWFybVBhY2tWTEMzMiAocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsCi0JCQkJCSAgcFZsY1RhYmxlIFt0ZW1wSW5kZXhdKTsKLQkJYXJtUGFja0JpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIChPTVhfVTMyKXNpZ24sIDEpOwotCX0KLSAgICBlbHNlCi0JewotCQlpZiAoc2lnbikKLQkJewotCQkJdGVtcExldmVsID0gLXRlbXBMZXZlbDsKLQkJfQotCQl0ZW1wUnVuICA9IHJ1bjsKLQkJYXJtUGFja0JpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIChPTVhfVTMyKWxhc3QsIDEpOwotCQlhcm1QYWNrQml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgdGVtcFJ1biwgNik7Ci0JCWFybVBhY2tCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAxLCAxKTsKLQkJYXJtUGFja0JpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsCi0JCQkgICAoT01YX1UzMikgdGVtcExldmVsLCAxMik7Ci0JCWFybVBhY2tCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAxLCAxKTsKLQl9Ci0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qRW5kIG9mIEZpbGUqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9GaWxsVkxEQnVmZmVyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9GaWxsVkxEQnVmZmVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwOWY1ZDUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRmlsbFZMREJ1ZmZlci5jCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9GaWxsVkxEQnVmZmVyLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBDb250YWlucyBtb2R1bGUgZm9yIFZMQyBnZXQgYml0cyBmcm9tIHRoZSBzdHJlYW0gCi0gKgotICovIAotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLQotI2luY2x1ZGUgImFybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgiCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGZpbGxpbmcgb2YgdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBhY2NvcmRpbmcgdG8gdGhlIHJ1biwgbGV2ZWwKLSAqIGFuZCBzaWduLCBhbHNvIHVwZGF0ZXMgdGhlIGluZGV4Ci0gKiAKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICBzdG9yZVJ1biAgICAgICAgU3RvcmVkIFJ1biB2YWx1ZSAoY291bnQgb2YgemVyb3MpICAgCi0gKiBbaW5dICBzdG9yZUxldmVsICAgICAgU3RvcmVkIExldmVsIHZhbHVlIChub24temVybyB2YWx1ZSkKLSAqIFtpbl0gIHNpZ24gICAgICAgICAgICBGbGFnIGluZGljYXRpbmcgdGhlIHNpZ24gb2YgbGV2ZWwKLSAqIFtpbl0gIGxhc3QgICAgICAgICAgICBzdGF0dXMgb2YgdGhlIGxhc3QgZmxhZwotICogW2luXSAgcEluZGV4ICAgICAgICAgIHBvaW50ZXIgdG8gY29lZmZpY2llbnQgaW5kZXggaW4gOHg4IG1hdHJpeAotICogW291dF0gcEluZGV4ICAgICAgICAgIHBvaW50ZXIgdG8gdXBkYXRlZCBjb2VmZmljaWVudCBpbmRleCBpbiA4eDggCi0gKiAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4Ci0gKiBbaW5dICBwWmlnemFnVGFibGUgICAgcG9pbnRlciB0byB0aGUgemlnemFnIHRhYmxlcwotICogW291dF0gcERzdCAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgYmxvY2suIFNob3VsZCBiZSAzMi1iaXQgYWxpZ25lZAotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDJfRmlsbFZMREJ1ZmZlcigKLSAgICBPTVhfVTMyIHN0b3JlUnVuLAotICAgIE9NWF9TMTYgKiBwRHN0LAotICAgIE9NWF9TMTYgc3RvcmVMZXZlbCwKLSAgICBPTVhfVTggIHNpZ24sCi0gICAgT01YX1U4ICBsYXN0LAotICAgIE9NWF9VOCAgKiBwSW5kZXgsCi0gICAgY29uc3QgT01YX1U4ICogcFppZ3phZ1RhYmxlCi0pCi17Ci0gICAgLyogU3RvcmUgdGhlIHplcm8ncyBhcyBwZXIgdGhlIHJ1biBsZW5ndGggY291bnQgKi8KLSAgICBmb3IgKDtzdG9yZVJ1biA+IDA7IHN0b3JlUnVuLS0sICgqcEluZGV4KSsrKQotICAgIHsKLSAgICAgICAgcERzdFtwWmlnemFnVGFibGVbKnBJbmRleF1dID0gMDsKLSAgICB9Ci0gICAgLyogU3RvcmUgdGhlIGxldmVsIGRlcGVuZGluZyBvbiB0aGUgc2lnbiovCi0gICAgaWYgKHNpZ24gPT0gMSkKLSAgICB7Ci0gICAgICAgIHBEc3RbcFppZ3phZ1RhYmxlWypwSW5kZXhdXSA9IC1zdG9yZUxldmVsOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwRHN0W3BaaWd6YWdUYWJsZVsqcEluZGV4XV0gPSBzdG9yZUxldmVsOwotICAgIH0KLSAgICAoKnBJbmRleCkrKzsKLQotICAgIC8qIElmIGxhc3QgaXMgMSwgZmlsbCB0aGUgcmVtYWluaW5nIGVsbWVudHMgb2YgdGhlIGJ1ZmZlciB3aXRoIHplcm9zICovCi0gICAgaWYgKGxhc3QgPT0gMSkKLSAgICB7Ci0gICAgICAgIHdoaWxlICgqcEluZGV4IDwgNjQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBEc3RbcFppZ3phZ1RhYmxlWypwSW5kZXhdXSA9IDA7Ci0gICAgICAgICAgICAoKnBJbmRleCkrKzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9HZXRWTENCaXRzLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9HZXRWTENCaXRzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlYjE0MTEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfR2V0VkxDQml0cy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjkzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfR2V0VkxDQml0cy5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogQ29udGFpbnMgbW9kdWxlIGZvciBWTEMgZ2V0IGJpdHMgZnJvbSB0aGUgc3RyZWFtIAotICoKLSAqLyAKLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgotI2luY2x1ZGUgImFybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgiCi0jaW5jbHVkZSAiYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oIgotCi0gCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfR2V0VkxDQml0cwotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgZXNjYXBlIG1vZGUgZGVjaXNpb24gYmFzZWQgb24gdGhlIHJ1biwgcnVuKywgbGV2ZWwsIGxldmVsKyBhbmQgCi0gKiBsYXN0IGNvbWJpbmF0aW9ucy4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KLSAqCQkJCQkJCQl0aGUgYml0IHN0cmVhbQotICogW2luXQlwQml0T2Zmc2V0CQlwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAotICoJCQkJCQkJCWJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNwotICogW2luXSBzdGFydCAgICAgICAgICAgc3RhcnQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVuY29kaW5nIGJlZ2lucyB3aXRoIAotICogICAgICAgICAgICAgICAgICAgICAgMHRoIGVsZW1lbnQgb3IgMXN0LgotICogW2luL291dF0gcExhc3QgICAgICAgcG9pbnRlciB0byBsYXN0IHN0YXR1cyBmbGFnCi0gKiBbaW5dIHJ1bkJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDAgICAgICBUaGUgcnVuIHZhbHVlIGZyb20gd2hpY2ggbGV2ZWwgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGVxdWFsIHRvIDE6IGxhc3QgPT0gMAotICogW2luXSBJbmRleEJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDAgICAgQXJyYXkgaW5kZXggaW4gdGhlIFZMQyB0YWJsZSAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50aW5nIHRvIHRoZSAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5CZWdpblNpbmdsZUxldmVsRW50cmllc0wwIAotICogW2luXSBydW5CZWdpblNpbmdsZUxldmVsRW50cmllc0wxICAgICAgVGhlIHJ1biB2YWx1ZSBmcm9tIHdoaWNoIGxldmVsIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBlcXVhbCB0byAxOiBsYXN0ID09IDEKLSAqIFtpbl0gSW5kZXhCZWdpblNpbmdsZUxldmVsRW50cmllc0wxICAgIEFycmF5IGluZGV4IGluIHRoZSBWTEMgdGFibGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGluZyB0byB0aGUgIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMCAKLSAqIFtpbl0gcFJ1bkluZGV4VGFibGVMMCAgICBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAotICogW2luXSBwVmxjVGFibGVMMCAgICAgICAgIFZMQyB0YWJsZSBmb3IgbGFzdCA9PSAwCi0gKiBbaW5dIHBSdW5JbmRleFRhYmxlTDEgICAgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKLSAqIFtpbl0gcFZsY1RhYmxlTDEgICAgICAgICBWTEMgdGFibGUgZm9yIGxhc3QgPT0gMQotICogW2luXSBwTE1BWFRhYmxlTDAgICAgICAgIExldmVsIE1BWCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCi0gKiBbaW5dIHBMTUFYVGFibGVMMSAgICAgICAgTGV2ZWwgTUFYIHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKLSAqIFtpbl0gcFJNQVhUYWJsZUwwICAgICAgICBSdW4gTUFYIHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKLSAqIFtpbl0gcFJNQVhUYWJsZUwxICAgICAgICBSdW4gTUFYIHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKLSAqIFtvdXRdcERzdAkJCSAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudAotICoJCQkJCQkJYmxvY2suIFNob3VsZCBiZSAzMi1iaXQgYWxpZ25lZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAyX0dldFZMQ0JpdHMgKAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCi0JCQkgIE9NWF9TMTYgKiBwRHN0LAotCQkJICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCi0JCQkgIE9NWF9VOCAgICBzdGFydCwJCQkgIAotCQkJICBPTVhfVTggICogcExhc3QsCi0JCQkgIE9NWF9VOCAgICBydW5CZWdpblNpbmdsZUxldmVsRW50cmllc0wwLAotCQkJICBPTVhfVTggICAgbWF4SW5kZXhGb3JNdWx0aXBsZUVudHJpZXNMMCwKLQkJCSAgT01YX1U4ICAgIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wxLAotCQkJICBPTVhfVTggICAgbWF4SW5kZXhGb3JNdWx0aXBsZUVudHJpZXNMMSwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSdW5JbmRleFRhYmxlTDAsCi0gICAgICAgICAgICAgIGNvbnN0IEFSTV9WTEMzMiAqcFZsY1RhYmxlTDAsCi0JCQkgIGNvbnN0IE9NWF9VOCAgKiBwUnVuSW5kZXhUYWJsZUwxLAotICAgICAgICAgICAgICBjb25zdCBBUk1fVkxDMzIgKnBWbGNUYWJsZUwxLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcExNQVhUYWJsZUwwLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcExNQVhUYWJsZUwxLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJNQVhUYWJsZUwwLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJNQVhUYWJsZUwxLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFppZ3phZ1RhYmxlCi0pCi17Ci0gICAgT01YX1UzMiBzdG9yZVJ1bjsKLSAgICBPTVhfVTggIHRhYkluZGV4LCBtYXJrZXJCaXQ7Ci0gICAgT01YX1MxNiBzdG9yZUxldmVsOwotICAgIE9NWF9VMTYgdW5wYWNrUmV0SW5kZXg7Ci0JT01YX1U4ICBpLCBmVHlwZSwgZXNjYXBlOwkKLQlPTVhfVTggIHNpZ24gPSAwOwotCQotCS8qIFVucGFja2luZyB0aGUgYml0c3RyZWFtIGFuZCBSTEQgKi8KLSAgICBmb3IgKGkgPSBzdGFydDsgaSA8IDY0OykKLSAgICB7Ci0JCWVzY2FwZSA9IGFybUxvb2tBaGVhZEJpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDcpOwotCQlpZiAoZXNjYXBlICE9IDMpCi0JCXsJCi0JCQlmVHlwZSA9IDA7IC8qIE5vdCBpbiBlc2NhcGUgbW9kZSAqLwotCQl9Ci0JCWVsc2UKLQkJewotCQkJYXJtU2tpcEJpdHMgKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCA3KTsKLQkJCWlmKHNob3J0VmlkZW9IZWFkZXIpCi0JCQl7Ci0JCQkgICpwTGFzdCA9IGFybUdldEJpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDEpOwotCQkJICBzdG9yZVJ1biA9IGFybUdldEJpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDYpOwotCQkJICBzdG9yZUxldmVsID0gYXJtR2V0Qml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgOCk7Ci0JCQkgIAotCQkJICAvKiBSZWYgdG8gVGFibGUgQi0xOCAoYykgaW4gTVBFRzQgU3RhbmRhcmQtIEZMQyBjb2RlIGZvciAgKi8KLQkJCSAgLyogTEVWRUwgd2hlbiBzaG9ydF92aWRlb19oZWFkZXIgaXMgMSwgdGhlIHN0b3JlTGV2ZWwgaXMgICovCi0JCQkgIC8qIGEgc2lnbmVkIHZhbHVlIGFuZCB0aGUgc2lnbiBhbmQgdGhlIHVuc2lnbmVkIHZhbHVlIGZvciAqLwotCQkJICAvKiBzdG9yZUxldmVsIG5lZWQgdG8gYmUgZXh0cmFjdGVkIGFuZCBwYXNzZWQgdG8gYXJtICAgICAgKi8KLQkJCSAgLyogRmlsbFZMREJ1ZmZlciBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JCQkgICAgIAotCQkJICBzaWduID0gKHN0b3JlTGV2ZWwgJiAweDgwKTsKLQkJCSAgaWYoc2lnbj09MHg4MCkKLQkJCSAgewotCQkJICAJc3RvcmVMZXZlbD0oc3RvcmVMZXZlbF4weGZmKSsxOwkJCSAgCi0JCQkgIAlzaWduPTE7Ci0JCQkgIAkKLQkJCSAgfQotCQkJICAKLQkJCSAgYXJtUmV0RGF0YUVycklmKCBzdG9yZUxldmVsID09IDAgfHwgc2lnbipzdG9yZUxldmVsID09IDEyOCAsIE9NWF9TdHNfRXJyKTsgLyogSW52YWxpZCBGTEMgKi8KLQkJCSAgYXJtUmV0RGF0YUVycklmKChpICsgc3RvcmVSdW4pID49IDY0LCBPTVhfU3RzX0Vycik7Ci0JCQkgIGFybVZDTTRQMl9GaWxsVkxEQnVmZmVyKAotCQkJICAgIHN0b3JlUnVuLAotCQkJICAgIHBEc3QsCi0JCQkgICAgc3RvcmVMZXZlbCwKLQkJCSAgICBzaWduLAotCQkJICAgICpwTGFzdCwKLQkJCSAgICAmaSwKLQkJCSAgICBwWmlnemFnVGFibGUpOwotCQkJICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotCQkJICAgIAotCQkJfQotCQkJaWYgKGFybUdldEJpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDEpKQotCQkJewotCQkJCWlmIChhcm1HZXRCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAxKSkKLQkJCQl7Ci0JCQkJCWZUeXBlID0gMzsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJZlR5cGUgPSAyOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlmVHlwZSA9IDE7Ci0JCQl9Ci0JCX0KLQotCSAgICBpZiAoZlR5cGUgPCAzKQotCSAgICB7Ci0JICAgICAgICB1bnBhY2tSZXRJbmRleCA9IGFybVVuUGFja1ZMQzMyKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LAotCQkJCQkJCQkJCXBWbGNUYWJsZUwwKTsKLQkJCWlmICh1bnBhY2tSZXRJbmRleCAhPSBBUk1fTk9fQ09ERUJPT0tfSU5ERVgpCi0JCSAgICB7Ci0JCQkgICAgLyogRGVjb2RlIHJ1biBhbmQgbGV2ZWwgZnJvbSB0aGUgaW5kZXggKi8KLQkJCSAgICAvKiBsYXN0ID0gMCAqLwotCQkJICAgICpwTGFzdCA9IDA7Ci0JCQkgICAgaWYgKHVucGFja1JldEluZGV4ID4gbWF4SW5kZXhGb3JNdWx0aXBsZUVudHJpZXNMMCkKLQkJCSAgICB7Ci0JCQkJICAgIHN0b3JlTGV2ZWwgPSAxOwotCQkJCSAgICBzdG9yZVJ1biA9ICh1bnBhY2tSZXRJbmRleCAtIG1heEluZGV4Rm9yTXVsdGlwbGVFbnRyaWVzTDApIAotCQkJCQkJCSsgcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMDsKLQkJCSAgICB9Ci0JCQkgICAgZWxzZQotCQkJICAgIHsKLQkJCQkgICAgdGFiSW5kZXggPSAxOwotCQkJCSAgICB3aGlsZSAocFJ1bkluZGV4VGFibGVMMFt0YWJJbmRleF0gPD0gdW5wYWNrUmV0SW5kZXgpCi0JCQkJICAgIHsKLQkJCQkJICAgIHRhYkluZGV4Kys7Ci0JCQkJICAgIH0KLQkJCQkgICAgc3RvcmVSdW4gPSB0YWJJbmRleCAtIDE7Ci0JCQkJICAgIHN0b3JlTGV2ZWwgPSB1bnBhY2tSZXRJbmRleCAtIHBSdW5JbmRleFRhYmxlTDBbdGFiSW5kZXggLSAxXSArIDE7Ci0JCQkgICAgfQotCQkJICAgIHNpZ24gPSAoT01YX1U4KSBhcm1HZXRCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAxKTsKLQkJCQotCQkJICAgIGlmIChmVHlwZSA9PSAxKQotCQkJICAgIHsKLQkJCQkgICAgc3RvcmVMZXZlbCA9IChhcm1BYnMoc3RvcmVMZXZlbCkgKyBwTE1BWFRhYmxlTDBbc3RvcmVSdW5dKTsKLQkJCSAgICB9Ci0JCQkgICAgZWxzZSBpZiAoZlR5cGUgPT0gMikKLQkJCSAgICB7Ci0JCQkJICAgIHN0b3JlUnVuID0gc3RvcmVSdW4gKyBwUk1BWFRhYmxlTDBbc3RvcmVMZXZlbC0xXSArIDE7Ci0JCQkgICAgfQotCQkgICAgfQotCQkgICAgZWxzZQotCQkgICAgewotCQkJICAgIHVucGFja1JldEluZGV4ID0gYXJtVW5QYWNrVkxDMzIocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIAotCQkJCQkJCQkJCQlwVmxjVGFibGVMMSk7Ci0KLQkJCSAgICBhcm1SZXREYXRhRXJySWYodW5wYWNrUmV0SW5kZXggPT0gQVJNX05PX0NPREVCT09LX0lOREVYLCBPTVhfU3RzX0Vycik7Ci0KLQkJCSAgICAvKiBEZWNvZGUgcnVuIGFuZCBsZXZlbCBmcm9tIHRoZSBpbmRleCAqLwotCQkJICAgIC8qIGxhc3QgPSAxICovCi0JCQkgICAgKnBMYXN0ID0gMTsKLQkJCSAgICBpZiAodW5wYWNrUmV0SW5kZXggPiBtYXhJbmRleEZvck11bHRpcGxlRW50cmllc0wxKQotCQkJICAgIHsKLQkJCQkgICAgc3RvcmVMZXZlbCA9IDE7Ci0JCQkJICAgIHN0b3JlUnVuID0gKHVucGFja1JldEluZGV4IC0gbWF4SW5kZXhGb3JNdWx0aXBsZUVudHJpZXNMMSkgCi0JCQkJCQkJKyBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMTsKLQkJICAgICAgICB9Ci0JCSAgICAgICAgZWxzZQotCQkJICAgIHsKLQkJCQkgICAgdGFiSW5kZXggPSAxOwotCQkJCSAgICB3aGlsZSAocFJ1bkluZGV4VGFibGVMMVt0YWJJbmRleF0gPD0gdW5wYWNrUmV0SW5kZXgpCi0JCQkJICAgIHsKLQkJCQkJICAgIHRhYkluZGV4Kys7Ci0JCQkJICAgIH0KLQkJCQkgICAgc3RvcmVSdW4gPSB0YWJJbmRleCAtIDE7Ci0JCQkJICAgIHN0b3JlTGV2ZWwgPSB1bnBhY2tSZXRJbmRleCAtIHBSdW5JbmRleFRhYmxlTDFbdGFiSW5kZXggLSAxXSArIDE7Ci0JCQkgICAgfQotCQkJICAgIHNpZ24gPSAoT01YX1U4KSBhcm1HZXRCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAxKTsKLQotCQkJICAgIGlmIChmVHlwZSA9PSAxKQotCQkJICAgIHsKLQkJCSAgICAgICAgc3RvcmVMZXZlbCA9IChhcm1BYnMoc3RvcmVMZXZlbCkgKyBwTE1BWFRhYmxlTDFbc3RvcmVSdW5dKTsJCQkJCi0JCQkgICAgfQotCQkJICAgIGVsc2UgaWYgKGZUeXBlID09IDIpCi0JCQkgICAgewotCQkJCSAgICBzdG9yZVJ1biA9IHN0b3JlUnVuICsgcFJNQVhUYWJsZUwxW3N0b3JlTGV2ZWwtMV0gKyAxOwotCQkJICAgIH0KLQkJICAgIH0KLSAgICAgICAgICAgIGFybVJldERhdGFFcnJJZigoaSArIHN0b3JlUnVuKSA+PSA2NCwgT01YX1N0c19FcnIpOwotCQkgICAgYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIoCi0JCQkgICAgc3RvcmVSdW4sCi0JCQkgICAgcERzdCwKLQkJCSAgICBzdG9yZUxldmVsLAotCQkJICAgIHNpZ24sCi0JCQkgICAgKnBMYXN0LAotCQkJICAgICZpLAotCQkJICAgIHBaaWd6YWdUYWJsZSk7CQkKLQkgICAgfQotCSAgICBlbHNlCi0JICAgIHsKLQkJICAgICpwTGFzdCA9IGFybUdldEJpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDEpOwotCQkgICAgc3RvcmVSdW4gID0gYXJtR2V0Qml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgNik7Ci0JCSAgICBhcm1SZXREYXRhRXJySWYoKGkgKyBzdG9yZVJ1bikgPj0gNjQsIE9NWF9TdHNfRXJyKTsKLQkJICAgIG1hcmtlckJpdCA9IGFybUdldEJpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDEpOwotCQkgICAgYXJtUmV0RGF0YUVycklmKCBtYXJrZXJCaXQgPT0gMCwgT01YX1N0c19FcnIpOwotCQkgICAgc3RvcmVMZXZlbCAgPSBhcm1HZXRCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAxMik7Ci0JCSAgICBpZiAoc3RvcmVMZXZlbCAmIDB4ODAwKQotCQkgICAgewotCQkJICAgIHN0b3JlTGV2ZWwgLT0gNDA5NjsKLQkJICAgIH0JCQkKLQkJICAgIGFybVJldERhdGFFcnJJZiggc3RvcmVMZXZlbCA9PSAwIHx8IHN0b3JlTGV2ZWwgPT0gLTIwNDggLCBPTVhfU3RzX0Vycik7IC8qIEludmFsaWQgRkxDICovCi0JCSAgICBhcm1HZXRCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAxKTsKLQkJICAgIGFybVZDTTRQMl9GaWxsVkxEQnVmZmVyKAotCQkJICAgIHN0b3JlUnVuLAotCQkJICAgIHBEc3QsCi0JCQkgICAgc3RvcmVMZXZlbCwKLQkJCSAgICAwLCAvKiBTaWduIGlzIG5vdCB1c2VkLCBwcmVwcm9jZXNzaW5nIGRvbmUgKi8KLQkJCSAgICAqcExhc3QsCi0JCQkgICAgJmksCi0JCQkgICAgcFppZ3phZ1RhYmxlKTsKLQotCSAgICB9Ci0gICAgfSAvKiBFbmQgb2YgZm9ybG9vcCBmb3IgaSAqLwotCXJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0vKiBFbmQgb2YgRmlsZSAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTAxZDQ4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTEwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLSAvKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRmlsZTogICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYwotICogRGVzY3JpcHRpb246IENvbnRhaW5zIGFsbCB0aGUgSHVmZm1hbiB0YWJsZXMgdXNlZCBpbiBNUEVHNCBjb2RlYwotICoKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLQotI2luY2x1ZGUgImFybUNPTU1fQml0c3RyZWFtLmgiCi0KLS8qIAotKiAgRm9yIEludHJhCi0qICBsYXN0ID0gMCAKLSovCi1jb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDBSdW5JZHhbMTFdID0gCi17IAotICAgIDAsIDI3LCAzNywgNDIsIDQ2LCA0OSwgNTIsIAotICAgIDU1LCA1OCwgNjAsIDYyCi19OwotCi0vKiBFbnRyeSBkZWZpbmVkIGZvciBhbGwgdmFsdWVzIAotKiAgZm9yIHJ1biA9IDAgdG8gMTQKLSogIE5vdGU6IHRoZSBsYXN0IGVudHJ5IGlzIHRvIHRlcm1pbmF0ZSB3aGlsZSBkZWNvZGluZwotKi8KLWNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDJfSW50cmFWbGNMMFs2OF0gPSAKLXsKLSAgICAgICAgezIsICAgIDJ9LAotICAgICAgICB7MywgICAgNn0sCi0gICAgICAgIHs0LCAgICAxNX0sCi0gICAgICAgIHs1LCAgICAxM30sCi0gICAgICAgIHs1LCAgICAxMn0sCi0gICAgICAgIHs2LCAgICAyMX0sCi0gICAgICAgIHs2LCAgICAxOX0sCi0gICAgICAgIHs2LCAgICAxOH0sCi0gICAgICAgIHs3LCAgICAyM30sCi0gICAgICAgIHs4LCAgICAzMX0sCi0gICAgICAgIHs4LCAgICAzMH0sCi0gICAgICAgIHs4LCAgICAyOX0sCi0gICAgICAgIHs5LCAgICAzN30sCi0gICAgICAgIHs5LCAgICAzNn0sCi0gICAgICAgIHs5LCAgICAzNX0sCi0gICAgICAgIHs5LCAgICAzM30sCi0gICAgICAgIHsxMCwgICAzM30sCi0gICAgICAgIHsxMCwgICAzMn0sCi0gICAgICAgIHsxMCwgICAxNX0sCi0gICAgICAgIHsxMCwgICAxNH0sCi0gICAgICAgIHsxMSwgICAgN30sCi0gICAgICAgIHsxMSwgICAgNn0sCi0gICAgICAgIHsxMSwgICAzMn0sCi0gICAgICAgIHsxMSwgICAzM30sCi0gICAgICAgIHsxMiwgICA4MH0sCi0gICAgICAgIHsxMiwgICA4MX0sCi0gICAgICAgIHsxMiwgICA4Mn0sCi0gICAgICAgIHs0LCAgICAxNH0sCi0gICAgICAgIHs2LCAgICAyMH0sCi0gICAgICAgIHs3LCAgICAyMn0sCi0gICAgICAgIHs4LCAgICAyOH0sCi0gICAgICAgIHs5LCAgICAzMn0sCi0gICAgICAgIHs5LCAgICAzMX0sCi0gICAgICAgIHsxMCwgICAxM30sCi0gICAgICAgIHsxMSwgICAzNH0sCi0gICAgICAgIHsxMiwgICA4M30sCi0gICAgICAgIHsxMiwgICA4NX0sCi0gICAgICAgIHs1LCAgICAxMX0sCi0gICAgICAgIHs3LCAgICAyMX0sCi0gICAgICAgIHs5LCAgICAzMH0sCi0gICAgICAgIHsxMCwgICAxMn0sCi0gICAgICAgIHsxMiwgICA4Nn0sCi0gICAgICAgIHs2LCAgICAxN30sCi0gICAgICAgIHs4LCAgICAyN30sCi0gICAgICAgIHs5LCAgICAyOX0sCi0gICAgICAgIHsxMCwgICAxMX0sCi0gICAgICAgIHs2LCAgICAxNn0sCi0gICAgICAgIHs5LCAgICAzNH0sCi0gICAgICAgIHsxMCwgICAxMH0sCi0gICAgICAgIHs2LCAgICAxM30sCi0gICAgICAgIHs5LCAgICAyOH0sCi0gICAgICAgIHsxMCwgICAgOH0sCi0gICAgICAgIHs3LCAgICAxOH0sCi0gICAgICAgIHs5LCAgICAyN30sCi0gICAgICAgIHsxMiwgICA4NH0sCi0gICAgICAgIHs3LCAgICAyMH0sCi0gICAgICAgIHs5LCAgICAyNn0sCi0gICAgICAgIHsxMiwgICA4N30sCi0gICAgICAgIHs4LCAgICAyNX0sCi0gICAgICAgIHsxMCwgICAgOX0sCi0gICAgICAgIHs4LCAgICAyNH0sCi0gICAgICAgIHsxMSwgICAzNX0sCi0gICAgICAgIHs4LCAgICAyM30sCi0gICAgICAgIHs5LCAgICAyNX0sCi0gICAgICAgIHs5LCAgICAyNH0sCi0gICAgICAgIHsxMCwgICAgN30sCi0gICAgICAgIHsxMiwgICA4OH0sCi0gICAgICAgIHswLCAgICAgMH0KLX07Ci0KLS8qIAotKiAgRm9yIEludHJhCi0qICBsYXN0ID0gMSAKLSovCi0KLWNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50cmFMMVJ1bklkeFs4XSA9IAotewotICAgIDAsICA4LCAxMSwgMTMsIDE1LCAxNywgMTksIDIxCi19OwotCi0vKiBFbnRyeSBkZWZpbmVkIGZvciBhbGwgdmFsdWVzIAotKiAgZm9yIHJ1biA9IDAgdG8gMjAKLSogICogIE5vdGU6IHRoZSBsYXN0IGVudHJ5IGlzIHRvIHRlcm1pbmF0ZSB3aGlsZSBkZWNvZGluZwotKi8KLWNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDJfSW50cmFWbGNMMVszNl0gPSAKLXsKLSAgICAgICAgezQsICAgICA3fSwKLSAgICAgICAgezYsICAgIDEyfSwKLSAgICAgICAgezgsICAgIDIyfSwKLSAgICAgICAgezksICAgIDIzfSwKLSAgICAgICAgezEwLCAgICA2fSwKLSAgICAgICAgezExLCAgICA1fSwKLSAgICAgICAgezExLCAgICA0fSwKLSAgICAgICAgezEyLCAgIDg5fSwKLSAgICAgICAgezYsICAgIDE1fSwKLSAgICAgICAgezksICAgIDIyfSwKLSAgICAgICAgezEwLCAgICA1fSwKLSAgICAgICAgezYsICAgIDE0fSwKLSAgICAgICAgezEwLCAgICA0fSwKLSAgICAgICAgezcsICAgIDE3fSwKLSAgICAgICAgezExLCAgIDM2fSwKLSAgICAgICAgezcsICAgIDE2fSwKLSAgICAgICAgezExLCAgIDM3fSwKLSAgICAgICAgezcsICAgIDE5fSwKLSAgICAgICAgezEyLCAgIDkwfSwKLSAgICAgICAgezgsICAgIDIxfSwKLSAgICAgICAgezEyLCAgIDkxfSwKLSAgICAgICAgezgsICAgIDIwfSwKLSAgICAgICAgezgsICAgIDE5fSwKLSAgICAgICAgezgsICAgIDI2fSwKLSAgICAgICAgezksICAgIDIxfSwKLSAgICAgICAgezksICAgIDIwfSwKLSAgICAgICAgezksICAgIDE5fSwKLSAgICAgICAgezksICAgIDE4fSwKLSAgICAgICAgezksICAgIDE3fSwKLSAgICAgICAgezExLCAgIDM4fSwKLSAgICAgICAgezExLCAgIDM5fSwKLSAgICAgICAgezEyLCAgIDkyfSwKLSAgICAgICAgezEyLCAgIDkzfSwKLSAgICAgICAgezEyLCAgIDk0fSwKLSAgICAgICAgezEyLCAgIDk1fSwgIAotICAgICAgICB7MCwgICAgIDB9Ci19OwotCi0vKiBMTUFYIHRhYmxlIGZvciBJbnRyYSAoTGFzdCA9PSAwKSovCi1jb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDBMTUFYWzE1XSA9IAotewotICAgMjcsIDEwLCAgNSwgIDQsICAzLCAgMywgIDMsICAKLSAgICAzLCAgMiwgIDIsICAxLCAgMSwgIDEsICAxLCAgMQotfTsKLQotLyogTE1BWCB0YWJsZSBmb3IgSW50cmEgKExhc3QgPT0gMSkqLwotY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRyYUwxTE1BWFsyMV0gPSAKLXsKLSAgICA4LCAgMywgIDIsICAyLCAgMiwgIDIsICAyLCAgMSwgCi0JMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCi0JMSwgIDEsICAxLCAgMSwgIDEKLX07Ci0KLS8qIFJNQVggdGFibGUgZm9yIEludHJhIChMYXN0ID09IDApCi0gICBMZXZlbCAtIDEgSW5kZXhlZCAKLSovCi1jb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDBSTUFYWzI3XSA9Ci17Ci0gICAxNCwgIDksICA3LCAgMywgIDIsICAxLAkxLCAgCi0gICAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAJMCwgIAotICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAKLSAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAKLX07Ci0KLS8qIFJNQVggdGFibGUgZm9yIEludHJhIChMYXN0ID09IDEpCi0gICBMZXZlbCAtIDEgSW5kZXhlZCAKLSovCi1jb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDFSTUFYWzhdID0KLXsKLSAgIDIwLCAgNiwgIDEsICAwLCAgMCwgIDAsICAwLCAgMAotfTsKLQotLyogCi0qICBGb3IgSW50ZXIKLSogIGxhc3QgPSAwIAotKi8KLWNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50ZXJMMFJ1bklkeFsxMl0gPSAKLXsgCi0gICAgIDAsICAxMiwgIDE4LCAgMjIsICAyNSwgIDI4LCAgCi0gICAgMzEsICAzNCwgIDM2LCAgMzgsICA0MCwgIDQyCi19OwotCi0vKiBFbnRyeSBkZWZpbmVkIGZvciBhbGwgdmFsdWVzIAotKiAgZm9yIHJ1biA9IDAgdG8gMjYKLSogIE5vdGU6IHRoZSBsYXN0IGVudHJ5IGlzIHRvIHRlcm1pbmF0ZSB3aGlsZSBkZWNvZGluZwotKi8KLWNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDJfSW50ZXJWbGNMMFs1OV0gPSAKLXsKLSAgICAgICAgezIsICAgICAyfSwKLSAgICAgICAgezQsICAgIDE1fSwKLSAgICAgICAgezYsICAgIDIxfSwKLSAgICAgICAgezcsICAgIDIzfSwKLSAgICAgICAgezgsICAgIDMxfSwKLSAgICAgICAgezksICAgIDM3fSwKLSAgICAgICAgezksICAgIDM2fSwKLSAgICAgICAgezEwLCAgIDMzfSwKLSAgICAgICAgezEwLCAgIDMyfSwKLSAgICAgICAgezExLCAgICA3fSwKLSAgICAgICAgezExLCAgICA2fSwKLSAgICAgICAgezExLCAgIDMyfSwKLSAgICAgICAgezMsICAgICA2fSwKLSAgICAgICAgezYsICAgIDIwfSwKLSAgICAgICAgezgsICAgIDMwfSwKLSAgICAgICAgezEwLCAgIDE1fSwKLSAgICAgICAgezExLCAgIDMzfSwKLSAgICAgICAgezEyLCAgIDgwfSwKLSAgICAgICAgezQsICAgIDE0fSwKLSAgICAgICAgezgsICAgIDI5fSwKLSAgICAgICAgezEwLCAgIDE0fSwKLSAgICAgICAgezEyLCAgIDgxfSwKLSAgICAgICAgezUsICAgIDEzfSwKLSAgICAgICAgezksICAgIDM1fSwKLSAgICAgICAgezEwLCAgIDEzfSwKLSAgICAgICAgezUsICAgIDEyfSwKLSAgICAgICAgezksICAgIDM0fSwKLSAgICAgICAgezEyLCAgIDgyfSwKLSAgICAgICAgezUsICAgIDExfSwKLSAgICAgICAgezEwLCAgIDEyfSwKLSAgICAgICAgezEyLCAgIDgzfSwKLSAgICAgICAgezYsICAgIDE5fSwKLSAgICAgICAgezEwLCAgIDExfSwKLSAgICAgICAgezEyLCAgIDg0fSwKLSAgICAgICAgezYsICAgIDE4fSwKLSAgICAgICAgezEwLCAgIDEwfSwKLSAgICAgICAgezYsICAgIDE3fSwKLSAgICAgICAgezEwLCAgICA5fSwKLSAgICAgICAgezYsICAgIDE2fSwKLSAgICAgICAgezEwLCAgICA4fSwKLSAgICAgICAgezcsICAgIDIyfSwKLSAgICAgICAgezEyLCAgIDg1fSwKLSAgICAgICAgezcsICAgIDIxfSwKLSAgICAgICAgezcsICAgIDIwfSwKLSAgICAgICAgezgsICAgIDI4fSwKLSAgICAgICAgezgsICAgIDI3fSwKLSAgICAgICAgezksICAgIDMzfSwKLSAgICAgICAgezksICAgIDMyfSwKLSAgICAgICAgezksICAgIDMxfSwKLSAgICAgICAgezksICAgIDMwfSwKLSAgICAgICAgezksICAgIDI5fSwKLSAgICAgICAgezksICAgIDI4fSwKLSAgICAgICAgezksICAgIDI3fSwKLSAgICAgICAgezksICAgIDI2fSwKLSAgICAgICAgezExLCAgIDM0fSwKLSAgICAgICAgezExLCAgIDM1fSwKLSAgICAgICAgezEyLCAgIDg2fSwKLSAgICAgICAgezEyLCAgIDg3fSwKLSAgICAgICAgezAsICAgICAwfQotfTsKLSAKLQotLyogCi0qICBGb3IgSW50cmEKLSogIGxhc3QgPSAxIAotKi8KLQotY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRlckwxUnVuSWR4WzNdID0gCi17Ci0gICAgMCwgMywgNQotfTsKLQotLyogRW50cnkgZGVmaW5lZCBmb3IgYWxsIHZhbHVlcyAKLSogIGZvciBydW4gPSAwIHRvIDQwCi0qICBOb3RlOiB0aGUgbGFzdCBlbnRyeSBpcyB0byB0ZXJtaW5hdGUgd2hpbGUgZGVjb2RpbmcKLSovCi1jb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAyX0ludGVyVmxjTDFbNDVdID0gCi17Ci0gICAgICAgIHs0LCAgICAgN30sCi0gICAgICAgIHs5LCAgICAyNX0sCi0gICAgICAgIHsxMSwgICAgNX0sCi0gICAgICAgIHs2LCAgICAxNX0sCi0gICAgICAgIHsxMSwgICAgNH0sCi0gICAgICAgIHs2LCAgICAxNH0sCi0gICAgICAgIHs2LCAgICAxM30sCi0gICAgICAgIHs2LCAgICAxMn0sCi0gICAgICAgIHs3LCAgICAxOX0sCi0gICAgICAgIHs3LCAgICAxOH0sCi0gICAgICAgIHs3LCAgICAxN30sCi0gICAgICAgIHs3LCAgICAxNn0sCi0gICAgICAgIHs4LCAgICAyNn0sCi0gICAgICAgIHs4LCAgICAyNX0sCi0gICAgICAgIHs4LCAgICAyNH0sCi0gICAgICAgIHs4LCAgICAyM30sCi0gICAgICAgIHs4LCAgICAyMn0sCi0gICAgICAgIHs4LCAgICAyMX0sCi0gICAgICAgIHs4LCAgICAyMH0sCi0gICAgICAgIHs4LCAgICAxOX0sCi0gICAgICAgIHs5LCAgICAyNH0sCi0gICAgICAgIHs5LCAgICAyM30sCi0gICAgICAgIHs5LCAgICAyMn0sCi0gICAgICAgIHs5LCAgICAyMX0sCi0gICAgICAgIHs5LCAgICAyMH0sCi0gICAgICAgIHs5LCAgICAxOX0sCi0gICAgICAgIHs5LCAgICAxOH0sCi0gICAgICAgIHs5LCAgICAxN30sCi0gICAgICAgIHsxMCwgICAgN30sCi0gICAgICAgIHsxMCwgICAgNn0sCi0gICAgICAgIHsxMCwgICAgNX0sCi0gICAgICAgIHsxMCwgICAgNH0sCi0gICAgICAgIHsxMSwgICAzNn0sCi0gICAgICAgIHsxMSwgICAzN30sCi0gICAgICAgIHsxMSwgICAzOH0sCi0gICAgICAgIHsxMSwgICAzOX0sCi0gICAgICAgIHsxMiwgICA4OH0sCi0gICAgICAgIHsxMiwgICA4OX0sCi0gICAgICAgIHsxMiwgICA5MH0sCi0gICAgICAgIHsxMiwgICA5MX0sCi0gICAgICAgIHsxMiwgICA5Mn0sCi0gICAgICAgIHsxMiwgICA5M30sCi0gICAgICAgIHsxMiwgICA5NH0sCi0gICAgICAgIHsxMiwgICA5NX0sCi0gICAgICAgIHsgMCwgICAgMH0KLX07Ci0KLS8qIExNQVggdGFibGUgZm9yIEludHJhIChMYXN0ID09IDApKi8KLWNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50ZXJMMExNQVhbMjddID0gCi17Ci0gICAxMiwgIDYsICA0LCAgMywgIDMsICAzLCAgMywgIDIsIAotICAgIDIsICAyLCAgMiwgIDEsICAxLCAgMSwgIDEsICAxLAotICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAotICAgIDEsICAxLCAgMSwKLX07Ci0KLS8qIExNQVggdGFibGUgZm9yIEludHJhIChMYXN0ID09IDEpKi8KLWNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50ZXJMMUxNQVhbNDFdID0gCi17Ci0gICAgMywgIDIsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsIAotCTEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAotCTEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAotCTEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAotCTEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAotCTEsICAKLX07Ci0KLS8qIFJNQVggdGFibGUgZm9yIEludHJhIChMYXN0ID09IDApCi0gICBMZXZlbCAtIDEgSW5kZXhlZCAKLSovCi1jb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDBSTUFYWzEyXSA9IAotewotICAgMjYsIDEwLCAgNiwgIDIsICAxLCAgMSwgICAKLSAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAKLX07Ci0KLS8qIFJNQVggdGFibGUgZm9yIEludHJhIChMYXN0ID09IDEpCi0gICBMZXZlbCAtIDEgSW5kZXhlZCAKLSovCi1jb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDFSTUFYWzNdID0gCi17Ci0gICA0MCwgIDEsICAwCi19OwotCi0vKiAKLSogIEZvciBJbnRyYSAtIEx1bWluYW5jZQotKi8KLQotY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMl9hSW50cmFEQ0x1bWFJbmRleFsxNF0gPSAKLXsKLSAgICAgICAgezMsICAgICAzfSwKLSAgICAgICAgezIsICAgICAzfSwKLSAgICAgICAgezIsICAgICAyfSwKLSAgICAgICAgezMsICAgICAyfSwKLSAgICAgICAgezMsICAgICAxfSwKLSAgICAgICAgezQsICAgICAxfSwKLSAgICAgICAgezUsICAgICAxfSwKLSAgICAgICAgezYsICAgICAxfSwKLSAgICAgICAgezcsICAgICAxfSwKLSAgICAgICAgezgsICAgICAxfSwKLSAgICAgICAgezksICAgICAxfSwKLSAgICAgICAgezEwLCAgICAxfSwKLSAgICAgICAgezExLCAgICAxfSwKLSAgICAgICAgezAsICAgICAwfQotfTsKLQotLyogCi0qICBGb3IgSW50cmEgLSBDaHJvbWluYW5jZQotKi8KLSAKLWNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDJfYUludHJhRENDaHJvbWFJbmRleFsxNF0gPSAKLXsKLSAgICAgICAgezIsICAgICAzfSwKLSAgICAgICAgezIsICAgICAyfSwKLSAgICAgICAgezIsICAgICAxfSwKLSAgICAgICAgezMsICAgICAxfSwKLSAgICAgICAgezQsICAgICAxfSwKLSAgICAgICAgezUsICAgICAxfSwKLSAgICAgICAgezYsICAgICAxfSwKLSAgICAgICAgezcsICAgICAxfSwKLSAgICAgICAgezgsICAgICAxfSwKLSAgICAgICAgezksICAgICAxfSwKLSAgICAgICAgezEwLCAgICAxfSwKLSAgICAgICAgezExLCAgICAxfSwKLSAgICAgICAgezEyLCAgICAxfSwKLSAgICAgICAgezAsICAgICAwfQotfTsKLQotLyogCi0gKiAgTW90aW9uIHZlY3RvciBkZWNvZGluZyB0YWJsZQotICovCi0gCi1jb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAyX2FWbGNNVkRbNjZdID0KLXsKLSAgICAgICAgezEzLCAgICAgNX0sCi0gICAgICAgIHsxMywgICAgIDd9LAotICAgICAgICB7MTIsICAgICA1fSwKLSAgICAgICAgezEyLCAgICAgN30sCi0gICAgICAgIHsxMiwgICAgIDl9LAotICAgICAgICB7MTIsICAgIDExfSwKLSAgICAgICAgezEyLCAgICAxM30sCi0gICAgICAgIHsxMiwgICAgMTV9LAotICAgICAgICB7MTEsICAgICA5fSwKLSAgICAgICAgezExLCAgICAxMX0sCi0gICAgICAgIHsxMSwgICAgMTN9LAotICAgICAgICB7MTEsICAgIDE1fSwKLSAgICAgICAgezExLCAgICAxN30sCi0gICAgICAgIHsxMSwgICAgMTl9LAotICAgICAgICB7MTEsICAgIDIxfSwKLSAgICAgICAgezExLCAgICAyM30sCi0gICAgICAgIHsxMSwgICAgMjV9LAotICAgICAgICB7MTEsICAgIDI3fSwKLSAgICAgICAgezExLCAgICAyOX0sCi0gICAgICAgIHsxMSwgICAgMzF9LAotICAgICAgICB7MTEsICAgIDMzfSwKLSAgICAgICAgezExLCAgICAzNX0sCi0gICAgICAgIHsxMCwgICAgMTl9LAotICAgICAgICB7MTAsICAgIDIxfSwKLSAgICAgICAgezEwLCAgICAyM30sCi0gICAgICAgIHs4LCAgICAgIDd9LAotICAgICAgICB7OCwgICAgICA5fSwKLSAgICAgICAgezgsICAgICAxMX0sCi0gICAgICAgIHs3LCAgICAgIDd9LAotICAgICAgICB7NSwgICAgICAzfSwKLSAgICAgICAgezQsICAgICAgM30sCi0gICAgICAgIHszLCAgICAgIDN9LAotICAgICAgICB7MSwgICAgICAxfSwKLSAgICAgICAgezMsICAgICAgMn0sCi0gICAgICAgIHs0LCAgICAgIDJ9LAotICAgICAgICB7NSwgICAgICAyfSwKLSAgICAgICAgezcsICAgICAgNn0sCi0gICAgICAgIHs4LCAgICAgMTB9LAotICAgICAgICB7OCwgICAgICA4fSwKLSAgICAgICAgezgsICAgICAgNn0sCi0gICAgICAgIHsxMCwgICAgMjJ9LAotICAgICAgICB7MTAsICAgIDIwfSwKLSAgICAgICAgezEwLCAgICAxOH0sCi0gICAgICAgIHsxMSwgICAgMzR9LAotICAgICAgICB7MTEsICAgIDMyfSwKLSAgICAgICAgezExLCAgICAzMH0sCi0gICAgICAgIHsxMSwgICAgMjh9LAotICAgICAgICB7MTEsICAgIDI2fSwKLSAgICAgICAgezExLCAgICAyNH0sCi0gICAgICAgIHsxMSwgICAgMjJ9LAotICAgICAgICB7MTEsICAgIDIwfSwKLSAgICAgICAgezExLCAgICAxOH0sCi0gICAgICAgIHsxMSwgICAgMTZ9LAotICAgICAgICB7MTEsICAgIDE0fSwKLSAgICAgICAgezExLCAgICAxMn0sCi0gICAgICAgIHsxMSwgICAgMTB9LAotICAgICAgICB7MTEsICAgICA4fSwKLSAgICAgICAgezEyLCAgICAxNH0sCi0gICAgICAgIHsxMiwgICAgMTJ9LAotICAgICAgICB7MTIsICAgIDEwfSwKLSAgICAgICAgezEyLCAgICAgOH0sCi0gICAgICAgIHsxMiwgICAgIDZ9LAotICAgICAgICB7MTIsICAgICA0fSwKLSAgICAgICAgezEzLCAgICAgNn0sCi0gICAgICAgIHsxMywgICAgIDR9LAotICAgICAgICB7IDAsICAgICAwfQotfTsKLQotLyogRW5kIG9mIGZpbGUgKi8KLQotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1B1dFZMQ0JpdHMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1B1dFZMQ0JpdHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFkNTQ5NC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9QdXRWTENCaXRzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9QdXRWTENCaXRzLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBDb250YWlucyBtb2R1bGUgZm9yIFZMQyBwdXQgYml0cyB0byBiaXRzdHJlYW0gCi0gKgotICovIAotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLQotI2luY2x1ZGUgImFybVZDLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybUNPTU1fQml0c3RyZWFtLmgiCi0jaW5jbHVkZSAiYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaCIKLSNpbmNsdWRlICJhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgiCi0KLSAKLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9QdXRWTENCaXRzCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDaGVja3MgdGhlIHR5cGUgb2YgRXNjYXBlIE1vZGUgYW5kIHB1dCBlbmNvZGVkIGJpdHMgZm9yIAotICogcXVhbnRpemVkIERDVCBjb2VmZmljaWVudHMuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQkgcHBCaXRTdHJlYW0gICAgICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KLSAqCQkJCQkJICB0aGUgYml0IHN0cmVhbQotICogW2luXQkgcEJpdE9mZnNldCAgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAotICogICAgICAgICAgICAgICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcKLSAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiBzaG9ydFZpZGVvSGVhZGVyPT0wLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MS4KLSAqIFtpbl0gIHN0YXJ0ICAgICAgICAgICAgc3RhcnQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVuY29kaW5nIGJlZ2lucyB3aXRoIAotICogICAgICAgICAgICAgICAgICAgICAgICAwdGggZWxlbWVudCBvciAxc3QuCi0gKiBbaW5dICBtYXhTdG9yZVJ1bkwwICAgIE1heCBzdG9yZSBwb3NzaWJsZSAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBsYXN0ID0gMAotICogW2luXSAgbWF4U3RvcmVSdW5MMSAgICBNYXggc3RvcmUgcG9zc2libGUgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhKQotICogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbGFzdCA9IDEKLSAqIFtpbl0gIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wwIAotICogICAgICAgICAgICAgICAgICAgICAgICBUaGUgcnVuIHZhbHVlIGFmdGVyIHdoaWNoIGxldmVsIAotICogICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGVxdWFsIHRvIDE6IAotICogICAgICAgICAgICAgICAgICAgICAgICAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEgc3RhdHVzKSBmb3IgbGFzdCA9IDAKLSAqIFtpbl0gIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wxIAotICogICAgICAgICAgICAgICAgICAgICAgICBUaGUgcnVuIHZhbHVlIGFmdGVyIHdoaWNoIGxldmVsIAotICogICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGVxdWFsIHRvIDE6IAotICogICAgICAgICAgICAgICAgICAgICAgICAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEgc3RhdHVzKSBmb3IgbGFzdCA9IDEKLSAqIFtpbl0gIHBSdW5JbmRleFRhYmxlTDAgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCi0gKiBbaW5dICBwVmxjVGFibGVMMCAgICAgIFZMQyB0YWJsZSBmb3IgbGFzdCA9PSAwCi0gKiBbaW5dICBwUnVuSW5kZXhUYWJsZUwxIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMQotICogW2luXSAgcFZsY1RhYmxlTDEgICAgICBWTEMgdGFibGUgZm9yIGxhc3QgPT0gMQotICogW2luXSAgcExNQVhUYWJsZUwwICAgICBMZXZlbCBNQVggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKLSAqIFtpbl0gIHBMTUFYVGFibGVMMSAgICAgTGV2ZWwgTUFYIHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCi0gKiBbaW5dICBwUk1BWFRhYmxlTDAgICAgIFJ1biBNQVggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKLSAqIFtpbl0gIHBSTUFYVGFibGVMMSAgICAgUnVuIE1BWCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMQotICogW291dF0gcFFEY3RCbGtDb2VmICAgICBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50Ci0gKiBbb3V0XSBwcEJpdFN0cmVhbSAgICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAotICogICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gYnVmZmVyLgotICogW291dF0gcEJpdE9mZnNldCAgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbS4KLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLQotCi1PTVhSZXN1bHQgYXJtVkNNNFAyX1B1dFZMQ0JpdHMgKAotICAgICAgICAgICAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9TMTYgKnBRRGN0QmxrQ29lZiwKLSAgICAgICAgICAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAotICAgICAgICAgICAgICBPTVhfVTggc3RhcnQsCi0gICAgICAgICAgICAgIE9NWF9VOCBtYXhTdG9yZVJ1bkwwLAotICAgICAgICAgICAgICBPTVhfVTggbWF4U3RvcmVSdW5MMSwKLSAgICAgICAgICAgICAgT01YX1U4ICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMCwKLSAgICAgICAgICAgICAgT01YX1U4ICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMSwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSdW5JbmRleFRhYmxlTDAsCi0gICAgICAgICAgICAgIGNvbnN0IEFSTV9WTEMzMiAqcFZsY1RhYmxlTDAsCi0JCQkgIGNvbnN0IE9NWF9VOCAgKiBwUnVuSW5kZXhUYWJsZUwxLAotICAgICAgICAgICAgICBjb25zdCBBUk1fVkxDMzIgKnBWbGNUYWJsZUwxLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcExNQVhUYWJsZUwwLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcExNQVhUYWJsZUwxLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJNQVhUYWJsZUwwLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJNQVhUYWJsZUwxLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFppZ3phZ1RhYmxlCi0pCi17Ci0KLSAgICBPTVhfVTMyIHN0b3JlUnVuID0gMCwgcnVuLCBzdG9yZVJ1blBsdXM7Ci0gICAgT01YX1U4ICBsYXN0ID0gMCwgZmlyc3QgPSAxLCBmTW9kZTsKLSAgICBPTVhfUzE2IGxldmVsLCBzdG9yZUxldmVsID0gMCwgc3RvcmVMZXZlbFBsdXM7Ci0gICAgT01YX0lOVCBpOwotICAgIAotICAgICAgICAvKiBSTEUgZW5jb2RpbmcgYW5kIHBhY2tpbmcgdGhlIGJpdHMgaW50byB0aGUgc3RyZWFtcyAqLwotICAgICAgICBmb3IgKGkgPSBzdGFydCwgcnVuPTA7IGkgPCA2NDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBsZXZlbCAgID0gcFFEY3RCbGtDb2VmW3BaaWd6YWdUYWJsZVtpXV07Ci0KLSAgICAgICAgICAgIC8qIENvdW50aW5nIHRoZSBydW4gKi8KLSAgICAgICAgICAgIGlmIChsZXZlbCA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJ1bisrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBGb3VuZCBhIG5vbi16ZXJvIGNvZWZmICovCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGZpcnN0ID09IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsYXN0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIC8qIENoZWNrIGZvciBhIHZhbGlkIGVudHJ5IGluIHRoZSBWTEMgdGFibGUgKi8KLSAgICAgICAgICAgICAgICAgICAgc3RvcmVMZXZlbFBsdXMgPSBhcm1TaWduQ2hlY2soc3RvcmVMZXZlbCkgKiAKLSAgICAgICAgICAgICAgICAgICAgICAoYXJtQWJzKHN0b3JlTGV2ZWwpIC0gcExNQVhUYWJsZUwwW3N0b3JlUnVuXSk7Ci0gICAgICAgICAgICAgICAgICAgIHN0b3JlUnVuUGx1cyA9IHN0b3JlUnVuIC0gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBSTUFYVGFibGVMMFthcm1BYnMoc3RvcmVMZXZlbCkgLSAxXSArIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGZNb2RlID0gYXJtVkNNNFAyX0NoZWNrVkxDRXNjYXBlTW9kZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlUnVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVSdW5QbHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVMZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlTGV2ZWxQbHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4U3RvcmVSdW5MMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSdW5JbmRleFRhYmxlTDApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0ZpbGxWTENCdWZmZXIgKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcEJpdFN0cmVhbSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlUnVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZUxldmVsLCAKLQkJCQkJCQkJCSAgc3RvcmVSdW5QbHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZUxldmVsUGx1cywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZNb2RlLAotCQkJCQkJCQkJICBsYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSdW5JbmRleFRhYmxlTDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWbGNUYWJsZUwwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzdG9yZUxldmVsID0gbGV2ZWw7Ci0gICAgICAgICAgICAgICAgc3RvcmVSdW4gICA9IHJ1bjsKLSAgICAgICAgICAgICAgICBmaXJzdCA9IDA7Ci0gICAgICAgICAgICAgICAgcnVuID0gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IC8qIGVuZCBvZiBmb3IgbG9vcCBmb3IgNjQgZWxlbWVudHMgKi8KLQotICAgICAgICAvKiB3cml0aW5nIHRoZSBsYXN0IGVsZW1lbnQgKi8KLSAgICAgICAgbGFzdCA9IDE7Ci0gICAgICAgIAotICAgICAgICAvKiBDaGVjayBmb3IgYSB2YWxpZCBlbnRyeSBpbiB0aGUgVkxDIHRhYmxlICovCi0gICAgICAgIHN0b3JlTGV2ZWxQbHVzID0gYXJtU2lnbkNoZWNrKHN0b3JlTGV2ZWwpICogCi0gICAgICAgICAgICAgICAgICAgICAgICAoYXJtQWJzKHN0b3JlTGV2ZWwpIC0gcExNQVhUYWJsZUwxW3J1bl0pOwotICAgICAgICBzdG9yZVJ1blBsdXMgPSBzdG9yZVJ1biAtIAotICAgICAgICAgICAgICAgICAgICAgIChwUk1BWFRhYmxlTDFbYXJtQWJzKHN0b3JlTGV2ZWwpIC0gMV0gKyAxKTsKLSAgICAgICAgZk1vZGUgPSBhcm1WQ000UDJfQ2hlY2tWTENFc2NhcGVNb2RlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVSdW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZVJ1blBsdXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZUxldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVMZXZlbFBsdXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhTdG9yZVJ1bkwxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJ1bkluZGV4VGFibGVMMSk7Ci0gICAgICAgIAotICAgICAgICBhcm1WQ000UDJfRmlsbFZMQ0J1ZmZlciAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBwQml0U3RyZWFtLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcEJpdE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVSdW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlTGV2ZWwsIAotCQkJCQkJICBzdG9yZVJ1blBsdXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlTGV2ZWxQbHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBmTW9kZSwKLQkJCQkJCSAgbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBSdW5JbmRleFRhYmxlTDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBWbGNUYWJsZUwxKTsKLQlyZXR1cm4gT01YX1N0c19Ob0VycjsgICAgICAgICAgICAgICAgICAgICAgICAgIAotfQotCi0vKiBFbmQgb2YgRmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfU2V0UHJlZERpci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfU2V0UHJlZERpci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWQ0NGQ0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1NldFByZWREaXIuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX1NldFByZWREaXIuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnRhaW5zIG1vZHVsZSBmb3IgZGV0ZWN0aW5nIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbgotICoKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX1NldFByZWREaXIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGRldGVjdGluZyB0aGUgcHJlZGljdGlvbiBkaXJlY3Rpb24KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIGJsb2NrSW5kZXggIGJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uIGFzIGRlZmluZWQgaW4gc3ViY2xhdXNlIDYuMS4zLjgsIG9mIElTTy9JRUMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAxNDQ5Ni0yLiBGdXJ0aGVybW9yZSwgaW5kZXhlcyA2IHRvIDkgaW5kaWNhdGUgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEgYmxvY2tzIHNwYXRpYWxseSBjb3JyZXNwb25kaW5nIHRvIGx1bWluYW5jZQotICogICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrcyAwIHRvIDMgaW4gdGhlIHNhbWUgbWFjcm9ibG9jay4KLSAqIFtpbl0gcENvZWZCdWZSb3cgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcgotICogW2luXSBwUXBCdWYgICAgICBwb2ludGVyIHRvIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGJ1ZmZlcgotICogW291dF0gICAgcHJlZFFQICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgcHJlZGljdG9yIGJsb2NrCi0gKiBbb3V0XSAgICBwcmVkRGlyICAgICBpbmRpY2F0ZXMgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uIHdoaWNoIHRha2VzIG9uZQotICogICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgotICogICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WQ19IT1JJWk9OVEFMICAgIHByZWRpY3QgaG9yaXpvbnRhbGx5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMICAgICAgcHJlZGljdCB2ZXJ0aWNhbGx5Ci0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDJfU2V0UHJlZERpcigKLSAgICAgT01YX0lOVCBibG9ja0luZGV4LAotICAgICBPTVhfUzE2ICpwQ29lZkJ1ZlJvdywKLSAgICAgT01YX1MxNiAqcENvZWZCdWZDb2wsCi0gICAgIE9NWF9JTlQgKnByZWREaXIsCi0gICAgIE9NWF9JTlQgKnByZWRRUCwKLSAgICAgY29uc3QgT01YX1U4ICpwUXBCdWYKLSkKLXsKLSAgICBPTVhfVTggIGJsb2NrRENMZWZ0OwotICAgIE9NWF9VOCAgYmxvY2tEQ1RvcDsKLSAgICBPTVhfVTggIGJsb2NrRENUb3BMZWZ0OwotCi0gICAgaWYgKGJsb2NrSW5kZXggPT0gMykKLSAgICB7Ci0gICAgICAgIGJsb2NrRENUb3AgPSAqKHBDb2VmQnVmQ29sIC0gOCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGJsb2NrRENUb3AgPSAqcENvZWZCdWZSb3c7Ci0gICAgfQotICAgIGJsb2NrRENMZWZ0ID0gKnBDb2VmQnVmQ29sOwotICAgIGJsb2NrRENUb3BMZWZ0ID0gKihwQ29lZkJ1ZlJvdyAtIDgpOwotCi0gICAgaWYgKGFybUFicyhibG9ja0RDTGVmdCAtIGJsb2NrRENUb3BMZWZ0KSA8IGFybUFicyhibG9ja0RDVG9wTGVmdCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gYmxvY2tEQ1RvcCkpCi0gICAgewotICAgICAgICAqcHJlZERpciA9IE9NWF9WQ19WRVJUSUNBTDsKLSAgICAgICAgKnByZWRRUCA9IHBRcEJ1ZlsxXTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgKnByZWREaXIgPSBPTVhfVkNfSE9SSVpPTlRBTDsKLSAgICAgICAgKnByZWRRUCA9IHBRcEJ1ZlswXTsKLSAgICB9Ci0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLQotLypFbmQgb2YgRmlsZSovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjZmMwZWYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfWmlnemFnX1RhYmxlcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotIC8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfWmlnemFnX1RhYmxlcy5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRmlsZTogICAgICAgIGFybVZDTTRQMl9aaWdaYWdfVGFibGVzLmMKLSAqIERlc2NyaXB0aW9uOiBDb250YWlucyB0aGUgemlnemFnIHRhYmxlcwotICoKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLQotY29uc3QgT01YX1U4IGFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbiBbNjRdID0gCi17Ci0gICAgIDAsICAxLCAgOCwgMTYsICA5LCAgMiwgIDMsIDEwLAotICAgIDE3LCAyNCwgMzIsIDI1LCAxOCwgMTEsICA0LCAgNSwKLSAgICAxMiwgMTksIDI2LCAzMywgNDAsIDQ4LCA0MSwgMzQsCi0gICAgMjcsIDIwLCAxMywgIDYsICA3LCAxNCwgMjEsIDI4LCAKLSAgICAzNSwgNDIsIDQ5LCA1NiwgNTcsIDUwLCA0MywgMzYsCi0gICAgMjksIDIyLCAxNSwgMjMsIDMwLCAzNywgNDQsIDUxLAotICAgIDU4LCA1OSwgNTIsIDQ1LCAzOCwgMzEsIDM5LCA0NiwKLSAgICA1MywgNjAsIDYxLCA1NCwgNDcsIDU1LCA2MiwgNjMKLX07Ci0KLWNvbnN0IE9NWF9VOCBhcm1WQ000UDJfYUhvcml6b250YWxaaWd6YWdTY2FuIFs2NF0gPSAKLXsKLSAgICAgMCwgIDEsICAyLCAgMywgIDgsICA5LCAxNiwgMTcsCi0gICAgMTAsIDExLCAgNCwgIDUsICA2LCAgNywgMTUsIDE0LAotICAgIDEzLCAxMiwgMTksIDE4LCAyNCwgMjUsIDMyLCAzMywKLSAgICAyNiwgMjcsIDIwLCAyMSwgMjIsIDIzLCAyOCwgMjksCi0gICAgMzAsIDMxLCAzNCwgMzUsIDQwLCA0MSwgNDgsIDQ5LAotICAgIDQyLCA0MywgMzYsIDM3LCAzOCwgMzksIDQ0LCA0NSwgCi0gICAgNDYsIDQ3LCA1MCwgNTEsIDU2LCA1NywgNTgsIDU5LAotICAgIDUyLCA1MywgNTQsIDU1LCA2MCwgNjEsIDYyLCA2MwotfTsKLQotY29uc3QgT01YX1U4IGFybVZDTTRQMl9hVmVydGljYWxaaWd6YWdTY2FuIFs2NF0gPSAKLXsKLSAgICAgMCwgIDgsIDE2LCAyNCwgIDEsICA5LCAgMiwgMTAsCi0gICAgIDE3LCAyNSwgMzIsIDQwLCA0OCwgNTYsIDU3LCA0OSwKLSAgICAgNDEsIDMzLCAyNiwgMTgsICAzLCAxMSwgIDQsIDEyLAotICAgICAxOSwgMjcsIDM0LCA0MiwgNTAsIDU4LCAzNSwgNDMsCi0gICAgIDUxLCA1OSwgMjAsIDI4LCAgNSwgMTMsICA2LCAxNCwKLSAgICAgMjEsIDI5LCAzNiwgNDQsIDUyLCA2MCwgMzcsIDQ1LCAKLSAgICAgNTMsIDYxLCAyMiwgMzAsICA3LCAxNSwgMjMsIDMxLAotICAgICAzOCwgNDYsIDU0LCA2MiwgMzksIDQ3LCA1NSwgNjMKLX07Ci0KLQotLyogRW5kIG9mIGZpbGUgKi8KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfMTZ4MTYuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl8xNngxNi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjNjNTMzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl8xNngxNi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2LmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBDb250YWlucyBtb2R1bGVzIGZvciBCbG9jayBtYXRjaGluZywgYSBmdWxsIHNlYXJjaCBhbGdvcml0aG0KLSAqIGlzIGltcGxlbWVudGVkCi0gKgotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfMTZ4MTYgICAoNi4yLjQuMi4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgYSAxNngxNiBibG9jayBtYXRjaCB3aXRoIGhhbGYtcGl4ZWwgcmVzb2x1dGlvbi4gIFJldHVybnMgdGhlIAotICogZXN0aW1hdGVkIG1vdGlvbiB2ZWN0b3IgYW5kIGFzc29jaWF0ZWQgbWluaW11bSBTQUQuICBUaGlzIGZ1bmN0aW9uIAotICogZXN0aW1hdGVzIHRoZSBoYWxmLXBpeGVsIG1vdGlvbiB2ZWN0b3IgYnkgaW50ZXJwb2xhdGluZyB0aGUgaW50ZWdlciAKLSAqIHJlc29sdXRpb24gbW90aW9uIHZlY3RvciByZWZlcmVuY2VkIGJ5IHRoZSBpbnB1dCBwYXJhbWV0ZXIgcFNyY0RzdE1WLCBpLmUuLCAKLSAqIHRoZSBpbml0aWFsIGludGVnZXIgTVYgaXMgZ2VuZXJhdGVkIGV4dGVybmFsbHkuICBUaGUgaW5wdXQgcGFyYW1ldGVycyAKLSAqIHBTcmNSZWZCdWYgYW5kIHBTZWFyY2hQb2ludFJlZlBvcyBzaG91bGQgYmUgc2hpZnRlZCBieSB0aGUgd2lubmluZyBNViBvZiAKLSAqIDE2eDE2IGludGVnZXIgc2VhcmNoIHByaW9yIHRvIGNhbGxpbmcgQmxvY2tNYXRjaF9IYWxmXzE2eDE2LiBUaGUgZnVuY3Rpb24gCi0gKiBCbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYgbWF5IGJlIHVzZWQgZm9yIGludGVnZXIgbW90aW9uIGVzdGltYXRpb24uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNSZWZCdWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgCi0gKiAgICAgICAgICAgIG1hY3JvYmxvY2sgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgCi0gKiAgICAgICAgICAgIG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUuIAotICogICByZWZXaWR0aCAtIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUgCi0gKiAgIHBSZWZSZWN0IC0gcmVmZXJlbmNlIHBsYW5lIHZhbGlkIHJlZ2lvbiByZWN0YW5nbGUgCi0gKiAgIHBTcmNDdXJyQnVmIC0gcG9pbnRlciB0byB0aGUgY3VycmVudCBibG9jayBpbiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIAotICogICAgICAgICAgICBidWZmZXIgZXh0cmFjdGVkIGZyb20gdGhlIG9yaWdpbmFsIHBsYW5lIChsaW5lYXIgYXJyYXksIDI1NiAKLSAqICAgICAgICAgICAgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuICBUaGUgbnVtYmVyIG9mIAotICogICAgICAgICAgICBieXRlcyBiZXR3ZWVuIGxpbmVzIChzdGVwKSBpcyAxNi4gCi0gKiAgIHBTZWFyY2hQb2ludFJlZlBvcyAtIHBvc2l0aW9uIG9mIHRoZSBzdGFydGluZyBwb2ludCBmb3IgaGFsZiBwaXhlbCAKLSAqICAgICAgICAgICAgc2VhcmNoIChzcGVjaWZpZWQgaW4gdGVybXMgb2YgaW50ZWdlciBwaXhlbCB1bml0cykgaW4gdGhlIAotICogICAgICAgICAgICByZWZlcmVuY2UgcGxhbmUsIGkuZS4sIHRoZSByZWZlcmVuY2UgcG9zaXRpb24gcG9pbnRlZCB0byBieSB0aGUgCi0gKiAgICAgICAgICAgIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yLiAKLSAqICAgcm5kVmFsIC0gcm91bmRpbmcgY29udHJvbCBwYXJhbWV0ZXI6IDAgLSBkaXNhYmxlZDsgMSAtIGVuYWJsZWQuIAotICogICBwU3JjRHN0TVYgLSBwb2ludGVyIHRvIHRoZSBpbml0aWFsIE1WIGVzdGltYXRlOyB0eXBpY2FsbHkgZ2VuZXJhdGVkIAotICogICAgICAgICAgICBkdXJpbmcgYSBwcmlvciAxNlgxNiBpbnRlZ2VyIHNlYXJjaDsgc3BlY2lmaWVkIGluIHRlcm1zIG9mIAotICogICAgICAgICAgICBoYWxmLXBpeGVsIHVuaXRzLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdE1WIC0gcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYgCi0gKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIG1pbmltdW0gU0FEIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY1JlZkJ1ZiwgCi0gKiAgICAgICAgIHBSZWZSZWN0LCBwU3JjQ3VyckJ1ZmYsIHBTZWFyY2hQb2ludFJlZlBvcywgcFNyY0RzdE1WLgotICogICAgLSAgICBwU3JjQ3VyckJ1ZiBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLCBvciAKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfMTZ4MTYoCi0gICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKLSAgICAgT01YX0lOVCByZWZXaWR0aCwKLSAgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCi0gICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCi0gICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBTZWFyY2hQb2ludFJlZlBvcywKLSAgICAgT01YX0lOVCBybmRWYWwsCi0gICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjRHN0TVYsCi0gICAgIE9NWF9JTlQgKnBEc3RTQUQKLSkKLXsKLQotICAgIC8qIEZvciBhIGJsb2Nrc2l6ZSBvZiAxNngxNiAqLwotICAgIE9NWF9VOCBCbG9ja1NpemUgPSAxNjsKLSAgICAKLSAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8gIAotICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWZCdWYgICAgICAgICA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFJlZlJlY3QgICAgICAgICAgID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjQ3VyckJ1ZiAgICAgICAgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBTZWFyY2hQb2ludFJlZlBvcyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdE1WICAgICAgICAgID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZighYXJtSXMxNkJ5dGVBbGlnbmVkKHBTcmNDdXJyQnVmKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgCi0gICAgcmV0dXJuIChhcm1WQ000UDJfQmxvY2tNYXRjaF9IYWxmKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjUmVmQnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlZlJlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcmNDdXJyQnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2VhcmNoUG9pbnRSZWZQb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJuZFZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNyY0RzdE1WLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRHN0U0FELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbG9ja1NpemUpKTsKLQotCi19Ci0KLS8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfOHg4LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfOHg4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzZGE3OWYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OC5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb250YWlucyBtb2R1bGVzIGZvciBCbG9jayBtYXRjaGluZywgYSBmdWxsIHNlYXJjaCBhbGdvcml0aG0KLSAqIGlzIGltcGxlbWVudGVkCi0gKiAKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfOHg4ICAgKDYuMi40LjIuNCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGFuIDh4OCBibG9jayBtYXRjaCB3aXRoIGhhbGYtcGl4ZWwgcmVzb2x1dGlvbi4gUmV0dXJucyB0aGUgCi0gKiBlc3RpbWF0ZWQgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCBtaW5pbXVtIFNBRC4gIFRoaXMgZnVuY3Rpb24gCi0gKiBlc3RpbWF0ZXMgdGhlIGhhbGYtcGl4ZWwgbW90aW9uIHZlY3RvciBieSBpbnRlcnBvbGF0aW5nIHRoZSBpbnRlZ2VyIAotICogcmVzb2x1dGlvbiBtb3Rpb24gdmVjdG9yIHJlZmVyZW5jZWQgYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0TVYsIGkuZS4sIAotICogdGhlIGluaXRpYWwgaW50ZWdlciBNViBpcyBnZW5lcmF0ZWQgZXh0ZXJuYWxseS4gIFRoZSBpbnB1dCBwYXJhbWV0ZXJzIAotICogcFNyY1JlZkJ1ZiBhbmQgcFNlYXJjaFBvaW50UmVmUG9zIHNob3VsZCBiZSBzaGlmdGVkIGJ5IHRoZSB3aW5uaW5nIE1WIG9mIAotICogOHg4IGludGVnZXIgc2VhcmNoIHByaW9yIHRvIGNhbGxpbmcgQmxvY2tNYXRjaF9IYWxmXzh4OC4gVGhlIGZ1bmN0aW9uIAotICogQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCBtYXkgYmUgdXNlZCBmb3IgaW50ZWdlciBtb3Rpb24gZXN0aW1hdGlvbi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY1JlZkJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSAKLSAqICAgICAgICAgICAgYmxvY2sgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgOHg4IGJsb2NrIAotICogICAgICAgICAgICBpbiB0aGUgY3VycmVudCBwbGFuZS4gCi0gKiAgIHJlZldpZHRoIC0gd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZSAKLSAqICAgcFJlZlJlY3QgLSByZWZlcmVuY2UgcGxhbmUgdmFsaWQgcmVnaW9uIHJlY3RhbmdsZSAKLSAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCi0gKiAgICAgICAgICAgIGJ1ZmZlciBleHRyYWN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgMTI4IAotICogICAgICAgICAgICBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5LiAgVGhlIG51bWJlciBvZiAKLSAqICAgICAgICAgICAgYnl0ZXMgYmV0d2VlbiBsaW5lcyAoc3RlcCkgaXMgMTYuIAotICogICBwU2VhcmNoUG9pbnRSZWZQb3MgLSBwb3NpdGlvbiBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIGhhbGYgcGl4ZWwgCi0gKiAgICAgICAgICAgIHNlYXJjaCAoc3BlY2lmaWVkIGluIHRlcm1zIG9mIGludGVnZXIgcGl4ZWwgdW5pdHMpIGluIHRoZSAKLSAqICAgICAgICAgICAgcmVmZXJlbmNlIHBsYW5lLiAKLSAqICAgcm5kVmFsIC0gcm91bmRpbmcgY29udHJvbCBwYXJhbWV0ZXI6IDAgLSBkaXNhYmxlZDsgMSAtIGVuYWJsZWQuIAotICogICBwU3JjRHN0TVYgLSBwb2ludGVyIHRvIHRoZSBpbml0aWFsIE1WIGVzdGltYXRlOyB0eXBpY2FsbHkgZ2VuZXJhdGVkIAotICogICAgICAgICAgICBkdXJpbmcgYSBwcmlvciA4eDggaW50ZWdlciBzZWFyY2gsIHNwZWNpZmllZCBpbiB0ZXJtcyBvZiAKLSAqICAgICAgICAgICAgaGFsZi1waXhlbCB1bml0cy4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3RNViAtIHBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WIAotICogICBwRHN0U0FEIC0gcG9pbnRlciB0byBtaW5pbXVtIFNBRCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwU3JjUmVmQnVmLCBwUmVmUmVjdCwgcFNyY0N1cnJCdWZmLCBwU2VhcmNoUG9pbnRSZWZQb3MsIHBTcmNEc3RNVgotICogICAgLSAgICBwU3JjQ3VyckJ1ZiBpcyBub3QgOC1ieXRlIGFsaWduZWQgCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OCgKLSAgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAotICAgICBPTVhfSU5UIHJlZldpZHRoLAotICAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKLSAgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKLSAgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcFNlYXJjaFBvaW50UmVmUG9zLAotICAgICBPTVhfSU5UIHJuZFZhbCwKLSAgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNEc3RNViwKLSAgICAgT01YX0lOVCAqcERzdFNBRAotKQotewotICAgIC8qIEZvciBhIGJsb2Nrc2l6ZSBvZiA4eDggKi8KLSAgICBPTVhfVTggQmxvY2tTaXplID0gODsKLSAgICAKLSAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8gIAotICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWZCdWYgICAgICAgICA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFJlZlJlY3QgICAgICAgICAgID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjQ3VyckJ1ZiAgICAgICAgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBTZWFyY2hQb2ludFJlZlBvcyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdE1WICAgICAgICAgID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZighYXJtSXM4Qnl0ZUFsaWduZWQocFNyY0N1cnJCdWYpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAKLSAgICByZXR1cm4gKGFybVZDTTRQMl9CbG9ja01hdGNoX0hhbGYoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcmNSZWZCdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZldpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVmUmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNyY0N1cnJCdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZWFyY2hQb2ludFJlZlBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm5kVmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjRHN0TVYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEc3RTQUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsb2NrU2l6ZSkpOwotCi19Ci0KLS8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjI0MDE2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2LmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIEJsb2NrIG1hdGNoaW5nLCBhIGZ1bGwgc2VhcmNoIGFsZ29yaXRobQotICogaXMgaW1wbGVtZW50ZWQKLSAqIAotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2ICAgKDYuMi40LjIuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGEgMTZ4MTYgYmxvY2sgc2VhcmNoOyBlc3RpbWF0ZXMgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCAKLSAqIG1pbmltdW0gU0FELiBCb3RoIHRoZSBpbnB1dCBhbmQgb3V0cHV0IG1vdGlvbiB2ZWN0b3JzIGFyZSByZXByZXNlbnRlZCB1c2luZyAKLSAqIGhhbGYtcGl4ZWwgdW5pdHMsIGFuZCB0aGVyZWZvcmUgYSBzaGlmdCBsZWZ0IG9yIHJpZ2h0IGJ5IDEgYml0IG1heSBiZSAKLSAqIHJlcXVpcmVkLCByZXNwZWN0aXZlbHksIHRvIG1hdGNoIHRoZSBpbnB1dCBvciBvdXRwdXQgTVZzIHdpdGggb3RoZXIgCi0gKiBmdW5jdGlvbnMgdGhhdCBlaXRoZXIgZ2VuZXJhdGUgb3V0cHV0IE1WcyBvciBleHBlY3QgaW5wdXQgTVZzIHJlcHJlc2VudGVkIAotICogdXNpbmcgaW50ZWdlciBwaXhlbCB1bml0cy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY1JlZkJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSAKLSAqICAgICAgICAgICAgTUIgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiAKLSAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgcGxhbmUuIAotICogICByZWZXaWR0aCAtIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUgCi0gKiAgIHBSZWZSZWN0IC0gcG9pbnRlciB0byB0aGUgdmFsaWQgcmVmZXJlbmNlIHBsYW5lIHJlY3RhbmdsZTsgY29vcmRpbmF0ZXMgCi0gKiAgICAgICAgICAgIGFyZSBzcGVjaWZpZWQgcmVsYXRpdmUgdG8gdGhlIGltYWdlIG9yaWdpbi4gIFJlY3RhbmdsZSAKLSAqICAgICAgICAgICAgYm91bmRhcmllcyBtYXkgZXh0ZW5kIGJleW9uZCBpbWFnZSBib3VuZGFyaWVzIGlmIHRoZSBpbWFnZSBoYXMgCi0gKiAgICAgICAgICAgIGJlZW4gcGFkZGVkLiAgRm9yIGV4YW1wbGUsIGlmIHBhZGRpbmcgZXh0ZW5kcyA0IHBpeGVscyBiZXlvbmQgCi0gKiAgICAgICAgICAgIGZyYW1lIGJvcmRlciwgdGhlbiB0aGUgdmFsdWUgZm9yIHRoZSBsZWZ0IGJvcmRlciBjb3VsZCBiZSBzZXQgdG8gCi0gKiAgICAgICAgICAgIC00LiAKLSAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCi0gKiAgICAgICAgICAgIGJ1ZmZlciBleHRyYWN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgMjU2IAotICogICAgICAgICAgICBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIFRoZSBudW1iZXIgb2YgCi0gKiAgICAgICAgICAgIGJ5dGVzIGJldHdlZW4gbGluZXMgKHN0ZXApIGlzIDE2LiAKLSAqICAgcEN1cnJQb2ludFBvcyAtIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUgCi0gKiAgIHBTcmNQcmVNViAtIHBvaW50ZXIgdG8gcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3I7IE5VTEwgaW5kaWNhdGVzIG5vIAotICogICAgICAgICAgICBwcmVkaWN0ZWQgTVYgCi0gKiAgIHBTcmNQcmVTQUQgLSBwb2ludGVyIHRvIFNBRCBhc3NvY2lhdGVkIHdpdGggdGhlIHByZWRpY3RlZCBNViAocmVmZXJlbmNlZCAKLSAqICAgICAgICAgICAgYnkgcFNyY1ByZU1WKTsgbWF5IGJlIHNldCB0byBOVUxMIGlmIHVuYXZhaWxhYmxlLiAKLSAqICAgcE1FU3BlYyAtIHZlbmRvci1zcGVjaWZpYyBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZTsgCi0gKiAgICAgICAgICAgIG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCBhbmQgdGhlbiBpbml0aWFsaXplZCB1c2luZyAKLSAqICAgICAgICAgICAgb214VkNNNFAyX01FSW5pdCBwcmlvciB0byBjYWxsaW5nIHRoZSBibG9jayBtYXRjaGluZyBmdW5jdGlvbi4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RNViAtIHBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WIAotICogICBwRHN0U0FEIC0gcG9pbnRlciB0byBtaW5pbXVtIFNBRCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNSZWZCdWYsIAotICogICAgICAgICAgICAgIHBSZWZSZWN0LCBwU3JjQ3VyckJ1ZmYsIHBDdXJyUG9pbnRQb3MsIHBEc3RNViwgcERzdFNBRCBvciAKLSAqICAgICAgICAgICAgICBwTUVTcGVjLCBvciAKLSAqICAgIC0gICAgcFNyY0N1cnJCdWYgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCAKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYoCi0gICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKLSAgICAgT01YX0lOVCByZWZXaWR0aCwKLSAgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCi0gICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCi0gICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCi0gICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjUHJlTVYsCi0gICAgIGNvbnN0IE9NWF9JTlQgKnBTcmNQcmVTQUQsCi0gICAgIHZvaWQgKnBNRVNwZWMsCi0gICAgIE9NWFZDTW90aW9uVmVjdG9yICpwRHN0TVYsCi0gICAgIE9NWF9JTlQgKnBEc3RTQUQKLSkKLXsKLQotICAgT01YX1U4IEJsb2NrU2l6ZSA9IDE2OwotICAgCi0gICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8gIAotICAgYXJtUmV0QXJnRXJySWYoIWFybUlzMTZCeXRlQWxpZ25lZChwU3JjQ3VyckJ1ZiksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgIAotICAgcmV0dXJuICggYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcigKLSAgICAgcFNyY1JlZkJ1ZiwKLSAgICAgcmVmV2lkdGgsCi0gICAgIHBSZWZSZWN0LAotICAgICBwU3JjQ3VyckJ1ZiwKLSAgICAgcEN1cnJQb2ludFBvcywKLSAgICAgcFNyY1ByZU1WLAotICAgICBwU3JjUHJlU0FELAotICAgICBwTUVTcGVjLAotICAgICBwRHN0TVYsCi0gICAgIHBEc3RTQUQsCi0gICAgIEJsb2NrU2l6ZSkKLSAgICAgKTsKLQotCi19Ci0KLS8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfOHg4LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfOHg4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczYTk5YmQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OC5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb250YWlucyBtb2R1bGVzIGZvciBCbG9jayBtYXRjaGluZywgYSBmdWxsIHNlYXJjaCBhbGdvcml0aG0KLSAqIGlzIGltcGxlbWVudGVkCi0gKiAKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCAgICg2LjIuNC4yLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBhbiA4eDggYmxvY2sgc2VhcmNoOyBlc3RpbWF0ZXMgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCAKLSAqIG1pbmltdW0gU0FELiAgQm90aCB0aGUgaW5wdXQgYW5kIG91dHB1dCBtb3Rpb24gdmVjdG9ycyBhcmUgcmVwcmVzZW50ZWQgCi0gKiB1c2luZyBoYWxmLXBpeGVsIHVuaXRzLCBhbmQgdGhlcmVmb3JlIGEgc2hpZnQgbGVmdCBvciByaWdodCBieSAxIGJpdCBtYXkgYmUgCi0gKiByZXF1aXJlZCwgcmVzcGVjdGl2ZWx5LCB0byBtYXRjaCB0aGUgaW5wdXQgb3Igb3V0cHV0IE1WcyB3aXRoIG90aGVyIAotICogZnVuY3Rpb25zIHRoYXQgZWl0aGVyIGdlbmVyYXRlIG91dHB1dCBNVnMgb3IgZXhwZWN0IGlucHV0IE1WcyByZXByZXNlbnRlZCAKLSAqIHVzaW5nIGludGVnZXIgcGl4ZWwgdW5pdHMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNSZWZCdWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgCi0gKiAgICAgICAgICAgIGJsb2NrIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IDh4OCBibG9jayAKLSAqICAgICAgICAgICAgaW4gdGhlIGN1cnJlbnQgcGxhbmUuIAotICogICByZWZXaWR0aCAtIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUgCi0gKiAgIHBSZWZSZWN0IC0gcG9pbnRlciB0byB0aGUgdmFsaWQgcmVmZXJlbmNlIHBsYW5lIHJlY3RhbmdsZTsgY29vcmRpbmF0ZXMgCi0gKiAgICAgICAgICAgIGFyZSBzcGVjaWZpZWQgcmVsYXRpdmUgdG8gdGhlIGltYWdlIG9yaWdpbi4gIFJlY3RhbmdsZSAKLSAqICAgICAgICAgICAgYm91bmRhcmllcyBtYXkgZXh0ZW5kIGJleW9uZCBpbWFnZSBib3VuZGFyaWVzIGlmIHRoZSBpbWFnZSBoYXMgCi0gKiAgICAgICAgICAgIGJlZW4gcGFkZGVkLiAKLSAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCi0gKiAgICAgICAgICAgIGJ1ZmZlciBleHRyYWN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgMTI4IAotICogICAgICAgICAgICBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gIFRoZSBudW1iZXIgb2YgCi0gKiAgICAgICAgICAgIGJ5dGVzIGJldHdlZW4gbGluZXMgKHN0ZXApIGlzIDE2IGJ5dGVzLiAKLSAqICAgcEN1cnJQb2ludFBvcyAtIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lIAotICogICBwU3JjUHJlTVYgLSBwb2ludGVyIHRvIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yOyBOVUxMIGluZGljYXRlcyBubyAKLSAqICAgICAgICAgICAgcHJlZGljdGVkIE1WIAotICogICBwU3JjUHJlU0FEIC0gcG9pbnRlciB0byBTQUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmVkaWN0ZWQgTVYgKHJlZmVyZW5jZWQgCi0gKiAgICAgICAgICAgIGJ5IHBTcmNQcmVNVik7IG1heSBiZSBzZXQgdG8gTlVMTCBpZiB1bmF2YWlsYWJsZS4gCi0gKiAgIHBNRVNwZWMgLSB2ZW5kb3Itc3BlY2lmaWMgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmU7IAotICogICAgICAgICAgICBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgYW5kIHRoZW4gaW5pdGlhbGl6ZWQgdXNpbmcgCi0gKiAgICAgICAgICAgIG9teFZDTTRQMl9NRUluaXQgcHJpb3IgdG8gY2FsbGluZyB0aGUgYmxvY2sgbWF0Y2hpbmcgZnVuY3Rpb24uIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0TVYgLSBwb2ludGVyIHRvIGVzdGltYXRlZCBNViAKLSAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gbWluaW11bSBTQUQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjUmVmQnVmLCAKLSAqICAgICAgICAgICAgICBwUmVmUmVjdCwgcFNyY0N1cnJCdWZmLCBwQ3VyclBvaW50UG9zLCBwRHN0TVYsIHBEc3RTQUQgb3IgCi0gKiAgICAgICAgICAgICAgcE1FU3BlYywgb3IgCi0gKiAgICAtICAgIHBTcmNDdXJyQnVmIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZCAKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfOHg4KAotICAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCi0gICAgIE9NWF9JTlQgcmVmV2lkdGgsCi0gICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAotICAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAotICAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAotICAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY1ByZU1WLAotICAgICBjb25zdCBPTVhfSU5UICpwU3JjUHJlU0FELAotICAgICB2b2lkICpwTUVTcGVjLAotICAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WLAotICAgICBPTVhfSU5UICpwRHN0U0FECi0pCi17Ci0gICBPTVhfVTggQmxvY2tTaXplID0gODsKLSAgIAotICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovICAKLSAgIGFybVJldEFyZ0VycklmKCFhcm1JczhCeXRlQWxpZ25lZChwU3JjQ3VyckJ1ZiksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgIAotICAgcmV0dXJuICggYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcigKLSAgICAgcFNyY1JlZkJ1ZiwKLSAgICAgcmVmV2lkdGgsCi0gICAgIHBSZWZSZWN0LAotICAgICBwU3JjQ3VyckJ1ZiwKLSAgICAgcEN1cnJQb2ludFBvcywKLSAgICAgcFNyY1ByZU1WLAotICAgICBwU3JjUHJlU0FELAotICAgICBwTUVTcGVjLAotICAgICBwRHN0TVYsCi0gICAgIHBEc3RTQUQsCi0gICAgIEJsb2NrU2l6ZSkKLSAgICAgKTsKLQotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRENUOHg4YmxrLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9EQ1Q4eDhibGsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzczZTI0YS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9EQ1Q4eDhibGsuYworKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RDVDh4OGJsay5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb250YWlucyBtb2R1bGVzIGZvciA4eDggYmxvY2sgRENUCi0gKiAKLSAqLwotIAotI2luY2x1ZGUgPG1hdGguaD4KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDTTRQMl9EQ1RfVGFibGUuaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EQ1Q4eDhibGsgICAoNi4yLjQuNC4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29tcHV0ZXMgYSAyRCBmb3J3YXJkIERDVCBmb3IgYSBzaW5nbGUgOHg4IGJsb2NrLCBhcyBkZWZpbmVkIGluIAotICogW0lTTzE0NDk2LTJdLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmVhcmx5IGFycmFuZ2VkIGlucHV0IGJ1ZmZlcjsgbXVzdCAKLSAqICAgICAgICAgICAgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuICBJbnB1dCB2YWx1ZXMgKHBpeGVsIAotICogICAgICAgICAgICBpbnRlbnNpdGllcykgYXJlIHZhbGlkIGluIHRoZSByYW5nZSBbLTI1NSwyNTVdLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lYXJseSBhcnJhbmdlZCBvdXRwdXQgYnVmZmVyOyBtdXN0IAotICogICAgICAgICAgICBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMsIHJldHVybmVkIGlmOgotICogICAgLSAgICBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCi0gKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMl9EQ1Q4eDhibGsgKGNvbnN0IE9NWF9TMTYgKnBTcmMsIE9NWF9TMTYgKnBEc3QpCi17Ci0gICAgT01YX0lOVCB4LCB5LCB1LCB2OwotICAgIAotICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLwotICAgIGFybVJldEFyZ0VycklmKHBTcmMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCFhcm1JczE2Qnl0ZUFsaWduZWQocFNyYyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZighYXJtSXMxNkJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0KLQotICAgIGZvciAodSA9IDA7IHUgPCA4OyB1KyspCi0gICAgewotICAgICAgICBmb3IgKHYgPSAwOyB2IDwgODsgdisrKQotICAgICAgICB7Ci0gICAgICAgICAgICBPTVhfRjY0IHN1bSA9IDAuMDsKLSAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCA4OyB4KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IDg7IHkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN1bSArPSBwU3JjWyh4ICogOCkgKyB5XSAqCi0gICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9wcmVDYWxjRENUQ29zW3hdW3VdICoKLSAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX3ByZUNhbGNEQ1RDb3NbeV1bdl07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcERzdFsodSAqIDgpICsgdl09IGFybVJvdW5kRmxvYXRUb1MxNiAoc3VtKTsgICAgICAgICAgICAKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0KLQotLyogRW5kIG9mIGZpbGUgKi8KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzlhN2Y2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBEZXNjcmlwdGlvbjogCi0gKiBDb250YWlucyBtb2R1bGVzIGZvciBpbnRlciByZWNvbnN0cnVjdGlvbgotICogCi0gKi8KLSAKLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlciAgICg2LjIuNS40LjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBEZWNvZGVzIHRoZSBJTlRFUiBibG9jayBjb2VmZmljaWVudHMuIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW52ZXJzZSAKLSAqIHF1YW50aXphdGlvbiwgaW52ZXJzZSB6aWd6YWcgcG9zaXRpb25pbmcsIGFuZCBJRENUICh3aXRoIGFwcHJvcHJpYXRlIAotICogY2xpcHBpbmcgb24gZWFjaCBzdGVwKSBvbiB0aGUgY29lZmZpY2llbnRzLiBUaGUgcmVzdWx0cyAocmVzaWR1YWxzKSBhcmUgCi0gKiBwbGFjZWQgaW4gYSBjb250aWd1b3VzIGFycmF5IG9mIDY0IGVsZW1lbnRzLiBGb3IgSU5URVIgYmxvY2ssIHRoZSBvdXRwdXQgCi0gKiBidWZmZXIgaG9sZHMgdGhlIHJlc2lkdWFscyBmb3IgZnVydGhlciByZWNvbnN0cnVjdGlvbi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCAKLSAqICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4gVGhlcmUgaXMgbm8gYm91bmRhcnkgY2hlY2sgZm9yIHRoZSBiaXQgc3RyZWFtIAotICogICAgICAgICAgICBidWZmZXIuIAotICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgdG8gYnkgCi0gKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluIFswLTddIAotICogICBRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAotICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgCi0gKiAgICAgICAgICAgIG1vZGUsIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCwgc28gCi0gKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCi0gKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgZGVjb2RlZCByZXNpZHVhbCBidWZmZXIgKGEgY29udGlndW91cyBhcnJheSBvZiA2NCAKLSAqICAgICAgICAgICAgZWxlbWVudHMgb2YgT01YX1MxNiBkYXRhIHR5cGUpOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMsIGlmOgotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOdWxsOiAKLSAqICAgICAgICAgcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCAsIHBEc3QgCi0gKiAgICAtICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10KLSAqICAgIC0gICAgUVAgPD0gMC4gCi0gKiAgICAtICAgIHBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCAKLSAqICAgIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yLiBSZWZlciB0byBPTVhfU3RzX0VyciBvZiBEZWNvZGVWTENaaWd6YWdfSW50ZXIgLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyKAotICAgICBjb25zdCBPTVhfVTggKiogcHBCaXRTdHJlYW0sCi0gICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAotICAgICBPTVhfUzE2ICogcERzdCwKLSAgICAgT01YX0lOVCBRUCwKLSAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0pCi17Ci0gICAgLyogNjQgZWxlbWVudHMgYXJlIG5lZWRlZCBidXQgdG8gYWxpZ24gaXQgdG8gMTYgYnl0ZXMgbmVlZAotICAgIDE1IG1vcmUgZWxlbWVudHMgb2YgcGFkZGluZyAqLwotICAgIE9NWF9TMTYgdGVtcEJ1Zls3OV07Ci0gICAgT01YX1MxNiAqcFRlbXBCdWYxOwotICAgIE9NWFJlc3VsdCBlcnJvckNvZGU7Ci0gICAgLyogQWxpZ25pbmcgdGhlIGxvY2FsIGJ1ZmZlcnMgKi8KLSAgICBwVGVtcEJ1ZjEgPSBhcm1BbGlnblRvMTZCeXRlcyh0ZW1wQnVmKTsKLSAgICAKLSAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwcEJpdFN0cmVhbSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKnBwQml0U3RyZWFtID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwQml0T2Zmc2V0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZighYXJtSXMxNkJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKChRUCA8PSAwKSB8fCAoUVAgPj0gMzIpKSwgT01YX1N0c19CYWRBcmdFcnIpOwotCWFybVJldEFyZ0VycklmKCgoKnBCaXRPZmZzZXQgPCAwKSB8fCAoKnBCaXRPZmZzZXQgPiA3KSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQotCi0gICAgLyogVkxEIGFuZCB6aWd6YWcgKi8KLSAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcEJ1ZjEsc2hvcnRWaWRlb0hlYWRlcik7Ci0gICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7Ci0gICAgCi0gICAgLyogRGVxdWFudGl6YXRpb24gKi8KLSAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JKAotICAgICBwVGVtcEJ1ZjEsCi0gICAgIFFQKTsKLSAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKLSAgICAKLSAgICAvKiBJbnZlcnNlIHRyYW5zZm9ybSAqLwotICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9JRENUOHg4YmxrKHBUZW1wQnVmMSwgcERzdCk7Ci0gICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7Ci0gICAgCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qIEVuZCBvZiBmaWxlICovCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTcwZGE2Yy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEuYworKysgL2Rldi9udWxsCkBAIC0xLDI0MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRGVzY3JpcHRpb246IAotICogQ29udGFpbnMgbW9kdWxlcyBmb3IgaW50cmEgcmVjb25zdHJ1Y3Rpb24KLSAqIAotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEgICAoNi4yLjUuNC4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogRGVjb2RlcyB0aGUgSU5UUkEgYmxvY2sgY29lZmZpY2llbnRzLiBJbnZlcnNlIHF1YW50aXphdGlvbiwgaW52ZXJzZWx5IAotICogemlnemFnIHBvc2l0aW9uaW5nLCBhbmQgSURDVCwgd2l0aCBhcHByb3ByaWF0ZSBjbGlwcGluZyBvbiBlYWNoIHN0ZXAsIGFyZSAKLSAqIHBlcmZvcm1lZCBvbiB0aGUgY29lZmZpY2llbnRzLiBUaGUgcmVzdWx0cyBhcmUgdGhlbiBwbGFjZWQgaW4gdGhlIG91dHB1dCAKLSAqIGZyYW1lL3BsYW5lIG9uIGEgcGl4ZWwgYmFzaXMuICBOb3RlOiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgdXNlZCBvbmx5IHdoZW4gCi0gKiBhdCBsZWFzdCBvbmUgbm9uLXplcm8gQUMgY29lZmZpY2llbnQgb2YgY3VycmVudCBibG9jayBleGlzdHMgaW4gdGhlIGJpdCAKLSAqIHN0cmVhbS4gVGhlIERDIG9ubHkgY29uZGl0aW9uIHdpbGwgYmUgaGFuZGxlZCBpbiBhbm90aGVyIGZ1bmN0aW9uLiAKLSAqCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCAKLSAqICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4gVGhlcmUgaXMgbm8gYm91bmRhcnkgY2hlY2sgZm9yIHRoZSBiaXQgc3RyZWFtIAotICogICAgICAgICAgICBidWZmZXIuIAotICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgdG8gYnkgCi0gKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluIFswLTddLiAKLSAqICAgc3RlcCAtIHdpZHRoIG9mIHRoZSBkZXN0aW5hdGlvbiBwbGFuZSAKLSAqICAgcENvZWZCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgb24gCi0gKiAgICAgICAgICAgIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBDb2VmQnVmQ29sIC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIAotICogICAgICAgICAgICBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICBjdXJRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIG1hY3JvYmxvY2sgd2hpY2ggdGhlIGN1cnJlbnQgYmxvY2sgCi0gKiAgICAgICAgICAgIGJlbG9uZ3MgdG8gCi0gKiAgIHBRUEJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYnVmZmVyIAotICogICBibG9ja0luZGV4IC0gYmxvY2sgaW5kZXggaW5kaWNhdGluZyB0aGUgY29tcG9uZW50IHR5cGUgYW5kIHBvc2l0aW9uIGFzIAotICogICAgICAgICAgICBkZWZpbmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDYuMS4zLjgsIEZpZ3VyZSA2LTUuIAotICogICBpbnRyYURDVkxDIC0gYSBjb2RlIGRldGVybWluZWQgYnkgaW50cmFfZGNfdmxjX3RociBhbmQgUVAuIFRoaXMgYWxsb3dzIGEgCi0gKiAgICAgICAgICAgIG1lY2hhbmlzbSB0byBzd2l0Y2ggYmV0d2VlbiB0d28gVkxDIGZvciBjb2Rpbmcgb2YgSW50cmEgREMgCi0gKiAgICAgICAgICAgIGNvZWZmaWNpZW50cyBhcyBwZXIgW0lTTzE0NDk2LTJdLCBUYWJsZSA2LTIxLiAKLSAqICAgQUNQcmVkRmxhZyAtIGEgZmxhZyBlcXVhbCB0byBhY19wcmVkX2ZsYWcgKG9mIGx1bWluYW5jZSkgaW5kaWNhdGluZyBpZiAKLSAqICAgICAgICAgICAgdGhlIGFjIGNvZWZmaWNpZW50cyBvZiB0aGUgZmlyc3Qgcm93IG9yIGZpcnN0IGNvbHVtbiBhcmUgCi0gKiAgICAgICAgICAgIGRpZmZlcmVudGlhbGx5IGNvZGVkIGZvciBpbnRyYSBjb2RlZCBtYWNyb2Jsb2NrLiAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCi0gKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyAKLSAqICAgICAgICAgICAgbW9kZSwgYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub24gbGluZWFyIGludHJhIERDIG1vZGUuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkLCBzbyAKLSAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKLSAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBibG9jayBpbiB0aGUgZGVzdGluYXRpb24gcGxhbmU7IG11c3QgYmUgYWxpZ25lZCBvbiAKLSAqICAgICAgICAgICAgYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcENvZWZCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IHJvdyBidWZmZXIuIAotICogICBwQ29lZkJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlciAgTm90ZTogCi0gKiAgICAgICAgICAgIFRoZSBjb2VmZmljaWVudCBidWZmZXJzIG11c3QgYmUgdXBkYXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIAotICogICAgICAgICAgICB1cGRhdGUgcHJvY2VkdXJlIGRlZmluZWQgaW4gc2VjdGlvbiA2LjIuMi4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMsIGlmOgotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcENvZWZCdWZSb3csIHBDb2VmQnVmQ29sLCAKLSAqICAgICAgICAgcFFQQnVmLCBwRHN0LiAKLSAqICAgIC0gICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XSAKLSAqICAgIC0gICAgY3VyUVAgZXhjZWVkcyAoMSwgMzEpCi0gKiAgICAtICAgIGJsb2NrSW5kZXggZXhjZWVkcyBbMCw1XQotICogICAgLSAgICBzdGVwIGlzIG5vdCB0aGUgbXVsdGlwbGUgb2YgOAotICogICAgLSAgICBhIHBvaW50ZXIgYWxpZ25tZW50IHJlcXVpcmVtZW50IHdhcyB2aW9sYXRlZC4gCi0gKiAgICBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvci4gUmVmZXIgdG8gT01YX1N0c19FcnIgb2YgRGVjb2RlVkxDWmlnemFnX0ludHJhLiAgCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhKAotICAgICBjb25zdCBPTVhfVTggKiogcHBCaXRTdHJlYW0sCi0gICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCi0gICAgIE9NWF9VOCAqcERzdCwKLSAgICAgT01YX0lOVCBzdGVwLAotICAgICBPTVhfUzE2ICpwQ29lZkJ1ZlJvdywKLSAgICAgT01YX1MxNiAqcENvZWZCdWZDb2wsCi0gICAgIE9NWF9VOCBjdXJRUCwKLSAgICAgY29uc3QgT01YX1U4ICpwUVBCdWYsCi0gICAgIE9NWF9JTlQgYmxvY2tJbmRleCwKLSAgICAgT01YX0lOVCBpbnRyYURDVkxDLAotICAgICBPTVhfSU5UIEFDUHJlZEZsYWcsCi0JIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgotICkKLXsKLSAgICBPTVhfUzE2IHRlbXBCdWYxWzc5XSwgdGVtcEJ1ZjJbNzldOwotICAgIE9NWF9TMTYgKnBUZW1wQnVmMSwgKnBUZW1wQnVmMjsKLSAgICBPTVhfSU5UIHByZWREaXIsIHByZWRBQ0RpciwgaSwgaiwgY291bnQ7Ci0gICAgT01YX0lOVCAgcHJlZFFQOwotICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50IHZpZGVvQ29tcDsKLSAgICBPTVhSZXN1bHQgZXJyb3JDb2RlOwotICAgIAotICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLwotICAgIGFybVJldEFyZ0VycklmKHBwQml0U3RyZWFtID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigqcHBCaXRTdHJlYW0gPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBCaXRPZmZzZXQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBDb2VmQnVmUm93ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwQ29lZkJ1ZkNvbCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFFQQnVmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZighYXJtSXM4Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoKGN1clFQIDw9IDApIHx8IChjdXJRUCA+PSAzMikpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKCpwQml0T2Zmc2V0IDwgMCkgfHwgKCpwQml0T2Zmc2V0ID43KSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChibG9ja0luZGV4IDwgMCkgfHwgKGJsb2NrSW5kZXggPiA1KSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChzdGVwICUgOCkgIT0gMCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIAotCi0gICAgLyogQWxpZ25pbmcgdGhlIGxvY2FsIGJ1ZmZlcnMgKi8KLSAgICBwVGVtcEJ1ZjEgPSBhcm1BbGlnblRvMTZCeXRlcyh0ZW1wQnVmMSk7Ci0gICAgcFRlbXBCdWYyID0gYXJtQWxpZ25UbzE2Qnl0ZXModGVtcEJ1ZjIpOwotICAgIAotICAgIC8qIFNldHRpbmcgdGhlIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uIGFuZCBwcmVkaWN0aW9uIGRpcmVjdGlvbiAqLwotICAgIGFybVZDTTRQMl9TZXRQcmVkRGlyKAotICAgICAgICBibG9ja0luZGV4LAotICAgICAgICBwQ29lZkJ1ZlJvdywKLSAgICAgICAgcENvZWZCdWZDb2wsCi0gICAgICAgICZwcmVkRGlyLAotICAgICAgICAmcHJlZFFQLAotICAgICAgICBwUVBCdWYpOwotCi0gICAgcHJlZEFDRGlyID0gcHJlZERpcjsKLQotICAgIGFybVJldEFyZ0VycklmKCgocHJlZFFQIDw9IDApIHx8IChwcmVkUVAgPj0gMzIpKSwgT01YX1N0c19CYWRBcmdFcnIpOwotCi0gICAgaWYgKEFDUHJlZEZsYWcgPT0gMCkKLSAgICB7Ci0gICAgICAgIHByZWRBQ0RpciA9IE9NWF9WQ19OT05FOwotICAgIH0KLQotICAgIC8qIFNldHRpbmcgdGhlIHZpZGVvQ29tcCAqLwotICAgIGlmIChibG9ja0luZGV4IDw9IDMpCi0gICAgewotICAgICAgICB2aWRlb0NvbXAgPSBPTVhfVkNfTFVNSU5BTkNFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB2aWRlb0NvbXAgPSBPTVhfVkNfQ0hST01JTkFOQ0U7Ci0gICAgfQotICAgIAotCi0gICAgLyogVkxEIGFuZCB6aWd6YWcgKi8KLSAgICBpZiAoaW50cmFEQ1ZMQyA9PSAxKQotICAgIHsKLSAgICAgICAgZXJyb3JDb2RlID0gb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDKAotICAgICAgICAgICAgcHBCaXRTdHJlYW0sCi0gICAgICAgICAgICBwQml0T2Zmc2V0LAotICAgICAgICAgICAgcFRlbXBCdWYxLAotICAgICAgICAgICAgcHJlZEFDRGlyLAotICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlciwKLSAgICAgICAgICAgIHZpZGVvQ29tcCk7Ci0gICAgICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMoCi0gICAgICAgICAgICBwcEJpdFN0cmVhbSwKLSAgICAgICAgICAgIHBCaXRPZmZzZXQsCi0gICAgICAgICAgICBwVGVtcEJ1ZjEsCi0gICAgICAgICAgICBwcmVkQUNEaXIsCi0gICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyKTsKLSAgICAgICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7Ci0gICAgfQotCi0gICAgLyogQUMgREMgcHJlZGljdGlvbiAqLwotICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEoCi0gICAgICAgIHBUZW1wQnVmMSwKLSAgICAgICAgcENvZWZCdWZSb3csCi0gICAgICAgIHBDb2VmQnVmQ29sLAotICAgICAgICBjdXJRUCwKLSAgICAgICAgcHJlZFFQLAotICAgICAgICBwcmVkRGlyLAotICAgICAgICBBQ1ByZWRGbGFnLAotICAgICAgICB2aWRlb0NvbXApOwotICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOwotICAgIAotICAgIC8qIERlcXVhbnRpemF0aW9uICovCi0gICAgZXJyb3JDb2RlID0gb214VkNNNFAyX1F1YW50SW52SW50cmFfSSgKLSAgICAgcFRlbXBCdWYxLAotICAgICBjdXJRUCwKLSAgICAgdmlkZW9Db21wLAotICAgICBzaG9ydFZpZGVvSGVhZGVyKTsKLSAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKLSAgICAKLSAgICAvKiBJbnZlcnNlIHRyYW5zZm9ybSAqLwotICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9JRENUOHg4YmxrIChwVGVtcEJ1ZjEsIHBUZW1wQnVmMik7Ci0gICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7Ci0gICAgCi0gICAgLyogUGxhY2luZyB0aGUgbGluZWFyIGFycmF5IGludG8gdGhlIGRlc3RpbmF0aW9uIHBsYW5lIGFuZCBjbGlwcGluZwotICAgICAgIGl0IHRvIDAgdG8gMjU1ICovCi0gICAgZm9yIChqID0gMCwgY291bnQgPSAwOyBqIDwgODsgaisrKQotICAgIHsKLSAgICAgICAgZm9yKGkgPSAwOyBpIDwgODsgaSsrLCBjb3VudCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBwRHN0W2ldID0gYXJtQ2xpcCAoMCwgMjU1LCBwVGVtcEJ1ZjJbY291bnRdKTsKLSAgICAgICAgfQotICAgICAgICBwRHN0ICs9IHN0ZXA7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qIEVuZCBvZiBmaWxlICovCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTJjMjIwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1AuYworKysgL2Rldi9udWxsCkBAIC0xLDI1OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1AuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIERlc2NyaXB0aW9uOiAKLSAqIENvbnRhaW5zIG1vZHVsZSBmb3IgZGVjb2RpbmcgTVYgYW5kIHBhZGRpbmcgdGhlIHNhbWUKLSAqIAotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgiCi0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1AgICAoNi4yLjUuMS4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogRGVjb2RlcyBhbmQgcGFkcyB0aGUgZm91ciBtb3Rpb24gdmVjdG9ycyBhc3NvY2lhdGVkIHdpdGggYSBub24taW50cmEgUC1WT1AgCi0gKiBtYWNyb2Jsb2NrLiAgRm9yIG1hY3JvYmxvY2tzIG9mIHR5cGUgT01YX1ZDX0lOVEVSNFYsIHRoZSBvdXRwdXQgTVYgaXMgCi0gKiBwYWRkZWQgYXMgc3BlY2lmaWVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi4xLjYuIE90aGVyd2lzZSwgZm9yIAotICogbWFjcm9ibG9ja3Mgb2YgdHlwZXMgb3RoZXIgdGhhbiBPTVhfVkNfSU5URVI0ViwgdGhlIGRlY29kZWQgTVYgaXMgY29waWVkIHRvIAotICogYWxsIGZvdXIgb3V0cHV0IE1WIGJ1ZmZlciBlbnRyaWVzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IAotICogICAgICAgICAgICBzdHJlYW0gYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgdG8gYnkgCi0gKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluIFswLTddLiAKLSAqICAgcFNyY01WTGVmdE1CLCBwU3JjTVZVcHBlck1CLCBhbmQgcFNyY01WVXBwZXJSaWdodE1CIC0gcG9pbnRlcnMgdG8gdGhlIAotICogICAgICAgICAgICBtb3Rpb24gdmVjdG9yIGJ1ZmZlcnMgb2YgdGhlIG1hY3JvYmxvY2tzIHNwZWNpYWxseSBhdCB0aGUgbGVmdCwgCi0gKiAgICAgICAgICAgIHVwcGVyLCBhbmQgdXBwZXItcmlnaHQgc2lkZSBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrLCAKLSAqICAgICAgICAgICAgcmVzcGVjdGl2ZWx5OyBhIHZhbHVlIG9mIE5VTEwgaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAgTm90ZTogCi0gKiAgICAgICAgICAgIEFueSBuZWlnaGJvcmhvb2QgbWFjcm9ibG9jayBvdXRzaWRlIHRoZSBjdXJyZW50IFZPUCBvciB2aWRlbyAKLSAqICAgICAgICAgICAgcGFja2V0IG9yIG91dHNpZGUgdGhlIGN1cnJlbnQgR09CICh3aGVuIHNob3J0X3ZpZGVvX2hlYWRlciBpcyAKLSAqICAgICAgICAgICAgIDEgKSBmb3Igd2hpY2ggZ29iX2hlYWRlcl9lbXB0eSBpcyAgMCAgaXMgdHJlYXRlZCBhcyAKLSAqICAgICAgICAgICAgdHJhbnNwYXJlbnQsIGFjY29yZGluZyB0byBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuNS4gCi0gKiAgIGZjb2RlRm9yd2FyZCAtIGEgY29kZSBlcXVhbCB0byB2b3BfZmNvZGVfZm9yd2FyZCBpbiBNUEVHLTQgYml0IHN0cmVhbSAKLSAqICAgICAgICAgICAgc3ludGF4IAotICogICBNQlR5cGUgLSB0aGUgdHlwZSBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrLiBJZiBNQlR5cGUgaXMgbm90IGVxdWFsIHRvIAotICogICAgICAgICAgICBPTVhfVkNfSU5URVI0ViwgdGhlIGRlc3RpbmF0aW9uIG1vdGlvbiB2ZWN0b3IgYnVmZmVyIGlzIHN0aWxsIAotICogICAgICAgICAgICBmaWxsZWQgd2l0aCB0aGUgc2FtZSBkZWNvZGVkIHZlY3Rvci4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQsIHNvIAotICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAotICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSAKLSAqICAgcERzdE1WQ3VyTUIgLSBwb2ludGVyIHRvIHRoZSBtb3Rpb24gdmVjdG9yIGJ1ZmZlciBmb3IgdGhlIGN1cnJlbnQgCi0gKiAgICAgICAgICAgIG1hY3JvYmxvY2s7IGNvbnRhaW5zIGZvdXIgZGVjb2RlZCBtb3Rpb24gdmVjdG9ycyAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBEc3RNVkN1ck1CIAotICogICAgLSAgICAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddCi0gKiAgICAtICAgIGZjb2RlRm9yd2FyZCBleGNlZWRzICgwLDddCi0gKiAgICAtICAgIE1CVHlwZSBsZXNzIHRoYW4gemVybwotICogICAgLSAgICBtb3Rpb24gdmVjdG9yIGJ1ZmZlciBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAotICogICAgT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IgCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUCgKLSAgICAgY29uc3QgT01YX1U4ICoqIHBwQml0U3RyZWFtLAotICAgICBPTVhfSU5UICogcEJpdE9mZnNldCwKLSAgICAgT01YVkNNb3Rpb25WZWN0b3IgKiBwU3JjTVZMZWZ0TUIsCi0gICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjTVZVcHBlck1CLAotICAgICBPTVhWQ01vdGlvblZlY3RvciAqIHBTcmNNVlVwcGVyUmlnaHRNQiwKLSAgICAgT01YVkNNb3Rpb25WZWN0b3IgKiBwRHN0TVZDdXJNQiwKLSAgICAgT01YX0lOVCBmY29kZUZvcndhcmQsCi0gICAgIE9NWFZDTTRQMk1hY3JvYmxvY2tUeXBlIE1CVHlwZQotICkKLXsKLSAgICBPTVhWQ01vdGlvblZlY3RvciBkaWZmTVY7Ci0gICAgT01YVkNNb3Rpb25WZWN0b3IgZHN0TVZQcmVkTUVbMTJdOwotICAgIE9NWF9JTlQgaUJsaywgaSwgY291bnQgPSAxOwotICAgIE9NWF9TMzIgbXZIb3JSZXNpZHVhbCA9IDEsIG12VmVyUmVzaWR1YWwgPSAxLCBtdkhvckRhdGEsIG12VmVyRGF0YTsKLSAgICBPTVhfUzggc2NhbGVGYWN0b3IsIGluZGV4OwotICAgIE9NWF9TMTYgaGlnaCwgbG93LCByYW5nZTsKLQotCi0gICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCi0gICAgYXJtUmV0QXJnRXJySWYocHBCaXRTdHJlYW0gPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCpwcEJpdFN0cmVhbSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocEJpdE9mZnNldCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocERzdE1WQ3VyTUIgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCgoKnBCaXRPZmZzZXQgPCAwKSB8fCAoKnBCaXRPZmZzZXQgPiA3KSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoKGZjb2RlRm9yd2FyZCA8IDEpIHx8IChmY29kZUZvcndhcmQgPiA3KSksIFwKLSAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCFhcm1JczRCeXRlQWxpZ25lZChwRHN0TVZDdXJNQiksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICAKLSAgICBpZiAoKE1CVHlwZSA9PSBPTVhfVkNfSU5UUkEpIHx8Ci0gICAgICAgIChNQlR5cGUgPT0gT01YX1ZDX0lOVFJBX1EpCi0gICAgICAgKQotICAgIHsKLSAgICAgICAgLyogQWxsIE1WJ3MgYXJlIHplcm8gKi8KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgcERzdE1WQ3VyTUJbaV0uZHggPSAwOwotICAgICAgICAgICAgcERzdE1WQ3VyTUJbaV0uZHkgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci0gICAgfQotCi0gICAgaWYgKChNQlR5cGUgPT0gT01YX1ZDX0lOVEVSNFYpIHx8IChNQlR5cGUgPT0gT01YX1ZDX0lOVEVSNFZfUSkpCi0gICAgewotICAgICAgICBjb3VudCA9IDQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKChNQlR5cGUgPT0gT01YX1ZDX0lOVEVSKSB8fCAoTUJUeXBlID09IE9NWF9WQ19JTlRFUl9RKSkKLSAgICB7Ci0gICAgICAgIGNvdW50ID0gMTsKLSAgICB9Ci0KLSAgICAvKiBDYWxjdWxhdGluZyB0aGUgc2NhbGUgZmFjdG9yICovCi0gICAgc2NhbGVGYWN0b3IgPSAxIDw8IChmY29kZUZvcndhcmQgLTEpOwotICAgIGhpZ2ggPSAgKCAzMiAqIHNjYWxlRmFjdG9yKSAtIDE7Ci0gICAgbG93ID0gICAoICgtMzIpICogc2NhbGVGYWN0b3IpOwotICAgIHJhbmdlID0gKCA2NCAqIHNjYWxlRmFjdG9yKTsKLQotICAgIC8qIEh1ZmZtYW4gZGVjb2RpbmcgYW5kIE1WIHJlY29uc3RydWN0aW9uICovCi0gICAgZm9yIChpQmxrID0gMDsgaUJsayA8IGNvdW50OyBpQmxrKyspCi0gICAgewotCi0gICAgICAgIC8qIEh1ZmZtYW4gZGVjb2RpbmcgdG8gZ2V0IEhvcml6b250YWwgZGF0YSBhbmQgcmVzaWR1YWwgKi8KLSAgICAgICAgaW5kZXggPSBhcm1VblBhY2tWTEMzMihwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX2FWbGNNVkQpOwotICAgICAgICBhcm1SZXREYXRhRXJySWYoaW5kZXggPT0gLTEsIE9NWF9TdHNfRXJyKTsKLQotICAgICAgICBtdkhvckRhdGEgPSBpbmRleCAtIDMyOwotCi0gICAgICAgIGlmICgoZmNvZGVGb3J3YXJkID4gMSkgJiYgKG12SG9yRGF0YSAhPSAwKSkKLSAgICAgICAgewotICAgICAgICAgICAgbXZIb3JSZXNpZHVhbCA9IChPTVhfUzMyKSBhcm1HZXRCaXRzKHBwQml0U3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQml0T2Zmc2V0LCAoZmNvZGVGb3J3YXJkIC0xKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBIdWZmbWFuIGRlY29kaW5nIHRvIGdldCBWZXJ0aWNhbCBkYXRhIGFuZCByZXNpZHVhbCAqLwotICAgICAgICBpbmRleCA9IGFybVVuUGFja1ZMQzMyKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBhcm1WQ000UDJfYVZsY01WRCk7Ci0gICAgICAgIGFybVJldERhdGFFcnJJZihpbmRleCA9PSAtMSwgT01YX1N0c19FcnIpOwotCi0gICAgICAgIG12VmVyRGF0YSA9IGluZGV4IC0gMzI7Ci0KLSAgICAgICAgaWYgKChmY29kZUZvcndhcmQgPiAxKSAmJiAobXZWZXJEYXRhICE9IDApKQotICAgICAgICB7Ci0gICAgICAgICAgICBtdlZlclJlc2lkdWFsID0gKE9NWF9TMzIpIGFybUdldEJpdHMocHBCaXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRPZmZzZXQsIChmY29kZUZvcndhcmQgLTEpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIENhbGN1bGF0aW5nIHRoZSBkaWZmZXJ0aWFsIE1WICovCi0gICAgICAgIGlmICggKHNjYWxlRmFjdG9yID09IDEpIHx8IChtdkhvckRhdGEgPT0gMCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBkaWZmTVYuZHggPSBtdkhvckRhdGE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBkaWZmTVYuZHggPSAoKGFybUFicyhtdkhvckRhdGEpIC0gMSkgKiBmY29kZUZvcndhcmQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyBtdkhvclJlc2lkdWFsICsgMTsKLSAgICAgICAgICAgIGlmIChtdkhvckRhdGEgPCAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRpZmZNVi5keCA9IC1kaWZmTVYuZHg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIChzY2FsZUZhY3RvciA9PSAxKSB8fCAobXZWZXJEYXRhID09IDApICkKLSAgICAgICAgewotICAgICAgICAgICAgZGlmZk1WLmR5ID0gbXZWZXJEYXRhOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZGlmZk1WLmR5ID0gKChhcm1BYnMobXZWZXJEYXRhKSAtIDEpICogZmNvZGVGb3J3YXJkKQotICAgICAgICAgICAgICAgICAgICAgICAgICsgbXZWZXJSZXNpZHVhbCArIDE7Ci0gICAgICAgICAgICBpZiAobXZWZXJEYXRhIDwgMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkaWZmTVYuZHkgPSAtZGlmZk1WLmR5OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogRmluZCB0aGUgcHJlZGljdGVkIHZlY3RvciAqLwotICAgICAgICBvbXhWQ000UDJfRmluZE1WcHJlZCAoCi0gICAgICAgICAgICBwRHN0TVZDdXJNQiwKLSAgICAgICAgICAgIHBTcmNNVkxlZnRNQiwKLSAgICAgICAgICAgIHBTcmNNVlVwcGVyTUIsCi0gICAgICAgICAgICBwU3JjTVZVcHBlclJpZ2h0TUIsCi0gICAgICAgICAgICAmcERzdE1WQ3VyTUJbaUJsa10sCi0gICAgICAgICAgICBkc3RNVlByZWRNRSwKLSAgICAgICAgICAgIGlCbGspOwotCi0gICAgICAgIC8qIEFkZGluZyB0aGUgZGlmZmVyZW5jZSB0byB0aGUgcHJlZGljdGVkIE1WIHRvIHJlY29uc3RydWN0IE1WICovCi0gICAgICAgIHBEc3RNVkN1ck1CW2lCbGtdLmR4ICs9IGRpZmZNVi5keDsKLSAgICAgICAgcERzdE1WQ3VyTUJbaUJsa10uZHkgKz0gZGlmZk1WLmR5OwotCi0gICAgICAgIC8qIENoZWNraW5nIHRoZSByYW5nZSBhbmQga2VlcGluZyBpdCB3aXRoaW4gdGhlIGxpbWl0cyAqLwotICAgICAgICBpZiAoIHBEc3RNVkN1ck1CW2lCbGtdLmR4IDwgbG93ICkKLSAgICAgICAgewotICAgICAgICAgICAgcERzdE1WQ3VyTUJbaUJsa10uZHggKz0gcmFuZ2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBEc3RNVkN1ck1CW2lCbGtdLmR4ID4gaGlnaCkKLSAgICAgICAgewotICAgICAgICAgICAgcERzdE1WQ3VyTUJbaUJsa10uZHggLT0gcmFuZ2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIHBEc3RNVkN1ck1CW2lCbGtdLmR5IDwgbG93ICkKLSAgICAgICAgewotICAgICAgICAgICAgcERzdE1WQ3VyTUJbaUJsa10uZHkgKz0gcmFuZ2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBEc3RNVkN1ck1CW2lCbGtdLmR5ID4gaGlnaCkKLSAgICAgICAgewotICAgICAgICAgICAgcERzdE1WQ3VyTUJbaUJsa10uZHkgLT0gcmFuZ2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoKE1CVHlwZSA9PSBPTVhfVkNfSU5URVIpIHx8IChNQlR5cGUgPT0gT01YX1ZDX0lOVEVSX1EpKQotICAgIHsKLSAgICAgICAgcERzdE1WQ3VyTUJbMV0gPSBwRHN0TVZDdXJNQlswXTsKLSAgICAgICAgcERzdE1WQ3VyTUJbMl0gPSBwRHN0TVZDdXJNQlswXTsKLSAgICAgICAgcERzdE1WQ3VyTUJbM10gPSBwRHN0TVZDdXJNQlswXTsKLSAgICB9Ci0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotCi0vKiBFbmQgb2YgZmlsZSAqLwotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkM2NmNmUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIERlc2NyaXB0aW9uOiAKLSAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGRlY29kaW5nCi0gKiBmb3IgaW50ZXIgYmxvY2suCi0gKgotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybUNPTU1fQml0c3RyZWFtLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaCIKLSNpbmNsdWRlICJhcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oIgotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIgICAoNi4yLjUuMi4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIGZvciBvbmUgaW50ZXItY29kZWQgYmxvY2suIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gZG91YmxlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgc3RyZWFtIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIG5leHQgYXZhaWxhYmxlIGJpdCBpbiB0aGUgY3VycmVudCBzdHJlYW0gCi0gKiAgICAgICAgICAgIGJ5dGUgcmVmZXJlbmNlZCBieSAqcHBCaXRTdHJlYW0uIFRoZSBwYXJhbWV0ZXIgKnBCaXRPZmZzZXQgaXMgCi0gKiAgICAgICAgICAgIHZhbGlkIHdpdGhpbiB0aGUgcmFuZ2UgWzAtN10uIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKLSAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkIHN1Y2ggCi0gKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIHN0cmVhbSBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGRlY29kaW5nIHN1Y2ggdGhhdCBpdCBwb2ludHMgCi0gKiAgICAgICAgICAgIHRvIHRoZSBuZXh0IGF2YWlsYWJsZSBiaXQgaW4gdGhlIHN0cmVhbSBieXRlIHJlZmVyZW5jZWQgYnkgCi0gKiAgICAgICAgICAgICpwcEJpdFN0cmVhbSAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIAotICogICAgICAgICAgICA0LWJ5dGUgYWxpZ25lZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6Ci0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0Ci0gKiAgICAtICAgIHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkCi0gKiAgICAtICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XQotICogICAgT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IsIGlmOgotICogICAgLSAgICBBdCBsZWFzdCBvbmUgbWFyayBiaXQgaXMgZXF1YWwgdG8gemVybyAKLSAqICAgIC0gICAgRW5jb3VudGVyZWQgYW4gaWxsZWdhbCBzdHJlYW0gY29kZSB0aGF0IGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgVkxDIHRhYmxlIAotICogICAgLSAgICBFbmNvdW50ZXJlZCBhbiBpbGxlZ2FsIGNvZGUgaW4gdGhlIFZMQyBGTEMgdGFibGUgCi0gKiAgICAtICAgIFRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGlzIGdyZWF0ZXIgdGhhbiA2NCAKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIoCi0gICAgIGNvbnN0IE9NWF9VOCAqKiBwcEJpdFN0cmVhbSwKLSAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCi0gICAgIE9NWF9TMTYgKiBwRHN0LAotICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSkKLXsKLSAgICBPTVhfVTggIGxhc3Qsc3RhcnQgPSAwOwotICAgIGNvbnN0IE9NWF9VOCAgKnBaaWd6YWdUYWJsZSA9IGFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbjsKLSAgICBPTVhSZXN1bHQgZXJyb3JDb2RlOwotICAgIAotICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLwotICAgIGFybVJldEFyZ0VycklmKHBwQml0U3RyZWFtID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigqcHBCaXRTdHJlYW0gPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBCaXRPZmZzZXQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCFhcm1JczRCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOwotCi0gICAgZXJyb3JDb2RlID0gYXJtVkNNNFAyX0dldFZMQ0JpdHMgKAotICAgICAgICAgICAgICBwcEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgcEJpdE9mZnNldCwKLQkJCSAgcERzdCwKLQkJCSAgc2hvcnRWaWRlb0hlYWRlciwKLSAgICAgICAgICAgICAgc3RhcnQsCi0JCQkgICZsYXN0LAotCQkJICAxMSwKLQkJCSAgNDIsCi0JCQkgICAyLAotCQkJICAgNSwKLSAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludGVyTDBSdW5JZHgsCi0gICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRlclZsY0wwLAotCQkJICBhcm1WQ000UDJfSW50ZXJMMVJ1bklkeCwKLSAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludGVyVmxjTDEsCi0gICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRlckwwTE1BWCwKLSAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludGVyTDFMTUFYLAotICAgICAgICAgICAgICBhcm1WQ000UDJfSW50ZXJMMFJNQVgsCi0gICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRlckwxUk1BWCwKLSAgICAgICAgICAgICAgcFppZ3phZ1RhYmxlICk7Ci0gICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7Ci0gICAgCi0gICAgaWYgKGxhc3QgPT0gMCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBPTVhfU3RzX0VycjsKLSAgICB9Ci0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qIEVuZCBvZiBmaWxlICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGRkYWYwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQy5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRGVzY3JpcHRpb246IAotICogQ29udGFpbnMgbW9kdWxlcyBmb3IgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZGVjb2RpbmcKLSAqIGZvciBpbnRyYSBibG9jay4KLSAqCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybVZDLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQyAgICg2LjIuNS4yLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gb2YgQUMgYW5kIERDIGNvZWZmaWNpZW50cyAKLSAqIGZvciBvbmUgaW50cmEgYmxvY2suICBUd28gdmVyc2lvbnMgb2YgdGhlIGZ1bmN0aW9uIChEQ1ZMQyBhbmQgQUNWTEMpIGFyZSAKLSAqIHByb3ZpZGVkIGluIG9yZGVyIHRvIHN1cHBvcnQgdGhlIHR3byBkaWZmZXJlbnQgbWV0aG9kcyBvZiBwcm9jZXNzaW5nIERDIAotICogY29lZmZpY2llbnRzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy40LjEuNCwgIEludHJhIERDIAotICogQ29lZmZpY2llbnQgRGVjb2RpbmcgZm9yIHRoZSBDYXNlIG9mIFN3aXRjaGVkIFZMQyBFbmNvZGluZy4gIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSAKLSAqICAgICAgICAgICAgYml0c3RyZWFtIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgY3VycmVudCBieXRlIHJlZmVyZW5jZWQgCi0gKiAgICAgICAgICAgIGJ5ICpwcEJpdFN0cmVhbS4gIFRoZSBwYXJhbWV0ZXIgKnBCaXRPZmZzZXQgaXMgdmFsaWQgaW4gdGhlIAotICogICAgICAgICAgICByYW5nZSBbMC03XS4gQml0IFBvc2l0aW9uIGluIG9uZSBieXRlOiAgfE1vc3QgTGVhc3R8ICpwQml0T2Zmc2V0IAotICogICAgICAgICAgICB8MCAxIDIgMyA0IDUgNiA3fCAKLSAqICAgcHJlZERpciAtIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uOyB1c2VkIHRvIHNlbGVjdCB0aGUgemlnemFnIHNjYW4gCi0gKiAgICAgICAgICAgIHBhdHRlcm47IHRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogT01YX1ZDX05PTkUgLSBBQyAKLSAqICAgICAgICAgICAgcHJlZGljdGlvbiBub3QgdXNlZDsgcGVyZm9ybXMgY2xhc3NpY2FsIHppZ3phZyBzY2FuLiAKLSAqICAgICAgICAgICAgT01YX1ZDX0hPUklaT05UQUwgLSBIb3Jpem9udGFsIHByZWRpY3Rpb247IHBlcmZvcm1zIAotICogICAgICAgICAgICBhbHRlcm5hdGUtdmVydGljYWwgemlnemFnIHNjYW47IE9NWF9WQ19WRVJUSUNBTCAtIFZlcnRpY2FsIAotICogICAgICAgICAgICBwcmVkaWN0aW9uOyBwZXJmb3JtcyBhbHRlcm5hdGUtaG9yaXpvbnRhbCB6aWd6YWcgc2Nhbi4gCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAotICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCi0gKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2Ugb3IgY2hyb21pbmFuY2UpIG9mIHRoZSAKLSAqICAgICAgICAgICAgY3VycmVudCBibG9jayAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCBzdWNoIAotICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc3VjaCB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCAKLSAqICAgICAgICAgICAgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgCi0gKiAgICAgICAgICAgIDQtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cyBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0LCAKLSAqICAgICAgICAgICAgICBvciBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgICAgICAgICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10sIHByZURpciBleGNlZWRzIFswLDJdLCBvciBwRHN0IGlzIAotICogICAgICAgICAgICAgIG5vdCA0LWJ5dGUgYWxpZ25lZCAKLSAqICAgIE9NWF9TdHNfRXJyIEluIERlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLCBkY19zaXplID4gMTIgQXQgbGVhc3Qgb25lIG9mIAotICogICAgICAgICAgICAgIG1hcmsgYml0cyBlcXVhbHMgemVybyBJbGxlZ2FsIHN0cmVhbSBlbmNvdW50ZXJlZDsgY29kZSBjYW5ub3QgCi0gKiAgICAgICAgICAgICAgYmUgbG9jYXRlZCBpbiBWTEMgdGFibGUgRm9yYmlkZGVuIGNvZGUgZW5jb3VudGVyZWQgaW4gdGhlIFZMQyAKLSAqICAgICAgICAgICAgICBGTEMgdGFibGUgVGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgaXMgZ3JlYXRlciB0aGFuIDY0IAotICoKLSAqLwotCi0KLU9NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMoCi0gICAgIGNvbnN0IE9NWF9VOCAqKiBwcEJpdFN0cmVhbSwKLSAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCi0gICAgIE9NWF9TMTYgKiBwRHN0LAotICAgICBPTVhfVTggcHJlZERpciwKLSAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0pCi17Ci0gICAgT01YX1U4IHN0YXJ0ID0gMDsKLQotICAgIHJldHVybiBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhKAotICAgICBwcEJpdFN0cmVhbSwKLSAgICAgcEJpdE9mZnNldCwKLSAgICAgcERzdCwKLSAgICAgcHJlZERpciwKLSAgICAgc2hvcnRWaWRlb0hlYWRlciwKLSAgICAgc3RhcnQpOwotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM3NmVkMS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIERlc2NyaXB0aW9uOiAKLSAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGRlY29kaW5nCi0gKiBmb3IgaW50cmEgYmxvY2suCi0gKgotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybUNPTU1fQml0c3RyZWFtLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaCIKLSNpbmNsdWRlICJhcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oIgotCi0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDICAgKDYuMi41LjIuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBvZiBBQyBhbmQgREMgY29lZmZpY2llbnRzIAotICogZm9yIG9uZSBpbnRyYSBibG9jay4gIFR3byB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb24gKERDVkxDIGFuZCBBQ1ZMQykgYXJlIAotICogcHJvdmlkZWQgaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGUgdHdvIGRpZmZlcmVudCBtZXRob2RzIG9mIHByb2Nlc3NpbmcgREMgCi0gKiBjb2VmZmljaWVudHMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjQuMS40LCAgSW50cmEgREMgCi0gKiBDb2VmZmljaWVudCBEZWNvZGluZyBmb3IgdGhlIENhc2Ugb2YgU3dpdGNoZWQgVkxDIEVuY29kaW5nLiAgCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIAotICogICAgICAgICAgICBiaXRzdHJlYW0gYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBjdXJyZW50IGJ5dGUgcmVmZXJlbmNlZCAKLSAqICAgICAgICAgICAgYnkgKnBwQml0U3RyZWFtLiAgVGhlIHBhcmFtZXRlciAqcEJpdE9mZnNldCBpcyB2YWxpZCBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJhbmdlIFswLTddLiAKLSAqICAgICAgICAgICAgQml0IFBvc2l0aW9uIGluIG9uZSBieXRlOiAgfE1vc3QgICAgICBMZWFzdHwgCi0gKiAgICAgICAgICAgICAgICAgICAgKnBCaXRPZmZzZXQgICAgICAgIHwwIDEgMiAzIDQgNSA2IDd8IAotICogICBwcmVkRGlyIC0gQUMgcHJlZGljdGlvbiBkaXJlY3Rpb247IHVzZWQgdG8gc2VsZWN0IHRoZSB6aWd6YWcgc2NhbiAKLSAqICAgICAgICAgICAgcGF0dGVybjsgdGFrZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiAKLSAqICAgICAgICAgICAgLSAgT01YX1ZDX05PTkUgLSBBQyBwcmVkaWN0aW9uIG5vdCB1c2VkOyAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnIHNjYW4uIAotICogICAgICAgICAgICAtICBPTVhfVkNfSE9SSVpPTlRBTCAtIEhvcml6b250YWwgcHJlZGljdGlvbjsgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybXMgYWx0ZXJuYXRlLXZlcnRpY2FsIHppZ3phZyBzY2FuOyAKLSAqICAgICAgICAgICAgLSAgT01YX1ZDX1ZFUlRJQ0FMIC0gVmVydGljYWwgcHJlZGljdGlvbjsgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybXMgYWx0ZXJuYXRlLWhvcml6b250YWwgemlnemFnIHNjYW4uIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKLSAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAotICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlIG9yIGNocm9taW5hbmNlKSBvZiB0aGUgCi0gKiAgICAgICAgICAgIGN1cnJlbnQgYmxvY2sgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQgc3VjaCAKLSAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHN1Y2ggdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgCi0gKiAgICAgICAgICAgIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIAotICogICAgICAgICAgICA0LWJ5dGUgYWxpZ25lZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMsIGlmOgotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcERzdAotICogICAgLSAgICAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddCi0gKiAgICAtICAgIHByZURpciBleGNlZWRzIFswLDJdCi0gKiAgICAtICAgIHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkIAotICogICAgT01YX1N0c19FcnIgLSBpZjoKLSAqICAgIC0gICAgSW4gRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMsIGRjX3NpemUgPiAxMiAKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIG1hcmsgYml0cyBlcXVhbHMgemVybyAKLSAqICAgIC0gICAgSWxsZWdhbCBzdHJlYW0gZW5jb3VudGVyZWQ7IGNvZGUgY2Fubm90IGJlIGxvY2F0ZWQgaW4gVkxDIHRhYmxlIAotICogICAgLSAgICBGb3JiaWRkZW4gY29kZSBlbmNvdW50ZXJlZCBpbiB0aGUgVkxDIEZMQyB0YWJsZS4gCi0gKiAgICAtICAgIFRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGlzIGdyZWF0ZXIgdGhhbiA2NCAKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQygKLSAgICAgY29uc3QgT01YX1U4ICoqIHBwQml0U3RyZWFtLAotICAgICBPTVhfSU5UICogcEJpdE9mZnNldCwKLSAgICAgT01YX1MxNiAqIHBEc3QsCi0gICAgIE9NWF9VOCBwcmVkRGlyLAotICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCi0gICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50IHZpZGVvQ29tcAotKQotewotICAgIC8qIER1bW15IGluaXRpbGFpemF0aW9uIHRvIHJlbW92ZSBjb21waWxhdGlvbiBlcnJvciAqLwotICAgIE9NWF9TOCAgRENWYWx1ZVNpemUgPSAwOwotICAgIE9NWF9VMTYgcG93T2ZTaXplLCBmZXRjaERDYml0czsKLSAgICBPTVhfVTggc3RhcnQgPSAxOwotCi0gICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCi0gICAgYXJtUmV0QXJnRXJySWYocHBCaXRTdHJlYW0gPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCpwcEJpdFN0cmVhbSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocEJpdE9mZnNldCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoIWFybUlzNEJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKCpwQml0T2Zmc2V0IDwgMCkgfHwgKCpwQml0T2Zmc2V0ID4gNyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigocHJlZERpciA+IDIpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0KLSAgICAvKiBJbnNlcnQgdGhlIGNvZGUgaW50byB0aGUgYml0c3RyZWFtICovCi0gICAgaWYgKHZpZGVvQ29tcCA9PSBPTVhfVkNfTFVNSU5BTkNFKQotICAgIHsKLSAgICAgICAgRENWYWx1ZVNpemUgPSBhcm1VblBhY2tWTEMzMihwcEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQml0T2Zmc2V0LCBhcm1WQ000UDJfYUludHJhRENMdW1hSW5kZXgpOwotICAgIH0KLSAgICBlbHNlIGlmICh2aWRlb0NvbXAgPT0gT01YX1ZDX0NIUk9NSU5BTkNFKQotICAgIHsKLSAgICAgICAgRENWYWx1ZVNpemUgPSBhcm1VblBhY2tWTEMzMihwcEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQml0T2Zmc2V0LCBhcm1WQ000UDJfYUludHJhRENDaHJvbWFJbmRleCk7Ci0gICAgfQotICAgIGFybVJldERhdGFFcnJJZihEQ1ZhbHVlU2l6ZSA9PSAtMSwgT01YX1N0c19FcnIpOwotICAgIGFybVJldERhdGFFcnJJZihEQ1ZhbHVlU2l6ZSA+IDEyLCBPTVhfU3RzX0Vycik7Ci0KLQotICAgIGlmIChEQ1ZhbHVlU2l6ZSA9PSAwKQotICAgIHsKLSAgICAgICAgcERzdFswXSA9IDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGZldGNoRENiaXRzID0gKE9NWF9VMTYpIGFybUdldEJpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQ1ZhbHVlU2l6ZSk7Ci0KLSAgICAgICAgaWYgKCAoZmV0Y2hEQ2JpdHMgPj4gKERDVmFsdWVTaXplIC0gMSkpID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIGNhbHVsYXRlIHBvdyAqLwotICAgICAgICAgICAgcG93T2ZTaXplID0gKDEgPDwgRENWYWx1ZVNpemUpOwotCi0gICAgICAgICAgICBwRHN0WzBdID0gIChPTVhfUzE2KSAoZmV0Y2hEQ2JpdHMgXiAocG93T2ZTaXplIC0gMSkpOwotICAgICAgICAgICAgcERzdFswXSA9IC1wRHN0WzBdOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcERzdFswXSA9IGZldGNoRENiaXRzOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKERDVmFsdWVTaXplID4gOCkKLSAgICAgICAgewotICAgICAgICAgICAgLyogcmVhZGluZyBhbmQgY2hlY2tpbmcgdGhlIG1hcmtlciBiaXQqLwotICAgICAgICAgICAgYXJtUmV0RGF0YUVycklmIChhcm1HZXRCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAxKSA9PSAwLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfRXJyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhKAotICAgICAgICAgICAgICAgIHBwQml0U3RyZWFtLAotICAgICAgICAgICAgICAgIHBCaXRPZmZzZXQsCi0gICAgICAgICAgICAgICAgcERzdCwKLSAgICAgICAgICAgICAgICBwcmVkRGlyLAotICAgICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXIsCi0gICAgICAgICAgICAgICAgc3RhcnQpOwotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9FbmNvZGVNVi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRW5jb2RlTVYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA0YTIzNi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9FbmNvZGVNVi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRW5jb2RlTVYuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIERlc2NyaXB0aW9uOiAKLSAqIENvbnRhaW5zIG1vZHVsZSBmb3IgcHJlZGljdGluZyBNViBvZiBNQgotICoKLSAqLyAKLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgotI2luY2x1ZGUgImFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaCIKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRW5jb2RlTVYgICAoNi4yLjQuNS40KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUHJlZGljdHMgYSBtb3Rpb24gdmVjdG9yIGZvciB0aGUgY3VycmVudCBtYWNyb2Jsb2NrLCBlbmNvZGVzIHRoZSAKLSAqIGRpZmZlcmVuY2UsIGFuZCB3cml0ZXMgdGhlIG91dHB1dCB0byB0aGUgc3RyZWFtIGJ1ZmZlci4gVGhlIGlucHV0IE1WcyAKLSAqIHBNVkN1ck1CLCBwU3JjTVZMZWZ0TUIsIHBTcmNNVlVwcGVyTUIsIGFuZCBwU3JjTVZVcHBlclJpZ2h0TUIgc2hvdWxkIGxpZSAKLSAqIHdpdGhpbiB0aGUgcmFuZ2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5wdXQgcGFyYW1ldGVyIGZjb2RlRm9yd2FyZCwgYXMgCi0gKiBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjMuICBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGEgCi0gKiBzdXBlcnNldCBvZiB0aGUgZnVuY3Rpb25hbGl0eSBhc3NvY2lhdGVkIHdpdGggdGhlIGZ1bmN0aW9uIAotICogb214VkNNNFAyX0ZpbmRNVnByZWQuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gZG91YmxlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0c3RyZWFtIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtIGluZGV4IG9mIHRoZSBmaXJzdCBmcmVlIChuZXh0IGF2YWlsYWJsZSkgYml0IGluIHRoZSBzdHJlYW0gCi0gKiAgICAgICAgICAgIGJ1ZmZlciByZWZlcmVuY2VkIGJ5ICpwcEJpdFN0cmVhbSwgdmFsaWQgaW4gdGhlIHJhbmdlIDAgdG8gNy4gCi0gKiAgIHBNVkN1ck1CIC0gcG9pbnRlciB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIG1vdGlvbiB2ZWN0b3I7IGEgdmFsdWUgb2YgCi0gKiAgICAgICAgICAgIE5VTEwgaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAKLSAqICAgcFNyY01WTGVmdE1CIC0gcG9pbnRlciB0byB0aGUgc291cmNlIGxlZnQgbWFjcm9ibG9jayBtb3Rpb24gdmVjdG9yOyBhIAotICogICAgICAgICAgICB2YWx1ZSBvZiAgTlVMTGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gCi0gKiAgIHBTcmNNVlVwcGVyTUIgLSBwb2ludGVyIHRvIHNvdXJjZSB1cHBlciBtYWNyb2Jsb2NrIG1vdGlvbiB2ZWN0b3I7IGEgCi0gKiAgICAgICAgICAgIHZhbHVlIG9mIE5VTEwgaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAKLSAqICAgcFNyY01WVXBwZXJSaWdodE1CIC0gcG9pbnRlciB0byBzb3VyY2UgdXBwZXIgcmlnaHQgTUIgbW90aW9uIHZlY3RvcjsgYSAKLSAqICAgICAgICAgICAgdmFsdWUgb2YgTlVMTCBpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuIAotICogICBmY29kZUZvcndhcmQgLSBhbiBpbnRlZ2VyIHdpdGggdmFsdWVzIGZyb20gMSB0byA3OyB1c2VkIGluIGVuY29kaW5nIAotICogICAgICAgICAgICBtb3Rpb24gdmVjdG9ycyByZWxhdGVkIHRvIHNlYXJjaCByYW5nZSwgYXMgZGVzY3JpYmVkIGluIAotICogICAgICAgICAgICBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuMy4gCi0gKiAgIE1CVHlwZSAtIG1hY3JvIGJsb2NrIHR5cGUsIHZhbGlkIGluIHRoZSByYW5nZSAwIHRvIDUgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gdXBkYXRlZCBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gCi0gKiAgICAgICAgICAgIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtIHVwZGF0ZWQgaW5kZXggb2YgdGhlIG5leHQgYXZhaWxhYmxlIGJpdCBwb3NpdGlvbiBpbiBzdHJlYW0gCi0gKiAgICAgICAgICAgIGJ1ZmZlciByZWZlcmVuY2VkIGJ5ICpwcEJpdFN0cmVhbSAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cyAKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sIAotICogICAgICAgICAgICAgICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcE1WQ3VyTUIgCi0gKiAgICAtICAgICpwQml0T2Zmc2V0IDwgMCwgb3IgKnBCaXRPZmZzZXQgPjcuIAotICogICAgLSAgICBmY29kZUZvcndhcmQgPD0gMCwgb3IgZmNvZGVGb3J3YXJkID4gNywgb3IgTUJUeXBlIDwgMC4gCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDJfRW5jb2RlTVYoCi0gICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqIHBNVkN1ck1CLAotICAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqIHBTcmNNVkxlZnRNQiwKLSAgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKiBwU3JjTVZVcHBlck1CLAotICAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqIHBTcmNNVlVwcGVyUmlnaHRNQiwKLSAgICAgT01YX0lOVCBmY29kZUZvcndhcmQsCi0gICAgIE9NWFZDTTRQMk1hY3JvYmxvY2tUeXBlIE1CVHlwZQotKQotewotICAgIE9NWFZDTW90aW9uVmVjdG9yIGRzdE1WUHJlZCwgZGlmZk1WOwotICAgIE9NWFZDTW90aW9uVmVjdG9yIGRzdE1WUHJlZE1FWzEyXTsKLSAgICAvKiBJbml0aWFsaXplZCB0byByZW1vdmUgY29tcGlsYXRpb24gd2FybmluZyAqLwotICAgIE9NWF9JTlQgaUJsaywgaSwgY291bnQgPSAxOwotICAgIE9NWF9TMzIgbXZIb3JSZXNpZHVhbCwgbXZWZXJSZXNpZHVhbCwgbXZIb3JEYXRhLCBtdlZlckRhdGE7Ci0gICAgT01YX1U4IHNjYWxlRmFjdG9yLCBpbmRleDsKLQotICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLwotICAgIGFybVJldEFyZ0VycklmKHBwQml0U3RyZWFtID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigqcHBCaXRTdHJlYW0gPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBCaXRPZmZzZXQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBNVkN1ck1CID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoKCpwQml0T2Zmc2V0IDwgMCkgfHwgKCpwQml0T2Zmc2V0ID4gNykpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKChmY29kZUZvcndhcmQgPCAxKSB8fCAoZmNvZGVGb3J3YXJkID4gNykpLCBcCi0gICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICAKLSAgICBpZiAoKE1CVHlwZSA9PSBPTVhfVkNfSU5UUkEpIHx8Ci0gICAgICAgIChNQlR5cGUgPT0gT01YX1ZDX0lOVFJBX1EpCi0gICAgICAgKQotICAgIHsKLSAgICAgICAgLyogTm8gY2FuZGlkYXRlIHZlY3RvcnMgaGVuY2UgbWFrZSB0aGVtIHplcm8gKi8KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDEyOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRzdE1WUHJlZE1FW2ldLmR4ID0gMDsKLSAgICAgICAgICAgIGRzdE1WUHJlZE1FW2ldLmR5ID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotICAgIH0KLQotICAgIGlmICgoTUJUeXBlID09IE9NWF9WQ19JTlRFUjRWKSB8fCAoTUJUeXBlID09IE9NWF9WQ19JTlRFUjRWX1EpKQotICAgIHsKLSAgICAgICAgY291bnQgPSA0OwotICAgIH0KLSAgICBlbHNlIGlmICgoTUJUeXBlID09IE9NWF9WQ19JTlRFUikgfHwgKE1CVHlwZSA9PSBPTVhfVkNfSU5URVJfUSkpCi0gICAgewotICAgICAgICBjb3VudCA9IDE7Ci0gICAgfQotCi0gICAgLyogQ2FsY3VsYXRpbmcgdGhlIHNjYWxlIGZhY3RvciAqLwotICAgIHNjYWxlRmFjdG9yID0gMSA8PCAoZmNvZGVGb3J3YXJkIC0xKTsKLQotICAgIGZvciAoaUJsayA9IDA7IGlCbGsgPCBjb3VudDsgaUJsaysrKQotICAgIHsKLQotICAgICAgICAvKiBGaW5kIHRoZSBwcmVkaWN0ZWQgdmVjdG9yICovCi0gICAgICAgIG9teFZDTTRQMl9GaW5kTVZwcmVkICgKLSAgICAgICAgICAgIHBNVkN1ck1CLAotICAgICAgICAgICAgcFNyY01WTGVmdE1CLAotICAgICAgICAgICAgcFNyY01WVXBwZXJNQiwKLSAgICAgICAgICAgIHBTcmNNVlVwcGVyUmlnaHRNQiwKLSAgICAgICAgICAgICZkc3RNVlByZWQsCi0gICAgICAgICAgICBkc3RNVlByZWRNRSwKLSAgICAgICAgICAgIGlCbGsgKTsKLQotICAgICAgICAvKiBDYWxjdWxhdGluZyB0aGUgZGlmZmVyZW50aWFsIG1vdGlvbiB2ZWN0b3IgKGRpZmZNVikgKi8KLSAgICAgICAgZGlmZk1WLmR4ID0gcE1WQ3VyTUJbaUJsa10uZHggLSBkc3RNVlByZWQuZHg7Ci0gICAgICAgIGRpZmZNVi5keSA9IHBNVkN1ck1CW2lCbGtdLmR5IC0gZHN0TVZQcmVkLmR5OwotCi0gICAgICAgIC8qIENhbGN1bGF0aW5nIHRoZSBtdl9kYXRhIGFuZCBtdl9yZXNpZHVhbCBmb3IgSG9yaXphbnRhbCBNViAqLwotICAgICAgICBpZiAoZGlmZk1WLmR4ID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG12SG9yUmVzaWR1YWwgPSAwOwotICAgICAgICAgICAgbXZIb3JEYXRhID0gMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIG12SG9yUmVzaWR1YWwgPSAoIGFybUFicyhkaWZmTVYuZHgpIC0gMSkgJSBzY2FsZUZhY3RvcjsKLSAgICAgICAgICAgIG12SG9yRGF0YSA9IChhcm1BYnMoZGlmZk1WLmR4KSAtIG12SG9yUmVzaWR1YWwgKyAoc2NhbGVGYWN0b3IgLSAxKSkKLSAgICAgICAgICAgICAgICAgICAgIC8gc2NhbGVGYWN0b3I7Ci0gICAgICAgICAgICBpZiAoZGlmZk1WLmR4IDwgMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtdkhvckRhdGEgPSAtbXZIb3JEYXRhOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogQ2FsY3VsYXRpbmcgdGhlIG12X2RhdGEgYW5kIG12X3Jlc2lkdWFsIGZvciBWZXJ0aWNhbCBNViAqLwotICAgICAgICBpZiAoZGlmZk1WLmR5ID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG12VmVyUmVzaWR1YWwgPSAwOwotICAgICAgICAgICAgbXZWZXJEYXRhID0gMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIG12VmVyUmVzaWR1YWwgPSAoIGFybUFicyhkaWZmTVYuZHkpIC0gMSkgJSBzY2FsZUZhY3RvcjsKLSAgICAgICAgICAgIG12VmVyRGF0YSA9IChhcm1BYnMoZGlmZk1WLmR5KSAtIG12VmVyUmVzaWR1YWwgKyAoc2NhbGVGYWN0b3IgLSAxKSkKLSAgICAgICAgICAgICAgICAgICAgIC8gc2NhbGVGYWN0b3I7Ci0gICAgICAgICAgICBpZiAoZGlmZk1WLmR5IDwgMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtdlZlckRhdGEgPSAtbXZWZXJEYXRhOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogSHVmZm1hbiBlbmNvZGluZyAqLwotCi0gICAgICAgIC8qIFRoZSBpbmRleCBpcyBhY3R1YWxseSBjYWxjdWxhdGUgYXMKLSAgICAgICAgICAgaW5kZXggPSAoKGZsb2F0KSAobXZIb3JEYXRhLzIpICsgMTYpICogMiwKLSAgICAgICAgICAgbWVhbmluZyB0aGUgTVYgZGF0YSBpcyBoYWxmZWQgYW5kIHRoZW4gbm9ybWFsaXplZAotICAgICAgICAgICB0byBiZWdpbiB3aXRoIHplcm8gYW5kIHRoZW4gZG91YmxlZCB0byB0YWtlIGNhcmUgb2YgaW5kZXhpbmcKLSAgICAgICAgICAgdGhlIGZyYWN0aW9uYWwgcGFydCBpbmNsdWRlZCAqLwotICAgICAgICBpbmRleCA9IG12SG9yRGF0YSArIDMyOwotICAgICAgICBhcm1QYWNrVkxDMzIgKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBhcm1WQ000UDJfYVZsY01WRFtpbmRleF0pOwotICAgICAgICBpZiAoKGZjb2RlRm9yd2FyZCA+IDEpICYmIChkaWZmTVYuZHggIT0gMCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFybVBhY2tCaXRzIChwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgbXZIb3JSZXNpZHVhbCwgKGZjb2RlRm9yd2FyZCAtMSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogVGhlIGluZGV4IGlzIGFjdHVhbGx5IGNhbGN1bGF0ZSBhcwotICAgICAgICAgICBpbmRleCA9ICgoZmxvYXQpIChtdlZlckRhdGEvMikgKyAxNikgKiAyLAotICAgICAgICAgICBtZWFuaW5nIHRoZSBNViBkYXRhIGlzIGhhbGZlZCBhbmQgdGhlbiBub3JtYWxpemVkCi0gICAgICAgICAgIHRvIGJlZ2luIHdpdGggemVybyBhbmQgdGhlbiBkb3VibGVkIHRvIHRha2UgY2FyZSBvZiBpbmRleGluZwotICAgICAgICAgICB0aGUgZnJhY3Rpb25hbCBwYXJ0IGluY2x1ZGVkICovCi0gICAgICAgIGluZGV4ID0gbXZWZXJEYXRhICsgMzI7Ci0gICAgICAgIGFybVBhY2tWTEMzMiAocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIGFybVZDTTRQMl9hVmxjTVZEW2luZGV4XSk7Ci0gICAgICAgIGlmICgoZmNvZGVGb3J3YXJkID4gMSkgJiYgKGRpZmZNVi5keSAhPSAwKSkKLSAgICAgICAgewotICAgICAgICAgICAgYXJtUGFja0JpdHMgKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBtdlZlclJlc2lkdWFsLCAoZmNvZGVGb3J3YXJkIC0xKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotCi0vKiBFbmQgb2YgZmlsZSAqLwotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRlci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNThmODguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50ZXIuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIERlc2NyaXB0aW9uOiAKLSAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGVuY29kaW5nCi0gKiBmb3IgaW50ZXIgYmxvY2suCi0gKgotICovIAotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybVZDLmgiCi0jaW5jbHVkZSAiYXJtQ09NTV9CaXRzdHJlYW0uaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oIgotI2luY2x1ZGUgImFybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgiCi0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRlciAgICg2LjIuNC41LjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZW5jb2RpbmcgZm9yIG9uZSBpbnRlciBibG9jay4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCAKLSAqICAgICAgICAgICAgc3RyZWFtIAotICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgCi0gKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNyAKLSAqICAgcFFEY3RCbGtDb2VmIC0gcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudCAKLSAqICAgcGF0dGVybiAtIGJsb2NrIHBhdHRlcm4gd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgd2hldGhlciB0aGlzIGJsb2NrIGlzIAotICogICAgICAgICAgICBlbmNvZGVkIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKLSAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkIHNvIHRoYXQgCi0gKiAgICAgICAgICAgIGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4gCi0gKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKLSAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0uIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBCYWQgYXJndW1lbnRzIAotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIHBvaW50ZXJzOiBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCAKLSAqICAgICAgICAgICAgICBwQml0T2Zmc2V0LCBwUURjdEJsa0NvZWYgCi0gKiAgICAtICAgKnBCaXRPZmZzZXQgPCAwLCBvciAqcEJpdE9mZnNldCA+Ny4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRlcigKLSAgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAotICAgICBjb25zdCBPTVhfUzE2ICpwUURjdEJsa0NvZWYsCi0gICAgIE9NWF9VOCBwYXR0ZXJuLAotCSBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSkKLXsKLSAgICBPTVhfVTggc3RhcnQgPSAwOwotICAgIGNvbnN0IE9NWF9VOCAgKnBaaWd6YWdUYWJsZSA9IGFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbjsKLQotICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLwotICAgIGFybVJldEFyZ0VycklmKHBwQml0U3RyZWFtID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigqcHBCaXRTdHJlYW0gPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBCaXRPZmZzZXQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBRRGN0QmxrQ29lZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKCpwQml0T2Zmc2V0IDwgMCkgfHwgKCpwQml0T2Zmc2V0ID43KSwgT01YX1N0c19CYWRBcmdFcnIpOwotCi0gICAgaWYgKHBhdHRlcm4pCi0gICAgewotICAgICAgICBhcm1WQ000UDJfUHV0VkxDQml0cyAoCi0gICAgICAgICAgICAgIHBwQml0U3RyZWFtLAotICAgICAgICAgICAgICBwQml0T2Zmc2V0LAotICAgICAgICAgICAgICBwUURjdEJsa0NvZWYsCi0gICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXIsCi0gICAgICAgICAgICAgIHN0YXJ0LAotICAgICAgICAgICAgICAyNiwKLSAgICAgICAgICAgICAgNDAsCi0gICAgICAgICAgICAgIDEwLAotICAgICAgICAgICAgICAxLAotICAgICAgICAgICAgICBhcm1WQ000UDJfSW50ZXJMMFJ1bklkeCwKLSAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludGVyVmxjTDAsCi0JCQkgIGFybVZDTTRQMl9JbnRlckwxUnVuSWR4LAotICAgICAgICAgICAgICBhcm1WQ000UDJfSW50ZXJWbGNMMSwKLSAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludGVyTDBMTUFYLAotICAgICAgICAgICAgICBhcm1WQ000UDJfSW50ZXJMMUxNQVgsCi0gICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRlckwwUk1BWCwKLSAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludGVyTDFSTUFYLAotICAgICAgICAgICAgICBwWmlnemFnVGFibGUKLSAgICAgICAgKTsKLSAgICB9IC8qIFBhdHRlcm4gY2hlY2sgZW5kcyovCi0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLQotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhQUNWTEMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzYjZkOTcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhQUNWTEMuYworKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBEZXNjcmlwdGlvbjogCi0gKiBDb250YWlucyBtb2R1bGVzIGZvciB6aWd6YWcgc2Nhbm5pbmcgYW5kIFZMQyBlbmNvZGluZwotICogZm9yIGludHJhIGJsb2NrLgotICoKLSAqLyAKLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhQUNWTEMgICAoNi4yLjQuNS4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgemlnemFnIHNjYW4gYW5kIFZMQyBlbmNvZGluZyBvZiBBQyBhbmQgREMgY29lZmZpY2llbnRzIGZvciBvbmUgCi0gKiBpbnRyYSBibG9jay4gIFR3byB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb24gKERDVkxDIGFuZCBBQ1ZMQykgYXJlIHByb3ZpZGVkIAotICogaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGUgdHdvIGRpZmZlcmVudCBtZXRob2RzIG9mIHByb2Nlc3NpbmcgREMgCi0gKiBjb2VmZmljaWVudHMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjQuMS40LCAgSW50cmEgREMgCi0gKiBDb2VmZmljaWVudCBEZWNvZGluZyBmb3IgdGhlIENhc2Ugb2YgU3dpdGNoZWQgVkxDIEVuY29kaW5nLiAgCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSBkb3VibGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXRzdHJlYW0gCi0gKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAKLSAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3LiAKLSAqICAgcFFEY3RCbGtDb2VmIC0gcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudCAKLSAqICAgcHJlZERpciAtIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uLCB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB0aGUgemlnemFnIAotICogICAgICAgICAgICBzY2FuIHBhdHRlcm47IHRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogCi0gKiAgICAgICAgICAgIC0gIE9NWF9WQ19OT05FIC0gQUMgcHJlZGljdGlvbiBub3QgdXNlZC4gIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcgc2Nhbi4gCi0gKiAgICAgICAgICAgIC0gIE9NWF9WQ19IT1JJWk9OVEFMIC0gSG9yaXpvbnRhbCBwcmVkaWN0aW9uLiAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLXZlcnRpY2FsIHppZ3phZyBzY2FuLiAKLSAqICAgICAgICAgICAgLSAgT01YX1ZDX1ZFUlRJQ0FMIC0gVmVydGljYWwgcHJlZGljdGlvbi4gIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS1ob3Jpem9udGFsIHppZ3phZyBzY2FuLiAKLSAqICAgcGF0dGVybiAtIGJsb2NrIHBhdHRlcm4gd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgd2hldGhlciB0aGlzIGJsb2NrIGlzIAotICogICAgICAgICAgICBlbmNvZGVkIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKLSAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLCBzbyAKLSAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIuIAotICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCi0gKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gQmFkIGFyZ3VtZW50czoKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sIAotICogICAgICAgICAgICAgICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcFFEY3RCbGtDb2VmLiAKLSAqICAgIC0gICAqcEJpdE9mZnNldCA8IDAsIG9yICpwQml0T2Zmc2V0ID43LiAKLSAqICAgIC0gICAgUHJlZERpciBpcyBub3Qgb25lIG9mOiBPTVhfVkNfTk9ORSwgT01YX1ZDX0hPUklaT05UQUwsIG9yIAotICogICAgICAgICBPTVhfVkNfVkVSVElDQUwuIAotICogICAgLSAgICBWaWRlb0NvbXAgaXMgbm90IG9uZSBjb21wb25lbnQgb2YgZW51bSBPTVhWQ000UDJWaWRlb0NvbXBvbmVudC4gCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhQUNWTEMoCi0gICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgICBjb25zdCBPTVhfUzE2ICpwUURjdEJsa0NvZWYsCi0gICAgIE9NWF9VOCBwcmVkRGlyLAotICAgICBPTVhfVTggcGF0dGVybiwKLSAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0pCi17Ci0gICAgT01YX1U4IHN0YXJ0ID0gMDsKLQotICAgIHJldHVybiBhcm1WQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhKAotICAgICBwcEJpdFN0cmVhbSwKLSAgICAgcEJpdE9mZnNldCwKLSAgICAgcFFEY3RCbGtDb2VmLAotICAgICBwcmVkRGlyLAotICAgICBwYXR0ZXJuLAotICAgICBzaG9ydFZpZGVvSGVhZGVyLAotICAgICBzdGFydCk7Ci19Ci0KLS8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhRENWTEMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JkZGExOS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhRENWTEMuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIERlc2NyaXB0aW9uOiAKLSAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGVuY29kaW5nCi0gKiBmb3IgaW50cmEgYmxvY2suCi0gKgotICovIAotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybVZDLmgiCi0jaW5jbHVkZSAiYXJtQ09NTV9CaXRzdHJlYW0uaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oIgotI2luY2x1ZGUgImFybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgiCi0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDICAgKDYuMi40LjUuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIHppZ3phZyBzY2FuIGFuZCBWTEMgZW5jb2Rpbmcgb2YgQUMgYW5kIERDIGNvZWZmaWNpZW50cyBmb3Igb25lIAotICogaW50cmEgYmxvY2suICBUd28gdmVyc2lvbnMgb2YgdGhlIGZ1bmN0aW9uIChEQ1ZMQyBhbmQgQUNWTEMpIGFyZSBwcm92aWRlZCAKLSAqIGluIG9yZGVyIHRvIHN1cHBvcnQgdGhlIHR3byBkaWZmZXJlbnQgbWV0aG9kcyBvZiBwcm9jZXNzaW5nIERDIAotICogY29lZmZpY2llbnRzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy40LjEuNCwgIkludHJhIERDIAotICogQ29lZmZpY2llbnQgRGVjb2RpbmcgZm9yIHRoZSBDYXNlIG9mIFN3aXRjaGVkIFZMQyBFbmNvZGluZyIuICAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIGRvdWJsZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdHN0cmVhbSAKLSAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5IAotICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcuIAotICogICBwUURjdEJsa0NvZWYgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50IAotICogICBwcmVkRGlyIC0gQUMgcHJlZGljdGlvbiBkaXJlY3Rpb24sIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHRoZSB6aWd6YWcgCi0gKiAgICAgICAgICAgIHNjYW4gcGF0dGVybjsgdGFrZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiAKLSAqICAgICAgICAgICAgLSAgT01YX1ZDX05PTkUgLSBBQyBwcmVkaWN0aW9uIG5vdCB1c2VkLiAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgY2xhc3NpY2FsIHppZ3phZyBzY2FuLiAKLSAqICAgICAgICAgICAgLSAgT01YX1ZDX0hPUklaT05UQUwgLSBIb3Jpem9udGFsIHByZWRpY3Rpb24uICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtdmVydGljYWwgemlnemFnIHNjYW4uIAotICogICAgICAgICAgICAtICBPTVhfVkNfVkVSVElDQUwgLSBWZXJ0aWNhbCBwcmVkaWN0aW9uLiAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLWhvcml6b250YWwgemlnemFnIHNjYW4uIAotICogICBwYXR0ZXJuIC0gYmxvY2sgcGF0dGVybiB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyIHRoaXMgYmxvY2sgaXMgCi0gKiAgICAgICAgICAgIGVuY29kZWQgCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAotICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCi0gKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2UsIGNocm9taW5hbmNlKSBvZiB0aGUgY3VycmVudCAKLSAqICAgICAgICAgICAgYmxvY2sgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQsIHNvIAotICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4gCi0gKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKLSAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0uIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBCYWQgYXJndW1lbnRzOgotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgCi0gKiAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwUURjdEJsa0NvZWYuIAotICogICAgLSAgICpwQml0T2Zmc2V0IDwgMCwgb3IgKnBCaXRPZmZzZXQgPjcuIAotICogICAgLSAgICBQcmVkRGlyIGlzIG5vdCBvbmUgb2Y6IE9NWF9WQ19OT05FLCBPTVhfVkNfSE9SSVpPTlRBTCwgb3IgCi0gKiAgICAgICAgIE9NWF9WQ19WRVJUSUNBTC4gCi0gKiAgICAtICAgIFZpZGVvQ29tcCBpcyBub3Qgb25lIGNvbXBvbmVudCBvZiBlbnVtIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50LiAKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQygKLSAgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCi0gICAgIGNvbnN0IE9NWF9TMTYgKnBRRGN0QmxrQ29lZiwKLSAgICAgT01YX1U4IHByZWREaXIsCi0gICAgIE9NWF9VOCBwYXR0ZXJuLAotICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCi0gICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50IHZpZGVvQ29tcAotKQotewotICAgIE9NWF9TMTYgZGNWYWx1ZSwgcG93T2ZTaXplOwotICAgIE9NWF9VOCAgRENWYWx1ZVNpemUsIHN0YXJ0ID0gMTsKLSAgICBPTVhfVTE2IGFic0RDVmFsdWU7Ci0KLSAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwcEJpdFN0cmVhbSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKnBwQml0U3RyZWFtID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwQml0T2Zmc2V0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwUURjdEJsa0NvZWYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCgqcEJpdE9mZnNldCA8IDApIHx8ICgqcEJpdE9mZnNldCA+NyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQlhcm1SZXRBcmdFcnJJZigodmlkZW9Db21wICE9IE9NWF9WQ19MVU1JTkFOQ0UpICYmICh2aWRlb0NvbXAgIT0gT01YX1ZDX0NIUk9NSU5BTkNFKSwgT01YX1N0c19CYWRBcmdFcnIpOwotCWFybVJldEFyZ0VycklmKChwcmVkRGlyICE9IE9NWF9WQ19OT05FKSAmJiAocHJlZERpciAhPSBPTVhfVkNfSE9SSVpPTlRBTCkgJiYgKHByZWREaXIgIT0gT01YX1ZDX1ZFUlRJQ0FMKSAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICAKLSAgICBpZiAocGF0dGVybikKLSAgICB7Ci0gICAgICAgIGRjVmFsdWUgPSBwUURjdEJsa0NvZWZbMF07Ci0gICAgICAgIGFic0RDVmFsdWUgPSBhcm1BYnMoZGNWYWx1ZSk7Ci0KLSAgICAgICAgLyogRmluZCB0aGUgc2l6ZSAqLwotICAgICAgICBEQ1ZhbHVlU2l6ZSA9IGFybUxvZ1NpemUgKGFic0RDVmFsdWUpOwotICAgICAgICBhYnNEQ1ZhbHVlID0gYXJtQWJzKGRjVmFsdWUpOwotCi0gICAgICAgIC8qIEluc2VydCB0aGUgY29kZSBpbnRvIHRoZSBiaXRzdHJlYW0gKi8KLSAgICAgICAgaWYgKHZpZGVvQ29tcCA9PSBPTVhfVkNfTFVNSU5BTkNFKQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIGFybVBhY2tWTEMzMiAocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9hSW50cmFEQ0x1bWFJbmRleFtEQ1ZhbHVlU2l6ZV0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHZpZGVvQ29tcCA9PSBPTVhfVkNfQ0hST01JTkFOQ0UpCi0gICAgICAgIHsKLQotICAgICAgICAgICAgYXJtUGFja1ZMQzMyIChwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX2FJbnRyYURDQ2hyb21hSW5kZXhbRENWYWx1ZVNpemVdKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEFkZGl0aW9uYWwgY29kZSBnZW5lcmF0aW9uIGluIGNhc2Ugb2YgbmVnYXRpdmUKLSAgICAgICAgICAgZGMgdmFsdWUgdGhlIGFkZGl0aW9uYWwgKi8KLSAgICAgICAgaWYgKERDVmFsdWVTaXplID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGRjVmFsdWUgPCAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIGNhbHVsYXRlIDIgcG93ICovCi0gICAgICAgICAgICAgICAgcG93T2ZTaXplID0gKDEgPDwgRENWYWx1ZVNpemUpOwotCi0gICAgICAgICAgICAgICAgYWJzRENWYWx1ZSA9ICBhYnNEQ1ZhbHVlIF4gKHBvd09mU2l6ZSAtIDEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXJtUGFja0JpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIChPTVhfVTMyKWFic0RDVmFsdWUsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIERDVmFsdWVTaXplKTsKLQotICAgICAgICAgICAgaWYgKERDVmFsdWVTaXplID4gOCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhcm1QYWNrQml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgMSwgMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gYXJtVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYSgKLSAgICAgICAgICAgICAgICBwcEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgICBwQml0T2Zmc2V0LAotICAgICAgICAgICAgICAgIHBRRGN0QmxrQ29lZiwKLSAgICAgICAgICAgICAgICBwcmVkRGlyLAotICAgICAgICAgICAgICAgIHBhdHRlcm4sCi0gICAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlciwKLSAgICAgICAgICAgICAgICBzdGFydCk7Ci19Ci0KLS8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9GaW5kTVZwcmVkLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9GaW5kTVZwcmVkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NGI0ODYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRmluZE1WcHJlZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRmluZE1WcHJlZC5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRGVzY3JpcHRpb246IAotICogQ29udGFpbnMgbW9kdWxlIGZvciBwcmVkaWN0aW5nIE1WIG9mIE1CCi0gKgotICovCi0gIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9GaW5kTVZwcmVkICAgKDYuMi4zLjEuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFByZWRpY3RzIGEgbW90aW9uIHZlY3RvciBmb3IgdGhlIGN1cnJlbnQgYmxvY2sgdXNpbmcgdGhlIHByb2NlZHVyZSAKLSAqIHNwZWNpZmllZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuNS4gIFRoZSByZXN1bHRpbmcgcHJlZGljdGVkIE1WIGlzIAotICogcmV0dXJuZWQgaW4gcERzdE1WUHJlZC4gSWYgdGhlIHBhcmFtZXRlciBwRHN0TVZQcmVkTUUgaWYgaXMgbm90IE5VTEwgdGhlbiAKLSAqIHRoZSBzZXQgb2YgdGhyZWUgTVYgY2FuZGlkYXRlcyB1c2VkIGZvciBwcmVkaWN0aW9uIGlzIGFsc28gcmV0dXJuZWQsIAotICogb3RoZXJ3aXNlIHBEc3RNVlByZWRNRWlzIE5VTEwgdXBvbiByZXR1cm4uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNNVkN1ck1CIC0gcG9pbnRlciB0byB0aGUgTVYgYnVmZmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBZIAotICogICAgICAgICAgICBtYWNyb2Jsb2NrOyBhIHZhbHVlIG9mIE5VTEwgaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAKLSAqICAgcFNyY0NhbmRNVjEgLSBwb2ludGVyIHRvIHRoZSBNViBidWZmZXIgY29udGFpbmluZyB0aGUgNCBNVnMgYXNzb2NpYXRlZCAKLSAqICAgICAgICAgICAgd2l0aCB0aGUgTUIgbG9jYXRlZCB0byB0aGUgbGVmdCBvZiB0aGUgY3VycmVudCBNQjsgc2V0IHRvIE5VTEwgCi0gKiAgICAgICAgICAgIGlmIHRoZXJlIGlzIG5vIE1CIHRvIHRoZSBsZWZ0LiAKLSAqICAgcFNyY0NhbmRNVjIgLSBwb2ludGVyIHRvIHRoZSBNViBidWZmZXIgY29udGFpbmluZyB0aGUgNCBNVnMgYXNzb2NpYXRlZCAKLSAqICAgICAgICAgICAgd2l0aCB0aGUgTUIgbG9jYXRlZCBhYm92ZSB0aGUgY3VycmVudCBNQjsgc2V0IHRvIE5VTEwgaWYgdGhlcmUgCi0gKiAgICAgICAgICAgIGlzIG5vIE1CIGxvY2F0ZWQgYWJvdmUgdGhlIGN1cnJlbnQgTUIuIAotICogICBwU3JjQ2FuZE1WMyAtIHBvaW50ZXIgdG8gdGhlIE1WIGJ1ZmZlciBjb250YWluaW5nIHRoZSA0IE1WcyBhc3NvY2lhdGVkIAotICogICAgICAgICAgICB3aXRoIHRoZSBNQiBsb2NhdGVkIHRvIHRoZSByaWdodCBhbmQgYWJvdmUgdGhlIGN1cnJlbnQgTUI7IHNldCAKLSAqICAgICAgICAgICAgdG8gTlVMTCBpZiB0aGVyZSBpcyBubyBNQiBsb2NhdGVkIHRvIHRoZSBhYm92ZS1yaWdodC4gCi0gKiAgIGlCbGsgLSB0aGUgaW5kZXggb2YgYmxvY2sgaW4gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayAKLSAqICAgcERzdE1WUHJlZE1FIC0gTVYgY2FuZGlkYXRlIHJldHVybiBidWZmZXI7ICBpZiBzZXQgdG8gTlVMTCB0aGVuIAotICogICAgICAgICAgICBwcmVkaWN0aW9uIGNhbmRpZGF0ZSBNVnMgYXJlIG5vdCByZXR1cm5lZCBhbmQgcERzdE1WUHJlZE1FIHdpbGwgCi0gKiAgICAgICAgICAgIGJlIE5VTEwgdXBvbiBmdW5jdGlvbiByZXR1cm47IGlmIHBEc3RNVlByZWRNRSBpcyBub24tTlVMTCB0aGVuIGl0IAotICogICAgICAgICAgICBtdXN0IHBvaW50IHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgc3VmZmljaWVudCBzcGFjZSBmb3IgdGhyZWUgCi0gKiAgICAgICAgICAgIHJldHVybiBNVnMuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0TVZQcmVkIC0gcG9pbnRlciB0byB0aGUgcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3IgCi0gKiAgIHBEc3RNVlByZWRNRSAtIGlmIG5vbi1OVUxMIHVwb24gaW5wdXQgdGhlbiBwRHN0TVZQcmVkTUUgIHBvaW50cyB1cG9uIAotICogICAgICAgICAgICByZXR1cm4gdG8gYSBidWZmZXIgY29udGFpbmluZyB0aGUgdGhyZWUgbW90aW9uIHZlY3RvciBjYW5kaWRhdGVzIAotICogICAgICAgICAgICB1c2VkIGZvciBwcmVkaWN0aW9uIGFzIHNwZWNpZmllZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSAKLSAqICAgICAgICAgICAgNy42LjUsIG90aGVyd2lzZSBpZiBOVUxMIHVwb24gaW5wdXQgdGhlbiBwRHN0TVZQcmVkTUUgaXMgTlVMTCAKLSAqICAgICAgICAgICAgdXBvbiBvdXRwdXQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKLSAqICAgIC0gICAgdGhlIHBvaW50ZXIgcERzdE1WUHJlZCBpcyBOVUxMIAotICogICAgLSAgICB0aGUgcGFyYW1ldGVyIGlCbGsgZG9lcyBub3QgZmFsbCBpbnRvIHRoZSByYW5nZSAwIDw9IGlCbGs8PTMgCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDJfRmluZE1WcHJlZCgKLSAgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IqIHBTcmNNVkN1ck1CLAotICAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciogcFNyY0NhbmRNVjEsCi0gICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yKiBwU3JjQ2FuZE1WMiwKLSAgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IqIHBTcmNDYW5kTVYzLAotICAgICBPTVhWQ01vdGlvblZlY3RvciogcERzdE1WUHJlZCwKLSAgICAgT01YVkNNb3Rpb25WZWN0b3IqIHBEc3RNVlByZWRNRSwKLSAgICAgT01YX0lOVCBpQmxrCi0gKQotewotICAgIE9NWFZDTW90aW9uVmVjdG9yIENhbmRNVjsKLQljb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcENhbmRNVjE7Ci0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBDYW5kTVYyOwotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwQ2FuZE1WMzsKLSAgICAKLSAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KLQlhcm1SZXRBcmdFcnJJZihpQmxrIT0wICYmIHBTcmNNVkN1ck1CID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0TVZQcmVkID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoaUJsayA8IDApIHx8IChpQmxrID4gMyksIE9NWF9TdHNfQmFkQXJnRXJyKTsgCi0KLSAgICBDYW5kTVYuZHggPSBDYW5kTVYuZHkgPSAwOwotCS8qIEJhc2VkIG9uIHRoZSBwb3NpdGlvbiBvZiB0aGUgYmxvY2sgZXh0cmFjdCB0aGUgbW90aW9uIHZlY3RvcnMgYW5kCi0gICAgICAgdGhlIHRyYW5wZXJhbmN5IHN0YXR1cyAqLwotICAgCi0gICAgCi0gICAgLyogU2V0IHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGVzZSB0byBiZSB1c2VkIGlmIHBTcmNDYW5kTVZbMXwyfDNdID09IE5VTEwgKi8KLSAgICBwQ2FuZE1WMSA9IHBDYW5kTVYyID0gcENhbmRNVjMgPSAmQ2FuZE1WOwotCi0gICAgCi0gICAgc3dpdGNoIChpQmxrKQotICAgIHsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZihwU3JjQ2FuZE1WMSAhPSBOVUxMKQotICAgICAgICAgICAgewotCQkJICAgIHBDYW5kTVYxID0gJnBTcmNDYW5kTVYxWzFdOwotCQkJfQotCQkJaWYocFNyY0NhbmRNVjIgIT0gTlVMTCkKLSAgICAgICAgICAgIHsKLQkJCQlwQ2FuZE1WMiA9ICZwU3JjQ2FuZE1WMlsyXTsKLQkJCX0KLQkJCWlmKHBTcmNDYW5kTVYzICE9IE5VTEwpCi0gICAgICAgICAgICB7Ci0JCQkJcENhbmRNVjMgPSAmcFNyY0NhbmRNVjNbMl07Ci0JCQl9Ci0JCQlpZiAoKHBTcmNDYW5kTVYxID09IE5VTEwpICYmIChwU3JjQ2FuZE1WMiA9PSBOVUxMKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQ2FuZE1WMSA9IHBDYW5kTVYyID0gcENhbmRNVjM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKChwU3JjQ2FuZE1WMSA9PSBOVUxMKSAmJiAocFNyY0NhbmRNVjMgPT0gTlVMTCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcENhbmRNVjEgPSBwQ2FuZE1WMyA9IHBDYW5kTVYyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZigocFNyY0NhbmRNVjIgPT0gTlVMTCkgJiYgKHBTcmNDYW5kTVYzID09IE5VTEwpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBDYW5kTVYyID0gcENhbmRNVjMgPSBwQ2FuZE1WMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgewotICAgICAgICAgICAgcENhbmRNVjEgPSAmcFNyY01WQ3VyTUJbMF07Ci0JCQlpZihwU3JjQ2FuZE1WMiAhPSBOVUxMKQotICAgICAgICAgICAgewotCQkJCXBDYW5kTVYyID0gJnBTcmNDYW5kTVYyWzNdOwotCQkJfQotCQkJaWYocFNyY0NhbmRNVjMgIT0gTlVMTCkKLSAgICAgICAgICAgIHsKLQkJCQlwQ2FuZE1WMyA9ICZwU3JjQ2FuZE1WM1syXTsKLQkJCX0KLQkJCWlmKChwU3JjQ2FuZE1WMiA9PSBOVUxMKSAmJiAocFNyY0NhbmRNVjMgPT0gTlVMTCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcENhbmRNVjIgPSBwQ2FuZE1WMyA9IHBDYW5kTVYxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSAyOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZihwU3JjQ2FuZE1WMSAhPSBOVUxMKQotICAgICAgICAgICAgewotCQkJCXBDYW5kTVYxID0gJnBTcmNDYW5kTVYxWzNdOwotCQkJfQotCQkJcENhbmRNVjIgPSAmcFNyY01WQ3VyTUJbMF07Ci0JCQlwQ2FuZE1WMyA9ICZwU3JjTVZDdXJNQlsxXTsKLQkJCWJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgMzoKLSAgICAgICAgewotICAgICAgICAgICAgcENhbmRNVjEgPSAmcFNyY01WQ3VyTUJbMl07Ci0JCQlwQ2FuZE1WMiA9ICZwU3JjTVZDdXJNQlswXTsKLQkJCXBDYW5kTVYzID0gJnBTcmNNVkN1ck1CWzFdOwotCQkJYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBGaW5kIHRoZSBtZWRpYW4gb2YgdGhlIDMgY2FuZGlkYXRlIE1WJ3MgKi8KLSAgICBwRHN0TVZQcmVkLT5keCA9IGFybU1lZGlhbk9mMyAocENhbmRNVjEtPmR4LCBwQ2FuZE1WMi0+ZHgsIHBDYW5kTVYzLT5keCk7Ci0gICAgcERzdE1WUHJlZC0+ZHkgPSBhcm1NZWRpYW5PZjMgKHBDYW5kTVYxLT5keSwgcENhbmRNVjItPmR5LCBwQ2FuZE1WMy0+ZHkpOwotICAgICAgICAKLSAgICBpZiAocERzdE1WUHJlZE1FICE9IE5VTEwpCi0gICAgewotICAgICAgICAvKiBTdG9yZSB0aGUgY2FuZGlkYXRlIE1WJ3MgaW50byB0aGUgcERzdE1WUHJlZE1FLCB0aGVzZSBjYW4gYmUgdXNlZAotICAgICAgICAgICBpbiB0aGUgZmFzdCBhbGdvcml0aG0gaWYgaW1wbGVtZW50ZWQgKi8KLSAgICAgICAgcERzdE1WUHJlZE1FWzBdLmR4ID0gcENhbmRNVjEtPmR4OwotICAgICAgICBwRHN0TVZQcmVkTUVbMF0uZHkgPSBwQ2FuZE1WMS0+ZHk7Ci0gICAgICAgIHBEc3RNVlByZWRNRVsxXS5keCA9IHBDYW5kTVYyLT5keDsKLSAgICAgICAgcERzdE1WUHJlZE1FWzFdLmR5ID0gcENhbmRNVjItPmR5OwotICAgICAgICBwRHN0TVZQcmVkTUVbMl0uZHggPSBwQ2FuZE1WMy0+ZHg7Ci0gICAgICAgIHBEc3RNVlByZWRNRVsyXS5keSA9IHBDYW5kTVYzLT5keTsKLSAgICB9Ci0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotCi0vKiBFbmQgb2YgZmlsZSAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9JRENUOHg4YmxrLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9JRENUOHg4YmxrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1MTI0NTguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfSURDVDh4OGJsay5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfSURDVDh4OGJsay5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb250YWlucyBtb2R1bGVzIGZvciA4eDggYmxvY2sgSURDVAotICogCi0gKi8KLQotCi0jaW5jbHVkZSA8bWF0aC5oPgotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQ000UDJfRENUX1RhYmxlLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfSURDVDh4OGJsayAgICg2LjIuMy4yLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb21wdXRlcyBhIDJEIGludmVyc2UgRENUIGZvciBhIHNpbmdsZSA4eDggYmxvY2ssIGFzIGRlZmluZWQgaW4gCi0gKiBbSVNPMTQ0OTYtMl0uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZWFybHkgYXJyYW5nZWQgSURDVCBpbnB1dCBidWZmZXI7IAotICogICAgICAgICAgICBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgQWNjb3JkaW5nIHRvIAotICogICAgICAgICAgICBbSVNPMTQ0OTYtMl0sIHRoZSBpbnB1dCBjb2VmZmljaWVudCB2YWx1ZXMgc2hvdWxkIGxpZSB3aXRoaW4gdGhlIAotICogICAgICAgICAgICByYW5nZSBbLTIwNDgsIDIwNDddLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lYXJseSBhcnJhbmdlZCBJRENUIG91dHB1dCBidWZmZXI7IAotICogICAgICAgICAgICBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKLSAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIE5VTEwuIAotICogICAgLSAgICBwU3JjIG9yIHBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0lEQ1Q4eDhibGsgKGNvbnN0IE9NWF9TMTYgKnBTcmMsIE9NWF9TMTYgKnBEc3QpCi17Ci0gICAgT01YX0lOVCB4LCB5LCB1LCB2OwotCi0gICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoIWFybUlzMTZCeXRlQWxpZ25lZChwU3JjKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCFhcm1JczE2Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQotICAgIGZvciAoeCA9IDA7IHggPCA4OyB4KyspCi0gICAgewotICAgICAgICBmb3IgKHkgPSAwOyB5IDwgODsgeSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBPTVhfRjY0IHN1bSA9IDAuMDsKLSAgICAgICAgICAgIGZvciAodSA9IDA7IHUgPCA4OyB1KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yICh2ID0gMDsgdiA8IDg7IHYrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN1bSArPSBwU3JjWyh1ICogOCkgKyB2XSAqCi0gICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfcHJlQ2FsY0RDVENvc1t4XVt1XSAqCi0gICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfcHJlQ2FsY0RDVENvc1t5XVt2XTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwRHN0Wyh4ICogOCkgKyB5XSA9IChPTVhfUzE2KSBmbG9vcihzdW0gKyAwLjUpOwotCi0gICAgICAgICAgICAvKiBTYXR1cmF0ZSB0byBbLTI1NiwgMjU1XSAqLwotICAgICAgICAgICAgcERzdFsoeCAqIDgpICsgeV0gPSBhcm1DbGlwICgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTI1NiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjU1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRHN0Wyh4ICogOCkgKyB5XSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotLyogRW5kIG9mIGZpbGUgKi8KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9NQ1JlY29uQmxvY2suYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX01DUmVjb25CbG9jay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2YwY2Y1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX01DUmVjb25CbG9jay5jCisrKyAvZGV2L251bGwKQEAgLTEsMzcyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfTUNSZWNvbkJsb2NrLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogTVBFRzQgbW90aW9uIGNvbXBlbnNhdGlvbiBwcmVkaWN0aW9uIGZvciBhbiA4eDggYmxvY2sgdXNpbmcgCi0gKiBpbnRlcnBvbGF0aW9uCi0gKiAKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX0hhbGZQZWxWZXIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGhhbGYgcGVsIG1vdGlvbiBjb21wZW5zYXRpb24gZm9yIGFuIDh4OCBibG9jayB1c2luZyB2ZXJ0aWNhbCAKLSAqIGludGVycG9sYXRpb24gZGVzY3JpYmVkIGluIElTTy9JRUMgMTQ0OTYtMiwgc3ViY2xhdXNlIDcuNi4yLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gcFNyYyAgICAgICAgcG9pbnRlciB0byB0aGUgYmxvY2sgaW4gdGhlIHJlZmVyZW5jZSBwbGFuZS4KLSAqIFtpbl0gc3JjU3RlcCAgICAgZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnQgb2YgY29uc2VjdXRpdmUgbGluZXMKLSAqICAgICAgICAgICAgICAgICAgaW4gdGhlIHJlZmVyZW5jZSBwbGFuZSwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZQotICogICAgICAgICAgICAgICAgICBvZiA4LgotICogW2luXSBybmRWYWwgICAgICByb3VuZGluZyBjb250cm9sIHBhcmFtZXRlcjogMCAtIGRpc2FibGVkOyAxIC0gZW5hYmxlZC4KLSAqIFtvdXRdIHBEc3QgICAgICAgcG9pbnRlciB0byB0aGUgbGluYWVyIDh4OCBkZXN0aW5hdGlvbiBidWZmZXI7Ci0gKgotICovCi1zdGF0aWMgT01YVm9pZCBhcm1WQ000UDJfSGFsZlBlbFZlcigKLSAgICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKLSAgICAgIE9NWF9JTlQgc3JjU3RlcCwgCi0gICAgICBPTVhfVTggKnBEc3QsCi0gICAgICBPTVhfSU5UIHJuZFZhbCkKLXsKLSAgY29uc3QgT01YX1U4ICpwVGVtcFNyYzE7Ci0gIGNvbnN0IE9NWF9VOCAqcFRlbXBTcmMyOwotICBPTVhfSU5UIHksIHg7Ci0gIAotICBwVGVtcFNyYzEgPSBwU3JjOyAgCi0gIHBUZW1wU3JjMiA9IHBTcmMgKyBzcmNTdGVwOwotICBzcmNTdGVwIC09IDg7Ci0gIGZvciAoeSA9IDA7IHkgPCA4OyB5KyspCi0gIHsKLSAgICBmb3IgKHggPSAwOyB4IDwgODsgeCsrKQotICAgIHsKLSAgICAgICpwRHN0KysgPSAoKCpwVGVtcFNyYzErKyArICpwVGVtcFNyYzIrKykgKyAxIC0gcm5kVmFsKSA+PiAxOwotICAgIH0KLSAgICBwVGVtcFNyYzEgKz0gc3JjU3RlcDsKLSAgICBwVGVtcFNyYzIgKz0gc3JjU3RlcDsKLSAgfQotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfSGFsZlBlbEhvcgotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgaGFsZiBwZWwgbW90aW9uIGNvbXBlbnNhdGlvbiBmb3IgYW4gOHg4IGJsb2NrIHVzaW5nIGhvcml6b250YWwgCi0gKiBpbnRlcnBvbGF0aW9uIGRlc2NyaWJlZCBpbiBJU08vSUVDIDE0NDk2LTIsIHN1YmNsYXVzZSA3LjYuMi4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHBTcmMgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJsb2NrIGluIHRoZSByZWZlcmVuY2UgcGxhbmUuCi0gKiBbaW5dIHNyY1N0ZXAgICAgIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGNvbnNlY3V0aXZlIGxpbmVzCi0gKiAgICAgICAgICAgICAgICAgIGluIHRoZSByZWZlcmVuY2UgcGxhbmUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUKLSAqICAgICAgICAgICAgICAgICAgb2YgOC4KLSAqIFtpbl0gcm5kVmFsICAgICAgcm91bmRpbmcgY29udHJvbCBwYXJhbWV0ZXI6IDAgLSBkaXNhYmxlZDsgMSAtIGVuYWJsZWQuCi0gKiBbb3V0XSBwRHN0ICAgICAgIHBvaW50ZXIgdG8gdGhlIGxpbmFlciA4eDggZGVzdGluYXRpb24gYnVmZmVyOwotICoKLSAqLwotc3RhdGljIE9NWFZvaWQgYXJtVkNNNFAyX0hhbGZQZWxIb3IoCi0gICAgICBjb25zdCBPTVhfVTggKnBTcmMsCi0gICAgICBPTVhfSU5UIHNyY1N0ZXAsIAotICAgICAgT01YX1U4ICpwRHN0LAotICAgICAgT01YX0lOVCBybmRWYWwpCi17Ci0gIGNvbnN0IE9NWF9VOCAqcFRlbXBTcmMxOwotICBjb25zdCBPTVhfVTggKnBUZW1wU3JjMjsKLSAgT01YX0lOVCB5LCB4OwotICAKLSAgcFRlbXBTcmMxID0gcFNyYzsKLSAgcFRlbXBTcmMyID0gcFRlbXBTcmMxICsgMTsKLQotICBzcmNTdGVwIC09IDg7Ci0gIGZvciAoeT0wOyB5PDg7IHkrKykKLSAgewotICAgIGZvciAoeD0wOyB4PDg7IHgrKykKLSAgICB7Ci0gICAgICAqcERzdCsrID0gKCgqcFRlbXBTcmMxKysgKyAqcFRlbXBTcmMyKyspICsgMSAtIHJuZFZhbCkgPj4gMTsKLSAgICB9Ci0gICAgcFRlbXBTcmMxICs9IHNyY1N0ZXA7Ci0gICAgcFRlbXBTcmMyICs9IHNyY1N0ZXA7Ci0gIH0KLX0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfSGFsZlBlbFZlckhvcgotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgaGFsZiBwZWwgbW90aW9uIGNvbXBlbnNhdGlvbiBmb3IgYW4gOHg4IGJsb2NrIHVzaW5nIGJvdGggCi0gKiBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uIGRlc2NyaWJlZCBpbiBJU08vSUVDIDE0NDk2LTIsCi0gKiBzdWJjbGF1c2UgNy42LjIuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBwU3JjICAgICAgICBwb2ludGVyIHRvIHRoZSBibG9jayBpbiB0aGUgcmVmZXJlbmNlIHBsYW5lLgotICogW2luXSBzcmNTdGVwICAgICBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydCBvZiBjb25zZWN1dGl2ZSBsaW5lcwotICogICAgICAgICAgICAgICAgICBpbiB0aGUgcmVmZXJlbmNlIHBsYW5lLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlCi0gKiAgICAgICAgICAgICAgICAgIG9mIDguCi0gKiBbaW5dIHJuZFZhbCAgICAgIHJvdW5kaW5nIGNvbnRyb2wgcGFyYW1ldGVyOiAwIC0gZGlzYWJsZWQ7IDEgLSBlbmFibGVkLgotICogW291dF0gcERzdCAgICAgICBwb2ludGVyIHRvIHRoZSBsaW5hZXIgOHg4IGRlc3RpbmF0aW9uIGJ1ZmZlcjsKLSAqCi0gKi8KLXN0YXRpYyBPTVhWb2lkIGFybVZDTTRQMl9IYWxmUGVsVmVySG9yKAotICAgICAgY29uc3QgT01YX1U4ICpwU3JjLAotICAgICAgT01YX0lOVCBzcmNTdGVwLCAKLSAgICAgIE9NWF9VOCAqcERzdCwKLSAgICAgIE9NWF9JTlQgcm5kVmFsKQotewotICBjb25zdCBPTVhfVTggKnBUZW1wU3JjMTsKLSAgY29uc3QgT01YX1U4ICpwVGVtcFNyYzI7Ci0gIGNvbnN0IE9NWF9VOCAqcFRlbXBTcmMzOwotICBjb25zdCBPTVhfVTggKnBUZW1wU3JjNDsKLSAgT01YX0lOVCB5LCB4OwotCi0gIHBUZW1wU3JjMSA9IHBTcmM7Ci0gIHBUZW1wU3JjMiA9IHBTcmMgKyBzcmNTdGVwOwotICBwVGVtcFNyYzMgPSBwU3JjICsgMTsKLSAgcFRlbXBTcmM0ID0gcFNyYyArIHNyY1N0ZXAgKyAxOwotCi0gIHNyY1N0ZXAgLT0gODsKLSAgZm9yICh5PTA7IHk8ODsgeSsrKQotICB7Ci0gICAgZm9yICh4PTA7IHg8ODsgeCsrKQotCXsKLQkgICpwRHN0KysgPSAoKCpwVGVtcFNyYzErKyArICpwVGVtcFNyYzIrKyArICpwVGVtcFNyYzMrKyArICpwVGVtcFNyYzQrKykgKyAKLQkgICAgICAgICAgICAgICAgICAyIC0gcm5kVmFsKSA+PiAyOwotCX0KLSAgICBwVGVtcFNyYzEgKz0gc3JjU3RlcDsKLSAgICBwVGVtcFNyYzIgKz0gc3JjU3RlcDsKLSAgICBwVGVtcFNyYzMgKz0gc3JjU3RlcDsKLSAgICBwVGVtcFNyYzQgKz0gc3JjU3RlcDsKLSAgfQotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfTUNSZWNvbkJsb2NrX05vUmVzCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBEbyBtb3Rpb24gY29tcGVuc2F0aW9uIGFuZCBjb3B5IHRoZSByZXN1bHQgdG8gdGhlIGN1cnJlbnQgYmxvY2suCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBwU3JjICAgICAgICBwb2ludGVyIHRvIHRoZSBibG9jayBpbiB0aGUgcmVmZXJlbmNlIHBsYW5lLgotICogW2luXSBzcmNTdGVwICAgICBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydCBvZiBjb25zZWN1dGl2ZSBsaW5lcwotICogICAgICAgICAgICAgICAgICBpbiB0aGUgcmVmZXJlbmNlIHBsYW5lLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlCi0gKiAgICAgICAgICAgICAgICAgIG9mIDguCi0gKiBbaW5dIGRzdFN0ZXAgICAgIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZQotICogICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbiBwbGFuZSwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LgotICogW2luXSBwcmVkaWN0VHlwZSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIHR5cGUsIGFzIGRlZmluZWQgaW4gc2VjdGlvbiA2LjIuMS4yLgotICogW2luXSBybmRWYWwgICAgICByb3VuZGluZyBjb250cm9sIHBhcmFtZXRlcjogMCAtIGRpc2FibGVkOyAxIC0gZW5hYmxlZC4KLSAqIFtvdXRdIHBEc3QgICAgICAgcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIDgtYnl0ZSBhbGlnbmVkLgotICogICAgICAgICAgICAgICAgICBJZiBwcmVkaWN0aW9uIHJlc2lkdWFscyBhcmUgYWRkZWQgdGhlbiBvdXRwdXQgaW50ZW5zaXRpZXMKLSAqICAgICAgICAgICAgICAgICAgYXJlIGNsaXBwZWQgdG8gdGhlIHJhbmdlIFswLDI1NV0uCi0gKgotICovCi1zdGF0aWMgT01YVm9pZCBhcm1WQ000UDJfTUNSZWNvbkJsb2NrX05vUmVzKAotICAgICAgY29uc3QgT01YX1U4ICpwU3JjLCAKLSAgICAgIE9NWF9JTlQgc3JjU3RlcCwKLSAgICAgIE9NWF9VOCAqcERzdCwKLSAgICAgIE9NWF9JTlQgZHN0U3RlcCkKLXsKLSAgICBPTVhfVTggeCx5LGNvdW50LGluZGV4OwotICAgIAotICAgIC8qIENvcHlpbmcgdGhlIHJlZiA4eDggYmxrIHRvIHRoZSBjdXJyIGJsayAqLwotICAgIGZvciAoeSA9IDAsIGNvdW50ID0gMCwgaW5kZXggPSAwOyB5IDwgODsgeSsrLGluZGV4ICs9IChzcmNTdGVwIC04KSwgY291bnQgKz0gKGRzdFN0ZXAgLSA4KSkKLSAgICB7Ci0gICAgICAgIGZvciAoeCA9IDA7IHggPCA4OyB4KyssIGNvdW50KyssaW5kZXgrKykKLSAgICAgICAgewotICAgICAgICAgICAgcERzdFtjb3VudF0gPSBwU3JjW2luZGV4XTsKLSAgICAgICAgfSAgICAgICAKLSAgICB9Ci19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9NQ1JlY29uQmxvY2tfUmVzCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBSZWNvbnN0cnVjdHMgSU5URVIgYmxvY2sgYnkgc3VtbWluZyB0aGUgbW90aW9uIGNvbXBlbnNhdGlvbiByZXN1bHRzCi0gKiBhbmQgdGhlIHJlc3VsdHMgb2YgdGhlIGludmVyc2UgdHJhbnNmb3JtYXRpb24gKHByZWRpY3Rpb24gcmVzaWR1YWxzKS4KLSAqIE91dHB1dCBpbnRlbnNpdGllcyBhcmUgY2xpcHBlZCB0byB0aGUgcmFuZ2UgWzAsMjU1XS4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHBTcmMgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJsb2NrIGluIHRoZSByZWZlcmVuY2UgcGxhbmUuCi0gKiBbaW5dIHBTcmNSZXNpZHVlIHBvaW50ZXIgdG8gYSBidWZmZXIgY29udGFpbmluZyB0aGUgMTYtYml0IHByZWRpY3Rpb24KLSAqICAgICAgICAgICAgICAgICAgcmVzaWR1YWxzLiBJZiB0aGUgcG9pbnRlciBpcyBOVUxMLHRoZW4gbm8gcHJlZGljdGlvbgotICogICAgICAgICAgICAgICAgICBpcyBkb25lLCBvbmx5IG1vdGlvbiBjb21wZW5zYXRpb24sIGkuZS4sIHRoZSBibG9jayBpcwotICogICAgICAgICAgICAgICAgICBtb3ZlZCB3aXRoIGludGVycG9sYXRpb24uCi0gKiBbaW5dIGRzdFN0ZXAgICAgIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZQotICogICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbiBwbGFuZSwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LgotICogW291dF0gcERzdCAgICAgICBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgOC1ieXRlIGFsaWduZWQuCi0gKiAgICAgICAgICAgICAgICAgIElmIHByZWRpY3Rpb24gcmVzaWR1YWxzIGFyZSBhZGRlZCB0aGVuIG91dHB1dCBpbnRlbnNpdGllcwotICogICAgICAgICAgICAgICAgICBhcmUgY2xpcHBlZCB0byB0aGUgcmFuZ2UgWzAsMjU1XS4KLSAqCi0gKi8KLXN0YXRpYyBPTVhWb2lkIGFybVZDTTRQMl9NQ1JlY29uQmxvY2tfUmVzKAotICAgICAgY29uc3QgT01YX1U4ICpwU3JjLCAKLSAgICAgIGNvbnN0IE9NWF9TMTYgKnBTcmNSZXNpZHVlLAotICAgICAgT01YX1U4ICpwRHN0LAotICAgICAgT01YX0lOVCBkc3RTdGVwKQotewotICAgICAgCi0gIE9NWF9VOCB4LHk7Ci0gIE9NWF9JTlQgdGVtcDsKLSAgCi0gIGZvcih5ID0gMDsgeSA8IDg7IHkrKykKLSAgewotICAgIGZvcih4ID0gMDsgeCA8IDg7IHgrKykKLSAgICB7Ci0gICAgICB0ZW1wID0gcFNyY1t4XSArIHBTcmNSZXNpZHVlW3hdOyAgICAgICAgIAotICAgICAgcERzdFt4XSA9IGFybUNsaXAoMCwyNTUsdGVtcCk7Ci0gICAgfQotICAgIHBEc3QgKz0gZHN0U3RlcDsKLSAgICBwU3JjICs9IDg7Ci0gICAgcFNyY1Jlc2lkdWUgKz0gODsKLSAgfQotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX01DUmVjb25CbG9jayAgICg2LjIuNS41LjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBtb3Rpb24gY29tcGVuc2F0aW9uIHByZWRpY3Rpb24gZm9yIGFuIDh4OCBibG9jayB1c2luZyAKLSAqIGludGVycG9sYXRpb24gZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi4yLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgYmxvY2sgaW4gdGhlIHJlZmVyZW5jZSBwbGFuZS4gCi0gKiAgIHNyY1N0ZXAgLSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydCBvZiBjb25zZWN1dGl2ZSBsaW5lcyBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJlZmVyZW5jZSBwbGFuZSwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgZHN0U3RlcCAtIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZSAKLSAqICAgICAgICAgICAgZGVzdGluYXRpb24gcGxhbmUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIHBTcmNSZXNpZHVlIC0gcG9pbnRlciB0byBhIGJ1ZmZlciBjb250YWluaW5nIHRoZSAxNi1iaXQgcHJlZGljdGlvbiAKLSAqICAgICAgICAgICAgcmVzaWR1YWxzOyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gSWYgdGhlIHBvaW50ZXIgaXMgTlVMTCwgdGhlbiAKLSAqICAgICAgICAgICAgbm8gcHJlZGljdGlvbiBpcyBkb25lLCBvbmx5IG1vdGlvbiBjb21wZW5zYXRpb24sIGkuZS4sIHRoZSBibG9jayAKLSAqICAgICAgICAgICAgaXMgbW92ZWQgd2l0aCBpbnRlcnBvbGF0aW9uLiAKLSAqICAgcHJlZGljdFR5cGUgLSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIHR5cGUsIGFzIGRlZmluZWQgaW4gc2VjdGlvbiAKLSAqICAgICAgICAgICAgNi4yLjEuMi4gCi0gKiAgIHJuZFZhbCAtIHJvdW5kaW5nIGNvbnRyb2wgcGFyYW1ldGVyOiAwIC0gZGlzYWJsZWQ7IDEgLSBlbmFibGVkLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4gIElmIAotICogICAgICAgICAgICBwcmVkaWN0aW9uIHJlc2lkdWFscyBhcmUgYWRkZWQgdGhlbiBvdXRwdXQgaW50ZW5zaXRpZXMgYXJlIAotICogICAgICAgICAgICBjbGlwcGVkIHRvIHRoZSByYW5nZSBbMCwyNTVdLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCi0gKiAgICAtICAgIHBEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgcFNyY1Jlc2lkdWUgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYyBvciBwRHN0LiAKLSAqICAgIC0gICAgZWl0aGVyIHNyY1N0ZXAgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgIC0gICAgaW52YWxpZCB0eXBlIHNwZWNpZmllZCBmb3IgdGhlIHBhcmFtZXRlciBwcmVkaWN0VHlwZS4gCi0gKiAgICAtICAgIHRoZSBwYXJhbWV0ZXIgcm5kVmFsIGlzIG5vdCBlcXVhbCBlaXRoZXIgdG8gMCBvciAxLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfTUNSZWNvbkJsb2NrKAotCQljb25zdCBPTVhfVTggKnBTcmMsCi0JCU9NWF9JTlQgc3JjU3RlcCwKLQkJY29uc3QgT01YX1MxNiAqcFNyY1Jlc2lkdWUsCi0JCU9NWF9VOCAqcERzdCwgCi0JCU9NWF9JTlQgZHN0U3RlcCwKLQkJT01YX0lOVCBwcmVkaWN0VHlwZSwKLQkJT01YX0lOVCBybmRWYWwpCi17Ci0gICAgLyogRGVmaW5pdGlvbnMgYW5kIEluaXRpYWxpemF0aW9ucyovCi0gICAgT01YX1U4IHBUZW1wRHN0WzY0XTsKLSAgICAKLSAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZighYXJtSXM4Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZighYXJtSXMxNkJ5dGVBbGlnbmVkKHBTcmNSZXNpZHVlKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCgoZHN0U3RlcCAlIDgpIHx8IChzcmNTdGVwICUgOCkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKChwcmVkaWN0VHlwZSAhPSBPTVhfVkNfSU5URUdFUl9QSVhFTCkgJiYKLSAgICAgICAgICAgICAgICAgICAgKHByZWRpY3RUeXBlICE9IE9NWF9WQ19IQUxGX1BJWEVMX1gpICYmCi0gICAgICAgICAgICAgICAgICAgIChwcmVkaWN0VHlwZSAhPSBPTVhfVkNfSEFMRl9QSVhFTF9ZKSAmJgotICAgICAgICAgICAgICAgICAgICAocHJlZGljdFR5cGUgIT0gT01YX1ZDX0hBTEZfUElYRUxfWFkpCi0gICAgICAgICAgICAgICAgICAgKSxPTVhfU3RzX0JhZEFyZ0Vycik7IAotICAgIGFybVJldEFyZ0VycklmKCgocm5kVmFsICE9IDApICYmIChybmRWYWwgIT0gMSkpLE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICAKLSAgICBzd2l0Y2gocHJlZGljdFR5cGUpCi0gICAgewotICAgICAgICBjYXNlIE9NWF9WQ19JTlRFR0VSX1BJWEVMOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfTUNSZWNvbkJsb2NrX05vUmVzKHBTcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1N0ZXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocFRlbXBEc3RbMF0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT01YX1ZDX0hBTEZfUElYRUxfWDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0hhbGZQZWxIb3IocFNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1N0ZXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHBUZW1wRHN0WzBdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJuZFZhbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9NWF9WQ19IQUxGX1BJWEVMX1k6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IYWxmUGVsVmVyKHBTcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNTdGVwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwVGVtcERzdFswXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybmRWYWwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPTVhfVkNfSEFMRl9QSVhFTF9YWToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0hhbGZQZWxWZXJIb3IocFNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1N0ZXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHBUZW1wRHN0WzBdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJuZFZhbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICAKLSAgICBpZihwU3JjUmVzaWR1ZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFybVZDTTRQMl9NQ1JlY29uQmxvY2tfTm9SZXMoJihwVGVtcERzdFswXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFN0ZXApOyAgICAKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGFybVZDTTRQMl9NQ1JlY29uQmxvY2tfUmVzKCYocFRlbXBEc3RbMF0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNyY1Jlc2lkdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0U3RlcCk7ICAgIAotICAgIH0KLSAgICAKLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUVHZXRCdWZTaXplLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9NRUdldEJ1ZlNpemUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRhODUyZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9NRUdldEJ1ZlNpemUuYworKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfTUVHZXRCdWZTaXplLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIEluaXRpYWxpemF0aW9uIG1vZHVsZXMgZm9yIHRoZSB2ZW5kb3Igc3BlY2lmaWMgTW90aW9uIEVzdGltYXRpb24gc3RydWN0dXJlLgotICogCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybVZDLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX01FR2V0QnVmU2l6ZSAgICg2LjIuNC4xLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb21wdXRlcyB0aGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3BlY2lmaWNhdGlvbiAKLSAqIHN0cnVjdHVyZSBmb3IgdGhlIGZvbGxvd2luZyBtb3Rpb24gZXN0aW1hdGlvbiBmdW5jdGlvbnM6IAotICogQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCwgQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2LCBhbmQgTW90aW9uRXN0aW1hdGlvbk1CLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBNRW1vZGUgLSBtb3Rpb24gZXN0aW1hdGlvbiBtb2RlOyBhdmFpbGFibGUgbW9kZXMgYXJlIGRlZmluZWQgYnkgdGhlIAotICogICAgICAgICAgICBlbnVtZXJhdGVkIHR5cGUgT01YVkNNNFAyTUVNb2RlIAotICogICBwTUVQYXJhbXMgLSBtb3Rpb24gZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU2l6ZSAtIHBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCBmb3IgdGhlIHNwZWNpZmljYXRpb24gCi0gKiAgICAgICAgICAgIHN0cnVjdHVyZSAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYW4gaW52YWxpZCB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciB0aGUgcGFyYW1ldGVyIE1FbW9kZSAKLSAqICAgIC0gICAgYSBuZWdhdGl2ZSBvciB6ZXJvIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSAKLSAqICAgICAgICAgcGFyYW1ldGVyIHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2UgCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDJfTUVHZXRCdWZTaXplKAotICAgIE9NWFZDTTRQMk1FTW9kZSBNRU1vZGUsIAotICAgIGNvbnN0IE9NWFZDTTRQMk1FUGFyYW1zICpwTUVQYXJhbXMsIAotICAgIE9NWF9VMzIgKnBTaXplCi0gICApCi17Ci0gICAgYXJtUmV0QXJnRXJySWYoIXBNRVBhcmFtcywgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCFwU2l6ZSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2UgPD0gMCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChNRU1vZGUgIT0gT01YX1ZDX000UDEwX0ZBU1RfU0VBUkNIKSAmJgotICAgICAgICAgICAgICAgICAgIChNRU1vZGUgIT0gT01YX1ZDX000UDEwX0ZVTExfU0VBUkNIKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIAotICAgICpwU2l6ZSA9IChPTVhfSU5UKSBzaXplb2YoQVJNVkNNNFAyX01FU3BlYyk7Ci0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX01FSW5pdC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUVJbml0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5YzU3YzIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUVJbml0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAyX01FSW5pdC5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBJbml0aWFsaXphdGlvbiBtb2R1bGVzIGZvciB0aGUgdmVuZG9yIHNwZWNpZmljIE1vdGlvbiBFc3RpbWF0aW9uIHN0cnVjdHVyZS4KLSAqIAotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9NRUluaXQgICAoNi4yLjQuMS4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogSW5pdGlhbGl6ZXMgdGhlIHZlbmRvci1zcGVjaWZpYyBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSByZXF1aXJlZCBmb3IgdGhlIAotICogZm9sbG93aW5nIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9uczogIEJsb2NrTWF0Y2hfSW50ZWdlcl84eDgsIAotICogQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2LCBhbmQgTW90aW9uRXN0aW1hdGlvbk1CLiBNZW1vcnkgZm9yIHRoZSAKLSAqIHNwZWNpZmljYXRpb24gc3RydWN0dXJlICpwTUVTcGVjIG11c3QgYmUgYWxsb2NhdGVkIHByaW9yIHRvIGNhbGxpbmcgdGhlIAotICogZnVuY3Rpb24sIGFuZCBzaG91bGQgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIEZvbGxvd2luZyAKLSAqIGluaXRpYWxpemF0aW9uIGJ5IHRoaXMgZnVuY3Rpb24sIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3RydWN0dXJlICpwTUVTcGVjIAotICogc2hvdWxkIGNvbnRhaW4gYW4gaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgcmVwcmVzZW50YXRpb24gb2YgYWxsIG1vdGlvbiAKLSAqIGVzdGltYXRpb24gcGFyYW1ldGVycyByZWNlaXZlZCB2aWEgdGhlIHN0cnVjdHVyZSBwTUVQYXJhbXMsIGZvciBleGFtcGxlICAKLSAqIHJuZFZhbCwgc2VhcmNoUmFuZ2UsIGV0Yy4gIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZSAKLSAqIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIGNhbiBiZSBkZXRlcm1pbmVkIHVzaW5nIHRoZSBmdW5jdGlvbiAKLSAqIG9teFZDTTRQMl9NRUdldEJ1ZlNpemUuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIE1FbW9kZSAtIG1vdGlvbiBlc3RpbWF0aW9uIG1vZGU7IGF2YWlsYWJsZSBtb2RlcyBhcmUgZGVmaW5lZCBieSB0aGUgCi0gKiAgICAgICAgICAgIGVudW1lcmF0ZWQgdHlwZSBPTVhWQ000UDJNRU1vZGUgCi0gKiAgIHBNRVBhcmFtcyAtIG1vdGlvbiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgCi0gKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSB1bmluaXRpYWxpemVkIE1FIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgaW5pdGlhbGl6ZWQgTUUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGFuIGludmFsaWQgdmFsdWUgd2FzIHNwZWNpZmllZCBmb3IgdGhlIHBhcmFtZXRlciBNRW1vZGUgCi0gKiAgICAtICAgIGEgbmVnYXRpdmUgb3IgemVybyB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciB0aGUgCi0gKiAgICAgICAgIHBhcmFtZXRlciBwTUVQYXJhbXMtPnNlYXJjaFJhbmdlIAotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNNNFAyX01FSW5pdCgKLSAgICBPTVhWQ000UDJNRU1vZGUgTUVNb2RlLCAKLSAgICBjb25zdCBPTVhWQ000UDJNRVBhcmFtcyAqcE1FUGFyYW1zLCAKLSAgICB2b2lkICpwTUVTcGVjCi0gICApCi17Ci0gICAgQVJNVkNNNFAyX01FU3BlYyAqYXJtTUVTcGVjID0gKEFSTVZDTTRQMl9NRVNwZWMgKikgcE1FU3BlYzsKLSAgICAKLSAgICBhcm1SZXRBcmdFcnJJZighcE1FUGFyYW1zLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoIXBNRVNwZWMsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoTUVNb2RlICE9IE9NWF9WQ19NNFAyX0ZBU1RfU0VBUkNIKSAmJiAKLSAgICAgICAgICAgICAgICAgICAoTUVNb2RlICE9IE9NWF9WQ19NNFAyX0ZVTExfU0VBUkNIKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2UgPD0gMCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIAotICAgIGFybU1FU3BlYy0+TUVQYXJhbXMuc2VhcmNoRW5hYmxlOHg4ICAgICA9IHBNRVBhcmFtcy0+c2VhcmNoRW5hYmxlOHg4OwotICAgIGFybU1FU3BlYy0+TUVQYXJhbXMuaGFsZlBlbFNlYXJjaEVuYWJsZSA9IHBNRVBhcmFtcy0+aGFsZlBlbFNlYXJjaEVuYWJsZTsKLSAgICBhcm1NRVNwZWMtPk1FUGFyYW1zLnNlYXJjaFJhbmdlICAgICAgICAgPSBwTUVQYXJhbXMtPnNlYXJjaFJhbmdlOyAgICAgICAgCi0gICAgYXJtTUVTcGVjLT5NRVBhcmFtcy5ybmRWYWwgICAgICAgICAgICAgID0gcE1FUGFyYW1zLT5ybmRWYWw7Ci0gICAgYXJtTUVTcGVjLT5NRU1vZGUgICAgICAgICAgICAgICAgICAgICAgID0gTUVNb2RlOwotICAgIAotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTW90aW9uRXN0aW1hdGlvbk1CLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9Nb3Rpb25Fc3RpbWF0aW9uTUIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjliYjI5Ny4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9Nb3Rpb25Fc3RpbWF0aW9uTUIuYworKysgL2Rldi9udWxsCkBAIC0xLDY0NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAyX01vdGlvbkVzdGltYXRpb25NQi5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb250YWlucyBtb2R1bGUgZm9yIG1vdGlvbiBzZWFyY2ggMTZ4MTYgbWFjcm9ibG9jawotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfMTZ4MTYKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIDE2eDE2IGJsb2NrIG1hdGNoIHdyYXBwZXIgZnVuY3Rpb24sIGNhbGxzIG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYuCi0gKiBJZiBoYWxmIHBlbCBzZWFyY2ggaXMgZW5hYmxlZCBpdCBhbHNvIGNhbGxzIG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfMTZ4MTYKLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBTcmNSZWZCdWYJICBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgTUIgdGhhdAotICogICAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50Ci0gKiAgICAgICAgICAgICAgICAgICAgcGxhbmUuCi0gKiBbaW5dCXNyY1JlZlN0ZXAJICB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lCi0gKiBbaW5dCXBSZWZSZWN0CSAgcG9pbnRlciB0byB0aGUgdmFsaWQgcmVjdGFuZ3VsYXIgaW4gcmVmZXJlbmNlIHBsYW5lLiBSZWxhdGl2ZSB0byBpbWFnZSBvcmlnaW4uCi0gKiAgICAgICAgICAgICAgICAgICAgSXQncyBub3QgbGltaXRlZCB0byB0aGUgaW1hZ2UgYm91bmRhcnksIGJ1dCBkZXBlbmRlZCBvbiB0aGUgcGFkZGluZy4gRm9yIGV4YW1wbGUsCi0gKiAgICAgICAgICAgICAgICAgICAgaWYgeW91IHBhZCA0IHBpeGVscyBvdXRzaWRlIHRoZSBpbWFnZSBib3JkZXIsIHRoZW4gdGhlIHZhbHVlIGZvciBsZWZ0IGJvcmRlcgotICogICAgICAgICAgICAgICAgICAgIGNhbiBiZSAtNAotICogW2luXQlwU3JjQ3VyckJ1ZgkgIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBleHRyYWN0ZWQgZnJvbSBvcmlnaW5hbCBwbGFuZSAobGluZWFyIGFycmF5LAotICogICAgICAgICAgICAgICAgICAgIDI1NiBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDE2LWJ5dGUgYm91bmRhcnkuCi0gKiBbaW5dIHBDdXJyUG9pbnRQb3MgcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZQotICogW2luXSBwU3JjUHJlTVYJICBwb2ludGVyIHRvIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yOyBOVUxMIGluZGljYXRlcyBubyBwcmVkaWN0ZWQgTVYKLSAqIFtpbl0gcFNyY1ByZVNBRAkgIHBvaW50ZXIgdG8gU0FEIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJlZGljdGVkIE1WIChyZWZlcmVuY2VkIGJ5IHBTcmNQcmVNVik7IG1heSBiZSBzZXQgdG8gTlVMTCBpZiB1bmF2YWlsYWJsZS4KLSAqIFtpbl0gcE1FU3BlYwkJICB2ZW5kb3Itc3BlY2lmaWMgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmU7IG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZAotICogICAgICAgICAgICAgICAgICAgIGFuZCB0aGVuIGluaXRpYWxpemVkIHVzaW5nIG9teFZDTTRQMl9NRUluaXQgcHJpb3IgdG8gY2FsbGluZyB0aGUgYmxvY2sgbWF0Y2hpbmcKLSAqICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbi4KLSAqIFtvdXRdIHBEc3RNVgkgICAgICBwb2ludGVyIHRvIGVzdGltYXRlZCBNVgotICogW291dF0gcERzdFNBRAkgIHBvaW50ZXIgdG8gbWluaW11bSBTQUQKLSAqICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvcgotICogT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzCi0gKgotICovCi1zdGF0aWMgT01YUmVzdWx0IGFybVZDTTRQMl9CbG9ja01hdGNoXzE2eDE2KAotICAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCi0gICAgIGNvbnN0IE9NWF9JTlQgc3JjUmVmU3RlcCwKLSAgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCi0gICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCi0gICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCi0gICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjUHJlTVYsCi0gICAgIE9NWF9JTlQgKnBTcmNQcmVTQUQsCi0gICAgIHZvaWQgKnBNRVNwZWMsCi0gICAgIE9NWFZDTW90aW9uVmVjdG9yICpwRHN0TVYsCi0gICAgIE9NWF9JTlQgKnBEc3RTQUQKLSkKLXsKLSAgICBPTVhWQ000UDJNRVBhcmFtcyAqcE1FUGFyYW1zID0gKE9NWFZDTTRQMk1FUGFyYW1zICopcE1FU3BlYzsKLSAgICBPTVhfSU5UIHJuZFZhbDsKLSAgICAKLSAgICBybmRWYWwgPSBwTUVQYXJhbXMtPnJuZFZhbDsKLSAgICAKLSAgICBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2KAotICAgICAgICBwU3JjUmVmQnVmLAotICAgICAgICBzcmNSZWZTdGVwLAotICAgICAgICBwUmVmUmVjdCwKLSAgICAgICAgcFNyY0N1cnJCdWYsCi0gICAgICAgIHBDdXJyUG9pbnRQb3MsCi0gICAgICAgIHBTcmNQcmVNViwKLSAgICAgICAgcFNyY1ByZVNBRCwKLSAgICAgICAgcE1FUGFyYW1zLAotICAgICAgICBwRHN0TVYsCi0gICAgICAgIHBEc3RTQUQpOwotICAgIAotICAgIGlmIChwTUVQYXJhbXMtPmhhbGZQZWxTZWFyY2hFbmFibGUpCi0gICAgewotICAgICAgICBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2KAotICAgICAgICAgICAgcFNyY1JlZkJ1ZiwKLSAgICAgICAgICAgIHNyY1JlZlN0ZXAsCi0gICAgICAgICAgICBwUmVmUmVjdCwKLSAgICAgICAgICAgIHBTcmNDdXJyQnVmLAotICAgICAgICAgICAgcEN1cnJQb2ludFBvcywKLSAgICAgICAgICAgIHJuZFZhbCwKLSAgICAgICAgICAgIHBEc3RNViwKLSAgICAgICAgICAgIHBEc3RTQUQpOwotICAgIH0KLSAKLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsgICAgICAgIAotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfQmxvY2tNYXRjaF84eDgKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIDh4OCBibG9jayBtYXRjaCB3cmFwcGVyIGZ1bmN0aW9uLCBjYWxscyBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OC4KLSAqIElmIGhhbGYgcGVsIHNlYXJjaCBpcyBlbmFibGVkIGl0IGFsc28gY2FsbHMgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl84eDgKLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBTcmNSZWZCdWYJICBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgTUIgdGhhdAotICogICAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50Ci0gKiAgICAgICAgICAgICAgICAgICAgcGxhbmUuCi0gKiBbaW5dCXNyY1JlZlN0ZXAJICB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lCi0gKiBbaW5dCXBSZWZSZWN0CSAgcG9pbnRlciB0byB0aGUgdmFsaWQgcmVjdGFuZ3VsYXIgaW4gcmVmZXJlbmNlIHBsYW5lLiBSZWxhdGl2ZSB0byBpbWFnZSBvcmlnaW4uCi0gKiAgICAgICAgICAgICAgICAgICAgSXQncyBub3QgbGltaXRlZCB0byB0aGUgaW1hZ2UgYm91bmRhcnksIGJ1dCBkZXBlbmRlZCBvbiB0aGUgcGFkZGluZy4gRm9yIGV4YW1wbGUsCi0gKiAgICAgICAgICAgICAgICAgICAgaWYgeW91IHBhZCA0IHBpeGVscyBvdXRzaWRlIHRoZSBpbWFnZSBib3JkZXIsIHRoZW4gdGhlIHZhbHVlIGZvciBsZWZ0IGJvcmRlcgotICogICAgICAgICAgICAgICAgICAgIGNhbiBiZSAtNAotICogW2luXQlwU3JjQ3VyckJ1ZgkgIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBleHRyYWN0ZWQgZnJvbSBvcmlnaW5hbCBwbGFuZSAobGluZWFyIGFycmF5LAotICogICAgICAgICAgICAgICAgICAgIDI1NiBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDE2LWJ5dGUgYm91bmRhcnkuCi0gKiBbaW5dIHBDdXJyUG9pbnRQb3MgcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZQotICogW2luXSBwU3JjUHJlTVYJICBwb2ludGVyIHRvIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yOyBOVUxMIGluZGljYXRlcyBubyBwcmVkaWN0ZWQgTVYKLSAqIFtpbl0gcFNyY1ByZVNBRAkgIHBvaW50ZXIgdG8gU0FEIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJlZGljdGVkIE1WIChyZWZlcmVuY2VkIGJ5IHBTcmNQcmVNVik7IG1heSBiZSBzZXQgdG8gTlVMTCBpZiB1bmF2YWlsYWJsZS4KLSAqIFtpbl0gcE1FU3BlYwkJICB2ZW5kb3Itc3BlY2lmaWMgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmU7IG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZAotICogICAgICAgICAgICAgICAgICAgIGFuZCB0aGVuIGluaXRpYWxpemVkIHVzaW5nIG9teFZDTTRQMl9NRUluaXQgcHJpb3IgdG8gY2FsbGluZyB0aGUgYmxvY2sgbWF0Y2hpbmcKLSAqICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbi4KLSAqIFtvdXRdIHBEc3RNVgkgICAgICBwb2ludGVyIHRvIGVzdGltYXRlZCBNVgotICogW291dF0gcERzdFNBRAkgIHBvaW50ZXIgdG8gbWluaW11bSBTQUQKLSAqICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvcgotICogT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzCi0gKgotICovCi1zdGF0aWMgT01YUmVzdWx0IGFybVZDTTRQMl9CbG9ja01hdGNoXzh4OCgKLSAgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAotICAgICBPTVhfSU5UIHNyY1JlZlN0ZXAsCi0gICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAotICAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAotICAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAotICAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY1ByZU1WLAotICAgICBPTVhfSU5UICpwU3JjUHJlU0FELAotICAgICB2b2lkICpwTUVTcGVjLAotICAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0RzdE1WLAotICAgICBPTVhfSU5UICpwRHN0U0FECi0pCi17Ci0gICAgT01YVkNNNFAyTUVQYXJhbXMgKnBNRVBhcmFtcyA9IChPTVhWQ000UDJNRVBhcmFtcyAqKXBNRVNwZWM7Ci0gICAgT01YX0lOVCBybmRWYWw7Ci0gICAgCi0gICAgcm5kVmFsID0gcE1FUGFyYW1zLT5ybmRWYWw7Ci0gICAgCi0gICAgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl84eDgoCi0gICAgICAgIHBTcmNSZWZCdWYsCi0gICAgICAgIHNyY1JlZlN0ZXAsCi0gICAgICAgIHBSZWZSZWN0LAotICAgICAgICBwU3JjQ3VyckJ1ZiwKLSAgICAgICAgcEN1cnJQb2ludFBvcywKLSAgICAgICAgcFNyY1ByZU1WLAotICAgICAgICBwU3JjUHJlU0FELAotICAgICAgICBwTUVQYXJhbXMsCi0gICAgICAgIHBTcmNEc3RNViwKLSAgICAgICAgcERzdFNBRCk7Ci0gICAgCi0gICAgaWYgKHBNRVBhcmFtcy0+aGFsZlBlbFNlYXJjaEVuYWJsZSkKLSAgICB7Ci0gICAgICAgIG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfOHg4KAotICAgICAgICAgICAgcFNyY1JlZkJ1ZiwKLSAgICAgICAgICAgIHNyY1JlZlN0ZXAsCi0gICAgICAgICAgICBwUmVmUmVjdCwKLSAgICAgICAgICAgIHBTcmNDdXJyQnVmLAotICAgICAgICAgICAgcEN1cnJQb2ludFBvcywKLSAgICAgICAgICAgIHJuZFZhbCwKLSAgICAgICAgICAgIHBTcmNEc3RNViwKLSAgICAgICAgICAgIHBEc3RTQUQpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsgICAgICAgIAotfQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfTW90aW9uRXN0aW1hdGlvbk1CICAgKDYuMi40LjMuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIG1vdGlvbiBzZWFyY2ggZm9yIGEgMTZ4MTYgbWFjcm9ibG9jay4gIFNlbGVjdHMgYmVzdCBtb3Rpb24gc2VhcmNoIAotICogc3RyYXRlZ3kgZnJvbSBhbW9uZyBpbnRlci0xTVYsIGludGVyLTRNViwgYW5kIGludHJhIG1vZGVzLiAgU3VwcG9ydHMgCi0gKiBpbnRlZ2VyIGFuZCBoYWxmIHBpeGVsIHJlc29sdXRpb24uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNDdXJyQnVmIC0gcG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjdXJyZW50IE1CIGluIHRoZSAKLSAqICAgICAgICAgICAgb3JpZ2luYWwgcGljdHVyZSBwbGFuZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIAotICogICAgICAgICAgICBUaGUgZnVuY3Rpb24gZG9lcyBub3QgZXhwZWN0IHNvdXJjZSBkYXRhIG91dHNpZGUgdGhlIHJlZ2lvbiAKLSAqICAgICAgICAgICAgYm91bmRlZCBieSB0aGUgTUIgdG8gYmUgYXZhaWxhYmxlOyBmb3IgZXhhbXBsZSBpdCBpcyBub3QgCi0gKiAgICAgICAgICAgIG5lY2Vzc2FyeSBmb3IgdGhlIGNhbGxlciB0byBndWFyYW50ZWUgdGhlIGF2YWlsYWJpbGl0eSBvZiAKLSAqICAgICAgICAgICAgcFNyY0N1cnJCdWZbLVNyY0N1cnJTdGVwXSwgaS5lLiwgdGhlIHJvdyBvZiBwaXhlbHMgYWJvdmUgdGhlIE1CIAotICogICAgICAgICAgICB0byBiZSBwcm9jZXNzZWQuIAotICogICBzcmNDdXJyU3RlcCAtIHdpZHRoIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lLCBpbiB0ZXJtcyBvZiBmdWxsIAotICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgIHBTcmNSZWZCdWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgCi0gKiAgICAgICAgICAgIHBsYW5lIGxvY2F0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IAotICogICAgICAgICAgICBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKiAgIHNyY1JlZlN0ZXAgLSB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBpY3R1cmUgcGxhbmUsIGluIHRlcm1zIG9mIGZ1bGwgCi0gKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgcFJlZlJlY3QgLSByZWZlcmVuY2UgcGxhbmUgdmFsaWQgcmVnaW9uIHJlY3RhbmdsZSwgc3BlY2lmaWVkIHJlbGF0aXZlIHRvIAotICogICAgICAgICAgICB0aGUgaW1hZ2Ugb3JpZ2luIAotICogICBwQ3VyclBvaW50UG9zIC0gcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZSAKLSAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIHZlbmRvci1zcGVjaWZpYyBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIAotICogICAgICAgICAgICBzdHJ1Y3R1cmU7IG11c3QgYmUgYWxsb2NhdGVkIGFuZCB0aGVuIGluaXRpYWxpemVkIHVzaW5nIAotICogICAgICAgICAgICBvbXhWQ000UDJfTUVJbml0IHByaW9yIHRvIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4gCi0gKiAgIHBNQkluZm8gLSBhcnJheSwgb2YgZGltZW5zaW9uIGZvdXIsIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gaW5mb3JtYXRpb24gCi0gKiAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCBmb3VyIG5lYXJieSBNQnM6IAotICogICAgICAgICAgICAtICAgcE1CSW5mb1swXSAtIHBvaW50ZXIgdG8gbGVmdCBNQiBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgLSAgIHBNQkluZm9bMV0gLSBwb2ludGVyIHRvIHRvcCBNQiBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgLSAgIHBNQkluZm9bMl0gLSBwb2ludGVyIHRvIHRvcC1sZWZ0IE1CIGluZm9ybWF0aW9uIAotICogICAgICAgICAgICAtICAgcE1CSW5mb1szXSAtIHBvaW50ZXIgdG8gdG9wLXJpZ2h0IE1CIGluZm9ybWF0aW9uIAotICogICAgICAgICAgICBBbnkgcG9pbnRlciBpbiB0aGUgYXJyYXkgbWF5IGJlIHNldCBlcXVhbCB0byBOVUxMIGlmIHRoZSAKLSAqICAgICAgICAgICAgY29ycmVzcG9uZGluZyBNQiBkb2Vzbid0IGV4aXN0LiAgRm9yIGVhY2ggTUIsIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIAotICogICAgICAgICAgICBtZW1iZXJzIGFyZSB1c2VkOiAgICAKLSAqICAgICAgICAgICAgLSAgIG1iVHlwZSAtIG1hY3JvYmxvY2sgdHlwZSwgZWl0aGVyIE9NWF9WQ19JTlRSQSwgT01YX1ZDX0lOVEVSLCBvciAKLSAqICAgICAgICAgICAgICAgIE9NWF9WQ19JTlRFUjRWIAotICogICAgICAgICAgICAtICAgcE1WMFsyXVsyXSAtIGVzdGltYXRlZCBtb3Rpb24gdmVjdG9yczsgcmVwcmVzZW50ZWQgCi0gKiAgICAgICAgICAgICAgICBpbiAxLzIgcGl4ZWwgdW5pdHMgCi0gKiAgICAgICAgICAgIC0gICBzbGljZUlEIC0gbnVtYmVyIG9mIHRoZSBzbGljZSB0byB3aGljaCB0aGUgTUIgYmVsb25ncyAKLSAqICAgcFNyY0RzdE1CQ3VyciAtIHBvaW50ZXIgdG8gaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciB0aGUgY3VycmVudCBNQi4gIAotICogICAgICAgICAgICBUaGUgZm9sbG93aW5nIGVudHJpZXMgc2hvdWxkIGJlIHNldCBwcmlvciB0byBjYWxsaW5nIHRoZSAKLSAqICAgICAgICAgICAgZnVuY3Rpb246IHNsaWNlSUQgLSB0aGUgbnVtYmVyIG9mIHRoZSBzbGljZSB0aGUgdG8gd2hpY2ggdGhlIAotICogICAgICAgICAgICBjdXJyZW50IE1CIGJlbG9uZ3MuICBUaGUgc3RydWN0dXJlIGVsZW1lbnRzIGNicHkgYW5kIGNicGMgYXJlIAotICogICAgICAgICAgICBpZ25vcmVkLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdE1CQ3VyciAtIHBvaW50ZXIgdG8gdXBkYXRlZCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBjdXJyZW50IAotICogICAgICAgICAgICBNQiBhZnRlciBNQi1sZXZlbCBtb3Rpb24gZXN0aW1hdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQuICBUaGUgCi0gKiAgICAgICAgICAgIGZvbGxvd2luZyBzdHJ1Y3R1cmUgbWVtYmVycyBhcmUgdXBkYXRlZCBieSB0aGUgTUUgZnVuY3Rpb246ICAgCi0gKiAgICAgICAgICAgICAgLSAgbWJUeXBlIC0gbWFjcm9ibG9jayB0eXBlOiBPTVhfVkNfSU5UUkEsIE9NWF9WQ19JTlRFUiwgb3IgCi0gKiAgICAgICAgICAgICAgICAgT01YX1ZDX0lOVEVSNFYuIAotICogICAgICAgICAgICAgIC0gIHBNVjBbMl1bMl0gLSBlc3RpbWF0ZWQgbW90aW9uIHZlY3RvcnM7IHJlcHJlc2VudGVkIGluIAotICogICAgICAgICAgICAgICAgIHRlcm1zIG9mIDEvMiBwZWwgdW5pdHMuIAotICogICAgICAgICAgICAgIC0gIHBNVlByZWRbMl1bMl0gLSBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvcnM7IHJlcHJlc2VudGVkIAotICogICAgICAgICAgICAgICAgIGluIHRlcm1zIG9mIDEvMiBwZWwgdW5pdHMuIAotICogICAgICAgICAgICBUaGUgc3RydWN0dXJlIG1lbWJlcnMgY2JweSBhbmQgY2JwYyBhcmUgbm90IHVwZGF0ZWQgYnkgdGhlIGZ1bmN0aW9uLiAKLSAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gdGhlIG1pbmltdW0gU0FEIGZvciBJTlRFUjFWLCBvciBzdW0gb2YgbWluaW11bSBTQURzIAotICogICAgICAgICAgICBmb3IgSU5URVI0ViAKLSAqICAgcERzdEJsb2NrU0FEIC0gcG9pbnRlciB0byBhbiBhcnJheSBvZiBTQUQgdmFsdWVzIGZvciBlYWNoIG9mIHRoZSBmb3VyIAotICogICAgICAgICAgICA4eDggbHVtYSBibG9ja3MgaW4gdGhlIE1CLiAgVGhlIGJsb2NrIFNBRHMgYXJlIGluIHNjYW4gb3JkZXIgZm9yIAotICogICAgICAgICAgICBlYWNoIE1CLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvciBtb3JlIG9mIHRoZSAKLSAqICAgICAgICAgICAgICBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0N1cnJCdWYsIAotICogICAgICAgICAgICAgIHBTcmNSZWZCdWYsIHBSZWZSZWN0LCBwQ3VyclBvaW50UG9zLCBwTUJJbnRlciwgcE1CSW50cmEsIAotICogICAgICAgICAgICAgIHBTcmNEc3RNQkN1cnIsIG9yIHBEc3RTQUQuIAotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNNNFAyX01vdGlvbkVzdGltYXRpb25NQiAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKLSAgICBPTVhfUzMyIHNyY0N1cnJTdGVwLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKLSAgICBPTVhfUzMyIHNyY1JlZlN0ZXAsCi0gICAgY29uc3QgT01YUmVjdCpwUmVmUmVjdCwKLSAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAotICAgIHZvaWQgKnBNRVNwZWMsCi0gICAgY29uc3QgT01YVkNNNFAyTUJJbmZvUHRyICpwTUJJbmZvLAotICAgIE9NWFZDTTRQMk1CSW5mbyAqcFNyY0RzdE1CQ3VyciwKLSAgICBPTVhfVTE2ICpwRHN0U0FELAotICAgIE9NWF9VMTYgKnBEc3RCbG9ja1NBRAotKQotewotIAotICAgIE9NWF9JTlQgaW50cmFTQUQsIGF2ZXJhZ2UsIGNvdW50LCBpbmRleCwgeCwgeTsKLSAgICBPTVhWQ01vdGlvblZlY3RvciBkc3RNVjE2eDE2OwotICAgIE9NWF9JTlQgICAgICAgICAgIGRzdFNBRDE2eDE2OwotICAgIE9NWF9JTlQgICAgICAgICAgIGRzdFNBRDh4ODsKLSAgICBPTVhWQ000UDJNRVBhcmFtcyAgKnBNRVBhcmFtczsgCi0JT01YVkNNNFAyQ29vcmRpbmF0ZSBUZW1wQ3VyclBvaW50UG9zOyAKLSAgICBPTVhWQ000UDJDb29yZGluYXRlICpwVGVtcEN1cnJQb2ludFBvczsgCi0gICAgT01YX1U4IGFUZW1wU3JjQ3VyckJ1ZlsyNzFdOwotICAgIE9NWF9VOCAqcFRlbXBTcmNDdXJyQnVmOwotICAgIE9NWF9VOCAqcERzdDsKLSAgICBPTVhfVTggYURzdFs3MV07Ci0gICAgT01YX1MzMiBkc3RTdGVwID0gODsKLSAgICBPTVhfSU5UIHByZWRpY3RUeXBlOwotCU9NWF9TMzIgU2FkOwotICAgIGNvbnN0IE9NWF9VOCAqcFRlbXBTcmNSZWZCdWY7Ci0gICAgT01YVkNNb3Rpb25WZWN0b3IqIHBTcmNDYW5kTVYxWzRdOwotICAgIE9NWFZDTW90aW9uVmVjdG9yKiBwU3JjQ2FuZE1WMls0XTsKLSAgICBPTVhWQ01vdGlvblZlY3RvciogcFNyY0NhbmRNVjNbNF07Ci0gICAgICAgIAotICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLwotICAgIGFybVJldEFyZ0VycklmKCFhcm1JczE2Qnl0ZUFsaWduZWQocFNyY0N1cnJCdWYpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0JYXJtUmV0QXJnRXJySWYoIWFybUlzMTZCeXRlQWxpZ25lZChwU3JjUmVmQnVmKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCgoc3JjQ3VyclN0ZXAgJSAxNikgfHwgKHNyY1JlZlN0ZXAgJSAxNikpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0JYXJtUmV0QXJnRXJySWYocFNyY0N1cnJCdWYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotCWFybVJldEFyZ0VycklmKHBTcmNSZWZCdWYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBSZWZSZWN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsgICAgCi0gICAgYXJtUmV0QXJnRXJySWYocEN1cnJQb2ludFBvcyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdE1CQ3VyciA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocERzdFNBRCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgCi0gICAgCi0gICAgcFRlbXBDdXJyUG9pbnRQb3MgPSAmKFRlbXBDdXJyUG9pbnRQb3MpOwotICAgIHBUZW1wU3JjQ3VyckJ1ZiA9IGFybUFsaWduVG8xNkJ5dGVzKGFUZW1wU3JjQ3VyckJ1Zik7Ci0gICAgcE1FUGFyYW1zID0gKE9NWFZDTTRQMk1FUGFyYW1zICopcE1FU3BlYzsKLSAgICBwVGVtcEN1cnJQb2ludFBvcy0+eCA9IHBDdXJyUG9pbnRQb3MtPng7Ci0gICAgcFRlbXBDdXJyUG9pbnRQb3MtPnkgPSBwQ3VyclBvaW50UG9zLT55OwotICAgIHBTcmNEc3RNQkN1cnItPm1iVHlwZSA9IE9NWF9WQ19JTlRFUjsKLSAgICAKLSAgICAvKiBQcmVwYXJpbmcgYSBsaW5lYXIgYnVmZmVyIGZvciBibG9jayBtYXRjaCAqLwotICAgIGZvciAoeSA9IDAsIGluZGV4ID0gY291bnQgPSAwOyB5IDwgMTY7IHkrKywgaW5kZXggKz0gc3JjQ3VyclN0ZXAgLSAxNikKLSAgICB7Ci0gICAgICAgIGZvcih4ID0gMDsgeCA8IDE2OyB4KyssIGNvdW50KyssIGluZGV4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBUZW1wU3JjQ3VyckJ1Zltjb3VudF0gPSBwU3JjQ3VyckJ1ZltpbmRleF07Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZm9yKHkgPSAwLCBpbmRleCA9IDA7IHkgPCAyOyB5KyspCi0gICAgewotICAgICAgICBmb3IoeCA9IDA7IHggPCAyOyB4KyssaW5kZXgrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYoKHBNQkluZm9bMF0gIT0gTlVMTCkgJiYgKHBNQkluZm9bMF0tPm1iVHlwZSAhPSBPTVhfVkNfSU5UUkEpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcFNyY0NhbmRNVjFbaW5kZXhdID0gJihwTUJJbmZvWzBdLT5wTVYwW3ldW3hdKTsgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBwU3JjQ2FuZE1WMVtpbmRleF0gPSBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoKHBNQkluZm9bMV0gIT0gTlVMTCkgJiYgKHBNQkluZm9bMV0tPm1iVHlwZSAhPSBPTVhfVkNfSU5UUkEpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcFNyY0NhbmRNVjJbaW5kZXhdID0gJihwTUJJbmZvWzFdLT5wTVYwW3ldW3hdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHBTcmNDYW5kTVYyW2luZGV4XSA9IE5VTEw7IAotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoKHBNQkluZm9bM10gIT0gTlVMTCkgJiYgKHBNQkluZm9bM10tPm1iVHlwZSAhPSBPTVhfVkNfSU5UUkEpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcFNyY0NhbmRNVjNbaW5kZXhdID0gJihwTUJJbmZvWzNdLT5wTVYwW3ldW3hdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHBTcmNDYW5kTVYzW2luZGV4XSA9IE5VTEw7IAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCS8qIENhbGN1bGF0aW5nIFNBRCBhdCBNVigwLDApICovCi0JYXJtVkNDT01NX1NBRChwVGVtcFNyY0N1cnJCdWYsCi0JCQkJCSAgMTYsCi0JCQkJCSAgcFNyY1JlZkJ1ZiwKLQkJCQkJICBzcmNSZWZTdGVwLAotCQkJCQkgICZTYWQsCi0JCQkJCSAgMTYsCi0JCQkJCSAgMTYpOwotCSpwRHN0U0FEID0gU2FkOwotCi0gICAgLyogTW9kZSBkZWNpc2lvbiBmb3IgTk9UX0NPREVEIE1CICovCi0JaWYoKnBEc3RTQUQgPT0gMCkKLQl7Ci0gICAgICAgIHBTcmNEc3RNQkN1cnItPnBNVjBbMF1bMF0uZHggPSAwOwotICAgICAgICBwU3JjRHN0TUJDdXJyLT5wTVYwWzBdWzBdLmR5ID0gMDsKLSAgICAgICAgKnBEc3RTQUQgICA9IDA7Ci0JCXJldHVybiBPTVhfU3RzX05vRXJyOwotCX0KLQotICAgIG9teFZDTTRQMl9GaW5kTVZwcmVkKAotICAgICAgICAgICAgICAgICAgICAmKHBTcmNEc3RNQkN1cnItPnBNVjBbMF1bMF0pLAotICAgICAgICAgICAgICAgICAgICBwU3JjQ2FuZE1WMVswXSwKLSAgICAgICAgICAgICAgICAgICAgcFNyY0NhbmRNVjJbMF0sCi0gICAgICAgICAgICAgICAgICAgIHBTcmNDYW5kTVYzWzBdLAotICAgICAgICAgICAgICAgICAgICAmKHBTcmNEc3RNQkN1cnItPnBNVlByZWRbMF1bMF0pLAotICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAwKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgLyogSW50ZXIgMSBNViAqLwotICAgIGFybVZDTTRQMl9CbG9ja01hdGNoXzE2eDE2KAotICAgICAgICBwU3JjUmVmQnVmLAotICAgICAgICBzcmNSZWZTdGVwLAotICAgICAgICBwUmVmUmVjdCwKLSAgICAgICAgcFRlbXBTcmNDdXJyQnVmLAotICAgICAgICBwQ3VyclBvaW50UG9zLAotICAgICAgICAmKHBTcmNEc3RNQkN1cnItPnBNVlByZWRbMF1bMF0pLAotICAgICAgICBOVUxMLAotICAgICAgICBwTUVQYXJhbXMsCi0gICAgICAgICZkc3RNVjE2eDE2LAotICAgICAgICAmZHN0U0FEMTZ4MTYpOwotICAgIAotICAgIC8qIEluaXRpYWxpemUgYWxsIHdpdGggMSBNViB2YWx1ZXMgKi8KLSAgICBwU3JjRHN0TUJDdXJyLT5wTVYwWzBdWzBdLmR4ID0gZHN0TVYxNngxNi5keDsKLSAgICBwU3JjRHN0TUJDdXJyLT5wTVYwWzBdWzBdLmR5ID0gZHN0TVYxNngxNi5keTsKLSAgICBwU3JjRHN0TUJDdXJyLT5wTVYwWzBdWzFdLmR4ID0gZHN0TVYxNngxNi5keDsKLSAgICBwU3JjRHN0TUJDdXJyLT5wTVYwWzBdWzFdLmR5ID0gZHN0TVYxNngxNi5keTsKLSAgICBwU3JjRHN0TUJDdXJyLT5wTVYwWzFdWzBdLmR4ID0gZHN0TVYxNngxNi5keDsKLSAgICBwU3JjRHN0TUJDdXJyLT5wTVYwWzFdWzBdLmR5ID0gZHN0TVYxNngxNi5keTsKLSAgICBwU3JjRHN0TUJDdXJyLT5wTVYwWzFdWzFdLmR4ID0gZHN0TVYxNngxNi5keDsKLSAgICBwU3JjRHN0TUJDdXJyLT5wTVYwWzFdWzFdLmR5ID0gZHN0TVYxNngxNi5keTsgCi0gICAgCi0gICAgKnBEc3RTQUQgICA9IGRzdFNBRDE2eDE2OyAgICAgICAKLSAgICAKLSAgICBpZiAocE1FUGFyYW1zLT5zZWFyY2hFbmFibGU4eDgpCi0gICAgewotICAgICAgICAvKiBJbnRlciA0TVYgKi8KLSAgICAgICAgYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfOHg4IChwU3JjUmVmQnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNSZWZTdGVwLCBwUmVmUmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBTcmNDdXJyQnVmLCBwVGVtcEN1cnJQb2ludFBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwU3JjRHN0TUJDdXJyLT5wTVZQcmVkWzBdWzBdKSwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1FUGFyYW1zLCAmKHBTcmNEc3RNQkN1cnItPnBNVjBbMF1bMF0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHN0U0FEOHg4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICAgICAgIHBEc3RCbG9ja1NBRFswXSA9IGRzdFNBRDh4ODsKLSAgICAgICAgKnBEc3RTQUQgPSBkc3RTQUQ4eDg7Ci0gICAgICAgIHBUZW1wQ3VyclBvaW50UG9zLT54ICs9IDg7Ci0gICAgICAgIHBTcmNSZWZCdWYgKz0gODsKLSAgICAgICAgb214VkNNNFAyX0ZpbmRNVnByZWQoCi0gICAgICAgICAgICAgICAgICAgICYocFNyY0RzdE1CQ3Vyci0+cE1WMFswXVsxXSksCi0gICAgICAgICAgICAgICAgICAgIHBTcmNDYW5kTVYxWzFdLAotICAgICAgICAgICAgICAgICAgICBwU3JjQ2FuZE1WMlsxXSwKLSAgICAgICAgICAgICAgICAgICAgcFNyY0NhbmRNVjNbMV0sCi0gICAgICAgICAgICAgICAgICAgICYocFNyY0RzdE1CQ3Vyci0+cE1WUHJlZFswXVsxXSksCi0gICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgIDEpOwotICAgICAgICAKLSAgICAgICAgYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfOHg4IChwU3JjUmVmQnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNSZWZTdGVwLCBwUmVmUmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBTcmNDdXJyQnVmLCBwVGVtcEN1cnJQb2ludFBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwU3JjRHN0TUJDdXJyLT5wTVZQcmVkWzBdWzFdKSwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1FUGFyYW1zLCAmKHBTcmNEc3RNQkN1cnItPnBNVjBbMF1bMV0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHN0U0FEOHg4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICAgICAgIHBEc3RCbG9ja1NBRFsxXSA9IGRzdFNBRDh4ODsKLSAgICAgICAgKnBEc3RTQUQgKz0gZHN0U0FEOHg4OwotICAgICAgICBwVGVtcEN1cnJQb2ludFBvcy0+eCAtPSA4OwotICAgICAgICBwVGVtcEN1cnJQb2ludFBvcy0+eSArPSA4OwotICAgICAgICBwU3JjUmVmQnVmICs9IChzcmNSZWZTdGVwICogOCkgLSA4OwotICAgICAgICAKLSAgICAgICAgb214VkNNNFAyX0ZpbmRNVnByZWQoCi0gICAgICAgICAgICAgICAgICAgICYocFNyY0RzdE1CQ3Vyci0+cE1WMFsxXVswXSksCi0gICAgICAgICAgICAgICAgICAgIHBTcmNDYW5kTVYxWzJdLAotICAgICAgICAgICAgICAgICAgICBwU3JjQ2FuZE1WMlsyXSwKLSAgICAgICAgICAgICAgICAgICAgcFNyY0NhbmRNVjNbMl0sCi0gICAgICAgICAgICAgICAgICAgICYocFNyY0RzdE1CQ3Vyci0+cE1WUHJlZFsxXVswXSksCi0gICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgIDIpOwotICAgICAgICBhcm1WQ000UDJfQmxvY2tNYXRjaF84eDggKHBTcmNSZWZCdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1JlZlN0ZXAsIHBSZWZSZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcFNyY0N1cnJCdWYsIHBUZW1wQ3VyclBvaW50UG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHBTcmNEc3RNQkN1cnItPnBNVlByZWRbMV1bMF0pLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTUVQYXJhbXMsICYocFNyY0RzdE1CQ3Vyci0+cE1WMFsxXVswXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkc3RTQUQ4eDgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgICAgICAgcERzdEJsb2NrU0FEWzJdID0gZHN0U0FEOHg4OwotICAgICAgICAqcERzdFNBRCArPSBkc3RTQUQ4eDg7Ci0gICAgICAgIHBUZW1wQ3VyclBvaW50UG9zLT54ICs9IDg7Ci0gICAgICAgIHBTcmNSZWZCdWYgKz0gODsKLSAgICAgICAgb214VkNNNFAyX0ZpbmRNVnByZWQoCi0gICAgICAgICAgICAgICAgICAgICYocFNyY0RzdE1CQ3Vyci0+cE1WMFsxXVsxXSksCi0gICAgICAgICAgICAgICAgICAgIHBTcmNDYW5kTVYxWzNdLAotICAgICAgICAgICAgICAgICAgICBwU3JjQ2FuZE1WMlszXSwKLSAgICAgICAgICAgICAgICAgICAgcFNyY0NhbmRNVjNbM10sCi0gICAgICAgICAgICAgICAgICAgICYocFNyY0RzdE1CQ3Vyci0+cE1WUHJlZFsxXVsxXSksCi0gICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgIDMpOwotICAgICAgICBhcm1WQ000UDJfQmxvY2tNYXRjaF84eDggKHBTcmNSZWZCdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1JlZlN0ZXAsIHBSZWZSZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcFNyY0N1cnJCdWYsIHBUZW1wQ3VyclBvaW50UG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHBTcmNEc3RNQkN1cnItPnBNVlByZWRbMV1bMV0pLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTUVQYXJhbXMsICYocFNyY0RzdE1CQ3Vyci0+cE1WMFsxXVsxXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkc3RTQUQ4eDgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgICAgICAgcERzdEJsb2NrU0FEWzNdID0gZHN0U0FEOHg4OwotICAgICAgICAqcERzdFNBRCArPSBkc3RTQUQ4eDg7ICAgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgLyogQ2hlY2tpbmcgaWYgNE1WIGlzIGVxdWFsIHRvIDFNViAqLwotICAgICAgICBpZiAoCi0gICAgICAgICAgICAocFNyY0RzdE1CQ3Vyci0+cE1WMFswXVswXS5keCAhPSBkc3RNVjE2eDE2LmR4KSB8fAotICAgICAgICAgICAgKHBTcmNEc3RNQkN1cnItPnBNVjBbMF1bMF0uZHkgIT0gZHN0TVYxNngxNi5keSkgfHwKLSAgICAgICAgICAgIChwU3JjRHN0TUJDdXJyLT5wTVYwWzBdWzFdLmR4ICE9IGRzdE1WMTZ4MTYuZHgpIHx8Ci0gICAgICAgICAgICAocFNyY0RzdE1CQ3Vyci0+cE1WMFswXVsxXS5keSAhPSBkc3RNVjE2eDE2LmR5KSB8fAotICAgICAgICAgICAgKHBTcmNEc3RNQkN1cnItPnBNVjBbMV1bMF0uZHggIT0gZHN0TVYxNngxNi5keCkgfHwKLSAgICAgICAgICAgIChwU3JjRHN0TUJDdXJyLT5wTVYwWzFdWzBdLmR5ICE9IGRzdE1WMTZ4MTYuZHkpIHx8Ci0gICAgICAgICAgICAocFNyY0RzdE1CQ3Vyci0+cE1WMFsxXVsxXS5keCAhPSBkc3RNVjE2eDE2LmR4KSB8fAotICAgICAgICAgICAgKHBTcmNEc3RNQkN1cnItPnBNVjBbMV1bMV0uZHkgIT0gZHN0TVYxNngxNi5keSkKLSAgICAgICAgICAgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBzZWxlY3QgdGhlIDQgTVYgKi8KLSAgICAgICAgICAgIHBTcmNEc3RNQkN1cnItPm1iVHlwZSA9IE9NWF9WQ19JTlRFUjRWOwotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIC8qIGZpbmRpbmcgdGhlIGVycm9yIGluIGludHJhIG1vZGUgKi8KLSAgICBmb3IgKGNvdW50ID0gMCwgYXZlcmFnZSA9IDA7IGNvdW50IDwgMjU2IDsgY291bnQrKykKLSAgICB7Ci0gICAgICAgIGF2ZXJhZ2UgPSBhdmVyYWdlICsgcFRlbXBTcmNDdXJyQnVmW2NvdW50XTsKLSAgICB9Ci0gICAgYXZlcmFnZSA9IGF2ZXJhZ2UvMjU2OwotICAgIAotCWludHJhU0FEID0gMDsKLQotICAgIC8qIEludHJhIFNBRCBjYWxjdWxhdGlvbiAqLwotICAgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IDI1NiA7IGNvdW50KyspCi0gICAgewotICAgICAgICBpbnRyYVNBRCArPSBhcm1BYnMgKChwVGVtcFNyY0N1cnJCdWZbY291bnRdKSAtIChhdmVyYWdlKSk7Ci0gICAgfQotICAgIAotCS8qIFVzaW5nIHRoZSBNUEVHNCBWTSBmb3JtdWxhIGZvciBpbnRyYS9pbnRlciBtb2RlIGRlY2lzaW9uIAotCSAgIFZhciA8IChTQUQgLSAyKk5CKSB3aGVyZSBOQiA9IE5eMiBpcyB0aGUgbnVtYmVyIG9mIHBpeGVscwotCSAgIG9mIHRoZSBtYWNyb2Jsb2NrLiovCi0KLSAgICBpZiAoaW50cmFTQUQgPD0gKCpwRHN0U0FEIC0gNTEyKSkKLSAgICB7Ci0gICAgICAgIHBTcmNEc3RNQkN1cnItPm1iVHlwZSA9IE9NWF9WQ19JTlRSQTsKLSAgICAgICAgcFNyY0RzdE1CQ3Vyci0+cE1WMFswXVswXS5keCA9IDA7Ci0gICAgICAgIHBTcmNEc3RNQkN1cnItPnBNVjBbMF1bMF0uZHkgPSAwOwotICAgICAgICAqcERzdFNBRCAgID0gaW50cmFTQUQ7Ci0gICAgICAgIHBEc3RCbG9ja1NBRFswXSA9IDB4RkZGRjsKLSAgICAgICAgcERzdEJsb2NrU0FEWzFdID0gMHhGRkZGOwotICAgICAgICBwRHN0QmxvY2tTQURbMl0gPSAweEZGRkY7Ci0gICAgICAgIHBEc3RCbG9ja1NBRFszXSA9IDB4RkZGRjsKLSAgICB9Ci0KLSAgICBpZihwU3JjRHN0TUJDdXJyLT5tYlR5cGUgPT0gT01YX1ZDX0lOVEVSKQotICAgIHsKLSAgICAgIHBUZW1wU3JjUmVmQnVmID0gcFNyY1JlZkJ1ZiArIChzcmNSZWZTdGVwICogZHN0TVYxNngxNi5keSkgKyBkc3RNVjE2eDE2LmR4OwotICAgIAotICAgICAgaWYoKGRzdE1WMTZ4MTYuZHggJiAweDEpICYmIChkc3RNVjE2eDE2LmR5ICYgMHgxKSkKLSAgICAgIHsKLSAgICAgICAgcHJlZGljdFR5cGUgPSBPTVhfVkNfSEFMRl9QSVhFTF9YWTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYoZHN0TVYxNngxNi5keCAmIDB4MSkKLSAgICAgIHsKLSAgICAgICAgcHJlZGljdFR5cGUgPSBPTVhfVkNfSEFMRl9QSVhFTF9YOwotICAgICAgfQotICAgICAgZWxzZSBpZihkc3RNVjE2eDE2LmR5ICYgMHgxKQotICAgICAgewotICAgICAgICBwcmVkaWN0VHlwZSA9IE9NWF9WQ19IQUxGX1BJWEVMX1k7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHByZWRpY3RUeXBlID0gT01YX1ZDX0lOVEVHRVJfUElYRUw7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIHBEc3QgPSBhcm1BbGlnblRvOEJ5dGVzKCYoYURzdFswXSkpOwotICAgICAgLyogQ2FsY3VsYXRpbmcgQmxvY2sgU0FEIGF0IE1WKGRzdE1WMTZ4MTYuZHgsZHN0TVYxNngxNi5keSkgKi8KLQkgIC8qIEJsb2NrIDAgKi8KLSAgICAgIG9teFZDTTRQMl9NQ1JlY29uQmxvY2socFRlbXBTcmNSZWZCdWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNSZWZTdGVwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEc3QsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0U3RlcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3RUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1FUGFyYW1zLT5ybmRWYWwpOwotICAgIAotICAgICAgYXJtVkNDT01NX1NBRChwVGVtcFNyY0N1cnJCdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAxNiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBkc3RTdGVwLAotICAgICAgICAgICAgICAgICAgICAgICAgJlNhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIDgsCi0gICAgICAgICAgICAgICAgICAgICAgICA4KTsKLSAgICAgIHBEc3RCbG9ja1NBRFswXSA9IFNhZDsKLSAgIAotICAgICAgLyogQmxvY2sgMSAqLwotICAgICAgb214VkNNNFAyX01DUmVjb25CbG9jayhwVGVtcFNyY1JlZkJ1ZiArIDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNSZWZTdGVwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEc3QsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0U3RlcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3RUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1FUGFyYW1zLT5ybmRWYWwpOwkJCQkJICAKLQotICAgICAgYXJtVkNDT01NX1NBRChwVGVtcFNyY0N1cnJCdWYgKyA4LAotICAgICAgICAgICAgICAgICAgICAgICAgMTYsCi0gICAgICAgICAgICAgICAgICAgICAgICBwRHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgZHN0U3RlcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICZTYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICA4LAotICAgICAgICAgICAgICAgICAgICAgICAgOCk7Ci0gICAgICBwRHN0QmxvY2tTQURbMV0gPSBTYWQ7Ci0JCi0gICAgICAvKiBCbG9jayAyICovCi0gICAgICBvbXhWQ000UDJfTUNSZWNvbkJsb2NrKHBUZW1wU3JjUmVmQnVmICsgKHNyY1JlZlN0ZXAqOCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNSZWZTdGVwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEc3QsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0U3RlcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3RUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1FUGFyYW1zLT5ybmRWYWwpOwotCi0gICAgICBhcm1WQ0NPTU1fU0FEKHBUZW1wU3JjQ3VyckJ1ZiArICgxNio4KSwKLSAgICAgICAgICAgICAgICAgICAgICAgIDE2LAotICAgICAgICAgICAgICAgICAgICAgICAgcERzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdFN0ZXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAmU2FkLAotICAgICAgICAgICAgICAgICAgICAgICAgOCwKLSAgICAgICAgICAgICAgICAgICAgICAgIDgpOwotICAgICAgcERzdEJsb2NrU0FEWzJdID0gU2FkOwotCi0JICAvKiBCbG9jayAzICovCi0gICAgICBvbXhWQ000UDJfTUNSZWNvbkJsb2NrKHBUZW1wU3JjUmVmQnVmICsgKHNyY1JlZlN0ZXAqOCkgKyA4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUmVmU3RlcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRHN0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFN0ZXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWN0VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNRVBhcmFtcy0+cm5kVmFsKTsKLQotICAgICAgYXJtVkNDT01NX1NBRChwVGVtcFNyY0N1cnJCdWYgKyAoMTYqOCkgKyA4LAotICAgICAgICAgICAgICAgICAgICAgICAgMTYsCi0gICAgICAgICAgICAgICAgICAgICAgICBwRHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgZHN0U3RlcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICZTYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICA4LAotICAgICAgICAgICAgICAgICAgICAgICAgOCk7Ci0gICAgICBwRHN0QmxvY2tTQURbM10gPSBTYWQ7Ci0gICAgfQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDkxZjMxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLSAvKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRmlsZTogICAgICAgIG9teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmFfUzE2LmMKLSAqIERlc2NyaXB0aW9uOiBDb250YWlucyBtb2R1bGVzIGZvciBBQyBEQyBwcmVkaWN0aW9uCi0gKgotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEgICAoNi4yLjUuNC4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgYWRhcHRpdmUgREMvQUMgY29lZmZpY2llbnQgcHJlZGljdGlvbiBmb3IgYW4gaW50cmEgYmxvY2suICBQcmlvciAKLSAqIHRvIHRoZSBmdW5jdGlvbiBjYWxsLCBwcmVkaWN0aW9uIGRpcmVjdGlvbiAocHJlZERpcikgc2hvdWxkIGJlIHNlbGVjdGVkIGFzIAotICogc3BlY2lmaWVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4zLjEuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgd2hpY2ggY29udGFpbnMgdGhlIHF1YW50aXplZCAKLSAqICAgICAgICAgICAgY29lZmZpY2llbnQgcmVzaWR1YWxzIChQUUYpIG9mIHRoZSBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIAotICogICAgICAgICAgICBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgVGhlIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIAotICogICAgICAgICAgICBzYXR1cmF0ZWQgdG8gdGhlIHJhbmdlIFstMjA0OCwgMjA0N10uIAotICogICBwUHJlZEJ1ZlJvdyAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHJvdyBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCBvbiAKLSAqICAgICAgICAgICAgYSA0LWJ5dGUgYm91bmRhcnkuIAotICogICBwUHJlZEJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCAKLSAqICAgICAgICAgICAgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAotICogICBjdXJRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIGN1cnJlbnQgYmxvY2suIGN1clFQIG1heSBlcXVhbCB0byAKLSAqICAgICAgICAgICAgcHJlZFFQIGVzcGVjaWFsbHkgd2hlbiB0aGUgY3VycmVudCBibG9jayBhbmQgdGhlIHByZWRpY3RvciBibG9jayAKLSAqICAgICAgICAgICAgYXJlIGluIHRoZSBzYW1lIG1hY3JvYmxvY2suIAotICogICBwcmVkUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBwcmVkaWN0b3IgYmxvY2sgCi0gKiAgIHByZWREaXIgLSBpbmRpY2F0ZXMgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uIHdoaWNoIHRha2VzIG9uZSBvZiB0aGUgCi0gKiAgICAgICAgICAgIGZvbGxvd2luZyB2YWx1ZXM6IE9NWF9WQ19IT1JJWk9OVEFMIC0gcHJlZGljdCBob3Jpem9udGFsbHkgCi0gKiAgICAgICAgICAgIE9NWF9WQ19WRVJUSUNBTCAtIHByZWRpY3QgdmVydGljYWxseSAKLSAqICAgQUNQcmVkRmxhZyAtIGEgZmxhZyBpbmRpY2F0aW5nIGlmIEFDIHByZWRpY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZC4gSXQgCi0gKiAgICAgICAgICAgIGlzIGVxdWFsIHRvIGFjX3ByZWRfZmxhZyBpbiB0aGUgYml0IHN0cmVhbSBzeW50YXggb2YgTVBFRy00IAotICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlIG9yIGNocm9taW5hbmNlKSBvZiB0aGUgCi0gKiAgICAgICAgICAgIGN1cnJlbnQgYmxvY2sgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgd2hpY2ggY29udGFpbnMgdGhlIHF1YW50aXplZCAKLSAqICAgICAgICAgICAgY29lZmZpY2llbnRzIChRRikgb2YgdGhlIGN1cnJlbnQgYmxvY2sgCi0gKiAgIHBQcmVkQnVmUm93IC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyIAotICogICBwUHJlZEJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlciAgTm90ZTogCi0gKiAgICAgICAgICAgIEJ1ZmZlciB1cGRhdGU6IFVwZGF0ZSB0aGUgQUMgcHJlZGljdGlvbiBidWZmZXIgKGJvdGggcm93IGFuZCAKLSAqICAgICAgICAgICAgY29sdW1uIGJ1ZmZlcikuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLCBpZjoKLSAqICAgICAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgICAgICAgcFNyY0RzdCwgcFByZWRCdWZSb3csIG9yIHBQcmVkQnVmQ29sLiAKLSAqICAgICAgICAtICAgIGN1clFQIDw9IDAsIAotICogICAgICAgIC0gICAgcHJlZFFQIDw9IDAsIAotICogICAgICAgIC0gICAgY3VyUVAgPjMxLCAKLSAqICAgICAgICAtICAgIHByZWRRUCA+IDMxLCAKLSAqICAgICAgICAtICAgIHByZURpciBleGNlZWRzIFsxLDJdCi0gKiAgICAgICAgLSAgICBwU3JjRHN0LCBwUHJlZEJ1ZlJvdywgb3IgcFByZWRCdWZDb2wgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEoCi0gICAgIE9NWF9TMTYgKiBwU3JjRHN0LAotICAgICBPTVhfUzE2ICogcFByZWRCdWZSb3csCi0gICAgIE9NWF9TMTYgKiBwUHJlZEJ1ZkNvbCwKLSAgICAgT01YX0lOVCBjdXJRUCwKLSAgICAgT01YX0lOVCBwcmVkUVAsCi0gICAgIE9NWF9JTlQgcHJlZERpciwKLSAgICAgT01YX0lOVCBBQ1ByZWRGbGFnLAotICAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCB2aWRlb0NvbXAKLSApCi17Ci0gICAgT01YX1U4IGZsYWc7Ci0gICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFByZWRCdWZSb3cgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBQcmVkQnVmQ29sID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihjdXJRUCA8PSAwLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocHJlZFFQIDw9IDAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihjdXJRUCA+IDMxLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocHJlZFFQID4gMzEsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigocHJlZERpciAhPSAxKSAmJiAocHJlZERpciAhPSAyKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCFhcm1JczRCeXRlQWxpZ25lZChwU3JjRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCFhcm1JczRCeXRlQWxpZ25lZChwUHJlZEJ1ZlJvdyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZighYXJtSXM0Qnl0ZUFsaWduZWQocFByZWRCdWZDb2wpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0KLSAgICBmbGFnID0gMDsKLSAgICByZXR1cm4gYXJtVkNNNFAyX0FDRENQcmVkaWN0KAotICAgICAgICBwU3JjRHN0LAotICAgICAgICBOVUxMLAotICAgICAgICBwUHJlZEJ1ZlJvdywKLSAgICAgICAgcFByZWRCdWZDb2wsCi0gICAgICAgIGN1clFQLAotICAgICAgICBwcmVkUVAsCi0gICAgICAgIHByZWREaXIsCi0gICAgICAgIEFDUHJlZEZsYWcsCi0gICAgICAgIHZpZGVvQ29tcCwKLSAgICAgICAgZmxhZywKLSAgICAgICAgTlVMTCk7Ci0KLX0KLQotLyogRW5kIG9mIGZpbGUgKi8KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludGVyX0kuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW50ZXJfSS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDU1YjY2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW50ZXJfSS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfUXVhbnRJbnRlcl9JLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIGludGVyIFF1YW50aXphdGlvbgotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfUXVhbnRJbnRlcl9JICAgKDYuMi40LjQuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIHF1YW50aXphdGlvbiBvbiBhbiBpbnRlciBjb2VmZmljaWVudCBibG9jazsgc3VwcG9ydHMgCi0gKiBiaXRzX3Blcl9waXhlbCA9PSA4LiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgaW50ZXIgYmxvY2sgY29lZmZpY2llbnRzOyBtdXN0IGJlIGFsaWduZWQgCi0gKiAgICAgICAgICAgIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpemVyX3NjYWxlKSAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyBtb2RlLCBhbmQgCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub24gbGluZWFyIGludHJhIERDIG1vZGUuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgb3V0cHV0IChxdWFudGl6ZWQpIGludGVyYmxvY2sgY29lZmZpY2llbnRzLiAgCi0gKiAgICAgICAgICAgIFdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MSwgQUMgY29lZmZpY2llbnRzIGFyZSBzYXR1cmF0ZWQgb24gdGhlIAotICogICAgICAgICAgICBpbnRlcnZhbCBbLTEyNywgMTI3XSwgYW5kIERDIGNvZWZmaWNpZW50cyBhcmUgc2F0dXJhdGVkIG9uIHRoZSAKLSAqICAgICAgICAgICAgaW50ZXJ2YWwgWzEsIDI1NF0uICBXaGVuIHNob3J0VmlkZW9IZWFkZXI9PTAsIEFDIGNvZWZmaWNpZW50cyAKLSAqICAgICAgICAgICAgYXJlIHNhdHVyYXRlZCBvbiB0aGUgaW50ZXJ2YWwgWy0yMDQ3LCAyMDQ3XS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6Ci0gKiAgICAtICAgIHBTcmNEc3QgaXMgTlVMTC4gCi0gKiAgICAtICAgIFFQIDw9IDAgb3IgUVAgPj0gMzIuIAotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNNNFAyX1F1YW50SW50ZXJfSSgKLSAgICAgT01YX1MxNiAqIHBTcmNEc3QsCi0gICAgIE9NWF9VOCBRUCwKLQkgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0pCi17Ci0KLSAgICAvKiBEZWZpbml0aW9ucyBhbmQgSW5pdGlhbGl6YXRpb25zKi8KLSAgICBPTVhfSU5UIGNvZWZmQ291bnQ7Ci0gICAgT01YX0lOVCBmU2lnbjsKLSAgICBPTVhfSU5UIG1heENscEFDID0gMCwgbWluQ2xwQUMgPSAwOwotICAgIE9NWF9JTlQgbWF4Q2xwREMgPSAwLCBtaW5DbHBEQyA9IDA7Ci0gICAgCi0gICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKChRUCA8PSAwKSB8fCAoUVAgPj0gMzIpKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgLyogT25lIGFyZ3VtZW50IGNoZWNrIGlzIGRlbGF5ZWQgdW50aWwgd2UgaGF2ZSBhc2NlcnRhaW5lZCB0aGF0ICAqLwotICAgLyogcFFNYXRyaXggaXMgbm90IE5VTEwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIAotICAgIC8qIFNldCB0aGUgQ2xpcCBSYW5nZSBiYXNlZCBvbiBTVkggb24vb2ZmICovCi0gICAgaWYoc2hvcnRWaWRlb0hlYWRlciA9PSAxKQotICAgIHsKLSAgICAgICBtYXhDbHBEQyA9IDI1NDsKLSAgICAgICBtaW5DbHBEQyA9IDE7Ci0gICAgICAgbWF4Q2xwQUMgPSAxMjc7Ci0gICAgICAgbWluQ2xwQUMgPSAtMTI3OyAgICAgICAgCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIG1heENscERDID0gMjA0NzsKLSAgICAgICAgbWluQ2xwREMgPSAtMjA0NzsKLSAgICAgICAgbWF4Q2xwQUMgPSAyMDQ3OwotICAgICAgICBtaW5DbHBBQyA9IC0yMDQ3OyAgIAotICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAvKiBTZWNvbmQgSW52ZXJzZSBxdWFudGlzYXRpb24gbWV0aG9kICovCi0gICAgZm9yIChjb2VmZkNvdW50ID0gMDsgY29lZmZDb3VudCA8IDY0OyBjb2VmZkNvdW50KyspCi0gICAgewotICAgICAgICBmU2lnbiA9ICBhcm1TaWduQ2hlY2sgKHBTcmNEc3RbY29lZmZDb3VudF0pOyAgCi0gICAgICAgIHBTcmNEc3RbY29lZmZDb3VudF0gPSAoYXJtQWJzKHBTcmNEc3RbY29lZmZDb3VudF0pIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAoUVAvMikpLygyICogUVApOwotICAgICAgICBwU3JjRHN0W2NvZWZmQ291bnRdICo9IGZTaWduOwotICAgICAgICAKLSAgICAgICAgLyogQ2xpcCAqLwotICAgICAgICBpZiAoY29lZmZDb3VudCA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgIHBTcmNEc3RbY29lZmZDb3VudF0gPQotICAgICAgICAgICAoT01YX1MxNikgYXJtQ2xpcCAobWluQ2xwREMsIG1heENscERDLCBwU3JjRHN0W2NvZWZmQ291bnRdKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgcFNyY0RzdFtjb2VmZkNvdW50XSA9Ci0gICAgICAgICAgIChPTVhfUzE2KSBhcm1DbGlwIChtaW5DbHBBQywgbWF4Q2xwQUMsIHBTcmNEc3RbY29lZmZDb3VudF0pOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotCi19Ci0KLS8qIEVuZCBvZiBmaWxlICovCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnRyYV9JLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludHJhX0kuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk1YjgwMi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludHJhX0kuYworKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAyX1F1YW50SW50cmFfSS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb250YWlucyBtb2R1bGVzIGZvciBpbnRyYSBRdWFudGl6YXRpb24KLSAqIAotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1F1YW50SW50cmFfSSAgICg2LjIuNC40LjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBxdWFudGl6YXRpb24gb24gaW50cmEgYmxvY2sgY29lZmZpY2llbnRzLiBUaGlzIGZ1bmN0aW9uIHN1cHBvcnRzIAotICogYml0c19wZXJfcGl4ZWwgPT0gOC4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IGludHJhIGJsb2NrIGNvZWZmaWNpZW50czsgbXVzdCBiZSBhbGlnbmVkIAotICogICAgICAgICAgICBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICogICBRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKHF1YW50aXplcl9zY2FsZSkuIAotICogICBibG9ja0luZGV4IC0gYmxvY2sgaW5kZXggaW5kaWNhdGluZyB0aGUgY29tcG9uZW50IHR5cGUgYW5kIHBvc2l0aW9uLCAKLSAqICAgICAgICAgICAgdmFsaWQgaW4gdGhlIHJhbmdlIDAgdG8gNSwgYXMgZGVmaW5lZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSAKLSAqICAgICAgICAgICAgNi4xLjMuOC4gCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAotICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgCi0gKiAgICAgICAgICAgIG1vZGUsIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIG91dHB1dCAocXVhbnRpemVkKSBpbnRlcmJsb2NrIGNvZWZmaWNpZW50cy4gIAotICogICAgICAgICAgICBXaGVuIHNob3J0VmlkZW9IZWFkZXI9PTEsIEFDIGNvZWZmaWNpZW50cyBhcmUgc2F0dXJhdGVkIG9uIHRoZSAKLSAqICAgICAgICAgICAgaW50ZXJ2YWwgWy0xMjcsIDEyN10sIGFuZCBEQyBjb2VmZmljaWVudHMgYXJlIHNhdHVyYXRlZCBvbiB0aGUgCi0gKiAgICAgICAgICAgIGludGVydmFsIFsxLCAyNTRdLiAgV2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0wLCBBQyBjb2VmZmljaWVudHMgCi0gKiAgICAgICAgICAgIGFyZSBzYXR1cmF0ZWQgb24gdGhlIGludGVydmFsIFstMjA0NywgMjA0N10uIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgotICogICAgLSAgICBwU3JjRHN0IGlzIE5VTEwuIAotICogICAgLSAgICBibG9ja0luZGV4IDwgMCBvciBibG9ja0luZGV4ID49IDEwIAotICogICAgLSAgICBRUCA8PSAwIG9yIFFQID49IDMyLiAKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMl9RdWFudEludHJhX0koCi0gICAgIE9NWF9TMTYgKiBwU3JjRHN0LAotICAgICBPTVhfVTggUVAsCi0gICAgIE9NWF9JTlQgYmxvY2tJbmRleCwKLQkgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0gKQotewotCi0gICAgLyogRGVmaW5pdGlvbnMgYW5kIEluaXRpYWxpemF0aW9ucyovCi0gICAgLyogSW5pdGlhbGl6ZWQgdG8gcmVtb3ZlIGNvbXBpbGF0aW9uIGVycm9yICovCi0gICAgT01YX0lOVCBkY1NjYWxlciA9IDAsIGNvZWZmQ291bnQsZlNpZ247Ci0gICAgT01YX0lOVCBtYXhDbHBBQywgbWluQ2xwQUM7Ci0KLSAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoKGJsb2NrSW5kZXggPCAwKSB8fCAoYmxvY2tJbmRleCA+PSAxMCkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKChRUCA8PSAwKSB8fCAoUVAgPj0gMzIpKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgLyogT25lIGFyZ3VtZW50IGNoZWNrIGlzIGRlbGF5ZWQgdW50aWwgd2UgaGF2ZSBhc2NlcnRhaW5lZCB0aGF0ICAqLwotICAgLyogcFFNYXRyaXggaXMgbm90IE5VTEwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgCi0gICAgLyogU2V0IHRoZSBDbGlwIFJhbmdlIGJhc2VkIG9uIFNWSCBvbi9vZmYgKi8KLSAgICBpZihzaG9ydFZpZGVvSGVhZGVyID09IDEpCi0gICAgewotICAgICAgICBtYXhDbHBBQyA9IDEyNzsKLSAgICAgICAgbWluQ2xwQUMgPSAtMTI3OwotICAgICAgICBkY1NjYWxlciA9IDg7Ci0gICAgICAgIC8qIERlcXVhbnQgdGhlIERDIHZhbHVlLCB0aGlzIGFwcGxpZXMgdG8gYm90aCB0aGUgbWV0aG9kcyAqLwotICAgICAgICBwU3JjRHN0WzBdID0gYXJtSW50RGl2QXdheUZyb21aZXJvIChwU3JjRHN0WzBdLCBkY1NjYWxlcik7Ci0gICAgCi0gICAgICAgIC8qIENsaXAgYmV0d2VlbiAxIGFuZCAyNTQgKi8KLSAgICAgICAgcFNyY0RzdFswXSA9IChPTVhfUzE2KSBhcm1DbGlwICgxLCAyNTQsIHBTcmNEc3RbMF0pOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBtYXhDbHBBQyA9IDIwNDc7Ci0gICAgICAgIG1pbkNscEFDID0gLTIwNDc7ICAgCi0gICAgICAgIC8qIENhbGN1bGF0ZSB0aGUgREMgc2NhbGVyIHZhbHVlICovCi0gICAgICAgIGlmICgoYmxvY2tJbmRleCAgPCA0KSB8fCAoYmxvY2tJbmRleCAgPiA1KSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKFFQID49IDEgJiYgUVAgPD0gNCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkY1NjYWxlciA9IDg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChRUCA+PSA1ICYmIFFQIDw9IDgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZGNTY2FsZXIgPSAyICogUVA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChRUCA+PSA5ICYmIFFQIDw9IDI0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRjU2NhbGVyID0gUVAgKyA4OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRjU2NhbGVyID0gKDIgKiBRUCkgLSAxNjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChibG9ja0luZGV4IDwgNikKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKFFQID49IDEgJiYgUVAgPD0gNCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkY1NjYWxlciA9IDg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChRUCA+PSA1ICYmIFFQIDw9IDI0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRjU2NhbGVyID0gKFFQICsgMTMpLzI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZGNTY2FsZXIgPSBRUCAtIDY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8qIERlcXVhbnQgdGhlIERDIHZhbHVlLCB0aGlzIGFwcGxpZXMgdG8gYm90aCB0aGUgbWV0aG9kcyAqLwotICAgICAgICBwU3JjRHN0WzBdID0gYXJtSW50RGl2QXdheUZyb21aZXJvIChwU3JjRHN0WzBdLCBkY1NjYWxlcik7Ci0gICAgfQotICAgIAotICAgIC8qIFNlY29uZCBJbnZlcnNlIHF1YW50aXNhdGlvbiBtZXRob2QgKi8KLSAgICBmb3IgKGNvZWZmQ291bnQgPSAxOyBjb2VmZkNvdW50IDwgNjQ7IGNvZWZmQ291bnQrKykKLSAgICB7Ci0gICAgICAgIGZTaWduID0gIGFybVNpZ25DaGVjayAocFNyY0RzdFtjb2VmZkNvdW50XSk7ICAKLSAgICAgICAgcFNyY0RzdFtjb2VmZkNvdW50XSA9IGFybUFicyhwU3JjRHN0W2NvZWZmQ291bnRdKS8oMiAqIFFQKTsKLSAgICAgICAgcFNyY0RzdFtjb2VmZkNvdW50XSAqPSBmU2lnbjsKLQotICAgICAgICAvKiBDbGlwICovCi0gICAgICAgIHBTcmNEc3RbY29lZmZDb3VudF0gPQotICAgICAgICAoT01YX1MxNikgYXJtQ2xpcCAobWluQ2xwQUMsIG1heENscEFDLCBwU3JjRHN0W2NvZWZmQ291bnRdKTsKLSAgICB9Ci0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci0KLX0KLQotLyogRW5kIG9mIGZpbGUgKi8KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludGVyX0kuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50ZXJfSS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODllMjQ0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50ZXJfSS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIGludGVyIGludmVyc2UgUXVhbnRpemF0aW9uCi0gKiAKLSAqLyAKLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1F1YW50SW52SW50ZXJfSSAgICg2LjIuNS4zLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyB0aGUgc2Vjb25kIGludmVyc2UgcXVhbnRpemF0aW9uIG1vZGUgb24gYW4gaW50cmEvaW50ZXIgY29kZWQgCi0gKiBibG9jay4gU3VwcG9ydHMgYml0c19wZXJfcGl4ZWwgPSA4LiBUaGUgb3V0cHV0IGNvZWZmaWNpZW50cyBhcmUgY2xpcHBlZCB0byAKLSAqIHRoZSByYW5nZSBbLTIwNDgsIDIwNDddLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgKHF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2s7IG11c3QgYmUgCi0gKiAgICAgICAgICAgIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIChxdWFudGl6ZXJfc2NhbGUpIAotICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSBvZiB0aGUgY3VycmVudCBibG9jay4gVGFrZXMgb25lIG9mIHRoZSAKLSAqICAgICAgICAgICAgZm9sbG93aW5nIGZsYWdzOiBPTVhfVkNfTFVNSU5BTkNFLCBPTVhfVkNfQ0hST01JTkFOQ0UgKGludHJhIAotICogICAgICAgICAgICB2ZXJzaW9uIG9ubHkpLiAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyIAotICogICAgICAgICAgICAoaW50cmEgdmVyc2lvbiBvbmx5KS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBvdXRwdXQgKGRlcXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jayAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBpcyAKLSAqICAgICAgICAgICAgICB0cnVlOiAKLSAqICAgIC0gICAgcFNyY0RzdCBpcyBOVUxMIAotICogICAgLSAgICBRUCA8PSAwIG9yIFFQID49MzEgCi0gKiAgICAtICAgIHZpZGVvQ29tcCBpcyBuZWl0aGVyIE9NWF9WQ19MVU1JTkFOQ0Ugbm9yIE9NWF9WQ19DSFJPTUlOQU5DRS4gCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JKAotICAgICBPTVhfUzE2ICogcFNyY0RzdCwKLSAgICAgT01YX0lOVCBRUAotCSApCi17Ci0KLSAgICBPTVhfSU5UIGNvZWZmQ291bnQsIFNpZ247Ci0gICAgCi0gICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKChRUCA8PSAwKSB8fCAoUVAgPj0gMzIpKSwgT01YX1N0c19CYWRBcmdFcnIpOwotCi0gICAgLyogU2Vjb25kIEludmVyc2UgcXVhbnRpc2F0aW9uIG1ldGhvZCAqLwotICAgIGZvciAoY29lZmZDb3VudCA9IDA7IGNvZWZmQ291bnQgPCA2NDsgY29lZmZDb3VudCsrKQotICAgIHsKLSAgICAgICAgLyogY2hlY2sgc2lnbiAqLwotICAgICAgICBTaWduID0gIGFybVNpZ25DaGVjayAocFNyY0RzdFtjb2VmZkNvdW50XSk7Ci0gICAgICAgICAgICAgIAotICAgICAgICAvKiBRdWFudGl6ZSB0aGUgY29lZmYgKi8KLSAgICAgICAgaWYgKFFQICYgMHgxKQotICAgICAgICB7Ci0gICAgICAgICAgICBwU3JjRHN0W2NvZWZmQ291bnRdID0gKDIqIGFybUFicyhwU3JjRHN0W2NvZWZmQ291bnRdKSArIDEpICogUVA7Ci0gICAgICAgICAgICBwU3JjRHN0W2NvZWZmQ291bnRdICo9IFNpZ247Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwU3JjRHN0W2NvZWZmQ291bnRdID0gKDIqIGFybUFicyhwU3JjRHN0W2NvZWZmQ291bnRdKSArIDEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBRUCAtIDE7Ci0gICAgICAgICAgICBwU3JjRHN0W2NvZWZmQ291bnRdICo9IFNpZ247Ci0gICAgICAgIH0KLSAgICAgICAgLyogU2F0dXJhdGUgKi8KLSAgICAgICAgcFNyY0RzdFtjb2VmZkNvdW50XSA9IGFybUNsaXAgKC0yMDQ4LCAyMDQ3LCBwU3JjRHN0W2NvZWZmQ291bnRdKTsKLSAgICB9Ci0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qIEVuZCBvZiBmaWxlICovCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludHJhX0kuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYyNGNjNy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludHJhX0kuYworKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAyX1F1YW50SW52SW50cmFfSS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb250YWlucyBtb2R1bGVzIGZvciBpbnRyYSBpbnZlcnNlIFF1YW50aXphdGlvbgotICogCi0gKi8gCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JICAgKDYuMi41LjMuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIHRoZSBzZWNvbmQgaW52ZXJzZSBxdWFudGl6YXRpb24gbW9kZSBvbiBhbiBpbnRyYS9pbnRlciBjb2RlZCAKLSAqIGJsb2NrLiBTdXBwb3J0cyBiaXRzX3Blcl9waXhlbCA9IDguIFRoZSBvdXRwdXQgY29lZmZpY2llbnRzIGFyZSBjbGlwcGVkIHRvIAotICogdGhlIHJhbmdlIFstMjA0OCwgMjA0N10uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCAocXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jazsgbXVzdCBiZSAKLSAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICogICBRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKHF1YW50aXplcl9zY2FsZSkgCi0gKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIG9mIHRoZSBjdXJyZW50IGJsb2NrLiBUYWtlcyBvbmUgb2YgdGhlIAotICogICAgICAgICAgICBmb2xsb3dpbmcgZmxhZ3M6IE9NWF9WQ19MVU1JTkFOQ0UsIE9NWF9WQ19DSFJPTUlOQU5DRSAoaW50cmEgCi0gKiAgICAgICAgICAgIHZlcnNpb24gb25seSkuIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXIgCi0gKiAgICAgICAgICAgIChpbnRyYSB2ZXJzaW9uIG9ubHkpLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIG91dHB1dCAoZGVxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIGlzIAotICogICAgICAgICAgICAgIHRydWU6IAotICogICAgLSAgICBwU3JjRHN0IGlzIE5VTEwgCi0gKiAgICAtICAgIFFQIDw9IDAgb3IgUVAgPj0zMSAKLSAqICAgIC0gICAgdmlkZW9Db21wIGlzIG5laXRoZXIgT01YX1ZDX0xVTUlOQU5DRSBub3IgT01YX1ZDX0NIUk9NSU5BTkNFLiAKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMl9RdWFudEludkludHJhX0koCi0gICAgIE9NWF9TMTYgKiBwU3JjRHN0LAotICAgICBPTVhfSU5UIFFQLAotICAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCB2aWRlb0NvbXAsCi0JIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgotKQotewotCi0gICAgLyogSW5pdGlhbGl6ZWQgdG8gcmVtb3ZlIGNvbXBpbGF0aW9uIGVycm9yICovCi0gICAgT01YX0lOVCBkY1NjYWxlciA9IDAsIGNvZWZmQ291bnQsIFNpZ247Ci0KLSAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoKFFQIDw9IDApIHx8IChRUCA+PSAzMikpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0JYXJtUmV0QXJnRXJySWYoKCh2aWRlb0NvbXAgIT0gT01YX1ZDX0xVTUlOQU5DRSkgJiYgKHZpZGVvQ29tcCAhPSBPTVhfVkNfQ0hST01JTkFOQ0UpKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIAotICAgIC8qIENhbGN1bGF0ZSB0aGUgREMgc2NhbGVyIHZhbHVlICovCi0gICAgCi0gICAgLyogbGluZWFyIGludHJhIERDIG1vZGUgKi8KLSAgICBpZihzaG9ydFZpZGVvSGVhZGVyKQotICAgIHsKLSAgICAgICAgZGNTY2FsZXIgPSA4OwotICAgIH0KLSAgICAvKiBub25saW5lYXIgaW50cmEgREMgbW9kZSAqLwotICAgIGVsc2UKLSAgICB7Ci0gICAgCi0gICAgICAgIGlmICh2aWRlb0NvbXAgPT0gT01YX1ZDX0xVTUlOQU5DRSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKFFQID49IDEgJiYgUVAgPD0gNCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkY1NjYWxlciA9IDg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChRUCA+PSA1ICYmIFFQIDw9IDgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZGNTY2FsZXIgPSAyICogUVA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChRUCA+PSA5ICYmIFFQIDw9IDI0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRjU2NhbGVyID0gUVAgKyA4OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRjU2NhbGVyID0gKDIgKiBRUCkgLSAxNjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGVsc2UgaWYgKHZpZGVvQ29tcCA9PSBPTVhfVkNfQ0hST01JTkFOQ0UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChRUCA+PSAxICYmIFFQIDw9IDQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZGNTY2FsZXIgPSA4OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoUVAgPj0gNSAmJiBRUCA8PSAyNCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkY1NjYWxlciA9IChRUCArIDEzKS8yOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRjU2NhbGVyID0gUVAgLSA2OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIC8qIERlcXVhbnQgdGhlIERDIHZhbHVlLCB0aGlzIGFwcGxpZXMgdG8gYm90aCB0aGUgbWV0aG9kcyAqLwotICAgIHBTcmNEc3RbMF0gPSBwU3JjRHN0WzBdICogZGNTY2FsZXI7Ci0KLSAgICAvKiBTYXR1cmF0ZSAqLwotICAgIHBTcmNEc3RbMF0gPSBhcm1DbGlwICgtMjA0OCwgMjA0NywgcFNyY0RzdFswXSk7Ci0KLSAgICAvKiBTZWNvbmQgSW52ZXJzZSBxdWFudGlzYXRpb24gbWV0aG9kICovCi0gICAgZm9yIChjb2VmZkNvdW50ID0gMTsgY29lZmZDb3VudCA8IDY0OyBjb2VmZkNvdW50KyspCi0gICAgewotICAgICAgICAvKiBjaGVjayBzaWduICovCi0gICAgICAgIFNpZ24gPSAgYXJtU2lnbkNoZWNrIChwU3JjRHN0W2NvZWZmQ291bnRdKTsgIAotCi0gICAgICAgIGlmIChRUCAmIDB4MSkKLSAgICAgICAgewotICAgICAgICAgICAgcFNyY0RzdFtjb2VmZkNvdW50XSA9ICgyKiBhcm1BYnMocFNyY0RzdFtjb2VmZkNvdW50XSkgKyAxKSAqIFFQOwotICAgICAgICAgICAgcFNyY0RzdFtjb2VmZkNvdW50XSAqPSBTaWduOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcFNyY0RzdFtjb2VmZkNvdW50XSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgyKiBhcm1BYnMocFNyY0RzdFtjb2VmZkNvdW50XSkgKyAxKSAqIFFQIC0gMTsKLSAgICAgICAgICAgIHBTcmNEc3RbY29lZmZDb3VudF0gKj0gU2lnbjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIFNhdHVyYXRlICovCi0gICAgICAgIHBTcmNEc3RbY29lZmZDb3VudF0gPSBhcm1DbGlwICgtMjA0OCwgMjA0NywgcFNyY0RzdFtjb2VmZkNvdW50XSk7Ci0gICAgfQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotCi19Ci0KLS8qIEVuZCBvZiBmaWxlICovCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50ZXIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2MTVhNzcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50ZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludGVyLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnRhaW5zIG1vZHVsZXMgRENULT5xdWFudCBhbmQgcmVjb25zdHJ1Y3RpbmcgdGhlIGludGVyIHRleHR1cmUgZGF0YQotICogCi0gKi8gCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRlciAgICg2LjIuNC40LjUpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBJbXBsZW1lbnRzIERDVCwgYW5kIHF1YW50aXplcyB0aGUgRENUIGNvZWZmaWNpZW50cyBvZiB0aGUgaW50ZXIgYmxvY2sgCi0gKiB3aGlsZSByZWNvbnN0cnVjdGluZyB0aGUgdGV4dHVyZSByZXNpZHVhbC4gVGhlcmUgaXMgbm8gYm91bmRhcnkgY2hlY2sgZm9yIAotICogdGhlIGJpdCBzdHJlYW0gYnVmZmVyLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC1wb2ludGVyIHRvIHRoZSByZXNpZHVhbHMgdG8gYmUgZW5jb2RlZDsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIAotICogICAgICAgICAgICAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyLiAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyAKLSAqICAgICAgICAgICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgbW9kZSwgYW5kIAotICogICAgICAgICAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50cyBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCAKLSAqICAgICAgICAgICAgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcFJlYyAtIHBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgdGV4dHVyZSByZXNpZHVhbHM7IG11c3QgYmUgYWxpZ25lZCAKLSAqICAgICAgICAgICAgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgZWl0aGVyIE5VTEwgb3IgCi0gKiAgICAgICAgIG5vdCAxNi1ieXRlIGFsaWduZWQ6IAotICogICAgICAgICAgICAtIHBTcmMgCi0gKiAgICAgICAgICAgIC0gcERzdAotICogICAgICAgICAgICAtIHBSZWMKLSAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PSAzMi4gCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50ZXIoCi0gICAgIGNvbnN0IE9NWF9TMTYgKnBTcmMsCi0gICAgIE9NWF9TMTYgKiBwRHN0LAotICAgICBPTVhfUzE2ICogcFJlYywKLSAgICAgT01YX1U4IFFQLAotICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSkKLXsKLSAgICAvKiA2NCBlbGVtZW50cyBhcmUgbmVlZGVkIGJ1dCB0byBhbGlnbiBpdCB0byAxNiBieXRlcyBuZWVkIAotICAgIDggbW9yZSBlbGVtZW50cyBvZiBwYWRkaW5nICovCi0gICAgT01YX1MxNiB0ZW1wQnVmZmVyWzcyXTsKLSAgICBPTVhfUzE2ICpwVGVtcEJ1ZmZlcjsKLSAgICBPTVhfSU5UIGk7Ci0gICAgICAgIAotICAgIC8qIEFsaWduaW5nIHRoZSBsb2NhbCBidWZmZXJzICovCi0gICAgcFRlbXBCdWZmZXIgPSBhcm1BbGlnblRvMTZCeXRlcyh0ZW1wQnVmZmVyKTsKLQotICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLwotICAgIGFybVJldEFyZ0VycklmKHBTcmMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBSZWMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCFhcm1JczE2Qnl0ZUFsaWduZWQocFNyYyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZighYXJtSXMxNkJ5dGVBbGlnbmVkKHBSZWMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoIWFybUlzMTZCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCgoUVAgPD0gMCkgfHwgKFFQID49IDMyKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICAKLSAgICBvbXhWQ000UDJfRENUOHg4YmxrIChwU3JjLCBwRHN0KTsKLSAgICBvbXhWQ000UDJfUXVhbnRJbnRlcl9JKAotICAgICBwRHN0LAotICAgICBRUCwKLSAgICAgc2hvcnRWaWRlb0hlYWRlcik7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykKLSAgICB7Ci0gICAgICAgIHBUZW1wQnVmZmVyW2ldID0gcERzdFtpXTsKLSAgICB9Ci0KLSAgICBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JKAotICAgICBwVGVtcEJ1ZmZlciwKLSAgICAgUVApOwotICAgIG9teFZDTTRQMl9JRENUOHg4YmxrIChwVGVtcEJ1ZmZlciwgcFJlYyk7Ci0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotLyogRW5kIG9mIGZpbGUgKi8KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50cmEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkyM2UzZi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjc1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50cmEuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udGFpbnMgbW9kdWxlcyBEQ1QtPnF1YW50IGFuZCByZWNvbnN0cnVjdGluZyB0aGUgaW50cmEgdGV4dHVyZSBkYXRhCi0gKiAKLSAqLyAKLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludHJhICAgKDYuMi40LjQuNCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFF1YW50aXplcyB0aGUgRENUIGNvZWZmaWNpZW50cywgaW1wbGVtZW50cyBpbnRyYSBibG9jayBBQy9EQyBjb2VmZmljaWVudCAKLSAqIHByZWRpY3Rpb24sIGFuZCByZWNvbnN0cnVjdHMgdGhlIGN1cnJlbnQgaW50cmEgYmxvY2sgdGV4dHVyZSBmb3IgcHJlZGljdGlvbiAKLSAqIG9uIHRoZSBuZXh0IGZyYW1lLiAgUXVhbnRpemVkIHJvdyBhbmQgY29sdW1uIGNvZWZmaWNpZW50cyBhcmUgcmV0dXJuZWQgaW4gCi0gKiB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCBidWZmZXJzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgcGl4ZWxzIG9mIGN1cnJlbnQgaW50cmEgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiAKLSAqICAgICAgICAgICAgYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcFByZWRCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyIGNvbnRhaW5pbmcgCi0gKiAgICAgICAgICAgICgobnVtX21iX3Blcl9yb3cgKiAyICsgMSkgKiA4KSBlbGVtZW50cyBvZiB0eXBlIE9NWF9TMTYuIAotICogICAgICAgICAgICBDb2VmZmljaWVudHMgYXJlIG9yZ2FuaXplZCBpbnRvIGJsb2NrcyBvZiBlaWdodCBhcyBkZXNjcmliZWQgCi0gKiAgICAgICAgICAgIGJlbG93IChJbnRlcm5hbCBQcmVkaWN0aW9uIENvZWZmaWNpZW50IFVwZGF0ZSBQcm9jZWR1cmVzKS4gIFRoZSAKLSAqICAgICAgICAgICAgREMgY29lZmZpY2llbnQgaXMgZmlyc3QsIGFuZCB0aGUgcmVtYWluaW5nIGJ1ZmZlciBsb2NhdGlvbnMgCi0gKiAgICAgICAgICAgIGNvbnRhaW4gdGhlIHF1YW50aXplZCBBQyBjb2VmZmljaWVudHMuIEVhY2ggZ3JvdXAgb2YgZWlnaHQgcm93IAotICogICAgICAgICAgICBidWZmZXIgZWxlbWVudHMgY29tYmluZWQgd2l0aCBvbmUgZWxlbWVudCBlaWdodCBlbGVtZW50cyBhaGVhZCAKLSAqICAgICAgICAgICAgY29udGFpbnMgdGhlIGNvZWZmaWNpZW50IHByZWRpY3RvcnMgb2YgdGhlIG5laWdoYm9yaW5nIGJsb2NrIAotICogICAgICAgICAgICB0aGF0IGlzIHNwYXRpYWxseSBhYm92ZSBvciB0byB0aGUgbGVmdCBvZiB0aGUgYmxvY2sgY3VycmVudGx5IHRvIAotICogICAgICAgICAgICBiZSBkZWNvZGVkLiBBIG5lZ2F0aXZlLXZhbHVlZCBEQyBjb2VmZmljaWVudCBpbmRpY2F0ZXMgdGhhdCB0aGlzIAotICogICAgICAgICAgICBuZWlnaGJvcmluZyBibG9jayBpcyBub3QgSU5UUkEtY29kZWQgb3Igb3V0IG9mIGJvdW5kcywgYW5kIAotICogICAgICAgICAgICB0aGVyZWZvcmUgdGhlIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgYXJlIGludmFsaWQuICBQb2ludGVyIG11c3QgCi0gKiAgICAgICAgICAgIGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcFByZWRCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSBwcmVkaWN0aW9uIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIgCi0gKiAgICAgICAgICAgIGNvbnRhaW5pbmcgMTYgZWxlbWVudHMgb2YgdHlwZSBPTVhfUzE2LiBDb2VmZmljaWVudHMgYXJlIAotICogICAgICAgICAgICBvcmdhbml6ZWQgYXMgZGVzY3JpYmVkIGluIHNlY3Rpb24gNi4yLjIuNS4gIFBvaW50ZXIgbXVzdCBiZSAKLSAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICBwU3VtRXJyIC0gcG9pbnRlciB0byBhIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCBBQyBwcmVkaWN0aW9uIGlzIAotICogICAgICAgICAgICByZXF1aXJlZDsgQUMgcHJlZGljdGlvbiBpcyBlbmFibGVkIGlmICpwU3VtRXJyID49MCwgYnV0IHRoZSAKLSAqICAgICAgICAgICAgdmFsdWUgaXMgbm90IHVzZWQgZm9yIGNvZWZmaWNpZW50IHByZWRpY3Rpb24sIGkuZS4sIHRoZSBzdW0gb2YgCi0gKiAgICAgICAgICAgIGFic29sdXRlIGRpZmZlcmVuY2VzIHN0YXJ0cyBmcm9tIDAgZm9yIGVhY2ggY2FsbCB0byB0aGlzIAotICogICAgICAgICAgICBmdW5jdGlvbi4gIE90aGVyd2lzZSBBQyBwcmVkaWN0aW9uIGlzIGRpc2FibGVkIGlmICpwU3VtRXJyIDwgMCAuIAotICogICBibG9ja0luZGV4IC0gYmxvY2sgaW5kZXggaW5kaWNhdGluZyB0aGUgY29tcG9uZW50IHR5cGUgYW5kIHBvc2l0aW9uLCBhcyAKLSAqICAgICAgICAgICAgZGVmaW5lZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA2LjEuMy44LiAKLSAqICAgY3VyUXAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBtYWNyb2Jsb2NrIHRvIHdoaWNoIHRoZSBjdXJyZW50IAotICogICAgICAgICAgICBibG9jayBiZWxvbmdzIAotICogICBwUXBCdWYgLSBwb2ludGVyIHRvIGEgMi1lbGVtZW50IHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYnVmZmVyOyBwUXBCdWZbMF0gCi0gKiAgICAgICAgICAgIGNvbnRhaW5zIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgOHg4IAotICogICAgICAgICAgICBibG9jayBsZWZ0IG9mIHRoZSBjdXJyZW50IGJsb2NrIChRUGEpLCBhbmQgcFFwQnVmWzFdIGNvbnRhaW5zIAotICogICAgICAgICAgICB0aGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBhc3NvY2lhdGVkIHdpdGggdGhlIDh4OCBibG9jayBhYm92ZSAKLSAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgYmxvY2sgKFFQYykuICBJbiB0aGUgZXZlbnQgdGhhdCB0aGUgY29ycmVzcG9uZGluZyAKLSAqICAgICAgICAgICAgYmxvY2sgaXMgb3V0c2lkZSBvZiB0aGUgVk9QIGJvdW5kLCB0aGUgUXAgdmFsdWUgd2lsbCBub3QgYWZmZWN0IAotICogICAgICAgICAgICB0aGUgaW50cmEgcHJlZGljdGlvbiBwcm9jZXNzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCAKLSAqICAgICAgICAgICAgc3ViLWNsYXVzZSA3LjQuMy4zLCAgQWRhcHRpdmUgQUMgQ29lZmZpY2llbnQgUHJlZGljdGlvbi4gIAotICogICBzcmNTdGVwIC0gd2lkdGggb2YgdGhlIHNvdXJjZSBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgZHN0U3RlcCAtIHdpZHRoIG9mIHRoZSByZWNvbnN0cnVjdGVkIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIAotICogICAgICAgICAgICBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAotICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgCi0gKiAgICAgICAgICAgIG1vZGUsIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQgYnVmZmVyOyBwRHN0WzBdIGNvbnRhaW5zIAotICogICAgICAgICAgICB0aGUgcHJlZGljdGVkIERDIGNvZWZmaWNpZW50OyB0aGUgcmVtYWluaW5nIGVudHJpZXMgY29udGFpbiB0aGUgCi0gKiAgICAgICAgICAgIHF1YW50aXplZCBBQyBjb2VmZmljaWVudHMgKHdpdGhvdXQgcHJlZGljdGlvbikuICBUaGUgcG9pbnRlciAKLSAqICAgICAgICAgICAgcERzdG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICogICBwUmVjIC0gcG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCB0ZXh0dXJlOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gCi0gKiAgICAgICAgICAgIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBQcmVkQnVmUm93IC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyIAotICogICBwUHJlZEJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlciAKLSAqICAgcFByZUFDUHJlZGljdCAtIGlmIHByZWRpY3Rpb24gaXMgZW5hYmxlZCwgdGhlIHBhcmFtZXRlciBwb2ludHMgdG8gdGhlIAotICogICAgICAgICAgICBzdGFydCBvZiB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGNvZWZmaWNpZW50IGRpZmZlcmVuY2VzIGZvciAKLSAqICAgICAgICAgICAgVkxDIGVuY29kaW5nLiBUaGUgZW50cnkgcFByZUFDUHJlZGljdFswXWluZGljYXRlcyBwcmVkaWN0aW9uIAotICogICAgICAgICAgICBkaXJlY3Rpb24gZm9yIHRoZSBjdXJyZW50IGJsb2NrIGFuZCB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgdmFsdWVzOiBPTVhfVkNfTk9ORSAocHJlZGljdGlvbiBkaXNhYmxlZCksIE9NWF9WQ19IT1JJWk9OVEFMLCBvciAKLSAqICAgICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMLiAgVGhlIGVudHJpZXMgCi0gKiAgICAgICAgICAgIHBQcmVBQ1ByZWRpY3RbMV0tcFByZUFDUHJlZGljdFs3XWNvbnRhaW4gcHJlZGljdGVkIEFDIAotICogICAgICAgICAgICBjb2VmZmljaWVudHMuICBJZiBwcmVkaWN0aW9uIGlzIGRpc2FibGVkICgqcFN1bUVycjwwKSB0aGVuIHRoZSAKLSAqICAgICAgICAgICAgY29udGVudHMgb2YgdGhpcyBidWZmZXIgYXJlIHVuZGVmaW5lZCB1cG9uIHJldHVybiBmcm9tIHRoZSAKLSAqICAgICAgICAgICAgZnVuY3Rpb24gCi0gKiAgIHBTdW1FcnIgLSBwb2ludGVyIHRvIHRoZSB2YWx1ZSBvZiB0aGUgYWNjdW11bGF0ZWQgQUMgY29lZmZpY2llbnQgZXJyb3JzLCAKLSAqICAgICAgICAgICAgaS5lLiwgc3VtIG9mIHRoZSBhYnNvbHV0ZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHByZWRpY3RlZCBhbmQgCi0gKiAgICAgICAgICAgIHVucHJlZGljdGVkIEFDIGNvZWZmaWNpZW50cyAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gQmFkIGFyZ3VtZW50czoKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcERzdCwgcFJlYywgCi0gKiAgICAgICAgIHBDb2VmQnVmUm93LCBwQ29lZkJ1ZkNvbCwgcFFwQnVmLCBwUHJlQUNQcmVkaWN0LCBwU3VtRXJyLiAKLSAqICAgIC0gICAgYmxvY2tJbmRleCA8IDAgb3IgYmxvY2tJbmRleCA+PSAxMDsgCi0gKiAgICAtICAgIGN1clFQIDw9IDAgb3IgY3VyUVAgPj0gMzIuIAotICogICAgLSAgICBzcmNTdGVwLCBvciBkc3RTdGVwIDw9IDAgb3Igbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgICAtICAgIHBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZDogLiAKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgbm90IDgtYnl0ZSBhbGlnbmVkOiAKLSAqICAgICAgICAgcFNyYywgcFJlYy4gIAotICoKLSAqICBOb3RlOiBUaGUgY29lZmZpY2llbnQgYnVmZmVycyBtdXN0IGJlIHVwZGF0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSAKLSAqICAgICAgICB1cGRhdGUgcHJvY2VkdXJlcyBkZWZpbmVkIGluIHNlY3Rpb24gaW4gNi4yLjIuIAotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludHJhKAotICAgICBjb25zdCBPTVhfVTggKnBTcmMsCi0gICAgIE9NWF9TMTYgKiBwRHN0LAotICAgICBPTVhfVTggKiBwUmVjLAotICAgICBPTVhfUzE2ICpwUHJlZEJ1ZlJvdywKLSAgICAgT01YX1MxNiAqcFByZWRCdWZDb2wsCi0gICAgIE9NWF9TMTYgKiBwUHJlQUNQcmVkaWN0LAotICAgICBPTVhfSU5UICpwU3VtRXJyLAotICAgICBPTVhfSU5UIGJsb2NrSW5kZXgsCi0gICAgIE9NWF9VOCBjdXJRcCwKLSAgICAgY29uc3QgT01YX1U4ICpwUXBCdWYsCi0gICAgIE9NWF9JTlQgc3JjU3RlcCwKLSAgICAgT01YX0lOVCBkc3RTdGVwLAotCSBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSkKLXsKLSAgICAvKiA2NCBlbGVtZW50cyBhcmUgbmVlZGVkIGJ1dCB0byBhbGlnbiBpdCB0byAxNiBieXRlcyBuZWVkCi0gICAgOCBtb3JlIGVsZW1lbnRzIG9mIHBhZGRpbmcgKi8KLSAgICBPTVhfUzE2IHRlbXBCdWYxWzc5XSwgdGVtcEJ1ZjJbNzldOwotICAgIE9NWF9TMTYgdGVtcEJ1ZjNbNzldOwotICAgIE9NWF9TMTYgKnBUZW1wQnVmMSwgKnBUZW1wQnVmMiwqcFRlbXBCdWYzOwotICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50IHZpZGVvQ29tcDsKLSAgICBPTVhfVTggIGZsYWc7Ci0gICAgT01YX0lOVCB4LCB5LCBjb3VudCwgcHJlZERpcjsKLSAgICBPTVhfSU5UIHByZWRRUCwgQUNQcmVkRmxhZzsKLSAgICAKLQotICAgIC8qIEFsaWduaW5nIHRoZSBsb2NhbCBidWZmZXJzICovCi0gICAgcFRlbXBCdWYxID0gYXJtQWxpZ25UbzE2Qnl0ZXModGVtcEJ1ZjEpOwotICAgIHBUZW1wQnVmMiA9IGFybUFsaWduVG8xNkJ5dGVzKHRlbXBCdWYyKTsKLSAgICBwVGVtcEJ1ZjMgPSBhcm1BbGlnblRvMTZCeXRlcyh0ZW1wQnVmMyk7Ci0KLSAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwUmVjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZighYXJtSXM4Qnl0ZUFsaWduZWQocFNyYyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZighYXJtSXM4Qnl0ZUFsaWduZWQocFJlYyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZighYXJtSXMxNkJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFByZWRCdWZSb3cgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBQcmVkQnVmQ29sID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwUHJlQUNQcmVkaWN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwU3VtRXJyID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwUXBCdWYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChzcmNTdGVwIDw9IDApIHx8IChkc3RTdGVwIDw9IDApIHx8Ci0gICAgICAgICAgICAgICAgKGRzdFN0ZXAgJiA3KSB8fCAoc3JjU3RlcCAmIDcpCi0gICAgICAgICAgICAgICAgLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKGJsb2NrSW5kZXggPCAwKSB8fCAoYmxvY2tJbmRleCA+IDkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0KLSAgICBhcm1SZXRBcmdFcnJJZigoY3VyUXAgPD0gMCkgfHwgKGN1clFwID49MzIpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0KLQotICAgLyogU2V0dGluZyB0aGUgdmlkZW9Db21wICovCi0gICAgaWYgKGJsb2NrSW5kZXggPD0gMykKLSAgICB7Ci0gICAgICAgIHZpZGVvQ29tcCA9IE9NWF9WQ19MVU1JTkFOQ0U7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHZpZGVvQ29tcCA9IE9NWF9WQ19DSFJPTUlOQU5DRTsKLSAgICB9Ci0gICAgLyogQ29udmVydGluZyBmcm9tIDItZCB0byAxLWQgYnVmZmVyICovCi0gICAgZm9yICh5ID0gMCwgY291bnQgPSAwOyB5IDwgODsgeSsrKQotICAgIHsKLSAgICAgICAgZm9yKHg9IDA7IHggPCA4OyB4KyssIGNvdW50KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBUZW1wQnVmMVtjb3VudF0gPSBwU3JjWyh5KnNyY1N0ZXApICsgeF07Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBvbXhWQ000UDJfRENUOHg4YmxrICAocFRlbXBCdWYxLCBwVGVtcEJ1ZjIpOwotICAgIG9teFZDTTRQMl9RdWFudEludHJhX0koCi0gICAgICAgIHBUZW1wQnVmMiwKLSAgICAgICAgY3VyUXAsCi0gICAgICAgIGJsb2NrSW5kZXgsCi0gICAgICAgIHNob3J0VmlkZW9IZWFkZXIpOwotCi0gICAgLyogQ29udmVydGluZyBmcm9tIDEtRCB0byAyLUQgYnVmZmVyICovCi0gICAgZm9yICh5ID0gMCwgY291bnQgPSAwOyB5IDwgODsgeSsrKQotICAgIHsKLSAgICAgICAgZm9yKHggPSAwOyB4IDwgODsgeCsrLCBjb3VudCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBzdG9yaW5nIHRlbXBidWYyIHRvIHRlbXBidWYxICovCi0gICAgICAgICAgICBwVGVtcEJ1ZjFbY291bnRdID0gcFRlbXBCdWYyW2NvdW50XTsKLSAgICAgICAgICAgIHBEc3RbKHkqZHN0U3RlcCkgKyB4XSA9IHBUZW1wQnVmMltjb3VudF07Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBBQyBhbmQgREMgcHJlZGljdGlvbiAqLwotICAgIGFybVZDTTRQMl9TZXRQcmVkRGlyKAotICAgICAgICBibG9ja0luZGV4LAotICAgICAgICBwUHJlZEJ1ZlJvdywKLSAgICAgICAgcFByZWRCdWZDb2wsCi0gICAgICAgICZwcmVkRGlyLAotICAgICAgICAmcHJlZFFQLAotICAgICAgICBwUXBCdWYpOwotCi0gICAgYXJtUmV0RGF0YUVycklmKCgocHJlZFFQIDw9IDApIHx8IChwcmVkUVAgPj0gMzIpKSwgT01YX1N0c19CYWRBcmdFcnIpOwotCi0gICAgZmxhZyA9IDE7Ci0gICAgaWYgKCpwU3VtRXJyIDwgMCkKLSAgICB7Ci0gICAgICAgIEFDUHJlZEZsYWcgPSAwOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBBQ1ByZWRGbGFnID0gMTsKLSAgICB9Ci0KLSAgICBhcm1WQ000UDJfQUNEQ1ByZWRpY3QoCi0gICAgICAgIHBUZW1wQnVmMiwKLSAgICAgICAgcFByZUFDUHJlZGljdCwKLSAgICAgICAgcFByZWRCdWZSb3csCi0gICAgICAgIHBQcmVkQnVmQ29sLAotICAgICAgICBjdXJRcCwKLSAgICAgICAgcHJlZFFQLAotICAgICAgICBwcmVkRGlyLAotICAgICAgICBBQ1ByZWRGbGFnLAotICAgICAgICB2aWRlb0NvbXAsCi0gICAgICAgIGZsYWcsCi0gICAgICAgIHBTdW1FcnIpOwotCi0gICAgLyogUmVjb25zdHJ1Y3RpbmcgdGhlIHRleHR1cmUgZGF0YSAqLwotICAgIG9teFZDTTRQMl9RdWFudEludkludHJhX0koCi0gICAgICAgIHBUZW1wQnVmMSwKLSAgICAgICAgY3VyUXAsCi0gICAgICAgIHZpZGVvQ29tcCwKLSAgICAgICAgc2hvcnRWaWRlb0hlYWRlcik7Ci0gICAgb214VkNNNFAyX0lEQ1Q4eDhibGsgKHBUZW1wQnVmMSwgcFRlbXBCdWYzKTsKLSAgICBmb3IoY291bnQgPSAwOyBjb3VudCA8IDY0OyBjb3VudCsrKQotICAgIHsKLSAgICAgICAgcFJlY1tjb3VudF0gPSBhcm1NYXgoMCxwVGVtcEJ1ZjNbY291bnRdKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotLyogRW5kIG9mIGZpbGUgKi8KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL3NyYy9hcm1WQ19WZXJzaW9uLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL3NyYy9hcm1WQ19WZXJzaW9uLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkOTM2ODEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9zcmMvYXJtVkNfVmVyc2lvbi5jCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1DT01NX1ZlcnNpb24uaCIKLQotI2lmZGVmIEFSTV9JTkNMVURFX1ZFUlNJT05fREVTQ1JJUFRJT05TCi1jb25zdCBjaGFyICogY29uc3Qgb214VkNfVmVyc2lvbkRlc2NyaXB0aW9uID0gIkFSTSBPcGVuTUFYIERMIHYiIEFSTV9WRVJTSU9OX1NUUklORyAiICAgUmVsPSIgT01YX0FSTV9SRUxFQVNFX1RBRyAiICAgQXJjaD0iIE9NWF9BUk1fQlVJTERfQVJDSElURUNUVVJFICIgICBUb29scz0iICBPTVhfQVJNX0JVSUxEX1RPT0xDSEFJTiA7Ci0jZW5kaWYgLyogQVJNX0lOQ0xVREVfVkVSU0lPTl9ERVNDUklQVElPTlMgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvRGVjVGVzdEJlbmNoLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL0RlY1Rlc3RCZW5jaC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWMwMDY1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvRGVjVGVzdEJlbmNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJIMjY0U3dEZWNBcGkuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBDSEVDS19NRU1PUllfVVNBR0UgcHJpbnRzIGFuZCBzdW1zIHRoZSBtZW1vcnkgYWxsb2NhdGVkIGluIGNhbGxzIHRvCi0gKiBIMjY0U3dEZWNNYWxsb2MoKSAqLwotLyogI2RlZmluZSBDSEVDS19NRU1PUllfVVNBR0UgKi8KLQotLyogX05PX09VVCBkaXNhYmxlcyBvdXRwdXQgZmlsZSB3cml0aW5nICovCi0vKiAjZGVmaW5lIF9OT19PVVQgKi8KLQotLyogRGVidWcgcHJpbnRzICovCi0jZGVmaW5lIERFQlVHKGFyZ3YpIHByaW50ZiBhcmd2Ci0KLS8qIENWUyB0YWcgbmFtZSBmb3IgaWRlbnRpZmljYXRpb24gKi8KLWNvbnN0IGNoYXIgdGFnTmFtZVsyNTZdID0gIiROYW1lOiBGSVJTVF9BTkRST0lEX0NPUFlSSUdIVCAkIjsKLQotdm9pZCBXcml0ZU91dHB1dChjaGFyICpmaWxlbmFtZSwgdTggKmRhdGEsIHUzMiBwaWNTaXplKTsKLXUzMiBOZXh0UGFja2V0KHU4ICoqcFN0cm0pOwotdTMyIENyb3BQaWN0dXJlKHU4ICpwT3V0SW1hZ2UsIHU4ICpwSW5JbWFnZSwKLSAgICB1MzIgcGljV2lkdGgsIHUzMiBwaWNIZWlnaHQsIENyb3BQYXJhbXMgKnBDcm9wUGFyYW1zKTsKLQotLyogR2xvYmFsIHZhcmlhYmxlcyBmb3Igc3RyZWFtIGhhbmRsaW5nICovCi11OCAqc3RyZWFtU3RvcCA9IE5VTEw7Ci11MzIgcGFja2V0aXplID0gMDsKLXUzMiBuYWxVbml0U3RyZWFtID0gMDsKLUZJTEUgKmZvdXRwdXQgPSBOVUxMOwotCi0jaWZkZWYgU09DX0RFU0lHTkVSCi0KLS8vIEluaXRpYWxpc2F0aW9uIGZ1bmN0aW9uIGRlZmluZWQgaW4gSW5pdENhY2hlLnMKLWV4dGVybiB2b2lkIGNhY2hlX2luaXQodm9pZCk7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbiBuYW1lOiAgJFN1YiQkbWFpbgotCi0gICAgUHVycG9zZToKLSAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYXQgdGhlIGVuZCBvZiB0aGUgQyBsaWJyYXJ5IGluaXRpYWxpc2F0aW9uIGFuZAotICAgICAgICBiZWZvcmUgbWFpbi4gSXRzIHB1cnBvc2UgaXMgdG8gZG8gYW55IGZ1cnRoZXIgaW5pdGlhbGlzYXRpb24gYmVmb3JlIHRoZQotICAgICAgICBhcHBsaWNhdGlvbiBzdGFydC4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCAkU3ViJCRtYWluKGNoYXIgYXJnYywgY2hhciAqIGFyZ3ZbXSkKLXsKLSAgY2FjaGVfaW5pdCgpOyAgICAgICAgICAgICAgICAgICAgLy8gZG9lcyBzb21lIGV4dHJhIHNldHVwIHdvcmsgc2V0dGluZyB1cCBjYWNoZXMKLSAgcmV0dXJuICRTdXBlciQkbWFpbihhcmdjLCBhcmd2KTsgLy8gY2FsbHMgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uCi19Ci0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uIG5hbWU6ICBtYWluCi0KLSAgICBQdXJwb3NlOgotICAgICAgICBtYWluIGZ1bmN0aW9uIG9mIGRlY29kZXIgdGVzdGJlbmNoLiBQcm92aWRlcyBjb21tYW5kIGxpbmUgaW50ZXJmYWNlCi0gICAgICAgIHdpdGggZmlsZSBJL08gZm9yIEguMjY0IGRlY29kZXIuIFByaW50cyBvdXQgdGhlIHVzYWdlIGluZm9ybWF0aW9uCi0gICAgICAgIHdoZW4gZXhlY3V0ZWQgd2l0aG91dCBhcmd1bWVudHMuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLQotICAgIHUzMiBpLCB0bXA7Ci0gICAgdTMyIG1heE51bVBpY3MgPSAwOwotICAgIHU4ICpieXRlU3RybVN0YXJ0OwotICAgIHU4ICppbWFnZURhdGE7Ci0gICAgdTggKnRtcEltYWdlID0gTlVMTDsKLSAgICB1MzIgc3RybUxlbjsKLSAgICB1MzIgcGljU2l6ZTsKLSAgICBIMjY0U3dEZWNJbnN0IGRlY0luc3Q7Ci0gICAgSDI2NFN3RGVjUmV0IHJldDsKLSAgICBIMjY0U3dEZWNJbnB1dCBkZWNJbnB1dDsKLSAgICBIMjY0U3dEZWNPdXRwdXQgZGVjT3V0cHV0OwotICAgIEgyNjRTd0RlY1BpY3R1cmUgZGVjUGljdHVyZTsKLSAgICBIMjY0U3dEZWNJbmZvIGRlY0luZm87Ci0gICAgSDI2NFN3RGVjQXBpVmVyc2lvbiBkZWNWZXI7Ci0gICAgdTMyIHBpY0RlY29kZU51bWJlcjsKLSAgICB1MzIgcGljRGlzcGxheU51bWJlcjsKLSAgICB1MzIgbnVtRXJyb3JzID0gMDsKLSAgICB1MzIgY3JvcERpc3BsYXkgPSAwOwotICAgIHUzMiBkaXNhYmxlT3V0cHV0UmVvcmRlcmluZyA9IDA7Ci0KLSAgICBGSUxFICpmaW5wdXQ7Ci0KLSAgICBjaGFyIG91dEZpbGVOYW1lWzI1Nl0gPSAiIjsKLQotICAgIC8qIFByaW50IEFQSSB2ZXJzaW9uIG51bWJlciAqLwotICAgIGRlY1ZlciA9IEgyNjRTd0RlY0dldEFQSVZlcnNpb24oKTsKLSAgICBERUJVRygoIkguMjY0IERlY29kZXIgQVBJIHYlZC4lZFxuIiwgZGVjVmVyLm1ham9yLCBkZWNWZXIubWlub3IpKTsKLQotICAgIC8qIFByaW50IHRhZyBuYW1lIGlmICctVCcgYXJndW1lbnQgcHJlc2VudCAqLwotICAgIGlmICggYXJnYyA+IDEgJiYgc3RyY21wKGFyZ3ZbMV0sICItVCIpID09IDAgKQotICAgIHsKLSAgICAgICAgREVCVUcoKCIlc1xuIiwgdGFnTmFtZSkpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayB0aGF0IGVub3VnaCBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGdpdmVuLCBpZiBub3QgLT4gcHJpbnQgdXNhZ2UKLSAgICAgKiBpbmZvcm1hdGlvbiBvdXQgKi8KLSAgICBpZiAoYXJnYyA8IDIpCi0gICAgewotICAgICAgICBERUJVRygoCi0gICAgICAgICAgICAiVXNhZ2U6ICVzIFstTm5dIFstT291dGZpbGVdIFstUF0gWy1VXSBbLUNdIFstUl0gWy1UXSBmaWxlLmgyNjRcbiIsCi0gICAgICAgICAgICBhcmd2WzBdKSk7Ci0gICAgICAgIERFQlVHKCgiXHQtTm4gZm9yY2VzIGRlY29kaW5nIHRvIHN0b3AgYWZ0ZXIgbiBwaWN0dXJlc1xuIikpOwotI2lmIGRlZmluZWQoX05PX09VVCkKLSAgICAgICAgREVCVUcoKCJcdC1Pb3V0ZmlsZSBvdXRwdXQgd3JpdGluZyBkaXNhYmxlZCBhdCBjb21waWxlIHRpbWVcbiIpKTsKLSNlbHNlCi0gICAgICAgIERFQlVHKCgiXHQtT291dGZpbGUgd3JpdGUgb3V0cHV0IHRvIFwib3V0ZmlsZVwiIChkZWZhdWx0IG91dF93eHh4aHl5eS55dXYpXG4iKSk7Ci0gICAgICAgIERFQlVHKCgiXHQtT25vbmUgZG9lcyBub3Qgd3JpdGUgb3V0cHV0XG4iKSk7Ci0jZW5kaWYKLSAgICAgICAgREVCVUcoKCJcdC1QIHBhY2tldC1ieS1wYWNrZXQgbW9kZVxuIikpOwotICAgICAgICBERUJVRygoIlx0LVUgTkFMIHVuaXQgc3RyZWFtIG1vZGVcbiIpKTsKLSAgICAgICAgREVCVUcoKCJcdC1DIGRpc3BsYXkgY3JvcHBlZCBpbWFnZSAoZGVmYXVsdCBkZWNvZGVkIGltYWdlKVxuIikpOwotICAgICAgICBERUJVRygoIlx0LVIgZGlzYWJsZSBEUEIgb3V0cHV0IHJlb3JkZXJpbmdcbiIpKTsKLSAgICAgICAgREVCVUcoKCJcdC1UIHRvIHByaW50IHRhZyBuYW1lIGFuZCBleGl0XG4iKSk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8qIHJlYWQgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyAqLwotICAgIGZvciAoaSA9IDE7IGkgPCAodTMyKShhcmdjLTEpOyBpKyspCi0gICAgewotICAgICAgICBpZiAoIHN0cm5jbXAoYXJndltpXSwgIi1OIiwgMikgPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1heE51bVBpY3MgPSAodTMyKWF0b2koYXJndltpXSsyKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICggc3RybmNtcChhcmd2W2ldLCAiLU8iLCAyKSA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgICAgc3RyY3B5KG91dEZpbGVOYW1lLCBhcmd2W2ldKzIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCBzdHJjbXAoYXJndltpXSwgIi1QIikgPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBhY2tldGl6ZSA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIHN0cmNtcChhcmd2W2ldLCAiLVUiKSA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgICAgbmFsVW5pdFN0cmVhbSA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIHN0cmNtcChhcmd2W2ldLCAiLUMiKSA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgICAgY3JvcERpc3BsYXkgPSAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCBzdHJjbXAoYXJndltpXSwgIi1SIikgPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRpc2FibGVPdXRwdXRSZW9yZGVyaW5nID0gMTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIG9wZW4gaW5wdXQgZmlsZSBmb3IgcmVhZGluZywgZmlsZSBuYW1lIGdpdmVuIGJ5IHVzZXIuIElmIGZpbGUgb3BlbgotICAgICAqIGZhaWxzIC0+IGV4aXQgKi8KLSAgICBmaW5wdXQgPSBmb3Blbihhcmd2W2FyZ2MtMV0sInJiIik7Ci0gICAgaWYgKGZpbnB1dCA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgREVCVUcoKCJVTkFCTEUgVE8gT1BFTiBJTlBVVCBGSUxFXG4iKSk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKiBjaGVjayBzaXplIG9mIHRoZSBpbnB1dCBmaWxlIC0+IGxlbmd0aCBvZiB0aGUgc3RyZWFtIGluIGJ5dGVzICovCi0gICAgZnNlZWsoZmlucHV0LDBMLFNFRUtfRU5EKTsKLSAgICBzdHJtTGVuID0gKHUzMilmdGVsbChmaW5wdXQpOwotICAgIHJld2luZChmaW5wdXQpOwotCi0gICAgLyogYWxsb2NhdGUgbWVtb3J5IGZvciBzdHJlYW0gYnVmZmVyLiBpZiB1bnN1Y2Nlc3NmdWwgLT4gZXhpdCAqLwotICAgIGJ5dGVTdHJtU3RhcnQgPSAodTggKiltYWxsb2Moc2l6ZW9mKHU4KSpzdHJtTGVuKTsKLSAgICBpZiAoYnl0ZVN0cm1TdGFydCA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgREVCVUcoKCJVTkFCTEUgVE8gQUxMT0NBVEUgTUVNT1JZXG4iKSk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKiByZWFkIGlucHV0IHN0cmVhbSBmcm9tIGZpbGUgdG8gYnVmZmVyIGFuZCBjbG9zZSBpbnB1dCBmaWxlICovCi0gICAgZnJlYWQoYnl0ZVN0cm1TdGFydCwgc2l6ZW9mKHU4KSwgc3RybUxlbiwgZmlucHV0KTsKLSAgICBmY2xvc2UoZmlucHV0KTsKLQotICAgIC8qIGluaXRpYWxpemUgZGVjb2Rlci4gSWYgdW5zdWNjZXNzZnVsIC0+IGV4aXQgKi8KLSAgICByZXQgPSBIMjY0U3dEZWNJbml0KCZkZWNJbnN0LCBkaXNhYmxlT3V0cHV0UmVvcmRlcmluZyk7Ci0gICAgaWYgKHJldCAhPSBIMjY0U1dERUNfT0spCi0gICAgewotICAgICAgICBERUJVRygoIkRFQ09ERVIgSU5JVElBTElaQVRJT04gRkFJTEVEXG4iKSk7Ci0gICAgICAgIGZyZWUoYnl0ZVN0cm1TdGFydCk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKiBpbml0aWFsaXplIEgyNjRTd0RlY0RlY29kZSgpIGlucHV0IHN0cnVjdHVyZSAqLwotICAgIHN0cmVhbVN0b3AgPSBieXRlU3RybVN0YXJ0ICsgc3RybUxlbjsKLSAgICBkZWNJbnB1dC5wU3RyZWFtID0gYnl0ZVN0cm1TdGFydDsKLSAgICBkZWNJbnB1dC5kYXRhTGVuID0gc3RybUxlbjsKLSAgICBkZWNJbnB1dC5pbnRyYUNvbmNlYWxtZW50TWV0aG9kID0gMDsKLQotICAgIC8qIGdldCBwb2ludGVyIHRvIG5leHQgcGFja2V0IGFuZCB0aGUgc2l6ZSBvZiBwYWNrZXQKLSAgICAgKiAoZm9yIHBhY2tldGl6ZSBvciBuYWxVbml0U3RyZWFtIG1vZGVzKSAqLwotICAgIGlmICggKHRtcCA9IE5leHRQYWNrZXQoJmRlY0lucHV0LnBTdHJlYW0pKSAhPSAwICkKLSAgICAgICAgZGVjSW5wdXQuZGF0YUxlbiA9IHRtcDsKLQotICAgIHBpY0RlY29kZU51bWJlciA9IHBpY0Rpc3BsYXlOdW1iZXIgPSAxOwotICAgIC8qIG1haW4gZGVjb2RpbmcgbG9vcCAqLwotICAgIGRvCi0gICAgewotICAgICAgICAvKiBQaWN0dXJlIElEIGlzIHRoZSBwaWN0dXJlIG51bWJlciBpbiBkZWNvZGluZyBvcmRlciAqLwotICAgICAgICBkZWNJbnB1dC5waWNJZCA9IHBpY0RlY29kZU51bWJlcjsKLQotICAgICAgICAvKiBjYWxsIEFQSSBmdW5jdGlvbiB0byBwZXJmb3JtIGRlY29kaW5nICovCi0gICAgICAgIHJldCA9IEgyNjRTd0RlY0RlY29kZShkZWNJbnN0LCAmZGVjSW5wdXQsICZkZWNPdXRwdXQpOwotCi0gICAgICAgIHN3aXRjaChyZXQpCi0gICAgICAgIHsKLQotICAgICAgICAgICAgY2FzZSBIMjY0U1dERUNfSERSU19SRFlfQlVGRl9OT1RfRU1QVFk6Ci0gICAgICAgICAgICAgICAgLyogU3RyZWFtIGhlYWRlcnMgd2VyZSBzdWNjZXNzZnVsbHkgZGVjb2RlZAotICAgICAgICAgICAgICAgICAqIC0+IHN0cmVhbSBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUgZm9yIHF1ZXJ5IG5vdyAqLwotCi0gICAgICAgICAgICAgICAgcmV0ID0gSDI2NFN3RGVjR2V0SW5mbyhkZWNJbnN0LCAmZGVjSW5mbyk7Ci0gICAgICAgICAgICAgICAgaWYgKHJldCAhPSBIMjY0U1dERUNfT0spCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLQotICAgICAgICAgICAgICAgIERFQlVHKCgiUHJvZmlsZSAlZFxuIiwgZGVjSW5mby5wcm9maWxlKSk7Ci0KLSAgICAgICAgICAgICAgICBERUJVRygoIldpZHRoICVkIEhlaWdodCAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgZGVjSW5mby5waWNXaWR0aCwgZGVjSW5mby5waWNIZWlnaHQpKTsKLQotICAgICAgICAgICAgICAgIGlmIChjcm9wRGlzcGxheSAmJiBkZWNJbmZvLmNyb3BwaW5nRmxhZykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHKCgiQ3JvcHBpbmcgcGFyYW1zOiAoJWQsICVkKSAlZHglZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlY0luZm8uY3JvcFBhcmFtcy5jcm9wTGVmdE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlY0luZm8uY3JvcFBhcmFtcy5jcm9wVG9wT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgZGVjSW5mby5jcm9wUGFyYW1zLmNyb3BPdXRXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlY0luZm8uY3JvcFBhcmFtcy5jcm9wT3V0SGVpZ2h0KSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogQ3JvcHBlZCBmcmFtZSBzaXplIGluIHBsYW5hciBZVVYgNDoyOjAgKi8KLSAgICAgICAgICAgICAgICAgICAgcGljU2l6ZSA9IGRlY0luZm8uY3JvcFBhcmFtcy5jcm9wT3V0V2lkdGggKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjSW5mby5jcm9wUGFyYW1zLmNyb3BPdXRIZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIHBpY1NpemUgPSAoMyAqIHBpY1NpemUpLzI7Ci0gICAgICAgICAgICAgICAgICAgIHRtcEltYWdlID0gbWFsbG9jKHBpY1NpemUpOwotICAgICAgICAgICAgICAgICAgICBpZiAodG1wSW1hZ2UgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogRGVjb2RlciBvdXRwdXQgZnJhbWUgc2l6ZSBpbiBwbGFuYXIgWVVWIDQ6MjowICovCi0gICAgICAgICAgICAgICAgICAgIHBpY1NpemUgPSBkZWNJbmZvLnBpY1dpZHRoICogZGVjSW5mby5waWNIZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIHBpY1NpemUgPSAoMyAqIHBpY1NpemUpLzI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgREVCVUcoKCJ2aWRlb1JhbmdlICVkLCBtYXRyaXhDb2VmZmljaWVudHMgJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgIGRlY0luZm8udmlkZW9SYW5nZSwgZGVjSW5mby5tYXRyaXhDb2VmZmljaWVudHMpKTsKLQotICAgICAgICAgICAgICAgIC8qIHVwZGF0ZSBIMjY0U3dEZWNEZWNvZGUoKSBpbnB1dCBzdHJ1Y3R1cmUsIG51bWJlciBvZiBieXRlcwotICAgICAgICAgICAgICAgICAqICJjb25zdW1lZCIgaXMgY29tcHV0ZWQgYXMgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBuZXcgc3RyZWFtCi0gICAgICAgICAgICAgICAgICogcG9pbnRlciBhbmQgb2xkIHN0cmVhbSBwb2ludGVyICovCi0gICAgICAgICAgICAgICAgZGVjSW5wdXQuZGF0YUxlbiAtPQotICAgICAgICAgICAgICAgICAgICAodTMyKShkZWNPdXRwdXQucFN0cm1DdXJyUG9zIC0gZGVjSW5wdXQucFN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgZGVjSW5wdXQucFN0cmVhbSA9IGRlY091dHB1dC5wU3RybUN1cnJQb3M7Ci0KLSAgICAgICAgICAgICAgICAvKiBJZiAtTyBvcHRpb24gbm90IHVzZWQsIGdlbmVyYXRlIGRlZmF1bHQgZmlsZSBuYW1lICovCi0gICAgICAgICAgICAgICAgaWYgKG91dEZpbGVOYW1lWzBdID09IDApCi0gICAgICAgICAgICAgICAgICAgIHNwcmludGYob3V0RmlsZU5hbWUsICJvdXRfdyVkaCVkLnl1diIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjSW5mby5waWNXaWR0aCwgZGVjSW5mby5waWNIZWlnaHQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIEgyNjRTV0RFQ19QSUNfUkRZX0JVRkZfTk9UX0VNUFRZOgotICAgICAgICAgICAgICAgIC8qIFBpY3R1cmUgaXMgcmVhZHkgYW5kIG1vcmUgZGF0YSByZW1haW5zIGluIGlucHV0IGJ1ZmZlcgotICAgICAgICAgICAgICAgICAqIC0+IHVwZGF0ZSBIMjY0U3dEZWNEZWNvZGUoKSBpbnB1dCBzdHJ1Y3R1cmUsIG51bWJlciBvZiBieXRlcwotICAgICAgICAgICAgICAgICAqICJjb25zdW1lZCIgaXMgY29tcHV0ZWQgYXMgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBuZXcgc3RyZWFtCi0gICAgICAgICAgICAgICAgICogcG9pbnRlciBhbmQgb2xkIHN0cmVhbSBwb2ludGVyICovCi0gICAgICAgICAgICAgICAgZGVjSW5wdXQuZGF0YUxlbiAtPQotICAgICAgICAgICAgICAgICAgICAodTMyKShkZWNPdXRwdXQucFN0cm1DdXJyUG9zIC0gZGVjSW5wdXQucFN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgZGVjSW5wdXQucFN0cmVhbSA9IGRlY091dHB1dC5wU3RybUN1cnJQb3M7Ci0gICAgICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCi0KLSAgICAgICAgICAgIGNhc2UgSDI2NFNXREVDX1BJQ19SRFk6Ci0KLSAgICAgICAgICAgICAgICAvKmxpbnQgLWVzeW0oNjQ0LHRtcEltYWdlLHBpY1NpemUpIHZhcmlhYmxlIGluaXRpYWxpemVkIGF0Ci0gICAgICAgICAgICAgICAgICogSDI2NFNXREVDX0hEUlNfUkRZX0JVRkZfTk9UX0VNUFRZIGNhc2UgKi8KLQotICAgICAgICAgICAgICAgIGlmIChyZXQgPT0gSDI2NFNXREVDX1BJQ19SRFkpCi0gICAgICAgICAgICAgICAgICAgIGRlY0lucHV0LmRhdGFMZW4gPSBOZXh0UGFja2V0KCZkZWNJbnB1dC5wU3RyZWFtKTsKLQotICAgICAgICAgICAgICAgIC8qIElmIGVub3VnaCBwaWN0dXJlcyBkZWNvZGVkIC0+IGZvcmNlIGRlY29kaW5nIHRvIGVuZAotICAgICAgICAgICAgICAgICAqIGJ5IHNldHRpbmcgdGhhdCBubyBtb3JlIHN0cmVhbSBpcyBhdmFpbGFibGUgKi8KLSAgICAgICAgICAgICAgICBpZiAobWF4TnVtUGljcyAmJiBwaWNEZWNvZGVOdW1iZXIgPT0gbWF4TnVtUGljcykKLSAgICAgICAgICAgICAgICAgICAgZGVjSW5wdXQuZGF0YUxlbiA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKiBJbmNyZW1lbnQgZGVjb2RpbmcgbnVtYmVyIGZvciBldmVyeSBkZWNvZGVkIHBpY3R1cmUgKi8KLSAgICAgICAgICAgICAgICBwaWNEZWNvZGVOdW1iZXIrKzsKLQotICAgICAgICAgICAgICAgIC8qIHVzZSBmdW5jdGlvbiBIMjY0U3dEZWNOZXh0UGljdHVyZSgpIHRvIG9idGFpbiBuZXh0IHBpY3R1cmUKLSAgICAgICAgICAgICAgICAgKiBpbiBkaXNwbGF5IG9yZGVyLiBGdW5jdGlvbiBpcyBjYWxsZWQgdW50aWwgbm8gbW9yZSBpbWFnZXMKLSAgICAgICAgICAgICAgICAgKiBhcmUgcmVhZHkgZm9yIGRpc3BsYXkgKi8KLSAgICAgICAgICAgICAgICB3aGlsZSAoIEgyNjRTd0RlY05leHRQaWN0dXJlKGRlY0luc3QsICZkZWNQaWN0dXJlLCAwKSA9PQotICAgICAgICAgICAgICAgICAgICAgICAgSDI2NFNXREVDX1BJQ19SRFkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUcoKCJQSUMgJWQsIHR5cGUgJXMiLCBwaWNEaXNwbGF5TnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgZGVjUGljdHVyZS5pc0lkclBpY3R1cmUgPyAiSURSIiA6ICJOT04tSURSIikpOwotICAgICAgICAgICAgICAgICAgICBpZiAocGljRGlzcGxheU51bWJlciAhPSBkZWNQaWN0dXJlLnBpY0lkKQotICAgICAgICAgICAgICAgICAgICAgICAgREVCVUcoKCIsIGRlY29kZWQgcGljICVkIiwgZGVjUGljdHVyZS5waWNJZCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZGVjUGljdHVyZS5uYnJPZkVyck1CcykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgREVCVUcoKCIsIGNvbmNlYWxlZCAlZFxuIiwgZGVjUGljdHVyZS5uYnJPZkVyck1CcykpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHKCgiXG4iKSk7Ci0gICAgICAgICAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOwotCi0gICAgICAgICAgICAgICAgICAgIG51bUVycm9ycyArPSBkZWNQaWN0dXJlLm5ick9mRXJyTUJzOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIEluY3JlbWVudCBkaXNwbGF5IG51bWJlciBmb3IgZXZlcnkgZGlzcGxheWVkIHBpY3R1cmUgKi8KLSAgICAgICAgICAgICAgICAgICAgcGljRGlzcGxheU51bWJlcisrOwotCi0gICAgICAgICAgICAgICAgICAgIC8qbGludCAtZXN5bSg2NDQsZGVjSW5mbykgYWx3YXlzIGluaXRpYWxpemVkIGlmIHBpY3R1cmVzCi0gICAgICAgICAgICAgICAgICAgICAqIGF2YWlsYWJsZSBmb3IgZGlzcGxheSAqLwotCi0gICAgICAgICAgICAgICAgICAgIC8qIFdyaXRlIG91dHB1dCBwaWN0dXJlIHRvIGZpbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgaW1hZ2VEYXRhID0gKHU4KilkZWNQaWN0dXJlLnBPdXRwdXRQaWN0dXJlOwotICAgICAgICAgICAgICAgICAgICBpZiAoY3JvcERpc3BsYXkgJiYgZGVjSW5mby5jcm9wcGluZ0ZsYWcpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IENyb3BQaWN0dXJlKHRtcEltYWdlLCBpbWFnZURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjSW5mby5waWNXaWR0aCwgZGVjSW5mby5waWNIZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlY0luZm8uY3JvcFBhcmFtcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodG1wKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlT3V0cHV0KG91dEZpbGVOYW1lLCB0bXBJbWFnZSwgcGljU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBXcml0ZU91dHB1dChvdXRGaWxlTmFtZSwgaW1hZ2VEYXRhLCBwaWNTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIEgyNjRTV0RFQ19TVFJNX1BST0NFU1NFRDoKLSAgICAgICAgICAgIGNhc2UgSDI2NFNXREVDX1NUUk1fRVJSOgotICAgICAgICAgICAgICAgIC8qIElucHV0IHN0cmVhbSB3YXMgZGVjb2RlZCBidXQgbm8gcGljdHVyZSBpcyByZWFkeQotICAgICAgICAgICAgICAgICAqIC0+IEdldCBtb3JlIGRhdGEgKi8KLSAgICAgICAgICAgICAgICBkZWNJbnB1dC5kYXRhTGVuID0gTmV4dFBhY2tldCgmZGVjSW5wdXQucFN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgREVCVUcoKCJGQVRBTCBFUlJPUlxuIikpOwotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLQotICAgICAgICB9Ci0gICAgLyoga2VlcCBkZWNvZGluZyB1bnRpbCBhbGwgZGF0YSBmcm9tIGlucHV0IHN0cmVhbSBidWZmZXIgY29uc3VtZWQgKi8KLSAgICB9IHdoaWxlIChkZWNJbnB1dC5kYXRhTGVuID4gMCk7Ci0KLSAgICAvKiBpZiBvdXRwdXQgaW4gZGlzcGxheSBvcmRlciBpcyBwcmVmZXJyZWQsIHRoZSBkZWNvZGVyIHNoYWxsIGJlIGZvcmNlZAotICAgICAqIHRvIG91dHB1dCBwaWN0dXJlcyByZW1haW5pbmcgaW4gZGVjb2RlZCBwaWN0dXJlIGJ1ZmZlci4gVXNlIGZ1bmN0aW9uCi0gICAgICogSDI2NFN3RGVjTmV4dFBpY3R1cmUoKSB0byBvYnRhaW4gbmV4dCBwaWN0dXJlIGluIGRpc3BsYXkgb3JkZXIuIEZ1bmN0aW9uCi0gICAgICogaXMgY2FsbGVkIHVudGlsIG5vIG1vcmUgaW1hZ2VzIGFyZSByZWFkeSBmb3IgZGlzcGxheS4gU2Vjb25kIHBhcmFtZXRlcgotICAgICAqIGZvciB0aGUgZnVuY3Rpb24gaXMgc2V0IHRvICcxJyB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgaXMgZW5kIG9mIHRoZQotICAgICAqIHN0cmVhbSBhbmQgYWxsIHBpY3R1cmVzIHNoYWxsIGJlIG91dHB1dCAqLwotICAgIHdoaWxlIChIMjY0U3dEZWNOZXh0UGljdHVyZShkZWNJbnN0LCAmZGVjUGljdHVyZSwgMSkgPT0gSDI2NFNXREVDX1BJQ19SRFkpCi0gICAgewotICAgICAgICBERUJVRygoIlBJQyAlZCwgdHlwZSAlcyIsIHBpY0Rpc3BsYXlOdW1iZXIsCi0gICAgICAgICAgICBkZWNQaWN0dXJlLmlzSWRyUGljdHVyZSA/ICJJRFIiIDogIk5PTi1JRFIiKSk7Ci0gICAgICAgIGlmIChwaWNEaXNwbGF5TnVtYmVyICE9IGRlY1BpY3R1cmUucGljSWQpCi0gICAgICAgICAgICBERUJVRygoIiwgZGVjb2RlZCBwaWMgJWQiLCBkZWNQaWN0dXJlLnBpY0lkKSk7Ci0gICAgICAgIGlmIChkZWNQaWN0dXJlLm5ick9mRXJyTUJzKQotICAgICAgICB7Ci0gICAgICAgICAgICBERUJVRygoIiwgY29uY2VhbGVkICVkXG4iLCBkZWNQaWN0dXJlLm5ick9mRXJyTUJzKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgREVCVUcoKCJcbiIpKTsKLSAgICAgICAgZmZsdXNoKHN0ZG91dCk7Ci0KLSAgICAgICAgbnVtRXJyb3JzICs9IGRlY1BpY3R1cmUubmJyT2ZFcnJNQnM7Ci0KLSAgICAgICAgLyogSW5jcmVtZW50IGRpc3BsYXkgbnVtYmVyIGZvciBldmVyeSBkaXNwbGF5ZWQgcGljdHVyZSAqLwotICAgICAgICBwaWNEaXNwbGF5TnVtYmVyKys7Ci0KLSAgICAgICAgLyogV3JpdGUgb3V0cHV0IHBpY3R1cmUgdG8gZmlsZSAqLwotICAgICAgICBpbWFnZURhdGEgPSAodTgqKWRlY1BpY3R1cmUucE91dHB1dFBpY3R1cmU7Ci0gICAgICAgIGlmIChjcm9wRGlzcGxheSAmJiBkZWNJbmZvLmNyb3BwaW5nRmxhZykKLSAgICAgICAgewotICAgICAgICAgICAgdG1wID0gQ3JvcFBpY3R1cmUodG1wSW1hZ2UsIGltYWdlRGF0YSwKLSAgICAgICAgICAgICAgICBkZWNJbmZvLnBpY1dpZHRoLCBkZWNJbmZvLnBpY0hlaWdodCwKLSAgICAgICAgICAgICAgICAmZGVjSW5mby5jcm9wUGFyYW1zKTsKLSAgICAgICAgICAgIGlmICh0bXApCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgV3JpdGVPdXRwdXQob3V0RmlsZU5hbWUsIHRtcEltYWdlLCBwaWNTaXplKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIFdyaXRlT3V0cHV0KG91dEZpbGVOYW1lLCBpbWFnZURhdGEsIHBpY1NpemUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogcmVsZWFzZSBkZWNvZGVyIGluc3RhbmNlICovCi0gICAgSDI2NFN3RGVjUmVsZWFzZShkZWNJbnN0KTsKLQotICAgIGlmIChmb3V0cHV0KQotICAgICAgICBmY2xvc2UoZm91dHB1dCk7Ci0KLSAgICAvKiBmcmVlIGFsbG9jYXRlZCBidWZmZXJzICovCi0gICAgZnJlZShieXRlU3RybVN0YXJ0KTsKLSAgICBmcmVlKHRtcEltYWdlKTsKLQotICAgIERFQlVHKCgiT3V0cHV0IGZpbGU6ICVzXG4iLCBvdXRGaWxlTmFtZSkpOwotCi0gICAgREVCVUcoKCJERUNPRElORyBET05FXG4iKSk7Ci0gICAgaWYgKG51bUVycm9ycyB8fCBwaWNEZWNvZGVOdW1iZXIgPT0gMSkKLSAgICB7Ci0gICAgICAgIERFQlVHKCgiRVJST1JTIEZPVU5EXG4iKSk7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb24gbmFtZTogIFdyaXRlT3V0cHV0Ci0KLSAgICBQdXJwb3NlOgotICAgICAgICBXcml0ZSBwaWN0dXJlIHBvaW50ZWQgYnkgZGF0YSB0byBmaWxlLiBTaXplIG9mIHRoZQotICAgICAgICBwaWN0dXJlIGluIHBpeGVscyBpcyBpbmRpY2F0ZWQgYnkgcGljU2l6ZS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgV3JpdGVPdXRwdXQoY2hhciAqZmlsZW5hbWUsIHU4ICpkYXRhLCB1MzIgcGljU2l6ZSkKLXsKLQotICAgIC8qIGZvdXRwdXQgaXMgZ2xvYmFsIGZpbGUgcG9pbnRlciAqLwotICAgIGlmIChmb3V0cHV0ID09IE5VTEwpCi0gICAgewotICAgICAgICAvKiBvcGVuIG91dHB1dCBmaWxlIGZvciB3cml0aW5nLCBjYW4gYmUgZGlzYWJsZWQgd2l0aCBkZWZpbmUuCi0gICAgICAgICAqIElmIGZpbGUgb3BlbiBmYWlscyAtPiBleGl0ICovCi0gICAgICAgIGlmIChzdHJjbXAoZmlsZW5hbWUsICJub25lIikgIT0gMCkKLSAgICAgICAgewotI2lmICFkZWZpbmVkKF9OT19PVVQpCi0gICAgICAgICAgICBmb3V0cHV0ID0gZm9wZW4oZmlsZW5hbWUsICJ3YiIpOwotICAgICAgICAgICAgaWYgKGZvdXRwdXQgPT0gTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBERUJVRygoIlVOQUJMRSBUTyBPUEVOIE9VVFBVVCBGSUxFXG4iKSk7Ci0gICAgICAgICAgICAgICAgZXhpdCgxMDApOwotICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoZm91dHB1dCAmJiBkYXRhKQotICAgICAgICBmd3JpdGUoZGF0YSwgMSwgcGljU2l6ZSwgZm91dHB1dCk7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbiBuYW1lOiBOZXh0UGFja2V0Ci0KLSAgICBQdXJwb3NlOgotICAgICAgICBHZXQgdGhlIHBvaW50ZXIgdG8gc3RhcnQgb2YgbmV4dCBwYWNrZXQgaW4gaW5wdXQgc3RyZWFtLiBVc2VzCi0gICAgICAgIGdsb2JhbCB2YXJpYWJsZXMgJ3BhY2tldGl6ZScgYW5kICduYWxVbml0U3RyZWFtJyB0byBkZXRlcm1pbmUgdGhlCi0gICAgICAgIGRlY29kZXIgaW5wdXQgc3RyZWFtIG1vZGUgYW5kICdzdHJlYW1TdG9wJyB0byBkZXRlcm1pbmUgdGhlIGVuZAotICAgICAgICBvZiBzdHJlYW0uIFRoZXJlIGFyZSB0aHJlZSBwb3NzaWJsZSBzdHJlYW0gbW9kZXM6Ci0gICAgICAgICAgICBkZWZhdWx0IC0gdGhlIHdob2xlIHN0cmVhbSBhdCBvbmNlCi0gICAgICAgICAgICBwYWNrZXRpemUgLSBhIHNpbmdsZSBOQUwtdW5pdCB3aXRoIHN0YXJ0IGNvZGUgcHJlZml4Ci0gICAgICAgICAgICBuYWxVbml0U3RyZWFtIC0gYSBzaW5nbGUgTkFMLXVuaXQgd2l0aG91dCBzdGFydCBjb2RlIHByZWZpeAotCi0gICAgICAgIHBTdHJtIHN0b3JlcyBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiBwcmV2aW91cyBkZWNvZGVyIGlucHV0IGFuZCBpcwotICAgICAgICByZXBsYWNlZCB3aXRoIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IGRlY29kZXIgaW5wdXQuCi0KLSAgICAgICAgUmV0dXJucyB0aGUgcGFja2V0IHNpemUgaW4gYnl0ZXMKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXUzMiBOZXh0UGFja2V0KHU4ICoqcFN0cm0pCi17Ci0KLSAgICB1MzIgaW5kZXg7Ci0gICAgdTMyIG1heEluZGV4OwotICAgIHUzMiB6ZXJvQ291bnQ7Ci0gICAgdTggKnN0cmVhbTsKLSAgICB1OCBieXRlOwotICAgIHN0YXRpYyB1MzIgcHJldkluZGV4PTA7Ci0KLSAgICAvKiBGb3IgZGVmYXVsdCBzdHJlYW0gbW9kZSBhbGwgdGhlIHN0cmVhbSBpcyBpbiBmaXJzdCBwYWNrZXQgKi8KLSAgICBpZiAoIXBhY2tldGl6ZSAmJiAhbmFsVW5pdFN0cmVhbSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBpbmRleCA9IDA7Ci0gICAgc3RyZWFtID0gKnBTdHJtICsgcHJldkluZGV4OwotICAgIG1heEluZGV4ID0gKHUzMikoc3RyZWFtU3RvcCAtIHN0cmVhbSk7Ci0KLSAgICBpZiAobWF4SW5kZXggPT0gMCkKLSAgICAgICAgcmV0dXJuKDApOwotCi0gICAgLyogbGVhZGluZyB6ZXJvcyBvZiBmaXJzdCBOQUwgdW5pdCAqLwotICAgIGRvCi0gICAgewotICAgICAgICBieXRlID0gc3RyZWFtW2luZGV4KytdOwotICAgIH0gd2hpbGUgKGJ5dGUgIT0gMSAmJiBpbmRleCA8IG1heEluZGV4KTsKLQotICAgIC8qIGludmFsaWQgc3RhcnQgY29kZSBwcmVmaXggKi8KLSAgICBpZiAoaW5kZXggPT0gbWF4SW5kZXggfHwgaW5kZXggPCAzKQotICAgIHsKLSAgICAgICAgREVCVUcoKCJJTlZBTElEIEJZVEUgU1RSRUFNXG4iKSk7Ci0gICAgICAgIGV4aXQoMTAwKTsKLSAgICB9Ci0KLSAgICAvKiBuYWxVbml0U3RyZWFtIGlzIHdpdGhvdXQgc3RhcnQgY29kZSBwcmVmaXggKi8KLSAgICBpZiAobmFsVW5pdFN0cmVhbSkKLSAgICB7Ci0gICAgICAgIHN0cmVhbSArPSBpbmRleDsKLSAgICAgICAgbWF4SW5kZXggLT0gaW5kZXg7Ci0gICAgICAgIGluZGV4ID0gMDsKLSAgICB9Ci0KLSAgICB6ZXJvQ291bnQgPSAwOwotCi0gICAgLyogU2VhcmNoIHN0cmVhbSBmb3IgbmV4dCBzdGFydCBjb2RlIHByZWZpeCAqLwotICAgIC8qbGludCAtZSg3MTYpIHdoaWxlKDEpIHVzZWQgY29uc2Npb3VzbHkgKi8KLSAgICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICAgIGJ5dGUgPSBzdHJlYW1baW5kZXgrK107Ci0gICAgICAgIGlmICghYnl0ZSkKLSAgICAgICAgICAgIHplcm9Db3VudCsrOwotCi0gICAgICAgIGlmICggKGJ5dGUgPT0gMHgwMSkgJiYgKHplcm9Db3VudCA+PSAyKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFN0YXJ0IGNvZGUgcHJlZml4IGhhcyB0d28gemVyb3MKLSAgICAgICAgICAgICAqIFRoaXJkIHplcm8gaXMgYXNzdW1lZCB0byBiZSBsZWFkaW5nIHplcm8gb2YgbmV4dCBwYWNrZXQKLSAgICAgICAgICAgICAqIEZvdXJ0aCBhbmQgbW9yZSB6ZXJvcyBhcmUgYXNzdW1lZCB0byBiZSB0cmFpbGluZyB6ZXJvcyBvZiB0aGlzCi0gICAgICAgICAgICAgKiBwYWNrZXQgKi8KLSAgICAgICAgICAgIGlmICh6ZXJvQ291bnQgPiAzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGluZGV4IC09IDQ7Ci0gICAgICAgICAgICAgICAgemVyb0NvdW50IC09IDM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW5kZXggLT0gemVyb0NvdW50KzE7Ci0gICAgICAgICAgICAgICAgemVyb0NvdW50ID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGJ5dGUpCi0gICAgICAgICAgICB6ZXJvQ291bnQgPSAwOwotCi0gICAgICAgIGlmIChpbmRleCA9PSBtYXhJbmRleCkKLSAgICAgICAgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qIFN0b3JlIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgcGFja2V0ICovCi0gICAgKnBTdHJtID0gc3RyZWFtOwotICAgIHByZXZJbmRleCA9IGluZGV4OwotCi0gICAgLyogbmFsVW5pdFN0cmVhbSBpcyB3aXRob3V0IHRyYWlsaW5nIHplcm9zICovCi0gICAgaWYgKG5hbFVuaXRTdHJlYW0pCi0gICAgICAgIGluZGV4IC09IHplcm9Db3VudDsKLQotICAgIHJldHVybihpbmRleCk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uIG5hbWU6IENyb3BQaWN0dXJlCi0KLSAgICBQdXJwb3NlOgotICAgICAgICBQZXJmb3JtIGNyb3BwaW5nIGZvciBwaWN0dXJlLiBJbnB1dCBwaWN0dXJlIHBJbkltYWdlIHdpdGggZGltZW5zaW9ucwotICAgICAgICBwaWNXaWR0aCB4IHBpY0hlaWdodCBpcyBjcm9wcGVkIHdpdGggcENyb3BQYXJhbXMgYW5kIHRoZSByZXN1bHRpbmcKLSAgICAgICAgcGljdHVyZSBpcyBzdG9yZWQgaW4gcE91dEltYWdlLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdTMyIENyb3BQaWN0dXJlKHU4ICpwT3V0SW1hZ2UsIHU4ICpwSW5JbWFnZSwKLSAgICB1MzIgcGljV2lkdGgsIHUzMiBwaWNIZWlnaHQsIENyb3BQYXJhbXMgKnBDcm9wUGFyYW1zKQotewotCi0gICAgdTMyIGksIGo7Ci0gICAgdTMyIG91dFdpZHRoLCBvdXRIZWlnaHQ7Ci0gICAgdTggKnBPdXQsICpwSW47Ci0KLSAgICBpZiAocE91dEltYWdlID09IE5VTEwgfHwgcEluSW1hZ2UgPT0gTlVMTCB8fCBwQ3JvcFBhcmFtcyA9PSBOVUxMIHx8Ci0gICAgICAgICFwaWNXaWR0aCB8fCAhcGljSGVpZ2h0KQotICAgIHsKLSAgICAgICAgLyoganVzdCB0byBwcmV2ZW50IGxpbnQgd2FybmluZywgcmV0dXJuaW5nIG5vbi16ZXJvIHdpbGwgcmVzdWx0IGluCi0gICAgICAgICAqIHJldHVybiB3aXRob3V0IGZyZWVpbmcgdGhlIG1lbW9yeSAqLwotICAgICAgICBmcmVlKHBPdXRJbWFnZSk7Ci0gICAgICAgIHJldHVybigxKTsKLSAgICB9Ci0KLSAgICBpZiAoICgocENyb3BQYXJhbXMtPmNyb3BMZWZ0T2Zmc2V0ICsgcENyb3BQYXJhbXMtPmNyb3BPdXRXaWR0aCkgPgotICAgICAgICAgICBwaWNXaWR0aCApIHx8Ci0gICAgICAgICAoKHBDcm9wUGFyYW1zLT5jcm9wVG9wT2Zmc2V0ICsgcENyb3BQYXJhbXMtPmNyb3BPdXRIZWlnaHQpID4KLSAgICAgICAgICAgcGljSGVpZ2h0ICkgKQotICAgIHsKLSAgICAgICAgLyoganVzdCB0byBwcmV2ZW50IGxpbnQgd2FybmluZywgcmV0dXJuaW5nIG5vbi16ZXJvIHdpbGwgcmVzdWx0IGluCi0gICAgICAgICAqIHJldHVybiB3aXRob3V0IGZyZWVpbmcgdGhlIG1lbW9yeSAqLwotICAgICAgICBmcmVlKHBPdXRJbWFnZSk7Ci0gICAgICAgIHJldHVybigxKTsKLSAgICB9Ci0KLSAgICBvdXRXaWR0aCA9IHBDcm9wUGFyYW1zLT5jcm9wT3V0V2lkdGg7Ci0gICAgb3V0SGVpZ2h0ID0gcENyb3BQYXJhbXMtPmNyb3BPdXRIZWlnaHQ7Ci0KLSAgICAvKiBDYWxjdWxhdGUgc3RhcnRpbmcgcG9pbnRlciBmb3IgbHVtYSAqLwotICAgIHBJbiA9IHBJbkltYWdlICsgcENyb3BQYXJhbXMtPmNyb3BUb3BPZmZzZXQqcGljV2lkdGggKwotICAgICAgICBwQ3JvcFBhcmFtcy0+Y3JvcExlZnRPZmZzZXQ7Ci0gICAgcE91dCA9IHBPdXRJbWFnZTsKLQotICAgIC8qIENvcHkgbHVtYSBwaXhlbCB2YWx1ZXMgKi8KLSAgICBmb3IgKGkgPSBvdXRIZWlnaHQ7IGk7IGktLSkKLSAgICB7Ci0gICAgICAgIGZvciAoaiA9IG91dFdpZHRoOyBqOyBqLS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgICpwT3V0KysgPSAqcEluKys7Ci0gICAgICAgIH0KLSAgICAgICAgcEluICs9IHBpY1dpZHRoIC0gb3V0V2lkdGg7Ci0gICAgfQotCi0gICAgb3V0V2lkdGggPj49IDE7Ci0gICAgb3V0SGVpZ2h0ID4+PSAxOwotCi0gICAgLyogQ2FsY3VsYXRlIHN0YXJ0aW5nIHBvaW50ZXIgZm9yIGNiICovCi0gICAgcEluID0gcEluSW1hZ2UgKyBwaWNXaWR0aCpwaWNIZWlnaHQgKwotICAgICAgICBwQ3JvcFBhcmFtcy0+Y3JvcFRvcE9mZnNldCpwaWNXaWR0aC80ICsgcENyb3BQYXJhbXMtPmNyb3BMZWZ0T2Zmc2V0LzI7Ci0KLSAgICAvKiBDb3B5IGNiIHBpeGVsIHZhbHVlcyAqLwotICAgIGZvciAoaSA9IG91dEhlaWdodDsgaTsgaS0tKQotICAgIHsKLSAgICAgICAgZm9yIChqID0gb3V0V2lkdGg7IGo7IGotLSkKLSAgICAgICAgewotICAgICAgICAgICAgKnBPdXQrKyA9ICpwSW4rKzsKLSAgICAgICAgfQotICAgICAgICBwSW4gKz0gcGljV2lkdGgvMiAtIG91dFdpZHRoOwotICAgIH0KLQotICAgIC8qIENhbGN1bGF0ZSBzdGFydGluZyBwb2ludGVyIGZvciBjciAqLwotICAgIHBJbiA9IHBJbkltYWdlICsgNSpwaWNXaWR0aCpwaWNIZWlnaHQvNCArCi0gICAgICAgIHBDcm9wUGFyYW1zLT5jcm9wVG9wT2Zmc2V0KnBpY1dpZHRoLzQgKyBwQ3JvcFBhcmFtcy0+Y3JvcExlZnRPZmZzZXQvMjsKLQotICAgIC8qIENvcHkgY3IgcGl4ZWwgdmFsdWVzICovCi0gICAgZm9yIChpID0gb3V0SGVpZ2h0OyBpOyBpLS0pCi0gICAgewotICAgICAgICBmb3IgKGogPSBvdXRXaWR0aDsgajsgai0tKQotICAgICAgICB7Ci0gICAgICAgICAgICAqcE91dCsrID0gKnBJbisrOwotICAgICAgICB9Ci0gICAgICAgIHBJbiArPSBwaWNXaWR0aC8yIC0gb3V0V2lkdGg7Ci0gICAgfQotCi0gICAgcmV0dXJuICgwKTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uIG5hbWU6ICBIMjY0U3dEZWNUcmFjZQotCi0gICAgUHVycG9zZToKLSAgICAgICAgRXhhbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBIMjY0U3dEZWNUcmFjZSBmdW5jdGlvbi4gUHJvdG90eXBlIG9mIHRoaXMKLSAgICAgICAgZnVuY3Rpb24gaXMgZ2l2ZW4gaW4gSDI2NFN3RGVjQXBpLmguIFRoaXMgaW1wbGVtZW50YXRpb24gYXBwZW5kcwotICAgICAgICB0cmFjZSBtZXNzYWdlcyB0byBmaWxlIG5hbWVkICdkZWNfYXBpLnRyYycuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIEgyNjRTd0RlY1RyYWNlKGNoYXIgKnN0cmluZykKLXsKLSAgICBGSUxFICpmcDsKLQotICAgIGZwID0gZm9wZW4oImRlY19hcGkudHJjIiwgImF0Iik7Ci0KLSAgICBpZiAoIWZwKQotICAgICAgICByZXR1cm47Ci0KLSAgICBmd3JpdGUoc3RyaW5nLCAxLCBzdHJsZW4oc3RyaW5nKSwgZnApOwotICAgIGZ3cml0ZSgiXG4iLCAxLDEsIGZwKTsKLQotICAgIGZjbG9zZShmcCk7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbiBuYW1lOiAgSDI2NFN3RGVjTWFsbG9jCi0KLSAgICBQdXJwb3NlOgotICAgICAgICBFeGFtcGxlIGltcGxlbWVudGF0aW9uIG9mIEgyNjRTd0RlY01hbGxvYyBmdW5jdGlvbi4gUHJvdG90eXBlIG9mIHRoaXMKLSAgICAgICAgZnVuY3Rpb24gaXMgZ2l2ZW4gaW4gSDI2NFN3RGVjQXBpLmguIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcwotICAgICAgICBsaWJyYXJ5IGZ1bmN0aW9uIG1hbGxvYyBmb3IgYWxsb2NhdGlvbiBvZiBtZW1vcnkuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkKiBIMjY0U3dEZWNNYWxsb2ModTMyIHNpemUsIHUzMiBudW0pCi17Ci0gICAgaWYgKHNpemUgPiBVSU5UMzJfTUFYIC8gbnVtKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotI2lmIGRlZmluZWQoQ0hFQ0tfTUVNT1JZX1VTQUdFKQotICAgIC8qIE5vdGUgdGhhdCBpZiB0aGUgZGVjb2RlciBoYXMgdG8gZnJlZSBhbmQgcmVhbGxvY2F0ZSBzb21lIG9mIHRoZSBidWZmZXJzCi0gICAgICogdGhlIHRvdGFsIHZhbHVlIHdpbGwgYmUgaW52YWxpZCAqLwotICAgIHN0YXRpYyB1MzIgbnVtQnl0ZXMgPSAwOwotICAgIG51bUJ5dGVzICs9IHNpemUgKiBudW07Ci0gICAgREVCVUcoKCJBbGxvY2F0ZWQgJWQgYnl0ZXMsIHRvdGFsICVkXG4iLCBzaXplLCBudW1CeXRlcykpOwotI2VuZGlmCi0KLSAgICByZXR1cm4gbWFsbG9jKHNpemUgKiBudW0pOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb24gbmFtZTogIEgyNjRTd0RlY0ZyZWUKLQotICAgIFB1cnBvc2U6Ci0gICAgICAgIEV4YW1wbGUgaW1wbGVtZW50YXRpb24gb2YgSDI2NFN3RGVjRnJlZSBmdW5jdGlvbi4gUHJvdG90eXBlIG9mIHRoaXMKLSAgICAgICAgZnVuY3Rpb24gaXMgZ2l2ZW4gaW4gSDI2NFN3RGVjQXBpLmguIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcwotICAgICAgICBsaWJyYXJ5IGZ1bmN0aW9uIGZyZWUgZm9yIGZyZWVpbmcgb2YgbWVtb3J5LgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBIMjY0U3dEZWNGcmVlKHZvaWQgKnB0cikKLXsKLSAgICBmcmVlKHB0cik7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbiBuYW1lOiAgSDI2NFN3RGVjTWVtY3B5Ci0KLSAgICBQdXJwb3NlOgotICAgICAgICBFeGFtcGxlIGltcGxlbWVudGF0aW9uIG9mIEgyNjRTd0RlY01lbWNweSBmdW5jdGlvbi4gUHJvdG90eXBlIG9mIHRoaXMKLSAgICAgICAgZnVuY3Rpb24gaXMgZ2l2ZW4gaW4gSDI2NFN3RGVjQXBpLmguIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcwotICAgICAgICBsaWJyYXJ5IGZ1bmN0aW9uIG1lbWNweSB0byBjb3B5IHNyYyB0byBkZXN0LgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBIMjY0U3dEZWNNZW1jcHkodm9pZCAqZGVzdCwgdm9pZCAqc3JjLCB1MzIgY291bnQpCi17Ci0gICAgbWVtY3B5KGRlc3QsIHNyYywgY291bnQpOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb24gbmFtZTogIEgyNjRTd0RlY01lbXNldAotCi0gICAgUHVycG9zZToKLSAgICAgICAgRXhhbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBIMjY0U3dEZWNNZW1zZXQgZnVuY3Rpb24uIFByb3RvdHlwZSBvZiB0aGlzCi0gICAgICAgIGZ1bmN0aW9uIGlzIGdpdmVuIGluIEgyNjRTd0RlY0FwaS5oLiBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMKLSAgICAgICAgbGlicmFyeSBmdW5jdGlvbiBtZW1zZXQgdG8gc2V0IGNvbnRlbnQgb2YgbWVtb3J5IGFyZWEgcG9pbnRlZCBieSBwdHIuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIEgyNjRTd0RlY01lbXNldCh2b2lkICpwdHIsIGkzMiB2YWx1ZSwgdTMyIGNvdW50KQotewotICAgIG1lbXNldChwdHIsIHZhbHVlLCBjb3VudCk7Ci19Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvRXZhbHVhdGlvblRlc3RCZW5jaC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9FdmFsdWF0aW9uVGVzdEJlbmNoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NTZhMWYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9FdmFsdWF0aW9uVGVzdEJlbmNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJIMjY0U3dEZWNBcGkuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi12b2lkIFdyaXRlT3V0cHV0KEZJTEUgKmZpZCwgdTggKmRhdGEsIHUzMiBwaWNTaXplKTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uIG5hbWU6ICBtYWluCi0KLSAgICBQdXJwb3NlOgotICAgICAgICBtYWluIGZ1bmN0aW9uLiBBc3N1bWluZyB0aGF0IGV4ZWN1dGFibGUgaXMgbmFtZWQgJ2RlY29kZXInIHRoZSB1c2FnZQotICAgICAgICBpcyBhcyBmb2xsb3dzCi0KLSAgICAgICAgICAgIGRlY29kZXIgaW5wdXRGaWxlTmFtZQotCi0gICAgICAgICwgd2hlcmUgaW5wdXRGaWxlTmFtZSBzaGFsbCBiZSBuYW1lIG9mIGZpbGUgY29udGFpbmluZyBoMjY0IHN0cmVhbQotICAgICAgICBkYXRhLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotCi0gICAgdTggKmJ5dGVTdHJtU3RhcnQ7Ci0gICAgdTggKmJ5dGVTdHJtOwotICAgIHUzMiBzdHJtTGVuOwotICAgIHUzMiBwaWNTaXplOwotICAgIEgyNjRTd0RlY0luc3QgZGVjSW5zdDsKLSAgICBIMjY0U3dEZWNSZXQgcmV0OwotICAgIEgyNjRTd0RlY0lucHV0IGRlY0lucHV0OwotICAgIEgyNjRTd0RlY091dHB1dCBkZWNPdXRwdXQ7Ci0gICAgSDI2NFN3RGVjUGljdHVyZSBkZWNQaWN0dXJlOwotICAgIEgyNjRTd0RlY0luZm8gZGVjSW5mbzsKLSAgICB1MzIgcGljTnVtYmVyOwotCi0gICAgRklMRSAqZmlucHV0OwotICAgIEZJTEUgKmZvdXRwdXQ7Ci0KLSAgICAvKiBDaGVjayB0aGF0IGVub3VnaCBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGdpdmVuLCBpZiBub3QgLT4gcHJpbnQgdXNhZ2UKLSAgICAgKiBpbmZvcm1hdGlvbiBvdXQgKi8KLSAgICBpZiAoYXJnYyA8IDIpCi0gICAgewotICAgICAgICBwcmludGYoICJVc2FnZTogJXMgZmlsZS5oMjY0XG4iLCBhcmd2WzBdKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIC8qIG9wZW4gb3V0cHV0IGZpbGUgZm9yIHdyaXRpbmcsIG91dHB1dCBmaWxlIG5hbWVkIG91dC55dXYuIElmIGZpbGUgb3BlbgotICAgICAqIGZhaWxzIC0+IGV4aXQgKi8KLSAgICBmb3V0cHV0ID0gZm9wZW4oIm91dC55dXYiLCAid2IiKTsKLSAgICBpZiAoZm91dHB1dCA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgcHJpbnRmKCJVTkFCTEUgVE8gT1BFTiBPVVRQVVQgRklMRVxuIik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKiBvcGVuIGlucHV0IGZpbGUgZm9yIHJlYWRpbmcsIGZpbGUgbmFtZSBnaXZlbiBieSB1c2VyLiBJZiBmaWxlIG9wZW4KLSAgICAgKiBmYWlscyAtPiBleGl0ICovCi0gICAgZmlucHV0ID0gZm9wZW4oYXJndlthcmdjLTFdLCAicmIiKTsKLSAgICBpZiAoZmlucHV0ID09IE5VTEwpCi0gICAgewotICAgICAgICBwcmludGYoIlVOQUJMRSBUTyBPUEVOIElOUFVUIEZJTEVcbiIpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgLyogY2hlY2sgc2l6ZSBvZiB0aGUgaW5wdXQgZmlsZSAtPiBsZW5ndGggb2YgdGhlIHN0cmVhbSBpbiBieXRlcyAqLwotICAgIGZzZWVrKGZpbnB1dCwgMEwsIFNFRUtfRU5EKTsKLSAgICBzdHJtTGVuID0gKHUzMilmdGVsbChmaW5wdXQpOwotICAgIHJld2luZChmaW5wdXQpOwotCi0gICAgLyogYWxsb2NhdGUgbWVtb3J5IGZvciBzdHJlYW0gYnVmZmVyLCBleGl0IGlmIHVuc3VjY2Vzc2Z1bCAqLwotICAgIGJ5dGVTdHJtID0gYnl0ZVN0cm1TdGFydCA9ICh1OCAqKUgyNjRTd0RlY01hbGxvYyhzaXplb2YodTgpLCBzdHJtTGVuKTsKLSAgICBpZiAoYnl0ZVN0cm0gPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIHByaW50ZigiVU5BQkxFIFRPIEFMTE9DQVRFIE1FTU9SWVxuIik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKiByZWFkIGlucHV0IHN0cmVhbSBmcm9tIGZpbGUgdG8gYnVmZmVyIGFuZCBjbG9zZSBpbnB1dCBmaWxlICovCi0gICAgZnJlYWQoYnl0ZVN0cm0sIHNpemVvZih1OCksIHN0cm1MZW4sIGZpbnB1dCk7Ci0gICAgZmNsb3NlKGZpbnB1dCk7Ci0KLSAgICAvKiBpbml0aWFsaXplIGRlY29kZXIuIElmIHVuc3VjY2Vzc2Z1bCAtPiBleGl0ICovCi0gICAgcmV0ID0gSDI2NFN3RGVjSW5pdCgmZGVjSW5zdCwgMCk7Ci0gICAgaWYgKHJldCAhPSBIMjY0U1dERUNfT0spCi0gICAgewotICAgICAgICBwcmludGYoIkRFQ09ERVIgSU5JVElBTElaQVRJT04gRkFJTEVEXG4iKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIC8qIGluaXRpYWxpemUgSDI2NFN3RGVjRGVjb2RlKCkgaW5wdXQgc3RydWN0dXJlICovCi0gICAgZGVjSW5wdXQucFN0cmVhbSA9IGJ5dGVTdHJtU3RhcnQ7Ci0gICAgZGVjSW5wdXQuZGF0YUxlbiA9IHN0cm1MZW47Ci0gICAgZGVjSW5wdXQuaW50cmFDb25jZWFsbWVudE1ldGhvZCA9IDA7Ci0KLSAgICBwaWNOdW1iZXIgPSAwOwotCi0gICAgLyogRm9yIHBlcmZvcm1hbmNlIG1lYXN1cmVtZW50cywgcmVhZCB0aGUgc3RhcnQgdGltZSAoaW4gc2Vjb25kcykgaGVyZS4KLSAgICAgKiBUaGUgZGVjb2RpbmcgdGltZSBzaG91bGQgYmUgbWVhc3VyZWQgb3ZlciBzZXZlcmFsIGZyYW1lcyBhbmQgYWZ0ZXIKLSAgICAgKiB0aGF0IGF2ZXJhZ2UgZnBzIChmcmFtZXMvc2Vjb25kKSBjYW4gYmUgY2FsY3VsYXRlZC4KLSAgICAgKgotICAgICAqIHN0YXJ0VGltZSA9IEdldFRpbWUoKTsKLSAgICAgKgotICAgICAqIFRvIHByZXZlbnQgY2FsY3VsYXRpbmcgZmlsZSBJL08gbGF0ZW5zaWVzIGFzIGEgZGVjb2RpbmcgdGltZSwKLSAgICAgKiBjb21tZW50IG91dCBXcml0ZU91dHB1dCBmdW5jdGlvbiBjYWxsLiBBbHNvIHByaW50cyB0byBzdGRvdXQgbWlnaHQKLSAgICAgKiBjb25zdW1lIGNvbnNpZGVyYWJsZSBhbW91bnQgb2YgY3ljbGVzIGR1cmluZyBtZWFzdXJlbWVudCAqLwotCi0gICAgLyogbWFpbiBkZWNvZGluZyBsb29wICovCi0gICAgZG8KLSAgICB7Ci0gICAgICAgIC8qIGNhbGwgQVBJIGZ1bmN0aW9uIHRvIHBlcmZvcm0gZGVjb2RpbmcgKi8KLSAgICAgICAgcmV0ID0gSDI2NFN3RGVjRGVjb2RlKGRlY0luc3QsICZkZWNJbnB1dCwgJmRlY091dHB1dCk7Ci0KLSAgICAgICAgc3dpdGNoKHJldCkKLSAgICAgICAgewotCi0gICAgICAgICAgICBjYXNlIEgyNjRTV0RFQ19IRFJTX1JEWV9CVUZGX05PVF9FTVBUWToKLQotICAgICAgICAgICAgICAgIC8qIHBpY3R1cmUgZGltZW5zaW9ucyBhcmUgYXZhaWxhYmxlIGZvciBxdWVyeSBub3cgKi8KLSAgICAgICAgICAgICAgICByZXQgPSBIMjY0U3dEZWNHZXRJbmZvKGRlY0luc3QsICZkZWNJbmZvKTsKLSAgICAgICAgICAgICAgICBpZiAocmV0ICE9IEgyNjRTV0RFQ19PSykKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgICAgICAgICAgICAgLyogcGljdHVyZSBzaXplIGluIHBpeGVscyAqLwotICAgICAgICAgICAgICAgIHBpY1NpemUgPSBkZWNJbmZvLnBpY1dpZHRoICogZGVjSW5mby5waWNIZWlnaHQ7Ci0gICAgICAgICAgICAgICAgLyogbWVtb3J5IG5lZWRlZCBmb3IgWUNiQ3IgNDoyOjAgcGljdHVyZSBpbiBieXRlcyAqLwotICAgICAgICAgICAgICAgIHBpY1NpemUgPSAoMyAqIHBpY1NpemUpLzI7Ci0gICAgICAgICAgICAgICAgLyogbWVtb3J5IG5lZWRlZCBmb3IgMTYtYml0IFJHQiBwaWN0dXJlIGluIGJ5dGVzCi0gICAgICAgICAgICAgICAgICogcGljU2l6ZSA9IChkZWNJbmZvLnBpY1dpZHRoICogZGVjSW5mby5waWNIZWlnaHQpICogMjsgKi8KLQotICAgICAgICAgICAgICAgIHByaW50ZigiV2lkdGggJWQgSGVpZ2h0ICVkXG4iLAotICAgICAgICAgICAgICAgICAgICBkZWNJbmZvLnBpY1dpZHRoLCBkZWNJbmZvLnBpY0hlaWdodCk7Ci0KLSAgICAgICAgICAgICAgICAvKiB1cGRhdGUgSDI2NFN3RGVjRGVjb2RlKCkgaW5wdXQgc3RydWN0dXJlLCBudW1iZXIgb2YgYnl0ZXMKLSAgICAgICAgICAgICAgICAgKiAiY29uc3VtZWQiIGlzIGNvbXB1dGVkIGFzIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgbmV3IHN0cmVhbQotICAgICAgICAgICAgICAgICAqIHBvaW50ZXIgYW5kIG9sZCBzdHJlYW0gcG9pbnRlciAqLwotICAgICAgICAgICAgICAgIGRlY0lucHV0LmRhdGFMZW4gLT0KLSAgICAgICAgICAgICAgICAgICAgKHUzMikoZGVjT3V0cHV0LnBTdHJtQ3VyclBvcyAtIGRlY0lucHV0LnBTdHJlYW0pOwotICAgICAgICAgICAgICAgIGRlY0lucHV0LnBTdHJlYW0gPSBkZWNPdXRwdXQucFN0cm1DdXJyUG9zOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIEgyNjRTV0RFQ19QSUNfUkRZX0JVRkZfTk9UX0VNUFRZOgotICAgICAgICAgICAgY2FzZSBIMjY0U1dERUNfUElDX1JEWToKLQotICAgICAgICAgICAgICAgIC8qIHVwZGF0ZSBIMjY0U3dEZWNEZWNvZGUoKSBpbnB1dCBzdHJ1Y3R1cmUsIG51bWJlciBvZiBieXRlcwotICAgICAgICAgICAgICAgICAqICJjb25zdW1lZCIgaXMgY29tcHV0ZWQgYXMgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBuZXcgc3RyZWFtCi0gICAgICAgICAgICAgICAgICogcG9pbnRlciBhbmQgb2xkIHN0cmVhbSBwb2ludGVyICovCi0gICAgICAgICAgICAgICAgZGVjSW5wdXQuZGF0YUxlbiAtPQotICAgICAgICAgICAgICAgICAgICAodTMyKShkZWNPdXRwdXQucFN0cm1DdXJyUG9zIC0gZGVjSW5wdXQucFN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgZGVjSW5wdXQucFN0cmVhbSA9IGRlY091dHB1dC5wU3RybUN1cnJQb3M7Ci0KLSAgICAgICAgICAgICAgICAvKiB1c2UgZnVuY3Rpb24gSDI2NFN3RGVjTmV4dFBpY3R1cmUoKSB0byBvYnRhaW4gbmV4dCBwaWN0dXJlCi0gICAgICAgICAgICAgICAgICogaW4gZGlzcGxheSBvcmRlci4gRnVuY3Rpb24gaXMgY2FsbGVkIHVudGlsIG5vIG1vcmUgaW1hZ2VzCi0gICAgICAgICAgICAgICAgICogYXJlIHJlYWR5IGZvciBkaXNwbGF5ICovCi0gICAgICAgICAgICAgICAgd2hpbGUgKEgyNjRTd0RlY05leHRQaWN0dXJlKGRlY0luc3QsICZkZWNQaWN0dXJlLCAwKSA9PQotICAgICAgICAgICAgICAgICAgICBIMjY0U1dERUNfUElDX1JEWSkgeyBwaWNOdW1iZXIrKzsKLQotICAgICAgICAgICAgICAgICAgICBwcmludGYoIlBJQyAlZCwgdHlwZSAlcywgY29uY2VhbGVkICVkXG4iLCBwaWNOdW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWNQaWN0dXJlLmlzSWRyUGljdHVyZSA/ICJJRFIiIDogIk5PTi1JRFIiLAotICAgICAgICAgICAgICAgICAgICAgICAgZGVjUGljdHVyZS5uYnJPZkVyck1Ccyk7Ci0gICAgICAgICAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIERvIGNvbG9yIGNvbnZlcnNpb24gaWYgbmVlZGVkIHRvIGdldCBkaXNwbGF5IGltYWdlCi0gICAgICAgICAgICAgICAgICAgICAqIGluIFJHQi1mb3JtYXQKLSAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAgICAgICAgICogWXV2VG9SZ2IoIGRlY1BpY3R1cmUucE91dHB1dFBpY3R1cmUsIHBSZ2JQaWN0dXJlICk7ICovCi0KLSAgICAgICAgICAgICAgICAgICAgLyogd3JpdGUgbmV4dCBkaXNwbGF5IGltYWdlIHRvIG91dHB1dCBmaWxlICovCi0gICAgICAgICAgICAgICAgICAgIFdyaXRlT3V0cHV0KGZvdXRwdXQsICh1OCopZGVjUGljdHVyZS5wT3V0cHV0UGljdHVyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBpY1NpemUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIEgyNjRTV0RFQ19FVkFMVUFUSU9OX0xJTUlUX0VYQ0VFREVEOgotICAgICAgICAgICAgICAgIC8qIGV2YWx1YXRpb24gdmVyc2lvbiBvZiB0aGUgZGVjb2RlciBoYXMgbGltaXRlZCBkZWNvZGluZwotICAgICAgICAgICAgICAgICAqIGNhcGFiaWxpdGllcyAqLwotICAgICAgICAgICAgICAgIHByaW50ZigiRVZBTFVBVElPTiBMSU1JVCBSRUFDSEVEXG4iKTsKLSAgICAgICAgICAgICAgICBnb3RvIGVuZDsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBwcmludGYoIlVOUkVDT1ZFUkFCTEUgRVJST1JcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgIC8qIGtlZXAgZGVjb2RpbmcgdW50aWwgYWxsIGRhdGEgZnJvbSBpbnB1dCBzdHJlYW0gYnVmZmVyIGNvbnN1bWVkICovCi0gICAgfSB3aGlsZSAoZGVjSW5wdXQuZGF0YUxlbiA+IDApOwotCi1lbmQ6Ci0KLSAgICAvKiBpZiBvdXRwdXQgaW4gZGlzcGxheSBvcmRlciBpcyBwcmVmZXJyZWQsIHRoZSBkZWNvZGVyIHNoYWxsIGJlIGZvcmNlZAotICAgICAqIHRvIG91dHB1dCBwaWN0dXJlcyByZW1haW5pbmcgaW4gZGVjb2RlZCBwaWN0dXJlIGJ1ZmZlci4gVXNlIGZ1bmN0aW9uCi0gICAgICogSDI2NFN3RGVjTmV4dFBpY3R1cmUoKSB0byBvYnRhaW4gbmV4dCBwaWN0dXJlIGluIGRpc3BsYXkgb3JkZXIuIEZ1bmN0aW9uCi0gICAgICogaXMgY2FsbGVkIHVudGlsIG5vIG1vcmUgaW1hZ2VzIGFyZSByZWFkeSBmb3IgZGlzcGxheS4gU2Vjb25kIHBhcmFtZXRlcgotICAgICAqIGZvciB0aGUgZnVuY3Rpb24gaXMgc2V0IHRvICcxJyB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgaXMgZW5kIG9mIHRoZQotICAgICAqIHN0cmVhbSBhbmQgYWxsIHBpY3R1cmVzIHNoYWxsIGJlIG91dHB1dCAqLwotICAgIHdoaWxlIChIMjY0U3dEZWNOZXh0UGljdHVyZShkZWNJbnN0LCAmZGVjUGljdHVyZSwgMSkgPT0KLSAgICAgICAgSDI2NFNXREVDX1BJQ19SRFkpIHsKLQotICAgICAgICBwaWNOdW1iZXIrKzsKLQotICAgICAgICBwcmludGYoIlBJQyAlZCwgdHlwZSAlcywgY29uY2VhbGVkICVkXG4iLCBwaWNOdW1iZXIsCi0gICAgICAgICAgICBkZWNQaWN0dXJlLmlzSWRyUGljdHVyZSA/ICJJRFIiIDogIk5PTi1JRFIiLAotICAgICAgICAgICAgZGVjUGljdHVyZS5uYnJPZkVyck1Ccyk7Ci0gICAgICAgIGZmbHVzaChzdGRvdXQpOwotCi0gICAgICAgIC8qIERvIGNvbG9yIGNvbnZlcnNpb24gaWYgbmVlZGVkIHRvIGdldCBkaXNwbGF5IGltYWdlCi0gICAgICAgICAqIGluIFJHQi1mb3JtYXQKLSAgICAgICAgICoKLSAgICAgICAgICogWXV2VG9SZ2IoIGRlY1BpY3R1cmUucE91dHB1dFBpY3R1cmUsIHBSZ2JQaWN0dXJlICk7ICovCi0KLSAgICAgICAgLyogd3JpdGUgbmV4dCBkaXNwbGF5IGltYWdlIHRvIG91dHB1dCBmaWxlICovCi0gICAgICAgIFdyaXRlT3V0cHV0KGZvdXRwdXQsICh1OCopZGVjUGljdHVyZS5wT3V0cHV0UGljdHVyZSwgcGljU2l6ZSk7Ci0gICAgfQotCi0gICAgLyogRm9yIHBlcmZvcm1hbmNlIG1lYXN1cmVtZW50cywgcmVhZCB0aGUgZW5kIHRpbWUgKGluIHNlY29uZHMpIGhlcmUuCi0gICAgICoKLSAgICAgKiBlbmRUaW1lID0gR2V0VGltZSgpOwotICAgICAqCi0gICAgICogTm93IHRoZSBwZXJmb3JtYW5jZSBjYW4gYmUgY2FsY3VsYXRlZCBhcyBmcmFtZXMgcGVyIHNlY29uZDoKLSAgICAgKiBmcHMgPSBwaWNOdW1iZXIgLyAoZW5kVGltZSAtIHN0YXJ0VGltZSk7ICovCi0KLQotICAgIC8qIHJlbGVhc2UgZGVjb2RlciBpbnN0YW5jZSAqLwotICAgIEgyNjRTd0RlY1JlbGVhc2UoZGVjSW5zdCk7Ci0KLSAgICAvKiBjbG9zZSBvdXRwdXQgZmlsZSAqLwotICAgIGZjbG9zZShmb3V0cHV0KTsKLQotICAgIC8qIGZyZWUgYnl0ZSBzdHJlYW0gYnVmZmVyICovCi0gICAgZnJlZShieXRlU3RybVN0YXJ0KTsKLQotICAgIHJldHVybiAwOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbiBuYW1lOiAgV3JpdGVPdXRwdXQKLQotICAgIFB1cnBvc2U6Ci0gICAgICAgIFdyaXRlIHBpY3R1cmUgcG9pbnRlZCBieSBkYXRhIHRvIGZpbGUgcG9pbnRlZCBieSBmaWQuIFNpemUgb2YgdGhlCi0gICAgICAgIHBpY3R1cmUgaW4gcGl4ZWxzIGlzIGluZGljYXRlZCBieSBwaWNTaXplLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBXcml0ZU91dHB1dChGSUxFICpmaWQsIHU4ICpkYXRhLCB1MzIgcGljU2l6ZSkKLXsKLSAgICBmd3JpdGUoZGF0YSwgMSwgcGljU2l6ZSwgZmlkKTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uIG5hbWU6ICBIMjY0U3dEZWNUcmFjZQotCi0gICAgUHVycG9zZToKLSAgICAgICAgRXhhbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBIMjY0U3dEZWNUcmFjZSBmdW5jdGlvbi4gUHJvdG90eXBlIG9mIHRoaXMKLSAgICAgICAgZnVuY3Rpb24gaXMgZ2l2ZW4gaW4gSDI2NFN3RGVjQXBpLmguIFRoaXMgaW1wbGVtZW50YXRpb24gYXBwZW5kcwotICAgICAgICB0cmFjZSBtZXNzYWdlcyB0byBmaWxlIG5hbWVkICdkZWNfYXBpLnRyYycuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIEgyNjRTd0RlY1RyYWNlKGNoYXIgKnN0cmluZykKLXsKLSAgICBGSUxFICpmcDsKLQotICAgIGZwID0gZm9wZW4oImRlY19hcGkudHJjIiwgImF0Iik7Ci0KLSAgICBpZiAoIWZwKQotICAgICAgICByZXR1cm47Ci0KLSAgICBmd3JpdGUoc3RyaW5nLCAxLCBzdHJsZW4oc3RyaW5nKSwgZnApOwotICAgIGZ3cml0ZSgiXG4iLCAxLDEsIGZwKTsKLQotICAgIGZjbG9zZShmcCk7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbiBuYW1lOiAgSDI2NFN3RGVjbWFsbG9jCi0KLSAgICBQdXJwb3NlOgotICAgICAgICBFeGFtcGxlIGltcGxlbWVudGF0aW9uIG9mIEgyNjRTd0RlY01hbGxvYyBmdW5jdGlvbi4gUHJvdG90eXBlIG9mIHRoaXMKLSAgICAgICAgZnVuY3Rpb24gaXMgZ2l2ZW4gaW4gSDI2NFN3RGVjQXBpLmguIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcwotICAgICAgICBsaWJyYXJ5IGZ1bmN0aW9uIG1hbGxvYyBmb3IgYWxsb2NhdGlvbiBvZiBtZW1vcnkuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkKiBIMjY0U3dEZWNNYWxsb2ModTMyIHNpemUsIHUzMiBudW0pCi17Ci0gICAgaWYgKHNpemUgPiBVSU5UMzJfTUFYIC8gbnVtKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gbWFsbG9jKHNpemUgKiBudW0pOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb24gbmFtZTogIEgyNjRTd0RlY0ZyZWUKLQotICAgIFB1cnBvc2U6Ci0gICAgICAgIEV4YW1wbGUgaW1wbGVtZW50YXRpb24gb2YgSDI2NFN3RGVjRnJlZSBmdW5jdGlvbi4gUHJvdG90eXBlIG9mIHRoaXMKLSAgICAgICAgZnVuY3Rpb24gaXMgZ2l2ZW4gaW4gSDI2NFN3RGVjQXBpLmguIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcwotICAgICAgICBsaWJyYXJ5IGZ1bmN0aW9uIGZyZWUgZm9yIGZyZWVpbmcgb2YgbWVtb3J5LgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBIMjY0U3dEZWNGcmVlKHZvaWQgKnB0cikKLXsKLSAgICBmcmVlKHB0cik7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbiBuYW1lOiAgSDI2NFN3RGVjTWVtY3B5Ci0KLSAgICBQdXJwb3NlOgotICAgICAgICBFeGFtcGxlIGltcGxlbWVudGF0aW9uIG9mIEgyNjRTd0RlY01lbWNweSBmdW5jdGlvbi4gUHJvdG90eXBlIG9mIHRoaXMKLSAgICAgICAgZnVuY3Rpb24gaXMgZ2l2ZW4gaW4gSDI2NFN3RGVjQXBpLmguIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcwotICAgICAgICBsaWJyYXJ5IGZ1bmN0aW9uIG1lbWNweSB0byBjb3B5IHNyYyB0byBkZXN0LgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBIMjY0U3dEZWNNZW1jcHkodm9pZCAqZGVzdCwgdm9pZCAqc3JjLCB1MzIgY291bnQpCi17Ci0gICAgbWVtY3B5KGRlc3QsIHNyYywgY291bnQpOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb24gbmFtZTogIEgyNjRTd0RlY01lbXNldAotCi0gICAgUHVycG9zZToKLSAgICAgICAgRXhhbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBIMjY0U3dEZWNNZW1zZXQgZnVuY3Rpb24uIFByb3RvdHlwZSBvZiB0aGlzCi0gICAgICAgIGZ1bmN0aW9uIGlzIGdpdmVuIGluIEgyNjRTd0RlY0FwaS5oLiBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMKLSAgICAgICAgbGlicmFyeSBmdW5jdGlvbiBtZW1zZXQgdG8gc2V0IGNvbnRlbnQgb2YgbWVtb3J5IGFyZWEgcG9pbnRlZCBieSBwdHIuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIEgyNjRTd0RlY01lbXNldCh2b2lkICpwdHIsIGkzMiB2YWx1ZSwgdTMyIGNvdW50KQotewotICAgIG1lbXNldChwdHIsIHZhbHVlLCBjb3VudCk7Ci19Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvSDI2NFN3RGVjQXBpLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL0gyNjRTd0RlY0FwaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWIzOGU1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvSDI2NFN3RGVjQXBpLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1ODAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotICAgICAzLiBNb2R1bGUgZGVmaW5lcwotICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0gICAgIDUuIEZ1bmN0aW9ucwotICAgICAgICAgIEgyNjRTd0RlY0luaXQKLSAgICAgICAgICBIMjY0U3dEZWNHZXRJbmZvCi0gICAgICAgICAgSDI2NFN3RGVjUmVsZWFzZQotICAgICAgICAgIEgyNjRTd0RlY0RlY29kZQotICAgICAgICAgIEgyNjRTd0RlY0dldEFQSVZlcnNpb24KLSAgICAgICAgICBIMjY0U3dEZWNOZXh0UGljdHVyZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8bG9nL2xvZy5oPgotCi0jaW5jbHVkZSAiYmFzZXR5cGUuaCIKLSNpbmNsdWRlICJoMjY0YnNkX2NvbnRhaW5lci5oIgotI2luY2x1ZGUgIkgyNjRTd0RlY0FwaS5oIgotI2luY2x1ZGUgImgyNjRic2RfZGVjb2Rlci5oIgotI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgotCi0jZGVmaW5lIFVOVVNFRCh4KSAodm9pZCkoeCkKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICBWZXJzaW9uIEluZm9ybWF0aW9uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jZGVmaW5lIEgyNjRTV0RFQ19NQUpPUl9WRVJTSU9OIDIKLSNkZWZpbmUgSDI2NFNXREVDX01JTk9SX1ZFUlNJT04gMwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1IMjY0REVDX1RSQUNFICAgICAgICAgICBUcmFjZSBIMjY0IERlY29kZXIgQVBJIGZ1bmN0aW9uIGNhbGxzLgotSDI2NERFQ19FVkFMVUFUSU9OICAgICAgQ29tcGlsZSBldmFsdWF0aW9uIHZlcnNpb24sIHJlc3RyaWN0cyBudW1iZXIgb2YgZnJhbWVzCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGF0IGNhbiBiZSBkZWNvZGVkCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZmRlZiBIMjY0REVDX1RSQUNFCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNkZWZpbmUgREVDX0FQSV9UUkMoc3RyKSAgICBIMjY0U3dEZWNUcmFjZShzdHIpCi0jZWxzZQotI2RlZmluZSBERUNfQVBJX1RSQyhzdHIpCi0jZW5kaWYKLQotI2lmZGVmIEgyNjRERUNfRVZBTFVBVElPTgotI2RlZmluZSBIMjY0REVDX0VWQUxVQVRJT05fTElNSVQgICA1MDAKLSNlbmRpZgotCi12b2lkIEgyNjRTd0RlY1RyYWNlKGNoYXIgKnN0cmluZykgewotICAgIFVOVVNFRChzdHJpbmcpOwotfQotCi12b2lkKiBIMjY0U3dEZWNNYWxsb2ModTMyIHNpemUsIHUzMiBudW0pIHsKLSAgICBpZiAoc2l6ZSA+IFVJTlQzMl9NQVggLyBudW0pIHsKLSAgICAgICAgQUxPR0UoImNhbid0IGFsbG9jYXRlICV1ICogJXUgYnl0ZXMiLCBzaXplLCBudW0pOwotICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjI3ODU1NDE5Iik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gbWFsbG9jKHNpemUgKiBudW0pOwotfQotCi12b2lkIEgyNjRTd0RlY0ZyZWUodm9pZCAqcHRyKSB7Ci0gICAgZnJlZShwdHIpOwotfQotCi12b2lkIEgyNjRTd0RlY01lbWNweSh2b2lkICpkZXN0LCB2b2lkICpzcmMsIHUzMiBjb3VudCkgewotICAgIG1lbWNweShkZXN0LCBzcmMsIGNvdW50KTsKLX0KLQotdm9pZCBIMjY0U3dEZWNNZW1zZXQodm9pZCAqcHRyLCBpMzIgdmFsdWUsIHUzMiBjb3VudCkgewotICAgIG1lbXNldChwdHIsIHZhbHVlLCBjb3VudCk7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBIMjY0U3dEZWNJbml0KCkKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgSW5pdGlhbGl6ZSBkZWNvZGVyIHNvZnR3YXJlLiBGdW5jdGlvbiByZXNlcnZlcyBtZW1vcnkgZm9yIHRoZQotICAgICAgICAgICAgZGVjb2RlciBpbnN0YW5jZSBhbmQgY2FsbHMgaDI2NGJzZEluaXQgdG8gaW5pdGlhbGl6ZSB0aGUKLSAgICAgICAgICAgIGluc3RhbmNlIGRhdGEuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgbm9PdXRwdXRSZW9yZGVyaW5nICBmbGFnIHRvIGluZGljYXRlIGRlY29kZXIgdGhhdCBpdCBkb2Vzbid0IGhhdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdHJ5IHRvIHByb3ZpZGUgb3V0cHV0IHBpY3R1cmVzIGluIGRpc3BsYXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXIsIHNhdmVzIG1lbW9yeQotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBkZWNJbnN0ICAgICAgICAgICAgIHBvaW50ZXIgdG8gaW5pdGlhbGl6ZWQgaW5zdGFuY2UgaXMgc3RvcmVkIGhlcmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSDI2NFNXREVDX09LICAgICAgICBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQgdGhlIGluc3RhbmNlCi0gICAgICAgICAgICBIMjY0U1dERUNfSU5JVEZBSUwgIGluaXRpYWxpemF0aW9uIGZhaWxlZAotICAgICAgICAgICAgSDI2NFNXREVDX1BBUkFNX0VSUiBpbnZhbGlkIHBhcmFtZXRlcnMKLSAgICAgICAgICAgIEgyNjRTV0RFQ19NRU1fRkFJTCAgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLUgyNjRTd0RlY1JldCBIMjY0U3dEZWNJbml0KEgyNjRTd0RlY0luc3QgKmRlY0luc3QsIHUzMiBub091dHB1dFJlb3JkZXJpbmcpCi17Ci0gICAgdTMyIHJ2ID0gMDsKLQotICAgIGRlY0NvbnRhaW5lcl90ICpwRGVjQ29udDsKLQotICAgIERFQ19BUElfVFJDKCJIMjY0U3dEZWNJbml0IyIpOwotCi0gICAgLyogY2hlY2sgdGhhdCByaWdodCBzaGlmdCBvbiBuZWdhdGl2ZSBudW1iZXJzIGlzIHBlcmZvcm1lZCBzaWduZWQgKi8KLSAgICAvKmxpbnQgLXNhdmUgLWUqIGZvbGxvd2luZyBjaGVjayBjYXVzZXMgbXVsdGlwbGUgbGludCBtZXNzYWdlcyAqLwotICAgIGlmICggKCgtMSk+PjEpICE9ICgtMSkgKQotICAgIHsKLSAgICAgICAgREVDX0FQSV9UUkMoIkgyNjRTd0RlY0luaXQjIEVSUk9SOiBSaWdodCBzaGlmdCBpcyBub3Qgc2lnbmVkIik7Ci0gICAgICAgIHJldHVybihIMjY0U1dERUNfSU5JVEZBSUwpOwotICAgIH0KLSAgICAvKmxpbnQgLXJlc3RvcmUgKi8KLQotICAgIGlmIChkZWNJbnN0ID09IE5VTEwpCi0gICAgewotICAgICAgICBERUNfQVBJX1RSQygiSDI2NFN3RGVjSW5pdCMgRVJST1I6IGRlY0luc3QgPT0gTlVMTCIpOwotICAgICAgICByZXR1cm4oSDI2NFNXREVDX1BBUkFNX0VSUik7Ci0gICAgfQotCi0gICAgcERlY0NvbnQgPSAoZGVjQ29udGFpbmVyX3QgKilIMjY0U3dEZWNNYWxsb2Moc2l6ZW9mKGRlY0NvbnRhaW5lcl90KSwgMSk7Ci0KLSAgICBpZiAocERlY0NvbnQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIERFQ19BUElfVFJDKCJIMjY0U3dEZWNJbml0IyBFUlJPUjogTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIik7Ci0gICAgICAgIHJldHVybihIMjY0U1dERUNfTUVNRkFJTCk7Ci0gICAgfQotCi0jaWZkZWYgSDI2NERFQ19UUkFDRQotICAgIHNwcmludGYocERlY0NvbnQtPnN0ciwgIkgyNjRTd0RlY0luaXQjIGRlY0luc3QgJXAgbm9PdXRwdXRSZW9yZGVyaW5nICVkIiwKLSAgICAgICAgICAgICh2b2lkKilkZWNJbnN0LCBub091dHB1dFJlb3JkZXJpbmcpOwotICAgIERFQ19BUElfVFJDKHBEZWNDb250LT5zdHIpOwotI2VuZGlmCi0KLSAgICBydiA9IGgyNjRic2RJbml0KCZwRGVjQ29udC0+c3RvcmFnZSwgbm9PdXRwdXRSZW9yZGVyaW5nKTsKLSAgICBpZiAocnYgIT0gSEFOVFJPX09LKQotICAgIHsKLSAgICAgICAgSDI2NFN3RGVjUmVsZWFzZShwRGVjQ29udCk7Ci0gICAgICAgIHJldHVybihIMjY0U1dERUNfTUVNRkFJTCk7Ci0gICAgfQotCi0gICAgcERlY0NvbnQtPmRlY1N0YXQgID0gSU5JVElBTElaRUQ7Ci0gICAgcERlY0NvbnQtPnBpY051bWJlciA9IDA7Ci0KLSNpZmRlZiBIMjY0REVDX1RSQUNFCi0gICAgc3ByaW50ZihwRGVjQ29udC0+c3RyLCAiSDI2NFN3RGVjSW5pdCMgT0s6IHJldHVybiAlcCIsICh2b2lkKilwRGVjQ29udCk7Ci0gICAgREVDX0FQSV9UUkMocERlY0NvbnQtPnN0cik7Ci0jZW5kaWYKLQotICAgICpkZWNJbnN0ID0gKGRlY0NvbnRhaW5lcl90ICopcERlY0NvbnQ7Ci0KLSAgICByZXR1cm4oSDI2NFNXREVDX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEgyNjRTd0RlY0dldEluZm8oKQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIHJlYWQgYWNjZXNzIHRvIGRlY29kZXIgaW5mb3JtYXRpb24uIFRoaXMKLSAgICAgICAgICAgIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgY2FsbGVkIGJlZm9yZSBIMjY0U3dEZWNEZWNvZGUgZnVuY3Rpb24gaGFzCi0gICAgICAgICAgICBpbmRpY2F0ZWQgdGhhdCBoZWFkZXJzIGFyZSByZWFkeS4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBkZWNJbnN0ICAgICBkZWNvZGVyIGluc3RhbmNlCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIHBEZWNJbmZvICAgIHBvaW50ZXIgdG8gaW5mbyBzdHJ1Y3Qgd2hlcmUgZGF0YSBpcyB3cml0dGVuCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEgyNjRTV0RFQ19PSyAgICAgICAgICAgIHN1Y2Nlc3MKLSAgICAgICAgICAgIEgyNjRTV0RFQ19QQVJBTV9FUlIgICAgIGludmFsaWQgcGFyYW1ldGVycwotICAgICAgICAgICAgSDI2NFNXREVDX0hEUlNfTk9UX1JEWSAgaW5mb3JtYXRpb24gbm90IGF2YWlsYWJsZSB5ZXQKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotSDI2NFN3RGVjUmV0IEgyNjRTd0RlY0dldEluZm8oSDI2NFN3RGVjSW5zdCBkZWNJbnN0LCBIMjY0U3dEZWNJbmZvICpwRGVjSW5mbykKLXsKLQotICAgIHN0b3JhZ2VfdCAqcFN0b3JhZ2U7Ci0KLSAgICBERUNfQVBJX1RSQygiSDI2NFN3RGVjR2V0SW5mbyMiKTsKLQotICAgIGlmIChkZWNJbnN0ID09IE5VTEwgfHwgcERlY0luZm8gPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIERFQ19BUElfVFJDKCJIMjY0U3dEZWNHZXRJbmZvIyBFUlJPUjogZGVjSW5zdCBvciBwRGVjSW5mbyBpcyBOVUxMIik7Ci0gICAgICAgIHJldHVybihIMjY0U1dERUNfUEFSQU1fRVJSKTsKLSAgICB9Ci0KLSAgICBwU3RvcmFnZSA9ICYoKChkZWNDb250YWluZXJfdCAqKWRlY0luc3QpLT5zdG9yYWdlKTsKLQotICAgIGlmIChwU3RvcmFnZS0+YWN0aXZlU3BzID09IE5VTEwgfHwgcFN0b3JhZ2UtPmFjdGl2ZVBwcyA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgREVDX0FQSV9UUkMoIkgyNjRTd0RlY0dldEluZm8jIEVSUk9SOiBIZWFkZXJzIG5vdCBkZWNvZGVkIHlldCIpOwotICAgICAgICByZXR1cm4oSDI2NFNXREVDX0hEUlNfTk9UX1JEWSk7Ci0gICAgfQotCi0jaWZkZWYgSDI2NERFQ19UUkFDRQotICAgIHNwcmludGYoKChkZWNDb250YWluZXJfdCopZGVjSW5zdCktPnN0ciwKLSAgICAgICAgIkgyNjRTd0RlY0dldEluZm8jIGRlY0luc3QgJXAgIHBEZWNJbmZvICVwIiwgZGVjSW5zdCwgKHZvaWQqKXBEZWNJbmZvKTsKLSAgICBERUNfQVBJX1RSQygoKGRlY0NvbnRhaW5lcl90KilkZWNJbnN0KS0+c3RyKTsKLSNlbmRpZgotCi0gICAgLyogaDI2NGJzZFBpY1dpZHRoIGFuZCAtSGVpZ2h0IHJldHVybiBkaW1lbnNpb25zIGluIG1hY3JvYmxvY2sgdW5pdHMsCi0gICAgICogcGljV2lkdGggYW5kIC1IZWlnaHQgaW4gcGl4ZWxzICovCi0gICAgcERlY0luZm8tPnBpY1dpZHRoICAgICAgICA9IGgyNjRic2RQaWNXaWR0aChwU3RvcmFnZSkgPDwgNDsKLSAgICBwRGVjSW5mby0+cGljSGVpZ2h0ICAgICAgID0gaDI2NGJzZFBpY0hlaWdodChwU3RvcmFnZSkgPDwgNDsKLSAgICBwRGVjSW5mby0+dmlkZW9SYW5nZSAgICAgID0gaDI2NGJzZFZpZGVvUmFuZ2UocFN0b3JhZ2UpOwotICAgIHBEZWNJbmZvLT5tYXRyaXhDb2VmZmljaWVudHMgPSBoMjY0YnNkTWF0cml4Q29lZmZpY2llbnRzKHBTdG9yYWdlKTsKLQotICAgIGgyNjRic2RDcm9wcGluZ1BhcmFtcyhwU3RvcmFnZSwKLSAgICAgICAgJnBEZWNJbmZvLT5jcm9wcGluZ0ZsYWcsCi0gICAgICAgICZwRGVjSW5mby0+Y3JvcFBhcmFtcy5jcm9wTGVmdE9mZnNldCwKLSAgICAgICAgJnBEZWNJbmZvLT5jcm9wUGFyYW1zLmNyb3BPdXRXaWR0aCwKLSAgICAgICAgJnBEZWNJbmZvLT5jcm9wUGFyYW1zLmNyb3BUb3BPZmZzZXQsCi0gICAgICAgICZwRGVjSW5mby0+Y3JvcFBhcmFtcy5jcm9wT3V0SGVpZ2h0KTsKLQotICAgIC8qIHNhbXBsZSBhc3BlY3QgcmF0aW8gKi8KLSAgICBoMjY0YnNkU2FtcGxlQXNwZWN0UmF0aW8ocFN0b3JhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwRGVjSW5mby0+cGFyV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwRGVjSW5mby0+cGFySGVpZ2h0KTsKLQotICAgIC8qIHByb2ZpbGUgKi8KLSAgICBwRGVjSW5mby0+cHJvZmlsZSA9IGgyNjRic2RQcm9maWxlKHBTdG9yYWdlKTsKLQotICAgIERFQ19BUElfVFJDKCJIMjY0U3dEZWNHZXRJbmZvIyBPSyIpOwotCi0gICAgcmV0dXJuKEgyNjRTV0RFQ19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBIMjY0U3dEZWNSZWxlYXNlKCkKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgUmVsZWFzZSB0aGUgZGVjb2RlciBpbnN0YW5jZS4gRnVuY3Rpb24gY2FsbHMgaDI2NGJzZFNodXREb3duIHRvCi0gICAgICAgICAgICByZWxlYXNlIGluc3RhbmNlIGRhdGEgYW5kIGZyZWVzIHRoZSBtZW1vcnkgYWxsb2NhdGVkIGZvciB0aGUKLSAgICAgICAgICAgIGluc3RhbmNlLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIGRlY0luc3QgICAgIERlY29kZXIgaW5zdGFuY2UKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgbm9uZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBub25lCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgSDI2NFN3RGVjUmVsZWFzZShIMjY0U3dEZWNJbnN0IGRlY0luc3QpCi17Ci0KLSAgICBkZWNDb250YWluZXJfdCAqcERlY0NvbnQ7Ci0KLSAgICBERUNfQVBJX1RSQygiSDI2NFN3RGVjUmVsZWFzZSMiKTsKLQotICAgIGlmIChkZWNJbnN0ID09IE5VTEwpCi0gICAgewotICAgICAgICBERUNfQVBJX1RSQygiSDI2NFN3RGVjUmVsZWFzZSMgRVJST1I6IGRlY0luc3QgPT0gTlVMTCIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgcERlY0NvbnQgPSAoZGVjQ29udGFpbmVyX3QqKWRlY0luc3Q7Ci0KLSNpZmRlZiBIMjY0REVDX1RSQUNFCi0gICAgc3ByaW50ZihwRGVjQ29udC0+c3RyLCAiSDI2NFN3RGVjUmVsZWFzZSMgZGVjSW5zdCAlcCIsZGVjSW5zdCk7Ci0gICAgREVDX0FQSV9UUkMocERlY0NvbnQtPnN0cik7Ci0jZW5kaWYKLQotICAgIGgyNjRic2RTaHV0ZG93bigmcERlY0NvbnQtPnN0b3JhZ2UpOwotCi0gICAgSDI2NFN3RGVjRnJlZShwRGVjQ29udCk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBIMjY0U3dEZWNEZWNvZGUKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRGVjb2RlIHN0cmVhbSBkYXRhLiBDYWxscyBoMjY0YnNkRGVjb2RlIHRvIGRvIHRoZSBhY3R1YWwgZGVjb2RpbmcuCi0KLSAgICAgICAgSW5wdXQ6Ci0gICAgICAgICAgICBkZWNJbnN0ICAgICBkZWNvZGVyIGluc3RhbmNlCi0gICAgICAgICAgICBwSW5wdXQgICAgICBwb2ludGVyIHRvIGlucHV0IHN0cnVjdAotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBwT3V0cHV0ICAgICBwb2ludGVyIHRvIG91dHB1dCBzdHJ1Y3QKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSDI2NFNXREVDX05PVF9JTklUSUFMSVpFRCAgIGRlY29kZXIgaW5zdGFuY2Ugbm90IGluaXRpYWxpemVkIHlldAotICAgICAgICAgICAgSDI2NFNXREVDX1BBUkFNX0VSUiAgICAgICAgIGludmFsaWQgcGFyYW1ldGVycwotCi0gICAgICAgICAgICBIMjY0U1dERUNfU1RSTV9QUk9DRVNTRUQgICAgc3RyZWFtIGJ1ZmZlciBkZWNvZGVkCi0gICAgICAgICAgICBIMjY0U1dERUNfSERSU19SRFlfQlVGRl9OT1RfRU1QVFkgICBoZWFkZXJzIGRlY29kZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gYnVmZmVyIG5vdCBmaW5pc2hlZAotICAgICAgICAgICAgSDI2NFNXREVDX1BJQ19SRFkgICAgICAgICAgICAgICAgICAgZGVjb2Rpbmcgb2YgYSBwaWN0dXJlIGZpbmlzaGVkCi0gICAgICAgICAgICBIMjY0U1dERUNfUElDX1JEWV9CVUZGX05PVF9FTVBUWSAgICBkZWNvZGluZyBvZiBhIHBpY3R1cmUgZmluaXNoZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gYnVmZmVyIG5vdCBmaW5pc2hlZAotICAgICAgICAgICAgSDI2NFNXREVDX1NUUk1fRVJSICAgICAgICAgICAgICAgICAgc2VyaW91cyBlcnJvciBpbiBkZWNvZGluZywgbm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkIHBhcmFtZXRlciBzZXRzIGF2YWlsYWJsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gZGVjb2RlIHBpY3R1cmUgZGF0YQotICAgICAgICAgICAgSDI2NFNXREVDX0VWQUxVQVRJT05fTElNSVRfRVhDRUVERUQgdGhpcyBjYW4gb25seSBvY2N1ciB3aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmFsdWF0aW9uIHZlcnNpb24gaXMgdXNlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heCBudW1iZXIgb2YgZnJhbWVzIHJlYWNoZWQKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotSDI2NFN3RGVjUmV0IEgyNjRTd0RlY0RlY29kZShIMjY0U3dEZWNJbnN0IGRlY0luc3QsIEgyNjRTd0RlY0lucHV0ICpwSW5wdXQsCi0gICAgICAgICAgICAgICAgICBIMjY0U3dEZWNPdXRwdXQgKnBPdXRwdXQpCi17Ci0KLSAgICBkZWNDb250YWluZXJfdCAqcERlY0NvbnQ7Ci0gICAgdTMyIHN0cm1MZW47Ci0gICAgdTMyIG51bVJlYWRCeXRlczsKLSAgICB1OCAqdG1wU3RyZWFtOwotICAgIHUzMiBkZWNSZXN1bHQgPSAwOwotICAgIEgyNjRTd0RlY1JldCByZXR1cm5WYWx1ZSA9IEgyNjRTV0RFQ19TVFJNX1BST0NFU1NFRDsKLQotICAgIERFQ19BUElfVFJDKCJIMjY0U3dEZWNEZWNvZGUjIik7Ci0KLSAgICAvKiBDaGVjayB0aGF0IGZ1bmN0aW9uIGlucHV0IHBhcmFtZXRlcnMgYXJlIHZhbGlkICovCi0gICAgaWYgKHBJbnB1dCA9PSBOVUxMIHx8IHBPdXRwdXQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIERFQ19BUElfVFJDKCJIMjY0U3dEZWNEZWNvZGUjIEVSUk9SOiBwSW5wdXQgb3IgcE91dHB1dCBpcyBOVUxMIik7Ci0gICAgICAgIHJldHVybihIMjY0U1dERUNfUEFSQU1fRVJSKTsKLSAgICB9Ci0KLSAgICBpZiAoKHBJbnB1dC0+cFN0cmVhbSA9PSBOVUxMKSB8fCAocElucHV0LT5kYXRhTGVuID09IDApKQotICAgIHsKLSAgICAgICAgREVDX0FQSV9UUkMoIkgyNjRTd0RlY0RlY29kZSMgRVJST1I6IEludmFsaWQgaW5wdXQgcGFyYW1ldGVycyIpOwotICAgICAgICByZXR1cm4oSDI2NFNXREVDX1BBUkFNX0VSUik7Ci0gICAgfQotCi0gICAgcERlY0NvbnQgPSAoZGVjQ29udGFpbmVyX3QgKilkZWNJbnN0OwotCi0gICAgLyogQ2hlY2sgaWYgZGVjb2RlciBpcyBpbiBhbiBpbmNvcnJlY3QgbW9kZSAqLwotICAgIGlmIChkZWNJbnN0ID09IE5VTEwgfHwgcERlY0NvbnQtPmRlY1N0YXQgPT0gVU5JTklUSUFMSVpFRCkKLSAgICB7Ci0gICAgICAgIERFQ19BUElfVFJDKCJIMjY0U3dEZWNEZWNvZGUjIEVSUk9SOiBEZWNvZGVyIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICByZXR1cm4oSDI2NFNXREVDX05PVF9JTklUSUFMSVpFRCk7Ci0gICAgfQotCi0jaWZkZWYgSDI2NERFQ19FVkFMVUFUSU9OCi0gICAgaWYgKHBEZWNDb250LT5waWNOdW1iZXIgPj0gSDI2NERFQ19FVkFMVUFUSU9OX0xJTUlUKQotICAgICAgICByZXR1cm4oSDI2NFNXREVDX0VWQUxVQVRJT05fTElNSVRfRVhDRUVERUQpOwotI2VuZGlmCi0KLSNpZmRlZiBIMjY0REVDX1RSQUNFCi0gICAgc3ByaW50ZihwRGVjQ29udC0+c3RyLCAiSDI2NFN3RGVjRGVjb2RlIyBkZWNJbnN0ICVwICBwSW5wdXQgJXAgIHBPdXRwdXQgJXAiLAotICAgICAgICAgICAgZGVjSW5zdCwgKHZvaWQqKXBJbnB1dCwgKHZvaWQqKXBPdXRwdXQpOwotICAgIERFQ19BUElfVFJDKHBEZWNDb250LT5zdHIpOwotI2VuZGlmCi0KLSAgICBwT3V0cHV0LT5wU3RybUN1cnJQb3MgICA9IE5VTEw7Ci0KLSAgICBudW1SZWFkQnl0ZXMgPSAwOwotICAgIHN0cm1MZW4gPSBwSW5wdXQtPmRhdGFMZW47Ci0gICAgdG1wU3RyZWFtID0gcElucHV0LT5wU3RyZWFtOwotICAgIHBEZWNDb250LT5zdG9yYWdlLmludHJhQ29uY2VhbG1lbnRGbGFnID0gcElucHV0LT5pbnRyYUNvbmNlYWxtZW50TWV0aG9kOwotCi0gICAgZG8KLSAgICB7Ci0gICAgICAgIC8qIFJldHVybiBIRFJTX1JEWSBhZnRlciBEUEIgZmx1c2ggY2F1c2VkIGJ5IG5ldyBTUFMgKi8KLSAgICAgICAgaWYgKHBEZWNDb250LT5kZWNTdGF0ID09IE5FV19IRUFERVJTKQotICAgICAgICB7Ci0gICAgICAgICAgICBkZWNSZXN1bHQgPSBIMjY0QlNEX0hEUlNfUkRZOwotICAgICAgICAgICAgcERlY0NvbnQtPmRlY1N0YXQgPSBJTklUSUFMSVpFRDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIC8qIENvbnRpbnVlIGRlY29kaW5nIG5vcm1hbGx5ICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRlY1Jlc3VsdCA9IGgyNjRic2REZWNvZGUoJnBEZWNDb250LT5zdG9yYWdlLCB0bXBTdHJlYW0sIHN0cm1MZW4sCi0gICAgICAgICAgICAgICAgcElucHV0LT5waWNJZCwgJm51bVJlYWRCeXRlcyk7Ci0gICAgICAgIH0KLSAgICAgICAgdG1wU3RyZWFtICs9IG51bVJlYWRCeXRlczsKLSAgICAgICAgLyogY2hlY2sgaWYgdG9vIG1hbnkgYnl0ZXMgYXJlIHJlYWQgZnJvbSBzdHJlYW0gKi8KLSAgICAgICAgaWYgKCAoaTMyKShzdHJtTGVuIC0gbnVtUmVhZEJ5dGVzKSA+PSAwICkKLSAgICAgICAgICAgIHN0cm1MZW4gLT0gbnVtUmVhZEJ5dGVzOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzdHJtTGVuID0gMDsKLQotICAgICAgICBwT3V0cHV0LT5wU3RybUN1cnJQb3MgPSB0bXBTdHJlYW07Ci0KLSAgICAgICAgc3dpdGNoIChkZWNSZXN1bHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgSDI2NEJTRF9IRFJTX1JEWToKLQotICAgICAgICAgICAgICAgIGlmKHBEZWNDb250LT5zdG9yYWdlLmRwYi0+Zmx1c2hlZCAmJgotICAgICAgICAgICAgICAgICAgIHBEZWNDb250LT5zdG9yYWdlLmRwYi0+bnVtT3V0ICE9Ci0gICAgICAgICAgICAgICAgICAgcERlY0NvbnQtPnN0b3JhZ2UuZHBiLT5vdXRJbmRleCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIG91dHB1dCBmaXJzdCBhbGwgRFBCIHN0b3JlZCBwaWN0dXJlcwotICAgICAgICAgICAgICAgICAgICAgKiBEUEIgZmx1c2ggY2F1c2VkIGJ5IG5ldyBTUFMgKi8KLSAgICAgICAgICAgICAgICAgICAgcERlY0NvbnQtPnN0b3JhZ2UuZHBiLT5mbHVzaGVkID0gMDsKLSAgICAgICAgICAgICAgICAgICAgcERlY0NvbnQtPmRlY1N0YXQgPSBORVdfSEVBREVSUzsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBIMjY0U1dERUNfUElDX1JEWV9CVUZGX05PVF9FTVBUWTsKLSAgICAgICAgICAgICAgICAgICAgc3RybUxlbiA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gSDI2NFNXREVDX0hEUlNfUkRZX0JVRkZfTk9UX0VNUFRZOwotICAgICAgICAgICAgICAgICAgICBzdHJtTGVuID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgSDI2NEJTRF9QSUNfUkRZOgotICAgICAgICAgICAgICAgIHBEZWNDb250LT5waWNOdW1iZXIrKzsKLQotICAgICAgICAgICAgICAgIGlmIChzdHJtTGVuID09IDApCi0gICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gSDI2NFNXREVDX1BJQ19SRFk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IEgyNjRTV0RFQ19QSUNfUkRZX0JVRkZfTk9UX0VNUFRZOwotCi0gICAgICAgICAgICAgICAgc3RybUxlbiA9IDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgSDI2NEJTRF9QQVJBTV9TRVRfRVJST1I6Ci0gICAgICAgICAgICAgICAgaWYgKCAhaDI2NGJzZENoZWNrVmFsaWRQYXJhbVNldHMoJnBEZWNDb250LT5zdG9yYWdlKSAmJgotICAgICAgICAgICAgICAgICAgICAgc3RybUxlbiA9PSAwICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gSDI2NFNXREVDX1NUUk1fRVJSOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgSDI2NEJTRF9NRU1BTExPQ19FUlJPUjoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gSDI2NFNXREVDX01FTUZBSUw7Ci0gICAgICAgICAgICAgICAgICAgIHN0cm1MZW4gPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgIH0gd2hpbGUgKHN0cm1MZW4pOwotCi0jaWZkZWYgSDI2NERFQ19UUkFDRQotICAgIHNwcmludGYocERlY0NvbnQtPnN0ciwgIkgyNjRTd0RlY0RlY29kZSMgT0s6IERlY1Jlc3VsdCAlZCIsCi0gICAgICAgICAgICByZXR1cm5WYWx1ZSk7Ci0gICAgREVDX0FQSV9UUkMocERlY0NvbnQtPnN0cik7Ci0jZW5kaWYKLQotICAgIHJldHVybihyZXR1cm5WYWx1ZSk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBIMjY0U3dEZWNHZXRBUElWZXJzaW9uCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIFJldHVybiB2ZXJzaW9uIGluZm9ybWF0aW9uIG9mIHRoZSBBUEkKLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBub25lCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIG5vbmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgQVBJIHZlcnNpb24KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotSDI2NFN3RGVjQXBpVmVyc2lvbiBIMjY0U3dEZWNHZXRBUElWZXJzaW9uKCkKLXsKLSAgICBIMjY0U3dEZWNBcGlWZXJzaW9uIHZlcjsKLQotICAgIHZlci5tYWpvciA9IEgyNjRTV0RFQ19NQUpPUl9WRVJTSU9OOwotICAgIHZlci5taW5vciA9IEgyNjRTV0RFQ19NSU5PUl9WRVJTSU9OOwotCi0gICAgcmV0dXJuKHZlcik7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogSDI2NFN3RGVjTmV4dFBpY3R1cmUKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgR2V0IG5leHQgcGljdHVyZSBpbiBkaXNwbGF5IG9yZGVyIGlmIGFueSBhdmFpbGFibGUuCi0KLSAgICAgICAgSW5wdXQ6Ci0gICAgICAgICAgICBkZWNJbnN0ICAgICBkZWNvZGVyIGluc3RhbmNlLgotICAgICAgICAgICAgZmx1c2hCdWZmZXIgZm9yY2Ugb3V0cHV0IG9mIGFsbCBidWZmZXJlZCBwaWN0dXJlcwotCi0gICAgICAgIE91dHB1dDoKLSAgICAgICAgICAgIHBPdXRwdXQgICAgIHBvaW50ZXIgdG8gb3V0cHV0IHN0cnVjdHVyZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIMjY0U1dERUNfT0sgICAgICAgICAgICBubyBwaWN0dXJlcyBhdmFpbGFibGUgZm9yIGRpc3BsYXkKLSAgICAgICAgICAgIEgyNjRTV0RFQ19QSUNfUkRZICAgICAgIHBpY3R1cmUgYXZhaWxhYmxlIGZvciBkaXNwbGF5Ci0gICAgICAgICAgICBIMjY0U1dERUNfUEFSQU1fRVJSICAgICBpbnZhbGlkIHBhcmFtZXRlcnMKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotSDI2NFN3RGVjUmV0IEgyNjRTd0RlY05leHRQaWN0dXJlKEgyNjRTd0RlY0luc3QgZGVjSW5zdCwKLSAgICBIMjY0U3dEZWNQaWN0dXJlICpwT3V0cHV0LCB1MzIgZmx1c2hCdWZmZXIpCi17Ci0KLSAgICBkZWNDb250YWluZXJfdCAqcERlY0NvbnQ7Ci0gICAgdTMyIG51bUVyck1icywgaXNJZHJQaWMsIHBpY0lkOwotICAgIHUzMiAqcE91dFBpYzsKLQotICAgIERFQ19BUElfVFJDKCJIMjY0U3dEZWNOZXh0UGljdHVyZSMiKTsKLQotICAgIGlmIChkZWNJbnN0ID09IE5VTEwgfHwgcE91dHB1dCA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgREVDX0FQSV9UUkMoIkgyNjRTd0RlY05leHRQaWN0dXJlIyBFUlJPUjogZGVjSW5zdCBvciBwT3V0cHV0IGlzIE5VTEwiKTsKLSAgICAgICAgcmV0dXJuKEgyNjRTV0RFQ19QQVJBTV9FUlIpOwotICAgIH0KLQotICAgIHBEZWNDb250ID0gKGRlY0NvbnRhaW5lcl90KilkZWNJbnN0OwotCi0jaWZkZWYgSDI2NERFQ19UUkFDRQotICAgIHNwcmludGYocERlY0NvbnQtPnN0ciwgIkgyNjRTd0RlY05leHRQaWN0dXJlIyBkZWNJbnN0ICVwIHBPdXRwdXQgJXAgJXMgJWQiLAotICAgICAgICAgICAgZGVjSW5zdCwgKHZvaWQqKXBPdXRwdXQsICJmbHVzaEJ1ZmZlciIsIGZsdXNoQnVmZmVyKTsKLSAgICBERUNfQVBJX1RSQyhwRGVjQ29udC0+c3RyKTsKLSNlbmRpZgotCi0gICAgaWYgKGZsdXNoQnVmZmVyKQotICAgICAgICBoMjY0YnNkRmx1c2hCdWZmZXIoJnBEZWNDb250LT5zdG9yYWdlKTsKLQotICAgIHBPdXRQaWMgPSAodTMyKiloMjY0YnNkTmV4dE91dHB1dFBpY3R1cmUoJnBEZWNDb250LT5zdG9yYWdlLCAmcGljSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXNJZHJQaWMsICZudW1FcnJNYnMpOwotCi0gICAgaWYgKHBPdXRQaWMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIERFQ19BUElfVFJDKCJIMjY0U3dEZWNOZXh0UGljdHVyZSMgT0s6IHJldHVybiBIMjY0U1dERUNfT0siKTsKLSAgICAgICAgcmV0dXJuKEgyNjRTV0RFQ19PSyk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBPdXRwdXQtPnBPdXRwdXRQaWN0dXJlID0gcE91dFBpYzsKLSAgICAgICAgcE91dHB1dC0+cGljSWQgICAgICAgICAgPSBwaWNJZDsKLSAgICAgICAgcE91dHB1dC0+aXNJZHJQaWN0dXJlICAgPSBpc0lkclBpYzsKLSAgICAgICAgcE91dHB1dC0+bmJyT2ZFcnJNQnMgICAgPSBudW1FcnJNYnM7Ci0gICAgICAgIERFQ19BUElfVFJDKCJIMjY0U3dEZWNOZXh0UGljdHVyZSMgT0s6IHJldHVybiBIMjY0U1dERUNfUElDX1JEWSIpOwotICAgICAgICByZXR1cm4oSDI2NFNXREVDX1BJQ19SRFkpOwotICAgIH0KLQotfQotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvVGVzdEJlbmNoTXVsdGlwbGVJbnN0YW5jZS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9UZXN0QmVuY2hNdWx0aXBsZUluc3RhbmNlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMzg2YmIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9UZXN0QmVuY2hNdWx0aXBsZUluc3RhbmNlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qIENWUyB0YWcgbmFtZSBmb3IgaWRlbnRpZmljYXRpb24gKi8KLWNvbnN0IGNoYXIgdGFnTmFtZVsyNTZdID0gIiROYW1lOiBGSVJTVF9BTkRST0lEX0NPUFlSSUdIVCAkIjsKLQotI2luY2x1ZGUgIkgyNjRTd0RlY0FwaS5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNkZWZpbmUgREVCVUcoYXJndikgcHJpbnRmIGFyZ3YKLQotLyogX05PX09VVCBkaXNhYmxlcyBvdXRwdXQgZmlsZSB3cml0aW5nICovCi0jaWZkZWYgX19hcm0KLSNkZWZpbmUgX05PX09VVAotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIFdyaXRlT3V0cHV0KEZJTEUgKmZpZCwgdTggKmRhdGEsIHUzMiBwaWNTaXplKTsKLQotdTMyIENyb3BQaWN0dXJlKHU4ICpwT3V0SW1hZ2UsIHU4ICpwSW5JbWFnZSwKLSAgICB1MzIgcGljV2lkdGgsIHUzMiBwaWNIZWlnaHQsIENyb3BQYXJhbXMgKnBDcm9wUGFyYW1zKTsKLQotdm9pZCBDcm9wV3JpdGVPdXRwdXQoRklMRSAqZmlkLCB1OCAqaW1hZ2VEYXRhLCB1MzIgY3JvcERpc3BsYXksCi0gICAgICAgIEgyNjRTd0RlY0luZm8gKmRlY0luZm8pOwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIEgyNjRTd0RlY0luc3QgZGVjSW5zdDsKLSAgICBIMjY0U3dEZWNJbnB1dCBkZWNJbnB1dDsKLSAgICBIMjY0U3dEZWNPdXRwdXQgZGVjT3V0cHV0OwotICAgIEgyNjRTd0RlY1BpY3R1cmUgZGVjUGljdHVyZTsKLSAgICBIMjY0U3dEZWNJbmZvIGRlY0luZm87Ci0gICAgRklMRSAqZm91dHB1dDsKLSAgICBjaGFyIG91dEZpbGVOYW1lWzI1Nl07Ci0gICAgdTggKmJ5dGVTdHJtU3RhcnQ7Ci0gICAgdTMyIHBpY051bWJlcjsKLX0gRGVjb2RlcjsKLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotCi0gICAgaTMyIGluc3RDb3VudCwgaW5zdFJ1bm5pbmc7Ci0gICAgaTMyIGk7Ci0gICAgdTMyIG1heE51bVBpY3M7Ci0gICAgdTMyIHN0cm1MZW47Ci0gICAgSDI2NFN3RGVjUmV0IHJldDsKLSAgICB1MzIgbnVtRXJyb3JzID0gMDsKLSAgICB1MzIgY3JvcERpc3BsYXkgPSAwOwotICAgIHUzMiBkaXNhYmxlT3V0cHV0UmVvcmRlcmluZyA9IDA7Ci0gICAgRklMRSAqZmlucHV0OwotICAgIERlY29kZXIgKipkZWNvZGVyOwotICAgIGNoYXIgb3V0RmlsZU5hbWVbMjU2XSA9ICJvdXQueXV2IjsKLQotCi0gICAgaWYgKCBhcmdjID4gMSAmJiBzdHJjbXAoYXJndlsxXSwgIi1UIikgPT0gMCApCi0gICAgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCB0YWdOYW1lKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaWYgKGFyZ2MgPCAyKQotICAgIHsKLSAgICAgICAgREVCVUcoKAotICAgICAgICAgICAgIlVzYWdlOiAlcyBbLU5uXSBbLU9vdXRmaWxlXSBbLVBdIFstVV0gWy1DXSBbLVJdIFstVF0gZmlsZTEuMjY0IFtmaWxlMi4yNjRdIC4uIFtmaWxlTi4yNjRdXG4iLAotICAgICAgICAgICAgYXJndlswXSkpOwotICAgICAgICBERUJVRygoIlx0LU5uIGZvcmNlcyBkZWNvZGluZyB0byBzdG9wIGFmdGVyIG4gcGljdHVyZXNcbiIpKTsKLSNpZiBkZWZpbmVkKF9OT19PVVQpCi0gICAgICAgIERFQlVHKCgiXHQtT291dGZpbGUgb3V0cHV0IHdyaXRpbmcgZGlzYWJsZWQgYXQgY29tcGlsZSB0aW1lXG4iKSk7Ci0jZWxzZQotICAgICAgICBERUJVRygoIlx0LU9vdXRmaWxlIHdyaXRlIG91dHB1dCB0byBcIm91dGZpbGVcIiAoZGVmYXVsdCBvdXQueXV2KVxuIikpOwotICAgICAgICBERUJVRygoIlx0LU9ub25lIGRvZXMgbm90IHdyaXRlIG91dHB1dFxuIikpOwotI2VuZGlmCi0gICAgICAgIERFQlVHKCgiXHQtQyBkaXNwbGF5IGNyb3BwZWQgaW1hZ2UgKGRlZmF1bHQgZGVjb2RlZCBpbWFnZSlcbiIpKTsKLSAgICAgICAgREVCVUcoKCJcdC1SIGRpc2FibGUgRFBCIG91dHB1dCByZW9yZGVyaW5nXG4iKSk7Ci0gICAgICAgIERFQlVHKCgiXHQtVCB0byBwcmludCB0YWcgbmFtZSBhbmQgZXhpdFxuIikpOwotICAgICAgICBleGl0KDEwMCk7Ci0gICAgfQotCi0gICAgaW5zdENvdW50ID0gYXJnYyAtIDE7Ci0KLSAgICAvKiByZWFkIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgKi8KLSAgICBtYXhOdW1QaWNzID0gMDsKLSAgICBmb3IgKGkgPSAxOyBpIDwgKGFyZ2MtMSk7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmICggc3RybmNtcChhcmd2W2ldLCAiLU4iLCAyKSA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgICAgbWF4TnVtUGljcyA9ICh1MzIpYXRvaShhcmd2W2ldKzIpOwotICAgICAgICAgICAgaW5zdENvdW50LS07Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIHN0cm5jbXAoYXJndltpXSwgIi1PIiwgMikgPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cmNweShvdXRGaWxlTmFtZSwgYXJndltpXSsyKTsKLSAgICAgICAgICAgIGluc3RDb3VudC0tOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCBzdHJjbXAoYXJndltpXSwgIi1DIikgPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNyb3BEaXNwbGF5ID0gMTsKLSAgICAgICAgICAgIGluc3RDb3VudC0tOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCBzdHJjbXAoYXJndltpXSwgIi1SIikgPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRpc2FibGVPdXRwdXRSZW9yZGVyaW5nID0gMTsKLSAgICAgICAgICAgIGluc3RDb3VudC0tOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGluc3RDb3VudCA8IDEpCi0gICAgewotICAgICAgICBERUJVRygoIk5vIGlucHV0IGZpbGVzXG4iKSk7Ci0gICAgICAgIGV4aXQoMTAwKTsKLSAgICB9Ci0KLSAgICAvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIG11bHRpcGxlIGRlY29kZXIgaW5zdGFuY2VzCi0gICAgICogb25lIGluc3RhbmNlIGZvciBldmVyeSBzdHJlYW0gZmlsZSAqLwotICAgIGRlY29kZXIgPSAoRGVjb2RlciAqKiltYWxsb2Moc2l6ZW9mKERlY29kZXIqKSoodTMyKWluc3RDb3VudCk7Ci0gICAgaWYgKGRlY29kZXIgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIERFQlVHKCgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeVxuIikpOwotICAgICAgICBleGl0KDEwMCk7Ci0gICAgfQotCi0gICAgLyogcHJlcGFyZSBlYWNoIGRlY29kZXIgaW5zdGFuY2UgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgaW5zdENvdW50OyBpKyspCi0gICAgewotICAgICAgICBkZWNvZGVyW2ldID0gKERlY29kZXIgKiljYWxsb2MoMSwgc2l6ZW9mKERlY29kZXIpKTsKLQotICAgICAgICAvKiBvcGVuIGlucHV0IGZpbGUgKi8KLSAgICAgICAgZmlucHV0ID0gZm9wZW4oYXJndlthcmdjLWluc3RDb3VudCtpXSwicmIiKTsKLSAgICAgICAgaWYgKGZpbnB1dCA9PSBOVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBERUJVRygoIlVuYWJsZSB0byBvcGVuIGlucHV0IGZpbGUgPCVzPlxuIiwgYXJndlthcmdjLWluc3RDb3VudCtpXSkpOwotICAgICAgICAgICAgZXhpdCgxMDApOwotICAgICAgICB9Ci0KLSAgICAgICAgREVCVUcoKCJSZWFkaW5nIGlucHV0IGZpbGVbJWRdICVzXG4iLCBpLCBhcmd2W2FyZ2MtaW5zdENvdW50K2ldKSk7Ci0KLSAgICAgICAgLyogcmVhZCBpbnB1dCBzdHJlYW0gdG8gYnVmZmVyICovCi0gICAgICAgIGZzZWVrKGZpbnB1dCwwTCxTRUVLX0VORCk7Ci0gICAgICAgIHN0cm1MZW4gPSAodTMyKWZ0ZWxsKGZpbnB1dCk7Ci0gICAgICAgIHJld2luZChmaW5wdXQpOwotICAgICAgICBkZWNvZGVyW2ldLT5ieXRlU3RybVN0YXJ0ID0gKHU4ICopbWFsbG9jKHNpemVvZih1OCkqc3RybUxlbik7Ci0gICAgICAgIGlmIChkZWNvZGVyW2ldLT5ieXRlU3RybVN0YXJ0ID09IE5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIERFQlVHKCgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeVxuIikpOwotICAgICAgICAgICAgZXhpdCgxMDApOwotICAgICAgICB9Ci0gICAgICAgIGZyZWFkKGRlY29kZXJbaV0tPmJ5dGVTdHJtU3RhcnQsIHNpemVvZih1OCksIHN0cm1MZW4sIGZpbnB1dCk7Ci0gICAgICAgIGZjbG9zZShmaW5wdXQpOwotCi0gICAgICAgIC8qIG9wZW4gb3V0cHV0IGZpbGUgKi8KLSAgICAgICAgaWYgKHN0cmNtcChvdXRGaWxlTmFtZSwgIm5vbmUiKSAhPSAwKQotICAgICAgICB7Ci0jaWYgZGVmaW5lZChfTk9fT1VUKQotICAgICAgICAgICAgZGVjb2RlcltpXS0+Zm91dHB1dCA9IE5VTEw7Ci0jZWxzZQotICAgICAgICAgICAgc3ByaW50ZihkZWNvZGVyW2ldLT5vdXRGaWxlTmFtZSwgIiVzJWkiLCBvdXRGaWxlTmFtZSwgaSk7Ci0gICAgICAgICAgICBkZWNvZGVyW2ldLT5mb3V0cHV0ID0gZm9wZW4oZGVjb2RlcltpXS0+b3V0RmlsZU5hbWUsICJ3YiIpOwotICAgICAgICAgICAgaWYgKGRlY29kZXJbaV0tPmZvdXRwdXQgPT0gTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBERUJVRygoIlVuYWJsZSB0byBvcGVuIG91dHB1dCBmaWxlXG4iKSk7Ci0gICAgICAgICAgICAgICAgZXhpdCgxMDApOwotICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgIH0KLQotICAgICAgICByZXQgPSBIMjY0U3dEZWNJbml0KCYoZGVjb2RlcltpXS0+ZGVjSW5zdCksIGRpc2FibGVPdXRwdXRSZW9yZGVyaW5nKTsKLQotICAgICAgICBpZiAocmV0ICE9IEgyNjRTV0RFQ19PSykKLSAgICAgICAgewotICAgICAgICAgICAgREVCVUcoKCJJbml0IGZhaWxlZCAlZFxuIiwgcmV0KSk7Ci0gICAgICAgICAgICBleGl0KDEwMCk7Ci0gICAgICAgIH0KLQotICAgICAgICBkZWNvZGVyW2ldLT5kZWNJbnB1dC5wU3RyZWFtID0gZGVjb2RlcltpXS0+Ynl0ZVN0cm1TdGFydDsKLSAgICAgICAgZGVjb2RlcltpXS0+ZGVjSW5wdXQuZGF0YUxlbiA9IHN0cm1MZW47Ci0gICAgICAgIGRlY29kZXJbaV0tPmRlY0lucHV0LmludHJhQ29uY2VhbG1lbnRNZXRob2QgPSAwOwotCi0gICAgfQotCi0gICAgLyogbWFpbiBkZWNvZGluZyBsb29wICovCi0gICAgZG8KLSAgICB7Ci0gICAgICAgIC8qIGRlY29kZSBvbmNlIHVzaW5nIGVhY2ggaW5zdGFuY2UgKi8KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGluc3RDb3VudDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXQgPSBIMjY0U3dEZWNEZWNvZGUoZGVjb2RlcltpXS0+ZGVjSW5zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihkZWNvZGVyW2ldLT5kZWNJbnB1dCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoZGVjb2RlcltpXS0+ZGVjT3V0cHV0KSk7Ci0KLSAgICAgICAgICAgIHN3aXRjaChyZXQpCi0gICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIEgyNjRTV0RFQ19IRFJTX1JEWV9CVUZGX05PVF9FTVBUWToKLQotICAgICAgICAgICAgICAgICAgICByZXQgPSBIMjY0U3dEZWNHZXRJbmZvKGRlY29kZXJbaV0tPmRlY0luc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJihkZWNvZGVyW2ldLT5kZWNJbmZvKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXQgIT0gSDI2NFNXREVDX09LKQotICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoY3JvcERpc3BsYXkgJiYgZGVjb2RlcltpXS0+ZGVjSW5mby5jcm9wcGluZ0ZsYWcpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHKCgiRGVjb2RlclslZF0gQ3JvcHBpbmcgcGFyYW1zOiAoJWQsICVkKSAlZHglZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY0luZm8uY3JvcFBhcmFtcy5jcm9wTGVmdE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyW2ldLT5kZWNJbmZvLmNyb3BQYXJhbXMuY3JvcFRvcE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyW2ldLT5kZWNJbmZvLmNyb3BQYXJhbXMuY3JvcE91dFdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY0luZm8uY3JvcFBhcmFtcy5jcm9wT3V0SGVpZ2h0KSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBERUJVRygoIkRlY29kZXJbJWRdIFdpZHRoICVkIEhlaWdodCAlZFxuIiwgaSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY0luZm8ucGljV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyW2ldLT5kZWNJbmZvLnBpY0hlaWdodCkpOwotCi0gICAgICAgICAgICAgICAgICAgIERFQlVHKCgiRGVjb2RlclslZF0gdmlkZW9SYW5nZSAlZCwgbWF0cmljQ29lZmZpY2llbnRzICVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgaSwgZGVjb2RlcltpXS0+ZGVjSW5mby52aWRlb1JhbmdlLAotICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlcltpXS0+ZGVjSW5mby5tYXRyaXhDb2VmZmljaWVudHMpKTsKLSAgICAgICAgICAgICAgICAgICAgZGVjb2RlcltpXS0+ZGVjSW5wdXQuZGF0YUxlbiAtPQotICAgICAgICAgICAgICAgICAgICAgICAgKHUzMikoZGVjb2RlcltpXS0+ZGVjT3V0cHV0LnBTdHJtQ3VyclBvcyAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyW2ldLT5kZWNJbnB1dC5wU3RyZWFtKTsKLSAgICAgICAgICAgICAgICAgICAgZGVjb2RlcltpXS0+ZGVjSW5wdXQucFN0cmVhbSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyW2ldLT5kZWNPdXRwdXQucFN0cm1DdXJyUG9zOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgSDI2NFNXREVDX1BJQ19SRFlfQlVGRl9OT1RfRU1QVFk6Ci0gICAgICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY0lucHV0LmRhdGFMZW4gLT0KLSAgICAgICAgICAgICAgICAgICAgICAgICh1MzIpKGRlY29kZXJbaV0tPmRlY091dHB1dC5wU3RybUN1cnJQb3MgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlcltpXS0+ZGVjSW5wdXQucFN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY0lucHV0LnBTdHJlYW0gPQotICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlcltpXS0+ZGVjT3V0cHV0LnBTdHJtQ3VyclBvczsKLSAgICAgICAgICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCi0gICAgICAgICAgICAgICAgY2FzZSBIMjY0U1dERUNfUElDX1JEWToKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA9PSBIMjY0U1dERUNfUElDX1JEWSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY0lucHV0LmRhdGFMZW4gPSAwOwotCi0gICAgICAgICAgICAgICAgICAgIHJldCA9IEgyNjRTd0RlY0dldEluZm8oZGVjb2RlcltpXS0+ZGVjSW5zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKGRlY29kZXJbaV0tPmRlY0luZm8pKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldCAhPSBIMjY0U1dERUNfT0spCi0gICAgICAgICAgICAgICAgICAgICAgICBleGl0KDEpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChIMjY0U3dEZWNOZXh0UGljdHVyZShkZWNvZGVyW2ldLT5kZWNJbnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoZGVjb2RlcltpXS0+ZGVjUGljdHVyZSksIDApID09IEgyNjRTV0RFQ19QSUNfUkRZKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyW2ldLT5waWNOdW1iZXIrKzsKLQotICAgICAgICAgICAgICAgICAgICAgICAgbnVtRXJyb3JzICs9IGRlY29kZXJbaV0tPmRlY1BpY3R1cmUubmJyT2ZFcnJNQnM7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHKCgiRGVjb2RlclslZF0gUElDICVkLCB0eXBlICVzLCBjb25jZWFsZWQgJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgZGVjb2RlcltpXS0+cGljTnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY1BpY3R1cmUuaXNJZHJQaWN0dXJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gIklEUiIgOiAiTk9OLUlEUiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlcltpXS0+ZGVjUGljdHVyZS5uYnJPZkVyck1CcykpOwotICAgICAgICAgICAgICAgICAgICAgICAgZmZsdXNoKHN0ZG91dCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIENyb3BXcml0ZU91dHB1dChkZWNvZGVyW2ldLT5mb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodTgqKWRlY29kZXJbaV0tPmRlY1BpY3R1cmUucE91dHB1dFBpY3R1cmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyb3BEaXNwbGF5LCAmKGRlY29kZXJbaV0tPmRlY0luZm8pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtYXhOdW1QaWNzICYmIGRlY29kZXJbaV0tPnBpY051bWJlciA9PSBtYXhOdW1QaWNzKQotICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlcltpXS0+ZGVjSW5wdXQuZGF0YUxlbiA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBIMjY0U1dERUNfU1RSTV9QUk9DRVNTRUQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBIMjY0U1dERUNfU1RSTV9FUlI6Ci0gICAgICAgICAgICAgICAgY2FzZSBIMjY0U1dERUNfUEFSQU1fRVJSOgotICAgICAgICAgICAgICAgICAgICBkZWNvZGVyW2ldLT5kZWNJbnB1dC5kYXRhTGVuID0gMDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBERUJVRygoIkRlY29kZXJbJWRdIEZBVEFMIEVSUk9SXG4iLCBpKSk7Ci0gICAgICAgICAgICAgICAgICAgIGV4aXQoMTApOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogY2hlY2sgaWYgYW55IG9mIHRoZSBpbnN0YW5jZXMgaXMgc3RpbGwgcnVubmluZyAoPWhhcyBtb3JlIGRhdGEpICovCi0gICAgICAgIGluc3RSdW5uaW5nID0gaW5zdENvdW50OwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaW5zdENvdW50OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChkZWNvZGVyW2ldLT5kZWNJbnB1dC5kYXRhTGVuID09IDApCi0gICAgICAgICAgICAgICAgaW5zdFJ1bm5pbmctLTsKLSAgICAgICAgfQotCi0gICAgfSB3aGlsZSAoaW5zdFJ1bm5pbmcpOwotCi0KLSAgICAvKiBnZXQgbGFzdCBmcmFtZXMgYW5kIGNsb3NlIGVhY2ggaW5zdGFuY2UgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgaW5zdENvdW50OyBpKyspCi0gICAgewotICAgICAgICB3aGlsZSAoSDI2NFN3RGVjTmV4dFBpY3R1cmUoZGVjb2RlcltpXS0+ZGVjSW5zdCwKLSAgICAgICAgICAgICAgICAmKGRlY29kZXJbaV0tPmRlY1BpY3R1cmUpLCAxKSA9PSBIMjY0U1dERUNfUElDX1JEWSkKLSAgICAgICAgewotICAgICAgICAgICAgZGVjb2RlcltpXS0+cGljTnVtYmVyKys7Ci0KLSAgICAgICAgICAgIERFQlVHKCgiRGVjb2RlclslZF0gUElDICVkLCB0eXBlICVzLCBjb25jZWFsZWQgJWRcbiIsCi0gICAgICAgICAgICAgICAgaSwgZGVjb2RlcltpXS0+cGljTnVtYmVyLAotICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY1BpY3R1cmUuaXNJZHJQaWN0dXJlCi0gICAgICAgICAgICAgICAgICAgID8gIklEUiIgOiAiTk9OLUlEUiIsCi0gICAgICAgICAgICAgICAgZGVjb2RlcltpXS0+ZGVjUGljdHVyZS5uYnJPZkVyck1CcykpOwotICAgICAgICAgICAgZmZsdXNoKHN0ZG91dCk7Ci0KLSAgICAgICAgICAgIENyb3BXcml0ZU91dHB1dChkZWNvZGVyW2ldLT5mb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAodTgqKWRlY29kZXJbaV0tPmRlY1BpY3R1cmUucE91dHB1dFBpY3R1cmUsCi0gICAgICAgICAgICAgICAgICAgIGNyb3BEaXNwbGF5LCAmKGRlY29kZXJbaV0tPmRlY0luZm8pKTsKLSAgICAgICAgfQotCi0gICAgICAgIEgyNjRTd0RlY1JlbGVhc2UoZGVjb2RlcltpXS0+ZGVjSW5zdCk7Ci0KLSAgICAgICAgaWYgKGRlY29kZXJbaV0tPmZvdXRwdXQpCi0gICAgICAgICAgICBmY2xvc2UoZGVjb2RlcltpXS0+Zm91dHB1dCk7Ci0KLSAgICAgICAgZnJlZShkZWNvZGVyW2ldLT5ieXRlU3RybVN0YXJ0KTsKLQotICAgICAgICBmcmVlKGRlY29kZXJbaV0pOwotICAgIH0KLQotICAgIGZyZWUoZGVjb2Rlcik7Ci0KLSAgICBpZiAobnVtRXJyb3JzKQotICAgICAgICByZXR1cm4gMTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiAwOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIENyb3BXcml0ZU91dHB1dChGSUxFICpmb3V0cHV0LCB1OCAqaW1hZ2VEYXRhLCB1MzIgY3JvcERpc3BsYXksCi0gICAgICAgIEgyNjRTd0RlY0luZm8gKmRlY0luZm8pCi17Ci0gICAgdTggKnRtcEltYWdlID0gTlVMTDsKLSAgICB1MzIgdG1wLCBwaWNTaXplOwotCi0gICAgaWYgKGNyb3BEaXNwbGF5ICYmIGRlY0luZm8tPmNyb3BwaW5nRmxhZykKLSAgICB7Ci0gICAgICAgIHBpY1NpemUgPSBkZWNJbmZvLT5jcm9wUGFyYW1zLmNyb3BPdXRXaWR0aCAqCi0gICAgICAgICAgICAgICAgICBkZWNJbmZvLT5jcm9wUGFyYW1zLmNyb3BPdXRIZWlnaHQ7Ci0gICAgICAgIHBpY1NpemUgPSAoMyAqIHBpY1NpemUpLzI7Ci0gICAgICAgIHRtcEltYWdlID0gbWFsbG9jKHBpY1NpemUpOwotICAgICAgICBpZiAodG1wSW1hZ2UgPT0gTlVMTCkKLSAgICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgIHRtcCA9IENyb3BQaWN0dXJlKHRtcEltYWdlLCBpbWFnZURhdGEsCi0gICAgICAgICAgICBkZWNJbmZvLT5waWNXaWR0aCwgZGVjSW5mby0+cGljSGVpZ2h0LAotICAgICAgICAgICAgJihkZWNJbmZvLT5jcm9wUGFyYW1zKSk7Ci0gICAgICAgIGlmICh0bXApCi0gICAgICAgICAgICBleGl0KDEpOwotICAgICAgICBXcml0ZU91dHB1dChmb3V0cHV0LCB0bXBJbWFnZSwgcGljU2l6ZSk7Ci0gICAgICAgIGZyZWUodG1wSW1hZ2UpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwaWNTaXplID0gZGVjSW5mby0+cGljV2lkdGggKiBkZWNJbmZvLT5waWNIZWlnaHQ7Ci0gICAgICAgIHBpY1NpemUgPSAoMyAqIHBpY1NpemUpLzI7Ci0gICAgICAgIFdyaXRlT3V0cHV0KGZvdXRwdXQsIGltYWdlRGF0YSwgcGljU2l6ZSk7Ci0gICAgfQotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIFdyaXRlT3V0cHV0KEZJTEUgKmZpZCwgdTggKmRhdGEsIHUzMiBwaWNTaXplKQotewotICAgIGlmIChmaWQpCi0gICAgICAgIGZ3cml0ZShkYXRhLCAxLCBwaWNTaXplLCBmaWQpOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb24gbmFtZTogIEgyNjRTd0RlY1RyYWNlCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIEgyNjRTd0RlY1RyYWNlKGNoYXIgKnN0cmluZykKLXsKLSAgICBGSUxFICpmcDsKLQotICAgIGZwID0gZm9wZW4oImRlY19hcGkudHJjIiwgImF0Iik7Ci0KLSAgICBpZiAoIWZwKQotICAgICAgICByZXR1cm47Ci0KLSAgICBmd3JpdGUoc3RyaW5nLCAxLCBzdHJsZW4oc3RyaW5nKSwgZnApOwotICAgIGZ3cml0ZSgiXG4iLCAxLDEsIGZwKTsKLQotICAgIGZjbG9zZShmcCk7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbiBuYW1lOiAgSDI2NFN3RGVjbWFsbG9jCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkKiBIMjY0U3dEZWNNYWxsb2ModTMyIHNpemUsIHUzMiBudW0pCi17Ci0gICAgaWYgKHNpemUgPiBVSU5UMzJfTUFYIC8gbnVtKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gbWFsbG9jKHNpemUgKiBudW0pOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb24gbmFtZTogIEgyNjRTd0RlY0ZyZWUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgSDI2NFN3RGVjRnJlZSh2b2lkICpwdHIpCi17Ci0gICAgZnJlZShwdHIpOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb24gbmFtZTogIEgyNjRTd0RlY01lbWNweQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBIMjY0U3dEZWNNZW1jcHkodm9pZCAqZGVzdCwgdm9pZCAqc3JjLCB1MzIgY291bnQpCi17Ci0gICAgbWVtY3B5KGRlc3QsIHNyYywgY291bnQpOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb24gbmFtZTogIEgyNjRTd0RlY01lbXNldAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBIMjY0U3dEZWNNZW1zZXQodm9pZCAqcHRyLCBpMzIgdmFsdWUsIHUzMiBjb3VudCkKLXsKLSAgICBtZW1zZXQocHRyLCB2YWx1ZSwgY291bnQpOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb24gbmFtZTogQ3JvcFBpY3R1cmUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXUzMiBDcm9wUGljdHVyZSh1OCAqcE91dEltYWdlLCB1OCAqcEluSW1hZ2UsCi0gICAgdTMyIHBpY1dpZHRoLCB1MzIgcGljSGVpZ2h0LCBDcm9wUGFyYW1zICpwQ3JvcFBhcmFtcykKLXsKLQotICAgIHUzMiBpLCBqOwotICAgIHUzMiBvdXRXaWR0aCwgb3V0SGVpZ2h0OwotICAgIHU4ICpwT3V0LCAqcEluOwotCi0gICAgaWYgKHBPdXRJbWFnZSA9PSBOVUxMIHx8IHBJbkltYWdlID09IE5VTEwgfHwgcENyb3BQYXJhbXMgPT0gTlVMTCB8fAotICAgICAgICAhcGljV2lkdGggfHwgIXBpY0hlaWdodCkKLSAgICB7Ci0gICAgICAgIC8qIGR1ZSB0byBsaW50IHdhcm5pbmcgKi8KLSAgICAgICAgZnJlZShwT3V0SW1hZ2UpOwotICAgICAgICByZXR1cm4oMSk7Ci0gICAgfQotCi0gICAgaWYgKCAoKHBDcm9wUGFyYW1zLT5jcm9wTGVmdE9mZnNldCArIHBDcm9wUGFyYW1zLT5jcm9wT3V0V2lkdGgpID4KLSAgICAgICAgICAgcGljV2lkdGggKSB8fAotICAgICAgICAgKChwQ3JvcFBhcmFtcy0+Y3JvcFRvcE9mZnNldCArIHBDcm9wUGFyYW1zLT5jcm9wT3V0SGVpZ2h0KSA+Ci0gICAgICAgICAgIHBpY0hlaWdodCApICkKLSAgICB7Ci0gICAgICAgIC8qIGR1ZSB0byBsaW50IHdhcm5pbmcgKi8KLSAgICAgICAgZnJlZShwT3V0SW1hZ2UpOwotICAgICAgICByZXR1cm4oMSk7Ci0gICAgfQotCi0gICAgb3V0V2lkdGggPSBwQ3JvcFBhcmFtcy0+Y3JvcE91dFdpZHRoOwotICAgIG91dEhlaWdodCA9IHBDcm9wUGFyYW1zLT5jcm9wT3V0SGVpZ2h0OwotCi0gICAgcEluID0gcEluSW1hZ2UgKyBwQ3JvcFBhcmFtcy0+Y3JvcFRvcE9mZnNldCpwaWNXaWR0aCArCi0gICAgICAgIHBDcm9wUGFyYW1zLT5jcm9wTGVmdE9mZnNldDsKLSAgICBwT3V0ID0gcE91dEltYWdlOwotCi0gICAgLyogbHVtYSAqLwotICAgIGZvciAoaSA9IG91dEhlaWdodDsgaTsgaS0tKQotICAgIHsKLSAgICAgICAgZm9yIChqID0gb3V0V2lkdGg7IGo7IGotLSkKLSAgICAgICAgewotICAgICAgICAgICAgKnBPdXQrKyA9ICpwSW4rKzsKLSAgICAgICAgfQotICAgICAgICBwSW4gKz0gcGljV2lkdGggLSBvdXRXaWR0aDsKLSAgICB9Ci0KLSAgICBvdXRXaWR0aCA+Pj0gMTsKLSAgICBvdXRIZWlnaHQgPj49IDE7Ci0KLSAgICBwSW4gPSBwSW5JbWFnZSArIHBpY1dpZHRoKnBpY0hlaWdodCArCi0gICAgICAgIHBDcm9wUGFyYW1zLT5jcm9wVG9wT2Zmc2V0KnBpY1dpZHRoLzQgKyBwQ3JvcFBhcmFtcy0+Y3JvcExlZnRPZmZzZXQvMjsKLQotICAgIC8qIGNiICovCi0gICAgZm9yIChpID0gb3V0SGVpZ2h0OyBpOyBpLS0pCi0gICAgewotICAgICAgICBmb3IgKGogPSBvdXRXaWR0aDsgajsgai0tKQotICAgICAgICB7Ci0gICAgICAgICAgICAqcE91dCsrID0gKnBJbisrOwotICAgICAgICB9Ci0gICAgICAgIHBJbiArPSBwaWNXaWR0aC8yIC0gb3V0V2lkdGg7Ci0gICAgfQotCi0gICAgcEluID0gcEluSW1hZ2UgKyA1KnBpY1dpZHRoKnBpY0hlaWdodC80ICsKLSAgICAgICAgcENyb3BQYXJhbXMtPmNyb3BUb3BPZmZzZXQqcGljV2lkdGgvNCArIHBDcm9wUGFyYW1zLT5jcm9wTGVmdE9mZnNldC8yOwotCi0gICAgLyogY3IgKi8KLSAgICBmb3IgKGkgPSBvdXRIZWlnaHQ7IGk7IGktLSkKLSAgICB7Ci0gICAgICAgIGZvciAoaiA9IG91dFdpZHRoOyBqOyBqLS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgICpwT3V0KysgPSAqcEluKys7Ci0gICAgICAgIH0KLSAgICAgICAgcEluICs9IHBpY1dpZHRoLzIgLSBvdXRXaWR0aDsKLSAgICB9Ci0KLSAgICByZXR1cm4gKDApOwotCi19Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfY2hyb21hX2hvci5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV9jaHJvbWFfaG9yLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNGE0ODQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV9jaHJvbWFfaG9yLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyOTggKzAsMCBAQAotOyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotOwotOyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsKLTsgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsKLTsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTstLQotOy0tIEFic3RyYWN0IDogQVJNdjYgb3B0aW1pemVkIHZlcnNpb24gb2YgaDI2NGJzZEludGVycG9sYXRlQ2hyb21hSG9yIGZ1bmN0aW9uCi07LS0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotICAgIElGICA6REVGOiBIMjY0REVDX1dJTkFTTQotICAgICAgICA7Ly8gV2UgZG9udCB1c2UgUkVRVUlSRTggYW5kIFBSRVNFUlZFOCBmb3Igd2luYXNtCi0gICAgRUxTRQotICAgICAgICBSRVFVSVJFOAotICAgICAgICBQUkVTRVJWRTgKLSAgICBFTkRJRgotCi0gICAgQVJFQSAgICB8LnRleHR8LCBDT0RFCi0KLQotOy8vIGgyNjRic2RJbnRlcnBvbGF0ZUNocm9tYUhvciByZWdpc3RlciBhbGxvY2F0aW9uCi0KLXJlZiAgICAgUk4gMAotcHRyQSAgICBSTiAwCi0KLW1iICAgICAgUk4gMQotYmxvY2sgICBSTiAxCi0KLXgwICAgICAgUk4gMgotY291bnQgICBSTiAyCi0KLXkwICAgICAgUk4gMwotdmFsWCAgICBSTiAzCi0KLXdpZHRoICAgUk4gNAotCi1oZWlnaHQgIFJOIDUKLXRtcDcgICAgUk4gNQotCi1jaHJQVyAgIFJOIDYKLXRtcDggICAgUk4gNgotCi10bXAxICAgIFJOIDcKLWNoclBIICAgUk4gNwotCi10bXAyICAgIFJOIDgKLQotdG1wMyAgICBSTiA5Ci0KLXRtcDQgICAgUk4gMTAKLQotdG1wNSAgICBSTiAxMQotCi10bXA2ICAgIFJOIDEyCi0KLWMzMiAgICAgUk4gMTQKLXhGcmFjICAgUk4gMTQKLQotOy8vIEZ1bmN0aW9uIGV4cG9ydHMgYW5kIGltcG9ydHMKLQotICAgIElNUE9SVCAgaDI2NGJzZEZpbGxCbG9jawotCi0gICAgRVhQT1JUICBoMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFIb3IKLQotOy8vICBGdW5jdGlvbiBhcmd1bWVudHMKLTsvLwotOy8vICB1OCAqcmVmLCAgICAgICAgICAgICAgICAgICA6IDB4YzQKLTsvLyAgdTggKnByZWRQYXJ0Q2hyb21hLCAgICAgICAgOiAweGM4Ci07Ly8gIGkzMiB4MCwgICAgICAgICAgICAgICAgICAgIDogMHhjYwotOy8vICBpMzIgeTAsICAgICAgICAgICAgICAgICAgICA6IDB4ZDAKLTsvLyAgdTMyIHdpZHRoLCAgICAgICAgICAgICAgICAgOiAweGY4Ci07Ly8gIHUzMiBoZWlnaHQsICAgICAgICAgICAgICAgIDogMHhmYwotOy8vICB1MzIgeEZyYWMsICAgICAgICAgICAgICAgICA6IDB4MTAwCi07Ly8gIHUzMiBjaHJvbWFQYXJ0V2lkdGgsICAgICAgIDogMHgxMDQKLTsvLyAgdTMyIGNocm9tYVBhcnRIZWlnaHQgICAgICAgOiAweDEwOAotCi1oMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFIb3IKLSAgICBTVE1GRCAgIHNwISwge3IwLXIxMSxscn0KLSAgICBTVUIgICAgIHNwLCBzcCwgIzB4YzQKLQotICAgIExEUiAgICAgY2hyUFcsIFtzcCwgIzB4MTA0XSAgICAgOy8vIGNocm9tYVBhcnRXaWR0aAotICAgIExEUiAgICAgd2lkdGgsIFtzcCwgIzB4ZjhdICAgICAgOy8vIHdpZHRoCi0gICAgQ01QICAgICB4MCwgIzAKLSAgICBCTFQgICAgIGRvX2ZpbGwKLQotICAgIEFERCAgICAgdG1wNiwgeDAsIGNoclBXICAgICAgICAgOy8vIHRtcDYgPSB4MCsgY2hyb21hUGFydFdpZHRoCi0gICAgQUREICAgICB0bXA2LCB0bXA2LCAjMSAgICAgICAgICA7Ly8gdG1wNiA9IHgwICsgY2hyb21hUGFydFdpZHRoICsgMQotICAgIENNUCAgICAgdG1wNiwgd2lkdGggICAgICAgICAgICAgOy8vIHgwK2Nocm9tYVBhcnRXaWR0aCsxID4gd2lkdGgKLSAgICBCSEkgICAgIGRvX2ZpbGwKLQotICAgIENNUCAgICAgeTAsICMwCi0gICAgQkxUICAgICBkb19maWxsCi0gICAgTERSICAgICBjaHJQSCwgW3NwLCAjMHgxMDhdICAgICA7Ly8gY2hyb21hUGFydEhlaWdodAotICAgIExEUiAgICAgaGVpZ2h0LCBbc3AsICMweGZjXSAgICAgOy8vIGhlaWdodAotICAgIEFERCAgICAgdG1wNiwgeTAsIGNoclBIICAgICAgICAgOy8vIHRtcDYgPSB5MCArIGNocm9tYVBhcnRIZWlnaHQKLSAgICBDTVAgICAgIHRtcDYsIGhlaWdodAotICAgIEJMUyAgICAgc2tpcF9maWxsCi0KLWRvX2ZpbGwKLSAgICBMRFIgICAgIGNoclBILCBbc3AsICMweDEwOF0gICAgIDsvLyBjaHJvbWFQYXJ0SGVpZ2h0Ci0gICAgTERSICAgICBoZWlnaHQsIFtzcCwgIzB4ZmNdICAgICA7Ly8gaGVpZ2h0Ci0gICAgQUREICAgICB0bXA4LCBjaHJQVywgIzEgICAgICAgICA7Ly8gdG1wOCA9IGNocm9tYVBhcnRXaWR0aCsxCi0gICAgTU9WICAgICB0bXAyLCB0bXA4ICAgICAgICAgICAgICA7Ly8gdG1wMiA9IGNocm9tYVBhcnRXaWR0aCsxCi0gICAgU1RNSUEgICBzcCx7d2lkdGgsaGVpZ2h0LHRtcDgsY2hyUEgsdG1wMn0KLSAgICBBREQgICAgIGJsb2NrLCBzcCwgIzB4MWMgICAgICAgIDsvLyBibG9jawotICAgIEJMICAgICAgaDI2NGJzZEZpbGxCbG9jawotCi0gICAgTERSICAgICB4MCwgW3NwLCAjMHhjY10KLSAgICBMRFIgICAgIHkwLCBbc3AsICMweGQwXQotICAgIExEUiAgICAgcmVmLCBbc3AsICMweGM0XSAgICAgICAgOy8vIHJlZgotICAgIFNUTUlBICAgc3Ase3dpZHRoLGhlaWdodCx0bXA4LGNoclBILHRtcDJ9Ci0gICAgQUREICAgICBibG9jaywgc3AsICMweDFjICAgICAgICA7Ly8gYmxvY2sKLSAgICBNTEEgICAgIHJlZiwgaGVpZ2h0LCB3aWR0aCwgcmVmIDsvLyByZWYgKz0gd2lkdGggKiBoZWlnaHQ7IAotICAgIE1MQSAgICAgYmxvY2ssIGNoclBILCB0bXA4LCBibG9jazsvLyBibG9jayArIChjaHJvbWFQSCkqKGNocm9tYVBXKzEpCi0gICAgQkwgICAgICBoMjY0YnNkRmlsbEJsb2NrCi0KLSAgICBNT1YgICAgIHgwLCAjMCAgICAgICAgICAgICAgICAgIDsvLyB4MCA9IDAKLSAgICBNT1YgICAgIHkwLCAjMCAgICAgICAgICAgICAgICAgIDsvLyB5MCA9IDAKLSAgICBTVFIgICAgIHgwLCBbc3AsICMweGNjXQotICAgIFNUUiAgICAgeTAsIFtzcCwgIzB4ZDBdCi0gICAgQUREICAgICByZWYsIHNwLCAjMHgxYyAgICAgICAgICA7Ly8gcmVmID0gYmxvY2sKLSAgICBTVFIgICAgIHJlZiwgW3NwLCAjMHhjNF0gICAgICAgIDsvLyByZWYKLQotICAgIFNUUiAgICAgY2hyUEgsIFtzcCwgIzB4ZmNdICAgICAgOy8vIGhlaWdodAotICAgIFNUUiAgICAgdG1wOCwgW3NwLCAjMHhmOF0gICAgICAgOy8vIHdpZHRoCi0gICAgTU9WICAgICB3aWR0aCwgdG1wOAotICAgIFNVQiAgICAgY2hyUFcsIGNoclBXLCAjMQotCi1za2lwX2ZpbGwKLSAgICBNTEEgICAgIHRtcDMsIHkwLCB3aWR0aCwgeDAgICAgIDsvLyB0bXAzID0geTAqd2lkdGgreDAKLSAgICBMRFIgICAgIHhGcmFjLCBbc3AsICMweDEwMF0gICAgIDsvLyB4RnJhYwotICAgIEFERCAgICAgcHRyQSwgcmVmLCB0bXAzICAgICAgICAgOy8vIHB0ckEgPSByZWYgKyB5MCp3aWR0aCt4MAotICAgIFJTQiAgICAgdmFsWCwgeEZyYWMsICM4ICAgICAgICAgOy8vIHZhbFggPSA4LXhGcmFjCi0KLSAgICBMRFIgICAgIG1iLCBbc3AsICMweGM4XSAgICAgICAgIDsvLyBwcmVkUGFydENocm9tYQotCi0KLSAgICA7Ly8gcGFjayB2YWx1ZXMgdG8gY291bnQgcmVnaXN0ZXIKLSAgICA7Ly8gWzMxOjI4XSBsb29wX3ggKGNocm9tYVBhcnRXaWR0aC0xKQotICAgIDsvLyBbMjc6MjRdIGxvb3BfeSAoY2hyb21hUGFydEhlaWdodC0xKQotICAgIDsvLyBbMjM6MjBdIGNocm9tYVBhcnRXaWR0aC0xCi0gICAgOy8vIFsxOToxNl0gY2hyb21hUGFydEhlaWdodC0xCi0gICAgOy8vIFsxNTowMF0gbm90aGluZwotCi0gICAgU1VCICAgICB0bXAyLCBjaHJQSCwgIzEgICAgICAgICAgICAgOy8vIGNocm9tYVBhcnRIZWlnaHQtMQotICAgIFNVQiAgICAgdG1wMSwgY2hyUFcsICMxICAgICAgICAgICAgIDsvLyBjaHJvbWFQYXJ0V2lkdGgtMQotICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAyLCBMU0wgIzE2IDsvLyBjaHJvbWFQYXJ0SGVpZ2h0LTEKLSAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMiwgTFNMICMyNCA7Ly8gbG9vcF95Ci0gICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDEsIExTTCAjMjAgOy8vIGNocm9tYVBhcnRXaWR0aC0xCi0gICAgQU5EICAgICB0bXAyLCBjb3VudCwgIzB4MDBGMDAwMDAgICAgOy8vIGxvb3BfeAotICAgIFBLSEJUICAgdmFsWCwgdmFsWCwgeEZyYWMsIExTTCAjMTYgIDsvLyB8eEZyYWN8dmFsWCB8Ci0gICAgTU9WICAgICB2YWxYLCB2YWxYLCBMU0wgIzMgICAgICAgICAgOy8vIG11bHRpcGx5IGJ5IDggaW4gYWR2YW5jZQotICAgIE1PViAgICAgYzMyLCAjMzIKLQotCi0gICAgOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIDsvLyBDYgotICAgIDsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIDsvLyAyeDIgcGVscyBwZXIgaXRlcmF0aW9uCi0gICAgOy8vIGJpbGluZWFyIHZlcnRpY2FsIGludGVycG9sYXRpb24KLQotbG9vcDFfeQotICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAyLCBMU0wgIzgKLSAgICBMRFJCICAgIHRtcDEsIFtwdHJBLCB3aWR0aF0KLSAgICBMRFJCICAgIHRtcDIsIFtwdHJBXSwgIzEKLQotbG9vcDFfeAotICAgIExEUkIgICAgdG1wMywgW3B0ckEsIHdpZHRoXQotICAgIExEUkIgICAgdG1wNCwgW3B0ckFdLCAjMQotCi0gICAgUEtIQlQgICB0bXA1LCB0bXAxLCB0bXAzLCBMU0wgIzE2Ci0gICAgUEtIQlQgICB0bXA2LCB0bXAyLCB0bXA0LCBMU0wgIzE2Ci0KLSAgICBMRFJCICAgIHRtcDEsIFtwdHJBLCB3aWR0aF0KLSAgICBMRFJCICAgIHRtcDIsIFtwdHJBXSwgIzEKLQotICAgIFNNTEFEICAgdG1wNSwgdG1wNSwgdmFsWCwgYzMyICAgICAgIDsvLyBtdWx0aXBseQotICAgIFNNTEFEICAgdG1wNiwgdG1wNiwgdmFsWCwgYzMyICAgICAgIDsvLyBtdWx0aXBseQotCi0gICAgUEtIQlQgICB0bXA3LCB0bXAzLCB0bXAxLCBMU0wgIzE2Ci0gICAgUEtIQlQgICB0bXA4LCB0bXA0LCB0bXAyLCBMU0wgIzE2Ci0KLSAgICBTTUxBRCAgIHRtcDcsIHRtcDcsIHZhbFgsIGMzMiAgICAgICA7Ly8gbXVsdGlwbHkKLSAgICBTTUxBRCAgIHRtcDgsIHRtcDgsIHZhbFgsIGMzMiAgICAgICA7Ly8gbXVsdGlwbHkKLQotICAgIE1PViAgICAgdG1wNSwgdG1wNSwgTFNSICM2ICAgICAgICAgIDsvLyBzY2FsZSBkb3duCi0gICAgU1RSQiAgICB0bXA1LCBbbWIsIzhdICAgICAgICAgICAgICAgOy8vIHN0b3JlIHJvdyAyIGNvbCAxCi0KLSAgICBNT1YgICAgIHRtcDYsIHRtcDYsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgotICAgIFNUUkIgICAgdG1wNiwgW21iXSwjMSAgICAgICAgICAgICAgIDsvLyBzdG9yZSByb3cgMSBjb2wgMQotCi0gICAgTU9WICAgICB0bXA3LCB0bXA3LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KLSAgICBTVFJCICAgIHRtcDcsIFttYiwjOF0gICAgICAgICAgICAgICA7Ly8gc3RvcmUgcm93IDIgY29sIDIKLQotICAgIE1PViAgICAgdG1wOCwgdG1wOCwgTFNSICM2ICAgICAgICAgIDsvLyBzY2FsZSBkb3duCi0gICAgU1RSQiAgICB0bXA4LCBbbWJdLCMxICAgICAgICAgICAgICAgOy8vIHN0b3JlIHJvdyAxIGNvbCAyCi0KLSAgICBTVUJTICAgIGNvdW50LCBjb3VudCwgIzI8PDI4Ci0gICAgQkNTICAgICBsb29wMV94Ci0KLSAgICBBTkQgICAgIHRtcDIsIGNvdW50LCAjMHgwMEYwMDAwMAotCi0gICAgQUREUyAgICBtYiwgbWIsICMxNgotICAgIFNCQyAgICAgbWIsIG1iLCB0bXAyLCBMU1IgIzIwCi0gICAgQUREICAgICBwdHJBLCBwdHJBLCB3aWR0aCwgTFNMICMxCi0gICAgU0JDICAgICBwdHJBLCBwdHJBLCB0bXAyLCBMU1IgIzIwCi0gICAgU1VCICAgICBwdHJBLCBwdHJBLCAjMQotCi0gICAgQUREUyAgICBjb3VudCwgY291bnQsICMweEUgPDwgMjQKLSAgICBCR0UgICAgIGxvb3AxX3kKLQotICAgIDsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICA7Ly8gQ3IKLSAgICA7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgTERSICAgICBoZWlnaHQsIFtzcCwjMHhmY10gICAgICAgICAgOy8vIGhlaWdodAotICAgIExEUiAgICAgcmVmLCBbc3AsICMweGM0XSAgICAgICAgICAgIDsvLyByZWYKLSAgICBMRFIgICAgIHRtcDEsIFtzcCwgIzB4ZDBdICAgICAgICAgICA7Ly8geTAKLSAgICBMRFIgICAgIHRtcDIsIFtzcCwgIzB4Y2NdICAgICAgICAgICA7Ly8geDAKLSAgICBMRFIgICAgIG1iLCBbc3AsICMweGM4XSAgICAgICAgICAgICA7Ly8gcHJlZFBhcnRDaHJvbWEKLQotICAgIEFERCAgICAgdG1wMSwgaGVpZ2h0LCB0bXAxCi0gICAgTUxBICAgICB0bXAzLCB0bXAxLCB3aWR0aCwgdG1wMgotICAgIEFERCAgICAgcHRyQSwgcmVmLCB0bXAzCi0gICAgQUREICAgICBtYiwgbWIsICM2NAotCi0gICAgQU5EICAgICBjb3VudCwgY291bnQsICMweDAwRkZGRkZGCi0gICAgQU5EICAgICB0bXAxLCBjb3VudCwgIzB4MDAwRjAwMDAKLSAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMSwgTFNMICM4Ci0gICAgQU5EICAgICB0bXAyLCBjb3VudCwgIzB4MDBGMDAwMDAKLQotICAgIDsvLyAyeDIgcGVscyBwZXIgaXRlcmF0aW9uCi0gICAgOy8vIGJpbGluZWFyIHZlcnRpY2FsIGludGVycG9sYXRpb24KLWxvb3AyX3kKLSAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMiwgTFNMICM4Ci0gICAgTERSQiAgICB0bXAxLCBbcHRyQSwgd2lkdGhdCi0gICAgTERSQiAgICB0bXAyLCBbcHRyQV0sICMxCi0KLWxvb3AyX3gKLSAgICBMRFJCICAgIHRtcDMsIFtwdHJBLCB3aWR0aF0KLSAgICBMRFJCICAgIHRtcDQsIFtwdHJBXSwgIzEKLQotICAgIFBLSEJUICAgdG1wNSwgdG1wMSwgdG1wMywgTFNMICMxNgotICAgIFBLSEJUICAgdG1wNiwgdG1wMiwgdG1wNCwgTFNMICMxNgotCi0gICAgTERSQiAgICB0bXAxLCBbcHRyQSwgd2lkdGhdCi0gICAgTERSQiAgICB0bXAyLCBbcHRyQV0sICMxCi0KLSAgICBTTUxBRCAgIHRtcDUsIHRtcDUsIHZhbFgsIGMzMiAgICAgICA7Ly8gbXVsdGlwbHkKLSAgICBTTUxBRCAgIHRtcDYsIHRtcDYsIHZhbFgsIGMzMiAgICAgICA7Ly8gbXVsdGlwbHkKLQotICAgIFBLSEJUICAgdG1wNywgdG1wMywgdG1wMSwgTFNMICMxNgotICAgIFBLSEJUICAgdG1wOCwgdG1wNCwgdG1wMiwgTFNMICMxNgotCi0gICAgU01MQUQgICB0bXA3LCB0bXA3LCB2YWxYLCBjMzIgICAgICAgOy8vIG11bHRpcGx5Ci0gICAgU01MQUQgICB0bXA4LCB0bXA4LCB2YWxYLCBjMzIgICAgICAgOy8vIG11bHRpcGx5Ci0KLSAgICBNT1YgICAgIHRtcDUsIHRtcDUsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgotICAgIFNUUkIgICAgdG1wNSwgW21iLCM4XSAgICAgICAgICAgICAgIDsvLyBzdG9yZSByb3cgMiBjb2wgMQotCi0gICAgTU9WICAgICB0bXA2LCB0bXA2LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KLSAgICBTVFJCICAgIHRtcDYsIFttYl0sIzEgICAgICAgICAgICAgICA7Ly8gc3RvcmUgcm93IDEgY29sIDEKLQotICAgIE1PViAgICAgdG1wNywgdG1wNywgTFNSICM2ICAgICAgICAgIDsvLyBzY2FsZSBkb3duCi0gICAgU1RSQiAgICB0bXA3LCBbbWIsIzhdICAgICAgICAgICAgICAgOy8vIHN0b3JlIHJvdyAyIGNvbCAyCi0KLSAgICBNT1YgICAgIHRtcDgsIHRtcDgsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgotICAgIFNUUkIgICAgdG1wOCwgW21iXSwjMSAgICAgICAgICAgICAgIDsvLyBzdG9yZSByb3cgMSBjb2wgMgotCi0gICAgU1VCUyAgICBjb3VudCwgY291bnQsICMyPDwyOAotICAgIEJDUyAgICAgbG9vcDJfeAotCi0gICAgQU5EICAgICB0bXAyLCBjb3VudCwgIzB4MDBGMDAwMDAKLQotICAgIEFERFMgICAgbWIsIG1iLCAjMTYKLSAgICBTQkMgICAgIG1iLCBtYiwgdG1wMiwgTFNSICMyMAotICAgIEFERCAgICAgcHRyQSwgcHRyQSwgd2lkdGgsIExTTCAjMQotICAgIFNCQyAgICAgcHRyQSwgcHRyQSwgdG1wMiwgTFNSICMyMAotICAgIFNVQiAgICAgcHRyQSwgcHRyQSwgIzEKLQotICAgIEFERFMgICAgY291bnQsIGNvdW50LCAjMHhFIDw8IDI0Ci0gICAgQkdFICAgICBsb29wMl95Ci0KLSAgICBBREQgICAgIHNwLHNwLCMweGQ0Ci0gICAgTERNRkQgICBzcCEsIHtyNC1yMTEscGN9Ci0KLSAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfY2hyb21hX2hvcl92ZXIucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfY2hyb21hX2hvcl92ZXIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQyMGFkMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX2Nocm9tYV9ob3JfdmVyLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzkgKzAsMCBAQAotOyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotOwotOyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsKLTsgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsKLTsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTstLQotOy0tIEFic3RyYWN0IDogQVJNdjYgb3B0aW1pemVkIHZlcnNpb24gb2YgaDI2NGJzZEludGVycG9sYXRlQ2hyb21hSG9yVmVyIAotOy0tICAgICAgICAgICAgZnVuY3Rpb24KLTstLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi0gICAgSUYgIDpERUY6IEgyNjRERUNfV0lOQVNNCi0gICAgICAgIDsvLyBXZSBkb250IHVzZSBSRVFVSVJFOCBhbmQgUFJFU0VSVkU4IGZvciB3aW5hc20KLSAgICBFTFNFCi0gICAgICAgIFJFUVVJUkU4Ci0gICAgICAgIFBSRVNFUlZFOAotICAgIEVORElGCi0KLSAgICBBUkVBICAgIHwudGV4dHwsIENPREUKLQotCi07Ly8gaDI2NGJzZEludGVycG9sYXRlQ2hyb21hSG9yVmVyIHJlZ2lzdGVyIGFsbG9jYXRpb24KLQotcmVmICAgICBSTiAwCi1wdHJBICAgIFJOIDAKLQotbWIgICAgICBSTiAxCi1ibG9jayAgIFJOIDEKLQoteDAgICAgICBSTiAyCi1jb3VudCAgIFJOIDIKLQoteTAgICAgICBSTiAzCi12YWxZICAgIFJOIDMKLQotd2lkdGggICBSTiA0Ci0KLXRtcDQgICAgUk4gNQotaGVpZ2h0ICBSTiA1Ci0KLXRtcDEgICAgUk4gNgotCi10bXAyICAgIFJOIDcKLQotdG1wMyAgICBSTiA4Ci0KLXZhbFggICAgUk4gOQotCi10bXA1ICAgIFJOIDEwCi1jaHJQVyAgIFJOIDEwCi0KLXRtcDYgICAgUk4gMTEKLWNoclBIICAgUk4gMTEKLQoteEZyYWMgICBSTiAxMgotCi1jMzIgICAgIFJOIDE0Ci15RnJhYyAgIFJOIDE0Ci0KLTsvLyBmdW5jdGlvbiBleHBvcnRzIGFuZCBpbXBvcnRzCi0KLSAgICBJTVBPUlQgIGgyNjRic2RGaWxsQmxvY2sKLQotICAgIEVYUE9SVCAgaDI2NGJzZEludGVycG9sYXRlQ2hyb21hSG9yVmVyCi0KLTsvLyAgRnVuY3Rpb24gYXJndW1lbnRzCi07Ly8KLTsvLyAgdTggKnJlZiwgICAgICAgICAgICAgICAgICAgOiAweGM0Ci07Ly8gIHU4ICpwcmVkUGFydENocm9tYSwgICAgICAgIDogMHhjOAotOy8vICBpMzIgeDAsICAgICAgICAgICAgICAgICAgICA6IDB4Y2MKLTsvLyAgaTMyIHkwLCAgICAgICAgICAgICAgICAgICAgOiAweGQwCi07Ly8gIHUzMiB3aWR0aCwgICAgICAgICAgICAgICAgIDogMHhmOAotOy8vICB1MzIgaGVpZ2h0LCAgICAgICAgICAgICAgICA6IDB4ZmMKLTsvLyAgdTMyIHhGcmFjLCAgICAgICAgICAgICAgICAgOiAweDEwMAotOy8vICB1MzIgeUZyYWMsICAgICAgICAgICAgICAgICA6IDB4MTA0Ci07Ly8gIHUzMiBjaHJvbWFQYXJ0V2lkdGgsICAgICAgIDogMHgxMDgKLTsvLyAgdTMyIGNocm9tYVBhcnRIZWlnaHQgICAgICAgOiAweDEwYwotCi1oMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFIb3JWZXIKLSAgICBTVE1GRCAgIHNwISwge3IwLXIxMSxscn0KLSAgICBTVUIgICAgIHNwLCBzcCwgIzB4YzQKLQotICAgIExEUiAgICAgY2hyUFcsIFtzcCwgIzB4MTA4XSAgICAgOy8vIGNocm9tYVBhcnRXaWR0aAotICAgIExEUiAgICAgeEZyYWMsIFtzcCwgIzB4MTAwXSAgICAgOy8vIHhGcmFjCi0gICAgTERSICAgICB3aWR0aCwgW3NwLCAjMHhmOF0gICAgICA7Ly8gd2lkdGgKLSAgICBDTVAgICAgIHgwLCAjMAotICAgIEJMVCAgICAgZG9fZmlsbAotCi0gICAgQUREICAgICB0bXAxLCB4MCwgY2hyUFcgICAgICAgICA7Ly8gdG1wMSA9IHgwKyBjaHJvbWFQYXJ0V2lkdGgKLSAgICBBREQgICAgIHRtcDEsIHRtcDEsICMxICAgICAgICAgIDsvLyB0bXAxID0geDArIGNocm9tYVBhcnRXaWR0aCsxCi0gICAgQ01QICAgICB0bXAxLCB3aWR0aCAgICAgICAgICAgICA7Ly8geDArY2hyb21hUGFydFdpZHRoKzEgPiB3aWR0aAotICAgIEJISSAgICAgZG9fZmlsbAotCi0gICAgQ01QICAgICB5MCwgIzAKLSAgICBCTFQgICAgIGRvX2ZpbGwKLSAgICBMRFIgICAgIGNoclBILCBbc3AsICMweDEwY10gICAgIDsvLyBjaHJvbWFQYXJ0SGVpZ2h0Ci0gICAgTERSICAgICBoZWlnaHQsIFtzcCwgIzB4ZmNdICAgICA7Ly8gaGVpZ2h0Ci0gICAgQUREICAgICB0bXAxLCB5MCwgY2hyUEggICAgICAgICA7Ly8gdG1wMSA9IHkwICsgY2hyb21hUGFydEhlaWdodAotICAgIEFERCAgICAgdG1wMSwgdG1wMSwgIzEgICAgICAgICAgOy8vIHRtcDEgPSB5MCArIGNocm9tYVBhcnRIZWlnaHQgKyAxCi0gICAgQ01QICAgICB0bXAxLCBoZWlnaHQKLSAgICBCTFMgICAgIHNraXBfZmlsbAotCi1kb19maWxsCi0gICAgTERSICAgICBjaHJQSCwgW3NwLCAjMHgxMGNdICAgICA7Ly8gY2hyb21hUGFydEhlaWdodAotICAgIExEUiAgICAgaGVpZ2h0LCBbc3AsICMweGZjXSAgICAgOy8vIGhlaWdodAotICAgIEFERCAgICAgdG1wMywgY2hyUFcsICMxICAgICAgICAgOy8vIHRtcDMgPSBjaHJvbWFQYXJ0V2lkdGgrMQotICAgIEFERCAgICAgdG1wMSwgY2hyUFcsICMxICAgICAgICAgOy8vIHRtcDEgPSBjaHJvbWFQYXJ0V2lkdGgrMQotICAgIEFERCAgICAgdG1wMiwgY2hyUEgsICMxICAgICAgICAgOy8vIHRtcDIgPSBjaHJvbWFQYXJ0SGVpZ2h0KzEKLSAgICBTVE1JQSAgIHNwLHt3aWR0aCxoZWlnaHQsdG1wMSx0bXAyLHRtcDN9Ci0gICAgQUREICAgICBibG9jaywgc3AsICMweDFjICAgICAgICA7Ly8gYmxvY2sKLSAgICBCTCAgICAgIGgyNjRic2RGaWxsQmxvY2sKLQotICAgIExEUiAgICAgeDAsIFtzcCwgIzB4Y2NdCi0gICAgTERSICAgICB5MCwgW3NwLCAjMHhkMF0KLSAgICBMRFIgICAgIHJlZiwgW3NwLCAjMHhjNF0gICAgICAgIDsvLyByZWYKLSAgICBTVE1JQSAgIHNwLHt3aWR0aCxoZWlnaHQsdG1wMSx0bXAyLHRtcDN9Ci0gICAgQUREICAgICBibG9jaywgc3AsICMweDFjICAgICAgICA7Ly8gYmxvY2sKLSAgICBNTEEgICAgIHJlZiwgaGVpZ2h0LCB3aWR0aCwgcmVmIDsvLyByZWYgKz0gd2lkdGggKiBoZWlnaHQ7IAotICAgIE1MQSAgICAgYmxvY2ssIHRtcDIsIHRtcDEsIGJsb2NrOy8vIGJsb2NrICsgKGNocm9tYVBXKzEpKihjaHJvbWFQSCsxKQotICAgIEJMICAgICAgaDI2NGJzZEZpbGxCbG9jawotCi0gICAgTU9WICAgICB4MCwgIzAgICAgICAgICAgICAgICAgICA7Ly8geDAgPSAwCi0gICAgTU9WICAgICB5MCwgIzAgICAgICAgICAgICAgICAgICA7Ly8geTAgPSAwCi0gICAgU1RSICAgICB4MCwgW3NwLCAjMHhjY10KLSAgICBTVFIgICAgIHkwLCBbc3AsICMweGQwXQotICAgIEFERCAgICAgcmVmLCBzcCwgIzB4MWMgICAgICAgICAgOy8vIHJlZiA9IGJsb2NrCi0gICAgU1RSICAgICByZWYsIFtzcCwgIzB4YzRdICAgICAgICA7Ly8gcmVmCi0KLSAgICBTVFIgICAgIHRtcDIsIFtzcCwgIzB4ZmNdICAgICAgIDsvLyBoZWlnaHQKLSAgICBTVFIgICAgIHRtcDEsIFtzcCwgIzB4ZjhdICAgICAgIDsvLyB3aWR0aAotICAgIE1PViAgICAgd2lkdGgsIHRtcDEKLQotc2tpcF9maWxsCi0gICAgTUxBICAgICB0bXAzLCB5MCwgd2lkdGgsIHgwICAgICA7Ly8gdG1wMyA9IHkwKndpZHRoK3gwCi0gICAgTERSICAgICB5RnJhYywgW3NwLCAjMHgxMDRdICAgICA7Ly8geUZyYWMKLSAgICBMRFIgICAgIHhGcmFjLCBbc3AsICMweDEwMF0KLSAgICBBREQgICAgIHB0ckEsIHJlZiwgdG1wMyAgICAgICAgIDsvLyBwdHJBID0gcmVmICsgeTAqd2lkdGgreDAKLSAgICBSU0IgICAgIHZhbFgsIHhGcmFjLCAjOCAgICAgICAgIDsvLyB2YWxYID0gOC14RnJhYwotICAgIFJTQiAgICAgdmFsWSwgeUZyYWMsICM4ICAgICAgICAgOy8vIHZhbFkgPSA4LXlGcmFjCi0KLSAgICBMRFIgICAgIG1iLCBbc3AsICMweGM4XSAgICAgICAgIDsvLyBwcmVkUGFydENocm9tYQotCi0KLSAgICA7Ly8gcGFjayB2YWx1ZXMgdG8gY291bnQgcmVnaXN0ZXIKLSAgICA7Ly8gWzMxOjI4XSBsb29wX3ggKGNocm9tYVBhcnRXaWR0aC0xKQotICAgIDsvLyBbMjc6MjRdIGxvb3BfeSAoY2hyb21hUGFydEhlaWdodC0xKQotICAgIDsvLyBbMjM6MjBdIGNocm9tYVBhcnRXaWR0aC0xCi0gICAgOy8vIFsxOToxNl0gY2hyb21hUGFydEhlaWdodC0xCi0gICAgOy8vIFsxNTowMF0gbm90aGluZwotCi0gICAgU1VCICAgICB0bXAyLCBjaHJQSCwgIzEgICAgICAgICAgICAgOy8vIGNocm9tYVBhcnRIZWlnaHQtMQotICAgIFNVQiAgICAgdG1wMSwgY2hyUFcsICMxICAgICAgICAgICAgIDsvLyBjaHJvbWFQYXJ0V2lkdGgtMQotICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAyLCBMU0wgIzE2IDsvLyBjaHJvbWFQYXJ0SGVpZ2h0LTEKLSAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMiwgTFNMICMyNCA7Ly8gbG9vcF95Ci0gICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDEsIExTTCAjMjAgOy8vIGNocm9tYVBhcnRXaWR0aC0xCi0gICAgQU5EICAgICB0bXAyLCBjb3VudCwgIzB4MDBGMDAwMDAgICAgOy8vIGxvb3BfeAotICAgIFBLSEJUICAgdmFsWSwgdmFsWSwgeUZyYWMsIExTTCAjMTYgIDsvLyB8eUZyYWN8dmFsWSB8Ci0gICAgTU9WICAgICBjMzIsICMzMgotCi0KLSAgICA7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgOy8vIENiCi0gICAgOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgOy8vIDJ4MiBwZWxzIHBlciBpdGVyYXRpb24KLSAgICA7Ly8gYmlsaW5lYXIgdmVydGljYWwgYW5kIGhvcml6b250YWwgaW50ZXJwb2xhdGlvbgotCi1sb29wMV95Ci0gICAgTERSQiAgICB0bXAxLCBbcHRyQV0KLSAgICBMRFJCICAgIHRtcDMsIFtwdHJBLCB3aWR0aF0KLSAgICBMRFJCICAgIHRtcDUsIFtwdHJBLCB3aWR0aCwgTFNMICMxXQotCi0gICAgUEtIQlQgICB0bXAxLCB0bXAxLCB0bXAzLCBMU0wgIzE2ICAgOy8vIHx0M3x0MXwKLSAgICBQS0hCVCAgIHRtcDMsIHRtcDMsIHRtcDUsIExTTCAjMTYgICA7Ly8gfHQ1fHQzfAotCi0gICAgU01VQUQgICB0bXAxLCB0bXAxLCB2YWxZICAgICAgICAgICAgOy8vIHQxPSh0MSp2YWxZICsgdDMqeUZyYWMpCi0gICAgU01VQUQgICB0bXAzLCB0bXAzLCB2YWxZICAgICAgICAgICAgOy8vIHQzPSh0Myp2YWxZICsgdDUqeUZyYWMpCi0KLSAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMiwgTFNMICM4Ci1sb29wMV94Ci0gICAgOy8vIGZpcnN0Ci0gICAgTERSQiAgICB0bXAyLCBbcHRyQSwgIzFdIQotICAgIExEUkIgICAgdG1wNCwgW3B0ckEsIHdpZHRoXQotICAgIExEUkIgICAgdG1wNiwgW3B0ckEsIHdpZHRoLCBMU0wgIzFdCi0KLSAgICBQS0hCVCAgIHRtcDIsIHRtcDIsIHRtcDQsIExTTCAjMTYgICA7Ly8gfHQ0fHQyfAotICAgIFBLSEJUICAgdG1wNCwgdG1wNCwgdG1wNiwgTFNMICMxNiAgIDsvLyB8dDZ8dDR8Ci0KLSAgICBTTVVBRCAgIHRtcDIsIHRtcDIsIHZhbFkgICAgICAgICAgICA7Ly8gdDI9KHQyKnZhbFkgKyB0NCp5RnJhYykKLSAgICBNTEEgICAgIHRtcDUsIHRtcDEsIHZhbFgsIGMzMiAgICAgICA7Ly8gdDU9dDEqdmFsWCszMgotICAgIE1MQSAgICAgdG1wNSwgdG1wMiwgeEZyYWMsIHRtcDUgICAgIDsvLyB0NT10Mip4RnJhYyt0NQotCi0gICAgU01VQUQgICB0bXA0LCB0bXA0LCB2YWxZICAgICAgICAgICAgOy8vIHQ0PSh0NCp2YWxZICsgdDYqeUZyYWMpCi0gICAgTUxBICAgICB0bXA2LCB0bXAzLCB2YWxYLCBjMzIgICAgICAgOy8vIHQzPXQzKnZhbFgrMzIKLSAgICBNTEEgICAgIHRtcDYsIHRtcDQsIHhGcmFjLCB0bXA2ICAgICA7Ly8gdDY9dDQqeEZyYWMrdDYKLQotICAgIE1PViAgICAgdG1wNiwgdG1wNiwgTFNSICM2ICAgICAgICAgIDsvLyBzY2FsZSBkb3duCi0gICAgU1RSQiAgICB0bXA2LCBbbWIsICM4XSAgICAgICAgICAgICAgOy8vIHN0b3JlIHBpeGVsCi0gICAgTU9WICAgICB0bXA1LCB0bXA1LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KLSAgICBTVFJCICAgIHRtcDUsIFttYl0sICMxICAgICAgICAgICAgICA7Ly8gc3RvcmUgcGl4ZWwKLQotICAgIDsvLyBzZWNvbmQKLSAgICBMRFJCICAgIHRtcDEsIFtwdHJBLCAjMV0hCi0gICAgTERSQiAgICB0bXAzLCBbcHRyQSwgd2lkdGhdCi0gICAgTERSQiAgICB0bXA1LCBbcHRyQSwgd2lkdGgsIExTTCAjMV0KLQotICAgIFBLSEJUICAgdG1wMSwgdG1wMSwgdG1wMywgTFNMICMxNiAgIDsvLyB8dDN8dDF8Ci0gICAgUEtIQlQgICB0bXAzLCB0bXAzLCB0bXA1LCBMU0wgIzE2ICAgOy8vIHx0NXx0M3wKLQotICAgIFNNVUFEICAgdG1wMSwgdG1wMSwgdmFsWSAgICAgICAgICAgIDsvLyB0MT0odDEqdmFsWSArIHQzKnlGcmFjKQotICAgIE1MQSAgICAgdG1wNSwgdG1wMSwgeEZyYWMsIGMzMiAgICAgIDsvLyB0MT10MSp4RnJhYyszMgotICAgIE1MQSAgICAgdG1wNSwgdG1wMiwgdmFsWCwgdG1wNSAgICAgIDsvLyB0NT10Mip2YWxYK3Q1Ci0KLSAgICBTTVVBRCAgIHRtcDMsIHRtcDMsIHZhbFkgICAgICAgICAgICA7Ly8gdDM9KHQzKnZhbFkgKyB0NSp5RnJhYykKLSAgICBNTEEgICAgIHRtcDYsIHRtcDMsIHhGcmFjLCBjMzIgICAgICA7Ly8gdDM9dDMqeEZyYWMrMzIKLSAgICBNTEEgICAgIHRtcDYsIHRtcDQsIHZhbFgsIHRtcDYgICAgICA7Ly8gdDY9dDQqdmFsWCt0NgotCi0gICAgTU9WICAgICB0bXA2LCB0bXA2LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KLSAgICBTVFJCICAgIHRtcDYsIFttYiwgIzhdICAgICAgICAgICAgICA7Ly8gc3RvcmUgcGl4ZWwKLSAgICBNT1YgICAgIHRtcDUsIHRtcDUsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgotICAgIFNUUkIgICAgdG1wNSwgW21iXSwgIzEgICAgICAgICAgICAgIDsvLyBzdG9yZSBwaXhlbAotCi0gICAgU1VCUyAgICBjb3VudCwgY291bnQsICMyPDwyOAotICAgIEJDUyAgICAgbG9vcDFfeAotCi0gICAgQU5EICAgICB0bXAyLCBjb3VudCwgIzB4MDBGMDAwMDAKLQotICAgIEFERFMgICAgbWIsIG1iLCAjMTYKLSAgICBTQkMgICAgIG1iLCBtYiwgdG1wMiwgTFNSICMyMAotICAgIEFERCAgICAgcHRyQSwgcHRyQSwgd2lkdGgsIExTTCAjMQotICAgIFNCQyAgICAgcHRyQSwgcHRyQSwgdG1wMiwgTFNSICMyMAotCi0gICAgQUREUyAgICBjb3VudCwgY291bnQsICMweEUgPDwgMjQKLSAgICBCR0UgICAgIGxvb3AxX3kKLQotICAgIDsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICA7Ly8gQ3IKLSAgICA7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgTERSICAgICBoZWlnaHQsIFtzcCwjMHhmY10gICAgICAgICAgOy8vIGhlaWdodAotICAgIExEUiAgICAgcmVmLCBbc3AsICMweGM0XSAgICAgICAgICAgIDsvLyByZWYKLSAgICBMRFIgICAgIHRtcDEsIFtzcCwgIzB4ZDBdICAgICAgICAgICA7Ly8geTAKLSAgICBMRFIgICAgIHRtcDIsIFtzcCwgIzB4Y2NdICAgICAgICAgICA7Ly8geDAKLSAgICBMRFIgICAgIG1iLCBbc3AsICMweGM4XSAgICAgICAgICAgICA7Ly8gcHJlZFBhcnRDaHJvbWEKLQotICAgIEFERCAgICAgdG1wMSwgaGVpZ2h0LCB0bXAxCi0gICAgTUxBICAgICB0bXAzLCB0bXAxLCB3aWR0aCwgdG1wMgotICAgIEFERCAgICAgcHRyQSwgcmVmLCB0bXAzCi0gICAgQUREICAgICBtYiwgbWIsICM2NAotCi0gICAgQU5EICAgICBjb3VudCwgY291bnQsICMweDAwRkZGRkZGCi0gICAgQU5EICAgICB0bXAxLCBjb3VudCwgIzB4MDAwRjAwMDAKLSAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMSwgTFNMICM4Ci0gICAgQU5EICAgICB0bXAyLCBjb3VudCwgIzB4MDBGMDAwMDAKLQotICAgIDsvLyAyeDIgcGVscyBwZXIgaXRlcmF0aW9uCi0gICAgOy8vIGJpbGluZWFyIHZlcnRpY2FsIGFuZCBob3Jpem9udGFsIGludGVycG9sYXRpb24KLWxvb3AyX3kKLSAgICBMRFJCICAgIHRtcDEsIFtwdHJBXQotICAgIExEUkIgICAgdG1wMywgW3B0ckEsIHdpZHRoXQotICAgIExEUkIgICAgdG1wNSwgW3B0ckEsIHdpZHRoLCBMU0wgIzFdCi0KLSAgICBQS0hCVCAgIHRtcDEsIHRtcDEsIHRtcDMsIExTTCAjMTYgICA7Ly8gfHQzfHQxfAotICAgIFBLSEJUICAgdG1wMywgdG1wMywgdG1wNSwgTFNMICMxNiAgIDsvLyB8dDV8dDN8Ci0KLSAgICBTTVVBRCAgIHRtcDEsIHRtcDEsIHZhbFkgICAgICAgICAgICA7Ly8gdDE9KHQxKnZhbFkgKyB0Myp5RnJhYykKLSAgICBTTVVBRCAgIHRtcDMsIHRtcDMsIHZhbFkgICAgICAgICAgICA7Ly8gdDM9KHQzKnZhbFkgKyB0NSp5RnJhYykKLQotICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAyLCBMU0wgIzgKLWxvb3AyX3gKLSAgICA7Ly8gZmlyc3QKLSAgICBMRFJCICAgIHRtcDIsIFtwdHJBLCAjMV0hCi0gICAgTERSQiAgICB0bXA0LCBbcHRyQSwgd2lkdGhdCi0gICAgTERSQiAgICB0bXA2LCBbcHRyQSwgd2lkdGgsIExTTCAjMV0KLQotICAgIFBLSEJUICAgdG1wMiwgdG1wMiwgdG1wNCwgTFNMICMxNiAgIDsvLyB8dDR8dDJ8Ci0gICAgUEtIQlQgICB0bXA0LCB0bXA0LCB0bXA2LCBMU0wgIzE2ICAgOy8vIHx0Nnx0NHwKLQotICAgIFNNVUFEICAgdG1wMiwgdG1wMiwgdmFsWSAgICAgICAgICAgIDsvLyB0Mj0odDIqdmFsWSArIHQ0KnlGcmFjKQotICAgIE1MQSAgICAgdG1wNSwgdG1wMSwgdmFsWCwgYzMyICAgICAgIDsvLyB0NT10MSp2YWxYKzMyCi0gICAgTUxBICAgICB0bXA1LCB0bXAyLCB4RnJhYywgdG1wNSAgICAgOy8vIHQ1PXQyKnhGcmFjK3Q1Ci0KLSAgICBTTVVBRCAgIHRtcDQsIHRtcDQsIHZhbFkgICAgICAgICAgICA7Ly8gdDQ9KHQ0KnZhbFkgKyB0Nip5RnJhYykKLSAgICBNTEEgICAgIHRtcDYsIHRtcDMsIHZhbFgsIGMzMiAgICAgICA7Ly8gdDM9dDMqdmFsWCszMgotICAgIE1MQSAgICAgdG1wNiwgdG1wNCwgeEZyYWMsIHRtcDYgICAgIDsvLyB0Nj10NCp4RnJhYyt0NgotCi0gICAgTU9WICAgICB0bXA2LCB0bXA2LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KLSAgICBTVFJCICAgIHRtcDYsIFttYiwgIzhdICAgICAgICAgICAgICA7Ly8gc3RvcmUgcGl4ZWwKLSAgICBNT1YgICAgIHRtcDUsIHRtcDUsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgotICAgIFNUUkIgICAgdG1wNSwgW21iXSwgIzEgICAgICAgICAgICAgIDsvLyBzdG9yZSBwaXhlbAotCi0gICAgOy8vIHNlY29uZCAKLSAgICBMRFJCICAgIHRtcDEsIFtwdHJBLCAjMV0hCi0gICAgTERSQiAgICB0bXAzLCBbcHRyQSwgd2lkdGhdCi0gICAgTERSQiAgICB0bXA1LCBbcHRyQSwgd2lkdGgsIExTTCAjMV0KLQotICAgIFBLSEJUICAgdG1wMSwgdG1wMSwgdG1wMywgTFNMICMxNiAgIDsvLyB8dDN8dDF8Ci0gICAgUEtIQlQgICB0bXAzLCB0bXAzLCB0bXA1LCBMU0wgIzE2ICAgOy8vIHx0NXx0M3wKLQotICAgIFNNVUFEICAgdG1wMSwgdG1wMSwgdmFsWSAgICAgICAgICAgIDsvLyB0MT0odDEqdmFsWSArIHQzKnlGcmFjKQotICAgIE1MQSAgICAgdG1wNSwgdG1wMSwgeEZyYWMsIGMzMiAgICAgIDsvLyB0MT10MSp4RnJhYyszMgotICAgIE1MQSAgICAgdG1wNSwgdG1wMiwgdmFsWCwgdG1wNSAgICAgIDsvLyB0NT10Mip2YWxYK3Q1Ci0KLSAgICBTTVVBRCAgIHRtcDMsIHRtcDMsIHZhbFkgICAgICAgICAgICA7Ly8gdDM9KHQzKnZhbFkgKyB0NSp5RnJhYykKLSAgICBNTEEgICAgIHRtcDYsIHRtcDMsIHhGcmFjLCBjMzIgICAgICA7Ly8gdDM9dDMqeEZyYWMrMzIKLSAgICBNTEEgICAgIHRtcDYsIHRtcDQsIHZhbFgsIHRtcDYgICAgICA7Ly8gdDY9dDQqdmFsWCt0NgotCi0gICAgTU9WICAgICB0bXA2LCB0bXA2LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KLSAgICBTVFJCICAgIHRtcDYsIFttYiwgIzhdICAgICAgICAgICAgICA7Ly8gc3RvcmUgcGl4ZWwKLSAgICBNT1YgICAgIHRtcDUsIHRtcDUsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgotICAgIFNUUkIgICAgdG1wNSwgW21iXSwgIzEgICAgICAgICAgICAgIDsvLyBzdG9yZSBwaXhlbAotCi0gICAgU1VCUyAgICBjb3VudCwgY291bnQsICMyPDwyOAotICAgIEJDUyAgICAgbG9vcDJfeAotCi0gICAgQU5EICAgICB0bXAyLCBjb3VudCwgIzB4MDBGMDAwMDAKLQotICAgIEFERFMgICAgbWIsIG1iLCAjMTYKLSAgICBTQkMgICAgIG1iLCBtYiwgdG1wMiwgTFNSICMyMAotICAgIEFERCAgICAgcHRyQSwgcHRyQSwgd2lkdGgsIExTTCAjMQotICAgIFNCQyAgICAgcHRyQSwgcHRyQSwgdG1wMiwgTFNSICMyMAotCi0gICAgQUREUyAgICBjb3VudCwgY291bnQsICMweEUgPDwgMjQKLSAgICBCR0UgICAgIGxvb3AyX3kKLQotICAgIEFERCAgICAgc3Asc3AsIzB4ZDQKLSAgICBMRE1GRCAgIHNwISx7cjQtcjExLHBjfQotCi0gICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX2Nocm9tYV92ZXIucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfY2hyb21hX3Zlci5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjlkZjFiLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfY2hyb21hX3Zlci5zCisrKyAvZGV2L251bGwKQEAgLTEsMjg4ICswLDAgQEAKLTsgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLTsKLTsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ci07ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ci07IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07LS0KLTstLSBBYnN0cmFjdCA6IEFSTXY2IG9wdGltaXplZCB2ZXJzaW9uIG9mIGgyNjRic2RJbnRlcnBvbGF0ZUNocm9tYVZlciBmdW5jdGlvbgotOy0tCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLSAgICBJRiA6REVGOiBIMjY0REVDX1dJTkFTTQotICAgICAgICA7Ly8gV2UgZG9udCB1c2UgUkVRVUlSRTggYW5kIFBSRVNFUlZFOCBmb3Igd2luYXNtCi0gICAgRUxTRQotICAgICAgICBSRVFVSVJFOAotICAgICAgICBQUkVTRVJWRTgKLSAgICBFTkRJRgotCi0gICAgQVJFQSAgICB8LnRleHR8LCBDT0RFCi0KLTsvLyBoMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFWZXIgcmVnaXN0ZXIgYWxsb2NhdGlvbgotCi1yZWYgICAgIFJOIDAKLXB0ckEgICAgUk4gMAotCi1tYiAgICAgIFJOIDEKLWJsb2NrICAgUk4gMQotCi14MCAgICAgIFJOIDIKLWNvdW50ICAgUk4gMgotCi15MCAgICAgIFJOIDMKLXZhbFkgICAgUk4gMwotCi13aWR0aCAgIFJOIDQKLQotaGVpZ2h0ICBSTiA1Ci10bXA3ICAgIFJOIDUKLQotY2hyUFcgICBSTiA2Ci10bXA4ICAgIFJOIDYKLQotdG1wMSAgICBSTiA3Ci0KLXRtcDIgICAgUk4gOAotCi10bXAzICAgIFJOIDkKLQotdG1wNCAgICBSTiAxMAotCi10bXA1ICAgIFJOIDExCi1jaHJQSCAgIFJOIDExCi0KLXRtcDYgICAgUk4gMTIKLQotYzMyICAgICBSTiAxNAoteUZyYWMgICBSTiAxNAotCi07Ly8gRnVuY3Rpb24gZXhwb3J0cyBhbmQgaW1wb3J0cwotCi0gICAgSU1QT1JUICBoMjY0YnNkRmlsbEJsb2NrCi0KLSAgICBFWFBPUlQgIGgyNjRic2RJbnRlcnBvbGF0ZUNocm9tYVZlcgotCi07Ly8gIEZ1bmN0aW9uIGFyZ3VtZW50cwotOy8vCi07Ly8gIHU4ICpyZWYsICAgICAgICAgICAgICAgICAgIDogMHhjNAotOy8vICB1OCAqcHJlZFBhcnRDaHJvbWEsICAgICAgICA6IDB4YzgKLTsvLyAgaTMyIHgwLCAgICAgICAgICAgICAgICAgICAgOiAweGNjCi07Ly8gIGkzMiB5MCwgICAgICAgICAgICAgICAgICAgIDogMHhkMAotOy8vICB1MzIgd2lkdGgsICAgICAgICAgICAgICAgICA6IDB4ZjgKLTsvLyAgdTMyIGhlaWdodCwgICAgICAgICAgICAgICAgOiAweGZjCi07Ly8gIHUzMiB5RnJhYywgICAgICAgICAgICAgICAgIDogMHgxMDAKLTsvLyAgdTMyIGNocm9tYVBhcnRXaWR0aCwgICAgICAgOiAweDEwNAotOy8vICB1MzIgY2hyb21hUGFydEhlaWdodCAgICAgICA6IDB4MTA4Ci0KLWgyNjRic2RJbnRlcnBvbGF0ZUNocm9tYVZlcgotICAgIFNUTUZEICAgc3AhLCB7cjAtcjExLGxyfQotICAgIFNVQiAgICAgc3AsIHNwLCAjMHhjNAotCi0gICAgTERSICAgICBjaHJQVywgW3NwLCAjMHgxMDRdICAgICA7Ly8gY2hyb21hUGFydFdpZHRoCi0gICAgTERSICAgICB3aWR0aCwgW3NwLCAjMHhmOF0gICAgICA7Ly8gd2lkdGgKLSAgICBDTVAgICAgIHgwLCAjMAotICAgIEJMVCAgICAgZG9fZmlsbAotCi0gICAgQUREICAgICB0bXAxLCB4MCwgY2hyUFcgICAgICAgICA7Ly8gdG1wMSA9IHgwKyBjaHJvbWFQYXJ0V2lkdGgKLSAgICBDTVAgICAgIHRtcDEsIHdpZHRoICAgICAgICAgICAgIDsvLyB4MCtjaHJvbWFQYXJ0V2lkdGggPiB3aWR0aAotICAgIEJISSAgICAgZG9fZmlsbAotCi0gICAgQ01QICAgICB5MCwgIzAKLSAgICBCTFQgICAgIGRvX2ZpbGwKLSAgICBMRFIgICAgIGNoclBILCBbc3AsICMweDEwOF0gICAgIDsvLyBjaHJvbWFQYXJ0SGVpZ2h0Ci0gICAgTERSICAgICBoZWlnaHQsIFtzcCwgIzB4ZmNdICAgICA7Ly8gaGVpZ2h0Ci0gICAgQUREICAgICB0bXAxLCB5MCwgY2hyUEggICAgICAgICA7Ly8gdG1wMSA9IHkwICsgY2hyb21hUGFydEhlaWdodAotICAgIEFERCAgICAgdG1wMSwgdG1wMSwgIzEgICAgICAgICAgOy8vIHRtcDEgPSB5MCArIGNocm9tYVBhcnRIZWlnaHQgKyAxCi0gICAgQ01QICAgICB0bXAxLCBoZWlnaHQKLSAgICBCTFMgICAgIHNraXBfZmlsbAotCi1kb19maWxsCi0gICAgTERSICAgICBjaHJQSCwgW3NwLCAjMHgxMDhdICAgICA7Ly8gY2hyb21hUGFydEhlaWdodAotICAgIExEUiAgICAgaGVpZ2h0LCBbc3AsICMweGZjXSAgICAgOy8vIGhlaWdodAotICAgIEFERCAgICAgdG1wMSwgY2hyUEgsICMxICAgICAgICAgOy8vIHRtcDEgPSBjaHJvbWFQYXJ0SGVpZ2h0KzEKLSAgICBNT1YgICAgIHRtcDIsIGNoclBXICAgICAgICAgICAgIDsvLyB0bXAyID0gY2hyb21hUGFydFdpZHRoCi0gICAgU1RNSUEgICBzcCx7d2lkdGgsaGVpZ2h0LGNoclBXLHRtcDEsdG1wMn0KLSAgICBBREQgICAgIGJsb2NrLCBzcCwgIzB4MWMgICAgICAgIDsvLyBibG9jawotICAgIEJMICAgICAgaDI2NGJzZEZpbGxCbG9jawotCi0gICAgTERSICAgICB4MCwgW3NwLCAjMHhjY10KLSAgICBMRFIgICAgIHkwLCBbc3AsICMweGQwXQotICAgIExEUiAgICAgcmVmLCBbc3AsICMweGM0XSAgICAgICAgOy8vIHJlZgotICAgIFNUTUlBICAgc3Ase3dpZHRoLGhlaWdodCxjaHJQVyx0bXAxLHRtcDJ9Ci0gICAgQUREICAgICBibG9jaywgc3AsICMweDFjICAgICAgICA7Ly8gYmxvY2sKLSAgICBNTEEgICAgIHJlZiwgaGVpZ2h0LCB3aWR0aCwgcmVmIDsvLyByZWYgKz0gd2lkdGggKiBoZWlnaHQ7IAotICAgIE1MQSAgICAgYmxvY2ssIGNoclBXLCB0bXAxLCBibG9jazsvLyBibG9jayArIChjaHJvbWFQVykqKGNocm9tYVBIKzEpCi0gICAgQkwgICAgICBoMjY0YnNkRmlsbEJsb2NrCi0KLSAgICBNT1YgICAgIHgwLCAjMCAgICAgICAgICAgICAgICAgIDsvLyB4MCA9IDAKLSAgICBNT1YgICAgIHkwLCAjMCAgICAgICAgICAgICAgICAgIDsvLyB5MCA9IDAKLSAgICBTVFIgICAgIHgwLCBbc3AsICMweGNjXQotICAgIFNUUiAgICAgeTAsIFtzcCwgIzB4ZDBdCi0gICAgQUREICAgICByZWYsIHNwLCAjMHgxYyAgICAgICAgICA7Ly8gcmVmID0gYmxvY2sKLSAgICBTVFIgICAgIHJlZiwgW3NwLCAjMHhjNF0gICAgICAgIDsvLyByZWYKLQotICAgIFNUUiAgICAgdG1wMSwgW3NwLCAjMHhmY10gICAgICAgOy8vIGhlaWdodAotICAgIFNUUiAgICAgY2hyUFcsIFtzcCwgIzB4ZjhdICAgICAgOy8vIHdpZHRoCi0gICAgTU9WICAgICB3aWR0aCwgY2hyUFcKLQotc2tpcF9maWxsCi0gICAgTUxBICAgICB0bXAzLCB5MCwgd2lkdGgsIHgwICAgICA7Ly8gdG1wMyA9IHkwKndpZHRoK3gwCi0gICAgTERSICAgICB5RnJhYywgW3NwLCAjMHgxMDBdICAgICA7Ly8geUZyYWMKLSAgICBBREQgICAgIHB0ckEsIHJlZiwgdG1wMyAgICAgICAgIDsvLyBwdHJBID0gcmVmICsgeTAqd2lkdGgreDAKLSAgICBSU0IgICAgIHZhbFksIHlGcmFjLCAjOCAgICAgICAgIDsvLyB2YWxZID0gOC15RnJhYwotCi0gICAgTERSICAgICBtYiwgW3NwLCAjMHhjOF0gICAgICAgICA7Ly8gcHJlZFBhcnRDaHJvbWEKLQotCi0gICAgOy8vIHBhY2sgdmFsdWVzIHRvIGNvdW50IHJlZ2lzdGVyCi0gICAgOy8vIFszMToyOF0gbG9vcF94IChjaHJvbWFQYXJ0V2lkdGgtMSkKLSAgICA7Ly8gWzI3OjI0XSBsb29wX3kgKGNocm9tYVBhcnRIZWlnaHQtMSkKLSAgICA7Ly8gWzIzOjIwXSBjaHJvbWFQYXJ0V2lkdGgtMQotICAgIDsvLyBbMTk6MTZdIGNocm9tYVBhcnRIZWlnaHQtMQotICAgIDsvLyBbMTU6MDBdIG5vdGhpbmcKLQotICAgIFNVQiAgICAgdG1wMiwgY2hyUEgsICMxICAgICAgICAgICAgIDsvLyBjaHJvbWFQYXJ0SGVpZ2h0LTEKLSAgICBTVUIgICAgIHRtcDEsIGNoclBXLCAjMSAgICAgICAgICAgICA7Ly8gY2hyb21hUGFydFdpZHRoLTEKLSAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMiwgTFNMICMxNiA7Ly8gY2hyb21hUGFydEhlaWdodC0xCi0gICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDIsIExTTCAjMjQgOy8vIGxvb3BfeQotICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAxLCBMU0wgIzIwIDsvLyBjaHJvbWFQYXJ0V2lkdGgtMQotICAgIEFORCAgICAgdG1wMiwgY291bnQsICMweDAwRjAwMDAwICAgIDsvLyBsb29wX3gKLSAgICBQS0hCVCAgIHZhbFksIHZhbFksIHlGcmFjLCBMU0wgIzE2ICA7Ly8gfHlGcmFjfHZhbFkgfAotICAgIE1PViAgICAgdmFsWSwgdmFsWSwgTFNMICMzICAgICAgICAgIDsvLyBtdWx0aXBseSBieSA4IGluIGFkdmFuY2UKLSAgICBNT1YgICAgIGMzMiwgIzMyCi0KLQotICAgIDsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICA7Ly8gQ2IKLSAgICA7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICA7Ly8gMngyIHBlbHMgcGVyIGl0ZXJhdGlvbgotICAgIDsvLyBiaWxpbmVhciB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uCi0KLWxvb3AxX3kKLSAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMiwgTFNMICM4Ci1sb29wMV94Ci0gICAgOy8vIFByb2Nlc3MgMngyIGJsb2NrCi0gICAgTERSQiAgICB0bXAyLCBbcHRyQSx3aWR0aF0gICAgICAgICAgOy8vIDIgcm93LCAxIGNvbAotICAgIExEUkIgICAgdG1wMywgW3B0ckEsd2lkdGgsIExTTCAjMV0gIDsvLyAzIHJvdywgMSBjb2wKLSAgICBMRFJCICAgIHRtcDEsIFtwdHJBXSwjMSAgICAgICAgICAgICA7Ly8gMSByb3csIDEgY29sCi0KLSAgICBMRFJCICAgIHRtcDUsIFtwdHJBLHdpZHRoXSAgICAgICAgICA7Ly8gMiByb3csIDIgY29sCi0gICAgTERSQiAgICB0bXA2LCBbcHRyQSx3aWR0aCwgTFNMICMxXSAgOy8vIDMgcm93LCAyIGNvbAotICAgIExEUkIgICAgdG1wNCwgW3B0ckFdLCMxICAgICAgICAgICAgIDsvLyAxIHJvdywgMiBjb2wKLQotICAgIFBLSEJUICAgdG1wMSwgdG1wMSwgdG1wMiwgTFNMICMxNiAgIDsvLyB8QnxBfAotICAgIFBLSEJUICAgdG1wMiwgdG1wMiwgdG1wMywgTFNMICMxNiAgIDsvLyB8Q3xCfAotICAgIFBLSEJUICAgdG1wNCwgdG1wNCwgdG1wNSwgTFNMICMxNiAgIDsvLyB8QnxBfAotCi0gICAgU01MQUQgICB0bXA3LCB0bXAyLCB2YWxZLCBjMzIgICAgICAgOy8vIG11bHRpcGx5Ci0gICAgUEtIQlQgICB0bXA1LCB0bXA1LCB0bXA2LCBMU0wgIzE2ICAgOy8vIHxDfEJ8Ci0gICAgU01MQUQgICB0bXAyLCB0bXAxLCB2YWxZLCBjMzIgICAgICAgOy8vIG11bHRpcGx5Ci0gICAgU01MQUQgICB0bXA4LCB0bXA1LCB2YWxZLCBjMzIgICAgICAgOy8vIG11bHRpcGx5Ci0gICAgU01MQUQgICB0bXA1LCB0bXA0LCB2YWxZLCBjMzIgICAgICAgOy8vIG11bHRpcGx5Ci0KLSAgICBNT1YgICAgIHRtcDcsIHRtcDcsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgotICAgIFNUUkIgICAgdG1wNywgW21iLCM4XSAgICAgICAgICAgICAgIDsvLyBzdG9yZSByb3cgMiBjb2wgMQotICAgIE1PViAgICAgdG1wMiwgdG1wMiwgTFNSICM2ICAgICAgICAgIDsvLyBzY2FsZSBkb3duCi0gICAgU1RSQiAgICB0bXAyLCBbbWJdLCMxICAgICAgICAgICAgICAgOy8vIHN0b3JlIHJvdyAxIGNvbCAxCi0KLSAgICBNT1YgICAgIHRtcDgsIHRtcDgsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgotICAgIFNUUkIgICAgdG1wOCwgW21iLCM4XSAgICAgICAgICAgICAgIDsvLyBzdG9yZSByb3cgMiBjb2wgMgotICAgIE1PViAgICAgdG1wNSwgdG1wNSwgTFNSICM2ICAgICAgICAgIDsvLyBzY2FsZSBkb3duCi0gICAgU1RSQiAgICB0bXA1LCBbbWJdLCMxICAgICAgICAgICAgICAgOy8vIHN0b3JlIHJvdyAxIGNvbCAyCi0KLQotICAgIFNVQlMgICAgY291bnQsIGNvdW50LCAjMjw8MjgKLSAgICBCQ1MgICAgIGxvb3AxX3gKLQotICAgIEFORCAgICAgdG1wMiwgY291bnQsICMweDAwRjAwMDAwCi0KLSAgICBBRERTICAgIG1iLCBtYiwgIzE2Ci0gICAgU0JDICAgICBtYiwgbWIsIHRtcDIsIExTUiAjMjAKLSAgICBBREQgICAgIHB0ckEsIHB0ckEsIHdpZHRoLCBMU0wgIzEKLSAgICBTQkMgICAgIHB0ckEsIHB0ckEsIHRtcDIsIExTUiAjMjAKLQotICAgIEFERFMgICAgY291bnQsIGNvdW50LCAjMHhFIDw8IDI0Ci0gICAgQkdFICAgICBsb29wMV95IAotCi0gICAgOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIDsvLyBDcgotICAgIDsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICBMRFIgICAgIGhlaWdodCwgW3NwLCMweGZjXSAgICAgICAgICA7Ly8gaGVpZ2h0Ci0gICAgTERSICAgICByZWYsIFtzcCwgIzB4YzRdICAgICAgICAgICAgOy8vIHJlZgotICAgIExEUiAgICAgdG1wMSwgW3NwLCAjMHhkMF0gICAgICAgICAgIDsvLyB5MAotICAgIExEUiAgICAgdG1wMiwgW3NwLCAjMHhjY10gICAgICAgICAgIDsvLyB4MAotICAgIExEUiAgICAgbWIsIFtzcCwgIzB4YzhdICAgICAgICAgICAgIDsvLyBwcmVkUGFydENocm9tYQotCi0gICAgQUREICAgICB0bXAxLCBoZWlnaHQsIHRtcDEKLSAgICBNTEEgICAgIHRtcDMsIHRtcDEsIHdpZHRoLCB0bXAyCi0gICAgQUREICAgICBwdHJBLCByZWYsIHRtcDMKLSAgICBBREQgICAgIG1iLCBtYiwgIzY0Ci0KLSAgICBBTkQgICAgIGNvdW50LCBjb3VudCwgIzB4MDBGRkZGRkYKLSAgICBBTkQgICAgIHRtcDEsIGNvdW50LCAjMHgwMDBGMDAwMAotICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAxLCBMU0wgIzgKLSAgICBBTkQgICAgIHRtcDIsIGNvdW50LCAjMHgwMEYwMDAwMAotCi0gICAgOy8vIDJ4MiBwZWxzIHBlciBpdGVyYXRpb24KLSAgICA7Ly8gYmlsaW5lYXIgdmVydGljYWwgaW50ZXJwb2xhdGlvbgotbG9vcDJfeQotICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAyLCBMU0wgIzgKLWxvb3AyX3gKLSAgICA7Ly8gUHJvY2VzcyAyeDIgYmxvY2sKLSAgICBMRFJCICAgIHRtcDIsIFtwdHJBLHdpZHRoXSAgICAgICAgICA7Ly8gMiByb3csIDEgY29sCi0gICAgTERSQiAgICB0bXAzLCBbcHRyQSx3aWR0aCwgTFNMICMxXSAgOy8vIDMgcm93LCAxIGNvbAotICAgIExEUkIgICAgdG1wMSwgW3B0ckFdLCMxICAgICAgICAgICAgIDsvLyAxIHJvdywgMSBjb2wKLQotICAgIExEUkIgICAgdG1wNSwgW3B0ckEsd2lkdGhdICAgICAgICAgIDsvLyAyIHJvdywgMiBjb2wKLSAgICBMRFJCICAgIHRtcDYsIFtwdHJBLHdpZHRoLCBMU0wgIzFdICA7Ly8gMyByb3csIDIgY29sCi0gICAgTERSQiAgICB0bXA0LCBbcHRyQV0sIzEgICAgICAgICAgICAgOy8vIDEgcm93LCAyIGNvbAotCi0gICAgUEtIQlQgICB0bXAxLCB0bXAxLCB0bXAyLCBMU0wgIzE2ICAgOy8vIHxCfEF8Ci0gICAgUEtIQlQgICB0bXAyLCB0bXAyLCB0bXAzLCBMU0wgIzE2ICAgOy8vIHxDfEJ8Ci0gICAgUEtIQlQgICB0bXA0LCB0bXA0LCB0bXA1LCBMU0wgIzE2ICAgOy8vIHxCfEF8Ci0KLSAgICBTTUxBRCAgIHRtcDcsIHRtcDIsIHZhbFksIGMzMiAgICAgICA7Ly8gbXVsdGlwbHkKLSAgICBQS0hCVCAgIHRtcDUsIHRtcDUsIHRtcDYsIExTTCAjMTYgICA7Ly8gfEN8QnwKLSAgICBTTUxBRCAgIHRtcDIsIHRtcDEsIHZhbFksIGMzMiAgICAgICA7Ly8gbXVsdGlwbHkKLSAgICBTTUxBRCAgIHRtcDgsIHRtcDUsIHZhbFksIGMzMiAgICAgICA7Ly8gbXVsdGlwbHkKLSAgICBTTUxBRCAgIHRtcDUsIHRtcDQsIHZhbFksIGMzMiAgICAgICA7Ly8gbXVsdGlwbHkKLQotICAgIE1PViAgICAgdG1wNywgdG1wNywgTFNSICM2ICAgICAgICAgIDsvLyBzY2FsZSBkb3duCi0gICAgU1RSQiAgICB0bXA3LCBbbWIsIzhdICAgICAgICAgICAgICAgOy8vIHN0b3JlIHJvdyAyIGNvbCAxCi0gICAgTU9WICAgICB0bXAyLCB0bXAyLCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KLSAgICBTVFJCICAgIHRtcDIsIFttYl0sIzEgICAgICAgICAgICAgICA7Ly8gc3RvcmUgcm93IDEgY29sIDEKLQotICAgIE1PViAgICAgdG1wOCwgdG1wOCwgTFNSICM2ICAgICAgICAgIDsvLyBzY2FsZSBkb3duCi0gICAgU1RSQiAgICB0bXA4LCBbbWIsIzhdICAgICAgICAgICAgICAgOy8vIHN0b3JlIHJvdyAyIGNvbCAyCi0gICAgTU9WICAgICB0bXA1LCB0bXA1LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KLSAgICBTVFJCICAgIHRtcDUsIFttYl0sIzEgICAgICAgICAgICAgICA7Ly8gc3RvcmUgcm93IDEgY29sIDIKLQotCi0gICAgU1VCUyAgICBjb3VudCwgY291bnQsICMyPDwyOAotICAgIEJDUyAgICAgbG9vcDJfeAotCi0gICAgQU5EICAgICB0bXAyLCBjb3VudCwgIzB4MDBGMDAwMDAKLQotICAgIEFERFMgICAgbWIsIG1iLCAjMTYKLSAgICBTQkMgICAgIG1iLCBtYiwgdG1wMiwgTFNSICMyMAotICAgIEFERCAgICAgcHRyQSwgcHRyQSwgd2lkdGgsIExTTCAjMQotICAgIFNCQyAgICAgcHRyQSwgcHRyQSwgdG1wMiwgTFNSICMyMAotCi0gICAgQUREUyAgICBjb3VudCwgY291bnQsICMweEUgPDwgMjQKLSAgICBCR0UgICAgIGxvb3AyX3kKLQotICAgIEFERCAgICAgc3Asc3AsIzB4ZDQKLSAgICBMRE1GRCAgIHNwISwge3I0LXIxMSxwY30KLQotICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV9ob3JfaGFsZi5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV9ob3JfaGFsZi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Mzk2OGI2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfaG9yX2hhbGYucworKysgL2Rldi9udWxsCkBAIC0xLDI1MSArMCwwIEBACi07IENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci07Ci07IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOwotOyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOwotOyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy0tCi07LS0gQWJzdHJhY3QgOiBBUk12NiBvcHRpbWl6ZWQgdmVyc2lvbiBvZiBoMjY0YnNkSW50ZXJwb2xhdGVIb3JIYWxmIGZ1bmN0aW9uCi07LS0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotICAgIElGIDpERUY6IEgyNjRERUNfV0lOQVNNCi0gICAgICAgIDsvLyBXZSBkb250IHVzZSBSRVFVSVJFOCBhbmQgUFJFU0VSVkU4IGZvciB3aW5hc20KLSAgICBFTFNFCi0gICAgICAgIFJFUVVJUkU4Ci0gICAgICAgIFBSRVNFUlZFOAotICAgIEVORElGCi0KLSAgICBBUkVBICAgIHwudGV4dHwsIENPREUKLQotOy8vIGgyNjRic2RJbnRlcnBvbGF0ZUhvckhhbGYgcmVnaXN0ZXIgYWxsb2NhdGlvbgotCi1yZWYgICAgIFJOIDAKLQotbWIgICAgICBSTiAxCi1idWZmICAgIFJOIDEKLQotY291bnQgICBSTiAyCi14MCAgICAgIFJOIDIKLQoteTAgICAgICBSTiAzCi14XzJfMCAgIFJOIDMKLQotd2lkdGggICBSTiA0Ci14XzNfMSAgIFJOIDQKLQotaGVpZ2h0ICBSTiA1Ci14XzZfNCAgIFJOIDUKLQotcGFydFcgICBSTiA2Ci14XzdfNSAgIFJOIDYKLQotcGFydEggICBSTiA3Ci10bXAxICAgIFJOIDcKLQotdG1wMiAgICBSTiA4Ci0KLXRtcDMgICAgUk4gOQotCi10bXA0ICAgIFJOIDEwCi0KLW11bHRfMjBfMDEgIFJOIDExCi1tdWx0XzIwX201ICBSTiAxMgotCi1wbHVzMTYgIFJOIDE0Ci0KLQotOy8vIGZ1bmN0aW9uIGV4cG9ydHMgYW5kIGltcG9ydHMKLQotICAgIElNUE9SVCAgaDI2NGJzZEZpbGxCbG9jawotCi0gICAgRVhQT1JUICBoMjY0YnNkSW50ZXJwb2xhdGVIb3JIYWxmCi0KLTsvLyBIb3Jpem9udGFsIGZpbHRlciBhcHByb2FjaAotOy8vCi07Ly8gQmFzaWMgaWRlYSBpbiBob3Jpem9udGFsIGZpbHRlcmluZyBpcyB0byBhZGp1c3QgY29lZmZpY2llbnRzCi07Ly8gbGlrZSBiZWxvdy4gQ2FsY3VsYXRpb24gaXMgZG9uZSB3aXRoIDE2LWJpdCBtYXRocy4KLTsvLwotOy8vIFJlZyAgICAgeF8yXzAgICAgIHhfM18xICAgICB4XzZfNCAgICAgeF83XzUgICAgIHhfMl8wCi07Ly8gICAgICAgWyAgMiAgMCBdIFsgIDMgIDEgXSBbICA2ICA0IF0gWyAgNyAgNSBdIFsgMTAgIDggXSAuLi4KLTsvLyB5XzAgPSAgIDIwICAxICAgICAyMCAtNSAgICAgICAgLTUgICAgICAgICAxCi07Ly8geV8xID0gICAtNSAgICAgICAgMjAgIDEgICAgICAxIDIwICAgICAgICAtNQotOy8vIHlfMiA9ICAgIDEgICAgICAgIC01ICAgICAgICAtNSAyMCAgICAgIDEgMjAKLTsvLyB5XzMgPSAgICAgICAgICAgICAgMSAgICAgICAgMjAgLTUgICAgIC01IDIwICAgICAgICAgMQotCi0KLWgyNjRic2RJbnRlcnBvbGF0ZUhvckhhbGYKLSAgICBTVE1GRCAgIHNwISwge3IwLXIxMSwgbHJ9Ci0gICAgU1VCICAgICBzcCwgc3AsICMweDFlNAotCi0gICAgQ01QICAgICB4MCwgIzAKLSAgICBCTFQgICAgIGRvX2ZpbGwgICAgICAgICAgICAgICAgIDsvLyAoeDAgPCAwKQotICAgIExEUiAgICAgcGFydFcsIFtzcCwjMHgyMjBdICAgICAgOy8vIHBhcnRXaWR0aAotICAgIEFERCAgICAgdG1wNCwgeDAsIHBhcnRXICAgICAgICAgOy8vICh4MCtwYXJ0V2lkdGgpCi0gICAgQUREICAgICB0bXA0LCB0bXA0LCAjNSAgICAgICAgICA7Ly8gKHkwK3BhcnRXKzUpCi0gICAgTERSICAgICB3aWR0aCwgW3NwLCMweDIxOF0gICAgICA7Ly8gd2lkdGgKLSAgICBDTVAgICAgIHRtcDQsIHdpZHRoCi0gICAgQkhJICAgICBkb19maWxsICAgICAgICAgICAgICAgICA7Ly8gKHgwK3BhcnRXKT53aWR0aAotCi0gICAgQ01QICAgICB5MCwgIzAKLSAgICBCTFQgICAgIGRvX2ZpbGwgICAgICAgICAgICAgICAgIDsvLyAoeTAgPCAwKQotICAgIExEUiAgICAgcGFydEgsIFtzcCwjMHgyMjRdICAgICAgOy8vIHBhcnRIZWlnaHQKLSAgICBBREQgICAgIHRtcDIsIHkwLCBwYXJ0SCAgICAgICAgIDsvLyAoeTArcGFydEhlaWdodCkKLSAgICBMRFIgICAgIGhlaWdodCwgW3NwLCMweDIxY10gICAgIDsvLyBoZWlnaHQKLSAgICBDTVAgICAgIHRtcDIsIGhlaWdodAotICAgIEJMUyAgICAgc2tpcF9maWxsICAgICAgICAgICAgICAgOy8vIG5vIG92ZXJmaWxsIG5lZWRlZAotCi0KLWRvX2ZpbGwKLSAgICBMRFIgICAgIHBhcnRILCBbc3AsIzB4MjI0XSAgICAgIDsvLyBwYXJ0SGVpZ2h0Ci0gICAgTERSICAgICBoZWlnaHQsIFtzcCwjMHgyMWNdICAgICA7Ly8gaGVpZ2h0Ci0gICAgTERSICAgICBwYXJ0VywgW3NwLCMweDIyMF0gICAgICA7Ly8gcGFydFdpZHRoCi0gICAgQUREICAgICB0bXA0LCBwYXJ0VywgIzUgICAgICAgICA7Ly8gdG1wNCA9IHBhcnRXICsgNTsKLSAgICBTVE1JQiAgIHNwLCB7aGVpZ2h0LCB0bXA0fSAgICAgIDsvLyBzcCs0ID0gaGVpZ2h0LCBzcCs4ID0gcGFydFdpZHRoKzUKLSAgICBTVFIgICAgIHBhcnRILCBbc3AsIzB4Y10gICAgICAgIDsvLyBzcCtjID0gcGFydEhlaWdodAotICAgIFNUUiAgICAgdG1wNCwgW3NwLCMweDEwXSAgICAgICAgOy8vIHNwKzEwID0gcGFydFdpZHRoKzUKLSAgICBMRFIgICAgIHdpZHRoLCBbc3AsIzB4MjE4XSAgICAgIDsvLyB3aWR0aAotICAgIFNUUiAgICAgd2lkdGgsIFtzcCwjMF0gICAgICAgICAgOy8vIHNwKzAgPSB3aWR0aAotICAgIEFERCAgICAgYnVmZiwgc3AsICMweDI4ICAgICAgICAgOy8vIGJ1ZmYgPSBwMVsyMSoyMS80KzFdCi0gICAgQkwgICAgICBoMjY0YnNkRmlsbEJsb2NrCi0KLSAgICBNT1YgICAgIHgwLCAjMAotICAgIFNUUiAgICAgeDAsW3NwLCMweDFlY10gICAgICAgICAgOy8vIHgwID0gMAotICAgIFNUUiAgICAgeDAsW3NwLCMweDFmMF0gICAgICAgICAgOy8vIHkwID0gMAotICAgIEFERCAgICAgcmVmLHNwLCMweDI4ICAgICAgICAgICAgOy8vIHJlZiA9IHAxCi0gICAgU1RSICAgICB0bXA0LCBbc3AsIzB4MjE4XSAgICAgICA7Ly8gd2lkdGggPSBwYXJ0V2lkdGgrNQotCi0KLXNraXBfZmlsbAotICAgIExEUiAgICAgeDAgLFtzcCwjMHgxZWNdICAgICAgICAgOy8vIHgwCi0gICAgTERSICAgICB5MCAsW3NwLCMweDFmMF0gICAgICAgICA7Ly8geTAKLSAgICBMRFIgICAgIHdpZHRoLCBbc3AsIzB4MjE4XSAgICAgIDsvLyB3aWR0aAotICAgIE1MQSAgICAgdG1wMiwgd2lkdGgsIHkwLCB4MCAgICAgOy8vIHkwKndpZHRoK3gwCi0gICAgQUREICAgICByZWYsIHJlZiwgdG1wMiAgICAgICAgICA7Ly8gcmVmICs9IHkwKndpZHRoK3gwCi0gICAgQUREICAgICByZWYsIHJlZiwgIzggICAgICAgICAgICA7Ly8gcmVmID0gcmVmKzgKLSAgICBMRFIgICAgIG1iLCBbc3AsICMweDFlOF0gICAgICAgIDsvLyBtYgotCi0gICAgOy8vIHBhY2sgdmFsdWVzIHRvIGNvdW50IHJlZ2lzdGVyCi0gICAgOy8vIFszMToyOF0gbG9vcF94IChwYXJ0V2lkdGgtMSkKLSAgICA7Ly8gWzI3OjI0XSBsb29wX3kgKHBhcnRIZWlnaHQtMSkKLSAgICA7Ly8gWzIzOjIwXSBwYXJ0V2lkdGgtMQotICAgIDsvLyBbMTk6MTZdIHBhcnRIZWlnaHQtMQotICAgIDsvLyBbMTU6MDBdIHdpZHRoCi0gICAgTU9WICAgICBjb3VudCwgd2lkdGgKLSAgICBTVUIgICAgIHBhcnRXLCBwYXJ0VywgIzE7Ci0gICAgU1VCICAgICBwYXJ0SCwgcGFydEgsICMxOwotICAgIEFERCAgICAgdG1wMiwgcGFydEgsIHBhcnRXLCBMU0wgIzQKLSAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMiwgTFNMICMxNgotCi0KLSAgICBMRFIgICAgIG11bHRfMjBfMDEsID0gMHgwMDE0MDAwMQotICAgIExEUiAgICAgbXVsdF8yMF9tNSwgPSAweDAwMTRGRkZCCi0gICAgTU9WICAgICBwbHVzMTYsICMxNgotICAgIEFORCAgICAgdG1wMSwgY291bnQsICMweDAwMEYwMDAwICAgIDsvLyBwYXJ0SGVpZ2h0LTEKLSAgICBBTkQgICAgIHRtcDMsIGNvdW50LCAjMHgwMEYwMDAwMCAgICA7Ly8gcGFydFdpZHRoLTEKLSAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMSwgTFNMICM4Ci1sb29wX3kKLSAgICBMRFIgICAgIHhfM18xLCBbcmVmLCAjLThdCi0gICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDMsIExTTCAjOAotICAgIExEUiAgICAgeF83XzUsIFtyZWYsICMtNF0KLSAgICBVWFRCMTYgIHhfMl8wLCB4XzNfMQotICAgIFVYVEIxNiAgeF8zXzEsIHhfM18xLCBST1IgIzgKLSAgICBVWFRCMTYgIHhfNl80LCB4XzdfNQotCi1sb29wX3gKLSAgICBVWFRCMTYgIHhfN181LCB4XzdfNSwgUk9SICM4Ci0KLSAgICBTTUxBRCAgIHRtcDEsIHhfMl8wLCBtdWx0XzIwXzAxLCBwbHVzMTYKLSAgICBTTUxBVEIgIHRtcDMsIHhfMl8wLCBtdWx0XzIwXzAxLCBwbHVzMTYKLSAgICBTTUxBVEIgIHRtcDIsIHhfMl8wLCBtdWx0XzIwX201LCBwbHVzMTYKLSAgICBTTUxBVEIgIHRtcDQsIHhfM18xLCBtdWx0XzIwXzAxLCBwbHVzMTYKLQotICAgIFNNTEFEICAgdG1wMSwgeF8zXzEsIG11bHRfMjBfbTUsIHRtcDEKLSAgICBTTUxBVEIgIHRtcDMsIHhfM18xLCBtdWx0XzIwX201LCB0bXAzCi0gICAgU01MQUQgICB0bXAyLCB4XzNfMSwgbXVsdF8yMF8wMSwgdG1wMgotICAgIExEUiAgICAgeF8zXzEsIFtyZWZdLCAjNAotICAgIFNNTEFEICAgdG1wNCwgeF82XzQsIG11bHRfMjBfbTUsIHRtcDQKLQotICAgIFNNTEFCQiAgdG1wMSwgeF82XzQsIG11bHRfMjBfbTUsIHRtcDEKLSAgICBTTUxBRFggIHRtcDMsIHhfNl80LCBtdWx0XzIwX201LCB0bXAzCi0gICAgU01MQURYICB0bXAyLCB4XzZfNCwgbXVsdF8yMF8wMSwgdG1wMgotICAgIFNNTEFEWCAgdG1wNCwgeF83XzUsIG11bHRfMjBfbTUsIHRtcDQKLQotICAgIFNNTEFCQiAgdG1wMSwgeF83XzUsIG11bHRfMjBfMDEsIHRtcDEKLSAgICBVWFRCMTYgIHhfMl8wLCB4XzNfMQotICAgIFNNTEFCQiAgdG1wMiwgeF83XzUsIG11bHRfMjBfbTUsIHRtcDIKLSAgICBTTUxBRFggIHRtcDMsIHhfN181LCBtdWx0XzIwXzAxLCB0bXAzCi0gICAgU01MQUJCICB0bXA0LCB4XzJfMCwgbXVsdF8yMF8wMSwgdG1wNAotCi0gICAgTU9WICAgICB0bXAyLCB0bXAyLCBBU1IgIzUKLSAgICBNT1YgICAgIHRtcDEsIHRtcDEsIEFTUiAjNQotICAgIFBLSEJUICAgdG1wMiwgdG1wMiwgdG1wNCwgTFNMICMoMTYtNSkKLSAgICBQS0hCVCAgIHRtcDEsIHRtcDEsIHRtcDMsIExTTCAjKDE2LTUpCi0gICAgVVNBVDE2ICB0bXAyLCAjOCwgdG1wMgotICAgIFVTQVQxNiAgdG1wMSwgIzgsIHRtcDEKLQotICAgIFNVQlMgICAgY291bnQsIGNvdW50LCAjNDw8MjgKLSAgICBPUlIgICAgIHRtcDEsIHRtcDEsIHRtcDIsIExTTCAjOAotICAgIFNUUiAgICAgdG1wMSwgW21iXSwgIzQKLSAgICBCQ0MgICAgIG5leHRfeQotCi0gICAgVVhUQjE2ICB4XzNfMSwgeF8zXzEsIFJPUiAjOAotCi0gICAgU01MQUQgICB0bXAxLCB4XzZfNCwgbXVsdF8yMF8wMSwgcGx1czE2Ci0gICAgU01MQVRCICB0bXAzLCB4XzZfNCwgbXVsdF8yMF8wMSwgcGx1czE2Ci0gICAgU01MQVRCICB0bXAyLCB4XzZfNCwgbXVsdF8yMF9tNSwgcGx1czE2Ci0gICAgU01MQVRCICB0bXA0LCB4XzdfNSwgbXVsdF8yMF8wMSwgcGx1czE2Ci0KLSAgICBTTUxBRCAgIHRtcDEsIHhfN181LCBtdWx0XzIwX201LCB0bXAxCi0gICAgU01MQVRCICB0bXAzLCB4XzdfNSwgbXVsdF8yMF9tNSwgdG1wMwotICAgIFNNTEFEICAgdG1wMiwgeF83XzUsIG11bHRfMjBfMDEsIHRtcDIKLSAgICBMRFIgICAgIHhfN181LCBbcmVmXSwgIzQKLSAgICBTTUxBRCAgIHRtcDQsIHhfMl8wLCBtdWx0XzIwX201LCB0bXA0Ci0KLSAgICBTTUxBQkIgIHRtcDEsIHhfMl8wLCBtdWx0XzIwX201LCB0bXAxCi0gICAgU01MQURYICB0bXAzLCB4XzJfMCwgbXVsdF8yMF9tNSwgdG1wMwotICAgIFNNTEFEWCAgdG1wMiwgeF8yXzAsIG11bHRfMjBfMDEsIHRtcDIKLSAgICBTTUxBRFggIHRtcDQsIHhfM18xLCBtdWx0XzIwX201LCB0bXA0Ci0KLSAgICBTTUxBQkIgIHRtcDEsIHhfM18xLCBtdWx0XzIwXzAxLCB0bXAxCi0gICAgVVhUQjE2ICB4XzZfNCwgeF83XzUKLSAgICBTTUxBQkIgIHRtcDIsIHhfM18xLCBtdWx0XzIwX201LCB0bXAyCi0gICAgU01MQURYICB0bXAzLCB4XzNfMSwgbXVsdF8yMF8wMSwgdG1wMwotICAgIFNNTEFCQiAgdG1wNCwgeF82XzQsIG11bHRfMjBfMDEsIHRtcDQKLQotICAgIE1PViAgICAgdG1wMiwgdG1wMiwgQVNSICM1Ci0gICAgTU9WICAgICB0bXAxLCB0bXAxLCBBU1IgIzUKLSAgICBQS0hCVCAgIHRtcDIsIHRtcDIsIHRtcDQsIExTTCAjKDE2LTUpCi0gICAgUEtIQlQgICB0bXAxLCB0bXAxLCB0bXAzLCBMU0wgIygxNi01KQotICAgIFVTQVQxNiAgdG1wMiwgIzgsIHRtcDIKLSAgICBVU0FUMTYgIHRtcDEsICM4LCB0bXAxCi0KLSAgICBTVUJTICAgIGNvdW50LCBjb3VudCwgIzQ8PDI4Ci0gICAgT1JSICAgICB0bXAxLCB0bXAxLCB0bXAyLCBMU0wgIzgKLSAgICBTVFIgICAgIHRtcDEsIFttYl0sICM0Ci0gICAgQkNTICAgICBsb29wX3gKLQotbmV4dF95Ci0gICAgQU5EICAgICB0bXAzLCBjb3VudCwgIzB4MDBGMDAwMDAgICAgOy8vIHBhcnRXaWR0aC0xCi0gICAgU01MQUJCICByZWYsIGNvdW50LCBtdWx0XzIwXzAxLCByZWYgOy8vICt3aWR0aAotICAgIEFERFMgICAgbWIsIG1iLCAjMTYgICAgICAgICAgICAgICAgIDsvLyArMTYsIENhcnJ5PTAKLSAgICBTQkMgICAgIG1iLCBtYiwgdG1wMywgTFNSICMyMCAgICAgICA7Ly8gLShwYXJ0V2lkdGgtMSktMQotICAgIFNCQyAgICAgcmVmLCByZWYsIHRtcDMsIExTUiAjMjAgICAgIDsvLyAtKHBhcnRXaWR0aC0xKS0xCi0gICAgQUREUyAgICBjb3VudCwgY291bnQsICMoMTw8MjgpLSgxPDwyNCkKLSAgICBCR0UgICAgIGxvb3BfeQotCi0gICAgQUREICAgICBzcCxzcCwjMHgxZjQKLSAgICBMRE1GRCAgIHNwISwge3I0LXIxMSwgcGN9Ci0KLSAgICBFTkQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV9ob3JfcXVhcnRlci5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV9ob3JfcXVhcnRlci5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTI0M2Q0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfaG9yX3F1YXJ0ZXIucworKysgL2Rldi9udWxsCkBAIC0xLDI3MyArMCwwIEBACi07IENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci07Ci07IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOwotOyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOwotOyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy0tCi07LS0gQWJzdHJhY3QgOiBBUk12NiBvcHRpbWl6ZWQgdmVyc2lvbiBvZiBoMjY0YnNkSW50ZXJwb2xhdGVIb3JRdWFydGVyIGZ1bmN0aW9uCi07LS0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotICAgIElGIDpERUY6IEgyNjRERUNfV0lOQVNNCi0gICAgICAgIDsvLyBXZSBkb250IHVzZSBSRVFVSVJFOCBhbmQgUFJFU0VSVkU4IGZvciB3aW5hc20KLSAgICBFTFNFCi0gICAgICAgIFJFUVVJUkU4Ci0gICAgICAgIFBSRVNFUlZFOAotICAgIEVORElGCi0KLSAgICBBUkVBICAgIHwudGV4dHwsIENPREUKLQotOy8vIGgyNjRic2RJbnRlcnBvbGF0ZUhvclF1YXJ0ZXIgcmVnaXN0ZXIgYWxsb2NhdGlvbgotCi1yZWYgICAgIFJOIDAKLQotbWIgICAgICBSTiAxCi1idWZmICAgIFJOIDEKLQotY291bnQgICBSTiAyCi14MCAgICAgIFJOIDIKLQoteTAgICAgICBSTiAzCi14XzJfMCAgIFJOIDMKLQotd2lkdGggICBSTiA0Ci14XzNfMSAgIFJOIDQKLQotaGVpZ2h0ICBSTiA1Ci14XzZfNCAgIFJOIDUKLQotcGFydFcgICBSTiA2Ci14XzdfNSAgIFJOIDYKLQotcGFydEggICBSTiA3Ci10bXAxICAgIFJOIDcKLQotdG1wMiAgICBSTiA4Ci0KLXRtcDMgICAgUk4gOQotCi10bXA0ICAgIFJOIDEwCi0KLW11bHRfMjBfMDEgIFJOIDExCi0KLW11bHRfMjBfbTUgIFJOIDEyCi0KLXBsdXMxNiAgUk4gMTQKLQotCi07Ly8gZnVuY3Rpb24gZXhwb3J0cyBhbmQgaW1wb3J0cwotCi0gICAgSU1QT1JUICBoMjY0YnNkRmlsbEJsb2NrCi0KLSAgICBFWFBPUlQgIGgyNjRic2RJbnRlcnBvbGF0ZUhvclF1YXJ0ZXIKLQotCi07Ly8gSG9yaXpvbnRhbCBmaWx0ZXIgYXBwcm9hY2gKLTsvLwotOy8vIEJhc2ljIGlkZWEgaW4gaG9yaXpvbnRhbCBmaWx0ZXJpbmcgaXMgdG8gYWRqdXN0IGNvZWZmaWNpZW50cwotOy8vIGxpa2UgYmVsb3cuIENhbGN1bGF0aW9uIGlzIGRvbmUgd2l0aCAxNi1iaXQgbWF0aHMuCi07Ly8KLTsvLyBSZWcgICAgIHhfMl8wICAgICB4XzNfMSAgICAgeF82XzQgICAgIHhfN181ICAgICB4XzJfMAotOy8vICAgICAgIFsgIDIgIDAgXSBbICAzICAxIF0gWyAgNiAgNCBdIFsgIDcgIDUgXSBbIDEwICA4IF0gLi4uCi07Ly8geV8wID0gICAyMCAgMSAgICAgMjAgLTUgICAgICAgIC01ICAgICAgICAgMQotOy8vIHlfMSA9ICAgLTUgICAgICAgIDIwICAxICAgICAgMSAyMCAgICAgICAgLTUKLTsvLyB5XzIgPSAgICAxICAgICAgICAtNSAgICAgICAgLTUgMjAgICAgICAxIDIwCi07Ly8geV8zID0gICAgICAgICAgICAgIDEgICAgICAgIDIwIC01ICAgICAtNSAyMCAgICAgICAgIDEKLQotCi1oMjY0YnNkSW50ZXJwb2xhdGVIb3JRdWFydGVyCi0gICAgU1RNRkQgICBzcCEsIHtyMC1yMTEsIGxyfQotICAgIFNVQiAgICAgc3AsIHNwLCAjMHgxZTQKLQotICAgIENNUCAgICAgeDAsICMwCi0gICAgQkxUICAgICBkb19maWxsICAgICAgICAgICAgICAgICA7Ly8gKHgwIDwgMCkKLSAgICBMRFIgICAgIHBhcnRXLCBbc3AsIzB4MjIwXSAgICAgIDsvLyBwYXJ0V2lkdGgKLSAgICBBREQgICAgIHRtcDQsIHgwLCBwYXJ0VyAgICAgICAgIDsvLyAoeDArcGFydFdpZHRoKQotICAgIEFERCAgICAgdG1wNCwgdG1wNCwgIzUgICAgICAgICAgOy8vICh5MCtwYXJ0Vys1KQotICAgIExEUiAgICAgd2lkdGgsIFtzcCwjMHgyMThdICAgICAgOy8vIHdpZHRoCi0gICAgQ01QICAgICB0bXA0LCB3aWR0aAotICAgIEJISSAgICAgZG9fZmlsbCAgICAgICAgICAgICAgICAgOy8vICh4MCtwYXJ0Vyk+d2lkdGgKLQotICAgIENNUCAgICAgeTAsICMwCi0gICAgQkxUICAgICBkb19maWxsICAgICAgICAgICAgICAgICA7Ly8gKHkwIDwgMCkKLSAgICBMRFIgICAgIHBhcnRILCBbc3AsIzB4MjI0XSAgICAgIDsvLyBwYXJ0SGVpZ2h0Ci0gICAgQUREICAgICB0bXAyLCB5MCwgcGFydEggICAgICAgICA7Ly8gKHkwK3BhcnRIZWlnaHQpCi0gICAgTERSICAgICBoZWlnaHQsIFtzcCwjMHgyMWNdICAgICA7Ly8gaGVpZ2h0Ci0gICAgQ01QICAgICB0bXAyLCBoZWlnaHQKLSAgICBCTFMgICAgIHNraXBfZmlsbCAgICAgICAgICAgICAgIDsvLyBubyBvdmVyZmlsbCBuZWVkZWQKLQotCi1kb19maWxsCi0gICAgTERSICAgICBwYXJ0SCwgW3NwLCMweDIyNF0gICAgICA7Ly8gcGFydEhlaWdodAotICAgIExEUiAgICAgaGVpZ2h0LCBbc3AsIzB4MjFjXSAgICAgOy8vIGhlaWdodAotICAgIExEUiAgICAgcGFydFcsIFtzcCwjMHgyMjBdICAgICAgOy8vIHBhcnRXaWR0aAotICAgIEFERCAgICAgdG1wNCwgcGFydFcsICM1ICAgICAgICAgOy8vIHRtcDQgPSBwYXJ0VyArIDU7Ci0gICAgU1RNSUIgICBzcCwge2hlaWdodCwgdG1wNH0gICAgICA7Ly8gc3ArNCA9IGhlaWdodCwgc3ArOCA9IHBhcnRXaWR0aCs1Ci0gICAgU1RSICAgICBwYXJ0SCwgW3NwLCMweGNdICAgICAgICA7Ly8gc3ArYyA9IHBhcnRIZWlnaHQKLSAgICBTVFIgICAgIHRtcDQsIFtzcCwjMHgxMF0gICAgICAgIDsvLyBzcCsxMCA9IHBhcnRXaWR0aCs1Ci0gICAgTERSICAgICB3aWR0aCwgW3NwLCMweDIxOF0gICAgICA7Ly8gd2lkdGgKLSAgICBTVFIgICAgIHdpZHRoLCBbc3AsIzBdICAgICAgICAgIDsvLyBzcCswID0gd2lkdGgKLSAgICBBREQgICAgIGJ1ZmYsIHNwLCAjMHgyOCAgICAgICAgIDsvLyBidWZmID0gcDFbMjEqMjEvNCsxXQotICAgIEJMICAgICAgaDI2NGJzZEZpbGxCbG9jawotCi0gICAgTU9WICAgICB4MCwgIzAKLSAgICBTVFIgICAgIHgwLFtzcCwjMHgxZWNdICAgICAgICAgIDsvLyB4MCA9IDAKLSAgICBTVFIgICAgIHgwLFtzcCwjMHgxZjBdICAgICAgICAgIDsvLyB5MCA9IDAKLSAgICBBREQgICAgIHJlZixzcCwjMHgyOCAgICAgICAgICAgIDsvLyByZWYgPSBwMQotICAgIFNUUiAgICAgdG1wNCwgW3NwLCMweDIxOF0gICAgICAgOy8vIHdpZHRoID0gcGFydFdpZHRoKzUKLQotCi1za2lwX2ZpbGwKLSAgICBMRFIgICAgIHgwICxbc3AsIzB4MWVjXSAgICAgICAgIDsvLyB4MAotICAgIExEUiAgICAgeTAgLFtzcCwjMHgxZjBdICAgICAgICAgOy8vIHkwCi0gICAgTERSICAgICB3aWR0aCwgW3NwLCMweDIxOF0gICAgICA7Ly8gd2lkdGgKLSAgICBNTEEgICAgIHRtcDIsIHdpZHRoLCB5MCwgeDAgICAgIDsvLyB5MCp3aWR0aCt4MAotICAgIEFERCAgICAgcmVmLCByZWYsIHRtcDIgICAgICAgICAgOy8vIHJlZiArPSB5MCp3aWR0aCt4MAotICAgIEFERCAgICAgcmVmLCByZWYsICM4ICAgICAgICAgICAgOy8vIHJlZiA9IHJlZis4Ci0gICAgTERSICAgICBtYiwgW3NwLCAjMHgxZThdICAgICAgICA7Ly8gbWIKLQotICAgIDsvLyBwYWNrIHZhbHVlcyB0byBjb3VudCByZWdpc3RlcgotICAgIDsvLyBbMzE6MjhdIGxvb3BfeCAocGFydFdpZHRoLTEpCi0gICAgOy8vIFsyNzoyNF0gbG9vcF95IChwYXJ0SGVpZ2h0LTEpCi0gICAgOy8vIFsyMzoyMF0gcGFydFdpZHRoLTEKLSAgICA7Ly8gWzE5OjE2XSBwYXJ0SGVpZ2h0LTEKLSAgICA7Ly8gWzE1OjAwXSB3aWR0aAotICAgIE1PViAgICAgY291bnQsIHdpZHRoCi0gICAgU1VCICAgICBwYXJ0VywgcGFydFcsICMxOwotICAgIFNVQiAgICAgcGFydEgsIHBhcnRILCAjMTsKLSAgICBBREQgICAgIHRtcDIsIHBhcnRILCBwYXJ0VywgTFNMICM0Ci0gICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDIsIExTTCAjMTYKLQotCi0gICAgTERSICAgICBtdWx0XzIwXzAxLCA9IDB4MDAxNDAwMDEKLSAgICBMRFIgICAgIG11bHRfMjBfbTUsID0gMHgwMDE0RkZGQgotICAgIE1PViAgICAgcGx1czE2LCAjMTYKLSAgICBBTkQgICAgIHRtcDEsIGNvdW50LCAjMHgwMDBGMDAwMCAgICA7Ly8gcGFydEhlaWdodC0xCi0gICAgQU5EICAgICB0bXAzLCBjb3VudCwgIzB4MDBGMDAwMDAgICAgOy8vIHBhcnRXaWR0aC0xCi0gICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDEsIExTTCAjOAotbG9vcF95Ci0gICAgTERSICAgICB4XzNfMSwgW3JlZiwgIy04XQotICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAzLCBMU0wgIzgKLSAgICBMRFIgICAgIHhfN181LCBbcmVmLCAjLTRdCi0gICAgVVhUQjE2ICB4XzJfMCwgeF8zXzEKLSAgICBVWFRCMTYgIHhfM18xLCB4XzNfMSwgUk9SICM4Ci0gICAgVVhUQjE2ICB4XzZfNCwgeF83XzUKLQotbG9vcF94Ci0gICAgVVhUQjE2ICB4XzdfNSwgeF83XzUsIFJPUiAjOAotCi0gICAgU01MQUQgICB0bXAxLCB4XzJfMCwgbXVsdF8yMF8wMSwgcGx1czE2Ci0gICAgU01MQVRCICB0bXAzLCB4XzJfMCwgbXVsdF8yMF8wMSwgcGx1czE2Ci0gICAgU01MQVRCICB0bXAyLCB4XzJfMCwgbXVsdF8yMF9tNSwgcGx1czE2Ci0gICAgU01MQVRCICB0bXA0LCB4XzNfMSwgbXVsdF8yMF8wMSwgcGx1czE2Ci0KLSAgICBTTUxBRCAgIHRtcDEsIHhfM18xLCBtdWx0XzIwX201LCB0bXAxCi0gICAgU01MQVRCICB0bXAzLCB4XzNfMSwgbXVsdF8yMF9tNSwgdG1wMwotICAgIFNNTEFEICAgdG1wMiwgeF8zXzEsIG11bHRfMjBfMDEsIHRtcDIKLSAgICBMRFIgICAgIHhfM18xLCBbcmVmXSwgIzQKLSAgICBTTUxBRCAgIHRtcDQsIHhfNl80LCBtdWx0XzIwX201LCB0bXA0Ci0KLSAgICBTTUxBQkIgIHRtcDEsIHhfNl80LCBtdWx0XzIwX201LCB0bXAxCi0gICAgU01MQURYICB0bXAzLCB4XzZfNCwgbXVsdF8yMF9tNSwgdG1wMwotICAgIFNNTEFEWCAgdG1wMiwgeF82XzQsIG11bHRfMjBfMDEsIHRtcDIKLSAgICBTTUxBRFggIHRtcDQsIHhfN181LCBtdWx0XzIwX201LCB0bXA0Ci0KLSAgICBTTUxBQkIgIHRtcDEsIHhfN181LCBtdWx0XzIwXzAxLCB0bXAxCi0gICAgVVhUQjE2ICB4XzJfMCwgeF8zXzEKLSAgICBTTUxBQkIgIHRtcDIsIHhfN181LCBtdWx0XzIwX201LCB0bXAyCi0gICAgU01MQURYICB0bXAzLCB4XzdfNSwgbXVsdF8yMF8wMSwgdG1wMwotICAgIFNNTEFCQiAgdG1wNCwgeF8yXzAsIG11bHRfMjBfMDEsIHRtcDQKLQotICAgIE1PViAgICAgdG1wMiwgdG1wMiwgQVNSICM1Ci0gICAgTU9WICAgICB0bXAxLCB0bXAxLCBBU1IgIzUKLSAgICBQS0hCVCAgIHRtcDIsIHRtcDIsIHRtcDQsIExTTCAjKDE2LTUpCi0gICAgUEtIQlQgICB0bXAxLCB0bXAxLCB0bXAzLCBMU0wgIygxNi01KQotICAgIExEUiAgICAgdG1wNCwgW3NwLCAjMHgyMjhdCi0gICAgVVNBVDE2ICB0bXAyLCAjOCwgdG1wMgotICAgIFVTQVQxNiAgdG1wMSwgIzgsIHRtcDEKLSAgICBTVUIgICAgIHRtcDQsIHRtcDQsICMxMAotCi0gICAgU1VCUyAgICBjb3VudCwgY291bnQsICM0PDwyOAotICAgIExEUiAgICAgdG1wMywgW3JlZiwgdG1wNF0KLSAgICBPUlIgICAgIHRtcDEsIHRtcDEsIHRtcDIsIExTTCAjOAotCi07Ly8gcXVhcnRlciBwZWwgcG9zaXRpb24KLSAgICBMRFIgICAgIHRtcDIsID0gMHg4MDgwODA4MAotICAgIE1WTiAgICAgdG1wMywgdG1wMwotICAgIFVIU1VCOCAgdG1wMSwgdG1wMSwgdG1wMwotICAgIEVPUiAgICAgdG1wMSwgdG1wMSwgdG1wMgotICAgIFNUUiAgICAgdG1wMSwgW21iXSwgIzQKLQotICAgIEJDQyAgICAgbmV4dF95Ci0KLSAgICBVWFRCMTYgIHhfM18xLCB4XzNfMSwgUk9SICM4Ci0KLSAgICBTTUxBRCAgIHRtcDEsIHhfNl80LCBtdWx0XzIwXzAxLCBwbHVzMTYKLSAgICBTTUxBVEIgIHRtcDMsIHhfNl80LCBtdWx0XzIwXzAxLCBwbHVzMTYKLSAgICBTTUxBVEIgIHRtcDIsIHhfNl80LCBtdWx0XzIwX201LCBwbHVzMTYKLSAgICBTTUxBVEIgIHRtcDQsIHhfN181LCBtdWx0XzIwXzAxLCBwbHVzMTYKLQotICAgIFNNTEFEICAgdG1wMSwgeF83XzUsIG11bHRfMjBfbTUsIHRtcDEKLSAgICBTTUxBVEIgIHRtcDMsIHhfN181LCBtdWx0XzIwX201LCB0bXAzCi0gICAgU01MQUQgICB0bXAyLCB4XzdfNSwgbXVsdF8yMF8wMSwgdG1wMgotICAgIExEUiAgICAgeF83XzUsIFtyZWZdLCAjNAotICAgIFNNTEFEICAgdG1wNCwgeF8yXzAsIG11bHRfMjBfbTUsIHRtcDQKLQotICAgIFNNTEFCQiAgdG1wMSwgeF8yXzAsIG11bHRfMjBfbTUsIHRtcDEKLSAgICBTTUxBRFggIHRtcDMsIHhfMl8wLCBtdWx0XzIwX201LCB0bXAzCi0gICAgU01MQURYICB0bXAyLCB4XzJfMCwgbXVsdF8yMF8wMSwgdG1wMgotICAgIFNNTEFEWCAgdG1wNCwgeF8zXzEsIG11bHRfMjBfbTUsIHRtcDQKLQotICAgIFNNTEFCQiAgdG1wMSwgeF8zXzEsIG11bHRfMjBfMDEsIHRtcDEKLSAgICBVWFRCMTYgIHhfNl80LCB4XzdfNQotICAgIFNNTEFCQiAgdG1wMiwgeF8zXzEsIG11bHRfMjBfbTUsIHRtcDIKLSAgICBTTUxBRFggIHRtcDMsIHhfM18xLCBtdWx0XzIwXzAxLCB0bXAzCi0gICAgU01MQUJCICB0bXA0LCB4XzZfNCwgbXVsdF8yMF8wMSwgdG1wNAotCi0gICAgTU9WICAgICB0bXAyLCB0bXAyLCBBU1IgIzUKLSAgICBNT1YgICAgIHRtcDEsIHRtcDEsIEFTUiAjNQotICAgIFBLSEJUICAgdG1wMiwgdG1wMiwgdG1wNCwgTFNMICMoMTYtNSkKLSAgICBQS0hCVCAgIHRtcDEsIHRtcDEsIHRtcDMsIExTTCAjKDE2LTUpCi0gICAgTERSICAgICB0bXA0LCBbc3AsICMweDIyOF0KLSAgICBVU0FUMTYgIHRtcDIsICM4LCB0bXAyCi0gICAgVVNBVDE2ICB0bXAxLCAjOCwgdG1wMQotICAgIFNVQiAgICAgdG1wNCwgdG1wNCwgIzEwCi0KLSAgICBTVUJTICAgIGNvdW50LCBjb3VudCwgIzQ8PDI4Ci0gICAgTERSICAgICB0bXAzLCBbcmVmLCB0bXA0XQotICAgIE9SUiAgICAgdG1wMSwgdG1wMSwgdG1wMiwgTFNMICM4Ci0KLTsvLyBxdWFydGVyIHBlbAotICAgIExEUiAgICAgdG1wMiwgPSAweDgwODA4MDgwCi0gICAgTVZOICAgICB0bXAzLCB0bXAzCi0gICAgVUhTVUI4ICB0bXAxLCB0bXAxLCB0bXAzCi0gICAgRU9SICAgICB0bXAxLCB0bXAxLCB0bXAyCi0KLSAgICBTVFIgICAgIHRtcDEsIFttYl0sICM0Ci0gICAgQkNTICAgICBsb29wX3gKLQotbmV4dF95Ci0gICAgQU5EICAgICB0bXAzLCBjb3VudCwgIzB4MDBGMDAwMDAgICAgOy8vIHBhcnRXaWR0aC0xCi0gICAgU01MQUJCICByZWYsIGNvdW50LCBtdWx0XzIwXzAxLCByZWYgOy8vICt3aWR0aAotICAgIEFERFMgICAgbWIsIG1iLCAjMTYgICAgICAgICAgICAgICAgIDsvLyArMTYsIENhcnJ5PTAKLSAgICBTQkMgICAgIG1iLCBtYiwgdG1wMywgTFNSICMyMCAgICAgICA7Ly8gLShwYXJ0V2lkdGgtMSktMQotICAgIFNCQyAgICAgcmVmLCByZWYsIHRtcDMsIExTUiAjMjAgICAgIDsvLyAtKHBhcnRXaWR0aC0xKS0xCi0gICAgQUREUyAgICBjb3VudCwgY291bnQsICMoMTw8MjgpLSgxPDwyNCkKLSAgICBCR0UgICAgIGxvb3BfeQotCi0gICAgQUREICAgICBzcCxzcCwjMHgxZjQKLSAgICBMRE1GRCAgIHNwISwge3I0LXIxMSwgcGN9Ci0KLSAgICBFTkQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV9ob3JfdmVyX3F1YXJ0ZXIucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfaG9yX3Zlcl9xdWFydGVyLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNzliMzkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV9ob3JfdmVyX3F1YXJ0ZXIucworKysgL2Rldi9udWxsCkBAIC0xLDUzNiArMCwwIEBACi07IENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci07Ci07IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOwotOyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOwotOyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy0tCi07LS0gQWJzdHJhY3QgOiBBUk12NiBvcHRpbWl6ZWQgdmVyc2lvbiBvZiBoMjY0YnNkSW50ZXJwb2xhdGVIb3JWZXJRdWFydGVyIAotOy0tICAgICAgICAgICAgZnVuY3Rpb24KLTstLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi0gICAgSUYgOkRFRjogSDI2NERFQ19XSU5BU00KLSAgICAgICAgOy8vIFdlIGRvbnQgdXNlIFJFUVVJUkU4IGFuZCBQUkVTRVJWRTggZm9yIHdpbmFzbQotICAgIEVMU0UKLSAgICAgICAgUkVRVUlSRTgKLSAgICAgICAgUFJFU0VSVkU4Ci0gICAgRU5ESUYKLQotICAgIEFSRUEgICAgfC50ZXh0fCwgQ09ERQotCi07Ly8gaDI2NGJzZEludGVycG9sYXRlSG9yVmVyUXVhcnRlciByZWdpc3RlciBhbGxvY2F0aW9uCi0KLXJlZiAgICAgUk4gMAotCi1tYiAgICAgIFJOIDEKLWJ1ZmYgICAgUk4gMQotCi1jb3VudCAgIFJOIDIKLXgwICAgICAgUk4gMgotCi15MCAgICAgIFJOIDMKLXhfMl8wICAgUk4gMwotcmVzICAgICBSTiAzCi0KLXhfM18xICAgUk4gNAotdG1wMSAgICBSTiA0Ci0KLWhlaWdodCAgUk4gNQoteF82XzQgICBSTiA1Ci10bXAyICAgIFJOIDUKLQotcGFydFcgICBSTiA2Ci14XzdfNSAgIFJOIDYKLXRtcDMgICAgUk4gNgotCi1wYXJ0SCAgIFJOIDcKLXRtcDQgICAgUk4gNwotCi10bXA1ICAgIFJOIDgKLQotdG1wNiAgICBSTiA5Ci0KLXRtcGEgICAgUk4gMTAKLQotbXVsdF8yMF8wMSAgUk4gMTEKLXRtcGIgICAgICAgIFJOIDExCi0KLW11bHRfMjBfbTUgIFJOIDEyCi13aWR0aCAgICAgICBSTiAxMgotCi1wbHVzMTYgIFJOIDE0Ci0KLQotOy8vIGZ1bmN0aW9uIGV4cG9ydHMgYW5kIGltcG9ydHMKLQotICAgIElNUE9SVCAgaDI2NGJzZEZpbGxCbG9jawotCi0gICAgRVhQT1JUICBoMjY0YnNkSW50ZXJwb2xhdGVIb3JWZXJRdWFydGVyCi0KLTsvLyBIb3Jpem9udGFsIGZpbHRlciBhcHByb2FjaAotOy8vCi07Ly8gQmFzaWMgaWRlYSBpbiBob3Jpem9udGFsIGZpbHRlcmluZyBpcyB0byBhZGp1c3QgY29lZmZpY2llbnRzCi07Ly8gbGlrZSBiZWxvdy4gQ2FsY3VsYXRpb24gaXMgZG9uZSB3aXRoIDE2LWJpdCBtYXRocy4KLTsvLwotOy8vIFJlZyAgICAgeF8yXzAgICAgIHhfM18xICAgICB4XzZfNCAgICAgeF83XzUgICAgIHhfMl8wCi07Ly8gICAgICAgWyAgMiAgMCBdIFsgIDMgIDEgXSBbICA2ICA0IF0gWyAgNyAgNSBdIFsgMTAgIDggXSAuLi4KLTsvLyB5XzAgPSAgIDIwICAxICAgICAyMCAtNSAgICAgICAgLTUgICAgICAgICAxCi07Ly8geV8xID0gICAtNSAgICAgICAgMjAgIDEgICAgICAxIDIwICAgICAgICAtNQotOy8vIHlfMiA9ICAgIDEgICAgICAgIC01ICAgICAgICAtNSAyMCAgICAgIDEgMjAKLTsvLyB5XzMgPSAgICAgICAgICAgICAgMSAgICAgICAgMjAgLTUgICAgIC01IDIwICAgICAgICAgMQotCi0KLWgyNjRic2RJbnRlcnBvbGF0ZUhvclZlclF1YXJ0ZXIKLSAgICBTVE1GRCAgIHNwISwge3IwLXIxMSwgbHJ9Ci0gICAgU1VCICAgICBzcCwgc3AsICMweDFlNAotCi0gICAgQ01QICAgICB4MCwgIzAKLSAgICBCTFQgICAgIGRvX2ZpbGwgICAgICAgICAgICAgICAgIDsvLyAoeDAgPCAwKQotICAgIExEUiAgICAgcGFydFcsIFtzcCwjMHgyMjBdICAgICAgOy8vIHBhcnRXaWR0aAotICAgIExEUiAgICAgd2lkdGgsIFtzcCwjMHgyMThdICAgICAgOy8vIHdpZHRoCi0gICAgQUREICAgICB0bXBhLCB4MCwgcGFydFcgICAgICAgICA7Ly8gKHgwK3BhcnRXaWR0aCkKLSAgICBBREQgICAgIHRtcGEsIHRtcGEsICM1ICAgICAgICAgIDsvLyAoeDArcGFydFcrNSkKLSAgICBDTVAgICAgIHRtcGEsIHdpZHRoCi0gICAgQkhJICAgICBkb19maWxsICAgICAgICAgICAgICAgICA7Ly8gKHgwK3BhcnRXKT53aWR0aAotCi0gICAgQ01QICAgICB5MCwgIzAKLSAgICBCTFQgICAgIGRvX2ZpbGwgICAgICAgICAgICAgICAgIDsvLyAoeTAgPCAwKQotICAgIExEUiAgICAgcGFydEgsIFtzcCwjMHgyMjRdICAgICAgOy8vIHBhcnRIZWlnaHQKLSAgICBMRFIgICAgIGhlaWdodCwgW3NwLCMweDIxY10gICAgIDsvLyBoZWlnaHQKLSAgICBBREQgICAgIHRtcDUsIHkwLCBwYXJ0SCAgICAgICAgIDsvLyAoeTArcGFydEhlaWdodCkKLSAgICBBREQgICAgIHRtcDUsIHRtcDUsICM1ICAgICAgICAgIDsvLyAoeTArcGFydEgrNSkKLSAgICBDTVAgICAgIHRtcDUsIGhlaWdodAotICAgIEJMUyAgICAgc2tpcF9maWxsICAgICAgICAgICAgICAgOy8vIG5vIG92ZXJmaWxsIG5lZWRlZAotCi0KLWRvX2ZpbGwKLSAgICBMRFIgICAgIHBhcnRILCBbc3AsIzB4MjI0XSAgICAgIDsvLyBwYXJ0SGVpZ2h0Ci0gICAgTERSICAgICBwYXJ0VywgW3NwLCMweDIyMF0gICAgICA7Ly8gcGFydFdpZHRoCi0gICAgTERSICAgICBoZWlnaHQsIFtzcCwjMHgyMWNdICAgICA7Ly8gaGVpZ2h0Ci0gICAgQUREICAgICB0bXA1LCBwYXJ0SCwgIzUgICAgICAgICA7Ly8gdG1wNSA9IHBhcnRIICsgNQotICAgIEFERCAgICAgdG1wYSwgcGFydFcsICM1ICAgICAgICAgOy8vIHRtcGEgPSBwYXJ0VyArIDUKLSAgICBTVE1JQiAgIHNwLCB7aGVpZ2h0LCB0bXBhfSAgICAgIDsvLyBzcCs0ID0gaGVpZ2h0LCBzcCs4ID0gcGFydFdpZHRoKzUKLSAgICBMRFIgICAgIHdpZHRoLCBbc3AsIzB4MjE4XSAgICAgIDsvLyB3aWR0aAotICAgIFNUUiAgICAgdG1wNSwgW3NwLCMweGNdICAgICAgICAgOy8vIHNwK2MgPSBwYXJ0SGVpZ2h0KzUKLSAgICBTVFIgICAgIHRtcGEsIFtzcCwjMHgxMF0gICAgICAgIDsvLyBzcCsxMCA9IHBhcnRXaWR0aCs1Ci0gICAgU1RSICAgICB3aWR0aCwgW3NwLCMwXSAgICAgICAgICA7Ly8gc3ArMCA9IHdpZHRoCi0gICAgQUREICAgICBidWZmLCBzcCwgIzB4MjggICAgICAgICA7Ly8gYnVmZiA9IHAxWzIxKjIxLzQrMV0KLSAgICBCTCAgICAgIGgyNjRic2RGaWxsQmxvY2sKLQotICAgIE1PViAgICAgeDAsICMwCi0gICAgU1RSICAgICB4MCxbc3AsIzB4MWVjXSAgICAgICAgICA7Ly8geDAgPSAwCi0gICAgU1RSICAgICB4MCxbc3AsIzB4MWYwXSAgICAgICAgICA7Ly8geTAgPSAwCi0gICAgQUREICAgICByZWYsc3AsIzB4MjggICAgICAgICAgICA7Ly8gcmVmID0gcDEKLSAgICBTVFIgICAgIHRtcGEsIFtzcCwjMHgyMThdICAgICAgIDsvLyB3aWR0aCA9IHBhcnRXaWR0aCs1Ci0KLQotc2tpcF9maWxsCi0gICAgTERSICAgICB4MCAsW3NwLCMweDFlY10gICAgICAgICA7Ly8geDAKLSAgICBMRFIgICAgIHkwICxbc3AsIzB4MWYwXSAgICAgICAgIDsvLyB5MAotICAgIExEUiAgICAgd2lkdGgsIFtzcCwjMHgyMThdICAgICAgOy8vIHdpZHRoCi0gICAgTERSICAgICB0bXA2LCBbc3AsIzB4MjI4XSAgICAgICA7Ly8gaG9yVmVyT2Zmc2V0Ci0gICAgTERSICAgICBtYiwgW3NwLCAjMHgxZThdICAgICAgICA7Ly8gbWIKLSAgICBNTEEgICAgIHRtcDUsIHdpZHRoLCB5MCwgeDAgICAgIDsvLyB5MCp3aWR0aCt4MAotICAgIEFERCAgICAgcmVmLCByZWYsIHRtcDUgICAgICAgICAgOy8vIHJlZiArPSB5MCp3aWR0aCt4MAotICAgIFNUUiAgICAgcmVmLCBbc3AsICMweDFlNF0gICAgICAgOy8vIHN0b3JlICJyZWYiIGZvciB2ZXJ0aWNhbCBmaWx0ZXJpbmcKLSAgICBBTkQgICAgIHRtcDYsIHRtcDYsICMyICAgICAgICAgIDsvLyBjYWxjdWxhdGUgcmVmIGZvciBob3Jpem9udGFsIGZpbHRlcgotICAgIE1PViAgICAgdG1wYSwgIzIKLSAgICBBREQgICAgIHRtcDYsIHRtcGEsIHRtcDYsIExTUiAjMQotICAgIE1MQSAgICAgcmVmLCB0bXA2LCB3aWR0aCwgcmVmCi0gICAgQUREICAgICByZWYsIHJlZiwgIzggICAgICAgICAgICA7Ly8gcmVmID0gcmVmKzgKLQotICAgIDsvLyBwYWNrIHZhbHVlcyB0byBjb3VudCByZWdpc3RlcgotICAgIDsvLyBbMzE6MjhdIGxvb3BfeCAocGFydFdpZHRoLTEpCi0gICAgOy8vIFsyNzoyNF0gbG9vcF95IChwYXJ0SGVpZ2h0LTEpCi0gICAgOy8vIFsyMzoyMF0gcGFydFdpZHRoLTEKLSAgICA7Ly8gWzE5OjE2XSBwYXJ0SGVpZ2h0LTEKLSAgICA7Ly8gWzE1OjAwXSB3aWR0aAotICAgIE1PViAgICAgY291bnQsIHdpZHRoCi0gICAgU1VCICAgICBwYXJ0VywgcGFydFcsICMxOwotICAgIFNVQiAgICAgcGFydEgsIHBhcnRILCAjMTsKLSAgICBBREQgICAgIHRtcDUsIHBhcnRILCBwYXJ0VywgTFNMICM0Ci0gICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDUsIExTTCAjMTYKLQotCi0gICAgTERSICAgICBtdWx0XzIwXzAxLCA9IDB4MDAxNDAwMDEgICAgOy8vIGNvbnN0YW50IG11bHRpcGxpZXJzCi0gICAgTERSICAgICBtdWx0XzIwX201LCA9IDB4MDAxNEZGRkIgICAgOy8vIGNvbnN0YW50IG11bHRpcGxpZXJzCi0gICAgTU9WICAgICBwbHVzMTYsICMxNiAgICAgICAgICAgICAgICAgOy8vIGNvbnN0YW50IGZvciBhZGQKLSAgICBBTkQgICAgIHRtcDQsIGNvdW50LCAjMHgwMDBGMDAwMCAgICA7Ly8gcGFydEhlaWdodC0xCi0gICAgQU5EICAgICB0bXA2LCBjb3VudCwgIzB4MDBGMDAwMDAgICAgOy8vIHBhcnRXaWR0aC0xCi0gICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDQsIExTTCAjOCAgOy8vIHBhcnRILTEgdG8gbG93ZXIgcGFydCBvZiB0b3AgYnl0ZQotCi07Ly8gSE9SSVpPTlRBTCBQQVJUCi0KLWxvb3BfeV9ob3IKLSAgICBMRFIgICAgIHhfM18xLCBbcmVmLCAjLThdCi0gICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDYsIExTTCAjOCAgIDsvLyBwYXJ0Vy0xIHRvIHVwcGVyIHBhcnQgb2YgdG9wIGJ5dGUKLSAgICBMRFIgICAgIHhfN181LCBbcmVmLCAjLTRdCi0gICAgVVhUQjE2ICB4XzJfMCwgeF8zXzEKLSAgICBVWFRCMTYgIHhfM18xLCB4XzNfMSwgUk9SICM4Ci0gICAgVVhUQjE2ICB4XzZfNCwgeF83XzUKLQotbG9vcF94X2hvcgotICAgIFVYVEIxNiAgeF83XzUsIHhfN181LCBST1IgIzgKLQotICAgIFNNTEFEICAgdG1wNCwgeF8yXzAsIG11bHRfMjBfMDEsIHBsdXMxNgotICAgIFNNTEFUQiAgdG1wNiwgeF8yXzAsIG11bHRfMjBfMDEsIHBsdXMxNgotICAgIFNNTEFUQiAgdG1wNSwgeF8yXzAsIG11bHRfMjBfbTUsIHBsdXMxNgotICAgIFNNTEFUQiAgdG1wYSwgeF8zXzEsIG11bHRfMjBfMDEsIHBsdXMxNgotCi0gICAgU01MQUQgICB0bXA0LCB4XzNfMSwgbXVsdF8yMF9tNSwgdG1wNAotICAgIFNNTEFUQiAgdG1wNiwgeF8zXzEsIG11bHRfMjBfbTUsIHRtcDYKLSAgICBTTUxBRCAgIHRtcDUsIHhfM18xLCBtdWx0XzIwXzAxLCB0bXA1Ci0gICAgTERSICAgICB4XzNfMSwgW3JlZl0sICM0Ci0gICAgU01MQUQgICB0bXBhLCB4XzZfNCwgbXVsdF8yMF9tNSwgdG1wYQotCi0gICAgU01MQUJCICB0bXA0LCB4XzZfNCwgbXVsdF8yMF9tNSwgdG1wNAotICAgIFNNTEFEWCAgdG1wNiwgeF82XzQsIG11bHRfMjBfbTUsIHRtcDYKLSAgICBTTUxBRFggIHRtcDUsIHhfNl80LCBtdWx0XzIwXzAxLCB0bXA1Ci0gICAgU01MQURYICB0bXBhLCB4XzdfNSwgbXVsdF8yMF9tNSwgdG1wYQotCi0gICAgU01MQUJCICB0bXA0LCB4XzdfNSwgbXVsdF8yMF8wMSwgdG1wNAotICAgIFVYVEIxNiAgeF8yXzAsIHhfM18xCi0gICAgU01MQUJCICB0bXA1LCB4XzdfNSwgbXVsdF8yMF9tNSwgdG1wNQotICAgIFNNTEFEWCAgdG1wNiwgeF83XzUsIG11bHRfMjBfMDEsIHRtcDYKLSAgICBTTUxBQkIgIHRtcGEsIHhfMl8wLCBtdWx0XzIwXzAxLCB0bXBhCi0KLSAgICBNT1YgICAgIHRtcDUsIHRtcDUsIEFTUiAjNQotICAgIE1PViAgICAgdG1wNCwgdG1wNCwgQVNSICM1Ci0gICAgUEtIQlQgICB0bXA1LCB0bXA1LCB0bXBhLCBMU0wgIygxNi01KQotICAgIFBLSEJUICAgdG1wNCwgdG1wNCwgdG1wNiwgTFNMICMoMTYtNSkKLSAgICBVU0FUMTYgIHRtcDUsICM4LCB0bXA1Ci0gICAgVVNBVDE2ICB0bXA0LCAjOCwgdG1wNAotCi0gICAgU1VCUyAgICBjb3VudCwgY291bnQsICM0PDwyOAotICAgIE9SUiAgICAgdG1wNCwgdG1wNCwgdG1wNSwgTFNMICM4Ci0gICAgU1RSICAgICB0bXA0LCBbbWJdLCAjNAotICAgIEJDQyAgICAgbmV4dF95X2hvcgotCi0gICAgVVhUQjE2ICB4XzNfMSwgeF8zXzEsIFJPUiAjOAotCi0gICAgU01MQUQgICB0bXA0LCB4XzZfNCwgbXVsdF8yMF8wMSwgcGx1czE2Ci0gICAgU01MQVRCICB0bXA2LCB4XzZfNCwgbXVsdF8yMF8wMSwgcGx1czE2Ci0gICAgU01MQVRCICB0bXA1LCB4XzZfNCwgbXVsdF8yMF9tNSwgcGx1czE2Ci0gICAgU01MQVRCICB0bXBhLCB4XzdfNSwgbXVsdF8yMF8wMSwgcGx1czE2Ci0KLSAgICBTTUxBRCAgIHRtcDQsIHhfN181LCBtdWx0XzIwX201LCB0bXA0Ci0gICAgU01MQVRCICB0bXA2LCB4XzdfNSwgbXVsdF8yMF9tNSwgdG1wNgotICAgIFNNTEFEICAgdG1wNSwgeF83XzUsIG11bHRfMjBfMDEsIHRtcDUKLSAgICBMRFIgICAgIHhfN181LCBbcmVmXSwgIzQKLSAgICBTTUxBRCAgIHRtcGEsIHhfMl8wLCBtdWx0XzIwX201LCB0bXBhCi0KLSAgICBTTUxBQkIgIHRtcDQsIHhfMl8wLCBtdWx0XzIwX201LCB0bXA0Ci0gICAgU01MQURYICB0bXA2LCB4XzJfMCwgbXVsdF8yMF9tNSwgdG1wNgotICAgIFNNTEFEWCAgdG1wNSwgeF8yXzAsIG11bHRfMjBfMDEsIHRtcDUKLSAgICBTTUxBRFggIHRtcGEsIHhfM18xLCBtdWx0XzIwX201LCB0bXBhCi0KLSAgICBTTUxBQkIgIHRtcDQsIHhfM18xLCBtdWx0XzIwXzAxLCB0bXA0Ci0gICAgVVhUQjE2ICB4XzZfNCwgeF83XzUKLSAgICBTTUxBQkIgIHRtcDUsIHhfM18xLCBtdWx0XzIwX201LCB0bXA1Ci0gICAgU01MQURYICB0bXA2LCB4XzNfMSwgbXVsdF8yMF8wMSwgdG1wNgotICAgIFNNTEFCQiAgdG1wYSwgeF82XzQsIG11bHRfMjBfMDEsIHRtcGEKLQotICAgIE1PViAgICAgdG1wNSwgdG1wNSwgQVNSICM1Ci0gICAgTU9WICAgICB0bXA0LCB0bXA0LCBBU1IgIzUKLSAgICBQS0hCVCAgIHRtcDUsIHRtcDUsIHRtcGEsIExTTCAjKDE2LTUpCi0gICAgUEtIQlQgICB0bXA0LCB0bXA0LCB0bXA2LCBMU0wgIygxNi01KQotICAgIFVTQVQxNiAgdG1wNSwgIzgsIHRtcDUKLSAgICBVU0FUMTYgIHRtcDQsICM4LCB0bXA0Ci0KLSAgICBTVUJTICAgIGNvdW50LCBjb3VudCwgIzQ8PDI4Ci0gICAgT1JSICAgICB0bXA0LCB0bXA0LCB0bXA1LCBMU0wgIzgKLSAgICBTVFIgICAgIHRtcDQsIFttYl0sICM0Ci0gICAgQkNTICAgICBsb29wX3hfaG9yCi0KLW5leHRfeV9ob3IKLSAgICBBTkQgICAgIHRtcDYsIGNvdW50LCAjMHgwMEYwMDAwMCAgICAgICAgOy8vIHBhcnRXaWR0aC0xCi0gICAgU01MQUJCICByZWYsIGNvdW50LCBtdWx0XzIwXzAxLCByZWYgICAgIDsvLyArd2lkdGgKLSAgICBBRERTICAgIG1iLCBtYiwgIzE2ICAgICAgICAgICAgICAgICAgICAgOy8vICsxNiwgQ2Fycnk9MAotICAgIFNCQyAgICAgbWIsIG1iLCB0bXA2LCBMU1IgIzIwICAgICAgICAgICA7Ly8gLShwYXJ0V2lkdGgtMSktMQotICAgIFNCQyAgICAgcmVmLCByZWYsIHRtcDYsIExTUiAjMjAgICAgICAgICA7Ly8gLShwYXJ0V2lkdGgtMSktMQotICAgIEFERFMgICAgY291bnQsIGNvdW50LCAjKDE8PDI4KS0oMTw8MjQpICA7Ly8gZGVjcmVtZW50IGNvdW50ZXIgKHBhcnRXKQotICAgIEJHRSAgICAgbG9vcF95X2hvcgotCi0KLQotOy8vIFZFUlRJQ0FMIFBBUlQKLTsvLwotOy8vIEFwcHJvYWNoIHRvIHZlcnRpY2FsIGludGVycG9sYXRpb24KLTsvLwotOy8vIEludGVycG9sYXRpb24gaXMgZG9uZSBieSB1c2luZyAzMi1iaXQgbG9hZHMgYW5kIHN0b3JlcwotOy8vIGFuZCBieSB1c2luZyAxNiBiaXQgYXJpdGhtZXRpYy4gNHg0IGJsb2NrIGlzIHByb2Nlc3NlZAotOy8vIGluIGVhY2ggcm91bmQuCi07Ly8KLTsvLyB8YV8xMXxhXzExfGFfMTF8YV8xMXwuLi58YV8xbnxhXzFufGFfMW58YV8xbnwKLTsvLyB8Yl8xMXxiXzExfGJfMTF8Yl8xMXwuLi58Yl8xbnxiXzFufGJfMW58Yl8xbnwKLTsvLyB8Y18xMXxjXzExfGNfMTF8Y18xMXwuLi58Y18xbnxjXzFufGNfMW58Y18xbnwKLTsvLyB8ZF8xMXxkXzExfGRfMTF8ZF8xMXwuLi58ZF8xbnxkXzFufGRfMW58ZF8xbnwKLTsvLyAgICAgICAgICAgLi4KLTsvLyAgICAgICAgICAgLi4KLTsvLyB8YV9tMXxhX20xfGFfbTF8YV9tMXwuLi4KLTsvLyB8Yl9tMXxiX20xfGJfbTF8Yl9tMXwuLi4KLTsvLyB8Y19tMXxjX20xfGNfbTF8Y19tMXwuLi4KLTsvLyB8ZF9tMXxkX20xfGRfbTF8ZF9tMXwuLi4KLQotOy8vIEFwcHJvYWNoIHRvIGJpbGluZWFyIGludGVycG9sYXRpb24gdG8gcXVhcnRlciBwZWwgcG9zaXRpb24uCi07Ly8gNCBieXRlcyBhcmUgcHJvY2Vzc2VkIHBhcmFsbGVsCi07Ly8KLTsvLyBhbGdvcml0aG0gKGErYisxKS8yLiBSb3VkaW5nIHVwd2FyZHMgKzEgY2FuIGJlIGFjaGlldmVkIGJ5IAotOy8vIG5lZ2F0aW5nIHNlY29uZCBvcGVyYW5kIHRvIGdldCBvbmUncyBjb21wbGVtZW50IChpbnN0ZWFkIG9mIDIncykKLTsvLyBhbmQgdXNpbmcgc3VidHJhY3Rpb24sIEVPUiBpcyB1c2VkIHRvIGNvcnJlY3Qgc2lnbi4KLTsvLwotOy8vIE1WTiAgICAgYiwgYgotOy8vIFVIU1VCOCAgYSwgYSwgYgotOy8vIEVPUiAgICAgYSwgYSwgMHg4MDgwODA4MAotCi0KLSAgICBMRFIgICAgIHJlZiwgW3NwLCAjMHgxZTRdICAgICAgICAgICA7Ly8gcmVmCi0gICAgTERSICAgICB0bXBhLCBbc3AsICMweDIyOF0gICAgICAgICAgOy8vIGhvclZlck9mZnNldAotICAgIExEUiAgICAgbWIsIFtzcCwgIzB4MWU4XSAgICAgICAgICAgIDsvLyBtYgotICAgIExEUiAgICAgd2lkdGgsIFtzcCwgIzB4MjE4XSAgICAgICAgIDsvLyB3aWR0aAotICAgIEFERCAgICAgcmVmLCByZWYsICMyICAgICAgICAgICAgICAgIDsvLyBjYWxjdWxhdGUgY29ycmVjdCBwb3NpdGlvbgotICAgIEFORCAgICAgdG1wYSwgdG1wYSwgIzEKLSAgICBBREQgICAgIHJlZiwgcmVmLCB0bXBhCi0gICAgTERSICAgICBwbHVzMTYsID0gMHgwMDEwMDAxMCAgICAgICAgOy8vICsxNiB0byBsb3dlciBhbmQgdXBwZXJmIGhhbGZ3b3JkcwotICAgIEFORCAgICAgY291bnQsIGNvdW50LCAjMHgwMEZGRkZGRiAgIDsvLyBwYXJ0V2lkdGgtMQotCi0gICAgQU5EICAgICB0bXBhLCBjb3VudCwgIzB4MDAwRjAwMDAgICAgOy8vIHBhcnRIZWlnaHQtMQotICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXBhLCBMU0wgIzgKLQotbG9vcF95Ci0gICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDYsIExTTCAjOCAgOy8vIHBhcnRXaWR0aC0xCi0KLWxvb3BfeAotICAgIExEUiAgICAgdG1wMSwgW3JlZl0sIHdpZHRoICAgICA7Ly8gfGE0fGEzfGEyfGExfAotICAgIExEUiAgICAgdG1wMiwgW3JlZl0sIHdpZHRoICAgICA7Ly8gfGM0fGMzfGMyfGMxfAotICAgIExEUiAgICAgdG1wMywgW3JlZl0sIHdpZHRoICAgICA7Ly8gfGc0fGczfGcyfGcxfAotICAgIExEUiAgICAgdG1wNCwgW3JlZl0sIHdpZHRoICAgICA7Ly8gfG00fG0zfG0yfG0xfAotICAgIExEUiAgICAgdG1wNSwgW3JlZl0sIHdpZHRoICAgICA7Ly8gfHI0fHIzfHIyfHIxfAotICAgIExEUiAgICAgdG1wNiwgW3JlZl0sIHdpZHRoICAgICA7Ly8gfHQ0fHQzfHQyfHQxfAotCi0gICAgOy8vIGZpcnN0IGZvdXIgcGl4ZWxzIAotICAgIFVYVEIxNiAgdG1wYSwgdG1wMyAgICAgICAgICAgICAgICAgIDsvLyB8ZzN8ZzF8Ci0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA0ICAgICAgICAgICAgOy8vIHxnMyttM3xnMSttMXwKLSAgICBVWFRCMTYgIHRtcGIsIHRtcDIgICAgICAgICAgICAgICAgICA7Ly8gfGMzfGMxfAotICAgIEFERCAgICAgdG1wYSwgdG1wYSwgdG1wYSwgTFNMICMyICAgIDsvLyA1KEcrTSkKLQotICAgIFVYVEFCMTYgdG1wYiwgdG1wYiwgdG1wNSAgICAgICAgICAgIDsvLyB8YzMrcjN8YzErcjF8Ci0gICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDEgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBCi0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA2ICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrQStUCi0KLSAgICBBREQgICAgIHRtcGIsIHRtcGIsIHRtcGIsIExTTCAjMiAgICA7Ly8gNShDK1IpCi0gICAgU1NVQjE2ICB0bXBhLCB0bXBhLCB0bXBiICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrKEErVCktNShDK1IpCi0KLSAgICBVU0FUMTYgIHRtcGIsICMxMywgdG1wYSAgICAgICAgICAgICA7Ly8gc2F0dXJhdGUKLSAgICBMRFIgICAgIHJlcywgPSAweDAwRkYwMEZGCi0gICAgVVhUQjE2ICB0bXBhLCB0bXAzLCBST1IgIzggICAgICAgICAgOy8vIHxnNHxnMnwKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDQsIFJPUiAjOCAgICA7Ly8gfGc0K200fGcyK20yfAotICAgIEFORCAgICAgcmVzLCByZXMsIHRtcGIsIExTUiAjNSAgICAgIDsvLyBtYXNrIGFuZCBkaXZpZGUgYnkgMzIKLQotICAgIEFERCAgICAgdG1wYSwgdG1wYSwgdG1wYSwgTFNMICMyICAgIDsvLyA1KEcrTSkKLSAgICBVWFRCMTYgIHRtcGIsIHRtcDIsIFJPUiAjOCAgICAgICAgICA7Ly8gfGM0fGMyfAotICAgIEFERCAgICAgdG1wYSwgcGx1czE2LCB0bXBhLCBMU0wgIzIgIDsvLyAxNisyMChHK00pCi0gICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXA1LCBST1IgIzggICAgOy8vIHxjNCtyNHxjMityMnwKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDEsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBCi0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA2LCBST1IgIzggICAgOy8vIDE2KzIwKEcrTSkrQStUCi0KLSAgICBBREQgICAgIHRtcGIsIHRtcGIsIHRtcGIsIExTTCAjMiAgICA7Ly8gNShDK1IpCi0gICAgU1NVQjE2ICB0bXBhLCB0bXBhLCB0bXBiICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrKEErVCktNShDK1IpCi0KLSAgICBVU0FUMTYgIHRtcGIsICMxMywgdG1wYSAgICAgICAgICAgICA7Ly8gc2F0dXJhdGUKLSAgICBMRFIgICAgIHRtcDEsIFttYl0KLSAgICBMRFIgICAgIHRtcGEsID0gMHhGRjAwRkYwMAotICAgIE1WTiAgICAgdG1wMSwgdG1wMQotICAgIEFORCAgICAgdG1wYSwgdG1wYSwgdG1wYiwgTFNMICMzICAgIDsvLyBtYXNrIGFuZCBkaXZlZGUgYnkgMzIKLSAgICBPUlIgICAgIHJlcywgcmVzLCB0bXBhCi0KLSAgICBMRFIgICAgIHRtcGEsID0gMHg4MDgwODA4MAotICAgIFVIU1VCOCAgcmVzLCByZXMsIHRtcDEgICAgICAgICAgICAgIDsvLyBiaWxpbmVhciBpbnRlcnBvbGF0aW9uCi0gICAgTERSICAgICB0bXAxLCBbcmVmXSwgd2lkdGggICAgICAgICAgOy8vIGxvYWQgbmV4dCByb3cKLSAgICBFT1IgICAgIHJlcywgcmVzLCB0bXBhICAgICAgICAgICAgICA7Ly8gY29ycmVjdCBzaWduCi0KLSAgICBTVFIgICAgIHJlcywgW21iXSwgIzE2ICAgICAgICAgICAgICA7Ly8gbmV4dCByb3cgKG1iKQotCi0KLSAgICA7Ly8gdG1wMiA9IHxhNHxhM3xhMnxhMXwKLSAgICA7Ly8gdG1wMyA9IHxjNHxjM3xjMnxjMXwKLSAgICA7Ly8gdG1wNCA9IHxnNHxnM3xnMnxnMXwKLSAgICA7Ly8gdG1wNSA9IHxtNHxtM3xtMnxtMXwKLSAgICA7Ly8gdG1wNiA9IHxyNHxyM3xyMnxyMXwKLSAgICA7Ly8gdG1wMSA9IHx0NHx0M3x0Mnx0MXwKLQotICAgIDsvLyBzZWNvbmQgZm91ciBwaXhlbHMKLSAgICBVWFRCMTYgIHRtcGEsIHRtcDQgICAgICAgICAgICAgICAgICA7Ly8gfGczfGcxfAotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNSAgICAgICAgICAgIDsvLyB8ZzMrbTN8ZzErbTF8Ci0gICAgVVhUQjE2ICB0bXBiLCB0bXAzICAgICAgICAgICAgICAgICAgOy8vIHxjM3xjMXwKLSAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCi0gICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXA2ICAgICAgICAgICAgOy8vIHxjMytyM3xjMStyMXwKLSAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMiAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0EKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDEgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBK1QKLQotICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKLSAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKLQotICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQotICAgIExEUiAgICAgcmVzLCA9IDB4MDBGRjAwRkYKLSAgICBVWFRCMTYgIHRtcGEsIHRtcDQsIFJPUiAjOCAgICAgICAgICA7Ly8gfGc0fGcyfAotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNSwgUk9SICM4ICAgIDsvLyB8ZzQrbTR8ZzIrbTJ8Ci0gICAgQU5EICAgICByZXMsIHJlcywgdG1wYiwgTFNSICM1ICAgICAgOy8vIG1hc2sgYW5kIGRpdmlkZSBieSAzMgotCi0gICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQotICAgIFVYVEIxNiAgdG1wYiwgdG1wMywgUk9SICM4ICAgICAgICAgIDsvLyB8YzR8YzJ8Ci0gICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKLSAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDYsIFJPUiAjOCAgICA7Ly8gfGM0K3I0fGMyK3IyfAotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMiwgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0EKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDEsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBK1QKLQotICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKLSAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKLQotICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQotICAgIExEUiAgICAgdG1wMiwgW21iXQotICAgIExEUiAgICAgdG1wYSwgPSAweEZGMDBGRjAwCi0gICAgTVZOICAgICB0bXAyLCB0bXAyCi0KLSAgICBBTkQgICAgIHRtcGEsIHRtcGEsIHRtcGIsIExTTCAjMyAgICA7Ly8gbWFzayBhbmQgZGl2aWRlIGJ5IDMyCi0gICAgT1JSICAgICByZXMsIHJlcywgdG1wYQotICAgIExEUiAgICAgdG1wYSwgPSAweDgwODA4MDgwCi0gICAgVUhTVUI4ICByZXMsIHJlcywgdG1wMiAgICAgICAgICAgICAgOy8vIGJpbGluZWFyIGludGVycG9sYXRpb24KLSAgICBMRFIgICAgIHRtcDIsIFtyZWZdLCB3aWR0aCAgICAgICAgICA7Ly8gbG9hZCBuZXh0IHJvdwotICAgIEVPUiAgICAgcmVzLCByZXMsIHRtcGEgICAgICAgICAgICAgIDsvLyBjb3JyZWN0IHNpZ24KLSAgICBTVFIgICAgIHJlcywgW21iXSwgIzE2ICAgICAgICAgICAgICA7Ly8gbmV4dCByb3cKLQotICAgIDsvLyB0bXAzID0gfGE0fGEzfGEyfGExfAotICAgIDsvLyB0bXA0ID0gfGM0fGMzfGMyfGMxfAotICAgIDsvLyB0bXA1ID0gfGc0fGczfGcyfGcxfAotICAgIDsvLyB0bXA2ID0gfG00fG0zfG0yfG0xfAotICAgIDsvLyB0bXAxID0gfHI0fHIzfHIyfHIxfAotICAgIDsvLyB0bXAyID0gfHQ0fHQzfHQyfHQxfAotCi0gICAgOy8vIHRoaXJkIGZvdXIgcGl4ZWxzCi0gICAgVVhUQjE2ICB0bXBhLCB0bXA1ICAgICAgICAgICAgICAgICAgOy8vIHxnM3xnMXwKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDYgICAgICAgICAgICA7Ly8gfGczK20zfGcxK20xfAotICAgIFVYVEIxNiAgdG1wYiwgdG1wNCAgICAgICAgICAgICAgICAgIDsvLyB8YzN8YzF8Ci0gICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQotICAgIFVYVEFCMTYgdG1wYiwgdG1wYiwgdG1wMSAgICAgICAgICAgIDsvLyB8YzMrcjN8YzErcjF8Ci0gICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDMgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBCi0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAyICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrQStUCi0KLSAgICBBREQgICAgIHRtcGIsIHRtcGIsIHRtcGIsIExTTCAjMiAgICA7Ly8gNShDK1IpCi0gICAgU1NVQjE2ICB0bXBhLCB0bXBhLCB0bXBiICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrKEErVCktNShDK1IpCi0KLSAgICBVU0FUMTYgIHRtcGIsICMxMywgdG1wYSAgICAgICAgICAgICA7Ly8gc2F0dXJhdGUKLSAgICBMRFIgICAgIHJlcywgPSAweDAwRkYwMEZGCi0gICAgVVhUQjE2ICB0bXBhLCB0bXA1LCBST1IgIzggICAgICAgICAgOy8vIHxnNHxnMnwKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDYsIFJPUiAjOCAgICA7Ly8gfGc0K200fGcyK20yfAotICAgIEFORCAgICAgcmVzLCByZXMsIHRtcGIsIExTUiAjNSAgICAgIDsvLyBtYXNrIGFuZCBkaXZpZGUgYnkgMzIKLQotICAgIEFERCAgICAgdG1wYSwgdG1wYSwgdG1wYSwgTFNMICMyICAgIDsvLyA1KEcrTSkKLSAgICBVWFRCMTYgIHRtcGIsIHRtcDQsIFJPUiAjOCAgICAgICAgICA7Ly8gfGM0fGMyfAotICAgIEFERCAgICAgdG1wYSwgcGx1czE2LCB0bXBhLCBMU0wgIzIgIDsvLyAxNisyMChHK00pCi0gICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXAxLCBST1IgIzggICAgOy8vIHxjNCtyNHxjMityMnwKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDMsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBCi0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAyLCBST1IgIzggICAgOy8vIDE2KzIwKEcrTSkrQStUCi0KLQotICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKLSAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKLQotICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQotICAgIExEUiAgICAgdG1wMywgW21iXQotICAgIExEUiAgICAgdG1wYSwgPSAweEZGMDBGRjAwCi0gICAgTVZOICAgICB0bXAzLCB0bXAzCi0KLSAgICBBTkQgICAgIHRtcGEsIHRtcGEsIHRtcGIsIExTTCAjMyAgICA7Ly8gbWFzayBhbmQgZGl2aWRlIGJ5IDMyCi0gICAgT1JSICAgICByZXMsIHJlcywgdG1wYQotICAgIExEUiAgICAgdG1wYSwgPSAweDgwODA4MDgwCi0gICAgVUhTVUI4ICByZXMsIHJlcywgdG1wMyAgICAgICAgICAgICAgOy8vIGJpbGluZWFyIGludGVycG9sYXRpb24KLSAgICBMRFIgICAgIHRtcDMsIFtyZWZdICAgICAgICAgICAgICAgICA7Ly8gbG9hZCBuZXh0IHJvdwotICAgIEVPUiAgICAgcmVzLCByZXMsIHRtcGEgICAgICAgICAgICAgIDsvLyBjb3JyZWN0IHNpZ24KLSAgICBTVFIgICAgIHJlcywgW21iXSwgIzE2ICAgICAgICAgICAgICA7Ly8gbmV4dCByb3cKLQotICAgIDsvLyB0bXA0ID0gfGE0fGEzfGEyfGExfAotICAgIDsvLyB0bXA1ID0gfGM0fGMzfGMyfGMxfAotICAgIDsvLyB0bXA2ID0gfGc0fGczfGcyfGcxfAotICAgIDsvLyB0bXAxID0gfG00fG0zfG0yfG0xfAotICAgIDsvLyB0bXAyID0gfHI0fHIzfHIyfHIxfAotICAgIDsvLyB0bXAzID0gfHQ0fHQzfHQyfHQxfAotCi0gICAgOy8vIGZvdXJ0aCBmb3VyIHBpeGVscwotICAgIFVYVEIxNiAgdG1wYSwgdG1wNiAgICAgICAgICAgICAgICAgIDsvLyB8ZzN8ZzF8Ci0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAxICAgICAgICAgICAgOy8vIHxnMyttM3xnMSttMXwKLSAgICBVWFRCMTYgIHRtcGIsIHRtcDUgICAgICAgICAgICAgICAgICA7Ly8gfGMzfGMxfAotICAgIEFERCAgICAgdG1wYSwgdG1wYSwgdG1wYSwgTFNMICMyICAgIDsvLyA1KEcrTSkKLSAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDIgICAgICAgICAgICA7Ly8gfGMzK3IzfGMxK3IxfAotICAgIEFERCAgICAgdG1wYSwgcGx1czE2LCB0bXBhLCBMU0wgIzIgIDsvLyAxNisyMChHK00pCi0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA0ICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrQQotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMyAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0ErVAotCi0gICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQotICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQotCi0gICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCi0gICAgTERSICAgICByZXMsID0gMHgwMEZGMDBGRgotICAgIFVYVEIxNiAgdG1wYSwgdG1wNiwgUk9SICM4ICAgICAgICAgIDsvLyB8ZzR8ZzJ8Ci0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAxLCBST1IgIzggICAgOy8vIHxnNCttNHxnMittMnwKLSAgICBBTkQgICAgIHJlcywgcmVzLCB0bXBiLCBMU1IgIzUgICAgICA7Ly8gbWFzayBhbmQgZGl2aWRlIGJ5IDMyCi0KLSAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCi0gICAgVVhUQjE2ICB0bXBiLCB0bXA1LCBST1IgIzggICAgICAgICAgOy8vIHxjNHxjMnwKLSAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQotICAgIFVYVEFCMTYgdG1wYiwgdG1wYiwgdG1wMiwgUk9SICM4ICAgIDsvLyB8YzQrcjR8YzIrcjJ8Ci0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA0LCBST1IgIzggICAgOy8vIDE2KzIwKEcrTSkrQQotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMywgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0ErVAotCi0gICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQotICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQotCi0gICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCi0gICAgTERSICAgICB0bXA1LCBbbWJdCi0gICAgTERSICAgICB0bXA0LCA9IDB4RkYwMEZGMDAKLSAgICBNVk4gICAgIHRtcDUsIHRtcDUKLQotICAgIEFORCAgICAgdG1wYSwgdG1wNCwgdG1wYiwgTFNMICMzICAgIDsvLyBtYXNrIGFuZCBkaXZpZGUgYnkgMzIKLSAgICBPUlIgICAgIHJlcywgcmVzLCB0bXBhCi0gICAgTERSICAgICB0bXBhLCA9IDB4ODA4MDgwODAKLSAgICBVSFNVQjggIHJlcywgcmVzLCB0bXA1ICAgICAgICAgICAgICA7Ly8gYmlsaW5lYXIgaW50ZXJwb2xhdGlvbgotCi0gICAgOy8vIGRlY3JlbWVudCBsb29wX3ggY291bnRlcgotICAgIFNVQlMgICAgY291bnQsIGNvdW50LCAjNDw8MjggICAgICAgIDsvLyBkZWNyZW1lbnQgeCBsb29wIGNvdW50ZXIKLQotICAgIDsvLyBjYWxjdWxhdGUgInJlZiIgYWRkcmVzcyBmb3IgbmV4dCByb3VuZAotICAgIFNVQiAgICAgcmVmLCByZWYsIHdpZHRoLCBMU0wgIzMgICAgIDsvLyByZWYgLT0gOCp3aWR0aDsKLSAgICBBREQgICAgIHJlZiwgcmVmLCAjNCAgICAgICAgICAgICAgICA7Ly8gbmV4dCBjb2x1bW4gKDQgcGl4ZWxzKQotCi0gICAgRU9SICAgICByZXMsIHJlcywgdG1wYSAgICAgICAgICAgICAgOy8vIGNvcnJlY3Qgc2lnbgotICAgIFNUUiAgICAgcmVzLCBbbWJdLCAjLTQ0Ci0KLSAgICBCQ1MgICAgIGxvb3BfeAotCi0gICAgQUREUyAgICBtYiwgbWIsICM2NCAgICAgICAgICAgICAgICAgOy8vIHNldCBDYXJyeT0wCi0gICAgQUREICAgICByZWYsIHJlZiwgd2lkdGgsIExTTCAjMiAgICAgOy8vIHJlZiArPSA0KndpZHRoCi0gICAgQU5EICAgICB0bXA2LCBjb3VudCwgIzB4MDBGMDAwMDAgICAgOy8vIHBhcnRXaWR0aC0xCi0gICAgU0JDICAgICByZWYsIHJlZiwgdG1wNiwgTFNSICMyMCAgICAgOy8vIC0ocGFydFdpZHRoLTEpLTEKLSAgICBTQkMgICAgIG1iLCBtYiwgdG1wNiwgTFNSICMyMCAgICAgICA7Ly8gLShwYXJ0V2lkdGgtMSktMQotCi0gICAgQUREUyAgICBjb3VudCwgY291bnQsICMweEMgPDwgMjQgICAgOy8vIGRlY3JlbWVudCB5IGxvb3AgY291bnRlcgotICAgIEJHRSAgICAgbG9vcF95Ci0KLSAgICBBREQgICAgIHNwLCBzcCwgIzB4MWY0Ci0gICAgTERNRkQgICBzcCEsIHtyNC1yMTEsIHBjfQotCi0gICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX21pZF9ob3IucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfbWlkX2hvci5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODFhZWQ3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfbWlkX2hvci5zCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLTsgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QNCi07DQotOyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCi07IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi07IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLTsNCi07ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotOw0KLTsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLTsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi07IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLTsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLTsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi07LS0NCi07LS0gQWJzdHJhY3QgOiBBUk12NiBvcHRpbWl6ZWQgdmVyc2lvbiBob3Jpem9udGFsIHBhcnQgb2YgDQotOy0tICAgICAgICAgICAgaDI2NGJzZEludGVycG9sYXRlTWlkIGZ1bmN0aW9ucw0KLTstLQ0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotDQotICAgIElGIDpERUY6IEgyNjRERUNfV0lOQVNNDQotICAgICAgICA7Ly8gV2UgZG9udCB1c2UgUkVRVUlSRTggYW5kIFBSRVNFUlZFOCBmb3Igd2luYXNtDQotICAgIEVMU0UNCi0gICAgICAgIFJFUVVJUkU4DQotICAgICAgICBQUkVTRVJWRTgNCi0gICAgRU5ESUYNCi0NCi0gICAgQVJFQSAgICB8LnRleHR8LCBDT0RFDQotDQotDQotOy8vIFJlZ2lzdGVyIGFsbG9jYXRpb24NCi0NCi1yZWYgICAgIFJOIDAgICAgOy8vIHBvaW50ZXIgdG8gY3VycmVudCBwb3NpdGlvbiBpbiByZWZlcmVuY2UgaW1hZ2UNCi1tYiAgICAgIFJOIDEgICAgOy8vIHBvaW50ZXIgdG8gY3VycmVudCBwb3NpdGlvbiBpbiBpbnRlcnBvbGF0ZWQgbWINCi1jb3VudCAgIFJOIDIgICAgOy8vIGJpdC1wYWNrZWQgd2lkdGggYW5kIGNvdW50IHZhbHVlcw0KLQ0KLXhfMl8wICAgUk4gNA0KLXhfM18xICAgUk4gNQ0KLXhfNl80ICAgUk4gNg0KLXhfN181ICAgUk4gNw0KLQ0KLXRtcDEgICAgUk4gOA0KLXRtcDIgICAgUk4gOQ0KLXRtcDMgICAgUk4gMTANCi10bXA0ICAgIFJOIDExDQotDQotbXVsdF8yMF8wMSAgUk4gMTIgICA7Ly8gWzIwLCAgMV0NCi1tdWx0XzIwX201ICBSTiAxNCAgIDsvLyBbMjAsIC01XQ0KLQ0KLQ0KLSAgICAgICAgRVhQT1JUICBoMjY0YnNkSW50ZXJwb2xhdGVNaWRIb3JQYXJ0DQotDQotOy8vIEhvcml6b250YWwgZmlsdGVyIGFwcHJvYWNoDQotOy8vDQotOy8vIEJhc2ljIGlkZWEgaW4gaG9yaXpvbnRhbCBmaWx0ZXJpbmcgaXMgdG8gYWRqdXN0IGNvZWZmaWNpZW50cw0KLTsvLyBsaWtlIGJlbG93LiBDYWxjdWxhdGlvbiBpcyBkb25lIHdpdGggMTYtYml0IG1hdGhzLg0KLTsvLw0KLTsvLyBSZWcgICAgIHhfMl8wICAgICB4XzNfMSAgICAgeF82XzQgICAgIHhfN181ICAgICB4XzJfMA0KLTsvLyAgICAgICBbICAyICAwIF0gWyAgMyAgMSBdIFsgIDYgIDQgXSBbICA3ICA1IF0gWyAxMCAgOCBdIC4uLg0KLTsvLyB5XzAgPSAgIDIwICAxICAgICAyMCAtNSAgICAgICAgLTUgICAgICAgICAxDQotOy8vIHlfMSA9ICAgLTUgICAgICAgIDIwICAxICAgICAgMSAyMCAgICAgICAgLTUNCi07Ly8geV8yID0gICAgMSAgICAgICAgLTUgICAgICAgIC01IDIwICAgICAgMSAyMA0KLTsvLyB5XzMgPSAgICAgICAgICAgICAgMSAgICAgICAgMjAgLTUgICAgIC01IDIwICAgICAgICAgMQ0KLQ0KLQ0KLWgyNjRic2RJbnRlcnBvbGF0ZU1pZEhvclBhcnQNCi0gICAgU1RNRkQgICBzcCEsIHtyNC1yMTEsIGxyfQ0KLQ0KLSAgICA7Ly8gcGFjayB2YWx1ZXMgdG8gY291bnQgcmVnaXN0ZXINCi0gICAgOy8vIFszMToyOF0gbG9vcF94IChwYXJ0V2lkdGgtMSkNCi0gICAgOy8vIFsyNzoyNF0gbG9vcF95IChwYXJ0SGVpZ2h0LTEpDQotICAgIDsvLyBbMjM6MjBdIHBhcnRXaWR0aC0xDQotICAgIDsvLyBbMTk6MTZdIHBhcnRIZWlnaHQtMQ0KLSAgICA7Ly8gWzE1OjAwXSB3aWR0aA0KLQ0KLQ0KLSAgICBMRFIgICAgIG11bHRfMjBfMDEsID0gMHgwMDE0MDAwMQ0KLSAgICBMRFIgICAgIG11bHRfMjBfbTUsID0gMHgwMDE0RkZGQg0KLSAgICBBTkQgICAgIHRtcDMsIGNvdW50LCAjMHgwMDBGMDAwMCAgICA7Ly8gcGFydFdpZHRoLTENCi1sb29wX3kNCi0gICAgTERSICAgICB4XzNfMSwgW3JlZiwgIy04XQ0KLSAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMywgTFNMICMxMg0KLSAgICBMRFIgICAgIHhfN181LCBbcmVmLCAjLTRdDQotICAgIFVYVEIxNiAgeF8yXzAsIHhfM18xDQotICAgIFVYVEIxNiAgeF8zXzEsIHhfM18xLCBST1IgIzgNCi0gICAgVVhUQjE2ICB4XzZfNCwgeF83XzUNCi0NCi1sb29wX3gNCi0gICAgVVhUQjE2ICB4XzdfNSwgeF83XzUsIFJPUiAjOA0KLQ0KLSAgICBTTVVBRCAgIHRtcDEsIHhfMl8wLCBtdWx0XzIwXzAxDQotICAgIFNNVUxUQiAgdG1wMiwgeF8yXzAsIG11bHRfMjBfbTUNCi0gICAgU01VTFRCICB0bXAzLCB4XzJfMCwgbXVsdF8yMF8wMQ0KLSAgICBTTVVMVEIgIHRtcDQsIHhfM18xLCBtdWx0XzIwXzAxDQotDQotICAgIFNNTEFEICAgdG1wMSwgeF8zXzEsIG11bHRfMjBfbTUsIHRtcDENCi0gICAgU01MQUQgICB0bXAyLCB4XzNfMSwgbXVsdF8yMF8wMSwgdG1wMg0KLSAgICBTTUxBVEIgIHRtcDMsIHhfM18xLCBtdWx0XzIwX201LCB0bXAzDQotICAgIExEUiAgICAgeF8zXzEsIFtyZWZdLCAjNA0KLSAgICBTTUxBRCAgIHRtcDQsIHhfNl80LCBtdWx0XzIwX201LCB0bXA0DQotDQotICAgIFNNTEFCQiAgdG1wMSwgeF82XzQsIG11bHRfMjBfbTUsIHRtcDENCi0gICAgU01MQURYICB0bXAyLCB4XzZfNCwgbXVsdF8yMF8wMSwgdG1wMg0KLSAgICBTTUxBRFggIHRtcDMsIHhfNl80LCBtdWx0XzIwX201LCB0bXAzDQotICAgIFNNTEFEWCAgdG1wNCwgeF83XzUsIG11bHRfMjBfbTUsIHRtcDQNCi0NCi0gICAgU01MQUJCICB0bXAxLCB4XzdfNSwgbXVsdF8yMF8wMSwgdG1wMQ0KLSAgICBTTUxBQkIgIHRtcDIsIHhfN181LCBtdWx0XzIwX201LCB0bXAyDQotICAgIFVYVEIxNiAgeF8yXzAsIHhfM18xDQotICAgIFNNTEFEWCAgdG1wMywgeF83XzUsIG11bHRfMjBfMDEsIHRtcDMNCi0gICAgU01MQUJCICB0bXA0LCB4XzJfMCwgbXVsdF8yMF8wMSwgdG1wNA0KLQ0KLSAgICBTVUJTICAgIGNvdW50LCBjb3VudCwgIzQ8PDI4DQotICAgIFNUUiAgICAgdG1wMSwgW21iXSwgIzQNCi0gICAgU1RSICAgICB0bXAyLCBbbWJdLCAjNA0KLSAgICBTVFIgICAgIHRtcDMsIFttYl0sICM0DQotICAgIFNUUiAgICAgdG1wNCwgW21iXSwgIzQNCi0gICAgQkNDICAgICBuZXh0X3kNCi0NCi0gICAgVVhUQjE2ICB4XzNfMSwgeF8zXzEsIFJPUiAjOA0KLQ0KLSAgICBTTVVBRCAgIHRtcDEsIHhfNl80LCBtdWx0XzIwXzAxDQotICAgIFNNVUxUQiAgdG1wMiwgeF82XzQsIG11bHRfMjBfbTUNCi0gICAgU01VTFRCICB0bXAzLCB4XzZfNCwgbXVsdF8yMF8wMQ0KLSAgICBTTVVMVEIgIHRtcDQsIHhfN181LCBtdWx0XzIwXzAxDQotDQotICAgIFNNTEFEICAgdG1wMSwgeF83XzUsIG11bHRfMjBfbTUsIHRtcDENCi0gICAgU01MQUQgICB0bXAyLCB4XzdfNSwgbXVsdF8yMF8wMSwgdG1wMg0KLSAgICBTTUxBVEIgIHRtcDMsIHhfN181LCBtdWx0XzIwX201LCB0bXAzDQotICAgIExEUiAgICAgeF83XzUsIFtyZWZdLCAjNA0KLSAgICBTTUxBRCAgIHRtcDQsIHhfMl8wLCBtdWx0XzIwX201LCB0bXA0DQotDQotICAgIFNNTEFCQiAgdG1wMSwgeF8yXzAsIG11bHRfMjBfbTUsIHRtcDENCi0gICAgU01MQURYICB0bXAyLCB4XzJfMCwgbXVsdF8yMF8wMSwgdG1wMg0KLSAgICBTTUxBRFggIHRtcDMsIHhfMl8wLCBtdWx0XzIwX201LCB0bXAzDQotICAgIFNNTEFEWCAgdG1wNCwgeF8zXzEsIG11bHRfMjBfbTUsIHRtcDQNCi0NCi0gICAgU01MQUJCICB0bXAxLCB4XzNfMSwgbXVsdF8yMF8wMSwgdG1wMQ0KLSAgICBTTUxBQkIgIHRtcDIsIHhfM18xLCBtdWx0XzIwX201LCB0bXAyDQotICAgIFVYVEIxNiAgeF82XzQsIHhfN181DQotICAgIFNNTEFEWCAgdG1wMywgeF8zXzEsIG11bHRfMjBfMDEsIHRtcDMNCi0gICAgU01MQUJCICB0bXA0LCB4XzZfNCwgbXVsdF8yMF8wMSwgdG1wNA0KLQ0KLSAgICBTVUJTICAgIGNvdW50LCBjb3VudCwgIzQ8PDI4DQotICAgIFNUUiAgICAgdG1wMSwgW21iXSwgIzQNCi0gICAgU1RSICAgICB0bXAyLCBbbWJdLCAjNA0KLSAgICBTVFIgICAgIHRtcDMsIFttYl0sICM0DQotICAgIFNUUiAgICAgdG1wNCwgW21iXSwgIzQNCi0gICAgQkNTICAgICBsb29wX3gNCi0NCi1uZXh0X3kNCi0gICAgQU5EICAgICB0bXAzLCBjb3VudCwgIzB4MDAwRjAwMDAgICAgOy8vIHBhcnRXaWR0aC0xDQotICAgIFNNTEFCQiAgcmVmLCBjb3VudCwgbXVsdF8yMF8wMSwgcmVmICAgOy8vICt3aWR0aA0KLSAgICBTQkMgICAgIHJlZiwgcmVmLCB0bXAzLCBMU1IgIzE2ICAgOy8vIC0ocGFydFdpZHRoLTEpLTENCi0gICAgQUREUyAgICBjb3VudCwgY291bnQsICMoMTw8MjgpLSgxPDwyMCkNCi0gICAgQkdFICAgICBsb29wX3kNCi0NCi0gICAgTERNRkQgICBzcCEsIHtyNC1yMTEsIHBjfQ0KLQ0KLSAgICBFTkQNCi0NCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX3Zlcl9oYWxmLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX3Zlcl9oYWxmLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0NGZjNmYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV92ZXJfaGFsZi5zCisrKyAvZGV2L251bGwKQEAgLTEsMzQ3ICswLDAgQEAKLTsgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLTsKLTsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ci07ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ci07IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07LS0KLTstLSBBYnN0cmFjdCA6IEFSTXY2IG9wdGltaXplZCB2ZXJzaW9uIG9mIGgyNjRic2RJbnRlcnBvbGF0ZVZlckhhbGYgZnVuY3Rpb24KLTstLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi0gICAgSUYgOkRFRjogSDI2NERFQ19XSU5BU00KLSAgICAgICAgOy8vIFdlIGRvbnQgdXNlIFJFUVVJUkU4IGFuZCBQUkVTRVJWRTggZm9yIHdpbmFzbQotICAgIEVMU0UKLSAgICAgICAgUkVRVUlSRTgKLSAgICAgICAgUFJFU0VSVkU4Ci0gICAgRU5ESUYKLQotICAgIEFSRUEgICAgfC50ZXh0fCwgQ09ERQotCi07Ly8gaDI2NGJzZEludGVycG9sYXRlVmVySGFsZiByZWdpc3RlciBhbGxvY2F0aW9uCi0KLXJlZiAgICAgUk4gMAotCi1tYiAgICAgIFJOIDEKLWJ1ZmYgICAgUk4gMQotCi1jb3VudCAgIFJOIDIKLXgwICAgICAgUk4gMgotCi1yZXMgICAgIFJOIDMKLXkwICAgICAgUk4gMwotCi10bXAxICAgIFJOIDQKLQotdG1wMiAgICBSTiA1Ci1oZWlnaHQgIFJOIDUKLQotdG1wMyAgICBSTiA2Ci1wYXJ0VyAgIFJOIDYKLQotdG1wNCAgICBSTiA3Ci1wYXJ0SCAgIFJOIDcKLQotdG1wNSAgICBSTiA4Ci10bXA2ICAgIFJOIDkKLQotdG1wYSAgICBSTiAxMAotdG1wYiAgICBSTiAxMQotd2lkdGggICBSTiAxMgotCi1wbHVzMTYgIFJOIDE0Ci0KLQotOy8vIGZ1bmN0aW9uIGV4cG9ydHMgYW5kIGltcG9ydHMKLQotICAgIElNUE9SVCAgaDI2NGJzZEZpbGxCbG9jawotCi0gICAgRVhQT1JUICBoMjY0YnNkSW50ZXJwb2xhdGVWZXJIYWxmCi0KLTsvLyBBcHByb2FjaCB0byB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uCi07Ly8KLTsvLyBJbnRlcnBvbGF0aW9uIGlzIGRvbmUgYnkgdXNpbmcgMzItYml0IGxvYWRzIGFuZCBzdG9yZXMKLTsvLyBhbmQgYnkgdXNpbmcgMTYgYml0IGFyaXRobWV0aWMuIDR4NCBibG9jayBpcyBwcm9jZXNzZWQKLTsvLyBpbiBlYWNoIHJvdW5kLgotOy8vCi07Ly8gfGFfMTF8YV8xMXxhXzExfGFfMTF8Li4ufGFfMW58YV8xbnxhXzFufGFfMW58Ci07Ly8gfGJfMTF8Yl8xMXxiXzExfGJfMTF8Li4ufGJfMW58Yl8xbnxiXzFufGJfMW58Ci07Ly8gfGNfMTF8Y18xMXxjXzExfGNfMTF8Li4ufGNfMW58Y18xbnxjXzFufGNfMW58Ci07Ly8gfGRfMTF8ZF8xMXxkXzExfGRfMTF8Li4ufGRfMW58ZF8xbnxkXzFufGRfMW58Ci07Ly8gICAgICAgICAgIC4uCi07Ly8gICAgICAgICAgIC4uCi07Ly8gfGFfbTF8YV9tMXxhX20xfGFfbTF8Li4uCi07Ly8gfGJfbTF8Yl9tMXxiX20xfGJfbTF8Li4uCi07Ly8gfGNfbTF8Y19tMXxjX20xfGNfbTF8Li4uCi07Ly8gfGRfbTF8ZF9tMXxkX20xfGRfbTF8Li4uCi0KLWgyNjRic2RJbnRlcnBvbGF0ZVZlckhhbGYKLSAgICBTVE1GRCAgIHNwISwge3IwLXIxMSwgbHJ9Ci0gICAgU1VCICAgICBzcCwgc3AsICMweDFlNAotCi0gICAgQ01QICAgICB4MCwgIzAKLSAgICBCTFQgICAgIGRvX2ZpbGwgICAgICAgICAgICAgICAgIDsvLyAoeDAgPCAwKQotICAgIExEUiAgICAgcGFydFcsIFtzcCwjMHgyMjBdICAgICAgOy8vIHBhcnRXaWR0aAotICAgIEFERCAgICAgdG1wNSwgeDAsIHBhcnRXICAgICAgICAgOy8vICh4MCtwYXJ0V2lkdGgpCi0gICAgTERSICAgICB3aWR0aCwgW3NwLCMweDIxOF0gICAgICA7Ly8gd2lkdGgKLSAgICBDTVAgICAgIHRtcDUsIHdpZHRoCi0gICAgQkhJICAgICBkb19maWxsICAgICAgICAgICAgICAgICA7Ly8gKHgwK3BhcnRXKT53aWR0aAotCi0gICAgQ01QICAgICB5MCwgIzAKLSAgICBCTFQgICAgIGRvX2ZpbGwgICAgICAgICAgICAgICAgIDsvLyAoeTAgPCAwKQotICAgIExEUiAgICAgcGFydEgsIFtzcCwjMHgyMjRdICAgICAgOy8vIHBhcnRIZWlnaHQKLSAgICBBREQgICAgIHRtcDYsIHkwLCBwYXJ0SCAgICAgICAgIDsvLyAoeTArcGFydEhlaWdodCkKLSAgICBBREQgICAgIHRtcDYsIHRtcDYsICM1ICAgICAgICAgIDsvLyAoeTArcGFydEgrNSkKLSAgICBMRFIgICAgIGhlaWdodCwgW3NwLCMweDIxY10gICAgIDsvLyBoZWlnaHQKLSAgICBDTVAgICAgIHRtcDYsIGhlaWdodAotICAgIEJMUyAgICAgc2tpcF9maWxsICAgICAgICAgICAgICAgOy8vIG5vIG92ZXJmaWxsIG5lZWRlZAotCi0KLWRvX2ZpbGwKLSAgICBMRFIgICAgIHBhcnRILCBbc3AsIzB4MjI0XSAgICAgIDsvLyBwYXJ0SGVpZ2h0Ci0gICAgQUREICAgICB0bXA1LCBwYXJ0SCwgIzUgICAgICAgICA7Ly8gcjIgPSBwYXJ0SCArIDU7Ci0gICAgTERSICAgICBoZWlnaHQsIFtzcCwjMHgyMWNdICAgICA7Ly8gaGVpZ2h0Ci0gICAgTERSICAgICBwYXJ0VywgW3NwLCMweDIyMF0gICAgICA7Ly8gcGFydFdpZHRoCi0gICAgU1RNSUIgICBzcCwge2hlaWdodCwgcGFydFd9ICAgICA7Ly8gc3ArNCA9IGhlaWdodCwgc3ArOCA9IHBhcnRXaWR0aAotICAgIFNUUiAgICAgdG1wNSwgW3NwLCMweGNdICAgICAgICAgOy8vIHNwK2MgcGFydEhlaWdodCs1Ci0gICAgU1RSICAgICBwYXJ0VywgW3NwLCMweDEwXSAgICAgICA7Ly8gc3ArMTAgPSBwYXJ0V2lkdGgKLSAgICBMRFIgICAgIHdpZHRoLCBbc3AsIzB4MjE4XSAgICAgIDsvLyB3aWR0aAotICAgIFNUUiAgICAgd2lkdGgsIFtzcCwjMF0gICAgICAgICAgOy8vIHNwKzAgPSB3aWR0aAotICAgIEFERCAgICAgYnVmZiwgc3AsICMweDI4ICAgICAgICAgOy8vIGJ1ZmYgPSBwMVsyMSoyMS80KzFdCi0gICAgQkwgICAgICBoMjY0YnNkRmlsbEJsb2NrCi0KLSAgICBNT1YgICAgIHgwLCAjMAotICAgIFNUUiAgICAgeDAsW3NwLCMweDFlY10gICAgICAgICAgOy8vIHgwID0gMAotICAgIFNUUiAgICAgeDAsW3NwLCMweDFmMF0gICAgICAgICAgOy8vIHkwID0gMAotICAgIEFERCAgICAgcmVmLHNwLCMweDI4ICAgICAgICAgICAgOy8vIHJlZiA9IHAxCi0gICAgU1RSICAgICBwYXJ0VywgW3NwLCMweDIxOF0KLQotCi1za2lwX2ZpbGwKLSAgICBMRFIgICAgIHgwICxbc3AsIzB4MWVjXSAgICAgICAgIDsvLyB4MAotICAgIExEUiAgICAgeTAgLFtzcCwjMHgxZjBdICAgICAgICAgOy8vIHkwCi0gICAgTERSICAgICB3aWR0aCwgW3NwLCMweDIxOF0gICAgICA7Ly8gd2lkdGgKLSAgICBNTEEgICAgIHRtcDYsIHdpZHRoLCB5MCwgeDAgICAgIDsvLyB5MCp3aWR0aCt4MAotICAgIEFERCAgICAgcmVmLCByZWYsIHRtcDYgICAgICAgICAgOy8vIHJlZiArPSB5MCp3aWR0aCt4MAotICAgIExEUiAgICAgbWIsIFtzcCwgIzB4MWU4XSAgICAgICAgOy8vIG1iCi0KLSAgICBBREQgICAgIGNvdW50LCBwYXJ0VywgcGFydEgsIExTTCAjMTYgICAgOy8vIHxwYXJ0SHxwYXJ0V3wKLSAgICBMRFIgICAgIHRtcDUsID0gMHgwMDAxMDAwMQotICAgIFNTVUIxNiAgY291bnQsIGNvdW50LCB0bXA1OyAgICAgOy8vIHxwYXJ0SC0xfHBhcnRXLTF8Ci0gICAgTERSICAgICBwbHVzMTYsID0gMHgwMDEwMDAxMAotCi0gICAgQU5EICAgICB0bXAxLCBjb3VudCwgIzB4MDAwMDAwRkYgOy8vIHBhcnRXaWR0aAotCi0KLWxvb3BfeQotICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAxLCBMU0wgIzI0ICA7Ly8gcGFydFdpZHRoLTEgdG8gdG9wIGJ5dGUKLQotbG9vcF94Ci0gICAgTERSICAgICB0bXAxLCBbcmVmXSwgd2lkdGggICAgIDsvLyB8YTR8YTN8YTJ8YTF8Ci0gICAgTERSICAgICB0bXAyLCBbcmVmXSwgd2lkdGggICAgIDsvLyB8YzR8YzN8YzJ8YzF8Ci0gICAgTERSICAgICB0bXAzLCBbcmVmXSwgd2lkdGggICAgIDsvLyB8ZzR8ZzN8ZzJ8ZzF8Ci0gICAgTERSICAgICB0bXA0LCBbcmVmXSwgd2lkdGggICAgIDsvLyB8bTR8bTN8bTJ8bTF8Ci0gICAgTERSICAgICB0bXA1LCBbcmVmXSwgd2lkdGggICAgIDsvLyB8cjR8cjN8cjJ8cjF8Ci0gICAgTERSICAgICB0bXA2LCBbcmVmXSwgd2lkdGggICAgIDsvLyB8dDR8dDN8dDJ8dDF8Ci0KLSAgICA7Ly8gZmlyc3QgZm91ciBwaXhlbHMKLSAgICBVWFRCMTYgIHRtcGEsIHRtcDMgICAgICAgICAgICAgICAgICA7Ly8gfGczfGcxfAotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNCAgICAgICAgICAgIDsvLyB8ZzMrbTN8ZzErbTF8Ci0gICAgVVhUQjE2ICB0bXBiLCB0bXAyICAgICAgICAgICAgICAgICAgOy8vIHxjM3xjMXwKLSAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCi0KLSAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDUgICAgICAgICAgICA7Ly8gfGMzK3IzfGMxK3IxfAotICAgIEFERCAgICAgdG1wYSwgcGx1czE2LCB0bXBhLCBMU0wgIzIgIDsvLyAxNisyMChHK00pCi0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAxICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrQQotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNiAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0ErVAotCi0gICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQotICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQotCi0gICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCi0gICAgTERSICAgICByZXMsID0gMHgwMEZGMDBGRgotICAgIFVYVEIxNiAgdG1wYSwgdG1wMywgUk9SICM4ICAgICAgICAgIDsvLyB8ZzR8ZzJ8Ci0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA0LCBST1IgIzggICAgOy8vIHxnNCttNHxnMittMnwKLSAgICBBTkQgICAgIHJlcywgcmVzLCB0bXBiLCBMU1IgIzUgICAgICA7Ly8gbWFzayBhbmQgZGl2aWRlIGJ5IDMyCi0KLSAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCi0gICAgVVhUQjE2ICB0bXBiLCB0bXAyLCBST1IgIzggICAgICAgICAgOy8vIHxjNHxjMnwKLSAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQotICAgIFVYVEFCMTYgdG1wYiwgdG1wYiwgdG1wNSwgUk9SICM4ICAgIDsvLyB8YzQrcjR8YzIrcjJ8Ci0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAxLCBST1IgIzggICAgOy8vIDE2KzIwKEcrTSkrQQotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNiwgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0ErVAotCi0gICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQotICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQotCi0gICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCi0gICAgTERSICAgICB0bXAxLCBbcmVmXSwgd2lkdGgKLSAgICBMRFIgICAgIHRtcGEsID0gMHhGRjAwRkYwMAotCi0gICAgQU5EICAgICB0bXBhLCB0bXBhLCB0bXBiLCBMU0wgIzMgICAgOy8vIG1hc2sgYW5kIGRpdmVkZSBieSAzMgotICAgIE9SUiAgICAgcmVzLCByZXMsIHRtcGEKLSAgICBTVFIgICAgIHJlcywgW21iXSwgIzE2ICAgICAgICAgICAgICA7Ly8gbmV4dCByb3cgKG1iKQotCi0gICAgOy8vIHRtcDIgPSB8YTR8YTN8YTJ8YTF8Ci0gICAgOy8vIHRtcDMgPSB8YzR8YzN8YzJ8YzF8Ci0gICAgOy8vIHRtcDQgPSB8ZzR8ZzN8ZzJ8ZzF8Ci0gICAgOy8vIHRtcDUgPSB8bTR8bTN8bTJ8bTF8Ci0gICAgOy8vIHRtcDYgPSB8cjR8cjN8cjJ8cjF8Ci0gICAgOy8vIHRtcDEgPSB8dDR8dDN8dDJ8dDF8Ci0KLSAgICA7Ly8gc2Vjb25kIGZvdXIgcGl4ZWxzCi0gICAgVVhUQjE2ICB0bXBhLCB0bXA0ICAgICAgICAgICAgICAgICAgOy8vIHxnM3xnMXwKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDUgICAgICAgICAgICA7Ly8gfGczK20zfGcxK20xfAotICAgIFVYVEIxNiAgdG1wYiwgdG1wMyAgICAgICAgICAgICAgICAgIDsvLyB8YzN8YzF8Ci0gICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQotICAgIFVYVEFCMTYgdG1wYiwgdG1wYiwgdG1wNiAgICAgICAgICAgIDsvLyB8YzMrcjN8YzErcjF8Ci0gICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBCi0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAxICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrQStUCi0KLSAgICBBREQgICAgIHRtcGIsIHRtcGIsIHRtcGIsIExTTCAjMiAgICA7Ly8gNShDK1IpCi0gICAgU1NVQjE2ICB0bXBhLCB0bXBhLCB0bXBiICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrKEErVCktNShDK1IpCi0KLSAgICBVU0FUMTYgIHRtcGIsICMxMywgdG1wYSAgICAgICAgICAgICA7Ly8gc2F0dXJhdGUKLSAgICBMRFIgICAgIHJlcywgPSAweDAwRkYwMEZGCi0gICAgVVhUQjE2ICB0bXBhLCB0bXA0LCBST1IgIzggICAgICAgICAgOy8vIHxnNHxnMnwKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDUsIFJPUiAjOCAgICA7Ly8gfGc0K200fGcyK20yfAotICAgIEFORCAgICAgcmVzLCByZXMsIHRtcGIsIExTUiAjNSAgICAgIDsvLyBtYXNrIGFuZCBkaXZpZGUgYnkgMzIKLQotICAgIEFERCAgICAgdG1wYSwgdG1wYSwgdG1wYSwgTFNMICMyICAgIDsvLyA1KEcrTSkKLSAgICBVWFRCMTYgIHRtcGIsIHRtcDMsIFJPUiAjOCAgICAgICAgICA7Ly8gfGM0fGMyfAotICAgIEFERCAgICAgdG1wYSwgcGx1czE2LCB0bXBhLCBMU0wgIzIgIDsvLyAxNisyMChHK00pCi0gICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXA2LCBST1IgIzggICAgOy8vIHxjNCtyNHxjMityMnwKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDIsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBCi0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAxLCBST1IgIzggICAgOy8vIDE2KzIwKEcrTSkrQStUCi0KLSAgICBBREQgICAgIHRtcGIsIHRtcGIsIHRtcGIsIExTTCAjMiAgICA7Ly8gNShDK1IpCi0gICAgU1NVQjE2ICB0bXBhLCB0bXBhLCB0bXBiICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrKEErVCktNShDK1IpCi0KLSAgICBVU0FUMTYgIHRtcGIsICMxMywgdG1wYSAgICAgICAgICAgICA7Ly8gc2F0dXJhdGUKLSAgICBMRFIgICAgIHRtcDIsIFtyZWZdLCB3aWR0aAotICAgIExEUiAgICAgdG1wYSwgPSAweEZGMDBGRjAwCi0KLSAgICBBTkQgICAgIHRtcGEsIHRtcGEsIHRtcGIsIExTTCAjMyAgICA7Ly8gbWFzayBhbmQgZGl2aWRlIGJ5IDMyCi0gICAgT1JSICAgICByZXMsIHJlcywgdG1wYQotICAgIFNUUiAgICAgcmVzLCBbbWJdLCAjMTYgICAgICAgICAgICAgIDsvLyBuZXh0IHJvdwotCi0gICAgOy8vIHRtcDMgPSB8YTR8YTN8YTJ8YTF8Ci0gICAgOy8vIHRtcDQgPSB8YzR8YzN8YzJ8YzF8Ci0gICAgOy8vIHRtcDUgPSB8ZzR8ZzN8ZzJ8ZzF8Ci0gICAgOy8vIHRtcDYgPSB8bTR8bTN8bTJ8bTF8Ci0gICAgOy8vIHRtcDEgPSB8cjR8cjN8cjJ8cjF8Ci0gICAgOy8vIHRtcDIgPSB8dDR8dDN8dDJ8dDF8Ci0KLSAgICA7Ly8gdGhpcmQgZm91ciBwaXhlbHMKLSAgICBVWFRCMTYgIHRtcGEsIHRtcDUgICAgICAgICAgICAgICAgICA7Ly8gfGczfGcxfAotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNiAgICAgICAgICAgIDsvLyB8ZzMrbTN8ZzErbTF8Ci0gICAgVVhUQjE2ICB0bXBiLCB0bXA0ICAgICAgICAgICAgICAgICAgOy8vIHxjM3xjMXwKLSAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCi0gICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXAxICAgICAgICAgICAgOy8vIHxjMytyM3xjMStyMXwKLSAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMyAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0EKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBK1QKLQotICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKLSAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKLQotICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQotICAgIExEUiAgICAgcmVzLCA9IDB4MDBGRjAwRkYKLSAgICBVWFRCMTYgIHRtcGEsIHRtcDUsIFJPUiAjOCAgICAgICAgICA7Ly8gfGc0fGcyfAotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNiwgUk9SICM4ICAgIDsvLyB8ZzQrbTR8ZzIrbTJ8Ci0gICAgQU5EICAgICByZXMsIHJlcywgdG1wYiwgTFNSICM1ICAgICAgOy8vIG1hc2sgYW5kIGRpdmlkZSBieSAzMgotCi0gICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQotICAgIFVYVEIxNiAgdG1wYiwgdG1wNCwgUk9SICM4ICAgICAgICAgIDsvLyB8YzR8YzJ8Ci0gICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKLSAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDEsIFJPUiAjOCAgICA7Ly8gfGM0K3I0fGMyK3IyfAotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMywgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0EKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDIsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBK1QKLQotCi0gICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQotICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQotCi0gICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCi0gICAgTERSICAgICB0bXAzLCBbcmVmXQotICAgIExEUiAgICAgdG1wYSwgPSAweEZGMDBGRjAwCi0KLSAgICA7Ly8gZGVjcmVtZW50IGxvb3BfeCBjb3VudGVyCi0gICAgU1VCUyAgICBjb3VudCwgY291bnQsICM0PDwyNCAgICAgICAgOy8vIChwYXJ0V2lkdGgtMSkgLT0gNDsKLQotICAgIEFORCAgICAgdG1wYSwgdG1wYSwgdG1wYiwgTFNMICMzICAgIDsvLyBtYXNrIGFuZCBkaXZpZGUgYnkgMzIKLSAgICBPUlIgICAgIHJlcywgcmVzLCB0bXBhCi0gICAgU1RSICAgICByZXMsIFttYl0sICMxNiAgICAgICAgICAgICAgOy8vIG5leHQgcm93Ci0KLSAgICA7Ly8gdG1wNCA9IHxhNHxhM3xhMnxhMXwKLSAgICA7Ly8gdG1wNSA9IHxjNHxjM3xjMnxjMXwKLSAgICA7Ly8gdG1wNiA9IHxnNHxnM3xnMnxnMXwKLSAgICA7Ly8gdG1wMSA9IHxtNHxtM3xtMnxtMXwKLSAgICA7Ly8gdG1wMiA9IHxyNHxyM3xyMnxyMXwKLSAgICA7Ly8gdG1wMyA9IHx0NHx0M3x0Mnx0MXwKLQotICAgIDsvLyBmb3VydGggZm91ciBwaXhlbHMKLSAgICBVWFRCMTYgIHRtcGEsIHRtcDYgICAgICAgICAgICAgICAgICA7Ly8gfGczfGcxfAotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMSAgICAgICAgICAgIDsvLyB8ZzMrbTN8ZzErbTF8Ci0gICAgVVhUQjE2ICB0bXBiLCB0bXA1ICAgICAgICAgICAgICAgICAgOy8vIHxjM3xjMXwKLSAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCi0gICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXAyICAgICAgICAgICAgOy8vIHxjMytyM3xjMStyMXwKLSAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNCAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0EKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDMgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBK1QKLQotICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKLSAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKLQotICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQotICAgIExEUiAgICAgcmVzLCA9IDB4MDBGRjAwRkYKLSAgICBVWFRCMTYgIHRtcGEsIHRtcDYsIFJPUiAjOCAgICAgICAgICA7Ly8gfGc0fGcyfAotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMSwgUk9SICM4ICAgIDsvLyB8ZzQrbTR8ZzIrbTJ8Ci0gICAgQU5EICAgICByZXMsIHJlcywgdG1wYiwgTFNSICM1ICAgICAgOy8vIG1hc2sgYW5kIGRpdmlkZSBieSAzMgotCi0gICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQotICAgIFVYVEIxNiAgdG1wYiwgdG1wNSwgUk9SICM4ICAgICAgICAgIDsvLyB8YzR8YzJ8Ci0gICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKLSAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDIsIFJPUiAjOCAgICA7Ly8gfGM0K3I0fGMyK3IyfAotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNCwgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0EKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDMsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBK1QKLQotICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKLSAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKLQotICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQotICAgIExEUiAgICAgdG1wNCwgPSAweEZGMDBGRjAwCi0KLSAgICA7Ly8gY2FsY3VsYXRlICJyZWYiIGFkZHJlc3MgZm9yIG5leHQgcm91bmQKLSAgICBTVUIgICAgIHJlZiwgcmVmLCB3aWR0aCwgTFNMICMzICAgICA7Ly8gcmVmIC09IDgqd2lkdGg7Ci0gICAgQUREICAgICByZWYsIHJlZiwgIzQ7ICAgICAgICAgICAgICAgOy8vIG5leHQgY29sdW1uICg0IHBpeGVscykKLSAgICBBTkQgICAgIHRtcGEsIHRtcDQsIHRtcGIsIExTTCAjMyAgICA7Ly8gbWFzayBhbmQgZGl2aWRlIGJ5IDMyCi0gICAgT1JSICAgICByZXMsIHJlcywgdG1wYQotICAgIFNUUiAgICAgcmVzLCBbbWJdLCAjLTQ0Ci0KLSAgICBCQ1MgICAgIGxvb3BfeAotCi0gICAgQUREUyAgICBjb3VudCwgY291bnQsICMyNTI8PDE2ICAgICAgOy8vIChwYXJ0SGVpZ2h0LTEpIC09IDQ7Ci0gICAgQUREICAgICByZWYsIHJlZiwgd2lkdGgsIExTTCAjMiAgICAgOy8vIHJlZiArPSA0KndpZHRoCi0gICAgQU5EICAgICB0bXAxLCBjb3VudCwgIzB4MDAwMDAwRkYgICAgOy8vIHBhcnRXaWR0aC0xCi0gICAgQUREICAgICB0bXAyLCB0bXAxLCAjMSAgICAgICAgICAgICAgOy8vIHBhcnRXaWR0aAotICAgIFNVQiAgICAgcmVmLCByZWYsIHRtcDIgICAgICAgICAgICAgIDsvLyByZWYgLT0gcGFydFdpZHRoCi0gICAgQUREICAgICBtYiwgbWIsICM2NDsKLSAgICBTVUIgICAgIG1iLCBtYiwgdG1wMjsgICAgICAgICAgICAgICA7Ly8gbWIgLT0gcGFydFdpZHRoCi0gICAgQkdFICAgICBsb29wX3kKLQotICAgIEFERCAgICAgc3Asc3AsIzB4MWY0Ci0gICAgTERNRkQgICBzcCEsIHtyNC1yMTEsIHBjfQotCi0gICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX3Zlcl9xdWFydGVyLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX3Zlcl9xdWFydGVyLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNjZjODUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV92ZXJfcXVhcnRlci5zCisrKyAvZGV2L251bGwKQEAgLTEsMzc0ICswLDAgQEAKLTsgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLTsKLTsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ci07ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ci07IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07LS0KLTstLSBBYnN0cmFjdCA6IEFSTXY2IG9wdGltaXplZCB2ZXJzaW9uIG9mIGgyNjRic2RJbnRlcnBvbGF0ZVZlclF1YXJ0ZXIgZnVuY3Rpb24KLTstLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIElGIDpERUY6IEgyNjRERUNfV0lOQVNNCi0gICAgICAgIDsvLyBXZSBkb250IHVzZSBSRVFVSVJFOCBhbmQgUFJFU0VSVkU4IGZvciB3aW5hc20KLSAgICBFTFNFCi0gICAgICAgIFJFUVVJUkU4Ci0gICAgICAgIFBSRVNFUlZFOAotICAgIEVORElGCi0KLSAgICBBUkVBICAgIHwudGV4dHwsIENPREUKLQotOy8vIGgyNjRic2RJbnRlcnBvbGF0ZVZlclF1YXJ0ZXIgcmVnaXN0ZXIgYWxsb2NhdGlvbgotCi1yZWYgICAgIFJOIDAKLQotbWIgICAgICBSTiAxCi1idWZmICAgIFJOIDEKLQotY291bnQgICBSTiAyCi14MCAgICAgIFJOIDIKLQotcmVzICAgICBSTiAzCi15MCAgICAgIFJOIDMKLQotdG1wMSAgICBSTiA0Ci0KLXRtcDIgICAgUk4gNQotaGVpZ2h0ICBSTiA1Ci0KLXRtcDMgICAgUk4gNgotcGFydFcgICBSTiA2Ci0KLXRtcDQgICAgUk4gNwotcGFydEggICBSTiA3Ci0KLXRtcDUgICAgUk4gOAotdG1wNiAgICBSTiA5Ci0KLXRtcGEgICAgUk4gMTAKLXRtcGIgICAgUk4gMTEKLXdpZHRoICAgUk4gMTIKLQotcGx1czE2ICBSTiAxNAotCi0KLTsvLyBmdW5jdGlvbiBleHBvcnRzIGFuZCBpbXBvcnRzCi0KLSAgICBJTVBPUlQgIGgyNjRic2RGaWxsQmxvY2sKLQotICAgIEVYUE9SVCAgaDI2NGJzZEludGVycG9sYXRlVmVyUXVhcnRlcgotCi07Ly8gQXBwcm9hY2ggdG8gdmVydGljYWwgaW50ZXJwb2xhdGlvbgotOy8vCi07Ly8gSW50ZXJwb2xhdGlvbiBpcyBkb25lIGJ5IHVzaW5nIDMyLWJpdCBsb2FkcyBhbmQgc3RvcmVzCi07Ly8gYW5kIGJ5IHVzaW5nIDE2IGJpdCBhcml0aG1ldGljLiA0eDQgYmxvY2sgaXMgcHJvY2Vzc2VkCi07Ly8gaW4gZWFjaCByb3VuZC4KLTsvLwotOy8vIHxhXzExfGFfMTF8YV8xMXxhXzExfC4uLnxhXzFufGFfMW58YV8xbnxhXzFufAotOy8vIHxiXzExfGJfMTF8Yl8xMXxiXzExfC4uLnxiXzFufGJfMW58Yl8xbnxiXzFufAotOy8vIHxjXzExfGNfMTF8Y18xMXxjXzExfC4uLnxjXzFufGNfMW58Y18xbnxjXzFufAotOy8vIHxkXzExfGRfMTF8ZF8xMXxkXzExfC4uLnxkXzFufGRfMW58ZF8xbnxkXzFufAotOy8vICAgICAgICAgICAuLgotOy8vICAgICAgICAgICAuLgotOy8vIHxhX20xfGFfbTF8YV9tMXxhX20xfC4uLgotOy8vIHxiX20xfGJfbTF8Yl9tMXxiX20xfC4uLgotOy8vIHxjX20xfGNfbTF8Y19tMXxjX20xfC4uLgotOy8vIHxkX20xfGRfbTF8ZF9tMXxkX20xfC4uLgotCi1oMjY0YnNkSW50ZXJwb2xhdGVWZXJRdWFydGVyCi0gICAgU1RNRkQgICBzcCEsIHtyMC1yMTEsIGxyfQotICAgIFNVQiAgICAgc3AsIHNwLCAjMHgxZTQKLQotICAgIENNUCAgICAgeDAsICMwCi0gICAgQkxUICAgICBkb19maWxsICAgICAgICAgICAgICAgICA7Ly8gKHgwIDwgMCkKLSAgICBMRFIgICAgIHBhcnRXLCBbc3AsIzB4MjIwXSAgICAgIDsvLyBwYXJ0V2lkdGgKLSAgICBBREQgICAgIHRtcDUsIHgwLCBwYXJ0VyAgICAgICAgIDsvLyAoeDArcGFydFdpZHRoKQotICAgIExEUiAgICAgd2lkdGgsIFtzcCwjMHgyMThdICAgICAgOy8vIHdpZHRoCi0gICAgQ01QICAgICB0bXA1LCB3aWR0aAotICAgIEJISSAgICAgZG9fZmlsbCAgICAgICAgICAgICAgICAgOy8vICh4MCtwYXJ0Vyk+d2lkdGgKLQotICAgIENNUCAgICAgeTAsICMwCi0gICAgQkxUICAgICBkb19maWxsICAgICAgICAgICAgICAgICA7Ly8gKHkwIDwgMCkKLSAgICBMRFIgICAgIHBhcnRILCBbc3AsIzB4MjI0XSAgICAgIDsvLyBwYXJ0SGVpZ2h0Ci0gICAgQUREICAgICB0bXA2LCB5MCwgcGFydEggICAgICAgICA7Ly8gKHkwK3BhcnRIZWlnaHQpCi0gICAgQUREICAgICB0bXA2LCB0bXA2LCAjNSAgICAgICAgICA7Ly8gKHkwK3BhcnRIKzUpCi0gICAgTERSICAgICBoZWlnaHQsIFtzcCwjMHgyMWNdICAgICA7Ly8gaGVpZ2h0Ci0gICAgQ01QICAgICB0bXA2LCBoZWlnaHQKLSAgICBCTFMgICAgIHNraXBfZmlsbCAgICAgICAgICAgICAgIDsvLyBubyBvdmVyZmlsbCBuZWVkZWQKLQotCi1kb19maWxsCi0gICAgTERSICAgICBwYXJ0SCwgW3NwLCMweDIyNF0gICAgICA7Ly8gcGFydEhlaWdodAotICAgIEFERCAgICAgdG1wNSwgcGFydEgsICM1ICAgICAgICAgOy8vIHIyID0gcGFydEggKyA1OwotICAgIExEUiAgICAgaGVpZ2h0LCBbc3AsIzB4MjFjXSAgICAgOy8vIGhlaWdodAotICAgIExEUiAgICAgcGFydFcsIFtzcCwjMHgyMjBdICAgICAgOy8vIHBhcnRXaWR0aAotICAgIFNUTUlCICAgc3AsIHtoZWlnaHQsIHBhcnRXfSAgICAgOy8vIHNwKzQgPSBoZWlnaHQsIHNwKzggPSBwYXJ0V2lkdGgKLSAgICBTVFIgICAgIHRtcDUsIFtzcCwjMHhjXSAgICAgICAgIDsvLyBzcCtjIHBhcnRIZWlnaHQrNQotICAgIFNUUiAgICAgcGFydFcsIFtzcCwjMHgxMF0gICAgICAgOy8vIHNwKzEwID0gcGFydFdpZHRoCi0gICAgTERSICAgICB3aWR0aCwgW3NwLCMweDIxOF0gICAgICA7Ly8gd2lkdGgKLSAgICBTVFIgICAgIHdpZHRoLCBbc3AsIzBdICAgICAgICAgIDsvLyBzcCswID0gd2lkdGgKLSAgICBBREQgICAgIGJ1ZmYsIHNwLCAjMHgyOCAgICAgICAgIDsvLyBidWZmID0gcDFbMjEqMjEvNCsxXQotICAgIEJMICAgICAgaDI2NGJzZEZpbGxCbG9jawotCi0gICAgTU9WICAgICB4MCwgIzAKLSAgICBTVFIgICAgIHgwLFtzcCwjMHgxZWNdICAgICAgICAgIDsvLyB4MCA9IDAKLSAgICBTVFIgICAgIHgwLFtzcCwjMHgxZjBdICAgICAgICAgIDsvLyB5MCA9IDAKLSAgICBBREQgICAgIHJlZixzcCwjMHgyOCAgICAgICAgICAgIDsvLyByZWYgPSBwMQotICAgIFNUUiAgICAgcGFydFcsIFtzcCwjMHgyMThdCi0KLQotc2tpcF9maWxsCi0gICAgTERSICAgICB4MCAsW3NwLCMweDFlY10gICAgICAgICA7Ly8geDAKLSAgICBMRFIgICAgIHkwICxbc3AsIzB4MWYwXSAgICAgICAgIDsvLyB5MAotICAgIExEUiAgICAgd2lkdGgsIFtzcCwjMHgyMThdICAgICAgOy8vIHdpZHRoCi0gICAgTUxBICAgICB0bXA2LCB3aWR0aCwgeTAsIHgwICAgICA7Ly8geTAqd2lkdGgreDAKLSAgICBBREQgICAgIHJlZiwgcmVmLCB0bXA2ICAgICAgICAgIDsvLyByZWYgKz0geTAqd2lkdGgreDAKLSAgICBMRFIgICAgIG1iLCBbc3AsICMweDFlOF0gICAgICAgIDsvLyBtYgotCi0gICAgQUREICAgICBjb3VudCwgcGFydFcsIHBhcnRILCBMU0wgIzggICAgOy8vIHx4eHx4eHxwYXJ0SHxwYXJ0V3wKLSAgICBMRFIgICAgIHRtcDUsID0gMHgwMDAxMDEwMAotICAgIFJTQiAgICAgY291bnQsIHRtcDUsIGNvdW50LCBMU0wgIzggICAgICA7Ly8gfHh4fHBhcnRILTF8cGFydFctMXx4eHwKLSAgICBMRFIgICAgIHRtcDIsIFtzcCwgIzB4MjI4XSAgICAgIDsvLyB2ZXJPZmZzZXQKLSAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMiAgICAgIDsvLyB8eHh8cGFydEgtMXxwYXJ0Vy0xfHZlck9mZnNldHwKLSAgICBMRFIgICAgIHBsdXMxNiwgPSAweDAwMTAwMDEwCi0KLSAgICBBTkQgICAgIHRtcDEsIGNvdW50LCAjMHgwMDAwRkYwMCA7Ly8gcGFydFdpZHRoCi0KLQotbG9vcF95Ci0gICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDEsIExTTCAjMTYgIDsvLyBwYXJ0V2lkdGgtMSB0byB0b3AgYnl0ZQotCi1sb29wX3gKLSAgICBMRFIgICAgIHRtcDEsIFtyZWZdLCB3aWR0aCAgICAgOy8vIHxhNHxhM3xhMnxhMXwKLSAgICBMRFIgICAgIHRtcDIsIFtyZWZdLCB3aWR0aCAgICAgOy8vIHxjNHxjM3xjMnxjMXwKLSAgICBMRFIgICAgIHRtcDMsIFtyZWZdLCB3aWR0aCAgICAgOy8vIHxnNHxnM3xnMnxnMXwKLSAgICBMRFIgICAgIHRtcDQsIFtyZWZdLCB3aWR0aCAgICAgOy8vIHxtNHxtM3xtMnxtMXwKLSAgICBMRFIgICAgIHRtcDUsIFtyZWZdLCB3aWR0aCAgICAgOy8vIHxyNHxyM3xyMnxyMXwKLSAgICBMRFIgICAgIHRtcDYsIFtyZWZdLCB3aWR0aCAgICAgOy8vIHx0NHx0M3x0Mnx0MXwKLQotICAgIDsvLyBmaXJzdCBmb3VyIHBpeGVscyAKLSAgICBVWFRCMTYgIHRtcGEsIHRtcDMgICAgICAgICAgICAgICAgICA7Ly8gfGczfGcxfAotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNCAgICAgICAgICAgIDsvLyB8ZzMrbTN8ZzErbTF8Ci0gICAgVVhUQjE2ICB0bXBiLCB0bXAyICAgICAgICAgICAgICAgICAgOy8vIHxjM3xjMXwKLSAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCi0KLSAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDUgICAgICAgICAgICA7Ly8gfGMzK3IzfGMxK3IxfAotICAgIEFERCAgICAgdG1wYSwgcGx1czE2LCB0bXBhLCBMU0wgIzIgIDsvLyAxNisyMChHK00pCi0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAxICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrQQotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNiAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0ErVAotCi0gICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQotICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQotCi0gICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCi0gICAgTERSICAgICByZXMsID0gMHgwMEZGMDBGRgotICAgIFVYVEIxNiAgdG1wYSwgdG1wMywgUk9SICM4ICAgICAgICAgIDsvLyB8ZzR8ZzJ8Ci0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA0LCBST1IgIzggICAgOy8vIHxnNCttNHxnMittMnwKLSAgICBBTkQgICAgIHJlcywgcmVzLCB0bXBiLCBMU1IgIzUgICAgICA7Ly8gbWFzayBhbmQgZGl2aWRlIGJ5IDMyCi0KLSAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCi0gICAgVVhUQjE2ICB0bXBiLCB0bXAyLCBST1IgIzggICAgICAgICAgOy8vIHxjNHxjMnwKLSAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQotICAgIFVYVEFCMTYgdG1wYiwgdG1wYiwgdG1wNSwgUk9SICM4ICAgIDsvLyB8YzQrcjR8YzIrcjJ8Ci0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAxLCBST1IgIzggICAgOy8vIDE2KzIwKEcrTSkrQQotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNiwgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0ErVAotCi0gICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQotICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQotCi0gICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCi0gICAgTU9WUyAgICB0bXAxLCBjb3VudCwgTFNMICMzMSAgICAgICAgOy8vIHVwZGF0ZSBmbGFncyAodmVyT2Zmc2V0KQotICAgIExEUiAgICAgdG1wYSwgPSAweEZGMDBGRjAwCi0gICAgTVZORVEgICB0bXAxLCB0bXAzICAgICAgICAgICAgICAgICAgOy8vIHNlbGVjdCB2ZXJPZmZzZXQ9MAotICAgIE1WTk5FICAgdG1wMSwgdG1wNCAgICAgICAgICAgICAgICAgIDsvLyBzZWxlY3QgdmVyT2Zmc2V0PTEKLSAgICBBTkQgICAgIHRtcGEsIHRtcGEsIHRtcGIsIExTTCAjMyAgICA7Ly8gbWFzayBhbmQgZGl2ZWRlIGJ5IDMyCi0gICAgT1JSICAgICByZXMsIHJlcywgdG1wYQotCi0gICAgTERSICAgICB0bXBhLCA9IDB4ODA4MDgwODAKLSAgICBVSFNVQjggIHJlcywgcmVzLCB0bXAxICAgICAgICAgICAgICA7Ly8gYmlsaW5lYXIgaW50ZXJwb2xhdGlvbgotICAgIExEUiAgICAgdG1wMSwgW3JlZl0sIHdpZHRoICAgICAgICAgIDsvLyBsb2FkIG5leHQgcm93Ci0gICAgRU9SICAgICByZXMsIHJlcywgdG1wYSAgICAgICAgICAgICAgOy8vIGNvcnJlY3Qgc2lnbgotCi0gICAgU1RSICAgICByZXMsIFttYl0sICMxNiAgICAgICAgICAgICAgOy8vIG5leHQgcm93IChtYikKLQotCi0gICAgOy8vIHRtcDIgPSB8YTR8YTN8YTJ8YTF8Ci0gICAgOy8vIHRtcDMgPSB8YzR8YzN8YzJ8YzF8Ci0gICAgOy8vIHRtcDQgPSB8ZzR8ZzN8ZzJ8ZzF8Ci0gICAgOy8vIHRtcDUgPSB8bTR8bTN8bTJ8bTF8Ci0gICAgOy8vIHRtcDYgPSB8cjR8cjN8cjJ8cjF8Ci0gICAgOy8vIHRtcDEgPSB8dDR8dDN8dDJ8dDF8Ci0KLSAgICA7Ly8gc2Vjb25kIGZvdXIgcGl4ZWxzCi0gICAgVVhUQjE2ICB0bXBhLCB0bXA0ICAgICAgICAgICAgICAgICAgOy8vIHxnM3xnMXwKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDUgICAgICAgICAgICA7Ly8gfGczK20zfGcxK20xfAotICAgIFVYVEIxNiAgdG1wYiwgdG1wMyAgICAgICAgICAgICAgICAgIDsvLyB8YzN8YzF8Ci0gICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQotICAgIFVYVEFCMTYgdG1wYiwgdG1wYiwgdG1wNiAgICAgICAgICAgIDsvLyB8YzMrcjN8YzErcjF8Ci0gICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBCi0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAxICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrQStUCi0KLSAgICBBREQgICAgIHRtcGIsIHRtcGIsIHRtcGIsIExTTCAjMiAgICA7Ly8gNShDK1IpCi0gICAgU1NVQjE2ICB0bXBhLCB0bXBhLCB0bXBiICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrKEErVCktNShDK1IpCi0KLSAgICBVU0FUMTYgIHRtcGIsICMxMywgdG1wYSAgICAgICAgICAgICA7Ly8gc2F0dXJhdGUKLSAgICBMRFIgICAgIHJlcywgPSAweDAwRkYwMEZGCi0gICAgVVhUQjE2ICB0bXBhLCB0bXA0LCBST1IgIzggICAgICAgICAgOy8vIHxnNHxnMnwKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDUsIFJPUiAjOCAgICA7Ly8gfGc0K200fGcyK20yfAotICAgIEFORCAgICAgcmVzLCByZXMsIHRtcGIsIExTUiAjNSAgICAgIDsvLyBtYXNrIGFuZCBkaXZpZGUgYnkgMzIKLQotICAgIEFERCAgICAgdG1wYSwgdG1wYSwgdG1wYSwgTFNMICMyICAgIDsvLyA1KEcrTSkKLSAgICBVWFRCMTYgIHRtcGIsIHRtcDMsIFJPUiAjOCAgICAgICAgICA7Ly8gfGM0fGMyfAotICAgIEFERCAgICAgdG1wYSwgcGx1czE2LCB0bXBhLCBMU0wgIzIgIDsvLyAxNisyMChHK00pCi0gICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXA2LCBST1IgIzggICAgOy8vIHxjNCtyNHxjMityMnwKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDIsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBCi0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAxLCBST1IgIzggICAgOy8vIDE2KzIwKEcrTSkrQStUCi0KLSAgICBBREQgICAgIHRtcGIsIHRtcGIsIHRtcGIsIExTTCAjMiAgICA7Ly8gNShDK1IpCi0gICAgU1NVQjE2ICB0bXBhLCB0bXBhLCB0bXBiICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrKEErVCktNShDK1IpCi0KLSAgICBVU0FUMTYgIHRtcGIsICMxMywgdG1wYSAgICAgICAgICAgICA7Ly8gc2F0dXJhdGUKLSAgICBMRFIgICAgIHRtcGEsID0gMHhGRjAwRkYwMAotICAgIE1WTkVRICAgdG1wMiwgdG1wNCAgICAgICAgICAgICAgICAgIDsvLyBzZWxlY3QgdmVyT2Zmc2V0PTAKLSAgICBNVk5ORSAgIHRtcDIsIHRtcDUgICAgICAgICAgICAgICAgICA7Ly8gc2VsZWN0IHZlck9mZnNldD0xCi0KLSAgICBBTkQgICAgIHRtcGEsIHRtcGEsIHRtcGIsIExTTCAjMyAgICA7Ly8gbWFzayBhbmQgZGl2aWRlIGJ5IDMyCi0gICAgT1JSICAgICByZXMsIHJlcywgdG1wYQotICAgIExEUiAgICAgdG1wYSwgPSAweDgwODA4MDgwCi0gICAgVUhTVUI4ICByZXMsIHJlcywgdG1wMiAgICAgICAgICAgICAgOy8vIGJpbGluZWFyIGludGVycG9sYXRpb24KLSAgICBMRFIgICAgIHRtcDIsIFtyZWZdLCB3aWR0aCAgICAgICAgICA7Ly8gbG9hZCBuZXh0IHJvdwotICAgIEVPUiAgICAgcmVzLCByZXMsIHRtcGEgICAgICAgICAgICAgIDsvLyBjb3JyZWN0IHNpZ24KLSAgICBTVFIgICAgIHJlcywgW21iXSwgIzE2ICAgICAgICAgICAgICA7Ly8gbmV4dCByb3cKLQotICAgIDsvLyB0bXAzID0gfGE0fGEzfGEyfGExfAotICAgIDsvLyB0bXA0ID0gfGM0fGMzfGMyfGMxfAotICAgIDsvLyB0bXA1ID0gfGc0fGczfGcyfGcxfAotICAgIDsvLyB0bXA2ID0gfG00fG0zfG0yfG0xfAotICAgIDsvLyB0bXAxID0gfHI0fHIzfHIyfHIxfAotICAgIDsvLyB0bXAyID0gfHQ0fHQzfHQyfHQxfAotCi0gICAgOy8vIHRoaXJkIGZvdXIgcGl4ZWxzCi0gICAgVVhUQjE2ICB0bXBhLCB0bXA1ICAgICAgICAgICAgICAgICAgOy8vIHxnM3xnMXwKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDYgICAgICAgICAgICA7Ly8gfGczK20zfGcxK20xfAotICAgIFVYVEIxNiAgdG1wYiwgdG1wNCAgICAgICAgICAgICAgICAgIDsvLyB8YzN8YzF8Ci0gICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQotICAgIFVYVEFCMTYgdG1wYiwgdG1wYiwgdG1wMSAgICAgICAgICAgIDsvLyB8YzMrcjN8YzErcjF8Ci0gICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDMgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBCi0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAyICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrQStUCi0KLSAgICBBREQgICAgIHRtcGIsIHRtcGIsIHRtcGIsIExTTCAjMiAgICA7Ly8gNShDK1IpCi0gICAgU1NVQjE2ICB0bXBhLCB0bXBhLCB0bXBiICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrKEErVCktNShDK1IpCi0KLSAgICBVU0FUMTYgIHRtcGIsICMxMywgdG1wYSAgICAgICAgICAgICA7Ly8gc2F0dXJhdGUKLSAgICBMRFIgICAgIHJlcywgPSAweDAwRkYwMEZGCi0gICAgVVhUQjE2ICB0bXBhLCB0bXA1LCBST1IgIzggICAgICAgICAgOy8vIHxnNHxnMnwKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDYsIFJPUiAjOCAgICA7Ly8gfGc0K200fGcyK20yfAotICAgIEFORCAgICAgcmVzLCByZXMsIHRtcGIsIExTUiAjNSAgICAgIDsvLyBtYXNrIGFuZCBkaXZpZGUgYnkgMzIKLQotICAgIEFERCAgICAgdG1wYSwgdG1wYSwgdG1wYSwgTFNMICMyICAgIDsvLyA1KEcrTSkKLSAgICBVWFRCMTYgIHRtcGIsIHRtcDQsIFJPUiAjOCAgICAgICAgICA7Ly8gfGM0fGMyfAotICAgIEFERCAgICAgdG1wYSwgcGx1czE2LCB0bXBhLCBMU0wgIzIgIDsvLyAxNisyMChHK00pCi0gICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXAxLCBST1IgIzggICAgOy8vIHxjNCtyNHxjMityMnwKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDMsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBCi0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAyLCBST1IgIzggICAgOy8vIDE2KzIwKEcrTSkrQStUCi0KLQotICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKLSAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKLQotICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQotICAgIExEUiAgICAgdG1wYSwgPSAweEZGMDBGRjAwCi0gICAgTVZORVEgICB0bXAzLCB0bXA1ICAgICAgICAgICAgICAgICAgOy8vIHNlbGVjdCB2ZXJPZmZzZXQ9MAotICAgIE1WTk5FICAgdG1wMywgdG1wNiAgICAgICAgICAgICAgICAgIDsvLyBzZWxlY3QgdmVyT2Zmc2V0PTEKLQotICAgIEFORCAgICAgdG1wYSwgdG1wYSwgdG1wYiwgTFNMICMzICAgIDsvLyBtYXNrIGFuZCBkaXZpZGUgYnkgMzIKLSAgICBPUlIgICAgIHJlcywgcmVzLCB0bXBhCi0gICAgTERSICAgICB0bXBhLCA9IDB4ODA4MDgwODAKLSAgICBVSFNVQjggIHJlcywgcmVzLCB0bXAzICAgICAgICAgICAgICA7Ly8gYmlsaW5lYXIgaW50ZXJwb2xhdGlvbgotICAgIExEUiAgICAgdG1wMywgW3JlZl0gICAgICAgICAgICAgICAgIDsvLyBsb2FkIG5leHQgcm93Ci0gICAgRU9SICAgICByZXMsIHJlcywgdG1wYSAgICAgICAgICAgICAgOy8vIGNvcnJlY3Qgc2lnbgotICAgIFNUUiAgICAgcmVzLCBbbWJdLCAjMTYgICAgICAgICAgICAgIDsvLyBuZXh0IHJvdwotCi0gICAgOy8vIHRtcDQgPSB8YTR8YTN8YTJ8YTF8Ci0gICAgOy8vIHRtcDUgPSB8YzR8YzN8YzJ8YzF8Ci0gICAgOy8vIHRtcDYgPSB8ZzR8ZzN8ZzJ8ZzF8Ci0gICAgOy8vIHRtcDEgPSB8bTR8bTN8bTJ8bTF8Ci0gICAgOy8vIHRtcDIgPSB8cjR8cjN8cjJ8cjF8Ci0gICAgOy8vIHRtcDMgPSB8dDR8dDN8dDJ8dDF8Ci0KLSAgICA7Ly8gZm91cnRoIGZvdXIgcGl4ZWxzCi0gICAgVVhUQjE2ICB0bXBhLCB0bXA2ICAgICAgICAgICAgICAgICAgOy8vIHxnM3xnMXwKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDEgICAgICAgICAgICA7Ly8gfGczK20zfGcxK20xfAotICAgIFVYVEIxNiAgdG1wYiwgdG1wNSAgICAgICAgICAgICAgICAgIDsvLyB8YzN8YzF8Ci0gICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQotICAgIFVYVEFCMTYgdG1wYiwgdG1wYiwgdG1wMiAgICAgICAgICAgIDsvLyB8YzMrcjN8YzErcjF8Ci0gICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDQgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBCi0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAzICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrQStUCi0KLSAgICBBREQgICAgIHRtcGIsIHRtcGIsIHRtcGIsIExTTCAjMiAgICA7Ly8gNShDK1IpCi0gICAgU1NVQjE2ICB0bXBhLCB0bXBhLCB0bXBiICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrKEErVCktNShDK1IpCi0KLSAgICBVU0FUMTYgIHRtcGIsICMxMywgdG1wYSAgICAgICAgICAgICA7Ly8gc2F0dXJhdGUKLSAgICBMRFIgICAgIHJlcywgPSAweDAwRkYwMEZGCi0gICAgVVhUQjE2ICB0bXBhLCB0bXA2LCBST1IgIzggICAgICAgICAgOy8vIHxnNHxnMnwKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDEsIFJPUiAjOCAgICA7Ly8gfGc0K200fGcyK20yfAotICAgIEFORCAgICAgcmVzLCByZXMsIHRtcGIsIExTUiAjNSAgICAgIDsvLyBtYXNrIGFuZCBkaXZpZGUgYnkgMzIKLQotICAgIEFERCAgICAgdG1wYSwgdG1wYSwgdG1wYSwgTFNMICMyICAgIDsvLyA1KEcrTSkKLSAgICBVWFRCMTYgIHRtcGIsIHRtcDUsIFJPUiAjOCAgICAgICAgICA7Ly8gfGM0fGMyfAotICAgIEFERCAgICAgdG1wYSwgcGx1czE2LCB0bXBhLCBMU0wgIzIgIDsvLyAxNisyMChHK00pCi0gICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXAyLCBST1IgIzggICAgOy8vIHxjNCtyNHxjMityMnwKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDQsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBCi0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAzLCBST1IgIzggICAgOy8vIDE2KzIwKEcrTSkrQStUCi0KLSAgICBBREQgICAgIHRtcGIsIHRtcGIsIHRtcGIsIExTTCAjMiAgICA7Ly8gNShDK1IpCi0gICAgU1NVQjE2ICB0bXBhLCB0bXBhLCB0bXBiICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrKEErVCktNShDK1IpCi0KLSAgICBVU0FUMTYgIHRtcGIsICMxMywgdG1wYSAgICAgICAgICAgICA7Ly8gc2F0dXJhdGUKLSAgICBMRFIgICAgIHRtcDQsID0gMHhGRjAwRkYwMAotICAgIE1WTkVRICAgdG1wNSwgdG1wNiAgICAgICAgICAgICAgICAgIDsvLyBzZWxlY3QgdmVyT2Zmc2V0PTAKLSAgICBNVk5ORSAgIHRtcDUsIHRtcDEgICAgICAgICAgICAgICAgICA7Ly8gc2VsZWN0IHZlck9mZnNldD0xCi0KLSAgICBBTkQgICAgIHRtcGEsIHRtcDQsIHRtcGIsIExTTCAjMyAgICA7Ly8gbWFzayBhbmQgZGl2aWRlIGJ5IDMyCi0gICAgT1JSICAgICByZXMsIHJlcywgdG1wYQotICAgIExEUiAgICAgdG1wYSwgPSAweDgwODA4MDgwCi0gICAgVUhTVUI4ICByZXMsIHJlcywgdG1wNSAgICAgICAgICAgICAgOy8vIGJpbGluZWFyIGludGVycG9sYXRpb24KLQotICAgIDsvLyBkZWNyZW1lbnQgbG9vcF94IGNvdW50ZXIKLSAgICBTVUJTICAgIGNvdW50LCBjb3VudCwgIzQ8PDI0ICAgICAgICA7Ly8gKHBhcnRXaWR0aC0xKSAtPSA0OwotCi0gICAgOy8vIGNhbGN1bGF0ZSAicmVmIiBhZGRyZXNzIGZvciBuZXh0IHJvdW5kCi0gICAgU1VCICAgICByZWYsIHJlZiwgd2lkdGgsIExTTCAjMyAgICAgOy8vIHJlZiAtPSA4KndpZHRoOwotICAgIEFERCAgICAgcmVmLCByZWYsICM0OyAgICAgICAgICAgICAgIDsvLyBuZXh0IGNvbHVtbiAoNCBwaXhlbHMpCi0KLSAgICBFT1IgICAgIHJlcywgcmVzLCB0bXBhICAgICAgICAgICAgICA7Ly8gY29ycmVjdCBzaWduCi0gICAgU1RSICAgICByZXMsIFttYl0sICMtNDQKLSAKLSAgICBCQ1MgICAgIGxvb3BfeAotCi0gICAgQUREUyAgICBjb3VudCwgY291bnQsICMyNTI8PDE2ICAgICAgOy8vIChwYXJ0SGVpZ2h0LTEpIC09IDQ7Ci0gICAgQUREICAgICByZWYsIHJlZiwgd2lkdGgsIExTTCAjMiAgICAgOy8vIHJlZiArPSA0KndpZHRoCi0gICAgQU5EICAgICB0bXAxLCBjb3VudCwgIzB4MDAwMEZGMDAgICAgOy8vIHBhcnRXaWR0aC0xCi0gICAgTU9WICAgICB0bXAyLCAjMQotICAgIEFERCAgICAgdG1wMiwgdG1wMiwgdG1wMSwgTFNSICM4ICAgIDsvLyBwYXJ0V2lkdGgKLSAgICBTVUIgICAgIHJlZiwgcmVmLCB0bXAyICAgICAgICAgICAgICA7Ly8gcmVmIC09IHBhcnRXaWR0aAotICAgIEFERCAgICAgbWIsIG1iLCAjNjQ7Ci0gICAgU1VCICAgICBtYiwgbWIsIHRtcDI7ICAgICAgICAgICAgICAgOy8vIG1iIC09IHBhcnRXaWR0aAotICAgIEJHRSAgICAgbG9vcF95Ci0KLSAgICBBREQgICAgIHNwLHNwLCMweDFmNAotICAgIExETUZEICAgc3AhLCB7cjQtcjExLCBwY30KLQotICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vd2luX2FzbS5iYXQgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS93aW5fYXNtLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI4ZDg4Yy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS93aW5fYXNtLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLWVjaG8gb2ZmCi1zZXQgQVNNRkxBR1M9IC1jaGVja3JlZ2xpc3QgLUNQVSBBUk0xMTM2IC1QcmVEZWZpbmUgIkgyNjRERUNfV0lOQVNNIFNFVEwge1RSVUV9Igotc2V0IEFTTT0iRDpcUHJvZ3JhbSBGaWxlc1xNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyA4XFZDXGNlXGJpblx4ODZfYXJtXGFybWFzbSIKLWVjaG8gb24KLQotJUFTTSUgJUFTTUZMQUdTJSBoMjY0YnNkX2ludGVycG9sYXRlX2Nocm9tYV92ZXIucwotJUFTTSUgJUFTTUZMQUdTJSBoMjY0YnNkX2ludGVycG9sYXRlX2Nocm9tYV9ob3IucwotJUFTTSUgJUFTTUZMQUdTJSBoMjY0YnNkX2ludGVycG9sYXRlX2hvcl9oYWxmLnMKLSVBU00lICVBU01GTEFHUyUgaDI2NGJzZF9pbnRlcnBvbGF0ZV9ob3JfcXVhcnRlci5zCi0lQVNNJSAlQVNNRkxBR1MlIGgyNjRic2RfaW50ZXJwb2xhdGVfaG9yX3Zlcl9xdWFydGVyLnMKLSVBU00lICVBU01GTEFHUyUgaDI2NGJzZF9pbnRlcnBvbGF0ZV92ZXJfaGFsZi5zCi0lQVNNJSAlQVNNRkxBR1MlIGgyNjRic2RfaW50ZXJwb2xhdGVfdmVyX3F1YXJ0ZXIucwotCi1yZW0gJUFTTSUgJUFTTUZMQUdTJSBoMjY0YnNkX2ludGVycG9sYXRlX2Nocm9tYV9ob3JfdmVyLnMKLXJlbSAlQVNNJSAlQVNNRkxBR1MlIGgyNjRic2RfaW50ZXJwb2xhdGVfbWlkX2hvci5zCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbS9oMjY0YnNkQ2xlYXJNYkxheWVyLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbS9oMjY0YnNkQ2xlYXJNYkxheWVyLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMTE2NTQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc20vaDI2NGJzZENsZWFyTWJMYXllci5zCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotOwotOyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotOwotOyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsKLTsgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsKLTsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsKLQotICAgIFJFUVVJUkU4Ci0gICAgUFJFU0VSVkU4Ci0KLSAgICBBUkVBICAgIHwudGV4dHwsIENPREUKLQotICAgIEVYUE9SVCBoMjY0YnNkQ2xlYXJNYkxheWVyCi0KLTsgSW5wdXQgLyBvdXRwdXQgcmVnaXN0ZXJzCi1wTWJMYXllciAgICBSTiAgMAotc2l6ZSAgICAgICAgUk4gIDEKLXBUbXAgICAgICAgIFJOICAyCi1zdGVwICAgICAgICBSTiAgMwotCi07IC0tIE5FT04gcmVnaXN0ZXJzIC0tCi0KLXFaZXJvICAgUU4gIFEwLlU4Ci0KLTsvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOwotOyAgICBGdW5jdGlvbjogaDI2NGJzZENsZWFyTWJMYXllcgotOwotOyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLTsKLTsgICAgICAgIElucHV0czoKLTsKLTsgICAgICAgIE91dHB1dHM6Ci07Ci07ICAgICAgICBSZXR1cm5zOgotOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLWgyNjRic2RDbGVhck1iTGF5ZXIKLQotICAgIFZNT1YgICAgcVplcm8sICMwCi0gICAgQUREICAgICBwVG1wLCBwTWJMYXllciwgIzE2Ci0gICAgTU9WICAgICBzdGVwLCAjMzIKLSAgICBTVUJTICAgIHNpemUsIHNpemUsICM2NAotCi1sb29wCi0gICAgVlNUMSAgICBxWmVybywgW3BNYkxheWVyXSwgc3RlcAotICAgIFNVQlMgICAgc2l6ZSwgc2l6ZSwgIzY0Ci0gICAgVlNUMSAgICBxWmVybywgW3BUbXBdLCBzdGVwCi0gICAgVlNUMSAgICBxWmVybywgW3BNYkxheWVyXSwgc3RlcAotICAgIFZTVDEgICAgcVplcm8sIFtwVG1wXSwgc3RlcAotICAgIEJDUyAgICAgbG9vcAotCi0gICAgQlggICAgICBscgotICAgIEVORAotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtL2gyNjRic2RDb3VudExlYWRpbmdaZXJvcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc20vaDI2NGJzZENvdW50TGVhZGluZ1plcm9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3YmQ3M2UuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc20vaDI2NGJzZENvdW50TGVhZGluZ1plcm9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi07Ci07IENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci07Ci07IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOwotOyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOwotOyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOwotCi0gICAgUkVRVUlSRTgKLSAgICBQUkVTRVJWRTgKLQotICAgIEFSRUEgICAgfC50ZXh0fCwgQ09ERQotCi0gICAgRVhQT1JUIGgyNjRic2RDb3VudExlYWRpbmdaZXJvcwotCi07IElucHV0IC8gb3V0cHV0IHJlZ2lzdGVycwotdmFsdWUgICAgUk4gIDAKLQotOyAtLSBORU9OIHJlZ2lzdGVycyAtLQotCi07LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsKLTsgICAgRnVuY3Rpb246IGgyNjRic2RDb3VudExlYWRpbmdaZXJvcwotOwotOyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLTsKLTsgICAgICAgIElucHV0czoKLTsKLTsgICAgICAgIE91dHB1dHM6Ci07Ci07ICAgICAgICBSZXR1cm5zOgotOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLWgyNjRic2RDb3VudExlYWRpbmdaZXJvcwotCi0gICAgQ0xaICAgICB2YWx1ZSwgdmFsdWUKLSAgICBCWCAgICAgIGxyCi0gICAgRU5ECi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc20vaDI2NGJzZEZpbGxSb3c3LnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbS9oMjY0YnNkRmlsbFJvdzcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJmYWM5Mi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbS9oMjY0YnNkRmlsbFJvdzcucworKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi07Ci07IENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci07Ci07IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOwotOyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOwotOyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOwotCi0gICAgUkVRVUlSRTgKLSAgICBQUkVTRVJWRTgKLQotICAgIEFSRUEgICAgfC50ZXh0fCwgQ09ERQotCi0gICAgRVhQT1JUIGgyNjRic2RGaWxsUm93NwotCi07IElucHV0IC8gb3V0cHV0IHJlZ2lzdGVycwotCi1yZWYgICAgIFJOIDAKLWZpbGwgICAgUk4gMQotbGVmdCAgICBSTiAyCi10bXAyICAgIFJOIDIKLWNlbnRlciAgUk4gMwotcmlnaHQgICBSTiA0Ci10bXAxICAgIFJOIDUKLQotOyAtLSBORU9OIHJlZ2lzdGVycyAtLQotCi1xVG1wMCAgIFFOICBRMC5VOAotcVRtcDEgICBRTiAgUTEuVTgKLWRUbXAwICAgRE4gIEQwLlU4Ci1kVG1wMSAgIEROICBEMS5VOAotZFRtcDIgICBETiAgRDIuVTgKLWRUbXAzICAgRE4gIEQzLlU4Ci0KLQotOy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ci07ICAgIEZ1bmN0aW9uOiBoMjY0YnNkRmlsbFJvdzcKLTsKLTsgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci07Ci07ICAgICAgICBJbnB1dHM6Ci07Ci07ICAgICAgICBPdXRwdXRzOgotOwotOyAgICAgICAgUmV0dXJuczoKLTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1oMjY0YnNkRmlsbFJvdzcKLSAgICAgICAgUFVTSCAgICAge3I0LXI2LGxyfQotICAgICAgICBDTVAgICAgICBsZWZ0LCAjMAotICAgICAgICBMRFIgICAgICByaWdodCwgW3NwLCMweDEwXQotICAgICAgICBCRVEgICAgICBzd2l0Y2hfY2VudGVyCi0gICAgICAgIExEUkIgICAgIHRtcDEsIFtyZWYsIzBdCi0KLWxvb3BfbGVmdAotICAgICAgICBTVUJTICAgICBsZWZ0LCBsZWZ0LCAjMQotICAgICAgICBTVFJCICAgICB0bXAxLCBbZmlsbF0sICMxCi0gICAgICAgIEJORSAgICAgIGxvb3BfbGVmdAotCi1zd2l0Y2hfY2VudGVyCi0gICAgICAgIEFTUiAgICAgIHRtcDIsY2VudGVyLCMyCi0gICAgICAgIENNUCAgICAgIHRtcDIsIzkKLSAgICAgICAgQUREQ0MgICAgcGMscGMsdG1wMixMU0wgIzIKLSAgICAgICAgQiAgICAgICAgbG9vcF9jZW50ZXIKLSAgICAgICAgQiAgICAgICAgbG9vcF9jZW50ZXIKLSAgICAgICAgQiAgICAgICAgY2FzZV8xCi0gICAgICAgIEIgICAgICAgIGNhc2VfMgotICAgICAgICBCICAgICAgICBjYXNlXzMKLSAgICAgICAgQiAgICAgICAgY2FzZV80Ci0gICAgICAgIEIgICAgICAgIGNhc2VfNQotICAgICAgICBCICAgICAgICBjYXNlXzYKLSAgICAgICAgQiAgICAgICAgY2FzZV83Ci0gICAgICAgIEIgICAgICAgIGNhc2VfOAotO2Nhc2VfOAotOyAgICAgICAgTERSICAgICAgdG1wMiwgW3JlZl0sICM0Ci07ICAgICAgICBTVUIgICAgICBjZW50ZXIsIGNlbnRlciwgIzQKLTsgICAgICAgIFNUUiAgICAgIHRtcDIsIFtmaWxsXSwgIzQKLTtjYXNlXzcKLTsgICAgICAgIExEUiAgICAgIHRtcDIsIFtyZWZdLCAjNAotOyAgICAgICAgU1VCICAgICAgY2VudGVyLCBjZW50ZXIsICM0Ci07ICAgICAgICBTVFIgICAgICB0bXAyLCBbZmlsbF0sICM0Ci07Y2FzZV82Ci07ICAgICAgICBMRFIgICAgICB0bXAyLCBbcmVmXSwgIzQKLTsgICAgICAgIFNVQiAgICAgIGNlbnRlciwgY2VudGVyLCAjNAotOyAgICAgICAgU1RSICAgICAgdG1wMiwgW2ZpbGxdLCM0Ci07Y2FzZV81Ci07ICAgICAgICBMRFIgICAgICB0bXAyLCBbcmVmXSwgIzQKLTsgICAgICAgIFNVQiAgICAgIGNlbnRlciwgY2VudGVyLCAjNAotOyAgICAgICAgU1RSICAgICAgdG1wMiwgW2ZpbGxdLCM0Ci07Y2FzZV80Ci07ICAgICAgICBMRFIgICAgICB0bXAyLCBbcmVmXSwjNAotOyAgICAgICAgU1VCICAgICAgY2VudGVyLCBjZW50ZXIsICM0Ci07ICAgICAgICBTVFIgICAgICB0bXAyLCBbZmlsbF0sICM0Ci07Y2FzZV8zCi07ICAgICAgICBMRFIgICAgICB0bXAyLCBbcmVmXSwjNAotOyAgICAgICAgU1VCICAgICAgY2VudGVyLCBjZW50ZXIsICM0Ci07ICAgICAgICBTVFIgICAgICB0bXAyLCBbZmlsbF0sICM0Ci07Y2FzZV8yCi07ICAgICAgICBMRFIgICAgICB0bXAyLCBbcmVmXSwjNAotOyAgICAgICAgU1VCICAgICAgY2VudGVyLCBjZW50ZXIsICM0Ci07ICAgICAgICBTVFIgICAgICB0bXAyLCBbZmlsbF0sICM0Ci07Y2FzZV8xCi07ICAgICAgICBMRFIgICAgICB0bXAyLCBbcmVmXSwjNAotOyAgICAgICAgU1VCICAgICAgY2VudGVyLCBjZW50ZXIsICM0Ci07ICAgICAgICBTVFIgICAgICB0bXAyLCBbZmlsbF0sICM0Ci0KLWNhc2VfOAotICAgICAgICBWTEQxICAgIHtxVG1wMCwgcVRtcDF9LCBbcmVmXSEKLSAgICAgICAgU1VCICAgICBjZW50ZXIsIGNlbnRlciwgIzMyCi0gICAgICAgIFZTVDEgICAgcVRtcDAsIFtmaWxsXSEKLSAgICAgICAgVlNUMSAgICBxVG1wMSwgW2ZpbGxdIQotICAgICAgICBCICAgICAgIGxvb3BfY2VudGVyCi1jYXNlXzcKLSAgICAgICAgVkxEMSAgICB7ZFRtcDAsZFRtcDEsZFRtcDJ9LCBbcmVmXSEKLSAgICAgICAgU1VCICAgICBjZW50ZXIsIGNlbnRlciwgIzI4Ci0gICAgICAgIExEUiAgICAgdG1wMiwgW3JlZl0sICM0Ci0gICAgICAgIFZTVDEgICAge2RUbXAwLGRUbXAxLGRUbXAyfSwgW2ZpbGxdIQotICAgICAgICBTVFIgICAgIHRtcDIsIFtmaWxsXSwjNAotICAgICAgICBCICAgICAgIGxvb3BfY2VudGVyCi1jYXNlXzYKLSAgICAgICAgVkxEMSAgICB7ZFRtcDAsZFRtcDEsZFRtcDJ9LCBbcmVmXSEKLSAgICAgICAgU1VCICAgICBjZW50ZXIsIGNlbnRlciwgIzI0Ci0gICAgICAgIFZTVDEgICAge2RUbXAwLGRUbXAxLGRUbXAyfSwgW2ZpbGxdIQotICAgICAgICBCICAgICAgIGxvb3BfY2VudGVyCi1jYXNlXzUKLSAgICAgICAgVkxEMSAgICBxVG1wMCwgW3JlZl0hCi0gICAgICAgIFNVQiAgICAgY2VudGVyLCBjZW50ZXIsICMyMAotICAgICAgICBMRFIgICAgIHRtcDIsIFtyZWZdLCAjNAotICAgICAgICBWU1QxICAgIHFUbXAwLCBbZmlsbF0hCi0gICAgICAgIFNUUiAgICAgdG1wMiwgW2ZpbGxdLCM0Ci0gICAgICAgIEIgICAgICAgbG9vcF9jZW50ZXIKLWNhc2VfNAotICAgICAgICBWTEQxICAgIHFUbXAwLCBbcmVmXSEKLSAgICAgICAgU1VCICAgICBjZW50ZXIsIGNlbnRlciwgIzE2Ci0gICAgICAgIFZTVDEgICAgcVRtcDAsIFtmaWxsXSEKLSAgICAgICAgQiAgICAgICBsb29wX2NlbnRlcgotY2FzZV8zCi0gICAgICAgIFZMRDEgICAgZFRtcDAsIFtyZWZdIQotICAgICAgICBTVUIgICAgIGNlbnRlciwgY2VudGVyLCAjMTIKLSAgICAgICAgTERSICAgICB0bXAyLCBbcmVmXSwgIzQKLSAgICAgICAgVlNUMSAgICBkVG1wMCwgW2ZpbGxdIQotICAgICAgICBTVFIgICAgIHRtcDIsIFtmaWxsXSwjNAotICAgICAgICBCICAgICAgIGxvb3BfY2VudGVyCi1jYXNlXzIKLSAgICAgICAgTERSICAgICAgdG1wMiwgW3JlZl0sIzQKLSAgICAgICAgU1VCICAgICAgY2VudGVyLCBjZW50ZXIsICM0Ci0gICAgICAgIFNUUiAgICAgIHRtcDIsIFtmaWxsXSwgIzQKLWNhc2VfMQotICAgICAgICBMRFIgICAgICB0bXAyLCBbcmVmXSwjNAotICAgICAgICBTVUIgICAgICBjZW50ZXIsIGNlbnRlciwgIzQKLSAgICAgICAgU1RSICAgICAgdG1wMiwgW2ZpbGxdLCAjNAotCi1sb29wX2NlbnRlcgotICAgICAgICBDTVAgICAgICBjZW50ZXIsICMwCi0gICAgICAgIExEUkJORSAgIHRtcDIsIFtyZWZdLCAjMQotICAgICAgICBTVUJORSAgICBjZW50ZXIsIGNlbnRlciwgIzEKLSAgICAgICAgU1RSQk5FICAgdG1wMiwgW2ZpbGxdLCAjMQotICAgICAgICBCTkUgICAgICBsb29wX2NlbnRlcgotICAgICAgICBDTVAgICAgICByaWdodCwjMAotICAgICAgICBQT1BFUSAgICB7cjQtcjYscGN9Ci0gICAgICAgIExEUkIgICAgIHRtcDIsIFtyZWYsIy0xXQotCi1sb29wX3JpZ2h0Ci0gICAgICAgIFNUUkIgICAgIHRtcDIsIFtmaWxsXSwgIzEKLSAgICAgICAgU1VCUyAgICAgcmlnaHQsIHJpZ2h0LCAjMQotICAgICAgICBCTkUgICAgICBsb29wX3JpZ2h0Ci0KLSAgICAgICAgUE9QICAgICAge3I0LXI2LHBjfQotICAgICAgICBFTkQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc20vaDI2NGJzZEZsdXNoQml0cy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc20vaDI2NGJzZEZsdXNoQml0cy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTMzNWI4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtL2gyNjRic2RGbHVzaEJpdHMucworKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLTsKLTsgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLTsKLTsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ci07ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ci07IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ci0KLSAgICBSRVFVSVJFOAotICAgIFBSRVNFUlZFOAotCi0gICAgQVJFQSAgICB8LnRleHR8LCBDT0RFCi0KLSAgICBFWFBPUlQgaDI2NGJzZEZsdXNoQml0cwotCi07IElucHV0IC8gb3V0cHV0IHJlZ2lzdGVycwotcFN0cm1EYXRhICAgICAgIFJOICAwCi1udW1CaXRzICAgICAgICAgUk4gIDEKLXJlYWRCaXRzICAgICAgICBSTiAgMgotc3RybUJ1ZmZTaXplICAgIFJOICAzCi1wU3RybUJ1ZmZTdGFydCAgUk4gIDEKLXBTdHJtQ3VyclBvcyAgICBSTiAgMgotYml0UG9zSW5Xb3JkICAgIFJOICAxCi0KLTsgLS0gTkVPTiByZWdpc3RlcnMgLS0KLQotCi0KLTsvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOwotOyAgICBGdW5jdGlvbjogaDI2NGJzZEZsdXNoQml0cwotOwotOyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLTsKLTsgICAgICAgIElucHV0czoKLTsKLTsgICAgICAgIE91dHB1dHM6Ci07Ci07ICAgICAgICBSZXR1cm5zOgotOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLWgyNjRic2RGbHVzaEJpdHMKLTsvLyAgICBQVVNIICAgICB7cjQtcjYsbHJ9Ci0KLSAgICBMRFIgcmVhZEJpdHMsIFtwU3RybURhdGEsICMweDEwXQotICAgIExEUiBzdHJtQnVmZlNpemUsIFtwU3RybURhdGEsICMweENdCi0KLSAgICBBREQgcmVhZEJpdHMsIHJlYWRCaXRzLCBudW1CaXRzCi0gICAgQU5EIGJpdFBvc0luV29yZCwgcmVhZEJpdHMsICM3Ci0KLSAgICBTVFIgcmVhZEJpdHMsIFtwU3RybURhdGEsICMweDEwXQotICAgIFNUUiBiaXRQb3NJbldvcmQsIFtwU3RybURhdGEsICMweDhdCi0KLSAgICBMRFIgcFN0cm1CdWZmU3RhcnQsIFtwU3RybURhdGEsICMweDBdCi0KLSAgICBDTVAgcmVhZEJpdHMsIHN0cm1CdWZmU2l6ZSwgTFNMICMzCi0KLSAgICBCSEkgZW5kX29mX3N0cmVhbQotCi0gICAgQUREIHBTdHJtQ3VyclBvcywgcFN0cm1CdWZmU3RhcnQsIHJlYWRCaXRzLCBMU1IgIzMKLSAgICBTVFIgcFN0cm1DdXJyUG9zLCBbcFN0cm1EYXRhLCAjMHg0XQotICAgIE1PViByMCwgIzAKLSAgICBCWCAgbHIKLTsvLyAgICBQT1AgICAgICB7cjQtcjYscGN9Ci0KLWVuZF9vZl9zdHJlYW0KLSAgICBNVk4gcjAsICMwCi0gICAgQlggIGxyCi07Ly8gICAgUE9QICAgICAge3I0LXI2LHBjfQotCi0gICAgRU5ECi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc20vaDI2NGJzZFdyaXRlTWFjcm9ibG9jay5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc20vaDI2NGJzZFdyaXRlTWFjcm9ibG9jay5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGEwNzgxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtL2gyNjRic2RXcml0ZU1hY3JvYmxvY2sucworKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi07Ci07IENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci07Ci07IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOwotOyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOwotOyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOwotCi0gICAgUkVRVUlSRTgKLSAgICBQUkVTRVJWRTgKLQotICAgIEFSRUEgICAgfC50ZXh0fCwgQ09ERQotCi0gICAgRVhQT1JUIGgyNjRic2RXcml0ZU1hY3JvYmxvY2sKLQotOyBJbnB1dCAvIG91dHB1dCByZWdpc3RlcnMKLWltYWdlICAgUk4gIDAKLWRhdGEgICAgUk4gIDEKLXdpZHRoICAgUk4gIDIKLWx1bWEgICAgUk4gIDMKLWNiICAgICAgUk4gIDQKLWNyICAgICAgUk4gIDUKLWN3aWR0aCAgUk4gIDYKLQotOyAtLSBORU9OIHJlZ2lzdGVycyAtLQotCi1xUm93MCAgIFFOICBRMC5VOAotcVJvdzEgICBRTiAgUTEuVTgKLXFSb3cyICAgUU4gIFEyLlU4Ci1xUm93MyAgIFFOICBRMy5VOAotcVJvdzQgICBRTiAgUTQuVTgKLXFSb3c1ICAgUU4gIFE1LlU4Ci1xUm93NiAgIFFOICBRNi5VOAotcVJvdzcgICBRTiAgUTcuVTgKLXFSb3c4ICAgUU4gIFE4LlU4Ci1xUm93OSAgIFFOICBROS5VOAotcVJvdzEwICBRTiAgUTEwLlU4Ci1xUm93MTEgIFFOICBRMTEuVTgKLXFSb3cxMiAgUU4gIFExMi5VOAotcVJvdzEzICBRTiAgUTEzLlU4Ci1xUm93MTQgIFFOICBRMTQuVTgKLXFSb3cxNSAgUU4gIFExNS5VOAotCi1kUm93MCAgIEROICBEMC5VOAotZFJvdzEgICBETiAgRDEuVTgKLWRSb3cyICAgRE4gIEQyLlU4Ci1kUm93MyAgIEROICBEMy5VOAotZFJvdzQgICBETiAgRDQuVTgKLWRSb3c1ICAgRE4gIEQ1LlU4Ci1kUm93NiAgIEROICBENi5VOAotZFJvdzcgICBETiAgRDcuVTgKLWRSb3c4ICAgRE4gIEQ4LlU4Ci1kUm93OSAgIEROICBEOS5VOAotZFJvdzEwICBETiAgRDEwLlU4Ci1kUm93MTEgIEROICBEMTEuVTgKLWRSb3cxMiAgRE4gIEQxMi5VOAotZFJvdzEzICBETiAgRDEzLlU4Ci1kUm93MTQgIEROICBEMTQuVTgKLWRSb3cxNSAgRE4gIEQxNS5VOAotCi07LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsKLTsgICAgRnVuY3Rpb246IGgyNjRic2RXcml0ZU1hY3JvYmxvY2sKLTsKLTsgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci07ICAgICAgICAgICAgV3JpdGUgb25lIG1hY3JvYmxvY2sgaW50byB0aGUgaW1hZ2UuIEJvdGggbHVtYSBhbmQgY2hyb21hCi07ICAgICAgICAgICAgY29tcG9uZW50cyB3aWxsIGJlIHdyaXR0ZW4gYXQgdGhlIHNhbWUgdGltZS4KLTsKLTsgICAgICAgIElucHV0czoKLTsgICAgICAgICAgICBkYXRhICAgIHBvaW50ZXIgdG8gbWFjcm9ibG9jayBkYXRhIHRvIGJlIHdyaXR0ZW4sIDI1NiB2YWx1ZXMgZm9yCi07ICAgICAgICAgICAgICAgICAgICBsdW1hIGZvbGxvd2VkIGJ5IDY0IHZhbHVlcyBmb3IgYm90aCBjaHJvbWEgY29tcG9uZW50cwotOwotOyAgICAgICAgT3V0cHV0czoKLTsgICAgICAgICAgICBpbWFnZSAgIHBvaW50ZXIgdG8gdGhlIGltYWdlIHdoZXJlIHRoZSBtYWNyb2Jsb2NrIHdpbGwgYmUgd3JpdHRlbgotOwotOyAgICAgICAgUmV0dXJuczoKLTsgICAgICAgICAgICBub25lCi07Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotaDI2NGJzZFdyaXRlTWFjcm9ibG9jawotICAgIFBVU0ggICAge3I0LXI2LGxyfQotICAgIFZQVVNIICAge3E0LXE3fQotCi0gICAgTERSICAgICB3aWR0aCwgW2ltYWdlLCAjNF0KLSAgICBMRFIgICAgIGx1bWEsIFtpbWFnZSwgIzB4Q10KLSAgICBMRFIgICAgIGNiLCBbaW1hZ2UsICMweDEwXQotICAgIExEUiAgICAgY3IsIFtpbWFnZSwgIzB4MTRdCi0KLQotOyAgIFdyaXRlIGx1bWEKLSAgICBWTEQxICAgIHtxUm93MCwgcVJvdzF9LCBbZGF0YV0hCi0gICAgTFNMICAgICB3aWR0aCwgd2lkdGgsICM0Ci0gICAgVkxEMSAgICB7cVJvdzIsIHFSb3czfSwgW2RhdGFdIQotICAgIExTUiAgICAgY3dpZHRoLCB3aWR0aCwgIzEKLSAgICBWU1QxICAgIHtxUm93MH0sIFtsdW1hQDEyOF0sIHdpZHRoCi0gICAgVkxEMSAgICB7cVJvdzQsIHFSb3c1fSwgW2RhdGFdIQotICAgIFZTVDEgICAge3FSb3cxfSwgW2x1bWFAMTI4XSwgd2lkdGgKLSAgICBWTEQxICAgIHtxUm93NiwgcVJvdzd9LCBbZGF0YV0hCi0gICAgVlNUMSAgICB7cVJvdzJ9LCBbbHVtYUAxMjhdLCB3aWR0aAotICAgIFZMRDEgICAge3FSb3c4LCBxUm93OX0sIFtkYXRhXSEKLSAgICBWU1QxICAgIHtxUm93M30sIFtsdW1hQDEyOF0sIHdpZHRoCi0gICAgVkxEMSAgICB7cVJvdzEwLCBxUm93MTF9LCBbZGF0YV0hCi0gICAgVlNUMSAgICB7cVJvdzR9LCBbbHVtYUAxMjhdLCB3aWR0aAotICAgIFZMRDEgICAge3FSb3cxMiwgcVJvdzEzfSwgW2RhdGFdIQotICAgIFZTVDEgICAge3FSb3c1fSwgW2x1bWFAMTI4XSwgd2lkdGgKLSAgICBWTEQxICAgIHtxUm93MTQsIHFSb3cxNX0sIFtkYXRhXSEKLSAgICBWU1QxICAgIHtxUm93Nn0sIFtsdW1hQDEyOF0sIHdpZHRoCi0KLSAgICBWTEQxICAgIHtxUm93MCwgcVJvdzF9LCBbZGF0YV0hIDtjYiByb3dzIDAsMSwyLDMKLSAgICBWU1QxICAgIHtxUm93N30sIFtsdW1hQDEyOF0sIHdpZHRoCi0gICAgVkxEMSAgICB7cVJvdzIsIHFSb3czfSwgW2RhdGFdISA7Y2Igcm93cyA0LDUsNiw3Ci0gICAgVlNUMSAgICB7cVJvdzh9LCBbbHVtYUAxMjhdLCB3aWR0aAotICAgIFZMRDEgICAge3FSb3c0LCBxUm93NX0sIFtkYXRhXSEgO2NyIHJvd3MgMCwxLDIsMwotICAgIFZTVDEgICAge3FSb3c5fSwgW2x1bWFAMTI4XSwgd2lkdGgKLSAgICBWTEQxICAgIHtxUm93NiwgcVJvdzd9LCBbZGF0YV0hIDtjciByb3dzIDQsNSw2LDcKLSAgICBWU1QxICAgIHtxUm93MTB9LCBbbHVtYUAxMjhdLCB3aWR0aAotICAgIFZTVDEgICAge2RSb3cwfSwgW2NiQDY0XSwgY3dpZHRoCi0gICAgVlNUMSAgICB7ZFJvdzh9LCBbY3JANjRdLCBjd2lkdGgKLSAgICBWU1QxICAgIHtxUm93MTF9LCBbbHVtYUAxMjhdLCB3aWR0aAotICAgIFZTVDEgICAge2RSb3cxfSwgW2NiQDY0XSwgY3dpZHRoCi0gICAgVlNUMSAgICB7ZFJvdzl9LCBbY3JANjRdLCBjd2lkdGgKLSAgICBWU1QxICAgIHtxUm93MTJ9LCBbbHVtYUAxMjhdLCB3aWR0aAotICAgIFZTVDEgICAge2RSb3cyfSwgW2NiQDY0XSwgY3dpZHRoCi0gICAgVlNUMSAgICB7ZFJvdzEwfSwgW2NyQDY0XSwgY3dpZHRoCi0gICAgVlNUMSAgICB7cVJvdzEzfSwgW2x1bWFAMTI4XSwgd2lkdGgKLSAgICBWU1QxICAgIHtkUm93M30sIFtjYkA2NF0sIGN3aWR0aAotICAgIFZTVDEgICAge2RSb3cxMX0sIFtjckA2NF0sIGN3aWR0aAotICAgIFZTVDEgICAge3FSb3cxNH0sIFtsdW1hQDEyOF0sIHdpZHRoCi0gICAgVlNUMSAgICB7ZFJvdzR9LCBbY2JANjRdLCBjd2lkdGgKLSAgICBWU1QxICAgIHtkUm93MTJ9LCBbY3JANjRdLCBjd2lkdGgKLSAgICBWU1QxICAgIHtxUm93MTV9LCBbbHVtYV0KLSAgICBWU1QxICAgIHtkUm93NX0sIFtjYkA2NF0sIGN3aWR0aAotICAgIFZTVDEgICAge2RSb3cxM30sIFtjckA2NF0sIGN3aWR0aAotICAgIFZTVDEgICAge2RSb3c2fSwgW2NiQDY0XSwgY3dpZHRoCi0gICAgVlNUMSAgICB7ZFJvdzE0fSwgW2NyQDY0XSwgY3dpZHRoCi0gICAgVlNUMSAgICB7ZFJvdzd9LCBbY2JANjRdCi0gICAgVlNUMSAgICB7ZFJvdzE1fSwgW2NyQDY0XQotCi0gICAgVlBPUCAgICB7cTQtcTd9Ci0gICAgUE9QICAgICB7cjQtcjYscGN9Ci0gICAgRU5ECi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2FzbV9jb21tb24uUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtX2djYy9hc21fY29tbW9uLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2OWE3NWMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2FzbV9jb21tb24uUworKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLUAKLUAgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLUAKLUAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci1AIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLUAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci1ACi1AICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi1ACi1AIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLUAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLUAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi1AIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLUAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi1ACi0KLQotCi0KLSAgICAubWFjcm8gUkVRVUlSRTgKLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKLSAgICAuZW5kbQotCi0gICAgLm1hY3JvIFBSRVNFUlZFOAotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQotICAgIC5lbmRtCi0KLQotICAgIC5tYWNybyBmdW5jdGlvbiBuYW1lLCBleHBvcnQ9MAotLmlmIFxleHBvcnQKLSAgICAuZ2xvYmFsIFxuYW1lCi0uZW5kaWYKLSAgICAudHlwZSAgIFxuYW1lLCAlZnVuY3Rpb24KLVxuYW1lOgotICAgIC5lbmRtCi0KLSAgICAubWFjcm8gZW5kZnVuY3Rpb24KLSAgICAuZW5kbQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbV9nY2MvaDI2NGJzZENsZWFyTWJMYXllci5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2gyNjRic2RDbGVhck1iTGF5ZXIuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MyNzUyZi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbV9nY2MvaDI2NGJzZENsZWFyTWJMYXllci5TCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotQAotQCBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotQAotQCBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLUAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotQCBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLUAKLUAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLUAKLUAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotQCBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotQCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLUAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotQCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLUAKLQotI2luY2x1ZGUgImFzbV9jb21tb24uUyIKLQotICAgIFBSRVNFUlZFOAotCi0gICAgLmZwdSBuZW9uCi0gICAgLnRleHQKLQotLyogSW5wdXQgLyBvdXRwdXQgcmVnaXN0ZXJzICovCi0jZGVmaW5lIHBNYkxheWVyICAgIHIwCi0jZGVmaW5lIHNpemUgICAgICAgIHIxCi0jZGVmaW5lIHBUbXAgICAgICAgIHIyCi0jZGVmaW5lIHN0ZXAgICAgICAgIHIzCi0KLS8qIC0tIE5FT04gcmVnaXN0ZXJzIC0tICovCi0KLSNkZWZpbmUgcVplcm8gICBRMAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RDbGVhck1iTGF5ZXIKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotCi0gICAgICAgIElucHV0czoKLQotICAgICAgICBPdXRwdXRzOgotCi0gICAgICAgIFJldHVybnM6Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLWZ1bmN0aW9uIGgyNjRic2RDbGVhck1iTGF5ZXIsIGV4cG9ydD0xCi0KLSAgICBWTU9WLkk4IHFaZXJvLCAjMAotICAgIEFERCAgICAgcFRtcCwgcE1iTGF5ZXIsICMxNgotICAgIE1PViAgICAgc3RlcCwgIzMyCi0gICAgU1VCUyAgICBzaXplLCBzaXplLCAjNjQKLQotbG9vcDoKLSAgICBWU1QxLjggIHtxWmVyb30sIFtwTWJMYXllcl0sIHN0ZXAKLSAgICBTVUJTICAgIHNpemUsIHNpemUsICM2NAotICAgIFZTVDEuOCAge3FaZXJvfSwgW3BUbXBdLCBzdGVwCi0gICAgVlNUMS44ICB7cVplcm99LCBbcE1iTGF5ZXJdLCBzdGVwCi0gICAgVlNUMS44ICB7cVplcm99LCBbcFRtcF0sIHN0ZXAKLSAgICBCQ1MgICAgIGxvb3AKLQotICAgIEJYICAgICAgbHIKLQotZW5kZnVuY3Rpb24KLQotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtX2djYy9oMjY0YnNkQ291bnRMZWFkaW5nWmVyb3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtX2djYy9oMjY0YnNkQ291bnRMZWFkaW5nWmVyb3MuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFjOWY2MC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbV9nY2MvaDI2NGJzZENvdW50TGVhZGluZ1plcm9zLlMKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi1ACi1AIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci1ACi1AIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotQCB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi1AIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotQAotQCAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotQAotQCBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi1AIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi1AIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotQCBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi1AIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotQAotI2luY2x1ZGUgImFzbV9jb21tb24uUyIKLQotICAgIFBSRVNFUlZFOAotICAgIC5hcm0KLSAgICAudGV4dAotCi0KLS8qIElucHV0IC8gb3V0cHV0IHJlZ2lzdGVycyAqLwotI2RlZmluZSB2YWx1ZSAgICByMAotCi0vKiAtLSBORU9OIHJlZ2lzdGVycyAtLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RDb3VudExlYWRpbmdaZXJvcwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0KLSAgICAgICAgSW5wdXRzOgotCi0gICAgICAgIE91dHB1dHM6Ci0KLSAgICAgICAgUmV0dXJuczoKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotZnVuY3Rpb24gaDI2NGJzZENvdW50TGVhZGluZ1plcm9zLCBleHBvcnQ9MQotCi0gICAgQ0xaICAgICB2YWx1ZSwgdmFsdWUKLSAgICBCWCAgICAgIGxyCi0KLWVuZGZ1bmN0aW9uCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtX2djYy9oMjY0YnNkRmlsbFJvdzcuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtX2djYy9oMjY0YnNkRmlsbFJvdzcuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVkNjIyNy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbV9nY2MvaDI2NGJzZEZpbGxSb3c3LlMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotQAotQCBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotQAotQCBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLUAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotQCBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLUAKLUAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLUAKLUAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotQCBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotQCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLUAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotQCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLUAKLQotI2luY2x1ZGUgImFzbV9jb21tb24uUyIKLQotICAgIFBSRVNFUlZFOAotCi0gICAgLmZwdSBuZW9uCi0gICAgLnRleHQKLQotLyogSW5wdXQgLyBvdXRwdXQgcmVnaXN0ZXJzICovCi0KLSNkZWZpbmUgcmVmICAgICByMAotI2RlZmluZSBmaWxsICAgIHIxCi0jZGVmaW5lIGxlZnQgICAgcjIKLSNkZWZpbmUgdG1wMiAgICByMgotI2RlZmluZSBjZW50ZXIgIHIzCi0jZGVmaW5lIHJpZ2h0ICAgcjQKLSNkZWZpbmUgdG1wMSAgICByNQotCi0vKiAtLSBORU9OIHJlZ2lzdGVycyAtLSAqLwotCi0jZGVmaW5lIHFUbXAwICAgICBRMAotI2RlZmluZSBxVG1wMSAgICAgUTEKLSNkZWZpbmUgZFRtcDAgICAgIEQwCi0jZGVmaW5lIGRUbXAxICAgICBEMQotI2RlZmluZSBkVG1wMiAgICAgRDIKLSNkZWZpbmUgZFRtcDMgICAgIEQzCi0KLS8qCi12b2lkIGgyNjRic2RGaWxsUm93Nyhjb25zdCB1OCAqIHJlZiwgdTggKiBmaWxsLCBpMzIgbGVmdCwgaTMyIGNlbnRlciwKLSAgICAgICAgICAgICAgICAgICAgIGkzMiByaWdodCk7Ci0qLwotCi1mdW5jdGlvbiBoMjY0YnNkRmlsbFJvdzcsIGV4cG9ydD0xCi0KLSAgICAgICAgUFVTSCAgICAge3I0LXI2LGxyfQotICAgICAgICBDTVAgICAgICBsZWZ0LCAjMAotICAgICAgICBMRFIgICAgICByaWdodCwgW3NwLCMweDEwXQotICAgICAgICBCRVEgICAgICBzd2l0Y2hfY2VudGVyCi0gICAgICAgIExEUkIgICAgIHRtcDEsIFtyZWYsIzBdCi0KLWxvb3BfbGVmdDoKLSAgICAgICAgU1VCUyAgICAgbGVmdCwgbGVmdCwgIzEKLSAgICAgICAgU1RSQiAgICAgdG1wMSwgW2ZpbGxdLCAjMQotICAgICAgICBCTkUgICAgICBsb29wX2xlZnQKLQotc3dpdGNoX2NlbnRlcjoKLSAgICAgICAgQVNSICAgICAgdG1wMixjZW50ZXIsIzIKLSAgICAgICAgQ01QICAgICAgdG1wMiwjOQotICAgICAgICBBRERDQyAgICBwYyxwYyx0bXAyLExTTCAjMgotICAgICAgICBCICAgICAgICBsb29wX2NlbnRlcgotICAgICAgICBCICAgICAgICBsb29wX2NlbnRlcgotICAgICAgICBCICAgICAgICBjYXNlXzEKLSAgICAgICAgQiAgICAgICAgY2FzZV8yCi0gICAgICAgIEIgICAgICAgIGNhc2VfMwotICAgICAgICBCICAgICAgICBjYXNlXzQKLSAgICAgICAgQiAgICAgICAgY2FzZV81Ci0gICAgICAgIEIgICAgICAgIGNhc2VfNgotICAgICAgICBCICAgICAgICBjYXNlXzcKLSAgICAgICAgQiAgICAgICAgY2FzZV84Ci0KLWNhc2VfODoKLSAgICAgICAgVkxEMS44ICB7cVRtcDAsIHFUbXAxfSwgW3JlZl0hCi0gICAgICAgIFNVQiAgICAgY2VudGVyLCBjZW50ZXIsICMzMgotICAgICAgICBWU1QxLjggIHtxVG1wMH0sIFtmaWxsXSEKLSAgICAgICAgVlNUMS44ICB7cVRtcDF9LCBbZmlsbF0hCi0gICAgICAgIEIgICAgICAgbG9vcF9jZW50ZXIKLWNhc2VfNzoKLSAgICAgICAgVkxEMS44ICB7ZFRtcDAsZFRtcDEsZFRtcDJ9LCBbcmVmXSEKLSAgICAgICAgU1VCICAgICBjZW50ZXIsIGNlbnRlciwgIzI4Ci0gICAgICAgIExEUiAgICAgdG1wMiwgW3JlZl0sICM0Ci0gICAgICAgIFZTVDEuOCAge2RUbXAwLGRUbXAxLGRUbXAyfSwgW2ZpbGxdIQotICAgICAgICBTVFIgICAgIHRtcDIsIFtmaWxsXSwjNAotICAgICAgICBCICAgICAgIGxvb3BfY2VudGVyCi1jYXNlXzY6Ci0gICAgICAgIFZMRDEuOCAge2RUbXAwLGRUbXAxLGRUbXAyfSwgW3JlZl0hCi0gICAgICAgIFNVQiAgICAgY2VudGVyLCBjZW50ZXIsICMyNAotICAgICAgICBWU1QxLjggIHtkVG1wMCxkVG1wMSxkVG1wMn0sIFtmaWxsXSEKLSAgICAgICAgQiAgICAgICBsb29wX2NlbnRlcgotY2FzZV81OgotICAgICAgICBWTEQxLjggIHtxVG1wMH0sIFtyZWZdIQotICAgICAgICBTVUIgICAgIGNlbnRlciwgY2VudGVyLCAjMjAKLSAgICAgICAgTERSICAgICB0bXAyLCBbcmVmXSwgIzQKLSAgICAgICAgVlNUMS44ICB7cVRtcDB9LCBbZmlsbF0hCi0gICAgICAgIFNUUiAgICAgdG1wMiwgW2ZpbGxdLCM0Ci0gICAgICAgIEIgICAgICAgbG9vcF9jZW50ZXIKLWNhc2VfNDoKLSAgICAgICAgVkxEMS44ICB7cVRtcDB9LCBbcmVmXSEKLSAgICAgICAgU1VCICAgICBjZW50ZXIsIGNlbnRlciwgIzE2Ci0gICAgICAgIFZTVDEuOCAge3FUbXAwfSwgW2ZpbGxdIQotICAgICAgICBCICAgICAgIGxvb3BfY2VudGVyCi1jYXNlXzM6Ci0gICAgICAgIFZMRDEuOCAge2RUbXAwfSwgW3JlZl0hCi0gICAgICAgIFNVQiAgICAgY2VudGVyLCBjZW50ZXIsICMxMgotICAgICAgICBMRFIgICAgIHRtcDIsIFtyZWZdLCAjNAotICAgICAgICBWU1QxLjggIGRUbXAwLCBbZmlsbF0hCi0gICAgICAgIFNUUiAgICAgdG1wMiwgW2ZpbGxdLCM0Ci0gICAgICAgIEIgICAgICAgbG9vcF9jZW50ZXIKLWNhc2VfMjoKLSAgICAgICAgTERSICAgICAgdG1wMiwgW3JlZl0sIzQKLSAgICAgICAgU1VCICAgICAgY2VudGVyLCBjZW50ZXIsICM0Ci0gICAgICAgIFNUUiAgICAgIHRtcDIsIFtmaWxsXSwgIzQKLWNhc2VfMToKLSAgICAgICAgTERSICAgICAgdG1wMiwgW3JlZl0sIzQKLSAgICAgICAgU1VCICAgICAgY2VudGVyLCBjZW50ZXIsICM0Ci0gICAgICAgIFNUUiAgICAgIHRtcDIsIFtmaWxsXSwgIzQKLQotbG9vcF9jZW50ZXI6Ci0gICAgICAgIENNUCAgICAgIGNlbnRlciwgIzAKLSAgICAgICAgQkVRICAgICAganVtcAotICAgICAgICBMRFJCICAgICB0bXAyLCBbcmVmXSwgIzEKLSAgICAgICAgU1VCICAgICAgY2VudGVyLCBjZW50ZXIsICMxCi0gICAgICAgIFNUUkIgICAgIHRtcDIsIFtmaWxsXSwgIzEKLSAgICAgICAgQk5FICAgICAgbG9vcF9jZW50ZXIKLWp1bXA6Ci0gICAgICAgIENNUCAgICAgIHJpZ2h0LCMwCi0gICAgICAgIFBPUEVRICAgIHtyNC1yNixwY30KLSAgICAgICAgTERSQiAgICAgdG1wMiwgW3JlZiwjLTFdCi0KLWxvb3BfcmlnaHQ6Ci0gICAgICAgIFNUUkIgICAgIHRtcDIsIFtmaWxsXSwgIzEKLSAgICAgICAgU1VCUyAgICAgcmlnaHQsIHJpZ2h0LCAjMQotICAgICAgICBCTkUgICAgICBsb29wX3JpZ2h0Ci0KLSAgICAgICAgUE9QICAgICAge3I0LXI2LHBjfQotCi1lbmRmdW5jdGlvbgotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtX2djYy9oMjY0YnNkRmx1c2hCaXRzLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbV9nY2MvaDI2NGJzZEZsdXNoQml0cy5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTg4NDcxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtX2djYy9oMjY0YnNkRmx1c2hCaXRzLlMKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi1ACi1AIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci1ACi1AIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotQCB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi1AIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotQAotQCAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotQAotQCBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi1AIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi1AIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotQCBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi1AIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotQAotCi0jaW5jbHVkZSAiYXNtX2NvbW1vbi5TIgotCi0gICAgUFJFU0VSVkU4Ci0KLSAgICAuYXJtCi0gICAgLnRleHQKLQotLyogSW5wdXQgLyBvdXRwdXQgcmVnaXN0ZXJzICovCi0jZGVmaW5lIHBTdHJtRGF0YSAgICAgICByMAotI2RlZmluZSBudW1CaXRzICAgICAgICAgcjEKLSNkZWZpbmUgcmVhZEJpdHMgICAgICAgIHIyCi0jZGVmaW5lIHN0cm1CdWZmU2l6ZSAgICByMwotI2RlZmluZSBwU3RybUJ1ZmZTdGFydCAgcjEKLSNkZWZpbmUgcFN0cm1DdXJyUG9zICAgIHIyCi0jZGVmaW5lIGJpdFBvc0luV29yZCAgICByMQotCi0vKiBJbnB1dCAvIG91dHB1dCByZWdpc3RlcnMgKi8KLQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZEZsdXNoQml0cwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0KLSAgICAgICAgSW5wdXRzOgotCi0gICAgICAgIE91dHB1dHM6Ci0KLSAgICAgICAgUmV0dXJuczoKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWZ1bmN0aW9uIGgyNjRic2RGbHVzaEJpdHMsIGV4cG9ydD0xCi0KLSAgICBMRFIgcmVhZEJpdHMsIFtwU3RybURhdGEsICMweDEwXQotICAgIExEUiBzdHJtQnVmZlNpemUsIFtwU3RybURhdGEsICMweENdCi0KLSAgICBBREQgcmVhZEJpdHMsIHJlYWRCaXRzLCBudW1CaXRzCi0gICAgQU5EIGJpdFBvc0luV29yZCwgcmVhZEJpdHMsICM3Ci0KLSAgICBTVFIgcmVhZEJpdHMsIFtwU3RybURhdGEsICMweDEwXQotICAgIFNUUiBiaXRQb3NJbldvcmQsIFtwU3RybURhdGEsICMweDhdCi0KLSAgICBMRFIgcFN0cm1CdWZmU3RhcnQsIFtwU3RybURhdGEsICMweDBdCi0KLSAgICBDTVAgcmVhZEJpdHMsIHN0cm1CdWZmU2l6ZSwgTFNMICMzCi0KLSAgICBCSEkgZW5kX29mX3N0cmVhbQotCi0gICAgQUREIHBTdHJtQ3VyclBvcywgcFN0cm1CdWZmU3RhcnQsIHJlYWRCaXRzLCBMU1IgIzMKLSAgICBTVFIgcFN0cm1DdXJyUG9zLCBbcFN0cm1EYXRhLCAjMHg0XQotICAgIE1PViByMCwgIzAKLSAgICBCWCAgbHIKLQotZW5kX29mX3N0cmVhbToKLSAgICBNVk4gcjAsICMwCi0gICAgQlggIGxyCi0KLWVuZGZ1bmN0aW9uCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2gyNjRic2RXcml0ZU1hY3JvYmxvY2suUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtX2djYy9oMjY0YnNkV3JpdGVNYWNyb2Jsb2NrLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwOTNiOTIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2gyNjRic2RXcml0ZU1hY3JvYmxvY2suUworKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi1ACi1AIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci1ACi1AIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotQCB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi1AIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotQAotQCAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotQAotQCBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi1AIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi1AIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotQCBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi1AIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotQAotCi0jaW5jbHVkZSAiYXNtX2NvbW1vbi5TIgotCi0gICAgUkVRVUlSRTgKLSAgICBQUkVTRVJWRTgKLQotICAgIC5hcm0KLSAgICAuZnB1IG5lb24KLSAgICAudGV4dAotCi0vKiBJbnB1dCAvIG91dHB1dCByZWdpc3RlcnMgKi8KLSNkZWZpbmUgaW1hZ2UgICByMAotI2RlZmluZSBkYXRhICAgIHIxCi0jZGVmaW5lIHdpZHRoICAgcjIKLSNkZWZpbmUgbHVtYSAgICByMwotI2RlZmluZSBjYiAgICAgIHI0Ci0jZGVmaW5lIGNyICAgICAgcjUKLSNkZWZpbmUgY3dpZHRoICByNgotCi0vKiAtLSBORU9OIHJlZ2lzdGVycyAtLSAqLwotCi0jZGVmaW5lIHFSb3cwICAgICBRMAotI2RlZmluZSBxUm93MSAgICAgUTEKLSNkZWZpbmUgcVJvdzIgICAgIFEyCi0jZGVmaW5lIHFSb3czICAgICBRMwotI2RlZmluZSBxUm93NCAgICAgUTQKLSNkZWZpbmUgcVJvdzUgICAgIFE1Ci0jZGVmaW5lIHFSb3c2ICAgICBRNgotI2RlZmluZSBxUm93NyAgICAgUTcKLSNkZWZpbmUgcVJvdzggICAgIFE4Ci0jZGVmaW5lIHFSb3c5ICAgICBROQotI2RlZmluZSBxUm93MTAgICAgUTEwCi0jZGVmaW5lIHFSb3cxMSAgICBRMTEKLSNkZWZpbmUgcVJvdzEyICAgIFExMgotI2RlZmluZSBxUm93MTMgICAgUTEzCi0jZGVmaW5lIHFSb3cxNCAgICBRMTQKLSNkZWZpbmUgcVJvdzE1ICAgIFExNQotCi0jZGVmaW5lIGRSb3cwICAgICBEMAotI2RlZmluZSBkUm93MSAgICAgRDEKLSNkZWZpbmUgZFJvdzIgICAgIEQyCi0jZGVmaW5lIGRSb3czICAgICBEMwotI2RlZmluZSBkUm93NCAgICAgRDQKLSNkZWZpbmUgZFJvdzUgICAgIEQ1Ci0jZGVmaW5lIGRSb3c2ICAgICBENgotI2RlZmluZSBkUm93NyAgICAgRDcKLSNkZWZpbmUgZFJvdzggICAgIEQ4Ci0jZGVmaW5lIGRSb3c5ICAgICBEOQotI2RlZmluZSBkUm93MTAgICAgRDEwCi0jZGVmaW5lIGRSb3cxMSAgICBEMTEKLSNkZWZpbmUgZFJvdzEyICAgIEQxMgotI2RlZmluZSBkUm93MTMgICAgRDEzCi0jZGVmaW5lIGRSb3cxNCAgICBEMTQKLSNkZWZpbmUgZFJvdzE1ICAgIEQxNQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RXcml0ZU1hY3JvYmxvY2sKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgV3JpdGUgb25lIG1hY3JvYmxvY2sgaW50byB0aGUgaW1hZ2UuIEJvdGggbHVtYSBhbmQgY2hyb21hCi0gICAgICAgICAgICBjb21wb25lbnRzIHdpbGwgYmUgd3JpdHRlbiBhdCB0aGUgc2FtZSB0aW1lLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIGRhdGEgICAgcG9pbnRlciB0byBtYWNyb2Jsb2NrIGRhdGEgdG8gYmUgd3JpdHRlbiwgMjU2IHZhbHVlcyBmb3IKLSAgICAgICAgICAgICAgICAgICAgbHVtYSBmb2xsb3dlZCBieSA2NCB2YWx1ZXMgZm9yIGJvdGggY2hyb21hIGNvbXBvbmVudHMKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgaW1hZ2UgICBwb2ludGVyIHRvIHRoZSBpbWFnZSB3aGVyZSB0aGUgbWFjcm9ibG9jayB3aWxsIGJlIHdyaXR0ZW4KLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgbm9uZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1mdW5jdGlvbiBoMjY0YnNkV3JpdGVNYWNyb2Jsb2NrLCBleHBvcnQ9MQotICAgIFBVU0ggICAge3I0LXI2LGxyfQotICAgIFZQVVNIICAge3E0LXE3fQotCi0gICAgTERSICAgICB3aWR0aCwgW2ltYWdlLCAjNF0KLSAgICBMRFIgICAgIGx1bWEsIFtpbWFnZSwgIzB4Q10KLSAgICBMRFIgICAgIGNiLCBbaW1hZ2UsICMweDEwXQotICAgIExEUiAgICAgY3IsIFtpbWFnZSwgIzB4MTRdCi0KLQotQCAgIFdyaXRlIGx1bWEKLSAgICBWTEQxLjggIHtxUm93MCwgcVJvdzF9LCBbZGF0YV0hCi0gICAgTFNMICAgICB3aWR0aCwgd2lkdGgsICM0Ci0gICAgVkxEMS44ICB7cVJvdzIsIHFSb3czfSwgW2RhdGFdIQotICAgIExTUiAgICAgY3dpZHRoLCB3aWR0aCwgIzEKLSAgICBWU1QxLjggIHtxUm93MH0sIFtsdW1hLDoxMjhdLCB3aWR0aAotICAgIFZMRDEuOCAge3FSb3c0LCBxUm93NX0sIFtkYXRhXSEKLSAgICBWU1QxLjggIHtxUm93MX0sIFtsdW1hLDoxMjhdLCB3aWR0aAotICAgIFZMRDEuOCAge3FSb3c2LCBxUm93N30sIFtkYXRhXSEKLSAgICBWU1QxLjggIHtxUm93Mn0sIFtsdW1hLDoxMjhdLCB3aWR0aAotICAgIFZMRDEuOCAge3FSb3c4LCBxUm93OX0sIFtkYXRhXSEKLSAgICBWU1QxLjggIHtxUm93M30sIFtsdW1hLDoxMjhdLCB3aWR0aAotICAgIFZMRDEuOCAge3FSb3cxMCwgcVJvdzExfSwgW2RhdGFdIQotICAgIFZTVDEuOCAge3FSb3c0fSwgW2x1bWEsOjEyOF0sIHdpZHRoCi0gICAgVkxEMS44ICB7cVJvdzEyLCBxUm93MTN9LCBbZGF0YV0hCi0gICAgVlNUMS44ICB7cVJvdzV9LCBbbHVtYSw6MTI4XSwgd2lkdGgKLSAgICBWTEQxLjggIHtxUm93MTQsIHFSb3cxNX0sIFtkYXRhXSEKLSAgICBWU1QxLjggIHtxUm93Nn0sIFtsdW1hLDoxMjhdLCB3aWR0aAotCi0gICAgVkxEMS44ICB7cVJvdzAsIHFSb3cxfSwgW2RhdGFdISA7Ly9jYiByb3dzIDAsMSwyLDMKLSAgICBWU1QxLjggIHtxUm93N30sIFtsdW1hLDoxMjhdLCB3aWR0aAotICAgIFZMRDEuOCAge3FSb3cyLCBxUm93M30sIFtkYXRhXSEgOy8vY2Igcm93cyA0LDUsNiw3Ci0gICAgVlNUMS44ICB7cVJvdzh9LCBbbHVtYSw6MTI4XSwgd2lkdGgKLSAgICBWTEQxLjggIHtxUm93NCwgcVJvdzV9LCBbZGF0YV0hIDsvL2NyIHJvd3MgMCwxLDIsMwotICAgIFZTVDEuOCAge3FSb3c5fSwgW2x1bWEsOjEyOF0sIHdpZHRoCi0gICAgVkxEMS44ICB7cVJvdzYsIHFSb3c3fSwgW2RhdGFdISA7Ly9jciByb3dzIDQsNSw2LDcKLSAgICBWU1QxLjggIHtxUm93MTB9LCBbbHVtYSw6MTI4XSwgd2lkdGgKLSAgICBWU1QxLjggIHtkUm93MH0sIFtjYiw6NjRdLCBjd2lkdGgKLSAgICBWU1QxLjggIHtkUm93OH0sIFtjciw6NjRdLCBjd2lkdGgKLSAgICBWU1QxLjggIHtxUm93MTF9LCBbbHVtYSw6MTI4XSwgd2lkdGgKLSAgICBWU1QxLjggIHtkUm93MX0sIFtjYiw6NjRdLCBjd2lkdGgKLSAgICBWU1QxLjggIHtkUm93OX0sIFtjciw6NjRdLCBjd2lkdGgKLSAgICBWU1QxLjggIHtxUm93MTJ9LCBbbHVtYSw6MTI4XSwgd2lkdGgKLSAgICBWU1QxLjggIHtkUm93Mn0sIFtjYiw6NjRdLCBjd2lkdGgKLSAgICBWU1QxLjggIHtkUm93MTB9LCBbY3IsOjY0XSwgY3dpZHRoCi0gICAgVlNUMS44ICB7cVJvdzEzfSwgW2x1bWEsOjEyOF0sIHdpZHRoCi0gICAgVlNUMS44ICB7ZFJvdzN9LCBbY2IsOjY0XSwgY3dpZHRoCi0gICAgVlNUMS44ICB7ZFJvdzExfSwgW2NyLDo2NF0sIGN3aWR0aAotICAgIFZTVDEuOCAge3FSb3cxNH0sIFtsdW1hLDoxMjhdLCB3aWR0aAotICAgIFZTVDEuOCAge2RSb3c0fSwgW2NiLDo2NF0sIGN3aWR0aAotICAgIFZTVDEuOCAge2RSb3cxMn0sIFtjciw6NjRdLCBjd2lkdGgKLSAgICBWU1QxLjggIHtxUm93MTV9LCBbbHVtYV0KLSAgICBWU1QxLjggIHtkUm93NX0sIFtjYiw6NjRdLCBjd2lkdGgKLSAgICBWU1QxLjggIHtkUm93MTN9LCBbY3IsOjY0XSwgY3dpZHRoCi0gICAgVlNUMS44ICB7ZFJvdzZ9LCBbY2IsOjY0XSwgY3dpZHRoCi0gICAgVlNUMS44ICB7ZFJvdzE0fSwgW2NyLDo2NF0sIGN3aWR0aAotICAgIFZTVDEuOCAge2RSb3c3fSwgW2NiLDo2NF0KLSAgICBWU1QxLjggIHtkUm93MTV9LCBbY3IsOjY0XQotCi0gICAgVlBPUCAgICB7cTQtcTd9Ci0gICAgUE9QICAgICB7cjQtcjYscGN9Ci1AICAgIEJYICAgICAgbHIKLQotCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2J5dGVfc3RyZWFtLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfYnl0ZV9zdHJlYW0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI3N2Y4Yy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfYnl0ZV9zdHJlYW0uYworKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0gICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0gICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLSAgICAgNS4gRnVuY3Rpb25zCi0gICAgICAgICAgRXh0cmFjdE5hbFVuaXQKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJoMjY0YnNkX2J5dGVfc3RyZWFtLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNkZWZpbmUgQllURV9TVFJFQU1fRVJST1IgIDB4RkZGRkZGRkYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb24gbmFtZTogRXh0cmFjdE5hbFVuaXQKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRXh0cmFjdHMgb25lIE5BTCB1bml0IGZyb20gdGhlIGJ5dGUgc3RyZWFtIGJ1ZmZlci4gUmVtb3ZlcwotICAgICAgICAgICAgZW11bGF0aW9uIHByZXZlbnRpb24gYnl0ZXMgaWYgcHJlc2VudC4gVGhlIG9yaWdpbmFsIHN0cmVhbSBidWZmZXIKLSAgICAgICAgICAgIGlzIHVzZWQgZGlyZWN0bHkgYW5kIGlzIHRoZXJlZm9yZSBtb2RpZmllZCBpZiBlbXVsYXRpb24gcHJldmVudGlvbgotICAgICAgICAgICAgYnl0ZXMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cmVhbS4KLQotICAgICAgICAgICAgU3RyZWFtIGJ1ZmZlciBpcyBhc3N1bWVkIHRvIGNvbnRhaW4gZWl0aGVyIGV4YWN0bHkgb25lIE5BTCB1bml0Ci0gICAgICAgICAgICBhbmQgbm90aGluZyBlbHNlLCBvciBvbmUgb3IgbW9yZSBOQUwgdW5pdHMgZW1iZWRkZWQgaW4gYnl0ZQotICAgICAgICAgICAgc3RyZWFtIGZvcm1hdCBkZXNjcmliZWQgaW4gdGhlIEFubmV4IEIgb2YgdGhlIHN0YW5kYXJkLiBGdW5jdGlvbgotICAgICAgICAgICAgZGV0ZWN0cyB3aGljaCBvbmUgaXMgdXNlZCBiYXNlZCBvbiB0aGUgZmlyc3QgYnl0ZXMgaW4gdGhlIGJ1ZmZlci4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwQnl0ZVN0cmVhbSAgICAgcG9pbnRlciB0byBieXRlIHN0cmVhbSBidWZmZXIKLSAgICAgICAgICAgIGxlbiAgICAgICAgICAgICBsZW5ndGggb2YgdGhlIHN0cmVhbSBidWZmZXIgKGluIGJ5dGVzKQotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBwU3RybURhdGEgICAgICAgc3RyZWFtIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBoZXJlCi0gICAgICAgICAgICByZWFkQnl0ZXMgICAgICAgbnVtYmVyIG9mIGJ5dGVzICJjb25zdW1lZCIgZnJvbSB0aGUgc3RyZWFtIGJ1ZmZlcgotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcwotICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIGVycm9yIGluIGJ5dGUgc3RyZWFtCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkRXh0cmFjdE5hbFVuaXQodTggKnBCeXRlU3RyZWFtLCB1MzIgbGVuLCBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gICAgdTMyICpyZWFkQnl0ZXMpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGksIHRtcDsKLSAgICB1MzIgYnl0ZUNvdW50LGluaXRCeXRlQ291bnQ7Ci0gICAgdTMyIHplcm9Db3VudDsKLSAgICB1OCAgYnl0ZTsKLSAgICB1MzIgaGFzRW11bGF0aW9uID0gSEFOVFJPX0ZBTFNFOwotICAgIHUzMiBpbnZhbGlkU3RyZWFtID0gSEFOVFJPX0ZBTFNFOwotICAgIHU4ICpyZWFkUHRyLCAqd3JpdGVQdHI7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwQnl0ZVN0cmVhbSk7Ci0gICAgQVNTRVJUKGxlbik7Ci0gICAgQVNTRVJUKGxlbiA8IEJZVEVfU1RSRUFNX0VSUk9SKTsKLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLQotICAgIC8qIGJ5dGUgc3RyZWFtIGZvcm1hdCBpZiBzdGFydHMgd2l0aCAweDAwMDAwMSBvciAweDAwMDAwMCAqLwotICAgIGlmIChsZW4gPiAzICYmIHBCeXRlU3RyZWFtWzBdID09IDB4MDAgJiYgcEJ5dGVTdHJlYW1bMV0gPT0gMHgwMCAmJgotICAgICAgICAocEJ5dGVTdHJlYW1bMl0mMHhGRSkgPT0gMHgwMCkKLSAgICB7Ci0gICAgICAgIC8qIHNlYXJjaCBmb3IgTkFMIHVuaXQgc3RhcnQgcG9pbnQsIGkuZS4gcG9pbnQgYWZ0ZXIgZmlyc3Qgc3RhcnQgY29kZQotICAgICAgICAgKiBwcmVmaXggaW4gdGhlIHN0cmVhbSAqLwotICAgICAgICB6ZXJvQ291bnQgPSBieXRlQ291bnQgPSAyOwotICAgICAgICByZWFkUHRyID0gcEJ5dGVTdHJlYW0gKyAyOwotICAgICAgICAvKmxpbnQgLWUoNzE2KSB3aGlsZSgxKSB1c2VkIGNvbnNjaW91c2x5ICovCi0gICAgICAgIHdoaWxlICgxKQotICAgICAgICB7Ci0gICAgICAgICAgICBieXRlID0gKnJlYWRQdHIrKzsKLSAgICAgICAgICAgIGJ5dGVDb3VudCsrOwotCi0gICAgICAgICAgICBpZiAoYnl0ZUNvdW50ID09IGxlbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBubyBzdGFydCBjb2RlIHByZWZpeCBmb3VuZCAtPiBlcnJvciAqLwotICAgICAgICAgICAgICAgICpyZWFkQnl0ZXMgPSBsZW47Ci0gICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIWJ5dGUpCi0gICAgICAgICAgICAgICAgemVyb0NvdW50Kys7Ci0gICAgICAgICAgICBlbHNlIGlmICgoYnl0ZSA9PSAweDAxKSAmJiAoemVyb0NvdW50ID49IDIpKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHplcm9Db3VudCA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpbml0Qnl0ZUNvdW50ID0gYnl0ZUNvdW50OwotCi0gICAgICAgIC8qIGRldGVybWluZSBzaXplIG9mIHRoZSBOQUwgdW5pdC4gU2VhcmNoIGZvciBuZXh0IHN0YXJ0IGNvZGUgcHJlZml4Ci0gICAgICAgICAqIG9yIGVuZCBvZiBzdHJlYW0gYW5kIGlnbm9yZSBwb3NzaWJsZSB0cmFpbGluZyB6ZXJvIGJ5dGVzICovCi0gICAgICAgIHplcm9Db3VudCA9IDA7Ci0gICAgICAgIC8qbGludCAtZSg3MTYpIHdoaWxlKDEpIHVzZWQgY29uc2Npb3VzbHkgKi8KLSAgICAgICAgd2hpbGUgKDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJ5dGUgPSAqcmVhZFB0cisrOwotICAgICAgICAgICAgYnl0ZUNvdW50Kys7Ci0gICAgICAgICAgICBpZiAoIWJ5dGUpCi0gICAgICAgICAgICAgICAgemVyb0NvdW50Kys7Ci0KLSAgICAgICAgICAgIGlmICggKGJ5dGUgPT0gMHgwMykgJiYgKHplcm9Db3VudCA9PSAyKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaGFzRW11bGF0aW9uID0gSEFOVFJPX1RSVUU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICggKGJ5dGUgPT0gMHgwMSkgJiYgKHplcm9Db3VudCA+PSAyICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBTdHJtRGF0YS0+c3RybUJ1ZmZTaXplID0KLSAgICAgICAgICAgICAgICAgICAgYnl0ZUNvdW50IC0gaW5pdEJ5dGVDb3VudCAtIHplcm9Db3VudCAtIDE7Ci0gICAgICAgICAgICAgICAgemVyb0NvdW50IC09IE1JTih6ZXJvQ291bnQsIDMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoYnl0ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoemVyb0NvdW50ID49IDMpCi0gICAgICAgICAgICAgICAgICAgIGludmFsaWRTdHJlYW0gPSBIQU5UUk9fVFJVRTsKLSAgICAgICAgICAgICAgICB6ZXJvQ291bnQgPSAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoYnl0ZUNvdW50ID09IGxlbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwU3RybURhdGEtPnN0cm1CdWZmU2l6ZSA9IGJ5dGVDb3VudCAtIGluaXRCeXRlQ291bnQgLSB6ZXJvQ291bnQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgIH0KLSAgICAvKiBzZXBhcmF0ZSBOQUwgdW5pdHMgYXMgaW5wdXQgLT4ganVzdCBzZXQgc3RyZWFtIHBhcmFtcyAqLwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGluaXRCeXRlQ291bnQgPSAwOwotICAgICAgICB6ZXJvQ291bnQgPSAwOwotICAgICAgICBwU3RybURhdGEtPnN0cm1CdWZmU2l6ZSA9IGxlbjsKLSAgICAgICAgaGFzRW11bGF0aW9uID0gSEFOVFJPX1RSVUU7Ci0gICAgfQotCi0gICAgcFN0cm1EYXRhLT5wU3RybUJ1ZmZTdGFydCAgICA9IHBCeXRlU3RyZWFtICsgaW5pdEJ5dGVDb3VudDsKLSAgICBwU3RybURhdGEtPnBTdHJtQ3VyclBvcyAgICAgID0gcFN0cm1EYXRhLT5wU3RybUJ1ZmZTdGFydDsKLSAgICBwU3RybURhdGEtPmJpdFBvc0luV29yZCAgICAgID0gMDsKLSAgICBwU3RybURhdGEtPnN0cm1CdWZmUmVhZEJpdHMgID0gMDsKLQotICAgIC8qIHJldHVybiBudW1iZXIgb2YgYnl0ZXMgImNvbnN1bWVkIiAqLwotICAgICpyZWFkQnl0ZXMgPSBwU3RybURhdGEtPnN0cm1CdWZmU2l6ZSArIGluaXRCeXRlQ291bnQgKyB6ZXJvQ291bnQ7Ci0KLSAgICBpZiAoaW52YWxpZFN0cmVhbSkKLSAgICB7Ci0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICB9Ci0KLSAgICAvKiByZW1vdmUgZW11bGF0aW9uIHByZXZlbnRpb24gYnl0ZXMgYmVmb3JlIHJic3AgcHJvY2Vzc2luZyAqLwotICAgIGlmIChoYXNFbXVsYXRpb24pCi0gICAgewotICAgICAgICB0bXAgPSBwU3RybURhdGEtPnN0cm1CdWZmU2l6ZTsKLSAgICAgICAgcmVhZFB0ciA9IHdyaXRlUHRyID0gcFN0cm1EYXRhLT5wU3RybUJ1ZmZTdGFydDsKLSAgICAgICAgemVyb0NvdW50ID0gMDsKLSAgICAgICAgZm9yIChpID0gdG1wOyBpLS07KQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKHplcm9Db3VudCA9PSAyKSAmJiAoKnJlYWRQdHIgPT0gMHgwMykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogZW11bGF0aW9uIHByZXZlbnRpb24gYnl0ZSBzaGFsbCBiZSBmb2xsb3dlZCBieSBvbmUgb2YgdGhlCi0gICAgICAgICAgICAgICAgICogZm9sbG93aW5nIGJ5dGVzOiAweDAwLCAweDAxLCAweDAyLCAweDAzLiBUaGlzIGltcGxpZXMgdGhhdAotICAgICAgICAgICAgICAgICAqIGVtdWxhdGlvbiBwcmV2ZW50aW9uIDB4MDMgYnl0ZSBzaGFsbCBub3QgYmUgdGhlIGxhc3QgYnl0ZQotICAgICAgICAgICAgICAgICAqIG9mIHRoZSBzdHJlYW0uICovCi0gICAgICAgICAgICAgICAgaWYgKCAoaSA9PSAwKSB8fCAoKihyZWFkUHRyKzEpID4gMHgwMykgKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICAgICAgICAgICAgICAvKiBkbyBub3Qgd3JpdGUgZW11bGF0aW9uIHByZXZlbnRpb24gYnl0ZSAqLwotICAgICAgICAgICAgICAgIHJlYWRQdHIrKzsKLSAgICAgICAgICAgICAgICB6ZXJvQ291bnQgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIE5BTCB1bml0IHNoYWxsIG5vdCBjb250YWluIGJ5dGUgc2VxdWVuY2VzIDB4MDAwMDAwLAotICAgICAgICAgICAgICAgICAqIDB4MDAwMDAxIG9yIDB4MDAwMDAyICovCi0gICAgICAgICAgICAgICAgaWYgKCAoemVyb0NvdW50ID09IDIpICYmICgqcmVhZFB0ciA8PSAweDAyKSApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgICAgICAgICAgICAgIGlmICgqcmVhZFB0ciA9PSAwKQotICAgICAgICAgICAgICAgICAgICB6ZXJvQ291bnQrKzsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHplcm9Db3VudCA9IDA7Ci0KLSAgICAgICAgICAgICAgICAqd3JpdGVQdHIrKyA9ICpyZWFkUHRyKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiAocmVhZFB0ciAtIHdyaXRlUHRyKSBpbmRpY2F0ZXMgbnVtYmVyIG9mICJyZW1vdmVkIiBlbXVsYXRpb24KLSAgICAgICAgICogcHJldmVudGlvbiBieXRlcyAtPiBzdWJ0cmFjdCBmcm9tIHN0cmVhbSBidWZmZXIgc2l6ZSAqLwotICAgICAgICBwU3RybURhdGEtPnN0cm1CdWZmU2l6ZSAtPSAodTMyKShyZWFkUHRyIC0gd3JpdGVQdHIpOwotICAgIH0KLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9ieXRlX3N0cmVhbS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2J5dGVfc3RyZWFtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2YWVjNzYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2J5dGVfc3RyZWFtLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotICAgIDMuIERhdGEgdHlwZXMKLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgSDI2NFNXREVDX0JZVEVfU1RSRUFNX0gKLSNkZWZpbmUgSDI2NFNXREVDX0JZVEVfU1RSRUFNX0gKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJiYXNldHlwZS5oIgotI2luY2x1ZGUgImgyNjRic2Rfc3RyZWFtLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gRGF0YSB0eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZEV4dHJhY3ROYWxVbml0KHU4ICpwQnl0ZVN0cmVhbSwgdTMyIGxlbiwgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICAgIHUzMiAqcmVhZEJ5dGVzKTsKLQotI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfQllURV9TVFJFQU1fSCAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfY2F2bGMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jYXZsYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjJkN2JhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jYXZsYy5jCisrKyAvZGV2L251bGwKQEAgLTEsOTE2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLSAgICAgMy4gTW9kdWxlIGRlZmluZXMKLSAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotICAgICA1LiBGdW5jdGlvbnMKLSAgICAgICAgICBEZWNvZGVDb2VmZlRva2VuCi0gICAgICAgICAgRGVjb2RlTGV2ZWxQcmVmaXgKLSAgICAgICAgICBEZWNvZGVUb3RhbFplcm9zCi0gICAgICAgICAgRGVjb2RlUnVuQmVmb3JlCi0gICAgICAgICAgRGVjb2RlUmVzaWR1YWxCbG9ja0NhdmxjCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiaDI2NGJzZF9jYXZsYy5oIgotI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBGb2xsb3dpbmcgZGVzY3JpcHRpb25zIHVzZSB0ZXJtICJpbmZvcm1hdGlvbiBmaWVsZCIgdG8gcmVwcmVzZW50IGNvbWJpbmF0aW9uCi0gKiBvZiBjZXJ0YWluIGRlY29kZWQgc3ltYm9sIHZhbHVlIGFuZCB0aGUgbGVuZ3RoIG9mIHRoZSBjb3JyZXNwb25kaW5nIHZhcmlhYmxlCi0gKiBsZW5ndGggY29kZSB3b3JkLiBGb3IgZXhhbXBsZSwgdG90YWxfemVyb3MgaW5mb3JtYXRpb24gZmllbGQgY29uc2lzdHMgb2YKLSAqIDQgYml0cyBzeW1ib2wgdmFsdWUgKGJpdHMgWzQsN10pIGFsb25nIHdpdGggZm91ciBiaXRzIHRvIHJlcHJlc2VudCBsZW5ndGgKLSAqIG9mIHRoZSBWTEMgY29kZSB3b3JkIChiaXRzIFswLDNdKSAqLwotCi0vKiBtYWNybyB0byBvYnRhaW4gbGVuZ3RoIG9mIHRoZSBjb2VmZiB0b2tlbiBpbmZvcm1hdGlvbiBmaWVsZCwgYml0cyBbMCw0XSAgKi8KLSNkZWZpbmUgTEVOR1RIX1RDKHZsYykgKCh2bGMpICYgMHgxRikKLS8qIG1hY3JvIHRvIG9idGFpbiBsZW5ndGggb2YgdGhlIG90aGVyIGluZm9ybWF0aW9uIGZpZWxkcywgYml0cyBbMCwzXSAqLwotI2RlZmluZSBMRU5HVEgodmxjKSAoKHZsYykgJiAweEYpCi0vKiBtYWNybyB0byBvYnRhaW4gY29kZSB3b3JkIGZyb20gdGhlIGluZm9ybWF0aW9uIGZpZWxkcywgYml0cyBbNCw3XSAqLwotI2RlZmluZSBJTkZPKHZsYykgKCgodmxjKSA+PiA0KSAmIDB4RikgIC8qIDQgTVNCIGJpdHMgY29udGFpbiBpbmZvcm1hdGlvbiAqLwotLyogbWFjcm8gdG8gb2J0YWluIHRyYWlsaW5nIG9uZXMgZnJvbSB0aGUgY29lZmYgdG9rZW4gaW5mb3JtYXRpb24gd29yZCwKLSAqIGJpdHMgWzUsMTBdICovCi0jZGVmaW5lIFRSQUlMSU5HX09ORVMoY29lZmZUb2tlbikgKCgoY29lZmZUb2tlbik+PjUpICYgMHgzRikKLS8qIG1hY3JvIHRvIG9idGFpbiB0b3RhbCBjb2VmZiBmcm9tIHRoZSBjb2VmZiB0b2tlbiBpbmZvcm1hdGlvbiB3b3JkLAotICogYml0cyBbMTEsMTVdICovCi0jZGVmaW5lIFRPVEFMX0NPRUZGKGNvZWZmVG9rZW4pICgoKGNvZWZmVG9rZW4pID4+IDExKSAmIDB4MUYpCi0KLSNkZWZpbmUgVkxDX05PVF9GT1VORCAweEZGRkZGRkZFVQotCi0vKiBWTEMgdGFibGVzIGZvciBjb2VmZl90b2tlbi4gQmVjYXVzZSBvZiBsb25nIGNvZGVzIChtYXguIDE2IGJpdHMpIHNvbWUgb2YgdGhlCi0gKiB0YWJsZXMgaGF2ZSBiZWVuIHNwbGl0dGVkIGludG8gbXVsdGlwbGUgc2VwYXJhdGUgdGFibGVzLiBFYWNoIGFycmF5L3RhYmxlCi0gKiBlbGVtZW50IGhhcyB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZToKLSAqIFs1IGJpdHMgZm9yIHRvdC5jb2VmZi5dIFs2IGJpdHMgZm9yIHRyLm9uZXNdIFs1IGJpdHMgZm9yIFZMQyBsZW5ndGhdCi0gKiBJZiB0aGVyZSBpcyBhIDB4MDAwMCB2YWx1ZSwgaXQgbWVhbnMgdGhhdCB0aGVyZSBpcyBub3QgY29ycmVzcG9uZGluZyBWTEMKLSAqIGNvZGV3b3JkIGZvciB0aGF0IGluZGV4LiAqLwotCi0vKiBWTEMgbGVuZ3RocyB1cCB0byA2IGJpdHMsIDAgPD0gbkMgPCAyICovCi1zdGF0aWMgY29uc3QgdTE2IGNvZWZmVG9rZW4wXzBbMzJdID0gewotICAgIDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MjA2NiwweDEwMjYsMHgwODA2LDB4MTg2NSwweDE4NjUsCi0gICAgMHgxMDQzLDB4MTA0MywweDEwNDMsMHgxMDQzLDB4MTA0MywweDEwNDMsMHgxMDQzLDB4MTA0MywKLSAgICAweDA4MjIsMHgwODIyLDB4MDgyMiwweDA4MjIsMHgwODIyLDB4MDgyMiwweDA4MjIsMHgwODIyLAotICAgIDB4MDgyMiwweDA4MjIsMHgwODIyLDB4MDgyMiwweDA4MjIsMHgwODIyLDB4MDgyMiwweDA4MjJ9OwotCi0vKiBWTEMgbGVuZ3RocyB1cCB0byAxMCBiaXRzLCAwIDw9IG5DIDwgMiAqLwotc3RhdGljIGNvbnN0IHUxNiBjb2VmZlRva2VuMF8xWzQ4XSA9IHsKLSAgICAweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHg0MDZhLDB4MzA0YSwweDI4MmEsMHgyMDBhLAotICAgIDB4Mzg2OSwweDM4NjksMHgyODQ5LDB4Mjg0OSwweDIwMjksMHgyMDI5LDB4MTgwOSwweDE4MDksCi0gICAgMHgzMDY4LDB4MzA2OCwweDMwNjgsMHgzMDY4LDB4MjA0OCwweDIwNDgsMHgyMDQ4LDB4MjA0OCwKLSAgICAweDE4MjgsMHgxODI4LDB4MTgyOCwweDE4MjgsMHgxMDA4LDB4MTAwOCwweDEwMDgsMHgxMDA4LAotICAgIDB4Mjg2NywweDI4NjcsMHgyODY3LDB4Mjg2NywweDI4NjcsMHgyODY3LDB4Mjg2NywweDI4NjcsCi0gICAgMHgxODQ3LDB4MTg0NywweDE4NDcsMHgxODQ3LDB4MTg0NywweDE4NDcsMHgxODQ3LDB4MTg0N307Ci0KLS8qIFZMQyBsZW5ndGhzIHVwIHRvIDE0IGJpdHMsIDAgPD0gbkMgPCAyICovCi1zdGF0aWMgY29uc3QgdTE2IGNvZWZmVG9rZW4wXzJbNTZdID0gewotICAgIDB4NjA2ZSwweDU4NGUsMHg1MDJlLDB4NTAwZSwweDU4NmUsMHg1MDRlLDB4NDgyZSwweDQ4MGUsCi0gICAgMHg0MDBkLDB4NDAwZCwweDQ4NGQsMHg0ODRkLDB4NDAyZCwweDQwMmQsMHgzODBkLDB4MzgwZCwKLSAgICAweDUwNmQsMHg1MDZkLDB4NDA0ZCwweDQwNGQsMHgzODJkLDB4MzgyZCwweDMwMGQsMHgzMDBkLAotICAgIDB4NDg2YiwweDQ4NmIsMHg0ODZiLDB4NDg2YiwweDQ4NmIsMHg0ODZiLDB4NDg2YiwweDQ4NmIsCi0gICAgMHgzODRiLDB4Mzg0YiwweDM4NGIsMHgzODRiLDB4Mzg0YiwweDM4NGIsMHgzODRiLDB4Mzg0YiwKLSAgICAweDMwMmIsMHgzMDJiLDB4MzAyYiwweDMwMmIsMHgzMDJiLDB4MzAyYiwweDMwMmIsMHgzMDJiLAotICAgIDB4MjgwYiwweDI4MGIsMHgyODBiLDB4MjgwYiwweDI4MGIsMHgyODBiLDB4MjgwYiwweDI4MGJ9OwotCi0vKiBWTEMgbGVuZ3RocyB1cCB0byAxNiBiaXRzLCAwIDw9IG5DIDwgMiAqLwotc3RhdGljIGNvbnN0IHUxNiBjb2VmZlRva2VuMF8zWzMyXSA9IHsKLSAgICAweDAwMDAsMHgwMDAwLDB4NjgyZiwweDY4MmYsMHg4MDEwLDB4ODA1MCwweDgwMzAsMHg3ODEwLAotICAgIDB4ODA3MCwweDc4NTAsMHg3ODMwLDB4NzAxMCwweDc4NzAsMHg3MDUwLDB4NzAzMCwweDY4MTAsCi0gICAgMHg3MDZmLDB4NzA2ZiwweDY4NGYsMHg2ODRmLDB4NjAyZiwweDYwMmYsMHg2MDBmLDB4NjAwZiwKLSAgICAweDY4NmYsMHg2ODZmLDB4NjA0ZiwweDYwNGYsMHg1ODJmLDB4NTgyZiwweDU4MGYsMHg1ODBmfTsKLQotLyogVkxDIGxlbmd0aHMgdXAgdG8gNiBiaXRzLCAyIDw9IG5DIDwgNCAqLwotc3RhdGljIGNvbnN0IHUxNiBjb2VmZlRva2VuMl8wWzMyXSA9IHsKLSAgICAweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgzODY2LDB4MjA0NiwweDIwMjYsMHgxMDA2LAotICAgIDB4MzA2NiwweDE4NDYsMHgxODI2LDB4MDgwNiwweDI4NjUsMHgyODY1LDB4MTAyNSwweDEwMjUsCi0gICAgMHgyMDY0LDB4MjA2NCwweDIwNjQsMHgyMDY0LDB4MTg2NCwweDE4NjQsMHgxODY0LDB4MTg2NCwKLSAgICAweDEwNDMsMHgxMDQzLDB4MTA0MywweDEwNDMsMHgxMDQzLDB4MTA0MywweDEwNDMsMHgxMDQzfTsKLQotLyogVkxDIGxlbmd0aHMgdXAgdG8gOSBiaXRzLCAyIDw9IG5DIDwgNCAqLwotc3RhdGljIGNvbnN0IHUxNiBjb2VmZlRva2VuMl8xWzMyXSA9IHsKLSAgICAweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHg0ODY5LDB4Mzg0OSwweDM4MjksMHgzMDA5LAotICAgIDB4MjgwOCwweDI4MDgsMHgzMDQ4LDB4MzA0OCwweDMwMjgsMHgzMDI4LDB4MjAwOCwweDIwMDgsCi0gICAgMHg0MDY3LDB4NDA2NywweDQwNjcsMHg0MDY3LDB4Mjg0NywweDI4NDcsMHgyODQ3LDB4Mjg0NywKLSAgICAweDI4MjcsMHgyODI3LDB4MjgyNywweDI4MjcsMHgxODA3LDB4MTgwNywweDE4MDcsMHgxODA3fTsKLQotLyogVkxDIGxlbmd0aHMgdXAgdG8gMTQgYml0cywgMiA8PSBuQyA8IDQgKi8KLXN0YXRpYyBjb25zdCB1MTYgY29lZmZUb2tlbjJfMlsxMjhdID0gewotICAgIDB4MDAwMCwweDAwMDAsMHg3ODZkLDB4Nzg2ZCwweDgwNmUsMHg4MDRlLDB4ODAyZSwweDgwMGUsCi0gICAgMHg3ODJlLDB4NzgwZSwweDc4NGUsMHg3MDJlLDB4NzA0ZCwweDcwNGQsMHg3MDBkLDB4NzAwZCwKLSAgICAweDcwNmQsMHg3MDZkLDB4Njg0ZCwweDY4NGQsMHg2ODJkLDB4NjgyZCwweDY4MGQsMHg2ODBkLAotICAgIDB4Njg2ZCwweDY4NmQsMHg2MDRkLDB4NjA0ZCwweDYwMmQsMHg2MDJkLDB4NjAwZCwweDYwMGQsCi0gICAgMHg1ODBjLDB4NTgwYywweDU4MGMsMHg1ODBjLDB4NTg0YywweDU4NGMsMHg1ODRjLDB4NTg0YywKLSAgICAweDU4MmMsMHg1ODJjLDB4NTgyYywweDU4MmMsMHg1MDBjLDB4NTAwYywweDUwMGMsMHg1MDBjLAotICAgIDB4NjA2YywweDYwNmMsMHg2MDZjLDB4NjA2YywweDUwNGMsMHg1MDRjLDB4NTA0YywweDUwNGMsCi0gICAgMHg1MDJjLDB4NTAyYywweDUwMmMsMHg1MDJjLDB4NDgwYywweDQ4MGMsMHg0ODBjLDB4NDgwYywKLSAgICAweDU4NmIsMHg1ODZiLDB4NTg2YiwweDU4NmIsMHg1ODZiLDB4NTg2YiwweDU4NmIsMHg1ODZiLAotICAgIDB4NDg0YiwweDQ4NGIsMHg0ODRiLDB4NDg0YiwweDQ4NGIsMHg0ODRiLDB4NDg0YiwweDQ4NGIsCi0gICAgMHg0ODJiLDB4NDgyYiwweDQ4MmIsMHg0ODJiLDB4NDgyYiwweDQ4MmIsMHg0ODJiLDB4NDgyYiwKLSAgICAweDQwMGIsMHg0MDBiLDB4NDAwYiwweDQwMGIsMHg0MDBiLDB4NDAwYiwweDQwMGIsMHg0MDBiLAotICAgIDB4NTA2YiwweDUwNmIsMHg1MDZiLDB4NTA2YiwweDUwNmIsMHg1MDZiLDB4NTA2YiwweDUwNmIsCi0gICAgMHg0MDRiLDB4NDA0YiwweDQwNGIsMHg0MDRiLDB4NDA0YiwweDQwNGIsMHg0MDRiLDB4NDA0YiwKLSAgICAweDQwMmIsMHg0MDJiLDB4NDAyYiwweDQwMmIsMHg0MDJiLDB4NDAyYiwweDQwMmIsMHg0MDJiLAotICAgIDB4MzgwYiwweDM4MGIsMHgzODBiLDB4MzgwYiwweDM4MGIsMHgzODBiLDB4MzgwYiwweDM4MGJ9OwotCi0vKiBWTEMgbGVuZ3RocyB1cCB0byA2IGJpdHMsIDQgPD0gbkMgPCA4ICovCi1zdGF0aWMgY29uc3QgdTE2IGNvZWZmVG9rZW40XzBbNjRdID0gewotICAgIDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsCi0gICAgMHgxODA2LDB4Mzg0NiwweDM4MjYsMHgxMDA2LDB4NDg2NiwweDMwNDYsMHgzMDI2LDB4MDgwNiwKLSAgICAweDI4MjUsMHgyODI1LDB4Mjg0NSwweDI4NDUsMHgyMDI1LDB4MjAyNSwweDIwNDUsMHgyMDQ1LAotICAgIDB4MTgyNSwweDE4MjUsMHg0MDY1LDB4NDA2NSwweDE4NDUsMHgxODQ1LDB4MTAyNSwweDEwMjUsCi0gICAgMHgzODY0LDB4Mzg2NCwweDM4NjQsMHgzODY0LDB4MzA2NCwweDMwNjQsMHgzMDY0LDB4MzA2NCwKLSAgICAweDI4NjQsMHgyODY0LDB4Mjg2NCwweDI4NjQsMHgyMDY0LDB4MjA2NCwweDIwNjQsMHgyMDY0LAotICAgIDB4MTg2NCwweDE4NjQsMHgxODY0LDB4MTg2NCwweDEwNDQsMHgxMDQ0LDB4MTA0NCwweDEwNDQsCi0gICAgMHgwODI0LDB4MDgyNCwweDA4MjQsMHgwODI0LDB4MDAwNCwweDAwMDQsMHgwMDA0LDB4MDAwNH07Ci0KLS8qIFZMQyBsZW5ndGhzIHVwIHRvIDEwIGJpdHMsIDQgPD0gbkMgPCA4ICovCi1zdGF0aWMgY29uc3QgdTE2IGNvZWZmVG9rZW40XzFbMTI4XSA9IHsKLSAgICAweDAwMDAsMHg4MDBhLDB4ODA2YSwweDgwNGEsMHg4MDJhLDB4NzgwYSwweDc4NmEsMHg3ODRhLAotICAgIDB4NzgyYSwweDcwMGEsMHg3MDZhLDB4NzA0YSwweDcwMmEsMHg2ODBhLDB4NjgyOSwweDY4MjksCi0gICAgMHg2MDA5LDB4NjAwOSwweDY4NDksMHg2ODQ5LDB4NjAyOSwweDYwMjksMHg1ODA5LDB4NTgwOSwKLSAgICAweDY4NjksMHg2ODY5LDB4NjA0OSwweDYwNDksMHg1ODI5LDB4NTgyOSwweDUwMDksMHg1MDA5LAotICAgIDB4NjA2OCwweDYwNjgsMHg2MDY4LDB4NjA2OCwweDU4NDgsMHg1ODQ4LDB4NTg0OCwweDU4NDgsCi0gICAgMHg1MDI4LDB4NTAyOCwweDUwMjgsMHg1MDI4LDB4NDgwOCwweDQ4MDgsMHg0ODA4LDB4NDgwOCwKLSAgICAweDU4NjgsMHg1ODY4LDB4NTg2OCwweDU4NjgsMHg1MDQ4LDB4NTA0OCwweDUwNDgsMHg1MDQ4LAotICAgIDB4NDgyOCwweDQ4MjgsMHg0ODI4LDB4NDgyOCwweDQwMDgsMHg0MDA4LDB4NDAwOCwweDQwMDgsCi0gICAgMHgzODA3LDB4MzgwNywweDM4MDcsMHgzODA3LDB4MzgwNywweDM4MDcsMHgzODA3LDB4MzgwNywKLSAgICAweDMwMDcsMHgzMDA3LDB4MzAwNywweDMwMDcsMHgzMDA3LDB4MzAwNywweDMwMDcsMHgzMDA3LAotICAgIDB4NDg0NywweDQ4NDcsMHg0ODQ3LDB4NDg0NywweDQ4NDcsMHg0ODQ3LDB4NDg0NywweDQ4NDcsCi0gICAgMHgyODA3LDB4MjgwNywweDI4MDcsMHgyODA3LDB4MjgwNywweDI4MDcsMHgyODA3LDB4MjgwNywKLSAgICAweDUwNjcsMHg1MDY3LDB4NTA2NywweDUwNjcsMHg1MDY3LDB4NTA2NywweDUwNjcsMHg1MDY3LAotICAgIDB4NDA0NywweDQwNDcsMHg0MDQ3LDB4NDA0NywweDQwNDcsMHg0MDQ3LDB4NDA0NywweDQwNDcsCi0gICAgMHg0MDI3LDB4NDAyNywweDQwMjcsMHg0MDI3LDB4NDAyNywweDQwMjcsMHg0MDI3LDB4NDAyNywKLSAgICAweDIwMDcsMHgyMDA3LDB4MjAwNywweDIwMDcsMHgyMDA3LDB4MjAwNywweDIwMDcsMHgyMDA3fTsKLQotLyogZml4ZWQgNiBiaXQgbGVuZ3RoIFZMQywgbkMgPD0gOCAqLwotc3RhdGljIGNvbnN0IHUxNiBjb2VmZlRva2VuOFs2NF0gPSB7Ci0gICAgMHgwODA2LDB4MDgyNiwweDAwMDAsMHgwMDA2LDB4MTAwNiwweDEwMjYsMHgxMDQ2LDB4MDAwMCwKLSAgICAweDE4MDYsMHgxODI2LDB4MTg0NiwweDE4NjYsMHgyMDA2LDB4MjAyNiwweDIwNDYsMHgyMDY2LAotICAgIDB4MjgwNiwweDI4MjYsMHgyODQ2LDB4Mjg2NiwweDMwMDYsMHgzMDI2LDB4MzA0NiwweDMwNjYsCi0gICAgMHgzODA2LDB4MzgyNiwweDM4NDYsMHgzODY2LDB4NDAwNiwweDQwMjYsMHg0MDQ2LDB4NDA2NiwKLSAgICAweDQ4MDYsMHg0ODI2LDB4NDg0NiwweDQ4NjYsMHg1MDA2LDB4NTAyNiwweDUwNDYsMHg1MDY2LAotICAgIDB4NTgwNiwweDU4MjYsMHg1ODQ2LDB4NTg2NiwweDYwMDYsMHg2MDI2LDB4NjA0NiwweDYwNjYsCi0gICAgMHg2ODA2LDB4NjgyNiwweDY4NDYsMHg2ODY2LDB4NzAwNiwweDcwMjYsMHg3MDQ2LDB4NzA2NiwKLSAgICAweDc4MDYsMHg3ODI2LDB4Nzg0NiwweDc4NjYsMHg4MDA2LDB4ODAyNiwweDgwNDYsMHg4MDY2fTsKLQotLyogVkxDIGxlbmd0aHMgdXAgdG8gMyBiaXRzLCBuQyA9PSAtMSAqLwotc3RhdGljIGNvbnN0IHUxNiBjb2VmZlRva2VuTWludXMxXzBbOF0gPSB7Ci0gICAgMHgwMDAwLDB4MTA0MywweDAwMDIsMHgwMDAyLDB4MDgyMSwweDA4MjEsMHgwODIxLDB4MDgyMX07Ci0KLS8qIFZMQyBsZW5ndGhzIHVwIHRvIDggYml0cywgbkMgPT0gLTEgKi8KLXN0YXRpYyBjb25zdCB1MTYgY29lZmZUb2tlbk1pbnVzMV8xWzMyXSA9IHsKLSAgICAweDIwNjcsMHgyMDY3LDB4MjA0OCwweDIwMjgsMHgxODQ3LDB4MTg0NywweDE4MjcsMHgxODI3LAotICAgIDB4MjAwNiwweDIwMDYsMHgyMDA2LDB4MjAwNiwweDE4MDYsMHgxODA2LDB4MTgwNiwweDE4MDYsCi0gICAgMHgxMDA2LDB4MTAwNiwweDEwMDYsMHgxMDA2LDB4MTg2NiwweDE4NjYsMHgxODY2LDB4MTg2NiwKLSAgICAweDEwMjYsMHgxMDI2LDB4MTAyNiwweDEwMjYsMHgwODA2LDB4MDgwNiwweDA4MDYsMHgwODA2fTsKLQotLyogVkxDIHRhYmxlcyBmb3IgdG90YWxfemVyb3MuIE9uZSB0YWJsZSBjb250YWluaW5nIGxvbmdlciBjb2RlLCB0b3RhbFplcm9zXzEsCi0gKiBoYXMgYmVlbiBicm9rZW4gaW50byB0d28gc2VwYXJhdGUgdGFibGVzLiBUYWJsZSBlbGVtZW50cyBoYXZlIHRoZQotICogZm9sbG93aW5nIHN0cnVjdHVyZToKLSAqIFs0IGJpdHMgZm9yIGluZm9dIFs0IGJpdHMgZm9yIFZMQyBsZW5ndGhdICovCi0KLS8qIFZMQyBsZW5ndGhzIHVwIHRvIDUgYml0cyAqLwotc3RhdGljIGNvbnN0IHU4IHRvdGFsWmVyb3NfMV8wWzMyXSA9IHsKLSAgICAweDAwLDB4MDAsMHg2NSwweDU1LDB4NDQsMHg0NCwweDM0LDB4MzQsCi0gICAgMHgyMywweDIzLDB4MjMsMHgyMywweDEzLDB4MTMsMHgxMywweDEzLAotICAgIDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwKLSAgICAweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDF9OwotCi0vKiBWTEMgbGVuZ3RocyB1cCB0byA5IGJpdHMgKi8KLXN0YXRpYyBjb25zdCB1OCB0b3RhbFplcm9zXzFfMVszMl0gPSB7Ci0gICAgMHgwMCwweGY5LDB4ZTksMHhkOSwweGM4LDB4YzgsMHhiOCwweGI4LAotICAgIDB4YTcsMHhhNywweGE3LDB4YTcsMHg5NywweDk3LDB4OTcsMHg5NywKLSAgICAweDg2LDB4ODYsMHg4NiwweDg2LDB4ODYsMHg4NiwweDg2LDB4ODYsCi0gICAgMHg3NiwweDc2LDB4NzYsMHg3NiwweDc2LDB4NzYsMHg3NiwweDc2fTsKLQotc3RhdGljIGNvbnN0IHU4IHRvdGFsWmVyb3NfMls2NF0gPSB7Ci0gICAgMHhlNiwweGQ2LDB4YzYsMHhiNiwweGE1LDB4YTUsMHg5NSwweDk1LAotICAgIDB4ODQsMHg4NCwweDg0LDB4ODQsMHg3NCwweDc0LDB4NzQsMHg3NCwKLSAgICAweDY0LDB4NjQsMHg2NCwweDY0LDB4NTQsMHg1NCwweDU0LDB4NTQsCi0gICAgMHg0MywweDQzLDB4NDMsMHg0MywweDQzLDB4NDMsMHg0MywweDQzLAotICAgIDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMywKLSAgICAweDIzLDB4MjMsMHgyMywweDIzLDB4MjMsMHgyMywweDIzLDB4MjMsCi0gICAgMHgxMywweDEzLDB4MTMsMHgxMywweDEzLDB4MTMsMHgxMywweDEzLAotICAgIDB4MDMsMHgwMywweDAzLDB4MDMsMHgwMywweDAzLDB4MDMsMHgwM307Ci0KLXN0YXRpYyBjb25zdCB1OCB0b3RhbFplcm9zXzNbNjRdID0gewotICAgIDB4ZDYsMHhiNiwweGM1LDB4YzUsMHhhNSwweGE1LDB4OTUsMHg5NSwKLSAgICAweDg0LDB4ODQsMHg4NCwweDg0LDB4NTQsMHg1NCwweDU0LDB4NTQsCi0gICAgMHg0NCwweDQ0LDB4NDQsMHg0NCwweDA0LDB4MDQsMHgwNCwweDA0LAotICAgIDB4NzMsMHg3MywweDczLDB4NzMsMHg3MywweDczLDB4NzMsMHg3MywKLSAgICAweDYzLDB4NjMsMHg2MywweDYzLDB4NjMsMHg2MywweDYzLDB4NjMsCi0gICAgMHgzMywweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMywweDMzLAotICAgIDB4MjMsMHgyMywweDIzLDB4MjMsMHgyMywweDIzLDB4MjMsMHgyMywKLSAgICAweDEzLDB4MTMsMHgxMywweDEzLDB4MTMsMHgxMywweDEzLDB4MTN9OwotCi1zdGF0aWMgY29uc3QgdTggdG90YWxaZXJvc180WzMyXSA9IHsKLSAgICAweGM1LDB4YjUsMHhhNSwweDA1LDB4OTQsMHg5NCwweDc0LDB4NzQsCi0gICAgMHgzNCwweDM0LDB4MjQsMHgyNCwweDgzLDB4ODMsMHg4MywweDgzLAotICAgIDB4NjMsMHg2MywweDYzLDB4NjMsMHg1MywweDUzLDB4NTMsMHg1MywKLSAgICAweDQzLDB4NDMsMHg0MywweDQzLDB4MTMsMHgxMywweDEzLDB4MTN9OwotCi1zdGF0aWMgY29uc3QgdTggdG90YWxaZXJvc181WzMyXSA9IHsKLSAgICAweGI1LDB4OTUsMHhhNCwweGE0LDB4ODQsMHg4NCwweDI0LDB4MjQsCi0gICAgMHgxNCwweDE0LDB4MDQsMHgwNCwweDczLDB4NzMsMHg3MywweDczLAotICAgIDB4NjMsMHg2MywweDYzLDB4NjMsMHg1MywweDUzLDB4NTMsMHg1MywKLSAgICAweDQzLDB4NDMsMHg0MywweDQzLDB4MzMsMHgzMywweDMzLDB4MzN9OwotCi1zdGF0aWMgY29uc3QgdTggdG90YWxaZXJvc182WzY0XSA9IHsKLSAgICAweGE2LDB4MDYsMHgxNSwweDE1LDB4ODQsMHg4NCwweDg0LDB4ODQsCi0gICAgMHg5MywweDkzLDB4OTMsMHg5MywweDkzLDB4OTMsMHg5MywweDkzLAotICAgIDB4NzMsMHg3MywweDczLDB4NzMsMHg3MywweDczLDB4NzMsMHg3MywKLSAgICAweDYzLDB4NjMsMHg2MywweDYzLDB4NjMsMHg2MywweDYzLDB4NjMsCi0gICAgMHg1MywweDUzLDB4NTMsMHg1MywweDUzLDB4NTMsMHg1MywweDUzLAotICAgIDB4NDMsMHg0MywweDQzLDB4NDMsMHg0MywweDQzLDB4NDMsMHg0MywKLSAgICAweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsCi0gICAgMHgyMywweDIzLDB4MjMsMHgyMywweDIzLDB4MjMsMHgyMywweDIzfTsKLQotc3RhdGljIGNvbnN0IHU4IHRvdGFsWmVyb3NfN1s2NF0gPSB7Ci0gICAgMHg5NiwweDA2LDB4MTUsMHgxNSwweDc0LDB4NzQsMHg3NCwweDc0LAotICAgIDB4ODMsMHg4MywweDgzLDB4ODMsMHg4MywweDgzLDB4ODMsMHg4MywKLSAgICAweDYzLDB4NjMsMHg2MywweDYzLDB4NjMsMHg2MywweDYzLDB4NjMsCi0gICAgMHg0MywweDQzLDB4NDMsMHg0MywweDQzLDB4NDMsMHg0MywweDQzLAotICAgIDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMywKLSAgICAweDIzLDB4MjMsMHgyMywweDIzLDB4MjMsMHgyMywweDIzLDB4MjMsCi0gICAgMHg1MiwweDUyLDB4NTIsMHg1MiwweDUyLDB4NTIsMHg1MiwweDUyLAotICAgIDB4NTIsMHg1MiwweDUyLDB4NTIsMHg1MiwweDUyLDB4NTIsMHg1Mn07Ci0KLXN0YXRpYyBjb25zdCB1OCB0b3RhbFplcm9zXzhbNjRdID0gewotICAgIDB4ODYsMHgwNiwweDI1LDB4MjUsMHgxNCwweDE0LDB4MTQsMHgxNCwKLSAgICAweDczLDB4NzMsMHg3MywweDczLDB4NzMsMHg3MywweDczLDB4NzMsCi0gICAgMHg2MywweDYzLDB4NjMsMHg2MywweDYzLDB4NjMsMHg2MywweDYzLAotICAgIDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMywKLSAgICAweDUyLDB4NTIsMHg1MiwweDUyLDB4NTIsMHg1MiwweDUyLDB4NTIsCi0gICAgMHg1MiwweDUyLDB4NTIsMHg1MiwweDUyLDB4NTIsMHg1MiwweDUyLAotICAgIDB4NDIsMHg0MiwweDQyLDB4NDIsMHg0MiwweDQyLDB4NDIsMHg0MiwKLSAgICAweDQyLDB4NDIsMHg0MiwweDQyLDB4NDIsMHg0MiwweDQyLDB4NDJ9OwotCi1zdGF0aWMgY29uc3QgdTggdG90YWxaZXJvc185WzY0XSA9IHsKLSAgICAweDE2LDB4MDYsMHg3NSwweDc1LDB4MjQsMHgyNCwweDI0LDB4MjQsCi0gICAgMHg1MywweDUzLDB4NTMsMHg1MywweDUzLDB4NTMsMHg1MywweDUzLAotICAgIDB4NjIsMHg2MiwweDYyLDB4NjIsMHg2MiwweDYyLDB4NjIsMHg2MiwKLSAgICAweDYyLDB4NjIsMHg2MiwweDYyLDB4NjIsMHg2MiwweDYyLDB4NjIsCi0gICAgMHg0MiwweDQyLDB4NDIsMHg0MiwweDQyLDB4NDIsMHg0MiwweDQyLAotICAgIDB4NDIsMHg0MiwweDQyLDB4NDIsMHg0MiwweDQyLDB4NDIsMHg0MiwKLSAgICAweDMyLDB4MzIsMHgzMiwweDMyLDB4MzIsMHgzMiwweDMyLDB4MzIsCi0gICAgMHgzMiwweDMyLDB4MzIsMHgzMiwweDMyLDB4MzIsMHgzMiwweDMyfTsKLQotc3RhdGljIGNvbnN0IHU4IHRvdGFsWmVyb3NfMTBbMzJdID0gewotICAgIDB4MTUsMHgwNSwweDY0LDB4NjQsMHgyMywweDIzLDB4MjMsMHgyMywKLSAgICAweDUyLDB4NTIsMHg1MiwweDUyLDB4NTIsMHg1MiwweDUyLDB4NTIsCi0gICAgMHg0MiwweDQyLDB4NDIsMHg0MiwweDQyLDB4NDIsMHg0MiwweDQyLAotICAgIDB4MzIsMHgzMiwweDMyLDB4MzIsMHgzMiwweDMyLDB4MzIsMHgzMn07Ci0KLXN0YXRpYyBjb25zdCB1OCB0b3RhbFplcm9zXzExWzE2XSA9IHsKLSAgICAweDA0LDB4MTQsMHgyMywweDIzLDB4MzMsMHgzMywweDUzLDB4NTMsCi0gICAgMHg0MSwweDQxLDB4NDEsMHg0MSwweDQxLDB4NDEsMHg0MSwweDQxfTsKLQotc3RhdGljIGNvbnN0IHU4IHRvdGFsWmVyb3NfMTJbMTZdID0gewotICAgIDB4MDQsMHgxNCwweDQzLDB4NDMsMHgyMiwweDIyLDB4MjIsMHgyMiwKLSAgICAweDMxLDB4MzEsMHgzMSwweDMxLDB4MzEsMHgzMSwweDMxLDB4MzF9OwotCi1zdGF0aWMgY29uc3QgdTggdG90YWxaZXJvc18xM1s4XSA9IHsweDAzLDB4MTMsMHgzMiwweDMyLDB4MjEsMHgyMSwweDIxLDB4MjF9OwotCi1zdGF0aWMgY29uc3QgdTggdG90YWxaZXJvc18xNFs0XSA9IHsweDAyLDB4MTIsMHgyMSwweDIxfTsKLQotLyogVkxDIHRhYmxlcyBmb3IgcnVuX2JlZm9yZS4gVGFibGUgZWxlbWVudHMgaGF2ZSB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZToKLSAqIFs0IGJpdHMgZm9yIGluZm9dIFs0Yml0cyBmb3IgVkxDIGxlbmd0aF0KLSAqLwotCi1zdGF0aWMgY29uc3QgdTggcnVuQmVmb3JlXzZbOF0gPSB7MHgxMywweDIzLDB4NDMsMHgzMywweDYzLDB4NTMsMHgwMiwweDAyfTsKLQotc3RhdGljIGNvbnN0IHU4IHJ1bkJlZm9yZV81WzhdID0gezB4NTMsMHg0MywweDMzLDB4MjMsMHgxMiwweDEyLDB4MDIsMHgwMn07Ci0KLXN0YXRpYyBjb25zdCB1OCBydW5CZWZvcmVfNFs4XSA9IHsweDQzLDB4MzMsMHgyMiwweDIyLDB4MTIsMHgxMiwweDAyLDB4MDJ9OwotCi1zdGF0aWMgY29uc3QgdTggcnVuQmVmb3JlXzNbNF0gPSB7MHgzMiwweDIyLDB4MTIsMHgwMn07Ci0KLXN0YXRpYyBjb25zdCB1OCBydW5CZWZvcmVfMls0XSA9IHsweDIyLDB4MTIsMHgwMSwweDAxfTsKLQotc3RhdGljIGNvbnN0IHU4IHJ1bkJlZm9yZV8xWzJdID0gezB4MTEsMHgwMX07Ci0KLS8qIGZvbGxvd2luZyBmb3VyIG1hY3JvcyBhcmUgdXNlZCB0byBoYW5kbGUgc3RyZWFtIGJ1ZmZlciAiY2FjaGUiIGluIHRoZSBDQVZMQwotICogZGVjb2RpbmcgZnVuY3Rpb24gKi8KLQotLyogbWFjcm8gdG8gaW5pdGlhbGl6ZSBzdHJlYW0gYnVmZmVyIGNhY2hlLCBmaWxscyB0aGUgYnVmZmVyICgzMiBiaXRzKSAqLwotI2RlZmluZSBCVUZGRVJfSU5JVCh2YWx1ZSwgYml0cykgXAoteyBcCi0gICAgKGJpdHMpID0gMzI7IFwKLSAgICAodmFsdWUpID0gaDI2NGJzZFNob3dCaXRzMzIocFN0cm1EYXRhKTsgXAotfQotCi0vKiBtYWNybyB0byByZWFkIG51bUJpdHMgYml0cyBmcm9tIHRoZSBidWZmZXIsIGJpdHMgd2lsbCBiZSB3cml0dGVuIHRvCi0gKiBvdXRWYWwuIFJlZmlsbHMgdGhlIGJ1ZmZlciBpZiBub3QgZW5vdWdoIGJpdHMgbGVmdCAqLwotI2RlZmluZSBCVUZGRVJfU0hPVyh2YWx1ZSwgYml0cywgb3V0VmFsLCBudW1CaXRzKSBcCi17IFwKLSAgICBpZiAoKGJpdHMpIDwgKG51bUJpdHMpKSBcCi0gICAgeyBcCi0gICAgICAgIGlmKGgyNjRic2RGbHVzaEJpdHMocFN0cm1EYXRhLDMyLShiaXRzKSkgPT0gRU5EX09GX1NUUkVBTSkgXAotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOyBcCi0gICAgICAgICh2YWx1ZSkgPSBoMjY0YnNkU2hvd0JpdHMzMihwU3RybURhdGEpOyBcCi0gICAgICAgIChiaXRzKSA9IDMyOyBcCi0gICAgfSBcCi0gICAgKG91dFZhbCkgPSAodmFsdWUpID4+ICgzMiAtIChudW1CaXRzKSk7IFwKLX0KLQotLyogbWFjcm8gdG8gZmx1c2ggbnVtQml0cyBiaXRzIGZyb20gdGhlIGJ1ZmZlciAqLwotI2RlZmluZSBCVUZGRVJfRkxVU0godmFsdWUsIGJpdHMsIG51bUJpdHMpIFwKLXsgXAotICAgICh2YWx1ZSkgPDw9IChudW1CaXRzKTsgXAotICAgIChiaXRzKSAtPSAobnVtQml0cyk7IFwKLX0KLQotLyogbWFjcm8gdG8gcmVhZCBhbmQgZmx1c2ggIG51bUJpdHMgYml0cyBmcm9tIHRoZSBidWZmZXIsIGJpdHMgd2lsbCBiZSB3cml0dGVuCi0gKiB0byBvdXRWYWwuIFJlZmlsbHMgdGhlIGJ1ZmZlciBpZiBub3QgZW5vdWdoIGJpdHMgbGVmdCAqLwotI2RlZmluZSBCVUZGRVJfR0VUKHZhbHVlLCBiaXRzLCBvdXRWYWwsIG51bUJpdHMpIFwKLXsgXAotICAgIGlmICgoYml0cykgPCAobnVtQml0cykpIFwKLSAgICB7IFwKLSAgICAgICAgaWYoaDI2NGJzZEZsdXNoQml0cyhwU3RybURhdGEsMzItKGJpdHMpKSA9PSBFTkRfT0ZfU1RSRUFNKSBcCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7IFwKLSAgICAgICAgKHZhbHVlKSA9IGgyNjRic2RTaG93Qml0czMyKHBTdHJtRGF0YSk7IFwKLSAgICAgICAgKGJpdHMpID0gMzI7IFwKLSAgICB9IFwKLSAgICAob3V0VmFsKSA9ICh2YWx1ZSkgPj4gKDMyIC0gKG51bUJpdHMpKTsgXAotICAgICh2YWx1ZSkgPDw9IChudW1CaXRzKTsgXAotICAgIChiaXRzKSAtPSAobnVtQml0cyk7IFwKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdTMyIERlY29kZUNvZWZmVG9rZW4odTMyIGJpdHMsIHUzMiBuYyk7Ci0KLXN0YXRpYyB1MzIgRGVjb2RlTGV2ZWxQcmVmaXgodTMyIGJpdHMpOwotCi1zdGF0aWMgdTMyIERlY29kZVRvdGFsWmVyb3ModTMyIGJpdHMsIHUzMiB0b3RhbENvZWZmLCB1MzIgaXNDaHJvbWFEQyk7Ci0KLXN0YXRpYyB1MzIgRGVjb2RlUnVuQmVmb3JlKHUzMiBiaXRzLHUzMiB6ZXJvc0xlZnQpOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IERlY29kZUNvZWZmVG9rZW4KLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIEZ1bmN0aW9uIHRvIGRlY29kZSBjb2VmZl90b2tlbiBpbmZvcm1hdGlvbiBmaWVsZCBmcm9tIHRoZSBzdHJlYW0uCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgIHUzMiBiaXRzICAgICAgICAgICAgICAgICAgbmV4dCAxNiBzdHJlYW0gYml0cwotICAgICAgICAgIHUzMiBuYyAgICAgICAgICAgICAgICAgICAgbkMsIHNlZSBzdGFuZGFyZCBmb3IgZGV0YWlscwotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgdTMyICBpbmZvcm1hdGlvbiBmaWVsZCAoMTEgYml0cyBmb3IgdmFsdWUsIDUgYml0cyBmb3IgbGVuZ3RoKQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgRGVjb2RlQ29lZmZUb2tlbih1MzIgYml0cywgdTMyIG5jKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB2YWx1ZTsKLQotLyogQ29kZSAqLwotCi0gICAgLyogc3RhbmRhcmQgZGVmaW5lcyB0aGF0IG5jIGZvciBkZWNvZGluZyBvZiBjaHJvbWEgZGMgY29lZmZpY2llbnRzIGlzIC0xLAotICAgICAqIHJlcHJlc2VudGVkIGJ5IHUzMiBoZXJlIC0+IC0xIG1hcHMgdG8gMl4zMiAtIDEgKi8KLSAgICBBU1NFUlQobmMgPD0gMTYgfHwgbmMgPT0gKHUzMikoLTEpKTsKLQotICAgIGlmIChuYyA8IDIpCi0gICAgewotICAgICAgICBpZiAoYml0cyA+PSAweDgwMDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhbHVlID0gMHgwMDAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgwQzAwKQotICAgICAgICAgICAgdmFsdWUgPSBjb2VmZlRva2VuMF8wW2JpdHMgPj4gMTBdOwotICAgICAgICBlbHNlIGlmIChiaXRzID49IDB4MDEwMCkKLSAgICAgICAgICAgIHZhbHVlID0gY29lZmZUb2tlbjBfMVtiaXRzID4+IDZdOwotICAgICAgICBlbHNlIGlmIChiaXRzID49IDB4MDAyMCkKLSAgICAgICAgICAgIHZhbHVlID0gY29lZmZUb2tlbjBfMlsoYml0cz4+MiktOF07Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHZhbHVlID0gY29lZmZUb2tlbjBfM1tiaXRzXTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobmMgPCA0KQotICAgIHsKLSAgICAgICAgaWYgKGJpdHMgPj0gMHg4MDAwKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YWx1ZSA9IGJpdHMgJiAweDQwMDAgPyAweDAwMDIgOiAweDA4MjI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoYml0cyA+PSAweDEwMDApCi0gICAgICAgICAgICB2YWx1ZSA9IGNvZWZmVG9rZW4yXzBbYml0cyA+PiAxMF07Ci0gICAgICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgwMjAwKQotICAgICAgICAgICAgdmFsdWUgPSBjb2VmZlRva2VuMl8xW2JpdHMgPj4gN107Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHZhbHVlID0gY29lZmZUb2tlbjJfMltiaXRzPj4yXTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobmMgPCA4KQotICAgIHsKLSAgICAgICAgdmFsdWUgPSBjb2VmZlRva2VuNF8wW2JpdHMgPj4gMTBdOwotICAgICAgICBpZiAoIXZhbHVlKQotICAgICAgICAgICAgdmFsdWUgPSBjb2VmZlRva2VuNF8xW2JpdHM+PjZdOwotICAgIH0KLSAgICBlbHNlIGlmIChuYyA8PSAxNikKLSAgICB7Ci0gICAgICAgIHZhbHVlID0gY29lZmZUb2tlbjhbYml0cz4+MTBdOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB2YWx1ZSA9IGNvZWZmVG9rZW5NaW51czFfMFtiaXRzID4+IDEzXTsKLSAgICAgICAgaWYgKCF2YWx1ZSkKLSAgICAgICAgICAgIHZhbHVlID0gY29lZmZUb2tlbk1pbnVzMV8xW2JpdHM+PjhdOwotICAgIH0KLQotICAgIHJldHVybih2YWx1ZSk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBEZWNvZGVMZXZlbFByZWZpeAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgRnVuY3Rpb24gdG8gZGVjb2RlIGxldmVsX3ByZWZpeCBpbmZvcm1hdGlvbiBmaWVsZCBmcm9tIHRoZSBzdHJlYW0KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgdTMyIGJpdHMgICAgICBuZXh0IDE2IHN0cmVhbSBiaXRzCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICB1MzIgIGxldmVsX3ByZWZpeCBpbmZvcm1hdGlvbiBmaWVsZCBvciBWTENfTk9UX0ZPVU5ECi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBEZWNvZGVMZXZlbFByZWZpeCh1MzIgYml0cykKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgbnVtWmVyb3M7Ci0KLS8qIENvZGUgKi8KLQotICAgIGlmIChiaXRzID49IDB4ODAwMCkKLSAgICAgICAgbnVtWmVyb3MgPSAwOwotICAgIGVsc2UgaWYgKGJpdHMgPj0gMHg0MDAwKQotICAgICAgICBudW1aZXJvcyA9IDE7Ci0gICAgZWxzZSBpZiAoYml0cyA+PSAweDIwMDApCi0gICAgICAgIG51bVplcm9zID0gMjsKLSAgICBlbHNlIGlmIChiaXRzID49IDB4MTAwMCkKLSAgICAgICAgbnVtWmVyb3MgPSAzOwotICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgwODAwKQotICAgICAgICBudW1aZXJvcyA9IDQ7Ci0gICAgZWxzZSBpZiAoYml0cyA+PSAweDA0MDApCi0gICAgICAgIG51bVplcm9zID0gNTsKLSAgICBlbHNlIGlmIChiaXRzID49IDB4MDIwMCkKLSAgICAgICAgbnVtWmVyb3MgPSA2OwotICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgwMTAwKQotICAgICAgICBudW1aZXJvcyA9IDc7Ci0gICAgZWxzZSBpZiAoYml0cyA+PSAweDAwODApCi0gICAgICAgIG51bVplcm9zID0gODsKLSAgICBlbHNlIGlmIChiaXRzID49IDB4MDA0MCkKLSAgICAgICAgbnVtWmVyb3MgPSA5OwotICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgwMDIwKQotICAgICAgICBudW1aZXJvcyA9IDEwOwotICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgwMDEwKQotICAgICAgICBudW1aZXJvcyA9IDExOwotICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgwMDA4KQotICAgICAgICBudW1aZXJvcyA9IDEyOwotICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgwMDA0KQotICAgICAgICBudW1aZXJvcyA9IDEzOwotICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgwMDAyKQotICAgICAgICBudW1aZXJvcyA9IDE0OwotICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgwMDAxKQotICAgICAgICBudW1aZXJvcyA9IDE1OwotICAgIGVsc2UgLyogbW9yZSB0aGFuIDE1IHplcm9zIGVuY291bnRlcmVkIHdoaWNoIGlzIGFuIGVycm9yICovCi0gICAgICAgIHJldHVybihWTENfTk9UX0ZPVU5EKTsKLQotICAgIHJldHVybihudW1aZXJvcyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBEZWNvZGVUb3RhbFplcm9zCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBGdW5jdGlvbiB0byBkZWNvZGUgdG90YWxfemVyb3MgaW5mb3JtYXRpb24gZmllbGQgZnJvbSB0aGUgc3RyZWFtCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgIHUzMiBiaXRzICAgICAgICAgICAgICAgICAgbmV4dCA5IHN0cmVhbSBiaXRzCi0gICAgICAgICAgdTMyIHRvdGFsQ29lZmYgICAgICAgICAgICB0b3RhbCBudW1iZXIgb2YgY29lZmZpY2llbnRzIGZvciB0aGUgYmxvY2sKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlaW5nIGRlY29kZWQKLSAgICAgICAgICB1MzIgaXNDaHJvbWFEQyAgICAgICAgICAgZmxhZyB0byBpbmRpY2F0ZSBjaHJvbWEgREMgYmxvY2sKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgIHUzMiAgaW5mb3JtYXRpb24gZmllbGQgKDQgYml0cyB2YWx1ZSwgNCBiaXRzIGxlbmd0aCkKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIERlY29kZVRvdGFsWmVyb3ModTMyIGJpdHMsIHUzMiB0b3RhbENvZWZmLCB1MzIgaXNDaHJvbWFEQykKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdmFsdWUgPSAweDA7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVCh0b3RhbENvZWZmKTsKLQotICAgIGlmICghaXNDaHJvbWFEQykKLSAgICB7Ci0gICAgICAgIEFTU0VSVCh0b3RhbENvZWZmIDwgMTYpOwotICAgICAgICBzd2l0Y2ggKHRvdGFsQ29lZmYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IHRvdGFsWmVyb3NfMV8wW2JpdHMgPj4gNF07Ci0gICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0b3RhbFplcm9zXzFfMVtiaXRzXTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgIHZhbHVlID0gdG90YWxaZXJvc18yW2JpdHMgPj4gM107Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IHRvdGFsWmVyb3NfM1tiaXRzID4+IDNdOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSB0b3RhbFplcm9zXzRbYml0cyA+PiA0XTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgICAgIHZhbHVlID0gdG90YWxaZXJvc181W2JpdHMgPj4gNF07Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IHRvdGFsWmVyb3NfNltiaXRzID4+IDNdOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDc6Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSB0b3RhbFplcm9zXzdbYml0cyA+PiAzXTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgICAgIHZhbHVlID0gdG90YWxaZXJvc184W2JpdHMgPj4gM107Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgOToKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IHRvdGFsWmVyb3NfOVtiaXRzID4+IDNdOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDEwOgotICAgICAgICAgICAgICAgIHZhbHVlID0gdG90YWxaZXJvc18xMFtiaXRzID4+IDRdOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDExOgotICAgICAgICAgICAgICAgIHZhbHVlID0gdG90YWxaZXJvc18xMVtiaXRzID4+IDVdOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDEyOgotICAgICAgICAgICAgICAgIHZhbHVlID0gdG90YWxaZXJvc18xMltiaXRzID4+IDVdOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDEzOgotICAgICAgICAgICAgICAgIHZhbHVlID0gdG90YWxaZXJvc18xM1tiaXRzID4+IDZdOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDE0OgotICAgICAgICAgICAgICAgIHZhbHVlID0gdG90YWxaZXJvc18xNFtiaXRzID4+IDddOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OiAvKiBjYXNlIDE1ICovCi0gICAgICAgICAgICAgICAgdmFsdWUgPSAoYml0cyA+PiA4KSA/IDB4MTEgOiAweDAxOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIEFTU0VSVCh0b3RhbENvZWZmIDwgNCk7Ci0gICAgICAgIGJpdHMgPj49IDY7Ci0gICAgICAgIGlmIChiaXRzID4gMykKLSAgICAgICAgICAgIHZhbHVlID0gMHgwMTsKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodG90YWxDb2VmZiA9PSAzKQotICAgICAgICAgICAgICAgIHZhbHVlID0gMHgxMTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGJpdHMgPiAxKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhbHVlID0gMHgxMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHRvdGFsQ29lZmYgPT0gMikKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IDB4MjI7Ci0gICAgICAgICAgICBlbHNlIGlmIChiaXRzKQotICAgICAgICAgICAgICAgIHZhbHVlID0gMHgyMzsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IDB4MzM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4odmFsdWUpOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRGVjb2RlUnVuQmVmb3JlCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBGdW5jdGlvbiB0byBkZWNvZGUgcnVuX2JlZm9yZSBpbmZvcm1hdGlvbiBmaWVsZCBmcm9tIHRoZSBzdHJlYW0KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgdTMyIGJpdHMgICAgICAgICAgICAgICAgICBuZXh0IDExIHN0cmVhbSBiaXRzCi0gICAgICAgICAgdTMyIHplcm9zTGVmdCAgICAgICAgICAgICBudW1iZXIgb2YgemVyb3MgbGVmdCBmb3IgdGhlIGN1cnJlbnQgYmxvY2sKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgIHUzMiAgaW5mb3JtYXRpb24gZmllbGQgKDQgYml0cyB2YWx1ZSwgNCBiaXRzIGxlbmd0aCkKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIERlY29kZVJ1bkJlZm9yZSh1MzIgYml0cywgdTMyIHplcm9zTGVmdCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdmFsdWUgPSAweDA7Ci0KLS8qIENvZGUgKi8KLQotICAgIHN3aXRjaCAoemVyb3NMZWZ0KQotICAgIHsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgdmFsdWUgPSBydW5CZWZvcmVfMVtiaXRzPj4xMF07Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICB2YWx1ZSA9IHJ1bkJlZm9yZV8yW2JpdHM+PjldOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgdmFsdWUgPSBydW5CZWZvcmVfM1tiaXRzPj45XTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgIHZhbHVlID0gcnVuQmVmb3JlXzRbYml0cz4+OF07Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICB2YWx1ZSA9IHJ1bkJlZm9yZV81W2JpdHM+PjhdOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSA2OgotICAgICAgICAgICAgdmFsdWUgPSBydW5CZWZvcmVfNltiaXRzPj44XTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpZiAoYml0cyA+PSAweDEwMCkKLSAgICAgICAgICAgICAgICB2YWx1ZSA9ICgoNy0oYml0cz4+OCkpPDw0KSsweDM7Ci0gICAgICAgICAgICBlbHNlIGlmIChiaXRzID49IDB4ODApCi0gICAgICAgICAgICAgICAgdmFsdWUgPSAweDc0OwotICAgICAgICAgICAgZWxzZSBpZiAoYml0cyA+PSAweDQwKQotICAgICAgICAgICAgICAgIHZhbHVlID0gMHg4NTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgyMCkKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IDB4OTY7Ci0gICAgICAgICAgICBlbHNlIGlmIChiaXRzID49IDB4MTApCi0gICAgICAgICAgICAgICAgdmFsdWUgPSAweGE3OwotICAgICAgICAgICAgZWxzZSBpZiAoYml0cyA+PSAweDgpCi0gICAgICAgICAgICAgICAgdmFsdWUgPSAweGI4OwotICAgICAgICAgICAgZWxzZSBpZiAoYml0cyA+PSAweDQpCi0gICAgICAgICAgICAgICAgdmFsdWUgPSAweGM5OwotICAgICAgICAgICAgZWxzZSBpZiAoYml0cyA+PSAweDIpCi0gICAgICAgICAgICAgICAgdmFsdWUgPSAweGRBOwotICAgICAgICAgICAgZWxzZSBpZiAoYml0cykKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IDB4ZUI7Ci0gICAgICAgICAgICBpZiAoSU5GTyh2YWx1ZSkgPiB6ZXJvc0xlZnQpCi0gICAgICAgICAgICAgICAgdmFsdWUgPSAwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuKHZhbHVlKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IERlY29kZVJlc2lkdWFsQmxvY2tDYXZsYwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgRnVuY3Rpb24gdG8gZGVjb2RlIG9uZSBDQVZMQyBjb2RlZCBibG9jay4gVGhpcyBjb3JyZXNwb25kcyB0bwotICAgICAgICAgIHN5bnRheCBlbGVtZW50cyByZXNpZHVhbF9ibG9ja19jYXZsYygpIGluIHRoZSBzdGFuZGFyZC4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgcFN0cm1EYXRhICAgICAgICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCi0gICAgICAgICAgbmMgICAgICAgICAgICAgICAgICAgIG5DIHZhbHVlCi0gICAgICAgICAgbWF4TnVtQ29lZmYgICAgICAgICAgIG1heGltdW0gbnVtYmVyIG9mIHJlc2lkdWFsIGNvZWZmaWNpZW50cwotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgY29lZmZMZXZlbCAgICAgICAgICAgIHN0b3JlcyBkZWNvZGVkIGNvZWZmaWNpZW50IGxldmVscwotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgbnVtQ29lZmZzICAgICAgICAgICAgIG9uIGJpdHMgWzQsMTFdIGlmIHN1Y2Nlc3NmdWwKLSAgICAgICAgICBjb2VmZk1hcCAgICAgICAgICAgICAgb24gYml0cyBbMTYsMzFdIGlmIHN1Y2Nlc3NmdWwsIHRoaXMgaXMgYml0IG1hcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBlYWNoIGJpdCBpbmRpY2F0ZXMgaWYgdGhlIGNvcnJlc3BvbmRpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZmZpY2llbnQgd2FzIHplcm8gKDApIG9yIG5vbi16ZXJvICgxKQotICAgICAgICAgIEhBTlRST19OT0sgICAgICAgICAgICBlbmQgb2Ygc3RyZWFtIG9yIGVycm9yIGluIHN0cmVhbQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZERlY29kZVJlc2lkdWFsQmxvY2tDYXZsYygKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBpMzIgKmNvZWZmTGV2ZWwsCi0gIGkzMiBuYywKLSAgdTMyIG1heE51bUNvZWZmKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpLCB0bXAsIHRvdGFsQ29lZmYsIHRyYWlsaW5nT25lcywgc3VmZml4TGVuZ3RoLCBsZXZlbFByZWZpeDsKLSAgICB1MzIgbGV2ZWxTdWZmaXgsIHplcm9zTGVmdCwgYml0OwotICAgIGkzMiBsZXZlbFsxNl07Ci0gICAgdTMyIHJ1blsxNl07Ci0gICAgLyogc3RyZWFtICJjYWNoZSIgKi8KLSAgICB1MzIgYnVmZmVyVmFsdWU7Ci0gICAgdTMyIGJ1ZmZlckJpdHM7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVChjb2VmZkxldmVsKTsKLSAgICBBU1NFUlQobmMgPiAtMik7Ci0gICAgQVNTRVJUKG1heE51bUNvZWZmID09IDQgfHwgbWF4TnVtQ29lZmYgPT0gMTUgfHwgbWF4TnVtQ29lZmYgPT0gMTYpOwotICAgIEFTU0VSVChWTENfTk9UX0ZPVU5EICE9IEVORF9PRl9TVFJFQU0pOwotCi0gICAgLyogYXNzdW1lIHRoYXQgY29lZmZMZXZlbCBhcnJheSBoYXMgYmVlbiAiY2xlYW5lZCIgYnkgY2FsbGVyICovCi0KLSAgICBCVUZGRVJfSU5JVChidWZmZXJWYWx1ZSwgYnVmZmVyQml0cyk7Ci0KLSAgICAvKmxpbnQgLWU3NzQgZGlzYWJsZSBsaW50IHdhcm5pbmcgb24gYWx3YXlzIGZhbHNlIGNvbXBhcmlzb24gKi8KLSAgICBCVUZGRVJfU0hPVyhidWZmZXJWYWx1ZSwgYnVmZmVyQml0cywgYml0LCAxNik7Ci0gICAgLypsaW50ICtlNzc0ICovCi0gICAgdG1wID0gRGVjb2RlQ29lZmZUb2tlbihiaXQsICh1MzIpbmMpOwotICAgIGlmICghdG1wKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgQlVGRkVSX0ZMVVNIKGJ1ZmZlclZhbHVlLCBidWZmZXJCaXRzLCBMRU5HVEhfVEModG1wKSk7Ci0KLSAgICB0b3RhbENvZWZmID0gVE9UQUxfQ09FRkYodG1wKTsKLSAgICBpZiAodG90YWxDb2VmZiA+IG1heE51bUNvZWZmKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgdHJhaWxpbmdPbmVzID0gVFJBSUxJTkdfT05FUyh0bXApOwotCi0gICAgaWYgKHRvdGFsQ29lZmYgIT0gMCkKLSAgICB7Ci0gICAgICAgIGkgPSAwOwotICAgICAgICAvKiBub256ZXJvIGNvZWZmaWNpZW50czogKy8tIDEgKi8KLSAgICAgICAgaWYgKHRyYWlsaW5nT25lcykKLSAgICAgICAgewotICAgICAgICAgICAgQlVGRkVSX0dFVChidWZmZXJWYWx1ZSwgYnVmZmVyQml0cywgYml0LCB0cmFpbGluZ09uZXMpOwotICAgICAgICAgICAgdG1wID0gMSA8PCAodHJhaWxpbmdPbmVzIC0gMSk7Ci0gICAgICAgICAgICBmb3IgKDsgdG1wOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGV2ZWxbaV0gPSBiaXQgJiB0bXAgPyAtMSA6IDE7Ci0gICAgICAgICAgICAgICAgdG1wID4+PSAxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogb3RoZXIgbGV2ZWxzICovCi0gICAgICAgIGlmICh0b3RhbENvZWZmID4gMTAgJiYgdHJhaWxpbmdPbmVzIDwgMykKLSAgICAgICAgICAgIHN1ZmZpeExlbmd0aCA9IDE7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHN1ZmZpeExlbmd0aCA9IDA7Ci0KLSAgICAgICAgZm9yICg7IGkgPCB0b3RhbENvZWZmOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIEJVRkZFUl9TSE9XKGJ1ZmZlclZhbHVlLCBidWZmZXJCaXRzLCBiaXQsIDE2KTsKLSAgICAgICAgICAgIGxldmVsUHJlZml4ID0gRGVjb2RlTGV2ZWxQcmVmaXgoYml0KTsKLSAgICAgICAgICAgIGlmIChsZXZlbFByZWZpeCA9PSBWTENfTk9UX0ZPVU5EKQotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIEJVRkZFUl9GTFVTSChidWZmZXJWYWx1ZSwgYnVmZmVyQml0cywgbGV2ZWxQcmVmaXgrMSk7Ci0KLSAgICAgICAgICAgIGlmIChsZXZlbFByZWZpeCA8IDE0KQotICAgICAgICAgICAgICAgIHRtcCA9IHN1ZmZpeExlbmd0aDsKLSAgICAgICAgICAgIGVsc2UgaWYgKGxldmVsUHJlZml4ID09IDE0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRtcCA9IHN1ZmZpeExlbmd0aCA/IHN1ZmZpeExlbmd0aCA6IDQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogc2V0dGluZyBzdWZmaXhMZW5ndGggdG8gMSBoZXJlIGNvcnJlc3BvbmRzIHRvIGFkZGluZyAxNQotICAgICAgICAgICAgICAgICAqIHRvIGxldmVsQ29kZSB2YWx1ZSBpZiBsZXZlbFByZWZpeCA9PSAxNSBhbmQKLSAgICAgICAgICAgICAgICAgKiBzdWZmaXhMZW5ndGggPT0gMCAqLwotICAgICAgICAgICAgICAgIGlmICghc3VmZml4TGVuZ3RoKQotICAgICAgICAgICAgICAgICAgICBzdWZmaXhMZW5ndGggPSAxOwotICAgICAgICAgICAgICAgIHRtcCA9IDEyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoc3VmZml4TGVuZ3RoKQotICAgICAgICAgICAgICAgIGxldmVsUHJlZml4IDw8PSBzdWZmaXhMZW5ndGg7Ci0KLSAgICAgICAgICAgIGlmICh0bXApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQlVGRkVSX0dFVChidWZmZXJWYWx1ZSwgYnVmZmVyQml0cywgbGV2ZWxTdWZmaXgsIHRtcCk7Ci0gICAgICAgICAgICAgICAgbGV2ZWxQcmVmaXggKz0gbGV2ZWxTdWZmaXg7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRtcCA9IGxldmVsUHJlZml4OwotCi0gICAgICAgICAgICBpZiAoaSA9PSB0cmFpbGluZ09uZXMgJiYgdHJhaWxpbmdPbmVzIDwgMykKLSAgICAgICAgICAgICAgICB0bXAgKz0gMjsKLQotICAgICAgICAgICAgbGV2ZWxbaV0gPSAodG1wKzIpPj4xOwotCi0gICAgICAgICAgICBpZiAoc3VmZml4TGVuZ3RoID09IDApCi0gICAgICAgICAgICAgICAgc3VmZml4TGVuZ3RoID0gMTsKLQotICAgICAgICAgICAgaWYgKChsZXZlbFtpXSA+ICgzIDw8IChzdWZmaXhMZW5ndGggLSAxKSkpICYmIHN1ZmZpeExlbmd0aCA8IDYpCi0gICAgICAgICAgICAgICAgc3VmZml4TGVuZ3RoKys7Ci0KLSAgICAgICAgICAgIGlmICh0bXAgJiAweDEpCi0gICAgICAgICAgICAgICAgbGV2ZWxbaV0gPSAtbGV2ZWxbaV07Ci0gICAgICAgIH0KLQotICAgICAgICAvKiB6ZXJvIHJ1bnMgKi8KLSAgICAgICAgaWYgKHRvdGFsQ29lZmYgPCBtYXhOdW1Db2VmZikKLSAgICAgICAgewotICAgICAgICAgICAgQlVGRkVSX1NIT1coYnVmZmVyVmFsdWUsIGJ1ZmZlckJpdHMsIGJpdCw5KTsKLSAgICAgICAgICAgIHplcm9zTGVmdCA9IERlY29kZVRvdGFsWmVyb3MoYml0LCB0b3RhbENvZWZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1MzIpKG1heE51bUNvZWZmID09IDQpKTsKLSAgICAgICAgICAgIGlmICghemVyb3NMZWZ0KQotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIEJVRkZFUl9GTFVTSChidWZmZXJWYWx1ZSwgYnVmZmVyQml0cywgTEVOR1RIKHplcm9zTGVmdCkpOwotICAgICAgICAgICAgemVyb3NMZWZ0ID0gSU5GTyh6ZXJvc0xlZnQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHplcm9zTGVmdCA9IDA7Ci0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IHRvdGFsQ29lZmYgLSAxOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh6ZXJvc0xlZnQgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEJVRkZFUl9TSE9XKGJ1ZmZlclZhbHVlLCBidWZmZXJCaXRzLCBiaXQsMTEpOwotICAgICAgICAgICAgICAgIHRtcCA9IERlY29kZVJ1bkJlZm9yZShiaXQsIHplcm9zTGVmdCk7Ci0gICAgICAgICAgICAgICAgaWYgKCF0bXApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgICAgICBCVUZGRVJfRkxVU0goYnVmZmVyVmFsdWUsIGJ1ZmZlckJpdHMsIExFTkdUSCh0bXApKTsKLSAgICAgICAgICAgICAgICBydW5baV0gPSBJTkZPKHRtcCk7Ci0gICAgICAgICAgICAgICAgemVyb3NMZWZ0IC09IHJ1bltpXSsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJ1bltpXSA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBjb21iaW5pbmcgbGV2ZWwgYW5kIHJ1biwgbGV2ZWxTdWZmaXggdmFyaWFibGUgdXNlZCB0byBob2xkIGNvZWZmTWFwLAotICAgICAgICAgKiBpLmUuIGJpdCBtYXAgaW5kaWNhdGluZyB3aGljaCBjb2VmZmljaWVudHMgaGFkIG5vbi16ZXJvIHZhbHVlLiAqLwotCi0gICAgICAgIC8qbGludCAtZXN5bSg3NzEsbGV2ZWwscnVuKSBsZXZlbCBhbmQgcnVuIGFyZSBhbHdheXMgaW5pdGlhbGl6ZWQgKi8KLSAgICAgICAgdG1wID0gemVyb3NMZWZ0OwotICAgICAgICBjb2VmZkxldmVsW3RtcF0gPSBsZXZlbFt0b3RhbENvZWZmLTFdOwotICAgICAgICBsZXZlbFN1ZmZpeCA9IDEgPDwgdG1wOwotICAgICAgICBmb3IgKGkgPSB0b3RhbENvZWZmLTE7IGktLTspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcCArPSBydW5baV07Ci0gICAgICAgICAgICBsZXZlbFN1ZmZpeCB8PSAxIDw8IHRtcDsKLSAgICAgICAgICAgIGNvZWZmTGV2ZWxbdG1wXSA9IGxldmVsW2ldOwotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgZWxzZQotICAgICAgICBsZXZlbFN1ZmZpeCA9IDA7Ci0KLSAgICBpZiAoaDI2NGJzZEZsdXNoQml0cyhwU3RybURhdGEsIDMyLWJ1ZmZlckJpdHMpICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgcmV0dXJuKCh0b3RhbENvZWZmIDw8IDQpIHwgKGxldmVsU3VmZml4IDw8IDE2KSk7Ci19Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jYXZsYy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NhdmxjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMzUzZDMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NhdmxjLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotICAgIDMuIERhdGEgdHlwZXMKLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgSDI2NFNXREVDX0NBVkxDX0gKLSNkZWZpbmUgSDI2NFNXREVDX0NBVkxDX0gKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJiYXNldHlwZS5oIgotI2luY2x1ZGUgImgyNjRic2Rfc3RyZWFtLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBEYXRhIHR5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkRGVjb2RlUmVzaWR1YWxCbG9ja0NhdmxjKAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIGkzMiAqY29lZmZMZXZlbCwKLSAgaTMyIG5jLAotICB1MzIgbWF4TnVtQ29lZmYpOwotCi0jZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19DQVZMQ19IICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jZmcuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jZmcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJhYmE1YS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfY2ZnLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotICAgIDMuIERhdGEgdHlwZXMKLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgSDI2NFNXREVDX0NGR19ICi0jZGVmaW5lIEgyNjRTV0RFQ19DRkdfSAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImJhc2V0eXBlLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNkZWZpbmUgTUFYX05VTV9SRUZfUElDUyAxNgotI2RlZmluZSBNQVhfTlVNX1NMSUNFX0dST1VQUyA4Ci0jZGVmaW5lIE1BWF9OVU1fU0VRX1BBUkFNX1NFVFMgMzIKLSNkZWZpbmUgTUFYX05VTV9QSUNfUEFSQU1fU0VUUyAyNTYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBEYXRhIHR5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfQ0ZHX0ggKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NvbmNlYWwuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jb25jZWFsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMjYyZWQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NvbmNlYWwuYworKysgL2Rldi9udWxsCkBAIC0xLDYyNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0gICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0gICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLSAgICAgNS4gRnVuY3Rpb25zCi0gICAgICAgICAgaDI2NGJzZENvbmNlYWwKLSAgICAgICAgICBDb25jZWFsTWIKLSAgICAgICAgICBUcmFuc2Zvcm0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJoMjY0YnNkX2NvbmNlYWwuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3JlY29uc3RydWN0LmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9kcGIuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLypsaW50IC1lNzAyIGRpc2FibGUgbGludCB3YXJuaW5nIG9uIHJpZ2h0IHNoaWZ0IG9mIHNpZ25lZCBxdWFudGl0eSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1MzIgQ29uY2VhbE1iKG1iU3RvcmFnZV90ICpwTWIsIGltYWdlX3QgKmN1cnJJbWFnZSwgdTMyIHJvdywgdTMyIGNvbCwKLSAgICB1MzIgc2xpY2VUeXBlLCB1OCAqZGF0YSk7Ci0KLXN0YXRpYyB2b2lkIFRyYW5zZm9ybShpMzIgKmRhdGEpOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb24gbmFtZTogaDI2NGJzZENvbmNlYWwKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgUGVyZm9ybSBlcnJvciBjb25jZWFsbWVudCBmb3IgYSBwaWN0dXJlLiBUd28gdHlwZXMgb2YgY29uY2VhbG1lbnQKLSAgICAgICAgICAgIGlzIHBlcmZvcm1lZCBiYXNlZCBvbiBzbGljZVR5cGU6Ci0gICAgICAgICAgICAgICAgMSkgY29weSBmcm9tIHByZXZpb3VzIHBpY3R1cmUgZm9yIFAtc2xpY2VzLgotICAgICAgICAgICAgICAgIDIpIGNvbmNlYWxtZW50IGZyb20gbmVpZ2hib3VyIHBpeGVscyBmb3IgSS1zbGljZXMKLQotICAgICAgICAgICAgSS10eXBlIGNvbmNlYWxtZW50IGlzIGJhc2VkIG9uIGlkZWFzIHByZXNlbnRlZCBieSBKYXJubyBUdWxra2kuCi0gICAgICAgICAgICBUaGUgY29uY2VhbG1lbnQgYWxnb3JpdGhtIGRldGVybWluZXMgZnJlcXVlbmN5IGRvbWFpbiBjb2VmZmljaWVudHMKLSAgICAgICAgICAgIGZyb20gdGhlIG5laWdoYm91ciBwaXhlbHMsIGFwcGxpZXMgaW50ZWdlciB0cmFuc2Zvcm0gKHRoZSBzYW1lCi0gICAgICAgICAgICB0cmFuc2Zvcm0gdXNlZCBpbiB0aGUgcmVzaWR1YWwgcHJvY2Vzc2luZykgYW5kIHVzZXMgdGhlIHJlc3VsdHMgYXMKLSAgICAgICAgICAgIHBpeGVsIHZhbHVlcyBmb3IgY29uY2VhbGVkIG1hY3JvYmxvY2tzLiBUcmFuc2Zvcm0gcHJvZHVjZXMgNHg0Ci0gICAgICAgICAgICBhcnJheSBhbmQgb25lIHBpeGVsIHZhbHVlIGhhcyB0byBiZSB1c2VkIGZvciA0eDQgbHVtYSBibG9ja3MgYW5kCi0gICAgICAgICAgICAyeDIgY2hyb21hIGJsb2Nrcy4KLQotICAgICAgICAgICAgU2ltaWxhciBjb25jZWFsbWVudCBpcyBwZXJmb3JtZWQgZm9yIHdob2xlIHBpY3R1cmUgKHRoZSBjaG9pc2UKLSAgICAgICAgICAgIG9mIHRoZSB0eXBlIGlzIGJhc2VkIG9uIGxhc3Qgc3VjY2Vzc2Z1bGx5IGRlY29kZWQgc2xpY2UgaGVhZGVyIG9mCi0gICAgICAgICAgICB0aGUgcGljdHVyZSBidXQgaXQgaXMgaGFuZGxlZCBieSB0aGUgY2FsbGluZyBmdW5jdGlvbikuIEl0IGlzCi0gICAgICAgICAgICBhY2tub3dsZWRnZWQgdGhhdCB0aGlzIG1heSByZXN1bHQgaW4gd3JvbmcgdHlwZSBvZiBjb25jZWFsbWVudAotICAgICAgICAgICAgd2hlbiBhIHBpY3R1cmUgY29udGFpbnMgYm90aCB0eXBlcyBvZiBzbGljZXMuIEhvd2V2ZXIsCi0gICAgICAgICAgICBkZXRlcm1pbmF0aW9uIG9mIHNsaWNlIHR5cGUgbWFjcm9ibG9jay1ieS1tYWNyb2Jsb2NrIGNhbm5vdAotICAgICAgICAgICAgYmUgZG9uZSBkdWUgdG8gdGhlIGZhY3QgdGhhdCBpdCBpcyBpbXBvc3NpYmxlIHRvIGtub3cgdG8gd2hpY2gKLSAgICAgICAgICAgIHNsaWNlIGVhY2ggY29ycnVwdGVkIChub3Qgc3VjY2Vzc2Z1bGx5IGRlY29kZWQpIG1hY3JvYmxvY2sKLSAgICAgICAgICAgIGJlbG9uZ3MuCi0KLSAgICAgICAgICAgIFRoZSBlcnJvciBjb25jZWFsbWVudCBpcyBzdGFydGVkIGJ5IHNlYXJjaGluZyB0aGUgZmlyc3QgcHJvcG9lcmx5Ci0gICAgICAgICAgICBkZWNvZGVkIG1hY3JvYmxvY2sgYW5kIGNvbmNlYWxpbmcgdGhlIHJvdyBjb250YWluaW5nIHRoZSBtYWNyb2Jsb2NrCi0gICAgICAgICAgICBpbiBxdWVzdGlvbi4gQWZ0ZXIgdGhhdCBhbGwgbWFjcm9ibG9ja3MgYWJvdmUgdGhlIHJvdyBpbiBxdWVzdGlvbgotICAgICAgICAgICAgYXJlIGNvbmNlYWxlZC4gRmluYWxseSBjb25jZWFsbWVudCBvZiByb3dzIGJlbG93IGlzIHBlcmZvcm1lZC4KLSAgICAgICAgICAgIFRoZSBvcmRlciBvZiBjb25jZWFsbWVudCBmb3IgNHg0IHBpY3R1cmUgd2hlcmUgbWFjcm9ibG9jayA5IGlzIHRoZQotICAgICAgICAgICAgZmlyc3QgcHJvcGVybHkgZGVjb2RlZCBvbmUgaXMgYXMgZm9sbG93cyAocHJvcGVybHkgZGVjb2RlZAotICAgICAgICAgICAgbWFjcm9ibG9ja3MgbWFya2VkIHdpdGggJ3gnLCBudW1iZXJzIGluZGljYXRpbmcgdGhlIG9yZGVyIG9mCi0gICAgICAgICAgICBjb25jZWFsbWVudCk6Ci0KLSAgICAgICAgICAgICAgIDQgIDYgIDggMTAKLSAgICAgICAgICAgICAgIDMgIDUgIDcgIDkKLSAgICAgICAgICAgICAgIDEgIHggIHggIDIKLSAgICAgICAgICAgICAgMTEgMTIgMTMgMTQKLQotICAgICAgICAgICAgSWYgYWxsIG1hY3JvYmxvY2tzIG9mIHRoZSBwaWN0dXJlIGFyZSBsb3N0LCB0aGUgY29uY2VhbG1lbnQgaXMKLSAgICAgICAgICAgIGNvcHkgb2YgcHJldmlvdXMgcGljdHVyZSBmb3IgUC10eXBlIGFuZCBzZXR0aW5nIHRoZSBpbWFnZSB0bwotICAgICAgICAgICAgY29uc3RhbnQgZ3JheSAocGl4ZWwgdmFsdWUgMTI4KSBmb3IgSS10eXBlLgotCi0gICAgICAgICAgICBDb25jZWFsbWVudCBzZXRzIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIGNvbmNlYWxlZAotICAgICAgICAgICAgbWFjcm9ibG9ja3MgdG8gdmFsdWUgNDAgYW5kIG1hY3JvYmxvY2sgdHlwZSB0byBpbnRyYSB0byBlbmFibGUKLSAgICAgICAgICAgIGRlYmxvY2tpbmcgZmlsdGVyIHRvIHNtb290aCB0aGUgZWRnZXMgb2YgdGhlIGNvbmNlYWxlZCBhcmVhcy4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwU3RvcmFnZSAgICAgICAgcG9pbnRlciB0byBzdG9yYWdlIHN0cnVjdHVyZQotICAgICAgICAgICAgY3VyckltYWdlICAgICAgIHBvaW50ZXIgdG8gY3VycmVudCBpbWFnZSBzdHJ1Y3R1cmUKLSAgICAgICAgICAgIHNsaWNlVHlwZSAgICAgICB0eXBlIG9mIHRoZSBzbGljZQotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBjdXJySW1hZ2UgICAgICAgY29uY2VhbGVkIG1hY3JvYmxvY2tzIHdpbGwgYmUgd3JpdHRlbiBoZXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEhBTlRST19PSwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZENvbmNlYWwoc3RvcmFnZV90ICpwU3RvcmFnZSwgaW1hZ2VfdCAqY3VyckltYWdlLCB1MzIgc2xpY2VUeXBlKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpLCBqOwotICAgIHUzMiByb3csIGNvbDsKLSAgICB1MzIgd2lkdGgsIGhlaWdodDsKLSAgICB1OCAqcmVmRGF0YTsKLSAgICBtYlN0b3JhZ2VfdCAqbWI7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RvcmFnZSk7Ci0gICAgQVNTRVJUKGN1cnJJbWFnZSk7Ci0KLSAgICBERUJVRygoIkNvbmNlYWxpbmcgJXMgc2xpY2VcbiIsIElTX0lfU0xJQ0Uoc2xpY2VUeXBlKSA/Ci0gICAgICAgICAgICAiaW50cmEiIDogImludGVyIikpOwotCi0gICAgd2lkdGggPSBjdXJySW1hZ2UtPndpZHRoOwotICAgIGhlaWdodCA9IGN1cnJJbWFnZS0+aGVpZ2h0OwotICAgIHJlZkRhdGEgPSBOVUxMOwotICAgIC8qIHVzZSByZWZlcmVuY2UgcGljdHVyZSB3aXRoIHNtYWxsZXN0IGF2YWlsYWJsZSBpbmRleCAqLwotICAgIGlmIChJU19QX1NMSUNFKHNsaWNlVHlwZSkgfHwgKHBTdG9yYWdlLT5pbnRyYUNvbmNlYWxtZW50RmxhZyAhPSAwKSkKLSAgICB7Ci0gICAgICAgIGkgPSAwOwotICAgICAgICBkbwotICAgICAgICB7Ci0gICAgICAgICAgICByZWZEYXRhID0gaDI2NGJzZEdldFJlZlBpY0RhdGEocFN0b3JhZ2UtPmRwYiwgaSk7Ci0gICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICBpZiAoaSA+PSAxNikKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfSB3aGlsZSAocmVmRGF0YSA9PSBOVUxMKTsKLSAgICB9Ci0KLSAgICBpID0gcm93ID0gY29sID0gMDsKLSAgICAvKiBmaW5kIGZpcnN0IHByb3Blcmx5IGRlY29kZWQgbWFjcm9ibG9jayAtPiBzdGFydCBwb2ludCBmb3IgY29uY2VhbG1lbnQgKi8KLSAgICB3aGlsZSAoaSA8IHBTdG9yYWdlLT5waWNTaXplSW5NYnMgJiYgIXBTdG9yYWdlLT5tYltpXS5kZWNvZGVkKQotICAgIHsKLSAgICAgICAgaSsrOwotICAgICAgICBjb2wrKzsKLSAgICAgICAgaWYgKGNvbCA9PSB3aWR0aCkKLSAgICAgICAgewotICAgICAgICAgICAgcm93Kys7Ci0gICAgICAgICAgICBjb2wgPSAwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogd2hvbGUgcGljdHVyZSBsb3N0IC0+IGNvcHkgcHJldmlvdXMgb3Igc2V0IGdyZXkgKi8KLSAgICBpZiAoaSA9PSBwU3RvcmFnZS0+cGljU2l6ZUluTWJzKQotICAgIHsKLSAgICAgICAgaWYgKCAoSVNfSV9TTElDRShzbGljZVR5cGUpICYmIChwU3RvcmFnZS0+aW50cmFDb25jZWFsbWVudEZsYWcgPT0gMCkpIHx8Ci0gICAgICAgICAgICAgcmVmRGF0YSA9PSBOVUxMKQotICAgICAgICAgICAgSDI2NFN3RGVjTWVtc2V0KGN1cnJJbWFnZS0+ZGF0YSwgMTI4LCB3aWR0aCpoZWlnaHQqMzg0KTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgSDI2NFN3RGVjTWVtY3B5KGN1cnJJbWFnZS0+ZGF0YSwgcmVmRGF0YSwgd2lkdGgqaGVpZ2h0KjM4NCk7Ci0KLSAgICAgICAgcFN0b3JhZ2UtPm51bUNvbmNlYWxlZE1icyA9IHBTdG9yYWdlLT5waWNTaXplSW5NYnM7Ci0KLSAgICAgICAgLyogbm8gZmlsdGVyaW5nIGlmIHdob2xlIHBpY3R1cmUgY29uY2VhbGVkICovCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwU3RvcmFnZS0+cGljU2l6ZUluTWJzOyBpKyspCi0gICAgICAgICAgICBwU3RvcmFnZS0+bWJbaV0uZGlzYWJsZURlYmxvY2tpbmdGaWx0ZXJJZGMgPSAxOwotCi0gICAgICAgIHJldHVybihIQU5UUk9fT0spOwotICAgIH0KLQotICAgIC8qIHN0YXJ0IGZyb20gdGhlIHJvdyBjb250YWluaW5nIHRoZSBmaXJzdCBjb3JyZWN0IG1hY3JvYmxvY2ssIGNvbmNlYWwgdGhlCi0gICAgICogcm93IGluIHF1ZXN0aW9uLCBhbGwgcm93cyBhYm92ZSB0aGF0IHJvdyBhbmQgdGhlbiBjb250aW51ZSBkb3dud2FyZHMgKi8KLSAgICBtYiA9IHBTdG9yYWdlLT5tYiArIHJvdyAqIHdpZHRoOwotICAgIGZvciAoaiA9IGNvbDsgai0tOykKLSAgICB7Ci0gICAgICAgIENvbmNlYWxNYihtYitqLCBjdXJySW1hZ2UsIHJvdywgaiwgc2xpY2VUeXBlLCByZWZEYXRhKTsKLSAgICAgICAgbWJbal0uZGVjb2RlZCA9IDE7Ci0gICAgICAgIHBTdG9yYWdlLT5udW1Db25jZWFsZWRNYnMrKzsKLSAgICB9Ci0gICAgZm9yIChqID0gY29sICsgMTsgaiA8IHdpZHRoOyBqKyspCi0gICAgewotICAgICAgICBpZiAoIW1iW2pdLmRlY29kZWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENvbmNlYWxNYihtYitqLCBjdXJySW1hZ2UsIHJvdywgaiwgc2xpY2VUeXBlLCByZWZEYXRhKTsKLSAgICAgICAgICAgIG1iW2pdLmRlY29kZWQgPSAxOwotICAgICAgICAgICAgcFN0b3JhZ2UtPm51bUNvbmNlYWxlZE1icysrOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qIGlmIHByZXZpb3VzIHJvdyhzKSBjb3VsZCBub3QgYmUgY29uY2VhbGVkIC0+IGNvbmNlYWwgdGhlbSBub3cgKi8KLSAgICBpZiAocm93KQotICAgIHsKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGkgPSByb3cgLSAxOwotICAgICAgICAgICAgbWIgPSBwU3RvcmFnZS0+bWIgKyBpKndpZHRoICsgajsKLSAgICAgICAgICAgIGRvCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29uY2VhbE1iKG1iLCBjdXJySW1hZ2UsIGksIGosIHNsaWNlVHlwZSwgcmVmRGF0YSk7Ci0gICAgICAgICAgICAgICAgbWItPmRlY29kZWQgPSAxOwotICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5udW1Db25jZWFsZWRNYnMrKzsKLSAgICAgICAgICAgICAgICBtYiAtPSB3aWR0aDsKLSAgICAgICAgICAgIH0gd2hpbGUoaS0tKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIHByb2Nlc3Mgcm93cyBiZWxvdyB0aGUgb25lIGNvbnRhaW5pbmcgdGhlIGZpcnN0IGNvcnJlY3QgbWFjcm9ibG9jayAqLwotICAgIGZvciAoaSA9IHJvdyArIDE7IGkgPCBoZWlnaHQ7IGkrKykKLSAgICB7Ci0gICAgICAgIG1iID0gcFN0b3JhZ2UtPm1iICsgaSAqIHdpZHRoOwotCi0gICAgICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIW1iW2pdLmRlY29kZWQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29uY2VhbE1iKG1iK2osIGN1cnJJbWFnZSwgaSwgaiwgc2xpY2VUeXBlLCByZWZEYXRhKTsKLSAgICAgICAgICAgICAgICBtYltqXS5kZWNvZGVkID0gMTsKLSAgICAgICAgICAgICAgICBwU3RvcmFnZS0+bnVtQ29uY2VhbGVkTWJzKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uIG5hbWU6IENvbmNlYWxNYgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBQZXJmb3JtIGVycm9yIGNvbmNlYWxtZW50IGZvciBvbmUgbWFjcm9ibG9jaywgbG9jYXRpb24gb2YgdGhlCi0gICAgICAgICAgICBtYWNyb2Jsb2NrIGluIHRoZSBwaWN0dXJlIGluZGljYXRlZCBieSByb3cgYW5kIGNvbAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgQ29uY2VhbE1iKG1iU3RvcmFnZV90ICpwTWIsIGltYWdlX3QgKmN1cnJJbWFnZSwgdTMyIHJvdywgdTMyIGNvbCwKLSAgICB1MzIgc2xpY2VUeXBlLCB1OCAqcmVmRGF0YSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaSwgaiwgY29tcDsKLSAgICB1MzIgaG9yLCB2ZXI7Ci0gICAgdTMyIG1iTnVtOwotICAgIHUzMiB3aWR0aCwgaGVpZ2h0OwotICAgIHU4ICptYlBvczsKLSAgICB1OCBkYXRhWzM4NF07Ci0gICAgdTggKnBEYXRhOwotICAgIGkzMiB0bXA7Ci0gICAgaTMyIGZpcnN0UGhhc2VbMTZdOwotICAgIGkzMiAqcFRtcDsKLSAgICAvKiBuZWlnaGJvdXJzIGFib3ZlLCBiZWxvdywgbGVmdCBhbmQgcmlnaHQgKi8KLSAgICBpMzIgYVs0XSA9IHsgMCwwLDAsMCB9LCBiWzRdLCBsWzRdID0geyAwLDAsMCwwIH0sIHJbNF07Ci0gICAgdTMyIEEsIEIsIEwsIFI7Ci0jaWZkZWYgSDI2NERFQ19PTVhETAotICAgIHU4IGZpbGxCdWZmWzMyKjIxICsgMTUgKyAzMl07Ci0gICAgdTggKnBGaWxsOwotI2VuZGlmCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocE1iKTsKLSAgICBBU1NFUlQoIXBNYi0+ZGVjb2RlZCk7Ci0gICAgQVNTRVJUKGN1cnJJbWFnZSk7Ci0gICAgQVNTRVJUKGNvbCA8IGN1cnJJbWFnZS0+d2lkdGgpOwotICAgIEFTU0VSVChyb3cgPCBjdXJySW1hZ2UtPmhlaWdodCk7Ci0KLSNpZmRlZiBIMjY0REVDX09NWERMCi0gICAgcEZpbGwgPSBBTElHTihmaWxsQnVmZiwgMTYpOwotI2VuZGlmCi0gICAgd2lkdGggPSBjdXJySW1hZ2UtPndpZHRoOwotICAgIGhlaWdodCA9IGN1cnJJbWFnZS0+aGVpZ2h0OwotICAgIG1iTnVtID0gcm93ICogd2lkdGggKyBjb2w7Ci0KLSAgICBoMjY0YnNkU2V0Q3VyckltYWdlTWJQb2ludGVycyhjdXJySW1hZ2UsIG1iTnVtKTsKLQotICAgIG1iUG9zID0gY3VyckltYWdlLT5kYXRhICsgcm93ICogMTYgKiB3aWR0aCAqIDE2ICsgY29sICogMTY7Ci0gICAgQSA9IEIgPSBMID0gUiA9IEhBTlRST19GQUxTRTsKLQotICAgIC8qIHNldCBxcFkgdG8gNDAgdG8gZW5hYmxlIHNvbWUgZmlsdGVyaW5nIGluIGRlYmxvY2tpbmcgKHN0ZXRzb24gdmFsdWUpICovCi0gICAgcE1iLT5xcFkgPSA0MDsKLSAgICBwTWItPmRpc2FibGVEZWJsb2NraW5nRmlsdGVySWRjID0gMDsKLSAgICAvKiBtYlR5cGUgc2V0IHRvIGludHJhIHRvIHBlcmZvcm0gZmlsdGVyaW5nIGRlc3BpdGUgdGhlIHZhbHVlcyBvZiBvdGhlcgotICAgICAqIGJvdW5kYXJ5IHN0cmVuZ3RoIGRldGVybWluYXRpb24gZmllbGRzICovCi0gICAgcE1iLT5tYlR5cGUgPSBJXzR4NDsKLSAgICBwTWItPmZpbHRlck9mZnNldEEgPSAwOwotICAgIHBNYi0+ZmlsdGVyT2Zmc2V0QiA9IDA7Ci0gICAgcE1iLT5jaHJvbWFRcEluZGV4T2Zmc2V0ID0gMDsKLQotICAgIGlmIChJU19JX1NMSUNFKHNsaWNlVHlwZSkpCi0gICAgICAgIEgyNjRTd0RlY01lbXNldChkYXRhLCAwLCBzaXplb2YoZGF0YSkpOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIG12X3QgbXYgPSB7MCwwfTsKLSAgICAgICAgaW1hZ2VfdCByZWZJbWFnZTsKLSAgICAgICAgcmVmSW1hZ2Uud2lkdGggPSB3aWR0aDsKLSAgICAgICAgcmVmSW1hZ2UuaGVpZ2h0ID0gaGVpZ2h0OwotICAgICAgICByZWZJbWFnZS5kYXRhID0gcmVmRGF0YTsKLSAgICAgICAgaWYgKHJlZkltYWdlLmRhdGEpCi0gICAgICAgIHsKLSNpZm5kZWYgSDI2NERFQ19PTVhETAotICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsICZtdiwgJnJlZkltYWdlLCBjb2wqMTYsIHJvdyoxNiwKLSAgICAgICAgICAgICAgICAwLCAwLCAxNiwgMTYpOwotI2Vsc2UKLSAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCAmbXYsICZyZWZJbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgKChyb3cqMTYpICsgKChjb2wqMTYpPDwxNikpLAotICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDEwLCBwRmlsbCk7Ci0jZW5kaWYKLSAgICAgICAgICAgIGgyNjRic2RXcml0ZU1hY3JvYmxvY2soY3VyckltYWdlLCBkYXRhKTsKLQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgSDI2NFN3RGVjTWVtc2V0KGRhdGEsIDAsIHNpemVvZihkYXRhKSk7Ci0gICAgfQotCi0gICAgSDI2NFN3RGVjTWVtc2V0KGZpcnN0UGhhc2UsIDAsIHNpemVvZihmaXJzdFBoYXNlKSk7Ci0KLSAgICAvKiBjb3VudGVyIGZvciBudW1iZXIgb2YgbmVpZ2hib3VycyB1c2VkICovCi0gICAgaiA9IDA7Ci0gICAgaG9yID0gdmVyID0gMDsKLSAgICBpZiAocm93ICYmIChwTWItd2lkdGgpLT5kZWNvZGVkKQotICAgIHsKLSAgICAgICAgQSA9IEhBTlRST19UUlVFOwotICAgICAgICBwRGF0YSA9IG1iUG9zIC0gd2lkdGgqMTY7Ci0gICAgICAgIGFbMF0gPSAqcERhdGErKzsgYVswXSArPSAqcERhdGErKzsgYVswXSArPSAqcERhdGErKzsgYVswXSArPSAqcERhdGErKzsKLSAgICAgICAgYVsxXSA9ICpwRGF0YSsrOyBhWzFdICs9ICpwRGF0YSsrOyBhWzFdICs9ICpwRGF0YSsrOyBhWzFdICs9ICpwRGF0YSsrOwotICAgICAgICBhWzJdID0gKnBEYXRhKys7IGFbMl0gKz0gKnBEYXRhKys7IGFbMl0gKz0gKnBEYXRhKys7IGFbMl0gKz0gKnBEYXRhKys7Ci0gICAgICAgIGFbM10gPSAqcERhdGErKzsgYVszXSArPSAqcERhdGErKzsgYVszXSArPSAqcERhdGErKzsgYVszXSArPSAqcERhdGErKzsKLSAgICAgICAgaisrOwotICAgICAgICBob3IrKzsKLSAgICAgICAgZmlyc3RQaGFzZVswXSArPSBhWzBdICsgYVsxXSArIGFbMl0gKyBhWzNdOwotICAgICAgICBmaXJzdFBoYXNlWzFdICs9IGFbMF0gKyBhWzFdIC0gYVsyXSAtIGFbM107Ci0gICAgfQotICAgIGlmICgocm93ICE9IGhlaWdodCAtIDEpICYmIChwTWIrd2lkdGgpLT5kZWNvZGVkKQotICAgIHsKLSAgICAgICAgQiA9IEhBTlRST19UUlVFOwotICAgICAgICBwRGF0YSA9IG1iUG9zICsgMTYqd2lkdGgqMTY7Ci0gICAgICAgIGJbMF0gPSAqcERhdGErKzsgYlswXSArPSAqcERhdGErKzsgYlswXSArPSAqcERhdGErKzsgYlswXSArPSAqcERhdGErKzsKLSAgICAgICAgYlsxXSA9ICpwRGF0YSsrOyBiWzFdICs9ICpwRGF0YSsrOyBiWzFdICs9ICpwRGF0YSsrOyBiWzFdICs9ICpwRGF0YSsrOwotICAgICAgICBiWzJdID0gKnBEYXRhKys7IGJbMl0gKz0gKnBEYXRhKys7IGJbMl0gKz0gKnBEYXRhKys7IGJbMl0gKz0gKnBEYXRhKys7Ci0gICAgICAgIGJbM10gPSAqcERhdGErKzsgYlszXSArPSAqcERhdGErKzsgYlszXSArPSAqcERhdGErKzsgYlszXSArPSAqcERhdGErKzsKLSAgICAgICAgaisrOwotICAgICAgICBob3IrKzsKLSAgICAgICAgZmlyc3RQaGFzZVswXSArPSBiWzBdICsgYlsxXSArIGJbMl0gKyBiWzNdOwotICAgICAgICBmaXJzdFBoYXNlWzFdICs9IGJbMF0gKyBiWzFdIC0gYlsyXSAtIGJbM107Ci0gICAgfQotICAgIGlmIChjb2wgJiYgKHBNYi0xKS0+ZGVjb2RlZCkKLSAgICB7Ci0gICAgICAgIEwgPSBIQU5UUk9fVFJVRTsKLSAgICAgICAgcERhdGEgPSBtYlBvcyAtIDE7Ci0gICAgICAgIGxbMF0gPSBwRGF0YVswXTsgbFswXSArPSBwRGF0YVsxNip3aWR0aF07Ci0gICAgICAgIGxbMF0gKz0gcERhdGFbMzIqd2lkdGhdOyBsWzBdICs9IHBEYXRhWzQ4KndpZHRoXTsKLSAgICAgICAgcERhdGEgKz0gNjQqd2lkdGg7Ci0gICAgICAgIGxbMV0gPSBwRGF0YVswXTsgbFsxXSArPSBwRGF0YVsxNip3aWR0aF07Ci0gICAgICAgIGxbMV0gKz0gcERhdGFbMzIqd2lkdGhdOyBsWzFdICs9IHBEYXRhWzQ4KndpZHRoXTsKLSAgICAgICAgcERhdGEgKz0gNjQqd2lkdGg7Ci0gICAgICAgIGxbMl0gPSBwRGF0YVswXTsgbFsyXSArPSBwRGF0YVsxNip3aWR0aF07Ci0gICAgICAgIGxbMl0gKz0gcERhdGFbMzIqd2lkdGhdOyBsWzJdICs9IHBEYXRhWzQ4KndpZHRoXTsKLSAgICAgICAgcERhdGEgKz0gNjQqd2lkdGg7Ci0gICAgICAgIGxbM10gPSBwRGF0YVswXTsgbFszXSArPSBwRGF0YVsxNip3aWR0aF07Ci0gICAgICAgIGxbM10gKz0gcERhdGFbMzIqd2lkdGhdOyBsWzNdICs9IHBEYXRhWzQ4KndpZHRoXTsKLSAgICAgICAgaisrOwotICAgICAgICB2ZXIrKzsKLSAgICAgICAgZmlyc3RQaGFzZVswXSArPSBsWzBdICsgbFsxXSArIGxbMl0gKyBsWzNdOwotICAgICAgICBmaXJzdFBoYXNlWzRdICs9IGxbMF0gKyBsWzFdIC0gbFsyXSAtIGxbM107Ci0gICAgfQotICAgIGlmICgoY29sICE9IHdpZHRoIC0gMSkgJiYgKHBNYisxKS0+ZGVjb2RlZCkKLSAgICB7Ci0gICAgICAgIFIgPSBIQU5UUk9fVFJVRTsKLSAgICAgICAgcERhdGEgPSBtYlBvcyArIDE2OwotICAgICAgICByWzBdID0gcERhdGFbMF07IHJbMF0gKz0gcERhdGFbMTYqd2lkdGhdOwotICAgICAgICByWzBdICs9IHBEYXRhWzMyKndpZHRoXTsgclswXSArPSBwRGF0YVs0OCp3aWR0aF07Ci0gICAgICAgIHBEYXRhICs9IDY0KndpZHRoOwotICAgICAgICByWzFdID0gcERhdGFbMF07IHJbMV0gKz0gcERhdGFbMTYqd2lkdGhdOwotICAgICAgICByWzFdICs9IHBEYXRhWzMyKndpZHRoXTsgclsxXSArPSBwRGF0YVs0OCp3aWR0aF07Ci0gICAgICAgIHBEYXRhICs9IDY0KndpZHRoOwotICAgICAgICByWzJdID0gcERhdGFbMF07IHJbMl0gKz0gcERhdGFbMTYqd2lkdGhdOwotICAgICAgICByWzJdICs9IHBEYXRhWzMyKndpZHRoXTsgclsyXSArPSBwRGF0YVs0OCp3aWR0aF07Ci0gICAgICAgIHBEYXRhICs9IDY0KndpZHRoOwotICAgICAgICByWzNdID0gcERhdGFbMF07IHJbM10gKz0gcERhdGFbMTYqd2lkdGhdOwotICAgICAgICByWzNdICs9IHBEYXRhWzMyKndpZHRoXTsgclszXSArPSBwRGF0YVs0OCp3aWR0aF07Ci0gICAgICAgIGorKzsKLSAgICAgICAgdmVyKys7Ci0gICAgICAgIGZpcnN0UGhhc2VbMF0gKz0gclswXSArIHJbMV0gKyByWzJdICsgclszXTsKLSAgICAgICAgZmlyc3RQaGFzZVs0XSArPSByWzBdICsgclsxXSAtIHJbMl0gLSByWzNdOwotICAgIH0KLQotICAgIC8qIGF0IGxlYXN0IG9uZSBwcm9wZXJseSBkZWNvZGVkIG5laWdoYm91ciBhdmFpbGFibGUgKi8KLSAgICBBU1NFUlQoaik7Ci0KLSAgICAvKmxpbnQgLWVzeW0oNjQ0LGwscixhLGIpIHZhcmlhYmxlIGluaXRpYWxpemVkIGFib3ZlICovCi0gICAgaWYgKCFob3IgJiYgTCAmJiBSKQotICAgICAgICBmaXJzdFBoYXNlWzFdID0gKGxbMF0rbFsxXStsWzJdK2xbM10tclswXS1yWzFdLXJbMl0tclszXSkgPj4gNTsKLSAgICBlbHNlIGlmIChob3IpCi0gICAgICAgIGZpcnN0UGhhc2VbMV0gPj49ICgzK2hvcik7Ci0KLSAgICBpZiAoIXZlciAmJiBBICYmIEIpCi0gICAgICAgIGZpcnN0UGhhc2VbNF0gPSAoYVswXSthWzFdK2FbMl0rYVszXS1iWzBdLWJbMV0tYlsyXS1iWzNdKSA+PiA1OwotICAgIGVsc2UgaWYgKHZlcikKLSAgICAgICAgZmlyc3RQaGFzZVs0XSA+Pj0gKDMrdmVyKTsKLQotICAgIHN3aXRjaCAoaikKLSAgICB7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIGZpcnN0UGhhc2VbMF0gPj49IDQ7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICBmaXJzdFBoYXNlWzBdID4+PSA1OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgLyogYXBwcm94aW1hdGUgKGZpcnN0UGhhc2VbMF0qNC8zKT4+NiAqLwotICAgICAgICAgICAgZmlyc3RQaGFzZVswXSA9ICgyMSAqIGZpcnN0UGhhc2VbMF0pID4+IDEwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDogLyogNCAqLwotICAgICAgICAgICAgZmlyc3RQaGFzZVswXSA+Pj0gNjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgfQotCi0KLSAgICBUcmFuc2Zvcm0oZmlyc3RQaGFzZSk7Ci0KLSAgICBmb3IgKGkgPSAwLCBwRGF0YSA9IGRhdGEsIHBUbXAgPSBmaXJzdFBoYXNlOyBpIDwgMjU2OykKLSAgICB7Ci0gICAgICAgIHRtcCA9IHBUbXBbKGkgJiAweEYpPj4yXTsKLSAgICAgICAgLypsaW50IC1lNzM0IENMSVAxIG1hY3JvIHJlc3VsdHMgaW4gdmFsdWUgdGhhdCBmaXRzIGludG8gOCBiaXRzICovCi0gICAgICAgICpwRGF0YSsrID0gQ0xJUDEodG1wKTsKLSAgICAgICAgLypsaW50ICtlNzM0ICovCi0KLSAgICAgICAgaSsrOwotICAgICAgICBpZiAoIShpICYgMHgzRikpCi0gICAgICAgICAgICBwVG1wICs9IDQ7Ci0gICAgfQotCi0gICAgLyogY2hyb21hIGNvbXBvbmVudHMgKi8KLSAgICBtYlBvcyA9IGN1cnJJbWFnZS0+ZGF0YSArIHdpZHRoICogaGVpZ2h0ICogMjU2ICsKLSAgICAgICByb3cgKiA4ICogd2lkdGggKiA4ICsgY29sICogODsKLSAgICBmb3IgKGNvbXAgPSAwOyBjb21wIDwgMjsgY29tcCsrKQotICAgIHsKLQotICAgICAgICBIMjY0U3dEZWNNZW1zZXQoZmlyc3RQaGFzZSwgMCwgc2l6ZW9mKGZpcnN0UGhhc2UpKTsKLQotICAgICAgICAvKiBjb3VudGVyIGZvciBudW1iZXIgb2YgbmVpZ2hib3VycyB1c2VkICovCi0gICAgICAgIGogPSAwOwotICAgICAgICBob3IgPSB2ZXIgPSAwOwotICAgICAgICBpZiAoQSkKLSAgICAgICAgewotICAgICAgICAgICAgcERhdGEgPSBtYlBvcyAtIHdpZHRoKjg7Ci0gICAgICAgICAgICBhWzBdID0gKnBEYXRhKys7IGFbMF0gKz0gKnBEYXRhKys7Ci0gICAgICAgICAgICBhWzFdID0gKnBEYXRhKys7IGFbMV0gKz0gKnBEYXRhKys7Ci0gICAgICAgICAgICBhWzJdID0gKnBEYXRhKys7IGFbMl0gKz0gKnBEYXRhKys7Ci0gICAgICAgICAgICBhWzNdID0gKnBEYXRhKys7IGFbM10gKz0gKnBEYXRhKys7Ci0gICAgICAgICAgICBqKys7Ci0gICAgICAgICAgICBob3IrKzsKLSAgICAgICAgICAgIGZpcnN0UGhhc2VbMF0gKz0gYVswXSArIGFbMV0gKyBhWzJdICsgYVszXTsKLSAgICAgICAgICAgIGZpcnN0UGhhc2VbMV0gKz0gYVswXSArIGFbMV0gLSBhWzJdIC0gYVszXTsKLSAgICAgICAgfQotICAgICAgICBpZiAoQikKLSAgICAgICAgewotICAgICAgICAgICAgcERhdGEgPSBtYlBvcyArIDgqd2lkdGgqODsKLSAgICAgICAgICAgIGJbMF0gPSAqcERhdGErKzsgYlswXSArPSAqcERhdGErKzsKLSAgICAgICAgICAgIGJbMV0gPSAqcERhdGErKzsgYlsxXSArPSAqcERhdGErKzsKLSAgICAgICAgICAgIGJbMl0gPSAqcERhdGErKzsgYlsyXSArPSAqcERhdGErKzsKLSAgICAgICAgICAgIGJbM10gPSAqcERhdGErKzsgYlszXSArPSAqcERhdGErKzsKLSAgICAgICAgICAgIGorKzsKLSAgICAgICAgICAgIGhvcisrOwotICAgICAgICAgICAgZmlyc3RQaGFzZVswXSArPSBiWzBdICsgYlsxXSArIGJbMl0gKyBiWzNdOwotICAgICAgICAgICAgZmlyc3RQaGFzZVsxXSArPSBiWzBdICsgYlsxXSAtIGJbMl0gLSBiWzNdOwotICAgICAgICB9Ci0gICAgICAgIGlmIChMKQotICAgICAgICB7Ci0gICAgICAgICAgICBwRGF0YSA9IG1iUG9zIC0gMTsKLSAgICAgICAgICAgIGxbMF0gPSBwRGF0YVswXTsgbFswXSArPSBwRGF0YVs4KndpZHRoXTsKLSAgICAgICAgICAgIHBEYXRhICs9IDE2KndpZHRoOwotICAgICAgICAgICAgbFsxXSA9IHBEYXRhWzBdOyBsWzFdICs9IHBEYXRhWzgqd2lkdGhdOwotICAgICAgICAgICAgcERhdGEgKz0gMTYqd2lkdGg7Ci0gICAgICAgICAgICBsWzJdID0gcERhdGFbMF07IGxbMl0gKz0gcERhdGFbOCp3aWR0aF07Ci0gICAgICAgICAgICBwRGF0YSArPSAxNip3aWR0aDsKLSAgICAgICAgICAgIGxbM10gPSBwRGF0YVswXTsgbFszXSArPSBwRGF0YVs4KndpZHRoXTsKLSAgICAgICAgICAgIGorKzsKLSAgICAgICAgICAgIHZlcisrOwotICAgICAgICAgICAgZmlyc3RQaGFzZVswXSArPSBsWzBdICsgbFsxXSArIGxbMl0gKyBsWzNdOwotICAgICAgICAgICAgZmlyc3RQaGFzZVs0XSArPSBsWzBdICsgbFsxXSAtIGxbMl0gLSBsWzNdOwotICAgICAgICB9Ci0gICAgICAgIGlmIChSKQotICAgICAgICB7Ci0gICAgICAgICAgICBwRGF0YSA9IG1iUG9zICsgODsKLSAgICAgICAgICAgIHJbMF0gPSBwRGF0YVswXTsgclswXSArPSBwRGF0YVs4KndpZHRoXTsKLSAgICAgICAgICAgIHBEYXRhICs9IDE2KndpZHRoOwotICAgICAgICAgICAgclsxXSA9IHBEYXRhWzBdOyByWzFdICs9IHBEYXRhWzgqd2lkdGhdOwotICAgICAgICAgICAgcERhdGEgKz0gMTYqd2lkdGg7Ci0gICAgICAgICAgICByWzJdID0gcERhdGFbMF07IHJbMl0gKz0gcERhdGFbOCp3aWR0aF07Ci0gICAgICAgICAgICBwRGF0YSArPSAxNip3aWR0aDsKLSAgICAgICAgICAgIHJbM10gPSBwRGF0YVswXTsgclszXSArPSBwRGF0YVs4KndpZHRoXTsKLSAgICAgICAgICAgIGorKzsKLSAgICAgICAgICAgIHZlcisrOwotICAgICAgICAgICAgZmlyc3RQaGFzZVswXSArPSByWzBdICsgclsxXSArIHJbMl0gKyByWzNdOwotICAgICAgICAgICAgZmlyc3RQaGFzZVs0XSArPSByWzBdICsgclsxXSAtIHJbMl0gLSByWzNdOwotICAgICAgICB9Ci0gICAgICAgIGlmICghaG9yICYmIEwgJiYgUikKLSAgICAgICAgICAgIGZpcnN0UGhhc2VbMV0gPSAobFswXStsWzFdK2xbMl0rbFszXS1yWzBdLXJbMV0tclsyXS1yWzNdKSA+PiA0OwotICAgICAgICBlbHNlIGlmIChob3IpCi0gICAgICAgICAgICBmaXJzdFBoYXNlWzFdID4+PSAoMitob3IpOwotCi0gICAgICAgIGlmICghdmVyICYmIEEgJiYgQikKLSAgICAgICAgICAgIGZpcnN0UGhhc2VbNF0gPSAoYVswXSthWzFdK2FbMl0rYVszXS1iWzBdLWJbMV0tYlsyXS1iWzNdKSA+PiA0OwotICAgICAgICBlbHNlIGlmICh2ZXIpCi0gICAgICAgICAgICBmaXJzdFBoYXNlWzRdID4+PSAoMit2ZXIpOwotCi0gICAgICAgIHN3aXRjaCAoaikKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgIGZpcnN0UGhhc2VbMF0gPj49IDM7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICBmaXJzdFBoYXNlWzBdID4+PSA0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgICAgLyogYXBwcm94aW1hdGUgKGZpcnN0UGhhc2VbMF0qNC8zKT4+NSAqLwotICAgICAgICAgICAgICAgIGZpcnN0UGhhc2VbMF0gPSAoMjEgKiBmaXJzdFBoYXNlWzBdKSA+PiA5OwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OiAvKiA0ICovCi0gICAgICAgICAgICAgICAgZmlyc3RQaGFzZVswXSA+Pj0gNTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICB9Ci0KLSAgICAgICAgVHJhbnNmb3JtKGZpcnN0UGhhc2UpOwotCi0gICAgICAgIHBEYXRhID0gZGF0YSArIDI1NiArIGNvbXAqNjQ7Ci0gICAgICAgIGZvciAoaSA9IDAsIHBUbXAgPSBmaXJzdFBoYXNlOyBpIDwgNjQ7KQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAgPSBwVG1wWyhpICYgMHg3KT4+MV07Ci0gICAgICAgICAgICAvKmxpbnQgLWU3MzQgQ0xJUDEgbWFjcm8gcmVzdWx0cyBpbiB2YWx1ZSB0aGF0IGZpdHMgaW50byA4IGJpdHMgKi8KLSAgICAgICAgICAgICpwRGF0YSsrID0gQ0xJUDEodG1wKTsKLSAgICAgICAgICAgIC8qbGludCArZTczNCAqLwotCi0gICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICBpZiAoIShpICYgMHhGKSkKLSAgICAgICAgICAgICAgICBwVG1wICs9IDQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBpbmNyZW1lbnQgcG9pbnRlcnMgZm9yIGNyICovCi0gICAgICAgIG1iUG9zICs9IHdpZHRoICogaGVpZ2h0ICogNjQ7Ci0gICAgfQotCi0gICAgaDI2NGJzZFdyaXRlTWFjcm9ibG9jayhjdXJySW1hZ2UsIGRhdGEpOwotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb24gbmFtZTogVHJhbnNmb3JtCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIFNpbXBsaWZpZWQgdHJhbnNmb3JtLCBhc3N1bWluZyB0aGF0IG9ubHkgZGMgY29tcG9uZW50IGFuZCBsb3dlc3QKLSAgICAgICAgICAgIGhvcml6b250YWwgYW5kIGxvd2VzdCB2ZXJ0aWNhbCBjb21wb25lbnQgbWF5IGJlIG5vbi16ZXJvCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgVHJhbnNmb3JtKGkzMiAqZGF0YSkKLXsKLQotICAgIHUzMiBjb2w7Ci0gICAgaTMyIHRtcDAsIHRtcDE7Ci0KLSAgICBpZiAoIWRhdGFbMV0gJiYgIWRhdGFbNF0pCi0gICAgewotICAgICAgICBkYXRhWzFdICA9IGRhdGFbMl0gID0gZGF0YVszXSAgPSBkYXRhWzRdICA9IGRhdGFbNV0gID0KLSAgICAgICAgZGF0YVs2XSAgPSBkYXRhWzddICA9IGRhdGFbOF0gID0gZGF0YVs5XSAgPSBkYXRhWzEwXSA9Ci0gICAgICAgIGRhdGFbMTFdID0gZGF0YVsxMl0gPSBkYXRhWzEzXSA9IGRhdGFbMTRdID0gZGF0YVsxNV0gPSBkYXRhWzBdOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIC8qIGZpcnN0IGhvcml6b250YWwgdHJhbnNmb3JtIGZvciByb3dzIDAgYW5kIDEgKi8KLSAgICB0bXAwID0gZGF0YVswXTsKLSAgICB0bXAxID0gZGF0YVsxXTsKLSAgICBkYXRhWzBdID0gdG1wMCArIHRtcDE7Ci0gICAgZGF0YVsxXSA9IHRtcDAgKyAodG1wMT4+MSk7Ci0gICAgZGF0YVsyXSA9IHRtcDAgLSAodG1wMT4+MSk7Ci0gICAgZGF0YVszXSA9IHRtcDAgLSB0bXAxOwotCi0gICAgdG1wMCA9IGRhdGFbNF07Ci0gICAgZGF0YVs1XSA9IHRtcDA7Ci0gICAgZGF0YVs2XSA9IHRtcDA7Ci0gICAgZGF0YVs3XSA9IHRtcDA7Ci0KLSAgICAvKiB0aGVuIHZlcnRpY2FsIHRyYW5zZm9ybSAqLwotICAgIGZvciAoY29sID0gNDsgY29sLS07IGRhdGErKykKLSAgICB7Ci0gICAgICAgIHRtcDAgPSBkYXRhWzBdOwotICAgICAgICB0bXAxID0gZGF0YVs0XTsKLSAgICAgICAgZGF0YVswXSA9IHRtcDAgKyB0bXAxOwotICAgICAgICBkYXRhWzRdID0gdG1wMCArICh0bXAxPj4xKTsKLSAgICAgICAgZGF0YVs4XSA9IHRtcDAgLSAodG1wMT4+MSk7Ci0gICAgICAgIGRhdGFbMTJdID0gdG1wMCAtIHRtcDE7Ci0gICAgfQotCi19Ci0vKmxpbnQgK2U3MDIgKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NvbmNlYWwuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jb25jZWFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMzQ2NzAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NvbmNlYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0gICAgMy4gRGF0YSB0eXBlcwotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBIMjY0U1dERUNfQ09OQ0VBTF9ICi0jZGVmaW5lIEgyNjRTV0RFQ19DT05DRUFMX0gKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJiYXNldHlwZS5oIgotI2luY2x1ZGUgImgyNjRic2Rfc2xpY2VfaGVhZGVyLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9zdG9yYWdlLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gRGF0YSB0eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZENvbmNlYWwoc3RvcmFnZV90ICpwU3RvcmFnZSwgaW1hZ2VfdCAqY3VyckltYWdlLCB1MzIgc2xpY2VUeXBlKTsKLQotI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfQ09OQ0VBTF9IICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jb250YWluZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jb250YWluZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTliNzRhMC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfY29udGFpbmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotICAgIDMuIERhdGEgdHlwZXMKLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgSDI2NFNXREVDX0NPTlRBSU5FUl9ICi0jZGVmaW5lIEgyNjRTV0RFQ19DT05UQUlORVJfSAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImJhc2V0eXBlLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9zdG9yYWdlLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIFN0cmluZyBsZW5ndGggZm9yIHRyYWNpbmcgKi8KLSNkZWZpbmUgSDI2NERFQ19UUkFDRV9TVFJfTEVOIDEwMAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIERhdGEgdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgZW51bSB7Ci0gICAgICAgIFVOSU5JVElBTElaRUQsCi0gICAgICAgIElOSVRJQUxJWkVELAotICAgICAgICBORVdfSEVBREVSUwotICAgIH0gZGVjU3RhdDsKLQotICAgIHUzMiBwaWNOdW1iZXI7Ci0gICAgc3RvcmFnZV90IHN0b3JhZ2U7Ci0jaWZkZWYgSDI2NERFQ19UUkFDRQotICAgIGNoYXIgc3RyW0gyNjRERUNfVFJBQ0VfU1RSX0xFTl07Ci0jZW5kaWYKLX0gZGVjQ29udGFpbmVyX3Q7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfREVDQ09OVEFJTkVSX0ggKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2RlYmxvY2tpbmcuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9kZWJsb2NraW5nLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4YzFmNzYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2RlYmxvY2tpbmcuYworKysgL2Rldi9udWxsCkBAIC0xLDI0MTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotICAgICAzLiBNb2R1bGUgZGVmaW5lcwotICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0gICAgIDUuIEZ1bmN0aW9ucwotICAgICAgICAgIGgyNjRic2RGaWx0ZXJQaWN0dXJlCi0gICAgICAgICAgRmlsdGVyVmVyTHVtYUVkZ2UKLSAgICAgICAgICBGaWx0ZXJIb3JMdW1hRWRnZQotICAgICAgICAgIEZpbHRlckhvckx1bWEKLSAgICAgICAgICBGaWx0ZXJWZXJDaHJvbWFFZGdlCi0gICAgICAgICAgRmlsdGVySG9yQ2hyb21hRWRnZQotICAgICAgICAgIEZpbHRlckhvckNocm9tYQotICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aAotICAgICAgICAgIEVkZ2VCb3VuZGFyeVN0cmVuZ3RoCi0gICAgICAgICAgR2V0Qm91bmRhcnlTdHJlbmd0aHMKLSAgICAgICAgICBJc1NsaWNlQm91bmRhcnlPbkxlZnQKLSAgICAgICAgICBJc1NsaWNlQm91bmRhcnlPblRvcAotICAgICAgICAgIEdldE1iRmlsdGVyaW5nRmxhZ3MKLSAgICAgICAgICBHZXRMdW1hRWRnZVRocmVzaG9sZHMKLSAgICAgICAgICBHZXRDaHJvbWFFZGdlVGhyZXNob2xkcwotICAgICAgICAgIEZpbHRlckx1bWEKLSAgICAgICAgICBGaWx0ZXJDaHJvbWEKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJiYXNldHlwZS5oIgotI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgotI2luY2x1ZGUgImgyNjRic2RfbWFjcm9ibG9ja19sYXllci5oIgotI2luY2x1ZGUgImgyNjRic2RfZGVibG9ja2luZy5oIgotI2luY2x1ZGUgImgyNjRic2RfZHBiLmgiCi0KLSNpZmRlZiBIMjY0REVDX09NWERMCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0jZW5kaWYgLyogSDI2NERFQ19PTVhETCAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBTd2l0Y2ggb2ZmIHRoZSBmb2xsb3dpbmcgTGludCBtZXNzYWdlcyBmb3IgdGhpcyBmaWxlOgotICogSW5mbyA3MDE6IFNoaWZ0IGxlZnQgb2Ygc2lnbmVkIHF1YW50aXR5IChpbnQpCi0gKiBJbmZvIDcwMjogU2hpZnQgcmlnaHQgb2Ygc2lnbmVkIHF1YW50aXR5IChpbnQpCi0gKi8KLS8qbGludCAtZTcwMSAtZTcwMiAqLwotCi0vKiBhcnJheSBvZiBhbHBoYSB2YWx1ZXMsIGZyb20gdGhlIHN0YW5kYXJkICovCi1zdGF0aWMgY29uc3QgdTggYWxwaGFzWzUyXSA9IHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDQsNCw1LDYsNyw4LDksMTAsCi0gICAgMTIsMTMsMTUsMTcsMjAsMjIsMjUsMjgsMzIsMzYsNDAsNDUsNTAsNTYsNjMsNzEsODAsOTAsMTAxLDExMywxMjcsMTQ0LDE2MiwKLSAgICAxODIsMjAzLDIyNiwyNTUsMjU1fTsKLQotLyogYXJyYXkgb2YgYmV0YSB2YWx1ZXMsIGZyb20gdGhlIHN0YW5kYXJkICovCi1zdGF0aWMgY29uc3QgdTggYmV0YXNbNTJdID0gezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwyLDIsMywzLDMsMyw0LDQsCi0gICAgNCw2LDYsNyw3LDgsOCw5LDksMTAsMTAsMTEsMTEsMTIsMTIsMTMsMTMsMTQsMTQsMTUsMTUsMTYsMTYsMTcsMTcsMTgsMTh9OwotCi0KLQotI2lmbmRlZiBIMjY0REVDX09NWERMCi0vKiBhcnJheSBvZiB0YzAgdmFsdWVzLCBmcm9tIHRoZSBzdGFuZGFyZCwgZWFjaCB0cmlwbGV0IGNvcnJlc3BvbmRzIHRvIGEKLSAqIGNvbHVtbiBpbiB0aGUgdGFibGUuIEluZGV4aW5nIGdvZXMgYXMgdGMwW2luZGV4QV1bYlMtMV0gKi8KLXN0YXRpYyBjb25zdCB1OCB0YzBbNTJdWzNdID0gewotICAgIHswLDAsMH0sezAsMCwwfSx7MCwwLDB9LHswLDAsMH0sezAsMCwwfSx7MCwwLDB9LHswLDAsMH0sezAsMCwwfSwKLSAgICB7MCwwLDB9LHswLDAsMH0sezAsMCwwfSx7MCwwLDB9LHswLDAsMH0sezAsMCwwfSx7MCwwLDB9LHswLDAsMH0sCi0gICAgezAsMCwwfSx7MCwwLDF9LHswLDAsMX0sezAsMCwxfSx7MCwwLDF9LHswLDEsMX0sezAsMSwxfSx7MSwxLDF9LAotICAgIHsxLDEsMX0sezEsMSwxfSx7MSwxLDF9LHsxLDEsMn0sezEsMSwyfSx7MSwxLDJ9LHsxLDEsMn0sezEsMiwzfSwKLSAgICB7MSwyLDN9LHsyLDIsM30sezIsMiw0fSx7MiwzLDR9LHsyLDMsNH0sezMsMyw1fSx7Myw0LDZ9LHszLDQsNn0sCi0gICAgezQsNSw3fSx7NCw1LDh9LHs0LDYsOX0sezUsNywxMH0sezYsOCwxMX0sezYsOCwxM30sezcsMTAsMTR9LHs4LDExLDE2fSwKLSAgICB7OSwxMiwxOH0sezEwLDEzLDIwfSx7MTEsMTUsMjN9LHsxMywxNywyNX0KLX07Ci0jZWxzZQotLyogYXJyYXkgb2YgdGMwIHZhbHVlcywgZnJvbSB0aGUgc3RhbmRhcmQsIGVhY2ggdHJpcGxldCBjb3JyZXNwb25kcyB0byBhCi0gKiBjb2x1bW4gaW4gdGhlIHRhYmxlLiBJbmRleGluZyBnb2VzIGFzIHRjMFtpbmRleEFdW2JTXSAqLwotc3RhdGljIGNvbnN0IHU4IHRjMFs1Ml1bNV0gPSB7Ci0gICAgezAsIDAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwLCAwfSwgezAsIDAsIDAsIDAsIDB9LAotICAgIHswLCAwLCAwLCAwLCAwfSwgezAsIDAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwLCAwfSwKLSAgICB7MCwgMCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwLCAwfSwgezAsIDAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMCwgMH0sCi0gICAgezAsIDAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwLCAwfSwgezAsIDAsIDAsIDAsIDB9LAotICAgIHswLCAwLCAwLCAwLCAwfSwgezAsIDAsIDAsIDEsIDB9LCB7MCwgMCwgMCwgMSwgMH0sIHswLCAwLCAwLCAxLCAwfSwKLSAgICB7MCwgMCwgMCwgMSwgMH0sIHswLCAwLCAxLCAxLCAwfSwgezAsIDAsIDEsIDEsIDB9LCB7MCwgMSwgMSwgMSwgMH0sCi0gICAgezAsIDEsIDEsIDEsIDB9LCB7MCwgMSwgMSwgMSwgMH0sIHswLCAxLCAxLCAxLCAwfSwgezAsIDEsIDEsIDIsIDB9LAotICAgIHswLCAxLCAxLCAyLCAwfSwgezAsIDEsIDEsIDIsIDB9LCB7MCwgMSwgMSwgMiwgMH0sIHswLCAxLCAyLCAzLCAwfSwKLSAgICB7MCwgMSwgMiwgMywgMH0sIHswLCAyLCAyLCAzLCAwfSwgezAsIDIsIDIsIDQsIDB9LCB7MCwgMiwgMywgNCwgMH0sCi0gICAgezAsIDIsIDMsIDQsIDB9LCB7MCwgMywgMywgNSwgMH0sIHswLCAzLCA0LCA2LCAwfSwgezAsIDMsIDQsIDYsIDB9LAotICAgIHswLCA0LCA1LCA3LCAwfSwgezAsIDQsIDUsIDgsIDB9LCB7MCwgNCwgNiwgOSwgMH0sIHswLCA1LCA3LCAxMCwgMH0sCi0gICAgezAsIDYsIDgsIDExLCAwfSwgezAsIDYsIDgsIDEzLCAwfSwgezAsIDcsIDEwLCAxNCwgMH0sCi0gICAgezAsIDgsIDExLCAxNiwgMH0sIHswLCA5LCAxMiwgMTgsIDB9LCB7MCwgMTAsIDEzLCAyMCwgMH0sCi0gICAgezAsIDExLCAxNSwgMjMsIDB9LCB7MCwgMTMsIDE3LCAyNSwgMH0KLX07Ci0jZW5kaWYKLQotCi0jaWZuZGVmIEgyNjRERUNfT01YREwKLS8qIG1hcHBpbmcgb2YgcmFzdGVyIHNjYW4gYmxvY2sgaW5kZXggdG8gNHg0IGJsb2NrIGluZGV4ICovCi1zdGF0aWMgY29uc3QgdTMyIG1iNHg0SW5kZXhbMTZdID0KLSAgICB7MCwgMSwgNCwgNSwgMiwgMywgNiwgNywgOCwgOSwgMTIsIDEzLCAxMCwgMTEsIDE0LCAxNX07Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBjb25zdCB1OCAqdGMwOwotICAgIHUzMiBhbHBoYTsKLSAgICB1MzIgYmV0YTsKLX0gZWRnZVRocmVzaG9sZF90OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdTMyIHRvcDsKLSAgICB1MzIgbGVmdDsKLX0gYlNfdDsKLQotZW51bSB7IFRPUCA9IDAsIExFRlQgPSAxLCBJTk5FUiA9IDIgfTsKLSNlbmRpZiAvKiBIMjY0REVDX09NWERMICovCi0KLSNkZWZpbmUgRklMVEVSX0xFRlRfRURHRSAgICAweDA0Ci0jZGVmaW5lIEZJTFRFUl9UT1BfRURHRSAgICAgMHgwMgotI2RlZmluZSBGSUxURVJfSU5ORVJfRURHRSAgIDB4MDEKLQotCi0vKiBjbGlwcGluZyB0YWJsZSBkZWZpbmVkIGluIGludHJhX3ByZWRpY3Rpb24uYyAqLwotZXh0ZXJuIGNvbnN0IHU4IGgyNjRic2RDbGlwW107Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHUzMiBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWJTdG9yYWdlX3QgKm1iMSwgdTMyIGkxLCB1MzIgaTIpOwotCi0jaWZuZGVmIEgyNjRERUNfT01YREwKLXN0YXRpYyB1MzIgRWRnZUJvdW5kYXJ5U3RyZW5ndGgobWJTdG9yYWdlX3QgKm1iMSwgbWJTdG9yYWdlX3QgKm1iMiwKLSAgICB1MzIgaTEsIHUzMiBpMik7Ci0jZWxzZQotc3RhdGljIHUzMiBJbm5lckJvdW5kYXJ5U3RyZW5ndGgyKG1iU3RvcmFnZV90ICptYjEsIHUzMiBpMSwgdTMyIGkyKTsKLXN0YXRpYyB1MzIgRWRnZUJvdW5kYXJ5U3RyZW5ndGhMZWZ0KG1iU3RvcmFnZV90ICptYjEsIG1iU3RvcmFnZV90ICptYjIpOwotc3RhdGljIHUzMiBFZGdlQm91bmRhcnlTdHJlbmd0aFRvcChtYlN0b3JhZ2VfdCAqbWIxLCBtYlN0b3JhZ2VfdCAqbWIyKTsKLSNlbmRpZgotCi1zdGF0aWMgdTMyIElzU2xpY2VCb3VuZGFyeU9uTGVmdChtYlN0b3JhZ2VfdCAqbWIpOwotCi1zdGF0aWMgdTMyIElzU2xpY2VCb3VuZGFyeU9uVG9wKG1iU3RvcmFnZV90ICptYik7Ci0KLXN0YXRpYyB1MzIgR2V0TWJGaWx0ZXJpbmdGbGFncyhtYlN0b3JhZ2VfdCAqbWIpOwotCi0jaWZuZGVmIEgyNjRERUNfT01YREwKLQotc3RhdGljIHUzMiBHZXRCb3VuZGFyeVN0cmVuZ3RocyhtYlN0b3JhZ2VfdCAqbWIsIGJTX3QgKmJzLCB1MzIgZmxhZ3MpOwotCi1zdGF0aWMgdm9pZCBGaWx0ZXJMdW1hKHU4ICpkYXRhLCBiU190ICpiUywgZWRnZVRocmVzaG9sZF90ICp0aHJlc2hvbGRzLAotICAgICAgICB1MzIgaW1hZ2VXaWR0aCk7Ci0KLXN0YXRpYyB2b2lkIEZpbHRlckNocm9tYSh1OCAqY2IsIHU4ICpjciwgYlNfdCAqYlMsIGVkZ2VUaHJlc2hvbGRfdCAqdGhyZXNob2xkcywKLSAgICAgICAgdTMyIGltYWdlV2lkdGgpOwotCi1zdGF0aWMgdm9pZCBGaWx0ZXJWZXJMdW1hRWRnZSggdTggKmRhdGEsIHUzMiBiUywgZWRnZVRocmVzaG9sZF90ICp0aHJlc2hvbGRzLAotICAgICAgICB1MzIgaW1hZ2VXaWR0aCk7Ci1zdGF0aWMgdm9pZCBGaWx0ZXJIb3JMdW1hRWRnZSggdTggKmRhdGEsIHUzMiBiUywgZWRnZVRocmVzaG9sZF90ICp0aHJlc2hvbGRzLAotICAgICAgICBpMzIgaW1hZ2VXaWR0aCk7Ci1zdGF0aWMgdm9pZCBGaWx0ZXJIb3JMdW1hKCB1OCAqZGF0YSwgdTMyIGJTLCBlZGdlVGhyZXNob2xkX3QgKnRocmVzaG9sZHMsCi0gICAgICAgIGkzMiBpbWFnZVdpZHRoKTsKLQotc3RhdGljIHZvaWQgRmlsdGVyVmVyQ2hyb21hRWRnZSggdTggKmRhdGEsIHUzMiBiUywgZWRnZVRocmVzaG9sZF90ICp0aHJlc2hvbGRzLAotICB1MzIgaW1hZ2VXaWR0aCk7Ci1zdGF0aWMgdm9pZCBGaWx0ZXJIb3JDaHJvbWFFZGdlKCB1OCAqZGF0YSwgdTMyIGJTLCBlZGdlVGhyZXNob2xkX3QgKnRocmVzaG9sZHMsCi0gIGkzMiBpbWFnZVdpZHRoKTsKLXN0YXRpYyB2b2lkIEZpbHRlckhvckNocm9tYSggdTggKmRhdGEsIHUzMiBiUywgZWRnZVRocmVzaG9sZF90ICp0aHJlc2hvbGRzLAotICBpMzIgaW1hZ2VXaWR0aCk7Ci0KLXN0YXRpYyB2b2lkIEdldEx1bWFFZGdlVGhyZXNob2xkcygKLSAgZWRnZVRocmVzaG9sZF90ICp0aHJlc2hvbGRzLAotICBtYlN0b3JhZ2VfdCAqbWIsCi0gIHUzMiBmaWx0ZXJpbmdGbGFncyk7Ci0KLXN0YXRpYyB2b2lkIEdldENocm9tYUVkZ2VUaHJlc2hvbGRzKAotICBlZGdlVGhyZXNob2xkX3QgKnRocmVzaG9sZHMsCi0gIG1iU3RvcmFnZV90ICptYiwKLSAgdTMyIGZpbHRlcmluZ0ZsYWdzLAotICBpMzIgY2hyb21hUXBJbmRleE9mZnNldCk7Ci0KLSNlbHNlIC8qIEgyNjRERUNfT01YREwgKi8KLQotc3RhdGljIHUzMiBHZXRCb3VuZGFyeVN0cmVuZ3RocyhtYlN0b3JhZ2VfdCAqbWIsIHU4ICgqYnMpWzE2XSwgdTMyIGZsYWdzKTsKLQotc3RhdGljIHZvaWQgR2V0THVtYUVkZ2VUaHJlc2hvbGRzKAotICAgIG1iU3RvcmFnZV90ICptYiwKLSAgICB1OCAoKmFscGhhKVsyXSwKLSAgICB1OCAoKmJldGEpWzJdLAotICAgIHU4ICgqdGhyZXNob2xkKVsxNl0sCi0gICAgdTggKCpicylbMTZdLAotICAgIHUzMiBmaWx0ZXJpbmdGbGFncyApOwotCi1zdGF0aWMgdm9pZCBHZXRDaHJvbWFFZGdlVGhyZXNob2xkcygKLSAgICBtYlN0b3JhZ2VfdCAqbWIsCi0gICAgdTggKCphbHBoYSlbMl0sCi0gICAgdTggKCpiZXRhKVsyXSwKLSAgICB1OCAoKnRocmVzaG9sZClbOF0sCi0gICAgdTggKCpicylbMTZdLAotICAgIHUzMiBmaWx0ZXJpbmdGbGFncywKLSAgICBpMzIgY2hyb21hUXBJbmRleE9mZnNldCk7Ci0KLSNlbmRpZiAvKiBIMjY0REVDX09NWERMICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogSXNTbGljZUJvdW5kYXJ5T25MZWZ0Ci0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiB0aGVyZSBpcyBhIHNsaWNlIGJvdW5kYXJ5IG9uIHRoZSBsZWZ0IHNpZGUKLSAgICAgICAgICAgIG9mIGEgbWFjcm9ibG9jay4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXUzMiBJc1NsaWNlQm91bmRhcnlPbkxlZnQobWJTdG9yYWdlX3QgKm1iKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKG1iICYmIG1iLT5tYkEpOwotCi0gICAgaWYgKG1iLT5zbGljZUlkICE9IG1iLT5tYkEtPnNsaWNlSWQpCi0gICAgICAgIHJldHVybihIQU5UUk9fVFJVRSk7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4oSEFOVFJPX0ZBTFNFKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IElzU2xpY2VCb3VuZGFyeU9uVG9wCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiB0aGVyZSBpcyBhIHNsaWNlIGJvdW5kYXJ5IGFib3ZlIHRoZQotICAgICAgICAgICAgY3VycmVudCBtYWNyb2Jsb2NrLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdTMyIElzU2xpY2VCb3VuZGFyeU9uVG9wKG1iU3RvcmFnZV90ICptYikKLXsKLQotLyogVmFyaWFibGVzICovCi0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChtYiAmJiBtYi0+bWJCKTsKLQotICAgIGlmIChtYi0+c2xpY2VJZCAhPSBtYi0+bWJCLT5zbGljZUlkKQotICAgICAgICByZXR1cm4oSEFOVFJPX1RSVUUpOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuKEhBTlRST19GQUxTRSk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBHZXRNYkZpbHRlcmluZ0ZsYWdzCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBGdW5jdGlvbiB0byBkZXRlcm1pbmUgd2hpY2ggZWRnZXMgb2YgYSBtYWNyb2Jsb2NrIGhhcyB0byBiZQotICAgICAgICAgIGZpbHRlcmVkLiBPdXRwdXQgaXMgYSBiaXQtd2lzZSBPUiBvZiBGSUxURVJfTEVGVF9FREdFLAotICAgICAgICAgIEZJTFRFUl9UT1BfRURHRSBhbmQgRklMVEVSX0lOTkVSX0VER0UsIGRlcGVuZGluZyBvbiB3aGljaCBlZGdlcwotICAgICAgICAgIHNoYWxsIGJlIGZpbHRlcmVkLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdTMyIEdldE1iRmlsdGVyaW5nRmxhZ3MobWJTdG9yYWdlX3QgKm1iKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBmbGFncyA9IDA7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChtYik7Ci0KLSAgICAvKiBub3RoaW5nIHdpbGwgYmUgZmlsdGVyZWQgaWYgZGlzYWJsZURlYmxvY2tpbmdGaWx0ZXJJZGMgPT0gMSAqLwotICAgIGlmIChtYi0+ZGlzYWJsZURlYmxvY2tpbmdGaWx0ZXJJZGMgIT0gMSkKLSAgICB7Ci0gICAgICAgIGZsYWdzIHw9IEZJTFRFUl9JTk5FUl9FREdFOwotCi0gICAgICAgIC8qIGZpbHRlckxlZnRNYkVkZ2VGbGFnLCBsZWZ0IG1iIGlzIE1CX0EgKi8KLSAgICAgICAgaWYgKG1iLT5tYkEgJiYKLSAgICAgICAgICAgICgobWItPmRpc2FibGVEZWJsb2NraW5nRmlsdGVySWRjICE9IDIpIHx8Ci0gICAgICAgICAgICAgIUlzU2xpY2VCb3VuZGFyeU9uTGVmdChtYikpKQotICAgICAgICAgICAgZmxhZ3MgfD0gRklMVEVSX0xFRlRfRURHRTsKLQotICAgICAgICAvKiBmaWx0ZXJUb3BNYkVkZ2VGbGFnICovCi0gICAgICAgIGlmIChtYi0+bWJCICYmCi0gICAgICAgICAgICAoKG1iLT5kaXNhYmxlRGVibG9ja2luZ0ZpbHRlcklkYyAhPSAyKSB8fAotICAgICAgICAgICAgICFJc1NsaWNlQm91bmRhcnlPblRvcChtYikpKQotICAgICAgICAgICAgZmxhZ3MgfD0gRklMVEVSX1RPUF9FREdFOwotICAgIH0KLQotICAgIHJldHVybihmbGFncyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBJbm5lckJvdW5kYXJ5U3RyZW5ndGgKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRnVuY3Rpb24gdG8gY2FsY3VsYXRlIGJvdW5kYXJ5IHN0cmVuZ3RoIHZhbHVlIGJzIGZvciBhbiBpbm5lcgotICAgICAgICAgICAgZWRnZSBvZiBhIG1hY3JvYmxvY2suIE1hY3JvYmxvY2sgdHlwZSBpcyBjaGVja2VkIGJlZm9yZSB0aGlzIGlzCi0gICAgICAgICAgICBjYWxsZWQgLT4gbm8gaW50cmEgbWIgY29uZGl0aW9uIGhlcmUuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi11MzIgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iU3RvcmFnZV90ICptYjEsIHUzMiBpbmQxLCB1MzIgaW5kMikKLXsKLSAgICBpMzIgdG1wMSwgdG1wMjsKLSAgICBpMzIgbXYxLCBtdjIsIG12MywgbXY0OwotCi0gICAgdG1wMSA9IG1iMS0+dG90YWxDb2VmZltpbmQxXTsKLSAgICB0bXAyID0gbWIxLT50b3RhbENvZWZmW2luZDJdOwotICAgIG12MSA9IG1iMS0+bXZbaW5kMV0uaG9yOwotICAgIG12MiA9IG1iMS0+bXZbaW5kMl0uaG9yOwotICAgIG12MyA9IG1iMS0+bXZbaW5kMV0udmVyOwotICAgIG12NCA9IG1iMS0+bXZbaW5kMl0udmVyOwotCi0gICAgaWYgKHRtcDEgfHwgdG1wMikKLSAgICB7Ci0gICAgICAgIHJldHVybiAyOwotICAgIH0KLSAgICBlbHNlIGlmICggKEFCUyhtdjEgLSBtdjIpID49IDQpIHx8IChBQlMobXYzIC0gbXY0KSA+PSA0KSB8fAotICAgICAgICAgICAgICAobWIxLT5yZWZBZGRyW2luZDEgPj4gMl0gIT0gbWIxLT5yZWZBZGRyW2luZDIgPj4gMl0pICkKLSAgICB7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHJldHVybiAwOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IElubmVyQm91bmRhcnlTdHJlbmd0aDIKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRnVuY3Rpb24gdG8gY2FsY3VsYXRlIGJvdW5kYXJ5IHN0cmVuZ3RoIHZhbHVlIGJzIGZvciBhbiBpbm5lcgotICAgICAgICAgICAgZWRnZSBvZiBhIG1hY3JvYmxvY2suIFRoZSBmdW5jdGlvbiBpcyB0aGUgc2FtZSBhcwotICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoIGJ1dCB3aXRob3V0IGNoZWNraW5nIHRvdGFsQ29lZmYuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi11MzIgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoMihtYlN0b3JhZ2VfdCAqbWIxLCB1MzIgaW5kMSwgdTMyIGluZDIpCi17Ci0gICAgaTMyIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQ7Ci0KLSAgICB0bXAxID0gbWIxLT5tdltpbmQxXS5ob3I7Ci0gICAgdG1wMiA9IG1iMS0+bXZbaW5kMl0uaG9yOwotICAgIHRtcDMgPSBtYjEtPm12W2luZDFdLnZlcjsKLSAgICB0bXA0ID0gbWIxLT5tdltpbmQyXS52ZXI7Ci0KLSAgICBpZiAoIChBQlModG1wMSAtIHRtcDIpID49IDQpIHx8IChBQlModG1wMyAtIHRtcDQpID49IDQpIHx8Ci0gICAgICAgICAobWIxLT5yZWZBZGRyW2luZDEgPj4gMl0gIT0gbWIxLT5yZWZBZGRyW2luZDIgPj4gMl0pKQotICAgIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIDA7Ci19Ci0jaWZuZGVmIEgyNjRERUNfT01YREwKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRWRnZUJvdW5kYXJ5U3RyZW5ndGgKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRnVuY3Rpb24gdG8gY2FsY3VsYXRlIGJvdW5kYXJ5IHN0cmVuZ3RoIHZhbHVlIGJzIGZvciBsZWZ0LSBvcgotICAgICAgICAgICAgdG9wLW1vc3QgZWRnZSBvZiBhIG1hY3JvYmxvY2suIE1hY3JvYmxvY2sgdHlwZXMgYXJlIGNoZWNrZWQKLSAgICAgICAgICAgIGJlZm9yZSB0aGlzIGlzIGNhbGxlZCAtPiBubyBpbnRyYSBtYiBjb25kaXRpb25zIGhlcmUuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi11MzIgRWRnZUJvdW5kYXJ5U3RyZW5ndGgobWJTdG9yYWdlX3QgKm1iMSwgbWJTdG9yYWdlX3QgKm1iMiwKLSAgICB1MzIgaW5kMSwgdTMyIGluZDIpCi17Ci0KLSAgICBpZiAobWIxLT50b3RhbENvZWZmW2luZDFdIHx8IG1iMi0+dG90YWxDb2VmZltpbmQyXSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAyOwotICAgIH0KLSAgICBlbHNlIGlmICgobWIxLT5yZWZBZGRyW2luZDEgPj4gMl0gIT0gbWIyLT5yZWZBZGRyW2luZDIgPj4gMl0pIHx8Ci0gICAgICAgICAgICAgKEFCUyhtYjEtPm12W2luZDFdLmhvciAtIG1iMi0+bXZbaW5kMl0uaG9yKSA+PSA0KSB8fAotICAgICAgICAgICAgIChBQlMobWIxLT5tdltpbmQxXS52ZXIgLSBtYjItPm12W2luZDJdLnZlcikgPj0gNCkpCi0gICAgewotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gMDsKLX0KLQotI2Vsc2UgLyogSDI2NERFQ19PTVhETCAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEVkZ2VCb3VuZGFyeVN0cmVuZ3RoVG9wCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBib3VuZGFyeSBzdHJlbmd0aCB2YWx1ZSBicyBmb3IKLSAgICAgICAgICAgIHRvcC1tb3N0IGVkZ2Ugb2YgYSBtYWNyb2Jsb2NrLiBNYWNyb2Jsb2NrIHR5cGVzIGFyZSBjaGVja2VkCi0gICAgICAgICAgICBiZWZvcmUgdGhpcyBpcyBjYWxsZWQgLT4gbm8gaW50cmEgbWIgY29uZGl0aW9ucyBoZXJlLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdTMyIEVkZ2VCb3VuZGFyeVN0cmVuZ3RoVG9wKG1iU3RvcmFnZV90ICptYjEsIG1iU3RvcmFnZV90ICptYjIpCi17Ci0gICAgdTMyIHRvcEJzID0gMDsKLSAgICB1MzIgdG1wMSwgdG1wMiwgdG1wMywgdG1wNDsKLQotICAgIHRtcDEgPSBtYjEtPnRvdGFsQ29lZmZbMF07Ci0gICAgdG1wMiA9IG1iMi0+dG90YWxDb2VmZlsxMF07Ci0gICAgdG1wMyA9IG1iMS0+dG90YWxDb2VmZlsxXTsKLSAgICB0bXA0ID0gbWIyLT50b3RhbENvZWZmWzExXTsKLSAgICBpZiAodG1wMSB8fCB0bXAyKQotICAgIHsKLSAgICAgICAgdG9wQnMgPSAyPDwwOwotICAgIH0KLSAgICBlbHNlIGlmICgoQUJTKG1iMS0+bXZbMF0uaG9yIC0gbWIyLT5tdlsxMF0uaG9yKSA+PSA0KSB8fAotICAgICAgICAgICAgIChBQlMobWIxLT5tdlswXS52ZXIgLSBtYjItPm12WzEwXS52ZXIpID49IDQpIHx8Ci0gICAgICAgICAgICAgKG1iMS0+cmVmQWRkclswXSAhPSBtYjItPnJlZkFkZHJbMTAgPj4gMl0pKQotICAgIHsKLSAgICAgICAgdG9wQnMgPSAxPDwwOwotICAgIH0KLSAgICB0bXAxID0gbWIxLT50b3RhbENvZWZmWzRdOwotICAgIHRtcDIgPSBtYjItPnRvdGFsQ29lZmZbMTRdOwotICAgIGlmICh0bXAzIHx8IHRtcDQpCi0gICAgewotICAgICAgICB0b3BCcyArPSAyPDw4OwotICAgIH0KLSAgICBlbHNlIGlmICgoQUJTKG1iMS0+bXZbMV0uaG9yIC0gbWIyLT5tdlsxMV0uaG9yKSA+PSA0KSB8fAotICAgICAgICAgICAgIChBQlMobWIxLT5tdlsxXS52ZXIgLSBtYjItPm12WzExXS52ZXIpID49IDQpIHx8Ci0gICAgICAgICAgICAgKG1iMS0+cmVmQWRkclswXSAhPSBtYjItPnJlZkFkZHJbMTEgPj4gMl0pKQotICAgIHsKLSAgICAgICAgdG9wQnMgKz0gMTw8ODsKLSAgICB9Ci0gICAgdG1wMyA9IG1iMS0+dG90YWxDb2VmZls1XTsKLSAgICB0bXA0ID0gbWIyLT50b3RhbENvZWZmWzE1XTsKLSAgICBpZiAodG1wMSB8fCB0bXAyKQotICAgIHsKLSAgICAgICAgdG9wQnMgKz0gMjw8MTY7Ci0gICAgfQotICAgIGVsc2UgaWYgKChBQlMobWIxLT5tdls0XS5ob3IgLSBtYjItPm12WzE0XS5ob3IpID49IDQpIHx8Ci0gICAgICAgICAgICAgKEFCUyhtYjEtPm12WzRdLnZlciAtIG1iMi0+bXZbMTRdLnZlcikgPj0gNCkgfHwKLSAgICAgICAgICAgICAobWIxLT5yZWZBZGRyWzQgPj4gMl0gIT0gbWIyLT5yZWZBZGRyWzE0ID4+IDJdKSkKLSAgICB7Ci0gICAgICAgIHRvcEJzICs9IDE8PDE2OwotICAgIH0KLSAgICBpZiAodG1wMyB8fCB0bXA0KQotICAgIHsKLSAgICAgICAgdG9wQnMgKz0gMjw8MjQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKChBQlMobWIxLT5tdls1XS5ob3IgLSBtYjItPm12WzE1XS5ob3IpID49IDQpIHx8Ci0gICAgICAgICAgICAgKEFCUyhtYjEtPm12WzVdLnZlciAtIG1iMi0+bXZbMTVdLnZlcikgPj0gNCkgfHwKLSAgICAgICAgICAgICAobWIxLT5yZWZBZGRyWzUgPj4gMl0gIT0gbWIyLT5yZWZBZGRyWzE1ID4+IDJdKSkKLSAgICB7Ci0gICAgICAgIHRvcEJzICs9IDE8PDI0OwotICAgIH0KLQotICAgIHJldHVybiB0b3BCczsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBFZGdlQm91bmRhcnlTdHJlbmd0aExlZnQKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRnVuY3Rpb24gdG8gY2FsY3VsYXRlIGJvdW5kYXJ5IHN0cmVuZ3RoIHZhbHVlIGJzIGZvciBsZWZ0LQotICAgICAgICAgICAgZWRnZSBvZiBhIG1hY3JvYmxvY2suIE1hY3JvYmxvY2sgdHlwZXMgYXJlIGNoZWNrZWQKLSAgICAgICAgICAgIGJlZm9yZSB0aGlzIGlzIGNhbGxlZCAtPiBubyBpbnRyYSBtYiBjb25kaXRpb25zIGhlcmUuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi11MzIgRWRnZUJvdW5kYXJ5U3RyZW5ndGhMZWZ0KG1iU3RvcmFnZV90ICptYjEsIG1iU3RvcmFnZV90ICptYjIpCi17Ci0gICAgdTMyIGxlZnRCcyA9IDA7Ci0gICAgdTMyIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQ7Ci0KLSAgICB0bXAxID0gbWIxLT50b3RhbENvZWZmWzBdOwotICAgIHRtcDIgPSBtYjItPnRvdGFsQ29lZmZbNV07Ci0gICAgdG1wMyA9IG1iMS0+dG90YWxDb2VmZlsyXTsKLSAgICB0bXA0ID0gbWIyLT50b3RhbENvZWZmWzddOwotCi0gICAgaWYgKHRtcDEgfHwgdG1wMikKLSAgICB7Ci0gICAgICAgIGxlZnRCcyA9IDI8PDA7Ci0gICAgfQotICAgIGVsc2UgaWYgKChBQlMobWIxLT5tdlswXS5ob3IgLSBtYjItPm12WzVdLmhvcikgPj0gNCkgfHwKLSAgICAgICAgICAgICAoQUJTKG1iMS0+bXZbMF0udmVyIC0gbWIyLT5tdls1XS52ZXIpID49IDQpIHx8Ci0gICAgICAgICAgICAgKG1iMS0+cmVmQWRkclswXSAhPSBtYjItPnJlZkFkZHJbNSA+PiAyXSkpCi0gICAgewotICAgICAgICBsZWZ0QnMgPSAxPDwwOwotICAgIH0KLSAgICB0bXAxID0gbWIxLT50b3RhbENvZWZmWzhdOwotICAgIHRtcDIgPSBtYjItPnRvdGFsQ29lZmZbMTNdOwotICAgIGlmICh0bXAzIHx8IHRtcDQpCi0gICAgewotICAgICAgICBsZWZ0QnMgKz0gMjw8ODsKLSAgICB9Ci0gICAgZWxzZSBpZiAoKEFCUyhtYjEtPm12WzJdLmhvciAtIG1iMi0+bXZbN10uaG9yKSA+PSA0KSB8fAotICAgICAgICAgICAgIChBQlMobWIxLT5tdlsyXS52ZXIgLSBtYjItPm12WzddLnZlcikgPj0gNCkgfHwKLSAgICAgICAgICAgICAobWIxLT5yZWZBZGRyWzBdICE9IG1iMi0+cmVmQWRkcls3ID4+IDJdKSkKLSAgICB7Ci0gICAgICAgIGxlZnRCcyArPSAxPDw4OwotICAgIH0KLSAgICB0bXAzID0gbWIxLT50b3RhbENvZWZmWzEwXTsKLSAgICB0bXA0ID0gbWIyLT50b3RhbENvZWZmWzE1XTsKLSAgICBpZiAodG1wMSB8fCB0bXAyKQotICAgIHsKLSAgICAgICAgbGVmdEJzICs9IDI8PDE2OwotICAgIH0KLSAgICBlbHNlIGlmICgoQUJTKG1iMS0+bXZbOF0uaG9yIC0gbWIyLT5tdlsxM10uaG9yKSA+PSA0KSB8fAotICAgICAgICAgICAgIChBQlMobWIxLT5tdls4XS52ZXIgLSBtYjItPm12WzEzXS52ZXIpID49IDQpIHx8Ci0gICAgICAgICAgICAgKG1iMS0+cmVmQWRkcls4ID4+IDJdICE9IG1iMi0+cmVmQWRkclsxMyA+PiAyXSkpCi0gICAgewotICAgICAgICBsZWZ0QnMgKz0gMTw8MTY7Ci0gICAgfQotICAgIGlmICh0bXAzIHx8IHRtcDQpCi0gICAgewotICAgICAgICBsZWZ0QnMgKz0gMjw8MjQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKChBQlMobWIxLT5tdlsxMF0uaG9yIC0gbWIyLT5tdlsxNV0uaG9yKSA+PSA0KSB8fAotICAgICAgICAgICAgIChBQlMobWIxLT5tdlsxMF0udmVyIC0gbWIyLT5tdlsxNV0udmVyKSA+PSA0KSB8fAotICAgICAgICAgICAgIChtYjEtPnJlZkFkZHJbMTAgPj4gMl0gIT0gbWIyLT5yZWZBZGRyWzE1ID4+IDJdKSkKLSAgICB7Ci0gICAgICAgIGxlZnRCcyArPSAxPDwyNDsKLSAgICB9Ci0KLSAgICByZXR1cm4gbGVmdEJzOwotfQotI2VuZGlmIC8qIEgyNjRERUNfT01YREwgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZEZpbHRlclBpY3R1cmUKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFBlcmZvcm0gZGVibG9ja2luZyBmaWx0ZXJpbmcgZm9yIGEgcGljdHVyZS4gRmlsdGVyIGRvZXMgbm90IGNvcHkKLSAgICAgICAgICB0aGUgb3JpZ2luYWwgcGljdHVyZSBhbnl3aGVyZSBidXQgZmlsdGVyaW5nIGlzIHBlcmZvcm1lZCBkaXJlY3RseQotICAgICAgICAgIG9uIHRoZSBvcmlnaW5hbCBpbWFnZS4gUGFyYW1ldGVycyBjb250cm9sbGluZyB0aGUgZmlsdGVyaW5nIHByb2Nlc3MKLSAgICAgICAgICBhcmUgY29tcHV0ZWQgYmFzZWQgb24gaW5mb3JtYXRpb24gaW4gbWFjcm9ibG9jayBzdHJ1Y3R1cmVzIG9mIHRoZQotICAgICAgICAgIGZpbHRlcmVkIG1hY3JvYmxvY2ssIG1hY3JvYmxvY2sgYWJvdmUgYW5kIG1hY3JvYmxvY2sgb24gdGhlIGxlZnQgb2YKLSAgICAgICAgICB0aGUgZmlsdGVyZWQgb25lLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICBpbWFnZSAgICAgICAgIHBvaW50ZXIgdG8gaW1hZ2UgdG8gYmUgZmlsdGVyZWQKLSAgICAgICAgICBtYiAgICAgICAgICAgIHBvaW50ZXIgdG8gbWFjcm9ibG9jayBkYXRhIHN0cnVjdHVyZSBvZiB0aGUgdG9wLWxlZnQKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2sgb2YgdGhlIHBpY3R1cmUKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgIGltYWdlICAgICAgICAgZmlsdGVyZWQgaW1hZ2Ugc3RvcmVkIGhlcmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgIG5vbmUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZm5kZWYgSDI2NERFQ19PTVhETAotdm9pZCBoMjY0YnNkRmlsdGVyUGljdHVyZSgKLSAgaW1hZ2VfdCAqaW1hZ2UsCi0gIG1iU3RvcmFnZV90ICptYikKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgZmxhZ3M7Ci0gICAgdTMyIHBpY1NpemVJbk1icywgbWJSb3csIG1iQ29sOwotICAgIHUzMiBwaWNXaWR0aEluTWJzOwotICAgIHU4ICpkYXRhOwotICAgIG1iU3RvcmFnZV90ICpwTWI7Ci0gICAgYlNfdCBiU1sxNl07Ci0gICAgZWRnZVRocmVzaG9sZF90IHRocmVzaG9sZHNbM107Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChpbWFnZSk7Ci0gICAgQVNTRVJUKG1iKTsKLSAgICBBU1NFUlQoaW1hZ2UtPmRhdGEpOwotICAgIEFTU0VSVChpbWFnZS0+d2lkdGgpOwotICAgIEFTU0VSVChpbWFnZS0+aGVpZ2h0KTsKLQotICAgIHBpY1dpZHRoSW5NYnMgPSBpbWFnZS0+d2lkdGg7Ci0gICAgZGF0YSA9IGltYWdlLT5kYXRhOwotICAgIHBpY1NpemVJbk1icyA9IHBpY1dpZHRoSW5NYnMgKiBpbWFnZS0+aGVpZ2h0OwotCi0gICAgcE1iID0gbWI7Ci0KLSAgICBmb3IgKG1iUm93ID0gMCwgbWJDb2wgPSAwOyBtYlJvdyA8IGltYWdlLT5oZWlnaHQ7IHBNYisrKQotICAgIHsKLSAgICAgICAgZmxhZ3MgPSBHZXRNYkZpbHRlcmluZ0ZsYWdzKHBNYik7Ci0KLSAgICAgICAgaWYgKGZsYWdzKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBHZXRCb3VuZGFyeVN0cmVuZ3RocyBmdW5jdGlvbiByZXR1cm5zIG5vbi16ZXJvIHZhbHVlIGlmIGFueSBvZgotICAgICAgICAgICAgICogdGhlIGJTIHZhbHVlcyBmb3IgdGhlIG1hY3JvYmxvY2sgYmVpbmcgcHJvY2Vzc2VkIHdhcyBub24temVybyAqLwotICAgICAgICAgICAgaWYgKEdldEJvdW5kYXJ5U3RyZW5ndGhzKHBNYiwgYlMsIGZsYWdzKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBsdW1hICovCi0gICAgICAgICAgICAgICAgR2V0THVtYUVkZ2VUaHJlc2hvbGRzKHRocmVzaG9sZHMsIHBNYiwgZmxhZ3MpOwotICAgICAgICAgICAgICAgIGRhdGEgPSBpbWFnZS0+ZGF0YSArIG1iUm93ICogcGljV2lkdGhJbk1icyAqIDI1NiArIG1iQ29sICogMTY7Ci0KLSAgICAgICAgICAgICAgICBGaWx0ZXJMdW1hKCh1OCopZGF0YSwgYlMsIHRocmVzaG9sZHMsIHBpY1dpZHRoSW5NYnMqMTYpOwotCi0gICAgICAgICAgICAgICAgLyogY2hyb21hICovCi0gICAgICAgICAgICAgICAgR2V0Q2hyb21hRWRnZVRocmVzaG9sZHModGhyZXNob2xkcywgcE1iLCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgcE1iLT5jaHJvbWFRcEluZGV4T2Zmc2V0KTsKLSAgICAgICAgICAgICAgICBkYXRhID0gaW1hZ2UtPmRhdGEgKyBwaWNTaXplSW5NYnMgKiAyNTYgKwotICAgICAgICAgICAgICAgICAgICBtYlJvdyAqIHBpY1dpZHRoSW5NYnMgKiA2NCArIG1iQ29sICogODsKLQotICAgICAgICAgICAgICAgIEZpbHRlckNocm9tYSgodTgqKWRhdGEsIGRhdGEgKyA2NCpwaWNTaXplSW5NYnMsIGJTLAotICAgICAgICAgICAgICAgICAgICAgICAgdGhyZXNob2xkcywgcGljV2lkdGhJbk1icyo4KTsKLQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbWJDb2wrKzsKLSAgICAgICAgaWYgKG1iQ29sID09IHBpY1dpZHRoSW5NYnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1iQ29sID0gMDsKLSAgICAgICAgICAgIG1iUm93Kys7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBGaWx0ZXJWZXJMdW1hRWRnZQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGaWx0ZXIgb25lIHZlcnRpY2FsIDQtcGl4ZWwgbHVtYSBlZGdlLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBGaWx0ZXJWZXJMdW1hRWRnZSgKLSAgdTggKmRhdGEsCi0gIHUzMiBiUywKLSAgZWRnZVRocmVzaG9sZF90ICp0aHJlc2hvbGRzLAotICB1MzIgaW1hZ2VXaWR0aCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICBpMzIgZGVsdGEsIHRjLCB0bXA7Ci0gICAgdTMyIGk7Ci0gICAgdTggcDAsIHEwLCBwMSwgcTEsIHAyLCBxMjsKLSAgICB1MzIgdG1wRmxhZzsKLSAgICBjb25zdCB1OCAqY2xwID0gaDI2NGJzZENsaXAgKyA1MTI7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChkYXRhKTsKLSAgICBBU1NFUlQoYlMgJiYgYlMgPD0gNCk7Ci0gICAgQVNTRVJUKHRocmVzaG9sZHMpOwotCi0gICAgaWYgKGJTIDwgNCkKLSAgICB7Ci0gICAgICAgIHRjID0gdGhyZXNob2xkcy0+dGMwW2JTLTFdOwotICAgICAgICB0bXAgPSB0YzsKLSAgICAgICAgZm9yIChpID0gNDsgaTsgaS0tLCBkYXRhICs9IGltYWdlV2lkdGgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHAxID0gZGF0YVstMl07IHAwID0gZGF0YVstMV07Ci0gICAgICAgICAgICBxMCA9IGRhdGFbMF07IHExID0gZGF0YVsxXTsKLSAgICAgICAgICAgIGlmICggKCh1bnNpZ25lZClBQlMocDAtcTApIDwgdGhyZXNob2xkcy0+YWxwaGEpICYmCi0gICAgICAgICAgICAgICAgICgodW5zaWduZWQpQUJTKHAxLXAwKSA8IHRocmVzaG9sZHMtPmJldGEpICAmJgotICAgICAgICAgICAgICAgICAoKHVuc2lnbmVkKUFCUyhxMS1xMCkgPCB0aHJlc2hvbGRzLT5iZXRhKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcDIgPSBkYXRhWy0zXTsKLSAgICAgICAgICAgICAgICBxMiA9IGRhdGFbMl07Ci0KLSAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKUFCUyhwMi1wMCkgPCB0aHJlc2hvbGRzLT5iZXRhKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZGF0YVstMl0gPSAodTgpKHAxICsgQ0xJUDMoLXRjLHRjLAotICAgICAgICAgICAgICAgICAgICAgICAgKHAyICsgKChwMCArIHEwICsgMSkgPj4gMSkgLSAocDEgPDwgMSkpID4+IDEpKTsKLSAgICAgICAgICAgICAgICAgICAgdG1wKys7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZClBQlMocTItcTApIDwgdGhyZXNob2xkcy0+YmV0YSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGRhdGFbMV0gPSAodTgpKHExICsgQ0xJUDMoLXRjLHRjLAotICAgICAgICAgICAgICAgICAgICAgICAgKHEyICsgKChwMCArIHEwICsgMSkgPj4gMSkgLSAocTEgPDwgMSkpID4+IDEpKTsKLSAgICAgICAgICAgICAgICAgICAgdG1wKys7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZGVsdGEgPSBDTElQMygtdG1wLCB0bXAsICgoKChxMCAtIHAwKSA8PCAyKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChwMSAtIHExKSArIDQpID4+IDMpKTsKLQotICAgICAgICAgICAgICAgIHAwID0gY2xwW3AwICsgZGVsdGFdOwotICAgICAgICAgICAgICAgIHEwID0gY2xwW3EwIC0gZGVsdGFdOwotICAgICAgICAgICAgICAgIHRtcCA9IHRjOwotICAgICAgICAgICAgICAgIGRhdGFbLTFdID0gcDA7Ci0gICAgICAgICAgICAgICAgZGF0YVsgMF0gPSBxMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBmb3IgKGkgPSA0OyBpOyBpLS0sIGRhdGEgKz0gaW1hZ2VXaWR0aCkKLSAgICAgICAgewotICAgICAgICAgICAgcDEgPSBkYXRhWy0yXTsgcDAgPSBkYXRhWy0xXTsKLSAgICAgICAgICAgIHEwID0gZGF0YVswXTsgcTEgPSBkYXRhWzFdOwotICAgICAgICAgICAgaWYgKCAoKHVuc2lnbmVkKUFCUyhwMC1xMCkgPCB0aHJlc2hvbGRzLT5hbHBoYSkgJiYKLSAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZClBQlMocDEtcDApIDwgdGhyZXNob2xkcy0+YmV0YSkgICYmCi0gICAgICAgICAgICAgICAgICgodW5zaWduZWQpQUJTKHExLXEwKSA8IHRocmVzaG9sZHMtPmJldGEpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0bXBGbGFnID0KLSAgICAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZClBQlMocDAtcTApIDwgKCh0aHJlc2hvbGRzLT5hbHBoYSA+PiAyKSArMikpID8KLSAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotCi0gICAgICAgICAgICAgICAgcDIgPSBkYXRhWy0zXTsKLSAgICAgICAgICAgICAgICBxMiA9IGRhdGFbMl07Ci0KLSAgICAgICAgICAgICAgICBpZiAodG1wRmxhZyAmJiAodW5zaWduZWQpQUJTKHAyLXAwKSA8IHRocmVzaG9sZHMtPmJldGEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0bXAgPSBwMSArIHAwICsgcTA7Ci0gICAgICAgICAgICAgICAgICAgIGRhdGFbLTFdID0gKHU4KSgocDIgKyAyICogdG1wICsgcTEgKyA0KSA+PiAzKTsKLSAgICAgICAgICAgICAgICAgICAgZGF0YVstMl0gPSAodTgpKChwMiArIHRtcCArIDIpID4+IDIpOwotICAgICAgICAgICAgICAgICAgICBkYXRhWy0zXSA9ICh1OCkoKDIgKiBkYXRhWy00XSArIDMgKiBwMiArIHRtcCArIDQpID4+IDMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGRhdGFbLTFdID0gKDIgKiBwMSArIHAwICsgcTEgKyAyKSA+PiAyOwotCi0gICAgICAgICAgICAgICAgaWYgKHRtcEZsYWcgJiYgKHVuc2lnbmVkKUFCUyhxMi1xMCkgPCB0aHJlc2hvbGRzLT5iZXRhKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdG1wID0gcDAgKyBxMCArIHExOwotICAgICAgICAgICAgICAgICAgICBkYXRhWzBdID0gKHU4KSgocDEgKyAyICogdG1wICsgcTIgKyA0KSA+PiAzKTsKLSAgICAgICAgICAgICAgICAgICAgZGF0YVsxXSA9ICh1OCkoKHRtcCArIHEyICsgMikgPj4gMik7Ci0gICAgICAgICAgICAgICAgICAgIGRhdGFbMl0gPSAodTgpKCgyICogZGF0YVszXSArIDMgKiBxMiArIHRtcCArIDQpID4+IDMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGRhdGFbMF0gPSAodTgpKCgyICogcTEgKyBxMCArIHAxICsgMikgPj4gMik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBGaWx0ZXJIb3JMdW1hRWRnZQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGaWx0ZXIgb25lIGhvcml6b250YWwgNC1waXhlbCBsdW1hIGVkZ2UKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgRmlsdGVySG9yTHVtYUVkZ2UoCi0gIHU4ICpkYXRhLAotICB1MzIgYlMsCi0gIGVkZ2VUaHJlc2hvbGRfdCAqdGhyZXNob2xkcywKLSAgaTMyIGltYWdlV2lkdGgpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgaTMyIGRlbHRhLCB0YywgdG1wOwotICAgIHUzMiBpOwotICAgIHU4IHAwLCBxMCwgcDEsIHExLCBwMiwgcTI7Ci0gICAgY29uc3QgdTggKmNscCA9IGgyNjRic2RDbGlwICsgNTEyOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoZGF0YSk7Ci0gICAgQVNTRVJUKGJTIDwgNCk7Ci0gICAgQVNTRVJUKHRocmVzaG9sZHMpOwotCi0gICAgdGMgPSB0aHJlc2hvbGRzLT50YzBbYlMtMV07Ci0gICAgdG1wID0gdGM7Ci0gICAgZm9yIChpID0gNDsgaTsgaS0tLCBkYXRhKyspCi0gICAgewotICAgICAgICBwMSA9IGRhdGFbLWltYWdlV2lkdGgqMl07IHAwID0gZGF0YVstaW1hZ2VXaWR0aF07Ci0gICAgICAgIHEwID0gZGF0YVswXTsgcTEgPSBkYXRhW2ltYWdlV2lkdGhdOwotICAgICAgICBpZiAoICgodW5zaWduZWQpQUJTKHAwLXEwKSA8IHRocmVzaG9sZHMtPmFscGhhKSAmJgotICAgICAgICAgICAgICgodW5zaWduZWQpQUJTKHAxLXAwKSA8IHRocmVzaG9sZHMtPmJldGEpICAmJgotICAgICAgICAgICAgICgodW5zaWduZWQpQUJTKHExLXEwKSA8IHRocmVzaG9sZHMtPmJldGEpICkKLSAgICAgICAgewotICAgICAgICAgICAgcDIgPSBkYXRhWy1pbWFnZVdpZHRoKjNdOwotCi0gICAgICAgICAgICBpZiAoKHVuc2lnbmVkKUFCUyhwMi1wMCkgPCB0aHJlc2hvbGRzLT5iZXRhKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRhdGFbLWltYWdlV2lkdGgqMl0gPSAodTgpKHAxICsgQ0xJUDMoLXRjLHRjLAotICAgICAgICAgICAgICAgICAgICAocDIgKyAoKHAwICsgcTAgKyAxKSA+PiAxKSAtIChwMSA8PCAxKSkgPj4gMSkpOwotICAgICAgICAgICAgICAgIHRtcCsrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBxMiA9IGRhdGFbaW1hZ2VXaWR0aCoyXTsKLQotICAgICAgICAgICAgaWYgKCh1bnNpZ25lZClBQlMocTItcTApIDwgdGhyZXNob2xkcy0+YmV0YSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkYXRhW2ltYWdlV2lkdGhdID0gKHU4KShxMSArIENMSVAzKC10Yyx0YywKLSAgICAgICAgICAgICAgICAgICAgKHEyICsgKChwMCArIHEwICsgMSkgPj4gMSkgLSAocTEgPDwgMSkpID4+IDEpKTsKLSAgICAgICAgICAgICAgICB0bXArKzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGVsdGEgPSBDTElQMygtdG1wLCB0bXAsICgoKChxMCAtIHAwKSA8PCAyKSArCi0gICAgICAgICAgICAgICAgICAgICAgKHAxIC0gcTEpICsgNCkgPj4gMykpOwotCi0gICAgICAgICAgICBwMCA9IGNscFtwMCArIGRlbHRhXTsKLSAgICAgICAgICAgIHEwID0gY2xwW3EwIC0gZGVsdGFdOwotICAgICAgICAgICAgdG1wID0gdGM7Ci0gICAgICAgICAgICBkYXRhWy1pbWFnZVdpZHRoXSA9IHAwOwotICAgICAgICAgICAgZGF0YVsgIDBdID0gcTA7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRmlsdGVySG9yTHVtYQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGaWx0ZXIgYWxsIGZvdXIgc3VjY2Vzc2l2ZSBob3Jpem9udGFsIDQtcGl4ZWwgbHVtYSBlZGdlcy4gVGhpcyBjYW4KLSAgICAgICAgICAgIGJlIGRvbmUgd2hlbiBiUyBpcyBlcXVhbCB0byBhbGwgZm91ciBlZGdlcy4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgRmlsdGVySG9yTHVtYSgKLSAgdTggKmRhdGEsCi0gIHUzMiBiUywKLSAgZWRnZVRocmVzaG9sZF90ICp0aHJlc2hvbGRzLAotICBpMzIgaW1hZ2VXaWR0aCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICBpMzIgZGVsdGEsIHRjLCB0bXA7Ci0gICAgdTMyIGk7Ci0gICAgdTggcDAsIHEwLCBwMSwgcTEsIHAyLCBxMjsKLSAgICB1MzIgdG1wRmxhZzsKLSAgICBjb25zdCB1OCAqY2xwID0gaDI2NGJzZENsaXAgKyA1MTI7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChkYXRhKTsKLSAgICBBU1NFUlQoYlMgPD0gNCk7Ci0gICAgQVNTRVJUKHRocmVzaG9sZHMpOwotCi0gICAgaWYgKGJTIDwgNCkKLSAgICB7Ci0gICAgICAgIHRjID0gdGhyZXNob2xkcy0+dGMwW2JTLTFdOwotICAgICAgICB0bXAgPSB0YzsKLSAgICAgICAgZm9yIChpID0gMTY7IGk7IGktLSwgZGF0YSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBwMSA9IGRhdGFbLWltYWdlV2lkdGgqMl07IHAwID0gZGF0YVstaW1hZ2VXaWR0aF07Ci0gICAgICAgICAgICBxMCA9IGRhdGFbMF07IHExID0gZGF0YVtpbWFnZVdpZHRoXTsKLSAgICAgICAgICAgIGlmICggKCh1bnNpZ25lZClBQlMocDAtcTApIDwgdGhyZXNob2xkcy0+YWxwaGEpICYmCi0gICAgICAgICAgICAgICAgICgodW5zaWduZWQpQUJTKHAxLXAwKSA8IHRocmVzaG9sZHMtPmJldGEpICAmJgotICAgICAgICAgICAgICAgICAoKHVuc2lnbmVkKUFCUyhxMS1xMCkgPCB0aHJlc2hvbGRzLT5iZXRhKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcDIgPSBkYXRhWy1pbWFnZVdpZHRoKjNdOwotCi0gICAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZClBQlMocDItcDApIDwgdGhyZXNob2xkcy0+YmV0YSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGRhdGFbLWltYWdlV2lkdGgqMl0gPSAodTgpKHAxICsgQ0xJUDMoLXRjLHRjLAotICAgICAgICAgICAgICAgICAgICAgICAgKHAyICsgKChwMCArIHEwICsgMSkgPj4gMSkgLSAocDEgPDwgMSkpID4+IDEpKTsKLSAgICAgICAgICAgICAgICAgICAgdG1wKys7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcTIgPSBkYXRhW2ltYWdlV2lkdGgqMl07Ci0KLSAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKUFCUyhxMi1xMCkgPCB0aHJlc2hvbGRzLT5iZXRhKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZGF0YVtpbWFnZVdpZHRoXSA9ICh1OCkocTEgKyBDTElQMygtdGMsdGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAocTIgKyAoKHAwICsgcTAgKyAxKSA+PiAxKSAtIChxMSA8PCAxKSkgPj4gMSkpOwotICAgICAgICAgICAgICAgICAgICB0bXArKzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBkZWx0YSA9IENMSVAzKC10bXAsIHRtcCwgKCgoKHEwIC0gcDApIDw8IDIpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKHAxIC0gcTEpICsgNCkgPj4gMykpOwotCi0gICAgICAgICAgICAgICAgcDAgPSBjbHBbcDAgKyBkZWx0YV07Ci0gICAgICAgICAgICAgICAgcTAgPSBjbHBbcTAgLSBkZWx0YV07Ci0gICAgICAgICAgICAgICAgdG1wID0gdGM7Ci0gICAgICAgICAgICAgICAgZGF0YVstaW1hZ2VXaWR0aF0gPSBwMDsKLSAgICAgICAgICAgICAgICBkYXRhWyAgMF0gPSBxMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBmb3IgKGkgPSAxNjsgaTsgaS0tLCBkYXRhKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHAxID0gZGF0YVstaW1hZ2VXaWR0aCoyXTsgcDAgPSBkYXRhWy1pbWFnZVdpZHRoXTsKLSAgICAgICAgICAgIHEwID0gZGF0YVswXTsgcTEgPSBkYXRhW2ltYWdlV2lkdGhdOwotICAgICAgICAgICAgaWYgKCAoKHVuc2lnbmVkKUFCUyhwMC1xMCkgPCB0aHJlc2hvbGRzLT5hbHBoYSkgJiYKLSAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZClBQlMocDEtcDApIDwgdGhyZXNob2xkcy0+YmV0YSkgICYmCi0gICAgICAgICAgICAgICAgICgodW5zaWduZWQpQUJTKHExLXEwKSA8IHRocmVzaG9sZHMtPmJldGEpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0bXBGbGFnID0gKCh1bnNpZ25lZClBQlMocDAtcTApIDwgKCh0aHJlc2hvbGRzLT5hbHBoYSA+PiAyKSArMikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgICAgICAgICAgICAgIHAyID0gZGF0YVstaW1hZ2VXaWR0aCozXTsKLSAgICAgICAgICAgICAgICBxMiA9IGRhdGFbaW1hZ2VXaWR0aCoyXTsKLQotICAgICAgICAgICAgICAgIGlmICh0bXBGbGFnICYmICh1bnNpZ25lZClBQlMocDItcDApIDwgdGhyZXNob2xkcy0+YmV0YSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRtcCA9IHAxICsgcDAgKyBxMDsKLSAgICAgICAgICAgICAgICAgICAgZGF0YVstaW1hZ2VXaWR0aF0gPSAodTgpKChwMiArIDIgKiB0bXAgKyBxMSArIDQpID4+IDMpOwotICAgICAgICAgICAgICAgICAgICBkYXRhWy1pbWFnZVdpZHRoKjJdID0gKHU4KSgocDIgKyB0bXAgKyAyKSA+PiAyKTsKLSAgICAgICAgICAgICAgICAgICAgZGF0YVstaW1hZ2VXaWR0aCozXSA9ICh1OCkoKDIgKiBkYXRhWy1pbWFnZVdpZHRoKjRdICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzICogcDIgKyB0bXAgKyA0KSA+PiAzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBkYXRhWy1pbWFnZVdpZHRoXSA9ICh1OCkoKDIgKiBwMSArIHAwICsgcTEgKyAyKSA+PiAyKTsKLQotICAgICAgICAgICAgICAgIGlmICh0bXBGbGFnICYmICh1bnNpZ25lZClBQlMocTItcTApIDwgdGhyZXNob2xkcy0+YmV0YSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRtcCA9IHAwICsgcTAgKyBxMTsKLSAgICAgICAgICAgICAgICAgICAgZGF0YVsgMF0gPSAodTgpKChwMSArIDIgKiB0bXAgKyBxMiArIDQpID4+IDMpOwotICAgICAgICAgICAgICAgICAgICBkYXRhW2ltYWdlV2lkdGhdID0gKHU4KSgodG1wICsgcTIgKyAyKSA+PiAyKTsKLSAgICAgICAgICAgICAgICAgICAgZGF0YVtpbWFnZVdpZHRoKjJdID0gKHU4KSgoMiAqIGRhdGFbaW1hZ2VXaWR0aCozXSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzICogcTIgKyB0bXAgKyA0KSA+PiAzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBkYXRhWzBdID0gKDIgKiBxMSArIHEwICsgcDEgKyAyKSA+PiAyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRmlsdGVyVmVyQ2hyb21hRWRnZQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGaWx0ZXIgb25lIHZlcnRpY2FsIDItcGl4ZWwgY2hyb21hIGVkZ2UKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgRmlsdGVyVmVyQ2hyb21hRWRnZSgKLSAgdTggKmRhdGEsCi0gIHUzMiBiUywKLSAgZWRnZVRocmVzaG9sZF90ICp0aHJlc2hvbGRzLAotICB1MzIgd2lkdGgpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgaTMyIGRlbHRhLCB0YzsKLSAgICB1OCBwMCwgcTAsIHAxLCBxMTsKLSAgICBjb25zdCB1OCAqY2xwID0gaDI2NGJzZENsaXAgKyA1MTI7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChkYXRhKTsKLSAgICBBU1NFUlQoYlMgPD0gNCk7Ci0gICAgQVNTRVJUKHRocmVzaG9sZHMpOwotCi0gICAgcDEgPSBkYXRhWy0yXTsgcDAgPSBkYXRhWy0xXTsKLSAgICBxMCA9IGRhdGFbMF07IHExID0gZGF0YVsxXTsKLSAgICBpZiAoICgodW5zaWduZWQpQUJTKHAwLXEwKSA8IHRocmVzaG9sZHMtPmFscGhhKSAmJgotICAgICAgICAgKCh1bnNpZ25lZClBQlMocDEtcDApIDwgdGhyZXNob2xkcy0+YmV0YSkgICYmCi0gICAgICAgICAoKHVuc2lnbmVkKUFCUyhxMS1xMCkgPCB0aHJlc2hvbGRzLT5iZXRhKSApCi0gICAgewotICAgICAgICBpZiAoYlMgPCA0KQotICAgICAgICB7Ci0gICAgICAgICAgICB0YyA9IHRocmVzaG9sZHMtPnRjMFtiUy0xXSArIDE7Ci0gICAgICAgICAgICBkZWx0YSA9IENMSVAzKC10YywgdGMsICgoKChxMCAtIHAwKSA8PCAyKSArCi0gICAgICAgICAgICAgICAgICAgICAgKHAxIC0gcTEpICsgNCkgPj4gMykpOwotICAgICAgICAgICAgcDAgPSBjbHBbcDAgKyBkZWx0YV07Ci0gICAgICAgICAgICBxMCA9IGNscFtxMCAtIGRlbHRhXTsKLSAgICAgICAgICAgIGRhdGFbLTFdID0gcDA7Ci0gICAgICAgICAgICBkYXRhWyAwXSA9IHEwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZGF0YVstMV0gPSAoMiAqIHAxICsgcDAgKyBxMSArIDIpID4+IDI7Ci0gICAgICAgICAgICBkYXRhWyAwXSA9ICgyICogcTEgKyBxMCArIHAxICsgMikgPj4gMjsKLSAgICAgICAgfQotICAgIH0KLSAgICBkYXRhICs9IHdpZHRoOwotICAgIHAxID0gZGF0YVstMl07IHAwID0gZGF0YVstMV07Ci0gICAgcTAgPSBkYXRhWzBdOyBxMSA9IGRhdGFbMV07Ci0gICAgaWYgKCAoKHVuc2lnbmVkKUFCUyhwMC1xMCkgPCB0aHJlc2hvbGRzLT5hbHBoYSkgJiYKLSAgICAgICAgICgodW5zaWduZWQpQUJTKHAxLXAwKSA8IHRocmVzaG9sZHMtPmJldGEpICAmJgotICAgICAgICAgKCh1bnNpZ25lZClBQlMocTEtcTApIDwgdGhyZXNob2xkcy0+YmV0YSkgKQotICAgIHsKLSAgICAgICAgaWYgKGJTIDwgNCkKLSAgICAgICAgewotICAgICAgICAgICAgdGMgPSB0aHJlc2hvbGRzLT50YzBbYlMtMV0gKyAxOwotICAgICAgICAgICAgZGVsdGEgPSBDTElQMygtdGMsIHRjLCAoKCgocTAgLSBwMCkgPDwgMikgKwotICAgICAgICAgICAgICAgICAgICAgIChwMSAtIHExKSArIDQpID4+IDMpKTsKLSAgICAgICAgICAgIHAwID0gY2xwW3AwICsgZGVsdGFdOwotICAgICAgICAgICAgcTAgPSBjbHBbcTAgLSBkZWx0YV07Ci0gICAgICAgICAgICBkYXRhWy0xXSA9IHAwOwotICAgICAgICAgICAgZGF0YVsgMF0gPSBxMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRhdGFbLTFdID0gKDIgKiBwMSArIHAwICsgcTEgKyAyKSA+PiAyOwotICAgICAgICAgICAgZGF0YVsgMF0gPSAoMiAqIHExICsgcTAgKyBwMSArIDIpID4+IDI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBGaWx0ZXJIb3JDaHJvbWFFZGdlCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZpbHRlciBvbmUgaG9yaXpvbnRhbCAyLXBpeGVsIGNocm9tYSBlZGdlCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIEZpbHRlckhvckNocm9tYUVkZ2UoCi0gIHU4ICpkYXRhLAotICB1MzIgYlMsCi0gIGVkZ2VUaHJlc2hvbGRfdCAqdGhyZXNob2xkcywKLSAgaTMyIHdpZHRoKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIGkzMiBkZWx0YSwgdGM7Ci0gICAgdTMyIGk7Ci0gICAgdTggcDAsIHEwLCBwMSwgcTE7Ci0gICAgY29uc3QgdTggKmNscCA9IGgyNjRic2RDbGlwICsgNTEyOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoZGF0YSk7Ci0gICAgQVNTRVJUKGJTIDwgNCk7Ci0gICAgQVNTRVJUKHRocmVzaG9sZHMpOwotCi0gICAgdGMgPSB0aHJlc2hvbGRzLT50YzBbYlMtMV0gKyAxOwotICAgIGZvciAoaSA9IDI7IGk7IGktLSwgZGF0YSsrKQotICAgIHsKLSAgICAgICAgcDEgPSBkYXRhWy13aWR0aCoyXTsgcDAgPSBkYXRhWy13aWR0aF07Ci0gICAgICAgIHEwID0gZGF0YVswXTsgcTEgPSBkYXRhW3dpZHRoXTsKLSAgICAgICAgaWYgKCAoKHVuc2lnbmVkKUFCUyhwMC1xMCkgPCB0aHJlc2hvbGRzLT5hbHBoYSkgJiYKLSAgICAgICAgICAgICAoKHVuc2lnbmVkKUFCUyhwMS1wMCkgPCB0aHJlc2hvbGRzLT5iZXRhKSAgJiYKLSAgICAgICAgICAgICAoKHVuc2lnbmVkKUFCUyhxMS1xMCkgPCB0aHJlc2hvbGRzLT5iZXRhKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRlbHRhID0gQ0xJUDMoLXRjLCB0YywgKCgoKHEwIC0gcDApIDw8IDIpICsKLSAgICAgICAgICAgICAgICAgICAgICAocDEgLSBxMSkgKyA0KSA+PiAzKSk7Ci0gICAgICAgICAgICBwMCA9IGNscFtwMCArIGRlbHRhXTsKLSAgICAgICAgICAgIHEwID0gY2xwW3EwIC0gZGVsdGFdOwotICAgICAgICAgICAgZGF0YVstd2lkdGhdID0gcDA7Ci0gICAgICAgICAgICBkYXRhWyAgMF0gPSBxMDsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBGaWx0ZXJIb3JDaHJvbWEKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRmlsdGVyIGFsbCBmb3VyIHN1Y2Nlc3NpdmUgaG9yaXpvbnRhbCAyLXBpeGVsIGNocm9tYSBlZGdlcy4gVGhpcwotICAgICAgICAgICAgY2FuIGJlIGRvbmUgaWYgYlMgaXMgZXF1YWwgZm9yIGFsbCBmb3VyIGVkZ2VzLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBGaWx0ZXJIb3JDaHJvbWEoCi0gIHU4ICpkYXRhLAotICB1MzIgYlMsCi0gIGVkZ2VUaHJlc2hvbGRfdCAqdGhyZXNob2xkcywKLSAgaTMyIHdpZHRoKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIGkzMiBkZWx0YSwgdGM7Ci0gICAgdTMyIGk7Ci0gICAgdTggcDAsIHEwLCBwMSwgcTE7Ci0gICAgY29uc3QgdTggKmNscCA9IGgyNjRic2RDbGlwICsgNTEyOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoZGF0YSk7Ci0gICAgQVNTRVJUKGJTIDw9IDQpOwotICAgIEFTU0VSVCh0aHJlc2hvbGRzKTsKLQotICAgIGlmIChiUyA8IDQpCi0gICAgewotICAgICAgICB0YyA9IHRocmVzaG9sZHMtPnRjMFtiUy0xXSArIDE7Ci0gICAgICAgIGZvciAoaSA9IDg7IGk7IGktLSwgZGF0YSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBwMSA9IGRhdGFbLXdpZHRoKjJdOyBwMCA9IGRhdGFbLXdpZHRoXTsKLSAgICAgICAgICAgIHEwID0gZGF0YVswXTsgcTEgPSBkYXRhW3dpZHRoXTsKLSAgICAgICAgICAgIGlmICggKCh1bnNpZ25lZClBQlMocDAtcTApIDwgdGhyZXNob2xkcy0+YWxwaGEpICYmCi0gICAgICAgICAgICAgICAgICgodW5zaWduZWQpQUJTKHAxLXAwKSA8IHRocmVzaG9sZHMtPmJldGEpICAmJgotICAgICAgICAgICAgICAgICAoKHVuc2lnbmVkKUFCUyhxMS1xMCkgPCB0aHJlc2hvbGRzLT5iZXRhKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZGVsdGEgPSBDTElQMygtdGMsIHRjLCAoKCgocTAgLSBwMCkgPDwgMikgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAocDEgLSBxMSkgKyA0KSA+PiAzKSk7Ci0gICAgICAgICAgICAgICAgcDAgPSBjbHBbcDAgKyBkZWx0YV07Ci0gICAgICAgICAgICAgICAgcTAgPSBjbHBbcTAgLSBkZWx0YV07Ci0gICAgICAgICAgICAgICAgZGF0YVstd2lkdGhdID0gcDA7Ci0gICAgICAgICAgICAgICAgZGF0YVsgIDBdID0gcTA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgZm9yIChpID0gODsgaTsgaS0tLCBkYXRhKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHAxID0gZGF0YVstd2lkdGgqMl07IHAwID0gZGF0YVstd2lkdGhdOwotICAgICAgICAgICAgcTAgPSBkYXRhWzBdOyBxMSA9IGRhdGFbd2lkdGhdOwotICAgICAgICAgICAgaWYgKCAoKHVuc2lnbmVkKUFCUyhwMC1xMCkgPCB0aHJlc2hvbGRzLT5hbHBoYSkgJiYKLSAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZClBQlMocDEtcDApIDwgdGhyZXNob2xkcy0+YmV0YSkgICYmCi0gICAgICAgICAgICAgICAgICgodW5zaWduZWQpQUJTKHExLXEwKSA8IHRocmVzaG9sZHMtPmJldGEpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZGF0YVstd2lkdGhdID0gKDIgKiBwMSArIHAwICsgcTEgKyAyKSA+PiAyOwotICAgICAgICAgICAgICAgICAgICBkYXRhWyAgMF0gPSAoMiAqIHExICsgcTAgKyBwMSArIDIpID4+IDI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEdldEJvdW5kYXJ5U3RyZW5ndGhzCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBib3VuZGFyeSBzdHJlbmd0aHMgZm9yIGFsbCBlZGdlcyBvZiBhCi0gICAgICAgICAgICBtYWNyb2Jsb2NrLiBGdW5jdGlvbiByZXR1cm5zIEhBTlRST19UUlVFIGlmIGFueSBvZiB0aGUgYlMgdmFsdWVzIGZvcgotICAgICAgICAgICAgdGhlIG1hY3JvYmxvY2sgaGFkIG5vbi16ZXJvIHZhbHVlLCBIQU5UUk9fRkFMU0Ugb3RoZXJ3aXNlLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdTMyIEdldEJvdW5kYXJ5U3RyZW5ndGhzKG1iU3RvcmFnZV90ICptYiwgYlNfdCAqYlMsIHUzMiBmbGFncykKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICAvKiB0aGlzIGZsYWcgaXMgc2V0IEhBTlRST19UUlVFIGFzIHNvb24gYXMgYW55IGJvdW5kYXJ5IHN0cmVuZ3RoIHZhbHVlIGlzCi0gICAgICogbm9uLXplcm8gKi8KLSAgICB1MzIgbm9uWmVyb0JzID0gSEFOVFJPX0ZBTFNFOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQobWIpOwotICAgIEFTU0VSVChiUyk7Ci0gICAgQVNTRVJUKGZsYWdzKTsKLQotICAgIC8qIHRvcCBlZGdlcyAqLwotICAgIGlmIChmbGFncyAmIEZJTFRFUl9UT1BfRURHRSkKLSAgICB7Ci0gICAgICAgIGlmIChJU19JTlRSQV9NQigqbWIpIHx8IElTX0lOVFJBX01CKCptYi0+bWJCKSkKLSAgICAgICAgewotICAgICAgICAgICAgYlNbMF0udG9wID0gYlNbMV0udG9wID0gYlNbMl0udG9wID0gYlNbM10udG9wID0gNDsKLSAgICAgICAgICAgIG5vblplcm9CcyA9IEhBTlRST19UUlVFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYlNbMF0udG9wID0gRWRnZUJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iLT5tYkIsIDAsIDEwKTsKLSAgICAgICAgICAgIGJTWzFdLnRvcCA9IEVkZ2VCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYi0+bWJCLCAxLCAxMSk7Ci0gICAgICAgICAgICBiU1syXS50b3AgPSBFZGdlQm91bmRhcnlTdHJlbmd0aChtYiwgbWItPm1iQiwgNCwgMTQpOwotICAgICAgICAgICAgYlNbM10udG9wID0gRWRnZUJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iLT5tYkIsIDUsIDE1KTsKLSAgICAgICAgICAgIGlmIChiU1swXS50b3AgfHwgYlNbMV0udG9wIHx8IGJTWzJdLnRvcCB8fCBiU1szXS50b3ApCi0gICAgICAgICAgICAgICAgbm9uWmVyb0JzID0gSEFOVFJPX1RSVUU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgYlNbMF0udG9wID0gYlNbMV0udG9wID0gYlNbMl0udG9wID0gYlNbM10udG9wID0gMDsKLSAgICB9Ci0KLSAgICAvKiBsZWZ0IGVkZ2VzICovCi0gICAgaWYgKGZsYWdzICYgRklMVEVSX0xFRlRfRURHRSkKLSAgICB7Ci0gICAgICAgIGlmIChJU19JTlRSQV9NQigqbWIpIHx8IElTX0lOVFJBX01CKCptYi0+bWJBKSkKLSAgICAgICAgewotICAgICAgICAgICAgYlNbMF0ubGVmdCA9IGJTWzRdLmxlZnQgPSBiU1s4XS5sZWZ0ID0gYlNbMTJdLmxlZnQgPSA0OwotICAgICAgICAgICAgbm9uWmVyb0JzID0gSEFOVFJPX1RSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBiU1swXS5sZWZ0ID0gRWRnZUJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iLT5tYkEsIDAsIDUpOwotICAgICAgICAgICAgYlNbNF0ubGVmdCA9IEVkZ2VCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYi0+bWJBLCAyLCA3KTsKLSAgICAgICAgICAgIGJTWzhdLmxlZnQgPSBFZGdlQm91bmRhcnlTdHJlbmd0aChtYiwgbWItPm1iQSwgOCwgMTMpOwotICAgICAgICAgICAgYlNbMTJdLmxlZnQgPSBFZGdlQm91bmRhcnlTdHJlbmd0aChtYiwgbWItPm1iQSwgMTAsIDE1KTsKLSAgICAgICAgICAgIGlmICghbm9uWmVyb0JzICYmCi0gICAgICAgICAgICAgICAgKGJTWzBdLmxlZnQgfHwgYlNbNF0ubGVmdCB8fCBiU1s4XS5sZWZ0IHx8IGJTWzEyXS5sZWZ0KSkKLSAgICAgICAgICAgICAgICBub25aZXJvQnMgPSBIQU5UUk9fVFJVRTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBiU1swXS5sZWZ0ID0gYlNbNF0ubGVmdCA9IGJTWzhdLmxlZnQgPSBiU1sxMl0ubGVmdCA9IDA7Ci0gICAgfQotCi0gICAgLyogaW5uZXIgZWRnZXMgKi8KLSAgICBpZiAoSVNfSU5UUkFfTUIoKm1iKSkKLSAgICB7Ci0gICAgICAgIGJTWzRdLnRvcCAgPSBiU1s1XS50b3AgID0gYlNbNl0udG9wICA9IGJTWzddLnRvcCAgPQotICAgICAgICBiU1s4XS50b3AgID0gYlNbOV0udG9wICA9IGJTWzEwXS50b3AgPSBiU1sxMV0udG9wID0KLSAgICAgICAgYlNbMTJdLnRvcCA9IGJTWzEzXS50b3AgPSBiU1sxNF0udG9wID0gYlNbMTVdLnRvcCA9IDM7Ci0KLSAgICAgICAgYlNbMV0ubGVmdCAgPSBiU1syXS5sZWZ0ICA9IGJTWzNdLmxlZnQgID0KLSAgICAgICAgYlNbNV0ubGVmdCAgPSBiU1s2XS5sZWZ0ICA9IGJTWzddLmxlZnQgID0KLSAgICAgICAgYlNbOV0ubGVmdCAgPSBiU1sxMF0ubGVmdCA9IGJTWzExXS5sZWZ0ID0KLSAgICAgICAgYlNbMTNdLmxlZnQgPSBiU1sxNF0ubGVmdCA9IGJTWzE1XS5sZWZ0ID0gMzsKLSAgICAgICAgbm9uWmVyb0JzID0gSEFOVFJPX1RSVUU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIDE2eDE2IGludGVyIG1iIC0+IHJlZiBhZGRyZXNzZXMgb3IgbW90aW9uIHZlY3RvcnMgY2Fubm90IGRpZmZlciwKLSAgICAgICAgICogb25seSBjaGVjayBpZiBlaXRoZXIgb2YgdGhlIGJsb2NrcyBjb250YWluIGNvZWZmaWNpZW50cyAqLwotICAgICAgICBpZiAoaDI2NGJzZE51bU1iUGFydChtYi0+bWJUeXBlKSA9PSAxKQotICAgICAgICB7Ci0gICAgICAgICAgICBiU1s0XS50b3AgPSBtYi0+dG90YWxDb2VmZlsyXSB8fCBtYi0+dG90YWxDb2VmZlswXSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbNV0udG9wID0gbWItPnRvdGFsQ29lZmZbM10gfHwgbWItPnRvdGFsQ29lZmZbMV0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzZdLnRvcCA9IG1iLT50b3RhbENvZWZmWzZdIHx8IG1iLT50b3RhbENvZWZmWzRdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1s3XS50b3AgPSBtYi0+dG90YWxDb2VmZls3XSB8fCBtYi0+dG90YWxDb2VmZls1XSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbOF0udG9wID0gbWItPnRvdGFsQ29lZmZbOF0gfHwgbWItPnRvdGFsQ29lZmZbMl0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzldLnRvcCA9IG1iLT50b3RhbENvZWZmWzldIHx8IG1iLT50b3RhbENvZWZmWzNdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1sxMF0udG9wID0gbWItPnRvdGFsQ29lZmZbMTJdIHx8IG1iLT50b3RhbENvZWZmWzZdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1sxMV0udG9wID0gbWItPnRvdGFsQ29lZmZbMTNdIHx8IG1iLT50b3RhbENvZWZmWzddID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1sxMl0udG9wID0gbWItPnRvdGFsQ29lZmZbMTBdIHx8IG1iLT50b3RhbENvZWZmWzhdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1sxM10udG9wID0gbWItPnRvdGFsQ29lZmZbMTFdIHx8IG1iLT50b3RhbENvZWZmWzldID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1sxNF0udG9wID0gbWItPnRvdGFsQ29lZmZbMTRdIHx8IG1iLT50b3RhbENvZWZmWzEyXSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbMTVdLnRvcCA9IG1iLT50b3RhbENvZWZmWzE1XSB8fCBtYi0+dG90YWxDb2VmZlsxM10gPyAyIDogMDsKLQotICAgICAgICAgICAgYlNbMV0ubGVmdCA9IG1iLT50b3RhbENvZWZmWzFdIHx8IG1iLT50b3RhbENvZWZmWzBdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1syXS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbNF0gfHwgbWItPnRvdGFsQ29lZmZbMV0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzNdLmxlZnQgPSBtYi0+dG90YWxDb2VmZls1XSB8fCBtYi0+dG90YWxDb2VmZls0XSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbNV0ubGVmdCA9IG1iLT50b3RhbENvZWZmWzNdIHx8IG1iLT50b3RhbENvZWZmWzJdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1s2XS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbNl0gfHwgbWItPnRvdGFsQ29lZmZbM10gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzddLmxlZnQgPSBtYi0+dG90YWxDb2VmZls3XSB8fCBtYi0+dG90YWxDb2VmZls2XSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbOV0ubGVmdCA9IG1iLT50b3RhbENvZWZmWzldIHx8IG1iLT50b3RhbENvZWZmWzhdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1sxMF0ubGVmdCA9IG1iLT50b3RhbENvZWZmWzEyXSB8fCBtYi0+dG90YWxDb2VmZls5XSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbMTFdLmxlZnQgPSBtYi0+dG90YWxDb2VmZlsxM10gfHwgbWItPnRvdGFsQ29lZmZbMTJdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1sxM10ubGVmdCA9IG1iLT50b3RhbENvZWZmWzExXSB8fCBtYi0+dG90YWxDb2VmZlsxMF0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzE0XS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbMTRdIHx8IG1iLT50b3RhbENvZWZmWzExXSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbMTVdLmxlZnQgPSBtYi0+dG90YWxDb2VmZlsxNV0gfHwgbWItPnRvdGFsQ29lZmZbMTRdID8gMiA6IDA7Ci0gICAgICAgIH0KLSAgICAgICAgLyogMTZ4OCBpbnRlciBtYiAtPiByZWYgYWRkcmVzc2VzIGFuZCBtb3Rpb24gdmVjdG9ycyBjYW4gYmUgZGlmZmVyZW50Ci0gICAgICAgICAqIG9ubHkgZm9yIHRoZSBtaWRkbGUgaG9yaXpvbnRhbCBlZGdlLCBmb3IgdGhlIG90aGVyIHRvcCBlZGdlcyBpdCBpcwotICAgICAgICAgKiBlbm91Z2ggdG8gY2hlY2sgd2hldGhlciB0aGUgYmxvY2tzIGNvbnRhaW4gY29lZmZpY2llbnRzIG9yIG5vdC4gVGhlCi0gICAgICAgICAqIHNhbWUgYXBwbGllcyB0byBhbGwgaW50ZXJuYWwgbGVmdCBlZGdlcy4gKi8KLSAgICAgICAgZWxzZSBpZiAobWItPm1iVHlwZSA9PSBQX0wwX0wwXzE2eDgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJTWzRdLnRvcCA9IG1iLT50b3RhbENvZWZmWzJdIHx8IG1iLT50b3RhbENvZWZmWzBdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1s1XS50b3AgPSBtYi0+dG90YWxDb2VmZlszXSB8fCBtYi0+dG90YWxDb2VmZlsxXSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbNl0udG9wID0gbWItPnRvdGFsQ29lZmZbNl0gfHwgbWItPnRvdGFsQ29lZmZbNF0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzddLnRvcCA9IG1iLT50b3RhbENvZWZmWzddIHx8IG1iLT50b3RhbENvZWZmWzVdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1sxMl0udG9wID0gbWItPnRvdGFsQ29lZmZbMTBdIHx8IG1iLT50b3RhbENvZWZmWzhdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1sxM10udG9wID0gbWItPnRvdGFsQ29lZmZbMTFdIHx8IG1iLT50b3RhbENvZWZmWzldID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1sxNF0udG9wID0gbWItPnRvdGFsQ29lZmZbMTRdIHx8IG1iLT50b3RhbENvZWZmWzEyXSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbMTVdLnRvcCA9IG1iLT50b3RhbENvZWZmWzE1XSB8fCBtYi0+dG90YWxDb2VmZlsxM10gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzhdLnRvcCA9IElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgOCwgMik7Ci0gICAgICAgICAgICBiU1s5XS50b3AgPSBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIDksIDMpOwotICAgICAgICAgICAgYlNbMTBdLnRvcCA9IElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgMTIsIDYpOwotICAgICAgICAgICAgYlNbMTFdLnRvcCA9IElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgMTMsIDcpOwotCi0gICAgICAgICAgICBiU1sxXS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbMV0gfHwgbWItPnRvdGFsQ29lZmZbMF0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzJdLmxlZnQgPSBtYi0+dG90YWxDb2VmZls0XSB8fCBtYi0+dG90YWxDb2VmZlsxXSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbM10ubGVmdCA9IG1iLT50b3RhbENvZWZmWzVdIHx8IG1iLT50b3RhbENvZWZmWzRdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1s1XS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbM10gfHwgbWItPnRvdGFsQ29lZmZbMl0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzZdLmxlZnQgPSBtYi0+dG90YWxDb2VmZls2XSB8fCBtYi0+dG90YWxDb2VmZlszXSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbN10ubGVmdCA9IG1iLT50b3RhbENvZWZmWzddIHx8IG1iLT50b3RhbENvZWZmWzZdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1s5XS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbOV0gfHwgbWItPnRvdGFsQ29lZmZbOF0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzEwXS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbMTJdIHx8IG1iLT50b3RhbENvZWZmWzldID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1sxMV0ubGVmdCA9IG1iLT50b3RhbENvZWZmWzEzXSB8fCBtYi0+dG90YWxDb2VmZlsxMl0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzEzXS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbMTFdIHx8IG1iLT50b3RhbENvZWZmWzEwXSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbMTRdLmxlZnQgPSBtYi0+dG90YWxDb2VmZlsxNF0gfHwgbWItPnRvdGFsQ29lZmZbMTFdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1sxNV0ubGVmdCA9IG1iLT50b3RhbENvZWZmWzE1XSB8fCBtYi0+dG90YWxDb2VmZlsxNF0gPyAyIDogMDsKLSAgICAgICAgfQotICAgICAgICAvKiA4eDE2IGludGVyIG1iIC0+IHJlZiBhZGRyZXNzZXMgYW5kIG1vdGlvbiB2ZWN0b3JzIGNhbiBiZSBkaWZmZXJlbnQKLSAgICAgICAgICogb25seSBmb3IgdGhlIG1pZGRsZSB2ZXJ0aWNhbCBlZGdlLCBmb3IgdGhlIG90aGVyIGxlZnQgZWRnZXMgaXQgaXMKLSAgICAgICAgICogZW5vdWdoIHRvIGNoZWNrIHdoZXRoZXIgdGhlIGJsb2NrcyBjb250YWluIGNvZWZmaWNpZW50cyBvciBub3QuIFRoZQotICAgICAgICAgKiBzYW1lIGFwcGxpZXMgdG8gYWxsIGludGVybmFsIHRvcCBlZGdlcy4gKi8KLSAgICAgICAgZWxzZSBpZiAobWItPm1iVHlwZSA9PSBQX0wwX0wwXzh4MTYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJTWzRdLnRvcCA9IG1iLT50b3RhbENvZWZmWzJdIHx8IG1iLT50b3RhbENvZWZmWzBdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1s1XS50b3AgPSBtYi0+dG90YWxDb2VmZlszXSB8fCBtYi0+dG90YWxDb2VmZlsxXSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbNl0udG9wID0gbWItPnRvdGFsQ29lZmZbNl0gfHwgbWItPnRvdGFsQ29lZmZbNF0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzddLnRvcCA9IG1iLT50b3RhbENvZWZmWzddIHx8IG1iLT50b3RhbENvZWZmWzVdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1s4XS50b3AgPSBtYi0+dG90YWxDb2VmZls4XSB8fCBtYi0+dG90YWxDb2VmZlsyXSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbOV0udG9wID0gbWItPnRvdGFsQ29lZmZbOV0gfHwgbWItPnRvdGFsQ29lZmZbM10gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzEwXS50b3AgPSBtYi0+dG90YWxDb2VmZlsxMl0gfHwgbWItPnRvdGFsQ29lZmZbNl0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzExXS50b3AgPSBtYi0+dG90YWxDb2VmZlsxM10gfHwgbWItPnRvdGFsQ29lZmZbN10gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzEyXS50b3AgPSBtYi0+dG90YWxDb2VmZlsxMF0gfHwgbWItPnRvdGFsQ29lZmZbOF0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzEzXS50b3AgPSBtYi0+dG90YWxDb2VmZlsxMV0gfHwgbWItPnRvdGFsQ29lZmZbOV0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzE0XS50b3AgPSBtYi0+dG90YWxDb2VmZlsxNF0gfHwgbWItPnRvdGFsQ29lZmZbMTJdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1sxNV0udG9wID0gbWItPnRvdGFsQ29lZmZbMTVdIHx8IG1iLT50b3RhbENvZWZmWzEzXSA/IDIgOiAwOwotCi0gICAgICAgICAgICBiU1sxXS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbMV0gfHwgbWItPnRvdGFsQ29lZmZbMF0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzNdLmxlZnQgPSBtYi0+dG90YWxDb2VmZls1XSB8fCBtYi0+dG90YWxDb2VmZls0XSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbNV0ubGVmdCA9IG1iLT50b3RhbENvZWZmWzNdIHx8IG1iLT50b3RhbENvZWZmWzJdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1s3XS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbN10gfHwgbWItPnRvdGFsQ29lZmZbNl0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzldLmxlZnQgPSBtYi0+dG90YWxDb2VmZls5XSB8fCBtYi0+dG90YWxDb2VmZls4XSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbMTFdLmxlZnQgPSBtYi0+dG90YWxDb2VmZlsxM10gfHwgbWItPnRvdGFsQ29lZmZbMTJdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1sxM10ubGVmdCA9IG1iLT50b3RhbENvZWZmWzExXSB8fCBtYi0+dG90YWxDb2VmZlsxMF0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzE1XS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbMTVdIHx8IG1iLT50b3RhbENvZWZmWzE0XSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbMl0ubGVmdCA9IElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgNCwgMSk7Ci0gICAgICAgICAgICBiU1s2XS5sZWZ0ID0gSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCA2LCAzKTsKLSAgICAgICAgICAgIGJTWzEwXS5sZWZ0ID0gSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCAxMiwgOSk7Ci0gICAgICAgICAgICBiU1sxNF0ubGVmdCA9IElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgMTQsIDExKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJTWzRdLnRvcCA9Ci0gICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzRdLCBtYjR4NEluZGV4WzBdKTsKLSAgICAgICAgICAgIGJTWzVdLnRvcCA9Ci0gICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzVdLCBtYjR4NEluZGV4WzFdKTsKLSAgICAgICAgICAgIGJTWzZdLnRvcCA9Ci0gICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzZdLCBtYjR4NEluZGV4WzJdKTsKLSAgICAgICAgICAgIGJTWzddLnRvcCA9Ci0gICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzddLCBtYjR4NEluZGV4WzNdKTsKLSAgICAgICAgICAgIGJTWzhdLnRvcCA9Ci0gICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzhdLCBtYjR4NEluZGV4WzRdKTsKLSAgICAgICAgICAgIGJTWzldLnRvcCA9Ci0gICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzldLCBtYjR4NEluZGV4WzVdKTsKLSAgICAgICAgICAgIGJTWzEwXS50b3AgPQotICAgICAgICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgbWI0eDRJbmRleFsxMF0sIG1iNHg0SW5kZXhbNl0pOwotICAgICAgICAgICAgYlNbMTFdLnRvcCA9Ci0gICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzExXSwgbWI0eDRJbmRleFs3XSk7Ci0gICAgICAgICAgICBiU1sxMl0udG9wID0KLSAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbMTJdLCBtYjR4NEluZGV4WzhdKTsKLSAgICAgICAgICAgIGJTWzEzXS50b3AgPQotICAgICAgICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgbWI0eDRJbmRleFsxM10sIG1iNHg0SW5kZXhbOV0pOwotICAgICAgICAgICAgYlNbMTRdLnRvcCA9Ci0gICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzE0XSwgbWI0eDRJbmRleFsxMF0pOwotICAgICAgICAgICAgYlNbMTVdLnRvcCA9Ci0gICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzE1XSwgbWI0eDRJbmRleFsxMV0pOwotCi0gICAgICAgICAgICBiU1sxXS5sZWZ0ID0KLSAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbMV0sIG1iNHg0SW5kZXhbMF0pOwotICAgICAgICAgICAgYlNbMl0ubGVmdCA9Ci0gICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzJdLCBtYjR4NEluZGV4WzFdKTsKLSAgICAgICAgICAgIGJTWzNdLmxlZnQgPQotICAgICAgICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgbWI0eDRJbmRleFszXSwgbWI0eDRJbmRleFsyXSk7Ci0gICAgICAgICAgICBiU1s1XS5sZWZ0ID0KLSAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbNV0sIG1iNHg0SW5kZXhbNF0pOwotICAgICAgICAgICAgYlNbNl0ubGVmdCA9Ci0gICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzZdLCBtYjR4NEluZGV4WzVdKTsKLSAgICAgICAgICAgIGJTWzddLmxlZnQgPQotICAgICAgICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgbWI0eDRJbmRleFs3XSwgbWI0eDRJbmRleFs2XSk7Ci0gICAgICAgICAgICBiU1s5XS5sZWZ0ID0KLSAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbOV0sIG1iNHg0SW5kZXhbOF0pOwotICAgICAgICAgICAgYlNbMTBdLmxlZnQgPQotICAgICAgICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgbWI0eDRJbmRleFsxMF0sIG1iNHg0SW5kZXhbOV0pOwotICAgICAgICAgICAgYlNbMTFdLmxlZnQgPQotICAgICAgICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgbWI0eDRJbmRleFsxMV0sIG1iNHg0SW5kZXhbMTBdKTsKLSAgICAgICAgICAgIGJTWzEzXS5sZWZ0ID0KLSAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbMTNdLCBtYjR4NEluZGV4WzEyXSk7Ci0gICAgICAgICAgICBiU1sxNF0ubGVmdCA9Ci0gICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzE0XSwgbWI0eDRJbmRleFsxM10pOwotICAgICAgICAgICAgYlNbMTVdLmxlZnQgPQotICAgICAgICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgbWI0eDRJbmRleFsxNV0sIG1iNHg0SW5kZXhbMTRdKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIW5vblplcm9CcyAmJgotICAgICAgICAgICAgKGJTWzRdLnRvcCB8fCBiU1s1XS50b3AgfHwgYlNbNl0udG9wIHx8IGJTWzddLnRvcCB8fAotICAgICAgICAgICAgIGJTWzhdLnRvcCB8fCBiU1s5XS50b3AgfHwgYlNbMTBdLnRvcCB8fCBiU1sxMV0udG9wIHx8Ci0gICAgICAgICAgICAgYlNbMTJdLnRvcCB8fCBiU1sxM10udG9wIHx8IGJTWzE0XS50b3AgfHwgYlNbMTVdLnRvcCB8fAotICAgICAgICAgICAgIGJTWzFdLmxlZnQgfHwgYlNbMl0ubGVmdCB8fCBiU1szXS5sZWZ0IHx8Ci0gICAgICAgICAgICAgYlNbNV0ubGVmdCB8fCBiU1s2XS5sZWZ0IHx8IGJTWzddLmxlZnQgfHwKLSAgICAgICAgICAgICBiU1s5XS5sZWZ0IHx8IGJTWzEwXS5sZWZ0IHx8IGJTWzExXS5sZWZ0IHx8Ci0gICAgICAgICAgICAgYlNbMTNdLmxlZnQgfHwgYlNbMTRdLmxlZnQgfHwgYlNbMTVdLmxlZnQpKQotICAgICAgICAgICAgbm9uWmVyb0JzID0gSEFOVFJPX1RSVUU7Ci0gICAgfQotCi0gICAgcmV0dXJuKG5vblplcm9Ccyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBHZXRMdW1hRWRnZVRocmVzaG9sZHMKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgQ29tcHV0ZSBhbHBoYSwgYmV0YSBhbmQgdGMwIHRocmVzaG9sZHMgZm9yIGlubmVyLCBsZWZ0IGFuZCB0b3AKLSAgICAgICAgICAgIGx1bWEgZWRnZXMgb2YgYSBtYWNyb2Jsb2NrLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBHZXRMdW1hRWRnZVRocmVzaG9sZHMoCi0gIGVkZ2VUaHJlc2hvbGRfdCAqdGhyZXNob2xkcywKLSAgbWJTdG9yYWdlX3QgKm1iLAotICB1MzIgZmlsdGVyaW5nRmxhZ3MpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGluZGV4QSwgaW5kZXhCOwotICAgIHUzMiBxcEF2LCBxcCwgcXBUbXA7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVCh0aHJlc2hvbGRzKTsKLSAgICBBU1NFUlQobWIpOwotCi0gICAgcXAgPSBtYi0+cXBZOwotCi0gICAgaW5kZXhBID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcCArIG1iLT5maWx0ZXJPZmZzZXRBKTsKLSAgICBpbmRleEIgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwICsgbWItPmZpbHRlck9mZnNldEIpOwotCi0gICAgdGhyZXNob2xkc1tJTk5FUl0uYWxwaGEgPSBhbHBoYXNbaW5kZXhBXTsKLSAgICB0aHJlc2hvbGRzW0lOTkVSXS5iZXRhID0gYmV0YXNbaW5kZXhCXTsKLSAgICB0aHJlc2hvbGRzW0lOTkVSXS50YzAgPSB0YzBbaW5kZXhBXTsKLQotICAgIGlmIChmaWx0ZXJpbmdGbGFncyAmIEZJTFRFUl9UT1BfRURHRSkKLSAgICB7Ci0gICAgICAgIHFwVG1wID0gbWItPm1iQi0+cXBZOwotICAgICAgICBpZiAocXBUbXAgIT0gcXApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHFwQXYgPSAocXAgKyBxcFRtcCArIDEpID4+IDE7Ci0KLSAgICAgICAgICAgIGluZGV4QSA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXBBdiArIG1iLT5maWx0ZXJPZmZzZXRBKTsKLSAgICAgICAgICAgIGluZGV4QiA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXBBdiArIG1iLT5maWx0ZXJPZmZzZXRCKTsKLQotICAgICAgICAgICAgdGhyZXNob2xkc1tUT1BdLmFscGhhID0gYWxwaGFzW2luZGV4QV07Ci0gICAgICAgICAgICB0aHJlc2hvbGRzW1RPUF0uYmV0YSA9IGJldGFzW2luZGV4Ql07Ci0gICAgICAgICAgICB0aHJlc2hvbGRzW1RPUF0udGMwID0gdGMwW2luZGV4QV07Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJlc2hvbGRzW1RPUF0uYWxwaGEgPSB0aHJlc2hvbGRzW0lOTkVSXS5hbHBoYTsKLSAgICAgICAgICAgIHRocmVzaG9sZHNbVE9QXS5iZXRhID0gdGhyZXNob2xkc1tJTk5FUl0uYmV0YTsKLSAgICAgICAgICAgIHRocmVzaG9sZHNbVE9QXS50YzAgPSB0aHJlc2hvbGRzW0lOTkVSXS50YzA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGZpbHRlcmluZ0ZsYWdzICYgRklMVEVSX0xFRlRfRURHRSkKLSAgICB7Ci0gICAgICAgIHFwVG1wID0gbWItPm1iQS0+cXBZOwotICAgICAgICBpZiAocXBUbXAgIT0gcXApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHFwQXYgPSAocXAgKyBxcFRtcCArIDEpID4+IDE7Ci0KLSAgICAgICAgICAgIGluZGV4QSA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXBBdiArIG1iLT5maWx0ZXJPZmZzZXRBKTsKLSAgICAgICAgICAgIGluZGV4QiA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXBBdiArIG1iLT5maWx0ZXJPZmZzZXRCKTsKLQotICAgICAgICAgICAgdGhyZXNob2xkc1tMRUZUXS5hbHBoYSA9IGFscGhhc1tpbmRleEFdOwotICAgICAgICAgICAgdGhyZXNob2xkc1tMRUZUXS5iZXRhID0gYmV0YXNbaW5kZXhCXTsKLSAgICAgICAgICAgIHRocmVzaG9sZHNbTEVGVF0udGMwID0gdGMwW2luZGV4QV07Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJlc2hvbGRzW0xFRlRdLmFscGhhID0gdGhyZXNob2xkc1tJTk5FUl0uYWxwaGE7Ci0gICAgICAgICAgICB0aHJlc2hvbGRzW0xFRlRdLmJldGEgPSB0aHJlc2hvbGRzW0lOTkVSXS5iZXRhOwotICAgICAgICAgICAgdGhyZXNob2xkc1tMRUZUXS50YzAgPSB0aHJlc2hvbGRzW0lOTkVSXS50YzA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBHZXRDaHJvbWFFZGdlVGhyZXNob2xkcwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBDb21wdXRlIGFscGhhLCBiZXRhIGFuZCB0YzAgdGhyZXNob2xkcyBmb3IgaW5uZXIsIGxlZnQgYW5kIHRvcAotICAgICAgICAgICAgY2hyb21hIGVkZ2VzIG9mIGEgbWFjcm9ibG9jay4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgR2V0Q2hyb21hRWRnZVRocmVzaG9sZHMoCi0gIGVkZ2VUaHJlc2hvbGRfdCAqdGhyZXNob2xkcywKLSAgbWJTdG9yYWdlX3QgKm1iLAotICB1MzIgZmlsdGVyaW5nRmxhZ3MsCi0gIGkzMiBjaHJvbWFRcEluZGV4T2Zmc2V0KQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpbmRleEEsIGluZGV4QjsKLSAgICB1MzIgcXBBdiwgcXAsIHFwVG1wOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQodGhyZXNob2xkcyk7Ci0gICAgQVNTRVJUKG1iKTsKLQotICAgIHFwID0gbWItPnFwWTsKLSAgICBxcCA9IGgyNjRic2RRcENbQ0xJUDMoMCwgNTEsIChpMzIpcXAgKyBjaHJvbWFRcEluZGV4T2Zmc2V0KV07Ci0KLSAgICBpbmRleEEgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwICsgbWItPmZpbHRlck9mZnNldEEpOwotICAgIGluZGV4QiA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXAgKyBtYi0+ZmlsdGVyT2Zmc2V0Qik7Ci0KLSAgICB0aHJlc2hvbGRzW0lOTkVSXS5hbHBoYSA9IGFscGhhc1tpbmRleEFdOwotICAgIHRocmVzaG9sZHNbSU5ORVJdLmJldGEgPSBiZXRhc1tpbmRleEJdOwotICAgIHRocmVzaG9sZHNbSU5ORVJdLnRjMCA9IHRjMFtpbmRleEFdOwotCi0gICAgaWYgKGZpbHRlcmluZ0ZsYWdzICYgRklMVEVSX1RPUF9FREdFKQotICAgIHsKLSAgICAgICAgcXBUbXAgPSBtYi0+bWJCLT5xcFk7Ci0gICAgICAgIGlmIChxcFRtcCAhPSBtYi0+cXBZKQotICAgICAgICB7Ci0gICAgICAgICAgICBxcFRtcCA9IGgyNjRic2RRcENbQ0xJUDMoMCwgNTEsIChpMzIpcXBUbXAgKyBjaHJvbWFRcEluZGV4T2Zmc2V0KV07Ci0gICAgICAgICAgICBxcEF2ID0gKHFwICsgcXBUbXAgKyAxKSA+PiAxOwotCi0gICAgICAgICAgICBpbmRleEEgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwQXYgKyBtYi0+ZmlsdGVyT2Zmc2V0QSk7Ci0gICAgICAgICAgICBpbmRleEIgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwQXYgKyBtYi0+ZmlsdGVyT2Zmc2V0Qik7Ci0KLSAgICAgICAgICAgIHRocmVzaG9sZHNbVE9QXS5hbHBoYSA9IGFscGhhc1tpbmRleEFdOwotICAgICAgICAgICAgdGhyZXNob2xkc1tUT1BdLmJldGEgPSBiZXRhc1tpbmRleEJdOwotICAgICAgICAgICAgdGhyZXNob2xkc1tUT1BdLnRjMCA9IHRjMFtpbmRleEFdOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdGhyZXNob2xkc1tUT1BdLmFscGhhID0gdGhyZXNob2xkc1tJTk5FUl0uYWxwaGE7Ci0gICAgICAgICAgICB0aHJlc2hvbGRzW1RPUF0uYmV0YSA9IHRocmVzaG9sZHNbSU5ORVJdLmJldGE7Ci0gICAgICAgICAgICB0aHJlc2hvbGRzW1RPUF0udGMwID0gdGhyZXNob2xkc1tJTk5FUl0udGMwOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChmaWx0ZXJpbmdGbGFncyAmIEZJTFRFUl9MRUZUX0VER0UpCi0gICAgewotICAgICAgICBxcFRtcCA9IG1iLT5tYkEtPnFwWTsKLSAgICAgICAgaWYgKHFwVG1wICE9IG1iLT5xcFkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHFwVG1wID0gaDI2NGJzZFFwQ1tDTElQMygwLCA1MSwgKGkzMilxcFRtcCArIGNocm9tYVFwSW5kZXhPZmZzZXQpXTsKLSAgICAgICAgICAgIHFwQXYgPSAocXAgKyBxcFRtcCArIDEpID4+IDE7Ci0KLSAgICAgICAgICAgIGluZGV4QSA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXBBdiArIG1iLT5maWx0ZXJPZmZzZXRBKTsKLSAgICAgICAgICAgIGluZGV4QiA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXBBdiArIG1iLT5maWx0ZXJPZmZzZXRCKTsKLQotICAgICAgICAgICAgdGhyZXNob2xkc1tMRUZUXS5hbHBoYSA9IGFscGhhc1tpbmRleEFdOwotICAgICAgICAgICAgdGhyZXNob2xkc1tMRUZUXS5iZXRhID0gYmV0YXNbaW5kZXhCXTsKLSAgICAgICAgICAgIHRocmVzaG9sZHNbTEVGVF0udGMwID0gdGMwW2luZGV4QV07Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJlc2hvbGRzW0xFRlRdLmFscGhhID0gdGhyZXNob2xkc1tJTk5FUl0uYWxwaGE7Ci0gICAgICAgICAgICB0aHJlc2hvbGRzW0xFRlRdLmJldGEgPSB0aHJlc2hvbGRzW0lOTkVSXS5iZXRhOwotICAgICAgICAgICAgdGhyZXNob2xkc1tMRUZUXS50YzAgPSB0aHJlc2hvbGRzW0lOTkVSXS50YzA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBGaWx0ZXJMdW1hCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGZpbHRlciBhbGwgbHVtYSBlZGdlcyBvZiBhIG1hY3JvYmxvY2sKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgRmlsdGVyTHVtYSgKLSAgdTggKmRhdGEsCi0gIGJTX3QgKmJTLAotICBlZGdlVGhyZXNob2xkX3QgKnRocmVzaG9sZHMsCi0gIHUzMiB3aWR0aCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdmJsb2NrOwotICAgIGJTX3QgKnRtcDsKLSAgICB1OCAqcHRyOwotICAgIHUzMiBvZmZzZXQ7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChkYXRhKTsKLSAgICBBU1NFUlQoYlMpOwotICAgIEFTU0VSVCh0aHJlc2hvbGRzKTsKLQotICAgIHB0ciA9IGRhdGE7Ci0gICAgdG1wID0gYlM7Ci0KLSAgICBvZmZzZXQgID0gVE9QOwotCi0gICAgLyogbG9vcCBibG9jayByb3dzLCBwZXJmb3JtIGZpbHRlcmluZyBmb3IgYWxsIHZlcnRpY2FsIGVkZ2VzIG9mIHRoZSBibG9jawotICAgICAqIHJvdyBmaXJzdCwgdGhlbiBmaWx0ZXIgZWFjaCBob3Jpem9udGFsIGVkZ2Ugb2YgdGhlIHJvdyAqLwotICAgIGZvciAodmJsb2NrID0gNDsgdmJsb2NrLS07KQotICAgIHsKLSAgICAgICAgLyogb25seSBwZXJmb3JtIGZpbHRlcmluZyBpZiBiUyBpcyBub24temVybywgZmlyc3Qgb2YgdGhlIGZvdXIKLSAgICAgICAgICogRmlsdGVyVmVyTHVtYUVkZ2UgaGFuZGxlcyB0aGUgbGVmdCBlZGdlIG9mIHRoZSBtYWNyb2Jsb2NrLCBvdGhlcnMKLSAgICAgICAgICogZmlsdGVyIGlubmVyIGVkZ2VzICovCi0gICAgICAgIGlmICh0bXBbMF0ubGVmdCkKLSAgICAgICAgICAgIEZpbHRlclZlckx1bWFFZGdlKHB0ciwgdG1wWzBdLmxlZnQsIHRocmVzaG9sZHMgKyBMRUZULCB3aWR0aCk7Ci0gICAgICAgIGlmICh0bXBbMV0ubGVmdCkKLSAgICAgICAgICAgIEZpbHRlclZlckx1bWFFZGdlKHB0cis0LCB0bXBbMV0ubGVmdCwgdGhyZXNob2xkcyArIElOTkVSLCB3aWR0aCk7Ci0gICAgICAgIGlmICh0bXBbMl0ubGVmdCkKLSAgICAgICAgICAgIEZpbHRlclZlckx1bWFFZGdlKHB0cis4LCB0bXBbMl0ubGVmdCwgdGhyZXNob2xkcyArIElOTkVSLCB3aWR0aCk7Ci0gICAgICAgIGlmICh0bXBbM10ubGVmdCkKLSAgICAgICAgICAgIEZpbHRlclZlckx1bWFFZGdlKHB0cisxMiwgdG1wWzNdLmxlZnQsIHRocmVzaG9sZHMgKyBJTk5FUiwgd2lkdGgpOwotCi0gICAgICAgIC8qIGlmIGJTIGlzIGVxdWFsIGZvciBhbGwgaG9yaXpvbnRhbCBlZGdlcyBvZiB0aGUgcm93IC0+IHBlcmZvcm0KLSAgICAgICAgICogZmlsdGVyaW5nIHdpdGggRmlsdGVySG9yTHVtYSwgb3RoZXJ3aXNlIHVzZSBGaWx0ZXJIb3JMdW1hRWRnZSBmb3IKLSAgICAgICAgICogZWFjaCBlZGdlIHNlcGFyYXRlbHkuIG9mZnNldCB2YXJpYWJsZSBpbmRpY2F0ZXMgdG9wIG1hY3JvYmxvY2sgZWRnZQotICAgICAgICAgKiBvbiB0aGUgZmlyc3QgbG9vcCByb3VuZCwgaW5uZXIgZWRnZSBmb3IgdGhlIG90aGVyIHJvdW5kcyAqLwotICAgICAgICBpZiAodG1wWzBdLnRvcCA9PSB0bXBbMV0udG9wICYmIHRtcFsxXS50b3AgPT0gdG1wWzJdLnRvcCAmJgotICAgICAgICAgICAgdG1wWzJdLnRvcCA9PSB0bXBbM10udG9wKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZih0bXBbMF0udG9wKQotICAgICAgICAgICAgICAgIEZpbHRlckhvckx1bWEocHRyLCB0bXBbMF0udG9wLCB0aHJlc2hvbGRzICsgb2Zmc2V0LCAoaTMyKXdpZHRoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHRtcFswXS50b3ApCi0gICAgICAgICAgICAgICAgRmlsdGVySG9yTHVtYUVkZ2UocHRyLCB0bXBbMF0udG9wLCB0aHJlc2hvbGRzK29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgKGkzMil3aWR0aCk7Ci0gICAgICAgICAgICBpZih0bXBbMV0udG9wKQotICAgICAgICAgICAgICAgIEZpbHRlckhvckx1bWFFZGdlKHB0cis0LCB0bXBbMV0udG9wLCB0aHJlc2hvbGRzK29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgKGkzMil3aWR0aCk7Ci0gICAgICAgICAgICBpZih0bXBbMl0udG9wKQotICAgICAgICAgICAgICAgIEZpbHRlckhvckx1bWFFZGdlKHB0cis4LCB0bXBbMl0udG9wLCB0aHJlc2hvbGRzK29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgKGkzMil3aWR0aCk7Ci0gICAgICAgICAgICBpZih0bXBbM10udG9wKQotICAgICAgICAgICAgICAgIEZpbHRlckhvckx1bWFFZGdlKHB0cisxMiwgdG1wWzNdLnRvcCwgdGhyZXNob2xkcytvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgIChpMzIpd2lkdGgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogZm91ciBwaXhlbCByb3dzIGFoZWFkLCBpLmUuIG5leHQgcm93IG9mIDR4NC1ibG9ja3MgKi8KLSAgICAgICAgcHRyICs9IHdpZHRoKjQ7Ci0gICAgICAgIHRtcCArPSA0OwotICAgICAgICBvZmZzZXQgPSBJTk5FUjsKLSAgICB9Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRmlsdGVyQ2hyb21hCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGZpbHRlciBhbGwgY2hyb21hIGVkZ2VzIG9mIGEgbWFjcm9ibG9jawotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBGaWx0ZXJDaHJvbWEoCi0gIHU4ICpkYXRhQ2IsCi0gIHU4ICpkYXRhQ3IsCi0gIGJTX3QgKmJTLAotICBlZGdlVGhyZXNob2xkX3QgKnRocmVzaG9sZHMsCi0gIHUzMiB3aWR0aCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdmJsb2NrOwotICAgIGJTX3QgKnRtcDsKLSAgICB1MzIgb2Zmc2V0OwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoZGF0YUNiKTsKLSAgICBBU1NFUlQoZGF0YUNyKTsKLSAgICBBU1NFUlQoYlMpOwotICAgIEFTU0VSVCh0aHJlc2hvbGRzKTsKLQotICAgIHRtcCA9IGJTOwotICAgIG9mZnNldCA9IFRPUDsKLQotICAgIC8qIGxvb3AgYmxvY2sgcm93cywgcGVyZm9ybSBmaWx0ZXJpbmcgZm9yIGFsbCB2ZXJ0aWNhbCBlZGdlcyBvZiB0aGUgYmxvY2sKLSAgICAgKiByb3cgZmlyc3QsIHRoZW4gZmlsdGVyIGVhY2ggaG9yaXpvbnRhbCBlZGdlIG9mIHRoZSByb3cgKi8KLSAgICBmb3IgKHZibG9jayA9IDA7IHZibG9jayA8IDI7IHZibG9jaysrKQotICAgIHsKLSAgICAgICAgLyogb25seSBwZXJmb3JtIGZpbHRlcmluZyBpZiBiUyBpcyBub24temVybywgZmlyc3QgdHdvIG9mIHRoZSBmb3VyCi0gICAgICAgICAqIEZpbHRlclZlckNocm9tYUVkZ2UgY2FsbHMgaGFuZGxlIHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIG1hY3JvYmxvY2ssCi0gICAgICAgICAqIG90aGVycyBmaWx0ZXIgdGhlIGlubmVyIGVkZ2UuIE5vdGUgdGhhdCBhcyBjaHJvbWEgdXNlcyBiUyB2YWx1ZXMKLSAgICAgICAgICogZGV0ZXJtaW5lZCBmb3IgbHVtYSBlZGdlcywgZWFjaCBiUyBpcyB1c2VkIG9ubHkgZm9yIDIgcGl4ZWxzIG9mCi0gICAgICAgICAqIGEgNC1waXhlbCBlZGdlICovCi0gICAgICAgIGlmICh0bXBbMF0ubGVmdCkKLSAgICAgICAgewotICAgICAgICAgICAgRmlsdGVyVmVyQ2hyb21hRWRnZShkYXRhQ2IsIHRtcFswXS5sZWZ0LCB0aHJlc2hvbGRzICsgTEVGVCwgd2lkdGgpOwotICAgICAgICAgICAgRmlsdGVyVmVyQ2hyb21hRWRnZShkYXRhQ3IsIHRtcFswXS5sZWZ0LCB0aHJlc2hvbGRzICsgTEVGVCwgd2lkdGgpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0bXBbNF0ubGVmdCkKLSAgICAgICAgewotICAgICAgICAgICAgRmlsdGVyVmVyQ2hyb21hRWRnZShkYXRhQ2IrMip3aWR0aCwgdG1wWzRdLmxlZnQsIHRocmVzaG9sZHMgKyBMRUZULAotICAgICAgICAgICAgICAgIHdpZHRoKTsKLSAgICAgICAgICAgIEZpbHRlclZlckNocm9tYUVkZ2UoZGF0YUNyKzIqd2lkdGgsIHRtcFs0XS5sZWZ0LCB0aHJlc2hvbGRzICsgTEVGVCwKLSAgICAgICAgICAgICAgICB3aWR0aCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRtcFsyXS5sZWZ0KQotICAgICAgICB7Ci0gICAgICAgICAgICBGaWx0ZXJWZXJDaHJvbWFFZGdlKGRhdGFDYis0LCB0bXBbMl0ubGVmdCwgdGhyZXNob2xkcyArIElOTkVSLAotICAgICAgICAgICAgICAgIHdpZHRoKTsKLSAgICAgICAgICAgIEZpbHRlclZlckNocm9tYUVkZ2UoZGF0YUNyKzQsIHRtcFsyXS5sZWZ0LCB0aHJlc2hvbGRzICsgSU5ORVIsCi0gICAgICAgICAgICAgICAgd2lkdGgpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0bXBbNl0ubGVmdCkKLSAgICAgICAgewotICAgICAgICAgICAgRmlsdGVyVmVyQ2hyb21hRWRnZShkYXRhQ2IrMip3aWR0aCs0LCB0bXBbNl0ubGVmdCwKLSAgICAgICAgICAgICAgICB0aHJlc2hvbGRzICsgSU5ORVIsIHdpZHRoKTsKLSAgICAgICAgICAgIEZpbHRlclZlckNocm9tYUVkZ2UoZGF0YUNyKzIqd2lkdGgrNCwgdG1wWzZdLmxlZnQsCi0gICAgICAgICAgICAgICAgdGhyZXNob2xkcyArIElOTkVSLCB3aWR0aCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBpZiBiUyBpcyBlcXVhbCBmb3IgYWxsIGhvcml6b250YWwgZWRnZXMgb2YgdGhlIHJvdyAtPiBwZXJmb3JtCi0gICAgICAgICAqIGZpbHRlcmluZyB3aXRoIEZpbHRlckhvckNocm9tYSwgb3RoZXJ3aXNlIHVzZSBGaWx0ZXJIb3JDaHJvbWFFZGdlCi0gICAgICAgICAqIGZvciBlYWNoIGVkZ2Ugc2VwYXJhdGVseS4gb2Zmc2V0IHZhcmlhYmxlIGluZGljYXRlcyB0b3AgbWFjcm9ibG9jawotICAgICAgICAgKiBlZGdlIG9uIHRoZSBmaXJzdCBsb29wIHJvdW5kLCBpbm5lciBlZGdlIGZvciB0aGUgc2Vjb25kICovCi0gICAgICAgIGlmICh0bXBbMF0udG9wID09IHRtcFsxXS50b3AgJiYgdG1wWzFdLnRvcCA9PSB0bXBbMl0udG9wICYmCi0gICAgICAgICAgICB0bXBbMl0udG9wID09IHRtcFszXS50b3ApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHRtcFswXS50b3ApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRmlsdGVySG9yQ2hyb21hKGRhdGFDYiwgdG1wWzBdLnRvcCwgdGhyZXNob2xkcytvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgIChpMzIpd2lkdGgpOwotICAgICAgICAgICAgICAgIEZpbHRlckhvckNocm9tYShkYXRhQ3IsIHRtcFswXS50b3AsIHRocmVzaG9sZHMrb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAoaTMyKXdpZHRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh0bXBbMF0udG9wKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZpbHRlckhvckNocm9tYUVkZ2UoZGF0YUNiLCB0bXBbMF0udG9wLCB0aHJlc2hvbGRzK29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgKGkzMil3aWR0aCk7Ci0gICAgICAgICAgICAgICAgRmlsdGVySG9yQ2hyb21hRWRnZShkYXRhQ3IsIHRtcFswXS50b3AsIHRocmVzaG9sZHMrb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAoaTMyKXdpZHRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh0bXBbMV0udG9wKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZpbHRlckhvckNocm9tYUVkZ2UoZGF0YUNiKzIsIHRtcFsxXS50b3AsIHRocmVzaG9sZHMrb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAoaTMyKXdpZHRoKTsKLSAgICAgICAgICAgICAgICBGaWx0ZXJIb3JDaHJvbWFFZGdlKGRhdGFDcisyLCB0bXBbMV0udG9wLCB0aHJlc2hvbGRzK29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgKGkzMil3aWR0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodG1wWzJdLnRvcCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBGaWx0ZXJIb3JDaHJvbWFFZGdlKGRhdGFDYis0LCB0bXBbMl0udG9wLCB0aHJlc2hvbGRzK29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgKGkzMil3aWR0aCk7Ci0gICAgICAgICAgICAgICAgRmlsdGVySG9yQ2hyb21hRWRnZShkYXRhQ3IrNCwgdG1wWzJdLnRvcCwgdGhyZXNob2xkcytvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgIChpMzIpd2lkdGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHRtcFszXS50b3ApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRmlsdGVySG9yQ2hyb21hRWRnZShkYXRhQ2IrNiwgdG1wWzNdLnRvcCwgdGhyZXNob2xkcytvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgIChpMzIpd2lkdGgpOwotICAgICAgICAgICAgICAgIEZpbHRlckhvckNocm9tYUVkZ2UoZGF0YUNyKzYsIHRtcFszXS50b3AsIHRocmVzaG9sZHMrb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAoaTMyKXdpZHRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHRtcCArPSA4OwotICAgICAgICBkYXRhQ2IgKz0gd2lkdGgqNDsKLSAgICAgICAgZGF0YUNyICs9IHdpZHRoKjQ7Ci0gICAgICAgIG9mZnNldCA9IElOTkVSOwotICAgIH0KLX0KLQotI2Vsc2UgLyogSDI2NERFQ19PTVhETCAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RGaWx0ZXJQaWN0dXJlCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBQZXJmb3JtIGRlYmxvY2tpbmcgZmlsdGVyaW5nIGZvciBhIHBpY3R1cmUuIEZpbHRlciBkb2VzIG5vdCBjb3B5Ci0gICAgICAgICAgdGhlIG9yaWdpbmFsIHBpY3R1cmUgYW55d2hlcmUgYnV0IGZpbHRlcmluZyBpcyBwZXJmb3JtZWQgZGlyZWN0bHkKLSAgICAgICAgICBvbiB0aGUgb3JpZ2luYWwgaW1hZ2UuIFBhcmFtZXRlcnMgY29udHJvbGxpbmcgdGhlIGZpbHRlcmluZyBwcm9jZXNzCi0gICAgICAgICAgYXJlIGNvbXB1dGVkIGJhc2VkIG9uIGluZm9ybWF0aW9uIGluIG1hY3JvYmxvY2sgc3RydWN0dXJlcyBvZiB0aGUKLSAgICAgICAgICBmaWx0ZXJlZCBtYWNyb2Jsb2NrLCBtYWNyb2Jsb2NrIGFib3ZlIGFuZCBtYWNyb2Jsb2NrIG9uIHRoZSBsZWZ0IG9mCi0gICAgICAgICAgdGhlIGZpbHRlcmVkIG9uZS4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgaW1hZ2UgICAgICAgICBwb2ludGVyIHRvIGltYWdlIHRvIGJlIGZpbHRlcmVkCi0gICAgICAgICAgbWIgICAgICAgICAgICBwb2ludGVyIHRvIG1hY3JvYmxvY2sgZGF0YSBzdHJ1Y3R1cmUgb2YgdGhlIHRvcC1sZWZ0Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrIG9mIHRoZSBwaWN0dXJlCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICBpbWFnZSAgICAgICAgIGZpbHRlcmVkIGltYWdlIHN0b3JlZCBoZXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICBub25lCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qbGludCAtLWV7NTUwfSBTeW1ib2wgbm90IGFjY2Vzc2VkICovCi12b2lkIGgyNjRic2RGaWx0ZXJQaWN0dXJlKAotICBpbWFnZV90ICppbWFnZSwKLSAgbWJTdG9yYWdlX3QgKm1iKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBmbGFnczsKLSAgICB1MzIgcGljU2l6ZUluTWJzLCBtYlJvdywgbWJDb2w7Ci0gICAgdTMyIHBpY1dpZHRoSW5NYnM7Ci0gICAgdTggKmRhdGE7Ci0gICAgbWJTdG9yYWdlX3QgKnBNYjsKLSAgICB1OCBiU1syXVsxNl07Ci0gICAgdTggdGhyZXNob2xkTHVtYVsyXVsxNl07Ci0gICAgdTggdGhyZXNob2xkQ2hyb21hWzJdWzhdOwotICAgIHU4IGFscGhhWzJdWzJdOwotICAgIHU4IGJldGFbMl1bMl07Ci0gICAgT01YUmVzdWx0IHJlczsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGltYWdlKTsKLSAgICBBU1NFUlQobWIpOwotICAgIEFTU0VSVChpbWFnZS0+ZGF0YSk7Ci0gICAgQVNTRVJUKGltYWdlLT53aWR0aCk7Ci0gICAgQVNTRVJUKGltYWdlLT5oZWlnaHQpOwotCi0gICAgcGljV2lkdGhJbk1icyA9IGltYWdlLT53aWR0aDsKLSAgICBkYXRhID0gaW1hZ2UtPmRhdGE7Ci0gICAgcGljU2l6ZUluTWJzID0gcGljV2lkdGhJbk1icyAqIGltYWdlLT5oZWlnaHQ7Ci0KLSAgICBwTWIgPSBtYjsKLQotICAgIGZvciAobWJSb3cgPSAwLCBtYkNvbCA9IDA7IG1iUm93IDwgaW1hZ2UtPmhlaWdodDsgcE1iKyspCi0gICAgewotICAgICAgICBmbGFncyA9IEdldE1iRmlsdGVyaW5nRmxhZ3MocE1iKTsKLQotICAgICAgICBpZiAoZmxhZ3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIEdldEJvdW5kYXJ5U3RyZW5ndGhzIGZ1bmN0aW9uIHJldHVybnMgbm9uLXplcm8gdmFsdWUgaWYgYW55IG9mCi0gICAgICAgICAgICAgKiB0aGUgYlMgdmFsdWVzIGZvciB0aGUgbWFjcm9ibG9jayBiZWluZyBwcm9jZXNzZWQgd2FzIG5vbi16ZXJvICovCi0gICAgICAgICAgICBpZiAoR2V0Qm91bmRhcnlTdHJlbmd0aHMocE1iLCBiUywgZmxhZ3MpKQotICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgLyogTHVtYSAqLwotICAgICAgICAgICAgICAgIEdldEx1bWFFZGdlVGhyZXNob2xkcyhwTWIsYWxwaGEsYmV0YSx0aHJlc2hvbGRMdW1hLGJTLGZsYWdzKTsKLSAgICAgICAgICAgICAgICBkYXRhID0gaW1hZ2UtPmRhdGEgKyBtYlJvdyAqIHBpY1dpZHRoSW5NYnMgKiAyNTYgKyBtYkNvbCAqIDE2OwotCi0gICAgICAgICAgICAgICAgcmVzID0gb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0koIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX1MzMikocGljV2lkdGhJbk1icyoxNiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4KilhbHBoYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKWJldGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4Kil0aHJlc2hvbGRMdW1hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopYlMgKTsKLQotICAgICAgICAgICAgICAgIHJlcyA9IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JKCBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9TMzIpKHBpY1dpZHRoSW5NYnMqMTYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopYWxwaGErMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKWJldGErMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKXRocmVzaG9sZEx1bWErMTYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4KiliUysxNiApOwotICAgICAgICAgICAgICAgIC8qIENiICovCi0gICAgICAgICAgICAgICAgR2V0Q2hyb21hRWRnZVRocmVzaG9sZHMocE1iLCBhbHBoYSwgYmV0YSwgdGhyZXNob2xkQ2hyb21hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTLCBmbGFncywgcE1iLT5jaHJvbWFRcEluZGV4T2Zmc2V0KTsKLSAgICAgICAgICAgICAgICBkYXRhID0gaW1hZ2UtPmRhdGEgKyBwaWNTaXplSW5NYnMgKiAyNTYgKwotICAgICAgICAgICAgICAgICAgICBtYlJvdyAqIHBpY1dpZHRoSW5NYnMgKiA2NCArIG1iQ29sICogODsKLQotICAgICAgICAgICAgICAgIHJlcyA9IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0koIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9TMzIpKHBpY1dpZHRoSW5NYnMqOCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopYWxwaGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopYmV0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4Kil0aHJlc2hvbGRDaHJvbWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopYlMgKTsKLSAgICAgICAgICAgICAgICByZXMgPSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JKCBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfUzMyKShwaWNXaWR0aEluTWJzKjgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKWFscGhhKzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopYmV0YSsyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKXRocmVzaG9sZENocm9tYSs4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKWJTKzE2ICk7Ci0gICAgICAgICAgICAgICAgLyogQ3IgKi8KLSAgICAgICAgICAgICAgICBkYXRhICs9IChwaWNTaXplSW5NYnMgKiA2NCk7Ci0gICAgICAgICAgICAgICAgcmVzID0gb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSSggZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX1MzMikocGljV2lkdGhJbk1icyo4KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4KilhbHBoYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4KiliZXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKXRocmVzaG9sZENocm9tYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4KiliUyApOwotICAgICAgICAgICAgICAgIHJlcyA9IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0koIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9TMzIpKHBpY1dpZHRoSW5NYnMqOCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopYWxwaGErMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4KiliZXRhKzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopdGhyZXNob2xkQ2hyb21hKzgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopYlMrMTYgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIG1iQ29sKys7Ci0gICAgICAgIGlmIChtYkNvbCA9PSBwaWNXaWR0aEluTWJzKQotICAgICAgICB7Ci0gICAgICAgICAgICBtYkNvbCA9IDA7Ci0gICAgICAgICAgICBtYlJvdysrOwotICAgICAgICB9Ci0gICAgfQotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogR2V0Qm91bmRhcnlTdHJlbmd0aHMKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRnVuY3Rpb24gdG8gY2FsY3VsYXRlIGJvdW5kYXJ5IHN0cmVuZ3RocyBmb3IgYWxsIGVkZ2VzIG9mIGEKLSAgICAgICAgICAgIG1hY3JvYmxvY2suIEZ1bmN0aW9uIHJldHVybnMgSEFOVFJPX1RSVUUgaWYgYW55IG9mIHRoZSBiUyB2YWx1ZXMgZm9yCi0gICAgICAgICAgICB0aGUgbWFjcm9ibG9jayBoYWQgbm9uLXplcm8gdmFsdWUsIEhBTlRST19GQUxTRSBvdGhlcndpc2UuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi11MzIgR2V0Qm91bmRhcnlTdHJlbmd0aHMobWJTdG9yYWdlX3QgKm1iLCB1OCAoKmJTKVsxNl0sIHUzMiBmbGFncykKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICAvKiB0aGlzIGZsYWcgaXMgc2V0IEhBTlRST19UUlVFIGFzIHNvb24gYXMgYW55IGJvdW5kYXJ5IHN0cmVuZ3RoIHZhbHVlIGlzCi0gICAgICogbm9uLXplcm8gKi8KLSAgICB1MzIgbm9uWmVyb0JzID0gSEFOVFJPX0ZBTFNFOwotICAgIHUzMiAqcFRtcDsKLSAgICB1MzIgdG1wMSwgdG1wMiwgaXNJbnRyYU1iOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQobWIpOwotICAgIEFTU0VSVChiUyk7Ci0gICAgQVNTRVJUKGZsYWdzKTsKLQotICAgIGlzSW50cmFNYiA9IElTX0lOVFJBX01CKCptYik7Ci0KLSAgICAvKiB0b3AgZWRnZXMgKi8KLSAgICBwVG1wID0gKHUzMiopJmJTWzFdWzBdOwotICAgIGlmIChmbGFncyAmIEZJTFRFUl9UT1BfRURHRSkKLSAgICB7Ci0gICAgICAgIGlmIChpc0ludHJhTWIgfHwgSVNfSU5UUkFfTUIoKm1iLT5tYkIpKQotICAgICAgICB7Ci0gICAgICAgICAgICAqcFRtcCA9IDB4MDQwNDA0MDQ7Ci0gICAgICAgICAgICBub25aZXJvQnMgPSBIQU5UUk9fVFJVRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgICpwVG1wID0gRWRnZUJvdW5kYXJ5U3RyZW5ndGhUb3AobWIsIG1iLT5tYkIpOwotICAgICAgICAgICAgaWYgKCpwVG1wKQotICAgICAgICAgICAgICAgIG5vblplcm9CcyA9IEhBTlRST19UUlVFOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgICpwVG1wID0gMDsKLSAgICB9Ci0KLSAgICAvKiBsZWZ0IGVkZ2VzICovCi0gICAgcFRtcCA9ICh1MzIqKSZiU1swXVswXTsKLSAgICBpZiAoZmxhZ3MgJiBGSUxURVJfTEVGVF9FREdFKQotICAgIHsKLSAgICAgICAgaWYgKGlzSW50cmFNYiB8fCBJU19JTlRSQV9NQigqbWItPm1iQSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qYlNbMF1bMF0gPSBiU1swXVsxXSA9IGJTWzBdWzJdID0gYlNbMF1bM10gPSA0OyovCi0gICAgICAgICAgICAqcFRtcCA9IDB4MDQwNDA0MDQ7Ci0gICAgICAgICAgICBub25aZXJvQnMgPSBIQU5UUk9fVFJVRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgICpwVG1wID0gRWRnZUJvdW5kYXJ5U3RyZW5ndGhMZWZ0KG1iLCBtYi0+bWJBKTsKLSAgICAgICAgICAgIGlmICghbm9uWmVyb0JzICYmICpwVG1wKQotICAgICAgICAgICAgICAgIG5vblplcm9CcyA9IEhBTlRST19UUlVFOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgICpwVG1wID0gMDsKLSAgICB9Ci0KLSAgICAvKiBpbm5lciBlZGdlcyAqLwotICAgIGlmIChpc0ludHJhTWIpCi0gICAgewotICAgICAgICBwVG1wKys7Ci0gICAgICAgICpwVG1wKysgPSAweDAzMDMwMzAzOwotICAgICAgICAqcFRtcCsrID0gMHgwMzAzMDMwMzsKLSAgICAgICAgKnBUbXArKyA9IDB4MDMwMzAzMDM7Ci0gICAgICAgIHBUbXArKzsKLSAgICAgICAgKnBUbXArKyA9IDB4MDMwMzAzMDM7Ci0gICAgICAgICpwVG1wKysgPSAweDAzMDMwMzAzOwotICAgICAgICAqcFRtcCA9IDB4MDMwMzAzMDM7Ci0KLSAgICAgICAgbm9uWmVyb0JzID0gSEFOVFJPX1RSVUU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBUbXAgPSAodTMyKiltYi0+dG90YWxDb2VmZjsKLQotICAgICAgICAvKiAxNngxNiBpbnRlciBtYiAtPiByZWYgYWRkcmVzc2VzIG9yIG1vdGlvbiB2ZWN0b3JzIGNhbm5vdCBkaWZmZXIsCi0gICAgICAgICAqIG9ubHkgY2hlY2sgaWYgZWl0aGVyIG9mIHRoZSBibG9ja3MgY29udGFpbiBjb2VmZmljaWVudHMgKi8KLSAgICAgICAgaWYgKGgyNjRic2ROdW1NYlBhcnQobWItPm1iVHlwZSkgPT0gMSkKLSAgICAgICAgewotICAgICAgICAgICAgdG1wMSA9ICpwVG1wKys7Ci0gICAgICAgICAgICB0bXAyID0gKnBUbXArKzsKLSAgICAgICAgICAgIGJTWzFdWzRdICA9ICh0bXAxICYgMHgwMEZGMDBGRikgPyAyIDogMDsgLyogWzJdICB8fCBbMF0gKi8KLSAgICAgICAgICAgIGJTWzFdWzVdICA9ICh0bXAxICYgMHhGRjAwRkYwMCkgPyAyIDogMDsgLyogWzNdICB8fCBbMV0gKi8KLSAgICAgICAgICAgIGJTWzBdWzRdICA9ICh0bXAxICYgMHgwMDAwRkZGRikgPyAyIDogMDsgLyogWzFdICB8fCBbMF0gKi8KLSAgICAgICAgICAgIGJTWzBdWzVdICA9ICh0bXAxICYgMHhGRkZGMDAwMCkgPyAyIDogMDsgLyogWzNdICB8fCBbMl0gKi8KLQotICAgICAgICAgICAgdG1wMSA9ICpwVG1wKys7Ci0gICAgICAgICAgICBiU1sxXVs2XSAgPSAodG1wMiAmIDB4MDBGRjAwRkYpID8gMiA6IDA7IC8qIFs2XSAgfHwgWzRdICovCi0gICAgICAgICAgICBiU1sxXVs3XSAgPSAodG1wMiAmIDB4RkYwMEZGMDApID8gMiA6IDA7IC8qIFs3XSAgfHwgWzVdICovCi0gICAgICAgICAgICBiU1swXVsxMl0gPSAodG1wMiAmIDB4MDAwMEZGRkYpID8gMiA6IDA7IC8qIFs1XSAgfHwgWzRdICovCi0gICAgICAgICAgICBiU1swXVsxM10gPSAodG1wMiAmIDB4RkZGRjAwMDApID8gMiA6IDA7IC8qIFs3XSAgfHwgWzZdICovCi0gICAgICAgICAgICB0bXAyID0gKnBUbXA7Ci0gICAgICAgICAgICBiU1sxXVsxMl0gPSAodG1wMSAmIDB4MDBGRjAwRkYpID8gMiA6IDA7IC8qIFsxMF0gfHwgWzhdICovCi0gICAgICAgICAgICBiU1sxXVsxM10gPSAodG1wMSAmIDB4RkYwMEZGMDApID8gMiA6IDA7IC8qIFsxMV0gfHwgWzldICovCi0gICAgICAgICAgICBiU1swXVs2XSAgPSAodG1wMSAmIDB4MDAwMEZGRkYpID8gMiA6IDA7IC8qIFs5XSAgfHwgWzhdICovCi0gICAgICAgICAgICBiU1swXVs3XSAgPSAodG1wMSAmIDB4RkZGRjAwMDApID8gMiA6IDA7IC8qIFsxMV0gfHwgWzEwXSAqLwotCi0gICAgICAgICAgICBiU1sxXVsxNF0gPSAodG1wMiAmIDB4MDBGRjAwRkYpID8gMiA6IDA7IC8qIFsxNF0gfHwgWzEyXSAqLwotICAgICAgICAgICAgYlNbMV1bMTVdID0gKHRtcDIgJiAweEZGMDBGRjAwKSA/IDIgOiAwOyAvKiBbMTVdIHx8IFsxM10gKi8KLSAgICAgICAgICAgIGJTWzBdWzE0XSA9ICh0bXAyICYgMHgwMDAwRkZGRikgPyAyIDogMDsgLyogWzEzXSB8fCBbMTJdICovCi0gICAgICAgICAgICBiU1swXVsxNV0gPSAodG1wMiAmIDB4RkZGRjAwMDApID8gMiA6IDA7IC8qIFsxNV0gfHwgWzE0XSAqLwotCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICB1MzIgdG1wMywgdG1wNDsKLQotICAgICAgICAgICAgdG1wMSA9IG1iLT50b3RhbENvZWZmWzhdOwotICAgICAgICAgICAgdG1wMiA9IG1iLT50b3RhbENvZWZmWzJdOwotICAgICAgICAgICAgdG1wMyA9IG1iLT50b3RhbENvZWZmWzldOwotICAgICAgICAgICAgdG1wNCA9IG1iLT50b3RhbENvZWZmWzNdOwotCi0gICAgICAgICAgICBiU1sxXVs4XSA9IHRtcDEgfHwgdG1wMiA/IDIgOiAwOwotICAgICAgICAgICAgdG1wMSA9IG1iLT50b3RhbENvZWZmWzEyXTsKLSAgICAgICAgICAgIHRtcDIgPSBtYi0+dG90YWxDb2VmZls2XTsKLSAgICAgICAgICAgIGJTWzFdWzldID0gdG1wMyB8fCB0bXA0ID8gMiA6IDA7Ci0gICAgICAgICAgICB0bXAzID0gbWItPnRvdGFsQ29lZmZbMTNdOwotICAgICAgICAgICAgdG1wNCA9IG1iLT50b3RhbENvZWZmWzddOwotICAgICAgICAgICAgYlNbMV1bMTBdID0gdG1wMSB8fCB0bXAyID8gMiA6IDA7Ci0gICAgICAgICAgICB0bXAxID0gbWItPnRvdGFsQ29lZmZbNF07Ci0gICAgICAgICAgICB0bXAyID0gbWItPnRvdGFsQ29lZmZbMV07Ci0gICAgICAgICAgICBiU1sxXVsxMV0gPSB0bXAzIHx8IHRtcDQgPyAyIDogMDsKLSAgICAgICAgICAgIHRtcDMgPSBtYi0+dG90YWxDb2VmZls2XTsKLSAgICAgICAgICAgIHRtcDQgPSBtYi0+dG90YWxDb2VmZlszXTsKLSAgICAgICAgICAgIGJTWzBdWzhdID0gdG1wMSB8fCB0bXAyID8gMiA6IDA7Ci0gICAgICAgICAgICB0bXAxID0gbWItPnRvdGFsQ29lZmZbMTJdOwotICAgICAgICAgICAgdG1wMiA9IG1iLT50b3RhbENvZWZmWzldOwotICAgICAgICAgICAgYlNbMF1bOV0gPSB0bXAzIHx8IHRtcDQgPyAyIDogMDsKLSAgICAgICAgICAgIHRtcDMgPSBtYi0+dG90YWxDb2VmZlsxNF07Ci0gICAgICAgICAgICB0bXA0ID0gbWItPnRvdGFsQ29lZmZbMTFdOwotICAgICAgICAgICAgYlNbMF1bMTBdID0gdG1wMSB8fCB0bXAyID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1swXVsxMV0gPSB0bXAzIHx8IHRtcDQgPyAyIDogMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIDE2eDggaW50ZXIgbWIgLT4gcmVmIGFkZHJlc3NlcyBhbmQgbW90aW9uIHZlY3RvcnMgY2FuIGJlIGRpZmZlcmVudAotICAgICAgICAgKiBvbmx5IGZvciB0aGUgbWlkZGxlIGhvcml6b250YWwgZWRnZSwgZm9yIHRoZSBvdGhlciB0b3AgZWRnZXMgaXQgaXMKLSAgICAgICAgICogZW5vdWdoIHRvIGNoZWNrIHdoZXRoZXIgdGhlIGJsb2NrcyBjb250YWluIGNvZWZmaWNpZW50cyBvciBub3QuIFRoZQotICAgICAgICAgKiBzYW1lIGFwcGxpZXMgdG8gYWxsIGludGVybmFsIGxlZnQgZWRnZXMuICovCi0gICAgICAgIGVsc2UgaWYgKG1iLT5tYlR5cGUgPT0gUF9MMF9MMF8xNng4KQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAxID0gKnBUbXArKzsKLSAgICAgICAgICAgIHRtcDIgPSAqcFRtcCsrOwotICAgICAgICAgICAgYlNbMV1bNF0gID0gKHRtcDEgJiAweDAwRkYwMEZGKSA/IDIgOiAwOyAvKiBbMl0gIHx8IFswXSAqLwotICAgICAgICAgICAgYlNbMV1bNV0gID0gKHRtcDEgJiAweEZGMDBGRjAwKSA/IDIgOiAwOyAvKiBbM10gIHx8IFsxXSAqLwotICAgICAgICAgICAgYlNbMF1bNF0gID0gKHRtcDEgJiAweDAwMDBGRkZGKSA/IDIgOiAwOyAvKiBbMV0gIHx8IFswXSAqLwotICAgICAgICAgICAgYlNbMF1bNV0gID0gKHRtcDEgJiAweEZGRkYwMDAwKSA/IDIgOiAwOyAvKiBbM10gIHx8IFsyXSAqLwotICAgICAgICAgICAgdG1wMSA9ICpwVG1wKys7Ci0gICAgICAgICAgICBiU1sxXVs2XSAgPSAodG1wMiAmIDB4MDBGRjAwRkYpID8gMiA6IDA7IC8qIFs2XSAgfHwgWzRdICovCi0gICAgICAgICAgICBiU1sxXVs3XSAgPSAodG1wMiAmIDB4RkYwMEZGMDApID8gMiA6IDA7IC8qIFs3XSAgfHwgWzVdICovCi0gICAgICAgICAgICBiU1swXVsxMl0gPSAodG1wMiAmIDB4MDAwMEZGRkYpID8gMiA6IDA7IC8qIFs1XSAgfHwgWzRdICovCi0gICAgICAgICAgICBiU1swXVsxM10gPSAodG1wMiAmIDB4RkZGRjAwMDApID8gMiA6IDA7IC8qIFs3XSAgfHwgWzZdICovCi0gICAgICAgICAgICB0bXAyID0gKnBUbXA7Ci0gICAgICAgICAgICBiU1sxXVsxMl0gPSAodG1wMSAmIDB4MDBGRjAwRkYpID8gMiA6IDA7IC8qIFsxMF0gfHwgWzhdICovCi0gICAgICAgICAgICBiU1sxXVsxM10gPSAodG1wMSAmIDB4RkYwMEZGMDApID8gMiA6IDA7IC8qIFsxMV0gfHwgWzldICovCi0gICAgICAgICAgICBiU1swXVs2XSAgPSAodG1wMSAmIDB4MDAwMEZGRkYpID8gMiA6IDA7IC8qIFs5XSAgfHwgWzhdICovCi0gICAgICAgICAgICBiU1swXVs3XSAgPSAodG1wMSAmIDB4RkZGRjAwMDApID8gMiA6IDA7IC8qIFsxMV0gfHwgWzEwXSAqLwotCi0gICAgICAgICAgICBiU1sxXVsxNF0gPSAodG1wMiAmIDB4MDBGRjAwRkYpID8gMiA6IDA7IC8qIFsxNF0gfHwgWzEyXSAqLwotICAgICAgICAgICAgYlNbMV1bMTVdID0gKHRtcDIgJiAweEZGMDBGRjAwKSA/IDIgOiAwOyAvKiBbMTVdIHx8IFsxM10gKi8KLSAgICAgICAgICAgIGJTWzBdWzE0XSA9ICh0bXAyICYgMHgwMDAwRkZGRikgPyAyIDogMDsgLyogWzEzXSB8fCBbMTJdICovCi0gICAgICAgICAgICBiU1swXVsxNV0gPSAodG1wMiAmIDB4RkZGRjAwMDApID8gMiA6IDA7IC8qIFsxNV0gfHwgWzE0XSAqLwotCi0gICAgICAgICAgICBiU1sxXVs4XSA9ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIDgsIDIpOwotICAgICAgICAgICAgYlNbMV1bOV0gPSAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCA5LCAzKTsKLSAgICAgICAgICAgIGJTWzFdWzEwXSA9ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIDEyLCA2KTsKLSAgICAgICAgICAgIGJTWzFdWzExXSA9ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIDEzLCA3KTsKLQotICAgICAgICAgICAgewotICAgICAgICAgICAgdTMyIHRtcDMsIHRtcDQ7Ci0KLSAgICAgICAgICAgIHRtcDEgPSBtYi0+dG90YWxDb2VmZls0XTsKLSAgICAgICAgICAgIHRtcDIgPSBtYi0+dG90YWxDb2VmZlsxXTsKLSAgICAgICAgICAgIHRtcDMgPSBtYi0+dG90YWxDb2VmZls2XTsKLSAgICAgICAgICAgIHRtcDQgPSBtYi0+dG90YWxDb2VmZlszXTsKLSAgICAgICAgICAgIGJTWzBdWzhdID0gdG1wMSB8fCB0bXAyID8gMiA6IDA7Ci0gICAgICAgICAgICB0bXAxID0gbWItPnRvdGFsQ29lZmZbMTJdOwotICAgICAgICAgICAgdG1wMiA9IG1iLT50b3RhbENvZWZmWzldOwotICAgICAgICAgICAgYlNbMF1bOV0gPSB0bXAzIHx8IHRtcDQgPyAyIDogMDsKLSAgICAgICAgICAgIHRtcDMgPSBtYi0+dG90YWxDb2VmZlsxNF07Ci0gICAgICAgICAgICB0bXA0ID0gbWItPnRvdGFsQ29lZmZbMTFdOwotICAgICAgICAgICAgYlNbMF1bMTBdID0gdG1wMSB8fCB0bXAyID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1swXVsxMV0gPSB0bXAzIHx8IHRtcDQgPyAyIDogMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvKiA4eDE2IGludGVyIG1iIC0+IHJlZiBhZGRyZXNzZXMgYW5kIG1vdGlvbiB2ZWN0b3JzIGNhbiBiZSBkaWZmZXJlbnQKLSAgICAgICAgICogb25seSBmb3IgdGhlIG1pZGRsZSB2ZXJ0aWNhbCBlZGdlLCBmb3IgdGhlIG90aGVyIGxlZnQgZWRnZXMgaXQgaXMKLSAgICAgICAgICogZW5vdWdoIHRvIGNoZWNrIHdoZXRoZXIgdGhlIGJsb2NrcyBjb250YWluIGNvZWZmaWNpZW50cyBvciBub3QuIFRoZQotICAgICAgICAgKiBzYW1lIGFwcGxpZXMgdG8gYWxsIGludGVybmFsIHRvcCBlZGdlcy4gKi8KLSAgICAgICAgZWxzZSBpZiAobWItPm1iVHlwZSA9PSBQX0wwX0wwXzh4MTYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcDEgPSAqcFRtcCsrOwotICAgICAgICAgICAgdG1wMiA9ICpwVG1wKys7Ci0gICAgICAgICAgICBiU1sxXVs0XSAgPSAodG1wMSAmIDB4MDBGRjAwRkYpID8gMiA6IDA7IC8qIFsyXSAgfHwgWzBdICovCi0gICAgICAgICAgICBiU1sxXVs1XSAgPSAodG1wMSAmIDB4RkYwMEZGMDApID8gMiA6IDA7IC8qIFszXSAgfHwgWzFdICovCi0gICAgICAgICAgICBiU1swXVs0XSAgPSAodG1wMSAmIDB4MDAwMEZGRkYpID8gMiA6IDA7IC8qIFsxXSAgfHwgWzBdICovCi0gICAgICAgICAgICBiU1swXVs1XSAgPSAodG1wMSAmIDB4RkZGRjAwMDApID8gMiA6IDA7IC8qIFszXSAgfHwgWzJdICovCi0gICAgICAgICAgICB0bXAxID0gKnBUbXArKzsKLSAgICAgICAgICAgIGJTWzFdWzZdICA9ICh0bXAyICYgMHgwMEZGMDBGRikgPyAyIDogMDsgLyogWzZdICB8fCBbNF0gKi8KLSAgICAgICAgICAgIGJTWzFdWzddICA9ICh0bXAyICYgMHhGRjAwRkYwMCkgPyAyIDogMDsgLyogWzddICB8fCBbNV0gKi8KLSAgICAgICAgICAgIGJTWzBdWzEyXSA9ICh0bXAyICYgMHgwMDAwRkZGRikgPyAyIDogMDsgLyogWzVdICB8fCBbNF0gKi8KLSAgICAgICAgICAgIGJTWzBdWzEzXSA9ICh0bXAyICYgMHhGRkZGMDAwMCkgPyAyIDogMDsgLyogWzddICB8fCBbNl0gKi8KLSAgICAgICAgICAgIHRtcDIgPSAqcFRtcDsKLSAgICAgICAgICAgIGJTWzFdWzEyXSA9ICh0bXAxICYgMHgwMEZGMDBGRikgPyAyIDogMDsgLyogWzEwXSB8fCBbOF0gKi8KLSAgICAgICAgICAgIGJTWzFdWzEzXSA9ICh0bXAxICYgMHhGRjAwRkYwMCkgPyAyIDogMDsgLyogWzExXSB8fCBbOV0gKi8KLSAgICAgICAgICAgIGJTWzBdWzZdICA9ICh0bXAxICYgMHgwMDAwRkZGRikgPyAyIDogMDsgLyogWzldICB8fCBbOF0gKi8KLSAgICAgICAgICAgIGJTWzBdWzddICA9ICh0bXAxICYgMHhGRkZGMDAwMCkgPyAyIDogMDsgLyogWzExXSB8fCBbMTBdICovCi0KLSAgICAgICAgICAgIGJTWzFdWzE0XSA9ICh0bXAyICYgMHgwMEZGMDBGRikgPyAyIDogMDsgLyogWzE0XSB8fCBbMTJdICovCi0gICAgICAgICAgICBiU1sxXVsxNV0gPSAodG1wMiAmIDB4RkYwMEZGMDApID8gMiA6IDA7IC8qIFsxNV0gfHwgWzEzXSAqLwotICAgICAgICAgICAgYlNbMF1bMTRdID0gKHRtcDIgJiAweDAwMDBGRkZGKSA/IDIgOiAwOyAvKiBbMTNdIHx8IFsxMl0gKi8KLSAgICAgICAgICAgIGJTWzBdWzE1XSA9ICh0bXAyICYgMHhGRkZGMDAwMCkgPyAyIDogMDsgLyogWzE1XSB8fCBbMTRdICovCi0KLSAgICAgICAgICAgIGJTWzBdWzhdID0gKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgNCwgMSk7Ci0gICAgICAgICAgICBiU1swXVs5XSA9ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIDYsIDMpOwotICAgICAgICAgICAgYlNbMF1bMTBdID0gKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgMTIsIDkpOwotICAgICAgICAgICAgYlNbMF1bMTFdID0gKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgMTQsIDExKTsKLQotICAgICAgICAgICAgewotICAgICAgICAgICAgdTMyIHRtcDMsIHRtcDQ7Ci0KLSAgICAgICAgICAgIHRtcDEgPSBtYi0+dG90YWxDb2VmZls4XTsKLSAgICAgICAgICAgIHRtcDIgPSBtYi0+dG90YWxDb2VmZlsyXTsKLSAgICAgICAgICAgIHRtcDMgPSBtYi0+dG90YWxDb2VmZls5XTsKLSAgICAgICAgICAgIHRtcDQgPSBtYi0+dG90YWxDb2VmZlszXTsKLSAgICAgICAgICAgIGJTWzFdWzhdID0gdG1wMSB8fCB0bXAyID8gMiA6IDA7Ci0gICAgICAgICAgICB0bXAxID0gbWItPnRvdGFsQ29lZmZbMTJdOwotICAgICAgICAgICAgdG1wMiA9IG1iLT50b3RhbENvZWZmWzZdOwotICAgICAgICAgICAgYlNbMV1bOV0gPSB0bXAzIHx8IHRtcDQgPyAyIDogMDsKLSAgICAgICAgICAgIHRtcDMgPSBtYi0+dG90YWxDb2VmZlsxM107Ci0gICAgICAgICAgICB0bXA0ID0gbWItPnRvdGFsQ29lZmZbN107Ci0gICAgICAgICAgICBiU1sxXVsxMF0gPSB0bXAxIHx8IHRtcDIgPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzFdWzExXSA9IHRtcDMgfHwgdG1wNCA/IDIgOiAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdG1wMSA9ICpwVG1wKys7Ci0gICAgICAgICAgICBiU1sxXVs0XSA9ICh0bXAxICYgMHgwMEZGMDBGRikgPyAyIDogKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aDIobWIsIDIsIDApOwotICAgICAgICAgICAgYlNbMV1bNV0gPSAodG1wMSAmIDB4RkYwMEZGMDApID8gMiA6ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgyKG1iLCAzLCAxKTsKLSAgICAgICAgICAgIGJTWzBdWzRdID0gKHRtcDEgJiAweDAwMDBGRkZGKSA/IDIgOiAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoMihtYiwgMSwgMCk7Ci0gICAgICAgICAgICBiU1swXVs1XSA9ICh0bXAxICYgMHhGRkZGMDAwMCkgPyAyIDogKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aDIobWIsIDMsIDIpOwotICAgICAgICAgICAgdG1wMSA9ICpwVG1wKys7Ci0gICAgICAgICAgICBiU1sxXVs2XSAgPSAodG1wMSAmIDB4MDBGRjAwRkYpID8gMiA6ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgyKG1iLCA2LCA0KTsKLSAgICAgICAgICAgIGJTWzFdWzddICA9ICh0bXAxICYgMHhGRjAwRkYwMCkgPyAyIDogKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aDIobWIsIDcsIDUpOwotICAgICAgICAgICAgYlNbMF1bMTJdID0gKHRtcDEgJiAweDAwMDBGRkZGKSA/IDIgOiAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoMihtYiwgNSwgNCk7Ci0gICAgICAgICAgICBiU1swXVsxM10gPSAodG1wMSAmIDB4RkZGRjAwMDApID8gMiA6ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgyKG1iLCA3LCA2KTsKLSAgICAgICAgICAgIHRtcDEgPSAqcFRtcCsrOwotICAgICAgICAgICAgYlNbMV1bMTJdID0gKHRtcDEgJiAweDAwRkYwMEZGKSA/IDIgOiAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoMihtYiwgMTAsIDgpOwotICAgICAgICAgICAgYlNbMV1bMTNdID0gKHRtcDEgJiAweEZGMDBGRjAwKSA/IDIgOiAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoMihtYiwgMTEsIDkpOwotICAgICAgICAgICAgYlNbMF1bNl0gID0gKHRtcDEgJiAweDAwMDBGRkZGKSA/IDIgOiAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoMihtYiwgOSwgOCk7Ci0gICAgICAgICAgICBiU1swXVs3XSAgPSAodG1wMSAmIDB4RkZGRjAwMDApID8gMiA6ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgyKG1iLCAxMSwgMTApOwotICAgICAgICAgICAgdG1wMSA9ICpwVG1wOwotICAgICAgICAgICAgYlNbMV1bMTRdID0gKHRtcDEgJiAweDAwRkYwMEZGKSA/IDIgOiAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoMihtYiwgMTQsIDEyKTsKLSAgICAgICAgICAgIGJTWzFdWzE1XSA9ICh0bXAxICYgMHhGRjAwRkYwMCkgPyAyIDogKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aDIobWIsIDE1LCAxMyk7Ci0gICAgICAgICAgICBiU1swXVsxNF0gPSAodG1wMSAmIDB4MDAwMEZGRkYpID8gMiA6ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgyKG1iLCAxMywgMTIpOwotICAgICAgICAgICAgYlNbMF1bMTVdID0gKHRtcDEgJiAweEZGRkYwMDAwKSA/IDIgOiAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoMihtYiwgMTUsIDE0KTsKLQotICAgICAgICAgICAgYlNbMV1bOF0gPSAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCA4LCAyKTsKLSAgICAgICAgICAgIGJTWzFdWzldID0gKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgOSwgMyk7Ci0gICAgICAgICAgICBiU1sxXVsxMF0gPSAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCAxMiwgNik7Ci0gICAgICAgICAgICBiU1sxXVsxMV0gPSAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCAxMywgNyk7Ci0KLSAgICAgICAgICAgIGJTWzBdWzhdID0gKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgNCwgMSk7Ci0gICAgICAgICAgICBiU1swXVs5XSA9ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIDYsIDMpOwotICAgICAgICAgICAgYlNbMF1bMTBdID0gKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgMTIsIDkpOwotICAgICAgICAgICAgYlNbMF1bMTFdID0gKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgMTQsIDExKTsKLSAgICAgICAgfQotICAgICAgICBwVG1wID0gKHUzMiopJmJTWzBdWzBdOwotICAgICAgICBpZiAoIW5vblplcm9CcyAmJiAocFRtcFsxXSB8fCBwVG1wWzJdIHx8IHBUbXBbM10gfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUbXBbNV0gfHwgcFRtcFs2XSB8fCBwVG1wWzddKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG5vblplcm9CcyA9IEhBTlRST19UUlVFOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuKG5vblplcm9Ccyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBHZXRMdW1hRWRnZVRocmVzaG9sZHMKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgQ29tcHV0ZSBhbHBoYSwgYmV0YSBhbmQgdGMwIHRocmVzaG9sZHMgZm9yIGlubmVyLCBsZWZ0IGFuZCB0b3AKLSAgICAgICAgICAgIGx1bWEgZWRnZXMgb2YgYSBtYWNyb2Jsb2NrLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBHZXRMdW1hRWRnZVRocmVzaG9sZHMoCi0gICAgbWJTdG9yYWdlX3QgKm1iLAotICAgIHU4ICgqYWxwaGEpWzJdLAotICAgIHU4ICgqYmV0YSlbMl0sCi0gICAgdTggKCp0aHJlc2hvbGQpWzE2XSwKLSAgICB1OCAoKmJzKVsxNl0sCi0gICAgdTMyIGZpbHRlcmluZ0ZsYWdzICkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaW5kZXhBLCBpbmRleEI7Ci0gICAgdTMyIHFwQXYsIHFwLCBxcFRtcDsKLSAgICB1MzIgaTsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHRocmVzaG9sZCk7Ci0gICAgQVNTRVJUKGJzKTsKLSAgICBBU1NFUlQoYmV0YSk7Ci0gICAgQVNTRVJUKGFscGhhKTsKLSAgICBBU1NFUlQobWIpOwotCi0gICAgcXAgPSBtYi0+cXBZOwotCi0gICAgaW5kZXhBID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcCArIG1iLT5maWx0ZXJPZmZzZXRBKTsKLSAgICBpbmRleEIgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwICsgbWItPmZpbHRlck9mZnNldEIpOwotCi0gICAgLyogSW50ZXJuYWwgZWRnZSB2YWx1ZXMgKi8KLSAgICBhbHBoYVswXVsxXSA9IGFscGhhc1tpbmRleEFdOwotICAgIGFscGhhWzFdWzFdID0gYWxwaGFzW2luZGV4QV07Ci0gICAgYWxwaGFbMV1bMF0gPSBhbHBoYXNbaW5kZXhBXTsKLSAgICBhbHBoYVswXVswXSA9IGFscGhhc1tpbmRleEFdOwotICAgIGJldGFbMF1bMV0gPSBiZXRhc1tpbmRleEJdOwotICAgIGJldGFbMV1bMV0gPSBiZXRhc1tpbmRleEJdOwotICAgIGJldGFbMV1bMF0gPSBiZXRhc1tpbmRleEJdOwotICAgIGJldGFbMF1bMF0gPSBiZXRhc1tpbmRleEJdOwotCi0gICAgLyogdmVydGljYWwgc2NhbiBvcmRlciAqLwotICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCi0gICAgewotICAgICAgICB1MzIgdDEsIHQyOwotCi0gICAgICAgIHQxID0gYnNbaV1bMF07Ci0gICAgICAgIHQyID0gYnNbaV1bMV07Ci0gICAgICAgIHRocmVzaG9sZFtpXVswXSAgPSAodDEpID8gdGMwW2luZGV4QV1bdDFdIDogMDsKLSAgICAgICAgdDEgPSBic1tpXVsyXTsKLSAgICAgICAgdGhyZXNob2xkW2ldWzFdICA9ICh0MikgPyB0YzBbaW5kZXhBXVt0Ml0gOiAwOwotICAgICAgICB0MiA9IGJzW2ldWzNdOwotICAgICAgICB0aHJlc2hvbGRbaV1bMl0gID0gKHQxKSA/IHRjMFtpbmRleEFdW3QxXSA6IDA7Ci0gICAgICAgIHQxID0gYnNbaV1bNF07Ci0gICAgICAgIHRocmVzaG9sZFtpXVszXSAgPSAodDIpID8gdGMwW2luZGV4QV1bdDJdIDogMDsKLSAgICAgICAgdDIgPSBic1tpXVs1XTsKLSAgICAgICAgdGhyZXNob2xkW2ldWzRdICA9ICh0MSkgPyB0YzBbaW5kZXhBXVt0MV0gOiAwOwotICAgICAgICB0MSA9IGJzW2ldWzZdOwotICAgICAgICB0aHJlc2hvbGRbaV1bNV0gID0gKHQyKSA/IHRjMFtpbmRleEFdW3QyXSA6IDA7Ci0gICAgICAgIHQyID0gYnNbaV1bN107Ci0gICAgICAgIHRocmVzaG9sZFtpXVs2XSAgPSAodDEpID8gdGMwW2luZGV4QV1bdDFdIDogMDsKLSAgICAgICAgdDEgPSBic1tpXVs4XTsKLSAgICAgICAgdGhyZXNob2xkW2ldWzddICA9ICh0MikgPyB0YzBbaW5kZXhBXVt0Ml0gOiAwOwotICAgICAgICB0MiA9IGJzW2ldWzldOwotICAgICAgICB0aHJlc2hvbGRbaV1bOF0gID0gKHQxKSA/IHRjMFtpbmRleEFdW3QxXSA6IDA7Ci0gICAgICAgIHQxID0gYnNbaV1bMTBdOwotICAgICAgICB0aHJlc2hvbGRbaV1bOV0gID0gKHQyKSA/IHRjMFtpbmRleEFdW3QyXSA6IDA7Ci0gICAgICAgIHQyID0gYnNbaV1bMTFdOwotICAgICAgICB0aHJlc2hvbGRbaV1bMTBdID0gKHQxKSA/IHRjMFtpbmRleEFdW3QxXSA6IDA7Ci0gICAgICAgIHQxID0gYnNbaV1bMTJdOwotICAgICAgICB0aHJlc2hvbGRbaV1bMTFdID0gKHQyKSA/IHRjMFtpbmRleEFdW3QyXSA6IDA7Ci0gICAgICAgIHQyID0gYnNbaV1bMTNdOwotICAgICAgICB0aHJlc2hvbGRbaV1bMTJdID0gKHQxKSA/IHRjMFtpbmRleEFdW3QxXSA6IDA7Ci0gICAgICAgIHQxID0gYnNbaV1bMTRdOwotICAgICAgICB0aHJlc2hvbGRbaV1bMTNdID0gKHQyKSA/IHRjMFtpbmRleEFdW3QyXSA6IDA7Ci0gICAgICAgIHQyID0gYnNbaV1bMTVdOwotICAgICAgICB0aHJlc2hvbGRbaV1bMTRdID0gKHQxKSA/IHRjMFtpbmRleEFdW3QxXSA6IDA7Ci0gICAgICAgIHRocmVzaG9sZFtpXVsxNV0gPSAodDIpID8gdGMwW2luZGV4QV1bdDJdIDogMDsKLSAgICB9Ci0KLSAgICBpZiAoZmlsdGVyaW5nRmxhZ3MgJiBGSUxURVJfVE9QX0VER0UpCi0gICAgewotICAgICAgICBxcFRtcCA9IG1iLT5tYkItPnFwWTsKLSAgICAgICAgaWYgKHFwVG1wICE9IHFwKQotICAgICAgICB7Ci0gICAgICAgICAgICB1MzIgdDEsIHQyLCB0MywgdDQ7Ci0gICAgICAgICAgICBxcEF2ID0gKHFwICsgcXBUbXAgKyAxKSA+PiAxOwotCi0gICAgICAgICAgICBpbmRleEEgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwQXYgKyBtYi0+ZmlsdGVyT2Zmc2V0QSk7Ci0gICAgICAgICAgICBpbmRleEIgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwQXYgKyBtYi0+ZmlsdGVyT2Zmc2V0Qik7Ci0KLSAgICAgICAgICAgIGFscGhhWzFdWzBdID0gYWxwaGFzW2luZGV4QV07Ci0gICAgICAgICAgICBiZXRhWzFdWzBdID0gYmV0YXNbaW5kZXhCXTsKLSAgICAgICAgICAgIHQxID0gYnNbMV1bMF07Ci0gICAgICAgICAgICB0MiA9IGJzWzFdWzFdOwotICAgICAgICAgICAgdDMgPSBic1sxXVsyXTsKLSAgICAgICAgICAgIHQ0ID0gYnNbMV1bM107Ci0gICAgICAgICAgICB0aHJlc2hvbGRbMV1bMF0gPSAodDEgJiYgKHQxIDwgNCkpID8gdGMwW2luZGV4QV1bdDFdIDogMDsKLSAgICAgICAgICAgIHRocmVzaG9sZFsxXVsxXSA9ICh0MiAmJiAodDIgPCA0KSkgPyB0YzBbaW5kZXhBXVt0Ml0gOiAwOwotICAgICAgICAgICAgdGhyZXNob2xkWzFdWzJdID0gKHQzICYmICh0MyA8IDQpKSA/IHRjMFtpbmRleEFdW3QzXSA6IDA7Ci0gICAgICAgICAgICB0aHJlc2hvbGRbMV1bM10gPSAodDQgJiYgKHQ0IDwgNCkpID8gdGMwW2luZGV4QV1bdDRdIDogMDsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoZmlsdGVyaW5nRmxhZ3MgJiBGSUxURVJfTEVGVF9FREdFKQotICAgIHsKLSAgICAgICAgcXBUbXAgPSBtYi0+bWJBLT5xcFk7Ci0gICAgICAgIGlmIChxcFRtcCAhPSBxcCkKLSAgICAgICAgewotICAgICAgICAgICAgcXBBdiA9IChxcCArIHFwVG1wICsgMSkgPj4gMTsKLQotICAgICAgICAgICAgaW5kZXhBID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcEF2ICsgbWItPmZpbHRlck9mZnNldEEpOwotICAgICAgICAgICAgaW5kZXhCID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcEF2ICsgbWItPmZpbHRlck9mZnNldEIpOwotCi0gICAgICAgICAgICBhbHBoYVswXVswXSA9IGFscGhhc1tpbmRleEFdOwotICAgICAgICAgICAgYmV0YVswXVswXSA9IGJldGFzW2luZGV4Ql07Ci0gICAgICAgICAgICB0aHJlc2hvbGRbMF1bMF0gPSAoYnNbMF1bMF0gJiYgKGJzWzBdWzBdIDwgNCkpID8gdGMwW2luZGV4QV1bYnNbMF1bMF1dIDogMDsKLSAgICAgICAgICAgIHRocmVzaG9sZFswXVsxXSA9IChic1swXVsxXSAmJiAoYnNbMF1bMV0gPCA0KSkgPyB0YzBbaW5kZXhBXVtic1swXVsxXV0gOiAwOwotICAgICAgICAgICAgdGhyZXNob2xkWzBdWzJdID0gKGJzWzBdWzJdICYmIChic1swXVsyXSA8IDQpKSA/IHRjMFtpbmRleEFdW2JzWzBdWzJdXSA6IDA7Ci0gICAgICAgICAgICB0aHJlc2hvbGRbMF1bM10gPSAoYnNbMF1bM10gJiYgKGJzWzBdWzNdIDwgNCkpID8gdGMwW2luZGV4QV1bYnNbMF1bM11dIDogMDsKLSAgICAgICAgfQotICAgIH0KLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEdldENocm9tYUVkZ2VUaHJlc2hvbGRzCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIENvbXB1dGUgYWxwaGEsIGJldGEgYW5kIHRjMCB0aHJlc2hvbGRzIGZvciBpbm5lciwgbGVmdCBhbmQgdG9wCi0gICAgICAgICAgICBjaHJvbWEgZWRnZXMgb2YgYSBtYWNyb2Jsb2NrLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBHZXRDaHJvbWFFZGdlVGhyZXNob2xkcygKLSAgICBtYlN0b3JhZ2VfdCAqbWIsCi0gICAgdTggKCphbHBoYSlbMl0sCi0gICAgdTggKCpiZXRhKVsyXSwKLSAgICB1OCAoKnRocmVzaG9sZClbOF0sCi0gICAgdTggKCpicylbMTZdLAotICAgIHUzMiBmaWx0ZXJpbmdGbGFncywKLSAgICBpMzIgY2hyb21hUXBJbmRleE9mZnNldCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaW5kZXhBLCBpbmRleEI7Ci0gICAgdTMyIHFwQXYsIHFwLCBxcFRtcDsKLSAgICB1MzIgaTsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHRocmVzaG9sZCk7Ci0gICAgQVNTRVJUKGJzKTsKLSAgICBBU1NFUlQoYmV0YSk7Ci0gICAgQVNTRVJUKGFscGhhKTsKLSAgICBBU1NFUlQobWIpOwotICAgIEFTU0VSVChtYik7Ci0KLSAgICBxcCA9IG1iLT5xcFk7Ci0gICAgcXAgPSBoMjY0YnNkUXBDW0NMSVAzKDAsIDUxLCAoaTMyKXFwICsgY2hyb21hUXBJbmRleE9mZnNldCldOwotCi0gICAgaW5kZXhBID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcCArIG1iLT5maWx0ZXJPZmZzZXRBKTsKLSAgICBpbmRleEIgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwICsgbWItPmZpbHRlck9mZnNldEIpOwotCi0gICAgYWxwaGFbMF1bMV0gPSBhbHBoYXNbaW5kZXhBXTsKLSAgICBhbHBoYVsxXVsxXSA9IGFscGhhc1tpbmRleEFdOwotICAgIGFscGhhWzFdWzBdID0gYWxwaGFzW2luZGV4QV07Ci0gICAgYWxwaGFbMF1bMF0gPSBhbHBoYXNbaW5kZXhBXTsKLSAgICBiZXRhWzBdWzFdID0gYmV0YXNbaW5kZXhCXTsKLSAgICBiZXRhWzFdWzFdID0gYmV0YXNbaW5kZXhCXTsKLSAgICBiZXRhWzFdWzBdID0gYmV0YXNbaW5kZXhCXTsKLSAgICBiZXRhWzBdWzBdID0gYmV0YXNbaW5kZXhCXTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCi0gICAgewotICAgICAgICB1MzIgdDEsIHQyOwotCi0gICAgICAgIHQxID0gYnNbaV1bMF07Ci0gICAgICAgIHQyID0gYnNbaV1bMV07Ci0gICAgICAgIHRocmVzaG9sZFtpXVswXSAgPSAodDEpID8gdGMwW2luZGV4QV1bdDFdIDogMDsKLSAgICAgICAgdDEgPSBic1tpXVsyXTsKLSAgICAgICAgdGhyZXNob2xkW2ldWzFdICA9ICh0MikgPyB0YzBbaW5kZXhBXVt0Ml0gOiAwOwotICAgICAgICB0MiA9IGJzW2ldWzNdOwotICAgICAgICB0aHJlc2hvbGRbaV1bMl0gID0gKHQxKSA/IHRjMFtpbmRleEFdW3QxXSA6IDA7Ci0gICAgICAgIHQxID0gYnNbaV1bOF07Ci0gICAgICAgIHRocmVzaG9sZFtpXVszXSAgPSAodDIpID8gdGMwW2luZGV4QV1bdDJdIDogMDsKLSAgICAgICAgdDIgPSBic1tpXVs5XTsKLSAgICAgICAgdGhyZXNob2xkW2ldWzRdICA9ICh0MSkgPyB0YzBbaW5kZXhBXVt0MV0gOiAwOwotICAgICAgICB0MSA9IGJzW2ldWzEwXTsKLSAgICAgICAgdGhyZXNob2xkW2ldWzVdICA9ICh0MikgPyB0YzBbaW5kZXhBXVt0Ml0gOiAwOwotICAgICAgICB0MiA9IGJzW2ldWzExXTsKLSAgICAgICAgdGhyZXNob2xkW2ldWzZdICA9ICh0MSkgPyB0YzBbaW5kZXhBXVt0MV0gOiAwOwotICAgICAgICB0aHJlc2hvbGRbaV1bN10gID0gKHQyKSA/IHRjMFtpbmRleEFdW3QyXSA6IDA7Ci0gICAgfQotCi0gICAgaWYgKGZpbHRlcmluZ0ZsYWdzICYgRklMVEVSX1RPUF9FREdFKQotICAgIHsKLSAgICAgICAgcXBUbXAgPSBtYi0+bWJCLT5xcFk7Ci0gICAgICAgIGlmIChxcFRtcCAhPSBtYi0+cXBZKQotICAgICAgICB7Ci0gICAgICAgICAgICB1MzIgdDEsIHQyLCB0MywgdDQ7Ci0gICAgICAgICAgICBxcFRtcCA9IGgyNjRic2RRcENbQ0xJUDMoMCwgNTEsIChpMzIpcXBUbXAgKyBjaHJvbWFRcEluZGV4T2Zmc2V0KV07Ci0gICAgICAgICAgICBxcEF2ID0gKHFwICsgcXBUbXAgKyAxKSA+PiAxOwotCi0gICAgICAgICAgICBpbmRleEEgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwQXYgKyBtYi0+ZmlsdGVyT2Zmc2V0QSk7Ci0gICAgICAgICAgICBpbmRleEIgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwQXYgKyBtYi0+ZmlsdGVyT2Zmc2V0Qik7Ci0KLSAgICAgICAgICAgIGFscGhhWzFdWzBdID0gYWxwaGFzW2luZGV4QV07Ci0gICAgICAgICAgICBiZXRhWzFdWzBdID0gYmV0YXNbaW5kZXhCXTsKLQotICAgICAgICAgICAgdDEgPSBic1sxXVswXTsKLSAgICAgICAgICAgIHQyID0gYnNbMV1bMV07Ci0gICAgICAgICAgICB0MyA9IGJzWzFdWzJdOwotICAgICAgICAgICAgdDQgPSBic1sxXVszXTsKLSAgICAgICAgICAgIHRocmVzaG9sZFsxXVswXSA9ICh0MSkgPyB0YzBbaW5kZXhBXVt0MV0gOiAwOwotICAgICAgICAgICAgdGhyZXNob2xkWzFdWzFdID0gKHQyKSA/IHRjMFtpbmRleEFdW3QyXSA6IDA7Ci0gICAgICAgICAgICB0aHJlc2hvbGRbMV1bMl0gPSAodDMpID8gdGMwW2luZGV4QV1bdDNdIDogMDsKLSAgICAgICAgICAgIHRocmVzaG9sZFsxXVszXSA9ICh0NCkgPyB0YzBbaW5kZXhBXVt0NF0gOiAwOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChmaWx0ZXJpbmdGbGFncyAmIEZJTFRFUl9MRUZUX0VER0UpCi0gICAgewotICAgICAgICBxcFRtcCA9IG1iLT5tYkEtPnFwWTsKLSAgICAgICAgaWYgKHFwVG1wICE9IG1iLT5xcFkpCi0gICAgICAgIHsKLQotICAgICAgICAgICAgcXBUbXAgPSBoMjY0YnNkUXBDW0NMSVAzKDAsIDUxLCAoaTMyKXFwVG1wICsgY2hyb21hUXBJbmRleE9mZnNldCldOwotICAgICAgICAgICAgcXBBdiA9IChxcCArIHFwVG1wICsgMSkgPj4gMTsKLQotICAgICAgICAgICAgaW5kZXhBID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcEF2ICsgbWItPmZpbHRlck9mZnNldEEpOwotICAgICAgICAgICAgaW5kZXhCID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcEF2ICsgbWItPmZpbHRlck9mZnNldEIpOwotCi0gICAgICAgICAgICBhbHBoYVswXVswXSA9IGFscGhhc1tpbmRleEFdOwotICAgICAgICAgICAgYmV0YVswXVswXSA9IGJldGFzW2luZGV4Ql07Ci0gICAgICAgICAgICB0aHJlc2hvbGRbMF1bMF0gPSAoYnNbMF1bMF0pID8gdGMwW2luZGV4QV1bYnNbMF1bMF1dIDogMDsKLSAgICAgICAgICAgIHRocmVzaG9sZFswXVsxXSA9IChic1swXVsxXSkgPyB0YzBbaW5kZXhBXVtic1swXVsxXV0gOiAwOwotICAgICAgICAgICAgdGhyZXNob2xkWzBdWzJdID0gKGJzWzBdWzJdKSA/IHRjMFtpbmRleEFdW2JzWzBdWzJdXSA6IDA7Ci0gICAgICAgICAgICB0aHJlc2hvbGRbMF1bM10gPSAoYnNbMF1bM10pID8gdGMwW2luZGV4QV1bYnNbMF1bM11dIDogMDsKLSAgICAgICAgfQotICAgIH0KLQotfQotCi0jZW5kaWYgLyogSDI2NERFQ19PTVhETCAqLwotCi0vKmxpbnQgK2U3MDEgK2U3MDIgKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2RlYmxvY2tpbmcuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9kZWJsb2NraW5nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NzFkZGEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2RlYmxvY2tpbmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0gICAgMy4gRGF0YSB0eXBlcwotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBIMjY0U1dERUNfREVCTE9DS0lOR19ICi0jZGVmaW5lIEgyNjRTV0RFQ19ERUJMT0NLSU5HX0gKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJiYXNldHlwZS5oIgotI2luY2x1ZGUgImgyNjRic2RfaW1hZ2UuaCIKLSNpbmNsdWRlICJoMjY0YnNkX21hY3JvYmxvY2tfbGF5ZXIuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBEYXRhIHR5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgaDI2NGJzZEZpbHRlclBpY3R1cmUoCi0gIGltYWdlX3QgKmltYWdlLAotICBtYlN0b3JhZ2VfdCAqbWIpOwotCi0jZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19ERUJMT0NLSU5HX0ggKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2RlY29kZXIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9kZWNvZGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhYzQ4MGYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2RlY29kZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDk2MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0gICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0gICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLSAgICAgNS4gRnVuY3Rpb25zCi0gICAgICAgICAgaDI2NGJzZEluaXQKLSAgICAgICAgICBoMjY0YnNkRGVjb2RlCi0gICAgICAgICAgaDI2NGJzZFNodXRkb3duCi0gICAgICAgICAgaDI2NGJzZEN1cnJlbnRJbWFnZQotICAgICAgICAgIGgyNjRic2ROZXh0T3V0cHV0UGljdHVyZQotICAgICAgICAgIGgyNjRic2RQaWNXaWR0aAotICAgICAgICAgIGgyNjRic2RQaWNIZWlnaHQKLSAgICAgICAgICBoMjY0YnNkRmx1c2hCdWZmZXIKLSAgICAgICAgICBoMjY0YnNkQ2hlY2tWYWxpZFBhcmFtU2V0cwotICAgICAgICAgIGgyNjRic2RWaWRlb1JhbmdlCi0gICAgICAgICAgaDI2NGJzZE1hdHJpeENvZWZmaWNpZW50cwotICAgICAgICAgIGgyNjRic2RDcm9wcGluZ1BhcmFtcwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImgyNjRic2RfZGVjb2Rlci5oIgotI2luY2x1ZGUgImgyNjRic2RfbmFsX3VuaXQuaCIKLSNpbmNsdWRlICJoMjY0YnNkX2J5dGVfc3RyZWFtLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9zZXFfcGFyYW1fc2V0LmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9waWNfcGFyYW1fc2V0LmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9zbGljZV9oZWFkZXIuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3NsaWNlX2RhdGEuaCIKLSNpbmNsdWRlICJoMjY0YnNkX25laWdoYm91ci5oIgotI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgotI2luY2x1ZGUgImgyNjRic2RfZHBiLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9kZWJsb2NraW5nLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9jb25jZWFsLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uIG5hbWU6IGgyNjRic2RJbml0Ci0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEluaXRpYWxpemUgdGhlIGRlY29kZXIuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgbm9PdXRwdXRSZW9yZGVyaW5nICBmbGFnIHRvIGluZGljYXRlIHRoZSBkZWNvZGVyIHRoYXQgaXQgZG9lcyBub3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZSB0byBwZXJmb3JtIHJlb3JkZXJpbmcgb2YgZGlzcGxheSBpbWFnZXMuCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIHBTdG9yYWdlICAgICAgICAgICAgcG9pbnRlciB0byBpbml0aWFsaXplZCBzdG9yYWdlIHN0cnVjdHVyZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBub25lCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkSW5pdChzdG9yYWdlX3QgKnBTdG9yYWdlLCB1MzIgbm9PdXRwdXRSZW9yZGVyaW5nKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLSAgICB1MzIgc2l6ZTsKLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RvcmFnZSk7Ci0KLSAgICBoMjY0YnNkSW5pdFN0b3JhZ2UocFN0b3JhZ2UpOwotCi0gICAgLyogYWxsb2NhdGUgbWJMYXllciB0byBiZSBuZXh0IG11bHRpcGxlIG9mIDY0IHRvIGVuYWJsZSB1c2Ugb2YKLSAgICAgKiBzcGVjaWZpYyBORU9OIG9wdGltaXplZCAibWVtc2V0IiBmb3IgY2xlYXJpbmcgdGhlIHN0cnVjdHVyZSAqLwotICAgIHNpemUgPSAoc2l6ZW9mKG1hY3JvYmxvY2tMYXllcl90KSArIDYzKSAmIH4weDNGOwotCi0gICAgcFN0b3JhZ2UtPm1iTGF5ZXIgPSAobWFjcm9ibG9ja0xheWVyX3QqKUgyNjRTd0RlY01hbGxvYyhzaXplLCAxKTsKLSAgICBpZiAoIXBTdG9yYWdlLT5tYkxheWVyKQotICAgICAgICByZXR1cm4gSEFOVFJPX05PSzsKLQotICAgIGlmIChub091dHB1dFJlb3JkZXJpbmcpCi0gICAgICAgIHBTdG9yYWdlLT5ub1Jlb3JkZXJpbmcgPSBIQU5UUk9fVFJVRTsKLQotICAgIHJldHVybiBIQU5UUk9fT0s7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZERlY29kZQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBEZWNvZGUgYSBOQUwgdW5pdC4gVGhpcyBmdW5jdGlvbiBjYWxscyBvdGhlciBtb2R1bGVzIHRvIHBlcmZvcm0KLSAgICAgICAgICAgIHRhc2tzIGxpa2UKLSAgICAgICAgICAgICAgICAqIGV4dHJhY3QgYW5kIGRlY29kZSBOQUwgdW5pdCBmcm9tIHRoZSBieXRlIHN0cmVhbQotICAgICAgICAgICAgICAgICogZGVjb2RlIHBhcmFtZXRlciBzZXRzCi0gICAgICAgICAgICAgICAgKiBkZWNvZGUgc2xpY2UgaGVhZGVyIGFuZCBzbGljZSBkYXRhCi0gICAgICAgICAgICAgICAgKiBjb25jZWFsIGVycm9ycyBpbiB0aGUgcGljdHVyZQotICAgICAgICAgICAgICAgICogcGVyZm9ybSBkZWJsb2NraW5nIGZpbHRlcmluZwotCi0gICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGNvbnRhaW5zIHRvcCBsZXZlbCBjb250cm9sIGxvZ2ljIG9mIHRoZSBkZWNvZGVyLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdG9yYWdlICAgICAgICBwb2ludGVyIHRvIHN0b3JhZ2UgZGF0YSBzdHJ1Y3R1cmUKLSAgICAgICAgICAgIGJ5dGVTdHJtICAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBidWZmZXIgZ2l2ZW4gYnkgYXBwbGljYXRpb24KLSAgICAgICAgICAgIGxlbiAgICAgICAgICAgICBsZW5ndGggb2YgdGhlIGJ1ZmZlciBpbiBieXRlcwotICAgICAgICAgICAgcGljSWQgICAgICAgICAgIGlkZW50aWZpZXIgZm9yIGEgcGljdHVyZSwgYXNzaWduZWQgYnkgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24KLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgcmVhZEJ5dGVzICAgICAgIG51bWJlciBvZiBieXRlcyByZWFkIGZyb20gdGhlIHN0cmVhbSBpcyBzdG9yZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEgyNjRCU0RfUkRZICAgICAgICAgICAgIGRlY29kaW5nIGZpbmlzaGVkLCBub3RoaW5nIHNwZWNpYWwKLSAgICAgICAgICAgIEgyNjRCU0RfUElDX1JEWSAgICAgICAgIGRlY29kaW5nIG9mIGEgcGljdHVyZSBmaW5pc2hlZAotICAgICAgICAgICAgSDI2NEJTRF9IRFJTX1JEWSAgICAgICAgcGFyYW0gc2V0cyBhY3RpdmF0ZWQsIGluZm9ybWF0aW9uIGxpa2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3R1cmUgZGltZW5zaW9ucyBldGMgY2FuIGJlIHJlYWQKLSAgICAgICAgICAgIEgyNjRCU0RfRVJST1IgICAgICAgICAgIGVycm9yIGluIGRlY29kaW5nCi0gICAgICAgICAgICBIMjY0QlNEX1BBUkFNX1NFVF9FUlJPUiBzZXJpdXMgZXJyb3IgaW4gZGVjb2RpbmcsIGZhaWxlZCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZhdGUgcGFyYW0gc2V0cwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZERlY29kZShzdG9yYWdlX3QgKnBTdG9yYWdlLCB1OCAqYnl0ZVN0cm0sIHUzMiBsZW4sIHUzMiBwaWNJZCwKLSAgICB1MzIgKnJlYWRCeXRlcykKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wLCBwcHNJZCwgc3BzSWQ7Ci0gICAgaTMyIHBpY09yZGVyQ250OwotICAgIG5hbFVuaXRfdCBuYWxVbml0OwotICAgIHNlcVBhcmFtU2V0X3Qgc2VxUGFyYW1TZXQ7Ci0gICAgcGljUGFyYW1TZXRfdCBwaWNQYXJhbVNldDsKLSAgICBzdHJtRGF0YV90IHN0cm07Ci0gICAgdTMyIGFjY2Vzc1VuaXRCb3VuZGFyeUZsYWcgPSBIQU5UUk9fRkFMU0U7Ci0gICAgdTMyIHBpY1JlYWR5ID0gSEFOVFJPX0ZBTFNFOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0b3JhZ2UpOwotICAgIEFTU0VSVChieXRlU3RybSk7Ci0gICAgQVNTRVJUKGxlbik7Ci0gICAgQVNTRVJUKHJlYWRCeXRlcyk7Ci0KLSAgICAvKiBpZiBwcmV2aW91cyBidWZmZXIgd2FzIG5vdCBmaW5pc2hlZCBhbmQgc2FtZSBwb2ludGVyIGdpdmVuIC0+IHNraXAgTkFMCi0gICAgICogdW5pdCBleHRyYWN0aW9uICovCi0gICAgaWYgKHBTdG9yYWdlLT5wcmV2QnVmTm90RmluaXNoZWQgJiYgYnl0ZVN0cm0gPT0gcFN0b3JhZ2UtPnByZXZCdWZQb2ludGVyKQotICAgIHsKLSAgICAgICAgc3RybSA9IHBTdG9yYWdlLT5zdHJtWzBdOwotICAgICAgICBzdHJtLnBTdHJtQ3VyclBvcyA9IHN0cm0ucFN0cm1CdWZmU3RhcnQ7Ci0gICAgICAgIHN0cm0uc3RybUJ1ZmZSZWFkQml0cyA9IHN0cm0uYml0UG9zSW5Xb3JkID0gMDsKLSAgICAgICAgKnJlYWRCeXRlcyA9IHBTdG9yYWdlLT5wcmV2Qnl0ZXNDb25zdW1lZDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdG1wID0gaDI2NGJzZEV4dHJhY3ROYWxVbml0KGJ5dGVTdHJtLCBsZW4sICZzdHJtLCByZWFkQnl0ZXMpOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgewotICAgICAgICAgICAgRVBSSU5UKCJCWVRFX1NUUkVBTSIpOwotICAgICAgICAgICAgcmV0dXJuKEgyNjRCU0RfRVJST1IpOwotICAgICAgICB9Ci0gICAgICAgIC8qIHN0b3JlIHN0cmVhbSAqLwotICAgICAgICBwU3RvcmFnZS0+c3RybVswXSA9IHN0cm07Ci0gICAgICAgIHBTdG9yYWdlLT5wcmV2Qnl0ZXNDb25zdW1lZCA9ICpyZWFkQnl0ZXM7Ci0gICAgICAgIHBTdG9yYWdlLT5wcmV2QnVmUG9pbnRlciA9IGJ5dGVTdHJtOwotICAgIH0KLSAgICBwU3RvcmFnZS0+cHJldkJ1Zk5vdEZpbmlzaGVkID0gSEFOVFJPX0ZBTFNFOwotCi0gICAgdG1wID0gaDI2NGJzZERlY29kZU5hbFVuaXQoJnN0cm0sICZuYWxVbml0KTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICB7Ci0gICAgICAgIEVQUklOVCgiTkFMX1VOSVQiKTsKLSAgICAgICAgcmV0dXJuKEgyNjRCU0RfRVJST1IpOwotICAgIH0KLQotICAgIC8qIERpc2NhcmQgdW5zcGVjaWZpZWQsIHJlc2VydmVkLCBTUFMgZXh0ZW5zaW9uIGFuZCBhdXhpbGlhcnkgcGljdHVyZSBzbGljZXMgKi8KLSAgICBpZihuYWxVbml0Lm5hbFVuaXRUeXBlID09IDAgfHwgbmFsVW5pdC5uYWxVbml0VHlwZSA+PSAxMykKLSAgICB7Ci0gICAgICAgIERFQlVHKCgiRElTQ0FSREVEIE5BTCAoVU5TUEVDSUZJRUQsIFJFR0lTVEVSRUQsIFNQUyBleHQgb3IgQVVYIHNsaWNlKVxuIikpOwotICAgICAgICByZXR1cm4oSDI2NEJTRF9SRFkpOwotICAgIH0KLQotICAgIHRtcCA9IGgyNjRic2RDaGVja0FjY2Vzc1VuaXRCb3VuZGFyeSgKLSAgICAgICZzdHJtLAotICAgICAgJm5hbFVuaXQsCi0gICAgICBwU3RvcmFnZSwKLSAgICAgICZhY2Nlc3NVbml0Qm91bmRhcnlGbGFnKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICB7Ci0gICAgICAgIEVQUklOVCgiQUNDRVNTIFVOSVQgQk9VTkRBUlkgQ0hFQ0siKTsKLSAgICAgICAgaWYgKHRtcCA9PSBQQVJBTV9TRVRfRVJST1IpCi0gICAgICAgICAgICByZXR1cm4oSDI2NEJTRF9QQVJBTV9TRVRfRVJST1IpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4oSDI2NEJTRF9FUlJPUik7Ci0gICAgfQotCi0gICAgaWYgKCBhY2Nlc3NVbml0Qm91bmRhcnlGbGFnICkKLSAgICB7Ci0gICAgICAgIERFQlVHKCgiQWNjZXNzIHVuaXQgYm91bmRhcnlcbiIpKTsKLSAgICAgICAgLyogY29uY2VhbCBpZiBwaWN0dXJlIHN0YXJ0ZWQgYW5kIHBhcmFtIHNldHMgYWN0aXZhdGVkICovCi0gICAgICAgIGlmIChwU3RvcmFnZS0+cGljU3RhcnRlZCAmJiBwU3RvcmFnZS0+YWN0aXZlU3BzICE9IE5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIERFQlVHKCgiQ09OQ0VBTElORy4uLiIpKTsKLQotICAgICAgICAgICAgLyogcmV0dXJuIGVycm9yIGlmIHNlY29uZCBwaGFzZSBvZgotICAgICAgICAgICAgICogaW5pdGlhbGl6YXRpb24gaXMgbm90IGNvbXBsZXRlZCAqLwotICAgICAgICAgICAgaWYgKHBTdG9yYWdlLT5wZW5kaW5nQWN0aXZhdGlvbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFUFJJTlQoIlBlbmRpbmcgYWN0aXZhdGlvbiBub3QgY29tcGxldGVkIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChIMjY0QlNEX0VSUk9SKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFwU3RvcmFnZS0+dmFsaWRTbGljZUluQWNjZXNzVW5pdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwU3RvcmFnZS0+Y3VyckltYWdlLT5kYXRhID0KLSAgICAgICAgICAgICAgICAgICAgaDI2NGJzZEFsbG9jYXRlRHBiSW1hZ2UocFN0b3JhZ2UtPmRwYik7Ci0gICAgICAgICAgICAgICAgaDI2NGJzZEluaXRSZWZQaWNMaXN0KHBTdG9yYWdlLT5kcGIpOwotICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RDb25jZWFsKHBTdG9yYWdlLCBwU3RvcmFnZS0+Y3VyckltYWdlLCBQX1NMSUNFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkQ29uY2VhbChwU3RvcmFnZSwgcFN0b3JhZ2UtPmN1cnJJbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPnNsaWNlSGVhZGVyLT5zbGljZVR5cGUpOwotCi0gICAgICAgICAgICBwaWNSZWFkeSA9IEhBTlRST19UUlVFOwotCi0gICAgICAgICAgICAvKiBjdXJyZW50IE5BTCB1bml0IHNob3VsZCBiZSBkZWNvZGVkIG9uIG5leHQgYWN0aXZhdGlvbiAtPiBzZXQKLSAgICAgICAgICAgICAqIHJlYWRCeXRlcyB0byAwICovCi0gICAgICAgICAgICAqcmVhZEJ5dGVzID0gMDsKLSAgICAgICAgICAgIHBTdG9yYWdlLT5wcmV2QnVmTm90RmluaXNoZWQgPSBIQU5UUk9fVFJVRTsKLSAgICAgICAgICAgIERFQlVHKCgiLi4uRE9ORVxuIikpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcFN0b3JhZ2UtPnZhbGlkU2xpY2VJbkFjY2Vzc1VuaXQgPSBIQU5UUk9fRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgcFN0b3JhZ2UtPnNraXBSZWR1bmRhbnRTbGljZXMgPSBIQU5UUk9fRkFMU0U7Ci0gICAgfQotCi0gICAgaWYgKCFwaWNSZWFkeSkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAobmFsVW5pdC5uYWxVbml0VHlwZSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBOQUxfU0VRX1BBUkFNX1NFVDoKLSAgICAgICAgICAgICAgICBERUJVRygoIlNFUSBQQVJBTSBTRVRcbiIpKTsKLSAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlU2VxUGFyYW1TZXQoJnN0cm0sICZzZXFQYXJhbVNldCk7Ci0gICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBFUFJJTlQoIlNFUV9QQVJBTV9TRVQiKTsKLSAgICAgICAgICAgICAgICAgICAgRlJFRShzZXFQYXJhbVNldC5vZmZzZXRGb3JSZWZGcmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIEZSRUUoc2VxUGFyYW1TZXQudnVpUGFyYW1ldGVycyk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybihIMjY0QlNEX0VSUk9SKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZFN0b3JlU2VxUGFyYW1TZXQocFN0b3JhZ2UsICZzZXFQYXJhbVNldCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTkFMX1BJQ19QQVJBTV9TRVQ6Ci0gICAgICAgICAgICAgICAgREVCVUcoKCJQSUMgUEFSQU0gU0VUXG4iKSk7Ci0gICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZVBpY1BhcmFtU2V0KCZzdHJtLCAmcGljUGFyYW1TZXQpOwotICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRVBSSU5UKCJQSUNfUEFSQU1fU0VUIik7Ci0gICAgICAgICAgICAgICAgICAgIEZSRUUocGljUGFyYW1TZXQucnVuTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgRlJFRShwaWNQYXJhbVNldC50b3BMZWZ0KTsKLSAgICAgICAgICAgICAgICAgICAgRlJFRShwaWNQYXJhbVNldC5ib3R0b21SaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgIEZSRUUocGljUGFyYW1TZXQuc2xpY2VHcm91cElkKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEgyNjRCU0RfRVJST1IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkU3RvcmVQaWNQYXJhbVNldChwU3RvcmFnZSwgJnBpY1BhcmFtU2V0KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBOQUxfQ09ERURfU0xJQ0VfSURSOgotICAgICAgICAgICAgICAgIERFQlVHKCgiSURSICIpKTsKLSAgICAgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgICAgICAgIGNhc2UgTkFMX0NPREVEX1NMSUNFOgotICAgICAgICAgICAgICAgIERFQlVHKCgiU0xJQ0UgSEVBREVSXG4iKSk7Ci0KLSAgICAgICAgICAgICAgICAvKiBwaWN0dXJlIHN1Y2Nlc3NmdWxseSBmaW5pc2hlZCBhbmQgc3RpbGwgZGVjb2Rpbmcgc2FtZSBvbGQKLSAgICAgICAgICAgICAgICAgKiBhY2Nlc3MgdW5pdCAtPiBubyBuZWVkIHRvIGRlY29kZSByZWR1bmRhbnQgc2xpY2VzICovCi0gICAgICAgICAgICAgICAgaWYgKHBTdG9yYWdlLT5za2lwUmVkdW5kYW50U2xpY2VzKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSDI2NEJTRF9SRFkpOwotCi0gICAgICAgICAgICAgICAgcFN0b3JhZ2UtPnBpY1N0YXJ0ZWQgPSBIQU5UUk9fVFJVRTsKLQotICAgICAgICAgICAgICAgIGlmIChoMjY0YnNkSXNTdGFydE9mUGljdHVyZShwU3RvcmFnZSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+bnVtQ29uY2VhbGVkTWJzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmN1cnJlbnRQaWNJZCAgICA9IHBpY0lkOwotCi0gICAgICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RDaGVja1Bwc0lkKCZzdHJtLCAmcHBzSWQpOwotICAgICAgICAgICAgICAgICAgICBBU1NFUlQodG1wID09IEhBTlRST19PSyk7Ci0gICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlIG9sZCBhY3RpdmVTcHNJZCBhbmQgcmV0dXJuIGhlYWRlcnMgcmVhZHkKLSAgICAgICAgICAgICAgICAgICAgICogaW5kaWNhdGlvbiBpZiBhY3RpdmVTcHMgY2hhbmdlcyAqLwotICAgICAgICAgICAgICAgICAgICBzcHNJZCA9IHBTdG9yYWdlLT5hY3RpdmVTcHNJZDsKLSAgICAgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZEFjdGl2YXRlUGFyYW1TZXRzKHBTdG9yYWdlLCBwcHNJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU19JRFJfTkFMX1VOSVQoJm5hbFVuaXQpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBFUFJJTlQoIlBhcmFtIHNldCBhY3RpdmF0aW9uIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlUHBzSWQgPSBNQVhfTlVNX1BJQ19QQVJBTV9TRVRTOwotICAgICAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVBwcyA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzSWQgPSBNQVhfTlVNX1NFUV9QQVJBTV9TRVRTOwotICAgICAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcyA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+cGVuZGluZ0FjdGl2YXRpb24gPSBIQU5UUk9fRkFMU0U7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRtcCA9PSBNRU1PUllfQUxMT0NBVElPTl9FUlJPUikKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSDI2NEJTRF9NRU1BTExPQ19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oSDI2NEJTRF9QQVJBTV9TRVRfRVJST1IpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHNwc0lkICE9IHBTdG9yYWdlLT5hY3RpdmVTcHNJZCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc2VxUGFyYW1TZXRfdCAqb2xkU1BTID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcVBhcmFtU2V0X3QgKm5ld1NQUyA9IHBTdG9yYWdlLT5hY3RpdmVTcHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1MzIgbm9PdXRwdXRPZlByaW9yUGljc0ZsYWcgPSAxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihwU3RvcmFnZS0+b2xkU3BzSWQgPCBNQVhfTlVNX1NFUV9QQVJBTV9TRVRTKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZFNQUyA9IHBTdG9yYWdlLT5zcHNbcFN0b3JhZ2UtPm9sZFNwc0lkXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgKnJlYWRCeXRlcyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+cHJldkJ1Zk5vdEZpbmlzaGVkID0gSEFOVFJPX1RSVUU7Ci0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYobmFsVW5pdC5uYWxVbml0VHlwZSA9PSBOQUxfQ09ERURfU0xJQ0VfSURSKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZENoZWNrUHJpb3JQaWNzRmxhZygmbm9PdXRwdXRPZlByaW9yUGljc0ZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0cm0sIG5ld1NQUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlUHBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbFVuaXQubmFsVW5pdFR5cGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IEhBTlRST19OT0s7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCh0bXAgIT0gSEFOVFJPX09LKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5vT3V0cHV0T2ZQcmlvclBpY3NGbGFnICE9IDApIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAocFN0b3JhZ2UtPmRwYi0+bm9SZW9yZGVyaW5nKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9sZFNQUyA9PSBOVUxMKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9sZFNQUy0+cGljV2lkdGhJbk1icyAhPSBuZXdTUFMtPnBpY1dpZHRoSW5NYnMpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAob2xkU1BTLT5waWNIZWlnaHRJbk1icyAhPSBuZXdTUFMtPnBpY0hlaWdodEluTWJzKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9sZFNQUy0+bWF4RHBiU2l6ZSAhPSBuZXdTUFMtPm1heERwYlNpemUpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5kcGItPmZsdXNoZWQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RGbHVzaERwYihwU3RvcmFnZS0+ZHBiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPm9sZFNwc0lkID0gcFN0b3JhZ2UtPmFjdGl2ZVNwc0lkOwotCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oSDI2NEJTRF9IRFJTX1JEWSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiByZXR1cm4gZXJyb3IgaWYgc2Vjb25kIHBoYXNlIG9mCi0gICAgICAgICAgICAgICAgICogaW5pdGlhbGl6YXRpb24gaXMgbm90IGNvbXBsZXRlZCAqLwotICAgICAgICAgICAgICAgIGlmIChwU3RvcmFnZS0+cGVuZGluZ0FjdGl2YXRpb24pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBFUFJJTlQoIlBlbmRpbmcgYWN0aXZhdGlvbiBub3QgY29tcGxldGVkIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoSDI2NEJTRF9FUlJPUik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVTbGljZUhlYWRlcigmc3RybSwgcFN0b3JhZ2UtPnNsaWNlSGVhZGVyICsgMSwKLSAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcywgcFN0b3JhZ2UtPmFjdGl2ZVBwcywgJm5hbFVuaXQpOwotICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRVBSSU5UKCJTTElDRV9IRUFERVIiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEgyNjRCU0RfRVJST1IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoaDI2NGJzZElzU3RhcnRPZlBpY3R1cmUocFN0b3JhZ2UpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFJU19JRFJfTkFMX1VOSVQoJm5hbFVuaXQpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkQ2hlY2tHYXBzSW5GcmFtZU51bShwU3RvcmFnZS0+ZHBiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5zbGljZUhlYWRlclsxXS5mcmFtZU51bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYWxVbml0Lm5hbFJlZklkYyAhPSAwID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYXBzSW5GcmFtZU51bVZhbHVlQWxsb3dlZEZsYWcpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRVBSSU5UKCJHYXBzIGluIGZyYW1lIG51bSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihIMjY0QlNEX0VSUk9SKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+Y3VyckltYWdlLT5kYXRhID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RBbGxvY2F0ZURwYkltYWdlKHBTdG9yYWdlLT5kcGIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIHN0b3JlIHNsaWNlIGhlYWRlciB0byBzdG9yYWdlIGlmIHN1Y2Nlc3NmdWxseSBkZWNvZGVkICovCi0gICAgICAgICAgICAgICAgcFN0b3JhZ2UtPnNsaWNlSGVhZGVyWzBdID0gcFN0b3JhZ2UtPnNsaWNlSGVhZGVyWzFdOwotICAgICAgICAgICAgICAgIHBTdG9yYWdlLT52YWxpZFNsaWNlSW5BY2Nlc3NVbml0ID0gSEFOVFJPX1RSVUU7Ci0gICAgICAgICAgICAgICAgcFN0b3JhZ2UtPnByZXZOYWxVbml0WzBdID0gbmFsVW5pdDsKLQotICAgICAgICAgICAgICAgIGgyNjRic2RDb21wdXRlU2xpY2VHcm91cE1hcChwU3RvcmFnZSwKLSAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPnNsaWNlSGVhZGVyLT5zbGljZUdyb3VwQ2hhbmdlQ3ljbGUpOwotCi0gICAgICAgICAgICAgICAgaDI2NGJzZEluaXRSZWZQaWNMaXN0KHBTdG9yYWdlLT5kcGIpOwotICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RSZW9yZGVyUmVmUGljTGlzdChwU3RvcmFnZS0+ZHBiLAotICAgICAgICAgICAgICAgICAgICAmcFN0b3JhZ2UtPnNsaWNlSGVhZGVyLT5yZWZQaWNMaXN0UmVvcmRlcmluZywKLSAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPnNsaWNlSGVhZGVyLT5mcmFtZU51bSwKLSAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPnNsaWNlSGVhZGVyLT5udW1SZWZJZHhMMEFjdGl2ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBFUFJJTlQoIlJlb3JkZXJpbmciKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEgyNjRCU0RfRVJST1IpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIERFQlVHKCgiU0xJQ0UgREFUQSwgRklSU1QgJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+c2xpY2VIZWFkZXItPmZpcnN0TWJJblNsaWNlKSk7Ci0gICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZVNsaWNlRGF0YSgmc3RybSwgcFN0b3JhZ2UsCi0gICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5jdXJySW1hZ2UsIHBTdG9yYWdlLT5zbGljZUhlYWRlcik7Ci0gICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBFUFJJTlQoIlNMSUNFX0RBVEEiKTsKLSAgICAgICAgICAgICAgICAgICAgaDI2NGJzZE1hcmtTbGljZUNvcnJ1cHRlZChwU3RvcmFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5zbGljZUhlYWRlci0+Zmlyc3RNYkluU2xpY2UpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSDI2NEJTRF9FUlJPUik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGgyNjRic2RJc0VuZE9mUGljdHVyZShwU3RvcmFnZSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwaWNSZWFkeSA9IEhBTlRST19UUlVFOwotICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+c2tpcFJlZHVuZGFudFNsaWNlcyA9IEhBTlRST19UUlVFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBOQUxfU0VJOgotICAgICAgICAgICAgICAgIERFQlVHKCgiU0VJIE1FU1NBR0UsIE5PVCBERUNPREVEIikpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIERFQlVHKCgiTk9UIElNUExFTUVOVEVEIFlFVCAlZFxuIixuYWxVbml0Lm5hbFVuaXRUeXBlKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAocGljUmVhZHkpCi0gICAgewotICAgICAgICBoMjY0YnNkRmlsdGVyUGljdHVyZShwU3RvcmFnZS0+Y3VyckltYWdlLCBwU3RvcmFnZS0+bWIpOwotCi0gICAgICAgIGgyNjRic2RSZXNldFN0b3JhZ2UocFN0b3JhZ2UpOwotCi0gICAgICAgIHBpY09yZGVyQ250ID0gaDI2NGJzZERlY29kZVBpY09yZGVyQ250KHBTdG9yYWdlLT5wb2MsCi0gICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLCBwU3RvcmFnZS0+c2xpY2VIZWFkZXIsIHBTdG9yYWdlLT5wcmV2TmFsVW5pdCk7Ci0KLSAgICAgICAgaWYgKHBTdG9yYWdlLT52YWxpZFNsaWNlSW5BY2Nlc3NVbml0KQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocFN0b3JhZ2UtPnByZXZOYWxVbml0LT5uYWxSZWZJZGMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZE1hcmtEZWNSZWZQaWMocFN0b3JhZ2UtPmRwYiwKLSAgICAgICAgICAgICAgICAgICAgJnBTdG9yYWdlLT5zbGljZUhlYWRlci0+ZGVjUmVmUGljTWFya2luZywKLSAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmN1cnJJbWFnZSwgcFN0b3JhZ2UtPnNsaWNlSGVhZGVyLT5mcmFtZU51bSwKLSAgICAgICAgICAgICAgICAgICAgcGljT3JkZXJDbnQsCi0gICAgICAgICAgICAgICAgICAgIElTX0lEUl9OQUxfVU5JVChwU3RvcmFnZS0+cHJldk5hbFVuaXQpID8KLSAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0UsCi0gICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5jdXJyZW50UGljSWQsIHBTdG9yYWdlLT5udW1Db25jZWFsZWRNYnMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogbm9uLXJlZmVyZW5jZSBwaWN0dXJlLCBqdXN0IHN0b3JlIGZvciBwb3NzaWJsZSBkaXNwbGF5Ci0gICAgICAgICAgICAgKiByZW9yZGVyaW5nICovCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZE1hcmtEZWNSZWZQaWMocFN0b3JhZ2UtPmRwYiwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmN1cnJJbWFnZSwgcFN0b3JhZ2UtPnNsaWNlSGVhZGVyLT5mcmFtZU51bSwKLSAgICAgICAgICAgICAgICAgICAgcGljT3JkZXJDbnQsCi0gICAgICAgICAgICAgICAgICAgIElTX0lEUl9OQUxfVU5JVChwU3RvcmFnZS0+cHJldk5hbFVuaXQpID8KLSAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0UsCi0gICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5jdXJyZW50UGljSWQsIHBTdG9yYWdlLT5udW1Db25jZWFsZWRNYnMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcFN0b3JhZ2UtPnBpY1N0YXJ0ZWQgPSBIQU5UUk9fRkFMU0U7Ci0gICAgICAgIHBTdG9yYWdlLT52YWxpZFNsaWNlSW5BY2Nlc3NVbml0ID0gSEFOVFJPX0ZBTFNFOwotCi0gICAgICAgIHJldHVybihIMjY0QlNEX1BJQ19SRFkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHJldHVybihIMjY0QlNEX1JEWSk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkU2h1dGRvd24KLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgU2h1dGRvd24gYSBkZWNvZGVyIGluc3RhbmNlLiBGdW5jdGlvbiBmcmVlcyBhbGwgdGhlIG1lbW9yaWVzCi0gICAgICAgICAgICBhbGxvY2F0ZWQgZm9yIHRoZSBkZWNvZGVyIGluc3RhbmNlLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdG9yYWdlICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBkYXRhIHN0cnVjdHVyZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBub25lCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBoMjY0YnNkU2h1dGRvd24oc3RvcmFnZV90ICpwU3RvcmFnZSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaTsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdG9yYWdlKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX1NFUV9QQVJBTV9TRVRTOyBpKyspCi0gICAgewotICAgICAgICBpZiAocFN0b3JhZ2UtPnNwc1tpXSkKLSAgICAgICAgewotICAgICAgICAgICAgRlJFRShwU3RvcmFnZS0+c3BzW2ldLT5vZmZzZXRGb3JSZWZGcmFtZSk7Ci0gICAgICAgICAgICBGUkVFKHBTdG9yYWdlLT5zcHNbaV0tPnZ1aVBhcmFtZXRlcnMpOwotICAgICAgICAgICAgRlJFRShwU3RvcmFnZS0+c3BzW2ldKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX1BJQ19QQVJBTV9TRVRTOyBpKyspCi0gICAgewotICAgICAgICBpZiAocFN0b3JhZ2UtPnBwc1tpXSkKLSAgICAgICAgewotICAgICAgICAgICAgRlJFRShwU3RvcmFnZS0+cHBzW2ldLT5ydW5MZW5ndGgpOwotICAgICAgICAgICAgRlJFRShwU3RvcmFnZS0+cHBzW2ldLT50b3BMZWZ0KTsKLSAgICAgICAgICAgIEZSRUUocFN0b3JhZ2UtPnBwc1tpXS0+Ym90dG9tUmlnaHQpOwotICAgICAgICAgICAgRlJFRShwU3RvcmFnZS0+cHBzW2ldLT5zbGljZUdyb3VwSWQpOwotICAgICAgICAgICAgRlJFRShwU3RvcmFnZS0+cHBzW2ldKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEZSRUUocFN0b3JhZ2UtPm1iTGF5ZXIpOwotICAgIEZSRUUocFN0b3JhZ2UtPm1iKTsKLSAgICBGUkVFKHBTdG9yYWdlLT5zbGljZUdyb3VwTWFwKTsKLQotICAgIGgyNjRic2RGcmVlRHBiKHBTdG9yYWdlLT5kcGIpOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZE5leHRPdXRwdXRQaWN0dXJlCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEdldCBuZXh0IG91dHB1dCBwaWN0dXJlIGluIGRpc3BsYXkgb3JkZXIuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFN0b3JhZ2UgICAgcG9pbnRlciB0byBzdG9yYWdlIGRhdGEgc3RydWN0dXJlCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIHBpY0lkICAgICAgIGlkZW50aWZpZXIgb2YgdGhlIHBpY3R1cmUgd2lsbCBiZSBzdG9yZWQgaGVyZQotICAgICAgICAgICAgaXNJZHJQaWMgICAgSURSIGZsYWcgb2YgdGhlIHBpY3R1cmUgd2lsbCBiZSBzdG9yZWQgaGVyZQotICAgICAgICAgICAgbnVtRXJyTWJzICAgbnVtYmVyIG9mIGNvbmNlYWxlZCBtYWNyb2Jsb2NrcyBpbiB0aGUgcGljdHVyZQotICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBzdG9yZWQgaGVyZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBwaWN0dXJlIGRhdGEKLSAgICAgICAgICAgIE5VTEwgaWYgbm8gcGljdHVyZXMgYXZhaWxhYmxlIGZvciBkaXNwbGF5Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXU4KiBoMjY0YnNkTmV4dE91dHB1dFBpY3R1cmUoc3RvcmFnZV90ICpwU3RvcmFnZSwgdTMyICpwaWNJZCwgdTMyICppc0lkclBpYywKLSAgICB1MzIgKm51bUVyck1icykKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICBkcGJPdXRQaWN0dXJlX3QgKnBPdXQ7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RvcmFnZSk7Ci0KLSAgICBwT3V0ID0gaDI2NGJzZERwYk91dHB1dFBpY3R1cmUocFN0b3JhZ2UtPmRwYik7Ci0KLSAgICBpZiAocE91dCAhPSBOVUxMKQotICAgIHsKLSAgICAgICAgKnBpY0lkID0gcE91dC0+cGljSWQ7Ci0gICAgICAgICppc0lkclBpYyA9IHBPdXQtPmlzSWRyOwotICAgICAgICAqbnVtRXJyTWJzID0gcE91dC0+bnVtRXJyTWJzOwotICAgICAgICByZXR1cm4gKHBPdXQtPmRhdGEpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHJldHVybihOVUxMKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RQaWNXaWR0aAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBHZXQgd2lkdGggb2YgdGhlIHBpY3R1cmUgaW4gbWFjcm9ibG9ja3MKLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwU3RvcmFnZSAgICBwb2ludGVyIHRvIHN0b3JhZ2UgZGF0YSBzdHJ1Y3R1cmUKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgbm9uZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBwaWN0dXJlIHdpZHRoCi0gICAgICAgICAgICAwIGlmIHBhcmFtZXRlcnMgc2V0cyBub3QgeWV0IGFjdGl2YXRlZAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZFBpY1dpZHRoKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0b3JhZ2UpOwotCi0gICAgaWYgKHBTdG9yYWdlLT5hY3RpdmVTcHMpCi0gICAgICAgIHJldHVybihwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNXaWR0aEluTWJzKTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybigwKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RQaWNIZWlnaHQKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgR2V0IGhlaWdodCBvZiB0aGUgcGljdHVyZSBpbiBtYWNyb2Jsb2NrcwotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdG9yYWdlICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBkYXRhIHN0cnVjdHVyZQotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBub25lCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIHBpY3R1cmUgd2lkdGgKLSAgICAgICAgICAgIDAgaWYgcGFyYW1ldGVycyBzZXRzIG5vdCB5ZXQgYWN0aXZhdGVkCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkUGljSGVpZ2h0KHN0b3JhZ2VfdCAqcFN0b3JhZ2UpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0b3JhZ2UpOwotCi0gICAgaWYgKHBTdG9yYWdlLT5hY3RpdmVTcHMpCi0gICAgICAgIHJldHVybihwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNIZWlnaHRJbk1icyk7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4oMCk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkRmx1c2hCdWZmZXIKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRmx1c2ggdGhlIGRlY29kZWQgcGljdHVyZSBidWZmZXIsIHNlZSBkcGIuYyBmb3IgZGV0YWlscwotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdG9yYWdlICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBkYXRhIHN0cnVjdHVyZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIGgyNjRic2RGbHVzaEJ1ZmZlcihzdG9yYWdlX3QgKnBTdG9yYWdlKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdG9yYWdlKTsKLQotICAgIGgyNjRic2RGbHVzaERwYihwU3RvcmFnZS0+ZHBiKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RDaGVja1ZhbGlkUGFyYW1TZXRzCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIENoZWNrIGlmIGFueSB2YWxpZCBwYXJhbWV0ZXIgc2V0IGNvbWJpbmF0aW9ucyAoU1BTL1BQUykgZXhpc3RzLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdG9yYWdlICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBzdHJ1Y3R1cmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgMSAgICAgICBhdCBsZWFzdCBvbmUgdmFsaWQgU1BTL1BQUyBjb21iaW5hdGlvbiBmb3VuZAotICAgICAgICAgICAgMCAgICAgICBubyB2YWxpZCBwYXJhbSBzZXQgY29tYmluYXRpb25zIGZvdW5kCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2RDaGVja1ZhbGlkUGFyYW1TZXRzKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0b3JhZ2UpOwotCi0gICAgcmV0dXJuKGgyNjRic2RWYWxpZFBhcmFtU2V0cyhwU3RvcmFnZSkgPT0gSEFOVFJPX09LID8gMSA6IDApOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZFZpZGVvUmFuZ2UKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgR2V0IHZhbHVlIG9mIHZpZGVvX2Z1bGxfcmFuZ2VfZmxhZyByZWNlaXZlZCBpbiB0aGUgVlVJIGRhdGEuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFN0b3JhZ2UgICAgcG9pbnRlciB0byBzdG9yYWdlIHN0cnVjdHVyZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICAxICAgdmlkZW9fZnVsbF9yYW5nZV9mbGFnIHJlY2VpdmVkIGFuZCB2YWx1ZSBpcyAxCi0gICAgICAgICAgICAwICAgb3RoZXJ3aXNlCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkVmlkZW9SYW5nZShzdG9yYWdlX3QgKnBTdG9yYWdlKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdG9yYWdlKTsKLQotICAgIGlmIChwU3RvcmFnZS0+YWN0aXZlU3BzICYmIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnZ1aVBhcmFtZXRlcnNQcmVzZW50RmxhZyAmJgotICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT52dWlQYXJhbWV0ZXJzICYmCi0gICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnZ1aVBhcmFtZXRlcnMtPnZpZGVvU2lnbmFsVHlwZVByZXNlbnRGbGFnICYmCi0gICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnZ1aVBhcmFtZXRlcnMtPnZpZGVvRnVsbFJhbmdlRmxhZykKLSAgICAgICAgcmV0dXJuKDEpOwotICAgIGVsc2UgLyogZGVmYXVsdCB2YWx1ZSBvZiB2aWRlb19mdWxsX3JhbmdlX2ZsYWcgaXMgMCAqLwotICAgICAgICByZXR1cm4oMCk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkTWF0cml4Q29lZmZpY2llbnRzCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEdldCB2YWx1ZSBvZiBtYXRyaXhfY29lZmZpY2llbnRzIHJlY2VpdmVkIGluIHRoZSBWVUkgZGF0YQotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdG9yYWdlICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBzdHJ1Y3R1cmUKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgdmFsdWUgb2YgbWF0cml4X2NvZWZmaWNpZW50cyBpZiByZWNlaXZlZAotICAgICAgICAgICAgMiAgIG90aGVyd2lzZSAodGhpcyBpcyB0aGUgZGVmYXVsdCB2YWx1ZSkKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2RNYXRyaXhDb2VmZmljaWVudHMoc3RvcmFnZV90ICpwU3RvcmFnZSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RvcmFnZSk7Ci0KLSAgICBpZiAocFN0b3JhZ2UtPmFjdGl2ZVNwcyAmJiBwU3RvcmFnZS0+YWN0aXZlU3BzLT52dWlQYXJhbWV0ZXJzUHJlc2VudEZsYWcgJiYKLSAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+dnVpUGFyYW1ldGVycyAmJgotICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT52dWlQYXJhbWV0ZXJzLT52aWRlb1NpZ25hbFR5cGVQcmVzZW50RmxhZyAmJgotICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT52dWlQYXJhbWV0ZXJzLT5jb2xvdXJEZXNjcmlwdGlvblByZXNlbnRGbGFnKQotICAgICAgICByZXR1cm4ocFN0b3JhZ2UtPmFjdGl2ZVNwcy0+dnVpUGFyYW1ldGVycy0+bWF0cml4Q29lZmZpY2llbnRzKTsKLSAgICBlbHNlIC8qIGRlZmF1bHQgdW5zcGVjaWZpZWQgKi8KLSAgICAgICAgcmV0dXJuKDIpOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaGgyNjRic2RDcm9wcGluZ1BhcmFtcwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBHZXQgY3JvcHBpbmcgcGFyYW1ldGVycyBvZiB0aGUgYWN0aXZlIFNQUwotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdG9yYWdlICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBzdHJ1Y3R1cmUKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgY3JvcHBpbmdGbGFnICAgIGZsYWcgaW5kaWNhdGluZyBpZiBjcm9wcGluZyBwYXJhbXMgcHJlc2VudCBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlZCBoZXJlCi0gICAgICAgICAgICBsZWZ0T2Zmc2V0ICAgICAgY3JvcHBpbmcgbGVmdCBvZmZzZXQgaW4gcGl4ZWxzIGlzIHN0b3JlZCBoZXJlCi0gICAgICAgICAgICB3aWR0aCAgICAgICAgICAgd2lkdGggb2YgdGhlIGltYWdlIGFmdGVyIGNyb3BwaW5nIGlzIHN0b3JlZCBoZXJlCi0gICAgICAgICAgICB0b3BPZmZzZXQgICAgICAgY3JvcHBpbmcgdG9wIG9mZnNldCBpbiBwaXhlbHMgaXMgc3RvcmVkIGhlcmUKLSAgICAgICAgICAgIGhlaWdodCAgICAgICAgICBoZWlnaHQgb2YgdGhlIGltYWdlIGFmdGVyIGNyb3BwaW5nIGlzIHN0b3JlZCBoZXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIG5vbmUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBoMjY0YnNkQ3JvcHBpbmdQYXJhbXMoc3RvcmFnZV90ICpwU3RvcmFnZSwgdTMyICpjcm9wcGluZ0ZsYWcsCi0gICAgdTMyICpsZWZ0T2Zmc2V0LCB1MzIgKndpZHRoLCB1MzIgKnRvcE9mZnNldCwgdTMyICpoZWlnaHQpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0b3JhZ2UpOwotCi0gICAgaWYgKHBTdG9yYWdlLT5hY3RpdmVTcHMgJiYgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+ZnJhbWVDcm9wcGluZ0ZsYWcpCi0gICAgewotICAgICAgICAqY3JvcHBpbmdGbGFnID0gMTsKLSAgICAgICAgKmxlZnRPZmZzZXQgPSAyICogcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+ZnJhbWVDcm9wTGVmdE9mZnNldDsKLSAgICAgICAgKndpZHRoID0gMTYgKiBwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNXaWR0aEluTWJzIC0KLSAgICAgICAgICAgICAgICAgMiAqIChwU3RvcmFnZS0+YWN0aXZlU3BzLT5mcmFtZUNyb3BMZWZ0T2Zmc2V0ICsKLSAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT5mcmFtZUNyb3BSaWdodE9mZnNldCk7Ci0gICAgICAgICp0b3BPZmZzZXQgPSAyICogcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+ZnJhbWVDcm9wVG9wT2Zmc2V0OwotICAgICAgICAqaGVpZ2h0ID0gMTYgKiBwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNIZWlnaHRJbk1icyAtCi0gICAgICAgICAgICAgICAgICAyICogKHBTdG9yYWdlLT5hY3RpdmVTcHMtPmZyYW1lQ3JvcFRvcE9mZnNldCArCi0gICAgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPmZyYW1lQ3JvcEJvdHRvbU9mZnNldCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgICpjcm9wcGluZ0ZsYWcgPSAwOwotICAgICAgICAqbGVmdE9mZnNldCA9IDA7Ci0gICAgICAgICp3aWR0aCA9IDA7Ci0gICAgICAgICp0b3BPZmZzZXQgPSAwOwotICAgICAgICAqaGVpZ2h0ID0gMDsKLSAgICB9Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkU2FtcGxlQXNwZWN0UmF0aW8KLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgR2V0IGFzcGVjdCByYXRpbyByZWNlaXZlZCBpbiB0aGUgVlVJIGRhdGEKLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwU3RvcmFnZSAgICBwb2ludGVyIHRvIHN0b3JhZ2Ugc3RydWN0dXJlCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIHNhcldpZHRoICAgIHNhbXBsZSBhc3BlY3QgcmF0aW8gaGVpZ2h0Ci0gICAgICAgICAgICBzYXJIZWlnaHQgICBzYW1wbGUgYXNwZWN0IHJhdGlvIHdpZHRoCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgaDI2NGJzZFNhbXBsZUFzcGVjdFJhdGlvKHN0b3JhZ2VfdCAqcFN0b3JhZ2UsIHUzMiAqc2FyV2lkdGgsIHUzMiAqc2FySGVpZ2h0KQotewotCi0vKiBWYXJpYWJsZXMgKi8KLSAgICB1MzIgdyA9IDE7Ci0gICAgdTMyIGggPSAxOwotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdG9yYWdlKTsKLQotCi0gICAgaWYgKHBTdG9yYWdlLT5hY3RpdmVTcHMgJiYKLSAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+dnVpUGFyYW1ldGVyc1ByZXNlbnRGbGFnICYmCi0gICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnZ1aVBhcmFtZXRlcnMgJiYKLSAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+dnVpUGFyYW1ldGVycy0+YXNwZWN0UmF0aW9QcmVzZW50RmxhZyApCi0gICAgewotICAgICAgICBzd2l0Y2ggKHBTdG9yYWdlLT5hY3RpdmVTcHMtPnZ1aVBhcmFtZXRlcnMtPmFzcGVjdFJhdGlvSWRjKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT19VTlNQRUNJRklFRDogIHcgPSAgIDA7IGggPSAgMDsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT18xXzE6ICAgICAgICAgIHcgPSAgIDE7IGggPSAgMTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT18xMl8xMTogICAgICAgIHcgPSAgMTI7IGggPSAxMTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT18xMF8xMTogICAgICAgIHcgPSAgMTA7IGggPSAxMTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT18xNl8xMTogICAgICAgIHcgPSAgMTY7IGggPSAxMTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT180MF8zMzogICAgICAgIHcgPSAgNDA7IGggPSAzMzsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT18yNF8xMTogICAgICAgIHcgPSAgMjQ7IGggPSAxMTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT18yMF8xMTogICAgICAgIHcgPSAgMjA7IGggPSAxMTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT18zMl8xMTogICAgICAgIHcgPSAgMzI7IGggPSAxMTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT184MF8zMzogICAgICAgIHcgPSAgODA7IGggPSAzMzsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT18xOF8xMTogICAgICAgIHcgPSAgMTg7IGggPSAxMTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT18xNV8xMTogICAgICAgIHcgPSAgMTU7IGggPSAxMTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT182NF8zMzogICAgICAgIHcgPSAgNjQ7IGggPSAzMzsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT18xNjBfOTk6ICAgICAgIHcgPSAxNjA7IGggPSA5OTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT19FWFRFTkRFRF9TQVI6Ci0gICAgICAgICAgICAgICAgdyA9IHBTdG9yYWdlLT5hY3RpdmVTcHMtPnZ1aVBhcmFtZXRlcnMtPnNhcldpZHRoOwotICAgICAgICAgICAgICAgIGggPSBwU3RvcmFnZS0+YWN0aXZlU3BzLT52dWlQYXJhbWV0ZXJzLT5zYXJIZWlnaHQ7Ci0gICAgICAgICAgICAgICAgaWYgKCh3ID09IDApIHx8IChoID09IDApKQotICAgICAgICAgICAgICAgICAgICB3ID0gaCA9IDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHcgPSAwOwotICAgICAgICAgICAgICAgIGggPSAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogc2V0IGFzcGVjdCByYXRpbyovCi0gICAgKnNhcldpZHRoID0gdzsKLSAgICAqc2FySGVpZ2h0ID0gaDsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RQcm9maWxlCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEdldCBwcm9maWxlIGluZm9ybWF0aW9uIGZyb20gYWN0aXZlIFNQUwotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdG9yYWdlICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBzdHJ1Y3R1cmUKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgcHJvZmlsZSAgIGN1cnJlbnQgcHJvZmlsZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdTMyIGgyNjRic2RQcm9maWxlKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpCi17Ci0gICAgaWYgKHBTdG9yYWdlLT5hY3RpdmVTcHMpCi0gICAgICAgIHJldHVybiBwU3RvcmFnZS0+YWN0aXZlU3BzLT5wcm9maWxlSWRjOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIDA7Ci19Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9kZWNvZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfZGVjb2Rlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzM2NTIzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9kZWNvZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotICAgIDMuIERhdGEgdHlwZXMKLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgSDI2NFNXREVDX0RFQ09ERVJfSAotI2RlZmluZSBIMjY0U1dERUNfREVDT0RFUl9ICi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiYmFzZXR5cGUuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3N0b3JhZ2UuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogZW51bWVyYXRlZCByZXR1cm4gdmFsdWVzIG9mIHRoZSBmdW5jdGlvbnMgKi8KLWVudW0gewotICAgIEgyNjRCU0RfUkRZLAotICAgIEgyNjRCU0RfUElDX1JEWSwKLSAgICBIMjY0QlNEX0hEUlNfUkRZLAotICAgIEgyNjRCU0RfRVJST1IsCi0gICAgSDI2NEJTRF9QQVJBTV9TRVRfRVJST1IsCi0gICAgSDI2NEJTRF9NRU1BTExPQ19FUlJPUgotfTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBEYXRhIHR5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkSW5pdChzdG9yYWdlX3QgKnBTdG9yYWdlLCB1MzIgbm9PdXRwdXRSZW9yZGVyaW5nKTsKLXUzMiBoMjY0YnNkRGVjb2RlKHN0b3JhZ2VfdCAqcFN0b3JhZ2UsIHU4ICpieXRlU3RybSwgdTMyIGxlbiwgdTMyIHBpY0lkLAotICAgIHUzMiAqcmVhZEJ5dGVzKTsKLXZvaWQgaDI2NGJzZFNodXRkb3duKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpOwotCi11OCogaDI2NGJzZE5leHRPdXRwdXRQaWN0dXJlKHN0b3JhZ2VfdCAqcFN0b3JhZ2UsIHUzMiAqcGljSWQsIHUzMiAqaXNJZHJQaWMsCi0gICAgdTMyICpudW1FcnJNYnMpOwotCi11MzIgaDI2NGJzZFBpY1dpZHRoKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpOwotdTMyIGgyNjRic2RQaWNIZWlnaHQoc3RvcmFnZV90ICpwU3RvcmFnZSk7Ci11MzIgaDI2NGJzZFZpZGVvUmFuZ2Uoc3RvcmFnZV90ICpwU3RvcmFnZSk7Ci11MzIgaDI2NGJzZE1hdHJpeENvZWZmaWNpZW50cyhzdG9yYWdlX3QgKnBTdG9yYWdlKTsKLXZvaWQgaDI2NGJzZENyb3BwaW5nUGFyYW1zKHN0b3JhZ2VfdCAqcFN0b3JhZ2UsIHUzMiAqY3JvcHBpbmdGbGFnLAotICAgIHUzMiAqbGVmdCwgdTMyICp3aWR0aCwgdTMyICp0b3AsIHUzMiAqaGVpZ2h0KTsKLXZvaWQgaDI2NGJzZFNhbXBsZUFzcGVjdFJhdGlvKHN0b3JhZ2VfdCAqcFN0b3JhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgKnNhcldpZHRoLCB1MzIgKnNhckhlaWdodCk7Ci11MzIgaDI2NGJzZENoZWNrVmFsaWRQYXJhbVNldHMoc3RvcmFnZV90ICpwU3RvcmFnZSk7Ci0KLXZvaWQgaDI2NGJzZEZsdXNoQnVmZmVyKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpOwotCi11MzIgaDI2NGJzZFByb2ZpbGUoc3RvcmFnZV90ICpwU3RvcmFnZSk7Ci0KLSNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX0RFQ09ERVJfSCAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfZHBiLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfZHBiLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkOWVlZTkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2RwYi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTU5MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0gICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0gICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLSAgICAgNS4gRnVuY3Rpb25zCi0gICAgICAgICAgQ29tcGFyZVBpY3R1cmVzCi0gICAgICAgICAgaDI2NGJzZFJlb3JkZXJSZWZQaWNMaXN0Ci0gICAgICAgICAgTW1jb3AxCi0gICAgICAgICAgTW1jb3AyCi0gICAgICAgICAgTW1jb3AzCi0gICAgICAgICAgTW1jb3A0Ci0gICAgICAgICAgTW1jb3A1Ci0gICAgICAgICAgTW1jb3A2Ci0gICAgICAgICAgaDI2NGJzZE1hcmtEZWNSZWZQaWMKLSAgICAgICAgICBoMjY0YnNkR2V0UmVmUGljRGF0YQotICAgICAgICAgIGgyNjRic2RBbGxvY2F0ZURwYkltYWdlCi0gICAgICAgICAgU2xpZGluZ1dpbmRvd1JlZlBpY01hcmtpbmcKLSAgICAgICAgICBoMjY0YnNkSW5pdERwYgotICAgICAgICAgIGgyNjRic2RSZXNldERwYgotICAgICAgICAgIGgyNjRic2RJbml0UmVmUGljTGlzdAotICAgICAgICAgIEZpbmREcGJQaWMKLSAgICAgICAgICBTZXRQaWNOdW1zCi0gICAgICAgICAgaDI2NGJzZENoZWNrR2Fwc0luRnJhbWVOdW0KLSAgICAgICAgICBGaW5kU21hbGxlc3RQaWNPcmRlckNudAotICAgICAgICAgIE91dHB1dFBpY3R1cmUKLSAgICAgICAgICBoMjY0YnNkRHBiT3V0cHV0UGljdHVyZQotICAgICAgICAgIGgyNjRic2RGbHVzaERwYgotICAgICAgICAgIGgyNjRic2RGcmVlRHBiCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiaDI2NGJzZF9jZmcuaCIKLSNpbmNsdWRlICJoMjY0YnNkX2RwYi5oIgotI2luY2x1ZGUgImgyNjRic2Rfc2xpY2VfaGVhZGVyLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9pbWFnZS5oIgotI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgotI2luY2x1ZGUgImJhc2V0eXBlLmgiCi0KLSNpbmNsdWRlIDxsb2cvbG9nLmg+Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIG1hY3JvcyB0byBkZXRlcm1pbmUgcGljdHVyZSBzdGF0dXMuIE5vdGUgdGhhdCBJU19TSE9SVF9URVJNIG1hY3JvIHJldHVybnMKLSAqIHRydWUgYWxzbyBmb3Igbm9uLWV4aXN0aW5nIHBpY3R1cmVzIGJlY2F1c2Ugbm9uLWV4aXN0aW5nIHBpY3R1cmVzIGFyZQotICogcmVnYXJkZWQgc2hvcnQgdGVybSBwaWN0dXJlcyBhY2NvcmRpbmcgdG8gSC4yNjQgc3RhbmRhcmQgKi8KLSNkZWZpbmUgSVNfUkVGRVJFTkNFKGEpICgoYSkuc3RhdHVzKQotI2RlZmluZSBJU19FWElTVElORyhhKSAoKGEpLnN0YXR1cyA+IE5PTl9FWElTVElORykKLSNkZWZpbmUgSVNfU0hPUlRfVEVSTShhKSBcCi0gICAgKChhKS5zdGF0dXMgPT0gTk9OX0VYSVNUSU5HIHx8IChhKS5zdGF0dXMgPT0gU0hPUlRfVEVSTSkKLSNkZWZpbmUgSVNfTE9OR19URVJNKGEpICgoYSkuc3RhdHVzID09IExPTkdfVEVSTSkKLQotLyogbWFjcm8gdG8gc2V0IGEgcGljdHVyZSB1bnVzZWQgZm9yIHJlZmVyZW5jZSAqLwotI2RlZmluZSBTRVRfVU5VU0VEKGEpIChhKS5zdGF0dXMgPSBVTlVTRUQ7Ci0KLSNkZWZpbmUgTUFYX05VTV9SRUZfSURYX0wwX0FDVElWRSAxNgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBpMzIgQ29tcGFyZVBpY3R1cmVzKGNvbnN0IHZvaWQgKnB0cjEsIGNvbnN0IHZvaWQgKnB0cjIpOwotCi1zdGF0aWMgdTMyIE1tY29wMShkcGJTdG9yYWdlX3QgKmRwYiwgdTMyIGN1cnJQaWNOdW0sIHUzMiBkaWZmZXJlbmNlT2ZQaWNOdW1zKTsKLQotc3RhdGljIHUzMiBNbWNvcDIoZHBiU3RvcmFnZV90ICpkcGIsIHUzMiBsb25nVGVybVBpY051bSk7Ci0KLXN0YXRpYyB1MzIgTW1jb3AzKGRwYlN0b3JhZ2VfdCAqZHBiLCB1MzIgY3VyclBpY051bSwgdTMyIGRpZmZlcmVuY2VPZlBpY051bXMsCi0gICAgdTMyIGxvbmdUZXJtRnJhbWVJZHgpOwotCi1zdGF0aWMgdTMyIE1tY29wNChkcGJTdG9yYWdlX3QgKmRwYiwgdTMyIG1heExvbmdUZXJtRnJhbWVJZHgpOwotCi1zdGF0aWMgdTMyIE1tY29wNShkcGJTdG9yYWdlX3QgKmRwYik7Ci0KLXN0YXRpYyB1MzIgTW1jb3A2KGRwYlN0b3JhZ2VfdCAqZHBiLCB1MzIgZnJhbWVOdW0sIGkzMiBwaWNPcmRlckNudCwKLSAgICB1MzIgbG9uZ1Rlcm1GcmFtZUlkeCk7Ci0KLXN0YXRpYyB1MzIgU2xpZGluZ1dpbmRvd1JlZlBpY01hcmtpbmcoZHBiU3RvcmFnZV90ICpkcGIpOwotCi1zdGF0aWMgaTMyIEZpbmREcGJQaWMoZHBiU3RvcmFnZV90ICpkcGIsIGkzMiBwaWNOdW0sIHUzMiBpc1Nob3J0VGVybSk7Ci0KLXN0YXRpYyB2b2lkIFNldFBpY051bXMoZHBiU3RvcmFnZV90ICpkcGIsIHUzMiBjdXJyRnJhbWVOdW0pOwotCi1zdGF0aWMgZHBiUGljdHVyZV90KiBGaW5kU21hbGxlc3RQaWNPcmRlckNudChkcGJTdG9yYWdlX3QgKmRwYik7Ci0KLXN0YXRpYyB1MzIgT3V0cHV0UGljdHVyZShkcGJTdG9yYWdlX3QgKmRwYik7Ci0KLXN0YXRpYyB2b2lkIFNoZWxsU29ydChkcGJQaWN0dXJlX3QgKnBQaWMsIHUzMiBudW0pOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IENvbXBhcmVQaWN0dXJlcwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGdW5jdGlvbiB0byBjb21wYXJlIGRwYiBwaWN0dXJlcywgdXNlZCBieSB0aGUgU2hlbGxTb3J0KCkgZnVuY3Rpb24uCi0gICAgICAgICAgICBPcmRlciBvZiB0aGUgcGljdHVyZXMgYWZ0ZXIgc29ydGluZyBzaGFsbCBiZSBhcyBmb2xsb3dzOgotICAgICAgICAgICAgICAgIDEpIHNob3J0IHRlcm0gcmVmZXJlbmNlIHBpY3R1cmVzIHN0YXJ0aW5nIHdpdGggdGhlIGxhcmdlc3QKLSAgICAgICAgICAgICAgICAgICBwaWNOdW0KLSAgICAgICAgICAgICAgICAyKSBsb25nIHRlcm0gcmVmZXJlbmNlIHBpY3R1cmVzIHN0YXJ0aW5nIHdpdGggdGhlIHNtYWxsZXN0Ci0gICAgICAgICAgICAgICAgICAgbG9uZ1Rlcm1QaWNOdW0KLSAgICAgICAgICAgICAgICAzKSBwaWN0dXJlcyB1bnVzZWQgZm9yIHJlZmVyZW5jZSBidXQgbmVlZGVkIGZvciBkaXNwbGF5Ci0gICAgICAgICAgICAgICAgNCkgb3RoZXIgcGljdHVyZXMKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgLTEgICAgICBwaWMgMSBpcyBncmVhdGVyIHRoYW4gcGljIDIKLSAgICAgICAgICAgICAwICAgICAgZXF1YWwgZnJvbSBjb21wYXJpc29uIHBvaW50IG9mIHZpZXcKLSAgICAgICAgICAgICAxICAgICAgcGljIDIgaXMgZ3JlYXRlciB0aGVuIHBpYyAxCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBpMzIgQ29tcGFyZVBpY3R1cmVzKGNvbnN0IHZvaWQgKnB0cjEsIGNvbnN0IHZvaWQgKnB0cjIpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgZHBiUGljdHVyZV90ICpwaWMxLCAqcGljMjsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHB0cjEpOwotICAgIEFTU0VSVChwdHIyKTsKLQotICAgIHBpYzEgPSAoZHBiUGljdHVyZV90KilwdHIxOwotICAgIHBpYzIgPSAoZHBiUGljdHVyZV90KilwdHIyOwotCi0gICAgLyogYm90aCBhcmUgbm9uLXJlZmVyZW5jZSBwaWN0dXJlcywgY2hlY2sgaWYgbmVlZGVkIGZvciBkaXNwbGF5ICovCi0gICAgaWYgKCFJU19SRUZFUkVOQ0UoKnBpYzEpICYmICFJU19SRUZFUkVOQ0UoKnBpYzIpKQotICAgIHsKLSAgICAgICAgaWYgKHBpYzEtPnRvQmVEaXNwbGF5ZWQgJiYgIXBpYzItPnRvQmVEaXNwbGF5ZWQpCi0gICAgICAgICAgICByZXR1cm4oLTEpOwotICAgICAgICBlbHNlIGlmICghcGljMS0+dG9CZURpc3BsYXllZCAmJiBwaWMyLT50b0JlRGlzcGxheWVkKQotICAgICAgICAgICAgcmV0dXJuKDEpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4oMCk7Ci0gICAgfQotICAgIC8qIG9ubHkgcGljIDEgbmVlZGVkIGZvciByZWZlcmVuY2UgLT4gZ3JlYXRlciAqLwotICAgIGVsc2UgaWYgKCFJU19SRUZFUkVOQ0UoKnBpYzIpKQotICAgICAgICByZXR1cm4oLTEpOwotICAgIC8qIG9ubHkgcGljIDIgbmVlZGVkIGZvciByZWZlcmVuY2UgLT4gZ3JlYXRlciAqLwotICAgIGVsc2UgaWYgKCFJU19SRUZFUkVOQ0UoKnBpYzEpKQotICAgICAgICByZXR1cm4oMSk7Ci0gICAgLyogYm90aCBhcmUgc2hvcnQgdGVybSByZWZlcmVuY2UgcGljdHVyZXMgLT4gY2hlY2sgcGljTnVtICovCi0gICAgZWxzZSBpZiAoSVNfU0hPUlRfVEVSTSgqcGljMSkgJiYgSVNfU0hPUlRfVEVSTSgqcGljMikpCi0gICAgewotICAgICAgICBpZiAocGljMS0+cGljTnVtID4gcGljMi0+cGljTnVtKQotICAgICAgICAgICAgcmV0dXJuKC0xKTsKLSAgICAgICAgZWxzZSBpZiAocGljMS0+cGljTnVtIDwgcGljMi0+cGljTnVtKQotICAgICAgICAgICAgcmV0dXJuKDEpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4oMCk7Ci0gICAgfQotICAgIC8qIG9ubHkgcGljIDEgaXMgc2hvcnQgdGVybSAtPiBncmVhdGVyICovCi0gICAgZWxzZSBpZiAoSVNfU0hPUlRfVEVSTSgqcGljMSkpCi0gICAgICAgIHJldHVybigtMSk7Ci0gICAgLyogb25seSBwaWMgMiBpcyBzaG9ydCB0ZXJtIC0+IGdyZWF0ZXIgKi8KLSAgICBlbHNlIGlmIChJU19TSE9SVF9URVJNKCpwaWMyKSkKLSAgICAgICAgcmV0dXJuKDEpOwotICAgIC8qIGJvdGggYXJlIGxvbmcgdGVybSByZWZlcmVuY2UgcGljdHVyZXMgLT4gY2hlY2sgcGljTnVtIChjb250YWlucyB0aGUKLSAgICAgKiBsb25nVGVybVBpY051bSAqLwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmIChwaWMxLT5waWNOdW0gPiBwaWMyLT5waWNOdW0pCi0gICAgICAgICAgICByZXR1cm4oMSk7Ci0gICAgICAgIGVsc2UgaWYgKHBpYzEtPnBpY051bSA8IHBpYzItPnBpY051bSkKLSAgICAgICAgICAgIHJldHVybigtMSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybigwKTsKLSAgICB9Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZFJlb3JkZXJSZWZQaWNMaXN0Ci0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZ1bmN0aW9uIHRvIHBlcmZvcm0gcmVmZXJlbmNlIHBpY3R1cmUgbGlzdCByZW9yZGVyaW5nIGJhc2VkIG9uCi0gICAgICAgICAgICByZW9yZGVyaW5nIGNvbW1hbmRzIHJlY2VpdmVkIGluIHRoZSBzbGljZSBoZWFkZXIuIFNlZSBkZXRhaWxzCi0gICAgICAgICAgICBvZiB0aGUgcHJvY2VzcyBpbiB0aGUgSC4yNjQgc3RhbmRhcmQuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgZHBiICAgICAgICAgICAgIHBvaW50ZXIgdG8gZHBiIHN0b3JhZ2Ugc3RydWN0dXJlCi0gICAgICAgICAgICBvcmRlciAgICAgICAgICAgcG9pbnRlciB0byByZW9yZGVyaW5nIGNvbW1hbmRzCi0gICAgICAgICAgICBjdXJyRnJhbWVOdW0gICAgY3VycmVudCBmcmFtZSBudW1iZXIKLSAgICAgICAgICAgIG51bVJlZklkeEFjdGl2ZSBudW1iZXIgb2YgYWN0aXZlIHJlZmVyZW5jZSBpbmRpY2VzIGZvciBjdXJyZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljdHVyZQotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBkcGIgICAgICAgICAgICAgJ2xpc3QnIGZpZWxkIG9mIHRoZSBzdHJ1Y3R1cmUgcmVvcmRlcmVkCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEhBTlRST19PSyAgICAgIHN1Y2Nlc3MKLSAgICAgICAgICAgIEhBTlRST19OT0sgICAgIGlmIG5vbi1leGlzdGluZyBwaWN0dXJlcyByZWZlcnJlZCB0byBpbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlb3JkZXJpbmcgY29tbWFuZHMKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2RSZW9yZGVyUmVmUGljTGlzdCgKLSAgZHBiU3RvcmFnZV90ICpkcGIsCi0gIHJlZlBpY0xpc3RSZW9yZGVyaW5nX3QgKm9yZGVyLAotICB1MzIgY3VyckZyYW1lTnVtLAotICB1MzIgbnVtUmVmSWR4QWN0aXZlKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpLCBqLCBrLCBwaWNOdW1QcmVkLCByZWZJZHg7Ci0gICAgaTMyIHBpY051bSwgcGljTnVtTm9XcmFwLCBpbmRleDsKLSAgICB1MzIgaXNTaG9ydFRlcm07Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChvcmRlcik7Ci0gICAgQVNTRVJUKGN1cnJGcmFtZU51bSA8PSBkcGItPm1heEZyYW1lTnVtKTsKLSAgICBBU1NFUlQobnVtUmVmSWR4QWN0aXZlIDw9IE1BWF9OVU1fUkVGX0lEWF9MMF9BQ1RJVkUpOwotCi0gICAgLyogc2V0IGRwYiBwaWN0dXJlIG51bWJlcnMgZm9yIHNvcnRpbmcgKi8KLSAgICBTZXRQaWNOdW1zKGRwYiwgY3VyckZyYW1lTnVtKTsKLQotICAgIGlmICghb3JkZXItPnJlZlBpY0xpc3RSZW9yZGVyaW5nRmxhZ0wwKQotICAgICAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotICAgIHJlZklkeCAgICAgPSAwOwotICAgIHBpY051bVByZWQgPSBjdXJyRnJhbWVOdW07Ci0KLSAgICBpID0gMDsKLSAgICB3aGlsZSAob3JkZXItPmNvbW1hbmRbaV0ucmVvcmRlcmluZ09mUGljTnVtc0lkYyA8IDMpCi0gICAgewotICAgICAgICAvKiBzaG9ydCB0ZXJtICovCi0gICAgICAgIGlmIChvcmRlci0+Y29tbWFuZFtpXS5yZW9yZGVyaW5nT2ZQaWNOdW1zSWRjIDwgMikKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG9yZGVyLT5jb21tYW5kW2ldLnJlb3JkZXJpbmdPZlBpY051bXNJZGMgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwaWNOdW1Ob1dyYXAgPQotICAgICAgICAgICAgICAgICAgICAoaTMyKXBpY051bVByZWQgLSAoaTMyKW9yZGVyLT5jb21tYW5kW2ldLmFic0RpZmZQaWNOdW07Ci0gICAgICAgICAgICAgICAgaWYgKHBpY051bU5vV3JhcCA8IDApCi0gICAgICAgICAgICAgICAgICAgIHBpY051bU5vV3JhcCArPSAoaTMyKWRwYi0+bWF4RnJhbWVOdW07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcGljTnVtTm9XcmFwID0KLSAgICAgICAgICAgICAgICAgICAgKGkzMikocGljTnVtUHJlZCArIG9yZGVyLT5jb21tYW5kW2ldLmFic0RpZmZQaWNOdW0pOwotICAgICAgICAgICAgICAgIGlmIChwaWNOdW1Ob1dyYXAgPj0gKGkzMilkcGItPm1heEZyYW1lTnVtKQotICAgICAgICAgICAgICAgICAgICBwaWNOdW1Ob1dyYXAgLT0gKGkzMilkcGItPm1heEZyYW1lTnVtOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGljTnVtUHJlZCA9ICh1MzIpcGljTnVtTm9XcmFwOwotICAgICAgICAgICAgcGljTnVtID0gcGljTnVtTm9XcmFwOwotICAgICAgICAgICAgaWYgKCh1MzIpcGljTnVtTm9XcmFwID4gY3VyckZyYW1lTnVtKQotICAgICAgICAgICAgICAgIHBpY051bSAtPSAoaTMyKWRwYi0+bWF4RnJhbWVOdW07Ci0gICAgICAgICAgICBpc1Nob3J0VGVybSA9IEhBTlRST19UUlVFOwotICAgICAgICB9Ci0gICAgICAgIC8qIGxvbmcgdGVybSAqLwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBpY051bSA9IChpMzIpb3JkZXItPmNvbW1hbmRbaV0ubG9uZ1Rlcm1QaWNOdW07Ci0gICAgICAgICAgICBpc1Nob3J0VGVybSA9IEhBTlRST19GQUxTRTsKLQotICAgICAgICB9Ci0gICAgICAgIC8qIGZpbmQgY29ycmVzcG9uZGluZyBwaWN0dXJlIGZyb20gZHBiICovCi0gICAgICAgIGluZGV4ID0gRmluZERwYlBpYyhkcGIsIHBpY051bSwgaXNTaG9ydFRlcm0pOwotICAgICAgICBpZiAoaW5kZXggPCAwIHx8ICFJU19FWElTVElORyhkcGItPmJ1ZmZlcltpbmRleF0pKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgICAgIC8qIHNoaWZ0IHBpY3R1cmVzICovCi0gICAgICAgIGZvciAoaiA9IG51bVJlZklkeEFjdGl2ZTsgaiA+IHJlZklkeDsgai0tKQotICAgICAgICAgICAgZHBiLT5saXN0W2pdID0gZHBiLT5saXN0W2otMV07Ci0gICAgICAgIC8qIHB1dCBwaWN0dXJlIGludG8gdGhlIGxpc3QgKi8KLSAgICAgICAgZHBiLT5saXN0W3JlZklkeCsrXSA9ICZkcGItPmJ1ZmZlcltpbmRleF07Ci0gICAgICAgIC8qIHJlbW92ZSBsYXRlciByZWZlcmVuY2VzIHRvIHRoZSBzYW1lIHBpY3R1cmUgKi8KLSAgICAgICAgZm9yIChqID0gayA9IHJlZklkeDsgaiA8PSBudW1SZWZJZHhBY3RpdmU7IGorKykKLSAgICAgICAgICAgIGlmKGRwYi0+bGlzdFtqXSAhPSAmZHBiLT5idWZmZXJbaW5kZXhdKQotICAgICAgICAgICAgICAgIGRwYi0+bGlzdFtrKytdID0gZHBiLT5saXN0W2pdOwotCi0gICAgICAgIGkrKzsKLSAgICB9Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IE1tY29wMQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGdW5jdGlvbiB0byBtYXJrIGEgc2hvcnQtdGVybSByZWZlcmVuY2UgcGljdHVyZSB1bnVzZWQgZm9yCi0gICAgICAgICAgICByZWZlcmVuY2UsIG1lbW9yeV9tYW5hZ2VtZW50X2NvbnRyb2xfb3BlcmF0aW9uIGVxdWFsIHRvIDEKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSEFOVFJPX09LICAgICAgc3VjY2VzcwotICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgZmFpbHVyZSwgcGljdHVyZSBkb2VzIG5vdCBleGlzdCBpbiB0aGUgYnVmZmVyCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1MzIgTW1jb3AxKGRwYlN0b3JhZ2VfdCAqZHBiLCB1MzIgY3VyclBpY051bSwgdTMyIGRpZmZlcmVuY2VPZlBpY051bXMpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgaTMyIGluZGV4LCBwaWNOdW07Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChjdXJyUGljTnVtIDwgZHBiLT5tYXhGcmFtZU51bSk7Ci0KLSAgICBwaWNOdW0gPSAoaTMyKWN1cnJQaWNOdW0gLSAoaTMyKWRpZmZlcmVuY2VPZlBpY051bXM7Ci0KLSAgICBpbmRleCA9IEZpbmREcGJQaWMoZHBiLCBwaWNOdW0sIEhBTlRST19UUlVFKTsKLSAgICBpZiAoaW5kZXggPCAwKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICBTRVRfVU5VU0VEKGRwYi0+YnVmZmVyW2luZGV4XSk7Ci0gICAgZHBiLT5udW1SZWZGcmFtZXMtLTsKLSAgICBpZiAoIWRwYi0+YnVmZmVyW2luZGV4XS50b0JlRGlzcGxheWVkKQotICAgICAgICBkcGItPmZ1bGxuZXNzLS07Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IE1tY29wMgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGdW5jdGlvbiB0byBtYXJrIGEgbG9uZy10ZXJtIHJlZmVyZW5jZSBwaWN0dXJlIHVudXNlZCBmb3IKLSAgICAgICAgICAgIHJlZmVyZW5jZSwgbWVtb3J5X21hbmFnZW1lbnRfY29udHJvbF9vcGVyYXRpb24gZXF1YWwgdG8gMgotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIQU5UUk9fT0sgICAgICBzdWNjZXNzCi0gICAgICAgICAgICBIQU5UUk9fTk9LICAgICBmYWlsdXJlLCBwaWN0dXJlIGRvZXMgbm90IGV4aXN0IGluIHRoZSBidWZmZXIKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHUzMiBNbWNvcDIoZHBiU3RvcmFnZV90ICpkcGIsIHUzMiBsb25nVGVybVBpY051bSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICBpMzIgaW5kZXg7Ci0KLS8qIENvZGUgKi8KLQotICAgIGluZGV4ID0gRmluZERwYlBpYyhkcGIsIChpMzIpbG9uZ1Rlcm1QaWNOdW0sIEhBTlRST19GQUxTRSk7Ci0gICAgaWYgKGluZGV4IDwgMCkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgU0VUX1VOVVNFRChkcGItPmJ1ZmZlcltpbmRleF0pOwotICAgIGRwYi0+bnVtUmVmRnJhbWVzLS07Ci0gICAgaWYgKCFkcGItPmJ1ZmZlcltpbmRleF0udG9CZURpc3BsYXllZCkKLSAgICAgICAgZHBiLT5mdWxsbmVzcy0tOwotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBNbWNvcDMKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRnVuY3Rpb24gdG8gYXNzaW5nIGEgbG9uZ1Rlcm1GcmFtZUlkeCB0byBhIHNob3J0LXRlcm0gcmVmZXJlbmNlCi0gICAgICAgICAgICBmcmFtZSAoaS5lLiB0byBjaGFuZ2UgaXQgdG8gYSBsb25nLXRlcm0gcmVmZXJlbmNlIHBpY3R1cmUpLAotICAgICAgICAgICAgbWVtb3J5X21hbmFnZW1lbnRfY29udHJvbF9vcGVyYXRpb24gZXF1YWwgdG8gMwotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIQU5UUk9fT0sgICAgICBzdWNjZXNzCi0gICAgICAgICAgICBIQU5UUk9fTk9LICAgICBmYWlsdXJlLCBzaG9ydC10ZXJtIHBpY3R1cmUgZG9lcyBub3QgZXhpc3QgaW4gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgb3IgaXMgYSBub24tZXhpc3RpbmcgcGljdHVyZSwgb3IgaW52YWxpZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZ1Rlcm1GcmFtZUlkeCBnaXZlbgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdTMyIE1tY29wMyhkcGJTdG9yYWdlX3QgKmRwYiwgdTMyIGN1cnJQaWNOdW0sIHUzMiBkaWZmZXJlbmNlT2ZQaWNOdW1zLAotICAgIHUzMiBsb25nVGVybUZyYW1lSWR4KQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIGkzMiBpbmRleCwgcGljTnVtOwotICAgIHUzMiBpOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoZHBiKTsKLSAgICBBU1NFUlQoY3VyclBpY051bSA8IGRwYi0+bWF4RnJhbWVOdW0pOwotCi0gICAgaWYgKCAoZHBiLT5tYXhMb25nVGVybUZyYW1lSWR4ID09IE5PX0xPTkdfVEVSTV9GUkFNRV9JTkRJQ0VTKSB8fAotICAgICAgICAgKGxvbmdUZXJtRnJhbWVJZHggPiBkcGItPm1heExvbmdUZXJtRnJhbWVJZHgpICkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgLyogY2hlY2sgaWYgYSBsb25nIHRlcm0gcGljdHVyZSB3aXRoIHRoZSBzYW1lIGxvbmdUZXJtRnJhbWVJZHggYWxyZWFkeQotICAgICAqIGV4aXN0IGFuZCByZW1vdmUgaXQgaWYgbmVjZXNzYXJ5ICovCi0gICAgZm9yIChpID0gMDsgaSA8IGRwYi0+bWF4UmVmRnJhbWVzOyBpKyspCi0gICAgICAgIGlmIChJU19MT05HX1RFUk0oZHBiLT5idWZmZXJbaV0pICYmCi0gICAgICAgICAgKHUzMilkcGItPmJ1ZmZlcltpXS5waWNOdW0gPT0gbG9uZ1Rlcm1GcmFtZUlkeCkKLSAgICAgICAgewotICAgICAgICAgICAgU0VUX1VOVVNFRChkcGItPmJ1ZmZlcltpXSk7Ci0gICAgICAgICAgICBkcGItPm51bVJlZkZyYW1lcy0tOwotICAgICAgICAgICAgaWYgKCFkcGItPmJ1ZmZlcltpXS50b0JlRGlzcGxheWVkKQotICAgICAgICAgICAgICAgIGRwYi0+ZnVsbG5lc3MtLTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICBwaWNOdW0gPSAoaTMyKWN1cnJQaWNOdW0gLSAoaTMyKWRpZmZlcmVuY2VPZlBpY051bXM7Ci0KLSAgICBpbmRleCA9IEZpbmREcGJQaWMoZHBiLCBwaWNOdW0sIEhBTlRST19UUlVFKTsKLSAgICBpZiAoaW5kZXggPCAwKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgaWYgKCFJU19FWElTVElORyhkcGItPmJ1ZmZlcltpbmRleF0pKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICBkcGItPmJ1ZmZlcltpbmRleF0uc3RhdHVzID0gTE9OR19URVJNOwotICAgIGRwYi0+YnVmZmVyW2luZGV4XS5waWNOdW0gPSAoaTMyKWxvbmdUZXJtRnJhbWVJZHg7Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IE1tY29wNAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGdW5jdGlvbiB0byBzZXQgbWF4TG9uZ1Rlcm1GcmFtZUlkeCwKLSAgICAgICAgICAgIG1lbW9yeV9tYW5hZ2VtZW50X2NvbnRyb2xfb3BlcmF0aW9uIGVxdWFsIHRvIDQKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSEFOVFJPX09LICAgICAgc3VjY2VzcwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdTMyIE1tY29wNChkcGJTdG9yYWdlX3QgKmRwYiwgdTMyIG1heExvbmdUZXJtRnJhbWVJZHgpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGk7Ci0KLS8qIENvZGUgKi8KLQotICAgIGRwYi0+bWF4TG9uZ1Rlcm1GcmFtZUlkeCA9IG1heExvbmdUZXJtRnJhbWVJZHg7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgZHBiLT5tYXhSZWZGcmFtZXM7IGkrKykKLSAgICAgICAgaWYgKElTX0xPTkdfVEVSTShkcGItPmJ1ZmZlcltpXSkgJiYKLSAgICAgICAgICAoICgodTMyKWRwYi0+YnVmZmVyW2ldLnBpY051bSA+IG1heExvbmdUZXJtRnJhbWVJZHgpIHx8Ci0gICAgICAgICAgICAoZHBiLT5tYXhMb25nVGVybUZyYW1lSWR4ID09IE5PX0xPTkdfVEVSTV9GUkFNRV9JTkRJQ0VTKSApICkKLSAgICAgICAgewotICAgICAgICAgICAgU0VUX1VOVVNFRChkcGItPmJ1ZmZlcltpXSk7Ci0gICAgICAgICAgICBkcGItPm51bVJlZkZyYW1lcy0tOwotICAgICAgICAgICAgaWYgKCFkcGItPmJ1ZmZlcltpXS50b0JlRGlzcGxheWVkKQotICAgICAgICAgICAgICAgIGRwYi0+ZnVsbG5lc3MtLTsKLSAgICAgICAgfQotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBNbWNvcDUKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRnVuY3Rpb24gdG8gbWFyayBhbGwgcmVmZXJlbmNlIHBpY3R1cmVzIHVudXNlZCBmb3IgcmVmZXJlbmNlIGFuZAotICAgICAgICAgICAgc2V0IG1heExvbmdUZXJtRnJhbWVJZHggdG8gTk9fTE9OR19URVJNX0ZSQU1FX0lORElDRVMsCi0gICAgICAgICAgICBtZW1vcnlfbWFuYWdlbWVudF9jb250cm9sX29wZXJhdGlvbiBlcXVhbCB0byA1LiBGdW5jdGlvbiBmbHVzaGVzCi0gICAgICAgICAgICB0aGUgYnVmZmVyIGFuZCBwbGFjZXMgYWxsIHBpY3R1cmVzIHRoYXQgYXJlIG5lZWRlZCBmb3IgZGlzcGxheSBpbnRvCi0gICAgICAgICAgICB0aGUgb3V0cHV0IGJ1ZmZlci4KLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSEFOVFJPX09LICAgICAgc3VjY2VzcwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdTMyIE1tY29wNShkcGJTdG9yYWdlX3QgKmRwYikKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaTsKLQotLyogQ29kZSAqLwotCi0gICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0gICAgewotICAgICAgICBpZiAoSVNfUkVGRVJFTkNFKGRwYi0+YnVmZmVyW2ldKSkKLSAgICAgICAgewotICAgICAgICAgICAgU0VUX1VOVVNFRChkcGItPmJ1ZmZlcltpXSk7Ci0gICAgICAgICAgICBpZiAoIWRwYi0+YnVmZmVyW2ldLnRvQmVEaXNwbGF5ZWQpCi0gICAgICAgICAgICAgICAgZHBiLT5mdWxsbmVzcy0tOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogb3V0cHV0IGFsbCBwaWN0dXJlcyAqLwotICAgIHdoaWxlIChPdXRwdXRQaWN0dXJlKGRwYikgPT0gSEFOVFJPX09LKQotICAgICAgICA7Ci0gICAgZHBiLT5udW1SZWZGcmFtZXMgPSAwOwotICAgIGRwYi0+bWF4TG9uZ1Rlcm1GcmFtZUlkeCA9IE5PX0xPTkdfVEVSTV9GUkFNRV9JTkRJQ0VTOwotICAgIGRwYi0+cHJldlJlZkZyYW1lTnVtID0gMDsKLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogTW1jb3A2Ci0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGFzc2lnbiBsb25nVGVybUZyYW1lSWR4IHRvIHRoZSBjdXJyZW50IHBpY3R1cmUsCi0gICAgICAgICAgICBtZW1vcnlfbWFuYWdlbWVudF9jb250cm9sX29wZXJhdGlvbiBlcXVhbCB0byA2Ci0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEhBTlRST19PSyAgICAgIHN1Y2Nlc3MKLSAgICAgICAgICAgIEhBTlRST19OT0sgICAgIGludmFsaWQgbG9uZ1Rlcm1GcmFtZUlkeCBvciBubyByb29tIGZvciBjdXJyZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0dXJlIGluIHRoZSBidWZmZXIKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHUzMiBNbWNvcDYoZHBiU3RvcmFnZV90ICpkcGIsIHUzMiBmcmFtZU51bSwgaTMyIHBpY09yZGVyQ250LAotICAgIHUzMiBsb25nVGVybUZyYW1lSWR4KQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoZnJhbWVOdW0gPCBkcGItPm1heEZyYW1lTnVtKTsKLQotICAgIGlmICggKGRwYi0+bWF4TG9uZ1Rlcm1GcmFtZUlkeCA9PSBOT19MT05HX1RFUk1fRlJBTUVfSU5ESUNFUykgfHwKLSAgICAgICAgIChsb25nVGVybUZyYW1lSWR4ID4gZHBiLT5tYXhMb25nVGVybUZyYW1lSWR4KSApCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIC8qIGNoZWNrIGlmIGEgbG9uZyB0ZXJtIHBpY3R1cmUgd2l0aCB0aGUgc2FtZSBsb25nVGVybUZyYW1lSWR4IGFscmVhZHkKLSAgICAgKiBleGlzdCBhbmQgcmVtb3ZlIGl0IGlmIG5lY2Vzc2FyeSAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBkcGItPm1heFJlZkZyYW1lczsgaSsrKQotICAgICAgICBpZiAoSVNfTE9OR19URVJNKGRwYi0+YnVmZmVyW2ldKSAmJgotICAgICAgICAgICh1MzIpZHBiLT5idWZmZXJbaV0ucGljTnVtID09IGxvbmdUZXJtRnJhbWVJZHgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNFVF9VTlVTRUQoZHBiLT5idWZmZXJbaV0pOwotICAgICAgICAgICAgZHBiLT5udW1SZWZGcmFtZXMtLTsKLSAgICAgICAgICAgIGlmICghZHBiLT5idWZmZXJbaV0udG9CZURpc3BsYXllZCkKLSAgICAgICAgICAgICAgICBkcGItPmZ1bGxuZXNzLS07Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgaWYgKGRwYi0+bnVtUmVmRnJhbWVzIDwgZHBiLT5tYXhSZWZGcmFtZXMpCi0gICAgewotICAgICAgICBkcGItPmN1cnJlbnRPdXQtPmZyYW1lTnVtID0gZnJhbWVOdW07Ci0gICAgICAgIGRwYi0+Y3VycmVudE91dC0+cGljTnVtICAgPSAoaTMyKWxvbmdUZXJtRnJhbWVJZHg7Ci0gICAgICAgIGRwYi0+Y3VycmVudE91dC0+cGljT3JkZXJDbnQgPSBwaWNPcmRlckNudDsKLSAgICAgICAgZHBiLT5jdXJyZW50T3V0LT5zdGF0dXMgICA9IExPTkdfVEVSTTsKLSAgICAgICAgaWYgKGRwYi0+bm9SZW9yZGVyaW5nKQotICAgICAgICAgICAgZHBiLT5jdXJyZW50T3V0LT50b0JlRGlzcGxheWVkID0gSEFOVFJPX0ZBTFNFOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBkcGItPmN1cnJlbnRPdXQtPnRvQmVEaXNwbGF5ZWQgPSBIQU5UUk9fVFJVRTsKLSAgICAgICAgZHBiLT5udW1SZWZGcmFtZXMrKzsKLSAgICAgICAgZHBiLT5mdWxsbmVzcysrOwotICAgICAgICByZXR1cm4oSEFOVFJPX09LKTsKLSAgICB9Ci0gICAgLyogaWYgdGhlcmUgaXMgbm8gcm9vbSwgcmV0dXJuIGFuIGVycm9yICovCi0gICAgZWxzZQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkTWFya0RlY1JlZlBpYwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGdW5jdGlvbiB0byBwZXJmb3JtIHJlZmVyZW5jZSBwaWN0dXJlIG1hcmtpbmcgcHJvY2Vzcy4gVGhpcwotICAgICAgICAgICAgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBib3RoIGZvciByZWZlcmVuY2UgYW5kIG5vbi1yZWZlcmVuY2UKLSAgICAgICAgICAgIHBpY3R1cmVzLiAgTm9uLXJlZmVyZW5jZSBwaWN0dXJlcyBzaGFsbCBoYXZlIG1hcmsgcG9pbnRlciBzZXQgdG8KLSAgICAgICAgICAgIE5VTEwuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgZHBiICAgICAgICAgcG9pbnRlciB0byB0aGUgRFBCIGRhdGEgc3RydWN0dXJlCi0gICAgICAgICAgICBtYXJrICAgICAgICBwb2ludGVyIHRvIHJlZmVyZW5jZSBwaWN0dXJlIG1hcmtpbmcgY29tbWFuZHMKLSAgICAgICAgICAgIGltYWdlICAgICAgIHBvaW50ZXIgdG8gY3VycmVudCBwaWN0dXJlIHRvIGJlIHBsYWNlZCBpbiB0aGUgYnVmZmVyCi0gICAgICAgICAgICBmcmFtZU51bSAgICBmcmFtZSBudW1iZXIgb2YgdGhlIGN1cnJlbnQgcGljdHVyZQotICAgICAgICAgICAgcGljT3JkZXJDbnQgcGljdHVyZSBvcmRlciBjb3VudCBmb3IgdGhlIGN1cnJlbnQgcGljdHVyZQotICAgICAgICAgICAgaXNJZHIgICAgICAgZmxhZyB0byBpbmRpY2F0ZSBpZiB0aGUgY3VycmVudCBwaWN0dXJlIGlzIGFuCi0gICAgICAgICAgICAgICAgICAgICAgICBJRFIgcGljdHVyZQotICAgICAgICAgICAgY3VycmVudFBpY0lkICAgIGlkZW50aWZpZXIgZm9yIHRoZSBjdXJyZW50IHBpY3R1cmUsIGZyb20gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24sIHN0b3JlZCBhbG9uZyB3aXRoIHRoZSBwaWN0dXJlCi0gICAgICAgICAgICBudW1FcnJNYnMgICAgICAgbnVtYmVyIG9mIGNvbmNlYWxlZCBtYWNyb2Jsb2NrcyBpbiB0aGUgY3VycmVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3R1cmUsIHN0b3JlZCBhbG9uZyB3aXRoIHRoZSBwaWN0dXJlCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIGRwYiAgICAgICAgICdidWZmZXInIG1vZGlmaWVkLCBwb3NzaWJsZSBvdXRwdXQgZnJhbWVzIHBsYWNlZCBpbnRvCi0gICAgICAgICAgICAgICAgICAgICAgICAnb3V0QnVmJwotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIQU5UUk9fT0sgICBzdWNjZXNzCi0gICAgICAgICAgICBIQU5UUk9fTk9LICBmYWlsdXJlCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkTWFya0RlY1JlZlBpYygKLSAgZHBiU3RvcmFnZV90ICpkcGIsCi0gIGRlY1JlZlBpY01hcmtpbmdfdCAqbWFyaywKLSAgaW1hZ2VfdCAqaW1hZ2UsCi0gIHUzMiBmcmFtZU51bSwKLSAgaTMyIHBpY09yZGVyQ250LAotICB1MzIgaXNJZHIsCi0gIHUzMiBjdXJyZW50UGljSWQsCi0gIHUzMiBudW1FcnJNYnMpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGksIHN0YXR1czsKLSAgICB1MzIgbWFya2VkQXNMb25nVGVybTsKLSAgICB1MzIgdG9CZURpc3BsYXllZDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGRwYik7Ci0gICAgQVNTRVJUKG1hcmsgfHwgIWlzSWRyKTsKLSAgICBBU1NFUlQoIWlzSWRyIHx8IChmcmFtZU51bSA9PSAwICYmIHBpY09yZGVyQ250ID09IDApKTsKLSAgICBBU1NFUlQoZnJhbWVOdW0gPCBkcGItPm1heEZyYW1lTnVtKTsKLQotICAgIGlmIChpbWFnZS0+ZGF0YSAhPSBkcGItPmN1cnJlbnRPdXQtPmRhdGEpCi0gICAgewotICAgICAgICBFUFJJTlQoIlRSWUlORyBUTyBNQVJLIE5PTi1BTExPQ0FURUQgSU1BR0UiKTsKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIH0KLQotICAgIGRwYi0+bGFzdENvbnRhaW5zTW1jbzUgPSBIQU5UUk9fRkFMU0U7Ci0gICAgc3RhdHVzID0gSEFOVFJPX09LOwotCi0gICAgdG9CZURpc3BsYXllZCA9IGRwYi0+bm9SZW9yZGVyaW5nID8gSEFOVFJPX0ZBTFNFIDogSEFOVFJPX1RSVUU7Ci0KLSAgICAvKiBub24tcmVmZXJlbmNlIHBpY3R1cmUsIHN0b3JlZCBmb3IgZGlzcGxheSByZW9yZGVyaW5nIHB1cnBvc2VzICovCi0gICAgaWYgKG1hcmsgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIGRwYi0+Y3VycmVudE91dC0+c3RhdHVzID0gVU5VU0VEOwotICAgICAgICBkcGItPmN1cnJlbnRPdXQtPmZyYW1lTnVtID0gZnJhbWVOdW07Ci0gICAgICAgIGRwYi0+Y3VycmVudE91dC0+cGljTnVtID0gKGkzMilmcmFtZU51bTsKLSAgICAgICAgZHBiLT5jdXJyZW50T3V0LT5waWNPcmRlckNudCA9IHBpY09yZGVyQ250OwotICAgICAgICBkcGItPmN1cnJlbnRPdXQtPnRvQmVEaXNwbGF5ZWQgPSB0b0JlRGlzcGxheWVkOwotICAgICAgICBpZiAoIWRwYi0+bm9SZW9yZGVyaW5nKQotICAgICAgICAgICAgZHBiLT5mdWxsbmVzcysrOwotICAgIH0KLSAgICAvKiBJRFIgcGljdHVyZSAqLwotICAgIGVsc2UgaWYgKGlzSWRyKQotICAgIHsKLQotICAgICAgICAvKiBoMjY0YnNkQ2hlY2tHYXBzSW5GcmFtZU51bSBub3QgY2FsbGVkIGZvciBJRFIgcGljdHVyZXMgLT4gaGF2ZSB0bwotICAgICAgICAgKiByZXNldCBudW1PdXQgYW5kIG91dEluZGV4IGhlcmUgKi8KLSAgICAgICAgZHBiLT5udW1PdXQgPSBkcGItPm91dEluZGV4ID0gMDsKLQotICAgICAgICAvKiBmbHVzaCB0aGUgYnVmZmVyICovCi0gICAgICAgIE1tY29wNShkcGIpOwotICAgICAgICAvKiBpZiBub091dHB1dE9mUHJpb3JQaWNzRmxhZyB3YXMgc2V0IC0+IHRoZSBwaWN0dXJlcyBwcmVjZWRpbmcgdGhlCi0gICAgICAgICAqIElEUiBwaWN0dXJlIHNoYWxsIG5vdCBiZSBvdXRwdXQgLT4gc2V0IG91dHB1dCBidWZmZXIgZW1wdHkgKi8KLSAgICAgICAgaWYgKG1hcmstPm5vT3V0cHV0T2ZQcmlvclBpY3NGbGFnIHx8IGRwYi0+bm9SZW9yZGVyaW5nKQotICAgICAgICB7Ci0gICAgICAgICAgICBkcGItPm51bU91dCA9IDA7Ci0gICAgICAgICAgICBkcGItPm91dEluZGV4ID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtYXJrLT5sb25nVGVybVJlZmVyZW5jZUZsYWcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRwYi0+Y3VycmVudE91dC0+c3RhdHVzID0gTE9OR19URVJNOwotICAgICAgICAgICAgZHBiLT5tYXhMb25nVGVybUZyYW1lSWR4ID0gMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRwYi0+Y3VycmVudE91dC0+c3RhdHVzID0gU0hPUlRfVEVSTTsKLSAgICAgICAgICAgIGRwYi0+bWF4TG9uZ1Rlcm1GcmFtZUlkeCA9IE5PX0xPTkdfVEVSTV9GUkFNRV9JTkRJQ0VTOwotICAgICAgICB9Ci0gICAgICAgIGRwYi0+Y3VycmVudE91dC0+ZnJhbWVOdW0gID0gMDsKLSAgICAgICAgZHBiLT5jdXJyZW50T3V0LT5waWNOdW0gICAgPSAwOwotICAgICAgICBkcGItPmN1cnJlbnRPdXQtPnBpY09yZGVyQ250ID0gMDsKLSAgICAgICAgZHBiLT5jdXJyZW50T3V0LT50b0JlRGlzcGxheWVkID0gdG9CZURpc3BsYXllZDsKLSAgICAgICAgZHBiLT5mdWxsbmVzcyA9IDE7Ci0gICAgICAgIGRwYi0+bnVtUmVmRnJhbWVzID0gMTsKLSAgICB9Ci0gICAgLyogcmVmZXJlbmNlIHBpY3R1cmUgKi8KLSAgICBlbHNlCi0gICAgewotICAgICAgICBtYXJrZWRBc0xvbmdUZXJtID0gSEFOVFJPX0ZBTFNFOwotICAgICAgICBpZiAobWFyay0+YWRhcHRpdmVSZWZQaWNNYXJraW5nTW9kZUZsYWcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGkgPSAwOwotICAgICAgICAgICAgd2hpbGUgKG1hcmstPm9wZXJhdGlvbltpXS5tZW1vcnlNYW5hZ2VtZW50Q29udHJvbE9wZXJhdGlvbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKG1hcmstPm9wZXJhdGlvbltpXS5tZW1vcnlNYW5hZ2VtZW50Q29udHJvbE9wZXJhdGlvbikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IE1tY29wMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZHBiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZU51bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyay0+b3BlcmF0aW9uW2ldLmRpZmZlcmVuY2VPZlBpY051bXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gTW1jb3AyKGRwYiwgbWFyay0+b3BlcmF0aW9uW2ldLmxvbmdUZXJtUGljTnVtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9ICBNbWNvcDMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRwYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVOdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmstPm9wZXJhdGlvbltpXS5kaWZmZXJlbmNlT2ZQaWNOdW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrLT5vcGVyYXRpb25baV0ubG9uZ1Rlcm1GcmFtZUlkeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBNbWNvcDQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRwYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyay0+b3BlcmF0aW9uW2ldLm1heExvbmdUZXJtRnJhbWVJZHgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gTW1jb3A1KGRwYik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkcGItPmxhc3RDb250YWluc01tY281ID0gSEFOVFJPX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmFtZU51bSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBNbWNvcDYoCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRwYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVOdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBpY09yZGVyQ250LAotICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrLT5vcGVyYXRpb25baV0ubG9uZ1Rlcm1GcmFtZUlkeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZWRBc0xvbmdUZXJtID0gSEFOVFJPX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiAvKiBpbnZhbGlkIG1lbW9yeSBtYW5hZ2VtZW50IGNvbnRyb2wgb3BlcmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBIQU5UUk9fTk9LOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IFNsaWRpbmdXaW5kb3dSZWZQaWNNYXJraW5nKGRwYik7Ci0gICAgICAgIH0KLSAgICAgICAgLyogaWYgY3VycmVudCBwaWN0dXJlIHdhcyBub3QgbWFya2VkIGFzIGxvbmctdGVybSByZWZlcmVuY2UgYnkKLSAgICAgICAgICogbWVtb3J5IG1hbmFnZW1lbnQgY29udHJvbCBvcGVyYXRpb24gNiAtPiBtYXJrIGN1cnJlbnQgYXMgc2hvcnQKLSAgICAgICAgICogdGVybSBhbmQgaW5zZXJ0IGl0IGludG8gZHBiIChpZiB0aGVyZSBpcyByb29tKSAqLwotICAgICAgICBpZiAoIW1hcmtlZEFzTG9uZ1Rlcm0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChkcGItPm51bVJlZkZyYW1lcyA8IGRwYi0+bWF4UmVmRnJhbWVzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRwYi0+Y3VycmVudE91dC0+ZnJhbWVOdW0gPSBmcmFtZU51bTsKLSAgICAgICAgICAgICAgICBkcGItPmN1cnJlbnRPdXQtPnBpY051bSAgID0gKGkzMilmcmFtZU51bTsKLSAgICAgICAgICAgICAgICBkcGItPmN1cnJlbnRPdXQtPnBpY09yZGVyQ250ID0gcGljT3JkZXJDbnQ7Ci0gICAgICAgICAgICAgICAgZHBiLT5jdXJyZW50T3V0LT5zdGF0dXMgICA9IFNIT1JUX1RFUk07Ci0gICAgICAgICAgICAgICAgZHBiLT5jdXJyZW50T3V0LT50b0JlRGlzcGxheWVkID0gdG9CZURpc3BsYXllZDsKLSAgICAgICAgICAgICAgICBkcGItPmZ1bGxuZXNzKys7Ci0gICAgICAgICAgICAgICAgZHBiLT5udW1SZWZGcmFtZXMrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIG5vIHJvb20gKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBIQU5UUk9fTk9LOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgZHBiLT5jdXJyZW50T3V0LT5pc0lkciA9IGlzSWRyOwotICAgIGRwYi0+Y3VycmVudE91dC0+cGljSWQgPSBjdXJyZW50UGljSWQ7Ci0gICAgZHBiLT5jdXJyZW50T3V0LT5udW1FcnJNYnMgPSBudW1FcnJNYnM7Ci0KLSAgICAvKiBkcGIgd2FzIGluaXRpYWxpemVkIHRvIG5vdCB0byByZW9yZGVyIHRoZSBwaWN0dXJlcyAtPiBvdXRwdXQgY3VycmVudAotICAgICAqIHBpY3R1cmUgaW1tZWRpYXRlbHkgKi8KLSAgICBpZiAoZHBiLT5ub1Jlb3JkZXJpbmcpCi0gICAgewotICAgICAgICBBU1NFUlQoZHBiLT5udW1PdXQgPT0gMCk7Ci0gICAgICAgIEFTU0VSVChkcGItPm91dEluZGV4ID09IDApOwotICAgICAgICBkcGItPm91dEJ1ZltkcGItPm51bU91dF0uZGF0YSAgPSBkcGItPmN1cnJlbnRPdXQtPmRhdGE7Ci0gICAgICAgIGRwYi0+b3V0QnVmW2RwYi0+bnVtT3V0XS5pc0lkciA9IGRwYi0+Y3VycmVudE91dC0+aXNJZHI7Ci0gICAgICAgIGRwYi0+b3V0QnVmW2RwYi0+bnVtT3V0XS5waWNJZCA9IGRwYi0+Y3VycmVudE91dC0+cGljSWQ7Ci0gICAgICAgIGRwYi0+b3V0QnVmW2RwYi0+bnVtT3V0XS5udW1FcnJNYnMgPSBkcGItPmN1cnJlbnRPdXQtPm51bUVyck1iczsKLSAgICAgICAgZHBiLT5udW1PdXQrKzsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogb3V0cHV0IHBpY3R1cmVzIGlmIGJ1ZmZlciBmdWxsICovCi0gICAgICAgIHdoaWxlIChkcGItPmZ1bGxuZXNzID4gZHBiLT5kcGJTaXplKQotICAgICAgICB7Ci0gICAgICAgICAgICBpID0gT3V0cHV0UGljdHVyZShkcGIpOwotICAgICAgICAgICAgQVNTRVJUKGkgPT0gSEFOVFJPX09LKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIHNvcnQgZHBiICovCi0gICAgU2hlbGxTb3J0KGRwYi0+YnVmZmVyLCBkcGItPmRwYlNpemUrMSk7Ci0KLSAgICByZXR1cm4oc3RhdHVzKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RHZXRSZWZQaWNEYXRhCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGdldCByZWZlcmVuY2UgcGljdHVyZSBkYXRhIGZyb20gdGhlIHJlZmVyZW5jZSBwaWN0dXJlCi0gICAgICAgICAgICBsaXN0Ci0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIHBvaW50ZXIgdG8gZGVzaXJlZCByZWZlcmVuY2UgcGljdHVyZSBkYXRhCi0gICAgICAgICAgICBOVUxMIGlmIGludmFsaWQgaW5kZXggb3Igbm9uLWV4aXN0aW5nIHBpY3R1cmUgcmVmZXJyZWQKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTgqIGgyNjRic2RHZXRSZWZQaWNEYXRhKGRwYlN0b3JhZ2VfdCAqZHBiLCB1MzIgaW5kZXgpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0vKiBDb2RlICovCi0KLSAgICBpZihpbmRleCA+IDE2IHx8IGRwYi0+bGlzdFtpbmRleF0gPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuKE5VTEwpOwotICAgIGVsc2UgaWYoIUlTX0VYSVNUSU5HKCpkcGItPmxpc3RbaW5kZXhdKSkKLSAgICAgICAgcmV0dXJuKE5VTEwpOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuKGRwYi0+bGlzdFtpbmRleF0tPmRhdGEpOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZEFsbG9jYXRlRHBiSW1hZ2UKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgZnVuY3Rpb24gdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBhIGltYWdlLiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90Ci0gICAgICAgICAgICByZWFsbHkgYWxsb2NhdGUgYW55IG1lbW9yeSBidXQgcmVzZXJ2ZXMgb25lIG9mIHRoZSBidWZmZXIKLSAgICAgICAgICAgIHBvc2l0aW9ucyBmb3IgZGVjb2Rpbmcgb2YgY3VycmVudCBwaWN0dXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIHBvaW50ZXIgdG8gbWVtb3J5IGFyZWEgZm9yIHRoZSBpbWFnZQotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXU4KiBoMjY0YnNkQWxsb2NhdGVEcGJJbWFnZShkcGJTdG9yYWdlX3QgKmRwYikKLXsKLQotLyogVmFyaWFibGVzICovCi0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVCggIWRwYi0+YnVmZmVyW2RwYi0+ZHBiU2l6ZV0udG9CZURpc3BsYXllZCAmJgotICAgICAgICAgICAgIUlTX1JFRkVSRU5DRShkcGItPmJ1ZmZlcltkcGItPmRwYlNpemVdKSApOwotICAgIEFTU0VSVChkcGItPmZ1bGxuZXNzIDw9ICBkcGItPmRwYlNpemUpOwotCi0gICAgZHBiLT5jdXJyZW50T3V0ID0gZHBiLT5idWZmZXIgKyBkcGItPmRwYlNpemU7Ci0KLSAgICByZXR1cm4oZHBiLT5jdXJyZW50T3V0LT5kYXRhKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IFNsaWRpbmdXaW5kb3dSZWZQaWNNYXJraW5nCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZ1bmN0aW9uIHRvIHBlcmZvcm0gc2xpZGluZyB3aW5kb3cgcmVmZW5jZSBwaWN0dXJlIG1hcmtpbmcgcHJvY2Vzcy4KLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgSEFOVFJPX09LICAgICAgc3VjY2VzcwotICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgZmFpbHVyZSwgbm8gc2hvcnQtdGVybSByZWZlcmVuY2UgZnJhbWUgZm91bmQgdGhhdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bGQgYmUgbWFya2VkIHVudXNlZAotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1MzIgU2xpZGluZ1dpbmRvd1JlZlBpY01hcmtpbmcoZHBiU3RvcmFnZV90ICpkcGIpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgaTMyIGluZGV4LCBwaWNOdW07Ci0gICAgdTMyIGk7Ci0KLS8qIENvZGUgKi8KLQotICAgIGlmIChkcGItPm51bVJlZkZyYW1lcyA8IGRwYi0+bWF4UmVmRnJhbWVzKQotICAgIHsKLSAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGluZGV4ID0gLTE7Ci0gICAgICAgIHBpY051bSA9IDA7Ci0gICAgICAgIC8qIGZpbmQgdGhlIG9sZGVzdCBzaG9ydCB0ZXJtIHBpY3R1cmUgKi8KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGRwYi0+bnVtUmVmRnJhbWVzOyBpKyspCi0gICAgICAgICAgICBpZiAoSVNfU0hPUlRfVEVSTShkcGItPmJ1ZmZlcltpXSkpCi0gICAgICAgICAgICAgICAgaWYgKGRwYi0+YnVmZmVyW2ldLnBpY051bSA8IHBpY051bSB8fCBpbmRleCA9PSAtMSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGluZGV4ID0gKGkzMilpOwotICAgICAgICAgICAgICAgICAgICBwaWNOdW0gPSBkcGItPmJ1ZmZlcltpXS5waWNOdW07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICBpZiAoaW5kZXggPj0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgU0VUX1VOVVNFRChkcGItPmJ1ZmZlcltpbmRleF0pOwotICAgICAgICAgICAgZHBiLT5udW1SZWZGcmFtZXMtLTsKLSAgICAgICAgICAgIGlmICghZHBiLT5idWZmZXJbaW5kZXhdLnRvQmVEaXNwbGF5ZWQpCi0gICAgICAgICAgICAgICAgZHBiLT5mdWxsbmVzcy0tOwotCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX09LKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RJbml0RHBiCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGluaXRpYWxpemUgRFBCLiBSZXNlcnZlcyBtZW1vcmllcyBmb3IgdGhlIGJ1ZmZlciwKLSAgICAgICAgICAgIHJlZmVyZW5jZSBwaWN0dXJlIGxpc3QgYW5kIG91dHB1dCBidWZmZXIuIGRwYlNpemUgaW5kaWNhdGVzCi0gICAgICAgICAgICB0aGUgbWF4aW11bSBEUEIgc2l6ZSBpbmRpY2F0ZWQgYnkgdGhlIGxldmVsSWRjIGluIHRoZSBzdHJlYW0uCi0gICAgICAgICAgICBJZiBub1Jlb3JkZXJpbmcgZmxhZyBpcyBGQUxTRSB0aGUgRFBCIHN0b3JlcyBkcGJTaXplIHBpY3R1cmVzCi0gICAgICAgICAgICBmb3IgZGlzcGxheSByZW9yZGVyaW5nIHB1cnBvc2VzLiBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgdGhlCi0gICAgICAgICAgICBmbGFnIGlzIFRSVUUgdGhlIERQQiBvbmx5IHN0b3JlcyBtYXhSZWZGcmFtZXMgcmVmZXJlbmNlIHBpY3R1cmVzCi0gICAgICAgICAgICBhbmQgb3V0cHV0cyBhbGwgdGhlIHBpY3R1cmVzIGltbWVkaWF0ZWx5LgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBpY1NpemVJbk1icyAgICBwaWN0dXJlIHNpemUgaW4gbWFjcm9ibG9ja3MKLSAgICAgICAgICAgIGRwYlNpemUgICAgICAgICBzaXplIG9mIHRoZSBEUEIgKG51bWJlciBvZiBwaWN0dXJlcykKLSAgICAgICAgICAgIG1heFJlZkZyYW1lcyAgICBtYXggbnVtYmVyIG9mIHJlZmVyZW5jZSBmcmFtZXMKLSAgICAgICAgICAgIG1heEZyYW1lTnVtICAgICBtYXggZnJhbWUgbnVtYmVyCi0gICAgICAgICAgICBub1Jlb3JkZXJpbmcgICAgZmxhZyB0byBpbmRpY2F0ZSB0aGF0IERQQiBkb2VzIG5vdCBoYXZlIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlcGFyZSB0byByZW9yZGVyIGZyYW1lcyBmb3IgZGlzcGxheQotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBkcGIgICAgICAgICAgICAgcG9pbnRlciB0byBkcGIgZGF0YSBzdG9yYWdlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCi0gICAgICAgICAgICBNRU1PUllfQUxMT0NBVElPTl9FUlJPUiBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2RJbml0RHBiKAotICBkcGJTdG9yYWdlX3QgKmRwYiwKLSAgdTMyIHBpY1NpemVJbk1icywKLSAgdTMyIGRwYlNpemUsCi0gIHUzMiBtYXhSZWZGcmFtZXMsCi0gIHUzMiBtYXhGcmFtZU51bSwKLSAgdTMyIG5vUmVvcmRlcmluZykKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaTsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBpY1NpemVJbk1icyk7Ci0gICAgQVNTRVJUKG1heFJlZkZyYW1lcyA8PSBNQVhfTlVNX1JFRl9QSUNTKTsKLSAgICBBU1NFUlQobWF4UmVmRnJhbWVzIDw9IGRwYlNpemUpOwotICAgIEFTU0VSVChtYXhGcmFtZU51bSk7Ci0gICAgQVNTRVJUKGRwYlNpemUpOwotCi0gICAgLy8gc2VlIGNvbW1lbnQgaW4gbG9vcCBiZWxvdyBhYm91dCBzaXplIGNhbGN1bGF0aW9uCi0gICAgaWYgKHBpY1NpemVJbk1icyA+IChVSU5UMzJfTUFYIC0gMzIgLSAxNSkgLyAzODQpIHsKLSAgICAgICAgQUxPR0UoImIvMjg1MzM1NjIiKTsKLSAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyODUzMzU2MiIpOwotICAgICAgICByZXR1cm4oTUVNT1JZX0FMTE9DQVRJT05fRVJST1IpOwotICAgIH0KLQotICAgIGRwYi0+bWF4TG9uZ1Rlcm1GcmFtZUlkeCA9IE5PX0xPTkdfVEVSTV9GUkFNRV9JTkRJQ0VTOwotICAgIGRwYi0+bWF4UmVmRnJhbWVzICAgICAgICA9IE1BWChtYXhSZWZGcmFtZXMsIDEpOwotICAgIGlmIChub1Jlb3JkZXJpbmcpCi0gICAgICAgIGRwYi0+ZHBiU2l6ZSAgICAgICAgID0gZHBiLT5tYXhSZWZGcmFtZXM7Ci0gICAgZWxzZQotICAgICAgICBkcGItPmRwYlNpemUgICAgICAgICA9IGRwYlNpemU7Ci0gICAgZHBiLT5tYXhGcmFtZU51bSAgICAgICAgID0gbWF4RnJhbWVOdW07Ci0gICAgZHBiLT5ub1Jlb3JkZXJpbmcgICAgICAgID0gbm9SZW9yZGVyaW5nOwotICAgIGRwYi0+ZnVsbG5lc3MgICAgICAgICAgICA9IDA7Ci0gICAgZHBiLT5udW1SZWZGcmFtZXMgICAgICAgID0gMDsKLSAgICBkcGItPnByZXZSZWZGcmFtZU51bSAgICAgPSAwOwotCi0gICAgQUxMT0NBVEUoZHBiLT5idWZmZXIsIE1BWF9OVU1fUkVGX0lEWF9MMF9BQ1RJVkUgKyAxLCBkcGJQaWN0dXJlX3QpOwotICAgIGlmIChkcGItPmJ1ZmZlciA9PSBOVUxMKQotICAgICAgICByZXR1cm4oTUVNT1JZX0FMTE9DQVRJT05fRVJST1IpOwotICAgIEgyNjRTd0RlY01lbXNldChkcGItPmJ1ZmZlciwgMCwKLSAgICAgICAgICAgIChNQVhfTlVNX1JFRl9JRFhfTDBfQUNUSVZFICsgMSkqc2l6ZW9mKGRwYlBpY3R1cmVfdCkpOwotICAgIGZvciAoaSA9IDA7IGkgPCBkcGItPmRwYlNpemUgKyAxOyBpKyspCi0gICAgewotICAgICAgICAvKiBBbGxvY2F0ZSBuZWVkZWQgYW1vdW50IG9mIG1lbW9yeSwgd2hpY2ggaXM6Ci0gICAgICAgICAqIGltYWdlIHNpemUgKyAzMiArIDE1LCB3aGVyZSAzMiBjYW1lcyBmcm9tIHRoZSBmYWN0IHRoYXQgaW4gQVJNIE9wZW5NYXgKLSAgICAgICAgICogREwgaW1wbGVtZW50YXRpb24gRnVuY3Rpb25zIG1heSByZWFkIGJleW9uZCB0aGUgZW5kIG9mIGFuIGFycmF5LAotICAgICAgICAgKiBieSBhIG1heGltdW0gb2YgMzIgYnl0ZXMuIEFuZCArMTUgY2FtZXMgZm9yIHRoZSBuZWVkIHRvIGFsaWduIG1lbW9yeQotICAgICAgICAgKiB0byAxNi1ieXRlIGJvdW5kYXJ5ICovCi0gICAgICAgIEFMTE9DQVRFKGRwYi0+YnVmZmVyW2ldLnBBbGxvY2F0ZWREYXRhLCAocGljU2l6ZUluTWJzKjM4NCArIDMyKzE1KSwgdTgpOwotICAgICAgICBpZiAoZHBiLT5idWZmZXJbaV0ucEFsbG9jYXRlZERhdGEgPT0gTlVMTCkKLSAgICAgICAgICAgIHJldHVybihNRU1PUllfQUxMT0NBVElPTl9FUlJPUik7Ci0KLSAgICAgICAgZHBiLT5idWZmZXJbaV0uZGF0YSA9IEFMSUdOKGRwYi0+YnVmZmVyW2ldLnBBbGxvY2F0ZWREYXRhLCAxNik7Ci0gICAgfQotCi0gICAgQUxMT0NBVEUoZHBiLT5saXN0LCBNQVhfTlVNX1JFRl9JRFhfTDBfQUNUSVZFICsgMSwgZHBiUGljdHVyZV90Kik7Ci0gICAgQUxMT0NBVEUoZHBiLT5vdXRCdWYsIGRwYi0+ZHBiU2l6ZSsxLCBkcGJPdXRQaWN0dXJlX3QpOwotCi0gICAgaWYgKGRwYi0+bGlzdCA9PSBOVUxMIHx8IGRwYi0+b3V0QnVmID09IE5VTEwpCi0gICAgICAgIHJldHVybihNRU1PUllfQUxMT0NBVElPTl9FUlJPUik7Ci0KLSAgICBIMjY0U3dEZWNNZW1zZXQoZHBiLT5saXN0LCAwLAotICAgICAgICAgICAgKChNQVhfTlVNX1JFRl9JRFhfTDBfQUNUSVZFICsgMSkgKiBzaXplb2YoZHBiUGljdHVyZV90KikpICk7Ci0KLSAgICBkcGItPm51bU91dCA9IGRwYi0+b3V0SW5kZXggPSAwOwotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkUmVzZXREcGIKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRnVuY3Rpb24gdG8gcmVzZXQgRFBCLiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgd2hlbiBhbiBJRFIKLSAgICAgICAgICAgIHNsaWNlIChvdGhlciB0aGFuIHRoZSBmaXJzdCkgYWN0aXZhdGVzIG5ldyBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0LgotICAgICAgICAgICAgRnVuY3Rpb24gY2FsbHMgaDI2NGJzZEZyZWVEcGIgdG8gZnJlZSBvbGQgYWxsb2NhdGVkIG1lbW9yaWVzIGFuZAotICAgICAgICAgICAgaDI2NGJzZEluaXREcGIgdG8gcmUtaW5pdGlhbGl6ZSB0aGUgRFBCLiBTYW1lIGlucHV0cywgb3V0cHV0cyBhbmQKLSAgICAgICAgICAgIHJldHVybnMgYXMgZm9yIGgyNjRic2RJbml0RHBiLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZFJlc2V0RHBiKAotICBkcGJTdG9yYWdlX3QgKmRwYiwKLSAgdTMyIHBpY1NpemVJbk1icywKLSAgdTMyIGRwYlNpemUsCi0gIHUzMiBtYXhSZWZGcmFtZXMsCi0gIHUzMiBtYXhGcmFtZU51bSwKLSAgdTMyIG5vUmVvcmRlcmluZykKLXsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBpY1NpemVJbk1icyk7Ci0gICAgQVNTRVJUKG1heFJlZkZyYW1lcyA8PSBNQVhfTlVNX1JFRl9QSUNTKTsKLSAgICBBU1NFUlQobWF4UmVmRnJhbWVzIDw9IGRwYlNpemUpOwotICAgIEFTU0VSVChtYXhGcmFtZU51bSk7Ci0gICAgQVNTRVJUKGRwYlNpemUpOwotCi0gICAgaDI2NGJzZEZyZWVEcGIoZHBiKTsKLQotICAgIHJldHVybiBoMjY0YnNkSW5pdERwYihkcGIsIHBpY1NpemVJbk1icywgZHBiU2l6ZSwgbWF4UmVmRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhGcmFtZU51bSwgbm9SZW9yZGVyaW5nKTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkSW5pdFJlZlBpY0xpc3QKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRnVuY3Rpb24gdG8gaW5pdGlhbGl6ZSByZWZlcmVuY2UgcGljdHVyZSBsaXN0LiBGdW5jdGlvbiBqdXN0Ci0gICAgICAgICAgICBzZXRzIHBvaW50ZXJzIGluIHRoZSBsaXN0IGFjY29yZGluZyB0byBwaWN0dXJlcyBpbiB0aGUgYnVmZmVyLgotICAgICAgICAgICAgVGhlIGJ1ZmZlciBpcyBhc3N1bWVkIHRvIGNvbnRhaW4gcGljdHVyZXMgc29ydGVkIGFjY29yZGluZyB0bwotICAgICAgICAgICAgd2hhdCB0aGUgSC4yNjQgc3RhbmRhcmQgc2F5cyBhYm91dCBpbml0aWFsIHJlZmVyZW5jZSBwaWN0dXJlIGxpc3QuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgZHBiICAgICBwb2ludGVyIHRvIGRwYiBkYXRhIHN0cnVjdHVyZQotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBkcGIgICAgICdsaXN0JyBmaWVsZCBpbml0aWFsaXplZAotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBub25lCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgaDI2NGJzZEluaXRSZWZQaWNMaXN0KGRwYlN0b3JhZ2VfdCAqZHBiKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpOwotCi0vKiBDb2RlICovCi0KLSAgICBmb3IgKGkgPSAwOyBpIDwgZHBiLT5udW1SZWZGcmFtZXM7IGkrKykKLSAgICAgICAgZHBiLT5saXN0W2ldID0gJmRwYi0+YnVmZmVyW2ldOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRmluZERwYlBpYwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGdW5jdGlvbiB0byBmaW5kIGEgcmVmZXJlbmNlIHBpY3R1cmUgZnJvbSB0aGUgYnVmZmVyLiBUaGUgcGljdHVyZQotICAgICAgICAgICAgdG8gYmUgZm91bmQgaXMgaWRlbnRpZmllZCBieSBwaWNOdW0gYW5kIGlzU2hvcnRUZXJtIGZsYWcuCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIGluZGV4IG9mIHRoZSBwaWN0dXJlIGluIHRoZSBidWZmZXIKLSAgICAgICAgICAgIC0xIGlmIHRoZSBzcGVjaWZpZWQgcGljdHVyZSB3YXMgbm90IGZvdW5kIGluIHRoZSBidWZmZXIKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGkzMiBGaW5kRHBiUGljKGRwYlN0b3JhZ2VfdCAqZHBiLCBpMzIgcGljTnVtLCB1MzIgaXNTaG9ydFRlcm0pCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGkgPSAwOwotICAgIHUzMiBmb3VuZCA9IEhBTlRST19GQUxTRTsKLQotLyogQ29kZSAqLwotCi0gICAgaWYgKGlzU2hvcnRUZXJtKQotICAgIHsKLSAgICAgICAgd2hpbGUgKGkgPCBkcGItPm1heFJlZkZyYW1lcyAmJiAhZm91bmQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChJU19TSE9SVF9URVJNKGRwYi0+YnVmZmVyW2ldKSAmJgotICAgICAgICAgICAgICBkcGItPmJ1ZmZlcltpXS5waWNOdW0gPT0gcGljTnVtKQotICAgICAgICAgICAgICAgIGZvdW5kID0gSEFOVFJPX1RSVUU7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgaSsrOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIEFTU0VSVChwaWNOdW0gPj0gMCk7Ci0gICAgICAgIHdoaWxlIChpIDwgZHBiLT5tYXhSZWZGcmFtZXMgJiYgIWZvdW5kKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoSVNfTE9OR19URVJNKGRwYi0+YnVmZmVyW2ldKSAmJgotICAgICAgICAgICAgICBkcGItPmJ1ZmZlcltpXS5waWNOdW0gPT0gcGljTnVtKQotICAgICAgICAgICAgICAgIGZvdW5kID0gSEFOVFJPX1RSVUU7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgaSsrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGZvdW5kKQotICAgICAgICByZXR1cm4oKGkzMilpKTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybigtMSk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBTZXRQaWNOdW1zCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZ1bmN0aW9uIHRvIHNldCBwaWNOdW0gdmFsdWVzIGZvciBzaG9ydC10ZXJtIHBpY3R1cmVzIGluIHRoZQotICAgICAgICAgICAgYnVmZmVyLiBOdW1iZXJpbmcgb2YgcGljdHVyZXMgaXMgYmFzZWQgb24gZnJhbWUgbnVtYmVycyBhbmQgYXMKLSAgICAgICAgICAgIGZyYW1lIG51bWJlcnMgYXJlIG1vZHVsbyBtYXhGcmFtZU51bSAtPiBmcmFtZSBudW1iZXJzIG9mIG9sZGVyCi0gICAgICAgICAgICBwaWN0dXJlcyBpbiB0aGUgYnVmZmVyIG1heSBiZSBiaWdnZXIgdGhhbiB0aGUgY3VyckZyYW1lTnVtLgotICAgICAgICAgICAgcGljTnVtcyB3aWxsIGJlIHNldCBzbyB0aGF0IGN1cnJlbnQgZnJhbWUgaGFzIHRoZSBsYXJnZXN0IHBpY051bQotICAgICAgICAgICAgYW5kIGFsbCB0aGUgc2hvcnQtdGVybSBmcmFtZXMgaW4gdGhlIGJ1ZmZlciB3aWxsIGdldCBzbWFsbGVyIHBpY051bQotICAgICAgICAgICAgcmVwcmVzZW50aW5nIHRoZWlyICJkaXN0YW5jZSIgZnJvbSB0aGUgY3VycmVudCBmcmFtZS4gVGhpcwotICAgICAgICAgICAgZnVuY3Rpb24ga2luZCBvZiBtYXBzIHRoZSBtb2R1bG8gYXJpdGhtZXRpYyBiYWNrIHRvIG5vcm1hbC4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHZvaWQgU2V0UGljTnVtcyhkcGJTdG9yYWdlX3QgKmRwYiwgdTMyIGN1cnJGcmFtZU51bSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaTsKLSAgICBpMzIgZnJhbWVOdW1XcmFwOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoZHBiKTsKLSAgICBBU1NFUlQoY3VyckZyYW1lTnVtIDwgZHBiLT5tYXhGcmFtZU51bSk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgZHBiLT5udW1SZWZGcmFtZXM7IGkrKykKLSAgICAgICAgaWYgKElTX1NIT1JUX1RFUk0oZHBiLT5idWZmZXJbaV0pKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZHBiLT5idWZmZXJbaV0uZnJhbWVOdW0gPiBjdXJyRnJhbWVOdW0pCi0gICAgICAgICAgICAgICAgZnJhbWVOdW1XcmFwID0KLSAgICAgICAgICAgICAgICAgICAgKGkzMilkcGItPmJ1ZmZlcltpXS5mcmFtZU51bSAtIChpMzIpZHBiLT5tYXhGcmFtZU51bTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBmcmFtZU51bVdyYXAgPSAoaTMyKWRwYi0+YnVmZmVyW2ldLmZyYW1lTnVtOwotICAgICAgICAgICAgZHBiLT5idWZmZXJbaV0ucGljTnVtID0gZnJhbWVOdW1XcmFwOwotICAgICAgICB9Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkQ2hlY2tHYXBzSW5GcmFtZU51bQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGdW5jdGlvbiB0byBjaGVjayBnYXBzIGluIGZyYW1lX251bSBhbmQgZ2VuZXJhdGUgbm9uLWV4aXN0aW5nCi0gICAgICAgICAgICAoc2hvcnQgdGVybSkgcmVmZXJlbmNlIHBpY3R1cmVzIGlmIG5lY2Vzc2FyeS4gVGhpcyBmdW5jdGlvbiBzaG91bGQKLSAgICAgICAgICAgIGJlIGNhbGxlZCBvbmx5IGZvciBub24tSURSIHBpY3R1cmVzLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIGRwYiAgICAgICAgIHBvaW50ZXIgdG8gZHBiIGRhdGEgc3RydWN0dXJlCi0gICAgICAgICAgICBmcmFtZU51bSAgICBmcmFtZSBudW1iZXIgb2YgdGhlIGN1cnJlbnQgcGljdHVyZQotICAgICAgICAgICAgaXNSZWZQaWMgICAgZmxhZyB0byBpbmRpY2F0ZSBpZiBjdXJyZW50IHBpY3R1cmUgaXMgYSByZWZlcmVuY2Ugb3IKLSAgICAgICAgICAgICAgICAgICAgICAgIG5vbi1yZWZlcmVuY2UgcGljdHVyZQotICAgICAgICAgICAgZ2Fwc0FsbG93ZWQgRmxhZyB3aGljaCBpbmRpY2F0ZXMgYWN0aXZlIFNQUyBzdGFuY2Ugb24gd2hldGhlcgotICAgICAgICAgICAgICAgICAgICAgICAgdG8gYWxsb3cgZ2FwcwotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBkcGIgICAgICAgICAnYnVmZmVyJyBwb3NzaWJseSBtb2RpZmllZCBieSBpbnNlcnRpbmcgbm9uLWV4aXN0aW5nCi0gICAgICAgICAgICAgICAgICAgICAgICBwaWN0dXJlcyB3aXRoIHNsaWRpbmcgd2luZG93IG1hcmtpbmcgcHJvY2VzcwotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIQU5UUk9fT0sgICBzdWNjZXNzCi0gICAgICAgICAgICBIQU5UUk9fTk9LICBlcnJvciBpbiBzbGlkaW5nIHdpbmRvdyByZWZlcmVuY2UgcGljdHVyZSBtYXJraW5nIG9yCi0gICAgICAgICAgICAgICAgICAgICAgICBmcmFtZU51bSBlcXVhbCB0byBwcmV2aW91cyByZWZlcmVuY2UgZnJhbWUgdXNlZCBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgIGEgcmVmZXJlbmNlIHBpY3R1cmUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2RDaGVja0dhcHNJbkZyYW1lTnVtKGRwYlN0b3JhZ2VfdCAqZHBiLCB1MzIgZnJhbWVOdW0sIHUzMiBpc1JlZlBpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgZ2Fwc0FsbG93ZWQpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHVuVXNlZFNob3J0VGVybUZyYW1lTnVtOwotICAgIHU4ICp0bXA7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChkcGIpOwotICAgIEFTU0VSVChkcGItPmZ1bGxuZXNzIDw9IGRwYi0+ZHBiU2l6ZSk7Ci0gICAgQVNTRVJUKGZyYW1lTnVtIDwgZHBiLT5tYXhGcmFtZU51bSk7Ci0KLSAgICBkcGItPm51bU91dCA9IDA7Ci0gICAgZHBiLT5vdXRJbmRleCA9IDA7Ci0KLSAgICBpZighZ2Fwc0FsbG93ZWQpCi0gICAgICAgIHJldHVybihIQU5UUk9fT0spOwotCi0gICAgaWYgKCAoZnJhbWVOdW0gIT0gZHBiLT5wcmV2UmVmRnJhbWVOdW0pICYmCi0gICAgICAgICAoZnJhbWVOdW0gIT0gKChkcGItPnByZXZSZWZGcmFtZU51bSArIDEpICUgZHBiLT5tYXhGcmFtZU51bSkpKQotICAgIHsKLQotICAgICAgICB1blVzZWRTaG9ydFRlcm1GcmFtZU51bSA9IChkcGItPnByZXZSZWZGcmFtZU51bSArIDEpICUgZHBiLT5tYXhGcmFtZU51bTsKLQotICAgICAgICAvKiBzdG9yZSBkYXRhIHBvaW50ZXIgb2YgbGFzdCBidWZmZXIgcG9zaXRpb24gdG8gYmUgdXNlZCBhcyBuZXh0Ci0gICAgICAgICAqICJhbGxvY2F0ZWQiIGRhdGEgcG9pbnRlciBpZiBsYXN0IGJ1ZmZlciBwb3NpdGlvbiBhZnRlciB0aGlzIHByb2Nlc3MKLSAgICAgICAgICogY29udGFpbnMgZGF0YSBwb2ludGVyIGxvY2F0ZWQgaW4gb3V0QnVmIChidWZmZXIgcGxhY2VkIGluIHRoZSBvdXRwdXQKLSAgICAgICAgICogc2hhbGwgbm90IGJlIG92ZXJ3cml0dGVuIGJ5IHRoZSBjdXJyZW50IHBpY3R1cmUpICovCi0gICAgICAgIHRtcCA9IGRwYi0+YnVmZmVyW2RwYi0+ZHBiU2l6ZV0uZGF0YTsKLSAgICAgICAgZG8KLSAgICAgICAgewotICAgICAgICAgICAgU2V0UGljTnVtcyhkcGIsIHVuVXNlZFNob3J0VGVybUZyYW1lTnVtKTsKLQotICAgICAgICAgICAgaWYgKFNsaWRpbmdXaW5kb3dSZWZQaWNNYXJraW5nKGRwYikgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogb3V0cHV0IHBpY3R1cmVzIGlmIGJ1ZmZlciBmdWxsICovCi0gICAgICAgICAgICB3aGlsZSAoZHBiLT5mdWxsbmVzcyA+PSBkcGItPmRwYlNpemUpCi0gICAgICAgICAgICB7Ci0jaWZkZWYgX0FTU0VSVF9VU0VECi0gICAgICAgICAgICAgICAgQVNTRVJUKCFkcGItPm5vUmVvcmRlcmluZyk7Ci0gICAgICAgICAgICAgICAgQVNTRVJUKE91dHB1dFBpY3R1cmUoZHBiKSA9PSBIQU5UUk9fT0spOwotI2Vsc2UKLSAgICAgICAgICAgICAgICBPdXRwdXRQaWN0dXJlKGRwYik7Ci0jZW5kaWYKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogYWRkIHRvIGVuZCBvZiBsaXN0ICovCi0gICAgICAgICAgICBBU1NFUlQoICFkcGItPmJ1ZmZlcltkcGItPmRwYlNpemVdLnRvQmVEaXNwbGF5ZWQgJiYKLSAgICAgICAgICAgICAgICAgICAgIUlTX1JFRkVSRU5DRShkcGItPmJ1ZmZlcltkcGItPmRwYlNpemVdKSApOwotICAgICAgICAgICAgZHBiLT5idWZmZXJbZHBiLT5kcGJTaXplXS5zdGF0dXMgPSBOT05fRVhJU1RJTkc7Ci0gICAgICAgICAgICBkcGItPmJ1ZmZlcltkcGItPmRwYlNpemVdLmZyYW1lTnVtID0gdW5Vc2VkU2hvcnRUZXJtRnJhbWVOdW07Ci0gICAgICAgICAgICBkcGItPmJ1ZmZlcltkcGItPmRwYlNpemVdLnBpY051bSAgID0gKGkzMil1blVzZWRTaG9ydFRlcm1GcmFtZU51bTsKLSAgICAgICAgICAgIGRwYi0+YnVmZmVyW2RwYi0+ZHBiU2l6ZV0ucGljT3JkZXJDbnQgPSAwOwotICAgICAgICAgICAgZHBiLT5idWZmZXJbZHBiLT5kcGJTaXplXS50b0JlRGlzcGxheWVkID0gSEFOVFJPX0ZBTFNFOwotICAgICAgICAgICAgZHBiLT5mdWxsbmVzcysrOwotICAgICAgICAgICAgZHBiLT5udW1SZWZGcmFtZXMrKzsKLQotICAgICAgICAgICAgLyogc29ydCB0aGUgYnVmZmVyICovCi0gICAgICAgICAgICBTaGVsbFNvcnQoZHBiLT5idWZmZXIsIGRwYi0+ZHBiU2l6ZSsxKTsKLQotICAgICAgICAgICAgdW5Vc2VkU2hvcnRUZXJtRnJhbWVOdW0gPSAodW5Vc2VkU2hvcnRUZXJtRnJhbWVOdW0gKyAxKSAlCi0gICAgICAgICAgICAgICAgZHBiLT5tYXhGcmFtZU51bTsKLQotICAgICAgICB9IHdoaWxlICh1blVzZWRTaG9ydFRlcm1GcmFtZU51bSAhPSBmcmFtZU51bSk7Ci0KLSAgICAgICAgLyogcGljdHVyZXMgcGxhY2VkIGluIG91dHB1dCBidWZmZXIgLT4gY2hlY2sgdGhhdCAnZGF0YScgaW4KLSAgICAgICAgICogYnVmZmVyIHBvc2l0aW9uIGRwYlNpemUgaXMgbm90IGluIHRoZSBvdXRwdXQgYnVmZmVyICh0aGlzIHdpbGwgYmUKLSAgICAgICAgICogImFsbG9jYXRlZCIgYnkgaDI2NGJzZEFsbG9jYXRlRHBiSW1hZ2UpLiBJZiBpdCBpcyAtPiBleGNoYW5nZSBkYXRhCi0gICAgICAgICAqIHBvaW50ZXIgd2l0aCB0aGUgb25lIHN0b3JlZCBpbiB0aGUgYmVnaW5uaW5nICovCi0gICAgICAgIGlmIChkcGItPm51bU91dCkKLSAgICAgICAgewotICAgICAgICAgICAgdTMyIGk7Ci0KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkcGItPm51bU91dDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChkcGItPm91dEJ1ZltpXS5kYXRhID09IGRwYi0+YnVmZmVyW2RwYi0+ZHBiU2l6ZV0uZGF0YSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIGZpbmQgYnVmZmVyIHBvc2l0aW9uIGNvbnRhaW5pbmcgZGF0YSBwb2ludGVyIHN0b3JlZCBpbgotICAgICAgICAgICAgICAgICAgICAgKiB0bXAgKi8KLSAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGRwYi0+ZHBiU2l6ZTsgaSsrKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHBiLT5idWZmZXJbaV0uZGF0YSA9PSB0bXApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHBiLT5idWZmZXJbaV0uZGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwYi0+YnVmZmVyW2RwYi0+ZHBiU2l6ZV0uZGF0YTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcGItPmJ1ZmZlcltkcGItPmRwYlNpemVdLmRhdGEgPSB0bXA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgQVNTRVJUKGkgPCBkcGItPmRwYlNpemUpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyogZnJhbWVOdW0gZm9yIHJlZmVyZW5jZSBwaWN0dXJlcyBzaGFsbCBub3QgYmUgdGhlIHNhbWUgYXMgZm9yIHByZXZpb3VzCi0gICAgICogcmVmZXJlbmNlIHBpY3R1cmUsIG90aGVyd2lzZSBhY2Nlc3NlcyB0byBwaWN0dXJlcyBpbiB0aGUgYnVmZmVyIGNhbm5vdAotICAgICAqIGJlIHNvbHZlZCB1bmFtYmlndW91c2x5ICovCi0gICAgZWxzZSBpZiAoaXNSZWZQaWMgJiYgZnJhbWVOdW0gPT0gZHBiLT5wcmV2UmVmRnJhbWVOdW0pCi0gICAgewotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgfQotCi0gICAgLyogc2F2ZSBjdXJyZW50IGZyYW1lX251bSBpbiBwcmV2UmVmRnJhbWVOdW0uIEZvciBub24tcmVmZXJlbmNlIGZyYW1lCi0gICAgICogcHJldkZyYW1lTnVtIGlzIHNldCB0byBmcmFtZSBudW1iZXIgb2YgbGFzdCBub24tZXhpc3RpbmcgZnJhbWUgYWJvdmUgKi8KLSAgICBpZiAoaXNSZWZQaWMpCi0gICAgICAgIGRwYi0+cHJldlJlZkZyYW1lTnVtID0gZnJhbWVOdW07Ci0gICAgZWxzZSBpZiAoZnJhbWVOdW0gIT0gZHBiLT5wcmV2UmVmRnJhbWVOdW0pCi0gICAgewotICAgICAgICBkcGItPnByZXZSZWZGcmFtZU51bSA9Ci0gICAgICAgICAgICAoZnJhbWVOdW0gKyBkcGItPm1heEZyYW1lTnVtIC0gMSkgJSBkcGItPm1heEZyYW1lTnVtOwotICAgIH0KLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRmluZFNtYWxsZXN0UGljT3JkZXJDbnQKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRnVuY3Rpb24gdG8gZmluZCBwaWN0dXJlIHdpdGggc21hbGxlc3QgcGljdHVyZSBvcmRlciBjb3VudC4gVGhpcwotICAgICAgICAgICAgd2lsbCBiZSB0aGUgbmV4dCBwaWN0dXJlIGluIGRpc3BsYXkgb3JkZXIuCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIHBpY3R1cmUsIE5VTEwgaWYgbm8gcGljdHVyZXMgdG8gYmUgZGlzcGxheWVkCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLWRwYlBpY3R1cmVfdCogRmluZFNtYWxsZXN0UGljT3JkZXJDbnQoZHBiU3RvcmFnZV90ICpkcGIpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGk7Ci0gICAgaTMyIHBpY09yZGVyQ250OwotICAgIGRwYlBpY3R1cmVfdCAqdG1wOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoZHBiKTsKLQotICAgIHBpY09yZGVyQ250ID0gMHg3RkZGRkZGRjsKLSAgICB0bXAgPSBOVUxMOwotCi0gICAgZm9yIChpID0gMDsgaSA8PSBkcGItPmRwYlNpemU7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmIChkcGItPmJ1ZmZlcltpXS50b0JlRGlzcGxheWVkICYmCi0gICAgICAgICAgICAoZHBiLT5idWZmZXJbaV0ucGljT3JkZXJDbnQgPCBwaWNPcmRlckNudCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcCA9IGRwYi0+YnVmZmVyICsgaTsKLSAgICAgICAgICAgIHBpY09yZGVyQ250ID0gZHBiLT5idWZmZXJbaV0ucGljT3JkZXJDbnQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4odG1wKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IE91dHB1dFBpY3R1cmUKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRnVuY3Rpb24gdG8gcHV0IG5leHQgZGlzcGxheSBvcmRlciBwaWN0dXJlIGludG8gdGhlIG91dHB1dCBidWZmZXIuCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEhBTlRST19PSyAgICAgIHN1Y2Nlc3MKLSAgICAgICAgICAgIEhBTlRST19OT0sgICAgIG5vIHBpY3R1cmVzIHRvIGRpc3BsYXkKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIE91dHB1dFBpY3R1cmUoZHBiU3RvcmFnZV90ICpkcGIpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgZHBiUGljdHVyZV90ICp0bXA7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChkcGIpOwotCi0gICAgaWYgKGRwYi0+bm9SZW9yZGVyaW5nKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICB0bXAgPSBGaW5kU21hbGxlc3RQaWNPcmRlckNudChkcGIpOwotCi0gICAgLyogbm8gcGljdHVyZXMgdG8gYmUgZGlzcGxheWVkICovCi0gICAgaWYgKHRtcCA9PSBOVUxMKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICBkcGItPm91dEJ1ZltkcGItPm51bU91dF0uZGF0YSAgPSB0bXAtPmRhdGE7Ci0gICAgZHBiLT5vdXRCdWZbZHBiLT5udW1PdXRdLmlzSWRyID0gdG1wLT5pc0lkcjsKLSAgICBkcGItPm91dEJ1ZltkcGItPm51bU91dF0ucGljSWQgPSB0bXAtPnBpY0lkOwotICAgIGRwYi0+b3V0QnVmW2RwYi0+bnVtT3V0XS5udW1FcnJNYnMgPSB0bXAtPm51bUVyck1iczsKLSAgICBkcGItPm51bU91dCsrOwotCi0gICAgdG1wLT50b0JlRGlzcGxheWVkID0gSEFOVFJPX0ZBTFNFOwotICAgIGlmICghSVNfUkVGRVJFTkNFKCp0bXApKQotICAgIHsKLSAgICAgICAgZHBiLT5mdWxsbmVzcy0tOwotICAgIH0KLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZERwYk91dHB1dFBpY3R1cmUKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRnVuY3Rpb24gdG8gZ2V0IG5leHQgZGlzcGxheSBvcmRlciBwaWN0dXJlIGZyb20gdGhlIG91dHB1dCBidWZmZXIuCi0KLSAgICAgICAgUmV0dXJuOgotICAgICAgICAgICAgcG9pbnRlciB0byBvdXRwdXQgcGljdHVyZSBzdHJ1Y3R1cmUsIE5VTEwgaWYgbm8gcGljdHVyZXMgdG8KLSAgICAgICAgICAgIGRpc3BsYXkKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotZHBiT3V0UGljdHVyZV90KiBoMjY0YnNkRHBiT3V0cHV0UGljdHVyZShkcGJTdG9yYWdlX3QgKmRwYikKLXsKLQotLyogVmFyaWFibGVzICovCi0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChkcGIpOwotCi0gICAgaWYgKGRwYi0+b3V0SW5kZXggPCBkcGItPm51bU91dCkKLSAgICAgICAgcmV0dXJuKGRwYi0+b3V0QnVmICsgZHBiLT5vdXRJbmRleCsrKTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybihOVUxMKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RGbHVzaERwYgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGdW5jdGlvbiB0byBmbHVzaCB0aGUgRFBCLiBGdW5jdGlvbiBwdXRzIGFsbCBwaWN0dXJlcyBuZWVkZWQgZm9yCi0gICAgICAgICAgICBkaXNwbGF5IGludG8gdGhlIG91dHB1dCBidWZmZXIuIFRoaXMgZnVuY3Rpb24gc2hhbGwgYmUgY2FsbGVkIGluCi0gICAgICAgICAgICB0aGUgZW5kIG9mIHRoZSBzdHJlYW0gdG8gb2J0YWluIHBpY3R1cmVzIGJ1ZmZlcmVkIGZvciBkaXNwbGF5Ci0gICAgICAgICAgICByZS1vcmRlcmluZyBwdXJwb3Nlcy4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBoMjY0YnNkRmx1c2hEcGIoZHBiU3RvcmFnZV90ICpkcGIpCi17Ci0KLSAgICAvKiBkb24ndCBkbyBhbnl0aGluZyBpZiBidWZmZXIgbm90IHJlc2VydmVkICovCi0gICAgaWYgKGRwYi0+YnVmZmVyKQotICAgIHsKLSAgICAgICAgZHBiLT5mbHVzaGVkID0gMTsKLSAgICAgICAgLyogb3V0cHV0IGFsbCBwaWN0dXJlcyAqLwotICAgICAgICB3aGlsZSAoT3V0cHV0UGljdHVyZShkcGIpID09IEhBTlRST19PSykKLSAgICAgICAgICAgIDsKLSAgICB9Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkRnJlZURwYgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGdW5jdGlvbiB0byBmcmVlIG1lbW9yaWVzIHJlc2VydmVkIGZvciB0aGUgRFBCLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIGgyNjRic2RGcmVlRHBiKGRwYlN0b3JhZ2VfdCAqZHBiKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoZHBiKTsKLQotICAgIGlmIChkcGItPmJ1ZmZlcikKLSAgICB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBkcGItPmRwYlNpemUrMTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBGUkVFKGRwYi0+YnVmZmVyW2ldLnBBbGxvY2F0ZWREYXRhKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBGUkVFKGRwYi0+YnVmZmVyKTsKLSAgICBGUkVFKGRwYi0+bGlzdCk7Ci0gICAgRlJFRShkcGItPm91dEJ1Zik7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBTaGVsbFNvcnQKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgU29ydCBwaWN0dXJlcyBpbiB0aGUgYnVmZmVyLiBGdW5jdGlvbiBpbXBsZW1lbnRzIFNoZWxsJ3MgbWV0aG9kLAotICAgICAgICAgICAgaS5lLiBkaW1pbmlzaGluZyBpbmNyZW1lbnQgc29ydC4gU2VlIGUuZy4gIk51bWVyaWNhbCBSZWNpcGVzIGluIEMiCi0gICAgICAgICAgICBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHZvaWQgU2hlbGxTb3J0KGRwYlBpY3R1cmVfdCAqcFBpYywgdTMyIG51bSkKLXsKLQotICAgIHUzMiBpLCBqOwotICAgIHUzMiBzdGVwOwotICAgIGRwYlBpY3R1cmVfdCB0bXBQaWM7Ci0KLSAgICBzdGVwID0gNzsKLQotICAgIHdoaWxlIChzdGVwKQotICAgIHsKLSAgICAgICAgZm9yIChpID0gc3RlcDsgaSA8IG51bTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXBQaWMgPSBwUGljW2ldOwotICAgICAgICAgICAgaiA9IGk7Ci0gICAgICAgICAgICB3aGlsZSAoaiA+PSBzdGVwICYmIENvbXBhcmVQaWN0dXJlcyhwUGljICsgaiAtIHN0ZXAsICZ0bXBQaWMpID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwUGljW2pdID0gcFBpY1tqLXN0ZXBdOwotICAgICAgICAgICAgICAgIGogLT0gc3RlcDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBQaWNbal0gPSB0bXBQaWM7Ci0gICAgICAgIH0KLSAgICAgICAgc3RlcCA+Pj0gMTsKLSAgICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2RwYi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2RwYi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTI1MDg0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9kcGIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotICAgIDMuIERhdGEgdHlwZXMKLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgSDI2NFNXREVDX0RQQl9ICi0jZGVmaW5lIEgyNjRTV0RFQ19EUEJfSAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImJhc2V0eXBlLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9zbGljZV9oZWFkZXIuaCIKLSNpbmNsdWRlICJoMjY0YnNkX2ltYWdlLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gRGF0YSB0eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogZW51bWVyYXRpb24gdG8gcmVwcmVzZW50IHN0YXR1cyBvZiBidWZmZXJlZCBpbWFnZSAqLwotdHlwZWRlZiBlbnVtIHsKLSAgICBVTlVTRUQgPSAwLAotICAgIE5PTl9FWElTVElORywKLSAgICBTSE9SVF9URVJNLAotICAgIExPTkdfVEVSTQotfSBkcGJQaWN0dXJlU3RhdHVzX2U7Ci0KLS8qIHN0cnVjdHVyZSB0byByZXByZXNlbnQgYSBidWZmZXJlZCBwaWN0dXJlICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdTggKmRhdGE7ICAgICAgICAgICAvKiAxNi1ieXRlIGFsaWduZWQgcG9pbnRlciBvZiBwQWxsb2NhdGVkRGF0YSAqLwotICAgIHU4ICpwQWxsb2NhdGVkRGF0YTsgLyogYWxsb2NhdGVkIHBpY3R1cmUgcG9pbnRlcjsgKHNpemUgKyAxNSkgYnl0ZXMgKi8KLSAgICBpMzIgcGljTnVtOwotICAgIHUzMiBmcmFtZU51bTsKLSAgICBpMzIgcGljT3JkZXJDbnQ7Ci0gICAgZHBiUGljdHVyZVN0YXR1c19lIHN0YXR1czsKLSAgICB1MzIgdG9CZURpc3BsYXllZDsKLSAgICB1MzIgcGljSWQ7Ci0gICAgdTMyIG51bUVyck1iczsKLSAgICB1MzIgaXNJZHI7Ci19IGRwYlBpY3R1cmVfdDsKLQotLyogc3RydWN0dXJlIHRvIHJlcHJlc2VudCBkaXNwbGF5IGltYWdlIG91dHB1dCBmcm9tIHRoZSBidWZmZXIgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1OCAqZGF0YTsKLSAgICB1MzIgcGljSWQ7Ci0gICAgdTMyIG51bUVyck1iczsKLSAgICB1MzIgaXNJZHI7Ci19IGRwYk91dFBpY3R1cmVfdDsKLQotLyogc3RydWN0dXJlIHRvIHJlcHJlc2VudCBEUEIgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBkcGJQaWN0dXJlX3QgKmJ1ZmZlcjsKLSAgICBkcGJQaWN0dXJlX3QgKipsaXN0OwotICAgIGRwYlBpY3R1cmVfdCAqY3VycmVudE91dDsKLSAgICBkcGJPdXRQaWN0dXJlX3QgKm91dEJ1ZjsKLSAgICB1MzIgbnVtT3V0OwotICAgIHUzMiBvdXRJbmRleDsKLSAgICB1MzIgbWF4UmVmRnJhbWVzOwotICAgIHUzMiBkcGJTaXplOwotICAgIHUzMiBtYXhGcmFtZU51bTsKLSAgICB1MzIgbWF4TG9uZ1Rlcm1GcmFtZUlkeDsKLSAgICB1MzIgbnVtUmVmRnJhbWVzOwotICAgIHUzMiBmdWxsbmVzczsKLSAgICB1MzIgcHJldlJlZkZyYW1lTnVtOwotICAgIHUzMiBsYXN0Q29udGFpbnNNbWNvNTsKLSAgICB1MzIgbm9SZW9yZGVyaW5nOwotICAgIHUzMiBmbHVzaGVkOwotfSBkcGJTdG9yYWdlX3Q7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2RJbml0RHBiKAotICBkcGJTdG9yYWdlX3QgKmRwYiwKLSAgdTMyIHBpY1NpemVJbk1icywKLSAgdTMyIGRwYlNpemUsCi0gIHUzMiBudW1SZWZGcmFtZXMsCi0gIHUzMiBtYXhGcmFtZU51bSwKLSAgdTMyIG5vUmVvcmRlcmluZyk7Ci0KLXUzMiBoMjY0YnNkUmVzZXREcGIoCi0gIGRwYlN0b3JhZ2VfdCAqZHBiLAotICB1MzIgcGljU2l6ZUluTWJzLAotICB1MzIgZHBiU2l6ZSwKLSAgdTMyIG51bVJlZkZyYW1lcywKLSAgdTMyIG1heEZyYW1lTnVtLAotICB1MzIgbm9SZW9yZGVyaW5nKTsKLQotdm9pZCBoMjY0YnNkSW5pdFJlZlBpY0xpc3QoZHBiU3RvcmFnZV90ICpkcGIpOwotCi11OCogaDI2NGJzZEFsbG9jYXRlRHBiSW1hZ2UoZHBiU3RvcmFnZV90ICpkcGIpOwotCi11OCogaDI2NGJzZEdldFJlZlBpY0RhdGEoZHBiU3RvcmFnZV90ICpkcGIsIHUzMiBpbmRleCk7Ci0KLXUzMiBoMjY0YnNkUmVvcmRlclJlZlBpY0xpc3QoCi0gIGRwYlN0b3JhZ2VfdCAqZHBiLAotICByZWZQaWNMaXN0UmVvcmRlcmluZ190ICpvcmRlciwKLSAgdTMyIGN1cnJGcmFtZU51bSwKLSAgdTMyIG51bVJlZklkeEFjdGl2ZSk7Ci0KLXUzMiBoMjY0YnNkTWFya0RlY1JlZlBpYygKLSAgZHBiU3RvcmFnZV90ICpkcGIsCi0gIGRlY1JlZlBpY01hcmtpbmdfdCAqbWFyaywKLSAgaW1hZ2VfdCAqaW1hZ2UsCi0gIHUzMiBmcmFtZU51bSwKLSAgaTMyIHBpY09yZGVyQ250LAotICB1MzIgaXNJZHIsCi0gIHUzMiBwaWNJZCwKLSAgdTMyIG51bUVyck1icyk7Ci0KLXUzMiBoMjY0YnNkQ2hlY2tHYXBzSW5GcmFtZU51bShkcGJTdG9yYWdlX3QgKmRwYiwgdTMyIGZyYW1lTnVtLCB1MzIgaXNSZWZQaWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyIGdhcHNBbGxvd2VkKTsKLQotZHBiT3V0UGljdHVyZV90KiBoMjY0YnNkRHBiT3V0cHV0UGljdHVyZShkcGJTdG9yYWdlX3QgKmRwYik7Ci0KLXZvaWQgaDI2NGJzZEZsdXNoRHBiKGRwYlN0b3JhZ2VfdCAqZHBiKTsKLQotdm9pZCBoMjY0YnNkRnJlZURwYihkcGJTdG9yYWdlX3QgKmRwYik7Ci0KLSNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX0RQQl9IICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbWFnZS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ltYWdlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiOTI4NzAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ltYWdlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotICAgICAzLiBNb2R1bGUgZGVmaW5lcwotICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0gICAgIDUuIEZ1bmN0aW9ucwotICAgICAgICAgIGgyNjRic2RXcml0ZU1hY3JvYmxvY2sKLSAgICAgICAgICBoMjY0YnNkV3JpdGVPdXRwdXRCbG9ja3MKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJoMjY0YnNkX2ltYWdlLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9uZWlnaGJvdXIuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogeC0gYW5kIHktY29vcmRpbmF0ZXMgZm9yIGVhY2ggYmxvY2ssIGRlZmluZWQgaW4gaDI2NGJzZF9pbnRyYV9wcmVkaWN0aW9uLmMgKi8KLWV4dGVybiBjb25zdCB1MzIgaDI2NGJzZEJsb2NrWFtdOwotZXh0ZXJuIGNvbnN0IHUzMiBoMjY0YnNkQmxvY2tZW107Ci0KLS8qIGNsaXBwaW5nIHRhYmxlLCBkZWZpbmVkIGluIGgyNjRic2RfaW50cmFfcHJlZGljdGlvbi5jICovCi1leHRlcm4gY29uc3QgdTggaDI2NGJzZENsaXBbXTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkV3JpdGVNYWNyb2Jsb2NrCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIFdyaXRlIG9uZSBtYWNyb2Jsb2NrIGludG8gdGhlIGltYWdlLiBCb3RoIGx1bWEgYW5kIGNocm9tYQotICAgICAgICAgICAgY29tcG9uZW50cyB3aWxsIGJlIHdyaXR0ZW4gYXQgdGhlIHNhbWUgdGltZS4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBkYXRhICAgIHBvaW50ZXIgdG8gbWFjcm9ibG9jayBkYXRhIHRvIGJlIHdyaXR0ZW4sIDI1NiB2YWx1ZXMgZm9yCi0gICAgICAgICAgICAgICAgICAgIGx1bWEgZm9sbG93ZWQgYnkgNjQgdmFsdWVzIGZvciBib3RoIGNocm9tYSBjb21wb25lbnRzCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIGltYWdlICAgcG9pbnRlciB0byB0aGUgaW1hZ2Ugd2hlcmUgdGhlIG1hY3JvYmxvY2sgd2lsbCBiZSB3cml0dGVuCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIG5vbmUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZm5kZWYgSDI2NERFQ19ORU9OCi12b2lkIGgyNjRic2RXcml0ZU1hY3JvYmxvY2soaW1hZ2VfdCAqaW1hZ2UsIHU4ICpkYXRhKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpOwotICAgIHUzMiB3aWR0aDsKLSAgICB1MzIgKmx1bSwgKmNiLCAqY3I7Ci0gICAgdTMyICpwdHI7Ci0gICAgdTMyIHRtcDEsIHRtcDI7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChpbWFnZSk7Ci0gICAgQVNTRVJUKGRhdGEpOwotICAgIEFTU0VSVCghKCh1MzIpZGF0YSYweDMpKTsKLQotICAgIHdpZHRoID0gaW1hZ2UtPndpZHRoOwotCi0gICAgLypsaW50IC1zYXZlIC1lODI2IGx1bSwgY2IgYW5kIGNyIHVzZWQgdG8gY29weSA0IGJ5dGVzIGF0IHRoZSB0aW1lLCBkaXNhYmxlCi0gICAgICogImFyZWEgdG9vIHNtYWxsIiBpbmZvIG1lc3NhZ2UgKi8KLSAgICBsdW0gPSAodTMyKilpbWFnZS0+bHVtYTsKLSAgICBjYiA9ICh1MzIqKWltYWdlLT5jYjsKLSAgICBjciA9ICh1MzIqKWltYWdlLT5jcjsKLSAgICBBU1NFUlQoISgodTMyKWx1bSYweDMpKTsKLSAgICBBU1NFUlQoISgodTMyKWNiJjB4MykpOwotICAgIEFTU0VSVCghKCh1MzIpY3ImMHgzKSk7Ci0KLSAgICBwdHIgPSAodTMyKilkYXRhOwotCi0gICAgd2lkdGggKj0gNDsKLSAgICBmb3IgKGkgPSAxNjsgaSA7IGktLSkKLSAgICB7Ci0gICAgICAgIHRtcDEgPSAqcHRyKys7Ci0gICAgICAgIHRtcDIgPSAqcHRyKys7Ci0gICAgICAgICpsdW0rKyA9IHRtcDE7Ci0gICAgICAgICpsdW0rKyA9IHRtcDI7Ci0gICAgICAgIHRtcDEgPSAqcHRyKys7Ci0gICAgICAgIHRtcDIgPSAqcHRyKys7Ci0gICAgICAgICpsdW0rKyA9IHRtcDE7Ci0gICAgICAgICpsdW0rKyA9IHRtcDI7Ci0gICAgICAgIGx1bSArPSB3aWR0aC00OwotICAgIH0KLQotICAgIHdpZHRoID4+PSAxOwotICAgIGZvciAoaSA9IDg7IGkgOyBpLS0pCi0gICAgewotICAgICAgICB0bXAxID0gKnB0cisrOwotICAgICAgICB0bXAyID0gKnB0cisrOwotICAgICAgICAqY2IrKyA9IHRtcDE7Ci0gICAgICAgICpjYisrID0gdG1wMjsKLSAgICAgICAgY2IgKz0gd2lkdGgtMjsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSA4OyBpIDsgaS0tKQotICAgIHsKLSAgICAgICAgdG1wMSA9ICpwdHIrKzsKLSAgICAgICAgdG1wMiA9ICpwdHIrKzsKLSAgICAgICAgKmNyKysgPSB0bXAxOwotICAgICAgICAqY3IrKyA9IHRtcDI7Ci0gICAgICAgIGNyICs9IHdpZHRoLTI7Ci0gICAgfQotCi19Ci0jZW5kaWYKLSNpZm5kZWYgSDI2NERFQ19PTVhETAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkV3JpdGVPdXRwdXRCbG9ja3MKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgV3JpdGUgb25lIG1hY3JvYmxvY2sgaW50byB0aGUgaW1hZ2UuIFByZWRpY3Rpb24gZm9yIHRoZSBtYWNyb2Jsb2NrCi0gICAgICAgICAgICBhbmQgdGhlIHJlc2lkdWFsIGFyZSBnaXZlbiBzZXBhcmF0ZWx5IGFuZCB3aWxsIGJlIGNvbWJpbmVkIHdoaWxlCi0gICAgICAgICAgICB3cml0aW5nIHRoZSBkYXRhIHRvIHRoZSBpbWFnZQotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIGRhdGEgICAgICAgIHBvaW50ZXIgdG8gbWFjcm9ibG9jayBwcmVkaWN0aW9uIGRhdGEsIDI1NiB2YWx1ZXMgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICBsdW1hIGZvbGxvd2VkIGJ5IDY0IHZhbHVlcyBmb3IgYm90aCBjaHJvbWEgY29tcG9uZW50cwotICAgICAgICAgICAgbWJOdW0gICAgICAgbnVtYmVyIG9mIHRoZSBtYWNyb2Jsb2NrCi0gICAgICAgICAgICByZXNpZHVhbCAgICBwb2ludGVyIHRvIHJlc2lkdWFsIGRhdGEsIDE2IDE2LWVsZW1lbnQgYXJyYXlzIGZvciBsdW1hCi0gICAgICAgICAgICAgICAgICAgICAgICBmb2xsb3dlZCBieSA0IDE2LWVsZW1lbnQgYXJyYXlzIGZvciBib3RoIGNocm9tYQotICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50cwotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBpbWFnZSAgICAgICBwb2ludGVyIHRvIHRoZSBpbWFnZSB3aGVyZSB0aGUgZGF0YSB3aWxsIGJlIHdyaXR0ZW4KLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgbm9uZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIGgyNjRic2RXcml0ZU91dHB1dEJsb2NrcyhpbWFnZV90ICppbWFnZSwgdTMyIG1iTnVtLCB1OCAqZGF0YSwKLSAgICAgICAgaTMyIHJlc2lkdWFsW11bMTZdKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpOwotICAgIHUzMiBwaWNXaWR0aCwgcGljU2l6ZTsKLSAgICB1OCAqbHVtLCAqY2IsICpjcjsKLSAgICB1OCAqaW1hZ2VCbG9jazsKLSAgICB1OCAqdG1wOwotICAgIHUzMiByb3csIGNvbDsKLSAgICB1MzIgYmxvY2s7Ci0gICAgdTMyIHgsIHk7Ci0gICAgaTMyICpwUmVzOwotICAgIGkzMiB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0OwotICAgIGNvbnN0IHU4ICpjbHAgPSBoMjY0YnNkQ2xpcCArIDUxMjsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGltYWdlKTsKLSAgICBBU1NFUlQoZGF0YSk7Ci0gICAgQVNTRVJUKG1iTnVtIDwgaW1hZ2UtPndpZHRoICogaW1hZ2UtPmhlaWdodCk7Ci0gICAgQVNTRVJUKCEoKHUzMilkYXRhJjB4MykpOwotCi0gICAgLyogSW1hZ2Ugc2l6ZSBpbiBtYWNyb2Jsb2NrcyAqLwotICAgIHBpY1dpZHRoID0gaW1hZ2UtPndpZHRoOwotICAgIHBpY1NpemUgPSBwaWNXaWR0aCAqIGltYWdlLT5oZWlnaHQ7Ci0gICAgcm93ID0gbWJOdW0gLyBwaWNXaWR0aDsKLSAgICBjb2wgPSBtYk51bSAlIHBpY1dpZHRoOwotCi0gICAgLyogT3V0cHV0IG1hY3JvYmxvY2sgcG9zaXRpb24gaW4gb3V0cHV0IHBpY3R1cmUgKi8KLSAgICBsdW0gPSAoaW1hZ2UtPmRhdGEgKyByb3cgKiBwaWNXaWR0aCAqIDI1NiArIGNvbCAqIDE2KTsKLSAgICBjYiA9IChpbWFnZS0+ZGF0YSArIHBpY1NpemUgKiAyNTYgKyByb3cgKiBwaWNXaWR0aCAqIDY0ICsgY29sICogOCk7Ci0gICAgY3IgPSAoY2IgKyBwaWNTaXplICogNjQpOwotCi0gICAgcGljV2lkdGggKj0gMTY7Ci0KLSAgICBmb3IgKGJsb2NrID0gMDsgYmxvY2sgPCAxNjsgYmxvY2srKykKLSAgICB7Ci0gICAgICAgIHggPSBoMjY0YnNkQmxvY2tYW2Jsb2NrXTsKLSAgICAgICAgeSA9IGgyNjRic2RCbG9ja1lbYmxvY2tdOwotCi0gICAgICAgIHBSZXMgPSByZXNpZHVhbFtibG9ja107Ci0KLSAgICAgICAgQVNTRVJUKHBSZXMpOwotCi0gICAgICAgIHRtcCA9IGRhdGEgKyB5KjE2ICsgeDsKLSAgICAgICAgaW1hZ2VCbG9jayA9IGx1bSArIHkqcGljV2lkdGggKyB4OwotCi0gICAgICAgIEFTU0VSVCghKCh1MzIpdG1wJjB4MykpOwotICAgICAgICBBU1NFUlQoISgodTMyKWltYWdlQmxvY2smMHgzKSk7Ci0KLSAgICAgICAgaWYgKElTX1JFU0lEVUFMX0VNUFRZKHBSZXMpKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKmxpbnQgLWU4MjYgKi8KLSAgICAgICAgICAgIGkzMiAqaW4zMiA9IChpMzIqKXRtcDsKLSAgICAgICAgICAgIGkzMiAqb3V0MzIgPSAoaTMyKilpbWFnZUJsb2NrOwotCi0gICAgICAgICAgICAvKiBSZXNpZHVhbCBpcyB6ZXJvID0+IGNvcHkgcHJlZGljdGlvbiBibG9jayB0byBvdXRwdXQgKi8KLSAgICAgICAgICAgIHRtcDEgPSAqaW4zMjsgIGluMzIgKz0gNDsKLSAgICAgICAgICAgIHRtcDIgPSAqaW4zMjsgIGluMzIgKz0gNDsKLSAgICAgICAgICAgICpvdXQzMiA9IHRtcDE7IG91dDMyICs9IHBpY1dpZHRoLzQ7Ci0gICAgICAgICAgICAqb3V0MzIgPSB0bXAyOyBvdXQzMiArPSBwaWNXaWR0aC80OwotICAgICAgICAgICAgdG1wMSA9ICppbjMyOyAgaW4zMiArPSA0OwotICAgICAgICAgICAgdG1wMiA9ICppbjMyOwotICAgICAgICAgICAgKm91dDMyID0gdG1wMTsgb3V0MzIgKz0gcGljV2lkdGgvNDsKLSAgICAgICAgICAgICpvdXQzMiA9IHRtcDI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIFJBTkdFX0NIRUNLX0FSUkFZKHBSZXMsIC01MTIsIDUxMSwgMTYpOwotCi0gICAgICAgICAgICAvKiBDYWxjdWxhdGUgaW1hZ2UgPSBwcmVkaWN0aW9uICsgcmVzaWR1YWwKLSAgICAgICAgICAgICAqIFByb2Nlc3MgZm91ciBwaXhlbHMgaW4gYSBsb29wICovCi0gICAgICAgICAgICBmb3IgKGkgPSA0OyBpOyBpLS0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdG1wMSA9IHRtcFswXTsKLSAgICAgICAgICAgICAgICB0bXAyID0gKnBSZXMrKzsKLSAgICAgICAgICAgICAgICB0bXAzID0gdG1wWzFdOwotICAgICAgICAgICAgICAgIHRtcDEgPSBjbHBbdG1wMSArIHRtcDJdOwotICAgICAgICAgICAgICAgIHRtcDQgPSAqcFJlcysrOwotICAgICAgICAgICAgICAgIGltYWdlQmxvY2tbMF0gPSAodTgpdG1wMTsKLSAgICAgICAgICAgICAgICB0bXAzID0gY2xwW3RtcDMgKyB0bXA0XTsKLSAgICAgICAgICAgICAgICB0bXAxID0gdG1wWzJdOwotICAgICAgICAgICAgICAgIHRtcDIgPSAqcFJlcysrOwotICAgICAgICAgICAgICAgIGltYWdlQmxvY2tbMV0gPSAodTgpdG1wMzsKLSAgICAgICAgICAgICAgICB0bXAxID0gY2xwW3RtcDEgKyB0bXAyXTsKLSAgICAgICAgICAgICAgICB0bXAzID0gdG1wWzNdOwotICAgICAgICAgICAgICAgIHRtcDQgPSAqcFJlcysrOwotICAgICAgICAgICAgICAgIGltYWdlQmxvY2tbMl0gPSAodTgpdG1wMTsKLSAgICAgICAgICAgICAgICB0bXAzID0gY2xwW3RtcDMgKyB0bXA0XTsKLSAgICAgICAgICAgICAgICB0bXAgKz0gMTY7Ci0gICAgICAgICAgICAgICAgaW1hZ2VCbG9ja1szXSA9ICh1OCl0bXAzOwotICAgICAgICAgICAgICAgIGltYWdlQmxvY2sgKz0gcGljV2lkdGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHBpY1dpZHRoIC89IDI7Ci0KLSAgICBmb3IgKGJsb2NrID0gMTY7IGJsb2NrIDw9IDIzOyBibG9jaysrKQotICAgIHsKLSAgICAgICAgeCA9IGgyNjRic2RCbG9ja1hbYmxvY2sgJiAweDNdOwotICAgICAgICB5ID0gaDI2NGJzZEJsb2NrWVtibG9jayAmIDB4M107Ci0KLSAgICAgICAgcFJlcyA9IHJlc2lkdWFsW2Jsb2NrXTsKLQotICAgICAgICBBU1NFUlQocFJlcyk7Ci0KLSAgICAgICAgdG1wID0gZGF0YSArIDI1NjsKLSAgICAgICAgaW1hZ2VCbG9jayA9IGNiOwotCi0gICAgICAgIGlmIChibG9jayA+PSAyMCkKLSAgICAgICAgewotICAgICAgICAgICAgaW1hZ2VCbG9jayA9IGNyOwotICAgICAgICAgICAgdG1wICs9IDY0OwotICAgICAgICB9Ci0KLSAgICAgICAgdG1wICs9IHkqOCArIHg7Ci0gICAgICAgIGltYWdlQmxvY2sgKz0geSpwaWNXaWR0aCArIHg7Ci0KLSAgICAgICAgQVNTRVJUKCEoKHUzMil0bXAmMHgzKSk7Ci0gICAgICAgIEFTU0VSVCghKCh1MzIpaW1hZ2VCbG9jayYweDMpKTsKLQotICAgICAgICBpZiAoSVNfUkVTSURVQUxfRU1QVFkocFJlcykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qbGludCAtZTgyNiAqLwotICAgICAgICAgICAgaTMyICppbjMyID0gKGkzMiopdG1wOwotICAgICAgICAgICAgaTMyICpvdXQzMiA9IChpMzIqKWltYWdlQmxvY2s7Ci0KLSAgICAgICAgICAgIC8qIFJlc2lkdWFsIGlzIHplcm8gPT4gY29weSBwcmVkaWN0aW9uIGJsb2NrIHRvIG91dHB1dCAqLwotICAgICAgICAgICAgdG1wMSA9ICppbjMyOyAgaW4zMiArPSAyOwotICAgICAgICAgICAgdG1wMiA9ICppbjMyOyAgaW4zMiArPSAyOwotICAgICAgICAgICAgKm91dDMyID0gdG1wMTsgb3V0MzIgKz0gcGljV2lkdGgvNDsKLSAgICAgICAgICAgICpvdXQzMiA9IHRtcDI7IG91dDMyICs9IHBpY1dpZHRoLzQ7Ci0gICAgICAgICAgICB0bXAxID0gKmluMzI7ICBpbjMyICs9IDI7Ci0gICAgICAgICAgICB0bXAyID0gKmluMzI7Ci0gICAgICAgICAgICAqb3V0MzIgPSB0bXAxOyBvdXQzMiArPSBwaWNXaWR0aC80OwotICAgICAgICAgICAgKm91dDMyID0gdG1wMjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLQotICAgICAgICAgICAgUkFOR0VfQ0hFQ0tfQVJSQVkocFJlcywgLTUxMiwgNTExLCAxNik7Ci0KLSAgICAgICAgICAgIGZvciAoaSA9IDQ7IGk7IGktLSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0bXAxID0gdG1wWzBdOwotICAgICAgICAgICAgICAgIHRtcDIgPSAqcFJlcysrOwotICAgICAgICAgICAgICAgIHRtcDMgPSB0bXBbMV07Ci0gICAgICAgICAgICAgICAgdG1wMSA9IGNscFt0bXAxICsgdG1wMl07Ci0gICAgICAgICAgICAgICAgdG1wNCA9ICpwUmVzKys7Ci0gICAgICAgICAgICAgICAgaW1hZ2VCbG9ja1swXSA9ICh1OCl0bXAxOwotICAgICAgICAgICAgICAgIHRtcDMgPSBjbHBbdG1wMyArIHRtcDRdOwotICAgICAgICAgICAgICAgIHRtcDEgPSB0bXBbMl07Ci0gICAgICAgICAgICAgICAgdG1wMiA9ICpwUmVzKys7Ci0gICAgICAgICAgICAgICAgaW1hZ2VCbG9ja1sxXSA9ICh1OCl0bXAzOwotICAgICAgICAgICAgICAgIHRtcDEgPSBjbHBbdG1wMSArIHRtcDJdOwotICAgICAgICAgICAgICAgIHRtcDMgPSB0bXBbM107Ci0gICAgICAgICAgICAgICAgdG1wNCA9ICpwUmVzKys7Ci0gICAgICAgICAgICAgICAgaW1hZ2VCbG9ja1syXSA9ICh1OCl0bXAxOwotICAgICAgICAgICAgICAgIHRtcDMgPSBjbHBbdG1wMyArIHRtcDRdOwotICAgICAgICAgICAgICAgIHRtcCArPSA4OwotICAgICAgICAgICAgICAgIGltYWdlQmxvY2tbM10gPSAodTgpdG1wMzsKLSAgICAgICAgICAgICAgICBpbWFnZUJsb2NrICs9IHBpY1dpZHRoOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi19Ci0jZW5kaWYgLyogSDI2NERFQ19PTVhETCAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfaW1hZ2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbWFnZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDdjMThjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbWFnZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLSAgICAzLiBEYXRhIHR5cGVzCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIEgyNjRTV0RFQ19JTUFHRV9ICi0jZGVmaW5lIEgyNjRTV0RFQ19JTUFHRV9ICi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiYmFzZXR5cGUuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBEYXRhIHR5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIHU4ICpkYXRhOwotICAgIHUzMiB3aWR0aDsKLSAgICB1MzIgaGVpZ2h0OwotICAgIC8qIGN1cnJlbnQgTUIncyBjb21wb25lbnRzICovCi0gICAgdTggKmx1bWE7Ci0gICAgdTggKmNiOwotICAgIHU4ICpjcjsKLX0gaW1hZ2VfdDsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIGgyNjRic2RXcml0ZU1hY3JvYmxvY2soaW1hZ2VfdCAqaW1hZ2UsIHU4ICpkYXRhKTsKLQotI2lmbmRlZiBIMjY0REVDX09NWERMCi12b2lkIGgyNjRic2RXcml0ZU91dHB1dEJsb2NrcyhpbWFnZV90ICppbWFnZSwgdTMyIG1iTnVtLCB1OCAqZGF0YSwKLSAgICBpMzIgcmVzaWR1YWxbXVsxNl0pOwotI2VuZGlmCi0KLSNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX0lNQUdFX0ggKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ludGVyX3ByZWRpY3Rpb24uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbnRlcl9wcmVkaWN0aW9uLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhODFjNGEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ludGVyX3ByZWRpY3Rpb24uYworKysgL2Rldi9udWxsCkBAIC0xLDEwMjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotICAgICAzLiBNb2R1bGUgZGVmaW5lcwotICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0gICAgIDUuIEZ1bmN0aW9ucwotICAgICAgICAgIGgyNjRic2RJbnRlclByZWRpY3Rpb24KLSAgICAgICAgICBNdlByZWRpY3Rpb24xNngxNgotICAgICAgICAgIE12UHJlZGljdGlvbjE2eDgKLSAgICAgICAgICBNdlByZWRpY3Rpb244eDE2Ci0gICAgICAgICAgTXZQcmVkaWN0aW9uOHg4Ci0gICAgICAgICAgTXZQcmVkaWN0aW9uCi0gICAgICAgICAgTWVkaWFuRmlsdGVyCi0gICAgICAgICAgR2V0SW50ZXJOZWlnaGJvdXIKLSAgICAgICAgICBHZXRQcmVkaWN0aW9uTXYKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJoMjY0YnNkX2ludGVyX3ByZWRpY3Rpb24uaCIKLSNpbmNsdWRlICJoMjY0YnNkX25laWdoYm91ci5oIgotI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgotI2luY2x1ZGUgImgyNjRic2RfcmVjb25zdHJ1Y3QuaCIKLSNpbmNsdWRlICJoMjY0YnNkX2RwYi5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIHUzMiBhdmFpbGFibGU7Ci0gICAgdTMyIHJlZkluZGV4OwotICAgIG12X3QgbXY7Ci19IGludGVyTmVpZ2hib3VyX3Q7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHUzMiBNdlByZWRpY3Rpb24xNngxNihtYlN0b3JhZ2VfdCAqcE1iLCBtYlByZWRfdCAqbWJQcmVkLAotICAgIGRwYlN0b3JhZ2VfdCAqZHBiKTsKLXN0YXRpYyB1MzIgTXZQcmVkaWN0aW9uMTZ4OChtYlN0b3JhZ2VfdCAqcE1iLCBtYlByZWRfdCAqbWJQcmVkLAotICAgIGRwYlN0b3JhZ2VfdCAqZHBiKTsKLXN0YXRpYyB1MzIgTXZQcmVkaWN0aW9uOHgxNihtYlN0b3JhZ2VfdCAqcE1iLCBtYlByZWRfdCAqbWJQcmVkLAotICAgIGRwYlN0b3JhZ2VfdCAqZHBiKTsKLXN0YXRpYyB1MzIgTXZQcmVkaWN0aW9uOHg4KG1iU3RvcmFnZV90ICpwTWIsIHN1Yk1iUHJlZF90ICpzdWJNYlByZWQsCi0gICAgZHBiU3RvcmFnZV90ICpkcGIpOwotc3RhdGljIHUzMiBNdlByZWRpY3Rpb24obWJTdG9yYWdlX3QgKnBNYiwgc3ViTWJQcmVkX3QgKnN1Yk1iUHJlZCwKLSAgICB1MzIgbWJQYXJ0SWR4LCB1MzIgc3ViTWJQYXJ0SWR4KTsKLXN0YXRpYyBpMzIgTWVkaWFuRmlsdGVyKGkzMiBhLCBpMzIgYiwgaTMyIGMpOwotCi1zdGF0aWMgdm9pZCBHZXRJbnRlck5laWdoYm91cih1MzIgc2xpY2VJZCwgbWJTdG9yYWdlX3QgKm5NYiwKLSAgICBpbnRlck5laWdoYm91cl90ICpuLCB1MzIgaW5kZXgpOwotc3RhdGljIHZvaWQgR2V0UHJlZGljdGlvbk12KG12X3QgKm12LCBpbnRlck5laWdoYm91cl90ICphLCB1MzIgcmVmSW5kZXgpOwotCi1zdGF0aWMgY29uc3QgbmVpZ2hib3VyX3QgTl9BX1NVQl9QQVJUWzRdWzRdWzRdID0gewotICAgIHsgeyB7TUJfQSw1fSwge01CX05BLDB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfQSw1fSwge01CX0EsN30sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9BLDV9LCB7TUJfQ1VSUiwwfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0EsNX0sIHtNQl9DVVJSLDB9LCB7TUJfQSw3fSwge01CX0NVUlIsMn0gfSB9LAotCi0gICAgeyB7IHtNQl9DVVJSLDF9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9DVVJSLDF9LCB7TUJfQ1VSUiwzfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0NVUlIsMX0sIHtNQl9DVVJSLDR9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfQ1VSUiwxfSwge01CX0NVUlIsNH0sIHtNQl9DVVJSLDN9LCB7TUJfQ1VSUiw2fSB9IH0sCi0KLSAgICB7IHsge01CX0EsMTN9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9BLDEzfSwge01CX0EsMTV9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfQSwxM30sIHtNQl9DVVJSLDh9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfQSwxM30sIHtNQl9DVVJSLDh9LCB7TUJfQSwxNX0sIHtNQl9DVVJSLDEwfSB9IH0sCi0KLSAgICB7IHsge01CX0NVUlIsOX0sIHtNQl9OQSwwfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0NVUlIsOX0sIHtNQl9DVVJSLDExfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0NVUlIsOX0sIHtNQl9DVVJSLDEyfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0NVUlIsOX0sIHtNQl9DVVJSLDEyfSwge01CX0NVUlIsMTF9LCB7TUJfQ1VSUiwxNH0gfSB9IH07Ci0KLXN0YXRpYyBjb25zdCBuZWlnaGJvdXJfdCBOX0JfU1VCX1BBUlRbNF1bNF1bNF0gPSB7Ci0gICAgeyB7IHtNQl9CLDEwfSwge01CX05BLDB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfQiwxMH0sIHtNQl9DVVJSLDB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfQiwxMH0sIHtNQl9CLDExfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0IsMTB9LCB7TUJfQiwxMX0sIHtNQl9DVVJSLDB9LCB7TUJfQ1VSUiwxfSB9IH0sCi0KLSAgICB7IHsge01CX0IsMTR9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9CLDE0fSwge01CX0NVUlIsNH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9CLDE0fSwge01CX0IsMTV9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfQiwxNH0sIHtNQl9CLDE1fSwge01CX0NVUlIsNH0sIHtNQl9DVVJSLDV9IH0gfSwKLQotICAgIHsgeyB7TUJfQ1VSUiwyfSwge01CX05BLDB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfQ1VSUiwyfSwge01CX0NVUlIsOH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9DVVJSLDJ9LCB7TUJfQ1VSUiwzfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0NVUlIsMn0sIHtNQl9DVVJSLDN9LCB7TUJfQ1VSUiw4fSwge01CX0NVUlIsOX0gfSB9LAotCi0gICAgeyB7IHtNQl9DVVJSLDZ9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9DVVJSLDZ9LCB7TUJfQ1VSUiwxMn0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9DVVJSLDZ9LCB7TUJfQ1VSUiw3fSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0NVUlIsNn0sIHtNQl9DVVJSLDd9LCB7TUJfQ1VSUiwxMn0sIHtNQl9DVVJSLDEzfSB9IH0gfTsKLQotc3RhdGljIGNvbnN0IG5laWdoYm91cl90IE5fQ19TVUJfUEFSVFs0XVs0XVs0XSA9IHsKLSAgICB7IHsge01CX0IsMTR9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9CLDE0fSwge01CX05BLDR9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfQiwxMX0sIHtNQl9CLDE0fSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0IsMTF9LCB7TUJfQiwxNH0sIHtNQl9DVVJSLDF9LCB7TUJfTkEsNH0gfSB9LAotCi0gICAgeyB7IHtNQl9DLDEwfSwge01CX05BLDB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfQywxMH0sIHtNQl9OQSwwfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0IsMTV9LCB7TUJfQywxMH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9CLDE1fSwge01CX0MsMTB9LCB7TUJfQ1VSUiw1fSwge01CX05BLDB9IH0gfSwKLQotICAgIHsgeyB7TUJfQ1VSUiw2fSwge01CX05BLDB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfQ1VSUiw2fSwge01CX05BLDEyfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0NVUlIsM30sIHtNQl9DVVJSLDZ9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfQ1VSUiwzfSwge01CX0NVUlIsNn0sIHtNQl9DVVJSLDl9LCB7TUJfTkEsMTJ9IH0gfSwKLQotICAgIHsgeyB7TUJfTkEsMn0sIHtNQl9OQSwwfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX05BLDJ9LCB7TUJfTkEsOH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9DVVJSLDd9LCB7TUJfTkEsMn0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9DVVJSLDd9LCB7TUJfTkEsMn0sIHtNQl9DVVJSLDEzfSwge01CX05BLDh9IH0gfSB9OwotCi1zdGF0aWMgY29uc3QgbmVpZ2hib3VyX3QgTl9EX1NVQl9QQVJUWzRdWzRdWzRdID0gewotICAgIHsgeyB7TUJfRCwxNX0sIHtNQl9OQSwwfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0QsMTV9LCB7TUJfQSw1fSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0QsMTV9LCB7TUJfQiwxMH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9ELDE1fSwge01CX0IsMTB9LCB7TUJfQSw1fSwge01CX0NVUlIsMH0gfSB9LAotCi0gICAgeyB7IHtNQl9CLDExfSwge01CX05BLDB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfQiwxMX0sIHtNQl9DVVJSLDF9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfQiwxMX0sIHtNQl9CLDE0fSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0IsMTF9LCB7TUJfQiwxNH0sIHtNQl9DVVJSLDF9LCB7TUJfQ1VSUiw0fSB9IH0sCi0KLSAgICB7IHsge01CX0EsN30sIHtNQl9OQSwwfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0EsN30sIHtNQl9BLDEzfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0EsN30sIHtNQl9DVVJSLDJ9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfQSw3fSwge01CX0NVUlIsMn0sIHtNQl9BLDEzfSwge01CX0NVUlIsOH0gfSB9LAotCi0gICAgeyB7IHtNQl9DVVJSLDN9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9DVVJSLDN9LCB7TUJfQ1VSUiw5fSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0NVUlIsM30sIHtNQl9DVVJSLDZ9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfQ1VSUiwzfSwge01CX0NVUlIsNn0sIHtNQl9DVVJSLDl9LCB7TUJfQ1VSUiwxMn0gfSB9IH07Ci0KLQotI2lmZGVmIEgyNjRERUNfT01YREwKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkSW50ZXJQcmVkaWN0aW9uCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBQcm9jZXNzZXMgb25lIGludGVyIG1hY3JvYmxvY2suIFBlcmZvcm1zIG1vdGlvbiB2ZWN0b3IgcHJlZGljdGlvbgotICAgICAgICAgIGFuZCByZWNvbnN0cnVjdHMgcHJlZGljdGlvbiBtYWNyb2Jsb2NrLiBXcml0ZXMgdGhlIGZpbmFsIG1hY3JvYmxvY2sKLSAgICAgICAgICAocHJlZGljdGlvbiArIHJlc2lkdWFsKSBpbnRvIHRoZSBvdXRwdXQgaW1hZ2UgKGN1cnJJbWFnZSkKLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgcE1iICAgICAgICAgICBwb2ludGVyIHRvIG1hY3JvYmxvY2sgc3BlY2lmaWMgaW5mb3JtYXRpb24KLSAgICAgICAgICBwTWJMYXllciAgICAgIHBvaW50ZXIgdG8gY3VycmVudCBtYWNyb2Jsb2NrIGRhdGEgZnJvbSBzdHJlYW0KLSAgICAgICAgICBkcGIgICAgICAgICAgIHBvaW50ZXIgdG8gZGVjb2RlZCBwaWN0dXJlIGJ1ZmZlcgotICAgICAgICAgIG1iTnVtICAgICAgICAgY3VycmVudCBtYWNyb2Jsb2NrIG51bWJlcgotICAgICAgICAgIGN1cnJJbWFnZSAgICAgcG9pbnRlciB0byBvdXRwdXQgaW1hZ2UKLSAgICAgICAgICBkYXRhICAgICAgICAgIHBvaW50ZXIgd2hlcmUgcHJlZGljdGVkIG1hY3JvYmxvY2sgd2lsbCBiZSBzdG9yZWQKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgIHBNYiAgICAgICAgICAgc3RydWN0dXJlIGlzIHVwZGF0ZWQgd2l0aCBjdXJyZW50IG1hY3JvYmxvY2sKLSAgICAgICAgICBjdXJySW1hZ2UgICAgIGN1cnJlbnQgbWFjcm9ibG9jayBpcyB3cml0dGVuIGludG8gaW1hZ2UKLSAgICAgICAgICBkYXRhICAgICAgICAgIHByZWRpY3Rpb24gaXMgc3RvcmVkIGhlcmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgIEhBTlRST19PSyAgICAgc3VjY2VzcwotICAgICAgICAgIEhBTlRST19OT0sgICAgZXJyb3IgaW4gbW90aW9uIHZlY3RvciBwcmVkaWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi11MzIgaDI2NGJzZEludGVyUHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCBtYWNyb2Jsb2NrTGF5ZXJfdCAqcE1iTGF5ZXIsCi0gICAgZHBiU3RvcmFnZV90ICpkcGIsIHUzMiBtYk51bSwgaW1hZ2VfdCAqY3VyckltYWdlLCB1OCAqZGF0YSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaTsKLSAgICB1MzIgeCwgeTsKLSAgICB1MzIgY29sQW5kUm93OwotICAgIHN1Yk1iUGFydE1vZGVfZSBzdWJQYXJ0TW9kZTsKLSAgICBpbWFnZV90IHJlZkltYWdlOwotICAgIHU4IGZpbGxCdWZmWzMyKjIxICsgMTUgKyAzMl07Ci0gICAgdTggKnBGaWxsOwotICAgIHUzMiB0bXA7Ci0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocE1iKTsKLSAgICBBU1NFUlQoaDI2NGJzZE1iUGFydFByZWRNb2RlKHBNYi0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpOwotICAgIEFTU0VSVChwTWJMYXllcik7Ci0KLSAgICAvKiAxNi1ieXRlIGFsaWdubWVudCAqLwotICAgIHBGaWxsID0gQUxJR04oZmlsbEJ1ZmYsIDE2KTsKLQotICAgIC8qIHNldCByb3cgYml0cyAxNTowICovCi0gICAgY29sQW5kUm93ID0gbWJOdW0gLyBjdXJySW1hZ2UtPndpZHRoOwotICAgIC8qc2V0IGNvbCB0byBiaXRzIDMxOjE2ICovCi0gICAgY29sQW5kUm93ICs9IChtYk51bSAtIGNvbEFuZFJvdyAqIGN1cnJJbWFnZS0+d2lkdGgpIDw8IDE2OwotICAgIGNvbEFuZFJvdyA8PD0gNDsKLQotICAgIHJlZkltYWdlLndpZHRoID0gY3VyckltYWdlLT53aWR0aDsKLSAgICByZWZJbWFnZS5oZWlnaHQgPSBjdXJySW1hZ2UtPmhlaWdodDsKLQotICAgIHN3aXRjaCAocE1iLT5tYlR5cGUpCi0gICAgewotICAgICAgICBjYXNlIFBfU2tpcDoKLSAgICAgICAgY2FzZSBQX0wwXzE2eDE2OgotICAgICAgICAgICAgaWYgKE12UHJlZGljdGlvbjE2eDE2KHBNYiwgJnBNYkxheWVyLT5tYlByZWQsIGRwYikgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIHJlZkltYWdlLmRhdGEgPSBwTWItPnJlZkFkZHJbMF07Ci0gICAgICAgICAgICB0bXAgPSAoMDw8MjQpICsgKDA8PDE2KSArICgxNjw8OCkgKyAxNjsKLSAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12LCAmcmVmSW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xBbmRSb3csIHRtcCwgcEZpbGwpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBQX0wwX0wwXzE2eDg6Ci0gICAgICAgICAgICBpZiAoIE12UHJlZGljdGlvbjE2eDgocE1iLCAmcE1iTGF5ZXItPm1iUHJlZCwgZHBiKSAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgcmVmSW1hZ2UuZGF0YSA9IHBNYi0+cmVmQWRkclswXTsKLSAgICAgICAgICAgIHRtcCA9ICgwPDwyNCkgKyAoMDw8MTYpICsgKDE2PDw4KSArIDg7Ci0gICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdiwgJnJlZkltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sQW5kUm93LCB0bXAsIHBGaWxsKTsKLQotICAgICAgICAgICAgcmVmSW1hZ2UuZGF0YSA9IHBNYi0+cmVmQWRkclsyXTsKLSAgICAgICAgICAgIHRtcCA9ICgwPDwyNCkgKyAoODw8MTYpICsgKDE2PDw4KSArIDg7Ci0gICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdis4LCAmcmVmSW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xBbmRSb3csIHRtcCwgcEZpbGwpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBQX0wwX0wwXzh4MTY6Ci0gICAgICAgICAgICBpZiAoIE12UHJlZGljdGlvbjh4MTYocE1iLCAmcE1iTGF5ZXItPm1iUHJlZCwgZHBiKSAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgcmVmSW1hZ2UuZGF0YSA9IHBNYi0+cmVmQWRkclswXTsKLSAgICAgICAgICAgIHRtcCA9ICgwPDwyNCkgKyAoMDw8MTYpICsgKDg8PDgpICsgMTY7Ci0gICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdiwgJnJlZkltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sQW5kUm93LCB0bXAsIHBGaWxsKTsKLSAgICAgICAgICAgIHJlZkltYWdlLmRhdGEgPSBwTWItPnJlZkFkZHJbMV07Ci0gICAgICAgICAgICB0bXAgPSAoODw8MjQpICsgKDA8PDE2KSArICg4PDw4KSArIDE2OwotICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYrNCwgJnJlZkltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sQW5kUm93LCB0bXAsIHBGaWxsKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6IC8qIFBfOHg4IGFuZCBQXzh4OHJlZjAgKi8KLSAgICAgICAgICAgIGlmICggTXZQcmVkaWN0aW9uOHg4KHBNYiwgJnBNYkxheWVyLT5zdWJNYlByZWQsIGRwYikgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVmSW1hZ2UuZGF0YSA9IHBNYi0+cmVmQWRkcltpXTsKLSAgICAgICAgICAgICAgICBzdWJQYXJ0TW9kZSA9Ci0gICAgICAgICAgICAgICAgICAgIGgyNjRic2RTdWJNYlBhcnRNb2RlKHBNYkxheWVyLT5zdWJNYlByZWQuc3ViTWJUeXBlW2ldKTsKLSAgICAgICAgICAgICAgICB4ID0gaSAmIDB4MSA/IDggOiAwOwotICAgICAgICAgICAgICAgIHkgPSBpIDwgMiA/IDAgOiA4OwotICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViUGFydE1vZGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIE1CX1NQXzh4ODoKLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh4PDwyNCkgKyAoeTw8MTYpICsgKDg8PDgpICsgODsKLSAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzQqaSwgJnJlZkltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbEFuZFJvdywgdG1wLCBwRmlsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIE1CX1NQXzh4NDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh4PDwyNCkgKyAoeTw8MTYpICsgKDg8PDgpICsgNDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzQqaSwgJnJlZkltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbEFuZFJvdywgdG1wLCBwRmlsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAoeDw8MjQpICsgKCh5KzQpPDwxNikgKyAoODw8OCkgKyA0OwotICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYrNCppKzIsICZyZWZJbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xBbmRSb3csIHRtcCwgcEZpbGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNQl9TUF80eDg6Ci0gICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAoeDw8MjQpICsgKHk8PDE2KSArICg0PDw4KSArIDg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdis0KmksICZyZWZJbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xBbmRSb3csIHRtcCwgcEZpbGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKCh4KzQpPDwyNCkgKyAoeTw8MTYpICsgKDQ8PDgpICsgODsKLSAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzQqaSsxLCAmcmVmSW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sQW5kUm93LCB0bXAsIHBGaWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAoeDw8MjQpICsgKHk8PDE2KSArICg0PDw4KSArIDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdis0KmksICZyZWZJbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xBbmRSb3csIHRtcCwgcEZpbGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKCh4KzQpPDwyNCkgKyAoeTw8MTYpICsgKDQ8PDgpICsgNDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzQqaSsxLCAmcmVmSW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sQW5kUm93LCB0bXAsIHBGaWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh4PDwyNCkgKyAoKHkrNCk8PDE2KSArICg0PDw4KSArIDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdis0KmkrMiwgJnJlZkltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbEFuZFJvdywgdG1wLCBwRmlsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAoKHgrNCk8PDI0KSArICgoeSs0KTw8MTYpICsgKDQ8PDgpICsgNDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzQqaSszLCAmcmVmSW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sQW5kUm93LCB0bXAsIHBGaWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8qIGlmIGRlY29kZWQgZmxhZyA+IDEgLT4gbWIgaGFzIGFscmVhZHkgYmVlbiBzdWNjZXNzZnVsbHkgZGVjb2RlZCBhbmQKLSAgICAgKiB3cml0dGVuIHRvIG91dHB1dCAtPiBkbyBub3Qgd3JpdGUgYWdhaW4gKi8KLSAgICBpZiAocE1iLT5kZWNvZGVkID4gMSkKLSAgICAgICAgcmV0dXJuIEhBTlRST19PSzsKLQotICAgIHJldHVybihIQU5UUk9fT0spOwotfQotCi0jZWxzZSAvKiBIMjY0REVDX09NWERMICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZEludGVyUHJlZGljdGlvbgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgUHJvY2Vzc2VzIG9uZSBpbnRlciBtYWNyb2Jsb2NrLiBQZXJmb3JtcyBtb3Rpb24gdmVjdG9yIHByZWRpY3Rpb24KLSAgICAgICAgICBhbmQgcmVjb25zdHJ1Y3RzIHByZWRpY3Rpb24gbWFjcm9ibG9jay4gV3JpdGVzIHRoZSBmaW5hbCBtYWNyb2Jsb2NrCi0gICAgICAgICAgKHByZWRpY3Rpb24gKyByZXNpZHVhbCkgaW50byB0aGUgb3V0cHV0IGltYWdlIChjdXJySW1hZ2UpCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgIHBNYiAgICAgICAgICAgcG9pbnRlciB0byBtYWNyb2Jsb2NrIHNwZWNpZmljIGluZm9ybWF0aW9uCi0gICAgICAgICAgcE1iTGF5ZXIgICAgICBwb2ludGVyIHRvIGN1cnJlbnQgbWFjcm9ibG9jayBkYXRhIGZyb20gc3RyZWFtCi0gICAgICAgICAgZHBiICAgICAgICAgICBwb2ludGVyIHRvIGRlY29kZWQgcGljdHVyZSBidWZmZXIKLSAgICAgICAgICBtYk51bSAgICAgICAgIGN1cnJlbnQgbWFjcm9ibG9jayBudW1iZXIKLSAgICAgICAgICBjdXJySW1hZ2UgICAgIHBvaW50ZXIgdG8gb3V0cHV0IGltYWdlCi0gICAgICAgICAgZGF0YSAgICAgICAgICBwb2ludGVyIHdoZXJlIHByZWRpY3RlZCBtYWNyb2Jsb2NrIHdpbGwgYmUgc3RvcmVkCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICBwTWIgICAgICAgICAgIHN0cnVjdHVyZSBpcyB1cGRhdGVkIHdpdGggY3VycmVudCBtYWNyb2Jsb2NrCi0gICAgICAgICAgY3VyckltYWdlICAgICBjdXJyZW50IG1hY3JvYmxvY2sgaXMgd3JpdHRlbiBpbnRvIGltYWdlCi0gICAgICAgICAgZGF0YSAgICAgICAgICBwcmVkaWN0aW9uIGlzIHN0b3JlZCBoZXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICBIQU5UUk9fT0sgICAgIHN1Y2Nlc3MKLSAgICAgICAgICBIQU5UUk9fTk9LICAgIGVycm9yIGluIG1vdGlvbiB2ZWN0b3IgcHJlZGljdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdTMyIGgyNjRic2RJbnRlclByZWRpY3Rpb24obWJTdG9yYWdlX3QgKnBNYiwgbWFjcm9ibG9ja0xheWVyX3QgKnBNYkxheWVyLAotICAgIGRwYlN0b3JhZ2VfdCAqZHBiLCB1MzIgbWJOdW0sIGltYWdlX3QgKmN1cnJJbWFnZSwgdTggKmRhdGEpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGk7Ci0gICAgdTMyIHgsIHk7Ci0gICAgdTMyIHJvdywgY29sOwotICAgIHN1Yk1iUGFydE1vZGVfZSBzdWJQYXJ0TW9kZTsKLSAgICBpbWFnZV90IHJlZkltYWdlOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocE1iKTsKLSAgICBBU1NFUlQoaDI2NGJzZE1iUGFydFByZWRNb2RlKHBNYi0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpOwotICAgIEFTU0VSVChwTWJMYXllcik7Ci0KLSAgICByb3cgPSBtYk51bSAvIGN1cnJJbWFnZS0+d2lkdGg7Ci0gICAgY29sID0gbWJOdW0gLSByb3cgKiBjdXJySW1hZ2UtPndpZHRoOwotICAgIHJvdyAqPSAxNjsKLSAgICBjb2wgKj0gMTY7Ci0KLSAgICByZWZJbWFnZS53aWR0aCA9IGN1cnJJbWFnZS0+d2lkdGg7Ci0gICAgcmVmSW1hZ2UuaGVpZ2h0ID0gY3VyckltYWdlLT5oZWlnaHQ7Ci0KLSAgICBzd2l0Y2ggKHBNYi0+bWJUeXBlKQotICAgIHsKLSAgICAgICAgY2FzZSBQX1NraXA6Ci0gICAgICAgIGNhc2UgUF9MMF8xNngxNjoKLSAgICAgICAgICAgIGlmIChNdlByZWRpY3Rpb24xNngxNihwTWIsICZwTWJMYXllci0+bWJQcmVkLCBkcGIpICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICByZWZJbWFnZS5kYXRhID0gcE1iLT5yZWZBZGRyWzBdOwotICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYsICZyZWZJbWFnZSwgY29sLCByb3csIDAsIDAsCi0gICAgICAgICAgICAgICAgMTYsIDE2KTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgUF9MMF9MMF8xNng4OgotICAgICAgICAgICAgaWYgKCBNdlByZWRpY3Rpb24xNng4KHBNYiwgJnBNYkxheWVyLT5tYlByZWQsIGRwYikgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIHJlZkltYWdlLmRhdGEgPSBwTWItPnJlZkFkZHJbMF07Ci0gICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdiwgJnJlZkltYWdlLCBjb2wsIHJvdywgMCwgMCwKLSAgICAgICAgICAgICAgICAxNiwgOCk7Ci0gICAgICAgICAgICByZWZJbWFnZS5kYXRhID0gcE1iLT5yZWZBZGRyWzJdOwotICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYrOCwgJnJlZkltYWdlLCBjb2wsIHJvdywgMCwgOCwKLSAgICAgICAgICAgICAgICAxNiwgOCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFBfTDBfTDBfOHgxNjoKLSAgICAgICAgICAgIGlmICggTXZQcmVkaWN0aW9uOHgxNihwTWIsICZwTWJMYXllci0+bWJQcmVkLCBkcGIpICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICByZWZJbWFnZS5kYXRhID0gcE1iLT5yZWZBZGRyWzBdOwotICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYsICZyZWZJbWFnZSwgY29sLCByb3csIDAsIDAsCi0gICAgICAgICAgICAgICAgOCwgMTYpOwotICAgICAgICAgICAgcmVmSW1hZ2UuZGF0YSA9IHBNYi0+cmVmQWRkclsxXTsKLSAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzQsICZyZWZJbWFnZSwgY29sLCByb3csIDgsIDAsCi0gICAgICAgICAgICAgICAgOCwgMTYpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDogLyogUF84eDggYW5kIFBfOHg4cmVmMCAqLwotICAgICAgICAgICAgaWYgKCBNdlByZWRpY3Rpb244eDgocE1iLCAmcE1iTGF5ZXItPnN1Yk1iUHJlZCwgZHBiKSAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZWZJbWFnZS5kYXRhID0gcE1iLT5yZWZBZGRyW2ldOwotICAgICAgICAgICAgICAgIHN1YlBhcnRNb2RlID0KLSAgICAgICAgICAgICAgICAgICAgaDI2NGJzZFN1Yk1iUGFydE1vZGUocE1iTGF5ZXItPnN1Yk1iUHJlZC5zdWJNYlR5cGVbaV0pOwotICAgICAgICAgICAgICAgIHggPSBpICYgMHgxID8gOCA6IDA7Ci0gICAgICAgICAgICAgICAgeSA9IGkgPCAyID8gMCA6IDg7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChzdWJQYXJ0TW9kZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTUJfU1BfOHg4OgotICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYrNCppLCAmcmVmSW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLCByb3csIHgsIHksIDgsIDgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNQl9TUF84eDQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdis0KmksICZyZWZJbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wsIHJvdywgeCwgeSwgOCwgNCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdis0KmkrMiwgJnJlZkltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbCwgcm93LCB4LCB5KzQsIDgsIDQpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNQl9TUF80eDg6Ci0gICAgICAgICAgICAgICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdis0KmksICZyZWZJbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wsIHJvdywgeCwgeSwgNCwgOCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdis0KmkrMSwgJnJlZkltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbCwgcm93LCB4KzQsIHksIDQsIDgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzQqaSwgJnJlZkltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbCwgcm93LCB4LCB5LCA0LCA0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzQqaSsxLCAmcmVmSW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLCByb3csIHgrNCwgeSwgNCwgNCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdis0KmkrMiwgJnJlZkltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbCwgcm93LCB4LCB5KzQsIDQsIDQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYrNCppKzMsICZyZWZJbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wsIHJvdywgeCs0LCB5KzQsIDQsIDQpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLyogaWYgZGVjb2RlZCBmbGFnID4gMSAtPiBtYiBoYXMgYWxyZWFkeSBiZWVuIHN1Y2Nlc3NmdWxseSBkZWNvZGVkIGFuZAotICAgICAqIHdyaXR0ZW4gdG8gb3V0cHV0IC0+IGRvIG5vdCB3cml0ZSBhZ2FpbiAqLwotICAgIGlmIChwTWItPmRlY29kZWQgPiAxKQotICAgICAgICByZXR1cm4gSEFOVFJPX09LOwotCi0gICAgaWYgKHBNYi0+bWJUeXBlICE9IFBfU2tpcCkKLSAgICB7Ci0gICAgICAgIGgyNjRic2RXcml0ZU91dHB1dEJsb2NrcyhjdXJySW1hZ2UsIG1iTnVtLCBkYXRhLAotICAgICAgICAgICAgcE1iTGF5ZXItPnJlc2lkdWFsLmxldmVsKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaDI2NGJzZFdyaXRlTWFjcm9ibG9jayhjdXJySW1hZ2UsIGRhdGEpOwotICAgIH0KLQotICAgIHJldHVybihIQU5UUk9fT0spOwotfQotI2VuZGlmIC8qIEgyNjRERUNfT01YREwgKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBNdlByZWRpY3Rpb24xNngxNgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBNb3Rpb24gdmVjdG9yIHByZWRpY3Rpb24gZm9yIDE2eDE2IHBhcnRpdGlvbiBtb2RlCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBNdlByZWRpY3Rpb24xNngxNihtYlN0b3JhZ2VfdCAqcE1iLCBtYlByZWRfdCAqbWJQcmVkLCBkcGJTdG9yYWdlX3QgKmRwYikKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICBtdl90IG12OwotICAgIG12X3QgbXZQcmVkOwotICAgIGludGVyTmVpZ2hib3VyX3QgYVszXTsgLyogQSwgQiwgQyAqLwotICAgIHUzMiByZWZJbmRleDsKLSAgICB1OCAqdG1wOwotICAgIHUzMiAqdG1wTXYxLCAqdG1wTXYyOwotCi0vKiBDb2RlICovCi0KLSAgICByZWZJbmRleCA9IG1iUHJlZC0+cmVmSWR4TDBbMF07Ci0KLSAgICBHZXRJbnRlck5laWdoYm91cihwTWItPnNsaWNlSWQsIHBNYi0+bWJBLCBhLCA1KTsKLSAgICBHZXRJbnRlck5laWdoYm91cihwTWItPnNsaWNlSWQsIHBNYi0+bWJCLCBhKzEsIDEwKTsKLSAgICAvKmxpbnQgLS1lKDc0MCkgIFVudXN1YWwgcG9pbnRlciBjYXN0IChpbmNvbXBhdGlibGUgaW5kaXJlY3QgdHlwZXMpICovCi0gICAgdG1wTXYxID0gKHUzMiopKCZhWzBdLm12KTsgLyogd2UgdGVzdCBqdXN0IHRoYXQgYm90aCBNVnMgYXJlIHplcm8gKi8KLSAgICAvKmxpbnQgLS1lKDc0MCkgKi8KLSAgICB0bXBNdjIgPSAodTMyKikoJmFbMV0ubXYpOyAvKiBpLmUuIGFbMF0ubXYuaG9yID09IDAgJiYgYVswXS5tdi52ZXIgPT0gMCAqLwotICAgIGlmIChwTWItPm1iVHlwZSA9PSBQX1NraXAgJiYKLSAgICAgICAgKCFhWzBdLmF2YWlsYWJsZSB8fCAhYVsxXS5hdmFpbGFibGUgfHwKLSAgICAgICAgICggYVswXS5yZWZJbmRleCA9PSAwICYmICgodTMyKSgqdG1wTXYxKSA9PSAwKSApIHx8Ci0gICAgICAgICAoIGFbMV0ucmVmSW5kZXggPT0gMCAmJiAoKHUzMikoKnRtcE12MikgPT0gMCkgKSkpCi0gICAgewotICAgICAgICAgICAgbXYuaG9yID0gbXYudmVyID0gMDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgbXYgPSBtYlByZWQtPm12ZEwwWzBdOwotICAgICAgICBHZXRJbnRlck5laWdoYm91cihwTWItPnNsaWNlSWQsIHBNYi0+bWJDLCBhKzIsIDEwKTsKLSAgICAgICAgaWYgKCFhWzJdLmF2YWlsYWJsZSkKLSAgICAgICAgewotICAgICAgICAgICAgR2V0SW50ZXJOZWlnaGJvdXIocE1iLT5zbGljZUlkLCBwTWItPm1iRCwgYSsyLCAxNSk7Ci0gICAgICAgIH0KLQotICAgICAgICBHZXRQcmVkaWN0aW9uTXYoJm12UHJlZCwgYSwgcmVmSW5kZXgpOwotCi0gICAgICAgIG12LmhvciArPSBtdlByZWQuaG9yOwotICAgICAgICBtdi52ZXIgKz0gbXZQcmVkLnZlcjsKLQotICAgICAgICAvKiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgcmFuZ2UgWy0yMDQ4LCAyMDQ3Ljc1XSAqLwotICAgICAgICBpZiAoKHUzMikoaTMyKShtdi5ob3IrODE5MikgPj0gKDE2Mzg0KSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgICAgICAvKiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIHJhbmdlIFstNTEyLCA1MTEuNzVdCi0gICAgICAgICAqIChzbWFsbGVyIGZvciBsb3cgbGV2ZWxzKSAqLwotICAgICAgICBpZiAoKHUzMikoaTMyKShtdi52ZXIrMjA0OCkgPj0gKDQwOTYpKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIH0KLQotICAgIHRtcCA9IGgyNjRic2RHZXRSZWZQaWNEYXRhKGRwYiwgcmVmSW5kZXgpOwotICAgIGlmICh0bXAgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgcE1iLT5tdlswXSA9IHBNYi0+bXZbMV0gPSBwTWItPm12WzJdID0gcE1iLT5tdlszXSA9Ci0gICAgcE1iLT5tdls0XSA9IHBNYi0+bXZbNV0gPSBwTWItPm12WzZdID0gcE1iLT5tdls3XSA9Ci0gICAgcE1iLT5tdls4XSA9IHBNYi0+bXZbOV0gPSBwTWItPm12WzEwXSA9IHBNYi0+bXZbMTFdID0KLSAgICBwTWItPm12WzEyXSA9IHBNYi0+bXZbMTNdID0gcE1iLT5tdlsxNF0gPSBwTWItPm12WzE1XSA9IG12OwotCi0gICAgcE1iLT5yZWZQaWNbMF0gPSByZWZJbmRleDsKLSAgICBwTWItPnJlZlBpY1sxXSA9IHJlZkluZGV4OwotICAgIHBNYi0+cmVmUGljWzJdID0gcmVmSW5kZXg7Ci0gICAgcE1iLT5yZWZQaWNbM10gPSByZWZJbmRleDsKLSAgICBwTWItPnJlZkFkZHJbMF0gPSB0bXA7Ci0gICAgcE1iLT5yZWZBZGRyWzFdID0gdG1wOwotICAgIHBNYi0+cmVmQWRkclsyXSA9IHRtcDsKLSAgICBwTWItPnJlZkFkZHJbM10gPSB0bXA7Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IE12UHJlZGljdGlvbjE2eDgKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgTW90aW9uIHZlY3RvciBwcmVkaWN0aW9uIGZvciAxNng4IHBhcnRpdGlvbiBtb2RlCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBNdlByZWRpY3Rpb24xNng4KG1iU3RvcmFnZV90ICpwTWIsIG1iUHJlZF90ICptYlByZWQsIGRwYlN0b3JhZ2VfdCAqZHBiKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIG12X3QgbXY7Ci0gICAgbXZfdCBtdlByZWQ7Ci0gICAgaW50ZXJOZWlnaGJvdXJfdCBhWzNdOyAvKiBBLCBCLCBDICovCi0gICAgdTMyIHJlZkluZGV4OwotICAgIHU4ICp0bXA7Ci0KLS8qIENvZGUgKi8KLQotICAgIG12ID0gbWJQcmVkLT5tdmRMMFswXTsKLSAgICByZWZJbmRleCA9IG1iUHJlZC0+cmVmSWR4TDBbMF07Ci0KLSAgICBHZXRJbnRlck5laWdoYm91cihwTWItPnNsaWNlSWQsIHBNYi0+bWJCLCBhKzEsIDEwKTsKLQotICAgIGlmIChhWzFdLnJlZkluZGV4ID09IHJlZkluZGV4KQotICAgICAgICBtdlByZWQgPSBhWzFdLm12OwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgcE1iLT5tYkEsIGEsIDUpOwotICAgICAgICBHZXRJbnRlck5laWdoYm91cihwTWItPnNsaWNlSWQsIHBNYi0+bWJDLCBhKzIsIDEwKTsKLSAgICAgICAgaWYgKCFhWzJdLmF2YWlsYWJsZSkKLSAgICAgICAgewotICAgICAgICAgICAgR2V0SW50ZXJOZWlnaGJvdXIocE1iLT5zbGljZUlkLCBwTWItPm1iRCwgYSsyLCAxNSk7Ci0gICAgICAgIH0KLQotICAgICAgICBHZXRQcmVkaWN0aW9uTXYoJm12UHJlZCwgYSwgcmVmSW5kZXgpOwotCi0gICAgfQotICAgIG12LmhvciArPSBtdlByZWQuaG9yOwotICAgIG12LnZlciArPSBtdlByZWQudmVyOwotCi0gICAgLyogaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIHJhbmdlIFstMjA0OCwgMjA0Ny43NV0gKi8KLSAgICBpZiAoKHUzMikoaTMyKShtdi5ob3IrODE5MikgPj0gKDE2Mzg0KSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgLyogdmVydGljYWwgbW90aW9uIHZlY3RvciByYW5nZSBbLTUxMiwgNTExLjc1XSAoc21hbGxlciBmb3IgbG93IGxldmVscykgKi8KLSAgICBpZiAoKHUzMikoaTMyKShtdi52ZXIrMjA0OCkgPj0gKDQwOTYpKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0UmVmUGljRGF0YShkcGIsIHJlZkluZGV4KTsKLSAgICBpZiAodG1wID09IE5VTEwpCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIHBNYi0+bXZbMF0gPSBwTWItPm12WzFdID0gcE1iLT5tdlsyXSA9IHBNYi0+bXZbM10gPQotICAgIHBNYi0+bXZbNF0gPSBwTWItPm12WzVdID0gcE1iLT5tdls2XSA9IHBNYi0+bXZbN10gPSBtdjsKLSAgICBwTWItPnJlZlBpY1swXSA9IHJlZkluZGV4OwotICAgIHBNYi0+cmVmUGljWzFdID0gcmVmSW5kZXg7Ci0gICAgcE1iLT5yZWZBZGRyWzBdID0gdG1wOwotICAgIHBNYi0+cmVmQWRkclsxXSA9IHRtcDsKLQotICAgIG12ID0gbWJQcmVkLT5tdmRMMFsxXTsKLSAgICByZWZJbmRleCA9IG1iUHJlZC0+cmVmSWR4TDBbMV07Ci0KLSAgICBHZXRJbnRlck5laWdoYm91cihwTWItPnNsaWNlSWQsIHBNYi0+bWJBLCBhLCAxMyk7Ci0gICAgaWYgKGFbMF0ucmVmSW5kZXggPT0gcmVmSW5kZXgpCi0gICAgICAgIG12UHJlZCA9IGFbMF0ubXY7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgYVsxXS5hdmFpbGFibGUgPSBIQU5UUk9fVFJVRTsKLSAgICAgICAgYVsxXS5yZWZJbmRleCA9IHBNYi0+cmVmUGljWzBdOwotICAgICAgICBhWzFdLm12ID0gcE1iLT5tdlswXTsKLQotICAgICAgICAvKiBjIGlzIG5vdCBhdmFpbGFibGUgKi8KLSAgICAgICAgR2V0SW50ZXJOZWlnaGJvdXIocE1iLT5zbGljZUlkLCBwTWItPm1iQSwgYSsyLCA3KTsKLQotICAgICAgICBHZXRQcmVkaWN0aW9uTXYoJm12UHJlZCwgYSwgcmVmSW5kZXgpOwotCi0gICAgfQotICAgIG12LmhvciArPSBtdlByZWQuaG9yOwotICAgIG12LnZlciArPSBtdlByZWQudmVyOwotCi0gICAgLyogaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIHJhbmdlIFstMjA0OCwgMjA0Ny43NV0gKi8KLSAgICBpZiAoKHUzMikoaTMyKShtdi5ob3IrODE5MikgPj0gKDE2Mzg0KSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgLyogdmVydGljYWwgbW90aW9uIHZlY3RvciByYW5nZSBbLTUxMiwgNTExLjc1XSAoc21hbGxlciBmb3IgbG93IGxldmVscykgKi8KLSAgICBpZiAoKHUzMikoaTMyKShtdi52ZXIrMjA0OCkgPj0gKDQwOTYpKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0UmVmUGljRGF0YShkcGIsIHJlZkluZGV4KTsKLSAgICBpZiAodG1wID09IE5VTEwpCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIHBNYi0+bXZbOF0gPSBwTWItPm12WzldID0gcE1iLT5tdlsxMF0gPSBwTWItPm12WzExXSA9Ci0gICAgcE1iLT5tdlsxMl0gPSBwTWItPm12WzEzXSA9IHBNYi0+bXZbMTRdID0gcE1iLT5tdlsxNV0gPSBtdjsKLSAgICBwTWItPnJlZlBpY1syXSA9IHJlZkluZGV4OwotICAgIHBNYi0+cmVmUGljWzNdID0gcmVmSW5kZXg7Ci0gICAgcE1iLT5yZWZBZGRyWzJdID0gdG1wOwotICAgIHBNYi0+cmVmQWRkclszXSA9IHRtcDsKLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogTXZQcmVkaWN0aW9uOHgxNgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBNb3Rpb24gdmVjdG9yIHByZWRpY3Rpb24gZm9yIDh4MTYgcGFydGl0aW9uIG1vZGUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIE12UHJlZGljdGlvbjh4MTYobWJTdG9yYWdlX3QgKnBNYiwgbWJQcmVkX3QgKm1iUHJlZCwgZHBiU3RvcmFnZV90ICpkcGIpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgbXZfdCBtdjsKLSAgICBtdl90IG12UHJlZDsKLSAgICBpbnRlck5laWdoYm91cl90IGFbM107IC8qIEEsIEIsIEMgKi8KLSAgICB1MzIgcmVmSW5kZXg7Ci0gICAgdTggKnRtcDsKLQotLyogQ29kZSAqLwotCi0gICAgbXYgPSBtYlByZWQtPm12ZEwwWzBdOwotICAgIHJlZkluZGV4ID0gbWJQcmVkLT5yZWZJZHhMMFswXTsKLQotICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgcE1iLT5tYkEsIGEsIDUpOwotCi0gICAgaWYgKGFbMF0ucmVmSW5kZXggPT0gcmVmSW5kZXgpCi0gICAgICAgIG12UHJlZCA9IGFbMF0ubXY7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgR2V0SW50ZXJOZWlnaGJvdXIocE1iLT5zbGljZUlkLCBwTWItPm1iQiwgYSsxLCAxMCk7Ci0gICAgICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgcE1iLT5tYkIsIGErMiwgMTQpOwotICAgICAgICBpZiAoIWFbMl0uYXZhaWxhYmxlKQotICAgICAgICB7Ci0gICAgICAgICAgICBHZXRJbnRlck5laWdoYm91cihwTWItPnNsaWNlSWQsIHBNYi0+bWJELCBhKzIsIDE1KTsKLSAgICAgICAgfQotCi0gICAgICAgIEdldFByZWRpY3Rpb25NdigmbXZQcmVkLCBhLCByZWZJbmRleCk7Ci0KLSAgICB9Ci0gICAgbXYuaG9yICs9IG12UHJlZC5ob3I7Ci0gICAgbXYudmVyICs9IG12UHJlZC52ZXI7Ci0KLSAgICAvKiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgcmFuZ2UgWy0yMDQ4LCAyMDQ3Ljc1XSAqLwotICAgIGlmICgodTMyKShpMzIpKG12Lmhvcis4MTkyKSA+PSAoMTYzODQpKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICAvKiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIHJhbmdlIFstNTEyLCA1MTEuNzVdIChzbWFsbGVyIGZvciBsb3cgbGV2ZWxzKSAqLwotICAgIGlmICgodTMyKShpMzIpKG12LnZlcisyMDQ4KSA+PSAoNDA5NikpCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIHRtcCA9IGgyNjRic2RHZXRSZWZQaWNEYXRhKGRwYiwgcmVmSW5kZXgpOwotICAgIGlmICh0bXAgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgcE1iLT5tdlswXSA9IHBNYi0+bXZbMV0gPSBwTWItPm12WzJdID0gcE1iLT5tdlszXSA9Ci0gICAgcE1iLT5tdls4XSA9IHBNYi0+bXZbOV0gPSBwTWItPm12WzEwXSA9IHBNYi0+bXZbMTFdID0gbXY7Ci0gICAgcE1iLT5yZWZQaWNbMF0gPSByZWZJbmRleDsKLSAgICBwTWItPnJlZlBpY1syXSA9IHJlZkluZGV4OwotICAgIHBNYi0+cmVmQWRkclswXSA9IHRtcDsKLSAgICBwTWItPnJlZkFkZHJbMl0gPSB0bXA7Ci0KLSAgICBtdiA9IG1iUHJlZC0+bXZkTDBbMV07Ci0gICAgcmVmSW5kZXggPSBtYlByZWQtPnJlZklkeEwwWzFdOwotCi0gICAgR2V0SW50ZXJOZWlnaGJvdXIocE1iLT5zbGljZUlkLCBwTWItPm1iQywgYSsyLCAxMCk7Ci0gICAgaWYgKCFhWzJdLmF2YWlsYWJsZSkKLSAgICB7Ci0gICAgICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgcE1iLT5tYkIsIGErMiwgMTEpOwotICAgIH0KLSAgICBpZiAoYVsyXS5yZWZJbmRleCA9PSByZWZJbmRleCkKLSAgICAgICAgbXZQcmVkID0gYVsyXS5tdjsKLSAgICBlbHNlCi0gICAgewotICAgICAgICBhWzBdLmF2YWlsYWJsZSA9IEhBTlRST19UUlVFOwotICAgICAgICBhWzBdLnJlZkluZGV4ID0gcE1iLT5yZWZQaWNbMF07Ci0gICAgICAgIGFbMF0ubXYgPSBwTWItPm12WzBdOwotCi0gICAgICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgcE1iLT5tYkIsIGErMSwgMTQpOwotCi0gICAgICAgIEdldFByZWRpY3Rpb25NdigmbXZQcmVkLCBhLCByZWZJbmRleCk7Ci0KLSAgICB9Ci0gICAgbXYuaG9yICs9IG12UHJlZC5ob3I7Ci0gICAgbXYudmVyICs9IG12UHJlZC52ZXI7Ci0KLSAgICAvKiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgcmFuZ2UgWy0yMDQ4LCAyMDQ3Ljc1XSAqLwotICAgIGlmICgodTMyKShpMzIpKG12Lmhvcis4MTkyKSA+PSAoMTYzODQpKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICAvKiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIHJhbmdlIFstNTEyLCA1MTEuNzVdIChzbWFsbGVyIGZvciBsb3cgbGV2ZWxzKSAqLwotICAgIGlmICgodTMyKShpMzIpKG12LnZlcisyMDQ4KSA+PSAoNDA5NikpCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIHRtcCA9IGgyNjRic2RHZXRSZWZQaWNEYXRhKGRwYiwgcmVmSW5kZXgpOwotICAgIGlmICh0bXAgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgcE1iLT5tdls0XSA9IHBNYi0+bXZbNV0gPSBwTWItPm12WzZdID0gcE1iLT5tdls3XSA9Ci0gICAgcE1iLT5tdlsxMl0gPSBwTWItPm12WzEzXSA9IHBNYi0+bXZbMTRdID0gcE1iLT5tdlsxNV0gPSBtdjsKLSAgICBwTWItPnJlZlBpY1sxXSA9IHJlZkluZGV4OwotICAgIHBNYi0+cmVmUGljWzNdID0gcmVmSW5kZXg7Ci0gICAgcE1iLT5yZWZBZGRyWzFdID0gdG1wOwotICAgIHBNYi0+cmVmQWRkclszXSA9IHRtcDsKLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogTXZQcmVkaWN0aW9uOHg4Ci0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIE1vdGlvbiB2ZWN0b3IgcHJlZGljdGlvbiBmb3IgOHg4IHBhcnRpdGlvbiBtb2RlCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBNdlByZWRpY3Rpb244eDgobWJTdG9yYWdlX3QgKnBNYiwgc3ViTWJQcmVkX3QgKnN1Yk1iUHJlZCwgZHBiU3RvcmFnZV90ICpkcGIpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGksIGo7Ci0gICAgdTMyIG51bVN1Yk1iUGFydDsKLQotLyogQ29kZSAqLwotCi0gICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICB7Ci0gICAgICAgIG51bVN1Yk1iUGFydCA9IGgyNjRic2ROdW1TdWJNYlBhcnQoc3ViTWJQcmVkLT5zdWJNYlR5cGVbaV0pOwotICAgICAgICBwTWItPnJlZlBpY1tpXSA9IHN1Yk1iUHJlZC0+cmVmSWR4TDBbaV07Ci0gICAgICAgIHBNYi0+cmVmQWRkcltpXSA9IGgyNjRic2RHZXRSZWZQaWNEYXRhKGRwYiwgc3ViTWJQcmVkLT5yZWZJZHhMMFtpXSk7Ci0gICAgICAgIGlmIChwTWItPnJlZkFkZHJbaV0gPT0gTlVMTCkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IG51bVN1Yk1iUGFydDsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoTXZQcmVkaWN0aW9uKHBNYiwgc3ViTWJQcmVkLCBpLCBqKSAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBNdlByZWRpY3Rpb24KLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgUGVyZm9ybSBtb3Rpb24gdmVjdG9yIHByZWRpY3Rpb24gZm9yIHN1Yi1wYXJ0aXRpb24KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIE12UHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCBzdWJNYlByZWRfdCAqc3ViTWJQcmVkLCB1MzIgbWJQYXJ0SWR4LAotICAgIHUzMiBzdWJNYlBhcnRJZHgpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgbXZfdCBtdiwgbXZQcmVkOwotICAgIHUzMiByZWZJbmRleDsKLSAgICBzdWJNYlBhcnRNb2RlX2Ugc3ViTWJQYXJ0TW9kZTsKLSAgICBjb25zdCBuZWlnaGJvdXJfdCAqbjsKLSAgICBtYlN0b3JhZ2VfdCAqbk1iOwotICAgIGludGVyTmVpZ2hib3VyX3QgYVszXTsgLyogQSwgQiwgQyAqLwotCi0vKiBDb2RlICovCi0KLSAgICBtdiA9IHN1Yk1iUHJlZC0+bXZkTDBbbWJQYXJ0SWR4XVtzdWJNYlBhcnRJZHhdOwotICAgIHN1Yk1iUGFydE1vZGUgPSBoMjY0YnNkU3ViTWJQYXJ0TW9kZShzdWJNYlByZWQtPnN1Yk1iVHlwZVttYlBhcnRJZHhdKTsKLSAgICByZWZJbmRleCA9IHN1Yk1iUHJlZC0+cmVmSWR4TDBbbWJQYXJ0SWR4XTsKLQotICAgIG4gPSBOX0FfU1VCX1BBUlRbbWJQYXJ0SWR4XVtzdWJNYlBhcnRNb2RlXStzdWJNYlBhcnRJZHg7Ci0gICAgbk1iID0gaDI2NGJzZEdldE5laWdoYm91ck1iKHBNYiwgbi0+bWIpOwotICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgbk1iLCBhLCBuLT5pbmRleCk7Ci0KLSAgICBuID0gTl9CX1NVQl9QQVJUW21iUGFydElkeF1bc3ViTWJQYXJ0TW9kZV0rc3ViTWJQYXJ0SWR4OwotICAgIG5NYiA9IGgyNjRic2RHZXROZWlnaGJvdXJNYihwTWIsIG4tPm1iKTsKLSAgICBHZXRJbnRlck5laWdoYm91cihwTWItPnNsaWNlSWQsIG5NYiwgYSsxLCBuLT5pbmRleCk7Ci0KLSAgICBuID0gTl9DX1NVQl9QQVJUW21iUGFydElkeF1bc3ViTWJQYXJ0TW9kZV0rc3ViTWJQYXJ0SWR4OwotICAgIG5NYiA9IGgyNjRic2RHZXROZWlnaGJvdXJNYihwTWIsIG4tPm1iKTsKLSAgICBHZXRJbnRlck5laWdoYm91cihwTWItPnNsaWNlSWQsIG5NYiwgYSsyLCBuLT5pbmRleCk7Ci0KLSAgICBpZiAoIWFbMl0uYXZhaWxhYmxlKQotICAgIHsKLSAgICAgICAgbiA9IE5fRF9TVUJfUEFSVFttYlBhcnRJZHhdW3N1Yk1iUGFydE1vZGVdK3N1Yk1iUGFydElkeDsKLSAgICAgICAgbk1iID0gaDI2NGJzZEdldE5laWdoYm91ck1iKHBNYiwgbi0+bWIpOwotICAgICAgICBHZXRJbnRlck5laWdoYm91cihwTWItPnNsaWNlSWQsIG5NYiwgYSsyLCBuLT5pbmRleCk7Ci0gICAgfQotCi0gICAgR2V0UHJlZGljdGlvbk12KCZtdlByZWQsIGEsIHJlZkluZGV4KTsKLQotICAgIG12LmhvciArPSBtdlByZWQuaG9yOwotICAgIG12LnZlciArPSBtdlByZWQudmVyOwotCi0gICAgLyogaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIHJhbmdlIFstMjA0OCwgMjA0Ny43NV0gKi8KLSAgICBpZiAoKCh1MzIpKGkzMikobXYuaG9yKzgxOTIpID49ICgxNjM4NCkpKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICAvKiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIHJhbmdlIFstNTEyLCA1MTEuNzVdIChzbWFsbGVyIGZvciBsb3cgbGV2ZWxzKSAqLwotICAgIGlmICgoKHUzMikoaTMyKShtdi52ZXIrMjA0OCkgPj0gKDQwOTYpKSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgc3dpdGNoIChzdWJNYlBhcnRNb2RlKQotICAgIHsKLSAgICAgICAgY2FzZSBNQl9TUF84eDg6Ci0gICAgICAgICAgICBwTWItPm12WzQqbWJQYXJ0SWR4XSA9IG12OwotICAgICAgICAgICAgcE1iLT5tdls0Km1iUGFydElkeCArIDFdID0gbXY7Ci0gICAgICAgICAgICBwTWItPm12WzQqbWJQYXJ0SWR4ICsgMl0gPSBtdjsKLSAgICAgICAgICAgIHBNYi0+bXZbNCptYlBhcnRJZHggKyAzXSA9IG12OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNQl9TUF84eDQ6Ci0gICAgICAgICAgICBwTWItPm12WzQqbWJQYXJ0SWR4ICsgMipzdWJNYlBhcnRJZHhdID0gbXY7Ci0gICAgICAgICAgICBwTWItPm12WzQqbWJQYXJ0SWR4ICsgMipzdWJNYlBhcnRJZHggKyAxXSA9IG12OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNQl9TUF80eDg6Ci0gICAgICAgICAgICBwTWItPm12WzQqbWJQYXJ0SWR4ICsgc3ViTWJQYXJ0SWR4XSA9IG12OwotICAgICAgICAgICAgcE1iLT5tdls0Km1iUGFydElkeCArIHN1Yk1iUGFydElkeCArIDJdID0gbXY7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE1CX1NQXzR4NDoKLSAgICAgICAgICAgIHBNYi0+bXZbNCptYlBhcnRJZHggKyBzdWJNYlBhcnRJZHhdID0gbXY7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IE1lZGlhbkZpbHRlcgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBNZWRpYW4gZmlsdGVyaW5nIGZvciBtb3Rpb24gdmVjdG9yIHByZWRpY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotaTMyIE1lZGlhbkZpbHRlcihpMzIgYSwgaTMyIGIsIGkzMiBjKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIGkzMiBtYXgsbWluLG1lZDsKLQotLyogQ29kZSAqLwotCi0gICAgbWF4ID0gbWluID0gbWVkID0gYTsKLSAgICBpZiAoYiA+IG1heCkKLSAgICB7Ci0gICAgICAgIG1heCA9IGI7Ci0gICAgfQotICAgIGVsc2UgaWYgKGIgPCBtaW4pCi0gICAgewotICAgICAgICBtaW4gPSBiOwotICAgIH0KLSAgICBpZiAoYyA+IG1heCkKLSAgICB7Ci0gICAgICAgIG1lZCA9IG1heDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoYyA8IG1pbikKLSAgICB7Ci0gICAgICAgIG1lZCA9IG1pbjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgbWVkID0gYzsKLSAgICB9Ci0KLSAgICByZXR1cm4obWVkKTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBHZXRJbnRlck5laWdoYm91cgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBHZXQgYXZhaWxhYmlsaXR5LCByZWZlcmVuY2UgaW5kZXggYW5kIG1vdGlvbiB2ZWN0b3Igb2YgYSBuZWlnaGJvdXIKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBHZXRJbnRlck5laWdoYm91cih1MzIgc2xpY2VJZCwgbWJTdG9yYWdlX3QgKm5NYiwKLSAgICBpbnRlck5laWdoYm91cl90ICpuLCB1MzIgaW5kZXgpCi17Ci0KLSAgICBuLT5hdmFpbGFibGUgPSBIQU5UUk9fRkFMU0U7Ci0gICAgbi0+cmVmSW5kZXggPSAweEZGRkZGRkZGOwotICAgIG4tPm12LmhvciA9IG4tPm12LnZlciA9IDA7Ci0KLSAgICBpZiAobk1iICYmIChzbGljZUlkID09IG5NYi0+c2xpY2VJZCkpCi0gICAgewotICAgICAgICB1MzIgdG1wOwotICAgICAgICBtdl90IHRtcE12OwotCi0gICAgICAgIHRtcCA9IG5NYi0+bWJUeXBlOwotICAgICAgICBuLT5hdmFpbGFibGUgPSBIQU5UUk9fVFJVRTsKLSAgICAgICAgLyogTWJQYXJ0UHJlZE1vZGUgImlubGluZWQiICovCi0gICAgICAgIGlmICh0bXAgPD0gUF84eDhyZWYwKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXBNdiA9IG5NYi0+bXZbaW5kZXhdOwotICAgICAgICAgICAgdG1wID0gbk1iLT5yZWZQaWNbaW5kZXg+PjJdOwotICAgICAgICAgICAgbi0+cmVmSW5kZXggPSB0bXA7Ci0gICAgICAgICAgICBuLT5tdiA9IHRtcE12OwotICAgICAgICB9Ci0gICAgfQotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogR2V0UHJlZGljdGlvbk12Ci0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIENvbXB1dGUgbW90aW9uIHZlY3RvciBwcmVkaWN0b3IgYmFzZWQgb24gbmVpZ2hib3VycyBBLCBCIGFuZCBDCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgR2V0UHJlZGljdGlvbk12KG12X3QgKm12LCBpbnRlck5laWdoYm91cl90ICphLCB1MzIgcmVmSW5kZXgpCi17Ci0KLSAgICBpZiAoIGFbMV0uYXZhaWxhYmxlIHx8IGFbMl0uYXZhaWxhYmxlIHx8ICFhWzBdLmF2YWlsYWJsZSkKLSAgICB7Ci0gICAgICAgIHUzMiBpc0EsIGlzQiwgaXNDOwotICAgICAgICBpc0EgPSAoYVswXS5yZWZJbmRleCA9PSByZWZJbmRleCkgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLSAgICAgICAgaXNCID0gKGFbMV0ucmVmSW5kZXggPT0gcmVmSW5kZXgpID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0gICAgICAgIGlzQyA9IChhWzJdLnJlZkluZGV4ID09IHJlZkluZGV4KSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotCi0gICAgICAgIGlmICgoKHUzMilpc0ErKHUzMilpc0IrKHUzMilpc0MpICE9IDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG12LT5ob3IgPSAoaTE2KU1lZGlhbkZpbHRlcihhWzBdLm12LmhvciwgYVsxXS5tdi5ob3IsIGFbMl0ubXYuaG9yKTsKLSAgICAgICAgICAgIG12LT52ZXIgPSAoaTE2KU1lZGlhbkZpbHRlcihhWzBdLm12LnZlciwgYVsxXS5tdi52ZXIsIGFbMl0ubXYudmVyKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChpc0EpCi0gICAgICAgICAgICAqbXYgPSBhWzBdLm12OwotICAgICAgICBlbHNlIGlmIChpc0IpCi0gICAgICAgICAgICAqbXYgPSBhWzFdLm12OwotICAgICAgICBlbHNlCi0gICAgICAgICAgICAqbXYgPSBhWzJdLm12OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAqbXYgPSBhWzBdLm12OwotICAgIH0KLQotfQotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbnRlcl9wcmVkaWN0aW9uLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfaW50ZXJfcHJlZGljdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGRlZTI1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbnRlcl9wcmVkaWN0aW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotICAgIDMuIERhdGEgdHlwZXMKLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgSDI2NFNXREVDX0lOVEVSX1BSRURJQ1RJT05fSAotI2RlZmluZSBIMjY0U1dERUNfSU5URVJfUFJFRElDVElPTl9ICi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiYmFzZXR5cGUuaCIKLSNpbmNsdWRlICJoMjY0YnNkX2ltYWdlLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9tYWNyb2Jsb2NrX2xheWVyLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9kcGIuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBEYXRhIHR5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkSW50ZXJQcmVkaWN0aW9uKG1iU3RvcmFnZV90ICpwTWIsIG1hY3JvYmxvY2tMYXllcl90ICpwTWJMYXllciwKLSAgICBkcGJTdG9yYWdlX3QgKmRwYiwgdTMyIG1iTnVtLCBpbWFnZV90ICppbWFnZSwgdTggKmRhdGEpOwotCi0jZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19JTlRFUl9QUkVESUNUSU9OX0ggKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ludHJhX3ByZWRpY3Rpb24uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbnRyYV9wcmVkaWN0aW9uLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyYzg1ZTUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ludHJhX3ByZWRpY3Rpb24uYworKysgL2Rldi9udWxsCkBAIC0xLDE5MzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotICAgICAzLiBNb2R1bGUgZGVmaW5lcwotICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0gICAgIDUuIEZ1bmN0aW9ucwotICAgICAgICAgIGgyNjRic2RJbnRyYVByZWRpY3Rpb24KLSAgICAgICAgICBoMjY0YnNkR2V0TmVpZ2hib3VyUGVscwotICAgICAgICAgIGgyNjRic2RJbnRyYTE2eDE2UHJlZGljdGlvbgotICAgICAgICAgIGgyNjRic2RJbnRyYTR4NFByZWRpY3Rpb24KLSAgICAgICAgICBoMjY0YnNkSW50cmFDaHJvbWFQcmVkaWN0aW9uCi0gICAgICAgICAgaDI2NGJzZEFkZFJlc2lkdWFsCi0gICAgICAgICAgSW50cmExNngxNlZlcnRpY2FsUHJlZGljdGlvbgotICAgICAgICAgIEludHJhMTZ4MTZIb3Jpem9udGFsUHJlZGljdGlvbgotICAgICAgICAgIEludHJhMTZ4MTZEY1ByZWRpY3Rpb24KLSAgICAgICAgICBJbnRyYTE2eDE2UGxhbmVQcmVkaWN0aW9uCi0gICAgICAgICAgSW50cmFDaHJvbWFEY1ByZWRpY3Rpb24KLSAgICAgICAgICBJbnRyYUNocm9tYUhvcml6b250YWxQcmVkaWN0aW9uCi0gICAgICAgICAgSW50cmFDaHJvbWFWZXJ0aWNhbFByZWRpY3Rpb24KLSAgICAgICAgICBJbnRyYUNocm9tYVBsYW5lUHJlZGljdGlvbgotICAgICAgICAgIEdldDR4NE5laWdoYm91clBlbHMKLSAgICAgICAgICBXcml0ZTR4NFRvMTZ4MTYKLSAgICAgICAgICBJbnRyYTR4NFZlcnRpY2FsUHJlZGljdGlvbgotICAgICAgICAgIEludHJhNHg0SG9yaXpvbnRhbFByZWRpY3Rpb24KLSAgICAgICAgICBJbnRyYTR4NERjUHJlZGljdGlvbgotICAgICAgICAgIEludHJhNHg0RGlhZ29uYWxEb3duTGVmdFByZWRpY3Rpb24KLSAgICAgICAgICBJbnRyYTR4NERpYWdvbmFsRG93blJpZ2h0UHJlZGljdGlvbgotICAgICAgICAgIEludHJhNHg0VmVydGljYWxSaWdodFByZWRpY3Rpb24KLSAgICAgICAgICBJbnRyYTR4NEhvcml6b250YWxEb3duUHJlZGljdGlvbgotICAgICAgICAgIEludHJhNHg0VmVydGljYWxMZWZ0UHJlZGljdGlvbgotICAgICAgICAgIEludHJhNHg0SG9yaXpvbnRhbFVwUHJlZGljdGlvbgotICAgICAgICAgIERldGVybWluZUludHJhNHg0UHJlZE1vZGUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJoMjY0YnNkX2ludHJhX3ByZWRpY3Rpb24uaCIKLSNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKLSNpbmNsdWRlICJoMjY0YnNkX21hY3JvYmxvY2tfbGF5ZXIuaCIKLSNpbmNsdWRlICJoMjY0YnNkX25laWdoYm91ci5oIgotI2luY2x1ZGUgImgyNjRic2RfaW1hZ2UuaCIKLQotI2lmZGVmIEgyNjRERUNfT01YREwKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0jZW5kaWYgLyogSDI2NERFQ19PTVhETCAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBTd2l0Y2ggb2ZmIHRoZSBmb2xsb3dpbmcgTGludCBtZXNzYWdlcyBmb3IgdGhpcyBmaWxlOgotICogSW5mbyA3MDI6IFNoaWZ0IHJpZ2h0IG9mIHNpZ25lZCBxdWFudGl0eSAoaW50KQotICovCi0vKmxpbnQgLWU3MDIgKi8KLQotCi0vKiB4LSBhbmQgeS1jb29yZGluYXRlcyBmb3IgZWFjaCBibG9jayAqLwotY29uc3QgdTMyIGgyNjRic2RCbG9ja1hbMTZdID0KLSAgICB7IDAsIDQsIDAsIDQsIDgsIDEyLCA4LCAxMiwgMCwgNCwgMCwgNCwgOCwgMTIsIDgsIDEyIH07Ci1jb25zdCB1MzIgaDI2NGJzZEJsb2NrWVsxNl0gPQotICAgIHsgMCwgMCwgNCwgNCwgMCwgMCwgNCwgNCwgOCwgOCwgMTIsIDEyLCA4LCA4LCAxMiwgMTIgfTsKLQotY29uc3QgdTggaDI2NGJzZENsaXBbMTI4MF0gPQotewotICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKLSAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCi0gICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAotICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKLSAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCi0gICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAotICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKLSAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCi0gICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAotICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKLSAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCi0gICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAotICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKLSAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCi0gICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAotICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKLSAgICAwLDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1LAotICAgIDE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LDI2LDI3LDI4LDI5LDMwLDMxLAotICAgIDMyLDMzLDM0LDM1LDM2LDM3LDM4LDM5LDQwLDQxLDQyLDQzLDQ0LDQ1LDQ2LDQ3LAotICAgIDQ4LDQ5LDUwLDUxLDUyLDUzLDU0LDU1LDU2LDU3LDU4LDU5LDYwLDYxLDYyLDYzLAotICAgIDY0LDY1LDY2LDY3LDY4LDY5LDcwLDcxLDcyLDczLDc0LDc1LDc2LDc3LDc4LDc5LAotICAgIDgwLDgxLDgyLDgzLDg0LDg1LDg2LDg3LDg4LDg5LDkwLDkxLDkyLDkzLDk0LDk1LAotICAgIDk2LDk3LDk4LDk5LDEwMCwxMDEsMTAyLDEwMywxMDQsMTA1LDEwNiwxMDcsMTA4LDEwOSwxMTAsMTExLAotICAgIDExMiwxMTMsMTE0LDExNSwxMTYsMTE3LDExOCwxMTksMTIwLDEyMSwxMjIsMTIzLDEyNCwxMjUsMTI2LDEyNywKLSAgICAxMjgsMTI5LDEzMCwxMzEsMTMyLDEzMywxMzQsMTM1LDEzNiwxMzcsMTM4LDEzOSwxNDAsMTQxLDE0MiwxNDMsCi0gICAgMTQ0LDE0NSwxNDYsMTQ3LDE0OCwxNDksMTUwLDE1MSwxNTIsMTUzLDE1NCwxNTUsMTU2LDE1NywxNTgsMTU5LAotICAgIDE2MCwxNjEsMTYyLDE2MywxNjQsMTY1LDE2NiwxNjcsMTY4LDE2OSwxNzAsMTcxLDE3MiwxNzMsMTc0LDE3NSwKLSAgICAxNzYsMTc3LDE3OCwxNzksMTgwLDE4MSwxODIsMTgzLDE4NCwxODUsMTg2LDE4NywxODgsMTg5LDE5MCwxOTEsCi0gICAgMTkyLDE5MywxOTQsMTk1LDE5NiwxOTcsMTk4LDE5OSwyMDAsMjAxLDIwMiwyMDMsMjA0LDIwNSwyMDYsMjA3LAotICAgIDIwOCwyMDksMjEwLDIxMSwyMTIsMjEzLDIxNCwyMTUsMjE2LDIxNywyMTgsMjE5LDIyMCwyMjEsMjIyLDIyMywKLSAgICAyMjQsMjI1LDIyNiwyMjcsMjI4LDIyOSwyMzAsMjMxLDIzMiwyMzMsMjM0LDIzNSwyMzYsMjM3LDIzOCwyMzksCi0gICAgMjQwLDI0MSwyNDIsMjQzLDI0NCwyNDUsMjQ2LDI0NywyNDgsMjQ5LDI1MCwyNTEsMjUyLDI1MywyNTQsMjU1LAotICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKLSAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCi0gICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAotICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKLSAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCi0gICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAotICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKLSAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCi0gICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAotICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKLSAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCi0gICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAotICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKLSAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCi0gICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAotICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKLSAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCi0gICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAotICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKLSAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCi0gICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAotICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKLSAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCi0gICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAotICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKLSAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCi0gICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAotICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKLSAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCi0gICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAotICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKLSAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUKLX07Ci0KLSNpZm5kZWYgSDI2NERFQ19PTVhETAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIHZvaWQgR2V0NHg0TmVpZ2hib3VyUGVscyh1OCAqYSwgdTggKmwsIHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0LAotICAgIHUzMiBibG9ja051bSk7Ci1zdGF0aWMgdm9pZCBJbnRyYTE2eDE2VmVydGljYWxQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUpOwotc3RhdGljIHZvaWQgSW50cmExNngxNkhvcml6b250YWxQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqbGVmdCk7Ci1zdGF0aWMgdm9pZCBJbnRyYTE2eDE2RGNQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0LAotICAgIHUzMiBBLCB1MzIgQik7Ci1zdGF0aWMgdm9pZCBJbnRyYTE2eDE2UGxhbmVQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0KTsKLXN0YXRpYyB2b2lkIEludHJhQ2hyb21hRGNQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0LAotICAgIHUzMiBBLCB1MzIgQik7Ci1zdGF0aWMgdm9pZCBJbnRyYUNocm9tYUhvcml6b250YWxQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqbGVmdCk7Ci1zdGF0aWMgdm9pZCBJbnRyYUNocm9tYVZlcnRpY2FsUHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlKTsKLXN0YXRpYyB2b2lkIEludHJhQ2hyb21hUGxhbmVQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0KTsKLQotc3RhdGljIHZvaWQgSW50cmE0eDRWZXJ0aWNhbFByZWRpY3Rpb24odTggKmRhdGEsIHU4ICphYm92ZSk7Ci1zdGF0aWMgdm9pZCBJbnRyYTR4NEhvcml6b250YWxQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqbGVmdCk7Ci1zdGF0aWMgdm9pZCBJbnRyYTR4NERjUHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlLCB1OCAqbGVmdCwgdTMyIEEsIHUzMiBCKTsKLXN0YXRpYyB2b2lkIEludHJhNHg0RGlhZ29uYWxEb3duTGVmdFByZWRpY3Rpb24odTggKmRhdGEsIHU4ICphYm92ZSk7Ci1zdGF0aWMgdm9pZCBJbnRyYTR4NERpYWdvbmFsRG93blJpZ2h0UHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlLCB1OCAqbGVmdCk7Ci1zdGF0aWMgdm9pZCBJbnRyYTR4NFZlcnRpY2FsUmlnaHRQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0KTsKLXN0YXRpYyB2b2lkIEludHJhNHg0SG9yaXpvbnRhbERvd25QcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0KTsKLXN0YXRpYyB2b2lkIEludHJhNHg0VmVydGljYWxMZWZ0UHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlKTsKLXN0YXRpYyB2b2lkIEludHJhNHg0SG9yaXpvbnRhbFVwUHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmxlZnQpOwotdm9pZCBoMjY0YnNkQWRkUmVzaWR1YWwodTggKmRhdGEsIGkzMiAqcmVzaWR1YWwsIHUzMiBibG9ja051bSk7Ci0KLXN0YXRpYyB2b2lkIFdyaXRlNHg0VG8xNngxNih1OCAqZGF0YSwgdTggKmRhdGE0eDQsIHUzMiBibG9ja051bSk7Ci0jZW5kaWYgLyogSDI2NERFQ19PTVhETCAqLwotCi1zdGF0aWMgdTMyIERldGVybWluZUludHJhNHg0UHJlZE1vZGUobWFjcm9ibG9ja0xheWVyX3QgKnBNYkxheWVyLAotICAgIHUzMiBhdmFpbGFibGUsIG5laWdoYm91cl90ICpuQSwgbmVpZ2hib3VyX3QgKm5CLCB1MzIgaW5kZXgsCi0gICAgbWJTdG9yYWdlX3QgKm5NYkEsIG1iU3RvcmFnZV90ICpuTWJCKTsKLQotCi0jaWZkZWYgSDI2NERFQ19PTVhETAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RJbnRyYTE2eDE2UHJlZGljdGlvbgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgUGVyZm9ybSBpbnRyYSAxNngxNiBwcmVkaWN0aW9uIG1vZGUgZm9yIGx1bWEgcGl4ZWxzIGFuZCBhZGQKLSAgICAgICAgICByZXNpZHVhbCBpbnRvIHByZWRpY3Rpb24uIFRoZSByZXN1bHRpbmcgbHVtYSBwaXhlbHMgYXJlCi0gICAgICAgICAgc3RvcmVkIGluIG1hY3JvYmxvY2sgYXJyYXkgJ2RhdGEnLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdTMyIGgyNjRic2RJbnRyYTE2eDE2UHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCB1OCAqZGF0YSwgdTggKnB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyIHdpZHRoLCB1MzIgY29uc3RyYWluZWRJbnRyYVByZWQpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGF2YWlsYWJsZUEsIGF2YWlsYWJsZUIsIGF2YWlsYWJsZUQ7Ci0gICAgT01YUmVzdWx0IG9teFJlczsKLQotLyogQ29kZSAqLwotICAgIEFTU0VSVChwTWIpOwotICAgIEFTU0VSVChkYXRhKTsKLSAgICBBU1NFUlQocHRyKTsKLSAgICBBU1NFUlQoaDI2NGJzZFByZWRNb2RlSW50cmExNngxNihwTWItPm1iVHlwZSkgPCA0KTsKLQotICAgIGF2YWlsYWJsZUEgPSBoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBwTWItPm1iQSk7Ci0gICAgaWYgKGF2YWlsYWJsZUEgJiYgY29uc3RyYWluZWRJbnRyYVByZWQgJiYKLSAgICAgICAoaDI2NGJzZE1iUGFydFByZWRNb2RlKHBNYi0+bWJBLT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUikpCi0gICAgICAgIGF2YWlsYWJsZUEgPSBIQU5UUk9fRkFMU0U7Ci0gICAgYXZhaWxhYmxlQiA9IGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIHBNYi0+bWJCKTsKLSAgICBpZiAoYXZhaWxhYmxlQiAmJiBjb25zdHJhaW5lZEludHJhUHJlZCAmJgotICAgICAgIChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUocE1iLT5tYkItPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKSkKLSAgICAgICAgYXZhaWxhYmxlQiA9IEhBTlRST19GQUxTRTsKLSAgICBhdmFpbGFibGVEID0gaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgcE1iLT5tYkQpOwotICAgIGlmIChhdmFpbGFibGVEICYmIGNvbnN0cmFpbmVkSW50cmFQcmVkICYmCi0gICAgICAgKGgyNjRic2RNYlBhcnRQcmVkTW9kZShwTWItPm1iRC0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpKQotICAgICAgICBhdmFpbGFibGVEID0gSEFOVFJPX0ZBTFNFOwotCi0gICAgb214UmVzID0gb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYoIChwdHItMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHRyIC0gd2lkdGgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB0ciAtIHdpZHRoLTEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpMzIpd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhWQ000UDEwSW50cmExNngxNlByZWRNb2RlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZFByZWRNb2RlSW50cmExNngxNihwTWItPm1iVHlwZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaTMyKShhdmFpbGFibGVCICsgKGF2YWlsYWJsZUE8PDEpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXZhaWxhYmxlRDw8NSkpICk7Ci0gICAgaWYgKG9teFJlcyAhPSBPTVhfU3RzX05vRXJyKQotICAgICAgICByZXR1cm4gSEFOVFJPX05PSzsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybihIQU5UUk9fT0spOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RJbnRyYTR4NFByZWRpY3Rpb24KLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFBlcmZvcm0gaW50cmEgNHg0IHByZWRpY3Rpb24gZm9yIGx1bWEgcGl4ZWxzIGFuZCBhZGQgcmVzaWR1YWwKLSAgICAgICAgICBpbnRvIHByZWRpY3Rpb24uIFRoZSByZXN1bHRpbmcgbHVtYSBwaXhlbHMgYXJlIHN0b3JlZCBpbgotICAgICAgICAgIG1hY3JvYmxvY2sgYXJyYXkgJ2RhdGEnLiBUaGUgaW50cmEgNHg0IHByZWRpY3Rpb24gbW9kZSBmb3IgZWFjaAotICAgICAgICAgIGJsb2NrIGlzIHN0b3JlZCBpbiAncE1iJyBzdHJ1Y3R1cmUuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi11MzIgaDI2NGJzZEludHJhNHg0UHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCB1OCAqZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2tMYXllcl90ICptYkxheWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggKnB0ciwgdTMyIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyIGNvbnN0cmFpbmVkSW50cmFQcmVkLCB1MzIgYmxvY2spCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotICAgIHUzMiBtb2RlOwotICAgIG5laWdoYm91cl90IG5laWdoYm91ciwgbmVpZ2hib3VyQjsKLSAgICBtYlN0b3JhZ2VfdCAqbk1iLCAqbk1iMjsKLSAgICB1MzIgYXZhaWxhYmxlQSwgYXZhaWxhYmxlQiwgYXZhaWxhYmxlQywgYXZhaWxhYmxlRDsKLQotICAgIE9NWFJlc3VsdCBvbXhSZXM7Ci0gICAgdTMyIHgsIHk7Ci0gICAgdTggKmwsICphLCAqYWw7Ci0vKiBDb2RlICovCi0gICAgQVNTRVJUKHBNYik7Ci0gICAgQVNTRVJUKGRhdGEpOwotICAgIEFTU0VSVChtYkxheWVyKTsKLSAgICBBU1NFUlQocHRyKTsKLSAgICBBU1NFUlQocE1iLT5pbnRyYTR4NFByZWRNb2RlW2Jsb2NrXSA8IDkpOwotCi0gICAgbmVpZ2hib3VyID0gKmgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0EoYmxvY2spOwotICAgIG5NYiA9IGgyNjRic2RHZXROZWlnaGJvdXJNYihwTWIsIG5laWdoYm91ci5tYik7Ci0gICAgYXZhaWxhYmxlQSA9IGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIG5NYik7Ci0gICAgaWYgKGF2YWlsYWJsZUEgJiYgY29uc3RyYWluZWRJbnRyYVByZWQgJiYKLSAgICAgICAoIGgyNjRic2RNYlBhcnRQcmVkTW9kZShuTWItPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKSApCi0gICAgewotICAgICAgICBhdmFpbGFibGVBID0gSEFOVFJPX0ZBTFNFOwotICAgIH0KLQotICAgIG5laWdoYm91ckIgPSAqaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrQihibG9jayk7Ci0gICAgbk1iMiA9IGgyNjRic2RHZXROZWlnaGJvdXJNYihwTWIsIG5laWdoYm91ckIubWIpOwotICAgIGF2YWlsYWJsZUIgPSBoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBuTWIyKTsKLSAgICBpZiAoYXZhaWxhYmxlQiAmJiBjb25zdHJhaW5lZEludHJhUHJlZCAmJgotICAgICAgICggaDI2NGJzZE1iUGFydFByZWRNb2RlKG5NYjItPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKSApCi0gICAgewotICAgICAgICBhdmFpbGFibGVCID0gSEFOVFJPX0ZBTFNFOwotICAgIH0KLQotICAgIG1vZGUgPSBEZXRlcm1pbmVJbnRyYTR4NFByZWRNb2RlKG1iTGF5ZXIsCi0gICAgICAgICh1MzIpKGF2YWlsYWJsZUEgJiYgYXZhaWxhYmxlQiksCi0gICAgICAgICZuZWlnaGJvdXIsICZuZWlnaGJvdXJCLCBibG9jaywgbk1iLCBuTWIyKTsKLSAgICBwTWItPmludHJhNHg0UHJlZE1vZGVbYmxvY2tdID0gKHU4KW1vZGU7Ci0KLSAgICBuZWlnaGJvdXIgPSAqaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrQyhibG9jayk7Ci0gICAgbk1iID0gaDI2NGJzZEdldE5laWdoYm91ck1iKHBNYiwgbmVpZ2hib3VyLm1iKTsKLSAgICBhdmFpbGFibGVDID0gaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgbk1iKTsKLSAgICBpZiAoYXZhaWxhYmxlQyAmJiBjb25zdHJhaW5lZEludHJhUHJlZCAmJgotICAgICAgICggaDI2NGJzZE1iUGFydFByZWRNb2RlKG5NYi0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpICkKLSAgICB7Ci0gICAgICAgIGF2YWlsYWJsZUMgPSBIQU5UUk9fRkFMU0U7Ci0gICAgfQotCi0gICAgbmVpZ2hib3VyID0gKmgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0QoYmxvY2spOwotICAgIG5NYiA9IGgyNjRic2RHZXROZWlnaGJvdXJNYihwTWIsIG5laWdoYm91ci5tYik7Ci0gICAgYXZhaWxhYmxlRCA9IGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIG5NYik7Ci0gICAgaWYgKGF2YWlsYWJsZUQgJiYgY29uc3RyYWluZWRJbnRyYVByZWQgJiYKLSAgICAgICAoIGgyNjRic2RNYlBhcnRQcmVkTW9kZShuTWItPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKSApCi0gICAgewotICAgICAgICBhdmFpbGFibGVEID0gSEFOVFJPX0ZBTFNFOwotICAgIH0KLQotICAgIHggPSBoMjY0YnNkQmxvY2tYW2Jsb2NrXTsKLSAgICB5ID0gaDI2NGJzZEJsb2NrWVtibG9ja107Ci0KLSAgICBpZiAoeSA9PSAwKQotICAgICAgICBhID0gcHRyIC0gd2lkdGggKyB4OwotICAgIGVsc2UKLSAgICAgICAgYSA9IGRhdGEtMTY7Ci0KLSAgICBpZiAoeCA9PSAwKQotICAgICAgICBsID0gcHRyICsgeSAqIHdpZHRoIC0xOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGwgPSBkYXRhLTE7Ci0gICAgICAgIHdpZHRoID0gMTY7Ci0gICAgfQotCi0gICAgaWYgKHggPT0gMCkKLSAgICAgICAgYWwgPSBsLXdpZHRoOwotICAgIGVsc2UKLSAgICAgICAgYWwgPSBhLTE7Ci0KLSAgICBvbXhSZXMgPSBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQoIGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkzMil3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWFZDTTRQMTBJbnRyYTR4NFByZWRNb2RlKW1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaTMyKShhdmFpbGFibGVCICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdmFpbGFibGVBPDwxKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXZhaWxhYmxlRDw8NSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF2YWlsYWJsZUM8PDYpKSApOwotICAgIGlmIChvbXhSZXMgIT0gT01YX1N0c19Ob0VycikKLSAgICAgICAgcmV0dXJuIEhBTlRST19OT0s7Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RJbnRyYUNocm9tYVByZWRpY3Rpb24KLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFBlcmZvcm0gaW50cmEgcHJlZGljdGlvbiBmb3IgY2hyb21hIHBpeGVscyBhbmQgYWRkIHJlc2lkdWFsCi0gICAgICAgICAgaW50byBwcmVkaWN0aW9uLiBUaGUgcmVzdWx0aW5nIGNocm9tYSBwaXhlbHMgYXJlIHN0b3JlZCBpbiAnZGF0YScuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi11MzIgaDI2NGJzZEludHJhQ2hyb21hUHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCB1OCAqZGF0YSwgaW1hZ2VfdCAqaW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyIHByZWRNb2RlLCB1MzIgY29uc3RyYWluZWRJbnRyYVByZWQpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGF2YWlsYWJsZUEsIGF2YWlsYWJsZUIsIGF2YWlsYWJsZUQ7Ci0gICAgT01YUmVzdWx0IG9teFJlczsKLSAgICB1OCAqcHRyOwotICAgIHUzMiB3aWR0aDsKLQotLyogQ29kZSAqLwotICAgIEFTU0VSVChwTWIpOwotICAgIEFTU0VSVChkYXRhKTsKLSAgICBBU1NFUlQoaW1hZ2UpOwotICAgIEFTU0VSVChwcmVkTW9kZSA8IDQpOwotCi0gICAgYXZhaWxhYmxlQSA9IGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIHBNYi0+bWJBKTsKLSAgICBpZiAoYXZhaWxhYmxlQSAmJiBjb25zdHJhaW5lZEludHJhUHJlZCAmJgotICAgICAgIChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUocE1iLT5tYkEtPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKSkKLSAgICAgICAgYXZhaWxhYmxlQSA9IEhBTlRST19GQUxTRTsKLSAgICBhdmFpbGFibGVCID0gaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgcE1iLT5tYkIpOwotICAgIGlmIChhdmFpbGFibGVCICYmIGNvbnN0cmFpbmVkSW50cmFQcmVkICYmCi0gICAgICAgKGgyNjRic2RNYlBhcnRQcmVkTW9kZShwTWItPm1iQi0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpKQotICAgICAgICBhdmFpbGFibGVCID0gSEFOVFJPX0ZBTFNFOwotICAgIGF2YWlsYWJsZUQgPSBoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBwTWItPm1iRCk7Ci0gICAgaWYgKGF2YWlsYWJsZUQgJiYgY29uc3RyYWluZWRJbnRyYVByZWQgJiYKLSAgICAgICAoaDI2NGJzZE1iUGFydFByZWRNb2RlKHBNYi0+bWJELT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUikpCi0gICAgICAgIGF2YWlsYWJsZUQgPSBIQU5UUk9fRkFMU0U7Ci0KLSAgICBwdHIgPSBpbWFnZS0+Y2I7Ci0gICAgd2lkdGggPSBpbWFnZS0+d2lkdGgqODsKLQotICAgIG9teFJlcyA9IG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCggKHB0ci0xKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdHIgLSB3aWR0aCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHRyIC0gd2lkdGggLTEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpMzIpd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWFZDTTRQMTBJbnRyYUNocm9tYVByZWRNb2RlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZE1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaTMyKShhdmFpbGFibGVCICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXZhaWxhYmxlQTw8MSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdmFpbGFibGVEPDw1KSkgKTsKLSAgICBpZiAob214UmVzICE9IE9NWF9TdHNfTm9FcnIpCi0gICAgICAgIHJldHVybiBIQU5UUk9fTk9LOwotCi0gICAgLyogYWR2YW5jZSBwb2ludGVycyAqLwotICAgIGRhdGEgKz0gNjQ7Ci0gICAgcHRyID0gaW1hZ2UtPmNyOwotCi0gICAgb214UmVzID0gb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4KCAocHRyLTEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB0ciAtIHdpZHRoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdHIgLSB3aWR0aCAtMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkzMil3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YVkNNNFAxMEludHJhQ2hyb21hUHJlZE1vZGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkTW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpMzIpKGF2YWlsYWJsZUIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdmFpbGFibGVBPDwxKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF2YWlsYWJsZUQ8PDUpKSApOwotICAgIGlmIChvbXhSZXMgIT0gT01YX1N0c19Ob0VycikKLSAgICAgICAgcmV0dXJuIEhBTlRST19OT0s7Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0KLSNlbHNlIC8qIEgyNjRERUNfT01YREwgKi8KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RJbnRyYVByZWRpY3Rpb24KLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFByb2Nlc3NlcyBvbmUgaW50cmEgbWFjcm9ibG9jay4gUGVyZm9ybXMgaW50cmEgcHJlZGljdGlvbiB1c2luZwotICAgICAgICAgIHNwZWNpZmllZCBwcmVkaWN0aW9uIG1vZGUuIFdyaXRlcyB0aGUgZmluYWwgbWFjcm9ibG9jawotICAgICAgICAgIChwcmVkaWN0aW9uICsgcmVzaWR1YWwpIGludG8gdGhlIG91dHB1dCBpbWFnZSAoaW1hZ2UpCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgIHBNYiAgICAgICAgICAgcG9pbnRlciB0byBtYWNyb2Jsb2NrIHNwZWNpZmljIGluZm9ybWF0aW9uCi0gICAgICAgICAgbWJMYXllciAgICAgICBwb2ludGVyIHRvIGN1cnJlbnQgbWFjcm9ibG9jayBkYXRhIGZyb20gc3RyZWFtCi0gICAgICAgICAgaW1hZ2UgICAgICAgICBwb2ludGVyIHRvIG91dHB1dCBpbWFnZQotICAgICAgICAgIG1iTnVtICAgICAgICAgY3VycmVudCBtYWNyb2Jsb2NrIG51bWJlcgotICAgICAgICAgIGNvbnN0cmFpbmVkSW50cmFQcmVkICBmbGFnIHNwZWNpZnlpbmcgaWYgbmVpZ2hib3VyaW5nIGludGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2tzIGFyZSB1c2VkIGluIGludHJhIHByZWRpY3Rpb24KLSAgICAgICAgICBkYXRhICAgICAgICAgIHBvaW50ZXIgd2hlcmUgb3V0cHV0IG1hY3JvYmxvY2sgd2lsbCBiZSBzdG9yZWQKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgIHBNYiAgICAgICAgICAgc3RydWN0dXJlIGlzIHVwZGF0ZWQgd2l0aCBjdXJyZW50IG1hY3JvYmxvY2sKLSAgICAgICAgICBpbWFnZSAgICAgICAgIGN1cnJlbnQgbWFjcm9ibG9jayBpcyB3cml0dGVuIGludG8gaW1hZ2UKLSAgICAgICAgICBkYXRhICAgICAgICAgIGN1cnJlbnQgbWFjcm9ibG9jayBpcyBzdG9yZWQgaGVyZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgSEFOVFJPX09LICAgICBzdWNjZXNzCi0gICAgICAgICAgSEFOVFJPX05PSyAgICBlcnJvciBpbiBpbnRyYSBwcmVkaWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi11MzIgaDI2NGJzZEludHJhUHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCBtYWNyb2Jsb2NrTGF5ZXJfdCAqbWJMYXllciwKLSAgICBpbWFnZV90ICppbWFnZSwgdTMyIG1iTnVtLCB1MzIgY29uc3RyYWluZWRJbnRyYVByZWQsIHU4ICpkYXRhKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIC8qIHBlbEFib3ZlIGFuZCBwZWxMZWZ0IGNvbnRhaW4gc2FtcGxlcyBhYm92ZSBhbmQgbGVmdCB0byB0aGUgY3VycmVudAotICAgICAqIG1hY3JvYmxvY2suIEFib3ZlIGFycmF5IGNvbnRhaW5zIGFsc28gc2FtcGxlIGFib3ZlLWxlZnQgdG8gdGhlIGN1cnJlbnQKLSAgICAgKiBtYiBhcyB3ZWxsIGFzIDQgc2FtcGxlcyBhYm92ZS1yaWdodCB0byB0aGUgY3VycmVudCBtYiAobGF0dGVyIG9ubHkgZm9yCi0gICAgICogbHVtYSkgKi8KLSAgICAvKiBsdW1EICsgbHVtQiArIGx1bUMgKyBjYkQgKyBjYkIgKyBjckQgKyBjckIgKi8KLSAgICB1OCBwZWxBYm92ZVsxICsgMTYgKyA0ICsgMSArIDggKyAxICsgOF07Ci0gICAgLyogbHVtQSArIGNiQSArIGNyQSAqLwotICAgIHU4IHBlbExlZnRbMTYgKyA4ICsgOF07Ci0gICAgdTMyIHRtcDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBNYik7Ci0gICAgQVNTRVJUKGltYWdlKTsKLSAgICBBU1NFUlQobWJOdW0gPCBpbWFnZS0+d2lkdGggKiBpbWFnZS0+aGVpZ2h0KTsKLSAgICBBU1NFUlQoaDI2NGJzZE1iUGFydFByZWRNb2RlKHBNYi0+bWJUeXBlKSAhPSBQUkVEX01PREVfSU5URVIpOwotCi0gICAgaDI2NGJzZEdldE5laWdoYm91clBlbHMoaW1hZ2UsIHBlbEFib3ZlLCBwZWxMZWZ0LCBtYk51bSk7Ci0KLSAgICBpZiAoaDI2NGJzZE1iUGFydFByZWRNb2RlKHBNYi0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5UUkExNngxNikKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2RJbnRyYTE2eDE2UHJlZGljdGlvbihwTWIsIGRhdGEsIG1iTGF5ZXItPnJlc2lkdWFsLmxldmVsLAotICAgICAgICAgICAgcGVsQWJvdmUsIHBlbExlZnQsIGNvbnN0cmFpbmVkSW50cmFQcmVkKTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdG1wID0gaDI2NGJzZEludHJhNHg0UHJlZGljdGlvbihwTWIsIGRhdGEsIG1iTGF5ZXIsCi0gICAgICAgICAgICBwZWxBYm92ZSwgcGVsTGVmdCwgY29uc3RyYWluZWRJbnRyYVByZWQpOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotICAgIH0KLQotICAgIHRtcCA9IGgyNjRic2RJbnRyYUNocm9tYVByZWRpY3Rpb24ocE1iLCBkYXRhICsgMjU2LAotICAgICAgICAgICAgbWJMYXllci0+cmVzaWR1YWwubGV2ZWwrMTYsIHBlbEFib3ZlICsgMjEsIHBlbExlZnQgKyAxNiwKLSAgICAgICAgICAgIG1iTGF5ZXItPm1iUHJlZC5pbnRyYUNocm9tYVByZWRNb2RlLCBjb25zdHJhaW5lZEludHJhUHJlZCk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotCi0gICAgLyogaWYgZGVjb2RlZCBmbGFnID4gMSAtPiBtYiBoYXMgYWxyZWFkeSBiZWVuIHN1Y2Nlc3NmdWxseSBkZWNvZGVkIGFuZAotICAgICAqIHdyaXR0ZW4gdG8gb3V0cHV0IC0+IGRvIG5vdCB3cml0ZSBhZ2FpbiAqLwotICAgIGlmIChwTWItPmRlY29kZWQgPiAxKQotICAgICAgICByZXR1cm4gSEFOVFJPX09LOwotCi0gICAgaDI2NGJzZFdyaXRlTWFjcm9ibG9jayhpbWFnZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RHZXROZWlnaGJvdXJQZWxzCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBHZXQgcGl4ZWwgdmFsdWVzIGZyb20gbmVpZ2hib3VyaW5nIG1hY3JvYmxvY2tzIGludG8gJ2Fib3ZlJwotICAgICAgICAgIGFuZCAnbGVmdCcgYXJyYXlzLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIGgyNjRic2RHZXROZWlnaGJvdXJQZWxzKGltYWdlX3QgKmltYWdlLCB1OCAqYWJvdmUsIHU4ICpsZWZ0LCB1MzIgbWJOdW0pCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGk7Ci0gICAgdTMyIHdpZHRoLCBwaWNTaXplOwotICAgIHU4ICpwdHIsICp0bXA7Ci0gICAgdTMyIHJvdywgY29sOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoaW1hZ2UpOwotICAgIEFTU0VSVChhYm92ZSk7Ci0gICAgQVNTRVJUKGxlZnQpOwotICAgIEFTU0VSVChtYk51bSA8IGltYWdlLT53aWR0aCAqIGltYWdlLT5oZWlnaHQpOwotCi0gICAgaWYgKCFtYk51bSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgd2lkdGggPSBpbWFnZS0+d2lkdGg7Ci0gICAgcGljU2l6ZSA9IHdpZHRoICogaW1hZ2UtPmhlaWdodDsKLSAgICByb3cgPSBtYk51bSAvIHdpZHRoOwotICAgIGNvbCA9IG1iTnVtIC0gcm93ICogd2lkdGg7Ci0KLSAgICB3aWR0aCAqPSAxNjsKLSAgICBwdHIgPSBpbWFnZS0+ZGF0YSArIHJvdyAqIDE2ICogd2lkdGggICsgY29sICogMTY7Ci0KLSAgICAvKiBub3RlIHRoYXQgbHVtYSBzYW1wbGVzIGFib3ZlLXJpZ2h0IHRvIGN1cnJlbnQgbWFjcm9ibG9jayBkbyBub3QgbWFrZQotICAgICAqIHNlbnNlIHdoZW4gY3VycmVudCBtYiBpcyB0aGUgcmlnaHQtbW9zdCBtYiBpbiBhIHJvdy4gU2FtZSBhcHBsaWVzIHRvCi0gICAgICogc2FtcGxlIGFib3ZlLWxlZnQgaWYgY29sIGlzIHplcm8uIEhvd2V2ZXIsIHVzYWdlIG9mIHBlbHMgaW4gcHJlZGljdGlvbgotICAgICAqIGlzIGNvbnRyb2xsZWQgYnkgbmVpZ2hib3VyIGF2YWlsYWJpbGl0eSBpbmZvcm1hdGlvbiBpbiBhY3R1YWwgcHJlZGljdGlvbgotICAgICAqIHByb2Nlc3MgKi8KLSAgICBpZiAocm93KQotICAgIHsKLSAgICAgICAgdG1wID0gcHRyIC0gKHdpZHRoICsgMSk7Ci0gICAgICAgIGZvciAoaSA9IDIxOyBpLS07KQotICAgICAgICAgICAgKmFib3ZlKysgPSAqdG1wKys7Ci0gICAgfQotCi0gICAgaWYgKGNvbCkKLSAgICB7Ci0gICAgICAgIHB0ci0tOwotICAgICAgICBmb3IgKGkgPSAxNjsgaS0tOyBwdHIrPXdpZHRoKQotICAgICAgICAgICAgKmxlZnQrKyA9ICpwdHI7Ci0gICAgfQotCi0gICAgd2lkdGggPj49IDE7Ci0gICAgcHRyID0gaW1hZ2UtPmRhdGEgKyBwaWNTaXplICogMjU2ICsgcm93ICogOCAqIHdpZHRoICArIGNvbCAqIDg7Ci0KLSAgICBpZiAocm93KQotICAgIHsKLSAgICAgICAgdG1wID0gcHRyIC0gKHdpZHRoICsgMSk7Ci0gICAgICAgIGZvciAoaSA9IDk7IGktLTspCi0gICAgICAgICAgICAqYWJvdmUrKyA9ICp0bXArKzsKLSAgICAgICAgdG1wICs9IChwaWNTaXplICogNjQpIC0gOTsKLSAgICAgICAgZm9yIChpID0gOTsgaS0tOykKLSAgICAgICAgICAgICphYm92ZSsrID0gKnRtcCsrOwotICAgIH0KLQotICAgIGlmIChjb2wpCi0gICAgewotICAgICAgICBwdHItLTsKLSAgICAgICAgZm9yIChpID0gODsgaS0tOyBwdHIrPXdpZHRoKQotICAgICAgICAgICAgKmxlZnQrKyA9ICpwdHI7Ci0gICAgICAgIHB0ciArPSAocGljU2l6ZSAqIDY0KSAtIDggKiB3aWR0aDsKLSAgICAgICAgZm9yIChpID0gODsgaS0tOyBwdHIrPXdpZHRoKQotICAgICAgICAgICAgKmxlZnQrKyA9ICpwdHI7Ci0gICAgfQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEludHJhMTZ4MTZQcmVkaWN0aW9uCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBQZXJmb3JtIGludHJhIDE2eDE2IHByZWRpY3Rpb24gbW9kZSBmb3IgbHVtYSBwaXhlbHMgYW5kIGFkZAotICAgICAgICAgIHJlc2lkdWFsIGludG8gcHJlZGljdGlvbi4gVGhlIHJlc3VsdGluZyBsdW1hIHBpeGVscyBhcmUKLSAgICAgICAgICBzdG9yZWQgaW4gbWFjcm9ibG9jayBhcnJheSAnZGF0YScuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkSW50cmExNngxNlByZWRpY3Rpb24obWJTdG9yYWdlX3QgKnBNYiwgdTggKmRhdGEsIGkzMiByZXNpZHVhbFtdWzE2XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggKmFib3ZlLCB1OCAqbGVmdCwgdTMyIGNvbnN0cmFpbmVkSW50cmFQcmVkKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpOwotICAgIHUzMiBhdmFpbGFibGVBLCBhdmFpbGFibGVCLCBhdmFpbGFibGVEOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoZGF0YSk7Ci0gICAgQVNTRVJUKHJlc2lkdWFsKTsKLSAgICBBU1NFUlQoYWJvdmUpOwotICAgIEFTU0VSVChsZWZ0KTsKLSAgICBBU1NFUlQoaDI2NGJzZFByZWRNb2RlSW50cmExNngxNihwTWItPm1iVHlwZSkgPCA0KTsKLQotICAgIGF2YWlsYWJsZUEgPSBoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBwTWItPm1iQSk7Ci0gICAgaWYgKGF2YWlsYWJsZUEgJiYgY29uc3RyYWluZWRJbnRyYVByZWQgJiYKLSAgICAgICAoaDI2NGJzZE1iUGFydFByZWRNb2RlKHBNYi0+bWJBLT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUikpCi0gICAgICAgIGF2YWlsYWJsZUEgPSBIQU5UUk9fRkFMU0U7Ci0gICAgYXZhaWxhYmxlQiA9IGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIHBNYi0+bWJCKTsKLSAgICBpZiAoYXZhaWxhYmxlQiAmJiBjb25zdHJhaW5lZEludHJhUHJlZCAmJgotICAgICAgIChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUocE1iLT5tYkItPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKSkKLSAgICAgICAgYXZhaWxhYmxlQiA9IEhBTlRST19GQUxTRTsKLSAgICBhdmFpbGFibGVEID0gaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgcE1iLT5tYkQpOwotICAgIGlmIChhdmFpbGFibGVEICYmIGNvbnN0cmFpbmVkSW50cmFQcmVkICYmCi0gICAgICAgKGgyNjRic2RNYlBhcnRQcmVkTW9kZShwTWItPm1iRC0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpKQotICAgICAgICBhdmFpbGFibGVEID0gSEFOVFJPX0ZBTFNFOwotCi0gICAgc3dpdGNoKGgyNjRic2RQcmVkTW9kZUludHJhMTZ4MTYocE1iLT5tYlR5cGUpKQotICAgIHsKLSAgICAgICAgY2FzZSAwOiAvKiBJbnRyYV8xNngxNl9WZXJ0aWNhbCAqLwotICAgICAgICAgICAgaWYgKCFhdmFpbGFibGVCKQotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIEludHJhMTZ4MTZWZXJ0aWNhbFByZWRpY3Rpb24oZGF0YSwgYWJvdmUrMSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDE6IC8qIEludHJhXzE2eDE2X0hvcml6b250YWwgKi8KLSAgICAgICAgICAgIGlmICghYXZhaWxhYmxlQSkKLSAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICBJbnRyYTE2eDE2SG9yaXpvbnRhbFByZWRpY3Rpb24oZGF0YSwgbGVmdCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDI6IC8qIEludHJhXzE2eDE2X0RDICovCi0gICAgICAgICAgICBJbnRyYTE2eDE2RGNQcmVkaWN0aW9uKGRhdGEsIGFib3ZlKzEsIGxlZnQsIGF2YWlsYWJsZUEsIGF2YWlsYWJsZUIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDogLyogY2FzZSAzOiBJbnRyYV8xNngxNl9QbGFuZSAqLwotICAgICAgICAgICAgaWYgKCFhdmFpbGFibGVBIHx8ICFhdmFpbGFibGVCIHx8ICFhdmFpbGFibGVEKQotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIEludHJhMTZ4MTZQbGFuZVByZWRpY3Rpb24oZGF0YSwgYWJvdmUrMSwgbGVmdCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgLyogYWRkIHJlc2lkdWFsICovCi0gICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0gICAgICAgIGgyNjRic2RBZGRSZXNpZHVhbChkYXRhLCByZXNpZHVhbFtpXSwgaSk7Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEludHJhNHg0UHJlZGljdGlvbgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgUGVyZm9ybSBpbnRyYSA0eDQgcHJlZGljdGlvbiBmb3IgbHVtYSBwaXhlbHMgYW5kIGFkZCByZXNpZHVhbAotICAgICAgICAgIGludG8gcHJlZGljdGlvbi4gVGhlIHJlc3VsdGluZyBsdW1hIHBpeGVscyBhcmUgc3RvcmVkIGluCi0gICAgICAgICAgbWFjcm9ibG9jayBhcnJheSAnZGF0YScuIFRoZSBpbnRyYSA0eDQgcHJlZGljdGlvbiBtb2RlIGZvciBlYWNoCi0gICAgICAgICAgYmxvY2sgaXMgc3RvcmVkIGluICdwTWInIHN0cnVjdHVyZS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2RJbnRyYTR4NFByZWRpY3Rpb24obWJTdG9yYWdlX3QgKnBNYiwgdTggKmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrTGF5ZXJfdCAqbWJMYXllciwgdTggKmFib3ZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggKmxlZnQsIHUzMiBjb25zdHJhaW5lZEludHJhUHJlZCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgYmxvY2s7Ci0gICAgdTMyIG1vZGU7Ci0gICAgbmVpZ2hib3VyX3QgbmVpZ2hib3VyLCBuZWlnaGJvdXJCOwotICAgIG1iU3RvcmFnZV90ICpuTWIsICpuTWIyOwotICAgIHU4IGFbMSArIDQgKyA0XSwgbFsxICsgNF07Ci0gICAgdTMyIGRhdGE0eDRbNF07Ci0gICAgdTMyIGF2YWlsYWJsZUEsIGF2YWlsYWJsZUIsIGF2YWlsYWJsZUMsIGF2YWlsYWJsZUQ7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChkYXRhKTsKLSAgICBBU1NFUlQobWJMYXllcik7Ci0gICAgQVNTRVJUKGFib3ZlKTsKLSAgICBBU1NFUlQobGVmdCk7Ci0KLSAgICBmb3IgKGJsb2NrID0gMDsgYmxvY2sgPCAxNjsgYmxvY2srKykKLSAgICB7Ci0KLSAgICAgICAgQVNTRVJUKHBNYi0+aW50cmE0eDRQcmVkTW9kZVtibG9ja10gPCA5KTsKLQotICAgICAgICBuZWlnaGJvdXIgPSAqaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrQShibG9jayk7Ci0gICAgICAgIG5NYiA9IGgyNjRic2RHZXROZWlnaGJvdXJNYihwTWIsIG5laWdoYm91ci5tYik7Ci0gICAgICAgIGF2YWlsYWJsZUEgPSBoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBuTWIpOwotICAgICAgICBpZiAoYXZhaWxhYmxlQSAmJiBjb25zdHJhaW5lZEludHJhUHJlZCAmJgotICAgICAgICAgICAoIGgyNjRic2RNYlBhcnRQcmVkTW9kZShuTWItPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGF2YWlsYWJsZUEgPSBIQU5UUk9fRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICBuZWlnaGJvdXJCID0gKmgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0IoYmxvY2spOwotICAgICAgICBuTWIyID0gaDI2NGJzZEdldE5laWdoYm91ck1iKHBNYiwgbmVpZ2hib3VyQi5tYik7Ci0gICAgICAgIGF2YWlsYWJsZUIgPSBoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBuTWIyKTsKLSAgICAgICAgaWYgKGF2YWlsYWJsZUIgJiYgY29uc3RyYWluZWRJbnRyYVByZWQgJiYKLSAgICAgICAgICAgKCBoMjY0YnNkTWJQYXJ0UHJlZE1vZGUobk1iMi0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpICkKLSAgICAgICAgewotICAgICAgICAgICAgYXZhaWxhYmxlQiA9IEhBTlRST19GQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIG1vZGUgPSBEZXRlcm1pbmVJbnRyYTR4NFByZWRNb2RlKG1iTGF5ZXIsCi0gICAgICAgICAgICAodTMyKShhdmFpbGFibGVBICYmIGF2YWlsYWJsZUIpLAotICAgICAgICAgICAgJm5laWdoYm91ciwgJm5laWdoYm91ckIsIGJsb2NrLCBuTWIsIG5NYjIpOwotICAgICAgICBwTWItPmludHJhNHg0UHJlZE1vZGVbYmxvY2tdID0gKHU4KW1vZGU7Ci0KLSAgICAgICAgbmVpZ2hib3VyID0gKmgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0MoYmxvY2spOwotICAgICAgICBuTWIgPSBoMjY0YnNkR2V0TmVpZ2hib3VyTWIocE1iLCBuZWlnaGJvdXIubWIpOwotICAgICAgICBhdmFpbGFibGVDID0gaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgbk1iKTsKLSAgICAgICAgaWYgKGF2YWlsYWJsZUMgJiYgY29uc3RyYWluZWRJbnRyYVByZWQgJiYKLSAgICAgICAgICAgKCBoMjY0YnNkTWJQYXJ0UHJlZE1vZGUobk1iLT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUikgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhdmFpbGFibGVDID0gSEFOVFJPX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgbmVpZ2hib3VyID0gKmgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0QoYmxvY2spOwotICAgICAgICBuTWIgPSBoMjY0YnNkR2V0TmVpZ2hib3VyTWIocE1iLCBuZWlnaGJvdXIubWIpOwotICAgICAgICBhdmFpbGFibGVEID0gaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgbk1iKTsKLSAgICAgICAgaWYgKGF2YWlsYWJsZUQgJiYgY29uc3RyYWluZWRJbnRyYVByZWQgJiYKLSAgICAgICAgICAgKCBoMjY0YnNkTWJQYXJ0UHJlZE1vZGUobk1iLT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUikgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhdmFpbGFibGVEID0gSEFOVFJPX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgR2V0NHg0TmVpZ2hib3VyUGVscyhhLCBsLCBkYXRhLCBhYm92ZSwgbGVmdCwgYmxvY2spOwotCi0gICAgICAgIHN3aXRjaChtb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIDA6IC8qIEludHJhXzR4NF9WZXJ0aWNhbCAqLwotICAgICAgICAgICAgICAgIGlmICghYXZhaWxhYmxlQikKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgIEludHJhNHg0VmVydGljYWxQcmVkaWN0aW9uKCh1OCopZGF0YTR4NCwgYSArIDEpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxOiAvKiBJbnRyYV80eDRfSG9yaXpvbnRhbCAqLwotICAgICAgICAgICAgICAgIGlmICghYXZhaWxhYmxlQSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgIEludHJhNHg0SG9yaXpvbnRhbFByZWRpY3Rpb24oKHU4KilkYXRhNHg0LCBsICsgMSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDI6IC8qIEludHJhXzR4NF9EQyAqLwotICAgICAgICAgICAgICAgIEludHJhNHg0RGNQcmVkaWN0aW9uKCh1OCopZGF0YTR4NCwgYSArIDEsIGwgKyAxLAotICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVBLCBhdmFpbGFibGVCKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMzogLyogSW50cmFfNHg0X0RpYWdvbmFsX0Rvd25fTGVmdCAqLwotICAgICAgICAgICAgICAgIGlmICghYXZhaWxhYmxlQikKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgIGlmICghYXZhaWxhYmxlQykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFbNV0gPSBhWzZdID0gYVs3XSA9IGFbOF0gPSBhWzRdOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBJbnRyYTR4NERpYWdvbmFsRG93bkxlZnRQcmVkaWN0aW9uKCh1OCopZGF0YTR4NCwgYSArIDEpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSA0OiAvKiBJbnRyYV80eDRfRGlhZ29uYWxfRG93bl9SaWdodCAqLwotICAgICAgICAgICAgICAgIGlmICghYXZhaWxhYmxlQSB8fCAhYXZhaWxhYmxlQiB8fCAhYXZhaWxhYmxlRCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgIEludHJhNHg0RGlhZ29uYWxEb3duUmlnaHRQcmVkaWN0aW9uKCh1OCopZGF0YTR4NCwgYSArIDEsIGwgKyAxKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgNTogLyogSW50cmFfNHg0X1ZlcnRpY2FsX1JpZ2h0ICovCi0gICAgICAgICAgICAgICAgaWYgKCFhdmFpbGFibGVBIHx8ICFhdmFpbGFibGVCIHx8ICFhdmFpbGFibGVEKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgSW50cmE0eDRWZXJ0aWNhbFJpZ2h0UHJlZGljdGlvbigodTgqKWRhdGE0eDQsIGEgKyAxLCBsICsgMSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDY6IC8qIEludHJhXzR4NF9Ib3Jpem9udGFsX0Rvd24gKi8KLSAgICAgICAgICAgICAgICBpZiAoIWF2YWlsYWJsZUEgfHwgIWF2YWlsYWJsZUIgfHwgIWF2YWlsYWJsZUQpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgICAgICBJbnRyYTR4NEhvcml6b250YWxEb3duUHJlZGljdGlvbigodTgqKWRhdGE0eDQsIGEgKyAxLCBsICsgMSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDc6IC8qIEludHJhXzR4NF9WZXJ0aWNhbF9MZWZ0ICovCi0gICAgICAgICAgICAgICAgaWYgKCFhdmFpbGFibGVCKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgaWYgKCFhdmFpbGFibGVDKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYVs1XSA9IGFbNl0gPSBhWzddID0gYVs4XSA9IGFbNF07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEludHJhNHg0VmVydGljYWxMZWZ0UHJlZGljdGlvbigodTgqKWRhdGE0eDQsIGEgKyAxKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6IC8qIGNhc2UgOCBJbnRyYV80eDRfSG9yaXpvbnRhbF9VcCAqLwotICAgICAgICAgICAgICAgIGlmICghYXZhaWxhYmxlQSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgIEludHJhNHg0SG9yaXpvbnRhbFVwUHJlZGljdGlvbigodTgqKWRhdGE0eDQsIGwgKyAxKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIFdyaXRlNHg0VG8xNngxNihkYXRhLCAodTgqKWRhdGE0eDQsIGJsb2NrKTsKLSAgICAgICAgaDI2NGJzZEFkZFJlc2lkdWFsKGRhdGEsIG1iTGF5ZXItPnJlc2lkdWFsLmxldmVsW2Jsb2NrXSwgYmxvY2spOwotICAgIH0KLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogSW50cmFDaHJvbWFQcmVkaWN0aW9uCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBQZXJmb3JtIGludHJhIHByZWRpY3Rpb24gZm9yIGNocm9tYSBwaXhlbHMgYW5kIGFkZCByZXNpZHVhbAotICAgICAgICAgIGludG8gcHJlZGljdGlvbi4gVGhlIHJlc3VsdGluZyBjaHJvbWEgcGl4ZWxzIGFyZSBzdG9yZWQgaW4gJ2RhdGEnLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZEludHJhQ2hyb21hUHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCB1OCAqZGF0YSwgaTMyIHJlc2lkdWFsW11bMTZdLAotICAgICAgICAgICAgICAgICAgICB1OCAqYWJvdmUsIHU4ICpsZWZ0LCB1MzIgcHJlZE1vZGUsIHUzMiBjb25zdHJhaW5lZEludHJhUHJlZCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaSwgY29tcCwgYmxvY2s7Ci0gICAgdTMyIGF2YWlsYWJsZUEsIGF2YWlsYWJsZUIsIGF2YWlsYWJsZUQ7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChkYXRhKTsKLSAgICBBU1NFUlQocmVzaWR1YWwpOwotICAgIEFTU0VSVChhYm92ZSk7Ci0gICAgQVNTRVJUKGxlZnQpOwotICAgIEFTU0VSVChwcmVkTW9kZSA8IDQpOwotCi0gICAgYXZhaWxhYmxlQSA9IGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIHBNYi0+bWJBKTsKLSAgICBpZiAoYXZhaWxhYmxlQSAmJiBjb25zdHJhaW5lZEludHJhUHJlZCAmJgotICAgICAgIChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUocE1iLT5tYkEtPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKSkKLSAgICAgICAgYXZhaWxhYmxlQSA9IEhBTlRST19GQUxTRTsKLSAgICBhdmFpbGFibGVCID0gaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgcE1iLT5tYkIpOwotICAgIGlmIChhdmFpbGFibGVCICYmIGNvbnN0cmFpbmVkSW50cmFQcmVkICYmCi0gICAgICAgKGgyNjRic2RNYlBhcnRQcmVkTW9kZShwTWItPm1iQi0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpKQotICAgICAgICBhdmFpbGFibGVCID0gSEFOVFJPX0ZBTFNFOwotICAgIGF2YWlsYWJsZUQgPSBoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBwTWItPm1iRCk7Ci0gICAgaWYgKGF2YWlsYWJsZUQgJiYgY29uc3RyYWluZWRJbnRyYVByZWQgJiYKLSAgICAgICAoaDI2NGJzZE1iUGFydFByZWRNb2RlKHBNYi0+bWJELT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUikpCi0gICAgICAgIGF2YWlsYWJsZUQgPSBIQU5UUk9fRkFMU0U7Ci0KLSAgICBmb3IgKGNvbXAgPSAwLCBibG9jayA9IDE2OyBjb21wIDwgMjsgY29tcCsrKQotICAgIHsKLSAgICAgICAgc3dpdGNoKHByZWRNb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIDA6IC8qIEludHJhX0Nocm9tYV9EQyAqLwotICAgICAgICAgICAgICAgIEludHJhQ2hyb21hRGNQcmVkaWN0aW9uKGRhdGEsIGFib3ZlKzEsIGxlZnQsIGF2YWlsYWJsZUEsCi0gICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZUIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDE6IC8qIEludHJhX0Nocm9tYV9Ib3Jpem9udGFsICovCi0gICAgICAgICAgICAgICAgaWYgKCFhdmFpbGFibGVBKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgSW50cmFDaHJvbWFIb3Jpem9udGFsUHJlZGljdGlvbihkYXRhLCBsZWZ0KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAyOiAvKiBJbnRyYV9DaHJvbWFfVmVydGljYWwgKi8KLSAgICAgICAgICAgICAgICBpZiAoIWF2YWlsYWJsZUIpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgICAgICBJbnRyYUNocm9tYVZlcnRpY2FsUHJlZGljdGlvbihkYXRhLCBhYm92ZSsxKTsKLQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OiAvKiBjYXNlIDM6IEludHJhX0Nocm9tYV9QbGFuZSAqLwotICAgICAgICAgICAgICAgIGlmICghYXZhaWxhYmxlQSB8fCAhYXZhaWxhYmxlQiB8fCAhYXZhaWxhYmxlRCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgIEludHJhQ2hyb21hUGxhbmVQcmVkaWN0aW9uKGRhdGEsIGFib3ZlKzEsIGxlZnQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyssIGJsb2NrKyspCi0gICAgICAgICAgICBoMjY0YnNkQWRkUmVzaWR1YWwoZGF0YSwgcmVzaWR1YWxbaV0sIGJsb2NrKTsKLQotICAgICAgICAvKiBhZHZhbmNlIHBvaW50ZXJzICovCi0gICAgICAgIGRhdGEgKz0gNjQ7Ci0gICAgICAgIGFib3ZlICs9IDk7Ci0gICAgICAgIGxlZnQgKz0gODsKLSAgICAgICAgcmVzaWR1YWwgKz0gNDsKLSAgICB9Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RBZGRSZXNpZHVhbAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgQWRkIHJlc2lkdWFsIG9mIGEgYmxvY2sgaW50byBwcmVkaWN0aW9uIGluIG1hY3JvYmxvY2sgYXJyYXkgJ2RhdGEnLgotICAgICAgICAgIFRoZSByZXN1bHQgKHJlc2lkdWFsICsgcHJlZGljdGlvbikgaXMgc3RvcmVkIGluICdkYXRhJy4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZm5kZWYgSDI2NERFQ19PTVhETAotdm9pZCBoMjY0YnNkQWRkUmVzaWR1YWwodTggKmRhdGEsIGkzMiAqcmVzaWR1YWwsIHUzMiBibG9ja051bSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaTsKLSAgICB1MzIgeCwgeTsKLSAgICB1MzIgd2lkdGg7Ci0gICAgaTMyIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQ7Ci0gICAgdTggKnRtcDsKLSAgICBjb25zdCB1OCAqY2xwID0gaDI2NGJzZENsaXAgKyA1MTI7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChkYXRhKTsKLSAgICBBU1NFUlQocmVzaWR1YWwpOwotICAgIEFTU0VSVChibG9ja051bSA8IDE2ICsgNCArIDQpOwotCi0gICAgaWYgKElTX1JFU0lEVUFMX0VNUFRZKHJlc2lkdWFsKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgUkFOR0VfQ0hFQ0tfQVJSQVkocmVzaWR1YWwsIC01MTIsIDUxMSwgMTYpOwotCi0gICAgaWYgKGJsb2NrTnVtIDwgMTYpCi0gICAgewotICAgICAgICB3aWR0aCA9IDE2OwotICAgICAgICB4ID0gaDI2NGJzZEJsb2NrWFtibG9ja051bV07Ci0gICAgICAgIHkgPSBoMjY0YnNkQmxvY2tZW2Jsb2NrTnVtXTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgd2lkdGggPSA4OwotICAgICAgICB4ID0gaDI2NGJzZEJsb2NrWFtibG9ja051bSAmIDB4M107Ci0gICAgICAgIHkgPSBoMjY0YnNkQmxvY2tZW2Jsb2NrTnVtICYgMHgzXTsKLSAgICB9Ci0KLSAgICB0bXAgPSBkYXRhICsgeSp3aWR0aCArIHg7Ci0gICAgZm9yIChpID0gNDsgaTsgaS0tKQotICAgIHsKLSAgICAgICAgdG1wMSA9ICpyZXNpZHVhbCsrOwotICAgICAgICB0bXAyID0gdG1wWzBdOwotICAgICAgICB0bXAzID0gKnJlc2lkdWFsKys7Ci0gICAgICAgIHRtcDQgPSB0bXBbMV07Ci0KLSAgICAgICAgdG1wWzBdID0gY2xwW3RtcDEgKyB0bXAyXTsKLQotICAgICAgICB0bXAxID0gKnJlc2lkdWFsKys7Ci0gICAgICAgIHRtcDIgPSB0bXBbMl07Ci0KLSAgICAgICAgdG1wWzFdID0gY2xwW3RtcDMgKyB0bXA0XTsKLQotICAgICAgICB0bXAzID0gKnJlc2lkdWFsKys7Ci0gICAgICAgIHRtcDQgPSB0bXBbM107Ci0KLSAgICAgICAgdG1wMSA9IGNscFt0bXAxICsgdG1wMl07Ci0gICAgICAgIHRtcDMgPSBjbHBbdG1wMyArIHRtcDRdOwotICAgICAgICB0bXBbMl0gPSAodTgpdG1wMTsKLSAgICAgICAgdG1wWzNdID0gKHU4KXRtcDM7Ci0KLSAgICAgICAgdG1wICs9IHdpZHRoOwotICAgIH0KLQotfQotI2VuZGlmCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEludHJhMTZ4MTZWZXJ0aWNhbFByZWRpY3Rpb24KLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFBlcmZvcm0gaW50cmEgMTZ4MTYgdmVydGljYWwgcHJlZGljdGlvbiBtb2RlLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIEludHJhMTZ4MTZWZXJ0aWNhbFByZWRpY3Rpb24odTggKmRhdGEsIHU4ICphYm92ZSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaSwgajsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGRhdGEpOwotICAgIEFTU0VSVChhYm92ZSk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLSAgICB7Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPCAxNjsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgICAqZGF0YSsrID0gYWJvdmVbal07Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBJbnRyYTE2eDE2SG9yaXpvbnRhbFByZWRpY3Rpb24KLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFBlcmZvcm0gaW50cmEgMTZ4MTYgaG9yaXpvbnRhbCBwcmVkaWN0aW9uIG1vZGUuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgSW50cmExNngxNkhvcml6b250YWxQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqbGVmdCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaSwgajsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGRhdGEpOwotICAgIEFTU0VSVChsZWZ0KTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotICAgIHsKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgICpkYXRhKysgPSBsZWZ0W2ldOwotICAgICAgICB9Ci0gICAgfQotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogSW50cmExNngxNkRjUHJlZGljdGlvbgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgUGVyZm9ybSBpbnRyYSAxNngxNiBEQyBwcmVkaWN0aW9uIG1vZGUuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgSW50cmExNngxNkRjUHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlLCB1OCAqbGVmdCwgdTMyIGF2YWlsYWJsZUEsCi0gICAgdTMyIGF2YWlsYWJsZUIpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGksIHRtcDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGRhdGEpOwotICAgIEFTU0VSVChhYm92ZSk7Ci0gICAgQVNTRVJUKGxlZnQpOwotCi0gICAgaWYgKGF2YWlsYWJsZUEgJiYgYXZhaWxhYmxlQikKLSAgICB7Ci0gICAgICAgIGZvciAoaSA9IDAsIHRtcCA9IDA7IGkgPCAxNjsgaSsrKQotICAgICAgICAgICAgdG1wICs9IGFib3ZlW2ldICsgbGVmdFtpXTsKLSAgICAgICAgdG1wID0gKHRtcCArIDE2KSA+PiA1OwotICAgIH0KLSAgICBlbHNlIGlmIChhdmFpbGFibGVBKQotICAgIHsKLSAgICAgICAgZm9yIChpID0gMCwgdG1wID0gMDsgaSA8IDE2OyBpKyspCi0gICAgICAgICAgICB0bXAgKz0gbGVmdFtpXTsKLSAgICAgICAgdG1wID0gKHRtcCArIDgpID4+IDQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKGF2YWlsYWJsZUIpCi0gICAgewotICAgICAgICBmb3IgKGkgPSAwLCB0bXAgPSAwOyBpIDwgMTY7IGkrKykKLSAgICAgICAgICAgIHRtcCArPSBhYm92ZVtpXTsKLSAgICAgICAgdG1wID0gKHRtcCArIDgpID4+IDQ7Ci0gICAgfQotICAgIC8qIG5laXRoZXIgQSBub3IgQiBhdmFpbGFibGUgKi8KLSAgICBlbHNlCi0gICAgewotICAgICAgICB0bXAgPSAxMjg7Ci0gICAgfQotICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKLSAgICAgICAgZGF0YVtpXSA9ICh1OCl0bXA7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBJbnRyYTE2eDE2UGxhbmVQcmVkaWN0aW9uCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBQZXJmb3JtIGludHJhIDE2eDE2IHBsYW5lIHByZWRpY3Rpb24gbW9kZS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBJbnRyYTE2eDE2UGxhbmVQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0KQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIGkzMiBpLCBqOwotICAgIGkzMiBhLCBiLCBjOwotICAgIGkzMiB0bXA7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChkYXRhKTsKLSAgICBBU1NFUlQoYWJvdmUpOwotICAgIEFTU0VSVChsZWZ0KTsKLQotICAgIGEgPSAxNiAqIChhYm92ZVsxNV0gKyBsZWZ0WzE1XSk7Ci0KLSAgICBmb3IgKGkgPSAwLCBiID0gMDsgaSA8IDg7IGkrKykKLSAgICAgICAgYiArPSAoaSArIDEpICogKGFib3ZlWzgraV0gLSBhYm92ZVs2LWldKTsKLSAgICBiID0gKDUgKiBiICsgMzIpID4+IDY7Ci0KLSAgICBmb3IgKGkgPSAwLCBjID0gMDsgaSA8IDc7IGkrKykKLSAgICAgICAgYyArPSAoaSArIDEpICogKGxlZnRbOCtpXSAtIGxlZnRbNi1pXSk7Ci0gICAgLyogcFstMSwtMV0gaGFzIHRvIGJlIGFjY2Vzc2VkIHRocm91Z2ggYWJvdmUgcG9pbnRlciAqLwotICAgIGMgKz0gKGkgKyAxKSAqIChsZWZ0WzgraV0gLSBhYm92ZVstMV0pOwotICAgIGMgPSAoNSAqIGMgKyAzMikgPj4gNjsKLQotICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotICAgIHsKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcCA9IChhICsgYiAqIChqIC0gNykgKyBjICogKGkgLSA3KSArIDE2KSA+PiA1OwotICAgICAgICAgICAgZGF0YVtpKjE2K2pdID0gKHU4KUNMSVAxKHRtcCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBJbnRyYUNocm9tYURjUHJlZGljdGlvbgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgUGVyZm9ybSBpbnRyYSBjaHJvbWEgREMgcHJlZGljdGlvbiBtb2RlLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIEludHJhQ2hyb21hRGNQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0LCB1MzIgYXZhaWxhYmxlQSwKLSAgICB1MzIgYXZhaWxhYmxlQikKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaTsKLSAgICB1MzIgdG1wMSwgdG1wMjsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGRhdGEpOwotICAgIEFTU0VSVChhYm92ZSk7Ci0gICAgQVNTRVJUKGxlZnQpOwotCi0gICAgLyogeSA9IDAuLjMgKi8KLSAgICBpZiAoYXZhaWxhYmxlQSAmJiBhdmFpbGFibGVCKQotICAgIHsKLSAgICAgICAgdG1wMSA9IGFib3ZlWzBdICsgYWJvdmVbMV0gKyBhYm92ZVsyXSArIGFib3ZlWzNdICsKLSAgICAgICAgICAgICAgbGVmdFswXSArIGxlZnRbMV0gKyBsZWZ0WzJdICsgbGVmdFszXTsKLSAgICAgICAgdG1wMSA9ICh0bXAxICsgNCkgPj4gMzsKLSAgICAgICAgdG1wMiA9IChhYm92ZVs0XSArIGFib3ZlWzVdICsgYWJvdmVbNl0gKyBhYm92ZVs3XSArIDIpID4+IDI7Ci0gICAgfQotICAgIGVsc2UgaWYgKGF2YWlsYWJsZUIpCi0gICAgewotICAgICAgICB0bXAxID0gKGFib3ZlWzBdICsgYWJvdmVbMV0gKyBhYm92ZVsyXSArIGFib3ZlWzNdICsgMikgPj4gMjsKLSAgICAgICAgdG1wMiA9IChhYm92ZVs0XSArIGFib3ZlWzVdICsgYWJvdmVbNl0gKyBhYm92ZVs3XSArIDIpID4+IDI7Ci0gICAgfQotICAgIGVsc2UgaWYgKGF2YWlsYWJsZUEpCi0gICAgewotICAgICAgICB0bXAxID0gKGxlZnRbMF0gKyBsZWZ0WzFdICsgbGVmdFsyXSArIGxlZnRbM10gKyAyKSA+PiAyOwotICAgICAgICB0bXAyID0gdG1wMTsKLSAgICB9Ci0gICAgLyogbmVpdGhlciBBIG5vciBCIGF2YWlsYWJsZSAqLwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHRtcDEgPSB0bXAyID0gMTI4OwotICAgIH0KLQotICAgIEFTU0VSVCh0bXAxIDwgMjU2ICYmIHRtcDIgPCAyNTYpOwotICAgIGZvciAoaSA9IDQ7IGktLTspCi0gICAgewotICAgICAgICAqZGF0YSsrID0gKHU4KXRtcDE7Ci0gICAgICAgICpkYXRhKysgPSAodTgpdG1wMTsKLSAgICAgICAgKmRhdGErKyA9ICh1OCl0bXAxOwotICAgICAgICAqZGF0YSsrID0gKHU4KXRtcDE7Ci0gICAgICAgICpkYXRhKysgPSAodTgpdG1wMjsKLSAgICAgICAgKmRhdGErKyA9ICh1OCl0bXAyOwotICAgICAgICAqZGF0YSsrID0gKHU4KXRtcDI7Ci0gICAgICAgICpkYXRhKysgPSAodTgpdG1wMjsKLSAgICB9Ci0KLSAgICAvKiB5ID0gNC4uLjcgKi8KLSAgICBpZiAoYXZhaWxhYmxlQSkKLSAgICB7Ci0gICAgICAgIHRtcDEgPSAobGVmdFs0XSArIGxlZnRbNV0gKyBsZWZ0WzZdICsgbGVmdFs3XSArIDIpID4+IDI7Ci0gICAgICAgIGlmIChhdmFpbGFibGVCKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAyID0gYWJvdmVbNF0gKyBhYm92ZVs1XSArIGFib3ZlWzZdICsgYWJvdmVbN10gKwotICAgICAgICAgICAgICAgICAgIGxlZnRbNF0gKyBsZWZ0WzVdICsgbGVmdFs2XSArIGxlZnRbN107Ci0gICAgICAgICAgICB0bXAyID0gKHRtcDIgKyA0KSA+PiAzOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHRtcDIgPSB0bXAxOwotICAgIH0KLSAgICBlbHNlIGlmIChhdmFpbGFibGVCKQotICAgIHsKLSAgICAgICAgdG1wMSA9IChhYm92ZVswXSArIGFib3ZlWzFdICsgYWJvdmVbMl0gKyBhYm92ZVszXSArIDIpID4+IDI7Ci0gICAgICAgIHRtcDIgPSAoYWJvdmVbNF0gKyBhYm92ZVs1XSArIGFib3ZlWzZdICsgYWJvdmVbN10gKyAyKSA+PiAyOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB0bXAxID0gdG1wMiA9IDEyODsKLSAgICB9Ci0KLSAgICBBU1NFUlQodG1wMSA8IDI1NiAmJiB0bXAyIDwgMjU2KTsKLSAgICBmb3IgKGkgPSA0OyBpLS07KQotICAgIHsKLSAgICAgICAgKmRhdGErKyA9ICh1OCl0bXAxOwotICAgICAgICAqZGF0YSsrID0gKHU4KXRtcDE7Ci0gICAgICAgICpkYXRhKysgPSAodTgpdG1wMTsKLSAgICAgICAgKmRhdGErKyA9ICh1OCl0bXAxOwotICAgICAgICAqZGF0YSsrID0gKHU4KXRtcDI7Ci0gICAgICAgICpkYXRhKysgPSAodTgpdG1wMjsKLSAgICAgICAgKmRhdGErKyA9ICh1OCl0bXAyOwotICAgICAgICAqZGF0YSsrID0gKHU4KXRtcDI7Ci0gICAgfQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEludHJhQ2hyb21hSG9yaXpvbnRhbFByZWRpY3Rpb24KLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFBlcmZvcm0gaW50cmEgY2hyb21hIGhvcml6b250YWwgcHJlZGljdGlvbiBtb2RlLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIEludHJhQ2hyb21hSG9yaXpvbnRhbFByZWRpY3Rpb24odTggKmRhdGEsIHU4ICpsZWZ0KQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoZGF0YSk7Ci0gICAgQVNTRVJUKGxlZnQpOwotCi0gICAgZm9yIChpID0gODsgaS0tOykKLSAgICB7Ci0gICAgICAgICpkYXRhKysgPSAqbGVmdDsKLSAgICAgICAgKmRhdGErKyA9ICpsZWZ0OwotICAgICAgICAqZGF0YSsrID0gKmxlZnQ7Ci0gICAgICAgICpkYXRhKysgPSAqbGVmdDsKLSAgICAgICAgKmRhdGErKyA9ICpsZWZ0OwotICAgICAgICAqZGF0YSsrID0gKmxlZnQ7Ci0gICAgICAgICpkYXRhKysgPSAqbGVmdDsKLSAgICAgICAgKmRhdGErKyA9ICpsZWZ0Kys7Ci0gICAgfQotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogSW50cmFDaHJvbWFWZXJ0aWNhbFByZWRpY3Rpb24KLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFBlcmZvcm0gaW50cmEgY2hyb21hIHZlcnRpY2FsIHByZWRpY3Rpb24gbW9kZS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBJbnRyYUNocm9tYVZlcnRpY2FsUHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoZGF0YSk7Ci0gICAgQVNTRVJUKGFib3ZlKTsKLQotICAgIGZvciAoaSA9IDg7IGktLTtkYXRhKysvKmFib3ZlLT04Ki8pCi0gICAgewotICAgICAgICBkYXRhWzBdID0gKmFib3ZlOwotICAgICAgICBkYXRhWzhdID0gKmFib3ZlOwotICAgICAgICBkYXRhWzE2XSA9ICphYm92ZTsKLSAgICAgICAgZGF0YVsyNF0gPSAqYWJvdmU7Ci0gICAgICAgIGRhdGFbMzJdID0gKmFib3ZlOwotICAgICAgICBkYXRhWzQwXSA9ICphYm92ZTsKLSAgICAgICAgZGF0YVs0OF0gPSAqYWJvdmU7Ci0gICAgICAgIGRhdGFbNTZdID0gKmFib3ZlKys7Ci0gICAgfQotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogSW50cmFDaHJvbWFQbGFuZVByZWRpY3Rpb24KLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFBlcmZvcm0gaW50cmEgY2hyb21hIHBsYW5lIHByZWRpY3Rpb24gbW9kZS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBJbnRyYUNocm9tYVBsYW5lUHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlLCB1OCAqbGVmdCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaTsKLSAgICBpMzIgYSwgYiwgYzsKLSAgICBpMzIgdG1wOwotICAgIGNvbnN0IHU4ICpjbHAgPSBoMjY0YnNkQ2xpcCArIDUxMjsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGRhdGEpOwotICAgIEFTU0VSVChhYm92ZSk7Ci0gICAgQVNTRVJUKGxlZnQpOwotCi0gICAgYSA9IDE2ICogKGFib3ZlWzddICsgbGVmdFs3XSk7Ci0KLSAgICBiID0gKGFib3ZlWzRdIC0gYWJvdmVbMl0pICsgMiAqIChhYm92ZVs1XSAtIGFib3ZlWzFdKQotICAgICAgICArIDMgKiAoYWJvdmVbNl0gLSBhYm92ZVswXSkgKyA0ICogKGFib3ZlWzddIC0gYWJvdmVbLTFdKTsKLSAgICBiID0gKDE3ICogYiArIDE2KSA+PiA1OwotCi0gICAgLyogcFstMSwtMV0gaGFzIHRvIGJlIGFjY2Vzc2VkIHRocm91Z2ggYWJvdmUgcG9pbnRlciAqLwotICAgIGMgPSAobGVmdFs0XSAtIGxlZnRbMl0pICsgMiAqIChsZWZ0WzVdIC0gbGVmdFsxXSkKLSAgICAgICAgKyAzICogKGxlZnRbNl0gLSBsZWZ0WzBdKSArIDQgKiAobGVmdFs3XSAtIGFib3ZlWy0xXSk7Ci0gICAgYyA9ICgxNyAqIGMgKyAxNikgPj4gNTsKLQotICAgIC8qYSArPSAxNjsqLwotICAgIGEgPSBhIC0gMyAqIGMgKyAxNjsKLSAgICBmb3IgKGkgPSA4OyBpLS07IGEgKz0gYykKLSAgICB7Ci0gICAgICAgIHRtcCA9IChhIC0gMyAqIGIpOwotICAgICAgICAqZGF0YSsrID0gY2xwW3RtcD4+NV07Ci0gICAgICAgIHRtcCArPSBiOwotICAgICAgICAqZGF0YSsrID0gY2xwW3RtcD4+NV07Ci0gICAgICAgIHRtcCArPSBiOwotICAgICAgICAqZGF0YSsrID0gY2xwW3RtcD4+NV07Ci0gICAgICAgIHRtcCArPSBiOwotICAgICAgICAqZGF0YSsrID0gY2xwW3RtcD4+NV07Ci0gICAgICAgIHRtcCArPSBiOwotICAgICAgICAqZGF0YSsrID0gY2xwW3RtcD4+NV07Ci0gICAgICAgIHRtcCArPSBiOwotICAgICAgICAqZGF0YSsrID0gY2xwW3RtcD4+NV07Ci0gICAgICAgIHRtcCArPSBiOwotICAgICAgICAqZGF0YSsrID0gY2xwW3RtcD4+NV07Ci0gICAgICAgIHRtcCArPSBiOwotICAgICAgICAqZGF0YSsrID0gY2xwW3RtcD4+NV07Ci0gICAgfQotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogR2V0NHg0TmVpZ2hib3VyUGVscwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgR2V0IG5laWdoYm91cmluZyBwaXhlbHMgb2YgYSA0eDQgYmxvY2sgaW50byAnYScgYW5kICdsJy4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBHZXQ0eDROZWlnaGJvdXJQZWxzKHU4ICphLCB1OCAqbCwgdTggKmRhdGEsIHU4ICphYm92ZSwgdTggKmxlZnQsCi0gICAgdTMyIGJsb2NrTnVtKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB4LCB5OwotICAgIHU4IHQxLCB0MjsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGEpOwotICAgIEFTU0VSVChsKTsKLSAgICBBU1NFUlQoZGF0YSk7Ci0gICAgQVNTRVJUKGFib3ZlKTsKLSAgICBBU1NFUlQobGVmdCk7Ci0gICAgQVNTRVJUKGJsb2NrTnVtIDwgMTYpOwotCi0gICAgeCA9IGgyNjRic2RCbG9ja1hbYmxvY2tOdW1dOwotICAgIHkgPSBoMjY0YnNkQmxvY2tZW2Jsb2NrTnVtXTsKLQotICAgIC8qIEEgYW5kIEQgKi8KLSAgICBpZiAoeCA9PSAwKQotICAgIHsKLSAgICAgICAgdDEgPSBsZWZ0W3kgICAgXTsKLSAgICAgICAgdDIgPSBsZWZ0W3kgKyAxXTsKLSAgICAgICAgbFsxXSA9IHQxOwotICAgICAgICBsWzJdID0gdDI7Ci0gICAgICAgIHQxID0gbGVmdFt5ICsgMl07Ci0gICAgICAgIHQyID0gbGVmdFt5ICsgM107Ci0gICAgICAgIGxbM10gPSB0MTsKLSAgICAgICAgbFs0XSA9IHQyOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB0MSA9IGRhdGFbeSAqIDE2ICsgeCAtIDEgICAgIF07Ci0gICAgICAgIHQyID0gZGF0YVt5ICogMTYgKyB4IC0gMSArIDE2XTsKLSAgICAgICAgbFsxXSA9IHQxOwotICAgICAgICBsWzJdID0gdDI7Ci0gICAgICAgIHQxID0gZGF0YVt5ICogMTYgKyB4IC0gMSArIDMyXTsKLSAgICAgICAgdDIgPSBkYXRhW3kgKiAxNiArIHggLSAxICsgNDhdOwotICAgICAgICBsWzNdID0gdDE7Ci0gICAgICAgIGxbNF0gPSB0MjsKLSAgICB9Ci0KLSAgICAvKiBCLCBDIGFuZCBEICovCi0gICAgaWYgKHkgPT0gMCkKLSAgICB7Ci0gICAgICAgIHQxID0gYWJvdmVbeCAgICBdOwotICAgICAgICB0MiA9IGFib3ZlW3ggICAgXTsKLSAgICAgICAgbFswXSA9IHQxOwotICAgICAgICBhWzBdID0gdDI7Ci0gICAgICAgIHQxID0gYWJvdmVbeCArIDFdOwotICAgICAgICB0MiA9IGFib3ZlW3ggKyAyXTsKLSAgICAgICAgYVsxXSA9IHQxOwotICAgICAgICBhWzJdID0gdDI7Ci0gICAgICAgIHQxID0gYWJvdmVbeCArIDNdOwotICAgICAgICB0MiA9IGFib3ZlW3ggKyA0XTsKLSAgICAgICAgYVszXSA9IHQxOwotICAgICAgICBhWzRdID0gdDI7Ci0gICAgICAgIHQxID0gYWJvdmVbeCArIDVdOwotICAgICAgICB0MiA9IGFib3ZlW3ggKyA2XTsKLSAgICAgICAgYVs1XSA9IHQxOwotICAgICAgICBhWzZdID0gdDI7Ci0gICAgICAgIHQxID0gYWJvdmVbeCArIDddOwotICAgICAgICB0MiA9IGFib3ZlW3ggKyA4XTsKLSAgICAgICAgYVs3XSA9IHQxOwotICAgICAgICBhWzhdID0gdDI7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHQxID0gZGF0YVsoeSAtIDEpICogMTYgKyB4ICAgIF07Ci0gICAgICAgIHQyID0gZGF0YVsoeSAtIDEpICogMTYgKyB4ICsgMV07Ci0gICAgICAgIGFbMV0gPSB0MTsKLSAgICAgICAgYVsyXSA9IHQyOwotICAgICAgICB0MSA9IGRhdGFbKHkgLSAxKSAqIDE2ICsgeCArIDJdOwotICAgICAgICB0MiA9IGRhdGFbKHkgLSAxKSAqIDE2ICsgeCArIDNdOwotICAgICAgICBhWzNdID0gdDE7Ci0gICAgICAgIGFbNF0gPSB0MjsKLSAgICAgICAgdDEgPSBkYXRhWyh5IC0gMSkgKiAxNiArIHggKyA0XTsKLSAgICAgICAgdDIgPSBkYXRhWyh5IC0gMSkgKiAxNiArIHggKyA1XTsKLSAgICAgICAgYVs1XSA9IHQxOwotICAgICAgICBhWzZdID0gdDI7Ci0gICAgICAgIHQxID0gZGF0YVsoeSAtIDEpICogMTYgKyB4ICsgNl07Ci0gICAgICAgIHQyID0gZGF0YVsoeSAtIDEpICogMTYgKyB4ICsgN107Ci0gICAgICAgIGFbN10gPSB0MTsKLSAgICAgICAgYVs4XSA9IHQyOwotCi0gICAgICAgIGlmICh4ID09IDApCi0gICAgICAgICAgICBsWzBdID0gYVswXSA9IGxlZnRbeS0xXTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbFswXSA9IGFbMF0gPSBkYXRhWyh5IC0gMSkgKiAxNiArIHggLSAxXTsKLSAgICB9Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBJbnRyYTR4NFZlcnRpY2FsUHJlZGljdGlvbgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgUGVyZm9ybSBpbnRyYSA0eDQgdmVydGljYWwgcHJlZGljdGlvbiBtb2RlLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIEludHJhNHg0VmVydGljYWxQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTggdDEsIHQyOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoZGF0YSk7Ci0gICAgQVNTRVJUKGFib3ZlKTsKLQotICAgIHQxID0gYWJvdmVbMF07Ci0gICAgdDIgPSBhYm92ZVsxXTsKLSAgICBkYXRhWzBdID0gZGF0YVs0XSA9IGRhdGFbOF0gPSBkYXRhWzEyXSA9IHQxOwotICAgIGRhdGFbMV0gPSBkYXRhWzVdID0gZGF0YVs5XSA9IGRhdGFbMTNdID0gdDI7Ci0gICAgdDEgPSBhYm92ZVsyXTsKLSAgICB0MiA9IGFib3ZlWzNdOwotICAgIGRhdGFbMl0gPSBkYXRhWzZdID0gZGF0YVsxMF0gPSBkYXRhWzE0XSA9IHQxOwotICAgIGRhdGFbM10gPSBkYXRhWzddID0gZGF0YVsxMV0gPSBkYXRhWzE1XSA9IHQyOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogSW50cmE0eDRIb3Jpem9udGFsUHJlZGljdGlvbgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgUGVyZm9ybSBpbnRyYSA0eDQgaG9yaXpvbnRhbCBwcmVkaWN0aW9uIG1vZGUuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgSW50cmE0eDRIb3Jpem9udGFsUHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmxlZnQpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTggdDEsIHQyOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoZGF0YSk7Ci0gICAgQVNTRVJUKGxlZnQpOwotCi0gICAgdDEgPSBsZWZ0WzBdOwotICAgIHQyID0gbGVmdFsxXTsKLSAgICBkYXRhWzBdID0gZGF0YVsxXSA9IGRhdGFbMl0gPSBkYXRhWzNdID0gdDE7Ci0gICAgZGF0YVs0XSA9IGRhdGFbNV0gPSBkYXRhWzZdID0gZGF0YVs3XSA9IHQyOwotICAgIHQxID0gbGVmdFsyXTsKLSAgICB0MiA9IGxlZnRbM107Ci0gICAgZGF0YVs4XSA9IGRhdGFbOV0gPSBkYXRhWzEwXSA9IGRhdGFbMTFdID0gdDE7Ci0gICAgZGF0YVsxMl0gPSBkYXRhWzEzXSA9IGRhdGFbMTRdID0gZGF0YVsxNV0gPSB0MjsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEludHJhNHg0RGNQcmVkaWN0aW9uCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBQZXJmb3JtIGludHJhIDR4NCBEQyBwcmVkaWN0aW9uIG1vZGUuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgSW50cmE0eDREY1ByZWRpY3Rpb24odTggKmRhdGEsIHU4ICphYm92ZSwgdTggKmxlZnQsIHUzMiBhdmFpbGFibGVBLAotICAgIHUzMiBhdmFpbGFibGVCKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB0bXA7Ci0gICAgdTggdDEsIHQyLCB0MywgdDQ7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChkYXRhKTsKLSAgICBBU1NFUlQoYWJvdmUpOwotICAgIEFTU0VSVChsZWZ0KTsKLQotICAgIGlmIChhdmFpbGFibGVBICYmIGF2YWlsYWJsZUIpCi0gICAgewotICAgICAgICB0MSA9IGFib3ZlWzBdOyB0MiA9IGFib3ZlWzFdOyB0MyA9IGFib3ZlWzJdOyB0NCA9IGFib3ZlWzNdOwotICAgICAgICB0bXAgPSB0MSArIHQyICsgdDMgKyB0NDsKLSAgICAgICAgdDEgPSBsZWZ0WzBdOyB0MiA9IGxlZnRbMV07IHQzID0gbGVmdFsyXTsgdDQgPSBsZWZ0WzNdOwotICAgICAgICB0bXAgKz0gdDEgKyB0MiArIHQzICsgdDQ7Ci0gICAgICAgIHRtcCA9ICh0bXAgKyA0KSA+PiAzOwotICAgIH0KLSAgICBlbHNlIGlmIChhdmFpbGFibGVBKQotICAgIHsKLSAgICAgICAgdDEgPSBsZWZ0WzBdOyB0MiA9IGxlZnRbMV07IHQzID0gbGVmdFsyXTsgdDQgPSBsZWZ0WzNdOwotICAgICAgICB0bXAgPSAodDEgKyB0MiArIHQzICsgdDQgKyAyKSA+PiAyOwotICAgIH0KLSAgICBlbHNlIGlmIChhdmFpbGFibGVCKQotICAgIHsKLSAgICAgICAgdDEgPSBhYm92ZVswXTsgdDIgPSBhYm92ZVsxXTsgdDMgPSBhYm92ZVsyXTsgdDQgPSBhYm92ZVszXTsKLSAgICAgICAgdG1wID0gKHQxICsgdDIgKyB0MyArIHQ0ICsgMikgPj4gMjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdG1wID0gMTI4OwotICAgIH0KLQotICAgIEFTU0VSVCh0bXAgPCAyNTYpOwotICAgIGRhdGFbMF0gPSBkYXRhWzFdID0gZGF0YVsyXSA9IGRhdGFbM10gPQotICAgIGRhdGFbNF0gPSBkYXRhWzVdID0gZGF0YVs2XSA9IGRhdGFbN10gPQotICAgIGRhdGFbOF0gPSBkYXRhWzldID0gZGF0YVsxMF0gPSBkYXRhWzExXSA9Ci0gICAgZGF0YVsxMl0gPSBkYXRhWzEzXSA9IGRhdGFbMTRdID0gZGF0YVsxNV0gPSAodTgpdG1wOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogSW50cmE0eDREaWFnb25hbERvd25MZWZ0UHJlZGljdGlvbgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgUGVyZm9ybSBpbnRyYSA0eDQgZGlhZ29uYWwgZG93bi1sZWZ0IHByZWRpY3Rpb24gbW9kZS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBJbnRyYTR4NERpYWdvbmFsRG93bkxlZnRQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoZGF0YSk7Ci0gICAgQVNTRVJUKGFib3ZlKTsKLQotICAgIGRhdGFbIDBdID0gKGFib3ZlWzBdICsgMiAqIGFib3ZlWzFdICsgYWJvdmVbMl0gKyAyKSA+PiAyOwotICAgIGRhdGFbIDFdID0gKGFib3ZlWzFdICsgMiAqIGFib3ZlWzJdICsgYWJvdmVbM10gKyAyKSA+PiAyOwotICAgIGRhdGFbIDRdID0gKGFib3ZlWzFdICsgMiAqIGFib3ZlWzJdICsgYWJvdmVbM10gKyAyKSA+PiAyOwotICAgIGRhdGFbIDJdID0gKGFib3ZlWzJdICsgMiAqIGFib3ZlWzNdICsgYWJvdmVbNF0gKyAyKSA+PiAyOwotICAgIGRhdGFbIDVdID0gKGFib3ZlWzJdICsgMiAqIGFib3ZlWzNdICsgYWJvdmVbNF0gKyAyKSA+PiAyOwotICAgIGRhdGFbIDhdID0gKGFib3ZlWzJdICsgMiAqIGFib3ZlWzNdICsgYWJvdmVbNF0gKyAyKSA+PiAyOwotICAgIGRhdGFbIDNdID0gKGFib3ZlWzNdICsgMiAqIGFib3ZlWzRdICsgYWJvdmVbNV0gKyAyKSA+PiAyOwotICAgIGRhdGFbIDZdID0gKGFib3ZlWzNdICsgMiAqIGFib3ZlWzRdICsgYWJvdmVbNV0gKyAyKSA+PiAyOwotICAgIGRhdGFbIDldID0gKGFib3ZlWzNdICsgMiAqIGFib3ZlWzRdICsgYWJvdmVbNV0gKyAyKSA+PiAyOwotICAgIGRhdGFbMTJdID0gKGFib3ZlWzNdICsgMiAqIGFib3ZlWzRdICsgYWJvdmVbNV0gKyAyKSA+PiAyOwotICAgIGRhdGFbIDddID0gKGFib3ZlWzRdICsgMiAqIGFib3ZlWzVdICsgYWJvdmVbNl0gKyAyKSA+PiAyOwotICAgIGRhdGFbMTBdID0gKGFib3ZlWzRdICsgMiAqIGFib3ZlWzVdICsgYWJvdmVbNl0gKyAyKSA+PiAyOwotICAgIGRhdGFbMTNdID0gKGFib3ZlWzRdICsgMiAqIGFib3ZlWzVdICsgYWJvdmVbNl0gKyAyKSA+PiAyOwotICAgIGRhdGFbMTFdID0gKGFib3ZlWzVdICsgMiAqIGFib3ZlWzZdICsgYWJvdmVbN10gKyAyKSA+PiAyOwotICAgIGRhdGFbMTRdID0gKGFib3ZlWzVdICsgMiAqIGFib3ZlWzZdICsgYWJvdmVbN10gKyAyKSA+PiAyOwotICAgIGRhdGFbMTVdID0gKGFib3ZlWzZdICsgMyAqIGFib3ZlWzddICsgMikgPj4gMjsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEludHJhNHg0RGlhZ29uYWxEb3duUmlnaHRQcmVkaWN0aW9uCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBQZXJmb3JtIGludHJhIDR4NCBkaWFnb25hbCBkb3duLXJpZ2h0IHByZWRpY3Rpb24gbW9kZS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBJbnRyYTR4NERpYWdvbmFsRG93blJpZ2h0UHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlLCB1OCAqbGVmdCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChkYXRhKTsKLSAgICBBU1NFUlQoYWJvdmUpOwotICAgIEFTU0VSVChsZWZ0KTsKLQotICAgIGRhdGFbIDBdID0gKGFib3ZlWzBdICsgMiAqIGFib3ZlWy0xXSArIGxlZnRbMF0gKyAyKSA+PiAyOwotICAgIGRhdGFbIDVdID0gKGFib3ZlWzBdICsgMiAqIGFib3ZlWy0xXSArIGxlZnRbMF0gKyAyKSA+PiAyOwotICAgIGRhdGFbMTBdID0gKGFib3ZlWzBdICsgMiAqIGFib3ZlWy0xXSArIGxlZnRbMF0gKyAyKSA+PiAyOwotICAgIGRhdGFbMTVdID0gKGFib3ZlWzBdICsgMiAqIGFib3ZlWy0xXSArIGxlZnRbMF0gKyAyKSA+PiAyOwotICAgIGRhdGFbIDFdID0gKGFib3ZlWy0xXSArIDIgKiBhYm92ZVswXSArIGFib3ZlWzFdICsgMikgPj4gMjsKLSAgICBkYXRhWyA2XSA9IChhYm92ZVstMV0gKyAyICogYWJvdmVbMF0gKyBhYm92ZVsxXSArIDIpID4+IDI7Ci0gICAgZGF0YVsxMV0gPSAoYWJvdmVbLTFdICsgMiAqIGFib3ZlWzBdICsgYWJvdmVbMV0gKyAyKSA+PiAyOwotICAgIGRhdGFbIDJdID0gKGFib3ZlWzBdICsgMiAqIGFib3ZlWzFdICsgYWJvdmVbMl0gKyAyKSA+PiAyOwotICAgIGRhdGFbIDddID0gKGFib3ZlWzBdICsgMiAqIGFib3ZlWzFdICsgYWJvdmVbMl0gKyAyKSA+PiAyOwotICAgIGRhdGFbIDNdID0gKGFib3ZlWzFdICsgMiAqIGFib3ZlWzJdICsgYWJvdmVbM10gKyAyKSA+PiAyOwotICAgIGRhdGFbIDRdID0gKGxlZnRbLTFdICsgMiAqIGxlZnRbMF0gKyBsZWZ0WzFdICsgMikgPj4gMjsKLSAgICBkYXRhWyA5XSA9IChsZWZ0Wy0xXSArIDIgKiBsZWZ0WzBdICsgbGVmdFsxXSArIDIpID4+IDI7Ci0gICAgZGF0YVsxNF0gPSAobGVmdFstMV0gKyAyICogbGVmdFswXSArIGxlZnRbMV0gKyAyKSA+PiAyOwotICAgIGRhdGFbIDhdID0gKGxlZnRbMF0gKyAyICogbGVmdFsxXSArIGxlZnRbMl0gKyAyKSA+PiAyOwotICAgIGRhdGFbMTNdID0gKGxlZnRbMF0gKyAyICogbGVmdFsxXSArIGxlZnRbMl0gKyAyKSA+PiAyOwotICAgIGRhdGFbMTJdID0gKGxlZnRbMV0gKyAyICogbGVmdFsyXSArIGxlZnRbM10gKyAyKSA+PiAyOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEludHJhNHg0VmVydGljYWxSaWdodFByZWRpY3Rpb24KLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFBlcmZvcm0gaW50cmEgNHg0IHZlcnRpY2FsIHJpZ2h0IHByZWRpY3Rpb24gbW9kZS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBJbnRyYTR4NFZlcnRpY2FsUmlnaHRQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0KQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGRhdGEpOwotICAgIEFTU0VSVChhYm92ZSk7Ci0gICAgQVNTRVJUKGxlZnQpOwotCi0gICAgZGF0YVsgMF0gPSAoYWJvdmVbLTFdICsgYWJvdmVbMF0gKyAxKSA+PiAxOwotICAgIGRhdGFbIDldID0gKGFib3ZlWy0xXSArIGFib3ZlWzBdICsgMSkgPj4gMTsKLSAgICBkYXRhWyA1XSA9IChhYm92ZVstMV0gKyAyICogYWJvdmVbMF0gKyBhYm92ZVsxXSArIDIpID4+IDI7Ci0gICAgZGF0YVsxNF0gPSAoYWJvdmVbLTFdICsgMiAqIGFib3ZlWzBdICsgYWJvdmVbMV0gKyAyKSA+PiAyOwotICAgIGRhdGFbIDRdID0gKGFib3ZlWzBdICsgMiAqIGFib3ZlWy0xXSArIGxlZnRbMF0gKyAyKSA+PiAyOwotICAgIGRhdGFbMTNdID0gKGFib3ZlWzBdICsgMiAqIGFib3ZlWy0xXSArIGxlZnRbMF0gKyAyKSA+PiAyOwotICAgIGRhdGFbIDFdID0gKGFib3ZlWzBdICsgYWJvdmVbMV0gKyAxKSA+PiAxOwotICAgIGRhdGFbMTBdID0gKGFib3ZlWzBdICsgYWJvdmVbMV0gKyAxKSA+PiAxOwotICAgIGRhdGFbIDZdID0gKGFib3ZlWzBdICsgMiAqIGFib3ZlWzFdICsgYWJvdmVbMl0gKyAyKSA+PiAyOwotICAgIGRhdGFbMTVdID0gKGFib3ZlWzBdICsgMiAqIGFib3ZlWzFdICsgYWJvdmVbMl0gKyAyKSA+PiAyOwotICAgIGRhdGFbIDJdID0gKGFib3ZlWzFdICsgYWJvdmVbMl0gKyAxKSA+PiAxOwotICAgIGRhdGFbMTFdID0gKGFib3ZlWzFdICsgYWJvdmVbMl0gKyAxKSA+PiAxOwotICAgIGRhdGFbIDddID0gKGFib3ZlWzFdICsgMiAqIGFib3ZlWzJdICsgYWJvdmVbM10gKyAyKSA+PiAyOwotICAgIGRhdGFbIDNdID0gKGFib3ZlWzJdICsgYWJvdmVbM10gKyAxKSA+PiAxOwotICAgIGRhdGFbIDhdID0gKGxlZnRbMV0gKyAyICogbGVmdFswXSArIGxlZnRbLTFdICsgMikgPj4gMjsKLSAgICBkYXRhWzEyXSA9IChsZWZ0WzJdICsgMiAqIGxlZnRbMV0gKyBsZWZ0WzBdICsgMikgPj4gMjsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEludHJhNHg0SG9yaXpvbnRhbERvd25QcmVkaWN0aW9uCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBQZXJmb3JtIGludHJhIDR4NCBob3Jpem9udGFsIGRvd24gcHJlZGljdGlvbiBtb2RlLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIEludHJhNHg0SG9yaXpvbnRhbERvd25QcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0KQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGRhdGEpOwotICAgIEFTU0VSVChhYm92ZSk7Ci0gICAgQVNTRVJUKGxlZnQpOwotCi0gICAgZGF0YVsgMF0gPSAobGVmdFstMV0gKyBsZWZ0WzBdICsgMSkgPj4gMTsKLSAgICBkYXRhWyA2XSA9IChsZWZ0Wy0xXSArIGxlZnRbMF0gKyAxKSA+PiAxOwotICAgIGRhdGFbIDVdID0gKGxlZnRbLTFdICsgMiAqIGxlZnRbMF0gKyBsZWZ0WzFdICsgMikgPj4gMjsKLSAgICBkYXRhWzExXSA9IChsZWZ0Wy0xXSArIDIgKiBsZWZ0WzBdICsgbGVmdFsxXSArIDIpID4+IDI7Ci0gICAgZGF0YVsgNF0gPSAobGVmdFswXSArIGxlZnRbMV0gKyAxKSA+PiAxOwotICAgIGRhdGFbMTBdID0gKGxlZnRbMF0gKyBsZWZ0WzFdICsgMSkgPj4gMTsKLSAgICBkYXRhWyA5XSA9IChsZWZ0WzBdICsgMiAqIGxlZnRbMV0gKyBsZWZ0WzJdICsgMikgPj4gMjsKLSAgICBkYXRhWzE1XSA9IChsZWZ0WzBdICsgMiAqIGxlZnRbMV0gKyBsZWZ0WzJdICsgMikgPj4gMjsKLSAgICBkYXRhWyA4XSA9IChsZWZ0WzFdICsgbGVmdFsyXSArIDEpID4+IDE7Ci0gICAgZGF0YVsxNF0gPSAobGVmdFsxXSArIGxlZnRbMl0gKyAxKSA+PiAxOwotICAgIGRhdGFbMTNdID0gKGxlZnRbMV0gKyAyICogbGVmdFsyXSArIGxlZnRbM10gKyAyKSA+PiAyOwotICAgIGRhdGFbMTJdID0gKGxlZnRbMl0gKyBsZWZ0WzNdICsgMSkgPj4gMTsKLSAgICBkYXRhWyAxXSA9IChhYm92ZVswXSArIDIgKiBhYm92ZVstMV0gKyBsZWZ0WzBdICsgMikgPj4gMjsKLSAgICBkYXRhWyA3XSA9IChhYm92ZVswXSArIDIgKiBhYm92ZVstMV0gKyBsZWZ0WzBdICsgMikgPj4gMjsKLSAgICBkYXRhWyAyXSA9IChhYm92ZVsxXSArIDIgKiBhYm92ZVswXSArIGFib3ZlWy0xXSArIDIpID4+IDI7Ci0gICAgZGF0YVsgM10gPSAoYWJvdmVbMl0gKyAyICogYWJvdmVbMV0gKyBhYm92ZVswXSArIDIpID4+IDI7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogSW50cmE0eDRWZXJ0aWNhbExlZnRQcmVkaWN0aW9uCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBQZXJmb3JtIGludHJhIDR4NCB2ZXJ0aWNhbCBsZWZ0IHByZWRpY3Rpb24gbW9kZS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBJbnRyYTR4NFZlcnRpY2FsTGVmdFByZWRpY3Rpb24odTggKmRhdGEsIHU4ICphYm92ZSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChkYXRhKTsKLSAgICBBU1NFUlQoYWJvdmUpOwotCi0gICAgZGF0YVsgMF0gPSAoYWJvdmVbMF0gKyBhYm92ZVsxXSArIDEpID4+IDE7Ci0gICAgZGF0YVsgMV0gPSAoYWJvdmVbMV0gKyBhYm92ZVsyXSArIDEpID4+IDE7Ci0gICAgZGF0YVsgMl0gPSAoYWJvdmVbMl0gKyBhYm92ZVszXSArIDEpID4+IDE7Ci0gICAgZGF0YVsgM10gPSAoYWJvdmVbM10gKyBhYm92ZVs0XSArIDEpID4+IDE7Ci0gICAgZGF0YVsgNF0gPSAoYWJvdmVbMF0gKyAyICogYWJvdmVbMV0gKyBhYm92ZVsyXSArIDIpID4+IDI7Ci0gICAgZGF0YVsgNV0gPSAoYWJvdmVbMV0gKyAyICogYWJvdmVbMl0gKyBhYm92ZVszXSArIDIpID4+IDI7Ci0gICAgZGF0YVsgNl0gPSAoYWJvdmVbMl0gKyAyICogYWJvdmVbM10gKyBhYm92ZVs0XSArIDIpID4+IDI7Ci0gICAgZGF0YVsgN10gPSAoYWJvdmVbM10gKyAyICogYWJvdmVbNF0gKyBhYm92ZVs1XSArIDIpID4+IDI7Ci0gICAgZGF0YVsgOF0gPSAoYWJvdmVbMV0gKyBhYm92ZVsyXSArIDEpID4+IDE7Ci0gICAgZGF0YVsgOV0gPSAoYWJvdmVbMl0gKyBhYm92ZVszXSArIDEpID4+IDE7Ci0gICAgZGF0YVsxMF0gPSAoYWJvdmVbM10gKyBhYm92ZVs0XSArIDEpID4+IDE7Ci0gICAgZGF0YVsxMV0gPSAoYWJvdmVbNF0gKyBhYm92ZVs1XSArIDEpID4+IDE7Ci0gICAgZGF0YVsxMl0gPSAoYWJvdmVbMV0gKyAyICogYWJvdmVbMl0gKyBhYm92ZVszXSArIDIpID4+IDI7Ci0gICAgZGF0YVsxM10gPSAoYWJvdmVbMl0gKyAyICogYWJvdmVbM10gKyBhYm92ZVs0XSArIDIpID4+IDI7Ci0gICAgZGF0YVsxNF0gPSAoYWJvdmVbM10gKyAyICogYWJvdmVbNF0gKyBhYm92ZVs1XSArIDIpID4+IDI7Ci0gICAgZGF0YVsxNV0gPSAoYWJvdmVbNF0gKyAyICogYWJvdmVbNV0gKyBhYm92ZVs2XSArIDIpID4+IDI7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBJbnRyYTR4NEhvcml6b250YWxVcFByZWRpY3Rpb24KLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFBlcmZvcm0gaW50cmEgNHg0IGhvcml6b250YWwgdXAgcHJlZGljdGlvbiBtb2RlLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIEludHJhNHg0SG9yaXpvbnRhbFVwUHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmxlZnQpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoZGF0YSk7Ci0gICAgQVNTRVJUKGxlZnQpOwotCi0gICAgZGF0YVsgMF0gPSAobGVmdFswXSArIGxlZnRbMV0gKyAxKSA+PiAxOwotICAgIGRhdGFbIDFdID0gKGxlZnRbMF0gKyAyICogbGVmdFsxXSArIGxlZnRbMl0gKyAyKSA+PiAyOwotICAgIGRhdGFbIDJdID0gKGxlZnRbMV0gKyBsZWZ0WzJdICsgMSkgPj4gMTsKLSAgICBkYXRhWyAzXSA9IChsZWZ0WzFdICsgMiAqIGxlZnRbMl0gKyBsZWZ0WzNdICsgMikgPj4gMjsKLSAgICBkYXRhWyA0XSA9IChsZWZ0WzFdICsgbGVmdFsyXSArIDEpID4+IDE7Ci0gICAgZGF0YVsgNV0gPSAobGVmdFsxXSArIDIgKiBsZWZ0WzJdICsgbGVmdFszXSArIDIpID4+IDI7Ci0gICAgZGF0YVsgNl0gPSAobGVmdFsyXSArIGxlZnRbM10gKyAxKSA+PiAxOwotICAgIGRhdGFbIDddID0gKGxlZnRbMl0gKyAzICogbGVmdFszXSArIDIpID4+IDI7Ci0gICAgZGF0YVsgOF0gPSAobGVmdFsyXSArIGxlZnRbM10gKyAxKSA+PiAxOwotICAgIGRhdGFbIDldID0gKGxlZnRbMl0gKyAzICogbGVmdFszXSArIDIpID4+IDI7Ci0gICAgZGF0YVsxMF0gPSBsZWZ0WzNdOwotICAgIGRhdGFbMTFdID0gbGVmdFszXTsKLSAgICBkYXRhWzEyXSA9IGxlZnRbM107Ci0gICAgZGF0YVsxM10gPSBsZWZ0WzNdOwotICAgIGRhdGFbMTRdID0gbGVmdFszXTsKLSAgICBkYXRhWzE1XSA9IGxlZnRbM107Ci0KLX0KLQotI2VuZGlmIC8qIEgyNjRERUNfT01YREwgKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBXcml0ZTR4NFRvMTZ4MTYKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFdyaXRlIGEgNHg0IGJsb2NrIChkYXRhNHg0KSBpbnRvIGNvcnJlY3QgcG9zaXRpb24KLSAgICAgICAgICBpbiAxNngxNiBtYWNyb2Jsb2NrIChkYXRhKS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBXcml0ZTR4NFRvMTZ4MTYodTggKmRhdGEsIHU4ICpkYXRhNHg0LCB1MzIgYmxvY2tOdW0pCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHgsIHk7Ci0gICAgdTMyICppbjMyLCAqb3V0MzI7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChkYXRhKTsKLSAgICBBU1NFUlQoZGF0YTR4NCk7Ci0gICAgQVNTRVJUKGJsb2NrTnVtIDwgMTYpOwotCi0gICAgeCA9IGgyNjRic2RCbG9ja1hbYmxvY2tOdW1dOwotICAgIHkgPSBoMjY0YnNkQmxvY2tZW2Jsb2NrTnVtXTsKLQotICAgIGRhdGEgKz0geSoxNit4OwotCi0gICAgQVNTRVJUKCgodTMyKWRhdGEmMHgzKSA9PSAwKTsKLQotICAgIC8qbGludCAtLWUoODI2KSAqLwotICAgIG91dDMyID0gKHUzMiAqKWRhdGE7Ci0gICAgLypsaW50IC0tZSg4MjYpICovCi0gICAgaW4zMiA9ICh1MzIgKilkYXRhNHg0OwotCi0gICAgb3V0MzJbMF0gPSAqaW4zMisrOwotICAgIG91dDMyWzRdID0gKmluMzIrKzsKLSAgICBvdXQzMls4XSA9ICppbjMyKys7Ci0gICAgb3V0MzJbMTJdID0gKmluMzIrKzsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBEZXRlcm1pbmVJbnRyYTR4NFByZWRNb2RlCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBSZXR1cm5zIHRoZSBpbnRyYSA0eDQgcHJlZGljdGlvbiBtb2RlIG9mIGEgYmxvY2sgYmFzZWQgb24gdGhlCi0gICAgICAgICAgbmVpZ2hib3VyaW5nIG1hY3JvYmxvY2tzIGFuZCBpbmZvcm1hdGlvbiBwYXJzZWQgZnJvbSBzdHJlYW0uCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBEZXRlcm1pbmVJbnRyYTR4NFByZWRNb2RlKG1hY3JvYmxvY2tMYXllcl90ICpwTWJMYXllciwKLSAgICB1MzIgYXZhaWxhYmxlLCBuZWlnaGJvdXJfdCAqbkEsIG5laWdoYm91cl90ICpuQiwgdTMyIGluZGV4LAotICAgIG1iU3RvcmFnZV90ICpuTWJBLCBtYlN0b3JhZ2VfdCAqbk1iQikKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgbW9kZTEsIG1vZGUyOwotICAgIG1iU3RvcmFnZV90ICpwTWI7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwTWJMYXllcik7Ci0KLSAgICAvKiBkYyBvbmx5IHByZWRpY3Rpb24/ICovCi0gICAgaWYgKCFhdmFpbGFibGUpCi0gICAgICAgIG1vZGUxID0gMjsKLSAgICBlbHNlCi0gICAgewotICAgICAgICBwTWIgPSBuTWJBOwotICAgICAgICBpZiAoaDI2NGJzZE1iUGFydFByZWRNb2RlKHBNYi0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5UUkE0eDQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1vZGUxID0gcE1iLT5pbnRyYTR4NFByZWRNb2RlW25BLT5pbmRleF07Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbW9kZTEgPSAyOwotCi0gICAgICAgIHBNYiA9IG5NYkI7Ci0gICAgICAgIGlmIChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUocE1iLT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRSQTR4NCkKLSAgICAgICAgewotICAgICAgICAgICAgbW9kZTIgPSBwTWItPmludHJhNHg0UHJlZE1vZGVbbkItPmluZGV4XTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBtb2RlMiA9IDI7Ci0KLSAgICAgICAgbW9kZTEgPSBNSU4obW9kZTEsIG1vZGUyKTsKLSAgICB9Ci0KLSAgICBpZiAoIXBNYkxheWVyLT5tYlByZWQucHJldkludHJhNHg0UHJlZE1vZGVGbGFnW2luZGV4XSkKLSAgICB7Ci0gICAgICAgIGlmIChwTWJMYXllci0+bWJQcmVkLnJlbUludHJhNHg0UHJlZE1vZGVbaW5kZXhdIDwgbW9kZTEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1vZGUxID0gcE1iTGF5ZXItPm1iUHJlZC5yZW1JbnRyYTR4NFByZWRNb2RlW2luZGV4XTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1vZGUxID0gcE1iTGF5ZXItPm1iUHJlZC5yZW1JbnRyYTR4NFByZWRNb2RlW2luZGV4XSArIDE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4obW9kZTEpOwotfQotCi0KLS8qbGludCArZTcwMiAqLwotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbnRyYV9wcmVkaWN0aW9uLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfaW50cmFfcHJlZGljdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjUyYmQ1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbnRyYV9wcmVkaWN0aW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotICAgIDMuIERhdGEgdHlwZXMKLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgSDI2NFNXREVDX0lOVFJBX1BSRURJQ1RJT05fSAotI2RlZmluZSBIMjY0U1dERUNfSU5UUkFfUFJFRElDVElPTl9ICi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiYmFzZXR5cGUuaCIKLSNpbmNsdWRlICJoMjY0YnNkX2ltYWdlLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9tYWNyb2Jsb2NrX2xheWVyLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gRGF0YSB0eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmbmRlZiBIMjY0REVDX09NWERMCi11MzIgaDI2NGJzZEludHJhUHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCBtYWNyb2Jsb2NrTGF5ZXJfdCAqbWJMYXllciwKLSAgICBpbWFnZV90ICppbWFnZSwgdTMyIG1iTnVtLCB1MzIgY29uc3RyYWluZWRJbnRyYVByZWQsIHU4ICpkYXRhKTsKLQotdTMyIGgyNjRic2RJbnRyYTR4NFByZWRpY3Rpb24obWJTdG9yYWdlX3QgKnBNYiwgdTggKmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrTGF5ZXJfdCAqbWJMYXllciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4ICphYm92ZSwgdTggKmxlZnQsIHUzMiBjb25zdHJhaW5lZEludHJhUHJlZCk7Ci11MzIgaDI2NGJzZEludHJhMTZ4MTZQcmVkaWN0aW9uKG1iU3RvcmFnZV90ICpwTWIsIHU4ICpkYXRhLCBpMzIgcmVzaWR1YWxbXVsxNl0sCi0gICAgdTggKmFib3ZlLCB1OCAqbGVmdCwgdTMyIGNvbnN0cmFpbmVkSW50cmFQcmVkKTsKLQotdTMyIGgyNjRic2RJbnRyYUNocm9tYVByZWRpY3Rpb24obWJTdG9yYWdlX3QgKnBNYiwgdTggKmRhdGEsIGkzMiByZXNpZHVhbFtdWzE2XSwKLSAgICB1OCAqYWJvdmUsIHU4ICpsZWZ0LCB1MzIgcHJlZE1vZGUsIHUzMiBjb25zdHJhaW5lZEludHJhUHJlZCk7Ci0KLXZvaWQgaDI2NGJzZEdldE5laWdoYm91clBlbHMoaW1hZ2VfdCAqaW1hZ2UsIHU4ICphYm92ZSwgdTggKmxlZnQsIHUzMiBtYk51bSk7Ci0KLSNlbHNlCi0KLXUzMiBoMjY0YnNkSW50cmE0eDRQcmVkaWN0aW9uKG1iU3RvcmFnZV90ICpwTWIsIHU4ICpkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9ja0xheWVyX3QgKm1iTGF5ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCAqcEltYWdlLCB1MzIgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgY29uc3RyYWluZWRJbnRyYVByZWQsIHUzMiBibG9jayk7Ci0KLXUzMiBoMjY0YnNkSW50cmExNngxNlByZWRpY3Rpb24obWJTdG9yYWdlX3QgKnBNYiwgdTggKmRhdGEsIHU4ICpwSW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyIHdpZHRoLCB1MzIgY29uc3RyYWluZWRJbnRyYVByZWQpOwotCi11MzIgaDI2NGJzZEludHJhQ2hyb21hUHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCB1OCAqZGF0YSwgaW1hZ2VfdCAqaW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyIHByZWRNb2RlLCB1MzIgY29uc3RyYWluZWRJbnRyYVByZWQpOwotCi0jZW5kaWYKLQotI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfSU5UUkFfUFJFRElDVElPTl9IICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9tYWNyb2Jsb2NrX2xheWVyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbWFjcm9ibG9ja19sYXllci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjNlN2YwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9tYWNyb2Jsb2NrX2xheWVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQ2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLSAgICAgMy4gTW9kdWxlIGRlZmluZXMKLSAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotICAgICA1LiBGdW5jdGlvbnMKLSAgICAgICAgICBoMjY0YnNkRGVjb2RlTWFjcm9ibG9ja0xheWVyCi0gICAgICAgICAgaDI2NGJzZE1iUGFydFByZWRNb2RlCi0gICAgICAgICAgaDI2NGJzZE51bU1iUGFydAotICAgICAgICAgIGgyNjRic2ROdW1TdWJNYlBhcnQKLSAgICAgICAgICBEZWNvZGVNYlByZWQKLSAgICAgICAgICBEZWNvZGVTdWJNYlByZWQKLSAgICAgICAgICBEZWNvZGVSZXNpZHVhbAotICAgICAgICAgIERldGVybWluZU5jCi0gICAgICAgICAgQ2JwSW50cmExNngxNgotICAgICAgICAgIGgyNjRic2RQcmVkTW9kZUludHJhMTZ4MTYKLSAgICAgICAgICBoMjY0YnNkRGVjb2RlTWFjcm9ibG9jawotICAgICAgICAgIFByb2Nlc3NSZXNpZHVhbAotICAgICAgICAgIGgyNjRic2RTdWJNYlBhcnRNb2RlCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiaDI2NGJzZF9tYWNyb2Jsb2NrX2xheWVyLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9zbGljZV9oZWFkZXIuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3ZsYy5oIgotI2luY2x1ZGUgImgyNjRic2RfY2F2bGMuaCIKLSNpbmNsdWRlICJoMjY0YnNkX25hbF91bml0LmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9uZWlnaGJvdXIuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3RyYW5zZm9ybS5oIgotI2luY2x1ZGUgImgyNjRic2RfaW50cmFfcHJlZGljdGlvbi5oIgotI2luY2x1ZGUgImgyNjRic2RfaW50ZXJfcHJlZGljdGlvbi5oIgotCi0jaWZkZWYgSDI2NERFQ19PTVhETAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotI2VuZGlmIC8qIEgyNjRERUNfT01YREwgKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZmRlZiBIMjY0REVDX09NWERMCi1zdGF0aWMgY29uc3QgdTMyIGNocm9tYUluZGV4WzhdID0geyAyNTYsIDI2MCwgMjg4LCAyOTIsIDMyMCwgMzI0LCAzNTIsIDM1NiB9Owotc3RhdGljIGNvbnN0IHUzMiBsdW1hSW5kZXhbMTZdID0geyAgIDAsICAgNCwgIDY0LCAgNjgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCwgIDEyLCAgNzIsICA3NiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTI4LCAxMzIsIDE5MiwgMTk2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzYsIDE0MCwgMjAwLCAyMDQgfTsKLSNlbmRpZgotLyogbWFwcGluZyBvZiBkYyBjb2VmZmljaWVudHMgYXJyYXkgdG8gbHVtYSBibG9ja3MgKi8KLXN0YXRpYyBjb25zdCB1MzIgZGNDb2VmZkluZGV4WzE2XSA9Ci0gICAgezAsIDEsIDQsIDUsIDIsIDMsIDYsIDcsIDgsIDksIDEyLCAxMywgMTAsIDExLCAxNCwgMTV9OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1MzIgRGVjb2RlTWJQcmVkKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgbWJQcmVkX3QgKnBNYlByZWQsCi0gICAgbWJUeXBlX2UgbWJUeXBlLCB1MzIgbnVtUmVmSWR4QWN0aXZlKTsKLXN0YXRpYyB1MzIgRGVjb2RlU3ViTWJQcmVkKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgc3ViTWJQcmVkX3QgKnBTdWJNYlByZWQsCi0gICAgbWJUeXBlX2UgbWJUeXBlLCB1MzIgbnVtUmVmSWR4QWN0aXZlKTsKLXN0YXRpYyB1MzIgRGVjb2RlUmVzaWR1YWwoc3RybURhdGFfdCAqcFN0cm1EYXRhLCByZXNpZHVhbF90ICpwUmVzaWR1YWwsCi0gICAgbWJTdG9yYWdlX3QgKnBNYiwgbWJUeXBlX2UgbWJUeXBlLCB1MzIgY29kZWRCbG9ja1BhdHRlcm4pOwotCi0jaWZkZWYgSDI2NERFQ19PTVhETAotc3RhdGljIHUzMiBEZXRlcm1pbmVOYyhtYlN0b3JhZ2VfdCAqcE1iLCB1MzIgYmxvY2tJbmRleCwgdTggKnBUb3RhbENvZWZmKTsKLSNlbHNlCi1zdGF0aWMgdTMyIERldGVybWluZU5jKG1iU3RvcmFnZV90ICpwTWIsIHUzMiBibG9ja0luZGV4LCBpMTYgKnBUb3RhbENvZWZmKTsKLSNlbmRpZgotCi1zdGF0aWMgdTMyIENicEludHJhMTZ4MTYobWJUeXBlX2UgbWJUeXBlKTsKLSNpZmRlZiBIMjY0REVDX09NWERMCi1zdGF0aWMgdTMyIFByb2Nlc3NJbnRyYTR4NFJlc2lkdWFsKG1iU3RvcmFnZV90ICpwTWIsIHU4ICpkYXRhLCB1MzIgY29uc3RyYWluZWRJbnRyYVByZWQsCi0gICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2tMYXllcl90ICptYkxheWVyLCBjb25zdCB1OCAqKnBTcmMsIGltYWdlX3QgKmltYWdlKTsKLXN0YXRpYyB1MzIgUHJvY2Vzc0Nocm9tYVJlc2lkdWFsKG1iU3RvcmFnZV90ICpwTWIsIHU4ICpkYXRhLCBjb25zdCB1OCAqKnBTcmMgKTsKLXN0YXRpYyB1MzIgUHJvY2Vzc0ludHJhMTZ4MTZSZXNpZHVhbChtYlN0b3JhZ2VfdCAqcE1iLCB1OCAqZGF0YSwgdTMyIGNvbnN0cmFpbmVkSW50cmFQcmVkLAotICAgICAgICAgICAgICAgICAgICB1MzIgaW50cmFDaHJvbWFQcmVkTW9kZSwgY29uc3QgdTggKipwU3JjLCBpbWFnZV90ICppbWFnZSk7Ci0KLQotI2Vsc2UKLXN0YXRpYyB1MzIgUHJvY2Vzc1Jlc2lkdWFsKG1iU3RvcmFnZV90ICpwTWIsIGkzMiByZXNpZHVhbExldmVsW11bMTZdLCB1MzIgKik7Ci0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uIG5hbWU6IGgyNjRic2REZWNvZGVNYWNyb2Jsb2NrTGF5ZXIKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFBhcnNlIG1hY3JvYmxvY2sgc3BlY2lmaWMgaW5mb3JtYXRpb24gZnJvbSBiaXQgc3RyZWFtLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICBwU3RybURhdGEgICAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQotICAgICAgICAgIHBNYiAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gbWFjcm9ibG9jayBzdG9yYWdlIHN0cnVjdHVyZQotICAgICAgICAgIHNsaWNlVHlwZSAgICAgICAgIHR5cGUgb2YgdGhlIGN1cnJlbnQgc2xpY2UKLSAgICAgICAgICBudW1SZWZJZHhBY3RpdmUgICBtYXhpbXVtIHJlZmVyZW5jZSBpbmRleAotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgcE1iTGF5ZXIgICAgICAgICAgc3RvcmVzIHRoZSBtYWNyb2Jsb2NrIGRhdGEgcGFyc2VkIGZyb20gc3RyZWFtCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICBIQU5UUk9fT0sgICAgICAgICBzdWNjZXNzCi0gICAgICAgICAgSEFOVFJPX05PSyAgICAgICAgZW5kIG9mIHN0cmVhbSBvciBlcnJvciBpbiBzdHJlYW0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2REZWNvZGVNYWNyb2Jsb2NrTGF5ZXIoc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICAgIG1hY3JvYmxvY2tMYXllcl90ICpwTWJMYXllciwgbWJTdG9yYWdlX3QgKnBNYiwgdTMyIHNsaWNlVHlwZSwKLSAgICB1MzIgbnVtUmVmSWR4QWN0aXZlKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB0bXAsIGksIHZhbHVlOwotICAgIGkzMiBpdG1wOwotICAgIG1iUGFydFByZWRNb2RlX2UgcGFydE1vZGU7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVChwTWJMYXllcik7Ci0KLSNpZmRlZiBIMjY0REVDX05FT04KLSAgICBoMjY0YnNkQ2xlYXJNYkxheWVyKHBNYkxheWVyLCAoKHNpemVvZihtYWNyb2Jsb2NrTGF5ZXJfdCkgKyA2MykgJiB+MHgzRikpOwotI2Vsc2UKLSAgICBIMjY0U3dEZWNNZW1zZXQocE1iTGF5ZXIsIDAsIHNpemVvZihtYWNyb2Jsb2NrTGF5ZXJfdCkpOwotI2VuZGlmCi0KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOwotCi0gICAgaWYgKElTX0lfU0xJQ0Uoc2xpY2VUeXBlKSkKLSAgICB7Ci0gICAgICAgIGlmICgodmFsdWUgKyA2KSA+IDMxIHx8IHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIHBNYkxheWVyLT5tYlR5cGUgPSAobWJUeXBlX2UpKHZhbHVlICsgNik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmICgodmFsdWUgKyAxKSA+IDMxIHx8IHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIHBNYkxheWVyLT5tYlR5cGUgPSAobWJUeXBlX2UpKHZhbHVlICsgMSk7Ci0gICAgfQotCi0gICAgaWYgKHBNYkxheWVyLT5tYlR5cGUgPT0gSV9QQ00pCi0gICAgewotICAgICAgICBpMzIgKmxldmVsOwotICAgICAgICB3aGlsZSggIWgyNjRic2RJc0J5dGVBbGlnbmVkKHBTdHJtRGF0YSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBwY21fYWxpZ25tZW50X3plcm9fYml0ICovCi0gICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgICAgICAgICAgaWYgKHRtcCkKLSAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIH0KLQotICAgICAgICBsZXZlbCA9IHBNYkxheWVyLT5yZXNpZHVhbC5sZXZlbFswXTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDM4NDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YWx1ZSA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgOCk7Ci0gICAgICAgICAgICBpZiAodmFsdWUgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAqbGV2ZWwrKyA9IChpMzIpdmFsdWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcGFydE1vZGUgPSBoMjY0YnNkTWJQYXJ0UHJlZE1vZGUocE1iTGF5ZXItPm1iVHlwZSk7Ci0gICAgICAgIGlmICggKHBhcnRNb2RlID09IFBSRURfTU9ERV9JTlRFUikgJiYKLSAgICAgICAgICAgICAoaDI2NGJzZE51bU1iUGFydChwTWJMYXllci0+bWJUeXBlKSA9PSA0KSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcCA9IERlY29kZVN1Yk1iUHJlZChwU3RybURhdGEsICZwTWJMYXllci0+c3ViTWJQcmVkLAotICAgICAgICAgICAgICAgIHBNYkxheWVyLT5tYlR5cGUsIG51bVJlZklkeEFjdGl2ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAgPSBEZWNvZGVNYlByZWQocFN0cm1EYXRhLCAmcE1iTGF5ZXItPm1iUHJlZCwKLSAgICAgICAgICAgICAgICBwTWJMYXllci0+bWJUeXBlLCBudW1SZWZJZHhBY3RpdmUpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICAgICAgaWYgKHBhcnRNb2RlICE9IFBSRURfTU9ERV9JTlRSQTE2eDE2KQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iTWFwcGVkKHBTdHJtRGF0YSwgJnZhbHVlLAotICAgICAgICAgICAgICAgICh1MzIpKHBhcnRNb2RlID09IFBSRURfTU9ERV9JTlRSQTR4NCkpOwotICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgICAgICBwTWJMYXllci0+Y29kZWRCbG9ja1BhdHRlcm4gPSB2YWx1ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBNYkxheWVyLT5jb2RlZEJsb2NrUGF0dGVybiA9IENicEludHJhMTZ4MTYocE1iTGF5ZXItPm1iVHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIHBNYkxheWVyLT5jb2RlZEJsb2NrUGF0dGVybiB8fAotICAgICAgICAgICAgIChwYXJ0TW9kZSA9PSBQUkVEX01PREVfSU5UUkExNngxNikgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHBTdHJtRGF0YSwgJml0bXApOwotICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0sgfHwgKGl0bXAgPCAtMjYpIHx8IChpdG1wID4gMjUpICkKLSAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICBwTWJMYXllci0+bWJRcERlbHRhID0gaXRtcDsKLQotICAgICAgICAgICAgdG1wID0gRGVjb2RlUmVzaWR1YWwocFN0cm1EYXRhLCAmcE1iTGF5ZXItPnJlc2lkdWFsLCBwTWIsCi0gICAgICAgICAgICAgICAgcE1iTGF5ZXItPm1iVHlwZSwgcE1iTGF5ZXItPmNvZGVkQmxvY2tQYXR0ZXJuKTsKLQotICAgICAgICAgICAgcFN0cm1EYXRhLT5zdHJtQnVmZlJlYWRCaXRzID0KLSAgICAgICAgICAgICAgICAodTMyKShwU3RybURhdGEtPnBTdHJtQ3VyclBvcyAtIHBTdHJtRGF0YS0+cFN0cm1CdWZmU3RhcnQpICogOCArCi0gICAgICAgICAgICAgICAgcFN0cm1EYXRhLT5iaXRQb3NJbldvcmQ7Ci0KLSAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkTWJQYXJ0UHJlZE1vZGUKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFJldHVybnMgdGhlIHByZWRpY3Rpb24gbW9kZSBvZiBhIG1hY3JvYmxvY2sgdHlwZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1tYlBhcnRQcmVkTW9kZV9lIGgyNjRic2RNYlBhcnRQcmVkTW9kZShtYlR5cGVfZSBtYlR5cGUpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChtYlR5cGUgPD0gMzEpOwotCi0gICAgaWYgKChtYlR5cGUgPD0gUF84eDhyZWYwKSkKLSAgICAgICAgcmV0dXJuKFBSRURfTU9ERV9JTlRFUik7Ci0gICAgZWxzZSBpZiAobWJUeXBlID09IElfNHg0KQotICAgICAgICByZXR1cm4oUFJFRF9NT0RFX0lOVFJBNHg0KTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybihQUkVEX01PREVfSU5UUkExNngxNik7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkTnVtTWJQYXJ0Ci0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBSZXR1cm5zIHRoZSBhbW91bnQgb2YgbWFjcm9ibG9jayBwYXJ0aXRpb25zIGluIGEgbWFjcm9ibG9jayB0eXBlCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkTnVtTWJQYXJ0KG1iVHlwZV9lIG1iVHlwZSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGgyNjRic2RNYlBhcnRQcmVkTW9kZShtYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUik7Ci0KLSAgICBzd2l0Y2ggKG1iVHlwZSkKLSAgICB7Ci0gICAgICAgIGNhc2UgUF9MMF8xNngxNjoKLSAgICAgICAgY2FzZSBQX1NraXA6Ci0gICAgICAgICAgICByZXR1cm4oMSk7Ci0KLSAgICAgICAgY2FzZSBQX0wwX0wwXzE2eDg6Ci0gICAgICAgIGNhc2UgUF9MMF9MMF84eDE2OgotICAgICAgICAgICAgcmV0dXJuKDIpOwotCi0gICAgICAgIC8qIFBfOHg4IG9yIFBfOHg4cmVmMCAqLwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuKDQpOwotICAgIH0KLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2ROdW1TdWJNYlBhcnQKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFJldHVybnMgdGhlIGFtb3VudCBvZiBzdWItcGFydGl0aW9ucyBpbiBhIHN1Yi1tYWNyb2Jsb2NrIHR5cGUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2ROdW1TdWJNYlBhcnQoc3ViTWJUeXBlX2Ugc3ViTWJUeXBlKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoc3ViTWJUeXBlIDw9IFBfTDBfNHg0KTsKLQotICAgIHN3aXRjaCAoc3ViTWJUeXBlKQotICAgIHsKLSAgICAgICAgY2FzZSBQX0wwXzh4ODoKLSAgICAgICAgICAgIHJldHVybigxKTsKLQotICAgICAgICBjYXNlIFBfTDBfOHg0OgotICAgICAgICBjYXNlIFBfTDBfNHg4OgotICAgICAgICAgICAgcmV0dXJuKDIpOwotCi0gICAgICAgIC8qIFBfTDBfNHg0ICovCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4oNCk7Ci0gICAgfQotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRGVjb2RlTWJQcmVkCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBQYXJzZSBtYWNyb2Jsb2NrIHByZWRpY3Rpb24gaW5mb3JtYXRpb24gZnJvbSBiaXQgc3RyZWFtIGFuZCBzdG9yZQotICAgICAgICAgIGluICdwTWJQcmVkJy4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIERlY29kZU1iUHJlZChzdHJtRGF0YV90ICpwU3RybURhdGEsIG1iUHJlZF90ICpwTWJQcmVkLCBtYlR5cGVfZSBtYlR5cGUsCi0gICAgdTMyIG51bVJlZklkeEFjdGl2ZSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wLCBpLCBqLCB2YWx1ZTsKLSAgICBpMzIgaXRtcDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKHBNYlByZWQpOwotCi0gICAgc3dpdGNoIChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUobWJUeXBlKSkKLSAgICB7Ci0gICAgICAgIGNhc2UgUFJFRF9NT0RFX0lOVEVSOiAvKiBQUkVEX01PREVfSU5URVIgKi8KLSAgICAgICAgICAgIGlmIChudW1SZWZJZHhBY3RpdmUgPiAxKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAoaSA9IGgyNjRic2ROdW1NYlBhcnQobWJUeXBlKSwgaiA9IDA7IGktLTsgIGorKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJUcnVuY2F0ZWQocFN0cm1EYXRhLCAmdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAodTMyKShudW1SZWZJZHhBY3RpdmUgPiAyKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LIHx8IHZhbHVlID49IG51bVJlZklkeEFjdGl2ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgICAgICAgICAgICAgICAgICBwTWJQcmVkLT5yZWZJZHhMMFtqXSA9IHZhbHVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yIChpID0gaDI2NGJzZE51bU1iUGFydChtYlR5cGUpLCBqID0gMDsgaS0tOyAgaisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQocFN0cm1EYXRhLCAmaXRtcCk7Ci0gICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICAgICAgICAgIHBNYlByZWQtPm12ZEwwW2pdLmhvciA9IChpMTYpaXRtcDsKLQotICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQocFN0cm1EYXRhLCAmaXRtcCk7Ci0gICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICAgICAgICAgIHBNYlByZWQtPm12ZEwwW2pdLnZlciA9IChpMTYpaXRtcDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgUFJFRF9NT0RFX0lOVFJBNHg0OgotICAgICAgICAgICAgZm9yIChpdG1wID0gMCwgaSA9IDA7IGl0bXAgPCAyOyBpdG1wKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSBoMjY0YnNkU2hvd0JpdHMzMihwU3RybURhdGEpOwotICAgICAgICAgICAgICAgIHRtcCA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yIChqID0gODsgai0tOyBpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwTWJQcmVkLT5wcmV2SW50cmE0eDRQcmVkTW9kZUZsYWdbaV0gPQotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgJiAweDgwMDAwMDAwID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlIDw8PSAxOwotICAgICAgICAgICAgICAgICAgICBpZiAoIXBNYlByZWQtPnByZXZJbnRyYTR4NFByZWRNb2RlRmxhZ1tpXSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcE1iUHJlZC0+cmVtSW50cmE0eDRQcmVkTW9kZVtpXSA9IHZhbHVlPj4yOTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIDw8PSAzOwotICAgICAgICAgICAgICAgICAgICAgICAgdG1wKys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGgyNjRic2RGbHVzaEJpdHMocFN0cm1EYXRhLCA4ICsgMyp0bXApID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIGZhbGwtdGhyb3VnaCAqLwotCi0gICAgICAgIGNhc2UgUFJFRF9NT0RFX0lOVFJBMTZ4MTY6Ci0gICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOwotICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0sgfHwgdmFsdWUgPiAzKQotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIHBNYlByZWQtPmludHJhQ2hyb21hUHJlZE1vZGUgPSB2YWx1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRGVjb2RlU3ViTWJQcmVkCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBQYXJzZSBzdWItbWFjcm9ibG9jayBwcmVkaWN0aW9uIGluZm9ybWF0aW9uIGZyb20gYml0IHN0cmVhbSBhbmQKLSAgICAgICAgICBzdG9yZSBpbiAncE1iUHJlZCcuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBEZWNvZGVTdWJNYlByZWQoc3RybURhdGFfdCAqcFN0cm1EYXRhLCBzdWJNYlByZWRfdCAqcFN1Yk1iUHJlZCwKLSAgICBtYlR5cGVfZSBtYlR5cGUsIHUzMiBudW1SZWZJZHhBY3RpdmUpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHRtcCwgaSwgaiwgdmFsdWU7Ci0gICAgaTMyIGl0bXA7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVChwU3ViTWJQcmVkKTsKLSAgICBBU1NFUlQoaDI2NGJzZE1iUGFydFByZWRNb2RlKG1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSyB8fCB2YWx1ZSA+IDMpCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIHBTdWJNYlByZWQtPnN1Yk1iVHlwZVtpXSA9IChzdWJNYlR5cGVfZSl2YWx1ZTsKLSAgICB9Ci0KLSAgICBpZiAoIChudW1SZWZJZHhBY3RpdmUgPiAxKSAmJiAobWJUeXBlICE9IFBfOHg4cmVmMCkgKQotICAgIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlRydW5jYXRlZChwU3RybURhdGEsICZ2YWx1ZSwKLSAgICAgICAgICAgICAgICAodTMyKShudW1SZWZJZHhBY3RpdmUgPiAyKSk7Ci0gICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSyB8fCB2YWx1ZSA+PSBudW1SZWZJZHhBY3RpdmUpCi0gICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgcFN1Yk1iUHJlZC0+cmVmSWR4TDBbaV0gPSB2YWx1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgewotICAgICAgICBqID0gMDsKLSAgICAgICAgZm9yICh2YWx1ZSA9IGgyNjRic2ROdW1TdWJNYlBhcnQocFN1Yk1iUHJlZC0+c3ViTWJUeXBlW2ldKTsKLSAgICAgICAgICAgICB2YWx1ZS0tOyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQocFN0cm1EYXRhLCAmaXRtcCk7Ci0gICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgICAgIHBTdWJNYlByZWQtPm12ZEwwW2ldW2pdLmhvciA9IChpMTYpaXRtcDsKLQotICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChwU3RybURhdGEsICZpdG1wKTsKLSAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICAgICAgcFN1Yk1iUHJlZC0+bXZkTDBbaV1bal0udmVyID0gKGkxNilpdG1wOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotI2lmZGVmIEgyNjRERUNfT01YREwKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRGVjb2RlUmVzaWR1YWwKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFBhcnNlIHJlc2lkdWFsIGluZm9ybWF0aW9uIGZyb20gYml0IHN0cmVhbSBhbmQgc3RvcmUgaW4gJ3BSZXNpZHVhbCcuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBEZWNvZGVSZXNpZHVhbChzdHJtRGF0YV90ICpwU3RybURhdGEsIHJlc2lkdWFsX3QgKnBSZXNpZHVhbCwKLSAgICBtYlN0b3JhZ2VfdCAqcE1iLCBtYlR5cGVfZSBtYlR5cGUsIHUzMiBjb2RlZEJsb2NrUGF0dGVybikKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaSwgajsKLSAgICB1MzIgYmxvY2tDb2RlZDsKLSAgICB1MzIgYmxvY2tJbmRleDsKLSAgICB1MzIgaXMxNngxNjsKLSAgICBPTVhfSU5UIG5jOwotICAgIE9NWFJlc3VsdCBvbXhSZXM7Ci0gICAgT01YX1U4ICpwUG9zQ29lZkJ1ZjsKLQotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQocFJlc2lkdWFsKTsKLQotICAgIHBQb3NDb2VmQnVmID0gcFJlc2lkdWFsLT5wb3NDb2VmQnVmOwotCi0gICAgLyogbHVtYSBEQyBpcyBhdCBpbmRleCAyNCAqLwotICAgIGlmIChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUobWJUeXBlKSA9PSBQUkVEX01PREVfSU5UUkExNngxNikKLSAgICB7Ci0gICAgICAgIG5jID0gKE9NWF9JTlQpRGV0ZXJtaW5lTmMocE1iLCAwLCBwUmVzaWR1YWwtPnRvdGFsQ29lZmYpOwotI2lmbmRlZiBIMjY0REVDX05FT04KLSAgICAgICAgb214UmVzID0gIG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMoCi0gICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCAqKikgKCZwU3RybURhdGEtPnBTdHJtQ3VyclBvcyksCi0gICAgICAgICAgICAgICAgKE9NWF9TMzIqKSAoJnBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkKSwKLSAgICAgICAgICAgICAgICAmcFJlc2lkdWFsLT50b3RhbENvZWZmWzI0XSwKLSAgICAgICAgICAgICAgICAmcFBvc0NvZWZCdWYsCi0gICAgICAgICAgICAgICAgbmMsCi0gICAgICAgICAgICAgICAgMTYpOwotI2Vsc2UKLSAgICAgICAgb214UmVzID0gYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIoCi0gICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCAqKikgKCZwU3RybURhdGEtPnBTdHJtQ3VyclBvcyksCi0gICAgICAgICAgICAgICAgKE9NWF9TMzIqKSAoJnBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkKSwKLSAgICAgICAgICAgICAgICAmcFJlc2lkdWFsLT50b3RhbENvZWZmWzI0XSwKLSAgICAgICAgICAgICAgICAmcFBvc0NvZWZCdWYsCi0gICAgICAgICAgICAgICAgbmMsCi0gICAgICAgICAgICAgICAgMTYpOwotI2VuZGlmCi0gICAgICAgIGlmIChvbXhSZXMgIT0gT01YX1N0c19Ob0VycikKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgaXMxNngxNiA9IEhBTlRST19UUlVFOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIGlzMTZ4MTYgPSBIQU5UUk9fRkFMU0U7Ci0KLSAgICBmb3IgKGkgPSA0LCBibG9ja0luZGV4ID0gMDsgaS0tOykKLSAgICB7Ci0gICAgICAgIC8qIGx1bWEgY2JwIGluIGJpdHMgMC0zICovCi0gICAgICAgIGJsb2NrQ29kZWQgPSBjb2RlZEJsb2NrUGF0dGVybiAmIDB4MTsKLSAgICAgICAgY29kZWRCbG9ja1BhdHRlcm4gPj49IDE7Ci0gICAgICAgIGlmIChibG9ja0NvZGVkKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGogPSA0OyBqLS07IGJsb2NrSW5kZXgrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBuYyA9IChPTVhfSU5UKURldGVybWluZU5jKHBNYixibG9ja0luZGV4LHBSZXNpZHVhbC0+dG90YWxDb2VmZik7Ci0gICAgICAgICAgICAgICAgaWYgKGlzMTZ4MTYpCi0gICAgICAgICAgICAgICAgewotI2lmbmRlZiBIMjY0REVDX05FT04KLSAgICAgICAgICAgICAgICAgICAgb214UmVzID0gIG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCAqKikgKCZwU3RybURhdGEtPnBTdHJtQ3VyclBvcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9TMzIqKSAoJnBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFJlc2lkdWFsLT50b3RhbENvZWZmW2Jsb2NrSW5kZXhdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUG9zQ29lZkJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNSk7Ci0jZWxzZQotICAgICAgICAgICAgICAgICAgICBvbXhSZXMgPSAgYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCAqKikgKCZwU3RybURhdGEtPnBTdHJtQ3VyclBvcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9TMzIqKSAoJnBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFJlc2lkdWFsLT50b3RhbENvZWZmW2Jsb2NrSW5kZXhdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUG9zQ29lZkJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNSk7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSNpZm5kZWYgSDI2NERFQ19ORU9OCi0gICAgICAgICAgICAgICAgICAgIG9teFJlcyA9ICBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTggKiopICgmcFN0cm1EYXRhLT5wU3RybUN1cnJQb3MpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfUzMyKikgKCZwU3RybURhdGEtPmJpdFBvc0luV29yZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBSZXNpZHVhbC0+dG90YWxDb2VmZltibG9ja0luZGV4XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFBvc0NvZWZCdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYpOwotI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgb214UmVzID0gYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCAqKikgKCZwU3RybURhdGEtPnBTdHJtQ3VyclBvcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9TMzIqKSAoJnBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFJlc2lkdWFsLT50b3RhbENvZWZmW2Jsb2NrSW5kZXhdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUG9zQ29lZkJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNik7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG9teFJlcyAhPSBPTVhfU3RzX05vRXJyKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgYmxvY2tJbmRleCArPSA0OwotICAgIH0KLQotICAgIC8qIGNocm9tYSBEQyBibG9jayBhcmUgYXQgaW5kaWNlcyAyNSBhbmQgMjYgKi8KLSAgICBibG9ja0NvZGVkID0gY29kZWRCbG9ja1BhdHRlcm4gJiAweDM7Ci0gICAgaWYgKGJsb2NrQ29kZWQpCi0gICAgewotI2lmbmRlZiBIMjY0REVDX05FT04KLSAgICAgICAgb214UmVzID0gIG9teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQygKLSAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4KiopICgmcFN0cm1EYXRhLT5wU3RybUN1cnJQb3MpLAotICAgICAgICAgICAgICAgIChPTVhfUzMyKikgKCZwU3RybURhdGEtPmJpdFBvc0luV29yZCksCi0gICAgICAgICAgICAgICAgJnBSZXNpZHVhbC0+dG90YWxDb2VmZlsyNV0sCi0gICAgICAgICAgICAgICAgJnBQb3NDb2VmQnVmKTsKLSNlbHNlCi0gICAgICAgIG9teFJlcyA9IGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyKAotICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKikgKCZwU3RybURhdGEtPnBTdHJtQ3VyclBvcyksCi0gICAgICAgICAgICAgICAgKE9NWF9TMzIqKSAoJnBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkKSwKLSAgICAgICAgICAgICAgICAmcFJlc2lkdWFsLT50b3RhbENvZWZmWzI1XSwKLSAgICAgICAgICAgICAgICAmcFBvc0NvZWZCdWYsCi0gICAgICAgICAgICAgICAgMTcsCi0gICAgICAgICAgICAgICAgNCk7Ci0jZW5kaWYKLSAgICAgICAgaWYgKG9teFJlcyAhPSBPTVhfU3RzX05vRXJyKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotI2lmbmRlZiBIMjY0REVDX05FT04KLSAgICAgICAgb214UmVzID0gIG9teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQygKLSAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4KiopICgmcFN0cm1EYXRhLT5wU3RybUN1cnJQb3MpLAotICAgICAgICAgICAgICAgIChPTVhfUzMyKikgKCZwU3RybURhdGEtPmJpdFBvc0luV29yZCksCi0gICAgICAgICAgICAgICAgJnBSZXNpZHVhbC0+dG90YWxDb2VmZlsyNl0sCi0gICAgICAgICAgICAgICAgJnBQb3NDb2VmQnVmKTsKLSNlbHNlCi0gICAgICAgIG9teFJlcyA9IGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyKAotICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKikgKCZwU3RybURhdGEtPnBTdHJtQ3VyclBvcyksCi0gICAgICAgICAgICAgICAgKE9NWF9TMzIqKSAoJnBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkKSwKLSAgICAgICAgICAgICAgICAmcFJlc2lkdWFsLT50b3RhbENvZWZmWzI2XSwKLSAgICAgICAgICAgICAgICAmcFBvc0NvZWZCdWYsCi0gICAgICAgICAgICAgICAgMTcsCi0gICAgICAgICAgICAgICAgNCk7Ci0jZW5kaWYKLSAgICAgICAgaWYgKG9teFJlcyAhPSBPTVhfU3RzX05vRXJyKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIH0KLQotICAgIC8qIGNocm9tYSBBQyAqLwotICAgIGJsb2NrQ29kZWQgPSBjb2RlZEJsb2NrUGF0dGVybiAmIDB4MjsKLSAgICBpZiAoYmxvY2tDb2RlZCkKLSAgICB7Ci0gICAgICAgIGZvciAoaSA9IDg7IGktLTtibG9ja0luZGV4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIG5jID0gKE9NWF9JTlQpRGV0ZXJtaW5lTmMocE1iLCBibG9ja0luZGV4LCBwUmVzaWR1YWwtPnRvdGFsQ29lZmYpOwotI2lmbmRlZiBIMjY0REVDX05FT04KLSAgICAgICAgICAgIG9teFJlcyA9ICBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDKAotICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4ICoqKSAoJnBTdHJtRGF0YS0+cFN0cm1DdXJyUG9zKSwKLSAgICAgICAgICAgICAgICAgICAgKE9NWF9TMzIqKSAoJnBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkKSwKLSAgICAgICAgICAgICAgICAgICAgJnBSZXNpZHVhbC0+dG90YWxDb2VmZltibG9ja0luZGV4XSwKLSAgICAgICAgICAgICAgICAgICAgJnBQb3NDb2VmQnVmLAotICAgICAgICAgICAgICAgICAgICBuYywKLSAgICAgICAgICAgICAgICAgICAgMTUpOwotI2Vsc2UKLSAgICAgICAgICAgIG9teFJlcyA9ICBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcigKLSAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCAqKikgKCZwU3RybURhdGEtPnBTdHJtQ3VyclBvcyksCi0gICAgICAgICAgICAgICAgICAgIChPTVhfUzMyKikgKCZwU3RybURhdGEtPmJpdFBvc0luV29yZCksCi0gICAgICAgICAgICAgICAgICAgICZwUmVzaWR1YWwtPnRvdGFsQ29lZmZbYmxvY2tJbmRleF0sCi0gICAgICAgICAgICAgICAgICAgICZwUG9zQ29lZkJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgbmMsCi0gICAgICAgICAgICAgICAgICAgIDE1KTsKLSNlbmRpZgotICAgICAgICAgICAgaWYgKG9teFJlcyAhPSBPTVhfU3RzX05vRXJyKQotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLSNlbHNlCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IERlY29kZVJlc2lkdWFsCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBQYXJzZSByZXNpZHVhbCBpbmZvcm1hdGlvbiBmcm9tIGJpdCBzdHJlYW0gYW5kIHN0b3JlIGluICdwUmVzaWR1YWwnLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgRGVjb2RlUmVzaWR1YWwoc3RybURhdGFfdCAqcFN0cm1EYXRhLCByZXNpZHVhbF90ICpwUmVzaWR1YWwsCi0gICAgbWJTdG9yYWdlX3QgKnBNYiwgbWJUeXBlX2UgbWJUeXBlLCB1MzIgY29kZWRCbG9ja1BhdHRlcm4pCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGksIGosIHRtcDsKLSAgICBpMzIgbmM7Ci0gICAgdTMyIGJsb2NrQ29kZWQ7Ci0gICAgdTMyIGJsb2NrSW5kZXg7Ci0gICAgdTMyIGlzMTZ4MTY7Ci0gICAgaTMyICgqbGV2ZWwpWzE2XTsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKHBSZXNpZHVhbCk7Ci0KLSAgICBsZXZlbCA9IHBSZXNpZHVhbC0+bGV2ZWw7Ci0KLSAgICAvKiBsdW1hIERDIGlzIGF0IGluZGV4IDI0ICovCi0gICAgaWYgKGgyNjRic2RNYlBhcnRQcmVkTW9kZShtYlR5cGUpID09IFBSRURfTU9ERV9JTlRSQTE2eDE2KQotICAgIHsKLSAgICAgICAgbmMgPSAoaTMyKURldGVybWluZU5jKHBNYiwgMCwgcFJlc2lkdWFsLT50b3RhbENvZWZmKTsKLSAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZVJlc2lkdWFsQmxvY2tDYXZsYyhwU3RybURhdGEsIGxldmVsWzI0XSwgbmMsIDE2KTsKLSAgICAgICAgaWYgKCh0bXAgJiAweEYpICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICBwUmVzaWR1YWwtPnRvdGFsQ29lZmZbMjRdID0gKHRtcCA+PiA0KSAmIDB4RkY7Ci0gICAgICAgIGlzMTZ4MTYgPSBIQU5UUk9fVFJVRTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICBpczE2eDE2ID0gSEFOVFJPX0ZBTFNFOwotCi0gICAgZm9yIChpID0gNCwgYmxvY2tJbmRleCA9IDA7IGktLTspCi0gICAgewotICAgICAgICAvKiBsdW1hIGNicCBpbiBiaXRzIDAtMyAqLwotICAgICAgICBibG9ja0NvZGVkID0gY29kZWRCbG9ja1BhdHRlcm4gJiAweDE7Ci0gICAgICAgIGNvZGVkQmxvY2tQYXR0ZXJuID4+PSAxOwotICAgICAgICBpZiAoYmxvY2tDb2RlZCkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChqID0gNDsgai0tOyBibG9ja0luZGV4KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbmMgPSAoaTMyKURldGVybWluZU5jKHBNYiwgYmxvY2tJbmRleCwgcFJlc2lkdWFsLT50b3RhbENvZWZmKTsKLSAgICAgICAgICAgICAgICBpZiAoaXMxNngxNikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVSZXNpZHVhbEJsb2NrQ2F2bGMocFN0cm1EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxbYmxvY2tJbmRleF0gKyAxLCBuYywgMTUpOwotICAgICAgICAgICAgICAgICAgICBwUmVzaWR1YWwtPmNvZWZmTWFwW2Jsb2NrSW5kZXhdID0gdG1wID4+IDE1OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlUmVzaWR1YWxCbG9ja0NhdmxjKHBTdHJtRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsW2Jsb2NrSW5kZXhdLCBuYywgMTYpOwotICAgICAgICAgICAgICAgICAgICBwUmVzaWR1YWwtPmNvZWZmTWFwW2Jsb2NrSW5kZXhdID0gdG1wID4+IDE2OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoKHRtcCAmIDB4RikgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgICAgICAgICBwUmVzaWR1YWwtPnRvdGFsQ29lZmZbYmxvY2tJbmRleF0gPSAodG1wID4+IDQpICYgMHhGRjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBibG9ja0luZGV4ICs9IDQ7Ci0gICAgfQotCi0gICAgLyogY2hyb21hIERDIGJsb2NrIGFyZSBhdCBpbmRpY2VzIDI1IGFuZCAyNiAqLwotICAgIGJsb2NrQ29kZWQgPSBjb2RlZEJsb2NrUGF0dGVybiAmIDB4MzsKLSAgICBpZiAoYmxvY2tDb2RlZCkKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVSZXNpZHVhbEJsb2NrQ2F2bGMocFN0cm1EYXRhLCBsZXZlbFsyNV0sIC0xLCA0KTsKLSAgICAgICAgaWYgKCh0bXAgJiAweEYpICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICBwUmVzaWR1YWwtPnRvdGFsQ29lZmZbMjVdID0gKHRtcCA+PiA0KSAmIDB4RkY7Ci0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVSZXNpZHVhbEJsb2NrQ2F2bGMocFN0cm1EYXRhLCBsZXZlbFsyNV0rNCwgLTEsIDQpOwotICAgICAgICBpZiAoKHRtcCAmIDB4RikgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgIHBSZXNpZHVhbC0+dG90YWxDb2VmZlsyNl0gPSAodG1wID4+IDQpICYgMHhGRjsKLSAgICB9Ci0KLSAgICAvKiBjaHJvbWEgQUMgKi8KLSAgICBibG9ja0NvZGVkID0gY29kZWRCbG9ja1BhdHRlcm4gJiAweDI7Ci0gICAgaWYgKGJsb2NrQ29kZWQpCi0gICAgewotICAgICAgICBmb3IgKGkgPSA4OyBpLS07YmxvY2tJbmRleCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBuYyA9IChpMzIpRGV0ZXJtaW5lTmMocE1iLCBibG9ja0luZGV4LCBwUmVzaWR1YWwtPnRvdGFsQ29lZmYpOwotICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZVJlc2lkdWFsQmxvY2tDYXZsYyhwU3RybURhdGEsCi0gICAgICAgICAgICAgICAgbGV2ZWxbYmxvY2tJbmRleF0gKyAxLCBuYywgMTUpOwotICAgICAgICAgICAgaWYgKCh0bXAgJiAweEYpICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgICAgIHBSZXNpZHVhbC0+dG90YWxDb2VmZltibG9ja0luZGV4XSA9ICh0bXAgPj4gNCkgJiAweEZGOwotICAgICAgICAgICAgcFJlc2lkdWFsLT5jb2VmZk1hcFtibG9ja0luZGV4XSA9ICh0bXAgPj4gMTUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IERldGVybWluZU5jCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBSZXR1cm5zIHRoZSBuQyBvZiBhIGJsb2NrLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmZGVmIEgyNjRERUNfT01YREwKLXUzMiBEZXRlcm1pbmVOYyhtYlN0b3JhZ2VfdCAqcE1iLCB1MzIgYmxvY2tJbmRleCwgdTggKnBUb3RhbENvZWZmKQotI2Vsc2UKLXUzMiBEZXRlcm1pbmVOYyhtYlN0b3JhZ2VfdCAqcE1iLCB1MzIgYmxvY2tJbmRleCwgaTE2ICpwVG90YWxDb2VmZikKLSNlbmRpZgotewotLypsaW50IC1lNzAyICovCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB0bXA7Ci0gICAgaTMyIG47Ci0gICAgY29uc3QgbmVpZ2hib3VyX3QgKm5laWdoYm91ckEsICpuZWlnaGJvdXJCOwotICAgIHU4IG5laWdoYm91ckFpbmRleCwgbmVpZ2hib3VyQmluZGV4OwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoYmxvY2tJbmRleCA8IDI0KTsKLQotICAgIC8qIGlmIG5laWdoYm91ciBibG9jayBiZWxvbmdzIHRvIGN1cnJlbnQgbWFjcm9ibG9jayB0b3RhbENvZWZmIGFycmF5Ci0gICAgICogbWJTdG9yYWdlIGhhcyBub3QgYmVlbiBzZXQvdXBkYXRlZCB5ZXQgLT4gdXNlIHBUb3RhbENvZWZmICovCi0gICAgbmVpZ2hib3VyQSA9IGgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0EoYmxvY2tJbmRleCk7Ci0gICAgbmVpZ2hib3VyQiA9IGgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0IoYmxvY2tJbmRleCk7Ci0gICAgbmVpZ2hib3VyQWluZGV4ID0gbmVpZ2hib3VyQS0+aW5kZXg7Ci0gICAgbmVpZ2hib3VyQmluZGV4ID0gbmVpZ2hib3VyQi0+aW5kZXg7Ci0gICAgaWYgKG5laWdoYm91ckEtPm1iID09IE1CX0NVUlIgJiYgbmVpZ2hib3VyQi0+bWIgPT0gTUJfQ1VSUikKLSAgICB7Ci0gICAgICAgIG4gPSAocFRvdGFsQ29lZmZbbmVpZ2hib3VyQWluZGV4XSArCi0gICAgICAgICAgICAgcFRvdGFsQ29lZmZbbmVpZ2hib3VyQmluZGV4XSArIDEpPj4xOwotICAgIH0KLSAgICBlbHNlIGlmIChuZWlnaGJvdXJBLT5tYiA9PSBNQl9DVVJSKQotICAgIHsKLSAgICAgICAgbiA9IHBUb3RhbENvZWZmW25laWdoYm91ckFpbmRleF07Ci0gICAgICAgIGlmIChoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBwTWItPm1iQikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG4gPSAobiArIHBNYi0+bWJCLT50b3RhbENvZWZmW25laWdoYm91ckJpbmRleF0gKyAxKSA+PiAxOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKG5laWdoYm91ckItPm1iID09IE1CX0NVUlIpCi0gICAgewotICAgICAgICBuID0gcFRvdGFsQ29lZmZbbmVpZ2hib3VyQmluZGV4XTsKLSAgICAgICAgaWYgKGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIHBNYi0+bWJBKSkKLSAgICAgICAgewotICAgICAgICAgICAgbiA9IChuICsgcE1iLT5tYkEtPnRvdGFsQ29lZmZbbmVpZ2hib3VyQWluZGV4XSArIDEpID4+IDE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgbiA9IHRtcCA9IDA7Ci0gICAgICAgIGlmIChoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBwTWItPm1iQSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG4gPSBwTWItPm1iQS0+dG90YWxDb2VmZltuZWlnaGJvdXJBaW5kZXhdOwotICAgICAgICAgICAgdG1wID0gMTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgcE1iLT5tYkIpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodG1wKQotICAgICAgICAgICAgICAgIG4gPSAobiArIHBNYi0+bWJCLT50b3RhbENvZWZmW25laWdoYm91ckJpbmRleF0gKyAxKSA+PiAxOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIG4gPSBwTWItPm1iQi0+dG90YWxDb2VmZltuZWlnaGJvdXJCaW5kZXhdOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybigodTMyKW4pOwotLypsaW50ICtlNzAyICovCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogQ2JwSW50cmExNngxNgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgUmV0dXJucyB0aGUgY29kZWQgYmxvY2sgcGF0dGVybiBmb3IgaW50cmEgMTZ4MTYgbWFjcm9ibG9jay4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIENicEludHJhMTZ4MTYobWJUeXBlX2UgbWJUeXBlKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBjYnA7Ci0gICAgdTMyIHRtcDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKG1iVHlwZSA+PSBJXzE2eDE2XzBfMF8wICYmIG1iVHlwZSA8PSBJXzE2eDE2XzNfMl8xKTsKLQotICAgIGlmIChtYlR5cGUgPj0gSV8xNngxNl8wXzBfMSkKLSAgICAgICAgY2JwID0gMTU7Ci0gICAgZWxzZQotICAgICAgICBjYnAgPSAwOwotCi0gICAgLyogdG1wIGlzIDAgZm9yIElfMTZ4MTZfMF8wXzAgbWIgdHlwZSAqLwotICAgIC8qIGlnbm9yZSBsaW50IHdhcm5pbmcgb24gYXJpdGhtZXRpYyBvbiBlbnVtJ3MgKi8KLSAgICB0bXAgPSAvKmxpbnQgLWUoNjU2KSovKG1iVHlwZSAtIElfMTZ4MTZfMF8wXzApID4+IDI7Ci0gICAgaWYgKHRtcCA+IDIpCi0gICAgICAgIHRtcCAtPSAzOwotCi0gICAgY2JwICs9IHRtcCA8PCA0OwotCi0gICAgcmV0dXJuKGNicCk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkUHJlZE1vZGVJbnRyYTE2eDE2Ci0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBSZXR1cm5zIHRoZSBwcmVkaWN0aW9uIG1vZGUgZm9yIGludHJhIDE2eDE2IG1hY3JvYmxvY2suCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkUHJlZE1vZGVJbnRyYTE2eDE2KG1iVHlwZV9lIG1iVHlwZSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQobWJUeXBlID49IElfMTZ4MTZfMF8wXzAgJiYgbWJUeXBlIDw9IElfMTZ4MTZfM18yXzEpOwotCi0gICAgLyogdG1wIGlzIDAgZm9yIElfMTZ4MTZfMF8wXzAgbWIgdHlwZSAqLwotICAgIC8qIGlnbm9yZSBsaW50IHdhcm5pbmcgb24gYXJpdGhtZXRpYyBvbiBlbnVtJ3MgKi8KLSAgICB0bXAgPSAvKmxpbnQgLWUoNjU2KSovKG1iVHlwZSAtIElfMTZ4MTZfMF8wXzApOwotCi0gICAgcmV0dXJuKHRtcCAmIDB4Myk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkRGVjb2RlTWFjcm9ibG9jawotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgRGVjb2RlIG9uZSBtYWNyb2Jsb2NrIGFuZCB3cml0ZSBpbnRvIG91dHB1dCBpbWFnZS4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgcE1iICAgICAgICAgICBwb2ludGVyIHRvIG1hY3JvYmxvY2sgc3BlY2lmaWMgaW5mb3JtYXRpb24KLSAgICAgICAgICBtYkxheWVyICAgICAgIHBvaW50ZXIgdG8gY3VycmVudCBtYWNyb2Jsb2NrIGRhdGEgZnJvbSBzdHJlYW0KLSAgICAgICAgICBjdXJySW1hZ2UgICAgIHBvaW50ZXIgdG8gb3V0cHV0IGltYWdlCi0gICAgICAgICAgZHBiICAgICAgICAgICBwb2ludGVyIHRvIGRlY29kZWQgcGljdHVyZSBidWZmZXIKLSAgICAgICAgICBxcFkgICAgICAgICAgIHBvaW50ZXIgdG8gc2xpY2UgUVAKLSAgICAgICAgICBtYk51bSAgICAgICAgIGN1cnJlbnQgbWFjcm9ibG9jayBudW1iZXIKLSAgICAgICAgICBjb25zdHJhaW5lZEludHJhUHJlZCAgZmxhZyBzcGVjaWZ5aW5nIGlmIG5laWdoYm91cmluZyBpbnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrcyBhcmUgdXNlZCBpbiBpbnRyYSBwcmVkaWN0aW9uCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICBwTWIgICAgICAgICAgIHN0cnVjdHVyZSBpcyB1cGRhdGVkIHdpdGggY3VycmVudCBtYWNyb2Jsb2NrCi0gICAgICAgICAgY3VyckltYWdlICAgICBkZWNvZGVkIG1hY3JvYmxvY2sgaXMgd3JpdHRlbiBpbnRvIG91dHB1dCBpbWFnZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgSEFOVFJPX09LICAgICBzdWNjZXNzCi0gICAgICAgICAgSEFOVFJPX05PSyAgICBlcnJvciBpbiBtYWNyb2Jsb2NrIGRlY29kaW5nCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkRGVjb2RlTWFjcm9ibG9jayhtYlN0b3JhZ2VfdCAqcE1iLCBtYWNyb2Jsb2NrTGF5ZXJfdCAqcE1iTGF5ZXIsCi0gICAgaW1hZ2VfdCAqY3VyckltYWdlLCBkcGJTdG9yYWdlX3QgKmRwYiwgaTMyICpxcFksIHUzMiBtYk51bSwKLSAgICB1MzIgY29uc3RyYWluZWRJbnRyYVByZWRGbGFnLCB1OCogZGF0YSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaSwgdG1wOwotICAgIG1iVHlwZV9lIG1iVHlwZTsKLSNpZmRlZiBIMjY0REVDX09NWERMCi0gICAgY29uc3QgdTggKnBTcmM7Ci0jZW5kaWYKLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwTWIpOwotICAgIEFTU0VSVChwTWJMYXllcik7Ci0gICAgQVNTRVJUKGN1cnJJbWFnZSk7Ci0gICAgQVNTRVJUKHFwWSAmJiAqcXBZIDwgNTIpOwotICAgIEFTU0VSVChtYk51bSA8IGN1cnJJbWFnZS0+d2lkdGgqY3VyckltYWdlLT5oZWlnaHQpOwotCi0gICAgbWJUeXBlID0gcE1iTGF5ZXItPm1iVHlwZTsKLSAgICBwTWItPm1iVHlwZSA9IG1iVHlwZTsKLQotICAgIHBNYi0+ZGVjb2RlZCsrOwotCi0gICAgaDI2NGJzZFNldEN1cnJJbWFnZU1iUG9pbnRlcnMoY3VyckltYWdlLCBtYk51bSk7Ci0KLSAgICBpZiAobWJUeXBlID09IElfUENNKQotICAgIHsKLSAgICAgICAgdTggKnBEYXRhID0gKHU4KilkYXRhOwotI2lmZGVmIEgyNjRERUNfT01YREwKLSAgICAgICAgdTggKnRvdCA9IHBNYi0+dG90YWxDb2VmZjsKLSNlbHNlCi0gICAgICAgIGkxNiAqdG90ID0gcE1iLT50b3RhbENvZWZmOwotI2VuZGlmCi0gICAgICAgIGkzMiAqbGV2ID0gcE1iTGF5ZXItPnJlc2lkdWFsLmxldmVsWzBdOwotCi0gICAgICAgIHBNYi0+cXBZID0gMDsKLQotICAgICAgICAvKiBpZiBkZWNvZGVkIGZsYWcgPiAxIC0+IG1iIGhhcyBhbHJlYWR5IGJlZW4gc3VjY2Vzc2Z1bGx5IGRlY29kZWQgYW5kCi0gICAgICAgICAqIHdyaXR0ZW4gdG8gb3V0cHV0IC0+IGRvIG5vdCB3cml0ZSBhZ2FpbiAqLwotICAgICAgICBpZiAocE1iLT5kZWNvZGVkID4gMSkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpID0gMjQ7IGktLTspCi0gICAgICAgICAgICAgICAgKnRvdCsrID0gMTY7Ci0gICAgICAgICAgICByZXR1cm4gSEFOVFJPX09LOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpID0gMjQ7IGktLTspCi0gICAgICAgIHsKLSAgICAgICAgICAgICp0b3QrKyA9IDE2OwotICAgICAgICAgICAgZm9yICh0bXAgPSAxNjsgdG1wLS07KQotICAgICAgICAgICAgICAgICpwRGF0YSsrID0gKHU4KSgqbGV2KyspOwotICAgICAgICB9Ci0gICAgICAgIGgyNjRic2RXcml0ZU1hY3JvYmxvY2soY3VyckltYWdlLCAodTgqKWRhdGEpOwotCi0gICAgICAgIHJldHVybihIQU5UUk9fT0spOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotI2lmZGVmIEgyNjRERUNfT01YREwKLSAgICAgICAgaWYgKGgyNjRic2RNYlBhcnRQcmVkTW9kZShtYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUikKLSAgICAgICAgewotICAgICAgICAgICAgdG1wID0gaDI2NGJzZEludGVyUHJlZGljdGlvbihwTWIsIHBNYkxheWVyLCBkcGIsIG1iTnVtLAotICAgICAgICAgICAgICAgIGN1cnJJbWFnZSwgKHU4KilkYXRhKTsKLSAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKSByZXR1cm4gKHRtcCk7Ci0gICAgICAgIH0KLSNlbmRpZgotICAgICAgICBpZiAobWJUeXBlICE9IFBfU2tpcCkKLSAgICAgICAgewotICAgICAgICAgICAgSDI2NFN3RGVjTWVtY3B5KHBNYi0+dG90YWxDb2VmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWJMYXllci0+cmVzaWR1YWwudG90YWxDb2VmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNypzaXplb2YoKnBNYi0+dG90YWxDb2VmZikpOwotCi0gICAgICAgICAgICAvKiB1cGRhdGUgcXBZICovCi0gICAgICAgICAgICBpZiAocE1iTGF5ZXItPm1iUXBEZWx0YSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAqcXBZID0gKnFwWSArIHBNYkxheWVyLT5tYlFwRGVsdGE7Ci0gICAgICAgICAgICAgICAgaWYgKCpxcFkgPCAwKSAqcXBZICs9IDUyOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCpxcFkgPj0gNTIpICpxcFkgLT0gNTI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwTWItPnFwWSA9ICh1MzIpKnFwWTsKLQotI2lmZGVmIEgyNjRERUNfT01YREwKLSAgICAgICAgICAgIHBTcmMgPSBwTWJMYXllci0+cmVzaWR1YWwucG9zQ29lZkJ1ZjsKLQotICAgICAgICAgICAgaWYgKGgyNjRic2RNYlBhcnRQcmVkTW9kZShtYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBPTVhSZXN1bHQgcmVzOwotICAgICAgICAgICAgICAgIHU4ICpwOwotICAgICAgICAgICAgICAgIHU4ICp0b3RhbENvZWZmID0gcE1iLT50b3RhbENvZWZmOwotCi0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyssIHRvdGFsQ29lZmYrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHAgPSBkYXRhICsgbHVtYUluZGV4W2ldOwotICAgICAgICAgICAgICAgICAgICBpZiAoKnRvdGFsQ29lZmYpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwU3JjLCBwLCAwLCBwLCAxNiwgMTYsICpxcFksICp0b3RhbENvZWZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gT01YX1N0c19Ob0VycikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUobWJUeXBlKSA9PSBQUkVEX01PREVfSU5UUkE0eDQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdG1wID0gUHJvY2Vzc0ludHJhNHg0UmVzaWR1YWwocE1iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RyYWluZWRJbnRyYVByZWRGbGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYkxheWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwU3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJJbWFnZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAodG1wKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGgyNjRic2RNYlBhcnRQcmVkTW9kZShtYlR5cGUpID09IFBSRURfTU9ERV9JTlRSQTE2eDE2KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRtcCA9IFByb2Nlc3NJbnRyYTE2eDE2UmVzaWR1YWwocE1iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RyYWluZWRJbnRyYVByZWRGbGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYkxheWVyLT5tYlByZWQuaW50cmFDaHJvbWFQcmVkTW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJySW1hZ2UpOwotICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHRtcCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRtcCA9IFByb2Nlc3NDaHJvbWFSZXNpZHVhbChwTWIsIGRhdGEsICZwU3JjKTsKLQotI2Vsc2UKLSAgICAgICAgICAgIHRtcCA9IFByb2Nlc3NSZXNpZHVhbChwTWIsIHBNYkxheWVyLT5yZXNpZHVhbC5sZXZlbCwKLSAgICAgICAgICAgICAgICBwTWJMYXllci0+cmVzaWR1YWwuY29lZmZNYXApOwotI2VuZGlmCi0gICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICByZXR1cm4gKHRtcCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBIMjY0U3dEZWNNZW1zZXQocE1iLT50b3RhbENvZWZmLCAwLCAyNypzaXplb2YoKnBNYi0+dG90YWxDb2VmZikpOwotICAgICAgICAgICAgcE1iLT5xcFkgPSAodTMyKSpxcFk7Ci0gICAgICAgIH0KLSNpZmRlZiBIMjY0REVDX09NWERMCi0gICAgICAgIC8qIGlmIGRlY29kZWQgZmxhZyA+IDEgLT4gbWIgaGFzIGFscmVhZHkgYmVlbiBzdWNjZXNzZnVsbHkgZGVjb2RlZCBhbmQKLSAgICAgICAgICogd3JpdHRlbiB0byBvdXRwdXQgLT4gZG8gbm90IHdyaXRlIGFnYWluICovCi0gICAgICAgIGlmIChwTWItPmRlY29kZWQgPiAxKQotICAgICAgICAgICAgcmV0dXJuIEhBTlRST19PSzsKLQotICAgICAgICBoMjY0YnNkV3JpdGVNYWNyb2Jsb2NrKGN1cnJJbWFnZSwgZGF0YSk7Ci0jZWxzZQotICAgICAgICBpZiAoaDI2NGJzZE1iUGFydFByZWRNb2RlKG1iVHlwZSkgIT0gUFJFRF9NT0RFX0lOVEVSKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAgPSBoMjY0YnNkSW50cmFQcmVkaWN0aW9uKHBNYiwgcE1iTGF5ZXIsIGN1cnJJbWFnZSwgbWJOdW0sCi0gICAgICAgICAgICAgICAgY29uc3RyYWluZWRJbnRyYVByZWRGbGFnLCAodTgqKWRhdGEpOwotICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spIHJldHVybiAodG1wKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcCA9IGgyNjRic2RJbnRlclByZWRpY3Rpb24ocE1iLCBwTWJMYXllciwgZHBiLCBtYk51bSwKLSAgICAgICAgICAgICAgICBjdXJySW1hZ2UsICh1OCopZGF0YSk7Ci0gICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykgcmV0dXJuICh0bXApOwotICAgICAgICB9Ci0jZW5kaWYKLSAgICB9Ci0KLSAgICByZXR1cm4gSEFOVFJPX09LOwotfQotCi0KLSNpZmRlZiBIMjY0REVDX09NWERMCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogUHJvY2Vzc0Nocm9tYVJlc2lkdWFsCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBQcm9jZXNzIHRoZSByZXNpZHVhbCBkYXRhIG9mIGNocm9tYSB3aXRoCi0gICAgICAgICAgaW52ZXJzZSBxdWFudGl6YXRpb24gYW5kIGludmVyc2UgdHJhbnNmb3JtLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdTMyIFByb2Nlc3NDaHJvbWFSZXNpZHVhbChtYlN0b3JhZ2VfdCAqcE1iLCB1OCAqZGF0YSwgY29uc3QgdTggKipwU3JjICkKLXsKLSAgICB1MzIgaTsKLSAgICB1MzIgY2hyb21hUXA7Ci0gICAgaTE2ICpwRGM7Ci0gICAgaTE2IGRjWzQgKyA0XSA9IHswLDAsMCwwLDAsMCwwLDB9OwotICAgIHU4ICp0b3RhbENvZWZmOwotICAgIE9NWFJlc3VsdCByZXN1bHQ7Ci0gICAgdTggKnA7Ci0KLSAgICAvKiBjaHJvbWEgREMgcHJvY2Vzc2luZy4gRmlyc3QgY2hyb21hIGRjIGJsb2NrIGlzIGJsb2NrIHdpdGggaW5kZXggMjUgKi8KLSAgICBjaHJvbWFRcCA9Ci0gICAgICAgIGgyNjRic2RRcENbQ0xJUDMoMCwgNTEsIChpMzIpcE1iLT5xcFkgKyBwTWItPmNocm9tYVFwSW5kZXhPZmZzZXQpXTsKLQotICAgIGlmIChwTWItPnRvdGFsQ29lZmZbMjVdKQotICAgIHsKLSAgICAgICAgcERjID0gZGM7Ci0gICAgICAgIHJlc3VsdCA9IG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIoCi0gICAgICAgICAgICAgICAgcFNyYywKLSAgICAgICAgICAgICAgICBwRGMsCi0gICAgICAgICAgICAgICAgKGkzMiljaHJvbWFRcCk7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gT01YX1N0c19Ob0VycikKLSAgICAgICAgICAgIHJldHVybiAoSEFOVFJPX05PSyk7Ci0gICAgfQotICAgIGlmIChwTWItPnRvdGFsQ29lZmZbMjZdKQotICAgIHsKLSAgICAgICAgcERjID0gZGMrNDsKLSAgICAgICAgcmVzdWx0ID0gb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpcigKLSAgICAgICAgICAgICAgICBwU3JjLAotICAgICAgICAgICAgICAgIHBEYywKLSAgICAgICAgICAgICAgICAoaTMyKWNocm9tYVFwKTsKLSAgICAgICAgaWYgKHJlc3VsdCAhPSBPTVhfU3RzX05vRXJyKQotICAgICAgICAgICAgcmV0dXJuIChIQU5UUk9fTk9LKTsKLSAgICB9Ci0KLSAgICBwRGMgPSBkYzsKLSAgICB0b3RhbENvZWZmID0gcE1iLT50b3RhbENvZWZmICsgMTY7Ci0gICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKywgcERjKyssIHRvdGFsQ29lZmYrKykKLSAgICB7Ci0gICAgICAgIC8qIGNocm9tYSBwcmVkaWN0aW9uICovCi0gICAgICAgIGlmICgqdG90YWxDb2VmZiB8fCAqcERjKQotICAgICAgICB7Ci0gICAgICAgICAgICBwID0gZGF0YSArIGNocm9tYUluZGV4W2ldOwotICAgICAgICAgICAgcmVzdWx0ID0gb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCgKLSAgICAgICAgICAgICAgICAgICAgcFNyYywKLSAgICAgICAgICAgICAgICAgICAgcCwKLSAgICAgICAgICAgICAgICAgICAgcERjLAotICAgICAgICAgICAgICAgICAgICBwLAotICAgICAgICAgICAgICAgICAgICA4LAotICAgICAgICAgICAgICAgICAgICA4LAotICAgICAgICAgICAgICAgICAgICAoaTMyKWNocm9tYVFwLAotICAgICAgICAgICAgICAgICAgICAqdG90YWxDb2VmZik7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ICE9IE9NWF9TdHNfTm9FcnIpCi0gICAgICAgICAgICAgICAgcmV0dXJuIChIQU5UUk9fTk9LKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybihIQU5UUk9fT0spOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IFByb2Nlc3NJbnRyYTE2eDE2UmVzaWR1YWwKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFByb2Nlc3MgdGhlIHJlc2lkdWFsIGRhdGEgb2YgbHVtYSB3aXRoCi0gICAgICAgICAgaW52ZXJzZSBxdWFudGl6YXRpb24gYW5kIGludmVyc2UgdHJhbnNmb3JtLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdTMyIFByb2Nlc3NJbnRyYTE2eDE2UmVzaWR1YWwobWJTdG9yYWdlX3QgKnBNYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4ICpkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyIGNvbnN0cmFpbmVkSW50cmFQcmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyIGludHJhQ2hyb21hUHJlZE1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1OCoqIHBTcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZV90ICppbWFnZSkKLXsKLSAgICB1MzIgaTsKLSAgICBpMTYgKnBEYzsKLSAgICBpMTYgZGNbMTZdID0gezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9OwotICAgIHU4ICp0b3RhbENvZWZmOwotICAgIE9NWFJlc3VsdCByZXN1bHQ7Ci0gICAgdTggKnA7Ci0KLSAgICB0b3RhbENvZWZmID0gcE1iLT50b3RhbENvZWZmOwotCi0gICAgaWYgKHRvdGFsQ29lZmZbMjRdKQotICAgIHsKLSAgICAgICAgcERjID0gZGM7Ci0gICAgICAgIHJlc3VsdCA9IG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyKAotICAgICAgICAgICAgICAgICAgICBwU3JjLAotICAgICAgICAgICAgICAgICAgICBwRGMsCi0gICAgICAgICAgICAgICAgICAgIChpMzIpcE1iLT5xcFkpOwotICAgICAgICBpZiAocmVzdWx0ICE9IE9NWF9TdHNfTm9FcnIpCi0gICAgICAgICAgICByZXR1cm4gKEhBTlRST19OT0spOwotICAgIH0KLSAgICAvKiBJbnRyYSAxNngxNiBwcmVkICovCi0gICAgaWYgKGgyNjRic2RJbnRyYTE2eDE2UHJlZGljdGlvbihwTWIsIGRhdGEsIGltYWdlLT5sdW1hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLT53aWR0aCoxNiwgY29uc3RyYWluZWRJbnRyYVByZWQpICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrLCB0b3RhbENvZWZmKyspCi0gICAgewotICAgICAgICBwID0gZGF0YSArIGx1bWFJbmRleFtpXTsKLSAgICAgICAgcERjID0gJmRjW2RjQ29lZmZJbmRleFtpXV07Ci0gICAgICAgIGlmICgqdG90YWxDb2VmZiB8fCAqcERjKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkKAotICAgICAgICAgICAgICAgICAgICBwU3JjLAotICAgICAgICAgICAgICAgICAgICBwLAotICAgICAgICAgICAgICAgICAgICBwRGMsCi0gICAgICAgICAgICAgICAgICAgIHAsCi0gICAgICAgICAgICAgICAgICAgIDE2LAotICAgICAgICAgICAgICAgICAgICAxNiwKLSAgICAgICAgICAgICAgICAgICAgKGkzMilwTWItPnFwWSwKLSAgICAgICAgICAgICAgICAgICAgKnRvdGFsQ29lZmYpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBPTVhfU3RzX05vRXJyKQotICAgICAgICAgICAgICAgIHJldHVybiAoSEFOVFJPX05PSyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoaDI2NGJzZEludHJhQ2hyb21hUHJlZGljdGlvbihwTWIsIGRhdGEgKyAyNTYsCi0gICAgICAgICAgICAgICAgaW1hZ2UsCi0gICAgICAgICAgICAgICAgaW50cmFDaHJvbWFQcmVkTW9kZSwKLSAgICAgICAgICAgICAgICBjb25zdHJhaW5lZEludHJhUHJlZCkgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICByZXR1cm4gSEFOVFJPX09LOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IFByb2Nlc3NJbnRyYTR4NFJlc2lkdWFsCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBQcm9jZXNzIHRoZSByZXNpZHVhbCBkYXRhIG9mIGx1bWEgd2l0aAotICAgICAgICAgIGludmVyc2UgcXVhbnRpemF0aW9uIGFuZCBpbnZlcnNlIHRyYW5zZm9ybS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXUzMiBQcm9jZXNzSW50cmE0eDRSZXNpZHVhbChtYlN0b3JhZ2VfdCAqcE1iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4ICpkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMiBjb25zdHJhaW5lZEludHJhUHJlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrTGF5ZXJfdCAqbWJMYXllciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1OCAqKnBTcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VfdCAqaW1hZ2UpCi17Ci0gICAgdTMyIGk7Ci0gICAgdTggKnRvdGFsQ29lZmY7Ci0gICAgT01YUmVzdWx0IHJlc3VsdDsKLSAgICB1OCAqcDsKLQotICAgIHRvdGFsQ29lZmYgPSBwTWItPnRvdGFsQ29lZmY7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKywgdG90YWxDb2VmZisrKQotICAgIHsKLSAgICAgICAgcCA9IGRhdGEgKyBsdW1hSW5kZXhbaV07Ci0gICAgICAgIGlmIChoMjY0YnNkSW50cmE0eDRQcmVkaWN0aW9uKHBNYiwgcCwgbWJMYXllciwgaW1hZ2UtPmx1bWEsCi0gICAgICAgICAgICAgICAgICAgIGltYWdlLT53aWR0aCoxNiwgY29uc3RyYWluZWRJbnRyYVByZWQsIGkpICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgICAgICBpZiAoKnRvdGFsQ29lZmYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQoCi0gICAgICAgICAgICAgICAgICAgIHBTcmMsCi0gICAgICAgICAgICAgICAgICAgIHAsCi0gICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgIHAsCi0gICAgICAgICAgICAgICAgICAgIDE2LAotICAgICAgICAgICAgICAgICAgICAxNiwKLSAgICAgICAgICAgICAgICAgICAgKGkzMilwTWItPnFwWSwKLSAgICAgICAgICAgICAgICAgICAgKnRvdGFsQ29lZmYpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBPTVhfU3RzX05vRXJyKQotICAgICAgICAgICAgICAgIHJldHVybiAoSEFOVFJPX05PSyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoaDI2NGJzZEludHJhQ2hyb21hUHJlZGljdGlvbihwTWIsIGRhdGEgKyAyNTYsCi0gICAgICAgICAgICAgICAgaW1hZ2UsCi0gICAgICAgICAgICAgICAgbWJMYXllci0+bWJQcmVkLmludHJhQ2hyb21hUHJlZE1vZGUsCi0gICAgICAgICAgICAgICAgY29uc3RyYWluZWRJbnRyYVByZWQpICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgcmV0dXJuIEhBTlRST19PSzsKLX0KLQotI2Vsc2UgLyogSDI2NERFQ19PTVhETCAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IFByb2Nlc3NSZXNpZHVhbAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgUHJvY2VzcyB0aGUgcmVzaWR1YWwgZGF0YSBvZiBvbmUgbWFjcm9ibG9jayB3aXRoCi0gICAgICAgICAgaW52ZXJzZSBxdWFudGl6YXRpb24gYW5kIGludmVyc2UgdHJhbnNmb3JtLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgUHJvY2Vzc1Jlc2lkdWFsKG1iU3RvcmFnZV90ICpwTWIsIGkzMiByZXNpZHVhbExldmVsW11bMTZdLCB1MzIgKmNvZWZmTWFwKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpOwotICAgIHUzMiBjaHJvbWFRcDsKLSAgICBpMzIgKCpibG9ja0RhdGEpWzE2XTsKLSAgICBpMzIgKCpibG9ja0RjKVsxNl07Ci0gICAgaTE2ICp0b3RhbENvZWZmOwotICAgIGkzMiAqY2hyb21hRGM7Ci0gICAgY29uc3QgdTMyICpkY0NvZWZmSWR4OwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocE1iKTsKLSAgICBBU1NFUlQocmVzaWR1YWxMZXZlbCk7Ci0KLSAgICAvKiBzZXQgcG9pbnRlcnMgdG8gREMgY29lZmZpY2llbnQgYmxvY2tzICovCi0gICAgYmxvY2tEYyA9IHJlc2lkdWFsTGV2ZWwgKyAyNDsKLQotICAgIGJsb2NrRGF0YSA9IHJlc2lkdWFsTGV2ZWw7Ci0gICAgdG90YWxDb2VmZiA9IHBNYi0+dG90YWxDb2VmZjsKLSAgICBpZiAoaDI2NGJzZE1iUGFydFByZWRNb2RlKHBNYi0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5UUkExNngxNikKLSAgICB7Ci0gICAgICAgIGlmICh0b3RhbENvZWZmWzI0XSkKLSAgICAgICAgewotICAgICAgICAgICAgaDI2NGJzZFByb2Nlc3NMdW1hRGMoKmJsb2NrRGMsIHBNYi0+cXBZKTsKLSAgICAgICAgfQotICAgICAgICBkY0NvZWZmSWR4ID0gZGNDb2VmZkluZGV4OwotCi0gICAgICAgIGZvciAoaSA9IDE2OyBpLS07IGJsb2NrRGF0YSsrLCB0b3RhbENvZWZmKyssIGNvZWZmTWFwKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIHNldCBkYyBjb2VmZmljaWVudCBvZiBsdW1hIGJsb2NrICovCi0gICAgICAgICAgICAoKmJsb2NrRGF0YSlbMF0gPSAoKmJsb2NrRGMpWypkY0NvZWZmSWR4KytdOwotICAgICAgICAgICAgaWYgKCgqYmxvY2tEYXRhKVswXSB8fCAqdG90YWxDb2VmZikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoaDI2NGJzZFByb2Nlc3NCbG9jaygqYmxvY2tEYXRhLCBwTWItPnFwWSwgMSwgKmNvZWZmTWFwKSAhPQotICAgICAgICAgICAgICAgICAgICBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBNQVJLX1JFU0lEVUFMX0VNUFRZKCpibG9ja0RhdGEpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGZvciAoaSA9IDE2OyBpLS07IGJsb2NrRGF0YSsrLCB0b3RhbENvZWZmKyssIGNvZWZmTWFwKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgqdG90YWxDb2VmZikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoaDI2NGJzZFByb2Nlc3NCbG9jaygqYmxvY2tEYXRhLCBwTWItPnFwWSwgMCwgKmNvZWZmTWFwKSAhPQotICAgICAgICAgICAgICAgICAgICBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBNQVJLX1JFU0lEVUFMX0VNUFRZKCpibG9ja0RhdGEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogY2hyb21hIERDIHByb2Nlc3NpbmcuIEZpcnN0IGNocm9tYSBkYyBibG9jayBpcyBibG9jayB3aXRoIGluZGV4IDI1ICovCi0gICAgY2hyb21hUXAgPQotICAgICAgICBoMjY0YnNkUXBDW0NMSVAzKDAsIDUxLCAoaTMyKXBNYi0+cXBZICsgcE1iLT5jaHJvbWFRcEluZGV4T2Zmc2V0KV07Ci0gICAgaWYgKHBNYi0+dG90YWxDb2VmZlsyNV0gfHwgcE1iLT50b3RhbENvZWZmWzI2XSkKLSAgICAgICAgaDI2NGJzZFByb2Nlc3NDaHJvbWFEYyhyZXNpZHVhbExldmVsWzI1XSwgY2hyb21hUXApOwotICAgIGNocm9tYURjID0gcmVzaWR1YWxMZXZlbFsyNV07Ci0gICAgZm9yIChpID0gODsgaS0tOyBibG9ja0RhdGErKywgdG90YWxDb2VmZisrLCBjb2VmZk1hcCsrKQotICAgIHsKLSAgICAgICAgLyogc2V0IGRjIGNvZWZmaWNpZW50IG9mIGNocm9tYSBibG9jayAqLwotICAgICAgICAoKmJsb2NrRGF0YSlbMF0gPSAqY2hyb21hRGMrKzsKLSAgICAgICAgaWYgKCgqYmxvY2tEYXRhKVswXSB8fCAqdG90YWxDb2VmZikKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGgyNjRic2RQcm9jZXNzQmxvY2soKmJsb2NrRGF0YSwgY2hyb21hUXAsIDEsKmNvZWZmTWFwKSAhPQotICAgICAgICAgICAgICAgIEhBTlRST19PSykKLSAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgTUFSS19SRVNJRFVBTF9FTVBUWSgqYmxvY2tEYXRhKTsKLSAgICB9Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLX0KLSNlbmRpZiAvKiBIMjY0REVDX09NWERMICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZFN1Yk1iUGFydE1vZGUKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFJldHVybnMgdGhlIG1hY3JvYmxvY2sncyBzdWItcGFydGl0aW9uIG1vZGUuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN1Yk1iUGFydE1vZGVfZSBoMjY0YnNkU3ViTWJQYXJ0TW9kZShzdWJNYlR5cGVfZSBzdWJNYlR5cGUpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChzdWJNYlR5cGUgPCA0KTsKLQotICAgIHJldHVybigoc3ViTWJQYXJ0TW9kZV9lKXN1Yk1iVHlwZSk7Ci0KLX0KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbWFjcm9ibG9ja19sYXllci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX21hY3JvYmxvY2tfbGF5ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJiYzM0MC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbWFjcm9ibG9ja19sYXllci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjEyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0gICAgMy4gRGF0YSB0eXBlcwotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBIMjY0U1dERUNfTUFDUk9CTE9DS19MQVlFUl9ICi0jZGVmaW5lIEgyNjRTV0RFQ19NQUNST0JMT0NLX0xBWUVSX0gKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJiYXNldHlwZS5oIgotI2luY2x1ZGUgImgyNjRic2Rfc3RyZWFtLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9pbWFnZS5oIgotI2luY2x1ZGUgImgyNjRic2RfZHBiLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIE1hY3JvIHRvIGRldGVybWluZSBpZiBhIG1iIGlzIGFuIGludHJhIG1iICovCi0jZGVmaW5lIElTX0lOVFJBX01CKGEpICgoYSkubWJUeXBlID4gNSkKLQotLyogTWFjcm8gdG8gZGV0ZXJtaW5lIGlmIGEgbWIgaXMgYW4gSV9QQ00gbWIgKi8KLSNkZWZpbmUgSVNfSV9QQ01fTUIoYSkgKChhKS5tYlR5cGUgPT0gMzEpCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgUF9Ta2lwICAgICAgICAgID0gMCwKLSAgICBQX0wwXzE2eDE2ICAgICAgPSAxLAotICAgIFBfTDBfTDBfMTZ4OCAgICA9IDIsCi0gICAgUF9MMF9MMF84eDE2ICAgID0gMywKLSAgICBQXzh4OCAgICAgICAgICAgPSA0LAotICAgIFBfOHg4cmVmMCAgICAgICA9IDUsCi0gICAgSV80eDQgICAgICAgICAgID0gNiwKLSAgICBJXzE2eDE2XzBfMF8wICAgPSA3LAotICAgIElfMTZ4MTZfMV8wXzAgICA9IDgsCi0gICAgSV8xNngxNl8yXzBfMCAgID0gOSwKLSAgICBJXzE2eDE2XzNfMF8wICAgPSAxMCwKLSAgICBJXzE2eDE2XzBfMV8wICAgPSAxMSwKLSAgICBJXzE2eDE2XzFfMV8wICAgPSAxMiwKLSAgICBJXzE2eDE2XzJfMV8wICAgPSAxMywKLSAgICBJXzE2eDE2XzNfMV8wICAgPSAxNCwKLSAgICBJXzE2eDE2XzBfMl8wICAgPSAxNSwKLSAgICBJXzE2eDE2XzFfMl8wICAgPSAxNiwKLSAgICBJXzE2eDE2XzJfMl8wICAgPSAxNywKLSAgICBJXzE2eDE2XzNfMl8wICAgPSAxOCwKLSAgICBJXzE2eDE2XzBfMF8xICAgPSAxOSwKLSAgICBJXzE2eDE2XzFfMF8xICAgPSAyMCwKLSAgICBJXzE2eDE2XzJfMF8xICAgPSAyMSwKLSAgICBJXzE2eDE2XzNfMF8xICAgPSAyMiwKLSAgICBJXzE2eDE2XzBfMV8xICAgPSAyMywKLSAgICBJXzE2eDE2XzFfMV8xICAgPSAyNCwKLSAgICBJXzE2eDE2XzJfMV8xICAgPSAyNSwKLSAgICBJXzE2eDE2XzNfMV8xICAgPSAyNiwKLSAgICBJXzE2eDE2XzBfMl8xICAgPSAyNywKLSAgICBJXzE2eDE2XzFfMl8xICAgPSAyOCwKLSAgICBJXzE2eDE2XzJfMl8xICAgPSAyOSwKLSAgICBJXzE2eDE2XzNfMl8xICAgPSAzMCwKLSAgICBJX1BDTSAgICAgICAgICAgPSAzMQotfSBtYlR5cGVfZTsKLQotdHlwZWRlZiBlbnVtIHsKLSAgICBQX0wwXzh4OCA9IDAsCi0gICAgUF9MMF84eDQgPSAxLAotICAgIFBfTDBfNHg4ID0gMiwKLSAgICBQX0wwXzR4NCA9IDMKLX0gc3ViTWJUeXBlX2U7Ci0KLXR5cGVkZWYgZW51bSB7Ci0gICAgTUJfUF8xNngxNiA9IDAsCi0gICAgTUJfUF8xNng4LAotICAgIE1CX1BfOHgxNiwKLSAgICBNQl9QXzh4OAotfSBtYlBhcnRNb2RlX2U7Ci0KLXR5cGVkZWYgZW51bSB7Ci0gICAgTUJfU1BfOHg4ID0gMCwKLSAgICBNQl9TUF84eDQsCi0gICAgTUJfU1BfNHg4LAotICAgIE1CX1NQXzR4NAotfSBzdWJNYlBhcnRNb2RlX2U7Ci0KLXR5cGVkZWYgZW51bSB7Ci0gICAgUFJFRF9NT0RFX0lOVFJBNHg0ID0gMCwKLSAgICBQUkVEX01PREVfSU5UUkExNngxNiAgLAotICAgIFBSRURfTU9ERV9JTlRFUgotfSBtYlBhcnRQcmVkTW9kZV9lOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIERhdGEgdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgLyogTXZQcmVkaWN0aW9uMTZ4MTYgYXNzdW1lcyB0aGF0IE1WcyBhcmUgMTZiaXRzICovCi0gICAgaTE2IGhvcjsKLSAgICBpMTYgdmVyOwotfSBtdl90OwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIHUzMiBwcmV2SW50cmE0eDRQcmVkTW9kZUZsYWdbMTZdOwotICAgIHUzMiByZW1JbnRyYTR4NFByZWRNb2RlWzE2XTsKLSAgICB1MzIgaW50cmFDaHJvbWFQcmVkTW9kZTsKLSAgICB1MzIgcmVmSWR4TDBbNF07Ci0gICAgbXZfdCBtdmRMMFs0XTsKLX0gbWJQcmVkX3Q7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgc3ViTWJUeXBlX2Ugc3ViTWJUeXBlWzRdOwotICAgIHUzMiByZWZJZHhMMFs0XTsKLSAgICBtdl90IG12ZEwwWzRdWzRdOwotfSBzdWJNYlByZWRfdDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSNpZmRlZiBIMjY0REVDX09NWERMCi0gICAgdTggcG9zQ29lZkJ1ZlsyNyoxNiozXTsKLSAgICB1OCB0b3RhbENvZWZmWzI3XTsKLSNlbHNlCi0gICAgaTE2IHRvdGFsQ29lZmZbMjddOwotI2VuZGlmCi0gICAgaTMyIGxldmVsWzI2XVsxNl07Ci0gICAgdTMyIGNvZWZmTWFwWzI0XTsKLX0gcmVzaWR1YWxfdDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBtYlR5cGVfZSBtYlR5cGU7Ci0gICAgdTMyIGNvZGVkQmxvY2tQYXR0ZXJuOwotICAgIGkzMiBtYlFwRGVsdGE7Ci0gICAgbWJQcmVkX3QgbWJQcmVkOwotICAgIHN1Yk1iUHJlZF90IHN1Yk1iUHJlZDsKLSAgICByZXNpZHVhbF90IHJlc2lkdWFsOwotfSBtYWNyb2Jsb2NrTGF5ZXJfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgbWJTdG9yYWdlCi17Ci0gICAgbWJUeXBlX2UgbWJUeXBlOwotICAgIHUzMiBzbGljZUlkOwotICAgIHUzMiBkaXNhYmxlRGVibG9ja2luZ0ZpbHRlcklkYzsKLSAgICBpMzIgZmlsdGVyT2Zmc2V0QTsKLSAgICBpMzIgZmlsdGVyT2Zmc2V0QjsKLSAgICB1MzIgcXBZOwotICAgIGkzMiBjaHJvbWFRcEluZGV4T2Zmc2V0OwotI2lmZGVmIEgyNjRERUNfT01YREwKLSAgICB1OCB0b3RhbENvZWZmWzI3XTsKLSNlbHNlCi0gICAgaTE2IHRvdGFsQ29lZmZbMjddOwotI2VuZGlmCi0gICAgdTggaW50cmE0eDRQcmVkTW9kZVsxNl07Ci0gICAgdTMyIHJlZlBpY1s0XTsKLSAgICB1OCogcmVmQWRkcls0XTsKLSAgICBtdl90IG12WzE2XTsKLSAgICB1MzIgZGVjb2RlZDsKLSAgICBzdHJ1Y3QgbWJTdG9yYWdlICptYkE7Ci0gICAgc3RydWN0IG1iU3RvcmFnZSAqbWJCOwotICAgIHN0cnVjdCBtYlN0b3JhZ2UgKm1iQzsKLSAgICBzdHJ1Y3QgbWJTdG9yYWdlICptYkQ7Ci19IG1iU3RvcmFnZV90OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkRGVjb2RlTWFjcm9ibG9ja0xheWVyKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgICBtYWNyb2Jsb2NrTGF5ZXJfdCAqcE1iTGF5ZXIsIG1iU3RvcmFnZV90ICpwTWIsIHUzMiBzbGljZVR5cGUsCi0gICAgdTMyIG51bVJlZklkeEFjdGl2ZSk7Ci0KLXUzMiBoMjY0YnNkTnVtTWJQYXJ0KG1iVHlwZV9lIG1iVHlwZSk7Ci11MzIgaDI2NGJzZE51bVN1Yk1iUGFydChzdWJNYlR5cGVfZSBzdWJNYlR5cGUpOwotCi1zdWJNYlBhcnRNb2RlX2UgaDI2NGJzZFN1Yk1iUGFydE1vZGUoc3ViTWJUeXBlX2Ugc3ViTWJUeXBlKTsKLQotdTMyIGgyNjRic2REZWNvZGVNYWNyb2Jsb2NrKG1iU3RvcmFnZV90ICpwTWIsIG1hY3JvYmxvY2tMYXllcl90ICpwTWJMYXllciwKLSAgICBpbWFnZV90ICpjdXJySW1hZ2UsIGRwYlN0b3JhZ2VfdCAqZHBiLCBpMzIgKnFwWSwgdTMyIG1iTnVtLAotICAgIHUzMiBjb25zdHJhaW5lZEludHJhUHJlZEZsYWcsIHU4KiBkYXRhKTsKLQotdTMyIGgyNjRic2RQcmVkTW9kZUludHJhMTZ4MTYobWJUeXBlX2UgbWJUeXBlKTsKLQotbWJQYXJ0UHJlZE1vZGVfZSBoMjY0YnNkTWJQYXJ0UHJlZE1vZGUobWJUeXBlX2UgbWJUeXBlKTsKLSNpZmRlZiBIMjY0REVDX05FT04KLXUzMiBoMjY0YnNkQ2xlYXJNYkxheWVyKG1hY3JvYmxvY2tMYXllcl90ICpwTWJMYXllciwgdTMyIHNpemUpOwotI2VuZGlmCi0KLSNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX01BQ1JPQkxPQ0tfTEFZRVJfSCAqLwotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9uYWxfdW5pdC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX25hbF91bml0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0NGM0M2EuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX25hbF91bml0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotICAgICAzLiBNb2R1bGUgZGVmaW5lcwotICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0gICAgIDUuIEZ1bmN0aW9ucwotICAgICAgICAgIGgyNjRic2REZWNvZGVOYWxVbml0Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiaDI2NGJzZF9uYWxfdW5pdC5oIgotI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbiBuYW1lOiBoMjY0YnNkRGVjb2RlTmFsVW5pdAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBEZWNvZGUgTkFMIHVuaXQgaGVhZGVyIGluZm9ybWF0aW9uCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIHBOYWxVbml0ICAgICAgICBOQUwgdW5pdCBoZWFkZXIgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGhlcmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKLSAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBpbnZhbGlkIE5BTCB1bml0IGhlYWRlciBpbmZvcm1hdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZERlY29kZU5hbFVuaXQoc3RybURhdGFfdCAqcFN0cm1EYXRhLCBuYWxVbml0X3QgKnBOYWxVbml0KQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB0bXA7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVChwTmFsVW5pdCk7Ci0gICAgQVNTRVJUKHBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkID09IDApOwotCi0gICAgLyogZm9yYmlkZGVuX3plcm9fYml0IChub3QgY2hlY2tlZCB0byBiZSB6ZXJvLCBlcnJvcnMgaWdub3JlZCkgKi8KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgIC8qIEFzc3VtaW5nIHRoYXQgTkFMIHVuaXQgc3RhcnRzIGZyb20gYnl0ZSBib3VuZGFyeSCtPiBkb24ndCBoYXZlIHRvIGNoZWNrCi0gICAgICogZm9sbG93aW5nIDcgYml0cyBmb3IgRU5EX09GX1NUUkVBTSAqLwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAyKTsKLSAgICBwTmFsVW5pdC0+bmFsUmVmSWRjID0gdG1wOwotCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA1KTsKLSAgICBwTmFsVW5pdC0+bmFsVW5pdFR5cGUgPSAobmFsVW5pdFR5cGVfZSl0bXA7Ci0KLSAgICAvKiBkYXRhIHBhcnRpdGlvbmluZyBOQUwgdW5pdHMgbm90IHN1cHBvcnRlZCAqLwotICAgIGlmICggKHRtcCA9PSAyKSB8fCAodG1wID09IDMpIHx8ICh0bXAgPT0gNCkgKQotICAgIHsKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIH0KLQotICAgIC8qIG5hbF9yZWZfaWRjIHNoYWxsIG5vdCBiZSB6ZXJvIGZvciB0aGVzZSBuYWxfdW5pdF90eXBlcyAqLwotICAgIGlmICggKCAodG1wID09IE5BTF9TRVFfUEFSQU1fU0VUKSB8fCAodG1wID09IE5BTF9QSUNfUEFSQU1fU0VUKSB8fAotICAgICAgICAgICAodG1wID09IE5BTF9DT0RFRF9TTElDRV9JRFIpICkgJiYgKHBOYWxVbml0LT5uYWxSZWZJZGMgPT0gMCkgKQotICAgIHsKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIH0KLSAgICAvKiBuYWxfcmVmX2lkYyBzaGFsbCBiZSB6ZXJvIGZvciB0aGVzZSBuYWxfdW5pdF90eXBlcyAqLwotICAgIGVsc2UgaWYgKCAoICh0bXAgPT0gTkFMX1NFSSkgfHwgKHRtcCA9PSBOQUxfQUNDRVNTX1VOSVRfREVMSU1JVEVSKSB8fAotICAgICAgICAgICAgICAgICh0bXAgPT0gTkFMX0VORF9PRl9TRVFVRU5DRSkgfHwgKHRtcCA9PSBOQUxfRU5EX09GX1NUUkVBTSkgfHwKLSAgICAgICAgICAgICAgICAodG1wID09IE5BTF9GSUxMRVJfREFUQSkgKSAmJiAocE5hbFVuaXQtPm5hbFJlZklkYyAhPSAwKSApCi0gICAgewotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgfQotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX25hbF91bml0LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbmFsX3VuaXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg5NTdiZi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbmFsX3VuaXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0gICAgMy4gRGF0YSB0eXBlcwotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBIMjY0U1dERUNfTkFMX1VOSVRfSAotI2RlZmluZSBIMjY0U1dERUNfTkFMX1VOSVRfSAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImJhc2V0eXBlLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9zdHJlYW0uaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogbWFjcm8gdG8gZGV0ZXJtaW5lIGlmIE5BTCB1bml0IHBvaW50ZWQgYnkgcE5hbFVuaXQgY29udGFpbnMgYW4gSURSIHNsaWNlICovCi0jZGVmaW5lIElTX0lEUl9OQUxfVU5JVChwTmFsVW5pdCkgXAotICAgICgocE5hbFVuaXQpLT5uYWxVbml0VHlwZSA9PSBOQUxfQ09ERURfU0xJQ0VfSURSKQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIERhdGEgdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgTkFMX0NPREVEX1NMSUNFID0gMSwKLSAgICBOQUxfQ09ERURfU0xJQ0VfSURSID0gNSwKLSAgICBOQUxfU0VJID0gNiwKLSAgICBOQUxfU0VRX1BBUkFNX1NFVCA9IDcsCi0gICAgTkFMX1BJQ19QQVJBTV9TRVQgPSA4LAotICAgIE5BTF9BQ0NFU1NfVU5JVF9ERUxJTUlURVIgPSA5LAotICAgIE5BTF9FTkRfT0ZfU0VRVUVOQ0UgPSAxMCwKLSAgICBOQUxfRU5EX09GX1NUUkVBTSA9IDExLAotICAgIE5BTF9GSUxMRVJfREFUQSA9IDEyLAotICAgIE5BTF9NQVhfVFlQRV9WQUxVRSA9IDMxCi19IG5hbFVuaXRUeXBlX2U7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgbmFsVW5pdFR5cGVfZSBuYWxVbml0VHlwZTsKLSAgICB1MzIgbmFsUmVmSWRjOwotfSBuYWxVbml0X3Q7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2REZWNvZGVOYWxVbml0KHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgbmFsVW5pdF90ICpwTmFsVW5pdCk7Ci0KLSNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX05BTF9VTklUX0ggKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX25laWdoYm91ci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX25laWdoYm91ci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTVlZWZmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9uZWlnaGJvdXIuYworKysgL2Rldi9udWxsCkBAIC0xLDM4MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0gICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0gICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLSAgICAgNS4gRnVuY3Rpb25zCi0gICAgICAgICAgaDI2NGJzZEluaXRNYk5laWdoYm91cnMKLSAgICAgICAgICBoMjY0YnNkR2V0TmVpZ2hib3VyTWIKLSAgICAgICAgICBoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tBCi0gICAgICAgICAgaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrQgotICAgICAgICAgIGgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0MKLSAgICAgICAgICBoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tECi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiaDI2NGJzZF9uZWlnaGJvdXIuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogRm9sbG93aW5nIGZvdXIgdGFibGVzIGluZGljYXRlIG5laWdoYm91cnMgb2YgZWFjaCBibG9jayBvZiBhIG1hY3JvYmxvY2suCi0gKiBGaXJzdCAxNiB2YWx1ZXMgYXJlIGZvciBsdW1hIGJsb2NrcywgbmV4dCA0IHZhbHVlcyBmb3IgQ2IgYW5kIGxhc3QgNAotICogdmFsdWVzIGZvciBDci4gRWxlbWVudHMgb2YgdGhlIHRhYmxlIGluZGljYXRlIHRvIHdoaWNoIG1hY3JvYmxvY2sgdGhlCi0gKiBuZWlnaGJvdXIgYmxvY2sgYmVsb25ncyBhbmQgdGhlIGluZGV4IG9mIHRoZSBuZWlnaGJvdXIgYmxvY2sgaW4gcXVlc3Rpb24uCi0gKiBJbmRleGluZyBvZiB0aGUgYmxvY2tzIGdvZXMgYXMgZm9sbG93cwotICoKLSAqICAgICAgICAgIFkgICAgICAgICAgICAgQ2IgICAgICAgQ3IKLSAqICAgICAgMCAgMSAgNCAgNSAgICAgIDE2IDE3ICAgIDIwIDIxCi0gKiAgICAgIDIgIDMgIDYgIDcgICAgICAxOCAxOSAgICAyMiAyMwotICogICAgICA4ICA5IDEyIDEzCi0gKiAgICAgMTAgMTEgMTQgMTUKLSAqLwotCi0vKiBsZWZ0IG5laWdoYm91ciBmb3IgZWFjaCBibG9jayAqLwotc3RhdGljIGNvbnN0IG5laWdoYm91cl90IE5fQV80eDRCWzI0XSA9IHsKLSAgICB7TUJfQSw1fSwgICAge01CX0NVUlIsMH0sIHtNQl9BLDd9LCAgICB7TUJfQ1VSUiwyfSwKLSAgICB7TUJfQ1VSUiwxfSwge01CX0NVUlIsNH0sIHtNQl9DVVJSLDN9LCB7TUJfQ1VSUiw2fSwKLSAgICB7TUJfQSwxM30sICAge01CX0NVUlIsOH0sIHtNQl9BLDE1fSwgICB7TUJfQ1VSUiwxMH0sCi0gICAge01CX0NVUlIsOX0sIHtNQl9DVVJSLDEyfSx7TUJfQ1VSUiwxMX0se01CX0NVUlIsMTR9LAotICAgIHtNQl9BLDE3fSwgICB7TUJfQ1VSUiwxNn0se01CX0EsMTl9LCAgIHtNQl9DVVJSLDE4fSwKLSAgICB7TUJfQSwyMX0sICAge01CX0NVUlIsMjB9LHtNQl9BLDIzfSwgICB7TUJfQ1VSUiwyMn0gfTsKLQotLyogYWJvdmUgbmVpZ2hib3VyIGZvciBlYWNoIGJsb2NrICovCi1zdGF0aWMgY29uc3QgbmVpZ2hib3VyX3QgTl9CXzR4NEJbMjRdID0gewotICAgIHtNQl9CLDEwfSwgICB7TUJfQiwxMX0sICAge01CX0NVUlIsMH0sIHtNQl9DVVJSLDF9LAotICAgIHtNQl9CLDE0fSwgICB7TUJfQiwxNX0sICAge01CX0NVUlIsNH0sIHtNQl9DVVJSLDV9LAotICAgIHtNQl9DVVJSLDJ9LCB7TUJfQ1VSUiwzfSwge01CX0NVUlIsOH0sIHtNQl9DVVJSLDl9LAotICAgIHtNQl9DVVJSLDZ9LCB7TUJfQ1VSUiw3fSwge01CX0NVUlIsMTJ9LHtNQl9DVVJSLDEzfSwKLSAgICB7TUJfQiwxOH0sICAge01CX0IsMTl9LCAgIHtNQl9DVVJSLDE2fSx7TUJfQ1VSUiwxN30sCi0gICAge01CX0IsMjJ9LCAgIHtNQl9CLDIzfSwgICB7TUJfQ1VSUiwyMH0se01CX0NVUlIsMjF9IH07Ci0KLS8qIGFib3ZlLXJpZ2h0IG5laWdoYm91ciBmb3IgZWFjaCBibG9jayAqLwotc3RhdGljIGNvbnN0IG5laWdoYm91cl90IE5fQ180eDRCWzI0XSA9IHsKLSAgICB7TUJfQiwxMX0sICAge01CX0IsMTR9LCAgIHtNQl9DVVJSLDF9LCB7TUJfTkEsNH0sCi0gICAge01CX0IsMTV9LCAgIHtNQl9DLDEwfSwgICB7TUJfQ1VSUiw1fSwge01CX05BLDB9LAotICAgIHtNQl9DVVJSLDN9LCB7TUJfQ1VSUiw2fSwge01CX0NVUlIsOX0sIHtNQl9OQSwxMn0sCi0gICAge01CX0NVUlIsN30sIHtNQl9OQSwyfSwgICB7TUJfQ1VSUiwxM30se01CX05BLDh9LAotICAgIHtNQl9CLDE5fSwgICB7TUJfQywxOH0sICAge01CX0NVUlIsMTd9LHtNQl9OQSwxNn0sCi0gICAge01CX0IsMjN9LCAgIHtNQl9DLDIyfSwgICB7TUJfQ1VSUiwyMX0se01CX05BLDIwfSB9OwotCi0vKiBhYm92ZS1sZWZ0IG5laWdoYm91ciBmb3IgZWFjaCBibG9jayAqLwotc3RhdGljIGNvbnN0IG5laWdoYm91cl90IE5fRF80eDRCWzI0XSA9IHsKLSAgICB7TUJfRCwxNX0sICAge01CX0IsMTB9LCAgIHtNQl9BLDV9LCAgICB7TUJfQ1VSUiwwfSwKLSAgICB7TUJfQiwxMX0sICAge01CX0IsMTR9LCAgIHtNQl9DVVJSLDF9LCB7TUJfQ1VSUiw0fSwKLSAgICB7TUJfQSw3fSwgICAge01CX0NVUlIsMn0sIHtNQl9BLDEzfSwgICB7TUJfQ1VSUiw4fSwKLSAgICB7TUJfQ1VSUiwzfSwge01CX0NVUlIsNn0sIHtNQl9DVVJSLDl9LCB7TUJfQ1VSUiwxMn0sCi0gICAge01CX0QsMTl9LCAgIHtNQl9CLDE4fSwgICB7TUJfQSwxN30sICAge01CX0NVUlIsMTZ9LAotICAgIHtNQl9ELDIzfSwgICB7TUJfQiwyMn0sICAge01CX0EsMjF9LCAgIHtNQl9DVVJSLDIwfSB9OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZEluaXRNYk5laWdoYm91cnMKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgSW5pdGlhbGl6ZSBtYWNyb2Jsb2NrIG5laWdoYm91cnMuIEZ1bmN0aW9uIHNldHMgbmVpZ2hib3VyCi0gICAgICAgICAgICBtYWNyb2Jsb2NrIHBvaW50ZXJzIGluIG1hY3JvYmxvY2sgc3RydWN0dXJlcyB0byBwb2ludCB0bwotICAgICAgICAgICAgbWFjcm9ibG9ja3Mgb24gdGhlIGxlZnQsIGFib3ZlLCBhYm92ZS1yaWdodCBhbmQgYWJvdmUtbGVmdC4KLSAgICAgICAgICAgIFBvaW50ZXJzIGFyZSBzZXQgTlVMTCBpZiB0aGUgbmVpZ2hib3VyIGRvZXMgbm90IGZpdCBpbnRvIHRoZQotICAgICAgICAgICAgcGljdHVyZS4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwaWNXaWR0aCAgICAgICAgd2lkdGggb2YgdGhlIHBpY3R1cmUgaW4gbWFjcm9ibG9ja3MKLSAgICAgICAgICAgIHBpY1NpemVJbk1icyAgICBubyBuZWVkIHRvIGNsYXJpZnkKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgcE1iU3RvcmFnZSAgICAgIG5laWdoYm91ciBwb2ludGVycyBvZiBlYWNoIG1iU3RvcmFnZSBzdHJ1Y3R1cmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZWQgaGVyZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBub25lCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgaDI2NGJzZEluaXRNYk5laWdoYm91cnMobWJTdG9yYWdlX3QgKnBNYlN0b3JhZ2UsIHUzMiBwaWNXaWR0aCwKLSAgICB1MzIgcGljU2l6ZUluTWJzKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpLCByb3csIGNvbDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBNYlN0b3JhZ2UpOwotICAgIEFTU0VSVChwaWNXaWR0aCk7Ci0gICAgQVNTRVJUKHBpY1dpZHRoIDw9IHBpY1NpemVJbk1icyk7Ci0gICAgQVNTRVJUKCgocGljU2l6ZUluTWJzIC8gcGljV2lkdGgpICogcGljV2lkdGgpID09IHBpY1NpemVJbk1icyk7Ci0KLSAgICByb3cgPSBjb2wgPSAwOwotCi0gICAgZm9yIChpID0gMDsgaSA8IHBpY1NpemVJbk1iczsgaSsrKQotICAgIHsKLQotICAgICAgICBpZiAoY29sKQotICAgICAgICAgICAgcE1iU3RvcmFnZVtpXS5tYkEgPSBwTWJTdG9yYWdlICsgaSAtIDE7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHBNYlN0b3JhZ2VbaV0ubWJBID0gTlVMTDsKLQotICAgICAgICBpZiAocm93KQotICAgICAgICAgICAgcE1iU3RvcmFnZVtpXS5tYkIgPSBwTWJTdG9yYWdlICsgaSAtIHBpY1dpZHRoOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBwTWJTdG9yYWdlW2ldLm1iQiA9IE5VTEw7Ci0KLSAgICAgICAgaWYgKHJvdyAmJiAoY29sIDwgcGljV2lkdGggLSAxKSkKLSAgICAgICAgICAgIHBNYlN0b3JhZ2VbaV0ubWJDID0gcE1iU3RvcmFnZSArIGkgLSAocGljV2lkdGggLSAxKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcE1iU3RvcmFnZVtpXS5tYkMgPSBOVUxMOwotCi0gICAgICAgIGlmIChyb3cgJiYgY29sKQotICAgICAgICAgICAgcE1iU3RvcmFnZVtpXS5tYkQgPSBwTWJTdG9yYWdlICsgaSAtIChwaWNXaWR0aCArIDEpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBwTWJTdG9yYWdlW2ldLm1iRCA9IE5VTEw7Ci0KLSAgICAgICAgY29sKys7Ci0gICAgICAgIGlmIChjb2wgPT0gcGljV2lkdGgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbCA9IDA7Ci0gICAgICAgICAgICByb3crKzsKLSAgICAgICAgfQotICAgIH0KLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RHZXROZWlnaGJvdXJNYgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBHZXQgcG9pbnRlciB0byBuZWlnaGJvdXIgbWFjcm9ibG9jay4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwTWIgICAgICAgICBwb2ludGVyIHRvIG1hY3JvYmxvY2sgc3RydWN0dXJlIG9mIHRoZSBtYWNyb2Jsb2NrCi0gICAgICAgICAgICAgICAgICAgICAgICB3aG9zZSBuZWlnaGJvdXIgaXMgd2FudGVkCi0gICAgICAgICAgICBuZWlnaGJvdXIgICBpbmRpY2F0ZXMgd2hpY2ggbmVpZ2hib3VyIGlzIHdhbnRlZAotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBub25lCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIHBvaW50ZXIgdG8gbmVpZ2hib3VyIG1hY3JvYmxvY2sKLSAgICAgICAgICAgIE5VTEwgaWYgbm90IGF2YWlsYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1tYlN0b3JhZ2VfdCogaDI2NGJzZEdldE5laWdoYm91ck1iKG1iU3RvcmFnZV90ICpwTWIsIG5laWdoYm91ck1iX2UgbmVpZ2hib3VyKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoKG5laWdoYm91ciA8PSBNQl9DVVJSKSB8fCAobmVpZ2hib3VyID09IE1CX05BKSk7Ci0KLSAgICBpZiAobmVpZ2hib3VyID09IE1CX0EpCi0gICAgICAgIHJldHVybihwTWItPm1iQSk7Ci0gICAgZWxzZSBpZiAobmVpZ2hib3VyID09IE1CX0IpCi0gICAgICAgIHJldHVybihwTWItPm1iQik7Ci0gICAgZWxzZSBpZiAobmVpZ2hib3VyID09IE1CX0MpCi0gICAgICAgIHJldHVybihwTWItPm1iQyk7Ci0gICAgZWxzZSBpZiAobmVpZ2hib3VyID09IE1CX0QpCi0gICAgICAgIHJldHVybihwTWItPm1iRCk7Ci0gICAgZWxzZSBpZiAobmVpZ2hib3VyID09IE1CX0NVUlIpCi0gICAgICAgIHJldHVybihwTWIpOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuKE5VTEwpOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrQQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBHZXQgbGVmdCBuZWlnaGJvdXIgb2YgdGhlIGJsb2NrLiBGdW5jdGlvbiByZXR1cm5zIHBvaW50ZXIgdG8KLSAgICAgICAgICAgIHRoZSB0YWJsZSBkZWZpbmVkIGluIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgYmxvY2tJbmRleCAgaW5kaWNhdGVzIHRoZSBibG9jayB3aG9zZSBuZWlnaGJvdXJzIGFyZSB3YW50ZWQKLQotICAgICAgICBPdXRwdXRzOgotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBwb2ludGVyIHRvIG5laWdoYm91ciBzdHJ1Y3R1cmUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotY29uc3QgbmVpZ2hib3VyX3QqIGgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0EodTMyIGJsb2NrSW5kZXgpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoYmxvY2tJbmRleCA8IDI0KTsKLQotICAgIHJldHVybihOX0FfNHg0QitibG9ja0luZGV4KTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0IKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgR2V0IGFib3ZlIG5laWdoYm91ciBvZiB0aGUgYmxvY2suIEZ1bmN0aW9uIHJldHVybnMgcG9pbnRlciB0bwotICAgICAgICAgICAgdGhlIHRhYmxlIGRlZmluZWQgaW4gdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZS4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBibG9ja0luZGV4ICBpbmRpY2F0ZXMgdGhlIGJsb2NrIHdob3NlIG5laWdoYm91cnMgYXJlIHdhbnRlZAotCi0gICAgICAgIE91dHB1dHM6Ci0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIHBvaW50ZXIgdG8gbmVpZ2hib3VyIHN0cnVjdHVyZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1jb25zdCBuZWlnaGJvdXJfdCogaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrQih1MzIgYmxvY2tJbmRleCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChibG9ja0luZGV4IDwgMjQpOwotCi0gICAgcmV0dXJuKE5fQl80eDRCK2Jsb2NrSW5kZXgpOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrQwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBHZXQgYWJvdmUtcmlnaHQgIG5laWdoYm91ciBvZiB0aGUgYmxvY2suIEZ1bmN0aW9uIHJldHVybnMgcG9pbnRlcgotICAgICAgICAgICAgdG8gdGhlIHRhYmxlIGRlZmluZWQgaW4gdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZS4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBibG9ja0luZGV4ICBpbmRpY2F0ZXMgdGhlIGJsb2NrIHdob3NlIG5laWdoYm91cnMgYXJlIHdhbnRlZAotCi0gICAgICAgIE91dHB1dHM6Ci0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIHBvaW50ZXIgdG8gbmVpZ2hib3VyIHN0cnVjdHVyZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1jb25zdCBuZWlnaGJvdXJfdCogaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrQyh1MzIgYmxvY2tJbmRleCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChibG9ja0luZGV4IDwgMjQpOwotCi0gICAgcmV0dXJuKE5fQ180eDRCK2Jsb2NrSW5kZXgpOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrRAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBHZXQgYWJvdmUtbGVmdCBuZWlnaGJvdXIgb2YgdGhlIGJsb2NrLiBGdW5jdGlvbiByZXR1cm5zIHBvaW50ZXIgdG8KLSAgICAgICAgICAgIHRoZSB0YWJsZSBkZWZpbmVkIGluIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgYmxvY2tJbmRleCAgaW5kaWNhdGVzIHRoZSBibG9jayB3aG9zZSBuZWlnaGJvdXJzIGFyZSB3YW50ZWQKLQotICAgICAgICBPdXRwdXRzOgotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBwb2ludGVyIHRvIG5laWdoYm91ciBzdHJ1Y3R1cmUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotY29uc3QgbmVpZ2hib3VyX3QqIGgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0QodTMyIGJsb2NrSW5kZXgpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoYmxvY2tJbmRleCA8IDI0KTsKLQotICAgIHJldHVybihOX0RfNHg0QitibG9ja0luZGV4KTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBDaGVjayBpZiBuZWlnaGJvdXIgbWFjcm9ibG9jayBpcyBhdmFpbGFibGUuIE5laWdoYm91ciBtYWNyb2Jsb2NrCi0gICAgICAgICAgICBpcyBjb25zaWRlcmVkIGF2YWlsYWJsZSBpZiBpdCBpcyB3aXRoaW4gdGhlIHBpY3R1cmUgYW5kIGJlbG9uZ3MKLSAgICAgICAgICAgIHRvIHRoZSBzYW1lIHNsaWNlIGFzIHRoZSBjdXJyZW50IG1hY3JvYmxvY2suCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcE1iICAgICAgICAgcG9pbnRlciB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrCi0gICAgICAgICAgICBwTmVpZ2hib3VyICBwb2ludGVyIHRvIHRoZSBuZWlnaGJvdXIgbWFjcm9ibG9jawotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBub25lCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIFRSVUUgICAgbmVpZ2hib3VyIGlzIGF2YWlsYWJsZQotICAgICAgICAgICAgRkFMU0UgICBuZWlnaGJvdXIgaXMgbm90IGF2YWlsYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKG1iU3RvcmFnZV90ICpwTWIsIG1iU3RvcmFnZV90ICpwTmVpZ2hib3VyKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotLyogQ29kZSAqLwotCi0gICAgaWYgKCAocE5laWdoYm91ciA9PSBOVUxMKSB8fCAocE1iLT5zbGljZUlkICE9IHBOZWlnaGJvdXItPnNsaWNlSWQpICkKLSAgICAgICAgcmV0dXJuKEhBTlRST19GQUxTRSk7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4oSEFOVFJPX1RSVUUpOwotCi19Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9uZWlnaGJvdXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9uZWlnaGJvdXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNlMGFkMS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbmVpZ2hib3VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotICAgIDMuIERhdGEgdHlwZXMKLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgSDI2NFNXREVDX05FSUdIQk9VUl9ICi0jZGVmaW5lIEgyNjRTV0RFQ19ORUlHSEJPVVJfSAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImJhc2V0eXBlLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9tYWNyb2Jsb2NrX2xheWVyLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgTUJfQSA9IDAsCi0gICAgTUJfQiwKLSAgICBNQl9DLAotICAgIE1CX0QsCi0gICAgTUJfQ1VSUiwKLSAgICBNQl9OQSA9IDB4RkYKLX0gbmVpZ2hib3VyTWJfZTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBEYXRhIHR5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIG5laWdoYm91ck1iX2UgICBtYjsKLSAgICB1OCAgICAgICAgICAgICBpbmRleDsKLX0gbmVpZ2hib3VyX3Q7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBoMjY0YnNkSW5pdE1iTmVpZ2hib3VycyhtYlN0b3JhZ2VfdCAqcE1iU3RvcmFnZSwgdTMyIHBpY1dpZHRoLAotICAgIHUzMiBwaWNTaXplSW5NYnMpOwotCi1tYlN0b3JhZ2VfdCogaDI2NGJzZEdldE5laWdoYm91ck1iKG1iU3RvcmFnZV90ICpwTWIsIG5laWdoYm91ck1iX2UgbmVpZ2hib3VyKTsKLQotdTMyIGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShtYlN0b3JhZ2VfdCAqcE1iLCBtYlN0b3JhZ2VfdCAqcE5laWdoYm91cik7Ci0KLWNvbnN0IG5laWdoYm91cl90KiBoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tBKHUzMiBibG9ja0luZGV4KTsKLWNvbnN0IG5laWdoYm91cl90KiBoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tCKHUzMiBibG9ja0luZGV4KTsKLWNvbnN0IG5laWdoYm91cl90KiBoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tDKHUzMiBibG9ja0luZGV4KTsKLWNvbnN0IG5laWdoYm91cl90KiBoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tEKHUzMiBibG9ja0luZGV4KTsKLQotI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfTkVJR0hCT1VSX0ggKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3BpY19vcmRlcl9jbnQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9waWNfb3JkZXJfY250LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMjMzNTIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3BpY19vcmRlcl9jbnQuYworKysgL2Rldi9udWxsCkBAIC0xLDM0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0gICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0gICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLSAgICAgNS4gRnVuY3Rpb25zCi0gICAgICAgICAgaDI2NGJzZERlY29kZVBpY09yZGVyQ250Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9waWNfb3JkZXJfY250LmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkRGVjb2RlUGljT3JkZXJDbnQKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgQ29tcHV0ZSBwaWN0dXJlIG9yZGVyIGNvdW50IGZvciBhIHBpY3R1cmUuIEZ1bmN0aW9uIGltcGxlbWVudHMKLSAgICAgICAgICAgIGNvbXB1dGF0aW9uIG9mIGFsbCBQT0MgdHlwZXMgKDAsIDEgYW5kIDIpLCB0eXBlIGlzIG9idGFpbmVkIGZyb20KLSAgICAgICAgICAgIHNwcy4gU2VlIHN0YW5kYXJkIGZvciBkZXNjcmlwdGlvbiBvZiB0aGUgUE9DIHR5cGVzIGFuZCBob3cgUE9DIGlzCi0gICAgICAgICAgICBjb21wdXRlZCBmb3IgZWFjaCB0eXBlLgotCi0gICAgICAgICAgICBGdW5jdGlvbiByZXR1cm5zIHRoZSBtaW5pbXVtIG9mIHRvcCBmaWVsZCBhbmQgYm90dG9tIGZpZWxkIHBpYwotICAgICAgICAgICAgb3JkZXIgY291bnRzLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBvYyAgICAgICAgIHBvaW50ZXIgdG8gcHJldmlvdXMgcmVzdWx0cwotICAgICAgICAgICAgc3BzICAgICAgICAgcG9pbnRlciB0byBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0Ci0gICAgICAgICAgICBzbGljSGVhZGVyICBwb2ludGVyIHRvIGN1cnJlbnQgc2xpY2UgaGVhZGVyLCBmcmFtZSBudW1iZXIgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICBvdGhlciBwYXJhbXMgbmVlZGVkIGZvciBQT0MgY29tcHV0YXRpb24KLSAgICAgICAgICAgIHBOYWxVbml0ICAgIHBvaW50ZXIgdG8gY3VycmVudCBOQUwgdW5pdCBzdHJ1Y3RydWUsIGZ1bmN0aW9uIG5lZWRzCi0gICAgICAgICAgICAgICAgICAgICAgICB0byBrbm93IGlmIHRoaXMgaXMgYW4gSURSIHBpY3R1cmUgYW5kIGFsc28gaWYgdGhpcyBpcwotICAgICAgICAgICAgICAgICAgICAgICAgYSByZWZlcmVuY2UgcGljdHVyZQotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBwb2MgICAgICAgICByZXN1bHRzIHN0b3JlZCBoZXJlIGZvciBjb21wdXRhdGlvbiBvZiBuZXh0IFBPQwotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBwaWN0dXJlIG9yZGVyIGNvdW50Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLWkzMiBoMjY0YnNkRGVjb2RlUGljT3JkZXJDbnQocG9jU3RvcmFnZV90ICpwb2MsIHNlcVBhcmFtU2V0X3QgKnNwcywKLSAgICBzbGljZUhlYWRlcl90ICpwU2xpY2VIZWFkZXIsIG5hbFVuaXRfdCAqcE5hbFVuaXQpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGk7Ci0gICAgaTMyIHBpY09yZGVyQ250OwotICAgIHUzMiBmcmFtZU51bU9mZnNldCwgYWJzRnJhbWVOdW0sIHBpY09yZGVyQ250Q3ljbGVDbnQ7Ci0gICAgdTMyIGZyYW1lTnVtSW5QaWNPcmRlckNudEN5Y2xlOwotICAgIGkzMiBleHBlY3RlZERlbHRhUGljT3JkZXJDbnRDeWNsZTsKLSAgICB1MzIgY29udGFpbnNNbWNvNTsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBvYyk7Ci0gICAgQVNTRVJUKHNwcyk7Ci0gICAgQVNTRVJUKHBTbGljZUhlYWRlcik7Ci0gICAgQVNTRVJUKHBOYWxVbml0KTsKLSAgICBBU1NFUlQoc3BzLT5waWNPcmRlckNudFR5cGUgPD0gMik7Ci0KLSNpZiAwCi0gICAgLyogSmFuU2E6IEkgZG9uJ3QgdGhpbmsgdGhpcyBpcyBuZWNlc3NhcnksIGRvbid0IHNlZSBhbnkgcmVhc29uIHRvCi0gICAgICogaW5jcmVtZW50IHByZXZGcmFtZU51bSBvbmUgYnkgb25lIGluc3RlYWQgb2Ygb25lIGJpZyBpbmNyZW1lbnQuCi0gICAgICogSG93ZXZlciwgc3RhbmRhcmQgc3BlY2lmaWVzIHRoYXQgdGhpcyBzaG91bGQgYmUgZG9uZSAtPiBpZiBzb21lb25lCi0gICAgICogZmlndXJlcyBvdXQgYW55IGNhc2Ugd2hlbiB0aGUgb3V0Y29tZSB3b3VsZCBiZSBkaWZmZXJlbnQgZm9yIHN0ZXAgYnkKLSAgICAgKiBzdGVwIGluY3JlbWVudCwgdGhpcyBwYXJ0IG9mIHRoZSBjb2RlIHNob3VsZCBiZSBlbmFibGVkICovCi0KLSAgICAvKiBpZiB0aGVyZSB3YXMgYSBnYXAgaW4gZnJhbWUgbnVtYmVyaW5nIGFuZCBwaWNPcmRlckNudFR5cGUgaXMgMSBvciAyIC0+Ci0gICAgICogImNvbXB1dGUiIHBpYyBvcmRlciBjb3VudHMgZm9yIG5vbi1leGlzdGluZyBmcmFtZXMuIFRoZXNlIGFyZSBub3QKLSAgICAgKiBhY3R1YWxseSBjb21wdXRlZCwgYnV0IHByb2Nlc3MgbmVlZHMgdG8gYmUgZG9uZSB0byB1cGRhdGUgdGhlCi0gICAgICogcHJldkZyYW1lTnVtIGFuZCBwcmV2RnJhbWVOdW1PZmZzZXQgKi8KLSAgICBpZiAoIHNwcy0+cGljT3JkZXJDbnRUeXBlID4gMCAmJgotICAgICAgICAgcFNsaWNlSGVhZGVyLT5mcmFtZU51bSAhPSBwb2MtPnByZXZGcmFtZU51bSAmJgotICAgICAgICAgcFNsaWNlSGVhZGVyLT5mcmFtZU51bSAhPSAoKHBvYy0+cHJldkZyYW1lTnVtICsgMSkgJSBzcHMtPm1heEZyYW1lTnVtKSkKLSAgICB7Ci0KLSAgICAgICAgLyogdXNlIHZhcmlhYmxlIGkgZm9yIHVuVXNlZFNob3J0VGVybUZyYW1lTnVtICovCi0gICAgICAgIGkgPSAocG9jLT5wcmV2RnJhbWVOdW0gKyAxKSAlIHNwcy0+bWF4RnJhbWVOdW07Ci0KLSAgICAgICAgZG8KLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHBvYy0+cHJldkZyYW1lTnVtID4gaSkKLSAgICAgICAgICAgICAgICBmcmFtZU51bU9mZnNldCA9IHBvYy0+cHJldkZyYW1lTnVtT2Zmc2V0ICsgc3BzLT5tYXhGcmFtZU51bTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBmcmFtZU51bU9mZnNldCA9IHBvYy0+cHJldkZyYW1lTnVtT2Zmc2V0OwotCi0gICAgICAgICAgICBwb2MtPnByZXZGcmFtZU51bU9mZnNldCA9IGZyYW1lTnVtT2Zmc2V0OwotICAgICAgICAgICAgcG9jLT5wcmV2RnJhbWVOdW0gPSBpOwotCi0gICAgICAgICAgICBpID0gKGkgKyAxKSAlIHNwcy0+bWF4RnJhbWVOdW07Ci0KLSAgICAgICAgfSB3aGlsZSAoaSAhPSBwU2xpY2VIZWFkZXItPmZyYW1lTnVtKTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIC8qIGNoZWNrIGlmIGN1cnJlbnQgc2xpY2UgaW5jbHVkZXMgbW1jbyBlcXVhbCB0byA1ICovCi0gICAgY29udGFpbnNNbWNvNSA9IEhBTlRST19GQUxTRTsKLSAgICBpZiAocFNsaWNlSGVhZGVyLT5kZWNSZWZQaWNNYXJraW5nLmFkYXB0aXZlUmVmUGljTWFya2luZ01vZGVGbGFnKQotICAgIHsKLSAgICAgICAgaSA9IDA7Ci0gICAgICAgIHdoaWxlIChwU2xpY2VIZWFkZXItPmRlY1JlZlBpY01hcmtpbmcub3BlcmF0aW9uW2ldLgotICAgICAgICAgICAgbWVtb3J5TWFuYWdlbWVudENvbnRyb2xPcGVyYXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwU2xpY2VIZWFkZXItPmRlY1JlZlBpY01hcmtpbmcub3BlcmF0aW9uW2ldLgotICAgICAgICAgICAgICAgIG1lbW9yeU1hbmFnZW1lbnRDb250cm9sT3BlcmF0aW9uID09IDUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGFpbnNNbWNvNSA9IEhBTlRST19UUlVFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaSsrOwotICAgICAgICB9Ci0gICAgfQotICAgIHN3aXRjaCAoc3BzLT5waWNPcmRlckNudFR5cGUpCi0gICAgewotCi0gICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIC8qIHNldCBwcmV2UGljT3JkZXJDbnQgdmFsdWVzIGZvciBJRFIgZnJhbWUgKi8KLSAgICAgICAgICAgIGlmIChJU19JRFJfTkFMX1VOSVQocE5hbFVuaXQpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBvYy0+cHJldlBpY09yZGVyQ250TXNiID0gMDsKLSAgICAgICAgICAgICAgICBwb2MtPnByZXZQaWNPcmRlckNudExzYiA9IDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIGNvbXB1dGUgcGljT3JkZXJDbnRNc2IgKHN0b3JlZCBpbiBwaWNPcmRlckNudCB2YXJpYWJsZSkgKi8KLSAgICAgICAgICAgIGlmICggKHBTbGljZUhlYWRlci0+cGljT3JkZXJDbnRMc2IgPCBwb2MtPnByZXZQaWNPcmRlckNudExzYikgJiYKLSAgICAgICAgICAgICAgICAoKHBvYy0+cHJldlBpY09yZGVyQ250THNiIC0gcFNsaWNlSGVhZGVyLT5waWNPcmRlckNudExzYikgPj0KLSAgICAgICAgICAgICAgICAgc3BzLT5tYXhQaWNPcmRlckNudExzYi8yKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcGljT3JkZXJDbnQgPSBwb2MtPnByZXZQaWNPcmRlckNudE1zYiArCi0gICAgICAgICAgICAgICAgICAgIChpMzIpc3BzLT5tYXhQaWNPcmRlckNudExzYjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKChwU2xpY2VIZWFkZXItPnBpY09yZGVyQ250THNiID4gcG9jLT5wcmV2UGljT3JkZXJDbnRMc2IpICYmCi0gICAgICAgICAgICAgICAgKChwU2xpY2VIZWFkZXItPnBpY09yZGVyQ250THNiIC0gcG9jLT5wcmV2UGljT3JkZXJDbnRMc2IpID4KLSAgICAgICAgICAgICAgICAgc3BzLT5tYXhQaWNPcmRlckNudExzYi8yKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcGljT3JkZXJDbnQgPSBwb2MtPnByZXZQaWNPcmRlckNudE1zYiAtCi0gICAgICAgICAgICAgICAgICAgIChpMzIpc3BzLT5tYXhQaWNPcmRlckNudExzYjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBwaWNPcmRlckNudCA9IHBvYy0+cHJldlBpY09yZGVyQ250TXNiOwotCi0gICAgICAgICAgICAvKiBzdGFuZGFyZCBzcGVjaWZpZXMgdGhhdCBwcmV2UGljT3JkZXJDbnRNc2IgaXMgZnJvbSBwcmV2aW91cwotICAgICAgICAgICAgICogcmVyZXJlbmNlIGZyYW1lIC0+IHJlcGxhY2Ugb2xkIHZhbHVlIG9ubHkgaWYgY3VycmVudCBmcmFtZSBpcwotICAgICAgICAgICAgICogcmVyZXJlbmNlIGZyYW1lICovCi0gICAgICAgICAgICBpZiAocE5hbFVuaXQtPm5hbFJlZklkYykKLSAgICAgICAgICAgICAgICBwb2MtPnByZXZQaWNPcmRlckNudE1zYiA9IHBpY09yZGVyQ250OwotCi0gICAgICAgICAgICAvKiBjb21wdXRlIHRvcCBmaWVsZCBvcmRlciBjbnQgKHN0b3JlZCBpbiBwaWNPcmRlckNudCkgKi8KLSAgICAgICAgICAgIHBpY09yZGVyQ250ICs9IChpMzIpcFNsaWNlSGVhZGVyLT5waWNPcmRlckNudExzYjsKLQotICAgICAgICAgICAgLyogaWYgZGVsdGEgZm9yIGJvdHRvbSBmaWVsZCBpcyBuZWdhdGl2ZSAtPiBib3R0b20gd2lsbCBiZSB0aGUKLSAgICAgICAgICAgICAqIG1pbmltdW0gcGljIG9yZGVyIGNvdW50ICovCi0gICAgICAgICAgICBpZiAocFNsaWNlSGVhZGVyLT5kZWx0YVBpY09yZGVyQ250Qm90dG9tIDwgMCkKLSAgICAgICAgICAgICAgICBwaWNPcmRlckNudCArPSBwU2xpY2VIZWFkZXItPmRlbHRhUGljT3JkZXJDbnRCb3R0b207Ci0KLSAgICAgICAgICAgIC8qIHN0YW5kYXJkIHNwZWNpZmllcyB0aGF0IHByZXZQaWNPcmRlckNudExzYiBpcyBmcm9tIHByZXZpb3VzCi0gICAgICAgICAgICAgKiByZXJlcmVuY2UgZnJhbWUgLT4gcmVwbGFjZSBvbGQgdmFsdWUgb25seSBpZiBjdXJyZW50IGZyYW1lIGlzCi0gICAgICAgICAgICAgKiByZXJlcmVuY2UgZnJhbWUgKi8KLSAgICAgICAgICAgIGlmIChwTmFsVW5pdC0+bmFsUmVmSWRjKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIGlmIGN1cnJlbnQgZnJhbWUgY29udGFpbnMgbW1jbzUgLT4gbW9kaWZ5IHZhbHVlcyB0byBiZQotICAgICAgICAgICAgICAgICAqIHN0b3JlZCAqLwotICAgICAgICAgICAgICAgIGlmIChjb250YWluc01tY281KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcG9jLT5wcmV2UGljT3JkZXJDbnRNc2IgPSAwOwotICAgICAgICAgICAgICAgICAgICAvKiBwcmV2UGljT3JkZXJDbnRMc2Igc2hvdWxkIGJlIHRoZSB0b3AgZmllbGQgcGljT3JkZXJDbnQKLSAgICAgICAgICAgICAgICAgICAgICogaWYgcHJldmlvdXMgZnJhbWUgaW5jbHVkZWQgbW1jbzUuIFRvcCBmaWVsZCBwaWNPcmRlckNudAotICAgICAgICAgICAgICAgICAgICAgKiBmb3IgZnJhbWVzIGNvbnRhaW5pbmcgbW1jbzUgaXMgb2J0YWluZWQgYnkgc3VidHJhY3RpbmcKLSAgICAgICAgICAgICAgICAgICAgICogdGhlIHBpY09yZGVyQ250IGZyb20gb3JpZ2luYWwgdG9wIGZpZWxkIG9yZGVyIGNvdW50IC0+Ci0gICAgICAgICAgICAgICAgICAgICAqIHZhbHVlIGlzIHplcm8gaWYgdG9wIGZpZWxkIHdhcyB0aGUgbWluaW11bSwgaS5lLiBkZWx0YQotICAgICAgICAgICAgICAgICAgICAgKiBmb3IgYm90dG9tIHdhcyBwb3NpdGl2ZSwgb3RoZXJ3aXNlIHZhbHVlIGlzCi0gICAgICAgICAgICAgICAgICAgICAqIC1kZWx0YVBpY09yZGVyQ250Qm90dG9tICovCi0gICAgICAgICAgICAgICAgICAgIGlmIChwU2xpY2VIZWFkZXItPmRlbHRhUGljT3JkZXJDbnRCb3R0b20gPCAwKQotICAgICAgICAgICAgICAgICAgICAgICAgcG9jLT5wcmV2UGljT3JkZXJDbnRMc2IgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1MzIpKC1wU2xpY2VIZWFkZXItPmRlbHRhUGljT3JkZXJDbnRCb3R0b20pOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBwb2MtPnByZXZQaWNPcmRlckNudExzYiA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHBpY09yZGVyQ250ID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcG9jLT5wcmV2UGljT3JkZXJDbnRMc2IgPSBwU2xpY2VIZWFkZXItPnBpY09yZGVyQ250THNiOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAxOgotCi0gICAgICAgICAgICAvKiBzdGVwIDEgKGluIHRoZSBkZXNjcmlwdGlvbiBpbiB0aGUgc3RhbmRhcmQpICovCi0gICAgICAgICAgICBpZiAoSVNfSURSX05BTF9VTklUKHBOYWxVbml0KSkKLSAgICAgICAgICAgICAgICBmcmFtZU51bU9mZnNldCA9IDA7Ci0gICAgICAgICAgICBlbHNlIGlmIChwb2MtPnByZXZGcmFtZU51bSA+IHBTbGljZUhlYWRlci0+ZnJhbWVOdW0pCi0gICAgICAgICAgICAgICAgZnJhbWVOdW1PZmZzZXQgPSBwb2MtPnByZXZGcmFtZU51bU9mZnNldCArIHNwcy0+bWF4RnJhbWVOdW07Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZnJhbWVOdW1PZmZzZXQgPSBwb2MtPnByZXZGcmFtZU51bU9mZnNldDsKLQotICAgICAgICAgICAgLyogc3RlcCAyICovCi0gICAgICAgICAgICBpZiAoc3BzLT5udW1SZWZGcmFtZXNJblBpY09yZGVyQ250Q3ljbGUpCi0gICAgICAgICAgICAgICAgYWJzRnJhbWVOdW0gPSBmcmFtZU51bU9mZnNldCArIHBTbGljZUhlYWRlci0+ZnJhbWVOdW07Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgYWJzRnJhbWVOdW0gPSAwOwotCi0gICAgICAgICAgICBpZiAocE5hbFVuaXQtPm5hbFJlZklkYyA9PSAwICYmIGFic0ZyYW1lTnVtID4gMCkKLSAgICAgICAgICAgICAgICBhYnNGcmFtZU51bSAtPSAxOwotCi0gICAgICAgICAgICAvKiBzdGVwIDMgKi8KLSAgICAgICAgICAgIGlmIChhYnNGcmFtZU51bSA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcGljT3JkZXJDbnRDeWNsZUNudCA9Ci0gICAgICAgICAgICAgICAgICAgIChhYnNGcmFtZU51bSAtIDEpL3Nwcy0+bnVtUmVmRnJhbWVzSW5QaWNPcmRlckNudEN5Y2xlOwotICAgICAgICAgICAgICAgIGZyYW1lTnVtSW5QaWNPcmRlckNudEN5Y2xlID0KLSAgICAgICAgICAgICAgICAgICAgKGFic0ZyYW1lTnVtIC0gMSklc3BzLT5udW1SZWZGcmFtZXNJblBpY09yZGVyQ250Q3ljbGU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIHN0ZXAgNCAqLwotICAgICAgICAgICAgZXhwZWN0ZWREZWx0YVBpY09yZGVyQ250Q3ljbGUgPSAwOwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNwcy0+bnVtUmVmRnJhbWVzSW5QaWNPcmRlckNudEN5Y2xlOyBpKyspCi0gICAgICAgICAgICAgICAgZXhwZWN0ZWREZWx0YVBpY09yZGVyQ250Q3ljbGUgKz0gc3BzLT5vZmZzZXRGb3JSZWZGcmFtZVtpXTsKLQotICAgICAgICAgICAgLyogc3RlcCA1IChwaWNPcmRlckNudCB1c2VkIHRvIHN0b3JlIGV4cGVjdGVkUGljT3JkZXJDbnQpICovCi0gICAgICAgICAgICAvKmxpbnQgLWVzeW0oNjQ0LHBpY09yZGVyQ250Q3ljbGVDbnQpIGFsd2F5cyBpbml0aWFsaXplZCAqLwotICAgICAgICAgICAgLypsaW50IC1lc3ltKDY0NCxmcmFtZU51bUluUGljT3JkZXJDbnRDeWNsZSkgYWx3YXlzIGluaXRpYWxpemVkICovCi0gICAgICAgICAgICBpZiAoYWJzRnJhbWVOdW0gPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBpY09yZGVyQ250ID0KLSAgICAgICAgICAgICAgICAgICAgKGkzMilwaWNPcmRlckNudEN5Y2xlQ250ICogZXhwZWN0ZWREZWx0YVBpY09yZGVyQ250Q3ljbGU7Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8PSBmcmFtZU51bUluUGljT3JkZXJDbnRDeWNsZTsgaSsrKQotICAgICAgICAgICAgICAgICAgICBwaWNPcmRlckNudCArPSBzcHMtPm9mZnNldEZvclJlZkZyYW1lW2ldOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHBpY09yZGVyQ250ID0gMDsKLQotICAgICAgICAgICAgaWYgKHBOYWxVbml0LT5uYWxSZWZJZGMgPT0gMCkKLSAgICAgICAgICAgICAgICBwaWNPcmRlckNudCArPSBzcHMtPm9mZnNldEZvck5vblJlZlBpYzsKLQotICAgICAgICAgICAgLyogc3RlcCA2IChwaWNPcmRlckNudCBpcyB0b3AgZmllbGQgb3JkZXIgY250IGlmIGRlbHRhIGZvciBib3R0b20KLSAgICAgICAgICAgICAqIGlzIHBvc2l0aXZlLCBvdGhlcndpc2UgaXQgaXMgYm90dG9tIGZpZWxkIG9yZGVyIGNudCkgKi8KLSAgICAgICAgICAgIHBpY09yZGVyQ250ICs9IHBTbGljZUhlYWRlci0+ZGVsdGFQaWNPcmRlckNudFswXTsKLQotICAgICAgICAgICAgaWYgKCAoc3BzLT5vZmZzZXRGb3JUb3BUb0JvdHRvbUZpZWxkICsKLSAgICAgICAgICAgICAgICAgICAgcFNsaWNlSGVhZGVyLT5kZWx0YVBpY09yZGVyQ250WzFdKSA8IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBpY09yZGVyQ250ICs9IHNwcy0+b2Zmc2V0Rm9yVG9wVG9Cb3R0b21GaWVsZCArCi0gICAgICAgICAgICAgICAgICAgIHBTbGljZUhlYWRlci0+ZGVsdGFQaWNPcmRlckNudFsxXTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogaWYgY3VycmVudCBwaWN0dXJlIGNvbnRhaW5zIG1tY281IC0+IHNldCBwcmV2RnJhbWVOdW1PZmZzZXQgYW5kCi0gICAgICAgICAgICAgKiBwcmV2RnJhbWVOdW0gdG8gMCBmb3IgY29tcHV0YXRpb24gb2YgcGljT3JkZXJDbnQgb2YgbmV4dAotICAgICAgICAgICAgICogZnJhbWUsIG90aGVyd2lzZSBzdG9yZSBmcmFtZU51bSBhbmQgZnJhbWVOdW1PZmZzZXQgdG8gcG9jCi0gICAgICAgICAgICAgKiBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgICAgIGlmICghY29udGFpbnNNbWNvNSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwb2MtPnByZXZGcmFtZU51bU9mZnNldCA9IGZyYW1lTnVtT2Zmc2V0OwotICAgICAgICAgICAgICAgIHBvYy0+cHJldkZyYW1lTnVtID0gcFNsaWNlSGVhZGVyLT5mcmFtZU51bTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwb2MtPnByZXZGcmFtZU51bU9mZnNldCA9IDA7Ci0gICAgICAgICAgICAgICAgcG9jLT5wcmV2RnJhbWVOdW0gPSAwOwotICAgICAgICAgICAgICAgIHBpY09yZGVyQ250ID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6IC8qIGNhc2UgMiAqLwotICAgICAgICAgICAgLyogZGVyaXZlIGZyYW1lTnVtT2Zmc2V0ICovCi0gICAgICAgICAgICBpZiAoSVNfSURSX05BTF9VTklUKHBOYWxVbml0KSkKLSAgICAgICAgICAgICAgICBmcmFtZU51bU9mZnNldCA9IDA7Ci0gICAgICAgICAgICBlbHNlIGlmIChwb2MtPnByZXZGcmFtZU51bSA+IHBTbGljZUhlYWRlci0+ZnJhbWVOdW0pCi0gICAgICAgICAgICAgICAgZnJhbWVOdW1PZmZzZXQgPSBwb2MtPnByZXZGcmFtZU51bU9mZnNldCArIHNwcy0+bWF4RnJhbWVOdW07Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZnJhbWVOdW1PZmZzZXQgPSBwb2MtPnByZXZGcmFtZU51bU9mZnNldDsKLQotICAgICAgICAgICAgLyogZGVyaXZlIHBpY09yZGVyQ250ICh0eXBlIDIgaGFzIHNhbWUgdmFsdWUgZm9yIHRvcCBhbmQgYm90dG9tCi0gICAgICAgICAgICAgKiBmaWVsZCBvcmRlciBjbnRzKSAqLwotICAgICAgICAgICAgaWYgKElTX0lEUl9OQUxfVU5JVChwTmFsVW5pdCkpCi0gICAgICAgICAgICAgICAgcGljT3JkZXJDbnQgPSAwOwotICAgICAgICAgICAgZWxzZSBpZiAocE5hbFVuaXQtPm5hbFJlZklkYyA9PSAwKQotICAgICAgICAgICAgICAgIHBpY09yZGVyQ250ID0KLSAgICAgICAgICAgICAgICAgICAgMiAqIChpMzIpKGZyYW1lTnVtT2Zmc2V0ICsgcFNsaWNlSGVhZGVyLT5mcmFtZU51bSkgLSAxOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHBpY09yZGVyQ250ID0KLSAgICAgICAgICAgICAgICAgICAgMiAqIChpMzIpKGZyYW1lTnVtT2Zmc2V0ICsgcFNsaWNlSGVhZGVyLT5mcmFtZU51bSk7Ci0KLSAgICAgICAgICAgIC8qIGlmIGN1cnJlbnQgcGljdHVyZSBjb250YWlucyBtbWNvNSAtPiBzZXQgcHJldkZyYW1lTnVtT2Zmc2V0IGFuZAotICAgICAgICAgICAgICogcHJldkZyYW1lTnVtIHRvIDAgZm9yIGNvbXB1dGF0aW9uIG9mIHBpY09yZGVyQ250IG9mIG5leHQKLSAgICAgICAgICAgICAqIGZyYW1lLCBvdGhlcndpc2Ugc3RvcmUgZnJhbWVOdW0gYW5kIGZyYW1lTnVtT2Zmc2V0IHRvIHBvYwotICAgICAgICAgICAgICogc3RydWN0dXJlICovCi0gICAgICAgICAgICBpZiAoIWNvbnRhaW5zTW1jbzUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcG9jLT5wcmV2RnJhbWVOdW1PZmZzZXQgPSBmcmFtZU51bU9mZnNldDsKLSAgICAgICAgICAgICAgICBwb2MtPnByZXZGcmFtZU51bSA9IHBTbGljZUhlYWRlci0+ZnJhbWVOdW07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcG9jLT5wcmV2RnJhbWVOdW1PZmZzZXQgPSAwOwotICAgICAgICAgICAgICAgIHBvYy0+cHJldkZyYW1lTnVtID0gMDsKLSAgICAgICAgICAgICAgICBwaWNPcmRlckNudCA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgIH0KLQotICAgIC8qbGludCAtZXN5bSg2NDQscGljT3JkZXJDbnQpIGFsd2F5cyBpbml0aWFsaXplZCAqLwotICAgIHJldHVybihwaWNPcmRlckNudCk7Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3BpY19vcmRlcl9jbnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9waWNfb3JkZXJfY250LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5NzQxZWIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3BpY19vcmRlcl9jbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0gICAgMy4gRGF0YSB0eXBlcwotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBIMjY0U1dERUNfUElDX09SREVSX0NOVF9ICi0jZGVmaW5lIEgyNjRTV0RFQ19QSUNfT1JERVJfQ05UX0gKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJiYXNldHlwZS5oIgotI2luY2x1ZGUgImgyNjRic2Rfc2VxX3BhcmFtX3NldC5oIgotI2luY2x1ZGUgImgyNjRic2Rfc2xpY2VfaGVhZGVyLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9uYWxfdW5pdC5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gRGF0YSB0eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogc3RydWN0dXJlIHRvIHN0b3JlIGluZm9ybWF0aW9uIGNvbXB1dGVkIGZvciBwcmV2aW91cyBwaWN0dXJlLCBuZWVkZWQgZm9yCi0gKiBQT0MgY29tcHV0YXRpb24gb2YgYSBwaWN0dXJlLiBUd28gZmlyc3QgZmllbGRzIGZvciBQT0MgdHlwZSAwLCBsYXN0IHR3bwotICogZm9yIHR5cGVzIDEgYW5kIDIgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdTMyIHByZXZQaWNPcmRlckNudExzYjsKLSAgICBpMzIgcHJldlBpY09yZGVyQ250TXNiOwotICAgIHUzMiBwcmV2RnJhbWVOdW07Ci0gICAgdTMyIHByZXZGcmFtZU51bU9mZnNldDsKLX0gcG9jU3RvcmFnZV90OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLWkzMiBoMjY0YnNkRGVjb2RlUGljT3JkZXJDbnQocG9jU3RvcmFnZV90ICpwb2MsIHNlcVBhcmFtU2V0X3QgKnNwcywKLSAgICBzbGljZUhlYWRlcl90ICpzbGljZUhlYWRlciwgbmFsVW5pdF90ICpwTmFsVW5pdCk7Ci0KLSNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX1BJQ19PUkRFUl9DTlRfSCAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfcGljX3BhcmFtX3NldC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3BpY19wYXJhbV9zZXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA0ZGVhNC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfcGljX3BhcmFtX3NldC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzM1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLSAgICAgMy4gTW9kdWxlIGRlZmluZXMKLSAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotICAgICA1LiBGdW5jdGlvbnMKLSAgICAgICAgICBoMjY0YnNkRGVjb2RlUGljUGFyYW1TZXQKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJoMjY0YnNkX3BpY19wYXJhbV9zZXQuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3ZsYy5oIgotI2luY2x1ZGUgImgyNjRic2RfY2ZnLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIGxvb2t1cCB0YWJsZSBmb3IgY2VpbChsb2cyKG51bVNsaWNlR3JvdXBzKSksIGkuZS4gbnVtYmVyIG9mIGJpdHMgbmVlZGVkIHRvCi0gKiByZXByZXNlbnQgcmFuZ2UgWzAsIG51bVNsaWNlR3JvdXBzKQotICoKLSAqIE5PVEU6IGlmIE1BWF9OVU1fU0xJQ0VfR1JPVVBTIGlzIGhpZ2hlciB0aGFuIDggdGhpcyB0YWJsZSBoYXMgdG8gYmUgcmVzaXplZAotICogYWNjb3JkaW5nbHkgKi8KLXN0YXRpYyBjb25zdCB1MzIgQ2VpbExvZzJOdW1TbGljZUdyb3Vwc1s4XSA9IHsxLCAxLCAyLCAyLCAzLCAzLCAzLCAzfTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb24gbmFtZTogaDI2NGJzZERlY29kZVBpY1BhcmFtU2V0Ci0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIERlY29kZSBwaWN0dXJlIHBhcmFtZXRlciBzZXQgaW5mb3JtYXRpb24gZnJvbSB0aGUgc3RyZWFtLgotCi0gICAgICAgICAgICBGdW5jdGlvbiBhbGxvY2F0ZXMgbWVtb3J5IGZvcgotICAgICAgICAgICAgICAgIC0gcnVuIGxlbmd0aHMgaWYgc2xpY2UgZ3JvdXAgbWFwIHR5cGUgaXMgMAotICAgICAgICAgICAgICAgIC0gdG9wLWxlZnQgYW5kIGJvdHRvbS1yaWdodCBhcnJheXMgaWYgbWFwIHR5cGUgaXMgMgotICAgICAgICAgICAgICAgIC0gZm9yIHNsaWNlIGdyb3VwIGlkcyBpZiBtYXAgdHlwZSBpcyA2Ci0KLSAgICAgICAgICAgIFZhbGlkaXR5IG9mIHNvbWUgb2YgdGhlIHNsaWNlIGdyb3VwIG1hcHBpbmcgaW5mb3JtYXRpb24gZGVwZW5kcwotICAgICAgICAgICAgb24gdGhlIGltYWdlIGRpbWVuc2lvbnMgd2hpY2ggYXJlIG5vdCBrbm93biBoZXJlLiBUaGVyZWZvcmUgdGhlCi0gICAgICAgICAgICB2YWxpZGl0eSBoYXMgdG8gYmUgY2hlY2tlZCBhZnRlcndhcmRzLCBjdXJyZW50bHkgaW4gdGhlIHBhcmFtZXRlcgotICAgICAgICAgICAgc2V0IGFjdGl2YXRpb24gcGhhc2UuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIHBQaWNQYXJhbVNldCAgICBkZWNvZGVkIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBoZXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCi0gICAgICAgICAgICBIQU5UUk9fTk9LICAgICAgZmFpbHVyZSwgaW52YWxpZCBpbmZvcm1hdGlvbiBvciBlbmQgb2Ygc3RyZWFtCi0gICAgICAgICAgICBNRU1PUllfQUxMT0NBVElPTl9FUlJPUiBmb3IgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZQotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkRGVjb2RlUGljUGFyYW1TZXQoc3RybURhdGFfdCAqcFN0cm1EYXRhLCBwaWNQYXJhbVNldF90ICpwUGljUGFyYW1TZXQpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHRtcCwgaSwgdmFsdWU7Ci0gICAgaTMyIGl0bXA7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVChwUGljUGFyYW1TZXQpOwotCi0KLSAgICBIMjY0U3dEZWNNZW1zZXQocFBpY1BhcmFtU2V0LCAwLCBzaXplb2YocGljUGFyYW1TZXRfdCkpOwotCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgJnBQaWNQYXJhbVNldC0+cGljUGFyYW1ldGVyU2V0SWQpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLSAgICBpZiAocFBpY1BhcmFtU2V0LT5waWNQYXJhbWV0ZXJTZXRJZCA+PSBNQVhfTlVNX1BJQ19QQVJBTV9TRVRTKQotICAgIHsKLSAgICAgICAgRVBSSU5UKCJwaWNfcGFyYW1ldGVyX3NldF9pZCIpOwotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgfQotCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgJnBQaWNQYXJhbVNldC0+c2VxUGFyYW1ldGVyU2V0SWQpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLSAgICBpZiAocFBpY1BhcmFtU2V0LT5zZXFQYXJhbWV0ZXJTZXRJZCA+PSBNQVhfTlVNX1NFUV9QQVJBTV9TRVRTKQotICAgIHsKLSAgICAgICAgRVBSSU5UKCJzZXFfcGFyYW1fc2V0X2lkIik7Ci0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICB9Ci0KLSAgICAvKiBlbnRyb3B5X2NvZGluZ19tb2RlX2ZsYWcsIHNoYWxsIGJlIDAgZm9yIGJhc2VsaW5lIHByb2ZpbGUgKi8KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgIGlmICh0bXApCi0gICAgewotICAgICAgICBFUFJJTlQoImVudHJvcHlfY29kaW5nX21vZGVfZmxhZyIpOwotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgfQotCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICBwUGljUGFyYW1TZXQtPnBpY09yZGVyUHJlc2VudEZsYWcgPSAodG1wID09IDEpID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICAvKiBudW1fc2xpY2VfZ3JvdXBzX21pbnVzMSAqLwotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotICAgIHBQaWNQYXJhbVNldC0+bnVtU2xpY2VHcm91cHMgPSB2YWx1ZSArIDE7Ci0gICAgaWYgKHBQaWNQYXJhbVNldC0+bnVtU2xpY2VHcm91cHMgPiBNQVhfTlVNX1NMSUNFX0dST1VQUykKLSAgICB7Ci0gICAgICAgIEVQUklOVCgibnVtX3NsaWNlX2dyb3Vwc19taW51czEiKTsKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIH0KLQotICAgIC8qIGRlY29kZSBzbGljZSBncm91cCBtYXBwaW5nIGluZm9ybWF0aW9uIGlmIG1vcmUgdGhhbiBvbmUgc2xpY2UgZ3JvdXBzICovCi0gICAgaWYgKHBQaWNQYXJhbVNldC0+bnVtU2xpY2VHcm91cHMgPiAxKQotICAgIHsKLSAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgICAgICZwUGljUGFyYW1TZXQtPnNsaWNlR3JvdXBNYXBUeXBlKTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgaWYgKHBQaWNQYXJhbVNldC0+c2xpY2VHcm91cE1hcFR5cGUgPiA2KQotICAgICAgICB7Ci0gICAgICAgICAgICBFUFJJTlQoInNsaWNlX2dyb3VwX21hcF90eXBlIik7Ci0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocFBpY1BhcmFtU2V0LT5zbGljZUdyb3VwTWFwVHlwZSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBBTExPQ0FURShwUGljUGFyYW1TZXQtPnJ1bkxlbmd0aCwKLSAgICAgICAgICAgICAgICBwUGljUGFyYW1TZXQtPm51bVNsaWNlR3JvdXBzLCB1MzIpOwotICAgICAgICAgICAgaWYgKHBQaWNQYXJhbVNldC0+cnVuTGVuZ3RoID09IE5VTEwpCi0gICAgICAgICAgICAgICAgcmV0dXJuKE1FTU9SWV9BTExPQ0FUSU9OX0VSUk9SKTsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwUGljUGFyYW1TZXQtPm51bVNsaWNlR3JvdXBzOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgICAgICAgICAgcFBpY1BhcmFtU2V0LT5ydW5MZW5ndGhbaV0gPSB2YWx1ZSsxOwotICAgICAgICAgICAgICAgIC8qIHBhcmFtIHZhbHVlcyBjaGVja2VkIGluIENoZWNrUHBzKCkgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChwUGljUGFyYW1TZXQtPnNsaWNlR3JvdXBNYXBUeXBlID09IDIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFMTE9DQVRFKHBQaWNQYXJhbVNldC0+dG9wTGVmdCwKLSAgICAgICAgICAgICAgICBwUGljUGFyYW1TZXQtPm51bVNsaWNlR3JvdXBzIC0gMSwgdTMyKTsKLSAgICAgICAgICAgIEFMTE9DQVRFKHBQaWNQYXJhbVNldC0+Ym90dG9tUmlnaHQsCi0gICAgICAgICAgICAgICAgcFBpY1BhcmFtU2V0LT5udW1TbGljZUdyb3VwcyAtIDEsIHUzMik7Ci0gICAgICAgICAgICBpZiAocFBpY1BhcmFtU2V0LT50b3BMZWZ0ID09IE5VTEwgfHwKLSAgICAgICAgICAgICAgICBwUGljUGFyYW1TZXQtPmJvdHRvbVJpZ2h0ID09IE5VTEwpCi0gICAgICAgICAgICAgICAgcmV0dXJuKE1FTU9SWV9BTExPQ0FUSU9OX0VSUk9SKTsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwUGljUGFyYW1TZXQtPm51bVNsaWNlR3JvdXBzIC0gMTsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICAgICAgICAgIHBQaWNQYXJhbVNldC0+dG9wTGVmdFtpXSA9IHZhbHVlOwotICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICAgICAgICAgIHBQaWNQYXJhbVNldC0+Ym90dG9tUmlnaHRbaV0gPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAvKiBwYXJhbSB2YWx1ZXMgY2hlY2tlZCBpbiBDaGVja1BwcygpICovCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIChwUGljUGFyYW1TZXQtPnNsaWNlR3JvdXBNYXBUeXBlID09IDMpIHx8Ci0gICAgICAgICAgICAgICAgICAocFBpY1BhcmFtU2V0LT5zbGljZUdyb3VwTWFwVHlwZSA9PSA0KSB8fAotICAgICAgICAgICAgICAgICAgKHBQaWNQYXJhbVNldC0+c2xpY2VHcm91cE1hcFR5cGUgPT0gNSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIHBQaWNQYXJhbVNldC0+c2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWcgPQotICAgICAgICAgICAgICAgICh0bXAgPT0gMSkgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLSAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgICAgIHBQaWNQYXJhbVNldC0+c2xpY2VHcm91cENoYW5nZVJhdGUgPSB2YWx1ZSArIDE7Ci0gICAgICAgICAgICAvKiBwYXJhbSB2YWx1ZSBjaGVja2VkIGluIENoZWNrUHBzKCkgKi8KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChwUGljUGFyYW1TZXQtPnNsaWNlR3JvdXBNYXBUeXBlID09IDYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgICAgIHBQaWNQYXJhbVNldC0+cGljU2l6ZUluTWFwVW5pdHMgPSB2YWx1ZSArIDE7Ci0KLSAgICAgICAgICAgIEFMTE9DQVRFKHBQaWNQYXJhbVNldC0+c2xpY2VHcm91cElkLAotICAgICAgICAgICAgICAgIHBQaWNQYXJhbVNldC0+cGljU2l6ZUluTWFwVW5pdHMsIHUzMik7Ci0gICAgICAgICAgICBpZiAocFBpY1BhcmFtU2V0LT5zbGljZUdyb3VwSWQgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICByZXR1cm4oTUVNT1JZX0FMTE9DQVRJT05fRVJST1IpOwotCi0gICAgICAgICAgICAvKiBkZXRlcm1pbmUgbnVtYmVyIG9mIGJpdHMgbmVlZGVkIHRvIHJlcHJlc2VudCByYW5nZQotICAgICAgICAgICAgICogWzAsIG51bVNsaWNlR3JvdXBzKSAqLwotICAgICAgICAgICAgdG1wID0gQ2VpbExvZzJOdW1TbGljZUdyb3Vwc1twUGljUGFyYW1TZXQtPm51bVNsaWNlR3JvdXBzLTFdOwotCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcFBpY1BhcmFtU2V0LT5waWNTaXplSW5NYXBVbml0czsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBQaWNQYXJhbVNldC0+c2xpY2VHcm91cElkW2ldID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCB0bXApOwotICAgICAgICAgICAgICAgIGlmICggcFBpY1BhcmFtU2V0LT5zbGljZUdyb3VwSWRbaV0gPj0KLSAgICAgICAgICAgICAgICAgICAgIHBQaWNQYXJhbVNldC0+bnVtU2xpY2VHcm91cHMgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRVBSSU5UKCJzbGljZV9ncm91cF9pZCIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogbnVtX3JlZl9pZHhfbDBfYWN0aXZlX21pbnVzMSAqLwotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotICAgIGlmICh2YWx1ZSA+IDMxKQotICAgIHsKLSAgICAgICAgRVBSSU5UKCJudW1fcmVmX2lkeF9sMF9hY3RpdmVfbWludXMxIik7Ci0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICB9Ci0gICAgcFBpY1BhcmFtU2V0LT5udW1SZWZJZHhMMEFjdGl2ZSA9IHZhbHVlICsgMTsKLQotICAgIC8qIG51bV9yZWZfaWR4X2wxX2FjdGl2ZV9taW51czEgKi8KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLSAgICBpZiAodmFsdWUgPiAzMSkKLSAgICB7Ci0gICAgICAgIEVQUklOVCgibnVtX3JlZl9pZHhfbDFfYWN0aXZlX21pbnVzMSIpOwotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgfQotCi0gICAgLyogd2VpZ2h0ZWRfcHJlZF9mbGFnLCB0aGlzIHNoYWxsIGJlIDAgZm9yIGJhc2VsaW5lIHByb2ZpbGUgKi8KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgIGlmICh0bXApCi0gICAgewotICAgICAgICBFUFJJTlQoIndlaWdodGVkX3ByZWRfZmxhZyIpOwotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgfQotCi0gICAgLyogd2VpZ2h0ZWRfYmlwcmVkX2lkYyAqLwotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMik7Ci0gICAgaWYgKHRtcCA+IDIpCi0gICAgewotICAgICAgICBFUFJJTlQoIndlaWdodGVkX2JpcHJlZF9pZGMiKTsKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIH0KLQotICAgIC8qIHBpY19pbml0X3FwX21pbnVzMjYgKi8KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHBTdHJtRGF0YSwgJml0bXApOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLSAgICBpZiAoKGl0bXAgPCAtMjYpIHx8IChpdG1wID4gMjUpKQotICAgIHsKLSAgICAgICAgRVBSSU5UKCJwaWNfaW5pdF9xcF9taW51czI2Iik7Ci0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICB9Ci0gICAgcFBpY1BhcmFtU2V0LT5waWNJbml0UXAgPSAodTMyKShpdG1wICsgMjYpOwotCi0gICAgLyogcGljX2luaXRfcXNfbWludXMyNiAqLwotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQocFN0cm1EYXRhLCAmaXRtcCk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotICAgIGlmICgoaXRtcCA8IC0yNikgfHwgKGl0bXAgPiAyNSkpCi0gICAgewotICAgICAgICBFUFJJTlQoInBpY19pbml0X3FzX21pbnVzMjYiKTsKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIH0KLQotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQocFN0cm1EYXRhLCAmaXRtcCk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotICAgIGlmICgoaXRtcCA8IC0xMikgfHwgKGl0bXAgPiAxMikpCi0gICAgewotICAgICAgICBFUFJJTlQoImNocm9tYV9xcF9pbmRleF9vZmZzZXQiKTsKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIH0KLSAgICBwUGljUGFyYW1TZXQtPmNocm9tYVFwSW5kZXhPZmZzZXQgPSBpdG1wOwotCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICBwUGljUGFyYW1TZXQtPmRlYmxvY2tpbmdGaWx0ZXJDb250cm9sUHJlc2VudEZsYWcgPQotICAgICAgICAodG1wID09IDEpID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIHBQaWNQYXJhbVNldC0+Y29uc3RyYWluZWRJbnRyYVByZWRGbGFnID0gKHRtcCA9PSAxKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgcFBpY1BhcmFtU2V0LT5yZWR1bmRhbnRQaWNDbnRQcmVzZW50RmxhZyA9ICh0bXAgPT0gMSkgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICB0bXAgPSBoMjY0YnNkUmJzcFRyYWlsaW5nQml0cyhwU3RybURhdGEpOwotCi0gICAgLyogaWdub3JlIHBvc3NpYmxlIGVycm9ycyBpbiB0cmFpbGluZyBiaXRzIG9mIHBhcmFtZXRlcnMgc2V0cyAqLwotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9waWNfcGFyYW1fc2V0LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfcGljX3BhcmFtX3NldC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzI4NjM4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9waWNfcGFyYW1fc2V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotICAgIDMuIERhdGEgdHlwZXMKLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgSDI2NFNXREVDX1BJQ19QQVJBTV9TRVRfSAotI2RlZmluZSBIMjY0U1dERUNfUElDX1BBUkFNX1NFVF9ICi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiYmFzZXR5cGUuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3N0cmVhbS5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIERhdGEgdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIGRhdGEgc3RydWN0dXJlIHRvIHN0b3JlIFBQUyBpbmZvcm1hdGlvbiBkZWNvZGVkIGZyb20gdGhlIHN0cmVhbSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICB1MzIgcGljUGFyYW1ldGVyU2V0SWQ7Ci0gICAgdTMyIHNlcVBhcmFtZXRlclNldElkOwotICAgIHUzMiBwaWNPcmRlclByZXNlbnRGbGFnOwotICAgIHUzMiBudW1TbGljZUdyb3VwczsKLSAgICB1MzIgc2xpY2VHcm91cE1hcFR5cGU7Ci0gICAgdTMyICpydW5MZW5ndGg7Ci0gICAgdTMyICp0b3BMZWZ0OwotICAgIHUzMiAqYm90dG9tUmlnaHQ7Ci0gICAgdTMyIHNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnOwotICAgIHUzMiBzbGljZUdyb3VwQ2hhbmdlUmF0ZTsKLSAgICB1MzIgcGljU2l6ZUluTWFwVW5pdHM7Ci0gICAgdTMyICpzbGljZUdyb3VwSWQ7Ci0gICAgdTMyIG51bVJlZklkeEwwQWN0aXZlOwotICAgIHUzMiBwaWNJbml0UXA7Ci0gICAgaTMyIGNocm9tYVFwSW5kZXhPZmZzZXQ7Ci0gICAgdTMyIGRlYmxvY2tpbmdGaWx0ZXJDb250cm9sUHJlc2VudEZsYWc7Ci0gICAgdTMyIGNvbnN0cmFpbmVkSW50cmFQcmVkRmxhZzsKLSAgICB1MzIgcmVkdW5kYW50UGljQ250UHJlc2VudEZsYWc7Ci19IHBpY1BhcmFtU2V0X3Q7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2REZWNvZGVQaWNQYXJhbVNldChzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gICAgcGljUGFyYW1TZXRfdCAqcFBpY1BhcmFtU2V0KTsKLQotI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfUElDX1BBUkFNX1NFVF9IICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9yZWNvbnN0cnVjdC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3JlY29uc3RydWN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MDlhMDYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3JlY29uc3RydWN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzE4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLSAgICAgMy4gTW9kdWxlIGRlZmluZXMKLSAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotICAgICA1LiBGdW5jdGlvbnMKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJiYXNldHlwZS5oIgotI2luY2x1ZGUgImgyNjRic2RfcmVjb25zdHJ1Y3QuaCIKLSNpbmNsdWRlICJoMjY0YnNkX21hY3JvYmxvY2tfbGF5ZXIuaCIKLSNpbmNsdWRlICJoMjY0YnNkX2ltYWdlLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCi0KLSNpZmRlZiBIMjY0REVDX09NWERMCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0jZW5kaWYgLyogSDI2NERFQ19PTVhETCAqLwotCi0jZGVmaW5lIFVOVVNFRCh4KSAodm9pZCkoeCkKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogU3dpdGNoIG9mZiB0aGUgZm9sbG93aW5nIExpbnQgbWVzc2FnZXMgZm9yIHRoaXMgZmlsZToKLSAqIEluZm8gNzAxOiBTaGlmdCBsZWZ0IG9mIHNpZ25lZCBxdWFudGl0eSAoaW50KQotICogSW5mbyA3MDI6IFNoaWZ0IHJpZ2h0IG9mIHNpZ25lZCBxdWFudGl0eSAoaW50KQotICovCi0vKmxpbnQgLWU3MDEgLWU3MDIgKi8KLQotLyogTHVtYSBmcmFjdGlvbmFsLXNhbXBsZSBwb3NpdGlvbnMKLSAqCi0gKiAgRyBhIGIgYyBICi0gKiAgZCBlIGYgZwotICogIGggaSBqIGsgbQotICogIG4gcCBxIHIKLSAqICBNICAgcyAgIE4KLSAqCi0gKiAgRywgSCwgTSBhbmQgTiBhcmUgaW50ZWdlciBzYW1wbGUgcG9zaXRpb25zCi0gKiAgYS1zIGFyZSBmcmFjdGlvbmFsIHNhbXBsZXMgdGhhdCBuZWVkIHRvIGJlIGludGVycG9sYXRlZC4KLSAqLwotI2lmbmRlZiBIMjY0REVDX09NWERMCi1zdGF0aWMgY29uc3QgdTMyIGx1bWFGcmFjUG9zWzRdWzRdID0gewotICAvKiBHICBkICBoICBuICAgIGEgIGUgIGkgIHAgICAgYiAgZiAgaiAgIHEgICAgIGMgICBnICAgayAgIHIgKi8KLSAgICB7MCwgMSwgMiwgM30sIHs0LCA1LCA2LCA3fSwgezgsIDksIDEwLCAxMX0sIHsxMiwgMTMsIDE0LCAxNX19OwotI2VuZGlmIC8qIEgyNjRERUNfT01YREwgKi8KLQotLyogY2xpcHBpbmcgdGFibGUsIGRlZmluZWQgaW4gaDI2NGJzZF9pbnRyYV9wcmVkaWN0aW9uLmMgKi8KLWV4dGVybiBjb25zdCB1OCBoMjY0YnNkQ2xpcFtdOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgSDI2NERFQ19PTVhETAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RJbnRlcnBvbGF0ZUNocm9tYUhvcgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBjaHJvbWEgaW50ZXJwb2xhdGlvbiBpbiBob3Jpem9udGFsIGRpcmVjdGlvbi4KLSAgICAgICAgICBPdmVyZmlsbGluZyBpcyBkb25lIG9ubHkgaWYgbmVlZGVkLiBSZWZlcmVuY2UgaW1hZ2UgKHBSZWYpIGlzCi0gICAgICAgICAgcmVhZCBhdCBjb3JyZWN0IHBvc2l0aW9uIGFuZCB0aGUgcHJlZGljdGVkIHBhcnQgaXMgd3JpdHRlbiB0bwotICAgICAgICAgIG1hY3JvYmxvY2sncyBjaHJvbWluYW5jZSAocHJlZFBhcnRDaHJvbWEpCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICBwUmVmICAgICAgICAgICAgICBwb2ludGVyIHRvIHJlZmVyZW5jZSBmcmFtZSBDYiB0b3AtbGVmdCBjb3JuZXIKLSAgICAgICAgICB4MCAgICAgICAgICAgICAgICBpbnRlZ2VyIHgtY29vcmRpbmF0ZSBmb3IgcHJlZGljdGlvbgotICAgICAgICAgIHkwICAgICAgICAgICAgICAgIGludGVnZXIgeS1jb29yZGluYXRlIGZvciBwcmVkaWN0aW9uCi0gICAgICAgICAgd2lkdGggICAgICAgICAgICAgd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBmcmFtZSBjaHJvbWluYW5jZSBpbiBwaXhlbHMKLSAgICAgICAgICBoZWlnaHQgICAgICAgICAgICBoZWlnaHQgb2YgdGhlIHJlZmVyZW5jZSBmcmFtZSBjaHJvbWluYW5jZSBpbiBwaXhlbHMKLSAgICAgICAgICB4RnJhYyAgICAgICAgICAgICBob3Jpem9udGFsIGZyYWN0aW9uIGZvciBwcmVkaWN0aW9uIGluIDEvOCBwaXhlbHMKLSAgICAgICAgICBjaHJvbWFQYXJ0V2lkdGggICB3aWR0aCBvZiB0aGUgcHJlZGljdGVkIHBhcnQgaW4gcGl4ZWxzCi0gICAgICAgICAgY2hyb21hUGFydEhlaWdodCAgaGVpZ2h0IG9mIHRoZSBwcmVkaWN0ZWQgcGFydCBpbiBwaXhlbHMKLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICBwcmVkUGFydENocm9tYSAgICBwb2ludGVyIHdoZXJlIHByZWRpY3RlZCBwYXJ0IGlzIHdyaXR0ZW4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZm5kZWYgSDI2NERFQ19BUk0xMQotdm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFIb3IoCi0gIHU4ICpwUmVmLAotICB1OCAqcHJlZFBhcnRDaHJvbWEsCi0gIGkzMiB4MCwKLSAgaTMyIHkwLAotICB1MzIgd2lkdGgsCi0gIHUzMiBoZWlnaHQsCi0gIHUzMiB4RnJhYywKLSAgdTMyIGNocm9tYVBhcnRXaWR0aCwKLSAgdTMyIGNocm9tYVBhcnRIZWlnaHQpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHgsIHksIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIGMsIHZhbDsKLSAgICB1OCAqcHRyQSwgKmNicjsKLSAgICB1MzIgY29tcDsKLSAgICB1OCBibG9ja1s5KjgqMl07Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwcmVkUGFydENocm9tYSk7Ci0gICAgQVNTRVJUKGNocm9tYVBhcnRXaWR0aCk7Ci0gICAgQVNTRVJUKGNocm9tYVBhcnRIZWlnaHQpOwotICAgIEFTU0VSVCh4RnJhYyA8IDgpOwotICAgIEFTU0VSVChwUmVmKTsKLQotICAgIGlmICgoeDAgPCAwKSB8fCAoKHUzMil4MCtjaHJvbWFQYXJ0V2lkdGgrMSA+IHdpZHRoKSB8fAotICAgICAgICAoeTAgPCAwKSB8fCAoKHUzMil5MCtjaHJvbWFQYXJ0SGVpZ2h0ID4gaGVpZ2h0KSkKLSAgICB7Ci0gICAgICAgIGgyNjRic2RGaWxsQmxvY2socFJlZiwgYmxvY2ssIHgwLCB5MCwgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgIGNocm9tYVBhcnRXaWR0aCArIDEsIGNocm9tYVBhcnRIZWlnaHQsIGNocm9tYVBhcnRXaWR0aCArIDEpOwotICAgICAgICBwUmVmICs9IHdpZHRoICogaGVpZ2h0OwotICAgICAgICBoMjY0YnNkRmlsbEJsb2NrKHBSZWYsIGJsb2NrICsgKGNocm9tYVBhcnRXaWR0aCsxKSpjaHJvbWFQYXJ0SGVpZ2h0LAotICAgICAgICAgICAgeDAsIHkwLCB3aWR0aCwgaGVpZ2h0LCBjaHJvbWFQYXJ0V2lkdGggKyAxLAotICAgICAgICAgICAgY2hyb21hUGFydEhlaWdodCwgY2hyb21hUGFydFdpZHRoICsgMSk7Ci0KLSAgICAgICAgcFJlZiA9IGJsb2NrOwotICAgICAgICB4MCA9IDA7Ci0gICAgICAgIHkwID0gMDsKLSAgICAgICAgd2lkdGggPSBjaHJvbWFQYXJ0V2lkdGgrMTsKLSAgICAgICAgaGVpZ2h0ID0gY2hyb21hUGFydEhlaWdodDsKLSAgICB9Ci0KLSAgICB2YWwgPSA4IC0geEZyYWM7Ci0KLSAgICBmb3IgKGNvbXAgPSAwOyBjb21wIDw9IDE7IGNvbXArKykKLSAgICB7Ci0KLSAgICAgICAgcHRyQSA9IHBSZWYgKyAoY29tcCAqIGhlaWdodCArICh1MzIpeTApICogd2lkdGggKyB4MDsKLSAgICAgICAgY2JyID0gcHJlZFBhcnRDaHJvbWEgKyBjb21wICogOCAqIDg7Ci0KLSAgICAgICAgLyogMngyIHBlbHMgcGVyIGl0ZXJhdGlvbgotICAgICAgICAgKiBiaWxpbmVhciBob3Jpem9udGFsIGludGVycG9sYXRpb24gKi8KLSAgICAgICAgZm9yICh5ID0gKGNocm9tYVBhcnRIZWlnaHQgPj4gMSk7IHk7IHktLSkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yICh4ID0gKGNocm9tYVBhcnRXaWR0aCA+PiAxKTsgeDsgeC0tKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRtcDEgPSBwdHJBW3dpZHRoXTsKLSAgICAgICAgICAgICAgICB0bXAyID0gKnB0ckErKzsKLSAgICAgICAgICAgICAgICB0bXAzID0gcHRyQVt3aWR0aF07Ci0gICAgICAgICAgICAgICAgdG1wNCA9ICpwdHJBKys7Ci0gICAgICAgICAgICAgICAgYyA9ICgodmFsICogdG1wMSArIHhGcmFjICogdG1wMykgPDwgMykgKyAzMjsKLSAgICAgICAgICAgICAgICBjID4+PSA2OwotICAgICAgICAgICAgICAgIGNicls4XSA9ICh1OCljOwotICAgICAgICAgICAgICAgIGMgPSAoKHZhbCAqIHRtcDIgKyB4RnJhYyAqIHRtcDQpIDw8IDMpICsgMzI7Ci0gICAgICAgICAgICAgICAgYyA+Pj0gNjsKLSAgICAgICAgICAgICAgICAqY2JyKysgPSAodTgpYzsKLSAgICAgICAgICAgICAgICB0bXAxID0gcHRyQVt3aWR0aF07Ci0gICAgICAgICAgICAgICAgdG1wMiA9ICpwdHJBOwotICAgICAgICAgICAgICAgIGMgPSAoKHZhbCAqIHRtcDMgKyB4RnJhYyAqIHRtcDEpIDw8IDMpICsgMzI7Ci0gICAgICAgICAgICAgICAgYyA+Pj0gNjsKLSAgICAgICAgICAgICAgICBjYnJbOF0gPSAodTgpYzsKLSAgICAgICAgICAgICAgICBjID0gKCh2YWwgKiB0bXA0ICsgeEZyYWMgKiB0bXAyKSA8PCAzKSArIDMyOwotICAgICAgICAgICAgICAgIGMgPj49IDY7Ci0gICAgICAgICAgICAgICAgKmNicisrID0gKHU4KWM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYnIgKz0gMio4IC0gY2hyb21hUGFydFdpZHRoOwotICAgICAgICAgICAgcHRyQSArPSAyKndpZHRoIC0gY2hyb21hUGFydFdpZHRoOwotICAgICAgICB9Ci0gICAgfQotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZEludGVycG9sYXRlQ2hyb21hVmVyCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGNocm9tYSBpbnRlcnBvbGF0aW9uIGluIHZlcnRpY2FsIGRpcmVjdGlvbi4KLSAgICAgICAgICBPdmVyZmlsbGluZyBpcyBkb25lIG9ubHkgaWYgbmVlZGVkLiBSZWZlcmVuY2UgaW1hZ2UgKHBSZWYpIGlzCi0gICAgICAgICAgcmVhZCBhdCBjb3JyZWN0IHBvc2l0aW9uIGFuZCB0aGUgcHJlZGljdGVkIHBhcnQgaXMgd3JpdHRlbiB0bwotICAgICAgICAgIG1hY3JvYmxvY2sncyBjaHJvbWluYW5jZSAocHJlZFBhcnRDaHJvbWEpCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgaDI2NGJzZEludGVycG9sYXRlQ2hyb21hVmVyKAotICB1OCAqcFJlZiwKLSAgdTggKnByZWRQYXJ0Q2hyb21hLAotICBpMzIgeDAsCi0gIGkzMiB5MCwKLSAgdTMyIHdpZHRoLAotICB1MzIgaGVpZ2h0LAotICB1MzIgeUZyYWMsCi0gIHUzMiBjaHJvbWFQYXJ0V2lkdGgsCi0gIHUzMiBjaHJvbWFQYXJ0SGVpZ2h0KQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB4LCB5LCB0bXAxLCB0bXAyLCB0bXAzLCBjLCB2YWw7Ci0gICAgdTggKnB0ckEsICpjYnI7Ci0gICAgdTMyIGNvbXA7Ci0gICAgdTggYmxvY2tbOSo4KjJdOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocHJlZFBhcnRDaHJvbWEpOwotICAgIEFTU0VSVChjaHJvbWFQYXJ0V2lkdGgpOwotICAgIEFTU0VSVChjaHJvbWFQYXJ0SGVpZ2h0KTsKLSAgICBBU1NFUlQoeUZyYWMgPCA4KTsKLSAgICBBU1NFUlQocFJlZik7Ci0KLSAgICBpZiAoKHgwIDwgMCkgfHwgKCh1MzIpeDArY2hyb21hUGFydFdpZHRoID4gd2lkdGgpIHx8Ci0gICAgICAgICh5MCA8IDApIHx8ICgodTMyKXkwK2Nocm9tYVBhcnRIZWlnaHQrMSA+IGhlaWdodCkpCi0gICAgewotICAgICAgICBoMjY0YnNkRmlsbEJsb2NrKHBSZWYsIGJsb2NrLCB4MCwgeTAsIHdpZHRoLCBoZWlnaHQsIGNocm9tYVBhcnRXaWR0aCwKLSAgICAgICAgICAgIGNocm9tYVBhcnRIZWlnaHQgKyAxLCBjaHJvbWFQYXJ0V2lkdGgpOwotICAgICAgICBwUmVmICs9IHdpZHRoICogaGVpZ2h0OwotICAgICAgICBoMjY0YnNkRmlsbEJsb2NrKHBSZWYsIGJsb2NrICsgY2hyb21hUGFydFdpZHRoKihjaHJvbWFQYXJ0SGVpZ2h0KzEpLAotICAgICAgICAgICAgeDAsIHkwLCB3aWR0aCwgaGVpZ2h0LCBjaHJvbWFQYXJ0V2lkdGgsCi0gICAgICAgICAgICBjaHJvbWFQYXJ0SGVpZ2h0ICsgMSwgY2hyb21hUGFydFdpZHRoKTsKLQotICAgICAgICBwUmVmID0gYmxvY2s7Ci0gICAgICAgIHgwID0gMDsKLSAgICAgICAgeTAgPSAwOwotICAgICAgICB3aWR0aCA9IGNocm9tYVBhcnRXaWR0aDsKLSAgICAgICAgaGVpZ2h0ID0gY2hyb21hUGFydEhlaWdodCsxOwotICAgIH0KLQotICAgIHZhbCA9IDggLSB5RnJhYzsKLQotICAgIGZvciAoY29tcCA9IDA7IGNvbXAgPD0gMTsgY29tcCsrKQotICAgIHsKLQotICAgICAgICBwdHJBID0gcFJlZiArIChjb21wICogaGVpZ2h0ICsgKHUzMil5MCkgKiB3aWR0aCArIHgwOwotICAgICAgICBjYnIgPSBwcmVkUGFydENocm9tYSArIGNvbXAgKiA4ICogODsKLQotICAgICAgICAvKiAyeDIgcGVscyBwZXIgaXRlcmF0aW9uCi0gICAgICAgICAqIGJpbGluZWFyIHZlcnRpY2FsIGludGVycG9sYXRpb24gKi8KLSAgICAgICAgZm9yICh5ID0gKGNocm9tYVBhcnRIZWlnaHQgPj4gMSk7IHk7IHktLSkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yICh4ID0gKGNocm9tYVBhcnRXaWR0aCA+PiAxKTsgeDsgeC0tKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRtcDMgPSBwdHJBW3dpZHRoKjJdOwotICAgICAgICAgICAgICAgIHRtcDIgPSBwdHJBW3dpZHRoXTsKLSAgICAgICAgICAgICAgICB0bXAxID0gKnB0ckErKzsKLSAgICAgICAgICAgICAgICBjID0gKCh2YWwgKiB0bXAyICsgeUZyYWMgKiB0bXAzKSA8PCAzKSArIDMyOwotICAgICAgICAgICAgICAgIGMgPj49IDY7Ci0gICAgICAgICAgICAgICAgY2JyWzhdID0gKHU4KWM7Ci0gICAgICAgICAgICAgICAgYyA9ICgodmFsICogdG1wMSArIHlGcmFjICogdG1wMikgPDwgMykgKyAzMjsKLSAgICAgICAgICAgICAgICBjID4+PSA2OwotICAgICAgICAgICAgICAgICpjYnIrKyA9ICh1OCljOwotICAgICAgICAgICAgICAgIHRtcDMgPSBwdHJBW3dpZHRoKjJdOwotICAgICAgICAgICAgICAgIHRtcDIgPSBwdHJBW3dpZHRoXTsKLSAgICAgICAgICAgICAgICB0bXAxID0gKnB0ckErKzsKLSAgICAgICAgICAgICAgICBjID0gKCh2YWwgKiB0bXAyICsgeUZyYWMgKiB0bXAzKSA8PCAzKSArIDMyOwotICAgICAgICAgICAgICAgIGMgPj49IDY7Ci0gICAgICAgICAgICAgICAgY2JyWzhdID0gKHU4KWM7Ci0gICAgICAgICAgICAgICAgYyA9ICgodmFsICogdG1wMSArIHlGcmFjICogdG1wMikgPDwgMykgKyAzMjsKLSAgICAgICAgICAgICAgICBjID4+PSA2OwotICAgICAgICAgICAgICAgICpjYnIrKyA9ICh1OCljOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2JyICs9IDIqOCAtIGNocm9tYVBhcnRXaWR0aDsKLSAgICAgICAgICAgIHB0ckEgKz0gMip3aWR0aCAtIGNocm9tYVBhcnRXaWR0aDsKLSAgICAgICAgfQotICAgIH0KLQotfQotI2VuZGlmCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RJbnRlcnBvbGF0ZUNocm9tYUhvclZlcgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBjaHJvbWEgaW50ZXJwb2xhdGlvbiBpbiBob3Jpem9udGFsIGFuZAotICAgICAgICAgIHZlcnRpY2FsIGRpcmVjdGlvbi4gT3ZlcmZpbGxpbmcgaXMgZG9uZSBvbmx5IGlmIG5lZWRlZC4gUmVmZXJlbmNlCi0gICAgICAgICAgaW1hZ2UgKHJlZikgaXMgcmVhZCBhdCBjb3JyZWN0IHBvc2l0aW9uIGFuZCB0aGUgcHJlZGljdGVkIHBhcnQKLSAgICAgICAgICBpcyB3cml0dGVuIHRvIG1hY3JvYmxvY2sncyBjaHJvbWluYW5jZSAocHJlZFBhcnRDaHJvbWEpCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgaDI2NGJzZEludGVycG9sYXRlQ2hyb21hSG9yVmVyKAotICB1OCAqcmVmLAotICB1OCAqcHJlZFBhcnRDaHJvbWEsCi0gIGkzMiB4MCwKLSAgaTMyIHkwLAotICB1MzIgd2lkdGgsCi0gIHUzMiBoZWlnaHQsCi0gIHUzMiB4RnJhYywKLSAgdTMyIHlGcmFjLAotICB1MzIgY2hyb21hUGFydFdpZHRoLAotICB1MzIgY2hyb21hUGFydEhlaWdodCkKLXsKLSAgICB1OCBibG9ja1s5KjkqMl07Ci0gICAgdTMyIHgsIHksIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHZhbFgsIHZhbFksIHBsdXMzMiA9IDMyOwotICAgIHUzMiBjb21wOwotICAgIHU4ICpwdHJBLCAqY2JyOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocHJlZFBhcnRDaHJvbWEpOwotICAgIEFTU0VSVChjaHJvbWFQYXJ0V2lkdGgpOwotICAgIEFTU0VSVChjaHJvbWFQYXJ0SGVpZ2h0KTsKLSAgICBBU1NFUlQoeEZyYWMgPCA4KTsKLSAgICBBU1NFUlQoeUZyYWMgPCA4KTsKLSAgICBBU1NFUlQocmVmKTsKLQotICAgIGlmICgoeDAgPCAwKSB8fCAoKHUzMil4MCtjaHJvbWFQYXJ0V2lkdGgrMSA+IHdpZHRoKSB8fAotICAgICAgICAoeTAgPCAwKSB8fCAoKHUzMil5MCtjaHJvbWFQYXJ0SGVpZ2h0KzEgPiBoZWlnaHQpKQotICAgIHsKLSAgICAgICAgaDI2NGJzZEZpbGxCbG9jayhyZWYsIGJsb2NrLCB4MCwgeTAsIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICBjaHJvbWFQYXJ0V2lkdGggKyAxLCBjaHJvbWFQYXJ0SGVpZ2h0ICsgMSwgY2hyb21hUGFydFdpZHRoICsgMSk7Ci0gICAgICAgIHJlZiArPSB3aWR0aCAqIGhlaWdodDsKLSAgICAgICAgaDI2NGJzZEZpbGxCbG9jayhyZWYsIGJsb2NrICsgKGNocm9tYVBhcnRXaWR0aCsxKSooY2hyb21hUGFydEhlaWdodCsxKSwKLSAgICAgICAgICAgIHgwLCB5MCwgd2lkdGgsIGhlaWdodCwgY2hyb21hUGFydFdpZHRoICsgMSwKLSAgICAgICAgICAgIGNocm9tYVBhcnRIZWlnaHQgKyAxLCBjaHJvbWFQYXJ0V2lkdGggKyAxKTsKLQotICAgICAgICByZWYgPSBibG9jazsKLSAgICAgICAgeDAgPSAwOwotICAgICAgICB5MCA9IDA7Ci0gICAgICAgIHdpZHRoID0gY2hyb21hUGFydFdpZHRoKzE7Ci0gICAgICAgIGhlaWdodCA9IGNocm9tYVBhcnRIZWlnaHQrMTsKLSAgICB9Ci0KLSAgICB2YWxYID0gOCAtIHhGcmFjOwotICAgIHZhbFkgPSA4IC0geUZyYWM7Ci0KLSAgICBmb3IgKGNvbXAgPSAwOyBjb21wIDw9IDE7IGNvbXArKykKLSAgICB7Ci0KLSAgICAgICAgcHRyQSA9IHJlZiArIChjb21wICogaGVpZ2h0ICsgKHUzMil5MCkgKiB3aWR0aCArIHgwOwotICAgICAgICBjYnIgPSBwcmVkUGFydENocm9tYSArIGNvbXAgKiA4ICogODsKLQotICAgICAgICAvKiAyeDIgcGVscyBwZXIgaXRlcmF0aW9uCi0gICAgICAgICAqIGJpbGluZWFyIHZlcnRpY2FsIGFuZCBob3Jpem9udGFsIGludGVycG9sYXRpb24gKi8KLSAgICAgICAgZm9yICh5ID0gKGNocm9tYVBhcnRIZWlnaHQgPj4gMSk7IHk7IHktLSkKLSAgICAgICAgewotICAgICAgICAgICAgdG1wMSA9ICpwdHJBOwotICAgICAgICAgICAgdG1wMyA9IHB0ckFbd2lkdGhdOwotICAgICAgICAgICAgdG1wNSA9IHB0ckFbd2lkdGgqMl07Ci0gICAgICAgICAgICB0bXAxICo9IHZhbFk7Ci0gICAgICAgICAgICB0bXAxICs9IHRtcDMgKiB5RnJhYzsKLSAgICAgICAgICAgIHRtcDMgKj0gdmFsWTsKLSAgICAgICAgICAgIHRtcDMgKz0gdG1wNSAqIHlGcmFjOwotICAgICAgICAgICAgZm9yICh4ID0gKGNocm9tYVBhcnRXaWR0aCA+PiAxKTsgeDsgeC0tKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRtcDIgPSAqKytwdHJBOwotICAgICAgICAgICAgICAgIHRtcDQgPSBwdHJBW3dpZHRoXTsKLSAgICAgICAgICAgICAgICB0bXA2ID0gcHRyQVt3aWR0aCoyXTsKLSAgICAgICAgICAgICAgICB0bXAyICo9IHZhbFk7Ci0gICAgICAgICAgICAgICAgdG1wMiArPSB0bXA0ICogeUZyYWM7Ci0gICAgICAgICAgICAgICAgdG1wNCAqPSB2YWxZOwotICAgICAgICAgICAgICAgIHRtcDQgKz0gdG1wNiAqIHlGcmFjOwotICAgICAgICAgICAgICAgIHRtcDEgPSB0bXAxICogdmFsWCArIHBsdXMzMjsKLSAgICAgICAgICAgICAgICB0bXAzID0gdG1wMyAqIHZhbFggKyBwbHVzMzI7Ci0gICAgICAgICAgICAgICAgdG1wMSArPSB0bXAyICogeEZyYWM7Ci0gICAgICAgICAgICAgICAgdG1wMSA+Pj0gNjsKLSAgICAgICAgICAgICAgICB0bXAzICs9IHRtcDQgKiB4RnJhYzsKLSAgICAgICAgICAgICAgICB0bXAzID4+PSA2OwotICAgICAgICAgICAgICAgIGNicls4XSA9ICh1OCl0bXAzOwotICAgICAgICAgICAgICAgICpjYnIrKyA9ICh1OCl0bXAxOwotCi0gICAgICAgICAgICAgICAgdG1wMSA9ICorK3B0ckE7Ci0gICAgICAgICAgICAgICAgdG1wMyA9IHB0ckFbd2lkdGhdOwotICAgICAgICAgICAgICAgIHRtcDUgPSBwdHJBW3dpZHRoKjJdOwotICAgICAgICAgICAgICAgIHRtcDEgKj0gdmFsWTsKLSAgICAgICAgICAgICAgICB0bXAxICs9IHRtcDMgKiB5RnJhYzsKLSAgICAgICAgICAgICAgICB0bXAzICo9IHZhbFk7Ci0gICAgICAgICAgICAgICAgdG1wMyArPSB0bXA1ICogeUZyYWM7Ci0gICAgICAgICAgICAgICAgdG1wMiA9IHRtcDIgKiB2YWxYICsgcGx1czMyOwotICAgICAgICAgICAgICAgIHRtcDQgPSB0bXA0ICogdmFsWCArIHBsdXMzMjsKLSAgICAgICAgICAgICAgICB0bXAyICs9IHRtcDEgKiB4RnJhYzsKLSAgICAgICAgICAgICAgICB0bXAyID4+PSA2OwotICAgICAgICAgICAgICAgIHRtcDQgKz0gdG1wMyAqIHhGcmFjOwotICAgICAgICAgICAgICAgIHRtcDQgPj49IDY7Ci0gICAgICAgICAgICAgICAgY2JyWzhdID0gKHU4KXRtcDQ7Ci0gICAgICAgICAgICAgICAgKmNicisrID0gKHU4KXRtcDI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYnIgKz0gMio4IC0gY2hyb21hUGFydFdpZHRoOwotICAgICAgICAgICAgcHRyQSArPSAyKndpZHRoIC0gY2hyb21hUGFydFdpZHRoOwotICAgICAgICB9Ci0gICAgfQotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogUHJlZGljdENocm9tYQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgVG9wIGxldmVsIGNocm9tYSBwcmVkaWN0aW9uIGZ1bmN0aW9uIHRoYXQgY2FsbHMgdGhlIGFwcHJvcHJpYXRlCi0gICAgICAgICAgaW50ZXJwb2xhdGlvbiBmdW5jdGlvbi4gVGhlIG91dHB1dCBpcyB3cml0dGVuIHRvIG1hY3JvYmxvY2sgYXJyYXkuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB2b2lkIFByZWRpY3RDaHJvbWEoCi0gIHU4ICptYlBhcnRDaHJvbWEsCi0gIHUzMiB4QUwsCi0gIHUzMiB5QUwsCi0gIHUzMiBwYXJ0V2lkdGgsCi0gIHUzMiBwYXJ0SGVpZ2h0LAotICBtdl90ICptdiwKLSAgaW1hZ2VfdCAqcmVmUGljKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB4RnJhYywgeUZyYWMsIHdpZHRoLCBoZWlnaHQsIGNocm9tYVBhcnRXaWR0aCwgY2hyb21hUGFydEhlaWdodDsKLSAgICBpMzIgeEludCwgeUludDsKLSAgICB1OCAqcmVmOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQobXYpOwotICAgIEFTU0VSVChyZWZQaWMpOwotICAgIEFTU0VSVChyZWZQaWMtPmRhdGEpOwotICAgIEFTU0VSVChyZWZQaWMtPndpZHRoKTsKLSAgICBBU1NFUlQocmVmUGljLT5oZWlnaHQpOwotCi0gICAgd2lkdGggID0gOCAqIHJlZlBpYy0+d2lkdGg7Ci0gICAgaGVpZ2h0ID0gOCAqIHJlZlBpYy0+aGVpZ2h0OwotCi0gICAgeEludCA9ICh4QUwgPj4gMSkgKyAobXYtPmhvciA+PiAzKTsKLSAgICB5SW50ID0gKHlBTCA+PiAxKSArIChtdi0+dmVyID4+IDMpOwotICAgIHhGcmFjID0gbXYtPmhvciAmIDB4NzsKLSAgICB5RnJhYyA9IG12LT52ZXIgJiAweDc7Ci0KLSAgICBjaHJvbWFQYXJ0V2lkdGggID0gcGFydFdpZHRoID4+IDE7Ci0gICAgY2hyb21hUGFydEhlaWdodCA9IHBhcnRIZWlnaHQgPj4gMTsKLSAgICByZWYgPSByZWZQaWMtPmRhdGEgKyAyNTYgKiByZWZQaWMtPndpZHRoICogcmVmUGljLT5oZWlnaHQ7Ci0KLSAgICBpZiAoeEZyYWMgJiYgeUZyYWMpCi0gICAgewotICAgICAgICBoMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFIb3JWZXIocmVmLCBtYlBhcnRDaHJvbWEsIHhJbnQsIHlJbnQsIHdpZHRoLAotICAgICAgICAgICAgICAgIGhlaWdodCwgeEZyYWMsIHlGcmFjLCBjaHJvbWFQYXJ0V2lkdGgsIGNocm9tYVBhcnRIZWlnaHQpOwotICAgIH0KLSAgICBlbHNlIGlmICh4RnJhYykKLSAgICB7Ci0gICAgICAgIGgyNjRic2RJbnRlcnBvbGF0ZUNocm9tYUhvcihyZWYsIG1iUGFydENocm9tYSwgeEludCwgeUludCwgd2lkdGgsCi0gICAgICAgICAgICAgICAgaGVpZ2h0LCB4RnJhYywgY2hyb21hUGFydFdpZHRoLCBjaHJvbWFQYXJ0SGVpZ2h0KTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoeUZyYWMpCi0gICAgewotICAgICAgICBoMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFWZXIocmVmLCBtYlBhcnRDaHJvbWEsIHhJbnQsIHlJbnQsIHdpZHRoLAotICAgICAgICAgICAgICAgIGhlaWdodCwgeUZyYWMsIGNocm9tYVBhcnRXaWR0aCwgY2hyb21hUGFydEhlaWdodCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGgyNjRic2RGaWxsQmxvY2socmVmLCBtYlBhcnRDaHJvbWEsIHhJbnQsIHlJbnQsIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICBjaHJvbWFQYXJ0V2lkdGgsIGNocm9tYVBhcnRIZWlnaHQsIDgpOwotICAgICAgICByZWYgKz0gd2lkdGggKiBoZWlnaHQ7Ci0gICAgICAgIGgyNjRic2RGaWxsQmxvY2socmVmLCBtYlBhcnRDaHJvbWEgKyA4KjgsIHhJbnQsIHlJbnQsIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICBjaHJvbWFQYXJ0V2lkdGgsIGNocm9tYVBhcnRIZWlnaHQsIDgpOwotICAgIH0KLQotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZEludGVycG9sYXRlVmVySGFsZgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgRnVuY3Rpb24gdG8gcGVyZm9ybSB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uIG9mIHBpeGVsIHBvc2l0aW9uICdoJwotICAgICAgICAgIGZvciBhIGJsb2NrLiBPdmVyZmlsbGluZyBpcyBkb25lIG9ubHkgaWYgbmVlZGVkLiBSZWZlcmVuY2UKLSAgICAgICAgICBpbWFnZSAocmVmKSBpcyByZWFkIGF0IGNvcnJlY3QgcG9zaXRpb24gYW5kIHRoZSBwcmVkaWN0ZWQgcGFydAotICAgICAgICAgIGlzIHdyaXR0ZW4gdG8gbWFjcm9ibG9jayBhcnJheSAobWIpCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaWZuZGVmIEgyNjRERUNfQVJNMTEKLXZvaWQgaDI2NGJzZEludGVycG9sYXRlVmVySGFsZigKLSAgdTggKnJlZiwKLSAgdTggKm1iLAotICBpMzIgeDAsCi0gIGkzMiB5MCwKLSAgdTMyIHdpZHRoLAotICB1MzIgaGVpZ2h0LAotICB1MzIgcGFydFdpZHRoLAotICB1MzIgcGFydEhlaWdodCkKLXsKLSAgICB1MzIgcDFbMjEqMjEvNCsxXTsKLSAgICB1MzIgaSwgajsKLSAgICBpMzIgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgdG1wNiwgdG1wNzsKLSAgICB1OCAqcHRyQywgKnB0clY7Ci0gICAgY29uc3QgdTggKmNscCA9IGgyNjRic2RDbGlwICsgNTEyOwotCi0gICAgLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHJlZik7Ci0gICAgQVNTRVJUKG1iKTsKLQotICAgIGlmICgoeDAgPCAwKSB8fCAoKHUzMil4MCtwYXJ0V2lkdGggPiB3aWR0aCkgfHwKLSAgICAgICAgKHkwIDwgMCkgfHwgKCh1MzIpeTArcGFydEhlaWdodCs1ID4gaGVpZ2h0KSkKLSAgICB7Ci0gICAgICAgIGgyNjRic2RGaWxsQmxvY2socmVmLCAodTgqKXAxLCB4MCwgeTAsIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgcGFydFdpZHRoLCBwYXJ0SGVpZ2h0KzUsIHBhcnRXaWR0aCk7Ci0KLSAgICAgICAgeDAgPSAwOwotICAgICAgICB5MCA9IDA7Ci0gICAgICAgIHJlZiA9ICh1OCopcDE7Ci0gICAgICAgIHdpZHRoID0gcGFydFdpZHRoOwotICAgIH0KLQotICAgIHJlZiArPSAodTMyKXkwICogd2lkdGggKyAodTMyKXgwOwotCi0gICAgcHRyQyA9IHJlZiArIHdpZHRoOwotICAgIHB0clYgPSBwdHJDICsgNSp3aWR0aDsKLQotICAgIC8qIDQgcGl4ZWxzIHBlciBpdGVyYXRpb24sIGludGVycG9sYXRlIHVzaW5nIDUgdmVydGljYWwgc2FtcGxlcyAqLwotICAgIGZvciAoaSA9IChwYXJ0SGVpZ2h0ID4+IDIpOyBpOyBpLS0pCi0gICAgewotICAgICAgICAvKiBoMSA9ICgxNiArIEEgKyAxNihHK00pICsgNChHK00pIC0gNChDK1IpIC0gKEMrUikgKyBUKSA+PiA1ICovCi0gICAgICAgIGZvciAoaiA9IHBhcnRXaWR0aDsgajsgai0tKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXA0ID0gcHRyVlstKGkzMil3aWR0aCoyXTsKLSAgICAgICAgICAgIHRtcDUgPSBwdHJWWy0oaTMyKXdpZHRoXTsKLSAgICAgICAgICAgIHRtcDEgPSBwdHJWW3dpZHRoXTsKLSAgICAgICAgICAgIHRtcDIgPSBwdHJWW3dpZHRoKjJdOwotICAgICAgICAgICAgdG1wNiA9ICpwdHJWKys7Ci0KLSAgICAgICAgICAgIHRtcDcgPSB0bXA0ICsgdG1wMTsKLSAgICAgICAgICAgIHRtcDIgLT0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXAyIC09IHRtcDc7Ci0gICAgICAgICAgICB0bXAyICs9IDE2OwotICAgICAgICAgICAgdG1wNyA9IHRtcDUgKyB0bXA2OwotICAgICAgICAgICAgdG1wMyA9IHB0ckNbd2lkdGgqMl07Ci0gICAgICAgICAgICB0bXAyICs9ICh0bXA3IDw8IDQpOwotICAgICAgICAgICAgdG1wMiArPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDIgKz0gdG1wMzsKLSAgICAgICAgICAgIHRtcDIgPSBjbHBbdG1wMj4+NV07Ci0gICAgICAgICAgICB0bXAxICs9IDE2OwotICAgICAgICAgICAgbWJbNDhdID0gKHU4KXRtcDI7Ci0KLSAgICAgICAgICAgIHRtcDcgPSB0bXAzICsgdG1wNjsKLSAgICAgICAgICAgIHRtcDEgLT0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXAxIC09IHRtcDc7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wNCArIHRtcDU7Ci0gICAgICAgICAgICB0bXAyID0gcHRyQ1t3aWR0aF07Ci0gICAgICAgICAgICB0bXAxICs9ICh0bXA3IDw8IDQpOwotICAgICAgICAgICAgdG1wMSArPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDEgKz0gdG1wMjsKLSAgICAgICAgICAgIHRtcDEgPSBjbHBbdG1wMT4+NV07Ci0gICAgICAgICAgICB0bXA2ICs9IDE2OwotICAgICAgICAgICAgbWJbMzJdID0gKHU4KXRtcDE7Ci0KLSAgICAgICAgICAgIHRtcDcgPSB0bXAyICsgdG1wNTsKLSAgICAgICAgICAgIHRtcDYgLT0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA2IC09IHRtcDc7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wNCArIHRtcDM7Ci0gICAgICAgICAgICB0bXAxID0gKnB0ckM7Ci0gICAgICAgICAgICB0bXA2ICs9ICh0bXA3IDw8IDQpOwotICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDYgKz0gdG1wMTsKLSAgICAgICAgICAgIHRtcDYgPSBjbHBbdG1wNj4+NV07Ci0gICAgICAgICAgICB0bXA1ICs9IDE2OwotICAgICAgICAgICAgbWJbMTZdID0gKHU4KXRtcDY7Ci0KLSAgICAgICAgICAgIHRtcDEgKz0gdG1wNDsKLSAgICAgICAgICAgIHRtcDUgLT0gKHRtcDEgPDwgMik7Ci0gICAgICAgICAgICB0bXA1IC09IHRtcDE7Ci0gICAgICAgICAgICB0bXAzICs9IHRtcDI7Ci0gICAgICAgICAgICB0bXA2ID0gcHRyQ1stKGkzMil3aWR0aF07Ci0gICAgICAgICAgICB0bXA1ICs9ICh0bXAzIDw8IDQpOwotICAgICAgICAgICAgdG1wNSArPSAodG1wMyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDUgKz0gdG1wNjsKLSAgICAgICAgICAgIHRtcDUgPSBjbHBbdG1wNT4+NV07Ci0gICAgICAgICAgICAqbWIrKyA9ICh1OCl0bXA1OwotICAgICAgICAgICAgcHRyQysrOwotICAgICAgICB9Ci0gICAgICAgIHB0ckMgKz0gNCp3aWR0aCAtIHBhcnRXaWR0aDsKLSAgICAgICAgcHRyViArPSA0KndpZHRoIC0gcGFydFdpZHRoOwotICAgICAgICBtYiArPSA0KjE2IC0gcGFydFdpZHRoOwotICAgIH0KLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RJbnRlcnBvbGF0ZVZlclF1YXJ0ZXIKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIEZ1bmN0aW9uIHRvIHBlcmZvcm0gdmVydGljYWwgaW50ZXJwb2xhdGlvbiBvZiBwaXhlbCBwb3NpdGlvbiAnZCcKLSAgICAgICAgICBvciAnbicgZm9yIGEgYmxvY2suIE92ZXJmaWxsaW5nIGlzIGRvbmUgb25seSBpZiBuZWVkZWQuIFJlZmVyZW5jZQotICAgICAgICAgIGltYWdlIChyZWYpIGlzIHJlYWQgYXQgY29ycmVjdCBwb3NpdGlvbiBhbmQgdGhlIHByZWRpY3RlZCBwYXJ0Ci0gICAgICAgICAgaXMgd3JpdHRlbiB0byBtYWNyb2Jsb2NrIGFycmF5IChtYikKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVWZXJRdWFydGVyKAotICB1OCAqcmVmLAotICB1OCAqbWIsCi0gIGkzMiB4MCwKLSAgaTMyIHkwLAotICB1MzIgd2lkdGgsCi0gIHUzMiBoZWlnaHQsCi0gIHUzMiBwYXJ0V2lkdGgsCi0gIHUzMiBwYXJ0SGVpZ2h0LAotICB1MzIgdmVyT2Zmc2V0KSAgICAvKiAwIGZvciBwaXhlbCBkLCAxIGZvciBwaXhlbCBuICovCi17Ci0gICAgdTMyIHAxWzIxKjIxLzQrMV07Ci0gICAgdTMyIGksIGo7Ci0gICAgaTMyIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHRtcDc7Ci0gICAgdTggKnB0ckMsICpwdHJWLCAqcHRySW50OwotICAgIGNvbnN0IHU4ICpjbHAgPSBoMjY0YnNkQ2xpcCArIDUxMjsKLQotICAgIC8qIENvZGUgKi8KLQotICAgIEFTU0VSVChyZWYpOwotICAgIEFTU0VSVChtYik7Ci0KLSAgICBpZiAoKHgwIDwgMCkgfHwgKCh1MzIpeDArcGFydFdpZHRoID4gd2lkdGgpIHx8Ci0gICAgICAgICh5MCA8IDApIHx8ICgodTMyKXkwK3BhcnRIZWlnaHQrNSA+IGhlaWdodCkpCi0gICAgewotICAgICAgICBoMjY0YnNkRmlsbEJsb2NrKHJlZiwgKHU4KilwMSwgeDAsIHkwLCB3aWR0aCwgaGVpZ2h0LAotICAgICAgICAgICAgICAgIHBhcnRXaWR0aCwgcGFydEhlaWdodCs1LCBwYXJ0V2lkdGgpOwotCi0gICAgICAgIHgwID0gMDsKLSAgICAgICAgeTAgPSAwOwotICAgICAgICByZWYgPSAodTgqKXAxOwotICAgICAgICB3aWR0aCA9IHBhcnRXaWR0aDsKLSAgICB9Ci0KLSAgICByZWYgKz0gKHUzMil5MCAqIHdpZHRoICsgKHUzMil4MDsKLQotICAgIHB0ckMgPSByZWYgKyB3aWR0aDsKLSAgICBwdHJWID0gcHRyQyArIDUqd2lkdGg7Ci0KLSAgICAvKiBQb2ludGVyIHRvIGludGVnZXIgc2FtcGxlIHBvc2l0aW9uLCBlaXRoZXIgTSBvciBSICovCi0gICAgcHRySW50ID0gcHRyQyArICgyK3Zlck9mZnNldCkqd2lkdGg7Ci0KLSAgICAvKiA0IHBpeGVscyBwZXIgaXRlcmF0aW9uCi0gICAgICogaW50ZXJwb2xhdGUgdXNpbmcgNSB2ZXJ0aWNhbCBzYW1wbGVzIGFuZCBhdmVyYWdlIGJldHdlZW4KLSAgICAgKiBpbnRlcnBvbGF0ZWQgdmFsdWUgYW5kIGludGVnZXIgc2FtcGxlIHZhbHVlICovCi0gICAgZm9yIChpID0gKHBhcnRIZWlnaHQgPj4gMik7IGk7IGktLSkKLSAgICB7Ci0gICAgICAgIC8qIGgxID0gKDE2ICsgQSArIDE2KEcrTSkgKyA0KEcrTSkgLSA0KEMrUikgLSAoQytSKSArIFQpID4+IDUgKi8KLSAgICAgICAgZm9yIChqID0gcGFydFdpZHRoOyBqOyBqLS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcDQgPSBwdHJWWy0oaTMyKXdpZHRoKjJdOwotICAgICAgICAgICAgdG1wNSA9IHB0clZbLShpMzIpd2lkdGhdOwotICAgICAgICAgICAgdG1wMSA9IHB0clZbd2lkdGhdOwotICAgICAgICAgICAgdG1wMiA9IHB0clZbd2lkdGgqMl07Ci0gICAgICAgICAgICB0bXA2ID0gKnB0clYrKzsKLQotICAgICAgICAgICAgdG1wNyA9IHRtcDQgKyB0bXAxOwotICAgICAgICAgICAgdG1wMiAtPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDIgLT0gdG1wNzsKLSAgICAgICAgICAgIHRtcDIgKz0gMTY7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wNSArIHRtcDY7Ci0gICAgICAgICAgICB0bXAzID0gcHRyQ1t3aWR0aCoyXTsKLSAgICAgICAgICAgIHRtcDIgKz0gKHRtcDcgPDwgNCk7Ci0gICAgICAgICAgICB0bXAyICs9ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wMiArPSB0bXAzOwotICAgICAgICAgICAgdG1wMiA9IGNscFt0bXAyPj41XTsKLSAgICAgICAgICAgIHRtcDcgPSBwdHJJbnRbd2lkdGgqMl07Ci0gICAgICAgICAgICB0bXAxICs9IDE2OwotICAgICAgICAgICAgdG1wMisrOwotICAgICAgICAgICAgbWJbNDhdID0gKHU4KSgodG1wMiArIHRtcDcpID4+IDEpOwotCi0gICAgICAgICAgICB0bXA3ID0gdG1wMyArIHRtcDY7Ci0gICAgICAgICAgICB0bXAxIC09ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wMSAtPSB0bXA3OwotICAgICAgICAgICAgdG1wNyA9IHRtcDQgKyB0bXA1OwotICAgICAgICAgICAgdG1wMiA9IHB0ckNbd2lkdGhdOwotICAgICAgICAgICAgdG1wMSArPSAodG1wNyA8PCA0KTsKLSAgICAgICAgICAgIHRtcDEgKz0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXAxICs9IHRtcDI7Ci0gICAgICAgICAgICB0bXAxID0gY2xwW3RtcDE+PjVdOwotICAgICAgICAgICAgdG1wNyA9IHB0ckludFt3aWR0aF07Ci0gICAgICAgICAgICB0bXA2ICs9IDE2OwotICAgICAgICAgICAgdG1wMSsrOwotICAgICAgICAgICAgbWJbMzJdID0gKHU4KSgodG1wMSArIHRtcDcpID4+IDEpOwotCi0gICAgICAgICAgICB0bXA3ID0gdG1wMiArIHRtcDU7Ci0gICAgICAgICAgICB0bXA2IC09ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNiAtPSB0bXA3OwotICAgICAgICAgICAgdG1wNyA9IHRtcDQgKyB0bXAzOwotICAgICAgICAgICAgdG1wMSA9ICpwdHJDOwotICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCA0KTsKLSAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA2ICs9IHRtcDE7Ci0gICAgICAgICAgICB0bXA2ID0gY2xwW3RtcDY+PjVdOwotICAgICAgICAgICAgdG1wNyA9ICpwdHJJbnQ7Ci0gICAgICAgICAgICB0bXA1ICs9IDE2OwotICAgICAgICAgICAgdG1wNisrOwotICAgICAgICAgICAgbWJbMTZdID0gKHU4KSgodG1wNiArIHRtcDcpID4+IDEpOwotCi0gICAgICAgICAgICB0bXAxICs9IHRtcDQ7Ci0gICAgICAgICAgICB0bXA1IC09ICh0bXAxIDw8IDIpOwotICAgICAgICAgICAgdG1wNSAtPSB0bXAxOwotICAgICAgICAgICAgdG1wMyArPSB0bXAyOwotICAgICAgICAgICAgdG1wNiA9IHB0ckNbLShpMzIpd2lkdGhdOwotICAgICAgICAgICAgdG1wNSArPSAodG1wMyA8PCA0KTsKLSAgICAgICAgICAgIHRtcDUgKz0gKHRtcDMgPDwgMik7Ci0gICAgICAgICAgICB0bXA1ICs9IHRtcDY7Ci0gICAgICAgICAgICB0bXA1ID0gY2xwW3RtcDU+PjVdOwotICAgICAgICAgICAgdG1wNyA9IHB0ckludFstKGkzMil3aWR0aF07Ci0gICAgICAgICAgICB0bXA1Kys7Ci0gICAgICAgICAgICAqbWIrKyA9ICh1OCkoKHRtcDUgKyB0bXA3KSA+PiAxKTsKLSAgICAgICAgICAgIHB0ckMrKzsKLSAgICAgICAgICAgIHB0ckludCsrOwotICAgICAgICB9Ci0gICAgICAgIHB0ckMgKz0gNCp3aWR0aCAtIHBhcnRXaWR0aDsKLSAgICAgICAgcHRyViArPSA0KndpZHRoIC0gcGFydFdpZHRoOwotICAgICAgICBwdHJJbnQgKz0gNCp3aWR0aCAtIHBhcnRXaWR0aDsKLSAgICAgICAgbWIgKz0gNCoxNiAtIHBhcnRXaWR0aDsKLSAgICB9Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkSW50ZXJwb2xhdGVIb3JIYWxmCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBGdW5jdGlvbiB0byBwZXJmb3JtIGhvcml6b250YWwgaW50ZXJwb2xhdGlvbiBvZiBwaXhlbCBwb3NpdGlvbiAnYicKLSAgICAgICAgICBmb3IgYSBibG9jay4gT3ZlcmZpbGxpbmcgaXMgZG9uZSBvbmx5IGlmIG5lZWRlZC4gUmVmZXJlbmNlCi0gICAgICAgICAgaW1hZ2UgKHJlZikgaXMgcmVhZCBhdCBjb3JyZWN0IHBvc2l0aW9uIGFuZCB0aGUgcHJlZGljdGVkIHBhcnQKLSAgICAgICAgICBpcyB3cml0dGVuIHRvIG1hY3JvYmxvY2sgYXJyYXkgKG1iKQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIGgyNjRic2RJbnRlcnBvbGF0ZUhvckhhbGYoCi0gIHU4ICpyZWYsCi0gIHU4ICptYiwKLSAgaTMyIHgwLAotICBpMzIgeTAsCi0gIHUzMiB3aWR0aCwKLSAgdTMyIGhlaWdodCwKLSAgdTMyIHBhcnRXaWR0aCwKLSAgdTMyIHBhcnRIZWlnaHQpCi17Ci0gICAgdTMyIHAxWzIxKjIxLzQrMV07Ci0gICAgdTggKnB0cko7Ci0gICAgdTMyIHgsIHk7Ci0gICAgaTMyIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHRtcDc7Ci0gICAgY29uc3QgdTggKmNscCA9IGgyNjRic2RDbGlwICsgNTEyOwotCi0gICAgLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHJlZik7Ci0gICAgQVNTRVJUKG1iKTsKLSAgICBBU1NFUlQoKHBhcnRXaWR0aCYweDMpID09IDApOwotICAgIEFTU0VSVCgocGFydEhlaWdodCYweDMpID09IDApOwotCi0gICAgaWYgKCh4MCA8IDApIHx8ICgodTMyKXgwK3BhcnRXaWR0aCs1ID4gd2lkdGgpIHx8Ci0gICAgICAgICh5MCA8IDApIHx8ICgodTMyKXkwK3BhcnRIZWlnaHQgPiBoZWlnaHQpKQotICAgIHsKLSAgICAgICAgaDI2NGJzZEZpbGxCbG9jayhyZWYsICh1OCopcDEsIHgwLCB5MCwgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgICAgICBwYXJ0V2lkdGgrNSwgcGFydEhlaWdodCwgcGFydFdpZHRoKzUpOwotCi0gICAgICAgIHgwID0gMDsKLSAgICAgICAgeTAgPSAwOwotICAgICAgICByZWYgPSAodTgqKXAxOwotICAgICAgICB3aWR0aCA9IHBhcnRXaWR0aCArIDU7Ci0gICAgfQotCi0gICAgcmVmICs9ICh1MzIpeTAgKiB3aWR0aCArICh1MzIpeDA7Ci0KLSAgICBwdHJKID0gcmVmICsgNTsKLQotICAgIGZvciAoeSA9IHBhcnRIZWlnaHQ7IHk7IHktLSkKLSAgICB7Ci0gICAgICAgIHRtcDYgPSAqKHB0ckogLSA1KTsKLSAgICAgICAgdG1wNSA9ICoocHRySiAtIDQpOwotICAgICAgICB0bXA0ID0gKihwdHJKIC0gMyk7Ci0gICAgICAgIHRtcDMgPSAqKHB0ckogLSAyKTsKLSAgICAgICAgdG1wMiA9ICoocHRySiAtIDEpOwotCi0gICAgICAgIC8qIGNhbGN1bGF0ZSA0IHBlbHMgcGVyIGl0ZXJhdGlvbiAqLwotICAgICAgICBmb3IgKHggPSAocGFydFdpZHRoID4+IDIpOyB4OyB4LS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIEZpcnN0IHBpeGVsICovCi0gICAgICAgICAgICB0bXA2ICs9IDE2OwotICAgICAgICAgICAgdG1wNyA9IHRtcDMgKyB0bXA0OwotICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCA0KTsKLSAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wMiArIHRtcDU7Ci0gICAgICAgICAgICB0bXAxID0gKnB0ckorKzsKLSAgICAgICAgICAgIHRtcDYgLT0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA2IC09IHRtcDc7Ci0gICAgICAgICAgICB0bXA2ICs9IHRtcDE7Ci0gICAgICAgICAgICB0bXA2ID0gY2xwW3RtcDY+PjVdOwotICAgICAgICAgICAgLyogU2Vjb25kIHBpeGVsICovCi0gICAgICAgICAgICB0bXA1ICs9IDE2OwotICAgICAgICAgICAgdG1wNyA9IHRtcDIgKyB0bXAzOwotICAgICAgICAgICAgKm1iKysgPSAodTgpdG1wNjsKLSAgICAgICAgICAgIHRtcDUgKz0gKHRtcDcgPDwgNCk7Ci0gICAgICAgICAgICB0bXA1ICs9ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNyA9IHRtcDEgKyB0bXA0OwotICAgICAgICAgICAgdG1wNiA9ICpwdHJKKys7Ci0gICAgICAgICAgICB0bXA1IC09ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNSAtPSB0bXA3OwotICAgICAgICAgICAgdG1wNSArPSB0bXA2OwotICAgICAgICAgICAgdG1wNSA9IGNscFt0bXA1Pj41XTsKLSAgICAgICAgICAgIC8qIFRoaXJkIHBpeGVsICovCi0gICAgICAgICAgICB0bXA0ICs9IDE2OwotICAgICAgICAgICAgdG1wNyA9IHRtcDEgKyB0bXAyOwotICAgICAgICAgICAgKm1iKysgPSAodTgpdG1wNTsKLSAgICAgICAgICAgIHRtcDQgKz0gKHRtcDcgPDwgNCk7Ci0gICAgICAgICAgICB0bXA0ICs9ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNyA9IHRtcDYgKyB0bXAzOwotICAgICAgICAgICAgdG1wNSA9ICpwdHJKKys7Ci0gICAgICAgICAgICB0bXA0IC09ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNCAtPSB0bXA3OwotICAgICAgICAgICAgdG1wNCArPSB0bXA1OwotICAgICAgICAgICAgdG1wNCA9IGNscFt0bXA0Pj41XTsKLSAgICAgICAgICAgIC8qIEZvdXJ0aCBwaXhlbCAqLwotICAgICAgICAgICAgdG1wMyArPSAxNjsKLSAgICAgICAgICAgIHRtcDcgPSB0bXA2ICsgdG1wMTsKLSAgICAgICAgICAgICptYisrID0gKHU4KXRtcDQ7Ci0gICAgICAgICAgICB0bXAzICs9ICh0bXA3IDw8IDQpOwotICAgICAgICAgICAgdG1wMyArPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDcgPSB0bXA1ICsgdG1wMjsKLSAgICAgICAgICAgIHRtcDQgPSAqcHRySisrOwotICAgICAgICAgICAgdG1wMyAtPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDMgLT0gdG1wNzsKLSAgICAgICAgICAgIHRtcDMgKz0gdG1wNDsKLSAgICAgICAgICAgIHRtcDMgPSBjbHBbdG1wMz4+NV07Ci0gICAgICAgICAgICB0bXA3ID0gdG1wNDsKLSAgICAgICAgICAgIHRtcDQgPSB0bXA2OwotICAgICAgICAgICAgdG1wNiA9IHRtcDI7Ci0gICAgICAgICAgICB0bXAyID0gdG1wNzsKLSAgICAgICAgICAgICptYisrID0gKHU4KXRtcDM7Ci0gICAgICAgICAgICB0bXAzID0gdG1wNTsKLSAgICAgICAgICAgIHRtcDUgPSB0bXAxOwotICAgICAgICB9Ci0gICAgICAgIHB0ckogKz0gd2lkdGggLSBwYXJ0V2lkdGg7Ci0gICAgICAgIG1iICs9IDE2IC0gcGFydFdpZHRoOwotICAgIH0KLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RJbnRlcnBvbGF0ZUhvclF1YXJ0ZXIKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIEZ1bmN0aW9uIHRvIHBlcmZvcm0gaG9yaXpvbnRhbCBpbnRlcnBvbGF0aW9uIG9mIHBpeGVsIHBvc2l0aW9uICdhJwotICAgICAgICAgIG9yICdjJyBmb3IgYSBibG9jay4gT3ZlcmZpbGxpbmcgaXMgZG9uZSBvbmx5IGlmIG5lZWRlZC4gUmVmZXJlbmNlCi0gICAgICAgICAgaW1hZ2UgKHJlZikgaXMgcmVhZCBhdCBjb3JyZWN0IHBvc2l0aW9uIGFuZCB0aGUgcHJlZGljdGVkIHBhcnQKLSAgICAgICAgICBpcyB3cml0dGVuIHRvIG1hY3JvYmxvY2sgYXJyYXkgKG1iKQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIGgyNjRic2RJbnRlcnBvbGF0ZUhvclF1YXJ0ZXIoCi0gIHU4ICpyZWYsCi0gIHU4ICptYiwKLSAgaTMyIHgwLAotICBpMzIgeTAsCi0gIHUzMiB3aWR0aCwKLSAgdTMyIGhlaWdodCwKLSAgdTMyIHBhcnRXaWR0aCwKLSAgdTMyIHBhcnRIZWlnaHQsCi0gIHUzMiBob3JPZmZzZXQpIC8qIDAgZm9yIHBpeGVsIGEsIDEgZm9yIHBpeGVsIGMgKi8KLXsKLSAgICB1MzIgcDFbMjEqMjEvNCsxXTsKLSAgICB1OCAqcHRySjsKLSAgICB1MzIgeCwgeTsKLSAgICBpMzIgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgdG1wNiwgdG1wNzsKLSAgICBjb25zdCB1OCAqY2xwID0gaDI2NGJzZENsaXAgKyA1MTI7Ci0KLSAgICAvKiBDb2RlICovCi0KLSAgICBBU1NFUlQocmVmKTsKLSAgICBBU1NFUlQobWIpOwotCi0gICAgaWYgKCh4MCA8IDApIHx8ICgodTMyKXgwK3BhcnRXaWR0aCs1ID4gd2lkdGgpIHx8Ci0gICAgICAgICh5MCA8IDApIHx8ICgodTMyKXkwK3BhcnRIZWlnaHQgPiBoZWlnaHQpKQotICAgIHsKLSAgICAgICAgaDI2NGJzZEZpbGxCbG9jayhyZWYsICh1OCopcDEsIHgwLCB5MCwgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgICAgICBwYXJ0V2lkdGgrNSwgcGFydEhlaWdodCwgcGFydFdpZHRoKzUpOwotCi0gICAgICAgIHgwID0gMDsKLSAgICAgICAgeTAgPSAwOwotICAgICAgICByZWYgPSAodTgqKXAxOwotICAgICAgICB3aWR0aCA9IHBhcnRXaWR0aCArIDU7Ci0gICAgfQotCi0gICAgcmVmICs9ICh1MzIpeTAgKiB3aWR0aCArICh1MzIpeDA7Ci0KLSAgICBwdHJKID0gcmVmICsgNTsKLQotICAgIGZvciAoeSA9IHBhcnRIZWlnaHQ7IHk7IHktLSkKLSAgICB7Ci0gICAgICAgIHRtcDYgPSAqKHB0ckogLSA1KTsKLSAgICAgICAgdG1wNSA9ICoocHRySiAtIDQpOwotICAgICAgICB0bXA0ID0gKihwdHJKIC0gMyk7Ci0gICAgICAgIHRtcDMgPSAqKHB0ckogLSAyKTsKLSAgICAgICAgdG1wMiA9ICoocHRySiAtIDEpOwotCi0gICAgICAgIC8qIGNhbGN1bGF0ZSA0IHBlbHMgcGVyIGl0ZXJhdGlvbiAqLwotICAgICAgICBmb3IgKHggPSAocGFydFdpZHRoID4+IDIpOyB4OyB4LS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIEZpcnN0IHBpeGVsICovCi0gICAgICAgICAgICB0bXA2ICs9IDE2OwotICAgICAgICAgICAgdG1wNyA9IHRtcDMgKyB0bXA0OwotICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCA0KTsKLSAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wMiArIHRtcDU7Ci0gICAgICAgICAgICB0bXAxID0gKnB0ckorKzsKLSAgICAgICAgICAgIHRtcDYgLT0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA2IC09IHRtcDc7Ci0gICAgICAgICAgICB0bXA2ICs9IHRtcDE7Ci0gICAgICAgICAgICB0bXA2ID0gY2xwW3RtcDY+PjVdOwotICAgICAgICAgICAgdG1wNSArPSAxNjsKLSAgICAgICAgICAgIGlmICghaG9yT2Zmc2V0KQotICAgICAgICAgICAgICAgIHRtcDYgKz0gdG1wNDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB0bXA2ICs9IHRtcDM7Ci0gICAgICAgICAgICAqbWIrKyA9ICh1OCkoKHRtcDYgKyAxKSA+PiAxKTsKLSAgICAgICAgICAgIC8qIFNlY29uZCBwaXhlbCAqLwotICAgICAgICAgICAgdG1wNyA9IHRtcDIgKyB0bXAzOwotICAgICAgICAgICAgdG1wNSArPSAodG1wNyA8PCA0KTsKLSAgICAgICAgICAgIHRtcDUgKz0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wMSArIHRtcDQ7Ci0gICAgICAgICAgICB0bXA2ID0gKnB0ckorKzsKLSAgICAgICAgICAgIHRtcDUgLT0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA1IC09IHRtcDc7Ci0gICAgICAgICAgICB0bXA1ICs9IHRtcDY7Ci0gICAgICAgICAgICB0bXA1ID0gY2xwW3RtcDU+PjVdOwotICAgICAgICAgICAgdG1wNCArPSAxNjsKLSAgICAgICAgICAgIGlmICghaG9yT2Zmc2V0KQotICAgICAgICAgICAgICAgIHRtcDUgKz0gdG1wMzsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB0bXA1ICs9IHRtcDI7Ci0gICAgICAgICAgICAqbWIrKyA9ICh1OCkoKHRtcDUgKyAxKSA+PiAxKTsKLSAgICAgICAgICAgIC8qIFRoaXJkIHBpeGVsICovCi0gICAgICAgICAgICB0bXA3ID0gdG1wMSArIHRtcDI7Ci0gICAgICAgICAgICB0bXA0ICs9ICh0bXA3IDw8IDQpOwotICAgICAgICAgICAgdG1wNCArPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDcgPSB0bXA2ICsgdG1wMzsKLSAgICAgICAgICAgIHRtcDUgPSAqcHRySisrOwotICAgICAgICAgICAgdG1wNCAtPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDQgLT0gdG1wNzsKLSAgICAgICAgICAgIHRtcDQgKz0gdG1wNTsKLSAgICAgICAgICAgIHRtcDQgPSBjbHBbdG1wND4+NV07Ci0gICAgICAgICAgICB0bXAzICs9IDE2OwotICAgICAgICAgICAgaWYgKCFob3JPZmZzZXQpCi0gICAgICAgICAgICAgICAgdG1wNCArPSB0bXAyOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHRtcDQgKz0gdG1wMTsKLSAgICAgICAgICAgICptYisrID0gKHU4KSgodG1wNCArIDEpID4+IDEpOwotICAgICAgICAgICAgLyogRm91cnRoIHBpeGVsICovCi0gICAgICAgICAgICB0bXA3ID0gdG1wNiArIHRtcDE7Ci0gICAgICAgICAgICB0bXAzICs9ICh0bXA3IDw8IDQpOwotICAgICAgICAgICAgdG1wMyArPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDcgPSB0bXA1ICsgdG1wMjsKLSAgICAgICAgICAgIHRtcDQgPSAqcHRySisrOwotICAgICAgICAgICAgdG1wMyAtPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDMgLT0gdG1wNzsKLSAgICAgICAgICAgIHRtcDMgKz0gdG1wNDsKLSAgICAgICAgICAgIHRtcDMgPSBjbHBbdG1wMz4+NV07Ci0gICAgICAgICAgICBpZiAoIWhvck9mZnNldCkKLSAgICAgICAgICAgICAgICB0bXAzICs9IHRtcDE7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdG1wMyArPSB0bXA2OwotICAgICAgICAgICAgKm1iKysgPSAodTgpKCh0bXAzICsgMSkgPj4gMSk7Ci0gICAgICAgICAgICB0bXAzID0gdG1wNTsKLSAgICAgICAgICAgIHRtcDUgPSB0bXAxOwotICAgICAgICAgICAgdG1wNyA9IHRtcDQ7Ci0gICAgICAgICAgICB0bXA0ID0gdG1wNjsKLSAgICAgICAgICAgIHRtcDYgPSB0bXAyOwotICAgICAgICAgICAgdG1wMiA9IHRtcDc7Ci0gICAgICAgIH0KLSAgICAgICAgcHRySiArPSB3aWR0aCAtIHBhcnRXaWR0aDsKLSAgICAgICAgbWIgKz0gMTYgLSBwYXJ0V2lkdGg7Ci0gICAgfQotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZEludGVycG9sYXRlSG9yVmVyUXVhcnRlcgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgRnVuY3Rpb24gdG8gcGVyZm9ybSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uIG9mIHBpeGVsCi0gICAgICAgICAgcG9zaXRpb24gJ2UnLCAnZycsICdwJyBvciAncicgZm9yIGEgYmxvY2suIE92ZXJmaWxsaW5nIGlzIGRvbmUgb25seQotICAgICAgICAgIGlmIG5lZWRlZC4gUmVmZXJlbmNlIGltYWdlIChyZWYpIGlzIHJlYWQgYXQgY29ycmVjdCBwb3NpdGlvbiBhbmQKLSAgICAgICAgICB0aGUgcHJlZGljdGVkIHBhcnQgaXMgd3JpdHRlbiB0byBtYWNyb2Jsb2NrIGFycmF5IChtYikKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVIb3JWZXJRdWFydGVyKAotICB1OCAqcmVmLAotICB1OCAqbWIsCi0gIGkzMiB4MCwKLSAgaTMyIHkwLAotICB1MzIgd2lkdGgsCi0gIHUzMiBoZWlnaHQsCi0gIHUzMiBwYXJ0V2lkdGgsCi0gIHUzMiBwYXJ0SGVpZ2h0LAotICB1MzIgaG9yVmVyT2Zmc2V0KSAvKiAwIGZvciBwaXhlbCBlLCAxIGZvciBwaXhlbCBnLAotICAgICAgICAgICAgICAgICAgICAgICAyIGZvciBwaXhlbCBwLCAzIGZvciBwaXhlbCByICovCi17Ci0gICAgdTMyIHAxWzIxKjIxLzQrMV07Ci0gICAgdTggKnB0ckMsICpwdHJKLCAqcHRyVjsKLSAgICB1MzIgeCwgeTsKLSAgICBpMzIgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgdG1wNiwgdG1wNzsKLSAgICBjb25zdCB1OCAqY2xwID0gaDI2NGJzZENsaXAgKyA1MTI7Ci0KLSAgICAvKiBDb2RlICovCi0KLSAgICBBU1NFUlQocmVmKTsKLSAgICBBU1NFUlQobWIpOwotCi0gICAgaWYgKCh4MCA8IDApIHx8ICgodTMyKXgwK3BhcnRXaWR0aCs1ID4gd2lkdGgpIHx8Ci0gICAgICAgICh5MCA8IDApIHx8ICgodTMyKXkwK3BhcnRIZWlnaHQrNSA+IGhlaWdodCkpCi0gICAgewotICAgICAgICBoMjY0YnNkRmlsbEJsb2NrKHJlZiwgKHU4KilwMSwgeDAsIHkwLCB3aWR0aCwgaGVpZ2h0LAotICAgICAgICAgICAgICAgIHBhcnRXaWR0aCs1LCBwYXJ0SGVpZ2h0KzUsIHBhcnRXaWR0aCs1KTsKLQotICAgICAgICB4MCA9IDA7Ci0gICAgICAgIHkwID0gMDsKLSAgICAgICAgcmVmID0gKHU4KilwMTsKLSAgICAgICAgd2lkdGggPSBwYXJ0V2lkdGgrNTsKLSAgICB9Ci0KLSAgICAvKiBSZWYgcG9pbnRzIHRvIEcgKyAoLTIsIC0yKSAqLwotICAgIHJlZiArPSAodTMyKXkwICogd2lkdGggKyAodTMyKXgwOwotCi0gICAgLyogcHRySiBwb2ludHMgdG8gZWl0aGVyIEogb3IgUSwgZGVwZW5kaW5nIG9uIHZlcnRpY2FsIG9mZnNldCAqLwotICAgIHB0ckogPSByZWYgKyAoKChob3JWZXJPZmZzZXQgJiAweDIpID4+IDEpICsgMikgKiB3aWR0aCArIDU7Ci0KLSAgICAvKiBwdHJDIHBvaW50cyB0byBlaXRoZXIgQyBvciBELCBkZXBlbmRpbmcgb24gaG9yaXpvbnRhbCBvZmZzZXQgKi8KLSAgICBwdHJDID0gcmVmICsgd2lkdGggKyAyICsgKGhvclZlck9mZnNldCAmIDB4MSk7Ci0KLSAgICBmb3IgKHkgPSBwYXJ0SGVpZ2h0OyB5OyB5LS0pCi0gICAgewotICAgICAgICB0bXA2ID0gKihwdHJKIC0gNSk7Ci0gICAgICAgIHRtcDUgPSAqKHB0ckogLSA0KTsKLSAgICAgICAgdG1wNCA9ICoocHRySiAtIDMpOwotICAgICAgICB0bXAzID0gKihwdHJKIC0gMik7Ci0gICAgICAgIHRtcDIgPSAqKHB0ckogLSAxKTsKLQotICAgICAgICAvKiBIb3Jpem9udGFsIGludGVycG9sYXRpb24sIGNhbGN1bGF0ZSA0IHBlbHMgcGVyIGl0ZXJhdGlvbiAqLwotICAgICAgICBmb3IgKHggPSAocGFydFdpZHRoID4+IDIpOyB4OyB4LS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIEZpcnN0IHBpeGVsICovCi0gICAgICAgICAgICB0bXA2ICs9IDE2OwotICAgICAgICAgICAgdG1wNyA9IHRtcDMgKyB0bXA0OwotICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCA0KTsKLSAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wMiArIHRtcDU7Ci0gICAgICAgICAgICB0bXAxID0gKnB0ckorKzsKLSAgICAgICAgICAgIHRtcDYgLT0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA2IC09IHRtcDc7Ci0gICAgICAgICAgICB0bXA2ICs9IHRtcDE7Ci0gICAgICAgICAgICB0bXA2ID0gY2xwW3RtcDY+PjVdOwotICAgICAgICAgICAgLyogU2Vjb25kIHBpeGVsICovCi0gICAgICAgICAgICB0bXA1ICs9IDE2OwotICAgICAgICAgICAgdG1wNyA9IHRtcDIgKyB0bXAzOwotICAgICAgICAgICAgKm1iKysgPSAodTgpdG1wNjsKLSAgICAgICAgICAgIHRtcDUgKz0gKHRtcDcgPDwgNCk7Ci0gICAgICAgICAgICB0bXA1ICs9ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNyA9IHRtcDEgKyB0bXA0OwotICAgICAgICAgICAgdG1wNiA9ICpwdHJKKys7Ci0gICAgICAgICAgICB0bXA1IC09ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNSAtPSB0bXA3OwotICAgICAgICAgICAgdG1wNSArPSB0bXA2OwotICAgICAgICAgICAgdG1wNSA9IGNscFt0bXA1Pj41XTsKLSAgICAgICAgICAgIC8qIFRoaXJkIHBpeGVsICovCi0gICAgICAgICAgICB0bXA0ICs9IDE2OwotICAgICAgICAgICAgdG1wNyA9IHRtcDEgKyB0bXAyOwotICAgICAgICAgICAgKm1iKysgPSAodTgpdG1wNTsKLSAgICAgICAgICAgIHRtcDQgKz0gKHRtcDcgPDwgNCk7Ci0gICAgICAgICAgICB0bXA0ICs9ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNyA9IHRtcDYgKyB0bXAzOwotICAgICAgICAgICAgdG1wNSA9ICpwdHJKKys7Ci0gICAgICAgICAgICB0bXA0IC09ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNCAtPSB0bXA3OwotICAgICAgICAgICAgdG1wNCArPSB0bXA1OwotICAgICAgICAgICAgdG1wNCA9IGNscFt0bXA0Pj41XTsKLSAgICAgICAgICAgIC8qIEZvdXJ0aCBwaXhlbCAqLwotICAgICAgICAgICAgdG1wMyArPSAxNjsKLSAgICAgICAgICAgIHRtcDcgPSB0bXA2ICsgdG1wMTsKLSAgICAgICAgICAgICptYisrID0gKHU4KXRtcDQ7Ci0gICAgICAgICAgICB0bXAzICs9ICh0bXA3IDw8IDQpOwotICAgICAgICAgICAgdG1wMyArPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDcgPSB0bXA1ICsgdG1wMjsKLSAgICAgICAgICAgIHRtcDQgPSAqcHRySisrOwotICAgICAgICAgICAgdG1wMyAtPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDMgLT0gdG1wNzsKLSAgICAgICAgICAgIHRtcDMgKz0gdG1wNDsKLSAgICAgICAgICAgIHRtcDMgPSBjbHBbdG1wMz4+NV07Ci0gICAgICAgICAgICB0bXA3ID0gdG1wNDsKLSAgICAgICAgICAgIHRtcDQgPSB0bXA2OwotICAgICAgICAgICAgdG1wNiA9IHRtcDI7Ci0gICAgICAgICAgICB0bXAyID0gdG1wNzsKLSAgICAgICAgICAgICptYisrID0gKHU4KXRtcDM7Ci0gICAgICAgICAgICB0bXAzID0gdG1wNTsKLSAgICAgICAgICAgIHRtcDUgPSB0bXAxOwotICAgICAgICB9Ci0gICAgICAgIHB0ckogKz0gd2lkdGggLSBwYXJ0V2lkdGg7Ci0gICAgICAgIG1iICs9IDE2IC0gcGFydFdpZHRoOwotICAgIH0KLQotICAgIG1iIC09IDE2KnBhcnRIZWlnaHQ7Ci0gICAgcHRyViA9IHB0ckMgKyA1KndpZHRoOwotCi0gICAgZm9yICh5ID0gKHBhcnRIZWlnaHQgPj4gMik7IHk7IHktLSkKLSAgICB7Ci0gICAgICAgIC8qIFZlcnRpY2FsIGludGVycG9sYXRpb24gYW5kIGF2ZXJhZ2luZywgNCBwZWxzIHBlciBpdGVyYXRpb24gKi8KLSAgICAgICAgZm9yICh4ID0gcGFydFdpZHRoOyB4OyB4LS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcDQgPSBwdHJWWy0oaTMyKXdpZHRoKjJdOwotICAgICAgICAgICAgdG1wNSA9IHB0clZbLShpMzIpd2lkdGhdOwotICAgICAgICAgICAgdG1wMSA9IHB0clZbd2lkdGhdOwotICAgICAgICAgICAgdG1wMiA9IHB0clZbd2lkdGgqMl07Ci0gICAgICAgICAgICB0bXA2ID0gKnB0clYrKzsKLQotICAgICAgICAgICAgdG1wNyA9IHRtcDQgKyB0bXAxOwotICAgICAgICAgICAgdG1wMiAtPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDIgLT0gdG1wNzsKLSAgICAgICAgICAgIHRtcDIgKz0gMTY7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wNSArIHRtcDY7Ci0gICAgICAgICAgICB0bXAzID0gcHRyQ1t3aWR0aCoyXTsKLSAgICAgICAgICAgIHRtcDIgKz0gKHRtcDcgPDwgNCk7Ci0gICAgICAgICAgICB0bXAyICs9ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wMiArPSB0bXAzOwotICAgICAgICAgICAgdG1wNyA9IGNscFt0bXAyPj41XTsKLSAgICAgICAgICAgIHRtcDIgPSBtYls0OF07Ci0gICAgICAgICAgICB0bXAxICs9IDE2OwotICAgICAgICAgICAgdG1wNysrOwotICAgICAgICAgICAgbWJbNDhdID0gKHU4KSgodG1wMiArIHRtcDcpID4+IDEpOwotCi0gICAgICAgICAgICB0bXA3ID0gdG1wMyArIHRtcDY7Ci0gICAgICAgICAgICB0bXAxIC09ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wMSAtPSB0bXA3OwotICAgICAgICAgICAgdG1wNyA9IHRtcDQgKyB0bXA1OwotICAgICAgICAgICAgdG1wMiA9IHB0ckNbd2lkdGhdOwotICAgICAgICAgICAgdG1wMSArPSAodG1wNyA8PCA0KTsKLSAgICAgICAgICAgIHRtcDEgKz0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXAxICs9IHRtcDI7Ci0gICAgICAgICAgICB0bXA3ID0gY2xwW3RtcDE+PjVdOwotICAgICAgICAgICAgdG1wMSA9IG1iWzMyXTsKLSAgICAgICAgICAgIHRtcDYgKz0gMTY7Ci0gICAgICAgICAgICB0bXA3Kys7Ci0gICAgICAgICAgICBtYlszMl0gPSAodTgpKCh0bXAxICsgdG1wNykgPj4gMSk7Ci0KLSAgICAgICAgICAgIHRtcDEgPSAqcHRyQzsKLSAgICAgICAgICAgIHRtcDcgPSB0bXAyICsgdG1wNTsKLSAgICAgICAgICAgIHRtcDYgLT0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA2IC09IHRtcDc7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wNCArIHRtcDM7Ci0gICAgICAgICAgICB0bXA2ICs9ICh0bXA3IDw8IDQpOwotICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDYgKz0gdG1wMTsKLSAgICAgICAgICAgIHRtcDcgPSBjbHBbdG1wNj4+NV07Ci0gICAgICAgICAgICB0bXA2ID0gbWJbMTZdOwotICAgICAgICAgICAgdG1wNSArPSAxNjsKLSAgICAgICAgICAgIHRtcDcrKzsKLSAgICAgICAgICAgIG1iWzE2XSA9ICh1OCkoKHRtcDYgKyB0bXA3KSA+PiAxKTsKLQotICAgICAgICAgICAgdG1wNiA9IHB0ckNbLShpMzIpd2lkdGhdOwotICAgICAgICAgICAgdG1wMSArPSB0bXA0OwotICAgICAgICAgICAgdG1wNSAtPSAodG1wMSA8PCAyKTsKLSAgICAgICAgICAgIHRtcDUgLT0gdG1wMTsKLSAgICAgICAgICAgIHRtcDMgKz0gdG1wMjsKLSAgICAgICAgICAgIHRtcDUgKz0gKHRtcDMgPDwgNCk7Ci0gICAgICAgICAgICB0bXA1ICs9ICh0bXAzIDw8IDIpOwotICAgICAgICAgICAgdG1wNSArPSB0bXA2OwotICAgICAgICAgICAgdG1wNyA9IGNscFt0bXA1Pj41XTsKLSAgICAgICAgICAgIHRtcDUgPSAqbWI7Ci0gICAgICAgICAgICB0bXA3Kys7Ci0gICAgICAgICAgICAqbWIrKyA9ICh1OCkoKHRtcDUgKyB0bXA3KSA+PiAxKTsKLSAgICAgICAgICAgIHB0ckMrKzsKLQotICAgICAgICB9Ci0gICAgICAgIHB0ckMgKz0gNCp3aWR0aCAtIHBhcnRXaWR0aDsKLSAgICAgICAgcHRyViArPSA0KndpZHRoIC0gcGFydFdpZHRoOwotICAgICAgICBtYiArPSA0KjE2IC0gcGFydFdpZHRoOwotICAgIH0KLQotfQotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZEludGVycG9sYXRlTWlkSGFsZgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgRnVuY3Rpb24gdG8gcGVyZm9ybSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uIG9mIHBpeGVsCi0gICAgICAgICAgcG9zaXRpb24gJ2onIGZvciBhIGJsb2NrLiBPdmVyZmlsbGluZyBpcyBkb25lIG9ubHkgaWYgbmVlZGVkLgotICAgICAgICAgIFJlZmVyZW5jZSBpbWFnZSAocmVmKSBpcyByZWFkIGF0IGNvcnJlY3QgcG9zaXRpb24gYW5kIHRoZSBwcmVkaWN0ZWQKLSAgICAgICAgICBwYXJ0IGlzIHdyaXR0ZW4gdG8gbWFjcm9ibG9jayBhcnJheSAobWIpCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgaDI2NGJzZEludGVycG9sYXRlTWlkSGFsZigKLSAgdTggKnJlZiwKLSAgdTggKm1iLAotICBpMzIgeDAsCi0gIGkzMiB5MCwKLSAgdTMyIHdpZHRoLAotICB1MzIgaGVpZ2h0LAotICB1MzIgcGFydFdpZHRoLAotICB1MzIgcGFydEhlaWdodCkKLXsKLSAgICB1MzIgcDFbMjEqMjEvNCsxXTsKLSAgICB1MzIgeCwgeTsKLSAgICBpMzIgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgdG1wNiwgdG1wNzsKLSAgICBpMzIgKnB0ckMsICpwdHJWLCAqYjE7Ci0gICAgdTggICpwdHJKOwotICAgIGkzMiB0YWJsZVsyMSoxNl07Ci0gICAgY29uc3QgdTggKmNscCA9IGgyNjRic2RDbGlwICsgNTEyOwotCi0gICAgLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHJlZik7Ci0gICAgQVNTRVJUKG1iKTsKLQotICAgIGlmICgoeDAgPCAwKSB8fCAoKHUzMil4MCtwYXJ0V2lkdGgrNSA+IHdpZHRoKSB8fAotICAgICAgICAoeTAgPCAwKSB8fCAoKHUzMil5MCtwYXJ0SGVpZ2h0KzUgPiBoZWlnaHQpKQotICAgIHsKLSAgICAgICAgaDI2NGJzZEZpbGxCbG9jayhyZWYsICh1OCopcDEsIHgwLCB5MCwgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgICAgICBwYXJ0V2lkdGgrNSwgcGFydEhlaWdodCs1LCBwYXJ0V2lkdGgrNSk7Ci0KLSAgICAgICAgeDAgPSAwOwotICAgICAgICB5MCA9IDA7Ci0gICAgICAgIHJlZiA9ICh1OCopcDE7Ci0gICAgICAgIHdpZHRoID0gcGFydFdpZHRoKzU7Ci0gICAgfQotCi0gICAgcmVmICs9ICh1MzIpeTAgKiB3aWR0aCArICh1MzIpeDA7Ci0KLSAgICBiMSA9IHRhYmxlOwotICAgIHB0ckogPSByZWYgKyA1OwotCi0gICAgLyogRmlyc3Qgc3RlcDogY2FsY3VsYXRlIGludGVybWVkaWF0ZSB2YWx1ZXMgZm9yCi0gICAgICogaG9yaXpvbnRhbCBpbnRlcnBvbGF0aW9uICovCi0gICAgZm9yICh5ID0gcGFydEhlaWdodCArIDU7IHk7IHktLSkKLSAgICB7Ci0gICAgICAgIHRtcDYgPSAqKHB0ckogLSA1KTsKLSAgICAgICAgdG1wNSA9ICoocHRySiAtIDQpOwotICAgICAgICB0bXA0ID0gKihwdHJKIC0gMyk7Ci0gICAgICAgIHRtcDMgPSAqKHB0ckogLSAyKTsKLSAgICAgICAgdG1wMiA9ICoocHRySiAtIDEpOwotCi0gICAgICAgIC8qIDQgcGVscyBwZXIgaXRlcmF0aW9uICovCi0gICAgICAgIGZvciAoeCA9IChwYXJ0V2lkdGggPj4gMik7IHg7IHgtLSkKLSAgICAgICAgewotICAgICAgICAgICAgLyogRmlyc3QgcGl4ZWwgKi8KLSAgICAgICAgICAgIHRtcDcgPSB0bXAzICsgdG1wNDsKLSAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgNCk7Ci0gICAgICAgICAgICB0bXA2ICs9ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNyA9IHRtcDIgKyB0bXA1OwotICAgICAgICAgICAgdG1wMSA9ICpwdHJKKys7Ci0gICAgICAgICAgICB0bXA2IC09ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNiAtPSB0bXA3OwotICAgICAgICAgICAgdG1wNiArPSB0bXAxOwotICAgICAgICAgICAgKmIxKysgPSB0bXA2OwotICAgICAgICAgICAgLyogU2Vjb25kIHBpeGVsICovCi0gICAgICAgICAgICB0bXA3ID0gdG1wMiArIHRtcDM7Ci0gICAgICAgICAgICB0bXA1ICs9ICh0bXA3IDw8IDQpOwotICAgICAgICAgICAgdG1wNSArPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDcgPSB0bXAxICsgdG1wNDsKLSAgICAgICAgICAgIHRtcDYgPSAqcHRySisrOwotICAgICAgICAgICAgdG1wNSAtPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDUgLT0gdG1wNzsKLSAgICAgICAgICAgIHRtcDUgKz0gdG1wNjsKLSAgICAgICAgICAgICpiMSsrID0gdG1wNTsKLSAgICAgICAgICAgIC8qIFRoaXJkIHBpeGVsICovCi0gICAgICAgICAgICB0bXA3ID0gdG1wMSArIHRtcDI7Ci0gICAgICAgICAgICB0bXA0ICs9ICh0bXA3IDw8IDQpOwotICAgICAgICAgICAgdG1wNCArPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDcgPSB0bXA2ICsgdG1wMzsKLSAgICAgICAgICAgIHRtcDUgPSAqcHRySisrOwotICAgICAgICAgICAgdG1wNCAtPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDQgLT0gdG1wNzsKLSAgICAgICAgICAgIHRtcDQgKz0gdG1wNTsKLSAgICAgICAgICAgICpiMSsrID0gdG1wNDsKLSAgICAgICAgICAgIC8qIEZvdXJ0aCBwaXhlbCAqLwotICAgICAgICAgICAgdG1wNyA9IHRtcDYgKyB0bXAxOwotICAgICAgICAgICAgdG1wMyArPSAodG1wNyA8PCA0KTsKLSAgICAgICAgICAgIHRtcDMgKz0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wNSArIHRtcDI7Ci0gICAgICAgICAgICB0bXA0ID0gKnB0ckorKzsKLSAgICAgICAgICAgIHRtcDMgLT0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXAzIC09IHRtcDc7Ci0gICAgICAgICAgICB0bXAzICs9IHRtcDQ7Ci0gICAgICAgICAgICAqYjErKyA9IHRtcDM7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wNDsKLSAgICAgICAgICAgIHRtcDQgPSB0bXA2OwotICAgICAgICAgICAgdG1wNiA9IHRtcDI7Ci0gICAgICAgICAgICB0bXAyID0gdG1wNzsKLSAgICAgICAgICAgIHRtcDMgPSB0bXA1OwotICAgICAgICAgICAgdG1wNSA9IHRtcDE7Ci0gICAgICAgIH0KLSAgICAgICAgcHRySiArPSB3aWR0aCAtIHBhcnRXaWR0aDsKLSAgICB9Ci0KLSAgICAvKiBTZWNvbmQgc3RlcDogY2FsY3VsYXRlIHZlcnRpY2FsIGludGVycG9sYXRpb24gKi8KLSAgICBwdHJDID0gdGFibGUgKyBwYXJ0V2lkdGg7Ci0gICAgcHRyViA9IHB0ckMgKyA1KnBhcnRXaWR0aDsKLSAgICBmb3IgKHkgPSAocGFydEhlaWdodCA+PiAyKTsgeTsgeS0tKQotICAgIHsKLSAgICAgICAgLyogNCBwZWxzIHBlciBpdGVyYXRpb24gKi8KLSAgICAgICAgZm9yICh4ID0gcGFydFdpZHRoOyB4OyB4LS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcDQgPSBwdHJWWy0oaTMyKXBhcnRXaWR0aCoyXTsKLSAgICAgICAgICAgIHRtcDUgPSBwdHJWWy0oaTMyKXBhcnRXaWR0aF07Ci0gICAgICAgICAgICB0bXAxID0gcHRyVltwYXJ0V2lkdGhdOwotICAgICAgICAgICAgdG1wMiA9IHB0clZbcGFydFdpZHRoKjJdOwotICAgICAgICAgICAgdG1wNiA9ICpwdHJWKys7Ci0KLSAgICAgICAgICAgIHRtcDcgPSB0bXA0ICsgdG1wMTsKLSAgICAgICAgICAgIHRtcDIgLT0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXAyIC09IHRtcDc7Ci0gICAgICAgICAgICB0bXAyICs9IDUxMjsKLSAgICAgICAgICAgIHRtcDcgPSB0bXA1ICsgdG1wNjsKLSAgICAgICAgICAgIHRtcDMgPSBwdHJDW3BhcnRXaWR0aCoyXTsKLSAgICAgICAgICAgIHRtcDIgKz0gKHRtcDcgPDwgNCk7Ci0gICAgICAgICAgICB0bXAyICs9ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wMiArPSB0bXAzOwotICAgICAgICAgICAgdG1wNyA9IGNscFt0bXAyPj4xMF07Ci0gICAgICAgICAgICB0bXAxICs9IDUxMjsKLSAgICAgICAgICAgIG1iWzQ4XSA9ICh1OCl0bXA3OwotCi0gICAgICAgICAgICB0bXA3ID0gdG1wMyArIHRtcDY7Ci0gICAgICAgICAgICB0bXAxIC09ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wMSAtPSB0bXA3OwotICAgICAgICAgICAgdG1wNyA9IHRtcDQgKyB0bXA1OwotICAgICAgICAgICAgdG1wMiA9IHB0ckNbcGFydFdpZHRoXTsKLSAgICAgICAgICAgIHRtcDEgKz0gKHRtcDcgPDwgNCk7Ci0gICAgICAgICAgICB0bXAxICs9ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wMSArPSB0bXAyOwotICAgICAgICAgICAgdG1wNyA9IGNscFt0bXAxPj4xMF07Ci0gICAgICAgICAgICB0bXA2ICs9IDUxMjsKLSAgICAgICAgICAgIG1iWzMyXSA9ICh1OCl0bXA3OwotCi0gICAgICAgICAgICB0bXAxID0gKnB0ckM7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wMiArIHRtcDU7Ci0gICAgICAgICAgICB0bXA2IC09ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNiAtPSB0bXA3OwotICAgICAgICAgICAgdG1wNyA9IHRtcDQgKyB0bXAzOwotICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCA0KTsKLSAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA2ICs9IHRtcDE7Ci0gICAgICAgICAgICB0bXA3ID0gY2xwW3RtcDY+PjEwXTsKLSAgICAgICAgICAgIHRtcDUgKz0gNTEyOwotICAgICAgICAgICAgbWJbMTZdID0gKHU4KXRtcDc7Ci0KLSAgICAgICAgICAgIHRtcDYgPSBwdHJDWy0oaTMyKXBhcnRXaWR0aF07Ci0gICAgICAgICAgICB0bXAxICs9IHRtcDQ7Ci0gICAgICAgICAgICB0bXA1IC09ICh0bXAxIDw8IDIpOwotICAgICAgICAgICAgdG1wNSAtPSB0bXAxOwotICAgICAgICAgICAgdG1wMyArPSB0bXAyOwotICAgICAgICAgICAgdG1wNSArPSAodG1wMyA8PCA0KTsKLSAgICAgICAgICAgIHRtcDUgKz0gKHRtcDMgPDwgMik7Ci0gICAgICAgICAgICB0bXA1ICs9IHRtcDY7Ci0gICAgICAgICAgICB0bXA3ID0gY2xwW3RtcDU+PjEwXTsKLSAgICAgICAgICAgICptYisrID0gKHU4KXRtcDc7Ci0gICAgICAgICAgICBwdHJDKys7Ci0gICAgICAgIH0KLSAgICAgICAgbWIgKz0gNCoxNiAtIHBhcnRXaWR0aDsKLSAgICAgICAgcHRyQyArPSAzKnBhcnRXaWR0aDsKLSAgICAgICAgcHRyViArPSAzKnBhcnRXaWR0aDsKLSAgICB9Ci0KLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RJbnRlcnBvbGF0ZU1pZFZlclF1YXJ0ZXIKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIEZ1bmN0aW9uIHRvIHBlcmZvcm0gaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgaW50ZXJwb2xhdGlvbiBvZiBwaXhlbAotICAgICAgICAgIHBvc2l0aW9uICdmJyBvciAncScgZm9yIGEgYmxvY2suIE92ZXJmaWxsaW5nIGlzIGRvbmUgb25seSBpZiBuZWVkZWQuCi0gICAgICAgICAgUmVmZXJlbmNlIGltYWdlIChyZWYpIGlzIHJlYWQgYXQgY29ycmVjdCBwb3NpdGlvbiBhbmQgdGhlIHByZWRpY3RlZAotICAgICAgICAgIHBhcnQgaXMgd3JpdHRlbiB0byBtYWNyb2Jsb2NrIGFycmF5IChtYikKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVNaWRWZXJRdWFydGVyKAotICB1OCAqcmVmLAotICB1OCAqbWIsCi0gIGkzMiB4MCwKLSAgaTMyIHkwLAotICB1MzIgd2lkdGgsCi0gIHUzMiBoZWlnaHQsCi0gIHUzMiBwYXJ0V2lkdGgsCi0gIHUzMiBwYXJ0SGVpZ2h0LAotICB1MzIgdmVyT2Zmc2V0KSAgICAvKiAwIGZvciBwaXhlbCBmLCAxIGZvciBwaXhlbCBxICovCi17Ci0gICAgdTMyIHAxWzIxKjIxLzQrMV07Ci0gICAgdTMyIHgsIHk7Ci0gICAgaTMyIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHRtcDc7Ci0gICAgaTMyICpwdHJDLCAqcHRyViwgKnB0ckludCwgKmIxOwotICAgIHU4ICAqcHRySjsKLSAgICBpMzIgdGFibGVbMjEqMTZdOwotICAgIGNvbnN0IHU4ICpjbHAgPSBoMjY0YnNkQ2xpcCArIDUxMjsKLQotICAgIC8qIENvZGUgKi8KLQotICAgIEFTU0VSVChyZWYpOwotICAgIEFTU0VSVChtYik7Ci0KLSAgICBpZiAoKHgwIDwgMCkgfHwgKCh1MzIpeDArcGFydFdpZHRoKzUgPiB3aWR0aCkgfHwKLSAgICAgICAgKHkwIDwgMCkgfHwgKCh1MzIpeTArcGFydEhlaWdodCs1ID4gaGVpZ2h0KSkKLSAgICB7Ci0gICAgICAgIGgyNjRic2RGaWxsQmxvY2socmVmLCAodTgqKXAxLCB4MCwgeTAsIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgcGFydFdpZHRoKzUsIHBhcnRIZWlnaHQrNSwgcGFydFdpZHRoKzUpOwotCi0gICAgICAgIHgwID0gMDsKLSAgICAgICAgeTAgPSAwOwotICAgICAgICByZWYgPSAodTgqKXAxOwotICAgICAgICB3aWR0aCA9IHBhcnRXaWR0aCs1OwotICAgIH0KLQotICAgIHJlZiArPSAodTMyKXkwICogd2lkdGggKyAodTMyKXgwOwotCi0gICAgYjEgPSB0YWJsZTsKLSAgICBwdHJKID0gcmVmICsgNTsKLQotICAgIC8qIEZpcnN0IHN0ZXA6IGNhbGN1bGF0ZSBpbnRlcm1lZGlhdGUgdmFsdWVzIGZvcgotICAgICAqIGhvcml6b250YWwgaW50ZXJwb2xhdGlvbiAqLwotICAgIGZvciAoeSA9IHBhcnRIZWlnaHQgKyA1OyB5OyB5LS0pCi0gICAgewotICAgICAgICB0bXA2ID0gKihwdHJKIC0gNSk7Ci0gICAgICAgIHRtcDUgPSAqKHB0ckogLSA0KTsKLSAgICAgICAgdG1wNCA9ICoocHRySiAtIDMpOwotICAgICAgICB0bXAzID0gKihwdHJKIC0gMik7Ci0gICAgICAgIHRtcDIgPSAqKHB0ckogLSAxKTsKLSAgICAgICAgZm9yICh4ID0gKHBhcnRXaWR0aCA+PiAyKTsgeDsgeC0tKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBGaXJzdCBwaXhlbCAqLwotICAgICAgICAgICAgdG1wNyA9IHRtcDMgKyB0bXA0OwotICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCA0KTsKLSAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wMiArIHRtcDU7Ci0gICAgICAgICAgICB0bXAxID0gKnB0ckorKzsKLSAgICAgICAgICAgIHRtcDYgLT0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA2IC09IHRtcDc7Ci0gICAgICAgICAgICB0bXA2ICs9IHRtcDE7Ci0gICAgICAgICAgICAqYjErKyA9IHRtcDY7Ci0gICAgICAgICAgICAvKiBTZWNvbmQgcGl4ZWwgKi8KLSAgICAgICAgICAgIHRtcDcgPSB0bXAyICsgdG1wMzsKLSAgICAgICAgICAgIHRtcDUgKz0gKHRtcDcgPDwgNCk7Ci0gICAgICAgICAgICB0bXA1ICs9ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNyA9IHRtcDEgKyB0bXA0OwotICAgICAgICAgICAgdG1wNiA9ICpwdHJKKys7Ci0gICAgICAgICAgICB0bXA1IC09ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNSAtPSB0bXA3OwotICAgICAgICAgICAgdG1wNSArPSB0bXA2OwotICAgICAgICAgICAgKmIxKysgPSB0bXA1OwotICAgICAgICAgICAgLyogVGhpcmQgcGl4ZWwgKi8KLSAgICAgICAgICAgIHRtcDcgPSB0bXAxICsgdG1wMjsKLSAgICAgICAgICAgIHRtcDQgKz0gKHRtcDcgPDwgNCk7Ci0gICAgICAgICAgICB0bXA0ICs9ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNyA9IHRtcDYgKyB0bXAzOwotICAgICAgICAgICAgdG1wNSA9ICpwdHJKKys7Ci0gICAgICAgICAgICB0bXA0IC09ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNCAtPSB0bXA3OwotICAgICAgICAgICAgdG1wNCArPSB0bXA1OwotICAgICAgICAgICAgKmIxKysgPSB0bXA0OwotICAgICAgICAgICAgLyogRm91cnRoIHBpeGVsICovCi0gICAgICAgICAgICB0bXA3ID0gdG1wNiArIHRtcDE7Ci0gICAgICAgICAgICB0bXAzICs9ICh0bXA3IDw8IDQpOwotICAgICAgICAgICAgdG1wMyArPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDcgPSB0bXA1ICsgdG1wMjsKLSAgICAgICAgICAgIHRtcDQgPSAqcHRySisrOwotICAgICAgICAgICAgdG1wMyAtPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDMgLT0gdG1wNzsKLSAgICAgICAgICAgIHRtcDMgKz0gdG1wNDsKLSAgICAgICAgICAgICpiMSsrID0gdG1wMzsKLSAgICAgICAgICAgIHRtcDcgPSB0bXA0OwotICAgICAgICAgICAgdG1wNCA9IHRtcDY7Ci0gICAgICAgICAgICB0bXA2ID0gdG1wMjsKLSAgICAgICAgICAgIHRtcDIgPSB0bXA3OwotICAgICAgICAgICAgdG1wMyA9IHRtcDU7Ci0gICAgICAgICAgICB0bXA1ID0gdG1wMTsKLSAgICAgICAgfQotICAgICAgICBwdHJKICs9IHdpZHRoIC0gcGFydFdpZHRoOwotICAgIH0KLQotICAgIC8qIFNlY29uZCBzdGVwOiBjYWxjdWxhdGUgdmVydGljYWwgaW50ZXJwb2xhdGlvbiBhbmQgYXZlcmFnZSAqLwotICAgIHB0ckMgPSB0YWJsZSArIHBhcnRXaWR0aDsKLSAgICBwdHJWID0gcHRyQyArIDUqcGFydFdpZHRoOwotICAgIC8qIFBvaW50ZXIgdG8gaW50ZWdlciBzYW1wbGUgcG9zaXRpb24sIGVpdGhlciBNIG9yIFIgKi8KLSAgICBwdHJJbnQgPSBwdHJDICsgKDIrdmVyT2Zmc2V0KSpwYXJ0V2lkdGg7Ci0gICAgZm9yICh5ID0gKHBhcnRIZWlnaHQgPj4gMik7IHk7IHktLSkKLSAgICB7Ci0gICAgICAgIGZvciAoeCA9IHBhcnRXaWR0aDsgeDsgeC0tKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXA0ID0gcHRyVlstKGkzMilwYXJ0V2lkdGgqMl07Ci0gICAgICAgICAgICB0bXA1ID0gcHRyVlstKGkzMilwYXJ0V2lkdGhdOwotICAgICAgICAgICAgdG1wMSA9IHB0clZbcGFydFdpZHRoXTsKLSAgICAgICAgICAgIHRtcDIgPSBwdHJWW3BhcnRXaWR0aCoyXTsKLSAgICAgICAgICAgIHRtcDYgPSAqcHRyVisrOwotCi0gICAgICAgICAgICB0bXA3ID0gdG1wNCArIHRtcDE7Ci0gICAgICAgICAgICB0bXAyIC09ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wMiAtPSB0bXA3OwotICAgICAgICAgICAgdG1wMiArPSA1MTI7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wNSArIHRtcDY7Ci0gICAgICAgICAgICB0bXAzID0gcHRyQ1twYXJ0V2lkdGgqMl07Ci0gICAgICAgICAgICB0bXAyICs9ICh0bXA3IDw8IDQpOwotICAgICAgICAgICAgdG1wMiArPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDcgPSBwdHJJbnRbcGFydFdpZHRoKjJdOwotICAgICAgICAgICAgdG1wMiArPSB0bXAzOwotICAgICAgICAgICAgdG1wMiA9IGNscFt0bXAyPj4xMF07Ci0gICAgICAgICAgICB0bXA3ICs9IDE2OwotICAgICAgICAgICAgdG1wNyA9IGNscFt0bXA3Pj41XTsKLSAgICAgICAgICAgIHRtcDEgKz0gNTEyOwotICAgICAgICAgICAgdG1wMisrOwotICAgICAgICAgICAgbWJbNDhdID0gKHU4KSgodG1wNyArIHRtcDIpID4+IDEpOwotCi0gICAgICAgICAgICB0bXA3ID0gdG1wMyArIHRtcDY7Ci0gICAgICAgICAgICB0bXAxIC09ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wMSAtPSB0bXA3OwotICAgICAgICAgICAgdG1wNyA9IHRtcDQgKyB0bXA1OwotICAgICAgICAgICAgdG1wMiA9IHB0ckNbcGFydFdpZHRoXTsKLSAgICAgICAgICAgIHRtcDEgKz0gKHRtcDcgPDwgNCk7Ci0gICAgICAgICAgICB0bXAxICs9ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNyA9IHB0ckludFtwYXJ0V2lkdGhdOwotICAgICAgICAgICAgdG1wMSArPSB0bXAyOwotICAgICAgICAgICAgdG1wMSA9IGNscFt0bXAxPj4xMF07Ci0gICAgICAgICAgICB0bXA3ICs9IDE2OwotICAgICAgICAgICAgdG1wNyA9IGNscFt0bXA3Pj41XTsKLSAgICAgICAgICAgIHRtcDYgKz0gNTEyOwotICAgICAgICAgICAgdG1wMSsrOwotICAgICAgICAgICAgbWJbMzJdID0gKHU4KSgodG1wNyArIHRtcDEpID4+IDEpOwotCi0gICAgICAgICAgICB0bXAxID0gKnB0ckM7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wMiArIHRtcDU7Ci0gICAgICAgICAgICB0bXA2IC09ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNiAtPSB0bXA3OwotICAgICAgICAgICAgdG1wNyA9IHRtcDQgKyB0bXAzOwotICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCA0KTsKLSAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA3ID0gKnB0ckludDsKLSAgICAgICAgICAgIHRtcDYgKz0gdG1wMTsKLSAgICAgICAgICAgIHRtcDYgPSBjbHBbdG1wNj4+MTBdOwotICAgICAgICAgICAgdG1wNyArPSAxNjsKLSAgICAgICAgICAgIHRtcDcgPSBjbHBbdG1wNz4+NV07Ci0gICAgICAgICAgICB0bXA1ICs9IDUxMjsKLSAgICAgICAgICAgIHRtcDYrKzsKLSAgICAgICAgICAgIG1iWzE2XSA9ICh1OCkoKHRtcDcgKyB0bXA2KSA+PiAxKTsKLQotICAgICAgICAgICAgdG1wNiA9IHB0ckNbLShpMzIpcGFydFdpZHRoXTsKLSAgICAgICAgICAgIHRtcDEgKz0gdG1wNDsKLSAgICAgICAgICAgIHRtcDUgLT0gKHRtcDEgPDwgMik7Ci0gICAgICAgICAgICB0bXA1IC09IHRtcDE7Ci0gICAgICAgICAgICB0bXAzICs9IHRtcDI7Ci0gICAgICAgICAgICB0bXA1ICs9ICh0bXAzIDw8IDQpOwotICAgICAgICAgICAgdG1wNSArPSAodG1wMyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDcgPSBwdHJJbnRbLShpMzIpcGFydFdpZHRoXTsKLSAgICAgICAgICAgIHRtcDUgKz0gdG1wNjsKLSAgICAgICAgICAgIHRtcDUgPSBjbHBbdG1wNT4+MTBdOwotICAgICAgICAgICAgdG1wNyArPSAxNjsKLSAgICAgICAgICAgIHRtcDcgPSBjbHBbdG1wNz4+NV07Ci0gICAgICAgICAgICB0bXA1Kys7Ci0gICAgICAgICAgICAqbWIrKyA9ICh1OCkoKHRtcDcgKyB0bXA1KSA+PiAxKTsKLSAgICAgICAgICAgIHB0ckMrKzsKLSAgICAgICAgICAgIHB0ckludCsrOwotICAgICAgICB9Ci0gICAgICAgIG1iICs9IDQqMTYgLSBwYXJ0V2lkdGg7Ci0gICAgICAgIHB0ckMgKz0gMypwYXJ0V2lkdGg7Ci0gICAgICAgIHB0clYgKz0gMypwYXJ0V2lkdGg7Ci0gICAgICAgIHB0ckludCArPSAzKnBhcnRXaWR0aDsKLSAgICB9Ci0KLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RJbnRlcnBvbGF0ZU1pZEhvclF1YXJ0ZXIKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIEZ1bmN0aW9uIHRvIHBlcmZvcm0gaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgaW50ZXJwb2xhdGlvbiBvZiBwaXhlbAotICAgICAgICAgIHBvc2l0aW9uICdpJyBvciAnaycgZm9yIGEgYmxvY2suIE92ZXJmaWxsaW5nIGlzIGRvbmUgb25seSBpZiBuZWVkZWQuCi0gICAgICAgICAgUmVmZXJlbmNlIGltYWdlIChyZWYpIGlzIHJlYWQgYXQgY29ycmVjdCBwb3NpdGlvbiBhbmQgdGhlIHByZWRpY3RlZAotICAgICAgICAgIHBhcnQgaXMgd3JpdHRlbiB0byBtYWNyb2Jsb2NrIGFycmF5IChtYikKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVNaWRIb3JRdWFydGVyKAotICB1OCAqcmVmLAotICB1OCAqbWIsCi0gIGkzMiB4MCwKLSAgaTMyIHkwLAotICB1MzIgd2lkdGgsCi0gIHUzMiBoZWlnaHQsCi0gIHUzMiBwYXJ0V2lkdGgsCi0gIHUzMiBwYXJ0SGVpZ2h0LAotICB1MzIgaG9yT2Zmc2V0KSAgICAvKiAwIGZvciBwaXhlbCBpLCAxIGZvciBwaXhlbCBrICovCi17Ci0gICAgdTMyIHAxWzIxKjIxLzQrMV07Ci0gICAgdTMyIHgsIHk7Ci0gICAgaTMyIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHRtcDc7Ci0gICAgaTMyICpwdHJKLCAqcHRySW50LCAqaDE7Ci0gICAgdTggICpwdHJDLCAqcHRyVjsKLSAgICBpMzIgdGFibGVbMjEqMTZdOwotICAgIGkzMiB0YWJsZVdpZHRoID0gKGkzMilwYXJ0V2lkdGgrNTsKLSAgICBjb25zdCB1OCAqY2xwID0gaDI2NGJzZENsaXAgKyA1MTI7Ci0KLSAgICAvKiBDb2RlICovCi0KLSAgICBBU1NFUlQocmVmKTsKLSAgICBBU1NFUlQobWIpOwotCi0gICAgaWYgKCh4MCA8IDApIHx8ICgodTMyKXgwK3BhcnRXaWR0aCs1ID4gd2lkdGgpIHx8Ci0gICAgICAgICh5MCA8IDApIHx8ICgodTMyKXkwK3BhcnRIZWlnaHQrNSA+IGhlaWdodCkpCi0gICAgewotICAgICAgICBoMjY0YnNkRmlsbEJsb2NrKHJlZiwgKHU4KilwMSwgeDAsIHkwLCB3aWR0aCwgaGVpZ2h0LAotICAgICAgICAgICAgICAgIHBhcnRXaWR0aCs1LCBwYXJ0SGVpZ2h0KzUsIHBhcnRXaWR0aCs1KTsKLQotICAgICAgICB4MCA9IDA7Ci0gICAgICAgIHkwID0gMDsKLSAgICAgICAgcmVmID0gKHU4KilwMTsKLSAgICAgICAgd2lkdGggPSBwYXJ0V2lkdGgrNTsKLSAgICB9Ci0KLSAgICByZWYgKz0gKHUzMil5MCAqIHdpZHRoICsgKHUzMil4MDsKLQotICAgIGgxID0gdGFibGUgKyB0YWJsZVdpZHRoOwotICAgIHB0ckMgPSByZWYgKyB3aWR0aDsKLSAgICBwdHJWID0gcHRyQyArIDUqd2lkdGg7Ci0KLSAgICAvKiBGaXJzdCBzdGVwOiBjYWxjdWxhdGUgaW50ZXJtZWRpYXRlIHZhbHVlcyBmb3IKLSAgICAgKiB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uICovCi0gICAgZm9yICh5ID0gKHBhcnRIZWlnaHQgPj4gMik7IHk7IHktLSkKLSAgICB7Ci0gICAgICAgIGZvciAoeCA9ICh1MzIpdGFibGVXaWR0aDsgeDsgeC0tKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXA0ID0gcHRyVlstKGkzMil3aWR0aCoyXTsKLSAgICAgICAgICAgIHRtcDUgPSBwdHJWWy0oaTMyKXdpZHRoXTsKLSAgICAgICAgICAgIHRtcDEgPSBwdHJWW3dpZHRoXTsKLSAgICAgICAgICAgIHRtcDIgPSBwdHJWW3dpZHRoKjJdOwotICAgICAgICAgICAgdG1wNiA9ICpwdHJWKys7Ci0KLSAgICAgICAgICAgIHRtcDcgPSB0bXA0ICsgdG1wMTsKLSAgICAgICAgICAgIHRtcDIgLT0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXAyIC09IHRtcDc7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wNSArIHRtcDY7Ci0gICAgICAgICAgICB0bXAzID0gcHRyQ1t3aWR0aCoyXTsKLSAgICAgICAgICAgIHRtcDIgKz0gKHRtcDcgPDwgNCk7Ci0gICAgICAgICAgICB0bXAyICs9ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wMiArPSB0bXAzOwotICAgICAgICAgICAgaDFbdGFibGVXaWR0aCoyXSA9IHRtcDI7Ci0KLSAgICAgICAgICAgIHRtcDcgPSB0bXAzICsgdG1wNjsKLSAgICAgICAgICAgIHRtcDEgLT0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXAxIC09IHRtcDc7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wNCArIHRtcDU7Ci0gICAgICAgICAgICB0bXAyID0gcHRyQ1t3aWR0aF07Ci0gICAgICAgICAgICB0bXAxICs9ICh0bXA3IDw8IDQpOwotICAgICAgICAgICAgdG1wMSArPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDEgKz0gdG1wMjsKLSAgICAgICAgICAgIGgxW3RhYmxlV2lkdGhdID0gdG1wMTsKLQotICAgICAgICAgICAgdG1wMSA9ICpwdHJDOwotICAgICAgICAgICAgdG1wNyA9IHRtcDIgKyB0bXA1OwotICAgICAgICAgICAgdG1wNiAtPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDYgLT0gdG1wNzsKLSAgICAgICAgICAgIHRtcDcgPSB0bXA0ICsgdG1wMzsKLSAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgNCk7Ci0gICAgICAgICAgICB0bXA2ICs9ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNiArPSB0bXAxOwotICAgICAgICAgICAgKmgxID0gdG1wNjsKLQotICAgICAgICAgICAgdG1wNiA9IHB0ckNbLShpMzIpd2lkdGhdOwotICAgICAgICAgICAgdG1wMSArPSB0bXA0OwotICAgICAgICAgICAgdG1wNSAtPSAodG1wMSA8PCAyKTsKLSAgICAgICAgICAgIHRtcDUgLT0gdG1wMTsKLSAgICAgICAgICAgIHRtcDMgKz0gdG1wMjsKLSAgICAgICAgICAgIHRtcDUgKz0gKHRtcDMgPDwgNCk7Ci0gICAgICAgICAgICB0bXA1ICs9ICh0bXAzIDw8IDIpOwotICAgICAgICAgICAgdG1wNSArPSB0bXA2OwotICAgICAgICAgICAgaDFbLXRhYmxlV2lkdGhdID0gdG1wNTsKLSAgICAgICAgICAgIGgxKys7Ci0gICAgICAgICAgICBwdHJDKys7Ci0gICAgICAgIH0KLSAgICAgICAgcHRyQyArPSA0KndpZHRoIC0gcGFydFdpZHRoIC0gNTsKLSAgICAgICAgcHRyViArPSA0KndpZHRoIC0gcGFydFdpZHRoIC0gNTsKLSAgICAgICAgaDEgKz0gMyp0YWJsZVdpZHRoOwotICAgIH0KLQotICAgIC8qIFNlY29uZCBzdGVwOiBjYWxjdWxhdGUgaG9yaXpvbnRhbCBpbnRlcnBvbGF0aW9uIGFuZCBhdmVyYWdlICovCi0gICAgcHRySiA9IHRhYmxlICsgNTsKLSAgICAvKiBQb2ludGVyIHRvIGludGVnZXIgc2FtcGxlIHBvc2l0aW9uLCBlaXRoZXIgRyBvciBIICovCi0gICAgcHRySW50ID0gdGFibGUgKyAyICsgaG9yT2Zmc2V0OwotICAgIGZvciAoeSA9IHBhcnRIZWlnaHQ7IHk7IHktLSkKLSAgICB7Ci0gICAgICAgIHRtcDYgPSAqKHB0ckogLSA1KTsKLSAgICAgICAgdG1wNSA9ICoocHRySiAtIDQpOwotICAgICAgICB0bXA0ID0gKihwdHJKIC0gMyk7Ci0gICAgICAgIHRtcDMgPSAqKHB0ckogLSAyKTsKLSAgICAgICAgdG1wMiA9ICoocHRySiAtIDEpOwotICAgICAgICBmb3IgKHggPSAocGFydFdpZHRoPj4yKTsgeDsgeC0tKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBGaXJzdCBwaXhlbCAqLwotICAgICAgICAgICAgdG1wNiArPSA1MTI7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wMyArIHRtcDQ7Ci0gICAgICAgICAgICB0bXA2ICs9ICh0bXA3IDw8IDQpOwotICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDcgPSB0bXAyICsgdG1wNTsKLSAgICAgICAgICAgIHRtcDEgPSAqcHRySisrOwotICAgICAgICAgICAgdG1wNiAtPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDYgLT0gdG1wNzsKLSAgICAgICAgICAgIHRtcDcgPSAqcHRySW50Kys7Ci0gICAgICAgICAgICB0bXA2ICs9IHRtcDE7Ci0gICAgICAgICAgICB0bXA2ID0gY2xwW3RtcDYgPj4gMTBdOwotICAgICAgICAgICAgdG1wNyArPSAxNjsKLSAgICAgICAgICAgIHRtcDcgPSBjbHBbdG1wNyA+PiA1XTsKLSAgICAgICAgICAgIHRtcDUgKz0gNTEyOwotICAgICAgICAgICAgdG1wNisrOwotICAgICAgICAgICAgKm1iKysgPSAodTgpKCh0bXA2ICsgdG1wNykgPj4gMSk7Ci0gICAgICAgICAgICAvKiBTZWNvbmQgcGl4ZWwgKi8KLSAgICAgICAgICAgIHRtcDcgPSB0bXAyICsgdG1wMzsKLSAgICAgICAgICAgIHRtcDUgKz0gKHRtcDcgPDwgNCk7Ci0gICAgICAgICAgICB0bXA1ICs9ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNyA9IHRtcDEgKyB0bXA0OwotICAgICAgICAgICAgdG1wNiA9ICpwdHJKKys7Ci0gICAgICAgICAgICB0bXA1IC09ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNSAtPSB0bXA3OwotICAgICAgICAgICAgdG1wNyA9ICpwdHJJbnQrKzsKLSAgICAgICAgICAgIHRtcDUgKz0gdG1wNjsKLSAgICAgICAgICAgIHRtcDUgPSBjbHBbdG1wNSA+PiAxMF07Ci0gICAgICAgICAgICB0bXA3ICs9IDE2OwotICAgICAgICAgICAgdG1wNyA9IGNscFt0bXA3ID4+IDVdOwotICAgICAgICAgICAgdG1wNCArPSA1MTI7Ci0gICAgICAgICAgICB0bXA1Kys7Ci0gICAgICAgICAgICAqbWIrKyA9ICh1OCkoKHRtcDUgKyB0bXA3KSA+PiAxKTsKLSAgICAgICAgICAgIC8qIFRoaXJkIHBpeGVsICovCi0gICAgICAgICAgICB0bXA3ID0gdG1wMSArIHRtcDI7Ci0gICAgICAgICAgICB0bXA0ICs9ICh0bXA3IDw8IDQpOwotICAgICAgICAgICAgdG1wNCArPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDcgPSB0bXA2ICsgdG1wMzsKLSAgICAgICAgICAgIHRtcDUgPSAqcHRySisrOwotICAgICAgICAgICAgdG1wNCAtPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDQgLT0gdG1wNzsKLSAgICAgICAgICAgIHRtcDcgPSAqcHRySW50Kys7Ci0gICAgICAgICAgICB0bXA0ICs9IHRtcDU7Ci0gICAgICAgICAgICB0bXA0ID0gY2xwW3RtcDQgPj4gMTBdOwotICAgICAgICAgICAgdG1wNyArPSAxNjsKLSAgICAgICAgICAgIHRtcDcgPSBjbHBbdG1wNyA+PiA1XTsKLSAgICAgICAgICAgIHRtcDMgKz0gNTEyOwotICAgICAgICAgICAgdG1wNCsrOwotICAgICAgICAgICAgKm1iKysgPSAodTgpKCh0bXA0ICsgdG1wNykgPj4gMSk7Ci0gICAgICAgICAgICAvKiBGb3VydGggcGl4ZWwgKi8KLSAgICAgICAgICAgIHRtcDcgPSB0bXA2ICsgdG1wMTsKLSAgICAgICAgICAgIHRtcDMgKz0gKHRtcDcgPDwgNCk7Ci0gICAgICAgICAgICB0bXAzICs9ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNyA9IHRtcDUgKyB0bXAyOwotICAgICAgICAgICAgdG1wNCA9ICpwdHJKKys7Ci0gICAgICAgICAgICB0bXAzIC09ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wMyAtPSB0bXA3OwotICAgICAgICAgICAgdG1wNyA9ICpwdHJJbnQrKzsKLSAgICAgICAgICAgIHRtcDMgKz0gdG1wNDsKLSAgICAgICAgICAgIHRtcDMgPSBjbHBbdG1wMyA+PiAxMF07Ci0gICAgICAgICAgICB0bXA3ICs9IDE2OwotICAgICAgICAgICAgdG1wNyA9IGNscFt0bXA3ID4+IDVdOwotICAgICAgICAgICAgdG1wMysrOwotICAgICAgICAgICAgKm1iKysgPSAodTgpKCh0bXAzICsgdG1wNykgPj4gMSk7Ci0gICAgICAgICAgICB0bXAzID0gdG1wNTsKLSAgICAgICAgICAgIHRtcDUgPSB0bXAxOwotICAgICAgICAgICAgdG1wNyA9IHRtcDQ7Ci0gICAgICAgICAgICB0bXA0ID0gdG1wNjsKLSAgICAgICAgICAgIHRtcDYgPSB0bXAyOwotICAgICAgICAgICAgdG1wMiA9IHRtcDc7Ci0gICAgICAgIH0KLSAgICAgICAgcHRySiArPSA1OwotICAgICAgICBwdHJJbnQgKz0gNTsKLSAgICAgICAgbWIgKz0gMTYgLSBwYXJ0V2lkdGg7Ci0gICAgfQotCi19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkUHJlZGljdFNhbXBsZXMKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFRoaXMgZnVuY3Rpb24gcmVjb25zdHJ1Y3RzIGEgcHJlZGljdGlvbiBmb3IgYSBtYWNyb2Jsb2NrIHBhcnRpdGlvbi4KLSAgICAgICAgICBUaGUgcHJlZGljdGlvbiBpcyBlaXRoZXIgY29waWVkIG9yIGludGVycG9sYXRlZCB1c2luZyB0aGUgcmVmZXJlbmNlCi0gICAgICAgICAgZnJhbWUgYW5kIHRoZSBtb3Rpb24gdmVjdG9yLiBCb3RoIGx1bWluYW5jZSBhbmQgY2hyb21pbmFuY2UgcGFydHMgYXJlCi0gICAgICAgICAgcHJlZGljdGVkLiBUaGUgcHJlZGljdGlvbiBpcyBzdG9yZWQgaW4gZ2l2ZW4gbWFjcm9ibG9jayBhcnJheSAoZGF0YSkuCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICBkYXRhICAgICAgICAgIHBvaW50ZXIgdG8gbWFjcm9ibG9jayBhcnJheSAoMzg0IGJ5dGVzKSBmb3Igb3V0cHV0Ci0gICAgICAgICAgbXYgICAgICAgICAgICBwb2ludGVyIHRvIG1vdGlvbiB2ZWN0b3IgdXNlZCBmb3IgcHJlZGljdGlvbgotICAgICAgICAgIHJlZlBpYyAgICAgICAgcG9pbnRlciB0byByZWZlcmVuY2UgcGljdHVyZSBzdHJ1Y3R1cmUKLSAgICAgICAgICB4QSAgICAgICAgICAgIHgtY29vcmRpbmF0ZSBmb3IgY3VycmVudCBtYWNyb2Jsb2NrCi0gICAgICAgICAgeUEgICAgICAgICAgICB5LWNvb3JkaW5hdGUgZm9yIGN1cnJlbnQgbWFjcm9ibG9jawotICAgICAgICAgIHBhcnRYICAgICAgICAgeC1vZmZzZXQgZm9yIHBhcnRpdGlvbiBpbiBtYWNyb2Jsb2NrCi0gICAgICAgICAgcGFydFkgICAgICAgICB5LW9mZnNldCBmb3IgcGFydGl0aW9uIGluIG1hY3JvYmxvY2sKLSAgICAgICAgICBwYXJ0V2lkdGggICAgIHdpZHRoIG9mIHBhcnRpdGlvbgotICAgICAgICAgIHBhcnRIZWlnaHQgICAgaGVpZ2h0IG9mIHBhcnRpdGlvbgotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgIGRhdGEgICAgICAgICAgbWFjcm9ibG9jayBhcnJheSAoMTZ4MTYrOHg4Kzh4OCkgd2hlcmUgcHJlZGljdGVkCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb24gaXMgc3RvcmVkIGF0IGNvcnJlY3QgcG9zaXRpb24KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBoMjY0YnNkUHJlZGljdFNhbXBsZXMoCi0gIHU4ICpkYXRhLAotICBtdl90ICptdiwKLSAgaW1hZ2VfdCAqcmVmUGljLAotICB1MzIgeEEsCi0gIHUzMiB5QSwKLSAgdTMyIHBhcnRYLAotICB1MzIgcGFydFksCi0gIHUzMiBwYXJ0V2lkdGgsCi0gIHUzMiBwYXJ0SGVpZ2h0KQotCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHhGcmFjLCB5RnJhYywgd2lkdGgsIGhlaWdodDsKLSAgICBpMzIgeEludCwgeUludDsKLSAgICB1OCAqbHVtYVBhcnREYXRhOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoZGF0YSk7Ci0gICAgQVNTRVJUKG12KTsKLSAgICBBU1NFUlQocGFydFdpZHRoKTsKLSAgICBBU1NFUlQocGFydEhlaWdodCk7Ci0gICAgQVNTRVJUKHJlZlBpYyk7Ci0gICAgQVNTRVJUKHJlZlBpYy0+ZGF0YSk7Ci0gICAgQVNTRVJUKHJlZlBpYy0+d2lkdGgpOwotICAgIEFTU0VSVChyZWZQaWMtPmhlaWdodCk7Ci0KLSAgICAvKiBsdW1hICovCi0gICAgbHVtYVBhcnREYXRhID0gZGF0YSArIDE2KnBhcnRZICsgcGFydFg7Ci0KLSAgICB4RnJhYyA9IG12LT5ob3IgJiAweDM7Ci0gICAgeUZyYWMgPSBtdi0+dmVyICYgMHgzOwotCi0gICAgd2lkdGggPSAxNiAqIHJlZlBpYy0+d2lkdGg7Ci0gICAgaGVpZ2h0ID0gMTYgKiByZWZQaWMtPmhlaWdodDsKLQotICAgIHhJbnQgPSAoaTMyKXhBICsgKGkzMilwYXJ0WCArIChtdi0+aG9yID4+IDIpOwotICAgIHlJbnQgPSAoaTMyKXlBICsgKGkzMilwYXJ0WSArIChtdi0+dmVyID4+IDIpOwotCi0gICAgQVNTRVJUKGx1bWFGcmFjUG9zW3hGcmFjXVt5RnJhY10gPCAxNik7Ci0KLSAgICBzd2l0Y2ggKGx1bWFGcmFjUG9zW3hGcmFjXVt5RnJhY10pCi0gICAgewotICAgICAgICBjYXNlIDA6IC8qIEcgKi8KLSAgICAgICAgICAgIGgyNjRic2RGaWxsQmxvY2socmVmUGljLT5kYXRhLCBsdW1hUGFydERhdGEsCi0gICAgICAgICAgICAgICAgICAgIHhJbnQseUludCx3aWR0aCxoZWlnaHQscGFydFdpZHRoLHBhcnRIZWlnaHQsMTYpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTogLyogZCAqLwotICAgICAgICAgICAgaDI2NGJzZEludGVycG9sYXRlVmVyUXVhcnRlcihyZWZQaWMtPmRhdGEsIGx1bWFQYXJ0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgeEludCwgeUludC0yLCB3aWR0aCwgaGVpZ2h0LCBwYXJ0V2lkdGgsIHBhcnRIZWlnaHQsIDApOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjogLyogaCAqLwotICAgICAgICAgICAgaDI2NGJzZEludGVycG9sYXRlVmVySGFsZihyZWZQaWMtPmRhdGEsIGx1bWFQYXJ0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgeEludCwgeUludC0yLCB3aWR0aCwgaGVpZ2h0LCBwYXJ0V2lkdGgsIHBhcnRIZWlnaHQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzogLyogbiAqLwotICAgICAgICAgICAgaDI2NGJzZEludGVycG9sYXRlVmVyUXVhcnRlcihyZWZQaWMtPmRhdGEsIGx1bWFQYXJ0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgeEludCwgeUludC0yLCB3aWR0aCwgaGVpZ2h0LCBwYXJ0V2lkdGgsIHBhcnRIZWlnaHQsIDEpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDogLyogYSAqLwotICAgICAgICAgICAgaDI2NGJzZEludGVycG9sYXRlSG9yUXVhcnRlcihyZWZQaWMtPmRhdGEsIGx1bWFQYXJ0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgeEludC0yLCB5SW50LCB3aWR0aCwgaGVpZ2h0LCBwYXJ0V2lkdGgsIHBhcnRIZWlnaHQsIDApOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNTogLyogZSAqLwotICAgICAgICAgICAgaDI2NGJzZEludGVycG9sYXRlSG9yVmVyUXVhcnRlcihyZWZQaWMtPmRhdGEsIGx1bWFQYXJ0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgeEludC0yLCB5SW50LTIsIHdpZHRoLCBoZWlnaHQsIHBhcnRXaWR0aCwgcGFydEhlaWdodCwgMCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA2OiAvKiBpICovCi0gICAgICAgICAgICBoMjY0YnNkSW50ZXJwb2xhdGVNaWRIb3JRdWFydGVyKHJlZlBpYy0+ZGF0YSwgbHVtYVBhcnREYXRhLAotICAgICAgICAgICAgICAgICAgICB4SW50LTIsIHlJbnQtMiwgd2lkdGgsIGhlaWdodCwgcGFydFdpZHRoLCBwYXJ0SGVpZ2h0LCAwKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDc6IC8qIHAgKi8KLSAgICAgICAgICAgIGgyNjRic2RJbnRlcnBvbGF0ZUhvclZlclF1YXJ0ZXIocmVmUGljLT5kYXRhLCBsdW1hUGFydERhdGEsCi0gICAgICAgICAgICAgICAgICAgIHhJbnQtMiwgeUludC0yLCB3aWR0aCwgaGVpZ2h0LCBwYXJ0V2lkdGgsIHBhcnRIZWlnaHQsIDIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgODogLyogYiAqLwotICAgICAgICAgICAgaDI2NGJzZEludGVycG9sYXRlSG9ySGFsZihyZWZQaWMtPmRhdGEsIGx1bWFQYXJ0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgeEludC0yLCB5SW50LCB3aWR0aCwgaGVpZ2h0LCBwYXJ0V2lkdGgsIHBhcnRIZWlnaHQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgOTogLyogZiAqLwotICAgICAgICAgICAgaDI2NGJzZEludGVycG9sYXRlTWlkVmVyUXVhcnRlcihyZWZQaWMtPmRhdGEsIGx1bWFQYXJ0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgeEludC0yLCB5SW50LTIsIHdpZHRoLCBoZWlnaHQsIHBhcnRXaWR0aCwgcGFydEhlaWdodCwgMCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMDogLyogaiAqLwotICAgICAgICAgICAgaDI2NGJzZEludGVycG9sYXRlTWlkSGFsZihyZWZQaWMtPmRhdGEsIGx1bWFQYXJ0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgeEludC0yLCB5SW50LTIsIHdpZHRoLCBoZWlnaHQsIHBhcnRXaWR0aCwgcGFydEhlaWdodCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMTogLyogcSAqLwotICAgICAgICAgICAgaDI2NGJzZEludGVycG9sYXRlTWlkVmVyUXVhcnRlcihyZWZQaWMtPmRhdGEsIGx1bWFQYXJ0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgeEludC0yLCB5SW50LTIsIHdpZHRoLCBoZWlnaHQsIHBhcnRXaWR0aCwgcGFydEhlaWdodCwgMSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMjogLyogYyAqLwotICAgICAgICAgICAgaDI2NGJzZEludGVycG9sYXRlSG9yUXVhcnRlcihyZWZQaWMtPmRhdGEsIGx1bWFQYXJ0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgeEludC0yLCB5SW50LCB3aWR0aCwgaGVpZ2h0LCBwYXJ0V2lkdGgsIHBhcnRIZWlnaHQsIDEpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTM6IC8qIGcgKi8KLSAgICAgICAgICAgIGgyNjRic2RJbnRlcnBvbGF0ZUhvclZlclF1YXJ0ZXIocmVmUGljLT5kYXRhLCBsdW1hUGFydERhdGEsCi0gICAgICAgICAgICAgICAgICAgIHhJbnQtMiwgeUludC0yLCB3aWR0aCwgaGVpZ2h0LCBwYXJ0V2lkdGgsIHBhcnRIZWlnaHQsIDEpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTQ6IC8qIGsgKi8KLSAgICAgICAgICAgIGgyNjRic2RJbnRlcnBvbGF0ZU1pZEhvclF1YXJ0ZXIocmVmUGljLT5kYXRhLCBsdW1hUGFydERhdGEsCi0gICAgICAgICAgICAgICAgICAgIHhJbnQtMiwgeUludC0yLCB3aWR0aCwgaGVpZ2h0LCBwYXJ0V2lkdGgsIHBhcnRIZWlnaHQsIDEpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6IC8qIGNhc2UgMTUsIHIgKi8KLSAgICAgICAgICAgIGgyNjRic2RJbnRlcnBvbGF0ZUhvclZlclF1YXJ0ZXIocmVmUGljLT5kYXRhLCBsdW1hUGFydERhdGEsCi0gICAgICAgICAgICAgICAgICAgIHhJbnQtMiwgeUludC0yLCB3aWR0aCwgaGVpZ2h0LCBwYXJ0V2lkdGgsIHBhcnRIZWlnaHQsIDMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLyogY2hyb21hICovCi0gICAgUHJlZGljdENocm9tYSgKLSAgICAgIGRhdGEgKyAxNioxNiArIChwYXJ0WT4+MSkqOCArIChwYXJ0WD4+MSksCi0gICAgICB4QSArIHBhcnRYLAotICAgICAgeUEgKyBwYXJ0WSwKLSAgICAgIHBhcnRXaWR0aCwKLSAgICAgIHBhcnRIZWlnaHQsCi0gICAgICBtdiwKLSAgICAgIHJlZlBpYyk7Ci0KLX0KLQotI2Vsc2UgLyogSDI2NERFQ19PTVhETCAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkUHJlZGljdFNhbXBsZXMKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFRoaXMgZnVuY3Rpb24gcmVjb25zdHJ1Y3RzIGEgcHJlZGljdGlvbiBmb3IgYSBtYWNyb2Jsb2NrIHBhcnRpdGlvbi4KLSAgICAgICAgICBUaGUgcHJlZGljdGlvbiBpcyBlaXRoZXIgY29waWVkIG9yIGludGVycG9sYXRlZCB1c2luZyB0aGUgcmVmZXJlbmNlCi0gICAgICAgICAgZnJhbWUgYW5kIHRoZSBtb3Rpb24gdmVjdG9yLiBCb3RoIGx1bWluYW5jZSBhbmQgY2hyb21pbmFuY2UgcGFydHMgYXJlCi0gICAgICAgICAgcHJlZGljdGVkLiBUaGUgcHJlZGljdGlvbiBpcyBzdG9yZWQgaW4gZ2l2ZW4gbWFjcm9ibG9jayBhcnJheSAoZGF0YSkuCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICBkYXRhICAgICAgICAgIHBvaW50ZXIgdG8gbWFjcm9ibG9jayBhcnJheSAoMzg0IGJ5dGVzKSBmb3Igb3V0cHV0Ci0gICAgICAgICAgbXYgICAgICAgICAgICBwb2ludGVyIHRvIG1vdGlvbiB2ZWN0b3IgdXNlZCBmb3IgcHJlZGljdGlvbgotICAgICAgICAgIHJlZlBpYyAgICAgICAgcG9pbnRlciB0byByZWZlcmVuY2UgcGljdHVyZSBzdHJ1Y3R1cmUKLSAgICAgICAgICB4QSAgICAgICAgICAgIHgtY29vcmRpbmF0ZSBmb3IgY3VycmVudCBtYWNyb2Jsb2NrCi0gICAgICAgICAgeUEgICAgICAgICAgICB5LWNvb3JkaW5hdGUgZm9yIGN1cnJlbnQgbWFjcm9ibG9jawotICAgICAgICAgIHBhcnRYICAgICAgICAgeC1vZmZzZXQgZm9yIHBhcnRpdGlvbiBpbiBtYWNyb2Jsb2NrCi0gICAgICAgICAgcGFydFkgICAgICAgICB5LW9mZnNldCBmb3IgcGFydGl0aW9uIGluIG1hY3JvYmxvY2sKLSAgICAgICAgICBwYXJ0V2lkdGggICAgIHdpZHRoIG9mIHBhcnRpdGlvbgotICAgICAgICAgIHBhcnRIZWlnaHQgICAgaGVpZ2h0IG9mIHBhcnRpdGlvbgotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgIGRhdGEgICAgICAgICAgbWFjcm9ibG9jayBhcnJheSAoMTZ4MTYrOHg4Kzh4OCkgd2hlcmUgcHJlZGljdGVkCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb24gaXMgc3RvcmVkIGF0IGNvcnJlY3QgcG9zaXRpb24KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLypsaW50IC1lezU1MH0gU3ltYm9sICdyZXMnIG5vdCBhY2Nlc3NlZCAqLwotdm9pZCBoMjY0YnNkUHJlZGljdFNhbXBsZXMoCi0gIHU4ICpkYXRhLAotICBtdl90ICptdiwKLSAgaW1hZ2VfdCAqcmVmUGljLAotICB1MzIgY29sQW5kUm93LAotICB1MzIgcGFydCwKLSAgdTggKnBGaWxsKQotCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHhGcmFjLCB5RnJhYzsKLSAgICB1MzIgd2lkdGgsIGhlaWdodDsKLSAgICBpMzIgeEludCwgeUludCwgeDAsIHkwOwotICAgIHU4ICpwYXJ0RGF0YSwgKnJlZjsKLSAgICBPTVhTaXplIHJvaTsKLSAgICB1MzIgZmlsbFdpZHRoOwotICAgIHUzMiBmaWxsSGVpZ2h0OwotICAgIE9NWFJlc3VsdCByZXM7Ci0gICAgdTMyIHhBLCB5QTsKLSAgICB1MzIgcGFydFgsIHBhcnRZOwotICAgIHUzMiBwYXJ0V2lkdGgsIHBhcnRIZWlnaHQ7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChkYXRhKTsKLSAgICBBU1NFUlQobXYpOwotICAgIEFTU0VSVChyZWZQaWMpOwotICAgIEFTU0VSVChyZWZQaWMtPmRhdGEpOwotICAgIEFTU0VSVChyZWZQaWMtPndpZHRoKTsKLSAgICBBU1NFUlQocmVmUGljLT5oZWlnaHQpOwotCi0gICAgeEEgPSAoY29sQW5kUm93ICYgMHhGRkZGMDAwMCkgPj4gMTY7Ci0gICAgeUEgPSAoY29sQW5kUm93ICYgMHgwMDAwRkZGRik7Ci0KLSAgICBwYXJ0WCA9IChwYXJ0ICYgMHhGRjAwMDAwMCkgPj4gMjQ7Ci0gICAgcGFydFkgPSAocGFydCAmIDB4MDBGRjAwMDApID4+IDE2OwotICAgIHBhcnRXaWR0aCA9IChwYXJ0ICYgMHgwMDAwRkYwMCkgPj4gODsKLSAgICBwYXJ0SGVpZ2h0ID0gKHBhcnQgJiAweDAwMDAwMEZGKTsKLQotICAgIEFTU0VSVChwYXJ0V2lkdGgpOwotICAgIEFTU0VSVChwYXJ0SGVpZ2h0KTsKLQotICAgIC8qIGx1bWEgKi8KLSAgICBwYXJ0RGF0YSA9IGRhdGEgKyAxNipwYXJ0WSArIHBhcnRYOwotCi0gICAgeEZyYWMgPSBtdi0+aG9yICYgMHgzOwotICAgIHlGcmFjID0gbXYtPnZlciAmIDB4MzsKLQotICAgIHdpZHRoID0gMTYgKiByZWZQaWMtPndpZHRoOwotICAgIGhlaWdodCA9IDE2ICogcmVmUGljLT5oZWlnaHQ7Ci0KLSAgICB4SW50ID0gKGkzMil4QSArIChpMzIpcGFydFggKyAobXYtPmhvciA+PiAyKTsKLSAgICB5SW50ID0gKGkzMil5QSArIChpMzIpcGFydFkgKyAobXYtPnZlciA+PiAyKTsKLQotICAgIHgwID0gKHhGcmFjKSA/IHhJbnQtMiA6IHhJbnQ7Ci0gICAgeTAgPSAoeUZyYWMpID8geUludC0yIDogeUludDsKLQotICAgIGlmICh4RnJhYykKLSAgICB7Ci0gICAgICAgIGlmIChwYXJ0V2lkdGggPT0gMTYpCi0gICAgICAgICAgICBmaWxsV2lkdGggPSAzMjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZmlsbFdpZHRoID0gMTY7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgZmlsbFdpZHRoID0gKHBhcnRXaWR0aCoyKTsKLSAgICBpZiAoeUZyYWMpCi0gICAgICAgIGZpbGxIZWlnaHQgPSBwYXJ0SGVpZ2h0KzU7Ci0gICAgZWxzZQotICAgICAgICBmaWxsSGVpZ2h0ID0gcGFydEhlaWdodDsKLQotCi0gICAgaWYgKCh4MCA8IDApIHx8ICgodTMyKXgwK2ZpbGxXaWR0aCA+IHdpZHRoKSB8fAotICAgICAgICAoeTAgPCAwKSB8fCAoKHUzMil5MCtmaWxsSGVpZ2h0ID4gaGVpZ2h0KSkKLSAgICB7Ci0gICAgICAgIGgyNjRic2RGaWxsQmxvY2socmVmUGljLT5kYXRhLCAodTgqKXBGaWxsLCB4MCwgeTAsIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgZmlsbFdpZHRoLCBmaWxsSGVpZ2h0LCBmaWxsV2lkdGgpOwotCi0gICAgICAgIHgwID0gMDsKLSAgICAgICAgeTAgPSAwOwotICAgICAgICByZWYgPSBwRmlsbDsKLSAgICAgICAgd2lkdGggPSBmaWxsV2lkdGg7Ci0gICAgICAgIGlmICh5RnJhYykKLSAgICAgICAgICAgIHJlZiArPSAyKndpZHRoOwotICAgICAgICBpZiAoeEZyYWMpCi0gICAgICAgICAgICByZWYgKz0gMjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLypsaW50IC0tZSg3MzcpIExvc3Mgb2Ygc2lnbiAqLwotICAgICAgICByZWYgPSByZWZQaWMtPmRhdGEgKyB5SW50KndpZHRoICsgeEludDsKLSAgICB9Ci0gICAgLyogTHVtYSBpbnRlcnBvbGF0aW9uICovCi0gICAgcm9pLndpZHRoID0gKGkzMilwYXJ0V2lkdGg7Ci0gICAgcm9pLmhlaWdodCA9IChpMzIpcGFydEhlaWdodDsKLQotICAgIHJlcyA9IG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hKHJlZiwgKGkzMil3aWR0aCwgcGFydERhdGEsIDE2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpMzIpeEZyYWMsIChpMzIpeUZyYWMsIHJvaSk7Ci0gICAgQVNTRVJUKHJlcyA9PSAwKTsKLQotICAgIC8qIENocm9tYSAqLwotICAgIHdpZHRoICA9IDggKiByZWZQaWMtPndpZHRoOwotICAgIGhlaWdodCA9IDggKiByZWZQaWMtPmhlaWdodDsKLQotICAgIHgwID0gKCh4QSArIHBhcnRYKSA+PiAxKSArIChtdi0+aG9yID4+IDMpOwotICAgIHkwID0gKCh5QSArIHBhcnRZKSA+PiAxKSArIChtdi0+dmVyID4+IDMpOwotICAgIHhGcmFjID0gbXYtPmhvciAmIDB4NzsKLSAgICB5RnJhYyA9IG12LT52ZXIgJiAweDc7Ci0KLSAgICByZWYgPSByZWZQaWMtPmRhdGEgKyAyNTYgKiByZWZQaWMtPndpZHRoICogcmVmUGljLT5oZWlnaHQ7Ci0KLSAgICByb2kud2lkdGggPSAoaTMyKShwYXJ0V2lkdGggPj4gMSk7Ci0gICAgZmlsbFdpZHRoID0gKChwYXJ0V2lkdGggPj4gMSkgKyA4KSAmIH4weDc7Ci0gICAgcm9pLmhlaWdodCA9IChpMzIpKHBhcnRIZWlnaHQgPj4gMSk7Ci0gICAgZmlsbEhlaWdodCA9IChwYXJ0SGVpZ2h0ID4+IDEpICsgMTsKLQotICAgIGlmICgoeDAgPCAwKSB8fCAoKHUzMil4MCtmaWxsV2lkdGggPiB3aWR0aCkgfHwKLSAgICAgICAgKHkwIDwgMCkgfHwgKCh1MzIpeTArZmlsbEhlaWdodCA+IGhlaWdodCkpCi0gICAgewotICAgICAgICBoMjY0YnNkRmlsbEJsb2NrKHJlZiwgcEZpbGwsIHgwLCB5MCwgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgIGZpbGxXaWR0aCwgZmlsbEhlaWdodCwgZmlsbFdpZHRoKTsKLSAgICAgICAgcmVmICs9IHdpZHRoICogaGVpZ2h0OwotICAgICAgICBoMjY0YnNkRmlsbEJsb2NrKHJlZiwgcEZpbGwgKyBmaWxsV2lkdGgqZmlsbEhlaWdodCwKLSAgICAgICAgICAgIHgwLCB5MCwgd2lkdGgsIGhlaWdodCwgZmlsbFdpZHRoLAotICAgICAgICAgICAgZmlsbEhlaWdodCwgZmlsbFdpZHRoKTsKLQotICAgICAgICByZWYgPSBwRmlsbDsKLSAgICAgICAgeDAgPSAwOwotICAgICAgICB5MCA9IDA7Ci0gICAgICAgIHdpZHRoID0gZmlsbFdpZHRoOwotICAgICAgICBoZWlnaHQgPSBmaWxsSGVpZ2h0OwotICAgIH0KLQotICAgIHBhcnREYXRhID0gZGF0YSArIDE2KjE2ICsgKHBhcnRZPj4xKSo4ICsgKHBhcnRYPj4xKTsKLQotICAgIC8qIENocm9tYSBpbnRlcnBvbGF0aW9uICovCi0gICAgLypsaW50IC0tZSg3MzcpIExvc3Mgb2Ygc2lnbiAqLwotICAgIHJlZiArPSB5MCAqIHdpZHRoICsgeDA7Ci0gICAgcmVzID0gYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEocmVmLCB3aWR0aCwgcGFydERhdGEsIDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHUzMilyb2kud2lkdGgsICh1MzIpcm9pLmhlaWdodCwgeEZyYWMsIHlGcmFjKTsKLSAgICBBU1NFUlQocmVzID09IDApOwotICAgIHBhcnREYXRhICs9IDggKiA4OwotICAgIHJlZiArPSBoZWlnaHQgKiB3aWR0aDsKLSAgICByZXMgPSBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYShyZWYsIHdpZHRoLCBwYXJ0RGF0YSwgOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodTMyKXJvaS53aWR0aCwgKHUzMilyb2kuaGVpZ2h0LCB4RnJhYywgeUZyYWMpOwotICAgIEFTU0VSVChyZXMgPT0gMCk7Ci0KLX0KLQotI2VuZGlmIC8qIEgyNjRERUNfT01YREwgKi8KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEZpbGxSb3cxCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGdldHMgYSByb3cgb2YgcmVmZXJlbmNlIHBlbHMgaW4gYSAnbm9ybWFsJyBjYXNlIHdoZW4gbm8KLSAgICAgICAgICBvdmVyZmlsbGluZyBpcyBuZWNlc3NhcnkuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB2b2lkIEZpbGxSb3cxKAotICB1OCAqcmVmLAotICB1OCAqZmlsbCwKLSAgaTMyIGxlZnQsCi0gIGkzMiBjZW50ZXIsCi0gIGkzMiByaWdodCkKLXsKLSAgICBVTlVTRUQobGVmdCk7Ci0gICAgVU5VU0VEKHJpZ2h0KTsKLSAgICBBU1NFUlQocmVmKTsKLSAgICBBU1NFUlQoZmlsbCk7Ci0KLSAgICBIMjY0U3dEZWNNZW1jcHkoZmlsbCwgcmVmLCAodTMyKWNlbnRlcik7Ci0KLSAgICAvKmxpbnQgLWUoNzE1KSAqLwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZEZpbGxSb3c3Ci0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGdldHMgYSByb3cgb2YgcmVmZXJlbmNlIHBlbHMgd2hlbiBob3Jpem9udGFsIGNvb3JkaW5hdGUKLSAgICAgICAgICBpcyBwYXJ0bHkgbmVnYXRpdmUgb3IgcGFydGx5IGdyZWF0ZXIgdGhhbiByZWZlcmVuY2UgcGljdHVyZSB3aWR0aAotICAgICAgICAgIChvdmVyZmlsbGluZyBzb21lIHBlbHMgb24gbGVmdCBhbmQvb3IgcmlnaHQgZWRnZSkuCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICByZWYgICAgICAgcG9pbnRlciB0byByZWZlcmVuY2Ugc2FtcGxlcwotICAgICAgICAgIGxlZnQgICAgICBhbW91bnQgb2YgcGl4ZWxzIHRvIG92ZXJmaWxsIG9uIGxlZnQtZWRnZQotICAgICAgICAgIGNlbnRlciAgICBhbW91bnQgb2YgcGl4ZWxzIHRvIGNvcHkKLSAgICAgICAgICByaWdodCAgICAgYW1vdW50IG9mIHBpeGVscyB0byBvdmVyZmlsbCBvbiByaWdodC1lZGdlCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgZmlsbCAgICAgIHBvaW50ZXIgd2hlcmUgc2FtcGxlcyBhcmUgc3RvcmVkCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaWZuZGVmIEgyNjRERUNfTkVPTgotdm9pZCBoMjY0YnNkRmlsbFJvdzcoCi0gIHU4ICpyZWYsCi0gIHU4ICpmaWxsLAotICBpMzIgbGVmdCwKLSAgaTMyIGNlbnRlciwKLSAgaTMyIHJpZ2h0KQotewotICAgIHU4IHRtcDsKLQotICAgIEFTU0VSVChyZWYpOwotICAgIEFTU0VSVChmaWxsKTsKLQotICAgIGlmIChsZWZ0KQotICAgICAgICB0bXAgPSAqcmVmOwotCi0gICAgZm9yICggOyBsZWZ0OyBsZWZ0LS0pCi0gICAgICAgIC8qbGludCAtZXN5bSg2NDQsdG1wKSAgdG1wIGlzIGluaXRpYWxpemVkIGlmIHVzZWQgKi8KLSAgICAgICAgKmZpbGwrKyA9IHRtcDsKLQotICAgIGZvciAoIDsgY2VudGVyOyBjZW50ZXItLSkKLSAgICAgICAgKmZpbGwrKyA9ICpyZWYrKzsKLQotICAgIGlmIChyaWdodCkKLSAgICAgICAgdG1wID0gcmVmWy0xXTsKLQotICAgIGZvciAoIDsgcmlnaHQ7IHJpZ2h0LS0pCi0gICAgICAgIC8qbGludCAtZXN5bSg2NDQsdG1wKSAgdG1wIGlzIGluaXRpYWxpemVkIGlmIHVzZWQgKi8KLSAgICAgICAgKmZpbGwrKyA9IHRtcDsKLX0KLSNlbmRpZgotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkRmlsbEJsb2NrCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGdldHMgYSBibG9jayBvZiByZWZlcmVuY2UgcGVscy4gSXQgZGV0ZXJtaW5lcyB3aGV0aGVyCi0gICAgICAgICAgb3ZlcmZpbGxpbmcgaXMgbmVlZGVkIG9yIG5vdCBhbmQgcmVwZWF0ZWRseSBjYWxscyBhbiBhcHByb3ByaWF0ZQotICAgICAgICAgIGZ1bmN0aW9uIChieSB1c2luZyBhIGZ1bmN0aW9uIHBvaW50ZXIpIHRoYXQgZmlsbHMgb25lIHJvdyB0aGUgYmxvY2suCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICByZWYgICAgICAgICAgICAgICBwb2ludGVyIHRvIHJlZmVyZW5jZSBmcmFtZQotICAgICAgICAgIHgwICAgICAgICAgICAgICAgIHgtY29vcmRpbmF0ZSBmb3IgYmxvY2sKLSAgICAgICAgICB5MCAgICAgICAgICAgICAgICB5LWNvb3JkaW5hdGUgZm9yIGJsb2NrCi0gICAgICAgICAgd2lkdGggICAgICAgICAgICAgd2lkdGggb2YgcmVmZXJlbmNlIGZyYW1lCi0gICAgICAgICAgaGVpZ2h0ICAgICAgICAgICAgaGVpZ2h0IG9mIHJlZmVyZW5jZSBmcmFtZQotICAgICAgICAgIGJsb2NrV2lkdGggICAgICAgIHdpZHRoIG9mIGJsb2NrCi0gICAgICAgICAgYmxvY2tIZWlnaHQgICAgICAgaGVpZ2h0IG9mIGJsb2NrCi0gICAgICAgICAgZmlsbFNjYW5MZW5ndGggICAgbGVuZ3RoIG9mIGEgbGluZSBpbiBvdXRwdXQgYXJyYXkgKHBpeGVscykKLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICBmaWxsICAgICAgICAgICAgICBwb2ludGVyIHRvIGFycmF5IHdoZXJlIG91dHB1dCBibG9jayBpcyB3cml0dGVuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgaDI2NGJzZEZpbGxCbG9jaygKLSAgdTggKnJlZiwKLSAgdTggKmZpbGwsCi0gIGkzMiB4MCwKLSAgaTMyIHkwLAotICB1MzIgd2lkdGgsCi0gIHUzMiBoZWlnaHQsCi0gIHUzMiBibG9ja1dpZHRoLAotICB1MzIgYmxvY2tIZWlnaHQsCi0gIHUzMiBmaWxsU2Nhbkxlbmd0aCkKLQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIGkzMiB4c3RvcCwgeXN0b3A7Ci0gICAgdm9pZCAoKmZwKSh1OCosIHU4KiwgaTMyLCBpMzIsIGkzMik7Ci0gICAgaTMyIGxlZnQsIHgsIHJpZ2h0OwotICAgIGkzMiB0b3AsIHksIGJvdHRvbTsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHJlZik7Ci0gICAgQVNTRVJUKGZpbGwpOwotICAgIEFTU0VSVCh3aWR0aCk7Ci0gICAgQVNTRVJUKGhlaWdodCk7Ci0gICAgQVNTRVJUKGZpbGwpOwotICAgIEFTU0VSVChibG9ja1dpZHRoKTsKLSAgICBBU1NFUlQoYmxvY2tIZWlnaHQpOwotCi0gICAgeHN0b3AgPSB4MCArIChpMzIpYmxvY2tXaWR0aDsKLSAgICB5c3RvcCA9IHkwICsgKGkzMilibG9ja0hlaWdodDsKLQotICAgIC8qIENob29zZSBjb3JyZWN0IGZ1bmN0aW9uIHdoZXRoZXIgb3ZlcmZpbGxpbmcgb24gbGVmdC1lZGdlIG9yIHJpZ2h0LWVkZ2UKLSAgICAgKiBpcyBuZWVkZWQgb3Igbm90ICovCi0gICAgaWYgKHgwID49IDAgJiYgeHN0b3AgPD0gKGkzMil3aWR0aCkKLSAgICAgICAgZnAgPSBGaWxsUm93MTsKLSAgICBlbHNlCi0gICAgICAgIGZwID0gaDI2NGJzZEZpbGxSb3c3OwotCi0gICAgaWYgKHlzdG9wIDwgMCkKLSAgICAgICAgeTAgPSAtKGkzMilibG9ja0hlaWdodDsKLQotICAgIGlmICh4c3RvcCA8IDApCi0gICAgICAgIHgwID0gLShpMzIpYmxvY2tXaWR0aDsKLQotICAgIGlmICh5MCA+IChpMzIpaGVpZ2h0KQotICAgICAgICB5MCA9IChpMzIpaGVpZ2h0OwotCi0gICAgaWYgKHgwID4gKGkzMil3aWR0aCkKLSAgICAgICAgeDAgPSAoaTMyKXdpZHRoOwotCi0gICAgeHN0b3AgPSB4MCArIChpMzIpYmxvY2tXaWR0aDsKLSAgICB5c3RvcCA9IHkwICsgKGkzMilibG9ja0hlaWdodDsKLQotICAgIGlmICh4MCA+IDApCi0gICAgICAgIHJlZiArPSB4MDsKLQotICAgIGlmICh5MCA+IDApCi0gICAgICAgIHJlZiArPSB5MCAqIChpMzIpd2lkdGg7Ci0KLSAgICBsZWZ0ID0geDAgPCAwID8gLXgwIDogMDsKLSAgICByaWdodCA9IHhzdG9wID4gKGkzMil3aWR0aCA/IHhzdG9wIC0gKGkzMil3aWR0aCA6IDA7Ci0gICAgeCA9IChpMzIpYmxvY2tXaWR0aCAtIGxlZnQgLSByaWdodDsKLQotICAgIHRvcCA9IHkwIDwgMCA/IC15MCA6IDA7Ci0gICAgYm90dG9tID0geXN0b3AgPiAoaTMyKWhlaWdodCA/IHlzdG9wIC0gKGkzMiloZWlnaHQgOiAwOwotICAgIHkgPSAoaTMyKWJsb2NrSGVpZ2h0IC0gdG9wIC0gYm90dG9tOwotCi0gICAgLyogVG9wLW92ZXJmaWxsaW5nICovCi0gICAgZm9yICggOyB0b3A7IHRvcC0tICkKLSAgICB7Ci0gICAgICAgICgqZnApKHJlZiwgZmlsbCwgbGVmdCwgeCwgcmlnaHQpOwotICAgICAgICBmaWxsICs9IGZpbGxTY2FuTGVuZ3RoOwotICAgIH0KLQotICAgIC8qIExpbmVzIGluc2lkZSByZWZlcmVuY2UgaW1hZ2UgKi8KLSAgICBmb3IgKCA7IHk7IHktLSApCi0gICAgewotICAgICAgICAoKmZwKShyZWYsIGZpbGwsIGxlZnQsIHgsIHJpZ2h0KTsKLSAgICAgICAgcmVmICs9IHdpZHRoOwotICAgICAgICBmaWxsICs9IGZpbGxTY2FuTGVuZ3RoOwotICAgIH0KLQotICAgIHJlZiAtPSB3aWR0aDsKLQotICAgIC8qIEJvdHRvbS1vdmVyZmlsbGluZyAqLwotICAgIGZvciAoIDsgYm90dG9tOyBib3R0b20tLSApCi0gICAgewotICAgICAgICAoKmZwKShyZWYsIGZpbGwsIGxlZnQsIHgsIHJpZ2h0KTsKLSAgICAgICAgZmlsbCArPSBmaWxsU2Nhbkxlbmd0aDsKLSAgICB9Ci19Ci0KLS8qbGludCArZTcwMSArZTcwMiAqLwotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9yZWNvbnN0cnVjdC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3JlY29uc3RydWN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhMWExNDAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3JlY29uc3RydWN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLSAgICAzLiBEYXRhIHR5cGVzCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIEgyNjRTV0RFQ19SRUNPTlNUUlVDVF9ICi0jZGVmaW5lIEgyNjRTV0RFQ19SRUNPTlNUUlVDVF9ICi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiYmFzZXR5cGUuaCIKLSNpbmNsdWRlICJoMjY0YnNkX21hY3JvYmxvY2tfbGF5ZXIuaCIKLSNpbmNsdWRlICJoMjY0YnNkX2ltYWdlLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gRGF0YSB0eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmbmRlZiBIMjY0REVDX09NWERMCi12b2lkIGgyNjRic2RQcmVkaWN0U2FtcGxlcygKLSAgdTggKmRhdGEsCi0gIG12X3QgKm12LAotICBpbWFnZV90ICpyZWZQaWMsCi0gIHUzMiB4QSwKLSAgdTMyIHlBLAotICB1MzIgcGFydFgsCi0gIHUzMiBwYXJ0WSwKLSAgdTMyIHBhcnRXaWR0aCwKLSAgdTMyIHBhcnRIZWlnaHQpOwotI2Vsc2UKLXZvaWQgaDI2NGJzZFByZWRpY3RTYW1wbGVzKAotICB1OCAqZGF0YSwKLSAgbXZfdCAqbXYsCi0gIGltYWdlX3QgKnJlZlBpYywKLSAgdTMyIGNvbEFuZFJvdywvKiBwYWNrYWdlZCBkYXRhIHwgY29sdW1uICAgIHwgcm93ICAgICAgICAgICAgICAgIHwqLwotICB1MzIgcGFydCwgICAgIC8qIHBhY2thZ2VkIGRhdGEgfHBhcnRYfHBhcnRZfHBhcnRXaWR0aHxwYXJ0SGVpZ2h0fCovCi0gIHU4ICpwRmlsbCk7Ci0jZW5kaWYKLQotdm9pZCBoMjY0YnNkRmlsbEJsb2NrKAotICB1OCAqIHJlZiwKLSAgdTggKiBmaWxsLAotICBpMzIgeDAsCi0gIGkzMiB5MCwKLSAgdTMyIHdpZHRoLAotICB1MzIgaGVpZ2h0LAotICB1MzIgYmxvY2tXaWR0aCwKLSAgdTMyIGJsb2NrSGVpZ2h0LAotICB1MzIgZmlsbFNjYW5MZW5ndGgpOwotCi12b2lkIGgyNjRic2RJbnRlcnBvbGF0ZUNocm9tYUhvcigKLSAgdTggKnBSZWYsCi0gIHU4ICpwcmVkUGFydENocm9tYSwKLSAgaTMyIHgwLAotICBpMzIgeTAsCi0gIHUzMiB3aWR0aCwKLSAgdTMyIGhlaWdodCwKLSAgdTMyIHhGcmFjLAotICB1MzIgY2hyb21hUGFydFdpZHRoLAotICB1MzIgY2hyb21hUGFydEhlaWdodCk7Ci0KLXZvaWQgaDI2NGJzZEludGVycG9sYXRlQ2hyb21hVmVyKAotICB1OCAqcFJlZiwKLSAgdTggKnByZWRQYXJ0Q2hyb21hLAotICBpMzIgeDAsCi0gIGkzMiB5MCwKLSAgdTMyIHdpZHRoLAotICB1MzIgaGVpZ2h0LAotICB1MzIgeUZyYWMsCi0gIHUzMiBjaHJvbWFQYXJ0V2lkdGgsCi0gIHUzMiBjaHJvbWFQYXJ0SGVpZ2h0KTsKLQotdm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFIb3JWZXIoCi0gIHU4ICpyZWYsCi0gIHU4ICpwcmVkUGFydENocm9tYSwKLSAgaTMyIHgwLAotICBpMzIgeTAsCi0gIHUzMiB3aWR0aCwKLSAgdTMyIGhlaWdodCwKLSAgdTMyIHhGcmFjLAotICB1MzIgeUZyYWMsCi0gIHUzMiBjaHJvbWFQYXJ0V2lkdGgsCi0gIHUzMiBjaHJvbWFQYXJ0SGVpZ2h0KTsKLQotdm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVWZXJIYWxmKAotICB1OCAqcmVmLAotICB1OCAqbWIsCi0gIGkzMiB4MCwKLSAgaTMyIHkwLAotICB1MzIgd2lkdGgsCi0gIHUzMiBoZWlnaHQsCi0gIHUzMiBwYXJ0V2lkdGgsCi0gIHUzMiBwYXJ0SGVpZ2h0KTsKLQotdm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVWZXJRdWFydGVyKAotICB1OCAqcmVmLAotICB1OCAqbWIsCi0gIGkzMiB4MCwKLSAgaTMyIHkwLAotICB1MzIgd2lkdGgsCi0gIHUzMiBoZWlnaHQsCi0gIHUzMiBwYXJ0V2lkdGgsCi0gIHUzMiBwYXJ0SGVpZ2h0LAotICB1MzIgdmVyT2Zmc2V0KTsKLQotdm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVIb3JIYWxmKAotICB1OCAqcmVmLAotICB1OCAqbWIsCi0gIGkzMiB4MCwKLSAgaTMyIHkwLAotICB1MzIgd2lkdGgsCi0gIHUzMiBoZWlnaHQsCi0gIHUzMiBwYXJ0V2lkdGgsCi0gIHUzMiBwYXJ0SGVpZ2h0KTsKLQotdm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVIb3JRdWFydGVyKAotICB1OCAqcmVmLAotICB1OCAqbWIsCi0gIGkzMiB4MCwKLSAgaTMyIHkwLAotICB1MzIgd2lkdGgsCi0gIHUzMiBoZWlnaHQsCi0gIHUzMiBwYXJ0V2lkdGgsCi0gIHUzMiBwYXJ0SGVpZ2h0LAotICB1MzIgaG9yT2Zmc2V0KTsKLQotdm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVIb3JWZXJRdWFydGVyKAotICB1OCAqcmVmLAotICB1OCAqbWIsCi0gIGkzMiB4MCwKLSAgaTMyIHkwLAotICB1MzIgd2lkdGgsCi0gIHUzMiBoZWlnaHQsCi0gIHUzMiBwYXJ0V2lkdGgsCi0gIHUzMiBwYXJ0SGVpZ2h0LAotICB1MzIgaG9yVmVyT2Zmc2V0KTsKLQotdm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVNaWRIYWxmKAotICB1OCAqcmVmLAotICB1OCAqbWIsCi0gIGkzMiB4MCwKLSAgaTMyIHkwLAotICB1MzIgd2lkdGgsCi0gIHUzMiBoZWlnaHQsCi0gIHUzMiBwYXJ0V2lkdGgsCi0gIHUzMiBwYXJ0SGVpZ2h0KTsKLQotdm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVNaWRWZXJRdWFydGVyKAotICB1OCAqcmVmLAotICB1OCAqbWIsCi0gIGkzMiB4MCwKLSAgaTMyIHkwLAotICB1MzIgd2lkdGgsCi0gIHUzMiBoZWlnaHQsCi0gIHUzMiBwYXJ0V2lkdGgsCi0gIHUzMiBwYXJ0SGVpZ2h0LAotICB1MzIgdmVyT2Zmc2V0KTsKLQotdm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVNaWRIb3JRdWFydGVyKAotICB1OCAqcmVmLAotICB1OCAqbWIsCi0gIGkzMiB4MCwKLSAgaTMyIHkwLAotICB1MzIgd2lkdGgsCi0gIHUzMiBoZWlnaHQsCi0gIHUzMiBwYXJ0V2lkdGgsCi0gIHUzMiBwYXJ0SGVpZ2h0LAotICB1MzIgaG9yT2Zmc2V0KTsKLQotCi12b2lkIGgyNjRic2RGaWxsUm93NygKLSAgdTggKnJlZiwKLSAgdTggKmZpbGwsCi0gIGkzMiBsZWZ0LAotICBpMzIgY2VudGVyLAotICBpMzIgcmlnaHQpOwotCi0jZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19SRUNPTlNUUlVDVF9IICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zZWkuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zZWkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc1NmM0Ny4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2VpLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLSAgICAgMy4gTW9kdWxlIGRlZmluZXMKLSAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotICAgICA1LiBGdW5jdGlvbnMKLSAgICAgICAgICBoMjY0YnNkRGVjb2RlU2VpTWVzc2FnZQotICAgICAgICAgIERlY29kZUJ1ZmZlcmluZ1BlcmlvZAotICAgICAgICAgIERlY29kZVBpY3R1cmVUaW1pbmcKLSAgICAgICAgICBEZWNvZGVQYW5TY2FuUmVjdGFuZ2xlCi0gICAgICAgICAgRGVjb2RlRmlsbGVyUGF5bG9hZAotICAgICAgICAgIERlY29kZVVzZXJEYXRhUmVnaXN0ZXJlZElUdVRUMzUKLSAgICAgICAgICBEZWNvZGVVc2VyRGF0YVVucmVnaXN0ZXJlZAotICAgICAgICAgIERlY29kZVJlY292ZXJ5UG9pbnQKLSAgICAgICAgICBEZWNvZGVEZWNSZWZQaWNNYXJraW5nUmVwZXRpdGlvbgotICAgICAgICAgIERlY29kZVNwYXJlUGljCi0gICAgICAgICAgRGVjb2RlU2NlbmVJbmZvCi0gICAgICAgICAgRGVjb2RlU3ViU2VxSW5mbwotICAgICAgICAgIERlY29kZVN1YlNlcUxheWVyQ2hhcmFjdGVyaXN0aWNzCi0gICAgICAgICAgRGVjb2RlU3ViU2VxQ2hhcmFjdGVyaXN0aWNzCi0gICAgICAgICAgRGVjb2RlRnVsbEZyYW1lRnJlZXplCi0gICAgICAgICAgRGVjb2RlRnVsbEZyYW1lU25hcHNob3QKLSAgICAgICAgICBEZWNvZGVQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50U3RhcnQKLSAgICAgICAgICBEZWNvZGVQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50RW5kCi0gICAgICAgICAgRGVjb2RlTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0Ci0gICAgICAgICAgRGVjb2RlUmVzZXJ2ZWRTZWlNZXNzYWdlCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiaDI2NGJzZF9zZWkuaCIKLSNpbmNsdWRlICJiYXNldHlwZS5oIgotI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgotI2luY2x1ZGUgImgyNjRic2Rfc3RyZWFtLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF92bGMuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3NlcV9wYXJhbV9zZXQuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3NsaWNlX2hlYWRlci5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgY29uc3QgdTMyIG51bUNsb2NrVFNbOV0gPSB7MSwxLDEsMiwyLDMsMywyLDN9Owotc3RhdGljIGNvbnN0IHUzMiBjZWlsTG9nMk51bVNsaWNlR3JvdXBzWzldID0gezAsMSwxLDIsMiwzLDMsMywzfTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdTMyIERlY29kZUJ1ZmZlcmluZ1BlcmlvZCgKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZWlCdWZmZXJpbmdQZXJpb2RfdCAqcEJ1ZmZlcmluZ1BlcmlvZCwKLSAgdTMyIGNwYkNudCwKLSAgdTMyIGluaXRpYWxDcGJSZW1vdmFsRGVsYXlMZW5ndGgsCi0gIHUzMiBuYWxIcmRCcFByZXNlbnRGbGFnLAotICB1MzIgdmNsSHJkQnBQcmVzZW50RmxhZyk7Ci0KLXN0YXRpYyB1MzIgRGVjb2RlUGljdHVyZVRpbWluZygKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZWlQaWNUaW1pbmdfdCAqcFBpY1RpbWluZywKLSAgdTMyIGNwYlJlbW92YWxEZWxheUxlbmd0aCwKLSAgdTMyIGRwYk91dHB1dERlbGF5TGVuZ3RoLAotICB1MzIgdGltZU9mZnNldExlbmd0aCwKLSAgdTMyIGNwYkRwYkRlbGF5c1ByZXNlbnRGbGFnLAotICB1MzIgcGljU3RydWN0UHJlc2VudEZsYWcpOwotCi1zdGF0aWMgdTMyIERlY29kZVBhblNjYW5SZWN0YW5nbGUoCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VpUGFuU2NhblJlY3RfdCAqcFBhblNjYW5SZWN0YW5nbGUpOwotCi1zdGF0aWMgdTMyIERlY29kZUZpbGxlclBheWxvYWQoc3RybURhdGFfdCAqcFN0cm1EYXRhLCB1MzIgcGF5bG9hZFNpemUpOwotCi1zdGF0aWMgdTMyIERlY29kZVVzZXJEYXRhUmVnaXN0ZXJlZElUdVRUMzUoCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VpVXNlckRhdGFSZWdpc3RlcmVkSXR1VFQzNV90ICpwVXNlckRhdGFSZWdpc3RlcmVkSXR1VFQzNSwKLSAgdTMyIHBheWxvYWRTaXplKTsKLQotc3RhdGljIHUzMiBEZWNvZGVVc2VyRGF0YVVucmVnaXN0ZXJlZCgKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZWlVc2VyRGF0YVVucmVnaXN0ZXJlZF90ICpwVXNlckRhdGFVbnJlZ2lzdGVyZWQsCi0gIHUzMiBwYXlsb2FkU2l6ZSk7Ci0KLXN0YXRpYyB1MzIgRGVjb2RlUmVjb3ZlcnlQb2ludCgKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZWlSZWNvdmVyeVBvaW50X3QgKnBSZWNvdmVyeVBvaW50KTsKLQotc3RhdGljIHUzMiBEZWNvZGVEZWNSZWZQaWNNYXJraW5nUmVwZXRpdGlvbigKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZWlEZWNSZWZQaWNNYXJraW5nUmVwZXRpdGlvbl90ICpwRGVjUmVmUGljTWFya2luZ1JlcGV0aXRpb24sCi0gIHUzMiBudW1SZWZGcmFtZXMpOwotCi1zdGF0aWMgdTMyIERlY29kZVNwYXJlUGljKAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHNlaVNwYXJlUGljX3QgKnBTcGFyZVBpYywKLSAgdTMyIHBpY1NpemVJbk1hcFVuaXRzKTsKLQotc3RhdGljIHUzMiBEZWNvZGVTY2VuZUluZm8oCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VpU2NlbmVJbmZvX3QgKnBTY2VuZUluZm8pOwotCi1zdGF0aWMgdTMyIERlY29kZVN1YlNlcUluZm8oCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VpU3ViU2VxSW5mb190ICpwU3ViU2VxSW5mbyk7Ci0KLXN0YXRpYyB1MzIgRGVjb2RlU3ViU2VxTGF5ZXJDaGFyYWN0ZXJpc3RpY3MoCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VpU3ViU2VxTGF5ZXJDaGFyYWN0ZXJpc3RpY3NfdCAqcFN1YlNlcUxheWVyQ2hhcmFjdGVyaXN0aWNzKTsKLQotc3RhdGljIHUzMiBEZWNvZGVTdWJTZXFDaGFyYWN0ZXJpc3RpY3MoCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VpU3ViU2VxQ2hhcmFjdGVyaXN0aWNzX3QgKnBTdWJTZXFDaGFyYWN0ZXJpc3RpY3MpOwotCi1zdGF0aWMgdTMyIERlY29kZUZ1bGxGcmFtZUZyZWV6ZSgKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZWlGdWxsRnJhbWVGcmVlemVfdCAqcEZ1bGxGcmFtZUZyZWV6ZSk7Ci0KLXN0YXRpYyB1MzIgRGVjb2RlRnVsbEZyYW1lU25hcHNob3QoCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VpRnVsbEZyYW1lU25hcHNob3RfdCAqcEZ1bGxGcmFtZVNuYXBzaG90KTsKLQotc3RhdGljIHUzMiBEZWNvZGVQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50U3RhcnQoCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VpUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudFN0YXJ0X3QgKnBQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50U3RhcnQpOwotCi1zdGF0aWMgdTMyIERlY29kZVByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRFbmQoCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VpUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudEVuZF90ICpwUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudEVuZCk7Ci0KLXN0YXRpYyB1MzIgRGVjb2RlTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0KAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHNlaU1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldF90ICpwTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0LAotICB1MzIgbnVtU2xpY2VHcm91cHMpOwotCi1zdGF0aWMgdTMyIERlY29kZVJlc2VydmVkU2VpTWVzc2FnZSgKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZWlSZXNlcnZlZFNlaU1lc3NhZ2VfdCAqcFJlc2VydmVkU2VpTWVzc2FnZSwKLSAgdTMyIHBheWxvYWRTaXplKTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkRGVjb2RlU2VpTWVzc2FnZQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgPCsrPgotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgPCsrPgotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgIDwrKz4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2REZWNvZGVTZWlNZXNzYWdlKAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHNlcVBhcmFtU2V0X3QgKnBTZXFQYXJhbVNldCwKLSAgc2VpTWVzc2FnZV90ICpwU2VpTWVzc2FnZSwKLSAgdTMyIG51bVNsaWNlR3JvdXBzKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB0bXAsIHBheWxvYWRUeXBlLCBwYXlsb2FkU2l6ZSwgc3RhdHVzOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQocFNlaU1lc3NhZ2UpOwotCi0KLSAgICBIMjY0U3dEZWNNZW1zZXQocFNlaU1lc3NhZ2UsIDAsIHNpemVvZihzZWlNZXNzYWdlX3QpKTsKLQotICAgIGRvCi0gICAgewotICAgICAgICBwYXlsb2FkVHlwZSA9IDA7Ci0gICAgICAgIHdoaWxlKCh0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDgpKSA9PSAweEZGKQotICAgICAgICB7Ci0gICAgICAgICAgICBwYXlsb2FkVHlwZSArPSAyNTU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICBwYXlsb2FkVHlwZSArPSB0bXA7Ci0KLSAgICAgICAgcGF5bG9hZFNpemUgPSAwOwotICAgICAgICB3aGlsZSgodG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA4KSkgPT0gMHhGRikKLSAgICAgICAgewotICAgICAgICAgICAgcGF5bG9hZFNpemUgKz0gMjU1OwotICAgICAgICB9Ci0gICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgcGF5bG9hZFNpemUgKz0gdG1wOwotCi0gICAgICAgIHBTZWlNZXNzYWdlLT5wYXlsb2FkVHlwZSA9IHBheWxvYWRUeXBlOwotCi0gICAgICAgIHN3aXRjaCAocGF5bG9hZFR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICBBU1NFUlQocFNlcVBhcmFtU2V0KTsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVCdWZmZXJpbmdQZXJpb2QoCi0gICAgICAgICAgICAgICAgICBwU3RybURhdGEsCi0gICAgICAgICAgICAgICAgICAmcFNlaU1lc3NhZ2UtPmJ1ZmZlcmluZ1BlcmlvZCwKLSAgICAgICAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+dnVpUGFyYW1ldGVycy0+dmNsSHJkUGFyYW1ldGVycy5jcGJDbnQsCi0gICAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnMtPnZjbEhyZFBhcmFtZXRlcnMuCi0gICAgICAgICAgICAgICAgICBpbml0aWFsQ3BiUmVtb3ZhbERlbGF5TGVuZ3RoLAotICAgICAgICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT52dWlQYXJhbWV0ZXJzLT5uYWxIcmRQYXJhbWV0ZXJzUHJlc2VudEZsYWcsCi0gICAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnMtPnZjbEhyZFBhcmFtZXRlcnNQcmVzZW50RmxhZyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICBBU1NFUlQocFNlcVBhcmFtU2V0LT52dWlQYXJhbWV0ZXJzUHJlc2VudEZsYWcpOwotICAgICAgICAgICAgICAgIHN0YXR1cyA9IERlY29kZVBpY3R1cmVUaW1pbmcoCi0gICAgICAgICAgICAgICAgICBwU3RybURhdGEsCi0gICAgICAgICAgICAgICAgICAmcFNlaU1lc3NhZ2UtPnBpY1RpbWluZywKLSAgICAgICAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+dnVpUGFyYW1ldGVycy0+dmNsSHJkUGFyYW1ldGVycy4KLSAgICAgICAgICAgICAgICAgICAgICBjcGJSZW1vdmFsRGVsYXlMZW5ndGgsCi0gICAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnMtPnZjbEhyZFBhcmFtZXRlcnMuCi0gICAgICAgICAgICAgICAgICAgICAgZHBiT3V0cHV0RGVsYXlMZW5ndGgsCi0gICAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnMtPnZjbEhyZFBhcmFtZXRlcnMuCi0gICAgICAgICAgICAgICAgICAgIHRpbWVPZmZzZXRMZW5ndGgsCi0gICAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnMtPm5hbEhyZFBhcmFtZXRlcnNQcmVzZW50RmxhZyB8fAotICAgICAgICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT52dWlQYXJhbWV0ZXJzLT52Y2xIcmRQYXJhbWV0ZXJzUHJlc2VudEZsYWcgPwotICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0UsCi0gICAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnMtPnBpY1N0cnVjdFByZXNlbnRGbGFnKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgIHN0YXR1cyA9IERlY29kZVBhblNjYW5SZWN0YW5nbGUoCi0gICAgICAgICAgICAgICAgICBwU3RybURhdGEsCi0gICAgICAgICAgICAgICAgICAmcFNlaU1lc3NhZ2UtPnBhblNjYW5SZWN0KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgIHN0YXR1cyA9IERlY29kZUZpbGxlclBheWxvYWQocFN0cm1EYXRhLCBwYXlsb2FkU2l6ZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVVc2VyRGF0YVJlZ2lzdGVyZWRJVHVUVDM1KAotICAgICAgICAgICAgICAgICAgcFN0cm1EYXRhLAotICAgICAgICAgICAgICAgICAgJnBTZWlNZXNzYWdlLT51c2VyRGF0YVJlZ2lzdGVyZWRJdHVUVDM1LAotICAgICAgICAgICAgICAgICAgcGF5bG9hZFNpemUpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gRGVjb2RlVXNlckRhdGFVbnJlZ2lzdGVyZWQoCi0gICAgICAgICAgICAgICAgICBwU3RybURhdGEsCi0gICAgICAgICAgICAgICAgICAmcFNlaU1lc3NhZ2UtPnVzZXJEYXRhVW5yZWdpc3RlcmVkLAotICAgICAgICAgICAgICAgICAgcGF5bG9hZFNpemUpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gRGVjb2RlUmVjb3ZlcnlQb2ludCgKLSAgICAgICAgICAgICAgICAgIHBTdHJtRGF0YSwKLSAgICAgICAgICAgICAgICAgICZwU2VpTWVzc2FnZS0+cmVjb3ZlcnlQb2ludCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgNzoKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVEZWNSZWZQaWNNYXJraW5nUmVwZXRpdGlvbigKLSAgICAgICAgICAgICAgICAgIHBTdHJtRGF0YSwKLSAgICAgICAgICAgICAgICAgICZwU2VpTWVzc2FnZS0+ZGVjUmVmUGljTWFya2luZ1JlcGV0aXRpb24sCi0gICAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPm51bVJlZkZyYW1lcyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgODoKLSAgICAgICAgICAgICAgICBBU1NFUlQocFNlcVBhcmFtU2V0KTsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVTcGFyZVBpYygKLSAgICAgICAgICAgICAgICAgIHBTdHJtRGF0YSwKLSAgICAgICAgICAgICAgICAgICZwU2VpTWVzc2FnZS0+c3BhcmVQaWMsCi0gICAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPnBpY1dpZHRoSW5NYnMgKiBwU2VxUGFyYW1TZXQtPnBpY0hlaWdodEluTWJzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSA5OgotICAgICAgICAgICAgICAgIHN0YXR1cyA9IERlY29kZVNjZW5lSW5mbygKLSAgICAgICAgICAgICAgICAgIHBTdHJtRGF0YSwKLSAgICAgICAgICAgICAgICAgICZwU2VpTWVzc2FnZS0+c2NlbmVJbmZvKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAxMDoKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVTdWJTZXFJbmZvKAotICAgICAgICAgICAgICAgICAgcFN0cm1EYXRhLAotICAgICAgICAgICAgICAgICAgJnBTZWlNZXNzYWdlLT5zdWJTZXFJbmZvKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAxMToKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVTdWJTZXFMYXllckNoYXJhY3RlcmlzdGljcygKLSAgICAgICAgICAgICAgICAgIHBTdHJtRGF0YSwKLSAgICAgICAgICAgICAgICAgICZwU2VpTWVzc2FnZS0+c3ViU2VxTGF5ZXJDaGFyYWN0ZXJpc3RpY3MpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDEyOgotICAgICAgICAgICAgICAgIHN0YXR1cyA9IERlY29kZVN1YlNlcUNoYXJhY3RlcmlzdGljcygKLSAgICAgICAgICAgICAgICAgIHBTdHJtRGF0YSwKLSAgICAgICAgICAgICAgICAgICZwU2VpTWVzc2FnZS0+c3ViU2VxQ2hhcmFjdGVyaXN0aWNzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAxMzoKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVGdWxsRnJhbWVGcmVlemUoCi0gICAgICAgICAgICAgICAgICBwU3RybURhdGEsCi0gICAgICAgICAgICAgICAgICAmcFNlaU1lc3NhZ2UtPmZ1bGxGcmFtZUZyZWV6ZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMTQ6IC8qIFRoaXMgU0VJIGRvZXMgbm90IGNvbnRhaW4gZGF0YSwgd2hhdCB0byBkbyA/Pz8gKi8KLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBIQU5UUk9fT0s7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMTU6Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gRGVjb2RlRnVsbEZyYW1lU25hcHNob3QoCi0gICAgICAgICAgICAgICAgICBwU3RybURhdGEsCi0gICAgICAgICAgICAgICAgICAmcFNlaU1lc3NhZ2UtPmZ1bGxGcmFtZVNuYXBzaG90KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAxNjoKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50U3RhcnQoCi0gICAgICAgICAgICAgICAgICBwU3RybURhdGEsCi0gICAgICAgICAgICAgICAgICAmcFNlaU1lc3NhZ2UtPnByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRTdGFydCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMTc6Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gRGVjb2RlUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudEVuZCgKLSAgICAgICAgICAgICAgICAgIHBTdHJtRGF0YSwKLSAgICAgICAgICAgICAgICAgICZwU2VpTWVzc2FnZS0+cHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudEVuZCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMTg6Ci0gICAgICAgICAgICAgICAgQVNTRVJUKG51bVNsaWNlR3JvdXBzKTsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVNb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXQoCi0gICAgICAgICAgICAgICAgICBwU3RybURhdGEsCi0gICAgICAgICAgICAgICAgICAmcFNlaU1lc3NhZ2UtPm1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldCwKLSAgICAgICAgICAgICAgICAgIG51bVNsaWNlR3JvdXBzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVSZXNlcnZlZFNlaU1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICBwU3RybURhdGEsCi0gICAgICAgICAgICAgICAgICAmcFNlaU1lc3NhZ2UtPnJlc2VydmVkU2VpTWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgIHBheWxvYWRTaXplKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzdGF0dXMgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHN0YXR1cyk7Ci0KLSAgICAgICAgd2hpbGUgKCFoMjY0YnNkSXNCeXRlQWxpZ25lZChwU3RybURhdGEpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKSAhPSAxKQotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIHdoaWxlICghaDI2NGJzZElzQnl0ZUFsaWduZWQocFN0cm1EYXRhKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKSAhPSAwKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IHdoaWxlIChoMjY0YnNkTW9yZVJic3BEYXRhKHBTdHJtRGF0YSkpOwotCi0gICAgcmV0dXJuKGgyNjRic2RSYnNwVHJhaWxpbmdCaXRzKHBTdHJtRGF0YSkpOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRGVjb2RlQnVmZmVyaW5nUGVyaW9kCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICA8Kys+Ci0gICAgICAgIElucHV0czoKLSAgICAgICAgICA8Kys+Ci0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgPCsrPgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdTMyIERlY29kZUJ1ZmZlcmluZ1BlcmlvZCgKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZWlCdWZmZXJpbmdQZXJpb2RfdCAqcEJ1ZmZlcmluZ1BlcmlvZCwKLSAgdTMyIGNwYkNudCwKLSAgdTMyIGluaXRpYWxDcGJSZW1vdmFsRGVsYXlMZW5ndGgsCi0gIHUzMiBuYWxIcmRCcFByZXNlbnRGbGFnLAotICB1MzIgdmNsSHJkQnBQcmVzZW50RmxhZykKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wLCBpOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQocEJ1ZmZlcmluZ1BlcmlvZCk7Ci0gICAgQVNTRVJUKGNwYkNudCk7Ci0gICAgQVNTRVJUKGluaXRpYWxDcGJSZW1vdmFsRGVsYXlMZW5ndGgpOwotCi0KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAotICAgICAgJnBCdWZmZXJpbmdQZXJpb2QtPnNlcVBhcmFtZXRlclNldElkKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgaWYgKHBCdWZmZXJpbmdQZXJpb2QtPnNlcVBhcmFtZXRlclNldElkID4gMzEpCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIGlmIChuYWxIcmRCcFByZXNlbnRGbGFnKQotICAgIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGNwYkNudDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIGluaXRpYWxDcGJSZW1vdmFsRGVsYXlMZW5ndGgpOwotICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIGlmICh0bXAgPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICBwQnVmZmVyaW5nUGVyaW9kLT5pbml0aWFsQ3BiUmVtb3ZhbERlbGF5W2ldID0gdG1wOwotCi0gICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIGluaXRpYWxDcGJSZW1vdmFsRGVsYXlMZW5ndGgpOwotICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIHBCdWZmZXJpbmdQZXJpb2QtPmluaXRpYWxDcGJSZW1vdmFsRGVsYXlPZmZzZXRbaV0gPSB0bXA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAodmNsSHJkQnBQcmVzZW50RmxhZykKLSAgICB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjcGJDbnQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCBpbml0aWFsQ3BiUmVtb3ZhbERlbGF5TGVuZ3RoKTsKLSAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICBwQnVmZmVyaW5nUGVyaW9kLT5pbml0aWFsQ3BiUmVtb3ZhbERlbGF5W2ldID0gdG1wOwotCi0gICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIGluaXRpYWxDcGJSZW1vdmFsRGVsYXlMZW5ndGgpOwotICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIHBCdWZmZXJpbmdQZXJpb2QtPmluaXRpYWxDcGJSZW1vdmFsRGVsYXlPZmZzZXRbaV0gPSB0bXA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IERlY29kZVBpY3R1cmVUaW1pbmcKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIDwrKz4KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgIDwrKz4KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICA8Kys+Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1MzIgRGVjb2RlUGljdHVyZVRpbWluZygKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZWlQaWNUaW1pbmdfdCAqcFBpY1RpbWluZywKLSAgdTMyIGNwYlJlbW92YWxEZWxheUxlbmd0aCwKLSAgdTMyIGRwYk91dHB1dERlbGF5TGVuZ3RoLAotICB1MzIgdGltZU9mZnNldExlbmd0aCwKLSAgdTMyIGNwYkRwYkRlbGF5c1ByZXNlbnRGbGFnLAotICB1MzIgcGljU3RydWN0UHJlc2VudEZsYWcpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHRtcCwgaTsKLSAgICBpMzIgaXRtcDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKHBQaWNUaW1pbmcpOwotCi0KLSAgICBpZiAoY3BiRHBiRGVsYXlzUHJlc2VudEZsYWcpCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIGNwYlJlbW92YWxEZWxheUxlbmd0aCk7Ci0gICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgcFBpY1RpbWluZy0+Y3BiUmVtb3ZhbERlbGF5ID0gdG1wOwotCi0gICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgZHBiT3V0cHV0RGVsYXlMZW5ndGgpOwotICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIHBQaWNUaW1pbmctPmRwYk91dHB1dERlbGF5ID0gdG1wOwotICAgIH0KLQotICAgIGlmIChwaWNTdHJ1Y3RQcmVzZW50RmxhZykKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgNCk7Ci0gICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgaWYgKHRtcCA+IDgpCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIHBQaWNUaW1pbmctPnBpY1N0cnVjdCA9IHRtcDsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtQ2xvY2tUU1twUGljVGltaW5nLT5waWNTdHJ1Y3RdOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgcFBpY1RpbWluZy0+Y2xvY2tUaW1lU3RhbXBGbGFnW2ldID0gdG1wID09IDEgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICAgICAgICAgIGlmIChwUGljVGltaW5nLT5jbG9ja1RpbWVTdGFtcEZsYWdbaV0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAyKTsKLSAgICAgICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgICAgICBwUGljVGltaW5nLT5jdFR5cGVbaV0gPSB0bXA7Ci0KLSAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgICAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgIHBQaWNUaW1pbmctPm51aXRGaWVsZEJhc2VkRmxhZ1tpXSA9IHRtcCA9PSAxID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotCi0gICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA1KTsKLSAgICAgICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgICAgICBpZiAodG1wID4gNikKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgIHBQaWNUaW1pbmctPmNvdW50aW5nVHlwZVtpXSA9IHRtcDsKLQotICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgcFBpY1RpbWluZy0+ZnVsbFRpbWVTdGFtcEZsYWdbaV0gPSB0bXAgPT0gMSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgcFBpY1RpbWluZy0+ZGlzY29udGludWl0eUZsYWdbaV0gPSB0bXAgPT0gMSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgcFBpY1RpbWluZy0+Y250RHJvcHBlZEZsYWdbaV0gPSB0bXAgPT0gMSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgOCk7Ci0gICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgcFBpY1RpbWluZy0+bkZyYW1lc1tpXSA9IHRtcDsKLQotICAgICAgICAgICAgICAgIGlmIChwUGljVGltaW5nLT5mdWxsVGltZVN0YW1wRmxhZ1tpXSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgNik7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCA+IDU5KQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgICAgICBwUGljVGltaW5nLT5zZWNvbmRzVmFsdWVbaV0gPSB0bXA7Ci0KLSAgICAgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA2KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgICAgICBpZiAodG1wID4gNTkpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgICAgIHBQaWNUaW1pbmctPm1pbnV0ZXNWYWx1ZVtpXSA9IHRtcDsKLQotICAgICAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDUpOwotICAgICAgICAgICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0bXAgPiAyMykKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgICAgICAgICAgcFBpY1RpbWluZy0+aG91cnNWYWx1ZVtpXSA9IHRtcDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgICAgICBwUGljVGltaW5nLT5zZWNvbmRzRmxhZ1tpXSA9IHRtcCA9PSAxID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChwUGljVGltaW5nLT5zZWNvbmRzRmxhZ1tpXSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodG1wID4gNTkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgICAgICAgICAgcFBpY1RpbWluZy0+c2Vjb25kc1ZhbHVlW2ldID0gdG1wOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQaWNUaW1pbmctPm1pbnV0ZXNGbGFnW2ldID0gdG1wID09IDEgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwUGljVGltaW5nLT5taW51dGVzRmxhZ1tpXSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bXAgPiA1OSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaWNUaW1pbmctPm1pbnV0ZXNWYWx1ZVtpXSA9IHRtcDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBpY1RpbWluZy0+aG91cnNGbGFnW2ldID0gdG1wID09IDEgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocFBpY1RpbWluZy0+aG91cnNGbGFnW2ldKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA1KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG1wID4gMjMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaWNUaW1pbmctPmhvdXJzVmFsdWVbaV0gPSB0bXA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICh0aW1lT2Zmc2V0TGVuZ3RoKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCB0aW1lT2Zmc2V0TGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgICAgICBpdG1wID0gKGkzMil0bXA7Ci0gICAgICAgICAgICAgICAgICAgIC8qIGZvbGxvd2luZyAiY29udmVydHMiIHRpbWVPZmZzZXRMZW5ndGgtYml0IHNpZ25lZAotICAgICAgICAgICAgICAgICAgICAgKiBpbnRlZ2VyIGludG8gaTMyICovCi0gICAgICAgICAgICAgICAgICAgIC8qbGludCAtc2F2ZSAtZTcwMSAtZTcwMiAqLwotICAgICAgICAgICAgICAgICAgICBpdG1wIDw8PSAoMzIgLSB0aW1lT2Zmc2V0TGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgaXRtcCA+Pj0gKDMyIC0gdGltZU9mZnNldExlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qbGludCAtcmVzdG9yZSAqLwotICAgICAgICAgICAgICAgICAgICBwUGljVGltaW5nLT50aW1lT2Zmc2V0W2ldID0gaXRtcDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHBQaWNUaW1pbmctPnRpbWVPZmZzZXRbaV0gPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBEZWNvZGVQYW5TY2FuUmVjdGFuZ2xlCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICA8Kys+Ci0gICAgICAgIElucHV0czoKLSAgICAgICAgICA8Kys+Ci0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgPCsrPgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdTMyIERlY29kZVBhblNjYW5SZWN0YW5nbGUoCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VpUGFuU2NhblJlY3RfdCAqcFBhblNjYW5SZWN0YW5nbGUpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHRtcCwgaTsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKHBQYW5TY2FuUmVjdGFuZ2xlKTsKLQotCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICZwUGFuU2NhblJlY3RhbmdsZS0+cGFuU2NhblJlY3RJZCk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICBwUGFuU2NhblJlY3RhbmdsZS0+cGFuU2NhblJlY3RDYW5jZWxGbGFnID0gdG1wID09IDEgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgIGlmICghcFBhblNjYW5SZWN0YW5nbGUtPnBhblNjYW5SZWN0Q2FuY2VsRmxhZykKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAgICAgJnBQYW5TY2FuUmVjdGFuZ2xlLT5wYW5TY2FuQ250KTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgaWYgKHBQYW5TY2FuUmVjdGFuZ2xlLT5wYW5TY2FuQ250ID4gMikKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgcFBhblNjYW5SZWN0YW5nbGUtPnBhblNjYW5DbnQrKzsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcFBhblNjYW5SZWN0YW5nbGUtPnBhblNjYW5DbnQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChwU3RybURhdGEsCi0gICAgICAgICAgICAgICZwUGFuU2NhblJlY3RhbmdsZS0+cGFuU2NhblJlY3RMZWZ0T2Zmc2V0W2ldKTsKLSAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgIHJldHVybih0bXApOwotCi0gICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgICAgICAgJnBQYW5TY2FuUmVjdGFuZ2xlLT5wYW5TY2FuUmVjdFJpZ2h0T2Zmc2V0W2ldKTsKLSAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgIHJldHVybih0bXApOwotCi0gICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgICAgICAgJnBQYW5TY2FuUmVjdGFuZ2xlLT5wYW5TY2FuUmVjdFRvcE9mZnNldFtpXSk7Ci0gICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKLQotICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChwU3RybURhdGEsCi0gICAgICAgICAgICAgICZwUGFuU2NhblJlY3RhbmdsZS0+cGFuU2NhblJlY3RCb3R0b21PZmZzZXRbaV0pOwotICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgIH0KLSAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgICAmcFBhblNjYW5SZWN0YW5nbGUtPnBhblNjYW5SZWN0UmVwZXRpdGlvblBlcmlvZCk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgIGlmIChwUGFuU2NhblJlY3RhbmdsZS0+cGFuU2NhblJlY3RSZXBldGl0aW9uUGVyaW9kID4gMTYzODQpCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIGlmIChwUGFuU2NhblJlY3RhbmdsZS0+cGFuU2NhbkNudCA+IDEgJiYKLSAgICAgICAgICBwUGFuU2NhblJlY3RhbmdsZS0+cGFuU2NhblJlY3RSZXBldGl0aW9uUGVyaW9kID4gMSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICB9Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBEZWNvZGVGaWxsZXJQYXlsb2FkCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICA8Kys+Ci0gICAgICAgIElucHV0czoKLSAgICAgICAgICA8Kys+Ci0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgPCsrPgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdTMyIERlY29kZUZpbGxlclBheWxvYWQoc3RybURhdGFfdCAqcFN0cm1EYXRhLCB1MzIgcGF5bG9hZFNpemUpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLQotCi0gICAgaWYgKHBheWxvYWRTaXplKQotICAgICAgICBpZiAoaDI2NGJzZEZsdXNoQml0cyhwU3RybURhdGEsIDggKiBwYXlsb2FkU2l6ZSkgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRGVjb2RlVXNlckRhdGFSZWdpc3RlcmVkSVR1VFQzNQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgPCsrPgotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgPCsrPgotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgIDwrKz4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHUzMiBEZWNvZGVVc2VyRGF0YVJlZ2lzdGVyZWRJVHVUVDM1KAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHNlaVVzZXJEYXRhUmVnaXN0ZXJlZEl0dVRUMzVfdCAqcFVzZXJEYXRhUmVnaXN0ZXJlZEl0dVRUMzUsCi0gIHUzMiBwYXlsb2FkU2l6ZSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wLCBpLCBqOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQocFVzZXJEYXRhUmVnaXN0ZXJlZEl0dVRUMzUpOwotICAgIEFTU0VSVChwYXlsb2FkU2l6ZSk7Ci0KLSAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA4KTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICBwVXNlckRhdGFSZWdpc3RlcmVkSXR1VFQzNS0+aXR1VFQzNUNvdW50cnlDb2RlID0gdG1wOwotCi0gICAgaWYgKHBVc2VyRGF0YVJlZ2lzdGVyZWRJdHVUVDM1LT5pdHVUVDM1Q291bnRyeUNvZGUgIT0gMHhGRikKLSAgICAgICAgaSA9IDE7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA4KTsKLSAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICBwVXNlckRhdGFSZWdpc3RlcmVkSXR1VFQzNS0+aXR1VFQzNUNvdW50cnlDb2RlRXh0ZW5zaW9uQnl0ZSA9IHRtcDsKLSAgICAgICAgaSA9IDI7Ci0gICAgfQotCi0gICAgLyogd2hlcmUgY29ycmVzcG9uZGluZyBGUkVFKCkgPz8/ICovCi0gICAgQUxMT0NBVEUocFVzZXJEYXRhUmVnaXN0ZXJlZEl0dVRUMzUtPml0dVRUMzVQYXlsb2FkQnl0ZSxwYXlsb2FkU2l6ZS1pLHU4KTsKLSAgICBwVXNlckRhdGFSZWdpc3RlcmVkSXR1VFQzNS0+bnVtUGF5bG9hZEJ5dGVzID0gcGF5bG9hZFNpemUgLSBpOwotICAgIGlmIChwVXNlckRhdGFSZWdpc3RlcmVkSXR1VFQzNS0+aXR1VFQzNVBheWxvYWRCeXRlID09IE5VTEwpCi0gICAgICAgIHJldHVybihNRU1PUllfQUxMT0NBVElPTl9FUlJPUik7Ci0KLSAgICBqID0gMDsKLSAgICBkbwotICAgIHsKLSAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA4KTsKLSAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICBwVXNlckRhdGFSZWdpc3RlcmVkSXR1VFQzNS0+aXR1VFQzNVBheWxvYWRCeXRlW2pdID0gKHU4KXRtcDsKLSAgICAgICAgaSsrOwotICAgICAgICBqKys7Ci0gICAgfSB3aGlsZSAoaSA8IHBheWxvYWRTaXplKTsKLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRGVjb2RlVXNlckRhdGFVbnJlZ2lzdGVyZWQKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIDwrKz4KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgIDwrKz4KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICA8Kys+Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1MzIgRGVjb2RlVXNlckRhdGFVbnJlZ2lzdGVyZWQoCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VpVXNlckRhdGFVbnJlZ2lzdGVyZWRfdCAqcFVzZXJEYXRhVW5yZWdpc3RlcmVkLAotICB1MzIgcGF5bG9hZFNpemUpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGksIHRtcDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKHBVc2VyRGF0YVVucmVnaXN0ZXJlZCk7Ci0KLQotICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgewotICAgICAgICBwVXNlckRhdGFVbnJlZ2lzdGVyZWQtPnV1aWRJc29JZWMxMTU3OFtpXSA9IGgyNjRic2RTaG93Qml0czMyKHBTdHJtRGF0YSk7Ci0gICAgICAgIGlmIChoMjY0YnNkRmx1c2hCaXRzKHBTdHJtRGF0YSwzMikgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICB9Ci0KLSAgICAvKiB3aGVyZSBjb3JyZXNwb25kaW5nIEZSRUUoKSA/Pz8gKi8KLSAgICBBTExPQ0FURShwVXNlckRhdGFVbnJlZ2lzdGVyZWQtPnVzZXJEYXRhUGF5bG9hZEJ5dGUsIHBheWxvYWRTaXplIC0gMTYsIHU4KTsKLSAgICBpZiAocFVzZXJEYXRhVW5yZWdpc3RlcmVkLT51c2VyRGF0YVBheWxvYWRCeXRlID09IE5VTEwpCi0gICAgICAgIHJldHVybihNRU1PUllfQUxMT0NBVElPTl9FUlJPUik7Ci0KLSAgICBwVXNlckRhdGFVbnJlZ2lzdGVyZWQtPm51bVBheWxvYWRCeXRlcyA9IHBheWxvYWRTaXplIC0gMTY7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgcGF5bG9hZFNpemUgLSAxNjsgaSsrKQotICAgIHsKLSAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA4KTsKLSAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICBwVXNlckRhdGFVbnJlZ2lzdGVyZWQtPnVzZXJEYXRhUGF5bG9hZEJ5dGVbaV0gPSAodTgpdG1wOwotICAgIH0KLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRGVjb2RlUmVjb3ZlcnlQb2ludAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgPCsrPgotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgPCsrPgotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgIDwrKz4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHUzMiBEZWNvZGVSZWNvdmVyeVBvaW50KAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHNlaVJlY292ZXJ5UG9pbnRfdCAqcFJlY292ZXJ5UG9pbnQpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHRtcDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKHBSZWNvdmVyeVBvaW50KTsKLQotCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgJnBSZWNvdmVyeVBvaW50LT5yZWNvdmVyeUZyYW1lQ250KTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIHBSZWNvdmVyeVBvaW50LT5leGFjdE1hdGNoRmxhZyA9IHRtcCA9PSAxID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIHBSZWNvdmVyeVBvaW50LT5icm9rZW5MaW5rRmxhZyA9IHRtcCA9PSAxID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDIpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIGlmICh0bXAgPiAyKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgcFJlY292ZXJ5UG9pbnQtPmNoYW5naW5nU2xpY2VHcm91cElkYyA9IHRtcDsKLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRGVjb2RlRGVjUmVmUGljTWFya2luZ1JlcGV0aXRpb24KLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIDwrKz4KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgIDwrKz4KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICA8Kys+Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1MzIgRGVjb2RlRGVjUmVmUGljTWFya2luZ1JlcGV0aXRpb24oCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VpRGVjUmVmUGljTWFya2luZ1JlcGV0aXRpb25fdCAqcERlY1JlZlBpY01hcmtpbmdSZXBldGl0aW9uLAotICB1MzIgbnVtUmVmRnJhbWVzKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB0bXA7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVChwRGVjUmVmUGljTWFya2luZ1JlcGV0aXRpb24pOwotCi0KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIHBEZWNSZWZQaWNNYXJraW5nUmVwZXRpdGlvbi0+b3JpZ2luYWxJZHJGbGFnID0gdG1wID09IDEgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAmcERlY1JlZlBpY01hcmtpbmdSZXBldGl0aW9uLT5vcmlnaW5hbEZyYW1lTnVtKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICAvKiBmcmFtZV9tYnNfb25seV9mbGFnIGFzc3VtZWQgYWx3YXlzIHRydWUgc28gc29tZSBmaWVsZCByZWxhdGVkIHN5bnRheAotICAgICAqIGVsZW1lbnRzIGFyZSBza2lwcGVkLCBzZWUgSC4yNjQgc3RhbmRhcmQgKi8KLSAgICB0bXAgPSBoMjY0YnNkRGVjUmVmUGljTWFya2luZyhwU3RybURhdGEsCi0gICAgICAmcERlY1JlZlBpY01hcmtpbmdSZXBldGl0aW9uLT5kZWNSZWZQaWNNYXJraW5nLCBOQUxfU0VJLCBudW1SZWZGcmFtZXMpOwotCi0gICAgcmV0dXJuKHRtcCk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBEZWNvZGVTcGFyZVBpYwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgPCsrPgotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgPCsrPgotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgIDwrKz4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHUzMiBEZWNvZGVTcGFyZVBpYygKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZWlTcGFyZVBpY190ICpwU3BhcmVQaWMsCi0gIHUzMiBwaWNTaXplSW5NYXBVbml0cykKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wLCBpLCBqLCBtYXBVbml0Q250OwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQocFNwYXJlUGljKTsKLQotCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgJnBTcGFyZVBpYy0+dGFyZ2V0RnJhbWVOdW0pOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLQotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgcFNwYXJlUGljLT5zcGFyZUZpZWxkRmxhZyA9IHRtcCA9PSAxID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0gICAgLyogZG8gbm90IGFjY2VwdCBmaWVsZHMgKi8KLSAgICBpZiAocFNwYXJlUGljLT5zcGFyZUZpZWxkRmxhZykKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnBTcGFyZVBpYy0+bnVtU3BhcmVQaWNzKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgcFNwYXJlUGljLT5udW1TcGFyZVBpY3MrKzsKLSAgICBpZiAocFNwYXJlUGljLT5udW1TcGFyZVBpY3MgPiBNQVhfTlVNX1NQQVJFX1BJQ1MpCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBwU3BhcmVQaWMtPm51bVNwYXJlUGljczsgaSsrKQotICAgIHsKLSAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgICAmcFNwYXJlUGljLT5kZWx0YVNwYXJlRnJhbWVOdW1baV0pOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotCi0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAgICAgICAmcFNwYXJlUGljLT5zcGFyZUFyZWFJZGNbaV0pOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICBpZiAocFNwYXJlUGljLT5zcGFyZUFyZWFJZGNbaV0gPiAyKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgICAgIGlmIChwU3BhcmVQaWMtPnNwYXJlQXJlYUlkY1tpXSA9PSAxKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiB3aGVyZSBjb3JyZXNwb25kaW5nIEZSRUUoKSA/Pz8gKi8KLSAgICAgICAgICAgIEFMTE9DQVRFKHBTcGFyZVBpYy0+c3BhcmVVbml0RmxhZ1tpXSwgcGljU2l6ZUluTWFwVW5pdHMsIHUzMik7Ci0gICAgICAgICAgICBpZiAocFNwYXJlUGljLT5zcGFyZVVuaXRGbGFnW2ldID09IE5VTEwpCi0gICAgICAgICAgICAgICAgcmV0dXJuKE1FTU9SWV9BTExPQ0FUSU9OX0VSUk9SKTsKLSAgICAgICAgICAgIHBTcGFyZVBpYy0+emVyb1J1bkxlbmd0aFtpXSA9IE5VTEw7Ci0KLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBwaWNTaXplSW5NYXBVbml0czsgaisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgcFNwYXJlUGljLT5zcGFyZVVuaXRGbGFnW2ldW2pdID0gdG1wID09IDEgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocFNwYXJlUGljLT5zcGFyZUFyZWFJZGNbaV0gPT0gMikKLSAgICAgICAgewotICAgICAgICAgICAgLyogd2hlcmUgY29ycmVzcG9uZGluZyBGUkVFKCkgPz8/ICovCi0gICAgICAgICAgICBBTExPQ0FURShwU3BhcmVQaWMtPnplcm9SdW5MZW5ndGhbaV0sIHBpY1NpemVJbk1hcFVuaXRzLCB1MzIpOwotICAgICAgICAgICAgaWYgKHBTcGFyZVBpYy0+emVyb1J1bkxlbmd0aFtpXSA9PSBOVUxMKQotICAgICAgICAgICAgICAgIHJldHVybihNRU1PUllfQUxMT0NBVElPTl9FUlJPUik7Ci0gICAgICAgICAgICBwU3BhcmVQaWMtPnNwYXJlVW5pdEZsYWdbaV0gPSBOVUxMOwotCi0gICAgICAgICAgICBmb3IgKGogPSAwLCBtYXBVbml0Q250ID0gMDsgbWFwVW5pdENudCA8IHBpY1NpemVJbk1hcFVuaXRzOyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgICAgICAgICAgICZwU3BhcmVQaWMtPnplcm9SdW5MZW5ndGhbaV1bal0pOwotICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgICAgICAgICBtYXBVbml0Q250ICs9IHBTcGFyZVBpYy0+emVyb1J1bkxlbmd0aFtpXVtqXSArIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBzZXQgcmVzdCB0byBudWxsICovCi0gICAgZm9yIChpID0gcFNwYXJlUGljLT5udW1TcGFyZVBpY3M7IGkgPCBNQVhfTlVNX1NQQVJFX1BJQ1M7IGkrKykKLSAgICB7Ci0gICAgICAgIHBTcGFyZVBpYy0+c3BhcmVVbml0RmxhZ1tpXSA9IE5VTEw7Ci0gICAgICAgIHBTcGFyZVBpYy0+emVyb1J1bkxlbmd0aFtpXSA9IE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBEZWNvZGVTY2VuZUluZm8KLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIDwrKz4KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgIDwrKz4KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICA8Kys+Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1MzIgRGVjb2RlU2NlbmVJbmZvKAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHNlaVNjZW5lSW5mb190ICpwU2NlbmVJbmZvKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB0bXA7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVChwU2NlbmVJbmZvKTsKLQotCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICBwU2NlbmVJbmZvLT5zY2VuZUluZm9QcmVzZW50RmxhZyA9IHRtcCA9PSAxID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICBpZiAocFNjZW5lSW5mby0+c2NlbmVJbmZvUHJlc2VudEZsYWcpCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmcFNjZW5lSW5mby0+c2NlbmVJZCk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgICAmcFNjZW5lSW5mby0+c2NlbmVUcmFuc2l0aW9uVHlwZSk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgIGlmIChwU2NlbmVJbmZvLT5zY2VuZVRyYW5zaXRpb25UeXBlID4gNikKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgICAgICBpZiAocFNjZW5lSW5mby0+c2NlbmVUcmFuc2l0aW9uVHlwZSkKLSAgICAgICAgewotICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgICAgICAgJnBTY2VuZUluZm8tPnNlY29uZFNjZW5lSWQpOwotICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRGVjb2RlU3ViU2VxSW5mbwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgPCsrPgotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgPCsrPgotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgIDwrKz4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdTMyIERlY29kZVN1YlNlcUluZm8oCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VpU3ViU2VxSW5mb190ICpwU3ViU2VxSW5mbykKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQocFN1YlNlcUluZm8pOwotCi0KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAotICAgICAgICAmcFN1YlNlcUluZm8tPnN1YlNlcUxheWVyTnVtKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgaWYgKHBTdWJTZXFJbmZvLT5zdWJTZXFMYXllck51bSA+IDI1NSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnBTdWJTZXFJbmZvLT5zdWJTZXFJZCk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotICAgIGlmIChwU3ViU2VxSW5mby0+c3ViU2VxSWQgPiA2NTUzNSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICBwU3ViU2VxSW5mby0+Zmlyc3RSZWZQaWNGbGFnID0gdG1wID09IDEgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgcFN1YlNlcUluZm8tPmxlYWRpbmdOb25SZWZQaWNGbGFnID0gdG1wID09IDEgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgcFN1YlNlcUluZm8tPmxhc3RQaWNGbGFnID0gdG1wID09IDEgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgcFN1YlNlcUluZm8tPnN1YlNlcUZyYW1lTnVtRmxhZyA9IHRtcCA9PSAxID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICBpZiAocFN1YlNlcUluZm8tPnN1YlNlcUZyYW1lTnVtRmxhZykKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAgICAgICAmcFN1YlNlcUluZm8tPnN1YlNlcUZyYW1lTnVtKTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICB9Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IERlY29kZVN1YlNlcUxheWVyQ2hhcmFjdGVyaXN0aWNzCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICA8Kys+Ci0gICAgICAgIElucHV0czoKLSAgICAgICAgICA8Kys+Ci0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgPCsrPgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdTMyIERlY29kZVN1YlNlcUxheWVyQ2hhcmFjdGVyaXN0aWNzKAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHNlaVN1YlNlcUxheWVyQ2hhcmFjdGVyaXN0aWNzX3QgKnBTdWJTZXFMYXllckNoYXJhY3RlcmlzdGljcykKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wLCBpOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQocFN1YlNlcUxheWVyQ2hhcmFjdGVyaXN0aWNzKTsKLQotCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICZwU3ViU2VxTGF5ZXJDaGFyYWN0ZXJpc3RpY3MtPm51bVN1YlNlcUxheWVycyk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotICAgIHBTdWJTZXFMYXllckNoYXJhY3RlcmlzdGljcy0+bnVtU3ViU2VxTGF5ZXJzKys7Ci0gICAgaWYgKHBTdWJTZXFMYXllckNoYXJhY3RlcmlzdGljcy0+bnVtU3ViU2VxTGF5ZXJzID4gTUFYX05VTV9TVUJfU0VRX0xBWUVSUykKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgZm9yIChpID0gMDsgaSA8IHBTdWJTZXFMYXllckNoYXJhY3RlcmlzdGljcy0+bnVtU3ViU2VxTGF5ZXJzOyBpKyspCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIHBTdWJTZXFMYXllckNoYXJhY3RlcmlzdGljcy0+YWNjdXJhdGVTdGF0aXN0aWNzRmxhZ1tpXSA9Ci0gICAgICAgICAgICB0bXAgPT0gMSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotCi0gICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMTYpOwotICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIHBTdWJTZXFMYXllckNoYXJhY3RlcmlzdGljcy0+YXZlcmFnZUJpdFJhdGVbaV0gPSB0bXA7Ci0KLSAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxNik7Ci0gICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgcFN1YlNlcUxheWVyQ2hhcmFjdGVyaXN0aWNzLT5hdmVyYWdlRnJhbWVSYXRlW2ldID0gdG1wOwotICAgIH0KLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRGVjb2RlU3ViU2VxQ2hhcmFjdGVyaXN0aWNzCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICA8Kys+Ci0gICAgICAgIElucHV0czoKLSAgICAgICAgICA8Kys+Ci0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgPCsrPgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdTMyIERlY29kZVN1YlNlcUNoYXJhY3RlcmlzdGljcygKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZWlTdWJTZXFDaGFyYWN0ZXJpc3RpY3NfdCAqcFN1YlNlcUNoYXJhY3RlcmlzdGljcykKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wLCBpOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQocFN1YlNlcUNoYXJhY3RlcmlzdGljcyk7Ci0KLQotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAmcFN1YlNlcUNoYXJhY3RlcmlzdGljcy0+c3ViU2VxTGF5ZXJOdW0pOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLSAgICBpZiAocFN1YlNlcUNoYXJhY3RlcmlzdGljcy0+c3ViU2VxTGF5ZXJOdW0gPiBNQVhfTlVNX1NVQl9TRVFfTEFZRVJTLTEpCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAgICZwU3ViU2VxQ2hhcmFjdGVyaXN0aWNzLT5zdWJTZXFJZCk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotICAgIGlmIChwU3ViU2VxQ2hhcmFjdGVyaXN0aWNzLT5zdWJTZXFJZCA+IDY1NTM1KQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIHBTdWJTZXFDaGFyYWN0ZXJpc3RpY3MtPmR1cmF0aW9uRmxhZyA9IHRtcCA9PSAxID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgIGlmIChwU3ViU2VxQ2hhcmFjdGVyaXN0aWNzLT5kdXJhdGlvbkZsYWcpCi0gICAgewotICAgICAgICBwU3ViU2VxQ2hhcmFjdGVyaXN0aWNzLT5zdWJTZXFEdXJhdGlvbiA9IGgyNjRic2RTaG93Qml0czMyKHBTdHJtRGF0YSk7Ci0gICAgICAgIGlmIChoMjY0YnNkRmx1c2hCaXRzKHBTdHJtRGF0YSwzMikgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICB9Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIHBTdWJTZXFDaGFyYWN0ZXJpc3RpY3MtPmF2ZXJhZ2VSYXRlRmxhZyA9IHRtcCA9PSAxID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgIGlmIChwU3ViU2VxQ2hhcmFjdGVyaXN0aWNzLT5hdmVyYWdlUmF0ZUZsYWcpCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIHBTdWJTZXFDaGFyYWN0ZXJpc3RpY3MtPmFjY3VyYXRlU3RhdGlzdGljc0ZsYWcgPQotICAgICAgICAgICAgdG1wID09IDEgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDE2KTsKLSAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICBwU3ViU2VxQ2hhcmFjdGVyaXN0aWNzLT5hdmVyYWdlQml0UmF0ZSA9IHRtcDsKLQotICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDE2KTsKLSAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICBwU3ViU2VxQ2hhcmFjdGVyaXN0aWNzLT5hdmVyYWdlRnJhbWVSYXRlID0gdG1wOwotICAgIH0KLQotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAmcFN1YlNlcUNoYXJhY3RlcmlzdGljcy0+bnVtUmVmZXJlbmNlZFN1YnNlcXMpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLSAgICBpZiAocFN1YlNlcUNoYXJhY3RlcmlzdGljcy0+bnVtUmVmZXJlbmNlZFN1YnNlcXMgPiBNQVhfTlVNX1NVQl9TRVFfTEFZRVJTLTEpCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBwU3ViU2VxQ2hhcmFjdGVyaXN0aWNzLT5udW1SZWZlcmVuY2VkU3Vic2VxczsgaSsrKQotICAgIHsKLSAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgICAmcFN1YlNlcUNoYXJhY3RlcmlzdGljcy0+cmVmU3ViU2VxTGF5ZXJOdW1baV0pOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotCi0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAgICAgJnBTdWJTZXFDaGFyYWN0ZXJpc3RpY3MtPnJlZlN1YlNlcUlkW2ldKTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLQotICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIHBTdWJTZXFDaGFyYWN0ZXJpc3RpY3MtPnJlZlN1YlNlcURpcmVjdGlvbltpXSA9IHRtcDsKLSAgICB9Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IERlY29kZUZ1bGxGcmFtZUZyZWV6ZQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgPCsrPgotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgPCsrPgotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgIDwrKz4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHUzMiBEZWNvZGVGdWxsRnJhbWVGcmVlemUoCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VpRnVsbEZyYW1lRnJlZXplX3QgKnBGdWxsRnJhbWVGcmVlemUpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHRtcDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKHBGdWxsRnJhbWVGcmVlemUpOwotCi0KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAotICAgICAgJnBGdWxsRnJhbWVGcmVlemUtPmZ1bGxGcmFtZUZyZWV6ZVJlcGV0aXRpb25QZXJpb2QpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLSAgICBpZiAocEZ1bGxGcmFtZUZyZWV6ZS0+ZnVsbEZyYW1lRnJlZXplUmVwZXRpdGlvblBlcmlvZCA+IDE2Mzg0KQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IERlY29kZUZ1bGxGcmFtZVNuYXBzaG90Ci0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICA8Kys+Ci0gICAgICAgIElucHV0czoKLSAgICAgICAgICA8Kys+Ci0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgPCsrPgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdTMyIERlY29kZUZ1bGxGcmFtZVNuYXBzaG90KAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHNlaUZ1bGxGcmFtZVNuYXBzaG90X3QgKnBGdWxsRnJhbWVTbmFwc2hvdCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQocEZ1bGxGcmFtZVNuYXBzaG90KTsKLQotCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgJnBGdWxsRnJhbWVTbmFwc2hvdC0+c25hcFNob3RJZCk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBEZWNvZGVQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50U3RhcnQKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIDwrKz4KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgIDwrKz4KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICA8Kys+Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1MzIgRGVjb2RlUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudFN0YXJ0KAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHNlaVByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRTdGFydF90ICpwUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudFN0YXJ0KQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB0bXA7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVChwUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudFN0YXJ0KTsKLQotCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICZwUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudFN0YXJ0LT5wcm9ncmVzc2l2ZVJlZmluZW1lbnRJZCk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICZwUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudFN0YXJ0LT5udW1SZWZpbmVtZW50U3RlcHMpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLSAgICBwUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudFN0YXJ0LT5udW1SZWZpbmVtZW50U3RlcHMrKzsKLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRGVjb2RlUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudEVuZAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgPCsrPgotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgPCsrPgotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgIDwrKz4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHUzMiBEZWNvZGVQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50RW5kKAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHNlaVByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRFbmRfdCAqcFByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRFbmQpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHRtcDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKHBQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50RW5kKTsKLQotCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICZwUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudEVuZC0+cHJvZ3Jlc3NpdmVSZWZpbmVtZW50SWQpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRGVjb2RlTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0Ci0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICA8Kys+Ci0gICAgICAgIElucHV0czoKLSAgICAgICAgICA8Kys+Ci0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgPCsrPgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdTMyIERlY29kZU1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldCgKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZWlNb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXRfdCAqcE1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldCwKLSAgdTMyIG51bVNsaWNlR3JvdXBzKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB0bXAsaTsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKHBNb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXQpOwotICAgIEFTU0VSVChudW1TbGljZUdyb3VwcyA8IE1BWF9OVU1fU0xJQ0VfR1JPVVBTKTsKLQotCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICZwTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0LT5udW1TbGljZUdyb3Vwc0luU2V0KTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgcE1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldC0+bnVtU2xpY2VHcm91cHNJblNldCsrOwotICAgIGlmIChwTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0LT5udW1TbGljZUdyb3Vwc0luU2V0ID4gbnVtU2xpY2VHcm91cHMpCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBwTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0LT5udW1TbGljZUdyb3Vwc0luU2V0OyBpKyspCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsCi0gICAgICAgICAgICBjZWlsTG9nMk51bVNsaWNlR3JvdXBzW251bVNsaWNlR3JvdXBzXSk7Ci0gICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgcE1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldC0+c2xpY2VHcm91cElkW2ldID0gdG1wOwotICAgICAgICBpZiAocE1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldC0+c2xpY2VHcm91cElkW2ldID4KLSAgICAgICAgICBwTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0LT5udW1TbGljZUdyb3Vwc0luU2V0LTEpCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgfQotCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICBwTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0LT5leGFjdFNhbXBsZVZhbHVlTWF0Y2hGbGFnID0KLSAgICAgICAgdG1wID09IDEgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgcE1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldC0+cGFuU2NhblJlY3RGbGFnID0gdG1wID09IDEgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotCi0gICAgaWYgKHBNb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXQtPnBhblNjYW5SZWN0RmxhZykKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAgICAgJnBNb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXQtPnBhblNjYW5SZWN0SWQpOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotICAgIH0KLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRGVjb2RlUmVzZXJ2ZWRTZWlNZXNzYWdlCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICA8Kys+Ci0gICAgICAgIElucHV0czoKLSAgICAgICAgICA8Kys+Ci0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgPCsrPgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdTMyIERlY29kZVJlc2VydmVkU2VpTWVzc2FnZSgKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZWlSZXNlcnZlZFNlaU1lc3NhZ2VfdCAqcFJlc2VydmVkU2VpTWVzc2FnZSwKLSAgdTMyIHBheWxvYWRTaXplKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpLCB0bXA7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVChwUmVzZXJ2ZWRTZWlNZXNzYWdlKTsKLQotCi0gICAgLyogd2hlcmUgY29ycmVzcG9uZGluZyBGUkVFKCkgPz8/ICovCi0gICAgQUxMT0NBVEUocFJlc2VydmVkU2VpTWVzc2FnZS0+cmVzZXJ2ZWRTZWlNZXNzYWdlUGF5bG9hZEJ5dGUscGF5bG9hZFNpemUsdTgpOwotICAgIGlmIChwUmVzZXJ2ZWRTZWlNZXNzYWdlLT5yZXNlcnZlZFNlaU1lc3NhZ2VQYXlsb2FkQnl0ZSA9PSBOVUxMKQotICAgICAgICByZXR1cm4oTUVNT1JZX0FMTE9DQVRJT05fRVJST1IpOwotCi0gICAgcFJlc2VydmVkU2VpTWVzc2FnZS0+bnVtUGF5bG9hZEJ5dGVzID0gcGF5bG9hZFNpemU7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgcGF5bG9hZFNpemU7IGkrKykKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSw4KTsKLSAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICBwUmVzZXJ2ZWRTZWlNZXNzYWdlLT5yZXNlcnZlZFNlaU1lc3NhZ2VQYXlsb2FkQnl0ZVtpXSA9ICh1OCl0bXA7Ci0gICAgfQotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NlaS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NlaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmU1NDNhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zZWkuaAorKysgL2Rldi9udWxsCkBAIC0xLDI1MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotICAgIDMuIERhdGEgdHlwZXMKLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgSDI2NFNXREVDX1NFSV9ICi0jZGVmaW5lIEgyNjRTV0RFQ19TRUlfSAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImJhc2V0eXBlLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9zdHJlYW0uaCIKLSNpbmNsdWRlICJoMjY0YnNkX3NsaWNlX2hlYWRlci5oIgotI2luY2x1ZGUgImgyNjRic2Rfc2VxX3BhcmFtX3NldC5oIgotI2luY2x1ZGUgImgyNjRic2RfdnVpLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNkZWZpbmUgTUFYX1BBTl9TQ0FOX0NOVCAzMgotI2RlZmluZSBNQVhfTlVNX1NQQVJFX1BJQ1MgMTYKLSNkZWZpbmUgTUFYX05VTV9DTE9DS19UUyAzCi0jZGVmaW5lIE1BWF9OVU1fU1VCX1NFUV9MQVlFUlMgMjU2Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gRGF0YSB0eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICB1MzIgc2VxUGFyYW1ldGVyU2V0SWQ7Ci0gICAgdTMyIGluaXRpYWxDcGJSZW1vdmFsRGVsYXlbTUFYX0NQQl9DTlRdOwotICAgIHUzMiBpbml0aWFsQ3BiUmVtb3ZhbERlbGF5T2Zmc2V0W01BWF9DUEJfQ05UXTsKLX0gc2VpQnVmZmVyaW5nUGVyaW9kX3Q7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdTMyIGNwYlJlbW92YWxEZWxheTsKLSAgICB1MzIgZHBiT3V0cHV0RGVsYXk7Ci0gICAgdTMyIHBpY1N0cnVjdDsKLSAgICB1MzIgY2xvY2tUaW1lU3RhbXBGbGFnW01BWF9OVU1fQ0xPQ0tfVFNdOwotICAgIHUzMiBjbG9ja1RpbWVTdGFtcFtNQVhfTlVNX0NMT0NLX1RTXTsKLSAgICB1MzIgY3RUeXBlW01BWF9OVU1fQ0xPQ0tfVFNdOwotICAgIHUzMiBudWl0RmllbGRCYXNlZEZsYWdbTUFYX05VTV9DTE9DS19UU107Ci0gICAgdTMyIGNvdW50aW5nVHlwZVtNQVhfTlVNX0NMT0NLX1RTXTsKLSAgICB1MzIgZnVsbFRpbWVTdGFtcEZsYWdbTUFYX05VTV9DTE9DS19UU107Ci0gICAgdTMyIGRpc2NvbnRpbnVpdHlGbGFnW01BWF9OVU1fQ0xPQ0tfVFNdOwotICAgIHUzMiBjbnREcm9wcGVkRmxhZ1tNQVhfTlVNX0NMT0NLX1RTXTsKLSAgICB1MzIgbkZyYW1lc1tNQVhfTlVNX0NMT0NLX1RTXTsKLSAgICB1MzIgc2Vjb25kc0ZsYWdbTUFYX05VTV9DTE9DS19UU107Ci0gICAgdTMyIHNlY29uZHNWYWx1ZVtNQVhfTlVNX0NMT0NLX1RTXTsKLSAgICB1MzIgbWludXRlc0ZsYWdbTUFYX05VTV9DTE9DS19UU107Ci0gICAgdTMyIG1pbnV0ZXNWYWx1ZVtNQVhfTlVNX0NMT0NLX1RTXTsKLSAgICB1MzIgaG91cnNGbGFnW01BWF9OVU1fQ0xPQ0tfVFNdOwotICAgIHUzMiBob3Vyc1ZhbHVlW01BWF9OVU1fQ0xPQ0tfVFNdOwotICAgIGkzMiB0aW1lT2Zmc2V0W01BWF9OVU1fQ0xPQ0tfVFNdOwotfSBzZWlQaWNUaW1pbmdfdDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICB1MzIgcGFuU2NhblJlY3RJZDsKLSAgICB1MzIgcGFuU2NhblJlY3RDYW5jZWxGbGFnOwotICAgIHUzMiBwYW5TY2FuQ250OwotICAgIGkzMiBwYW5TY2FuUmVjdExlZnRPZmZzZXRbTUFYX1BBTl9TQ0FOX0NOVF07Ci0gICAgaTMyIHBhblNjYW5SZWN0UmlnaHRPZmZzZXRbTUFYX1BBTl9TQ0FOX0NOVF07Ci0gICAgaTMyIHBhblNjYW5SZWN0VG9wT2Zmc2V0W01BWF9QQU5fU0NBTl9DTlRdOwotICAgIGkzMiBwYW5TY2FuUmVjdEJvdHRvbU9mZnNldFtNQVhfUEFOX1NDQU5fQ05UXTsKLSAgICB1MzIgcGFuU2NhblJlY3RSZXBldGl0aW9uUGVyaW9kOwotfSBzZWlQYW5TY2FuUmVjdF90OwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIHUzMiBpdHVUVDM1Q291bnRyeUNvZGU7Ci0gICAgdTMyIGl0dVRUMzVDb3VudHJ5Q29kZUV4dGVuc2lvbkJ5dGU7Ci0gICAgdTggKml0dVRUMzVQYXlsb2FkQnl0ZTsKLSAgICB1MzIgbnVtUGF5bG9hZEJ5dGVzOwotfSBzZWlVc2VyRGF0YVJlZ2lzdGVyZWRJdHVUVDM1X3Q7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdTMyIHV1aWRJc29JZWMxMTU3OFs0XTsKLSAgICB1OCAqdXNlckRhdGFQYXlsb2FkQnl0ZTsKLSAgICB1MzIgbnVtUGF5bG9hZEJ5dGVzOwotfSBzZWlVc2VyRGF0YVVucmVnaXN0ZXJlZF90OwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIHUzMiByZWNvdmVyeUZyYW1lQ250OwotICAgIHUzMiBleGFjdE1hdGNoRmxhZzsKLSAgICB1MzIgYnJva2VuTGlua0ZsYWc7Ci0gICAgdTMyIGNoYW5naW5nU2xpY2VHcm91cElkYzsKLX0gc2VpUmVjb3ZlcnlQb2ludF90OwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIHUzMiBvcmlnaW5hbElkckZsYWc7Ci0gICAgdTMyIG9yaWdpbmFsRnJhbWVOdW07Ci0gICAgZGVjUmVmUGljTWFya2luZ190IGRlY1JlZlBpY01hcmtpbmc7Ci19IHNlaURlY1JlZlBpY01hcmtpbmdSZXBldGl0aW9uX3Q7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdTMyIHRhcmdldEZyYW1lTnVtOwotICAgIHUzMiBzcGFyZUZpZWxkRmxhZzsKLSAgICB1MzIgdGFyZ2V0Qm90dG9tRmllbGRGbGFnOwotICAgIHUzMiBudW1TcGFyZVBpY3M7Ci0gICAgdTMyIGRlbHRhU3BhcmVGcmFtZU51bVtNQVhfTlVNX1NQQVJFX1BJQ1NdOwotICAgIHUzMiBzcGFyZUJvdHRvbUZpZWxkRmxhZ1tNQVhfTlVNX1NQQVJFX1BJQ1NdOwotICAgIHUzMiBzcGFyZUFyZWFJZGNbTUFYX05VTV9TUEFSRV9QSUNTXTsKLSAgICB1MzIgKnNwYXJlVW5pdEZsYWdbTUFYX05VTV9TUEFSRV9QSUNTXTsKLSAgICB1MzIgKnplcm9SdW5MZW5ndGhbTUFYX05VTV9TUEFSRV9QSUNTXTsKLX0gc2VpU3BhcmVQaWNfdDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICB1MzIgc2NlbmVJbmZvUHJlc2VudEZsYWc7Ci0gICAgdTMyIHNjZW5lSWQ7Ci0gICAgdTMyIHNjZW5lVHJhbnNpdGlvblR5cGU7Ci0gICAgdTMyIHNlY29uZFNjZW5lSWQ7Ci19IHNlaVNjZW5lSW5mb190OwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIHUzMiBzdWJTZXFMYXllck51bTsKLSAgICB1MzIgc3ViU2VxSWQ7Ci0gICAgdTMyIGZpcnN0UmVmUGljRmxhZzsKLSAgICB1MzIgbGVhZGluZ05vblJlZlBpY0ZsYWc7Ci0gICAgdTMyIGxhc3RQaWNGbGFnOwotICAgIHUzMiBzdWJTZXFGcmFtZU51bUZsYWc7Ci0gICAgdTMyIHN1YlNlcUZyYW1lTnVtOwotfSBzZWlTdWJTZXFJbmZvX3Q7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdTMyIG51bVN1YlNlcUxheWVyczsKLSAgICB1MzIgYWNjdXJhdGVTdGF0aXN0aWNzRmxhZ1tNQVhfTlVNX1NVQl9TRVFfTEFZRVJTXTsKLSAgICB1MzIgYXZlcmFnZUJpdFJhdGVbTUFYX05VTV9TVUJfU0VRX0xBWUVSU107Ci0gICAgdTMyIGF2ZXJhZ2VGcmFtZVJhdGVbTUFYX05VTV9TVUJfU0VRX0xBWUVSU107Ci19IHNlaVN1YlNlcUxheWVyQ2hhcmFjdGVyaXN0aWNzX3Q7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdTMyIHN1YlNlcUxheWVyTnVtOwotICAgIHUzMiBzdWJTZXFJZDsKLSAgICB1MzIgZHVyYXRpb25GbGFnOwotICAgIHUzMiBzdWJTZXFEdXJhdGlvbjsKLSAgICB1MzIgYXZlcmFnZVJhdGVGbGFnOwotICAgIHUzMiBhY2N1cmF0ZVN0YXRpc3RpY3NGbGFnOwotICAgIHUzMiBhdmVyYWdlQml0UmF0ZTsKLSAgICB1MzIgYXZlcmFnZUZyYW1lUmF0ZTsKLSAgICB1MzIgbnVtUmVmZXJlbmNlZFN1YnNlcXM7Ci0gICAgdTMyIHJlZlN1YlNlcUxheWVyTnVtW01BWF9OVU1fU1VCX1NFUV9MQVlFUlNdOwotICAgIHUzMiByZWZTdWJTZXFJZFtNQVhfTlVNX1NVQl9TRVFfTEFZRVJTXTsKLSAgICB1MzIgcmVmU3ViU2VxRGlyZWN0aW9uW01BWF9OVU1fU1VCX1NFUV9MQVlFUlNdOwotfSBzZWlTdWJTZXFDaGFyYWN0ZXJpc3RpY3NfdDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICB1MzIgZnVsbEZyYW1lRnJlZXplUmVwZXRpdGlvblBlcmlvZDsKLX0gc2VpRnVsbEZyYW1lRnJlZXplX3Q7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdTMyIHNuYXBTaG90SWQ7Ci19IHNlaUZ1bGxGcmFtZVNuYXBzaG90X3Q7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdTMyIHByb2dyZXNzaXZlUmVmaW5lbWVudElkOwotICAgIHUzMiBudW1SZWZpbmVtZW50U3RlcHM7Ci19IHNlaVByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRTdGFydF90OwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIHUzMiBwcm9ncmVzc2l2ZVJlZmluZW1lbnRJZDsKLX0gc2VpUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudEVuZF90OwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIHUzMiBudW1TbGljZUdyb3Vwc0luU2V0OwotICAgIHUzMiBzbGljZUdyb3VwSWRbTUFYX05VTV9TTElDRV9HUk9VUFNdOwotICAgIHUzMiBleGFjdFNhbXBsZVZhbHVlTWF0Y2hGbGFnOwotICAgIHUzMiBwYW5TY2FuUmVjdEZsYWc7Ci0gICAgdTMyIHBhblNjYW5SZWN0SWQ7Ci19IHNlaU1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldF90OwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIHU4ICpyZXNlcnZlZFNlaU1lc3NhZ2VQYXlsb2FkQnl0ZTsKLSAgICB1MzIgbnVtUGF5bG9hZEJ5dGVzOwotfSBzZWlSZXNlcnZlZFNlaU1lc3NhZ2VfdDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICB1MzIgcGF5bG9hZFR5cGU7Ci0gICAgc2VpQnVmZmVyaW5nUGVyaW9kX3QgYnVmZmVyaW5nUGVyaW9kOwotICAgIHNlaVBpY1RpbWluZ190IHBpY1RpbWluZzsKLSAgICBzZWlQYW5TY2FuUmVjdF90IHBhblNjYW5SZWN0OwotICAgIHNlaVVzZXJEYXRhUmVnaXN0ZXJlZEl0dVRUMzVfdCB1c2VyRGF0YVJlZ2lzdGVyZWRJdHVUVDM1OwotICAgIHNlaVVzZXJEYXRhVW5yZWdpc3RlcmVkX3QgdXNlckRhdGFVbnJlZ2lzdGVyZWQ7Ci0gICAgc2VpUmVjb3ZlcnlQb2ludF90IHJlY292ZXJ5UG9pbnQ7Ci0gICAgc2VpRGVjUmVmUGljTWFya2luZ1JlcGV0aXRpb25fdCBkZWNSZWZQaWNNYXJraW5nUmVwZXRpdGlvbjsKLSAgICBzZWlTcGFyZVBpY190IHNwYXJlUGljOwotICAgIHNlaVNjZW5lSW5mb190IHNjZW5lSW5mbzsKLSAgICBzZWlTdWJTZXFJbmZvX3Qgc3ViU2VxSW5mbzsKLSAgICBzZWlTdWJTZXFMYXllckNoYXJhY3RlcmlzdGljc190IHN1YlNlcUxheWVyQ2hhcmFjdGVyaXN0aWNzOwotICAgIHNlaVN1YlNlcUNoYXJhY3RlcmlzdGljc190IHN1YlNlcUNoYXJhY3RlcmlzdGljczsKLSAgICBzZWlGdWxsRnJhbWVGcmVlemVfdCBmdWxsRnJhbWVGcmVlemU7Ci0gICAgc2VpRnVsbEZyYW1lU25hcHNob3RfdCBmdWxsRnJhbWVTbmFwc2hvdDsKLSAgICBzZWlQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50U3RhcnRfdCBwcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50U3RhcnQ7Ci0gICAgc2VpUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudEVuZF90IHByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRFbmQ7Ci0gICAgc2VpTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0X3QgbW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0OwotICAgIHNlaVJlc2VydmVkU2VpTWVzc2FnZV90IHJlc2VydmVkU2VpTWVzc2FnZTsKLX0gc2VpTWVzc2FnZV90OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkRGVjb2RlU2VpTWVzc2FnZSgKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZXFQYXJhbVNldF90ICpwU2VxUGFyYW1TZXQsCi0gIHNlaU1lc3NhZ2VfdCAqcFNlaU1lc3NhZ2UsCi0gIHUzMiBudW1TbGljZUdyb3Vwcyk7Ci0KLSNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX1NFSV9IICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zZXFfcGFyYW1fc2V0LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2VxX3BhcmFtX3NldC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTEwNTFhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zZXFfcGFyYW1fc2V0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotICAgICAzLiBNb2R1bGUgZGVmaW5lcwotICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0gICAgIDUuIEZ1bmN0aW9ucwotICAgICAgICAgIGgyNjRic2REZWNvZGVTZXFQYXJhbVNldAotICAgICAgICAgIEdldERwYlNpemUKLSAgICAgICAgICBoMjY0YnNkQ29tcGFyZVNlcVBhcmFtU2V0cwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImgyNjRic2Rfc2VxX3BhcmFtX3NldC5oIgotI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgotI2luY2x1ZGUgImgyNjRic2RfdmxjLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF92dWkuaCIKLSNpbmNsdWRlICJoMjY0YnNkX2NmZy5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBlbnVtZXJhdGlvbiB0byBpbmRpY2F0ZSBpbnZhbGlkIHJldHVybiB2YWx1ZSBmcm9tIHRoZSBHZXREcGJTaXplIGZ1bmN0aW9uICovCi1lbnVtIHtJTlZBTElEX0RQQl9TSVpFID0gMHg3RkZGRkZGRn07Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHUzMiBHZXREcGJTaXplKHUzMiBwaWNTaXplSW5NYnMsIHUzMiBsZXZlbElkYyk7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbiBuYW1lOiBoMjY0YnNkRGVjb2RlU2VxUGFyYW1TZXQKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRGVjb2RlIHNlcXVlbmNlIHBhcmFtZXRlciBzZXQgaW5mb3JtYXRpb24gZnJvbSB0aGUgc3RyZWFtLgotCi0gICAgICAgICAgICBGdW5jdGlvbiBhbGxvY2F0ZXMgbWVtb3J5IGZvciBvZmZzZXRGb3JSZWZGcmFtZSBhcnJheSBpZgotICAgICAgICAgICAgcGljdHVyZSBvcmRlciBjb3VudCB0eXBlIGlzIDEgYW5kIG51bVJlZkZyYW1lc0luUGljT3JkZXJDbnRDeWNsZQotICAgICAgICAgICAgaXMgZ3JlYXRlciB0aGFuIHplcm8uCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIHBTZXFQYXJhbVNldCAgICBkZWNvZGVkIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBoZXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCi0gICAgICAgICAgICBIQU5UUk9fTk9LICAgICAgZmFpbHVyZSwgaW52YWxpZCBpbmZvcm1hdGlvbiBvciBlbmQgb2Ygc3RyZWFtCi0gICAgICAgICAgICBNRU1PUllfQUxMT0NBVElPTl9FUlJPUiBmb3IgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZERlY29kZVNlcVBhcmFtU2V0KHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgc2VxUGFyYW1TZXRfdCAqcFNlcVBhcmFtU2V0KQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB0bXAsIGksIHZhbHVlOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQocFNlcVBhcmFtU2V0KTsKLQotICAgIEgyNjRTd0RlY01lbXNldChwU2VxUGFyYW1TZXQsIDAsIHNpemVvZihzZXFQYXJhbVNldF90KSk7Ci0KLSAgICAvKiBwcm9maWxlX2lkYyAqLwotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgOCk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgaWYgKHRtcCAhPSA2NikKLSAgICB7Ci0gICAgICAgIERFQlVHKCgiTk9UIEJBU0VMSU5FIFBST0ZJTEUgJWRcbiIsIHRtcCkpOwotICAgIH0KLSAgICBwU2VxUGFyYW1TZXQtPnByb2ZpbGVJZGMgPSB0bXA7Ci0KLSAgICAvKiBjb25zdHJhaW5lZF9zZXQwX2ZsYWcgKi8KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgIC8qIGNvbnN0cmFpbmVkX3NldDFfZmxhZyAqLwotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgLyogY29uc3RyYWluZWRfc2V0Ml9mbGFnICovCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLQotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgLyogcmVzZXJ2ZWRfemVyb181Yml0cywgdmFsdWVzIG9mIHRoZXNlIGJpdHMgc2hhbGwgYmUgaWdub3JlZCAqLwotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgNSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDgpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIHBTZXFQYXJhbVNldC0+bGV2ZWxJZGMgPSB0bXA7Ci0KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAotICAgICAgICAmcFNlcVBhcmFtU2V0LT5zZXFQYXJhbWV0ZXJTZXRJZCk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotICAgIGlmIChwU2VxUGFyYW1TZXQtPnNlcVBhcmFtZXRlclNldElkID49IE1BWF9OVU1fU0VRX1BBUkFNX1NFVFMpCi0gICAgewotICAgICAgICBFUFJJTlQoInNlcV9wYXJhbV9zZXRfaWQiKTsKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIH0KLQotICAgIC8qIGxvZzJfbWF4X2ZyYW1lX251bV9taW51czQgKi8KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLSAgICBpZiAodmFsdWUgPiAxMikKLSAgICB7Ci0gICAgICAgIEVQUklOVCgibG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNCIpOwotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgfQotICAgIC8qIG1heEZyYW1lTnVtID0gMl4obG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNCArIDQpICovCi0gICAgcFNlcVBhcmFtU2V0LT5tYXhGcmFtZU51bSA9IDEgPDwgKHZhbHVlKzQpOwotCi0gICAgLyogdmFsaWQgUE9DIHR5cGVzIGFyZSAwLCAxIGFuZCAyICovCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgaWYgKHZhbHVlID4gMikKLSAgICB7Ci0gICAgICAgIEVQUklOVCgicGljX29yZGVyX2NudF90eXBlIik7Ci0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICB9Ci0gICAgcFNlcVBhcmFtU2V0LT5waWNPcmRlckNudFR5cGUgPSB2YWx1ZTsKLQotICAgIGlmIChwU2VxUGFyYW1TZXQtPnBpY09yZGVyQ250VHlwZSA9PSAwKQotICAgIHsKLSAgICAgICAgLyogbG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0ICovCi0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgIGlmICh2YWx1ZSA+IDEyKQotICAgICAgICB7Ci0gICAgICAgICAgICBFUFJJTlQoImxvZzJfbWF4X3BpY19vcmRlcl9jbnRfbHNiX21pbnVzNCIpOwotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICB9Ci0gICAgICAgIC8qIG1heFBpY09yZGVyQ250THNiID0gMl4obG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0ICsgNCkgKi8KLSAgICAgICAgcFNlcVBhcmFtU2V0LT5tYXhQaWNPcmRlckNudExzYiA9IDEgPDwgKHZhbHVlKzQpOwotICAgIH0KLSAgICBlbHNlIGlmIChwU2VxUGFyYW1TZXQtPnBpY09yZGVyQ250VHlwZSA9PSAxKQotICAgIHsKLSAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICBwU2VxUGFyYW1TZXQtPmRlbHRhUGljT3JkZXJBbHdheXNaZXJvRmxhZyA9ICh0bXAgPT0gMSkgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotCi0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQocFN0cm1EYXRhLAotICAgICAgICAgICAgJnBTZXFQYXJhbVNldC0+b2Zmc2V0Rm9yTm9uUmVmUGljKTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLQotICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgICAgICZwU2VxUGFyYW1TZXQtPm9mZnNldEZvclRvcFRvQm90dG9tRmllbGQpOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotCi0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAgICAgICAmcFNlcVBhcmFtU2V0LT5udW1SZWZGcmFtZXNJblBpY09yZGVyQ250Q3ljbGUpOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICBpZiAocFNlcVBhcmFtU2V0LT5udW1SZWZGcmFtZXNJblBpY09yZGVyQ250Q3ljbGUgPiAyNTUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEVQUklOVCgibnVtX3JlZl9mcmFtZXNfaW5fcGljX29yZGVyX2NudF9jeWNsZSIpOwotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBTZXFQYXJhbVNldC0+bnVtUmVmRnJhbWVzSW5QaWNPcmRlckNudEN5Y2xlKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBOT1RFOiBUaGlzIGhhcyB0byBiZSBmcmVlZCBzb21ld2hlcmUhICovCi0gICAgICAgICAgICBBTExPQ0FURShwU2VxUGFyYW1TZXQtPm9mZnNldEZvclJlZkZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT5udW1SZWZGcmFtZXNJblBpY09yZGVyQ250Q3ljbGUsIGkzMik7Ci0gICAgICAgICAgICBpZiAocFNlcVBhcmFtU2V0LT5vZmZzZXRGb3JSZWZGcmFtZSA9PSBOVUxMKQotICAgICAgICAgICAgICAgIHJldHVybihNRU1PUllfQUxMT0NBVElPTl9FUlJPUik7Ci0KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwU2VxUGFyYW1TZXQtPm51bVJlZkZyYW1lc0luUGljT3JkZXJDbnRDeWNsZTsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRtcCA9ICBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT5vZmZzZXRGb3JSZWZGcmFtZSArIGkpOwotICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+b2Zmc2V0Rm9yUmVmRnJhbWUgPSBOVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgJnBTZXFQYXJhbVNldC0+bnVtUmVmRnJhbWVzKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgaWYgKHBTZXFQYXJhbVNldC0+bnVtUmVmRnJhbWVzID4gTUFYX05VTV9SRUZfUElDUykKLSAgICB7Ci0gICAgICAgIEVQUklOVCgibnVtX3JlZl9mcmFtZXMiKTsKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIH0KLQotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgcFNlcVBhcmFtU2V0LT5nYXBzSW5GcmFtZU51bVZhbHVlQWxsb3dlZEZsYWcgPSAodG1wID09IDEpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotICAgIHBTZXFQYXJhbVNldC0+cGljV2lkdGhJbk1icyA9IHZhbHVlICsgMTsKLQotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotICAgIHBTZXFQYXJhbVNldC0+cGljSGVpZ2h0SW5NYnMgPSB2YWx1ZSArIDE7Ci0KLSAgICAvKiBmcmFtZV9tYnNfb25seV9mbGFnLCBzaGFsbCBiZSAxIGZvciBiYXNlbGluZSBwcm9maWxlICovCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICBpZiAoIXRtcCkKLSAgICB7Ci0gICAgICAgIEVQUklOVCgiZnJhbWVfbWJzX29ubHlfZmxhZyIpOwotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgfQotCi0gICAgLyogZGlyZWN0Xzh4OF9pbmZlcmVuY2VfZmxhZyAqLwotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIHBTZXFQYXJhbVNldC0+ZnJhbWVDcm9wcGluZ0ZsYWcgPSAodG1wID09IDEpID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICBpZiAocFNlcVBhcmFtU2V0LT5mcmFtZUNyb3BwaW5nRmxhZykKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAgICAgICAmcFNlcVBhcmFtU2V0LT5mcmFtZUNyb3BMZWZ0T2Zmc2V0KTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgICAgICZwU2VxUGFyYW1TZXQtPmZyYW1lQ3JvcFJpZ2h0T2Zmc2V0KTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgICAgICZwU2VxUGFyYW1TZXQtPmZyYW1lQ3JvcFRvcE9mZnNldCk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAgICAgICAmcFNlcVBhcmFtU2V0LT5mcmFtZUNyb3BCb3R0b21PZmZzZXQpOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotCi0gICAgICAgIC8qIGNoZWNrIHRoYXQgZnJhbWUgY3JvcHBpbmcgcGFyYW1zIGFyZSB2YWxpZCwgcGFyYW1ldGVycyBzaGFsbAotICAgICAgICAgKiBzcGVjaWZ5IG5vbi1uZWdhdGl2ZSBhcmVhIHdpdGhpbiB0aGUgb3JpZ2luYWwgcGljdHVyZSAqLwotICAgICAgICBpZiAoICggKGkzMilwU2VxUGFyYW1TZXQtPmZyYW1lQ3JvcExlZnRPZmZzZXQgPgotICAgICAgICAgICAgICAgKCA4ICogKGkzMilwU2VxUGFyYW1TZXQtPnBpY1dpZHRoSW5NYnMgLQotICAgICAgICAgICAgICAgICAoKGkzMilwU2VxUGFyYW1TZXQtPmZyYW1lQ3JvcFJpZ2h0T2Zmc2V0ICsgMSkgKSApIHx8Ci0gICAgICAgICAgICAgKCAoaTMyKXBTZXFQYXJhbVNldC0+ZnJhbWVDcm9wVG9wT2Zmc2V0ID4KLSAgICAgICAgICAgICAgICggOCAqIChpMzIpcFNlcVBhcmFtU2V0LT5waWNIZWlnaHRJbk1icyAtCi0gICAgICAgICAgICAgICAgICgoaTMyKXBTZXFQYXJhbVNldC0+ZnJhbWVDcm9wQm90dG9tT2Zmc2V0ICsgMSkgKSApICkKLSAgICAgICAgewotICAgICAgICAgICAgRVBSSU5UKCJmcmFtZV9jcm9wcGluZyIpOwotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogY2hlY2sgdGhhdCBpbWFnZSBkaW1lbnNpb25zIGFuZCBsZXZlbElkYyBtYXRjaCAqLwotICAgIHRtcCA9IHBTZXFQYXJhbVNldC0+cGljV2lkdGhJbk1icyAqIHBTZXFQYXJhbVNldC0+cGljSGVpZ2h0SW5NYnM7Ci0gICAgdmFsdWUgPSBHZXREcGJTaXplKHRtcCwgcFNlcVBhcmFtU2V0LT5sZXZlbElkYyk7Ci0gICAgaWYgKHZhbHVlID09IElOVkFMSURfRFBCX1NJWkUgfHwgcFNlcVBhcmFtU2V0LT5udW1SZWZGcmFtZXMgPiB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIERFQlVHKCgiV0FSTklORyEgSW52YWxpZCBEUEIgc2l6ZSBiYXNlZCBvbiBTUFMgTGV2ZWwhXG4iKSk7Ci0gICAgICAgIERFQlVHKCgiV0FSTklORyEgVXNpbmcgbnVtX3JlZl9mcmFtZXMgPSVkIGZvciBEUEIgc2l6ZSFcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPm51bVJlZkZyYW1lcykpOwotICAgICAgICB2YWx1ZSA9IHBTZXFQYXJhbVNldC0+bnVtUmVmRnJhbWVzOwotICAgIH0KLSAgICBwU2VxUGFyYW1TZXQtPm1heERwYlNpemUgPSB2YWx1ZTsKLQotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgcFNlcVBhcmFtU2V0LT52dWlQYXJhbWV0ZXJzUHJlc2VudEZsYWcgPSAodG1wID09IDEpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICAvKiBWVUkgKi8KLSAgICBpZiAocFNlcVBhcmFtU2V0LT52dWlQYXJhbWV0ZXJzUHJlc2VudEZsYWcpCi0gICAgewotICAgICAgICBBTExPQ0FURShwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnMsIDEsIHZ1aVBhcmFtZXRlcnNfdCk7Ci0gICAgICAgIGlmIChwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnMgPT0gTlVMTCkKLSAgICAgICAgICAgIHJldHVybihNRU1PUllfQUxMT0NBVElPTl9FUlJPUik7Ci0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVWdWlQYXJhbWV0ZXJzKHBTdHJtRGF0YSwKLSAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+dnVpUGFyYW1ldGVycyk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgIC8qIGNoZWNrIG51bVJlb3JkZXJGcmFtZXMgYW5kIG1heERlY0ZyYW1lQnVmZmVyaW5nICovCi0gICAgICAgIGlmIChwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnMtPmJpdHN0cmVhbVJlc3RyaWN0aW9uRmxhZykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHBTZXFQYXJhbVNldC0+dnVpUGFyYW1ldGVycy0+bnVtUmVvcmRlckZyYW1lcyA+Ci0gICAgICAgICAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+dnVpUGFyYW1ldGVycy0+bWF4RGVjRnJhbWVCdWZmZXJpbmcgfHwKLSAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnMtPm1heERlY0ZyYW1lQnVmZmVyaW5nIDwKLSAgICAgICAgICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT5udW1SZWZGcmFtZXMgfHwKLSAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnMtPm1heERlY0ZyYW1lQnVmZmVyaW5nID4KLSAgICAgICAgICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT5tYXhEcGJTaXplKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogc3RhbmRhcmQgc2F5cyB0aGF0ICJ0aGUgc2VxdWVuY2Ugc2hhbGwgbm90IHJlcXVpcmUgYSBEUEIgd2l0aAotICAgICAgICAgICAgICogc2l6ZSBvZiBtb3JlIHRoYW4gbWF4KDEsIG1heERlY0ZyYW1lQnVmZmVyaW5nKSAqLwotICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT5tYXhEcGJTaXplID0KLSAgICAgICAgICAgICAgICBNQVgoMSwgcFNlcVBhcmFtU2V0LT52dWlQYXJhbWV0ZXJzLT5tYXhEZWNGcmFtZUJ1ZmZlcmluZyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB0bXAgPSBoMjY0YnNkUmJzcFRyYWlsaW5nQml0cyhwU3RybURhdGEpOwotCi0gICAgLyogaWdub3JlIHBvc3NpYmxlIGVycm9ycyBpbiB0cmFpbGluZyBiaXRzIG9mIHBhcmFtZXRlcnMgc2V0cyAqLwotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogR2V0RHBiU2l6ZQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBHZXQgc2l6ZSBvZiB0aGUgRFBCIGluIGZyYW1lcy4gU2l6ZSBpcyBkZXRlcm1pbmVkIGJhc2VkIG9uIHRoZQotICAgICAgICAgICAgcGljdHVyZSBzaXplIGFuZCBNYXhEUEIgZm9yIHRoZSBzcGVjaWZpZWQgbGV2ZWwuIFRoZXNlIGRldGVybWluZQotICAgICAgICAgICAgaG93IG1hbnkgcGljdHVyZXMgbWF5IGZpdCBpbnRvIHRvIHRoZSBidWZmZXIuIEhvd2V2ZXIsIHRoZSBzaXplCi0gICAgICAgICAgICBpcyBhbHNvIGxpbWl0ZWQgdG8gYSBtYXhpbXVtIG9mIDE2IGZyYW1lcyBhbmQgdGhlcmVmb3JlIGZ1bmN0aW9uCi0gICAgICAgICAgICByZXR1cm5zIHRoZSBtaW5pbXVtIG9mIHRoZSBkZXRlcm1pbmVkIHNpemUgYW5kIDE2LgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBpY1NpemVJbk1icyAgICBudW1iZXIgb2YgbWFjcm9ibG9ja3MgaW4gdGhlIHBpY3R1cmUKLSAgICAgICAgICAgIGxldmVsSWRjICAgICAgICBpbmRpY2F0ZXMgdGhlIGxldmVsCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIG5vbmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgc2l6ZSBvZiB0aGUgRFBCIGluIGZyYW1lcwotICAgICAgICAgICAgSU5WQUxJRF9EUEJfU0laRSB3aGVuIGludmFsaWQgbGV2ZWxJZGMgc3BlY2lmaWVkIG9yIHBpY1NpemVJbk1icwotICAgICAgICAgICAgaXMgaGlnaGVyIHRoYW4gc3VwcG9ydGVkIGJ5IHRoZSBsZXZlbCBpbiBxdWVzdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgR2V0RHBiU2l6ZSh1MzIgcGljU2l6ZUluTWJzLCB1MzIgbGV2ZWxJZGMpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHRtcDsKLSAgICB1MzIgbWF4UGljU2l6ZUluTWJzOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocGljU2l6ZUluTWJzKTsKLQotICAgIC8qIHVzZSB0bXAgYXMgdGhlIHNpemUgb2YgdGhlIERQQiBpbiBieXRlcywgY29tcHV0ZXMgYXMgMTAyNCAqIE1heERQQgotICAgICAqIChmcm9tIHRhYmxlIEEtMSBpbiBBbm5leCBBKSAqLwotICAgIHN3aXRjaCAobGV2ZWxJZGMpCi0gICAgewotICAgICAgICBjYXNlIDEwOgotICAgICAgICAgICAgdG1wID0gMTUyMDY0OwotICAgICAgICAgICAgbWF4UGljU2l6ZUluTWJzID0gOTk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDExOgotICAgICAgICAgICAgdG1wID0gMzQ1NjAwOwotICAgICAgICAgICAgbWF4UGljU2l6ZUluTWJzID0gMzk2OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAxMjoKLSAgICAgICAgICAgIHRtcCA9IDkxMjM4NDsKLSAgICAgICAgICAgIG1heFBpY1NpemVJbk1icyA9IDM5NjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMTM6Ci0gICAgICAgICAgICB0bXAgPSA5MTIzODQ7Ci0gICAgICAgICAgICBtYXhQaWNTaXplSW5NYnMgPSAzOTY7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDIwOgotICAgICAgICAgICAgdG1wID0gOTEyMzg0OwotICAgICAgICAgICAgbWF4UGljU2l6ZUluTWJzID0gMzk2OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAyMToKLSAgICAgICAgICAgIHRtcCA9IDE4MjQ3Njg7Ci0gICAgICAgICAgICBtYXhQaWNTaXplSW5NYnMgPSA3OTI7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDIyOgotICAgICAgICAgICAgdG1wID0gMzExMDQwMDsKLSAgICAgICAgICAgIG1heFBpY1NpemVJbk1icyA9IDE2MjA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDMwOgotICAgICAgICAgICAgdG1wID0gMzExMDQwMDsKLSAgICAgICAgICAgIG1heFBpY1NpemVJbk1icyA9IDE2MjA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDMxOgotICAgICAgICAgICAgdG1wID0gNjkxMjAwMDsKLSAgICAgICAgICAgIG1heFBpY1NpemVJbk1icyA9IDM2MDA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDMyOgotICAgICAgICAgICAgdG1wID0gNzg2NDMyMDsKLSAgICAgICAgICAgIG1heFBpY1NpemVJbk1icyA9IDUxMjA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDQwOgotICAgICAgICAgICAgdG1wID0gMTI1ODI5MTI7Ci0gICAgICAgICAgICBtYXhQaWNTaXplSW5NYnMgPSA4MTkyOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSA0MToKLSAgICAgICAgICAgIHRtcCA9IDEyNTgyOTEyOwotICAgICAgICAgICAgbWF4UGljU2l6ZUluTWJzID0gODE5MjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgNDI6Ci0gICAgICAgICAgICB0bXAgPSAzNDgxNiozODQ7Ci0gICAgICAgICAgICBtYXhQaWNTaXplSW5NYnMgPSA4NzA0OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSA1MDoKLSAgICAgICAgICAgIC8qIHN0YW5kYXJkIHNheXMgNDIzMDE0NDAgaGVyZSwgYnV0IGNvcnJpZ2VuZHVtICJjb3JyZWN0cyIgdGhpcyB0bwotICAgICAgICAgICAgICogNDIzOTM2MDAgKi8KLSAgICAgICAgICAgIHRtcCA9IDQyMzkzNjAwOwotICAgICAgICAgICAgbWF4UGljU2l6ZUluTWJzID0gMjIwODA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDUxOgotICAgICAgICAgICAgdG1wID0gNzA3Nzg4ODA7Ci0gICAgICAgICAgICBtYXhQaWNTaXplSW5NYnMgPSAzNjg2NDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4oSU5WQUxJRF9EUEJfU0laRSk7Ci0gICAgfQotCi0gICAgLyogdGhpcyBpcyBub3QgImNvcnJlY3QiIHJldHVybiB2YWx1ZSEgSG93ZXZlciwgaXQgcmVzdWx0cyBpbiBlcnJvciBpbgotICAgICAqIGRlY29kaW5nIGFuZCB0aGlzIHdhcyBlYXNpZXN0IHBsYWNlIHRvIGNoZWNrIHBpY3R1cmUgc2l6ZSAqLwotICAgIGlmIChwaWNTaXplSW5NYnMgPiBtYXhQaWNTaXplSW5NYnMpCi0gICAgICAgIHJldHVybihJTlZBTElEX0RQQl9TSVpFKTsKLQotICAgIHRtcCAvPSAocGljU2l6ZUluTWJzKjM4NCk7Ci0KLSAgICByZXR1cm4oTUlOKHRtcCwgMTYpKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb24gbmFtZTogaDI2NGJzZENvbXBhcmVTZXFQYXJhbVNldHMKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgQ29tcGFyZSB0d28gc2VxdWVuY2UgcGFyYW1ldGVyIHNldHMuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFNwczEgICBwb2ludGVyIHRvIGEgc2VxdWVuY2UgcGFyYW1ldGVyIHNldAotICAgICAgICAgICAgcFNwczIgICBwb2ludGVyIHRvIGFub3RoZXIgc2VxdWVuY2UgcGFyYW1ldGVyIHNldAotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICAwICAgICAgIHNlcXVlbmNlIHBhcmFtZXRlciBzZXRzIGFyZSBlcXVhbAotICAgICAgICAgICAgMSAgICAgICBvdGhlcndpc2UKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2RDb21wYXJlU2VxUGFyYW1TZXRzKHNlcVBhcmFtU2V0X3QgKnBTcHMxLCBzZXFQYXJhbVNldF90ICpwU3BzMikKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaTsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTcHMxKTsKLSAgICBBU1NFUlQocFNwczIpOwotCi0gICAgLyogZmlyc3QgY29tcGFyZSBwYXJhbWV0ZXJzIHdob3NlIGV4aXN0ZW5jZSBkb2VzIG5vdCBkZXBlbmQgb24gb3RoZXIKLSAgICAgKiBwYXJhbWV0ZXJzIGFuZCBvbmx5IGNvbXBhcmUgdGhlIHJlc3Qgb2YgdGhlIHBhcmFtcyBpZiB0aGVzZSBhcmUgZXF1YWwgKi8KLSAgICBpZiAocFNwczEtPnByb2ZpbGVJZGMgICAgICAgID09IHBTcHMyLT5wcm9maWxlSWRjICYmCi0gICAgICAgIHBTcHMxLT5sZXZlbElkYyAgICAgICAgICA9PSBwU3BzMi0+bGV2ZWxJZGMgJiYKLSAgICAgICAgcFNwczEtPm1heEZyYW1lTnVtICAgICAgID09IHBTcHMyLT5tYXhGcmFtZU51bSAmJgotICAgICAgICBwU3BzMS0+cGljT3JkZXJDbnRUeXBlICAgPT0gcFNwczItPnBpY09yZGVyQ250VHlwZSAmJgotICAgICAgICBwU3BzMS0+bnVtUmVmRnJhbWVzICAgICAgPT0gcFNwczItPm51bVJlZkZyYW1lcyAmJgotICAgICAgICBwU3BzMS0+Z2Fwc0luRnJhbWVOdW1WYWx1ZUFsbG93ZWRGbGFnID09Ci0gICAgICAgICAgICBwU3BzMi0+Z2Fwc0luRnJhbWVOdW1WYWx1ZUFsbG93ZWRGbGFnICYmCi0gICAgICAgIHBTcHMxLT5waWNXaWR0aEluTWJzICAgICA9PSBwU3BzMi0+cGljV2lkdGhJbk1icyAmJgotICAgICAgICBwU3BzMS0+cGljSGVpZ2h0SW5NYnMgICAgPT0gcFNwczItPnBpY0hlaWdodEluTWJzICYmCi0gICAgICAgIHBTcHMxLT5mcmFtZUNyb3BwaW5nRmxhZyA9PSBwU3BzMi0+ZnJhbWVDcm9wcGluZ0ZsYWcgJiYKLSAgICAgICAgcFNwczEtPnZ1aVBhcmFtZXRlcnNQcmVzZW50RmxhZyA9PSBwU3BzMi0+dnVpUGFyYW1ldGVyc1ByZXNlbnRGbGFnKQotICAgIHsKLSAgICAgICAgaWYgKHBTcHMxLT5waWNPcmRlckNudFR5cGUgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHBTcHMxLT5tYXhQaWNPcmRlckNudExzYiAhPSBwU3BzMi0+bWF4UGljT3JkZXJDbnRMc2IpCi0gICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocFNwczEtPnBpY09yZGVyQ250VHlwZSA9PSAxKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocFNwczEtPmRlbHRhUGljT3JkZXJBbHdheXNaZXJvRmxhZyAhPQotICAgICAgICAgICAgICAgICAgICBwU3BzMi0+ZGVsdGFQaWNPcmRlckFsd2F5c1plcm9GbGFnIHx8Ci0gICAgICAgICAgICAgICAgcFNwczEtPm9mZnNldEZvck5vblJlZlBpYyAhPSBwU3BzMi0+b2Zmc2V0Rm9yTm9uUmVmUGljIHx8Ci0gICAgICAgICAgICAgICAgcFNwczEtPm9mZnNldEZvclRvcFRvQm90dG9tRmllbGQgIT0KLSAgICAgICAgICAgICAgICAgICAgcFNwczItPm9mZnNldEZvclRvcFRvQm90dG9tRmllbGQgfHwKLSAgICAgICAgICAgICAgICBwU3BzMS0+bnVtUmVmRnJhbWVzSW5QaWNPcmRlckNudEN5Y2xlICE9Ci0gICAgICAgICAgICAgICAgICAgIHBTcHMyLT5udW1SZWZGcmFtZXNJblBpY09yZGVyQ250Q3ljbGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBTcHMxLT5udW1SZWZGcmFtZXNJblBpY09yZGVyQ250Q3ljbGU7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBTcHMxLT5vZmZzZXRGb3JSZWZGcmFtZVtpXSAhPQotICAgICAgICAgICAgICAgICAgICAgICAgcFNwczItPm9mZnNldEZvclJlZkZyYW1lW2ldKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChwU3BzMS0+ZnJhbWVDcm9wcGluZ0ZsYWcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwU3BzMS0+ZnJhbWVDcm9wTGVmdE9mZnNldCAgICE9IHBTcHMyLT5mcmFtZUNyb3BMZWZ0T2Zmc2V0IHx8Ci0gICAgICAgICAgICAgICAgcFNwczEtPmZyYW1lQ3JvcFJpZ2h0T2Zmc2V0ICAhPSBwU3BzMi0+ZnJhbWVDcm9wUmlnaHRPZmZzZXQgfHwKLSAgICAgICAgICAgICAgICBwU3BzMS0+ZnJhbWVDcm9wVG9wT2Zmc2V0ICAgICE9IHBTcHMyLT5mcmFtZUNyb3BUb3BPZmZzZXQgfHwKLSAgICAgICAgICAgICAgICBwU3BzMS0+ZnJhbWVDcm9wQm90dG9tT2Zmc2V0ICE9IHBTcHMyLT5mcmFtZUNyb3BCb3R0b21PZmZzZXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gMTsKLX0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NlcV9wYXJhbV9zZXQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zZXFfcGFyYW1fc2V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxOGRmOTQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NlcV9wYXJhbV9zZXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0gICAgMy4gRGF0YSB0eXBlcwotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBIMjY0U1dERUNfU0VRX1BBUkFNX1NFVF9ICi0jZGVmaW5lIEgyNjRTV0RFQ19TRVFfUEFSQU1fU0VUX0gKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJiYXNldHlwZS5oIgotI2luY2x1ZGUgImgyNjRic2Rfc3RyZWFtLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF92dWkuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBEYXRhIHR5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBzdHJ1Y3R1cmUgdG8gc3RvcmUgc2VxdWVuY2UgcGFyYW1ldGVyIHNldCBpbmZvcm1hdGlvbiBkZWNvZGVkIGZyb20gdGhlCi0gKiBzdHJlYW0gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdTMyIHByb2ZpbGVJZGM7Ci0gICAgdTMyIGxldmVsSWRjOwotICAgIHUzMiBzZXFQYXJhbWV0ZXJTZXRJZDsKLSAgICB1MzIgbWF4RnJhbWVOdW07Ci0gICAgdTMyIHBpY09yZGVyQ250VHlwZTsKLSAgICB1MzIgbWF4UGljT3JkZXJDbnRMc2I7Ci0gICAgdTMyIGRlbHRhUGljT3JkZXJBbHdheXNaZXJvRmxhZzsKLSAgICBpMzIgb2Zmc2V0Rm9yTm9uUmVmUGljOwotICAgIGkzMiBvZmZzZXRGb3JUb3BUb0JvdHRvbUZpZWxkOwotICAgIHUzMiBudW1SZWZGcmFtZXNJblBpY09yZGVyQ250Q3ljbGU7Ci0gICAgaTMyICpvZmZzZXRGb3JSZWZGcmFtZTsKLSAgICB1MzIgbnVtUmVmRnJhbWVzOwotICAgIHUzMiBnYXBzSW5GcmFtZU51bVZhbHVlQWxsb3dlZEZsYWc7Ci0gICAgdTMyIHBpY1dpZHRoSW5NYnM7Ci0gICAgdTMyIHBpY0hlaWdodEluTWJzOwotICAgIHUzMiBmcmFtZUNyb3BwaW5nRmxhZzsKLSAgICB1MzIgZnJhbWVDcm9wTGVmdE9mZnNldDsKLSAgICB1MzIgZnJhbWVDcm9wUmlnaHRPZmZzZXQ7Ci0gICAgdTMyIGZyYW1lQ3JvcFRvcE9mZnNldDsKLSAgICB1MzIgZnJhbWVDcm9wQm90dG9tT2Zmc2V0OwotICAgIHUzMiB2dWlQYXJhbWV0ZXJzUHJlc2VudEZsYWc7Ci0gICAgdnVpUGFyYW1ldGVyc190ICp2dWlQYXJhbWV0ZXJzOwotICAgIHUzMiBtYXhEcGJTaXplOwotfSBzZXFQYXJhbVNldF90OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkRGVjb2RlU2VxUGFyYW1TZXQoc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICAgIHNlcVBhcmFtU2V0X3QgKnBTZXFQYXJhbVNldCk7Ci0KLXUzMiBoMjY0YnNkQ29tcGFyZVNlcVBhcmFtU2V0cyhzZXFQYXJhbVNldF90ICpwU3BzMSwgc2VxUGFyYW1TZXRfdCAqcFNwczIpOwotCi0jZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19TRVFfUEFSQU1fU0VUX0ggKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2RhdGEuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9kYXRhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyODhkNGIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2RhdGEuYworKysgL2Rldi9udWxsCkBAIC0xLDM1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0gICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0gICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLSAgICAgNS4gRnVuY3Rpb25zCi0gICAgICAgICAgaDI2NGJzZERlY29kZVNsaWNlRGF0YQotICAgICAgICAgIFNldE1iUGFyYW1zCi0gICAgICAgICAgaDI2NGJzZE1hcmtTbGljZUNvcnJ1cHRlZAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImgyNjRic2Rfc2xpY2VfZGF0YS5oIgotI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgotI2luY2x1ZGUgImgyNjRic2RfdmxjLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHZvaWQgU2V0TWJQYXJhbXMobWJTdG9yYWdlX3QgKnBNYiwgc2xpY2VIZWFkZXJfdCAqcFNsaWNlLCB1MzIgc2xpY2VJZCwKLSAgICBpMzIgY2hyb21hUXBJbmRleE9mZnNldCk7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIDUuMSAgRnVuY3Rpb24gbmFtZTogaDI2NGJzZERlY29kZVNsaWNlRGF0YQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBEZWNvZGUgb25lIHNsaWNlLiBGdW5jdGlvbiBkZWNvZGVzIHN0cmVhbSBkYXRhLCBpLmUuIG1hY3JvYmxvY2tzCi0gICAgICAgICAgICBhbmQgcG9zc2libGUgc2tpcF9ydW4gZmllbGRzLiBoMjY0YnNkRGVjb2RlTWFjcm9ibG9jayBmdW5jdGlvbiBpcwotICAgICAgICAgICAgY2FsbGVkIHRvIGhhbmRsZSBhbGwgb3RoZXIgbWFjcm9ibG9jayByZWxhdGVkIHByb2Nlc3NpbmcuCi0gICAgICAgICAgICBNYWNyb2Jsb2NrIHRvIHNsaWNlIGdyb3VwIG1hcHBpbmcgaXMgY29uc2lkZXJlZCB3aGVuIG5leHQKLSAgICAgICAgICAgIG1hY3JvYmxvY2sgdG8gcHJvY2VzcyBpcyBkZXRlcm1pbmVkIChoMjY0YnNkTmV4dE1iQWRkcmVzcyBmdW5jdGlvbikKLSAgICAgICAgICAgIG1hcAotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQotICAgICAgICAgICAgcFN0b3JhZ2UgICAgICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBzdHJ1Y3R1cmUKLSAgICAgICAgICAgIGN1cnJJbWFnZSAgICAgICBwb2ludGVyIHRvIGN1cnJlbnQgcHJvY2Vzc2VkIHBpY3R1cmUsIG5lZWRlZCBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRyYSBwcmVkaWN0aW9uIG9mIHRoZSBtYWNyb2Jsb2NrcwotICAgICAgICAgICAgcFNsaWNlSGVhZGVyICAgIHBvaW50ZXIgdG8gc2xpY2UgaGVhZGVyIG9mIHRoZSBjdXJyZW50IHNsaWNlCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIGN1cnJJbWFnZSAgICAgICBwcm9jZXNzZWQgbWFjcm9ibG9ja3MgYXJlIHdyaXR0ZW4gdG8gY3VycmVudCBpbWFnZQotICAgICAgICAgICAgcFN0b3JhZ2UgICAgICAgIG1iU3RvcmFnZSBzdHJ1Y3R1cmUgb2YgZWFjaCBwcm9jZXNzZWQgbWFjcm9ibG9jawotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHVwZGF0ZWQgaGVyZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcwotICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIGludmFsaWQgc3RyZWFtIGRhdGEKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2REZWNvZGVTbGljZURhdGEoc3RybURhdGFfdCAqcFN0cm1EYXRhLCBzdG9yYWdlX3QgKnBTdG9yYWdlLAotICAgIGltYWdlX3QgKmN1cnJJbWFnZSwgc2xpY2VIZWFkZXJfdCAqcFNsaWNlSGVhZGVyKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHU4IG1iRGF0YVszODQgKyAxNSArIDMyXTsKLSAgICB1OCAqZGF0YTsKLSAgICB1MzIgdG1wOwotICAgIHUzMiBza2lwUnVuOwotICAgIHUzMiBwcmV2U2tpcHBlZDsKLSAgICB1MzIgY3Vyck1iQWRkcjsKLSAgICB1MzIgbW9yZU1iczsKLSAgICB1MzIgbWJDb3VudDsKLSAgICBpMzIgcXBZOwotICAgIG1hY3JvYmxvY2tMYXllcl90ICptYkxheWVyOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQocFNsaWNlSGVhZGVyKTsKLSAgICBBU1NFUlQocFN0b3JhZ2UpOwotICAgIEFTU0VSVChwU2xpY2VIZWFkZXItPmZpcnN0TWJJblNsaWNlIDwgcFN0b3JhZ2UtPnBpY1NpemVJbk1icyk7Ci0KLSAgICAvKiBlbnN1cmUgMTYtYnl0ZSBhbGlnbm1lbnQgKi8KLSAgICBkYXRhID0gKHU4KilBTElHTihtYkRhdGEsIDE2KTsKLQotICAgIG1iTGF5ZXIgPSBwU3RvcmFnZS0+bWJMYXllcjsKLQotICAgIGN1cnJNYkFkZHIgPSBwU2xpY2VIZWFkZXItPmZpcnN0TWJJblNsaWNlOwotICAgIHNraXBSdW4gPSAwOwotICAgIHByZXZTa2lwcGVkID0gSEFOVFJPX0ZBTFNFOwotCi0gICAgLyogaW5jcmVtZW50IHNsaWNlIGluZGV4LCB3aWxsIGJlIG9uZSBmb3IgZGVjb2Rpbmcgb2YgdGhlIGZpcnN0IHNsaWNlIG9mCi0gICAgICogdGhlIHBpY3R1cmUgKi8KLSAgICBwU3RvcmFnZS0+c2xpY2UtPnNsaWNlSWQrKzsKLQotICAgIC8qIGxhc3RNYkFkZHIgc3RvcmVzIGFkZHJlc3Mgb2YgdGhlIG1hY3JvYmxvY2sgdGhhdCB3YXMgbGFzdCBzdWNjZXNzZnVsbHkKLSAgICAgKiBkZWNvZGVkLCBuZWVkZWQgZm9yIGVycm9yIGhhbmRsaW5nICovCi0gICAgcFN0b3JhZ2UtPnNsaWNlLT5sYXN0TWJBZGRyID0gMDsKLQotICAgIG1iQ291bnQgPSAwOwotICAgIC8qIGluaXRpYWwgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBmb3IgdGhlIHNsaWNlIGlzIG9idGFpbmVkIGFzIHRoZSBzdW0gb2YKLSAgICAgKiBpbml0aWFsIFFQIGZvciB0aGUgcGljdHVyZSBhbmQgc2xpY2VRcERlbHRhIGZvciB0aGUgY3VycmVudCBzbGljZSAqLwotICAgIHFwWSA9IChpMzIpcFN0b3JhZ2UtPmFjdGl2ZVBwcy0+cGljSW5pdFFwICsgcFNsaWNlSGVhZGVyLT5zbGljZVFwRGVsdGE7Ci0gICAgZG8KLSAgICB7Ci0gICAgICAgIC8qIHByaW1hcnkgcGljdHVyZSBhbmQgYWxyZWFkeSBkZWNvZGVkIG1hY3JvYmxvY2sgLT4gZXJyb3IgKi8KLSAgICAgICAgaWYgKCFwU2xpY2VIZWFkZXItPnJlZHVuZGFudFBpY0NudCAmJiBwU3RvcmFnZS0+bWJbY3Vyck1iQWRkcl0uZGVjb2RlZCkKLSAgICAgICAgewotICAgICAgICAgICAgRVBSSU5UKCJQcmltYXJ5IGFuZCBhbHJlYWR5IGRlY29kZWQiKTsKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgfQotCi0gICAgICAgIFNldE1iUGFyYW1zKHBTdG9yYWdlLT5tYiArIGN1cnJNYkFkZHIsIHBTbGljZUhlYWRlciwKLSAgICAgICAgICAgIHBTdG9yYWdlLT5zbGljZS0+c2xpY2VJZCwgcFN0b3JhZ2UtPmFjdGl2ZVBwcy0+Y2hyb21hUXBJbmRleE9mZnNldCk7Ci0KLSAgICAgICAgaWYgKCFJU19JX1NMSUNFKHBTbGljZUhlYWRlci0+c2xpY2VUeXBlKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFwcmV2U2tpcHBlZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmc2tpcFJ1bik7Ci0gICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICAgICAgICAgIC8qIHNraXBfcnVuIHNoYWxsIGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBudW1iZXIgb2YKLSAgICAgICAgICAgICAgICAgKiBtYWNyb2Jsb2NrcyBsZWZ0ICovCi0gICAgICAgICAgICAgICAgaWYgKHNraXBSdW4gPiAocFN0b3JhZ2UtPnBpY1NpemVJbk1icyAtIGN1cnJNYkFkZHIpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRVBSSU5UKCJza2lwX3J1biIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChza2lwUnVuKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcHJldlNraXBwZWQgPSBIQU5UUk9fVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgSDI2NFN3RGVjTWVtc2V0KCZtYkxheWVyLT5tYlByZWQsIDAsIHNpemVvZihtYlByZWRfdCkpOwotICAgICAgICAgICAgICAgICAgICAvKiBtYXJrIGN1cnJlbnQgbWFjcm9ibG9jayBza2lwcGVkICovCi0gICAgICAgICAgICAgICAgICAgIG1iTGF5ZXItPm1iVHlwZSA9IFBfU2tpcDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2tpcFJ1bikKLSAgICAgICAgewotICAgICAgICAgICAgREVCVUcoKCJTa2lwcGluZyBtYWNyb2Jsb2NrICVkXG4iLCBjdXJyTWJBZGRyKSk7Ci0gICAgICAgICAgICBza2lwUnVuLS07Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwcmV2U2tpcHBlZCA9IEhBTlRST19GQUxTRTsKLSAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVNYWNyb2Jsb2NrTGF5ZXIocFN0cm1EYXRhLCBtYkxheWVyLAotICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5tYiArIGN1cnJNYkFkZHIsIHBTbGljZUhlYWRlci0+c2xpY2VUeXBlLAotICAgICAgICAgICAgICAgIHBTbGljZUhlYWRlci0+bnVtUmVmSWR4TDBBY3RpdmUpOwotICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRVBSSU5UKCJtYWNyb2Jsb2NrX2xheWVyIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlTWFjcm9ibG9jayhwU3RvcmFnZS0+bWIgKyBjdXJyTWJBZGRyLCBtYkxheWVyLAotICAgICAgICAgICAgY3VyckltYWdlLCBwU3RvcmFnZS0+ZHBiLCAmcXBZLCBjdXJyTWJBZGRyLAotICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVBwcy0+Y29uc3RyYWluZWRJbnRyYVByZWRGbGFnLCBkYXRhKTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHsKLSAgICAgICAgICAgIEVQUklOVCgiTUFDUk9fQkxPQ0siKTsKLSAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogaW5jcmVtZW50IG1hY3JvYmxvY2sgY291bnQgb25seSBmb3IgbWFjcm9ibG9ja3MgdGhhdCB3ZXJlIGRlY29kZWQKLSAgICAgICAgICogZm9yIHRoZSBmaXJzdCB0aW1lIChyZWR1bmRhbnQgc2xpY2VzKSAqLwotICAgICAgICBpZiAocFN0b3JhZ2UtPm1iW2N1cnJNYkFkZHJdLmRlY29kZWQgPT0gMSkKLSAgICAgICAgICAgIG1iQ291bnQrKzsKLQotICAgICAgICAvKiBrZWVwIG9uIHByb2Nlc3NpbmcgYXMgbG9uZyBhcyB0aGVyZSBpcyBzdHJlYW0gZGF0YSBsZWZ0IG9yCi0gICAgICAgICAqIHByb2Nlc3Npbmcgb2YgbWFjcm9ibG9ja3MgdG8gYmUgc2tpcHBlZCBiYXNlZCBvbiB0aGUgbGFzdCBza2lwUnVuIGlzCi0gICAgICAgICAqIG5vdCBmaW5pc2hlZCAqLwotICAgICAgICBtb3JlTWJzID0gKGgyNjRic2RNb3JlUmJzcERhdGEocFN0cm1EYXRhKSB8fCBza2lwUnVuKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICAgICAgLyogbGFzdE1iQWRkciBpcyBvbmx5IHVwZGF0ZWQgZm9yIGludHJhIHNsaWNlcyAoYWxsIG1hY3JvYmxvY2tzIG9mCi0gICAgICAgICAqIGludGVyIHNsaWNlcyB3aWxsIGJlIGxvc3QgaW4gY2FzZSBvZiBhbiBlcnJvcikgKi8KLSAgICAgICAgaWYgKElTX0lfU0xJQ0UocFNsaWNlSGVhZGVyLT5zbGljZVR5cGUpKQotICAgICAgICAgICAgcFN0b3JhZ2UtPnNsaWNlLT5sYXN0TWJBZGRyID0gY3Vyck1iQWRkcjsKLQotICAgICAgICBjdXJyTWJBZGRyID0gaDI2NGJzZE5leHRNYkFkZHJlc3MocFN0b3JhZ2UtPnNsaWNlR3JvdXBNYXAsCi0gICAgICAgICAgICBwU3RvcmFnZS0+cGljU2l6ZUluTWJzLCBjdXJyTWJBZGRyKTsKLSAgICAgICAgLyogZGF0YSBsZWZ0IGluIHRoZSBidWZmZXIgYnV0IG5vIG1vcmUgbWFjcm9ibG9ja3MgZm9yIGN1cnJlbnQgc2xpY2UKLSAgICAgICAgICogZ3JvdXAgLT4gZXJyb3IgKi8KLSAgICAgICAgaWYgKG1vcmVNYnMgJiYgIWN1cnJNYkFkZHIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEVQUklOVCgiTmV4dCBtYiBhZGRyZXNzIik7Ci0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIH0KLQotICAgIH0gd2hpbGUgKG1vcmVNYnMpOwotCi0gICAgaWYgKChwU3RvcmFnZS0+c2xpY2UtPm51bURlY29kZWRNYnMgKyBtYkNvdW50KSA+IHBTdG9yYWdlLT5waWNTaXplSW5NYnMpCi0gICAgewotICAgICAgICBFUFJJTlQoIk51bSBkZWNvZGVkIG1icyIpOwotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgfQotCi0gICAgcFN0b3JhZ2UtPnNsaWNlLT5udW1EZWNvZGVkTWJzICs9IG1iQ291bnQ7Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICA1LjIgIEZ1bmN0aW9uOiBTZXRNYlBhcmFtcwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBTZXQgbWFjcm9ibG9jayBwYXJhbWV0ZXJzIHRoYXQgcmVtYWluIGNvbnN0YW50IGZvciB0aGlzIHNsaWNlCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFNsaWNlICAgICAgcG9pbnRlciB0byBjdXJyZW50IHNsaWNlIGhlYWRlcgotICAgICAgICAgICAgc2xpY2VJZCAgICAgaWQgb2YgdGhlIGN1cnJlbnQgc2xpY2UKLSAgICAgICAgICAgIGNocm9tYVFwSW5kZXhPZmZzZXQKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgcE1iICAgICAgICAgcG9pbnRlciB0byBtYWNyb2Jsb2NrIHN0cnVjdHVyZSB3aGljaCBpcyB1cGRhdGVkCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIG5vbmUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBTZXRNYlBhcmFtcyhtYlN0b3JhZ2VfdCAqcE1iLCBzbGljZUhlYWRlcl90ICpwU2xpY2UsIHUzMiBzbGljZUlkLAotICAgIGkzMiBjaHJvbWFRcEluZGV4T2Zmc2V0KQotewotCi0vKiBWYXJpYWJsZXMgKi8KLSAgICB1MzIgdG1wMTsKLSAgICBpMzIgdG1wMiwgdG1wMzsKLQotLyogQ29kZSAqLwotCi0gICAgdG1wMSA9IHBTbGljZS0+ZGlzYWJsZURlYmxvY2tpbmdGaWx0ZXJJZGM7Ci0gICAgdG1wMiA9IHBTbGljZS0+c2xpY2VBbHBoYUMwT2Zmc2V0OwotICAgIHRtcDMgPSBwU2xpY2UtPnNsaWNlQmV0YU9mZnNldDsKLSAgICBwTWItPnNsaWNlSWQgPSBzbGljZUlkOwotICAgIHBNYi0+ZGlzYWJsZURlYmxvY2tpbmdGaWx0ZXJJZGMgPSB0bXAxOwotICAgIHBNYi0+ZmlsdGVyT2Zmc2V0QSA9IHRtcDI7Ci0gICAgcE1iLT5maWx0ZXJPZmZzZXRCID0gdG1wMzsKLSAgICBwTWItPmNocm9tYVFwSW5kZXhPZmZzZXQgPSBjaHJvbWFRcEluZGV4T2Zmc2V0OwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIDUuMyAgRnVuY3Rpb24gbmFtZTogaDI2NGJzZE1hcmtTbGljZUNvcnJ1cHRlZAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBNYXJrIG1hY3JvYmxvY2tzIG9mIHRoZSBzbGljZSBjb3JydXB0ZWQuIElmIGxhc3RNYkFkZHIgaW4gdGhlIHNsaWNlCi0gICAgICAgICAgICBzdG9yYWdlIGlzIHNldCAtPiBwaWNXaWRodEluTWJzIChvciBhdCBsZWFzdCAxMCkgbWFjcm9ibG9ja3MgYmFjawotICAgICAgICAgICAgZnJvbSAgdGhlIGxhc3RNYkFkZHIgYXJlIG1hcmtlZCBjb3JydXB0ZWQuIEhvd2V2ZXIsIGlmIGxhc3RNYkFkZHIKLSAgICAgICAgICAgIGlzIG5vdCBzZXQgLT4gYWxsIG1hY3JvYmxvY2tzIG9mIHRoZSBzbGljZSBhcmUgbWFya2VkLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdG9yYWdlICAgICAgICBwb2ludGVyIHRvIHN0b3JhZ2Ugc3RydWN0dXJlCi0gICAgICAgICAgICBmaXJzdE1iSW5TbGljZSAgYWRkcmVzcyBvZiB0aGUgZmlyc3QgbWFjcm9ibG9jayBpbiB0aGUgc2xpY2UsIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVzIHRoZSBzbGljZSB0byBiZSBtYXJrZWQgY29ycnVwdGVkCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIHBTdG9yYWdlICAgICAgICBtYlN0b3JhZ2UgZm9yIHRoZSBjb3JydXB0ZWQgbWFjcm9ibG9ja3MgdXBkYXRlZAotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBub25lCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgaDI2NGJzZE1hcmtTbGljZUNvcnJ1cHRlZChzdG9yYWdlX3QgKnBTdG9yYWdlLCB1MzIgZmlyc3RNYkluU2xpY2UpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHRtcCwgaTsKLSAgICB1MzIgc2xpY2VJZDsKLSAgICB1MzIgY3Vyck1iQWRkcjsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdG9yYWdlKTsKLSAgICBBU1NFUlQoZmlyc3RNYkluU2xpY2UgPCBwU3RvcmFnZS0+cGljU2l6ZUluTWJzKTsKLQotICAgIGN1cnJNYkFkZHIgPSBmaXJzdE1iSW5TbGljZTsKLQotICAgIHNsaWNlSWQgPSBwU3RvcmFnZS0+c2xpY2UtPnNsaWNlSWQ7Ci0KLSAgICAvKiBEZWNvZGVTbGljZURhdGEgc2V0cyBsYXN0TWJBZGRyIGZvciBJIHNsaWNlcyAtPiBpZiBpdCB3YXMgc2V0LCBnbyBiYWNrCi0gICAgICogTUFYKHBpY1dpZHRoSW5NYnMsIDEwKSBtYWNyb2Jsb2NrcyBhbmQgc3RhcnQgbWFya2luZyBmcm9tIHRoZXJlICovCi0gICAgaWYgKHBTdG9yYWdlLT5zbGljZS0+bGFzdE1iQWRkcikKLSAgICB7Ci0gICAgICAgIEFTU0VSVChwU3RvcmFnZS0+bWJbcFN0b3JhZ2UtPnNsaWNlLT5sYXN0TWJBZGRyXS5zbGljZUlkID09IHNsaWNlSWQpOwotICAgICAgICBpID0gcFN0b3JhZ2UtPnNsaWNlLT5sYXN0TWJBZGRyIC0gMTsKLSAgICAgICAgdG1wID0gMDsKLSAgICAgICAgd2hpbGUgKGkgPiBjdXJyTWJBZGRyKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocFN0b3JhZ2UtPm1iW2ldLnNsaWNlSWQgPT0gc2xpY2VJZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0bXArKzsKLSAgICAgICAgICAgICAgICBpZiAodG1wID49IE1BWChwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNXaWR0aEluTWJzLCAxMCkpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaS0tOwotICAgICAgICB9Ci0gICAgICAgIGN1cnJNYkFkZHIgPSBpOwotICAgIH0KLQotICAgIGRvCi0gICAgewotCi0gICAgICAgIGlmICggKHBTdG9yYWdlLT5tYltjdXJyTWJBZGRyXS5zbGljZUlkID09IHNsaWNlSWQpICYmCi0gICAgICAgICAgICAgKHBTdG9yYWdlLT5tYltjdXJyTWJBZGRyXS5kZWNvZGVkKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBTdG9yYWdlLT5tYltjdXJyTWJBZGRyXS5kZWNvZGVkLS07Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGN1cnJNYkFkZHIgPSBoMjY0YnNkTmV4dE1iQWRkcmVzcyhwU3RvcmFnZS0+c2xpY2VHcm91cE1hcCwKLSAgICAgICAgICAgIHBTdG9yYWdlLT5waWNTaXplSW5NYnMsIGN1cnJNYkFkZHIpOwotCi0gICAgfSB3aGlsZSAoY3Vyck1iQWRkcik7Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2RhdGEuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9kYXRhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyM2Q0OWUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2RhdGEuaAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0gICAgMy4gRGF0YSB0eXBlcwotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBIMjY0U1dERUNfU0xJQ0VfREFUQV9ICi0jZGVmaW5lIEgyNjRTV0RFQ19TTElDRV9EQVRBX0gKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJiYXNldHlwZS5oIgotI2luY2x1ZGUgImgyNjRic2Rfc3RyZWFtLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9jZmcuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3NsaWNlX2hlYWRlci5oIgotI2luY2x1ZGUgImgyNjRic2Rfc3RvcmFnZS5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIERhdGEgdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2REZWNvZGVTbGljZURhdGEoc3RybURhdGFfdCAqcFN0cm1EYXRhLCBzdG9yYWdlX3QgKnBTdG9yYWdlLAotICAgIGltYWdlX3QgKmN1cnJJbWFnZSwgc2xpY2VIZWFkZXJfdCAqcFNsaWNlSGVhZGVyKTsKLQotdm9pZCBoMjY0YnNkTWFya1NsaWNlQ29ycnVwdGVkKHN0b3JhZ2VfdCAqcFN0b3JhZ2UsIHUzMiBmaXJzdE1iSW5TbGljZSk7Ci0KLSNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX1NMSUNFX0RBVEFfSCAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2xpY2VfZ3JvdXBfbWFwLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2xpY2VfZ3JvdXBfbWFwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjYmI1MzQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2dyb3VwX21hcC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTg5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLSAgICAgMy4gTW9kdWxlIGRlZmluZXMKLSAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotICAgICA1LiBGdW5jdGlvbnMKLSAgICAgICAgICBEZWNvZGVJbnRlcmxlYXZlZE1hcAotICAgICAgICAgIERlY29kZURpc3BlcnNlZE1hcAotICAgICAgICAgIERlY29kZUZvcmVncm91bmRMZWZ0T3Zlck1hcAotICAgICAgICAgIERlY29kZUJveE91dE1hcAotICAgICAgICAgIERlY29kZVJhc3RlclNjYW5NYXAKLSAgICAgICAgICBEZWNvZGVXaXBlTWFwCi0gICAgICAgICAgaDI2NGJzZERlY29kZVNsaWNlR3JvdXBNYXAKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJiYXNldHlwZS5oIgotI2luY2x1ZGUgImgyNjRic2Rfc2xpY2VfZ3JvdXBfbWFwLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9jZmcuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3BpY19wYXJhbV9zZXQuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdm9pZCBEZWNvZGVJbnRlcmxlYXZlZE1hcCgKLSAgdTMyICptYXAsCi0gIHUzMiBudW1TbGljZUdyb3VwcywKLSAgdTMyICpydW5MZW5ndGgsCi0gIHUzMiBwaWNTaXplKTsKLQotc3RhdGljIHZvaWQgRGVjb2RlRGlzcGVyc2VkTWFwKAotICB1MzIgKm1hcCwKLSAgdTMyIG51bVNsaWNlR3JvdXBzLAotICB1MzIgcGljV2lkdGgsCi0gIHUzMiBwaWNIZWlnaHQpOwotCi1zdGF0aWMgdm9pZCBEZWNvZGVGb3JlZ3JvdW5kTGVmdE92ZXJNYXAoCi0gIHUzMiAqbWFwLAotICB1MzIgbnVtU2xpY2VHcm91cHMsCi0gIHUzMiAqdG9wTGVmdCwKLSAgdTMyICpib3R0b21SaWdodCwKLSAgdTMyIHBpY1dpZHRoLAotICB1MzIgcGljSGVpZ2h0KTsKLQotc3RhdGljIHZvaWQgRGVjb2RlQm94T3V0TWFwKAotICB1MzIgKm1hcCwKLSAgdTMyIHNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnLAotICB1MzIgdW5pdHNJblNsaWNlR3JvdXAwLAotICB1MzIgcGljV2lkdGgsCi0gIHUzMiBwaWNIZWlnaHQpOwotCi1zdGF0aWMgdm9pZCBEZWNvZGVSYXN0ZXJTY2FuTWFwKAotICB1MzIgKm1hcCwKLSAgdTMyIHNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnLAotICB1MzIgc2l6ZU9mVXBwZXJMZWZ0R3JvdXAsCi0gIHUzMiBwaWNTaXplKTsKLQotc3RhdGljIHZvaWQgRGVjb2RlV2lwZU1hcCgKLSAgdTMyICptYXAsCi0gIHUzMiBzbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZywKLSAgdTMyIHNpemVPZlVwcGVyTGVmdEdyb3VwLAotICB1MzIgcGljV2lkdGgsCi0gIHUzMiBwaWNIZWlnaHQpOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IERlY29kZUludGVybGVhdmVkTWFwCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGRlY29kZSBpbnRlcmxlYXZlZCBzbGljZSBncm91cCBtYXAgdHlwZSwgaS5lLiBzbGljZQotICAgICAgICAgICAgZ3JvdXAgbWFwIHR5cGUgMC4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBtYXAgICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgbWFwCi0gICAgICAgICAgICBudW1TbGljZUdyb3VwcyAgbnVtYmVyIG9mIHNsaWNlIGdyb3VwcwotICAgICAgICAgICAgcnVuTGVuZ3RoICAgICAgIHJ1bl9sZW5ndGhbXSB2YWx1ZXMgZm9yIGVhY2ggc2xpY2UgZ3JvdXAKLSAgICAgICAgICAgIHBpY1NpemUgICAgICAgICBwaWN0dXJlIHNpemUgaW4gbWFjcm9ibG9ja3MKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgbWFwICAgICAgICAgICAgIHNsaWNlIGdyb3VwIG1hcCBpcyBzdG9yZWQgaGVyZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBub25lCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgRGVjb2RlSW50ZXJsZWF2ZWRNYXAoCi0gIHUzMiAqbWFwLAotICB1MzIgbnVtU2xpY2VHcm91cHMsCi0gIHUzMiAqcnVuTGVuZ3RoLAotICB1MzIgcGljU2l6ZSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaSxqLCBncm91cDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKG1hcCk7Ci0gICAgQVNTRVJUKG51bVNsaWNlR3JvdXBzID49IDEgJiYgbnVtU2xpY2VHcm91cHMgPD0gTUFYX05VTV9TTElDRV9HUk9VUFMpOwotICAgIEFTU0VSVChydW5MZW5ndGgpOwotCi0gICAgaSA9IDA7Ci0KLSAgICBkbyB7Ci0gICAgICAgIGZvciAoZ3JvdXAgPSAwOyBncm91cCA8IG51bVNsaWNlR3JvdXBzICYmIGkgPCBwaWNTaXplOwotICAgICAgICAgIGkgKz0gcnVuTGVuZ3RoW2dyb3VwKytdKQotICAgICAgICB7Ci0gICAgICAgICAgICBBU1NFUlQocnVuTGVuZ3RoW2dyb3VwXSA8PSBwaWNTaXplKTsKLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBydW5MZW5ndGhbZ3JvdXBdICYmIGkgKyBqIDwgcGljU2l6ZTsgaisrKQotICAgICAgICAgICAgICAgIG1hcFtpK2pdID0gZ3JvdXA7Ci0gICAgICAgIH0KLSAgICB9IHdoaWxlIChpIDwgcGljU2l6ZSk7Ci0KLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IERlY29kZURpc3BlcnNlZE1hcAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGdW5jdGlvbiB0byBkZWNvZGUgZGlzcGVyc2VkIHNsaWNlIGdyb3VwIG1hcCB0eXBlLCBpLmUuIHNsaWNlCi0gICAgICAgICAgICBncm91cCBtYXAgdHlwZSAxLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIG1hcCAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIG1hcAotICAgICAgICAgICAgbnVtU2xpY2VHcm91cHMgICAgbnVtYmVyIG9mIHNsaWNlIGdyb3VwcwotICAgICAgICAgICAgcGljV2lkdGggICAgICAgICAgcGljdHVyZSB3aWR0aCBpbiBtYWNyb2Jsb2NrcwotICAgICAgICAgICAgcGljSGVpZ2h0ICAgICAgICAgcGljdHVyZSBoZWlnaHQgaW4gbWFjcm9ibG9ja3MKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgbWFwICAgICAgICAgICAgICAgc2xpY2UgZ3JvdXAgbWFwIGlzIHN0b3JlZCBoZXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIG5vbmUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBEZWNvZGVEaXNwZXJzZWRNYXAoCi0gIHUzMiAqbWFwLAotICB1MzIgbnVtU2xpY2VHcm91cHMsCi0gIHUzMiBwaWNXaWR0aCwKLSAgdTMyIHBpY0hlaWdodCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaSwgcGljU2l6ZTsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKG1hcCk7Ci0gICAgQVNTRVJUKG51bVNsaWNlR3JvdXBzID49IDEgJiYgbnVtU2xpY2VHcm91cHMgPD0gTUFYX05VTV9TTElDRV9HUk9VUFMpOwotICAgIEFTU0VSVChwaWNXaWR0aCk7Ci0gICAgQVNTRVJUKHBpY0hlaWdodCk7Ci0KLSAgICBwaWNTaXplID0gcGljV2lkdGggKiBwaWNIZWlnaHQ7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgcGljU2l6ZTsgaSsrKQotICAgICAgICBtYXBbaV0gPSAoKGkgJSBwaWNXaWR0aCkgKyAoKChpIC8gcGljV2lkdGgpICogbnVtU2xpY2VHcm91cHMpID4+IDEpKSAlCi0gICAgICAgICAgICBudW1TbGljZUdyb3VwczsKLQotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRGVjb2RlRm9yZWdyb3VuZExlZnRPdmVyTWFwCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGRlY29kZSBmb3JlZ3JvdW5kIHdpdGggbGVmdC1vdmVyIHNsaWNlIGdyb3VwIG1hcCB0eXBlLAotICAgICAgICAgICAgaS5lLiBzbGljZSBncm91cCBtYXAgdHlwZSAyLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIG1hcCAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIG1hcAotICAgICAgICAgICAgbnVtU2xpY2VHcm91cHMgICAgbnVtYmVyIG9mIHNsaWNlIGdyb3VwcwotICAgICAgICAgICAgdG9wTGVmdCAgICAgICAgICAgdG9wX2xlZnRbXSB2YWx1ZXMKLSAgICAgICAgICAgIGJvdHRvbVJpZ2h0ICAgICAgIGJvdHRvbV9yaWdodFtdIHZhbHVlcwotICAgICAgICAgICAgcGljV2lkdGggICAgICAgICAgcGljdHVyZSB3aWR0aCBpbiBtYWNyb2Jsb2NrcwotICAgICAgICAgICAgcGljSGVpZ2h0ICAgICAgICAgcGljdHVyZSBoZWlnaHQgaW4gbWFjcm9ibG9ja3MKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgbWFwICAgICAgICAgICAgICAgc2xpY2UgZ3JvdXAgbWFwIGlzIHN0b3JlZCBoZXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIG5vbmUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBEZWNvZGVGb3JlZ3JvdW5kTGVmdE92ZXJNYXAoCi0gIHUzMiAqbWFwLAotICB1MzIgbnVtU2xpY2VHcm91cHMsCi0gIHUzMiAqdG9wTGVmdCwKLSAgdTMyICpib3R0b21SaWdodCwKLSAgdTMyIHBpY1dpZHRoLAotICB1MzIgcGljSGVpZ2h0KQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpLHkseCx5VG9wTGVmdCx5Qm90dG9tUmlnaHQseFRvcExlZnQseEJvdHRvbVJpZ2h0LCBwaWNTaXplOwotICAgIHUzMiBncm91cDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKG1hcCk7Ci0gICAgQVNTRVJUKG51bVNsaWNlR3JvdXBzID49IDEgJiYgbnVtU2xpY2VHcm91cHMgPD0gTUFYX05VTV9TTElDRV9HUk9VUFMpOwotICAgIEFTU0VSVCh0b3BMZWZ0KTsKLSAgICBBU1NFUlQoYm90dG9tUmlnaHQpOwotICAgIEFTU0VSVChwaWNXaWR0aCk7Ci0gICAgQVNTRVJUKHBpY0hlaWdodCk7Ci0KLSAgICBwaWNTaXplID0gcGljV2lkdGggKiBwaWNIZWlnaHQ7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgcGljU2l6ZTsgaSsrKQotICAgICAgICBtYXBbaV0gPSBudW1TbGljZUdyb3VwcyAtIDE7Ci0KLSAgICBmb3IgKGdyb3VwID0gbnVtU2xpY2VHcm91cHMgLSAxOyBncm91cC0tOyApCi0gICAgewotICAgICAgICBBU1NFUlQoIHRvcExlZnRbZ3JvdXBdIDw9IGJvdHRvbVJpZ2h0W2dyb3VwXSAmJgotICAgICAgICAgICAgICAgIGJvdHRvbVJpZ2h0W2dyb3VwXSA8IHBpY1NpemUgKTsKLSAgICAgICAgeVRvcExlZnQgPSB0b3BMZWZ0W2dyb3VwXSAvIHBpY1dpZHRoOwotICAgICAgICB4VG9wTGVmdCA9IHRvcExlZnRbZ3JvdXBdICUgcGljV2lkdGg7Ci0gICAgICAgIHlCb3R0b21SaWdodCA9IGJvdHRvbVJpZ2h0W2dyb3VwXSAvIHBpY1dpZHRoOwotICAgICAgICB4Qm90dG9tUmlnaHQgPSBib3R0b21SaWdodFtncm91cF0gJSBwaWNXaWR0aDsKLSAgICAgICAgQVNTRVJUKHhUb3BMZWZ0IDw9IHhCb3R0b21SaWdodCk7Ci0KLSAgICAgICAgZm9yICh5ID0geVRvcExlZnQ7IHkgPD0geUJvdHRvbVJpZ2h0OyB5KyspCi0gICAgICAgICAgICBmb3IgKHggPSB4VG9wTGVmdDsgeCA8PSB4Qm90dG9tUmlnaHQ7IHgrKykKLSAgICAgICAgICAgICAgICBtYXBbIHkgKiBwaWNXaWR0aCArIHggXSA9IGdyb3VwOwotICAgIH0KLQotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRGVjb2RlQm94T3V0TWFwCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGRlY29kZSBib3gtb3V0IHNsaWNlIGdyb3VwIG1hcCB0eXBlLCBpLmUuIHNsaWNlIGdyb3VwCi0gICAgICAgICAgICBtYXAgdHlwZSAzLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIG1hcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBtYXAKLSAgICAgICAgICAgIHNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnICAgICBzbGljZV9ncm91cF9jaGFuZ2VfZGlyZWN0aW9uX2ZsYWcKLSAgICAgICAgICAgIHVuaXRzSW5TbGljZUdyb3VwMCAgICAgICAgICAgICAgICBtYnMgb24gc2xpY2UgZ3JvdXAgMAotICAgICAgICAgICAgcGljV2lkdGggICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3R1cmUgd2lkdGggaW4gbWFjcm9ibG9ja3MKLSAgICAgICAgICAgIHBpY0hlaWdodCAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0dXJlIGhlaWdodCBpbiBtYWNyb2Jsb2NrcwotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBtYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2UgZ3JvdXAgbWFwIGlzIHN0b3JlZCBoZXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIG5vbmUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBEZWNvZGVCb3hPdXRNYXAoCi0gIHUzMiAqbWFwLAotICB1MzIgc2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWcsCi0gIHUzMiB1bml0c0luU2xpY2VHcm91cDAsCi0gIHUzMiBwaWNXaWR0aCwKLSAgdTMyIHBpY0hlaWdodCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaSwgaywgcGljU2l6ZTsKLSAgICBpMzIgeCwgeSwgeERpciwgeURpciwgbGVmdEJvdW5kLCB0b3BCb3VuZCwgcmlnaHRCb3VuZCwgYm90dG9tQm91bmQ7Ci0gICAgdTMyIG1hcFVuaXRWYWNhbnQ7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChtYXApOwotICAgIEFTU0VSVChwaWNXaWR0aCk7Ci0gICAgQVNTRVJUKHBpY0hlaWdodCk7Ci0KLSAgICBwaWNTaXplID0gcGljV2lkdGggKiBwaWNIZWlnaHQ7Ci0gICAgQVNTRVJUKHVuaXRzSW5TbGljZUdyb3VwMCA8PSBwaWNTaXplKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBwaWNTaXplOyBpKyspCi0gICAgICAgIG1hcFtpXSA9IDE7Ci0KLSAgICB4ID0gKHBpY1dpZHRoIC0gKHUzMilzbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZykgPj4gMTsKLSAgICB5ID0gKHBpY0hlaWdodCAtICh1MzIpc2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWcpID4+IDE7Ci0KLSAgICBsZWZ0Qm91bmQgPSB4OwotICAgIHRvcEJvdW5kID0geTsKLQotICAgIHJpZ2h0Qm91bmQgPSB4OwotICAgIGJvdHRvbUJvdW5kID0geTsKLQotICAgIHhEaXIgPSAoaTMyKXNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnIC0gMTsKLSAgICB5RGlyID0gKGkzMilzbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZzsKLQotICAgIGZvciAoayA9IDA7IGsgPCB1bml0c0luU2xpY2VHcm91cDA7IGsgKz0gbWFwVW5pdFZhY2FudCA/IDEgOiAwKQotICAgIHsKLSAgICAgICAgbWFwVW5pdFZhY2FudCA9IChtYXBbICh1MzIpeSAqIHBpY1dpZHRoICsgKHUzMil4IF0gPT0gMSkgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotCi0gICAgICAgIGlmIChtYXBVbml0VmFjYW50KQotICAgICAgICAgICAgbWFwWyAodTMyKXkgKiBwaWNXaWR0aCArICh1MzIpeCBdID0gMDsKLQotICAgICAgICBpZiAoeERpciA9PSAtMSAmJiB4ID09IGxlZnRCb3VuZCkKLSAgICAgICAgewotICAgICAgICAgICAgbGVmdEJvdW5kID0gTUFYKGxlZnRCb3VuZCAtIDEsIDApOwotICAgICAgICAgICAgeCA9IGxlZnRCb3VuZDsKLSAgICAgICAgICAgIHhEaXIgPSAwOwotICAgICAgICAgICAgeURpciA9IDIgKiAoaTMyKXNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnIC0gMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh4RGlyID09IDEgJiYgeCA9PSByaWdodEJvdW5kKQotICAgICAgICB7Ci0gICAgICAgICAgICByaWdodEJvdW5kID0gTUlOKHJpZ2h0Qm91bmQgKyAxLCAoaTMyKXBpY1dpZHRoIC0gMSk7Ci0gICAgICAgICAgICB4ID0gcmlnaHRCb3VuZDsKLSAgICAgICAgICAgIHhEaXIgPSAwOwotICAgICAgICAgICAgeURpciA9IDEgLSAyICogKGkzMilzbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZzsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh5RGlyID09IC0xICYmIHkgPT0gdG9wQm91bmQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRvcEJvdW5kID0gTUFYKHRvcEJvdW5kIC0gMSwgMCk7Ci0gICAgICAgICAgICB5ID0gdG9wQm91bmQ7Ci0gICAgICAgICAgICB4RGlyID0gMSAtIDIgKiAoaTMyKXNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnOwotICAgICAgICAgICAgeURpciA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoeURpciA9PSAxICYmIHkgPT0gYm90dG9tQm91bmQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJvdHRvbUJvdW5kID0gTUlOKGJvdHRvbUJvdW5kICsgMSwgKGkzMilwaWNIZWlnaHQgLSAxKTsKLSAgICAgICAgICAgIHkgPSBib3R0b21Cb3VuZDsKLSAgICAgICAgICAgIHhEaXIgPSAyICogKGkzMilzbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZyAtIDE7Ci0gICAgICAgICAgICB5RGlyID0gMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHggKz0geERpcjsKLSAgICAgICAgICAgIHkgKz0geURpcjsKLSAgICAgICAgfQotICAgIH0KLQotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRGVjb2RlUmFzdGVyU2Nhbk1hcAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGdW5jdGlvbiB0byBkZWNvZGUgcmFzdGVyIHNjYW4gc2xpY2UgZ3JvdXAgbWFwIHR5cGUsIGkuZS4gc2xpY2UKLSAgICAgICAgICAgIGdyb3VwIG1hcCB0eXBlIDQuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgbWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIG1hcAotICAgICAgICAgICAgc2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWcgICAgIHNsaWNlX2dyb3VwX2NoYW5nZV9kaXJlY3Rpb25fZmxhZwotICAgICAgICAgICAgc2l6ZU9mVXBwZXJMZWZ0R3JvdXAgICAgICAgICAgICAgIG1icyBpbiB1cHBlckxlZnRHcm91cAotICAgICAgICAgICAgcGljU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3R1cmUgc2l6ZSBpbiBtYWNyb2Jsb2NrcwotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBtYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2UgZ3JvdXAgbWFwIGlzIHN0b3JlZCBoZXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIG5vbmUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBEZWNvZGVSYXN0ZXJTY2FuTWFwKAotICB1MzIgKm1hcCwKLSAgdTMyIHNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnLAotICB1MzIgc2l6ZU9mVXBwZXJMZWZ0R3JvdXAsCi0gIHUzMiBwaWNTaXplKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQobWFwKTsKLSAgICBBU1NFUlQocGljU2l6ZSk7Ci0gICAgQVNTRVJUKHNpemVPZlVwcGVyTGVmdEdyb3VwIDw9IHBpY1NpemUpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IHBpY1NpemU7IGkrKykKLSAgICAgICAgaWYgKGkgPCBzaXplT2ZVcHBlckxlZnRHcm91cCkKLSAgICAgICAgICAgIG1hcFtpXSA9ICh1MzIpc2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWc7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG1hcFtpXSA9IDEgLSAodTMyKXNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnOwotCi0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBEZWNvZGVXaXBlTWFwCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGRlY29kZSB3aXBlIHNsaWNlIGdyb3VwIG1hcCB0eXBlLCBpLmUuIHNsaWNlIGdyb3VwIG1hcAotICAgICAgICAgICAgdHlwZSA1LgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnICAgICBzbGljZV9ncm91cF9jaGFuZ2VfZGlyZWN0aW9uX2ZsYWcKLSAgICAgICAgICAgIHNpemVPZlVwcGVyTGVmdEdyb3VwICAgICAgICAgICAgICBtYnMgaW4gdXBwZXJMZWZ0R3JvdXAKLSAgICAgICAgICAgIHBpY1dpZHRoICAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0dXJlIHdpZHRoIGluIG1hY3JvYmxvY2tzCi0gICAgICAgICAgICBwaWNIZWlnaHQgICAgICAgICAgICAgICAgICAgICAgICAgcGljdHVyZSBoZWlnaHQgaW4gbWFjcm9ibG9ja3MKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgbWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlIGdyb3VwIG1hcCBpcyBzdG9yZWQgaGVyZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBub25lCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgRGVjb2RlV2lwZU1hcCgKLSAgdTMyICptYXAsCi0gIHUzMiBzbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZywKLSAgdTMyIHNpemVPZlVwcGVyTGVmdEdyb3VwLAotICB1MzIgcGljV2lkdGgsCi0gIHUzMiBwaWNIZWlnaHQpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGksaixrOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQobWFwKTsKLSAgICBBU1NFUlQocGljV2lkdGgpOwotICAgIEFTU0VSVChwaWNIZWlnaHQpOwotICAgIEFTU0VSVChzaXplT2ZVcHBlckxlZnRHcm91cCA8PSBwaWNXaWR0aCAqIHBpY0hlaWdodCk7Ci0KLSAgICBrID0gMDsKLSAgICBmb3IgKGogPSAwOyBqIDwgcGljV2lkdGg7IGorKykKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IHBpY0hlaWdodDsgaSsrKQotICAgICAgICAgICAgaWYgKGsrKyA8IHNpemVPZlVwcGVyTGVmdEdyb3VwKQotICAgICAgICAgICAgICAgIG1hcFsgaSAqIHBpY1dpZHRoICsgaiBdID0gKHUzMilzbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZzsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBtYXBbIGkgKiBwaWNXaWR0aCArIGogXSA9IDEgLQotICAgICAgICAgICAgICAgICAgICAodTMyKXNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnOwotCi0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkRGVjb2RlU2xpY2VHcm91cE1hcAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGdW5jdGlvbiB0byBkZWNvZGUgbWFjcm9ibG9jayB0byBzbGljZSBncm91cCBtYXAuIENvbnN0cnVjdGlvbgotICAgICAgICAgICAgb2YgZGlmZmVyZW50IHNsaWNlIGdyb3VwIG1hcCB0eXBlcyBpcyBoYW5kbGVkIGJ5IHNlcGFyYXRlCi0gICAgICAgICAgICBmdW5jdGlvbnMgZGVmaW5lZCBhYm92ZS4gU2VlIHN0YW5kYXJkIGZvciBkZXRhaWxzIGhvdyBzbGljZSBncm91cAotICAgICAgICAgICAgbWFwcyBhcmUgY29tcHV0ZWQuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcHBzICAgICAgICAgICAgICAgICAgICAgYWN0aXZlIHBpY3R1cmUgcGFyYW1ldGVyIHNldAotICAgICAgICAgICAgc2xpY2VHcm91cENoYW5nZUN5Y2xlICAgc2xpY2VfZ3JvdXBfY2hhbmdlX2N5Y2xlCi0gICAgICAgICAgICBwaWNXaWR0aCAgICAgICAgICAgICAgICBwaWN0dXJlIHdpZHRoIGluIG1hY3JvYmxvY2tzCi0gICAgICAgICAgICBwaWNIZWlnaHQgICAgICAgICAgICAgICBwaWN0dXJlIGhlaWdodCBpbiBtYWNyb2Jsb2NrcwotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBtYXAgICAgICAgICAgICAgICAgICAgICBzbGljZSBncm91cCBtYXAgaXMgc3RvcmVkIGhlcmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgbm9uZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIGgyNjRic2REZWNvZGVTbGljZUdyb3VwTWFwKAotICB1MzIgKm1hcCwKLSAgcGljUGFyYW1TZXRfdCAqcHBzLAotICB1MzIgc2xpY2VHcm91cENoYW5nZUN5Y2xlLAotICB1MzIgcGljV2lkdGgsCi0gIHUzMiBwaWNIZWlnaHQpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGksIHBpY1NpemUsIHVuaXRzSW5TbGljZUdyb3VwMCA9IDAsIHNpemVPZlVwcGVyTGVmdEdyb3VwID0gMDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKG1hcCk7Ci0gICAgQVNTRVJUKHBwcyk7Ci0gICAgQVNTRVJUKHBpY1dpZHRoKTsKLSAgICBBU1NFUlQocGljSGVpZ2h0KTsKLSAgICBBU1NFUlQocHBzLT5zbGljZUdyb3VwTWFwVHlwZSA8IDcpOwotCi0gICAgcGljU2l6ZSA9IHBpY1dpZHRoICogcGljSGVpZ2h0OwotCi0gICAgLyoganVzdCBvbmUgc2xpY2UgZ3JvdXAgLT4gYWxsIG1hY3JvYmxvY2tzIGJlbG9uZyB0byBncm91cCAwICovCi0gICAgaWYgKHBwcy0+bnVtU2xpY2VHcm91cHMgPT0gMSkKLSAgICB7Ci0gICAgICAgIEgyNjRTd0RlY01lbXNldChtYXAsIDAsIHBpY1NpemUgKiBzaXplb2YodTMyKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAocHBzLT5zbGljZUdyb3VwTWFwVHlwZSA+IDIgJiYgcHBzLT5zbGljZUdyb3VwTWFwVHlwZSA8IDYpCi0gICAgewotICAgICAgICBBU1NFUlQocHBzLT5zbGljZUdyb3VwQ2hhbmdlUmF0ZSAmJgotICAgICAgICAgICAgICAgcHBzLT5zbGljZUdyb3VwQ2hhbmdlUmF0ZSA8PSBwaWNTaXplKTsKLQotICAgICAgICB1bml0c0luU2xpY2VHcm91cDAgPQotICAgICAgICAgICAgTUlOKHNsaWNlR3JvdXBDaGFuZ2VDeWNsZSAqIHBwcy0+c2xpY2VHcm91cENoYW5nZVJhdGUsIHBpY1NpemUpOwotCi0gICAgICAgIGlmIChwcHMtPnNsaWNlR3JvdXBNYXBUeXBlID09IDQgfHwgcHBzLT5zbGljZUdyb3VwTWFwVHlwZSA9PSA1KQotICAgICAgICAgICAgc2l6ZU9mVXBwZXJMZWZ0R3JvdXAgPSBwcHMtPnNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnID8KLSAgICAgICAgICAgICAgICAocGljU2l6ZSAtIHVuaXRzSW5TbGljZUdyb3VwMCkgOiB1bml0c0luU2xpY2VHcm91cDA7Ci0gICAgfQotCi0gICAgc3dpdGNoIChwcHMtPnNsaWNlR3JvdXBNYXBUeXBlKQotICAgIHsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgRGVjb2RlSW50ZXJsZWF2ZWRNYXAobWFwLCBwcHMtPm51bVNsaWNlR3JvdXBzLAotICAgICAgICAgICAgICBwcHMtPnJ1bkxlbmd0aCwgcGljU2l6ZSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICBEZWNvZGVEaXNwZXJzZWRNYXAobWFwLCBwcHMtPm51bVNsaWNlR3JvdXBzLCBwaWNXaWR0aCwKLSAgICAgICAgICAgICAgcGljSGVpZ2h0KTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIERlY29kZUZvcmVncm91bmRMZWZ0T3Zlck1hcChtYXAsIHBwcy0+bnVtU2xpY2VHcm91cHMsCi0gICAgICAgICAgICAgIHBwcy0+dG9wTGVmdCwgcHBzLT5ib3R0b21SaWdodCwgcGljV2lkdGgsIHBpY0hlaWdodCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICBEZWNvZGVCb3hPdXRNYXAobWFwLCBwcHMtPnNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnLAotICAgICAgICAgICAgICB1bml0c0luU2xpY2VHcm91cDAsIHBpY1dpZHRoLCBwaWNIZWlnaHQpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgRGVjb2RlUmFzdGVyU2Nhbk1hcChtYXAsCi0gICAgICAgICAgICAgIHBwcy0+c2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWcsIHNpemVPZlVwcGVyTGVmdEdyb3VwLAotICAgICAgICAgICAgICBwaWNTaXplKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgIERlY29kZVdpcGVNYXAobWFwLCBwcHMtPnNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnLAotICAgICAgICAgICAgICBzaXplT2ZVcHBlckxlZnRHcm91cCwgcGljV2lkdGgsIHBpY0hlaWdodCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQVNTRVJUKHBwcy0+c2xpY2VHcm91cElkKTsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwaWNTaXplOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQVNTRVJUKHBwcy0+c2xpY2VHcm91cElkW2ldIDwgcHBzLT5udW1TbGljZUdyb3Vwcyk7Ci0gICAgICAgICAgICAgICAgbWFwW2ldID0gcHBzLT5zbGljZUdyb3VwSWRbaV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2dyb3VwX21hcC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2dyb3VwX21hcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmNiNmYyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9ncm91cF9tYXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0gICAgMy4gRGF0YSB0eXBlcwotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBIMjY0U1dERUNfU0xJQ0VfR1JPVVBfTUFQX0gKLSNkZWZpbmUgSDI2NFNXREVDX1NMSUNFX0dST1VQX01BUF9ICi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiYmFzZXR5cGUuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3BpY19wYXJhbV9zZXQuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIERhdGEgdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIGgyNjRic2REZWNvZGVTbGljZUdyb3VwTWFwKAotICB1MzIgKm1hcCwKLSAgcGljUGFyYW1TZXRfdCAqcHBzLAotICB1MzIgc2xpY2VHcm91cENoYW5nZUN5Y2xlLAotICB1MzIgcGljV2lkdGgsCi0gIHUzMiBwaWNIZWlnaHQpOwotCi0jZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19TTElDRV9HUk9VUF9NQVBfSCAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2xpY2VfaGVhZGVyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2xpY2VfaGVhZGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNDAxYzYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2hlYWRlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTUxNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0gICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0gICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLSAgICAgNS4gRnVuY3Rpb25zCi0gICAgICAgICAgaDI2NGJzZERlY29kZVNsaWNlSGVhZGVyCi0gICAgICAgICAgTnVtU2xpY2VHcm91cENoYW5nZUN5Y2xlQml0cwotICAgICAgICAgIFJlZlBpY0xpc3RSZW9yZGVyaW5nCi0gICAgICAgICAgRGVjUmVmUGljTWFya2luZwotICAgICAgICAgIENoZWNrUHBzSWQKLSAgICAgICAgICBDaGVja0ZyYW1lTnVtCi0gICAgICAgICAgQ2hlY2tJZHJQaWNJZAotICAgICAgICAgIENoZWNrUGljT3JkZXJDbnRMc2IKLSAgICAgICAgICBDaGVja0RlbHRhUGljT3JkZXJDbnRCb3R0b20KLSAgICAgICAgICBDaGVja0RlbHRhUGljT3JkZXJDbnQKLSAgICAgICAgICBDaGVja1JlZHVuZGFudFBpY0NudAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImgyNjRic2Rfc2xpY2VfaGVhZGVyLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF92bGMuaCIKLSNpbmNsdWRlICJoMjY0YnNkX25hbF91bml0LmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9kcGIuaCIKLQotI2RlZmluZSBVTlVTRUQoeCkgKHZvaWQpKHgpCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHUzMiBSZWZQaWNMaXN0UmVvcmRlcmluZyhzdHJtRGF0YV90ICosIHJlZlBpY0xpc3RSZW9yZGVyaW5nX3QgKiwKLSAgICB1MzIsIHUzMik7Ci0KLXN0YXRpYyB1MzIgTnVtU2xpY2VHcm91cENoYW5nZUN5Y2xlQml0cyh1MzIgcGljU2l6ZUluTWJzLAotICAgIHUzMiBzbGljZUdyb3VwQ2hhbmdlUmF0ZSk7Ci0KLXN0YXRpYyB1MzIgRGVjUmVmUGljTWFya2luZyhzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gICAgZGVjUmVmUGljTWFya2luZ190ICpwRGVjUmVmUGljTWFya2luZywgbmFsVW5pdFR5cGVfZSBuYWxVbml0VHlwZSwKLSAgICB1MzIgbnVtUmVmRnJhbWVzKTsKLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb24gbmFtZTogaDI2NGJzZERlY29kZVNsaWNlSGVhZGVyCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIERlY29kZSBzbGljZSBoZWFkZXIgZGF0YSBmcm9tIHRoZSBzdHJlYW0uCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCi0gICAgICAgICAgICBwU2VxUGFyYW1TZXQgICAgcG9pbnRlciB0byBhY3RpdmUgc2VxdWVuY2UgcGFyYW1ldGVyIHNldAotICAgICAgICAgICAgcFBpY1BhcmFtU2V0ICAgIHBvaW50ZXIgdG8gYWN0aXZlIHBpY3R1cmUgcGFyYW1ldGVyIHNldAotICAgICAgICAgICAgcE5hbFVuaXQgICAgICAgIHBvaW50ZXIgdG8gY3VycmVudCBOQUwgdW5pdCBzdHJ1Y3R1cmUKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgcFNsaWNlSGVhZGVyICAgIGRlY29kZWQgZGF0YSBpcyBzdG9yZWQgaGVyZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcwotICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIGludmFsaWQgc3RyZWFtIGRhdGEgb3IgZW5kIG9mIHN0cmVhbQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZERlY29kZVNsaWNlSGVhZGVyKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgc2xpY2VIZWFkZXJfdCAqcFNsaWNlSGVhZGVyLAotICAgIHNlcVBhcmFtU2V0X3QgKnBTZXFQYXJhbVNldCwgcGljUGFyYW1TZXRfdCAqcFBpY1BhcmFtU2V0LAotICAgIG5hbFVuaXRfdCAqcE5hbFVuaXQpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHRtcCwgaSwgdmFsdWU7Ci0gICAgaTMyIGl0bXA7Ci0gICAgdTMyIHBpY1NpemVJbk1iczsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKHBTbGljZUhlYWRlcik7Ci0gICAgQVNTRVJUKHBTZXFQYXJhbVNldCk7Ci0gICAgQVNTRVJUKHBQaWNQYXJhbVNldCk7Ci0gICAgQVNTRVJUKCBwTmFsVW5pdC0+bmFsVW5pdFR5cGUgPT0gTkFMX0NPREVEX1NMSUNFIHx8Ci0gICAgICAgICAgICBwTmFsVW5pdC0+bmFsVW5pdFR5cGUgPT0gTkFMX0NPREVEX1NMSUNFX0lEUiApOwotCi0KLSAgICBIMjY0U3dEZWNNZW1zZXQocFNsaWNlSGVhZGVyLCAwLCBzaXplb2Yoc2xpY2VIZWFkZXJfdCkpOwotCi0gICAgcGljU2l6ZUluTWJzID0gcFNlcVBhcmFtU2V0LT5waWNXaWR0aEluTWJzICogcFNlcVBhcmFtU2V0LT5waWNIZWlnaHRJbk1iczsKLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLSAgICBwU2xpY2VIZWFkZXItPmZpcnN0TWJJblNsaWNlID0gdmFsdWU7Ci0gICAgaWYgKHZhbHVlID49IHBpY1NpemVJbk1icykKLSAgICB7Ci0gICAgICAgIEVQUklOVCgiZmlyc3RfbWJfaW5fc2xpY2UiKTsKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIH0KLQotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotICAgIHBTbGljZUhlYWRlci0+c2xpY2VUeXBlID0gdmFsdWU7Ci0gICAgLyogc2xpY2UgdHlwZSBoYXMgdG8gYmUgZWl0aGVyIEkgb3IgUCBzbGljZS4gUCBzbGljZSBpcyBub3QgYWxsb3dlZCB3aGVuCi0gICAgICogY3VycmVudCBOQUwgdW5pdCBpcyBhbiBJRFIgTkFMIHVuaXQgb3IgbnVtX3JlZl9mcmFtZXMgaXMgMCAqLwotICAgIGlmICggIUlTX0lfU0xJQ0UocFNsaWNlSGVhZGVyLT5zbGljZVR5cGUpICYmCi0gICAgICAgICAoICFJU19QX1NMSUNFKHBTbGljZUhlYWRlci0+c2xpY2VUeXBlKSB8fAotICAgICAgICAgICBJU19JRFJfTkFMX1VOSVQocE5hbFVuaXQpIHx8Ci0gICAgICAgICAgICFwU2VxUGFyYW1TZXQtPm51bVJlZkZyYW1lcyApICkKLSAgICB7Ci0gICAgICAgIEVQUklOVCgic2xpY2VfdHlwZSIpOwotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgfQotCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgcFNsaWNlSGVhZGVyLT5waWNQYXJhbWV0ZXJTZXRJZCA9IHZhbHVlOwotICAgIGlmIChwU2xpY2VIZWFkZXItPnBpY1BhcmFtZXRlclNldElkICE9IHBQaWNQYXJhbVNldC0+cGljUGFyYW1ldGVyU2V0SWQpCi0gICAgewotICAgICAgICBFUFJJTlQoInBpY19wYXJhbWV0ZXJfc2V0X2lkIik7Ci0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICB9Ci0KLSAgICAvKiBsb2cyKG1heEZyYW1lTnVtKSAtPiBudW0gYml0cyB0byByZXByZXNlbnQgZnJhbWVfbnVtICovCi0gICAgaSA9IDA7Ci0gICAgd2hpbGUgKHBTZXFQYXJhbVNldC0+bWF4RnJhbWVOdW0gPj4gaSkKLSAgICAgICAgaSsrOwotICAgIGktLTsKLQotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgaSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgaWYgKElTX0lEUl9OQUxfVU5JVChwTmFsVW5pdCkgJiYgdG1wICE9IDApCi0gICAgewotICAgICAgICBFUFJJTlQoImZyYW1lX251bSIpOwotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgfQotICAgIHBTbGljZUhlYWRlci0+ZnJhbWVOdW0gPSB0bXA7Ci0KLSAgICBpZiAoSVNfSURSX05BTF9VTklUKHBOYWxVbml0KSkKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgIHBTbGljZUhlYWRlci0+aWRyUGljSWQgPSB2YWx1ZTsKLSAgICAgICAgaWYgKHZhbHVlID4gNjU1MzUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEVQUklOVCgiaWRyX3BpY19pZCIpOwotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHBTZXFQYXJhbVNldC0+cGljT3JkZXJDbnRUeXBlID09IDApCi0gICAgewotICAgICAgICAvKiBsb2cyKG1heFBpY09yZGVyQ250THNiKSAtPiBudW0gYml0cyB0byByZXByZXNlbnQgcGljX29yZGVyX2NudF9sc2IgKi8KLSAgICAgICAgaSA9IDA7Ci0gICAgICAgIHdoaWxlIChwU2VxUGFyYW1TZXQtPm1heFBpY09yZGVyQ250THNiID4+IGkpCi0gICAgICAgICAgICBpKys7Ci0gICAgICAgIGktLTsKLQotICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIGkpOwotICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIHBTbGljZUhlYWRlci0+cGljT3JkZXJDbnRMc2IgPSB0bXA7Ci0KLSAgICAgICAgaWYgKHBQaWNQYXJhbVNldC0+cGljT3JkZXJQcmVzZW50RmxhZykKLSAgICAgICAgewotICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChwU3RybURhdGEsICZpdG1wKTsKLSAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICAgICAgcFNsaWNlSGVhZGVyLT5kZWx0YVBpY09yZGVyQ250Qm90dG9tID0gaXRtcDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGNoZWNrIHRoYXQgcGljT3JkZXJDbnQgZm9yIElEUiBwaWN0dXJlIHdpbGwgYmUgemVyby4gU2VlCi0gICAgICAgICAqIERlY29kZVBpY09yZGVyQ250IGZ1bmN0aW9uIHRvIHVuZGVyc3RhbmQgdGhlIGxvZ2ljIGhlcmUgKi8KLSAgICAgICAgaWYgKCBJU19JRFJfTkFMX1VOSVQocE5hbFVuaXQpICYmCi0gICAgICAgICAgICAgKCAocFNsaWNlSGVhZGVyLT5waWNPcmRlckNudExzYiA+Ci0gICAgICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT5tYXhQaWNPcmRlckNudExzYi8yKSB8fAotICAgICAgICAgICAgICAgIE1JTigoaTMyKXBTbGljZUhlYWRlci0+cGljT3JkZXJDbnRMc2IsCi0gICAgICAgICAgICAgICAgICAgIChpMzIpcFNsaWNlSGVhZGVyLT5waWNPcmRlckNudExzYiArCi0gICAgICAgICAgICAgICAgICAgIHBTbGljZUhlYWRlci0+ZGVsdGFQaWNPcmRlckNudEJvdHRvbSkgIT0gMCApICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCAocFNlcVBhcmFtU2V0LT5waWNPcmRlckNudFR5cGUgPT0gMSkgJiYKLSAgICAgICAgICFwU2VxUGFyYW1TZXQtPmRlbHRhUGljT3JkZXJBbHdheXNaZXJvRmxhZyApCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHBTdHJtRGF0YSwgJml0bXApOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICBwU2xpY2VIZWFkZXItPmRlbHRhUGljT3JkZXJDbnRbMF0gPSBpdG1wOwotCi0gICAgICAgIGlmIChwUGljUGFyYW1TZXQtPnBpY09yZGVyUHJlc2VudEZsYWcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQocFN0cm1EYXRhLCAmaXRtcCk7Ci0gICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgICAgIHBTbGljZUhlYWRlci0+ZGVsdGFQaWNPcmRlckNudFsxXSA9IGl0bXA7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBjaGVjayB0aGF0IHBpY09yZGVyQ250IGZvciBJRFIgcGljdHVyZSB3aWxsIGJlIHplcm8uIFNlZQotICAgICAgICAgKiBEZWNvZGVQaWNPcmRlckNudCBmdW5jdGlvbiB0byB1bmRlcnN0YW5kIHRoZSBsb2dpYyBoZXJlICovCi0gICAgICAgIGlmICggSVNfSURSX05BTF9VTklUKHBOYWxVbml0KSAmJgotICAgICAgICAgICAgIE1JTihwU2xpY2VIZWFkZXItPmRlbHRhUGljT3JkZXJDbnRbMF0sCi0gICAgICAgICAgICAgICAgIHBTbGljZUhlYWRlci0+ZGVsdGFQaWNPcmRlckNudFswXSArCi0gICAgICAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+b2Zmc2V0Rm9yVG9wVG9Cb3R0b21GaWVsZCArCi0gICAgICAgICAgICAgICAgIHBTbGljZUhlYWRlci0+ZGVsdGFQaWNPcmRlckNudFsxXSkgIT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHBQaWNQYXJhbVNldC0+cmVkdW5kYW50UGljQ250UHJlc2VudEZsYWcpCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICBwU2xpY2VIZWFkZXItPnJlZHVuZGFudFBpY0NudCA9IHZhbHVlOwotICAgICAgICBpZiAodmFsdWUgPiAxMjcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEVQUklOVCgicmVkdW5kYW50X3BpY19jbnQiKTsKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChJU19QX1NMSUNFKHBTbGljZUhlYWRlci0+c2xpY2VUeXBlKSkKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgcFNsaWNlSGVhZGVyLT5udW1SZWZJZHhBY3RpdmVPdmVycmlkZUZsYWcgPSB0bXA7Ci0KLSAgICAgICAgaWYgKHBTbGljZUhlYWRlci0+bnVtUmVmSWR4QWN0aXZlT3ZlcnJpZGVGbGFnKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOwotICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgICAgICBpZiAodmFsdWUgPiAxNSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFUFJJTlQoIm51bV9yZWZfaWR4X2wwX2FjdGl2ZV9taW51czEiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwU2xpY2VIZWFkZXItPm51bVJlZklkeEwwQWN0aXZlID0gdmFsdWUgKyAxOwotICAgICAgICB9Ci0gICAgICAgIC8qIHNldCBudW1SZWZJZHhMMEFjdGl2ZSBmcm9tIHBpYyBwYXJhbSBzZXQgKi8KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBpZiB2YWx1ZSAobWludXMxKSBpbiBwaWN0dXJlIHBhcmFtZXRlciBzZXQgZXhjZWVkcyAxNSBpdCBzaG91bGQKLSAgICAgICAgICAgICAqIGhhdmUgYmVlbiBvdmVycmlkZGVuIGhlcmUgKi8KLSAgICAgICAgICAgIGlmIChwUGljUGFyYW1TZXQtPm51bVJlZklkeEwwQWN0aXZlID4gMTYpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRVBSSU5UKCJudW1fcmVmX2lkeF9hY3RpdmVfb3ZlcnJpZGVfZmxhZyIpOwotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBTbGljZUhlYWRlci0+bnVtUmVmSWR4TDBBY3RpdmUgPSBwUGljUGFyYW1TZXQtPm51bVJlZklkeEwwQWN0aXZlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKElTX1BfU0xJQ0UocFNsaWNlSGVhZGVyLT5zbGljZVR5cGUpKQotICAgIHsKLSAgICAgICAgdG1wID0gUmVmUGljTGlzdFJlb3JkZXJpbmcocFN0cm1EYXRhLAotICAgICAgICAgICAgJnBTbGljZUhlYWRlci0+cmVmUGljTGlzdFJlb3JkZXJpbmcsCi0gICAgICAgICAgICBwU2xpY2VIZWFkZXItPm51bVJlZklkeEwwQWN0aXZlLAotICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT5tYXhGcmFtZU51bSk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgfQotCi0gICAgaWYgKHBOYWxVbml0LT5uYWxSZWZJZGMgIT0gMCkKLSAgICB7Ci0gICAgICAgIHRtcCA9IERlY1JlZlBpY01hcmtpbmcocFN0cm1EYXRhLCAmcFNsaWNlSGVhZGVyLT5kZWNSZWZQaWNNYXJraW5nLAotICAgICAgICAgICAgcE5hbFVuaXQtPm5hbFVuaXRUeXBlLCBwU2VxUGFyYW1TZXQtPm51bVJlZkZyYW1lcyk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgfQotCi0gICAgLyogZGVjb2RlIHNsaWNlUXBEZWx0YSBhbmQgY2hlY2sgdGhhdCBpbml0aWFsIFFQIGZvciB0aGUgc2xpY2Ugd2lsbCBiZSBvbgotICAgICAqIHRoZSByYW5nZSBbMCwgNTFdICovCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChwU3RybURhdGEsICZpdG1wKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgcFNsaWNlSGVhZGVyLT5zbGljZVFwRGVsdGEgPSBpdG1wOwotICAgIGl0bXAgKz0gKGkzMilwUGljUGFyYW1TZXQtPnBpY0luaXRRcDsKLSAgICBpZiAoIChpdG1wIDwgMCkgfHwgKGl0bXAgPiA1MSkgKQotICAgIHsKLSAgICAgICAgRVBSSU5UKCJzbGljZV9xcF9kZWx0YSIpOwotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgfQotCi0gICAgaWYgKHBQaWNQYXJhbVNldC0+ZGVibG9ja2luZ0ZpbHRlckNvbnRyb2xQcmVzZW50RmxhZykKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgIHBTbGljZUhlYWRlci0+ZGlzYWJsZURlYmxvY2tpbmdGaWx0ZXJJZGMgPSB2YWx1ZTsKLSAgICAgICAgaWYgKHBTbGljZUhlYWRlci0+ZGlzYWJsZURlYmxvY2tpbmdGaWx0ZXJJZGMgPiAyKQotICAgICAgICB7Ci0gICAgICAgICAgICBFUFJJTlQoImRpc2FibGVfZGVibG9ja2luZ19maWx0ZXJfaWRjIik7Ci0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocFNsaWNlSGVhZGVyLT5kaXNhYmxlRGVibG9ja2luZ0ZpbHRlcklkYyAhPSAxKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHBTdHJtRGF0YSwgJml0bXApOwotICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgICAgICBpZiAoIChpdG1wIDwgLTYpIHx8IChpdG1wID4gNikgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgRVBSSU5UKCJzbGljZV9hbHBoYV9jMF9vZmZzZXRfZGl2MiIpOwotICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcFNsaWNlSGVhZGVyLT5zbGljZUFscGhhQzBPZmZzZXQgPSBpdG1wICogMjsKLQotICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChwU3RybURhdGEsICZpdG1wKTsKLSAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICAgICAgaWYgKCAoaXRtcCA8IC02KSB8fCAoaXRtcCA+IDYpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIEVQUklOVCgic2xpY2VfYmV0YV9vZmZzZXRfZGl2MiIpOwotICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcFNsaWNlSGVhZGVyLT5zbGljZUJldGFPZmZzZXQgPSBpdG1wICogMjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICggKHBQaWNQYXJhbVNldC0+bnVtU2xpY2VHcm91cHMgPiAxKSAmJgotICAgICAgICAgKHBQaWNQYXJhbVNldC0+c2xpY2VHcm91cE1hcFR5cGUgPj0gMykgJiYKLSAgICAgICAgIChwUGljUGFyYW1TZXQtPnNsaWNlR3JvdXBNYXBUeXBlIDw9IDUpICkKLSAgICB7Ci0gICAgICAgIC8qIHNldCB0bXAgdG8gbnVtYmVyIG9mIGJpdHMgdXNlZCB0byByZXByZXNlbnQgc2xpY2VfZ3JvdXBfY2hhbmdlX2N5Y2xlCi0gICAgICAgICAqIGluIHRoZSBzdHJlYW0gKi8KLSAgICAgICAgdG1wID0gTnVtU2xpY2VHcm91cENoYW5nZUN5Y2xlQml0cyhwaWNTaXplSW5NYnMsCi0gICAgICAgICAgICBwUGljUGFyYW1TZXQtPnNsaWNlR3JvdXBDaGFuZ2VSYXRlKTsKLSAgICAgICAgdmFsdWUgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIHRtcCk7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICBwU2xpY2VIZWFkZXItPnNsaWNlR3JvdXBDaGFuZ2VDeWNsZSA9IHZhbHVlOwotCi0gICAgICAgIC8qIGNvcnJlc3BvbmRzIHRvIHRtcCA9IENlaWwocGljU2l6ZUluTWJzIC8gc2xpY2VHcm91cENoYW5nZVJhdGUpICovCi0gICAgICAgIHRtcCA9IChwaWNTaXplSW5NYnMgKyBwUGljUGFyYW1TZXQtPnNsaWNlR3JvdXBDaGFuZ2VSYXRlIC0gMSkgLwotICAgICAgICAgICAgICBwUGljUGFyYW1TZXQtPnNsaWNlR3JvdXBDaGFuZ2VSYXRlOwotICAgICAgICBpZiAocFNsaWNlSGVhZGVyLT5zbGljZUdyb3VwQ2hhbmdlQ3ljbGUgPiB0bXApCi0gICAgICAgIHsKLSAgICAgICAgICAgIEVQUklOVCgic2xpY2VfZ3JvdXBfY2hhbmdlX2N5Y2xlIik7Ci0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IE51bVNsaWNlR3JvdXBDaGFuZ2VDeWNsZUJpdHMKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRGV0ZXJtaW5lIG51bWJlciBvZiBiaXRzIG5lZWRlZCB0byByZXByZXNlbnQKLSAgICAgICAgICAgIHNsaWNlX2dyb3VwX2NoYW5nZV9jeWNsZSBpbiB0aGUgc3RyZWFtLiBUaGUgc3RhbmRhcmQgc3RhdGVzIHRoYXQKLSAgICAgICAgICAgIHNsaWNlX2dyb3VwX2NoYW5nZV9jeWNsZSBpcyByZXByZXNlbnRlZCBieQotICAgICAgICAgICAgICAgIENlaWwoIExvZzIoIChwaWNTaXplSW5NYnMgLyBzbGljZUdyb3VwQ2hhbmdlUmF0ZSkgKyAxKSApCi0KLSAgICAgICAgICAgIGJpdHMuIERpdmlzaW9uICIvIiBpbiB0aGUgZXF1YXRpb24gaXMgbm9uLXRydW5jYXRpbmcgZGl2aXNpb24uCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcGljU2l6ZUluTWJzICAgICAgICAgICAgcGljdHVyZSBzaXplIGluIG1hY3JvYmxvY2tzCi0gICAgICAgICAgICBzbGljZUdyb3VwQ2hhbmdlUmF0ZQotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBub25lCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIG51bWJlciBvZiBiaXRzIG5lZWRlZAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgTnVtU2xpY2VHcm91cENoYW5nZUN5Y2xlQml0cyh1MzIgcGljU2l6ZUluTWJzLCB1MzIgc2xpY2VHcm91cENoYW5nZVJhdGUpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHRtcCxudW1CaXRzLG1hc2s7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwaWNTaXplSW5NYnMpOwotICAgIEFTU0VSVChzbGljZUdyb3VwQ2hhbmdlUmF0ZSk7Ci0gICAgQVNTRVJUKHNsaWNlR3JvdXBDaGFuZ2VSYXRlIDw9IHBpY1NpemVJbk1icyk7Ci0KLSAgICAvKiBjb21wdXRlIChwaWNTaXplSW5NYnMgLyBzbGljZUdyb3VwQ2hhbmdlUmF0ZSArIDEpLCByb3VuZGVkIHVwICovCi0gICAgaWYgKHBpY1NpemVJbk1icyAlIHNsaWNlR3JvdXBDaGFuZ2VSYXRlKQotICAgICAgICB0bXAgPSAyICsgcGljU2l6ZUluTWJzL3NsaWNlR3JvdXBDaGFuZ2VSYXRlOwotICAgIGVsc2UKLSAgICAgICAgdG1wID0gMSArIHBpY1NpemVJbk1icy9zbGljZUdyb3VwQ2hhbmdlUmF0ZTsKLQotICAgIG51bUJpdHMgPSAwOwotICAgIG1hc2sgPSB+MFU7Ci0KLSAgICAvKiBzZXQgbnVtQml0cyB0byBwb3NpdGlvbiBvZiByaWdodC1tb3N0IG5vbi16ZXJvIGJpdCAqLwotICAgIHdoaWxlICh0bXAgJiAobWFzazw8KytudW1CaXRzKSkKLSAgICAgICAgOwotICAgIG51bUJpdHMtLTsKLQotICAgIC8qIGFkZCBvbmUgbW9yZSBiaXQgaWYgdmFsdWUgZ3JlYXRlciB0aGFuIDJebnVtQml0cyAqLwotICAgIGlmICh0bXAgJiAoKDE8PG51bUJpdHMpLTEpKQotICAgICAgICBudW1CaXRzKys7Ci0KLSAgICByZXR1cm4obnVtQml0cyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBSZWZQaWNMaXN0UmVvcmRlcmluZwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBEZWNvZGUgcmVmZXJlbmNlIHBpY3R1cmUgbGlzdCByZW9yZGVyaW5nIHN5bnRheCBlbGVtZW50cyBmcm9tCi0gICAgICAgICAgICB0aGUgc3RyZWFtLiBNYXggbnVtYmVyIG9mIHJlb3JkZXJpbmcgY29tbWFuZHMgaXMgbnVtUmVmSWR4QWN0aXZlLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQotICAgICAgICAgICAgbnVtUmVmSWR4QWN0aXZlIG51bWJlciBvZiBhY3RpdmUgcmVmZXJlbmNlIGluZGljZXMgdG8gYmUgdXNlZCBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IHNsaWNlCi0gICAgICAgICAgICBtYXhQaWNOdW0gICAgICAgbWF4RnJhbWVOdW0gZnJvbSB0aGUgYWN0aXZlIFNQUwotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBwUmVmUGljTGlzdFJlb3JkZXJpbmcgICBkZWNvZGVkIGRhdGEgaXMgc3RvcmVkIGhlcmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKLSAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBpbnZhbGlkIHN0cmVhbSBkYXRhCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBSZWZQaWNMaXN0UmVvcmRlcmluZyhzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gICAgcmVmUGljTGlzdFJlb3JkZXJpbmdfdCAqcFJlZlBpY0xpc3RSZW9yZGVyaW5nLCB1MzIgbnVtUmVmSWR4QWN0aXZlLAotICAgIHUzMiBtYXhQaWNOdW0pCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHRtcCwgdmFsdWUsIGk7Ci0gICAgdTMyIGNvbW1hbmQ7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVChwUmVmUGljTGlzdFJlb3JkZXJpbmcpOwotICAgIEFTU0VSVChudW1SZWZJZHhBY3RpdmUpOwotICAgIEFTU0VSVChtYXhQaWNOdW0pOwotCi0KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgcFJlZlBpY0xpc3RSZW9yZGVyaW5nLT5yZWZQaWNMaXN0UmVvcmRlcmluZ0ZsYWdMMCA9IHRtcDsKLQotICAgIGlmIChwUmVmUGljTGlzdFJlb3JkZXJpbmctPnJlZlBpY0xpc3RSZW9yZGVyaW5nRmxhZ0wwKQotICAgIHsKLSAgICAgICAgaSA9IDA7Ci0KLSAgICAgICAgZG8KLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGkgPiBudW1SZWZJZHhBY3RpdmUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRVBSSU5UKCJUb28gbWFueSByZW9yZGVyaW5nIGNvbW1hbmRzIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmY29tbWFuZCk7Ci0gICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgICAgIGlmIChjb21tYW5kID4gMykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFUFJJTlQoInJlb3JkZXJpbmdfb2ZfcGljX251bXNfaWRjIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwUmVmUGljTGlzdFJlb3JkZXJpbmctPmNvbW1hbmRbaV0ucmVvcmRlcmluZ09mUGljTnVtc0lkYyA9IGNvbW1hbmQ7Ci0KLSAgICAgICAgICAgIGlmICgoY29tbWFuZCA9PSAwKSB8fCAoY29tbWFuZCA9PSAxKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOwotICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgPj0gbWF4UGljTnVtKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRVBSSU5UKCJhYnNfZGlmZl9waWNfbnVtX21pbnVzMSIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBSZWZQaWNMaXN0UmVvcmRlcmluZy0+Y29tbWFuZFtpXS5hYnNEaWZmUGljTnVtID0gdmFsdWUgKyAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGNvbW1hbmQgPT0gMikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOwotICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgICAgICAgICBwUmVmUGljTGlzdFJlb3JkZXJpbmctPmNvbW1hbmRbaV0ubG9uZ1Rlcm1QaWNOdW0gPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpKys7Ci0gICAgICAgIH0gd2hpbGUgKGNvbW1hbmQgIT0gMyk7Ci0KLSAgICAgICAgLyogdGhlcmUgc2hhbGwgYmUgYXQgbGVhc3Qgb25lIHJlb3JkZXJpbmcgY29tbWFuZCBpZgotICAgICAgICAgKiByZWZQaWNMaXN0UmVvcmRlcmluZ0ZsYWdMMCB3YXMgc2V0ICovCi0gICAgICAgIGlmIChpID09IDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEVQUklOVCgicmVmX3BpY19saXN0X3Jlb3JkZXJpbmciKTsKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRGVjUmVmUGljTWFya2luZwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBEZWNvZGUgZGVjb2RlZCByZWZlcmVuY2UgcGljdHVyZSBtYXJraW5nIHN5bnRheCBlbGVtZW50cyBmcm9tCi0gICAgICAgICAgICB0aGUgc3RyZWFtLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQotICAgICAgICAgICAgbmFsVW5pdFR5cGUgICAgIHR5cGUgb2YgdGhlIGN1cnJlbnQgTkFMIHVuaXQKLSAgICAgICAgICAgIG51bVJlZkZyYW1lcyAgICBtYXggbnVtYmVyIG9mIHJlZmVyZW5jZSBmcmFtZXMgZnJvbSB0aGUgYWN0aXZlIFNQUwotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBwRGVjUmVmUGljTWFya2luZyAgIGRlY29kZWQgZGF0YSBpcyBzdG9yZWQgaGVyZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcwotICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIGludmFsaWQgc3RyZWFtIGRhdGEKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIERlY1JlZlBpY01hcmtpbmcoc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICAgIGRlY1JlZlBpY01hcmtpbmdfdCAqcERlY1JlZlBpY01hcmtpbmcsIG5hbFVuaXRUeXBlX2UgbmFsVW5pdFR5cGUsCi0gICAgdTMyIG51bVJlZkZyYW1lcykKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wLCB2YWx1ZTsKLSAgICB1MzIgaTsKLSAgICB1MzIgb3BlcmF0aW9uOwotICAgIC8qIHZhcmlhYmxlcyBmb3IgZXJyb3IgY2hlY2tpbmcgcHVycG9zZXMsIHN0b3JlIG51bWJlciBvZiBtZW1vcnkKLSAgICAgKiBtYW5hZ2VtZW50IG9wZXJhdGlvbnMgb2YgY2VydGFpbiB0eXBlICovCi0gICAgdTMyIG51bTQgPSAwLCBudW01ID0gMCwgbnVtNiA9IDAsIG51bTF0bzMgPSAwOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoIG5hbFVuaXRUeXBlID09IE5BTF9DT0RFRF9TTElDRV9JRFIgfHwKLSAgICAgICAgICAgIG5hbFVuaXRUeXBlID09IE5BTF9DT0RFRF9TTElDRSB8fAotICAgICAgICAgICAgbmFsVW5pdFR5cGUgPT0gTkFMX1NFSSApOwotCi0KLSAgICBpZiAobmFsVW5pdFR5cGUgPT0gTkFMX0NPREVEX1NMSUNFX0lEUikKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgcERlY1JlZlBpY01hcmtpbmctPm5vT3V0cHV0T2ZQcmlvclBpY3NGbGFnID0gdG1wOwotCi0gICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgcERlY1JlZlBpY01hcmtpbmctPmxvbmdUZXJtUmVmZXJlbmNlRmxhZyA9IHRtcDsKLSAgICAgICAgaWYgKCFudW1SZWZGcmFtZXMgJiYgcERlY1JlZlBpY01hcmtpbmctPmxvbmdUZXJtUmVmZXJlbmNlRmxhZykKLSAgICAgICAgewotICAgICAgICAgICAgRVBSSU5UKCJsb25nX3Rlcm1fcmVmZXJlbmNlX2ZsYWciKTsKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIHBEZWNSZWZQaWNNYXJraW5nLT5hZGFwdGl2ZVJlZlBpY01hcmtpbmdNb2RlRmxhZyA9IHRtcDsKLSAgICAgICAgaWYgKHBEZWNSZWZQaWNNYXJraW5nLT5hZGFwdGl2ZVJlZlBpY01hcmtpbmdNb2RlRmxhZykKLSAgICAgICAgewotICAgICAgICAgICAgaSA9IDA7Ci0gICAgICAgICAgICBkbwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIHNlZSBleHBsYW5hdGlvbiBvZiB0aGUgTUFYX05VTV9NTUNfT1BFUkFUSU9OUyBpbgotICAgICAgICAgICAgICAgICAqIHNsaWNlX2hlYWRlci5oICovCi0gICAgICAgICAgICAgICAgaWYgKGkgPiAoMiAqIG51bVJlZkZyYW1lcyArIDIpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRVBSSU5UKCJUb28gbWFueSBtYW5hZ2VtZW50IG9wZXJhdGlvbnMiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZvcGVyYXRpb24pOwotICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgICAgICAgICBpZiAob3BlcmF0aW9uID4gNikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEVQUklOVCgibWVtb3J5X21hbmFnZW1lbnRfY29udHJvbF9vcGVyYXRpb24iKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHBEZWNSZWZQaWNNYXJraW5nLT5vcGVyYXRpb25baV0uCi0gICAgICAgICAgICAgICAgICAgIG1lbW9yeU1hbmFnZW1lbnRDb250cm9sT3BlcmF0aW9uID0gb3BlcmF0aW9uOwotICAgICAgICAgICAgICAgIGlmICgob3BlcmF0aW9uID09IDEpIHx8IChvcGVyYXRpb24gPT0gMykpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICAgICAgICAgICAgICBwRGVjUmVmUGljTWFya2luZy0+b3BlcmF0aW9uW2ldLmRpZmZlcmVuY2VPZlBpY051bXMgPQotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgKyAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAob3BlcmF0aW9uID09IDIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICAgICAgICAgICAgICBwRGVjUmVmUGljTWFya2luZy0+b3BlcmF0aW9uW2ldLmxvbmdUZXJtUGljTnVtID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICgob3BlcmF0aW9uID09IDMpIHx8IChvcGVyYXRpb24gPT0gNikpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICAgICAgICAgICAgICBwRGVjUmVmUGljTWFya2luZy0+b3BlcmF0aW9uW2ldLmxvbmdUZXJtRnJhbWVJZHggPQotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChvcGVyYXRpb24gPT0gNCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qIHZhbHVlIHNoYWxsIGJlIGluIHJhbmdlIFswLCBudW1SZWZGcmFtZXNdICovCi0gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA+IG51bVJlZkZyYW1lcykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgRVBSSU5UKCJtYXhfbG9uZ190ZXJtX2ZyYW1lX2lkeF9wbHVzMSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwRGVjUmVmUGljTWFya2luZy0+b3BlcmF0aW9uW2ldLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heExvbmdUZXJtRnJhbWVJZHggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PX0xPTkdfVEVSTV9GUkFNRV9JTkRJQ0VTOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcERlY1JlZlBpY01hcmtpbmctPm9wZXJhdGlvbltpXS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhMb25nVGVybUZyYW1lSWR4ID0gdmFsdWUgLSAxOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG51bTQrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG9wZXJhdGlvbiA9PSA1KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbnVtNSsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAob3BlcmF0aW9uICYmIG9wZXJhdGlvbiA8PSAzKQotICAgICAgICAgICAgICAgICAgICBudW0xdG8zKys7Ci0gICAgICAgICAgICAgICAgaWYgKG9wZXJhdGlvbiA9PSA2KQotICAgICAgICAgICAgICAgICAgICBudW02Kys7Ci0KLSAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICB9IHdoaWxlIChvcGVyYXRpb24gIT0gMCk7Ci0KLSAgICAgICAgICAgIC8qIGVycm9yIGNoZWNraW5nICovCi0gICAgICAgICAgICBpZiAobnVtNCA+IDEgfHwgbnVtNSA+IDEgfHwgbnVtNiA+IDEgfHwgKG51bTF0bzMgJiYgbnVtNSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uIG5hbWU6IGgyNjRic2RDaGVja1Bwc0lkCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIFBlZWsgdmFsdWUgb2YgcGljX3BhcmFtZXRlcl9zZXRfaWQgZnJvbSB0aGUgc2xpY2UgaGVhZGVyLiBGdW5jdGlvbgotICAgICAgICAgICAgZG9lcyBub3QgbW9kaWZ5IGN1cnJlbnQgc3RyZWFtIHBvc2l0aW9ucyBidXQgY29waWVzIHRoZSBzdHJlYW0KLSAgICAgICAgICAgIGRhdGEgc3RydWN0dXJlIHRvIHRtcCBzdHJ1Y3R1cmUgd2hpY2ggaXMgdXNlZCB3aGlsZSBhY2Nlc3NpbmcKLSAgICAgICAgICAgIHN0cmVhbSBkYXRhLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBwaWNQYXJhbVNldElkICAgdmFsdWUgaXMgc3RvcmVkIGhlcmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKLSAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBpbnZhbGlkIHN0cmVhbSBkYXRhCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkQ2hlY2tQcHNJZChzdHJtRGF0YV90ICpwU3RybURhdGEsIHUzMiAqcGljUGFyYW1TZXRJZCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wLCB2YWx1ZTsKLSAgICBzdHJtRGF0YV90IHRtcFN0cm1EYXRhWzFdOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLQotICAgIC8qIGRvbid0IHRvdWNoIG9yaWdpbmFsIHN0cmVhbSBwb3NpdGlvbiBwYXJhbXMgKi8KLSAgICAqdG1wU3RybURhdGEgPSAqcFN0cm1EYXRhOwotCi0gICAgLyogZmlyc3RfbWJfaW5fc2xpY2UgKi8KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotCi0gICAgLyogc2xpY2VfdHlwZSAqLwotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotICAgIGlmICh2YWx1ZSA+PSBNQVhfTlVNX1BJQ19QQVJBTV9TRVRTKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICAqcGljUGFyYW1TZXRJZCA9IHZhbHVlOwotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkQ2hlY2tGcmFtZU51bQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBQZWVrIHZhbHVlIG9mIGZyYW1lX251bSBmcm9tIHRoZSBzbGljZSBoZWFkZXIuIEZ1bmN0aW9uIGRvZXMgbm90Ci0gICAgICAgICAgICBtb2RpZnkgY3VycmVudCBzdHJlYW0gcG9zaXRpb25zIGJ1dCBjb3BpZXMgdGhlIHN0cmVhbSBkYXRhCi0gICAgICAgICAgICBzdHJ1Y3R1cmUgdG8gdG1wIHN0cnVjdHVyZSB3aGljaCBpcyB1c2VkIHdoaWxlIGFjY2Vzc2luZyBzdHJlYW0KLSAgICAgICAgICAgIGRhdGEuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCi0gICAgICAgICAgICBtYXhGcmFtZU51bQotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBmcmFtZU51bSAgICAgICAgdmFsdWUgaXMgc3RvcmVkIGhlcmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKLSAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBpbnZhbGlkIHN0cmVhbSBkYXRhCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkQ2hlY2tGcmFtZU51bSgKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICB1MzIgbWF4RnJhbWVOdW0sCi0gIHUzMiAqZnJhbWVOdW0pCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHRtcCwgdmFsdWUsIGk7Ci0gICAgc3RybURhdGFfdCB0bXBTdHJtRGF0YVsxXTsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKG1heEZyYW1lTnVtKTsKLSAgICBBU1NFUlQoZnJhbWVOdW0pOwotCi0gICAgLyogZG9uJ3QgdG91Y2ggb3JpZ2luYWwgc3RyZWFtIHBvc2l0aW9uIHBhcmFtcyAqLwotICAgICp0bXBTdHJtRGF0YSA9ICpwU3RybURhdGE7Ci0KLSAgICAvKiBza2lwIGZpcnN0X21iX2luX3NsaWNlICovCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLQotICAgIC8qIHNraXAgc2xpY2VfdHlwZSAqLwotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICAvKiBza2lwIHBpY19wYXJhbWV0ZXJfc2V0X2lkICovCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLQotICAgIC8qIGxvZzIobWF4RnJhbWVOdW0pIC0+IG51bSBiaXRzIHRvIHJlcHJlc2VudCBmcmFtZV9udW0gKi8KLSAgICBpID0gMDsKLSAgICB3aGlsZSAobWF4RnJhbWVOdW0gPj4gaSkKLSAgICAgICAgaSsrOwotICAgIGktLTsKLQotICAgIC8qIGZyYW1lX251bSAqLwotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHRtcFN0cm1EYXRhLCBpKTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAqZnJhbWVOdW0gPSB0bXA7Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RDaGVja0lkclBpY0lkCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIFBlZWsgdmFsdWUgb2YgaWRyX3BpY19pZCBmcm9tIHRoZSBzbGljZSBoZWFkZXIuIEZ1bmN0aW9uIGRvZXMgbm90Ci0gICAgICAgICAgICBtb2RpZnkgY3VycmVudCBzdHJlYW0gcG9zaXRpb25zIGJ1dCBjb3BpZXMgdGhlIHN0cmVhbSBkYXRhCi0gICAgICAgICAgICBzdHJ1Y3R1cmUgdG8gdG1wIHN0cnVjdHVyZSB3aGljaCBpcyB1c2VkIHdoaWxlIGFjY2Vzc2luZyBzdHJlYW0KLSAgICAgICAgICAgIGRhdGEuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCi0gICAgICAgICAgICBtYXhGcmFtZU51bSAgICAgbWF4IGZyYW1lIG51bWJlciBmcm9tIGFjdGl2ZSBTUFMKLSAgICAgICAgICAgIG5hbFVuaXRUeXBlICAgICB0eXBlIG9mIHRoZSBjdXJyZW50IE5BTCB1bml0Ci0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIGlkclBpY0lkICAgICAgICB2YWx1ZSBpcyBzdG9yZWQgaGVyZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcwotICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIGludmFsaWQgc3RyZWFtIGRhdGEKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2RDaGVja0lkclBpY0lkKAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHUzMiBtYXhGcmFtZU51bSwKLSAgbmFsVW5pdFR5cGVfZSBuYWxVbml0VHlwZSwKLSAgdTMyICppZHJQaWNJZCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wLCB2YWx1ZSwgaTsKLSAgICBzdHJtRGF0YV90IHRtcFN0cm1EYXRhWzFdOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQobWF4RnJhbWVOdW0pOwotICAgIEFTU0VSVChpZHJQaWNJZCk7Ci0KLSAgICAvKiBuYWxVbml0VHlwZSBtdXN0IGJlIGVxdWFsIHRvIDUgYmVjYXVzZSBvdGhlcndpc2UgaWRyUGljSWQgaXMgbm90Ci0gICAgICogcHJlc2VudCAqLwotICAgIGlmIChuYWxVbml0VHlwZSAhPSBOQUxfQ09ERURfU0xJQ0VfSURSKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICAvKiBkb24ndCB0b3VjaCBvcmlnaW5hbCBzdHJlYW0gcG9zaXRpb24gcGFyYW1zICovCi0gICAgKnRtcFN0cm1EYXRhID0gKnBTdHJtRGF0YTsKLQotICAgIC8qIHNraXAgZmlyc3RfbWJfaW5fc2xpY2UgKi8KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotCi0gICAgLyogc2tpcCBzbGljZV90eXBlICovCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLQotICAgIC8qIHNraXAgcGljX3BhcmFtZXRlcl9zZXRfaWQgKi8KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotCi0gICAgLyogbG9nMihtYXhGcmFtZU51bSkgLT4gbnVtIGJpdHMgdG8gcmVwcmVzZW50IGZyYW1lX251bSAqLwotICAgIGkgPSAwOwotICAgIHdoaWxlIChtYXhGcmFtZU51bSA+PiBpKQotICAgICAgICBpKys7Ci0gICAgaS0tOwotCi0gICAgLyogc2tpcCBmcmFtZV9udW0gKi8KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyh0bXBTdHJtRGF0YSwgaSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICAvKiBpZHJfcGljX2lkICovCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCBpZHJQaWNJZCk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkQ2hlY2tQaWNPcmRlckNudExzYgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBQZWVrIHZhbHVlIG9mIHBpY19vcmRlcl9jbnRfbHNiIGZyb20gdGhlIHNsaWNlIGhlYWRlci4gRnVuY3Rpb24KLSAgICAgICAgICAgIGRvZXMgbm90IG1vZGlmeSBjdXJyZW50IHN0cmVhbSBwb3NpdGlvbnMgYnV0IGNvcGllcyB0aGUgc3RyZWFtCi0gICAgICAgICAgICBkYXRhIHN0cnVjdHVyZSB0byB0bXAgc3RydWN0dXJlIHdoaWNoIGlzIHVzZWQgd2hpbGUgYWNjZXNzaW5nCi0gICAgICAgICAgICBzdHJlYW0gZGF0YS4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwU3RybURhdGEgICAgICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKLSAgICAgICAgICAgIHBTZXFQYXJhbVNldCAgICBwb2ludGVyIHRvIGFjdGl2ZSBTUFMKLSAgICAgICAgICAgIG5hbFVuaXRUeXBlICAgICB0eXBlIG9mIHRoZSBjdXJyZW50IE5BTCB1bml0Ci0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIHBpY09yZGVyQ250THNiICB2YWx1ZSBpcyBzdG9yZWQgaGVyZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcwotICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIGludmFsaWQgc3RyZWFtIGRhdGEKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2RDaGVja1BpY09yZGVyQ250THNiKAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHNlcVBhcmFtU2V0X3QgKnBTZXFQYXJhbVNldCwKLSAgbmFsVW5pdFR5cGVfZSBuYWxVbml0VHlwZSwKLSAgdTMyICpwaWNPcmRlckNudExzYikKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wLCB2YWx1ZSwgaTsKLSAgICBzdHJtRGF0YV90IHRtcFN0cm1EYXRhWzFdOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQocFNlcVBhcmFtU2V0KTsKLSAgICBBU1NFUlQocGljT3JkZXJDbnRMc2IpOwotCi0gICAgLyogcGljT3JkZXJDbnRUeXBlIG11c3QgYmUgZXF1YWwgdG8gMCAqLwotICAgIEFTU0VSVChwU2VxUGFyYW1TZXQtPnBpY09yZGVyQ250VHlwZSA9PSAwKTsKLSAgICBBU1NFUlQocFNlcVBhcmFtU2V0LT5tYXhGcmFtZU51bSk7Ci0gICAgQVNTRVJUKHBTZXFQYXJhbVNldC0+bWF4UGljT3JkZXJDbnRMc2IpOwotCi0gICAgLyogZG9uJ3QgdG91Y2ggb3JpZ2luYWwgc3RyZWFtIHBvc2l0aW9uIHBhcmFtcyAqLwotICAgICp0bXBTdHJtRGF0YSA9ICpwU3RybURhdGE7Ci0KLSAgICAvKiBza2lwIGZpcnN0X21iX2luX3NsaWNlICovCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLQotICAgIC8qIHNraXAgc2xpY2VfdHlwZSAqLwotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICAvKiBza2lwIHBpY19wYXJhbWV0ZXJfc2V0X2lkICovCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLQotICAgIC8qIGxvZzIobWF4RnJhbWVOdW0pIC0+IG51bSBiaXRzIHRvIHJlcHJlc2VudCBmcmFtZV9udW0gKi8KLSAgICBpID0gMDsKLSAgICB3aGlsZSAocFNlcVBhcmFtU2V0LT5tYXhGcmFtZU51bSA+PiBpKQotICAgICAgICBpKys7Ci0gICAgaS0tOwotCi0gICAgLyogc2tpcCBmcmFtZV9udW0gKi8KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyh0bXBTdHJtRGF0YSwgaSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICAvKiBza2lwIGlkcl9waWNfaWQgd2hlbiBuZWNlc3NhcnkgKi8KLSAgICBpZiAobmFsVW5pdFR5cGUgPT0gTkFMX0NPREVEX1NMSUNFX0lEUikKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICB9Ci0KLSAgICAvKiBsb2cyKG1heFBpY09yZGVyQ250THNiKSAtPiBudW0gYml0cyB0byByZXByZXNlbnQgcGljX29yZGVyX2NudF9sc2IgKi8KLSAgICBpID0gMDsKLSAgICB3aGlsZSAocFNlcVBhcmFtU2V0LT5tYXhQaWNPcmRlckNudExzYiA+PiBpKQotICAgICAgICBpKys7Ci0gICAgaS0tOwotCi0gICAgLyogcGljX29yZGVyX2NudF9sc2IgKi8KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyh0bXBTdHJtRGF0YSwgaSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgKnBpY09yZGVyQ250THNiID0gdG1wOwotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkQ2hlY2tEZWx0YVBpY09yZGVyQ250Qm90dG9tCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIFBlZWsgdmFsdWUgb2YgZGVsdGFfcGljX29yZGVyX2NudF9ib3R0b20gZnJvbSB0aGUgc2xpY2UgaGVhZGVyLgotICAgICAgICAgICAgRnVuY3Rpb24gZG9lcyBub3QgbW9kaWZ5IGN1cnJlbnQgc3RyZWFtIHBvc2l0aW9ucyBidXQgY29waWVzIHRoZQotICAgICAgICAgICAgc3RyZWFtIGRhdGEgc3RydWN0dXJlIHRvIHRtcCBzdHJ1Y3R1cmUgd2hpY2ggaXMgdXNlZCB3aGlsZQotICAgICAgICAgICAgYWNjZXNzaW5nIHN0cmVhbSBkYXRhLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQotICAgICAgICAgICAgcFNlcVBhcmFtU2V0ICAgIHBvaW50ZXIgdG8gYWN0aXZlIFNQUwotICAgICAgICAgICAgbmFsVW5pdFR5cGUgICAgIHR5cGUgb2YgdGhlIGN1cnJlbnQgTkFMIHVuaXQKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgZGVsdGFQaWNPcmRlckNudEJvdHRvbSAgdmFsdWUgaXMgc3RvcmVkIGhlcmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKLSAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBpbnZhbGlkIHN0cmVhbSBkYXRhCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkQ2hlY2tEZWx0YVBpY09yZGVyQ250Qm90dG9tKAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHNlcVBhcmFtU2V0X3QgKnBTZXFQYXJhbVNldCwKLSAgbmFsVW5pdFR5cGVfZSBuYWxVbml0VHlwZSwKLSAgaTMyICpkZWx0YVBpY09yZGVyQ250Qm90dG9tKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB0bXAsIHZhbHVlLCBpOwotICAgIHN0cm1EYXRhX3QgdG1wU3RybURhdGFbMV07Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVChwU2VxUGFyYW1TZXQpOwotICAgIEFTU0VSVChkZWx0YVBpY09yZGVyQ250Qm90dG9tKTsKLQotICAgIC8qIHBpY09yZGVyQ250VHlwZSBtdXN0IGJlIGVxdWFsIHRvIDAgYW5kIHBpY09yZGVyUHJlc2VudEZsYWcgbXVzdCBiZSBUUlVFCi0gICAgICogKi8KLSAgICBBU1NFUlQocFNlcVBhcmFtU2V0LT5waWNPcmRlckNudFR5cGUgPT0gMCk7Ci0gICAgQVNTRVJUKHBTZXFQYXJhbVNldC0+bWF4RnJhbWVOdW0pOwotICAgIEFTU0VSVChwU2VxUGFyYW1TZXQtPm1heFBpY09yZGVyQ250THNiKTsKLQotICAgIC8qIGRvbid0IHRvdWNoIG9yaWdpbmFsIHN0cmVhbSBwb3NpdGlvbiBwYXJhbXMgKi8KLSAgICAqdG1wU3RybURhdGEgPSAqcFN0cm1EYXRhOwotCi0gICAgLyogc2tpcCBmaXJzdF9tYl9pbl9zbGljZSAqLwotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICAvKiBza2lwIHNsaWNlX3R5cGUgKi8KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotCi0gICAgLyogc2tpcCBwaWNfcGFyYW1ldGVyX3NldF9pZCAqLwotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICAvKiBsb2cyKG1heEZyYW1lTnVtKSAtPiBudW0gYml0cyB0byByZXByZXNlbnQgZnJhbWVfbnVtICovCi0gICAgaSA9IDA7Ci0gICAgd2hpbGUgKHBTZXFQYXJhbVNldC0+bWF4RnJhbWVOdW0gPj4gaSkKLSAgICAgICAgaSsrOwotICAgIGktLTsKLQotICAgIC8qIHNraXAgZnJhbWVfbnVtICovCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHModG1wU3RybURhdGEsIGkpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgLyogc2tpcCBpZHJfcGljX2lkIHdoZW4gbmVjZXNzYXJ5ICovCi0gICAgaWYgKG5hbFVuaXRUeXBlID09IE5BTF9DT0RFRF9TTElDRV9JRFIpCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgfQotCi0gICAgLyogbG9nMihtYXhQaWNPcmRlckNudExzYikgLT4gbnVtIGJpdHMgdG8gcmVwcmVzZW50IHBpY19vcmRlcl9jbnRfbHNiICovCi0gICAgaSA9IDA7Ci0gICAgd2hpbGUgKHBTZXFQYXJhbVNldC0+bWF4UGljT3JkZXJDbnRMc2IgPj4gaSkKLSAgICAgICAgaSsrOwotICAgIGktLTsKLQotICAgIC8qIHNraXAgcGljX29yZGVyX2NudF9sc2IgKi8KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyh0bXBTdHJtRGF0YSwgaSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICAvKiBkZWx0YV9waWNfb3JkZXJfY250X2JvdHRvbSAqLwotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQodG1wU3RybURhdGEsIGRlbHRhUGljT3JkZXJDbnRCb3R0b20pOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZENoZWNrRGVsdGFQaWNPcmRlckNudAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBQZWVrIHZhbHVlcyBkZWx0YV9waWNfb3JkZXJfY250WzBdIGFuZCBkZWx0YV9waWNfb3JkZXJfY250WzFdCi0gICAgICAgICAgICBmcm9tIHRoZSBzbGljZSBoZWFkZXIuIEZ1bmN0aW9uIGRvZXMgbm90IG1vZGlmeSBjdXJyZW50IHN0cmVhbQotICAgICAgICAgICAgcG9zaXRpb25zIGJ1dCBjb3BpZXMgdGhlIHN0cmVhbSBkYXRhIHN0cnVjdHVyZSB0byB0bXAgc3RydWN0dXJlCi0gICAgICAgICAgICB3aGljaCBpcyB1c2VkIHdoaWxlIGFjY2Vzc2luZyBzdHJlYW0gZGF0YS4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwU3RybURhdGEgICAgICAgICAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQotICAgICAgICAgICAgcFNlcVBhcmFtU2V0ICAgICAgICAgICAgcG9pbnRlciB0byBhY3RpdmUgU1BTCi0gICAgICAgICAgICBuYWxVbml0VHlwZSAgICAgICAgICAgICB0eXBlIG9mIHRoZSBjdXJyZW50IE5BTCB1bml0Ci0gICAgICAgICAgICBwaWNPcmRlclByZXNlbnRGbGFnICAgICBmbGFnIGluZGljYXRpbmcgaWYgZGVsdGFfcGljX29yZGVyX2NudFsxXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgcHJlc2VudCBpbiB0aGUgc3RyZWFtCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIGRlbHRhUGljT3JkZXJDbnQgICAgICAgIHZhbHVlcyBhcmUgc3RvcmVkIGhlcmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSEFOVFJPX09LICAgICAgICAgICAgICAgc3VjY2VzcwotICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgICAgICAgICAgaW52YWxpZCBzdHJlYW0gZGF0YQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZENoZWNrRGVsdGFQaWNPcmRlckNudCgKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZXFQYXJhbVNldF90ICpwU2VxUGFyYW1TZXQsCi0gIG5hbFVuaXRUeXBlX2UgbmFsVW5pdFR5cGUsCi0gIHUzMiBwaWNPcmRlclByZXNlbnRGbGFnLAotICBpMzIgKmRlbHRhUGljT3JkZXJDbnQpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHRtcCwgdmFsdWUsIGk7Ci0gICAgc3RybURhdGFfdCB0bXBTdHJtRGF0YVsxXTsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKHBTZXFQYXJhbVNldCk7Ci0gICAgQVNTRVJUKGRlbHRhUGljT3JkZXJDbnQpOwotCi0gICAgLyogcGljT3JkZXJDbnRUeXBlIG11c3QgYmUgZXF1YWwgdG8gMSBhbmQgZGVsdGFQaWNPcmRlckFsd2F5c1plcm9GbGFnIG11c3QKLSAgICAgKiBiZSBGQUxTRSAqLwotICAgIEFTU0VSVChwU2VxUGFyYW1TZXQtPnBpY09yZGVyQ250VHlwZSA9PSAxKTsKLSAgICBBU1NFUlQoIXBTZXFQYXJhbVNldC0+ZGVsdGFQaWNPcmRlckFsd2F5c1plcm9GbGFnKTsKLSAgICBBU1NFUlQocFNlcVBhcmFtU2V0LT5tYXhGcmFtZU51bSk7Ci0KLSAgICAvKiBkb24ndCB0b3VjaCBvcmlnaW5hbCBzdHJlYW0gcG9zaXRpb24gcGFyYW1zICovCi0gICAgKnRtcFN0cm1EYXRhID0gKnBTdHJtRGF0YTsKLQotICAgIC8qIHNraXAgZmlyc3RfbWJfaW5fc2xpY2UgKi8KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotCi0gICAgLyogc2tpcCBzbGljZV90eXBlICovCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLQotICAgIC8qIHNraXAgcGljX3BhcmFtZXRlcl9zZXRfaWQgKi8KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotCi0gICAgLyogbG9nMihtYXhGcmFtZU51bSkgLT4gbnVtIGJpdHMgdG8gcmVwcmVzZW50IGZyYW1lX251bSAqLwotICAgIGkgPSAwOwotICAgIHdoaWxlIChwU2VxUGFyYW1TZXQtPm1heEZyYW1lTnVtID4+IGkpCi0gICAgICAgIGkrKzsKLSAgICBpLS07Ci0KLSAgICAvKiBza2lwIGZyYW1lX251bSAqLwotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHRtcFN0cm1EYXRhLCBpKTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIC8qIHNraXAgaWRyX3BpY19pZCB3aGVuIG5lY2Vzc2FyeSAqLwotICAgIGlmIChuYWxVbml0VHlwZSA9PSBOQUxfQ09ERURfU0xJQ0VfSURSKQotICAgIHsKLSAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotICAgIH0KLQotICAgIC8qIGRlbHRhX3BpY19vcmRlcl9jbnRbMF0gKi8KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHRtcFN0cm1EYXRhLCAmZGVsdGFQaWNPcmRlckNudFswXSk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotCi0gICAgLyogZGVsdGFfcGljX29yZGVyX2NudFsxXSBpZiBwcmVzZW50ICovCi0gICAgaWYgKHBpY09yZGVyUHJlc2VudEZsYWcpCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHRtcFN0cm1EYXRhLCAmZGVsdGFQaWNPcmRlckNudFsxXSk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgfQotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkQ2hlY2tSZWR1bmRhbnRQaWNDbnQKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgUGVlayB2YWx1ZSBvZiByZWR1bmRhbnRfcGljX2NudCBmcm9tIHRoZSBzbGljZSBoZWFkZXIuIEZ1bmN0aW9uCi0gICAgICAgICAgICBkb2VzIG5vdCBtb2RpZnkgY3VycmVudCBzdHJlYW0gcG9zaXRpb25zIGJ1dCBjb3BpZXMgdGhlIHN0cmVhbQotICAgICAgICAgICAgZGF0YSBzdHJ1Y3R1cmUgdG8gdG1wIHN0cnVjdHVyZSB3aGljaCBpcyB1c2VkIHdoaWxlIGFjY2Vzc2luZwotICAgICAgICAgICAgc3RyZWFtIGRhdGEuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCi0gICAgICAgICAgICBwU2VxUGFyYW1TZXQgICAgcG9pbnRlciB0byBhY3RpdmUgU1BTCi0gICAgICAgICAgICBwUGljUGFyYW1TZXQgICAgcG9pbnRlciB0byBhY3RpdmUgUFBTCi0gICAgICAgICAgICBuYWxVbml0VHlwZSAgICAgdHlwZSBvZiB0aGUgY3VycmVudCBOQUwgdW5pdAotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICByZWR1bmRhbnRQaWNDbnQgdmFsdWUgaXMgc3RvcmVkIGhlcmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKLSAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBpbnZhbGlkIHN0cmVhbSBkYXRhCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkQ2hlY2tSZWR1bmRhbnRQaWNDbnQoCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VxUGFyYW1TZXRfdCAqcFNlcVBhcmFtU2V0LAotICBwaWNQYXJhbVNldF90ICpwUGljUGFyYW1TZXQsCi0gIG5hbFVuaXRUeXBlX2UgbmFsVW5pdFR5cGUsCi0gIHUzMiAqcmVkdW5kYW50UGljQ250KQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB0bXAsIHZhbHVlLCBpOwotICAgIGkzMiBpdmFsdWU7Ci0gICAgc3RybURhdGFfdCB0bXBTdHJtRGF0YVsxXTsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKHBTZXFQYXJhbVNldCk7Ci0gICAgQVNTRVJUKHBQaWNQYXJhbVNldCk7Ci0gICAgQVNTRVJUKHJlZHVuZGFudFBpY0NudCk7Ci0KLSAgICAvKiByZWR1bmRhbnRfcGljX2NudF9mbGFnIG11c3QgYmUgVFJVRSAqLwotICAgIEFTU0VSVChwUGljUGFyYW1TZXQtPnJlZHVuZGFudFBpY0NudFByZXNlbnRGbGFnKTsKLSAgICBBU1NFUlQocFNlcVBhcmFtU2V0LT5tYXhGcmFtZU51bSk7Ci0gICAgQVNTRVJUKHBTZXFQYXJhbVNldC0+cGljT3JkZXJDbnRUeXBlID4gMCB8fAotICAgICAgICAgICBwU2VxUGFyYW1TZXQtPm1heFBpY09yZGVyQ250THNiKTsKLQotICAgIC8qIGRvbid0IHRvdWNoIG9yaWdpbmFsIHN0cmVhbSBwb3NpdGlvbiBwYXJhbXMgKi8KLSAgICAqdG1wU3RybURhdGEgPSAqcFN0cm1EYXRhOwotCi0gICAgLyogc2tpcCBmaXJzdF9tYl9pbl9zbGljZSAqLwotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICAvKiBza2lwIHNsaWNlX3R5cGUgKi8KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotCi0gICAgLyogc2tpcCBwaWNfcGFyYW1ldGVyX3NldF9pZCAqLwotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICAvKiBsb2cyKG1heEZyYW1lTnVtKSAtPiBudW0gYml0cyB0byByZXByZXNlbnQgZnJhbWVfbnVtICovCi0gICAgaSA9IDA7Ci0gICAgd2hpbGUgKHBTZXFQYXJhbVNldC0+bWF4RnJhbWVOdW0gPj4gaSkKLSAgICAgICAgaSsrOwotICAgIGktLTsKLQotICAgIC8qIHNraXAgZnJhbWVfbnVtICovCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHModG1wU3RybURhdGEsIGkpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgLyogc2tpcCBpZHJfcGljX2lkIHdoZW4gbmVjZXNzYXJ5ICovCi0gICAgaWYgKG5hbFVuaXRUeXBlID09IE5BTF9DT0RFRF9TTElDRV9JRFIpCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgfQotCi0gICAgaWYgKHBTZXFQYXJhbVNldC0+cGljT3JkZXJDbnRUeXBlID09IDApCi0gICAgewotICAgICAgICAvKiBsb2cyKG1heFBpY09yZGVyQ250THNiKSAtPiBudW0gYml0cyB0byByZXByZXNlbnQgcGljX29yZGVyX2NudF9sc2IgKi8KLSAgICAgICAgaSA9IDA7Ci0gICAgICAgIHdoaWxlIChwU2VxUGFyYW1TZXQtPm1heFBpY09yZGVyQ250THNiID4+IGkpCi0gICAgICAgICAgICBpKys7Ci0gICAgICAgIGktLTsKLQotICAgICAgICAvKiBwaWNfb3JkZXJfY250X2xzYiAqLwotICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyh0bXBTdHJtRGF0YSwgaSk7Ci0gICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgICAgICBpZiAocFBpY1BhcmFtU2V0LT5waWNPcmRlclByZXNlbnRGbGFnKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBza2lwIGRlbHRhX3BpY19vcmRlcl9jbnRfYm90dG9tICovCi0gICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHRtcFN0cm1EYXRhLCAmaXZhbHVlKTsKLSAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHBTZXFQYXJhbVNldC0+cGljT3JkZXJDbnRUeXBlID09IDEgJiYKLSAgICAgICFwU2VxUGFyYW1TZXQtPmRlbHRhUGljT3JkZXJBbHdheXNaZXJvRmxhZykKLSAgICB7Ci0gICAgICAgIC8qIGRlbHRhX3BpY19vcmRlcl9jbnRbMF0gKi8KLSAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZCh0bXBTdHJtRGF0YSwgJml2YWx1ZSk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICAgICAgLyogZGVsdGFfcGljX29yZGVyX2NudFsxXSBpZiBwcmVzZW50ICovCi0gICAgICAgIGlmIChwUGljUGFyYW1TZXQtPnBpY09yZGVyUHJlc2VudEZsYWcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQodG1wU3RybURhdGEsICZpdmFsdWUpOwotICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiByZWR1bmRhbnRfcGljX2NudCAqLwotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgcmVkdW5kYW50UGljQ250KTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZENoZWNrUHJpb3JQaWNzRmxhZwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBQZWVrIHZhbHVlIG9mIG5vX291dHB1dF9vZl9wcmlvcl9waWNzX2ZsYWcgZnJvbSB0aGUgc2xpY2UgaGVhZGVyLgotICAgICAgICAgICAgRnVuY3Rpb24gZG9lcyBub3QgbW9kaWZ5IGN1cnJlbnQgc3RyZWFtIHBvc2l0aW9ucyBidXQgY29waWVzCi0gICAgICAgICAgICB0aGUgc3RyZWFtIGRhdGEgc3RydWN0dXJlIHRvIHRtcCBzdHJ1Y3R1cmUgd2hpY2ggaXMgdXNlZCB3aGlsZQotICAgICAgICAgICAgYWNjZXNzaW5nIHN0cmVhbSBkYXRhLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQotICAgICAgICAgICAgcFNlcVBhcmFtU2V0ICAgIHBvaW50ZXIgdG8gYWN0aXZlIFNQUwotICAgICAgICAgICAgcFBpY1BhcmFtU2V0ICAgIHBvaW50ZXIgdG8gYWN0aXZlIFBQUwotICAgICAgICAgICAgbmFsVW5pdFR5cGUgICAgIHR5cGUgb2YgdGhlIGN1cnJlbnQgTkFMIHVuaXQKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgbm9PdXRwdXRPZlByaW9yUGljc0ZsYWcgdmFsdWUgaXMgc3RvcmVkIGhlcmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKLSAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBpbnZhbGlkIHN0cmVhbSBkYXRhCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKmxpbnQgLWU3MTUgZGlzYWJsZSBsaW50IGluZm8gbmFsVW5pdFR5cGUgbm90IHJlZmVyZW5jZWQgKi8KLXUzMiBoMjY0YnNkQ2hlY2tQcmlvclBpY3NGbGFnKHUzMiAqIG5vT3V0cHV0T2ZQcmlvclBpY3NGbGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RybURhdGFfdCAqIHBTdHJtRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlcVBhcmFtU2V0X3QgKiBwU2VxUGFyYW1TZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwaWNQYXJhbVNldF90ICogcFBpY1BhcmFtU2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFsVW5pdFR5cGVfZSBuYWxVbml0VHlwZSkKLXsKLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHRtcCwgdmFsdWUsIGk7Ci0gICAgaTMyIGl2YWx1ZTsKLSAgICBzdHJtRGF0YV90IHRtcFN0cm1EYXRhWzFdOwotICAgIFVOVVNFRChuYWxVbml0VHlwZSk7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVChwU2VxUGFyYW1TZXQpOwotICAgIEFTU0VSVChwUGljUGFyYW1TZXQpOwotICAgIEFTU0VSVChub091dHB1dE9mUHJpb3JQaWNzRmxhZyk7Ci0KLSAgICAvKiBtdXN0IGJlIElEUiBsc2ljZSAqLwotICAgIEFTU0VSVChuYWxVbml0VHlwZSA9PSBOQUxfQ09ERURfU0xJQ0VfSURSKTsKLQotICAgIC8qIGRvbid0IHRvdWNoIG9yaWdpbmFsIHN0cmVhbSBwb3NpdGlvbiBwYXJhbXMgKi8KLSAgICAqdG1wU3RybURhdGEgPSAqcFN0cm1EYXRhOwotCi0gICAgLyogc2tpcCBmaXJzdF9tYl9pbl9zbGljZSAqLwotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICBpZih0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4gKHRtcCk7Ci0KLSAgICAvKiBzbGljZV90eXBlICovCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOwotICAgIGlmKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybiAodG1wKTsKLQotICAgIC8qIHNraXAgcGljX3BhcmFtZXRlcl9zZXRfaWQgKi8KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgaWYodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuICh0bXApOwotCi0gICAgLyogbG9nMihtYXhGcmFtZU51bSkgLT4gbnVtIGJpdHMgdG8gcmVwcmVzZW50IGZyYW1lX251bSAqLwotICAgIGkgPSAwOwotICAgIHdoaWxlKHBTZXFQYXJhbVNldC0+bWF4RnJhbWVOdW0gPj4gaSkKLSAgICAgICAgaSsrOwotICAgIGktLTsKLQotICAgIC8qIHNraXAgZnJhbWVfbnVtICovCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHModG1wU3RybURhdGEsIGkpOwotICAgIGlmKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4gKEhBTlRST19OT0spOwotCi0gICAgLyogc2tpcCBpZHJfcGljX2lkICovCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOwotICAgIGlmKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybiAodG1wKTsKLQotICAgIGlmKHBTZXFQYXJhbVNldC0+cGljT3JkZXJDbnRUeXBlID09IDApCi0gICAgewotICAgICAgICAvKiBsb2cyKG1heFBpY09yZGVyQ250THNiKSAtPiBudW0gYml0cyB0byByZXByZXNlbnQgcGljX29yZGVyX2NudF9sc2IgKi8KLSAgICAgICAgaSA9IDA7Ci0gICAgICAgIHdoaWxlKHBTZXFQYXJhbVNldC0+bWF4UGljT3JkZXJDbnRMc2IgPj4gaSkKLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgaS0tOwotCi0gICAgICAgIC8qIHNraXAgcGljX29yZGVyX2NudF9sc2IgKi8KLSAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHModG1wU3RybURhdGEsIGkpOwotICAgICAgICBpZih0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgIHJldHVybiAoSEFOVFJPX05PSyk7Ci0KLSAgICAgICAgaWYocFBpY1BhcmFtU2V0LT5waWNPcmRlclByZXNlbnRGbGFnKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBza2lwIGRlbHRhX3BpY19vcmRlcl9jbnRfYm90dG9tICovCi0gICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHRtcFN0cm1EYXRhLCAmaXZhbHVlKTsKLSAgICAgICAgICAgIGlmKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgcmV0dXJuICh0bXApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYocFNlcVBhcmFtU2V0LT5waWNPcmRlckNudFR5cGUgPT0gMSAmJgotICAgICAgICFwU2VxUGFyYW1TZXQtPmRlbHRhUGljT3JkZXJBbHdheXNaZXJvRmxhZykKLSAgICB7Ci0gICAgICAgIC8qIHNraXAgZGVsdGFfcGljX29yZGVyX2NudFswXSAqLwotICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHRtcFN0cm1EYXRhLCAmaXZhbHVlKTsKLSAgICAgICAgaWYodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybiAodG1wKTsKLQotICAgICAgICAvKiBza2lwIGRlbHRhX3BpY19vcmRlcl9jbnRbMV0gaWYgcHJlc2VudCAqLwotICAgICAgICBpZihwUGljUGFyYW1TZXQtPnBpY09yZGVyUHJlc2VudEZsYWcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQodG1wU3RybURhdGEsICZpdmFsdWUpOwotICAgICAgICAgICAgaWYodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICByZXR1cm4gKHRtcCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBza2lwIHJlZHVuZGFudF9waWNfY250ICovCi0gICAgaWYocFBpY1BhcmFtU2V0LT5yZWR1bmRhbnRQaWNDbnRQcmVzZW50RmxhZykKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICAgICAgaWYodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybiAodG1wKTsKLSAgICB9Ci0KLSAgICAqbm9PdXRwdXRPZlByaW9yUGljc0ZsYWcgPSBoMjY0YnNkR2V0Qml0cyh0bXBTdHJtRGF0YSwgMSk7Ci0gICAgaWYoKm5vT3V0cHV0T2ZQcmlvclBpY3NGbGFnID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybiAoSEFOVFJPX05PSyk7Ci0KLSAgICByZXR1cm4gKEhBTlRST19PSyk7Ci0KLX0KLS8qbGludCArZTcxNSAqLwotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9oZWFkZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9oZWFkZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk4ODk4YS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2xpY2VfaGVhZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLSAgICAzLiBEYXRhIHR5cGVzCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIEgyNjRTV0RFQ19TTElDRV9IRUFERVJfSAotI2RlZmluZSBIMjY0U1dERUNfU0xJQ0VfSEVBREVSX0gKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJiYXNldHlwZS5oIgotI2luY2x1ZGUgImgyNjRic2Rfc3RyZWFtLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9jZmcuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3NlcV9wYXJhbV9zZXQuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3BpY19wYXJhbV9zZXQuaCIKLSNpbmNsdWRlICJoMjY0YnNkX25hbF91bml0LmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLWVudW0gewotICAgIFBfU0xJQ0UgPSAwLAotICAgIElfU0xJQ0UgPSAyCi19OwotCi1lbnVtIHtOT19MT05HX1RFUk1fRlJBTUVfSU5ESUNFUyA9IDB4RkZGRn07Ci0KLS8qIG1hY3JvIHRvIGRldGVybWluZSBpZiBzbGljZSBpcyBhbiBpbnRlciBzbGljZSwgc2xpY2VUeXBlcyAwIGFuZCA1ICovCi0jZGVmaW5lIElTX1BfU0xJQ0Uoc2xpY2VUeXBlKSAoKChzbGljZVR5cGUpID09IFBfU0xJQ0UpIHx8IFwKLSAgICAoKHNsaWNlVHlwZSkgPT0gUF9TTElDRSArIDUpKQotCi0vKiBtYWNybyB0byBkZXRlcm1pbmUgaWYgc2xpY2UgaXMgYW4gaW50cmEgc2xpY2UsIHNsaWNlVHlwZXMgMiBhbmQgNyAqLwotI2RlZmluZSBJU19JX1NMSUNFKHNsaWNlVHlwZSkgKCgoc2xpY2VUeXBlKSA9PSBJX1NMSUNFKSB8fCBcCi0gICAgKChzbGljZVR5cGUpID09IElfU0xJQ0UgKyA1KSkKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBEYXRhIHR5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBzdHJ1Y3R1cmUgdG8gc3RvcmUgZGF0YSBvZiBvbmUgcmVmZXJlbmNlIHBpY3R1cmUgbGlzdCByZW9yZGVyaW5nIG9wZXJhdGlvbiAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICB1MzIgcmVvcmRlcmluZ09mUGljTnVtc0lkYzsKLSAgICB1MzIgYWJzRGlmZlBpY051bTsKLSAgICB1MzIgbG9uZ1Rlcm1QaWNOdW07Ci19IHJlZlBpY0xpc3RSZW9yZGVyaW5nT3BlcmF0aW9uX3Q7Ci0KLS8qIHN0cnVjdHVyZSB0byBzdG9yZSByZWZlcmVuY2UgcGljdHVyZSBsaXN0IHJlb3JkZXJpbmcgb3BlcmF0aW9ucyAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICB1MzIgcmVmUGljTGlzdFJlb3JkZXJpbmdGbGFnTDA7Ci0gICAgcmVmUGljTGlzdFJlb3JkZXJpbmdPcGVyYXRpb25fdCBjb21tYW5kW01BWF9OVU1fUkVGX1BJQ1MrMV07Ci19IHJlZlBpY0xpc3RSZW9yZGVyaW5nX3Q7Ci0KLS8qIHN0cnVjdHVyZSB0byBzdG9yZSBkYXRhIG9mIG9uZSBEUEIgbWVtb3J5IG1hbmFnZW1lbnQgY29udHJvbCBvcGVyYXRpb24gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdTMyIG1lbW9yeU1hbmFnZW1lbnRDb250cm9sT3BlcmF0aW9uOwotICAgIHUzMiBkaWZmZXJlbmNlT2ZQaWNOdW1zOwotICAgIHUzMiBsb25nVGVybVBpY051bTsKLSAgICB1MzIgbG9uZ1Rlcm1GcmFtZUlkeDsKLSAgICB1MzIgbWF4TG9uZ1Rlcm1GcmFtZUlkeDsKLX0gbWVtb3J5TWFuYWdlbWVudE9wZXJhdGlvbl90OwotCi0vKiB3b3JzdCBjYXNlIHNjZW5hcmlvOiBhbGwgTUFYX05VTV9SRUZfUElDUyBwaWN0dXJlcyBpbiB0aGUgYnVmZmVyIGFyZQotICogc2hvcnQgdGVybSBwaWN0dXJlcywgZWFjaCBvbmUgb2YgdGhlbSBpcyBmaXJzdCBtYXJrZWQgYXMgbG9uZyB0ZXJtCi0gKiByZWZlcmVuY2UgcGljdHVyZSB3aGljaCBpcyB0aGVuIG1hcmtlZCBhcyB1bnVzZWQgZm9yIHJlZmVyZW5jZS4KLSAqIEFkZGl0aW9uYWxseSwgbWF4IGxvbmctdGVybSBmcmFtZSBpbmRleCBpcyBzZXQgYW5kIGN1cnJlbnQgcGljdHVyZSBpcwotICogbWFya2VkIGFzIGxvbmcgdGVybSByZWZlcmVuY2UgcGljdHVyZS4gTGFzdCBwb3NpdGlvbiByZXNlcnZlZCBmb3IKLSAqIGVuZCBtZW1vcnlfbWFuYWdlbWVudF9jb250cm9sX29wZXJhdGlvbiBjb21tYW5kICovCi0jZGVmaW5lIE1BWF9OVU1fTU1DX09QRVJBVElPTlMgKDIqTUFYX05VTV9SRUZfUElDUysyKzEpCi0KLS8qIHN0cnVjdHVyZSB0byBzdG9yZSBkZWNvZGVkIHJlZmVyZW5jZSBwaWN0dXJlIG1hcmtpbmcgZGF0YSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICB1MzIgbm9PdXRwdXRPZlByaW9yUGljc0ZsYWc7Ci0gICAgdTMyIGxvbmdUZXJtUmVmZXJlbmNlRmxhZzsKLSAgICB1MzIgYWRhcHRpdmVSZWZQaWNNYXJraW5nTW9kZUZsYWc7Ci0gICAgbWVtb3J5TWFuYWdlbWVudE9wZXJhdGlvbl90IG9wZXJhdGlvbltNQVhfTlVNX01NQ19PUEVSQVRJT05TXTsKLX0gZGVjUmVmUGljTWFya2luZ190OwotCi0vKiBzdHJ1Y3R1cmUgdG8gc3RvcmUgc2xpY2UgaGVhZGVyIGRhdGEgZGVjb2RlZCBmcm9tIHRoZSBzdHJlYW0gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdTMyIGZpcnN0TWJJblNsaWNlOwotICAgIHUzMiBzbGljZVR5cGU7Ci0gICAgdTMyIHBpY1BhcmFtZXRlclNldElkOwotICAgIHUzMiBmcmFtZU51bTsKLSAgICB1MzIgaWRyUGljSWQ7Ci0gICAgdTMyIHBpY09yZGVyQ250THNiOwotICAgIGkzMiBkZWx0YVBpY09yZGVyQ250Qm90dG9tOwotICAgIGkzMiBkZWx0YVBpY09yZGVyQ250WzJdOwotICAgIHUzMiByZWR1bmRhbnRQaWNDbnQ7Ci0gICAgdTMyIG51bVJlZklkeEFjdGl2ZU92ZXJyaWRlRmxhZzsKLSAgICB1MzIgbnVtUmVmSWR4TDBBY3RpdmU7Ci0gICAgaTMyIHNsaWNlUXBEZWx0YTsKLSAgICB1MzIgZGlzYWJsZURlYmxvY2tpbmdGaWx0ZXJJZGM7Ci0gICAgaTMyIHNsaWNlQWxwaGFDME9mZnNldDsKLSAgICBpMzIgc2xpY2VCZXRhT2Zmc2V0OwotICAgIHUzMiBzbGljZUdyb3VwQ2hhbmdlQ3ljbGU7Ci0gICAgcmVmUGljTGlzdFJlb3JkZXJpbmdfdCByZWZQaWNMaXN0UmVvcmRlcmluZzsKLSAgICBkZWNSZWZQaWNNYXJraW5nX3QgZGVjUmVmUGljTWFya2luZzsKLX0gc2xpY2VIZWFkZXJfdDsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZERlY29kZVNsaWNlSGVhZGVyKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2xpY2VIZWFkZXJfdCAqcFNsaWNlSGVhZGVyLAotICBzZXFQYXJhbVNldF90ICpwU2VxUGFyYW1TZXQsCi0gIHBpY1BhcmFtU2V0X3QgKnBQaWNQYXJhbVNldCwKLSAgbmFsVW5pdF90ICpwTmFsVW5pdCk7Ci0KLXUzMiBoMjY0YnNkQ2hlY2tQcHNJZChzdHJtRGF0YV90ICpwU3RybURhdGEsIHUzMiAqcHBzSWQpOwotCi11MzIgaDI2NGJzZENoZWNrRnJhbWVOdW0oCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgdTMyIG1heEZyYW1lTnVtLAotICB1MzIgKmZyYW1lTnVtKTsKLQotdTMyIGgyNjRic2RDaGVja0lkclBpY0lkKAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHUzMiBtYXhGcmFtZU51bSwKLSAgbmFsVW5pdFR5cGVfZSBuYWxVbml0VHlwZSwKLSAgdTMyICppZHJQaWNJZCk7Ci0KLXUzMiBoMjY0YnNkQ2hlY2tQaWNPcmRlckNudExzYigKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZXFQYXJhbVNldF90ICpwU2VxUGFyYW1TZXQsCi0gIG5hbFVuaXRUeXBlX2UgbmFsVW5pdFR5cGUsCi0gIHUzMiAqcGljT3JkZXJDbnRMc2IpOwotCi11MzIgaDI2NGJzZENoZWNrRGVsdGFQaWNPcmRlckNudEJvdHRvbSgKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZXFQYXJhbVNldF90ICpwU2VxUGFyYW1TZXQsCi0gIG5hbFVuaXRUeXBlX2UgbmFsVW5pdFR5cGUsCi0gIGkzMiAqZGVsdGFQaWNPcmRlckNudEJvdHRvbSk7Ci0KLXUzMiBoMjY0YnNkQ2hlY2tEZWx0YVBpY09yZGVyQ250KAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHNlcVBhcmFtU2V0X3QgKnBTZXFQYXJhbVNldCwKLSAgbmFsVW5pdFR5cGVfZSBuYWxVbml0VHlwZSwKLSAgdTMyIHBpY09yZGVyUHJlc2VudEZsYWcsCi0gIGkzMiAqZGVsdGFQaWNPcmRlckNudCk7Ci0KLXUzMiBoMjY0YnNkQ2hlY2tSZWR1bmRhbnRQaWNDbnQoCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VxUGFyYW1TZXRfdCAqcFNlcVBhcmFtU2V0LAotICBwaWNQYXJhbVNldF90ICpwUGljUGFyYW1TZXQsCi0gIG5hbFVuaXRUeXBlX2UgbmFsVW5pdFR5cGUsCi0gIHUzMiAqcmVkdW5kYW50UGljQ250KTsKLQotdTMyIGgyNjRic2RDaGVja1ByaW9yUGljc0ZsYWcodTMyICogbm9PdXRwdXRPZlByaW9yUGljc0ZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJtRGF0YV90ICogcFN0cm1EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VxUGFyYW1TZXRfdCAqIHBTZXFQYXJhbVNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBpY1BhcmFtU2V0X3QgKiBwUGljUGFyYW1TZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYWxVbml0VHlwZV9lIG5hbFVuaXRUeXBlKTsKLQotI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfU0xJQ0VfSEVBREVSX0ggKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3N0b3JhZ2UuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zdG9yYWdlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmN2E0MmEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3N0b3JhZ2UuYworKysgL2Rldi9udWxsCkBAIC0xLDkwNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0gICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0gICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLSAgICAgNS4gRnVuY3Rpb25zCi0gICAgICAgICAgaDI2NGJzZEluaXRTdG9yYWdlCi0gICAgICAgICAgaDI2NGJzZFN0b3JlU2VxUGFyYW1TZXQKLSAgICAgICAgICBoMjY0YnNkU3RvcmVQaWNQYXJhbVNldAotICAgICAgICAgIGgyNjRic2RBY3RpdmF0ZVBhcmFtU2V0cwotICAgICAgICAgIGgyNjRic2RSZXNldFN0b3JhZ2UKLSAgICAgICAgICBoMjY0YnNkSXNTdGFydE9mUGljdHVyZQotICAgICAgICAgIGgyNjRic2RJc0VuZE9mUGljdHVyZQotICAgICAgICAgIGgyNjRic2RDb21wdXRlU2xpY2VHcm91cE1hcAotICAgICAgICAgIGgyNjRic2RDaGVja0FjY2Vzc1VuaXRCb3VuZGFyeQotICAgICAgICAgIENoZWNrUHBzCi0gICAgICAgICAgaDI2NGJzZFZhbGlkUGFyYW1TZXRzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiaDI2NGJzZF9zdG9yYWdlLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9uZWlnaGJvdXIuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3NsaWNlX2dyb3VwX21hcC5oIgotI2luY2x1ZGUgImgyNjRic2RfZHBiLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9uYWxfdW5pdC5oIgotI2luY2x1ZGUgImgyNjRic2Rfc2xpY2VfaGVhZGVyLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9zZXFfcGFyYW1fc2V0LmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgVUlOVDMyX01BWAotI2RlZmluZSBVSU5UMzJfTUFYICAgICAgICg0Mjk0OTY3Mjk1VSkKLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1MzIgQ2hlY2tQcHMocGljUGFyYW1TZXRfdCAqcHBzLCBzZXFQYXJhbVNldF90ICpzcHMpOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb24gbmFtZTogaDI2NGJzZEluaXRTdG9yYWdlCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEluaXRpYWxpemUgc3RvcmFnZSBzdHJ1Y3R1cmUuIFNldHMgY29udGVudHMgb2YgdGhlIHN0b3JhZ2UgdG8gJzAnCi0gICAgICAgICAgICBleGNlcHQgZm9yIHRoZSBhY3RpdmUgcGFyYW1ldGVyIHNldCBpZHMsIHdoaWNoIGFyZSBpbml0aWFsaXplZAotICAgICAgICAgICAgdG8gaW52YWxpZCB2YWx1ZXMuCi0KLSAgICAgICAgSW5wdXRzOgotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBwU3RvcmFnZSAgICBpbml0aWFsaXplZCBkYXRhIHN0b3JlZCBoZXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIG5vbmUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBoMjY0YnNkSW5pdFN0b3JhZ2Uoc3RvcmFnZV90ICpwU3RvcmFnZSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RvcmFnZSk7Ci0KLSAgICBIMjY0U3dEZWNNZW1zZXQocFN0b3JhZ2UsIDAsIHNpemVvZihzdG9yYWdlX3QpKTsKLQotICAgIHBTdG9yYWdlLT5hY3RpdmVTcHNJZCA9IE1BWF9OVU1fU0VRX1BBUkFNX1NFVFM7Ci0gICAgcFN0b3JhZ2UtPmFjdGl2ZVBwc0lkID0gTUFYX05VTV9QSUNfUEFSQU1fU0VUUzsKLQotICAgIHBTdG9yYWdlLT5hdWItPmZpcnN0Q2FsbEZsYWcgPSBIQU5UUk9fVFJVRTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkU3RvcmVTZXFQYXJhbVNldAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBTdG9yZSBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0IGludG8gdGhlIHN0b3JhZ2UuIElmIGFjdGl2ZSBTUFMgaXMKLSAgICAgICAgICAgIG92ZXJ3cml0dGVuIC0+IGNoZWNrIGlmIGNvbnRlbnRzIGNoYW5nZXMgYW5kIGlmIGl0IGRvZXMsIHNldAotICAgICAgICAgICAgcGFyYW1ldGVycyB0byBmb3JjZSByZWFjdGl2YXRpb24gb2YgcGFyYW1ldGVyIHNldHMKLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwU3RvcmFnZSAgICAgICAgcG9pbnRlciB0byBzdG9yYWdlIHN0cnVjdHVyZQotICAgICAgICAgICAgcFNlcVBhcmFtU2V0ICAgIHBvaW50ZXIgdG8gcGFyYW0gc2V0IHRvIGJlIHN0b3JlZAotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBub25lCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEhBTlRST19PSyAgICAgICAgICAgICAgICBzdWNjZXNzCi0gICAgICAgICAgICBNRU1PUllfQUxMT0NBVElPTl9FUlJPUiAgZmFpbHVyZSBpbiBtZW1vcnkgYWxsb2NhdGlvbgotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkU3RvcmVTZXFQYXJhbVNldChzdG9yYWdlX3QgKnBTdG9yYWdlLCBzZXFQYXJhbVNldF90ICpwU2VxUGFyYW1TZXQpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGlkOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0b3JhZ2UpOwotICAgIEFTU0VSVChwU2VxUGFyYW1TZXQpOwotICAgIEFTU0VSVChwU2VxUGFyYW1TZXQtPnNlcVBhcmFtZXRlclNldElkIDwgTUFYX05VTV9TRVFfUEFSQU1fU0VUUyk7Ci0KLSAgICBpZCA9IHBTZXFQYXJhbVNldC0+c2VxUGFyYW1ldGVyU2V0SWQ7Ci0KLSAgICAvKiBzZXEgcGFyYW1ldGVyIHNldCB3aXRoIGlkIG5vdCB1c2VkIGJlZm9yZSAtPiBhbGxvY2F0ZSBtZW1vcnkgKi8KLSAgICBpZiAocFN0b3JhZ2UtPnNwc1tpZF0gPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIEFMTE9DQVRFKHBTdG9yYWdlLT5zcHNbaWRdLCAxLCBzZXFQYXJhbVNldF90KTsKLSAgICAgICAgaWYgKHBTdG9yYWdlLT5zcHNbaWRdID09IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4oTUVNT1JZX0FMTE9DQVRJT05fRVJST1IpOwotICAgIH0KLSAgICAvKiBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0IHdpdGggaWQgZXF1YWwgdG8gaWQgb2YgYWN0aXZlIHNwcyAqLwotICAgIGVsc2UgaWYgKGlkID09IHBTdG9yYWdlLT5hY3RpdmVTcHNJZCkKLSAgICB7Ci0gICAgICAgIC8qIGlmIHNlcSBwYXJhbWV0ZXIgc2V0IGNvbnRlbnRzIGNoYW5nZXMKLSAgICAgICAgICogICAgLT4gb3ZlcndyaXRlIGFuZCByZS1hY3RpdmF0ZSB3aGVuIG5leHQgSURSIHBpY3R1cmUgZGVjb2RlZAotICAgICAgICAgKiAgICBpZHMgb2YgYWN0aXZlIHBhcmFtIHNldHMgc2V0IHRvIGludmFsaWQgdmFsdWVzIHRvIGZvcmNlCi0gICAgICAgICAqICAgIHJlLWFjdGl2YXRpb24uIE1lbW9yaWVzIGFsbG9jYXRlZCBmb3Igb2xkIHNwcyBmcmVlZAotICAgICAgICAgKiBvdGhlcndpc2UgZnJlZSBtZW1lcmllcyBhbGxvY2F0ZWQgZm9yIGp1c3QgZGVjb2RlZCBzcHMgYW5kCi0gICAgICAgICAqIGNvbnRpbnVlICovCi0gICAgICAgIGlmIChoMjY0YnNkQ29tcGFyZVNlcVBhcmFtU2V0cyhwU2VxUGFyYW1TZXQsIHBTdG9yYWdlLT5hY3RpdmVTcHMpICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZSRUUocFN0b3JhZ2UtPnNwc1tpZF0tPm9mZnNldEZvclJlZkZyYW1lKTsKLSAgICAgICAgICAgIEZSRUUocFN0b3JhZ2UtPnNwc1tpZF0tPnZ1aVBhcmFtZXRlcnMpOwotICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwc0lkID0gTUFYX05VTV9TRVFfUEFSQU1fU0VUUyArIDE7Ci0gICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlUHBzSWQgPSBNQVhfTlVNX1BJQ19QQVJBTV9TRVRTICsgMTsKLSAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMgPSBOVUxMOwotICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVBwcyA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBGUkVFKHBTZXFQYXJhbVNldC0+b2Zmc2V0Rm9yUmVmRnJhbWUpOwotICAgICAgICAgICAgRlJFRShwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnMpOwotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyogb3ZlcndyaXRlIHNlcSBwYXJhbSBzZXQgb3RoZXIgdGhhbiBhY3RpdmUgb25lIC0+IGZyZWUgbWVtb3JpZXMKLSAgICAgKiBhbGxvY2F0ZWQgZm9yIG9sZCBwYXJhbSBzZXQgKi8KLSAgICBlbHNlCi0gICAgewotICAgICAgICBGUkVFKHBTdG9yYWdlLT5zcHNbaWRdLT5vZmZzZXRGb3JSZWZGcmFtZSk7Ci0gICAgICAgIEZSRUUocFN0b3JhZ2UtPnNwc1tpZF0tPnZ1aVBhcmFtZXRlcnMpOwotICAgIH0KLQotICAgICpwU3RvcmFnZS0+c3BzW2lkXSA9ICpwU2VxUGFyYW1TZXQ7Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RTdG9yZVBpY1BhcmFtU2V0Ci0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIFN0b3JlIHBpY3R1cmUgcGFyYW1ldGVyIHNldCBpbnRvIHRoZSBzdG9yYWdlLiBJZiBhY3RpdmUgUFBTIGlzCi0gICAgICAgICAgICBvdmVyd3JpdHRlbiAtPiBjaGVjayBpZiBhY3RpdmUgU1BTIGNoYW5nZXMgYW5kIGlmIGl0IGRvZXMgLT4gc2V0Ci0gICAgICAgICAgICBwYXJhbWV0ZXJzIHRvIGZvcmNlIHJlYWN0aXZhdGlvbiBvZiBwYXJhbWV0ZXIgc2V0cwotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdG9yYWdlICAgICAgICBwb2ludGVyIHRvIHN0b3JhZ2Ugc3RydWN0dXJlCi0gICAgICAgICAgICBwUGljUGFyYW1TZXQgICAgcG9pbnRlciB0byBwYXJhbSBzZXQgdG8gYmUgc3RvcmVkCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIG5vbmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSEFOVFJPX09LICAgICAgICAgICAgICAgIHN1Y2Nlc3MKLSAgICAgICAgICAgIE1FTU9SWV9BTExPQ0FUSU9OX0VSUk9SICBmYWlsdXJlIGluIG1lbW9yeSBhbGxvY2F0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkU3RvcmVQaWNQYXJhbVNldChzdG9yYWdlX3QgKnBTdG9yYWdlLCBwaWNQYXJhbVNldF90ICpwUGljUGFyYW1TZXQpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGlkOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0b3JhZ2UpOwotICAgIEFTU0VSVChwUGljUGFyYW1TZXQpOwotICAgIEFTU0VSVChwUGljUGFyYW1TZXQtPnBpY1BhcmFtZXRlclNldElkIDwgTUFYX05VTV9QSUNfUEFSQU1fU0VUUyk7Ci0gICAgQVNTRVJUKHBQaWNQYXJhbVNldC0+c2VxUGFyYW1ldGVyU2V0SWQgPCBNQVhfTlVNX1NFUV9QQVJBTV9TRVRTKTsKLQotICAgIGlkID0gcFBpY1BhcmFtU2V0LT5waWNQYXJhbWV0ZXJTZXRJZDsKLQotICAgIC8qIHBpYyBwYXJhbWV0ZXIgc2V0IHdpdGggaWQgbm90IHVzZWQgYmVmb3JlIC0+IGFsbG9jYXRlIG1lbW9yeSAqLwotICAgIGlmIChwU3RvcmFnZS0+cHBzW2lkXSA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgQUxMT0NBVEUocFN0b3JhZ2UtPnBwc1tpZF0sIDEsIHBpY1BhcmFtU2V0X3QpOwotICAgICAgICBpZiAocFN0b3JhZ2UtPnBwc1tpZF0gPT0gTlVMTCkKLSAgICAgICAgICAgIHJldHVybihNRU1PUllfQUxMT0NBVElPTl9FUlJPUik7Ci0gICAgfQotICAgIC8qIHBpY3R1cmUgcGFyYW1ldGVyIHNldCB3aXRoIGlkIGVxdWFsIHRvIGlkIG9mIGFjdGl2ZSBwcHMgKi8KLSAgICBlbHNlIGlmIChpZCA9PSBwU3RvcmFnZS0+YWN0aXZlUHBzSWQpCi0gICAgewotICAgICAgICAvKiBjaGVjayB3aGV0aGVyIHNlcSBwYXJhbSBzZXQgY2hhbmdlcywgZm9yY2UgcmUtYWN0aXZhdGlvbiBvZgotICAgICAgICAgKiBwYXJhbSBzZXQgaWYgaXQgZG9lcy4gU2V0IGFjdGl2ZVNwc0lkIHRvIGludmFsaWQgdmFsdWUgdG8KLSAgICAgICAgICogYWNjb21wbGlzaCB0aGlzICovCi0gICAgICAgIGlmIChwUGljUGFyYW1TZXQtPnNlcVBhcmFtZXRlclNldElkICE9IHBTdG9yYWdlLT5hY3RpdmVTcHNJZCkKLSAgICAgICAgewotICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVBwc0lkID0gTUFYX05VTV9QSUNfUEFSQU1fU0VUUyArIDE7Ci0gICAgICAgIH0KLSAgICAgICAgLyogZnJlZSBtZW1vcmllcyBhbGxvY2F0ZWQgZm9yIG9sZCBwYXJhbSBzZXQgKi8KLSAgICAgICAgRlJFRShwU3RvcmFnZS0+cHBzW2lkXS0+cnVuTGVuZ3RoKTsKLSAgICAgICAgRlJFRShwU3RvcmFnZS0+cHBzW2lkXS0+dG9wTGVmdCk7Ci0gICAgICAgIEZSRUUocFN0b3JhZ2UtPnBwc1tpZF0tPmJvdHRvbVJpZ2h0KTsKLSAgICAgICAgRlJFRShwU3RvcmFnZS0+cHBzW2lkXS0+c2xpY2VHcm91cElkKTsKLSAgICB9Ci0gICAgLyogb3ZlcndyaXRlIHBpYyBwYXJhbSBzZXQgb3RoZXIgdGhhbiBhY3RpdmUgb25lIC0+IGZyZWUgbWVtb3JpZXMKLSAgICAgKiBhbGxvY2F0ZWQgZm9yIG9sZCBwYXJhbSBzZXQgKi8KLSAgICBlbHNlCi0gICAgewotICAgICAgICBGUkVFKHBTdG9yYWdlLT5wcHNbaWRdLT5ydW5MZW5ndGgpOwotICAgICAgICBGUkVFKHBTdG9yYWdlLT5wcHNbaWRdLT50b3BMZWZ0KTsKLSAgICAgICAgRlJFRShwU3RvcmFnZS0+cHBzW2lkXS0+Ym90dG9tUmlnaHQpOwotICAgICAgICBGUkVFKHBTdG9yYWdlLT5wcHNbaWRdLT5zbGljZUdyb3VwSWQpOwotICAgIH0KLQotICAgICpwU3RvcmFnZS0+cHBzW2lkXSA9ICpwUGljUGFyYW1TZXQ7Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RBY3RpdmF0ZVBhcmFtU2V0cwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBBY3RpdmF0ZSBjZXJ0YWluIFNQUy9QUFMgY29tYmluYXRpb24uIFRoaXMgZnVuY3Rpb24gc2hhbGwgYmUKLSAgICAgICAgICAgIGNhbGxlZCBpbiB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggcGljdHVyZS4gUGljdHVyZSBwYXJhbWV0ZXIgc2V0Ci0gICAgICAgICAgICBjYW4gYmUgY2hhbmdlZCBhcyB3YW50ZWQsIGJ1dCBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0IG1heSBvbmx5IGJlCi0gICAgICAgICAgICBjaGFuZ2VkIHdoZW4gdGhlIHN0YXJ0aW5nIHBpY3R1cmUgaXMgYW4gSURSIHBpY3R1cmUuCi0KLSAgICAgICAgICAgIFdoZW4gbmV3IFNQUyBpcyBhY3RpdmF0ZWQgdGhlIGZ1bmN0aW9uIGFsbG9jYXRlcyBtZW1vcnkgZm9yCi0gICAgICAgICAgICBtYWNyb2Jsb2NrIHN0b3JhZ2VzIGFuZCBzbGljZSBncm91cCBtYXAgYW5kIChyZS0paW5pdGlhbGl6ZXMgdGhlCi0gICAgICAgICAgICBkZWNvZGVkIHBpY3R1cmUgYnVmZmVyLiBJZiB0aGlzIGlzIG5vdCB0aGUgZmlyc3QgYWN0aXZhdGlvbiB0aGUgb2xkCi0gICAgICAgICAgICBhbGxvY2F0aW9ucyBhcmUgZnJlZWQgYW5kIEZyZWVEcGIgY2FsbGVkIGJlZm9yZSBuZXcgYWxsb2NhdGlvbnMuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFN0b3JhZ2UgICAgICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBkYXRhIHN0cnVjdHVyZQotICAgICAgICAgICAgcHBzSWQgICAgICAgICAgIGlkZW50aWZpZXMgdGhlIFBQUyB0byBiZSBhY3RpdmF0ZWQsIFNQUyBpZCBvYnRhaW5lZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gdGhlIFBQUwotICAgICAgICAgICAgaXNJZHIgICAgICAgICAgIGZsYWcgdG8gaW5kaWNhdGUgaWYgdGhlIHBpY3R1cmUgaXMgYW4gSURSIHBpY3R1cmUKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgbm9uZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcwotICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIG5vbi1leGlzdGluZyBvciBpbnZhbGlkIHBhcmFtIHNldCBjb21iaW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnlpbmcgdG8gY2hhbmdlIFNQUyB3aXRoIG5vbi1JRFIgcGljdHVyZQotICAgICAgICAgICAgTUVNT1JZX0FMTE9DQVRJT05fRVJST1IgICAgIGZhaWx1cmUgaW4gbWVtb3J5IGFsbG9jYXRpb24KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2RBY3RpdmF0ZVBhcmFtU2V0cyhzdG9yYWdlX3QgKnBTdG9yYWdlLCB1MzIgcHBzSWQsIHUzMiBpc0lkcikKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wOwotICAgIHUzMiBmbGFnOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0b3JhZ2UpOwotICAgIEFTU0VSVChwcHNJZCA8IE1BWF9OVU1fUElDX1BBUkFNX1NFVFMpOwotCi0gICAgLyogY2hlY2sgdGhhdCBwcHMgYW5kIGNvcnJlc3BvbmRpbmcgc3BzIGV4aXN0ICovCi0gICAgaWYgKCAocFN0b3JhZ2UtPnBwc1twcHNJZF0gPT0gTlVMTCkgfHwKLSAgICAgICAgIChwU3RvcmFnZS0+c3BzW3BTdG9yYWdlLT5wcHNbcHBzSWRdLT5zZXFQYXJhbWV0ZXJTZXRJZF0gPT0gTlVMTCkgKQotICAgIHsKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIH0KLQotICAgIC8qIGNoZWNrIHRoYXQgcHBzIHBhcmFtZXRlcnMgZG8gbm90IHZpb2xhdGUgcGljdHVyZSBzaXplIGNvbnN0cmFpbnRzICovCi0gICAgdG1wID0gQ2hlY2tQcHMocFN0b3JhZ2UtPnBwc1twcHNJZF0sCi0gICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPnNwc1twU3RvcmFnZS0+cHBzW3Bwc0lkXS0+c2VxUGFyYW1ldGVyU2V0SWRdKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICAvKiBmaXJzdCBhY3RpdmF0aW9uIHBhcnQxICovCi0gICAgaWYgKHBTdG9yYWdlLT5hY3RpdmVQcHNJZCA9PSBNQVhfTlVNX1BJQ19QQVJBTV9TRVRTKQotICAgIHsKLSAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVBwc0lkID0gcHBzSWQ7Ci0gICAgICAgIHBTdG9yYWdlLT5hY3RpdmVQcHMgPSBwU3RvcmFnZS0+cHBzW3Bwc0lkXTsKLSAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwc0lkID0gcFN0b3JhZ2UtPmFjdGl2ZVBwcy0+c2VxUGFyYW1ldGVyU2V0SWQ7Ci0gICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMgPSBwU3RvcmFnZS0+c3BzW3BTdG9yYWdlLT5hY3RpdmVTcHNJZF07Ci0KLSAgICAgICAgLyogcmVwb3J0IGVycm9yIGJlZm9yZSBtdWx0aXBsaWNhdGlvbiB0byBwcmV2ZW50IGludGVnZXIgb3ZlcmZsb3cgKi8KLSAgICAgICAgaWYgKHBTdG9yYWdlLT5hY3RpdmVTcHMtPnBpY1dpZHRoSW5NYnMgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgcFN0b3JhZ2UtPnBpY1NpemVJbk1icyA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocFN0b3JhZ2UtPmFjdGl2ZVNwcy0+cGljSGVpZ2h0SW5NYnMgPgotICAgICAgICAgICAgICAgICBVSU5UMzJfTUFYIC8gcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+cGljV2lkdGhJbk1icykKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuKE1FTU9SWV9BTExPQ0FUSU9OX0VSUk9SKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBTdG9yYWdlLT5waWNTaXplSW5NYnMgPQotICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnBpY1dpZHRoSW5NYnMgKgotICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnBpY0hlaWdodEluTWJzOwotICAgICAgICB9Ci0KLSAgICAgICAgcFN0b3JhZ2UtPmN1cnJJbWFnZS0+d2lkdGggPSBwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNXaWR0aEluTWJzOwotICAgICAgICBwU3RvcmFnZS0+Y3VyckltYWdlLT5oZWlnaHQgPSBwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNIZWlnaHRJbk1iczsKLQotICAgICAgICBwU3RvcmFnZS0+cGVuZGluZ0FjdGl2YXRpb24gPSBIQU5UUk9fVFJVRTsKLSAgICB9Ci0gICAgLyogZmlyc3QgYWN0aXZhdGlvbiBwYXJ0MiAqLwotICAgIGVsc2UgaWYgKHBTdG9yYWdlLT5wZW5kaW5nQWN0aXZhdGlvbikKLSAgICB7Ci0gICAgICAgIHBTdG9yYWdlLT5wZW5kaW5nQWN0aXZhdGlvbiA9IEhBTlRST19GQUxTRTsKLQotICAgICAgICBGUkVFKHBTdG9yYWdlLT5tYik7Ci0gICAgICAgIEZSRUUocFN0b3JhZ2UtPnNsaWNlR3JvdXBNYXApOwotCi0gICAgICAgIEFMTE9DQVRFKHBTdG9yYWdlLT5tYiwgcFN0b3JhZ2UtPnBpY1NpemVJbk1icywgbWJTdG9yYWdlX3QpOwotICAgICAgICBBTExPQ0FURShwU3RvcmFnZS0+c2xpY2VHcm91cE1hcCwgcFN0b3JhZ2UtPnBpY1NpemVJbk1icywgdTMyKTsKLSAgICAgICAgaWYgKHBTdG9yYWdlLT5tYiA9PSBOVUxMIHx8IHBTdG9yYWdlLT5zbGljZUdyb3VwTWFwID09IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4oTUVNT1JZX0FMTE9DQVRJT05fRVJST1IpOwotCi0gICAgICAgIEgyNjRTd0RlY01lbXNldChwU3RvcmFnZS0+bWIsIDAsCi0gICAgICAgICAgICBwU3RvcmFnZS0+cGljU2l6ZUluTWJzICogc2l6ZW9mKG1iU3RvcmFnZV90KSk7Ci0KLSAgICAgICAgaDI2NGJzZEluaXRNYk5laWdoYm91cnMocFN0b3JhZ2UtPm1iLAotICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+cGljV2lkdGhJbk1icywKLSAgICAgICAgICAgIHBTdG9yYWdlLT5waWNTaXplSW5NYnMpOwotCi0gICAgICAgIC8qIGRwYiBvdXRwdXQgcmVvcmRlcmluZyBkaXNhYmxlZCBpZgotICAgICAgICAgKiAxKSBhcHBsaWNhdGlvbiBzZXQgbm9SZW9yZGVyaW5nIGZsYWcKLSAgICAgICAgICogMikgUE9DIHR5cGUgZXF1YWwgdG8gMgotICAgICAgICAgKiAzKSBudW1fcmVvcmRlcl9mcmFtZXMgaW4gdnVpIGVxdWFsIHRvIDAgKi8KLSAgICAgICAgaWYgKCBwU3RvcmFnZS0+bm9SZW9yZGVyaW5nIHx8Ci0gICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+cGljT3JkZXJDbnRUeXBlID09IDIgfHwKLSAgICAgICAgICAgICAocFN0b3JhZ2UtPmFjdGl2ZVNwcy0+dnVpUGFyYW1ldGVyc1ByZXNlbnRGbGFnICYmCi0gICAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnZ1aVBhcmFtZXRlcnMtPmJpdHN0cmVhbVJlc3RyaWN0aW9uRmxhZyAmJgotICAgICAgICAgICAgICAhcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+dnVpUGFyYW1ldGVycy0+bnVtUmVvcmRlckZyYW1lcykgKQotICAgICAgICAgICAgZmxhZyA9IEhBTlRST19UUlVFOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBmbGFnID0gSEFOVFJPX0ZBTFNFOwotCi0gICAgICAgIHRtcCA9IGgyNjRic2RSZXNldERwYihwU3RvcmFnZS0+ZHBiLAotICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+cGljV2lkdGhJbk1icyAqCi0gICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNIZWlnaHRJbk1icywKLSAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPm1heERwYlNpemUsCi0gICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT5udW1SZWZGcmFtZXMsCi0gICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT5tYXhGcmFtZU51bSwKLSAgICAgICAgICAgIGZsYWcpOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotICAgIH0KLSAgICBlbHNlIGlmIChwcHNJZCAhPSBwU3RvcmFnZS0+YWN0aXZlUHBzSWQpCi0gICAgewotICAgICAgICAvKiBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0IHNoYWxsIG5vdCBjaGFuZ2UgYnV0IGJlZm9yZSBhbiBJRFIgcGljdHVyZSAqLwotICAgICAgICBpZiAocFN0b3JhZ2UtPnBwc1twcHNJZF0tPnNlcVBhcmFtZXRlclNldElkICE9IHBTdG9yYWdlLT5hY3RpdmVTcHNJZCkKLSAgICAgICAgewotICAgICAgICAgICAgREVCVUcoKCJTRVEgUEFSQU0gU0VUIENIQU5HSU5HLi4uXG4iKSk7Ci0gICAgICAgICAgICBpZiAoaXNJZHIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVBwc0lkID0gcHBzSWQ7Ci0gICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVBwcyA9IHBTdG9yYWdlLT5wcHNbcHBzSWRdOwotICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHNJZCA9IHBTdG9yYWdlLT5hY3RpdmVQcHMtPnNlcVBhcmFtZXRlclNldElkOwotICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMgPSBwU3RvcmFnZS0+c3BzW3BTdG9yYWdlLT5hY3RpdmVTcHNJZF07Ci0gICAgICAgICAgICAgICAgcFN0b3JhZ2UtPnBpY1NpemVJbk1icyA9Ci0gICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnBpY1dpZHRoSW5NYnMgKgotICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNIZWlnaHRJbk1iczsKLQotICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5jdXJySW1hZ2UtPndpZHRoID0gcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+cGljV2lkdGhJbk1iczsKLSAgICAgICAgICAgICAgICBwU3RvcmFnZS0+Y3VyckltYWdlLT5oZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNIZWlnaHRJbk1iczsKLQotICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5wZW5kaW5nQWN0aXZhdGlvbiA9IEhBTlRST19UUlVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIERFQlVHKCgiVFJZSU5HIFRPIENIQU5HRSBTUFMgSU4gTk9OLUlEUiBTTElDRVxuIikpOwotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVQcHNJZCA9IHBwc0lkOwotICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVBwcyA9IHBTdG9yYWdlLT5wcHNbcHBzSWRdOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkUmVzZXRTdG9yYWdlCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIFJlc2V0IGNvbnRlbnRzIG9mIHRoZSBzdG9yYWdlLiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlCi0gICAgICAgICAgICBwcm9jZXNzaW5nIG9mIG5ldyBpbWFnZSBpcyBzdGFydGVkLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdG9yYWdlICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBzdHJ1Y3R1cmUKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgbm9uZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBub25lCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBoMjY0YnNkUmVzZXRTdG9yYWdlKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGk7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RvcmFnZSk7Ci0KLSAgICBwU3RvcmFnZS0+c2xpY2UtPm51bURlY29kZWRNYnMgPSAwOwotICAgIHBTdG9yYWdlLT5zbGljZS0+c2xpY2VJZCA9IDA7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgcFN0b3JhZ2UtPnBpY1NpemVJbk1iczsgaSsrKQotICAgIHsKLSAgICAgICAgcFN0b3JhZ2UtPm1iW2ldLnNsaWNlSWQgPSAwOwotICAgICAgICBwU3RvcmFnZS0+bWJbaV0uZGVjb2RlZCA9IDA7Ci0gICAgfQotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZElzU3RhcnRPZlBpY3R1cmUKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRGV0ZXJtaW5lIGlmIHRoZSBkZWNvZGVyIGlzIGluIHRoZSBzdGFydCBvZiBhIHBpY3R1cmUuIFRoaXMKLSAgICAgICAgICAgIGluZm9ybWF0aW9uIGlzIG5lZWRlZCB0byBkZWNpZGUgaWYgaDI2NGJzZEFjdGl2YXRlUGFyYW1TZXRzIGFuZAotICAgICAgICAgICAgaDI2NGJzZENoZWNrR2Fwc0luRnJhbWVOdW0gZnVuY3Rpb25zIHNob3VsZCBiZSBjYWxsZWQuIEZ1bmN0aW9uCi0gICAgICAgICAgICBjb25zaWRlcnMgdGhhdCBuZXcgcGljdHVyZSBpcyBzdGFydGluZyBpZiBubyBzbGljZSBoZWFkZXJzCi0gICAgICAgICAgICBoYXZlIGJlZW4gc3VjY2Vzc2Z1bGx5IGRlY29kZWQgZm9yIHRoZSBjdXJyZW50IGFjY2VzcyB1bml0LgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdG9yYWdlICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBzdHJ1Y3R1cmUKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgbm9uZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIQU5UUk9fVFJVRSAgICAgICAgbmV3IHBpY3R1cmUgaXMgc3RhcnRpbmcKLSAgICAgICAgICAgIEhBTlRST19GQUxTRSAgICAgICBub3Qgc3RhcnRpbmcKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2RJc1N0YXJ0T2ZQaWN0dXJlKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0KLS8qIENvZGUgKi8KLQotICAgIGlmIChwU3RvcmFnZS0+dmFsaWRTbGljZUluQWNjZXNzVW5pdCA9PSBIQU5UUk9fRkFMU0UpCi0gICAgICAgIHJldHVybihIQU5UUk9fVFJVRSk7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4oSEFOVFJPX0ZBTFNFKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RJc0VuZE9mUGljdHVyZQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBEZXRlcm1pbmUgaWYgdGhlIGRlY29kZXIgaXMgaW4gdGhlIGVuZCBvZiBhIHBpY3R1cmUuIFRoaXMKLSAgICAgICAgICAgIGluZm9ybWF0aW9uIGlzIG5lZWRlZCB0byBkZXRlcm1pbmUgd2hlbiBkZWJsb2NraW5nIGZpbHRlcmluZwotICAgICAgICAgICAgYW5kIHJlZmVyZW5jZSBwaWN0dXJlIG1hcmtpbmcgcHJvY2Vzc2VzIHNob3VsZCBiZSBwZXJmb3JtZWQuCi0KLSAgICAgICAgICAgIElmIHRoZSBkZWNvZGVyIGlzIHByb2Nlc3NpbmcgcHJpbWFyeSBzbGljZXMgdGhlIHJldHVybiB2YWx1ZQotICAgICAgICAgICAgaXMgZGV0ZXJtaW5lZCBieSBjaGVja2luZyB0aGUgdmFsdWUgb2YgbnVtRGVjb2RlZE1icyBpbiB0aGUKLSAgICAgICAgICAgIHN0b3JhZ2UuIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB0aGUgZGVjb2RlciBpcyBwcm9jZXNzaW5nCi0gICAgICAgICAgICByZWR1bmRhbnQgc2xpY2VzIHRoZSBudW1EZWNvZGVkTWJzIG1heSBub3QgY29udGFpbiB2YWxpZAotICAgICAgICAgICAgaW5mb3JtYXRpb25hIGFuZCBlYWNoIG1hY3JvYmxvY2sgaGFzIHRvIGJlIGNoZWNrZWQgc2VwYXJhdGVseS4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwU3RvcmFnZSAgICBwb2ludGVyIHRvIHN0b3JhZ2Ugc3RydWN0dXJlCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIG5vbmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSEFOVFJPX1RSVUUgICAgICAgIGVuZCBvZiBwaWN0dXJlCi0gICAgICAgICAgICBIQU5UUk9fRkFMU0UgICAgICAgbm91cAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZElzRW5kT2ZQaWN0dXJlKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGksIHRtcDsKLQotLyogQ29kZSAqLwotCi0gICAgLyogcHJpbWFyeSBwaWN0dXJlICovCi0gICAgaWYgKCFwU3RvcmFnZS0+c2xpY2VIZWFkZXJbMF0ucmVkdW5kYW50UGljQ250KQotICAgIHsKLSAgICAgICAgaWYgKHBTdG9yYWdlLT5zbGljZS0+bnVtRGVjb2RlZE1icyA9PSBwU3RvcmFnZS0+cGljU2l6ZUluTWJzKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19UUlVFKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgZm9yIChpID0gMCwgdG1wID0gMDsgaSA8IHBTdG9yYWdlLT5waWNTaXplSW5NYnM7IGkrKykKLSAgICAgICAgICAgIHRtcCArPSBwU3RvcmFnZS0+bWJbaV0uZGVjb2RlZCA/IDEgOiAwOwotCi0gICAgICAgIGlmICh0bXAgPT0gcFN0b3JhZ2UtPnBpY1NpemVJbk1icykKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fVFJVRSk7Ci0gICAgfQotCi0gICAgcmV0dXJuKEhBTlRST19GQUxTRSk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkQ29tcHV0ZVNsaWNlR3JvdXBNYXAKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgQ29tcHV0ZSBzbGljZSBncm91cCBtYXAuIEp1c3QgY2FsbCBoMjY0YnNkRGVjb2RlU2xpY2VHcm91cE1hcCB3aXRoCi0gICAgICAgICAgICBhcHByb3ByaWF0ZSBwYXJhbWV0ZXJzLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdG9yYWdlICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBzdHJ1Y3R1cmUKLSAgICAgICAgICAgIHNsaWNlR3JvdXBDaGFuZ2VDeWNsZQotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBub25lCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIG5vbmUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBoMjY0YnNkQ29tcHV0ZVNsaWNlR3JvdXBNYXAoc3RvcmFnZV90ICpwU3RvcmFnZSwgdTMyIHNsaWNlR3JvdXBDaGFuZ2VDeWNsZSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLQotLyogQ29kZSAqLwotCi0gICAgaDI2NGJzZERlY29kZVNsaWNlR3JvdXBNYXAocFN0b3JhZ2UtPnNsaWNlR3JvdXBNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlUHBzLCBzbGljZUdyb3VwQ2hhbmdlQ3ljbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNXaWR0aEluTWJzLAotICAgICAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+cGljSGVpZ2h0SW5NYnMpOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZENoZWNrQWNjZXNzVW5pdEJvdW5kYXJ5Ci0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIENoZWNrIGlmIG5leHQgTkFMIHVuaXQgc3RhcnRzIGEgbmV3IGFjY2VzcyB1bml0LiBGb2xsb3dpbmcKLSAgICAgICAgICAgIGNvbmRpdGlvbnMgc3BlY2lmeSBzdGFydCBvZiBhIG5ldyBhY2Nlc3MgdW5pdDoKLQotICAgICAgICAgICAgICAgIC1OQUwgdW5pdCB0eXBlcyA2LTExLCAxMy0xOCAoZS5nLiBTUFMsIFBQUykKLQotICAgICAgICAgICBmb2xsb3dpbmcgY29uZGl0aW9ucyBjaGVja2VkIG9ubHkgZm9yIHNsaWNlIE5BTCB1bml0cywgdmFsdWVzCi0gICAgICAgICAgIGNvbXBhcmVkIHRvIG9uZXMgb2J0YWluZWQgZnJvbSBwcmV2aW91cyBzbGljZToKLQotICAgICAgICAgICAgICAgIC1OQUwgdW5pdCB0eXBlIGRpZmZlcnMgKHNsaWNlIC8gSURSIHNsaWNlKQotICAgICAgICAgICAgICAgIC1mcmFtZV9udW0gZGlmZmVycwotICAgICAgICAgICAgICAgIC1uYWxfcmVmX2lkYyBkaWZmZXJzIGFuZCBvbmUgb2YgdGhlIHZhbHVlcyBpcyAwCi0gICAgICAgICAgICAgICAgLVBPQyBpbmZvcm1hdGlvbiBkaWZmZXJzCi0gICAgICAgICAgICAgICAgLWJvdGggYXJlIElEUiBzbGljZXMgYW5kIGlkcl9waWNfaWQgZGlmZmVycwotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHN0cm0gICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCi0gICAgICAgICAgICBudU5leHQgICAgICBwb2ludGVyIHRvIE5BTCB1bml0IHN0cnVjdHVyZQotICAgICAgICAgICAgc3RvcmFnZSAgICAgcG9pbnRlciB0byBzdG9yYWdlIHN0cnVjdHVyZQotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBhY2Nlc3NVbml0Qm91bmRhcnlGbGFnICB0aGUgcmVzdWx0IGlzIHN0b3JlZCBoZXJlLCBUUlVFIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzIHVuaXQgYm91bmRhcnksIEZBTFNFIG90aGVyd2lzZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgICAgIHN1Y2Nlc3MKLSAgICAgICAgICAgIEhBTlRST19OT0sgICAgICAgICAgZmFpbHVyZSwgaW52YWxpZCBzdHJlYW0gZGF0YQotICAgICAgICAgICAgUEFSQU1fU0VUX0VSUk9SICAgICBpbnZhbGlkIHBhcmFtIHNldCB1c2FnZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZENoZWNrQWNjZXNzVW5pdEJvdW5kYXJ5KAotICBzdHJtRGF0YV90ICpzdHJtLAotICBuYWxVbml0X3QgKm51TmV4dCwKLSAgc3RvcmFnZV90ICpzdG9yYWdlLAotICB1MzIgKmFjY2Vzc1VuaXRCb3VuZGFyeUZsYWcpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHRtcCwgcHBzSWQsIGZyYW1lTnVtLCBpZHJQaWNJZCwgcGljT3JkZXJDbnRMc2I7Ci0gICAgaTMyIGRlbHRhUGljT3JkZXJDbnRCb3R0b20sIGRlbHRhUGljT3JkZXJDbnRbMl07Ci0gICAgc2VxUGFyYW1TZXRfdCAqc3BzOwotICAgIHBpY1BhcmFtU2V0X3QgKnBwczsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHN0cm0pOwotICAgIEFTU0VSVChudU5leHQpOwotICAgIEFTU0VSVChzdG9yYWdlKTsKLSAgICBBU1NFUlQoc3RvcmFnZS0+c3BzKTsKLSAgICBBU1NFUlQoc3RvcmFnZS0+cHBzKTsKLQotICAgIC8qIGluaXRpYWxpemUgZGVmYXVsdCBvdXRwdXQgdG8gRkFMU0UgKi8KLSAgICAqYWNjZXNzVW5pdEJvdW5kYXJ5RmxhZyA9IEhBTlRST19GQUxTRTsKLQotICAgIGlmICggKCAobnVOZXh0LT5uYWxVbml0VHlwZSA+IDUpICYmIChudU5leHQtPm5hbFVuaXRUeXBlIDwgMTIpICkgfHwKLSAgICAgICAgICggKG51TmV4dC0+bmFsVW5pdFR5cGUgPiAxMikgJiYgKG51TmV4dC0+bmFsVW5pdFR5cGUgPD0gMTgpICkgKQotICAgIHsKLSAgICAgICAgKmFjY2Vzc1VuaXRCb3VuZGFyeUZsYWcgPSBIQU5UUk9fVFJVRTsKLSAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7Ci0gICAgfQotICAgIGVsc2UgaWYgKCBudU5leHQtPm5hbFVuaXRUeXBlICE9IE5BTF9DT0RFRF9TTElDRSAmJgotICAgICAgICAgICAgICBudU5leHQtPm5hbFVuaXRUeXBlICE9IE5BTF9DT0RFRF9TTElDRV9JRFIgKQotICAgIHsKLSAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7Ci0gICAgfQotCi0gICAgLyogY2hlY2sgaWYgdGhpcyBpcyB0aGUgdmVyeSBmaXJzdCBjYWxsIHRvIHRoaXMgZnVuY3Rpb24gKi8KLSAgICBpZiAoc3RvcmFnZS0+YXViLT5maXJzdENhbGxGbGFnKQotICAgIHsKLSAgICAgICAgKmFjY2Vzc1VuaXRCb3VuZGFyeUZsYWcgPSBIQU5UUk9fVFJVRTsKLSAgICAgICAgc3RvcmFnZS0+YXViLT5maXJzdENhbGxGbGFnID0gSEFOVFJPX0ZBTFNFOwotICAgIH0KLQotICAgIC8qIGdldCBwaWN0dXJlIHBhcmFtZXRlciBzZXQgaWQgKi8KLSAgICB0bXAgPSBoMjY0YnNkQ2hlY2tQcHNJZChzdHJtLCAmcHBzSWQpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLQotICAgIC8qIHN0b3JlIHNwcyBhbmQgcHBzIGluIHNlcGFyYXRlIHBvaW50ZXJzIGp1c3QgdG8gbWFrZSBuYW1lcyBzaG9ydGVyICovCi0gICAgcHBzID0gc3RvcmFnZS0+cHBzW3Bwc0lkXTsKLSAgICBpZiAoIHBwcyA9PSBOVUxMIHx8IHN0b3JhZ2UtPnNwc1twcHMtPnNlcVBhcmFtZXRlclNldElkXSA9PSBOVUxMICB8fAotICAgICAgICAgKHN0b3JhZ2UtPmFjdGl2ZVNwc0lkICE9IE1BWF9OVU1fU0VRX1BBUkFNX1NFVFMgJiYKLSAgICAgICAgICBwcHMtPnNlcVBhcmFtZXRlclNldElkICE9IHN0b3JhZ2UtPmFjdGl2ZVNwc0lkICYmCi0gICAgICAgICAgbnVOZXh0LT5uYWxVbml0VHlwZSAhPSBOQUxfQ09ERURfU0xJQ0VfSURSKSApCi0gICAgICAgIHJldHVybihQQVJBTV9TRVRfRVJST1IpOwotICAgIHNwcyA9IHN0b3JhZ2UtPnNwc1twcHMtPnNlcVBhcmFtZXRlclNldElkXTsKLQotICAgIGlmIChzdG9yYWdlLT5hdWItPm51UHJldi0+bmFsUmVmSWRjICE9IG51TmV4dC0+bmFsUmVmSWRjICYmCi0gICAgICAoc3RvcmFnZS0+YXViLT5udVByZXYtPm5hbFJlZklkYyA9PSAwIHx8IG51TmV4dC0+bmFsUmVmSWRjID09IDApKQotICAgICAgICAqYWNjZXNzVW5pdEJvdW5kYXJ5RmxhZyA9IEhBTlRST19UUlVFOwotCi0gICAgaWYgKChzdG9yYWdlLT5hdWItPm51UHJldi0+bmFsVW5pdFR5cGUgPT0gTkFMX0NPREVEX1NMSUNFX0lEUiAmJgotICAgICAgICAgIG51TmV4dC0+bmFsVW5pdFR5cGUgIT0gTkFMX0NPREVEX1NMSUNFX0lEUikgfHwKLSAgICAgIChzdG9yYWdlLT5hdWItPm51UHJldi0+bmFsVW5pdFR5cGUgIT0gTkFMX0NPREVEX1NMSUNFX0lEUiAmJgotICAgICAgIG51TmV4dC0+bmFsVW5pdFR5cGUgPT0gTkFMX0NPREVEX1NMSUNFX0lEUikpCi0gICAgICAgICphY2Nlc3NVbml0Qm91bmRhcnlGbGFnID0gSEFOVFJPX1RSVUU7Ci0KLSAgICB0bXAgPSBoMjY0YnNkQ2hlY2tGcmFtZU51bShzdHJtLCBzcHMtPm1heEZyYW1lTnVtLCAmZnJhbWVOdW0pOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICBpZiAoc3RvcmFnZS0+YXViLT5wcmV2RnJhbWVOdW0gIT0gZnJhbWVOdW0pCi0gICAgewotICAgICAgICBzdG9yYWdlLT5hdWItPnByZXZGcmFtZU51bSA9IGZyYW1lTnVtOwotICAgICAgICAqYWNjZXNzVW5pdEJvdW5kYXJ5RmxhZyA9IEhBTlRST19UUlVFOwotICAgIH0KLQotICAgIGlmIChudU5leHQtPm5hbFVuaXRUeXBlID09IE5BTF9DT0RFRF9TTElDRV9JRFIpCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkQ2hlY2tJZHJQaWNJZChzdHJtLCBzcHMtPm1heEZyYW1lTnVtLCBudU5leHQtPm5hbFVuaXRUeXBlLAotICAgICAgICAgICZpZHJQaWNJZCk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgICAgIGlmIChzdG9yYWdlLT5hdWItPm51UHJldi0+bmFsVW5pdFR5cGUgPT0gTkFMX0NPREVEX1NMSUNFX0lEUiAmJgotICAgICAgICAgIHN0b3JhZ2UtPmF1Yi0+cHJldklkclBpY0lkICE9IGlkclBpY0lkKQotICAgICAgICAgICAgKmFjY2Vzc1VuaXRCb3VuZGFyeUZsYWcgPSBIQU5UUk9fVFJVRTsKLQotICAgICAgICBzdG9yYWdlLT5hdWItPnByZXZJZHJQaWNJZCA9IGlkclBpY0lkOwotICAgIH0KLQotICAgIGlmIChzcHMtPnBpY09yZGVyQ250VHlwZSA9PSAwKQotICAgIHsKLSAgICAgICAgdG1wID0gaDI2NGJzZENoZWNrUGljT3JkZXJDbnRMc2Ioc3RybSwgc3BzLCBudU5leHQtPm5hbFVuaXRUeXBlLAotICAgICAgICAgICZwaWNPcmRlckNudExzYik7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgICAgIGlmIChzdG9yYWdlLT5hdWItPnByZXZQaWNPcmRlckNudExzYiAhPSBwaWNPcmRlckNudExzYikKLSAgICAgICAgewotICAgICAgICAgICAgc3RvcmFnZS0+YXViLT5wcmV2UGljT3JkZXJDbnRMc2IgPSBwaWNPcmRlckNudExzYjsKLSAgICAgICAgICAgICphY2Nlc3NVbml0Qm91bmRhcnlGbGFnID0gSEFOVFJPX1RSVUU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocHBzLT5waWNPcmRlclByZXNlbnRGbGFnKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAgPSBoMjY0YnNkQ2hlY2tEZWx0YVBpY09yZGVyQ250Qm90dG9tKHN0cm0sIHNwcywKLSAgICAgICAgICAgICAgICBudU5leHQtPm5hbFVuaXRUeXBlLCAmZGVsdGFQaWNPcmRlckNudEJvdHRvbSk7Ci0gICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKLQotICAgICAgICAgICAgaWYgKHN0b3JhZ2UtPmF1Yi0+cHJldkRlbHRhUGljT3JkZXJDbnRCb3R0b20gIT0KLSAgICAgICAgICAgICAgICBkZWx0YVBpY09yZGVyQ250Qm90dG9tKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0b3JhZ2UtPmF1Yi0+cHJldkRlbHRhUGljT3JkZXJDbnRCb3R0b20gPQotICAgICAgICAgICAgICAgICAgICBkZWx0YVBpY09yZGVyQ250Qm90dG9tOwotICAgICAgICAgICAgICAgICphY2Nlc3NVbml0Qm91bmRhcnlGbGFnID0gSEFOVFJPX1RSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoc3BzLT5waWNPcmRlckNudFR5cGUgPT0gMSAmJiAhc3BzLT5kZWx0YVBpY09yZGVyQWx3YXlzWmVyb0ZsYWcpCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkQ2hlY2tEZWx0YVBpY09yZGVyQ250KHN0cm0sIHNwcywgbnVOZXh0LT5uYWxVbml0VHlwZSwKLSAgICAgICAgICBwcHMtPnBpY09yZGVyUHJlc2VudEZsYWcsIGRlbHRhUGljT3JkZXJDbnQpOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotCi0gICAgICAgIGlmIChzdG9yYWdlLT5hdWItPnByZXZEZWx0YVBpY09yZGVyQ250WzBdICE9IGRlbHRhUGljT3JkZXJDbnRbMF0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0b3JhZ2UtPmF1Yi0+cHJldkRlbHRhUGljT3JkZXJDbnRbMF0gPSBkZWx0YVBpY09yZGVyQ250WzBdOwotICAgICAgICAgICAgKmFjY2Vzc1VuaXRCb3VuZGFyeUZsYWcgPSBIQU5UUk9fVFJVRTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwcHMtPnBpY09yZGVyUHJlc2VudEZsYWcpCi0gICAgICAgICAgICBpZiAoc3RvcmFnZS0+YXViLT5wcmV2RGVsdGFQaWNPcmRlckNudFsxXSAhPSBkZWx0YVBpY09yZGVyQ250WzFdKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0b3JhZ2UtPmF1Yi0+cHJldkRlbHRhUGljT3JkZXJDbnRbMV0gPSBkZWx0YVBpY09yZGVyQ250WzFdOwotICAgICAgICAgICAgICAgICphY2Nlc3NVbml0Qm91bmRhcnlGbGFnID0gSEFOVFJPX1RSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgfQotCi0gICAgKnN0b3JhZ2UtPmF1Yi0+bnVQcmV2ID0gKm51TmV4dDsKLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogQ2hlY2tQcHMKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgQ2hlY2sgcGljdHVyZSBwYXJhbWV0ZXIgc2V0LiBDb250ZW50cyBvZiB0aGUgcGljdHVyZSBwYXJhbWV0ZXIKLSAgICAgICAgICAgIHNldCBpbmZvcm1hdGlvbiB0aGF0IGRlcGVuZHMgb24gdGhlIGltYWdlIGRpbWVuc2lvbnMgaXMgY2hlY2tlZAotICAgICAgICAgICAgYWdhaW5zdCB0aGUgZGltZW5zaW9ucyBpbiB0aGUgc3BzLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBwcyAgICAgcG9pbnRlciB0byBwaWN0dXJlIHBhcmFtdGVyIHNldAotICAgICAgICAgICAgc3BzICAgICBwb2ludGVyIHRvIHNlcXVlbmNlIHBhcmFtZXRlciBzZXQKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgbm9uZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIQU5UUk9fT0sgICAgICBldmVyeXRoaW5nIG9rCi0gICAgICAgICAgICBIQU5UUk9fTk9LICAgICBpbnZhbGlkIGRhdGEgaW4gcGljdHVyZSBwYXJhbWV0ZXIgc2V0Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi11MzIgQ2hlY2tQcHMocGljUGFyYW1TZXRfdCAqcHBzLCBzZXFQYXJhbVNldF90ICpzcHMpCi17Ci0KLSAgICB1MzIgaTsKLSAgICB1MzIgcGljU2l6ZTsKLQotICAgIHBpY1NpemUgPSBzcHMtPnBpY1dpZHRoSW5NYnMgKiBzcHMtPnBpY0hlaWdodEluTWJzOwotCi0gICAgLyogY2hlY2sgc2xpY2UgZ3JvdXAgcGFyYW1zICovCi0gICAgaWYgKHBwcy0+bnVtU2xpY2VHcm91cHMgPiAxKQotICAgIHsKLSAgICAgICAgaWYgKHBwcy0+c2xpY2VHcm91cE1hcFR5cGUgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgQVNTRVJUKHBwcy0+cnVuTGVuZ3RoKTsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwcHMtPm51bVNsaWNlR3JvdXBzOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHBwcy0+cnVuTGVuZ3RoW2ldID4gcGljU2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHBwcy0+c2xpY2VHcm91cE1hcFR5cGUgPT0gMikKLSAgICAgICAgewotICAgICAgICAgICAgQVNTRVJUKHBwcy0+dG9wTGVmdCk7Ci0gICAgICAgICAgICBBU1NFUlQocHBzLT5ib3R0b21SaWdodCk7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcHBzLT5udW1TbGljZUdyb3Vwcy0xOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHBwcy0+dG9wTGVmdFtpXSA+IHBwcy0+Ym90dG9tUmlnaHRbaV0gfHwKLSAgICAgICAgICAgICAgICAgICAgcHBzLT5ib3R0b21SaWdodFtpXSA+PSBwaWNTaXplKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIChwcHMtPnRvcExlZnRbaV0gJSBzcHMtPnBpY1dpZHRoSW5NYnMpID4KLSAgICAgICAgICAgICAgICAgICAgIChwcHMtPmJvdHRvbVJpZ2h0W2ldICUgc3BzLT5waWNXaWR0aEluTWJzKSApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChwcHMtPnNsaWNlR3JvdXBNYXBUeXBlID4gMiAmJiBwcHMtPnNsaWNlR3JvdXBNYXBUeXBlIDwgNikKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHBwcy0+c2xpY2VHcm91cENoYW5nZVJhdGUgPiBwaWNTaXplKQotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChwcHMtPnNsaWNlR3JvdXBNYXBUeXBlID09IDYgJiYKLSAgICAgICAgICAgICAgICAgcHBzLT5waWNTaXplSW5NYXBVbml0cyA8IHBpY1NpemUpCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgfQotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZFZhbGlkUGFyYW1TZXRzCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIENoZWNrIGlmIGFueSB2YWxpZCBTUFMvUFBTIGNvbWJpbmF0aW9uIGV4aXN0cyBpbiB0aGUgc3RvcmFnZS4KLSAgICAgICAgICAgIEZ1bmN0aW9uIHRyaWVzIGVhY2ggUFBTIGluIHRoZSBidWZmZXIgYW5kIGNoZWNrcyBpZiBjb3JyZXNwb25kaW5nCi0gICAgICAgICAgICBTUFMgZXhpc3RzIGFuZCBjYWxscyBDaGVja1BwcyB0byBkZXRlcm1pbmUgaWYgdGhlIFBQUyBjb25mb3JtcwotICAgICAgICAgICAgdG8gaW1hZ2UgZGltZW5zaW9ucyBvZiB0aGUgU1BTLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdG9yYWdlICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBzdHJ1Y3R1cmUKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgSEFOVFJPX09LICAgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIHZhbGlkIGNvbWJpbmF0aW9uCi0gICAgICAgICAgICBIQU5UUk9fTk9LICBubyB2YWxpZCBjb21iaW5hdGlvbnMgZm91bmQKLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZFZhbGlkUGFyYW1TZXRzKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGk7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RvcmFnZSk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9QSUNfUEFSQU1fU0VUUzsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKCBwU3RvcmFnZS0+cHBzW2ldICYmCi0gICAgICAgICAgICAgcFN0b3JhZ2UtPnNwc1twU3RvcmFnZS0+cHBzW2ldLT5zZXFQYXJhbWV0ZXJTZXRJZF0gJiYKLSAgICAgICAgICAgICBDaGVja1BwcyhwU3RvcmFnZS0+cHBzW2ldLAotICAgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5zcHNbcFN0b3JhZ2UtPnBwc1tpXS0+c2VxUGFyYW1ldGVyU2V0SWRdKSA9PQotICAgICAgICAgICAgICAgICBIQU5UUk9fT0spCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fT0spOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuKEhBTlRST19OT0spOwotCi19Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zdG9yYWdlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc3RvcmFnZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTNiMmRhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zdG9yYWdlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLSAgICAzLiBEYXRhIHR5cGVzCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIEgyNjRTV0RFQ19TVE9SQUdFX0gKLSNkZWZpbmUgSDI2NFNXREVDX1NUT1JBR0VfSAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImJhc2V0eXBlLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9jZmcuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3NlcV9wYXJhbV9zZXQuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3BpY19wYXJhbV9zZXQuaCIKLSNpbmNsdWRlICJoMjY0YnNkX21hY3JvYmxvY2tfbGF5ZXIuaCIKLSNpbmNsdWRlICJoMjY0YnNkX25hbF91bml0LmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9zbGljZV9oZWFkZXIuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3NlcV9wYXJhbV9zZXQuaCIKLSNpbmNsdWRlICJoMjY0YnNkX2RwYi5oIgotI2luY2x1ZGUgImgyNjRic2RfcGljX29yZGVyX2NudC5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIERhdGEgdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdTMyIHNsaWNlSWQ7Ci0gICAgdTMyIG51bURlY29kZWRNYnM7Ci0gICAgdTMyIGxhc3RNYkFkZHI7Ci19IHNsaWNlU3RvcmFnZV90OwotCi0vKiBzdHJ1Y3R1cmUgdG8gc3RvcmUgcGFyYW1ldGVycyBuZWVkZWQgZm9yIGFjY2VzcyB1bml0IGJvdW5kYXJ5IGNoZWNraW5nICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIG5hbFVuaXRfdCBudVByZXZbMV07Ci0gICAgdTMyIHByZXZGcmFtZU51bTsKLSAgICB1MzIgcHJldklkclBpY0lkOwotICAgIHUzMiBwcmV2UGljT3JkZXJDbnRMc2I7Ci0gICAgaTMyIHByZXZEZWx0YVBpY09yZGVyQ250Qm90dG9tOwotICAgIGkzMiBwcmV2RGVsdGFQaWNPcmRlckNudFsyXTsKLSAgICB1MzIgZmlyc3RDYWxsRmxhZzsKLX0gYXViQ2hlY2tfdDsKLQotLyogc3RvcmFnZSBkYXRhIHN0cnVjdHVyZSwgaG9sZHMgYWxsIGRhdGEgb2YgYSBkZWNvZGVyIGluc3RhbmNlICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIC8qIGFjdGl2ZSBwYXJhbWV0IHNldCBpZHMgYW5kIHBvaW50ZXJzICovCi0gICAgdTMyIG9sZFNwc0lkOwotICAgIHUzMiBhY3RpdmVQcHNJZDsKLSAgICB1MzIgYWN0aXZlU3BzSWQ7Ci0gICAgcGljUGFyYW1TZXRfdCAqYWN0aXZlUHBzOwotICAgIHNlcVBhcmFtU2V0X3QgKmFjdGl2ZVNwczsKLSAgICBzZXFQYXJhbVNldF90ICpzcHNbTUFYX05VTV9TRVFfUEFSQU1fU0VUU107Ci0gICAgcGljUGFyYW1TZXRfdCAqcHBzW01BWF9OVU1fUElDX1BBUkFNX1NFVFNdOwotCi0gICAgLyogY3VycmVudCBzbGljZSBncm91cCBtYXAsIHJlY29tcHV0ZWQgZm9yIGVhY2ggc2xpY2UgKi8KLSAgICB1MzIgKnNsaWNlR3JvdXBNYXA7Ci0KLSAgICB1MzIgcGljU2l6ZUluTWJzOwotCi0gICAgLyogdGhpcyBmbGFnIGlzIHNldCBhZnRlciBhbGwgbWFjcm9ibG9ja3Mgb2YgYSBwaWN0dXJlIHN1Y2Nlc3NmdWxseQotICAgICAqIGRlY29kZWQgLT4gcmVkdW5kYW50IHNsaWNlcyBub3QgZGVjb2RlZCAqLwotICAgIHUzMiBza2lwUmVkdW5kYW50U2xpY2VzOwotICAgIHUzMiBwaWNTdGFydGVkOwotCi0gICAgLyogZmxhZyB0byBpbmRpY2F0ZSBpZiBjdXJyZW50IGFjY2VzcyB1bml0IGNvbnRhaW5zIGFueSB2YWxpZCBzbGljZXMgKi8KLSAgICB1MzIgdmFsaWRTbGljZUluQWNjZXNzVW5pdDsKLQotICAgIC8qIHN0b3JlIGluZm9ybWF0aW9uIG5lZWRlZCBmb3IgaGFuZGxpbmcgb2Ygc2xpY2UgZGVjb2RpbmcgKi8KLSAgICBzbGljZVN0b3JhZ2VfdCBzbGljZVsxXTsKLQotICAgIC8qIG51bWJlciBvZiBjb25jZWFsZWQgbWFjcm9ibG9ja3MgaW4gdGhlIGN1cnJlbnQgaW1hZ2UgKi8KLSAgICB1MzIgbnVtQ29uY2VhbGVkTWJzOwotCi0gICAgLyogcGljSWQgZ2l2ZW4gYnkgYXBwbGljYXRpb24gKi8KLSAgICB1MzIgY3VycmVudFBpY0lkOwotCi0gICAgLyogbWFjcm9ibG9jayBzcGVjaWZpYyBzdG9yYWdlcywgc2l6ZSBkZXRlcm1pbmVkIGJ5IGltYWdlIGRpbWVuc2lvbnMgKi8KLSAgICBtYlN0b3JhZ2VfdCAqbWI7Ci0KLSAgICAvKiBmbGFnIHRvIHN0b3JlIG5vT3V0cHV0UmVvcmRlcmluZyBmbGFnIHNldCBieSB0aGUgYXBwbGljYXRpb24gKi8KLSAgICB1MzIgbm9SZW9yZGVyaW5nOwotCi0gICAgLyogRFBCICovCi0gICAgZHBiU3RvcmFnZV90IGRwYlsxXTsKLQotICAgIC8qIHN0cnVjdHVyZSB0byBzdG9yZSBwaWN0dXJlIG9yZGVyIGNvdW50IHJlbGF0ZWQgaW5mb3JtYXRpb24gKi8KLSAgICBwb2NTdG9yYWdlX3QgcG9jWzFdOwotCi0gICAgLyogYWNjZXNzIHVuaXQgYm91bmRhcnkgY2hlY2tpbmcgcmVsYXRlZCBkYXRhICovCi0gICAgYXViQ2hlY2tfdCBhdWJbMV07Ci0KLSAgICAvKiBjdXJyZW50IHByb2Nlc3NlZCBpbWFnZSAqLwotICAgIGltYWdlX3QgY3VyckltYWdlWzFdOwotCi0gICAgLyogbGFzdCB2YWxpZCBOQUwgdW5pdCBoZWFkZXIgaXMgc3RvcmVkIGhlcmUgKi8KLSAgICBuYWxVbml0X3QgcHJldk5hbFVuaXRbMV07Ci0KLSAgICAvKiBzbGljZSBoZWFkZXIsIHNlY29uZCBzdHJ1Y3R1cmUgdXNlZCBhcyBhIHRlbXBvcmFyeSBzdG9yYWdlIHdoaWxlCi0gICAgICogZGVjb2Rpbmcgc2xpY2UgaGVhZGVyLCBmaXJzdCBvbmUgc3RvcmVzIGxhc3Qgc3VjY2Vzc2Z1bGx5IGRlY29kZWQKLSAgICAgKiBzbGljZSBoZWFkZXIgKi8KLSAgICBzbGljZUhlYWRlcl90IHNsaWNlSGVhZGVyWzJdOwotCi0gICAgLyogZmllbGRzIHRvIHN0b3JlIG9sZCBzdHJlYW0gYnVmZmVyIHBvaW50ZXJzLCBuZWVkZWQgd2hlbiBvbmx5IHBhcnQgb2YKLSAgICAgKiBhIHN0cmVhbSBidWZmZXIgaXMgcHJvY2Vzc2VkIGJ5IGgyNjRic2REZWNvZGUgZnVuY3Rpb24gKi8KLSAgICB1MzIgcHJldkJ1Zk5vdEZpbmlzaGVkOwotICAgIHU4ICpwcmV2QnVmUG9pbnRlcjsKLSAgICB1MzIgcHJldkJ5dGVzQ29uc3VtZWQ7Ci0gICAgc3RybURhdGFfdCBzdHJtWzFdOwotCi0gICAgLyogbWFjcm9ibG9jayBsYXllciBzdHJ1Y3R1cmUsIHRoZXJlIGlzIG5vIG5lZWQgdG8gc3RvcmUgdGhpcyBidXQgaXQKLSAgICAgKiB3b3VsZCBoYXZlIGluY3JlYXNlZCB0aGUgc3RhY2sgc2l6ZSBleGNlc3NpdmVseSBhbmQgbmVlZGVkIHRvIGJlCi0gICAgICogYWxsb2NhdGVkIGZyb20gaGVhZCAtPiBlYXNpZXN0IHRvIHB1dCBpdCBoZXJlICovCi0gICAgbWFjcm9ibG9ja0xheWVyX3QgKm1iTGF5ZXI7Ci0KLSAgICB1MzIgcGVuZGluZ0FjdGl2YXRpb247IC8qIEFjdGl2YXRlIHBhcmFtZXRlciBzZXRzIGFmdGVyIHJldHVybmluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEVBREVSU19SRFkgdG8gdGhlIHVzZXIgKi8KLSAgICB1MzIgaW50cmFDb25jZWFsbWVudEZsYWc7IC8qIDAgZ3JheSBwaWN0dXJlIGZvciBjb3JydXB0ZWQgaW50cmEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgcHJldmlvdXMgZnJhbWUgdXNlZCBpZiBhdmFpbGFibGUgKi8KLX0gc3RvcmFnZV90OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgaDI2NGJzZEluaXRTdG9yYWdlKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpOwotdm9pZCBoMjY0YnNkUmVzZXRTdG9yYWdlKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpOwotdTMyIGgyNjRic2RJc1N0YXJ0T2ZQaWN0dXJlKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpOwotdTMyIGgyNjRic2RJc0VuZE9mUGljdHVyZShzdG9yYWdlX3QgKnBTdG9yYWdlKTsKLXUzMiBoMjY0YnNkU3RvcmVTZXFQYXJhbVNldChzdG9yYWdlX3QgKnBTdG9yYWdlLCBzZXFQYXJhbVNldF90ICpwU2VxUGFyYW1TZXQpOwotdTMyIGgyNjRic2RTdG9yZVBpY1BhcmFtU2V0KHN0b3JhZ2VfdCAqcFN0b3JhZ2UsIHBpY1BhcmFtU2V0X3QgKnBQaWNQYXJhbVNldCk7Ci11MzIgaDI2NGJzZEFjdGl2YXRlUGFyYW1TZXRzKHN0b3JhZ2VfdCAqcFN0b3JhZ2UsIHUzMiBwcHNJZCwgdTMyIGlzSWRyKTsKLXZvaWQgaDI2NGJzZENvbXB1dGVTbGljZUdyb3VwTWFwKHN0b3JhZ2VfdCAqcFN0b3JhZ2UsCi0gICAgdTMyIHNsaWNlR3JvdXBDaGFuZ2VDeWNsZSk7Ci0KLXUzMiBoMjY0YnNkQ2hlY2tBY2Nlc3NVbml0Qm91bmRhcnkoCi0gIHN0cm1EYXRhX3QgKnN0cm0sCi0gIG5hbFVuaXRfdCAqbnVOZXh0LAotICBzdG9yYWdlX3QgKnN0b3JhZ2UsCi0gIHUzMiAqYWNjZXNzVW5pdEJvdW5kYXJ5RmxhZyk7Ci0KLXUzMiBoMjY0YnNkVmFsaWRQYXJhbVNldHMoc3RvcmFnZV90ICpwU3RvcmFnZSk7Ci0KLSNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX1NUT1JBR0VfSCAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc3RyZWFtLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc3RyZWFtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwZDEwODMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3N0cmVhbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLSAgICAgMy4gTW9kdWxlIGRlZmluZXMKLSAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotICAgICA1LiBGdW5jdGlvbnMKLSAgICAgICAgICBoMjY0YnNkR2V0Qml0cwotICAgICAgICAgIGgyNjRic2RTaG93Qml0czMyCi0gICAgICAgICAgaDI2NGJzZEZsdXNoQml0cwotICAgICAgICAgIGgyNjRic2RJc0J5dGVBbGlnbmVkCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9zdHJlYW0uaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RHZXRCaXRzCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIFJlYWQgYW5kIHJlbW92ZSBiaXRzIGZyb20gdGhlIHN0cmVhbSBidWZmZXIuCi0KLSAgICAgICAgSW5wdXQ6Ci0gICAgICAgICAgICBwU3RybURhdGEgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQotICAgICAgICAgICAgbnVtQml0cyAgICAgbnVtYmVyIG9mIGJpdHMgdG8gcmVhZAotCi0gICAgICAgIE91dHB1dDoKLSAgICAgICAgICAgIG5vbmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgYml0cyByZWFkIGZyb20gc3RyZWFtCi0gICAgICAgICAgICBFTkRfT0ZfU1RSRUFNIGlmIG5vdCBlbm91Z2ggYml0cyBsZWZ0Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkR2V0Qml0cyhzdHJtRGF0YV90ICpwU3RybURhdGEsIHUzMiBudW1CaXRzKQotewotCi0gICAgdTMyIG91dDsKLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVChudW1CaXRzIDwgMzIpOwotCi0gICAgb3V0ID0gaDI2NGJzZFNob3dCaXRzMzIocFN0cm1EYXRhKSA+PiAoMzIgLSBudW1CaXRzKTsKLQotICAgIGlmIChoMjY0YnNkRmx1c2hCaXRzKHBTdHJtRGF0YSwgbnVtQml0cykgPT0gSEFOVFJPX09LKQotICAgIHsKLSAgICAgICAgcmV0dXJuKG91dCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJldHVybihFTkRfT0ZfU1RSRUFNKTsKLSAgICB9Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkU2hvd0JpdHMzMgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBSZWFkIDMyIGJpdHMgZnJvbSB0aGUgc3RyZWFtIGJ1ZmZlci4gQnVmZmVyIGlzIGxlZnQgYXMgaXQgaXMsIGkuZS4KLSAgICAgICAgICAgIG5vIGJpdHMgYXJlIHJlbW92ZWQuIEZpcnN0IGJpdCByZWFkIGZyb20gdGhlIHN0cmVhbSBpcyB0aGUgTVNCIG9mCi0gICAgICAgICAgICB0aGUgcmV0dXJuIHZhbHVlLiBJZiB0aGVyZSBpcyBub3QgZW5vdWdoIGJpdHMgaW4gdGhlIGJ1ZmZlciAtPgotICAgICAgICAgICAgYml0cyBiZXlvbmcgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIGFyZSBzZXQgdG8gJzAnIGluIHRoZSByZXR1cm4KLSAgICAgICAgICAgIHZhbHVlLgotCi0gICAgICAgIElucHV0OgotICAgICAgICAgICAgcFN0cm1EYXRhICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKLQotICAgICAgICBPdXRwdXQ6Ci0gICAgICAgICAgICBub25lCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIGJpdHMgcmVhZCBmcm9tIHN0cmVhbQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZFNob3dCaXRzMzIoc3RybURhdGFfdCAqcFN0cm1EYXRhKQotewotCi0gICAgaTMyIGJpdHMsIHNoaWZ0OwotICAgIHUzMiBvdXQ7Ci0gICAgdTggKnBTdHJtOwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKHBTdHJtRGF0YS0+cFN0cm1DdXJyUG9zKTsKLSAgICBBU1NFUlQocFN0cm1EYXRhLT5iaXRQb3NJbldvcmQgPCA4KTsKLSAgICBBU1NFUlQocFN0cm1EYXRhLT5iaXRQb3NJbldvcmQgPT0KLSAgICAgICAgICAgKHBTdHJtRGF0YS0+c3RybUJ1ZmZSZWFkQml0cyAmIDB4NykpOwotCi0gICAgcFN0cm0gPSBwU3RybURhdGEtPnBTdHJtQ3VyclBvczsKLQotICAgIC8qIG51bWJlciBvZiBiaXRzIGxlZnQgaW4gdGhlIGJ1ZmZlciAqLwotICAgIGJpdHMgPSAoaTMyKXBTdHJtRGF0YS0+c3RybUJ1ZmZTaXplKjggLSAoaTMyKXBTdHJtRGF0YS0+c3RybUJ1ZmZSZWFkQml0czsKLQotICAgIC8qIGF0IGxlYXN0IDMyLWJpdHMgaW4gdGhlIGJ1ZmZlciAqLwotICAgIGlmIChiaXRzID49IDMyKQotICAgIHsKLSAgICAgICAgdTMyIGJpdFBvc0luV29yZCA9IHBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkOwotICAgICAgICBvdXQgPSAoKHUzMilwU3RybVswXSA8PCAyNCkgfCAoKHUzMilwU3RybVsxXSA8PCAxNikgfAotICAgICAgICAgICAgICAoKHUzMilwU3RybVsyXSA8PCAgOCkgfCAoKHUzMilwU3RybVszXSk7Ci0KLSAgICAgICAgaWYgKGJpdFBvc0luV29yZCkKLSAgICAgICAgewotICAgICAgICAgICAgdTMyIGJ5dGUgPSAodTMyKXBTdHJtWzRdOwotICAgICAgICAgICAgdTMyIHRtcCA9ICg4LWJpdFBvc0luV29yZCk7Ci0gICAgICAgICAgICBvdXQgPDw9IGJpdFBvc0luV29yZDsKLSAgICAgICAgICAgIG91dCB8PSBieXRlPj50bXA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChvdXQpOwotICAgIH0KLSAgICAvKiBhdCBsZWFzdCBvbmUgYml0IGluIHRoZSBidWZmZXIgKi8KLSAgICBlbHNlIGlmIChiaXRzID4gMCkKLSAgICB7Ci0gICAgICAgIHNoaWZ0ID0gKGkzMikoMjQgKyBwU3RybURhdGEtPmJpdFBvc0luV29yZCk7Ci0gICAgICAgIG91dCA9ICh1MzIpKCpwU3RybSsrKSA8PCBzaGlmdDsKLSAgICAgICAgYml0cyAtPSAoaTMyKSg4IC0gcFN0cm1EYXRhLT5iaXRQb3NJbldvcmQpOwotICAgICAgICB3aGlsZSAoYml0cyA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNoaWZ0IC09IDg7Ci0gICAgICAgICAgICBvdXQgfD0gKHUzMikoKnBTdHJtKyspIDw8IHNoaWZ0OwotICAgICAgICAgICAgYml0cyAtPSA4OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAob3V0KTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gKDApOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZEZsdXNoQml0cwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBSZW1vdmUgYml0cyBmcm9tIHRoZSBzdHJlYW0gYnVmZmVyCi0KLSAgICAgICAgSW5wdXQ6Ci0gICAgICAgICAgICBwU3RybURhdGEgICAgICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKLSAgICAgICAgICAgIG51bUJpdHMgICAgICAgICBudW1iZXIgb2YgYml0cyB0byByZW1vdmUKLQotICAgICAgICBPdXRwdXQ6Ci0gICAgICAgICAgICBub25lCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCi0gICAgICAgICAgICBFTkRfT0ZfU1RSRUFNICAgbm90IGVub3VnaCBiaXRzIGxlZnQKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZm5kZWYgSDI2NERFQ19ORU9OCi11MzIgaDI2NGJzZEZsdXNoQml0cyhzdHJtRGF0YV90ICpwU3RybURhdGEsIHUzMiBudW1CaXRzKQotewotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKHBTdHJtRGF0YS0+cFN0cm1CdWZmU3RhcnQpOwotICAgIEFTU0VSVChwU3RybURhdGEtPnBTdHJtQ3VyclBvcyk7Ci0gICAgQVNTRVJUKHBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkIDwgOCk7Ci0gICAgQVNTRVJUKHBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkID09IChwU3RybURhdGEtPnN0cm1CdWZmUmVhZEJpdHMgJiAweDcpKTsKLQotICAgIHBTdHJtRGF0YS0+c3RybUJ1ZmZSZWFkQml0cyArPSBudW1CaXRzOwotICAgIHBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkID0gcFN0cm1EYXRhLT5zdHJtQnVmZlJlYWRCaXRzICYgMHg3OwotICAgIGlmICggKHBTdHJtRGF0YS0+c3RybUJ1ZmZSZWFkQml0cyApIDw9ICg4KnBTdHJtRGF0YS0+c3RybUJ1ZmZTaXplKSApCi0gICAgewotICAgICAgICBwU3RybURhdGEtPnBTdHJtQ3VyclBvcyA9IHBTdHJtRGF0YS0+cFN0cm1CdWZmU3RhcnQgKwotICAgICAgICAgICAgKHBTdHJtRGF0YS0+c3RybUJ1ZmZSZWFkQml0cyA+PiAzKTsKLSAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuKEVORF9PRl9TVFJFQU0pOwotCi19Ci0jZW5kaWYKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZElzQnl0ZUFsaWduZWQKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgQ2hlY2sgaWYgY3VycmVudCBzdHJlYW0gcG9zaXRpb24gaXMgYnl0ZSBhbGlnbmVkLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdHJtRGF0YSAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIG5vbmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgVFJVRSAgICAgICAgc3RyZWFtIGlzIGJ5dGUgYWxpZ25lZAotICAgICAgICAgICAgRkFMU0UgICAgICAgc3RyZWFtIGlzIG5vdCBieXRlIGFsaWduZWQKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2RJc0J5dGVBbGlnbmVkKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLS8qIENvZGUgKi8KLQotICAgIGlmICghcFN0cm1EYXRhLT5iaXRQb3NJbldvcmQpCi0gICAgICAgIHJldHVybihIQU5UUk9fVFJVRSk7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4oSEFOVFJPX0ZBTFNFKTsKLQotfQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc3RyZWFtLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc3RyZWFtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0MDRiNjYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3N0cmVhbS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLSAgICAzLiBEYXRhIHR5cGVzCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIEgyNjRTV0RFQ19TVFJFQU1fSAotI2RlZmluZSBIMjY0U1dERUNfU1RSRUFNX0gKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJiYXNldHlwZS5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIERhdGEgdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdTggICpwU3RybUJ1ZmZTdGFydDsgICAgLyogcG9pbnRlciB0byBzdGFydCBvZiBzdHJlYW0gYnVmZmVyICovCi0gICAgdTggICpwU3RybUN1cnJQb3M7ICAgICAgLyogY3VycmVudCByZWFkIGFkZHJlc3MgaW4gc3RyZWFtIGJ1ZmZlciAqLwotICAgIHUzMiAgYml0UG9zSW5Xb3JkOyAgICAgIC8qIGJpdCBwb3NpdGlvbiBpbiBzdHJlYW0gYnVmZmVyIGJ5dGUgKi8KLSAgICB1MzIgIHN0cm1CdWZmU2l6ZTsgICAgICAvKiBzaXplIG9mIHN0cmVhbSBidWZmZXIgKGJ5dGVzKSAqLwotICAgIHUzMiAgc3RybUJ1ZmZSZWFkQml0czsgIC8qIG51bWJlciBvZiBiaXRzIHJlYWQgZnJvbSBzdHJlYW0gYnVmZmVyICovCi19IHN0cm1EYXRhX3Q7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2RHZXRCaXRzKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgdTMyIG51bUJpdHMpOwotCi11MzIgaDI2NGJzZFNob3dCaXRzMzIoc3RybURhdGFfdCAqcFN0cm1EYXRhKTsKLQotdTMyIGgyNjRic2RGbHVzaEJpdHMoc3RybURhdGFfdCAqcFN0cm1EYXRhLCB1MzIgbnVtQml0cyk7Ci0KLXUzMiBoMjY0YnNkSXNCeXRlQWxpZ25lZChzdHJtRGF0YV90ICopOwotCi0jZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19TVFJFQU1fSCAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdHJhbnNmb3JtLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdHJhbnNmb3JtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYjZkZDAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3RyYW5zZm9ybS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDAyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLSAgICAgMy4gTW9kdWxlIGRlZmluZXMKLSAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotICAgICA1LiBGdW5jdGlvbnMKLSAgICAgICAgICBoMjY0YnNkUHJvY2Vzc0Jsb2NrCi0gICAgICAgICAgaDI2NGJzZFByb2Nlc3NMdW1hRGMKLSAgICAgICAgICBoMjY0YnNkUHJvY2Vzc0Nocm9tYURjCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiYmFzZXR5cGUuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3RyYW5zZm9ybS5oIgotI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBTd2l0Y2ggb2ZmIHRoZSBmb2xsb3dpbmcgTGludCBtZXNzYWdlcyBmb3IgdGhpcyBmaWxlOgotICogSW5mbyA3MDE6IFNoaWZ0IGxlZnQgb2Ygc2lnbmVkIHF1YW50aXR5IChpbnQpCi0gKiBJbmZvIDcwMjogU2hpZnQgcmlnaHQgb2Ygc2lnbmVkIHF1YW50aXR5IChpbnQpCi0gKi8KLS8qbGludCAtZTcwMSAtZTcwMiAqLwotCi0vKiBMZXZlbFNjYWxlIGZ1bmN0aW9uICovCi1zdGF0aWMgY29uc3QgaTMyIGxldmVsU2NhbGVbNl1bM10gPSB7Ci0gICAgezEwLDEzLDE2fSwgezExLDE0LDE4fSwgezEzLDE2LDIwfSwgezE0LDE4LDIzfSwgezE2LDIwLDI1fSwgezE4LDIzLDI5fX07Ci0KLS8qIHFwICUgNiBhcyBhIGZ1bmN0aW9uIG9mIHFwICovCi1zdGF0aWMgY29uc3QgdTggcXBNb2Q2WzUyXSA9IHswLDEsMiwzLDQsNSwwLDEsMiwzLDQsNSwwLDEsMiwzLDQsNSwwLDEsMiwzLDQsNSwKLSAgICAwLDEsMiwzLDQsNSwwLDEsMiwzLDQsNSwwLDEsMiwzLDQsNSwwLDEsMiwzLDQsNSwwLDEsMiwzfTsKLQotLyogcXAgLyA2IGFzIGEgZnVuY3Rpb24gb2YgcXAgKi8KLXN0YXRpYyBjb25zdCB1OCBxcERpdjZbNTJdID0gezAsMCwwLDAsMCwwLDEsMSwxLDEsMSwxLDIsMiwyLDIsMiwyLDMsMywzLDMsMywzLAotICAgIDQsNCw0LDQsNCw0LDUsNSw1LDUsNSw1LDYsNiw2LDYsNiw2LDcsNyw3LDcsNyw3LDgsOCw4LDh9OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZFByb2Nlc3NCbG9jawotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGdW5jdGlvbiBwZXJmb3JtcyBpbnZlcnNlIHppZy16YWcgc2NhbiwgaW52ZXJzZSBzY2FsaW5nIGFuZAotICAgICAgICAgICAgaW52ZXJzZSB0cmFuc2Zvcm0gZm9yIGEgbHVtYSBvciBhIGNocm9tYSByZXNpZHVhbCBibG9jawotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIGRhdGEgICAgICAgICAgICBwb2ludGVyIHRvIGRhdGEgdG8gYmUgcHJvY2Vzc2VkCi0gICAgICAgICAgICBxcCAgICAgICAgICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlcgotICAgICAgICAgICAgc2tpcCAgICAgICAgICAgIHNraXAgcHJvY2Vzc2luZyBvZiBkYXRhWzBdLCBzZXQgdG8gbm9uLXplcm8gdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBkYyBjb2VmZiBoYW5sZWQgc2VwYXJhdGVseQotICAgICAgICAgICAgY29lZmZNYXAgICAgICAgIDE2IGxzYidzIGluZGljYXRlIHdoaWNoIGNvZWZmcyBhcmUgbm9uLXplcm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0IDAgKGxzYikgZm9yIGNvZWZmIDAsIGJpdCAxIGZvciBjb2VmZiAxIGV0Yy4KLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgZGF0YSAgICAgICAgICAgIHByb2Nlc3NlZCBkYXRhCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCi0gICAgICAgICAgICBIQU5UUk9fTk9LICAgICAgcHJvY2Vzc2VkIGRhdGEgbm90IGluIHZhbGlkIHJhbmdlIFstNTEyLCA1MTFdCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi11MzIgaDI2NGJzZFByb2Nlc3NCbG9jayhpMzIgKmRhdGEsIHUzMiBxcCwgdTMyIHNraXAsIHUzMiBjb2VmZk1hcCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICBpMzIgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMzsKLSAgICBpMzIgZDEsIGQyLCBkMzsKLSAgICB1MzIgcm93LGNvbDsKLSAgICB1MzIgcXBEaXY7Ci0gICAgaTMyICpwdHI7Ci0KLS8qIENvZGUgKi8KLQotICAgIHFwRGl2ID0gcXBEaXY2W3FwXTsKLSAgICB0bXAxID0gbGV2ZWxTY2FsZVtxcE1vZDZbcXBdXVswXSA8PCBxcERpdjsKLSAgICB0bXAyID0gbGV2ZWxTY2FsZVtxcE1vZDZbcXBdXVsxXSA8PCBxcERpdjsKLSAgICB0bXAzID0gbGV2ZWxTY2FsZVtxcE1vZDZbcXBdXVsyXSA8PCBxcERpdjsKLQotICAgIGlmICghc2tpcCkKLSAgICAgICAgZGF0YVswXSA9IChkYXRhWzBdICogdG1wMSk7Ci0KLSAgICAvKiBhdCBsZWFzdCBvbmUgb2YgdGhlIHJvd3MgMSwgMiBvciAzIGNvbnRhaW4gbm9uLXplcm8gY29lZmZzLCBtYXNrIHRha2VzCi0gICAgICogdGhlIHNjYW5uaW5nIG9yZGVyIGludG8gYWNjb3VudCAqLwotICAgIGlmIChjb2VmZk1hcCAmIDB4RkY5QykKLSAgICB7Ci0gICAgICAgIC8qIGRvIHRoZSB6aWctemFnIHNjYW4gYW5kIGludmVyc2UgcXVhbnRpemF0aW9uICovCi0gICAgICAgIGQxID0gZGF0YVsxXTsKLSAgICAgICAgZDIgPSBkYXRhWzE0XTsKLSAgICAgICAgZDMgPSBkYXRhWzE1XTsKLSAgICAgICAgZGF0YVsxXSA9IChkMSAqIHRtcDIpOwotICAgICAgICBkYXRhWzE0XSA9IChkMiAqIHRtcDIpOwotICAgICAgICBkYXRhWzE1XSA9IChkMyAqIHRtcDMpOwotCi0gICAgICAgIGQxID0gZGF0YVsyXTsKLSAgICAgICAgZDIgPSBkYXRhWzVdOwotICAgICAgICBkMyA9IGRhdGFbNF07Ci0gICAgICAgIGRhdGFbNF0gPSAoZDEgKiB0bXAyKTsKLSAgICAgICAgZGF0YVsyXSAgPSAoZDIgKiB0bXAxKTsKLSAgICAgICAgZGF0YVs1XSA9IChkMyAqIHRtcDMpOwotCi0gICAgICAgIGQxID0gZGF0YVs4XTsKLSAgICAgICAgZDIgPSBkYXRhWzNdOwotICAgICAgICBkMyA9IGRhdGFbNl07Ci0gICAgICAgIHRtcDAgPSAoZDEgKiB0bXAyKTsKLSAgICAgICAgZGF0YVs4XSA9IChkMiAqIHRtcDEpOwotICAgICAgICBkYXRhWzNdICA9IChkMyAqIHRtcDIpOwotICAgICAgICBkMSA9IGRhdGFbN107Ci0gICAgICAgIGQyID0gZGF0YVsxMl07Ci0gICAgICAgIGQzID0gZGF0YVs5XTsKLSAgICAgICAgZGF0YVs2XSAgPSAoZDEgKiB0bXAyKTsKLSAgICAgICAgZGF0YVs3XSAgPSAoZDIgKiB0bXAzKTsKLSAgICAgICAgZGF0YVsxMl0gPSAoZDMgKiB0bXAyKTsKLSAgICAgICAgZGF0YVs5XSAgPSB0bXAwOwotCi0gICAgICAgIGQxID0gZGF0YVsxMF07Ci0gICAgICAgIGQyID0gZGF0YVsxMV07Ci0gICAgICAgIGQzID0gZGF0YVsxM107Ci0gICAgICAgIGRhdGFbMTNdID0gKGQxICogdG1wMyk7Ci0gICAgICAgIGRhdGFbMTBdID0gKGQyICogdG1wMSk7Ci0gICAgICAgIGRhdGFbMTFdID0gKGQzICogdG1wMik7Ci0KLSAgICAgICAgLyogaG9yaXpvbnRhbCB0cmFuc2Zvcm0gKi8KLSAgICAgICAgZm9yIChyb3cgPSA0LCBwdHIgPSBkYXRhOyByb3ctLTsgcHRyICs9IDQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcDAgPSBwdHJbMF0gKyBwdHJbMl07Ci0gICAgICAgICAgICB0bXAxID0gcHRyWzBdIC0gcHRyWzJdOwotICAgICAgICAgICAgdG1wMiA9IChwdHJbMV0gPj4gMSkgLSBwdHJbM107Ci0gICAgICAgICAgICB0bXAzID0gcHRyWzFdICsgKHB0clszXSA+PiAxKTsKLSAgICAgICAgICAgIHB0clswXSA9IHRtcDAgKyB0bXAzOwotICAgICAgICAgICAgcHRyWzFdID0gdG1wMSArIHRtcDI7Ci0gICAgICAgICAgICBwdHJbMl0gPSB0bXAxIC0gdG1wMjsKLSAgICAgICAgICAgIHB0clszXSA9IHRtcDAgLSB0bXAzOwotICAgICAgICB9Ci0KLSAgICAgICAgLypsaW50ICtlNjYxICtlNjYyKi8KLSAgICAgICAgLyogdGhlbiB2ZXJ0aWNhbCB0cmFuc2Zvcm0gKi8KLSAgICAgICAgZm9yIChjb2wgPSA0OyBjb2wtLTsgZGF0YSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAwID0gZGF0YVswXSArIGRhdGFbOF07Ci0gICAgICAgICAgICB0bXAxID0gZGF0YVswXSAtIGRhdGFbOF07Ci0gICAgICAgICAgICB0bXAyID0gKGRhdGFbNF0gPj4gMSkgLSBkYXRhWzEyXTsKLSAgICAgICAgICAgIHRtcDMgPSBkYXRhWzRdICsgKGRhdGFbMTJdID4+IDEpOwotICAgICAgICAgICAgZGF0YVswIF0gPSAodG1wMCArIHRtcDMgKyAzMik+PjY7Ci0gICAgICAgICAgICBkYXRhWzQgXSA9ICh0bXAxICsgdG1wMiArIDMyKT4+NjsKLSAgICAgICAgICAgIGRhdGFbOCBdID0gKHRtcDEgLSB0bXAyICsgMzIpPj42OwotICAgICAgICAgICAgZGF0YVsxMl0gPSAodG1wMCAtIHRtcDMgKyAzMik+PjY7Ci0gICAgICAgICAgICAvKiBjaGVjayB0aGF0IGVhY2ggdmFsdWUgaXMgaW4gdGhlIHJhbmdlIFstNTEyLDUxMV0gKi8KLSAgICAgICAgICAgIGlmICgoKHUzMikoZGF0YVswXSArIDUxMikgPiAxMDIzKSB8fAotICAgICAgICAgICAgICAgICgodTMyKShkYXRhWzRdICsgNTEyKSA+IDEwMjMpIHx8Ci0gICAgICAgICAgICAgICAgKCh1MzIpKGRhdGFbOF0gKyA1MTIpID4gMTAyMykgfHwKLSAgICAgICAgICAgICAgICAoKHUzMikoZGF0YVsxMl0gKyA1MTIpID4gMTAyMykgKQotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIC8qIHJvd3MgMSwgMiBhbmQgMyBhcmUgemVybyAqLwotICAgIHsKLSAgICAgICAgLyogb25seSBkYy1jb2VmZiBpcyBub24temVybywgaS5lLiBjb2VmZnMgYXQgb3JpZ2luYWwgcG9zaXRpb25zCi0gICAgICAgICAqIDEsIDUgYW5kIDYgYXJlIHplcm8gKi8KLSAgICAgICAgaWYgKChjb2VmZk1hcCAmIDB4NjIpID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcDAgPSAoZGF0YVswXSArIDMyKSA+PiA2OwotICAgICAgICAgICAgLyogY2hlY2sgdGhhdCB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgWy01MTIsNTExXSAqLwotICAgICAgICAgICAgaWYgKCh1MzIpKHRtcDAgKyA1MTIpID4gMTAyMykKLSAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICBkYXRhWzBdID0gZGF0YVsxXSAgPSBkYXRhWzJdICA9IGRhdGFbM10gID0gZGF0YVs0XSAgPSBkYXRhWzVdICA9Ci0gICAgICAgICAgICAgICAgICAgICAgZGF0YVs2XSAgPSBkYXRhWzddICA9IGRhdGFbOF0gID0gZGF0YVs5XSAgPSBkYXRhWzEwXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgZGF0YVsxMV0gPSBkYXRhWzEyXSA9IGRhdGFbMTNdID0gZGF0YVsxNF0gPSBkYXRhWzE1XSA9Ci0gICAgICAgICAgICAgICAgICAgICAgdG1wMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIC8qIGF0IGxlYXN0IG9uZSBvZiB0aGUgY29lZmZzIDEsIDUgb3IgNiBpcyBub24temVybyAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBkYXRhWzFdID0gKGRhdGFbMV0gKiB0bXAyKTsKLSAgICAgICAgICAgIGRhdGFbMl0gPSAoZGF0YVs1XSAqIHRtcDEpOwotICAgICAgICAgICAgZGF0YVszXSA9IChkYXRhWzZdICogdG1wMik7Ci0gICAgICAgICAgICB0bXAwID0gZGF0YVswXSArIGRhdGFbMl07Ci0gICAgICAgICAgICB0bXAxID0gZGF0YVswXSAtIGRhdGFbMl07Ci0gICAgICAgICAgICB0bXAyID0gKGRhdGFbMV0gPj4gMSkgLSBkYXRhWzNdOwotICAgICAgICAgICAgdG1wMyA9IGRhdGFbMV0gKyAoZGF0YVszXSA+PiAxKTsKLSAgICAgICAgICAgIGRhdGFbMF0gPSAodG1wMCArIHRtcDMgKyAzMik+PjY7Ci0gICAgICAgICAgICBkYXRhWzFdID0gKHRtcDEgKyB0bXAyICsgMzIpPj42OwotICAgICAgICAgICAgZGF0YVsyXSA9ICh0bXAxIC0gdG1wMiArIDMyKT4+NjsKLSAgICAgICAgICAgIGRhdGFbM10gPSAodG1wMCAtIHRtcDMgKyAzMik+PjY7Ci0gICAgICAgICAgICBkYXRhWzRdID0gZGF0YVs4XSA9IGRhdGFbMTJdID0gZGF0YVswXTsKLSAgICAgICAgICAgIGRhdGFbNV0gPSBkYXRhWzldID0gZGF0YVsxM10gPSBkYXRhWzFdOwotICAgICAgICAgICAgZGF0YVs2XSA9IGRhdGFbMTBdID0gZGF0YVsxNF0gPSBkYXRhWzJdOwotICAgICAgICAgICAgZGF0YVs3XSA9IGRhdGFbMTFdID0gZGF0YVsxNV0gPSBkYXRhWzNdOwotICAgICAgICAgICAgLyogY2hlY2sgdGhhdCBlYWNoIHZhbHVlIGlzIGluIHRoZSByYW5nZSBbLTUxMiw1MTFdICovCi0gICAgICAgICAgICBpZiAoKCh1MzIpKGRhdGFbMF0gKyA1MTIpID4gMTAyMykgfHwKLSAgICAgICAgICAgICAgICAoKHUzMikoZGF0YVsxXSArIDUxMikgPiAxMDIzKSB8fAotICAgICAgICAgICAgICAgICgodTMyKShkYXRhWzJdICsgNTEyKSA+IDEwMjMpIHx8Ci0gICAgICAgICAgICAgICAgKCh1MzIpKGRhdGFbM10gKyA1MTIpID4gMTAyMykgKQotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZFByb2Nlc3NMdW1hRGMKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRnVuY3Rpb24gcGVyZm9ybXMgaW52ZXJzZSB6aWctemFnIHNjYW4sIGludmVyc2UgdHJhbnNmb3JtIGFuZAotICAgICAgICAgICAgaW52ZXJzZSBzY2FsaW5nIGZvciBhIGx1bWEgREMgY29lZmZpY2llbnRzIGJsb2NrCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgZGF0YSAgICAgICAgICAgIHBvaW50ZXIgdG8gZGF0YSB0byBiZSBwcm9jZXNzZWQKLSAgICAgICAgICAgIHFwICAgICAgICAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIGRhdGEgICAgICAgICAgICBwcm9jZXNzZWQgZGF0YQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBub25lCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIGgyNjRic2RQcm9jZXNzTHVtYURjKGkzMiAqZGF0YSwgdTMyIHFwKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIGkzMiB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzOwotICAgIHUzMiByb3csY29sOwotICAgIHUzMiBxcE1vZCwgcXBEaXY7Ci0gICAgaTMyIGxldlNjYWxlOwotICAgIGkzMiAqcHRyOwotCi0vKiBDb2RlICovCi0KLSAgICBxcE1vZCA9IHFwTW9kNltxcF07Ci0gICAgcXBEaXYgPSBxcERpdjZbcXBdOwotCi0gICAgLyogemlnLXphZyBzY2FuICovCi0gICAgdG1wMCA9IGRhdGFbMl07Ci0gICAgZGF0YVsyXSAgPSBkYXRhWzVdOwotICAgIGRhdGFbNV0gPSBkYXRhWzRdOwotICAgIGRhdGFbNF0gPSB0bXAwOwotCi0gICAgdG1wMCA9IGRhdGFbOF07Ci0gICAgZGF0YVs4XSA9IGRhdGFbM107Ci0gICAgZGF0YVszXSAgPSBkYXRhWzZdOwotICAgIGRhdGFbNl0gID0gZGF0YVs3XTsKLSAgICBkYXRhWzddICA9IGRhdGFbMTJdOwotICAgIGRhdGFbMTJdID0gZGF0YVs5XTsKLSAgICBkYXRhWzldICA9IHRtcDA7Ci0KLSAgICB0bXAwID0gZGF0YVsxMF07Ci0gICAgZGF0YVsxMF0gPSBkYXRhWzExXTsKLSAgICBkYXRhWzExXSA9IGRhdGFbMTNdOwotICAgIGRhdGFbMTNdID0gdG1wMDsKLQotICAgIC8qIGhvcml6b250YWwgdHJhbnNmb3JtICovCi0gICAgZm9yIChyb3cgPSA0LCBwdHIgPSBkYXRhOyByb3ctLTsgcHRyICs9IDQpCi0gICAgewotICAgICAgICB0bXAwID0gcHRyWzBdICsgcHRyWzJdOwotICAgICAgICB0bXAxID0gcHRyWzBdIC0gcHRyWzJdOwotICAgICAgICB0bXAyID0gcHRyWzFdIC0gcHRyWzNdOwotICAgICAgICB0bXAzID0gcHRyWzFdICsgcHRyWzNdOwotICAgICAgICBwdHJbMF0gPSB0bXAwICsgdG1wMzsKLSAgICAgICAgcHRyWzFdID0gdG1wMSArIHRtcDI7Ci0gICAgICAgIHB0clsyXSA9IHRtcDEgLSB0bXAyOwotICAgICAgICBwdHJbM10gPSB0bXAwIC0gdG1wMzsKLSAgICB9Ci0KLSAgICAvKmxpbnQgK2U2NjEgK2U2NjIqLwotICAgIC8qIHRoZW4gdmVydGljYWwgdHJhbnNmb3JtIGFuZCBpbnZlcnNlIHNjYWxpbmcgKi8KLSAgICBsZXZTY2FsZSA9IGxldmVsU2NhbGVbIHFwTW9kIF1bMF07Ci0gICAgaWYgKHFwID49IDEyKQotICAgIHsKLSAgICAgICAgbGV2U2NhbGUgPDw9IChxcERpdi0yKTsKLSAgICAgICAgZm9yIChjb2wgPSA0OyBjb2wtLTsgZGF0YSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAwID0gZGF0YVswXSArIGRhdGFbOCBdOwotICAgICAgICAgICAgdG1wMSA9IGRhdGFbMF0gLSBkYXRhWzggXTsKLSAgICAgICAgICAgIHRtcDIgPSBkYXRhWzRdIC0gZGF0YVsxMl07Ci0gICAgICAgICAgICB0bXAzID0gZGF0YVs0XSArIGRhdGFbMTJdOwotICAgICAgICAgICAgZGF0YVswIF0gPSAoKHRtcDAgKyB0bXAzKSpsZXZTY2FsZSk7Ci0gICAgICAgICAgICBkYXRhWzQgXSA9ICgodG1wMSArIHRtcDIpKmxldlNjYWxlKTsKLSAgICAgICAgICAgIGRhdGFbOCBdID0gKCh0bXAxIC0gdG1wMikqbGV2U2NhbGUpOwotICAgICAgICAgICAgZGF0YVsxMl0gPSAoKHRtcDAgLSB0bXAzKSpsZXZTY2FsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaTMyIHRtcDsKLSAgICAgICAgdG1wID0gKCgxIC0gcXBEaXYpID09IDApID8gMSA6IDI7Ci0gICAgICAgIGZvciAoY29sID0gNDsgY29sLS07IGRhdGErKykKLSAgICAgICAgewotICAgICAgICAgICAgdG1wMCA9IGRhdGFbMF0gKyBkYXRhWzggXTsKLSAgICAgICAgICAgIHRtcDEgPSBkYXRhWzBdIC0gZGF0YVs4IF07Ci0gICAgICAgICAgICB0bXAyID0gZGF0YVs0XSAtIGRhdGFbMTJdOwotICAgICAgICAgICAgdG1wMyA9IGRhdGFbNF0gKyBkYXRhWzEyXTsKLSAgICAgICAgICAgIGRhdGFbMCBdID0gKCh0bXAwICsgdG1wMykqbGV2U2NhbGUrdG1wKSA+PiAoMi1xcERpdik7Ci0gICAgICAgICAgICBkYXRhWzQgXSA9ICgodG1wMSArIHRtcDIpKmxldlNjYWxlK3RtcCkgPj4gKDItcXBEaXYpOwotICAgICAgICAgICAgZGF0YVs4IF0gPSAoKHRtcDEgLSB0bXAyKSpsZXZTY2FsZSt0bXApID4+ICgyLXFwRGl2KTsKLSAgICAgICAgICAgIGRhdGFbMTJdID0gKCh0bXAwIC0gdG1wMykqbGV2U2NhbGUrdG1wKSA+PiAoMi1xcERpdik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkUHJvY2Vzc0Nocm9tYURjCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZ1bmN0aW9uIHBlcmZvcm1zIGludmVyc2UgdHJhbnNmb3JtIGFuZCBpbnZlcnNlIHNjYWxpbmcgZm9yIGEKLSAgICAgICAgICAgIGNocm9tYSBEQyBjb2VmZmljaWVudHMgYmxvY2sKLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBkYXRhICAgICAgICAgICAgcG9pbnRlciB0byBkYXRhIHRvIGJlIHByb2Nlc3NlZAotICAgICAgICAgICAgcXAgICAgICAgICAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgZGF0YSAgICAgICAgICAgIHByb2Nlc3NlZCBkYXRhCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIG5vbmUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgaDI2NGJzZFByb2Nlc3NDaHJvbWFEYyhpMzIgKmRhdGEsIHUzMiBxcCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICBpMzIgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMzsKLSAgICB1MzIgcXBEaXY7Ci0gICAgaTMyIGxldlNjYWxlOwotICAgIHUzMiBsZXZTaGlmdDsKLQotLyogQ29kZSAqLwotCi0gICAgcXBEaXYgPSBxcERpdjZbcXBdOwotICAgIGxldlNjYWxlID0gbGV2ZWxTY2FsZVsgcXBNb2Q2W3FwXSBdWzBdOwotCi0gICAgaWYgKHFwID49IDYpCi0gICAgewotICAgICAgICBsZXZTY2FsZSA8PD0gKHFwRGl2LTEpOwotICAgICAgICBsZXZTaGlmdCA9IDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGxldlNoaWZ0ID0gMTsKLSAgICB9Ci0KLSAgICB0bXAwID0gZGF0YVswXSArIGRhdGFbMl07Ci0gICAgdG1wMSA9IGRhdGFbMF0gLSBkYXRhWzJdOwotICAgIHRtcDIgPSBkYXRhWzFdIC0gZGF0YVszXTsKLSAgICB0bXAzID0gZGF0YVsxXSArIGRhdGFbM107Ci0gICAgZGF0YVswXSA9ICgodG1wMCArIHRtcDMpICogbGV2U2NhbGUpID4+IGxldlNoaWZ0OwotICAgIGRhdGFbMV0gPSAoKHRtcDAgLSB0bXAzKSAqIGxldlNjYWxlKSA+PiBsZXZTaGlmdDsKLSAgICBkYXRhWzJdID0gKCh0bXAxICsgdG1wMikgKiBsZXZTY2FsZSkgPj4gbGV2U2hpZnQ7Ci0gICAgZGF0YVszXSA9ICgodG1wMSAtIHRtcDIpICogbGV2U2NhbGUpID4+IGxldlNoaWZ0OwotICAgIHRtcDAgPSBkYXRhWzRdICsgZGF0YVs2XTsKLSAgICB0bXAxID0gZGF0YVs0XSAtIGRhdGFbNl07Ci0gICAgdG1wMiA9IGRhdGFbNV0gLSBkYXRhWzddOwotICAgIHRtcDMgPSBkYXRhWzVdICsgZGF0YVs3XTsKLSAgICBkYXRhWzRdID0gKCh0bXAwICsgdG1wMykgKiBsZXZTY2FsZSkgPj4gbGV2U2hpZnQ7Ci0gICAgZGF0YVs1XSA9ICgodG1wMCAtIHRtcDMpICogbGV2U2NhbGUpID4+IGxldlNoaWZ0OwotICAgIGRhdGFbNl0gPSAoKHRtcDEgKyB0bXAyKSAqIGxldlNjYWxlKSA+PiBsZXZTaGlmdDsKLSAgICBkYXRhWzddID0gKCh0bXAxIC0gdG1wMikgKiBsZXZTY2FsZSkgPj4gbGV2U2hpZnQ7Ci0KLX0KLQotLypsaW50ICtlNzAxICtlNzAyICovCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3RyYW5zZm9ybS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3RyYW5zZm9ybS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjQxYTIzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF90cmFuc2Zvcm0uaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0gICAgMy4gRGF0YSB0eXBlcwotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBIMjY0U1dERUNfVFJBTlNGT1JNX0gKLSNkZWZpbmUgSDI2NFNXREVDX1RSQU5TRk9STV9ICi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiYmFzZXR5cGUuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBEYXRhIHR5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkUHJvY2Vzc0Jsb2NrKGkzMiAqZGF0YSwgdTMyIHFwLCB1MzIgc2tpcCwgdTMyIGNvZWZmTWFwKTsKLXZvaWQgaDI2NGJzZFByb2Nlc3NMdW1hRGMoaTMyICpkYXRhLCB1MzIgcXApOwotdm9pZCBoMjY0YnNkUHJvY2Vzc0Nocm9tYURjKGkzMiAqZGF0YSwgdTMyIHFwKTsKLQotI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfVFJBTlNGT1JNX0ggKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3V0aWwuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF91dGlsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiOTdhMjguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3V0aWwuYworKysgL2Rldi9udWxsCkBAIC0xLDI4NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0gICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0gICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLSAgICAgNS4gRnVuY3Rpb25zCi0gICAgICAgICAgaDI2NGJzZENvdW50TGVhZGluZ1plcm9zCi0gICAgICAgICAgaDI2NGJzZFJic3BUcmFpbGluZ0JpdHMKLSAgICAgICAgICBoMjY0YnNkTW9yZVJic3BEYXRhCi0gICAgICAgICAgaDI2NGJzZE5leHRNYkFkZHJlc3MKLSAgICAgICAgICBoMjY0YnNkU2V0Q3VyckltYWdlTWJQb2ludGVycwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBsb29rLXVwIHRhYmxlIGZvciBleHBlY3RlZCB2YWx1ZXMgb2Ygc3R1ZmZpbmcgYml0cyAqLwotc3RhdGljIGNvbnN0IHUzMiBzdHVmZmluZ1RhYmxlWzhdID0gezB4MSwweDIsMHg0LDB4OCwweDEwLDB4MjAsMHg0MCwweDgwfTsKLQotLyogbG9vay11cCB0YWJsZSBmb3IgY2hyb21hIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYXMgYSBmdW5jdGlvbiBvZiBsdW1hIFFQICovCi1jb25zdCB1MzIgaDI2NGJzZFFwQ1s1Ml0gPSB7MCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOSwKLSAgICAyMCwyMSwyMiwyMywyNCwyNSwyNiwyNywyOCwyOSwyOSwzMCwzMSwzMiwzMiwzMywzNCwzNCwzNSwzNSwzNiwzNiwzNywzNywzNywKLSAgICAzOCwzOCwzOCwzOSwzOSwzOSwzOX07Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgNS4xICBGdW5jdGlvbjogaDI2NGJzZENvdW50TGVhZGluZ1plcm9zCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIENvdW50IGxlYWRpbmcgemVyb3MgaW4gYSBjb2RlIHdvcmQuIENvZGUgd29yZCBpcyBhc3N1bWVkIHRvIGJlCi0gICAgICAgICAgICByaWdodC1hbGlnbmVkLCBsYXN0IGJpdCBvZiB0aGUgY29kZSB3b3JkIGluIHRoZSBsc2Igb2YgdGhlIHZhbHVlLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHZhbHVlICAgY29kZSB3b3JkCi0gICAgICAgICAgICBsZW5ndGggIG51bWJlciBvZiBiaXRzIGluIHRoZSBjb2RlIHdvcmQKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgbm9uZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBudW1iZXIgb2YgbGVhZGluZyB6ZXJvcyBpbiB0aGUgY29kZSB3b3JkCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaWZuZGVmIEgyNjRERUNfTkVPTgotdTMyIGgyNjRic2RDb3VudExlYWRpbmdaZXJvcyh1MzIgdmFsdWUsIHUzMiBsZW5ndGgpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHplcm9zID0gMDsKLSAgICB1MzIgbWFzayA9IDEgPDwgKGxlbmd0aCAtIDEpOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQobGVuZ3RoIDw9IDMyKTsKLQotICAgIHdoaWxlIChtYXNrICYmICEodmFsdWUgJiBtYXNrKSkKLSAgICB7Ci0gICAgICAgIHplcm9zKys7Ci0gICAgICAgIG1hc2sgPj49IDE7Ci0gICAgfQotICAgIHJldHVybih6ZXJvcyk7Ci0KLX0KLSNlbmRpZgotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgNS4yICBGdW5jdGlvbjogaDI2NGJzZFJic3BUcmFpbGluZ0JpdHMKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgQ2hlY2sgUmF3IEJ5dGUgU3RyZWFtIFBheWxvYWQgKFJCU1ApIHRyYWlsaW5nIGJpdHMsIGkuZS4gc3R1ZmZpbmcuCi0gICAgICAgICAgICBSZXN0IG9mIHRoZSBjdXJyZW50IGJ5dGUgKHdob2xlIGJ5dGUgaWYgYWxscmVhZHkgYnl0ZSBhbGlnbmVkKQotICAgICAgICAgICAgaW4gdGhlIHN0cmVhbSBidWZmZXIgc2hhbGwgY29udGFpbiBhICcxJyBiaXQgZm9sbG93ZWQgYnkgemVybyBvcgotICAgICAgICAgICAgbW9yZSAnMCcgYml0cy4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwU3RybURhdGEgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBub25lCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEhBTlRST19PSyAgICAgIFJCU1AgdHJhaWxpbmcgYml0cyBmb3VuZAotICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgb3RoZXJ3aXNlCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkUmJzcFRyYWlsaW5nQml0cyhzdHJtRGF0YV90ICpwU3RybURhdGEpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHN0dWZmaW5nOwotICAgIHUzMiBzdHVmZmluZ0xlbmd0aDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKHBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkIDwgOCk7Ci0KLSAgICBzdHVmZmluZ0xlbmd0aCA9IDggLSBwU3RybURhdGEtPmJpdFBvc0luV29yZDsKLQotICAgIHN0dWZmaW5nID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCBzdHVmZmluZ0xlbmd0aCk7Ci0gICAgaWYgKHN0dWZmaW5nID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIGlmIChzdHVmZmluZyAhPSBzdHVmZmluZ1RhYmxlW3N0dWZmaW5nTGVuZ3RoIC0gMV0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIDUuMyAgRnVuY3Rpb246IGgyNjRic2RNb3JlUmJzcERhdGEKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgQ2hlY2sgaWYgdGhlcmUgaXMgbW9yZSBkYXRhIGluIHRoZSBjdXJyZW50IFJCU1AuIFRoZSBzdGFuZGFyZAotICAgICAgICAgICAgZGVmaW5lcyB0aGlzIGZ1bmN0aW9uIHNvIHRoYXQgdGhlcmUgaXMgbW9yZSBkYXRhIGlmCi0gICAgICAgICAgICAgICAgLW1vcmUgdGhhbiA4IGJpdHMgbGVmdCBvcgotICAgICAgICAgICAgICAgIC1sYXN0IGJpdHMgYXJlIG5vdCBSQlNQIHRyYWlsaW5nIGJpdHMKLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwU3RybURhdGEgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBub25lCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEhBTlRST19UUlVFICAgIHRoZXJlIGlzIG1vcmUgZGF0YQotICAgICAgICAgICAgSEFOVFJPX0ZBTFNFICAgbm8gbW9yZSBkYXRhCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkTW9yZVJic3BEYXRhKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgYml0czsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKHBTdHJtRGF0YS0+c3RybUJ1ZmZSZWFkQml0cyA8PSA4ICogcFN0cm1EYXRhLT5zdHJtQnVmZlNpemUpOwotCi0gICAgYml0cyA9IHBTdHJtRGF0YS0+c3RybUJ1ZmZTaXplICogOCAtIHBTdHJtRGF0YS0+c3RybUJ1ZmZSZWFkQml0czsKLQotICAgIGlmIChiaXRzID09IDApCi0gICAgICAgIHJldHVybihIQU5UUk9fRkFMU0UpOwotCi0gICAgaWYgKCAoYml0cyA+IDgpIHx8Ci0gICAgICAgICAoKGgyNjRic2RTaG93Qml0czMyKHBTdHJtRGF0YSk+PigzMi1iaXRzKSkgIT0gKDF1bCA8PCAoYml0cy0xKSkpICkKLSAgICAgICAgcmV0dXJuKEhBTlRST19UUlVFKTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybihIQU5UUk9fRkFMU0UpOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIDUuNCAgRnVuY3Rpb246IGgyNjRic2ROZXh0TWJBZGRyZXNzCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEdldCBhZGRyZXNzIG9mIHRoZSBuZXh0IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgc2xpY2UgZ3JvdXAuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFNsaWNlR3JvdXBNYXAgICAgICBzbGljZSBncm91cCBmb3IgZWFjaCBtYWNyb2Jsb2NrCi0gICAgICAgICAgICBwaWNTaXplSW5NYnMgICAgICAgIHNpemUgb2YgdGhlIHBpY3R1cmUKLSAgICAgICAgICAgIGN1cnJNYkFkZHIgICAgICAgICAgd2hlcmUgdG8gc3RhcnQKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgbm9uZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBhZGRyZXNzIG9mIHRoZSBuZXh0IG1hY3JvYmxvY2sKLSAgICAgICAgICAgIDAgICBpZiBub25lIG9mIHRoZSBmb2xsb3dpbmcgbWFjcm9ibG9ja3MgYmVsb25nIHRvIHNhbWUgc2xpY2UKLSAgICAgICAgICAgICAgICBncm91cCBhcyBjdXJyTWJBZGRyCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkTmV4dE1iQWRkcmVzcyh1MzIgKnBTbGljZUdyb3VwTWFwLCB1MzIgcGljU2l6ZUluTWJzLCB1MzIgY3Vyck1iQWRkcikKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaSwgc2xpY2VHcm91cDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTbGljZUdyb3VwTWFwKTsKLSAgICBBU1NFUlQocGljU2l6ZUluTWJzKTsKLSAgICBBU1NFUlQoY3Vyck1iQWRkciA8IHBpY1NpemVJbk1icyk7Ci0KLSAgICBzbGljZUdyb3VwID0gcFNsaWNlR3JvdXBNYXBbY3Vyck1iQWRkcl07Ci0KLSAgICBpID0gY3Vyck1iQWRkciArIDE7Ci0gICAgd2hpbGUgKChpIDwgcGljU2l6ZUluTWJzKSAmJiAocFNsaWNlR3JvdXBNYXBbaV0gIT0gc2xpY2VHcm91cCkpCi0gICAgewotICAgICAgICBpKys7Ci0gICAgfQotCi0gICAgaWYgKGkgPT0gcGljU2l6ZUluTWJzKQotICAgICAgICBpID0gMDsKLQotICAgIHJldHVybihpKTsKLQotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIDUuNSAgRnVuY3Rpb246IGgyNjRic2RTZXRDdXJySW1hZ2VNYlBvaW50ZXJzCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIFNldCBsdW1hIGFuZCBjaHJvbWEgcG9pbnRlcnMgaW4gaW1hZ2VfdCBmb3IgY3VycmVudCBNQgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIGltYWdlICAgICAgIEN1cnJlbnQgaW1hZ2UKLSAgICAgICAgICAgIG1iTnVtICAgICAgIG51bWJlciBvZiBjdXJyZW50IE1CCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIG5vbmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgbm9uZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgaDI2NGJzZFNldEN1cnJJbWFnZU1iUG9pbnRlcnMoaW1hZ2VfdCAqaW1hZ2UsIHUzMiBtYk51bSkKLXsKLSAgICB1MzIgd2lkdGgsIGhlaWdodDsKLSAgICB1MzIgcGljU2l6ZTsKLSAgICB1MzIgcm93LCBjb2w7Ci0gICAgdTMyIHRtcDsKLQotICAgIHdpZHRoID0gaW1hZ2UtPndpZHRoOwotICAgIGhlaWdodCA9IGltYWdlLT5oZWlnaHQ7Ci0gICAgcm93ID0gbWJOdW0gLyB3aWR0aDsKLSAgICBjb2wgPSBtYk51bSAlIHdpZHRoOwotCi0gICAgdG1wID0gcm93ICogd2lkdGg7Ci0gICAgcGljU2l6ZSA9IHdpZHRoICogaGVpZ2h0OwotCi0gICAgaW1hZ2UtPmx1bWEgPSAodTgqKShpbWFnZS0+ZGF0YSArIGNvbCAqIDE2ICsgdG1wICogMjU2KTsKLSAgICBpbWFnZS0+Y2IgPSAodTgqKShpbWFnZS0+ZGF0YSArIHBpY1NpemUgKiAyNTYgKyB0bXAgKiA2NCArIGNvbCAqIDgpOwotICAgIGltYWdlLT5jciA9ICh1OCopKGltYWdlLT5jYiArIHBpY1NpemUgKiA2NCk7Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3V0aWwuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF91dGlsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0M2NmODIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3V0aWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotICAgIDMuIERhdGEgdHlwZXMKLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgSDI2NFNXREVDX1VUSUxfSAotI2RlZmluZSBIMjY0U1dERUNfVVRJTF9ICi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZkZWYgX0FTU0VSVF9VU0VECi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgIkgyNjRTd0RlY0FwaS5oIgotCi0jaWYgZGVmaW5lZChfUkFOR0VfQ0hFQ0spIHx8IGRlZmluZWQoX0RFQlVHX1BSSU5UKSB8fCBkZWZpbmVkKF9FUlJPUl9QUklOVCkKLSNpbmNsdWRlIDxzdGRpby5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlICJiYXNldHlwZS5oIgotI2luY2x1ZGUgImgyNjRic2Rfc3RyZWFtLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9pbWFnZS5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jZGVmaW5lIEhBTlRST19PSyAgIDAKLSNkZWZpbmUgSEFOVFJPX05PSyAgMQotCi0jZGVmaW5lIEhBTlRST19UUlVFICAgICAoMSkKLSNkZWZpbmUgSEFOVFJPX0ZBTFNFICAgICgwKQotCi0jaWZuZGVmIE5VTEwKLSNkZWZpbmUgTlVMTCAwCi0jZW5kaWYKLQotI2RlZmluZSBNRU1PUllfQUxMT0NBVElPTl9FUlJPUiAweEZGRkYKLSNkZWZpbmUgUEFSQU1fU0VUX0VSUk9SIDB4RkZGMAotCi0vKiB2YWx1ZSB0byBiZSByZXR1cm5lZCBieSBHZXRCaXRzIGlmIHN0cmVhbSBidWZmZXIgaXMgZW1wdHkgKi8KLSNkZWZpbmUgRU5EX09GX1NUUkVBTSAweEZGRkZGRkZGVQotCi0jZGVmaW5lIEVNUFRZX1JFU0lEVUFMX0lORElDQVRPUiAweEZGRkZGRgotCi0vKiBtYWNybyB0byBtYXJrIGEgcmVzaWR1YWwgYmxvY2sgZW1wdHksIGkuZS4gY29udGFpbiB6ZXJvIGNvZWZmaWNpZW50cyAqLwotI2RlZmluZSBNQVJLX1JFU0lEVUFMX0VNUFRZKHJlc2lkdWFsKSAoKHJlc2lkdWFsKVswXSA9IEVNUFRZX1JFU0lEVUFMX0lORElDQVRPUikKLS8qIG1hY3JvIHRvIGNoZWNrIGlmIHJlc2lkdWFsIGJsb2NrIGlzIGVtcHR5ICovCi0jZGVmaW5lIElTX1JFU0lEVUFMX0VNUFRZKHJlc2lkdWFsKSAoKHJlc2lkdWFsKVswXSA9PSBFTVBUWV9SRVNJRFVBTF9JTkRJQ0FUT1IpCi0KLS8qIG1hY3JvIGZvciBhc3NlcnRpb24sIHVzZWQgb25seSBpZiBjb21waWxlciBmbGFnIF9BU1NFUlRfVVNFRCBpcyBkZWZpbmVkICovCi0jaWZkZWYgX0FTU0VSVF9VU0VECi0jZGVmaW5lIEFTU0VSVChleHByKSBhc3NlcnQoZXhwcikKLSNlbHNlCi0jZGVmaW5lIEFTU0VSVChleHByKQotI2VuZGlmCi0KLS8qIG1hY3JvIGZvciByYW5nZSBjaGVja2luZyBhbiB2YWx1ZSwgdXNlZCBvbmx5IGlmIGNvbXBpbGVyIGZsYWcgX1JBTkdFX0NIRUNLCi0gKiBpcyBkZWZpbmVkICovCi0jaWZkZWYgX1JBTkdFX0NIRUNLCi0jZGVmaW5lIFJBTkdFX0NIRUNLKHZhbHVlLCBtaW5Cb3VuZCwgbWF4Qm91bmQpIFwKLXsgXAotICAgIGlmICgodmFsdWUpIDwgKG1pbkJvdW5kKSB8fCAodmFsdWUpID4gKG1heEJvdW5kKSkgXAotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmc6IFZhbHVlIGV4Y2VlZHMgZ2l2ZW4gbGltaXQocykhXG4iKTsgXAotfQotI2Vsc2UKLSNkZWZpbmUgUkFOR0VfQ0hFQ0sodmFsdWUsIG1pbkJvdW5kLCBtYXhCb3VuZCkKLSNlbmRpZgotCi0vKiBtYWNybyBmb3IgcmFuZ2UgY2hlY2tpbmcgYW4gYXJyYXksIHVzZWQgb25seSBpZiBjb21waWxlciBmbGFnIF9SQU5HRV9DSEVDSwotICogaXMgZGVmaW5lZCAqLwotI2lmZGVmIF9SQU5HRV9DSEVDSwotI2RlZmluZSBSQU5HRV9DSEVDS19BUlJBWShhcnJheSwgbWluQm91bmQsIG1heEJvdW5kLCBsZW5ndGgpIFwKLXsgXAotICAgIGkzMiBpOyBcCi0gICAgZm9yIChpID0gMDsgaSA8IChsZW5ndGgpOyBpKyspIFwKLSAgICAgICAgaWYgKChhcnJheSlbaV0gPCAobWluQm91bmQpIHx8IChhcnJheSlbaV0gPiAobWF4Qm91bmQpKSBcCi0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiV2FybmluZzogVmFsdWUgWyVkXSBleGNlZWRzIGdpdmVuIGxpbWl0KHMpIVxuIixpKTsgXAotfQotI2Vsc2UKLSNkZWZpbmUgUkFOR0VfQ0hFQ0tfQVJSQVkoYXJyYXksIG1pbkJvdW5kLCBtYXhCb3VuZCwgbGVuZ3RoKQotI2VuZGlmCi0KLS8qIG1hY3JvIGZvciBkZWJ1ZyBwcmludGluZywgdXNlZCBvbmx5IGlmIGNvbXBpbGVyIGZsYWcgX0RFQlVHX1BSSU5UIGlzCi0gKiBkZWZpbmVkICovCi0jaWZkZWYgX0RFQlVHX1BSSU5UCi0jZGVmaW5lIERFQlVHKGFyZ3MpIHByaW50ZiBhcmdzCi0jZWxzZQotI2RlZmluZSBERUJVRyhhcmdzKQotI2VuZGlmCi0KLS8qIG1hY3JvIGZvciBlcnJvciBwcmludGluZywgdXNlZCBvbmx5IGlmIGNvbXBpbGVyIGZsYWcgX0VSUk9SX1BSSU5UIGlzCi0gKiBkZWZpbmVkICovCi0jaWZkZWYgX0VSUk9SX1BSSU5UCi0jZGVmaW5lIEVQUklOVChtc2cpIGZwcmludGYoc3RkZXJyLCJFUlJPUjogJXNcbiIsbXNnKQotI2Vsc2UKLSNkZWZpbmUgRVBSSU5UKG1zZykKLSNlbmRpZgotCi0vKiBtYWNybyB0byBnZXQgc21hbGxlciBvZiB0d28gdmFsdWVzICovCi0jZGVmaW5lIE1JTihhLCBiKSAoKChhKSA8IChiKSkgPyAoYSkgOiAoYikpCi0KLS8qIG1hY3JvIHRvIGdldCBncmVhdGVyIG9mIHR3byB2YWx1ZXMgKi8KLSNkZWZpbmUgTUFYKGEsIGIpICgoKGEpID4gKGIpKSA/IChhKSA6IChiKSkKLQotLyogbWFjcm8gdG8gZ2V0IGFic29sdXRlIHZhbHVlICovCi0jZGVmaW5lIEFCUyhhKSAoKChhKSA8IDApID8gLShhKSA6IChhKSkKLQotLyogbWFjcm8gdG8gY2xpcCBhIHZhbHVlIHosIHNvIHRoYXQgeCA8PSB6ID08IHkgKi8KLSNkZWZpbmUgQ0xJUDMoeCx5LHopICgoKHopIDwgKHgpKSA/ICh4KSA6ICgoKHopID4gKHkpKSA/ICh5KSA6ICh6KSkpCi0KLS8qIG1hY3JvIHRvIGNsaXAgYSB2YWx1ZSB6LCBzbyB0aGF0IDAgPD0geiA9PCAyNTUgKi8KLSNkZWZpbmUgQ0xJUDEoeikgKCgoeikgPCAwKSA/IDAgOiAoKCh6KSA+IDI1NSkgPyAyNTUgOiAoeikpKQotCi0vKiBtYWNybyB0byBhbGxvY2F0ZSBtZW1vcnkgKi8KLSNkZWZpbmUgQUxMT0NBVEUocHRyLCBjb3VudCwgdHlwZSkgXAoteyBcCi0gICAgKHB0cikgPSBIMjY0U3dEZWNNYWxsb2Moc2l6ZW9mKHR5cGUpLCAoY291bnQpKTsgXAotfQotCi0vKiBtYWNybyB0byBmcmVlIGFsbG9jYXRlZCBtZW1vcnkgKi8KLSNkZWZpbmUgRlJFRShwdHIpIFwKLXsgXAotICAgIEgyNjRTd0RlY0ZyZWUoKHB0cikpOyAocHRyKSA9IE5VTEw7IFwKLX0KLQotI2RlZmluZSBBTElHTihwdHIsIGJ5dGVQb3MpIFwKLSAgICAgICAgKChwdHIpICsgKCAoKChieXRlUG9zKSAtICh1aW50cHRyX3QpKHB0cikpICYgKChieXRlUG9zKSAtIDEpKSAvIHNpemVvZigqKHB0cikpICkpCi0KLWV4dGVybiBjb25zdCB1MzIgaDI2NGJzZFFwQ1s1Ml07Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gRGF0YSB0eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmbmRlZiBIMjY0REVDX05FT04KLXUzMiBoMjY0YnNkQ291bnRMZWFkaW5nWmVyb3ModTMyIHZhbHVlLCB1MzIgbGVuZ3RoKTsKLSNlbHNlCi11MzIgaDI2NGJzZENvdW50TGVhZGluZ1plcm9zKHUzMiB2YWx1ZSk7Ci0jZW5kaWYKLXUzMiBoMjY0YnNkUmJzcFRyYWlsaW5nQml0cyhzdHJtRGF0YV90ICpzdHJtRGF0YSk7Ci0KLXUzMiBoMjY0YnNkTW9yZVJic3BEYXRhKHN0cm1EYXRhX3QgKnN0cm1EYXRhKTsKLQotdTMyIGgyNjRic2ROZXh0TWJBZGRyZXNzKHUzMiAqcFNsaWNlR3JvdXBNYXAsIHUzMiBwaWNTaXplSW5NYnMsIHUzMiBjdXJyTWJBZGRyKTsKLQotdm9pZCBoMjY0YnNkU2V0Q3VyckltYWdlTWJQb2ludGVycyhpbWFnZV90ICppbWFnZSwgdTMyIG1iTnVtKTsKLQotI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfVVRJTF9IICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF92bGMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF92bGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYwZjM1ZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdmxjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotICAgICAzLiBNb2R1bGUgZGVmaW5lcwotICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0gICAgIDUuIEZ1bmN0aW9ucwotICAgICAgICAgIGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZAotICAgICAgICAgIGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQKLSAgICAgICAgICBoMjY0YnNkRGVjb2RlRXhwR29sb21iTWFwcGVkCi0gICAgICAgICAgaDI2NGJzZERlY29kZUV4cEdvbG9tYlRydW5jYXRlZAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImgyNjRic2RfdmxjLmgiCi0jaW5jbHVkZSAiYmFzZXR5cGUuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3N0cmVhbS5oIgotI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBkZWZpbml0aW9uIG9mIHNwZWNpYWwgY29kZSBudW0sIHRoaXMgYWxvbmcgd2l0aCB0aGUgcmV0dXJuIHZhbHVlIGlzIHVzZWQKLSAqIHRvIGhhbmRsZSBjb2RlIG51bSBpbiB0aGUgcmFuZ2UgWzAsIDJeMzJdIGluIHRoZSBEZWNvZGVFeHBHb2xvbWJVbnNpZ25lZAotICogZnVuY3Rpb24gKi8KLSNkZWZpbmUgQklHX0NPREVfTlVNIDB4RkZGRkZGRkZVCi0KLS8qIE1hcHBpbmcgdGFibGVzIGZvciBjb2RlZF9ibG9ja19wYXR0ZXJuLCB1c2VkIGZvciBkZWNvZGluZyBvZiBtYXBwZWQKLSAqIEV4cC1Hb2xvbWIgY29kZXMgKi8KLXN0YXRpYyBjb25zdCB1OCBjb2RlZEJsb2NrUGF0dGVybkludHJhNHg0WzQ4XSA9IHsKLSAgICA0NywzMSwxNSwwLDIzLDI3LDI5LDMwLDcsMTEsMTMsMTQsMzksNDMsNDUsNDYsMTYsMyw1LDEwLDEyLDE5LDIxLDI2LDI4LDM1LAotICAgIDM3LDQyLDQ0LDEsMiw0LDgsMTcsMTgsMjAsMjQsNiw5LDIyLDI1LDMyLDMzLDM0LDM2LDQwLDM4LDQxfTsKLQotc3RhdGljIGNvbnN0IHU4IGNvZGVkQmxvY2tQYXR0ZXJuSW50ZXJbNDhdID0gewotICAgIDAsMTYsMSwyLDQsOCwzMiwzLDUsMTAsMTIsMTUsNDcsNywxMSwxMywxNCw2LDksMzEsMzUsMzcsNDIsNDQsMzMsMzQsMzYsNDAsCi0gICAgMzksNDMsNDUsNDYsMTcsMTgsMjAsMjQsMTksMjEsMjYsMjgsMjMsMjcsMjksMzAsMjIsMjUsMzgsNDF9OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIDUuMSAgRnVuY3Rpb246IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBEZWNvZGUgdW5zaWduZWQgRXhwLUdvbG9tYiBjb2RlLiBUaGlzIGlzIHRoZSBzYW1lIGFzIGNvZGVOdW0gdXNlZAotICAgICAgICAgICAgaW4gb3RoZXIgRXhwLUdvbG9tYiBjb2RlIG1hcHBpbmdzLiBDb2RlIG51bSAoaS5lLiB0aGUgZGVjb2RlZAotICAgICAgICAgICAgc3ltYm9sKSBpcyBkZXRlcm1pbmVkIGFzCi0KLSAgICAgICAgICAgICAgICBjb2RlTnVtID0gMl5sZWFkaW5nWmVyb3MgLSAxICsgR2V0Qml0cyhsZWFkaW5nWmVyb3MpCi0KLSAgICAgICAgICAgIE5vcm1hbCBkZWNvZGVkIHN5bWJvbHMgYXJlIGluIHRoZSByYW5nZSBbMCwgMl4zMiAtIDJdLiBTeW1ib2wKLSAgICAgICAgICAgIDJeMzItMSBpcyBpbmRpY2F0ZWQgYnkgQklHX0NPREVfTlVNIHdpdGggcmV0dXJuIHZhbHVlIEhBTlRST19PSwotICAgICAgICAgICAgd2hpbGUgc3ltYm9sIDJeMzIgIGlzIGluZGljYXRlZCBieSBCSUdfQ09ERV9OVU0gd2l0aCByZXR1cm4gdmFsdWUKLSAgICAgICAgICAgIEhBTlRST19OT0suICBUaGVzZSB0d28gc3ltYm9scyBhcmUgc3BlY2lhbCBjYXNlcyB3aXRoIGNvZGUgbGVuZ3RoCi0gICAgICAgICAgICBvZiA2NSwgaS5lLiAgMzIgJzAnIGJpdHMsIGEgJzEnIGJpdCwgYW5kIGVpdGhlciAwIG9yIDEgcmVwcmVzZW50ZWQKLSAgICAgICAgICAgIGJ5IDMyIGJpdHMuCi0KLSAgICAgICAgICAgIFN5bWJvbCAyXjMyIGlzIG91dCBvZiB1bnNpZ25lZCAzMi1iaXQgcmFuZ2UgYnV0IGlzIG5lZWRlZCBmb3IKLSAgICAgICAgICAgIERlY29kZUV4cEdvbG9tYlNpZ25lZCB0byBleHByZXNzIHZhbHVlIC0yXjMxLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBjb2RlTnVtICAgICAgICAgZGVjb2RlZCBjb2RlIHdvcmQgaXMgc3RvcmVkIGhlcmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKLSAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBmYWlsdXJlLCBubyB2YWxpZCBjb2RlIHdvcmQgZm91bmQsIG5vdGUgZXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBCSUdfQ09ERV9OVU0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChzdHJtRGF0YV90ICpwU3RybURhdGEsIHUzMiAqY29kZU51bSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgYml0cywgbnVtWmVyb3M7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVChjb2RlTnVtKTsKLQotICAgIGJpdHMgPSBoMjY0YnNkU2hvd0JpdHMzMihwU3RybURhdGEpOwotCi0gICAgLyogZmlyc3QgYml0IGlzIDEgLT4gY29kZSBsZW5ndGggMSAqLwotICAgIGlmIChiaXRzID49IDB4ODAwMDAwMDApCi0gICAgewotICAgICAgICBoMjY0YnNkRmx1c2hCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgICAgICpjb2RlTnVtID0gMDsKLSAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7Ci0gICAgfQotICAgIC8qIHNlY29uZCBiaXQgaXMgMSAtPiBjb2RlIGxlbmd0aCAzICovCi0gICAgZWxzZSBpZiAoYml0cyA+PSAweDQwMDAwMDAwKQotICAgIHsKLSAgICAgICAgaWYgKGgyNjRic2RGbHVzaEJpdHMocFN0cm1EYXRhLCAzKSA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAqY29kZU51bSA9IDEgKyAoKGJpdHMgPj4gMjkpICYgMHgxKTsKLSAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7Ci0gICAgfQotICAgIC8qIHRoaXJkIGJpdCBpcyAxIC0+IGNvZGUgbGVuZ3RoIDUgKi8KLSAgICBlbHNlIGlmIChiaXRzID49IDB4MjAwMDAwMDApCi0gICAgewotICAgICAgICBpZiAoaDI2NGJzZEZsdXNoQml0cyhwU3RybURhdGEsIDUpID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICpjb2RlTnVtID0gMyArICgoYml0cyA+PiAyNykgJiAweDMpOwotICAgICAgICByZXR1cm4oSEFOVFJPX09LKTsKLSAgICB9Ci0gICAgLyogZm91cnRoIGJpdCBpcyAxIC0+IGNvZGUgbGVuZ3RoIDcgKi8KLSAgICBlbHNlIGlmIChiaXRzID49IDB4MTAwMDAwMDApCi0gICAgewotICAgICAgICBpZiAoaDI2NGJzZEZsdXNoQml0cyhwU3RybURhdGEsIDcpID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICpjb2RlTnVtID0gNyArICgoYml0cyA+PiAyNSkgJiAweDcpOwotICAgICAgICByZXR1cm4oSEFOVFJPX09LKTsKLSAgICB9Ci0gICAgLyogb3RoZXIgY29kZSBsZW5ndGhzICovCi0gICAgZWxzZQotICAgIHsKLSNpZm5kZWYgSDI2NERFQ19ORU9OCi0gICAgICAgIG51bVplcm9zID0gNCArIGgyNjRic2RDb3VudExlYWRpbmdaZXJvcyhiaXRzLCAyOCk7Ci0jZWxzZQotICAgICAgICBudW1aZXJvcyA9IGgyNjRic2RDb3VudExlYWRpbmdaZXJvcyhiaXRzKTsKLSNlbmRpZgotICAgICAgICAvKiBhbGwgMzIgYml0cyBhcmUgemVybyAqLwotICAgICAgICBpZiAobnVtWmVyb3MgPT0gMzIpCi0gICAgICAgIHsKLSAgICAgICAgICAgICpjb2RlTnVtID0gMDsKLSAgICAgICAgICAgIGgyNjRic2RGbHVzaEJpdHMocFN0cm1EYXRhLDMyKTsKLSAgICAgICAgICAgIGJpdHMgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgICAgICAgICAgLyogY2hlY2sgMzNyZCBiaXQsIG11c3QgYmUgMSAqLwotICAgICAgICAgICAgaWYgKGJpdHMgPT0gMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBjYW5ub3QgdXNlIGgyNjRic2RHZXRCaXRzLCBsaW1pdGVkIHRvIDMxIGJpdHMgKi8KLSAgICAgICAgICAgICAgICBiaXRzID0gaDI2NGJzZFNob3dCaXRzMzIocFN0cm1EYXRhKTsKLSAgICAgICAgICAgICAgICBpZiAoaDI2NGJzZEZsdXNoQml0cyhwU3RybURhdGEsIDMyKSA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgLyogY29kZSBudW0gMl4zMiAtIDEsIG5lZWRlZCBmb3IgdW5zaWduZWQgbWFwcGluZyAqLwotICAgICAgICAgICAgICAgIGlmIChiaXRzID09IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAqY29kZU51bSA9IEJJR19DT0RFX05VTTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIGNvZGUgbnVtIDJeMzIsIG5lZWRlZCBmb3IgdW5zaWduZWQgbWFwcGluZwotICAgICAgICAgICAgICAgICAqIChyZXN1bHRzIGluIC0yXjMxKSAqLwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJpdHMgPT0gMSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICpjb2RlTnVtID0gQklHX0NPREVfTlVNOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogaWYgbW9yZSB6ZXJvcyB0aGFuIDMyLCBpdCBpcyBhbiBlcnJvciAqLwotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGgyNjRic2RGbHVzaEJpdHMocFN0cm1EYXRhLG51bVplcm9zKzEpOwotCi0gICAgICAgIGJpdHMgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIG51bVplcm9zKTsKLSAgICAgICAgaWYgKGJpdHMgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgICAgICAqY29kZU51bSA9ICgxIDw8IG51bVplcm9zKSAtIDEgKyBiaXRzOwotCi0gICAgfQotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgNS4yICBGdW5jdGlvbjogaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBEZWNvZGUgc2lnbmVkIEV4cC1Hb2xvbWIgY29kZS4gQ29kZSBudW0gaXMgZGV0ZXJtaW5lZCBieQotICAgICAgICAgICAgaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkIGFuZCB0aGVuIG1hcHBlZCB0byBzaWduZWQKLSAgICAgICAgICAgIHJlcHJlc2VudGF0aW9uIGFzCi0KLSAgICAgICAgICAgICAgICBzeW1ib2wgPSAoLTEpXihjb2RlTnVtKzEpICogKGNvZGVOdW0rMSkvMgotCi0gICAgICAgICAgICBTaWduZWQgc3ltYm9scyBzaGFsbCBiZSBpbiB0aGUgcmFuZ2UgWy0yXjMxLCAyXjMxIC0gMV0uIFN5bWJvbAotICAgICAgICAgICAgLTJeMzEgaXMgb2J0YWluZWQgd2hlbiBjb2RlTnVtIGlzIDJeMzIsIHdoaWNoIGNhbm5vdCBiZSBleHByZXNzZWQKLSAgICAgICAgICAgIGJ5IHVuc2lnbmVkIDMyLWJpdCB2YWx1ZS4gVGhpcyBpcyBzaWduYWxlZCBhcyBhIHNwZWNpYWwgY2FzZSBmcm9tCi0gICAgICAgICAgICB0aGUgaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkIGJ5IHNldHRpbmcgY29kZU51bSB0bwotICAgICAgICAgICAgQklHX0NPREVfTlVNIGFuZCByZXR1cm5pbmcgSEFOVFJPX05PSyBzdGF0dXMuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIHZhbHVlICAgICAgICAgICBkZWNvZGVkIGNvZGUgd29yZCBpcyBzdG9yZWQgaGVyZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcwotICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIGZhaWx1cmUsIG5vIHZhbGlkIGNvZGUgd29yZCBmb3VuZAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChzdHJtRGF0YV90ICpwU3RybURhdGEsIGkzMiAqdmFsdWUpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHN0YXR1cywgY29kZU51bSA9IDA7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVCh2YWx1ZSk7Ci0KLSAgICBzdGF0dXMgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmY29kZU51bSk7Ci0KLSAgICBpZiAoY29kZU51bSA9PSBCSUdfQ09ERV9OVU0pCi0gICAgewotICAgICAgICAvKiBCSUdfQ09ERV9OVU0gYW5kIEhBTlRST19PSyBzdGF0dXMgbWVhbnMgY29kZU51bSAyXjMyLTEgd2hpY2ggd291bGQKLSAgICAgICAgICogcmVzdWx0IGluIHNpZ25lZCBpbnRlZ2VyIHZhbHVlZCAyXjMxIChpLmUuIG91dCBvZiAzMi1iaXQgc2lnbmVkCi0gICAgICAgICAqIGludGVnZXIgcmFuZ2UpICovCi0gICAgICAgIGlmIChzdGF0dXMgPT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAvKiBCSUdfQ09ERV9OVU0gYW5kIEhBTlRST19OT0sgc3RhdHVzIG1lYW5zIGNvZGVOdW0gMl4zMiB3aGljaCByZXN1bHRzCi0gICAgICAgICAqIGluIHNpZ25lZCBpbnRlZ2VyIHZhbHVlZCAtMl4zMSAqLwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgICp2YWx1ZSA9IChpMzIpKDIxNDc0ODM2NDhVKTsKLSAgICAgICAgICAgIHJldHVybiAoSEFOVFJPX09LKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChzdGF0dXMgPT0gSEFOVFJPX09LKQotICAgIHsKLSAgICAgICAgLyogKC0xKV4oY29kZU51bSsxKSByZXN1bHRzIGluIHBvc2l0aXZlIHNpZ24gaWYgY29kZU51bSBpcyBvZGQsCi0gICAgICAgICAqIG5lZ2F0aXZlIHdoZW4gaXQgaXMgZXZlbi4gKGNvZGVOdW0rMSkvMiBpcyBvYnRhaW5lZCBhcwotICAgICAgICAgKiAoY29kZU51bSsxKT4+MSB3aGVuIHZhbHVlIGlzIHBvc2l0aXZlIGFuZCBhcyAoLWNvZGVOdW0pPj4xIGZvcgotICAgICAgICAgKiBuZWdhdGl2ZSB2YWx1ZSAqLwotICAgICAgICAvKmxpbnQgLWU3MDIgKi8KLSAgICAgICAgKnZhbHVlID0gKGNvZGVOdW0gJiAweDEpID8gKGkzMikoKGNvZGVOdW0gKyAxKSA+PiAxKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShpMzIpKChjb2RlTnVtICsgMSkgPj4gMSk7Ci0gICAgICAgIC8qbGludCArZTcwMiAqLwotICAgICAgICByZXR1cm4oSEFOVFJPX09LKTsKLSAgICB9Ci0KLSAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgNS4zICBGdW5jdGlvbjogaDI2NGJzZERlY29kZUV4cEdvbG9tYk1hcHBlZAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBEZWNvZGUgbWFwcGVkIEV4cC1Hb2xvbWIgY29kZS4gQ29kZSBudW0gaXMgZGV0ZXJtaW5lZCBieQotICAgICAgICAgICAgaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkIGFuZCB0aGVuIG1hcHBlZCB0byBjb2RlZEJsb2NrUGF0dGVybgotICAgICAgICAgICAgZWl0aGVyIGZvciBpbnRyYSBvciBpbnRlciBtYWNyb2Jsb2NrLiBUaGUgbWFwcGluZyBpcyBpbXBsZW1lbnRlZCBieQotICAgICAgICAgICAgbG9vay11cCB0YWJsZXMgZGVmaW5lZCBpbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQotICAgICAgICAgICAgaXNJbnRyYSAgICAgICAgIGZsYWcgdG8gaW5kaWNhdGUgaWYgaW50cmEgb3IgaW50ZXIgbWFwcGluZyBpcyB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHVzZWQKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgdmFsdWUgICAgICAgICAgIGRlY29kZWQgY29kZSB3b3JkIGlzIHN0b3JlZCBoZXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCi0gICAgICAgICAgICBIQU5UUk9fTk9LICAgICAgZmFpbHVyZSwgbm8gdmFsaWQgY29kZSB3b3JkIGZvdW5kCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkRGVjb2RlRXhwR29sb21iTWFwcGVkKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgdTMyICp2YWx1ZSwKLSAgICB1MzIgaXNJbnRyYSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgc3RhdHVzLCBjb2RlTnVtOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQodmFsdWUpOwotCi0gICAgc3RhdHVzID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJmNvZGVOdW0pOwotCi0gICAgaWYgKHN0YXR1cyAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybiAoSEFOVFJPX05PSyk7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogcmFuZ2Ugb2YgdmFsaWQgY29kZU51bXMgWzAsNDddICovCi0gICAgICAgIGlmIChjb2RlTnVtID4gNDcpCi0gICAgICAgICAgICByZXR1cm4gKEhBTlRST19OT0spOwotICAgICAgICBpZiAoaXNJbnRyYSkKLSAgICAgICAgICAgICp2YWx1ZSA9IGNvZGVkQmxvY2tQYXR0ZXJuSW50cmE0eDRbY29kZU51bV07Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICp2YWx1ZSA9IGNvZGVkQmxvY2tQYXR0ZXJuSW50ZXJbY29kZU51bV07Ci0gICAgICAgIHJldHVybihIQU5UUk9fT0spOwotICAgIH0KLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICA1LjQgIEZ1bmN0aW9uOiBoMjY0YnNkRGVjb2RlRXhwR29sb21iVHJ1bmNhdGVkCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIERlY29kZSB0cnVuY2F0ZWQgRXhwLUdvbG9tYiBjb2RlLiBncmVhdGVyVGhhbk9uZSBmbGFnIGluZGljYXRlcwotICAgICAgICAgICAgdGhlIHJhbmdlIG9mIHRoZSBzeW1ib2wgdG8gYmUgZGVjb2RlZCBhcyBmb2xsb3dzOgotICAgICAgICAgICAgICAgIEZBTFNFICAgLT4gIFswLDFdCi0gICAgICAgICAgICAgICAgVFJVRSAgICAtPiAgWzAsMl4zMi0xXQotCi0gICAgICAgICAgICBJZiBmbGFnIGlzIGZhbHNlIHRoZSBkZWNvZGluZyBpcyBwZXJmb3JtZWQgYnkgcmVhZGluZyBvbmUgYml0Ci0gICAgICAgICAgICBmcm9tIHRoZSBzdHJlYW0gd2l0aCBoMjY0YnNkR2V0Qml0cyBhbmQgbWFwcGluZyB0aGlzIHRvIGRlY29kZWQKLSAgICAgICAgICAgIHN5bWJvbCBhcwotICAgICAgICAgICAgICAgIHN5bWJvbCA9IGJpdCA/IDAgOiAxCi0KLSAgICAgICAgICAgIE90aGVyd2lzZSwgaS5lLiB3aGVuIGZsYWcgaXMgVFJVRSwgY29kZSBudW0gaXMgZGV0ZXJtaW5lZCBieQotICAgICAgICAgICAgaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkIGFuZCB0aGlzIGlzIHVzZWQgYXMgdGhlIGRlY29kZWQKLSAgICAgICAgICAgIHN5bWJvbC4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwU3RybURhdGEgICAgICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKLSAgICAgICAgICAgIGdyZWF0ZXJUaGFuT25lICBmbGFnIHRvIGluZGljYXRlIGlmIHJhbmdlIGlzIHdpZGVyIHRoYW4gWzAsMV0KLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgdmFsdWUgICAgICAgICAgIGRlY29kZWQgY29kZSB3b3JkIGlzIHN0b3JlZCBoZXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCi0gICAgICAgICAgICBIQU5UUk9fTk9LICAgICAgZmFpbHVyZSwgbm8gdmFsaWQgY29kZSB3b3JkIGZvdW5kCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkRGVjb2RlRXhwR29sb21iVHJ1bmNhdGVkKAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHUzMiAqdmFsdWUsCi0gIHUzMiBncmVhdGVyVGhhbk9uZSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVCh2YWx1ZSk7Ci0KLSAgICBpZiAoZ3JlYXRlclRoYW5PbmUpCi0gICAgewotICAgICAgICByZXR1cm4oaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgdmFsdWUpKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgKnZhbHVlID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLDEpOwotICAgICAgICBpZiAoKnZhbHVlID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICByZXR1cm4gKEhBTlRST19OT0spOwotICAgICAgICAqdmFsdWUgXj0gMHgxOwotICAgIH0KLQotICAgIHJldHVybiAoSEFOVFJPX09LKTsKLQotfQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdmxjLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdmxjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjMTY3NzMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3ZsYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLSAgICAzLiBEYXRhIHR5cGVzCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIEgyNjRTV0RFQ19WTENfSAotI2RlZmluZSBIMjY0U1dERUNfVkxDX0gKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJiYXNldHlwZS5oIgotI2luY2x1ZGUgImgyNjRic2Rfc3RyZWFtLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF90cmFuc2Zvcm0uaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIERhdGEgdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChzdHJtRGF0YV90ICpwU3RybURhdGEsIHUzMiAqdmFsdWUpOwotCi11MzIgaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChzdHJtRGF0YV90ICpwU3RybURhdGEsIGkzMiAqdmFsdWUpOwotCi11MzIgaDI2NGJzZERlY29kZUV4cEdvbG9tYk1hcHBlZChzdHJtRGF0YV90ICpwU3RybURhdGEsIHUzMiAqdmFsdWUsCi0gICAgdTMyIGlzSW50cmEpOwotCi11MzIgaDI2NGJzZERlY29kZUV4cEdvbG9tYlRydW5jYXRlZChzdHJtRGF0YV90ICpwU3RybURhdGEsIHUzMiAqdmFsdWUsCi0gICAgdTMyIGdyZWF0ZXJUaGFuT25lKTsKLQotI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfVkxDX0ggKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3Z1aS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3Z1aS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTkzMzVhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF92dWkuYworKysgL2Rldi9udWxsCkBAIC0xLDQ5MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0gICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0gICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLSAgICAgNS4gRnVuY3Rpb25zCi0gICAgICAgICAgaDI2NGJzZERlY29kZVZ1aVBhcmFtZXRlcnMKLSAgICAgICAgICBEZWNvZGVIcmRQYXJhbWV0ZXJzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiaDI2NGJzZF92dWkuaCIKLSNpbmNsdWRlICJiYXNldHlwZS5oIgotI2luY2x1ZGUgImgyNjRic2RfdmxjLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9zdHJlYW0uaCIKLSNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2RlZmluZSBNQVhfRFBCX1NJWkUgMTYKLSNkZWZpbmUgTUFYX0JSICAgICAgIDI0MDAwMCAvKiBmb3IgbGV2ZWwgNS4xICovCi0jZGVmaW5lIE1BWF9DUEIgICAgICAyNDAwMDAgLyogZm9yIGxldmVsIDUuMSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1MzIgRGVjb2RlSHJkUGFyYW1ldGVycygKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBocmRQYXJhbWV0ZXJzX3QgKnBIcmRQYXJhbWV0ZXJzKTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkRGVjb2RlVnVpUGFyYW1ldGVycwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBEZWNvZGUgVlVJIHBhcmFtZXRlcnMgZnJvbSB0aGUgc3RyZWFtLiBTZWUgc3RhbmRhcmQgZm9yIGRldGFpbHMuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIHBWdWlQYXJhbWV0ZXJzICBkZWNvZGVkIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBoZXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCi0gICAgICAgICAgICBIQU5UUk9fTk9LICAgICAgaW52YWxpZCBzdHJlYW0gZGF0YSBvciBlbmQgb2Ygc3RyZWFtCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkRGVjb2RlVnVpUGFyYW1ldGVycyhzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gICAgdnVpUGFyYW1ldGVyc190ICpwVnVpUGFyYW1ldGVycykKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQocFZ1aVBhcmFtZXRlcnMpOwotCi0gICAgSDI2NFN3RGVjTWVtc2V0KHBWdWlQYXJhbWV0ZXJzLCAwLCBzaXplb2YodnVpUGFyYW1ldGVyc190KSk7Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIHBWdWlQYXJhbWV0ZXJzLT5hc3BlY3RSYXRpb1ByZXNlbnRGbGFnID0gKHRtcCA9PSAxKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotCi0gICAgaWYgKHBWdWlQYXJhbWV0ZXJzLT5hc3BlY3RSYXRpb1ByZXNlbnRGbGFnKQotICAgIHsKLSAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA4KTsKLSAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICBwVnVpUGFyYW1ldGVycy0+YXNwZWN0UmF0aW9JZGMgPSB0bXA7Ci0KLSAgICAgICAgaWYgKHBWdWlQYXJhbWV0ZXJzLT5hc3BlY3RSYXRpb0lkYyA9PSBBU1BFQ1RfUkFUSU9fRVhURU5ERURfU0FSKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDE2KTsKLSAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICBwVnVpUGFyYW1ldGVycy0+c2FyV2lkdGggPSB0bXA7Ci0KLSAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMTYpOwotICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5zYXJIZWlnaHQgPSB0bXA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIHBWdWlQYXJhbWV0ZXJzLT5vdmVyc2NhbkluZm9QcmVzZW50RmxhZyA9ICh0bXAgPT0gMSkgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgIGlmIChwVnVpUGFyYW1ldGVycy0+b3ZlcnNjYW5JbmZvUHJlc2VudEZsYWcpCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5vdmVyc2NhbkFwcHJvcHJpYXRlRmxhZyA9ICh0bXAgPT0gMSkgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLSAgICB9Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIHBWdWlQYXJhbWV0ZXJzLT52aWRlb1NpZ25hbFR5cGVQcmVzZW50RmxhZyA9ICh0bXAgPT0gMSkgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgIGlmIChwVnVpUGFyYW1ldGVycy0+dmlkZW9TaWduYWxUeXBlUHJlc2VudEZsYWcpCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDMpOwotICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIHBWdWlQYXJhbWV0ZXJzLT52aWRlb0Zvcm1hdCA9IHRtcDsKLQotICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIHBWdWlQYXJhbWV0ZXJzLT52aWRlb0Z1bGxSYW5nZUZsYWcgPSAodG1wID09IDEpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICBwVnVpUGFyYW1ldGVycy0+Y29sb3VyRGVzY3JpcHRpb25QcmVzZW50RmxhZyA9Ci0gICAgICAgICAgICAodG1wID09IDEpID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICAgICAgaWYgKHBWdWlQYXJhbWV0ZXJzLT5jb2xvdXJEZXNjcmlwdGlvblByZXNlbnRGbGFnKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDgpOwotICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5jb2xvdXJQcmltYXJpZXMgPSB0bXA7Ci0KLSAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgOCk7Ci0gICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPnRyYW5zZmVyQ2hhcmFjdGVyaXN0aWNzID0gdG1wOwotCi0gICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDgpOwotICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5tYXRyaXhDb2VmZmljaWVudHMgPSB0bXA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwVnVpUGFyYW1ldGVycy0+Y29sb3VyUHJpbWFyaWVzICAgICAgICAgPSAyOwotICAgICAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPnRyYW5zZmVyQ2hhcmFjdGVyaXN0aWNzID0gMjsKLSAgICAgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5tYXRyaXhDb2VmZmljaWVudHMgICAgICA9IDI7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPnZpZGVvRm9ybWF0ICAgICAgICAgICAgID0gNTsKLSAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPmNvbG91clByaW1hcmllcyAgICAgICAgID0gMjsKLSAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPnRyYW5zZmVyQ2hhcmFjdGVyaXN0aWNzID0gMjsKLSAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPm1hdHJpeENvZWZmaWNpZW50cyAgICAgID0gMjsKLSAgICB9Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIHBWdWlQYXJhbWV0ZXJzLT5jaHJvbWFMb2NJbmZvUHJlc2VudEZsYWcgPQotICAgICAgICAodG1wID09IDEpID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICBpZiAocFZ1aVBhcmFtZXRlcnMtPmNocm9tYUxvY0luZm9QcmVzZW50RmxhZykKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAgICAgJnBWdWlQYXJhbWV0ZXJzLT5jaHJvbWFTYW1wbGVMb2NUeXBlVG9wRmllbGQpOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICBpZiAocFZ1aVBhcmFtZXRlcnMtPmNocm9tYVNhbXBsZUxvY1R5cGVUb3BGaWVsZCA+IDUpCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgICAmcFZ1aVBhcmFtZXRlcnMtPmNocm9tYVNhbXBsZUxvY1R5cGVCb3R0b21GaWVsZCk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgIGlmIChwVnVpUGFyYW1ldGVycy0+Y2hyb21hU2FtcGxlTG9jVHlwZUJvdHRvbUZpZWxkID4gNSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICB9Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIHBWdWlQYXJhbWV0ZXJzLT50aW1pbmdJbmZvUHJlc2VudEZsYWcgPQotICAgICAgICAodG1wID09IDEpID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICBpZiAocFZ1aVBhcmFtZXRlcnMtPnRpbWluZ0luZm9QcmVzZW50RmxhZykKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2RTaG93Qml0czMyKHBTdHJtRGF0YSk7Ci0gICAgICAgIGlmIChoMjY0YnNkRmx1c2hCaXRzKHBTdHJtRGF0YSwgMzIpID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIGlmICh0bXAgPT0gMCkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPm51bVVuaXRzSW5UaWNrID0gdG1wOwotCi0gICAgICAgIHRtcCA9IGgyNjRic2RTaG93Qml0czMyKHBTdHJtRGF0YSk7Ci0gICAgICAgIGlmIChoMjY0YnNkRmx1c2hCaXRzKHBTdHJtRGF0YSwgMzIpID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIGlmICh0bXAgPT0gMCkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPnRpbWVTY2FsZSA9IHRtcDsKLQotICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5maXhlZEZyYW1lUmF0ZUZsYWcgPQotICAgICAgICAgICAgKHRtcCA9PSAxKSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotICAgIH0KLQotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgcFZ1aVBhcmFtZXRlcnMtPm5hbEhyZFBhcmFtZXRlcnNQcmVzZW50RmxhZyA9Ci0gICAgICAgICh0bXAgPT0gMSkgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgIGlmIChwVnVpUGFyYW1ldGVycy0+bmFsSHJkUGFyYW1ldGVyc1ByZXNlbnRGbGFnKQotICAgIHsKLSAgICAgICAgdG1wID0gRGVjb2RlSHJkUGFyYW1ldGVycyhwU3RybURhdGEsICZwVnVpUGFyYW1ldGVycy0+bmFsSHJkUGFyYW1ldGVycyk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5uYWxIcmRQYXJhbWV0ZXJzLmNwYkNudCAgICAgICAgICA9IDE7Ci0gICAgICAgIC8qIE1heEJSIGFuZCBNYXhDUEIgc2hvdWxkIGJlIHRoZSB2YWx1ZXMgY29ycmVzcG9uZGlnIHRvIHRoZSBsZXZlbElkYwotICAgICAgICAgKiBpbiB0aGUgU1BTIGNvbnRhaW5pbmcgdGhlc2UgVlVJIHBhcmFtZXRlcnMuIEhvd2V2ZXIsIHRoZXNlIHZhbHVlcwotICAgICAgICAgKiBhcmUgbm90IHVzZWQgYW55d2hlcmUgYW5kIG1heGltdW0gZm9yIGFueSBsZXZlbCB3aWxsIGJlIHVzZWQgaGVyZSAqLwotICAgICAgICBwVnVpUGFyYW1ldGVycy0+bmFsSHJkUGFyYW1ldGVycy5iaXRSYXRlVmFsdWVbMF0gPSAxMjAwICogTUFYX0JSICsgMTsKLSAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPm5hbEhyZFBhcmFtZXRlcnMuY3BiU2l6ZVZhbHVlWzBdID0gMTIwMCAqIE1BWF9DUEIgKyAxOwotICAgICAgICBwVnVpUGFyYW1ldGVycy0+bmFsSHJkUGFyYW1ldGVycy5pbml0aWFsQ3BiUmVtb3ZhbERlbGF5TGVuZ3RoID0gMjQ7Ci0gICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5uYWxIcmRQYXJhbWV0ZXJzLmNwYlJlbW92YWxEZWxheUxlbmd0aCAgICAgICAgPSAyNDsKLSAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPm5hbEhyZFBhcmFtZXRlcnMuZHBiT3V0cHV0RGVsYXlMZW5ndGggICAgICAgICA9IDI0OwotICAgICAgICBwVnVpUGFyYW1ldGVycy0+bmFsSHJkUGFyYW1ldGVycy50aW1lT2Zmc2V0TGVuZ3RoICAgICAgICAgICAgID0gMjQ7Ci0gICAgfQotCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICBwVnVpUGFyYW1ldGVycy0+dmNsSHJkUGFyYW1ldGVyc1ByZXNlbnRGbGFnID0KLSAgICAgICAgKHRtcCA9PSAxKSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotCi0gICAgaWYgKHBWdWlQYXJhbWV0ZXJzLT52Y2xIcmRQYXJhbWV0ZXJzUHJlc2VudEZsYWcpCi0gICAgewotICAgICAgICB0bXAgPSBEZWNvZGVIcmRQYXJhbWV0ZXJzKHBTdHJtRGF0YSwgJnBWdWlQYXJhbWV0ZXJzLT52Y2xIcmRQYXJhbWV0ZXJzKTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPnZjbEhyZFBhcmFtZXRlcnMuY3BiQ250ICAgICAgICAgID0gMTsKLSAgICAgICAgLyogTWF4QlIgYW5kIE1heENQQiBzaG91bGQgYmUgdGhlIHZhbHVlcyBjb3JyZXNwb25kaWcgdG8gdGhlIGxldmVsSWRjCi0gICAgICAgICAqIGluIHRoZSBTUFMgY29udGFpbmluZyB0aGVzZSBWVUkgcGFyYW1ldGVycy4gSG93ZXZlciwgdGhlc2UgdmFsdWVzCi0gICAgICAgICAqIGFyZSBub3QgdXNlZCBhbnl3aGVyZSBhbmQgbWF4aW11bSBmb3IgYW55IGxldmVsIHdpbGwgYmUgdXNlZCBoZXJlICovCi0gICAgICAgIHBWdWlQYXJhbWV0ZXJzLT52Y2xIcmRQYXJhbWV0ZXJzLmJpdFJhdGVWYWx1ZVswXSA9IDEwMDAgKiBNQVhfQlIgKyAxOwotICAgICAgICBwVnVpUGFyYW1ldGVycy0+dmNsSHJkUGFyYW1ldGVycy5jcGJTaXplVmFsdWVbMF0gPSAxMDAwICogTUFYX0NQQiArIDE7Ci0gICAgICAgIHBWdWlQYXJhbWV0ZXJzLT52Y2xIcmRQYXJhbWV0ZXJzLmluaXRpYWxDcGJSZW1vdmFsRGVsYXlMZW5ndGggPSAyNDsKLSAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPnZjbEhyZFBhcmFtZXRlcnMuY3BiUmVtb3ZhbERlbGF5TGVuZ3RoICAgICAgICA9IDI0OwotICAgICAgICBwVnVpUGFyYW1ldGVycy0+dmNsSHJkUGFyYW1ldGVycy5kcGJPdXRwdXREZWxheUxlbmd0aCAgICAgICAgID0gMjQ7Ci0gICAgICAgIHBWdWlQYXJhbWV0ZXJzLT52Y2xIcmRQYXJhbWV0ZXJzLnRpbWVPZmZzZXRMZW5ndGggICAgICAgICAgICAgPSAyNDsKLSAgICB9Ci0KLSAgICBpZiAocFZ1aVBhcmFtZXRlcnMtPm5hbEhyZFBhcmFtZXRlcnNQcmVzZW50RmxhZyB8fAotICAgICAgcFZ1aVBhcmFtZXRlcnMtPnZjbEhyZFBhcmFtZXRlcnNQcmVzZW50RmxhZykKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPmxvd0RlbGF5SHJkRmxhZyA9Ci0gICAgICAgICAgICAodG1wID09IDEpID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0gICAgfQotCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICBwVnVpUGFyYW1ldGVycy0+cGljU3RydWN0UHJlc2VudEZsYWcgPQotICAgICAgICAodG1wID09IDEpID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIHBWdWlQYXJhbWV0ZXJzLT5iaXRzdHJlYW1SZXN0cmljdGlvbkZsYWcgPQotICAgICAgICAodG1wID09IDEpID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICBpZiAocFZ1aVBhcmFtZXRlcnMtPmJpdHN0cmVhbVJlc3RyaWN0aW9uRmxhZykKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPm1vdGlvblZlY3RvcnNPdmVyUGljQm91bmRhcmllc0ZsYWcgPQotICAgICAgICAgICAgKHRtcCA9PSAxKSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotCi0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAgICAgJnBWdWlQYXJhbWV0ZXJzLT5tYXhCeXRlc1BlclBpY0Rlbm9tKTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgaWYgKHBWdWlQYXJhbWV0ZXJzLT5tYXhCeXRlc1BlclBpY0Rlbm9tID4gMTYpCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgICAmcFZ1aVBhcmFtZXRlcnMtPm1heEJpdHNQZXJNYkRlbm9tKTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgaWYgKHBWdWlQYXJhbWV0ZXJzLT5tYXhCaXRzUGVyTWJEZW5vbSA+IDE2KQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAgICAgJnBWdWlQYXJhbWV0ZXJzLT5sb2cyTWF4TXZMZW5ndGhIb3Jpem9udGFsKTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgaWYgKHBWdWlQYXJhbWV0ZXJzLT5sb2cyTWF4TXZMZW5ndGhIb3Jpem9udGFsID4gMTYpCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgICAmcFZ1aVBhcmFtZXRlcnMtPmxvZzJNYXhNdkxlbmd0aFZlcnRpY2FsKTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgaWYgKHBWdWlQYXJhbWV0ZXJzLT5sb2cyTWF4TXZMZW5ndGhWZXJ0aWNhbCA+IDE2KQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAgICAgJnBWdWlQYXJhbWV0ZXJzLT5udW1SZW9yZGVyRnJhbWVzKTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLQotICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAotICAgICAgICAgICZwVnVpUGFyYW1ldGVycy0+bWF4RGVjRnJhbWVCdWZmZXJpbmcpOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwVnVpUGFyYW1ldGVycy0+bW90aW9uVmVjdG9yc092ZXJQaWNCb3VuZGFyaWVzRmxhZyA9IEhBTlRST19UUlVFOwotICAgICAgICBwVnVpUGFyYW1ldGVycy0+bWF4Qnl0ZXNQZXJQaWNEZW5vbSAgICAgICA9IDI7Ci0gICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5tYXhCaXRzUGVyTWJEZW5vbSAgICAgICAgID0gMTsKLSAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPmxvZzJNYXhNdkxlbmd0aEhvcml6b250YWwgPSAxNjsKLSAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPmxvZzJNYXhNdkxlbmd0aFZlcnRpY2FsICAgPSAxNjsKLSAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPm51bVJlb3JkZXJGcmFtZXMgICAgICAgICAgPSBNQVhfRFBCX1NJWkU7Ci0gICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5tYXhEZWNGcmFtZUJ1ZmZlcmluZyAgICAgID0gTUFYX0RQQl9TSVpFOwotICAgIH0KLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRGVjb2RlSHJkUGFyYW1ldGVycwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBEZWNvZGUgSFJEIHBhcmFtZXRlcnMgZnJvbSB0aGUgc3RyZWFtLiBTZWUgc3RhbmRhcmQgZm9yIGRldGFpbHMuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIHBIcmRQYXJhbWV0ZXJzICBkZWNvZGVkIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBoZXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCi0gICAgICAgICAgICBIQU5UUk9fTk9LICAgICAgaW52YWxpZCBzdHJlYW0gZGF0YQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdTMyIERlY29kZUhyZFBhcmFtZXRlcnMoCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgaHJkUGFyYW1ldGVyc190ICpwSHJkUGFyYW1ldGVycykKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wLCBpOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQocEhyZFBhcmFtZXRlcnMpOwotCi0KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmcEhyZFBhcmFtZXRlcnMtPmNwYkNudCk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotICAgIC8qIGNwYkNvdW50ID0gY3BiX2NudF9taW51czEgKyAxICovCi0gICAgcEhyZFBhcmFtZXRlcnMtPmNwYkNudCsrOwotICAgIGlmIChwSHJkUGFyYW1ldGVycy0+Y3BiQ250ID4gTUFYX0NQQl9DTlQpCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgNCk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgcEhyZFBhcmFtZXRlcnMtPmJpdFJhdGVTY2FsZSA9IHRtcDsKLQotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgNCk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgcEhyZFBhcmFtZXRlcnMtPmNwYlNpemVTY2FsZSA9IHRtcDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBwSHJkUGFyYW1ldGVycy0+Y3BiQ250OyBpKyspCi0gICAgewotICAgICAgICAvKiBiaXRfcmF0ZV92YWx1ZV9taW51czEgaW4gdGhlIHJhbmdlIFswLCAyXjMyIC0gMl0gKi8KLSAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgICAmcEhyZFBhcmFtZXRlcnMtPmJpdFJhdGVWYWx1ZVtpXSk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgIGlmIChwSHJkUGFyYW1ldGVycy0+Yml0UmF0ZVZhbHVlW2ldID4gNDI5NDk2NzI5NFUpCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIHBIcmRQYXJhbWV0ZXJzLT5iaXRSYXRlVmFsdWVbaV0rKzsKLSAgICAgICAgLyogdGhpcyBtYXkgcmVzdWx0IGluIG92ZXJmbG93LCBidXQgdGhpcyB2YWx1ZSBpcyBub3QgdXNlZCBmb3IKLSAgICAgICAgICogYW55dGhpbmcgKi8KLSAgICAgICAgcEhyZFBhcmFtZXRlcnMtPmJpdFJhdGVWYWx1ZVtpXSAqPQotICAgICAgICAgICAgMSA8PCAoNiArIHBIcmRQYXJhbWV0ZXJzLT5iaXRSYXRlU2NhbGUpOwotCi0gICAgICAgIC8qIGNwYl9zaXplX3ZhbHVlX21pbnVzMSBpbiB0aGUgcmFuZ2UgWzAsIDJeMzIgLSAyXSAqLwotICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAotICAgICAgICAgICZwSHJkUGFyYW1ldGVycy0+Y3BiU2l6ZVZhbHVlW2ldKTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgaWYgKHBIcmRQYXJhbWV0ZXJzLT5jcGJTaXplVmFsdWVbaV0gPiA0Mjk0OTY3Mjk0VSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgcEhyZFBhcmFtZXRlcnMtPmNwYlNpemVWYWx1ZVtpXSsrOwotICAgICAgICAvKiB0aGlzIG1heSByZXN1bHQgaW4gb3ZlcmZsb3csIGJ1dCB0aGlzIHZhbHVlIGlzIG5vdCB1c2VkIGZvcgotICAgICAgICAgKiBhbnl0aGluZyAqLwotICAgICAgICBwSHJkUGFyYW1ldGVycy0+Y3BiU2l6ZVZhbHVlW2ldICo9Ci0gICAgICAgICAgICAxIDw8ICg0ICsgcEhyZFBhcmFtZXRlcnMtPmNwYlNpemVTY2FsZSk7Ci0KLSAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICBwSHJkUGFyYW1ldGVycy0+Y2JyRmxhZ1tpXSA9ICh0bXAgPT0gMSkgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLSAgICB9Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDUpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIHBIcmRQYXJhbWV0ZXJzLT5pbml0aWFsQ3BiUmVtb3ZhbERlbGF5TGVuZ3RoID0gdG1wICsgMTsKLQotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgNSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgcEhyZFBhcmFtZXRlcnMtPmNwYlJlbW92YWxEZWxheUxlbmd0aCA9IHRtcCArIDE7Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDUpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIHBIcmRQYXJhbWV0ZXJzLT5kcGJPdXRwdXREZWxheUxlbmd0aCA9IHRtcCArIDE7Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDUpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIHBIcmRQYXJhbWV0ZXJzLT50aW1lT2Zmc2V0TGVuZ3RoID0gdG1wOwotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3Z1aS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3Z1aS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWQ1MmE0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF92dWkuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotICAgIDMuIERhdGEgdHlwZXMKLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgSDI2NFNXREVDX1ZVSV9ICi0jZGVmaW5lIEgyNjRTV0RFQ19WVUlfSAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImJhc2V0eXBlLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9zdHJlYW0uaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2RlZmluZSBNQVhfQ1BCX0NOVCAzMgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIERhdGEgdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIGVudW1lcmF0ZWQgc2FtcGxlIGFzcGVjdCByYXRpb3MsIEFTUEVDVF9SQVRJT19NX04gbWVhbnMgTTpOICovCi1lbnVtCi17Ci0gICAgQVNQRUNUX1JBVElPX1VOU1BFQ0lGSUVEID0gMCwKLSAgICBBU1BFQ1RfUkFUSU9fMV8xLAotICAgIEFTUEVDVF9SQVRJT18xMl8xMSwKLSAgICBBU1BFQ1RfUkFUSU9fMTBfMTEsCi0gICAgQVNQRUNUX1JBVElPXzE2XzExLAotICAgIEFTUEVDVF9SQVRJT180MF8zMywKLSAgICBBU1BFQ1RfUkFUSU9fMjRfMTEsCi0gICAgQVNQRUNUX1JBVElPXzIwXzExLAotICAgIEFTUEVDVF9SQVRJT18zMl8xMSwKLSAgICBBU1BFQ1RfUkFUSU9fODBfMzMsCi0gICAgQVNQRUNUX1JBVElPXzE4XzExLAotICAgIEFTUEVDVF9SQVRJT18xNV8xMSwKLSAgICBBU1BFQ1RfUkFUSU9fNjRfMzMsCi0gICAgQVNQRUNUX1JBVElPXzE2MF85OSwKLSAgICBBU1BFQ1RfUkFUSU9fRVhURU5ERURfU0FSID0gMjU1Ci19OwotCi0vKiBzdHJ1Y3R1cmUgdG8gc3RvcmUgSHlwb3RoZXRpY2FsIFJlZmVyZW5jZSBEZWNvZGVyIChIUkQpIHBhcmFtZXRlcnMgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdTMyIGNwYkNudDsKLSAgICB1MzIgYml0UmF0ZVNjYWxlOwotICAgIHUzMiBjcGJTaXplU2NhbGU7Ci0gICAgdTMyIGJpdFJhdGVWYWx1ZVtNQVhfQ1BCX0NOVF07Ci0gICAgdTMyIGNwYlNpemVWYWx1ZVtNQVhfQ1BCX0NOVF07Ci0gICAgdTMyIGNickZsYWdbTUFYX0NQQl9DTlRdOwotICAgIHUzMiBpbml0aWFsQ3BiUmVtb3ZhbERlbGF5TGVuZ3RoOwotICAgIHUzMiBjcGJSZW1vdmFsRGVsYXlMZW5ndGg7Ci0gICAgdTMyIGRwYk91dHB1dERlbGF5TGVuZ3RoOwotICAgIHUzMiB0aW1lT2Zmc2V0TGVuZ3RoOwotfSBocmRQYXJhbWV0ZXJzX3Q7Ci0KLS8qIHN0b3JhZ2UgZm9yIFZVSSBwYXJhbWV0ZXJzICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIHUzMiBhc3BlY3RSYXRpb1ByZXNlbnRGbGFnOwotICAgIHUzMiBhc3BlY3RSYXRpb0lkYzsKLSAgICB1MzIgc2FyV2lkdGg7Ci0gICAgdTMyIHNhckhlaWdodDsKLSAgICB1MzIgb3ZlcnNjYW5JbmZvUHJlc2VudEZsYWc7Ci0gICAgdTMyIG92ZXJzY2FuQXBwcm9wcmlhdGVGbGFnOwotICAgIHUzMiB2aWRlb1NpZ25hbFR5cGVQcmVzZW50RmxhZzsKLSAgICB1MzIgdmlkZW9Gb3JtYXQ7Ci0gICAgdTMyIHZpZGVvRnVsbFJhbmdlRmxhZzsKLSAgICB1MzIgY29sb3VyRGVzY3JpcHRpb25QcmVzZW50RmxhZzsKLSAgICB1MzIgY29sb3VyUHJpbWFyaWVzOwotICAgIHUzMiB0cmFuc2ZlckNoYXJhY3RlcmlzdGljczsKLSAgICB1MzIgbWF0cml4Q29lZmZpY2llbnRzOwotICAgIHUzMiBjaHJvbWFMb2NJbmZvUHJlc2VudEZsYWc7Ci0gICAgdTMyIGNocm9tYVNhbXBsZUxvY1R5cGVUb3BGaWVsZDsKLSAgICB1MzIgY2hyb21hU2FtcGxlTG9jVHlwZUJvdHRvbUZpZWxkOwotICAgIHUzMiB0aW1pbmdJbmZvUHJlc2VudEZsYWc7Ci0gICAgdTMyIG51bVVuaXRzSW5UaWNrOwotICAgIHUzMiB0aW1lU2NhbGU7Ci0gICAgdTMyIGZpeGVkRnJhbWVSYXRlRmxhZzsKLSAgICB1MzIgbmFsSHJkUGFyYW1ldGVyc1ByZXNlbnRGbGFnOwotICAgIGhyZFBhcmFtZXRlcnNfdCBuYWxIcmRQYXJhbWV0ZXJzOwotICAgIHUzMiB2Y2xIcmRQYXJhbWV0ZXJzUHJlc2VudEZsYWc7Ci0gICAgaHJkUGFyYW1ldGVyc190IHZjbEhyZFBhcmFtZXRlcnM7Ci0gICAgdTMyIGxvd0RlbGF5SHJkRmxhZzsKLSAgICB1MzIgcGljU3RydWN0UHJlc2VudEZsYWc7Ci0gICAgdTMyIGJpdHN0cmVhbVJlc3RyaWN0aW9uRmxhZzsKLSAgICB1MzIgbW90aW9uVmVjdG9yc092ZXJQaWNCb3VuZGFyaWVzRmxhZzsKLSAgICB1MzIgbWF4Qnl0ZXNQZXJQaWNEZW5vbTsKLSAgICB1MzIgbWF4Qml0c1Blck1iRGVub207Ci0gICAgdTMyIGxvZzJNYXhNdkxlbmd0aEhvcml6b250YWw7Ci0gICAgdTMyIGxvZzJNYXhNdkxlbmd0aFZlcnRpY2FsOwotICAgIHUzMiBudW1SZW9yZGVyRnJhbWVzOwotICAgIHUzMiBtYXhEZWNGcmFtZUJ1ZmZlcmluZzsKLX0gdnVpUGFyYW1ldGVyc190OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkRGVjb2RlVnVpUGFyYW1ldGVycyhzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gICAgdnVpUGFyYW1ldGVyc190ICpwVnVpUGFyYW1ldGVycyk7Ci0KLSNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX1ZVSV9IICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy90ZXN0cy9DMlNvZnRBdmNEZWNfdGVzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvdGVzdHMvQzJTb2Z0QXZjRGVjX3Rlc3QuY3BwCmluZGV4IGQ1Y2NiOGQuLjc4ZTgyYjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy90ZXN0cy9DMlNvZnRBdmNEZWNfdGVzdC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3Rlc3RzL0MyU29mdEF2Y0RlY190ZXN0LmNwcApAQCAtNjksMTUgKzY5LDE1IEBACiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KIHZvaWQgQzJTb2Z0QXZjRGVjVGVzdDo6dGVzdFJlYWRPbmx5UGFyYW1PblN0YWNrKGNvbnN0IFQgKmV4cGVjdGVkLCBjb25zdCBUICppbnZhbGlkKSB7CiAgICAgVCBwYXJhbTsKLSAgICBBU1NFUlRfRVEoQzJfT0ssIG1JbnRmLT5xdWVyeV9uYih7JnBhcmFtfSwge30sIG51bGxwdHIpKTsKKyAgICBBU1NFUlRfRVEoQzJfT0ssIG1JbnRmLT5xdWVyeV92Yih7JnBhcmFtfSwge30sIEMyX0RPTlRfQkxPQ0ssIG51bGxwdHIpKTsKICAgICBBU1NFUlRfRVEoKmV4cGVjdGVkLCBwYXJhbSk7CiAKICAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtICogY29uc3Q+IHBhcmFtc3sgKEMyUGFyYW0gKiBjb25zdClpbnZhbGlkIH07CiAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOwotICAgIEFTU0VSVF9FUShDMl9CQURfVkFMVUUsIG1JbnRmLT5jb25maWdfbmIocGFyYW1zLCAmZmFpbHVyZXMpKTsKKyAgICBBU1NFUlRfRVEoQzJfQkFEX1ZBTFVFLCBtSW50Zi0+Y29uZmlnX3ZiKHBhcmFtcywgQzJfRE9OVF9CTE9DSywgJmZhaWx1cmVzKSk7CiAKICAgICAvLyBUaGUgcGFyYW0gbXVzdCBub3QgY2hhbmdlIGFmdGVyIGZhaWxlZCBjb25maWcuCi0gICAgQVNTRVJUX0VRKEMyX09LLCBtSW50Zi0+cXVlcnlfbmIoeyZwYXJhbX0sIHt9LCBudWxscHRyKSk7CisgICAgQVNTRVJUX0VRKEMyX09LLCBtSW50Zi0+cXVlcnlfdmIoeyZwYXJhbX0sIHt9LCBDMl9ET05UX0JMT0NLLCBudWxscHRyKSk7CiAgICAgQVNTRVJUX0VRKCpleHBlY3RlZCwgcGFyYW0pOwogfQogCkBAIC05MCwxNyArOTAsMTcgQEAKICAgICAgICAgaW5kZXggfD0gKChleHBlY3RlZC0+c3RyZWFtKCkgPDwgMTcpICYgMHgwMUZFMDAwMCkgfCAweDAyMDAwMDAwOwogICAgIH0KIAotICAgIEFTU0VSVF9FUShDMl9PSywgbUludGYtPnF1ZXJ5X25iKHt9LCB7aW5kZXh9LCAmaGVhcFBhcmFtcykpOworICAgIEFTU0VSVF9FUShDMl9PSywgbUludGYtPnF1ZXJ5X3ZiKHt9LCB7aW5kZXh9LCBDMl9ET05UX0JMT0NLLCAmaGVhcFBhcmFtcykpOwogICAgIEFTU0VSVF9FUSgxdSwgaGVhcFBhcmFtcy5zaXplKCkpOwogICAgIEFTU0VSVF9FUSgqZXhwZWN0ZWQsICpoZWFwUGFyYW1zWzBdKTsKIAogICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0gKiBjb25zdD4gcGFyYW1zeyAoQzJQYXJhbSAqIGNvbnN0KWludmFsaWQgfTsKICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7Ci0gICAgQVNTRVJUX0VRKEMyX0JBRF9WQUxVRSwgbUludGYtPmNvbmZpZ19uYihwYXJhbXMsICZmYWlsdXJlcykpOworICAgIEFTU0VSVF9FUShDMl9CQURfVkFMVUUsIG1JbnRmLT5jb25maWdfdmIocGFyYW1zLCBDMl9ET05UX0JMT0NLLCAmZmFpbHVyZXMpKTsKIAogICAgIC8vIFRoZSBwYXJhbSBtdXN0IG5vdCBjaGFuZ2UgYWZ0ZXIgZmFpbGVkIGNvbmZpZy4KICAgICBoZWFwUGFyYW1zLmNsZWFyKCk7Ci0gICAgQVNTRVJUX0VRKEMyX09LLCBtSW50Zi0+cXVlcnlfbmIoe30sIHtpbmRleH0sICZoZWFwUGFyYW1zKSk7CisgICAgQVNTRVJUX0VRKEMyX09LLCBtSW50Zi0+cXVlcnlfdmIoe30sIHtpbmRleH0sIEMyX0RPTlRfQkxPQ0ssICZoZWFwUGFyYW1zKSk7CiAgICAgQVNTRVJUX0VRKDF1LCBoZWFwUGFyYW1zLnNpemUoKSk7CiAgICAgQVNTRVJUX0VRKCpleHBlY3RlZCwgKmhlYXBQYXJhbXNbMF0pOwogfQpAQCAtMTE1LDE3ICsxMTUsMTcgQEAKICAgICAgICAgaW5kZXggfD0gKChleHBlY3RlZC0+c3RyZWFtKCkgPDwgMTcpICYgMHgwMUZFMDAwMCkgfCAweDAyMDAwMDAwOwogICAgIH0KIAotICAgIEFTU0VSVF9FUShDMl9PSywgbUludGYtPnF1ZXJ5X25iKHt9LCB7aW5kZXh9LCAmaGVhcFBhcmFtcykpOworICAgIEFTU0VSVF9FUShDMl9PSywgbUludGYtPnF1ZXJ5X3ZiKHt9LCB7aW5kZXh9LCBDMl9ET05UX0JMT0NLLCAmaGVhcFBhcmFtcykpOwogICAgIEFTU0VSVF9FUSgxdSwgaGVhcFBhcmFtcy5zaXplKCkpOwogICAgIEFTU0VSVF9FUSgqZXhwZWN0ZWQsICpoZWFwUGFyYW1zWzBdKTsKIAogICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0gKiBjb25zdD4gcGFyYW1zeyBpbnZhbGlkLmdldCgpIH07CiAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOwotICAgIEFTU0VSVF9FUShDMl9CQURfVkFMVUUsIG1JbnRmLT5jb25maWdfbmIocGFyYW1zLCAmZmFpbHVyZXMpKTsKKyAgICBBU1NFUlRfRVEoQzJfQkFEX1ZBTFVFLCBtSW50Zi0+Y29uZmlnX3ZiKHBhcmFtcywgQzJfRE9OVF9CTE9DSywgJmZhaWx1cmVzKSk7CiAKICAgICAvLyBUaGUgcGFyYW0gbXVzdCBub3QgY2hhbmdlIGFmdGVyIGZhaWxlZCBjb25maWcuCiAgICAgaGVhcFBhcmFtcy5jbGVhcigpOwotICAgIEFTU0VSVF9FUShDMl9PSywgbUludGYtPnF1ZXJ5X25iKHt9LCB7aW5kZXh9LCAmaGVhcFBhcmFtcykpOworICAgIEFTU0VSVF9FUShDMl9PSywgbUludGYtPnF1ZXJ5X3ZiKHt9LCB7aW5kZXh9LCBDMl9ET05UX0JMT0NLLCAmaGVhcFBhcmFtcykpOwogICAgIEFTU0VSVF9FUSgxdSwgaGVhcFBhcmFtcy5zaXplKCkpOwogICAgIEFTU0VSVF9FUSgqZXhwZWN0ZWQsICpoZWFwUGFyYW1zWzBdKTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQW5kcm9pZC5icAppbmRleCBjMDg3YTI3Li5kZjNlMjgwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BbmRyb2lkLmJwCkBAIC02NSw2ICs2NSw3IEBACiAgICAgICAgICJNZWRpYUJ1ZmZlci5jcHAiLAogICAgICAgICAiTWVkaWFCdWZmZXJHcm91cC5jcHAiLAogICAgICAgICAiTWVkaWFEZWZzLmNwcCIsCisgICAgICAgICJNZWRpYUtleXMuY3BwIiwKICAgICAgICAgIk1ldGFEYXRhLmNwcCIsCiAgICAgICAgICJQYXJzZWRNZXNzYWdlLmNwcCIsCiAgICAgICAgICJhdmNfdXRpbHMuY3BwIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFCdWZmZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYUJ1ZmZlci5jcHAKaW5kZXggMTYwMDBlZi4uOTU5NTFkZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYUJ1ZmZlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYUJ1ZmZlci5jcHAKQEAgLTc3LDE5ICs3Nyw2IEBACiAgICAgfQogfQogCi1NZWRpYUJ1ZmZlcjo6TWVkaWFCdWZmZXIoY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4mIGdyYXBoaWNCdWZmZXIpCi0gICAgOiBtT2JzZXJ2ZXIoTlVMTCksCi0gICAgICBtUmVmQ291bnQoMCksCi0gICAgICBtRGF0YShOVUxMKSwKLSAgICAgIG1TaXplKDEpLAotICAgICAgbVJhbmdlT2Zmc2V0KDApLAotICAgICAgbVJhbmdlTGVuZ3RoKG1TaXplKSwKLSAgICAgIG1HcmFwaGljQnVmZmVyKGdyYXBoaWNCdWZmZXIpLAotICAgICAgbU93bnNEYXRhKGZhbHNlKSwKLSAgICAgIG1NZXRhRGF0YShuZXcgTWV0YURhdGEpLAotICAgICAgbU9yaWdpbmFsKE5VTEwpIHsKLX0KLQogTWVkaWFCdWZmZXI6Ok1lZGlhQnVmZmVyKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpCiAgICAgOiBtT2JzZXJ2ZXIoTlVMTCksCiAgICAgICBtUmVmQ291bnQoMCksCkBAIC0xMzUsMTIgKzEyMiwxMCBAQAogfQogCiB2b2lkICpNZWRpYUJ1ZmZlcjo6ZGF0YSgpIGNvbnN0IHsKLSAgICBDSEVDSyhtR3JhcGhpY0J1ZmZlciA9PSBOVUxMKTsKICAgICByZXR1cm4gbURhdGE7CiB9CiAKIHNpemVfdCBNZWRpYUJ1ZmZlcjo6c2l6ZSgpIGNvbnN0IHsKLSAgICBDSEVDSyhtR3JhcGhpY0J1ZmZlciA9PSBOVUxMKTsKICAgICByZXR1cm4gbVNpemU7CiB9CiAKQEAgLTE1MywxOSArMTM4LDE1IEBACiB9CiAKIHZvaWQgTWVkaWFCdWZmZXI6OnNldF9yYW5nZShzaXplX3Qgb2Zmc2V0LCBzaXplX3QgbGVuZ3RoKSB7Ci0gICAgaWYgKChtR3JhcGhpY0J1ZmZlciA9PSBOVUxMKSAmJiAob2Zmc2V0ICsgbGVuZ3RoID4gbVNpemUpKSB7CisgICAgaWYgKG9mZnNldCArIGxlbmd0aCA+IG1TaXplKSB7CiAgICAgICAgIEFMT0dFKCJvZmZzZXQgPSAlenUsIGxlbmd0aCA9ICV6dSwgbVNpemUgPSAlenUiLCBvZmZzZXQsIGxlbmd0aCwgbVNpemUpOwogICAgIH0KLSAgICBDSEVDSygobUdyYXBoaWNCdWZmZXIgIT0gTlVMTCkgfHwgKG9mZnNldCArIGxlbmd0aCA8PSBtU2l6ZSkpOworICAgIENIRUNLKG9mZnNldCArIGxlbmd0aCA8PSBtU2l6ZSk7CiAKICAgICBtUmFuZ2VPZmZzZXQgPSBvZmZzZXQ7CiAgICAgbVJhbmdlTGVuZ3RoID0gbGVuZ3RoOwogfQogCi1zcDxHcmFwaGljQnVmZmVyPiBNZWRpYUJ1ZmZlcjo6Z3JhcGhpY0J1ZmZlcigpIGNvbnN0IHsKLSAgICByZXR1cm4gbUdyYXBoaWNCdWZmZXI7Ci19Ci0KIHNwPE1ldGFEYXRhPiBNZWRpYUJ1ZmZlcjo6bWV0YV9kYXRhKCkgewogICAgIHJldHVybiBtTWV0YURhdGE7CiB9CkBAIC0xOTksOCArMTgwLDYgQEAKIH0KIAogTWVkaWFCdWZmZXIgKk1lZGlhQnVmZmVyOjpjbG9uZSgpIHsKLSAgICBDSEVDSyhtR3JhcGhpY0J1ZmZlciA9PSBOVUxMKTsKLQogICAgIE1lZGlhQnVmZmVyICpidWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIobURhdGEsIG1TaXplKTsKICAgICBidWZmZXItPnNldF9yYW5nZShtUmFuZ2VPZmZzZXQsIG1SYW5nZUxlbmd0aCk7CiAgICAgYnVmZmVyLT5tTWV0YURhdGEgPSBuZXcgTWV0YURhdGEoKm1NZXRhRGF0YS5nZXQoKSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhS2V5cy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhS2V5cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM5MjBjOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFLZXlzLmNwcApAQCAtMCwwICsxLDI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFLZXlzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY29uc3QgY2hhciAqY29uc3Qga0lTdHJlYW1MaXN0ZW5lcktleURpc2NvbnRpbnVpdHlNYXNrID0gImRpc2NvbnRpbnVpdHktbWFzayI7Citjb25zdCBjaGFyICpjb25zdCBrQVRTUGFyc2VyS2V5UmVzdW1lQXRQVFMgPSAicmVzdW1lLWF0LVBUUyI7Citjb25zdCBjaGFyICpjb25zdCBrQVRTUGFyc2VyS2V5TWVkaWFUaW1lVXMgPSAibWVkaWEtdGltZS11cyI7Citjb25zdCBjaGFyICpjb25zdCBrQVRTUGFyc2VyS2V5UmVjZW50TWVkaWFUaW1lVXMgPSAicmVjZW50LW1lZGlhLXRpbWUtdXMiOworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaAppbmRleCBiNDk4YzkxLi5iYWM4ZmE5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaApAQCAtODIsNiArODIsMTAgQEAKIE1BS0VfQ09NUEFSQVRPUihMVCw8KQogTUFLRV9DT01QQVJBVE9SKEdULD4pCiAKKyNpZmRlZiBDSEVDS19PUAorI3VuZGVmIENIRUNLX09QCisjZW5kaWYKKwogI2RlZmluZSBDSEVDS19PUCh4LHksc3VmZml4LG9wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBBU3RyaW5nIF9fX3JlcyA9IENvbXBhcmVfIyNzdWZmaXgoeCwgeSk7ICAgICAgICAgICAgICAgICAgICAgICAgXApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFLZXlzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYUtleXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjkyNGJiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFLZXlzLmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTUVESUFfS0VZU19IXworCisjZGVmaW5lIE1FRElBX0tFWVNfSF8KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBXaGVuIHNpZ25hbGxpbmcgYSBkaXNjb250aW51aXR5IHRvIElTdHJlYW1MaXN0ZW5lciB5b3UgY2FuIG9wdGlvbmFsbHkKKy8vIHNwZWNpZnkgdGhlIHR5cGUocykgb2YgZGlzY29udGludWl0eSwgaS5lLiBpZiB0aGUgYXVkaW8gZm9ybWF0IGhhcyBjaGFuZ2VkLAorLy8gdGhlIHZpZGVvIGZvcm1hdCBoYXMgY2hhbmdlZCwgdGltZSBoYXMganVtcGVkIG9yIGFueSBjb21iaW5hdGlvbiB0aGVyZW9mLgorLy8gVG8gZG8gc28sIGluY2x1ZGUgYSBub24temVybyBpbnQzMl90IHZhbHVlIHVuZGVyIHRoZSBrZXkKKy8vICJrSVN0cmVhbUxpc3RlbmVyS2V5RGlzY29udGludWl0eU1hc2siIHdoZW4gaXNzdWluZyB0aGUKKy8vIElTdHJlYW1MaXN0ZW5lcjo6RElTQ09OVElOVUlUWSBjb21tYW5kLgorLy8gSWYgdGhlcmUgaXMgYSBjaGFuZ2UgaW4gYXVkaW8vdmlkZW8gZm9ybWF0LCBUaGUgbmV3IGxvZ2ljYWwgc3RyZWFtCisvLyBtdXN0IHN0YXJ0IHdpdGggcHJvcGVyIGNvZGVjIGluaXRpYWxpemF0aW9uCisvLyBpbmZvcm1hdGlvbiBmb3IgcGxheWJhY2sgdG8gY29udGludWUsIGkuZS4gU1BTIGFuZCBQUFMgaW4gdGhlIGNhc2UKKy8vIG9mIEFWQyB2aWRlbyBldGMuCisvLyBJZiB0aGlzIGtleSBpcyBub3QgcHJlc2VudCwgb25seSBhIHRpbWUgZGlzY29udGludWl0eSBpcyBhc3N1bWVkLgorLy8gVGhlIHZhbHVlIHNob3VsZCBiZSBhIGJpdG1hc2sgb2YgdmFsdWVzIGZyb20KKy8vIEFUU1BhcnNlcjo6RGlzY29udGludWl0eVR5cGUuCitleHRlcm4gY29uc3QgY2hhciAqY29uc3Qga0lTdHJlYW1MaXN0ZW5lcktleURpc2NvbnRpbnVpdHlNYXNrOworCisvLyBXaGVuIHNpZ25hbGxpbmcgYSBkaXNjb250aW51aXR5IHRvIEFUU1BhcnNlciB5b3UgY2FuIG9wdGlvbmFsbHkKKy8vIHNwZWNpZnkgYW4gaW50NjRfdCBQVFMgdGltZXN0YW1wIGluICJleHRyYSIuCisvLyBJZiBwcmVzZW50LCByZW5kZXJpbmcgb2YgZGF0YSBmb2xsb3dpbmcgdGhlIGRpc2NvbnRpbnVpdHkKKy8vIHdpbGwgYmUgc3VwcHJlc3NlZCB1bnRpbCBtZWRpYSB0aW1lIHJlYWNoZXMgdGhpcyB0aW1lc3RhbXAuCitleHRlcm4gY29uc3QgY2hhciAqY29uc3Qga0FUU1BhcnNlcktleVJlc3VtZUF0UFRTOworCisvLyBXaGVuIHNpZ25hbGxpbmcgYSBkaXNjb250aW51aXR5IHRvIEFUU1BhcnNlciB5b3UgY2FuIG9wdGlvbmFsbHkKKy8vIHNwZWNpZnkgYW4gaW50NjRfdCBQVFMgdGltZXN0YW1wIGluICJleHRyYSIuCisvLyBJdCBpbmRpY2F0ZXMgdGhlIG1lZGlhIHRpbWUgKGluIHVzKSB0byBiZSBhc3NvY2lhdGVkCisvLyB3aXRoIHRoZSBuZXh0IFBUUyBvY2N1cmluZyBpbiB0aGUgc3RyZWFtLiBUaGUgdmFsdWUgaXMgb2YgdHlwZSBpbnQ2NF90LgorZXh0ZXJuIGNvbnN0IGNoYXIgKmNvbnN0IGtBVFNQYXJzZXJLZXlNZWRpYVRpbWVVczsKKworLy8gV2hlbiBzaWduYWxsaW5nIGEgZGlzY29udGludWl0eSB0byBBVFNQYXJzZXIgeW91IGNhbiBvcHRpb25hbGx5CisvLyBzcGVjaWZ5IGFuIGludDY0X3QgUFRTIHRpbWVzdGFtcCBpbiAiZXh0cmEiLgorLy8gSXQgaW5kaWNhdGVzIHRoZSBtZWRpYSB0aW1lIChpbiB1cykgb2YgYSByZWNlbnQKKy8vIHNhbXBsZSBmcm9tIHRoZSBzYW1lIGNvbnRlbnQsIGFuZCBpcyB1c2VkIGFzIGEgaGludCBmb3IgdGhlIHBhcnNlciB0bworLy8gaGFuZGxlIFBUUyB3cmFwYXJvdW5kLiBUaGlzIGlzIHJlcXVpcmVkIHdoZW4gYSBuZXcgcGFyc2VyIGlzIGNyZWF0ZWQKKy8vIHRvIGNvbnRpbnVlIHBhcnNpbmcgY29udGVudCBmcm9tIHRoZSBzYW1lIHRpbWVsaW5lLgorZXh0ZXJuIGNvbnN0IGNoYXIgKmNvbnN0IGtBVFNQYXJzZXJLZXlSZWNlbnRNZWRpYVRpbWVVczsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBNRURJQV9LRVlTX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9hdmNfdXRpbHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2F2Y191dGlscy5oCmluZGV4IGY0ZWI2OTIuLmE5MzlmMTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2F2Y191dGlscy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2F2Y191dGlscy5oCkBAIC0xOCw3ICsxOCw2IEBACiAKICNkZWZpbmUgQVZDX1VUSUxTX0hfCiAKLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvTWVkaWFIVFRQLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvTWVkaWFIVFRQLmNwcAppbmRleCA1YjE4ODE0Li43YzkyNDdlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL01lZGlhSFRUUC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9NZWRpYUhUVFAuY3BwCkBAIC0yNSwxMSArMjUsMTEgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgogCi0jaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUENvbm5lY3Rpb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUhUVFBDb25uZWN0aW9uLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotTWVkaWFIVFRQOjpNZWRpYUhUVFAoY29uc3Qgc3A8SU1lZGlhSFRUUENvbm5lY3Rpb24+ICZjb25uKQorTWVkaWFIVFRQOjpNZWRpYUhUVFAoY29uc3Qgc3A8TWVkaWFIVFRQQ29ubmVjdGlvbj4gJmNvbm4pCiAgICAgOiBtSW5pdENoZWNrKChjb25uICE9IE5VTEwpID8gT0sgOiBOT19JTklUKSwKICAgICAgIG1IVFRQQ29ubmVjdGlvbihjb25uKSwKICAgICAgIG1DYWNoZWRTaXplVmFsaWQoZmFsc2UpLApAQCAtMTc2LDEyICsxNzYsNiBAQAogICAgIHJldHVybiBtRGVjcnlwdEhhbmRsZTsKIH0KIAotdm9pZCBNZWRpYUhUVFA6OmdldERybUluZm8oCi0gICAgICAgIHNwPERlY3J5cHRIYW5kbGU+ICZoYW5kbGUsIERybU1hbmFnZXJDbGllbnQgKipjbGllbnQpIHsKLSAgICBoYW5kbGUgPSBtRGVjcnlwdEhhbmRsZTsKLSAgICAqY2xpZW50ID0gbURybU1hbmFnZXJDbGllbnQ7Ci19Ci0KIFN0cmluZzggTWVkaWFIVFRQOjpnZXRVcmkoKSB7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIFN0cmluZzg6OmVtcHR5KCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9IVFRQRG93bmxvYWRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9IVFRQRG93bmxvYWRlci5jcHAKaW5kZXggM2ZlZjc2NC4uNzI2MDRlMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvSFRUUERvd25sb2FkZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0hUVFBEb3dubG9hZGVyLmNwcApAQCAtMjIsOCArMjIsOCBAQAogI2luY2x1ZGUgIk0zVVBhcnNlci5oIgogCiAjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBDb25uZWN0aW9uLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUhUVFBDb25uZWN0aW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFIVFRQLmg+CkBAIC0zNiw3ICszNiw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIEhUVFBEb3dubG9hZGVyOjpIVFRQRG93bmxvYWRlcigKLSAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgY29uc3Qgc3A8TWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAogICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAmaGVhZGVycykgOgogICAgIG1IVFRQRGF0YVNvdXJjZShuZXcgTWVkaWFIVFRQKGh0dHBTZXJ2aWNlLT5tYWtlSFRUUENvbm5lY3Rpb24oKSkpLAogICAgIG1FeHRyYUhlYWRlcnMoaGVhZGVycyksCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9IVFRQRG93bmxvYWRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvSFRUUERvd25sb2FkZXIuaAppbmRleCAxZGI0YTQ4Li4wZDRiZDMxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9IVFRQRG93bmxvYWRlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0hUVFBEb3dubG9hZGVyLmgKQEAgLTI4LDEyICsyOCwxMiBAQAogc3RydWN0IEFCdWZmZXI7CiBjbGFzcyBEYXRhU291cmNlOwogc3RydWN0IEhUVFBCYXNlOwotc3RydWN0IElNZWRpYUhUVFBTZXJ2aWNlOworc3RydWN0IE1lZGlhSFRUUFNlcnZpY2U7CiBzdHJ1Y3QgTTNVUGFyc2VyOwogCiBzdHJ1Y3QgSFRUUERvd25sb2FkZXIgOiBwdWJsaWMgUmVmQmFzZSB7CiAgICAgSFRUUERvd25sb2FkZXIoCi0gICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAogICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gJmhlYWRlcnMpOwogCiAgICAgdm9pZCByZWNvbm5lY3QoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVTZXNzaW9uLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVTZXNzaW9uLmNwcAppbmRleCA0YzJlMGQ0Li4xZTJlNjg0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU2Vzc2lvbi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uY3BwCkBAIC0yNiw3ICsyNiw3IEBACiAjaW5jbHVkZSAibXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmgiCiAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgotI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgpAQCAtMjc0LDcgKzI3NCw3IEBACiAKIExpdmVTZXNzaW9uOjpMaXZlU2Vzc2lvbigKICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksIHVpbnQzMl90IGZsYWdzLAotICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlKQorICAgICAgICBjb25zdCBzcDxNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UpCiAgICAgOiBtTm90aWZ5KG5vdGlmeSksCiAgICAgICBtRmxhZ3MoZmxhZ3MpLAogICAgICAgbUhUVFBTZXJ2aWNlKGh0dHBTZXJ2aWNlKSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVTZXNzaW9uLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU2Vzc2lvbi5oCmluZGV4IGFiZjhjZjAuLjdhNmQ0ODcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVTZXNzaW9uLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uaApAQCAtMzMsNyArMzMsNyBAQAogc3RydWN0IEFub3RoZXJQYWNrZXRTb3VyY2U7CiBjbGFzcyBEYXRhU291cmNlOwogc3RydWN0IEhUVFBCYXNlOwotc3RydWN0IElNZWRpYUhUVFBTZXJ2aWNlOworc3RydWN0IE1lZGlhSFRUUFNlcnZpY2U7CiBzdHJ1Y3QgTGl2ZURhdGFTb3VyY2U7CiBzdHJ1Y3QgTTNVUGFyc2VyOwogc3RydWN0IFBsYXlsaXN0RmV0Y2hlcjsKQEAgLTcxLDcgKzcxLDcgQEAKICAgICBMaXZlU2Vzc2lvbigKICAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAogICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsCi0gICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlKTsKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSk7CiAKICAgICB2b2lkIHNldEJ1ZmZlcmluZ1NldHRpbmdzKGNvbnN0IEJ1ZmZlcmluZ1NldHRpbmdzICZidWZmZXJpbmcpOwogCkBAIC0xODcsNyArMTg3LDcgQEAKIAogICAgIHNwPEFNZXNzYWdlPiBtTm90aWZ5OwogICAgIHVpbnQzMl90IG1GbGFnczsKLSAgICBzcDxJTWVkaWFIVFRQU2VydmljZT4gbUhUVFBTZXJ2aWNlOworICAgIHNwPE1lZGlhSFRUUFNlcnZpY2U+IG1IVFRQU2VydmljZTsKIAogICAgIGJvb2wgbUJ1ZmZlcmluZzsKICAgICBib29sIG1JblByZXBhcmF0aW9uUGhhc2U7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvUGxheWxpc3RGZXRjaGVyLmNwcAppbmRleCBiNDY2OTRiLi5iNDZkOTIzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL1BsYXlsaXN0RmV0Y2hlci5jcHAKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYUtleXMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2F2Y191dGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CkBAIC0xNjkzLDEyICsxNjk0LDEyIEBACiAgICAgICAgIHNwPEFNZXNzYWdlPiBleHRyYSA9IG5ldyBBTWVzc2FnZTsKICAgICAgICAgLy8gU2luY2Ugd2UgYXJlIHVzaW5nIGFic29sdXRlIHRpbWVzdGFtcHMsIHNpZ25hbCBhbiBvZmZzZXQgb2YgMCB0byBwcmV2ZW50CiAgICAgICAgIC8vIEFUU1BhcnNlciBmcm9tIHNrZXdpbmcgdGhlIHRpbWVzdGFtcHMgb2YgYWNjZXNzIHVuaXRzLgotICAgICAgICBleHRyYS0+c2V0SW50NjQoSVN0cmVhbUxpc3RlbmVyOjprS2V5TWVkaWFUaW1lVXMsIDApOworICAgICAgICBleHRyYS0+c2V0SW50NjQoa0FUU1BhcnNlcktleU1lZGlhVGltZVVzLCAwKTsKIAogICAgICAgICAvLyBXaGVuIGFkYXB0aW5nLCBzaWduYWwgYSByZWNlbnQgbWVkaWEgdGltZSB0byB0aGUgcGFyc2VyLAogICAgICAgICAvLyBzbyB0aGF0IFBUUyB3cmFwIGFyb3VuZCBpcyBoYW5kbGVkIGZvciB0aGUgbmV3IHZhcmlhbnQuCiAgICAgICAgIGlmIChtU3RhcnRUaW1lVXMgPj0gMCAmJiAhbVN0YXJ0VGltZVVzUmVsYXRpdmUpIHsKLSAgICAgICAgICAgIGV4dHJhLT5zZXRJbnQ2NChJU3RyZWFtTGlzdGVuZXI6OmtLZXlSZWNlbnRNZWRpYVRpbWVVcywgbVN0YXJ0VGltZVVzKTsKKyAgICAgICAgICAgIGV4dHJhLT5zZXRJbnQ2NChrQVRTUGFyc2VyS2V5UmVjZW50TWVkaWFUaW1lVXMsIG1TdGFydFRpbWVVcyk7CiAgICAgICAgIH0KIAogICAgICAgICBtVFNQYXJzZXItPnNpZ25hbERpc2NvbnRpbnVpdHkoCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0NhbGxiYWNrRGF0YVNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9DYWxsYmFja0RhdGFTb3VyY2UuaAppbmRleCA5ZjQxM2NkLi4zMjU1NmQ2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0NhbGxiYWNrRGF0YVNvdXJjZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQ2FsbGJhY2tEYXRhU291cmNlLmgKQEAgLTQyLDcgKzQyLDYgQEAKICAgICAgICAgcmV0dXJuIG1OYW1lOwogICAgIH0KICAgICB2aXJ0dWFsIHNwPERlY3J5cHRIYW5kbGU+IERybUluaXRpYWxpemF0aW9uKGNvbnN0IGNoYXIgKm1pbWUgPSBOVUxMKTsKLSAgICB2aXJ0dWFsIHNwPElEYXRhU291cmNlPiBnZXRJRGF0YVNvdXJjZSgpIGNvbnN0OwogCiBwcml2YXRlOgogICAgIHNwPElEYXRhU291cmNlPiBtSURhdGFTb3VyY2U7CkBAIC03MSw3ICs3MCw2IEBACiAgICAgICAgIHJldHVybiBtTmFtZTsKICAgICB9CiAgICAgdmlydHVhbCBzcDxEZWNyeXB0SGFuZGxlPiBEcm1Jbml0aWFsaXphdGlvbihjb25zdCBjaGFyICptaW1lID0gTlVMTCk7Ci0gICAgdmlydHVhbCBzcDxJRGF0YVNvdXJjZT4gZ2V0SURhdGFTb3VyY2UoKSBjb25zdDsKIAogcHJpdmF0ZToKICAgICAvLyAya2IgY29tZXMgZnJvbSBleHBlcmltZW50aW5nIHdpdGggdGhlIHRpbWUtdG8tZmlyc3QtZnJhbWUgZnJvbSBhIE1lZGlhUGxheWVyCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL051Q2FjaGVkU291cmNlMi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9OdUNhY2hlZFNvdXJjZTIuaAppbmRleCAxYTM0ODE3Li5mNDM5YTFjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL051Q2FjaGVkU291cmNlMi5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTnVDYWNoZWRTb3VyY2UyLmgKQEAgLTQzLDcgKzQzLDYgQEAKICAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCk7CiAKICAgICB2aXJ0dWFsIHNwPERlY3J5cHRIYW5kbGU+IERybUluaXRpYWxpemF0aW9uKGNvbnN0IGNoYXIqIG1pbWUpOwotICAgIHZpcnR1YWwgdm9pZCBnZXREcm1JbmZvKHNwPERlY3J5cHRIYW5kbGU+ICZoYW5kbGUsIERybU1hbmFnZXJDbGllbnQgKipjbGllbnQpOwogICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRVcmkoKTsKIAogICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRNSU1FVHlwZSgpIGNvbnN0OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TRFBMb2FkZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU0RQTG9hZGVyLmgKaW5kZXggMmM0ZjU0My4uYjkwMWM5NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TRFBMb2FkZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NEUExvYWRlci5oCkBAIC0yNSw3ICsyNSw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBIVFRQQmFzZTsKLXN0cnVjdCBJTWVkaWFIVFRQU2VydmljZTsKK3N0cnVjdCBNZWRpYUhUVFBTZXJ2aWNlOwogCiBzdHJ1Y3QgU0RQTG9hZGVyIDogcHVibGljIEFIYW5kbGVyIHsKICAgICBlbnVtIEZsYWdzIHsKQEAgLTM4LDcgKzM4LDcgQEAKICAgICBTRFBMb2FkZXIoCiAgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLAotICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSk7CisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UpOwogCiAgICAgdm9pZCBsb2FkKGNvbnN0IGNoYXIqIHVybCwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1Rocm90dGxlZFNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9UaHJvdHRsZWRTb3VyY2UuaAppbmRleCA4ZWYyOThhLi43MWU2MmY3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1Rocm90dGxlZFNvdXJjZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvVGhyb3R0bGVkU291cmNlLmgKQEAgLTU4LDEwICs1OCw2IEBACiAgICAgICAgIHJldHVybiBtU291cmNlLT5Ecm1Jbml0aWFsaXphdGlvbihtaW1lKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHZvaWQgZ2V0RHJtSW5mbyhzcDxEZWNyeXB0SGFuZGxlPiAmaGFuZGxlLCBEcm1NYW5hZ2VyQ2xpZW50ICoqY2xpZW50KSB7Ci0gICAgICAgIG1Tb3VyY2UtPmdldERybUluZm8oaGFuZGxlLCBjbGllbnQpOwotICAgIH07Ci0KICAgICB2aXJ0dWFsIFN0cmluZzggZ2V0TUlNRVR5cGUoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtU291cmNlLT5nZXRNSU1FVHlwZSgpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2FsbGJhY2tNZWRpYVNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYWxsYmFja01lZGlhU291cmNlLmgKaW5kZXggYTA5MzQ4Zi4uMzQ1OWRlMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYWxsYmFja01lZGlhU291cmNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYWxsYmFja01lZGlhU291cmNlLmgKQEAgLTMzLDcgKzMzLDYgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCiAgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRCdWZmZXJzKGNvbnN0IFZlY3RvcjxNZWRpYUJ1ZmZlciAqPiAmYnVmZmVycyk7CiAKIHByaXZhdGU6CiAgICAgc3A8SU1lZGlhU291cmNlPiBtU291cmNlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlRmFjdG9yeS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlRmFjdG9yeS5oCmluZGV4IDg5YWRkMTMuLjJhMWQ0OTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZUZhY3RvcnkuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2VGYWN0b3J5LmgKQEAgLTIzLDIwICsyMywyMCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0cnVjdCBJTWVkaWFIVFRQU2VydmljZTsKK3N0cnVjdCBNZWRpYUhUVFBTZXJ2aWNlOwogY2xhc3MgU3RyaW5nODsKIHN0cnVjdCBIVFRQQmFzZTsKIAogY2xhc3MgRGF0YVNvdXJjZUZhY3RvcnkgewogcHVibGljOgogICAgIHN0YXRpYyBzcDxEYXRhU291cmNlPiBDcmVhdGVGcm9tVVJJKAotICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKICAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzID0gTlVMTCwKICAgICAgICAgICAgIFN0cmluZzggKmNvbnRlbnRUeXBlID0gTlVMTCwKICAgICAgICAgICAgIEhUVFBCYXNlICpodHRwU291cmNlID0gTlVMTCk7CiAKLSAgICBzdGF0aWMgc3A8RGF0YVNvdXJjZT4gQ3JlYXRlTWVkaWFIVFRQKGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UpOworICAgIHN0YXRpYyBzcDxEYXRhU291cmNlPiBDcmVhdGVNZWRpYUhUVFAoY29uc3Qgc3A8TWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlKTsKICAgICBzdGF0aWMgc3A8RGF0YVNvdXJjZT4gQ3JlYXRlRnJvbUZkKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKIH07CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmgKaW5kZXggYjRiNWMzYy4uODYwNDg5MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmgKQEAgLTQ1LDggKzQ1LDYgQEAKIAogICAgIHZpcnR1YWwgc3A8RGVjcnlwdEhhbmRsZT4gRHJtSW5pdGlhbGl6YXRpb24oY29uc3QgY2hhciAqbWltZSk7CiAKLSAgICB2aXJ0dWFsIHZvaWQgZ2V0RHJtSW5mbyhzcDxEZWNyeXB0SGFuZGxlPiAmaGFuZGxlLCBEcm1NYW5hZ2VyQ2xpZW50ICoqY2xpZW50KTsKLQogICAgIHZpcnR1YWwgU3RyaW5nOCB0b1N0cmluZygpIHsKICAgICAgICAgcmV0dXJuIG1OYW1lOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaAppbmRleCBlNzQ0MTBkLi4zNjdhNDY3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oCkBAIC01OCw4ICs1OCw2IEBACiAKICAgICBleHBsaWNpdCBNZWRpYUJ1ZmZlcihzaXplX3Qgc2l6ZSk7CiAKLSAgICBleHBsaWNpdCBNZWRpYUJ1ZmZlcihjb25zdCBzcDxHcmFwaGljQnVmZmVyPiYgZ3JhcGhpY0J1ZmZlcik7Ci0KICAgICBleHBsaWNpdCBNZWRpYUJ1ZmZlcihjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKIAogICAgIE1lZGlhQnVmZmVyKGNvbnN0IHNwPElNZW1vcnk+ICZtZW0pIDoKQEAgLTg4LDggKzg2LDYgQEAKIAogICAgIHZvaWQgc2V0X3JhbmdlKHNpemVfdCBvZmZzZXQsIHNpemVfdCBsZW5ndGgpOwogCi0gICAgc3A8R3JhcGhpY0J1ZmZlcj4gZ3JhcGhpY0J1ZmZlcigpIGNvbnN0OwotCiAgICAgc3A8TWV0YURhdGE+IG1ldGFfZGF0YSgpOwogCiAgICAgLy8gQ2xlYXJzIG1ldGEgZGF0YSBhbmQgcmVzZXRzIHRoZSByYW5nZSB0byB0aGUgZnVsbCBleHRlbnQuCkBAIC0xNjcsNyArMTYzLDYgQEAKIAogICAgIHZvaWQgKm1EYXRhOwogICAgIHNpemVfdCBtU2l6ZSwgbVJhbmdlT2Zmc2V0LCBtUmFuZ2VMZW5ndGg7Ci0gICAgc3A8R3JhcGhpY0J1ZmZlcj4gbUdyYXBoaWNCdWZmZXI7CiAgICAgc3A8QUJ1ZmZlcj4gbUJ1ZmZlcjsKIAogICAgIGJvb2wgbU93bnNEYXRhOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaAppbmRleCAxMDMwNDA3Li4wYmMwMmFmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaApAQCAtMjE3LDYgKzIxNyw3IEBACiAgICAgICAgIFNUT1BQSU5HLAogICAgICAgICBSRUxFQVNJTkcsCiAgICAgfTsKKyAgICBzdGQ6OnN0cmluZyBzdGF0ZVN0cmluZyhTdGF0ZSBzdGF0ZSk7CiAKICAgICBlbnVtIHsKICAgICAgICAga1BvcnRJbmRleElucHV0ICAgICAgICAgPSAwLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5LmgKaW5kZXggOTYyOThmOS4uZjIxNmZmOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5oCkBAIC0zMSw2ICszMSwxMiBAQAogcHVibGljOgogICAgIHN0YXRpYyBzcDxJTWVkaWFFeHRyYWN0b3I+IENyZWF0ZSgKICAgICAgICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIGNvbnN0IGNoYXIgKm1pbWUgPSBOVUxMKTsKKyAgICAvLyBDcmVhdGVzIG1lZGlhIGV4dHJhY3RvciBmcm9tIHRoZSBnaXZlbiBmaWxlIGRlc2NyaXB0b3IuIFRvIGF2b2lkIGJpbmRlciBjYWxscyBmb3IKKyAgICAvLyByZWFkaW5nIGZpbGUgZGF0YSwgdGhpcyB0cmllcyB0byBjcmVhdGUgcmVtb3RlIGZpbGUgc291cmNlIGluIGV4dHJhY3RvciBzZXJ2aWNlLgorICAgIC8vIElmIHRoYXQgZmFpbHMsIHRoaXMgZmFsbHMgYmFjayB0byBsb2NhbCBmaWxlIHNvdXJjZS4gVGhlIGRhdGEgc291cmNlIHVzZWQgZm9yIGV4dHJhY3RvcgorICAgIC8vIHdpbGwgYmUgYWxzcCByZXR1cm5lZCB3aXRoIHxvdXR8LgorICAgIHN0YXRpYyBzcDxJTWVkaWFFeHRyYWN0b3I+IENyZWF0ZUZyb21GZCgKKyAgICAgICAgICAgIGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoLCBjb25zdCBjaGFyICptaW1lLCBzcDxEYXRhU291cmNlPiAqb3V0KTsKICAgICBzdGF0aWMgc3A8TWVkaWFFeHRyYWN0b3I+IENyZWF0ZUZyb21TZXJ2aWNlKAogICAgICAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgY29uc3QgY2hhciAqbWltZSA9IE5VTEwpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhSFRUUC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUhUVFAuaAppbmRleCAwMDZkOGQ4Li5mZTBlNjEzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhSFRUUC5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFIVFRQLmgKQEAgLTI0LDEwICsyNCwxMCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0cnVjdCBJTWVkaWFIVFRQQ29ubmVjdGlvbjsKK3N0cnVjdCBNZWRpYUhUVFBDb25uZWN0aW9uOwogCiBzdHJ1Y3QgTWVkaWFIVFRQIDogcHVibGljIEhUVFBCYXNlIHsKLSAgICBNZWRpYUhUVFAoY29uc3Qgc3A8SU1lZGlhSFRUUENvbm5lY3Rpb24+ICZjb25uKTsKKyAgICBNZWRpYUhUVFAoY29uc3Qgc3A8TWVkaWFIVFRQQ29ubmVjdGlvbj4gJmNvbm4pOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjb25uZWN0KAogICAgICAgICAgICAgY29uc3QgY2hhciAqdXJpLApAQCAtNTAsMTMgKzUwLDEyIEBACiAgICAgdmlydHVhbCB+TWVkaWFIVFRQKCk7CiAKICAgICB2aXJ0dWFsIHNwPERlY3J5cHRIYW5kbGU+IERybUluaXRpYWxpemF0aW9uKGNvbnN0IGNoYXIqIG1pbWUpOwotICAgIHZpcnR1YWwgdm9pZCBnZXREcm1JbmZvKHNwPERlY3J5cHRIYW5kbGU+ICZoYW5kbGUsIERybU1hbmFnZXJDbGllbnQgKipjbGllbnQpOwogICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRVcmkoKTsKICAgICB2aXJ0dWFsIFN0cmluZzggZ2V0TUlNRVR5cGUoKSBjb25zdDsKIAogcHJpdmF0ZToKICAgICBzdGF0dXNfdCBtSW5pdENoZWNrOwotICAgIHNwPElNZWRpYUhUVFBDb25uZWN0aW9uPiBtSFRUUENvbm5lY3Rpb247CisgICAgc3A8TWVkaWFIVFRQQ29ubmVjdGlvbj4gbUhUVFBDb25uZWN0aW9uOwogCiAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbUxhc3RIZWFkZXJzOwogICAgIEFTdHJpbmcgbUxhc3RVUkk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5oCmluZGV4IDVhZjA3NDUuLmVlZDBmMDUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5oCkBAIC0zNCw3ICszNCw3IEBACiBzdHJ1Y3QgQUJ1ZmZlcjsKIHN0cnVjdCBBTWVzc2FnZTsKIGNsYXNzIERhdGFTb3VyY2U7Ci1zdHJ1Y3QgSU1lZGlhSFRUUFNlcnZpY2U7CitzdHJ1Y3QgTWVkaWFIVFRQU2VydmljZTsKIGNsYXNzIE1lZGlhQnVmZmVyOwogY2xhc3MgTWVkaWFFeHRyYWN0b3I7CiBzdHJ1Y3QgTWVkaWFTb3VyY2U7CkBAIC01NCw3ICs1NCw3IEBACiAgICAgTnVNZWRpYUV4dHJhY3RvcigpOwogCiAgICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZSgKLSAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCiAgICAgICAgICAgICBjb25zdCBjaGFyICpwYXRoLAogICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMgPSBOVUxMKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9SZW1vdGVEYXRhU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1JlbW90ZURhdGFTb3VyY2UuaAppbmRleCBlMTkxZTZhLi40ZGRjNWUzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1JlbW90ZURhdGFTb3VyY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1JlbW90ZURhdGFTb3VyY2UuaApAQCAtMzEsOSArMzEsNiBAQAogICAgICAgICBpZiAoc291cmNlLmdldCgpID09IG51bGxwdHIpIHsKICAgICAgICAgICAgIHJldHVybiBudWxscHRyOwogICAgICAgICB9Ci0gICAgICAgIGlmIChzb3VyY2UtPmdldElEYXRhU291cmNlKCkuZ2V0KCkgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgcmV0dXJuIHNvdXJjZS0+Z2V0SURhdGFTb3VyY2UoKTsKLSAgICAgICAgfQogICAgICAgICByZXR1cm4gbmV3IFJlbW90ZURhdGFTb3VyY2Uoc291cmNlKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFTb3VyY2UuaAppbmRleCBiYTU0MTRhLi4wYTQ0NmE1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhU291cmNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9SZW1vdGVNZWRpYVNvdXJjZS5oCkBAIC0zNSw3ICszNSw2IEBACiAgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwKICAgICAgICAgICAgIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEJ1ZmZlcnMoY29uc3QgVmVjdG9yPE1lZGlhQnVmZmVyICo+ICZidWZmZXJzKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0b3BUaW1lVXMoaW50NjRfdCBzdG9wVGltZVVzKTsKIAogcHJpdmF0ZToKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvU2ltcGxlRGVjb2RpbmdTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvU2ltcGxlRGVjb2RpbmdTb3VyY2UuaAppbmRleCA2YWVkZTA4Li4zMDA2YjQ1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1NpbXBsZURlY29kaW5nU291cmNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9TaW1wbGVEZWNvZGluZ1NvdXJjZS5oCkBAIC02OSw3ICs2OSw2IEBACiAKICAgICAvLyB1bnN1cHBvcnRlZCBtZXRob2RzCiAgICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpIHsgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOyB9Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRCdWZmZXJzKGNvbnN0IFZlY3RvcjxNZWRpYUJ1ZmZlciAqPiAmKSB7IHJldHVybiBJTlZBTElEX09QRVJBVElPTjsgfQogCiBwcml2YXRlOgogICAgIC8vIENvbnN0cnVjdCB0aGlzIHVzaW5nIGEgY29kZWMsIHNvdXJjZSBhbmQgbG9vcGVyLgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuY3BwCmluZGV4IGNkNjBhNmMuLjQ2NGVlOTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5jcHAKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFLZXlzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9hdmNfdXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KQEAgLTM0MSw3ICszNDIsNyBAQAogICAgIGlmICgodHlwZSAmIERJU0NPTlRJTlVJVFlfVElNRSkKICAgICAgICAgICAgICYmIGV4dHJhICE9IE5VTEwKICAgICAgICAgICAgICYmIGV4dHJhLT5maW5kSW50NjQoCi0gICAgICAgICAgICAgICAgSVN0cmVhbUxpc3RlbmVyOjprS2V5TWVkaWFUaW1lVXMsICZtZWRpYVRpbWVVcykpIHsKKyAgICAgICAgICAgICAgICBrQVRTUGFyc2VyS2V5TWVkaWFUaW1lVXMsICZtZWRpYVRpbWVVcykpIHsKICAgICAgICAgbUZpcnN0UFRTVmFsaWQgPSBmYWxzZTsKICAgICB9CiAKQEAgLTEwMzIsNyArMTAzMyw3IEBACiAgICAgICAgIHVpbnQ2NF90IHJlc3VtZUF0UFRTOwogICAgICAgICBpZiAoZXh0cmEgIT0gTlVMTAogICAgICAgICAgICAgICAgICYmIGV4dHJhLT5maW5kSW50NjQoCi0gICAgICAgICAgICAgICAgICAgIElTdHJlYW1MaXN0ZW5lcjo6a0tleVJlc3VtZUF0UFRTLAorICAgICAgICAgICAgICAgICAgICBrQVRTUGFyc2VyS2V5UmVzdW1lQXRQVFMsCiAgICAgICAgICAgICAgICAgICAgIChpbnQ2NF90ICopJnJlc3VtZUF0UFRTKSkgewogICAgICAgICAgICAgaW50NjRfdCByZXN1bWVBdE1lZGlhVGltZVVzID0KICAgICAgICAgICAgICAgICBtUHJvZ3JhbS0+Y29udmVydFBUU1RvVGltZXN0YW1wKHJlc3VtZUF0UFRTKTsKQEAgLTE2OTQsMTIgKzE2OTUsMTIgQEAKICAgICAgICAgRGlzY29udGludWl0eVR5cGUgdHlwZSwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZleHRyYSkgewogICAgIGludDY0X3QgbWVkaWFUaW1lVXM7CiAgICAgaWYgKCh0eXBlICYgRElTQ09OVElOVUlUWV9USU1FKSAmJiBleHRyYSAhPSBOVUxMKSB7Ci0gICAgICAgIGlmIChleHRyYS0+ZmluZEludDY0KElTdHJlYW1MaXN0ZW5lcjo6a0tleU1lZGlhVGltZVVzLCAmbWVkaWFUaW1lVXMpKSB7CisgICAgICAgIGlmIChleHRyYS0+ZmluZEludDY0KGtBVFNQYXJzZXJLZXlNZWRpYVRpbWVVcywgJm1lZGlhVGltZVVzKSkgewogICAgICAgICAgICAgbUFic29sdXRlVGltZUFuY2hvclVzID0gbWVkaWFUaW1lVXM7CiAgICAgICAgIH0KICAgICAgICAgaWYgKChtRmxhZ3MgJiBUU19USU1FU1RBTVBTX0FSRV9BQlNPTFVURSkKICAgICAgICAgICAgICAgICAmJiBleHRyYS0+ZmluZEludDY0KAotICAgICAgICAgICAgICAgICAgICBJU3RyZWFtTGlzdGVuZXI6OmtLZXlSZWNlbnRNZWRpYVRpbWVVcywgJm1lZGlhVGltZVVzKSkgeworICAgICAgICAgICAgICAgICAgICBrQVRTUGFyc2VyS2V5UmVjZW50TWVkaWFUaW1lVXMsICZtZWRpYVRpbWVVcykpIHsKICAgICAgICAgICAgIGlmIChtQWJzb2x1dGVUaW1lQW5jaG9yVXMgPj0gMGxsKSB7CiAgICAgICAgICAgICAgICAgbWVkaWFUaW1lVXMgLT0gbUFic29sdXRlVGltZUFuY2hvclVzOwogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuY3BwCmluZGV4IGZhMTVhYjMuLjJmYmJiNDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5jcHAKQEAgLTY2NCw0ICs2NjQsMTcgQEAKICAgICByZXR1cm4gU2ltcGxlU29mdE9NWENvbXBvbmVudDo6Z2V0RXh0ZW5zaW9uSW5kZXgobmFtZSwgaW5kZXgpOwogfQogCitPTVhfRVJST1JUWVBFIFNvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQ6OnZhbGlkYXRlSW5wdXRCdWZmZXIoCisgICAgICAgIGNvbnN0IE9NWF9CVUZGRVJIRUFERVJUWVBFICppbnB1dEJ1ZmZlckhlYWRlcikgeworICAgIHNpemVfdCBmcmFtZVNpemUgPSBtSW5wdXREYXRhSXNNZXRhID8KKyAgICAgICAgICAgIG1heChzaXplb2YoVmlkZW9OYXRpdmVNZXRhZGF0YSksIHNpemVvZihWaWRlb0dyYWxsb2NNZXRhZGF0YSkpCisgICAgICAgICAgICA6IG1XaWR0aCAqIG1IZWlnaHQgKiAzIC8gMjsKKyAgICBpZiAoaW5wdXRCdWZmZXJIZWFkZXItPm5GaWxsZWRMZW4gPCBmcmFtZVNpemUpIHsKKyAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICB9IGVsc2UgaWYgKGlucHV0QnVmZmVySGVhZGVyLT5uRmlsbGVkTGVuID4gZnJhbWVTaXplKSB7CisgICAgICAgIEFMT0dXKCJJbnB1dCBidWZmZXIgY29udGFpbnMgbW9yZSBkYXRhIHRoYW4gZXhwZWN0ZWQuIik7CisgICAgfQorICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50LmgKaW5kZXggZGI1NDk2YS4uMmQ2ZjMxYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5oCkBAIC02Nyw2ICs2Nyw4IEBACiAKICAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgZ2V0RXh0ZW5zaW9uSW5kZXgoY29uc3QgY2hhciAqbmFtZSwgT01YX0lOREVYVFlQRSAqaW5kZXgpOwogCisgICAgT01YX0VSUk9SVFlQRSB2YWxpZGF0ZUlucHV0QnVmZmVyKGNvbnN0IE9NWF9CVUZGRVJIRUFERVJUWVBFICppbnB1dEJ1ZmZlckhlYWRlcik7CisKICAgICBlbnVtIHsKICAgICAgICAga0lucHV0UG9ydEluZGV4ID0gMCwKICAgICAgICAga091dHB1dFBvcnRJbmRleCA9IDEsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1NEUExvYWRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1NEUExvYWRlci5jcHAKaW5kZXggMGY0NmM4My4uZDQ1OWNiZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9TRFBMb2FkZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvU0RQTG9hZGVyLmNwcApAQCAtMjIsOCArMjIsOCBAQAogCiAjaW5jbHVkZSAiQVNlc3Npb25EZXNjcmlwdGlvbi5oIgogCi0jaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUENvbm5lY3Rpb24uaD4KLSNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhSFRUUENvbm5lY3Rpb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFIVFRQLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KQEAgLTM2LDcgKzM2LDcgQEAKIFNEUExvYWRlcjo6U0RQTG9hZGVyKAogICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKICAgICAgICAgdWludDMyX3QgZmxhZ3MsCi0gICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UpCisgICAgICAgIGNvbnN0IHNwPE1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSkKICAgICA6IG1Ob3RpZnkobm90aWZ5KSwKICAgICAgIG1GbGFncyhmbGFncyksCiAgICAgICBtTmV0TG9vcGVyKG5ldyBBTG9vcGVyKSwKZGlmZiAtLWdpdCBhL21lZGlhL210cC9JTXRwRGF0YWJhc2UuaCBiL21lZGlhL210cC9JTXRwRGF0YWJhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDlhOTg0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL0lNdHBEYXRhYmFzZS5oCkBAIC0wLDAgKzEsMTIwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfSV9NVFBfREFUQUJBU0VfSAorI2RlZmluZSBfSV9NVFBfREFUQUJBU0VfSAorCisjaW5jbHVkZSAiTXRwVHlwZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNdHBEYXRhUGFja2V0OworY2xhc3MgTXRwUHJvcGVydHk7CitjbGFzcyBNdHBPYmplY3RJbmZvOworCitjbGFzcyBJTXRwRGF0YWJhc2UgeworcHVibGljOgorICAgIHZpcnR1YWwgfklNdHBEYXRhYmFzZSgpIHt9CisKKyAgICAvLyBDYWxsZWQgZnJvbSBTZW5kT2JqZWN0SW5mbyB0byByZXNlcnZlIGEgZGF0YWJhc2UgZW50cnkgZm9yIHRoZSBpbmNvbWluZyBmaWxlLgorICAgIHZpcnR1YWwgTXRwT2JqZWN0SGFuZGxlICAgICAgICAgYmVnaW5TZW5kT2JqZWN0KGNvbnN0IGNoYXIqIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEhhbmRsZSBwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cFN0b3JhZ2VJRCBzdG9yYWdlKSA9IDA7CisKKyAgICAvLyBDYWxsZWQgdG8gcmVwb3J0IHN1Y2Nlc3Mgb3IgZmFpbHVyZSBvZiB0aGUgU2VuZE9iamVjdCBmaWxlIHRyYW5zZmVyLgorICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICAgICAgICAgZW5kU2VuZE9iamVjdChNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN1Y2NlZWRlZCkgPSAwOworICAgIAorICAgIC8vIENhbGxlZCB0byByZXNjYW4gYSBmaWxlLCBzdWNoIGFzIGFmdGVyIGFuIGVkaXQuCisgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgICAgICAgICByZXNjYW5GaWxlKGNvbnN0IGNoYXIqIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQpID0gMDsKKworICAgIHZpcnR1YWwgTXRwT2JqZWN0SGFuZGxlTGlzdCogICAgZ2V0T2JqZWN0TGlzdChNdHBTdG9yYWdlSUQgc3RvcmFnZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGUgcGFyZW50KSA9IDA7CisKKyAgICB2aXJ0dWFsIGludCAgICAgICAgICAgICAgICAgICAgIGdldE51bU9iamVjdHMoTXRwU3RvcmFnZUlEIHN0b3JhZ2VJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCkgPSAwOworCisgICAgLy8gY2FsbGVlIHNob3VsZCBkZWxldGVbXSB0aGUgcmVzdWx0cyBmcm9tIHRoZXNlCisgICAgLy8gcmVzdWx0cyBjYW4gYmUgTlVMTAorICAgIHZpcnR1YWwgTXRwT2JqZWN0Rm9ybWF0TGlzdCogICAgZ2V0U3VwcG9ydGVkUGxheWJhY2tGb3JtYXRzKCkgPSAwOworICAgIHZpcnR1YWwgTXRwT2JqZWN0Rm9ybWF0TGlzdCogICAgZ2V0U3VwcG9ydGVkQ2FwdHVyZUZvcm1hdHMoKSA9IDA7CisgICAgdmlydHVhbCBNdHBPYmplY3RQcm9wZXJ0eUxpc3QqICBnZXRTdXBwb3J0ZWRPYmplY3RQcm9wZXJ0aWVzKE10cE9iamVjdEZvcm1hdCBmb3JtYXQpID0gMDsKKyAgICB2aXJ0dWFsIE10cERldmljZVByb3BlcnR5TGlzdCogIGdldFN1cHBvcnRlZERldmljZVByb3BlcnRpZXMoKSA9IDA7CisKKyAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIGdldE9iamVjdFByb3BlcnR5VmFsdWUoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0UHJvcGVydHkgcHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQmIHBhY2tldCkgPSAwOworCisgICAgdmlydHVhbCBNdHBSZXNwb25zZUNvZGUgICAgICAgICBzZXRPYmplY3RQcm9wZXJ0eVZhbHVlKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdFByb3BlcnR5IHByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBEYXRhUGFja2V0JiBwYWNrZXQpID0gMDsKKworICAgIHZpcnR1YWwgTXRwUmVzcG9uc2VDb2RlICAgICAgICAgZ2V0RGV2aWNlUHJvcGVydHlWYWx1ZShNdHBEZXZpY2VQcm9wZXJ0eSBwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGF0YVBhY2tldCYgcGFja2V0KSA9IDA7CisKKyAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIHNldERldmljZVByb3BlcnR5VmFsdWUoTXRwRGV2aWNlUHJvcGVydHkgcHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQmIHBhY2tldCkgPSAwOworCisgICAgdmlydHVhbCBNdHBSZXNwb25zZUNvZGUgICAgICAgICByZXNldERldmljZVByb3BlcnR5KE10cERldmljZVByb3BlcnR5IHByb3BlcnR5KSA9IDA7CisKKyAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIGdldE9iamVjdFByb3BlcnR5TGlzdChNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQsIHVpbnQzMl90IHByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ3JvdXBDb2RlLCBpbnQgZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQmIHBhY2tldCkgPSAwOworCisgICAgdmlydHVhbCBNdHBSZXNwb25zZUNvZGUgICAgICAgICBnZXRPYmplY3RJbmZvKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEluZm8mIGluZm8pID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCogICAgICAgICAgICAgICAgICAgZ2V0VGh1bWJuYWlsKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsIHNpemVfdCYgb3V0VGh1bWJTaXplKSA9IDA7CisKKyAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIGdldE9iamVjdEZpbGVQYXRoKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cFN0cmluZyYgb3V0RmlsZVBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QmIG91dEZpbGVMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEZvcm1hdCYgb3V0Rm9ybWF0KSA9IDA7CisKKyAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIGJlZ2luRGVsZXRlT2JqZWN0KE10cE9iamVjdEhhbmRsZSBoYW5kbGUpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICAgICAgICAgIGVuZERlbGV0ZU9iamVjdChNdHBPYmplY3RIYW5kbGUgaGFuZGxlLCBib29sIHN1Y2NlZWRlZCkgPSAwOworCisgICAgdmlydHVhbCBNdHBPYmplY3RIYW5kbGVMaXN0KiAgICBnZXRPYmplY3RSZWZlcmVuY2VzKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpID0gMDsKKworICAgIHZpcnR1YWwgTXRwUmVzcG9uc2VDb2RlICAgICAgICAgc2V0T2JqZWN0UmVmZXJlbmNlcyhNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGVMaXN0KiByZWZlcmVuY2VzKSA9IDA7CisKKyAgICB2aXJ0dWFsIE10cFByb3BlcnR5KiAgICAgICAgICAgIGdldE9iamVjdFByb3BlcnR5RGVzYyhNdHBPYmplY3RQcm9wZXJ0eSBwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCkgPSAwOworCisgICAgdmlydHVhbCBNdHBQcm9wZXJ0eSogICAgICAgICAgICBnZXREZXZpY2VQcm9wZXJ0eURlc2MoTXRwRGV2aWNlUHJvcGVydHkgcHJvcGVydHkpID0gMDsKKworICAgIHZpcnR1YWwgTXRwUmVzcG9uc2VDb2RlICAgICAgICAgYmVnaW5Nb3ZlT2JqZWN0KE10cE9iamVjdEhhbmRsZSBoYW5kbGUsIE10cE9iamVjdEhhbmRsZSBuZXdQYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cFN0b3JhZ2VJRCBuZXdTdG9yYWdlKSA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICAgICAgICAgIGVuZE1vdmVPYmplY3QoTXRwT2JqZWN0SGFuZGxlIG9sZFBhcmVudCwgTXRwT2JqZWN0SGFuZGxlIG5ld1BhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwU3RvcmFnZUlEIG9sZFN0b3JhZ2UsIE10cFN0b3JhZ2VJRCBuZXdTdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGUgaGFuZGxlLCBib29sIHN1Y2NlZWRlZCkgPSAwOworCisgICAgdmlydHVhbCBNdHBSZXNwb25zZUNvZGUgICAgICAgICBiZWdpbkNvcHlPYmplY3QoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwgTXRwT2JqZWN0SGFuZGxlIG5ld1BhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwU3RvcmFnZUlEIG5ld1N0b3JhZ2UpOworICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICAgICAgICAgZW5kQ29weU9iamVjdChNdHBPYmplY3RIYW5kbGUgaGFuZGxlLCBib29sIHN1Y2NlZWRlZCk7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gX0lfTVRQX0RBVEFCQVNFX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBEYXRhYmFzZS5oIGIvbWVkaWEvbXRwL010cERhdGFiYXNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzZjk3MjAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbXRwL010cERhdGFiYXNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX01UUF9EQVRBQkFTRV9ICi0jZGVmaW5lIF9NVFBfREFUQUJBU0VfSAotCi0jaW5jbHVkZSAiTXRwVHlwZXMuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBNdHBEYXRhUGFja2V0OwotY2xhc3MgTXRwUHJvcGVydHk7Ci1jbGFzcyBNdHBPYmplY3RJbmZvOwotCi1jbGFzcyBNdHBEYXRhYmFzZSB7Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCB+TXRwRGF0YWJhc2UoKSB7fQotCi0gICAgLy8gY2FsbGVkIGZyb20gU2VuZE9iamVjdEluZm8gdG8gcmVzZXJ2ZSBhIGRhdGFiYXNlIGVudHJ5IGZvciB0aGUgaW5jb21pbmcgZmlsZQotICAgIHZpcnR1YWwgTXRwT2JqZWN0SGFuZGxlICAgICAgICAgYmVnaW5TZW5kT2JqZWN0KGNvbnN0IGNoYXIqIHBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEhhbmRsZSBwYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cFN0b3JhZ2VJRCBzdG9yYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lX3QgbW9kaWZpZWQpID0gMDsKLQotICAgIC8vIGNhbGxlZCB0byByZXBvcnQgc3VjY2VzcyBvciBmYWlsdXJlIG9mIHRoZSBTZW5kT2JqZWN0IGZpbGUgdHJhbnNmZXIKLSAgICAvLyBzdWNjZXNzIHNob3VsZCBzaWduYWwgYSBub3RpZmljYXRpb24gb2YgdGhlIG5ldyBvYmplY3QncyBjcmVhdGlvbiwKLSAgICAvLyBmYWlsdXJlIHNob3VsZCByZW1vdmUgdGhlIGRhdGFiYXNlIGVudHJ5IGNyZWF0ZWQgaW4gYmVnaW5TZW5kT2JqZWN0Ci0gICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgICAgICAgICBlbmRTZW5kT2JqZWN0KGNvbnN0IGNoYXIqIHBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VjY2VlZGVkKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICAgICAgICAgIGRvU2NhbkRpcmVjdG9yeShjb25zdCBjaGFyKiBwYXRoKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIE10cE9iamVjdEhhbmRsZUxpc3QqICAgIGdldE9iamVjdExpc3QoTXRwU3RvcmFnZUlEIHN0b3JhZ2VJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCkgPSAwOwotCi0gICAgdmlydHVhbCBpbnQgICAgICAgICAgICAgICAgICAgICBnZXROdW1PYmplY3RzKE10cFN0b3JhZ2VJRCBzdG9yYWdlSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEhhbmRsZSBwYXJlbnQpID0gMDsKLQotICAgIC8vIGNhbGxlZSBzaG91bGQgZGVsZXRlW10gdGhlIHJlc3VsdHMgZnJvbSB0aGVzZQotICAgIC8vIHJlc3VsdHMgY2FuIGJlIE5VTEwKLSAgICB2aXJ0dWFsIE10cE9iamVjdEZvcm1hdExpc3QqICAgIGdldFN1cHBvcnRlZFBsYXliYWNrRm9ybWF0cygpID0gMDsKLSAgICB2aXJ0dWFsIE10cE9iamVjdEZvcm1hdExpc3QqICAgIGdldFN1cHBvcnRlZENhcHR1cmVGb3JtYXRzKCkgPSAwOwotICAgIHZpcnR1YWwgTXRwT2JqZWN0UHJvcGVydHlMaXN0KiAgZ2V0U3VwcG9ydGVkT2JqZWN0UHJvcGVydGllcyhNdHBPYmplY3RGb3JtYXQgZm9ybWF0KSA9IDA7Ci0gICAgdmlydHVhbCBNdHBEZXZpY2VQcm9wZXJ0eUxpc3QqICBnZXRTdXBwb3J0ZWREZXZpY2VQcm9wZXJ0aWVzKCkgPSAwOwotCi0gICAgdmlydHVhbCBNdHBSZXNwb25zZUNvZGUgICAgICAgICBnZXRPYmplY3RQcm9wZXJ0eVZhbHVlKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdFByb3BlcnR5IHByb3BlcnR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBEYXRhUGFja2V0JiBwYWNrZXQpID0gMDsKLQotICAgIHZpcnR1YWwgTXRwUmVzcG9uc2VDb2RlICAgICAgICAgc2V0T2JqZWN0UHJvcGVydHlWYWx1ZShNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RQcm9wZXJ0eSBwcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGF0YVBhY2tldCYgcGFja2V0KSA9IDA7Ci0KLSAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIGdldERldmljZVByb3BlcnR5VmFsdWUoTXRwRGV2aWNlUHJvcGVydHkgcHJvcGVydHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQmIHBhY2tldCkgPSAwOwotCi0gICAgdmlydHVhbCBNdHBSZXNwb25zZUNvZGUgICAgICAgICBzZXREZXZpY2VQcm9wZXJ0eVZhbHVlKE10cERldmljZVByb3BlcnR5IHByb3BlcnR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBEYXRhUGFja2V0JiBwYWNrZXQpID0gMDsKLQotICAgIHZpcnR1YWwgTXRwUmVzcG9uc2VDb2RlICAgICAgICAgcmVzZXREZXZpY2VQcm9wZXJ0eShNdHBEZXZpY2VQcm9wZXJ0eSBwcm9wZXJ0eSkgPSAwOwotCi0gICAgdmlydHVhbCBNdHBSZXNwb25zZUNvZGUgICAgICAgICBnZXRPYmplY3RQcm9wZXJ0eUxpc3QoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LCB1aW50MzJfdCBwcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGdyb3VwQ29kZSwgaW50IGRlcHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBEYXRhUGFja2V0JiBwYWNrZXQpID0gMDsKLQotICAgIHZpcnR1YWwgTXRwUmVzcG9uc2VDb2RlICAgICAgICAgZ2V0T2JqZWN0SW5mbyhNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RJbmZvJiBpbmZvKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHZvaWQqICAgICAgICAgICAgICAgICAgIGdldFRodW1ibmFpbChNdHBPYmplY3RIYW5kbGUgaGFuZGxlLCBzaXplX3QmIG91dFRodW1iU2l6ZSkgPSAwOwotCi0gICAgdmlydHVhbCBNdHBSZXNwb25zZUNvZGUgICAgICAgICBnZXRPYmplY3RGaWxlUGF0aChNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBTdHJpbmcmIG91dEZpbGVQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90JiBvdXRGaWxlTGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQmIG91dEZvcm1hdCkgPSAwOwotCi0gICAgdmlydHVhbCBNdHBSZXNwb25zZUNvZGUgICAgICAgICBkZWxldGVGaWxlKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpID0gMDsKLQotICAgIHZpcnR1YWwgTXRwT2JqZWN0SGFuZGxlTGlzdCogICAgZ2V0T2JqZWN0UmVmZXJlbmNlcyhNdHBPYmplY3RIYW5kbGUgaGFuZGxlKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIHNldE9iamVjdFJlZmVyZW5jZXMoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlTGlzdCogcmVmZXJlbmNlcykgPSAwOwotCi0gICAgdmlydHVhbCBNdHBQcm9wZXJ0eSogICAgICAgICAgICBnZXRPYmplY3RQcm9wZXJ0eURlc2MoTXRwT2JqZWN0UHJvcGVydHkgcHJvcGVydHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQpID0gMDsKLQotICAgIHZpcnR1YWwgTXRwUHJvcGVydHkqICAgICAgICAgICAgZ2V0RGV2aWNlUHJvcGVydHlEZXNjKE10cERldmljZVByb3BlcnR5IHByb3BlcnR5KSA9IDA7Ci0KLSAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIG1vdmVPYmplY3QoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwgTXRwT2JqZWN0SGFuZGxlIG5ld1BhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwU3RvcmFnZUlEIG5ld1N0b3JhZ2UsIE10cFN0cmluZyYgbmV3UGF0aCkgPSAwOwotCi0gICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgICAgICAgICBzZXNzaW9uU3RhcnRlZCgpID0gMDsKLQotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbkVuZGVkKCkgPSAwOwotfTsKLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIF9NVFBfREFUQUJBU0VfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFNlcnZlci5jcHAgYi9tZWRpYS9tdHAvTXRwU2VydmVyLmNwcAppbmRleCBiYjA0MTRkLi5jZmRhMGE2IDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvTXRwU2VydmVyLmNwcAorKysgYi9tZWRpYS9tdHAvTXRwU2VydmVyLmNwcApAQCAtMTQsNiArMTQsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8Y2hyb25vPgpAQCAtMzEsNyArMzIsNyBAQAogI2RlZmluZSBMT0dfVEFHICJNdHBTZXJ2ZXIiCiAKICNpbmNsdWRlICJNdHBEZWJ1Zy5oIgotI2luY2x1ZGUgIk10cERhdGFiYXNlLmgiCisjaW5jbHVkZSAiSU10cERhdGFiYXNlLmgiCiAjaW5jbHVkZSAiTXRwRGV2SGFuZGxlLmgiCiAjaW5jbHVkZSAiTXRwRmZzQ29tcGF0SGFuZGxlLmgiCiAjaW5jbHVkZSAiTXRwRmZzSGFuZGxlLmgiCkBAIC05OSw3ICsxMDAsNyBAQAogICAgIE1UUF9FVkVOVF9ERVZJQ0VfUFJPUF9DSEFOR0VELAogfTsKIAotTXRwU2VydmVyOjpNdHBTZXJ2ZXIoTXRwRGF0YWJhc2UqIGRhdGFiYXNlLCBib29sIHB0cCwKK010cFNlcnZlcjo6TXRwU2VydmVyKElNdHBEYXRhYmFzZSogZGF0YWJhc2UsIGJvb2wgcHRwLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBNdHBTdHJpbmcmIGRldmljZUluZm9NYW51ZmFjdHVyZXIsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE10cFN0cmluZyYgZGV2aWNlSW5mb01vZGVsLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBNdHBTdHJpbmcmIGRldmljZUluZm9EZXZpY2VWZXJzaW9uLApAQCAtMTUwLDIxICsxNTEsMTcgQEAKIAogdm9pZCBNdHBTZXJ2ZXI6OnJlbW92ZVN0b3JhZ2UoTXRwU3RvcmFnZSogc3RvcmFnZSkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU3RvcmFnZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKG1TdG9yYWdlc1tpXSA9PSBzdG9yYWdlKSB7Ci0gICAgICAgICAgICBtU3RvcmFnZXMucmVtb3ZlQXQoaSk7Ci0gICAgICAgICAgICBzZW5kU3RvcmVSZW1vdmVkKHN0b3JhZ2UtPmdldFN0b3JhZ2VJRCgpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9CisgICAgYXV0byBpdGVyID0gc3RkOjpmaW5kKG1TdG9yYWdlcy5iZWdpbigpLCBtU3RvcmFnZXMuZW5kKCksIHN0b3JhZ2UpOworICAgIGlmIChpdGVyICE9IG1TdG9yYWdlcy5lbmQoKSkgeworICAgICAgICBzZW5kU3RvcmVSZW1vdmVkKHN0b3JhZ2UtPmdldFN0b3JhZ2VJRCgpKTsKKyAgICAgICAgbVN0b3JhZ2VzLmVyYXNlKGl0ZXIpOwogICAgIH0KIH0KIAogTXRwU3RvcmFnZSogTXRwU2VydmVyOjpnZXRTdG9yYWdlKE10cFN0b3JhZ2VJRCBpZCkgewogICAgIGlmIChpZCA9PSAwKQogICAgICAgICByZXR1cm4gbVN0b3JhZ2VzWzBdOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVN0b3JhZ2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIE10cFN0b3JhZ2UqIHN0b3JhZ2UgPSBtU3RvcmFnZXNbaV07CisgICAgZm9yIChNdHBTdG9yYWdlICpzdG9yYWdlIDogbVN0b3JhZ2VzKSB7CiAgICAgICAgIGlmIChzdG9yYWdlLT5nZXRTdG9yYWdlSUQoKSA9PSBpZCkKICAgICAgICAgICAgIHJldHVybiBzdG9yYWdlOwogICAgIH0KQEAgLTI2NSw5ICsyNjIsNiBAQAogICAgIH0KICAgICBtT2JqZWN0RWRpdExpc3QuY2xlYXIoKTsKIAotICAgIGlmIChtU2Vzc2lvbk9wZW4pCi0gICAgICAgIG1EYXRhYmFzZS0+c2Vzc2lvbkVuZGVkKCk7Ci0KICAgICBzSGFuZGxlLT5jbG9zZSgpOwogfQogCkBAIC0zMzUsNyArMzI5LDcgQEAKIH0KIAogdm9pZCBNdHBTZXJ2ZXI6OmNvbW1pdEVkaXQoT2JqZWN0RWRpdCogZWRpdCkgewotICAgIG1EYXRhYmFzZS0+ZW5kU2VuZE9iamVjdCgoY29uc3QgY2hhciAqKWVkaXQtPm1QYXRoLCBlZGl0LT5tSGFuZGxlLCBlZGl0LT5tRm9ybWF0LCB0cnVlKTsKKyAgICBtRGF0YWJhc2UtPnJlc2NhbkZpbGUoKGNvbnN0IGNoYXIgKillZGl0LT5tUGF0aCwgZWRpdC0+bUhhbmRsZSwgZWRpdC0+bUZvcm1hdCk7CiB9CiAKIApAQCAtMzQ4LDkgKzM0Miw5IEBACiAgICAgbVJlc3BvbnNlLnJlc2V0KCk7CiAKICAgICBpZiAobVNlbmRPYmplY3RIYW5kbGUgIT0ga0ludmFsaWRPYmplY3RIYW5kbGUgJiYgb3BlcmF0aW9uICE9IE1UUF9PUEVSQVRJT05fU0VORF9PQkpFQ1QpIHsKLSAgICAgICAgLy8gRklYTUUgLSBuZWVkIHRvIGRlbGV0ZSBtU2VuZE9iamVjdEhhbmRsZSBmcm9tIHRoZSBkYXRhYmFzZQotICAgICAgICBBTE9HRSgiZXhwZWN0ZWQgU2VuZE9iamVjdCBhZnRlciBTZW5kT2JqZWN0SW5mbyIpOwogICAgICAgICBtU2VuZE9iamVjdEhhbmRsZSA9IGtJbnZhbGlkT2JqZWN0SGFuZGxlOworICAgICAgICBtU2VuZE9iamVjdEZvcm1hdCA9IDA7CisgICAgICAgIG1TZW5kT2JqZWN0TW9kaWZpZWRUaW1lID0gMDsKICAgICB9CiAKICAgICBpbnQgY29udGFpbmVydHlwZSA9IG1SZXF1ZXN0LmdldENvbnRhaW5lclR5cGUoKTsKQEAgLTUyNiw4ICs1MjAsNiBAQAogICAgIG1TZXNzaW9uSUQgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMSk7CiAgICAgbVNlc3Npb25PcGVuID0gdHJ1ZTsKIAotICAgIG1EYXRhYmFzZS0+c2Vzc2lvblN0YXJ0ZWQoKTsKLQogICAgIHJldHVybiBNVFBfUkVTUE9OU0VfT0s7CiB9CiAKQEAgLTUzNiw3ICs1MjgsNiBAQAogICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX1NFU1NJT05fTk9UX09QRU47CiAgICAgbVNlc3Npb25JRCA9IDA7CiAgICAgbVNlc3Npb25PcGVuID0gZmFsc2U7Ci0gICAgbURhdGFiYXNlLT5zZXNzaW9uRW5kZWQoKTsKICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOwogfQogCkBAIC02MDQsNiArNTk1LDggQEAKICAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9JTlZBTElEX1NUT1JBR0VfSUQ7CiAKICAgICBNdHBPYmplY3RIYW5kbGVMaXN0KiBoYW5kbGVzID0gbURhdGFiYXNlLT5nZXRPYmplY3RMaXN0KHN0b3JhZ2VJRCwgZm9ybWF0LCBwYXJlbnQpOworICAgIGlmIChoYW5kbGVzID09IE5VTEwpCisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfSU5WQUxJRF9PQkpFQ1RfSEFORExFOwogICAgIG1EYXRhLnB1dEFVSW50MzIoaGFuZGxlcyk7CiAgICAgZGVsZXRlIGhhbmRsZXM7CiAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKQEAgLTk5MSwyNiArOTg0LDI1IEBACiAgICAgfQogCiAgICAgQUxPR0QoInBhdGg6ICVzIHBhcmVudDogJWQgc3RvcmFnZUlEOiAlMDhYIiwgKGNvbnN0IGNoYXIqKXBhdGgsIHBhcmVudCwgc3RvcmFnZUlEKTsKLSAgICBNdHBPYmplY3RIYW5kbGUgaGFuZGxlID0gbURhdGFiYXNlLT5iZWdpblNlbmRPYmplY3QoKGNvbnN0IGNoYXIqKXBhdGgsCi0gICAgICAgICAgICBmb3JtYXQsIHBhcmVudCwgc3RvcmFnZUlELCBtU2VuZE9iamVjdEZpbGVTaXplLCBtb2RpZmllZFRpbWUpOworICAgIE10cE9iamVjdEhhbmRsZSBoYW5kbGUgPSBtRGF0YWJhc2UtPmJlZ2luU2VuZE9iamVjdCgoY29uc3QgY2hhciopcGF0aCwgZm9ybWF0LAorICAgICAgICAgICAgcGFyZW50LCBzdG9yYWdlSUQpOwogICAgIGlmIChoYW5kbGUgPT0ga0ludmFsaWRPYmplY3RIYW5kbGUpIHsKICAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9HRU5FUkFMX0VSUk9SOwogICAgIH0KIAotICBpZiAoZm9ybWF0ID09IE1UUF9GT1JNQVRfQVNTT0NJQVRJT04pIHsKKyAgICBpZiAoZm9ybWF0ID09IE1UUF9GT1JNQVRfQVNTT0NJQVRJT04pIHsKICAgICAgICAgaW50IHJldCA9IG1ha2VGb2xkZXIoKGNvbnN0IGNoYXIgKilwYXRoKTsKICAgICAgICAgaWYgKHJldCkKICAgICAgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfR0VORVJBTF9FUlJPUjsKIAogICAgICAgICAvLyBTZW5kT2JqZWN0IGRvZXMgbm90IGdldCBzZW50IGZvciBkaXJlY3Rvcmllcywgc28gY2FsbCBlbmRTZW5kT2JqZWN0IGhlcmUgaW5zdGVhZAotICAgICAgICBtRGF0YWJhc2UtPmVuZFNlbmRPYmplY3QocGF0aCwgaGFuZGxlLCBNVFBfRk9STUFUX0FTU09DSUFUSU9OLCBNVFBfUkVTUE9OU0VfT0spOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1TZW5kT2JqZWN0RmlsZVBhdGggPSBwYXRoOwotICAgICAgICAvLyBzYXZlIHRoZSBoYW5kbGUgZm9yIHRoZSBTZW5kT2JqZWN0IGNhbGwsIHdoaWNoIHNob3VsZCBmb2xsb3cKLSAgICAgICAgbVNlbmRPYmplY3RIYW5kbGUgPSBoYW5kbGU7Ci0gICAgICAgIG1TZW5kT2JqZWN0Rm9ybWF0ID0gZm9ybWF0OwotICAgICAgICBtU2VuZE9iamVjdE1vZGlmaWVkVGltZSA9IG1vZGlmaWVkVGltZTsKKyAgICAgICAgbURhdGFiYXNlLT5lbmRTZW5kT2JqZWN0KGhhbmRsZSwgTVRQX1JFU1BPTlNFX09LKTsKICAgICB9CisgICAgbVNlbmRPYmplY3RGaWxlUGF0aCA9IHBhdGg7CisgICAgLy8gc2F2ZSB0aGUgaGFuZGxlIGZvciB0aGUgU2VuZE9iamVjdCBjYWxsLCB3aGljaCBzaG91bGQgZm9sbG93CisgICAgbVNlbmRPYmplY3RIYW5kbGUgPSBoYW5kbGU7CisgICAgbVNlbmRPYmplY3RGb3JtYXQgPSBmb3JtYXQ7CisgICAgbVNlbmRPYmplY3RNb2RpZmllZFRpbWUgPSBtb2RpZmllZFRpbWU7CiAKICAgICBtUmVzcG9uc2Uuc2V0UGFyYW1ldGVyKDEsIHN0b3JhZ2VJRCk7CiAgICAgbVJlc3BvbnNlLnNldFBhcmFtZXRlcigyLCBwYXJlbnQpOwpAQCAtMTA2MSw2ICsxMDUzLDEwIEBACiAgICAgICAgIHBhdGggKz0gIi8iOwogICAgIHBhdGggKz0gaW5mby5tTmFtZTsKIAorICAgIHJlc3VsdCA9IG1EYXRhYmFzZS0+YmVnaW5Nb3ZlT2JqZWN0KG9iamVjdEhhbmRsZSwgcGFyZW50LCBzdG9yYWdlSUQpOworICAgIGlmIChyZXN1bHQgIT0gTVRQX1JFU1BPTlNFX09LKQorICAgICAgICByZXR1cm4gcmVzdWx0OworCiAgICAgaWYgKGluZm8ubVN0b3JhZ2VJRCA9PSBzdG9yYWdlSUQpIHsKICAgICAgICAgQUxPR1YoIk1vdmluZyBmaWxlIGZyb20gJXMgdG8gJXMiLCAoY29uc3QgY2hhciopZnJvbVBhdGgsIChjb25zdCBjaGFyKilwYXRoKTsKICAgICAgICAgaWYgKHJlbmFtZShmcm9tUGF0aCwgcGF0aCkpIHsKQEAgLTEwODcsOCArMTA4Myw4IEBACiAgICAgfQogCiAgICAgLy8gSWYgdGhlIG1vdmUgZmFpbGVkLCB1bmRvIHRoZSBkYXRhYmFzZSBjaGFuZ2UKLSAgICBpZiAocmVzdWx0ID09IE1UUF9SRVNQT05TRV9PSykKLSAgICAgICAgcmVzdWx0ID0gbURhdGFiYXNlLT5tb3ZlT2JqZWN0KG9iamVjdEhhbmRsZSwgcGFyZW50LCBzdG9yYWdlSUQsIHBhdGgpOworICAgIG1EYXRhYmFzZS0+ZW5kTW92ZU9iamVjdChpbmZvLm1QYXJlbnQsIHBhcmVudCwgaW5mby5tU3RvcmFnZUlELCBzdG9yYWdlSUQsIG9iamVjdEhhbmRsZSwKKyAgICAgICAgICAgIHJlc3VsdCA9PSBNVFBfUkVTUE9OU0VfT0spOwogCiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTExMzksOCArMTEzNSw3IEBACiAgICAgICAgIHBhdGggKz0gIi8iOwogICAgIHBhdGggKz0gaW5mby5tTmFtZTsKIAotICAgIE10cE9iamVjdEhhbmRsZSBoYW5kbGUgPSBtRGF0YWJhc2UtPmJlZ2luU2VuZE9iamVjdCgoY29uc3QgY2hhciopcGF0aCwKLSAgICAgICAgICAgIGZvcm1hdCwgcGFyZW50LCBzdG9yYWdlSUQsIGZpbGVMZW5ndGgsIGluZm8ubURhdGVNb2RpZmllZCk7CisgICAgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSA9IG1EYXRhYmFzZS0+YmVnaW5Db3B5T2JqZWN0KG9iamVjdEhhbmRsZSwgcGFyZW50LCBzdG9yYWdlSUQpOwogICAgIGlmIChoYW5kbGUgPT0ga0ludmFsaWRPYmplY3RIYW5kbGUpIHsKICAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9HRU5FUkFMX0VSUk9SOwogICAgIH0KQEAgLTExNTgsOSArMTE1Myw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBtRGF0YWJhc2UtPmVuZFNlbmRPYmplY3QocGF0aCwgaGFuZGxlLCBmb3JtYXQsIHJlc3VsdCk7Ci0gICAgaWYgKGZvcm1hdCA9PSBNVFBfRk9STUFUX0FTU09DSUFUSU9OKQotICAgICAgICBtRGF0YWJhc2UtPmRvU2NhbkRpcmVjdG9yeShwYXRoKTsKKyAgICBtRGF0YWJhc2UtPmVuZENvcHlPYmplY3QoaGFuZGxlLCByZXN1bHQpOwogICAgIG1SZXNwb25zZS5zZXRQYXJhbWV0ZXIoMSwgaGFuZGxlKTsKICAgICByZXR1cm4gcmVzdWx0OwogfQpAQCAtMTE5MCw2ICsxMTgzLDE1IEBACiAgICAgfQogICAgIGluaXRpYWxEYXRhID0gcmV0IC0gTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRTsKIAorICAgIGlmIChtU2VuZE9iamVjdEZvcm1hdCA9PSBNVFBfRk9STUFUX0FTU09DSUFUSU9OKSB7CisgICAgICAgIGlmIChpbml0aWFsRGF0YSAhPSAwKQorICAgICAgICAgICAgQUxPR0UoIkV4cGVjdGVkIGZvbGRlciBzaXplIHRvIGJlIDAhIik7CisgICAgICAgIG1TZW5kT2JqZWN0SGFuZGxlID0ga0ludmFsaWRPYmplY3RIYW5kbGU7CisgICAgICAgIG1TZW5kT2JqZWN0Rm9ybWF0ID0gMDsKKyAgICAgICAgbVNlbmRPYmplY3RNb2RpZmllZFRpbWUgPSAwOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKwogICAgIG10cF9maWxlX3JhbmdlICBtZnI7CiAgICAgbWZyLmZkID0gb3BlbihtU2VuZE9iamVjdEZpbGVQYXRoLCBPX1JEV1IgfCBPX0NSRUFUIHwgT19UUlVOQywgU19JUlVTUiB8IFNfSVdVU1IpOwogICAgIGlmIChtZnIuZmQgPCAwKSB7CkBAIC0xMjU1LDggKzEyNTcsNyBAQAogICAgIC8vIHJlc2V0IHNvIHdlIGRvbid0IGF0dGVtcHQgdG8gc2VuZCB0aGUgZGF0YSBiYWNrCiAgICAgbURhdGEucmVzZXQoKTsKIAotICAgIG1EYXRhYmFzZS0+ZW5kU2VuZE9iamVjdChtU2VuZE9iamVjdEZpbGVQYXRoLCBtU2VuZE9iamVjdEhhbmRsZSwgbVNlbmRPYmplY3RGb3JtYXQsCi0gICAgICAgICAgICByZXN1bHQgPT0gTVRQX1JFU1BPTlNFX09LKTsKKyAgICBtRGF0YWJhc2UtPmVuZFNlbmRPYmplY3QobVNlbmRPYmplY3RIYW5kbGUsIHJlc3VsdCA9PSBNVFBfUkVTUE9OU0VfT0spOwogICAgIG1TZW5kT2JqZWN0SGFuZGxlID0ga0ludmFsaWRPYmplY3RIYW5kbGU7CiAgICAgbVNlbmRPYmplY3RGb3JtYXQgPSAwOwogICAgIG1TZW5kT2JqZWN0TW9kaWZpZWRUaW1lID0gMDsKQEAgLTEyODIsMTYgKzEyODMsMTggQEAKICAgICBNdHBTdHJpbmcgZmlsZVBhdGg7CiAgICAgaW50NjRfdCBmaWxlTGVuZ3RoOwogICAgIGludCByZXN1bHQgPSBtRGF0YWJhc2UtPmdldE9iamVjdEZpbGVQYXRoKGhhbmRsZSwgZmlsZVBhdGgsIGZpbGVMZW5ndGgsIGZvcm1hdCk7Ci0gICAgaWYgKHJlc3VsdCA9PSBNVFBfUkVTUE9OU0VfT0spIHsKLSAgICAgICAgQUxPR1YoImRlbGV0aW5nICVzIiwgKGNvbnN0IGNoYXIgKilmaWxlUGF0aCk7Ci0gICAgICAgIHJlc3VsdCA9IG1EYXRhYmFzZS0+ZGVsZXRlRmlsZShoYW5kbGUpOwotICAgICAgICAvLyBEb24ndCBkZWxldGUgdGhlIGFjdHVhbCBmaWxlcyB1bmxlc3MgdGhlIGRhdGFiYXNlIGRlbGV0aW9uIGlzIGFsbG93ZWQKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBNVFBfUkVTUE9OU0VfT0spIHsKLSAgICAgICAgICAgIGRlbGV0ZVBhdGgoKGNvbnN0IGNoYXIgKilmaWxlUGF0aCk7Ci0gICAgICAgIH0KLSAgICB9CisgICAgaWYgKHJlc3VsdCAhPSBNVFBfUkVTUE9OU0VfT0spCisgICAgICAgIHJldHVybiByZXN1bHQ7CiAKLSAgICByZXR1cm4gcmVzdWx0OworICAgIC8vIERvbid0IGRlbGV0ZSB0aGUgYWN0dWFsIGZpbGVzIHVubGVzcyB0aGUgZGF0YWJhc2UgZGVsZXRpb24gaXMgYWxsb3dlZAorICAgIHJlc3VsdCA9IG1EYXRhYmFzZS0+YmVnaW5EZWxldGVPYmplY3QoaGFuZGxlKTsKKyAgICBpZiAocmVzdWx0ICE9IE1UUF9SRVNQT05TRV9PSykKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKworICAgIGJvb2wgc3VjY2VzcyA9IGRlbGV0ZVBhdGgoKGNvbnN0IGNoYXIgKilmaWxlUGF0aCk7CisKKyAgICBtRGF0YWJhc2UtPmVuZERlbGV0ZU9iamVjdChoYW5kbGUsIHN1Y2Nlc3MpOworICAgIHJldHVybiBzdWNjZXNzID8gcmVzdWx0IDogTVRQX1JFU1BPTlNFX1BBUlRJQUxfREVMRVRJT047CiB9CiAKIE10cFJlc3BvbnNlQ29kZSBNdHBTZXJ2ZXI6OmRvR2V0T2JqZWN0UHJvcERlc2MoKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwU2VydmVyLmggYi9tZWRpYS9tdHAvTXRwU2VydmVyLmgKaW5kZXggMDIwNGIwOS4uYWYzNzFlYiAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL010cFNlcnZlci5oCisrKyBiL21lZGlhL210cC9NdHBTZXJ2ZXIuaApAQCAtMzIsMTMgKzMyLDEzIEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY2xhc3MgTXRwRGF0YWJhc2U7CitjbGFzcyBJTXRwRGF0YWJhc2U7CiBjbGFzcyBNdHBTdG9yYWdlOwogCiBjbGFzcyBNdHBTZXJ2ZXIgewogCiBwcml2YXRlOgotICAgIE10cERhdGFiYXNlKiAgICAgICAgbURhdGFiYXNlOworICAgIElNdHBEYXRhYmFzZSogICAgICAgbURhdGFiYXNlOwogCiAgICAgLy8gYXBwZWFyIGFzIGEgUFRQIGRldmljZQogICAgIGJvb2wgICAgICAgICAgICAgICAgbVB0cDsKQEAgLTk4LDcgKzk4LDcgQEAKICAgICBWZWN0b3I8T2JqZWN0RWRpdCo+ICBtT2JqZWN0RWRpdExpc3Q7CiAKIHB1YmxpYzoKLSAgICAgICAgICAgICAgICAgICAgICAgIE10cFNlcnZlcihNdHBEYXRhYmFzZSogZGF0YWJhc2UsIGJvb2wgcHRwLAorICAgICAgICAgICAgICAgICAgICAgICAgTXRwU2VydmVyKElNdHBEYXRhYmFzZSogZGF0YWJhc2UsIGJvb2wgcHRwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTXRwU3RyaW5nJiBkZXZpY2VJbmZvTWFudWZhY3R1cmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTXRwU3RyaW5nJiBkZXZpY2VJbmZvTW9kZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNdHBTdHJpbmcmIGRldmljZUluZm9EZXZpY2VWZXJzaW9uLApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFN0b3JhZ2UuY3BwIGIvbWVkaWEvbXRwL010cFN0b3JhZ2UuY3BwCmluZGV4IGQ3N2NhNzIuLmExNDczMjUgMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9NdHBTdG9yYWdlLmNwcAorKysgYi9tZWRpYS9tdHAvTXRwU3RvcmFnZS5jcHAKQEAgLTE3LDcgKzE3LDYgQEAKICNkZWZpbmUgTE9HX1RBRyAiTXRwU3RvcmFnZSIKIAogI2luY2x1ZGUgIk10cERlYnVnLmgiCi0jaW5jbHVkZSAiTXRwRGF0YWJhc2UuaCIKICNpbmNsdWRlICJNdHBTdG9yYWdlLmgiCiAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KQEAgLTMzLDE0ICszMiwxMiBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBNdHBTdG9yYWdlOjpNdHBTdG9yYWdlKE10cFN0b3JhZ2VJRCBpZCwgY29uc3QgY2hhciogZmlsZVBhdGgsCi0gICAgICAgIGNvbnN0IGNoYXIqIGRlc2NyaXB0aW9uLCB1aW50NjRfdCByZXNlcnZlU3BhY2UsCi0gICAgICAgIGJvb2wgcmVtb3ZhYmxlLCB1aW50NjRfdCBtYXhGaWxlU2l6ZSkKKyAgICAgICAgY29uc3QgY2hhciogZGVzY3JpcHRpb24sIGJvb2wgcmVtb3ZhYmxlLCB1aW50NjRfdCBtYXhGaWxlU2l6ZSkKICAgICA6ICAgbVN0b3JhZ2VJRChpZCksCiAgICAgICAgIG1GaWxlUGF0aChmaWxlUGF0aCksCiAgICAgICAgIG1EZXNjcmlwdGlvbihkZXNjcmlwdGlvbiksCiAgICAgICAgIG1NYXhDYXBhY2l0eSgwKSwKICAgICAgICAgbU1heEZpbGVTaXplKG1heEZpbGVTaXplKSwKLSAgICAgICAgbVJlc2VydmVTcGFjZShyZXNlcnZlU3BhY2UpLAogICAgICAgICBtUmVtb3ZhYmxlKHJlbW92YWJsZSkKIHsKICAgICBBTE9HVigiTXRwU3RvcmFnZSBpZDogJWQgcGF0aDogJXNcbiIsIGlkLCBmaWxlUGF0aCk7CkBAIC03NSw4ICs3Miw3IEBACiAgICAgc3RydWN0IHN0YXRmcyAgIHN0YXQ7CiAgICAgaWYgKHN0YXRmcyhnZXRQYXRoKCksICZzdGF0KSkKICAgICAgICAgcmV0dXJuIC0xOwotICAgIHVpbnQ2NF90IGZyZWVTcGFjZSA9ICh1aW50NjRfdClzdGF0LmZfYmF2YWlsICogKHVpbnQ2NF90KXN0YXQuZl9ic2l6ZTsKLSAgICByZXR1cm4gKGZyZWVTcGFjZSA+IG1SZXNlcnZlU3BhY2UgPyBmcmVlU3BhY2UgLSBtUmVzZXJ2ZVNwYWNlIDogMCk7CisgICAgcmV0dXJuICh1aW50NjRfdClzdGF0LmZfYmF2YWlsICogKHVpbnQ2NF90KXN0YXQuZl9ic2l6ZTsKIH0KIAogY29uc3QgY2hhciogTXRwU3RvcmFnZTo6Z2V0RGVzY3JpcHRpb24oKSBjb25zdCB7CmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwU3RvcmFnZS5oIGIvbWVkaWEvbXRwL010cFN0b3JhZ2UuaAppbmRleCBlNWEyZTU3Li5jYjdlMzMzIDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvTXRwU3RvcmFnZS5oCisrKyBiL21lZGlhL210cC9NdHBTdG9yYWdlLmgKQEAgLTMyLDEzICszMiwxMSBAQAogICAgIE10cFN0cmluZyAgICAgICAgICAgICAgIG1EZXNjcmlwdGlvbjsKICAgICB1aW50NjRfdCAgICAgICAgICAgICAgICBtTWF4Q2FwYWNpdHk7CiAgICAgdWludDY0X3QgICAgICAgICAgICAgICAgbU1heEZpbGVTaXplOwotICAgIC8vIGFtb3VudCBvZiBmcmVlIHNwYWNlIHRvIGxlYXZlIHVuYWxsb2NhdGVkCi0gICAgdWludDY0X3QgICAgICAgICAgICAgICAgbVJlc2VydmVTcGFjZTsKICAgICBib29sICAgICAgICAgICAgICAgICAgICBtUmVtb3ZhYmxlOwogCiBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwU3RvcmFnZShNdHBTdG9yYWdlSUQgaWQsIGNvbnN0IGNoYXIqIGZpbGVQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZGVzY3JpcHRpb24sIHVpbnQ2NF90IHJlc2VydmVTcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGRlc2NyaXB0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZW1vdmFibGUsIHVpbnQ2NF90IG1heEZpbGVTaXplKTsKICAgICB2aXJ0dWFsICAgICAgICAgICAgICAgICB+TXRwU3RvcmFnZSgpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwVXRpbHMuY3BwIGIvbWVkaWEvbXRwL010cFV0aWxzLmNwcAppbmRleCAzZjU2NDhiLi41MWNmZDdkIDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvTXRwVXRpbHMuY3BwCisrKyBiL21lZGlhL210cC9NdHBVdGlscy5jcHAKQEAgLTIwNCwyOSArMjA0LDM5IEBACiAgICAgICAgIGlmIChuYW1lWzBdID09ICcuJyAmJiAobmFtZVsxXSA9PSAwIHx8IChuYW1lWzFdID09ICcuJyAmJiBuYW1lWzJdID09IDApKSkgewogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KLSAgICAgICAgcGF0aFN0ci5hcHBlbmQobmFtZSk7CisgICAgICAgIHN0cmluZyBjaGlsZFBhdGggPSBwYXRoU3RyICsgbmFtZTsKKyAgICAgICAgaW50IHN1Y2Nlc3M7CiAgICAgICAgIGlmIChlbnRyeS0+ZF90eXBlID09IERUX0RJUikgewotICAgICAgICAgICAgZGVsZXRlUmVjdXJzaXZlKHBhdGhTdHIuY19zdHIoKSk7Ci0gICAgICAgICAgICBybWRpcihwYXRoU3RyLmNfc3RyKCkpOworICAgICAgICAgICAgZGVsZXRlUmVjdXJzaXZlKGNoaWxkUGF0aC5jX3N0cigpKTsKKyAgICAgICAgICAgIHN1Y2Nlc3MgPSBybWRpcihjaGlsZFBhdGguY19zdHIoKSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB1bmxpbmsocGF0aFN0ci5jX3N0cigpKTsKKyAgICAgICAgICAgIHN1Y2Nlc3MgPSB1bmxpbmsoY2hpbGRQYXRoLmNfc3RyKCkpOwogICAgICAgICB9CisgICAgICAgIGlmIChzdWNjZXNzID09IC0xKQorICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIkRlbGV0aW5nIHBhdGggIiA8PCBjaGlsZFBhdGggPDwgIiBmYWlsZWQiOwogICAgIH0KICAgICBjbG9zZWRpcihkaXIpOwogfQogCi12b2lkIGRlbGV0ZVBhdGgoY29uc3QgY2hhciogcGF0aCkgeworYm9vbCBkZWxldGVQYXRoKGNvbnN0IGNoYXIqIHBhdGgpIHsKICAgICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworICAgIGludCBzdWNjZXNzOwogICAgIGlmIChzdGF0KHBhdGgsICZzdGF0YnVmKSA9PSAwKSB7CiAgICAgICAgIGlmIChTX0lTRElSKHN0YXRidWYuc3RfbW9kZSkpIHsKKyAgICAgICAgICAgIC8vIHJtZGlyIHdpbGwgZmFpbCBpZiB0aGUgZGlyZWN0b3J5IGlzIG5vbiBlbXB0eSwgc28KKyAgICAgICAgICAgIC8vIHRoZXJlIGlzIG5vIG5lZWQgdG8ga2VlcCBlcnJvcnMgZnJvbSBkZWxldGVSZWN1cnNpdmUKICAgICAgICAgICAgIGRlbGV0ZVJlY3Vyc2l2ZShwYXRoKTsKLSAgICAgICAgICAgIHJtZGlyKHBhdGgpOworICAgICAgICAgICAgc3VjY2VzcyA9IHJtZGlyKHBhdGgpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdW5saW5rKHBhdGgpOworICAgICAgICAgICAgc3VjY2VzcyA9IHVubGluayhwYXRoKTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIFBMT0coRVJST1IpIDw8ICJkZWxldGVQYXRoIHN0YXQgZmFpbGVkIGZvciAiIDw8IHBhdGg7OworICAgICAgICBQTE9HKEVSUk9SKSA8PCAiZGVsZXRlUGF0aCBzdGF0IGZhaWxlZCBmb3IgIiA8PCBwYXRoOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQorICAgIGlmIChzdWNjZXNzID09IC0xKQorICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRGVsZXRpbmcgcGF0aCAiIDw8IHBhdGggPDwgIiBmYWlsZWQiOworICAgIHJldHVybiBzdWNjZXNzID09IDA7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwVXRpbHMuaCBiL21lZGlhL210cC9NdHBVdGlscy5oCmluZGV4IGI3YzcyZjUuLjc0NDU0NmIgMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9NdHBVdGlscy5oCisrKyBiL21lZGlhL210cC9NdHBVdGlscy5oCkBAIC0zMyw4ICszMyw3IEBACiBpbnQgbWFrZUZvbGRlcihjb25zdCBjaGFyICpwYXRoKTsKIGludCBjb3B5UmVjdXJzaXZlKGNvbnN0IGNoYXIgKmZyb21QYXRoLCBjb25zdCBjaGFyICp0b1BhdGgpOwogaW50IGNvcHlGaWxlKGNvbnN0IGNoYXIgKmZyb21QYXRoLCBjb25zdCBjaGFyICp0b1BhdGgpOwotdm9pZCBkZWxldGVSZWN1cnNpdmUoY29uc3QgY2hhciogcGF0aCk7Ci12b2lkIGRlbGV0ZVBhdGgoY29uc3QgY2hhciogcGF0aCk7Citib29sIGRlbGV0ZVBhdGgoY29uc3QgY2hhciogcGF0aCk7CiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL0FuZHJvaWQuYnAgYi9tZWRpYS91dGlscy9BbmRyb2lkLmJwCmluZGV4IDcyOTE3ZGQuLmYyYmM2ZDAgMTAwNjQ0Ci0tLSBhL21lZGlhL3V0aWxzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvdXRpbHMvQW5kcm9pZC5icApAQCAtMjQsNyArMjQsNiBAQAogICAgIF0sCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmJpbmRlciIsCi0gICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYm1lbXVucmVhY2hhYmxlIiwKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhVXBkYXRlL0FuZHJvaWQubWsgYi9wYWNrYWdlcy9NZWRpYVVwZGF0ZS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NTcwOTgKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYVVwZGF0ZS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMjggQEAKKyMKKyMgQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IE1lZGlhVXBkYXRlCitMT0NBTF9NT0RVTEVfT1dORVIgOj0gZ29vZ2xlCitMT0NBTF9QUklWSUxFR0VEX01PRFVMRSA6PSB0cnVlCisKKyMgVE9ETzogY3JlYXRlIGEgc2VwYXJhdGUga2V5IGZvciB0aGlzIHBhY2thZ2UuCitMT0NBTF9DRVJUSUZJQ0FURSA6PSBwbGF0Zm9ybQorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhVXBkYXRlL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9wYWNrYWdlcy9NZWRpYVVwZGF0ZS9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MWFlNDQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYVVwZGF0ZS9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMTQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZSIKKyAgICBhbmRyb2lkOnZlcnNpb25Db2RlPSIxIgorICAgIGFuZHJvaWQ6dmVyc2lvbk5hbWU9IjEuMCIgPgorCisgICAgPGFwcGxpY2F0aW9uCisgICAgICAgIGFuZHJvaWQ6bGFiZWw9Ik1lZGlhIENvbXBvbmVudHMgVXBkYXRlIgorICAgICAgICBhbmRyb2lkOm11bHRpQXJjaD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDphbGxvd0JhY2t1cD0iZmFsc2UiCisgICAgICAgIGFuZHJvaWQ6ZXh0cmFjdE5hdGl2ZUxpYnM9ImZhbHNlIj4KKyAgICA8L2FwcGxpY2F0aW9uPgorCis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvT1dORVJTIGIvcGFja2FnZXMvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiYzRjZWYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9PV05FUlMKQEAgLTAsMCArMSw2IEBACitha2Vyc3RlbkBnb29nbGUuY29tCitkd2thbmdAZ29vZ2xlLmNvbQoramFld2FuQGdvb2dsZS5jb20KK21hcmNvbmVAZ29vZ2xlLmNvbQorc3VuZ3Nvb0Bnb29nbGUuY29tCit3amlhQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAKaW5kZXggYWViMzJiYi4uOWZlZjYwZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAKQEAgLTE1ODUsNiArMTU4NSw3IEBACiAKICAgICBvdXRwdXQuY2Jsay5jbGVhcigpOwogICAgIG91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgb3V0cHV0LmlucHV0SWQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKIAogICAgIGJvb2wgdXBkYXRlUGlkID0gKGlucHV0LmNsaWVudEluZm8uY2xpZW50UGlkID09IC0xKTsKICAgICBjb25zdCB1aWRfdCBjYWxsaW5nVWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwpAQCAtMTYzMyw3ICsxNjM0LDYgQEAKICAgICB9CiAKICAgICBvdXRwdXQuc2Vzc2lvbklkID0gc2Vzc2lvbklkOwotICAgIG91dHB1dC5pbnB1dElkID0gQVVESU9fSU9fSEFORExFX05PTkU7CiAgICAgb3V0cHV0LnNlbGVjdGVkRGV2aWNlSWQgPSBpbnB1dC5zZWxlY3RlZERldmljZUlkOwogICAgIG91dHB1dC5mbGFncyA9IGlucHV0LmZsYWdzOwogCkBAIC0xNjQ1LDYgKzE2NDUsMTIgQEAKICAgICAvLyBUaGUgc3A8PiByZWZlcmVuY2VzIHdpbGwgYmUgZHJvcHBlZCB3aGVuIHJlLWVudGVyaW5nIHNjb3BlLgogICAgIC8vIFRoZSBsYWNrIG9mIGluZGVudGF0aW9uIGlzIGRlbGliZXJhdGUsIHRvIHJlZHVjZSBjb2RlIGNodXJuIGFuZCBlYXNlIG1lcmdlcy4KICAgICBmb3IgKDs7KSB7CisgICAgLy8gcmVsZWFzZSBwcmV2aW91c2x5IG9wZW5lZCBpbnB1dCBpZiByZXRyeWluZy4KKyAgICBpZiAob3V0cHV0LmlucHV0SWQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgcmVjb3JkVHJhY2suY2xlYXIoKTsKKyAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VJbnB1dChvdXRwdXQuaW5wdXRJZCwgc2Vzc2lvbklkKTsKKyAgICAgICAgb3V0cHV0LmlucHV0SWQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICB9CiAgICAgbFN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpnZXRJbnB1dEZvckF0dHIoJmlucHV0LmF0dHIsICZvdXRwdXQuaW5wdXRJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgY29tcGFyZSB0byBBdWRpb1RyYWNrCkBAIC0xNjgwLDEzICsxNjg2LDEwIEBACiAgICAgICAgIC8vIGxTdGF0dXMgPT0gQkFEX1RZUEUgbWVhbnMgRkFTVCBmbGFnIHdhcyByZWplY3RlZDogcmVxdWVzdCBhIG5ldyBpbnB1dCBmcm9tCiAgICAgICAgIC8vIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIHdpdGhvdXQgRkFTVCBjb25zdHJhaW50CiAgICAgICAgIGlmIChsU3RhdHVzID09IEJBRF9UWVBFKSB7Ci0gICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUlucHV0KG91dHB1dC5pbnB1dElkLCBzZXNzaW9uSWQpOwotICAgICAgICAgICAgcmVjb3JkVHJhY2suY2xlYXIoKTsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGxTdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJlY29yZFRyYWNrLmNsZWFyKCk7CiAgICAgICAgICAgICBnb3RvIEV4aXQ7CiAgICAgICAgIH0KIApAQCAtMTcxOSw2ICsxNzIyLDEwIEBACiAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2NsKG1DbGllbnRMb2NrKTsKICAgICAgICAgICAgIGNsaWVudC5jbGVhcigpOwogICAgICAgICB9CisgICAgICAgIHJlY29yZFRyYWNrLmNsZWFyKCk7CisgICAgICAgIGlmIChvdXRwdXQuaW5wdXRJZCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VJbnB1dChvdXRwdXQuaW5wdXRJZCwgc2Vzc2lvbklkKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgICpzdGF0dXMgPSBsU3RhdHVzOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuY3BwCmluZGV4IGViNGYzNGMuLmRkYTlkMjAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5jcHAKQEAgLTY3LDExICs2NywxNSBAQAogICAgIDogbVBpbm5lZChwaW5uZWQpLAogICAgICAgbVRocmVhZCh0aHJlYWQpLCBtQ2hhaW4oY2hhaW4pLCBtSWQoaWQpLCBtU2Vzc2lvbklkKHNlc3Npb25JZCksCiAgICAgICBtRGVzY3JpcHRvcigqZGVzYyksCi0gICAgICAvLyBtQ29uZmlnIGlzIHNldCBieSBjb25maWd1cmUoKSBhbmQgbm90IHVzZWQgYmVmb3JlIHRoZW4KKyAgICAgIC8vIGNsZWFyIG1Db25maWcgdG8gZW5zdXJlIGNvbnNpc3RlbnQgaW5pdGlhbCB2YWx1ZSBvZiBidWZmZXIgZnJhbWVjb3VudAorICAgICAgLy8gaW4gY2FzZSBidWZmZXJzIGFyZSBhc3NvY2lhdGVkIGJ5IHNldEluQnVmZmVyKCkgb3Igc2V0T3V0QnVmZmVyKCkKKyAgICAgIC8vIHByaW9yIHRvIGNvbmZpZ3VyZSgpLgorICAgICAgbUNvbmZpZ3t7fSwge319LAogICAgICAgbVN0YXR1cyhOT19JTklUKSwgbVN0YXRlKElETEUpLAotICAgICAgLy8gbU1heERpc2FibGVXYWl0Q250IGlzIHNldCBieSBjb25maWd1cmUoKSBhbmQgbm90IHVzZWQgYmVmb3JlIHRoZW4KLSAgICAgIC8vIG1EaXNhYmxlV2FpdENudCBpcyBzZXQgYnkgcHJvY2VzcygpIGFuZCB1cGRhdGVTdGF0ZSgpIGFuZCBub3QgdXNlZCBiZWZvcmUgdGhlbgorICAgICAgbU1heERpc2FibGVXYWl0Q250KDEpLCAvLyBzZXQgYnkgY29uZmlndXJlKCksIHNob3VsZCBiZSA+PSAxCisgICAgICBtRGlzYWJsZVdhaXRDbnQoMCksICAgIC8vIHNldCBieSBwcm9jZXNzKCkgYW5kIHVwZGF0ZVN0YXRlKCkKICAgICAgIG1TdXNwZW5kZWQoZmFsc2UpLAorICAgICAgbU9mZmxvYWRlZChmYWxzZSksCiAgICAgICBtQXVkaW9GbGluZ2VyKHRocmVhZC0+bUF1ZGlvRmxpbmdlcikKICNpZmRlZiBGTE9BVF9FRkZFQ1RfQ0hBSU4KICAgICAgICwgbVN1cHBvcnRzRmxvYXQoZmFsc2UpCkBAIC01ODYsMTAgKzU5MCwxNCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgbU1heERpc2FibGVXYWl0Q250ID0gKE1BWF9ESVNBQkxFX1RJTUVfTVMgKiBtQ29uZmlnLm91dHB1dENmZy5zYW1wbGluZ1JhdGUpIC8KLSAgICAgICAgICAgICgxMDAwICogbUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQpOworICAgIC8vIG1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50IGNhbm5vdCBiZSB6ZXJvLgorICAgIG1NYXhEaXNhYmxlV2FpdENudCA9ICh1aW50MzJfdClzdGQ6Om1heCgKKyAgICAgICAgICAgICh1aW50NjRfdCkxLCAvLyBtTWF4RGlzYWJsZVdhaXRDbnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4KKyAgICAgICAgICAgICh1aW50NjRfdClNQVhfRElTQUJMRV9USU1FX01TICogbUNvbmZpZy5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlCisgICAgICAgICAgICAgICAgLyAoKHVpbnQ2NF90KTEwMDAgKiBtQ29uZmlnLm91dHB1dENmZy5idWZmZXIuZnJhbWVDb3VudCkpOwogCiBleGl0OgorICAgIC8vIFRPRE86IGNvbnNpZGVyIGNsZWFyaW5nIG1Db25maWcgb24gZXJyb3IuCiAgICAgbVN0YXR1cyA9IHN0YXR1czsKICAgICBBTE9HVlYoImNvbmZpZ3VyZSBlbmRlZCIpOwogICAgIHJldHVybiBzdGF0dXM7CkBAIC05MDQsNiArOTEyLDggQEAKIAogdm9pZCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6c2V0SW5CdWZmZXIoY29uc3Qgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiYgYnVmZmVyKSB7CiAgICAgQUxPR1ZWKCJzZXRJbkJ1ZmZlciAlcCIsKCZidWZmZXIpKTsKKworICAgIC8vIG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQgbWF5IGJlIHplcm8gaWYgY29uZmlndXJlKCkgaXMgbm90IGNhbGxlZCB5ZXQuCiAgICAgaWYgKGJ1ZmZlciAhPSAwKSB7CiAgICAgICAgIG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLnJhdyA9IGJ1ZmZlci0+YXVkaW9CdWZmZXIoKS0+cmF3OwogICAgICAgICBidWZmZXItPnNldEZyYW1lQ291bnQobUNvbmZpZy5pbnB1dENmZy5idWZmZXIuZnJhbWVDb3VudCk7CkBAIC05NDYsNiArOTU2LDggQEAKIAogdm9pZCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6c2V0T3V0QnVmZmVyKGNvbnN0IHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4mIGJ1ZmZlcikgewogICAgIEFMT0dWVigic2V0T3V0QnVmZmVyICVwIiwoJmJ1ZmZlcikpOworCisgICAgLy8gbUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQgbWF5IGJlIHplcm8gaWYgY29uZmlndXJlKCkgaXMgbm90IGNhbGxlZCB5ZXQuCiAgICAgaWYgKGJ1ZmZlciAhPSAwKSB7CiAgICAgICAgIG1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlci5yYXcgPSBidWZmZXItPmF1ZGlvQnVmZmVyKCktPnJhdzsKICAgICAgICAgYnVmZmVyLT5zZXRGcmFtZUNvdW50KG1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50KTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJEdW1wU3RhdGUuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlckR1bXBTdGF0ZS5jcHAKaW5kZXggNjQ3NWYyMi4uMmU0ZmI4YyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlckR1bXBTdGF0ZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlckR1bXBTdGF0ZS5jcHAKQEAgLTc4LDcgKzc4LDEyIEBACiAgICAgdWludDMyX3QgYm91bmRzID0gbUJvdW5kczsKICAgICB1aW50MzJfdCBuZXdlc3RPcGVuID0gYm91bmRzICYgMHhGRkZGOwogICAgIHVpbnQzMl90IG9sZGVzdENsb3NlZCA9IGJvdW5kcyA+PiAxNjsKLSAgICB1aW50MzJfdCBuID0gKG5ld2VzdE9wZW4gLSBvbGRlc3RDbG9zZWQpICYgMHhGRkZGOworCisgICAgLy91aW50MzJfdCBuID0gKG5ld2VzdE9wZW4gLSBvbGRlc3RDbG9zZWQpICYgMHhGRkZGOworICAgIHVpbnQzMl90IG47CisgICAgX19idWlsdGluX3N1Yl9vdmVyZmxvdyhuZXdlc3RPcGVuLCBvbGRlc3RDbG9zZWQsICZuKTsKKyAgICBuID0gbiAmIDB4RkZGRjsKKwogICAgIGlmIChuID4gbVNhbXBsaW5nTikgewogICAgICAgICBBTE9HRSgidG9vIG1hbnkgc2FtcGxlcyAldSIsIG4pOwogICAgICAgICBuID0gbVNhbXBsaW5nTjsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmNwcAppbmRleCA3NjM2ZGY2Li4wNjAxMjMzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuY3BwCkBAIC02ODkxLDcgKzY4OTEsNyBAQAogICAgICAgICAgICAgcmVjb3JkVHJhY2stPmNsZWFyU3luY1N0YXJ0RXZlbnQoKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIGRvIG5vdCB3YWl0IGZvciB0aGUgZXZlbnQgZm9yIG1vcmUgdGhhbiBBdWRpb1N5c3RlbTo6a1N5bmNSZWNvcmRTdGFydFRpbWVPdXRNcwotICAgICAgICAgICAgcmVjb3JkVHJhY2stPm1GcmFtZXNUb0Ryb3AgPSAtCisgICAgICAgICAgICByZWNvcmRUcmFjay0+bUZyYW1lc1RvRHJvcCA9IC0oc3NpemVfdCkKICAgICAgICAgICAgICAgICAgICAgKChBdWRpb1N5c3RlbTo6a1N5bmNSZWNvcmRTdGFydFRpbWVPdXRNcyAqIHJlY29yZFRyYWNrLT5tU2FtcGxlUmF0ZSkgLyAxMDAwKTsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrcy5jcHAKaW5kZXggMTQ0NTU3Mi4uY2RkOGNhMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrcy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrcy5jcHAKQEAgLTExMDIsMTEgKzExMDIsMTIgQEAKIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6dHJpZ2dlckV2ZW50cyhBdWRpb1N5c3RlbTo6c3luY19ldmVudF90IHR5cGUpCiB7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU3luY0V2ZW50cy5zaXplKCk7IGkrKykgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVN5bmNFdmVudHMuc2l6ZSgpOykgewogICAgICAgICBpZiAobVN5bmNFdmVudHNbaV0tPnR5cGUoKSA9PSB0eXBlKSB7CiAgICAgICAgICAgICBtU3luY0V2ZW50c1tpXS0+dHJpZ2dlcigpOwogICAgICAgICAgICAgbVN5bmNFdmVudHMucmVtb3ZlQXQoaSk7Ci0gICAgICAgICAgICBpLS07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICArK2k7CiAgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2UuaAppbmRleCAxYTMyNDMzLi5mMmNiMjVmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlLmgKQEAgLTM1NSw2ICszNTUsNiBAQAogZXh0ZXJuICJDIiB2b2lkIGRlc3Ryb3lBdWRpb1BvbGljeU1hbmFnZXIoQXVkaW9Qb2xpY3lJbnRlcmZhY2UgKmludGVyZmFjZSk7CiAKIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmIC8vIEFORFJPSURfQVVESU9QT0xJQ1lfSU5URVJGQUNFX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0NvbGxlY3Rpb25zLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Db2xsZWN0aW9ucy5oCmluZGV4IDhmMDBkMjIuLmY4NmU3NWEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0NvbGxlY3Rpb25zLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvQ29sbGVjdGlvbnMuaApAQCAtNDEsNCArNDEsNCBAQAogICAgIHN0YXR1c190IGR1bXAoaW50IGZkLCBpbnQgc3BhY2VzKSBjb25zdDsKIH07CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9HYWluLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9HYWluLmgKaW5kZXggY2VhNWMwYi4uNGFjNTA4ZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvR2Fpbi5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0dhaW4uaApAQCAtNjYsNCArNjYsNCBAQAogICAgIGJvb2wgICAgICAgICAgICAgIG1Vc2VJbkNoYW5uZWxNYXNrOwogfTsKIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0lucHV0RGVzY3JpcHRvci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvSW5wdXREZXNjcmlwdG9yLmgKaW5kZXggZDljZDEyMS4uYjI1ZDZkNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvSW5wdXREZXNjcmlwdG9yLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvSW5wdXREZXNjcmlwdG9yLmgKQEAgLTc5LDYgKzc5LDEyIEBACiAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCiAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAogICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlucHV0KTsKKyAgICAvLyBDYWxsZWQgd2hlbiBhIHN0cmVhbSBpcyBhYm91dCB0byBiZSBzdGFydGVkLgorICAgIC8vIE5vdGU6IGNhbGxlZCBhZnRlciBBdWRpb1Nlc3Npb246OmNoYW5nZUFjdGl2ZUNvdW50KDEpCisgICAgc3RhdHVzX3Qgc3RhcnQoKTsKKyAgICAvLyBDYWxsZWQgYWZ0ZXIgYSBzdHJlYW0gaXMgc3RvcHBlZAorICAgIC8vIE5vdGU6IGNhbGxlZCBhZnRlciBBdWRpb1Nlc3Npb246OmNoYW5nZUFjdGl2ZUNvdW50KC0xKQorICAgIHZvaWQgc3RvcCgpOwogICAgIHZvaWQgY2xvc2UoKTsKIAogcHJpdmF0ZToKQEAgLTEyMSw0ICsxMjcsNCBAQAogfTsKIAogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvT3V0cHV0RGVzY3JpcHRvci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvT3V0cHV0RGVzY3JpcHRvci5oCmluZGV4IDBiZThmYzEuLjI4MDNlYzEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb091dHB1dERlc2NyaXB0b3IuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmgKQEAgLTEyNiw2ICsxMjYsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0KTsKKyAgICAgICAgICAgIC8vIENhbGxlZCB3aGVuIGEgc3RyZWFtIGlzIGFib3V0IHRvIGJlIHN0YXJ0ZWQKKyAgICAgICAgICAgIC8vIE5vdGU6IGNhbGxlZCBiZWZvcmUgY2hhbmdlUmVmQ291bnQoMSk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGFydCgpOworICAgICAgICAgICAgLy8gQ2FsbGVkIGFmdGVyIGEgc3RyZWFtIGlzIHN0b3BwZWQuCisgICAgICAgICAgICAvLyBOb3RlOiBjYWxsZWQgYWZ0ZXIgY2hhbmdlUmVmQ291bnQoLTEpOworICAgICAgICAgICAgdm9pZCBzdG9wKCk7CiAgICAgICAgICAgICB2b2lkIGNsb3NlKCk7CiAKICAgICBjb25zdCBzcDxJT1Byb2ZpbGU+IG1Qcm9maWxlOyAgICAgICAgICAvLyBJL08gcHJvZmlsZSB0aGlzIG91dHB1dCBkZXJpdmVzIGZyb20KQEAgLTIxNCw0ICsyMjAsNCBAQAogfTsKIAogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUGF0Y2guaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BhdGNoLmgKaW5kZXggMzg1ZjI1Ny4uYzFjM2YzYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUGF0Y2guaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9QYXRjaC5oCkBAIC0xNiw2ICsxNiw3IEBACiAKICNwcmFnbWEgb25jZQogCisjaW5jbHVkZSAiSGFuZGxlR2VuZXJhdG9yLmgiCiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgpAQCAtMjQsNyArMjUsNyBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIEF1ZGlvUGF0Y2ggOiBwdWJsaWMgUmVmQmFzZQorY2xhc3MgQXVkaW9QYXRjaCA6IHB1YmxpYyBSZWZCYXNlLCBwcml2YXRlIEhhbmRsZUdlbmVyYXRvcjxhdWRpb19wYXRjaF9oYW5kbGVfdD4KIHsKIHB1YmxpYzoKICAgICBBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsIHVpZF90IHVpZCk7CkBAIC0zNSw5ICszNiw2IEBACiAgICAgc3RydWN0IGF1ZGlvX3BhdGNoIG1QYXRjaDsKICAgICB1aWRfdCBtVWlkOwogICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IG1BZlBhdGNoSGFuZGxlOwotCi1wcml2YXRlOgotICAgIHN0YXRpYyB2b2xhdGlsZSBpbnQzMl90IG1OZXh0VW5pcXVlSWQ7CiB9OwogCiBjbGFzcyBBdWRpb1BhdGNoQ29sbGVjdGlvbiA6IHB1YmxpYyBEZWZhdWx0S2V5ZWRWZWN0b3I8YXVkaW9fcGF0Y2hfaGFuZGxlX3QsIHNwPEF1ZGlvUGF0Y2g+ID4KQEAgLTUyLDQgKzUwLDQgQEAKICAgICBzdGF0dXNfdCBkdW1wKGludCBmZCkgY29uc3Q7CiB9OwogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUG9saWN5Q29uZmlnLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb2xpY3lDb25maWcuaAppbmRleCBmMjc1NmI1Li40M2Y2ZWQ2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb2xpY3lDb25maWcuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb2xpY3lDb25maWcuaApAQCAtMzksMTQgKzM5LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlVmVjdG9yICZhdmFpbGFibGVPdXRwdXREZXZpY2VzLAogICAgICAgICAgICAgICAgICAgICAgIERldmljZVZlY3RvciAmYXZhaWxhYmxlSW5wdXREZXZpY2VzLAogICAgICAgICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+ICZkZWZhdWx0T3V0cHV0RGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICBib29sICZpc1NwZWFrZXJEcmNFbmFibGVkLAogICAgICAgICAgICAgICAgICAgICAgIFZvbHVtZUN1cnZlc0NvbGxlY3Rpb24gKnZvbHVtZXMgPSBudWxscHRyKQogICAgICAgICA6IG1Id01vZHVsZXMoaHdNb2R1bGVzKSwKICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyhhdmFpbGFibGVPdXRwdXREZXZpY2VzKSwKICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzKGF2YWlsYWJsZUlucHV0RGV2aWNlcyksCiAgICAgICAgICAgbURlZmF1bHRPdXRwdXREZXZpY2VzKGRlZmF1bHRPdXRwdXREZXZpY2VzKSwKICAgICAgICAgICBtVm9sdW1lQ3VydmVzKHZvbHVtZXMpLAotICAgICAgICAgIG1Jc1NwZWFrZXJEcmNFbmFibGVkKGlzU3BlYWtlckRyY0VuYWJsZWQpCisgICAgICAgICAgbUlzU3BlYWtlckRyY0VuYWJsZWQoZmFsc2UpCiAgICAge30KIAogICAgIHZvaWQgc2V0Vm9sdW1lcyhjb25zdCBWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uICZ2b2x1bWVzKQpAQCAtODAsNiArNzksOCBAQAogICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5hZGQoYXZhaWxhYmxlT3V0cHV0RGV2aWNlcyk7CiAgICAgfQogCisgICAgYm9vbCBpc1NwZWFrZXJEcmNFbmFibGVkKCkgY29uc3QgeyByZXR1cm4gbUlzU3BlYWtlckRyY0VuYWJsZWQ7IH0KKwogICAgIHZvaWQgc2V0U3BlYWtlckRyY0VuYWJsZWQoYm9vbCBpc1NwZWFrZXJEcmNFbmFibGVkKQogICAgIHsKICAgICAgICAgbUlzU3BlYWtlckRyY0VuYWJsZWQgPSBpc1NwZWFrZXJEcmNFbmFibGVkOwpAQCAtMTEyLDcgKzExMyw3IEBACiAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmFkZChtRGVmYXVsdE91dHB1dERldmljZXMpOwogICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmFkZChkZWZhdWx0SW5wdXREZXZpY2UpOwogCi0gICAgICAgIG1vZHVsZSA9IG5ldyBId01vZHVsZSgicHJpbWFyeSIpOworICAgICAgICBtb2R1bGUgPSBuZXcgSHdNb2R1bGUoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1BSSU1BUlkpOwogCiAgICAgICAgIHNwPE91dHB1dFByb2ZpbGU+IG91dFByb2ZpbGU7CiAgICAgICAgIG91dFByb2ZpbGUgPSBuZXcgT3V0cHV0UHJvZmlsZShTdHJpbmc4KCJwcmltYXJ5IikpOwpAQCAtMTIxLDcgKzEyMiw3IEBACiAgICAgICAgICAgICAgICAgbmV3IEF1ZGlvUHJvZmlsZShBVURJT19GT1JNQVRfUENNXzE2X0JJVCwgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLCA0NDEwMCkpOwogICAgICAgICBvdXRQcm9maWxlLT5hZGRTdXBwb3J0ZWREZXZpY2UobURlZmF1bHRPdXRwdXREZXZpY2VzKTsKICAgICAgICAgb3V0UHJvZmlsZS0+c2V0RmxhZ3MoQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWSk7Ci0gICAgICAgIG1vZHVsZS0+bU91dHB1dFByb2ZpbGVzLmFkZChvdXRQcm9maWxlKTsKKyAgICAgICAgbW9kdWxlLT5hZGRPdXRwdXRQcm9maWxlKG91dFByb2ZpbGUpOwogCiAgICAgICAgIHNwPElucHV0UHJvZmlsZT4gaW5Qcm9maWxlOwogICAgICAgICBpblByb2ZpbGUgPSBuZXcgSW5wdXRQcm9maWxlKFN0cmluZzgoInByaW1hcnkiKSk7CkBAIC0xMjksNyArMTMwLDcgQEAKICAgICAgICAgaW5Qcm9maWxlLT5hZGRBdWRpb1Byb2ZpbGUoCiAgICAgICAgICAgICAgICAgbmV3IEF1ZGlvUHJvZmlsZShBVURJT19GT1JNQVRfUENNXzE2X0JJVCwgQVVESU9fQ0hBTk5FTF9JTl9NT05PLCA4MDAwKSk7CiAgICAgICAgIGluUHJvZmlsZS0+YWRkU3VwcG9ydGVkRGV2aWNlKGRlZmF1bHRJbnB1dERldmljZSk7Ci0gICAgICAgIG1vZHVsZS0+bUlucHV0UHJvZmlsZXMuYWRkKGluUHJvZmlsZSk7CisgICAgICAgIG1vZHVsZS0+YWRkSW5wdXRQcm9maWxlKGluUHJvZmlsZSk7CiAKICAgICAgICAgbUh3TW9kdWxlcy5hZGQobW9kdWxlKTsKICAgICB9CkBAIC0xNDAsNyArMTQxLDEwIEBACiAgICAgRGV2aWNlVmVjdG9yICZtQXZhaWxhYmxlSW5wdXREZXZpY2VzOwogICAgIHNwPERldmljZURlc2NyaXB0b3I+ICZtRGVmYXVsdE91dHB1dERldmljZXM7CiAgICAgVm9sdW1lQ3VydmVzQ29sbGVjdGlvbiAqbVZvbHVtZUN1cnZlczsKLSAgICBib29sICZtSXNTcGVha2VyRHJjRW5hYmxlZDsKKyAgICAvLyBUT0RPOiByZW1vdmUgd2hlbiBsZWdhY3kgY29uZiBmaWxlIGlzIHJlbW92ZWQuIHRydWUgb24gZGV2aWNlcyB0aGF0IHVzZSBEUkMgb24gdGhlCisgICAgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIgcGF0aCB0byBib29zdCBzb2Z0IHNvdW5kcywgdXNlZCB0byBhZGp1c3Qgdm9sdW1lIGN1cnZlcyBhY2NvcmRpbmdseS4KKyAgICAvLyBOb3RlOiByZW1vdmUgYWxzbyBzcGVha2VyX2RyY19lbmFibGVkIGZyb20gZ2xvYmFsIGNvbmZpZ3VyYXRpb24gb2YgWE1MIGNvbmZpZyBmaWxlLgorICAgIGJvb2wgbUlzU3BlYWtlckRyY0VuYWJsZWQ7CiB9OwogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUG9saWN5TWl4LmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb2xpY3lNaXguaAppbmRleCAwYmFjZWY3Li44ZmM2ZmU5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb2xpY3lNaXguaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb2xpY3lNaXguaApAQCAtODMsNCArODMsNCBAQAogICAgIHN0YXR1c190IGR1bXAoaW50IGZkKSBjb25zdDsKIH07CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb3J0LmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb3J0LmgKaW5kZXggNGY3OWVkMi4uZDUyMDkzNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUG9ydC5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvcnQuaApAQCAtMTgsNiArMTgsNyBAQAogCiAjaW5jbHVkZSAiQXVkaW9Db2xsZWN0aW9ucy5oIgogI2luY2x1ZGUgIkF1ZGlvUHJvZmlsZS5oIgorI2luY2x1ZGUgIkhhbmRsZUdlbmVyYXRvci5oIgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CkBAIC0zMiw3ICszMyw3IEBACiBjbGFzcyBBdWRpb1JvdXRlOwogdHlwZWRlZiBWZWN0b3I8c3A8QXVkaW9HYWluPiA+IEF1ZGlvR2FpbkNvbGxlY3Rpb247CiAKLWNsYXNzIEF1ZGlvUG9ydCA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UKK2NsYXNzIEF1ZGlvUG9ydCA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UsIHByaXZhdGUgSGFuZGxlR2VuZXJhdG9yPGF1ZGlvX3BvcnRfaGFuZGxlX3Q+CiB7CiBwdWJsaWM6CiAgICAgQXVkaW9Qb3J0KGNvbnN0IFN0cmluZzgmIG5hbWUsIGF1ZGlvX3BvcnRfdHlwZV90IHR5cGUsICBhdWRpb19wb3J0X3JvbGVfdCByb2xlKSA6CkBAIC0xNTIsNyArMTUzLDYgQEAKICAgICB1aW50MzJfdCBtRmxhZ3M7IC8vIGF0dHJpYnV0ZSBmbGFncyBtYXNrIChlLmcgcHJpbWFyeSBvdXRwdXQsIGRpcmVjdCBvdXRwdXQuLi4pLgogICAgIEF1ZGlvUHJvZmlsZVZlY3RvciBtUHJvZmlsZXM7IC8vIEF1ZGlvUHJvZmlsZXMgc3VwcG9ydGVkIGJ5IHRoaXMgcG9ydCAoZm9ybWF0LCBSYXRlcywgQ2hhbm5lbHMpCiAgICAgQXVkaW9Sb3V0ZVZlY3RvciBtUm91dGVzOyAvLyBSb3V0ZXMgaW52b2x2aW5nIHRoaXMgcG9ydAotICAgIHN0YXRpYyB2b2xhdGlsZSBpbnQzMl90IG1OZXh0VW5pcXVlSWQ7CiB9OwogCiBjbGFzcyBBdWRpb1BvcnRDb25maWcgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlCkBAIC0xNzYsNCArMTc2LDQgQEAKICAgICBzdHJ1Y3QgYXVkaW9fZ2Fpbl9jb25maWcgbUdhaW47CiB9OwogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUHJvZmlsZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUHJvZmlsZS5oCmluZGV4IDQwNGUyN2QuLjg3NDFjNjYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1Byb2ZpbGUuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qcm9maWxlLmgKQEAgLTM0OSw0ICszNDksNCBAQAogCiBib29sIG9wZXJhdG9yID09IChjb25zdCBBdWRpb1Byb2ZpbGUgJmxlZnQsIGNvbnN0IEF1ZGlvUHJvZmlsZSAmcmlnaHQpOwogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUm91dGUuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1JvdXRlLmgKaW5kZXggZGY1NGY0OC4uNmIyNGZkZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUm91dGUuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Sb3V0ZS5oCkBAIC01NSw0ICs1NSw0IEBACiAKIH07CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9TZXNzaW9uLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9TZXNzaW9uLmgKaW5kZXggY2VkZjIyZC4uMGQxOTM3MyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvU2Vzc2lvbi5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1Nlc3Npb24uaApAQCAtMTAyLDQgKzEwMiw0IEBACiAgICAgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGludCBzcGFjZXMpIGNvbnN0OwogfTsKIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1NvdXJjZURlc2NyaXB0b3IuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1NvdXJjZURlc2NyaXB0b3IuaAppbmRleCA3ZTFlMjRkLi4wZDkwZjQyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Tb3VyY2VEZXNjcmlwdG9yLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvU291cmNlRGVzY3JpcHRvci5oCkBAIC01Niw0ICs1Niw0IEBACiAgICAgc3RhdHVzX3QgZHVtcChpbnQgZmQpIGNvbnN0OwogfTsKIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Db25maWdQYXJzaW5nVXRpbHMuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Db25maWdQYXJzaW5nVXRpbHMuaAppbmRleCBlZTk1Y2ViLi5hMDA3ODU0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQ29uZmlnUGFyc2luZ1V0aWxzLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0NvbmZpZ1BhcnNpbmdVdGlscy5oCkBAIC01Niw0ICs1Niw0IEBACiAgICAgc3RhdGljIHN0YXR1c190IGxvYWRId01vZHVsZShjbm9kZSAqcm9vdCwgc3A8SHdNb2R1bGU+ICZtb2R1bGUsIEF1ZGlvUG9saWN5Q29uZmlnICZjb25maWcpOwogfTsKIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9EZXZpY2VEZXNjcmlwdG9yLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvRGV2aWNlRGVzY3JpcHRvci5oCmluZGV4IDFhNjQ0ZDcuLjkyYTRjM2UgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9EZXZpY2VEZXNjcmlwdG9yLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0RldmljZURlc2NyaXB0b3IuaApAQCAtOTEsNCArOTEsNCBAQAogICAgIGF1ZGlvX2RldmljZXNfdCBtRGV2aWNlVHlwZXM7CiB9OwogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0VmZmVjdERlc2NyaXB0b3IuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9FZmZlY3REZXNjcmlwdG9yLmgKaW5kZXggOWVhMGFlYS4uMDQ4MzFjNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0VmZmVjdERlc2NyaXB0b3IuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvRWZmZWN0RGVzY3JpcHRvci5oCkBAIC02OSw0ICs2OSw0IEBACiAgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IE1BWF9FRkZFQ1RTX01FTU9SWSA9IDUxMjsKIH07CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvR2FpbnMuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9HYWlucy5oCmluZGV4IDM0YWZjOGMuLjgzMzJhZjkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9HYWlucy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9HYWlucy5oCkBAIC01Niw0ICs1Niw0IEBACiAgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgKnNWb2x1bWVQcm9maWxlc1tBVURJT19TVFJFQU1fQ05UXVtERVZJQ0VfQ0FURUdPUllfQ05UXTsKIH07CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSGFuZGxlR2VuZXJhdG9yLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSGFuZGxlR2VuZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM3YTJlMAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9IYW5kbGVHZW5lcmF0b3IuaApAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8bGltaXRzPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBIYW5kbGVHZW5lcmF0b3IgeworICBwcm90ZWN0ZWQ6CisgICAgc3RhdGljIFQgZ2V0TmV4dEhhbmRsZSgpOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK1QgSGFuZGxlR2VuZXJhdG9yPFQ+OjpnZXROZXh0SGFuZGxlKCkgeworICAgIHN0YXRpYyBzdGQ6OmF0b21pYzx1aW50MzJfdD4gbU5leHRVbmlxdWVJZCgxKTsKKyAgICB1aW50MzJfdCBpZCA9IG1OZXh0VW5pcXVlSWQrKzsKKyAgICB3aGlsZSAoaWQgPiBzdGQ6Om51bWVyaWNfbGltaXRzPFQ+OjptYXgoKSkgeworICAgICAgICBpZCAtPSBzdGQ6Om51bWVyaWNfbGltaXRzPFQ+OjptYXgoKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFQ+KGlkKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Id01vZHVsZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0h3TW9kdWxlLmgKaW5kZXggMjliNmI5Yy4uY2I5ZjQ5ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0h3TW9kdWxlLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0h3TW9kdWxlLmgKQEAgLTQ0LDEyICs0NCwxMCBAQAogCiAgICAgY29uc3QgY2hhciAqZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1OYW1lLnN0cmluZygpOyB9CiAKLQogICAgIGNvbnN0IERldmljZVZlY3RvciAmZ2V0RGVjbGFyZWREZXZpY2VzKCkgY29uc3QgeyByZXR1cm4gbURlY2xhcmVkRGV2aWNlczsgfQogICAgIHZvaWQgc2V0RGVjbGFyZWREZXZpY2VzKGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcyk7CiAKICAgICBjb25zdCBJbnB1dFByb2ZpbGVDb2xsZWN0aW9uICZnZXRJbnB1dFByb2ZpbGVzKCkgY29uc3QgeyByZXR1cm4gbUlucHV0UHJvZmlsZXM7IH0KLQogICAgIGNvbnN0IE91dHB1dFByb2ZpbGVDb2xsZWN0aW9uICZnZXRPdXRwdXRQcm9maWxlcygpIGNvbnN0IHsgcmV0dXJuIG1PdXRwdXRQcm9maWxlczsgfQogCiAgICAgdm9pZCBzZXRQcm9maWxlcyhjb25zdCBJT1Byb2ZpbGVDb2xsZWN0aW9uICZwcm9maWxlcyk7CkBAIC03Niw2ICs3NCw3IEBACiAgICAgc3RhdHVzX3QgcmVtb3ZlSW5wdXRQcm9maWxlKGNvbnN0IFN0cmluZzgmIG5hbWUpOwogCiAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IGdldEhhbmRsZSgpIGNvbnN0IHsgcmV0dXJuIG1IYW5kbGU7IH0KKyAgICB2b2lkIHNldEhhbmRsZShhdWRpb19tb2R1bGVfaGFuZGxlX3QgaGFuZGxlKTsKIAogICAgIHNwPEF1ZGlvUG9ydD4gZmluZFBvcnRCeVRhZ05hbWUoY29uc3QgU3RyaW5nOCAmdGFnTmFtZSkgY29uc3QKICAgICB7CkBAIC04NSwxNCArODQsMTMgQEAKICAgICAvLyBUT0RPIHJlbW92ZSBmcm9tIGhlcmUgKHNwbGl0IHNlcmlhbGl6YXRpb24pCiAgICAgdm9pZCBkdW1wKGludCBmZCk7CiAKK3ByaXZhdGU6CisgICAgdm9pZCByZWZyZXNoU3VwcG9ydGVkRGV2aWNlcygpOworCiAgICAgY29uc3QgU3RyaW5nOCBtTmFtZTsgLy8gYmFzZSBuYW1lIG9mIHRoZSBhdWRpbyBIVyBtb2R1bGUgKHByaW1hcnksIGEyZHAgLi4uKQogICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtSGFuZGxlOwogICAgIE91dHB1dFByb2ZpbGVDb2xsZWN0aW9uIG1PdXRwdXRQcm9maWxlczsgLy8gb3V0cHV0IHByb2ZpbGVzIGV4cG9zZWQgYnkgdGhpcyBtb2R1bGUKICAgICBJbnB1dFByb2ZpbGVDb2xsZWN0aW9uIG1JbnB1dFByb2ZpbGVzOyAgLy8gaW5wdXQgcHJvZmlsZXMgZXhwb3NlZCBieSB0aGlzIG1vZHVsZQotCi1wcml2YXRlOgotICAgIHZvaWQgcmVmcmVzaFN1cHBvcnRlZERldmljZXMoKTsKLQogICAgIHVpbnQzMl90IG1IYWxWZXJzaW9uOyAvLyBhdWRpbyBIQUwgQVBJIHZlcnNpb24KICAgICBEZXZpY2VWZWN0b3IgbURlY2xhcmVkRGV2aWNlczsgLy8gZGV2aWNlcyBkZWNsYXJlZCBpbiBhdWRpb19wb2xpY3kgY29uZmlndXJhdGlvbiBmaWxlLgogICAgIEF1ZGlvUm91dGVWZWN0b3IgbVJvdXRlczsKQEAgLTExNCw0ICsxMTIsNCBAQAogICAgIHN0YXR1c190IGR1bXAoaW50IGZkKSBjb25zdDsKIH07CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSU9Qcm9maWxlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSU9Qcm9maWxlLmgKaW5kZXggMTE4ZjBkMi4uMjRmZTdjYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0lPUHJvZmlsZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9JT1Byb2ZpbGUuaApAQCAtMTUxLDQgKzE1MSw0IEBACiAgICAgZXhwbGljaXQgT3V0cHV0UHJvZmlsZShjb25zdCBTdHJpbmc4ICZuYW1lKSA6IElPUHJvZmlsZShuYW1lLCBBVURJT19QT1JUX1JPTEVfU09VUkNFKSB7fQogfTsKIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9JVm9sdW1lQ3VydmVzQ29sbGVjdGlvbi5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0lWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uLmgKaW5kZXggYTNkZTY4Ni4uZTFmNmIwOCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0lWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0lWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uLmgKQEAgLTI1LDYgKzI1LDggQEAKIGNsYXNzIElWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uCiB7CiBwdWJsaWM6CisgICAgdmlydHVhbCB+SVZvbHVtZUN1cnZlc0NvbGxlY3Rpb24oKSA9IGRlZmF1bHQ7CisKICAgICB2aXJ0dWFsIHZvaWQgY2xlYXJDdXJyZW50Vm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pID0gMDsKICAgICB2aXJ0dWFsIHZvaWQgYWRkQ3VycmVudFZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KSA9IDA7CkBAIC00Niw5ICs0OCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIGNvbnN0ID0gMDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpIGNvbnN0ID0gMDsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfklWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uKCkge30KIH07CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU2VyaWFsaXplci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1NlcmlhbGl6ZXIuaAppbmRleCAzYjBlMjA5Li4yOWRlODQ4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU2VyaWFsaXplci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9TZXJpYWxpemVyLmgKQEAgLTIzNiw0ICsyMzYsNCBAQAogICAgIC8vIENoaWxkcmVuIGFyZTogTW9kdWxlc1RyYWl0cywgVm9sdW1lVHJhaXRzCiB9OwogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1Nlc3Npb25Sb3V0ZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1Nlc3Npb25Sb3V0ZS5oCmluZGV4IDc1YmZkOWQuLmZjMmMyNzMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9TZXNzaW9uUm91dGUuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU2Vzc2lvblJvdXRlLmgKQEAgLTExNSw0ICsxMTUsNCBAQAogICAgIGNvbnN0IHNlc3Npb25fcm91dGVfbWFwX3R5cGVfdCBtTWFwVHlwZTsKIH07CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU291bmRUcmlnZ2VyU2Vzc2lvbi5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1NvdW5kVHJpZ2dlclNlc3Npb24uaAppbmRleCA0MjBlNmQ3Li5mODk1NTk5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU291bmRUcmlnZ2VyU2Vzc2lvbi5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Tb3VuZFRyaWdnZXJTZXNzaW9uLmgKQEAgLTMwLDQgKzMwLDQgQEAKICAgICBzdGF0dXNfdCBhY3F1aXJlU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwgYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUpOwogfTsKIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9TdHJlYW1EZXNjcmlwdG9yLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU3RyZWFtRGVzY3JpcHRvci5oCmluZGV4IDg4MjI5MjcuLjUwYjEwMzcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9TdHJlYW1EZXNjcmlwdG9yLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1N0cmVhbURlc2NyaXB0b3IuaApAQCAtMTA3LDQgKzEwNyw0IEBACiAgICAgdm9pZCBzZXRWb2x1bWVJbmRleE1heChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSxpbnQgdm9sSW5kZXhNYXgpOwogfTsKIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9UeXBlQ29udmVydGVyLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvVHlwZUNvbnZlcnRlci5oCmluZGV4IGZjOTVlYjkuLjYzYzE5ZDEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9UeXBlQ29udmVydGVyLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1R5cGVDb252ZXJ0ZXIuaApAQCAtNTgsNCArNTgsNCBAQAogdGVtcGxhdGUgPD4KIGNvbnN0IFJ1bGVUeXBlQ29udmVydGVyOjpUYWJsZSBSdWxlVHlwZUNvbnZlcnRlcjo6bVRhYmxlW107CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvVm9sdW1lQ3VydmUuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Wb2x1bWVDdXJ2ZS5oCmluZGV4IGU3ZmNlZmMuLjNlNmIyYjQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Wb2x1bWVDdXJ2ZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Wb2x1bWVDdXJ2ZS5oCkBAIC0xMzUsNyArMTM1LDEzIEBACiAKICAgICBmbG9hdCB2b2xJbmRleFRvRGIoZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdCwgaW50IGluZGV4SW5VaSkgY29uc3QKICAgICB7Ci0gICAgICAgIHJldHVybiBnZXRDdXJ2ZXNGb3IoZGV2aWNlQ2F0KS0+dm9sSW5kZXhUb0RiKGluZGV4SW5VaSwgbUluZGV4TWluLCBtSW5kZXhNYXgpOworICAgICAgICBzcDxWb2x1bWVDdXJ2ZT4gdmMgPSBnZXRDdXJ2ZXNGb3IoZGV2aWNlQ2F0KTsKKyAgICAgICAgaWYgKHZjICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiB2Yy0+dm9sSW5kZXhUb0RiKGluZGV4SW5VaSwgbUluZGV4TWluLCBtSW5kZXhNYXgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgZGV2aWNlIGNhdGVnb3J5ICVkIGZvciBWb2x1bWUgQ3VydmUiLCBkZXZpY2VDYXQpOworICAgICAgICAgICAgcmV0dXJuIDAuMGY7CisgICAgICAgIH0KICAgICB9CiAKICAgICB2b2lkIGR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBib29sIGN1cnZlUG9pbnRzID0gZmFsc2UpIGNvbnN0OwpAQCAtMjMwLDQgKzIzNiw0IEBACiAgICAgfQogfTsKIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvQ29sbGVjdGlvbnMuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Db2xsZWN0aW9ucy5jcHAKaW5kZXggNjM1ZmU0ZC4uY2E2N2I4NyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Db2xsZWN0aW9ucy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Db2xsZWN0aW9ucy5jcHAKQEAgLTI3LDE0ICsyNywxMiBAQAogCiBzcDxBdWRpb1BvcnQ+IEF1ZGlvUG9ydFZlY3Rvcjo6ZmluZEJ5VGFnTmFtZShjb25zdCBTdHJpbmc4ICZ0YWdOYW1lKSBjb25zdAogewotICAgIHNwPEF1ZGlvUG9ydD4gcG9ydCA9IDA7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBpZiAoaXRlbUF0KGkpLT5nZXRUYWdOYW1lKCkgPT0gdGFnTmFtZSkgewotICAgICAgICAgICAgcG9ydCA9IGl0ZW1BdChpKTsKLSAgICAgICAgICAgIGJyZWFrOworICAgIGZvciAoY29uc3QgYXV0byYgcG9ydCA6ICp0aGlzKSB7CisgICAgICAgIGlmIChwb3J0LT5nZXRUYWdOYW1lKCkgPT0gdGFnTmFtZSkgeworICAgICAgICAgICAgcmV0dXJuIHBvcnQ7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIHBvcnQ7CisgICAgcmV0dXJuIG51bGxwdHI7CiB9CiAKIHN0YXR1c190IEF1ZGlvUm91dGVWZWN0b3I6OmR1bXAoaW50IGZkLCBpbnQgc3BhY2VzKSBjb25zdApAQCAtNTUsNCArNTMsNCBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvR2Fpbi5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0dhaW4uY3BwCmluZGV4IGU0NTQ5NDEuLjE5M2Q0YTYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvR2Fpbi5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9HYWluLmNwcApAQCAtMTI2LDQgKzEyNiw0IEBACiAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CiB9CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0lucHV0RGVzY3JpcHRvci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0lucHV0RGVzY3JpcHRvci5jcHAKaW5kZXggNDYxNjhhNC4uOTIzMzJmYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9JbnB1dERlc2NyaXB0b3IuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvSW5wdXREZXNjcmlwdG9yLmNwcApAQCAtMjA2LDI0ICsyMDYsMTYgQEAKICAgICAgICAgbENvbmZpZyA9ICpjb25maWc7CiAgICAgfQogCi0gICAgU3RyaW5nOCBsQWRkcmVzcyA9IGFkZHJlc3M7Ci0gICAgaWYgKGxBZGRyZXNzID09ICIiKSB7Ci0gICAgICAgIGNvbnN0IERldmljZVZlY3RvciYgc3VwcG9ydGVkRGV2aWNlcyA9IG1Qcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VzKCk7Ci0gICAgICAgIGNvbnN0IERldmljZVZlY3RvciYgZGV2aWNlc0ZvclR5cGUgPSBzdXBwb3J0ZWREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShkZXZpY2UpOwotICAgICAgICBsQWRkcmVzcyA9IGRldmljZXNGb3JUeXBlLnNpemUoKSA+IDAgPyBkZXZpY2VzRm9yVHlwZS5pdGVtQXQoMCktPm1BZGRyZXNzCi0gICAgICAgICAgICAgICAgICA6IFN0cmluZzgoIiIpOwotICAgIH0KLQogICAgIG1EZXZpY2UgPSBkZXZpY2U7CiAKICAgICBBTE9HVigib3BlbmluZyBpbnB1dCBmb3IgZGV2aWNlICUwOHggYWRkcmVzcyAlcyBwcm9maWxlICVwIG5hbWUgJXMiLAotICAgICAgICAgIG1EZXZpY2UsIGxBZGRyZXNzLnN0cmluZygpLCBtUHJvZmlsZS5nZXQoKSwgbVByb2ZpbGUtPmdldE5hbWUoKS5zdHJpbmcoKSk7CisgICAgICAgICAgbURldmljZSwgYWRkcmVzcy5zdHJpbmcoKSwgbVByb2ZpbGUuZ2V0KCksIG1Qcm9maWxlLT5nZXROYW1lKCkuc3RyaW5nKCkpOwogCiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUNsaWVudEludGVyZmFjZS0+b3BlbklucHV0KG1Qcm9maWxlLT5nZXRNb2R1bGVIYW5kbGUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsQ29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbURldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbEFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwogICAgIExPR19BTFdBWVNfRkFUQUxfSUYobURldmljZSAhPSBkZXZpY2UsCkBAIC0yMzEsNiArMjIzLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbURldmljZSwgZGV2aWNlKTsKIAogICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRigqaW5wdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIG9wZW5JbnB1dCByZXR1cm5lZCBpbnB1dCBoYW5kbGUgJWQgZm9yIGRldmljZSAlMDh4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sICppbnB1dCwgZGV2aWNlKTsKICAgICAgICAgbVNhbXBsaW5nUmF0ZSA9IGxDb25maWcuc2FtcGxlX3JhdGU7CiAgICAgICAgIG1DaGFubmVsTWFzayA9IGxDb25maWcuY2hhbm5lbF9tYXNrOwogICAgICAgICBtRm9ybWF0ID0gbENvbmZpZy5mb3JtYXQ7CkBAIC0yNDIsNiArMjM3LDI3IEBACiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAorc3RhdHVzX3QgQXVkaW9JbnB1dERlc2NyaXB0b3I6OnN0YXJ0KCkKK3sKKyAgICBpZiAoZ2V0QXVkaW9TZXNzaW9uQ291bnQodHJ1ZS8qYWN0aXZlT25seSovKSA9PSAxKSB7CisgICAgICAgIGlmICghbVByb2ZpbGUtPmNhblN0YXJ0TmV3SW8oKSkgeworICAgICAgICAgICAgQUxPR0koIiVzIG1Qcm9maWxlLT5jdXJBY3RpdmVDb3VudCAlZCIsIF9fZnVuY19fLCBtUHJvZmlsZS0+Y3VyQWN0aXZlQ291bnQpOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgICAgIG1Qcm9maWxlLT5jdXJBY3RpdmVDb3VudCsrOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3ZvaWQgQXVkaW9JbnB1dERlc2NyaXB0b3I6OnN0b3AoKQoreworICAgIGlmICghaXNBY3RpdmUoKSkgeworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1Qcm9maWxlLT5jdXJBY3RpdmVDb3VudCA8IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIGludmFsaWQgcHJvZmlsZSBhY3RpdmUgY291bnQgJXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUHJvZmlsZS0+Y3VyQWN0aXZlQ291bnQpOworICAgICAgICBtUHJvZmlsZS0+Y3VyQWN0aXZlQ291bnQtLTsKKyAgICB9Cit9CiAKIHZvaWQgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmNsb3NlKCkKIHsKQEAgLTI0OSw2ICsyNjUsOSBAQAogICAgICAgICBtQ2xpZW50SW50ZXJmYWNlLT5jbG9zZUlucHV0KG1Jb0hhbmRsZSk7CiAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobVByb2ZpbGUtPmN1ck9wZW5Db3VudCA8IDEsICIlcyBwcm9maWxlIG9wZW4gY291bnQgJXUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb2ZpbGUtPmN1ck9wZW5Db3VudCk7CisgICAgICAgIC8vIGRvIG5vdCBjYWxsIHN0b3AoKSBoZXJlIGFzIHN0b3AoKSBpcyBzdXBwb3NlZCB0byBiZSBjYWxsZWQgYWZ0ZXIKKyAgICAgICAgLy8gQXVkaW9TZXNzaW9uOjpjaGFuZ2VBY3RpdmVDb3VudCgtMSkgYW5kIHdlIGRvbid0IGtub3cgaG93IG1hbnkgc2Vzc2lvbnMKKyAgICAgICAgLy8gYXJlIHN0aWxsIGFjdGl2ZSBhdCB0aGlzIHRpbWUKICAgICAgICAgaWYgKGlzQWN0aXZlKCkpIHsKICAgICAgICAgICAgIG1Qcm9maWxlLT5jdXJBY3RpdmVDb3VudC0tOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb091dHB1dERlc2NyaXB0b3IuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmNwcAppbmRleCBmNmVlMWMzLi4wNDRkNmRiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb091dHB1dERlc2NyaXB0b3IuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvT3V0cHV0RGVzY3JpcHRvci5jcHAKQEAgLTM5OCwxNCArMzk4LDYgQEAKICAgICAgICAgbENvbmZpZyA9ICpjb25maWc7CiAgICAgfQogCi0gICAgU3RyaW5nOCBsQWRkcmVzcyA9IGFkZHJlc3M7Ci0gICAgaWYgKGxBZGRyZXNzID09ICIiKSB7Ci0gICAgICAgIGNvbnN0IERldmljZVZlY3RvciYgc3VwcG9ydGVkRGV2aWNlcyA9IG1Qcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VzKCk7Ci0gICAgICAgIGNvbnN0IERldmljZVZlY3RvciYgZGV2aWNlc0ZvclR5cGUgPSBzdXBwb3J0ZWREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShkZXZpY2UpOwotICAgICAgICBsQWRkcmVzcyA9IGRldmljZXNGb3JUeXBlLnNpemUoKSA+IDAgPyBkZXZpY2VzRm9yVHlwZS5pdGVtQXQoMCktPm1BZGRyZXNzCi0gICAgICAgICAgICAgICAgICA6IFN0cmluZzgoIiIpOwotICAgIH0KLQogICAgIG1EZXZpY2UgPSBkZXZpY2U7CiAgICAgLy8gaWYgdGhlIHNlbGVjdGVkIHByb2ZpbGUgaXMgb2ZmbG9hZGVkIGFuZCBubyBvZmZsb2FkIGluZm8gd2FzIHNwZWNpZmllZCwKICAgICAvLyBjcmVhdGUgYSBkZWZhdWx0IG9uZQpAQCAtNDI1LDEzICs0MTcsMTMgQEAKICAgICBtRmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKG1GbGFncyB8IGZsYWdzKTsKIAogICAgIEFMT0dWKCJvcGVuaW5nIG91dHB1dCBmb3IgZGV2aWNlICUwOHggYWRkcmVzcyAlcyBwcm9maWxlICVwIG5hbWUgJXMiLAotICAgICAgICAgIG1EZXZpY2UsIGxBZGRyZXNzLnN0cmluZygpLCBtUHJvZmlsZS5nZXQoKSwgbVByb2ZpbGUtPmdldE5hbWUoKS5zdHJpbmcoKSk7CisgICAgICAgICAgbURldmljZSwgYWRkcmVzcy5zdHJpbmcoKSwgbVByb2ZpbGUuZ2V0KCksIG1Qcm9maWxlLT5nZXROYW1lKCkuc3RyaW5nKCkpOwogCiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUNsaWVudEludGVyZmFjZS0+b3Blbk91dHB1dChtUHJvZmlsZS0+Z2V0TW9kdWxlSGFuZGxlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbEFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1MYXRlbmN5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZsYWdzKTsKICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1EZXZpY2UgIT0gZGV2aWNlLApAQCAtNDM5LDYgKzQzMSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1EZXZpY2UsIGRldmljZSk7CiAKICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoKm91dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgb3Blbk91dHB1dCByZXR1cm5lZCBvdXRwdXQgaGFuZGxlICVkIGZvciBkZXZpY2UgJTA4eCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCAqb3V0cHV0LCBkZXZpY2UpOwogICAgICAgICBtU2FtcGxpbmdSYXRlID0gbENvbmZpZy5zYW1wbGVfcmF0ZTsKICAgICAgICAgbUNoYW5uZWxNYXNrID0gbENvbmZpZy5jaGFubmVsX21hc2s7CiAgICAgICAgIG1Gb3JtYXQgPSBsQ29uZmlnLmZvcm1hdDsKQEAgLTQ1MCw2ICs0NDUsNDQgQEAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCitzdGF0dXNfdCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c3RhcnQoKQoreworICAgIGlmIChpc0R1cGxpY2F0ZWQoKSkgeworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtT3V0cHV0MS0+c3RhcnQoKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSBtT3V0cHV0Mi0+c3RhcnQoKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgbU91dHB1dDEtPnN0b3AoKTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKyAgICBpZiAoIWlzQWN0aXZlKCkpIHsKKyAgICAgICAgaWYgKCFtUHJvZmlsZS0+Y2FuU3RhcnROZXdJbygpKSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICAgICAgbVByb2ZpbGUtPmN1ckFjdGl2ZUNvdW50Kys7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordm9pZCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c3RvcCgpCit7CisgICAgaWYgKGlzRHVwbGljYXRlZCgpKSB7CisgICAgICAgIG1PdXRwdXQxLT5zdG9wKCk7CisgICAgICAgIG1PdXRwdXQyLT5zdG9wKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIWlzQWN0aXZlKCkpIHsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtUHJvZmlsZS0+Y3VyQWN0aXZlQ291bnQgPCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyBpbnZhbGlkIHByb2ZpbGUgYWN0aXZlIGNvdW50ICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVByb2ZpbGUtPmN1ckFjdGl2ZUNvdW50KTsKKyAgICAgICAgbVByb2ZpbGUtPmN1ckFjdGl2ZUNvdW50LS07CisgICAgfQorfQogCiB2b2lkIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpjbG9zZSgpCiB7CkBAIC00NjIsNiArNDk1LDggQEAKIAogICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1Qcm9maWxlLT5jdXJPcGVuQ291bnQgPCAxLCAiJXMgcHJvZmlsZSBvcGVuIGNvdW50ICV1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm9maWxlLT5jdXJPcGVuQ291bnQpOworICAgICAgICAvLyBkbyBub3QgY2FsbCBzdG9wKCkgaGVyZSBhcyBzdG9wKCkgaXMgc3VwcG9zZWQgdG8gYmUgY2FsbGVkIGFmdGVyIGNoYW5nZVJlZkNvdW50KC0xKQorICAgICAgICAvLyBhbmQgd2UgZG9uJ3Qga25vdyBob3cgbWFueSBzdHJlYW1zIGFyZSBzdGlsbCBhY3RpdmUgYXQgdGhpcyB0aW1lCiAgICAgICAgIGlmIChpc0FjdGl2ZSgpKSB7CiAgICAgICAgICAgICBtUHJvZmlsZS0+Y3VyQWN0aXZlQ291bnQtLTsKICAgICAgICAgfQpAQCAtNDcwLDcgKzUwNSw2IEBACiAgICAgfQogfQogCi0KIC8vIEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yIGltcGxlbWVudGF0aW9uCiBId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6SHdBdWRpb091dHB1dERlc2NyaXB0b3IoY29uc3Qgc3A8QXVkaW9Tb3VyY2VEZXNjcmlwdG9yPiYgc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BhdGNoLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUGF0Y2guY3BwCmluZGV4IDMyNjA2ZWEuLmE5ZmU0OGQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUGF0Y2guY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUGF0Y2guY3BwCkBAIC0yMiwxNSArMjIsMTIgQEAKICNpbmNsdWRlICJUeXBlQ29udmVydGVyLmgiCiAKICNpbmNsdWRlIDxsb2cvbG9nLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL2F0b21pYy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1pbnQzMl90IHZvbGF0aWxlIEF1ZGlvUGF0Y2g6Om1OZXh0VW5pcXVlSWQgPSAxOwotCiBBdWRpb1BhdGNoOjpBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsIHVpZF90IHVpZCkgOgotICAgIG1IYW5kbGUoc3RhdGljX2Nhc3Q8YXVkaW9fcGF0Y2hfaGFuZGxlX3Q+KGFuZHJvaWRfYXRvbWljX2luYygmbU5leHRVbmlxdWVJZCkpKSwKKyAgICBtSGFuZGxlKEhhbmRsZUdlbmVyYXRvcjxhdWRpb19wYXRjaF9oYW5kbGVfdD46OmdldE5leHRIYW5kbGUoKSksCiAgICAgbVBhdGNoKCpwYXRjaCksCiAgICAgbVVpZCh1aWQpLAogICAgIG1BZlBhdGNoSGFuZGxlKEFVRElPX1BBVENIX0hBTkRMRV9OT05FKQpAQCAtMTc2LDQgKzE3Myw0IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Qb3J0LmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUG9ydC5jcHAKaW5kZXggZmNmOTA3MC4uZDZlYTY5OCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Qb3J0LmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BvcnQuY3BwCkBAIC0yMSw3ICsyMSw2IEBACiAjaW5jbHVkZSAiSHdNb2R1bGUuaCIKICNpbmNsdWRlICJBdWRpb0dhaW4uaCIKICNpbmNsdWRlIDxwb2xpY3kuaD4KLSNpbmNsdWRlIDxjdXRpbHMvYXRvbWljLmg+CiAKICNpZm5kZWYgQVJSQVlfU0laRQogI2RlZmluZSBBUlJBWV9TSVpFKGEpIChzaXplb2YoYSkgLyBzaXplb2YoKGEpWzBdKSkKQEAgLTI5LDggKzI4LDYgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1pbnQzMl90IHZvbGF0aWxlIEF1ZGlvUG9ydDo6bU5leHRVbmlxdWVJZCA9IDE7Ci0KIC8vIC0tLSBBdWRpb1BvcnQgY2xhc3MgaW1wbGVtZW50YXRpb24KIHZvaWQgQXVkaW9Qb3J0OjphdHRhY2goY29uc3Qgc3A8SHdNb2R1bGU+JiBtb2R1bGUpCiB7CkBAIC00MCwzMSArMzcsMjIgQEAKIC8vIE5vdGUgdGhhdCBpcyBhIGRpZmZlcmVudCBuYW1lc3BhY2UgdGhhbiBBdWRpb0ZsaW5nZXIgdW5pcXVlIElEcwogYXVkaW9fcG9ydF9oYW5kbGVfdCBBdWRpb1BvcnQ6OmdldE5leHRVbmlxdWVJZCgpCiB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PGF1ZGlvX3BvcnRfaGFuZGxlX3Q+KGFuZHJvaWRfYXRvbWljX2luYygmbU5leHRVbmlxdWVJZCkpOworICAgIHJldHVybiBnZXROZXh0SGFuZGxlKCk7CiB9CiAKIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBBdWRpb1BvcnQ6OmdldE1vZHVsZUhhbmRsZSgpIGNvbnN0CiB7Ci0gICAgaWYgKG1Nb2R1bGUgPT0gMCkgewotICAgICAgICByZXR1cm4gQVVESU9fTU9EVUxFX0hBTkRMRV9OT05FOwotICAgIH0KLSAgICByZXR1cm4gbU1vZHVsZS0+bUhhbmRsZTsKKyAgICByZXR1cm4gbU1vZHVsZSAhPSAwID8gbU1vZHVsZS0+Z2V0SGFuZGxlKCkgOiBBVURJT19NT0RVTEVfSEFORExFX05PTkU7CiB9CiAKIHVpbnQzMl90IEF1ZGlvUG9ydDo6Z2V0TW9kdWxlVmVyc2lvbk1ham9yKCkgY29uc3QKIHsKLSAgICBpZiAobU1vZHVsZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gbU1vZHVsZS0+Z2V0SGFsVmVyc2lvbk1ham9yKCk7CisgICAgcmV0dXJuIG1Nb2R1bGUgIT0gMCA/IG1Nb2R1bGUtPmdldEhhbFZlcnNpb25NYWpvcigpIDogMDsKIH0KIAogY29uc3QgY2hhciAqQXVkaW9Qb3J0OjpnZXRNb2R1bGVOYW1lKCkgY29uc3QKIHsKLSAgICBpZiAobU1vZHVsZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAiaW52YWxpZCBtb2R1bGUiOwotICAgIH0KLSAgICByZXR1cm4gbU1vZHVsZS0+Z2V0TmFtZSgpOworICAgIHJldHVybiBtTW9kdWxlICE9IDAgPyBtTW9kdWxlLT5nZXROYW1lKCkgOiAiaW52YWxpZCBtb2R1bGUiOwogfQogCiB2b2lkIEF1ZGlvUG9ydDo6dG9BdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIGNvbnN0CkBAIC03NCwxMSArNjIsMTEgQEAKICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9fZm9ybWF0X3Q+IGZsYXRlbmVkRm9ybWF0czsKICAgICBTYW1wbGVSYXRlVmVjdG9yIGZsYXRlbmVkUmF0ZXM7CiAgICAgQ2hhbm5lbHNWZWN0b3IgZmxhdGVuZWRDaGFubmVsczsKLSAgICBmb3IgKHNpemVfdCBwcm9maWxlSW5kZXggPSAwOyBwcm9maWxlSW5kZXggPCBtUHJvZmlsZXMuc2l6ZSgpOyBwcm9maWxlSW5kZXgrKykgewotICAgICAgICBpZiAobVByb2ZpbGVzW3Byb2ZpbGVJbmRleF0tPmlzVmFsaWQoKSkgewotICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0VG9FeHBvcnQgPSBtUHJvZmlsZXNbcHJvZmlsZUluZGV4XS0+Z2V0Rm9ybWF0KCk7Ci0gICAgICAgICAgICBjb25zdCBTYW1wbGVSYXRlVmVjdG9yICZyYXRlc1RvRXhwb3J0ID0gbVByb2ZpbGVzW3Byb2ZpbGVJbmRleF0tPmdldFNhbXBsZVJhdGVzKCk7Ci0gICAgICAgICAgICBjb25zdCBDaGFubmVsc1ZlY3RvciAmY2hhbm5lbHNUb0V4cG9ydCA9IG1Qcm9maWxlc1twcm9maWxlSW5kZXhdLT5nZXRDaGFubmVscygpOworICAgIGZvciAoY29uc3QgYXV0byYgcHJvZmlsZSA6IG1Qcm9maWxlcykgeworICAgICAgICBpZiAocHJvZmlsZS0+aXNWYWxpZCgpKSB7CisgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXRUb0V4cG9ydCA9IHByb2ZpbGUtPmdldEZvcm1hdCgpOworICAgICAgICAgICAgY29uc3QgU2FtcGxlUmF0ZVZlY3RvciAmcmF0ZXNUb0V4cG9ydCA9IHByb2ZpbGUtPmdldFNhbXBsZVJhdGVzKCk7CisgICAgICAgICAgICBjb25zdCBDaGFubmVsc1ZlY3RvciAmY2hhbm5lbHNUb0V4cG9ydCA9IHByb2ZpbGUtPmdldENoYW5uZWxzKCk7CiAKICAgICAgICAgICAgIGlmIChmbGF0ZW5lZEZvcm1hdHMuaW5kZXhPZihmb3JtYXRUb0V4cG9ydCkgPCAwKSB7CiAgICAgICAgICAgICAgICAgZmxhdGVuZWRGb3JtYXRzLmFkZChmb3JtYXRUb0V4cG9ydCk7CkBAIC0xMzAsMTQgKzExOCwxMiBAQAogCiB2b2lkIEF1ZGlvUG9ydDo6aW1wb3J0QXVkaW9Qb3J0KGNvbnN0IHNwPEF1ZGlvUG9ydD4mIHBvcnQsIGJvb2wgZm9yY2UgX191bnVzZWQpCiB7Ci0gICAgc2l6ZV90IGluZGV4VG9JbXBvcnQ7Ci0gICAgZm9yIChpbmRleFRvSW1wb3J0ID0gMDsgaW5kZXhUb0ltcG9ydCA8IHBvcnQtPm1Qcm9maWxlcy5zaXplKCk7IGluZGV4VG9JbXBvcnQrKykgewotICAgICAgICBjb25zdCBzcDxBdWRpb1Byb2ZpbGU+ICZwcm9maWxlVG9JbXBvcnQgPSBwb3J0LT5tUHJvZmlsZXNbaW5kZXhUb0ltcG9ydF07CisgICAgZm9yIChjb25zdCBhdXRvJiBwcm9maWxlVG9JbXBvcnQgOiBwb3J0LT5tUHJvZmlsZXMpIHsKICAgICAgICAgaWYgKHByb2ZpbGVUb0ltcG9ydC0+aXNWYWxpZCgpKSB7CiAgICAgICAgICAgICAvLyBJbXBvcnQgb25seSB2YWxpZCBwb3J0LCBpLmUuIHZhbGlkIGZvcm1hdCwgbm9uIGVtcHR5IHJhdGVzIGFuZCBjaGFubmVscyBtYXNrcwogICAgICAgICAgICAgYm9vbCBoYXNTYW1lUHJvZmlsZSA9IGZhbHNlOwotICAgICAgICAgICAgZm9yIChzaXplX3QgcHJvZmlsZUluZGV4ID0gMDsgcHJvZmlsZUluZGV4IDwgbVByb2ZpbGVzLnNpemUoKTsgcHJvZmlsZUluZGV4KyspIHsKLSAgICAgICAgICAgICAgICBpZiAoKm1Qcm9maWxlc1twcm9maWxlSW5kZXhdID09ICpwcm9maWxlVG9JbXBvcnQpIHsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgcHJvZmlsZSA6IG1Qcm9maWxlcykgeworICAgICAgICAgICAgICAgIGlmICgqcHJvZmlsZSA9PSAqcHJvZmlsZVRvSW1wb3J0KSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIG5ldmVyIGltcG9ydCBhIHByb2ZpbGUgdHdpY2UKICAgICAgICAgICAgICAgICAgICAgaGFzU2FtZVByb2ZpbGUgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTQ3OSw0ICs0NjUsNCBAQAogICAgIH0KIH0KIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUHJvZmlsZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1Byb2ZpbGUuY3BwCmluZGV4IDk4ZjdhOTQuLmZkNmZjMWMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUHJvZmlsZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Qcm9maWxlLmNwcApAQCAtMjMzLDggKzIzMyw3IEBACiAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9CiAKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4gcHJvZmlsZSA9IGl0ZW1BdChpKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHByb2ZpbGUgOiAqdGhpcykgewogICAgICAgICBpZiAocHJvZmlsZS0+Y2hlY2tFeGFjdChzYW1wbGluZ1JhdGUsIGNoYW5uZWxNYXNrLCBmb3JtYXQpID09IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KQEAgLTI4OCw0ICsyODcsNCBAQAogICAgIHJldHVybiBBdWRpb1BvcnQ6OmNvbXBhcmVGb3JtYXRzKCgqcHJvZmlsZTEpLT5nZXRGb3JtYXQoKSwgKCpwcm9maWxlMiktPmdldEZvcm1hdCgpKTsKIH0KIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvU2Vzc2lvbi5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1Nlc3Npb24uY3BwCmluZGV4IDViNTdkM2QuLjdjZGE0NmIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvU2Vzc2lvbi5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9TZXNzaW9uLmNwcApAQCAtMjkwLDQgKzI5MCw0IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQ29uZmlnUGFyc2luZ1V0aWxzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0NvbmZpZ1BhcnNpbmdVdGlscy5jcHAKaW5kZXggZTU4ODhlMi4uMWUxMDVmNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQ29uZmlnUGFyc2luZ1V0aWxzLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Db25maWdQYXJzaW5nVXRpbHMuY3BwCkBAIC00MTYsNCArNDE2LDQgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9EZXZpY2VEZXNjcmlwdG9yLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0RldmljZURlc2NyaXB0b3IuY3BwCmluZGV4IGEyYzExNjUuLjNiMWU3NTEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0RldmljZURlc2NyaXB0b3IuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0RldmljZURlc2NyaXB0b3IuY3BwCkBAIC02MCw3ICs2MCw3IEBACiB2b2lkIERldmljZVZlY3Rvcjo6cmVmcmVzaFR5cGVzKCkKIHsKICAgICBtRGV2aWNlVHlwZXMgPSBBVURJT19ERVZJQ0VfTk9ORTsKLSAgICBmb3Ioc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CiAgICAgICAgIG1EZXZpY2VUeXBlcyB8PSBpdGVtQXQoaSktPnR5cGUoKTsKICAgICB9CiAgICAgQUxPR1YoIkRldmljZVZlY3Rvcjo6cmVmcmVzaFR5cGVzKCkgbURldmljZVR5cGVzICUwOHgiLCBtRGV2aWNlVHlwZXMpOwpAQCAtNjgsNyArNjgsNyBAQAogCiBzc2l6ZV90IERldmljZVZlY3Rvcjo6aW5kZXhPZihjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgaXRlbSkgY29uc3QKIHsKLSAgICBmb3Ioc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CiAgICAgICAgIGlmIChpdGVtLT5lcXVhbHMoaXRlbUF0KGkpKSkgewogICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgIH0KQEAgLTc4LDEyICs3OCwxNSBAQAogCiB2b2lkIERldmljZVZlY3Rvcjo6YWRkKGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcykKIHsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGRldmljZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlID0gZGV2aWNlcy5pdGVtQXQoaSk7CisgICAgYm9vbCBhZGRlZCA9IGZhbHNlOworICAgIGZvciAoY29uc3QgYXV0byYgZGV2aWNlIDogZGV2aWNlcykgewogICAgICAgICBpZiAoaW5kZXhPZihkZXZpY2UpIDwgMCAmJiBTb3J0ZWRWZWN0b3I6OmFkZChkZXZpY2UpID49IDApIHsKLSAgICAgICAgICAgIHJlZnJlc2hUeXBlcygpOworICAgICAgICAgICAgYWRkZWQgPSB0cnVlOwogICAgICAgICB9CiAgICAgfQorICAgIGlmIChhZGRlZCkgeworICAgICAgICByZWZyZXNoVHlwZXMoKTsKKyAgICB9CiB9CiAKIHNzaXplX3QgRGV2aWNlVmVjdG9yOjphZGQoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGl0ZW0pCkBAIC0xNDgsMTQgKzE1MSwxMiBAQAogCiBzcDxEZXZpY2VEZXNjcmlwdG9yPiBEZXZpY2VWZWN0b3I6OmdldERldmljZUZyb21JZChhdWRpb19wb3J0X2hhbmRsZV90IGlkKSBjb25zdAogewotICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChpdGVtQXQoaSktPmdldElkKCkgPT0gaWQpIHsKLSAgICAgICAgICAgIGRldmljZSA9IGl0ZW1BdChpKTsKLSAgICAgICAgICAgIGJyZWFrOworICAgIGZvciAoY29uc3QgYXV0byYgZGV2aWNlIDogKnRoaXMpIHsKKyAgICAgICAgaWYgKGRldmljZS0+Z2V0SWQoKSA9PSBpZCkgeworICAgICAgICAgICAgcmV0dXJuIGRldmljZTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gZGV2aWNlOworICAgIHJldHVybiBudWxscHRyOwogfQogCiBEZXZpY2VWZWN0b3IgRGV2aWNlVmVjdG9yOjpnZXREZXZpY2VzRnJvbVR5cGUoYXVkaW9fZGV2aWNlc190IHR5cGUpIGNvbnN0CkBAIC0xODAsMTEgKzE4MSw5IEBACiAgICAgICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlLCBjb25zdCBTdHJpbmc4JiBhZGRyZXNzKSBjb25zdAogewogICAgIERldmljZVZlY3RvciBkZXZpY2VzOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKGl0ZW1BdChpKS0+dHlwZSgpID09IHR5cGUpIHsKLSAgICAgICAgICAgIGlmIChpdGVtQXQoaSktPm1BZGRyZXNzID09IGFkZHJlc3MpIHsKLSAgICAgICAgICAgICAgICBkZXZpY2VzLmFkZChpdGVtQXQoaSkpOwotICAgICAgICAgICAgfQorICAgIGZvciAoY29uc3QgYXV0byYgZGV2aWNlIDogKnRoaXMpIHsKKyAgICAgICAgaWYgKGRldmljZS0+dHlwZSgpID09IHR5cGUgJiYgZGV2aWNlLT5tQWRkcmVzcyA9PSBhZGRyZXNzKSB7CisgICAgICAgICAgICBkZXZpY2VzLmFkZChkZXZpY2UpOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBkZXZpY2VzOwpAQCAtMTkyLDE0ICsxOTEsMTIgQEAKIAogc3A8RGV2aWNlRGVzY3JpcHRvcj4gRGV2aWNlVmVjdG9yOjpnZXREZXZpY2VGcm9tVGFnTmFtZShjb25zdCBTdHJpbmc4ICZ0YWdOYW1lKSBjb25zdAogewotICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChpdGVtQXQoaSktPmdldFRhZ05hbWUoKSA9PSB0YWdOYW1lKSB7Ci0gICAgICAgICAgICBkZXZpY2UgPSBpdGVtQXQoaSk7Ci0gICAgICAgICAgICBicmVhazsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGRldmljZSA6ICp0aGlzKSB7CisgICAgICAgIGlmIChkZXZpY2UtPmdldFRhZ05hbWUoKSA9PSB0YWdOYW1lKSB7CisgICAgICAgICAgICByZXR1cm4gZGV2aWNlOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBkZXZpY2U7CisgICAgcmV0dXJuIG51bGxwdHI7CiB9CiAKIHN0YXR1c190IERldmljZVZlY3Rvcjo6ZHVtcChpbnQgZmQsIGNvbnN0IFN0cmluZzggJnRhZywgaW50IHNwYWNlcywgYm9vbCB2ZXJib3NlKSBjb25zdApAQCAtMjQ4LDcgKzI0NSw4IEBACiAgICAgLy8gd2l0aG91dCB0aGUgdGVzdD8KICAgICAvLyBUaGlzIGhhcyBiZWVuIGRlbW9uc3RyYXRlZCB0byBOT1QgYmUgdHJ1ZSAoYXQgc3RhcnQgdXApCiAgICAgLy8gQUxPR19BU1NFUlQobU1vZHVsZSAhPSBOVUxMKTsKLSAgICBkc3RDb25maWctPmV4dC5kZXZpY2UuaHdfbW9kdWxlID0gbU1vZHVsZSAhPSAwID8gbU1vZHVsZS0+bUhhbmRsZSA6IEFVRElPX01PRFVMRV9IQU5ETEVfTk9ORTsKKyAgICBkc3RDb25maWctPmV4dC5kZXZpY2UuaHdfbW9kdWxlID0KKyAgICAgICAgICAgIG1Nb2R1bGUgIT0gMCA/IG1Nb2R1bGUtPmdldEhhbmRsZSgpIDogQVVESU9fTU9EVUxFX0hBTkRMRV9OT05FOwogICAgIHN0cm5jcHkoZHN0Q29uZmlnLT5leHQuZGV2aWNlLmFkZHJlc3MsIG1BZGRyZXNzLnN0cmluZygpLCBBVURJT19ERVZJQ0VfTUFYX0FERFJFU1NfTEVOKTsKIH0KIApAQCAtMjU5LDcgKzI1Nyw3IEBACiAgICAgcG9ydC0+aWQgPSBtSWQ7CiAgICAgdG9BdWRpb1BvcnRDb25maWcoJnBvcnQtPmFjdGl2ZV9jb25maWcpOwogICAgIHBvcnQtPmV4dC5kZXZpY2UudHlwZSA9IG1EZXZpY2VUeXBlOwotICAgIHBvcnQtPmV4dC5kZXZpY2UuaHdfbW9kdWxlID0gbU1vZHVsZS0+bUhhbmRsZTsKKyAgICBwb3J0LT5leHQuZGV2aWNlLmh3X21vZHVsZSA9IG1Nb2R1bGUtPmdldEhhbmRsZSgpOwogICAgIHN0cm5jcHkocG9ydC0+ZXh0LmRldmljZS5hZGRyZXNzLCBtQWRkcmVzcy5zdHJpbmcoKSwgQVVESU9fREVWSUNFX01BWF9BRERSRVNTX0xFTik7CiB9CiAKQEAgLTMxMiw0ICszMTAsNCBAQAogICAgIEF1ZGlvUG9ydDo6bG9nKCIgICIpOwogfQogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvR2FpbnMuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvR2FpbnMuY3BwCmluZGV4IGUzZmM5YTguLmIyZGFmZGQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0dhaW5zLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9HYWlucy5jcHAKQEAgLTIzNSw0ICsyMzUsNCBAQAogICAgIHJldHVybiBkZWNpYmVsczsKIH0KIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0h3TW9kdWxlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0h3TW9kdWxlLmNwcAppbmRleCBjYzU2ZmI4Li5hZWY3ZGJlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Id01vZHVsZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvSHdNb2R1bGUuY3BwCkBAIC0xNTQsMTAgKzE1NCw5IEBACiBEZXZpY2VWZWN0b3IgSHdNb2R1bGU6OmdldFJvdXRlU291cmNlRGV2aWNlcyhjb25zdCBzcDxBdWRpb1JvdXRlPiAmcm91dGUpIGNvbnN0CiB7CiAgICAgRGV2aWNlVmVjdG9yIHNvdXJjZURldmljZXM7Ci0gICAgVmVjdG9yIDxzcDxBdWRpb1BvcnQ+ID4gc291cmNlcyA9IHJvdXRlLT5nZXRTb3VyY2VzKCk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzb3VyY2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChzb3VyY2VzW2ldLT5nZXRUeXBlKCkgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgewotICAgICAgICAgICAgc291cmNlRGV2aWNlcy5hZGQobURlY2xhcmVkRGV2aWNlcy5nZXREZXZpY2VGcm9tVGFnTmFtZShzb3VyY2VzW2ldLT5nZXRUYWdOYW1lKCkpKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHNvdXJjZSA6IHJvdXRlLT5nZXRTb3VyY2VzKCkpIHsKKyAgICAgICAgaWYgKHNvdXJjZS0+Z2V0VHlwZSgpID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKKyAgICAgICAgICAgIHNvdXJjZURldmljZXMuYWRkKG1EZWNsYXJlZERldmljZXMuZ2V0RGV2aWNlRnJvbVRhZ05hbWUoc291cmNlLT5nZXRUYWdOYW1lKCkpKTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gc291cmNlRGV2aWNlczsKQEAgLTE3MywxNyArMTcyLDE1IEBACiB2b2lkIEh3TW9kdWxlOjpyZWZyZXNoU3VwcG9ydGVkRGV2aWNlcygpCiB7CiAgICAgLy8gTm93IHVwZGF0aW5nIHRoZSBzdHJlYW1zIChha2EgSU9Qcm9maWxlIHVudGlsIG5vdykgc3VwcG9ydGVkIGRldmljZXMKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dFByb2ZpbGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNwPElPUHJvZmlsZT4gc3RyZWFtID0gbUlucHV0UHJvZmlsZXNbaV07CisgICAgZm9yIChjb25zdCBhdXRvJiBzdHJlYW0gOiBtSW5wdXRQcm9maWxlcykgewogICAgICAgICBEZXZpY2VWZWN0b3Igc291cmNlRGV2aWNlczsKLSAgICAgICAgY29uc3QgQXVkaW9Sb3V0ZVZlY3RvciAmcm91dGVzID0gc3RyZWFtLT5nZXRSb3V0ZXMoKTsKLSAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCByb3V0ZXMuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgIHNwPEF1ZGlvUG9ydD4gc2luayA9IHJvdXRlc1tqXS0+Z2V0U2luaygpOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHJvdXRlIDogc3RyZWFtLT5nZXRSb3V0ZXMoKSkgeworICAgICAgICAgICAgc3A8QXVkaW9Qb3J0PiBzaW5rID0gcm91dGUtPmdldFNpbmsoKTsKICAgICAgICAgICAgIGlmIChzaW5rID09IDAgfHwgc3RyZWFtICE9IHNpbmspIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgcm91dGUgYXR0YWNoZWQgdG8gaW5wdXQgc3RyZWFtIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIERldmljZVZlY3RvciBzb3VyY2VEZXZpY2VzRm9yUm91dGUgPSBnZXRSb3V0ZVNvdXJjZURldmljZXMocm91dGVzW2pdKTsKKyAgICAgICAgICAgIERldmljZVZlY3RvciBzb3VyY2VEZXZpY2VzRm9yUm91dGUgPSBnZXRSb3V0ZVNvdXJjZURldmljZXMocm91dGUpOwogICAgICAgICAgICAgaWYgKHNvdXJjZURldmljZXNGb3JSb3V0ZS5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGludmFsaWQgc291cmNlIGRldmljZXMgZm9yICVzIiwgX19GVU5DVElPTl9fLCBzdHJlYW0tPmdldE5hbWUoKS5zdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgY29udGludWU7CkBAIC0xOTYsMTcgKzE5MywxNSBAQAogICAgICAgICB9CiAgICAgICAgIHN0cmVhbS0+c2V0U3VwcG9ydGVkRGV2aWNlcyhzb3VyY2VEZXZpY2VzKTsKICAgICB9Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0UHJvZmlsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc3A8SU9Qcm9maWxlPiBzdHJlYW0gPSBtT3V0cHV0UHJvZmlsZXNbaV07CisgICAgZm9yIChjb25zdCBhdXRvJiBzdHJlYW0gOiBtT3V0cHV0UHJvZmlsZXMpIHsKICAgICAgICAgRGV2aWNlVmVjdG9yIHNpbmtEZXZpY2VzOwotICAgICAgICBjb25zdCBBdWRpb1JvdXRlVmVjdG9yICZyb3V0ZXMgPSBzdHJlYW0tPmdldFJvdXRlcygpOwotICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHJvdXRlcy5zaXplKCk7IGorKykgewotICAgICAgICAgICAgc3A8QXVkaW9Qb3J0PiBzb3VyY2UgPSByb3V0ZXNbal0tPmdldFNvdXJjZXMoKS5maW5kQnlUYWdOYW1lKHN0cmVhbS0+Z2V0VGFnTmFtZSgpKTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiByb3V0ZSA6IHN0cmVhbS0+Z2V0Um91dGVzKCkpIHsKKyAgICAgICAgICAgIHNwPEF1ZGlvUG9ydD4gc291cmNlID0gcm91dGUtPmdldFNvdXJjZXMoKS5maW5kQnlUYWdOYW1lKHN0cmVhbS0+Z2V0VGFnTmFtZSgpKTsKICAgICAgICAgICAgIGlmIChzb3VyY2UgPT0gMCB8fCBzdHJlYW0gIT0gc291cmNlKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIHJvdXRlIGF0dGFjaGVkIHRvIG91dHB1dCBzdHJlYW0iLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gc2lua0RldmljZSA9IGdldFJvdXRlU2lua0RldmljZShyb3V0ZXNbal0pOworICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gc2lua0RldmljZSA9IGdldFJvdXRlU2lua0RldmljZShyb3V0ZSk7CiAgICAgICAgICAgICBpZiAoc2lua0RldmljZSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBpbnZhbGlkIHNpbmsgZGV2aWNlIGZvciAlcyIsIF9fRlVOQ1RJT05fXywgc3RyZWFtLT5nZXROYW1lKCkuc3RyaW5nKCkpOwogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtMjE3LDYgKzIxMiwxMiBAQAogICAgIH0KIH0KIAordm9pZCBId01vZHVsZTo6c2V0SGFuZGxlKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBoYW5kbGUpIHsKKyAgICBBTE9HV19JRihtSGFuZGxlICE9IEFVRElPX01PRFVMRV9IQU5ETEVfTk9ORSwKKyAgICAgICAgICAgICJId01vZHVsZSBoYW5kbGUgaXMgY2hhbmdpbmcgZnJvbSAlZCB0byAlZCIsIG1IYW5kbGUsIGhhbmRsZSk7CisgICAgbUhhbmRsZSA9IGhhbmRsZTsKK30KKwogdm9pZCBId01vZHVsZTo6ZHVtcChpbnQgZmQpCiB7CiAgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CkBAIC0yNTIsNjAgKzI1Myw0MCBAQAogCiBzcCA8SHdNb2R1bGU+IEh3TW9kdWxlQ29sbGVjdGlvbjo6Z2V0TW9kdWxlRnJvbU5hbWUoY29uc3QgY2hhciAqbmFtZSkgY29uc3QKIHsKLSAgICBzcCA8SHdNb2R1bGU+IG1vZHVsZTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgICBpZiAoc3RyY21wKGl0ZW1BdChpKS0+Z2V0TmFtZSgpLCBuYW1lKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gaXRlbUF0KGkpOworICAgIGZvciAoY29uc3QgYXV0byYgbW9kdWxlIDogKnRoaXMpIHsKKyAgICAgICAgaWYgKHN0cmNtcChtb2R1bGUtPmdldE5hbWUoKSwgbmFtZSkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIG1vZHVsZTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gbW9kdWxlOworICAgIHJldHVybiBudWxscHRyOwogfQogCi0KIHNwIDxId01vZHVsZT4gSHdNb2R1bGVDb2xsZWN0aW9uOjpnZXRNb2R1bGVGb3JEZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3QKIHsKLSAgICBzcCA8SHdNb2R1bGU+IG1vZHVsZTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKGl0ZW1BdChpKS0+Z2V0SGFuZGxlKCkgPT0gMCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlKSkgewotICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBpdGVtQXQoaSktPm1PdXRwdXRQcm9maWxlcy5zaXplKCk7IGorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoaXRlbUF0KGkpLT5tT3V0cHV0UHJvZmlsZXNbal0tPnN1cHBvcnREZXZpY2UoZGV2aWNlKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbUF0KGkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgaXRlbUF0KGkpLT5tSW5wdXRQcm9maWxlcy5zaXplKCk7IGorKykgewotICAgICAgICAgICAgICAgIGlmIChpdGVtQXQoaSktPm1JbnB1dFByb2ZpbGVzW2pdLT5zdXBwb3J0RGV2aWNlKGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1BdChpKTsKLSAgICAgICAgICAgICAgICB9CisgICAgZm9yIChjb25zdCBhdXRvJiBtb2R1bGUgOiAqdGhpcykgeworICAgICAgICBjb25zdCBhdXRvJiBwcm9maWxlcyA9IGF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlKSA/CisgICAgICAgICAgICAgICAgbW9kdWxlLT5nZXRPdXRwdXRQcm9maWxlcygpIDogbW9kdWxlLT5nZXRJbnB1dFByb2ZpbGVzKCk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgcHJvZmlsZSA6IHByb2ZpbGVzKSB7CisgICAgICAgICAgICBpZiAocHJvZmlsZS0+c3VwcG9ydERldmljZShkZXZpY2UpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1vZHVsZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gbW9kdWxlOworICAgIHJldHVybiBudWxscHRyOwogfQogCi1zcDxEZXZpY2VEZXNjcmlwdG9yPiAgSHdNb2R1bGVDb2xsZWN0aW9uOjpnZXREZXZpY2VEZXNjcmlwdG9yKGNvbnN0IGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBtYXRjaEFkcmVzcykgY29uc3QKK3NwPERldmljZURlc2NyaXB0b3I+IEh3TW9kdWxlQ29sbGVjdGlvbjo6Z2V0RGV2aWNlRGVzY3JpcHRvcihjb25zdCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbWF0Y2hBZHJlc3MpIGNvbnN0CiB7Ci0gICAgU3RyaW5nOCBhZGRyZXNzID0gKGRldmljZV9hZGRyZXNzID09IE5VTEwpID8gU3RyaW5nOCgiIikgOiBTdHJpbmc4KGRldmljZV9hZGRyZXNzKTsKKyAgICBTdHJpbmc4IGFkZHJlc3MgPSAoZGV2aWNlX2FkZHJlc3MgPT0gbnVsbHB0cikgPyBTdHJpbmc4KCIiKSA6IFN0cmluZzgoZGV2aWNlX2FkZHJlc3MpOwogICAgIC8vIGhhbmRsZSBsZWdhY3kgcmVtb3RlIHN1Ym1peCBjYXNlIHdoZXJlIHRoZSBhZGRyZXNzIHdhcyBub3QgYWx3YXlzIHNwZWNpZmllZAogICAgIGlmIChkZXZpY2VfZGlzdGluZ3Vpc2hlc19vbl9hZGRyZXNzKGRldmljZSkgJiYgKGFkZHJlc3MubGVuZ3RoKCkgPT0gMCkpIHsKICAgICAgICAgYWRkcmVzcyA9IFN0cmluZzgoIjAiKTsKICAgICB9CiAKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGNvbnN0IHNwPEh3TW9kdWxlPiBod01vZHVsZSA9IGl0ZW1BdChpKTsKLSAgICAgICAgaWYgKGh3TW9kdWxlLT5tSGFuZGxlID09IDApIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9CisgICAgZm9yIChjb25zdCBhdXRvJiBod01vZHVsZSA6ICp0aGlzKSB7CiAgICAgICAgIERldmljZVZlY3RvciBkZWNsYXJlZERldmljZXMgPSBod01vZHVsZS0+Z2V0RGVjbGFyZWREZXZpY2VzKCk7CiAgICAgICAgIERldmljZVZlY3RvciBkZXZpY2VMaXN0ID0gZGVjbGFyZWREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZUFkZHIoZGV2aWNlLCBhZGRyZXNzKTsKICAgICAgICAgaWYgKCFkZXZpY2VMaXN0LmlzRW1wdHkoKSkgewpAQCAtMzQwLDQgKzMyMSw1IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCisKIH0gLy9uYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvSU9Qcm9maWxlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0lPUHJvZmlsZS5jcHAKaW5kZXggZmM4OTY3Mi4uZTg5ODBiNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvSU9Qcm9maWxlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9JT1Byb2ZpbGUuY3BwCkBAIC0xMzksNCArMTM5LDQgQEAKICAgICAvLyBAVE9ETzogZm9yd2FyZCBsb2cgdG8gQXVkaW9Qb3J0CiB9CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9TZXJpYWxpemVyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1NlcmlhbGl6ZXIuY3BwCmluZGV4IGFhNTg5ZjQuLmEyNTMxMTMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1NlcmlhbGl6ZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1NlcmlhbGl6ZXIuY3BwCkBAIC02NDgsNCArNjQ4LDQgQEAKICAgICByZXR1cm4gYW5kcm9pZDo6T0s7CiB9CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9TdHJlYW1EZXNjcmlwdG9yLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1N0cmVhbURlc2NyaXB0b3IuY3BwCmluZGV4IGIzMDE5ZTEuLjY1NjQ5ZmIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1N0cmVhbURlc2NyaXB0b3IuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1N0cmVhbURlc2NyaXB0b3IuY3BwCkBAIC0yMjMsNCArMjIzLDQgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9UeXBlQ29udmVydGVyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1R5cGVDb252ZXJ0ZXIuY3BwCmluZGV4IDAzNjIwMzcuLjcyNzNkMGQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1R5cGVDb252ZXJ0ZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1R5cGVDb252ZXJ0ZXIuY3BwCkBAIC02NSw0ICs2NSw0IEBACiB0ZW1wbGF0ZSBjbGFzcyBUeXBlQ29udmVydGVyPFJvdXRlRmxhZ1RyYWl0cz47CiB0ZW1wbGF0ZSBjbGFzcyBUeXBlQ29udmVydGVyPFJ1bGVUcmFpdHM+OwogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvVm9sdW1lQ3VydmUuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvVm9sdW1lQ3VydmUuY3BwCmluZGV4IDE0Y2FmN2MuLmVjODYxYzEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1ZvbHVtZUN1cnZlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Wb2x1bWVDdXJ2ZS5jcHAKQEAgLTEzOCw0ICsxMzgsNCBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UvQXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlL0F1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZS5oCmluZGV4IDU2N2ZmOWUuLjA0NTk0ZjUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UvQXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZS9BdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UuaApAQCAtMTM3LDQgKzEzNyw0IEBACiAgICAgdmlydHVhbCB+QXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlKCkge30KIH07CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlL0F1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlL0F1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyLmgKaW5kZXggODQ2ZmE0OC4uYjc5MDJjZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZS9BdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UvQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIuaApAQCAtNTksNCArNTksNCBAQAogICAgIHZpcnR1YWwgfkF1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyKCkge30KIH07CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW5jbHVkZS9BdWRpb1BvbGljeUVuZ2luZUluc3RhbmNlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW5jbHVkZS9BdWRpb1BvbGljeUVuZ2luZUluc3RhbmNlLmgKaW5kZXggNmM0YmUyYy4uYTU5N2U4NyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2luY2x1ZGUvQXVkaW9Qb2xpY3lFbmdpbmVJbnN0YW5jZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9pbmNsdWRlL0F1ZGlvUG9saWN5RW5naW5lSW5zdGFuY2UuaApAQCAtNzYsNiArNzYsNiBAQAogdGVtcGxhdGUgPD4KIEF1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlICpFbmdpbmVJbnN0YW5jZTo6cXVlcnlJbnRlcmZhY2UoKSBjb25zdDsKIAotfTsgLy8gbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQorfSAvLyBuYW1lc3BhY2UgYXVkaW9fcG9saWN5CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW50ZXJmYWNlL0F1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW50ZXJmYWNlL0F1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlLmgKaW5kZXggNzU5ZDBjOS4uMmUyOWE5YiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2ludGVyZmFjZS9BdWRpb1BvbGljeVBsdWdpbkludGVyZmFjZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9pbnRlcmZhY2UvQXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UuaApAQCAtMTQzLDQgKzE0Myw0IEBACiAgICAgdmlydHVhbCB+QXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UoKSB7fQogfTsKIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvRW5naW5lLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VuZ2luZS5oCmluZGV4IGJjNWUwMzUuLjMyOGQyM2QgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvRW5naW5lLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9FbmdpbmUuaApAQCAtMTk0LDcgKzE5NCw3IEBACiAgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIgKm1BcG1PYnNlcnZlcjsKIH07CiAKLX07IC8vIG5hbWVzcGFjZSBhdWRpb19wb2xpY3kKK30gLy8gbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyL0F1ZGlvUG9saWN5RmFjdG9yeS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyL0F1ZGlvUG9saWN5RmFjdG9yeS5jcHAKaW5kZXggOTkxMGExZi4uM2VmYTFiMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlci9BdWRpb1BvbGljeUZhY3RvcnkuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXIvQXVkaW9Qb2xpY3lGYWN0b3J5LmNwcApAQCAtMjksNCArMjksNCBAQAogICAgIGRlbGV0ZSBpbnRlcmZhY2U7CiB9CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmNwcAppbmRleCBiMzYzNzc5Li5hZTNkZDA4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5jcHAKQEAgLTMyLDcgKzMyLDYgQEAKIAogI2luY2x1ZGUgPEF1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZS5oPgogI2luY2x1ZGUgPEF1ZGlvUG9saWN5RW5naW5lSW5zdGFuY2UuaD4KLSNpbmNsdWRlIDxjdXRpbHMvYXRvbWljLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgpAQCAtODgsNyArODcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpCiB7CiAgICAgQUxPR1YoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludCgpIGRldmljZTogMHglWCwgc3RhdGUgJWQsIGFkZHJlc3MgJXMgbmFtZSAlcyIsCi0tICAgICAgICAgICAgZGV2aWNlLCBzdGF0ZSwgZGV2aWNlX2FkZHJlc3MsIGRldmljZV9uYW1lKTsKKyAgICAgICAgICAgIGRldmljZSwgc3RhdGUsIGRldmljZV9hZGRyZXNzLCBkZXZpY2VfbmFtZSk7CiAKICAgICAvLyBjb25uZWN0L2Rpc2Nvbm5lY3Qgb25seSAxIGRldmljZSBhdCBhIHRpbWUKICAgICBpZiAoIWF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlKSAmJiAhYXVkaW9faXNfaW5wdXRfZGV2aWNlKGRldmljZSkpIHJldHVybiBCQURfVkFMVUU7CkBAIC0xODMsMTQgKzE4MiwxNCBAQAogICAgICAgICBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKTsKICAgICAgICAgLy8gb3V0cHV0cyBtdXN0IGJlIGNsb3NlZCBhZnRlciBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKSBpcyBleGVjdXRlZAogICAgICAgICBpZiAoIW91dHB1dHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dHB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dHNbaV0pOworICAgICAgICAgICAgZm9yIChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgOiBvdXRwdXRzKSB7CisgICAgICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOwogICAgICAgICAgICAgICAgIC8vIGNsb3NlIHVudXNlZCBvdXRwdXRzIGFmdGVyIGRldmljZSBkaXNjb25uZWN0aW9uIG9yIGRpcmVjdCBvdXRwdXRzIHRoYXQgaGF2ZSBiZWVuCiAgICAgICAgICAgICAgICAgLy8gb3BlbmVkIGJ5IGNoZWNrT3V0cHV0c0ZvckRldmljZSgpIHRvIHF1ZXJ5IGR5bmFtaWMgcGFyYW1ldGVycwogICAgICAgICAgICAgICAgIGlmICgoc3RhdGUgPT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICgoKGRlc2MtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgIT0gMCkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVzYy0+bURpcmVjdE9wZW5Db3VudCA9PSAwKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY2xvc2VPdXRwdXQob3V0cHV0c1tpXSk7CisgICAgICAgICAgICAgICAgICAgIGNsb3NlT3V0cHV0KG91dHB1dCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gY2hlY2sgYWdhaW4gYWZ0ZXIgY2xvc2luZyBBMkRQIG91dHB1dCB0byByZXNldCBtQTJkcFN1c3BlbmRlZCBpZiBuZWVkZWQKQEAgLTM4Nyw5ICszODYsNiBAQAogdWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjp1cGRhdGVDYWxsUm91dGluZyhhdWRpb19kZXZpY2VzX3QgcnhEZXZpY2UsIHVpbnQzMl90IGRlbGF5TXMpCiB7CiAgICAgYm9vbCBjcmVhdGVUeFBhdGNoID0gZmFsc2U7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGFmUGF0Y2hIYW5kbGU7Ci0gICAgRGV2aWNlVmVjdG9yIGRldmljZUxpc3Q7CiAgICAgdWludDMyX3QgbXV0ZVdhaXRNcyA9IDA7CiAKICAgICBpZighaGFzUHJpbWFyeU91dHB1dCgpIHx8IG1QcmltYXJ5T3V0cHV0LT5kZXZpY2UoKSA9PSBBVURJT19ERVZJQ0VfT1VUX1NUVUIpIHsKQEAgLTQyMSw4NyArNDE3LDUzIEBACiAgICAgICAgICAgICBjcmVhdGVUeFBhdGNoID0gdHJ1ZTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7IC8vIGNyZWF0ZSBSWCBwYXRoIGF1ZGlvIHBhdGNoCi0gICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCBwYXRjaDsKLQotICAgICAgICBwYXRjaC5udW1fc291cmNlcyA9IDE7Ci0gICAgICAgIHBhdGNoLm51bV9zaW5rcyA9IDE7Ci0gICAgICAgIGRldmljZUxpc3QgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUocnhEZXZpY2UpOwotICAgICAgICBBTE9HX0FTU0VSVCghZGV2aWNlTGlzdC5pc0VtcHR5KCksCi0gICAgICAgICAgICAgICAgICAgICJ1cGRhdGVDYWxsUm91dGluZygpIHNlbGVjdGVkIGRldmljZSBub3QgaW4gb3V0cHV0IGRldmljZSBsaXN0Iik7Ci0gICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IHJ4U2lua0RldmljZURlc2MgPSBkZXZpY2VMaXN0Lml0ZW1BdCgwKTsKLSAgICAgICAgZGV2aWNlTGlzdCA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKEFVRElPX0RFVklDRV9JTl9URUxFUEhPTllfUlgpOwotICAgICAgICBBTE9HX0FTU0VSVCghZGV2aWNlTGlzdC5pc0VtcHR5KCksCi0gICAgICAgICAgICAgICAgICAgICJ1cGRhdGVDYWxsUm91dGluZygpIG5vIHRlbGVwaG9ueSBSWCBkZXZpY2UiKTsKLSAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gcnhTb3VyY2VEZXZpY2VEZXNjID0gZGV2aWNlTGlzdC5pdGVtQXQoMCk7Ci0KLSAgICAgICAgcnhTb3VyY2VEZXZpY2VEZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2guc291cmNlc1swXSk7Ci0gICAgICAgIHJ4U2lua0RldmljZURlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC5zaW5rc1swXSk7Ci0KLSAgICAgICAgLy8gcmVxdWVzdCB0byByZXVzZSBleGlzdGluZyBvdXRwdXQgc3RyZWFtIGlmIG9uZSBpcyBhbHJlYWR5IG9wZW5lZCB0byByZWFjaCB0aGUgUlggZGV2aWNlCi0gICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0cyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE91dHB1dHNGb3JEZXZpY2UocnhEZXZpY2UsIG1PdXRwdXRzKTsKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gc2VsZWN0T3V0cHV0KG91dHB1dHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0lOVkFMSUQpOwotICAgICAgICBpZiAob3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7Ci0gICAgICAgICAgICBBTE9HX0FTU0VSVCghb3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAidXBkYXRlQ2FsbFJvdXRpbmcoKSBSWCBkZXZpY2Ugb3V0cHV0IGlzIGR1cGxpY2F0ZWQiKTsKLSAgICAgICAgICAgIG91dHB1dERlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC5zb3VyY2VzWzFdKTsKLSAgICAgICAgICAgIHBhdGNoLnNvdXJjZXNbMV0uZXh0Lm1peC51c2VjYXNlLnN0cmVhbSA9IEFVRElPX1NUUkVBTV9QQVRDSDsKLSAgICAgICAgICAgIHBhdGNoLm51bV9zb3VyY2VzID0gMjsKLSAgICAgICAgfQotCi0gICAgICAgIGFmUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKLSAgICAgICAgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPmNyZWF0ZUF1ZGlvUGF0Y2goJnBhdGNoLCAmYWZQYXRjaEhhbmRsZSwgZGVsYXlNcyk7Ci0gICAgICAgIEFMT0dXX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwgInVwZGF0ZUNhbGxSb3V0aW5nKCkgZXJyb3IgJWQgY3JlYXRpbmcgUlggYXVkaW8gcGF0Y2giLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMpOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBtQ2FsbFJ4UGF0Y2ggPSBuZXcgQXVkaW9QYXRjaCgmcGF0Y2gsIG1VaWRDYWNoZWQpOwotICAgICAgICAgICAgbUNhbGxSeFBhdGNoLT5tQWZQYXRjaEhhbmRsZSA9IGFmUGF0Y2hIYW5kbGU7Ci0gICAgICAgICAgICBtQ2FsbFJ4UGF0Y2gtPm1VaWQgPSBtVWlkQ2FjaGVkOwotICAgICAgICB9CisgICAgICAgIG1DYWxsUnhQYXRjaCA9IGNyZWF0ZVRlbGVwaG9ueVBhdGNoKHRydWUgLyppc1J4Ki8sIHJ4RGV2aWNlLCBkZWxheU1zKTsKICAgICAgICAgY3JlYXRlVHhQYXRjaCA9IHRydWU7CiAgICAgfQogICAgIGlmIChjcmVhdGVUeFBhdGNoKSB7IC8vIGNyZWF0ZSBUWCBwYXRoIGF1ZGlvIHBhdGNoCi0gICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCBwYXRjaDsKKyAgICAgICAgbUNhbGxUeFBhdGNoID0gY3JlYXRlVGVsZXBob255UGF0Y2goZmFsc2UgLyppc1J4Ki8sIHR4RGV2aWNlLCBkZWxheU1zKTsKKyAgICB9CiAKLSAgICAgICAgcGF0Y2gubnVtX3NvdXJjZXMgPSAxOwotICAgICAgICBwYXRjaC5udW1fc2lua3MgPSAxOwotICAgICAgICBkZXZpY2VMaXN0ID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUodHhEZXZpY2UpOwotICAgICAgICBBTE9HX0FTU0VSVCghZGV2aWNlTGlzdC5pc0VtcHR5KCksCi0gICAgICAgICAgICAgICAgICAgICJ1cGRhdGVDYWxsUm91dGluZygpIHNlbGVjdGVkIGRldmljZSBub3QgaW4gaW5wdXQgZGV2aWNlIGxpc3QiKTsKLSAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gdHhTb3VyY2VEZXZpY2VEZXNjID0gZGV2aWNlTGlzdC5pdGVtQXQoMCk7Ci0gICAgICAgIHR4U291cmNlRGV2aWNlRGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNvdXJjZXNbMF0pOwotICAgICAgICBkZXZpY2VMaXN0ID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKEFVRElPX0RFVklDRV9PVVRfVEVMRVBIT05ZX1RYKTsKLSAgICAgICAgQUxPR19BU1NFUlQoIWRldmljZUxpc3QuaXNFbXB0eSgpLAotICAgICAgICAgICAgICAgICAgICAidXBkYXRlQ2FsbFJvdXRpbmcoKSBubyB0ZWxlcGhvbnkgVFggZGV2aWNlIik7Ci0gICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IHR4U2lua0RldmljZURlc2MgPSBkZXZpY2VMaXN0Lml0ZW1BdCgwKTsKLSAgICAgICAgdHhTaW5rRGV2aWNlRGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNpbmtzWzBdKTsKKyAgICByZXR1cm4gbXV0ZVdhaXRNczsKK30KIAotICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRPdXRwdXRzRm9yRGV2aWNlKEFVRElPX0RFVklDRV9PVVRfVEVMRVBIT05ZX1RYLCBtT3V0cHV0cyk7Ci0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IHNlbGVjdE91dHB1dChvdXRwdXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9JTlZBTElEKTsKLSAgICAgICAgLy8gcmVxdWVzdCB0byByZXVzZSBleGlzdGluZyBvdXRwdXQgc3RyZWFtIGlmIG9uZSBpcyBhbHJlYWR5IG9wZW5lZCB0byByZWFjaCB0aGUgVFgKLSAgICAgICAgLy8gcGF0aCBvdXRwdXQgZGV2aWNlCi0gICAgICAgIGlmIChvdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7Ci0gICAgICAgICAgICBBTE9HX0FTU0VSVCghb3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAidXBkYXRlQ2FsbFJvdXRpbmcoKSBSWCBkZXZpY2Ugb3V0cHV0IGlzIGR1cGxpY2F0ZWQiKTsKLSAgICAgICAgICAgIG91dHB1dERlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC5zb3VyY2VzWzFdKTsKLSAgICAgICAgICAgIHBhdGNoLnNvdXJjZXNbMV0uZXh0Lm1peC51c2VjYXNlLnN0cmVhbSA9IEFVRElPX1NUUkVBTV9QQVRDSDsKLSAgICAgICAgICAgIHBhdGNoLm51bV9zb3VyY2VzID0gMjsKLSAgICAgICAgfQorc3A8QXVkaW9QYXRjaD4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjcmVhdGVUZWxlcGhvbnlQYXRjaCgKKyAgICAgICAgYm9vbCBpc1J4LCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCB1aW50MzJfdCBkZWxheU1zKSB7CisgICAgc3RydWN0IGF1ZGlvX3BhdGNoIHBhdGNoOworICAgIHBhdGNoLm51bV9zb3VyY2VzID0gMTsKKyAgICBwYXRjaC5udW1fc2lua3MgPSAxOwogCisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gdHhTb3VyY2VEZXZpY2VEZXNjOworICAgIGlmIChpc1J4KSB7CisgICAgICAgIGZpbGxBdWRpb1BvcnRDb25maWdGb3JEZXZpY2UobUF2YWlsYWJsZU91dHB1dERldmljZXMsIGRldmljZSwgJnBhdGNoLnNpbmtzWzBdKTsKKyAgICAgICAgZmlsbEF1ZGlvUG9ydENvbmZpZ0ZvckRldmljZSgKKyAgICAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLCBBVURJT19ERVZJQ0VfSU5fVEVMRVBIT05ZX1JYLCAmcGF0Y2guc291cmNlc1swXSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdHhTb3VyY2VEZXZpY2VEZXNjID0gZmlsbEF1ZGlvUG9ydENvbmZpZ0ZvckRldmljZSgKKyAgICAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLCBkZXZpY2UsICZwYXRjaC5zb3VyY2VzWzBdKTsKKyAgICAgICAgZmlsbEF1ZGlvUG9ydENvbmZpZ0ZvckRldmljZSgKKyAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgQVVESU9fREVWSUNFX09VVF9URUxFUEhPTllfVFgsICZwYXRjaC5zaW5rc1swXSk7CisgICAgfQorCisgICAgYXVkaW9fZGV2aWNlc190IG91dHB1dERldmljZSA9IGlzUnggPyBkZXZpY2UgOiBBVURJT19ERVZJQ0VfT1VUX1RFTEVQSE9OWV9UWDsKKyAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlKG91dHB1dERldmljZSwgbU91dHB1dHMpOworICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IHNlbGVjdE91dHB1dChvdXRwdXRzLCBBVURJT19PVVRQVVRfRkxBR19OT05FLCBBVURJT19GT1JNQVRfSU5WQUxJRCk7CisgICAgLy8gcmVxdWVzdCB0byByZXVzZSBleGlzdGluZyBvdXRwdXQgc3RyZWFtIGlmIG9uZSBpcyBhbHJlYWR5IG9wZW5lZCB0byByZWFjaCB0aGUgdGFyZ2V0IGRldmljZQorICAgIGlmIChvdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKKyAgICAgICAgQUxPR19BU1NFUlQoIW91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpLAorICAgICAgICAgICAgICAgICIlcygpICUjeCBkZXZpY2Ugb3V0cHV0ICVkIGlzIGR1cGxpY2F0ZWQiLCBfX2Z1bmNfXywgb3V0cHV0RGV2aWNlLCBvdXRwdXQpOworICAgICAgICBvdXRwdXREZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2guc291cmNlc1sxXSk7CisgICAgICAgIHBhdGNoLnNvdXJjZXNbMV0uZXh0Lm1peC51c2VjYXNlLnN0cmVhbSA9IEFVRElPX1NUUkVBTV9QQVRDSDsKKyAgICAgICAgcGF0Y2gubnVtX3NvdXJjZXMgPSAyOworICAgIH0KKworICAgIGlmICghaXNSeCkgewogICAgICAgICAvLyB0ZXJtaW5hdGUgYWN0aXZlIGNhcHR1cmUgaWYgb24gdGhlIHNhbWUgSFcgbW9kdWxlIGFzIHRoZSBjYWxsIFRYIHNvdXJjZSBkZXZpY2UKICAgICAgICAgLy8gRklYTUU6IHdvdWxkIGJlIGJldHRlciB0byByZWZpbmUgdG8gb25seSBpbnB1dHMgd2hvc2UgcHJvZmlsZSBjb25uZWN0cyB0byB0aGUKICAgICAgICAgLy8gY2FsbCBUWCBkZXZpY2UgYnV0IHRoaXMgaW5mb3JtYXRpb24gaXMgbm90IGluIHRoZSBhdWRpbyBwYXRjaCBhbmQgbG9naWMgaGVyZSBtdXN0IGJlCiAgICAgICAgIC8vIHN5bW1ldHJpYyB0byB0aGUgb25lIGluIHN0YXJ0SW5wdXQoKQotICAgICAgICBWZWN0b3I8c3AgPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiA+IGFjdGl2ZUlucHV0cyA9IG1JbnB1dHMuZ2V0QWN0aXZlSW5wdXRzKCk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYWN0aXZlSW5wdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gYWN0aXZlRGVzYyA9IGFjdGl2ZUlucHV0c1tpXTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBhY3RpdmVEZXNjIDogbUlucHV0cy5nZXRBY3RpdmVJbnB1dHMoKSkgewogICAgICAgICAgICAgaWYgKGFjdGl2ZURlc2MtPmhhc1NhbWVId01vZHVsZUFzKHR4U291cmNlRGV2aWNlRGVzYykpIHsKICAgICAgICAgICAgICAgICBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uIGFjdGl2ZVNlc3Npb25zID0KICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZURlc2MtPmdldEF1ZGlvU2Vzc2lvbnModHJ1ZSAvKmFjdGl2ZU9ubHkqLyk7CkBAIC01MTIsMTkgKzQ3NCwyOSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotCi0gICAgICAgIGFmUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKLSAgICAgICAgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPmNyZWF0ZUF1ZGlvUGF0Y2goJnBhdGNoLCAmYWZQYXRjaEhhbmRsZSwgZGVsYXlNcyk7Ci0gICAgICAgIEFMT0dXX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwgInNldFBob25lU3RhdGUoKSBlcnJvciAlZCBjcmVhdGluZyBUWCBhdWRpbyBwYXRjaCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIG1DYWxsVHhQYXRjaCA9IG5ldyBBdWRpb1BhdGNoKCZwYXRjaCwgbVVpZENhY2hlZCk7Ci0gICAgICAgICAgICBtQ2FsbFR4UGF0Y2gtPm1BZlBhdGNoSGFuZGxlID0gYWZQYXRjaEhhbmRsZTsKLSAgICAgICAgICAgIG1DYWxsVHhQYXRjaC0+bVVpZCA9IG1VaWRDYWNoZWQ7Ci0gICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gbXV0ZVdhaXRNczsKKyAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBhZlBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPmNyZWF0ZUF1ZGlvUGF0Y2goJnBhdGNoLCAmYWZQYXRjaEhhbmRsZSwgZGVsYXlNcyk7CisgICAgQUxPR1dfSUYoc3RhdHVzICE9IE5PX0VSUk9SLAorICAgICAgICAgICAgIiVzKCkgZXJyb3IgJWQgY3JlYXRpbmcgJXMgYXVkaW8gcGF0Y2giLCBfX2Z1bmNfXywgc3RhdHVzLCBpc1J4ID8gIlJYIiA6ICJUWCIpOworICAgIHNwPEF1ZGlvUGF0Y2g+IGF1ZGlvUGF0Y2g7CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICBhdWRpb1BhdGNoID0gbmV3IEF1ZGlvUGF0Y2goJnBhdGNoLCBtVWlkQ2FjaGVkKTsKKyAgICAgICAgYXVkaW9QYXRjaC0+bUFmUGF0Y2hIYW5kbGUgPSBhZlBhdGNoSGFuZGxlOworICAgICAgICBhdWRpb1BhdGNoLT5tVWlkID0gbVVpZENhY2hlZDsKKyAgICB9CisgICAgcmV0dXJuIGF1ZGlvUGF0Y2g7Cit9CisKK3NwPERldmljZURlc2NyaXB0b3I+IEF1ZGlvUG9saWN5TWFuYWdlcjo6ZmlsbEF1ZGlvUG9ydENvbmZpZ0ZvckRldmljZSgKKyAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yJiBkZXZpY2VzLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKSB7CisgICAgRGV2aWNlVmVjdG9yIGRldmljZUxpc3QgPSBkZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShkZXZpY2UpOworICAgIEFMT0dfQVNTRVJUKCFkZXZpY2VMaXN0LmlzRW1wdHkoKSwKKyAgICAgICAgICAgICIlcygpIHNlbGVjdGVkIGRldmljZSB0eXBlICUjeCBpcyBub3QgaW4gZGV2aWNlcyBsaXN0IiwgX19mdW5jX18sIGRldmljZSk7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlRGVzYyA9IGRldmljZUxpc3QuaXRlbUF0KDApOworICAgIGRldmljZURlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKGNvbmZpZyk7CisgICAgcmV0dXJuIGRldmljZURlc2M7CiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSkKQEAgLTY4Myw5ICs2NTUsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgVmVjdG9yPHNwIDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gPiBhY3RpdmVJbnB1dHMgPSBtSW5wdXRzLmdldEFjdGl2ZUlucHV0cygpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYWN0aXZlSW5wdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBhY3RpdmVEZXNjID0gYWN0aXZlSW5wdXRzW2ldOworICAgIGZvciAoY29uc3QgYXV0byYgYWN0aXZlRGVzYyA6IG1JbnB1dHMuZ2V0QWN0aXZlSW5wdXRzKCkpIHsKICAgICAgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZSA9IGdldE5ld0lucHV0RGV2aWNlKGFjdGl2ZURlc2MpOwogICAgICAgICAvLyBGb3JjZSBuZXcgaW5wdXQgc2VsZWN0aW9uIGlmIHRoZSBuZXcgZGV2aWNlIGNhbiBub3QgYmUgcmVhY2hlZCB2aWEgY3VycmVudCBpbnB1dAogICAgICAgICBpZiAoYWN0aXZlRGVzYy0+bVByb2ZpbGUtPmdldFN1cHBvcnRlZERldmljZXMoKS50eXBlcygpICYKQEAgLTcyMSwxMiArNjkxLDggQEAKIAogICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZTsKIAotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUh3TW9kdWxlcy5zaXplKCk7IGkrKykgewotICAgICAgICBpZiAobUh3TW9kdWxlc1tpXS0+bUhhbmRsZSA9PSAwKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1Id01vZHVsZXNbaV0tPm1PdXRwdXRQcm9maWxlcy5zaXplKCk7IGorKykgewotICAgICAgICAgICAgc3A8SU9Qcm9maWxlPiBjdXJQcm9maWxlID0gbUh3TW9kdWxlc1tpXS0+bU91dHB1dFByb2ZpbGVzW2pdOworICAgIGZvciAoY29uc3QgYXV0byYgaHdNb2R1bGUgOiBtSHdNb2R1bGVzKSB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgY3VyUHJvZmlsZSA6IGh3TW9kdWxlLT5nZXRPdXRwdXRQcm9maWxlcygpKSB7CiAgICAgICAgICAgICBpZiAoIWN1clByb2ZpbGUtPmlzQ29tcGF0aWJsZVByb2ZpbGUoZGV2aWNlLCBTdHJpbmc4KCIiKSwKICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlLCBOVUxMIC8qdXBkYXRlZFNhbXBsaW5nUmF0ZSovLAogICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIE5VTEwgLyp1cGRhdGVkRm9ybWF0Ki8sCkBAIC04MjcsMTIgKzc5Myw3IEBACiAgICAgLy8gRXhwbGljaXQgcm91dGluZz8KICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjOwogICAgIGlmICgqc2VsZWN0ZWREZXZpY2VJZCAhPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF2YWlsYWJsZU91dHB1dERldmljZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpXS0+Z2V0SWQoKSA9PSAqc2VsZWN0ZWREZXZpY2VJZCkgewotICAgICAgICAgICAgICAgIGRldmljZURlc2MgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpXTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBkZXZpY2VEZXNjID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlRnJvbUlkKCpzZWxlY3RlZERldmljZUlkKTsKICAgICB9CiAgICAgbU91dHB1dFJvdXRlcy5hZGRSb3V0ZShzZXNzaW9uLCAqc3RyZWFtLCBTZXNzaW9uUm91dGU6OlNPVVJDRV9UWVBFX05BLCBkZXZpY2VEZXNjLCB1aWQpOwogCkBAIC05NDksNyArOTEwLDEyIEBACiAKICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPQogICAgICAgICAgICAgICAgIG5ldyBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcihwcm9maWxlLCBtcENsaWVudEludGVyZmFjZSk7Ci0gICAgICAgIHN0YXR1cyA9IG91dHB1dERlc2MtPm9wZW4oY29uZmlnLCBkZXZpY2UsIFN0cmluZzgoIiIpLCBzdHJlYW0sIGZsYWdzLCAmb3V0cHV0KTsKKworICAgICAgICBEZXZpY2VWZWN0b3Igb3V0cHV0RGV2aWNlcyA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShkZXZpY2UpOworICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBvdXRwdXREZXZpY2VzLnNpemUoKSA+IDAgPyBvdXRwdXREZXZpY2VzLml0ZW1BdCgwKS0+bUFkZHJlc3MKKyAgICAgICAgICAgICAgICA6IFN0cmluZzgoIiIpOworCisgICAgICAgIHN0YXR1cyA9IG91dHB1dERlc2MtPm9wZW4oY29uZmlnLCBkZXZpY2UsIGFkZHJlc3MsIHN0cmVhbSwgZmxhZ3MsICZvdXRwdXQpOwogCiAgICAgICAgIC8vIG9ubHkgYWNjZXB0IGFuIG91dHB1dCB3aXRoIHRoZSByZXF1ZXN0ZWQgcGFyYW1ldGVycwogICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SIHx8CkBAIC0xMDI1LDIxICs5OTEsMjEgQEAKICAgICAvLyA0OiB0aGUgZmlyc3Qgb3V0cHV0IGluIHRoZSBsaXN0CiAKICAgICBpZiAob3V0cHV0cy5zaXplKCkgPT0gMCkgewotICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIEFVRElPX0lPX0hBTkRMRV9OT05FOwogICAgIH0KICAgICBpZiAob3V0cHV0cy5zaXplKCkgPT0gMSkgewogICAgICAgICByZXR1cm4gb3V0cHV0c1swXTsKICAgICB9CiAKICAgICBpbnQgbWF4Q29tbW9uRmxhZ3MgPSAwOwotICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dEZvckZsYWdzID0gMDsKLSAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXRGb3JQcmltYXJ5ID0gMDsKLSAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXRGb3JGb3JtYXQgPSAwOworICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dEZvckZsYWdzID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0Rm9yUHJpbWFyeSA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dEZvckZvcm1hdCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwogICAgIGF1ZGlvX2Zvcm1hdF90IGJlc3RGb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsKICAgICBhdWRpb19mb3JtYXRfdCBiZXN0Rm9ybWF0Rm9yRmxhZ3MgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsKIAotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0cHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dHNbaV0pOworICAgIGZvciAoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0IDogb3V0cHV0cykgeworICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7CiAgICAgICAgIGlmICghb3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCkpIHsKICAgICAgICAgICAgIC8vIGlmIGEgdmFsaWQgZm9ybWF0IGlzIHNwZWNpZmllZCwgc2tpcCBvdXRwdXQgaWYgbm90IGNvbXBhdGlibGUKICAgICAgICAgICAgIGlmIChmb3JtYXQgIT0gQVVESU9fRk9STUFUX0lOVkFMSUQpIHsKQEAgLTEwNTIsNyArMTAxOCw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChBdWRpb1BvcnQ6OmlzQmV0dGVyRm9ybWF0TWF0Y2goCiAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRm9ybWF0LCBiZXN0Rm9ybWF0LCBmb3JtYXQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG91dHB1dEZvckZvcm1hdCA9IG91dHB1dHNbaV07CisgICAgICAgICAgICAgICAgICAgIG91dHB1dEZvckZvcm1hdCA9IG91dHB1dDsKICAgICAgICAgICAgICAgICAgICAgYmVzdEZvcm1hdCA9IG91dHB1dERlc2MtPm1Gb3JtYXQ7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMTA2MywyOSArMTAyOSwyOSBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9JTlZBTElECiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgQXVkaW9Qb3J0Ojppc0JldHRlckZvcm1hdE1hdGNoKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUZvcm1hdCwgYmVzdEZvcm1hdEZvckZsYWdzLCBmb3JtYXQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRGb3JGbGFncyA9IG91dHB1dHNbaV07CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRGb3JGbGFncyA9IG91dHB1dDsKICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RGb3JtYXRGb3JGbGFncyA9IG91dHB1dERlc2MtPm1Gb3JtYXQ7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBvdXRwdXRGb3JGbGFncyA9IG91dHB1dHNbaV07CisgICAgICAgICAgICAgICAgICAgIG91dHB1dEZvckZsYWdzID0gb3V0cHV0OwogICAgICAgICAgICAgICAgICAgICBtYXhDb21tb25GbGFncyA9IGNvbW1vbkZsYWdzOwogICAgICAgICAgICAgICAgICAgICBiZXN0Rm9ybWF0Rm9yRmxhZ3MgPSBvdXRwdXREZXNjLT5tRm9ybWF0OwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBBTE9HVigic2VsZWN0T3V0cHV0KCkgY29tbW9uRmxhZ3MgZm9yIG91dHB1dCAlZCwgJTA0eCIsIG91dHB1dHNbaV0sIGNvbW1vbkZsYWdzKTsKKyAgICAgICAgICAgICAgICBBTE9HVigic2VsZWN0T3V0cHV0KCkgY29tbW9uRmxhZ3MgZm9yIG91dHB1dCAlZCwgJTA0eCIsIG91dHB1dCwgY29tbW9uRmxhZ3MpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPm1Qcm9maWxlLT5nZXRGbGFncygpICYgQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWSkgewotICAgICAgICAgICAgICAgIG91dHB1dEZvclByaW1hcnkgPSBvdXRwdXRzW2ldOworICAgICAgICAgICAgICAgIG91dHB1dEZvclByaW1hcnkgPSBvdXRwdXQ7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAob3V0cHV0Rm9yRmxhZ3MgIT0gMCkgeworICAgIGlmIChvdXRwdXRGb3JGbGFncyAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICByZXR1cm4gb3V0cHV0Rm9yRmxhZ3M7CiAgICAgfQotICAgIGlmIChvdXRwdXRGb3JGb3JtYXQgIT0gMCkgeworICAgIGlmIChvdXRwdXRGb3JGb3JtYXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKICAgICAgICAgcmV0dXJuIG91dHB1dEZvckZvcm1hdDsKICAgICB9Ci0gICAgaWYgKG91dHB1dEZvclByaW1hcnkgIT0gMCkgeworICAgIGlmIChvdXRwdXRGb3JQcmltYXJ5ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CiAgICAgICAgIHJldHVybiBvdXRwdXRGb3JQcmltYXJ5OwogICAgIH0KIApAQCAtMTEwNiwxMSArMTA3Miw5IEBACiAKICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaW5kZXgpOwogCi0gICAgaWYgKCFvdXRwdXREZXNjLT5pc0FjdGl2ZSgpKSB7Ci0gICAgICAgIGlmICghb3V0cHV0RGVzYy0+bVByb2ZpbGUtPmNhblN0YXJ0TmV3SW8oKSkgewotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICB9Ci0gICAgICAgIG91dHB1dERlc2MtPm1Qcm9maWxlLT5jdXJBY3RpdmVDb3VudCsrOworICAgIHN0YXR1c190IHN0YXR1cyA9IG91dHB1dERlc2MtPnN0YXJ0KCk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KIAogICAgIC8vIFJvdXRpbmc/CkBAIC0xMTM2LDE2ICsxMTAwLDExIEBACiAKICAgICB1aW50MzJfdCBkZWxheU1zID0gMDsKIAotICAgIHN0YXR1c190IHN0YXR1cyA9IHN0YXJ0U291cmNlKG91dHB1dERlc2MsIHN0cmVhbSwgbmV3RGV2aWNlLCBhZGRyZXNzLCAmZGVsYXlNcyk7CisgICAgc3RhdHVzID0gc3RhcnRTb3VyY2Uob3V0cHV0RGVzYywgc3RyZWFtLCBuZXdEZXZpY2UsIGFkZHJlc3MsICZkZWxheU1zKTsKIAogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgbU91dHB1dFJvdXRlcy5kZWNSb3V0ZUFjdGl2aXR5KHNlc3Npb24pOwotICAgICAgICBpZiAoIW91dHB1dERlc2MtPmlzQWN0aXZlKCkpIHsKLSAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYob3V0cHV0RGVzYy0+bVByb2ZpbGUtPmN1ckFjdGl2ZUNvdW50IDwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIGludmFsaWQgcHJvZmlsZSBhY3RpdmUgY291bnQgJXUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG91dHB1dERlc2MtPm1Qcm9maWxlLT5jdXJBY3RpdmVDb3VudCk7Ci0gICAgICAgICAgICBvdXRwdXREZXNjLT5tUHJvZmlsZS0+Y3VyQWN0aXZlQ291bnQtLTsKLSAgICAgICAgfQorICAgICAgICBvdXRwdXREZXNjLT5zdG9wKCk7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogICAgIC8vIEF1dG9tYXRpY2FsbHkgZW5hYmxlIHRoZSByZW1vdGUgc3VibWl4IGlucHV0IHdoZW4gb3V0cHV0IGlzIHN0YXJ0ZWQgb24gYSByZSByb3V0aW5nIG1peApAQCAtMTMzNiwxMSArMTI5NSw4IEBACiAKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdG9wU291cmNlKG91dHB1dERlc2MsIHN0cmVhbSwgZm9yY2VEZXZpY2VVcGRhdGUpOwogCi0gICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUiAmJiAhb3V0cHV0RGVzYy0+aXNBY3RpdmUoKSkgewotICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG91dHB1dERlc2MtPm1Qcm9maWxlLT5jdXJBY3RpdmVDb3VudCA8IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIGludmFsaWQgcHJvZmlsZSBhY3RpdmUgY291bnQgJXUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgb3V0cHV0RGVzYy0+bVByb2ZpbGUtPmN1ckFjdGl2ZUNvdW50KTsKLSAgICAgICAgb3V0cHV0RGVzYy0+bVByb2ZpbGUtPmN1ckFjdGl2ZUNvdW50LS07CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUiApIHsKKyAgICAgICAgb3V0cHV0RGVzYy0+c3RvcCgpOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQpAQCAtMTQ2NCwxMiArMTQyMCw3IEBACiAgICAgLy8gRXhwbGljaXQgcm91dGluZz8KICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjOwogICAgIGlmICgqc2VsZWN0ZWREZXZpY2VJZCAhPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgaWYgKG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPmdldElkKCkgPT0gKnNlbGVjdGVkRGV2aWNlSWQpIHsKLSAgICAgICAgICAgICAgICBkZXZpY2VEZXNjID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBkZXZpY2VEZXNjID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlRnJvbUlkKCpzZWxlY3RlZERldmljZUlkKTsKICAgICB9CiAgICAgbUlucHV0Um91dGVzLmFkZFJvdXRlKHNlc3Npb24sIFNlc3Npb25Sb3V0ZTo6U1RSRUFNX1RZUEVfTkEsIGlucHV0U291cmNlLCBkZXZpY2VEZXNjLCB1aWQpOwogCkBAIC0xNzM5LDYgKzE2OTAsMTIgQEAKICAgICBsQ29uZmlnLmNoYW5uZWxfbWFzayA9IHByb2ZpbGVDaGFubmVsTWFzazsKICAgICBsQ29uZmlnLmZvcm1hdCA9IHByb2ZpbGVGb3JtYXQ7CiAKKyAgICBpZiAoYWRkcmVzcyA9PSAiIikgeworICAgICAgICBEZXZpY2VWZWN0b3IgaW5wdXREZXZpY2VzID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoZGV2aWNlKTsKKyAgICAgICAgLy8gdGhlIGlucHV0cyB2ZWN0b3IgbXVzdCBiZSBvZiBzaXplID49IDEsIGJ1dCB3ZSBkb24ndCB3YW50IHRvIGNyYXNoIGhlcmUKKyAgICAgICAgYWRkcmVzcyA9IGlucHV0RGV2aWNlcy5zaXplKCkgPiAwID8gaW5wdXREZXZpY2VzLml0ZW1BdCgwKS0+bUFkZHJlc3MgOiBTdHJpbmc4KCIiKTsKKyAgICB9CisKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBpbnB1dERlc2MtPm9wZW4oJmxDb25maWcsIGRldmljZSwgYWRkcmVzcywKICAgICAgICAgICAgIGhhbElucHV0U291cmNlLCBwcm9maWxlRmxhZ3MsICZpbnB1dCk7CiAKQEAgLTE3OTYsOSArMTc1Myw3IEBACiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAotICAgIFZlY3Rvcjwgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+ID4gYWN0aXZlSW5wdXRzID0gbUlucHV0cy5nZXRBY3RpdmVJbnB1dHMoKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8ICBhY3RpdmVJbnB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGFjdGl2ZUlucHV0ID0gYWN0aXZlSW5wdXRzW2ldOworICAgIGZvciAoY29uc3QgYXV0byYgYWN0aXZlSW5wdXQgOiBtSW5wdXRzLmdldEFjdGl2ZUlucHV0cygpKSB7CiAgICAgICAgIGlmICghaXNDb25jdXJyZW50U291cmNlKGFjdGl2ZUlucHV0LT5pbnB1dFNvdXJjZSh0cnVlKSkgJiYKICAgICAgICAgICAgICAgICAhaXNfdmlydHVhbF9pbnB1dF9kZXZpY2UoYWN0aXZlSW5wdXQtPm1EZXZpY2UpKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0xODg0LDkgKzE4MzksNyBAQAogICAgICAgICB9CiAKICAgICAgICAgVmVjdG9yPCBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gPiBhY3RpdmVJbnB1dHMgPSBtSW5wdXRzLmdldEFjdGl2ZUlucHV0cygpOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFjdGl2ZUlucHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGFjdGl2ZURlc2MgPSBhY3RpdmVJbnB1dHNbaV07Ci0KKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBhY3RpdmVEZXNjIDogYWN0aXZlSW5wdXRzKSB7CiAgICAgICAgICAgICBpZiAoaXNfdmlydHVhbF9pbnB1dF9kZXZpY2UoYWN0aXZlRGVzYy0+bURldmljZSkpIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KQEAgLTE5MjYsOSArMTg3OSw3IEBACiAgICAgICAgICAgICBpbnB1dERlc2MtPmlzU291bmRUcmlnZ2VyKCkgPyBzb3VuZFRyaWdnZXJTdXBwb3J0c0NvbmN1cnJlbnRDYXB0dXJlKCkgOiBmYWxzZTsKIAogICAgICAgICAvLyBpZiBjYXB0dXJlIGlzIGFsbG93ZWQsIHByZWVtcHQgY3VycmVudGx5IGFjdGl2ZSBIT1RXT1JEIGNhcHR1cmVzCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYWN0aXZlSW5wdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gYWN0aXZlRGVzYyA9IGFjdGl2ZUlucHV0c1tpXTsKLQorICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGFjdGl2ZURlc2MgOiBhY3RpdmVJbnB1dHMpIHsKICAgICAgICAgICAgIGlmIChpc192aXJ0dWFsX2lucHV0X2RldmljZShhY3RpdmVEZXNjLT5tRGV2aWNlKSkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQpAQCAtMTk2OCwxNCArMTkxOSwxNCBAQAogICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gZ2V0TmV3SW5wdXREZXZpY2UoaW5wdXREZXNjKTsKICAgICAgICAgc2V0SW5wdXREZXZpY2UoaW5wdXQsIGRldmljZSwgdHJ1ZSAvKiBmb3JjZSAqLyk7CiAKLSAgICAgICAgaWYgKGlucHV0RGVzYy0+Z2V0QXVkaW9TZXNzaW9uQ291bnQodHJ1ZS8qYWN0aXZlT25seSovKSA9PSAxKSB7Ci0gICAgICAgICAgICBpZiAoIWlucHV0RGVzYy0+bVByb2ZpbGUtPmNhblN0YXJ0TmV3SW8oKSkgewotICAgICAgICAgICAgICAgIG1JbnB1dFJvdXRlcy5kZWNSb3V0ZUFjdGl2aXR5KHNlc3Npb24pOwotICAgICAgICAgICAgICAgIGF1ZGlvU2Vzc2lvbi0+Y2hhbmdlQWN0aXZlQ291bnQoLTEpOwotICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlucHV0RGVzYy0+bVByb2ZpbGUtPmN1ckFjdGl2ZUNvdW50Kys7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGlucHV0RGVzYy0+c3RhcnQoKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgbUlucHV0Um91dGVzLmRlY1JvdXRlQWN0aXZpdHkoc2Vzc2lvbik7CisgICAgICAgICAgICBhdWRpb1Nlc3Npb24tPmNoYW5nZUFjdGl2ZUNvdW50KC0xKTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KIAorICAgICAgICBpZiAoaW5wdXREZXNjLT5nZXRBdWRpb1Nlc3Npb25Db3VudCh0cnVlLyphY3RpdmVPbmx5Ki8pID09IDEpIHsKICAgICAgICAgICAgIC8vIGlmIGlucHV0IG1hcHMgdG8gYSBkeW5hbWljIHBvbGljeSB3aXRoIGFuIGFjdGl2aXR5IGxpc3RlbmVyLCBub3RpZnkgb2Ygc3RhdGUgY2hhbmdlCiAgICAgICAgICAgICBpZiAoKGlucHV0RGVzYy0+bVBvbGljeU1peCAhPSBOVUxMKQogICAgICAgICAgICAgICAgICAgICAmJiAoKGlucHV0RGVzYy0+bVBvbGljeU1peC0+bUNiRmxhZ3MgJiBBdWRpb01peDo6a0NiRmxhZ05vdGlmeUFjdGl2aXR5KSAhPSAwKSkgewpAQCAtMjA0MSwxNSArMTk5MiwxMCBAQAogICAgIG1JbnB1dFJvdXRlcy5kZWNSb3V0ZUFjdGl2aXR5KHNlc3Npb24pOwogCiAgICAgaWYgKGF1ZGlvU2Vzc2lvbi0+YWN0aXZlQ291bnQoKSA9PSAwKSB7Ci0KKyAgICAgICAgaW5wdXREZXNjLT5zdG9wKCk7CiAgICAgICAgIGlmIChpbnB1dERlc2MtPmlzQWN0aXZlKCkpIHsKICAgICAgICAgICAgIHNldElucHV0RGV2aWNlKGlucHV0LCBnZXROZXdJbnB1dERldmljZShpbnB1dERlc2MpLCBmYWxzZSAvKiBmb3JjZSAqLyk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGlucHV0RGVzYy0+bVByb2ZpbGUtPmN1ckFjdGl2ZUNvdW50IDwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIGludmFsaWQgcHJvZmlsZSBhY3RpdmUgY291bnQgJXUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlucHV0RGVzYy0+bVByb2ZpbGUtPmN1ckFjdGl2ZUNvdW50KTsKLSAgICAgICAgICAgIGlucHV0RGVzYy0+bVByb2ZpbGUtPmN1ckFjdGl2ZUNvdW50LS07Ci0KICAgICAgICAgICAgIC8vIGlmIGlucHV0IG1hcHMgdG8gYSBkeW5hbWljIHBvbGljeSB3aXRoIGFuIGFjdGl2aXR5IGxpc3RlbmVyLCBub3RpZnkgb2Ygc3RhdGUgY2hhbmdlCiAgICAgICAgICAgICBpZiAoKGlucHV0RGVzYy0+bVBvbGljeU1peCAhPSBOVUxMKQogICAgICAgICAgICAgICAgICAgICAmJiAoKGlucHV0RGVzYy0+bVBvbGljeU1peC0+bUNiRmxhZ3MgJiBBdWRpb01peDo6a0NiRmxhZ05vdGlmeUFjdGl2aXR5KSAhPSAwKSkgewpAQCAtMjEzNSw3ICsyMDgxLDcgQEAKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjbG9zZUFsbElucHV0cygpIHsKICAgICBib29sIHBhdGNoUmVtb3ZlZCA9IGZhbHNlOwogCi0gICAgZm9yKHNpemVfdCBpbnB1dF9pbmRleCA9IDA7IGlucHV0X2luZGV4IDwgbUlucHV0cy5zaXplKCk7IGlucHV0X2luZGV4KyspIHsKKyAgICBmb3IgKHNpemVfdCBpbnB1dF9pbmRleCA9IDA7IGlucHV0X2luZGV4IDwgbUlucHV0cy5zaXplKCk7IGlucHV0X2luZGV4KyspIHsKICAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVBdChpbnB1dF9pbmRleCk7CiAgICAgICAgIHNzaXplX3QgcGF0Y2hfaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoaW5wdXREZXNjLT5nZXRQYXRjaEhhbmRsZSgpKTsKICAgICAgICAgaWYgKHBhdGNoX2luZGV4ID49IDApIHsKQEAgLTIyOTksMjEgKzIyNDUsMjEgQEAKICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0RGVlcEJ1ZmZlciA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwogICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXRQcmltYXJ5ID0gQVVESU9fSU9fSEFORExFX05PTkU7CiAKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRwdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dHNbaV0pOworICAgICAgICBmb3IgKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA6IG91dHB1dHMpIHsKKyAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKICAgICAgICAgICAgIGlmIChhY3RpdmVPbmx5ICYmICFkZXNjLT5pc1N0cmVhbUFjdGl2ZShBVURJT19TVFJFQU1fTVVTSUMpKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigic2VsZWN0T3V0cHV0Rm9yTXVzaWNFZmZlY3RzIGFjdGl2ZU9ubHkgJWQgb3V0cHV0c1slenVdIGZsYWdzIDB4JTA4eCIsCi0gICAgICAgICAgICAgICAgICBhY3RpdmVPbmx5LCBpLCBkZXNjLT5tRmxhZ3MpOworICAgICAgICAgICAgQUxPR1YoInNlbGVjdE91dHB1dEZvck11c2ljRWZmZWN0cyBhY3RpdmVPbmx5ICVkIG91dHB1dCAlZCBmbGFncyAweCUwOHgiLAorICAgICAgICAgICAgICAgICAgYWN0aXZlT25seSwgb3V0cHV0LCBkZXNjLT5tRmxhZ3MpOwogICAgICAgICAgICAgaWYgKChkZXNjLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgb3V0cHV0T2ZmbG9hZGVkID0gb3V0cHV0c1tpXTsKKyAgICAgICAgICAgICAgICBvdXRwdXRPZmZsb2FkZWQgPSBvdXRwdXQ7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoKGRlc2MtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RFRVBfQlVGRkVSKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgb3V0cHV0RGVlcEJ1ZmZlciA9IG91dHB1dHNbaV07CisgICAgICAgICAgICAgICAgb3V0cHV0RGVlcEJ1ZmZlciA9IG91dHB1dDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICgoZGVzYy0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWSkgIT0gMCkgewotICAgICAgICAgICAgICAgIG91dHB1dFByaW1hcnkgPSBvdXRwdXRzW2ldOworICAgICAgICAgICAgICAgIG91dHB1dFByaW1hcnkgPSBvdXRwdXQ7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgKG91dHB1dE9mZmxvYWRlZCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewpAQCAtMjQyNCwyMyArMjM3MCwxNiBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgaWYgKChtaXhlc1tpXS5tUm91dGVGbGFncyAmIE1JWF9ST1VURV9GTEFHX0xPT1BfQkFDSykgPT0gTUlYX1JPVVRFX0ZMQUdfTE9PUF9CQUNLKSB7Ci0gICAgICAgICAgICAvLyBMb29wIGJhY2sgdGhyb3VnaCAicmVtb3RlIHN1Ym1peCIKLSAgICAgICAgICAgIGlmIChyU3VibWl4TW9kdWxlID09IDApIHsKLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaSA8IG1Id01vZHVsZXMuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmNtcChBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfUkVNT1RFX1NVQk1JWCwgbUh3TW9kdWxlc1tqXS0+bU5hbWUpID09IDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtSHdNb2R1bGVzW2pdLT5tSGFuZGxlICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJTdWJtaXhNb2R1bGUgPSBtSHdNb2R1bGVzW2pdOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KICAgICAgICAgICAgIEFMT0dWKCJyZWdpc3RlclBvbGljeU1peGVzKCkgbWl4ICV6dSBvZiAlenUgaXMgTE9PUF9CQUNLIiwgaSwgbWl4ZXMuc2l6ZSgpKTsKLQogICAgICAgICAgICAgaWYgKHJTdWJtaXhNb2R1bGUgPT0gMCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCIgVW5hYmxlIHRvIGZpbmQgYXVkaW8gbW9kdWxlIGZvciBzdWJtaXgsIGFib3J0aW5nIG1peCAlenUgcmVnaXN0cmF0aW9uIiwgaSk7Ci0gICAgICAgICAgICAgICAgcmVzID0gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgclN1Ym1peE1vZHVsZSA9IG1Id01vZHVsZXMuZ2V0TW9kdWxlRnJvbU5hbWUoCisgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfUkVNT1RFX1NVQk1JWCk7CisgICAgICAgICAgICAgICAgaWYgKHJTdWJtaXhNb2R1bGUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiIFVuYWJsZSB0byBmaW5kIGF1ZGlvIG1vZHVsZSBmb3Igc3VibWl4LCBhYm9ydGluZyBtaXggJXp1IHJlZ2lzdHJhdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSk7CisgICAgICAgICAgICAgICAgICAgIHJlcyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IG1peGVzW2ldLm1EZXZpY2VBZGRyZXNzOwpAQCAtMjUxOSwyNCArMjQ1OCwxOSBAQAogICAgIHN0YXR1c190IHJlcyA9IE5PX0VSUk9SOwogICAgIHNwPEh3TW9kdWxlPiByU3VibWl4TW9kdWxlOwogICAgIC8vIGV4YW1pbmUgZWFjaCBtaXgncyByb3V0ZSB0eXBlCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtaXhlcy5zaXplKCk7IGkrKykgewotICAgICAgICBpZiAoKG1peGVzW2ldLm1Sb3V0ZUZsYWdzICYgTUlYX1JPVVRFX0ZMQUdfTE9PUF9CQUNLKSA9PSBNSVhfUk9VVEVfRkxBR19MT09QX0JBQ0spIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIG1peCA6IG1peGVzKSB7CisgICAgICAgIGlmICgobWl4Lm1Sb3V0ZUZsYWdzICYgTUlYX1JPVVRFX0ZMQUdfTE9PUF9CQUNLKSA9PSBNSVhfUk9VVEVfRkxBR19MT09QX0JBQ0spIHsKIAogICAgICAgICAgICAgaWYgKHJTdWJtaXhNb2R1bGUgPT0gMCkgewotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBpIDwgbUh3TW9kdWxlcy5zaXplKCk7IGorKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3RyY21wKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9SRU1PVEVfU1VCTUlYLCBtSHdNb2R1bGVzW2pdLT5tTmFtZSkgPT0gMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG1Id01vZHVsZXNbal0tPm1IYW5kbGUgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgclN1Ym1peE1vZHVsZSA9IG1Id01vZHVsZXNbal07Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJTdWJtaXhNb2R1bGUgPSBtSHdNb2R1bGVzLmdldE1vZHVsZUZyb21OYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1JFTU9URV9TVUJNSVgpOworICAgICAgICAgICAgICAgIGlmIChyU3VibWl4TW9kdWxlID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyU3VibWl4TW9kdWxlID09IDApIHsKLSAgICAgICAgICAgICAgICByZXMgPSBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gbWl4ZXNbaV0ubURldmljZUFkZHJlc3M7CisgICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBtaXgubURldmljZUFkZHJlc3M7CiAKICAgICAgICAgICAgIGlmIChtUG9saWN5TWl4ZXMudW5yZWdpc3Rlck1peChhZGRyZXNzKSAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgIHJlcyA9IElOVkFMSURfT1BFUkFUSU9OOwpAQCAtMjU1OCw4ICsyNDkyLDggQEAKICAgICAgICAgICAgIHJTdWJtaXhNb2R1bGUtPnJlbW92ZU91dHB1dFByb2ZpbGUoYWRkcmVzcyk7CiAgICAgICAgICAgICByU3VibWl4TW9kdWxlLT5yZW1vdmVJbnB1dFByb2ZpbGUoYWRkcmVzcyk7CiAKLSAgICAgICAgfSBpZiAoKG1peGVzW2ldLm1Sb3V0ZUZsYWdzICYgTUlYX1JPVVRFX0ZMQUdfUkVOREVSKSA9PSBNSVhfUk9VVEVfRkxBR19SRU5ERVIpIHsKLSAgICAgICAgICAgIGlmIChtUG9saWN5TWl4ZXMudW5yZWdpc3Rlck1peChtaXhlc1tpXS5tRGV2aWNlQWRkcmVzcykgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgfSBpZiAoKG1peC5tUm91dGVGbGFncyAmIE1JWF9ST1VURV9GTEFHX1JFTkRFUikgPT0gTUlYX1JPVVRFX0ZMQUdfUkVOREVSKSB7CisgICAgICAgICAgICBpZiAobVBvbGljeU1peGVzLnVucmVnaXN0ZXJNaXgobWl4Lm1EZXZpY2VBZGRyZXNzKSAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgIHJlcyA9IElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQpAQCAtMjYxMSw3ICsyNTQ1LDcgQEAKIAogICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmR1bXAoZmQsIFN0cmluZzgoIkF2YWlsYWJsZSBvdXRwdXQiKSk7CiAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5kdW1wKGZkLCBTdHJpbmc4KCJBdmFpbGFibGUgaW5wdXQiKSk7Ci0gICAgbUh3TW9kdWxlcy5kdW1wKGZkKTsKKyAgICBtSHdNb2R1bGVzQWxsLmR1bXAoZmQpOwogICAgIG1PdXRwdXRzLmR1bXAoZmQpOwogICAgIG1JbnB1dHMuZHVtcChmZCk7CiAgICAgbVZvbHVtZUN1cnZlcy0+ZHVtcChmZCk7CkBAIC0yNzE2LDIzICsyNjUwLDIzIEBACiAgICAgICAgIC8vIGRvIG5vdCByZXBvcnQgZGV2aWNlcyB3aXRoIHR5cGUgQVVESU9fREVWSUNFX0lOX1NUVUIgb3IgQVVESU9fREVWSUNFX09VVF9TVFVCCiAgICAgICAgIC8vIGFzIHRoZXkgYXJlIHVzZWQgYnkgc3R1YiBIQUxzIGJ5IGNvbnZlbnRpb24KICAgICAgICAgaWYgKHJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NJTksgfHwgcm9sZSA9PSBBVURJT19QT1JUX1JPTEVfTk9ORSkgewotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpXS0+dHlwZSgpID09IEFVRElPX0RFVklDRV9PVVRfU1RVQikgeworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBkZXYgOiBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcykgeworICAgICAgICAgICAgICAgIGlmIChkZXYtPnR5cGUoKSA9PSBBVURJT19ERVZJQ0VfT1VUX1NUVUIpIHsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChwb3J0c1dyaXR0ZW4gPCBwb3J0c01heCkgewotICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpXS0+dG9BdWRpb1BvcnQoJnBvcnRzW3BvcnRzV3JpdHRlbisrXSk7CisgICAgICAgICAgICAgICAgICAgIGRldi0+dG9BdWRpb1BvcnQoJnBvcnRzW3BvcnRzV3JpdHRlbisrXSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICgqbnVtX3BvcnRzKSsrOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIChyb2xlID09IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UgfHwgcm9sZSA9PSBBVURJT19QT1JUX1JPTEVfTk9ORSkgewotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPnR5cGUoKSA9PSBBVURJT19ERVZJQ0VfSU5fU1RVQikgeworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBkZXYgOiBtQXZhaWxhYmxlSW5wdXREZXZpY2VzKSB7CisgICAgICAgICAgICAgICAgaWYgKGRldi0+dHlwZSgpID09IEFVRElPX0RFVklDRV9JTl9TVFVCKSB7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAocG9ydHNXcml0dGVuIDwgcG9ydHNNYXgpIHsKLSAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXS0+dG9BdWRpb1BvcnQoJnBvcnRzW3BvcnRzV3JpdHRlbisrXSk7CisgICAgICAgICAgICAgICAgICAgIGRldi0+dG9BdWRpb1BvcnQoJnBvcnRzW3BvcnRzV3JpdHRlbisrXSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICgqbnVtX3BvcnRzKSsrOwogICAgICAgICAgICAgfQpAQCAtMzIyNyw4ICszMTYxLDggQEAKICAgICAgICAgfQogICAgIH0KICAgICAvLyByZXJvdXRlIG91dHB1dHMgaWYgbmVjZXNzYXJ5Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhZmZlY3RlZFN0cmF0ZWdpZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgY2hlY2tTdHJhdGVneVJvdXRlKGFmZmVjdGVkU3RyYXRlZ2llc1tpXSwgQVVESU9fSU9fSEFORExFX05PTkUpOworICAgIGZvciAoY29uc3QgYXV0byYgc3RyYXRlZ3kgOiBhZmZlY3RlZFN0cmF0ZWdpZXMpIHsKKyAgICAgICAgY2hlY2tTdHJhdGVneVJvdXRlKHN0cmF0ZWd5LCBBVURJT19JT19IQU5ETEVfTk9ORSk7CiAgICAgfQogCiAgICAgLy8gcmVtb3ZlIGlucHV0IHJvdXRlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyB1aWQKQEAgLTMyNTAsOCArMzE4NCw4IEBACiAgICAgICAgICAgICBpbnB1dHNUb0Nsb3NlLmFkZChpbnB1dERlc2MtPm1Jb0hhbmRsZSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbnB1dHNUb0Nsb3NlLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGNsb3NlSW5wdXQoaW5wdXRzVG9DbG9zZVtpXSk7CisgICAgZm9yIChjb25zdCBhdXRvJiBpbnB1dCA6IGlucHV0c1RvQ2xvc2UpIHsKKyAgICAgICAgY2xvc2VJbnB1dChpbnB1dCk7CiAgICAgfQogfQogCkBAIC0zMzU0LDYgKzMyODgsMTEgQEAKICAgICAgICAgICAgIEFMT0dWKCIlcyBvdXRwdXQgZm9yIGRldmljZSAlMDh4IGlzIGR1cGxpY2F0ZWQiLCBfX0ZVTkNUSU9OX18sIHNpbmtEZXZpY2UpOwogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICB9CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG91dHB1dERlc2MtPnN0YXJ0KCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKwogICAgICAgICAvLyBjcmVhdGUgYSBzcGVjaWFsIHBhdGNoIHdpdGggbm8gc2luayBhbmQgdHdvIHNvdXJjZXM6CiAgICAgICAgIC8vIC0gdGhlIHNlY29uZCBzb3VyY2UgaW5kaWNhdGVzIHRvIFBhdGNoUGFuZWwgdGhyb3VnaCB3aGljaCBvdXRwdXQgbWl4IHRoaXMgcGF0Y2ggc2hvdWxkCiAgICAgICAgIC8vIGJlIGNvbm5lY3RlZCBhcyB3ZWxsIGFzIHRoZSBzdHJlYW0gdHlwZSBmb3Igdm9sdW1lIGNvbnRyb2wKQEAgLTMzNjQsNyArMzMwMyw3IEBACiAgICAgICAgIHNyY0RldmljZURlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC0+c291cmNlc1swXSwgTlVMTCk7CiAgICAgICAgIG91dHB1dERlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC0+c291cmNlc1sxXSwgTlVMTCk7CiAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzFdLmV4dC5taXgudXNlY2FzZS5zdHJlYW0gPSBzdHJlYW07Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5jcmVhdGVBdWRpb1BhdGNoKHBhdGNoLAorICAgICAgICBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+Y3JlYXRlQXVkaW9QYXRjaChwYXRjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFmUGF0Y2hIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwogICAgICAgICBBTE9HVigiJXMgcGF0Y2ggcGFuZWwgcmV0dXJuZWQgJWQgcGF0Y2hIYW5kbGUgJWQiLCBfX0ZVTkNUSU9OX18sCkBAIC0zNDI4LDggKzMzNjcsOCBAQAogICAgICAgICAgICAgICAgIG9mZmxvYWRlZC5wdXNoKGRlc2MtPm1Jb0hhbmRsZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvZmZsb2FkZWQuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgIGNsb3NlT3V0cHV0KG9mZmxvYWRlZFtpXSk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgaGFuZGxlIDogb2ZmbG9hZGVkKSB7CisgICAgICAgICAgICBjbG9zZU91dHB1dChoYW5kbGUpOwogICAgICAgICB9CiAgICAgfQogICAgIC8vIHVwZGF0ZSBtYXN0ZXIgbW9ubyBmb3IgYWxsIHJlbWFpbmluZyBvdXRwdXRzCkBAIC0zNDY2LDcgKzM0MDUsMTAgQEAKICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IHN0cmVhbVR5cGVmcm9tQXR0cmlidXRlc0ludCgmc291cmNlRGVzYy0+bUF0dHJpYnV0ZXMpOwogICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBzd091dHB1dERlc2MgPSBzb3VyY2VEZXNjLT5tU3dPdXRwdXQucHJvbW90ZSgpOwogICAgIGlmIChzd091dHB1dERlc2MgIT0gMCkgewotICAgICAgICBzdG9wU291cmNlKHN3T3V0cHV0RGVzYywgc3RyZWFtLCBmYWxzZSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHN0b3BTb3VyY2Uoc3dPdXRwdXREZXNjLCBzdHJlYW0sIGZhbHNlKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgc3dPdXRwdXREZXNjLT5zdG9wKCk7CisgICAgICAgIH0KICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnJlbGVhc2VBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGUsIDApOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHNwPEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBod091dHB1dERlc2MgPSBzb3VyY2VEZXNjLT5tSHdPdXRwdXQucHJvbW90ZSgpOwpAQCAtMzUwMiw3ICszNDQ0LDcgQEAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIHVpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6bmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKQogewotICAgIHJldHVybiBhbmRyb2lkX2F0b21pY19pbmMoJm1BdWRpb1BvcnRHZW5lcmF0aW9uKTsKKyAgICByZXR1cm4gbUF1ZGlvUG9ydEdlbmVyYXRpb24rKzsKIH0KIAogI2lmZGVmIFVTRV9YTUxfQVVESU9fUE9MSUNZX0NPTkYKQEAgLTM1MzIsMTAgKzM0NzQsMjIgQEAKIH0KICNlbmRpZgogCi1BdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9saWN5TWFuYWdlcihBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKQorQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvbGljeU1hbmFnZXIoQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgLypmb3JUZXN0aW5nKi8pCiAgICAgOgorICAgIG1VaWRDYWNoZWQoZ2V0dWlkKCkpLAorICAgIG1wQ2xpZW50SW50ZXJmYWNlKGNsaWVudEludGVyZmFjZSksCiAgICAgbUxpbWl0UmluZ3RvbmVWb2x1bWUoZmFsc2UpLCBtTGFzdFZvaWNlVm9sdW1lKC0xLjBmKSwKICAgICBtQTJkcFN1c3BlbmRlZChmYWxzZSksCisjaWZkZWYgVVNFX1hNTF9BVURJT19QT0xJQ1lfQ09ORgorICAgIG1Wb2x1bWVDdXJ2ZXMobmV3IFZvbHVtZUN1cnZlc0NvbGxlY3Rpb24oKSksCisgICAgbUNvbmZpZyhtSHdNb2R1bGVzQWxsLCBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgbUF2YWlsYWJsZUlucHV0RGV2aWNlcywKKyAgICAgICAgICAgIG1EZWZhdWx0T3V0cHV0RGV2aWNlLCBzdGF0aWNfY2FzdDxWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uKj4obVZvbHVtZUN1cnZlcy5nZXQoKSkpLAorI2Vsc2UKKyAgICBtVm9sdW1lQ3VydmVzKG5ldyBTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbigpKSwKKyAgICBtQ29uZmlnKG1Id01vZHVsZXNBbGwsIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLCBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLAorICAgICAgICAgICAgbURlZmF1bHRPdXRwdXREZXZpY2UpLAorI2VuZGlmCiAgICAgbUF1ZGlvUG9ydEdlbmVyYXRpb24oMSksCiAgICAgbUJlYWNvbk11dGVSZWZDb3VudCgwKSwKICAgICBtQmVhY29uUGxheWluZ1JlZkNvdW50KDApLApAQCAtMzU0NSw3NiArMzQ5OSw3MiBAQAogICAgIG1NdXNpY0VmZmVjdE91dHB1dChBVURJT19JT19IQU5ETEVfTk9ORSksCiAgICAgbUhhc0NvbXB1dGVkU291bmRUcmlnZ2VyU3VwcG9ydHNDb25jdXJyZW50Q2FwdHVyZShmYWxzZSkKIHsKLSAgICBtVWlkQ2FjaGVkID0gZ2V0dWlkKCk7Ci0gICAgbXBDbGllbnRJbnRlcmZhY2UgPSBjbGllbnRJbnRlcmZhY2U7Cit9CiAKLSAgICAvLyBUT0RPOiByZW1vdmUgd2hlbiBsZWdhY3kgY29uZiBmaWxlIGlzIHJlbW92ZWQuIHRydWUgb24gZGV2aWNlcyB0aGF0IHVzZSBEUkMgb24gdGhlCi0gICAgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIgcGF0aCB0byBib29zdCBzb2Z0IHNvdW5kcywgdXNlZCB0byBhZGp1c3Qgdm9sdW1lIGN1cnZlcyBhY2NvcmRpbmdseS4KLSAgICAvLyBOb3RlOiByZW1vdmUgYWxzbyBzcGVha2VyX2RyY19lbmFibGVkIGZyb20gZ2xvYmFsIGNvbmZpZ3VyYXRpb24gb2YgWE1MIGNvbmZpZyBmaWxlLgotICAgIGJvb2wgc3BlYWtlckRyY0VuYWJsZWQgPSBmYWxzZTsKK0F1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb2xpY3lNYW5hZ2VyKEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpCisgICAgICAgIDogQXVkaW9Qb2xpY3lNYW5hZ2VyKGNsaWVudEludGVyZmFjZSwgZmFsc2UgLypmb3JUZXN0aW5nKi8pCit7CisgICAgbG9hZENvbmZpZygpOworICAgIGluaXRpYWxpemUoKTsKK30KIAordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmxvYWRDb25maWcoKSB7CiAjaWZkZWYgVVNFX1hNTF9BVURJT19QT0xJQ1lfQ09ORgotICAgIG1Wb2x1bWVDdXJ2ZXMgPSBuZXcgVm9sdW1lQ3VydmVzQ29sbGVjdGlvbigpOwotICAgIEF1ZGlvUG9saWN5Q29uZmlnIGNvbmZpZyhtSHdNb2R1bGVzLCBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgbUF2YWlsYWJsZUlucHV0RGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURlZmF1bHRPdXRwdXREZXZpY2UsIHNwZWFrZXJEcmNFbmFibGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uICo+KG1Wb2x1bWVDdXJ2ZXMpKTsKLSAgICBpZiAoZGVzZXJpYWxpemVBdWRpb1BvbGljeVhtbENvbmZpZyhjb25maWcpICE9IE5PX0VSUk9SKSB7CisgICAgaWYgKGRlc2VyaWFsaXplQXVkaW9Qb2xpY3lYbWxDb25maWcoZ2V0Q29uZmlnKCkpICE9IE5PX0VSUk9SKSB7CiAjZWxzZQotICAgIG1Wb2x1bWVDdXJ2ZXMgPSBuZXcgU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb24oKTsKLSAgICBBdWRpb1BvbGljeUNvbmZpZyBjb25maWcobUh3TW9kdWxlcywgbUF2YWlsYWJsZU91dHB1dERldmljZXMsIG1BdmFpbGFibGVJbnB1dERldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EZWZhdWx0T3V0cHV0RGV2aWNlLCBzcGVha2VyRHJjRW5hYmxlZCk7Ci0gICAgaWYgKChDb25maWdQYXJzaW5nVXRpbHM6OmxvYWRDb25maWcoQVVESU9fUE9MSUNZX1ZFTkRPUl9DT05GSUdfRklMRSwgY29uZmlnKSAhPSBOT19FUlJPUikgJiYKLSAgICAgICAgICAgIChDb25maWdQYXJzaW5nVXRpbHM6OmxvYWRDb25maWcoQVVESU9fUE9MSUNZX0NPTkZJR19GSUxFLCBjb25maWcpICE9IE5PX0VSUk9SKSkgeworICAgIGlmICgoQ29uZmlnUGFyc2luZ1V0aWxzOjpsb2FkQ29uZmlnKEFVRElPX1BPTElDWV9WRU5ET1JfQ09ORklHX0ZJTEUsIGdldENvbmZpZygpKSAhPSBOT19FUlJPUikKKyAgICAgICAgICAgJiYgKENvbmZpZ1BhcnNpbmdVdGlsczo6bG9hZENvbmZpZyhBVURJT19QT0xJQ1lfQ09ORklHX0ZJTEUsIGdldENvbmZpZygpKSAhPSBOT19FUlJPUikpIHsKICNlbmRpZgogICAgICAgICBBTE9HRSgiY291bGQgbm90IGxvYWQgYXVkaW8gcG9saWN5IGNvbmZpZ3VyYXRpb24gZmlsZSwgc2V0dGluZyBkZWZhdWx0cyIpOwotICAgICAgICBjb25maWcuc2V0RGVmYXVsdCgpOworICAgICAgICBnZXRDb25maWcoKS5zZXREZWZhdWx0KCk7CiAgICAgfQotICAgIC8vIG11c3QgYmUgZG9uZSBhZnRlciByZWFkaW5nIHRoZSBwb2xpY3kgKHNpbmNlIGNvbmRpdGlvbm5lZCBieSBTcGVha2VyIERyYyBFbmFibGluZykKLSAgICBtVm9sdW1lQ3VydmVzLT5pbml0aWFsaXplVm9sdW1lQ3VydmVzKHNwZWFrZXJEcmNFbmFibGVkKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppbml0aWFsaXplKCkgeworICAgIG1Wb2x1bWVDdXJ2ZXMtPmluaXRpYWxpemVWb2x1bWVDdXJ2ZXMoZ2V0Q29uZmlnKCkuaXNTcGVha2VyRHJjRW5hYmxlZCgpKTsKIAogICAgIC8vIE9uY2UgcG9saWN5IGNvbmZpZyBoYXMgYmVlbiBwYXJzZWQsIHJldHJpZXZlIGFuIGluc3RhbmNlIG9mIHRoZSBlbmdpbmUgYW5kIGluaXRpYWxpemUgaXQuCiAgICAgYXVkaW9fcG9saWN5OjpFbmdpbmVJbnN0YW5jZSAqZW5naW5lSW5zdGFuY2UgPSBhdWRpb19wb2xpY3k6OkVuZ2luZUluc3RhbmNlOjpnZXRJbnN0YW5jZSgpOwogICAgIGlmICghZW5naW5lSW5zdGFuY2UpIHsKICAgICAgICAgQUxPR0UoIiVzOiAgQ291bGQgbm90IGdldCBhbiBpbnN0YW5jZSBvZiBwb2xpY3kgZW5naW5lIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAgICAgLy8gUmV0cmlldmUgdGhlIFBvbGljeSBNYW5hZ2VyIEludGVyZmFjZQogICAgIG1FbmdpbmUgPSBlbmdpbmVJbnN0YW5jZS0+cXVlcnlJbnRlcmZhY2U8QXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlPigpOwogICAgIGlmIChtRW5naW5lID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gZ2V0IFBvbGljeSBFbmdpbmUgSW50ZXJmYWNlIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAgICAgbUVuZ2luZS0+c2V0T2JzZXJ2ZXIodGhpcyk7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUVuZ2luZS0+aW5pdENoZWNrKCk7Ci0gICAgKHZvaWQpIHN0YXR1czsKLSAgICBBTE9HX0FTU0VSVChzdGF0dXMgPT0gTk9fRVJST1IsICJQb2xpY3kgZW5naW5lIG5vdCBpbml0aWFsaXplZChlcnI9JWQpIiwgc3RhdHVzKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIExPR19GQVRBTCgiUG9saWN5IGVuZ2luZSBub3QgaW5pdGlhbGl6ZWQoZXJyPSVkKSIsIHN0YXR1cyk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQogCiAgICAgLy8gbUF2YWlsYWJsZU91dHB1dERldmljZXMgYW5kIG1BdmFpbGFibGVJbnB1dERldmljZXMgbm93IGNvbnRhaW4gYWxsIGF0dGFjaGVkIGRldmljZXMKICAgICAvLyBvcGVuIGFsbCBvdXRwdXQgc3RyZWFtcyBuZWVkZWQgdG8gYWNjZXNzIGF0dGFjaGVkIGRldmljZXMKICAgICBhdWRpb19kZXZpY2VzX3Qgb3V0cHV0RGV2aWNlVHlwZXMgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpOwogICAgIGF1ZGlvX2RldmljZXNfdCBpbnB1dERldmljZVR5cGVzID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy50eXBlcygpICYgfkFVRElPX0RFVklDRV9CSVRfSU47Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSHdNb2R1bGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIG1Id01vZHVsZXNbaV0tPm1IYW5kbGUgPSBtcENsaWVudEludGVyZmFjZS0+bG9hZEh3TW9kdWxlKG1Id01vZHVsZXNbaV0tPmdldE5hbWUoKSk7Ci0gICAgICAgIGlmIChtSHdNb2R1bGVzW2ldLT5tSGFuZGxlID09IDApIHsKLSAgICAgICAgICAgIEFMT0dXKCJjb3VsZCBub3Qgb3BlbiBIVyBtb2R1bGUgJXMiLCBtSHdNb2R1bGVzW2ldLT5nZXROYW1lKCkpOworICAgIGZvciAoY29uc3QgYXV0byYgaHdNb2R1bGUgOiBtSHdNb2R1bGVzQWxsKSB7CisgICAgICAgIGh3TW9kdWxlLT5zZXRIYW5kbGUobXBDbGllbnRJbnRlcmZhY2UtPmxvYWRId01vZHVsZShod01vZHVsZS0+Z2V0TmFtZSgpKSk7CisgICAgICAgIGlmIChod01vZHVsZS0+Z2V0SGFuZGxlKCkgPT0gQVVESU9fTU9EVUxFX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICBBTE9HVygiY291bGQgbm90IG9wZW4gSFcgbW9kdWxlICVzIiwgaHdNb2R1bGUtPmdldE5hbWUoKSk7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQorICAgICAgICBtSHdNb2R1bGVzLnB1c2hfYmFjayhod01vZHVsZSk7CiAgICAgICAgIC8vIG9wZW4gYWxsIG91dHB1dCBzdHJlYW1zIG5lZWRlZCB0byBhY2Nlc3MgYXR0YWNoZWQgZGV2aWNlcwogICAgICAgICAvLyBleGNlcHQgZm9yIGRpcmVjdCBvdXRwdXQgc3RyZWFtcyB0aGF0IGFyZSBvbmx5IG9wZW5lZCB3aGVuIHRoZXkgYXJlIGFjdHVhbGx5CiAgICAgICAgIC8vIHJlcXVpcmVkIGJ5IGFuIGFwcC4KICAgICAgICAgLy8gVGhpcyBhbHNvIHZhbGlkYXRlcyBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBsaXN0Ci0gICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbUh3TW9kdWxlc1tpXS0+bU91dHB1dFByb2ZpbGVzLnNpemUoKTsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb25zdCBzcDxJT1Byb2ZpbGU+IG91dFByb2ZpbGUgPSBtSHdNb2R1bGVzW2ldLT5tT3V0cHV0UHJvZmlsZXNbal07Ci0KKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBvdXRQcm9maWxlIDogaHdNb2R1bGUtPmdldE91dHB1dFByb2ZpbGVzKCkpIHsKICAgICAgICAgICAgIGlmICghb3V0UHJvZmlsZS0+Y2FuT3Blbk5ld0lvKCkpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBPdXRwdXQgcHJvZmlsZSBtYXggb3BlbiBjb3VudCAldSBmb3IgcHJvZmlsZSAlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgb3V0UHJvZmlsZS0+bWF4T3BlbkNvdW50LCBvdXRQcm9maWxlLT5nZXRUYWdOYW1lKCkuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9Ci0KICAgICAgICAgICAgIGlmICghb3V0UHJvZmlsZS0+aGFzU3VwcG9ydGVkRGV2aWNlcygpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coIk91dHB1dCBwcm9maWxlIGNvbnRhaW5zIG5vIGRldmljZSBvbiBtb2R1bGUgJXMiLCBtSHdNb2R1bGVzW2ldLT5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIEFMT0dXKCJPdXRwdXQgcHJvZmlsZSBjb250YWlucyBubyBkZXZpY2Ugb24gbW9kdWxlICVzIiwgaHdNb2R1bGUtPmdldE5hbWUoKSk7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoKG91dFByb2ZpbGUtPmdldEZsYWdzKCkgJiBBVURJT19PVVRQVVRfRkxBR19UVFMpICE9IDApIHsKQEAgLTM2NDgsMTMgKzM1OTgsMTMgQEAKICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICBBTE9HVygiQ2Fubm90IG9wZW4gb3V0cHV0IHN0cmVhbSBmb3IgZGV2aWNlICUwOHggb24gaHcgbW9kdWxlICVzIiwKICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgIG1Id01vZHVsZXNbaV0tPmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgaHdNb2R1bGUtPmdldE5hbWUoKSk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrICA8IHN1cHBvcnRlZERldmljZXMuc2l6ZSgpOyBrKyspIHsKLSAgICAgICAgICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmluZGV4T2Yoc3VwcG9ydGVkRGV2aWNlc1trXSk7CisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBkZXYgOiBzdXBwb3J0ZWREZXZpY2VzKSB7CisgICAgICAgICAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5pbmRleE9mKGRldik7CiAgICAgICAgICAgICAgICAgICAgIC8vIGdpdmUgYSB2YWxpZCBJRCB0byBhbiBhdHRhY2hlZCBkZXZpY2Ugb25jZSBjb25maXJtZWQgaXQgaXMgcmVhY2hhYmxlCiAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwICYmICFtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpbmRleF0tPmlzQXR0YWNoZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXNbaW5kZXhdLT5hdHRhY2gobUh3TW9kdWxlc1tpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpbmRleF0tPmF0dGFjaChod01vZHVsZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKG1QcmltYXJ5T3V0cHV0ID09IDAgJiYKQEAgLTM2NzIsMTggKzM2MjIsMTQgQEAKICAgICAgICAgfQogICAgICAgICAvLyBvcGVuIGlucHV0IHN0cmVhbXMgbmVlZGVkIHRvIGFjY2VzcyBhdHRhY2hlZCBkZXZpY2VzIHRvIHZhbGlkYXRlCiAgICAgICAgIC8vIG1BdmFpbGFibGVJbnB1dERldmljZXMgbGlzdAotICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1Id01vZHVsZXNbaV0tPm1JbnB1dFByb2ZpbGVzLnNpemUoKTsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb25zdCBzcDxJT1Byb2ZpbGU+IGluUHJvZmlsZSA9IG1Id01vZHVsZXNbaV0tPm1JbnB1dFByb2ZpbGVzW2pdOwotCisgICAgICAgIGZvciAoY29uc3QgYXV0byYgaW5Qcm9maWxlIDogaHdNb2R1bGUtPmdldElucHV0UHJvZmlsZXMoKSkgewogICAgICAgICAgICAgaWYgKCFpblByb2ZpbGUtPmNhbk9wZW5OZXdJbygpKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgSW5wdXQgcHJvZmlsZSBtYXggb3BlbiBjb3VudCAldSBmb3IgcHJvZmlsZSAlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgaW5Qcm9maWxlLT5tYXhPcGVuQ291bnQsIGluUHJvZmlsZS0+Z2V0VGFnTmFtZSgpLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQotCiAgICAgICAgICAgICBpZiAoIWluUHJvZmlsZS0+aGFzU3VwcG9ydGVkRGV2aWNlcygpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coIklucHV0IHByb2ZpbGUgY29udGFpbnMgbm8gZGV2aWNlIG9uIG1vZHVsZSAlcyIsIG1Id01vZHVsZXNbaV0tPmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgQUxPR1coIklucHV0IHByb2ZpbGUgY29udGFpbnMgbm8gZGV2aWNlIG9uIG1vZHVsZSAlcyIsIGh3TW9kdWxlLT5nZXROYW1lKCkpOwogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gY2hvc2UgZmlyc3QgZGV2aWNlIHByZXNlbnQgaW4gcHJvZmlsZSdzIFN1cHBvcnRlZERldmljZXMgYWxzbyBwYXJ0IG9mCkBAIC0zNjk2LDIzICszNjQyLDI5IEBACiAgICAgICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0KICAgICAgICAgICAgICAgICAgICAgbmV3IEF1ZGlvSW5wdXREZXNjcmlwdG9yKGluUHJvZmlsZSwgbXBDbGllbnRJbnRlcmZhY2UpOwogCisgICAgICAgICAgICBEZXZpY2VWZWN0b3IgaW5wdXREZXZpY2VzID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUocHJvZmlsZVR5cGUpOworICAgICAgICAgICAgLy8gICB0aGUgaW5wdXRzIHZlY3RvciBtdXN0IGJlIG9mIHNpemUgPj0gMSwgYnV0IHdlIGRvbid0IHdhbnQgdG8gY3Jhc2ggaGVyZQorICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gaW5wdXREZXZpY2VzLnNpemUoKSA+IDAgPyBpbnB1dERldmljZXMuaXRlbUF0KDApLT5tQWRkcmVzcworICAgICAgICAgICAgICAgICAgICA6IFN0cmluZzgoIiIpOworICAgICAgICAgICAgQUxPR1YoIiAgZm9yIGlucHV0IGRldmljZSAweCV4IHVzaW5nIGFkZHJlc3MgJXMiLCBwcm9maWxlVHlwZSwgYWRkcmVzcy5zdHJpbmcoKSk7CisgICAgICAgICAgICBBTE9HRV9JRihpbnB1dERldmljZXMuc2l6ZSgpID09IDAsICJJbnB1dCBkZXZpY2UgbGlzdCBpcyBlbXB0eSEiKTsKKwogICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGlucHV0RGVzYy0+b3BlbihudWxscHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoIiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX01JQywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19JTlBVVF9GTEFHX05PTkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0KTsKIAogICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVZlY3RvciAmc3VwcG9ydGVkRGV2aWNlcyA9IGluUHJvZmlsZS0+Z2V0U3VwcG9ydGVkRGV2aWNlcygpOwotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrICA8IHN1cHBvcnRlZERldmljZXMuc2l6ZSgpOyBrKyspIHsKLSAgICAgICAgICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9ICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmluZGV4T2Yoc3VwcG9ydGVkRGV2aWNlc1trXSk7CisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBkZXYgOiBpblByb2ZpbGUtPmdldFN1cHBvcnRlZERldmljZXMoKSkgeworICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5pbmRleE9mKGRldik7CiAgICAgICAgICAgICAgICAgICAgIC8vIGdpdmUgYSB2YWxpZCBJRCB0byBhbiBhdHRhY2hlZCBkZXZpY2Ugb25jZSBjb25maXJtZWQgaXQgaXMgcmVhY2hhYmxlCiAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRldkRlc2MtPmlzQXR0YWNoZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPmF0dGFjaChtSHdNb2R1bGVzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZEZXNjLT5hdHRhY2goaHdNb2R1bGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPmltcG9ydEF1ZGlvUG9ydChpblByb2ZpbGUsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CkBAIC0zNzIxLDcgKzM2NzMsNyBAQAogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBBTE9HVygiQ2Fubm90IG9wZW4gaW5wdXQgc3RyZWFtIGZvciBkZXZpY2UgJTA4eCBvbiBodyBtb2R1bGUgJXMiLAogICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgIG1Id01vZHVsZXNbaV0tPmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgaHdNb2R1bGUtPmdldE5hbWUoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0zNzUxLDExICszNzAzLDE2IEBACiAgICAgLy8gbWFrZSBzdXJlIGRlZmF1bHQgZGV2aWNlIGlzIHJlYWNoYWJsZQogICAgIGlmIChtRGVmYXVsdE91dHB1dERldmljZSA9PSAwIHx8IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmluZGV4T2YobURlZmF1bHRPdXRwdXREZXZpY2UpIDwgMCkgewogICAgICAgICBBTE9HRSgiRGVmYXVsdCBkZXZpY2UgJTA4eCBpcyB1bnJlYWNoYWJsZSIsIG1EZWZhdWx0T3V0cHV0RGV2aWNlLT50eXBlKCkpOworICAgICAgICBzdGF0dXMgPSBOT19JTklUOwogICAgIH0KIAotICAgIEFMT0dFX0lGKChtUHJpbWFyeU91dHB1dCA9PSAwKSwgIkZhaWxlZCB0byBvcGVuIHByaW1hcnkgb3V0cHV0Iik7CisgICAgaWYgKG1QcmltYXJ5T3V0cHV0ID09IDApIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBvcGVuIHByaW1hcnkgb3V0cHV0Iik7CisgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CisgICAgfQogCiAgICAgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKTsKKyAgICByZXR1cm4gc3RhdHVzOwogfQogCiBBdWRpb1BvbGljeU1hbmFnZXI6On5BdWRpb1BvbGljeU1hbmFnZXIoKQpAQCAtMzc3MSw2ICszNzI4LDcgQEAKICAgIG1PdXRwdXRzLmNsZWFyKCk7CiAgICBtSW5wdXRzLmNsZWFyKCk7CiAgICBtSHdNb2R1bGVzLmNsZWFyKCk7CisgICBtSHdNb2R1bGVzQWxsLmNsZWFyKCk7CiB9CiAKIHN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6aW5pdENoZWNrKCkKQEAgLTM4NDIsMTkgKzM4MDAsMTUgQEAKICAgICAgICAgfQogICAgICAgICAvLyB0aGVuIGxvb2sgZm9yIG91dHB1dCBwcm9maWxlcyB0aGF0IGNhbiBiZSByb3V0ZWQgdG8gdGhpcyBkZXZpY2UKICAgICAgICAgU29ydGVkVmVjdG9yPCBzcDxJT1Byb2ZpbGU+ID4gcHJvZmlsZXM7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUh3TW9kdWxlcy5zaXplKCk7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG1Id01vZHVsZXNbaV0tPm1IYW5kbGUgPT0gMCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtSHdNb2R1bGVzW2ldLT5tT3V0cHV0UHJvZmlsZXMuc2l6ZSgpOyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gbUh3TW9kdWxlc1tpXS0+bU91dHB1dFByb2ZpbGVzW2pdOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGh3TW9kdWxlIDogbUh3TW9kdWxlcykgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBod01vZHVsZS0+Z2V0T3V0cHV0UHJvZmlsZXMoKS5zaXplKCk7IGorKykgeworICAgICAgICAgICAgICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IGh3TW9kdWxlLT5nZXRPdXRwdXRQcm9maWxlcygpW2pdOwogICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5zdXBwb3J0RGV2aWNlKGRldmljZSkpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFkZXZpY2VfZGlzdGluZ3Vpc2hlc19vbl9hZGRyZXNzKGRldmljZSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5zdXBwb3J0RGV2aWNlQWRkcmVzcyhhZGRyZXNzKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZXMuYWRkKHByb2ZpbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBhZGRpbmcgcHJvZmlsZSAlenUgZnJvbSBtb2R1bGUgJXp1IiwgaiwgaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCk6IGFkZGluZyBwcm9maWxlICV6dSBmcm9tIG1vZHVsZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGosIGh3TW9kdWxlLT5nZXROYW1lKCkpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtNDAyNCwxNyArMzk3OCwxMyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIC8vIENsZWFyIGFueSBwcm9maWxlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGRpc2Nvbm5lY3RlZCBkZXZpY2UuCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUh3TW9kdWxlcy5zaXplKCk7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG1Id01vZHVsZXNbaV0tPm1IYW5kbGUgPT0gMCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtSHdNb2R1bGVzW2ldLT5tT3V0cHV0UHJvZmlsZXMuc2l6ZSgpOyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gbUh3TW9kdWxlc1tpXS0+bU91dHB1dFByb2ZpbGVzW2pdOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGh3TW9kdWxlIDogbUh3TW9kdWxlcykgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBod01vZHVsZS0+Z2V0T3V0cHV0UHJvZmlsZXMoKS5zaXplKCk7IGorKykgeworICAgICAgICAgICAgICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IGh3TW9kdWxlLT5nZXRPdXRwdXRQcm9maWxlcygpW2pdOwogICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5zdXBwb3J0RGV2aWNlKGRldmljZSkpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsZWFyaW5nIGRpcmVjdCBvdXRwdXQgcHJvZmlsZSAlenUgb24gbW9kdWxlICV6dSIsIGosIGkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjbGVhcmluZyBkaXJlY3Qgb3V0cHV0IHByb2ZpbGUgJXp1IG9uIG1vZHVsZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiwgaHdNb2R1bGUtPmdldE5hbWUoKSk7CiAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPmNsZWFyQXVkaW9Qcm9maWxlcygpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTQwNjgsMjMgKzQwMTgsMTggQEAKIAogICAgICAgICAvLyB0aGVuIGxvb2sgZm9yIGlucHV0IHByb2ZpbGVzIHRoYXQgY2FuIGJlIHJvdXRlZCB0byB0aGlzIGRldmljZQogICAgICAgICBTb3J0ZWRWZWN0b3I8IHNwPElPUHJvZmlsZT4gPiBwcm9maWxlczsKLSAgICAgICAgZm9yIChzaXplX3QgbW9kdWxlX2lkeCA9IDA7IG1vZHVsZV9pZHggPCBtSHdNb2R1bGVzLnNpemUoKTsgbW9kdWxlX2lkeCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobUh3TW9kdWxlc1ttb2R1bGVfaWR4XS0+bUhhbmRsZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgaHdNb2R1bGUgOiBtSHdNb2R1bGVzKSB7CiAgICAgICAgICAgICBmb3IgKHNpemVfdCBwcm9maWxlX2luZGV4ID0gMDsKLSAgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleCA8IG1Id01vZHVsZXNbbW9kdWxlX2lkeF0tPm1JbnB1dFByb2ZpbGVzLnNpemUoKTsKLSAgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IG1Id01vZHVsZXNbbW9kdWxlX2lkeF0tPm1JbnB1dFByb2ZpbGVzW3Byb2ZpbGVfaW5kZXhdOworICAgICAgICAgICAgICAgICBwcm9maWxlX2luZGV4IDwgaHdNb2R1bGUtPmdldElucHV0UHJvZmlsZXMoKS5zaXplKCk7CisgICAgICAgICAgICAgICAgIHByb2ZpbGVfaW5kZXgrKykgeworICAgICAgICAgICAgICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IGh3TW9kdWxlLT5nZXRJbnB1dFByb2ZpbGVzKClbcHJvZmlsZV9pbmRleF07CiAKICAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+c3VwcG9ydERldmljZShkZXZpY2UpKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmICghZGV2aWNlX2Rpc3Rpbmd1aXNoZXNfb25fYWRkcmVzcyhkZXZpY2UpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+c3VwcG9ydERldmljZUFkZHJlc3MoYWRkcmVzcykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVzLmFkZChwcm9maWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja0lucHV0c0ZvckRldmljZSgpOiBhZGRpbmcgcHJvZmlsZSAlenUgZnJvbSBtb2R1bGUgJXp1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVfaW5kZXgsIG1vZHVsZV9pZHgpOworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrSW5wdXRzRm9yRGV2aWNlKCk6IGFkZGluZyBwcm9maWxlICV6dSBmcm9tIG1vZHVsZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVfaW5kZXgsIGh3TW9kdWxlLT5nZXROYW1lKCkpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtNDE3OCwxNyArNDEyMywxNCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIC8vIENsZWFyIGFueSBwcm9maWxlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGRpc2Nvbm5lY3RlZCBkZXZpY2UuCi0gICAgICAgIGZvciAoc2l6ZV90IG1vZHVsZV9pbmRleCA9IDA7IG1vZHVsZV9pbmRleCA8IG1Id01vZHVsZXMuc2l6ZSgpOyBtb2R1bGVfaW5kZXgrKykgewotICAgICAgICAgICAgaWYgKG1Id01vZHVsZXNbbW9kdWxlX2luZGV4XS0+bUhhbmRsZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgaHdNb2R1bGUgOiBtSHdNb2R1bGVzKSB7CiAgICAgICAgICAgICBmb3IgKHNpemVfdCBwcm9maWxlX2luZGV4ID0gMDsKLSAgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleCA8IG1Id01vZHVsZXNbbW9kdWxlX2luZGV4XS0+bUlucHV0UHJvZmlsZXMuc2l6ZSgpOworICAgICAgICAgICAgICAgICBwcm9maWxlX2luZGV4IDwgaHdNb2R1bGUtPmdldElucHV0UHJvZmlsZXMoKS5zaXplKCk7CiAgICAgICAgICAgICAgICAgIHByb2ZpbGVfaW5kZXgrKykgewotICAgICAgICAgICAgICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IG1Id01vZHVsZXNbbW9kdWxlX2luZGV4XS0+bUlucHV0UHJvZmlsZXNbcHJvZmlsZV9pbmRleF07CisgICAgICAgICAgICAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gaHdNb2R1bGUtPmdldElucHV0UHJvZmlsZXMoKVtwcm9maWxlX2luZGV4XTsKICAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+c3VwcG9ydERldmljZShkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja0lucHV0c0ZvckRldmljZSgpOiBjbGVhcmluZyBkaXJlY3QgaW5wdXQgcHJvZmlsZSAlenUgb24gbW9kdWxlICV6dSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVfaW5kZXgsIG1vZHVsZV9pbmRleCk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja0lucHV0c0ZvckRldmljZSgpOiBjbGVhcmluZyBkaXJlY3QgaW5wdXQgcHJvZmlsZSAlenUgb24gbW9kdWxlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlX2luZGV4LCBod01vZHVsZS0+Z2V0TmFtZSgpKTsKICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+Y2xlYXJBdWRpb1Byb2ZpbGVzKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtNDIxNiw3ICs0MTU4LDcgQEAKICAgICAgICAgaWYgKGR1cE91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpICYmCiAgICAgICAgICAgICAgICAgKGR1cE91dHB1dERlc2MtPm1PdXRwdXQxID09IG91dHB1dERlc2MgfHwKICAgICAgICAgICAgICAgICBkdXBPdXRwdXREZXNjLT5tT3V0cHV0MiA9PSBvdXRwdXREZXNjKSkgewotICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjMjsKKyAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjMjsKICAgICAgICAgICAgIGlmIChkdXBPdXRwdXREZXNjLT5tT3V0cHV0MSA9PSBvdXRwdXREZXNjKSB7CiAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYzIgPSBkdXBPdXRwdXREZXNjLT5tT3V0cHV0MjsKICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC00MjI2LDEwICs0MTY4LDE2IEBACiAgICAgICAgICAgICAvLyBhbmQgYXMgdGhleSB3ZXJlIGFsc28gcmVmZXJlbmNlZCBvbiB0aGUgb3RoZXIgb3V0cHV0LCB0aGUgcmVmZXJlbmNlCiAgICAgICAgICAgICAvLyBjb3VudCBmb3IgdGhlaXIgc3RyZWFtIHR5cGUgbXVzdCBiZSBhZGp1c3RlZCBhY2NvcmRpbmdseSBvbgogICAgICAgICAgICAgLy8gdGhlIG90aGVyIG91dHB1dC4KKyAgICAgICAgICAgIGJvb2wgd2FzQWN0aXZlID0gb3V0cHV0RGVzYzItPmlzQWN0aXZlKCk7CiAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IEFVRElPX1NUUkVBTV9DTlQ7IGorKykgewogICAgICAgICAgICAgICAgIGludCByZWZDb3VudCA9IGR1cE91dHB1dERlc2MtPm1SZWZDb3VudFtqXTsKICAgICAgICAgICAgICAgICBvdXRwdXREZXNjMi0+Y2hhbmdlUmVmQ291bnQoKGF1ZGlvX3N0cmVhbV90eXBlX3QpaiwtcmVmQ291bnQpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gc3RvcCgpIHdpbGwgYmUgYSBubyBvcCBpZiB0aGUgb3V0cHV0IGlzIHN0aWxsIGFjdGl2ZSBidXQgaXMgbmVlZGVkIGluIGNhc2UgYWxsCisgICAgICAgICAgICAvLyBhY3RpdmUgc3RyZWFtcyByZWZjb3VudHMgd2hlcmUgY2xlYXJlZCBhYm92ZQorICAgICAgICAgICAgaWYgKHdhc0FjdGl2ZSkgeworICAgICAgICAgICAgICAgIG91dHB1dERlc2MyLT5zdG9wKCk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBkdXBsaWNhdGVkT3V0cHV0ID0gbU91dHB1dHMua2V5QXQoaSk7CiAgICAgICAgICAgICBBTE9HVigiY2xvc2VPdXRwdXQoKSBjbG9zaW5nIGFsc28gZHVwbGljYXRlZCBvdXRwdXQgJWQiLCBkdXBsaWNhdGVkT3V0cHV0KTsKIApAQCAtNDM0MCwxNCArNDI4OCwxNCBAQAogICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRGb3JTdHJhdGVneSgpIHN0cmF0ZWd5ICVkLCBtb3ZpbmcgZnJvbSBvdXRwdXQgJWQgdG8gb3V0cHV0ICVkIiwKICAgICAgICAgICAgICAgc3RyYXRlZ3ksIHNyY091dHB1dHNbMF0sIGRzdE91dHB1dHNbMF0pOwogICAgICAgICAvLyBtdXRlIHN0cmF0ZWd5IHdoaWxlIG1vdmluZyB0cmFja3MgZnJvbSBvbmUgb3V0cHV0IHRvIGFub3RoZXIKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzcmNPdXRwdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKHNyY091dHB1dHNbaV0pOworICAgICAgICBmb3IgKGF1ZGlvX2lvX2hhbmRsZV90IHNyY091dCA6IHNyY091dHB1dHMpIHsKKyAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVGb3Ioc3JjT3V0KTsKICAgICAgICAgICAgIGlmIChpc1N0cmF0ZWd5QWN0aXZlKGRlc2MsIHN0cmF0ZWd5KSkgewogICAgICAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShzdHJhdGVneSwgdHJ1ZSwgZGVzYyk7CiAgICAgICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKHN0cmF0ZWd5LCBmYWxzZSwgZGVzYywgTVVURV9USU1FX01TLCBuZXdEZXZpY2UpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3A8QXVkaW9Tb3VyY2VEZXNjcmlwdG9yPiBzb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICBnZXRTb3VyY2VGb3JTdHJhdGVneU9uT3V0cHV0KHNyY091dHB1dHNbaV0sIHN0cmF0ZWd5KTsKKyAgICAgICAgICAgICAgICAgICAgZ2V0U291cmNlRm9yU3RyYXRlZ3lPbk91dHB1dChzcmNPdXQsIHN0cmF0ZWd5KTsKICAgICAgICAgICAgIGlmIChzb3VyY2UgIT0gMCl7CiAgICAgICAgICAgICAgICAgY29ubmVjdEF1ZGlvU291cmNlKHNvdXJjZSk7CiAgICAgICAgICAgICB9CkBAIC00NTQxLDkgKzQ0ODksOCBAQAogICAgICAgICByb3V0aW5nX3N0cmF0ZWd5IGN1clN0cmF0ZWd5ID0gZ2V0U3RyYXRlZ3koKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtKTsKICAgICAgICAgYXVkaW9fZGV2aWNlc190IGN1ckRldmljZXMgPQogICAgICAgICAgICAgICAgIGdldERldmljZUZvclN0cmF0ZWd5KChyb3V0aW5nX3N0cmF0ZWd5KWN1clN0cmF0ZWd5LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKLSAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzID0gZ2V0T3V0cHV0c0ZvckRldmljZShjdXJEZXZpY2VzLCBtT3V0cHV0cyk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0cHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0c1tpXSk7CisgICAgICAgIGZvciAoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0IDogZ2V0T3V0cHV0c0ZvckRldmljZShjdXJEZXZpY2VzLCBtT3V0cHV0cykpIHsKKyAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7CiAgICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+aXNTdHJlYW1BY3RpdmUoKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtKSkgewogICAgICAgICAgICAgICAgIGN1ckRldmljZXMgfD0gb3V0cHV0RGVzYy0+ZGV2aWNlKCk7CiAgICAgICAgICAgICB9CkBAIC01MDI3LDE0ICs0OTc0LDggQEAKICAgICAvLyBUT0RPOiBwZXJoYXBzIGlzQ29tcGF0aWJsZVByb2ZpbGUgc2hvdWxkIHJldHVybiBhICJtYXRjaGluZyIgc2NvcmUgc28gd2UgY2FuIHJldHVybgogICAgIC8vIHRoZSBiZXN0IG1hdGNoaW5nIHByb2ZpbGUsIG5vdCB0aGUgZmlyc3Qgb25lLgogCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSHdNb2R1bGVzLnNpemUoKTsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKG1Id01vZHVsZXNbaV0tPm1IYW5kbGUgPT0gMCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtSHdNb2R1bGVzW2ldLT5tSW5wdXRQcm9maWxlcy5zaXplKCk7IGorKykKLSAgICAgICAgewotICAgICAgICAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gbUh3TW9kdWxlc1tpXS0+bUlucHV0UHJvZmlsZXNbal07CisgICAgZm9yIChjb25zdCBhdXRvJiBod01vZHVsZSA6IG1Id01vZHVsZXMpIHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBwcm9maWxlIDogaHdNb2R1bGUtPmdldElucHV0UHJvZmlsZXMoKSkgewogICAgICAgICAgICAgLy8gcHJvZmlsZS0+bG9nKCk7CiAgICAgICAgICAgICBpZiAocHJvZmlsZS0+aXNDb21wYXRpYmxlUHJvZmlsZShkZXZpY2UsIGFkZHJlc3MsIHNhbXBsaW5nUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGluZ1JhdGUgLyp1cGRhdGVkU2FtcGxpbmdSYXRlKi8sCkBAIC01NTE0LDcgKzU0NTUsNyBAQAogICAgIGJvb2wgc3VwcG9ydHNBQzMgPSBmYWxzZTsKICAgICBib29sIHN1cHBvcnRzT3RoZXJTdXJyb3VuZCA9IGZhbHNlOwogICAgIGJvb2wgc3VwcG9ydHNJRUM2MTkzNyA9IGZhbHNlOwotICAgIGZvciAoc2l6ZV90IGZvcm1hdEluZGV4ID0gMDsgZm9ybWF0SW5kZXggPCBmb3JtYXRzLnNpemUoKTsgZm9ybWF0SW5kZXgrKykgeworICAgIGZvciAoc3NpemVfdCBmb3JtYXRJbmRleCA9IDA7IGZvcm1hdEluZGV4IDwgKHNzaXplX3QpZm9ybWF0cy5zaXplKCk7IGZvcm1hdEluZGV4KyspIHsKICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gZm9ybWF0c1tmb3JtYXRJbmRleF07CiAgICAgICAgIHN3aXRjaCAoZm9ybWF0KSB7CiAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9BQzM6CkBAIC01NjEwLDggKzU1NTEsNyBAQAogICAgIH0gZWxzZSBpZiAoZm9yY2VVc2UgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0VOQ09ERURfU1VSUk9VTkRfQUxXQVlTKSB7CiAgICAgICAgIGJvb2wgc3VwcG9ydHM1ZG90MSA9IGZhbHNlOwogICAgICAgICAvLyBBcmUgdGhlcmUgYW55IGNoYW5uZWwgbWFza3MgdGhhdCBjYW4gYmUgY29uc2lkZXJlZCAic3Vycm91bmQiPwotICAgICAgICBmb3IgKHNpemVfdCBtYXNrSW5kZXggPSAwOyBtYXNrSW5kZXggPCBjaGFubmVsTWFza3Muc2l6ZSgpOyBtYXNrSW5kZXgrKykgewotICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSBjaGFubmVsTWFza3NbbWFza0luZGV4XTsKKyAgICAgICAgZm9yIChhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA6IGNoYW5uZWxNYXNrcykgewogICAgICAgICAgICAgaWYgKChjaGFubmVsTWFzayAmIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEpID09IEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEpIHsKICAgICAgICAgICAgICAgICBzdXBwb3J0czVkb3QxID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTU2NDgsMTAgKzU1ODgsOCBAQAogICAgICAgICB9CiAgICAgICAgIHByb2ZpbGVzLnNldEZvcm1hdHMoZm9ybWF0cyk7CiAgICAgfQotICAgIGNvbnN0IEZvcm1hdFZlY3RvciAmc3VwcG9ydGVkRm9ybWF0cyA9IHByb2ZpbGVzLmdldFN1cHBvcnRlZEZvcm1hdHMoKTsKIAotICAgIGZvciAoc2l6ZV90IGZvcm1hdEluZGV4ID0gMDsgZm9ybWF0SW5kZXggPCBzdXBwb3J0ZWRGb3JtYXRzLnNpemUoKTsgZm9ybWF0SW5kZXgrKykgewotICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBzdXBwb3J0ZWRGb3JtYXRzW2Zvcm1hdEluZGV4XTsKKyAgICBmb3IgKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA6IHByb2ZpbGVzLmdldFN1cHBvcnRlZEZvcm1hdHMoKSkgewogICAgICAgICBDaGFubmVsc1ZlY3RvciBjaGFubmVsTWFza3M7CiAgICAgICAgIFNhbXBsZVJhdGVWZWN0b3Igc2FtcGxpbmdSYXRlczsKICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcmVxdWVzdGVkUGFyYW1ldGVyczsKQEAgLTU2ODcsNCArNTYyNSw0IEBACiAgICAgfQogfQogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuaAppbmRleCAyZDQxYmQxLi42MTFlZGVjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuaApAQCAtMTYsNiArMTYsOSBAQAogCiAjcHJhZ21hIG9uY2UKIAorI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxtZW1vcnk+CisKICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxjdXRpbHMvY29uZmlnX3V0aWxzLmg+CkBAIC0zMSw2ICszNCw3IEBACiAjaW5jbHVkZSA8QXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8QXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIuaD4KICNpbmNsdWRlIDxBdWRpb0dhaW4uaD4KKyNpbmNsdWRlIDxBdWRpb1BvbGljeUNvbmZpZy5oPgogI2luY2x1ZGUgPEF1ZGlvUG9ydC5oPgogI2luY2x1ZGUgPEF1ZGlvUGF0Y2guaD4KICNpbmNsdWRlIDxEZXZpY2VEZXNjcmlwdG9yLmg+CkBAIC0yMzIsNiArMjM2LDIxIEBACiAgICAgICAgIHJvdXRpbmdfc3RyYXRlZ3kgZ2V0U3RyYXRlZ3koYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0OwogCiBwcm90ZWN0ZWQ6CisgICAgICAgIC8vIEEgY29uc3RydWN0b3IgdGhhdCBhbGxvd3MgbW9yZSBmaW5lLWdyYWluZWQgY29udHJvbCBvdmVyIGluaXRpYWxpemF0aW9uIHByb2Nlc3MsCisgICAgICAgIC8vIHVzZWQgaW4gYXV0b21hdGljIHRlc3RzLgorICAgICAgICBBdWRpb1BvbGljeU1hbmFnZXIoQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSwgYm9vbCBmb3JUZXN0aW5nKTsKKworICAgICAgICAvLyBUaGVzZSBtZXRob2RzIHNob3VsZCBiZSB1c2VkIHdoZW4gZmluZXIgY29udHJvbCBvdmVyIEFQTSBpbml0aWFsaXphdGlvbgorICAgICAgICAvLyBpcyBuZWVkZWQsIGUuZy4gaW4gdGVzdHMuIE11c3QgYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBjb25zdHJ1Y3RvcgorICAgICAgICAvLyB0aGF0IG9ubHkgcGVyZm9ybXMgZmllbGRzIGluaXRpYWxpemF0aW9uLiBUaGUgcHVibGljIGNvbnN0cnVjdG9yIGNvbXByaXNlcworICAgICAgICAvLyB0aGVzZSBzdGVwcyBpbiB0aGUgZm9sbG93aW5nIHNlcXVlbmNlOgorICAgICAgICAvLyAgIC0gZmllbGQgaW5pdGlhbGl6aW5nIGNvbnN0cnVjdG9yOworICAgICAgICAvLyAgIC0gbG9hZENvbmZpZzsKKyAgICAgICAgLy8gICAtIGluaXRpYWxpemUuCisgICAgICAgIEF1ZGlvUG9saWN5Q29uZmlnJiBnZXRDb25maWcoKSB7IHJldHVybiBtQ29uZmlnOyB9CisgICAgICAgIHZvaWQgbG9hZENvbmZpZygpOworICAgICAgICBzdGF0dXNfdCBpbml0aWFsaXplKCk7CisKICAgICAgICAgLy8gRnJvbSBBdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlcgogICAgICAgICB2aXJ0dWFsIGNvbnN0IEF1ZGlvUGF0Y2hDb2xsZWN0aW9uICZnZXRBdWRpb1BhdGNoZXMoKSBjb25zdAogICAgICAgICB7CkBAIC0yNjYsNyArMjg1LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIG1EZWZhdWx0T3V0cHV0RGV2aWNlOwogICAgICAgICB9Ci1wcm90ZWN0ZWQ6CisKICAgICAgICAgdm9pZCBhZGRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCBjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MpOwogICAgICAgICB2b2lkIHJlbW92ZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOwogICAgICAgICB2b2lkIGFkZElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LCBjb25zdCBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4mIGlucHV0RGVzYyk7CkBAIC00NjgsNiArNDg3LDkgQEAKICAgICAgICAgfQogCiAgICAgICAgIHVpbnQzMl90IHVwZGF0ZUNhbGxSb3V0aW5nKGF1ZGlvX2RldmljZXNfdCByeERldmljZSwgdWludDMyX3QgZGVsYXlNcyA9IDApOworICAgICAgICBzcDxBdWRpb1BhdGNoPiBjcmVhdGVUZWxlcGhvbnlQYXRjaChib29sIGlzUngsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIHVpbnQzMl90IGRlbGF5TXMpOworICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBmaWxsQXVkaW9Qb3J0Q29uZmlnRm9yRGV2aWNlKAorICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVZlY3RvciYgZGV2aWNlcywgYXVkaW9fZGV2aWNlc190IGRldmljZSwgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7CiAKICAgICAgICAgLy8gaWYgYXJndW1lbnQgImRldmljZSIgaXMgZGlmZmVyZW50IGZyb20gQVVESU9fREVWSUNFX05PTkUsICBzdGFydFNvdXJjZSgpIHdpbGwgZm9yY2UKICAgICAgICAgLy8gdGhlIHJlLWV2YWx1YXRpb24gb2YgdGhlIG91dHB1dCBkZXZpY2UuCkBAIC01MjEsMTggKzU0MywyMCBAQAogICAgICAgICBTZXNzaW9uUm91dGVNYXAgbU91dHB1dFJvdXRlcyA9IFNlc3Npb25Sb3V0ZU1hcChTZXNzaW9uUm91dGVNYXA6Ok1BUFRZUEVfT1VUUFVUKTsKICAgICAgICAgU2Vzc2lvblJvdXRlTWFwIG1JbnB1dFJvdXRlcyA9IFNlc3Npb25Sb3V0ZU1hcChTZXNzaW9uUm91dGVNYXA6Ok1BUFRZUEVfSU5QVVQpOwogCi0gICAgICAgIElWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uICptVm9sdW1lQ3VydmVzOyAvLyBWb2x1bWUgQ3VydmVzIHBlciB1c2UgY2FzZSBhbmQgZGV2aWNlIGNhdGVnb3J5Ci0KICAgICAgICAgYm9vbCAgICBtTGltaXRSaW5ndG9uZVZvbHVtZTsgICAgICAgIC8vIGxpbWl0IHJpbmd0b25lIHZvbHVtZSB0byBtdXNpYyB2b2x1bWUgaWYgaGVhZHNldCBjb25uZWN0ZWQKICAgICAgICAgYXVkaW9fZGV2aWNlc190IG1EZXZpY2VGb3JTdHJhdGVneVtOVU1fU1RSQVRFR0lFU107CiAgICAgICAgIGZsb2F0ICAgbUxhc3RWb2ljZVZvbHVtZTsgICAgICAgICAgICAvLyBsYXN0IHZvaWNlIHZvbHVtZSB2YWx1ZSBzZW50IHRvIGF1ZGlvIEhBTAotCi0gICAgICAgIEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uIG1FZmZlY3RzOyAgLy8gbGlzdCBvZiByZWdpc3RlcmVkIGF1ZGlvIGVmZmVjdHMKICAgICAgICAgYm9vbCAgICBtQTJkcFN1c3BlbmRlZDsgIC8vIHRydWUgaWYgQTJEUCBvdXRwdXQgaXMgc3VzcGVuZGVkCi0gICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IG1EZWZhdWx0T3V0cHV0RGV2aWNlOyAvLyBvdXRwdXQgZGV2aWNlIHNlbGVjdGVkIGJ5IGRlZmF1bHQgYXQgYm9vdCB0aW1lCi0gICAgICAgIEh3TW9kdWxlQ29sbGVjdGlvbiBtSHdNb2R1bGVzOwogCi0gICAgICAgIHZvbGF0aWxlIGludDMyX3QgbUF1ZGlvUG9ydEdlbmVyYXRpb247CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxJVm9sdW1lQ3VydmVzQ29sbGVjdGlvbj4gbVZvbHVtZUN1cnZlczsgLy8gVm9sdW1lIEN1cnZlcyBwZXIgdXNlIGNhc2UgYW5kIGRldmljZSBjYXRlZ29yeQorICAgICAgICBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbiBtRWZmZWN0czsgIC8vIGxpc3Qgb2YgcmVnaXN0ZXJlZCBhdWRpbyBlZmZlY3RzCisgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IG1EZWZhdWx0T3V0cHV0RGV2aWNlOyAvLyBvdXRwdXQgZGV2aWNlIHNlbGVjdGVkIGJ5IGRlZmF1bHQgYXQgYm9vdCB0aW1lCisgICAgICAgIEh3TW9kdWxlQ29sbGVjdGlvbiBtSHdNb2R1bGVzOyAvLyBjb250YWlucyBvbmx5IG1vZHVsZXMgdGhhdCBoYXZlIGJlZW4gbG9hZGVkIHN1Y2Nlc3NmdWxseQorICAgICAgICBId01vZHVsZUNvbGxlY3Rpb24gbUh3TW9kdWxlc0FsbDsgLy8gbm9ybWFsbHkgbm90IG5lZWRlZCwgdXNlZCBkdXJpbmcgY29uc3RydWN0aW9uIGFuZCBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGR1bXBzCisgICAgICAgIEF1ZGlvUG9saWN5Q29uZmlnIG1Db25maWc7CisKKyAgICAgICAgc3RkOjphdG9taWM8dWludDMyX3Q+IG1BdWRpb1BvcnRHZW5lcmF0aW9uOwogCiAgICAgICAgIEF1ZGlvUGF0Y2hDb2xsZWN0aW9uIG1BdWRpb1BhdGNoZXM7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lDbGllbnRJbXBsLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lDbGllbnRJbXBsLmNwcAppbmRleCAzMWM5NTc1Li5iMDY0ZjhjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5Q2xpZW50SW1wbC5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUNsaWVudEltcGwuY3BwCkBAIC0yMzMsNCArMjMzLDQgQEAKICAgICByZXR1cm4gQXVkaW9TeXN0ZW06Om5ld0F1ZGlvVW5pcXVlSWQodXNlKTsKIH0KIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmNwcAppbmRleCA4NGIxMDczLi43ZmUzNjNkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuY3BwCkBAIC03NDQsNCArNzQ0LDQgQEAKIH0KIAogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmgKaW5kZXggNTlkNWQxNC4uNjIzMTgwZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5oCkBAIC0xOTIsNiArMTkyLDYgQEAKICAgICBLZXllZFZlY3RvcjwgYXVkaW9fc2Vzc2lvbl90LCBFZmZlY3RWZWN0b3IqID4gbU91dHB1dFNlc3Npb25zOwogfTsKIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmIC8vIEFORFJPSURfQVVESU9QT0xJQ1lFRkZFQ1RTX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsLmNwcAppbmRleCAxZWU1Y2NmLi43ZGQ2ZDcwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbC5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUludGVyZmFjZUltcGwuY3BwCkBAIC03NzgsNCArNzc4LDQgQEAKIH0KIAogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuY3BwCmluZGV4IDdhZjJlNzQuLmFmMGM4MjMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5jcHAKQEAgLTExNDYsNCArMTE0Niw0IEBACiBpbnQgYXBzX3NldF92b2ljZV92b2x1bWUodm9pZCAqc2VydmljZSwgZmxvYXQgdm9sdW1lLCBpbnQgZGVsYXlfbXMpOwogfTsKIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5oCmluZGV4IDI2ODY5N2UuLjgzM2EyMzAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuaApAQCAtNTc3LDYgKzU3Nyw2IEBACiAgICAgYXVkaW9fbW9kZV90IG1QaG9uZVN0YXRlOwogfTsKIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmIC8vIEFORFJPSURfQVVESU9QT0xJQ1lTRVJWSUNFX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0M2RhZWEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzIgQEAKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5IFwKKyAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZSBcCisgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZSBcCisgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvdXRpbGl0aWVzCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorICBsaWJhdWRpb3BvbGljeW1hbmFnZXJkZWZhdWx0IFwKKyAgbGliYmFzZSBcCisgIGxpYmxvZyBcCisgIGxpYm1lZGlhX2hlbHBlciBcCisgIGxpYnV0aWxzIFwKKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCisgIGxpYmF1ZGlvcG9saWN5Y29tcG9uZW50cyBcCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgIGF1ZGlvcG9saWN5bWFuYWdlcl90ZXN0cy5jcHAgXAorCitMT0NBTF9NT0RVTEUgOj0gYXVkaW9wb2xpY3lfdGVzdHMKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKKworTE9DQUxfQ0ZMQUdTIDo9IC1XZXJyb3IgLVdhbGwKKworTE9DQUxfTVVMVElMSUIgOj0gJChBVURJT1NFUlZFUl9NVUxUSUxJQikKKworaW5jbHVkZSAkKEJVSUxEX05BVElWRV9URVNUKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQXVkaW9Qb2xpY3lUZXN0Q2xpZW50LmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BdWRpb1BvbGljeVRlc3RDbGllbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTA0NTBkCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQXVkaW9Qb2xpY3lUZXN0Q2xpZW50LmgKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkF1ZGlvUG9saWN5SW50ZXJmYWNlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQXVkaW9Qb2xpY3lUZXN0Q2xpZW50IDogcHVibGljIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlCit7CitwdWJsaWM6CisgICAgdmlydHVhbCB+QXVkaW9Qb2xpY3lUZXN0Q2xpZW50KCkgPSBkZWZhdWx0OworCisgICAgLy8gQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgSW1wbGVtZW50YXRpb24KKyAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbG9hZEh3TW9kdWxlKGNvbnN0IGNoYXIqIC8qbmFtZSovKSBvdmVycmlkZSB7IHJldHVybiAwOyB9CisgICAgc3RhdHVzX3Qgb3Blbk91dHB1dChhdWRpb19tb2R1bGVfaGFuZGxlX3QgLyptb2R1bGUqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90KiAvKm91dHB1dCovLAorICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QqIC8qY29uZmlnKi8sCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QqIC8qZGV2aWNlcyovLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgLyphZGRyZXNzKi8sCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogLypsYXRlbmN5TXMqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IC8qZmxhZ3MqLykgb3ZlcnJpZGUgeyByZXR1cm4gMDsgfQorICAgIGF1ZGlvX2lvX2hhbmRsZV90IG9wZW5EdXBsaWNhdGVPdXRwdXQoYXVkaW9faW9faGFuZGxlX3QgLypvdXRwdXQxKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAvKm91dHB1dDIqLykgb3ZlcnJpZGUgeyByZXR1cm4gMDsgfQorICAgIHN0YXR1c190IGNsb3NlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IC8qb3V0cHV0Ki8pIG92ZXJyaWRlIHsgcmV0dXJuIDA7IH0KKyAgICBzdGF0dXNfdCBzdXNwZW5kT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IC8qb3V0cHV0Ki8pIG92ZXJyaWRlIHsgcmV0dXJuIDA7IH0KKyAgICBzdGF0dXNfdCByZXN0b3JlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IC8qb3V0cHV0Ki8pIG92ZXJyaWRlIHsgcmV0dXJuIDA7IH0KKyAgICBzdGF0dXNfdCBvcGVuSW5wdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IC8qbW9kdWxlKi8sCisgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90KiAvKmlucHV0Ki8sCisgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190KiAvKmNvbmZpZyovLAorICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QqIC8qZGV2aWNlKi8sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIC8qYWRkcmVzcyovLAorICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCAvKnNvdXJjZSovLAorICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IC8qZmxhZ3MqLykgb3ZlcnJpZGUgeyByZXR1cm4gMDsgfQorICAgIHN0YXR1c190IGNsb3NlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgLyppbnB1dCovKSBvdmVycmlkZSB7IHJldHVybiAwOyB9CisgICAgc3RhdHVzX3Qgc2V0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3QgLypzdHJlYW0qLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgLyp2b2x1bWUqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgLypvdXRwdXQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qZGVsYXlNcyovKSBvdmVycmlkZSB7IHJldHVybiAwOyB9CisgICAgc3RhdHVzX3QgaW52YWxpZGF0ZVN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IC8qc3RyZWFtKi8pIG92ZXJyaWRlIHsgcmV0dXJuIDA7IH0KKyAgICB2b2lkIHNldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgLyppb0hhbmRsZSovLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiAvKmtleVZhbHVlUGFpcnMqLywKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qZGVsYXlNcyovKSBvdmVycmlkZSB7IH0KKyAgICBTdHJpbmc4IGdldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgLyppb0hhbmRsZSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiAvKmtleXMqLykgb3ZlcnJpZGUgeyByZXR1cm4gU3RyaW5nOCgpOyB9CisgICAgc3RhdHVzX3Qgc3RhcnRUb25lKGF1ZGlvX3BvbGljeV90b25lX3QgLyp0b25lKi8sCisgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgLypzdHJlYW0qLykgb3ZlcnJpZGUgeyByZXR1cm4gMDsgfQorICAgIHN0YXR1c190IHN0b3BUb25lKCkgb3ZlcnJpZGUgeyByZXR1cm4gMDsgfQorICAgIHN0YXR1c190IHNldFZvaWNlVm9sdW1lKGZsb2F0IC8qdm9sdW1lKi8sIGludCAvKmRlbGF5TXMqLykgb3ZlcnJpZGUgeyByZXR1cm4gMDsgfQorICAgIHN0YXR1c190IG1vdmVFZmZlY3RzKGF1ZGlvX3Nlc3Npb25fdCAvKnNlc3Npb24qLywKKyAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAvKnNyY091dHB1dCovLAorICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IC8qZHN0T3V0cHV0Ki8pIG92ZXJyaWRlIHsgcmV0dXJuIDA7IH0KKyAgICBzdGF0dXNfdCBjcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCogLypwYXRjaCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QqIC8qaGFuZGxlKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLypkZWxheU1zKi8pIG92ZXJyaWRlIHsgcmV0dXJuIDA7IH0KKyAgICBzdGF0dXNfdCByZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCAvKmhhbmRsZSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKmRlbGF5TXMqLykgb3ZlcnJpZGUgeyByZXR1cm4gMDsgfQorICAgIHN0YXR1c190IHNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcqIC8qY29uZmlnKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKmRlbGF5TXMqLykgb3ZlcnJpZGUgeyByZXR1cm4gMDsgfQorICAgIHZvaWQgb25BdWRpb1BvcnRMaXN0VXBkYXRlKCkgb3ZlcnJpZGUgeyB9CisgICAgdm9pZCBvbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCkgb3ZlcnJpZGUgeyB9CisgICAgYXVkaW9fdW5pcXVlX2lkX3QgbmV3QXVkaW9VbmlxdWVJZChhdWRpb191bmlxdWVfaWRfdXNlX3QgLyp1c2UqLykgb3ZlcnJpZGUgeyByZXR1cm4gMDsgfQorICAgIHZvaWQgb25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoU3RyaW5nOCAvKnJlZ0lkKi8sIGludDMyX3QgLypzdGF0ZSovKSBvdmVycmlkZSB7IH0KKyAgICB2b2lkIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgLypldmVudCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190KiAvKmNsaWVudEluZm8qLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnX2Jhc2UqIC8qY2xpZW50Q29uZmlnKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZ19iYXNlKiAvKmRldmljZUNvbmZpZyovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IC8qcGF0Y2hIYW5kbGUqLykgb3ZlcnJpZGUgeyB9Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BdWRpb1BvbGljeVRlc3RNYW5hZ2VyLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BdWRpb1BvbGljeVRlc3RNYW5hZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU1NDNhNgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0F1ZGlvUG9saWN5VGVzdE1hbmFnZXIuaApAQCAtMCwwICsxLDMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAibWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQXVkaW9Qb2xpY3lUZXN0TWFuYWdlciA6IHB1YmxpYyBBdWRpb1BvbGljeU1hbmFnZXIgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQgQXVkaW9Qb2xpY3lUZXN0TWFuYWdlcihBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKQorICAgICAgICAgICAgOiBBdWRpb1BvbGljeU1hbmFnZXIoY2xpZW50SW50ZXJmYWNlLCB0cnVlIC8qZm9yVGVzdGluZyovKSB7IH0KKyAgICB1c2luZyBBdWRpb1BvbGljeU1hbmFnZXI6OmdldENvbmZpZzsKKyAgICB1c2luZyBBdWRpb1BvbGljeU1hbmFnZXI6OmluaXRpYWxpemU7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvYXVkaW9wb2xpY3ltYW5hZ2VyX3Rlc3RzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL2F1ZGlvcG9saWN5bWFuYWdlcl90ZXN0cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUyNmFiMAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL2F1ZGlvcG9saWN5bWFuYWdlcl90ZXN0cy5jcHAKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSAiQXVkaW9Qb2xpY3lUZXN0Q2xpZW50LmgiCisjaW5jbHVkZSAiQXVkaW9Qb2xpY3lUZXN0TWFuYWdlci5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworVEVTVChBdWRpb1BvbGljeU1hbmFnZXIsIEluaXRGYWlsdXJlKSB7CisgICAgQXVkaW9Qb2xpY3lUZXN0Q2xpZW50IGNsaWVudDsKKyAgICBBdWRpb1BvbGljeVRlc3RNYW5hZ2VyIG1hbmFnZXIoJmNsaWVudCk7CisgICAgbWFuYWdlci5nZXRDb25maWcoKS5zZXREZWZhdWx0KCk7CisgICAgLy8gU2luY2UgdGhlIGRlZmF1bHQgY2xpZW50IGZhaWxzIHRvIG9wZW4gYW55dGhpbmcsCisgICAgLy8gQVBNIHNob3VsZCBpbmRpY2F0ZSB0aGF0IHRoZSBpbml0aWFsaXphdGlvbiBkaWRuJ3Qgc3VjY2VlZC4KKyAgICBBU1NFUlRfRVEoTk9fSU5JVCwgbWFuYWdlci5pbml0aWFsaXplKCkpOworICAgIEFTU0VSVF9FUShOT19JTklULCBtYW5hZ2VyLmluaXRDaGVjaygpKTsKK30KKworCisvLyBBIGNsaWVudCB0aGF0IHByb3ZpZGVzIGNvcnJlY3QgbW9kdWxlIGFuZCBJTyBoYW5kbGVzIGZvciBpbnB1dHMgYW5kIG91dHB1dHMuCitjbGFzcyBBdWRpb1BvbGljeVRlc3RDbGllbnRXaXRoTW9kdWxlc0lvSGFuZGxlcyA6IHB1YmxpYyBBdWRpb1BvbGljeVRlc3RDbGllbnQgeworICBwdWJsaWM6CisgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IGxvYWRId01vZHVsZShjb25zdCBjaGFyKiAvKm5hbWUqLykgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbU5leHRNb2R1bGUrKzsKKyAgICB9CisgICAgc3RhdHVzX3Qgb3Blbk91dHB1dChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QqIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190KiAvKmNvbmZpZyovLAorICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190KiAvKmRldmljZXMqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIC8qYWRkcmVzcyovLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIC8qbGF0ZW5jeU1zKi8sCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCAvKmZsYWdzKi8pIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKG1vZHVsZSA+PSBtTmV4dE1vZHVsZSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBNb2R1bGUgaGFuZGxlICVkIGhhcyBub3QgYmVlbiBhbGxvY2F0ZWQgeWV0IChuZXh0IGlzICVkKSIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtb2R1bGUsIG1OZXh0TW9kdWxlKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgKm91dHB1dCA9IG1OZXh0SW9IYW5kbGUrKzsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKyAgICBzdGF0dXNfdCBvcGVuSW5wdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QqIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCogLypjb25maWcqLywKKyAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190KiAvKmRldmljZSovLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiAvKmFkZHJlc3MqLywKKyAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgLypzb3VyY2UqLywKKyAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCAvKmZsYWdzKi8pIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKG1vZHVsZSA+PSBtTmV4dE1vZHVsZSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBNb2R1bGUgaGFuZGxlICVkIGhhcyBub3QgYmVlbiBhbGxvY2F0ZWQgeWV0IChuZXh0IGlzICVkKSIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtb2R1bGUsIG1OZXh0TW9kdWxlKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgKmlucHV0ID0gbU5leHRJb0hhbmRsZSsrOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorICBwcml2YXRlOgorICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtTmV4dE1vZHVsZSA9IEFVRElPX01PRFVMRV9IQU5ETEVfTk9ORSArIDE7CisgICAgYXVkaW9faW9faGFuZGxlX3QgbU5leHRJb0hhbmRsZSA9IEFVRElPX0lPX0hBTkRMRV9OT05FICsgMTsKK307CisKK1RFU1QoQXVkaW9Qb2xpY3lNYW5hZ2VyLCBJbml0U3VjY2VzcykgeworICAgIEF1ZGlvUG9saWN5VGVzdENsaWVudFdpdGhNb2R1bGVzSW9IYW5kbGVzIGNsaWVudDsKKyAgICBBdWRpb1BvbGljeVRlc3RNYW5hZ2VyIG1hbmFnZXIoJmNsaWVudCk7CisgICAgbWFuYWdlci5nZXRDb25maWcoKS5zZXREZWZhdWx0KCk7CisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtYW5hZ2VyLmluaXRpYWxpemUoKSk7CisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtYW5hZ2VyLmluaXRDaGVjaygpKTsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAKaW5kZXggMjBiZDVlNC4uNmFiZmE4MSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAKQEAgLTI0MywyOSArMjQzLDEwIEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoIWNhbWVyYUZvdW5kKSB7Ci0gICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYVJlc291cmNlQ29zdCBjb3N0OwotICAgICAgICAgICAgcmVzID0gbUNhbWVyYVByb3ZpZGVyTWFuYWdlci0+Z2V0UmVzb3VyY2VDb3N0KGNhbWVyYUlkLCAmY29zdCk7Ci0gICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBxdWVyeSBkZXZpY2UgcmVzb3VyY2UgY29zdDogJXMgKCVkKSIsIHN0cmVycm9yKC1yZXMpLCByZXMpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RkOjpzZXQ8U3RyaW5nOD4gY29uZmxpY3Rpbmc7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvc3QuY29uZmxpY3RpbmdEZXZpY2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgY29uZmxpY3RpbmcuZW1wbGFjZShTdHJpbmc4KGNvc3QuY29uZmxpY3RpbmdEZXZpY2VzW2ldLmNfc3RyKCkpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1DYW1lcmFTdGF0ZXNMb2NrKTsKLSAgICAgICAgICAgICAgICBtQ2FtZXJhU3RhdGVzLmVtcGxhY2UoaWQ4LAotICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPENhbWVyYVN0YXRlPihpZDgsIGNvc3QucmVzb3VyY2VDb3N0LCBjb25mbGljdGluZykpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgYWRkU3RhdGVzKGlkOCk7CiAgICAgICAgIH0KIAogICAgICAgICBvbkRldmljZVN0YXR1c0NoYW5nZWQoaWQ4LCBDYW1lcmFEZXZpY2VTdGF0dXM6OlBSRVNFTlQpOwotCi0gICAgICAgIGlmIChtRmxhc2hsaWdodC0+aGFzRmxhc2hVbml0KGlkOCkpIHsKLSAgICAgICAgICAgIG1Ub3JjaFN0YXR1c01hcC5hZGQoaWQ4LCBUb3JjaE1vZGVTdGF0dXM6OkFWQUlMQUJMRV9PRkYpOwotICAgICAgICB9CiAgICAgfQogCiAgICAgcmV0dXJuIE9LOwpAQCAtMzAwLDYgKzI4MSwzMSBAQAogICAgIGVudW1lcmF0ZVByb3ZpZGVycygpOwogfQogCit2b2lkIENhbWVyYVNlcnZpY2U6OmFkZFN0YXRlcyhjb25zdCBTdHJpbmc4IGlkKSB7CisgICAgc3RkOjpzdHJpbmcgY2FtZXJhSWQoaWQuY19zdHIoKSk7CisgICAgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFSZXNvdXJjZUNvc3QgY29zdDsKKyAgICBzdGF0dXNfdCByZXMgPSBtQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLT5nZXRSZXNvdXJjZUNvc3QoY2FtZXJhSWQsICZjb3N0KTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcXVlcnkgZGV2aWNlIHJlc291cmNlIGNvc3Q6ICVzICglZCkiLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzdGQ6OnNldDxTdHJpbmc4PiBjb25mbGljdGluZzsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvc3QuY29uZmxpY3RpbmdEZXZpY2VzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbmZsaWN0aW5nLmVtcGxhY2UoU3RyaW5nOChjb3N0LmNvbmZsaWN0aW5nRGV2aWNlc1tpXS5jX3N0cigpKSk7CisgICAgfQorCisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtQ2FtZXJhU3RhdGVzTG9jayk7CisgICAgICAgIG1DYW1lcmFTdGF0ZXMuZW1wbGFjZShpZCwgc3RkOjptYWtlX3NoYXJlZDxDYW1lcmFTdGF0ZT4oaWQsIGNvc3QucmVzb3VyY2VDb3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZsaWN0aW5nKSk7CisgICAgfQorCisgICAgaWYgKG1GbGFzaGxpZ2h0LT5oYXNGbGFzaFVuaXQoaWQpKSB7CisgICAgICAgIG1Ub3JjaFN0YXR1c01hcC5hZGQoaWQsIFRvcmNoTW9kZVN0YXR1czo6QVZBSUxBQkxFX09GRik7CisgICAgfQorICAgIGxvZ0RldmljZUFkZGVkKGlkLCAiRGV2aWNlIGFkZGVkIik7Cit9CisKIHZvaWQgQ2FtZXJhU2VydmljZTo6b25EZXZpY2VTdGF0dXNDaGFuZ2VkKGNvbnN0IFN0cmluZzgmIGlkLAogICAgICAgICBDYW1lcmFEZXZpY2VTdGF0dXMgbmV3SGFsU3RhdHVzKSB7CiAgICAgQUxPR0koIiVzOiBTdGF0dXMgY2hhbmdlZCBmb3IgY2FtZXJhSWQ9JXMsIG5ld1N0YXR1cz0lZCIsIF9fRlVOQ1RJT05fXywKQEAgLTMxMSw4ICszMTcsMTMgQEAKIAogICAgIGlmIChzdGF0ZSA9PSBudWxscHRyKSB7CiAgICAgICAgIGlmIChuZXdTdGF0dXMgPT0gU3RhdHVzSW50ZXJuYWw6OlBSRVNFTlQpIHsKLSAgICAgICAgICAgIEFMT0dXKCIlczogVW5rbm93biBjYW1lcmEgSUQgJXMsIHByb2JhYmx5IG5ld2x5IHJlZ2lzdGVyZWQ/IiwKKyAgICAgICAgICAgIEFMT0dJKCIlczogVW5rbm93biBjYW1lcmEgSUQgJXMsIGEgbmV3IGNhbWVyYSBpcyBhZGRlZCIsCiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuc3RyaW5nKCkpOworCisgICAgICAgICAgICAvLyBGaXJzdCBhZGQgYXMgYWJzZW50IHRvIG1ha2Ugc3VyZSBjbGllbnRzIGFyZSBub3RpZmllZCBiZWxvdworICAgICAgICAgICAgYWRkU3RhdGVzKGlkKTsKKworICAgICAgICAgICAgdXBkYXRlU3RhdHVzKG5ld1N0YXR1cywgaWQpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBCYWQgY2FtZXJhIElEICVzIiwgX19GVU5DVElPTl9fLCBpZC5zdHJpbmcoKSk7CiAgICAgICAgIH0KQEAgLTIyMjksOCArMjI0MCwxMSBAQAogICAgICAgICAgICAgICAgIG1DbGllbnRQYWNrYWdlTmFtZSk7CiAgICAgICAgIG1PcHNBY3RpdmUgPSBmYWxzZTsKIAorICAgICAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGEgY2xpZW50IGRpc2Nvbm5lY3RzLiBUaGlzIHNob3VsZAorICAgICAgICAvLyByZWxlYXNlIHRoZSBjYW1lcmEsIGJ1dCBhY3R1YWxseSBvbmx5IGlmIGl0IHdhcyBpbiBhIHByb3BlcgorICAgICAgICAvLyBmdW5jdGlvbmFsIHN0YXRlLCBpLmUuIHdpdGggc3RhdHVzIE5PVF9BVkFJTEFCTEUKICAgICAgICAgc3RkOjppbml0aWFsaXplcl9saXN0PFN0YXR1c0ludGVybmFsPiByZWplY3RlZCA9IHtTdGF0dXNJbnRlcm5hbDo6UFJFU0VOVCwKLSAgICAgICAgICAgICAgICBTdGF0dXNJbnRlcm5hbDo6RU5VTUVSQVRJTkd9OworICAgICAgICAgICAgICAgIFN0YXR1c0ludGVybmFsOjpFTlVNRVJBVElORywgU3RhdHVzSW50ZXJuYWw6Ok5PVF9QUkVTRU5UfTsKIAogICAgICAgICAvLyBUcmFuc2l0aW9uIHRvIFBSRVNFTlQgaWYgdGhlIGNhbWVyYSBpcyBub3QgaW4gZWl0aGVyIG9mIHRoZSByZWplY3RlZCBzdGF0ZXMKICAgICAgICAgc0NhbWVyYVNlcnZpY2UtPnVwZGF0ZVN0YXR1cyhTdGF0dXNJbnRlcm5hbDo6UFJFU0VOVCwKQEAgLTIzMjIsNyArMjMzNiw3IEBACiAKIENhbWVyYVNlcnZpY2U6OkNhbWVyYVN0YXRlOjpDYW1lcmFTdGF0ZShjb25zdCBTdHJpbmc4JiBpZCwgaW50IGNvc3QsCiAgICAgICAgIGNvbnN0IHN0ZDo6c2V0PFN0cmluZzg+JiBjb25mbGljdGluZykgOiBtSWQoaWQpLAotICAgICAgICBtU3RhdHVzKFN0YXR1c0ludGVybmFsOjpQUkVTRU5UKSwgbUNvc3QoY29zdCksIG1Db25mbGljdGluZyhjb25mbGljdGluZykge30KKyAgICAgICAgbVN0YXR1cyhTdGF0dXNJbnRlcm5hbDo6Tk9UX1BSRVNFTlQpLCBtQ29zdChjb3N0KSwgbUNvbmZsaWN0aW5nKGNvbmZsaWN0aW5nKSB7fQogCiBDYW1lcmFTZXJ2aWNlOjpDYW1lcmFTdGF0ZTo6fkNhbWVyYVN0YXRlKCkge30KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oCmluZGV4IDZkNWRkZTguLmU5MzczYTYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmgKQEAgLTUxMiw2ICs1MTIsOSBAQAogICAgIC8vIEV1bWVyYXRlIGFsbCBjYW1lcmEgcHJvdmlkZXJzIGluIHRoZSBzeXN0ZW0KICAgICBzdGF0dXNfdCBlbnVtZXJhdGVQcm92aWRlcnMoKTsKIAorICAgIC8vIEFkZCBhIG5ldyBjYW1lcmEgdG8gY2FtZXJhIGFuZCB0b3JjaCBzdGF0ZSBsaXN0cworICAgIHZvaWQgYWRkU3RhdGVzKGNvbnN0IFN0cmluZzggaWQpOworCiAgICAgLy8gQ2hlY2sgaWYgd2UgY2FuIGNvbm5lY3QsIGJlZm9yZSB3ZSBhY3F1aXJlIHRoZSBzZXJ2aWNlIGxvY2suCiAgICAgLy8gVGhlIHJldHVybmVkIG9yaWdpbmFsQ2xpZW50UGlkIGlzIHRoZSBQSUQgb2YgdGhlIG9yaWdpbmFsIHByb2Nlc3MgdGhhdCB3YW50cyB0byBjb25uZWN0IHRvCiAgICAgLy8gY2FtZXJhLgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuY3BwCmluZGV4IGEzNzZhYjQuLjI0YjA4MTYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAKQEAgLTY3Miw3ICs2NzIsNyBAQAogCiAgICAgaWYgKG1JbnB1dFN0cmVhbS5jb25maWd1cmVkKSB7CiAgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgJXM6IEFscmVhZHkgaGFzIGFuIGlucHV0IHN0cmVhbSAiCi0gICAgICAgICAgICAgICAgImNvbmZpZ3VyZWQgKElEICV6ZCkiLCBtQ2FtZXJhSWRTdHIuc3RyaW5nKCksIG1JbnB1dFN0cmVhbS5pZCk7CisgICAgICAgICAgICAgICAgImNvbmZpZ3VyZWQgKElEICVkKSIsIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwgbUlucHV0U3RyZWFtLmlkKTsKICAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpICk7CiAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfQUxSRUFEWV9FWElTVFMsIG1zZy5zdHJpbmcoKSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtU3BsaXR0ZXIuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtU3BsaXR0ZXIuY3BwCmluZGV4IDQ5YTEwZGMuLmJjMTJmMzkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbVNwbGl0dGVyLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1TcGxpdHRlci5jcHAKQEAgLTI3NSw5ICsyNzUsMTcgQEAKICAgICAvL3N0aWxsIGF0dGFjaGVkIHRvIHRoZSByZW1vdmVkIHN1cmZhY2UuCiAgICAgc3RkOjp2ZWN0b3I8dWludDY0X3Q+IHBlbmRpbmdCdWZmZXJJZHM7CiAgICAgYXV0byYgb3V0cHV0U2xvdHMgPSAqbU91dHB1dFNsb3RzW2dicF07Ci0gICAgZm9yIChjb25zdCBhdXRvICZpdCA6IG91dHB1dFNsb3RzKSB7Ci0gICAgICAgIGlmIChpdC5nZXQoKSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICBwZW5kaW5nQnVmZmVySWRzLnB1c2hfYmFjayhpdC0+Z2V0SWQoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRwdXRTbG90cy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAob3V0cHV0U2xvdHNbaV0gIT0gbnVsbHB0cikgeworICAgICAgICAgICAgcGVuZGluZ0J1ZmZlcklkcy5wdXNoX2JhY2sob3V0cHV0U2xvdHNbaV0tPmdldElkKCkpOworICAgICAgICAgICAgYXV0byByYyA9IGdicC0+ZGV0YWNoQnVmZmVyKGkpOworICAgICAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgLy9CdWZmZXJzIHRoYXQgZmFpbCB0byBkZXRhY2ggaGVyZSB3aWxsIGJlIHNjaGVkdWxlZCBmb3IgZGV0YWNoIGluIHRoZQorICAgICAgICAgICAgICAgIC8vaW5wdXQgYnVmZmVyIHF1ZXVlIGFuZCB0aGUgcmVzdCBvZiB0aGUgcmVnaXN0ZXJlZCBvdXRwdXRzIGluc3RlYWQuCisgICAgICAgICAgICAgICAgLy9UaGlzIHdpbGwgaGVscCBlbnN1cmUgdGhhdCBjYW1lcmEgc3RvcHMgYWNjZXNzaW5nIGJ1ZmZlcnMgdGhhdCBzdGlsbAorICAgICAgICAgICAgICAgIC8vY2FuIGdldCByZWZlcmVuY2VkIGJ5IHRoZSBkaXNjb25uZWN0ZWQgb3V0cHV0LgorICAgICAgICAgICAgICAgIG1EZXRhY2hlZEJ1ZmZlcnMuZW1wbGFjZShvdXRwdXRTbG90c1tpXS0+Z2V0SWQoKSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAgICAgbU91dHB1dHNbc3VyZmFjZUlkXSA9IG51bGxwdHI7CkBAIC01MjEsMTAgKzUyOSwxMSBAQAogICAgIHVpbnQ2NF90IGJ1ZmZlcklkID0gdHJhY2tlcl9wdHItPmdldEJ1ZmZlcigpLT5nZXRJZCgpOwogICAgIGludCBjb25zdW1lclNsb3QgPSAtMTsKICAgICB1aW50NjRfdCBmcmFtZU51bWJlcjsKLSAgICBmb3IgKGNvbnN0IGF1dG8gJml0IDogbUlucHV0U2xvdHMpIHsKLSAgICAgICAgaWYgKGl0LnNlY29uZC5tR3JhcGhpY0J1ZmZlci0+Z2V0SWQoKSA9PSBidWZmZXJJZCkgewotICAgICAgICAgICAgY29uc3VtZXJTbG90ID0gaXQuc2Vjb25kLm1TbG90OwotICAgICAgICAgICAgZnJhbWVOdW1iZXIgPSBpdC5zZWNvbmQubUZyYW1lTnVtYmVyOworICAgIGF1dG8gaW5wdXRTbG90ID0gbUlucHV0U2xvdHMuYmVnaW4oKTsKKyAgICBmb3IgKDsgaW5wdXRTbG90ICE9IG1JbnB1dFNsb3RzLmVuZCgpOyBpbnB1dFNsb3QrKykgeworICAgICAgICBpZiAoaW5wdXRTbG90LT5zZWNvbmQubUdyYXBoaWNCdWZmZXItPmdldElkKCkgPT0gYnVmZmVySWQpIHsKKyAgICAgICAgICAgIGNvbnN1bWVyU2xvdCA9IGlucHV0U2xvdC0+c2Vjb25kLm1TbG90OworICAgICAgICAgICAgZnJhbWVOdW1iZXIgPSBpbnB1dFNsb3QtPnNlY29uZC5tRnJhbWVOdW1iZXI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KQEAgLTUzMyw2ICs1NDIsMTIgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAorICAgIGF1dG8gZGV0YWNoQnVmZmVyID0gbURldGFjaGVkQnVmZmVycy5maW5kKGJ1ZmZlcklkKTsKKyAgICBib29sIGRldGFjaCA9IChkZXRhY2hCdWZmZXIgIT0gbURldGFjaGVkQnVmZmVycy5lbmQoKSk7CisgICAgaWYgKGRldGFjaCkgeworICAgICAgICBtRGV0YWNoZWRCdWZmZXJzLmVyYXNlKGRldGFjaEJ1ZmZlcik7CisgICAgICAgIG1JbnB1dFNsb3RzLmVyYXNlKGlucHV0U2xvdCk7CisgICAgfQogICAgIC8vIFRlbXBvcmFyaWx5IHVubG9jayBtdXRleCB0byBhdm9pZCBjaXJjdWxhciBsb2NrOgogICAgIC8vIDEuIFRoaXMgZnVuY3Rpb24gaG9sZHMgc3BsaXR0ZXIgbG9jaywgY2FsbHMgcmVsZWFzZUJ1ZmZlciB3aGljaCB0cmlnZ2VycwogICAgIC8vIG9uQnVmZmVyUmVsZWFzZWQgaW4gQ2FtZXJhM091dHB1dFN0cmVhbS4gb25CdWZmZXJSZWxlYXNlZCB3YWl0cyBvbiB0aGUKQEAgLTU0NCwxNSArNTU5LDIzIEBACiAgICAgbU11dGV4LnVubG9jaygpOwogICAgIGludCByZXMgPSBOT19FUlJPUjsKICAgICBpZiAoY29uc3VtZXIgIT0gbnVsbHB0cikgewotICAgICAgICByZXMgPSBjb25zdW1lci0+cmVsZWFzZUJ1ZmZlcihjb25zdW1lclNsb3QsIGZyYW1lTnVtYmVyLAotICAgICAgICAgICAgICAgIEVHTF9OT19ESVNQTEFZLCBFR0xfTk9fU1lOQ19LSFIsIHRyYWNrZXJfcHRyLT5nZXRNZXJnZWRGZW5jZSgpKTsKKyAgICAgICAgaWYgKGRldGFjaCkgeworICAgICAgICAgICAgcmVzID0gY29uc3VtZXItPmRldGFjaEJ1ZmZlcihjb25zdW1lclNsb3QpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzID0gY29uc3VtZXItPnJlbGVhc2VCdWZmZXIoY29uc3VtZXJTbG90LCBmcmFtZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgRUdMX05PX0RJU1BMQVksIEVHTF9OT19TWU5DX0tIUiwgdHJhY2tlcl9wdHItPmdldE1lcmdlZEZlbmNlKCkpOworICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgU1BfTE9HRSgiJXM6IGNvbnN1bWVyIGhhcyBiZWNvbWUgbnVsbCEiLCBfX0ZVTkNUSU9OX18pOwogICAgIH0KICAgICBtTXV0ZXgubG9jaygpOwotICAgIC8vIElmIHRoZSBwcm9kdWNlciBvZiB0aGlzIHF1ZXVlIGlzIGRpc2Nvbm5lY3RlZCwgLTIyIGVycm9yIHdpbGwgb2NjdXIKKwogICAgIGlmIChyZXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgU1BfTE9HRSgiJXM6IHJlbGVhc2VCdWZmZXIgcmV0dXJucyAlZCIsIF9fRlVOQ1RJT05fXywgcmVzKTsKKyAgICAgICAgaWYgKGRldGFjaCkgeworICAgICAgICAgICAgU1BfTE9HRSgiJXM6IGRldGFjaEJ1ZmZlciByZXR1cm5zICVkIiwgX19GVU5DVElPTl9fLCByZXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU1BfTE9HRSgiJXM6IHJlbGVhc2VCdWZmZXIgcmV0dXJucyAlZCIsIF9fRlVOQ1RJT05fXywgcmVzKTsKKyAgICAgICAgfQogICAgIH0KIH0KIApAQCAtNjI2LDYgKzY0OSwxNyBAQAogICAgIFNQX0xPR1YoIiVzOiBkZXF1ZXVlZCBidWZmZXIgJSIgUFJJZDY0ICIgJXAgZnJvbSBvdXRwdXQgJXAiLCBfX0ZVTkNUSU9OX18sCiAgICAgICAgICAgICBidWZmZXItPmdldElkKCksIGJ1ZmZlci5nZXQoKSwgZnJvbS5nZXQoKSk7CiAKKyAgICBhdXRvIGRldGFjaEJ1ZmZlciA9IG1EZXRhY2hlZEJ1ZmZlcnMuZmluZChidWZmZXItPmdldElkKCkpOworICAgIGJvb2wgZGV0YWNoID0gKGRldGFjaEJ1ZmZlciAhPSBtRGV0YWNoZWRCdWZmZXJzLmVuZCgpKTsKKyAgICBpZiAoZGV0YWNoKSB7CisgICAgICAgIHJlcyA9IGZyb20tPmRldGFjaEJ1ZmZlcihzbG90KTsKKyAgICAgICAgaWYgKHJlcyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgb3V0cHV0U2xvdHNbc2xvdF0gPSBudWxscHRyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU1BfTE9HRSgiJXM6IGRldGFjaCBidWZmZXIgZnJvbSBvdXRwdXQgZmFpbGVkICglZCkiLCBfX0ZVTkNUSU9OX18sIHJlcyk7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhpcyBpcyB0aGUgbGFzdCBvdXRzdGFuZGluZyByZWZlcmVuY2UgdG8gdGhpcyBidWZmZXIKICAgICBkZWNyZW1lbnRCdWZSZWZDb3VudExvY2tlZChidWZmZXItPmdldElkKCksIHN1cmZhY2VJZCk7CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1TcGxpdHRlci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtU3BsaXR0ZXIuaAppbmRleCA3MDRmODhmLi43NmE1YjdkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1TcGxpdHRlci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbVNwbGl0dGVyLmgKQEAgLTE3LDYgKzE3LDggQEAKICNpZm5kZWYgQU5EUk9JRF9TRVJWRVJTX1NUUkVBTVNQTElUVEVSX0gKICNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX1NUUkVBTVNQTElUVEVSX0gKIAorI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CisKICNpbmNsdWRlIDxndWkvSUNvbnN1bWVyTGlzdGVuZXIuaD4KICNpbmNsdWRlIDxndWkvSVByb2R1Y2VyTGlzdGVuZXIuaD4KICNpbmNsdWRlIDxndWkvQnVmZmVySXRlbUNvbnN1bWVyLmg+CkBAIC0yNTUsNiArMjU3LDEwIEBACiAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+LCBzdGQ6OnVuaXF1ZV9wdHI8T3V0cHV0U2xvdHM+LAogICAgICAgICAgICAgR0JQSGFzaD4gbU91dHB1dFNsb3RzOwogCisgICAgLy9BIHNldCBvZiBidWZmZXJzIHRoYXQgY291bGQgcG90ZW50aWFsbHkgc3RheSBpbiBzb21lIG9mIHRoZSBvdXRwdXRzIGFmdGVyIHJlbW92YWwKKyAgICAvL2FuZCB0aGVyZWZvcmUgc2hvdWxkIGJlIGRldGFjaGVkIGZyb20gdGhlIGlucHV0IHF1ZXVlLgorICAgIHN0ZDo6dW5vcmRlcmVkX3NldDx1aW50NjRfdD4gbURldGFjaGVkQnVmZmVyczsKKwogICAgIC8vIExhdGVzdCBvbkZyYW1lQXZhaWxhYmxlIHJldHVybiB2YWx1ZQogICAgIHN0ZDo6YXRvbWljPHN0YXR1c190PiBtT25GcmFtZUF2YWlsYWJsZVJlc3swfTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9BbmRyb2lkLm1rIGIvc2VydmljZXMvbWVkaWFjb2RlYy9BbmRyb2lkLm1rCmluZGV4IGNhYTA3MDMuLmNhMzE2OTEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhY29kZWMvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL0FuZHJvaWQubWsKQEAgLTgsNyArOCw2IEBACiAgICAgbGlibWVkaWFfb214IFwKICAgICBsaWJiaW5kZXIgXAogICAgIGxpYnV0aWxzIFwKLSAgICBsaWJndWkgXAogICAgIGxpYmxvZyBcCiAgICAgbGliYmFzZSBcCiAgICAgbGliYXZzZXJ2aWNlc19taW5pamFpbF92ZW5kb3IgXApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvQW5kcm9pZC5tayBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL0FuZHJvaWQubWsKaW5kZXggMmY3YjdmNy4uY2QwODZmOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9BbmRyb2lkLm1rCkBAIC0zLDYgKzMsNyBAQAogIyBzZXJ2aWNlIGxpYnJhcnkKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogTE9DQUxfU1JDX0ZJTEVTIDo9IE1lZGlhRXh0cmFjdG9yU2VydmljZS5jcHAKK0xPQ0FMX0NGTEFHUyA6PSAtV2FsbCAtV2Vycm9yCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYm1lZGlhIGxpYnN0YWdlZnJpZ2h0IGxpYmJpbmRlciBsaWJ1dGlscyBsaWJsb2cKIExPQ0FMX01PRFVMRTo9IGxpYm1lZGlhZXh0cmFjdG9yc2VydmljZQogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpAQCAtMzUsNiArMzYsNyBAQAogTE9DQUxfTU9EVUxFOj0gbWVkaWFleHRyYWN0b3IKIExPQ0FMX0lOSVRfUkMgOj0gbWVkaWFleHRyYWN0b3IucmMKIExPQ0FMX0NfSU5DTFVERVMgOj0gZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJtZWRpYQorTE9DQUxfQ0ZMQUdTIDo9IC1XYWxsIC1XZXJyb3IKIGluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQogCiAjIHNlcnZpY2Ugc2VjY29tcCBmaWx0ZXIK